From 8e04019d8ad24dbc74c363f33d2bb8c4501f29ee Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 29 Mar 2024 09:47:46 -0600 Subject: [PATCH 001/238] Feature/query engine improvements (#713) Co-authored-by: dylanholmes <4370153+dylanholmes@users.noreply.github.com> --- CHANGELOG.md | 3 ++ griptape/engines/query/vector_query_engine.py | 39 ++++++++++++------- griptape/templates/engines/query/system.j2 | 23 +++++++++++ griptape/templates/engines/query/user.j2 | 3 ++ .../templates/engines/query/vector_query.j2 | 20 ---------- .../engines/query/test_vector_query_engine.py | 15 ++++--- 6 files changed, 62 insertions(+), 41 deletions(-) create mode 100644 griptape/templates/engines/query/system.j2 create mode 100644 griptape/templates/engines/query/user.j2 delete mode 100644 griptape/templates/engines/query/vector_query.j2 diff --git a/CHANGELOG.md b/CHANGELOG.md index f9df7243a..0966dcc0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed +- Improved RAG performance in `VectorQueryEngine`. + ## [0.24.0] - 2024-03-27 ### Added diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py index 85d00c930..ac38a05a3 100644 --- a/griptape/engines/query/vector_query_engine.py +++ b/griptape/engines/query/vector_query_engine.py @@ -5,7 +5,7 @@ from griptape.utils import PromptStack from griptape.engines import BaseQueryEngine from griptape.utils.j2 import J2 -from griptape.rules import Ruleset +from griptape.rules import Ruleset, Rule if TYPE_CHECKING: from griptape.drivers import BaseVectorStoreDriver, BasePromptDriver @@ -16,7 +16,8 @@ class VectorQueryEngine(BaseQueryEngine): answer_token_offset: int = field(default=400, kw_only=True) vector_store_driver: BaseVectorStoreDriver = field(kw_only=True) prompt_driver: BasePromptDriver = field(kw_only=True) - template_generator: J2 = field(default=Factory(lambda: J2("engines/query/vector_query.j2")), kw_only=True) + user_template_generator: J2 = field(default=Factory(lambda: J2("engines/query/user.j2")), kw_only=True) + system_template_generator: J2 = field(default=Factory(lambda: J2("engines/query/system.j2")), kw_only=True) def query( self, @@ -36,34 +37,42 @@ def query( if isinstance(artifact, TextArtifact) ] text_segments = [] - message = "" + user_message = "" + system_message = "" for artifact in artifacts: text_segments.append(artifact.value) - - message = self.template_generator.render( + system_message = self.system_template_generator.render( + rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), metadata=metadata, - query=query, text_segments=text_segments, - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) + user_message = self.user_template_generator.render(query=query) + message_token_count = self.prompt_driver.token_count( - PromptStack(inputs=[PromptStack.Input(message, role=PromptStack.USER_ROLE)]) + PromptStack( + inputs=[ + PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(user_message, role=PromptStack.USER_ROLE), + ] + ) ) if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: text_segments.pop() - message = self.template_generator.render( - metadata=metadata, - query=query, - text_segments=text_segments, - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), - ) + user_message = self.user_template_generator.render(query=query, text_segments=text_segments) break - return self.prompt_driver.run(PromptStack(inputs=[PromptStack.Input(message, role=PromptStack.USER_ROLE)])) + return self.prompt_driver.run( + PromptStack( + inputs=[ + PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(user_message, role=PromptStack.USER_ROLE), + ] + ) + ) def upsert_text_artifact(self, artifact: TextArtifact, namespace: Optional[str] = None) -> str: result = self.vector_store_driver.upsert_text_artifact(artifact, namespace=namespace) diff --git a/griptape/templates/engines/query/system.j2 b/griptape/templates/engines/query/system.j2 new file mode 100644 index 000000000..1fefb4fec --- /dev/null +++ b/griptape/templates/engines/query/system.j2 @@ -0,0 +1,23 @@ +You are an expert Q&A system that is trusted around the world. +Always answer the query using the provided context information, and not prior knowledge. +Never directly reference the given context in your answer. +Avoid statements like 'Based on the context, ...' or 'The context information ...' or anything along those lines. +{% if rulesets %} + +{{ rulesets }} +{% endif %} +{% if metadata %} + +Metadata: """ +{{ metadata }} +""" +{% endif %} + +Context information is below. +--------------------- +{% for segment in text_segments %} + +Context segment #{{loop.index}}: +"""{{ segment }}""" +{% endfor %} +--------------------- diff --git a/griptape/templates/engines/query/user.j2 b/griptape/templates/engines/query/user.j2 new file mode 100644 index 000000000..fbac5ceeb --- /dev/null +++ b/griptape/templates/engines/query/user.j2 @@ -0,0 +1,3 @@ +Given the context information and not prior knowledge, answer the query. +Query: {{ query }} +Answer: diff --git a/griptape/templates/engines/query/vector_query.j2 b/griptape/templates/engines/query/vector_query.j2 deleted file mode 100644 index 10860be9d..000000000 --- a/griptape/templates/engines/query/vector_query.j2 +++ /dev/null @@ -1,20 +0,0 @@ -You can answer questions by searching through text segments. Always be truthful. Don't make up facts. Use the below list of text segments to respond to the subsequent query. If the answer cannot be found in the segments, say "I could not find an answer." - -{% if metadata %} -Metadata: """ -{{ metadata }} -""" -{% endif %} -{% for segment in text_segments %} -Text segment: """ -{{ segment }} -""" -{% endfor %} - -Query: {{ query }} -{% if rulesets %} - -{{ rulesets }} -{% endif %} - -Answer: diff --git a/tests/unit/engines/query/test_vector_query_engine.py b/tests/unit/engines/query/test_vector_query_engine.py index 84572c719..17bde6888 100644 --- a/tests/unit/engines/query/test_vector_query_engine.py +++ b/tests/unit/engines/query/test_vector_query_engine.py @@ -33,14 +33,17 @@ def test_upsert_text_artifact(self, engine): assert BaseArtifact.from_json(engine.vector_store_driver.load_entries()[0].meta["artifact"]).value == "foobar" def test_prompt_creation(self, engine): - message = engine.template_generator.render( - metadata="*META*", query="*QUESTION*", text_segments=["*TEXT SEGMENT 1*", "*TEXT SEGMENT 2*"] + system_message = engine.system_template_generator.render( + rulesets=["*RULESET*"], metadata="*META*", text_segments=["*TEXT SEGMENT 1*", "*TEXT SEGMENT 2*"] ) + user_message = engine.user_template_generator.render(query="*QUESTION*") - assert "*META*" in message - assert "*QUESTION*" in message - assert "*TEXT SEGMENT 1*" in message - assert "*TEXT SEGMENT 2*" in message + assert "*RULESET*" in system_message + + assert "*META*" in system_message + assert "*QUESTION*" in user_message + assert "*TEXT SEGMENT 1*" in system_message + assert "*TEXT SEGMENT 2*" in system_message def test_upsert_text_artifacts(self, engine): engine.upsert_text_artifacts(artifacts=[TextArtifact("foobar1"), TextArtifact("foobar2")], namespace="test") From d05fb3cd6a6041c1e4c9b23c239ba2d1f78afc76 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Mon, 1 Apr 2024 11:41:38 -0700 Subject: [PATCH 002/238] Cjkindel/api keys (#721) --- CHANGELOG.md | 1 + .../drivers/embedding/azure_openai_embedding_driver.py | 2 +- griptape/drivers/embedding/google_embedding_driver.py | 2 +- griptape/drivers/embedding/openai_embedding_driver.py | 2 +- griptape/drivers/embedding/voyageai_embedding_driver.py | 2 +- .../image_generation/openai_image_generation_driver.py | 2 +- .../drivers/image_query/anthropic_image_query_driver.py | 2 +- griptape/drivers/prompt/anthropic_prompt_driver.py | 2 +- griptape/drivers/prompt/google_prompt_driver.py | 2 +- griptape/drivers/prompt/openai_chat_prompt_driver.py | 2 +- .../drivers/prompt/openai_completion_prompt_driver.py | 2 +- griptape/drivers/vector/redis_vector_store_driver.py | 2 +- griptape/tokenizers/voyageai_tokenizer.py | 2 +- tests/mocks/mock_serializable.py | 1 + tests/unit/config/test_anthropic_structure_config.py | 9 --------- tests/unit/config/test_google_structure_config.py | 8 -------- tests/unit/config/test_openai_structure_config.py | 9 --------- 17 files changed, 14 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0966dcc0b..1e4259317 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved RAG performance in `VectorQueryEngine`. +- **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. ## [0.24.0] - 2024-03-27 diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index f9c216451..1f91f5a06 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -22,7 +22,7 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) - azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) tokenizer: OpenAiTokenizer = field( diff --git a/griptape/drivers/embedding/google_embedding_driver.py b/griptape/drivers/embedding/google_embedding_driver.py index 3a2ae63d2..3467d3360 100644 --- a/griptape/drivers/embedding/google_embedding_driver.py +++ b/griptape/drivers/embedding/google_embedding_driver.py @@ -18,7 +18,7 @@ class GoogleEmbeddingDriver(BaseEmbeddingDriver): DEFAULT_MODEL = "models/embedding-001" model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) task_type: str = field(default="retrieval_document", kw_only=True, metadata={"serializable": True}) title: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) diff --git a/griptape/drivers/embedding/openai_embedding_driver.py b/griptape/drivers/embedding/openai_embedding_driver.py index 891c60c38..676a6209b 100644 --- a/griptape/drivers/embedding/openai_embedding_driver.py +++ b/griptape/drivers/embedding/openai_embedding_driver.py @@ -27,7 +27,7 @@ class OpenAiEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) organization: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) client: openai.OpenAI = field( default=Factory( diff --git a/griptape/drivers/embedding/voyageai_embedding_driver.py b/griptape/drivers/embedding/voyageai_embedding_driver.py index 51f870a2d..1f1779b50 100644 --- a/griptape/drivers/embedding/voyageai_embedding_driver.py +++ b/griptape/drivers/embedding/voyageai_embedding_driver.py @@ -20,7 +20,7 @@ class VoyageAiEmbeddingDriver(BaseEmbeddingDriver): DEFAULT_MODEL = "voyage-large-2" model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) client: Any = field( default=Factory( lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), takes_self=True diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index e2952b5dc..200cf54bc 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -34,7 +34,7 @@ class OpenAiImageGenerationDriver(BaseImageGenerationDriver): api_type: str = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) organization: Optional[str] = field(default=openai.organization, kw_only=True, metadata={"serializable": True}) client: openai.OpenAI = field( default=Factory( diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index 1ffc24d95..cfb1a1d48 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -15,7 +15,7 @@ class AnthropicImageQueryDriver(BaseImageQueryDriver): client: Custom `Anthropic` client. """ - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) client: Any = field( default=Factory( diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index cb021b22f..35b411ac5 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -18,7 +18,7 @@ class AnthropicPromptDriver(BasePromptDriver): tokenizer: Custom `AnthropicTokenizer`. """ - api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) client: Any = field( default=Factory( diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index dcc3e4ecc..b576a440b 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -24,7 +24,7 @@ class GooglePromptDriver(BasePromptDriver): top_k: Optional value for top_k. """ - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) model_client: Any = field(default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True) tokenizer: BaseTokenizer = field( diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index eaff453e7..944ed1456 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -35,7 +35,7 @@ class OpenAiChatPromptDriver(BasePromptDriver): """ base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) organization: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) client: openai.OpenAI = field( default=Factory( diff --git a/griptape/drivers/prompt/openai_completion_prompt_driver.py b/griptape/drivers/prompt/openai_completion_prompt_driver.py index 63a2b32ff..cc334ae3d 100644 --- a/griptape/drivers/prompt/openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/openai_completion_prompt_driver.py @@ -24,7 +24,7 @@ class OpenAiCompletionPromptDriver(BasePromptDriver): """ base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) organization: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) client: openai.OpenAI = field( default=Factory( diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index ee0d69475..db99725a3 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -31,7 +31,7 @@ class RedisVectorStoreDriver(BaseVectorStoreDriver): host: str = field(kw_only=True, metadata={"serializable": True}) port: int = field(kw_only=True, metadata={"serializable": True}) db: int = field(kw_only=True, default=0, metadata={"serializable": True}) - password: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + password: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) index: str = field(kw_only=True, metadata={"serializable": True}) client: Redis = field( diff --git a/griptape/tokenizers/voyageai_tokenizer.py b/griptape/tokenizers/voyageai_tokenizer.py index 0ac4d31d7..799c64276 100644 --- a/griptape/tokenizers/voyageai_tokenizer.py +++ b/griptape/tokenizers/voyageai_tokenizer.py @@ -18,7 +18,7 @@ class VoyageAiTokenizer(BaseTokenizer): } MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"voyage": 0} - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) client: Client = field( default=Factory( lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), takes_self=True diff --git a/tests/mocks/mock_serializable.py b/tests/mocks/mock_serializable.py index 666cd2b92..4de173b07 100644 --- a/tests/mocks/mock_serializable.py +++ b/tests/mocks/mock_serializable.py @@ -8,3 +8,4 @@ class MockSerializable(SerializableMixin): foo: str = field(default="bar", kw_only=True, metadata={"serializable": True}) bar: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) baz: Optional[list[int]] = field(default=None, kw_only=True, metadata={"serializable": True}) + secret: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index e05ff0d50..5653ddb46 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -22,7 +22,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "claude-3-opus-20240229", "top_p": 0.999, "top_k": 250, @@ -31,13 +30,11 @@ def test_to_dict(self, config): "image_query_driver": { "type": "AnthropicImageQueryDriver", "model": "claude-3-opus-20240229", - "api_key": None, "max_tokens": 256, }, "embedding_driver": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", - "api_key": None, "input_type": "document", }, "vector_store_driver": { @@ -45,7 +42,6 @@ def test_to_dict(self, config): "embedding_driver": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", - "api_key": None, "input_type": "document", }, }, @@ -60,7 +56,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "claude-3-opus-20240229", "top_p": 0.999, "top_k": 250, @@ -70,7 +65,6 @@ def test_to_dict(self, config): "embedding_driver": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", - "api_key": None, "input_type": "document", }, }, @@ -84,7 +78,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "claude-3-opus-20240229", "top_p": 0.999, "top_k": 250, @@ -97,7 +90,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "claude-3-opus-20240229", "top_p": 0.999, "top_k": 250, @@ -111,7 +103,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "claude-3-opus-20240229", "top_p": 0.999, "top_k": 250, diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index 113d4a97f..ad9283d02 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -21,7 +21,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "gemini-pro", "top_p": None, "top_k": None, @@ -31,7 +30,6 @@ def test_to_dict(self, config): "embedding_driver": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", - "api_key": None, "task_type": "retrieval_document", "title": None, }, @@ -40,7 +38,6 @@ def test_to_dict(self, config): "embedding_driver": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", - "api_key": None, "task_type": "retrieval_document", "title": None, }, @@ -56,7 +53,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "gemini-pro", "top_p": None, "top_k": None, @@ -66,7 +62,6 @@ def test_to_dict(self, config): "embedding_driver": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", - "api_key": None, "task_type": "retrieval_document", "title": None, }, @@ -81,7 +76,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "gemini-pro", "top_p": None, "top_k": None, @@ -94,7 +88,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "gemini-pro", "top_p": None, "top_k": None, @@ -108,7 +101,6 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "api_key": None, "model": "gemini-pro", "top_p": None, "top_k": None, diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index 8eaabb27c..60eeed091 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -18,7 +18,6 @@ def test_to_dict(self, config): "type": "StructureGlobalDriversConfig", "prompt_driver": { "type": "OpenAiChatPromptDriver", - "api_key": None, "base_url": None, "model": "gpt-4", "organization": None, @@ -31,14 +30,12 @@ def test_to_dict(self, config): }, "conversation_memory_driver": None, "embedding_driver": { - "api_key": None, "base_url": None, "model": "text-embedding-3-small", "organization": None, "type": "OpenAiEmbeddingDriver", }, "image_generation_driver": { - "api_key": None, "api_version": None, "base_url": None, "image_size": "512x512", @@ -60,7 +57,6 @@ def test_to_dict(self, config): }, "vector_store_driver": { "embedding_driver": { - "api_key": None, "base_url": None, "model": "text-embedding-3-small", "organization": None, @@ -74,7 +70,6 @@ def test_to_dict(self, config): "query_engine": { "type": "StructureTaskMemoryQueryEngineConfig", "prompt_driver": { - "api_key": None, "base_url": None, "type": "OpenAiChatPromptDriver", "model": "gpt-4", @@ -90,7 +85,6 @@ def test_to_dict(self, config): "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "OpenAiEmbeddingDriver", - "api_key": None, "base_url": None, "organization": None, "model": "text-embedding-3-small", @@ -103,7 +97,6 @@ def test_to_dict(self, config): "type": "StructureTaskMemoryExtractionEngineCsvConfig", "prompt_driver": { "type": "OpenAiChatPromptDriver", - "api_key": None, "base_url": None, "model": "gpt-4", "organization": None, @@ -119,7 +112,6 @@ def test_to_dict(self, config): "type": "StructureTaskMemoryExtractionEngineJsonConfig", "prompt_driver": { "type": "OpenAiChatPromptDriver", - "api_key": None, "base_url": None, "model": "gpt-4", "organization": None, @@ -136,7 +128,6 @@ def test_to_dict(self, config): "type": "StructureTaskMemorySummaryEngineConfig", "prompt_driver": { "type": "OpenAiChatPromptDriver", - "api_key": None, "base_url": None, "model": "gpt-4", "organization": None, From 44dd2b8bb9cd200a7b7ddbe669520d452e561bcf Mon Sep 17 00:00:00 2001 From: Andrew French Date: Mon, 1 Apr 2024 12:22:19 -0700 Subject: [PATCH 003/238] Merge patch v0.24.1 back to dev (#720) Co-authored-by: Collin Dutter Co-authored-by: Vasily Vasinov --- CHANGELOG.md | 8 + .../mixins/actions_subtask_origin_mixin.py | 8 +- griptape/mixins/activity_mixin.py | 4 +- griptape/tasks/actions_subtask.py | 12 +- griptape/tasks/tool_task.py | 4 +- griptape/tasks/toolkit_task.py | 6 +- griptape/tools/aws_iam_client/tool.py | 5 +- griptape/tools/aws_s3_client/tool.py | 6 +- poetry.lock | 166 +----------------- pyproject.toml | 5 +- tests/unit/mixins/test_activity_mixin.py | 2 +- tests/unit/tasks/test_tool_task.py | 2 +- tests/unit/tasks/test_toolkit_task.py | 2 +- 13 files changed, 42 insertions(+), 188 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4259317..d6f6bf9f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. +## [0.24.1] - 2024-03-28 + +### Fixed +- Fixed boto3 type-checking stub dependency. + +### Changed +- Use `schema` instead of `jsonschema` for JSON validation. + ## [0.24.0] - 2024-03-27 ### Added diff --git a/griptape/mixins/actions_subtask_origin_mixin.py b/griptape/mixins/actions_subtask_origin_mixin.py index a9b441a4b..6caa63b5d 100644 --- a/griptape/mixins/actions_subtask_origin_mixin.py +++ b/griptape/mixins/actions_subtask_origin_mixin.py @@ -29,10 +29,10 @@ def add_subtask(self, subtask: ActionsSubtask) -> ActionsSubtask: ... @abstractmethod - def actions_schema(self) -> dict: + def actions_schema(self) -> Schema: ... - def _actions_schema_for_tools(self, tools: list[BaseTool]) -> dict: + def _actions_schema_for_tools(self, tools: list[BaseTool]) -> Schema: action_schemas = [] for tool in tools: @@ -44,6 +44,4 @@ def _actions_schema_for_tools(self, tools: list[BaseTool]) -> dict: action_schemas.append(action_schema) - actions_schema = Schema(description="JSON schema for an array of actions.", schema=action_schemas) - - return actions_schema.json_schema("Actions Schema") + return Schema(description="JSON schema for an array of actions.", schema=action_schemas) diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 35b9f5dc5..a28a8b412 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -73,7 +73,7 @@ def activity_description(self, activity: Callable) -> str: else: return Template(getattr(activity, "config")["description"]).render({"_self": self}) - def activity_schema(self, activity: Callable) -> Optional[dict]: + def activity_schema(self, activity: Callable) -> Optional[Schema]: if activity is None or not getattr(activity, "is_activity", False): raise Exception("This method is not an activity.") elif getattr(activity, "config")["schema"]: @@ -81,7 +81,7 @@ def activity_schema(self, activity: Callable) -> Optional[dict]: "values": getattr(activity, "config")["schema"].schema if getattr(activity, "config")["schema"] else {} } - return Schema(full_schema).json_schema("InputSchema") + return Schema(full_schema) else: return None diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 53cdb02af..e442eebb5 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -2,9 +2,9 @@ import json import re from typing import Optional, TYPE_CHECKING, Callable + +import schema from attr import define, field -from jsonschema.exceptions import ValidationError -from jsonschema.validators import validate from griptape import utils from griptape.utils import remove_null_values_in_dict_recursively from griptape.mixins import ActionsSubtaskOriginMixin @@ -206,7 +206,7 @@ def __init_from_prompt(self, value: str) -> None: actions_list: list = json.loads(data, strict=False) if isinstance(self.origin_task, ActionsSubtaskOriginMixin): - validate(instance=actions_list, schema=self.origin_task.actions_schema()) + self.origin_task.actions_schema().validate(actions_list) for action_object in actions_list: # Load action name; throw exception if the key is not present @@ -250,7 +250,7 @@ def __init_from_prompt(self, value: str) -> None: self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") self.actions.append(self.__error_to_action(f"syntax error: {e}")) - except ValidationError as e: + except schema.SchemaError as e: self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") self.actions.append(self.__error_to_action(f"Action JSON validation error: {e}")) @@ -277,8 +277,8 @@ def __validate_action(self, action: Action) -> None: raise Exception("Activity not found.") if activity_schema: - validate(instance=action.input, schema=activity_schema) - except ValidationError as e: + activity_schema.validate(action.input) + except schema.SchemaError as e: self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid activity input JSON: {e}") self.actions.append(self.__error_to_action(f"Activity input JSON validation error: {e}")) diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index 8cfc9e477..9321bb6c1 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -3,6 +3,8 @@ import json from typing import Optional, TYPE_CHECKING from attr import define, field +from schema import Schema + from griptape import utils from griptape.artifacts import InfoArtifact, BaseArtifact, ErrorArtifact from griptape.tasks import PromptTask, ActionsSubtask @@ -42,7 +44,7 @@ def default_system_template_generator(self, _: PromptTask) -> str: meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), ) - def actions_schema(self) -> dict: + def actions_schema(self) -> Schema: return self._actions_schema_for_tools([self.tool]) def run(self) -> BaseArtifact: diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index e0a4b0d4b..7b84ce85d 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -2,6 +2,8 @@ import json from typing import TYPE_CHECKING, Callable, Optional from attr import define, field, Factory +from schema import Schema + from griptape import utils from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.mixins import ActionsSubtaskOriginMixin @@ -88,7 +90,7 @@ def default_system_template_generator(self, _: PromptTask) -> str: return J2("tasks/toolkit_task/system.j2").render( rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), action_names=str.join(", ", [tool.name for tool in self.tools]), - actions_schema=utils.minify_json(json.dumps(self.actions_schema())), + actions_schema=utils.minify_json(json.dumps(self.actions_schema().json_schema("Actions Schema"))), meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, ) @@ -103,7 +105,7 @@ def default_user_subtask_template_generator(self, subtask: ActionsSubtask) -> st stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, subtask=subtask ) - def actions_schema(self) -> dict: + def actions_schema(self) -> Schema: return self._actions_schema_for_tools(self.tools) def set_default_tools_memory(self, memory: TaskMemory) -> None: diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam_client/tool.py index 52421fefe..78193ec22 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam_client/tool.py @@ -1,10 +1,13 @@ from __future__ import annotations +from typing import TYPE_CHECKING from schema import Schema, Literal from attr import define, field, Factory from griptape.artifacts import TextArtifact, ErrorArtifact, ListArtifact from griptape.utils.decorators import activity from griptape.tools import BaseAwsClient -from mypy_boto3_iam import Client + +if TYPE_CHECKING: + from mypy_boto3_iam import Client @define diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3_client/tool.py index d42c7918e..9db5e2728 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3_client/tool.py @@ -1,12 +1,14 @@ from __future__ import annotations import io -from typing import Any +from typing import Any, TYPE_CHECKING from schema import Schema, Literal from attr import define, field, Factory from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, ListArtifact, BlobArtifact from griptape.utils.decorators import activity from griptape.tools import BaseAwsClient -from mypy_boto3_s3 import Client + +if TYPE_CHECKING: + from mypy_boto3_s3 import Client @define diff --git a/poetry.lock b/poetry.lock index 440bb5903..21abd3413 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1943,41 +1943,6 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] -[[package]] -name = "jsonschema" -version = "4.21.1" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - [[package]] name = "justext" version = "3.0.0" @@ -2084,6 +2049,7 @@ files = [ {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, + {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, @@ -3068,7 +3034,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -3077,8 +3042,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -3691,21 +3654,6 @@ async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2 hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] -[[package]] -name = "referencing" -version = "0.32.1" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, - {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - [[package]] name = "regex" version = "2023.12.25" @@ -3894,114 +3842,6 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] -[[package]] -name = "rpds-py" -version = "0.17.1" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, - {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9"}, - {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394"}, - {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59"}, - {file = "rpds_py-0.17.1-cp310-none-win32.whl", hash = "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d"}, - {file = "rpds_py-0.17.1-cp310-none-win_amd64.whl", hash = "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6"}, - {file = "rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b"}, - {file = "rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8"}, - {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd"}, - {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea"}, - {file = "rpds_py-0.17.1-cp311-none-win32.whl", hash = "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518"}, - {file = "rpds_py-0.17.1-cp311-none-win_amd64.whl", hash = "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf"}, - {file = "rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf"}, - {file = "rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9"}, - {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253"}, - {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23"}, - {file = "rpds_py-0.17.1-cp312-none-win32.whl", hash = "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1"}, - {file = "rpds_py-0.17.1-cp312-none-win_amd64.whl", hash = "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3"}, - {file = "rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d"}, - {file = "rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae"}, - {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde"}, - {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6"}, - {file = "rpds_py-0.17.1-cp38-none-win32.whl", hash = "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a"}, - {file = "rpds_py-0.17.1-cp38-none-win_amd64.whl", hash = "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb"}, - {file = "rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a"}, - {file = "rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256"}, - {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772"}, - {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b"}, - {file = "rpds_py-0.17.1-cp39-none-win32.whl", hash = "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f"}, - {file = "rpds_py-0.17.1-cp39-none-win_amd64.whl", hash = "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6"}, - {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb"}, - {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296"}, - {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68"}, - {file = "rpds_py-0.17.1.tar.gz", hash = "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7"}, -] - [[package]] name = "rsa" version = "4.9" @@ -5230,4 +5070,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "ef07eee1be3561b15286e81aa1be80606f0b23e1684aa6421939de24e20eaac7" +content-hash = "4eac3f039981703a8c3d3a2d8ead8a9286c6e346e2ba39b0ff77c0e0b0de6aef" diff --git a/pyproject.toml b/pyproject.toml index 7a8b46985..6daa83f45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "griptape" -version = "0.24.0" +version = "0.24.1" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = ["Griptape "] license = "Apache 2.0" @@ -16,7 +16,6 @@ python = "^3.9" openai = "^1.1.1" attrs = ">=22" jinja2 = ">=3.1.3" -jsonschema = ">=4" marshmallow = ">=3" marshmallow-enum = ">=1.5" tiktoken = ">=0.3" @@ -30,7 +29,6 @@ docker = "^6.1.3" sqlalchemy = "~=1.0" dateparser = "^1.1.8" requests = "^2" -boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.18"} # drivers cohere = { version = ">=4", optional = true } @@ -152,6 +150,7 @@ ruff = "^0.0.286" black = "^23.7.0" pyright = "^1.1.355" pre-commit = "^3.5.0" +boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.18"} [tool.black] line-length=120 diff --git a/tests/unit/mixins/test_activity_mixin.py b/tests/unit/mixins/test_activity_mixin.py index 061d616e8..88b1f667d 100644 --- a/tests/unit/mixins/test_activity_mixin.py +++ b/tests/unit/mixins/test_activity_mixin.py @@ -17,7 +17,7 @@ def test_activity_description(self, tool): assert description == f"test description: {tool.foo()}" def test_activity_schema(self, tool): - schema = tool.activity_schema(tool.test) + schema = tool.activity_schema(tool.test).json_schema("InputSchema") assert schema == Schema({"values": tool.test.config["schema"].schema}).json_schema("InputSchema") assert schema["properties"].get("artifact") is None diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index 0f113ed92..b2b2b5fbf 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -56,4 +56,4 @@ def test_actions_schema(self): Agent().add_task(task) - assert isinstance(task.actions_schema(), dict) + assert isinstance(task.actions_schema().json_schema("Actions Schema"), dict) diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index dde256e1a..17ea35e48 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -205,4 +205,4 @@ def test_actions_schema(self): Agent().add_task(task) - assert isinstance(task.actions_schema(), dict) + assert isinstance(task.actions_schema().json_schema("Actions Schema"), dict) From 7582cf828d360647d6d355e33f21ce06d98db5af Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 1 Apr 2024 16:20:49 -0600 Subject: [PATCH 004/238] Improve Tool Task system prompt (#723) --- griptape/templates/tasks/tool_task/system.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/griptape/templates/tasks/tool_task/system.j2 b/griptape/templates/tasks/tool_task/system.j2 index 133fdacfc..eaf858037 100644 --- a/griptape/templates/tasks/tool_task/system.j2 +++ b/griptape/templates/tasks/tool_task/system.j2 @@ -1,4 +1,4 @@ -When appropriate, respond to requests by using the following Action Schema. Your response should be a plain JSON object. If you can't use the Action Schema, say "I don't know how to respond." +When appropriate, respond to requests by using the following Action Schema. Your response should be a plain JSON object that successfully validates against the schema. The schema is provided below. If you can't use the Action Schema, say "I don't know how to respond." Action Schema: {{ action_schema }} From 76e7177adfdf5b1a34417fa43776b7dec73e0411 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 2 Apr 2024 12:56:27 -0700 Subject: [PATCH 005/238] Output single artifact, move value to name (#724) --- griptape/tasks/actions_subtask.py | 4 +--- griptape/tasks/tool_task.py | 6 +++--- tests/unit/tasks/test_tool_task.py | 5 +++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index e442eebb5..e361c86bc 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -93,8 +93,6 @@ def before_run(self) -> None: self.structure.logger.info(f"Subtask {self.id}\n{self.input.to_text()}") def run(self) -> BaseArtifact: - format_output: Callable[[tuple[str, BaseArtifact]], str] = lambda o: f"{o[0]} output: {o[1].to_text()}" - try: if any(a.name == "error" for a in self.actions): errors = [a.input["error"] for a in self.actions if a.name == "error"] @@ -103,7 +101,7 @@ def run(self) -> BaseArtifact: else: results = self.execute_actions(self.actions) - self.output = ListArtifact([TextArtifact(format_output(r)) for r in results]) + self.output = ListArtifact([TextArtifact(name=f"{r[0]} output", value=r[1].to_text()) for r in results]) except Exception as e: self.structure.logger.error(f"Subtask {self.id}\n{e}", exc_info=True) diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index 9321bb6c1..dbadc3f10 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -6,7 +6,7 @@ from schema import Schema from griptape import utils -from griptape.artifacts import InfoArtifact, BaseArtifact, ErrorArtifact +from griptape.artifacts import InfoArtifact, BaseArtifact, ErrorArtifact, ListArtifact from griptape.tasks import PromptTask, ActionsSubtask from griptape.tools import BaseTool from griptape.utils import J2 @@ -63,8 +63,8 @@ def run(self) -> BaseArtifact: subtask.run() subtask.after_run() - if subtask.output: - self.output = subtask.output + if isinstance(subtask.output, ListArtifact): + self.output = subtask.output[0] else: self.output = InfoArtifact("No tool output") except Exception as e: diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index b2b2b5fbf..ea36709a1 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -24,14 +24,15 @@ def test_run_without_memory(self, agent): agent.add_task(task) - assert task.run().to_text() == "MockTool output: ack foobar" + assert task.run().name == "MockTool output" + assert task.run().value == "ack foobar" def test_run_with_memory(self, agent): task = ToolTask(tool=MockTool()) agent.add_task(task) - assert task.run().to_text().startswith('MockTool output: Output of "MockTool.test" was stored in memory') + assert task.run().to_text().startswith('Output of "MockTool.test" was stored in memory') def test_meta_memory(self): memory = defaults.text_task_memory("TestMemory") From af484665c06df2e4a9161f7ce84f1bee42d18041 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 2 Apr 2024 13:12:43 -0700 Subject: [PATCH 006/238] Add minItems to ToolkitTask actions schema (#725) --- griptape/tasks/actions_subtask.py | 3 + griptape/tasks/toolkit_task.py | 5 +- tests/unit/tasks/test_actions_subtask.py | 13 +++ tests/unit/tasks/test_tool_task.py | 129 ++++++++++++++++++++++- tests/unit/tasks/test_toolkit_task.py | 129 ++++++++++++++++++++++- 5 files changed, 276 insertions(+), 3 deletions(-) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index e361c86bc..bca7f6987 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -206,6 +206,9 @@ def __init_from_prompt(self, value: str) -> None: if isinstance(self.origin_task, ActionsSubtaskOriginMixin): self.origin_task.actions_schema().validate(actions_list) + if not actions_list: + raise schema.SchemaError("Array item count 0 is less than minimum count of 1.") + for action_object in actions_list: # Load action name; throw exception if the key is not present action_tag = action_object["tag"] diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 7b84ce85d..ead020c47 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -87,10 +87,13 @@ def preprocess(self, structure: Structure) -> ToolkitTask: return self def default_system_template_generator(self, _: PromptTask) -> str: + schema = self.actions_schema().json_schema("Actions Schema") + schema["minItems"] = 1 # The `schema` library doesn't support `minItems` so we must add it manually. + return J2("tasks/toolkit_task/system.j2").render( rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), action_names=str.join(", ", [tool.name for tool in self.tools]), - actions_schema=utils.minify_json(json.dumps(self.actions_schema().json_schema("Actions Schema"))), + actions_schema=utils.minify_json(json.dumps(schema)), meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, ) diff --git a/tests/unit/tasks/test_actions_subtask.py b/tests/unit/tasks/test_actions_subtask.py index 16894e6c9..a1e697346 100644 --- a/tests/unit/tasks/test_actions_subtask.py +++ b/tests/unit/tasks/test_actions_subtask.py @@ -58,3 +58,16 @@ def test_with_no_action_input(self): assert json_dict[0]["name"] == "MockTool" assert json_dict[0]["path"] == "test_no_schema" assert json_dict[0].get("input") is None + + def test_no_actions(self): + valid_input = "Thought: need to test\n" "Actions: []\n" "<|Response|>: test observation\n" "Answer: test output" + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + json_dict = json.loads(subtask.actions_to_json()) + + assert json_dict[0]["name"] == "error" + assert json_dict[0]["input"] == { + "error": "Action JSON validation error: Array item count 0 is less than minimum count of 1." + } diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index ea36709a1..482fead7a 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -10,6 +10,133 @@ class TestToolTask: + TARGET_TOOLS_SCHEMA = { + "description": "JSON schema for an array of actions.", + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_error"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_list_output"}, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_no_schema"}, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_str_output"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_without_default_memory"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + ] + }, + "$id": "Actions Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + } + @pytest.fixture def agent(self): output_dict = {"tag": "foo", "name": "MockTool", "path": "test", "input": {"values": {"test": "foobar"}}} @@ -57,4 +184,4 @@ def test_actions_schema(self): Agent().add_task(task) - assert isinstance(task.actions_schema().json_schema("Actions Schema"), dict) + assert task.actions_schema().json_schema("Actions Schema") == self.TARGET_TOOLS_SCHEMA diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 17ea35e48..33c0deda8 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -12,6 +12,133 @@ class TestToolkitSubtask: + TARGET_TOOLS_SCHEMA = { + "description": "JSON schema for an array of actions.", + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_error"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_list_output"}, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_no_schema"}, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_str_output"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description", "const": "test_without_default_memory"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, + ] + }, + "$id": "Actions Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + } + @pytest.fixture def query_engine(self): return VectorQueryEngine( @@ -205,4 +332,4 @@ def test_actions_schema(self): Agent().add_task(task) - assert isinstance(task.actions_schema().json_schema("Actions Schema"), dict) + assert task.actions_schema().json_schema("Actions Schema") == self.TARGET_TOOLS_SCHEMA From b1aaab51c6495f0c2c1d8d4e5d3194479edc30ab Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Tue, 2 Apr 2024 13:49:40 -0700 Subject: [PATCH 007/238] Add FileManager.list_files_from_disk (#726) --- CHANGELOG.md | 3 +++ griptape/tools/file_manager/tool.py | 29 ++++++++++++++++++++++----- tests/unit/tools/test_file_manager.py | 9 +++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6f6bf9f8..204b82099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `list_files_from_disk` activity to `FileManager` Tool. + ### Changed - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 678c30eec..ca8760422 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -1,10 +1,9 @@ from __future__ import annotations - import logging import os from pathlib import Path from attr import define, field, Factory -from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BaseArtifact +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BaseArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.loaders import FileLoader, BaseLoader, PdfLoader, CsvLoader, TextLoader, ImageLoader @@ -54,6 +53,25 @@ def validate_workdir(self, _, workdir: str) -> None: if not Path(workdir).is_absolute(): raise ValueError("workdir has to be absolute absolute") + @activity( + config={ + "description": "Can be used to list files on disk", + "schema": Schema( + {Literal("path", description="Relative path in the POSIX format. For example, 'foo/bar'"): str} + ), + } + ) + def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: + path = params["values"]["path"].lstrip("/") + full_path = Path(os.path.join(self.workdir, path)) + + if os.path.exists(full_path): + entries = os.listdir(full_path) + + return TextArtifact("\n".join([e for e in entries])) + else: + return ErrorArtifact("Path not found") + @activity( config={ "description": "Can be used to load files from disk", @@ -61,7 +79,7 @@ def validate_workdir(self, _, workdir: str) -> None: { Literal( "paths", - description="Paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", + description="Relative paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", ): [] } ), @@ -71,6 +89,7 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: artifacts = [] for path in params["values"]["paths"]: + path = path.lstrip("/") full_path = Path(os.path.join(self.workdir, path)) extension = path.split(".")[-1] loader = self.loaders.get(extension) or self.default_loader @@ -92,7 +111,7 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: { Literal( "dir_name", - description="Destination directory name on disk in the POSIX format. For example, 'foo/bar'", + description="Relative destination path name on disk in the POSIX format. For example, 'foo/bar'", ): str, Literal("file_name", description="Destination file name. For example, 'baz.txt'"): str, "memory_name": str, @@ -146,7 +165,7 @@ def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArt ) def save_content_to_file(self, params: dict) -> ErrorArtifact | InfoArtifact: content = params["values"]["content"] - new_path = params["values"]["path"] + new_path = params["values"]["path"].lstrip("/") full_path = os.path.join(self.workdir, new_path) try: diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index beab7e1e8..3ecff7e62 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -15,6 +15,15 @@ def test_validate_workdir(self): with pytest.raises(ValueError): FileManager(workdir="foo") + def test_list_files_from_disk(self): + result = FileManager( + input_memory=[defaults.text_task_memory("Memory1")], workdir=os.path.abspath(os.path.dirname(__file__)) + ).list_files_from_disk({"values": {"path": "../../resources"}}) + + assert isinstance(result, TextArtifact) + assert "bitcoin.pdf" in result.value + assert "small.png" in result.value + def test_load_files_from_disk(self): result = FileManager( input_memory=[defaults.text_task_memory("Memory1")], workdir=os.path.abspath(os.path.dirname(__file__)) From f8a7b69923f1ab546b0057837b2dad8b8e1f8c9e Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Wed, 3 Apr 2024 16:37:37 -0500 Subject: [PATCH 008/238] Update default API version for `AzureOpenAiImageGenerationDriver` (#731) --- .../image_generation/azure_openai_image_generation_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index 51480407c..885fd451c 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -24,7 +24,7 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - api_version: str = field(default="2023-12-01-preview", kw_only=True, metadata={"serializable": True}) + api_version: str = field(default="2024-02-01", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( default=Factory( lambda self: openai.AzureOpenAI( From ef764c9db3f0ce617174afadb9b3745903e911f7 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 5 Apr 2024 14:49:45 -0700 Subject: [PATCH 009/238] Improve readme (#727) --- README.md | 147 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 4ed4cf8ab..014247ecd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# griptape +![Griptape](https://assets-global.website-files.com/65d658559223871198e78bca/65fb8d85c1ab3c9b858ab18a_Griptape%20logo%20dark.svg) [![PyPI Version](https://img.shields.io/pypi/v/griptape.svg)](https://pypi.python.org/pypi/griptape) [![Tests](https://github.com/griptape-ai/griptape/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/griptape-ai/griptape/actions/workflows/unit-tests.yml) @@ -7,15 +7,60 @@ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Griptape Discord](https://dcbadge.vercel.app/api/server/gnWRz88eym?compact=true&style=flat)](https://discord.gg/gnWRz88eym) -**Griptape** is a modular Python framework for building AI-powered applications that connect securely to your enterprise data and APIs. It offers developers the ability to maintain control and flexibility at every step. +Griptape is a modular Python framework for building AI-powered applications that securely connect to your enterprise data and APIs. It offers developers the ability to maintain control and flexibility at every step. -**Build AI Apps**: Easily compose apps in Python with modular structures and ready-made tools. Use built-in drivers to connect to whichever LLMs and data stores you choose. -**Control Data Access**: Connect securely to data sources with granular access controls, ensuring LLMs stay focused on the information that matters. +## 🛠️ Core Components -**Scale With Your Workload**: Easily deploy and run apps in the cloud, where your data lives. Process data ahead of time or vectorize it on the fly. +### 🏗️ Structures -Using Griptape, you can securely integrate with your internal data stores and APIs. You get to control what data goes into the prompt, and what the LLM is allowed to do with it. +- 🤖 **Agents** consist of a single Task. +- 🔄 **Pipelines** organize a sequence of Tasks so that the output from one Task may flow into the next. +- 🌐 **Workflows** configure Tasks to operate in parallel. + +### 📝 Tasks + +Tasks are the core building blocks within Structures, enabling interaction with Engines, Tools, and other Griptape components. + +### 🔧 Tools + +Tools provide capabilities for LLMs to interact with data and services. Griptape includes a variety of built-in Tools, and makes it easy to create custom Tools. + +### 🧠 Memory + +- 💬 **Conversation Memory** enables LLMs to retain and retrieve information across interactions. +- 🗃️ **Task Memory** keeps large or sensitive Task outputs off the prompt that is sent to the LLM. +- 📊 **Meta Memory** enables passing in additional metadata to the LLM, enhancing the context and relevance of the interaction. + +### 🚗 Drivers + +Drivers facilitate interactions with external resources and services: + +- 🔢 **Prompt and Embedding Drivers** generate vector embeddings from textual inputs. +- 💾 **Vector Store Drivers** manage the storage and retrieval of embeddings. +- 🎨 **Image Generation Drivers** create images from text descriptions. +- 🔎 **Image Query Drivers** query images from text queries. +- 💼 **SQL Drivers** interact with SQL databases. +- 🌐 **Web Scraper Drivers** extract information from web pages. +- 🧠 **Conversation Memory Drivers** manage the storage and retrieval of conversational data. + +### 🚂 Engines + +Engines wrap Drivers and provide use-case-specific functionality: + +- 📊 **Query Engines** execute Retrieval Augmented Generation (RAG) queries. +- 🛠️ **Extraction Engines** extract JSON or CSV data from unstructured text. +- 📝 **Summary Engines** generate summaries from textual content. +- 🖼️ **Image Generation Engines** generate images from textual descriptions. +- 🔎 **Image Query Engines** query images based on textual prompts. + +### 📦 Additional Components + +- 📐 **Rulesets** steer LLM behavior with minimal prompt engineering. +- 🔄 **Loaders** load data from various sources. +- 🏺 **Artifacts** allow for passing data of different types between Griptape components. +- ✂️ **Chunkers** segment texts into manageable pieces for diverse text types. +- 🔢 **Tokenizers** count the number of tokens in a text to not exceed LLM token limits. ## Documentation @@ -38,7 +83,7 @@ pip install "griptape[all]" -U Second, configure an OpenAI client by [getting an API key](https://platform.openai.com/account/api-keys) and adding it to your environment as `OPENAI_API_KEY`. By default, Griptape uses [OpenAI Chat Completions API](https://platform.openai.com/docs/guides/gpt/chat-completions-api) to execute LLM prompts. -With Griptape, you can create *structures*, such as `Agents`, `Pipelines`, and `Workflows`, that are composed of different types of tasks. Let's build a simple creative agent that dynamically uses three tools and moves the data around in short-term memory. +With Griptape, you can create Structures, such as Agents, Pipelines, and Workflows, composed of different types of Tasks. Let's build a simple creative Agent that dynamically uses three tools and moves the data around in Task Memory. ```python from griptape.structures import Agent @@ -57,57 +102,49 @@ agent.run("https://griptape.ai", "griptape.txt") And here is the output: ``` -[11/02/23 15:28:24] INFO ToolkitTask 72b89a905be84245a0563b206795ac73 - Input: Load https://griptape.ai, summarize it, and - store it in a file called griptape.txt. -[11/02/23 15:28:37] INFO Subtask f2cd3cfecaeb4001a0d3eccad32c2d07 - Thought: First, I need to use the WebScraper action to - load the content of the webpage. - - Actions: {"actions": [{"name": "WebScraper", "path": - "get_content", "input": {"values": {"url": - "https://griptape.ai"}}}]} - INFO Subtask f2cd3cfecaeb4001a0d3eccad32c2d07 - Response: Output of "WebScraper.get_content" was - stored in memory with memory_name "TaskMemory" and - artifact_namespace - "c497d83c1d134db694b9994596016320" -[11/02/23 15:28:50] INFO Subtask 0096dac0f0524636be197e06a37f8aa0 - Thought: Now that the webpage content is stored in - memory, I need to use the TaskMemoryClient action - to summarize the content. - Actions: {"actions": [{"name": "TaskMemoryClient", "path": - "summarize", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "c497d83c1d134db694b9994596016320"}}}]} -[11/02/23 15:29:06] INFO Subtask 0096dac0f0524636be197e06a37f8aa0 - Response: Output of "TaskMemoryClient.summarize" - was stored in memory with memory_name "TaskMemory" - and artifact_namespace - "77584322d33d40e992da9767d02a9018" -[11/02/23 15:29:25] INFO Subtask 7cc3d96500ce4efdac085c07c7370822 - Thought: Now that the summary is stored in memory, - I need to use the FileManager action to save the - summary to a file named griptape.txt. - Actions: {"actions": [{"name": "FileManager", "path": - "save_memory_artifacts_to_disk", "input": - {"values": {"dir_name": ".", "file_name": - "griptape.txt", "memory_name": "TaskMemory", - "artifact_namespace": - "77584322d33d40e992da9767d02a9018"}}}]} - INFO Subtask 7cc3d96500ce4efdac085c07c7370822 - Response: saved successfully -[11/02/23 15:29:30] INFO ToolkitTask 72b89a905be84245a0563b206795ac73 - Output: The summary of the webpage - https://griptape.ai has been successfully stored in - a file named griptape.txt. +[04/02/24 13:51:09] INFO ToolkitTask 85700ec1b0594e1a9502c0efe7da6ef4 + Input: Load https://griptape.ai, summarize it, and store it in a file called griptape.txt. +[04/02/24 13:51:15] INFO Subtask db6a3e7cb2f549128c358149d340f91c + Thought: First, I need to load the content of the website using the WebScraper action. Then, I will use the TaskMemoryClient action to + summarize the content. Finally, I will save the summarized content to a file using the FileManager action. + Actions: [ + { + "name": "WebScraper", + "path": "get_content", + "input": { + "values": { + "url": "https://griptape.ai" + } + }, + "tag": "load_website_content" + } + ] +[04/02/24 13:51:16] INFO Subtask db6a3e7cb2f549128c358149d340f91c + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "752b38bb86da4baabdbd9f444eb4a0d1" +[04/02/24 13:51:19] INFO Subtask c3edba87ebf845d4b85e3a791f8fde8d + Thought: Now that the website content is loaded into memory, I need to summarize it using the TaskMemoryClient action. + Actions: [{"tag": "summarize_content", "name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", + "artifact_namespace": "752b38bb86da4baabdbd9f444eb4a0d1"}}}] +[04/02/24 13:51:25] INFO Subtask c3edba87ebf845d4b85e3a791f8fde8d + Response: Output of "TaskMemoryClient.summarize" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "c4f131c201f147dcab07be3925b46294" +[04/02/24 13:51:33] INFO Subtask 06fe01ca64a744b38a8c08eb152aaacb + Thought: Now that the content has been summarized and stored in memory, I need to save this summarized content to a file named 'griptape.txt' + using the FileManager action. + Actions: [{"tag": "save_summarized_content", "name": "FileManager", "path": "save_memory_artifacts_to_disk", "input": {"values": {"dir_name": + ".", "file_name": "griptape.txt", "memory_name": "TaskMemory", "artifact_namespace": "c4f131c201f147dcab07be3925b46294"}}}] + INFO Subtask 06fe01ca64a744b38a8c08eb152aaacb + Response: saved successfully +[04/02/24 13:51:35] INFO ToolkitTask 85700ec1b0594e1a9502c0efe7da6ef4 + Output: The summarized content of the website https://griptape.ai has been successfully saved to a file named 'griptape.txt'. ``` -During the run, the Griptape Agent loaded a webpage with a **Tool**, stored its full content in **Tool Memory**, queried it to answer the original question, and finally saved the answer to a file. +During the run, the Griptape Agent loaded a webpage with a **Tool**, stored its full content in **Task Memory**, queried it to answer the original question, and finally saved the answer to a file. The important thing to note here is that no matter how big the webpage is it can never blow up the prompt token limit because the full content of the page never goes back to the LLM. Additionally, no data from the subsequent subtasks were returned back to the prompt either. So, how does it work? -All tools have the `off_prompt` property enabled be default. Disabling it (`off_prompt=False`) will force the framework to return all tool outputs directly to the LLM prompt. `TaskMemoryClient` requires the user to set this property explicitly for usability reasons. In the above example, we set `off_prompt` to `True`, which means that the LLM can never see the data it manipulates, but can send it to other tools. +All Tools have the `off_prompt` property enabled be default. Disabling it (`off_prompt=False`) will force the framework to return all tool outputs directly to the LLM prompt. `TaskMemoryClient` requires the user to set this property explicitly for usability reasons. In the above example, we set `off_prompt` to `True`, which means that the LLM can never see the data it manipulates, but can send it to other Tools. [Check out our docs](https://docs.griptape.ai/latest/griptape-framework/structures/prompt-drivers/) to learn more about how to use Griptape with other LLM providers like Anthropic, Claude, Hugging Face, and Azure. @@ -125,9 +162,9 @@ If you have identified a bug, want to propose a new feature, or have a question, ### New Griptape Tools -Griptape's extensibility allows anyone to develop and distribute tools independently. With rare exceptions for tools providing broadly applicable functionality, new Griptape tools should be managed as their own projects and not submitted to the core framework. Pull requests for new tools (unless addressing an [existing issue](https://github.com/griptape-ai/griptape/issues)) will be closed. +Griptape's extensibility allows anyone to develop and distribute tools independently. With rare exceptions for Tools providing broadly applicable functionality, new Griptape Tools should be managed as their own projects and not submitted to the core framework. Pull requests for new tools (unless addressing an [existing issue](https://github.com/griptape-ai/griptape/issues)) will be closed. -The [Griptape Tool Template](https://github.com/griptape-ai/tool-template) provides the recommended structure, step-by-step instructions, basic automation, and usage examples for new tools. In the Template, select **Use this template** then **Create a new repository** to begin a new tool project. +The [Griptape Tool Template](https://github.com/griptape-ai/tool-template) provides the recommended structure, step-by-step instructions, basic automation, and usage examples for new Tools. In the Template, select **Use this template** then **Create a new repository** to begin a new Tool project. ### Submitting Pull Requests From 44b0653bc7841cceab3e6b5ba8696ef4514be2d9 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Mon, 8 Apr 2024 11:53:18 -0700 Subject: [PATCH 010/238] Backmerge `main` to `dev` for v0.24.2 (#733) Co-authored-by: Collin Dutter Co-authored-by: Vasily Vasinov --- CHANGELOG.md | 6 ++++++ griptape/tools/file_manager/tool.py | 2 +- pyproject.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 204b82099..4cf6da091 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,12 +13,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. +## [0.24.2] - 2024-04-04 + +- Fixed FileManager.load_files_from_disk schema. + ## [0.24.1] - 2024-03-28 ### Fixed + - Fixed boto3 type-checking stub dependency. ### Changed + - Use `schema` instead of `jsonschema` for JSON validation. ## [0.24.0] - 2024-03-27 diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index ca8760422..7c1d4bd8a 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -80,7 +80,7 @@ def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: Literal( "paths", description="Relative paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", - ): [] + ): list } ), } diff --git a/pyproject.toml b/pyproject.toml index 6daa83f45..6755f02c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "griptape" -version = "0.24.1" +version = "0.24.2" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = ["Griptape "] license = "Apache 2.0" From c9edaffda2305377601fbc67387b12e925938298 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Tue, 9 Apr 2024 23:39:44 +0200 Subject: [PATCH 011/238] Remove file reading responsibility from loaders (#737) --- CHANGELOG.md | 5 + griptape/loaders/__init__.py | 2 - griptape/loaders/base_loader.py | 21 +++- griptape/loaders/base_text_loader.py | 21 ++-- griptape/loaders/csv_loader.py | 46 ++++--- griptape/loaders/dataframe_loader.py | 24 ++-- griptape/loaders/email_loader.py | 20 +-- griptape/loaders/file_loader.py | 43 ------- griptape/loaders/image_loader.py | 15 +-- griptape/loaders/pdf_loader.py | 38 +++--- griptape/loaders/sql_loader.py | 16 +-- griptape/loaders/text_loader.py | 26 ++-- griptape/loaders/web_loader.py | 22 +--- griptape/tools/file_manager/tool.py | 13 +- griptape/tools/web_scraper/tool.py | 6 +- griptape/utils/hash.py | 8 ++ tests/unit/loaders/conftest.py | 30 +++++ tests/unit/loaders/test_csv_loader.py | 92 +++++++------- tests/unit/loaders/test_dataframe_loader.py | 4 +- tests/unit/loaders/test_file_loader.py | 50 -------- tests/unit/loaders/test_image_loader.py | 129 +++++++------------- tests/unit/loaders/test_pdf_loader.py | 40 +++--- tests/unit/loaders/test_sql_loader.py | 5 +- tests/unit/loaders/test_text_loader.py | 60 ++++----- tests/unit/loaders/test_web_loader.py | 5 +- tests/unit/tools/test_file_manager.py | 7 +- 26 files changed, 317 insertions(+), 431 deletions(-) delete mode 100644 griptape/loaders/file_loader.py create mode 100644 tests/unit/loaders/conftest.py delete mode 100644 tests/unit/loaders/test_file_loader.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf6da091..98aa397b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. +- **BREAKING**: Remove `FileLoader`. +- **BREAKING**: `CsvLoader` no longer accepts `str` file paths as a source. It will now accept the content of the CSV file as a `str` or `bytes` object. +- **BREAKING**: `PdfLoader` no longer accepts `str` file content, `Path` file paths or `IO` objects as sources. Instead, it will only accept the content of the PDF file as a `bytes` object. +- **BREAKING**: `TextLoader` no longer accepts `Path` file paths as a source. It will now accept the content of the text file as a `str` or `bytes` object. +- **BREAKING**: `FileManager.default_loader` is now `None` by default. ## [0.24.2] - 2024-04-04 diff --git a/griptape/loaders/__init__.py b/griptape/loaders/__init__.py index 0c9bb70a0..622ed0c1c 100644 --- a/griptape/loaders/__init__.py +++ b/griptape/loaders/__init__.py @@ -6,7 +6,6 @@ from .sql_loader import SqlLoader from .csv_loader import CsvLoader from .dataframe_loader import DataFrameLoader -from .file_loader import FileLoader from .email_loader import EmailLoader from .image_loader import ImageLoader @@ -20,7 +19,6 @@ "SqlLoader", "CsvLoader", "DataFrameLoader", - "FileLoader", "EmailLoader", "ImageLoader", ] diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 547027c84..531ec23b5 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -8,6 +8,8 @@ from attr import define, field, Factory from griptape.artifacts import BaseArtifact +from griptape.utils.futures import execute_futures_dict +from griptape.utils.hash import bytes_to_hash, str_to_hash @define @@ -18,8 +20,23 @@ class BaseLoader(ABC): def load(self, source: Any, *args, **kwargs) -> BaseArtifact | Sequence[BaseArtifact]: ... - @abstractmethod def load_collection( self, sources: list[Any], *args, **kwargs ) -> Mapping[str, BaseArtifact | Sequence[BaseArtifact | Sequence[BaseArtifact]]]: - ... + # Create a dictionary before actually submitting the jobs to the executor + # to avoid duplicate work. + sources_by_key = {self.to_key(source): source for source in sources} + return execute_futures_dict( + { + key: self.futures_executor.submit(self.load, source, *args, **kwargs) + for key, source in sources_by_key.items() + } + ) + + def to_key(self, source: Any, *args, **kwargs) -> str: + if isinstance(source, bytes): + return bytes_to_hash(source) + elif isinstance(source, str): + return str_to_hash(source) + else: + return str_to_hash(str(source)) diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index 14d608f03..f09b57902 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -1,12 +1,12 @@ from __future__ import annotations from abc import ABC -from typing import Optional +from typing import Any, Optional, Union, cast from attrs import define, field, Factory -from pathlib import Path from griptape.artifacts import TextArtifact +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.chunkers import TextChunker, BaseChunker from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader @@ -33,19 +33,18 @@ class BaseTextLoader(BaseLoader, ABC): embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) encoding: str = field(default="utf-8", kw_only=True) - def _text_to_artifacts(self, text: str | Path) -> list[TextArtifact]: - artifacts = [] + def load_collection(self, sources: list[Any], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: + return cast( + dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) + ) - if isinstance(text, Path): - with open(text, encoding=self.encoding) as file: - body = file.read() - else: - body = text + def _text_to_artifacts(self, text: str) -> list[TextArtifact]: + artifacts = [] if self.chunker: - chunks = self.chunker.chunk(body) + chunks = self.chunker.chunk(text) else: - chunks = [TextArtifact(body)] + chunks = [TextArtifact(text)] if self.embedding_driver: for chunk in chunks: diff --git a/griptape/loaders/csv_loader.py b/griptape/loaders/csv_loader.py index 0784c10ed..72fdcc73a 100644 --- a/griptape/loaders/csv_loader.py +++ b/griptape/loaders/csv_loader.py @@ -1,10 +1,11 @@ +from __future__ import annotations import csv -from typing import Optional +from io import StringIO +from typing import Optional, Union, cast from attr import define, field -from griptape import utils -from griptape.artifacts import CsvRowArtifact +from griptape.artifacts import CsvRowArtifact, ErrorArtifact from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader @@ -13,27 +14,34 @@ class CsvLoader(BaseLoader): embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) delimiter: str = field(default=",", kw_only=True) + encoding: str = field(default="utf-8", kw_only=True) - def load(self, source: str, *args, **kwargs) -> list[CsvRowArtifact]: - return self._load_file(source) - - def load_collection(self, sources: list[str], *args, **kwargs) -> dict[str, list[CsvRowArtifact]]: - return utils.execute_futures_dict( - {utils.str_to_hash(source): self.futures_executor.submit(self._load_file, source) for source in sources} - ) - - def _load_file(self, filename: str) -> list[CsvRowArtifact]: + def load(self, source: bytes | str, *args, **kwargs) -> ErrorArtifact | list[CsvRowArtifact]: artifacts = [] - with open(filename, encoding="utf-8") as csv_file: - reader = csv.DictReader(csv_file, delimiter=self.delimiter) - chunks = [CsvRowArtifact(row) for row in reader] + if isinstance(source, bytes): + try: + source = source.decode(encoding=self.encoding) + except UnicodeDecodeError: + return ErrorArtifact(f"Failed to decode bytes to string using encoding: {self.encoding}") + elif isinstance(source, (bytearray, memoryview)): + return ErrorArtifact(f"Unsupported source type: {type(source)}") - if self.embedding_driver: - for chunk in chunks: - chunk.generate_embedding(self.embedding_driver) + reader = csv.DictReader(StringIO(source), delimiter=self.delimiter) + chunks = [CsvRowArtifact(row) for row in reader] + if self.embedding_driver: for chunk in chunks: - artifacts.append(chunk) + chunk.generate_embedding(self.embedding_driver) + + for chunk in chunks: + artifacts.append(chunk) return artifacts + + def load_collection( + self, sources: list[bytes | str], *args, **kwargs + ) -> dict[str, ErrorArtifact | list[CsvRowArtifact]]: + return cast( + dict[str, Union[ErrorArtifact, list[CsvRowArtifact]]], super().load_collection(sources, *args, **kwargs) + ) diff --git a/griptape/loaders/dataframe_loader.py b/griptape/loaders/dataframe_loader.py index 7a7f75454..1c652d8d2 100644 --- a/griptape/loaders/dataframe_loader.py +++ b/griptape/loaders/dataframe_loader.py @@ -1,14 +1,14 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, cast from attr import define, field -from griptape import utils from griptape.artifacts import CsvRowArtifact from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader from griptape.utils import import_optional_dependency +from griptape.utils.hash import str_to_hash if TYPE_CHECKING: from pandas import DataFrame @@ -19,20 +19,9 @@ class DataFrameLoader(BaseLoader): embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) def load(self, source: DataFrame, *args, **kwargs) -> list[CsvRowArtifact]: - return self._load_file(source) - - def load_collection(self, sources: list[DataFrame], *args, **kwargs) -> dict[str, list[CsvRowArtifact]]: - return utils.execute_futures_dict( - { - self._dataframe_to_hash(source): self.futures_executor.submit(self._load_file, source) - for source in sources - } - ) - - def _load_file(self, dataframe: DataFrame) -> list[CsvRowArtifact]: artifacts = [] - chunks = [CsvRowArtifact(row) for row in dataframe.to_dict(orient="records")] + chunks = [CsvRowArtifact(row) for row in source.to_dict(orient="records")] if self.embedding_driver: for chunk in chunks: @@ -43,7 +32,10 @@ def _load_file(self, dataframe: DataFrame) -> list[CsvRowArtifact]: return artifacts - def _dataframe_to_hash(self, dataframe: DataFrame) -> str: + def load_collection(self, sources: list[DataFrame], *args, **kwargs) -> dict[str, list[CsvRowArtifact]]: + return cast(dict[str, list[CsvRowArtifact]], super().load_collection(sources, *args, **kwargs)) + + def to_key(self, source: DataFrame, *args, **kwargs) -> str: hash_pandas_object = import_optional_dependency("pandas.core.util.hashing").hash_pandas_object - return utils.str_to_hash(str(hash_pandas_object(dataframe, index=True).values)) + return str_to_hash(str(hash_pandas_object(source, index=True).values)) diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index 339402dff..dbb6f3afe 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -1,12 +1,12 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, Union, cast import logging import imaplib from attr import astuple, define, field -from griptape.utils import execute_futures_dict, import_optional_dependency, str_to_hash +from griptape.utils import import_optional_dependency from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact from griptape.loaders import BaseLoader @@ -34,19 +34,8 @@ class EmailQuery: password: str = field(kw_only=True) def load(self, source: EmailQuery, *args, **kwargs) -> ListArtifact | ErrorArtifact: - return self._retrieve_email(source) - - def load_collection(self, sources: list[EmailQuery], *args, **kwargs) -> dict[str, ListArtifact | ErrorArtifact]: - return execute_futures_dict( - { - str_to_hash(str(source)): self.futures_executor.submit(self._retrieve_email, source) - for source in set(sources) - } - ) - - def _retrieve_email(self, query: EmailQuery) -> ListArtifact | ErrorArtifact: mailparser = import_optional_dependency("mailparser") - label, key, search_criteria, max_count = astuple(query) + label, key, search_criteria, max_count = astuple(source) artifacts = [] try: @@ -88,3 +77,6 @@ def _retrieve_email(self, query: EmailQuery) -> ListArtifact | ErrorArtifact: def _count_messages(self, message_numbers: bytes): return len(list(filter(None, message_numbers.decode().split(" ")))) + + def load_collection(self, sources: list[EmailQuery], *args, **kwargs) -> dict[str, ListArtifact | ErrorArtifact]: + return cast(dict[str, Union[ListArtifact, ErrorArtifact]], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/loaders/file_loader.py b/griptape/loaders/file_loader.py deleted file mode 100644 index 5705b0a9c..000000000 --- a/griptape/loaders/file_loader.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -import os -from typing import Optional - -from pathlib import Path -from attr import define, field - -from griptape import utils -from griptape.artifacts import BlobArtifact, TextArtifact, ErrorArtifact -from griptape.loaders import BaseLoader - - -@define -class FileLoader(BaseLoader): - encoding: Optional[str] = field(default=None, kw_only=True) - - def load(self, source: str | Path, *args, **kwargs) -> TextArtifact | BlobArtifact | ErrorArtifact: - return self.file_to_artifact(source) - - def load_collection( - self, sources: list[str | Path], *args, **kwargs - ) -> dict[str, TextArtifact | BlobArtifact | ErrorArtifact]: - return utils.execute_futures_dict( - { - utils.str_to_hash(str(source)): self.futures_executor.submit(self.file_to_artifact, source) - for source in sources - } - ) - - def file_to_artifact(self, path: str | Path) -> TextArtifact | BlobArtifact | ErrorArtifact: - file_name = os.path.basename(path) - - try: - with open(path, "rb") as file: - if self.encoding: - return TextArtifact(file.read().decode(self.encoding), name=file_name) - else: - return BlobArtifact(file.read(), name=file_name, dir_name=os.path.dirname(path)) - except FileNotFoundError: - return ErrorArtifact(f"file {file_name} not found") - except Exception as e: - return ErrorArtifact(f"error loading file: {e}") diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index 8adbcae00..28e272d1e 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -1,11 +1,11 @@ from __future__ import annotations from io import BytesIO -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, cast from attr import define, field -from griptape.utils import execute_futures_dict, str_to_hash, import_optional_dependency +from griptape.utils import import_optional_dependency from griptape.artifacts import ImageArtifact from griptape.loaders import BaseLoader @@ -35,14 +35,6 @@ class ImageLoader(BaseLoader): } def load(self, source: bytes, *args, **kwargs) -> ImageArtifact: - return self._load(source) - - def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, ImageArtifact]: - return execute_futures_dict( - {str_to_hash(str(source)): self.futures_executor.submit(self._load, source) for source in sources} - ) - - def _load(self, source: bytes) -> ImageArtifact: Image = import_optional_dependency("PIL.Image") image = Image.open(BytesIO(source)) @@ -67,3 +59,6 @@ def _get_mime_type(self, image_format: str | None) -> str: raise ValueError(f"Unsupported image format {image_format}") return self.FORMAT_TO_MIME_TYPE[image_format.lower()] + + def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, ImageArtifact]: + return cast(dict[str, ImageArtifact], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/loaders/pdf_loader.py b/griptape/loaders/pdf_loader.py index a9d91b218..66b1e1a01 100644 --- a/griptape/loaders/pdf_loader.py +++ b/griptape/loaders/pdf_loader.py @@ -1,13 +1,12 @@ from __future__ import annotations +from io import BytesIO from attr import define, field, Factory -from typing import IO, Optional -from collections.abc import Sequence - -from pathlib import Path +from typing import Optional, Union, cast +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.loaders import BaseTextLoader -from griptape.utils import str_to_hash, execute_futures_dict, import_optional_dependency +from griptape.utils import import_optional_dependency from griptape.artifacts import TextArtifact from griptape.chunkers import PdfChunker @@ -18,25 +17,16 @@ class PdfLoader(BaseTextLoader): default=Factory(lambda self: PdfChunker(tokenizer=self.tokenizer, max_tokens=self.max_tokens), takes_self=True), kw_only=True, ) + encoding: None = field(default=None, kw_only=True) - def load(self, source: str | IO | Path, password: Optional[str] = None, *args, **kwargs) -> list[TextArtifact]: - return self._load_pdf(source, password) - - def load_collection( - self, sources: Sequence[str | IO | Path], password: Optional[str] = None, *args, **kwargs - ) -> dict[str, list[TextArtifact]]: - return execute_futures_dict( - { - str_to_hash(s.decode()) - if isinstance(s, bytes) - else str_to_hash(str(s)): self.futures_executor.submit(self._load_pdf, s, password) - for s in sources - } - ) - - def _load_pdf(self, stream: str | IO | Path, password: Optional[str]) -> list[TextArtifact]: + def load( + self, source: bytes, password: Optional[str] = None, *args, **kwargs + ) -> ErrorArtifact | list[TextArtifact]: PdfReader = import_optional_dependency("pypdf").PdfReader - - reader = PdfReader(stream, strict=True, password=password) - + reader = PdfReader(BytesIO(source), strict=True, password=password) return self._text_to_artifacts("\n".join([p.extract_text() for p in reader.pages])) + + def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: + return cast( + dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) + ) diff --git a/griptape/loaders/sql_loader.py b/griptape/loaders/sql_loader.py index 7d635f803..527b74de4 100644 --- a/griptape/loaders/sql_loader.py +++ b/griptape/loaders/sql_loader.py @@ -1,8 +1,7 @@ -from typing import Optional +from typing import Optional, cast from attr import define, field -from griptape import utils from griptape.artifacts import CsvRowArtifact from griptape.drivers import BaseSqlDriver, BaseEmbeddingDriver from griptape.loaders import BaseLoader @@ -14,15 +13,7 @@ class SqlLoader(BaseLoader): embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) def load(self, source: str, *args, **kwargs) -> list[CsvRowArtifact]: - return self._load_query(source) - - def load_collection(self, sources: list[str], *args, **kwargs) -> dict[str, list[CsvRowArtifact]]: - return utils.execute_futures_dict( - {utils.str_to_hash(source): self.futures_executor.submit(self._load_query, source) for source in sources} - ) - - def _load_query(self, query: str) -> list[CsvRowArtifact]: - rows = self.sql_driver.execute_query(query) + rows = self.sql_driver.execute_query(source) artifacts = [] if rows: @@ -38,3 +29,6 @@ def _load_query(self, query: str) -> list[CsvRowArtifact]: artifacts.append(chunk) return artifacts + + def load_collection(self, sources: list[str], *args, **kwargs) -> dict[str, list[CsvRowArtifact]]: + return cast(dict[str, list[CsvRowArtifact]], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/loaders/text_loader.py b/griptape/loaders/text_loader.py index 6175147fc..3bba6023d 100644 --- a/griptape/loaders/text_loader.py +++ b/griptape/loaders/text_loader.py @@ -1,12 +1,11 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, Union, cast from attr import field, define, Factory -from pathlib import Path -from griptape import utils from griptape.artifacts import TextArtifact +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.chunkers import TextChunker from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseTextLoader @@ -33,13 +32,20 @@ class TextLoader(BaseTextLoader): embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) encoding: str = field(default="utf-8", kw_only=True) - def load(self, source: str | Path, *args, **kwargs) -> list[TextArtifact]: + def load(self, source: bytes | str, *args, **kwargs) -> ErrorArtifact | list[TextArtifact]: + if isinstance(source, bytes): + try: + source = source.decode(encoding=self.encoding) + except UnicodeDecodeError: + return ErrorArtifact(f"Failed to decode bytes to string using encoding: {self.encoding}") + elif isinstance(source, (bytearray, memoryview)): + return ErrorArtifact(f"Unsupported source type: {type(source)}") + return self._text_to_artifacts(source) - def load_collection(self, sources: list[str | Path], *args, **kwargs) -> dict[str, list[TextArtifact]]: - return utils.execute_futures_dict( - { - utils.str_to_hash(str(source)): self.futures_executor.submit(self._text_to_artifacts, source) - for source in sources - } + def load_collection( + self, sources: list[bytes | str], *args, **kwargs + ) -> dict[str, ErrorArtifact | list[TextArtifact]]: + return cast( + dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) ) diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index 92c9ed972..d6e38f7e0 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -1,7 +1,7 @@ -from typing import Optional +from __future__ import annotations from attr import define, field, Factory +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import BaseWebScraperDriver, TrafilaturaWebScraperDriver -from griptape.utils import str_to_hash, execute_futures_dict from griptape.artifacts import TextArtifact from griptape.loaders import BaseTextLoader @@ -12,20 +12,6 @@ class WebLoader(BaseTextLoader): default=Factory(lambda: TrafilaturaWebScraperDriver()), kw_only=True ) - def load(self, source: str, *args, **kwargs) -> list[TextArtifact]: - return self._load_page_to_artifacts(source) - - def load_collection(self, sources: list[str], *args, **kwargs) -> dict[str, list[TextArtifact]]: - return execute_futures_dict( - { - str_to_hash(source): self.futures_executor.submit(self._load_page_to_artifacts, source) - for source in sources - } - ) - - def _load_page_to_artifacts(self, url: str) -> list[TextArtifact]: - single_chunk_text_artifact = self.extract_page(url) + def load(self, source: str, *args, **kwargs) -> ErrorArtifact | list[TextArtifact]: + single_chunk_text_artifact = self.web_scraper_driver.scrape_url(source) return self._text_to_artifacts(single_chunk_text_artifact.value) - - def extract_page(self, url: str) -> TextArtifact: - return self.web_scraper_driver.scrape_url(url) diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 7c1d4bd8a..7587360cf 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -4,9 +4,10 @@ from pathlib import Path from attr import define, field, Factory from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BaseArtifact, TextArtifact +from griptape.artifacts.blob_artifact import BlobArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.loaders import FileLoader, BaseLoader, PdfLoader, CsvLoader, TextLoader, ImageLoader +from griptape.loaders import BaseLoader, PdfLoader, CsvLoader, TextLoader, ImageLoader from schema import Schema, Literal from typing import Optional, Any @@ -24,7 +25,7 @@ class FileManager(BaseTool): """ workdir: str = field(default=Factory(lambda: os.getcwd()), kw_only=True) - default_loader: BaseLoader = field(default=Factory(lambda: FileLoader())) + default_loader: Optional[BaseLoader] = field(default=None, kw_only=True) loaders: dict[str, BaseLoader] = field( default=Factory( lambda: { @@ -93,7 +94,13 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: full_path = Path(os.path.join(self.workdir, path)) extension = path.split(".")[-1] loader = self.loaders.get(extension) or self.default_loader - result = loader.load(full_path) + with open(full_path, "rb") as file: + content = file.read() + + if loader is None: + result = BlobArtifact(content) + else: + result = loader.load(content) if isinstance(result, list): artifacts.extend(result) diff --git a/griptape/tools/web_scraper/tool.py b/griptape/tools/web_scraper/tool.py index 451b44aec..bff46473f 100644 --- a/griptape/tools/web_scraper/tool.py +++ b/griptape/tools/web_scraper/tool.py @@ -21,6 +21,10 @@ def get_content(self, params: dict) -> ListArtifact | ErrorArtifact: url = params["values"]["url"] try: - return ListArtifact(self.web_loader.load(url)) + result = self.web_loader.load(url) + if isinstance(result, ErrorArtifact): + return result + else: + return ListArtifact(result) except Exception as e: return ErrorArtifact("Error getting page content: " + str(e)) diff --git a/griptape/utils/hash.py b/griptape/utils/hash.py index 6a55aef1e..b428c2f3a 100644 --- a/griptape/utils/hash.py +++ b/griptape/utils/hash.py @@ -1,6 +1,14 @@ import hashlib +def bytes_to_hash(data: bytes, hash_algorithm: str = "sha256") -> str: + m = hashlib.new(hash_algorithm) + + m.update(data) + + return m.hexdigest() + + def str_to_hash(text: str, hash_algorithm: str = "sha256") -> str: m = hashlib.new(hash_algorithm) diff --git a/tests/unit/loaders/conftest.py b/tests/unit/loaders/conftest.py new file mode 100644 index 000000000..e1823a154 --- /dev/null +++ b/tests/unit/loaders/conftest.py @@ -0,0 +1,30 @@ +import os +from pathlib import Path + +import pytest + + +@pytest.fixture +def path_from_resource_path(): + def create_source(resource_path: str) -> Path: + return Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources", resource_path)) + + return create_source + + +@pytest.fixture +def bytes_from_resource_path(path_from_resource_path): + def create_source(resource_path: str) -> bytes: + with open(path_from_resource_path(resource_path), "rb") as f: + return f.read() + + return create_source + + +@pytest.fixture +def str_from_resource_path(path_from_resource_path): + def test_csv_str(resource_path: str) -> str: + with open(path_from_resource_path(resource_path)) as f: + return f.read() + + return test_csv_str diff --git a/tests/unit/loaders/test_csv_loader.py b/tests/unit/loaders/test_csv_loader.py index c6aa81ad4..579146ba2 100644 --- a/tests/unit/loaders/test_csv_loader.py +++ b/tests/unit/loaders/test_csv_loader.py @@ -1,64 +1,60 @@ -import os import pytest -from griptape import utils from griptape.loaders.csv_loader import CsvLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestCsvLoader: - @pytest.fixture - def loaders(self): - return ( - CsvLoader(embedding_driver=MockEmbeddingDriver()), - CsvLoader(embedding_driver=MockEmbeddingDriver(), delimiter="|"), - ) + @pytest.fixture(params=["ascii", "utf-8", None]) + def loader(self, request): + encoding = request.param + if encoding is None: + return CsvLoader(embedding_driver=MockEmbeddingDriver()) + else: + return CsvLoader(embedding_driver=MockEmbeddingDriver(), encoding=encoding) - def test_load_with_path(self, loaders): - (loader, loader_pipe) = loaders - # test loading a file delimited by comma - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test-1.csv") + @pytest.fixture + def loader_with_pipe_delimiter(self): + return CsvLoader(embedding_driver=MockEmbeddingDriver(), delimiter="|") - artifacts = loader.load(path) + @pytest.fixture(params=["bytes_from_resource_path", "str_from_resource_path"]) + def create_source(self, request): + return request.getfixturevalue(request.param) - assert len(artifacts) == 10 - first_artifact = artifacts[0].value - assert first_artifact["Foo"] == "foo1" - assert first_artifact["Bar"] == "bar1" + def test_load(self, loader, create_source): + source = create_source("test-1.csv") - # test loading a file delimited by pipe - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test-pipe.csv") - - artifacts = loader_pipe.load(path) + artifacts = loader.load(source) assert len(artifacts) == 10 - first_artifact = artifacts[0].value - assert first_artifact["Bar"] == "foo1" - assert first_artifact["Foo"] == "bar1" - - assert artifacts[0].embedding == [0, 1] + first_artifact = artifacts[0] + assert first_artifact.value["Foo"] == "foo1" + assert first_artifact.value["Bar"] == "bar1" + assert first_artifact.embedding == [0, 1] - def test_load_collection_with_path(self, loaders): - loader = loaders[0] + def test_load_delimiter(self, loader_with_pipe_delimiter, create_source): + source = create_source("test-pipe.csv") - path1 = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test-1.csv") - path2 = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test-2.csv") - collection = loader.load_collection([path1, path2]) + artifacts = loader_with_pipe_delimiter.load(source) - key1 = utils.str_to_hash(str(path1)) - key2 = utils.str_to_hash(str(path2)) - - assert list(collection.keys()) == [key1, key2] - - artifacts = collection[key1] assert len(artifacts) == 10 - first_artifact = artifacts[0].value - assert first_artifact["Foo"] == "foo1" - assert first_artifact["Bar"] == "bar1" - - artifacts = collection[key2] - assert len(artifacts) == 10 - first_artifact = artifacts[0].value - assert first_artifact["Bar"] == "bar1" - assert first_artifact["Foo"] == "foo1" - - assert artifacts[0].embedding == [0, 1] + first_artifact = artifacts[0] + assert first_artifact.value["Foo"] == "bar1" + assert first_artifact.value["Bar"] == "foo1" + assert first_artifact.embedding == [0, 1] + + def test_load_collection(self, loader, create_source): + resource_paths = ["test-1.csv", "test-2.csv"] + sources = [create_source(resource_path) for resource_path in resource_paths] + + collection = loader.load_collection(sources) + + keys = {loader.to_key(source) for source in sources} + assert collection.keys() == keys + + for key in keys: + artifacts = collection[key] + assert len(artifacts) == 10 + first_artifact = artifacts[0] + assert first_artifact.value["Foo"] == "foo1" + assert first_artifact.value["Bar"] == "bar1" + assert first_artifact.embedding == [0, 1] diff --git a/tests/unit/loaders/test_dataframe_loader.py b/tests/unit/loaders/test_dataframe_loader.py index 9c7eb1054..536555558 100644 --- a/tests/unit/loaders/test_dataframe_loader.py +++ b/tests/unit/loaders/test_dataframe_loader.py @@ -31,8 +31,8 @@ def test_load_collection_with_path(self, loader): df2 = pd.read_csv(path2) collection = loader.load_collection([df1, df2]) - key1 = loader._dataframe_to_hash(df1) - key2 = loader._dataframe_to_hash(df2) + key1 = loader.to_key(df1) + key2 = loader.to_key(df2) assert list(collection.keys()) == [key1, key2] diff --git a/tests/unit/loaders/test_file_loader.py b/tests/unit/loaders/test_file_loader.py deleted file mode 100644 index cd9b9f845..000000000 --- a/tests/unit/loaders/test_file_loader.py +++ /dev/null @@ -1,50 +0,0 @@ -import os -from pathlib import Path -import pytest -from griptape import utils -from griptape.artifacts import TextArtifact, BlobArtifact -from griptape.loaders.file_loader import FileLoader - - -class TestFileLoader: - @pytest.fixture - def loader(self): - return FileLoader() - - def test_load_with_path(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test.txt") - - artifact = loader.load(path) - - assert isinstance(artifact, BlobArtifact) - assert artifact.name == "test.txt" - assert artifact.dir_name.endswith("../../resources") - assert artifact.value.decode().startswith("foobar foobar foobar") - assert artifact.full_path in str(path) - - def test_load_with_encoding(self): - loader = FileLoader(encoding="utf-8") - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test.txt") - - artifact = loader.load(path) - - assert isinstance(artifact, TextArtifact) - assert artifact.name == "test.txt" - assert artifact.value.startswith("foobar foobar foobar") - - def test_load_collection_with_path(self, loader): - text_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test.txt") - pdf_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/bitcoin.pdf") - artifacts = loader.load_collection([text_path, pdf_path]) - - text_key = utils.str_to_hash(str(text_path)) - assert list(artifacts.keys())[0] == text_key - assert artifacts[text_key].name == "test.txt" - assert artifacts[text_key].dir_name.endswith("../../resources") - assert artifacts[text_key].full_path in str(text_path) - - pdf_key = utils.str_to_hash(str(pdf_path)) - assert list(artifacts.keys())[1] == pdf_key - assert artifacts[pdf_key].name == "bitcoin.pdf" - assert artifacts[pdf_key].dir_name.endswith("../../resources") - assert artifacts[pdf_key].full_path in str(pdf_path) diff --git a/tests/unit/loaders/test_image_loader.py b/tests/unit/loaders/test_image_loader.py index d9b75e151..2a90d6b5d 100644 --- a/tests/unit/loaders/test_image_loader.py +++ b/tests/unit/loaders/test_image_loader.py @@ -1,8 +1,4 @@ -import os -from io import BytesIO - import pytest -from PIL import Image from griptape.artifacts import ImageArtifact from griptape.loaders import ImageLoader @@ -13,100 +9,67 @@ class TestImageLoader: def loader(self): return ImageLoader() - def test_init(self, loader): - assert loader - - def test_load_png(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.png") - - with open(path, "rb") as file: - artifact = loader.load(file.read()) - - assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".png") - assert artifact.height == 32 - assert artifact.width == 32 - assert artifact.mime_type == "image/png" - assert len(artifact.value) > 0 - - def test_load_jpg(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.jpg") - - with open(path, "rb") as file: - artifact = loader.load(file.read()) - - assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".jpeg") - assert artifact.height == 32 - assert artifact.width == 32 - assert artifact.mime_type == "image/jpeg" - assert len(artifact.value) > 0 - - def test_load_webp(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.webp") - - with open(path, "rb") as file: - artifact = loader.load(file.read()) - - assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".webp") - assert artifact.height == 32 - assert artifact.width == 32 - assert artifact.mime_type == "image/webp" - assert len(artifact.value) > 0 - - def test_load_bmp(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.bmp") + @pytest.fixture + def png_loader(self): + return ImageLoader(format="png") - with open(path, "rb") as file: - artifact = loader.load(file.read()) + @pytest.fixture + def create_source(self, bytes_from_resource_path): + return bytes_from_resource_path + + @pytest.mark.parametrize( + "resource_path,suffix,mime_type", + [ + ("small.png", ".png", "image/png"), + ("small.jpg", ".jpeg", "image/jpeg"), + ("small.webp", ".webp", "image/webp"), + ("small.bmp", ".bmp", "image/bmp"), + ("small.gif", ".gif", "image/gif"), + ("small.tiff", ".tiff", "image/tiff"), + ], + ) + def test_load(self, resource_path, suffix, mime_type, loader, create_source): + source = create_source(resource_path) + + artifact = loader.load(source) assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".bmp") + assert artifact.name.endswith(suffix) assert artifact.height == 32 assert artifact.width == 32 - assert artifact.mime_type == "image/bmp" + assert artifact.mime_type == mime_type assert len(artifact.value) > 0 - def test_load_gif(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.gif") + @pytest.mark.parametrize( + "resource_path", ["small.png", "small.jpg", "small.webp", "small.bmp", "small.gif", "small.tiff"] + ) + def test_load_normalize(self, resource_path, png_loader, create_source): + source = create_source(resource_path) - with open(path, "rb") as file: - artifact = loader.load(file.read()) + artifact = png_loader.load(source) assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".gif") + assert artifact.name.endswith(".png") assert artifact.height == 32 assert artifact.width == 32 - assert artifact.mime_type == "image/gif" + assert artifact.mime_type == "image/png" assert len(artifact.value) > 0 - def test_load_tiff(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.tiff") - - with open(path, "rb") as file: - artifact = loader.load(file.read()) - - assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".tiff") - assert artifact.height == 32 - assert artifact.width == 32 - assert artifact.mime_type == "image/tiff" - assert len(artifact.value) > 0 + def test_load_collection(self, create_source, png_loader): + resource_paths = ["small.png", "small.jpg"] + sources = [create_source(resource_path) for resource_path in resource_paths] - def test_normalize_format(self): - loader = ImageLoader(format="png") - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/small.jpg") + collection = png_loader.load_collection(sources) - with open(path, "rb") as file: - artifact = loader.load(file.read()) + keys = {png_loader.to_key(source) for source in sources} - image = Image.open(BytesIO(artifact.value)) + assert collection.keys() == keys - assert isinstance(artifact, ImageArtifact) - assert artifact.name.endswith(".png") - assert artifact.height == 32 - assert artifact.width == 32 - assert artifact.mime_type == "image/png" - assert len(artifact.value) > 0 - assert image.format == "PNG" + for key in keys: + artifact = collection[key] + assert isinstance(artifact, ImageArtifact) + assert artifact.name.endswith(".png") + assert artifact.height == 32 + assert artifact.width == 32 + assert artifact.mime_type == "image/png" + assert len(artifact.value) > 0 diff --git a/tests/unit/loaders/test_pdf_loader.py b/tests/unit/loaders/test_pdf_loader.py index 3cb6650bd..0ab78b8b6 100644 --- a/tests/unit/loaders/test_pdf_loader.py +++ b/tests/unit/loaders/test_pdf_loader.py @@ -1,4 +1,6 @@ import os +from pathlib import Path +from typing import IO import pytest from griptape import utils from griptape.loaders import PdfLoader @@ -12,31 +14,33 @@ class TestPdfLoader: def loader(self): return PdfLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) - def test_load(self, loader): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/bitcoin.pdf") + @pytest.fixture + def create_source(self, bytes_from_resource_path): + return bytes_from_resource_path + + def test_load(self, loader, create_source): + source = create_source("bitcoin.pdf") - artifacts = loader.load(path) + artifacts = loader.load(source) assert len(artifacts) == 151 assert artifacts[0].value.startswith("Bitcoin: A Peer-to-Peer") assert artifacts[-1].value.endswith('its applications," 1957.\n9') - assert artifacts[0].embedding == [0, 1] - def test_load_collection(self, loader): - path1 = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/bitcoin.pdf") - path2 = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/bitcoin-2.pdf") - key1 = utils.str_to_hash(path1) - key2 = utils.str_to_hash(path2) + def test_load_collection(self, loader, create_source): + resource_paths = ["bitcoin.pdf", "bitcoin-2.pdf"] + sources = [create_source(resource_path) for resource_path in resource_paths] + + collection = loader.load_collection(sources) - artifacts = loader.load_collection([path1, path2]) + keys = {loader.to_key(source) for source in sources} - assert list(artifacts.keys()) == [key1, key2] - assert len(artifacts[key1]) == 151 - assert artifacts[key1][0].value.startswith("Bitcoin: A Peer-to-Peer") - assert artifacts[key1][-1].value.endswith('its applications," 1957.\n9') - assert len(artifacts[key2]) == 151 - assert artifacts[key2][0].value.startswith("Bitcoin: A Peer-to-Peer") - assert artifacts[key2][-1].value.endswith('its applications," 1957.\n9') + assert collection.keys() == keys - assert artifacts[key1][0].embedding == [0, 1] + for key in keys: + artifact = collection[key] + assert len(artifact) == 151 + assert artifact[0].value.startswith("Bitcoin: A Peer-to-Peer") + assert artifact[-1].value.endswith('its applications," 1957.\n9') + assert artifact[0].embedding == [0, 1] diff --git a/tests/unit/loaders/test_sql_loader.py b/tests/unit/loaders/test_sql_loader.py index d2a9f3f43..8541e4fb8 100644 --- a/tests/unit/loaders/test_sql_loader.py +++ b/tests/unit/loaders/test_sql_loader.py @@ -1,6 +1,5 @@ import pytest from sqlalchemy.pool import StaticPool -from griptape import utils from griptape.drivers import SqlDriver from griptape.loaders import SqlLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -48,8 +47,8 @@ def test_load_collection(self, loader): artifacts = loader.load_collection(["SELECT * FROM test_table LIMIT 1;", "SELECT * FROM test_table LIMIT 2;"]) assert list(artifacts.keys()) == [ - utils.str_to_hash("SELECT * FROM test_table LIMIT 1;"), - utils.str_to_hash("SELECT * FROM test_table LIMIT 2;"), + loader.to_key("SELECT * FROM test_table LIMIT 1;"), + loader.to_key("SELECT * FROM test_table LIMIT 2;"), ] assert [a.value for artifact_list in artifacts.values() for a in artifact_list] == [ diff --git a/tests/unit/loaders/test_text_loader.py b/tests/unit/loaders/test_text_loader.py index 9b028f0c2..0c59df12f 100644 --- a/tests/unit/loaders/test_text_loader.py +++ b/tests/unit/loaders/test_text_loader.py @@ -1,10 +1,6 @@ -import os -from pathlib import Path import pytest -from griptape import utils from griptape.loaders.text_loader import TextLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.unit.chunkers.utils import gen_paragraph MAX_TOKENS = 50 @@ -12,49 +8,39 @@ class TestTextLoader: @pytest.fixture(params=["ascii", "utf-8", None]) def loader(self, request): - return TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver(), encoding=request.param) + encoding = request.param + if encoding is None: + return TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) + else: + return TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver(), encoding=encoding) - def test_load_with_str(self, loader): - text = gen_paragraph(MAX_TOKENS * 2, loader.tokenizer, " ") - artifacts = loader.load(text) + @pytest.fixture(params=["bytes_from_resource_path", "str_from_resource_path"]) + def create_source(self, request): + return request.getfixturevalue(request.param) - assert len(artifacts) == 3 - assert artifacts[0].value.startswith("foo-0 foo-1") - assert artifacts[0].encoding == loader.encoding - - assert artifacts[0].embedding == [0, 1] - - def test_load_with_path(self, loader): - path = Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test.txt")) + def test_load(self, loader, create_source): + source = create_source("test.txt") - artifacts = loader.load(path) + artifacts = loader.load(source) assert len(artifacts) == 39 assert artifacts[0].value.startswith("foobar foobar foobar") assert artifacts[0].encoding == loader.encoding - assert artifacts[0].embedding == [0, 1] - def test_load_collection_with_strings(self, loader): - artifacts = loader.load_collection(["bar", "bat"]) - - assert list(artifacts.keys()) == [utils.str_to_hash("bar"), utils.str_to_hash("bat")] - assert [a.value for artifact_list in artifacts.values() for a in artifact_list] == ["bar", "bat"] - assert [a.encoding for artifact_list in artifacts.values() for a in artifact_list] == [ - loader.encoding, - loader.encoding, - ] + def test_load_collection(self, loader, create_source): + resource_paths = ["test.txt"] + sources = [create_source(resource_path) for resource_path in resource_paths] - assert list(artifacts.values())[0][0].embedding == [0, 1] + collection = loader.load_collection(sources) - def test_load_collection_with_path(self, loader): - path = Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources/test.txt")) - artifacts = loader.load_collection([path]) + keys = {loader.to_key(source) for source in sources} + assert collection.keys() == keys - key = utils.str_to_hash(str(path)) - - assert list(artifacts.keys())[0] == key - assert len(artifacts[key]) == 39 + key = next(iter(keys)) + artifacts = collection[key] + assert len(artifacts) == 39 - assert list(artifacts.values())[0][0].embedding == [0, 1] - assert list(artifacts.values())[0][0].encoding == loader.encoding + artifact = artifacts[0] + assert artifact.embedding == [0, 1] + assert artifact.encoding == loader.encoding diff --git a/tests/unit/loaders/test_web_loader.py b/tests/unit/loaders/test_web_loader.py index cf8226a65..fb63e87eb 100644 --- a/tests/unit/loaders/test_web_loader.py +++ b/tests/unit/loaders/test_web_loader.py @@ -1,5 +1,4 @@ import pytest -from griptape import utils from griptape.loaders import WebLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -29,8 +28,8 @@ def test_load_collection(self, loader): ) assert list(artifacts.keys()) == [ - utils.str_to_hash("https://github.com/griptape-ai/griptape"), - utils.str_to_hash("https://github.com/griptape-ai/griptape-docs"), + loader.to_key("https://github.com/griptape-ai/griptape"), + loader.to_key("https://github.com/griptape-ai/griptape-docs"), ] assert "foobar" in [a.value for artifact_list in artifacts.values() for a in artifact_list][0].lower() diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index 3ecff7e62..3ca19a5cc 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -5,7 +5,8 @@ import pytest from griptape.artifacts import ErrorArtifact from griptape.artifacts import TextArtifact, ListArtifact -from griptape.loaders import FileLoader +from griptape.loaders.pdf_loader import PdfLoader +from griptape.loaders.text_loader import TextLoader from griptape.tools import FileManager from tests.utils import defaults @@ -43,7 +44,7 @@ def test_load_files_from_disk_with_encoding(self): def test_load_files_from_disk_with_encoding_failure(self): result = FileManager( - workdir=os.path.abspath(os.path.dirname(__file__)), default_loader=FileLoader(encoding="utf-8"), loaders={} + workdir=os.path.abspath(os.path.dirname(__file__)), default_loader=TextLoader(encoding="utf-8"), loaders={} ).load_files_from_disk({"values": {"paths": ["../../resources/bitcoin.pdf"]}}) assert isinstance(result.value[0], ErrorArtifact) @@ -122,7 +123,7 @@ def test_save_and_load_content_to_file_with_encoding(self): assert result.value == "saved successfully" result = FileManager( - workdir=temp_dir, default_loader=FileLoader(encoding="ascii"), loaders={} + workdir=temp_dir, default_loader=TextLoader(encoding="ascii"), loaders={} ).load_files_from_disk({"values": {"paths": [os.path.join("test", "foobar.txt")]}}) assert isinstance(result, ListArtifact) From c403954897e6fd06be7c2b902868180e97118fa4 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 9 Apr 2024 17:29:51 -0700 Subject: [PATCH 012/238] Feature/event listener drivers (#735) --- CHANGELOG.md | 10 ++- griptape/drivers/__init__.py | 13 ++++ griptape/drivers/event_listener/__init__.py | 0 .../amazon_sqs_event_listener_driver.py | 23 +++++++ .../aws_iot_core_event_listener_driver.py | 24 +++++++ .../base_event_listener_driver.py | 20 ++++++ .../griptape_cloud_event_listener_driver.py | 32 ++++++++++ .../local_event_listener_driver.py | 18 ++++++ .../webhook_event_listener_driver.py | 17 +++++ griptape/events/event_listener.py | 17 ++++- griptape/structures/structure.py | 6 +- griptape/utils/stream.py | 5 +- poetry.lock | 22 ++++++- pyproject.toml | 5 +- tests/unit/drivers/event_listener/__init__.py | 0 .../test_amazon_sqs_event_listener_driver.py | 31 +++++++++ .../test_aws_iot_event_listener_driver.py | 25 ++++++++ ...st_griptape_cloud_event_listener_driver.py | 37 +++++++++++ .../test_local_event_listener_driver.py | 14 ++++ .../test_webhook_event_listener_driver.py | 25 ++++++++ tests/unit/events/test_event_listener.py | 64 ++++++++++++++----- 21 files changed, 377 insertions(+), 31 deletions(-) create mode 100644 griptape/drivers/event_listener/__init__.py create mode 100644 griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py create mode 100644 griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py create mode 100644 griptape/drivers/event_listener/base_event_listener_driver.py create mode 100644 griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py create mode 100644 griptape/drivers/event_listener/local_event_listener_driver.py create mode 100644 griptape/drivers/event_listener/webhook_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/__init__.py create mode 100644 tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/test_local_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 98aa397b0..4ddbe989d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,15 +8,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `list_files_from_disk` activity to `FileManager` Tool. +- Support for Drivers in `EventListener`. +- `AmazonSqsEventListenerDriver` for sending events to an Amazon SQS queue. +- `AwsIotCoreEventListenerDriver` for sending events to a topic on AWS IoT Core. +- `GriptapeCloudEventListenerDriver` for sending events to Griptape Cloud. +- `WebhookEventListenerDriver` for sending events to a webhook. +- `LocalEventListenerDriver` for sending events to a callback function. + ### Changed -- Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. - **BREAKING**: Remove `FileLoader`. - **BREAKING**: `CsvLoader` no longer accepts `str` file paths as a source. It will now accept the content of the CSV file as a `str` or `bytes` object. - **BREAKING**: `PdfLoader` no longer accepts `str` file content, `Path` file paths or `IO` objects as sources. Instead, it will only accept the content of the PDF file as a `bytes` object. - **BREAKING**: `TextLoader` no longer accepts `Path` file paths as a source. It will now accept the content of the text file as a `str` or `bytes` object. - **BREAKING**: `FileManager.default_loader` is now `None` by default. +- **BREAKING**: Replaced `EventListener.handler` with `EventListener.driver` and `LocalEventListenerDriver`. +- Improved RAG performance in `VectorQueryEngine`. ## [0.24.2] - 2024-04-04 diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index cb453a699..2adc56d7f 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -86,6 +86,13 @@ from .web_scraper.trafilatura_web_scraper_driver import TrafilaturaWebScraperDriver from .web_scraper.markdownify_web_scraper_driver import MarkdownifyWebScraperDriver +from .event_listener.base_event_listener_driver import BaseEventListenerDriver +from .event_listener.amazon_sqs_event_listener_driver import AmazonSqsEventListenerDriver +from .event_listener.webhook_event_listener_driver import WebhookEventListenerDriver +from .event_listener.aws_iot_core_event_listener_driver import AwsIotCoreEventListenerDriver +from .event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver +from .event_listener.local_event_listener_driver import LocalEventListenerDriver + __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", @@ -161,4 +168,10 @@ "BaseWebScraperDriver", "TrafilaturaWebScraperDriver", "MarkdownifyWebScraperDriver", + "BaseEventListenerDriver", + "AmazonSqsEventListenerDriver", + "WebhookEventListenerDriver", + "AwsIotCoreEventListenerDriver", + "GriptapeCloudEventListenerDriver", + "LocalEventListenerDriver", ] diff --git a/griptape/drivers/event_listener/__init__.py b/griptape/drivers/event_listener/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py new file mode 100644 index 000000000..0db63726b --- /dev/null +++ b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any +import json + +from attr import Factory, define, field + +from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + import boto3 + + +@define +class AmazonSqsEventListenerDriver(BaseEventListenerDriver): + queue_url: str = field(kw_only=True) + session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) + sqs_client: Any = field(default=Factory(lambda self: self.session.client("sqs"), takes_self=True)) + + def try_publish_event(self, event: BaseEvent) -> None: + self.sqs_client.send_message(QueueUrl=self.queue_url, MessageBody=json.dumps({"event": event.to_dict()})) diff --git a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py new file mode 100644 index 000000000..876b790e8 --- /dev/null +++ b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import json +from attr import Factory, define, field + +from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + import boto3 + + +@define +class AwsIotCoreEventListenerDriver(BaseEventListenerDriver): + iot_endpoint: str = field(kw_only=True) + topic: str = field(kw_only=True) + session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) + iotdata_client: Any = field(default=Factory(lambda self: self.session.client("iot-data"), takes_self=True)) + + def try_publish_event(self, event: BaseEvent) -> None: + self.iotdata_client.publish(topic=self.topic, payload=json.dumps({"event": event.to_dict()})) diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py new file mode 100644 index 000000000..5bfbe6709 --- /dev/null +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -0,0 +1,20 @@ +from __future__ import annotations +from abc import ABC, abstractmethod +from concurrent import futures +from attr import define, field, Factory +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.events import BaseEvent + + +@define +class BaseEventListenerDriver(ABC): + futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + + def publish_event(self, event: BaseEvent) -> None: + self.futures_executor.submit(self.try_publish_event, event) + + @abstractmethod + def try_publish_event(self, event: BaseEvent) -> None: + ... diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py new file mode 100644 index 000000000..181a246f6 --- /dev/null +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import os +import requests + +from urllib.parse import urljoin +from attr import define, field, Factory + +from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent + + +@define +class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): + base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) + api_key: str = field(kw_only=True) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + ) + run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_RUN_ID")), kw_only=True) + + @run_id.validator # pyright: ignore + def validate_run_id(self, _, run_id: str): + if run_id is None: + raise ValueError( + "run_id must be set either in the constructor or as an environment variable (GT_CLOUD_RUN_ID)." + ) + + def try_publish_event(self, event: BaseEvent) -> None: + url = urljoin(self.base_url.strip("/"), f"/api/runs/{self.run_id}/events/") + + requests.post(url=url, json=event.to_dict(), headers=self.headers) diff --git a/griptape/drivers/event_listener/local_event_listener_driver.py b/griptape/drivers/event_listener/local_event_listener_driver.py new file mode 100644 index 000000000..b276b94ef --- /dev/null +++ b/griptape/drivers/event_listener/local_event_listener_driver.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from typing import Callable, Any +from attr import define, field + +from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent + + +@define +class LocalEventListenerDriver(BaseEventListenerDriver): + handler: Callable[[BaseEvent], Any] = field(default=None, kw_only=True) + + def publish_event(self, event: BaseEvent) -> None: + self.try_publish_event(event) + + def try_publish_event(self, event: BaseEvent) -> None: + self.handler(event) diff --git a/griptape/drivers/event_listener/webhook_event_listener_driver.py b/griptape/drivers/event_listener/webhook_event_listener_driver.py new file mode 100644 index 000000000..d2f0046d0 --- /dev/null +++ b/griptape/drivers/event_listener/webhook_event_listener_driver.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +import requests + +from attr import define, field + +from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent + + +@define +class WebhookEventListenerDriver(BaseEventListenerDriver): + webhook_url: str = field(kw_only=True) + headers: dict = field(default=None, kw_only=True) + + def try_publish_event(self, event: BaseEvent) -> None: + requests.post(url=self.webhook_url, json={"event": event.to_dict()}, headers=self.headers) diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index e757b1b06..aa7da5dcd 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -1,9 +1,20 @@ -from typing import Callable, Optional, Type, Any +from __future__ import annotations +from typing import Optional, TYPE_CHECKING from attrs import define, field from .base_event import BaseEvent +if TYPE_CHECKING: + from griptape.drivers import BaseEventListenerDriver + @define class EventListener: - handler: Callable[[BaseEvent], Any] = field() - event_types: Optional[list[Type[BaseEvent]]] = field(default=None, kw_only=True) + event_types: Optional[list[type[BaseEvent]]] = field(default=None, kw_only=True) + driver: Optional[BaseEventListenerDriver] = field(default=None, kw_only=True) + + def publish_event(self, event: BaseEvent) -> None: + event_types = self.event_types + + if event_types is None or type(event) in event_types: + if self.driver is not None: + self.driver.publish_event(event) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 4e14d087d..e05d25ca5 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -251,11 +251,7 @@ def remove_event_listener(self, event_listener: EventListener) -> None: def publish_event(self, event: BaseEvent) -> None: for event_listener in self.event_listeners: - handler = event_listener.handler - event_types = event_listener.event_types - - if event_types is None or type(event) in event_types: - handler(event) + event_listener.publish_event(event) def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index a6c5c0db4..80d3ea5a1 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -53,11 +53,14 @@ def run(self, *args) -> Iterator[TextArtifact]: t.join() def _run_structure(self, *args): + from griptape.drivers import LocalEventListenerDriver + def event_handler(event: BaseEvent): self._event_queue.put(event) stream_event_listener = EventListener( - event_handler, event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent] + driver=LocalEventListenerDriver(handler=event_handler), + event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent], ) self.structure.add_event_listener(stream_event_listener) diff --git a/poetry.lock b/poetry.lock index 21abd3413..3cc0fbee2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1943,6 +1943,17 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] +[[package]] +name = "jsondiff" +version = "2.0.0" +description = "Diff JSON and JSON-like structures in Python" +optional = false +python-versions = "*" +files = [ + {file = "jsondiff-2.0.0-py3-none-any.whl", hash = "sha256:689841d66273fc88fc79f7d33f4c074774f4f214b6466e3aff0e5adaf889d1e0"}, + {file = "jsondiff-2.0.0.tar.gz", hash = "sha256:2795844ef075ec8a2b8d385c4d59f5ea48b08e7180fce3cb2787be0db00b1fb4"}, +] + [[package]] name = "justext" version = "3.0.0" @@ -2049,7 +2060,6 @@ files = [ {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, - {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, @@ -2349,6 +2359,7 @@ botocore = ">=1.12.201" cryptography = ">=3.3.1" docker = {version = ">=3.0.0", optional = true, markers = "extra == \"dynamodb\""} Jinja2 = ">=2.10.1" +jsondiff = {version = ">=1.1.2", optional = true, markers = "extra == \"iotdata\""} py-partiql-parser = {version = "0.5.0", optional = true, markers = "extra == \"dynamodb\""} python-dateutil = ">=2.1,<3.0.0" requests = ">=2.5" @@ -3034,6 +3045,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -3042,6 +3054,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -5043,6 +5057,8 @@ drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-google = ["google-generativeai"] drivers-embedding-huggingface = ["huggingface-hub", "transformers"] drivers-embedding-voyageai = ["voyageai"] +drivers-event-listener-amazon-iot = ["boto3"] +drivers-event-listener-amazon-sqs = ["boto3"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-prompt-amazon-bedrock = ["anthropic", "boto3"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] @@ -5070,4 +5086,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "4eac3f039981703a8c3d3a2d8ead8a9286c6e346e2ba39b0ff77c0e0b0de6aef" +content-hash = "7b1203869463a403ae5ecbf8b3b267a919d6ef1baff302a28084e18c70e52205" diff --git a/pyproject.toml b/pyproject.toml index 6755f02c5..0a52e0a88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,6 +89,9 @@ drivers-embedding-google = ["google-generativeai"] drivers-web-scraper-trafilatura = ["trafilatura"] drivers-web-scraper-markdownify = ["playwright", "beautifulsoup4", "markdownify"] +drivers-event-listener-amazon-sqs = ["boto3"] +drivers-event-listener-amazon-iot = ["boto3"] + loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] loaders-image = ["pillow"] @@ -134,7 +137,7 @@ pytest-mock = "*" mongomock = "*" twine = ">=4" -moto = {extras = ["dynamodb"], version = "^4.1.8"} +moto = {extras = ["dynamodb", "iotdata", "sqs"], version = "^4.2.13"} pytest-xdist = "^3.3.1" pytest-cov = "^4.1.0" pytest-env = "^1.1.1" diff --git a/tests/unit/drivers/event_listener/__init__.py b/tests/unit/drivers/event_listener/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py new file mode 100644 index 000000000..4a19011be --- /dev/null +++ b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py @@ -0,0 +1,31 @@ +from pytest import fixture +from moto import mock_sqs +import boto3 +from tests.mocks.mock_event import MockEvent +from griptape.drivers.event_listener.amazon_sqs_event_listener_driver import AmazonSqsEventListenerDriver +from tests.utils.aws import mock_aws_credentials + + +class TestAmazonSqsEventListenerDriver: + @fixture() + def run_before_and_after_tests(self): + mock_aws_credentials() + + @fixture() + def driver(self): + mock = mock_sqs() + mock.start() + + session = boto3.Session(region_name="us-east-1") + response = session.client("sqs").create_queue(QueueName="foo-bar") + queue_url = response["QueueUrl"] + + yield AmazonSqsEventListenerDriver(queue_url=queue_url, session=session) + + mock.stop() + + def test_init(self, driver): + assert driver + + def test_try_publish_event(self, driver): + driver.try_publish_event(event=MockEvent()) diff --git a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py new file mode 100644 index 000000000..c56ead9fe --- /dev/null +++ b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py @@ -0,0 +1,25 @@ +from pytest import fixture +from moto import mock_iotdata +import boto3 +from tests.mocks.mock_event import MockEvent +from griptape.drivers.event_listener.aws_iot_core_event_listener_driver import AwsIotCoreEventListenerDriver +from tests.utils.aws import mock_aws_credentials + + +@mock_iotdata +class TestAwsIotCoreEventListenerDriver: + @fixture() + def run_before_and_after_tests(self): + mock_aws_credentials() + + @fixture() + def driver(self): + return AwsIotCoreEventListenerDriver( + iot_endpoint="foo bar", topic="fizz buzz", session=boto3.Session(region_name="us-east-1") + ) + + def test_init(self, driver): + assert driver + + def test_try_publish_event(self, driver): + driver.try_publish_event(event=MockEvent()) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py new file mode 100644 index 000000000..be6340b45 --- /dev/null +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -0,0 +1,37 @@ +from unittest.mock import Mock +from pytest import fixture +import pytest +from tests.mocks.mock_event import MockEvent +from griptape.drivers.event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver + + +class TestGriptapeCloudEventListenerDriver: + @fixture(autouse=True) + def mock_post(self, mocker): + data = {"data": {"id": "test"}} + + mock_post = mocker.patch("requests.post") + mock_post.return_value = Mock(status_code=201, json=data) + + return mock_post + + @fixture() + def driver(self): + return GriptapeCloudEventListenerDriver(api_key="foo bar", run_id="baz") + + def test_init(self, driver): + assert driver + + def test_try_publish_event(self, mock_post, driver): + event = MockEvent() + driver.try_publish_event(event=event) + + mock_post.assert_called_once_with( + url=f"https://cloud.griptape.ai/api/runs/{driver.run_id}/events/", + json=event.to_dict(), + headers={"Authorization": "Bearer foo bar"}, + ) + + def test_no_run_id(self): + with pytest.raises(ValueError): + GriptapeCloudEventListenerDriver(api_key="foo bar") diff --git a/tests/unit/drivers/event_listener/test_local_event_listener_driver.py b/tests/unit/drivers/event_listener/test_local_event_listener_driver.py new file mode 100644 index 000000000..a92276fa8 --- /dev/null +++ b/tests/unit/drivers/event_listener/test_local_event_listener_driver.py @@ -0,0 +1,14 @@ +from moto import mock_iotdata +from unittest.mock import Mock +from tests.mocks.mock_event import MockEvent +from griptape.drivers.event_listener.local_event_listener_driver import LocalEventListenerDriver + + +@mock_iotdata +class TestLocalEventListenerDriver: + def test_try_publish_event(self): + mock = Mock() + event = MockEvent() + driver = LocalEventListenerDriver(handler=mock) + driver.try_publish_event(event=event) + mock.assert_called_once_with(event) diff --git a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py new file mode 100644 index 000000000..207fd48cf --- /dev/null +++ b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py @@ -0,0 +1,25 @@ +from unittest.mock import Mock +from pytest import fixture +from tests.mocks.mock_event import MockEvent +from griptape.drivers.event_listener.webhook_event_listener_driver import WebhookEventListenerDriver + + +class TestWebhookEventListenerDriver: + @fixture(autouse=True) + def mock_post(self, mocker): + mock_post = mocker.patch("requests.post") + mock_post.return_value = Mock(status_code=201) + + return mock_post + + def test_init(self): + assert WebhookEventListenerDriver(webhook_url="") + + def test_try_publish_event(self, mock_post): + driver = WebhookEventListenerDriver(webhook_url="foo bar", headers={"Authorization": "Bearer foo bar"}) + event = MockEvent() + driver.try_publish_event(event=event) + + mock_post.assert_called_once_with( + url="foo bar", json={"event": event.to_dict()}, headers={"Authorization": "Bearer foo bar"} + ) diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 17f2dc8c0..39b59ea94 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -1,5 +1,6 @@ from unittest.mock import Mock import pytest +from griptape.drivers.event_listener.local_event_listener_driver import LocalEventListenerDriver from griptape.structures import Pipeline from griptape.tasks import ToolkitTask, ActionsSubtask from griptape.events import ( @@ -33,7 +34,10 @@ def test_untyped_listeners(self, pipeline): event_handler_1 = Mock() event_handler_2 = Mock() - pipeline.event_listeners = [EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)] + pipeline.event_listeners = [ + EventListener(driver=LocalEventListenerDriver(handler=event_handler_1)), + EventListener(driver=LocalEventListenerDriver(handler=event_handler_2)), + ] # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() pipeline.tasks[0].subtasks[0].after_run() @@ -54,15 +58,37 @@ def test_typed_listeners(self, pipeline): completion_chunk_handler = Mock() pipeline.event_listeners = [ - EventListener(start_prompt_event_handler, event_types=[StartPromptEvent]), - EventListener(finish_prompt_event_handler, event_types=[FinishPromptEvent]), - EventListener(start_task_event_handler, event_types=[StartTaskEvent]), - EventListener(finish_task_event_handler, event_types=[FinishTaskEvent]), - EventListener(start_subtask_event_handler, event_types=[StartActionsSubtaskEvent]), - EventListener(finish_subtask_event_handler, event_types=[FinishActionsSubtaskEvent]), - EventListener(start_structure_run_event_handler, event_types=[StartStructureRunEvent]), - EventListener(finish_structure_run_event_handler, event_types=[FinishStructureRunEvent]), - EventListener(completion_chunk_handler, event_types=[CompletionChunkEvent]), + EventListener( + driver=LocalEventListenerDriver(handler=start_prompt_event_handler), event_types=[StartPromptEvent] + ), + EventListener( + driver=LocalEventListenerDriver(handler=finish_prompt_event_handler), event_types=[FinishPromptEvent] + ), + EventListener( + driver=LocalEventListenerDriver(handler=start_task_event_handler), event_types=[StartTaskEvent] + ), + EventListener( + driver=LocalEventListenerDriver(handler=finish_task_event_handler), event_types=[FinishTaskEvent] + ), + EventListener( + driver=LocalEventListenerDriver(handler=start_subtask_event_handler), + event_types=[StartActionsSubtaskEvent], + ), + EventListener( + driver=LocalEventListenerDriver(handler=finish_subtask_event_handler), + event_types=[FinishActionsSubtaskEvent], + ), + EventListener( + driver=LocalEventListenerDriver(handler=start_structure_run_event_handler), + event_types=[StartStructureRunEvent], + ), + EventListener( + driver=LocalEventListenerDriver(handler=finish_structure_run_event_handler), + event_types=[FinishStructureRunEvent], + ), + EventListener( + driver=LocalEventListenerDriver(handler=completion_chunk_handler), event_types=[CompletionChunkEvent] + ), ] # can't mock subtask events, so must manually call @@ -84,19 +110,23 @@ def test_add_remove_event_listener(self, pipeline): pipeline.event_listeners = [] mock1 = Mock() mock2 = Mock() - # duplicate event listeners will only get added once - event_listener_1 = pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + event_listener_1 = pipeline.add_event_listener( + EventListener(driver=LocalEventListenerDriver(handler=mock1), event_types=[StartPromptEvent]) + ) - event_listener_3 = pipeline.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) - event_listener_4 = pipeline.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) + event_listener_2 = pipeline.add_event_listener( + EventListener(driver=LocalEventListenerDriver(handler=mock1), event_types=[FinishPromptEvent]) + ) + event_listener_3 = pipeline.add_event_listener( + EventListener(driver=LocalEventListenerDriver(handler=mock2), event_types=[StartPromptEvent]) + ) - event_listener_5 = pipeline.add_event_listener(EventListener(mock2)) + event_listener_4 = pipeline.add_event_listener(EventListener(driver=LocalEventListenerDriver(handler=mock2))) assert len(pipeline.event_listeners) == 4 pipeline.remove_event_listener(event_listener_1) + pipeline.remove_event_listener(event_listener_2) pipeline.remove_event_listener(event_listener_3) pipeline.remove_event_listener(event_listener_4) - pipeline.remove_event_listener(event_listener_5) assert len(pipeline.event_listeners) == 0 From f4b2af7a5c6dc506a1e5a38ac6322d00e5a6a3fa Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 10 Apr 2024 13:26:49 -0700 Subject: [PATCH 013/238] Fix trailing slash (#740) --- .../event_listener/griptape_cloud_event_listener_driver.py | 2 +- .../event_listener/test_griptape_cloud_event_listener_driver.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 181a246f6..0b59d93cb 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -27,6 +27,6 @@ def validate_run_id(self, _, run_id: str): ) def try_publish_event(self, event: BaseEvent) -> None: - url = urljoin(self.base_url.strip("/"), f"/api/runs/{self.run_id}/events/") + url = urljoin(self.base_url.strip("/"), f"/api/runs/{self.run_id}/events") requests.post(url=url, json=event.to_dict(), headers=self.headers) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index be6340b45..04b7de4e7 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -27,7 +27,7 @@ def test_try_publish_event(self, mock_post, driver): driver.try_publish_event(event=event) mock_post.assert_called_once_with( - url=f"https://cloud.griptape.ai/api/runs/{driver.run_id}/events/", + url=f"https://cloud.griptape.ai/api/runs/{driver.run_id}/events", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"}, ) From 3cac56179959af5ab8daf5472b96667faba8c820 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:32:52 +0200 Subject: [PATCH 014/238] Add LocalFileManagerDriver (#738) --- CHANGELOG.md | 6 +- griptape/drivers/__init__.py | 5 + griptape/drivers/file_manager/__init__.py | 0 .../file_manager/base_file_manager_driver.py | 100 +++++++++ .../file_manager/local_file_manager_driver.py | 41 ++++ griptape/loaders/__init__.py | 2 + griptape/loaders/base_loader.py | 3 +- griptape/loaders/blob_loader.py | 19 ++ griptape/tools/file_manager/tool.py | 142 +++---------- tests/unit/drivers/file_manager/__init__.py | 0 .../test_local_file_manager_driver.py | 88 ++++++++ tests/unit/loaders/test_blob_loader.py | 46 +++++ tests/unit/tools/test_file_manager.py | 195 +++++++++--------- 13 files changed, 440 insertions(+), 207 deletions(-) create mode 100644 griptape/drivers/file_manager/__init__.py create mode 100644 griptape/drivers/file_manager/base_file_manager_driver.py create mode 100644 griptape/drivers/file_manager/local_file_manager_driver.py create mode 100644 griptape/loaders/blob_loader.py create mode 100644 tests/unit/drivers/file_manager/__init__.py create mode 100644 tests/unit/drivers/file_manager/test_local_file_manager_driver.py create mode 100644 tests/unit/loaders/test_blob_loader.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ddbe989d..333717ba2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `GriptapeCloudEventListenerDriver` for sending events to Griptape Cloud. - `WebhookEventListenerDriver` for sending events to a webhook. - `LocalEventListenerDriver` for sending events to a callback function. - +- `BaseFileManagerDriver` to abstract file management operations. +- `LocalFileManagerDriver` for managing files on the local file system. +- Added optional `BaseLoader.encoding` field. +- `BlobLoader` for loading arbitrary binary data as a `BlobArtifact`. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. @@ -25,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `FileManager.default_loader` is now `None` by default. - **BREAKING**: Replaced `EventListener.handler` with `EventListener.driver` and `LocalEventListenerDriver`. - Improved RAG performance in `VectorQueryEngine`. +- **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. ## [0.24.2] - 2024-04-04 diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 2adc56d7f..5f3e4f50e 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -93,6 +93,9 @@ from .event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver from .event_listener.local_event_listener_driver import LocalEventListenerDriver +from .file_manager.base_file_manager_driver import BaseFileManagerDriver +from .file_manager.local_file_manager_driver import LocalFileManagerDriver + __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", @@ -174,4 +177,6 @@ "AwsIotCoreEventListenerDriver", "GriptapeCloudEventListenerDriver", "LocalEventListenerDriver", + "BaseFileManagerDriver", + "LocalFileManagerDriver", ] diff --git a/griptape/drivers/file_manager/__init__.py b/griptape/drivers/file_manager/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py new file mode 100644 index 000000000..897a05336 --- /dev/null +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -0,0 +1,100 @@ +from __future__ import annotations +from abc import ABC, abstractmethod +from attr import Factory, define, field +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, InfoArtifact, ListArtifact +import griptape.loaders as loaders + + +@define +class BaseFileManagerDriver(ABC): + """ + BaseFileManagerDriver can be used to list, load, and save files. + + Attributes: + default_loader: The default loader to use for loading file contents into artifacts. + loaders: Dictionary of file extension specifc loaders to use for loading file contents into artifacts. + """ + + default_loader: loaders.BaseLoader = field(default=Factory(lambda: loaders.BlobLoader()), kw_only=True) + loaders: dict[str, loaders.BaseLoader] = field( + default=Factory( + lambda: { + "pdf": loaders.PdfLoader(), + "csv": loaders.CsvLoader(), + "txt": loaders.TextLoader(), + "html": loaders.TextLoader(), + "json": loaders.TextLoader(), + "yaml": loaders.TextLoader(), + "xml": loaders.TextLoader(), + "png": loaders.ImageLoader(), + "jpg": loaders.ImageLoader(), + "jpeg": loaders.ImageLoader(), + "webp": loaders.ImageLoader(), + "gif": loaders.ImageLoader(), + "bmp": loaders.ImageLoader(), + "tiff": loaders.ImageLoader(), + } + ), + kw_only=True, + ) + + def list_files(self, path: str) -> TextArtifact | ErrorArtifact: + try: + entries = self.try_list_files(path) + return TextArtifact("\n".join([e for e in entries])) + except FileNotFoundError: + return ErrorArtifact("Path not found") + except NotADirectoryError: + return ErrorArtifact("Path is not a directory") + except Exception as e: + return ErrorArtifact(f"Failed to list files: {str(e)}") + + @abstractmethod + def try_list_files(self, path: str) -> list[str]: + ... + + def load_file(self, path: str) -> BaseArtifact: + try: + extension = path.split(".")[-1] + loader = self.loaders.get(extension) or self.default_loader + source = self.try_load_file(path) + result = loader.load(source) + + if isinstance(result, BaseArtifact): + return result + else: + return ListArtifact(result) + except FileNotFoundError: + return ErrorArtifact("Path not found") + except IsADirectoryError: + return ErrorArtifact("Path is a directory") + except Exception as e: + return ErrorArtifact(f"Failed to load file: {str(e)}") + + @abstractmethod + def try_load_file(self, path: str) -> bytes: + ... + + def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifact: + try: + extension = path.split(".")[-1] + loader = self.loaders.get(extension) or self.default_loader + encoding = None if loader is None else loader.encoding + + if isinstance(value, str): + if encoding is None: + value = value.encode() + else: + value = value.encode(encoding=encoding) + elif isinstance(value, bytearray) or isinstance(value, memoryview): + raise ValueError(f"Unsupported type: {type(value)}") + + self.try_save_file(path, value) + + return InfoArtifact("Successfully saved file") + except Exception as e: + return ErrorArtifact(f"Failed to save file: {str(e)}") + + @abstractmethod + def try_save_file(self, path: str, value: bytes): + ... diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py new file mode 100644 index 000000000..aa875c57a --- /dev/null +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -0,0 +1,41 @@ +from __future__ import annotations +import os +from pathlib import Path +from attr import define, field, Factory +from .base_file_manager_driver import BaseFileManagerDriver + + +@define +class LocalFileManagerDriver(BaseFileManagerDriver): + """ + LocalFileManagerDriver can be used to list, load, and save files on the local file system. + + Attributes: + workdir: The absolute working directory. List, load, and save operations will be performed relative to this directory. + """ + + workdir: str = field(default=Factory(lambda: os.getcwd()), kw_only=True) + + @workdir.validator # pyright: ignore + def validate_workdir(self, _, workdir: str) -> None: + if not Path(workdir).is_absolute(): + raise ValueError("Workdir must be an absolute path") + + def try_list_files(self, path: str) -> list[str]: + full_path = self._full_path(path) + return os.listdir(full_path) + + def try_load_file(self, path: str) -> bytes: + full_path = self._full_path(path) + with open(full_path, "rb") as file: + return file.read() + + def try_save_file(self, path: str, value: bytes): + full_path = self._full_path(path) + os.makedirs(os.path.dirname(full_path), exist_ok=True) + with open(full_path, "wb") as file: + file.write(value) + + def _full_path(self, path: str) -> Path: + path = path.lstrip("/") + return Path(os.path.normpath(os.path.join(self.workdir, path))) diff --git a/griptape/loaders/__init__.py b/griptape/loaders/__init__.py index 622ed0c1c..38beba01a 100644 --- a/griptape/loaders/__init__.py +++ b/griptape/loaders/__init__.py @@ -8,6 +8,7 @@ from .dataframe_loader import DataFrameLoader from .email_loader import EmailLoader from .image_loader import ImageLoader +from .blob_loader import BlobLoader __all__ = [ @@ -21,4 +22,5 @@ "DataFrameLoader", "EmailLoader", "ImageLoader", + "BlobLoader", ] diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 531ec23b5..092319b85 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from concurrent import futures -from typing import Any +from typing import Any, Optional from collections.abc import Mapping, Sequence from attr import define, field, Factory @@ -15,6 +15,7 @@ @define class BaseLoader(ABC): futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + encoding: Optional[str] = field(default=None, kw_only=True) @abstractmethod def load(self, source: Any, *args, **kwargs) -> BaseArtifact | Sequence[BaseArtifact]: diff --git a/griptape/loaders/blob_loader.py b/griptape/loaders/blob_loader.py new file mode 100644 index 000000000..c85c63bcb --- /dev/null +++ b/griptape/loaders/blob_loader.py @@ -0,0 +1,19 @@ +from __future__ import annotations +from typing import Any, Union, cast + +from attr import define + +from griptape.artifacts import BlobArtifact, ErrorArtifact +from griptape.loaders import BaseLoader + + +@define +class BlobLoader(BaseLoader): + def load(self, source: Any, *args, **kwargs) -> BlobArtifact | ErrorArtifact: + if self.encoding is None: + return BlobArtifact(source) + else: + return BlobArtifact(source, encoding=self.encoding) + + def load_collection(self, sources: list[bytes | str], *args, **kwargs) -> dict[str, BlobArtifact | ErrorArtifact]: + return cast(dict[str, Union[BlobArtifact, ErrorArtifact]], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 7587360cf..6aa2c85c0 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -1,58 +1,23 @@ from __future__ import annotations -import logging import os -from pathlib import Path from attr import define, field, Factory -from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BaseArtifact, TextArtifact -from griptape.artifacts.blob_artifact import BlobArtifact +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.drivers import BaseFileManagerDriver, LocalFileManagerDriver from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.loaders import BaseLoader, PdfLoader, CsvLoader, TextLoader, ImageLoader from schema import Schema, Literal -from typing import Optional, Any @define class FileManager(BaseTool): """ - FileManager is a tool that can be used to load and save files. + FileManager is a tool that can be used to list, load, and save files. Attributes: - workdir: The absolute directory to load files from and save files to. - loaders: Dictionary of file extensions and matching loaders to use when loading files in load_files_from_disk. - default_loader: The loader to use when loading files in load_files_from_disk without any matching loader in `loaders`. - save_file_encoding: The encoding to use when saving files to disk. + file_manager_driver: File Manager Driver to use to list, load, and save files. """ - workdir: str = field(default=Factory(lambda: os.getcwd()), kw_only=True) - default_loader: Optional[BaseLoader] = field(default=None, kw_only=True) - loaders: dict[str, BaseLoader] = field( - default=Factory( - lambda: { - "pdf": PdfLoader(), - "csv": CsvLoader(), - "txt": TextLoader(), - "html": TextLoader(), - "json": TextLoader(), - "yaml": TextLoader(), - "xml": TextLoader(), - "png": ImageLoader(), - "jpg": ImageLoader(), - "jpeg": ImageLoader(), - "webp": ImageLoader(), - "gif": ImageLoader(), - "bmp": ImageLoader(), - "tiff": ImageLoader(), - } - ), - kw_only=True, - ) - save_file_encoding: Optional[str] = field(default=None, kw_only=True) - - @workdir.validator # pyright: ignore - def validate_workdir(self, _, workdir: str) -> None: - if not Path(workdir).is_absolute(): - raise ValueError("workdir has to be absolute absolute") + file_manager_driver: BaseFileManagerDriver = field(default=Factory(lambda: LocalFileManagerDriver()), kw_only=True) @activity( config={ @@ -63,15 +28,8 @@ def validate_workdir(self, _, workdir: str) -> None: } ) def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: - path = params["values"]["path"].lstrip("/") - full_path = Path(os.path.join(self.workdir, path)) - - if os.path.exists(full_path): - entries = os.listdir(full_path) - - return TextArtifact("\n".join([e for e in entries])) - else: - return ErrorArtifact("Path not found") + path = params["values"]["path"] + return self.file_manager_driver.list_files(path) @activity( config={ @@ -87,28 +45,15 @@ def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: } ) def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: + paths = params["values"]["paths"] artifacts = [] - for path in params["values"]["paths"]: - path = path.lstrip("/") - full_path = Path(os.path.join(self.workdir, path)) - extension = path.split(".")[-1] - loader = self.loaders.get(extension) or self.default_loader - with open(full_path, "rb") as file: - content = file.read() - - if loader is None: - result = BlobArtifact(content) + for path in paths: + artifact = self.file_manager_driver.load_file(path) + if isinstance(artifact, ListArtifact): + artifacts.extend(artifact.value) else: - result = loader.load(content) - - if isinstance(result, list): - artifacts.extend(result) - elif isinstance(result, BaseArtifact): - artifacts.append(result) - else: - logging.warning(f"Unknown loader return type for file {path}") - + artifacts.append(artifact) return ListArtifact(artifacts) @activity( @@ -128,33 +73,29 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: } ) def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArtifact: - memory = self.find_input_memory(params["values"]["memory_name"]) - artifact_namespace = params["values"]["artifact_namespace"] dir_name = params["values"]["dir_name"] file_name = params["values"]["file_name"] + memory_name = params["values"]["memory_name"] + artifact_namespace = params["values"]["artifact_namespace"] - if memory: - list_artifact = memory.load_artifacts(artifact_namespace) + memory = self.find_input_memory(params["values"]["memory_name"]) + if not memory: + return ErrorArtifact(f"Failed to save memory artifacts to disk - memory named '{memory_name}' not found") - if len(list_artifact) == 0: - return ErrorArtifact("no artifacts found") - elif len(list_artifact) == 1: - try: - self._save_to_disk(os.path.join(self.workdir, dir_name, file_name), list_artifact.value[0].value) + list_artifact = memory.load_artifacts(artifact_namespace) - return InfoArtifact("saved successfully") - except Exception as e: - return ErrorArtifact(f"error writing file to disk: {e}") - else: - try: - for a in list_artifact.value: - self._save_to_disk(os.path.join(self.workdir, dir_name, f"{a.name}-{file_name}"), a.to_text()) + if len(list_artifact) == 0: + return ErrorArtifact( + f"Failed to save memory artifacts to disk - memory named '{memory_name}' does not contain any artifacts" + ) - return InfoArtifact("saved successfully") - except Exception as e: - return ErrorArtifact(f"error writing file to disk: {e}") - else: - return ErrorArtifact("memory not found") + for artifact in list_artifact.value: + formatted_file_name = f"{artifact.name}-{file_name}" if len(list_artifact) > 1 else file_name + result = self.file_manager_driver.save_file(os.path.join(dir_name, formatted_file_name), artifact.value) + if isinstance(result, ErrorArtifact): + return result + + return InfoArtifact("Successfully saved memory artifacts to disk") @activity( config={ @@ -171,25 +112,6 @@ def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArt } ) def save_content_to_file(self, params: dict) -> ErrorArtifact | InfoArtifact: + path = params["values"]["path"] content = params["values"]["content"] - new_path = params["values"]["path"].lstrip("/") - full_path = os.path.join(self.workdir, new_path) - - try: - self._save_to_disk(full_path, content) - - return InfoArtifact("saved successfully") - except Exception as e: - return ErrorArtifact(f"error writing file to disk: {e}") - - def _save_to_disk(self, path: str, value: Any) -> None: - os.makedirs(os.path.dirname(path), exist_ok=True) - - with open(path, "wb") as file: - if isinstance(value, str): - if self.save_file_encoding: - file.write(value.encode(self.save_file_encoding)) - else: - file.write(value.encode()) - else: - file.write(value) + return self.file_manager_driver.save_file(path, content) diff --git a/tests/unit/drivers/file_manager/__init__.py b/tests/unit/drivers/file_manager/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py new file mode 100644 index 000000000..43ef250cf --- /dev/null +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -0,0 +1,88 @@ +import os +from pathlib import Path +import tempfile +import pytest +from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact +from griptape.drivers import LocalFileManagerDriver +from griptape.loaders.text_loader import TextLoader + + +class TestLocalFileManagerDriver: + @pytest.fixture + def driver(self): + tests_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) + return LocalFileManagerDriver(workdir=tests_dir) + + @pytest.fixture + def temp_dir(self): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + def test_validate_workdir(self): + with pytest.raises(ValueError): + LocalFileManagerDriver(workdir="foo") + + def test_list_files(self, driver: LocalFileManagerDriver): + artifact = driver.list_files("resources") + + assert isinstance(artifact, TextArtifact) + assert "bitcoin.pdf" in artifact.value + assert "small.png" in artifact.value + + def test_load_file(self, driver: LocalFileManagerDriver): + artifact = driver.load_file("resources/bitcoin.pdf") + + assert isinstance(artifact, ListArtifact) + assert len(artifact.value) == 4 + + def test_load_file_with_encoding(self, driver: LocalFileManagerDriver): + artifact = driver.load_file("resources/test.txt") + + assert isinstance(artifact, ListArtifact) + assert len(artifact.value) == 1 + assert isinstance(artifact.value[0], TextArtifact) + + def test_load_file_with_encoding_failure(self): + driver = LocalFileManagerDriver( + default_loader=TextLoader(encoding="utf-8"), loaders={}, workdir=os.path.abspath(os.path.dirname(__file__)) + ) + + artifact = driver.load_file("resources/bitcoin.pdf") + + assert isinstance(artifact, ErrorArtifact) + + def test_save_file(self, temp_dir): + driver = LocalFileManagerDriver(workdir=temp_dir) + result = driver.save_file(os.path.join("test", "foobar.txt"), "foobar") + + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" + + def test_save_file_with_encoding(self, temp_dir): + driver = LocalFileManagerDriver(default_loader=TextLoader(encoding="utf-8"), loaders={}, workdir=temp_dir) + result = driver.save_file(os.path.join("test", "foobar.txt"), "foobar") + + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" + + def test_save_and_load_file_with_encoding(self, temp_dir): + driver = LocalFileManagerDriver(loaders={"txt": TextLoader(encoding="ascii")}, workdir=temp_dir) + result = driver.save_file(os.path.join("test", "foobar.txt"), "foobar") + + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" + + driver = LocalFileManagerDriver(default_loader=TextLoader(encoding="ascii"), loaders={}, workdir=temp_dir) + result = driver.load_file(os.path.join("test", "foobar.txt")) + + assert isinstance(result, ListArtifact) + assert len(result.value) == 1 + assert isinstance(result.value[0], TextArtifact) + + def test_chrdir_getcwd(self, temp_dir): + os.chdir(temp_dir) + file_manager_1 = LocalFileManagerDriver() + assert file_manager_1.workdir.endswith(temp_dir) + os.chdir("/tmp") + file_manager_2 = LocalFileManagerDriver() + assert file_manager_2.workdir.endswith("/tmp") diff --git a/tests/unit/loaders/test_blob_loader.py b/tests/unit/loaders/test_blob_loader.py new file mode 100644 index 000000000..f2b462726 --- /dev/null +++ b/tests/unit/loaders/test_blob_loader.py @@ -0,0 +1,46 @@ +import pytest +from griptape.artifacts import BlobArtifact +from griptape.loaders import BlobLoader + + +class TestTextLoader: + @pytest.fixture(params=["utf-8", "ascii", None]) + def loader(self, request): + encoding = request.param + kwargs = {"encoding": encoding} if encoding is not None else {} + return BlobLoader(**kwargs) + + @pytest.fixture(params=["bytes_from_resource_path", "str_from_resource_path"]) + def create_source(self, request): + return request.getfixturevalue(request.param) + + def test_load(self, loader, create_source): + source = create_source("test.txt") + + artifact = loader.load(source) + + assert isinstance(artifact, BlobArtifact) + if loader.encoding is None: + assert artifact.value.decode("utf-8").startswith("foobar foobar foobar") + else: + assert artifact.encoding == loader.encoding + assert artifact.to_text().startswith("foobar foobar foobar") + + def test_load_collection(self, loader, create_source): + resource_paths = ["test.txt"] + sources = [create_source(resource_path) for resource_path in resource_paths] + + collection = loader.load_collection(sources) + + keys = {loader.to_key(source) for source in sources} + assert collection.keys() == keys + + key = next(iter(keys)) + artifact = collection[key] + + assert isinstance(artifact, BlobArtifact) + if loader.encoding is None: + assert artifact.value.decode("utf-8").startswith("foobar foobar foobar") + else: + assert artifact.encoding == loader.encoding + assert artifact.to_text().startswith("foobar foobar foobar") diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index 3ca19a5cc..06c49f32b 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -3,138 +3,143 @@ import tempfile from pathlib import Path import pytest -from griptape.artifacts import ErrorArtifact from griptape.artifacts import TextArtifact, ListArtifact -from griptape.loaders.pdf_loader import PdfLoader +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers.file_manager.local_file_manager_driver import LocalFileManagerDriver from griptape.loaders.text_loader import TextLoader from griptape.tools import FileManager from tests.utils import defaults class TestFileManager: - def test_validate_workdir(self): - with pytest.raises(ValueError): - FileManager(workdir="foo") + @pytest.fixture + def file_manager(self): + return FileManager( + input_memory=[defaults.text_task_memory("Memory1")], + file_manager_driver=LocalFileManagerDriver(workdir=os.path.abspath(os.path.dirname(__file__))), + ) + + @pytest.fixture + def temp_dir(self): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir - def test_list_files_from_disk(self): - result = FileManager( - input_memory=[defaults.text_task_memory("Memory1")], workdir=os.path.abspath(os.path.dirname(__file__)) - ).list_files_from_disk({"values": {"path": "../../resources"}}) + def test_list_files_from_disk(self, file_manager): + result = file_manager.list_files_from_disk({"values": {"path": "../../resources"}}) assert isinstance(result, TextArtifact) assert "bitcoin.pdf" in result.value assert "small.png" in result.value - def test_load_files_from_disk(self): - result = FileManager( - input_memory=[defaults.text_task_memory("Memory1")], workdir=os.path.abspath(os.path.dirname(__file__)) - ).load_files_from_disk({"values": {"paths": ["../../resources/bitcoin.pdf"]}}) + def test_load_files_from_disk(self, file_manager): + result = file_manager.load_files_from_disk({"values": {"paths": ["../../resources/bitcoin.pdf"]}}) assert isinstance(result, ListArtifact) assert len(result.value) == 4 - def test_load_files_from_disk_with_encoding(self): - result = FileManager(workdir=os.path.abspath(os.path.dirname(__file__))).load_files_from_disk( - {"values": {"paths": ["../../resources/test.txt"]}} - ) + def test_load_files_from_disk_with_encoding(self, file_manager): + result = file_manager.load_files_from_disk({"values": {"paths": ["../../resources/test.txt"]}}) assert isinstance(result, ListArtifact) assert len(result.value) == 1 assert isinstance(result.value[0], TextArtifact) def test_load_files_from_disk_with_encoding_failure(self): - result = FileManager( - workdir=os.path.abspath(os.path.dirname(__file__)), default_loader=TextLoader(encoding="utf-8"), loaders={} - ).load_files_from_disk({"values": {"paths": ["../../resources/bitcoin.pdf"]}}) + file_manager = FileManager( + file_manager_driver=LocalFileManagerDriver( + default_loader=TextLoader(encoding="utf-8"), + loaders={}, + workdir=os.path.abspath(os.path.dirname(__file__)), + ) + ) + + result = file_manager.load_files_from_disk({"values": {"paths": ["../../resources/bitcoin.pdf"]}}) assert isinstance(result.value[0], ErrorArtifact) - def test_save_memory_artifacts_to_disk_for_one_artifact(self): - with tempfile.TemporaryDirectory() as temp_dir: - memory = defaults.text_task_memory("Memory1") - artifact = TextArtifact("foobar") - - memory.store_artifact("foobar", artifact) - - result = FileManager(workdir=temp_dir, input_memory=[memory]).save_memory_artifacts_to_disk( - { - "values": { - "dir_name": "test", - "file_name": "foobar.txt", - "memory_name": memory.name, - "artifact_namespace": "foobar", - } + def test_save_memory_artifacts_to_disk_for_one_artifact(self, temp_dir): + memory = defaults.text_task_memory("Memory1") + artifact = TextArtifact("foobar") + + memory.store_artifact("foobar", artifact) + + file_manager = FileManager(input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + result = file_manager.save_memory_artifacts_to_disk( + { + "values": { + "dir_name": "test", + "file_name": "foobar.txt", + "memory_name": memory.name, + "artifact_namespace": "foobar", } - ) + } + ) - assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" - assert result.value == "saved successfully" + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved memory artifacts to disk" - def test_save_memory_artifacts_to_disk_for_multiple_artifacts(self): + def test_save_memory_artifacts_to_disk_for_multiple_artifacts(self, temp_dir): file_name = "foobar.txt" - - with tempfile.TemporaryDirectory() as temp_dir: - memory = defaults.text_task_memory("Memory1") - artifacts = [TextArtifact("foobar"), TextArtifact("baz")] - - for a in artifacts: - memory.store_artifact("foobar", a) - - result = FileManager(workdir=temp_dir, input_memory=[memory]).save_memory_artifacts_to_disk( - { - "values": { - "dir_name": "test", - "file_name": file_name, - "memory_name": memory.name, - "artifact_namespace": "foobar", - } + memory = defaults.text_task_memory("Memory1") + artifacts = [TextArtifact("foobar"), TextArtifact("baz")] + + for a in artifacts: + memory.store_artifact("foobar", a) + + file_manager = FileManager(input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + result = file_manager.save_memory_artifacts_to_disk( + { + "values": { + "dir_name": "test", + "file_name": file_name, + "memory_name": memory.name, + "artifact_namespace": "foobar", } - ) - - assert Path(os.path.join(temp_dir, "test", f"{artifacts[0].name}-{file_name}")).read_text() == "foobar" - assert Path(os.path.join(temp_dir, "test", f"{artifacts[1].name}-{file_name}")).read_text() == "baz" - assert result.value == "saved successfully" + } + ) - def test_save_content_to_file(self): - with tempfile.TemporaryDirectory() as temp_dir: - result = FileManager(workdir=temp_dir).save_content_to_file( - {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} - ) + assert Path(os.path.join(temp_dir, "test", f"{artifacts[0].name}-{file_name}")).read_text() == "foobar" + assert Path(os.path.join(temp_dir, "test", f"{artifacts[1].name}-{file_name}")).read_text() == "baz" + assert result.value == "Successfully saved memory artifacts to disk" - assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" - assert result.value == "saved successfully" + def test_save_content_to_file(self, temp_dir): + file_manager = FileManager(file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + result = file_manager.save_content_to_file( + {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} + ) - def test_save_content_to_file_with_encoding(self): - with tempfile.TemporaryDirectory() as temp_dir: - result = FileManager(workdir=temp_dir, save_file_encoding="utf-8").save_content_to_file( - {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} - ) + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" - assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" - assert result.value == "saved successfully" + def test_save_content_to_file_with_encoding(self, temp_dir): + file_manager = FileManager( + file_manager_driver=LocalFileManagerDriver(default_loader=TextLoader(encoding="utf-8"), workdir=temp_dir) + ) + result = file_manager.save_content_to_file( + {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} + ) - def test_save_and_load_content_to_file_with_encoding(self): - with tempfile.TemporaryDirectory() as temp_dir: - result = FileManager(workdir=temp_dir, save_file_encoding="ascii").save_content_to_file( - {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} - ) + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" - assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" - assert result.value == "saved successfully" + def test_save_and_load_content_to_file_with_encoding(self, temp_dir): + file_manager = FileManager( + file_manager_driver=LocalFileManagerDriver(loaders={"txt": TextLoader(encoding="ascii")}, workdir=temp_dir) + ) + result = file_manager.save_content_to_file( + {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} + ) - result = FileManager( - workdir=temp_dir, default_loader=TextLoader(encoding="ascii"), loaders={} - ).load_files_from_disk({"values": {"paths": [os.path.join("test", "foobar.txt")]}}) + assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + assert result.value == "Successfully saved file" - assert isinstance(result, ListArtifact) - assert len(result.value) == 1 - assert isinstance(result.value[0], TextArtifact) + file_manager = FileManager( + file_manager_driver=LocalFileManagerDriver( + default_loader=TextLoader(encoding="ascii"), loaders={}, workdir=temp_dir + ) + ) + result = file_manager.load_files_from_disk({"values": {"paths": [os.path.join("test", "foobar.txt")]}}) - def test_chrdir_getcwd(self): - with tempfile.TemporaryDirectory() as temp_dir: - os.chdir(temp_dir) - file_manager_1 = FileManager() - assert file_manager_1.workdir.endswith(temp_dir) - os.chdir("/tmp") - file_manager_2 = FileManager() - assert file_manager_2.workdir.endswith("/tmp") + assert isinstance(result, ListArtifact) + assert len(result.value) == 1 + assert isinstance(result.value[0], TextArtifact) From fa2f3378838dd5f9e5af26db1b49f003a05f5dd9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Apr 2024 13:26:43 -0700 Subject: [PATCH 015/238] Add new fields to events (#742) --- CHANGELOG.md | 3 ++ griptape/drivers/prompt/base_prompt_driver.py | 3 +- griptape/events/base_prompt_event.py | 1 + griptape/events/finish_structure_run_event.py | 12 +++++-- griptape/events/start_structure_run_event.py | 12 +++++-- griptape/structures/structure.py | 10 ++++-- tests/unit/events/test_base_event.py | 33 +++++++++++++++++-- tests/unit/events/test_finish_prompt_event.py | 3 +- .../events/test_finish_structure_run_event.py | 6 +++- tests/unit/events/test_start_prompt_event.py | 3 +- .../events/test_start_structure_run_event.py | 5 ++- 11 files changed, 77 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 333717ba2..d973c90e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `LocalFileManagerDriver` for managing files on the local file system. - Added optional `BaseLoader.encoding` field. - `BlobLoader` for loading arbitrary binary data as a `BlobArtifact`. +- `model` field to `StartPromptEvent` and `FinishPromptEvent`. +- `input_task_input` and `input_task_output` fields to `StartStructureRunEvent`. +- `output_task_input` and `output_task_output` fields to `FinishStructureRunEvent`. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 2133617b8..2f7607b00 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -57,6 +57,7 @@ def before_run(self, prompt_stack: PromptStack) -> None: if self.structure: self.structure.publish_event( StartPromptEvent( + model=self.model, token_count=self.token_count(prompt_stack), prompt_stack=prompt_stack, prompt=self.prompt_stack_to_string(prompt_stack), @@ -66,7 +67,7 @@ def before_run(self, prompt_stack: PromptStack) -> None: def after_run(self, result: TextArtifact) -> None: if self.structure: self.structure.publish_event( - FinishPromptEvent(token_count=result.token_count(self.tokenizer), result=result.value) + FinishPromptEvent(model=self.model, token_count=result.token_count(self.tokenizer), result=result.value) ) def run(self, prompt_stack: PromptStack) -> TextArtifact: diff --git a/griptape/events/base_prompt_event.py b/griptape/events/base_prompt_event.py index 3087f0c51..b9dcd0c57 100644 --- a/griptape/events/base_prompt_event.py +++ b/griptape/events/base_prompt_event.py @@ -6,4 +6,5 @@ @define class BasePromptEvent(BaseEvent, ABC): + model: str = field(kw_only=True, metadata={"serializable": True}) token_count: int = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/finish_structure_run_event.py b/griptape/events/finish_structure_run_event.py index 72138c16f..8591041e2 100644 --- a/griptape/events/finish_structure_run_event.py +++ b/griptape/events/finish_structure_run_event.py @@ -1,7 +1,15 @@ -from attrs import define +from typing import Optional, Union +from collections.abc import Sequence + +from attrs import define, field + +from griptape.artifacts import BaseArtifact from griptape.events.base_event import BaseEvent @define class FinishStructureRunEvent(BaseEvent): - ... + output_task_input: Union[ + BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] + ] = field(kw_only=True, metadata={"serializable": True}) + output_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/start_structure_run_event.py b/griptape/events/start_structure_run_event.py index c8e0180df..a0780fd1f 100644 --- a/griptape/events/start_structure_run_event.py +++ b/griptape/events/start_structure_run_event.py @@ -1,7 +1,15 @@ -from attrs import define +from typing import Optional, Union +from collections.abc import Sequence + +from attrs import define, field + +from griptape.artifacts import BaseArtifact from griptape.events.base_event import BaseEvent @define class StartStructureRunEvent(BaseEvent): - ... + input_task_input: Union[ + BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] + ] = field(kw_only=True, metadata={"serializable": True}) + input_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index e05d25ca5..e807393f4 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -257,10 +257,16 @@ def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} def before_run(self) -> None: - self.publish_event(StartStructureRunEvent()) + self.publish_event( + StartStructureRunEvent(input_task_input=self.input_task.input, input_task_output=self.input_task.output) + ) def after_run(self) -> None: - self.publish_event(FinishStructureRunEvent()) + self.publish_event( + FinishStructureRunEvent( + output_task_input=self.output_task.input, output_task_output=self.output_task.output + ) + ) @abstractmethod def add_task(self, task: BaseTask) -> BaseTask: diff --git a/tests/unit/events/test_base_event.py b/tests/unit/events/test_base_event.py index 9c9f340a3..2def78015 100644 --- a/tests/unit/events/test_base_event.py +++ b/tests/unit/events/test_base_event.py @@ -33,6 +33,7 @@ def test_start_prompt_event_from_dict(self): "token_count": 10, "prompt_stack": {"inputs": [{"content": "foo", "role": "user"}, {"content": "bar", "role": "system"}]}, "prompt": "foo bar", + "model": "foo bar", } event = BaseEvent.from_dict(dict_value) @@ -45,9 +46,16 @@ def test_start_prompt_event_from_dict(self): assert event.prompt_stack.inputs[1].content == "bar" assert event.prompt_stack.inputs[1].role == "system" assert event.prompt == "foo bar" + assert event.model == "foo bar" def test_finish_prompt_event_from_dict(self): - dict_value = {"type": "FinishPromptEvent", "timestamp": 123.0, "token_count": 10, "result": "foo bar"} + dict_value = { + "type": "FinishPromptEvent", + "timestamp": 123.0, + "token_count": 10, + "result": "foo bar", + "model": "foo bar", + } event = BaseEvent.from_dict(dict_value) @@ -55,6 +63,7 @@ def test_finish_prompt_event_from_dict(self): assert event.timestamp == 123 assert event.token_count == 10 assert event.result == "foo bar" + assert event.model == "foo bar" def test_start_task_event_from_dict(self): dict_value = { @@ -103,6 +112,7 @@ def test_start_subtask_event_from_dict(self): assert event.task_input.value == "foo" assert event.task_output.value == "bar" assert event.subtask_thought == "bar" + assert event.subtask_actions is not None assert event.subtask_actions[0]["tag"] == "foo" assert event.subtask_actions[0]["name"] == "qux" assert event.subtask_actions[0]["path"] == "foopath" @@ -156,6 +166,7 @@ def test_finish_subtask_event_from_dict(self): assert event.task_input.value == "foo" assert event.task_output.value == "bar" assert event.subtask_thought == "bar" + assert event.subtask_actions is not None assert event.subtask_actions[0]["tag"] == "foo" assert event.subtask_actions[0]["name"] == "qux" assert event.subtask_actions[0]["path"] == "foopath" @@ -163,20 +174,36 @@ def test_finish_subtask_event_from_dict(self): assert event.subtask_actions[0]["input"]["value"] == "quux" def test_start_structure_run_event_from_dict(self): - dict_value = {"type": "StartStructureRunEvent", "timestamp": 123.0} + dict_value = { + "type": "StartStructureRunEvent", + "timestamp": 123.0, + "input_task_input": {"type": "TextArtifact", "value": "foo"}, + "input_task_output": {"type": "TextArtifact", "value": "bar"}, + } event = BaseEvent.from_dict(dict_value) assert isinstance(event, StartStructureRunEvent) assert event.timestamp == 123 + assert isinstance(event.input_task_input, BaseArtifact) + assert event.input_task_input.value == "foo" + assert event.input_task_output.value == "bar" def test_finish_structure_run_event_from_dict(self): - dict_value = {"type": "FinishStructureRunEvent", "timestamp": 123.0} + dict_value = { + "type": "FinishStructureRunEvent", + "timestamp": 123.0, + "output_task_input": {"type": "TextArtifact", "value": "foo"}, + "output_task_output": {"type": "TextArtifact", "value": "bar"}, + } event = BaseEvent.from_dict(dict_value) assert isinstance(event, FinishStructureRunEvent) assert event.timestamp == 123 + assert isinstance(event.output_task_input, BaseArtifact) + assert event.output_task_input.value == "foo" + assert event.output_task_output.value == "bar" def test_completion_chunk_event_from_dict(self): dict_value = {"type": "CompletionChunkEvent", "timestamp": 123.0, "token": "foo"} diff --git a/tests/unit/events/test_finish_prompt_event.py b/tests/unit/events/test_finish_prompt_event.py index 038804a7d..b788c67f9 100644 --- a/tests/unit/events/test_finish_prompt_event.py +++ b/tests/unit/events/test_finish_prompt_event.py @@ -5,7 +5,7 @@ class TestFinishPromptEvent: @pytest.fixture def finish_prompt_event(self): - return FinishPromptEvent(token_count=123, result="foo bar") + return FinishPromptEvent(token_count=123, result="foo bar", model="foo bar") def test_to_dict(self, finish_prompt_event): assert "timestamp" in finish_prompt_event.to_dict() @@ -13,3 +13,4 @@ def test_to_dict(self, finish_prompt_event): assert finish_prompt_event.to_dict()["token_count"] == 123 assert finish_prompt_event.to_dict()["result"] == "foo bar" + assert finish_prompt_event.to_dict()["model"] == "foo bar" diff --git a/tests/unit/events/test_finish_structure_run_event.py b/tests/unit/events/test_finish_structure_run_event.py index 363b2cf0d..d369ab5e5 100644 --- a/tests/unit/events/test_finish_structure_run_event.py +++ b/tests/unit/events/test_finish_structure_run_event.py @@ -1,11 +1,15 @@ import pytest +from griptape.artifacts.text_artifact import TextArtifact from griptape.events import FinishStructureRunEvent class TestFinishStructureRunEvent: @pytest.fixture def finish_structure_run_event(self): - return FinishStructureRunEvent() + return FinishStructureRunEvent(output_task_input=TextArtifact("foo"), output_task_output=TextArtifact("bar")) def test_to_dict(self, finish_structure_run_event): assert finish_structure_run_event.to_dict() is not None + + assert finish_structure_run_event.to_dict()["output_task_input"]["value"] == "foo" + assert finish_structure_run_event.to_dict()["output_task_output"]["value"] == "bar" diff --git a/tests/unit/events/test_start_prompt_event.py b/tests/unit/events/test_start_prompt_event.py index cc3f8e2ea..a80f8cdfc 100644 --- a/tests/unit/events/test_start_prompt_event.py +++ b/tests/unit/events/test_start_prompt_event.py @@ -9,7 +9,7 @@ def start_prompt_event(self): prompt_stack = PromptStack() prompt_stack.add_user_input("foo") prompt_stack.add_system_input("bar") - return StartPromptEvent(token_count=123, prompt_stack=prompt_stack, prompt="foo bar") + return StartPromptEvent(token_count=123, prompt_stack=prompt_stack, prompt="foo bar", model="foo bar") def test_to_dict(self, start_prompt_event): assert "timestamp" in start_prompt_event.to_dict() @@ -21,3 +21,4 @@ def test_to_dict(self, start_prompt_event): assert start_prompt_event.to_dict()["prompt_stack"]["inputs"][1]["role"] == "system" assert start_prompt_event.to_dict()["prompt"] == "foo bar" + assert start_prompt_event.to_dict()["model"] == "foo bar" diff --git a/tests/unit/events/test_start_structure_run_event.py b/tests/unit/events/test_start_structure_run_event.py index 675ca4799..945b38e64 100644 --- a/tests/unit/events/test_start_structure_run_event.py +++ b/tests/unit/events/test_start_structure_run_event.py @@ -1,11 +1,14 @@ import pytest +from griptape.artifacts.text_artifact import TextArtifact from griptape.events import StartStructureRunEvent class TestStartStructureRunEvent: @pytest.fixture def start_structure_run_event(self): - return StartStructureRunEvent() + return StartStructureRunEvent(input_task_input=TextArtifact("foo"), input_task_output=TextArtifact("bar")) def test_to_dict(self, start_structure_run_event): assert start_structure_run_event.to_dict() is not None + assert start_structure_run_event.to_dict()["input_task_input"]["value"] == "foo" + assert start_structure_run_event.to_dict()["input_task_output"]["value"] == "bar" From fe53d86870498b018657ff1731fdda46fee5d832 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Apr 2024 13:36:55 -0700 Subject: [PATCH 016/238] Remove boto3 from types (#741) --- griptape/schemas/base_schema.py | 5 ++++- griptape/utils/__init__.py | 2 ++ griptape/utils/import_utils.py | 17 +++++++++++++++++ tests/unit/utils/test_import_utils.py | 17 +++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/unit/utils/test_import_utils.py diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index e436e19da..82bc072fb 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -100,13 +100,16 @@ def _resolve_types(cls, attrs_cls: type) -> None: Args: attrs_cls: An attrs class. """ + from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver, BasePromptModelDriver from griptape.structures import Structure from griptape.utils import PromptStack from griptape.tokenizers.base_tokenizer import BaseTokenizer - import boto3 + from typing import Any + + boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any attrs.resolve_types( attrs_cls, diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index dc3f6e901..1aad72db9 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -12,6 +12,7 @@ from .dict_utils import dict_merge from .hash import str_to_hash from .import_utils import import_optional_dependency +from .import_utils import is_dependency_installed from .stream import Stream from .constants import Constants as constants from .load_artifact_from_memory import load_artifact_from_memory @@ -32,6 +33,7 @@ def minify_json(value: str) -> str: "Chat", "str_to_hash", "import_optional_dependency", + "is_dependency_installed", "execute_futures_dict", "TokenCounter", "PromptStack", diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index ffbb5ab66..dd5b5b68e 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -33,3 +33,20 @@ def import_optional_dependency(name: str) -> Optional[ModuleType]: raise ImportError(msg) return module + + +def is_dependency_installed(name: str) -> bool: + """Check if an optional dependency is available. + + Args: + name: The module name. + Returns: + True if the dependency is available. + False if the dependency is not available. + """ + try: + import_optional_dependency(name) + except ImportError: + return False + + return True diff --git a/tests/unit/utils/test_import_utils.py b/tests/unit/utils/test_import_utils.py new file mode 100644 index 000000000..bcfb06c87 --- /dev/null +++ b/tests/unit/utils/test_import_utils.py @@ -0,0 +1,17 @@ +import pytest +from griptape.utils import import_optional_dependency, is_dependency_installed + + +class TestImportUtils: + def test_import_optional_dependency(self): + assert import_optional_dependency("os") + assert import_optional_dependency("boto3") + + with pytest.raises(ImportError): + assert import_optional_dependency("foobar") + + def test_is_dependency_installed(self): + assert is_dependency_installed("os") is True + assert is_dependency_installed("boto3") is True + + assert is_dependency_installed("foobar") is False From 2cc293cce101af0c01e86392fa43874246e34697 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Fri, 12 Apr 2024 22:17:34 +0200 Subject: [PATCH 017/238] Add AmazonS3FileManagerDriver (#743) Co-authored-by: Collin Dutter --- CHANGELOG.md | 1 + griptape/drivers/__init__.py | 2 + .../amazon_s3_file_manager_driver.py | 122 ++++++++ .../file_manager/base_file_manager_driver.py | 4 + .../file_manager/local_file_manager_driver.py | 18 +- .../test_aws_iot_event_listener_driver.py | 2 +- .../test_amazon_s3_file_manager_driver.py | 294 ++++++++++++++++++ .../test_local_file_manager_driver.py | 198 +++++++++++- 8 files changed, 624 insertions(+), 17 deletions(-) create mode 100644 griptape/drivers/file_manager/amazon_s3_file_manager_driver.py create mode 100644 tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d973c90e8..cd1606b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `model` field to `StartPromptEvent` and `FinishPromptEvent`. - `input_task_input` and `input_task_output` fields to `StartStructureRunEvent`. - `output_task_input` and `output_task_output` fields to `FinishStructureRunEvent`. +- `AmazonS3FileManagerDriver` for managing files on Amazon S3. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 5f3e4f50e..740990031 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -95,6 +95,7 @@ from .file_manager.base_file_manager_driver import BaseFileManagerDriver from .file_manager.local_file_manager_driver import LocalFileManagerDriver +from .file_manager.amazon_s3_file_manager_driver import AmazonS3FileManagerDriver __all__ = [ "BasePromptDriver", @@ -179,4 +180,5 @@ "LocalEventListenerDriver", "BaseFileManagerDriver", "LocalFileManagerDriver", + "AmazonS3FileManagerDriver", ] diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py new file mode 100644 index 000000000..cbf2109ef --- /dev/null +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -0,0 +1,122 @@ +from __future__ import annotations +import os +from pathlib import Path +from typing import TYPE_CHECKING, Any +from attr import define, field, Factory +from griptape.utils.import_utils import import_optional_dependency +from .base_file_manager_driver import BaseFileManagerDriver + +if TYPE_CHECKING: + import boto3 + + +@define +class AmazonS3FileManagerDriver(BaseFileManagerDriver): + """ + AmazonS3FileManagerDriver can be used to list, load, and save files in an Amazon S3 bucket. + + Attributes: + session: The boto3 session to use for S3 operations. + bucket: The name of the S3 bucket. + workdir: The absolute working directory (must start with "/"). List, load, and save + operations will be performed relative to this directory. + s3_client: The S3 client to use for S3 operations. + """ + + session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) + bucket: str = field(kw_only=True) + workdir: str = field(default="/", kw_only=True) + s3_client: Any = field(default=Factory(lambda self: self.session.client("s3"), takes_self=True), kw_only=True) + + @workdir.validator # pyright: ignore + def validate_workdir(self, _, workdir: str) -> None: + if not Path(workdir).is_absolute(): + raise ValueError("Workdir must be an absolute path") + + def try_list_files(self, path: str) -> list[str]: + full_key = self._to_dir_full_key(path) + files_and_dirs = self._list_files_and_dirs(full_key) + if len(files_and_dirs) == 0: + if len(self._list_files_and_dirs(full_key.rstrip("/"), max_items=1)) > 0: + raise NotADirectoryError + else: + raise FileNotFoundError + return files_and_dirs + + def try_load_file(self, path: str) -> bytes: + botocore = import_optional_dependency("botocore") + full_key = self._to_full_key(path) + + if self._is_a_directory(full_key): + raise IsADirectoryError + + try: + response = self.s3_client.get_object(Bucket=self.bucket, Key=full_key) + return response["Body"].read() + except botocore.exceptions.ClientError as e: + if e.response["Error"]["Code"] in {"NoSuchKey", "404"}: + raise FileNotFoundError + else: + raise e + + def try_save_file(self, path: str, value: bytes): + full_key = self._to_full_key(path) + if self._is_a_directory(full_key): + raise IsADirectoryError + self.s3_client.put_object(Bucket=self.bucket, Key=full_key, Body=value) + + def _to_full_key(self, path: str) -> str: + path = path.lstrip("/") + full_key = os.path.join(self.workdir, path) + # Need to keep the trailing slash if it was there, + # because it means the path is a directory. + ended_with_slash = path.endswith("/") + full_key = os.path.normpath(full_key) + if ended_with_slash: + full_key += "/" + return full_key.lstrip("/") + + def _to_dir_full_key(self, path: str) -> str: + full_key = self._to_full_key(path) + # S3 "directories" always end with a slash, except for the root. + if full_key != "" and not full_key.endswith("/"): + full_key += "/" + return full_key + + def _list_files_and_dirs(self, full_key: str, **kwargs) -> list[str]: + max_items = kwargs.get("max_items") + pagination_config = {} + if max_items is not None: + pagination_config["MaxItems"] = max_items + + paginator = self.s3_client.get_paginator("list_objects_v2") + pages = paginator.paginate( + Bucket=self.bucket, Prefix=full_key, Delimiter="/", PaginationConfig=pagination_config + ) + files_and_dirs = [] + for page in pages: + for obj in page.get("CommonPrefixes", []): + prefix = obj.get("Prefix") + dir = prefix[len(full_key) :].rstrip("/") + files_and_dirs.append(dir) + + for obj in page.get("Contents", []): + key = obj.get("Key") + file = key[len(full_key) :] + files_and_dirs.append(file) + return files_and_dirs + + def _is_a_directory(self, full_key: str) -> bool: + botocore = import_optional_dependency("botocore") + if full_key == "" or full_key.endswith("/"): + return True + + try: + self.s3_client.head_object(Bucket=self.bucket, Key=full_key) + except botocore.exceptions.ClientError as e: + if e.response["Error"]["Code"] in {"NoSuchKey", "404"}: + return len(self._list_files_and_dirs(full_key, max_items=1)) > 0 + else: + raise e + + return False diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 897a05336..b6c0a02ca 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -68,6 +68,8 @@ def load_file(self, path: str) -> BaseArtifact: return ErrorArtifact("Path not found") except IsADirectoryError: return ErrorArtifact("Path is a directory") + except NotADirectoryError: + return ErrorArtifact("Not a directory") except Exception as e: return ErrorArtifact(f"Failed to load file: {str(e)}") @@ -92,6 +94,8 @@ def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifa self.try_save_file(path, value) return InfoArtifact("Successfully saved file") + except IsADirectoryError: + return ErrorArtifact("Path is a directory") except Exception as e: return ErrorArtifact(f"Failed to save file: {str(e)}") diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index aa875c57a..96766fa9a 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -27,15 +27,29 @@ def try_list_files(self, path: str) -> list[str]: def try_load_file(self, path: str) -> bytes: full_path = self._full_path(path) + if self._is_dir(full_path): + raise IsADirectoryError with open(full_path, "rb") as file: return file.read() def try_save_file(self, path: str, value: bytes): full_path = self._full_path(path) + if self._is_dir(full_path): + raise IsADirectoryError os.makedirs(os.path.dirname(full_path), exist_ok=True) with open(full_path, "wb") as file: file.write(value) - def _full_path(self, path: str) -> Path: + def _full_path(self, path: str) -> str: path = path.lstrip("/") - return Path(os.path.normpath(os.path.join(self.workdir, path))) + full_path = os.path.join(self.workdir, path) + # Need to keep the trailing slash if it was there, + # because it means the path is a directory. + ended_with_slash = path.endswith("/") + full_path = os.path.normpath(full_path) + if ended_with_slash: + full_path = full_path.rstrip("/") + "/" + return full_path + + def _is_dir(self, full_path: str) -> bool: + return full_path.endswith("/") or Path(full_path).is_dir() diff --git a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py index c56ead9fe..c8b6a77ed 100644 --- a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py @@ -8,7 +8,7 @@ @mock_iotdata class TestAwsIotCoreEventListenerDriver: - @fixture() + @fixture(autouse=True) def run_before_and_after_tests(self): mock_aws_credentials() diff --git a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py new file mode 100644 index 000000000..285cf9510 --- /dev/null +++ b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py @@ -0,0 +1,294 @@ +import os +import tempfile +import boto3 +import pytest +from moto import mock_s3 +from griptape.artifacts import ErrorArtifact, ListArtifact, InfoArtifact, TextArtifact +from griptape.drivers import AmazonS3FileManagerDriver +from griptape.loaders import TextLoader +from tests.utils.aws import mock_aws_credentials + + +class TestAmazonS3FileManagerDriver: + @pytest.fixture(autouse=True) + def set_aws_credentials(self): + mock_aws_credentials() + + @pytest.fixture + def session(self): + mock = mock_s3() + mock.start() + yield boto3.Session(region_name="us-east-1") + mock.stop() + + @pytest.fixture + def s3_client(self, session): + yield session.client("s3") + + @pytest.fixture(autouse=True) + def bucket(self, s3_client): + bucket = "test-bucket" + s3_client.create_bucket(Bucket=bucket) + + def write_file(path: str, content: bytes): + s3_client.put_object(Bucket=bucket, Key=path, Body=content) + + def mkdir(path: str): + # S3-style empty directories, such as is created via the `Create Folder` button + # in the AWS S3 console (essentially, an empty file with a trailing slash). + s3_dir_key = path.rstrip("/") + "/" + s3_client.put_object(Bucket=bucket, Key=s3_dir_key) + + def copy_test_resource(resource_path: str): + file_dir = os.path.dirname(__file__) + full_path = os.path.join(file_dir, "../../../resources", resource_path) + full_path = os.path.normpath(full_path) + s3_client.upload_file(Bucket=bucket, Key=f"resources/{resource_path}", Filename=full_path) + + # Add some files + write_file("foo.txt", b"foo") + write_file("foo/bar.txt", b"bar") + write_file("foo/bar/baz.txt", b"baz") + copy_test_resource("bitcoin.pdf") + copy_test_resource("small.png") + copy_test_resource("test.txt") + + # Add some empty directories + mkdir("foo-empty") + mkdir("foo/bar-empty") + mkdir("foo/bar/baz-empty") + + yield bucket + + @pytest.fixture + def driver(self, session, bucket): + return AmazonS3FileManagerDriver(session=session, bucket=bucket) + + @pytest.fixture + def temp_dir(self): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + @pytest.fixture + def get_s3_value(self, s3_client, bucket): + def _get_s3_value(key): + return s3_client.get_object(Bucket=bucket, Key=key)["Body"].read().decode() + + return _get_s3_value + + @pytest.mark.parametrize("workdir", ["", ".", "foo", "foo/bar"]) + def test_validate_workdir(self, workdir, session, bucket): + with pytest.raises(ValueError): + AmazonS3FileManagerDriver(session=session, bucket=bucket, workdir=workdir) + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # Valid non-empty directories (witout trailing slash) + ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar", ["baz.txt", "baz-empty"]), + ("/", "resources", ["bitcoin.pdf", "small.png", "test.txt"]), + ("/foo", "", ["bar", "bar.txt", "bar-empty"]), + ("/foo", "bar", ["baz.txt", "baz-empty"]), + ("/foo/bar", "", ["baz.txt", "baz-empty"]), + ("/resources", "", ["bitcoin.pdf", "small.png", "test.txt"]), + # Valid non-empty directories (with trailing slash) + ("/", "/", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar/", ["baz.txt", "baz-empty"]), + ("/foo", "/", ["bar", "bar.txt", "bar-empty"]), + ("/foo", "bar/", ["baz.txt", "baz-empty"]), + ("/foo/bar", "/", ["baz.txt", "baz-empty"]), + # relative paths + ("/", ".", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/.", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar/.", ["baz.txt", "baz-empty"]), + ("/./..", ".", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "foo/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "foo/.", ["bar", "bar.txt", "bar-empty"]), + ("/./..", "foo/bar/.", ["baz.txt", "baz-empty"]), + # Empty folders (witout trailing slash) + ("/", "foo-empty", []), + ("/", "foo/bar-empty", []), + ("/", "foo/bar/baz-empty", []), + # Empty folders (with trailing slash) + ("/", "foo-empty/", []), + ("/", "foo/bar-empty/", []), + ("/", "foo/bar/baz-empty/", []), + ], + ) + def test_list_files(self, workdir, path, expected, driver): + driver.workdir = workdir + + artifact = driver.list_files(path) + + assert isinstance(artifact, TextArtifact) + assert set(filter(None, artifact.value.split("\n"))) == set(expected) + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # non-existent paths + ("/", "bar", "Path not found"), + ("/", "bar/", "Path not found"), + ("/", "bitcoin.pdf", "Path not found"), + # # paths to files (not directories) + ("/", "foo.txt", "Path is not a directory"), + ("/", "/foo.txt", "Path is not a directory"), + ("/resources", "bitcoin.pdf", "Path is not a directory"), + ("/resources", "/bitcoin.pdf", "Path is not a directory"), + ], + ) + def test_list_files_failure(self, workdir, path, expected, driver): + driver.workdir = workdir + + artifact = driver.list_files(path) + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected + + def test_load_file(self, driver): + artifact = driver.load_file("resources/bitcoin.pdf") + + assert isinstance(artifact, ListArtifact) + assert len(artifact.value) == 4 + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # non-existent files or directories + ("/", "bitcoin.pdf", "Path not found"), + ("/resources", "foo.txt", "Path not found"), + ("/", "bar/", "Path is a directory"), + # existing files with trailing slash + ("/", "resources/bitcoin.pdf/", "Path is a directory"), + ("/resources", "bitcoin.pdf/", "Path is a directory"), + # directories (not files) + ("/", "", "Path is a directory"), + ("/", "/", "Path is a directory"), + ("/", "resources", "Path is a directory"), + ("/", "resources/", "Path is a directory"), + ("/resources", "", "Path is a directory"), + ("/resources", "/", "Path is a directory"), + ], + ) + def test_load_file_failure(self, workdir, path, expected, driver): + driver.workdir = workdir + + artifact = driver.load_file(path) + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected + + def test_load_file_with_encoding(self, driver): + artifact = driver.load_file("resources/test.txt") + + assert isinstance(artifact, ListArtifact) + assert len(artifact.value) == 1 + assert isinstance(artifact.value[0], TextArtifact) + + def test_load_file_with_encoding_failure(self, session, bucket): + driver = AmazonS3FileManagerDriver( + session=session, bucket=bucket, default_loader=TextLoader(encoding="utf-8"), loaders={} + ) + + artifact = driver.load_file("resources/bitcoin.pdf") + + assert isinstance(artifact, ErrorArtifact) + + @pytest.mark.parametrize( + "workdir,path,content", + [ + # non-existent files + ("/", "resources/foo.txt", "one"), + ("/resources", "foo.txt", "two"), + # existing files + ("/", "foo.txt", "three"), + ("/resources", "test.txt", "four"), + ("/", "resources/test.txt", "five"), + # binary content + ("/", "bone.fooz", b"bone"), + ], + ) + def test_save_file(self, workdir, path, content, driver, get_s3_value): + driver.workdir = workdir + + result = driver.save_file(path, content) + + assert isinstance(result, InfoArtifact) + assert result.value == "Successfully saved file" + expected_s3_key = os.path.join(workdir, path).lstrip("/") + content_str = content if isinstance(content, str) else content.decode() + assert get_s3_value(expected_s3_key) == content_str + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # non-existent directories + ("/", "bar/", "Path is a directory"), + ("/", "/bar/", "Path is a directory"), + # # existing directories + ("/", "", "Path is a directory"), + ("/", "/", "Path is a directory"), + ("/", "resources", "Path is a directory"), + ("/", "resources/", "Path is a directory"), + ("/resources", "", "Path is a directory"), + ("/resources", "/", "Path is a directory"), + # existing files with trailing slash + ("/", "resources/bitcoin.pdf/", "Path is a directory"), + ("/resources", "bitcoin.pdf/", "Path is a directory"), + ], + ) + def test_save_file_failure(self, workdir, path, expected, temp_dir, driver, s3_client, bucket): + driver.workdir = workdir + + artifact = driver.save_file(path, "foobar") + + # loop over the files in the bucket and print them + response = s3_client.list_objects_v2(Bucket=bucket) + for obj in response.get("Contents", []): + print(obj.get("Key")) + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected + + def test_save_file_with_encoding(self, session, bucket, get_s3_value): + workdir = "/sub-folder" + driver = AmazonS3FileManagerDriver( + session=session, bucket=bucket, default_loader=TextLoader(encoding="utf-8"), loaders={}, workdir=workdir + ) + path = os.path.join("test", "foobar.txt") + + result = driver.save_file(path, "foobar") + + expected_s3_key = os.path.join(workdir, path).lstrip("/") + assert get_s3_value(expected_s3_key) == "foobar" + assert result.value == "Successfully saved file" + + def test_save_and_load_file_with_encoding(self, session, bucket, get_s3_value): + workdir = "/sub-folder" + driver = AmazonS3FileManagerDriver( + session=session, bucket=bucket, loaders={"txt": TextLoader(encoding="ascii")}, workdir=workdir + ) + path = os.path.join("test", "foobar.txt") + + result = driver.save_file(path, "foobar") + + expected_s3_key = os.path.join(workdir, path).lstrip("/") + assert get_s3_value(expected_s3_key) == "foobar" + assert result.value == "Successfully saved file" + + driver = AmazonS3FileManagerDriver( + session=session, bucket=bucket, default_loader=TextLoader(encoding="ascii"), loaders={}, workdir=workdir + ) + path = os.path.join("test", "foobar.txt") + + result = driver.load_file(path) + + assert isinstance(result, ListArtifact) + assert len(result.value) == 1 + assert isinstance(result.value[0], TextArtifact) diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index 43ef250cf..236281739 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -2,32 +2,129 @@ from pathlib import Path import tempfile import pytest -from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact +from griptape.artifacts import ErrorArtifact, ListArtifact, InfoArtifact, TextArtifact from griptape.drivers import LocalFileManagerDriver from griptape.loaders.text_loader import TextLoader class TestLocalFileManagerDriver: - @pytest.fixture - def driver(self): - tests_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) - return LocalFileManagerDriver(workdir=tests_dir) - @pytest.fixture def temp_dir(self): with tempfile.TemporaryDirectory() as temp_dir: + + def write_file(path: str, content: bytes): + full_path = os.path.join(temp_dir, path) + os.makedirs(os.path.dirname(full_path), exist_ok=True) + with open(full_path, "wb") as f: + f.write(content) + + def mkdir(path: str): + full_path = os.path.join(temp_dir, path) + os.makedirs(full_path, exist_ok=True) + + def copy_test_resources(resource_path: str): + file_dir = os.path.dirname(__file__) + full_path = os.path.join(file_dir, "../../../resources", resource_path) + full_path = os.path.normpath(full_path) + with open(full_path, "rb") as source: + content = source.read() + dest_path = os.path.join(temp_dir, "resources", resource_path) + write_file(dest_path, content) + + # Add some files + write_file("foo.txt", b"foo") + write_file("foo/bar.txt", b"bar") + write_file("foo/bar/baz.txt", b"baz") + copy_test_resources("bitcoin.pdf") + copy_test_resources("small.png") + copy_test_resources("test.txt") + + # Add some empty directories + mkdir("foo-empty") + mkdir("foo/bar-empty") + mkdir("foo/bar/baz-empty") + yield temp_dir + @pytest.fixture + def driver(self, temp_dir): + return LocalFileManagerDriver(workdir=temp_dir) + def test_validate_workdir(self): with pytest.raises(ValueError): LocalFileManagerDriver(workdir="foo") - def test_list_files(self, driver: LocalFileManagerDriver): - artifact = driver.list_files("resources") + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # Valid non-empty directories (witout trailing slash) + ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar", ["baz.txt", "baz-empty"]), + ("/", "resources", ["bitcoin.pdf", "small.png", "test.txt"]), + ("/foo", "", ["bar", "bar.txt", "bar-empty"]), + ("/foo", "bar", ["baz.txt", "baz-empty"]), + ("/foo/bar", "", ["baz.txt", "baz-empty"]), + ("/resources", "", ["bitcoin.pdf", "small.png", "test.txt"]), + # Valid non-empty directories (with trailing slash) + ("/", "/", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar/", ["baz.txt", "baz-empty"]), + ("/foo", "/", ["bar", "bar.txt", "bar-empty"]), + ("/foo", "bar/", ["baz.txt", "baz-empty"]), + ("/foo/bar", "/", ["baz.txt", "baz-empty"]), + # relative paths + ("/", ".", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/", "foo/.", ["bar", "bar.txt", "bar-empty"]), + ("/", "foo/bar/.", ["baz.txt", "baz-empty"]), + ("/./..", ".", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "foo/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), + ("/./..", "foo/.", ["bar", "bar.txt", "bar-empty"]), + ("/./..", "foo/bar/.", ["baz.txt", "baz-empty"]), + # Empty folders (witout trailing slash) + ("/", "foo-empty", []), + ("/", "foo/bar-empty", []), + ("/", "foo/bar/baz-empty", []), + # Empty folders (with trailing slash) + ("/", "foo-empty/", []), + ("/", "foo/bar-empty/", []), + ("/", "foo/bar/baz-empty/", []), + ], + ) + def test_list_files(self, workdir, path, expected, temp_dir, driver): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + + artifact = driver.list_files(path) assert isinstance(artifact, TextArtifact) - assert "bitcoin.pdf" in artifact.value - assert "small.png" in artifact.value + assert set(filter(None, artifact.value.split("\n"))) == set(expected) + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # non-existent paths + ("/", "bar", "Path not found"), + ("/", "bar/", "Path not found"), + ("/", "bitcoin.pdf", "Path not found"), + # # paths to files (not directories) + ("/", "foo.txt", "Path is not a directory"), + ("/", "/foo.txt", "Path is not a directory"), + ("/resources", "bitcoin.pdf", "Path is not a directory"), + ("/resources", "/bitcoin.pdf", "Path is not a directory"), + ], + ) + def test_list_files_failure(self, workdir, path, expected, temp_dir, driver): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + + artifact = driver.list_files(path) + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected def test_load_file(self, driver: LocalFileManagerDriver): artifact = driver.load_file("resources/bitcoin.pdf") @@ -35,6 +132,34 @@ def test_load_file(self, driver: LocalFileManagerDriver): assert isinstance(artifact, ListArtifact) assert len(artifact.value) == 4 + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # # non-existent files or directories + ("/", "bitcoin.pdf", "Path not found"), + ("/resources", "foo.txt", "Path not found"), + ("/", "bar/", "Path is a directory"), + # existing files with trailing slash + ("/", "resources/bitcoin.pdf/", "Path is a directory"), + ("/resources", "bitcoin.pdf/", "Path is a directory"), + # directories (not files) + ("/", "", "Path is a directory"), + ("/", "/", "Path is a directory"), + ("/", "resources", "Path is a directory"), + ("/", "resources/", "Path is a directory"), + ("/resources", "", "Path is a directory"), + ("/resources", "/", "Path is a directory"), + ], + ) + def test_load_file_failure(self, workdir, path, expected, temp_dir, driver): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + + artifact = driver.load_file(path) + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected + def test_load_file_with_encoding(self, driver: LocalFileManagerDriver): artifact = driver.load_file("resources/test.txt") @@ -51,12 +176,57 @@ def test_load_file_with_encoding_failure(self): assert isinstance(artifact, ErrorArtifact) - def test_save_file(self, temp_dir): - driver = LocalFileManagerDriver(workdir=temp_dir) - result = driver.save_file(os.path.join("test", "foobar.txt"), "foobar") + @pytest.mark.parametrize( + "workdir,path,content", + [ + # non-existent files + ("/", "resources/foo.txt", "one"), + ("/resources", "foo.txt", "two"), + # existing files + ("/", "foo.txt", "three"), + ("/resources", "test.txt", "four"), + ("/", "resources/test.txt", "five"), + # binary content + ("/", "bone.fooz", b"bone"), + ], + ) + def test_save_file(self, workdir, path, content, temp_dir, driver): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) - assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" + result = driver.save_file(path, content) + + assert isinstance(result, InfoArtifact) assert result.value == "Successfully saved file" + content_bytes = content if isinstance(content, str) else content.decode() + assert Path(driver.workdir, path).read_text() == content_bytes + + @pytest.mark.parametrize( + "workdir,path,expected", + [ + # non-existent directories + ("/", "bar/", "Path is a directory"), + ("/", "/bar/", "Path is a directory"), + # existing directories + ("/", "", "Path is a directory"), + ("/", "/", "Path is a directory"), + ("/", "resources", "Path is a directory"), + ("/", "resources/", "Path is a directory"), + ("/resources", "", "Path is a directory"), + ("/resources", "/", "Path is a directory"), + # existing files with trailing slash + ("/", "resources/bitcoin.pdf/", "Path is a directory"), + ("/resources", "bitcoin.pdf/", "Path is a directory"), + ], + ) + def test_save_file_failure(self, workdir, path, expected, temp_dir, driver): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + + artifact = driver.save_file(path, "foobar") + + assert isinstance(artifact, ErrorArtifact) + assert artifact.value == expected def test_save_file_with_encoding(self, temp_dir): driver = LocalFileManagerDriver(default_loader=TextLoader(encoding="utf-8"), loaders={}, workdir=temp_dir) From 54ef8fb5aaea24b003b030f763a43a70497614da Mon Sep 17 00:00:00 2001 From: Andrew French Date: Fri, 12 Apr 2024 14:13:24 -0700 Subject: [PATCH 018/238] Add MediaArtifact (#520) --- CHANGELOG.md | 2 + griptape/artifacts/__init__.py | 2 + griptape/artifacts/image_artifact.py | 46 ++++------------ griptape/artifacts/media_artifact.py | 53 +++++++++++++++++++ .../amazon_bedrock_image_generation_driver.py | 8 +-- .../leonardo_image_generation_driver.py | 4 +- .../openai_image_generation_driver.py | 2 +- griptape/loaders/image_loader.py | 4 +- tests/mocks/mock_image_generation_task.py | 2 +- tests/unit/artifacts/test_base_artifact.py | 4 +- .../artifacts/test_base_media_artifact.py | 31 +++++++++++ tests/unit/artifacts/test_image_artifact.py | 11 ++-- ...table_diffusion_image_generation_driver.py | 5 +- .../test_dummy_image_generation_driver.py | 12 ++--- ...ock_stable_diffusion_image_model_driver.py | 4 +- .../test_bedrock_titan_image_model_driver.py | 4 +- .../test_amazon_bedrock_image_query_driver.py | 6 ++- .../test_anthropic_image_query_driver.py | 12 +++-- .../test_dummy_image_query_driver.py | 2 +- .../test_openai_image_query_driver.py | 6 +-- ...bedrock_claude_image_query_model_driver.py | 2 +- .../test_image_artifact_file_output_mixin.py | 4 +- tests/unit/tasks/test_image_query_task.py | 2 +- .../test_inpainting_image_generation_task.py | 2 +- .../test_outpainting_image_generation_task.py | 2 +- .../test_variation_image_generation_task.py | 2 +- ...test_inpainting_image_generation_client.py | 6 +-- ...test_outpainting_image_variation_client.py | 6 +-- .../test_prompt_image_generation_client.py | 4 +- .../test_variation_image_generation_client.py | 6 +-- .../utils/test_load_artifact_from_memory.py | 2 +- 31 files changed, 164 insertions(+), 94 deletions(-) create mode 100644 griptape/artifacts/media_artifact.py create mode 100644 tests/unit/artifacts/test_base_media_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index cd1606b63..0d5d047f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `input_task_input` and `input_task_output` fields to `StartStructureRunEvent`. - `output_task_input` and `output_task_output` fields to `FinishStructureRunEvent`. - `AmazonS3FileManagerDriver` for managing files on Amazon S3. +- `MediaArtifact` as a base class for `ImageArtifact` and future media Artifacts. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. @@ -33,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Replaced `EventListener.handler` with `EventListener.driver` and `LocalEventListenerDriver`. - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. +- **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. ## [0.24.2] - 2024-04-04 diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index 3290bcb6a..f97580db1 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -5,6 +5,7 @@ from .blob_artifact import BlobArtifact from .csv_row_artifact import CsvRowArtifact from .list_artifact import ListArtifact +from .media_artifact import MediaArtifact from .image_artifact import ImageArtifact @@ -17,4 +18,5 @@ "CsvRowArtifact", "ListArtifact", "ImageArtifact", + "MediaArtifact", ] diff --git a/griptape/artifacts/image_artifact.py b/griptape/artifacts/image_artifact.py index 0d8a977b4..068cf6d00 100644 --- a/griptape/artifacts/image_artifact.py +++ b/griptape/artifacts/image_artifact.py @@ -1,47 +1,23 @@ from __future__ import annotations -import base64 -import string -import time -import random -from typing import Optional -from attr import define, field, Factory -from griptape.artifacts import BlobArtifact +from attr import define, field + +from griptape.artifacts import MediaArtifact @define -class ImageArtifact(BlobArtifact): - """ImageArtifact is a type of BlobArtifact that represents an image. +class ImageArtifact(MediaArtifact): + """ImageArtifact is a type of MediaArtifact representing an image. Attributes: - value: Raw bytes representing the image. + value: Raw bytes representing media data. + media_type: The type of media, defaults to "image". + format: The format of the media, like png, jpeg, or gif. name: Artifact name, generated using creation time and a random string. - mime_type: The mime type of the image, like image/png or image/jpeg. - width: The width of the image in pixels. - height: The height of the image in pixels. - model: Optionally specify the model used to generate the image. - prompt: Optionally specify the prompt used to generate the image. + model: Optionally specify the model used to generate the media. + prompt: Optionally specify the prompt used to generate the media. """ - mime_type: str = field(kw_only=True, default="image/png", metadata={"serializable": True}) + media_type: str = "image" width: int = field(kw_only=True, metadata={"serializable": True}) height: int = field(kw_only=True, metadata={"serializable": True}) - model: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - prompt: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - name: str = field( - default=Factory(lambda self: self.make_name(), takes_self=True), kw_only=True, metadata={"serializable": True} - ) - - @property - def base64(self) -> str: - return base64.b64encode(self.value).decode("utf-8") - - def make_name(self) -> str: - entropy = "".join(random.choices(string.ascii_lowercase + string.digits, k=4)) - fmt_time = time.strftime("%y%m%d%H%M%S", time.localtime()) - extension = self.mime_type.split("/")[1].split("+")[0] - - return f"image_artifact_{fmt_time}_{entropy}.{extension}" - - def to_text(self) -> str: - return f"Image, dimensions: {self.width}x{self.height}, type: {self.mime_type}, size: {len(self.value)} bytes" diff --git a/griptape/artifacts/media_artifact.py b/griptape/artifacts/media_artifact.py new file mode 100644 index 000000000..dc78ea352 --- /dev/null +++ b/griptape/artifacts/media_artifact.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import string +import time +import random +from typing import Optional + +from attr import define, field +from griptape.artifacts import BlobArtifact +import base64 + + +@define +class MediaArtifact(BlobArtifact): + """MediaArtifact is a type of BlobArtifact that represents media (image, audio, video, etc.) + and can be extended to support a specific media type. + + Attributes: + value: Raw bytes representing media data. + media_type: The type of media, like image, audio, or video. + format: The format of the media, like png, wav, or mp4. + name: Artifact name, generated using creation time and a random string. + model: Optionally specify the model used to generate the media. + prompt: Optionally specify the prompt used to generate the media. + """ + + media_type: str = field(default="media", kw_only=True, metadata={"serializable": True}) + format: str = field(kw_only=True, metadata={"serializable": True}) + model: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + prompt: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + + def __attrs_post_init__(self): + # Generating the name string requires attributes set by child classes. + # This waits until all attributes are available before generating a name. + if self.name == self.id: + self.name = self.make_name() + + @property + def mime_type(self) -> str: + return f"{self.media_type}/{self.format}" + + @property + def base64(self) -> str: + return base64.b64encode(self.value).decode("utf-8") + + def to_text(self) -> str: + return f"Media, type: {self.mime_type}, size: {len(self.value)} bytes" + + def make_name(self) -> str: + entropy = "".join(random.choices(string.ascii_lowercase + string.digits, k=4)) + fmt_time = time.strftime("%y%m%d%H%M%S", time.localtime()) + + return f"{self.media_type}_artifact_{fmt_time}_{entropy}.{self.format}" diff --git a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py index f928a9525..e3e72d55e 100644 --- a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py +++ b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py @@ -44,7 +44,7 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ return ImageArtifact( prompt=", ".join(prompts), value=image_bytes, - mime_type="image/png", + format="png", width=self.image_width, height=self.image_height, model=self.model, @@ -62,7 +62,7 @@ def try_image_variation( return ImageArtifact( prompt=", ".join(prompts), value=image_bytes, - mime_type="image/png", + format="png", width=image.width, height=image.height, model=self.model, @@ -84,7 +84,7 @@ def try_image_inpainting( return ImageArtifact( prompt=", ".join(prompts), value=image_bytes, - mime_type="image/png", + format="png", width=image.width, height=image.height, model=self.model, @@ -106,7 +106,7 @@ def try_image_outpainting( return ImageArtifact( prompt=", ".join(prompts), value=image_bytes, - mime_type="image/png", + format="png", width=image.width, height=image.height, model=self.model, diff --git a/griptape/drivers/image_generation/leonardo_image_generation_driver.py b/griptape/drivers/image_generation/leonardo_image_generation_driver.py index 6245fef4c..c41b15d97 100644 --- a/griptape/drivers/image_generation/leonardo_image_generation_driver.py +++ b/griptape/drivers/image_generation/leonardo_image_generation_driver.py @@ -53,7 +53,7 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ return ImageArtifact( value=image_data, - mime_type="image/png", + format="png", width=self.image_width, height=self.image_height, model=self.model, @@ -75,7 +75,7 @@ def try_image_variation( return ImageArtifact( value=image_data, - mime_type="image/png", + format="png", width=self.image_width, height=self.image_height, model=self.model, diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index 200cf54bc..aaf959038 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -130,7 +130,7 @@ def _parse_image_response(self, response: ImagesResponse, prompt: str) -> ImageA return ImageArtifact( value=image_data, - mime_type="image/png", + format="png", width=image_dimensions[0], height=image_dimensions[1], model=self.model, diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index 28e272d1e..99b779210 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -45,9 +45,7 @@ def load(self, source: bytes, *args, **kwargs) -> ImageArtifact: image = Image.open(byte_stream) source = byte_stream.getvalue() - image_artifact = ImageArtifact( - source, mime_type=self._get_mime_type(image.format), width=image.width, height=image.height - ) + image_artifact = ImageArtifact(source, format=image.format.lower(), width=image.width, height=image.height) return image_artifact diff --git a/tests/mocks/mock_image_generation_task.py b/tests/mocks/mock_image_generation_task.py index 3aa2e799d..24c25dc37 100644 --- a/tests/mocks/mock_image_generation_task.py +++ b/tests/mocks/mock_image_generation_task.py @@ -17,4 +17,4 @@ def input(self, value: str): self._input = TextArtifact(value) def run(self) -> ImageArtifact: - return ImageArtifact(value=b"image data", mime_type="image/png", width=512, height=512) + return ImageArtifact(value=b"image data", format="png", width=512, height=512) diff --git a/tests/unit/artifacts/test_base_artifact.py b/tests/unit/artifacts/test_base_artifact.py index cae1adae5..a7d7acaaf 100644 --- a/tests/unit/artifacts/test_base_artifact.py +++ b/tests/unit/artifacts/test_base_artifact.py @@ -50,8 +50,8 @@ def test_image_artifact_from_dict(self): dict_value = { "type": "ImageArtifact", "value": b"aW1hZ2UgZGF0YQ==", - "mime_type": "image/png", "dir_name": "foo", + "format": "png", "width": 256, "height": 256, "model": "test-model", @@ -60,7 +60,7 @@ def test_image_artifact_from_dict(self): artifact = BaseArtifact.from_dict(dict_value) assert isinstance(artifact, ImageArtifact) - assert artifact.to_text() == "Image, dimensions: 256x256, type: image/png, size: 10 bytes" + assert artifact.to_text() == "Media, type: image/png, size: 10 bytes" assert artifact.value == b"image data" def test_unsupported_from_dict(self): diff --git a/tests/unit/artifacts/test_base_media_artifact.py b/tests/unit/artifacts/test_base_media_artifact.py new file mode 100644 index 000000000..d72a8bb02 --- /dev/null +++ b/tests/unit/artifacts/test_base_media_artifact.py @@ -0,0 +1,31 @@ +import pytest + +from attr import define + +from griptape.artifacts import MediaArtifact + + +class TestMediaArtifact: + @define + class ImaginaryMediaArtifact(MediaArtifact): + media_type: str = "imagination" + + @pytest.fixture + def media_artifact(self): + return self.ImaginaryMediaArtifact(value=b"some binary dream data", format="dream") + + def test_to_dict(self, media_artifact): + image_dict = media_artifact.to_dict() + + assert image_dict["format"] == "dream" + assert image_dict["value"] == "c29tZSBiaW5hcnkgZHJlYW0gZGF0YQ==" + + def test_name(self, media_artifact): + assert media_artifact.name.startswith("imagination_artifact") + assert media_artifact.name.endswith(".dream") + + def test_mime_type(self, media_artifact): + assert media_artifact.mime_type == "imagination/dream" + + def test_to_text(self, media_artifact): + assert media_artifact.to_text() == "Media, type: imagination/dream, size: 22 bytes" diff --git a/tests/unit/artifacts/test_image_artifact.py b/tests/unit/artifacts/test_image_artifact.py index 53385773e..687397260 100644 --- a/tests/unit/artifacts/test_image_artifact.py +++ b/tests/unit/artifacts/test_image_artifact.py @@ -7,20 +7,20 @@ class TestImageArtifact: def image_artifact(self): return ImageArtifact( value=b"some binary png image data", - mime_type="image/png", + format="png", width=512, height=512, model="openai/dalle2", prompt="a cute cat", ) - def test_to_text(self, image_artifact): - assert image_artifact.to_text() == "Image, dimensions: 512x512, type: image/png, size: 26 bytes" + def test_to_text(self, image_artifact: ImageArtifact): + assert image_artifact.to_text() == "Media, type: image/png, size: 26 bytes" - def test_to_dict(self, image_artifact): + def test_to_dict(self, image_artifact: ImageArtifact): image_dict = image_artifact.to_dict() - assert image_dict["mime_type"] == "image/png" + assert image_dict["format"] == "png" assert image_dict["width"] == 512 assert image_dict["height"] == 512 assert image_dict["model"] == "openai/dalle2" @@ -35,6 +35,7 @@ def test_deserialization(self, image_artifact): assert deserialized_artifact.value == b"some binary png image data" assert deserialized_artifact.mime_type == "image/png" + assert deserialized_artifact.format == "png" assert deserialized_artifact.width == 512 assert deserialized_artifact.height == 512 assert deserialized_artifact.model == "openai/dalle2" diff --git a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py index 2cd941337..2c911da18 100644 --- a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py @@ -37,7 +37,9 @@ def test_init(self, driver): def test_init_requires_image_generation_model_driver(self, session): with pytest.raises(TypeError): - AmazonBedrockImageGenerationDriver(session=session, model="stability.stable-diffusion-xl-v1") + AmazonBedrockImageGenerationDriver( + session=session, model="stability.stable-diffusion-xl-v1" + ) # pyright: ignore def test_try_text_to_image(self, driver): driver.bedrock_client.invoke_model.return_value = { @@ -56,6 +58,7 @@ def test_try_text_to_image(self, driver): image_artifact = driver.try_text_to_image(prompts=["test prompt"], negative_prompts=["test negative prompt"]) assert image_artifact.value == b"image data" + assert image_artifact.format == "png" assert image_artifact.mime_type == "image/png" assert image_artifact.width == 512 assert image_artifact.height == 512 diff --git a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py index add334b35..971c39b89 100644 --- a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py @@ -21,22 +21,22 @@ def test_try_image_variation(self, image_generation_driver): with pytest.raises(DummyException): image_generation_driver.try_image_variation( "prompt-stack", - ImageArtifact(value=b"", width=100, height=100), - ImageArtifact(value=b"", width=100, height=100), + ImageArtifact(value=b"", width=100, height=100, format="png"), + ImageArtifact(value=b"", width=100, height=100, format="png"), ) def test_try_image_inpainting(self, image_generation_driver): with pytest.raises(DummyException): image_generation_driver.try_image_inpainting( "prompt-stack", - ImageArtifact(value=b"", width=100, height=100), - ImageArtifact(value=b"", width=100, height=100), + ImageArtifact(value=b"", width=100, height=100, format="png"), + ImageArtifact(value=b"", width=100, height=100, format="png"), ) def test_try_image_outpainting(self, image_generation_driver): with pytest.raises(DummyException): image_generation_driver.try_image_outpainting( "prompt-stack", - ImageArtifact(value=b"", width=100, height=100), - ImageArtifact(value=b"", width=100, height=100), + ImageArtifact(value=b"", width=100, height=100, format="png"), + ImageArtifact(value=b"", width=100, height=100, format="png"), ) diff --git a/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py b/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py index 6415e4a2d..cdd4e95b7 100644 --- a/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py +++ b/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py @@ -13,11 +13,11 @@ def model_driver(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(b"image", mime_type="image/png", width=1024, height=1024) + return ImageArtifact(b"image", format="png", width=1024, height=1024) @pytest.fixture def mask_artifact(self): - return ImageArtifact(b"mask", mime_type="image/png", width=1024, height=1024) + return ImageArtifact(b"mask", format="png", width=1024, height=1024) def test_init(self, model_driver): assert model_driver diff --git a/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py b/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py index b6aded591..8c4ed40e3 100644 --- a/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py +++ b/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py @@ -11,11 +11,11 @@ def model_driver(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(b"image", mime_type="image/png", width=1024, height=512) + return ImageArtifact(b"image", format="png", width=1024, height=512) @pytest.fixture def mask_artifact(self): - return ImageArtifact(b"mask", mime_type="image/png", width=1024, height=512) + return ImageArtifact(b"mask", format="png", width=1024, height=512) def test_init(self, model_driver): assert model_driver diff --git a/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py b/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py index 7f5b44aa4..57336e8ea 100644 --- a/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py @@ -36,7 +36,7 @@ def test_try_query(self, image_query_driver): image_query_driver.bedrock_client.invoke_model.return_value = {"body": io.BytesIO(b"""{"content": []}""")} text_artifact = image_query_driver.try_query( - "Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100)] + "Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")] ) assert text_artifact.value == "content" @@ -45,4 +45,6 @@ def test_try_query_no_body(self, image_query_driver): image_query_driver.bedrock_client.invoke_model.return_value = {"body": io.BytesIO(b"")} with pytest.raises(ValueError): - image_query_driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100)]) + image_query_driver.try_query( + "Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")] + ) diff --git a/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py b/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py index ff53375b0..24958d58f 100644 --- a/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py @@ -26,7 +26,7 @@ def test_try_query(self, mock_client): test_binary_data = b"test-data" text_artifact = driver.try_query( - test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100)] + test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100, format="png")] ) expected_message = self._expected_message(test_binary_data, "image/png", test_prompt_string) @@ -43,7 +43,7 @@ def test_try_query_max_tokens_value(self, mock_client): test_binary_data = b"test-data" text_artifact = driver.try_query( - test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100)] + test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100, format="png")] ) expected_message = self._expected_message(test_binary_data, "image/png", test_prompt_string) @@ -59,16 +59,18 @@ def test_try_query_max_tokens_none(self, mock_client): test_prompt_string = "Prompt String" test_binary_data = b"test-data" with pytest.raises(TypeError): - driver.try_query(test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100)]) + driver.try_query( + test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100, format="png")] + ) def test_try_query_wrong_media_type(self, mock_client): driver = AnthropicImageQueryDriver(model="test-model") test_prompt_string = "Prompt String" test_binary_data = b"test-data" - # we expect this to pass Griptape code as the model will error approriately + # we expect this to pass Griptape code as the model will error appropriately text_artifact = driver.try_query( - test_prompt_string, [ImageArtifact(value=test_binary_data, mime_type="image/exr", width=100, height=100)] + test_prompt_string, [ImageArtifact(value=test_binary_data, width=100, height=100, format="exr")] ) expected_message = self._expected_message(test_binary_data, "image/exr", test_prompt_string) diff --git a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py index 6341717b8..8efcfa749 100644 --- a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py @@ -15,4 +15,4 @@ def test_init(self, image_query_driver): def test_try_query(self, image_query_driver): with pytest.raises(DummyException): - image_query_driver.try_query("Prompt", [ImageArtifact(value=b"", width=100, height=100)]) + image_query_driver.try_query("Prompt", [ImageArtifact(value=b"", width=100, height=100, format="png")]) diff --git a/tests/unit/drivers/image_query/test_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_openai_image_query_driver.py index f811f87cf..d6ce8550b 100644 --- a/tests/unit/drivers/image_query/test_openai_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_openai_image_query_driver.py @@ -19,7 +19,7 @@ def test_try_query_defaults(self, mock_completion_create): driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview") test_prompt_string = "Prompt String" test_binary_data = b"test-data" - test_image = ImageArtifact(value=test_binary_data, width=100, height=100) + test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") text_artifact = driver.try_query(test_prompt_string, [test_image]) messages = self._expected_messages(test_prompt_string, test_image.base64) @@ -32,7 +32,7 @@ def test_try_query_max_tokens(self, mock_completion_create): driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview", max_tokens=1024) test_prompt_string = "Prompt String" test_binary_data = b"test-data" - test_image = ImageArtifact(value=test_binary_data, width=100, height=100) + test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") driver.try_query(test_prompt_string, [test_image]) messages = self._expected_messages(test_prompt_string, test_image.base64) @@ -44,7 +44,7 @@ def test_try_query_multiple_choices(self, mock_completion_create): driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview") with pytest.raises(Exception): - driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100)]) + driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")]) def _expected_messages(self, expected_prompt_string, expected_binary_data): return { diff --git a/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py b/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py index a4c57917b..14fa8ff28 100644 --- a/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py +++ b/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py @@ -10,7 +10,7 @@ def test_init(self): def test_image_query_request_parameters(self): model_driver = BedrockClaudeImageQueryModelDriver() params = model_driver.image_query_request_parameters( - "Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100)], 256 + "Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")], 256 ) assert isinstance(params, dict) diff --git a/tests/unit/mixins/test_image_artifact_file_output_mixin.py b/tests/unit/mixins/test_image_artifact_file_output_mixin.py index b04d662bc..c0b021f5e 100644 --- a/tests/unit/mixins/test_image_artifact_file_output_mixin.py +++ b/tests/unit/mixins/test_image_artifact_file_output_mixin.py @@ -16,7 +16,7 @@ class Test(ImageArtifactFileOutputMixin): assert Test().output_dir is None def test_output_file(self): - artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, mime_type="image/png") + artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") class Test(ImageArtifactFileOutputMixin): def run(self): @@ -31,7 +31,7 @@ def run(self): assert os.path.exists(outfile) def test_output_dir(self): - artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, mime_type="image/png") + artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") class Test(ImageArtifactFileOutputMixin): def run(self): diff --git a/tests/unit/tasks/test_image_query_task.py b/tests/unit/tasks/test_image_query_task.py index 0542e37a6..1d195f835 100644 --- a/tests/unit/tasks/test_image_query_task.py +++ b/tests/unit/tasks/test_image_query_task.py @@ -15,7 +15,7 @@ def text_artifact(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(value=b"some image data", mime_type="image/png", width=512, height=512) + return ImageArtifact(value=b"some image data", format="png", width=512, height=512) def test_text_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): task = ImageQueryTask((text_artifact.value, [image_artifact, image_artifact])) diff --git a/tests/unit/tasks/test_inpainting_image_generation_task.py b/tests/unit/tasks/test_inpainting_image_generation_task.py index 5dd0abc49..1fd84f2a6 100644 --- a/tests/unit/tasks/test_inpainting_image_generation_task.py +++ b/tests/unit/tasks/test_inpainting_image_generation_task.py @@ -17,7 +17,7 @@ def text_artifact(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(value=b"some image data", mime_type="image/png", width=512, height=512) + return ImageArtifact(value=b"some image data", format="png", width=512, height=512) def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): input_tuple = (text_artifact, image_artifact, image_artifact) diff --git a/tests/unit/tasks/test_outpainting_image_generation_task.py b/tests/unit/tasks/test_outpainting_image_generation_task.py index a9704af14..f73467258 100644 --- a/tests/unit/tasks/test_outpainting_image_generation_task.py +++ b/tests/unit/tasks/test_outpainting_image_generation_task.py @@ -18,7 +18,7 @@ def text_artifact(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(value=b"some image data", mime_type="image/png", width=512, height=512) + return ImageArtifact(value=b"some image data", format="png", width=512, height=512) def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): input_tuple = (text_artifact, image_artifact, image_artifact) diff --git a/tests/unit/tasks/test_variation_image_generation_task.py b/tests/unit/tasks/test_variation_image_generation_task.py index 356a09b9e..bef2107ac 100644 --- a/tests/unit/tasks/test_variation_image_generation_task.py +++ b/tests/unit/tasks/test_variation_image_generation_task.py @@ -17,7 +17,7 @@ def text_artifact(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(value=b"some image data", mime_type="image/png", width=512, height=512) + return ImageArtifact(value=b"some image data", format="png", width=512, height=512) def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): input_tuple = (text_artifact, image_artifact) diff --git a/tests/unit/tools/test_inpainting_image_generation_client.py b/tests/unit/tools/test_inpainting_image_generation_client.py index a6322d034..9e1d017bb 100644 --- a/tests/unit/tools/test_inpainting_image_generation_client.py +++ b/tests/unit/tools/test_inpainting_image_generation_client.py @@ -17,7 +17,7 @@ def image_generation_engine(self) -> Mock: @pytest.fixture def image_loader(self) -> Mock: loader = Mock() - loader.load.return_value = ImageArtifact(value=b"image_data", mime_type="image/png", width=512, height=512) + loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader @@ -31,7 +31,7 @@ def test_validate_output_configs(self, image_generation_engine) -> None: def test_image_inpainting(self, image_generator) -> None: image_generator.engine.run.return_value = Mock( - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_inpainting_from_file( @@ -54,7 +54,7 @@ def test_image_inpainting_with_outfile(self, image_generation_engine, image_load ) image_generator.engine.run.return_value = Mock( # pyright: ignore - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_inpainting_from_file( diff --git a/tests/unit/tools/test_outpainting_image_variation_client.py b/tests/unit/tools/test_outpainting_image_variation_client.py index 9fd6b994b..1a84018a4 100644 --- a/tests/unit/tools/test_outpainting_image_variation_client.py +++ b/tests/unit/tools/test_outpainting_image_variation_client.py @@ -17,7 +17,7 @@ def image_generation_engine(self) -> Mock: @pytest.fixture def image_loader(self) -> Mock: loader = Mock() - loader.load.return_value = ImageArtifact(value=b"image_data", mime_type="image/png", width=512, height=512) + loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader @@ -31,7 +31,7 @@ def test_validate_output_configs(self, image_generation_engine) -> None: def test_image_outpainting(self, image_generator) -> None: image_generator.engine.run.return_value = Mock( - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_outpainting_from_file( @@ -54,7 +54,7 @@ def test_image_outpainting_with_outfile(self, image_generation_engine, image_loa ) image_generator.engine.run.return_value = Mock( # pyright: ignore - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_outpainting_from_file( diff --git a/tests/unit/tools/test_prompt_image_generation_client.py b/tests/unit/tools/test_prompt_image_generation_client.py index b0ab15ff0..dffbb4239 100644 --- a/tests/unit/tools/test_prompt_image_generation_client.py +++ b/tests/unit/tools/test_prompt_image_generation_client.py @@ -23,7 +23,7 @@ def test_validate_output_configs(self, image_generation_engine) -> None: def test_generate_image(self, image_generator) -> None: image_generator.engine.run.return_value = Mock( - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.generate_image( @@ -37,7 +37,7 @@ def test_generate_image_with_outfile(self, image_generation_engine) -> None: image_generator = PromptImageGenerationClient(engine=image_generation_engine, output_file=outfile) image_generator.engine.run.return_value = Mock( # pyright: ignore - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.generate_image( diff --git a/tests/unit/tools/test_variation_image_generation_client.py b/tests/unit/tools/test_variation_image_generation_client.py index aec3a5983..b29f4fecf 100644 --- a/tests/unit/tools/test_variation_image_generation_client.py +++ b/tests/unit/tools/test_variation_image_generation_client.py @@ -17,7 +17,7 @@ def image_generation_engine(self) -> Mock: @pytest.fixture def image_loader(self) -> Mock: loader = Mock() - loader.load.return_value = ImageArtifact(value=b"image_data", mime_type="image/png", width=512, height=512) + loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader @@ -33,7 +33,7 @@ def test_validate_output_configs(self, image_generation_engine, image_loader) -> def test_image_variation(self, image_generator) -> None: image_generator.engine.run.return_value = Mock( - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_variation_from_file( @@ -55,7 +55,7 @@ def test_image_variation_with_outfile(self, image_generation_engine, image_loade ) image_generator.engine.run.return_value = Mock( # pyright: ignore - value=b"image data", mime_type="image/png", width=512, height=512, model="test model", prompt="test prompt" + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) image_artifact = image_generator.image_variation_from_file( diff --git a/tests/unit/utils/test_load_artifact_from_memory.py b/tests/unit/utils/test_load_artifact_from_memory.py index 2fd63e8d4..db4f7d573 100644 --- a/tests/unit/utils/test_load_artifact_from_memory.py +++ b/tests/unit/utils/test_load_artifact_from_memory.py @@ -17,7 +17,7 @@ def text_artifact(self): @pytest.fixture def image_artifact(self): - return ImageArtifact(value=b"image", name="image", mime_type="image/png", height=32, width=32) + return ImageArtifact(value=b"image", name="image", format="png", height=32, width=32) def test_no_memory(self): with pytest.raises(ValueError): From ed08311d4b3b323db7f00933cc561dcf8205aa1c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Apr 2024 14:06:53 -0700 Subject: [PATCH 019/238] Add docs to repo (#744) --- .github/actions/init-environment/action.yml | 4 + ...n-tests.yml => docs-integration-tests.yml} | 65 +- .github/workflows/pull-request-links.yml | 20 + .gitignore | 4 + .readthedocs.yml | 13 + CHANGELOG.md | 1 + README.md | 2 +- docs/assets/css/code_select.css | 3 + docs/assets/css/extra.css | 12 + docs/assets/css/mkdocstrings.css | 44 + docs/assets/css/swagger-ui.css | 9305 +++++++++++++++++ docs/assets/css/swagger-ui.css.map | 1 + docs/assets/img/data-architecture.png | Bin 0 -> 74665 bytes .../assets/img/griptape-mark-square-light.svg | 11 + docs/assets/img/tools/output.png | Bin 0 -> 151667 bytes docs/assets/img/tools/poetry_setup.png | Bin 0 -> 173909 bytes docs/assets/img/tools/toml.png | Bin 0 -> 899349 bytes docs/assets/scripts/swagger-ui-bundle.js | 3 + docs/assets/scripts/swagger-ui-bundle.js.map | 1 + .../scripts/swagger-ui-standalone-preset.js | 3 + .../swagger-ui-standalone-preset.js.map | 1 + docs/contributing.md | 54 + docs/examples/index.md | 3 + docs/examples/load-and-query-pinecone.md | 44 + docs/examples/load-query-and-chat-marqo.md | 47 + docs/examples/multiple-agent-shared-memory.md | 80 + docs/examples/query-webpage.md | 28 + docs/examples/talk-to-a-pdf.md | 49 + docs/examples/talk-to-a-webpage.md | 62 + docs/examples/talk-to-redshift.md | 47 + docs/gen_ref_pages.py | 48 + docs/griptape-framework/data/artifacts.md | 38 + docs/griptape-framework/data/chunkers.md | 22 + docs/griptape-framework/data/index.md | 21 + docs/griptape-framework/data/loaders.md | 174 + .../drivers/embedding-drivers.md | 193 + .../drivers/image-generation-drivers.md | 174 + .../drivers/image-query-drivers.md | 124 + .../drivers/prompt-drivers.md | 598 ++ .../griptape-framework/drivers/sql-drivers.md | 75 + .../drivers/vector-store-drivers.md | 417 + .../drivers/web-scraper-drivers.md | 79 + .../engines/extraction-engines.md | 79 + .../engines/image-generation-engines.md | 165 + .../engines/image-query-engines.md | 25 + .../engines/query-engines.md | 27 + .../engines/summary-engines.md | 29 + docs/griptape-framework/index.md | 208 + docs/griptape-framework/misc/events.md | 271 + docs/griptape-framework/misc/tokenizers.md | 143 + docs/griptape-framework/structures/agents.md | 79 + docs/griptape-framework/structures/config.md | 147 + .../structures/conversation-memory.md | 161 + .../structures/pipelines.md | 47 + .../griptape-framework/structures/rulesets.md | 185 + .../structures/task-memory.md | 89 + docs/griptape-framework/structures/tasks.md | 669 ++ .../structures/workflows.md | 149 + docs/griptape-framework/tools/index.md | 62 + docs/griptape-tools/custom-tools/index.md | 79 + docs/griptape-tools/index.md | 37 + .../official-tools/aws-iam-client.md | 68 + .../official-tools/aws-s3-client.md | 65 + .../official-tools/calculator.md | 33 + .../griptape-tools/official-tools/computer.md | 107 + .../official-tools/date-time.md | 36 + .../official-tools/email-client.md | 22 + .../official-tools/file-manager.md | 48 + .../official-tools/google-cal-client.md | 37 + .../official-tools/google-docs-client.md | 63 + .../official-tools/google-drive-client.md | 60 + .../official-tools/google-gmail-client.md | 62 + .../official-tools/image-query-client.md | 29 + .../inpainting-image-generation-client.md | 32 + .../official-tools/openweather-client.md | 20 + .../outpainting-image-generation-client.md | 32 + .../prompt-image-generation-client.md | 31 + .../official-tools/rest-api-client.md | 159 + .../official-tools/sql-client.md | 71 + .../official-tools/task-memory-client.md | 11 + .../variation-image-generation-client.md | 83 + .../official-tools/vector-store-client.md | 37 + .../official-tools/web-scraper.md | 76 + .../official-tools/web-search.md | 110 + docs/index.md | 27 + docs/overrides/main.html | 9 + docs/plugins/swagger_ui_plugin.py | 35 + docs/plugins/tmpl/swagger.md.tmpl | 29 + mkdocs.yml | 153 + poetry.lock | 341 +- pyproject.toml | 14 + tests/integration/test_code_blocks.py | 22 + tests/resources/addresses.csv | 7 + tests/resources/cities.csv | 130 + tests/resources/cow.png | Bin 0 -> 3147861 bytes tests/resources/mountain-mask.png | Bin 0 -> 9161 bytes tests/resources/mountain.jpg | Bin 0 -> 82351 bytes tests/resources/mountain.png | Bin 0 -> 436989 bytes tests/utils/code_blocks.py | 80 + tests/utils/structure_tester.py | 30 +- 100 files changed, 16664 insertions(+), 26 deletions(-) rename .github/workflows/{integration-tests.yml => docs-integration-tests.yml} (57%) create mode 100644 .github/workflows/pull-request-links.yml create mode 100644 .readthedocs.yml create mode 100644 docs/assets/css/code_select.css create mode 100644 docs/assets/css/extra.css create mode 100644 docs/assets/css/mkdocstrings.css create mode 100644 docs/assets/css/swagger-ui.css create mode 100644 docs/assets/css/swagger-ui.css.map create mode 100644 docs/assets/img/data-architecture.png create mode 100644 docs/assets/img/griptape-mark-square-light.svg create mode 100644 docs/assets/img/tools/output.png create mode 100644 docs/assets/img/tools/poetry_setup.png create mode 100644 docs/assets/img/tools/toml.png create mode 100644 docs/assets/scripts/swagger-ui-bundle.js create mode 100644 docs/assets/scripts/swagger-ui-bundle.js.map create mode 100644 docs/assets/scripts/swagger-ui-standalone-preset.js create mode 100644 docs/assets/scripts/swagger-ui-standalone-preset.js.map create mode 100644 docs/contributing.md create mode 100644 docs/examples/index.md create mode 100644 docs/examples/load-and-query-pinecone.md create mode 100644 docs/examples/load-query-and-chat-marqo.md create mode 100644 docs/examples/multiple-agent-shared-memory.md create mode 100644 docs/examples/query-webpage.md create mode 100644 docs/examples/talk-to-a-pdf.md create mode 100644 docs/examples/talk-to-a-webpage.md create mode 100644 docs/examples/talk-to-redshift.md create mode 100644 docs/gen_ref_pages.py create mode 100644 docs/griptape-framework/data/artifacts.md create mode 100644 docs/griptape-framework/data/chunkers.md create mode 100644 docs/griptape-framework/data/index.md create mode 100644 docs/griptape-framework/data/loaders.md create mode 100644 docs/griptape-framework/drivers/embedding-drivers.md create mode 100644 docs/griptape-framework/drivers/image-generation-drivers.md create mode 100644 docs/griptape-framework/drivers/image-query-drivers.md create mode 100644 docs/griptape-framework/drivers/prompt-drivers.md create mode 100644 docs/griptape-framework/drivers/sql-drivers.md create mode 100644 docs/griptape-framework/drivers/vector-store-drivers.md create mode 100644 docs/griptape-framework/drivers/web-scraper-drivers.md create mode 100644 docs/griptape-framework/engines/extraction-engines.md create mode 100644 docs/griptape-framework/engines/image-generation-engines.md create mode 100644 docs/griptape-framework/engines/image-query-engines.md create mode 100644 docs/griptape-framework/engines/query-engines.md create mode 100644 docs/griptape-framework/engines/summary-engines.md create mode 100644 docs/griptape-framework/index.md create mode 100644 docs/griptape-framework/misc/events.md create mode 100644 docs/griptape-framework/misc/tokenizers.md create mode 100644 docs/griptape-framework/structures/agents.md create mode 100644 docs/griptape-framework/structures/config.md create mode 100644 docs/griptape-framework/structures/conversation-memory.md create mode 100644 docs/griptape-framework/structures/pipelines.md create mode 100644 docs/griptape-framework/structures/rulesets.md create mode 100644 docs/griptape-framework/structures/task-memory.md create mode 100644 docs/griptape-framework/structures/tasks.md create mode 100644 docs/griptape-framework/structures/workflows.md create mode 100644 docs/griptape-framework/tools/index.md create mode 100644 docs/griptape-tools/custom-tools/index.md create mode 100644 docs/griptape-tools/index.md create mode 100644 docs/griptape-tools/official-tools/aws-iam-client.md create mode 100644 docs/griptape-tools/official-tools/aws-s3-client.md create mode 100644 docs/griptape-tools/official-tools/calculator.md create mode 100644 docs/griptape-tools/official-tools/computer.md create mode 100644 docs/griptape-tools/official-tools/date-time.md create mode 100644 docs/griptape-tools/official-tools/email-client.md create mode 100644 docs/griptape-tools/official-tools/file-manager.md create mode 100644 docs/griptape-tools/official-tools/google-cal-client.md create mode 100644 docs/griptape-tools/official-tools/google-docs-client.md create mode 100644 docs/griptape-tools/official-tools/google-drive-client.md create mode 100644 docs/griptape-tools/official-tools/google-gmail-client.md create mode 100644 docs/griptape-tools/official-tools/image-query-client.md create mode 100644 docs/griptape-tools/official-tools/inpainting-image-generation-client.md create mode 100644 docs/griptape-tools/official-tools/openweather-client.md create mode 100644 docs/griptape-tools/official-tools/outpainting-image-generation-client.md create mode 100644 docs/griptape-tools/official-tools/prompt-image-generation-client.md create mode 100644 docs/griptape-tools/official-tools/rest-api-client.md create mode 100644 docs/griptape-tools/official-tools/sql-client.md create mode 100644 docs/griptape-tools/official-tools/task-memory-client.md create mode 100644 docs/griptape-tools/official-tools/variation-image-generation-client.md create mode 100644 docs/griptape-tools/official-tools/vector-store-client.md create mode 100644 docs/griptape-tools/official-tools/web-scraper.md create mode 100644 docs/griptape-tools/official-tools/web-search.md create mode 100644 docs/index.md create mode 100644 docs/overrides/main.html create mode 100644 docs/plugins/swagger_ui_plugin.py create mode 100644 docs/plugins/tmpl/swagger.md.tmpl create mode 100644 mkdocs.yml create mode 100644 tests/integration/test_code_blocks.py create mode 100644 tests/resources/addresses.csv create mode 100644 tests/resources/cities.csv create mode 100644 tests/resources/cow.png create mode 100644 tests/resources/mountain-mask.png create mode 100644 tests/resources/mountain.jpg create mode 100644 tests/resources/mountain.png create mode 100644 tests/utils/code_blocks.py diff --git a/.github/actions/init-environment/action.yml b/.github/actions/init-environment/action.yml index 761e27357..686f57e34 100644 --- a/.github/actions/init-environment/action.yml +++ b/.github/actions/init-environment/action.yml @@ -35,3 +35,7 @@ runs: source .venv/bin/activate echo PATH=$PATH >> $GITHUB_ENV shell: bash + + - name: Install playwright + run: playwright install --with-deps + shell: bash diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/docs-integration-tests.yml similarity index 57% rename from .github/workflows/integration-tests.yml rename to .github/workflows/docs-integration-tests.yml index c9939f8a9..bba8bdcdd 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -1,7 +1,13 @@ -name: Integration Tests - -on: workflow_dispatch +name: Docs Integration Tests +on: + pull_request: + types: + - opened + - reopened + branches: [ "main", "dev" ] + paths: + - "docs/**" jobs: test: runs-on: ubuntu-latest @@ -38,6 +44,15 @@ jobs: MONGODB_DATABASE_NAME: ${{ secrets.INTEG_MONGODB_DATABASE_NAME }} MONGODB_COLLECTION_NAME: ${{ secrets.INTEG_MONGODB_COLLECTION_NAME }} MONGODB_PASSWORD: ${{ secrets.INTEG_MONGODB_PASSWORD }} + MONGODB_INDEX_NAME: ${{ secrets.INTEG_MONGODB_INDEX_NAME }} + MONGODB_VECTOR_PATH: ${{ secrets.INTEG_MONGODB_VECTOR_PATH }} + AZURE_MONGODB_HOST: ${{ secrets.INTEG_AZURE_MONGODB_HOST }} + AZURE_MONGODB_USERNAME: ${{ secrets.INTEG_AZURE_MONGODB_USERNAME }} + AZURE_MONGODB_PASSWORD: ${{ secrets.INTEG_AZURE_MONGODB_PASSWORD }} + AZURE_MONGODB_DATABASE_NAME: ${{ secrets.INTEG_AZURE_MONGODB_DATABASE_NAME }} + AZURE_MONGODB_COLLECTION_NAME: ${{ secrets.INTEG_AZURE_MONGODB_COLLECTION_NAME }} + AZURE_MONGODB_INDEX_NAME: ${{ secrets.INTEG_AZURE_MONGODB_INDEX_NAME }} + AZURE_MONGODB_VECTOR_PATH: ${{ secrets.INTEG_AZURE_MONGODB_VECTOR_PATH }} AMAZON_OPENSEARCH_HOST: ${{ secrets.INTEG_AMAZON_OPENSEARCH_HOST }} AMAZON_OPENSEARCH_INDEX_NAME: ${{ secrets.INTEG_AMAZON_OPENSEARCH_INDEX_NAME }} GOOGLE_API_KEY: ${{ secrets.INTEG_GOOGLE_API_KEY }} @@ -52,19 +67,35 @@ jobs: GOOGLE_AUTH_URI: ${{ secrets.INTEG_GOOGLE_AUTH_URI }} GOOGLE_TOKEN_URI: ${{ secrets.INTEG_GOOGLE_TOKEN_URI }} GOOGLE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.INTEG_GOOGLE_AUTH_PROVIDER_X509_CERT_URL }} + OPENWEATHER_API_KEY: ${{ secrets.INTEG_OPENWEATHER_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.INTEG_ANTHROPIC_API_KEY }} SAGEMAKER_LLAMA_ENDPOINT_NAME: ${{ secrets.INTEG_LLAMA_ENDPOINT_NAME }} SAGEMAKER_FALCON_ENDPOINT_NAME: ${{ secrets.INTEG_FALCON_ENDPOINT_NAME }} - HUGGINGFACE_ACCESS_TOKEN: ${{ secrets.INTEG_HUGGINGFACE_ACCESS_TOKEN }} - AZURE_OPENAI_API_BASE_1: ${{ secrets.INTEG_AZURE_OPENAI_API_BASE_1 }} + HUGGINGFACE_HUB_ACCESS_TOKEN: ${{ secrets.INTEG_HUGGINGFACE_HUB_ACCESS_TOKEN }} + AZURE_OPENAI_ENDPOINT_1: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_1 }} AZURE_OPENAI_API_KEY_1: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_1 }} - AZURE_OPENAI_API_BASE_2: ${{ secrets.INTEG_AZURE_OPENAI_API_BASE_2 }} + AZURE_OPENAI_ENDPOINT_2: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_2 }} AZURE_OPENAI_API_KEY_2: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_2 }} - AZURE_OPENAI_35_16k_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_35_16k_DEPLOYMENT_ID }} + AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_35_TURBO_16K_DEPLOYMENT_ID }} AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_DAVINCI_DEPLOYMENT_ID }} AZURE_OPENAI_4_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_DEPLOYMENT_ID }} - AZURE_OPENAI_4_32k_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_32k_DEPLOYMENT_ID }} + AZURE_OPENAI_4_32K_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_32K_DEPLOYMENT_ID }} + AZURE_OPENAI_DALL_E_3_DEPLOYMENT_ID: ${{ secrets.INTEG_AZURE_OPENAI_DALL_E_3_DEPLOYMENT_ID }} + AZURE_OPENAI_DEV_2_API_BASE: ${{ secrets.INTEG_AZURE_OPENAI_DEV_2_API_BASE }} + AZURE_OPENAI_DEV_2_API_KEY: ${{ secrets.INTEG_AZURE_OPENAI_DEV_2_API_KEY }} + AZURE_OPENAI_API_BASE: ${{ secrets.INTEG_AZURE_OPENAI_API_BASE }} COHERE_API_KEY: ${{ secrets.INTEG_COHERE_API_KEY }} + GOOGLE_OWNER_EMAIL: ${{ secrets.INTEG_GOOGLE_OWNER_EMAIL }} + LEONARDO_API_KEY: ${{ secrets.INTEG_LEONARDO_API_KEY }} + LEONARDO_MODEL_ID: ${{ secrets.INTEG_LEONARDO_MODEL_ID }} + SAGEMAKER_TENSORFLOW_HUB_MODEL: ${{ secrets.INTEG_SAGEMAKER_TENSORFLOW_HUB_MODEL }} + SAGEMAKER_HUGGINGFACE_MODEL: ${{ secrets.INTEG_SAGEMAKER_HUGGINGFACE_MODEL }} + POSTGRES_USER: ${{ secrets.INTEG_POSTGRES_USER }} + POSTGRES_PASSWORD: ${{ secrets.INTEG_POSTGRES_PASSWORD }} + POSTGRES_DB: ${{ secrets.INTEG_POSTGRES_DB }} + POSTGRES_HOST: ${{ secrets.INTEG_POSTGRES_HOST }} + POSTGRES_PORT: ${{ secrets.INTEG_POSTGRES_PORT }} + VOYAGE_API_KEY: ${{ secrets.INTEG_VOYAGE_API_KEY }} services: postgres: image: ankane/pgvector:v0.5.0 @@ -84,5 +115,21 @@ jobs: uses: actions/checkout@v3 - name: Init environment uses: ./.github/actions/init-environment + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v44 + with: + files: | + **.md + - name: List all changed files + env: + ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} + run: | + for file in ${ALL_CHANGED_FILES}; do + echo "$file was changed" + done - name: Run integration tests - run: pytest -vs tests/integration + if: steps.changed-files.outputs.any_changed == 'true' + run: pytest -n auto tests/integration/test_code_blocks.py + env: + DOCS_ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/pull-request-links.yml b/.github/workflows/pull-request-links.yml new file mode 100644 index 000000000..0d937ac94 --- /dev/null +++ b/.github/workflows/pull-request-links.yml @@ -0,0 +1,20 @@ +name: Read the Docs Preview +on: + pull_request_target: + types: + - opened + paths: + - "docs/**" + +permissions: + pull-requests: write + +jobs: + pull-request-links: + runs-on: ubuntu-latest + steps: + - uses: readthedocs/actions/preview@v1 + with: + project-slug: ${{ secrets.READTHEDOCS_PROJECT_SLUG }} + single-version: 'false' + project-language: "" diff --git a/.gitignore b/.gitignore index f7478c108..ba63b4aca 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,7 @@ dist/** # asdf .tool-versions + +# mkdocs build output +site +reference diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 000000000..4e6ae54a4 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,13 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.11" + jobs: + post_install: + - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --with docs + +mkdocs: + configuration: mkdocs.yml + fail_on_warning: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d5d047f1..93291262f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved RAG performance in `VectorQueryEngine`. - **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. - **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. +- Moved [Griptape Docs](https://github.com/griptape-ai/griptape-docs) to this repository. ## [0.24.2] - 2024-04-04 diff --git a/README.md b/README.md index 014247ecd..66d21c82f 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ The important thing to note here is that no matter how big the webpage is it can All Tools have the `off_prompt` property enabled be default. Disabling it (`off_prompt=False`) will force the framework to return all tool outputs directly to the LLM prompt. `TaskMemoryClient` requires the user to set this property explicitly for usability reasons. In the above example, we set `off_prompt` to `True`, which means that the LLM can never see the data it manipulates, but can send it to other Tools. -[Check out our docs](https://docs.griptape.ai/latest/griptape-framework/structures/prompt-drivers/) to learn more about how to use Griptape with other LLM providers like Anthropic, Claude, Hugging Face, and Azure. +[Check out our docs](https://docs.griptape.ai/latest/griptape-framework/drivers/prompt-drivers/) to learn more about how to use Griptape with other LLM providers like Anthropic, Claude, Hugging Face, and Azure. ## Versioning diff --git a/docs/assets/css/code_select.css b/docs/assets/css/code_select.css new file mode 100644 index 000000000..5939aac1a --- /dev/null +++ b/docs/assets/css/code_select.css @@ -0,0 +1,3 @@ +.highlight .gp, .highlight .go { /* Generic.Prompt, Generic.Output */ + user-select: none; +} diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css new file mode 100644 index 000000000..17c7b4335 --- /dev/null +++ b/docs/assets/css/extra.css @@ -0,0 +1,12 @@ +.md-typeset__table { + min-width: 100%; +} + +.md-typeset table:not([class]) { + display: table; +} + +/* Hide the code block title since we're using it for other purposes.*/ +.filename { + display: none !important +} diff --git a/docs/assets/css/mkdocstrings.css b/docs/assets/css/mkdocstrings.css new file mode 100644 index 000000000..38a87d909 --- /dev/null +++ b/docs/assets/css/mkdocstrings.css @@ -0,0 +1,44 @@ +.doc-heading code { + background-color: inherit; + padding: 0; +} + +h3.doc-heading { + font-size: 1.1rem; +} + +h4.doc-heading { + font-size: 0.8rem; +} + +.doc-label-instance-attribute { + display: none; +} + +/* Indentation. */ +div.doc-contents:not(.first) { + padding-left: 25px; + border-left: 0.05rem solid var(--md-typeset-table-color); +} + +/* Mark external links as such. */ +a.external::after, +a.autorefs-external::after { + /* https://primer.style/octicons/arrow-up-right-24 */ + mask-image: url('data:image/svg+xml,'); + -webkit-mask-image: url('data:image/svg+xml,'); + content: " "; + + display: inline-block; + vertical-align: middle; + position: relative; + + height: 1em; + width: 1em; + background-color: var(--md-typeset-a-color); +} + +a.external:hover::after, +a.autorefs-external:hover::after { + background-color: var(--md-accent-fg-color); +} diff --git a/docs/assets/css/swagger-ui.css b/docs/assets/css/swagger-ui.css new file mode 100644 index 000000000..eb9dc086c --- /dev/null +++ b/docs/assets/css/swagger-ui.css @@ -0,0 +1,9305 @@ +.swagger-ui { + color: #8b8d95; + font-family: sans-serif; /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ +} +.swagger-ui html { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.15; +} +.swagger-ui body { + margin: 0; +} +.swagger-ui article, +.swagger-ui aside, +.swagger-ui footer, +.swagger-ui header, +.swagger-ui nav, +.swagger-ui section { + display: block; +} +.swagger-ui h1 { + font-size: 2em; + margin: 0.67em 0; +} +.swagger-ui figcaption, +.swagger-ui figure, +.swagger-ui main { + display: block; +} +.swagger-ui figure { + margin: 1em 40px; +} +.swagger-ui hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +.swagger-ui pre { + font-family: monospace, monospace; + font-size: 1em; +} +.swagger-ui a { + -webkit-text-decoration-skip: objects; + background-color: transparent; +} +.swagger-ui abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +.swagger-ui b, +.swagger-ui strong { + font-weight: inherit; + font-weight: bolder; +} +.swagger-ui code, +.swagger-ui kbd, +.swagger-ui samp { + font-family: monospace, monospace; + font-size: 1em; +} +.swagger-ui dfn { + font-style: italic; +} +.swagger-ui mark { + background-color: #ff0; + color: #000; +} +.swagger-ui small { + font-size: 80%; +} +.swagger-ui sub, +.swagger-ui sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +.swagger-ui sub { + bottom: -0.25em; +} +.swagger-ui sup { + top: -0.5em; +} +.swagger-ui audio, +.swagger-ui video { + display: inline-block; +} +.swagger-ui audio:not([controls]) { + display: none; + height: 0; +} +.swagger-ui img { + border-style: none; +} +.swagger-ui svg:not(:root) { + overflow: hidden; +} +.swagger-ui button, +.swagger-ui input, +.swagger-ui optgroup, +.swagger-ui select, +.swagger-ui textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} +.swagger-ui button, +.swagger-ui input { + overflow: visible; +} +.swagger-ui button, +.swagger-ui select { + text-transform: none; +} +.swagger-ui [type="reset"], +.swagger-ui [type="submit"], +.swagger-ui button, +.swagger-ui html [type="button"] { + -webkit-appearance: button; +} +.swagger-ui [type="button"]::-moz-focus-inner, +.swagger-ui [type="reset"]::-moz-focus-inner, +.swagger-ui [type="submit"]::-moz-focus-inner, +.swagger-ui button::-moz-focus-inner { + border-style: none; + padding: 0; +} +.swagger-ui [type="button"]:-moz-focusring, +.swagger-ui [type="reset"]:-moz-focusring, +.swagger-ui [type="submit"]:-moz-focusring, +.swagger-ui button:-moz-focusring { + outline: 1px dotted ButtonText; +} +.swagger-ui fieldset { + padding: 0.35em 0.75em 0.625em; +} +.swagger-ui legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +.swagger-ui progress { + display: inline-block; + vertical-align: baseline; +} +.swagger-ui textarea { + overflow: auto; +} +.swagger-ui [type="checkbox"], +.swagger-ui [type="radio"] { + box-sizing: border-box; + padding: 0; +} +.swagger-ui [type="number"]::-webkit-inner-spin-button, +.swagger-ui [type="number"]::-webkit-outer-spin-button { + height: auto; +} +.swagger-ui [type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +.swagger-ui [type="search"]::-webkit-search-cancel-button, +.swagger-ui [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +.swagger-ui ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +.swagger-ui details, +.swagger-ui menu { + display: block; +} +.swagger-ui summary { + display: list-item; +} +.swagger-ui canvas { + display: inline-block; +} +.swagger-ui [hidden], +.swagger-ui template { + display: none; +} +.swagger-ui .debug * { + outline: 1px solid gold; +} +.swagger-ui .debug-white * { + outline: 1px solid #fff; +} +.swagger-ui .debug-black * { + outline: 1px solid #000; +} +.swagger-ui .debug-grid { + background: transparent + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) + repeat 0 0; +} +.swagger-ui .debug-grid-16 { + background: transparent + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) + repeat 0 0; +} +.swagger-ui .debug-grid-8-solid { + background: #fff + url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) + repeat 0 0; +} +.swagger-ui .debug-grid-16-solid { + background: #fff + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) + repeat 0 0; +} +.swagger-ui .border-box, +.swagger-ui a, +.swagger-ui article, +.swagger-ui body, +.swagger-ui code, +.swagger-ui dd, +.swagger-ui div, +.swagger-ui dl, +.swagger-ui dt, +.swagger-ui fieldset, +.swagger-ui footer, +.swagger-ui form, +.swagger-ui h1, +.swagger-ui h2, +.swagger-ui h3, +.swagger-ui h4, +.swagger-ui h5, +.swagger-ui h6, +.swagger-ui header, +.swagger-ui html, +.swagger-ui input[type="email"], +.swagger-ui input[type="number"], +.swagger-ui input[type="password"], +.swagger-ui input[type="tel"], +.swagger-ui input[type="text"], +.swagger-ui input[type="url"], +.swagger-ui legend, +.swagger-ui li, +.swagger-ui main, +.swagger-ui ol, +.swagger-ui p, +.swagger-ui pre, +.swagger-ui section, +.swagger-ui table, +.swagger-ui td, +.swagger-ui textarea, +.swagger-ui th, +.swagger-ui tr, +.swagger-ui ul { + box-sizing: border-box; +} +.swagger-ui .aspect-ratio { + height: 0; + position: relative; +} +.swagger-ui .aspect-ratio--16x9 { + padding-bottom: 56.25%; +} +.swagger-ui .aspect-ratio--9x16 { + padding-bottom: 177.77%; +} +.swagger-ui .aspect-ratio--4x3 { + padding-bottom: 75%; +} +.swagger-ui .aspect-ratio--3x4 { + padding-bottom: 133.33%; +} +.swagger-ui .aspect-ratio--6x4 { + padding-bottom: 66.6%; +} +.swagger-ui .aspect-ratio--4x6 { + padding-bottom: 150%; +} +.swagger-ui .aspect-ratio--8x5 { + padding-bottom: 62.5%; +} +.swagger-ui .aspect-ratio--5x8 { + padding-bottom: 160%; +} +.swagger-ui .aspect-ratio--7x5 { + padding-bottom: 71.42%; +} +.swagger-ui .aspect-ratio--5x7 { + padding-bottom: 140%; +} +.swagger-ui .aspect-ratio--1x1 { + padding-bottom: 100%; +} +.swagger-ui .aspect-ratio--object { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100; +} +@media screen and (min-width: 30em) { + .swagger-ui .aspect-ratio-ns { + height: 0; + position: relative; + } + .swagger-ui .aspect-ratio--16x9-ns { + padding-bottom: 56.25%; + } + .swagger-ui .aspect-ratio--9x16-ns { + padding-bottom: 177.77%; + } + .swagger-ui .aspect-ratio--4x3-ns { + padding-bottom: 75%; + } + .swagger-ui .aspect-ratio--3x4-ns { + padding-bottom: 133.33%; + } + .swagger-ui .aspect-ratio--6x4-ns { + padding-bottom: 66.6%; + } + .swagger-ui .aspect-ratio--4x6-ns { + padding-bottom: 150%; + } + .swagger-ui .aspect-ratio--8x5-ns { + padding-bottom: 62.5%; + } + .swagger-ui .aspect-ratio--5x8-ns { + padding-bottom: 160%; + } + .swagger-ui .aspect-ratio--7x5-ns { + padding-bottom: 71.42%; + } + .swagger-ui .aspect-ratio--5x7-ns { + padding-bottom: 140%; + } + .swagger-ui .aspect-ratio--1x1-ns { + padding-bottom: 100%; + } + .swagger-ui .aspect-ratio--object-ns { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .aspect-ratio-m { + height: 0; + position: relative; + } + .swagger-ui .aspect-ratio--16x9-m { + padding-bottom: 56.25%; + } + .swagger-ui .aspect-ratio--9x16-m { + padding-bottom: 177.77%; + } + .swagger-ui .aspect-ratio--4x3-m { + padding-bottom: 75%; + } + .swagger-ui .aspect-ratio--3x4-m { + padding-bottom: 133.33%; + } + .swagger-ui .aspect-ratio--6x4-m { + padding-bottom: 66.6%; + } + .swagger-ui .aspect-ratio--4x6-m { + padding-bottom: 150%; + } + .swagger-ui .aspect-ratio--8x5-m { + padding-bottom: 62.5%; + } + .swagger-ui .aspect-ratio--5x8-m { + padding-bottom: 160%; + } + .swagger-ui .aspect-ratio--7x5-m { + padding-bottom: 71.42%; + } + .swagger-ui .aspect-ratio--5x7-m { + padding-bottom: 140%; + } + .swagger-ui .aspect-ratio--1x1-m { + padding-bottom: 100%; + } + .swagger-ui .aspect-ratio--object-m { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .aspect-ratio-l { + height: 0; + position: relative; + } + .swagger-ui .aspect-ratio--16x9-l { + padding-bottom: 56.25%; + } + .swagger-ui .aspect-ratio--9x16-l { + padding-bottom: 177.77%; + } + .swagger-ui .aspect-ratio--4x3-l { + padding-bottom: 75%; + } + .swagger-ui .aspect-ratio--3x4-l { + padding-bottom: 133.33%; + } + .swagger-ui .aspect-ratio--6x4-l { + padding-bottom: 66.6%; + } + .swagger-ui .aspect-ratio--4x6-l { + padding-bottom: 150%; + } + .swagger-ui .aspect-ratio--8x5-l { + padding-bottom: 62.5%; + } + .swagger-ui .aspect-ratio--5x8-l { + padding-bottom: 160%; + } + .swagger-ui .aspect-ratio--7x5-l { + padding-bottom: 71.42%; + } + .swagger-ui .aspect-ratio--5x7-l { + padding-bottom: 140%; + } + .swagger-ui .aspect-ratio--1x1-l { + padding-bottom: 100%; + } + .swagger-ui .aspect-ratio--object-l { + bottom: 0; + height: 100%; + left: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + z-index: 100; + } +} +.swagger-ui img { + max-width: 100%; +} +.swagger-ui .cover { + background-size: cover !important; +} +.swagger-ui .contain { + background-size: contain !important; +} +@media screen and (min-width: 30em) { + .swagger-ui .cover-ns { + background-size: cover !important; + } + .swagger-ui .contain-ns { + background-size: contain !important; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .cover-m { + background-size: cover !important; + } + .swagger-ui .contain-m { + background-size: contain !important; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .cover-l { + background-size: cover !important; + } + .swagger-ui .contain-l { + background-size: contain !important; + } +} +.swagger-ui .bg-center { + background-position: 50%; + background-repeat: no-repeat; +} +.swagger-ui .bg-top { + background-position: top; + background-repeat: no-repeat; +} +.swagger-ui .bg-right { + background-position: 100%; + background-repeat: no-repeat; +} +.swagger-ui .bg-bottom { + background-position: bottom; + background-repeat: no-repeat; +} +.swagger-ui .bg-left { + background-position: 0; + background-repeat: no-repeat; +} +@media screen and (min-width: 30em) { + .swagger-ui .bg-center-ns { + background-position: 50%; + background-repeat: no-repeat; + } + .swagger-ui .bg-top-ns { + background-position: top; + background-repeat: no-repeat; + } + .swagger-ui .bg-right-ns { + background-position: 100%; + background-repeat: no-repeat; + } + .swagger-ui .bg-bottom-ns { + background-position: bottom; + background-repeat: no-repeat; + } + .swagger-ui .bg-left-ns { + background-position: 0; + background-repeat: no-repeat; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .bg-center-m { + background-position: 50%; + background-repeat: no-repeat; + } + .swagger-ui .bg-top-m { + background-position: top; + background-repeat: no-repeat; + } + .swagger-ui .bg-right-m { + background-position: 100%; + background-repeat: no-repeat; + } + .swagger-ui .bg-bottom-m { + background-position: bottom; + background-repeat: no-repeat; + } + .swagger-ui .bg-left-m { + background-position: 0; + background-repeat: no-repeat; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .bg-center-l { + background-position: 50%; + background-repeat: no-repeat; + } + .swagger-ui .bg-top-l { + background-position: top; + background-repeat: no-repeat; + } + .swagger-ui .bg-right-l { + background-position: 100%; + background-repeat: no-repeat; + } + .swagger-ui .bg-bottom-l { + background-position: bottom; + background-repeat: no-repeat; + } + .swagger-ui .bg-left-l { + background-position: 0; + background-repeat: no-repeat; + } +} +.swagger-ui .outline { + outline: 1px solid; +} +.swagger-ui .outline-transparent { + outline: 1px solid transparent; +} +.swagger-ui .outline-0 { + outline: 0; +} +@media screen and (min-width: 30em) { + .swagger-ui .outline-ns { + outline: 1px solid; + } + .swagger-ui .outline-transparent-ns { + outline: 1px solid transparent; + } + .swagger-ui .outline-0-ns { + outline: 0; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .outline-m { + outline: 1px solid; + } + .swagger-ui .outline-transparent-m { + outline: 1px solid transparent; + } + .swagger-ui .outline-0-m { + outline: 0; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .outline-l { + outline: 1px solid; + } + .swagger-ui .outline-transparent-l { + outline: 1px solid transparent; + } + .swagger-ui .outline-0-l { + outline: 0; + } +} +.swagger-ui .ba { + border-style: solid; + border-width: 1px; +} +.swagger-ui .bt { + border-top-style: solid; + border-top-width: 1px; +} +.swagger-ui .br { + border-right-style: solid; + border-right-width: 1px; +} +.swagger-ui .bb { + border-bottom-style: solid; + border-bottom-width: 1px; +} +.swagger-ui .bl { + border-left-style: solid; + border-left-width: 1px; +} +.swagger-ui .bn { + border-style: none; + border-width: 0; +} +@media screen and (min-width: 30em) { + .swagger-ui .ba-ns { + border-style: solid; + border-width: 1px; + } + .swagger-ui .bt-ns { + border-top-style: solid; + border-top-width: 1px; + } + .swagger-ui .br-ns { + border-right-style: solid; + border-right-width: 1px; + } + .swagger-ui .bb-ns { + border-bottom-style: solid; + border-bottom-width: 1px; + } + .swagger-ui .bl-ns { + border-left-style: solid; + border-left-width: 1px; + } + .swagger-ui .bn-ns { + border-style: none; + border-width: 0; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .ba-m { + border-style: solid; + border-width: 1px; + } + .swagger-ui .bt-m { + border-top-style: solid; + border-top-width: 1px; + } + .swagger-ui .br-m { + border-right-style: solid; + border-right-width: 1px; + } + .swagger-ui .bb-m { + border-bottom-style: solid; + border-bottom-width: 1px; + } + .swagger-ui .bl-m { + border-left-style: solid; + border-left-width: 1px; + } + .swagger-ui .bn-m { + border-style: none; + border-width: 0; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .ba-l { + border-style: solid; + border-width: 1px; + } + .swagger-ui .bt-l { + border-top-style: solid; + border-top-width: 1px; + } + .swagger-ui .br-l { + border-right-style: solid; + border-right-width: 1px; + } + .swagger-ui .bb-l { + border-bottom-style: solid; + border-bottom-width: 1px; + } + .swagger-ui .bl-l { + border-left-style: solid; + border-left-width: 1px; + } + .swagger-ui .bn-l { + border-style: none; + border-width: 0; + } +} +.swagger-ui .b--black { + border-color: #000; +} +.swagger-ui .b--near-black { + border-color: #111; +} +.swagger-ui .b--dark-gray { + border-color: #333; +} +.swagger-ui .b--mid-gray { + border-color: #555; +} +.swagger-ui .b--gray { + border-color: #777; +} +.swagger-ui .b--silver { + border-color: #999; +} +.swagger-ui .b--light-silver { + border-color: #aaa; +} +.swagger-ui .b--moon-gray { + border-color: #ccc; +} +.swagger-ui .b--light-gray { + border-color: #eee; +} +.swagger-ui .b--near-white { + border-color: #f4f4f4; +} +.swagger-ui .b--white { + border-color: #fff; +} +.swagger-ui .b--white-90 { + border-color: hsla(0, 0%, 100%, 0.9); +} +.swagger-ui .b--white-80 { + border-color: hsla(0, 0%, 100%, 0.8); +} +.swagger-ui .b--white-70 { + border-color: hsla(0, 0%, 100%, 0.7); +} +.swagger-ui .b--white-60 { + border-color: hsla(0, 0%, 100%, 0.6); +} +.swagger-ui .b--white-50 { + border-color: hsla(0, 0%, 100%, 0.5); +} +.swagger-ui .b--white-40 { + border-color: hsla(0, 0%, 100%, 0.4); +} +.swagger-ui .b--white-30 { + border-color: hsla(0, 0%, 100%, 0.3); +} +.swagger-ui .b--white-20 { + border-color: hsla(0, 0%, 100%, 0.2); +} +.swagger-ui .b--white-10 { + border-color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .b--white-05 { + border-color: hsla(0, 0%, 100%, 0.05); +} +.swagger-ui .b--white-025 { + border-color: hsla(0, 0%, 100%, 0.025); +} +.swagger-ui .b--white-0125 { + border-color: hsla(0, 0%, 100%, 0.013); +} +.swagger-ui .b--black-90 { + border-color: rgba(0, 0, 0, 0.9); +} +.swagger-ui .b--black-80 { + border-color: rgba(0, 0, 0, 0.8); +} +.swagger-ui .b--black-70 { + border-color: rgba(0, 0, 0, 0.7); +} +.swagger-ui .b--black-60 { + border-color: rgba(0, 0, 0, 0.6); +} +.swagger-ui .b--black-50 { + border-color: rgba(0, 0, 0, 0.5); +} +.swagger-ui .b--black-40 { + border-color: rgba(0, 0, 0, 0.4); +} +.swagger-ui .b--black-30 { + border-color: rgba(0, 0, 0, 0.3); +} +.swagger-ui .b--black-20 { + border-color: rgba(0, 0, 0, 0.2); +} +.swagger-ui .b--black-10 { + border-color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .b--black-05 { + border-color: rgba(0, 0, 0, 0.05); +} +.swagger-ui .b--black-025 { + border-color: rgba(0, 0, 0, 0.025); +} +.swagger-ui .b--black-0125 { + border-color: rgba(0, 0, 0, 0.013); +} +.swagger-ui .b--dark-red { + border-color: #e7040f; +} +.swagger-ui .b--red { + border-color: #ff4136; +} +.swagger-ui .b--light-red { + border-color: #ff725c; +} +.swagger-ui .b--orange { + border-color: #ff6300; +} +.swagger-ui .b--gold { + border-color: #ffb700; +} +.swagger-ui .b--yellow { + border-color: gold; +} +.swagger-ui .b--light-yellow { + border-color: #fbf1a9; +} +.swagger-ui .b--purple { + border-color: #5e2ca5; +} +.swagger-ui .b--light-purple { + border-color: #a463f2; +} +.swagger-ui .b--dark-pink { + border-color: #d5008f; +} +.swagger-ui .b--hot-pink { + border-color: #ff41b4; +} +.swagger-ui .b--pink { + border-color: #ff80cc; +} +.swagger-ui .b--light-pink { + border-color: #ffa3d7; +} +.swagger-ui .b--dark-green { + border-color: #137752; +} +.swagger-ui .b--green { + border-color: #19a974; +} +.swagger-ui .b--light-green { + border-color: #9eebcf; +} +.swagger-ui .b--navy { + border-color: #001b44; +} +.swagger-ui .b--dark-blue { + border-color: #00449e; +} +.swagger-ui .b--blue { + border-color: #357edd; +} +.swagger-ui .b--light-blue { + border-color: #96ccff; +} +.swagger-ui .b--lightest-blue { + border-color: #cdecff; +} +.swagger-ui .b--washed-blue { + border-color: #f6fffe; +} +.swagger-ui .b--washed-green { + border-color: #e8fdf5; +} +.swagger-ui .b--washed-yellow { + border-color: #fffceb; +} +.swagger-ui .b--washed-red { + border-color: #ffdfdf; +} +.swagger-ui .b--transparent { + border-color: transparent; +} +.swagger-ui .b--inherit { + border-color: inherit; +} +.swagger-ui .br0 { + border-radius: 0; +} +.swagger-ui .br1 { + border-radius: 0.125rem; +} +.swagger-ui .br2 { + border-radius: 0.25rem; +} +.swagger-ui .br3 { + border-radius: 0.5rem; +} +.swagger-ui .br4 { + border-radius: 1rem; +} +.swagger-ui .br-100 { + border-radius: 100%; +} +.swagger-ui .br-pill { + border-radius: 9999px; +} +.swagger-ui .br--bottom { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.swagger-ui .br--top { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.swagger-ui .br--right { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.swagger-ui .br--left { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +@media screen and (min-width: 30em) { + .swagger-ui .br0-ns { + border-radius: 0; + } + .swagger-ui .br1-ns { + border-radius: 0.125rem; + } + .swagger-ui .br2-ns { + border-radius: 0.25rem; + } + .swagger-ui .br3-ns { + border-radius: 0.5rem; + } + .swagger-ui .br4-ns { + border-radius: 1rem; + } + .swagger-ui .br-100-ns { + border-radius: 100%; + } + .swagger-ui .br-pill-ns { + border-radius: 9999px; + } + .swagger-ui .br--bottom-ns { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .swagger-ui .br--top-ns { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + .swagger-ui .br--right-ns { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .swagger-ui .br--left-ns { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .br0-m { + border-radius: 0; + } + .swagger-ui .br1-m { + border-radius: 0.125rem; + } + .swagger-ui .br2-m { + border-radius: 0.25rem; + } + .swagger-ui .br3-m { + border-radius: 0.5rem; + } + .swagger-ui .br4-m { + border-radius: 1rem; + } + .swagger-ui .br-100-m { + border-radius: 100%; + } + .swagger-ui .br-pill-m { + border-radius: 9999px; + } + .swagger-ui .br--bottom-m { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .swagger-ui .br--top-m { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + .swagger-ui .br--right-m { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .swagger-ui .br--left-m { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .br0-l { + border-radius: 0; + } + .swagger-ui .br1-l { + border-radius: 0.125rem; + } + .swagger-ui .br2-l { + border-radius: 0.25rem; + } + .swagger-ui .br3-l { + border-radius: 0.5rem; + } + .swagger-ui .br4-l { + border-radius: 1rem; + } + .swagger-ui .br-100-l { + border-radius: 100%; + } + .swagger-ui .br-pill-l { + border-radius: 9999px; + } + .swagger-ui .br--bottom-l { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .swagger-ui .br--top-l { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + .swagger-ui .br--right-l { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .swagger-ui .br--left-l { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } +} +.swagger-ui .b--dotted { + border-style: dotted; +} +.swagger-ui .b--dashed { + border-style: dashed; +} +.swagger-ui .b--solid { + border-style: solid; +} +.swagger-ui .b--none { + border-style: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .b--dotted-ns { + border-style: dotted; + } + .swagger-ui .b--dashed-ns { + border-style: dashed; + } + .swagger-ui .b--solid-ns { + border-style: solid; + } + .swagger-ui .b--none-ns { + border-style: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .b--dotted-m { + border-style: dotted; + } + .swagger-ui .b--dashed-m { + border-style: dashed; + } + .swagger-ui .b--solid-m { + border-style: solid; + } + .swagger-ui .b--none-m { + border-style: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .b--dotted-l { + border-style: dotted; + } + .swagger-ui .b--dashed-l { + border-style: dashed; + } + .swagger-ui .b--solid-l { + border-style: solid; + } + .swagger-ui .b--none-l { + border-style: none; + } +} +.swagger-ui .bw0 { + border-width: 0; +} +.swagger-ui .bw1 { + border-width: 0.125rem; +} +.swagger-ui .bw2 { + border-width: 0.25rem; +} +.swagger-ui .bw3 { + border-width: 0.5rem; +} +.swagger-ui .bw4 { + border-width: 1rem; +} +.swagger-ui .bw5 { + border-width: 2rem; +} +.swagger-ui .bt-0 { + border-top-width: 0; +} +.swagger-ui .br-0 { + border-right-width: 0; +} +.swagger-ui .bb-0 { + border-bottom-width: 0; +} +.swagger-ui .bl-0 { + border-left-width: 0; +} +@media screen and (min-width: 30em) { + .swagger-ui .bw0-ns { + border-width: 0; + } + .swagger-ui .bw1-ns { + border-width: 0.125rem; + } + .swagger-ui .bw2-ns { + border-width: 0.25rem; + } + .swagger-ui .bw3-ns { + border-width: 0.5rem; + } + .swagger-ui .bw4-ns { + border-width: 1rem; + } + .swagger-ui .bw5-ns { + border-width: 2rem; + } + .swagger-ui .bt-0-ns { + border-top-width: 0; + } + .swagger-ui .br-0-ns { + border-right-width: 0; + } + .swagger-ui .bb-0-ns { + border-bottom-width: 0; + } + .swagger-ui .bl-0-ns { + border-left-width: 0; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .bw0-m { + border-width: 0; + } + .swagger-ui .bw1-m { + border-width: 0.125rem; + } + .swagger-ui .bw2-m { + border-width: 0.25rem; + } + .swagger-ui .bw3-m { + border-width: 0.5rem; + } + .swagger-ui .bw4-m { + border-width: 1rem; + } + .swagger-ui .bw5-m { + border-width: 2rem; + } + .swagger-ui .bt-0-m { + border-top-width: 0; + } + .swagger-ui .br-0-m { + border-right-width: 0; + } + .swagger-ui .bb-0-m { + border-bottom-width: 0; + } + .swagger-ui .bl-0-m { + border-left-width: 0; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .bw0-l { + border-width: 0; + } + .swagger-ui .bw1-l { + border-width: 0.125rem; + } + .swagger-ui .bw2-l { + border-width: 0.25rem; + } + .swagger-ui .bw3-l { + border-width: 0.5rem; + } + .swagger-ui .bw4-l { + border-width: 1rem; + } + .swagger-ui .bw5-l { + border-width: 2rem; + } + .swagger-ui .bt-0-l { + border-top-width: 0; + } + .swagger-ui .br-0-l { + border-right-width: 0; + } + .swagger-ui .bb-0-l { + border-bottom-width: 0; + } + .swagger-ui .bl-0-l { + border-left-width: 0; + } +} +.swagger-ui .shadow-1 { + box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); +} +.swagger-ui .shadow-2 { + box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); +} +.swagger-ui .shadow-3 { + box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); +} +.swagger-ui .shadow-4 { + box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); +} +.swagger-ui .shadow-5 { + box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); +} +@media screen and (min-width: 30em) { + .swagger-ui .shadow-1-ns { + box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-2-ns { + box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-3-ns { + box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-4-ns { + box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-5-ns { + box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .shadow-1-m { + box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-2-m { + box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-3-m { + box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-4-m { + box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-5-m { + box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); + } +} +@media screen and (min-width: 60em) { + .swagger-ui .shadow-1-l { + box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-2-l { + box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-3-l { + box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-4-l { + box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); + } + .swagger-ui .shadow-5-l { + box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); + } +} +.swagger-ui .pre { + overflow-x: auto; + overflow-y: hidden; + overflow: scroll; +} +.swagger-ui .top-0 { + top: 0; +} +.swagger-ui .right-0 { + right: 0; +} +.swagger-ui .bottom-0 { + bottom: 0; +} +.swagger-ui .left-0 { + left: 0; +} +.swagger-ui .top-1 { + top: 1rem; +} +.swagger-ui .right-1 { + right: 1rem; +} +.swagger-ui .bottom-1 { + bottom: 1rem; +} +.swagger-ui .left-1 { + left: 1rem; +} +.swagger-ui .top-2 { + top: 2rem; +} +.swagger-ui .right-2 { + right: 2rem; +} +.swagger-ui .bottom-2 { + bottom: 2rem; +} +.swagger-ui .left-2 { + left: 2rem; +} +.swagger-ui .top--1 { + top: -1rem; +} +.swagger-ui .right--1 { + right: -1rem; +} +.swagger-ui .bottom--1 { + bottom: -1rem; +} +.swagger-ui .left--1 { + left: -1rem; +} +.swagger-ui .top--2 { + top: -2rem; +} +.swagger-ui .right--2 { + right: -2rem; +} +.swagger-ui .bottom--2 { + bottom: -2rem; +} +.swagger-ui .left--2 { + left: -2rem; +} +.swagger-ui .absolute--fill { + bottom: 0; + left: 0; + right: 0; + top: 0; +} +@media screen and (min-width: 30em) { + .swagger-ui .top-0-ns { + top: 0; + } + .swagger-ui .left-0-ns { + left: 0; + } + .swagger-ui .right-0-ns { + right: 0; + } + .swagger-ui .bottom-0-ns { + bottom: 0; + } + .swagger-ui .top-1-ns { + top: 1rem; + } + .swagger-ui .left-1-ns { + left: 1rem; + } + .swagger-ui .right-1-ns { + right: 1rem; + } + .swagger-ui .bottom-1-ns { + bottom: 1rem; + } + .swagger-ui .top-2-ns { + top: 2rem; + } + .swagger-ui .left-2-ns { + left: 2rem; + } + .swagger-ui .right-2-ns { + right: 2rem; + } + .swagger-ui .bottom-2-ns { + bottom: 2rem; + } + .swagger-ui .top--1-ns { + top: -1rem; + } + .swagger-ui .right--1-ns { + right: -1rem; + } + .swagger-ui .bottom--1-ns { + bottom: -1rem; + } + .swagger-ui .left--1-ns { + left: -1rem; + } + .swagger-ui .top--2-ns { + top: -2rem; + } + .swagger-ui .right--2-ns { + right: -2rem; + } + .swagger-ui .bottom--2-ns { + bottom: -2rem; + } + .swagger-ui .left--2-ns { + left: -2rem; + } + .swagger-ui .absolute--fill-ns { + bottom: 0; + left: 0; + right: 0; + top: 0; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .top-0-m { + top: 0; + } + .swagger-ui .left-0-m { + left: 0; + } + .swagger-ui .right-0-m { + right: 0; + } + .swagger-ui .bottom-0-m { + bottom: 0; + } + .swagger-ui .top-1-m { + top: 1rem; + } + .swagger-ui .left-1-m { + left: 1rem; + } + .swagger-ui .right-1-m { + right: 1rem; + } + .swagger-ui .bottom-1-m { + bottom: 1rem; + } + .swagger-ui .top-2-m { + top: 2rem; + } + .swagger-ui .left-2-m { + left: 2rem; + } + .swagger-ui .right-2-m { + right: 2rem; + } + .swagger-ui .bottom-2-m { + bottom: 2rem; + } + .swagger-ui .top--1-m { + top: -1rem; + } + .swagger-ui .right--1-m { + right: -1rem; + } + .swagger-ui .bottom--1-m { + bottom: -1rem; + } + .swagger-ui .left--1-m { + left: -1rem; + } + .swagger-ui .top--2-m { + top: -2rem; + } + .swagger-ui .right--2-m { + right: -2rem; + } + .swagger-ui .bottom--2-m { + bottom: -2rem; + } + .swagger-ui .left--2-m { + left: -2rem; + } + .swagger-ui .absolute--fill-m { + bottom: 0; + left: 0; + right: 0; + top: 0; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .top-0-l { + top: 0; + } + .swagger-ui .left-0-l { + left: 0; + } + .swagger-ui .right-0-l { + right: 0; + } + .swagger-ui .bottom-0-l { + bottom: 0; + } + .swagger-ui .top-1-l { + top: 1rem; + } + .swagger-ui .left-1-l { + left: 1rem; + } + .swagger-ui .right-1-l { + right: 1rem; + } + .swagger-ui .bottom-1-l { + bottom: 1rem; + } + .swagger-ui .top-2-l { + top: 2rem; + } + .swagger-ui .left-2-l { + left: 2rem; + } + .swagger-ui .right-2-l { + right: 2rem; + } + .swagger-ui .bottom-2-l { + bottom: 2rem; + } + .swagger-ui .top--1-l { + top: -1rem; + } + .swagger-ui .right--1-l { + right: -1rem; + } + .swagger-ui .bottom--1-l { + bottom: -1rem; + } + .swagger-ui .left--1-l { + left: -1rem; + } + .swagger-ui .top--2-l { + top: -2rem; + } + .swagger-ui .right--2-l { + right: -2rem; + } + .swagger-ui .bottom--2-l { + bottom: -2rem; + } + .swagger-ui .left--2-l { + left: -2rem; + } + .swagger-ui .absolute--fill-l { + bottom: 0; + left: 0; + right: 0; + top: 0; + } +} +.swagger-ui .cf:after, +.swagger-ui .cf:before { + content: " "; + display: table; +} +.swagger-ui .cf:after { + clear: both; +} +.swagger-ui .cf { + zoom: 1; +} +.swagger-ui .cl { + clear: left; +} +.swagger-ui .cr { + clear: right; +} +.swagger-ui .cb { + clear: both; +} +.swagger-ui .cn { + clear: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .cl-ns { + clear: left; + } + .swagger-ui .cr-ns { + clear: right; + } + .swagger-ui .cb-ns { + clear: both; + } + .swagger-ui .cn-ns { + clear: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .cl-m { + clear: left; + } + .swagger-ui .cr-m { + clear: right; + } + .swagger-ui .cb-m { + clear: both; + } + .swagger-ui .cn-m { + clear: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .cl-l { + clear: left; + } + .swagger-ui .cr-l { + clear: right; + } + .swagger-ui .cb-l { + clear: both; + } + .swagger-ui .cn-l { + clear: none; + } +} +.swagger-ui .flex { + display: flex; +} +.swagger-ui .inline-flex { + display: inline-flex; +} +.swagger-ui .flex-auto { + flex: 1 1 auto; + min-height: 0; + min-width: 0; +} +.swagger-ui .flex-none { + flex: none; +} +.swagger-ui .flex-column { + flex-direction: column; +} +.swagger-ui .flex-row { + flex-direction: row; +} +.swagger-ui .flex-wrap { + flex-wrap: wrap; +} +.swagger-ui .flex-nowrap { + flex-wrap: nowrap; +} +.swagger-ui .flex-wrap-reverse { + flex-wrap: wrap-reverse; +} +.swagger-ui .flex-column-reverse { + flex-direction: column-reverse; +} +.swagger-ui .flex-row-reverse { + flex-direction: row-reverse; +} +.swagger-ui .items-start { + align-items: flex-start; +} +.swagger-ui .items-end { + align-items: flex-end; +} +.swagger-ui .items-center { + align-items: center; +} +.swagger-ui .items-baseline { + align-items: baseline; +} +.swagger-ui .items-stretch { + align-items: stretch; +} +.swagger-ui .self-start { + align-self: flex-start; +} +.swagger-ui .self-end { + align-self: flex-end; +} +.swagger-ui .self-center { + align-self: center; +} +.swagger-ui .self-baseline { + align-self: baseline; +} +.swagger-ui .self-stretch { + align-self: stretch; +} +.swagger-ui .justify-start { + justify-content: flex-start; +} +.swagger-ui .justify-end { + justify-content: flex-end; +} +.swagger-ui .justify-center { + justify-content: center; +} +.swagger-ui .justify-between { + justify-content: space-between; +} +.swagger-ui .justify-around { + justify-content: space-around; +} +.swagger-ui .content-start { + align-content: flex-start; +} +.swagger-ui .content-end { + align-content: flex-end; +} +.swagger-ui .content-center { + align-content: center; +} +.swagger-ui .content-between { + align-content: space-between; +} +.swagger-ui .content-around { + align-content: space-around; +} +.swagger-ui .content-stretch { + align-content: stretch; +} +.swagger-ui .order-0 { + order: 0; +} +.swagger-ui .order-1 { + order: 1; +} +.swagger-ui .order-2 { + order: 2; +} +.swagger-ui .order-3 { + order: 3; +} +.swagger-ui .order-4 { + order: 4; +} +.swagger-ui .order-5 { + order: 5; +} +.swagger-ui .order-6 { + order: 6; +} +.swagger-ui .order-7 { + order: 7; +} +.swagger-ui .order-8 { + order: 8; +} +.swagger-ui .order-last { + order: 99999; +} +.swagger-ui .flex-grow-0 { + flex-grow: 0; +} +.swagger-ui .flex-grow-1 { + flex-grow: 1; +} +.swagger-ui .flex-shrink-0 { + flex-shrink: 0; +} +.swagger-ui .flex-shrink-1 { + flex-shrink: 1; +} +@media screen and (min-width: 30em) { + .swagger-ui .flex-ns { + display: flex; + } + .swagger-ui .inline-flex-ns { + display: inline-flex; + } + .swagger-ui .flex-auto-ns { + flex: 1 1 auto; + min-height: 0; + min-width: 0; + } + .swagger-ui .flex-none-ns { + flex: none; + } + .swagger-ui .flex-column-ns { + flex-direction: column; + } + .swagger-ui .flex-row-ns { + flex-direction: row; + } + .swagger-ui .flex-wrap-ns { + flex-wrap: wrap; + } + .swagger-ui .flex-nowrap-ns { + flex-wrap: nowrap; + } + .swagger-ui .flex-wrap-reverse-ns { + flex-wrap: wrap-reverse; + } + .swagger-ui .flex-column-reverse-ns { + flex-direction: column-reverse; + } + .swagger-ui .flex-row-reverse-ns { + flex-direction: row-reverse; + } + .swagger-ui .items-start-ns { + align-items: flex-start; + } + .swagger-ui .items-end-ns { + align-items: flex-end; + } + .swagger-ui .items-center-ns { + align-items: center; + } + .swagger-ui .items-baseline-ns { + align-items: baseline; + } + .swagger-ui .items-stretch-ns { + align-items: stretch; + } + .swagger-ui .self-start-ns { + align-self: flex-start; + } + .swagger-ui .self-end-ns { + align-self: flex-end; + } + .swagger-ui .self-center-ns { + align-self: center; + } + .swagger-ui .self-baseline-ns { + align-self: baseline; + } + .swagger-ui .self-stretch-ns { + align-self: stretch; + } + .swagger-ui .justify-start-ns { + justify-content: flex-start; + } + .swagger-ui .justify-end-ns { + justify-content: flex-end; + } + .swagger-ui .justify-center-ns { + justify-content: center; + } + .swagger-ui .justify-between-ns { + justify-content: space-between; + } + .swagger-ui .justify-around-ns { + justify-content: space-around; + } + .swagger-ui .content-start-ns { + align-content: flex-start; + } + .swagger-ui .content-end-ns { + align-content: flex-end; + } + .swagger-ui .content-center-ns { + align-content: center; + } + .swagger-ui .content-between-ns { + align-content: space-between; + } + .swagger-ui .content-around-ns { + align-content: space-around; + } + .swagger-ui .content-stretch-ns { + align-content: stretch; + } + .swagger-ui .order-0-ns { + order: 0; + } + .swagger-ui .order-1-ns { + order: 1; + } + .swagger-ui .order-2-ns { + order: 2; + } + .swagger-ui .order-3-ns { + order: 3; + } + .swagger-ui .order-4-ns { + order: 4; + } + .swagger-ui .order-5-ns { + order: 5; + } + .swagger-ui .order-6-ns { + order: 6; + } + .swagger-ui .order-7-ns { + order: 7; + } + .swagger-ui .order-8-ns { + order: 8; + } + .swagger-ui .order-last-ns { + order: 99999; + } + .swagger-ui .flex-grow-0-ns { + flex-grow: 0; + } + .swagger-ui .flex-grow-1-ns { + flex-grow: 1; + } + .swagger-ui .flex-shrink-0-ns { + flex-shrink: 0; + } + .swagger-ui .flex-shrink-1-ns { + flex-shrink: 1; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .flex-m { + display: flex; + } + .swagger-ui .inline-flex-m { + display: inline-flex; + } + .swagger-ui .flex-auto-m { + flex: 1 1 auto; + min-height: 0; + min-width: 0; + } + .swagger-ui .flex-none-m { + flex: none; + } + .swagger-ui .flex-column-m { + flex-direction: column; + } + .swagger-ui .flex-row-m { + flex-direction: row; + } + .swagger-ui .flex-wrap-m { + flex-wrap: wrap; + } + .swagger-ui .flex-nowrap-m { + flex-wrap: nowrap; + } + .swagger-ui .flex-wrap-reverse-m { + flex-wrap: wrap-reverse; + } + .swagger-ui .flex-column-reverse-m { + flex-direction: column-reverse; + } + .swagger-ui .flex-row-reverse-m { + flex-direction: row-reverse; + } + .swagger-ui .items-start-m { + align-items: flex-start; + } + .swagger-ui .items-end-m { + align-items: flex-end; + } + .swagger-ui .items-center-m { + align-items: center; + } + .swagger-ui .items-baseline-m { + align-items: baseline; + } + .swagger-ui .items-stretch-m { + align-items: stretch; + } + .swagger-ui .self-start-m { + align-self: flex-start; + } + .swagger-ui .self-end-m { + align-self: flex-end; + } + .swagger-ui .self-center-m { + align-self: center; + } + .swagger-ui .self-baseline-m { + align-self: baseline; + } + .swagger-ui .self-stretch-m { + align-self: stretch; + } + .swagger-ui .justify-start-m { + justify-content: flex-start; + } + .swagger-ui .justify-end-m { + justify-content: flex-end; + } + .swagger-ui .justify-center-m { + justify-content: center; + } + .swagger-ui .justify-between-m { + justify-content: space-between; + } + .swagger-ui .justify-around-m { + justify-content: space-around; + } + .swagger-ui .content-start-m { + align-content: flex-start; + } + .swagger-ui .content-end-m { + align-content: flex-end; + } + .swagger-ui .content-center-m { + align-content: center; + } + .swagger-ui .content-between-m { + align-content: space-between; + } + .swagger-ui .content-around-m { + align-content: space-around; + } + .swagger-ui .content-stretch-m { + align-content: stretch; + } + .swagger-ui .order-0-m { + order: 0; + } + .swagger-ui .order-1-m { + order: 1; + } + .swagger-ui .order-2-m { + order: 2; + } + .swagger-ui .order-3-m { + order: 3; + } + .swagger-ui .order-4-m { + order: 4; + } + .swagger-ui .order-5-m { + order: 5; + } + .swagger-ui .order-6-m { + order: 6; + } + .swagger-ui .order-7-m { + order: 7; + } + .swagger-ui .order-8-m { + order: 8; + } + .swagger-ui .order-last-m { + order: 99999; + } + .swagger-ui .flex-grow-0-m { + flex-grow: 0; + } + .swagger-ui .flex-grow-1-m { + flex-grow: 1; + } + .swagger-ui .flex-shrink-0-m { + flex-shrink: 0; + } + .swagger-ui .flex-shrink-1-m { + flex-shrink: 1; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .flex-l { + display: flex; + } + .swagger-ui .inline-flex-l { + display: inline-flex; + } + .swagger-ui .flex-auto-l { + flex: 1 1 auto; + min-height: 0; + min-width: 0; + } + .swagger-ui .flex-none-l { + flex: none; + } + .swagger-ui .flex-column-l { + flex-direction: column; + } + .swagger-ui .flex-row-l { + flex-direction: row; + } + .swagger-ui .flex-wrap-l { + flex-wrap: wrap; + } + .swagger-ui .flex-nowrap-l { + flex-wrap: nowrap; + } + .swagger-ui .flex-wrap-reverse-l { + flex-wrap: wrap-reverse; + } + .swagger-ui .flex-column-reverse-l { + flex-direction: column-reverse; + } + .swagger-ui .flex-row-reverse-l { + flex-direction: row-reverse; + } + .swagger-ui .items-start-l { + align-items: flex-start; + } + .swagger-ui .items-end-l { + align-items: flex-end; + } + .swagger-ui .items-center-l { + align-items: center; + } + .swagger-ui .items-baseline-l { + align-items: baseline; + } + .swagger-ui .items-stretch-l { + align-items: stretch; + } + .swagger-ui .self-start-l { + align-self: flex-start; + } + .swagger-ui .self-end-l { + align-self: flex-end; + } + .swagger-ui .self-center-l { + align-self: center; + } + .swagger-ui .self-baseline-l { + align-self: baseline; + } + .swagger-ui .self-stretch-l { + align-self: stretch; + } + .swagger-ui .justify-start-l { + justify-content: flex-start; + } + .swagger-ui .justify-end-l { + justify-content: flex-end; + } + .swagger-ui .justify-center-l { + justify-content: center; + } + .swagger-ui .justify-between-l { + justify-content: space-between; + } + .swagger-ui .justify-around-l { + justify-content: space-around; + } + .swagger-ui .content-start-l { + align-content: flex-start; + } + .swagger-ui .content-end-l { + align-content: flex-end; + } + .swagger-ui .content-center-l { + align-content: center; + } + .swagger-ui .content-between-l { + align-content: space-between; + } + .swagger-ui .content-around-l { + align-content: space-around; + } + .swagger-ui .content-stretch-l { + align-content: stretch; + } + .swagger-ui .order-0-l { + order: 0; + } + .swagger-ui .order-1-l { + order: 1; + } + .swagger-ui .order-2-l { + order: 2; + } + .swagger-ui .order-3-l { + order: 3; + } + .swagger-ui .order-4-l { + order: 4; + } + .swagger-ui .order-5-l { + order: 5; + } + .swagger-ui .order-6-l { + order: 6; + } + .swagger-ui .order-7-l { + order: 7; + } + .swagger-ui .order-8-l { + order: 8; + } + .swagger-ui .order-last-l { + order: 99999; + } + .swagger-ui .flex-grow-0-l { + flex-grow: 0; + } + .swagger-ui .flex-grow-1-l { + flex-grow: 1; + } + .swagger-ui .flex-shrink-0-l { + flex-shrink: 0; + } + .swagger-ui .flex-shrink-1-l { + flex-shrink: 1; + } +} +.swagger-ui .dn { + display: none; +} +.swagger-ui .di { + display: inline; +} +.swagger-ui .db { + display: block; +} +.swagger-ui .dib { + display: inline-block; +} +.swagger-ui .dit { + display: inline-table; +} +.swagger-ui .dt { + display: table; +} +.swagger-ui .dtc { + display: table-cell; +} +.swagger-ui .dt-row { + display: table-row; +} +.swagger-ui .dt-row-group { + display: table-row-group; +} +.swagger-ui .dt-column { + display: table-column; +} +.swagger-ui .dt-column-group { + display: table-column-group; +} +.swagger-ui .dt--fixed { + table-layout: fixed; + width: 100%; +} +@media screen and (min-width: 30em) { + .swagger-ui .dn-ns { + display: none; + } + .swagger-ui .di-ns { + display: inline; + } + .swagger-ui .db-ns { + display: block; + } + .swagger-ui .dib-ns { + display: inline-block; + } + .swagger-ui .dit-ns { + display: inline-table; + } + .swagger-ui .dt-ns { + display: table; + } + .swagger-ui .dtc-ns { + display: table-cell; + } + .swagger-ui .dt-row-ns { + display: table-row; + } + .swagger-ui .dt-row-group-ns { + display: table-row-group; + } + .swagger-ui .dt-column-ns { + display: table-column; + } + .swagger-ui .dt-column-group-ns { + display: table-column-group; + } + .swagger-ui .dt--fixed-ns { + table-layout: fixed; + width: 100%; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .dn-m { + display: none; + } + .swagger-ui .di-m { + display: inline; + } + .swagger-ui .db-m { + display: block; + } + .swagger-ui .dib-m { + display: inline-block; + } + .swagger-ui .dit-m { + display: inline-table; + } + .swagger-ui .dt-m { + display: table; + } + .swagger-ui .dtc-m { + display: table-cell; + } + .swagger-ui .dt-row-m { + display: table-row; + } + .swagger-ui .dt-row-group-m { + display: table-row-group; + } + .swagger-ui .dt-column-m { + display: table-column; + } + .swagger-ui .dt-column-group-m { + display: table-column-group; + } + .swagger-ui .dt--fixed-m { + table-layout: fixed; + width: 100%; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .dn-l { + display: none; + } + .swagger-ui .di-l { + display: inline; + } + .swagger-ui .db-l { + display: block; + } + .swagger-ui .dib-l { + display: inline-block; + } + .swagger-ui .dit-l { + display: inline-table; + } + .swagger-ui .dt-l { + display: table; + } + .swagger-ui .dtc-l { + display: table-cell; + } + .swagger-ui .dt-row-l { + display: table-row; + } + .swagger-ui .dt-row-group-l { + display: table-row-group; + } + .swagger-ui .dt-column-l { + display: table-column; + } + .swagger-ui .dt-column-group-l { + display: table-column-group; + } + .swagger-ui .dt--fixed-l { + table-layout: fixed; + width: 100%; + } +} +.swagger-ui .fl { + _display: inline; + float: left; +} +.swagger-ui .fr { + _display: inline; + float: right; +} +.swagger-ui .fn { + float: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .fl-ns { + _display: inline; + float: left; + } + .swagger-ui .fr-ns { + _display: inline; + float: right; + } + .swagger-ui .fn-ns { + float: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .fl-m { + _display: inline; + float: left; + } + .swagger-ui .fr-m { + _display: inline; + float: right; + } + .swagger-ui .fn-m { + float: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .fl-l { + _display: inline; + float: left; + } + .swagger-ui .fr-l { + _display: inline; + float: right; + } + .swagger-ui .fn-l { + float: none; + } +} +.swagger-ui .sans-serif { + font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, helvetica, + helvetica neue, ubuntu, roboto, noto, segoe ui, arial, sans-serif; +} +.swagger-ui .serif { + font-family: georgia, serif; +} +.swagger-ui .system-sans-serif { + font-family: sans-serif; +} +.swagger-ui .system-serif { + font-family: serif; +} +.swagger-ui .code, +.swagger-ui code { + font-family: Consolas, monaco, monospace; +} +.swagger-ui .courier { + font-family: Courier Next, courier, monospace; +} +.swagger-ui .helvetica { + font-family: helvetica neue, helvetica, sans-serif; +} +.swagger-ui .avenir { + font-family: avenir next, avenir, sans-serif; +} +.swagger-ui .athelas { + font-family: athelas, georgia, serif; +} +.swagger-ui .georgia { + font-family: georgia, serif; +} +.swagger-ui .times { + font-family: times, serif; +} +.swagger-ui .bodoni { + font-family: Bodoni MT, serif; +} +.swagger-ui .calisto { + font-family: Calisto MT, serif; +} +.swagger-ui .garamond { + font-family: garamond, serif; +} +.swagger-ui .baskerville { + font-family: baskerville, serif; +} +.swagger-ui .i { + font-style: italic; +} +.swagger-ui .fs-normal { + font-style: normal; +} +@media screen and (min-width: 30em) { + .swagger-ui .i-ns { + font-style: italic; + } + .swagger-ui .fs-normal-ns { + font-style: normal; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .i-m { + font-style: italic; + } + .swagger-ui .fs-normal-m { + font-style: normal; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .i-l { + font-style: italic; + } + .swagger-ui .fs-normal-l { + font-style: normal; + } +} +.swagger-ui .normal { + font-weight: 400; +} +.swagger-ui .b { + font-weight: 700; +} +.swagger-ui .fw1 { + font-weight: 100; +} +.swagger-ui .fw2 { + font-weight: 200; +} +.swagger-ui .fw3 { + font-weight: 300; +} +.swagger-ui .fw4 { + font-weight: 400; +} +.swagger-ui .fw5 { + font-weight: 500; +} +.swagger-ui .fw6 { + font-weight: 600; +} +.swagger-ui .fw7 { + font-weight: 700; +} +.swagger-ui .fw8 { + font-weight: 800; +} +.swagger-ui .fw9 { + font-weight: 900; +} +@media screen and (min-width: 30em) { + .swagger-ui .normal-ns { + font-weight: 400; + } + .swagger-ui .b-ns { + font-weight: 700; + } + .swagger-ui .fw1-ns { + font-weight: 100; + } + .swagger-ui .fw2-ns { + font-weight: 200; + } + .swagger-ui .fw3-ns { + font-weight: 300; + } + .swagger-ui .fw4-ns { + font-weight: 400; + } + .swagger-ui .fw5-ns { + font-weight: 500; + } + .swagger-ui .fw6-ns { + font-weight: 600; + } + .swagger-ui .fw7-ns { + font-weight: 700; + } + .swagger-ui .fw8-ns { + font-weight: 800; + } + .swagger-ui .fw9-ns { + font-weight: 900; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .normal-m { + font-weight: 400; + } + .swagger-ui .b-m { + font-weight: 700; + } + .swagger-ui .fw1-m { + font-weight: 100; + } + .swagger-ui .fw2-m { + font-weight: 200; + } + .swagger-ui .fw3-m { + font-weight: 300; + } + .swagger-ui .fw4-m { + font-weight: 400; + } + .swagger-ui .fw5-m { + font-weight: 500; + } + .swagger-ui .fw6-m { + font-weight: 600; + } + .swagger-ui .fw7-m { + font-weight: 700; + } + .swagger-ui .fw8-m { + font-weight: 800; + } + .swagger-ui .fw9-m { + font-weight: 900; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .normal-l { + font-weight: 400; + } + .swagger-ui .b-l { + font-weight: 700; + } + .swagger-ui .fw1-l { + font-weight: 100; + } + .swagger-ui .fw2-l { + font-weight: 200; + } + .swagger-ui .fw3-l { + font-weight: 300; + } + .swagger-ui .fw4-l { + font-weight: 400; + } + .swagger-ui .fw5-l { + font-weight: 500; + } + .swagger-ui .fw6-l { + font-weight: 600; + } + .swagger-ui .fw7-l { + font-weight: 700; + } + .swagger-ui .fw8-l { + font-weight: 800; + } + .swagger-ui .fw9-l { + font-weight: 900; + } +} +.swagger-ui .input-reset { + -webkit-appearance: none; + -moz-appearance: none; +} +.swagger-ui .button-reset::-moz-focus-inner, +.swagger-ui .input-reset::-moz-focus-inner { + border: 0; + padding: 0; +} +.swagger-ui .h1 { + height: 1rem; +} +.swagger-ui .h2 { + height: 2rem; +} +.swagger-ui .h3 { + height: 4rem; +} +.swagger-ui .h4 { + height: 8rem; +} +.swagger-ui .h5 { + height: 16rem; +} +.swagger-ui .h-25 { + height: 25%; +} +.swagger-ui .h-50 { + height: 50%; +} +.swagger-ui .h-75 { + height: 75%; +} +.swagger-ui .h-100 { + height: 100%; +} +.swagger-ui .min-h-100 { + min-height: 100%; +} +.swagger-ui .vh-25 { + height: 25vh; +} +.swagger-ui .vh-50 { + height: 50vh; +} +.swagger-ui .vh-75 { + height: 75vh; +} +.swagger-ui .vh-100 { + height: 100vh; +} +.swagger-ui .min-vh-100 { + min-height: 100vh; +} +.swagger-ui .h-auto { + height: auto; +} +.swagger-ui .h-inherit { + height: inherit; +} +@media screen and (min-width: 30em) { + .swagger-ui .h1-ns { + height: 1rem; + } + .swagger-ui .h2-ns { + height: 2rem; + } + .swagger-ui .h3-ns { + height: 4rem; + } + .swagger-ui .h4-ns { + height: 8rem; + } + .swagger-ui .h5-ns { + height: 16rem; + } + .swagger-ui .h-25-ns { + height: 25%; + } + .swagger-ui .h-50-ns { + height: 50%; + } + .swagger-ui .h-75-ns { + height: 75%; + } + .swagger-ui .h-100-ns { + height: 100%; + } + .swagger-ui .min-h-100-ns { + min-height: 100%; + } + .swagger-ui .vh-25-ns { + height: 25vh; + } + .swagger-ui .vh-50-ns { + height: 50vh; + } + .swagger-ui .vh-75-ns { + height: 75vh; + } + .swagger-ui .vh-100-ns { + height: 100vh; + } + .swagger-ui .min-vh-100-ns { + min-height: 100vh; + } + .swagger-ui .h-auto-ns { + height: auto; + } + .swagger-ui .h-inherit-ns { + height: inherit; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .h1-m { + height: 1rem; + } + .swagger-ui .h2-m { + height: 2rem; + } + .swagger-ui .h3-m { + height: 4rem; + } + .swagger-ui .h4-m { + height: 8rem; + } + .swagger-ui .h5-m { + height: 16rem; + } + .swagger-ui .h-25-m { + height: 25%; + } + .swagger-ui .h-50-m { + height: 50%; + } + .swagger-ui .h-75-m { + height: 75%; + } + .swagger-ui .h-100-m { + height: 100%; + } + .swagger-ui .min-h-100-m { + min-height: 100%; + } + .swagger-ui .vh-25-m { + height: 25vh; + } + .swagger-ui .vh-50-m { + height: 50vh; + } + .swagger-ui .vh-75-m { + height: 75vh; + } + .swagger-ui .vh-100-m { + height: 100vh; + } + .swagger-ui .min-vh-100-m { + min-height: 100vh; + } + .swagger-ui .h-auto-m { + height: auto; + } + .swagger-ui .h-inherit-m { + height: inherit; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .h1-l { + height: 1rem; + } + .swagger-ui .h2-l { + height: 2rem; + } + .swagger-ui .h3-l { + height: 4rem; + } + .swagger-ui .h4-l { + height: 8rem; + } + .swagger-ui .h5-l { + height: 16rem; + } + .swagger-ui .h-25-l { + height: 25%; + } + .swagger-ui .h-50-l { + height: 50%; + } + .swagger-ui .h-75-l { + height: 75%; + } + .swagger-ui .h-100-l { + height: 100%; + } + .swagger-ui .min-h-100-l { + min-height: 100%; + } + .swagger-ui .vh-25-l { + height: 25vh; + } + .swagger-ui .vh-50-l { + height: 50vh; + } + .swagger-ui .vh-75-l { + height: 75vh; + } + .swagger-ui .vh-100-l { + height: 100vh; + } + .swagger-ui .min-vh-100-l { + min-height: 100vh; + } + .swagger-ui .h-auto-l { + height: auto; + } + .swagger-ui .h-inherit-l { + height: inherit; + } +} +.swagger-ui .tracked { + letter-spacing: 0.1em; +} +.swagger-ui .tracked-tight { + letter-spacing: -0.05em; +} +.swagger-ui .tracked-mega { + letter-spacing: 0.25em; +} +@media screen and (min-width: 30em) { + .swagger-ui .tracked-ns { + letter-spacing: 0.1em; + } + .swagger-ui .tracked-tight-ns { + letter-spacing: -0.05em; + } + .swagger-ui .tracked-mega-ns { + letter-spacing: 0.25em; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .tracked-m { + letter-spacing: 0.1em; + } + .swagger-ui .tracked-tight-m { + letter-spacing: -0.05em; + } + .swagger-ui .tracked-mega-m { + letter-spacing: 0.25em; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .tracked-l { + letter-spacing: 0.1em; + } + .swagger-ui .tracked-tight-l { + letter-spacing: -0.05em; + } + .swagger-ui .tracked-mega-l { + letter-spacing: 0.25em; + } +} +.swagger-ui .lh-solid { + line-height: 1; +} +.swagger-ui .lh-title { + line-height: 1.25; +} +.swagger-ui .lh-copy { + line-height: 1.5; +} +@media screen and (min-width: 30em) { + .swagger-ui .lh-solid-ns { + line-height: 1; + } + .swagger-ui .lh-title-ns { + line-height: 1.25; + } + .swagger-ui .lh-copy-ns { + line-height: 1.5; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .lh-solid-m { + line-height: 1; + } + .swagger-ui .lh-title-m { + line-height: 1.25; + } + .swagger-ui .lh-copy-m { + line-height: 1.5; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .lh-solid-l { + line-height: 1; + } + .swagger-ui .lh-title-l { + line-height: 1.25; + } + .swagger-ui .lh-copy-l { + line-height: 1.5; + } +} +.swagger-ui .link { + -webkit-text-decoration: none; + text-decoration: none; +} +.swagger-ui .link, +.swagger-ui .link:active, +.swagger-ui .link:focus, +.swagger-ui .link:hover, +.swagger-ui .link:link, +.swagger-ui .link:visited { + transition: color 0.15s ease-in; +} +.swagger-ui .link:focus { + outline: 1px dotted currentColor; +} +.swagger-ui .list { + list-style-type: none; +} +.swagger-ui .mw-100 { + max-width: 100%; +} +.swagger-ui .mw1 { + max-width: 1rem; +} +.swagger-ui .mw2 { + max-width: 2rem; +} +.swagger-ui .mw3 { + max-width: 4rem; +} +.swagger-ui .mw4 { + max-width: 8rem; +} +.swagger-ui .mw5 { + max-width: 16rem; +} +.swagger-ui .mw6 { + max-width: 32rem; +} +.swagger-ui .mw7 { + max-width: 48rem; +} +.swagger-ui .mw8 { + max-width: 64rem; +} +.swagger-ui .mw9 { + max-width: 96rem; +} +.swagger-ui .mw-none { + max-width: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .mw-100-ns { + max-width: 100%; + } + .swagger-ui .mw1-ns { + max-width: 1rem; + } + .swagger-ui .mw2-ns { + max-width: 2rem; + } + .swagger-ui .mw3-ns { + max-width: 4rem; + } + .swagger-ui .mw4-ns { + max-width: 8rem; + } + .swagger-ui .mw5-ns { + max-width: 16rem; + } + .swagger-ui .mw6-ns { + max-width: 32rem; + } + .swagger-ui .mw7-ns { + max-width: 48rem; + } + .swagger-ui .mw8-ns { + max-width: 64rem; + } + .swagger-ui .mw9-ns { + max-width: 96rem; + } + .swagger-ui .mw-none-ns { + max-width: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .mw-100-m { + max-width: 100%; + } + .swagger-ui .mw1-m { + max-width: 1rem; + } + .swagger-ui .mw2-m { + max-width: 2rem; + } + .swagger-ui .mw3-m { + max-width: 4rem; + } + .swagger-ui .mw4-m { + max-width: 8rem; + } + .swagger-ui .mw5-m { + max-width: 16rem; + } + .swagger-ui .mw6-m { + max-width: 32rem; + } + .swagger-ui .mw7-m { + max-width: 48rem; + } + .swagger-ui .mw8-m { + max-width: 64rem; + } + .swagger-ui .mw9-m { + max-width: 96rem; + } + .swagger-ui .mw-none-m { + max-width: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .mw-100-l { + max-width: 100%; + } + .swagger-ui .mw1-l { + max-width: 1rem; + } + .swagger-ui .mw2-l { + max-width: 2rem; + } + .swagger-ui .mw3-l { + max-width: 4rem; + } + .swagger-ui .mw4-l { + max-width: 8rem; + } + .swagger-ui .mw5-l { + max-width: 16rem; + } + .swagger-ui .mw6-l { + max-width: 32rem; + } + .swagger-ui .mw7-l { + max-width: 48rem; + } + .swagger-ui .mw8-l { + max-width: 64rem; + } + .swagger-ui .mw9-l { + max-width: 96rem; + } + .swagger-ui .mw-none-l { + max-width: none; + } +} +.swagger-ui .w1 { + width: 1rem; +} +.swagger-ui .w2 { + width: 2rem; +} +.swagger-ui .w3 { + width: 4rem; +} +.swagger-ui .w4 { + width: 8rem; +} +.swagger-ui .w5 { + width: 16rem; +} +.swagger-ui .w-10 { + width: 10%; +} +.swagger-ui .w-20 { + width: 20%; +} +.swagger-ui .w-25 { + width: 25%; +} +.swagger-ui .w-30 { + width: 30%; +} +.swagger-ui .w-33 { + width: 33%; +} +.swagger-ui .w-34 { + width: 34%; +} +.swagger-ui .w-40 { + width: 40%; +} +.swagger-ui .w-50 { + width: 50%; +} +.swagger-ui .w-60 { + width: 60%; +} +.swagger-ui .w-70 { + width: 70%; +} +.swagger-ui .w-75 { + width: 75%; +} +.swagger-ui .w-80 { + width: 80%; +} +.swagger-ui .w-90 { + width: 90%; +} +.swagger-ui .w-100 { + width: 100%; +} +.swagger-ui .w-third { + width: 33.3333333333%; +} +.swagger-ui .w-two-thirds { + width: 66.6666666667%; +} +.swagger-ui .w-auto { + width: auto; +} +@media screen and (min-width: 30em) { + .swagger-ui .w1-ns { + width: 1rem; + } + .swagger-ui .w2-ns { + width: 2rem; + } + .swagger-ui .w3-ns { + width: 4rem; + } + .swagger-ui .w4-ns { + width: 8rem; + } + .swagger-ui .w5-ns { + width: 16rem; + } + .swagger-ui .w-10-ns { + width: 10%; + } + .swagger-ui .w-20-ns { + width: 20%; + } + .swagger-ui .w-25-ns { + width: 25%; + } + .swagger-ui .w-30-ns { + width: 30%; + } + .swagger-ui .w-33-ns { + width: 33%; + } + .swagger-ui .w-34-ns { + width: 34%; + } + .swagger-ui .w-40-ns { + width: 40%; + } + .swagger-ui .w-50-ns { + width: 50%; + } + .swagger-ui .w-60-ns { + width: 60%; + } + .swagger-ui .w-70-ns { + width: 70%; + } + .swagger-ui .w-75-ns { + width: 75%; + } + .swagger-ui .w-80-ns { + width: 80%; + } + .swagger-ui .w-90-ns { + width: 90%; + } + .swagger-ui .w-100-ns { + width: 100%; + } + .swagger-ui .w-third-ns { + width: 33.3333333333%; + } + .swagger-ui .w-two-thirds-ns { + width: 66.6666666667%; + } + .swagger-ui .w-auto-ns { + width: auto; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .w1-m { + width: 1rem; + } + .swagger-ui .w2-m { + width: 2rem; + } + .swagger-ui .w3-m { + width: 4rem; + } + .swagger-ui .w4-m { + width: 8rem; + } + .swagger-ui .w5-m { + width: 16rem; + } + .swagger-ui .w-10-m { + width: 10%; + } + .swagger-ui .w-20-m { + width: 20%; + } + .swagger-ui .w-25-m { + width: 25%; + } + .swagger-ui .w-30-m { + width: 30%; + } + .swagger-ui .w-33-m { + width: 33%; + } + .swagger-ui .w-34-m { + width: 34%; + } + .swagger-ui .w-40-m { + width: 40%; + } + .swagger-ui .w-50-m { + width: 50%; + } + .swagger-ui .w-60-m { + width: 60%; + } + .swagger-ui .w-70-m { + width: 70%; + } + .swagger-ui .w-75-m { + width: 75%; + } + .swagger-ui .w-80-m { + width: 80%; + } + .swagger-ui .w-90-m { + width: 90%; + } + .swagger-ui .w-100-m { + width: 100%; + } + .swagger-ui .w-third-m { + width: 33.3333333333%; + } + .swagger-ui .w-two-thirds-m { + width: 66.6666666667%; + } + .swagger-ui .w-auto-m { + width: auto; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .w1-l { + width: 1rem; + } + .swagger-ui .w2-l { + width: 2rem; + } + .swagger-ui .w3-l { + width: 4rem; + } + .swagger-ui .w4-l { + width: 8rem; + } + .swagger-ui .w5-l { + width: 16rem; + } + .swagger-ui .w-10-l { + width: 10%; + } + .swagger-ui .w-20-l { + width: 20%; + } + .swagger-ui .w-25-l { + width: 25%; + } + .swagger-ui .w-30-l { + width: 30%; + } + .swagger-ui .w-33-l { + width: 33%; + } + .swagger-ui .w-34-l { + width: 34%; + } + .swagger-ui .w-40-l { + width: 40%; + } + .swagger-ui .w-50-l { + width: 50%; + } + .swagger-ui .w-60-l { + width: 60%; + } + .swagger-ui .w-70-l { + width: 70%; + } + .swagger-ui .w-75-l { + width: 75%; + } + .swagger-ui .w-80-l { + width: 80%; + } + .swagger-ui .w-90-l { + width: 90%; + } + .swagger-ui .w-100-l { + width: 100%; + } + .swagger-ui .w-third-l { + width: 33.3333333333%; + } + .swagger-ui .w-two-thirds-l { + width: 66.6666666667%; + } + .swagger-ui .w-auto-l { + width: auto; + } +} +.swagger-ui .overflow-visible { + overflow: visible; +} +.swagger-ui .overflow-hidden { + overflow: hidden; +} +.swagger-ui .overflow-scroll { + overflow: scroll; +} +.swagger-ui .overflow-auto { + overflow: auto; +} +.swagger-ui .overflow-x-visible { + overflow-x: visible; +} +.swagger-ui .overflow-x-hidden { + overflow-x: hidden; +} +.swagger-ui .overflow-x-scroll { + overflow-x: scroll; +} +.swagger-ui .overflow-x-auto { + overflow-x: auto; +} +.swagger-ui .overflow-y-visible { + overflow-y: visible; +} +.swagger-ui .overflow-y-hidden { + overflow-y: hidden; +} +.swagger-ui .overflow-y-scroll { + overflow-y: scroll; +} +.swagger-ui .overflow-y-auto { + overflow-y: auto; +} +@media screen and (min-width: 30em) { + .swagger-ui .overflow-visible-ns { + overflow: visible; + } + .swagger-ui .overflow-hidden-ns { + overflow: hidden; + } + .swagger-ui .overflow-scroll-ns { + overflow: scroll; + } + .swagger-ui .overflow-auto-ns { + overflow: auto; + } + .swagger-ui .overflow-x-visible-ns { + overflow-x: visible; + } + .swagger-ui .overflow-x-hidden-ns { + overflow-x: hidden; + } + .swagger-ui .overflow-x-scroll-ns { + overflow-x: scroll; + } + .swagger-ui .overflow-x-auto-ns { + overflow-x: auto; + } + .swagger-ui .overflow-y-visible-ns { + overflow-y: visible; + } + .swagger-ui .overflow-y-hidden-ns { + overflow-y: hidden; + } + .swagger-ui .overflow-y-scroll-ns { + overflow-y: scroll; + } + .swagger-ui .overflow-y-auto-ns { + overflow-y: auto; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .overflow-visible-m { + overflow: visible; + } + .swagger-ui .overflow-hidden-m { + overflow: hidden; + } + .swagger-ui .overflow-scroll-m { + overflow: scroll; + } + .swagger-ui .overflow-auto-m { + overflow: auto; + } + .swagger-ui .overflow-x-visible-m { + overflow-x: visible; + } + .swagger-ui .overflow-x-hidden-m { + overflow-x: hidden; + } + .swagger-ui .overflow-x-scroll-m { + overflow-x: scroll; + } + .swagger-ui .overflow-x-auto-m { + overflow-x: auto; + } + .swagger-ui .overflow-y-visible-m { + overflow-y: visible; + } + .swagger-ui .overflow-y-hidden-m { + overflow-y: hidden; + } + .swagger-ui .overflow-y-scroll-m { + overflow-y: scroll; + } + .swagger-ui .overflow-y-auto-m { + overflow-y: auto; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .overflow-visible-l { + overflow: visible; + } + .swagger-ui .overflow-hidden-l { + overflow: hidden; + } + .swagger-ui .overflow-scroll-l { + overflow: scroll; + } + .swagger-ui .overflow-auto-l { + overflow: auto; + } + .swagger-ui .overflow-x-visible-l { + overflow-x: visible; + } + .swagger-ui .overflow-x-hidden-l { + overflow-x: hidden; + } + .swagger-ui .overflow-x-scroll-l { + overflow-x: scroll; + } + .swagger-ui .overflow-x-auto-l { + overflow-x: auto; + } + .swagger-ui .overflow-y-visible-l { + overflow-y: visible; + } + .swagger-ui .overflow-y-hidden-l { + overflow-y: hidden; + } + .swagger-ui .overflow-y-scroll-l { + overflow-y: scroll; + } + .swagger-ui .overflow-y-auto-l { + overflow-y: auto; + } +} +.swagger-ui .static { + position: static; +} +.swagger-ui .relative { + position: relative; +} +.swagger-ui .absolute { + position: absolute; +} +.swagger-ui .fixed { + position: fixed; +} +@media screen and (min-width: 30em) { + .swagger-ui .static-ns { + position: static; + } + .swagger-ui .relative-ns { + position: relative; + } + .swagger-ui .absolute-ns { + position: absolute; + } + .swagger-ui .fixed-ns { + position: fixed; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .static-m { + position: static; + } + .swagger-ui .relative-m { + position: relative; + } + .swagger-ui .absolute-m { + position: absolute; + } + .swagger-ui .fixed-m { + position: fixed; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .static-l { + position: static; + } + .swagger-ui .relative-l { + position: relative; + } + .swagger-ui .absolute-l { + position: absolute; + } + .swagger-ui .fixed-l { + position: fixed; + } +} +.swagger-ui .o-100 { + opacity: 1; +} +.swagger-ui .o-90 { + opacity: 0.9; +} +.swagger-ui .o-80 { + opacity: 0.8; +} +.swagger-ui .o-70 { + opacity: 0.7; +} +.swagger-ui .o-60 { + opacity: 0.6; +} +.swagger-ui .o-50 { + opacity: 0.5; +} +.swagger-ui .o-40 { + opacity: 0.4; +} +.swagger-ui .o-30 { + opacity: 0.3; +} +.swagger-ui .o-20 { + opacity: 0.2; +} +.swagger-ui .o-10 { + opacity: 0.1; +} +.swagger-ui .o-05 { + opacity: 0.05; +} +.swagger-ui .o-025 { + opacity: 0.025; +} +.swagger-ui .o-0 { + opacity: 0; +} +.swagger-ui .rotate-45 { + transform: rotate(45deg); +} +.swagger-ui .rotate-90 { + transform: rotate(90deg); +} +.swagger-ui .rotate-135 { + transform: rotate(135deg); +} +.swagger-ui .rotate-180 { + transform: rotate(180deg); +} +.swagger-ui .rotate-225 { + transform: rotate(225deg); +} +.swagger-ui .rotate-270 { + transform: rotate(270deg); +} +.swagger-ui .rotate-315 { + transform: rotate(315deg); +} +@media screen and (min-width: 30em) { + .swagger-ui .rotate-45-ns { + transform: rotate(45deg); + } + .swagger-ui .rotate-90-ns { + transform: rotate(90deg); + } + .swagger-ui .rotate-135-ns { + transform: rotate(135deg); + } + .swagger-ui .rotate-180-ns { + transform: rotate(180deg); + } + .swagger-ui .rotate-225-ns { + transform: rotate(225deg); + } + .swagger-ui .rotate-270-ns { + transform: rotate(270deg); + } + .swagger-ui .rotate-315-ns { + transform: rotate(315deg); + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .rotate-45-m { + transform: rotate(45deg); + } + .swagger-ui .rotate-90-m { + transform: rotate(90deg); + } + .swagger-ui .rotate-135-m { + transform: rotate(135deg); + } + .swagger-ui .rotate-180-m { + transform: rotate(180deg); + } + .swagger-ui .rotate-225-m { + transform: rotate(225deg); + } + .swagger-ui .rotate-270-m { + transform: rotate(270deg); + } + .swagger-ui .rotate-315-m { + transform: rotate(315deg); + } +} +@media screen and (min-width: 60em) { + .swagger-ui .rotate-45-l { + transform: rotate(45deg); + } + .swagger-ui .rotate-90-l { + transform: rotate(90deg); + } + .swagger-ui .rotate-135-l { + transform: rotate(135deg); + } + .swagger-ui .rotate-180-l { + transform: rotate(180deg); + } + .swagger-ui .rotate-225-l { + transform: rotate(225deg); + } + .swagger-ui .rotate-270-l { + transform: rotate(270deg); + } + .swagger-ui .rotate-315-l { + transform: rotate(315deg); + } +} +.swagger-ui .black-90 { + color: rgba(0, 0, 0, 0.9); +} +.swagger-ui .black-80 { + color: rgba(0, 0, 0, 0.8); +} +.swagger-ui .black-70 { + color: rgba(0, 0, 0, 0.7); +} +.swagger-ui .black-60 { + color: rgba(0, 0, 0, 0.6); +} +.swagger-ui .black-50 { + color: rgba(0, 0, 0, 0.5); +} +.swagger-ui .black-40 { + color: rgba(0, 0, 0, 0.4); +} +.swagger-ui .black-30 { + color: rgba(0, 0, 0, 0.3); +} +.swagger-ui .black-20 { + color: rgba(0, 0, 0, 0.2); +} +.swagger-ui .black-10 { + color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .black-05 { + color: rgba(0, 0, 0, 0.05); +} +.swagger-ui .white-90 { + color: hsla(0, 0%, 100%, 0.9); +} +.swagger-ui .white-80 { + color: hsla(0, 0%, 100%, 0.8); +} +.swagger-ui .white-70 { + color: hsla(0, 0%, 100%, 0.7); +} +.swagger-ui .white-60 { + color: hsla(0, 0%, 100%, 0.6); +} +.swagger-ui .white-50 { + color: hsla(0, 0%, 100%, 0.5); +} +.swagger-ui .white-40 { + color: hsla(0, 0%, 100%, 0.4); +} +.swagger-ui .white-30 { + color: hsla(0, 0%, 100%, 0.3); +} +.swagger-ui .white-20 { + color: hsla(0, 0%, 100%, 0.2); +} +.swagger-ui .white-10 { + color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .black { + color: #000; +} +.swagger-ui .near-black { + color: #111; +} +.swagger-ui .dark-gray { + color: #333; +} +.swagger-ui .mid-gray { + color: #555; +} +.swagger-ui .gray { + color: #777; +} +.swagger-ui .silver { + color: #999; +} +.swagger-ui .light-silver { + color: #aaa; +} +.swagger-ui .moon-gray { + color: #ccc; +} +.swagger-ui .light-gray { + color: #eee; +} +.swagger-ui .near-white { + color: #f4f4f4; +} +.swagger-ui .white { + color: #fff; +} +.swagger-ui .dark-red { + color: #e7040f; +} +.swagger-ui .red { + color: #ff4136; +} +.swagger-ui .light-red { + color: #ff725c; +} +.swagger-ui .orange { + color: #ff6300; +} +.swagger-ui .gold { + color: #ffb700; +} +.swagger-ui .yellow { + color: gold; +} +.swagger-ui .light-yellow { + color: #fbf1a9; +} +.swagger-ui .purple { + color: #5e2ca5; +} +.swagger-ui .light-purple { + color: #a463f2; +} +.swagger-ui .dark-pink { + color: #d5008f; +} +.swagger-ui .hot-pink { + color: #ff41b4; +} +.swagger-ui .pink { + color: #ff80cc; +} +.swagger-ui .light-pink { + color: #ffa3d7; +} +.swagger-ui .dark-green { + color: #137752; +} +.swagger-ui .green { + color: #19a974; +} +.swagger-ui .light-green { + color: #9eebcf; +} +.swagger-ui .navy { + color: #001b44; +} +.swagger-ui .dark-blue { + color: #00449e; +} +.swagger-ui .blue { + color: #357edd; +} +.swagger-ui .light-blue { + color: #96ccff; +} +.swagger-ui .lightest-blue { + color: #cdecff; +} +.swagger-ui .washed-blue { + color: #f6fffe; +} +.swagger-ui .washed-green { + color: #e8fdf5; +} +.swagger-ui .washed-yellow { + color: #fffceb; +} +.swagger-ui .washed-red { + color: #ffdfdf; +} +.swagger-ui .color-inherit { + color: inherit; +} +.swagger-ui .bg-black-90 { + background-color: rgba(0, 0, 0, 0.9); +} +.swagger-ui .bg-black-80 { + background-color: rgba(0, 0, 0, 0.8); +} +.swagger-ui .bg-black-70 { + background-color: rgba(0, 0, 0, 0.7); +} +.swagger-ui .bg-black-60 { + background-color: rgba(0, 0, 0, 0.6); +} +.swagger-ui .bg-black-50 { + background-color: rgba(0, 0, 0, 0.5); +} +.swagger-ui .bg-black-40 { + background-color: rgba(0, 0, 0, 0.4); +} +.swagger-ui .bg-black-30 { + background-color: rgba(0, 0, 0, 0.3); +} +.swagger-ui .bg-black-20 { + background-color: rgba(0, 0, 0, 0.2); +} +.swagger-ui .bg-black-10 { + background-color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .bg-black-05 { + background-color: rgba(0, 0, 0, 0.05); +} +.swagger-ui .bg-white-90 { + background-color: hsla(0, 0%, 100%, 0.9); +} +.swagger-ui .bg-white-80 { + background-color: hsla(0, 0%, 100%, 0.8); +} +.swagger-ui .bg-white-70 { + background-color: hsla(0, 0%, 100%, 0.7); +} +.swagger-ui .bg-white-60 { + background-color: hsla(0, 0%, 100%, 0.6); +} +.swagger-ui .bg-white-50 { + background-color: hsla(0, 0%, 100%, 0.5); +} +.swagger-ui .bg-white-40 { + background-color: hsla(0, 0%, 100%, 0.4); +} +.swagger-ui .bg-white-30 { + background-color: hsla(0, 0%, 100%, 0.3); +} +.swagger-ui .bg-white-20 { + background-color: hsla(0, 0%, 100%, 0.2); +} +.swagger-ui .bg-white-10 { + background-color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .bg-black { + background-color: #000; +} +.swagger-ui .bg-near-black { + background-color: #111; +} +.swagger-ui .bg-dark-gray { + background-color: #333; +} +.swagger-ui .bg-mid-gray { + background-color: #555; +} +.swagger-ui .bg-gray { + background-color: #777; +} +.swagger-ui .bg-silver { + background-color: #999; +} +.swagger-ui .bg-light-silver { + background-color: #aaa; +} +.swagger-ui .bg-moon-gray { + background-color: #ccc; +} +.swagger-ui .bg-light-gray { + background-color: #eee; +} +.swagger-ui .bg-near-white { + background-color: #f4f4f4; +} +.swagger-ui .bg-white { + background-color: #fff; +} +.swagger-ui .bg-transparent { + background-color: transparent; +} +.swagger-ui .bg-dark-red { + background-color: #e7040f; +} +.swagger-ui .bg-red { + background-color: #ff4136; +} +.swagger-ui .bg-light-red { + background-color: #ff725c; +} +.swagger-ui .bg-orange { + background-color: #ff6300; +} +.swagger-ui .bg-gold { + background-color: #ffb700; +} +.swagger-ui .bg-yellow { + background-color: gold; +} +.swagger-ui .bg-light-yellow { + background-color: #fbf1a9; +} +.swagger-ui .bg-purple { + background-color: #5e2ca5; +} +.swagger-ui .bg-light-purple { + background-color: #a463f2; +} +.swagger-ui .bg-dark-pink { + background-color: #d5008f; +} +.swagger-ui .bg-hot-pink { + background-color: #ff41b4; +} +.swagger-ui .bg-pink { + background-color: #ff80cc; +} +.swagger-ui .bg-light-pink { + background-color: #ffa3d7; +} +.swagger-ui .bg-dark-green { + background-color: #137752; +} +.swagger-ui .bg-green { + background-color: #19a974; +} +.swagger-ui .bg-light-green { + background-color: #9eebcf; +} +.swagger-ui .bg-navy { + background-color: #001b44; +} +.swagger-ui .bg-dark-blue { + background-color: #00449e; +} +.swagger-ui .bg-blue { + background-color: #357edd; +} +.swagger-ui .bg-light-blue { + background-color: #96ccff; +} +.swagger-ui .bg-lightest-blue { + background-color: #cdecff; +} +.swagger-ui .bg-washed-blue { + background-color: #f6fffe; +} +.swagger-ui .bg-washed-green { + background-color: #e8fdf5; +} +.swagger-ui .bg-washed-yellow { + background-color: #fffceb; +} +.swagger-ui .bg-washed-red { + background-color: #ffdfdf; +} +.swagger-ui .bg-inherit { + background-color: inherit; +} +.swagger-ui .hover-black:focus, +.swagger-ui .hover-black:hover { + color: #000; +} +.swagger-ui .hover-near-black:focus, +.swagger-ui .hover-near-black:hover { + color: #111; +} +.swagger-ui .hover-dark-gray:focus, +.swagger-ui .hover-dark-gray:hover { + color: #333; +} +.swagger-ui .hover-mid-gray:focus, +.swagger-ui .hover-mid-gray:hover { + color: #555; +} +.swagger-ui .hover-gray:focus, +.swagger-ui .hover-gray:hover { + color: #777; +} +.swagger-ui .hover-silver:focus, +.swagger-ui .hover-silver:hover { + color: #999; +} +.swagger-ui .hover-light-silver:focus, +.swagger-ui .hover-light-silver:hover { + color: #aaa; +} +.swagger-ui .hover-moon-gray:focus, +.swagger-ui .hover-moon-gray:hover { + color: #ccc; +} +.swagger-ui .hover-light-gray:focus, +.swagger-ui .hover-light-gray:hover { + color: #eee; +} +.swagger-ui .hover-near-white:focus, +.swagger-ui .hover-near-white:hover { + color: #f4f4f4; +} +.swagger-ui .hover-white:focus, +.swagger-ui .hover-white:hover { + color: #fff; +} +.swagger-ui .hover-black-90:focus, +.swagger-ui .hover-black-90:hover { + color: rgba(0, 0, 0, 0.9); +} +.swagger-ui .hover-black-80:focus, +.swagger-ui .hover-black-80:hover { + color: rgba(0, 0, 0, 0.8); +} +.swagger-ui .hover-black-70:focus, +.swagger-ui .hover-black-70:hover { + color: rgba(0, 0, 0, 0.7); +} +.swagger-ui .hover-black-60:focus, +.swagger-ui .hover-black-60:hover { + color: rgba(0, 0, 0, 0.6); +} +.swagger-ui .hover-black-50:focus, +.swagger-ui .hover-black-50:hover { + color: rgba(0, 0, 0, 0.5); +} +.swagger-ui .hover-black-40:focus, +.swagger-ui .hover-black-40:hover { + color: rgba(0, 0, 0, 0.4); +} +.swagger-ui .hover-black-30:focus, +.swagger-ui .hover-black-30:hover { + color: rgba(0, 0, 0, 0.3); +} +.swagger-ui .hover-black-20:focus, +.swagger-ui .hover-black-20:hover { + color: rgba(0, 0, 0, 0.2); +} +.swagger-ui .hover-black-10:focus, +.swagger-ui .hover-black-10:hover { + color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .hover-white-90:focus, +.swagger-ui .hover-white-90:hover { + color: hsla(0, 0%, 100%, 0.9); +} +.swagger-ui .hover-white-80:focus, +.swagger-ui .hover-white-80:hover { + color: hsla(0, 0%, 100%, 0.8); +} +.swagger-ui .hover-white-70:focus, +.swagger-ui .hover-white-70:hover { + color: hsla(0, 0%, 100%, 0.7); +} +.swagger-ui .hover-white-60:focus, +.swagger-ui .hover-white-60:hover { + color: hsla(0, 0%, 100%, 0.6); +} +.swagger-ui .hover-white-50:focus, +.swagger-ui .hover-white-50:hover { + color: hsla(0, 0%, 100%, 0.5); +} +.swagger-ui .hover-white-40:focus, +.swagger-ui .hover-white-40:hover { + color: hsla(0, 0%, 100%, 0.4); +} +.swagger-ui .hover-white-30:focus, +.swagger-ui .hover-white-30:hover { + color: hsla(0, 0%, 100%, 0.3); +} +.swagger-ui .hover-white-20:focus, +.swagger-ui .hover-white-20:hover { + color: hsla(0, 0%, 100%, 0.2); +} +.swagger-ui .hover-white-10:focus, +.swagger-ui .hover-white-10:hover { + color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .hover-inherit:focus, +.swagger-ui .hover-inherit:hover { + color: inherit; +} +.swagger-ui .hover-bg-black:focus, +.swagger-ui .hover-bg-black:hover { + background-color: #000; +} +.swagger-ui .hover-bg-near-black:focus, +.swagger-ui .hover-bg-near-black:hover { + background-color: #111; +} +.swagger-ui .hover-bg-dark-gray:focus, +.swagger-ui .hover-bg-dark-gray:hover { + background-color: #333; +} +.swagger-ui .hover-bg-mid-gray:focus, +.swagger-ui .hover-bg-mid-gray:hover { + background-color: #555; +} +.swagger-ui .hover-bg-gray:focus, +.swagger-ui .hover-bg-gray:hover { + background-color: #777; +} +.swagger-ui .hover-bg-silver:focus, +.swagger-ui .hover-bg-silver:hover { + background-color: #999; +} +.swagger-ui .hover-bg-light-silver:focus, +.swagger-ui .hover-bg-light-silver:hover { + background-color: #aaa; +} +.swagger-ui .hover-bg-moon-gray:focus, +.swagger-ui .hover-bg-moon-gray:hover { + background-color: #ccc; +} +.swagger-ui .hover-bg-light-gray:focus, +.swagger-ui .hover-bg-light-gray:hover { + background-color: #eee; +} +.swagger-ui .hover-bg-near-white:focus, +.swagger-ui .hover-bg-near-white:hover { + background-color: #f4f4f4; +} +.swagger-ui .hover-bg-white:focus, +.swagger-ui .hover-bg-white:hover { + background-color: #fff; +} +.swagger-ui .hover-bg-transparent:focus, +.swagger-ui .hover-bg-transparent:hover { + background-color: transparent; +} +.swagger-ui .hover-bg-black-90:focus, +.swagger-ui .hover-bg-black-90:hover { + background-color: rgba(0, 0, 0, 0.9); +} +.swagger-ui .hover-bg-black-80:focus, +.swagger-ui .hover-bg-black-80:hover { + background-color: rgba(0, 0, 0, 0.8); +} +.swagger-ui .hover-bg-black-70:focus, +.swagger-ui .hover-bg-black-70:hover { + background-color: rgba(0, 0, 0, 0.7); +} +.swagger-ui .hover-bg-black-60:focus, +.swagger-ui .hover-bg-black-60:hover { + background-color: rgba(0, 0, 0, 0.6); +} +.swagger-ui .hover-bg-black-50:focus, +.swagger-ui .hover-bg-black-50:hover { + background-color: rgba(0, 0, 0, 0.5); +} +.swagger-ui .hover-bg-black-40:focus, +.swagger-ui .hover-bg-black-40:hover { + background-color: rgba(0, 0, 0, 0.4); +} +.swagger-ui .hover-bg-black-30:focus, +.swagger-ui .hover-bg-black-30:hover { + background-color: rgba(0, 0, 0, 0.3); +} +.swagger-ui .hover-bg-black-20:focus, +.swagger-ui .hover-bg-black-20:hover { + background-color: rgba(0, 0, 0, 0.2); +} +.swagger-ui .hover-bg-black-10:focus, +.swagger-ui .hover-bg-black-10:hover { + background-color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .hover-bg-white-90:focus, +.swagger-ui .hover-bg-white-90:hover { + background-color: hsla(0, 0%, 100%, 0.9); +} +.swagger-ui .hover-bg-white-80:focus, +.swagger-ui .hover-bg-white-80:hover { + background-color: hsla(0, 0%, 100%, 0.8); +} +.swagger-ui .hover-bg-white-70:focus, +.swagger-ui .hover-bg-white-70:hover { + background-color: hsla(0, 0%, 100%, 0.7); +} +.swagger-ui .hover-bg-white-60:focus, +.swagger-ui .hover-bg-white-60:hover { + background-color: hsla(0, 0%, 100%, 0.6); +} +.swagger-ui .hover-bg-white-50:focus, +.swagger-ui .hover-bg-white-50:hover { + background-color: hsla(0, 0%, 100%, 0.5); +} +.swagger-ui .hover-bg-white-40:focus, +.swagger-ui .hover-bg-white-40:hover { + background-color: hsla(0, 0%, 100%, 0.4); +} +.swagger-ui .hover-bg-white-30:focus, +.swagger-ui .hover-bg-white-30:hover { + background-color: hsla(0, 0%, 100%, 0.3); +} +.swagger-ui .hover-bg-white-20:focus, +.swagger-ui .hover-bg-white-20:hover { + background-color: hsla(0, 0%, 100%, 0.2); +} +.swagger-ui .hover-bg-white-10:focus, +.swagger-ui .hover-bg-white-10:hover { + background-color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .hover-dark-red:focus, +.swagger-ui .hover-dark-red:hover { + color: #e7040f; +} +.swagger-ui .hover-red:focus, +.swagger-ui .hover-red:hover { + color: #ff4136; +} +.swagger-ui .hover-light-red:focus, +.swagger-ui .hover-light-red:hover { + color: #ff725c; +} +.swagger-ui .hover-orange:focus, +.swagger-ui .hover-orange:hover { + color: #ff6300; +} +.swagger-ui .hover-gold:focus, +.swagger-ui .hover-gold:hover { + color: #ffb700; +} +.swagger-ui .hover-yellow:focus, +.swagger-ui .hover-yellow:hover { + color: gold; +} +.swagger-ui .hover-light-yellow:focus, +.swagger-ui .hover-light-yellow:hover { + color: #fbf1a9; +} +.swagger-ui .hover-purple:focus, +.swagger-ui .hover-purple:hover { + color: #5e2ca5; +} +.swagger-ui .hover-light-purple:focus, +.swagger-ui .hover-light-purple:hover { + color: #a463f2; +} +.swagger-ui .hover-dark-pink:focus, +.swagger-ui .hover-dark-pink:hover { + color: #d5008f; +} +.swagger-ui .hover-hot-pink:focus, +.swagger-ui .hover-hot-pink:hover { + color: #ff41b4; +} +.swagger-ui .hover-pink:focus, +.swagger-ui .hover-pink:hover { + color: #ff80cc; +} +.swagger-ui .hover-light-pink:focus, +.swagger-ui .hover-light-pink:hover { + color: #ffa3d7; +} +.swagger-ui .hover-dark-green:focus, +.swagger-ui .hover-dark-green:hover { + color: #137752; +} +.swagger-ui .hover-green:focus, +.swagger-ui .hover-green:hover { + color: #19a974; +} +.swagger-ui .hover-light-green:focus, +.swagger-ui .hover-light-green:hover { + color: #9eebcf; +} +.swagger-ui .hover-navy:focus, +.swagger-ui .hover-navy:hover { + color: #001b44; +} +.swagger-ui .hover-dark-blue:focus, +.swagger-ui .hover-dark-blue:hover { + color: #00449e; +} +.swagger-ui .hover-blue:focus, +.swagger-ui .hover-blue:hover { + color: #357edd; +} +.swagger-ui .hover-light-blue:focus, +.swagger-ui .hover-light-blue:hover { + color: #96ccff; +} +.swagger-ui .hover-lightest-blue:focus, +.swagger-ui .hover-lightest-blue:hover { + color: #cdecff; +} +.swagger-ui .hover-washed-blue:focus, +.swagger-ui .hover-washed-blue:hover { + color: #f6fffe; +} +.swagger-ui .hover-washed-green:focus, +.swagger-ui .hover-washed-green:hover { + color: #e8fdf5; +} +.swagger-ui .hover-washed-yellow:focus, +.swagger-ui .hover-washed-yellow:hover { + color: #fffceb; +} +.swagger-ui .hover-washed-red:focus, +.swagger-ui .hover-washed-red:hover { + color: #ffdfdf; +} +.swagger-ui .hover-bg-dark-red:focus, +.swagger-ui .hover-bg-dark-red:hover { + background-color: #e7040f; +} +.swagger-ui .hover-bg-red:focus, +.swagger-ui .hover-bg-red:hover { + background-color: #ff4136; +} +.swagger-ui .hover-bg-light-red:focus, +.swagger-ui .hover-bg-light-red:hover { + background-color: #ff725c; +} +.swagger-ui .hover-bg-orange:focus, +.swagger-ui .hover-bg-orange:hover { + background-color: #ff6300; +} +.swagger-ui .hover-bg-gold:focus, +.swagger-ui .hover-bg-gold:hover { + background-color: #ffb700; +} +.swagger-ui .hover-bg-yellow:focus, +.swagger-ui .hover-bg-yellow:hover { + background-color: gold; +} +.swagger-ui .hover-bg-light-yellow:focus, +.swagger-ui .hover-bg-light-yellow:hover { + background-color: #fbf1a9; +} +.swagger-ui .hover-bg-purple:focus, +.swagger-ui .hover-bg-purple:hover { + background-color: #5e2ca5; +} +.swagger-ui .hover-bg-light-purple:focus, +.swagger-ui .hover-bg-light-purple:hover { + background-color: #a463f2; +} +.swagger-ui .hover-bg-dark-pink:focus, +.swagger-ui .hover-bg-dark-pink:hover { + background-color: #d5008f; +} +.swagger-ui .hover-bg-hot-pink:focus, +.swagger-ui .hover-bg-hot-pink:hover { + background-color: #ff41b4; +} +.swagger-ui .hover-bg-pink:focus, +.swagger-ui .hover-bg-pink:hover { + background-color: #ff80cc; +} +.swagger-ui .hover-bg-light-pink:focus, +.swagger-ui .hover-bg-light-pink:hover { + background-color: #ffa3d7; +} +.swagger-ui .hover-bg-dark-green:focus, +.swagger-ui .hover-bg-dark-green:hover { + background-color: #137752; +} +.swagger-ui .hover-bg-green:focus, +.swagger-ui .hover-bg-green:hover { + background-color: #19a974; +} +.swagger-ui .hover-bg-light-green:focus, +.swagger-ui .hover-bg-light-green:hover { + background-color: #9eebcf; +} +.swagger-ui .hover-bg-navy:focus, +.swagger-ui .hover-bg-navy:hover { + background-color: #001b44; +} +.swagger-ui .hover-bg-dark-blue:focus, +.swagger-ui .hover-bg-dark-blue:hover { + background-color: #00449e; +} +.swagger-ui .hover-bg-blue:focus, +.swagger-ui .hover-bg-blue:hover { + background-color: #357edd; +} +.swagger-ui .hover-bg-light-blue:focus, +.swagger-ui .hover-bg-light-blue:hover { + background-color: #96ccff; +} +.swagger-ui .hover-bg-lightest-blue:focus, +.swagger-ui .hover-bg-lightest-blue:hover { + background-color: #cdecff; +} +.swagger-ui .hover-bg-washed-blue:focus, +.swagger-ui .hover-bg-washed-blue:hover { + background-color: #f6fffe; +} +.swagger-ui .hover-bg-washed-green:focus, +.swagger-ui .hover-bg-washed-green:hover { + background-color: #e8fdf5; +} +.swagger-ui .hover-bg-washed-yellow:focus, +.swagger-ui .hover-bg-washed-yellow:hover { + background-color: #fffceb; +} +.swagger-ui .hover-bg-washed-red:focus, +.swagger-ui .hover-bg-washed-red:hover { + background-color: #ffdfdf; +} +.swagger-ui .hover-bg-inherit:focus, +.swagger-ui .hover-bg-inherit:hover { + background-color: inherit; +} +.swagger-ui .pa0 { + padding: 0; +} +.swagger-ui .pa1 { + padding: 0.25rem; +} +.swagger-ui .pa2 { + padding: 0.5rem; +} +.swagger-ui .pa3 { + padding: 1rem; +} +.swagger-ui .pa4 { + padding: 2rem; +} +.swagger-ui .pa5 { + padding: 4rem; +} +.swagger-ui .pa6 { + padding: 8rem; +} +.swagger-ui .pa7 { + padding: 16rem; +} +.swagger-ui .pl0 { + padding-left: 0; +} +.swagger-ui .pl1 { + padding-left: 0.25rem; +} +.swagger-ui .pl2 { + padding-left: 0.5rem; +} +.swagger-ui .pl3 { + padding-left: 1rem; +} +.swagger-ui .pl4 { + padding-left: 2rem; +} +.swagger-ui .pl5 { + padding-left: 4rem; +} +.swagger-ui .pl6 { + padding-left: 8rem; +} +.swagger-ui .pl7 { + padding-left: 16rem; +} +.swagger-ui .pr0 { + padding-right: 0; +} +.swagger-ui .pr1 { + padding-right: 0.25rem; +} +.swagger-ui .pr2 { + padding-right: 0.5rem; +} +.swagger-ui .pr3 { + padding-right: 1rem; +} +.swagger-ui .pr4 { + padding-right: 2rem; +} +.swagger-ui .pr5 { + padding-right: 4rem; +} +.swagger-ui .pr6 { + padding-right: 8rem; +} +.swagger-ui .pr7 { + padding-right: 16rem; +} +.swagger-ui .pb0 { + padding-bottom: 0; +} +.swagger-ui .pb1 { + padding-bottom: 0.25rem; +} +.swagger-ui .pb2 { + padding-bottom: 0.5rem; +} +.swagger-ui .pb3 { + padding-bottom: 1rem; +} +.swagger-ui .pb4 { + padding-bottom: 2rem; +} +.swagger-ui .pb5 { + padding-bottom: 4rem; +} +.swagger-ui .pb6 { + padding-bottom: 8rem; +} +.swagger-ui .pb7 { + padding-bottom: 16rem; +} +.swagger-ui .pt0 { + padding-top: 0; +} +.swagger-ui .pt1 { + padding-top: 0.25rem; +} +.swagger-ui .pt2 { + padding-top: 0.5rem; +} +.swagger-ui .pt3 { + padding-top: 1rem; +} +.swagger-ui .pt4 { + padding-top: 2rem; +} +.swagger-ui .pt5 { + padding-top: 4rem; +} +.swagger-ui .pt6 { + padding-top: 8rem; +} +.swagger-ui .pt7 { + padding-top: 16rem; +} +.swagger-ui .pv0 { + padding-bottom: 0; + padding-top: 0; +} +.swagger-ui .pv1 { + padding-bottom: 0.25rem; + padding-top: 0.25rem; +} +.swagger-ui .pv2 { + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} +.swagger-ui .pv3 { + padding-bottom: 1rem; + padding-top: 1rem; +} +.swagger-ui .pv4 { + padding-bottom: 2rem; + padding-top: 2rem; +} +.swagger-ui .pv5 { + padding-bottom: 4rem; + padding-top: 4rem; +} +.swagger-ui .pv6 { + padding-bottom: 8rem; + padding-top: 8rem; +} +.swagger-ui .pv7 { + padding-bottom: 16rem; + padding-top: 16rem; +} +.swagger-ui .ph0 { + padding-left: 0; + padding-right: 0; +} +.swagger-ui .ph1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} +.swagger-ui .ph2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.swagger-ui .ph3 { + padding-left: 1rem; + padding-right: 1rem; +} +.swagger-ui .ph4 { + padding-left: 2rem; + padding-right: 2rem; +} +.swagger-ui .ph5 { + padding-left: 4rem; + padding-right: 4rem; +} +.swagger-ui .ph6 { + padding-left: 8rem; + padding-right: 8rem; +} +.swagger-ui .ph7 { + padding-left: 16rem; + padding-right: 16rem; +} +.swagger-ui .ma0 { + margin: 0; +} +.swagger-ui .ma1 { + margin: 0.25rem; +} +.swagger-ui .ma2 { + margin: 0.5rem; +} +.swagger-ui .ma3 { + margin: 1rem; +} +.swagger-ui .ma4 { + margin: 2rem; +} +.swagger-ui .ma5 { + margin: 4rem; +} +.swagger-ui .ma6 { + margin: 8rem; +} +.swagger-ui .ma7 { + margin: 16rem; +} +.swagger-ui .ml0 { + margin-left: 0; +} +.swagger-ui .ml1 { + margin-left: 0.25rem; +} +.swagger-ui .ml2 { + margin-left: 0.5rem; +} +.swagger-ui .ml3 { + margin-left: 1rem; +} +.swagger-ui .ml4 { + margin-left: 2rem; +} +.swagger-ui .ml5 { + margin-left: 4rem; +} +.swagger-ui .ml6 { + margin-left: 8rem; +} +.swagger-ui .ml7 { + margin-left: 16rem; +} +.swagger-ui .mr0 { + margin-right: 0; +} +.swagger-ui .mr1 { + margin-right: 0.25rem; +} +.swagger-ui .mr2 { + margin-right: 0.5rem; +} +.swagger-ui .mr3 { + margin-right: 1rem; +} +.swagger-ui .mr4 { + margin-right: 2rem; +} +.swagger-ui .mr5 { + margin-right: 4rem; +} +.swagger-ui .mr6 { + margin-right: 8rem; +} +.swagger-ui .mr7 { + margin-right: 16rem; +} +.swagger-ui .mb0 { + margin-bottom: 0; +} +.swagger-ui .mb1 { + margin-bottom: 0.25rem; +} +.swagger-ui .mb2 { + margin-bottom: 0.5rem; +} +.swagger-ui .mb3 { + margin-bottom: 1rem; +} +.swagger-ui .mb4 { + margin-bottom: 2rem; +} +.swagger-ui .mb5 { + margin-bottom: 4rem; +} +.swagger-ui .mb6 { + margin-bottom: 8rem; +} +.swagger-ui .mb7 { + margin-bottom: 16rem; +} +.swagger-ui .mt0 { + margin-top: 0; +} +.swagger-ui .mt1 { + margin-top: 0.25rem; +} +.swagger-ui .mt2 { + margin-top: 0.5rem; +} +.swagger-ui .mt3 { + margin-top: 1rem; +} +.swagger-ui .mt4 { + margin-top: 2rem; +} +.swagger-ui .mt5 { + margin-top: 4rem; +} +.swagger-ui .mt6 { + margin-top: 8rem; +} +.swagger-ui .mt7 { + margin-top: 16rem; +} +.swagger-ui .mv0 { + margin-bottom: 0; + margin-top: 0; +} +.swagger-ui .mv1 { + margin-bottom: 0.25rem; + margin-top: 0.25rem; +} +.swagger-ui .mv2 { + margin-bottom: 0.5rem; + margin-top: 0.5rem; +} +.swagger-ui .mv3 { + margin-bottom: 1rem; + margin-top: 1rem; +} +.swagger-ui .mv4 { + margin-bottom: 2rem; + margin-top: 2rem; +} +.swagger-ui .mv5 { + margin-bottom: 4rem; + margin-top: 4rem; +} +.swagger-ui .mv6 { + margin-bottom: 8rem; + margin-top: 8rem; +} +.swagger-ui .mv7 { + margin-bottom: 16rem; + margin-top: 16rem; +} +.swagger-ui .mh0 { + margin-left: 0; + margin-right: 0; +} +.swagger-ui .mh1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} +.swagger-ui .mh2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} +.swagger-ui .mh3 { + margin-left: 1rem; + margin-right: 1rem; +} +.swagger-ui .mh4 { + margin-left: 2rem; + margin-right: 2rem; +} +.swagger-ui .mh5 { + margin-left: 4rem; + margin-right: 4rem; +} +.swagger-ui .mh6 { + margin-left: 8rem; + margin-right: 8rem; +} +.swagger-ui .mh7 { + margin-left: 16rem; + margin-right: 16rem; +} +@media screen and (min-width: 30em) { + .swagger-ui .pa0-ns { + padding: 0; + } + .swagger-ui .pa1-ns { + padding: 0.25rem; + } + .swagger-ui .pa2-ns { + padding: 0.5rem; + } + .swagger-ui .pa3-ns { + padding: 1rem; + } + .swagger-ui .pa4-ns { + padding: 2rem; + } + .swagger-ui .pa5-ns { + padding: 4rem; + } + .swagger-ui .pa6-ns { + padding: 8rem; + } + .swagger-ui .pa7-ns { + padding: 16rem; + } + .swagger-ui .pl0-ns { + padding-left: 0; + } + .swagger-ui .pl1-ns { + padding-left: 0.25rem; + } + .swagger-ui .pl2-ns { + padding-left: 0.5rem; + } + .swagger-ui .pl3-ns { + padding-left: 1rem; + } + .swagger-ui .pl4-ns { + padding-left: 2rem; + } + .swagger-ui .pl5-ns { + padding-left: 4rem; + } + .swagger-ui .pl6-ns { + padding-left: 8rem; + } + .swagger-ui .pl7-ns { + padding-left: 16rem; + } + .swagger-ui .pr0-ns { + padding-right: 0; + } + .swagger-ui .pr1-ns { + padding-right: 0.25rem; + } + .swagger-ui .pr2-ns { + padding-right: 0.5rem; + } + .swagger-ui .pr3-ns { + padding-right: 1rem; + } + .swagger-ui .pr4-ns { + padding-right: 2rem; + } + .swagger-ui .pr5-ns { + padding-right: 4rem; + } + .swagger-ui .pr6-ns { + padding-right: 8rem; + } + .swagger-ui .pr7-ns { + padding-right: 16rem; + } + .swagger-ui .pb0-ns { + padding-bottom: 0; + } + .swagger-ui .pb1-ns { + padding-bottom: 0.25rem; + } + .swagger-ui .pb2-ns { + padding-bottom: 0.5rem; + } + .swagger-ui .pb3-ns { + padding-bottom: 1rem; + } + .swagger-ui .pb4-ns { + padding-bottom: 2rem; + } + .swagger-ui .pb5-ns { + padding-bottom: 4rem; + } + .swagger-ui .pb6-ns { + padding-bottom: 8rem; + } + .swagger-ui .pb7-ns { + padding-bottom: 16rem; + } + .swagger-ui .pt0-ns { + padding-top: 0; + } + .swagger-ui .pt1-ns { + padding-top: 0.25rem; + } + .swagger-ui .pt2-ns { + padding-top: 0.5rem; + } + .swagger-ui .pt3-ns { + padding-top: 1rem; + } + .swagger-ui .pt4-ns { + padding-top: 2rem; + } + .swagger-ui .pt5-ns { + padding-top: 4rem; + } + .swagger-ui .pt6-ns { + padding-top: 8rem; + } + .swagger-ui .pt7-ns { + padding-top: 16rem; + } + .swagger-ui .pv0-ns { + padding-bottom: 0; + padding-top: 0; + } + .swagger-ui .pv1-ns { + padding-bottom: 0.25rem; + padding-top: 0.25rem; + } + .swagger-ui .pv2-ns { + padding-bottom: 0.5rem; + padding-top: 0.5rem; + } + .swagger-ui .pv3-ns { + padding-bottom: 1rem; + padding-top: 1rem; + } + .swagger-ui .pv4-ns { + padding-bottom: 2rem; + padding-top: 2rem; + } + .swagger-ui .pv5-ns { + padding-bottom: 4rem; + padding-top: 4rem; + } + .swagger-ui .pv6-ns { + padding-bottom: 8rem; + padding-top: 8rem; + } + .swagger-ui .pv7-ns { + padding-bottom: 16rem; + padding-top: 16rem; + } + .swagger-ui .ph0-ns { + padding-left: 0; + padding-right: 0; + } + .swagger-ui .ph1-ns { + padding-left: 0.25rem; + padding-right: 0.25rem; + } + .swagger-ui .ph2-ns { + padding-left: 0.5rem; + padding-right: 0.5rem; + } + .swagger-ui .ph3-ns { + padding-left: 1rem; + padding-right: 1rem; + } + .swagger-ui .ph4-ns { + padding-left: 2rem; + padding-right: 2rem; + } + .swagger-ui .ph5-ns { + padding-left: 4rem; + padding-right: 4rem; + } + .swagger-ui .ph6-ns { + padding-left: 8rem; + padding-right: 8rem; + } + .swagger-ui .ph7-ns { + padding-left: 16rem; + padding-right: 16rem; + } + .swagger-ui .ma0-ns { + margin: 0; + } + .swagger-ui .ma1-ns { + margin: 0.25rem; + } + .swagger-ui .ma2-ns { + margin: 0.5rem; + } + .swagger-ui .ma3-ns { + margin: 1rem; + } + .swagger-ui .ma4-ns { + margin: 2rem; + } + .swagger-ui .ma5-ns { + margin: 4rem; + } + .swagger-ui .ma6-ns { + margin: 8rem; + } + .swagger-ui .ma7-ns { + margin: 16rem; + } + .swagger-ui .ml0-ns { + margin-left: 0; + } + .swagger-ui .ml1-ns { + margin-left: 0.25rem; + } + .swagger-ui .ml2-ns { + margin-left: 0.5rem; + } + .swagger-ui .ml3-ns { + margin-left: 1rem; + } + .swagger-ui .ml4-ns { + margin-left: 2rem; + } + .swagger-ui .ml5-ns { + margin-left: 4rem; + } + .swagger-ui .ml6-ns { + margin-left: 8rem; + } + .swagger-ui .ml7-ns { + margin-left: 16rem; + } + .swagger-ui .mr0-ns { + margin-right: 0; + } + .swagger-ui .mr1-ns { + margin-right: 0.25rem; + } + .swagger-ui .mr2-ns { + margin-right: 0.5rem; + } + .swagger-ui .mr3-ns { + margin-right: 1rem; + } + .swagger-ui .mr4-ns { + margin-right: 2rem; + } + .swagger-ui .mr5-ns { + margin-right: 4rem; + } + .swagger-ui .mr6-ns { + margin-right: 8rem; + } + .swagger-ui .mr7-ns { + margin-right: 16rem; + } + .swagger-ui .mb0-ns { + margin-bottom: 0; + } + .swagger-ui .mb1-ns { + margin-bottom: 0.25rem; + } + .swagger-ui .mb2-ns { + margin-bottom: 0.5rem; + } + .swagger-ui .mb3-ns { + margin-bottom: 1rem; + } + .swagger-ui .mb4-ns { + margin-bottom: 2rem; + } + .swagger-ui .mb5-ns { + margin-bottom: 4rem; + } + .swagger-ui .mb6-ns { + margin-bottom: 8rem; + } + .swagger-ui .mb7-ns { + margin-bottom: 16rem; + } + .swagger-ui .mt0-ns { + margin-top: 0; + } + .swagger-ui .mt1-ns { + margin-top: 0.25rem; + } + .swagger-ui .mt2-ns { + margin-top: 0.5rem; + } + .swagger-ui .mt3-ns { + margin-top: 1rem; + } + .swagger-ui .mt4-ns { + margin-top: 2rem; + } + .swagger-ui .mt5-ns { + margin-top: 4rem; + } + .swagger-ui .mt6-ns { + margin-top: 8rem; + } + .swagger-ui .mt7-ns { + margin-top: 16rem; + } + .swagger-ui .mv0-ns { + margin-bottom: 0; + margin-top: 0; + } + .swagger-ui .mv1-ns { + margin-bottom: 0.25rem; + margin-top: 0.25rem; + } + .swagger-ui .mv2-ns { + margin-bottom: 0.5rem; + margin-top: 0.5rem; + } + .swagger-ui .mv3-ns { + margin-bottom: 1rem; + margin-top: 1rem; + } + .swagger-ui .mv4-ns { + margin-bottom: 2rem; + margin-top: 2rem; + } + .swagger-ui .mv5-ns { + margin-bottom: 4rem; + margin-top: 4rem; + } + .swagger-ui .mv6-ns { + margin-bottom: 8rem; + margin-top: 8rem; + } + .swagger-ui .mv7-ns { + margin-bottom: 16rem; + margin-top: 16rem; + } + .swagger-ui .mh0-ns { + margin-left: 0; + margin-right: 0; + } + .swagger-ui .mh1-ns { + margin-left: 0.25rem; + margin-right: 0.25rem; + } + .swagger-ui .mh2-ns { + margin-left: 0.5rem; + margin-right: 0.5rem; + } + .swagger-ui .mh3-ns { + margin-left: 1rem; + margin-right: 1rem; + } + .swagger-ui .mh4-ns { + margin-left: 2rem; + margin-right: 2rem; + } + .swagger-ui .mh5-ns { + margin-left: 4rem; + margin-right: 4rem; + } + .swagger-ui .mh6-ns { + margin-left: 8rem; + margin-right: 8rem; + } + .swagger-ui .mh7-ns { + margin-left: 16rem; + margin-right: 16rem; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .pa0-m { + padding: 0; + } + .swagger-ui .pa1-m { + padding: 0.25rem; + } + .swagger-ui .pa2-m { + padding: 0.5rem; + } + .swagger-ui .pa3-m { + padding: 1rem; + } + .swagger-ui .pa4-m { + padding: 2rem; + } + .swagger-ui .pa5-m { + padding: 4rem; + } + .swagger-ui .pa6-m { + padding: 8rem; + } + .swagger-ui .pa7-m { + padding: 16rem; + } + .swagger-ui .pl0-m { + padding-left: 0; + } + .swagger-ui .pl1-m { + padding-left: 0.25rem; + } + .swagger-ui .pl2-m { + padding-left: 0.5rem; + } + .swagger-ui .pl3-m { + padding-left: 1rem; + } + .swagger-ui .pl4-m { + padding-left: 2rem; + } + .swagger-ui .pl5-m { + padding-left: 4rem; + } + .swagger-ui .pl6-m { + padding-left: 8rem; + } + .swagger-ui .pl7-m { + padding-left: 16rem; + } + .swagger-ui .pr0-m { + padding-right: 0; + } + .swagger-ui .pr1-m { + padding-right: 0.25rem; + } + .swagger-ui .pr2-m { + padding-right: 0.5rem; + } + .swagger-ui .pr3-m { + padding-right: 1rem; + } + .swagger-ui .pr4-m { + padding-right: 2rem; + } + .swagger-ui .pr5-m { + padding-right: 4rem; + } + .swagger-ui .pr6-m { + padding-right: 8rem; + } + .swagger-ui .pr7-m { + padding-right: 16rem; + } + .swagger-ui .pb0-m { + padding-bottom: 0; + } + .swagger-ui .pb1-m { + padding-bottom: 0.25rem; + } + .swagger-ui .pb2-m { + padding-bottom: 0.5rem; + } + .swagger-ui .pb3-m { + padding-bottom: 1rem; + } + .swagger-ui .pb4-m { + padding-bottom: 2rem; + } + .swagger-ui .pb5-m { + padding-bottom: 4rem; + } + .swagger-ui .pb6-m { + padding-bottom: 8rem; + } + .swagger-ui .pb7-m { + padding-bottom: 16rem; + } + .swagger-ui .pt0-m { + padding-top: 0; + } + .swagger-ui .pt1-m { + padding-top: 0.25rem; + } + .swagger-ui .pt2-m { + padding-top: 0.5rem; + } + .swagger-ui .pt3-m { + padding-top: 1rem; + } + .swagger-ui .pt4-m { + padding-top: 2rem; + } + .swagger-ui .pt5-m { + padding-top: 4rem; + } + .swagger-ui .pt6-m { + padding-top: 8rem; + } + .swagger-ui .pt7-m { + padding-top: 16rem; + } + .swagger-ui .pv0-m { + padding-bottom: 0; + padding-top: 0; + } + .swagger-ui .pv1-m { + padding-bottom: 0.25rem; + padding-top: 0.25rem; + } + .swagger-ui .pv2-m { + padding-bottom: 0.5rem; + padding-top: 0.5rem; + } + .swagger-ui .pv3-m { + padding-bottom: 1rem; + padding-top: 1rem; + } + .swagger-ui .pv4-m { + padding-bottom: 2rem; + padding-top: 2rem; + } + .swagger-ui .pv5-m { + padding-bottom: 4rem; + padding-top: 4rem; + } + .swagger-ui .pv6-m { + padding-bottom: 8rem; + padding-top: 8rem; + } + .swagger-ui .pv7-m { + padding-bottom: 16rem; + padding-top: 16rem; + } + .swagger-ui .ph0-m { + padding-left: 0; + padding-right: 0; + } + .swagger-ui .ph1-m { + padding-left: 0.25rem; + padding-right: 0.25rem; + } + .swagger-ui .ph2-m { + padding-left: 0.5rem; + padding-right: 0.5rem; + } + .swagger-ui .ph3-m { + padding-left: 1rem; + padding-right: 1rem; + } + .swagger-ui .ph4-m { + padding-left: 2rem; + padding-right: 2rem; + } + .swagger-ui .ph5-m { + padding-left: 4rem; + padding-right: 4rem; + } + .swagger-ui .ph6-m { + padding-left: 8rem; + padding-right: 8rem; + } + .swagger-ui .ph7-m { + padding-left: 16rem; + padding-right: 16rem; + } + .swagger-ui .ma0-m { + margin: 0; + } + .swagger-ui .ma1-m { + margin: 0.25rem; + } + .swagger-ui .ma2-m { + margin: 0.5rem; + } + .swagger-ui .ma3-m { + margin: 1rem; + } + .swagger-ui .ma4-m { + margin: 2rem; + } + .swagger-ui .ma5-m { + margin: 4rem; + } + .swagger-ui .ma6-m { + margin: 8rem; + } + .swagger-ui .ma7-m { + margin: 16rem; + } + .swagger-ui .ml0-m { + margin-left: 0; + } + .swagger-ui .ml1-m { + margin-left: 0.25rem; + } + .swagger-ui .ml2-m { + margin-left: 0.5rem; + } + .swagger-ui .ml3-m { + margin-left: 1rem; + } + .swagger-ui .ml4-m { + margin-left: 2rem; + } + .swagger-ui .ml5-m { + margin-left: 4rem; + } + .swagger-ui .ml6-m { + margin-left: 8rem; + } + .swagger-ui .ml7-m { + margin-left: 16rem; + } + .swagger-ui .mr0-m { + margin-right: 0; + } + .swagger-ui .mr1-m { + margin-right: 0.25rem; + } + .swagger-ui .mr2-m { + margin-right: 0.5rem; + } + .swagger-ui .mr3-m { + margin-right: 1rem; + } + .swagger-ui .mr4-m { + margin-right: 2rem; + } + .swagger-ui .mr5-m { + margin-right: 4rem; + } + .swagger-ui .mr6-m { + margin-right: 8rem; + } + .swagger-ui .mr7-m { + margin-right: 16rem; + } + .swagger-ui .mb0-m { + margin-bottom: 0; + } + .swagger-ui .mb1-m { + margin-bottom: 0.25rem; + } + .swagger-ui .mb2-m { + margin-bottom: 0.5rem; + } + .swagger-ui .mb3-m { + margin-bottom: 1rem; + } + .swagger-ui .mb4-m { + margin-bottom: 2rem; + } + .swagger-ui .mb5-m { + margin-bottom: 4rem; + } + .swagger-ui .mb6-m { + margin-bottom: 8rem; + } + .swagger-ui .mb7-m { + margin-bottom: 16rem; + } + .swagger-ui .mt0-m { + margin-top: 0; + } + .swagger-ui .mt1-m { + margin-top: 0.25rem; + } + .swagger-ui .mt2-m { + margin-top: 0.5rem; + } + .swagger-ui .mt3-m { + margin-top: 1rem; + } + .swagger-ui .mt4-m { + margin-top: 2rem; + } + .swagger-ui .mt5-m { + margin-top: 4rem; + } + .swagger-ui .mt6-m { + margin-top: 8rem; + } + .swagger-ui .mt7-m { + margin-top: 16rem; + } + .swagger-ui .mv0-m { + margin-bottom: 0; + margin-top: 0; + } + .swagger-ui .mv1-m { + margin-bottom: 0.25rem; + margin-top: 0.25rem; + } + .swagger-ui .mv2-m { + margin-bottom: 0.5rem; + margin-top: 0.5rem; + } + .swagger-ui .mv3-m { + margin-bottom: 1rem; + margin-top: 1rem; + } + .swagger-ui .mv4-m { + margin-bottom: 2rem; + margin-top: 2rem; + } + .swagger-ui .mv5-m { + margin-bottom: 4rem; + margin-top: 4rem; + } + .swagger-ui .mv6-m { + margin-bottom: 8rem; + margin-top: 8rem; + } + .swagger-ui .mv7-m { + margin-bottom: 16rem; + margin-top: 16rem; + } + .swagger-ui .mh0-m { + margin-left: 0; + margin-right: 0; + } + .swagger-ui .mh1-m { + margin-left: 0.25rem; + margin-right: 0.25rem; + } + .swagger-ui .mh2-m { + margin-left: 0.5rem; + margin-right: 0.5rem; + } + .swagger-ui .mh3-m { + margin-left: 1rem; + margin-right: 1rem; + } + .swagger-ui .mh4-m { + margin-left: 2rem; + margin-right: 2rem; + } + .swagger-ui .mh5-m { + margin-left: 4rem; + margin-right: 4rem; + } + .swagger-ui .mh6-m { + margin-left: 8rem; + margin-right: 8rem; + } + .swagger-ui .mh7-m { + margin-left: 16rem; + margin-right: 16rem; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .pa0-l { + padding: 0; + } + .swagger-ui .pa1-l { + padding: 0.25rem; + } + .swagger-ui .pa2-l { + padding: 0.5rem; + } + .swagger-ui .pa3-l { + padding: 1rem; + } + .swagger-ui .pa4-l { + padding: 2rem; + } + .swagger-ui .pa5-l { + padding: 4rem; + } + .swagger-ui .pa6-l { + padding: 8rem; + } + .swagger-ui .pa7-l { + padding: 16rem; + } + .swagger-ui .pl0-l { + padding-left: 0; + } + .swagger-ui .pl1-l { + padding-left: 0.25rem; + } + .swagger-ui .pl2-l { + padding-left: 0.5rem; + } + .swagger-ui .pl3-l { + padding-left: 1rem; + } + .swagger-ui .pl4-l { + padding-left: 2rem; + } + .swagger-ui .pl5-l { + padding-left: 4rem; + } + .swagger-ui .pl6-l { + padding-left: 8rem; + } + .swagger-ui .pl7-l { + padding-left: 16rem; + } + .swagger-ui .pr0-l { + padding-right: 0; + } + .swagger-ui .pr1-l { + padding-right: 0.25rem; + } + .swagger-ui .pr2-l { + padding-right: 0.5rem; + } + .swagger-ui .pr3-l { + padding-right: 1rem; + } + .swagger-ui .pr4-l { + padding-right: 2rem; + } + .swagger-ui .pr5-l { + padding-right: 4rem; + } + .swagger-ui .pr6-l { + padding-right: 8rem; + } + .swagger-ui .pr7-l { + padding-right: 16rem; + } + .swagger-ui .pb0-l { + padding-bottom: 0; + } + .swagger-ui .pb1-l { + padding-bottom: 0.25rem; + } + .swagger-ui .pb2-l { + padding-bottom: 0.5rem; + } + .swagger-ui .pb3-l { + padding-bottom: 1rem; + } + .swagger-ui .pb4-l { + padding-bottom: 2rem; + } + .swagger-ui .pb5-l { + padding-bottom: 4rem; + } + .swagger-ui .pb6-l { + padding-bottom: 8rem; + } + .swagger-ui .pb7-l { + padding-bottom: 16rem; + } + .swagger-ui .pt0-l { + padding-top: 0; + } + .swagger-ui .pt1-l { + padding-top: 0.25rem; + } + .swagger-ui .pt2-l { + padding-top: 0.5rem; + } + .swagger-ui .pt3-l { + padding-top: 1rem; + } + .swagger-ui .pt4-l { + padding-top: 2rem; + } + .swagger-ui .pt5-l { + padding-top: 4rem; + } + .swagger-ui .pt6-l { + padding-top: 8rem; + } + .swagger-ui .pt7-l { + padding-top: 16rem; + } + .swagger-ui .pv0-l { + padding-bottom: 0; + padding-top: 0; + } + .swagger-ui .pv1-l { + padding-bottom: 0.25rem; + padding-top: 0.25rem; + } + .swagger-ui .pv2-l { + padding-bottom: 0.5rem; + padding-top: 0.5rem; + } + .swagger-ui .pv3-l { + padding-bottom: 1rem; + padding-top: 1rem; + } + .swagger-ui .pv4-l { + padding-bottom: 2rem; + padding-top: 2rem; + } + .swagger-ui .pv5-l { + padding-bottom: 4rem; + padding-top: 4rem; + } + .swagger-ui .pv6-l { + padding-bottom: 8rem; + padding-top: 8rem; + } + .swagger-ui .pv7-l { + padding-bottom: 16rem; + padding-top: 16rem; + } + .swagger-ui .ph0-l { + padding-left: 0; + padding-right: 0; + } + .swagger-ui .ph1-l { + padding-left: 0.25rem; + padding-right: 0.25rem; + } + .swagger-ui .ph2-l { + padding-left: 0.5rem; + padding-right: 0.5rem; + } + .swagger-ui .ph3-l { + padding-left: 1rem; + padding-right: 1rem; + } + .swagger-ui .ph4-l { + padding-left: 2rem; + padding-right: 2rem; + } + .swagger-ui .ph5-l { + padding-left: 4rem; + padding-right: 4rem; + } + .swagger-ui .ph6-l { + padding-left: 8rem; + padding-right: 8rem; + } + .swagger-ui .ph7-l { + padding-left: 16rem; + padding-right: 16rem; + } + .swagger-ui .ma0-l { + margin: 0; + } + .swagger-ui .ma1-l { + margin: 0.25rem; + } + .swagger-ui .ma2-l { + margin: 0.5rem; + } + .swagger-ui .ma3-l { + margin: 1rem; + } + .swagger-ui .ma4-l { + margin: 2rem; + } + .swagger-ui .ma5-l { + margin: 4rem; + } + .swagger-ui .ma6-l { + margin: 8rem; + } + .swagger-ui .ma7-l { + margin: 16rem; + } + .swagger-ui .ml0-l { + margin-left: 0; + } + .swagger-ui .ml1-l { + margin-left: 0.25rem; + } + .swagger-ui .ml2-l { + margin-left: 0.5rem; + } + .swagger-ui .ml3-l { + margin-left: 1rem; + } + .swagger-ui .ml4-l { + margin-left: 2rem; + } + .swagger-ui .ml5-l { + margin-left: 4rem; + } + .swagger-ui .ml6-l { + margin-left: 8rem; + } + .swagger-ui .ml7-l { + margin-left: 16rem; + } + .swagger-ui .mr0-l { + margin-right: 0; + } + .swagger-ui .mr1-l { + margin-right: 0.25rem; + } + .swagger-ui .mr2-l { + margin-right: 0.5rem; + } + .swagger-ui .mr3-l { + margin-right: 1rem; + } + .swagger-ui .mr4-l { + margin-right: 2rem; + } + .swagger-ui .mr5-l { + margin-right: 4rem; + } + .swagger-ui .mr6-l { + margin-right: 8rem; + } + .swagger-ui .mr7-l { + margin-right: 16rem; + } + .swagger-ui .mb0-l { + margin-bottom: 0; + } + .swagger-ui .mb1-l { + margin-bottom: 0.25rem; + } + .swagger-ui .mb2-l { + margin-bottom: 0.5rem; + } + .swagger-ui .mb3-l { + margin-bottom: 1rem; + } + .swagger-ui .mb4-l { + margin-bottom: 2rem; + } + .swagger-ui .mb5-l { + margin-bottom: 4rem; + } + .swagger-ui .mb6-l { + margin-bottom: 8rem; + } + .swagger-ui .mb7-l { + margin-bottom: 16rem; + } + .swagger-ui .mt0-l { + margin-top: 0; + } + .swagger-ui .mt1-l { + margin-top: 0.25rem; + } + .swagger-ui .mt2-l { + margin-top: 0.5rem; + } + .swagger-ui .mt3-l { + margin-top: 1rem; + } + .swagger-ui .mt4-l { + margin-top: 2rem; + } + .swagger-ui .mt5-l { + margin-top: 4rem; + } + .swagger-ui .mt6-l { + margin-top: 8rem; + } + .swagger-ui .mt7-l { + margin-top: 16rem; + } + .swagger-ui .mv0-l { + margin-bottom: 0; + margin-top: 0; + } + .swagger-ui .mv1-l { + margin-bottom: 0.25rem; + margin-top: 0.25rem; + } + .swagger-ui .mv2-l { + margin-bottom: 0.5rem; + margin-top: 0.5rem; + } + .swagger-ui .mv3-l { + margin-bottom: 1rem; + margin-top: 1rem; + } + .swagger-ui .mv4-l { + margin-bottom: 2rem; + margin-top: 2rem; + } + .swagger-ui .mv5-l { + margin-bottom: 4rem; + margin-top: 4rem; + } + .swagger-ui .mv6-l { + margin-bottom: 8rem; + margin-top: 8rem; + } + .swagger-ui .mv7-l { + margin-bottom: 16rem; + margin-top: 16rem; + } + .swagger-ui .mh0-l { + margin-left: 0; + margin-right: 0; + } + .swagger-ui .mh1-l { + margin-left: 0.25rem; + margin-right: 0.25rem; + } + .swagger-ui .mh2-l { + margin-left: 0.5rem; + margin-right: 0.5rem; + } + .swagger-ui .mh3-l { + margin-left: 1rem; + margin-right: 1rem; + } + .swagger-ui .mh4-l { + margin-left: 2rem; + margin-right: 2rem; + } + .swagger-ui .mh5-l { + margin-left: 4rem; + margin-right: 4rem; + } + .swagger-ui .mh6-l { + margin-left: 8rem; + margin-right: 8rem; + } + .swagger-ui .mh7-l { + margin-left: 16rem; + margin-right: 16rem; + } +} +.swagger-ui .na1 { + margin: -0.25rem; +} +.swagger-ui .na2 { + margin: -0.5rem; +} +.swagger-ui .na3 { + margin: -1rem; +} +.swagger-ui .na4 { + margin: -2rem; +} +.swagger-ui .na5 { + margin: -4rem; +} +.swagger-ui .na6 { + margin: -8rem; +} +.swagger-ui .na7 { + margin: -16rem; +} +.swagger-ui .nl1 { + margin-left: -0.25rem; +} +.swagger-ui .nl2 { + margin-left: -0.5rem; +} +.swagger-ui .nl3 { + margin-left: -1rem; +} +.swagger-ui .nl4 { + margin-left: -2rem; +} +.swagger-ui .nl5 { + margin-left: -4rem; +} +.swagger-ui .nl6 { + margin-left: -8rem; +} +.swagger-ui .nl7 { + margin-left: -16rem; +} +.swagger-ui .nr1 { + margin-right: -0.25rem; +} +.swagger-ui .nr2 { + margin-right: -0.5rem; +} +.swagger-ui .nr3 { + margin-right: -1rem; +} +.swagger-ui .nr4 { + margin-right: -2rem; +} +.swagger-ui .nr5 { + margin-right: -4rem; +} +.swagger-ui .nr6 { + margin-right: -8rem; +} +.swagger-ui .nr7 { + margin-right: -16rem; +} +.swagger-ui .nb1 { + margin-bottom: -0.25rem; +} +.swagger-ui .nb2 { + margin-bottom: -0.5rem; +} +.swagger-ui .nb3 { + margin-bottom: -1rem; +} +.swagger-ui .nb4 { + margin-bottom: -2rem; +} +.swagger-ui .nb5 { + margin-bottom: -4rem; +} +.swagger-ui .nb6 { + margin-bottom: -8rem; +} +.swagger-ui .nb7 { + margin-bottom: -16rem; +} +.swagger-ui .nt1 { + margin-top: -0.25rem; +} +.swagger-ui .nt2 { + margin-top: -0.5rem; +} +.swagger-ui .nt3 { + margin-top: -1rem; +} +.swagger-ui .nt4 { + margin-top: -2rem; +} +.swagger-ui .nt5 { + margin-top: -4rem; +} +.swagger-ui .nt6 { + margin-top: -8rem; +} +.swagger-ui .nt7 { + margin-top: -16rem; +} +@media screen and (min-width: 30em) { + .swagger-ui .na1-ns { + margin: -0.25rem; + } + .swagger-ui .na2-ns { + margin: -0.5rem; + } + .swagger-ui .na3-ns { + margin: -1rem; + } + .swagger-ui .na4-ns { + margin: -2rem; + } + .swagger-ui .na5-ns { + margin: -4rem; + } + .swagger-ui .na6-ns { + margin: -8rem; + } + .swagger-ui .na7-ns { + margin: -16rem; + } + .swagger-ui .nl1-ns { + margin-left: -0.25rem; + } + .swagger-ui .nl2-ns { + margin-left: -0.5rem; + } + .swagger-ui .nl3-ns { + margin-left: -1rem; + } + .swagger-ui .nl4-ns { + margin-left: -2rem; + } + .swagger-ui .nl5-ns { + margin-left: -4rem; + } + .swagger-ui .nl6-ns { + margin-left: -8rem; + } + .swagger-ui .nl7-ns { + margin-left: -16rem; + } + .swagger-ui .nr1-ns { + margin-right: -0.25rem; + } + .swagger-ui .nr2-ns { + margin-right: -0.5rem; + } + .swagger-ui .nr3-ns { + margin-right: -1rem; + } + .swagger-ui .nr4-ns { + margin-right: -2rem; + } + .swagger-ui .nr5-ns { + margin-right: -4rem; + } + .swagger-ui .nr6-ns { + margin-right: -8rem; + } + .swagger-ui .nr7-ns { + margin-right: -16rem; + } + .swagger-ui .nb1-ns { + margin-bottom: -0.25rem; + } + .swagger-ui .nb2-ns { + margin-bottom: -0.5rem; + } + .swagger-ui .nb3-ns { + margin-bottom: -1rem; + } + .swagger-ui .nb4-ns { + margin-bottom: -2rem; + } + .swagger-ui .nb5-ns { + margin-bottom: -4rem; + } + .swagger-ui .nb6-ns { + margin-bottom: -8rem; + } + .swagger-ui .nb7-ns { + margin-bottom: -16rem; + } + .swagger-ui .nt1-ns { + margin-top: -0.25rem; + } + .swagger-ui .nt2-ns { + margin-top: -0.5rem; + } + .swagger-ui .nt3-ns { + margin-top: -1rem; + } + .swagger-ui .nt4-ns { + margin-top: -2rem; + } + .swagger-ui .nt5-ns { + margin-top: -4rem; + } + .swagger-ui .nt6-ns { + margin-top: -8rem; + } + .swagger-ui .nt7-ns { + margin-top: -16rem; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .na1-m { + margin: -0.25rem; + } + .swagger-ui .na2-m { + margin: -0.5rem; + } + .swagger-ui .na3-m { + margin: -1rem; + } + .swagger-ui .na4-m { + margin: -2rem; + } + .swagger-ui .na5-m { + margin: -4rem; + } + .swagger-ui .na6-m { + margin: -8rem; + } + .swagger-ui .na7-m { + margin: -16rem; + } + .swagger-ui .nl1-m { + margin-left: -0.25rem; + } + .swagger-ui .nl2-m { + margin-left: -0.5rem; + } + .swagger-ui .nl3-m { + margin-left: -1rem; + } + .swagger-ui .nl4-m { + margin-left: -2rem; + } + .swagger-ui .nl5-m { + margin-left: -4rem; + } + .swagger-ui .nl6-m { + margin-left: -8rem; + } + .swagger-ui .nl7-m { + margin-left: -16rem; + } + .swagger-ui .nr1-m { + margin-right: -0.25rem; + } + .swagger-ui .nr2-m { + margin-right: -0.5rem; + } + .swagger-ui .nr3-m { + margin-right: -1rem; + } + .swagger-ui .nr4-m { + margin-right: -2rem; + } + .swagger-ui .nr5-m { + margin-right: -4rem; + } + .swagger-ui .nr6-m { + margin-right: -8rem; + } + .swagger-ui .nr7-m { + margin-right: -16rem; + } + .swagger-ui .nb1-m { + margin-bottom: -0.25rem; + } + .swagger-ui .nb2-m { + margin-bottom: -0.5rem; + } + .swagger-ui .nb3-m { + margin-bottom: -1rem; + } + .swagger-ui .nb4-m { + margin-bottom: -2rem; + } + .swagger-ui .nb5-m { + margin-bottom: -4rem; + } + .swagger-ui .nb6-m { + margin-bottom: -8rem; + } + .swagger-ui .nb7-m { + margin-bottom: -16rem; + } + .swagger-ui .nt1-m { + margin-top: -0.25rem; + } + .swagger-ui .nt2-m { + margin-top: -0.5rem; + } + .swagger-ui .nt3-m { + margin-top: -1rem; + } + .swagger-ui .nt4-m { + margin-top: -2rem; + } + .swagger-ui .nt5-m { + margin-top: -4rem; + } + .swagger-ui .nt6-m { + margin-top: -8rem; + } + .swagger-ui .nt7-m { + margin-top: -16rem; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .na1-l { + margin: -0.25rem; + } + .swagger-ui .na2-l { + margin: -0.5rem; + } + .swagger-ui .na3-l { + margin: -1rem; + } + .swagger-ui .na4-l { + margin: -2rem; + } + .swagger-ui .na5-l { + margin: -4rem; + } + .swagger-ui .na6-l { + margin: -8rem; + } + .swagger-ui .na7-l { + margin: -16rem; + } + .swagger-ui .nl1-l { + margin-left: -0.25rem; + } + .swagger-ui .nl2-l { + margin-left: -0.5rem; + } + .swagger-ui .nl3-l { + margin-left: -1rem; + } + .swagger-ui .nl4-l { + margin-left: -2rem; + } + .swagger-ui .nl5-l { + margin-left: -4rem; + } + .swagger-ui .nl6-l { + margin-left: -8rem; + } + .swagger-ui .nl7-l { + margin-left: -16rem; + } + .swagger-ui .nr1-l { + margin-right: -0.25rem; + } + .swagger-ui .nr2-l { + margin-right: -0.5rem; + } + .swagger-ui .nr3-l { + margin-right: -1rem; + } + .swagger-ui .nr4-l { + margin-right: -2rem; + } + .swagger-ui .nr5-l { + margin-right: -4rem; + } + .swagger-ui .nr6-l { + margin-right: -8rem; + } + .swagger-ui .nr7-l { + margin-right: -16rem; + } + .swagger-ui .nb1-l { + margin-bottom: -0.25rem; + } + .swagger-ui .nb2-l { + margin-bottom: -0.5rem; + } + .swagger-ui .nb3-l { + margin-bottom: -1rem; + } + .swagger-ui .nb4-l { + margin-bottom: -2rem; + } + .swagger-ui .nb5-l { + margin-bottom: -4rem; + } + .swagger-ui .nb6-l { + margin-bottom: -8rem; + } + .swagger-ui .nb7-l { + margin-bottom: -16rem; + } + .swagger-ui .nt1-l { + margin-top: -0.25rem; + } + .swagger-ui .nt2-l { + margin-top: -0.5rem; + } + .swagger-ui .nt3-l { + margin-top: -1rem; + } + .swagger-ui .nt4-l { + margin-top: -2rem; + } + .swagger-ui .nt5-l { + margin-top: -4rem; + } + .swagger-ui .nt6-l { + margin-top: -8rem; + } + .swagger-ui .nt7-l { + margin-top: -16rem; + } +} +.swagger-ui .collapse { + border-collapse: collapse; + border-spacing: 0; +} +.swagger-ui .striped--light-silver:nth-child(odd) { + background-color: #aaa; +} +.swagger-ui .striped--moon-gray:nth-child(odd) { + background-color: #ccc; +} +.swagger-ui .striped--light-gray:nth-child(odd) { + background-color: #eee; +} +.swagger-ui .striped--near-white:nth-child(odd) { + background-color: #f4f4f4; +} +.swagger-ui .stripe-light:nth-child(odd) { + background-color: hsla(0, 0%, 100%, 0.1); +} +.swagger-ui .stripe-dark:nth-child(odd) { + background-color: rgba(0, 0, 0, 0.1); +} +.swagger-ui .strike { + -webkit-text-decoration: line-through; + text-decoration: line-through; +} +.swagger-ui .underline { + -webkit-text-decoration: underline; + text-decoration: underline; +} +.swagger-ui .no-underline { + -webkit-text-decoration: none; + text-decoration: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .strike-ns { + -webkit-text-decoration: line-through; + text-decoration: line-through; + } + .swagger-ui .underline-ns { + -webkit-text-decoration: underline; + text-decoration: underline; + } + .swagger-ui .no-underline-ns { + -webkit-text-decoration: none; + text-decoration: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .strike-m { + -webkit-text-decoration: line-through; + text-decoration: line-through; + } + .swagger-ui .underline-m { + -webkit-text-decoration: underline; + text-decoration: underline; + } + .swagger-ui .no-underline-m { + -webkit-text-decoration: none; + text-decoration: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .strike-l { + -webkit-text-decoration: line-through; + text-decoration: line-through; + } + .swagger-ui .underline-l { + -webkit-text-decoration: underline; + text-decoration: underline; + } + .swagger-ui .no-underline-l { + -webkit-text-decoration: none; + text-decoration: none; + } +} +.swagger-ui .tl { + text-align: left; +} +.swagger-ui .tr { + text-align: right; +} +.swagger-ui .tc { + text-align: center; +} +.swagger-ui .tj { + text-align: justify; +} +@media screen and (min-width: 30em) { + .swagger-ui .tl-ns { + text-align: left; + } + .swagger-ui .tr-ns { + text-align: right; + } + .swagger-ui .tc-ns { + text-align: center; + } + .swagger-ui .tj-ns { + text-align: justify; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .tl-m { + text-align: left; + } + .swagger-ui .tr-m { + text-align: right; + } + .swagger-ui .tc-m { + text-align: center; + } + .swagger-ui .tj-m { + text-align: justify; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .tl-l { + text-align: left; + } + .swagger-ui .tr-l { + text-align: right; + } + .swagger-ui .tc-l { + text-align: center; + } + .swagger-ui .tj-l { + text-align: justify; + } +} +.swagger-ui .ttc { + text-transform: capitalize; +} +.swagger-ui .ttl { + text-transform: lowercase; +} +.swagger-ui .ttu { + text-transform: uppercase; +} +.swagger-ui .ttn { + text-transform: none; +} +@media screen and (min-width: 30em) { + .swagger-ui .ttc-ns { + text-transform: capitalize; + } + .swagger-ui .ttl-ns { + text-transform: lowercase; + } + .swagger-ui .ttu-ns { + text-transform: uppercase; + } + .swagger-ui .ttn-ns { + text-transform: none; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .ttc-m { + text-transform: capitalize; + } + .swagger-ui .ttl-m { + text-transform: lowercase; + } + .swagger-ui .ttu-m { + text-transform: uppercase; + } + .swagger-ui .ttn-m { + text-transform: none; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .ttc-l { + text-transform: capitalize; + } + .swagger-ui .ttl-l { + text-transform: lowercase; + } + .swagger-ui .ttu-l { + text-transform: uppercase; + } + .swagger-ui .ttn-l { + text-transform: none; + } +} +.swagger-ui .f-6, +.swagger-ui .f-headline { + font-size: 6rem; +} +.swagger-ui .f-5, +.swagger-ui .f-subheadline { + font-size: 5rem; +} +.swagger-ui .f1 { + font-size: 3rem; +} +.swagger-ui .f2 { + font-size: 2.25rem; +} +.swagger-ui .f3 { + font-size: 1.5rem; +} +.swagger-ui .f4 { + font-size: 1.25rem; +} +.swagger-ui .f5 { + font-size: 1rem; +} +.swagger-ui .f6 { + font-size: 0.875rem; +} +.swagger-ui .f7 { + font-size: 0.75rem; +} +@media screen and (min-width: 30em) { + .swagger-ui .f-6-ns, + .swagger-ui .f-headline-ns { + font-size: 6rem; + } + .swagger-ui .f-5-ns, + .swagger-ui .f-subheadline-ns { + font-size: 5rem; + } + .swagger-ui .f1-ns { + font-size: 3rem; + } + .swagger-ui .f2-ns { + font-size: 2.25rem; + } + .swagger-ui .f3-ns { + font-size: 1.5rem; + } + .swagger-ui .f4-ns { + font-size: 1.25rem; + } + .swagger-ui .f5-ns { + font-size: 1rem; + } + .swagger-ui .f6-ns { + font-size: 0.875rem; + } + .swagger-ui .f7-ns { + font-size: 0.75rem; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .f-6-m, + .swagger-ui .f-headline-m { + font-size: 6rem; + } + .swagger-ui .f-5-m, + .swagger-ui .f-subheadline-m { + font-size: 5rem; + } + .swagger-ui .f1-m { + font-size: 3rem; + } + .swagger-ui .f2-m { + font-size: 2.25rem; + } + .swagger-ui .f3-m { + font-size: 1.5rem; + } + .swagger-ui .f4-m { + font-size: 1.25rem; + } + .swagger-ui .f5-m { + font-size: 1rem; + } + .swagger-ui .f6-m { + font-size: 0.875rem; + } + .swagger-ui .f7-m { + font-size: 0.75rem; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .f-6-l, + .swagger-ui .f-headline-l { + font-size: 6rem; + } + .swagger-ui .f-5-l, + .swagger-ui .f-subheadline-l { + font-size: 5rem; + } + .swagger-ui .f1-l { + font-size: 3rem; + } + .swagger-ui .f2-l { + font-size: 2.25rem; + } + .swagger-ui .f3-l { + font-size: 1.5rem; + } + .swagger-ui .f4-l { + font-size: 1.25rem; + } + .swagger-ui .f5-l { + font-size: 1rem; + } + .swagger-ui .f6-l { + font-size: 0.875rem; + } + .swagger-ui .f7-l { + font-size: 0.75rem; + } +} +.swagger-ui .measure { + max-width: 30em; +} +.swagger-ui .measure-wide { + max-width: 34em; +} +.swagger-ui .measure-narrow { + max-width: 20em; +} +.swagger-ui .indent { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em; +} +.swagger-ui .small-caps { + font-feature-settings: "smcp"; + font-variant: small-caps; +} +.swagger-ui .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +@media screen and (min-width: 30em) { + .swagger-ui .measure-ns { + max-width: 30em; + } + .swagger-ui .measure-wide-ns { + max-width: 34em; + } + .swagger-ui .measure-narrow-ns { + max-width: 20em; + } + .swagger-ui .indent-ns { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em; + } + .swagger-ui .small-caps-ns { + font-feature-settings: "smcp"; + font-variant: small-caps; + } + .swagger-ui .truncate-ns { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .measure-m { + max-width: 30em; + } + .swagger-ui .measure-wide-m { + max-width: 34em; + } + .swagger-ui .measure-narrow-m { + max-width: 20em; + } + .swagger-ui .indent-m { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em; + } + .swagger-ui .small-caps-m { + font-feature-settings: "smcp"; + font-variant: small-caps; + } + .swagger-ui .truncate-m { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .measure-l { + max-width: 30em; + } + .swagger-ui .measure-wide-l { + max-width: 34em; + } + .swagger-ui .measure-narrow-l { + max-width: 20em; + } + .swagger-ui .indent-l { + margin-bottom: 0; + margin-top: 0; + text-indent: 1em; + } + .swagger-ui .small-caps-l { + font-feature-settings: "smcp"; + font-variant: small-caps; + } + .swagger-ui .truncate-l { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +.swagger-ui .overflow-container { + overflow-y: scroll; +} +.swagger-ui .center { + margin-left: auto; + margin-right: auto; +} +.swagger-ui .mr-auto { + margin-right: auto; +} +.swagger-ui .ml-auto { + margin-left: auto; +} +@media screen and (min-width: 30em) { + .swagger-ui .center-ns { + margin-left: auto; + margin-right: auto; + } + .swagger-ui .mr-auto-ns { + margin-right: auto; + } + .swagger-ui .ml-auto-ns { + margin-left: auto; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .center-m { + margin-left: auto; + margin-right: auto; + } + .swagger-ui .mr-auto-m { + margin-right: auto; + } + .swagger-ui .ml-auto-m { + margin-left: auto; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .center-l { + margin-left: auto; + margin-right: auto; + } + .swagger-ui .mr-auto-l { + margin-right: auto; + } + .swagger-ui .ml-auto-l { + margin-left: auto; + } +} +.swagger-ui .clip { + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + position: fixed !important; + _position: absolute !important; +} +@media screen and (min-width: 30em) { + .swagger-ui .clip-ns { + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + position: fixed !important; + _position: absolute !important; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .clip-m { + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + position: fixed !important; + _position: absolute !important; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .clip-l { + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + position: fixed !important; + _position: absolute !important; + } +} +.swagger-ui .ws-normal { + white-space: normal; +} +.swagger-ui .nowrap { + white-space: nowrap; +} +.swagger-ui .pre { + white-space: pre; +} +@media screen and (min-width: 30em) { + .swagger-ui .ws-normal-ns { + white-space: normal; + } + .swagger-ui .nowrap-ns { + white-space: nowrap; + } + .swagger-ui .pre-ns { + white-space: pre; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .ws-normal-m { + white-space: normal; + } + .swagger-ui .nowrap-m { + white-space: nowrap; + } + .swagger-ui .pre-m { + white-space: pre; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .ws-normal-l { + white-space: normal; + } + .swagger-ui .nowrap-l { + white-space: nowrap; + } + .swagger-ui .pre-l { + white-space: pre; + } +} +.swagger-ui .v-base { + vertical-align: baseline; +} +.swagger-ui .v-mid { + vertical-align: middle; +} +.swagger-ui .v-top { + vertical-align: top; +} +.swagger-ui .v-btm { + vertical-align: bottom; +} +@media screen and (min-width: 30em) { + .swagger-ui .v-base-ns { + vertical-align: baseline; + } + .swagger-ui .v-mid-ns { + vertical-align: middle; + } + .swagger-ui .v-top-ns { + vertical-align: top; + } + .swagger-ui .v-btm-ns { + vertical-align: bottom; + } +} +@media screen and (min-width: 30em) and (max-width: 60em) { + .swagger-ui .v-base-m { + vertical-align: baseline; + } + .swagger-ui .v-mid-m { + vertical-align: middle; + } + .swagger-ui .v-top-m { + vertical-align: top; + } + .swagger-ui .v-btm-m { + vertical-align: bottom; + } +} +@media screen and (min-width: 60em) { + .swagger-ui .v-base-l { + vertical-align: baseline; + } + .swagger-ui .v-mid-l { + vertical-align: middle; + } + .swagger-ui .v-top-l { + vertical-align: top; + } + .swagger-ui .v-btm-l { + vertical-align: bottom; + } +} +.swagger-ui .dim { + opacity: 1; + transition: opacity 0.15s ease-in; +} +.swagger-ui .dim:focus, +.swagger-ui .dim:hover { + opacity: 0.5; + transition: opacity 0.15s ease-in; +} +.swagger-ui .dim:active { + opacity: 0.8; + transition: opacity 0.15s ease-out; +} +.swagger-ui .glow { + transition: opacity 0.15s ease-in; +} +.swagger-ui .glow:focus, +.swagger-ui .glow:hover { + opacity: 1; + transition: opacity 0.15s ease-in; +} +.swagger-ui .hide-child .child { + opacity: 0; + transition: opacity 0.15s ease-in; +} +.swagger-ui .hide-child:active .child, +.swagger-ui .hide-child:focus .child, +.swagger-ui .hide-child:hover .child { + opacity: 1; + transition: opacity 0.15s ease-in; +} +.swagger-ui .underline-hover:focus, +.swagger-ui .underline-hover:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} +.swagger-ui .grow { + -moz-osx-font-smoothing: grayscale; + backface-visibility: hidden; + transform: translateZ(0); + transition: transform 0.25s ease-out; +} +.swagger-ui .grow:focus, +.swagger-ui .grow:hover { + transform: scale(1.05); +} +.swagger-ui .grow:active { + transform: scale(0.9); +} +.swagger-ui .grow-large { + -moz-osx-font-smoothing: grayscale; + backface-visibility: hidden; + transform: translateZ(0); + transition: transform 0.25s ease-in-out; +} +.swagger-ui .grow-large:focus, +.swagger-ui .grow-large:hover { + transform: scale(1.2); +} +.swagger-ui .grow-large:active { + transform: scale(0.95); +} +.swagger-ui .pointer:hover { + cursor: pointer; +} +.swagger-ui .shadow-hover { + cursor: pointer; + position: relative; + transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); +} +.swagger-ui .shadow-hover:after { + border-radius: inherit; + box-shadow: 0 0 16px 2px rgba(0, 0, 0, 0.2); + content: ""; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); + width: 100%; + z-index: -1; +} +.swagger-ui .shadow-hover:focus:after, +.swagger-ui .shadow-hover:hover:after { + opacity: 1; +} +.swagger-ui .bg-animate, +.swagger-ui .bg-animate:focus, +.swagger-ui .bg-animate:hover { + transition: background-color 0.15s ease-in-out; +} +.swagger-ui .z-0 { + z-index: 0; +} +.swagger-ui .z-1 { + z-index: 1; +} +.swagger-ui .z-2 { + z-index: 2; +} +.swagger-ui .z-3 { + z-index: 3; +} +.swagger-ui .z-4 { + z-index: 4; +} +.swagger-ui .z-5 { + z-index: 5; +} +.swagger-ui .z-999 { + z-index: 999; +} +.swagger-ui .z-9999 { + z-index: 9999; +} +.swagger-ui .z-max { + z-index: 2147483647; +} +.swagger-ui .z-inherit { + z-index: inherit; +} +.swagger-ui .z-initial, +.swagger-ui .z-unset { + z-index: auto; +} +.swagger-ui .nested-copy-line-height ol, +.swagger-ui .nested-copy-line-height p, +.swagger-ui .nested-copy-line-height ul { + line-height: 1.5; +} +.swagger-ui .nested-headline-line-height h1, +.swagger-ui .nested-headline-line-height h2, +.swagger-ui .nested-headline-line-height h3, +.swagger-ui .nested-headline-line-height h4, +.swagger-ui .nested-headline-line-height h5, +.swagger-ui .nested-headline-line-height h6 { + line-height: 1.25; +} +.swagger-ui .nested-list-reset ol, +.swagger-ui .nested-list-reset ul { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} +.swagger-ui .nested-copy-indent p + p { + margin-bottom: 0; + margin-top: 0; + text-indent: 0.1em; +} +.swagger-ui .nested-copy-seperator p + p { + margin-top: 1.5em; +} +.swagger-ui .nested-img img { + display: block; + max-width: 100%; + width: 100%; +} +.swagger-ui .nested-links a { + color: #357edd; + transition: color 0.15s ease-in; +} +.swagger-ui .nested-links a:focus, +.swagger-ui .nested-links a:hover { + color: #96ccff; + transition: color 0.15s ease-in; +} +.swagger-ui .wrapper { + box-sizing: border-box; + margin: 0 auto; + max-width: 1460px; + padding: 0 20px; + width: 100%; +} +.swagger-ui .wrapper section section.models.is-open { + background-color: #272a35; +} +.swagger-ui .wrapper section section div { + background-color: #272a35; +} +.swagger-ui .wrapper section section div.no-margin div { + background-color: #1e2129; +} +.swagger-ui .wrapper section div { + background-color: #1e2129; +} +.swagger-ui .opblock-tag-section { + display: flex; + flex-direction: column; +} +.swagger-ui .try-out.btn-group { + display: flex; + flex: 0.1 2 auto; + padding: 0; +} +.swagger-ui .try-out__btn { + margin-left: 1.25rem; +} +.swagger-ui .opblock-tag { + align-items: center; + border-bottom: 1px solid rgba(59, 65, 81, 0.3); + cursor: pointer; + display: flex; + padding: 10px 20px 10px 10px; + transition: all 0.2s; +} +.swagger-ui .opblock-tag:hover { + background: rgba(0, 0, 0, 0.02); +} +.swagger-ui .opblock-tag { + color: #8b8d95; + font-family: sans-serif; + font-size: 24px; + margin: 0 0 5px; +} +.swagger-ui .opblock-tag.no-desc span { + flex: 1; +} +.swagger-ui .opblock-tag svg { + transition: all 0.4s; +} +.swagger-ui .opblock-tag small { + color: #8b8d95; + flex: 2; + font-family: sans-serif; + font-size: 14px; + font-weight: 400; + padding: 0 10px; +} +.swagger-ui .opblock-tag > div { + flex: 1 1 150px; + font-weight: 400; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +@media (max-width: 640px) { + .swagger-ui .opblock-tag small, + .swagger-ui .opblock-tag > div { + flex: 1; + } +} +.swagger-ui .opblock-tag .info__externaldocs { + text-align: right; +} +.swagger-ui .parameter__type { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 600; + padding: 5px 0; +} +.swagger-ui .parameter-controls { + margin-top: 0.75em; +} +.swagger-ui .examples__title { + display: block; + font-size: 1.1em; + font-weight: 700; + margin-bottom: 0.75em; +} +.swagger-ui .examples__section { + margin-top: 1.5em; +} +.swagger-ui .examples__section-header { + font-size: 0.9rem; + font-weight: 700; + margin-bottom: 0.5rem; +} +.swagger-ui .examples-select { + display: inline-block; + margin-bottom: 0.75em; +} +.swagger-ui .examples-select .examples-select-element { + width: 100%; +} +.swagger-ui .examples-select__section-label { + font-size: 0.9rem; + font-weight: 700; + margin-right: 0.5rem; +} +.swagger-ui .example__section { + margin-top: 1.5em; +} +.swagger-ui .example__section-header { + font-size: 0.9rem; + font-weight: 700; + margin-bottom: 0.5rem; +} +.swagger-ui .view-line-link { + cursor: pointer; + margin: 0 5px; + position: relative; + top: 3px; + transition: all 0.5s; + width: 20px; +} +.swagger-ui .opblock { + border: 1px solid #000; + border-radius: 4px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.19); + margin: 0 0 15px; +} +.swagger-ui .opblock .tab-header { + display: flex; + flex: 1; +} +.swagger-ui .opblock .tab-header .tab-item { + cursor: pointer; + padding: 0 40px; +} +.swagger-ui .opblock .tab-header .tab-item:first-of-type { + padding: 0 40px 0 0; +} +.swagger-ui .opblock .tab-header .tab-item.active h4 span { + position: relative; +} +.swagger-ui .opblock .tab-header .tab-item.active h4 span:after { + background: gray; + bottom: -15px; + content: ""; + height: 4px; + left: 50%; + position: absolute; + transform: translateX(-50%); + width: 120%; +} +.swagger-ui .opblock.is-open .opblock-summary { + border-bottom: 1px solid #000; +} +.swagger-ui .opblock .opblock-section-header { + align-items: center; + background: #1e2129; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + display: flex; + min-height: 50px; + padding: 8px 20px; +} +.swagger-ui .opblock .opblock-section-header > label { + align-items: center; + color: #8b8d95; + display: flex; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: 0 0 0 auto; +} +.swagger-ui .opblock .opblock-section-header > label > span { + padding: 0 10px 0 0; +} +.swagger-ui .opblock .opblock-section-header h4 { + color: #8b8d95; + flex: 1; + font-family: sans-serif; + font-size: 14px; + margin: 0; +} +.swagger-ui .opblock .opblock-summary-method { + background: #000; + border-radius: 3px; + color: #fff; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + min-width: 80px; + padding: 6px 0; + text-align: center; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); +} +@media (max-width: 768px) { + .swagger-ui .opblock .opblock-summary-method { + font-size: 12px; + } +} +.swagger-ui .opblock .opblock-summary-operation-id, +.swagger-ui .opblock .opblock-summary-path, +.swagger-ui .opblock .opblock-summary-path__deprecated { + align-items: center; + color: #8b8d95; + display: flex; + font-family: monospace; + font-size: 16px; + font-weight: 600; + word-break: break-word; +} +@media (max-width: 768px) { + .swagger-ui .opblock .opblock-summary-operation-id, + .swagger-ui .opblock .opblock-summary-path, + .swagger-ui .opblock .opblock-summary-path__deprecated { + font-size: 12px; + } +} +.swagger-ui .opblock .opblock-summary-path { + flex-shrink: 0; +} +@media (max-width: 640px) { + .swagger-ui .opblock .opblock-summary-path { + flex-shrink: 1; + max-width: 100%; + } +} +.swagger-ui .opblock .opblock-summary-path__deprecated { + -webkit-text-decoration: line-through; + text-decoration: line-through; +} +.swagger-ui .opblock .opblock-summary-operation-id { + font-size: 14px; +} +.swagger-ui .opblock .opblock-summary-description { + color: #8b8d95; + font-family: sans-serif; + font-size: 13px; + word-break: break-word; +} +.swagger-ui .opblock .opblock-summary-path-description-wrapper { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 0 10px; + padding: 0 10px; + width: 100%; +} +@media (max-width: 550px) { + .swagger-ui .opblock .opblock-summary-path-description-wrapper { + align-items: start; + flex-direction: column; + } +} +.swagger-ui .opblock .opblock-summary { + align-items: center; + cursor: pointer; + display: flex; + padding: 5px; +} +.swagger-ui .opblock .opblock-summary .view-line-link { + cursor: pointer; + margin: 0; + position: relative; + top: 2px; + transition: all 0.5s; + width: 0; +} +.swagger-ui .opblock .opblock-summary:hover .view-line-link { + margin: 0 5px; + width: 18px; +} +.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard { + width: 24px; +} +.swagger-ui .opblock.opblock-post { + background: rgba(73, 204, 144, 0.1); + border-color: #49cc90; +} +.swagger-ui .opblock.opblock-post .opblock-summary-method { + background: #49cc90; +} +.swagger-ui .opblock.opblock-post .opblock-summary { + border-color: #49cc90; +} +.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after { + background: #49cc90; +} +.swagger-ui .opblock.opblock-put { + background: rgba(252, 161, 48, 0.1); + border-color: #fca130; +} +.swagger-ui .opblock.opblock-put .opblock-summary-method { + background: #fca130; +} +.swagger-ui .opblock.opblock-put .opblock-summary { + border-color: #fca130; +} +.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after { + background: #fca130; +} +.swagger-ui .opblock.opblock-delete { + background: rgba(249, 62, 62, 0.1); + border-color: #f93e3e; +} +.swagger-ui .opblock.opblock-delete .opblock-summary-method { + background: #f93e3e; +} +.swagger-ui .opblock.opblock-delete .opblock-summary { + border-color: #f93e3e; +} +.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after { + background: #f93e3e; +} +.swagger-ui .opblock.opblock-get { + background: rgba(97, 175, 254, 0.1); + border-color: #61affe; +} +.swagger-ui .opblock.opblock-get .opblock-summary-method { + background: #61affe; +} +.swagger-ui .opblock.opblock-get .opblock-summary { + border-color: #61affe; +} +.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after { + background: #61affe; +} +.swagger-ui .opblock.opblock-patch { + background: rgba(80, 227, 194, 0.1); + border-color: #50e3c2; +} +.swagger-ui .opblock.opblock-patch .opblock-summary-method { + background: #50e3c2; +} +.swagger-ui .opblock.opblock-patch .opblock-summary { + border-color: #50e3c2; +} +.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after { + background: #50e3c2; +} +.swagger-ui .opblock.opblock-head { + background: rgba(144, 18, 254, 0.1); + border-color: #9012fe; +} +.swagger-ui .opblock.opblock-head .opblock-summary-method { + background: #9012fe; +} +.swagger-ui .opblock.opblock-head .opblock-summary { + border-color: #9012fe; +} +.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after { + background: #9012fe; +} +.swagger-ui .opblock.opblock-options { + background: rgba(13, 90, 167, 0.1); + border-color: #0d5aa7; +} +.swagger-ui .opblock.opblock-options .opblock-summary-method { + background: #0d5aa7; +} +.swagger-ui .opblock.opblock-options .opblock-summary { + border-color: #0d5aa7; +} +.swagger-ui + .opblock.opblock-options + .tab-header + .tab-item.active + h4 + span:after { + background: #0d5aa7; +} +.swagger-ui .opblock.opblock-deprecated { + background: hsla(0, 0%, 92%, 0.1); + border-color: #ebebeb; + opacity: 0.6; +} +.swagger-ui .opblock.opblock-deprecated .opblock-summary-method { + background: #ebebeb; +} +.swagger-ui .opblock.opblock-deprecated .opblock-summary { + border-color: #ebebeb; +} +.swagger-ui + .opblock.opblock-deprecated + .tab-header + .tab-item.active + h4 + span:after { + background: #ebebeb; +} +.swagger-ui .opblock .opblock-schemes { + padding: 8px 20px; +} +.swagger-ui .opblock .opblock-schemes .schemes-title { + padding: 0 10px 0 0; +} +.swagger-ui .filter .operation-filter-input { + border: 2px solid #d8dde7; + margin: 20px 0; + padding: 10px; + width: 100%; +} +.swagger-ui .download-url-wrapper .failed, +.swagger-ui .filter .failed { + color: red; +} +.swagger-ui .download-url-wrapper .loading, +.swagger-ui .filter .loading { + color: #aaa; +} +.swagger-ui .model-example { + margin-top: 1em; +} +.swagger-ui .tab { + display: flex; + list-style: none; + padding: 0; +} +.swagger-ui .tab li { + color: #8b8d95; + cursor: pointer; + font-family: sans-serif; + font-size: 12px; + min-width: 60px; + padding: 0; +} +.swagger-ui .tab li:first-of-type { + padding-left: 0; + padding-right: 12px; + position: relative; +} +.swagger-ui .tab li:first-of-type:after { + background: rgba(0, 0, 0, 0.2); + content: ""; + height: 100%; + position: absolute; + right: 6px; + top: 0; + width: 1px; +} +.swagger-ui .tab li.active { + font-weight: 700; +} +.swagger-ui .tab li button.tablinks { + background: none; + border: 0; + color: inherit; + font-family: inherit; + font-weight: inherit; + padding: 0; +} +.swagger-ui .opblock-description-wrapper, +.swagger-ui .opblock-external-docs-wrapper, +.swagger-ui .opblock-title_normal { + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px; + padding: 15px 20px; +} +.swagger-ui .opblock-description-wrapper h4, +.swagger-ui .opblock-external-docs-wrapper h4, +.swagger-ui .opblock-title_normal h4 { + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px; +} +.swagger-ui .opblock-description-wrapper p, +.swagger-ui .opblock-external-docs-wrapper p, +.swagger-ui .opblock-title_normal p { + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; + margin: 0; +} +.swagger-ui .opblock-external-docs-wrapper h4 { + padding-left: 0; +} +.swagger-ui .execute-wrapper { + padding: 20px; + text-align: right; +} +.swagger-ui .execute-wrapper .btn { + padding: 8px 40px; + width: 100%; +} +.swagger-ui .body-param-options { + display: flex; + flex-direction: column; +} +.swagger-ui .body-param-options .body-param-edit { + padding: 10px 0; +} +.swagger-ui .body-param-options label { + padding: 8px 0; +} +.swagger-ui .body-param-options label select { + margin: 3px 0 0; +} +.swagger-ui .responses-inner { + padding: 20px; +} +.swagger-ui .responses-inner h4, +.swagger-ui .responses-inner h5 { + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + margin: 10px 0 5px; +} +.swagger-ui .responses-inner .curl { + white-space: normal; +} +.swagger-ui .response-col_status { + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; +} +.swagger-ui .response-col_status .response-undocumented { + color: #909090; + font-family: monospace; + font-size: 11px; + font-weight: 600; +} +.swagger-ui .response-col_links { + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; + max-width: 40em; + padding-left: 2em; +} +.swagger-ui .response-col_links .response-undocumented { + color: #909090; + font-family: monospace; + font-size: 11px; + font-weight: 600; +} +.swagger-ui .response-col_links .operation-link { + margin-bottom: 1.5em; +} +.swagger-ui .response-col_links .operation-link .description { + margin-bottom: 0.5em; +} +.swagger-ui .opblock-body .opblock-loading-animation { + display: block; + margin: 3em auto; +} +.swagger-ui .opblock-body pre.microlight { + word-wrap: break-word; + background: #333; + border-radius: 4px; + color: #fff; + font-family: monospace; + font-size: 12px; + font-weight: 600; + -webkit-hyphens: auto; + hyphens: auto; + margin: 0; + padding: 10px; + white-space: pre-wrap; + word-break: break-all; + word-break: break-word; +} +.swagger-ui .opblock-body pre.microlight .headerline { + display: block; +} +.swagger-ui .highlight-code { + position: relative; +} +.swagger-ui .highlight-code > .microlight { + max-height: 400px; + min-height: 6em; + overflow-y: auto; +} +.swagger-ui .highlight-code > .microlight code { + white-space: pre-wrap !important; + word-break: break-all; +} +.swagger-ui .curl-command { + position: relative; +} +.swagger-ui .download-contents { + align-items: center; + background: #7d8293; + border: none; + border-radius: 4px; + bottom: 10px; + color: #fff; + display: flex; + font-family: sans-serif; + font-size: 14px; + font-weight: 600; + height: 30px; + justify-content: center; + padding: 5px; + position: absolute; + right: 10px; + text-align: center; +} +.swagger-ui .scheme-container { + background: #272a35; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15); + margin: 0 0 20px; + padding: 30px 0; +} +.swagger-ui .scheme-container .schemes { + align-items: flex-end; + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: space-between; +} +.swagger-ui .scheme-container .schemes > label { + color: #8b8d95; + display: flex; + flex-direction: column; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: -20px 15px 0 0; +} +.swagger-ui .scheme-container .schemes > label select { + min-width: 130px; + text-transform: uppercase; +} +.swagger-ui .scheme-container .schemes .auth-wrapper { + flex: none; + justify-content: none; +} +.swagger-ui .scheme-container .schemes .auth-wrapper .authorize { + display: flex; + flex-wrap: nowrap; + margin: 0; + padding-right: 20px; +} +.swagger-ui .loading-container { + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + margin-top: 1em; + min-height: 1px; + padding: 40px 0 60px; +} +.swagger-ui .loading-container .loading { + position: relative; +} +.swagger-ui .loading-container .loading:after { + color: #8b8d95; + content: "loading"; + font-family: sans-serif; + font-size: 10px; + font-weight: 700; + left: 50%; + position: absolute; + text-transform: uppercase; + top: 50%; + transform: translate(-50%, -50%); +} +.swagger-ui .loading-container .loading:before { + animation: rotation 1s linear infinite, opacity 0.5s; + backface-visibility: hidden; + border: 2px solid rgba(85, 85, 85, 0.1); + border-radius: 100%; + border-top-color: rgba(0, 0, 0, 0.6); + content: ""; + display: block; + height: 60px; + left: 50%; + margin: -30px; + opacity: 1; + position: absolute; + top: 50%; + width: 60px; +} +@keyframes rotation { + to { + transform: rotate(1turn); + } +} +.swagger-ui .response-controls { + display: flex; + padding-top: 1em; +} +.swagger-ui .response-control-media-type { + margin-right: 1em; +} +.swagger-ui .response-control-media-type--accept-controller select { + border-color: green; +} +.swagger-ui .response-control-media-type__accept-message { + color: green; + font-size: 0.7em; +} +.swagger-ui .response-control-examples__title, +.swagger-ui .response-control-media-type__title { + display: block; + font-size: 0.7em; + margin-bottom: 0.2em; +} +@keyframes blinker { + 50% { + opacity: 0; + } +} +.swagger-ui .hidden { + display: none; +} +.swagger-ui .no-margin { + border: none; + height: auto; + margin: 0; + padding: 0; +} +.swagger-ui .float-right { + float: right; +} +.swagger-ui .svg-assets { + height: 0; + position: absolute; + width: 0; +} +.swagger-ui section h3 { + color: #8b8d95; + font-family: sans-serif; +} +.swagger-ui a.nostyle { + display: inline; +} +.swagger-ui a.nostyle, +.swagger-ui a.nostyle:visited { + color: inherit; + cursor: pointer; + text-decoration: inherit; +} +.swagger-ui .fallback { + color: #aaa; + padding: 1em; +} +.swagger-ui .version-pragma { + height: 100%; + padding: 5em 0; +} +.swagger-ui .version-pragma__message { + display: flex; + font-size: 1.2em; + height: 100%; + justify-content: center; + line-height: 1.5em; + padding: 0 0.6em; + text-align: center; +} +.swagger-ui .version-pragma__message > div { + flex: 1; + max-width: 55ch; +} +.swagger-ui .version-pragma__message code { + background-color: #dedede; + padding: 4px 4px 2px; + white-space: pre; +} +.swagger-ui .opblock-link { + font-weight: 400; +} +.swagger-ui .opblock-link.shown { + font-weight: 700; +} +.swagger-ui span.token-string { + color: #555; +} +.swagger-ui span.token-not-formatted { + color: #555; + font-weight: 700; +} +.swagger-ui .btn { + background: transparent; + border: 2px solid gray; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + padding: 5px 23px; + transition: all 0.3s; +} +.swagger-ui .btn.btn-sm { + font-size: 12px; + padding: 4px 23px; +} +.swagger-ui .btn[disabled] { + cursor: not-allowed; + opacity: 0.3; +} +.swagger-ui .btn:hover { + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.swagger-ui .btn.cancel { + background-color: transparent; + border-color: #ff6060; + color: #ff6060; + font-family: sans-serif; +} +.swagger-ui .btn.authorize { + background-color: transparent; + border-color: #49cc90; + color: #49cc90; + display: inline; + line-height: 1; +} +.swagger-ui .btn.authorize span { + float: left; + padding: 4px 20px 0 0; +} +.swagger-ui .btn.authorize svg { + fill: #49cc90; +} +.swagger-ui .btn.execute { + background-color: #4990e2; + border-color: #4990e2; + color: #fff; +} +.swagger-ui .btn-group { + display: flex; + padding: 30px; +} +.swagger-ui .btn-group .btn { + flex: 1; +} +.swagger-ui .btn-group .btn:first-child { + border-radius: 4px 0 0 4px; +} +.swagger-ui .btn-group .btn:last-child { + border-radius: 0 4px 4px 0; +} +.swagger-ui .authorization__btn { + background: none; + border: none; + padding: 0 0 0 10px; +} +.swagger-ui .authorization__btn .locked { + opacity: 1; +} +.swagger-ui .authorization__btn .unlocked { + opacity: 0.4; +} +.swagger-ui .model-box-control, +.swagger-ui .models-control, +.swagger-ui .opblock-summary-control { + all: inherit; + border-bottom: 0; + cursor: pointer; + flex: 1; + padding: 0; +} +.swagger-ui .model-box-control:focus, +.swagger-ui .models-control:focus, +.swagger-ui .opblock-summary-control:focus { + outline: auto; +} +.swagger-ui .expand-methods, +.swagger-ui .expand-operation { + background: none; + border: none; +} +.swagger-ui .expand-methods svg, +.swagger-ui .expand-operation svg { + height: 20px; + width: 20px; +} +.swagger-ui .expand-methods { + padding: 0 10px; +} +.swagger-ui .expand-methods:hover svg { + fill: #404040; +} +.swagger-ui .expand-methods svg { + fill: #707070; + transition: all 0.3s; +} +.swagger-ui button { + cursor: pointer; +} +.swagger-ui button.invalid { + animation: shake 0.4s 1; + background: #feebeb; + border-color: #f93e3e; +} +.swagger-ui .copy-to-clipboard { + align-items: center; + background: #7d8293; + border: none; + border-radius: 4px; + bottom: 10px; + display: flex; + height: 30px; + justify-content: center; + position: absolute; + right: 100px; + width: 30px; +} +.swagger-ui .copy-to-clipboard button { + background: url('data:image/svg+xml;charset=utf-8,') + 50% no-repeat; + border: none; + flex-grow: 1; + flex-shrink: 1; + height: 25px; +} +.swagger-ui .copy-to-clipboard:active { + background: #5e626f; +} +.swagger-ui .opblock-control-arrow { + background: none; + border: none; + text-align: center; +} +.swagger-ui .curl-command .copy-to-clipboard { + bottom: 5px; + height: 20px; + right: 10px; + width: 20px; +} +.swagger-ui .curl-command .copy-to-clipboard button { + height: 18px; +} +.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard { + height: 26px; + position: static; +} +.swagger-ui select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: #3b3b3b + url('data:image/svg+xml;charset=utf-8,') + right 10px center no-repeat; + background-size: 20px; + border: 2px solid #41444e; + border-radius: 4px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.25); + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; + font-weight: 700; + padding: 5px 40px 5px 10px; +} +.swagger-ui select[multiple] { + background: #3b3b3b; + margin: 5px 0; + padding: 5px; +} +.swagger-ui select.invalid { + animation: shake 0.4s 1; + background: #feebeb; + border-color: #f93e3e; +} +.swagger-ui .opblock-body select { + min-width: 230px; +} +@media (max-width: 768px) { + .swagger-ui .opblock-body select { + min-width: 180px; + } +} +@media (max-width: 640px) { + .swagger-ui .opblock-body select { + min-width: 100%; + width: 100%; + } +} +.swagger-ui label { + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + margin: 0 0 5px; +} +.swagger-ui input[type="email"], +.swagger-ui input[type="file"], +.swagger-ui input[type="password"], +.swagger-ui input[type="search"], +.swagger-ui input[type="text"] { + line-height: 1; +} +@media (max-width: 768px) { + .swagger-ui input[type="email"], + .swagger-ui input[type="file"], + .swagger-ui input[type="password"], + .swagger-ui input[type="search"], + .swagger-ui input[type="text"] { + max-width: 175px; + } +} +.swagger-ui input[type="email"], +.swagger-ui input[type="file"], +.swagger-ui input[type="password"], +.swagger-ui input[type="search"], +.swagger-ui input[type="text"], +.swagger-ui textarea { + background: #8b8d95; + border: 1px solid #8b8d95; + border-radius: 4px; + margin: 5px 0; + min-width: 100px; + padding: 8px 10px; +} +.swagger-ui input[type="email"].invalid, +.swagger-ui input[type="file"].invalid, +.swagger-ui input[type="password"].invalid, +.swagger-ui input[type="search"].invalid, +.swagger-ui input[type="text"].invalid, +.swagger-ui textarea.invalid { + animation: shake 0.4s 1; + background: #feebeb; + border-color: #f93e3e; +} +.swagger-ui input[disabled], +.swagger-ui select[disabled], +.swagger-ui textarea[disabled] { + background-color: #3b3b3b; + color: #8b8d95; + cursor: not-allowed; +} +.swagger-ui select[disabled] { + border-color: #888; +} +.swagger-ui textarea[disabled] { + background-color: #41444e; + color: #fff; +} +@keyframes shake { + 10%, + 90% { + transform: translate3d(-1px, 0, 0); + } + 20%, + 80% { + transform: translate3d(2px, 0, 0); + } + 30%, + 50%, + 70% { + transform: translate3d(-4px, 0, 0); + } + 40%, + 60% { + transform: translate3d(4px, 0, 0); + } +} +.swagger-ui textarea { + background: hsla(0, 0%, 100%, 0.8); + border: none; + border-radius: 4px; + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 600; + min-height: 280px; + outline: none; + padding: 10px; + width: 100%; +} +.swagger-ui textarea:focus { + border: 2px solid #61affe; +} +.swagger-ui textarea.curl { + background: #41444e; + border-radius: 4px; + color: #fff; + font-family: monospace; + font-size: 12px; + font-weight: 600; + margin: 0; + min-height: 100px; + padding: 10px; + resize: none; +} +.swagger-ui .checkbox { + color: #303030; + padding: 5px 0 10px; + transition: opacity 0.5s; +} +.swagger-ui .checkbox label { + display: flex; +} +.swagger-ui .checkbox p { + color: #8b8d95; + font-family: monospace; + font-style: italic; + font-weight: 400 !important; + font-weight: 600; + margin: 0 !important; +} +.swagger-ui .checkbox input[type="checkbox"] { + display: none; +} +.swagger-ui .checkbox input[type="checkbox"] + label > .item { + background: #e8e8e8; + border-radius: 1px; + box-shadow: 0 0 0 2px #e8e8e8; + cursor: pointer; + display: inline-block; + flex: none; + height: 16px; + margin: 0 8px 0 0; + padding: 5px; + position: relative; + top: 3px; + width: 16px; +} +.swagger-ui .checkbox input[type="checkbox"] + label > .item:active { + transform: scale(0.9); +} +.swagger-ui .checkbox input[type="checkbox"]:checked + label > .item { + background: #e8e8e8 + url('data:image/svg+xml;charset=utf-8,') + 50% no-repeat; +} +.swagger-ui .dialog-ux { + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 9999; +} +.swagger-ui .dialog-ux .backdrop-ux { + background: rgba(0, 0, 0, 0.8); + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0; +} +.swagger-ui .dialog-ux .modal-ux { + background: #fff; + border: 1px solid #ebebeb; + border-radius: 4px; + box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.2); + left: 50%; + max-width: 650px; + min-width: 300px; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + width: 100%; + z-index: 9999; +} +.swagger-ui .dialog-ux .modal-ux-content { + max-height: 540px; + overflow-y: auto; + padding: 20px; +} +.swagger-ui .dialog-ux .modal-ux-content p { + color: #41444e; + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + margin: 0 0 5px; +} +.swagger-ui .dialog-ux .modal-ux-content h4 { + color: #8b8d95; + font-family: sans-serif; + font-size: 18px; + font-weight: 600; + margin: 15px 0 0; +} +.swagger-ui .dialog-ux .modal-ux-header { + align-items: center; + border-bottom: 1px solid #ebebeb; + display: flex; + padding: 12px 0; +} +.swagger-ui .dialog-ux .modal-ux-header .close-modal { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: none; + border: none; + padding: 0 10px; +} +.swagger-ui .dialog-ux .modal-ux-header h3 { + color: #8b8d95; + flex: 1; + font-family: sans-serif; + font-size: 20px; + font-weight: 600; + margin: 0; + padding: 0 20px; +} +.swagger-ui .model { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 300; + font-weight: 600; +} +.swagger-ui .model .deprecated span, +.swagger-ui .model .deprecated td { + color: #a0a0a0 !important; +} +.swagger-ui .model .deprecated > td:first-of-type { + -webkit-text-decoration: line-through; + text-decoration: line-through; +} +.swagger-ui .model-toggle { + cursor: pointer; + display: inline-block; + font-size: 10px; + margin: auto 0.3em; + position: relative; + top: 6px; + transform: rotate(90deg); + transform-origin: 50% 50%; + transition: transform 0.15s ease-in; +} +.swagger-ui .model-toggle.collapsed { + transform: rotate(0deg); +} +.swagger-ui .model-toggle:after { + background: url('data:image/svg+xml;charset=utf-8,') + 50% no-repeat; + background-size: 100%; + content: ""; + display: block; + height: 20px; + width: 20px; +} +.swagger-ui .model-jump-to-path { + cursor: pointer; + position: relative; +} +.swagger-ui .model-jump-to-path .view-line-link { + cursor: pointer; + position: absolute; + top: -0.4em; +} +.swagger-ui .model-title { + position: relative; +} +.swagger-ui .model-title:hover .model-hint { + visibility: visible; +} +.swagger-ui .model-hint { + background: rgba(0, 0, 0, 0.7); + border-radius: 4px; + color: #ebebeb; + padding: 0.1em 0.5em; + position: absolute; + top: -1.8em; + visibility: hidden; + white-space: nowrap; +} +.swagger-ui .model p { + margin: 0 0 1em; +} +.swagger-ui .model .property { + color: #999; + font-style: italic; +} +.swagger-ui .model .property.primitive { + color: #6b6b6b; +} +.swagger-ui .model .external-docs, +.swagger-ui table.model tr.description { + color: #666; + font-weight: 400; +} +.swagger-ui table.model tr.description { + color: #666; + font-weight: 400; +} +.swagger-ui table.model tr.description td:first-child, +.swagger-ui table.model tr.property-row.required td:first-child { + font-weight: 700; +} +.swagger-ui table.model tr.property-row td { + vertical-align: top; +} +.swagger-ui table.model tr.property-row td:first-child { + padding-right: 0.2em; +} +.swagger-ui table.model tr.property-row .star { + color: red; +} +.swagger-ui table.model tr.extension { + color: #777; +} +.swagger-ui table.model tr.extension td:last-child { + vertical-align: top; +} +.swagger-ui table.model tr.external-docs td:first-child { + font-weight: 700; +} +.swagger-ui table.model tr .renderedMarkdown p:first-child { + margin-top: 0; +} +.swagger-ui section.models { + border: 1px solid rgba(59, 65, 81, 0.3); + border-radius: 4px; + margin: 30px 0; +} +.swagger-ui section.models .pointer { + cursor: pointer; +} +.swagger-ui section.models.is-open { + padding: 0 0 20px; +} +.swagger-ui section.models.is-open h4 { + border-bottom: 1px solid rgba(59, 65, 81, 0.3); + margin: 0 0 5px; +} +.swagger-ui section.models h4 { + align-items: center; + color: #8b8d95; + cursor: pointer; + display: flex; + font-family: sans-serif; + font-size: 16px; + margin: 0; + padding: 10px 20px 10px 10px; + transition: all 0.2s; +} +.swagger-ui section.models h4 svg { + transition: all 0.4s; +} +.swagger-ui section.models h4 span { + flex: 1; +} +.swagger-ui section.models h4:hover { + background: rgba(0, 0, 0, 0.02); +} +.swagger-ui section.models h5 { + color: #707070; + font-family: sans-serif; + font-size: 16px; + margin: 0 0 10px; +} +.swagger-ui section.models .model-jump-to-path { + position: relative; + top: 5px; +} +.swagger-ui section.models .model-container { + background: rgba(0, 0, 0, 0.05); + border-radius: 4px; + margin: 0 20px 15px; + position: relative; + transition: all 0.5s; +} +.swagger-ui section.models .model-container:hover { + /* background: rgba(0, 0, 0, 0.07); */ +} +.swagger-ui section.models .model-container:first-of-type { + margin: 20px; +} +.swagger-ui section.models .model-container:last-of-type { + margin: 0 20px; +} +.swagger-ui section.models .model-container .models-jump-to-path { + opacity: 0.65; + position: absolute; + right: 5px; + top: 8px; +} +.swagger-ui section.models .model-box { + background: none; +} +.swagger-ui .model-box { + background: rgba(0, 0, 0, 0.1); + border-radius: 4px; + display: inline-block; + padding: 10px; +} +.swagger-ui .model-box .model-jump-to-path { + position: relative; + top: 4px; +} +.swagger-ui .model-box.deprecated { + opacity: 0.5; +} +.swagger-ui .model-title { + color: #505050; + font-family: sans-serif; + font-size: 16px; +} +.swagger-ui .model-title img { + bottom: 0; + margin-left: 1em; + position: relative; +} +.swagger-ui .model-deprecated-warning { + color: #f93e3e; + font-family: sans-serif; + font-size: 16px; + font-weight: 600; + margin-right: 1em; +} +.swagger-ui span > span.model .brace-close { + padding: 0 0 0 10px; +} +.swagger-ui .prop-name { + display: inline-block; + margin-right: 1em; +} +.swagger-ui .prop-type { + color: #55a; +} +.swagger-ui .prop-enum { + display: block; +} +.swagger-ui .prop-format { + color: #8b8d95; +} +.swagger-ui .servers > label { + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + margin: -20px 15px 0 0; +} +.swagger-ui .servers > label select { + max-width: 100%; + min-width: 130px; + width: 100%; +} +.swagger-ui .servers h4.message { + padding-bottom: 2em; +} +.swagger-ui .servers table tr { + width: 30em; +} +.swagger-ui .servers table td { + display: inline-block; + max-width: 15em; + padding-bottom: 10px; + padding-top: 10px; + vertical-align: middle; + border-top: none; +} +.swagger-ui .servers table td:first-of-type { + padding-right: 1em; + padding-left: 1em; +} +.swagger-ui .servers table td input { + height: 100%; + width: 100%; +} +.swagger-ui .servers .computed-url { + margin: 2em 0; +} +.swagger-ui .servers .computed-url code { + display: inline-block; + font-size: 16px; + margin: 0 1em; + padding: 4px; +} +.swagger-ui .servers-title { + font-size: 12px; + font-weight: 700; +} +.swagger-ui .operation-servers h4.message { + margin-bottom: 2em; +} +.swagger-ui table { + border-collapse: collapse; + padding: 0 10px; + width: 100%; +} +.swagger-ui table.model tbody tr td { + padding: 0; + vertical-align: top; +} +.swagger-ui table.model tbody tr td:first-of-type { + padding: 0 0 0 2em; + width: 174px; +} +.swagger-ui table.headers td { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 300; + font-weight: 600; + vertical-align: middle; +} +.swagger-ui table.headers .header-example { + color: #999; + font-style: italic; +} +.swagger-ui table tbody tr td { + padding: 10px 0 0; + vertical-align: top; +} +.swagger-ui table tbody tr td:first-of-type { + min-width: 6em; + padding: 10px 0; +} +.swagger-ui table thead tr td, +.swagger-ui table thead tr th { + border-bottom: 1px solid rgba(59, 65, 81, 0.2); + color: #8b8d95; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + padding: 12px 0; + text-align: left; +} +.swagger-ui .parameters-col_description { + margin-bottom: 2em; + width: 99%; +} +.swagger-ui .parameters-col_description input { + max-width: 340px; + width: 100%; +} +.swagger-ui .parameters-col_description select { + border-width: 1px; +} +.swagger-ui .parameters-col_description .markdown p, +.swagger-ui .parameters-col_description .renderedMarkdown p { + margin: 0; +} +.swagger-ui .parameter__name { + color: #8b8d95; + font-family: sans-serif; + font-size: 16px; + font-weight: 400; + margin-right: 0.75em; +} +.swagger-ui .parameter__name.required { + font-weight: 700; +} +.swagger-ui .parameter__name.required span { + color: red; +} +.swagger-ui .parameter__name.required:after { + color: rgba(255, 0, 0, 0.6); + content: "required"; + font-size: 10px; + padding: 5px; + position: relative; + top: -6px; +} +.swagger-ui .parameter__extension, +.swagger-ui .parameter__in { + color: gray; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600; +} +.swagger-ui .parameter__deprecated { + color: red; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600; +} +.swagger-ui .parameter__empty_value_toggle { + display: block; + font-size: 13px; + padding-bottom: 12px; + padding-top: 5px; +} +.swagger-ui .parameter__empty_value_toggle input { + margin-right: 7px; + width: auto; +} +.swagger-ui .parameter__empty_value_toggle.disabled { + opacity: 0.7; +} +.swagger-ui .table-container { + padding: 20px; +} +.swagger-ui .response-col_description { + width: 99%; +} +.swagger-ui .response-col_description .markdown p, +.swagger-ui .response-col_description .renderedMarkdown p { + margin: 0; +} +.swagger-ui .response-col_links { + min-width: 6em; +} +.swagger-ui .response__extension { + color: gray; + font-family: monospace; + font-size: 12px; + font-style: italic; + font-weight: 600; +} +.swagger-ui .topbar { + background-color: #1b1b1b; + padding: 10px 0; +} +.swagger-ui .topbar .topbar-wrapper { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 10px; +} +@media (max-width: 550px) { + .swagger-ui .topbar .topbar-wrapper { + align-items: start; + flex-direction: column; + } +} +.swagger-ui .topbar a { + align-items: center; + color: #fff; + display: flex; + flex: 1; + font-family: sans-serif; + font-size: 1.5em; + font-weight: 700; + max-width: 300px; + -webkit-text-decoration: none; + text-decoration: none; +} +.swagger-ui .topbar a span { + margin: 0; + padding: 0 10px; +} +.swagger-ui .topbar .download-url-wrapper { + display: flex; + flex: 3; + justify-content: flex-end; +} +.swagger-ui .topbar .download-url-wrapper input[type="text"] { + border: 2px solid #62a03f; + border-radius: 4px 0 0 4px; + margin: 0; + max-width: 100%; + outline: none; + width: 100%; +} +.swagger-ui .topbar .download-url-wrapper .select-label { + align-items: center; + color: #f0f0f0; + display: flex; + margin: 0; + max-width: 600px; + width: 100%; +} +.swagger-ui .topbar .download-url-wrapper .select-label span { + flex: 1; + font-size: 16px; + padding: 0 10px 0 0; + text-align: right; +} +.swagger-ui .topbar .download-url-wrapper .select-label select { + border: 2px solid #62a03f; + box-shadow: none; + flex: 2; + outline: none; + width: 100%; +} +.swagger-ui .topbar .download-url-wrapper .download-url-button { + background: #62a03f; + border: none; + border-radius: 0 4px 4px 0; + color: #fff; + font-family: sans-serif; + font-size: 16px; + font-weight: 700; + padding: 4px 30px; +} +@media (max-width: 550px) { + .swagger-ui .topbar .download-url-wrapper { + width: 100%; + } +} +.swagger-ui .info { + margin: 50px 0; +} +.swagger-ui .info.failed-config { + margin-left: auto; + margin-right: auto; + max-width: 880px; + text-align: center; +} +.swagger-ui .info hgroup.main { + margin: 0 0 20px; +} +.swagger-ui .info hgroup.main a { + font-size: 12px; +} +.swagger-ui .info pre { + font-size: 14px; +} +.swagger-ui .info li, +.swagger-ui .info p, +.swagger-ui .info table { + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; +} +.swagger-ui .info h1, +.swagger-ui .info h2, +.swagger-ui .info h3, +.swagger-ui .info h4, +.swagger-ui .info h5 { + color: #8b8d95; + font-family: sans-serif; +} +.swagger-ui .info a { + color: #4990e2; + font-family: sans-serif; + font-size: 14px; + transition: all 0.4s; +} +.swagger-ui .info a:hover { + color: #1f69c0; +} +.swagger-ui .info > div { + margin: 0 0 5px; +} +.swagger-ui .info .base-url { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 300 !important; + font-weight: 600; + margin: 0; +} +.swagger-ui .info .title { + color: #8b8d95; + font-family: sans-serif; + font-size: 36px; + margin: 0; +} +.swagger-ui .info .title small { + background: #7d8492; + border-radius: 57px; + display: inline-block; + font-size: 10px; + margin: 0 0 0 5px; + padding: 2px 4px; + position: relative; + top: -5px; + vertical-align: super; +} +.swagger-ui .info .title small.version-stamp { + background-color: #89bf04; +} +.swagger-ui .info .title small pre { + color: #fff; + font-family: sans-serif; + margin: 0; + padding: 0; +} +.swagger-ui .auth-btn-wrapper { + display: flex; + justify-content: center; + padding: 10px 0; +} +.swagger-ui .auth-btn-wrapper .btn-done { + margin-right: 1em; +} +.swagger-ui .auth-wrapper { + display: flex; + flex: 1; + justify-content: flex-end; +} +.swagger-ui .auth-wrapper .authorize { + margin-left: 10px; + margin-right: 10px; + padding-right: 20px; +} +.swagger-ui .auth-container { + border-bottom: 1px solid #ebebeb; + margin: 0 0 10px; + padding: 10px 20px; +} +.swagger-ui .auth-container:last-of-type { + border: 0; + margin: 0; + padding: 10px 20px; +} +.swagger-ui .auth-container h4 { + margin: 5px 0 15px !important; +} +.swagger-ui .auth-container .wrapper { + margin: 0; + padding: 0; +} +.swagger-ui .auth-container input[type="password"], +.swagger-ui .auth-container input[type="text"] { + min-width: 230px; +} +.swagger-ui .auth-container .errors { + background-color: #fee; + border-radius: 4px; + color: red; + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 600; + margin: 1em; + padding: 10px; +} +.swagger-ui .auth-container .errors b { + margin-right: 1em; + text-transform: capitalize; +} +.swagger-ui .scopes h2 { + color: #8b8d95; + font-family: sans-serif; + font-size: 14px; +} +.swagger-ui .scopes h2 a { + color: #4990e2; + cursor: pointer; + font-size: 12px; + padding-left: 10px; + -webkit-text-decoration: underline; + text-decoration: underline; +} +.swagger-ui .scope-def { + padding: 0 0 20px; +} +.swagger-ui .errors-wrapper { + animation: scaleUp 0.5s; + background: rgba(249, 62, 62, 0.1); + border: 2px solid #f93e3e; + border-radius: 4px; + margin: 20px; + padding: 10px 20px; +} +.swagger-ui .errors-wrapper .error-wrapper { + margin: 0 0 10px; +} +.swagger-ui .errors-wrapper .errors h4 { + color: #8b8d95; + font-family: monospace; + font-size: 14px; + font-weight: 600; + margin: 0; +} +.swagger-ui .errors-wrapper .errors small { + color: #8b8d95; +} +.swagger-ui .errors-wrapper .errors .message { + white-space: pre-line; +} +.swagger-ui .errors-wrapper .errors .message.thrown { + max-width: 100%; +} +.swagger-ui .errors-wrapper .errors .error-line { + cursor: pointer; + -webkit-text-decoration: underline; + text-decoration: underline; +} +.swagger-ui .errors-wrapper hgroup { + align-items: center; + display: flex; +} +.swagger-ui .errors-wrapper hgroup h4 { + color: #8b8d95; + flex: 1; + font-family: sans-serif; + font-size: 20px; + margin: 0; +} +@keyframes scaleUp { + 0% { + opacity: 0; + transform: scale(0.8); + } + to { + opacity: 1; + transform: scale(1); + } +} +.swagger-ui .Resizer.vertical.disabled { + display: none; +} +.swagger-ui .markdown p, +.swagger-ui .markdown pre, +.swagger-ui .renderedMarkdown p, +.swagger-ui .renderedMarkdown pre { + margin: 1em auto; + word-break: break-all; + word-break: break-word; +} +.swagger-ui .markdown pre, +.swagger-ui .renderedMarkdown pre { + background: none; + color: #000; + font-weight: 400; + padding: 0; + white-space: pre-wrap; +} +.swagger-ui .markdown code, +.swagger-ui .renderedMarkdown code { + background: rgba(0, 0, 0, 0.05); + border-radius: 4px; + color: #9012fe; + font-family: monospace; + font-size: 14px; + font-weight: 600; + padding: 5px 7px; +} +.swagger-ui .markdown pre > code, +.swagger-ui .renderedMarkdown pre > code { + display: block; +} +.swagger-ui .json-schema-2020-12 { + background-color: rgba(0, 0, 0, 0.05); + border-radius: 4px; + margin: 0 20px 15px; + padding: 12px 0 12px 20px; +} +.swagger-ui .json-schema-2020-12:first-of-type { + margin: 20px; +} +.swagger-ui .json-schema-2020-12:last-of-type { + margin: 0 20px; +} +.swagger-ui .json-schema-2020-12--embedded { + background-color: inherit; + padding-bottom: 0; + padding-left: inherit; + padding-right: inherit; + padding-top: 0; +} +.swagger-ui .json-schema-2020-12-body { + border-left: 1px dashed rgba(0, 0, 0, 0.1); + margin: 2px 0; +} +.swagger-ui .json-schema-2020-12-body--collapsed { + display: none; +} +.swagger-ui .json-schema-2020-12-accordion { + border: none; + outline: none; + padding-left: 0; +} +.swagger-ui .json-schema-2020-12-accordion__children { + display: inline-block; +} +.swagger-ui .json-schema-2020-12-accordion__icon { + display: inline-block; + height: 18px; + vertical-align: bottom; + width: 18px; +} +.swagger-ui .json-schema-2020-12-accordion__icon--expanded { + transform: rotate(-90deg); + transform-origin: 50% 50%; + transition: transform 0.15s ease-in; +} +.swagger-ui .json-schema-2020-12-accordion__icon--collapsed { + transform: rotate(0deg); + transform-origin: 50% 50%; + transition: transform 0.15s ease-in; +} +.swagger-ui .json-schema-2020-12-accordion__icon svg { + height: 20px; + width: 20px; +} +.swagger-ui .json-schema-2020-12-expand-deep-button { + border: none; + color: #505050; + color: #afaeae; + font-family: sans-serif; + font-size: 12px; + padding-right: 0; +} +.swagger-ui .json-schema-2020-12-keyword { + margin: 5px 0; +} +.swagger-ui .json-schema-2020-12-keyword__children { + border-left: 1px dashed rgba(0, 0, 0, 0.1); + margin: 0 0 0 20px; + padding: 0; +} +.swagger-ui .json-schema-2020-12-keyword__children--collapsed { + display: none; +} +.swagger-ui .json-schema-2020-12-keyword__name { + font-size: 12px; + font-weight: 700; + margin-left: 20px; +} +.swagger-ui .json-schema-2020-12-keyword__name--primary { + color: #8b8d95; + font-style: normal; +} +.swagger-ui .json-schema-2020-12-keyword__name--secondary { + color: #6b6b6b; + font-style: italic; +} +.swagger-ui .json-schema-2020-12-keyword__value { + color: #6b6b6b; + font-size: 12px; + font-style: italic; + font-weight: 400; +} +.swagger-ui .json-schema-2020-12-keyword__value--primary { + color: #8b8d95; + font-style: normal; +} +.swagger-ui .json-schema-2020-12-keyword__value--secondary { + color: #6b6b6b; + font-style: italic; +} +.swagger-ui .json-schema-2020-12-keyword__value--const, +.swagger-ui .json-schema-2020-12-keyword__value--warning { + border: 1px dashed #6b6b6b; + border-radius: 4px; + color: #8b8d95; + color: #6b6b6b; + display: inline-block; + font-family: monospace; + font-style: normal; + font-weight: 600; + line-height: 1.5; + margin-left: 10px; + padding: 1px 4px; +} +.swagger-ui .json-schema-2020-12-keyword__value--warning { + border: 1px dashed red; + color: red; +} +.swagger-ui + .json-schema-2020-12-keyword__name--secondary + + .json-schema-2020-12-keyword__value--secondary:before { + content: "="; +} +.swagger-ui .json-schema-2020-12__attribute { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + padding-left: 10px; + text-transform: lowercase; +} +.swagger-ui .json-schema-2020-12__attribute--primary { + color: #55a; +} +.swagger-ui .json-schema-2020-12__attribute--muted { + color: gray; +} +.swagger-ui .json-schema-2020-12__attribute--warning { + color: red; +} +.swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul { + border-left: 1px dashed rgba(0, 0, 0, 0.1); + margin: 0 0 0 20px; +} +.swagger-ui .json-schema-2020-12-\$vocabulary-uri { + margin-left: 35px; +} +.swagger-ui .json-schema-2020-12-\$vocabulary-uri--disabled { + -webkit-text-decoration: line-through; + text-decoration: line-through; +} +.swagger-ui .json-schema-2020-12-keyword--description { + color: #6b6b6b; + font-size: 12px; + margin-left: 20px; +} +.swagger-ui .json-schema-2020-12-keyword--description p { + margin: 0; +} +.swagger-ui .json-schema-2020-12__title { + color: #505050; + display: inline-block; + font-family: sans-serif; + font-size: 12px; + font-weight: 700; + line-height: normal; +} +.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name { + margin: 0; +} +.swagger-ui .json-schema-2020-12-property { + margin: 7px 0; +} +.swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title { + color: #8b8d95; + font-family: monospace; + font-size: 12px; + font-weight: 600; + vertical-align: middle; +} +.swagger-ui .json-schema-2020-12-keyword--properties > ul { + border: none; + margin: 0; + padding: 0; +} +.swagger-ui .json-schema-2020-12-property { + list-style-type: none; +} +.swagger-ui + .json-schema-2020-12-property--required + > .json-schema-2020-12:first-of-type + > .json-schema-2020-12-head + .json-schema-2020-12__title:after { + color: red; + content: "*"; + font-weight: 700; +} +.swagger-ui .json-schema-2020-12-keyword--patternProperties ul { + border: none; + margin: 0; + padding: 0; +} +.swagger-ui + .json-schema-2020-12-keyword--patternProperties + .json-schema-2020-12__title:first-of-type:after, +.swagger-ui + .json-schema-2020-12-keyword--patternProperties + .json-schema-2020-12__title:first-of-type:before { + color: #55a; + content: "/"; +} +.swagger-ui .json-schema-2020-12-keyword--enum > ul { + display: inline-block; + margin: 0; + padding: 0; +} +.swagger-ui .json-schema-2020-12-keyword--enum > ul li { + display: inline; + list-style-type: none; +} +.swagger-ui .json-schema-2020-12__constraint { + background-color: #805ad5; + border-radius: 4px; + color: #8b8d95; + color: #fff; + font-family: monospace; + font-weight: 600; + line-height: 1.5; + margin-left: 10px; + padding: 1px 3px; +} +.swagger-ui .json-schema-2020-12__constraint--string { + background-color: #d69e2e; + color: #fff; +} +.swagger-ui .json-schema-2020-12-keyword--dependentRequired > ul { + display: inline-block; + margin: 0; + padding: 0; +} +.swagger-ui .json-schema-2020-12-keyword--dependentRequired > ul li { + display: inline; + list-style-type: none; +} +.swagger-ui + .model-box + .json-schema-2020-12:not(.json-schema-2020-12--embedded) + > .json-schema-2020-12-head + .json-schema-2020-12__title:first-of-type { + font-size: 16px; +} +.swagger-ui .model-box > .json-schema-2020-12 { + margin: 0; +} +.swagger-ui .model-box .json-schema-2020-12 { + background-color: transparent; + padding: 0; +} +.swagger-ui .model-box .json-schema-2020-12-accordion, +.swagger-ui .model-box .json-schema-2020-12-expand-deep-button { + background-color: transparent; +} +.swagger-ui + .models + .json-schema-2020-12:not(.json-schema-2020-12--embedded) + > .json-schema-2020-12-head + .json-schema-2020-12__title:first-of-type { + font-size: 16px; +} + +/*# sourceMappingURL=swagger-ui.css.map*/ diff --git a/docs/assets/css/swagger-ui.css.map b/docs/assets/css/swagger-ui.css.map new file mode 100644 index 000000000..76a2ab51a --- /dev/null +++ b/docs/assets/css/swagger-ui.css.map @@ -0,0 +1 @@ +{"version":3,"file":"swagger-ui.css","mappings":"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,CDrDb,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,oDC8BW,CD7BX,qDC8BW,CD7BX,uDC8BY,CD7BZ,wDC8Ba,CD5Bb,6CCyCW,CDxCX,wCCyCM,CDxCN,8CCyCY,CDxCZ,2CCyCS,CDxCT,yCCyCO,CDxCP,wCCyCS,CDxCT,iDCyCe,CDxCf,2CCyCS,CDxCT,iDCyCe,CDxCf,8CCyCY,CDxCZ,6CCyCW,CDxCX,yCCyCO,CDxCP,+CCyCa,CDxCb,+CCyCa,CDxCb,0CCyCQ,CDxCR,gDCyCc,CDxCd,yCCyCO,CDxCP,8CCyCY,CDxCZ,yCCyCO,CDxCP,+CCyCa,CDxCb,kDCyCgB,CDxChB,gDCyCc,CDxCd,iDCyCe,CDxCf,kDCyCgB,CDxChB,+CCyCa,CDvCb,oDCVc,CDWd,6CE3DE,gCDmBmB,CClBnB,sCDmBgB,CClBhB,qCDmBgB,CClBhB,oCDmBgB,CClBhB,mCDmBgB,CClBhB,sCDmBqB,CClBrB,yCDmBmB,CClBnB,wBACI,yBACA,0BAEJ,qBACI,4BACA,6BAEJ,uBAEI,4BADA,wBACA,CAEJ,sBAEI,6BADA,yBACA,CAGN,mCACE,mCDNmB,CCOnB,yCDNgB,CCOhB,wCDNgB,CCOhB,uCDNgB,CCOhB,sCDNgB,CCOhB,yCDNqB,CCOrB,4CDNmB,CCOnB,2BACI,yBACA,0BAEJ,wBACI,4BACA,6BAEJ,0BAEI,4BADA,wBACA,CAEJ,yBAEI,6BADA,yBACA,EAIN,uDACE,kCDhCmB,CCiCnB,wCDhCgB,CCiChB,uCDhCgB,CCiChB,sCDhCgB,CCiChB,qCDhCgB,CCiChB,wCDhCqB,CCiCrB,2CDhCmB,CCiCnB,0BACI,yBACA,0BAEJ,uBACI,4BACA,6BAEJ,yBAEI,4BADA,wBACA,CAEJ,wBAEI,6BADA,yBACA,EAIN,mCACE,kCD1DmB,CC2DnB,wCD1DgB,CC2DhB,uCD1DgB,CC2DhB,sCD1DgB,CC2DhB,qCD1DgB,CC2DhB,wCD1DqB,CC2DrB,2CD1DmB,CC2DnB,0BACI,yBACA,0BAEJ,uBACI,4BACA,6BAEJ,yBAEI,4BADA,wBACA,CAEJ,wBAEI,6BADA,yBACA,ECrGN,2CACA,2CACA,yCACA,uCAEA,mCACE,8CACA,8CACA,4CACA,2CAGF,uDACE,6CACA,6CACA,2CACA,0CAGF,mCACE,6CACA,6CACA,2CACA,0CCvBF,+BH6BoB,CG5BpB,qCH6BiB,CG5BjB,oCH6BiB,CG5BjB,mCH6BiB,CG5BjB,kCH6BiB,CG5BjB,kCH6BiB,CG1BjB,oCHqBoB,CGpBpB,sCHoBoB,CGnBpB,uCHmBoB,CGlBpB,qCHkBoB,CGhBpB,mCACE,kCHekB,CGdlB,wCHee,CGdf,uCHee,CGdf,sCHee,CGdf,qCHee,CGdf,qCHee,CGdf,uCHSkB,CGRlB,yCHQkB,CGPlB,0CHOkB,CGNlB,wCHMkB,EGHpB,uDACE,iCHEkB,CGDlB,uCHEe,CGDf,sCHEe,CGDf,qCHEe,CGDf,oCHEe,CGDf,oCHEe,CGDf,sCHJkB,CGKlB,wCHLkB,CGMlB,yCHNkB,CGOlB,uCHPkB,EGUpB,mCACE,iCHXkB,CGYlB,uCHXe,CGYf,sCHXe,CGYf,qCHXe,CGYf,oCHXe,CGYf,oCHXe,CGYf,sCHjBkB,CGkBlB,wCHlBkB,CGmBlB,yCHnBkB,CGoBlB,uCHpBkB,EIxCpB,2DJ8Ce,CI7Cf,2DJ8Ce,CI7Cf,+DJ8Ce,CI7Cf,6DJ8Ce,CI7Cf,6DJ8Ce,CI5Cf,mCACE,8DJuCa,CItCb,8DJuCa,CItCb,kEJuCa,CItCb,gEJuCa,CItCb,gEJuCa,EIpCf,uDACE,6DJ+Ba,CI9Bb,6DJ+Ba,CI9Bb,iEJ+Ba,CI9Bb,+DJ+Ba,CI9Bb,+DJ+Ba,EI5Bf,mCACE,6DJuBa,CItBb,6DJuBa,CItBb,iEJuBa,CItBb,+DJuBa,CItBb,+DJuBa,EKxDf,iBACE,gBACA,kBACA,gBCkBF,yBACA,6BACA,+BACA,2BAEA,4BACA,gCACA,kCACA,8BAEA,4BACA,gCACA,kCACA,8BAEA,8BACA,kCACA,oCACA,gCAEA,8BACA,kCACA,oCACA,gCAGA,4BAGE,SACA,OAFA,QADA,KAGA,CAGF,mCACE,4BACA,8BACA,gCACA,kCACA,+BACA,iCACA,mCACA,qCACA,+BACA,iCACA,mCACA,qCACA,iCACA,qCACA,uCACA,mCACA,iCACA,qCACA,uCACA,mCACA,+BAGE,SACA,OAFA,QADA,KAGA,EAIJ,uDACE,2BACA,6BACA,+BACA,iCACA,8BACA,gCACA,kCACA,oCACA,8BACA,gCACA,kCACA,oCACA,gCACA,oCACA,sCACA,kCACA,gCACA,oCACA,sCACA,kCACA,8BAGE,SACA,OAFA,QADA,KAGA,EAIJ,mCACE,2BACA,6BACA,+BACA,iCACA,8BACA,gCACA,kCACA,oCACA,8BACA,gCACA,kCACA,oCACA,gCACA,oCACA,sCACA,kCACA,gCACA,oCACA,sCACA,kCACA,8BAGE,SACA,OAFA,QADA,KAGA,ECrIJ,6CACY,0BACZ,iCACA,uBAEA,2BACA,4BACA,2BACA,2BAEA,mCACE,8BACA,+BACA,8BACA,+BAGF,uDACE,6BACA,8BACA,6BACA,8BAGF,mCACE,6BACA,8BACA,6BACA,8BC3BF,+BACA,6CAIA,uBACE,cAEA,aADA,WACA,CAGF,iCAEA,+CACA,yCACA,sCACA,0CACA,sDACA,+DACA,yDAEA,gDACA,4CACA,6CACA,iDACA,+CAEA,8CACA,0CACA,2CACA,+CACA,6CAEA,sDACA,kDACA,mDACA,2DACA,yDAEA,oDACA,gDACA,iDACA,yDACA,uDACA,mDAEA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,oCAEA,qCACA,qCAEA,yCACA,yCAEA,mCACE,kCACA,gDACA,0BACE,cAEA,aADA,WACA,CAEF,oCACA,kDACA,4CACA,yCACA,6CACA,yDACA,kEACA,4DACA,mDACA,+CACA,gDACA,oDACA,kDAEA,iDACA,6CACA,8CACA,kDACA,gDAEA,yDACA,qDACA,sDACA,8DACA,4DAEA,uDACA,mDACA,oDACA,4DACA,0DACA,sDAEA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,gCACA,uCAEA,wCACA,wCAEA,4CACA,6CAEF,uDACE,iCACA,+CACA,yBACE,cAEA,aADA,WACA,CAEF,mCACA,iDACA,2CACA,wCACA,4CACA,wDACA,iEACA,2DACA,kDACA,8CACA,+CACA,mDACA,iDAEA,gDACA,4CACA,6CACA,iDACA,+CAEA,wDACA,oDACA,qDACA,6DACA,2DAEA,sDACA,kDACA,mDACA,2DACA,yDACA,qDAEA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,sCAEA,uCACA,uCAEA,2CACA,4CAGF,mCACE,iCACA,+CACA,yBACE,cAEA,aADA,WACA,CAEF,mCACA,iDACA,2CACA,wCACA,4CACA,wDACA,iEACA,2DAEA,kDACA,8CACA,+CACA,mDACA,iDAEA,gDACA,4CACA,6CACA,iDACA,+CAEA,wDACA,oDACA,qDACA,6DACA,2DAEA,sDACA,kDACA,mDACA,2DACA,yDACA,qDAEA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,sCAEA,uCACA,uCAEA,2CACA,4CC9NF,6BACA,+BACA,8BACA,sCACA,sCACA,8BACA,oCACA,sCACA,kDACA,4CACA,wDAMA,uBACE,mBACA,WAGF,mCACE,gCACA,kCACA,iCACA,yCACA,yCACA,iCACA,uCACA,yCACA,qDACA,+CACA,2DAEA,0BACE,mBACA,YAIJ,uDACE,+BACA,iCACA,gCACA,wCACA,wCACA,gCACA,sCACA,wCACA,oDACA,8CACA,0DAEA,yBACE,mBACA,YAIJ,mCACE,+BACA,iCACA,gCACA,wCACA,wCACA,gCACA,sCACA,wCACA,oDACA,8CACA,0DAEA,yBACE,mBACA,YCxEJ,2CACA,4CACA,2BAEA,mCACE,8CACA,+CACA,+BAGF,uDACE,6CACA,8CACA,8BAGF,mCACE,6CACA,8CACA,8BCvCF,wBACE,qIXbW,CWgBb,mBACE,yBXhBM,CWmBR,+BACE,uBAGF,0BACE,kBAOF,mCACE,sCAKF,qBACE,2CAQF,uBACE,gDAIF,oBACE,0CAOF,qBACE,kCAKF,qBACE,0BAIF,mBACE,wBAIF,oBACE,4BAIF,qBACE,6BAIF,sBACE,2BAIF,yBACE,8BC5EF,iCACA,yCAEA,mCACE,oCACA,6CAGF,uDACE,mCACA,4CAGF,mCACE,mCACA,4CCDF,oCACA,+BACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCAGA,mCACE,uCACA,kCACA,oCACA,oCACA,oCACA,oCACA,oCACA,oCACA,oCACA,oCACA,qCAGF,uDACE,sCACA,iCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,oCAGF,mCACE,sCACA,iCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,mCACA,oCCxEF,yBACE,wBACA,qBAGF,uFAEE,SACA,UCqBF,2BfTW,CeUX,2BfTW,CeUX,2BfTW,CeUX,2BfTW,CeUX,4BfTW,CeaX,6BACA,6BACA,6BACA,+BAEA,uCAIA,+BACA,+BACA,+BACA,iCAEA,yCAKA,gCACA,sCAEA,mCACE,8BfxCS,CeyCT,8BfxCS,CeyCT,8BfxCS,CeyCT,8BfxCS,CeyCT,+BfxCS,CeyCT,gCACA,gCACA,gCACA,kCACA,0CACA,kCACA,kCACA,kCACA,oCACA,4CACA,mCACA,0CAGF,uDACE,6Bf5DS,Ce6DT,6Bf5DS,Ce6DT,6Bf5DS,Ce6DT,6Bf5DS,Ce6DT,8Bf5DS,Ce6DT,+BACA,+BACA,+BACA,iCACA,yCACA,iCACA,iCACA,iCACA,mCACA,2CACA,kCACA,yCAGF,mCACE,6BfhFS,CeiFT,6BfhFS,CeiFT,6BfhFS,CeiFT,6BfhFS,CeiFT,8BfhFS,CeiFT,+BACA,+BACA,+BACA,iCACA,yCACA,iCACA,iCACA,iCACA,mCACA,2CACA,kCACA,yCC9GF,wChBHmB,CgBInB,gDhBLuB,CgBMvB,8ChBJmB,CgBMnB,mCACE,2ChBRiB,CgBSjB,mDhBVqB,CgBWrB,iDhBTiB,EgBYnB,uDACE,0ChBdiB,CgBejB,kDhBhBqB,CgBiBrB,gDhBfiB,EgBkBnB,mCACE,0ChBpBiB,CgBqBjB,kDhBtBqB,CgBuBrB,gDhBrBiB,EiBEjB,mCjBDkB,CiBElB,sCjBDkB,CiBElB,oCjBDiB,CiBGnB,mCACE,sCjBNkB,CiBOlB,yCjBNkB,CiBOlB,uCjBNiB,EiBSnB,uDACE,qCjBZkB,CiBalB,wCjBZkB,CiBalB,sCjBZiB,EiBenB,mCACE,qCjBlBkB,CiBmBlB,wCjBlBkB,CiBmBlB,sCjBlBiB,EkBNnB,kBACE,iDACA,CAaF,4IAFE,6BAIA,CAFF,wBAEE,gCCjBF,uCC0BA,mCAIA,+BpBDc,CoBEd,+BpBDc,CoBEd,+BpBDc,CoBEd,+BpBDc,CoBEd,gCpBDc,CoBEd,gCpBDc,CoBEd,gCpBDc,CoBEd,gCpBDc,CoBEd,gCpBDc,CoBKd,oCAEA,mCACE,sCAEA,kCpBlBY,CoBmBZ,kCpBlBY,CoBmBZ,kCpBlBY,CoBmBZ,kCpBlBY,CoBmBZ,mCpBlBY,CoBmBZ,mCpBlBY,CoBmBZ,mCpBlBY,CoBmBZ,mCpBlBY,CoBmBZ,mCpBlBY,CoBoBZ,wCAGF,uDACE,qCAEA,iCpBlCY,CoBmCZ,iCpBlCY,CoBmCZ,iCpBlCY,CoBmCZ,iCpBlCY,CoBmCZ,kCpBlCY,CoBmCZ,kCpBlCY,CoBmCZ,kCpBlCY,CoBmCZ,kCpBlCY,CoBmCZ,kCpBlCY,CoBoCZ,uCAGF,mCACE,qCAEA,iCpBlDY,CoBmDZ,iCpBlDY,CoBmDZ,iCpBlDY,CoBmDZ,iCpBlDY,CoBmDZ,kCpBlDY,CoBmDZ,kCpBlDY,CoBmDZ,kCpBlDY,CoBmDZ,kCpBlDY,CoBmDZ,kCpBlDY,CoBoDZ,uCCpDF,0BrBbU,CqBcV,0BrBbU,CqBcV,0BrBbU,CqBcV,0BrBbU,CqBcV,2BrBbU,CqBeV,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,4BACA,8BAEA,0CACA,+CACA,+BAEA,mCACE,6BrBvCQ,CqBwCR,6BrBvCQ,CqBwCR,6BrBvCQ,CqBwCR,6BrBvCQ,CqBwCR,8BrBvCQ,CqBwCR,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,+BACA,iCACA,6CACA,kDACA,mCAGF,uDACE,4BrBhEQ,CqBiER,4BrBhEQ,CqBiER,4BrBhEQ,CqBiER,4BrBhEQ,CqBiER,6BrBhEQ,CqBiER,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,gCACA,4CACA,iDACA,kCAGF,mCACE,4BrBzFQ,CqB0FR,4BrBzFQ,CqB0FR,4BrBzFQ,CqB0FR,4BrBzFQ,CqB0FR,6BrBzFQ,CqB0FR,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,gCACA,4CACA,iDACA,kCClIF,+CACA,6CACA,6CACA,yCAEA,mDACA,iDACA,iDACA,6CAEA,mDACA,iDACA,iDACA,6CAEA,mCACE,kDACA,gDACA,gDACA,4CACA,sDACA,oDACA,oDACA,gDAEA,sDACA,oDACA,oDACA,iDAGF,uDACE,iDACA,+CACA,+CACA,2CAEA,qDACA,mDACA,mDACA,+CAEA,qDACA,mDACA,mDACA,gDAGF,mCACE,iDACA,+CACA,+CACA,2CAEA,qDACA,mDACA,mDACA,+CAEA,qDACA,mDACA,mDACA,gDC7DF,oCACA,wCACA,wCACA,kCAEA,mCACE,uCACA,2CACA,2CACA,sCAGF,uDACE,sCACA,0CACA,0CACA,qCAGF,mCACE,sCACA,0CACA,0CACA,qCC5BF,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,6BACA,8BACA,gCACA,2BCbA,+CACA,+CACA,iDACA,iDACA,iDACA,iDACA,iDAEA,mCACE,kDACA,kDACA,oDACA,oDACA,oDACA,oDACA,qDAGF,uDACE,iDACA,iDACA,mDACA,mDACA,mDACA,mDACA,oDAGF,mCACE,iDACA,iDACA,mDACA,mDACA,mDACA,mDACA,oDC5BF,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,0C1B8DW,C0B7DX,2C1B8DW,C0B5DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B9DX,8C1B+DW,C0B7DX,6B1B6BQ,C0B5BR,kC1B6Ba,C0B5Bb,iC1B6BY,C0B5BZ,gC1B6BW,C0B5BX,4B1B6BO,C0B5BP,8B1B6BS,C0B5BT,oC1B6Be,C0B5Bf,iC1B6BY,C0B5BZ,kC1B6Ba,C0B5Bb,qC1B6Ba,C0B5Bb,6B1B6BQ,C0B3BR,mC1BqDW,C0BpDX,8B1BqDM,C0BpDN,oC1BqDY,C0BpDZ,iC1BqDS,C0BpDT,+B1BqDO,C0BpDP,8B1BqDS,C0BpDT,uC1BqDe,C0BpDf,iC1BqDS,C0BpDT,uC1BqDe,C0BpDf,oC1BqDY,C0BpDZ,mC1BqDW,C0BpDX,+B1BqDO,C0BpDP,qC1BqDa,C0BpDb,qC1BqDa,C0BpDb,gC1BqDQ,C0BpDR,sC1BqDc,C0BpDd,+B1BqDO,C0BpDP,oC1BqDY,C0BpDZ,+B1BqDO,C0BpDP,qC1BqDa,C0BpDb,wC1BqDgB,C0BpDhB,sC1BqDc,C0BpDd,uC1BqDe,C0BpDf,wC1BqDgB,C0BpDhB,qC1BqDa,C0BpDb,yCAEA,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,wD1BEW,C0BDX,yD1BEW,C0BDX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BHX,4D1BIW,C0BEX,2C1BlCQ,C0BmCR,gD1BlCa,C0BmCb,+C1BlCY,C0BmCZ,8C1BlCW,C0BmCX,0C1BlCO,C0BmCP,4C1BlCS,C0BmCT,kD1BlCe,C0BmCf,+C1BlCY,C0BmCZ,gD1BlCa,C0BmCb,mD1BlCa,C0BmCb,2C1BlCQ,C0BmCR,wD1BlCc,C0BoCd,iD1BXW,C0BYX,4C1BXM,C0BYN,kD1BXY,C0BYZ,+C1BXS,C0BYT,6C1BXO,C0BYP,4C1BXS,C0BYT,qD1BXe,C0BYf,+C1BXS,C0BYT,qD1BXe,C0BYf,kD1BXY,C0BYZ,iD1BXW,C0BYX,6C1BXO,C0BYP,mD1BXa,C0BYb,mD1BXa,C0BYb,8C1BXQ,C0BYR,oD1BXc,C0BYd,6C1BXO,C0BYP,kD1BXY,C0BYZ,6C1BXO,C0BYP,mD1BXa,C0BYb,sD1BXgB,C0BYhB,oD1BXc,C0BYd,qD1BXe,C0BYf,sD1BXgB,C0BYhB,mD1BXa,C0BYb,iDC9HA,8DACqB,U3BqDb,C2BpDR,wEAC0B,U3BoDb,C2BnDb,sEACyB,U3BmDb,C2BlDZ,oEACwB,U3BkDb,C2BjDX,4DACoB,U3BiDb,C2BhDP,gEACsB,U3BgDb,C2B/CT,4EAC4B,U3B+Cb,C2B9Cf,sEACyB,U3B8Cb,C2B7CZ,wEAC0B,U3B6Cb,C2B5Cb,wEAC0B,a3B4Cb,C2B3Cb,8DACqB,U3B2Cb,C2BzCR,oEACwB,oB3B0Cb,C2BzCX,oEACwB,oB3ByCb,C2BxCX,oEACwB,oB3BwCb,C2BvCX,oEACwB,oB3BuCb,C2BtCX,oEACwB,oB3BsCb,C2BrCX,oEACwB,oB3BqCb,C2BpCX,oEACwB,oB3BoCb,C2BnCX,oEACwB,oB3BmCb,C2BlCX,oEACwB,oB3BkCb,C2BjCX,oEACwB,wB3BoCb,C2BnCX,oEACwB,wB3BmCb,C2BlCX,oEACwB,wB3BkCb,C2BjCX,oEACwB,wB3BiCb,C2BhCX,oEACwB,wB3BgCb,C2B/BX,oEACwB,wB3B+Bb,C2B9BX,oEACwB,wB3B8Bb,C2B7BX,oEACwB,wB3B6Bb,C2B5BX,oEACwB,wB3B4Bb,C2B3BX,kEACuB,cAEvB,oEACwB,qB3BThB,C2BUR,8EAC6B,qB3BVhB,C2BWb,4EAC4B,qB3BXhB,C2BYZ,0EAC2B,qB3BZhB,C2BaX,kEACuB,qB3BbhB,C2BcP,sEACyB,qB3BdhB,C2BeT,kFAC+B,qB3BfhB,C2BgBf,4EAC4B,qB3BhBhB,C2BiBZ,8EAC6B,qB3BjBhB,C2BkBb,8EAC6B,wB3BlBhB,C2BmBb,oEACwB,qB3BnBhB,C2BoBR,gFAC8B,4B3BpBhB,C2BsBd,0EAC2B,+B3BtBhB,C2BuBX,0EAC2B,+B3BvBhB,C2BwBX,0EAC2B,+B3BxBhB,C2ByBX,0EAC2B,+B3BzBhB,C2B0BX,0EAC2B,+B3B1BhB,C2B2BX,0EAC2B,+B3B3BhB,C2B4BX,0EAC2B,+B3B5BhB,C2B6BX,0EAC2B,+B3B7BhB,C2B8BX,0EAC2B,+B3B9BhB,C2B+BX,0EAC2B,mC3B5BhB,C2B6BX,0EAC2B,mC3B7BhB,C2B8BX,0EAC2B,mC3B9BhB,C2B+BX,0EAC2B,mC3B/BhB,C2BgCX,0EAC2B,mC3BhChB,C2BiCX,0EAC2B,mC3BjChB,C2BkCX,0EAC2B,mC3BlChB,C2BmCX,0EAC2B,mC3BnChB,C2BoCX,0EAC2B,mC3BpChB,C2BsCX,oEACwB,a3BnCb,C2BoCX,0DACmB,a3BpCb,C2BqCN,sEACyB,a3BrCb,C2BsCZ,gEACsB,a3BtCb,C2BuCT,4DACoB,a3BvCb,C2BwCP,gEACsB,U3BxCb,C2ByCT,4EAC4B,a3BzCb,C2B0Cf,gEACsB,a3B1Cb,C2B2CT,4EAC4B,a3B3Cb,C2B4Cf,sEACyB,a3B5Cb,C2B6CZ,oEACwB,a3B7Cb,C2B8CX,4DACoB,a3B9Cb,C2B+CP,wEAC0B,a3B/Cb,C2BgDb,wEAC0B,a3BhDb,C2BiDb,8DACqB,a3BjDb,C2BkDR,0EAC2B,a3BlDb,C2BmDd,4DACoB,a3BnDb,C2BoDP,sEACyB,a3BpDb,C2BqDZ,4DACoB,a3BrDb,C2BsDP,wEAC0B,a3BtDb,C2BuDb,8EAC6B,a3BvDb,C2BwDhB,0EAC2B,a3BxDb,C2ByDd,4EAC4B,a3BzDb,C2B0Df,8EAC6B,a3B1Db,C2B2DhB,wEAC0B,a3B3Db,C2B6Db,0EAC2B,wB3BtFhB,C2BuFX,gEACsB,wB3BvFhB,C2BwFN,4EAC4B,wB3BxFhB,C2ByFZ,sEACyB,wB3BzFhB,C2B0FT,kEACuB,wB3B1FhB,C2B2FP,sEACyB,qB3B3FhB,C2B4FT,kFAC+B,wB3B5FhB,C2B6Ff,sEACyB,wB3B7FhB,C2B8FT,kFAC+B,wB3B9FhB,C2B+Ff,4EAC4B,wB3B/FhB,C2BgGZ,0EAC2B,wB3BhGhB,C2BiGX,kEACuB,wB3BjGhB,C2BkGP,8EAC6B,wB3BlGhB,C2BmGb,8EAC6B,wB3BnGhB,C2BoGb,oEACwB,wB3BpGhB,C2BqGR,gFAC8B,wB3BrGhB,C2BsGd,kEACuB,wB3BtGhB,C2BuGP,4EAC4B,wB3BvGhB,C2BwGZ,kEACuB,wB3BxGhB,C2ByGP,8EAC6B,wB3BzGhB,C2B0Gb,oFACgC,wB3B1GhB,C2B2GhB,gFAC8B,wB3B3GhB,C2B4Gd,kFAC+B,wB3B5GhB,C2B6Gf,oFACgC,wB3B7GhB,C2B8GhB,8EAC6B,wB3B9GhB,C2B+Gb,wEAC0B,yBCrM1B,0B5BrBe,C4BsBf,+B5BrBsB,C4BsBtB,8B5BrBgB,C4BsBhB,6B5BrBiB,C4BsBjB,6B5BrBgB,C4BsBhB,6B5BrBsB,C4BsBtB,6B5BrB4B,C4BsB5B,8B5BrBkC,C4BuBlC,+B5B9Be,C4B+Bf,oC5B9BsB,C4B+BtB,mC5B9BgB,C4B+BhB,kC5B9BiB,C4B+BjB,kC5B9BgB,C4B+BhB,kC5B9BsB,C4B+BtB,kC5B9B4B,C4B+B5B,mC5B9BkC,C4BgClC,gC5BvCe,C4BwCf,qC5BvCsB,C4BwCtB,oC5BvCgB,C4BwChB,mC5BvCiB,C4BwCjB,mC5BvCgB,C4BwChB,mC5BvCsB,C4BwCtB,mC5BvC4B,C4BwC5B,oC5BvCkC,C4ByClC,iC5BhDe,C4BiDf,sC5BhDsB,C4BiDtB,qC5BhDgB,C4BiDhB,oC5BhDiB,C4BiDjB,oC5BhDgB,C4BiDhB,oC5BhDsB,C4BiDtB,oC5BhD4B,C4BiD5B,qC5BhDkC,C4BkDlC,8B5BzDe,C4B0Df,mC5BzDsB,C4B0DtB,kC5BzDgB,C4B0DhB,iC5BzDiB,C4B0DjB,iC5BzDgB,C4B0DhB,iC5BzDsB,C4B0DtB,iC5BzD4B,C4B0D5B,kC5BzDkC,C4B2DlC,iBAEE,gB5BpEa,C4BmEb,a5BnEa,C4BsEf,iBAEE,qB5BvEoB,C4BsEpB,kB5BtEoB,C4ByEtB,iBAEE,oB5B1Ec,C4ByEd,iB5BzEc,C4B4EhB,iBAEE,mB5B7Ee,C4B4Ef,gB5B5Ee,C4B+EjB,iBAEE,mB5BhFc,C4B+Ed,gB5B/Ec,C4BkFhB,iBAEE,mB5BnFoB,C4BkFpB,gB5BlFoB,C4BqFtB,iBAEE,mB5BtF0B,C4BqF1B,gB5BrF0B,C4ByF5B,iBAEE,oB5B1FgC,C4ByFhC,iB5BzFgC,C4B6FlC,iBACE,c5BrGa,C4BsGb,e5BtGa,C4ByGf,iBACE,mB5BzGoB,C4B0GpB,oB5B1GoB,C4B6GtB,iBACE,kB5B7Gc,C4B8Gd,mB5B9Gc,C4BiHhB,iBACE,iB5BjHe,C4BkHf,kB5BlHe,C4BqHjB,iBACE,iB5BrHc,C4BsHd,kB5BtHc,C4ByHhB,iBACE,iB5BzHoB,C4B0HpB,kB5B1HoB,C4B6HtB,iBACE,iB5B7H0B,C4B8H1B,kB5B9H0B,C4BiI5B,iBACE,kB5BjIgC,C4BkIhC,mB5BlIgC,C4BqIlC,yB5B5Ie,C4B6If,8B5B5IsB,C4B6ItB,6B5B5IgB,C4B6IhB,4B5B5IiB,C4B6IjB,4B5B5IgB,C4B6IhB,4B5B5IsB,C4B6ItB,4B5B5I4B,C4B6I5B,6B5B5IkC,C4B8IlC,8B5BrJe,C4BsJf,mC5BrJsB,C4BsJtB,kC5BrJgB,C4BsJhB,iC5BrJiB,C4BsJjB,iC5BrJgB,C4BsJhB,iC5BrJsB,C4BsJtB,iC5BrJ4B,C4BsJ5B,kC5BrJkC,C4BuJlC,+B5B9Je,C4B+Jf,oC5B9JsB,C4B+JtB,mC5B9JgB,C4B+JhB,kC5B9JiB,C4B+JjB,kC5B9JgB,C4B+JhB,kC5B9JsB,C4B+JtB,kC5B9J4B,C4B+J5B,mC5B9JkC,C4BgKlC,gC5BvKe,C4BwKf,qC5BvKsB,C4BwKtB,oC5BvKgB,C4BwKhB,mC5BvKiB,C4BwKjB,mC5BvKgB,C4BwKhB,mC5BvKsB,C4BwKtB,mC5BvK4B,C4BwK5B,oC5BvKkC,C4ByKlC,6B5BhLe,C4BiLf,kC5BhLsB,C4BiLtB,iC5BhLgB,C4BiLhB,gC5BhLiB,C4BiLjB,gC5BhLgB,C4BiLhB,gC5BhLsB,C4BiLtB,gC5BhL4B,C4BiL5B,iC5BhLkC,C4BkLlC,iBAEE,e5B3La,C4B0Lb,Y5B1La,C4B6Lf,iBAEE,oB5B9LoB,C4B6LpB,iB5B7LoB,C4BgMtB,iBAEE,mB5BjMc,C4BgMd,gB5BhMc,C4BmMhB,iBAEE,kB5BpMe,C4BmMf,e5BnMe,C4BsMjB,iBAEE,kB5BvMc,C4BsMd,e5BtMc,C4ByMhB,iBAEE,kB5B1MoB,C4ByMpB,e5BzMoB,C4B4MtB,iBAEE,kB5B7M0B,C4B4M1B,e5B5M0B,C4B+M5B,iBAEE,mB5BhNgC,C4B+MhC,gB5B/MgC,C4BmNlC,iBACE,a5B3Na,C4B4Nb,c5B5Na,C4B8Nf,iBACE,kB5B9NoB,C4B+NpB,mB5B/NoB,C4BiOtB,iBACE,iB5BjOc,C4BkOd,kB5BlOc,C4BoOhB,iBACE,gB5BpOe,C4BqOf,iB5BrOe,C4BuOjB,iBACE,gB5BvOc,C4BwOd,iB5BxOc,C4B0OhB,iBACE,gB5B1OoB,C4B2OpB,iB5B3OoB,C4B6OtB,iBACE,gB5B7O0B,C4B8O1B,iB5B9O0B,C4BgP5B,iBACE,iB5BhPgC,C4BiPhC,kB5BjPgC,C4BoPlC,mCACE,6B5B5Pa,C4B6Pb,kC5B5PoB,C4B6PpB,iC5B5Pc,C4B6Pd,gC5B5Pe,C4B6Pf,gC5B5Pc,C4B6Pd,gC5B5PoB,C4B6PpB,gC5B5P0B,C4B6P1B,iC5B5PgC,C4B8PhC,kC5BrQa,C4BsQb,uC5BrQoB,C4BsQpB,sC5BrQc,C4BsQd,qC5BrQe,C4BsQf,qC5BrQc,C4BsQd,qC5BrQoB,C4BsQpB,qC5BrQ0B,C4BsQ1B,sC5BrQgC,C4BuQhC,mC5B9Qa,C4B+Qb,wC5B9QoB,C4B+QpB,uC5B9Qc,C4B+Qd,sC5B9Qe,C4B+Qf,sC5B9Qc,C4B+Qd,sC5B9QoB,C4B+QpB,sC5B9Q0B,C4B+Q1B,uC5B9QgC,C4BgRhC,oC5BvRa,C4BwRb,yC5BvRoB,C4BwRpB,wC5BvRc,C4BwRd,uC5BvRe,C4BwRf,uC5BvRc,C4BwRd,uC5BvRoB,C4BwRpB,uC5BvR0B,C4BwR1B,wC5BvRgC,C4ByRhC,iC5BhSa,C4BiSb,sC5BhSoB,C4BiSpB,qC5BhSc,C4BiSd,oC5BhSe,C4BiSf,oC5BhSc,C4BiSd,oC5BhSoB,C4BiSpB,oC5BhS0B,C4BiS1B,qC5BhSgC,C4BkShC,oBAEE,gB5B3SW,C4B0SX,a5B1SW,C4B6Sb,oBAEE,qB5B9SkB,C4B6SlB,kB5B7SkB,C4BgTpB,oBAEE,oB5BjTY,C4BgTZ,iB5BhTY,C4BmTd,oBAEE,mB5BpTa,C4BmTb,gB5BnTa,C4BsTf,oBAEE,mB5BvTY,C4BsTZ,gB5BtTY,C4ByTd,oBAEE,mB5B1TkB,C4ByTlB,gB5BzTkB,C4B4TpB,oBAEE,mB5B7TwB,C4B4TxB,gB5B5TwB,C4B+T1B,oBAEE,oB5BhU8B,C4B+T9B,iB5B/T8B,C4BkUhC,oBACE,c5B1UW,C4B2UX,e5B3UW,C4B6Ub,oBACE,mB5B7UkB,C4B8UlB,oB5B9UkB,C4BgVpB,oBACE,kB5BhVY,C4BiVZ,mB5BjVY,C4BmVd,oBACE,iB5BnVa,C4BoVb,kB5BpVa,C4BsVf,oBACE,iB5BtVY,C4BuVZ,kB5BvVY,C4ByVd,oBACE,iB5BzVkB,C4B0VlB,kB5B1VkB,C4B4VpB,oBACE,iB5B5VwB,C4B6VxB,kB5B7VwB,C4B+V1B,oBACE,kB5B/V8B,C4BgW9B,mB5BhW8B,C4BmWhC,4B5B1Wa,C4B2Wb,iC5B1WoB,C4B2WpB,gC5B1Wc,C4B2Wd,+B5B1We,C4B2Wf,+B5B1Wc,C4B2Wd,+B5B1WoB,C4B2WpB,+B5B1W0B,C4B2W1B,gC5B1WgC,C4B4WhC,iC5BnXa,C4BoXb,sC5BnXoB,C4BoXpB,qC5BnXc,C4BoXd,oC5BnXe,C4BoXf,oC5BnXc,C4BoXd,oC5BnXoB,C4BoXpB,oC5BnX0B,C4BoX1B,qC5BnXgC,C4BqXhC,kC5B5Xa,C4B6Xb,uC5B5XoB,C4B6XpB,sC5B5Xc,C4B6Xd,qC5B5Xe,C4B6Xf,qC5B5Xc,C4B6Xd,qC5B5XoB,C4B6XpB,qC5B5X0B,C4B6X1B,sC5B5XgC,C4B8XhC,mC5BrYa,C4BsYb,wC5BrYoB,C4BsYpB,uC5BrYc,C4BsYd,sC5BrYe,C4BsYf,sC5BrYc,C4BsYd,sC5BrYoB,C4BsYpB,sC5BrY0B,C4BsY1B,uC5BrYgC,C4BuYhC,gC5B9Ya,C4B+Yb,qC5B9YoB,C4B+YpB,oC5B9Yc,C4B+Yd,mC5B9Ye,C4B+Yf,mC5B9Yc,C4B+Yd,mC5B9YoB,C4B+YpB,mC5B9Y0B,C4B+Y1B,oC5B9YgC,C4BgZhC,oBAEE,e5BzZW,C4BwZX,Y5BxZW,C4B2Zb,oBAEE,oB5B5ZkB,C4B2ZlB,iB5B3ZkB,C4B8ZpB,oBAEE,mB5B/ZY,C4B8ZZ,gB5B9ZY,C4Biad,oBAEE,kB5Blaa,C4Biab,e5Bjaa,C4Boaf,oBAEE,kB5BraY,C4BoaZ,e5BpaY,C4Buad,oBAEE,kB5BxakB,C4BualB,e5BvakB,C4B0apB,oBAEE,kB5B3awB,C4B0axB,e5B1awB,C4B6a1B,oBAEE,mB5B9a8B,C4B6a9B,gB5B7a8B,C4BibhC,oBACE,a5BzbW,C4B0bX,c5B1bW,C4B4bb,oBACE,kB5B5bkB,C4B6blB,mB5B7bkB,C4B+bpB,oBACE,iB5B/bY,C4BgcZ,kB5BhcY,C4Bkcd,oBACE,gB5Blca,C4Bmcb,iB5Bnca,C4Bqcf,oBACE,gB5BrcY,C4BscZ,iB5BtcY,C4Bwcd,oBACE,gB5BxckB,C4ByclB,iB5BzckB,C4B2cpB,oBACE,gB5B3cwB,C4B4cxB,iB5B5cwB,C4B8c1B,oBACE,iB5B9c8B,C4B+c9B,kB5B/c8B,E4BodlC,uDACE,4B5B5da,C4B6db,iC5B5doB,C4B6dpB,gC5B5dc,C4B6dd,+B5B5de,C4B6df,+B5B5dc,C4B6dd,+B5B5doB,C4B6dpB,+B5B5d0B,C4B6d1B,gC5B5dgC,C4B8dhC,iC5Brea,C4Bseb,sC5BreoB,C4BsepB,qC5Brec,C4Bsed,oC5Bree,C4Bsef,oC5Brec,C4Bsed,oC5BreoB,C4BsepB,oC5Bre0B,C4Bse1B,qC5BregC,C4BuehC,kC5B9ea,C4B+eb,uC5B9eoB,C4B+epB,sC5B9ec,C4B+ed,qC5B9ee,C4B+ef,qC5B9ec,C4B+ed,qC5B9eoB,C4B+epB,qC5B9e0B,C4B+e1B,sC5B9egC,C4BgfhC,mC5Bvfa,C4Bwfb,wC5BvfoB,C4BwfpB,uC5Bvfc,C4Bwfd,sC5Bvfe,C4Bwff,sC5Bvfc,C4Bwfd,sC5BvfoB,C4BwfpB,sC5Bvf0B,C4Bwf1B,uC5BvfgC,C4ByfhC,gC5BhgBa,C4BigBb,qC5BhgBoB,C4BigBpB,oC5BhgBc,C4BigBd,mC5BhgBe,C4BigBf,mC5BhgBc,C4BigBd,mC5BhgBoB,C4BigBpB,mC5BhgB0B,C4BigB1B,oC5BhgBgC,C4BkgBhC,mBAEE,gB5B3gBW,C4B0gBX,a5B1gBW,C4B6gBb,mBAEE,qB5B9gBkB,C4B6gBlB,kB5B7gBkB,C4BghBpB,mBAEE,oB5BjhBY,C4BghBZ,iB5BhhBY,C4BmhBd,mBAEE,mB5BphBa,C4BmhBb,gB5BnhBa,C4BshBf,mBAEE,mB5BvhBY,C4BshBZ,gB5BthBY,C4ByhBd,mBAEE,mB5B1hBkB,C4ByhBlB,gB5BzhBkB,C4B4hBpB,mBAEE,mB5B7hBwB,C4B4hBxB,gB5B5hBwB,C4B+hB1B,mBAEE,oB5BhiB8B,C4B+hB9B,iB5B/hB8B,C4BmiBhC,mBACE,c5B3iBW,C4B4iBX,e5B5iBW,C4B8iBb,mBACE,mB5B9iBkB,C4B+iBlB,oB5B/iBkB,C4BijBpB,mBACE,kB5BjjBY,C4BkjBZ,mB5BljBY,C4BojBd,mBACE,iB5BpjBa,C4BqjBb,kB5BrjBa,C4BujBf,mBACE,iB5BvjBY,C4BwjBZ,kB5BxjBY,C4B0jBd,mBACE,iB5B1jBkB,C4B2jBlB,kB5B3jBkB,C4B6jBpB,mBACE,iB5B7jBwB,C4B8jBxB,kB5B9jBwB,C4BgkB1B,mBACE,kB5BhkB8B,C4BikB9B,mB5BjkB8B,C4BokBhC,2B5B3kBa,C4B4kBb,gC5B3kBoB,C4B4kBpB,+B5B3kBc,C4B4kBd,8B5B3kBe,C4B4kBf,8B5B3kBc,C4B4kBd,8B5B3kBoB,C4B4kBpB,8B5B3kB0B,C4B4kB1B,+B5B3kBgC,C4B6kBhC,gC5BplBa,C4BqlBb,qC5BplBoB,C4BqlBpB,oC5BplBc,C4BqlBd,mC5BplBe,C4BqlBf,mC5BplBc,C4BqlBd,mC5BplBoB,C4BqlBpB,mC5BplB0B,C4BqlB1B,oC5BplBgC,C4BslBhC,iC5B7lBa,C4B8lBb,sC5B7lBoB,C4B8lBpB,qC5B7lBc,C4B8lBd,oC5B7lBe,C4B8lBf,oC5B7lBc,C4B8lBd,oC5B7lBoB,C4B8lBpB,oC5B7lB0B,C4B8lB1B,qC5B7lBgC,C4B+lBhC,kC5BtmBa,C4BumBb,uC5BtmBoB,C4BumBpB,sC5BtmBc,C4BumBd,qC5BtmBe,C4BumBf,qC5BtmBc,C4BumBd,qC5BtmBoB,C4BumBpB,qC5BtmB0B,C4BumB1B,sC5BtmBgC,C4BwmBhC,+B5B/mBa,C4BgnBb,oC5B/mBoB,C4BgnBpB,mC5B/mBc,C4BgnBd,kC5B/mBe,C4BgnBf,kC5B/mBc,C4BgnBd,kC5B/mBoB,C4BgnBpB,kC5B/mB0B,C4BgnB1B,mC5B/mBgC,C4BinBhC,mBAEE,e5B1nBW,C4BynBX,Y5BznBW,C4B4nBb,mBAEE,oB5B7nBkB,C4B4nBlB,iB5B5nBkB,C4B+nBpB,mBAEE,mB5BhoBY,C4B+nBZ,gB5B/nBY,C4BkoBd,mBAEE,kB5BnoBa,C4BkoBb,e5BloBa,C4BqoBf,mBAEE,kB5BtoBY,C4BqoBZ,e5BroBY,C4BwoBd,mBAEE,kB5BzoBkB,C4BwoBlB,e5BxoBkB,C4B2oBpB,mBAEE,kB5B5oBwB,C4B2oBxB,e5B3oBwB,C4B8oB1B,mBAEE,mB5B/oB8B,C4B8oB9B,gB5B9oB8B,C4BkpBhC,mBACE,a5B1pBW,C4B2pBX,c5B3pBW,C4B6pBb,mBACE,kB5B7pBkB,C4B8pBlB,mB5B9pBkB,C4BgqBpB,mBACE,iB5BhqBY,C4BiqBZ,kB5BjqBY,C4BmqBd,mBACE,gB5BnqBa,C4BoqBb,iB5BpqBa,C4BsqBf,mBACE,gB5BtqBY,C4BuqBZ,iB5BvqBY,C4ByqBd,mBACE,gB5BzqBkB,C4B0qBlB,iB5B1qBkB,C4B4qBpB,mBACE,gB5B5qBwB,C4B6qBxB,iB5B7qBwB,C4B+qB1B,mBACE,iB5B/qB8B,C4BgrB9B,kB5BhrB8B,E4BqrBlC,mCACE,4B5B7rBa,C4B8rBb,iC5B7rBoB,C4B8rBpB,gC5B7rBc,C4B8rBd,+B5B7rBe,C4B8rBf,+B5B7rBc,C4B8rBd,+B5B7rBoB,C4B8rBpB,+B5B7rB0B,C4B8rB1B,gC5B7rBgC,C4B+rBhC,iC5BtsBa,C4BusBb,sC5BtsBoB,C4BusBpB,qC5BtsBc,C4BusBd,oC5BtsBe,C4BusBf,oC5BtsBc,C4BusBd,oC5BtsBoB,C4BusBpB,oC5BtsB0B,C4BusB1B,qC5BtsBgC,C4BwsBhC,kC5B/sBa,C4BgtBb,uC5B/sBoB,C4BgtBpB,sC5B/sBc,C4BgtBd,qC5B/sBe,C4BgtBf,qC5B/sBc,C4BgtBd,qC5B/sBoB,C4BgtBpB,qC5B/sB0B,C4BgtB1B,sC5B/sBgC,C4BitBhC,mC5BxtBa,C4BytBb,wC5BxtBoB,C4BytBpB,uC5BxtBc,C4BytBd,sC5BxtBe,C4BytBf,sC5BxtBc,C4BytBd,sC5BxtBoB,C4BytBpB,sC5BxtB0B,C4BytB1B,uC5BxtBgC,C4B0tBhC,gC5BjuBa,C4BkuBb,qC5BjuBoB,C4BkuBpB,oC5BjuBc,C4BkuBd,mC5BjuBe,C4BkuBf,mC5BjuBc,C4BkuBd,mC5BjuBoB,C4BkuBpB,mC5BjuB0B,C4BkuB1B,oC5BjuBgC,C4BmuBhC,mBAEE,gB5B5uBW,C4B2uBX,a5B3uBW,C4B8uBb,mBAEE,qB5B/uBkB,C4B8uBlB,kB5B9uBkB,C4BivBpB,mBAEE,oB5BlvBY,C4BivBZ,iB5BjvBY,C4BovBd,mBAEE,mB5BrvBa,C4BovBb,gB5BpvBa,C4BuvBf,mBAEE,mB5BxvBY,C4BuvBZ,gB5BvvBY,C4B0vBd,mBAEE,mB5B3vBkB,C4B0vBlB,gB5B1vBkB,C4B6vBpB,mBAEE,mB5B9vBwB,C4B6vBxB,gB5B7vBwB,C4BgwB1B,mBAEE,oB5BjwB8B,C4BgwB9B,iB5BhwB8B,C4BowBhC,mBACE,c5B5wBW,C4B6wBX,e5B7wBW,C4B+wBb,mBACE,mB5B/wBkB,C4BgxBlB,oB5BhxBkB,C4BkxBpB,mBACE,kB5BlxBY,C4BmxBZ,mB5BnxBY,C4BqxBd,mBACE,iB5BrxBa,C4BsxBb,kB5BtxBa,C4BwxBf,mBACE,iB5BxxBY,C4ByxBZ,kB5BzxBY,C4B2xBd,mBACE,iB5B3xBkB,C4B4xBlB,kB5B5xBkB,C4B8xBpB,mBACE,iB5B9xBwB,C4B+xBxB,kB5B/xBwB,C4BiyB1B,mBACE,kB5BjyB8B,C4BkyB9B,mB5BlyB8B,C4BqyBhC,2B5B5yBa,C4B6yBb,gC5B5yBoB,C4B6yBpB,+B5B5yBc,C4B6yBd,8B5B5yBe,C4B6yBf,8B5B5yBc,C4B6yBd,8B5B5yBoB,C4B6yBpB,8B5B5yB0B,C4B6yB1B,+B5B5yBgC,C4B8yBhC,gC5BrzBa,C4BszBb,qC5BrzBoB,C4BszBpB,oC5BrzBc,C4BszBd,mC5BrzBe,C4BszBf,mC5BrzBc,C4BszBd,mC5BrzBoB,C4BszBpB,mC5BrzB0B,C4BszB1B,oC5BrzBgC,C4BuzBhC,iC5B9zBa,C4B+zBb,sC5B9zBoB,C4B+zBpB,qC5B9zBc,C4B+zBd,oC5B9zBe,C4B+zBf,oC5B9zBc,C4B+zBd,oC5B9zBoB,C4B+zBpB,oC5B9zB0B,C4B+zB1B,qC5B9zBgC,C4Bg0BhC,kC5Bv0Ba,C4Bw0Bb,uC5Bv0BoB,C4Bw0BpB,sC5Bv0Bc,C4Bw0Bd,qC5Bv0Be,C4Bw0Bf,qC5Bv0Bc,C4Bw0Bd,qC5Bv0BoB,C4Bw0BpB,qC5Bv0B0B,C4Bw0B1B,sC5Bv0BgC,C4By0BhC,+B5Bh1Ba,C4Bi1Bb,oC5Bh1BoB,C4Bi1BpB,mC5Bh1Bc,C4Bi1Bd,kC5Bh1Be,C4Bi1Bf,kC5Bh1Bc,C4Bi1Bd,kC5Bh1BoB,C4Bi1BpB,kC5Bh1B0B,C4Bi1B1B,mC5Bh1BgC,C4Bk1BhC,mBAEE,e5B31BW,C4B01BX,Y5B11BW,C4B61Bb,mBAEE,oB5B91BkB,C4B61BlB,iB5B71BkB,C4Bg2BpB,mBAEE,mB5Bj2BY,C4Bg2BZ,gB5Bh2BY,C4Bm2Bd,mBAEE,kB5Bp2Ba,C4Bm2Bb,e5Bn2Ba,C4Bs2Bf,mBAEE,kB5Bv2BY,C4Bs2BZ,e5Bt2BY,C4By2Bd,mBAEE,kB5B12BkB,C4By2BlB,e5Bz2BkB,C4B42BpB,mBAEE,kB5B72BwB,C4B42BxB,e5B52BwB,C4B+2B1B,mBAEE,mB5Bh3B8B,C4B+2B9B,gB5B/2B8B,C4Bm3BhC,mBACE,a5B33BW,C4B43BX,c5B53BW,C4B83Bb,mBACE,kB5B93BkB,C4B+3BlB,mB5B/3BkB,C4Bi4BpB,mBACE,iB5Bj4BY,C4Bk4BZ,kB5Bl4BY,C4Bo4Bd,mBACE,gB5Bp4Ba,C4Bq4Bb,iB5Br4Ba,C4Bu4Bf,mBACE,gB5Bv4BY,C4Bw4BZ,iB5Bx4BY,C4B04Bd,mBACE,gB5B14BkB,C4B24BlB,iB5B34BkB,C4B64BpB,mBACE,gB5B74BwB,C4B84BxB,iB5B94BwB,C4Bg5B1B,mBACE,iB5Bh5B8B,C4Bi5B9B,kB5Bj5B8B,E6BMlC,gCACA,+BACA,8BACA,8BACA,8BACA,8BACA,+BAEA,qCACA,oCACA,mCACA,mCACA,mCACA,mCACA,oCAEA,sCACA,qCACA,oCACA,oCACA,oCACA,oCACA,qCAEA,uCACA,sCACA,qCACA,qCACA,qCACA,qCACA,sCAEA,oCACA,mCACA,kCACA,kCACA,kCACA,kCACA,mCAEA,mCAEE,mCACA,kCACA,iCACA,iCACA,iCACA,iCACA,kCAEA,wCACA,uCACA,sCACA,sCACA,sCACA,sCACA,uCAEA,yCACA,wCACA,uCACA,uCACA,uCACA,uCACA,wCAEA,0CACA,yCACA,wCACA,wCACA,wCACA,wCACA,yCAEA,uCACA,sCACA,qCACA,qCACA,qCACA,qCACA,uCAIF,uDACE,kCACA,iCACA,gCACA,gCACA,gCACA,gCACA,iCAEA,uCACA,sCACA,qCACA,qCACA,qCACA,qCACA,sCAEA,wCACA,uCACA,sCACA,sCACA,sCACA,sCACA,uCAEA,yCACA,wCACA,uCACA,uCACA,uCACA,uCACA,wCAEA,sCACA,qCACA,oCACA,oCACA,oCACA,oCACA,sCAIF,mCACE,kCACA,iCACA,gCACA,gCACA,gCACA,gCACA,iCAEA,uCACA,sCACA,qCACA,qCACA,qCACA,qCACA,sCAEA,wCACA,uCACA,sCACA,sCACA,sCACA,sCACA,uCAEA,yCACA,wCACA,uCACA,uCACA,uCACA,uCACA,wCAEA,sCACA,qCACA,oCACA,oCACA,oCACA,oCACA,sCC7LF,sBACI,yBACA,iBAGJ,kDACE,qB9BwDa,C8BrDf,+CACE,qB9BqDU,C8BlDZ,gDACE,qB9BkDW,C8B/Cb,gDACE,wB9B+CW,C8B5Cb,yCACE,mC9BkES,C8B/DX,wCACE,+B9BkDS,C+BtEX,sFACA,mFACA,4EAGA,mCACE,yFACA,sFACA,gFAGF,uDACE,wFACA,qFACA,+EAGF,mCACE,wFACA,qFACA,+ECZF,gCACA,iCACA,kCACA,mCAEA,mCACE,mCACA,oCACA,qCACA,uCAGF,uDACE,kCACA,mCACA,oCACA,sCAGF,mCACE,kCACA,mCACA,oCACA,sCCvBF,2CACA,0CACA,0CACA,qCAEA,mCACE,8CACA,6CACA,6CACA,yCAGF,uDACE,6CACA,4CACA,4CACA,wCAGF,mCACE,6CACA,4CACA,4CACA,wCCfF,yCAEE,clChCmB,CkCkCrB,4CAEE,clCnCsB,CkC0CxB,8BlCzCc,CkC0Cd,iClCzCc,CkC0Cd,gClCzCc,CkC0Cd,iClCzCc,CkC0Cd,8BlCzCc,CkC0Cd,iClCzCc,CkC0Cd,gClCzCc,CkC2Cd,mCACE,+CACiB,clCrDE,CkCsDnB,kDACoB,clCtDE,CkCuDtB,iClCtDY,CkCuDZ,oClCtDY,CkCuDZ,mClCtDY,CkCuDZ,oClCtDY,CkCuDZ,iClCtDY,CkCuDZ,oClCtDY,CkCuDZ,mClCtDY,EkCyDd,uDACE,6CACgB,clCnEG,CkCoEnB,gDACmB,clCpEG,CkCqEtB,gClCpEY,CkCqEZ,mClCpEY,CkCqEZ,kClCpEY,CkCqEZ,mClCpEY,CkCqEZ,gClCpEY,CkCqEZ,mClCpEY,CkCqEZ,kClCpEY,EkCuEd,mCACE,6CAEE,clClFiB,CkCoFnB,gDAEE,clCrFoB,CkCuFtB,gClCtFY,CkCuFZ,mClCtFY,CkCuFZ,kClCtFY,CkCuFZ,mClCtFY,CkCuFZ,gClCtFY,CkCuFZ,mClCtFY,CkCuFZ,kClCtFY,EmCQd,qBACE,cnCFQ,CmCMV,0BACE,cnCLa,CmCSf,4BACE,cnCXe,CmCejB,oBAGE,gBADA,aADA,eAEA,CAGF,wBACE,qDAKF,sBAEE,gBACA,uBAFA,kBAEA,CAGF,mCACE,wBACE,cnCpCM,CmCsCR,6BACE,cnCrCW,CmCuCb,+BACE,cnCzCa,CmC2Cf,uBAGE,gBADA,aADA,eAEA,CAEF,2BACE,qDAEF,yBAEE,gBACA,uBAFA,kBAEA,EAIJ,uDACE,uBACE,cnC7DM,CmC+DR,4BACE,cnC9DW,CmCgEb,8BACE,cnClEa,CmCoEf,sBAGE,gBADA,aADA,eAEA,CAEF,0BACE,qDAEF,wBAEE,gBACA,uBAFA,kBAEA,EAIJ,mCACE,uBACE,cnCtFM,CmCwFR,4BACE,cnCvFW,CmCyFb,8BACE,cnC3Fa,CmC6Ff,sBAGE,gBADA,aADA,eA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","sources":["webpack://swagger-ui/./src/style/main.scss","webpack://swagger-ui/./src/style/_type.scss","webpack://swagger-ui/./src/style/_variables.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_normalize.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_debug-children.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_debug-grid.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_box-sizing.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_aspect-ratios.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_images.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_background-size.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_background-position.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_outlines.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_borders.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_border-colors.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_variables.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_border-radius.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_border-style.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_border-widths.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_box-shadow.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_code.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_coordinates.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_clears.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_flexbox.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_display.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_floats.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_font-family.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_font-style.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_font-weight.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_forms.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_heights.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_letter-spacing.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_line-height.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_links.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_lists.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_max-widths.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_widths.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_overflow.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_position.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_opacity.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_rotations.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_skins.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_skins-pseudo.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_spacing.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_negative-margins.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_tables.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_text-decoration.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_text-align.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_text-transform.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_type-scale.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_typography.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_utilities.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_visibility.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_white-space.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_vertical-align.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_hovers.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_z-index.scss","webpack://swagger-ui/./node_modules/tachyons-sass/scss/_nested.scss","webpack://swagger-ui/./src/style/_layout.scss","webpack://swagger-ui/./src/style/_buttons.scss","webpack://swagger-ui/./src/style/_mixins.scss","webpack://swagger-ui/./src/style/_form.scss","webpack://swagger-ui/./src/style/_modal.scss","webpack://swagger-ui/./src/style/_models.scss","webpack://swagger-ui/./src/style/_servers.scss","webpack://swagger-ui/./src/style/_table.scss","webpack://swagger-ui/./src/style/_topbar.scss","webpack://swagger-ui/./src/style/_information.scss","webpack://swagger-ui/./src/style/_authorize.scss","webpack://swagger-ui/./src/style/_errors.scss","webpack://swagger-ui/./src/style/_split-pane-mode.scss","webpack://swagger-ui/./src/style/_markdown.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/JSONSchema/_json-schema.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/_all.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/Accordion/_accordion.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/ExpandDeepButton/_expand-deep-button.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/_all.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/$vocabulary/_$vocabulary.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/Description/_description.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/Title/_title.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/Properties/_properties.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/PatternProperties/_pattern-properties.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/Enum/_enum.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/Constraint/_constraint.scss","webpack://swagger-ui/./src/core/plugins/json-schema-2020-12/components/keywords/DependentRequired/_dependent-required.scss","webpack://swagger-ui/./src/core/plugins/oas31/components/model/_model.scss","webpack://swagger-ui/./src/core/plugins/oas31/components/models/_models.scss"],"sourcesContent":[".swagger-ui\n{\n @import '~tachyons-sass/tachyons.scss';\n @import 'mixins';\n @import 'variables';\n @import 'type';\n @import 'layout';\n @import 'buttons';\n @import 'form';\n @import 'modal';\n @import 'models';\n @import 'servers';\n @import 'table';\n @import 'topbar';\n @import 'information';\n @import 'authorize';\n @import 'errors';\n @include text_body();\n @import 'split-pane-mode';\n @import 'markdown';\n @import '../core/plugins/json-schema-2020-12/components/all';\n @import '../core/plugins/oas31/components/all';\n}\n","@mixin text_body($color: $text-body-default-font-color)\n{\n font-family: sans-serif;\n\n color: $color;\n}\n\n@mixin text_code($color: $text-code-default-font-color)\n{\n font-family: monospace;\n font-weight: 600;\n\n color: $color;\n}\n\n@mixin text_headline($color: $text-headline-default-font-color)\n{\n font-family: sans-serif;\n\n color: $color;\n}\n","// Base Colours\n$black: #000 !default;\n$white: #fff !default;\n$gray-50: lighten($black, 92%) !default; //ebebeb\n$gray-200: lighten($black, 62.75%) !default; // #a0a0a0\n$gray-300: lighten($black, 56.5%) !default; // #909090\n$gray-400: lighten($black, 50%) !default; // #808080\n$gray-500: lighten($black, 43.75%) !default; // #707070\n$gray-600: lighten($black, 37.5%) !default; // #606060\n$gray-650: lighten($black, 33.3%) !default; // #555555\n$gray-700: lighten($black, 31.25%) !default; // #505050\n$gray-800: lighten($black, 25%) !default; // #404040\n$gray-900: lighten($black, 18.75%) !default; // #303030\n\n$cod-gray: #1b1b1b !default;\n$agate-gray: #333333 !default;\n$bright-gray: #3b4151 !default;\n$mako-gray: #41444e !default;\n$waterloo-gray: #7d8492 !default;\n$alto-gray: #d9d9d9 !default;\n$mercury-gray: #e4e4e4 !default;\n$concrete-gray: #e8e8e8 !default;\n$alabaster: #f7f7f7 !default;\n$apple-green: #62a03f !default;\n$green-haze: #009d77 !default;\n$japanese-laurel: #008000 !default;\n$persian-green: #00a0a7 !default;\n$geyser-blue: #d8dde7 !default;\n$dodger-blue: #1391ff !default;\n$endeavour-blue: #005dae !default;\n$scampi-purple: #55a !default;\n$electric-violet: #7300e5 !default;\n$persian-red: #cf3030 !default;\n$mango-tango: #e97500 !default;\n\n// Theme\n\n$color-primary: #89bf04 !default;\n$color-secondary: #9012fe !default;\n$color-info: #4990e2 !default;\n$color-warning: #ff6060 !default;\n$color-danger: #f00 !default;\n\n$color-primary-hover: lighten($color-primary, .5%) !default;\n\n$_color-post: #49cc90 !default;\n$_color-get: #61affe !default;\n$_color-put: #fca130 !default;\n$_color-delete: #f93e3e !default;\n$_color-head: #9012fe !default;\n$_color-patch: #50e3c2 !default;\n$_color-disabled: #ebebeb !default;\n$_color-options: #0d5aa7 !default;\n\n// Authorize\n\n$auth-container-border-color: $gray-50 !default;\n$auth-select-all-none-link-font-color: $color-info !default;\n// Buttons\n\n$btn-background-color: transparent !default;\n$btn-border-color: $gray-400 !default;\n$btn-font-color: inherit !default;\n$btn-box-shadow-color: $black !default;\n\n$btn-authorize-background-color: transparent !default;\n$btn-authorize-border-color: $_color-post !default;\n$btn-authorize-font-color: $_color-post !default;\n$btn-authorize-svg-fill-color: $_color-post !default;\n\n$btn-cancel-background-color: transparent !default;\n$btn-cancel-border-color: $color-warning !default;\n$btn-cancel-font-color: $color-warning !default;\n\n$btn-execute-background-color: transparent !default;\n$btn-execute-border-color: $color-info !default;\n$btn-execute-font-color: $white !default;\n$btn-execute-background-color-alt: $color-info !default;\n\n$expand-methods-svg-fill-color: $gray-500 !default;\n$expand-methods-svg-fill-color-hover: $gray-800 !default;\n\n// Errors\n\n$errors-wrapper-background-color: $_color-delete !default;\n$errors-wrapper-border-color: $_color-delete !default;\n\n$errors-wrapper-errors-small-font-color: $gray-600 !default;\n\n// Form\n\n$form-select-background-color: $alabaster !default;\n$form-select-border-color: $mako-gray !default;\n$form-select-box-shadow-color: $black !default;\n\n$form-input-border-color: $alto-gray !default;\n$form-input-background-color: $white !default;\n\n$form-textarea-background-color: $white !default;\n$form-textarea-focus-border-color: $_color-get !default;\n\n$form-textarea-curl-background-color: $mako-gray !default;\n$form-textarea-curl-font-color: $white !default;\n\n$form-checkbox-label-font-color: $gray-900 !default;\n$form-checkbox-background-color: $concrete-gray !default;\n$form-checkbox-box-shadow-color: $concrete-gray !default;\n\n// Information\n\n$info-code-background-color: $black !default;\n$info-code-font-color: $_color-head !default;\n\n$info-link-font-color: $color-info !default;\n$info-link-font-color-hover: $info-link-font-color !default;\n\n$info-title-small-background-color: $waterloo-gray !default;\n\n$info-title-small-pre-font-color: $white !default;\n\n// Layout\n\n$opblock-border-color: $black !default;\n$opblock-box-shadow-color: $black !default;\n\n$opblock-tag-border-bottom-color: $bright-gray !default;\n$opblock-tag-background-color-hover: $black !default;\n\n$opblock-tab-header-tab-item-active-h4-span-after-background-color: $gray-400 !default;\n\n$opblock-isopen-summary-border-bottom-color: $black !default;\n\n$opblock-isopen-section-header-background-color: $white !default;\n$opblock-isopen-section-header-box-shadow-color: $black !default;\n\n$opblock-summary-method-background-color: $black !default;\n$opblock-summary-method-font-color: $white !default;\n$opblock-summary-method-text-shadow-color: $black !default;\n\n$operational-filter-input-border-color: $geyser-blue !default;\n\n$tab-list-item-first-background-color: $black !default;\n\n$response-col-status-undocumented-font-color: $gray-300 !default;\n\n$response-col-links-font-color: $gray-300 !default;\n\n$opblock-body-background-color: $agate-gray !default;\n$opblock-body-font-color: $white !default;\n\n$scheme-container-background-color: $white !default;\n$scheme-container-box-shadow-color: $black !default;\n\n$server-container-background-color: $white !default;\n$server-container-box-shadow-color: $black !default;\n\n$server-container-computed-url-code-font-color: $gray-400 !default;\n\n$loading-container-before-border-color: $gray-650 !default;\n$loading-container-before-border-top-color: $black !default;\n\n$response-content-type-controls-accept-header-select-border-color: $japanese-laurel !default;\n$response-content-type-controls-accept-header-small-font-color: $japanese-laurel !default;\n\n// Modal\n\n$dialog-ux-backdrop-background-color: $black !default;\n\n\n$dialog-ux-modal-background-color: $white !default;\n$dialog-ux-modal-border-color: $gray-50 !default;\n$dialog-ux-modal-box-shadow-color: $black !default;\n\n$dialog-ux-modal-content-font-color: $mako-gray !default;\n\n$dialog-ux-modal-header-border-bottom-color: $gray-50 !default;\n\n// Models\n\n$model-deprecated-font-color: $gray-200 !default;\n\n$model-hint-font-color: $gray-50 !default;\n$model-hint-background-color: $black !default;\n\n$section-models-border-color: $bright-gray !default;\n\n$section-models-isopen-h4-border-bottom-color: $section-models-border-color !default;\n\n$section-models-h4-font-color: $gray-600 !default;\n$section-models-h4-background-color-hover: $black !default;\n\n$section-models-h5-font-color: $gray-500 !default;\n\n$section-models-model-container-background-color: $black !default;\n\n$section-models-model-box-background-color: $black !default;\n\n$section-models-model-title-font-color: $gray-700 !default;\n\n$prop-type-font-color: $scampi-purple !default;\n\n$prop-format-font-color: $gray-600 !default;\n\n// Tables\n\n$table-thead-td-border-bottom-color: $bright-gray !default;\n\n$table-parameter-name-required-font-color: $color-danger !default;\n\n$table-parameter-in-font-color: $gray-400 !default;\n\n$table-parameter-deprecated-font-color: $color-danger !default;\n\n// Topbar\n\n$topbar-background-color: $cod-gray !default;\n\n$topbar-link-font-color: $white !default;\n\n$topbar-download-url-wrapper-element-border-color: $apple-green !default;\n\n$topbar-download-url-button-background-color: $apple-green !default;\n$topbar-download-url-button-font-color: $white !default;\n\n// Type\n\n$text-body-default-font-color: $bright-gray !default;\n$text-code-default-font-color: $bright-gray !default;\n$text-headline-default-font-color: $bright-gray !default;\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in\n * IE on Windows Phone and in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers (opinionated).\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\n\narticle,\naside,\nfooter,\nheader,\nnav,\nsection {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in IE.\n */\n\nfigcaption,\nfigure,\nmain { /* 1 */\n display: block;\n}\n\n/**\n * Add the correct margin in IE 8.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * 1. Remove the gray background on active links in IE 10.\n * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.\n */\n\na {\n background-color: transparent; /* 1 */\n -webkit-text-decoration-skip: objects; /* 2 */\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\n\nb,\nstrong {\n font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\n\nmark {\n background-color: #ff0;\n color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\naudio,\nvideo {\n display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\n\nimg {\n border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers (opinionated).\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: sans-serif; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n * controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\nhtml [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * 1. Add the correct display in IE 9-.\n * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n */\n\ndetails, /* 1 */\nmenu {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Scripting\n ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\ncanvas {\n display: inline-block;\n}\n\n/**\n * Add the correct display in IE.\n */\n\ntemplate {\n display: none;\n}\n\n/* Hidden\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10-.\n */\n\n[hidden] {\n display: none;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n DEBUG CHILDREN\n Docs: http://tachyons.io/docs/debug/\n\n Just add the debug class to any element to see outlines on its\n children.\n\n*/\n\n.debug * { outline: 1px solid gold; }\n.debug-white * { outline: 1px solid white; }\n.debug-black * { outline: 1px solid black; }\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n DEBUG GRID\n http://tachyons.io/docs/debug-grid/\n\n Can be useful for debugging layout issues\n or helping to make sure things line up perfectly.\n Just tack one of these classes onto a parent element.\n\n*/\n\n.debug-grid {\n background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat top left;\n}\n\n.debug-grid-16 {\n background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat top left;\n}\n\n.debug-grid-8-solid {\n background:white url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat top left;\n}\n\n.debug-grid-16-solid {\n background:white url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat top left;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BOX SIZING\n\n*/\n\nhtml,\nbody,\ndiv,\narticle,\nsection,\nmain,\nfooter,\nheader,\nform,\nfieldset,\nlegend,\npre,\ncode,\na,\nh1,h2,h3,h4,h5,h6,\np,\nul,\nol,\nli,\ndl,\ndt,\ndd,\ntextarea,\ntable,\ntd,\nth,\ntr,\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"password\"],\ninput[type=\"tel\"],\ninput[type=\"text\"],\ninput[type=\"url\"],\n.border-box {\n box-sizing: border-box;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n ASPECT RATIOS\n\n*/\n\n/* This is for fluid media that is embedded from third party sites like youtube, vimeo etc.\n * Wrap the outer element in aspect-ratio and then extend it with the desired ratio i.e\n * Make sure there are no height and width attributes on the embedded media.\n * Adapted from: https://github.com/suitcss/components-flex-embed\n *\n * Example:\n *\n *
\n * \n *
\n *\n * */\n\n.aspect-ratio {\n height: 0;\n position: relative;\n}\n\n.aspect-ratio--16x9 { padding-bottom: 56.25%; }\n.aspect-ratio--9x16 { padding-bottom: 177.77%; }\n\n.aspect-ratio--4x3 { padding-bottom: 75%; }\n.aspect-ratio--3x4 { padding-bottom: 133.33%; }\n\n.aspect-ratio--6x4 { padding-bottom: 66.6%; }\n.aspect-ratio--4x6 { padding-bottom: 150%; }\n\n.aspect-ratio--8x5 { padding-bottom: 62.5%; }\n.aspect-ratio--5x8 { padding-bottom: 160%; }\n\n.aspect-ratio--7x5 { padding-bottom: 71.42%; }\n.aspect-ratio--5x7 { padding-bottom: 140%; }\n\n.aspect-ratio--1x1 { padding-bottom: 100%; }\n\n.aspect-ratio--object {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n}\n\n@media #{$breakpoint-not-small}{\n .aspect-ratio-ns {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-ns { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-ns { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-ns { padding-bottom: 75%; }\n .aspect-ratio--3x4-ns { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-ns { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-ns { padding-bottom: 150%; }\n .aspect-ratio--8x5-ns { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-ns { padding-bottom: 160%; }\n .aspect-ratio--7x5-ns { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-ns { padding-bottom: 140%; }\n .aspect-ratio--1x1-ns { padding-bottom: 100%; }\n .aspect-ratio--object-ns {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n\n@media #{$breakpoint-medium}{\n .aspect-ratio-m {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-m { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-m { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-m { padding-bottom: 75%; }\n .aspect-ratio--3x4-m { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-m { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-m { padding-bottom: 150%; }\n .aspect-ratio--8x5-m { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-m { padding-bottom: 160%; }\n .aspect-ratio--7x5-m { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-m { padding-bottom: 140%; }\n .aspect-ratio--1x1-m { padding-bottom: 100%; }\n .aspect-ratio--object-m {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n\n@media #{$breakpoint-large}{\n .aspect-ratio-l {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-l { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-l { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-l { padding-bottom: 75%; }\n .aspect-ratio--3x4-l { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-l { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-l { padding-bottom: 150%; }\n .aspect-ratio--8x5-l { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-l { padding-bottom: 160%; }\n .aspect-ratio--7x5-l { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-l { padding-bottom: 140%; }\n .aspect-ratio--1x1-l { padding-bottom: 100%; }\n .aspect-ratio--object-l {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n IMAGES\n Docs: http://tachyons.io/docs/elements/images/\n\n*/\n\n/* Responsive images! */\n\nimg { max-width: 100%; }\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BACKGROUND SIZE\n Docs: http://tachyons.io/docs/themes/background-size/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/*\n Often used in combination with background image set as an inline style\n on an html element.\n*/\n\n .cover { background-size: cover!important; }\n .contain { background-size: contain!important; }\n\n@media #{$breakpoint-not-small} {\n .cover-ns { background-size: cover!important; }\n .contain-ns { background-size: contain!important; }\n}\n\n@media #{$breakpoint-medium} {\n .cover-m { background-size: cover!important; }\n .contain-m { background-size: contain!important; }\n}\n\n@media #{$breakpoint-large} {\n .cover-l { background-size: cover!important; }\n .contain-l { background-size: contain!important; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BACKGROUND POSITION\n\n Base:\n bg = background\n\n Modifiers:\n -center = center center\n -top = top center\n -right = center right\n -bottom = bottom center\n -left = center left\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.bg-center { \n background-repeat: no-repeat;\n background-position: center center; \n}\n\n.bg-top { \n background-repeat: no-repeat; \n background-position: top center; \n}\n\n.bg-right { \n background-repeat: no-repeat; \n background-position: center right; \n}\n\n.bg-bottom { \n background-repeat: no-repeat; \n background-position: bottom center; \n}\n\n.bg-left { \n background-repeat: no-repeat; \n background-position: center left; \n}\n\n@media #{$breakpoint-not-small} {\n .bg-center-ns { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-ns { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-ns { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-ns { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-ns { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n\n@media #{$breakpoint-medium} {\n .bg-center-m { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-m { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-m { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-m { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-m { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n\n@media #{$breakpoint-large} {\n .bg-center-l { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-l { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-l { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-l { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-l { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OUTLINES\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.outline { outline: 1px solid; }\n.outline-transparent { outline: 1px solid transparent; }\n.outline-0 { outline: 0; }\n\n@media #{$breakpoint-not-small} {\n .outline-ns { outline: 1px solid; }\n .outline-transparent-ns { outline: 1px solid transparent; }\n .outline-0-ns { outline: 0; }\n}\n\n@media #{$breakpoint-medium} {\n .outline-m { outline: 1px solid; }\n .outline-transparent-m { outline: 1px solid transparent; }\n .outline-0-m { outline: 0; }\n}\n\n@media #{$breakpoint-large} {\n .outline-l { outline: 1px solid; }\n .outline-transparent-l { outline: 1px solid transparent; }\n .outline-0-l { outline: 0; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDERS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Base:\n b = border\n\n Modifiers:\n a = all\n t = top\n r = right\n b = bottom\n l = left\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .ba { border-style: solid; border-width: 1px; }\n .bt { border-top-style: solid; border-top-width: 1px; }\n .br { border-right-style: solid; border-right-width: 1px; }\n .bb { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl { border-left-style: solid; border-left-width: 1px; }\n .bn { border-style: none; border-width: 0; }\n\n\n@media #{$breakpoint-not-small} {\n .ba-ns { border-style: solid; border-width: 1px; }\n .bt-ns { border-top-style: solid; border-top-width: 1px; }\n .br-ns { border-right-style: solid; border-right-width: 1px; }\n .bb-ns { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-ns { border-left-style: solid; border-left-width: 1px; }\n .bn-ns { border-style: none; border-width: 0; }\n}\n\n@media #{$breakpoint-medium} {\n .ba-m { border-style: solid; border-width: 1px; }\n .bt-m { border-top-style: solid; border-top-width: 1px; }\n .br-m { border-right-style: solid; border-right-width: 1px; }\n .bb-m { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-m { border-left-style: solid; border-left-width: 1px; }\n .bn-m { border-style: none; border-width: 0; }\n}\n\n@media #{$breakpoint-large} {\n .ba-l { border-style: solid; border-width: 1px; }\n .bt-l { border-top-style: solid; border-top-width: 1px; }\n .br-l { border-right-style: solid; border-right-width: 1px; }\n .bb-l { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-l { border-left-style: solid; border-left-width: 1px; }\n .bn-l { border-style: none; border-width: 0; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER COLORS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Border colors can be used to extend the base\n border classes ba,bt,bb,br,bl found in the _borders.css file.\n\n The base border class by default will set the color of the border\n to that of the current text color. These classes are for the cases\n where you desire for the text and border colors to be different.\n\n Base:\n b = border\n\n Modifiers:\n --color-name = each color variable name is also a border color name\n\n*/\n\n.b--black { border-color: $black; }\n.b--near-black { border-color: $near-black; }\n.b--dark-gray { border-color: $dark-gray; }\n.b--mid-gray { border-color: $mid-gray; }\n.b--gray { border-color: $gray; }\n.b--silver { border-color: $silver; }\n.b--light-silver { border-color: $light-silver; }\n.b--moon-gray { border-color: $moon-gray; }\n.b--light-gray { border-color: $light-gray; }\n.b--near-white { border-color: $near-white; }\n.b--white { border-color: $white; }\n\n.b--white-90 { border-color: $white-90; }\n.b--white-80 { border-color: $white-80; }\n.b--white-70 { border-color: $white-70; }\n.b--white-60 { border-color: $white-60; }\n.b--white-50 { border-color: $white-50; }\n.b--white-40 { border-color: $white-40; }\n.b--white-30 { border-color: $white-30; }\n.b--white-20 { border-color: $white-20; }\n.b--white-10 { border-color: $white-10; }\n.b--white-05 { border-color: $white-05; }\n.b--white-025 { border-color: $white-025; }\n.b--white-0125 { border-color: $white-0125; }\n\n.b--black-90 { border-color: $black-90; }\n.b--black-80 { border-color: $black-80; }\n.b--black-70 { border-color: $black-70; }\n.b--black-60 { border-color: $black-60; }\n.b--black-50 { border-color: $black-50; }\n.b--black-40 { border-color: $black-40; }\n.b--black-30 { border-color: $black-30; }\n.b--black-20 { border-color: $black-20; }\n.b--black-10 { border-color: $black-10; }\n.b--black-05 { border-color: $black-05; }\n.b--black-025 { border-color: $black-025; }\n.b--black-0125 { border-color: $black-0125; }\n\n.b--dark-red { border-color: $dark-red; }\n.b--red { border-color: $red; }\n.b--light-red { border-color: $light-red; }\n.b--orange { border-color: $orange; }\n.b--gold { border-color: $gold; }\n.b--yellow { border-color: $yellow; }\n.b--light-yellow { border-color: $light-yellow; }\n.b--purple { border-color: $purple; }\n.b--light-purple { border-color: $light-purple; }\n.b--dark-pink { border-color: $dark-pink; }\n.b--hot-pink { border-color: $hot-pink; }\n.b--pink { border-color: $pink; }\n.b--light-pink { border-color: $light-pink; }\n.b--dark-green { border-color: $dark-green; }\n.b--green { border-color: $green; }\n.b--light-green { border-color: $light-green; }\n.b--navy { border-color: $navy; }\n.b--dark-blue { border-color: $dark-blue; }\n.b--blue { border-color: $blue; }\n.b--light-blue { border-color: $light-blue; }\n.b--lightest-blue { border-color: $lightest-blue; }\n.b--washed-blue { border-color: $washed-blue; }\n.b--washed-green { border-color: $washed-green; }\n.b--washed-yellow { border-color: $washed-yellow; }\n.b--washed-red { border-color: $washed-red; }\n\n.b--transparent { border-color: $transparent; }\n.b--inherit { border-color: inherit; }\n","\n// Converted Variables\n\n$sans-serif: -apple-system, BlinkMacSystemFont, 'avenir next', avenir, helvetica, 'helvetica neue', ubuntu, roboto, noto, 'segoe ui', arial, sans-serif !default;\n$serif: georgia, serif !default;\n$code: consolas, monaco, monospace !default;\n$font-size-headline: 6rem !default;\n$font-size-subheadline: 5rem !default;\n$font-size-1: 3rem !default;\n$font-size-2: 2.25rem !default;\n$font-size-3: 1.5rem !default;\n$font-size-4: 1.25rem !default;\n$font-size-5: 1rem !default;\n$font-size-6: .875rem !default;\n$font-size-7: .75rem !default;\n$letter-spacing-tight: -.05em !default;\n$letter-spacing-1: .1em !default;\n$letter-spacing-2: .25em !default;\n$line-height-solid: 1 !default;\n$line-height-title: 1.25 !default;\n$line-height-copy: 1.5 !default;\n$measure: 30em !default;\n$measure-narrow: 20em !default;\n$measure-wide: 34em !default;\n$spacing-none: 0 !default;\n$spacing-extra-small: .25rem !default;\n$spacing-small: .5rem !default;\n$spacing-medium: 1rem !default;\n$spacing-large: 2rem !default;\n$spacing-extra-large: 4rem !default;\n$spacing-extra-extra-large: 8rem !default;\n$spacing-extra-extra-extra-large: 16rem !default;\n$spacing-copy-separator: 1.5em !default;\n$height-1: 1rem !default;\n$height-2: 2rem !default;\n$height-3: 4rem !default;\n$height-4: 8rem !default;\n$height-5: 16rem !default;\n$width-1: 1rem !default;\n$width-2: 2rem !default;\n$width-3: 4rem !default;\n$width-4: 8rem !default;\n$width-5: 16rem !default;\n$max-width-1: 1rem !default;\n$max-width-2: 2rem !default;\n$max-width-3: 4rem !default;\n$max-width-4: 8rem !default;\n$max-width-5: 16rem !default;\n$max-width-6: 32rem !default;\n$max-width-7: 48rem !default;\n$max-width-8: 64rem !default;\n$max-width-9: 96rem !default;\n$border-radius-none: 0 !default;\n$border-radius-1: .125rem !default;\n$border-radius-2: .25rem !default;\n$border-radius-3: .5rem !default;\n$border-radius-4: 1rem !default;\n$border-radius-circle: 100% !default;\n$border-radius-pill: 9999px !default;\n$border-width-none: 0 !default;\n$border-width-1: .125rem !default;\n$border-width-2: .25rem !default;\n$border-width-3: .5rem !default;\n$border-width-4: 1rem !default;\n$border-width-5: 2rem !default;\n$box-shadow-1: 0px 0px 4px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-2: 0px 0px 8px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-3: 2px 2px 4px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-4: 2px 2px 8px 0px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-5: 4px 4px 8px 0px rgba( 0, 0, 0, 0.2 ) !default;\n$black: #000 !default;\n$near-black: #111 !default;\n$dark-gray: #333 !default;\n$mid-gray: #555 !default;\n$gray: #777 !default;\n$silver: #999 !default;\n$light-silver: #aaa !default;\n$moon-gray: #ccc !default;\n$light-gray: #eee !default;\n$near-white: #f4f4f4 !default;\n$white: #fff !default;\n$transparent: transparent !default;\n$black-90: rgba(0,0,0,.9) !default;\n$black-80: rgba(0,0,0,.8) !default;\n$black-70: rgba(0,0,0,.7) !default;\n$black-60: rgba(0,0,0,.6) !default;\n$black-50: rgba(0,0,0,.5) !default;\n$black-40: rgba(0,0,0,.4) !default;\n$black-30: rgba(0,0,0,.3) !default;\n$black-20: rgba(0,0,0,.2) !default;\n$black-10: rgba(0,0,0,.1) !default;\n$black-05: rgba(0,0,0,.05) !default;\n$black-025: rgba(0,0,0,.025) !default;\n$black-0125: rgba(0,0,0,.0125) !default;\n$white-90: rgba(255,255,255,.9) !default;\n$white-80: rgba(255,255,255,.8) !default;\n$white-70: rgba(255,255,255,.7) !default;\n$white-60: rgba(255,255,255,.6) !default;\n$white-50: rgba(255,255,255,.5) !default;\n$white-40: rgba(255,255,255,.4) !default;\n$white-30: rgba(255,255,255,.3) !default;\n$white-20: rgba(255,255,255,.2) !default;\n$white-10: rgba(255,255,255,.1) !default;\n$white-05: rgba(255,255,255,.05) !default;\n$white-025: rgba(255,255,255,.025) !default;\n$white-0125: rgba(255,255,255,.0125) !default;\n$dark-red: #e7040f !default;\n$red: #ff4136 !default;\n$light-red: #ff725c !default;\n$orange: #ff6300 !default;\n$gold: #ffb700 !default;\n$yellow: #ffd700 !default;\n$light-yellow: #fbf1a9 !default;\n$purple: #5e2ca5 !default;\n$light-purple: #a463f2 !default;\n$dark-pink: #d5008f !default;\n$hot-pink: #ff41b4 !default;\n$pink: #ff80cc !default;\n$light-pink: #ffa3d7 !default;\n$dark-green: #137752 !default;\n$green: #19a974 !default;\n$light-green: #9eebcf !default;\n$navy: #001b44 !default;\n$dark-blue: #00449e !default;\n$blue: #357edd !default;\n$light-blue: #96ccff !default;\n$lightest-blue: #cdecff !default;\n$washed-blue: #f6fffe !default;\n$washed-green: #e8fdf5 !default;\n$washed-yellow: #fffceb !default;\n$washed-red: #ffdfdf !default;\n\n// Custom Media Query Variables\n\n$breakpoint-not-small: 'screen and (min-width: 30em)' !default;\n$breakpoint-medium: 'screen and (min-width: 30em) and (max-width: 60em)' !default;\n$breakpoint-large: 'screen and (min-width: 60em)' !default;\n\n/*\n\n VARIABLES\n\n*/\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER RADIUS\n Docs: http://tachyons.io/docs/themes/border-radius/\n\n Base:\n br = border-radius\n\n Modifiers:\n 0 = 0/none\n 1 = 1st step in scale\n 2 = 2nd step in scale\n 3 = 3rd step in scale\n 4 = 4th step in scale\n\n Literal values:\n -100 = 100%\n -pill = 9999px\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .br0 { border-radius: $border-radius-none }\n .br1 { border-radius: $border-radius-1; }\n .br2 { border-radius: $border-radius-2; }\n .br3 { border-radius: $border-radius-3; }\n .br4 { border-radius: $border-radius-4; }\n .br-100 { border-radius: $border-radius-circle; }\n .br-pill { border-radius: $border-radius-pill; }\n .br--bottom {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n@media #{$breakpoint-not-small} {\n .br0-ns { border-radius: $border-radius-none }\n .br1-ns { border-radius: $border-radius-1; }\n .br2-ns { border-radius: $border-radius-2; }\n .br3-ns { border-radius: $border-radius-3; }\n .br4-ns { border-radius: $border-radius-4; }\n .br-100-ns { border-radius: $border-radius-circle; }\n .br-pill-ns { border-radius: $border-radius-pill; }\n .br--bottom-ns {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-ns {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-ns {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-ns {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n\n@media #{$breakpoint-medium} {\n .br0-m { border-radius: $border-radius-none }\n .br1-m { border-radius: $border-radius-1; }\n .br2-m { border-radius: $border-radius-2; }\n .br3-m { border-radius: $border-radius-3; }\n .br4-m { border-radius: $border-radius-4; }\n .br-100-m { border-radius: $border-radius-circle; }\n .br-pill-m { border-radius: $border-radius-pill; }\n .br--bottom-m {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-m {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-m {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-m {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n\n@media #{$breakpoint-large} {\n .br0-l { border-radius: $border-radius-none }\n .br1-l { border-radius: $border-radius-1; }\n .br2-l { border-radius: $border-radius-2; }\n .br3-l { border-radius: $border-radius-3; }\n .br4-l { border-radius: $border-radius-4; }\n .br-100-l { border-radius: $border-radius-circle; }\n .br-pill-l { border-radius: $border-radius-pill; }\n .br--bottom-l {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-l {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-l {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-l {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER STYLES\n Docs: http://tachyons.io/docs/themes/borders/\n\n Depends on base border module in _borders.css\n\n Base:\n b = border-style\n\n Modifiers:\n --none = none\n --dotted = dotted\n --dashed = dashed\n --solid = solid\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.b--dotted { border-style: dotted; }\n.b--dashed { border-style: dashed; }\n.b--solid { border-style: solid; }\n.b--none { border-style: none; }\n\n@media #{$breakpoint-not-small} {\n .b--dotted-ns { border-style: dotted; }\n .b--dashed-ns { border-style: dashed; }\n .b--solid-ns { border-style: solid; }\n .b--none-ns { border-style: none; }\n}\n\n@media #{$breakpoint-medium} {\n .b--dotted-m { border-style: dotted; }\n .b--dashed-m { border-style: dashed; }\n .b--solid-m { border-style: solid; }\n .b--none-m { border-style: none; }\n}\n\n@media #{$breakpoint-large} {\n .b--dotted-l { border-style: dotted; }\n .b--dashed-l { border-style: dashed; }\n .b--solid-l { border-style: solid; }\n .b--none-l { border-style: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER WIDTHS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Base:\n bw = border-width\n\n Modifiers:\n 0 = 0 width border\n 1 = 1st step in border-width scale\n 2 = 2nd step in border-width scale\n 3 = 3rd step in border-width scale\n 4 = 4th step in border-width scale\n 5 = 5th step in border-width scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.bw0 { border-width: $border-width-none; }\n.bw1 { border-width: $border-width-1; }\n.bw2 { border-width: $border-width-2; }\n.bw3 { border-width: $border-width-3; }\n.bw4 { border-width: $border-width-4; }\n.bw5 { border-width: $border-width-5; }\n\n/* Resets */\n.bt-0 { border-top-width: $border-width-none }\n.br-0 { border-right-width: $border-width-none }\n.bb-0 { border-bottom-width: $border-width-none }\n.bl-0 { border-left-width: $border-width-none }\n\n@media #{$breakpoint-not-small} {\n .bw0-ns { border-width: $border-width-none; }\n .bw1-ns { border-width: $border-width-1; }\n .bw2-ns { border-width: $border-width-2; }\n .bw3-ns { border-width: $border-width-3; }\n .bw4-ns { border-width: $border-width-4; }\n .bw5-ns { border-width: $border-width-5; }\n .bt-0-ns { border-top-width: $border-width-none }\n .br-0-ns { border-right-width: $border-width-none }\n .bb-0-ns { border-bottom-width: $border-width-none }\n .bl-0-ns { border-left-width: $border-width-none }\n}\n\n@media #{$breakpoint-medium} {\n .bw0-m { border-width: $border-width-none; }\n .bw1-m { border-width: $border-width-1; }\n .bw2-m { border-width: $border-width-2; }\n .bw3-m { border-width: $border-width-3; }\n .bw4-m { border-width: $border-width-4; }\n .bw5-m { border-width: $border-width-5; }\n .bt-0-m { border-top-width: $border-width-none }\n .br-0-m { border-right-width: $border-width-none }\n .bb-0-m { border-bottom-width: $border-width-none }\n .bl-0-m { border-left-width: $border-width-none }\n}\n\n@media #{$breakpoint-large} {\n .bw0-l { border-width: $border-width-none; }\n .bw1-l { border-width: $border-width-1; }\n .bw2-l { border-width: $border-width-2; }\n .bw3-l { border-width: $border-width-3; }\n .bw4-l { border-width: $border-width-4; }\n .bw5-l { border-width: $border-width-5; }\n .bt-0-l { border-top-width: $border-width-none }\n .br-0-l { border-right-width: $border-width-none }\n .bb-0-l { border-bottom-width: $border-width-none }\n .bl-0-l { border-left-width: $border-width-none }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BOX-SHADOW\n Docs: http://tachyons.io/docs/themes/box-shadow/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.shadow-1 { box-shadow: $box-shadow-1; }\n.shadow-2 { box-shadow: $box-shadow-2; }\n.shadow-3 { box-shadow: $box-shadow-3; }\n.shadow-4 { box-shadow: $box-shadow-4; }\n.shadow-5 { box-shadow: $box-shadow-5; }\n\n@media #{$breakpoint-not-small} {\n .shadow-1-ns { box-shadow: $box-shadow-1; }\n .shadow-2-ns { box-shadow: $box-shadow-2; }\n .shadow-3-ns { box-shadow: $box-shadow-3; }\n .shadow-4-ns { box-shadow: $box-shadow-4; }\n .shadow-5-ns { box-shadow: $box-shadow-5; }\n}\n\n@media #{$breakpoint-medium} {\n .shadow-1-m { box-shadow: $box-shadow-1; }\n .shadow-2-m { box-shadow: $box-shadow-2; }\n .shadow-3-m { box-shadow: $box-shadow-3; }\n .shadow-4-m { box-shadow: $box-shadow-4; }\n .shadow-5-m { box-shadow: $box-shadow-5; }\n}\n\n@media #{$breakpoint-large} {\n .shadow-1-l { box-shadow: $box-shadow-1; }\n .shadow-2-l { box-shadow: $box-shadow-2; }\n .shadow-3-l { box-shadow: $box-shadow-3; }\n .shadow-4-l { box-shadow: $box-shadow-4; }\n .shadow-5-l { box-shadow: $box-shadow-5; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n CODE\n\n*/\n\n.pre {\n overflow-x: auto;\n overflow-y: hidden;\n overflow: scroll;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n COORDINATES\n Docs: http://tachyons.io/docs/layout/position/\n\n Use in combination with the position module.\n\n Base:\n top\n bottom\n right\n left\n\n Modifiers:\n -0 = literal value 0\n -1 = literal value 1\n -2 = literal value 2\n --1 = literal value -1\n --2 = literal value -2\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.top-0 { top: 0; }\n.right-0 { right: 0; }\n.bottom-0 { bottom: 0; }\n.left-0 { left: 0; }\n\n.top-1 { top: 1rem; }\n.right-1 { right: 1rem; }\n.bottom-1 { bottom: 1rem; }\n.left-1 { left: 1rem; }\n\n.top-2 { top: 2rem; }\n.right-2 { right: 2rem; }\n.bottom-2 { bottom: 2rem; }\n.left-2 { left: 2rem; }\n\n.top--1 { top: -1rem; }\n.right--1 { right: -1rem; }\n.bottom--1 { bottom: -1rem; }\n.left--1 { left: -1rem; }\n\n.top--2 { top: -2rem; }\n.right--2 { right: -2rem; }\n.bottom--2 { bottom: -2rem; }\n.left--2 { left: -2rem; }\n\n\n.absolute--fill {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n\n@media #{$breakpoint-not-small} {\n .top-0-ns { top: 0; }\n .left-0-ns { left: 0; }\n .right-0-ns { right: 0; }\n .bottom-0-ns { bottom: 0; }\n .top-1-ns { top: 1rem; }\n .left-1-ns { left: 1rem; }\n .right-1-ns { right: 1rem; }\n .bottom-1-ns { bottom: 1rem; }\n .top-2-ns { top: 2rem; }\n .left-2-ns { left: 2rem; }\n .right-2-ns { right: 2rem; }\n .bottom-2-ns { bottom: 2rem; }\n .top--1-ns { top: -1rem; }\n .right--1-ns { right: -1rem; }\n .bottom--1-ns { bottom: -1rem; }\n .left--1-ns { left: -1rem; }\n .top--2-ns { top: -2rem; }\n .right--2-ns { right: -2rem; }\n .bottom--2-ns { bottom: -2rem; }\n .left--2-ns { left: -2rem; }\n .absolute--fill-ns {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n@media #{$breakpoint-medium} {\n .top-0-m { top: 0; }\n .left-0-m { left: 0; }\n .right-0-m { right: 0; }\n .bottom-0-m { bottom: 0; }\n .top-1-m { top: 1rem; }\n .left-1-m { left: 1rem; }\n .right-1-m { right: 1rem; }\n .bottom-1-m { bottom: 1rem; }\n .top-2-m { top: 2rem; }\n .left-2-m { left: 2rem; }\n .right-2-m { right: 2rem; }\n .bottom-2-m { bottom: 2rem; }\n .top--1-m { top: -1rem; }\n .right--1-m { right: -1rem; }\n .bottom--1-m { bottom: -1rem; }\n .left--1-m { left: -1rem; }\n .top--2-m { top: -2rem; }\n .right--2-m { right: -2rem; }\n .bottom--2-m { bottom: -2rem; }\n .left--2-m { left: -2rem; }\n .absolute--fill-m {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n@media #{$breakpoint-large} {\n .top-0-l { top: 0; }\n .left-0-l { left: 0; }\n .right-0-l { right: 0; }\n .bottom-0-l { bottom: 0; }\n .top-1-l { top: 1rem; }\n .left-1-l { left: 1rem; }\n .right-1-l { right: 1rem; }\n .bottom-1-l { bottom: 1rem; }\n .top-2-l { top: 2rem; }\n .left-2-l { left: 2rem; }\n .right-2-l { right: 2rem; }\n .bottom-2-l { bottom: 2rem; }\n .top--1-l { top: -1rem; }\n .right--1-l { right: -1rem; }\n .bottom--1-l { bottom: -1rem; }\n .left--1-l { left: -1rem; }\n .top--2-l { top: -2rem; }\n .right--2-l { right: -2rem; }\n .bottom--2-l { bottom: -2rem; }\n .left--2-l { left: -2rem; }\n .absolute--fill-l {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n CLEARFIX\n http://tachyons.io/docs/layout/clearfix/\n\n*/\n\n/* Nicolas Gallaghers Clearfix solution\n Ref: http://nicolasgallagher.com/micro-clearfix-hack/ */\n\n.cf:before,\n.cf:after { content: \" \"; display: table; }\n.cf:after { clear: both; }\n.cf { zoom: 1; }\n\n.cl { clear: left; }\n.cr { clear: right; }\n.cb { clear: both; }\n.cn { clear: none; }\n\n@media #{$breakpoint-not-small} {\n .cl-ns { clear: left; }\n .cr-ns { clear: right; }\n .cb-ns { clear: both; }\n .cn-ns { clear: none; }\n}\n\n@media #{$breakpoint-medium} {\n .cl-m { clear: left; }\n .cr-m { clear: right; }\n .cb-m { clear: both; }\n .cn-m { clear: none; }\n}\n\n@media #{$breakpoint-large} {\n .cl-l { clear: left; }\n .cr-l { clear: right; }\n .cb-l { clear: both; }\n .cn-l { clear: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FLEXBOX\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.flex { display: flex; }\n.inline-flex { display: inline-flex; }\n\n/* 1. Fix for Chrome 44 bug.\n * https://code.google.com/p/chromium/issues/detail?id=506893 */\n.flex-auto {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n}\n\n.flex-none { flex: none; }\n\n.flex-column { flex-direction: column; }\n.flex-row { flex-direction: row; }\n.flex-wrap { flex-wrap: wrap; }\n.flex-nowrap { flex-wrap: nowrap; }\n.flex-wrap-reverse { flex-wrap: wrap-reverse; }\n.flex-column-reverse { flex-direction: column-reverse; }\n.flex-row-reverse { flex-direction: row-reverse; }\n\n.items-start { align-items: flex-start; }\n.items-end { align-items: flex-end; }\n.items-center { align-items: center; }\n.items-baseline { align-items: baseline; }\n.items-stretch { align-items: stretch; }\n\n.self-start { align-self: flex-start; }\n.self-end { align-self: flex-end; }\n.self-center { align-self: center; }\n.self-baseline { align-self: baseline; }\n.self-stretch { align-self: stretch; }\n\n.justify-start { justify-content: flex-start; }\n.justify-end { justify-content: flex-end; }\n.justify-center { justify-content: center; }\n.justify-between { justify-content: space-between; }\n.justify-around { justify-content: space-around; }\n\n.content-start { align-content: flex-start; }\n.content-end { align-content: flex-end; }\n.content-center { align-content: center; }\n.content-between { align-content: space-between; }\n.content-around { align-content: space-around; }\n.content-stretch { align-content: stretch; }\n\n.order-0 { order: 0; }\n.order-1 { order: 1; }\n.order-2 { order: 2; }\n.order-3 { order: 3; }\n.order-4 { order: 4; }\n.order-5 { order: 5; }\n.order-6 { order: 6; }\n.order-7 { order: 7; }\n.order-8 { order: 8; }\n.order-last { order: 99999; }\n\n.flex-grow-0 { flex-grow: 0; }\n.flex-grow-1 { flex-grow: 1; }\n\n.flex-shrink-0 { flex-shrink: 0; }\n.flex-shrink-1 { flex-shrink: 1; }\n\n@media #{$breakpoint-not-small} {\n .flex-ns { display: flex; }\n .inline-flex-ns { display: inline-flex; }\n .flex-auto-ns {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-ns { flex: none; }\n .flex-column-ns { flex-direction: column; }\n .flex-row-ns { flex-direction: row; }\n .flex-wrap-ns { flex-wrap: wrap; }\n .flex-nowrap-ns { flex-wrap: nowrap; }\n .flex-wrap-reverse-ns { flex-wrap: wrap-reverse; }\n .flex-column-reverse-ns { flex-direction: column-reverse; }\n .flex-row-reverse-ns { flex-direction: row-reverse; }\n .items-start-ns { align-items: flex-start; }\n .items-end-ns { align-items: flex-end; }\n .items-center-ns { align-items: center; }\n .items-baseline-ns { align-items: baseline; }\n .items-stretch-ns { align-items: stretch; }\n\n .self-start-ns { align-self: flex-start; }\n .self-end-ns { align-self: flex-end; }\n .self-center-ns { align-self: center; }\n .self-baseline-ns { align-self: baseline; }\n .self-stretch-ns { align-self: stretch; }\n\n .justify-start-ns { justify-content: flex-start; }\n .justify-end-ns { justify-content: flex-end; }\n .justify-center-ns { justify-content: center; }\n .justify-between-ns { justify-content: space-between; }\n .justify-around-ns { justify-content: space-around; }\n\n .content-start-ns { align-content: flex-start; }\n .content-end-ns { align-content: flex-end; }\n .content-center-ns { align-content: center; }\n .content-between-ns { align-content: space-between; }\n .content-around-ns { align-content: space-around; }\n .content-stretch-ns { align-content: stretch; }\n\n .order-0-ns { order: 0; }\n .order-1-ns { order: 1; }\n .order-2-ns { order: 2; }\n .order-3-ns { order: 3; }\n .order-4-ns { order: 4; }\n .order-5-ns { order: 5; }\n .order-6-ns { order: 6; }\n .order-7-ns { order: 7; }\n .order-8-ns { order: 8; }\n .order-last-ns { order: 99999; }\n\n .flex-grow-0-ns { flex-grow: 0; }\n .flex-grow-1-ns { flex-grow: 1; }\n\n .flex-shrink-0-ns { flex-shrink: 0; }\n .flex-shrink-1-ns { flex-shrink: 1; }\n}\n@media #{$breakpoint-medium} {\n .flex-m { display: flex; }\n .inline-flex-m { display: inline-flex; }\n .flex-auto-m {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-m { flex: none; }\n .flex-column-m { flex-direction: column; }\n .flex-row-m { flex-direction: row; }\n .flex-wrap-m { flex-wrap: wrap; }\n .flex-nowrap-m { flex-wrap: nowrap; }\n .flex-wrap-reverse-m { flex-wrap: wrap-reverse; }\n .flex-column-reverse-m { flex-direction: column-reverse; }\n .flex-row-reverse-m { flex-direction: row-reverse; }\n .items-start-m { align-items: flex-start; }\n .items-end-m { align-items: flex-end; }\n .items-center-m { align-items: center; }\n .items-baseline-m { align-items: baseline; }\n .items-stretch-m { align-items: stretch; }\n\n .self-start-m { align-self: flex-start; }\n .self-end-m { align-self: flex-end; }\n .self-center-m { align-self: center; }\n .self-baseline-m { align-self: baseline; }\n .self-stretch-m { align-self: stretch; }\n\n .justify-start-m { justify-content: flex-start; }\n .justify-end-m { justify-content: flex-end; }\n .justify-center-m { justify-content: center; }\n .justify-between-m { justify-content: space-between; }\n .justify-around-m { justify-content: space-around; }\n\n .content-start-m { align-content: flex-start; }\n .content-end-m { align-content: flex-end; }\n .content-center-m { align-content: center; }\n .content-between-m { align-content: space-between; }\n .content-around-m { align-content: space-around; }\n .content-stretch-m { align-content: stretch; }\n\n .order-0-m { order: 0; }\n .order-1-m { order: 1; }\n .order-2-m { order: 2; }\n .order-3-m { order: 3; }\n .order-4-m { order: 4; }\n .order-5-m { order: 5; }\n .order-6-m { order: 6; }\n .order-7-m { order: 7; }\n .order-8-m { order: 8; }\n .order-last-m { order: 99999; }\n\n .flex-grow-0-m { flex-grow: 0; }\n .flex-grow-1-m { flex-grow: 1; }\n\n .flex-shrink-0-m { flex-shrink: 0; }\n .flex-shrink-1-m { flex-shrink: 1; }\n}\n\n@media #{$breakpoint-large} {\n .flex-l { display: flex; }\n .inline-flex-l { display: inline-flex; }\n .flex-auto-l {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-l { flex: none; }\n .flex-column-l { flex-direction: column; }\n .flex-row-l { flex-direction: row; }\n .flex-wrap-l { flex-wrap: wrap; }\n .flex-nowrap-l { flex-wrap: nowrap; }\n .flex-wrap-reverse-l { flex-wrap: wrap-reverse; }\n .flex-column-reverse-l { flex-direction: column-reverse; }\n .flex-row-reverse-l { flex-direction: row-reverse; }\n\n .items-start-l { align-items: flex-start; }\n .items-end-l { align-items: flex-end; }\n .items-center-l { align-items: center; }\n .items-baseline-l { align-items: baseline; }\n .items-stretch-l { align-items: stretch; }\n\n .self-start-l { align-self: flex-start; }\n .self-end-l { align-self: flex-end; }\n .self-center-l { align-self: center; }\n .self-baseline-l { align-self: baseline; }\n .self-stretch-l { align-self: stretch; }\n\n .justify-start-l { justify-content: flex-start; }\n .justify-end-l { justify-content: flex-end; }\n .justify-center-l { justify-content: center; }\n .justify-between-l { justify-content: space-between; }\n .justify-around-l { justify-content: space-around; }\n\n .content-start-l { align-content: flex-start; }\n .content-end-l { align-content: flex-end; }\n .content-center-l { align-content: center; }\n .content-between-l { align-content: space-between; }\n .content-around-l { align-content: space-around; }\n .content-stretch-l { align-content: stretch; }\n\n .order-0-l { order: 0; }\n .order-1-l { order: 1; }\n .order-2-l { order: 2; }\n .order-3-l { order: 3; }\n .order-4-l { order: 4; }\n .order-5-l { order: 5; }\n .order-6-l { order: 6; }\n .order-7-l { order: 7; }\n .order-8-l { order: 8; }\n .order-last-l { order: 99999; }\n\n .flex-grow-0-l { flex-grow: 0; }\n .flex-grow-1-l { flex-grow: 1; }\n\n .flex-shrink-0-l { flex-shrink: 0; }\n .flex-shrink-1-l { flex-shrink: 1; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n DISPLAY\n Docs: http://tachyons.io/docs/layout/display\n\n Base:\n d = display\n\n Modifiers:\n n = none\n b = block\n ib = inline-block\n it = inline-table\n t = table\n tc = table-cell\n tr = table-row\n tcol = table-column\n tcolg = table-column-group\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.dn { display: none; }\n.di { display: inline; }\n.db { display: block; }\n.dib { display: inline-block; }\n.dit { display: inline-table; }\n.dt { display: table; }\n.dtc { display: table-cell; }\n.dt-row { display: table-row; }\n.dt-row-group { display: table-row-group; }\n.dt-column { display: table-column; }\n.dt-column-group { display: table-column-group; }\n\n/*\n This will set table to full width and then\n all cells will be equal width\n*/\n.dt--fixed {\n table-layout: fixed;\n width: 100%;\n}\n\n@media #{$breakpoint-not-small} {\n .dn-ns { display: none; }\n .di-ns { display: inline; }\n .db-ns { display: block; }\n .dib-ns { display: inline-block; }\n .dit-ns { display: inline-table; }\n .dt-ns { display: table; }\n .dtc-ns { display: table-cell; }\n .dt-row-ns { display: table-row; }\n .dt-row-group-ns { display: table-row-group; }\n .dt-column-ns { display: table-column; }\n .dt-column-group-ns { display: table-column-group; }\n\n .dt--fixed-ns {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n@media #{$breakpoint-medium} {\n .dn-m { display: none; }\n .di-m { display: inline; }\n .db-m { display: block; }\n .dib-m { display: inline-block; }\n .dit-m { display: inline-table; }\n .dt-m { display: table; }\n .dtc-m { display: table-cell; }\n .dt-row-m { display: table-row; }\n .dt-row-group-m { display: table-row-group; }\n .dt-column-m { display: table-column; }\n .dt-column-group-m { display: table-column-group; }\n\n .dt--fixed-m {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n@media #{$breakpoint-large} {\n .dn-l { display: none; }\n .di-l { display: inline; }\n .db-l { display: block; }\n .dib-l { display: inline-block; }\n .dit-l { display: inline-table; }\n .dt-l { display: table; }\n .dtc-l { display: table-cell; }\n .dt-row-l { display: table-row; }\n .dt-row-group-l { display: table-row-group; }\n .dt-column-l { display: table-column; }\n .dt-column-group-l { display: table-column-group; }\n\n .dt--fixed-l {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FLOATS\n http://tachyons.io/docs/layout/floats/\n\n 1. Floated elements are automatically rendered as block level elements.\n Setting floats to display inline will fix the double margin bug in\n ie6. You know... just in case.\n\n 2. Don't forget to clearfix your floats with .cf\n\n Base:\n f = float\n\n Modifiers:\n l = left\n r = right\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n.fl { float: left; _display: inline; }\n.fr { float: right; _display: inline; }\n.fn { float: none; }\n\n@media #{$breakpoint-not-small} {\n .fl-ns { float: left; _display: inline; }\n .fr-ns { float: right; _display: inline; }\n .fn-ns { float: none; }\n}\n\n@media #{$breakpoint-medium} {\n .fl-m { float: left; _display: inline; }\n .fr-m { float: right; _display: inline; }\n .fn-m { float: none; }\n}\n\n@media #{$breakpoint-large} {\n .fl-l { float: left; _display: inline; }\n .fr-l { float: right; _display: inline; }\n .fn-l { float: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT FAMILY GROUPS\n Docs: http://tachyons.io/docs/typography/font-family/\n\n*/\n\n\n.sans-serif {\n font-family: $sans-serif;\n}\n\n.serif {\n font-family: $serif;\n}\n\n.system-sans-serif {\n font-family: sans-serif;\n}\n\n.system-serif {\n font-family: serif;\n}\n\n\n/* Monospaced Typefaces (for code) */\n\n/* From http://cssfontstack.com */\ncode, .code {\n font-family: Consolas,\n monaco,\n monospace;\n}\n\n.courier {\n font-family: 'Courier Next',\n courier,\n monospace;\n}\n\n\n/* Sans-Serif Typefaces */\n\n.helvetica {\n font-family: 'helvetica neue', helvetica,\n sans-serif;\n}\n\n.avenir {\n font-family: 'avenir next', avenir,\n sans-serif;\n}\n\n\n/* Serif Typefaces */\n\n.athelas {\n font-family: athelas,\n georgia,\n serif;\n}\n\n.georgia {\n font-family: georgia,\n serif;\n}\n\n.times {\n font-family: times,\n serif;\n}\n\n.bodoni {\n font-family: \"Bodoni MT\",\n serif;\n}\n\n.calisto {\n font-family: \"Calisto MT\",\n serif;\n}\n\n.garamond {\n font-family: garamond,\n serif;\n}\n\n.baskerville {\n font-family: baskerville,\n serif;\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT STYLE\n Docs: http://tachyons.io/docs/typography/font-style/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.i { font-style: italic; }\n.fs-normal { font-style: normal; }\n\n@media #{$breakpoint-not-small} {\n .i-ns { font-style: italic; }\n .fs-normal-ns { font-style: normal; }\n}\n\n@media #{$breakpoint-medium} {\n .i-m { font-style: italic; }\n .fs-normal-m { font-style: normal; }\n}\n\n@media #{$breakpoint-large} {\n .i-l { font-style: italic; }\n .fs-normal-l { font-style: normal; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT WEIGHT\n Docs: http://tachyons.io/docs/typography/font-weight/\n\n Base\n fw = font-weight\n\n Modifiers:\n 1 = literal value 100\n 2 = literal value 200\n 3 = literal value 300\n 4 = literal value 400\n 5 = literal value 500\n 6 = literal value 600\n 7 = literal value 700\n 8 = literal value 800\n 9 = literal value 900\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.normal { font-weight: normal; }\n.b { font-weight: bold; }\n.fw1 { font-weight: 100; }\n.fw2 { font-weight: 200; }\n.fw3 { font-weight: 300; }\n.fw4 { font-weight: 400; }\n.fw5 { font-weight: 500; }\n.fw6 { font-weight: 600; }\n.fw7 { font-weight: 700; }\n.fw8 { font-weight: 800; }\n.fw9 { font-weight: 900; }\n\n\n@media #{$breakpoint-not-small} {\n .normal-ns { font-weight: normal; }\n .b-ns { font-weight: bold; }\n .fw1-ns { font-weight: 100; }\n .fw2-ns { font-weight: 200; }\n .fw3-ns { font-weight: 300; }\n .fw4-ns { font-weight: 400; }\n .fw5-ns { font-weight: 500; }\n .fw6-ns { font-weight: 600; }\n .fw7-ns { font-weight: 700; }\n .fw8-ns { font-weight: 800; }\n .fw9-ns { font-weight: 900; }\n}\n\n@media #{$breakpoint-medium} {\n .normal-m { font-weight: normal; }\n .b-m { font-weight: bold; }\n .fw1-m { font-weight: 100; }\n .fw2-m { font-weight: 200; }\n .fw3-m { font-weight: 300; }\n .fw4-m { font-weight: 400; }\n .fw5-m { font-weight: 500; }\n .fw6-m { font-weight: 600; }\n .fw7-m { font-weight: 700; }\n .fw8-m { font-weight: 800; }\n .fw9-m { font-weight: 900; }\n}\n\n@media #{$breakpoint-large} {\n .normal-l { font-weight: normal; }\n .b-l { font-weight: bold; }\n .fw1-l { font-weight: 100; }\n .fw2-l { font-weight: 200; }\n .fw3-l { font-weight: 300; }\n .fw4-l { font-weight: 400; }\n .fw5-l { font-weight: 500; }\n .fw6-l { font-weight: 600; }\n .fw7-l { font-weight: 700; }\n .fw8-l { font-weight: 800; }\n .fw9-l { font-weight: 900; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FORMS\n \n*/\n\n.input-reset {\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n.button-reset::-moz-focus-inner,\n.input-reset::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n HEIGHTS\n Docs: http://tachyons.io/docs/layout/heights/\n\n Base:\n h = height\n min-h = min-height\n min-vh = min-height vertical screen height\n vh = vertical screen height\n\n Modifiers\n 1 = 1st step in height scale\n 2 = 2nd step in height scale\n 3 = 3rd step in height scale\n 4 = 4th step in height scale\n 5 = 5th step in height scale\n\n -25 = literal value 25%\n -50 = literal value 50%\n -75 = literal value 75%\n -100 = literal value 100%\n\n -auto = string value of auto\n -inherit = string value of inherit\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Height Scale */\n\n.h1 { height: $height-1; }\n.h2 { height: $height-2; }\n.h3 { height: $height-3; }\n.h4 { height: $height-4; }\n.h5 { height: $height-5; }\n\n/* Height Percentages - Based off of height of parent */\n\n.h-25 { height: 25%; }\n.h-50 { height: 50%; }\n.h-75 { height: 75%; }\n.h-100 { height: 100%; }\n\n.min-h-100 { min-height: 100%; }\n\n/* Screen Height Percentage */\n\n.vh-25 { height: 25vh; }\n.vh-50 { height: 50vh; }\n.vh-75 { height: 75vh; }\n.vh-100 { height: 100vh; }\n\n.min-vh-100 { min-height: 100vh; }\n\n\n/* String Properties */\n\n.h-auto { height: auto; }\n.h-inherit { height: inherit; }\n\n@media #{$breakpoint-not-small} {\n .h1-ns { height: $height-1; }\n .h2-ns { height: $height-2; }\n .h3-ns { height: $height-3; }\n .h4-ns { height: $height-4; }\n .h5-ns { height: $height-5; }\n .h-25-ns { height: 25%; }\n .h-50-ns { height: 50%; }\n .h-75-ns { height: 75%; }\n .h-100-ns { height: 100%; }\n .min-h-100-ns { min-height: 100%; }\n .vh-25-ns { height: 25vh; }\n .vh-50-ns { height: 50vh; }\n .vh-75-ns { height: 75vh; }\n .vh-100-ns { height: 100vh; }\n .min-vh-100-ns { min-height: 100vh; }\n .h-auto-ns { height: auto; }\n .h-inherit-ns { height: inherit; }\n}\n\n@media #{$breakpoint-medium} {\n .h1-m { height: $height-1; }\n .h2-m { height: $height-2; }\n .h3-m { height: $height-3; }\n .h4-m { height: $height-4; }\n .h5-m { height: $height-5; }\n .h-25-m { height: 25%; }\n .h-50-m { height: 50%; }\n .h-75-m { height: 75%; }\n .h-100-m { height: 100%; }\n .min-h-100-m { min-height: 100%; }\n .vh-25-m { height: 25vh; }\n .vh-50-m { height: 50vh; }\n .vh-75-m { height: 75vh; }\n .vh-100-m { height: 100vh; }\n .min-vh-100-m { min-height: 100vh; }\n .h-auto-m { height: auto; }\n .h-inherit-m { height: inherit; }\n}\n\n@media #{$breakpoint-large} {\n .h1-l { height: $height-1; }\n .h2-l { height: $height-2; }\n .h3-l { height: $height-3; }\n .h4-l { height: $height-4; }\n .h5-l { height: $height-5; }\n .h-25-l { height: 25%; }\n .h-50-l { height: 50%; }\n .h-75-l { height: 75%; }\n .h-100-l { height: 100%; }\n .min-h-100-l { min-height: 100%; }\n .vh-25-l { height: 25vh; }\n .vh-50-l { height: 50vh; }\n .vh-75-l { height: 75vh; }\n .vh-100-l { height: 100vh; }\n .min-vh-100-l { min-height: 100vh; }\n .h-auto-l { height: auto; }\n .h-inherit-l { height: inherit; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LETTER SPACING\n Docs: http://tachyons.io/docs/typography/tracking/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.tracked { letter-spacing: $letter-spacing-1; }\n.tracked-tight { letter-spacing: $letter-spacing-tight; }\n.tracked-mega { letter-spacing: $letter-spacing-2; }\n\n@media #{$breakpoint-not-small} {\n .tracked-ns { letter-spacing: $letter-spacing-1; }\n .tracked-tight-ns { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-ns { letter-spacing: $letter-spacing-2; }\n}\n\n@media #{$breakpoint-medium} {\n .tracked-m { letter-spacing: $letter-spacing-1; }\n .tracked-tight-m { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-m { letter-spacing: $letter-spacing-2; }\n}\n\n@media #{$breakpoint-large} {\n .tracked-l { letter-spacing: $letter-spacing-1; }\n .tracked-tight-l { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-l { letter-spacing: $letter-spacing-2; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LINE HEIGHT / LEADING\n Docs: http://tachyons.io/docs/typography/line-height\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .lh-solid { line-height: $line-height-solid; }\n .lh-title { line-height: $line-height-title; }\n .lh-copy { line-height: $line-height-copy; }\n\n@media #{$breakpoint-not-small} {\n .lh-solid-ns { line-height: $line-height-solid; }\n .lh-title-ns { line-height: $line-height-title; }\n .lh-copy-ns { line-height: $line-height-copy; }\n}\n\n@media #{$breakpoint-medium} {\n .lh-solid-m { line-height: $line-height-solid; }\n .lh-title-m { line-height: $line-height-title; }\n .lh-copy-m { line-height: $line-height-copy; }\n}\n\n@media #{$breakpoint-large} {\n .lh-solid-l { line-height: $line-height-solid; }\n .lh-title-l { line-height: $line-height-title; }\n .lh-copy-l { line-height: $line-height-copy; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LINKS\n Docs: http://tachyons.io/docs/elements/links/\n\n*/\n\n.link {\n text-decoration: none;\n transition: color .15s ease-in;\n}\n\n.link:link,\n.link:visited {\n transition: color .15s ease-in;\n}\n.link:hover {\n transition: color .15s ease-in;\n}\n.link:active {\n transition: color .15s ease-in;\n}\n.link:focus {\n transition: color .15s ease-in;\n outline: 1px dotted currentColor;\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LISTS\n http://tachyons.io/docs/elements/lists/\n\n*/\n\n.list { list-style-type: none; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n MAX WIDTHS\n Docs: http://tachyons.io/docs/layout/max-widths/\n\n Base:\n mw = max-width\n\n Modifiers\n 1 = 1st step in width scale\n 2 = 2nd step in width scale\n 3 = 3rd step in width scale\n 4 = 4th step in width scale\n 5 = 5th step in width scale\n 6 = 6st step in width scale\n 7 = 7nd step in width scale\n 8 = 8rd step in width scale\n 9 = 9th step in width scale\n\n -100 = literal value 100%\n\n -none = string value none\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Max Width Percentages */\n\n.mw-100 { max-width: 100%; }\n\n/* Max Width Scale */\n\n.mw1 { max-width: $max-width-1; }\n.mw2 { max-width: $max-width-2; }\n.mw3 { max-width: $max-width-3; }\n.mw4 { max-width: $max-width-4; }\n.mw5 { max-width: $max-width-5; }\n.mw6 { max-width: $max-width-6; }\n.mw7 { max-width: $max-width-7; }\n.mw8 { max-width: $max-width-8; }\n.mw9 { max-width: $max-width-9; }\n\n/* Max Width String Properties */\n\n.mw-none { max-width: none; }\n\n@media #{$breakpoint-not-small} {\n .mw-100-ns { max-width: 100%; }\n\n .mw1-ns { max-width: $max-width-1; }\n .mw2-ns { max-width: $max-width-2; }\n .mw3-ns { max-width: $max-width-3; }\n .mw4-ns { max-width: $max-width-4; }\n .mw5-ns { max-width: $max-width-5; }\n .mw6-ns { max-width: $max-width-6; }\n .mw7-ns { max-width: $max-width-7; }\n .mw8-ns { max-width: $max-width-8; }\n .mw9-ns { max-width: $max-width-9; }\n\n .mw-none-ns { max-width: none; }\n}\n\n@media #{$breakpoint-medium} {\n .mw-100-m { max-width: 100%; }\n\n .mw1-m { max-width: $max-width-1; }\n .mw2-m { max-width: $max-width-2; }\n .mw3-m { max-width: $max-width-3; }\n .mw4-m { max-width: $max-width-4; }\n .mw5-m { max-width: $max-width-5; }\n .mw6-m { max-width: $max-width-6; }\n .mw7-m { max-width: $max-width-7; }\n .mw8-m { max-width: $max-width-8; }\n .mw9-m { max-width: $max-width-9; }\n\n .mw-none-m { max-width: none; }\n}\n\n@media #{$breakpoint-large} {\n .mw-100-l { max-width: 100%; }\n\n .mw1-l { max-width: $max-width-1; }\n .mw2-l { max-width: $max-width-2; }\n .mw3-l { max-width: $max-width-3; }\n .mw4-l { max-width: $max-width-4; }\n .mw5-l { max-width: $max-width-5; }\n .mw6-l { max-width: $max-width-6; }\n .mw7-l { max-width: $max-width-7; }\n .mw8-l { max-width: $max-width-8; }\n .mw9-l { max-width: $max-width-9; }\n\n .mw-none-l { max-width: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n WIDTHS\n Docs: http://tachyons.io/docs/layout/widths/\n\n Base:\n w = width\n\n Modifiers\n 1 = 1st step in width scale\n 2 = 2nd step in width scale\n 3 = 3rd step in width scale\n 4 = 4th step in width scale\n 5 = 5th step in width scale\n\n -10 = literal value 10%\n -20 = literal value 20%\n -25 = literal value 25%\n -30 = literal value 30%\n -33 = literal value 33%\n -34 = literal value 34%\n -40 = literal value 40%\n -50 = literal value 50%\n -60 = literal value 60%\n -70 = literal value 70%\n -75 = literal value 75%\n -80 = literal value 80%\n -90 = literal value 90%\n -100 = literal value 100%\n\n -third = 100% / 3 (Not supported in opera mini or IE8)\n -two-thirds = 100% / 1.5 (Not supported in opera mini or IE8)\n -auto = string value auto\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n/* Width Scale */\n\n.w1 { width: $width-1; }\n.w2 { width: $width-2; }\n.w3 { width: $width-3; }\n.w4 { width: $width-4; }\n.w5 { width: $width-5; }\n\n.w-10 { width: 10%; }\n.w-20 { width: 20%; }\n.w-25 { width: 25%; }\n.w-30 { width: 30%; }\n.w-33 { width: 33%; }\n.w-34 { width: 34%; }\n.w-40 { width: 40%; }\n.w-50 { width: 50%; }\n.w-60 { width: 60%; }\n.w-70 { width: 70%; }\n.w-75 { width: 75%; }\n.w-80 { width: 80%; }\n.w-90 { width: 90%; }\n.w-100 { width: 100%; }\n\n.w-third { width: (100% / 3); }\n.w-two-thirds { width: (100% / 1.5); }\n.w-auto { width: auto; }\n\n@media #{$breakpoint-not-small} {\n .w1-ns { width: $width-1; }\n .w2-ns { width: $width-2; }\n .w3-ns { width: $width-3; }\n .w4-ns { width: $width-4; }\n .w5-ns { width: $width-5; }\n .w-10-ns { width: 10%; }\n .w-20-ns { width: 20%; }\n .w-25-ns { width: 25%; }\n .w-30-ns { width: 30%; }\n .w-33-ns { width: 33%; }\n .w-34-ns { width: 34%; }\n .w-40-ns { width: 40%; }\n .w-50-ns { width: 50%; }\n .w-60-ns { width: 60%; }\n .w-70-ns { width: 70%; }\n .w-75-ns { width: 75%; }\n .w-80-ns { width: 80%; }\n .w-90-ns { width: 90%; }\n .w-100-ns { width: 100%; }\n .w-third-ns { width: (100% / 3); }\n .w-two-thirds-ns { width: (100% / 1.5); }\n .w-auto-ns { width: auto; }\n}\n\n@media #{$breakpoint-medium} {\n .w1-m { width: $width-1; }\n .w2-m { width: $width-2; }\n .w3-m { width: $width-3; }\n .w4-m { width: $width-4; }\n .w5-m { width: $width-5; }\n .w-10-m { width: 10%; }\n .w-20-m { width: 20%; }\n .w-25-m { width: 25%; }\n .w-30-m { width: 30%; }\n .w-33-m { width: 33%; }\n .w-34-m { width: 34%; }\n .w-40-m { width: 40%; }\n .w-50-m { width: 50%; }\n .w-60-m { width: 60%; }\n .w-70-m { width: 70%; }\n .w-75-m { width: 75%; }\n .w-80-m { width: 80%; }\n .w-90-m { width: 90%; }\n .w-100-m { width: 100%; }\n .w-third-m { width: (100% / 3); }\n .w-two-thirds-m { width: (100% / 1.5); }\n .w-auto-m { width: auto; }\n}\n\n@media #{$breakpoint-large} {\n .w1-l { width: $width-1; }\n .w2-l { width: $width-2; }\n .w3-l { width: $width-3; }\n .w4-l { width: $width-4; }\n .w5-l { width: $width-5; }\n .w-10-l { width: 10%; }\n .w-20-l { width: 20%; }\n .w-25-l { width: 25%; }\n .w-30-l { width: 30%; }\n .w-33-l { width: 33%; }\n .w-34-l { width: 34%; }\n .w-40-l { width: 40%; }\n .w-50-l { width: 50%; }\n .w-60-l { width: 60%; }\n .w-70-l { width: 70%; }\n .w-75-l { width: 75%; }\n .w-80-l { width: 80%; }\n .w-90-l { width: 90%; }\n .w-100-l { width: 100%; }\n .w-third-l { width: (100% / 3); }\n .w-two-thirds-l { width: (100% / 1.5); }\n .w-auto-l { width: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OVERFLOW\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.overflow-visible { overflow: visible; }\n.overflow-hidden { overflow: hidden; }\n.overflow-scroll { overflow: scroll; }\n.overflow-auto { overflow: auto; }\n\n.overflow-x-visible { overflow-x: visible; }\n.overflow-x-hidden { overflow-x: hidden; }\n.overflow-x-scroll { overflow-x: scroll; }\n.overflow-x-auto { overflow-x: auto; }\n\n.overflow-y-visible { overflow-y: visible; }\n.overflow-y-hidden { overflow-y: hidden; }\n.overflow-y-scroll { overflow-y: scroll; }\n.overflow-y-auto { overflow-y: auto; }\n\n@media #{$breakpoint-not-small} {\n .overflow-visible-ns { overflow: visible; }\n .overflow-hidden-ns { overflow: hidden; }\n .overflow-scroll-ns { overflow: scroll; }\n .overflow-auto-ns { overflow: auto; }\n .overflow-x-visible-ns { overflow-x: visible; }\n .overflow-x-hidden-ns { overflow-x: hidden; }\n .overflow-x-scroll-ns { overflow-x: scroll; }\n .overflow-x-auto-ns { overflow-x: auto; }\n\n .overflow-y-visible-ns { overflow-y: visible; }\n .overflow-y-hidden-ns { overflow-y: hidden; }\n .overflow-y-scroll-ns { overflow-y: scroll; }\n .overflow-y-auto-ns { overflow-y: auto; }\n}\n\n@media #{$breakpoint-medium} {\n .overflow-visible-m { overflow: visible; }\n .overflow-hidden-m { overflow: hidden; }\n .overflow-scroll-m { overflow: scroll; }\n .overflow-auto-m { overflow: auto; }\n\n .overflow-x-visible-m { overflow-x: visible; }\n .overflow-x-hidden-m { overflow-x: hidden; }\n .overflow-x-scroll-m { overflow-x: scroll; }\n .overflow-x-auto-m { overflow-x: auto; }\n\n .overflow-y-visible-m { overflow-y: visible; }\n .overflow-y-hidden-m { overflow-y: hidden; }\n .overflow-y-scroll-m { overflow-y: scroll; }\n .overflow-y-auto-m { overflow-y: auto; }\n}\n\n@media #{$breakpoint-large} {\n .overflow-visible-l { overflow: visible; }\n .overflow-hidden-l { overflow: hidden; }\n .overflow-scroll-l { overflow: scroll; }\n .overflow-auto-l { overflow: auto; }\n\n .overflow-x-visible-l { overflow-x: visible; }\n .overflow-x-hidden-l { overflow-x: hidden; }\n .overflow-x-scroll-l { overflow-x: scroll; }\n .overflow-x-auto-l { overflow-x: auto; }\n\n .overflow-y-visible-l { overflow-y: visible; }\n .overflow-y-hidden-l { overflow-y: hidden; }\n .overflow-y-scroll-l { overflow-y: scroll; }\n .overflow-y-auto-l { overflow-y: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n POSITIONING\n Docs: http://tachyons.io/docs/layout/position/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.static { position: static; }\n.relative { position: relative; }\n.absolute { position: absolute; }\n.fixed { position: fixed; }\n\n@media #{$breakpoint-not-small} {\n .static-ns { position: static; }\n .relative-ns { position: relative; }\n .absolute-ns { position: absolute; }\n .fixed-ns { position: fixed; }\n}\n\n@media #{$breakpoint-medium} {\n .static-m { position: static; }\n .relative-m { position: relative; }\n .absolute-m { position: absolute; }\n .fixed-m { position: fixed; }\n}\n\n@media #{$breakpoint-large} {\n .static-l { position: static; }\n .relative-l { position: relative; }\n .absolute-l { position: absolute; }\n .fixed-l { position: fixed; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OPACITY\n Docs: http://tachyons.io/docs/themes/opacity/\n\n*/\n\n.o-100 { opacity: 1; }\n.o-90 { opacity: .9; }\n.o-80 { opacity: .8; }\n.o-70 { opacity: .7; }\n.o-60 { opacity: .6; }\n.o-50 { opacity: .5; }\n.o-40 { opacity: .4; }\n.o-30 { opacity: .3; }\n.o-20 { opacity: .2; }\n.o-10 { opacity: .1; }\n.o-05 { opacity: .05; }\n.o-025 { opacity: .025; }\n.o-0 { opacity: 0; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n ROTATIONS\n\n*/\n\n.rotate-45 { transform: rotate(45deg); }\n.rotate-90 { transform: rotate(90deg); }\n.rotate-135 { transform: rotate(135deg); }\n.rotate-180 { transform: rotate(180deg); }\n.rotate-225 { transform: rotate(225deg); }\n.rotate-270 { transform: rotate(270deg); }\n.rotate-315 { transform: rotate(315deg); }\n\n@media #{$breakpoint-not-small}{\n .rotate-45-ns { transform: rotate(45deg); }\n .rotate-90-ns { transform: rotate(90deg); }\n .rotate-135-ns { transform: rotate(135deg); }\n .rotate-180-ns { transform: rotate(180deg); }\n .rotate-225-ns { transform: rotate(225deg); }\n .rotate-270-ns { transform: rotate(270deg); }\n .rotate-315-ns { transform: rotate(315deg); }\n}\n\n@media #{$breakpoint-medium}{\n .rotate-45-m { transform: rotate(45deg); }\n .rotate-90-m { transform: rotate(90deg); }\n .rotate-135-m { transform: rotate(135deg); }\n .rotate-180-m { transform: rotate(180deg); }\n .rotate-225-m { transform: rotate(225deg); }\n .rotate-270-m { transform: rotate(270deg); }\n .rotate-315-m { transform: rotate(315deg); }\n}\n\n@media #{$breakpoint-large}{\n .rotate-45-l { transform: rotate(45deg); }\n .rotate-90-l { transform: rotate(90deg); }\n .rotate-135-l { transform: rotate(135deg); }\n .rotate-180-l { transform: rotate(180deg); }\n .rotate-225-l { transform: rotate(225deg); }\n .rotate-270-l { transform: rotate(270deg); }\n .rotate-315-l { transform: rotate(315deg); }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n SKINS\n Docs: http://tachyons.io/docs/themes/skins/\n\n Classes for setting foreground and background colors on elements.\n If you haven't declared a border color, but set border on an element, it will\n be set to the current text color.\n\n*/\n\n/* Text colors */\n\n.black-90 { color: $black-90; }\n.black-80 { color: $black-80; }\n.black-70 { color: $black-70; }\n.black-60 { color: $black-60; }\n.black-50 { color: $black-50; }\n.black-40 { color: $black-40; }\n.black-30 { color: $black-30; }\n.black-20 { color: $black-20; }\n.black-10 { color: $black-10; }\n.black-05 { color: $black-05; }\n\n.white-90 { color: $white-90; }\n.white-80 { color: $white-80; }\n.white-70 { color: $white-70; }\n.white-60 { color: $white-60; }\n.white-50 { color: $white-50; }\n.white-40 { color: $white-40; }\n.white-30 { color: $white-30; }\n.white-20 { color: $white-20; }\n.white-10 { color: $white-10; }\n\n.black { color: $black; }\n.near-black { color: $near-black; }\n.dark-gray { color: $dark-gray; }\n.mid-gray { color: $mid-gray; }\n.gray { color: $gray; }\n.silver { color: $silver; }\n.light-silver { color: $light-silver; }\n.moon-gray { color: $moon-gray; }\n.light-gray { color: $light-gray; }\n.near-white { color: $near-white; }\n.white { color: $white; }\n\n.dark-red { color: $dark-red; }\n.red { color: $red; }\n.light-red { color: $light-red; }\n.orange { color: $orange; }\n.gold { color: $gold; }\n.yellow { color: $yellow; }\n.light-yellow { color: $light-yellow; }\n.purple { color: $purple; }\n.light-purple { color: $light-purple; }\n.dark-pink { color: $dark-pink; }\n.hot-pink { color: $hot-pink; }\n.pink { color: $pink; }\n.light-pink { color: $light-pink; }\n.dark-green { color: $dark-green; }\n.green { color: $green; }\n.light-green { color: $light-green; }\n.navy { color: $navy; }\n.dark-blue { color: $dark-blue; }\n.blue { color: $blue; }\n.light-blue { color: $light-blue; }\n.lightest-blue { color: $lightest-blue; }\n.washed-blue { color: $washed-blue; }\n.washed-green { color: $washed-green; }\n.washed-yellow { color: $washed-yellow; }\n.washed-red { color: $washed-red; }\n.color-inherit { color: inherit; }\n\n.bg-black-90 { background-color: $black-90; }\n.bg-black-80 { background-color: $black-80; }\n.bg-black-70 { background-color: $black-70; }\n.bg-black-60 { background-color: $black-60; }\n.bg-black-50 { background-color: $black-50; }\n.bg-black-40 { background-color: $black-40; }\n.bg-black-30 { background-color: $black-30; }\n.bg-black-20 { background-color: $black-20; }\n.bg-black-10 { background-color: $black-10; }\n.bg-black-05 { background-color: $black-05; }\n.bg-white-90 { background-color: $white-90; }\n.bg-white-80 { background-color: $white-80; }\n.bg-white-70 { background-color: $white-70; }\n.bg-white-60 { background-color: $white-60; }\n.bg-white-50 { background-color: $white-50; }\n.bg-white-40 { background-color: $white-40; }\n.bg-white-30 { background-color: $white-30; }\n.bg-white-20 { background-color: $white-20; }\n.bg-white-10 { background-color: $white-10; }\n\n\n\n/* Background colors */\n\n.bg-black { background-color: $black; }\n.bg-near-black { background-color: $near-black; }\n.bg-dark-gray { background-color: $dark-gray; }\n.bg-mid-gray { background-color: $mid-gray; }\n.bg-gray { background-color: $gray; }\n.bg-silver { background-color: $silver; }\n.bg-light-silver { background-color: $light-silver; }\n.bg-moon-gray { background-color: $moon-gray; }\n.bg-light-gray { background-color: $light-gray; }\n.bg-near-white { background-color: $near-white; }\n.bg-white { background-color: $white; }\n.bg-transparent { background-color: $transparent; }\n\n.bg-dark-red { background-color: $dark-red; }\n.bg-red { background-color: $red; }\n.bg-light-red { background-color: $light-red; }\n.bg-orange { background-color: $orange; }\n.bg-gold { background-color: $gold; }\n.bg-yellow { background-color: $yellow; }\n.bg-light-yellow { background-color: $light-yellow; }\n.bg-purple { background-color: $purple; }\n.bg-light-purple { background-color: $light-purple; }\n.bg-dark-pink { background-color: $dark-pink; }\n.bg-hot-pink { background-color: $hot-pink; }\n.bg-pink { background-color: $pink; }\n.bg-light-pink { background-color: $light-pink; }\n.bg-dark-green { background-color: $dark-green; }\n.bg-green { background-color: $green; }\n.bg-light-green { background-color: $light-green; }\n.bg-navy { background-color: $navy; }\n.bg-dark-blue { background-color: $dark-blue; }\n.bg-blue { background-color: $blue; }\n.bg-light-blue { background-color: $light-blue; }\n.bg-lightest-blue { background-color: $lightest-blue; }\n.bg-washed-blue { background-color: $washed-blue; }\n.bg-washed-green { background-color: $washed-green; }\n.bg-washed-yellow { background-color: $washed-yellow; }\n.bg-washed-red { background-color: $washed-red; }\n.bg-inherit { background-color: inherit; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n SKINS:PSEUDO\n\n Customize the color of an element when\n it is focused or hovered over.\n\n */\n\n.hover-black:hover,\n.hover-black:focus { color: $black; }\n.hover-near-black:hover,\n.hover-near-black:focus { color: $near-black; }\n.hover-dark-gray:hover,\n.hover-dark-gray:focus { color: $dark-gray; }\n.hover-mid-gray:hover,\n.hover-mid-gray:focus { color: $mid-gray; }\n.hover-gray:hover,\n.hover-gray:focus { color: $gray; }\n.hover-silver:hover,\n.hover-silver:focus { color: $silver; }\n.hover-light-silver:hover,\n.hover-light-silver:focus { color: $light-silver; }\n.hover-moon-gray:hover,\n.hover-moon-gray:focus { color: $moon-gray; }\n.hover-light-gray:hover,\n.hover-light-gray:focus { color: $light-gray; }\n.hover-near-white:hover,\n.hover-near-white:focus { color: $near-white; }\n.hover-white:hover,\n.hover-white:focus { color: $white; }\n\n.hover-black-90:hover,\n.hover-black-90:focus { color: $black-90; }\n.hover-black-80:hover,\n.hover-black-80:focus { color: $black-80; }\n.hover-black-70:hover,\n.hover-black-70:focus { color: $black-70; }\n.hover-black-60:hover,\n.hover-black-60:focus { color: $black-60; }\n.hover-black-50:hover,\n.hover-black-50:focus { color: $black-50; }\n.hover-black-40:hover,\n.hover-black-40:focus { color: $black-40; }\n.hover-black-30:hover,\n.hover-black-30:focus { color: $black-30; }\n.hover-black-20:hover,\n.hover-black-20:focus { color: $black-20; }\n.hover-black-10:hover,\n.hover-black-10:focus { color: $black-10; }\n.hover-white-90:hover,\n.hover-white-90:focus { color: $white-90; }\n.hover-white-80:hover,\n.hover-white-80:focus { color: $white-80; }\n.hover-white-70:hover,\n.hover-white-70:focus { color: $white-70; }\n.hover-white-60:hover,\n.hover-white-60:focus { color: $white-60; }\n.hover-white-50:hover,\n.hover-white-50:focus { color: $white-50; }\n.hover-white-40:hover,\n.hover-white-40:focus { color: $white-40; }\n.hover-white-30:hover,\n.hover-white-30:focus { color: $white-30; }\n.hover-white-20:hover,\n.hover-white-20:focus { color: $white-20; }\n.hover-white-10:hover,\n.hover-white-10:focus { color: $white-10; }\n.hover-inherit:hover,\n.hover-inherit:focus { color: inherit; }\n\n.hover-bg-black:hover,\n.hover-bg-black:focus { background-color: $black; }\n.hover-bg-near-black:hover,\n.hover-bg-near-black:focus { background-color: $near-black; }\n.hover-bg-dark-gray:hover,\n.hover-bg-dark-gray:focus { background-color: $dark-gray; }\n.hover-bg-mid-gray:hover,\n.hover-bg-mid-gray:focus { background-color: $mid-gray; }\n.hover-bg-gray:hover,\n.hover-bg-gray:focus { background-color: $gray; }\n.hover-bg-silver:hover,\n.hover-bg-silver:focus { background-color: $silver; }\n.hover-bg-light-silver:hover,\n.hover-bg-light-silver:focus { background-color: $light-silver; }\n.hover-bg-moon-gray:hover,\n.hover-bg-moon-gray:focus { background-color: $moon-gray; }\n.hover-bg-light-gray:hover,\n.hover-bg-light-gray:focus { background-color: $light-gray; }\n.hover-bg-near-white:hover,\n.hover-bg-near-white:focus { background-color: $near-white; }\n.hover-bg-white:hover,\n.hover-bg-white:focus { background-color: $white; }\n.hover-bg-transparent:hover,\n.hover-bg-transparent:focus { background-color: $transparent; }\n\n.hover-bg-black-90:hover,\n.hover-bg-black-90:focus { background-color: $black-90; }\n.hover-bg-black-80:hover,\n.hover-bg-black-80:focus { background-color: $black-80; }\n.hover-bg-black-70:hover,\n.hover-bg-black-70:focus { background-color: $black-70; }\n.hover-bg-black-60:hover,\n.hover-bg-black-60:focus { background-color: $black-60; }\n.hover-bg-black-50:hover,\n.hover-bg-black-50:focus { background-color: $black-50; }\n.hover-bg-black-40:hover,\n.hover-bg-black-40:focus { background-color: $black-40; }\n.hover-bg-black-30:hover,\n.hover-bg-black-30:focus { background-color: $black-30; }\n.hover-bg-black-20:hover,\n.hover-bg-black-20:focus { background-color: $black-20; }\n.hover-bg-black-10:hover,\n.hover-bg-black-10:focus { background-color: $black-10; }\n.hover-bg-white-90:hover,\n.hover-bg-white-90:focus { background-color: $white-90; }\n.hover-bg-white-80:hover,\n.hover-bg-white-80:focus { background-color: $white-80; }\n.hover-bg-white-70:hover,\n.hover-bg-white-70:focus { background-color: $white-70; }\n.hover-bg-white-60:hover,\n.hover-bg-white-60:focus { background-color: $white-60; }\n.hover-bg-white-50:hover,\n.hover-bg-white-50:focus { background-color: $white-50; }\n.hover-bg-white-40:hover,\n.hover-bg-white-40:focus { background-color: $white-40; }\n.hover-bg-white-30:hover,\n.hover-bg-white-30:focus { background-color: $white-30; }\n.hover-bg-white-20:hover,\n.hover-bg-white-20:focus { background-color: $white-20; }\n.hover-bg-white-10:hover,\n.hover-bg-white-10:focus { background-color: $white-10; }\n\n.hover-dark-red:hover,\n.hover-dark-red:focus { color: $dark-red; }\n.hover-red:hover,\n.hover-red:focus { color: $red; }\n.hover-light-red:hover,\n.hover-light-red:focus { color: $light-red; }\n.hover-orange:hover,\n.hover-orange:focus { color: $orange; }\n.hover-gold:hover,\n.hover-gold:focus { color: $gold; }\n.hover-yellow:hover,\n.hover-yellow:focus { color: $yellow; }\n.hover-light-yellow:hover,\n.hover-light-yellow:focus { color: $light-yellow; }\n.hover-purple:hover,\n.hover-purple:focus { color: $purple; }\n.hover-light-purple:hover,\n.hover-light-purple:focus { color: $light-purple; }\n.hover-dark-pink:hover,\n.hover-dark-pink:focus { color: $dark-pink; }\n.hover-hot-pink:hover,\n.hover-hot-pink:focus { color: $hot-pink; }\n.hover-pink:hover,\n.hover-pink:focus { color: $pink; }\n.hover-light-pink:hover,\n.hover-light-pink:focus { color: $light-pink; }\n.hover-dark-green:hover,\n.hover-dark-green:focus { color: $dark-green; }\n.hover-green:hover,\n.hover-green:focus { color: $green; }\n.hover-light-green:hover,\n.hover-light-green:focus { color: $light-green; }\n.hover-navy:hover,\n.hover-navy:focus { color: $navy; }\n.hover-dark-blue:hover,\n.hover-dark-blue:focus { color: $dark-blue; }\n.hover-blue:hover,\n.hover-blue:focus { color: $blue; }\n.hover-light-blue:hover,\n.hover-light-blue:focus { color: $light-blue; }\n.hover-lightest-blue:hover,\n.hover-lightest-blue:focus { color: $lightest-blue; }\n.hover-washed-blue:hover,\n.hover-washed-blue:focus { color: $washed-blue; }\n.hover-washed-green:hover,\n.hover-washed-green:focus { color: $washed-green; }\n.hover-washed-yellow:hover,\n.hover-washed-yellow:focus { color: $washed-yellow; }\n.hover-washed-red:hover,\n.hover-washed-red:focus { color: $washed-red; }\n\n.hover-bg-dark-red:hover,\n.hover-bg-dark-red:focus { background-color: $dark-red; }\n.hover-bg-red:hover,\n.hover-bg-red:focus { background-color: $red; }\n.hover-bg-light-red:hover,\n.hover-bg-light-red:focus { background-color: $light-red; }\n.hover-bg-orange:hover,\n.hover-bg-orange:focus { background-color: $orange; }\n.hover-bg-gold:hover,\n.hover-bg-gold:focus { background-color: $gold; }\n.hover-bg-yellow:hover,\n.hover-bg-yellow:focus { background-color: $yellow; }\n.hover-bg-light-yellow:hover,\n.hover-bg-light-yellow:focus { background-color: $light-yellow; }\n.hover-bg-purple:hover,\n.hover-bg-purple:focus { background-color: $purple; }\n.hover-bg-light-purple:hover,\n.hover-bg-light-purple:focus { background-color: $light-purple; }\n.hover-bg-dark-pink:hover,\n.hover-bg-dark-pink:focus { background-color: $dark-pink; }\n.hover-bg-hot-pink:hover,\n.hover-bg-hot-pink:focus { background-color: $hot-pink; }\n.hover-bg-pink:hover,\n.hover-bg-pink:focus { background-color: $pink; }\n.hover-bg-light-pink:hover,\n.hover-bg-light-pink:focus { background-color: $light-pink; }\n.hover-bg-dark-green:hover,\n.hover-bg-dark-green:focus { background-color: $dark-green; }\n.hover-bg-green:hover,\n.hover-bg-green:focus { background-color: $green; }\n.hover-bg-light-green:hover,\n.hover-bg-light-green:focus { background-color: $light-green; }\n.hover-bg-navy:hover,\n.hover-bg-navy:focus { background-color: $navy; }\n.hover-bg-dark-blue:hover,\n.hover-bg-dark-blue:focus { background-color: $dark-blue; }\n.hover-bg-blue:hover,\n.hover-bg-blue:focus { background-color: $blue; }\n.hover-bg-light-blue:hover,\n.hover-bg-light-blue:focus { background-color: $light-blue; }\n.hover-bg-lightest-blue:hover,\n.hover-bg-lightest-blue:focus { background-color: $lightest-blue; }\n.hover-bg-washed-blue:hover,\n.hover-bg-washed-blue:focus { background-color: $washed-blue; }\n.hover-bg-washed-green:hover,\n.hover-bg-washed-green:focus { background-color: $washed-green; }\n.hover-bg-washed-yellow:hover,\n.hover-bg-washed-yellow:focus { background-color: $washed-yellow; }\n.hover-bg-washed-red:hover,\n.hover-bg-washed-red:focus { background-color: $washed-red; }\n.hover-bg-inherit:hover,\n.hover-bg-inherit:focus { background-color: inherit; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/* Variables */\n\n/*\n SPACING\n Docs: http://tachyons.io/docs/layout/spacing/\n\n An eight step powers of two scale ranging from 0 to 16rem.\n\n Base:\n p = padding\n m = margin\n\n Modifiers:\n a = all\n h = horizontal\n v = vertical\n t = top\n r = right\n b = bottom\n l = left\n\n 0 = none\n 1 = 1st step in spacing scale\n 2 = 2nd step in spacing scale\n 3 = 3rd step in spacing scale\n 4 = 4th step in spacing scale\n 5 = 5th step in spacing scale\n 6 = 6th step in spacing scale\n 7 = 7th step in spacing scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n.pa0 { padding: $spacing-none; }\n.pa1 { padding: $spacing-extra-small; }\n.pa2 { padding: $spacing-small; }\n.pa3 { padding: $spacing-medium; }\n.pa4 { padding: $spacing-large; }\n.pa5 { padding: $spacing-extra-large; }\n.pa6 { padding: $spacing-extra-extra-large; }\n.pa7 { padding: $spacing-extra-extra-extra-large; }\n\n.pl0 { padding-left: $spacing-none; }\n.pl1 { padding-left: $spacing-extra-small; }\n.pl2 { padding-left: $spacing-small; }\n.pl3 { padding-left: $spacing-medium; }\n.pl4 { padding-left: $spacing-large; }\n.pl5 { padding-left: $spacing-extra-large; }\n.pl6 { padding-left: $spacing-extra-extra-large; }\n.pl7 { padding-left: $spacing-extra-extra-extra-large; }\n\n.pr0 { padding-right: $spacing-none; }\n.pr1 { padding-right: $spacing-extra-small; }\n.pr2 { padding-right: $spacing-small; }\n.pr3 { padding-right: $spacing-medium; }\n.pr4 { padding-right: $spacing-large; }\n.pr5 { padding-right: $spacing-extra-large; }\n.pr6 { padding-right: $spacing-extra-extra-large; }\n.pr7 { padding-right: $spacing-extra-extra-extra-large; }\n\n.pb0 { padding-bottom: $spacing-none; }\n.pb1 { padding-bottom: $spacing-extra-small; }\n.pb2 { padding-bottom: $spacing-small; }\n.pb3 { padding-bottom: $spacing-medium; }\n.pb4 { padding-bottom: $spacing-large; }\n.pb5 { padding-bottom: $spacing-extra-large; }\n.pb6 { padding-bottom: $spacing-extra-extra-large; }\n.pb7 { padding-bottom: $spacing-extra-extra-extra-large; }\n\n.pt0 { padding-top: $spacing-none; }\n.pt1 { padding-top: $spacing-extra-small; }\n.pt2 { padding-top: $spacing-small; }\n.pt3 { padding-top: $spacing-medium; }\n.pt4 { padding-top: $spacing-large; }\n.pt5 { padding-top: $spacing-extra-large; }\n.pt6 { padding-top: $spacing-extra-extra-large; }\n.pt7 { padding-top: $spacing-extra-extra-extra-large; }\n\n.pv0 {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n}\n.pv1 {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n}\n.pv2 {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n}\n.pv3 {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n}\n.pv4 {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n}\n.pv5 {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n}\n.pv6 {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n}\n\n.pv7 {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n}\n\n.ph0 {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n}\n\n.ph1 {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n}\n\n.ph2 {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n}\n\n.ph3 {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n}\n\n.ph4 {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n}\n\n.ph5 {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n}\n\n.ph6 {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n}\n\n.ph7 {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n}\n\n.ma0 { margin: $spacing-none; }\n.ma1 { margin: $spacing-extra-small; }\n.ma2 { margin: $spacing-small; }\n.ma3 { margin: $spacing-medium; }\n.ma4 { margin: $spacing-large; }\n.ma5 { margin: $spacing-extra-large; }\n.ma6 { margin: $spacing-extra-extra-large; }\n.ma7 { margin: $spacing-extra-extra-extra-large; }\n\n.ml0 { margin-left: $spacing-none; }\n.ml1 { margin-left: $spacing-extra-small; }\n.ml2 { margin-left: $spacing-small; }\n.ml3 { margin-left: $spacing-medium; }\n.ml4 { margin-left: $spacing-large; }\n.ml5 { margin-left: $spacing-extra-large; }\n.ml6 { margin-left: $spacing-extra-extra-large; }\n.ml7 { margin-left: $spacing-extra-extra-extra-large; }\n\n.mr0 { margin-right: $spacing-none; }\n.mr1 { margin-right: $spacing-extra-small; }\n.mr2 { margin-right: $spacing-small; }\n.mr3 { margin-right: $spacing-medium; }\n.mr4 { margin-right: $spacing-large; }\n.mr5 { margin-right: $spacing-extra-large; }\n.mr6 { margin-right: $spacing-extra-extra-large; }\n.mr7 { margin-right: $spacing-extra-extra-extra-large; }\n\n.mb0 { margin-bottom: $spacing-none; }\n.mb1 { margin-bottom: $spacing-extra-small; }\n.mb2 { margin-bottom: $spacing-small; }\n.mb3 { margin-bottom: $spacing-medium; }\n.mb4 { margin-bottom: $spacing-large; }\n.mb5 { margin-bottom: $spacing-extra-large; }\n.mb6 { margin-bottom: $spacing-extra-extra-large; }\n.mb7 { margin-bottom: $spacing-extra-extra-extra-large; }\n\n.mt0 { margin-top: $spacing-none; }\n.mt1 { margin-top: $spacing-extra-small; }\n.mt2 { margin-top: $spacing-small; }\n.mt3 { margin-top: $spacing-medium; }\n.mt4 { margin-top: $spacing-large; }\n.mt5 { margin-top: $spacing-extra-large; }\n.mt6 { margin-top: $spacing-extra-extra-large; }\n.mt7 { margin-top: $spacing-extra-extra-extra-large; }\n\n.mv0 {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n}\n.mv1 {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n}\n.mv2 {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n}\n.mv3 {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n}\n.mv4 {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n}\n.mv5 {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n}\n.mv6 {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n}\n.mv7 {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n}\n\n.mh0 {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n}\n.mh1 {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n}\n.mh2 {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n}\n.mh3 {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n}\n.mh4 {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n}\n.mh5 {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n}\n.mh6 {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n}\n.mh7 {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n}\n\n@media #{$breakpoint-not-small} {\n .pa0-ns { padding: $spacing-none; }\n .pa1-ns { padding: $spacing-extra-small; }\n .pa2-ns { padding: $spacing-small; }\n .pa3-ns { padding: $spacing-medium; }\n .pa4-ns { padding: $spacing-large; }\n .pa5-ns { padding: $spacing-extra-large; }\n .pa6-ns { padding: $spacing-extra-extra-large; }\n .pa7-ns { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-ns { padding-left: $spacing-none; }\n .pl1-ns { padding-left: $spacing-extra-small; }\n .pl2-ns { padding-left: $spacing-small; }\n .pl3-ns { padding-left: $spacing-medium; }\n .pl4-ns { padding-left: $spacing-large; }\n .pl5-ns { padding-left: $spacing-extra-large; }\n .pl6-ns { padding-left: $spacing-extra-extra-large; }\n .pl7-ns { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-ns { padding-right: $spacing-none; }\n .pr1-ns { padding-right: $spacing-extra-small; }\n .pr2-ns { padding-right: $spacing-small; }\n .pr3-ns { padding-right: $spacing-medium; }\n .pr4-ns { padding-right: $spacing-large; }\n .pr5-ns { padding-right: $spacing-extra-large; }\n .pr6-ns { padding-right: $spacing-extra-extra-large; }\n .pr7-ns { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-ns { padding-bottom: $spacing-none; }\n .pb1-ns { padding-bottom: $spacing-extra-small; }\n .pb2-ns { padding-bottom: $spacing-small; }\n .pb3-ns { padding-bottom: $spacing-medium; }\n .pb4-ns { padding-bottom: $spacing-large; }\n .pb5-ns { padding-bottom: $spacing-extra-large; }\n .pb6-ns { padding-bottom: $spacing-extra-extra-large; }\n .pb7-ns { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-ns { padding-top: $spacing-none; }\n .pt1-ns { padding-top: $spacing-extra-small; }\n .pt2-ns { padding-top: $spacing-small; }\n .pt3-ns { padding-top: $spacing-medium; }\n .pt4-ns { padding-top: $spacing-large; }\n .pt5-ns { padding-top: $spacing-extra-large; }\n .pt6-ns { padding-top: $spacing-extra-extra-large; }\n .pt7-ns { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-ns {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-ns {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-ns {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-ns {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-ns {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-ns {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-ns {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-ns {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n .ph0-ns {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-ns {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-ns {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-ns {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-ns {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-ns {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-ns {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-ns {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-ns { margin: $spacing-none; }\n .ma1-ns { margin: $spacing-extra-small; }\n .ma2-ns { margin: $spacing-small; }\n .ma3-ns { margin: $spacing-medium; }\n .ma4-ns { margin: $spacing-large; }\n .ma5-ns { margin: $spacing-extra-large; }\n .ma6-ns { margin: $spacing-extra-extra-large; }\n .ma7-ns { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-ns { margin-left: $spacing-none; }\n .ml1-ns { margin-left: $spacing-extra-small; }\n .ml2-ns { margin-left: $spacing-small; }\n .ml3-ns { margin-left: $spacing-medium; }\n .ml4-ns { margin-left: $spacing-large; }\n .ml5-ns { margin-left: $spacing-extra-large; }\n .ml6-ns { margin-left: $spacing-extra-extra-large; }\n .ml7-ns { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-ns { margin-right: $spacing-none; }\n .mr1-ns { margin-right: $spacing-extra-small; }\n .mr2-ns { margin-right: $spacing-small; }\n .mr3-ns { margin-right: $spacing-medium; }\n .mr4-ns { margin-right: $spacing-large; }\n .mr5-ns { margin-right: $spacing-extra-large; }\n .mr6-ns { margin-right: $spacing-extra-extra-large; }\n .mr7-ns { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-ns { margin-bottom: $spacing-none; }\n .mb1-ns { margin-bottom: $spacing-extra-small; }\n .mb2-ns { margin-bottom: $spacing-small; }\n .mb3-ns { margin-bottom: $spacing-medium; }\n .mb4-ns { margin-bottom: $spacing-large; }\n .mb5-ns { margin-bottom: $spacing-extra-large; }\n .mb6-ns { margin-bottom: $spacing-extra-extra-large; }\n .mb7-ns { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-ns { margin-top: $spacing-none; }\n .mt1-ns { margin-top: $spacing-extra-small; }\n .mt2-ns { margin-top: $spacing-small; }\n .mt3-ns { margin-top: $spacing-medium; }\n .mt4-ns { margin-top: $spacing-large; }\n .mt5-ns { margin-top: $spacing-extra-large; }\n .mt6-ns { margin-top: $spacing-extra-extra-large; }\n .mt7-ns { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-ns {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-ns {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-ns {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-ns {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-ns {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-ns {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-ns {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-ns {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-ns {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-ns {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-ns {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-ns {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-ns {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-ns {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-ns {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-ns {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n\n}\n\n@media #{$breakpoint-medium} {\n .pa0-m { padding: $spacing-none; }\n .pa1-m { padding: $spacing-extra-small; }\n .pa2-m { padding: $spacing-small; }\n .pa3-m { padding: $spacing-medium; }\n .pa4-m { padding: $spacing-large; }\n .pa5-m { padding: $spacing-extra-large; }\n .pa6-m { padding: $spacing-extra-extra-large; }\n .pa7-m { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-m { padding-left: $spacing-none; }\n .pl1-m { padding-left: $spacing-extra-small; }\n .pl2-m { padding-left: $spacing-small; }\n .pl3-m { padding-left: $spacing-medium; }\n .pl4-m { padding-left: $spacing-large; }\n .pl5-m { padding-left: $spacing-extra-large; }\n .pl6-m { padding-left: $spacing-extra-extra-large; }\n .pl7-m { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-m { padding-right: $spacing-none; }\n .pr1-m { padding-right: $spacing-extra-small; }\n .pr2-m { padding-right: $spacing-small; }\n .pr3-m { padding-right: $spacing-medium; }\n .pr4-m { padding-right: $spacing-large; }\n .pr5-m { padding-right: $spacing-extra-large; }\n .pr6-m { padding-right: $spacing-extra-extra-large; }\n .pr7-m { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-m { padding-bottom: $spacing-none; }\n .pb1-m { padding-bottom: $spacing-extra-small; }\n .pb2-m { padding-bottom: $spacing-small; }\n .pb3-m { padding-bottom: $spacing-medium; }\n .pb4-m { padding-bottom: $spacing-large; }\n .pb5-m { padding-bottom: $spacing-extra-large; }\n .pb6-m { padding-bottom: $spacing-extra-extra-large; }\n .pb7-m { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-m { padding-top: $spacing-none; }\n .pt1-m { padding-top: $spacing-extra-small; }\n .pt2-m { padding-top: $spacing-small; }\n .pt3-m { padding-top: $spacing-medium; }\n .pt4-m { padding-top: $spacing-large; }\n .pt5-m { padding-top: $spacing-extra-large; }\n .pt6-m { padding-top: $spacing-extra-extra-large; }\n .pt7-m { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-m {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-m {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-m {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-m {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-m {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-m {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-m {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-m {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n\n .ph0-m {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-m {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-m {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-m {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-m {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-m {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-m {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-m {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-m { margin: $spacing-none; }\n .ma1-m { margin: $spacing-extra-small; }\n .ma2-m { margin: $spacing-small; }\n .ma3-m { margin: $spacing-medium; }\n .ma4-m { margin: $spacing-large; }\n .ma5-m { margin: $spacing-extra-large; }\n .ma6-m { margin: $spacing-extra-extra-large; }\n .ma7-m { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-m { margin-left: $spacing-none; }\n .ml1-m { margin-left: $spacing-extra-small; }\n .ml2-m { margin-left: $spacing-small; }\n .ml3-m { margin-left: $spacing-medium; }\n .ml4-m { margin-left: $spacing-large; }\n .ml5-m { margin-left: $spacing-extra-large; }\n .ml6-m { margin-left: $spacing-extra-extra-large; }\n .ml7-m { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-m { margin-right: $spacing-none; }\n .mr1-m { margin-right: $spacing-extra-small; }\n .mr2-m { margin-right: $spacing-small; }\n .mr3-m { margin-right: $spacing-medium; }\n .mr4-m { margin-right: $spacing-large; }\n .mr5-m { margin-right: $spacing-extra-large; }\n .mr6-m { margin-right: $spacing-extra-extra-large; }\n .mr7-m { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-m { margin-bottom: $spacing-none; }\n .mb1-m { margin-bottom: $spacing-extra-small; }\n .mb2-m { margin-bottom: $spacing-small; }\n .mb3-m { margin-bottom: $spacing-medium; }\n .mb4-m { margin-bottom: $spacing-large; }\n .mb5-m { margin-bottom: $spacing-extra-large; }\n .mb6-m { margin-bottom: $spacing-extra-extra-large; }\n .mb7-m { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-m { margin-top: $spacing-none; }\n .mt1-m { margin-top: $spacing-extra-small; }\n .mt2-m { margin-top: $spacing-small; }\n .mt3-m { margin-top: $spacing-medium; }\n .mt4-m { margin-top: $spacing-large; }\n .mt5-m { margin-top: $spacing-extra-large; }\n .mt6-m { margin-top: $spacing-extra-extra-large; }\n .mt7-m { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-m {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-m {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-m {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-m {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-m {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-m {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-m {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-m {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-m {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-m {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-m {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-m {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-m {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-m {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-m {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-m {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n\n}\n\n@media #{$breakpoint-large} {\n .pa0-l { padding: $spacing-none; }\n .pa1-l { padding: $spacing-extra-small; }\n .pa2-l { padding: $spacing-small; }\n .pa3-l { padding: $spacing-medium; }\n .pa4-l { padding: $spacing-large; }\n .pa5-l { padding: $spacing-extra-large; }\n .pa6-l { padding: $spacing-extra-extra-large; }\n .pa7-l { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-l { padding-left: $spacing-none; }\n .pl1-l { padding-left: $spacing-extra-small; }\n .pl2-l { padding-left: $spacing-small; }\n .pl3-l { padding-left: $spacing-medium; }\n .pl4-l { padding-left: $spacing-large; }\n .pl5-l { padding-left: $spacing-extra-large; }\n .pl6-l { padding-left: $spacing-extra-extra-large; }\n .pl7-l { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-l { padding-right: $spacing-none; }\n .pr1-l { padding-right: $spacing-extra-small; }\n .pr2-l { padding-right: $spacing-small; }\n .pr3-l { padding-right: $spacing-medium; }\n .pr4-l { padding-right: $spacing-large; }\n .pr5-l { padding-right: $spacing-extra-large; }\n .pr6-l { padding-right: $spacing-extra-extra-large; }\n .pr7-l { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-l { padding-bottom: $spacing-none; }\n .pb1-l { padding-bottom: $spacing-extra-small; }\n .pb2-l { padding-bottom: $spacing-small; }\n .pb3-l { padding-bottom: $spacing-medium; }\n .pb4-l { padding-bottom: $spacing-large; }\n .pb5-l { padding-bottom: $spacing-extra-large; }\n .pb6-l { padding-bottom: $spacing-extra-extra-large; }\n .pb7-l { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-l { padding-top: $spacing-none; }\n .pt1-l { padding-top: $spacing-extra-small; }\n .pt2-l { padding-top: $spacing-small; }\n .pt3-l { padding-top: $spacing-medium; }\n .pt4-l { padding-top: $spacing-large; }\n .pt5-l { padding-top: $spacing-extra-large; }\n .pt6-l { padding-top: $spacing-extra-extra-large; }\n .pt7-l { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-l {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-l {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-l {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-l {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-l {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-l {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-l {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-l {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n\n .ph0-l {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-l {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-l {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-l {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-l {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-l {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-l {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-l {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-l { margin: $spacing-none; }\n .ma1-l { margin: $spacing-extra-small; }\n .ma2-l { margin: $spacing-small; }\n .ma3-l { margin: $spacing-medium; }\n .ma4-l { margin: $spacing-large; }\n .ma5-l { margin: $spacing-extra-large; }\n .ma6-l { margin: $spacing-extra-extra-large; }\n .ma7-l { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-l { margin-left: $spacing-none; }\n .ml1-l { margin-left: $spacing-extra-small; }\n .ml2-l { margin-left: $spacing-small; }\n .ml3-l { margin-left: $spacing-medium; }\n .ml4-l { margin-left: $spacing-large; }\n .ml5-l { margin-left: $spacing-extra-large; }\n .ml6-l { margin-left: $spacing-extra-extra-large; }\n .ml7-l { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-l { margin-right: $spacing-none; }\n .mr1-l { margin-right: $spacing-extra-small; }\n .mr2-l { margin-right: $spacing-small; }\n .mr3-l { margin-right: $spacing-medium; }\n .mr4-l { margin-right: $spacing-large; }\n .mr5-l { margin-right: $spacing-extra-large; }\n .mr6-l { margin-right: $spacing-extra-extra-large; }\n .mr7-l { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-l { margin-bottom: $spacing-none; }\n .mb1-l { margin-bottom: $spacing-extra-small; }\n .mb2-l { margin-bottom: $spacing-small; }\n .mb3-l { margin-bottom: $spacing-medium; }\n .mb4-l { margin-bottom: $spacing-large; }\n .mb5-l { margin-bottom: $spacing-extra-large; }\n .mb6-l { margin-bottom: $spacing-extra-extra-large; }\n .mb7-l { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-l { margin-top: $spacing-none; }\n .mt1-l { margin-top: $spacing-extra-small; }\n .mt2-l { margin-top: $spacing-small; }\n .mt3-l { margin-top: $spacing-medium; }\n .mt4-l { margin-top: $spacing-large; }\n .mt5-l { margin-top: $spacing-extra-large; }\n .mt6-l { margin-top: $spacing-extra-extra-large; }\n .mt7-l { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-l {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-l {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-l {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-l {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-l {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-l {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-l {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-l {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-l {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-l {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-l {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-l {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-l {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-l {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-l {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-l {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n NEGATIVE MARGINS\n\n Base:\n n = negative\n\n Modifiers:\n a = all\n t = top\n r = right\n b = bottom\n l = left\n\n 1 = 1st step in spacing scale\n 2 = 2nd step in spacing scale\n 3 = 3rd step in spacing scale\n 4 = 4th step in spacing scale\n 5 = 5th step in spacing scale\n 6 = 6th step in spacing scale\n 7 = 7th step in spacing scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n.na1 { margin: -$spacing-extra-small; }\n.na2 { margin: -$spacing-small; }\n.na3 { margin: -$spacing-medium; }\n.na4 { margin: -$spacing-large; }\n.na5 { margin: -$spacing-extra-large; }\n.na6 { margin: -$spacing-extra-extra-large; }\n.na7 { margin: -$spacing-extra-extra-extra-large; }\n\n.nl1 { margin-left: -$spacing-extra-small; }\n.nl2 { margin-left: -$spacing-small; }\n.nl3 { margin-left: -$spacing-medium; }\n.nl4 { margin-left: -$spacing-large; }\n.nl5 { margin-left: -$spacing-extra-large; }\n.nl6 { margin-left: -$spacing-extra-extra-large; }\n.nl7 { margin-left: -$spacing-extra-extra-extra-large; }\n\n.nr1 { margin-right: -$spacing-extra-small; }\n.nr2 { margin-right: -$spacing-small; }\n.nr3 { margin-right: -$spacing-medium; }\n.nr4 { margin-right: -$spacing-large; }\n.nr5 { margin-right: -$spacing-extra-large; }\n.nr6 { margin-right: -$spacing-extra-extra-large; }\n.nr7 { margin-right: -$spacing-extra-extra-extra-large; }\n\n.nb1 { margin-bottom: -$spacing-extra-small; }\n.nb2 { margin-bottom: -$spacing-small; }\n.nb3 { margin-bottom: -$spacing-medium; }\n.nb4 { margin-bottom: -$spacing-large; }\n.nb5 { margin-bottom: -$spacing-extra-large; }\n.nb6 { margin-bottom: -$spacing-extra-extra-large; }\n.nb7 { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n.nt1 { margin-top: -$spacing-extra-small; }\n.nt2 { margin-top: -$spacing-small; }\n.nt3 { margin-top: -$spacing-medium; }\n.nt4 { margin-top: -$spacing-large; }\n.nt5 { margin-top: -$spacing-extra-large; }\n.nt6 { margin-top: -$spacing-extra-extra-large; }\n.nt7 { margin-top: -$spacing-extra-extra-extra-large; }\n\n@media #{$breakpoint-not-small} {\n\n .na1-ns { margin: -$spacing-extra-small; }\n .na2-ns { margin: -$spacing-small; }\n .na3-ns { margin: -$spacing-medium; }\n .na4-ns { margin: -$spacing-large; }\n .na5-ns { margin: -$spacing-extra-large; }\n .na6-ns { margin: -$spacing-extra-extra-large; }\n .na7-ns { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-ns { margin-left: -$spacing-extra-small; }\n .nl2-ns { margin-left: -$spacing-small; }\n .nl3-ns { margin-left: -$spacing-medium; }\n .nl4-ns { margin-left: -$spacing-large; }\n .nl5-ns { margin-left: -$spacing-extra-large; }\n .nl6-ns { margin-left: -$spacing-extra-extra-large; }\n .nl7-ns { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-ns { margin-right: -$spacing-extra-small; }\n .nr2-ns { margin-right: -$spacing-small; }\n .nr3-ns { margin-right: -$spacing-medium; }\n .nr4-ns { margin-right: -$spacing-large; }\n .nr5-ns { margin-right: -$spacing-extra-large; }\n .nr6-ns { margin-right: -$spacing-extra-extra-large; }\n .nr7-ns { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-ns { margin-bottom: -$spacing-extra-small; }\n .nb2-ns { margin-bottom: -$spacing-small; }\n .nb3-ns { margin-bottom: -$spacing-medium; }\n .nb4-ns { margin-bottom: -$spacing-large; }\n .nb5-ns { margin-bottom: -$spacing-extra-large; }\n .nb6-ns { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-ns { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-ns { margin-top: -$spacing-extra-small; }\n .nt2-ns { margin-top: -$spacing-small; }\n .nt3-ns { margin-top: -$spacing-medium; }\n .nt4-ns { margin-top: -$spacing-large; }\n .nt5-ns { margin-top: -$spacing-extra-large; }\n .nt6-ns { margin-top: -$spacing-extra-extra-large; }\n .nt7-ns { margin-top: -$spacing-extra-extra-extra-large; }\n\n}\n\n@media #{$breakpoint-medium} {\n .na1-m { margin: -$spacing-extra-small; }\n .na2-m { margin: -$spacing-small; }\n .na3-m { margin: -$spacing-medium; }\n .na4-m { margin: -$spacing-large; }\n .na5-m { margin: -$spacing-extra-large; }\n .na6-m { margin: -$spacing-extra-extra-large; }\n .na7-m { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-m { margin-left: -$spacing-extra-small; }\n .nl2-m { margin-left: -$spacing-small; }\n .nl3-m { margin-left: -$spacing-medium; }\n .nl4-m { margin-left: -$spacing-large; }\n .nl5-m { margin-left: -$spacing-extra-large; }\n .nl6-m { margin-left: -$spacing-extra-extra-large; }\n .nl7-m { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-m { margin-right: -$spacing-extra-small; }\n .nr2-m { margin-right: -$spacing-small; }\n .nr3-m { margin-right: -$spacing-medium; }\n .nr4-m { margin-right: -$spacing-large; }\n .nr5-m { margin-right: -$spacing-extra-large; }\n .nr6-m { margin-right: -$spacing-extra-extra-large; }\n .nr7-m { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-m { margin-bottom: -$spacing-extra-small; }\n .nb2-m { margin-bottom: -$spacing-small; }\n .nb3-m { margin-bottom: -$spacing-medium; }\n .nb4-m { margin-bottom: -$spacing-large; }\n .nb5-m { margin-bottom: -$spacing-extra-large; }\n .nb6-m { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-m { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-m { margin-top: -$spacing-extra-small; }\n .nt2-m { margin-top: -$spacing-small; }\n .nt3-m { margin-top: -$spacing-medium; }\n .nt4-m { margin-top: -$spacing-large; }\n .nt5-m { margin-top: -$spacing-extra-large; }\n .nt6-m { margin-top: -$spacing-extra-extra-large; }\n .nt7-m { margin-top: -$spacing-extra-extra-extra-large; }\n\n}\n\n@media #{$breakpoint-large} {\n .na1-l { margin: -$spacing-extra-small; }\n .na2-l { margin: -$spacing-small; }\n .na3-l { margin: -$spacing-medium; }\n .na4-l { margin: -$spacing-large; }\n .na5-l { margin: -$spacing-extra-large; }\n .na6-l { margin: -$spacing-extra-extra-large; }\n .na7-l { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-l { margin-left: -$spacing-extra-small; }\n .nl2-l { margin-left: -$spacing-small; }\n .nl3-l { margin-left: -$spacing-medium; }\n .nl4-l { margin-left: -$spacing-large; }\n .nl5-l { margin-left: -$spacing-extra-large; }\n .nl6-l { margin-left: -$spacing-extra-extra-large; }\n .nl7-l { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-l { margin-right: -$spacing-extra-small; }\n .nr2-l { margin-right: -$spacing-small; }\n .nr3-l { margin-right: -$spacing-medium; }\n .nr4-l { margin-right: -$spacing-large; }\n .nr5-l { margin-right: -$spacing-extra-large; }\n .nr6-l { margin-right: -$spacing-extra-extra-large; }\n .nr7-l { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-l { margin-bottom: -$spacing-extra-small; }\n .nb2-l { margin-bottom: -$spacing-small; }\n .nb3-l { margin-bottom: -$spacing-medium; }\n .nb4-l { margin-bottom: -$spacing-large; }\n .nb5-l { margin-bottom: -$spacing-extra-large; }\n .nb6-l { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-l { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-l { margin-top: -$spacing-extra-small; }\n .nt2-l { margin-top: -$spacing-small; }\n .nt3-l { margin-top: -$spacing-medium; }\n .nt4-l { margin-top: -$spacing-large; }\n .nt5-l { margin-top: -$spacing-extra-large; }\n .nt6-l { margin-top: -$spacing-extra-extra-large; }\n .nt7-l { margin-top: -$spacing-extra-extra-extra-large; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TABLES\n Docs: http://tachyons.io/docs/elements/tables/\n\n*/\n\n.collapse {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\n.striped--light-silver:nth-child(odd) {\n background-color: $light-silver;\n}\n\n.striped--moon-gray:nth-child(odd) {\n background-color: $moon-gray;\n}\n\n.striped--light-gray:nth-child(odd) {\n background-color: $light-gray;\n}\n\n.striped--near-white:nth-child(odd) {\n background-color: $near-white;\n}\n\n.stripe-light:nth-child(odd) {\n background-color: $white-10;\n}\n\n.stripe-dark:nth-child(odd) {\n background-color: $black-10;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT DECORATION\n Docs: http://tachyons.io/docs/typography/text-decoration/\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.strike { text-decoration: line-through; }\n.underline { text-decoration: underline; }\n.no-underline { text-decoration: none; }\n\n\n@media #{$breakpoint-not-small} {\n .strike-ns { text-decoration: line-through; }\n .underline-ns { text-decoration: underline; }\n .no-underline-ns { text-decoration: none; }\n}\n\n@media #{$breakpoint-medium} {\n .strike-m { text-decoration: line-through; }\n .underline-m { text-decoration: underline; }\n .no-underline-m { text-decoration: none; }\n}\n\n@media #{$breakpoint-large} {\n .strike-l { text-decoration: line-through; }\n .underline-l { text-decoration: underline; }\n .no-underline-l { text-decoration: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT ALIGN\n Docs: http://tachyons.io/docs/typography/text-align/\n\n Base\n t = text-align\n\n Modifiers\n l = left\n r = right\n c = center\n j = justify\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.tl { text-align: left; }\n.tr { text-align: right; }\n.tc { text-align: center; }\n.tj { text-align: justify; }\n\n@media #{$breakpoint-not-small} {\n .tl-ns { text-align: left; }\n .tr-ns { text-align: right; }\n .tc-ns { text-align: center; }\n .tj-ns { text-align: justify; }\n}\n\n@media #{$breakpoint-medium} {\n .tl-m { text-align: left; }\n .tr-m { text-align: right; }\n .tc-m { text-align: center; }\n .tj-m { text-align: justify; }\n}\n\n@media #{$breakpoint-large} {\n .tl-l { text-align: left; }\n .tr-l { text-align: right; }\n .tc-l { text-align: center; }\n .tj-l { text-align: justify; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT TRANSFORM\n Docs: http://tachyons.io/docs/typography/text-transform/\n\n Base:\n tt = text-transform\n\n Modifiers\n c = capitalize\n l = lowercase\n u = uppercase\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.ttc { text-transform: capitalize; }\n.ttl { text-transform: lowercase; }\n.ttu { text-transform: uppercase; }\n.ttn { text-transform: none; }\n\n@media #{$breakpoint-not-small} {\n .ttc-ns { text-transform: capitalize; }\n .ttl-ns { text-transform: lowercase; }\n .ttu-ns { text-transform: uppercase; }\n .ttn-ns { text-transform: none; }\n}\n\n@media #{$breakpoint-medium} {\n .ttc-m { text-transform: capitalize; }\n .ttl-m { text-transform: lowercase; }\n .ttu-m { text-transform: uppercase; }\n .ttn-m { text-transform: none; }\n}\n\n@media #{$breakpoint-large} {\n .ttc-l { text-transform: capitalize; }\n .ttl-l { text-transform: lowercase; }\n .ttu-l { text-transform: uppercase; }\n .ttn-l { text-transform: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TYPE SCALE\n Docs: http://tachyons.io/docs/typography/scale/\n\n Base:\n f = font-size\n\n Modifiers\n 1 = 1st step in size scale\n 2 = 2nd step in size scale\n 3 = 3rd step in size scale\n 4 = 4th step in size scale\n 5 = 5th step in size scale\n 6 = 6th step in size scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n*/\n\n/*\n * For Hero/Marketing Titles\n *\n * These generally are too large for mobile\n * so be careful using them on smaller screens.\n * */\n\n.f-6,\n.f-headline {\n font-size: $font-size-headline;\n}\n.f-5,\n.f-subheadline {\n font-size: $font-size-subheadline;\n}\n\n\n/* Type Scale */\n\n\n.f1 { font-size: $font-size-1; }\n.f2 { font-size: $font-size-2; }\n.f3 { font-size: $font-size-3; }\n.f4 { font-size: $font-size-4; }\n.f5 { font-size: $font-size-5; }\n.f6 { font-size: $font-size-6; }\n.f7 { font-size: $font-size-7; }\n\n@media #{$breakpoint-not-small}{\n .f-6-ns,\n .f-headline-ns { font-size: $font-size-headline; }\n .f-5-ns,\n .f-subheadline-ns { font-size: $font-size-subheadline; }\n .f1-ns { font-size: $font-size-1; }\n .f2-ns { font-size: $font-size-2; }\n .f3-ns { font-size: $font-size-3; }\n .f4-ns { font-size: $font-size-4; }\n .f5-ns { font-size: $font-size-5; }\n .f6-ns { font-size: $font-size-6; }\n .f7-ns { font-size: $font-size-7; }\n}\n\n@media #{$breakpoint-medium} {\n .f-6-m,\n .f-headline-m { font-size: $font-size-headline; }\n .f-5-m,\n .f-subheadline-m { font-size: $font-size-subheadline; }\n .f1-m { font-size: $font-size-1; }\n .f2-m { font-size: $font-size-2; }\n .f3-m { font-size: $font-size-3; }\n .f4-m { font-size: $font-size-4; }\n .f5-m { font-size: $font-size-5; }\n .f6-m { font-size: $font-size-6; }\n .f7-m { font-size: $font-size-7; }\n}\n\n@media #{$breakpoint-large} {\n .f-6-l,\n .f-headline-l {\n font-size: $font-size-headline;\n }\n .f-5-l,\n .f-subheadline-l {\n font-size: $font-size-subheadline;\n }\n .f1-l { font-size: $font-size-1; }\n .f2-l { font-size: $font-size-2; }\n .f3-l { font-size: $font-size-3; }\n .f4-l { font-size: $font-size-4; }\n .f5-l { font-size: $font-size-5; }\n .f6-l { font-size: $font-size-6; }\n .f7-l { font-size: $font-size-7; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TYPOGRAPHY\n http://tachyons.io/docs/typography/measure/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n/* Measure is limited to ~66 characters */\n.measure {\n max-width: $measure;\n}\n\n/* Measure is limited to ~80 characters */\n.measure-wide {\n max-width: $measure-wide;\n}\n\n/* Measure is limited to ~45 characters */\n.measure-narrow {\n max-width: $measure-narrow;\n}\n\n/* Book paragraph style - paragraphs are indented with no vertical spacing. */\n.indent {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.small-caps {\n font-variant: small-caps;\n}\n\n/* Combine this class with a width to truncate text (or just leave as is to truncate at width of containing element. */\n\n.truncate {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n@media #{$breakpoint-not-small} {\n .measure-ns {\n max-width: $measure;\n }\n .measure-wide-ns {\n max-width: $measure-wide;\n }\n .measure-narrow-ns {\n max-width: $measure-narrow;\n }\n .indent-ns {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-ns {\n font-variant: small-caps;\n }\n .truncate-ns {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n@media #{$breakpoint-medium} {\n .measure-m {\n max-width: $measure;\n }\n .measure-wide-m {\n max-width: $measure-wide;\n }\n .measure-narrow-m {\n max-width: $measure-narrow;\n }\n .indent-m {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-m {\n font-variant: small-caps;\n }\n .truncate-m {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n@media #{$breakpoint-large} {\n .measure-l {\n max-width: $measure;\n }\n .measure-wide-l {\n max-width: $measure-wide;\n }\n .measure-narrow-l {\n max-width: $measure-narrow;\n }\n .indent-l {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-l {\n font-variant: small-caps;\n }\n .truncate-l {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n UTILITIES\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Equivalent to .overflow-y-scroll */\n.overflow-container {\n overflow-y: scroll;\n}\n\n.center {\n margin-right: auto;\n margin-left: auto;\n}\n\n.mr-auto { margin-right: auto; }\n.ml-auto { margin-left: auto; }\n\n@media #{$breakpoint-not-small}{\n .center-ns {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-ns { margin-right: auto; }\n .ml-auto-ns { margin-left: auto; }\n}\n\n@media #{$breakpoint-medium}{\n .center-m {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-m { margin-right: auto; }\n .ml-auto-m { margin-left: auto; }\n}\n\n@media #{$breakpoint-large}{\n .center-l {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-l { margin-right: auto; }\n .ml-auto-l { margin-left: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n VISIBILITY\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n/*\n Text that is hidden but accessible\n Ref: http://snook.ca/archives/html_and_css/hiding-content-for-accessibility\n*/\n\n.clip {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n}\n\n@media #{$breakpoint-not-small} {\n .clip-ns {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n@media #{$breakpoint-medium} {\n .clip-m {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n@media #{$breakpoint-large} {\n .clip-l {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n WHITE SPACE\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n.ws-normal { white-space: normal; }\n.nowrap { white-space: nowrap; }\n.pre { white-space: pre; }\n\n@media #{$breakpoint-not-small} {\n .ws-normal-ns { white-space: normal; }\n .nowrap-ns { white-space: nowrap; }\n .pre-ns { white-space: pre; }\n}\n\n@media #{$breakpoint-medium} {\n .ws-normal-m { white-space: normal; }\n .nowrap-m { white-space: nowrap; }\n .pre-m { white-space: pre; }\n}\n\n@media #{$breakpoint-large} {\n .ws-normal-l { white-space: normal; }\n .nowrap-l { white-space: nowrap; }\n .pre-l { white-space: pre; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n VERTICAL ALIGN\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.v-base { vertical-align: baseline; }\n.v-mid { vertical-align: middle; }\n.v-top { vertical-align: top; }\n.v-btm { vertical-align: bottom; }\n\n@media #{$breakpoint-not-small} {\n .v-base-ns { vertical-align: baseline; }\n .v-mid-ns { vertical-align: middle; }\n .v-top-ns { vertical-align: top; }\n .v-btm-ns { vertical-align: bottom; }\n}\n\n@media #{$breakpoint-medium} {\n .v-base-m { vertical-align: baseline; }\n .v-mid-m { vertical-align: middle; }\n .v-top-m { vertical-align: top; }\n .v-btm-m { vertical-align: bottom; }\n}\n\n@media #{$breakpoint-large} {\n .v-base-l { vertical-align: baseline; }\n .v-mid-l { vertical-align: middle; }\n .v-top-l { vertical-align: top; }\n .v-btm-l { vertical-align: bottom; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n HOVER EFFECTS\n Docs: http://tachyons.io/docs/themes/hovers/\n\n - Dim\n - Glow\n - Hide Child\n - Underline text\n - Grow\n - Pointer\n - Shadow\n\n*/\n\n/*\n\n Dim element on hover by adding the dim class.\n\n*/\n.dim {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n.dim:hover,\n.dim:focus {\n opacity: .5;\n transition: opacity .15s ease-in;\n}\n.dim:active {\n opacity: .8; transition: opacity .15s ease-out;\n}\n\n/*\n\n Animate opacity to 100% on hover by adding the glow class.\n\n*/\n.glow {\n transition: opacity .15s ease-in;\n}\n.glow:hover,\n.glow:focus {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n\n/*\n\n Hide child & reveal on hover:\n\n Put the hide-child class on a parent element and any nested element with the\n child class will be hidden and displayed on hover or focus.\n\n
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
\n*/\n\n.hide-child .child {\n opacity: 0;\n transition: opacity .15s ease-in;\n}\n.hide-child:hover .child,\n.hide-child:focus .child,\n.hide-child:active .child {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n\n.underline-hover:hover,\n.underline-hover:focus {\n text-decoration: underline;\n}\n\n/* Can combine this with overflow-hidden to make background images grow on hover\n * even if you are using background-size: cover */\n\n.grow {\n -moz-osx-font-smoothing: grayscale;\n backface-visibility: hidden;\n transform: translateZ(0);\n transition: transform 0.25s ease-out;\n}\n\n.grow:hover,\n.grow:focus {\n transform: scale(1.05);\n}\n\n.grow:active {\n transform: scale(.90);\n}\n\n.grow-large {\n -moz-osx-font-smoothing: grayscale;\n backface-visibility: hidden;\n transform: translateZ(0);\n transition: transform .25s ease-in-out;\n}\n\n.grow-large:hover,\n.grow-large:focus {\n transform: scale(1.2);\n}\n\n.grow-large:active {\n transform: scale(.95);\n}\n\n/* Add pointer on hover */\n\n.pointer:hover {\n cursor: pointer;\n}\n\n/*\n Add shadow on hover.\n\n Performant box-shadow animation pattern from\n http://tobiasahlin.com/blog/how-to-animate-box-shadow/\n*/\n\n.shadow-hover {\n cursor: pointer;\n position: relative;\n transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);\n}\n\n.shadow-hover::after {\n content: '';\n box-shadow: 0px 0px 16px 2px rgba( 0, 0, 0, .2 );\n border-radius: inherit;\n opacity: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: -1;\n transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);\n}\n\n.shadow-hover:hover::after,\n.shadow-hover:focus::after {\n opacity: 1;\n}\n\n/* Combine with classes in skins and skins-pseudo for\n * many different transition possibilities. */\n\n.bg-animate,\n.bg-animate:hover,\n.bg-animate:focus {\n transition: background-color .15s ease-in-out;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n Z-INDEX\n\n Base\n z = z-index\n\n Modifiers\n -0 = literal value 0\n -1 = literal value 1\n -2 = literal value 2\n -3 = literal value 3\n -4 = literal value 4\n -5 = literal value 5\n -999 = literal value 999\n -9999 = literal value 9999\n\n -max = largest accepted z-index value as integer\n\n -inherit = string value inherit\n -initial = string value initial\n -unset = string value unset\n\n MDN: https://developer.mozilla.org/en/docs/Web/CSS/z-index\n Spec: http://www.w3.org/TR/CSS2/zindex.html\n Articles:\n https://philipwalton.com/articles/what-no-one-told-you-about-z-index/\n\n Tips on extending:\n There might be a time worth using negative z-index values.\n Or if you are using tachyons with another project, you might need to\n adjust these values to suit your needs.\n\n*/\n\n.z-0 { z-index: 0; }\n.z-1 { z-index: 1; }\n.z-2 { z-index: 2; }\n.z-3 { z-index: 3; }\n.z-4 { z-index: 4; }\n.z-5 { z-index: 5; }\n\n.z-999 { z-index: 999; }\n.z-9999 { z-index: 9999; }\n\n.z-max {\n z-index: 2147483647;\n}\n\n.z-inherit { z-index: inherit; }\n.z-initial { z-index: initial; }\n.z-unset { z-index: unset; }\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n NESTED\n Tachyons module for styling nested elements\n that are generated by a cms.\n\n*/\n\n.nested-copy-line-height p,\n.nested-copy-line-height ul,\n.nested-copy-line-height ol {\n line-height: $line-height-copy;\n}\n\n.nested-headline-line-height h1,\n.nested-headline-line-height h2,\n.nested-headline-line-height h3,\n.nested-headline-line-height h4,\n.nested-headline-line-height h5,\n.nested-headline-line-height h6 {\n line-height: $line-height-title;\n}\n\n.nested-list-reset ul,\n.nested-list-reset ol {\n padding-left: 0;\n margin-left: 0;\n list-style-type: none;\n}\n\n.nested-copy-indent p+p {\n text-indent: $letter-spacing-1;\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n}\n\n.nested-copy-seperator p+p {\n margin-top: $spacing-copy-separator;\n}\n\n.nested-img img {\n width: 100%;\n max-width: 100%;\n display: block;\n}\n\n.nested-links a {\n color: $blue;\n transition: color .15s ease-in;\n}\n\n.nested-links a:hover,\n.nested-links a:focus {\n color: $light-blue;\n transition: color .15s ease-in;\n}\n",".wrapper\n{\n width: 100%;\n max-width: 1460px;\n margin: 0 auto;\n padding: 0 20px;\n box-sizing: border-box;\n}\n\n.opblock-tag-section\n{\n display: flex;\n flex-direction: column;\n}\n\n.try-out.btn-group {\n padding: 0;\n display: flex;\n flex: 0.1 2 auto;\n}\n\n.try-out__btn {\n margin-left: 1.25rem;\n}\n\n.opblock-tag\n{\n display: flex;\n align-items: center;\n\n padding: 10px 20px 10px 10px;\n\n cursor: pointer;\n transition: all .2s;\n\n border-bottom: 1px solid rgba($opblock-tag-border-bottom-color, .3);\n\n &:hover\n {\n background: rgba($opblock-tag-background-color-hover,.02);\n }\n}\n\n@mixin method($color)\n{\n border-color: $color;\n background: rgba($color, .1);\n\n .opblock-summary-method\n {\n background: $color;\n }\n\n .opblock-summary\n {\n border-color: $color;\n }\n\n .tab-header .tab-item.active h4 span:after\n {\n background: $color;\n }\n}\n\n\n\n\n.opblock-tag\n{\n font-size: 24px;\n\n margin: 0 0 5px 0;\n\n @include text_headline();\n\n &.no-desc\n {\n span\n {\n flex: 1;\n }\n }\n\n svg\n {\n transition: all .4s;\n }\n\n small\n {\n font-size: 14px;\n font-weight: normal;\n\n flex: 2;\n\n padding: 0 10px;\n\n @include text_body();\n }\n\n >div\n {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n flex: 1 1 150px;\n font-weight: 400;\n }\n\n @media (max-width: 640px) {\n small\n {\n flex: 1;\n }\n\n >div\n {\n flex: 1;\n }\n }\n\n .info__externaldocs\n {\n text-align: right;\n }\n}\n\n.parameter__type\n{\n font-size: 12px;\n\n padding: 5px 0;\n\n @include text_code();\n}\n\n.parameter-controls {\n margin-top: 0.75em;\n}\n\n.examples {\n &__title {\n display: block;\n font-size: 1.1em;\n font-weight: bold;\n margin-bottom: 0.75em;\n }\n\n &__section {\n margin-top: 1.5em;\n }\n &__section-header {\n font-weight: bold;\n font-size: .9rem;\n margin-bottom: .5rem;\n // color: #555;\n }\n}\n\n.examples-select {\n margin-bottom: .75em;\n display: inline-block;\n .examples-select-element {\n width: 100%;\n }\n &__section-label {\n font-weight: bold;\n font-size: .9rem;\n margin-right: .5rem;\n }\n}\n\n.example {\n &__section {\n margin-top: 1.5em;\n }\n &__section-header {\n font-weight: bold;\n font-size: .9rem;\n margin-bottom: .5rem;\n // color: #555;\n }\n}\n\n.view-line-link\n{\n position: relative;\n top: 3px;\n\n width: 20px;\n margin: 0 5px;\n\n cursor: pointer;\n transition: all .5s;\n}\n\n\n\n.opblock\n{\n margin: 0 0 15px 0;\n\n border: 1px solid $opblock-border-color;\n border-radius: 4px;\n box-shadow: 0 0 3px rgba($opblock-box-shadow-color,.19);\n\n .tab-header\n {\n display: flex;\n\n flex: 1;\n\n .tab-item\n {\n padding: 0 40px;\n\n cursor: pointer;\n\n &:first-of-type\n {\n padding: 0 40px 0 0;\n }\n &.active\n {\n h4\n {\n span\n {\n position: relative;\n\n\n &:after\n {\n position: absolute;\n bottom: -15px;\n left: 50%;\n\n width: 120%;\n height: 4px;\n\n content: '';\n transform: translateX(-50%);\n\n background: $opblock-tab-header-tab-item-active-h4-span-after-background-color;\n }\n }\n }\n }\n }\n }\n\n\n &.is-open\n {\n .opblock-summary\n {\n border-bottom: 1px solid $opblock-isopen-summary-border-bottom-color;\n }\n }\n\n .opblock-section-header\n {\n display: flex;\n align-items: center;\n\n padding: 8px 20px;\n\n min-height: 50px;\n\n background: rgba($opblock-isopen-section-header-background-color,.8);\n box-shadow: 0 1px 2px rgba($opblock-isopen-section-header-box-shadow-color,.1);\n\n >label\n {\n font-size: 12px;\n font-weight: bold;\n\n display: flex;\n align-items: center;\n\n margin: 0;\n margin-left: auto;\n\n @include text_headline();\n\n >span\n {\n padding: 0 10px 0 0;\n }\n }\n\n h4\n {\n font-size: 14px;\n\n flex: 1;\n\n margin: 0;\n\n @include text_headline();\n }\n }\n\n .opblock-summary-method\n {\n font-size: 14px;\n font-weight: bold;\n @media (max-width: 768px) {\n font-size: 12px;\n }\n\n min-width: 80px;\n padding: 6px 0;\n\n text-align: center;\n\n border-radius: 3px;\n background: $opblock-summary-method-background-color;\n text-shadow: 0 1px 0 rgba($opblock-summary-method-text-shadow-color,.1);\n\n @include text_headline($opblock-summary-method-font-color);\n }\n\n .opblock-summary-path,\n .opblock-summary-operation-id,\n .opblock-summary-path__deprecated\n {\n font-size: 16px;\n @media (max-width: 768px) {\n font-size: 12px;\n }\n\n\n display: flex;\n align-items: center;\n\n word-break: break-word;\n\n @include text_code();\n\n }\n\n .opblock-summary-path\n {\n flex-shrink: 0;\n }\n\n @media (max-width: 640px) {\n .opblock-summary-path\n {\n flex-shrink: 1;\n max-width: 100%;\n }\n }\n\n .opblock-summary-path__deprecated\n {\n text-decoration: line-through;\n }\n\n .opblock-summary-operation-id\n {\n font-size: 14px;\n }\n\n .opblock-summary-description\n {\n font-size: 13px;\n\n word-break: break-word;\n\n @include text_body();\n }\n\n .opblock-summary-path-description-wrapper\n {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0px 10px;\n\n padding: 0 10px;\n\n width: 100%;\n }\n\n @media (max-width: 550px) {\n .opblock-summary-path-description-wrapper\n {\n flex-direction: column;\n align-items: start;\n }\n }\n\n .opblock-summary\n {\n display: flex;\n align-items: center;\n\n padding: 5px;\n\n cursor: pointer;\n\n .view-line-link\n {\n position: relative;\n top: 2px;\n\n width: 0;\n margin: 0;\n\n cursor: pointer;\n transition: all .5s;\n }\n\n &:hover\n {\n .view-line-link\n {\n width: 18px;\n margin: 0 5px;\n\n &.copy-to-clipboard {\n width: 24px;\n }\n }\n }\n }\n\n\n\n &.opblock-post\n {\n @include method($_color-post);\n }\n\n &.opblock-put\n {\n @include method($_color-put);\n }\n\n &.opblock-delete\n {\n @include method($_color-delete);\n }\n\n &.opblock-get\n {\n @include method($_color-get);\n }\n\n &.opblock-patch\n {\n @include method($_color-patch);\n }\n\n &.opblock-head\n {\n @include method($_color-head);\n }\n\n &.opblock-options\n {\n @include method($_color-options);\n }\n\n &.opblock-deprecated\n {\n opacity: .6;\n\n @include method($_color-disabled);\n }\n\n .opblock-schemes\n {\n padding: 8px 20px;\n\n .schemes-title\n {\n padding: 0 10px 0 0;\n }\n }\n}\n\n.filter\n{\n .operation-filter-input\n {\n width: 100%;\n margin: 20px 0;\n padding: 10px 10px;\n\n border: 2px solid $operational-filter-input-border-color;\n }\n}\n\n.filter, .download-url-wrapper\n{\n .failed\n {\n color: red;\n }\n\n .loading\n {\n color: #aaa;\n }\n}\n\n.model-example {\n margin-top: 1em;\n}\n\n.tab\n{\n display: flex;\n\n padding: 0;\n\n list-style: none;\n\n li\n {\n font-size: 12px;\n\n min-width: 60px;\n padding: 0;\n\n cursor: pointer;\n\n @include text_headline();\n\n &:first-of-type\n {\n position: relative;\n\n padding-left: 0;\n padding-right: 12px;\n\n &:after\n {\n position: absolute;\n top: 0;\n right: 6px;\n\n width: 1px;\n height: 100%;\n\n content: '';\n\n background: rgba($tab-list-item-first-background-color,.2);\n }\n }\n\n &.active\n {\n font-weight: bold;\n }\n\n button.tablinks\n {\n background: none;\n border: 0;\n padding: 0;\n\n color: inherit;\n font-family: inherit;\n font-weight: inherit;\n }\n }\n}\n\n.opblock-description-wrapper,\n.opblock-external-docs-wrapper,\n.opblock-title_normal\n{\n font-size: 12px;\n\n margin: 0 0 5px 0;\n padding: 15px 20px;\n\n @include text_body();\n\n h4\n {\n font-size: 12px;\n\n margin: 0 0 5px 0;\n\n @include text_body();\n }\n\n p\n {\n font-size: 14px;\n\n margin: 0;\n\n @include text_body();\n }\n}\n\n.opblock-external-docs-wrapper {\n h4 {\n padding-left: 0px;\n }\n}\n\n.execute-wrapper\n{\n padding: 20px;\n\n text-align: right;\n\n .btn\n {\n width: 100%;\n padding: 8px 40px;\n }\n}\n\n.body-param-options\n{\n display: flex;\n flex-direction: column;\n\n .body-param-edit\n {\n padding: 10px 0;\n }\n\n label\n {\n padding: 8px 0;\n select\n {\n margin: 3px 0 0 0;\n }\n }\n}\n\n.responses-inner\n{\n padding: 20px;\n\n h5,\n h4\n {\n font-size: 12px;\n\n margin: 10px 0 5px 0;\n\n @include text_body();\n }\n\n .curl\n {\n white-space: normal;\n }\n}\n\n.response-col_status\n{\n font-size: 14px;\n\n @include text_body();\n\n .response-undocumented\n {\n font-size: 11px;\n\n @include text_code($response-col-status-undocumented-font-color);\n }\n}\n\n.response-col_links\n{\n padding-left: 2em;\n max-width: 40em;\n font-size: 14px;\n\n @include text_body();\n\n .response-undocumented\n {\n font-size: 11px;\n\n @include text_code($response-col-links-font-color);\n }\n\n .operation-link\n {\n margin-bottom: 1.5em;\n\n .description\n {\n margin-bottom: 0.5em;\n }\n }\n}\n\n.opblock-body\n{\n .opblock-loading-animation\n {\n display: block;\n margin: 3em;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.opblock-body pre.microlight\n{\n font-size: 12px;\n\n margin: 0;\n padding: 10px;\n\n white-space: pre-wrap;\n word-wrap: break-word;\n word-break: break-all;\n word-break: break-word;\n hyphens: auto;\n\n border-radius: 4px;\n background: $opblock-body-background-color;\n\n overflow-wrap: break-word;\n @include text_code($opblock-body-font-color);\n\n // disabled to have syntax highliting with react-syntax-highlight\n // span\n // {\n // color: $opblock-body-font-color !important;\n // }\n\n .headerline\n {\n display: block;\n }\n}\n\n.highlight-code {\n position: relative;\n\n > .microlight {\n overflow-y: auto;\n max-height: 400px;\n min-height: 6em;\n\n code {\n white-space: pre-wrap !important;\n word-break: break-all;\n }\n }\n}\n.curl-command {\n position: relative;\n}\n\n.download-contents {\n position: absolute;\n bottom: 10px;\n right: 10px;\n background: #7d8293;\n text-align: center;\n padding: 5px;\n border: none;\n border-radius: 4px;\n font-family: sans-serif;\n font-weight: 600;\n color: white;\n font-size: 14px;\n height: 30px;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.scheme-container\n{\n margin: 0 0 20px 0;\n padding: 30px 0;\n\n background: $scheme-container-background-color;\n box-shadow: 0 1px 2px 0 rgba($scheme-container-box-shadow-color,.15);\n\n .schemes\n {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n flex-wrap: wrap;\n\n gap: 10px;\n\n > label\n {\n font-size: 12px;\n font-weight: bold;\n\n display: flex;\n flex-direction: column;\n\n margin: -20px 15px 0 0;\n\n @include text_headline();\n\n select\n {\n min-width: 130px;\n\n text-transform: uppercase;\n }\n }\n\n /* \n Target Authorize Button in schemes wrapper\n This was added here to fix responsiveness issues with the authorize button\n within the schemes wrapper without affecting other instances of it's usage\n */\n .auth-wrapper \n {\n flex: none;\n justify-content: none;\n \n .authorize\n {\n padding-right: 20px;\n margin: 0;\n\n display: flex;\n\n flex-wrap: nowrap;\n }\n }\n }\n}\n\n.loading-container\n{\n padding: 40px 0 60px;\n margin-top: 1em;\n min-height: 1px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n\n .loading\n {\n position: relative;\n\n\n &:after\n {\n font-size: 10px;\n font-weight: bold;\n\n position: absolute;\n top: 50%;\n left: 50%;\n\n content: 'loading';\n transform: translate(-50%,-50%);\n text-transform: uppercase;\n\n @include text_headline();\n }\n\n &:before\n {\n position: absolute;\n top: 50%;\n left: 50%;\n\n display: block;\n\n width: 60px;\n height: 60px;\n margin: -30px -30px;\n\n content: '';\n animation: rotation 1s infinite linear, opacity .5s;\n\n opacity: 1;\n border: 2px solid rgba($loading-container-before-border-color, .1);\n border-top-color: rgba($loading-container-before-border-top-color, .6);\n border-radius: 100%;\n\n backface-visibility: hidden;\n\n @keyframes rotation\n {\n to\n {\n transform: rotate(360deg);\n }\n }\n }\n }\n}\n\n.response-controls {\n padding-top: 1em;\n display: flex;\n}\n\n.response-control-media-type {\n margin-right: 1em;\n\n &--accept-controller {\n select {\n border-color: $response-content-type-controls-accept-header-select-border-color;\n }\n }\n\n &__accept-message {\n color: $response-content-type-controls-accept-header-small-font-color;\n font-size: .7em;\n }\n\n &__title {\n display: block;\n margin-bottom: 0.2em;\n font-size: .7em;\n }\n}\n\n.response-control-examples {\n &__title {\n display: block;\n margin-bottom: 0.2em;\n font-size: .7em;\n }\n}\n\n@keyframes blinker\n{\n 50%\n {\n opacity: 0;\n }\n}\n\n.hidden\n{\n display: none;\n}\n\n.no-margin\n{\n height: auto;\n border: none;\n margin: 0;\n padding: 0;\n}\n\n.float-right\n{\n float: right;\n}\n\n.svg-assets\n{\n position: absolute;\n width: 0;\n height: 0;\n}\n\nsection\n{\n h3\n {\n @include text_headline();\n }\n}\n\na.nostyle {\n text-decoration: inherit;\n color: inherit;\n cursor: pointer;\n display: inline;\n\n &:visited {\n text-decoration: inherit;\n color: inherit;\n cursor: pointer;\n }\n}\n\n.fallback\n{\n padding: 1em;\n color: #aaa;\n}\n\n.version-pragma {\n height: 100%;\n padding: 5em 0px;\n\n &__message {\n display: flex;\n justify-content: center;\n height: 100%;\n font-size: 1.2em;\n text-align: center;\n line-height: 1.5em;\n\n padding: 0px .6em;\n\n > div {\n max-width: 55ch;\n flex: 1;\n }\n\n code {\n background-color: #dedede;\n padding: 4px 4px 2px;\n white-space: pre;\n }\n }\n}\n\n.opblock-link\n{\n font-weight: normal;\n\n &.shown\n {\n font-weight: bold;\n }\n}\n\nspan\n{\n &.token-string\n {\n color: #555;\n }\n\n &.token-not-formatted\n {\n color: #555;\n font-weight: bold;\n }\n}\n",".btn\n{\n font-size: 14px;\n font-weight: bold;\n\n padding: 5px 23px;\n\n transition: all .3s;\n\n border: 2px solid $btn-border-color;\n border-radius: 4px;\n background: transparent;\n box-shadow: 0 1px 2px rgba($btn-box-shadow-color,.1);\n\n @include text_headline();\n\n &.btn-sm\n {\n font-size: 12px;\n padding: 4px 23px;\n }\n\n &[disabled]\n {\n cursor: not-allowed;\n\n opacity: .3;\n }\n\n &:hover\n {\n box-shadow: 0 0 5px rgba($btn-box-shadow-color,.3);\n }\n\n &.cancel\n {\n border-color: $btn-cancel-border-color;\n background-color: $btn-cancel-background-color;\n @include text_headline($btn-cancel-font-color);\n }\n\n &.authorize\n {\n line-height: 1;\n\n display: inline;\n\n color: $btn-authorize-font-color;\n border-color: $btn-authorize-border-color;\n background-color: $btn-authorize-background-color;\n\n span\n {\n float: left;\n\n padding: 4px 20px 0 0;\n }\n\n svg\n {\n fill: $btn-authorize-svg-fill-color;\n }\n }\n\n &.execute\n {\n background-color: $btn-execute-background-color-alt;\n color: $btn-execute-font-color;\n border-color: $btn-execute-border-color;\n }\n}\n\n.btn-group\n{\n display: flex;\n\n padding: 30px;\n\n .btn\n {\n flex: 1;\n\n &:first-child\n {\n border-radius: 4px 0 0 4px;\n }\n\n &:last-child\n {\n border-radius: 0 4px 4px 0;\n }\n }\n}\n\n.authorization__btn\n{\n padding: 0 0 0 10px;\n\n border: none;\n background: none;\n\n .locked\n {\n opacity: 1;\n }\n\n .unlocked\n {\n opacity: .4;\n }\n}\n\n.opblock-summary-control,\n.models-control,\n.model-box-control\n{\n all: inherit;\n flex: 1;\n border-bottom: 0;\n padding: 0;\n cursor: pointer;\n\n &:focus {\n outline: auto;\n }\n}\n\n.expand-methods,\n.expand-operation\n{\n border: none;\n background: none;\n\n svg\n {\n width: 20px;\n height: 20px;\n }\n}\n\n.expand-methods\n{\n padding: 0 10px;\n\n &:hover\n {\n svg\n {\n fill: $expand-methods-svg-fill-color-hover;\n }\n }\n\n svg\n {\n transition: all .3s;\n\n fill: $expand-methods-svg-fill-color;\n }\n}\n\nbutton\n{\n cursor: pointer;\n\n &.invalid\n {\n @include invalidFormElement();\n }\n}\n\n.copy-to-clipboard\n{\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n bottom: 10px;\n right: 100px;\n width: 30px;\n height: 30px;\n background: #7d8293;\n border-radius: 4px;\n border: none;\n\n button\n {\n flex-grow: 1;\n flex-shrink: 1;\n border: none;\n height: 25px;\n background: url(\"data:image/svg+xml, \") center center no-repeat;\n }\n}\n\n.copy-to-clipboard:active\n{\n background: #5e626f;\n}\n\n.opblock-control-arrow\n{\n border: none;\n text-align: center;\n background: none;\n}\n\n// overrides for smaller copy button for curl command\n.curl-command .copy-to-clipboard\n{\n bottom: 5px;\n right: 10px;\n width: 20px;\n height: 20px;\n\n button\n {\n height: 18px;\n }\n}\n\n// overrides for copy to clipboard button\n.opblock .opblock-summary .view-line-link.copy-to-clipboard\n{\n height: 26px;\n position: unset;\n}\n","// - - - - - - - - - - - - - - - - - - -\n// - - _mixins.scss module\n// styles for the _mixins.scss module\n@function calculateRem($size)\n{\n $remSize: $size / 16px;\n @return $remSize * 1rem;\n}\n\n@mixin font-size($size)\n{\n font-size: $size;\n font-size: calculateRem($size);\n}\n\n%clearfix\n{\n &:before,\n &:after\n {\n display: table;\n\n content: ' ';\n }\n &:after\n {\n clear: both;\n }\n}\n\n@mixin size($width, $height: $width)\n{\n width: $width;\n height: $height;\n}\n\n$ease: (\n in-quad: cubic-bezier(.550, .085, .680, .530),\n in-cubic: cubic-bezier(.550, .055, .675, .190),\n in-quart: cubic-bezier(.895, .030, .685, .220),\n in-quint: cubic-bezier(.755, .050, .855, .060),\n in-sine: cubic-bezier(.470, .000, .745, .715),\n in-expo: cubic-bezier(.950, .050, .795, .035),\n in-circ: cubic-bezier(.600, .040, .980, .335),\n in-back: cubic-bezier(.600, -.280, .735, .045),\n out-quad: cubic-bezier(.250, .460, .450, .940),\n out-cubic: cubic-bezier(.215, .610, .355, 1.000),\n out-quart: cubic-bezier(.165, .840, .440, 1.000),\n out-quint: cubic-bezier(.230, 1.000, .320, 1.000),\n out-sine: cubic-bezier(.390, .575, .565, 1.000),\n out-expo: cubic-bezier(.190, 1.000, .220, 1.000),\n out-circ: cubic-bezier(.075, .820, .165, 1.000),\n out-back: cubic-bezier(.175, .885, .320, 1.275),\n in-out-quad: cubic-bezier(.455, .030, .515, .955),\n in-out-cubic: cubic-bezier(.645, .045, .355, 1.000),\n in-out-quart: cubic-bezier(.770, .000, .175, 1.000),\n in-out-quint: cubic-bezier(.860, .000, .070, 1.000),\n in-out-sine: cubic-bezier(.445, .050, .550, .950),\n in-out-expo: cubic-bezier(1.000, .000, .000, 1.000),\n in-out-circ: cubic-bezier(.785, .135, .150, .860),\n in-out-back: cubic-bezier(.680, -.550, .265, 1.550)\n);\n\n@function ease($key)\n{\n @if map-has-key($ease, $key)\n {\n @return map-get($ease, $key);\n }\n\n @warn 'Unkown \\'#{$key}\\' in $ease.';\n @return null;\n}\n\n\n@mixin ease($key)\n{\n transition-timing-function: ease($key);\n}\n\n@mixin text-truncate\n{\n overflow: hidden;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n@mixin aspect-ratio($width, $height)\n{\n position: relative;\n &:before\n {\n display: block;\n\n width: 100%;\n padding-top: ($height / $width) * 100%;\n\n content: '';\n }\n > iframe\n {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n$browser-context: 16;\n\n@function em($pixels, $context: $browser-context)\n{\n @if (unitless($pixels))\n {\n $pixels: $pixels * 1px;\n }\n\n @if (unitless($context))\n {\n $context: $context * 1px;\n }\n\n @return $pixels / $context * 1em;\n}\n\n@mixin maxHeight($height)\n{\n @media (max-height: $height)\n {\n @content;\n }\n}\n\n\n@mixin breakpoint($class)\n{\n @if $class == tablet\n {\n @media (min-width: 768px) and (max-width: 1024px)\n {\n @content;\n }\n }\n\n @else if $class == mobile\n {\n @media (min-width: 320px) and (max-width : 736px)\n {\n @content;\n }\n }\n\n @else if $class == desktop\n {\n @media (min-width: 1400px)\n {\n @content;\n }\n }\n\n @else\n {\n @warn 'Breakpoint mixin supports: tablet, mobile, desktop';\n }\n}\n\n@mixin invalidFormElement() {\n animation: shake .4s 1;\n border-color: $_color-delete;\n background: lighten($_color-delete, 35%);\n}\n","select\n{\n font-size: 14px;\n font-weight: bold;\n\n padding: 5px 40px 5px 10px;\n\n border: 2px solid $form-select-border-color;\n border-radius: 4px;\n background: $form-select-background-color url('data:image/svg+xml, ') right 10px center no-repeat;\n background-size: 20px;\n box-shadow: 0 1px 2px 0 rgba($form-select-box-shadow-color, .25);\n\n @include text_headline();\n appearance: none;\n\n &[multiple]\n {\n margin: 5px 0;\n padding: 5px;\n\n background: $form-select-background-color;\n }\n\n &.invalid {\n @include invalidFormElement();\n }\n}\n\n.opblock-body select\n{\n min-width: 230px;\n @media (max-width: 768px)\n {\n min-width: 180px;\n }\n @media (max-width: 640px)\n {\n width: 100%;\n min-width: 100%;\n }\n}\n\nlabel\n{\n font-size: 12px;\n font-weight: bold;\n\n margin: 0 0 5px 0;\n\n @include text_headline();\n}\n\ninput[type=text],\ninput[type=password],\ninput[type=search],\ninput[type=email],\ninput[type=file]\n{\n line-height: 1;\n\n @media (max-width: 768px) {\n max-width: 175px;\n }\n}\n\n\ninput[type=text],\ninput[type=password],\ninput[type=search],\ninput[type=email],\ninput[type=file],\ntextarea\n{\n min-width: 100px;\n margin: 5px 0;\n padding: 8px 10px;\n\n border: 1px solid $form-input-border-color;\n border-radius: 4px;\n background: $form-input-background-color;\n\n\n &.invalid\n {\n @include invalidFormElement();\n }\n\n}\n\ninput,\ntextarea,\nselect {\n &[disabled] {\n // opacity: 0.85;\n background-color: #fafafa;\n color: #888;\n cursor: not-allowed;\n }\n}\n\nselect[disabled] {\n border-color: #888;\n}\n\ntextarea[disabled] {\n background-color: #41444e;\n color: #fff;\n}\n\n@keyframes shake\n{\n 10%,\n 90%\n {\n transform: translate3d(-1px, 0, 0);\n }\n\n 20%,\n 80%\n {\n transform: translate3d(2px, 0, 0);\n }\n\n 30%,\n 50%,\n 70%\n {\n transform: translate3d(-4px, 0, 0);\n }\n\n 40%,\n 60%\n {\n transform: translate3d(4px, 0, 0);\n }\n}\n\ntextarea\n{\n font-size: 12px;\n\n width: 100%;\n min-height: 280px;\n padding: 10px;\n\n border: none;\n border-radius: 4px;\n outline: none;\n background: rgba($form-textarea-background-color,.8);\n\n @include text_code();\n\n &:focus\n {\n border: 2px solid $form-textarea-focus-border-color;\n }\n\n &.curl\n {\n font-size: 12px;\n\n min-height: 100px;\n margin: 0;\n padding: 10px;\n\n resize: none;\n\n border-radius: 4px;\n background: $form-textarea-curl-background-color;\n\n @include text_code($form-textarea-curl-font-color);\n }\n}\n\n\n.checkbox\n{\n padding: 5px 0 10px;\n\n transition: opacity .5s;\n\n color: $form-checkbox-label-font-color;\n\n label\n {\n display: flex;\n }\n\n p\n {\n font-weight: normal !important;\n font-style: italic;\n\n margin: 0 !important;\n\n @include text_code();\n }\n\n input[type=checkbox]\n {\n display: none;\n\n & + label > .item\n {\n position: relative;\n top: 3px;\n\n display: inline-block;\n\n width: 16px;\n height: 16px;\n margin: 0 8px 0 0;\n padding: 5px;\n\n cursor: pointer;\n\n border-radius: 1px;\n background: $form-checkbox-background-color;\n box-shadow: 0 0 0 2px $form-checkbox-box-shadow-color;\n\n flex: none;\n\n &:active\n {\n transform: scale(.9);\n }\n }\n\n &:checked + label > .item\n {\n background: $form-checkbox-background-color url('data:image/svg+xml, ') center center no-repeat;\n }\n }\n}\n",".dialog-ux\n{\n position: fixed;\n z-index: 9999;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n .backdrop-ux\n {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n background: rgba($dialog-ux-backdrop-background-color,.8);\n }\n\n .modal-ux\n {\n position: absolute;\n z-index: 9999;\n top: 50%;\n left: 50%;\n\n width: 100%;\n min-width: 300px;\n max-width: 650px;\n\n transform: translate(-50%,-50%);\n\n border: 1px solid $dialog-ux-modal-border-color;\n border-radius: 4px;\n background: $dialog-ux-modal-background-color;\n box-shadow: 0 10px 30px 0 rgba($dialog-ux-modal-box-shadow-color,.20);\n }\n\n .modal-ux-content\n {\n overflow-y: auto;\n\n max-height: 540px;\n padding: 20px;\n\n p\n {\n font-size: 12px;\n\n margin: 0 0 5px 0;\n\n color: $dialog-ux-modal-content-font-color;\n\n @include text_body();\n }\n\n h4\n {\n font-size: 18px;\n font-weight: 600;\n\n margin: 15px 0 0 0;\n\n @include text_headline();\n }\n }\n\n .modal-ux-header\n {\n display: flex;\n\n padding: 12px 0;\n\n border-bottom: 1px solid $dialog-ux-modal-header-border-bottom-color;\n\n align-items: center;\n\n .close-modal\n {\n padding: 0 10px;\n\n border: none;\n background: none;\n\n appearance: none;\n }\n\n\n h3\n {\n font-size: 20px;\n font-weight: 600;\n\n margin: 0;\n padding: 0 20px;\n\n flex: 1;\n @include text_headline();\n }\n }\n}\n",".model\n{\n font-size: 12px;\n font-weight: 300;\n\n @include text_code();\n\n .deprecated\n {\n span,\n td\n {\n color: $model-deprecated-font-color !important;\n }\n\n > td:first-of-type {\n text-decoration: line-through;\n }\n }\n &-toggle\n {\n font-size: 10px;\n\n position: relative;\n top: 6px;\n\n display: inline-block;\n\n margin: auto .3em;\n\n cursor: pointer;\n transition: transform .15s ease-in;\n transform: rotate(90deg);\n transform-origin: 50% 50%;\n\n &.collapsed\n {\n transform: rotate(0deg);\n }\n\n &:after\n {\n display: block;\n\n width: 20px;\n height: 20px;\n\n content: '';\n\n background: url('data:image/svg+xml, ') center no-repeat;\n background-size: 100%;\n }\n }\n\n &-jump-to-path\n {\n position: relative;\n\n cursor: pointer;\n\n .view-line-link\n {\n position: absolute;\n top: -.4em;\n\n cursor: pointer;\n }\n }\n\n &-title\n {\n position: relative;\n\n &:hover .model-hint\n {\n visibility: visible;\n }\n }\n\n &-hint\n {\n position: absolute;\n top: -1.8em;\n\n visibility: hidden;\n\n padding: .1em .5em;\n\n white-space: nowrap;\n\n color: $model-hint-font-color;\n border-radius: 4px;\n background: rgba($model-hint-background-color,.7);\n }\n\n p\n {\n margin: 0 0 1em 0;\n }\n\n .property\n {\n color: #999;\n font-style: italic;\n\n &.primitive\n {\n color: #6b6b6b;\n }\n }\n\n .external-docs\n {\n color: #666;\n font-weight: normal;\n }\n}\n\ntable.model\n{\n tr\n {\n &.description\n {\n color: #666;\n font-weight: normal;\n \n td:first-child\n {\n font-weight: bold;\n }\n }\n\n &.property-row\n {\n &.required td:first-child\n {\n font-weight: bold;\n }\n\n td\n {\n vertical-align: top;\n\n &:first-child\n {\n padding-right: 0.2em;\n }\n }\n\n .star\n {\n color: red;\n }\n }\n\n &.extension\n {\n color: #777;\n\n td:last-child\n {\n vertical-align: top;\n }\n }\n\n &.external-docs\n {\n td:first-child\n {\n font-weight: bold;\n }\n }\n\n .renderedMarkdown p:first-child\n {\n margin-top: 0;\n } \n }\n}\n\nsection.models\n{\n margin: 30px 0;\n\n border: 1px solid rgba($section-models-border-color, .3);\n border-radius: 4px;\n\n .pointer\n {\n cursor: pointer;\n }\n\n &.is-open\n {\n padding: 0 0 20px;\n h4\n {\n margin: 0 0 5px 0;\n\n border-bottom: 1px solid rgba($section-models-isopen-h4-border-bottom-color, .3);\n }\n }\n h4\n {\n font-size: 16px;\n\n display: flex;\n align-items: center;\n\n margin: 0;\n padding: 10px 20px 10px 10px;\n\n cursor: pointer;\n transition: all .2s;\n\n @include text_headline($section-models-h4-font-color);\n\n svg\n {\n transition: all .4s;\n }\n\n span\n {\n flex: 1;\n }\n\n &:hover\n {\n background: rgba($section-models-h4-background-color-hover,.02);\n }\n }\n\n h5\n {\n font-size: 16px;\n\n margin: 0 0 10px 0;\n\n @include text_headline($section-models-h5-font-color);\n }\n\n .model-jump-to-path\n {\n position: relative;\n top: 5px;\n }\n\n .model-container\n {\n margin: 0 20px 15px;\n position: relative;\n\n transition: all .5s;\n\n border-radius: 4px;\n background: rgba($section-models-model-container-background-color,.05);\n\n &:hover\n {\n background: rgba($section-models-model-container-background-color,.07);\n }\n\n &:first-of-type\n {\n margin: 20px;\n }\n\n &:last-of-type\n {\n margin: 0 20px;\n }\n\n .models-jump-to-path {\n position: absolute;\n top: 8px;\n right: 5px;\n opacity: 0.65;\n }\n }\n\n .model-box\n {\n background: none;\n }\n}\n\n\n.model-box\n{\n padding: 10px;\n display: inline-block;\n\n border-radius: 4px;\n background: rgba($section-models-model-box-background-color,.1);\n\n .model-jump-to-path\n {\n position: relative;\n top: 4px;\n }\n\n &.deprecated\n {\n opacity: .5;\n }\n}\n\n\n.model-title\n{\n font-size: 16px;\n\n @include text_headline($section-models-model-title-font-color);\n\n img\n {\n margin-left: 1em;\n position: relative;\n bottom: 0px;\n }\n}\n\n.model-deprecated-warning\n{\n font-size: 16px;\n font-weight: 600;\n\n margin-right: 1em;\n\n @include text_headline($_color-delete);\n}\n\n\nspan\n{\n > span.model\n {\n .brace-close\n {\n padding: 0 0 0 10px;\n }\n }\n}\n\n.prop-name\n{\n display: inline-block;\n\n margin-right: 1em;\n}\n\n.prop-type\n{\n color: $prop-type-font-color;\n}\n\n.prop-enum\n{\n display: block;\n}\n.prop-format\n{\n color: $prop-format-font-color;\n}\n",".servers\n{\n > label\n {\n font-size: 12px;\n\n margin: -20px 15px 0 0;\n\n @include text_headline();\n\n select\n {\n min-width: 130px;\n max-width: 100%;\n width: 100%;\n }\n }\n\n h4.message {\n padding-bottom: 2em;\n }\n\n table {\n tr {\n width: 30em;\n }\n td {\n display: inline-block;\n max-width: 15em;\n vertical-align: middle;\n padding-top: 10px;\n padding-bottom: 10px;\n\n &:first-of-type {\n padding-right: 1em;\n }\n\n input {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n .computed-url {\n margin: 2em 0;\n\n code {\n display: inline-block;\n padding: 4px;\n font-size: 16px;\n margin: 0 1em;\n }\n }\n}\n\n.servers-title {\n font-size: 12px;\n font-weight: bold;\n}\n\n.operation-servers {\n h4.message {\n margin-bottom: 2em;\n }\n}\n","table\n{\n width: 100%;\n padding: 0 10px;\n\n border-collapse: collapse;\n\n &.model\n {\n tbody\n {\n tr\n {\n td\n {\n padding: 0;\n\n vertical-align: top;\n\n &:first-of-type\n {\n width: 174px;\n padding: 0 0 0 2em;\n }\n }\n }\n }\n }\n\n &.headers\n {\n td\n {\n font-size: 12px;\n font-weight: 300;\n\n vertical-align: middle;\n\n @include text_code();\n }\n\n .header-example\n {\n color: #999;\n font-style: italic;\n }\n }\n\n tbody\n {\n tr\n {\n td\n {\n padding: 10px 0 0 0;\n\n vertical-align: top;\n\n &:first-of-type\n {\n min-width: 6em;\n padding: 10px 0;\n }\n }\n }\n }\n\n thead\n {\n tr\n {\n th,\n td\n {\n font-size: 12px;\n font-weight: bold;\n\n padding: 12px 0;\n\n text-align: left;\n\n border-bottom: 1px solid rgba($table-thead-td-border-bottom-color, .2);\n\n @include text_body();\n }\n }\n }\n}\n\n.parameters-col_description\n{\n width: 99%; // forces other columns to shrink to their content widths\n margin-bottom: 2em;\n input\n {\n width: 100%;\n max-width: 340px;\n }\n\n select {\n border-width: 1px;\n }\n\n .markdown, .renderedMarkdown {\n p {\n margin: 0;\n }\n }\n}\n\n.parameter__name\n{\n font-size: 16px;\n font-weight: normal;\n\n // hack to give breathing room to the name column\n // TODO: refactor all of this to flexbox\n margin-right: .75em;\n\n @include text_headline();\n\n &.required\n {\n font-weight: bold;\n\n span\n {\n color: red;\n }\n\n &:after\n {\n font-size: 10px;\n\n position: relative;\n top: -6px;\n\n padding: 5px;\n\n content: 'required';\n\n color: rgba($table-parameter-name-required-font-color, .6);\n }\n }\n}\n\n.parameter__in,\n.parameter__extension\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-in-font-color);\n}\n\n.parameter__deprecated\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-deprecated-font-color);\n}\n\n.parameter__empty_value_toggle {\n display: block;\n font-size: 13px;\n padding-top: 5px;\n padding-bottom: 12px;\n\n input {\n margin-right: 7px;\n width: auto;\n }\n\n &.disabled {\n opacity: 0.7;\n }\n}\n\n\n.table-container\n{\n padding: 20px;\n}\n\n\n.response-col_description {\n width: 99%; // forces other columns to shrink to their content widths\n\n .markdown, .renderedMarkdown {\n p {\n margin: 0;\n }\n }\n}\n\n.response-col_links {\n min-width: 6em;\n}\n\n.response__extension\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-in-font-color);\n}\n",".topbar\n{\n padding: 10px 0;\n\n background-color: $topbar-background-color;\n .topbar-wrapper\n {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 10px;\n }\n @media (max-width: 550px) {\n .topbar-wrapper\n {\n flex-direction: column;\n align-items: start;\n }\n }\n\n a\n {\n font-size: 1.5em;\n font-weight: bold;\n\n display: flex;\n align-items: center;\n flex: 1;\n\n max-width: 300px;\n\n text-decoration: none;\n\n @include text_headline($topbar-link-font-color);\n\n span\n {\n margin: 0;\n padding: 0 10px;\n }\n }\n\n .download-url-wrapper\n {\n display: flex;\n flex: 3;\n justify-content: flex-end;\n\n input[type=text]\n {\n width: 100%;\n max-width: 100%;\n margin: 0;\n\n border: 2px solid $topbar-download-url-wrapper-element-border-color;\n border-radius: 4px 0 0 4px;\n outline: none;\n }\n\n .select-label\n {\n display: flex;\n align-items: center;\n\n width: 100%;\n max-width: 600px;\n margin: 0;\n color: #f0f0f0;\n span\n {\n font-size: 16px;\n\n flex: 1;\n\n padding: 0 10px 0 0;\n\n text-align: right;\n }\n\n select\n {\n flex: 2;\n\n width: 100%;\n\n border: 2px solid $topbar-download-url-wrapper-element-border-color;\n outline: none;\n box-shadow: none;\n }\n }\n\n\n .download-url-button\n {\n font-size: 16px;\n font-weight: bold;\n\n padding: 4px 30px;\n\n border: none;\n border-radius: 0 4px 4px 0;\n background: $topbar-download-url-button-background-color;\n\n @include text_headline($topbar-download-url-button-font-color);\n }\n }\n @media (max-width: 550px) {\n .download-url-wrapper\n {\n width: 100%;\n }\n }\n}\n",".info\n{\n margin: 50px 0;\n\n &.failed-config\n { \n max-width: 880px;\n margin-left: auto;\n margin-right: auto;\n text-align: center\n }\n\n hgroup.main\n {\n margin: 0 0 20px 0;\n a\n {\n font-size: 12px;\n }\n }\n pre \n {\n font-size: 14px;\n }\n p, li, table\n {\n font-size: 14px;\n\n @include text_body();\n }\n\n h1, h2, h3, h4, h5\n {\n @include text_body();\n }\n\n a\n {\n font-size: 14px;\n\n transition: all .4s;\n\n @include text_body($info-link-font-color);\n\n &:hover\n {\n color: darken($info-link-font-color-hover, 15%);\n }\n }\n > div\n {\n margin: 0 0 5px 0;\n }\n\n .base-url\n {\n font-size: 12px;\n font-weight: 300 !important;\n\n margin: 0;\n\n @include text_code();\n }\n\n .title\n {\n font-size: 36px;\n\n margin: 0;\n\n @include text_body();\n\n small\n {\n font-size: 10px;\n\n position: relative;\n top: -5px;\n\n display: inline-block;\n\n margin: 0 0 0 5px;\n padding: 2px 4px;\n\n vertical-align: super;\n\n border-radius: 57px;\n background: $info-title-small-background-color;\n \n &.version-stamp\n {\n background-color: #89bf04;\n }\n\n pre\n {\n margin: 0;\n padding: 0;\n\n @include text_headline($info-title-small-pre-font-color);\n }\n }\n }\n}\n",".auth-btn-wrapper\n{\n display: flex;\n\n padding: 10px 0;\n\n justify-content: center;\n\n .btn-done {\n margin-right: 1em;\n }\n}\n\n.auth-wrapper\n{\n display: flex;\n\n flex: 1;\n justify-content: flex-end;\n\n .authorize\n {\n padding-right: 20px;\n margin-left: 10px;\n margin-right: 10px;\n }\n}\n\n.auth-container\n{\n margin: 0 0 10px 0;\n padding: 10px 20px;\n\n border-bottom: 1px solid $auth-container-border-color;\n\n &:last-of-type\n {\n margin: 0;\n padding: 10px 20px;\n\n border: 0;\n }\n\n h4\n {\n margin: 5px 0 15px 0 !important;\n }\n\n .wrapper\n {\n margin: 0;\n padding: 0;\n }\n\n input[type=text],\n input[type=password]\n {\n min-width: 230px;\n }\n\n .errors\n {\n font-size: 12px;\n\n padding: 10px;\n\n border-radius: 4px;\n\n background-color: #ffeeee;\n\n color: red;\n\n margin: 1em;\n\n @include text_code();\n\n b\n {\n text-transform: capitalize;\n margin-right: 1em;\n }\n }\n}\n\n.scopes\n{\n h2\n {\n font-size: 14px;\n\n @include text_headline();\n\n a\n {\n font-size: 12px;\n color: $auth-select-all-none-link-font-color;\n cursor: pointer;\n padding-left: 10px;\n text-decoration: underline;\n }\n }\n}\n\n.scope-def\n{\n padding: 0 0 20px 0;\n}\n",".errors-wrapper\n{\n margin: 20px;\n padding: 10px 20px;\n\n animation: scaleUp .5s;\n\n border: 2px solid $_color-delete;\n border-radius: 4px;\n background: rgba($_color-delete, .1);\n\n .error-wrapper\n {\n margin: 0 0 10px 0;\n }\n\n .errors\n {\n h4\n {\n font-size: 14px;\n\n margin: 0;\n\n @include text_code();\n }\n\n small\n {\n color: $errors-wrapper-errors-small-font-color;\n }\n\n .message\n { \n white-space: pre-line;\n \n &.thrown\n {\n max-width: 100%;\n }\n }\n\n .error-line\n {\n text-decoration: underline;\n cursor: pointer;\n }\n }\n\n hgroup\n {\n display: flex;\n\n align-items: center;\n\n h4\n {\n font-size: 20px;\n\n margin: 0;\n\n flex: 1;\n @include text_headline();\n }\n }\n}\n\n\n@keyframes scaleUp\n{\n 0%\n {\n transform: scale(.8);\n\n opacity: 0;\n }\n 100%\n {\n transform: scale(1);\n\n opacity: 1;\n }\n}\n",".Resizer.vertical.disabled {\n display: none;\n}",".markdown, .renderedMarkdown {\n p, pre {\n margin: 1em auto;\n\n word-break: break-all; /* Fallback trick */\n word-break: break-word;\n }\n pre {\n color: black;\n font-weight: normal;\n white-space: pre-wrap;\n background: none;\n padding: 0px;\n }\n\n code {\n font-size: 14px;\n padding: 5px 7px;\n\n border-radius: 4px;\n background: rgba($info-code-background-color,.05);\n\n @include text_code($info-code-font-color);\n }\n\n pre > code {\n display: block;\n }\n}\n",".json-schema-2020-12 {\n margin: 0 20px 15px 20px;\n border-radius: 4px;\n padding: 12px 0 12px 20px;\n background-color: rgba($section-models-model-container-background-color, .05);\n\n &:first-of-type {\n margin: 20px;\n }\n\n &:last-of-type {\n margin: 0 20px;\n }\n\n &--embedded {\n background-color: inherit;\n padding: 0 inherit 0 inherit;\n }\n\n &-body {\n @include expansion-border;\n margin: 2px 0;\n\n &--collapsed {\n display: none;\n }\n }\n}\n\n\n","@mixin expansion-border {\n margin: 0 0 0 20px;\n border-left: 1px dashed rgba($section-models-model-container-background-color, 0.1);\n}\n\n@import './JSONSchema/json-schema';\n@import './Accordion/accordion';\n@import './ExpandDeepButton/expand-deep-button';\n@import './keywords/all';\n",".json-schema-2020-12-accordion {\n outline: none;\n border: none;\n padding-left: 0;\n\n &__children {\n display: inline-block;\n }\n\n &__icon {\n width: 18px;\n height: 18px;\n display: inline-block;\n vertical-align: bottom;\n\n &--expanded {\n transition: transform .15s ease-in;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n }\n\n &--collapsed {\n transition: transform .15s ease-in;\n transform: rotate(0deg);\n transform-origin: 50% 50%;\n }\n\n & svg {\n height: 20px;\n width: 20px;\n }\n }\n}\n\n",".json-schema-2020-12-expand-deep-button {\n @include text_headline($section-models-model-title-font-color);\n font-size: 12px;\n color: rgb(175, 174, 174);\n border: none;\n padding-right: 0;\n}\n",".json-schema-2020-12-keyword {\n margin: 5px 0 5px 0;\n\n &__children {\n @include expansion-border;\n padding: 0;\n\n &--collapsed {\n display: none;\n }\n }\n\n &__name {\n font-size: 12px;\n margin-left: 20px;\n font-weight: bold;\n\n &--primary {\n color: $text-code-default-font-color;\n font-style: normal;\n }\n\n &--secondary {\n color: #6b6b6b;\n font-style: italic;\n }\n }\n\n &__value {\n color: #6b6b6b;\n font-style: italic;\n font-size: 12px;\n font-weight: normal;\n\n &--primary {\n color: $text-code-default-font-color;\n font-style: normal;\n }\n\n &--secondary {\n color: #6b6b6b;\n font-style: italic;\n }\n\n &--const {\n @include text_code();\n color: #6b6b6b;\n font-style: normal;\n display: inline-block;\n margin-left: 10px;\n line-height: 1.5;\n padding: 1px 4px 1px 4px;\n border: 1px dashed #6b6b6b;\n border-radius: 4px;\n }\n\n &--warning {\n @extend .json-schema-2020-12-keyword__value--const;\n color: red;\n border: 1px dashed red;\n }\n }\n}\n.json-schema-2020-12-keyword__name--secondary + .json-schema-2020-12-keyword__value--secondary::before {\n content: '='\n}\n\n.json-schema-2020-12__attribute {\n font-family: monospace;\n color: $text-code-default-font-color;\n font-size: 12px;\n text-transform: lowercase;\n padding-left: 10px;\n\n &--primary {\n color: $prop-type-font-color;\n }\n\n &--muted {\n color: gray;\n }\n\n &--warning {\n color: red;\n }\n}\n\n@import './$vocabulary/$vocabulary';\n@import './Description/description';\n@import './Title/title';\n@import './Properties/properties';\n@import './PatternProperties/pattern-properties';\n@import './Enum/enum';\n@import './Constraint/constraint';\n@import './DependentRequired/dependent-required';\n",".json-schema-2020-12 {\n &-keyword--\\$vocabulary {\n ul {\n @include expansion-border;\n }\n }\n\n &-\\$vocabulary-uri {\n margin-left: 35px;\n\n &--disabled {\n text-decoration: line-through;\n }\n }\n}\n",".json-schema-2020-12-keyword--description {\n color: #6b6b6b;\n font-size: 12px;\n margin-left: 20px;\n\n & p {\n margin: 0;\n }\n}\n",".json-schema-2020-12 {\n &__title {\n @include text_headline($section-models-model-title-font-color);\n display: inline-block;\n font-weight: bold;\n font-size: 12px;\n line-height: normal;\n\n & .json-schema-2020-12-keyword__name {\n margin: 0;\n }\n }\n\n &-property {\n margin: 7px 0;\n\n .json-schema-2020-12__title {\n @include text_code();\n font-size: 12px;\n vertical-align: middle;\n }\n }\n}\n",".json-schema-2020-12 {\n &-keyword--properties {\n & > ul {\n margin: 0;\n padding: 0;\n border: none;\n }\n }\n\n &-property {\n list-style-type: none;\n\n &--required {\n & > .json-schema-2020-12:first-of-type > .json-schema-2020-12-head .json-schema-2020-12__title:after {\n content: '*';\n color: red;\n font-weight: bold;\n }\n }\n }\n}\n",".json-schema-2020-12 {\n &-keyword--patternProperties {\n ul {\n margin: 0;\n padding: 0;\n border: none;\n }\n\n .json-schema-2020-12__title:first-of-type::before {\n color: $prop-type-font-color;\n content: \"/\";\n }\n\n .json-schema-2020-12__title:first-of-type::after {\n color: $prop-type-font-color;\n content: \"/\";\n }\n }\n}\n",".json-schema-2020-12-keyword--enum {\n & > ul {\n display: inline-block;\n padding: 0;\n margin: 0;\n\n li {\n display: inline;\n list-style-type: none;\n }\n }\n}\n",".json-schema-2020-12__constraint {\n @include text_code();\n margin-left: 10px;\n line-height: 1.5;\n padding: 1px 3px;\n color: white;\n background-color: #805AD5;\n border-radius: 4px;\n\n &--string {\n color: white;\n background-color: #D69E2E;\n }\n}\n",".json-schema-2020-12-keyword--dependentRequired {\n & > ul {\n display: inline-block;\n padding: 0;\n margin: 0;\n\n li {\n display: inline;\n list-style-type: none;\n }\n }\n}\n",".model-box {\n // inferred names of Schema Objects\n & .json-schema-2020-12:not(.json-schema-2020-12--embedded) > .json-schema-2020-12-head .json-schema-2020-12__title:first-of-type {\n font-size: 16px;\n }\n\n & > .json-schema-2020-12 {\n margin: 0;\n }\n\n .json-schema-2020-12 {\n padding: 0;\n background-color: transparent;\n }\n\n .json-schema-2020-12-accordion, .json-schema-2020-12-expand-deep-button {\n background-color: transparent;\n }\n}\n",".models .json-schema-2020-12:not(.json-schema-2020-12--embedded) > .json-schema-2020-12-head .json-schema-2020-12__title:first-of-type {\n font-size: 16px;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/assets/img/data-architecture.png b/docs/assets/img/data-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7767014852b27778e007b3b7286aac295cc69e29 GIT binary patch literal 74665 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 ac?^~Ir_B#3qgT)izjO264fJ)>7ylQn7Yp_P literal 0 HcmV?d00001 diff --git a/docs/assets/img/griptape-mark-square-light.svg b/docs/assets/img/griptape-mark-square-light.svg new file mode 100644 index 000000000..84df06e4f --- /dev/null +++ b/docs/assets/img/griptape-mark-square-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/assets/img/tools/output.png b/docs/assets/img/tools/output.png new file mode 100644 index 0000000000000000000000000000000000000000..a383f5d68eb02957b736da3d7bbb40d74a7ad2c2 GIT binary patch literal 151667 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 literal 0 HcmV?d00001 diff --git a/docs/assets/img/tools/poetry_setup.png b/docs/assets/img/tools/poetry_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..04e3b7551cda2742ab35dca0b888f8efa705ca48 GIT binary patch literal 173909 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/assets/img/tools/toml.png b/docs/assets/img/tools/toml.png new file mode 100644 index 0000000000000000000000000000000000000000..b166dd5b3fb6b7a340366d7d2ea860a34506dba1 GIT binary patch literal 899349 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≫ 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≪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ℜ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

Vw!K#7gJ*Q^8bS3cVq0A#} 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/,{relevance:10}),{begin://,relevance:10},u,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[M],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[M],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:s,relevance:0,starts:M}]},{className:"tag",begin:concat(/<\//,lookahead(concat(s,/>/))),contains:[{className:"name",begin:s,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},54587:i=>{i.exports=function yaml(i){var s="true false yes no null",u="[\\w#;/?:@&=+$,.~*'()[\\]]+",m={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[i.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},v=i.inherit(m,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},j={end:",",endsWithParent:!0,excludeEnd:!0,keywords:s,relevance:0},M={begin:/\{/,end:/\}/,contains:[j],illegal:"\\n",relevance:0},$={begin:"\\[",end:"\\]",contains:[j],illegal:"\\n",relevance:0},W=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+u},{className:"type",begin:"!<"+u+">"},{className:"type",begin:"!"+u},{className:"type",begin:"!!"+u},{className:"meta",begin:"&"+i.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+i.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},i.HASH_COMMENT_MODE,{beginKeywords:s,keywords:{literal:s}},_,{className:"number",begin:i.C_NUMBER_RE+"\\b",relevance:0},M,$,m],X=[...W];return X.pop(),X.push(v),j.contains=X,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:W}}},8679:(i,s,u)=>{"use strict";var m=u(59864),v={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},_={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},j={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},M={};function getStatics(i){return m.isMemo(i)?j:M[i.$$typeof]||v}M[m.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},M[m.Memo]=j;var $=Object.defineProperty,W=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,Y=Object.getOwnPropertyDescriptor,Z=Object.getPrototypeOf,ee=Object.prototype;i.exports=function hoistNonReactStatics(i,s,u){if("string"!=typeof s){if(ee){var m=Z(s);m&&m!==ee&&hoistNonReactStatics(i,m,u)}var v=W(s);X&&(v=v.concat(X(s)));for(var j=getStatics(i),M=getStatics(s),ie=0;ie{s.read=function(i,s,u,m,v){var _,j,M=8*v-m-1,$=(1<>1,X=-7,Y=u?v-1:0,Z=u?-1:1,ee=i[s+Y];for(Y+=Z,_=ee&(1<<-X)-1,ee>>=-X,X+=M;X>0;_=256*_+i[s+Y],Y+=Z,X-=8);for(j=_&(1<<-X)-1,_>>=-X,X+=m;X>0;j=256*j+i[s+Y],Y+=Z,X-=8);if(0===_)_=1-W;else{if(_===$)return j?NaN:1/0*(ee?-1:1);j+=Math.pow(2,m),_-=W}return(ee?-1:1)*j*Math.pow(2,_-m)},s.write=function(i,s,u,m,v,_){var j,M,$,W=8*_-v-1,X=(1<>1,Z=23===v?Math.pow(2,-24)-Math.pow(2,-77):0,ee=m?0:_-1,ie=m?1:-1,ae=s<0||0===s&&1/s<0?1:0;for(s=Math.abs(s),isNaN(s)||s===1/0?(M=isNaN(s)?1:0,j=X):(j=Math.floor(Math.log(s)/Math.LN2),s*($=Math.pow(2,-j))<1&&(j--,$*=2),(s+=j+Y>=1?Z/$:Z*Math.pow(2,1-Y))*$>=2&&(j++,$/=2),j+Y>=X?(M=0,j=X):j+Y>=1?(M=(s*$-1)*Math.pow(2,v),j+=Y):(M=s*Math.pow(2,Y-1)*Math.pow(2,v),j=0));v>=8;i[u+ee]=255&M,ee+=ie,M/=256,v-=8);for(j=j<0;i[u+ee]=255&j,ee+=ie,j/=256,W-=8);i[u+ee-ie]|=128*ae}},43393:function(i){i.exports=function(){"use strict";var i=Array.prototype.slice;function createClass(i,s){s&&(i.prototype=Object.create(s.prototype)),i.prototype.constructor=i}function Iterable(i){return isIterable(i)?i:Seq(i)}function KeyedIterable(i){return isKeyed(i)?i:KeyedSeq(i)}function IndexedIterable(i){return isIndexed(i)?i:IndexedSeq(i)}function SetIterable(i){return isIterable(i)&&!isAssociative(i)?i:SetSeq(i)}function isIterable(i){return!(!i||!i[s])}function isKeyed(i){return!(!i||!i[u])}function isIndexed(i){return!(!i||!i[m])}function isAssociative(i){return isKeyed(i)||isIndexed(i)}function isOrdered(i){return!(!i||!i[v])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var s="@@__IMMUTABLE_ITERABLE__@@",u="@@__IMMUTABLE_KEYED__@@",m="@@__IMMUTABLE_INDEXED__@@",v="@@__IMMUTABLE_ORDERED__@@",_="delete",j=5,M=1<>>0;if(""+u!==s||4294967295===u)return NaN;s=u}return s<0?ensureSize(i)+s:s}function returnTrue(){return!0}function wholeSlice(i,s,u){return(0===i||void 0!==u&&i<=-u)&&(void 0===s||void 0!==u&&s>=u)}function resolveBegin(i,s){return resolveIndex(i,s,0)}function resolveEnd(i,s){return resolveIndex(i,s,s)}function resolveIndex(i,s,u){return void 0===i?u:i<0?Math.max(0,s+i):void 0===s?i:Math.min(s,i)}var Z=0,ee=1,ie=2,ae="function"==typeof Symbol&&Symbol.iterator,le="@@iterator",ce=ae||le;function Iterator(i){this.next=i}function iteratorValue(i,s,u,m){var v=0===i?s:1===i?u:[s,u];return m?m.value=v:m={value:v,done:!1},m}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(i){return!!getIteratorFn(i)}function isIterator(i){return i&&"function"==typeof i.next}function getIterator(i){var s=getIteratorFn(i);return s&&s.call(i)}function getIteratorFn(i){var s=i&&(ae&&i[ae]||i[le]);if("function"==typeof s)return s}function isArrayLike(i){return i&&"number"==typeof i.length}function Seq(i){return null==i?emptySequence():isIterable(i)?i.toSeq():seqFromValue(i)}function KeyedSeq(i){return null==i?emptySequence().toKeyedSeq():isIterable(i)?isKeyed(i)?i.toSeq():i.fromEntrySeq():keyedSeqFromValue(i)}function IndexedSeq(i){return null==i?emptySequence():isIterable(i)?isKeyed(i)?i.entrySeq():i.toIndexedSeq():indexedSeqFromValue(i)}function SetSeq(i){return(null==i?emptySequence():isIterable(i)?isKeyed(i)?i.entrySeq():i:indexedSeqFromValue(i)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=Z,Iterator.VALUES=ee,Iterator.ENTRIES=ie,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[ce]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(i,s){return seqIterate(this,i,s,!0)},Seq.prototype.__iterator=function(i,s){return seqIterator(this,i,s,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(i,s){return seqIterate(this,i,s,!1)},IndexedSeq.prototype.__iterator=function(i,s){return seqIterator(this,i,s,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var pe,de,fe,ye="@@__IMMUTABLE_SEQ__@@";function ArraySeq(i){this._array=i,this.size=i.length}function ObjectSeq(i){var s=Object.keys(i);this._object=i,this._keys=s,this.size=s.length}function IterableSeq(i){this._iterable=i,this.size=i.length||i.size}function IteratorSeq(i){this._iterator=i,this._iteratorCache=[]}function isSeq(i){return!(!i||!i[ye])}function emptySequence(){return pe||(pe=new ArraySeq([]))}function keyedSeqFromValue(i){var s=Array.isArray(i)?new ArraySeq(i).fromEntrySeq():isIterator(i)?new IteratorSeq(i).fromEntrySeq():hasIterator(i)?new IterableSeq(i).fromEntrySeq():"object"==typeof i?new ObjectSeq(i):void 0;if(!s)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+i);return s}function indexedSeqFromValue(i){var s=maybeIndexedSeqFromValue(i);if(!s)throw new TypeError("Expected Array or iterable object of values: "+i);return s}function seqFromValue(i){var s=maybeIndexedSeqFromValue(i)||"object"==typeof i&&new ObjectSeq(i);if(!s)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+i);return s}function maybeIndexedSeqFromValue(i){return isArrayLike(i)?new ArraySeq(i):isIterator(i)?new IteratorSeq(i):hasIterator(i)?new IterableSeq(i):void 0}function seqIterate(i,s,u,m){var v=i._cache;if(v){for(var _=v.length-1,j=0;j<=_;j++){var M=v[u?_-j:j];if(!1===s(M[1],m?M[0]:j,i))return j+1}return j}return i.__iterateUncached(s,u)}function seqIterator(i,s,u,m){var v=i._cache;if(v){var _=v.length-1,j=0;return new Iterator((function(){var i=v[u?_-j:j];return j++>_?iteratorDone():iteratorValue(s,m?i[0]:j-1,i[1])}))}return i.__iteratorUncached(s,u)}function fromJS(i,s){return s?fromJSWith(s,i,"",{"":i}):fromJSDefault(i)}function fromJSWith(i,s,u,m){return Array.isArray(s)?i.call(m,u,IndexedSeq(s).map((function(u,m){return fromJSWith(i,u,m,s)}))):isPlainObj(s)?i.call(m,u,KeyedSeq(s).map((function(u,m){return fromJSWith(i,u,m,s)}))):s}function fromJSDefault(i){return Array.isArray(i)?IndexedSeq(i).map(fromJSDefault).toList():isPlainObj(i)?KeyedSeq(i).map(fromJSDefault).toMap():i}function isPlainObj(i){return i&&(i.constructor===Object||void 0===i.constructor)}function is(i,s){if(i===s||i!=i&&s!=s)return!0;if(!i||!s)return!1;if("function"==typeof i.valueOf&&"function"==typeof s.valueOf){if((i=i.valueOf())===(s=s.valueOf())||i!=i&&s!=s)return!0;if(!i||!s)return!1}return!("function"!=typeof i.equals||"function"!=typeof s.equals||!i.equals(s))}function deepEqual(i,s){if(i===s)return!0;if(!isIterable(s)||void 0!==i.size&&void 0!==s.size&&i.size!==s.size||void 0!==i.__hash&&void 0!==s.__hash&&i.__hash!==s.__hash||isKeyed(i)!==isKeyed(s)||isIndexed(i)!==isIndexed(s)||isOrdered(i)!==isOrdered(s))return!1;if(0===i.size&&0===s.size)return!0;var u=!isAssociative(i);if(isOrdered(i)){var m=i.entries();return s.every((function(i,s){var v=m.next().value;return v&&is(v[1],i)&&(u||is(v[0],s))}))&&m.next().done}var v=!1;if(void 0===i.size)if(void 0===s.size)"function"==typeof i.cacheResult&&i.cacheResult();else{v=!0;var _=i;i=s,s=_}var j=!0,M=s.__iterate((function(s,m){if(u?!i.has(s):v?!is(s,i.get(m,W)):!is(i.get(m,W),s))return j=!1,!1}));return j&&i.size===M}function Repeat(i,s){if(!(this instanceof Repeat))return new Repeat(i,s);if(this._value=i,this.size=void 0===s?1/0:Math.max(0,s),0===this.size){if(de)return de;de=this}}function invariant(i,s){if(!i)throw new Error(s)}function Range(i,s,u){if(!(this instanceof Range))return new Range(i,s,u);if(invariant(0!==u,"Cannot step a Range by 0"),i=i||0,void 0===s&&(s=1/0),u=void 0===u?1:Math.abs(u),sm?iteratorDone():iteratorValue(i,v,u[s?m-v++:v++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(i,s){return void 0===s||this.has(i)?this._object[i]:s},ObjectSeq.prototype.has=function(i){return this._object.hasOwnProperty(i)},ObjectSeq.prototype.__iterate=function(i,s){for(var u=this._object,m=this._keys,v=m.length-1,_=0;_<=v;_++){var j=m[s?v-_:_];if(!1===i(u[j],j,this))return _+1}return _},ObjectSeq.prototype.__iterator=function(i,s){var u=this._object,m=this._keys,v=m.length-1,_=0;return new Iterator((function(){var j=m[s?v-_:_];return _++>v?iteratorDone():iteratorValue(i,j,u[j])}))},ObjectSeq.prototype[v]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(i,s){if(s)return this.cacheResult().__iterate(i,s);var u=getIterator(this._iterable),m=0;if(isIterator(u))for(var v;!(v=u.next()).done&&!1!==i(v.value,m++,this););return m},IterableSeq.prototype.__iteratorUncached=function(i,s){if(s)return this.cacheResult().__iterator(i,s);var u=getIterator(this._iterable);if(!isIterator(u))return new Iterator(iteratorDone);var m=0;return new Iterator((function(){var s=u.next();return s.done?s:iteratorValue(i,m++,s.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(i,s){if(s)return this.cacheResult().__iterate(i,s);for(var u,m=this._iterator,v=this._iteratorCache,_=0;_=m.length){var s=u.next();if(s.done)return s;m[v]=s.value}return iteratorValue(i,v,m[v++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(i,s){return this.has(i)?this._value:s},Repeat.prototype.includes=function(i){return is(this._value,i)},Repeat.prototype.slice=function(i,s){var u=this.size;return wholeSlice(i,s,u)?this:new Repeat(this._value,resolveEnd(s,u)-resolveBegin(i,u))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(i){return is(this._value,i)?0:-1},Repeat.prototype.lastIndexOf=function(i){return is(this._value,i)?this.size:-1},Repeat.prototype.__iterate=function(i,s){for(var u=0;u=0&&s=0&&uu?iteratorDone():iteratorValue(i,_++,j)}))},Range.prototype.equals=function(i){return i instanceof Range?this._start===i._start&&this._end===i._end&&this._step===i._step:deepEqual(this,i)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var be="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(i,s){var u=65535&(i|=0),m=65535&(s|=0);return u*m+((i>>>16)*m+u*(s>>>16)<<16>>>0)|0};function smi(i){return i>>>1&1073741824|3221225471&i}function hash(i){if(!1===i||null==i)return 0;if("function"==typeof i.valueOf&&(!1===(i=i.valueOf())||null==i))return 0;if(!0===i)return 1;var s=typeof i;if("number"===s){if(i!=i||i===1/0)return 0;var u=0|i;for(u!==i&&(u^=4294967295*i);i>4294967295;)u^=i/=4294967295;return smi(u)}if("string"===s)return i.length>Te?cachedHashString(i):hashString(i);if("function"==typeof i.hashCode)return i.hashCode();if("object"===s)return hashJSObj(i);if("function"==typeof i.toString)return hashString(i.toString());throw new Error("Value type "+s+" cannot be hashed.")}function cachedHashString(i){var s=ze[i];return void 0===s&&(s=hashString(i),qe===Re&&(qe=0,ze={}),qe++,ze[i]=s),s}function hashString(i){for(var s=0,u=0;u0)switch(i.nodeType){case 1:return i.uniqueID;case 9:return i.documentElement&&i.documentElement.uniqueID}}var Se,xe="function"==typeof WeakMap;xe&&(Se=new WeakMap);var Ie=0,Pe="__immutablehash__";"function"==typeof Symbol&&(Pe=Symbol(Pe));var Te=16,Re=255,qe=0,ze={};function assertNotInfinite(i){invariant(i!==1/0,"Cannot perform this action with an infinite size.")}function Map(i){return null==i?emptyMap():isMap(i)&&!isOrdered(i)?i:emptyMap().withMutations((function(s){var u=KeyedIterable(i);assertNotInfinite(u.size),u.forEach((function(i,u){return s.set(u,i)}))}))}function isMap(i){return!(!i||!i[We])}createClass(Map,KeyedCollection),Map.of=function(){var s=i.call(arguments,0);return emptyMap().withMutations((function(i){for(var u=0;u=s.length)throw new Error("Missing value for key: "+s[u]);i.set(s[u],s[u+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(i,s){return this._root?this._root.get(0,void 0,i,s):s},Map.prototype.set=function(i,s){return updateMap(this,i,s)},Map.prototype.setIn=function(i,s){return this.updateIn(i,W,(function(){return s}))},Map.prototype.remove=function(i){return updateMap(this,i,W)},Map.prototype.deleteIn=function(i){return this.updateIn(i,(function(){return W}))},Map.prototype.update=function(i,s,u){return 1===arguments.length?i(this):this.updateIn([i],s,u)},Map.prototype.updateIn=function(i,s,u){u||(u=s,s=void 0);var m=updateInDeepMap(this,forceIterator(i),s,u);return m===W?void 0:m},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(s){return mergeIntoMapWith(this,s,i.call(arguments,1))},Map.prototype.mergeIn=function(s){var u=i.call(arguments,1);return this.updateIn(s,emptyMap(),(function(i){return"function"==typeof i.merge?i.merge.apply(i,u):u[u.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(s){var u=i.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(s),u)},Map.prototype.mergeDeepIn=function(s){var u=i.call(arguments,1);return this.updateIn(s,emptyMap(),(function(i){return"function"==typeof i.mergeDeep?i.mergeDeep.apply(i,u):u[u.length-1]}))},Map.prototype.sort=function(i){return OrderedMap(sortFactory(this,i))},Map.prototype.sortBy=function(i,s){return OrderedMap(sortFactory(this,s,i))},Map.prototype.withMutations=function(i){var s=this.asMutable();return i(s),s.wasAltered()?s.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(i,s){return new MapIterator(this,i,s)},Map.prototype.__iterate=function(i,s){var u=this,m=0;return this._root&&this._root.iterate((function(s){return m++,i(s[1],s[0],u)}),s),m},Map.prototype.__ensureOwner=function(i){return i===this.__ownerID?this:i?makeMap(this.size,this._root,i,this.__hash):(this.__ownerID=i,this.__altered=!1,this)},Map.isMap=isMap;var Ve,We="@@__IMMUTABLE_MAP__@@",He=Map.prototype;function ArrayMapNode(i,s){this.ownerID=i,this.entries=s}function BitmapIndexedNode(i,s,u){this.ownerID=i,this.bitmap=s,this.nodes=u}function HashArrayMapNode(i,s,u){this.ownerID=i,this.count=s,this.nodes=u}function HashCollisionNode(i,s,u){this.ownerID=i,this.keyHash=s,this.entries=u}function ValueNode(i,s,u){this.ownerID=i,this.keyHash=s,this.entry=u}function MapIterator(i,s,u){this._type=s,this._reverse=u,this._stack=i._root&&mapIteratorFrame(i._root)}function mapIteratorValue(i,s){return iteratorValue(i,s[0],s[1])}function mapIteratorFrame(i,s){return{node:i,index:0,__prev:s}}function makeMap(i,s,u,m){var v=Object.create(He);return v.size=i,v._root=s,v.__ownerID=u,v.__hash=m,v.__altered=!1,v}function emptyMap(){return Ve||(Ve=makeMap(0))}function updateMap(i,s,u){var m,v;if(i._root){var _=MakeRef(X),j=MakeRef(Y);if(m=updateNode(i._root,i.__ownerID,0,void 0,s,u,_,j),!j.value)return i;v=i.size+(_.value?u===W?-1:1:0)}else{if(u===W)return i;v=1,m=new ArrayMapNode(i.__ownerID,[[s,u]])}return i.__ownerID?(i.size=v,i._root=m,i.__hash=void 0,i.__altered=!0,i):m?makeMap(v,m):emptyMap()}function updateNode(i,s,u,m,v,_,j,M){return i?i.update(s,u,m,v,_,j,M):_===W?i:(SetRef(M),SetRef(j),new ValueNode(s,m,[v,_]))}function isLeafNode(i){return i.constructor===ValueNode||i.constructor===HashCollisionNode}function mergeIntoNode(i,s,u,m,v){if(i.keyHash===m)return new HashCollisionNode(s,m,[i.entry,v]);var _,M=(0===u?i.keyHash:i.keyHash>>>u)&$,W=(0===u?m:m>>>u)&$;return new BitmapIndexedNode(s,1<>>=1)j[$]=1&u?s[_++]:void 0;return j[m]=v,new HashArrayMapNode(i,_+1,j)}function mergeIntoMapWith(i,s,u){for(var m=[],v=0;v>1&1431655765))+(i>>2&858993459))+(i>>4)&252645135,i+=i>>8,127&(i+=i>>16)}function setIn(i,s,u,m){var v=m?i:arrCopy(i);return v[s]=u,v}function spliceIn(i,s,u,m){var v=i.length+1;if(m&&s+1===v)return i[s]=u,i;for(var _=new Array(v),j=0,M=0;M=Xe)return createNodes(i,$,m,v);var ee=i&&i===this.ownerID,ie=ee?$:arrCopy($);return Z?M?X===Y-1?ie.pop():ie[X]=ie.pop():ie[X]=[m,v]:ie.push([m,v]),ee?(this.entries=ie,this):new ArrayMapNode(i,ie)}},BitmapIndexedNode.prototype.get=function(i,s,u,m){void 0===s&&(s=hash(u));var v=1<<((0===i?s:s>>>i)&$),_=this.bitmap;return 0==(_&v)?m:this.nodes[popCount(_&v-1)].get(i+j,s,u,m)},BitmapIndexedNode.prototype.update=function(i,s,u,m,v,_,M){void 0===u&&(u=hash(m));var X=(0===s?u:u>>>s)&$,Y=1<=Ye)return expandNodes(i,ae,Z,X,ce);if(ee&&!ce&&2===ae.length&&isLeafNode(ae[1^ie]))return ae[1^ie];if(ee&&ce&&1===ae.length&&isLeafNode(ce))return ce;var pe=i&&i===this.ownerID,de=ee?ce?Z:Z^Y:Z|Y,fe=ee?ce?setIn(ae,ie,ce,pe):spliceOut(ae,ie,pe):spliceIn(ae,ie,ce,pe);return pe?(this.bitmap=de,this.nodes=fe,this):new BitmapIndexedNode(i,de,fe)},HashArrayMapNode.prototype.get=function(i,s,u,m){void 0===s&&(s=hash(u));var v=(0===i?s:s>>>i)&$,_=this.nodes[v];return _?_.get(i+j,s,u,m):m},HashArrayMapNode.prototype.update=function(i,s,u,m,v,_,M){void 0===u&&(u=hash(m));var X=(0===s?u:u>>>s)&$,Y=v===W,Z=this.nodes,ee=Z[X];if(Y&&!ee)return this;var ie=updateNode(ee,i,s+j,u,m,v,_,M);if(ie===ee)return this;var ae=this.count;if(ee){if(!ie&&--ae0&&m=0&&i>>s&$;if(m>=this.array.length)return new VNode([],i);var v,_=0===m;if(s>0){var M=this.array[m];if((v=M&&M.removeBefore(i,s-j,u))===M&&_)return this}if(_&&!v)return this;var W=editableVNode(this,i);if(!_)for(var X=0;X>>s&$;if(v>=this.array.length)return this;if(s>0){var _=this.array[v];if((m=_&&_.removeAfter(i,s-j,u))===_&&v===this.array.length-1)return this}var M=editableVNode(this,i);return M.array.splice(v+1),m&&(M.array[v]=m),M};var rt,nt,ot={};function iterateList(i,s){var u=i._origin,m=i._capacity,v=getTailOffset(m),_=i._tail;return iterateNodeOrLeaf(i._root,i._level,0);function iterateNodeOrLeaf(i,s,u){return 0===s?iterateLeaf(i,u):iterateNode(i,s,u)}function iterateLeaf(i,j){var $=j===v?_&&_.array:i&&i.array,W=j>u?0:u-j,X=m-j;return X>M&&(X=M),function(){if(W===X)return ot;var i=s?--X:W++;return $&&$[i]}}function iterateNode(i,v,_){var $,W=i&&i.array,X=_>u?0:u-_>>v,Y=1+(m-_>>v);return Y>M&&(Y=M),function(){for(;;){if($){var i=$();if(i!==ot)return i;$=null}if(X===Y)return ot;var u=s?--Y:X++;$=iterateNodeOrLeaf(W&&W[u],v-j,_+(u<=i.size||s<0)return i.withMutations((function(i){s<0?setListBounds(i,s).set(0,u):setListBounds(i,0,s+1).set(s,u)}));s+=i._origin;var m=i._tail,v=i._root,_=MakeRef(Y);return s>=getTailOffset(i._capacity)?m=updateVNode(m,i.__ownerID,0,s,u,_):v=updateVNode(v,i.__ownerID,i._level,s,u,_),_.value?i.__ownerID?(i._root=v,i._tail=m,i.__hash=void 0,i.__altered=!0,i):makeList(i._origin,i._capacity,i._level,v,m):i}function updateVNode(i,s,u,m,v,_){var M,W=m>>>u&$,X=i&&W0){var Y=i&&i.array[W],Z=updateVNode(Y,s,u-j,m,v,_);return Z===Y?i:((M=editableVNode(i,s)).array[W]=Z,M)}return X&&i.array[W]===v?i:(SetRef(_),M=editableVNode(i,s),void 0===v&&W===M.array.length-1?M.array.pop():M.array[W]=v,M)}function editableVNode(i,s){return s&&i&&s===i.ownerID?i:new VNode(i?i.array.slice():[],s)}function listNodeFor(i,s){if(s>=getTailOffset(i._capacity))return i._tail;if(s<1<0;)u=u.array[s>>>m&$],m-=j;return u}}function setListBounds(i,s,u){void 0!==s&&(s|=0),void 0!==u&&(u|=0);var m=i.__ownerID||new OwnerID,v=i._origin,_=i._capacity,M=v+s,W=void 0===u?_:u<0?_+u:v+u;if(M===v&&W===_)return i;if(M>=W)return i.clear();for(var X=i._level,Y=i._root,Z=0;M+Z<0;)Y=new VNode(Y&&Y.array.length?[void 0,Y]:[],m),Z+=1<<(X+=j);Z&&(M+=Z,v+=Z,W+=Z,_+=Z);for(var ee=getTailOffset(_),ie=getTailOffset(W);ie>=1<ee?new VNode([],m):ae;if(ae&&ie>ee&&M<_&&ae.array.length){for(var ce=Y=editableVNode(Y,m),pe=X;pe>j;pe-=j){var de=ee>>>pe&$;ce=ce.array[de]=editableVNode(ce.array[de],m)}ce.array[ee>>>j&$]=ae}if(W<_&&(le=le&&le.removeAfter(m,0,W)),M>=ie)M-=ie,W-=ie,X=j,Y=null,le=le&&le.removeBefore(m,0,M);else if(M>v||ie>>X&$;if(fe!==ie>>>X&$)break;fe&&(Z+=(1<v&&(Y=Y.removeBefore(m,X,M-Z)),Y&&iev&&(v=M.size),isIterable(j)||(M=M.map((function(i){return fromJS(i)}))),m.push(M)}return v>i.size&&(i=i.setSize(v)),mergeIntoCollectionWith(i,s,m)}function getTailOffset(i){return i>>j<=M&&j.size>=2*_.size?(m=(v=j.filter((function(i,s){return void 0!==i&&$!==s}))).toKeyedSeq().map((function(i){return i[0]})).flip().toMap(),i.__ownerID&&(m.__ownerID=v.__ownerID=i.__ownerID)):(m=_.remove(s),v=$===j.size-1?j.pop():j.set($,void 0))}else if(X){if(u===j.get($)[1])return i;m=_,v=j.set($,[s,u])}else m=_.set(s,j.size),v=j.set(j.size,[s,u]);return i.__ownerID?(i.size=m.size,i._map=m,i._list=v,i.__hash=void 0,i):makeOrderedMap(m,v)}function ToKeyedSequence(i,s){this._iter=i,this._useKeys=s,this.size=i.size}function ToIndexedSequence(i){this._iter=i,this.size=i.size}function ToSetSequence(i){this._iter=i,this.size=i.size}function FromEntriesSequence(i){this._iter=i,this.size=i.size}function flipFactory(i){var s=makeSequence(i);return s._iter=i,s.size=i.size,s.flip=function(){return i},s.reverse=function(){var s=i.reverse.apply(this);return s.flip=function(){return i.reverse()},s},s.has=function(s){return i.includes(s)},s.includes=function(s){return i.has(s)},s.cacheResult=cacheResultThrough,s.__iterateUncached=function(s,u){var m=this;return i.__iterate((function(i,u){return!1!==s(u,i,m)}),u)},s.__iteratorUncached=function(s,u){if(s===ie){var m=i.__iterator(s,u);return new Iterator((function(){var i=m.next();if(!i.done){var s=i.value[0];i.value[0]=i.value[1],i.value[1]=s}return i}))}return i.__iterator(s===ee?Z:ee,u)},s}function mapFactory(i,s,u){var m=makeSequence(i);return m.size=i.size,m.has=function(s){return i.has(s)},m.get=function(m,v){var _=i.get(m,W);return _===W?v:s.call(u,_,m,i)},m.__iterateUncached=function(m,v){var _=this;return i.__iterate((function(i,v,j){return!1!==m(s.call(u,i,v,j),v,_)}),v)},m.__iteratorUncached=function(m,v){var _=i.__iterator(ie,v);return new Iterator((function(){var v=_.next();if(v.done)return v;var j=v.value,M=j[0];return iteratorValue(m,M,s.call(u,j[1],M,i),v)}))},m}function reverseFactory(i,s){var u=makeSequence(i);return u._iter=i,u.size=i.size,u.reverse=function(){return i},i.flip&&(u.flip=function(){var s=flipFactory(i);return s.reverse=function(){return i.flip()},s}),u.get=function(u,m){return i.get(s?u:-1-u,m)},u.has=function(u){return i.has(s?u:-1-u)},u.includes=function(s){return i.includes(s)},u.cacheResult=cacheResultThrough,u.__iterate=function(s,u){var m=this;return i.__iterate((function(i,u){return s(i,u,m)}),!u)},u.__iterator=function(s,u){return i.__iterator(s,!u)},u}function filterFactory(i,s,u,m){var v=makeSequence(i);return m&&(v.has=function(m){var v=i.get(m,W);return v!==W&&!!s.call(u,v,m,i)},v.get=function(m,v){var _=i.get(m,W);return _!==W&&s.call(u,_,m,i)?_:v}),v.__iterateUncached=function(v,_){var j=this,M=0;return i.__iterate((function(i,_,$){if(s.call(u,i,_,$))return M++,v(i,m?_:M-1,j)}),_),M},v.__iteratorUncached=function(v,_){var j=i.__iterator(ie,_),M=0;return new Iterator((function(){for(;;){var _=j.next();if(_.done)return _;var $=_.value,W=$[0],X=$[1];if(s.call(u,X,W,i))return iteratorValue(v,m?W:M++,X,_)}}))},v}function countByFactory(i,s,u){var m=Map().asMutable();return i.__iterate((function(v,_){m.update(s.call(u,v,_,i),0,(function(i){return i+1}))})),m.asImmutable()}function groupByFactory(i,s,u){var m=isKeyed(i),v=(isOrdered(i)?OrderedMap():Map()).asMutable();i.__iterate((function(_,j){v.update(s.call(u,_,j,i),(function(i){return(i=i||[]).push(m?[j,_]:_),i}))}));var _=iterableClass(i);return v.map((function(s){return reify(i,_(s))}))}function sliceFactory(i,s,u,m){var v=i.size;if(void 0!==s&&(s|=0),void 0!==u&&(u===1/0?u=v:u|=0),wholeSlice(s,u,v))return i;var _=resolveBegin(s,v),j=resolveEnd(u,v);if(_!=_||j!=j)return sliceFactory(i.toSeq().cacheResult(),s,u,m);var M,$=j-_;$==$&&(M=$<0?0:$);var W=makeSequence(i);return W.size=0===M?M:i.size&&M||void 0,!m&&isSeq(i)&&M>=0&&(W.get=function(s,u){return(s=wrapIndex(this,s))>=0&&sM)return iteratorDone();var i=v.next();return m||s===ee?i:iteratorValue(s,$-1,s===Z?void 0:i.value[1],i)}))},W}function takeWhileFactory(i,s,u){var m=makeSequence(i);return m.__iterateUncached=function(m,v){var _=this;if(v)return this.cacheResult().__iterate(m,v);var j=0;return i.__iterate((function(i,v,M){return s.call(u,i,v,M)&&++j&&m(i,v,_)})),j},m.__iteratorUncached=function(m,v){var _=this;if(v)return this.cacheResult().__iterator(m,v);var j=i.__iterator(ie,v),M=!0;return new Iterator((function(){if(!M)return iteratorDone();var i=j.next();if(i.done)return i;var v=i.value,$=v[0],W=v[1];return s.call(u,W,$,_)?m===ie?i:iteratorValue(m,$,W,i):(M=!1,iteratorDone())}))},m}function skipWhileFactory(i,s,u,m){var v=makeSequence(i);return v.__iterateUncached=function(v,_){var j=this;if(_)return this.cacheResult().__iterate(v,_);var M=!0,$=0;return i.__iterate((function(i,_,W){if(!M||!(M=s.call(u,i,_,W)))return $++,v(i,m?_:$-1,j)})),$},v.__iteratorUncached=function(v,_){var j=this;if(_)return this.cacheResult().__iterator(v,_);var M=i.__iterator(ie,_),$=!0,W=0;return new Iterator((function(){var i,_,X;do{if((i=M.next()).done)return m||v===ee?i:iteratorValue(v,W++,v===Z?void 0:i.value[1],i);var Y=i.value;_=Y[0],X=Y[1],$&&($=s.call(u,X,_,j))}while($);return v===ie?i:iteratorValue(v,_,X,i)}))},v}function concatFactory(i,s){var u=isKeyed(i),m=[i].concat(s).map((function(i){return isIterable(i)?u&&(i=KeyedIterable(i)):i=u?keyedSeqFromValue(i):indexedSeqFromValue(Array.isArray(i)?i:[i]),i})).filter((function(i){return 0!==i.size}));if(0===m.length)return i;if(1===m.length){var v=m[0];if(v===i||u&&isKeyed(v)||isIndexed(i)&&isIndexed(v))return v}var _=new ArraySeq(m);return u?_=_.toKeyedSeq():isIndexed(i)||(_=_.toSetSeq()),(_=_.flatten(!0)).size=m.reduce((function(i,s){if(void 0!==i){var u=s.size;if(void 0!==u)return i+u}}),0),_}function flattenFactory(i,s,u){var m=makeSequence(i);return m.__iterateUncached=function(m,v){var _=0,j=!1;function flatDeep(i,M){var $=this;i.__iterate((function(i,v){return(!s||M0}function zipWithFactory(i,s,u){var m=makeSequence(i);return m.size=new ArraySeq(u).map((function(i){return i.size})).min(),m.__iterate=function(i,s){for(var u,m=this.__iterator(ee,s),v=0;!(u=m.next()).done&&!1!==i(u.value,v++,this););return v},m.__iteratorUncached=function(i,m){var v=u.map((function(i){return i=Iterable(i),getIterator(m?i.reverse():i)})),_=0,j=!1;return new Iterator((function(){var u;return j||(u=v.map((function(i){return i.next()})),j=u.some((function(i){return i.done}))),j?iteratorDone():iteratorValue(i,_++,s.apply(null,u.map((function(i){return i.value}))))}))},m}function reify(i,s){return isSeq(i)?s:i.constructor(s)}function validateEntry(i){if(i!==Object(i))throw new TypeError("Expected [K, V] tuple: "+i)}function resolveSize(i){return assertNotInfinite(i.size),ensureSize(i)}function iterableClass(i){return isKeyed(i)?KeyedIterable:isIndexed(i)?IndexedIterable:SetIterable}function makeSequence(i){return Object.create((isKeyed(i)?KeyedSeq:isIndexed(i)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(i,s){return i>s?1:i=0;u--)s={value:arguments[u],next:s};return this.__ownerID?(this.size=i,this._head=s,this.__hash=void 0,this.__altered=!0,this):makeStack(i,s)},Stack.prototype.pushAll=function(i){if(0===(i=IndexedIterable(i)).size)return this;assertNotInfinite(i.size);var s=this.size,u=this._head;return i.reverse().forEach((function(i){s++,u={value:i,next:u}})),this.__ownerID?(this.size=s,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(s,u)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(i){return this.pushAll(i)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(i,s){if(wholeSlice(i,s,this.size))return this;var u=resolveBegin(i,this.size);if(resolveEnd(s,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,i,s);for(var m=this.size-u,v=this._head;u--;)v=v.next;return this.__ownerID?(this.size=m,this._head=v,this.__hash=void 0,this.__altered=!0,this):makeStack(m,v)},Stack.prototype.__ensureOwner=function(i){return i===this.__ownerID?this:i?makeStack(this.size,this._head,i,this.__hash):(this.__ownerID=i,this.__altered=!1,this)},Stack.prototype.__iterate=function(i,s){if(s)return this.reverse().__iterate(i);for(var u=0,m=this._head;m&&!1!==i(m.value,u++,this);)m=m.next;return u},Stack.prototype.__iterator=function(i,s){if(s)return this.reverse().__iterator(i);var u=0,m=this._head;return new Iterator((function(){if(m){var s=m.value;return m=m.next,iteratorValue(i,u++,s)}return iteratorDone()}))},Stack.isStack=isStack;var pt,ht="@@__IMMUTABLE_STACK__@@",dt=Stack.prototype;function makeStack(i,s,u,m){var v=Object.create(dt);return v.size=i,v._head=s,v.__ownerID=u,v.__hash=m,v.__altered=!1,v}function emptyStack(){return pt||(pt=makeStack(0))}function mixin(i,s){var keyCopier=function(u){i.prototype[u]=s[u]};return Object.keys(s).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(s).forEach(keyCopier),i}dt[ht]=!0,dt.withMutations=He.withMutations,dt.asMutable=He.asMutable,dt.asImmutable=He.asImmutable,dt.wasAltered=He.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var i=new Array(this.size||0);return this.valueSeq().__iterate((function(s,u){i[u]=s})),i},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(i){return i&&"function"==typeof i.toJS?i.toJS():i})).__toJS()},toJSON:function(){return this.toSeq().map((function(i){return i&&"function"==typeof i.toJSON?i.toJSON():i})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var i={};return this.__iterate((function(s,u){i[u]=s})),i},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(i,s){return 0===this.size?i+s:i+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+s},concat:function(){return reify(this,concatFactory(this,i.call(arguments,0)))},includes:function(i){return this.some((function(s){return is(s,i)}))},entries:function(){return this.__iterator(ie)},every:function(i,s){assertNotInfinite(this.size);var u=!0;return this.__iterate((function(m,v,_){if(!i.call(s,m,v,_))return u=!1,!1})),u},filter:function(i,s){return reify(this,filterFactory(this,i,s,!0))},find:function(i,s,u){var m=this.findEntry(i,s);return m?m[1]:u},forEach:function(i,s){return assertNotInfinite(this.size),this.__iterate(s?i.bind(s):i)},join:function(i){assertNotInfinite(this.size),i=void 0!==i?""+i:",";var s="",u=!0;return this.__iterate((function(m){u?u=!1:s+=i,s+=null!=m?m.toString():""})),s},keys:function(){return this.__iterator(Z)},map:function(i,s){return reify(this,mapFactory(this,i,s))},reduce:function(i,s,u){var m,v;return assertNotInfinite(this.size),arguments.length<2?v=!0:m=s,this.__iterate((function(s,_,j){v?(v=!1,m=s):m=i.call(u,m,s,_,j)})),m},reduceRight:function(i,s,u){var m=this.toKeyedSeq().reverse();return m.reduce.apply(m,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(i,s){return reify(this,sliceFactory(this,i,s,!0))},some:function(i,s){return!this.every(not(i),s)},sort:function(i){return reify(this,sortFactory(this,i))},values:function(){return this.__iterator(ee)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(i,s){return ensureSize(i?this.toSeq().filter(i,s):this)},countBy:function(i,s){return countByFactory(this,i,s)},equals:function(i){return deepEqual(this,i)},entrySeq:function(){var i=this;if(i._cache)return new ArraySeq(i._cache);var s=i.toSeq().map(entryMapper).toIndexedSeq();return s.fromEntrySeq=function(){return i.toSeq()},s},filterNot:function(i,s){return this.filter(not(i),s)},findEntry:function(i,s,u){var m=u;return this.__iterate((function(u,v,_){if(i.call(s,u,v,_))return m=[v,u],!1})),m},findKey:function(i,s){var u=this.findEntry(i,s);return u&&u[0]},findLast:function(i,s,u){return this.toKeyedSeq().reverse().find(i,s,u)},findLastEntry:function(i,s,u){return this.toKeyedSeq().reverse().findEntry(i,s,u)},findLastKey:function(i,s){return this.toKeyedSeq().reverse().findKey(i,s)},first:function(){return this.find(returnTrue)},flatMap:function(i,s){return reify(this,flatMapFactory(this,i,s))},flatten:function(i){return reify(this,flattenFactory(this,i,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(i,s){return this.find((function(s,u){return is(u,i)}),void 0,s)},getIn:function(i,s){for(var u,m=this,v=forceIterator(i);!(u=v.next()).done;){var _=u.value;if((m=m&&m.get?m.get(_,W):W)===W)return s}return m},groupBy:function(i,s){return groupByFactory(this,i,s)},has:function(i){return this.get(i,W)!==W},hasIn:function(i){return this.getIn(i,W)!==W},isSubset:function(i){return i="function"==typeof i.includes?i:Iterable(i),this.every((function(s){return i.includes(s)}))},isSuperset:function(i){return(i="function"==typeof i.isSubset?i:Iterable(i)).isSubset(this)},keyOf:function(i){return this.findKey((function(s){return is(s,i)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(i){return this.toKeyedSeq().reverse().keyOf(i)},max:function(i){return maxFactory(this,i)},maxBy:function(i,s){return maxFactory(this,s,i)},min:function(i){return maxFactory(this,i?neg(i):defaultNegComparator)},minBy:function(i,s){return maxFactory(this,s?neg(s):defaultNegComparator,i)},rest:function(){return this.slice(1)},skip:function(i){return this.slice(Math.max(0,i))},skipLast:function(i){return reify(this,this.toSeq().reverse().skip(i).reverse())},skipWhile:function(i,s){return reify(this,skipWhileFactory(this,i,s,!0))},skipUntil:function(i,s){return this.skipWhile(not(i),s)},sortBy:function(i,s){return reify(this,sortFactory(this,s,i))},take:function(i){return this.slice(0,Math.max(0,i))},takeLast:function(i){return reify(this,this.toSeq().reverse().take(i).reverse())},takeWhile:function(i,s){return reify(this,takeWhileFactory(this,i,s))},takeUntil:function(i,s){return this.takeWhile(not(i),s)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var mt=Iterable.prototype;mt[s]=!0,mt[ce]=mt.values,mt.__toJS=mt.toArray,mt.__toStringMapper=quoteString,mt.inspect=mt.toSource=function(){return this.toString()},mt.chain=mt.flatMap,mt.contains=mt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(i,s){var u=this,m=0;return reify(this,this.toSeq().map((function(v,_){return i.call(s,[_,v],m++,u)})).fromEntrySeq())},mapKeys:function(i,s){var u=this;return reify(this,this.toSeq().flip().map((function(m,v){return i.call(s,m,v,u)})).flip())}});var gt=KeyedIterable.prototype;function keyMapper(i,s){return s}function entryMapper(i,s){return[s,i]}function not(i){return function(){return!i.apply(this,arguments)}}function neg(i){return function(){return-i.apply(this,arguments)}}function quoteString(i){return"string"==typeof i?JSON.stringify(i):String(i)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(i,s){return is?-1:0}function hashIterable(i){if(i.size===1/0)return 0;var s=isOrdered(i),u=isKeyed(i),m=s?1:0;return murmurHashOfSize(i.__iterate(u?s?function(i,s){m=31*m+hashMerge(hash(i),hash(s))|0}:function(i,s){m=m+hashMerge(hash(i),hash(s))|0}:s?function(i){m=31*m+hash(i)|0}:function(i){m=m+hash(i)|0}),m)}function murmurHashOfSize(i,s){return s=be(s,3432918353),s=be(s<<15|s>>>-15,461845907),s=be(s<<13|s>>>-13,5),s=be((s=(s+3864292196|0)^i)^s>>>16,2246822507),s=smi((s=be(s^s>>>13,3266489909))^s>>>16)}function hashMerge(i,s){return i^s+2654435769+(i<<6)+(i>>2)|0}return gt[u]=!0,gt[ce]=mt.entries,gt.__toJS=mt.toObject,gt.__toStringMapper=function(i,s){return JSON.stringify(s)+": "+quoteString(i)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(i,s){return reify(this,filterFactory(this,i,s,!1))},findIndex:function(i,s){var u=this.findEntry(i,s);return u?u[0]:-1},indexOf:function(i){var s=this.keyOf(i);return void 0===s?-1:s},lastIndexOf:function(i){var s=this.lastKeyOf(i);return void 0===s?-1:s},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(i,s){return reify(this,sliceFactory(this,i,s,!1))},splice:function(i,s){var u=arguments.length;if(s=Math.max(0|s,0),0===u||2===u&&!s)return this;i=resolveBegin(i,i<0?this.count():this.size);var m=this.slice(0,i);return reify(this,1===u?m:m.concat(arrCopy(arguments,2),this.slice(i+s)))},findLastIndex:function(i,s){var u=this.findLastEntry(i,s);return u?u[0]:-1},first:function(){return this.get(0)},flatten:function(i){return reify(this,flattenFactory(this,i,!1))},get:function(i,s){return(i=wrapIndex(this,i))<0||this.size===1/0||void 0!==this.size&&i>this.size?s:this.find((function(s,u){return u===i}),void 0,s)},has:function(i){return(i=wrapIndex(this,i))>=0&&(void 0!==this.size?this.size===1/0||i{"function"==typeof Object.create?i.exports=function inherits(i,s){s&&(i.super_=s,i.prototype=Object.create(s.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}))}:i.exports=function inherits(i,s){if(s){i.super_=s;var TempCtor=function(){};TempCtor.prototype=s.prototype,i.prototype=new TempCtor,i.prototype.constructor=i}}},35823:i=>{i.exports=function(i,s,u,m){var v=new Blob(void 0!==m?[m,i]:[i],{type:u||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(v,s);else{var _=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(v):window.webkitURL.createObjectURL(v),j=document.createElement("a");j.style.display="none",j.href=_,j.setAttribute("download",s),void 0===j.download&&j.setAttribute("target","_blank"),document.body.appendChild(j),j.click(),setTimeout((function(){document.body.removeChild(j),window.URL.revokeObjectURL(_)}),200)}}},91296:(i,s,u)=>{var m=NaN,v="[object Symbol]",_=/^\s+|\s+$/g,j=/^[-+]0x[0-9a-f]+$/i,M=/^0b[01]+$/i,$=/^0o[0-7]+$/i,W=parseInt,X="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g,Y="object"==typeof self&&self&&self.Object===Object&&self,Z=X||Y||Function("return this")(),ee=Object.prototype.toString,ie=Math.max,ae=Math.min,now=function(){return Z.Date.now()};function isObject(i){var s=typeof i;return!!i&&("object"==s||"function"==s)}function toNumber(i){if("number"==typeof i)return i;if(function isSymbol(i){return"symbol"==typeof i||function isObjectLike(i){return!!i&&"object"==typeof i}(i)&&ee.call(i)==v}(i))return m;if(isObject(i)){var s="function"==typeof i.valueOf?i.valueOf():i;i=isObject(s)?s+"":s}if("string"!=typeof i)return 0===i?i:+i;i=i.replace(_,"");var u=M.test(i);return u||$.test(i)?W(i.slice(2),u?2:8):j.test(i)?m:+i}i.exports=function debounce(i,s,u){var m,v,_,j,M,$,W=0,X=!1,Y=!1,Z=!0;if("function"!=typeof i)throw new TypeError("Expected a function");function invokeFunc(s){var u=m,_=v;return m=v=void 0,W=s,j=i.apply(_,u)}function shouldInvoke(i){var u=i-$;return void 0===$||u>=s||u<0||Y&&i-W>=_}function timerExpired(){var i=now();if(shouldInvoke(i))return trailingEdge(i);M=setTimeout(timerExpired,function remainingWait(i){var u=s-(i-$);return Y?ae(u,_-(i-W)):u}(i))}function trailingEdge(i){return M=void 0,Z&&m?invokeFunc(i):(m=v=void 0,j)}function debounced(){var i=now(),u=shouldInvoke(i);if(m=arguments,v=this,$=i,u){if(void 0===M)return function leadingEdge(i){return W=i,M=setTimeout(timerExpired,s),X?invokeFunc(i):j}($);if(Y)return M=setTimeout(timerExpired,s),invokeFunc($)}return void 0===M&&(M=setTimeout(timerExpired,s)),j}return s=toNumber(s)||0,isObject(u)&&(X=!!u.leading,_=(Y="maxWait"in u)?ie(toNumber(u.maxWait)||0,s):_,Z="trailing"in u?!!u.trailing:Z),debounced.cancel=function cancel(){void 0!==M&&clearTimeout(M),W=0,m=$=v=M=void 0},debounced.flush=function flush(){return void 0===M?j:trailingEdge(now())},debounced}},18552:(i,s,u)=>{var m=u(10852)(u(55639),"DataView");i.exports=m},1989:(i,s,u)=>{var m=u(51789),v=u(80401),_=u(57667),j=u(21327),M=u(81866);function Hash(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(3118),v=u(9435);function LazyWrapper(i){this.__wrapped__=i,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}LazyWrapper.prototype=m(v.prototype),LazyWrapper.prototype.constructor=LazyWrapper,i.exports=LazyWrapper},38407:(i,s,u)=>{var m=u(27040),v=u(14125),_=u(82117),j=u(67518),M=u(54705);function ListCache(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(3118),v=u(9435);function LodashWrapper(i,s){this.__wrapped__=i,this.__actions__=[],this.__chain__=!!s,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=m(v.prototype),LodashWrapper.prototype.constructor=LodashWrapper,i.exports=LodashWrapper},57071:(i,s,u)=>{var m=u(10852)(u(55639),"Map");i.exports=m},83369:(i,s,u)=>{var m=u(24785),v=u(11285),_=u(96e3),j=u(49916),M=u(95265);function MapCache(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(10852)(u(55639),"Promise");i.exports=m},58525:(i,s,u)=>{var m=u(10852)(u(55639),"Set");i.exports=m},88668:(i,s,u)=>{var m=u(83369),v=u(90619),_=u(72385);function SetCache(i){var s=-1,u=null==i?0:i.length;for(this.__data__=new m;++s{var m=u(38407),v=u(37465),_=u(63779),j=u(67599),M=u(44758),$=u(34309);function Stack(i){var s=this.__data__=new m(i);this.size=s.size}Stack.prototype.clear=v,Stack.prototype.delete=_,Stack.prototype.get=j,Stack.prototype.has=M,Stack.prototype.set=$,i.exports=Stack},62705:(i,s,u)=>{var m=u(55639).Symbol;i.exports=m},11149:(i,s,u)=>{var m=u(55639).Uint8Array;i.exports=m},70577:(i,s,u)=>{var m=u(10852)(u(55639),"WeakMap");i.exports=m},96874:i=>{i.exports=function apply(i,s,u){switch(u.length){case 0:return i.call(s);case 1:return i.call(s,u[0]);case 2:return i.call(s,u[0],u[1]);case 3:return i.call(s,u[0],u[1],u[2])}return i.apply(s,u)}},77412:i=>{i.exports=function arrayEach(i,s){for(var u=-1,m=null==i?0:i.length;++u{i.exports=function arrayFilter(i,s){for(var u=-1,m=null==i?0:i.length,v=0,_=[];++u{var m=u(42118);i.exports=function arrayIncludes(i,s){return!!(null==i?0:i.length)&&m(i,s,0)>-1}},14636:(i,s,u)=>{var m=u(22545),v=u(35694),_=u(1469),j=u(44144),M=u(65776),$=u(36719),W=Object.prototype.hasOwnProperty;i.exports=function arrayLikeKeys(i,s){var u=_(i),X=!u&&v(i),Y=!u&&!X&&j(i),Z=!u&&!X&&!Y&&$(i),ee=u||X||Y||Z,ie=ee?m(i.length,String):[],ae=ie.length;for(var le in i)!s&&!W.call(i,le)||ee&&("length"==le||Y&&("offset"==le||"parent"==le)||Z&&("buffer"==le||"byteLength"==le||"byteOffset"==le)||M(le,ae))||ie.push(le);return ie}},29932:i=>{i.exports=function arrayMap(i,s){for(var u=-1,m=null==i?0:i.length,v=Array(m);++u{i.exports=function arrayPush(i,s){for(var u=-1,m=s.length,v=i.length;++u{i.exports=function arrayReduce(i,s,u,m){var v=-1,_=null==i?0:i.length;for(m&&_&&(u=i[++v]);++v<_;)u=s(u,i[v],v,i);return u}},82908:i=>{i.exports=function arraySome(i,s){for(var u=-1,m=null==i?0:i.length;++u{i.exports=function asciiToArray(i){return i.split("")}},49029:i=>{var s=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;i.exports=function asciiWords(i){return i.match(s)||[]}},86556:(i,s,u)=>{var m=u(89465),v=u(77813);i.exports=function assignMergeValue(i,s,u){(void 0!==u&&!v(i[s],u)||void 0===u&&!(s in i))&&m(i,s,u)}},34865:(i,s,u)=>{var m=u(89465),v=u(77813),_=Object.prototype.hasOwnProperty;i.exports=function assignValue(i,s,u){var j=i[s];_.call(i,s)&&v(j,u)&&(void 0!==u||s in i)||m(i,s,u)}},18470:(i,s,u)=>{var m=u(77813);i.exports=function assocIndexOf(i,s){for(var u=i.length;u--;)if(m(i[u][0],s))return u;return-1}},44037:(i,s,u)=>{var m=u(98363),v=u(3674);i.exports=function baseAssign(i,s){return i&&m(s,v(s),i)}},63886:(i,s,u)=>{var m=u(98363),v=u(81704);i.exports=function baseAssignIn(i,s){return i&&m(s,v(s),i)}},89465:(i,s,u)=>{var m=u(38777);i.exports=function baseAssignValue(i,s,u){"__proto__"==s&&m?m(i,s,{configurable:!0,enumerable:!0,value:u,writable:!0}):i[s]=u}},85990:(i,s,u)=>{var m=u(46384),v=u(77412),_=u(34865),j=u(44037),M=u(63886),$=u(64626),W=u(278),X=u(18805),Y=u(1911),Z=u(58234),ee=u(46904),ie=u(64160),ae=u(43824),le=u(29148),ce=u(38517),pe=u(1469),de=u(44144),fe=u(56688),ye=u(13218),be=u(72928),_e=u(3674),we=u(81704),Se="[object Arguments]",xe="[object Function]",Ie="[object Object]",Pe={};Pe[Se]=Pe["[object Array]"]=Pe["[object ArrayBuffer]"]=Pe["[object DataView]"]=Pe["[object Boolean]"]=Pe["[object Date]"]=Pe["[object Float32Array]"]=Pe["[object Float64Array]"]=Pe["[object Int8Array]"]=Pe["[object Int16Array]"]=Pe["[object Int32Array]"]=Pe["[object Map]"]=Pe["[object Number]"]=Pe[Ie]=Pe["[object RegExp]"]=Pe["[object Set]"]=Pe["[object String]"]=Pe["[object Symbol]"]=Pe["[object Uint8Array]"]=Pe["[object Uint8ClampedArray]"]=Pe["[object Uint16Array]"]=Pe["[object Uint32Array]"]=!0,Pe["[object Error]"]=Pe[xe]=Pe["[object WeakMap]"]=!1,i.exports=function baseClone(i,s,u,Te,Re,qe){var ze,Ve=1&s,We=2&s,He=4&s;if(u&&(ze=Re?u(i,Te,Re,qe):u(i)),void 0!==ze)return ze;if(!ye(i))return i;var Xe=pe(i);if(Xe){if(ze=ae(i),!Ve)return W(i,ze)}else{var Ye=ie(i),Qe=Ye==xe||"[object GeneratorFunction]"==Ye;if(de(i))return $(i,Ve);if(Ye==Ie||Ye==Se||Qe&&!Re){if(ze=We||Qe?{}:ce(i),!Ve)return We?Y(i,M(ze,i)):X(i,j(ze,i))}else{if(!Pe[Ye])return Re?i:{};ze=le(i,Ye,Ve)}}qe||(qe=new m);var et=qe.get(i);if(et)return et;qe.set(i,ze),be(i)?i.forEach((function(m){ze.add(baseClone(m,s,u,m,i,qe))})):fe(i)&&i.forEach((function(m,v){ze.set(v,baseClone(m,s,u,v,i,qe))}));var tt=Xe?void 0:(He?We?ee:Z:We?we:_e)(i);return v(tt||i,(function(m,v){tt&&(m=i[v=m]),_(ze,v,baseClone(m,s,u,v,i,qe))})),ze}},3118:(i,s,u)=>{var m=u(13218),v=Object.create,_=function(){function object(){}return function(i){if(!m(i))return{};if(v)return v(i);object.prototype=i;var s=new object;return object.prototype=void 0,s}}();i.exports=_},89881:(i,s,u)=>{var m=u(47816),v=u(99291)(m);i.exports=v},41848:i=>{i.exports=function baseFindIndex(i,s,u,m){for(var v=i.length,_=u+(m?1:-1);m?_--:++_{var m=u(62488),v=u(37285);i.exports=function baseFlatten(i,s,u,_,j){var M=-1,$=i.length;for(u||(u=v),j||(j=[]);++M<$;){var W=i[M];s>0&&u(W)?s>1?baseFlatten(W,s-1,u,_,j):m(j,W):_||(j[j.length]=W)}return j}},28483:(i,s,u)=>{var m=u(25063)();i.exports=m},47816:(i,s,u)=>{var m=u(28483),v=u(3674);i.exports=function baseForOwn(i,s){return i&&m(i,s,v)}},97786:(i,s,u)=>{var m=u(71811),v=u(40327);i.exports=function baseGet(i,s){for(var u=0,_=(s=m(s,i)).length;null!=i&&u<_;)i=i[v(s[u++])];return u&&u==_?i:void 0}},68866:(i,s,u)=>{var m=u(62488),v=u(1469);i.exports=function baseGetAllKeys(i,s,u){var _=s(i);return v(i)?_:m(_,u(i))}},44239:(i,s,u)=>{var m=u(62705),v=u(89607),_=u(2333),j=m?m.toStringTag:void 0;i.exports=function baseGetTag(i){return null==i?void 0===i?"[object Undefined]":"[object Null]":j&&j in Object(i)?v(i):_(i)}},13:i=>{i.exports=function baseHasIn(i,s){return null!=i&&s in Object(i)}},42118:(i,s,u)=>{var m=u(41848),v=u(62722),_=u(42351);i.exports=function baseIndexOf(i,s,u){return s==s?_(i,s,u):m(i,v,u)}},9454:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function baseIsArguments(i){return v(i)&&"[object Arguments]"==m(i)}},90939:(i,s,u)=>{var m=u(2492),v=u(37005);i.exports=function baseIsEqual(i,s,u,_,j){return i===s||(null==i||null==s||!v(i)&&!v(s)?i!=i&&s!=s:m(i,s,u,_,baseIsEqual,j))}},2492:(i,s,u)=>{var m=u(46384),v=u(67114),_=u(18351),j=u(16096),M=u(64160),$=u(1469),W=u(44144),X=u(36719),Y="[object Arguments]",Z="[object Array]",ee="[object Object]",ie=Object.prototype.hasOwnProperty;i.exports=function baseIsEqualDeep(i,s,u,ae,le,ce){var pe=$(i),de=$(s),fe=pe?Z:M(i),ye=de?Z:M(s),be=(fe=fe==Y?ee:fe)==ee,_e=(ye=ye==Y?ee:ye)==ee,we=fe==ye;if(we&&W(i)){if(!W(s))return!1;pe=!0,be=!1}if(we&&!be)return ce||(ce=new m),pe||X(i)?v(i,s,u,ae,le,ce):_(i,s,fe,u,ae,le,ce);if(!(1&u)){var Se=be&&ie.call(i,"__wrapped__"),xe=_e&&ie.call(s,"__wrapped__");if(Se||xe){var Ie=Se?i.value():i,Pe=xe?s.value():s;return ce||(ce=new m),le(Ie,Pe,u,ae,ce)}}return!!we&&(ce||(ce=new m),j(i,s,u,ae,le,ce))}},25588:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function baseIsMap(i){return v(i)&&"[object Map]"==m(i)}},2958:(i,s,u)=>{var m=u(46384),v=u(90939);i.exports=function baseIsMatch(i,s,u,_){var j=u.length,M=j,$=!_;if(null==i)return!M;for(i=Object(i);j--;){var W=u[j];if($&&W[2]?W[1]!==i[W[0]]:!(W[0]in i))return!1}for(;++j{i.exports=function baseIsNaN(i){return i!=i}},28458:(i,s,u)=>{var m=u(23560),v=u(15346),_=u(13218),j=u(80346),M=/^\[object .+?Constructor\]$/,$=Function.prototype,W=Object.prototype,X=$.toString,Y=W.hasOwnProperty,Z=RegExp("^"+X.call(Y).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");i.exports=function baseIsNative(i){return!(!_(i)||v(i))&&(m(i)?Z:M).test(j(i))}},29221:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function baseIsSet(i){return v(i)&&"[object Set]"==m(i)}},38749:(i,s,u)=>{var m=u(44239),v=u(41780),_=u(37005),j={};j["[object Float32Array]"]=j["[object Float64Array]"]=j["[object Int8Array]"]=j["[object Int16Array]"]=j["[object Int32Array]"]=j["[object Uint8Array]"]=j["[object Uint8ClampedArray]"]=j["[object Uint16Array]"]=j["[object Uint32Array]"]=!0,j["[object Arguments]"]=j["[object Array]"]=j["[object ArrayBuffer]"]=j["[object Boolean]"]=j["[object DataView]"]=j["[object Date]"]=j["[object Error]"]=j["[object Function]"]=j["[object Map]"]=j["[object Number]"]=j["[object Object]"]=j["[object RegExp]"]=j["[object Set]"]=j["[object String]"]=j["[object WeakMap]"]=!1,i.exports=function baseIsTypedArray(i){return _(i)&&v(i.length)&&!!j[m(i)]}},67206:(i,s,u)=>{var m=u(91573),v=u(16432),_=u(6557),j=u(1469),M=u(39601);i.exports=function baseIteratee(i){return"function"==typeof i?i:null==i?_:"object"==typeof i?j(i)?v(i[0],i[1]):m(i):M(i)}},280:(i,s,u)=>{var m=u(25726),v=u(86916),_=Object.prototype.hasOwnProperty;i.exports=function baseKeys(i){if(!m(i))return v(i);var s=[];for(var u in Object(i))_.call(i,u)&&"constructor"!=u&&s.push(u);return s}},10313:(i,s,u)=>{var m=u(13218),v=u(25726),_=u(33498),j=Object.prototype.hasOwnProperty;i.exports=function baseKeysIn(i){if(!m(i))return _(i);var s=v(i),u=[];for(var M in i)("constructor"!=M||!s&&j.call(i,M))&&u.push(M);return u}},9435:i=>{i.exports=function baseLodash(){}},91573:(i,s,u)=>{var m=u(2958),v=u(1499),_=u(42634);i.exports=function baseMatches(i){var s=v(i);return 1==s.length&&s[0][2]?_(s[0][0],s[0][1]):function(u){return u===i||m(u,i,s)}}},16432:(i,s,u)=>{var m=u(90939),v=u(27361),_=u(79095),j=u(15403),M=u(89162),$=u(42634),W=u(40327);i.exports=function baseMatchesProperty(i,s){return j(i)&&M(s)?$(W(i),s):function(u){var j=v(u,i);return void 0===j&&j===s?_(u,i):m(s,j,3)}}},42980:(i,s,u)=>{var m=u(46384),v=u(86556),_=u(28483),j=u(59783),M=u(13218),$=u(81704),W=u(36390);i.exports=function baseMerge(i,s,u,X,Y){i!==s&&_(s,(function(_,$){if(Y||(Y=new m),M(_))j(i,s,$,u,baseMerge,X,Y);else{var Z=X?X(W(i,$),_,$+"",i,s,Y):void 0;void 0===Z&&(Z=_),v(i,$,Z)}}),$)}},59783:(i,s,u)=>{var m=u(86556),v=u(64626),_=u(77133),j=u(278),M=u(38517),$=u(35694),W=u(1469),X=u(29246),Y=u(44144),Z=u(23560),ee=u(13218),ie=u(68630),ae=u(36719),le=u(36390),ce=u(59881);i.exports=function baseMergeDeep(i,s,u,pe,de,fe,ye){var be=le(i,u),_e=le(s,u),we=ye.get(_e);if(we)m(i,u,we);else{var Se=fe?fe(be,_e,u+"",i,s,ye):void 0,xe=void 0===Se;if(xe){var Ie=W(_e),Pe=!Ie&&Y(_e),Te=!Ie&&!Pe&&ae(_e);Se=_e,Ie||Pe||Te?W(be)?Se=be:X(be)?Se=j(be):Pe?(xe=!1,Se=v(_e,!0)):Te?(xe=!1,Se=_(_e,!0)):Se=[]:ie(_e)||$(_e)?(Se=be,$(be)?Se=ce(be):ee(be)&&!Z(be)||(Se=M(_e))):xe=!1}xe&&(ye.set(_e,Se),de(Se,_e,pe,fe,ye),ye.delete(_e)),m(i,u,Se)}}},40371:i=>{i.exports=function baseProperty(i){return function(s){return null==s?void 0:s[i]}}},79152:(i,s,u)=>{var m=u(97786);i.exports=function basePropertyDeep(i){return function(s){return m(s,i)}}},18674:i=>{i.exports=function basePropertyOf(i){return function(s){return null==i?void 0:i[s]}}},10107:i=>{i.exports=function baseReduce(i,s,u,m,v){return v(i,(function(i,v,_){u=m?(m=!1,i):s(u,i,v,_)})),u}},5976:(i,s,u)=>{var m=u(6557),v=u(45357),_=u(30061);i.exports=function baseRest(i,s){return _(v(i,s,m),i+"")}},10611:(i,s,u)=>{var m=u(34865),v=u(71811),_=u(65776),j=u(13218),M=u(40327);i.exports=function baseSet(i,s,u,$){if(!j(i))return i;for(var W=-1,X=(s=v(s,i)).length,Y=X-1,Z=i;null!=Z&&++W{var m=u(6557),v=u(89250),_=v?function(i,s){return v.set(i,s),i}:m;i.exports=_},56560:(i,s,u)=>{var m=u(75703),v=u(38777),_=u(6557),j=v?function(i,s){return v(i,"toString",{configurable:!0,enumerable:!1,value:m(s),writable:!0})}:_;i.exports=j},14259:i=>{i.exports=function baseSlice(i,s,u){var m=-1,v=i.length;s<0&&(s=-s>v?0:v+s),(u=u>v?v:u)<0&&(u+=v),v=s>u?0:u-s>>>0,s>>>=0;for(var _=Array(v);++m{var m=u(89881);i.exports=function baseSome(i,s){var u;return m(i,(function(i,m,v){return!(u=s(i,m,v))})),!!u}},22545:i=>{i.exports=function baseTimes(i,s){for(var u=-1,m=Array(i);++u{var m=u(62705),v=u(29932),_=u(1469),j=u(33448),M=m?m.prototype:void 0,$=M?M.toString:void 0;i.exports=function baseToString(i){if("string"==typeof i)return i;if(_(i))return v(i,baseToString)+"";if(j(i))return $?$.call(i):"";var s=i+"";return"0"==s&&1/i==-Infinity?"-0":s}},27561:(i,s,u)=>{var m=u(67990),v=/^\s+/;i.exports=function baseTrim(i){return i?i.slice(0,m(i)+1).replace(v,""):i}},7518:i=>{i.exports=function baseUnary(i){return function(s){return i(s)}}},57406:(i,s,u)=>{var m=u(71811),v=u(10928),_=u(40292),j=u(40327);i.exports=function baseUnset(i,s){return s=m(s,i),null==(i=_(i,s))||delete i[j(v(s))]}},1757:i=>{i.exports=function baseZipObject(i,s,u){for(var m=-1,v=i.length,_=s.length,j={};++m{i.exports=function cacheHas(i,s){return i.has(s)}},71811:(i,s,u)=>{var m=u(1469),v=u(15403),_=u(55514),j=u(79833);i.exports=function castPath(i,s){return m(i)?i:v(i,s)?[i]:_(j(i))}},40180:(i,s,u)=>{var m=u(14259);i.exports=function castSlice(i,s,u){var v=i.length;return u=void 0===u?v:u,!s&&u>=v?i:m(i,s,u)}},74318:(i,s,u)=>{var m=u(11149);i.exports=function cloneArrayBuffer(i){var s=new i.constructor(i.byteLength);return new m(s).set(new m(i)),s}},64626:(i,s,u)=>{i=u.nmd(i);var m=u(55639),v=s&&!s.nodeType&&s,_=v&&i&&!i.nodeType&&i,j=_&&_.exports===v?m.Buffer:void 0,M=j?j.allocUnsafe:void 0;i.exports=function cloneBuffer(i,s){if(s)return i.slice();var u=i.length,m=M?M(u):new i.constructor(u);return i.copy(m),m}},57157:(i,s,u)=>{var m=u(74318);i.exports=function cloneDataView(i,s){var u=s?m(i.buffer):i.buffer;return new i.constructor(u,i.byteOffset,i.byteLength)}},93147:i=>{var s=/\w*$/;i.exports=function cloneRegExp(i){var u=new i.constructor(i.source,s.exec(i));return u.lastIndex=i.lastIndex,u}},40419:(i,s,u)=>{var m=u(62705),v=m?m.prototype:void 0,_=v?v.valueOf:void 0;i.exports=function cloneSymbol(i){return _?Object(_.call(i)):{}}},77133:(i,s,u)=>{var m=u(74318);i.exports=function cloneTypedArray(i,s){var u=s?m(i.buffer):i.buffer;return new i.constructor(u,i.byteOffset,i.length)}},52157:i=>{var s=Math.max;i.exports=function composeArgs(i,u,m,v){for(var _=-1,j=i.length,M=m.length,$=-1,W=u.length,X=s(j-M,0),Y=Array(W+X),Z=!v;++${var s=Math.max;i.exports=function composeArgsRight(i,u,m,v){for(var _=-1,j=i.length,M=-1,$=m.length,W=-1,X=u.length,Y=s(j-$,0),Z=Array(Y+X),ee=!v;++_{i.exports=function copyArray(i,s){var u=-1,m=i.length;for(s||(s=Array(m));++u{var m=u(34865),v=u(89465);i.exports=function copyObject(i,s,u,_){var j=!u;u||(u={});for(var M=-1,$=s.length;++M<$;){var W=s[M],X=_?_(u[W],i[W],W,u,i):void 0;void 0===X&&(X=i[W]),j?v(u,W,X):m(u,W,X)}return u}},18805:(i,s,u)=>{var m=u(98363),v=u(99551);i.exports=function copySymbols(i,s){return m(i,v(i),s)}},1911:(i,s,u)=>{var m=u(98363),v=u(51442);i.exports=function copySymbolsIn(i,s){return m(i,v(i),s)}},14429:(i,s,u)=>{var m=u(55639)["__core-js_shared__"];i.exports=m},97991:i=>{i.exports=function countHolders(i,s){for(var u=i.length,m=0;u--;)i[u]===s&&++m;return m}},21463:(i,s,u)=>{var m=u(5976),v=u(16612);i.exports=function createAssigner(i){return m((function(s,u){var m=-1,_=u.length,j=_>1?u[_-1]:void 0,M=_>2?u[2]:void 0;for(j=i.length>3&&"function"==typeof j?(_--,j):void 0,M&&v(u[0],u[1],M)&&(j=_<3?void 0:j,_=1),s=Object(s);++m<_;){var $=u[m];$&&i(s,$,m,j)}return s}))}},99291:(i,s,u)=>{var m=u(98612);i.exports=function createBaseEach(i,s){return function(u,v){if(null==u)return u;if(!m(u))return i(u,v);for(var _=u.length,j=s?_:-1,M=Object(u);(s?j--:++j<_)&&!1!==v(M[j],j,M););return u}}},25063:i=>{i.exports=function createBaseFor(i){return function(s,u,m){for(var v=-1,_=Object(s),j=m(s),M=j.length;M--;){var $=j[i?M:++v];if(!1===u(_[$],$,_))break}return s}}},22402:(i,s,u)=>{var m=u(71774),v=u(55639);i.exports=function createBind(i,s,u){var _=1&s,j=m(i);return function wrapper(){return(this&&this!==v&&this instanceof wrapper?j:i).apply(_?u:this,arguments)}}},98805:(i,s,u)=>{var m=u(40180),v=u(62689),_=u(83140),j=u(79833);i.exports=function createCaseFirst(i){return function(s){s=j(s);var u=v(s)?_(s):void 0,M=u?u[0]:s.charAt(0),$=u?m(u,1).join(""):s.slice(1);return M[i]()+$}}},35393:(i,s,u)=>{var m=u(62663),v=u(53816),_=u(58748),j=RegExp("['’]","g");i.exports=function createCompounder(i){return function(s){return m(_(v(s).replace(j,"")),i,"")}}},71774:(i,s,u)=>{var m=u(3118),v=u(13218);i.exports=function createCtor(i){return function(){var s=arguments;switch(s.length){case 0:return new i;case 1:return new i(s[0]);case 2:return new i(s[0],s[1]);case 3:return new i(s[0],s[1],s[2]);case 4:return new i(s[0],s[1],s[2],s[3]);case 5:return new i(s[0],s[1],s[2],s[3],s[4]);case 6:return new i(s[0],s[1],s[2],s[3],s[4],s[5]);case 7:return new i(s[0],s[1],s[2],s[3],s[4],s[5],s[6])}var u=m(i.prototype),_=i.apply(u,s);return v(_)?_:u}}},46347:(i,s,u)=>{var m=u(96874),v=u(71774),_=u(86935),j=u(94487),M=u(20893),$=u(46460),W=u(55639);i.exports=function createCurry(i,s,u){var X=v(i);return function wrapper(){for(var v=arguments.length,Y=Array(v),Z=v,ee=M(wrapper);Z--;)Y[Z]=arguments[Z];var ie=v<3&&Y[0]!==ee&&Y[v-1]!==ee?[]:$(Y,ee);return(v-=ie.length){var m=u(67206),v=u(98612),_=u(3674);i.exports=function createFind(i){return function(s,u,j){var M=Object(s);if(!v(s)){var $=m(u,3);s=_(s),u=function(i){return $(M[i],i,M)}}var W=i(s,u,j);return W>-1?M[$?s[W]:W]:void 0}}},86935:(i,s,u)=>{var m=u(52157),v=u(14054),_=u(97991),j=u(71774),M=u(94487),$=u(20893),W=u(90451),X=u(46460),Y=u(55639);i.exports=function createHybrid(i,s,u,Z,ee,ie,ae,le,ce,pe){var de=128&s,fe=1&s,ye=2&s,be=24&s,_e=512&s,we=ye?void 0:j(i);return function wrapper(){for(var Se=arguments.length,xe=Array(Se),Ie=Se;Ie--;)xe[Ie]=arguments[Ie];if(be)var Pe=$(wrapper),Te=_(xe,Pe);if(Z&&(xe=m(xe,Z,ee,be)),ie&&(xe=v(xe,ie,ae,be)),Se-=Te,be&&Se1&&xe.reverse(),de&&ce{var m=u(96874),v=u(71774),_=u(55639);i.exports=function createPartial(i,s,u,j){var M=1&s,$=v(i);return function wrapper(){for(var s=-1,v=arguments.length,W=-1,X=j.length,Y=Array(X+v),Z=this&&this!==_&&this instanceof wrapper?$:i;++W{var m=u(86528),v=u(258),_=u(69255);i.exports=function createRecurry(i,s,u,j,M,$,W,X,Y,Z){var ee=8&s;s|=ee?32:64,4&(s&=~(ee?64:32))||(s&=-4);var ie=[i,s,M,ee?$:void 0,ee?W:void 0,ee?void 0:$,ee?void 0:W,X,Y,Z],ae=u.apply(void 0,ie);return m(i)&&v(ae,ie),ae.placeholder=j,_(ae,i,s)}},97727:(i,s,u)=>{var m=u(28045),v=u(22402),_=u(46347),j=u(86935),M=u(84375),$=u(66833),W=u(63833),X=u(258),Y=u(69255),Z=u(40554),ee=Math.max;i.exports=function createWrap(i,s,u,ie,ae,le,ce,pe){var de=2&s;if(!de&&"function"!=typeof i)throw new TypeError("Expected a function");var fe=ie?ie.length:0;if(fe||(s&=-97,ie=ae=void 0),ce=void 0===ce?ce:ee(Z(ce),0),pe=void 0===pe?pe:Z(pe),fe-=ae?ae.length:0,64&s){var ye=ie,be=ae;ie=ae=void 0}var _e=de?void 0:$(i),we=[i,s,u,ie,ae,ye,be,le,ce,pe];if(_e&&W(we,_e),i=we[0],s=we[1],u=we[2],ie=we[3],ae=we[4],!(pe=we[9]=void 0===we[9]?de?0:i.length:ee(we[9]-fe,0))&&24&s&&(s&=-25),s&&1!=s)Se=8==s||16==s?_(i,s,pe):32!=s&&33!=s||ae.length?j.apply(void 0,we):M(i,s,u,ie);else var Se=v(i,s,u);return Y((_e?m:X)(Se,we),i,s)}},60696:(i,s,u)=>{var m=u(68630);i.exports=function customOmitClone(i){return m(i)?void 0:i}},69389:(i,s,u)=>{var m=u(18674)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});i.exports=m},38777:(i,s,u)=>{var m=u(10852),v=function(){try{var i=m(Object,"defineProperty");return i({},"",{}),i}catch(i){}}();i.exports=v},67114:(i,s,u)=>{var m=u(88668),v=u(82908),_=u(74757);i.exports=function equalArrays(i,s,u,j,M,$){var W=1&u,X=i.length,Y=s.length;if(X!=Y&&!(W&&Y>X))return!1;var Z=$.get(i),ee=$.get(s);if(Z&&ee)return Z==s&&ee==i;var ie=-1,ae=!0,le=2&u?new m:void 0;for($.set(i,s),$.set(s,i);++ie{var m=u(62705),v=u(11149),_=u(77813),j=u(67114),M=u(68776),$=u(21814),W=m?m.prototype:void 0,X=W?W.valueOf:void 0;i.exports=function equalByTag(i,s,u,m,W,Y,Z){switch(u){case"[object DataView]":if(i.byteLength!=s.byteLength||i.byteOffset!=s.byteOffset)return!1;i=i.buffer,s=s.buffer;case"[object ArrayBuffer]":return!(i.byteLength!=s.byteLength||!Y(new v(i),new v(s)));case"[object Boolean]":case"[object Date]":case"[object Number]":return _(+i,+s);case"[object Error]":return i.name==s.name&&i.message==s.message;case"[object RegExp]":case"[object String]":return i==s+"";case"[object Map]":var ee=M;case"[object Set]":var ie=1&m;if(ee||(ee=$),i.size!=s.size&&!ie)return!1;var ae=Z.get(i);if(ae)return ae==s;m|=2,Z.set(i,s);var le=j(ee(i),ee(s),m,W,Y,Z);return Z.delete(i),le;case"[object Symbol]":if(X)return X.call(i)==X.call(s)}return!1}},16096:(i,s,u)=>{var m=u(58234),v=Object.prototype.hasOwnProperty;i.exports=function equalObjects(i,s,u,_,j,M){var $=1&u,W=m(i),X=W.length;if(X!=m(s).length&&!$)return!1;for(var Y=X;Y--;){var Z=W[Y];if(!($?Z in s:v.call(s,Z)))return!1}var ee=M.get(i),ie=M.get(s);if(ee&&ie)return ee==s&&ie==i;var ae=!0;M.set(i,s),M.set(s,i);for(var le=$;++Y{var m=u(85564),v=u(45357),_=u(30061);i.exports=function flatRest(i){return _(v(i,void 0,m),i+"")}},31957:(i,s,u)=>{var m="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g;i.exports=m},58234:(i,s,u)=>{var m=u(68866),v=u(99551),_=u(3674);i.exports=function getAllKeys(i){return m(i,_,v)}},46904:(i,s,u)=>{var m=u(68866),v=u(51442),_=u(81704);i.exports=function getAllKeysIn(i){return m(i,_,v)}},66833:(i,s,u)=>{var m=u(89250),v=u(50308),_=m?function(i){return m.get(i)}:v;i.exports=_},97658:(i,s,u)=>{var m=u(52060),v=Object.prototype.hasOwnProperty;i.exports=function getFuncName(i){for(var s=i.name+"",u=m[s],_=v.call(m,s)?u.length:0;_--;){var j=u[_],M=j.func;if(null==M||M==i)return j.name}return s}},20893:i=>{i.exports=function getHolder(i){return i.placeholder}},45050:(i,s,u)=>{var m=u(37019);i.exports=function getMapData(i,s){var u=i.__data__;return m(s)?u["string"==typeof s?"string":"hash"]:u.map}},1499:(i,s,u)=>{var m=u(89162),v=u(3674);i.exports=function getMatchData(i){for(var s=v(i),u=s.length;u--;){var _=s[u],j=i[_];s[u]=[_,j,m(j)]}return s}},10852:(i,s,u)=>{var m=u(28458),v=u(47801);i.exports=function getNative(i,s){var u=v(i,s);return m(u)?u:void 0}},85924:(i,s,u)=>{var m=u(5569)(Object.getPrototypeOf,Object);i.exports=m},89607:(i,s,u)=>{var m=u(62705),v=Object.prototype,_=v.hasOwnProperty,j=v.toString,M=m?m.toStringTag:void 0;i.exports=function getRawTag(i){var s=_.call(i,M),u=i[M];try{i[M]=void 0;var m=!0}catch(i){}var v=j.call(i);return m&&(s?i[M]=u:delete i[M]),v}},99551:(i,s,u)=>{var m=u(34963),v=u(70479),_=Object.prototype.propertyIsEnumerable,j=Object.getOwnPropertySymbols,M=j?function(i){return null==i?[]:(i=Object(i),m(j(i),(function(s){return _.call(i,s)})))}:v;i.exports=M},51442:(i,s,u)=>{var m=u(62488),v=u(85924),_=u(99551),j=u(70479),M=Object.getOwnPropertySymbols?function(i){for(var s=[];i;)m(s,_(i)),i=v(i);return s}:j;i.exports=M},64160:(i,s,u)=>{var m=u(18552),v=u(57071),_=u(53818),j=u(58525),M=u(70577),$=u(44239),W=u(80346),X="[object Map]",Y="[object Promise]",Z="[object Set]",ee="[object WeakMap]",ie="[object DataView]",ae=W(m),le=W(v),ce=W(_),pe=W(j),de=W(M),fe=$;(m&&fe(new m(new ArrayBuffer(1)))!=ie||v&&fe(new v)!=X||_&&fe(_.resolve())!=Y||j&&fe(new j)!=Z||M&&fe(new M)!=ee)&&(fe=function(i){var s=$(i),u="[object Object]"==s?i.constructor:void 0,m=u?W(u):"";if(m)switch(m){case ae:return ie;case le:return X;case ce:return Y;case pe:return Z;case de:return ee}return s}),i.exports=fe},47801:i=>{i.exports=function getValue(i,s){return null==i?void 0:i[s]}},58775:i=>{var s=/\{\n\/\* \[wrapped with (.+)\] \*/,u=/,? & /;i.exports=function getWrapDetails(i){var m=i.match(s);return m?m[1].split(u):[]}},222:(i,s,u)=>{var m=u(71811),v=u(35694),_=u(1469),j=u(65776),M=u(41780),$=u(40327);i.exports=function hasPath(i,s,u){for(var W=-1,X=(s=m(s,i)).length,Y=!1;++W{var s=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");i.exports=function hasUnicode(i){return s.test(i)}},93157:i=>{var s=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;i.exports=function hasUnicodeWord(i){return s.test(i)}},51789:(i,s,u)=>{var m=u(94536);i.exports=function hashClear(){this.__data__=m?m(null):{},this.size=0}},80401:i=>{i.exports=function hashDelete(i){var s=this.has(i)&&delete this.__data__[i];return this.size-=s?1:0,s}},57667:(i,s,u)=>{var m=u(94536),v=Object.prototype.hasOwnProperty;i.exports=function hashGet(i){var s=this.__data__;if(m){var u=s[i];return"__lodash_hash_undefined__"===u?void 0:u}return v.call(s,i)?s[i]:void 0}},21327:(i,s,u)=>{var m=u(94536),v=Object.prototype.hasOwnProperty;i.exports=function hashHas(i){var s=this.__data__;return m?void 0!==s[i]:v.call(s,i)}},81866:(i,s,u)=>{var m=u(94536);i.exports=function hashSet(i,s){var u=this.__data__;return this.size+=this.has(i)?0:1,u[i]=m&&void 0===s?"__lodash_hash_undefined__":s,this}},43824:i=>{var s=Object.prototype.hasOwnProperty;i.exports=function initCloneArray(i){var u=i.length,m=new i.constructor(u);return u&&"string"==typeof i[0]&&s.call(i,"index")&&(m.index=i.index,m.input=i.input),m}},29148:(i,s,u)=>{var m=u(74318),v=u(57157),_=u(93147),j=u(40419),M=u(77133);i.exports=function initCloneByTag(i,s,u){var $=i.constructor;switch(s){case"[object ArrayBuffer]":return m(i);case"[object Boolean]":case"[object Date]":return new $(+i);case"[object DataView]":return v(i,u);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return M(i,u);case"[object Map]":case"[object Set]":return new $;case"[object Number]":case"[object String]":return new $(i);case"[object RegExp]":return _(i);case"[object Symbol]":return j(i)}}},38517:(i,s,u)=>{var m=u(3118),v=u(85924),_=u(25726);i.exports=function initCloneObject(i){return"function"!=typeof i.constructor||_(i)?{}:m(v(i))}},83112:i=>{var s=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;i.exports=function insertWrapDetails(i,u){var m=u.length;if(!m)return i;var v=m-1;return u[v]=(m>1?"& ":"")+u[v],u=u.join(m>2?", ":" "),i.replace(s,"{\n/* [wrapped with "+u+"] */\n")}},37285:(i,s,u)=>{var m=u(62705),v=u(35694),_=u(1469),j=m?m.isConcatSpreadable:void 0;i.exports=function isFlattenable(i){return _(i)||v(i)||!!(j&&i&&i[j])}},65776:i=>{var s=/^(?:0|[1-9]\d*)$/;i.exports=function isIndex(i,u){var m=typeof i;return!!(u=null==u?9007199254740991:u)&&("number"==m||"symbol"!=m&&s.test(i))&&i>-1&&i%1==0&&i{var m=u(77813),v=u(98612),_=u(65776),j=u(13218);i.exports=function isIterateeCall(i,s,u){if(!j(u))return!1;var M=typeof s;return!!("number"==M?v(u)&&_(s,u.length):"string"==M&&s in u)&&m(u[s],i)}},15403:(i,s,u)=>{var m=u(1469),v=u(33448),_=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,j=/^\w*$/;i.exports=function isKey(i,s){if(m(i))return!1;var u=typeof i;return!("number"!=u&&"symbol"!=u&&"boolean"!=u&&null!=i&&!v(i))||(j.test(i)||!_.test(i)||null!=s&&i in Object(s))}},37019:i=>{i.exports=function isKeyable(i){var s=typeof i;return"string"==s||"number"==s||"symbol"==s||"boolean"==s?"__proto__"!==i:null===i}},86528:(i,s,u)=>{var m=u(96425),v=u(66833),_=u(97658),j=u(8111);i.exports=function isLaziable(i){var s=_(i),u=j[s];if("function"!=typeof u||!(s in m.prototype))return!1;if(i===u)return!0;var M=v(u);return!!M&&i===M[0]}},15346:(i,s,u)=>{var m,v=u(14429),_=(m=/[^.]+$/.exec(v&&v.keys&&v.keys.IE_PROTO||""))?"Symbol(src)_1."+m:"";i.exports=function isMasked(i){return!!_&&_ in i}},25726:i=>{var s=Object.prototype;i.exports=function isPrototype(i){var u=i&&i.constructor;return i===("function"==typeof u&&u.prototype||s)}},89162:(i,s,u)=>{var m=u(13218);i.exports=function isStrictComparable(i){return i==i&&!m(i)}},27040:i=>{i.exports=function listCacheClear(){this.__data__=[],this.size=0}},14125:(i,s,u)=>{var m=u(18470),v=Array.prototype.splice;i.exports=function listCacheDelete(i){var s=this.__data__,u=m(s,i);return!(u<0)&&(u==s.length-1?s.pop():v.call(s,u,1),--this.size,!0)}},82117:(i,s,u)=>{var m=u(18470);i.exports=function listCacheGet(i){var s=this.__data__,u=m(s,i);return u<0?void 0:s[u][1]}},67518:(i,s,u)=>{var m=u(18470);i.exports=function listCacheHas(i){return m(this.__data__,i)>-1}},54705:(i,s,u)=>{var m=u(18470);i.exports=function listCacheSet(i,s){var u=this.__data__,v=m(u,i);return v<0?(++this.size,u.push([i,s])):u[v][1]=s,this}},24785:(i,s,u)=>{var m=u(1989),v=u(38407),_=u(57071);i.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new m,map:new(_||v),string:new m}}},11285:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheDelete(i){var s=m(this,i).delete(i);return this.size-=s?1:0,s}},96e3:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheGet(i){return m(this,i).get(i)}},49916:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheHas(i){return m(this,i).has(i)}},95265:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheSet(i,s){var u=m(this,i),v=u.size;return u.set(i,s),this.size+=u.size==v?0:1,this}},68776:i=>{i.exports=function mapToArray(i){var s=-1,u=Array(i.size);return i.forEach((function(i,m){u[++s]=[m,i]})),u}},42634:i=>{i.exports=function matchesStrictComparable(i,s){return function(u){return null!=u&&(u[i]===s&&(void 0!==s||i in Object(u)))}}},24523:(i,s,u)=>{var m=u(88306);i.exports=function memoizeCapped(i){var s=m(i,(function(i){return 500===u.size&&u.clear(),i})),u=s.cache;return s}},63833:(i,s,u)=>{var m=u(52157),v=u(14054),_=u(46460),j="__lodash_placeholder__",M=128,$=Math.min;i.exports=function mergeData(i,s){var u=i[1],W=s[1],X=u|W,Y=X<131,Z=W==M&&8==u||W==M&&256==u&&i[7].length<=s[8]||384==W&&s[7].length<=s[8]&&8==u;if(!Y&&!Z)return i;1&W&&(i[2]=s[2],X|=1&u?0:4);var ee=s[3];if(ee){var ie=i[3];i[3]=ie?m(ie,ee,s[4]):ee,i[4]=ie?_(i[3],j):s[4]}return(ee=s[5])&&(ie=i[5],i[5]=ie?v(ie,ee,s[6]):ee,i[6]=ie?_(i[5],j):s[6]),(ee=s[7])&&(i[7]=ee),W&M&&(i[8]=null==i[8]?s[8]:$(i[8],s[8])),null==i[9]&&(i[9]=s[9]),i[0]=s[0],i[1]=X,i}},89250:(i,s,u)=>{var m=u(70577),v=m&&new m;i.exports=v},94536:(i,s,u)=>{var m=u(10852)(Object,"create");i.exports=m},86916:(i,s,u)=>{var m=u(5569)(Object.keys,Object);i.exports=m},33498:i=>{i.exports=function nativeKeysIn(i){var s=[];if(null!=i)for(var u in Object(i))s.push(u);return s}},31167:(i,s,u)=>{i=u.nmd(i);var m=u(31957),v=s&&!s.nodeType&&s,_=v&&i&&!i.nodeType&&i,j=_&&_.exports===v&&m.process,M=function(){try{var i=_&&_.require&&_.require("util").types;return i||j&&j.binding&&j.binding("util")}catch(i){}}();i.exports=M},2333:i=>{var s=Object.prototype.toString;i.exports=function objectToString(i){return s.call(i)}},5569:i=>{i.exports=function overArg(i,s){return function(u){return i(s(u))}}},45357:(i,s,u)=>{var m=u(96874),v=Math.max;i.exports=function overRest(i,s,u){return s=v(void 0===s?i.length-1:s,0),function(){for(var _=arguments,j=-1,M=v(_.length-s,0),$=Array(M);++j{var m=u(97786),v=u(14259);i.exports=function parent(i,s){return s.length<2?i:m(i,v(s,0,-1))}},52060:i=>{i.exports={}},90451:(i,s,u)=>{var m=u(278),v=u(65776),_=Math.min;i.exports=function reorder(i,s){for(var u=i.length,j=_(s.length,u),M=m(i);j--;){var $=s[j];i[j]=v($,u)?M[$]:void 0}return i}},46460:i=>{var s="__lodash_placeholder__";i.exports=function replaceHolders(i,u){for(var m=-1,v=i.length,_=0,j=[];++m{var m=u(31957),v="object"==typeof self&&self&&self.Object===Object&&self,_=m||v||Function("return this")();i.exports=_},36390:i=>{i.exports=function safeGet(i,s){if(("constructor"!==s||"function"!=typeof i[s])&&"__proto__"!=s)return i[s]}},90619:i=>{i.exports=function setCacheAdd(i){return this.__data__.set(i,"__lodash_hash_undefined__"),this}},72385:i=>{i.exports=function setCacheHas(i){return this.__data__.has(i)}},258:(i,s,u)=>{var m=u(28045),v=u(21275)(m);i.exports=v},21814:i=>{i.exports=function setToArray(i){var s=-1,u=Array(i.size);return i.forEach((function(i){u[++s]=i})),u}},30061:(i,s,u)=>{var m=u(56560),v=u(21275)(m);i.exports=v},69255:(i,s,u)=>{var m=u(58775),v=u(83112),_=u(30061),j=u(87241);i.exports=function setWrapToString(i,s,u){var M=s+"";return _(i,v(M,j(m(M),u)))}},21275:i=>{var s=Date.now;i.exports=function shortOut(i){var u=0,m=0;return function(){var v=s(),_=16-(v-m);if(m=v,_>0){if(++u>=800)return arguments[0]}else u=0;return i.apply(void 0,arguments)}}},37465:(i,s,u)=>{var m=u(38407);i.exports=function stackClear(){this.__data__=new m,this.size=0}},63779:i=>{i.exports=function stackDelete(i){var s=this.__data__,u=s.delete(i);return this.size=s.size,u}},67599:i=>{i.exports=function stackGet(i){return this.__data__.get(i)}},44758:i=>{i.exports=function stackHas(i){return this.__data__.has(i)}},34309:(i,s,u)=>{var m=u(38407),v=u(57071),_=u(83369);i.exports=function stackSet(i,s){var u=this.__data__;if(u instanceof m){var j=u.__data__;if(!v||j.length<199)return j.push([i,s]),this.size=++u.size,this;u=this.__data__=new _(j)}return u.set(i,s),this.size=u.size,this}},42351:i=>{i.exports=function strictIndexOf(i,s,u){for(var m=u-1,v=i.length;++m{var m=u(44286),v=u(62689),_=u(676);i.exports=function stringToArray(i){return v(i)?_(i):m(i)}},55514:(i,s,u)=>{var m=u(24523),v=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,_=/\\(\\)?/g,j=m((function(i){var s=[];return 46===i.charCodeAt(0)&&s.push(""),i.replace(v,(function(i,u,m,v){s.push(m?v.replace(_,"$1"):u||i)})),s}));i.exports=j},40327:(i,s,u)=>{var m=u(33448);i.exports=function toKey(i){if("string"==typeof i||m(i))return i;var s=i+"";return"0"==s&&1/i==-Infinity?"-0":s}},80346:i=>{var s=Function.prototype.toString;i.exports=function toSource(i){if(null!=i){try{return s.call(i)}catch(i){}try{return i+""}catch(i){}}return""}},67990:i=>{var s=/\s/;i.exports=function trimmedEndIndex(i){for(var u=i.length;u--&&s.test(i.charAt(u)););return u}},676:i=>{var s="\\ud800-\\udfff",u="["+s+"]",m="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",v="\\ud83c[\\udffb-\\udfff]",_="[^"+s+"]",j="(?:\\ud83c[\\udde6-\\uddff]){2}",M="[\\ud800-\\udbff][\\udc00-\\udfff]",$="(?:"+m+"|"+v+")"+"?",W="[\\ufe0e\\ufe0f]?",X=W+$+("(?:\\u200d(?:"+[_,j,M].join("|")+")"+W+$+")*"),Y="(?:"+[_+m+"?",m,j,M,u].join("|")+")",Z=RegExp(v+"(?="+v+")|"+Y+X,"g");i.exports=function unicodeToArray(i){return i.match(Z)||[]}},2757:i=>{var s="\\ud800-\\udfff",u="\\u2700-\\u27bf",m="a-z\\xdf-\\xf6\\xf8-\\xff",v="A-Z\\xc0-\\xd6\\xd8-\\xde",_="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",j="["+_+"]",M="\\d+",$="["+u+"]",W="["+m+"]",X="[^"+s+_+M+u+m+v+"]",Y="(?:\\ud83c[\\udde6-\\uddff]){2}",Z="[\\ud800-\\udbff][\\udc00-\\udfff]",ee="["+v+"]",ie="(?:"+W+"|"+X+")",ae="(?:"+ee+"|"+X+")",le="(?:['’](?:d|ll|m|re|s|t|ve))?",ce="(?:['’](?:D|LL|M|RE|S|T|VE))?",pe="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",de="[\\ufe0e\\ufe0f]?",fe=de+pe+("(?:\\u200d(?:"+["[^"+s+"]",Y,Z].join("|")+")"+de+pe+")*"),ye="(?:"+[$,Y,Z].join("|")+")"+fe,be=RegExp([ee+"?"+W+"+"+le+"(?="+[j,ee,"$"].join("|")+")",ae+"+"+ce+"(?="+[j,ee+ie,"$"].join("|")+")",ee+"?"+ie+"+"+le,ee+"+"+ce,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",M,ye].join("|"),"g");i.exports=function unicodeWords(i){return i.match(be)||[]}},87241:(i,s,u)=>{var m=u(77412),v=u(47443),_=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];i.exports=function updateWrapDetails(i,s){return m(_,(function(u){var m="_."+u[0];s&u[1]&&!v(i,m)&&i.push(m)})),i.sort()}},21913:(i,s,u)=>{var m=u(96425),v=u(7548),_=u(278);i.exports=function wrapperClone(i){if(i instanceof m)return i.clone();var s=new v(i.__wrapped__,i.__chain__);return s.__actions__=_(i.__actions__),s.__index__=i.__index__,s.__values__=i.__values__,s}},39514:(i,s,u)=>{var m=u(97727);i.exports=function ary(i,s,u){return s=u?void 0:s,s=i&&null==s?i.length:s,m(i,128,void 0,void 0,void 0,void 0,s)}},68929:(i,s,u)=>{var m=u(48403),v=u(35393)((function(i,s,u){return s=s.toLowerCase(),i+(u?m(s):s)}));i.exports=v},48403:(i,s,u)=>{var m=u(79833),v=u(11700);i.exports=function capitalize(i){return v(m(i).toLowerCase())}},66678:(i,s,u)=>{var m=u(85990);i.exports=function clone(i){return m(i,4)}},75703:i=>{i.exports=function constant(i){return function(){return i}}},40087:(i,s,u)=>{var m=u(97727);function curry(i,s,u){var v=m(i,8,void 0,void 0,void 0,void 0,void 0,s=u?void 0:s);return v.placeholder=curry.placeholder,v}curry.placeholder={},i.exports=curry},23279:(i,s,u)=>{var m=u(13218),v=u(7771),_=u(14841),j=Math.max,M=Math.min;i.exports=function debounce(i,s,u){var $,W,X,Y,Z,ee,ie=0,ae=!1,le=!1,ce=!0;if("function"!=typeof i)throw new TypeError("Expected a function");function invokeFunc(s){var u=$,m=W;return $=W=void 0,ie=s,Y=i.apply(m,u)}function shouldInvoke(i){var u=i-ee;return void 0===ee||u>=s||u<0||le&&i-ie>=X}function timerExpired(){var i=v();if(shouldInvoke(i))return trailingEdge(i);Z=setTimeout(timerExpired,function remainingWait(i){var u=s-(i-ee);return le?M(u,X-(i-ie)):u}(i))}function trailingEdge(i){return Z=void 0,ce&&$?invokeFunc(i):($=W=void 0,Y)}function debounced(){var i=v(),u=shouldInvoke(i);if($=arguments,W=this,ee=i,u){if(void 0===Z)return function leadingEdge(i){return ie=i,Z=setTimeout(timerExpired,s),ae?invokeFunc(i):Y}(ee);if(le)return clearTimeout(Z),Z=setTimeout(timerExpired,s),invokeFunc(ee)}return void 0===Z&&(Z=setTimeout(timerExpired,s)),Y}return s=_(s)||0,m(u)&&(ae=!!u.leading,X=(le="maxWait"in u)?j(_(u.maxWait)||0,s):X,ce="trailing"in u?!!u.trailing:ce),debounced.cancel=function cancel(){void 0!==Z&&clearTimeout(Z),ie=0,$=ee=W=Z=void 0},debounced.flush=function flush(){return void 0===Z?Y:trailingEdge(v())},debounced}},53816:(i,s,u)=>{var m=u(69389),v=u(79833),_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,j=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");i.exports=function deburr(i){return(i=v(i))&&i.replace(_,m).replace(j,"")}},77813:i=>{i.exports=function eq(i,s){return i===s||i!=i&&s!=s}},13311:(i,s,u)=>{var m=u(67740)(u(30998));i.exports=m},30998:(i,s,u)=>{var m=u(41848),v=u(67206),_=u(40554),j=Math.max;i.exports=function findIndex(i,s,u){var M=null==i?0:i.length;if(!M)return-1;var $=null==u?0:_(u);return $<0&&($=j(M+$,0)),m(i,v(s,3),$)}},85564:(i,s,u)=>{var m=u(21078);i.exports=function flatten(i){return(null==i?0:i.length)?m(i,1):[]}},84599:(i,s,u)=>{var m=u(68836),v=u(69306),_=Array.prototype.push;function baseAry(i,s){return 2==s?function(s,u){return i(s,u)}:function(s){return i(s)}}function cloneArray(i){for(var s=i?i.length:0,u=Array(s);s--;)u[s]=i[s];return u}function wrapImmutable(i,s){return function(){var u=arguments.length;if(u){for(var m=Array(u);u--;)m[u]=arguments[u];var v=m[0]=s.apply(void 0,m);return i.apply(void 0,m),v}}}i.exports=function baseConvert(i,s,u,j){var M="function"==typeof s,$=s===Object(s);if($&&(j=u,u=s,s=void 0),null==u)throw new TypeError;j||(j={});var W={cap:!("cap"in j)||j.cap,curry:!("curry"in j)||j.curry,fixed:!("fixed"in j)||j.fixed,immutable:!("immutable"in j)||j.immutable,rearg:!("rearg"in j)||j.rearg},X=M?u:v,Y="curry"in j&&j.curry,Z="fixed"in j&&j.fixed,ee="rearg"in j&&j.rearg,ie=M?u.runInContext():void 0,ae=M?u:{ary:i.ary,assign:i.assign,clone:i.clone,curry:i.curry,forEach:i.forEach,isArray:i.isArray,isError:i.isError,isFunction:i.isFunction,isWeakMap:i.isWeakMap,iteratee:i.iteratee,keys:i.keys,rearg:i.rearg,toInteger:i.toInteger,toPath:i.toPath},le=ae.ary,ce=ae.assign,pe=ae.clone,de=ae.curry,fe=ae.forEach,ye=ae.isArray,be=ae.isError,_e=ae.isFunction,we=ae.isWeakMap,Se=ae.keys,xe=ae.rearg,Ie=ae.toInteger,Pe=ae.toPath,Te=Se(m.aryMethod),Re={castArray:function(i){return function(){var s=arguments[0];return ye(s)?i(cloneArray(s)):i.apply(void 0,arguments)}},iteratee:function(i){return function(){var s=arguments[1],u=i(arguments[0],s),m=u.length;return W.cap&&"number"==typeof s?(s=s>2?s-2:1,m&&m<=s?u:baseAry(u,s)):u}},mixin:function(i){return function(s){var u=this;if(!_e(u))return i(u,Object(s));var m=[];return fe(Se(s),(function(i){_e(s[i])&&m.push([i,u.prototype[i]])})),i(u,Object(s)),fe(m,(function(i){var s=i[1];_e(s)?u.prototype[i[0]]=s:delete u.prototype[i[0]]})),u}},nthArg:function(i){return function(s){var u=s<0?1:Ie(s)+1;return de(i(s),u)}},rearg:function(i){return function(s,u){var m=u?u.length:0;return de(i(s,u),m)}},runInContext:function(s){return function(u){return baseConvert(i,s(u),j)}}};function castCap(i,s){if(W.cap){var u=m.iterateeRearg[i];if(u)return function iterateeRearg(i,s){return overArg(i,(function(i){var u=s.length;return function baseArity(i,s){return 2==s?function(s,u){return i.apply(void 0,arguments)}:function(s){return i.apply(void 0,arguments)}}(xe(baseAry(i,u),s),u)}))}(s,u);var v=!M&&m.iterateeAry[i];if(v)return function iterateeAry(i,s){return overArg(i,(function(i){return"function"==typeof i?baseAry(i,s):i}))}(s,v)}return s}function castFixed(i,s,u){if(W.fixed&&(Z||!m.skipFixed[i])){var v=m.methodSpread[i],j=v&&v.start;return void 0===j?le(s,u):function flatSpread(i,s){return function(){for(var u=arguments.length,m=u-1,v=Array(u);u--;)v[u]=arguments[u];var j=v[s],M=v.slice(0,s);return j&&_.apply(M,j),s!=m&&_.apply(M,v.slice(s+1)),i.apply(this,M)}}(s,j)}return s}function castRearg(i,s,u){return W.rearg&&u>1&&(ee||!m.skipRearg[i])?xe(s,m.methodRearg[i]||m.aryRearg[u]):s}function cloneByPath(i,s){for(var u=-1,m=(s=Pe(s)).length,v=m-1,_=pe(Object(i)),j=_;null!=j&&++u1?de(s,u):s}(0,v=castCap(_,v),i),!1}})),!v})),v||(v=j),v==s&&(v=Y?de(v,1):function(){return s.apply(this,arguments)}),v.convert=createConverter(_,s),v.placeholder=s.placeholder=u,v}if(!$)return wrap(s,u,X);var qe=u,ze=[];return fe(Te,(function(i){fe(m.aryMethod[i],(function(i){var s=qe[m.remap[i]||i];s&&ze.push([i,wrap(i,s,qe)])}))})),fe(Se(qe),(function(i){var s=qe[i];if("function"==typeof s){for(var u=ze.length;u--;)if(ze[u][0]==i)return;s.convert=createConverter(i,s),ze.push([i,s])}})),fe(ze,(function(i){qe[i[0]]=i[1]})),qe.convert=function convertLib(i){return qe.runInContext.convert(i)(void 0)},qe.placeholder=qe,fe(Se(qe),(function(i){fe(m.realToAlias[i]||[],(function(s){qe[s]=qe[i]}))})),qe}},68836:(i,s)=>{s.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},s.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},s.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},s.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},s.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},s.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},s.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},s.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},s.realToAlias=function(){var i=Object.prototype.hasOwnProperty,u=s.aliasToReal,m={};for(var v in u){var _=u[v];i.call(m,_)?m[_].push(v):m[_]=[v]}return m}(),s.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},s.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},s.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},4269:(i,s,u)=>{i.exports={ary:u(39514),assign:u(44037),clone:u(66678),curry:u(40087),forEach:u(77412),isArray:u(1469),isError:u(64647),isFunction:u(23560),isWeakMap:u(81018),iteratee:u(72594),keys:u(280),rearg:u(4963),toInteger:u(40554),toPath:u(30084)}},72700:(i,s,u)=>{i.exports=u(28252)},92822:(i,s,u)=>{var m=u(84599),v=u(4269);i.exports=function convert(i,s,u){return m(v,i,s,u)}},69306:i=>{i.exports={}},28252:(i,s,u)=>{var m=u(92822)("set",u(36968));m.placeholder=u(69306),i.exports=m},27361:(i,s,u)=>{var m=u(97786);i.exports=function get(i,s,u){var v=null==i?void 0:m(i,s);return void 0===v?u:v}},79095:(i,s,u)=>{var m=u(13),v=u(222);i.exports=function hasIn(i,s){return null!=i&&v(i,s,m)}},6557:i=>{i.exports=function identity(i){return i}},35694:(i,s,u)=>{var m=u(9454),v=u(37005),_=Object.prototype,j=_.hasOwnProperty,M=_.propertyIsEnumerable,$=m(function(){return arguments}())?m:function(i){return v(i)&&j.call(i,"callee")&&!M.call(i,"callee")};i.exports=$},1469:i=>{var s=Array.isArray;i.exports=s},98612:(i,s,u)=>{var m=u(23560),v=u(41780);i.exports=function isArrayLike(i){return null!=i&&v(i.length)&&!m(i)}},29246:(i,s,u)=>{var m=u(98612),v=u(37005);i.exports=function isArrayLikeObject(i){return v(i)&&m(i)}},51584:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isBoolean(i){return!0===i||!1===i||v(i)&&"[object Boolean]"==m(i)}},44144:(i,s,u)=>{i=u.nmd(i);var m=u(55639),v=u(95062),_=s&&!s.nodeType&&s,j=_&&i&&!i.nodeType&&i,M=j&&j.exports===_?m.Buffer:void 0,$=(M?M.isBuffer:void 0)||v;i.exports=$},41609:(i,s,u)=>{var m=u(280),v=u(64160),_=u(35694),j=u(1469),M=u(98612),$=u(44144),W=u(25726),X=u(36719),Y=Object.prototype.hasOwnProperty;i.exports=function isEmpty(i){if(null==i)return!0;if(M(i)&&(j(i)||"string"==typeof i||"function"==typeof i.splice||$(i)||X(i)||_(i)))return!i.length;var s=v(i);if("[object Map]"==s||"[object Set]"==s)return!i.size;if(W(i))return!m(i).length;for(var u in i)if(Y.call(i,u))return!1;return!0}},18446:(i,s,u)=>{var m=u(90939);i.exports=function isEqual(i,s){return m(i,s)}},64647:(i,s,u)=>{var m=u(44239),v=u(37005),_=u(68630);i.exports=function isError(i){if(!v(i))return!1;var s=m(i);return"[object Error]"==s||"[object DOMException]"==s||"string"==typeof i.message&&"string"==typeof i.name&&!_(i)}},23560:(i,s,u)=>{var m=u(44239),v=u(13218);i.exports=function isFunction(i){if(!v(i))return!1;var s=m(i);return"[object Function]"==s||"[object GeneratorFunction]"==s||"[object AsyncFunction]"==s||"[object Proxy]"==s}},41780:i=>{i.exports=function isLength(i){return"number"==typeof i&&i>-1&&i%1==0&&i<=9007199254740991}},56688:(i,s,u)=>{var m=u(25588),v=u(7518),_=u(31167),j=_&&_.isMap,M=j?v(j):m;i.exports=M},45220:i=>{i.exports=function isNull(i){return null===i}},81763:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isNumber(i){return"number"==typeof i||v(i)&&"[object Number]"==m(i)}},13218:i=>{i.exports=function isObject(i){var s=typeof i;return null!=i&&("object"==s||"function"==s)}},37005:i=>{i.exports=function isObjectLike(i){return null!=i&&"object"==typeof i}},68630:(i,s,u)=>{var m=u(44239),v=u(85924),_=u(37005),j=Function.prototype,M=Object.prototype,$=j.toString,W=M.hasOwnProperty,X=$.call(Object);i.exports=function isPlainObject(i){if(!_(i)||"[object Object]"!=m(i))return!1;var s=v(i);if(null===s)return!0;var u=W.call(s,"constructor")&&s.constructor;return"function"==typeof u&&u instanceof u&&$.call(u)==X}},72928:(i,s,u)=>{var m=u(29221),v=u(7518),_=u(31167),j=_&&_.isSet,M=j?v(j):m;i.exports=M},47037:(i,s,u)=>{var m=u(44239),v=u(1469),_=u(37005);i.exports=function isString(i){return"string"==typeof i||!v(i)&&_(i)&&"[object String]"==m(i)}},33448:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isSymbol(i){return"symbol"==typeof i||v(i)&&"[object Symbol]"==m(i)}},36719:(i,s,u)=>{var m=u(38749),v=u(7518),_=u(31167),j=_&&_.isTypedArray,M=j?v(j):m;i.exports=M},81018:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function isWeakMap(i){return v(i)&&"[object WeakMap]"==m(i)}},72594:(i,s,u)=>{var m=u(85990),v=u(67206);i.exports=function iteratee(i){return v("function"==typeof i?i:m(i,1))}},3674:(i,s,u)=>{var m=u(14636),v=u(280),_=u(98612);i.exports=function keys(i){return _(i)?m(i):v(i)}},81704:(i,s,u)=>{var m=u(14636),v=u(10313),_=u(98612);i.exports=function keysIn(i){return _(i)?m(i,!0):v(i)}},10928:i=>{i.exports=function last(i){var s=null==i?0:i.length;return s?i[s-1]:void 0}},88306:(i,s,u)=>{var m=u(83369);function memoize(i,s){if("function"!=typeof i||null!=s&&"function"!=typeof s)throw new TypeError("Expected a function");var memoized=function(){var u=arguments,m=s?s.apply(this,u):u[0],v=memoized.cache;if(v.has(m))return v.get(m);var _=i.apply(this,u);return memoized.cache=v.set(m,_)||v,_};return memoized.cache=new(memoize.Cache||m),memoized}memoize.Cache=m,i.exports=memoize},82492:(i,s,u)=>{var m=u(42980),v=u(21463)((function(i,s,u){m(i,s,u)}));i.exports=v},94885:i=>{i.exports=function negate(i){if("function"!=typeof i)throw new TypeError("Expected a function");return function(){var s=arguments;switch(s.length){case 0:return!i.call(this);case 1:return!i.call(this,s[0]);case 2:return!i.call(this,s[0],s[1]);case 3:return!i.call(this,s[0],s[1],s[2])}return!i.apply(this,s)}}},50308:i=>{i.exports=function noop(){}},7771:(i,s,u)=>{var m=u(55639);i.exports=function(){return m.Date.now()}},57557:(i,s,u)=>{var m=u(29932),v=u(85990),_=u(57406),j=u(71811),M=u(98363),$=u(60696),W=u(99021),X=u(46904),Y=W((function(i,s){var u={};if(null==i)return u;var W=!1;s=m(s,(function(s){return s=j(s,i),W||(W=s.length>1),s})),M(i,X(i),u),W&&(u=v(u,7,$));for(var Y=s.length;Y--;)_(u,s[Y]);return u}));i.exports=Y},39601:(i,s,u)=>{var m=u(40371),v=u(79152),_=u(15403),j=u(40327);i.exports=function property(i){return _(i)?m(j(i)):v(i)}},4963:(i,s,u)=>{var m=u(97727),v=u(99021),_=v((function(i,s){return m(i,256,void 0,void 0,void 0,s)}));i.exports=_},54061:(i,s,u)=>{var m=u(62663),v=u(89881),_=u(67206),j=u(10107),M=u(1469);i.exports=function reduce(i,s,u){var $=M(i)?m:j,W=arguments.length<3;return $(i,_(s,4),u,W,v)}},36968:(i,s,u)=>{var m=u(10611);i.exports=function set(i,s,u){return null==i?i:m(i,s,u)}},59704:(i,s,u)=>{var m=u(82908),v=u(67206),_=u(5076),j=u(1469),M=u(16612);i.exports=function some(i,s,u){var $=j(i)?m:_;return u&&M(i,s,u)&&(s=void 0),$(i,v(s,3))}},70479:i=>{i.exports=function stubArray(){return[]}},95062:i=>{i.exports=function stubFalse(){return!1}},18601:(i,s,u)=>{var m=u(14841),v=1/0;i.exports=function toFinite(i){return i?(i=m(i))===v||i===-1/0?17976931348623157e292*(i<0?-1:1):i==i?i:0:0===i?i:0}},40554:(i,s,u)=>{var m=u(18601);i.exports=function toInteger(i){var s=m(i),u=s%1;return s==s?u?s-u:s:0}},7334:(i,s,u)=>{var m=u(79833);i.exports=function toLower(i){return m(i).toLowerCase()}},14841:(i,s,u)=>{var m=u(27561),v=u(13218),_=u(33448),j=/^[-+]0x[0-9a-f]+$/i,M=/^0b[01]+$/i,$=/^0o[0-7]+$/i,W=parseInt;i.exports=function toNumber(i){if("number"==typeof i)return i;if(_(i))return NaN;if(v(i)){var s="function"==typeof i.valueOf?i.valueOf():i;i=v(s)?s+"":s}if("string"!=typeof i)return 0===i?i:+i;i=m(i);var u=M.test(i);return u||$.test(i)?W(i.slice(2),u?2:8):j.test(i)?NaN:+i}},30084:(i,s,u)=>{var m=u(29932),v=u(278),_=u(1469),j=u(33448),M=u(55514),$=u(40327),W=u(79833);i.exports=function toPath(i){return _(i)?m(i,$):j(i)?[i]:v(M(W(i)))}},59881:(i,s,u)=>{var m=u(98363),v=u(81704);i.exports=function toPlainObject(i){return m(i,v(i))}},79833:(i,s,u)=>{var m=u(80531);i.exports=function toString(i){return null==i?"":m(i)}},11700:(i,s,u)=>{var m=u(98805)("toUpperCase");i.exports=m},58748:(i,s,u)=>{var m=u(49029),v=u(93157),_=u(79833),j=u(2757);i.exports=function words(i,s,u){return i=_(i),void 0===(s=u?void 0:s)?v(i)?j(i):m(i):i.match(s)||[]}},8111:(i,s,u)=>{var m=u(96425),v=u(7548),_=u(9435),j=u(1469),M=u(37005),$=u(21913),W=Object.prototype.hasOwnProperty;function lodash(i){if(M(i)&&!j(i)&&!(i instanceof m)){if(i instanceof v)return i;if(W.call(i,"__wrapped__"))return $(i)}return new v(i)}lodash.prototype=_.prototype,lodash.prototype.constructor=lodash,i.exports=lodash},7287:(i,s,u)=>{var m=u(34865),v=u(1757);i.exports=function zipObject(i,s){return v(i||[],s||[],m)}},96470:(i,s,u)=>{"use strict";var m=u(47802),v=u(21102);s.highlight=highlight,s.highlightAuto=function highlightAuto(i,s){var u,j,M,$,W=s||{},X=W.subset||m.listLanguages(),Y=W.prefix,Z=X.length,ee=-1;null==Y&&(Y=_);if("string"!=typeof i)throw v("Expected `string` for value, got `%s`",i);j={relevance:0,language:null,value:[]},u={relevance:0,language:null,value:[]};for(;++eej.relevance&&(j=M),M.relevance>u.relevance&&(j=u,u=M));j.language&&(u.secondBest=j);return u},s.registerLanguage=function registerLanguage(i,s){m.registerLanguage(i,s)},s.listLanguages=function listLanguages(){return m.listLanguages()},s.registerAlias=function registerAlias(i,s){var u,v=i;s&&((v={})[i]=s);for(u in v)m.registerAliases(v[u],{languageName:u})},Emitter.prototype.addText=function text(i){var s,u,m=this.stack;if(""===i)return;s=m[m.length-1],(u=s.children[s.children.length-1])&&"text"===u.type?u.value+=i:s.children.push({type:"text",value:i})},Emitter.prototype.addKeyword=function addKeyword(i,s){this.openNode(s),this.addText(i),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(i,s){var u=this.stack,m=u[u.length-1],v=i.rootNode.children,_=s?{type:"element",tagName:"span",properties:{className:[s]},children:v}:v;m.children=m.children.concat(_)},Emitter.prototype.openNode=function open(i){var s=this.stack,u=this.options.classPrefix+i,m=s[s.length-1],v={type:"element",tagName:"span",properties:{className:[u]},children:[]};m.children.push(v),s.push(v)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var _="hljs-";function highlight(i,s,u){var j,M=m.configure({}),$=(u||{}).prefix;if("string"!=typeof i)throw v("Expected `string` for name, got `%s`",i);if(!m.getLanguage(i))throw v("Unknown language: `%s` is not registered",i);if("string"!=typeof s)throw v("Expected `string` for value, got `%s`",s);if(null==$&&($=_),m.configure({__emitter:Emitter,classPrefix:$}),j=m.highlight(s,{language:i,ignoreIllegals:!0}),m.configure(M||{}),j.errorRaised)throw j.errorRaised;return{relevance:j.relevance,language:j.language,value:j.emitter.rootNode.children}}function Emitter(i){this.options=i,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},42566:(i,s,u)=>{const m=u(94885);function coerceElementMatchingCallback(i){return"string"==typeof i?s=>s.element===i:i.constructor&&i.extend?s=>s instanceof i:i}class ArraySlice{constructor(i){this.elements=i||[]}toValue(){return this.elements.map((i=>i.toValue()))}map(i,s){return this.elements.map(i,s)}flatMap(i,s){return this.map(i,s).reduce(((i,s)=>i.concat(s)),[])}compactMap(i,s){const u=[];return this.forEach((m=>{const v=i.bind(s)(m);v&&u.push(v)})),u}filter(i,s){return i=coerceElementMatchingCallback(i),new ArraySlice(this.elements.filter(i,s))}reject(i,s){return i=coerceElementMatchingCallback(i),new ArraySlice(this.elements.filter(m(i),s))}find(i,s){return i=coerceElementMatchingCallback(i),this.elements.find(i,s)}forEach(i,s){this.elements.forEach(i,s)}reduce(i,s){return this.elements.reduce(i,s)}includes(i){return this.elements.some((s=>s.equals(i)))}shift(){return this.elements.shift()}unshift(i){this.elements.unshift(this.refract(i))}push(i){return this.elements.push(this.refract(i)),this}add(i){this.push(i)}get(i){return this.elements[i]}getValue(i){const s=this.elements[i];if(s)return s.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),i.exports=ArraySlice},17645:i=>{class KeyValuePair{constructor(i,s){this.key=i,this.value=s}clone(){const i=new KeyValuePair;return this.key&&(i.key=this.key.clone()),this.value&&(i.value=this.value.clone()),i}}i.exports=KeyValuePair},78520:(i,s,u)=>{const m=u(45220),v=u(47037),_=u(81763),j=u(51584),M=u(13218),$=u(28219),W=u(99829);class Namespace{constructor(i){this.elementMap={},this.elementDetection=[],this.Element=W.Element,this.KeyValuePair=W.KeyValuePair,i&&i.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(i){return i.namespace&&i.namespace({base:this}),i.load&&i.load({base:this}),this}useDefault(){return this.register("null",W.NullElement).register("string",W.StringElement).register("number",W.NumberElement).register("boolean",W.BooleanElement).register("array",W.ArrayElement).register("object",W.ObjectElement).register("member",W.MemberElement).register("ref",W.RefElement).register("link",W.LinkElement),this.detect(m,W.NullElement,!1).detect(v,W.StringElement,!1).detect(_,W.NumberElement,!1).detect(j,W.BooleanElement,!1).detect(Array.isArray,W.ArrayElement,!1).detect(M,W.ObjectElement,!1),this}register(i,s){return this._elements=void 0,this.elementMap[i]=s,this}unregister(i){return this._elements=void 0,delete this.elementMap[i],this}detect(i,s,u){return void 0===u||u?this.elementDetection.unshift([i,s]):this.elementDetection.push([i,s]),this}toElement(i){if(i instanceof this.Element)return i;let s;for(let u=0;u{const s=i[0].toUpperCase()+i.substr(1);this._elements[s]=this.elementMap[i]}))),this._elements}get serialiser(){return new $(this)}}$.prototype.Namespace=Namespace,i.exports=Namespace},87526:(i,s,u)=>{const m=u(94885),v=u(42566);class ObjectSlice extends v{map(i,s){return this.elements.map((u=>i.bind(s)(u.value,u.key,u)))}filter(i,s){return new ObjectSlice(this.elements.filter((u=>i.bind(s)(u.value,u.key,u))))}reject(i,s){return this.filter(m(i.bind(s)))}forEach(i,s){return this.elements.forEach(((u,m)=>{i.bind(s)(u.value,u.key,u,m)}))}keys(){return this.map(((i,s)=>s.toValue()))}values(){return this.map((i=>i.toValue()))}}i.exports=ObjectSlice},99829:(i,s,u)=>{const m=u(3079),v=u(96295),_=u(16036),j=u(91090),M=u(18866),$=u(35804),W=u(5946),X=u(76735),Y=u(59964),Z=u(38588),ee=u(42566),ie=u(87526),ae=u(17645);function refract(i){if(i instanceof m)return i;if("string"==typeof i)return new _(i);if("number"==typeof i)return new j(i);if("boolean"==typeof i)return new M(i);if(null===i)return new v;if(Array.isArray(i))return new $(i.map(refract));if("object"==typeof i){return new X(i)}return i}m.prototype.ObjectElement=X,m.prototype.RefElement=Z,m.prototype.MemberElement=W,m.prototype.refract=refract,ee.prototype.refract=refract,i.exports={Element:m,NullElement:v,StringElement:_,NumberElement:j,BooleanElement:M,ArrayElement:$,MemberElement:W,ObjectElement:X,LinkElement:Y,RefElement:Z,refract,ArraySlice:ee,ObjectSlice:ie,KeyValuePair:ae}},59964:(i,s,u)=>{const m=u(3079);i.exports=class LinkElement extends m{constructor(i,s,u){super(i||[],s,u),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(i){this.attributes.set("relation",i)}get href(){return this.attributes.get("href")}set href(i){this.attributes.set("href",i)}}},38588:(i,s,u)=>{const m=u(3079);i.exports=class RefElement extends m{constructor(i,s,u){super(i||[],s,u),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(i){this.attributes.set("path",i)}}},43500:(i,s,u)=>{const m=u(78520),v=u(99829);s.lS=m,s.KeyValuePair=u(17645),s.O4=v.ArraySlice,s.rm=v.ObjectSlice,s.W_=v.Element,s.RP=v.StringElement,s.VL=v.NumberElement,s.hh=v.BooleanElement,s.zr=v.NullElement,s.ON=v.ArrayElement,s.Sb=v.ObjectElement,s.c6=v.MemberElement,s.tK=v.RefElement,s.EA=v.LinkElement,s.Qc=v.refract,u(28219),u(3414)},35804:(i,s,u)=>{const m=u(94885),v=u(3079),_=u(42566);class ArrayElement extends v{constructor(i,s,u){super(i||[],s,u),this.element="array"}primitive(){return"array"}get(i){return this.content[i]}getValue(i){const s=this.get(i);if(s)return s.toValue()}getIndex(i){return this.content[i]}set(i,s){return this.content[i]=this.refract(s),this}remove(i){const s=this.content.splice(i,1);return s.length?s[0]:null}map(i,s){return this.content.map(i,s)}flatMap(i,s){return this.map(i,s).reduce(((i,s)=>i.concat(s)),[])}compactMap(i,s){const u=[];return this.forEach((m=>{const v=i.bind(s)(m);v&&u.push(v)})),u}filter(i,s){return new _(this.content.filter(i,s))}reject(i,s){return this.filter(m(i),s)}reduce(i,s){let u,m;void 0!==s?(u=0,m=this.refract(s)):(u=1,m="object"===this.primitive()?this.first.value:this.first);for(let s=u;s{i.bind(s)(u,this.refract(m))}))}shift(){return this.content.shift()}unshift(i){this.content.unshift(this.refract(i))}push(i){return this.content.push(this.refract(i)),this}add(i){this.push(i)}findElements(i,s){const u=s||{},m=!!u.recursive,v=void 0===u.results?[]:u.results;return this.forEach(((s,u,_)=>{m&&void 0!==s.findElements&&s.findElements(i,{results:v,recursive:m}),i(s,u,_)&&v.push(s)})),v}find(i){return new _(this.findElements(i,{recursive:!0}))}findByElement(i){return this.find((s=>s.element===i))}findByClass(i){return this.find((s=>s.classes.includes(i)))}getById(i){return this.find((s=>s.id.toValue()===i)).first}includes(i){return this.content.some((s=>s.equals(i)))}contains(i){return this.includes(i)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(i){return new this.constructor(this.content.concat(i.content))}"fantasy-land/concat"(i){return this.concat(i)}"fantasy-land/map"(i){return new this.constructor(this.map(i))}"fantasy-land/chain"(i){return this.map((s=>i(s)),this).reduce(((i,s)=>i.concat(s)),this.empty())}"fantasy-land/filter"(i){return new this.constructor(this.content.filter(i))}"fantasy-land/reduce"(i,s){return this.content.reduce(i,s)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),i.exports=ArrayElement},18866:(i,s,u)=>{const m=u(3079);i.exports=class BooleanElement extends m{constructor(i,s,u){super(i,s,u),this.element="boolean"}primitive(){return"boolean"}}},3079:(i,s,u)=>{const m=u(18446),v=u(17645),_=u(42566);class Element{constructor(i,s,u){s&&(this.meta=s),u&&(this.attributes=u),this.content=i}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((i=>{i.parent=this,i.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const i=new this.constructor;return i.element=this.element,this.meta.length&&(i._meta=this.meta.clone()),this.attributes.length&&(i._attributes=this.attributes.clone()),this.content?this.content.clone?i.content=this.content.clone():Array.isArray(this.content)?i.content=this.content.map((i=>i.clone())):i.content=this.content:i.content=this.content,i}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof v?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((i=>i.toValue()),this):this.content}toRef(i){if(""===this.id.toValue())throw Error("Cannot create user-guide to an element that does not contain an ID");const s=new this.RefElement(this.id.toValue());return i&&(s.path=i),s}findRecursive(...i){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const s=i.pop();let u=new _;const append=(i,s)=>(i.push(s),i),checkElement=(i,u)=>{u.element===s&&i.push(u);const m=u.findRecursive(s);return m&&m.reduce(append,i),u.content instanceof v&&(u.content.key&&checkElement(i,u.content.key),u.content.value&&checkElement(i,u.content.value)),i};return this.content&&(this.content.element&&checkElement(u,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,u)),i.isEmpty||(u=u.filter((s=>{let u=s.parents.map((i=>i.element));for(const s in i){const m=i[s],v=u.indexOf(m);if(-1===v)return!1;u=u.splice(0,v)}return!0}))),u}set(i){return this.content=i,this}equals(i){return m(this.toValue(),i)}getMetaProperty(i,s){if(!this.meta.hasKey(i)){if(this.isFrozen){const i=this.refract(s);return i.freeze(),i}this.meta.set(i,s)}return this.meta.get(i)}setMetaProperty(i,s){this.meta.set(i,s)}get element(){return this._storedElement||"element"}set element(i){this._storedElement=i}get content(){return this._content}set content(i){if(i instanceof Element)this._content=i;else if(i instanceof _)this.content=i.elements;else if("string"==typeof i||"number"==typeof i||"boolean"==typeof i||"null"===i||null==i)this._content=i;else if(i instanceof v)this._content=i;else if(Array.isArray(i))this._content=i.map(this.refract);else{if("object"!=typeof i)throw new Error("Cannot set content to given value");this._content=Object.keys(i).map((s=>new this.MemberElement(s,i[s])))}}get meta(){if(!this._meta){if(this.isFrozen){const i=new this.ObjectElement;return i.freeze(),i}this._meta=new this.ObjectElement}return this._meta}set meta(i){i instanceof this.ObjectElement?this._meta=i:this.meta.set(i||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const i=new this.ObjectElement;return i.freeze(),i}this._attributes=new this.ObjectElement}return this._attributes}set attributes(i){i instanceof this.ObjectElement?this._attributes=i:this.attributes.set(i||{})}get id(){return this.getMetaProperty("id","")}set id(i){this.setMetaProperty("id",i)}get classes(){return this.getMetaProperty("classes",[])}set classes(i){this.setMetaProperty("classes",i)}get title(){return this.getMetaProperty("title","")}set title(i){this.setMetaProperty("title",i)}get description(){return this.getMetaProperty("description","")}set description(i){this.setMetaProperty("description",i)}get links(){return this.getMetaProperty("links",[])}set links(i){this.setMetaProperty("links",i)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:i}=this;const s=new _;for(;i;)s.push(i),i=i.parent;return s}get children(){if(Array.isArray(this.content))return new _(this.content);if(this.content instanceof v){const i=new _([this.content.key]);return this.content.value&&i.push(this.content.value),i}return this.content instanceof Element?new _([this.content]):new _}get recursiveChildren(){const i=new _;return this.children.forEach((s=>{i.push(s),s.recursiveChildren.forEach((s=>{i.push(s)}))})),i}}i.exports=Element},5946:(i,s,u)=>{const m=u(17645),v=u(3079);i.exports=class MemberElement extends v{constructor(i,s,u,v){super(new m,u,v),this.element="member",this.key=i,this.value=s}get key(){return this.content.key}set key(i){this.content.key=this.refract(i)}get value(){return this.content.value}set value(i){this.content.value=this.refract(i)}}},96295:(i,s,u)=>{const m=u(3079);i.exports=class NullElement extends m{constructor(i,s,u){super(i||null,s,u),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},91090:(i,s,u)=>{const m=u(3079);i.exports=class NumberElement extends m{constructor(i,s,u){super(i,s,u),this.element="number"}primitive(){return"number"}}},76735:(i,s,u)=>{const m=u(94885),v=u(13218),_=u(35804),j=u(5946),M=u(87526);i.exports=class ObjectElement extends _{constructor(i,s,u){super(i||[],s,u),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((i,s)=>(i[s.key.toValue()]=s.value?s.value.toValue():void 0,i)),{})}get(i){const s=this.getMember(i);if(s)return s.value}getMember(i){if(void 0!==i)return this.content.find((s=>s.key.toValue()===i))}remove(i){let s=null;return this.content=this.content.filter((u=>u.key.toValue()!==i||(s=u,!1))),s}getKey(i){const s=this.getMember(i);if(s)return s.key}set(i,s){if(v(i))return Object.keys(i).forEach((s=>{this.set(s,i[s])})),this;const u=i,m=this.getMember(u);return m?m.value=s:this.content.push(new j(u,s)),this}keys(){return this.content.map((i=>i.key.toValue()))}values(){return this.content.map((i=>i.value.toValue()))}hasKey(i){return this.content.some((s=>s.key.equals(i)))}items(){return this.content.map((i=>[i.key.toValue(),i.value.toValue()]))}map(i,s){return this.content.map((u=>i.bind(s)(u.value,u.key,u)))}compactMap(i,s){const u=[];return this.forEach(((m,v,_)=>{const j=i.bind(s)(m,v,_);j&&u.push(j)})),u}filter(i,s){return new M(this.content).filter(i,s)}reject(i,s){return this.filter(m(i),s)}forEach(i,s){return this.content.forEach((u=>i.bind(s)(u.value,u.key,u)))}}},16036:(i,s,u)=>{const m=u(3079);i.exports=class StringElement extends m{constructor(i,s,u){super(i,s,u),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},3414:(i,s,u)=>{const m=u(28219);i.exports=class JSON06Serialiser extends m{serialise(i){if(!(i instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${i}\` is not an Element instance`);let s;i._attributes&&i.attributes.get("variable")&&(s=i.attributes.get("variable"));const u={element:i.element};i._meta&&i._meta.length>0&&(u.meta=this.serialiseObject(i.meta));const m="enum"===i.element||-1!==i.attributes.keys().indexOf("enumerations");if(m){const s=this.enumSerialiseAttributes(i);s&&(u.attributes=s)}else if(i._attributes&&i._attributes.length>0){let{attributes:m}=i;m.get("metadata")&&(m=m.clone(),m.set("meta",m.get("metadata")),m.remove("metadata")),"member"===i.element&&s&&(m=m.clone(),m.remove("variable")),m.length>0&&(u.attributes=this.serialiseObject(m))}if(m)u.content=this.enumSerialiseContent(i,u);else if(this[`${i.element}SerialiseContent`])u.content=this[`${i.element}SerialiseContent`](i,u);else if(void 0!==i.content){let m;s&&i.content.key?(m=i.content.clone(),m.key.attributes.set("variable",s),m=this.serialiseContent(m)):m=this.serialiseContent(i.content),this.shouldSerialiseContent(i,m)&&(u.content=m)}else this.shouldSerialiseContent(i,i.content)&&i instanceof this.namespace.elements.Array&&(u.content=[]);return u}shouldSerialiseContent(i,s){return"parseResult"===i.element||"httpRequest"===i.element||"httpResponse"===i.element||"category"===i.element||"link"===i.element||void 0!==s&&(!Array.isArray(s)||0!==s.length)}refSerialiseContent(i,s){return delete s.attributes,{href:i.toValue(),path:i.path.toValue()}}sourceMapSerialiseContent(i){return i.toValue()}dataStructureSerialiseContent(i){return[this.serialiseContent(i.content)]}enumSerialiseAttributes(i){const s=i.attributes.clone(),u=s.remove("enumerations")||new this.namespace.elements.Array([]),m=s.get("default");let v=s.get("samples")||new this.namespace.elements.Array([]);if(m&&m.content&&(m.content.attributes&&m.content.attributes.remove("typeAttributes"),s.set("default",new this.namespace.elements.Array([m.content]))),v.forEach((i=>{i.content&&i.content.element&&i.content.attributes.remove("typeAttributes")})),i.content&&0!==u.length&&v.unshift(i.content),v=v.map((i=>i instanceof this.namespace.elements.Array?[i]:new this.namespace.elements.Array([i.content]))),v.length&&s.set("samples",v),s.length>0)return this.serialiseObject(s)}enumSerialiseContent(i){if(i._attributes){const s=i.attributes.get("enumerations");if(s&&s.length>0)return s.content.map((i=>{const s=i.clone();return s.attributes.remove("typeAttributes"),this.serialise(s)}))}if(i.content){const s=i.content.clone();return s.attributes.remove("typeAttributes"),[this.serialise(s)]}return[]}deserialise(i){if("string"==typeof i)return new this.namespace.elements.String(i);if("number"==typeof i)return new this.namespace.elements.Number(i);if("boolean"==typeof i)return new this.namespace.elements.Boolean(i);if(null===i)return new this.namespace.elements.Null;if(Array.isArray(i))return new this.namespace.elements.Array(i.map(this.deserialise,this));const s=this.namespace.getElementClass(i.element),u=new s;u.element!==i.element&&(u.element=i.element),i.meta&&this.deserialiseObject(i.meta,u.meta),i.attributes&&this.deserialiseObject(i.attributes,u.attributes);const m=this.deserialiseContent(i.content);if(void 0===m&&null!==u.content||(u.content=m),"enum"===u.element){u.content&&u.attributes.set("enumerations",u.content);let i=u.attributes.get("samples");if(u.attributes.remove("samples"),i){const m=i;i=new this.namespace.elements.Array,m.forEach((m=>{m.forEach((m=>{const v=new s(m);v.element=u.element,i.push(v)}))}));const v=i.shift();u.content=v?v.content:void 0,u.attributes.set("samples",i)}else u.content=void 0;let m=u.attributes.get("default");if(m&&m.length>0){m=m.get(0);const i=new s(m);i.element=u.element,u.attributes.set("default",i)}}else if("dataStructure"===u.element&&Array.isArray(u.content))[u.content]=u.content;else if("category"===u.element){const i=u.attributes.get("meta");i&&(u.attributes.set("metadata",i),u.attributes.remove("meta"))}else"member"===u.element&&u.key&&u.key._attributes&&u.key._attributes.getValue("variable")&&(u.attributes.set("variable",u.key.attributes.get("variable")),u.key.attributes.remove("variable"));return u}serialiseContent(i){if(i instanceof this.namespace.elements.Element)return this.serialise(i);if(i instanceof this.namespace.KeyValuePair){const s={key:this.serialise(i.key)};return i.value&&(s.value=this.serialise(i.value)),s}return i&&i.map?i.map(this.serialise,this):i}deserialiseContent(i){if(i){if(i.element)return this.deserialise(i);if(i.key){const s=new this.namespace.KeyValuePair(this.deserialise(i.key));return i.value&&(s.value=this.deserialise(i.value)),s}if(i.map)return i.map(this.deserialise,this)}return i}shouldRefract(i){return!!(i._attributes&&i.attributes.keys().length||i._meta&&i.meta.keys().length)||"enum"!==i.element&&(i.element!==i.primitive()||"member"===i.element)}convertKeyToRefract(i,s){return this.shouldRefract(s)?this.serialise(s):"enum"===s.element?this.serialiseEnum(s):"array"===s.element?s.map((s=>this.shouldRefract(s)||"default"===i?this.serialise(s):"array"===s.element||"object"===s.element||"enum"===s.element?s.children.map((i=>this.serialise(i))):s.toValue())):"object"===s.element?(s.content||[]).map(this.serialise,this):s.toValue()}serialiseEnum(i){return i.children.map((i=>this.serialise(i)))}serialiseObject(i){const s={};return i.forEach(((i,u)=>{if(i){const m=u.toValue();s[m]=this.convertKeyToRefract(m,i)}})),s}deserialiseObject(i,s){Object.keys(i).forEach((u=>{s.set(u,this.deserialise(i[u]))}))}}},28219:i=>{i.exports=class JSONSerialiser{constructor(i){this.namespace=i||new this.Namespace}serialise(i){if(!(i instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${i}\` is not an Element instance`);const s={element:i.element};i._meta&&i._meta.length>0&&(s.meta=this.serialiseObject(i.meta)),i._attributes&&i._attributes.length>0&&(s.attributes=this.serialiseObject(i.attributes));const u=this.serialiseContent(i.content);return void 0!==u&&(s.content=u),s}deserialise(i){if(!i.element)throw new Error("Given value is not an object containing an element name");const s=new(this.namespace.getElementClass(i.element));s.element!==i.element&&(s.element=i.element),i.meta&&this.deserialiseObject(i.meta,s.meta),i.attributes&&this.deserialiseObject(i.attributes,s.attributes);const u=this.deserialiseContent(i.content);return void 0===u&&null!==s.content||(s.content=u),s}serialiseContent(i){if(i instanceof this.namespace.elements.Element)return this.serialise(i);if(i instanceof this.namespace.KeyValuePair){const s={key:this.serialise(i.key)};return i.value&&(s.value=this.serialise(i.value)),s}if(i&&i.map){if(0===i.length)return;return i.map(this.serialise,this)}return i}deserialiseContent(i){if(i){if(i.element)return this.deserialise(i);if(i.key){const s=new this.namespace.KeyValuePair(this.deserialise(i.key));return i.value&&(s.value=this.deserialise(i.value)),s}if(i.map)return i.map(this.deserialise,this)}return i}serialiseObject(i){const s={};if(i.forEach(((i,u)=>{i&&(s[u.toValue()]=this.serialise(i))})),0!==Object.keys(s).length)return s}deserialiseObject(i,s){Object.keys(i).forEach((u=>{s.set(u,this.deserialise(i[u]))}))}}},27418:i=>{"use strict";var s=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,m=Object.prototype.propertyIsEnumerable;i.exports=function shouldUseNative(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de","5"===Object.getOwnPropertyNames(i)[0])return!1;for(var s={},u=0;u<10;u++)s["_"+String.fromCharCode(u)]=u;if("0123456789"!==Object.getOwnPropertyNames(s).map((function(i){return s[i]})).join(""))return!1;var m={};return"abcdefghijklmnopqrst".split("").forEach((function(i){m[i]=i})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},m)).join("")}catch(i){return!1}}()?Object.assign:function(i,v){for(var _,j,M=function toObject(i){if(null==i)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}(i),$=1;${var m="function"==typeof Map&&Map.prototype,v=Object.getOwnPropertyDescriptor&&m?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,_=m&&v&&"function"==typeof v.get?v.get:null,j=m&&Map.prototype.forEach,M="function"==typeof Set&&Set.prototype,$=Object.getOwnPropertyDescriptor&&M?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,W=M&&$&&"function"==typeof $.get?$.get:null,X=M&&Set.prototype.forEach,Y="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,Z="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,ee="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ie=Boolean.prototype.valueOf,ae=Object.prototype.toString,le=Function.prototype.toString,ce=String.prototype.match,pe=String.prototype.slice,de=String.prototype.replace,fe=String.prototype.toUpperCase,ye=String.prototype.toLowerCase,be=RegExp.prototype.test,_e=Array.prototype.concat,we=Array.prototype.join,Se=Array.prototype.slice,xe=Math.floor,Ie="function"==typeof BigInt?BigInt.prototype.valueOf:null,Pe=Object.getOwnPropertySymbols,Te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,Re="function"==typeof Symbol&&"object"==typeof Symbol.iterator,qe="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===Re||"symbol")?Symbol.toStringTag:null,ze=Object.prototype.propertyIsEnumerable,Ve=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(i){return i.__proto__}:null);function addNumericSeparator(i,s){if(i===1/0||i===-1/0||i!=i||i&&i>-1e3&&i<1e3||be.call(/e/,s))return s;var u=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof i){var m=i<0?-xe(-i):xe(i);if(m!==i){var v=String(m),_=pe.call(s,v.length+1);return de.call(v,u,"$&_")+"."+de.call(de.call(_,/([0-9]{3})/g,"$&_"),/_$/,"")}}return de.call(s,u,"$&_")}var We=u(24654),He=We.custom,Xe=isSymbol(He)?He:null;function wrapQuotes(i,s,u){var m="double"===(u.quoteStyle||s)?'"':"'";return m+i+m}function quote(i){return de.call(String(i),/"/g,""")}function isArray(i){return!("[object Array]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}function isRegExp(i){return!("[object RegExp]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}function isSymbol(i){if(Re)return i&&"object"==typeof i&&i instanceof Symbol;if("symbol"==typeof i)return!0;if(!i||"object"!=typeof i||!Te)return!1;try{return Te.call(i),!0}catch(i){}return!1}i.exports=function inspect_(i,s,u,m){var v=s||{};if(has(v,"quoteStyle")&&"single"!==v.quoteStyle&&"double"!==v.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(has(v,"maxStringLength")&&("number"==typeof v.maxStringLength?v.maxStringLength<0&&v.maxStringLength!==1/0:null!==v.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var M=!has(v,"customInspect")||v.customInspect;if("boolean"!=typeof M&&"symbol"!==M)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(has(v,"indent")&&null!==v.indent&&"\t"!==v.indent&&!(parseInt(v.indent,10)===v.indent&&v.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(has(v,"numericSeparator")&&"boolean"!=typeof v.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var $=v.numericSeparator;if(void 0===i)return"undefined";if(null===i)return"null";if("boolean"==typeof i)return i?"true":"false";if("string"==typeof i)return inspectString(i,v);if("number"==typeof i){if(0===i)return 1/0/i>0?"0":"-0";var ae=String(i);return $?addNumericSeparator(i,ae):ae}if("bigint"==typeof i){var fe=String(i)+"n";return $?addNumericSeparator(i,fe):fe}var be=void 0===v.depth?5:v.depth;if(void 0===u&&(u=0),u>=be&&be>0&&"object"==typeof i)return isArray(i)?"[Array]":"[Object]";var xe=function getIndent(i,s){var u;if("\t"===i.indent)u="\t";else{if(!("number"==typeof i.indent&&i.indent>0))return null;u=we.call(Array(i.indent+1)," ")}return{base:u,prev:we.call(Array(s+1),u)}}(v,u);if(void 0===m)m=[];else if(indexOf(m,i)>=0)return"[Circular]";function inspect(i,s,_){if(s&&(m=Se.call(m)).push(s),_){var j={depth:v.depth};return has(v,"quoteStyle")&&(j.quoteStyle=v.quoteStyle),inspect_(i,j,u+1,m)}return inspect_(i,v,u+1,m)}if("function"==typeof i&&!isRegExp(i)){var Pe=function nameOf(i){if(i.name)return i.name;var s=ce.call(le.call(i),/^function\s*([\w$]+)/);if(s)return s[1];return null}(i),He=arrObjKeys(i,inspect);return"[Function"+(Pe?": "+Pe:" (anonymous)")+"]"+(He.length>0?" { "+we.call(He,", ")+" }":"")}if(isSymbol(i)){var Ye=Re?de.call(String(i),/^(Symbol\(.*\))_[^)]*$/,"$1"):Te.call(i);return"object"!=typeof i||Re?Ye:markBoxed(Ye)}if(function isElement(i){if(!i||"object"!=typeof i)return!1;if("undefined"!=typeof HTMLElement&&i instanceof HTMLElement)return!0;return"string"==typeof i.nodeName&&"function"==typeof i.getAttribute}(i)){for(var Qe="<"+ye.call(String(i.nodeName)),et=i.attributes||[],tt=0;tt"}if(isArray(i)){if(0===i.length)return"[]";var rt=arrObjKeys(i,inspect);return xe&&!function singleLineValues(i){for(var s=0;s=0)return!1;return!0}(rt)?"["+indentedJoin(rt,xe)+"]":"[ "+we.call(rt,", ")+" ]"}if(function isError(i){return!("[object Error]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i)){var nt=arrObjKeys(i,inspect);return"cause"in Error.prototype||!("cause"in i)||ze.call(i,"cause")?0===nt.length?"["+String(i)+"]":"{ ["+String(i)+"] "+we.call(nt,", ")+" }":"{ ["+String(i)+"] "+we.call(_e.call("[cause]: "+inspect(i.cause),nt),", ")+" }"}if("object"==typeof i&&M){if(Xe&&"function"==typeof i[Xe]&&We)return We(i,{depth:be-u});if("symbol"!==M&&"function"==typeof i.inspect)return i.inspect()}if(function isMap(i){if(!_||!i||"object"!=typeof i)return!1;try{_.call(i);try{W.call(i)}catch(i){return!0}return i instanceof Map}catch(i){}return!1}(i)){var ot=[];return j&&j.call(i,(function(s,u){ot.push(inspect(u,i,!0)+" => "+inspect(s,i))})),collectionOf("Map",_.call(i),ot,xe)}if(function isSet(i){if(!W||!i||"object"!=typeof i)return!1;try{W.call(i);try{_.call(i)}catch(i){return!0}return i instanceof Set}catch(i){}return!1}(i)){var it=[];return X&&X.call(i,(function(s){it.push(inspect(s,i))})),collectionOf("Set",W.call(i),it,xe)}if(function isWeakMap(i){if(!Y||!i||"object"!=typeof i)return!1;try{Y.call(i,Y);try{Z.call(i,Z)}catch(i){return!0}return i instanceof WeakMap}catch(i){}return!1}(i))return weakCollectionOf("WeakMap");if(function isWeakSet(i){if(!Z||!i||"object"!=typeof i)return!1;try{Z.call(i,Z);try{Y.call(i,Y)}catch(i){return!0}return i instanceof WeakSet}catch(i){}return!1}(i))return weakCollectionOf("WeakSet");if(function isWeakRef(i){if(!ee||!i||"object"!=typeof i)return!1;try{return ee.call(i),!0}catch(i){}return!1}(i))return weakCollectionOf("WeakRef");if(function isNumber(i){return!("[object Number]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(inspect(Number(i)));if(function isBigInt(i){if(!i||"object"!=typeof i||!Ie)return!1;try{return Ie.call(i),!0}catch(i){}return!1}(i))return markBoxed(inspect(Ie.call(i)));if(function isBoolean(i){return!("[object Boolean]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(ie.call(i));if(function isString(i){return!("[object String]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(inspect(String(i)));if(!function isDate(i){return!("[object Date]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i)&&!isRegExp(i)){var at=arrObjKeys(i,inspect),st=Ve?Ve(i)===Object.prototype:i instanceof Object||i.constructor===Object,lt=i instanceof Object?"":"null prototype",ct=!st&&qe&&Object(i)===i&&qe in i?pe.call(toStr(i),8,-1):lt?"Object":"",ut=(st||"function"!=typeof i.constructor?"":i.constructor.name?i.constructor.name+" ":"")+(ct||lt?"["+we.call(_e.call([],ct||[],lt||[]),": ")+"] ":"");return 0===at.length?ut+"{}":xe?ut+"{"+indentedJoin(at,xe)+"}":ut+"{ "+we.call(at,", ")+" }"}return String(i)};var Ye=Object.prototype.hasOwnProperty||function(i){return i in this};function has(i,s){return Ye.call(i,s)}function toStr(i){return ae.call(i)}function indexOf(i,s){if(i.indexOf)return i.indexOf(s);for(var u=0,m=i.length;us.maxStringLength){var u=i.length-s.maxStringLength,m="... "+u+" more character"+(u>1?"s":"");return inspectString(pe.call(i,0,s.maxStringLength),s)+m}return wrapQuotes(de.call(de.call(i,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,lowbyte),"single",s)}function lowbyte(i){var s=i.charCodeAt(0),u={8:"b",9:"t",10:"n",12:"f",13:"r"}[s];return u?"\\"+u:"\\x"+(s<16?"0":"")+fe.call(s.toString(16))}function markBoxed(i){return"Object("+i+")"}function weakCollectionOf(i){return i+" { ? }"}function collectionOf(i,s,u,m){return i+" ("+s+") {"+(m?indentedJoin(u,m):we.call(u,", "))+"}"}function indentedJoin(i,s){if(0===i.length)return"";var u="\n"+s.prev+s.base;return u+we.call(i,","+u)+"\n"+s.prev}function arrObjKeys(i,s){var u=isArray(i),m=[];if(u){m.length=i.length;for(var v=0;v{var s,u,m=i.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(i){if(s===setTimeout)return setTimeout(i,0);if((s===defaultSetTimout||!s)&&setTimeout)return s=setTimeout,setTimeout(i,0);try{return s(i,0)}catch(u){try{return s.call(null,i,0)}catch(u){return s.call(this,i,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(i){s=defaultSetTimout}try{u="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(i){u=defaultClearTimeout}}();var v,_=[],j=!1,M=-1;function cleanUpNextTick(){j&&v&&(j=!1,v.length?_=v.concat(_):M=-1,_.length&&drainQueue())}function drainQueue(){if(!j){var i=runTimeout(cleanUpNextTick);j=!0;for(var s=_.length;s;){for(v=_,_=[];++M1)for(var u=1;u{"use strict";var m=u(50414);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,i.exports=function(){function shim(i,s,u,v,_,j){if(j!==m){var M=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw M.name="Invariant Violation",M}}function getShim(){return shim}shim.isRequired=shim;var i={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return i.PropTypes=i,i}},45697:(i,s,u)=>{i.exports=u(92703)()},50414:i=>{"use strict";i.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},55798:i=>{"use strict";var s=String.prototype.replace,u=/%20/g,m="RFC1738",v="RFC3986";i.exports={default:v,formatters:{RFC1738:function(i){return s.call(i,u,"+")},RFC3986:function(i){return String(i)}},RFC1738:m,RFC3986:v}},80129:(i,s,u)=>{"use strict";var m=u(58261),v=u(55235),_=u(55798);i.exports={formats:_,parse:v,stringify:m}},55235:(i,s,u)=>{"use strict";var m=u(12769),v=Object.prototype.hasOwnProperty,_=Array.isArray,j={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:m.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(i){return i.replace(/&#(\d+);/g,(function(i,s){return String.fromCharCode(parseInt(s,10))}))},parseArrayValue=function(i,s){return i&&"string"==typeof i&&s.comma&&i.indexOf(",")>-1?i.split(","):i},M=function parseQueryStringKeys(i,s,u,m){if(i){var _=u.allowDots?i.replace(/\.([^.[]+)/g,"[$1]"):i,j=/(\[[^[\]]*])/g,M=u.depth>0&&/(\[[^[\]]*])/.exec(_),$=M?_.slice(0,M.index):_,W=[];if($){if(!u.plainObjects&&v.call(Object.prototype,$)&&!u.allowPrototypes)return;W.push($)}for(var X=0;u.depth>0&&null!==(M=j.exec(_))&&X=0;--_){var j,M=i[_];if("[]"===M&&u.parseArrays)j=[].concat(v);else{j=u.plainObjects?Object.create(null):{};var $="["===M.charAt(0)&&"]"===M.charAt(M.length-1)?M.slice(1,-1):M,W=parseInt($,10);u.parseArrays||""!==$?!isNaN(W)&&M!==$&&String(W)===$&&W>=0&&u.parseArrays&&W<=u.arrayLimit?(j=[])[W]=v:"__proto__"!==$&&(j[$]=v):j={0:v}}v=j}return v}(W,s,u,m)}};i.exports=function(i,s){var u=function normalizeParseOptions(i){if(!i)return j;if(null!==i.decoder&&void 0!==i.decoder&&"function"!=typeof i.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==i.charset&&"utf-8"!==i.charset&&"iso-8859-1"!==i.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var s=void 0===i.charset?j.charset:i.charset;return{allowDots:void 0===i.allowDots?j.allowDots:!!i.allowDots,allowPrototypes:"boolean"==typeof i.allowPrototypes?i.allowPrototypes:j.allowPrototypes,allowSparse:"boolean"==typeof i.allowSparse?i.allowSparse:j.allowSparse,arrayLimit:"number"==typeof i.arrayLimit?i.arrayLimit:j.arrayLimit,charset:s,charsetSentinel:"boolean"==typeof i.charsetSentinel?i.charsetSentinel:j.charsetSentinel,comma:"boolean"==typeof i.comma?i.comma:j.comma,decoder:"function"==typeof i.decoder?i.decoder:j.decoder,delimiter:"string"==typeof i.delimiter||m.isRegExp(i.delimiter)?i.delimiter:j.delimiter,depth:"number"==typeof i.depth||!1===i.depth?+i.depth:j.depth,ignoreQueryPrefix:!0===i.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof i.interpretNumericEntities?i.interpretNumericEntities:j.interpretNumericEntities,parameterLimit:"number"==typeof i.parameterLimit?i.parameterLimit:j.parameterLimit,parseArrays:!1!==i.parseArrays,plainObjects:"boolean"==typeof i.plainObjects?i.plainObjects:j.plainObjects,strictNullHandling:"boolean"==typeof i.strictNullHandling?i.strictNullHandling:j.strictNullHandling}}(s);if(""===i||null==i)return u.plainObjects?Object.create(null):{};for(var $="string"==typeof i?function parseQueryStringValues(i,s){var u,M={},$=s.ignoreQueryPrefix?i.replace(/^\?/,""):i,W=s.parameterLimit===1/0?void 0:s.parameterLimit,X=$.split(s.delimiter,W),Y=-1,Z=s.charset;if(s.charsetSentinel)for(u=0;u-1&&(ie=_(ie)?[ie]:ie),v.call(M,ee)?M[ee]=m.combine(M[ee],ie):M[ee]=ie}return M}(i,u):i,W=u.plainObjects?Object.create(null):{},X=Object.keys($),Y=0;Y{"use strict";var m=u(37478),v=u(12769),_=u(55798),j=Object.prototype.hasOwnProperty,M={brackets:function brackets(i){return i+"[]"},comma:"comma",indices:function indices(i,s){return i+"["+s+"]"},repeat:function repeat(i){return i}},$=Array.isArray,W=String.prototype.split,X=Array.prototype.push,pushToArray=function(i,s){X.apply(i,$(s)?s:[s])},Y=Date.prototype.toISOString,Z=_.default,ee={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:v.encode,encodeValuesOnly:!1,format:Z,formatter:_.formatters[Z],indices:!1,serializeDate:function serializeDate(i){return Y.call(i)},skipNulls:!1,strictNullHandling:!1},ie={},ae=function stringify(i,s,u,_,j,M,X,Y,Z,ae,le,ce,pe,de,fe,ye){for(var be=i,_e=ye,we=0,Se=!1;void 0!==(_e=_e.get(ie))&&!Se;){var xe=_e.get(i);if(we+=1,void 0!==xe){if(xe===we)throw new RangeError("Cyclic object value");Se=!0}void 0===_e.get(ie)&&(we=0)}if("function"==typeof Y?be=Y(s,be):be instanceof Date?be=le(be):"comma"===u&&$(be)&&(be=v.maybeMap(be,(function(i){return i instanceof Date?le(i):i}))),null===be){if(j)return X&&!de?X(s,ee.encoder,fe,"key",ce):s;be=""}if(function isNonNullishPrimitive(i){return"string"==typeof i||"number"==typeof i||"boolean"==typeof i||"symbol"==typeof i||"bigint"==typeof i}(be)||v.isBuffer(be)){if(X){var Ie=de?s:X(s,ee.encoder,fe,"key",ce);if("comma"===u&&de){for(var Pe=W.call(String(be),","),Te="",Re=0;Re0?be.join(",")||null:void 0}];else if($(Y))qe=Y;else{var Ve=Object.keys(be);qe=Z?Ve.sort(Z):Ve}for(var We=_&&$(be)&&1===be.length?s+"[]":s,He=0;He0?fe+de:""}},12769:(i,s,u)=>{"use strict";var m=u(55798),v=Object.prototype.hasOwnProperty,_=Array.isArray,j=function(){for(var i=[],s=0;s<256;++s)i.push("%"+((s<16?"0":"")+s.toString(16)).toUpperCase());return i}(),M=function arrayToObject(i,s){for(var u=s&&s.plainObjects?Object.create(null):{},m=0;m1;){var s=i.pop(),u=s.obj[s.prop];if(_(u)){for(var m=[],v=0;v=48&&X<=57||X>=65&&X<=90||X>=97&&X<=122||_===m.RFC1738&&(40===X||41===X)?$+=M.charAt(W):X<128?$+=j[X]:X<2048?$+=j[192|X>>6]+j[128|63&X]:X<55296||X>=57344?$+=j[224|X>>12]+j[128|X>>6&63]+j[128|63&X]:(W+=1,X=65536+((1023&X)<<10|1023&M.charCodeAt(W)),$+=j[240|X>>18]+j[128|X>>12&63]+j[128|X>>6&63]+j[128|63&X])}return $},isBuffer:function isBuffer(i){return!(!i||"object"!=typeof i)&&!!(i.constructor&&i.constructor.isBuffer&&i.constructor.isBuffer(i))},isRegExp:function isRegExp(i){return"[object RegExp]"===Object.prototype.toString.call(i)},maybeMap:function maybeMap(i,s){if(_(i)){for(var u=[],m=0;m{"use strict";var u=Object.prototype.hasOwnProperty;function decode(i){try{return decodeURIComponent(i.replace(/\+/g," "))}catch(i){return null}}function encode(i){try{return encodeURIComponent(i)}catch(i){return null}}s.stringify=function querystringify(i,s){s=s||"";var m,v,_=[];for(v in"string"!=typeof s&&(s="?"),i)if(u.call(i,v)){if((m=i[v])||null!=m&&!isNaN(m)||(m=""),v=encode(v),m=encode(m),null===v||null===m)continue;_.push(v+"="+m)}return _.length?s+_.join("&"):""},s.parse=function querystring(i){for(var s,u=/([^=?#&]+)=?([^&]*)/g,m={};s=u.exec(i);){var v=decode(s[1]),_=decode(s[2]);null===v||null===_||v in m||(m[v]=_)}return m}},14419:(i,s,u)=>{const m=u(60697),v=u(69450),_=m.types;i.exports=class RandExp{constructor(i,s){if(this._setDefaults(i),i instanceof RegExp)this.ignoreCase=i.ignoreCase,this.multiline=i.multiline,i=i.source;else{if("string"!=typeof i)throw new Error("Expected a regexp or string");this.ignoreCase=s&&-1!==s.indexOf("i"),this.multiline=s&&-1!==s.indexOf("m")}this.tokens=m(i)}_setDefaults(i){this.max=null!=i.max?i.max:null!=RandExp.prototype.max?RandExp.prototype.max:100,this.defaultRange=i.defaultRange?i.defaultRange:this.defaultRange.clone(),i.randInt&&(this.randInt=i.randInt)}gen(){return this._gen(this.tokens,[])}_gen(i,s){var u,m,v,j,M;switch(i.type){case _.ROOT:case _.GROUP:if(i.followedBy||i.notFollowedBy)return"";for(i.remember&&void 0===i.groupNumber&&(i.groupNumber=s.push(null)-1),m="",j=0,M=(u=i.options?this._randSelect(i.options):i.stack).length;j{"use strict";var m=u(34155),v=65536,_=4294967295;var j=u(89509).Buffer,M=u.g.crypto||u.g.msCrypto;M&&M.getRandomValues?i.exports=function randomBytes(i,s){if(i>_)throw new RangeError("requested too many random bytes");var u=j.allocUnsafe(i);if(i>0)if(i>v)for(var $=0;${"use strict";function _typeof(i){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_typeof(i)}Object.defineProperty(s,"__esModule",{value:!0}),s.CopyToClipboard=void 0;var m=_interopRequireDefault(u(67294)),v=_interopRequireDefault(u(20640)),_=["text","onCopy","options","children"];function _interopRequireDefault(i){return i&&i.__esModule?i:{default:i}}function ownKeys(i,s){var u=Object.keys(i);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(i);s&&(m=m.filter((function(s){return Object.getOwnPropertyDescriptor(i,s).enumerable}))),u.push.apply(u,m)}return u}function _objectSpread(i){for(var s=1;s=0||(v[u]=i[u]);return v}(i,s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||Object.prototype.propertyIsEnumerable.call(i,u)&&(v[u]=i[u])}return v}function _defineProperties(i,s){for(var u=0;u{"use strict";var m=u(74300).CopyToClipboard;m.CopyToClipboard=m,i.exports=m},53441:(i,s,u)=>{"use strict";function _typeof(i){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_typeof(i)}Object.defineProperty(s,"__esModule",{value:!0}),s.DebounceInput=void 0;var m=_interopRequireDefault(u(67294)),v=_interopRequireDefault(u(91296)),_=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(i){return i&&i.__esModule?i:{default:i}}function _objectWithoutProperties(i,s){if(null==i)return{};var u,m,v=function _objectWithoutPropertiesLoose(i,s){if(null==i)return{};var u,m,v={},_=Object.keys(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||(v[u]=i[u]);return v}(i,s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||Object.prototype.propertyIsEnumerable.call(i,u)&&(v[u]=i[u])}return v}function ownKeys(i,s){var u=Object.keys(i);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(i);s&&(m=m.filter((function(s){return Object.getOwnPropertyDescriptor(i,s).enumerable}))),u.push.apply(u,m)}return u}function _objectSpread(i){for(var s=1;s=m?u.notify(i):s.length>v.length&&u.notify(_objectSpread(_objectSpread({},i),{},{target:_objectSpread(_objectSpread({},i.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(u),"onKeyDown",(function(i){"Enter"===i.key&&u.forceNotify(i);var s=u.props.onKeyDown;s&&(i.persist(),s(i))})),_defineProperty(_assertThisInitialized(u),"onBlur",(function(i){u.forceNotify(i);var s=u.props.onBlur;s&&(i.persist(),s(i))})),_defineProperty(_assertThisInitialized(u),"createNotifier",(function(i){if(i<0)u.notify=function(){return null};else if(0===i)u.notify=u.doNotify;else{var s=(0,v.default)((function(i){u.isDebouncing=!1,u.doNotify(i)}),i);u.notify=function(i){u.isDebouncing=!0,s(i)},u.flush=function(){return s.flush()},u.cancel=function(){u.isDebouncing=!1,s.cancel()}}})),_defineProperty(_assertThisInitialized(u),"doNotify",(function(){u.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(u),"forceNotify",(function(i){var s=u.props.debounceTimeout;if(u.isDebouncing||!(s>0)){u.cancel&&u.cancel();var m=u.state.value,v=u.props.minLength;m.length>=v?u.doNotify(i):u.doNotify(_objectSpread(_objectSpread({},i),{},{target:_objectSpread(_objectSpread({},i.target),{},{value:m})}))}})),u.isDebouncing=!1,u.state={value:void 0===i.value||null===i.value?"":i.value};var m=u.props.debounceTimeout;return u.createNotifier(m),u}return function _createClass(i,s,u){return s&&_defineProperties(i.prototype,s),u&&_defineProperties(i,u),Object.defineProperty(i,"prototype",{writable:!1}),i}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(i){if(!this.isDebouncing){var s=this.props,u=s.value,m=s.debounceTimeout,v=i.debounceTimeout,_=i.value,j=this.state.value;void 0!==u&&_!==u&&j!==u&&this.setState({value:u}),m!==v&&this.createNotifier(m)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var i,s,u=this.props,v=u.element,j=(u.onChange,u.value,u.minLength,u.debounceTimeout,u.forceNotifyByEnter),M=u.forceNotifyOnBlur,$=u.onKeyDown,W=u.onBlur,X=u.inputRef,Y=_objectWithoutProperties(u,_),Z=this.state.value;i=j?{onKeyDown:this.onKeyDown}:$?{onKeyDown:$}:{},s=M?{onBlur:this.onBlur}:W?{onBlur:W}:{};var ee=X?{ref:X}:{};return m.default.createElement(v,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},Y),{},{onChange:this.onChange,value:Z},i),s),ee))}}]),DebounceInput}(m.default.PureComponent);s.DebounceInput=j,_defineProperty(j,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},775:(i,s,u)=>{"use strict";var m=u(53441).DebounceInput;m.DebounceInput=m,i.exports=m},64448:(i,s,u)=>{"use strict";var m=u(67294),v=u(27418),_=u(63840);function y(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,u=1;u

\n"},RC.blockquote_close=function(i,s){return"
"+DC(i,s)},RC.code=function(i,s){return i[s].block?"
"+escapeHtml(i[s].content)+"
"+DC(i,s):""+escapeHtml(i[s].content)+""},RC.fence=function(i,s,u,m,v){var _,j,M=i[s],$="",W=u.langPrefix;if(M.params){if(j=(_=M.params.split(/\s+/g)).join(" "),index_browser_has(v.rules.fence_custom,_[0]))return v.rules.fence_custom[_[0]](i,s,u,m,v);$=' class="'+W+escapeHtml(replaceEntities(unescapeMd(j)))+'"'}return"
"+(u.highlight&&u.highlight.apply(u.highlight,[M.content].concat(_))||escapeHtml(M.content))+"
"+DC(i,s)},RC.fence_custom={},RC.heading_open=function(i,s){return""},RC.heading_close=function(i,s){return"\n"},RC.hr=function(i,s,u){return(u.xhtmlOut?"
":"
")+DC(i,s)},RC.bullet_list_open=function(){return"
    \n"},RC.bullet_list_close=function(i,s){return"
"+DC(i,s)},RC.list_item_open=function(){return"
  • "},RC.list_item_close=function(){return"
  • \n"},RC.ordered_list_open=function(i,s){var u=i[s];return"1?' start="'+u.order+'"':"")+">\n"},RC.ordered_list_close=function(i,s){return""+DC(i,s)},RC.paragraph_open=function(i,s){return i[s].tight?"":"

    "},RC.paragraph_close=function(i,s){var u=!(i[s].tight&&s&&"inline"===i[s-1].type&&!i[s-1].content);return(i[s].tight?"":"

    ")+(u?DC(i,s):"")},RC.link_open=function(i,s,u){var m=i[s].title?' title="'+escapeHtml(replaceEntities(i[s].title))+'"':"",v=u.linkTarget?' target="'+u.linkTarget+'"':"";return'
    "},RC.link_close=function(){return""},RC.image=function(i,s,u){var m=' src="'+escapeHtml(i[s].src)+'"',v=i[s].title?' title="'+escapeHtml(replaceEntities(i[s].title))+'"':"";return""},RC.table_open=function(){return"\n"},RC.table_close=function(){return"
    \n"},RC.thead_open=function(){return"\n"},RC.thead_close=function(){return"\n"},RC.tbody_open=function(){return"\n"},RC.tbody_close=function(){return"\n"},RC.tr_open=function(){return""},RC.tr_close=function(){return"\n"},RC.th_open=function(i,s){var u=i[s];return""},RC.th_close=function(){return""},RC.td_open=function(i,s){var u=i[s];return""},RC.td_close=function(){return""},RC.strong_open=function(){return""},RC.strong_close=function(){return""},RC.em_open=function(){return""},RC.em_close=function(){return""},RC.del_open=function(){return""},RC.del_close=function(){return""},RC.ins_open=function(){return""},RC.ins_close=function(){return""},RC.mark_open=function(){return""},RC.mark_close=function(){return""},RC.sub=function(i,s){return""+escapeHtml(i[s].content)+""},RC.sup=function(i,s){return""+escapeHtml(i[s].content)+""},RC.hardbreak=function(i,s,u){return u.xhtmlOut?"
    \n":"
    \n"},RC.softbreak=function(i,s,u){return u.breaks?u.xhtmlOut?"
    \n":"
    \n":"\n"},RC.text=function(i,s){return escapeHtml(i[s].content)},RC.htmlblock=function(i,s){return i[s].content},RC.htmltag=function(i,s){return i[s].content},RC.abbr_open=function(i,s){return''},RC.abbr_close=function(){return""},RC.footnote_ref=function(i,s){var u=Number(i[s].id+1).toString(),m="fnref"+u;return i[s].subId>0&&(m+=":"+i[s].subId),'['+u+"]"},RC.footnote_block_open=function(i,s,u){return(u.xhtmlOut?'
    \n':'
    \n')+'
    \n
      \n'},RC.footnote_block_close=function(){return"
    \n
    \n"},RC.footnote_open=function(i,s){return'
  • '},RC.footnote_close=function(){return"
  • \n"},RC.footnote_anchor=function(i,s){var u="fnref"+Number(i[s].id+1).toString();return i[s].subId>0&&(u+=":"+i[s].subId),' '},RC.dl_open=function(){return"
    \n"},RC.dt_open=function(){return"
    "},RC.dd_open=function(){return"
    "},RC.dl_close=function(){return"
    \n"},RC.dt_close=function(){return"\n"},RC.dd_close=function(){return"\n"};var DC=RC.getBreak=function getBreak(i,s){return(s=nextToken(i,s))1)break;if(41===u&&--m<0)break;s++}return _!==s&&(v=unescapeMd(i.src.slice(_,s)),!!i.parser.validateLink(v)&&(i.linkContent=v,i.pos=s,!0))}function parseLinkTitle(i,s){var u,m=s,v=i.posMax,_=i.src.charCodeAt(s);if(34!==_&&39!==_&&40!==_)return!1;for(s++,40===_&&(_=41);s=i.length)&&!zC.test(i[s])}function replaceAt(i,s,u){return i.substr(0,s)+u+i.substr(s+1)}var VC=[["block",function block(i){i.inlineMode?i.tokens.push({type:"inline",content:i.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):i.block.parse(i.src,i.options,i.env,i.tokens)}],["abbr",function abbr(i){var s,u,m,v,_=i.tokens;if(!i.inlineMode)for(s=1,u=_.length-1;s0?j[s].count:1,m=0;m=0;s--)if("text"===(_=v[s]).type){for($=0,j=_.content,X.lastIndex=0,W=_.level,M=[];Y=X.exec(j);)X.lastIndex>$&&M.push({type:"text",content:j.slice($,Y.index+Y[1].length),level:W}),M.push({type:"abbr_open",title:i.env.abbreviations[":"+Y[2]],level:W++}),M.push({type:"text",content:Y[2],level:W}),M.push({type:"abbr_close",level:--W}),$=X.lastIndex-Y[3].length;M.length&&($=0;_--)if("inline"===i.tokens[_].type)for(s=(v=i.tokens[_].children).length-1;s>=0;s--)"text"===(u=v[s]).type&&(m=replaceScopedAbbr(m=u.content),LC.test(m)&&(m=m.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),u.content=m)}],["smartquotes",function smartquotes(i){var s,u,m,v,_,j,M,$,W,X,Y,Z,ee,ie,ae,le,ce;if(i.options.typographer)for(ce=[],ae=i.tokens.length-1;ae>=0;ae--)if("inline"===i.tokens[ae].type)for(le=i.tokens[ae].children,ce.length=0,s=0;s=0&&!(ce[ee].level<=M);ee--);ce.length=ee+1,_=0,j=(m=u.content).length;e:for(;_=0&&(X=ce[ee],!(ce[ee].level=(v=i.eMarks[s])||42!==(u=i.src.charCodeAt(m++))&&45!==u&&43!==u||m=v)return-1;if((u=i.src.charCodeAt(m++))<48||u>57)return-1;for(;;){if(m>=v)return-1;if(!((u=i.src.charCodeAt(m++))>=48&&u<=57)){if(41===u||46===u)break;return-1}}return m=this.eMarks[i]},StateBlock.prototype.skipEmptyLines=function skipEmptyLines(i){for(var s=this.lineMax;iu;)if(s!==this.src.charCodeAt(--i))return i+1;return i},StateBlock.prototype.getLines=function getLines(i,s,u,m){var v,_,j,M,$,W=i;if(i>=s)return"";if(W+1===s)return _=this.bMarks[W]+Math.min(this.tShift[W],u),j=m?this.eMarks[W]+1:this.eMarks[W],this.src.slice(_,j);for(M=new Array(s-i),v=0;Wu&&($=u),$<0&&($=0),_=this.bMarks[W]+$,j=W+1]/,HC=/^<\/([a-zA-Z]{1,15})[\s>]/;function index_browser_getLine(i,s){var u=i.bMarks[s]+i.blkIndent,m=i.eMarks[s];return i.src.substr(u,m-u)}function skipMarker(i,s){var u,m,v=i.bMarks[s]+i.tShift[s],_=i.eMarks[s];return v>=_||126!==(m=i.src.charCodeAt(v++))&&58!==m||v===(u=i.skipSpaces(v))||u>=_?-1:u}var JC=[["code",function code(i,s,u){var m,v;if(i.tShift[s]-i.blkIndent<4)return!1;for(v=m=s+1;m=4))break;v=++m}return i.line=m,i.tokens.push({type:"code",content:i.getLines(s,v,4+i.blkIndent,!0),block:!0,lines:[s,i.line],level:i.level}),!0}],["fences",function fences(i,s,u,m){var v,_,j,M,$,W=!1,X=i.bMarks[s]+i.tShift[s],Y=i.eMarks[s];if(X+3>Y)return!1;if(126!==(v=i.src.charCodeAt(X))&&96!==v)return!1;if($=X,(_=(X=i.skipChars(X,v))-$)<3)return!1;if((j=i.src.slice(X,Y).trim()).indexOf("`")>=0)return!1;if(m)return!0;for(M=s;!(++M>=u)&&!((X=$=i.bMarks[M]+i.tShift[M])<(Y=i.eMarks[M])&&i.tShift[M]=4||(X=i.skipChars(X,v))-$<_||(X=i.skipSpaces(X))le)return!1;if(62!==i.src.charCodeAt(ae++))return!1;if(i.level>=i.options.maxNesting)return!1;if(m)return!0;for(32===i.src.charCodeAt(ae)&&ae++,$=i.blkIndent,i.blkIndent=0,M=[i.bMarks[s]],i.bMarks[s]=ae,_=(ae=ae=le,j=[i.tShift[s]],i.tShift[s]=ae-i.bMarks[s],Y=i.parser.ruler.getRules("blockquote"),v=s+1;v=(le=i.eMarks[v]));v++)if(62!==i.src.charCodeAt(ae++)){if(_)break;for(ie=!1,Z=0,ee=Y.length;Z=le,j.push(i.tShift[v]),i.tShift[v]=ae-i.bMarks[v];for(W=i.parentType,i.parentType="blockquote",i.tokens.push({type:"blockquote_open",lines:X=[s,0],level:i.level++}),i.parser.tokenize(i,s,v),i.tokens.push({type:"blockquote_close",level:--i.level}),i.parentType=W,X[1]=i.line,Z=0;Z$)return!1;if(42!==(v=i.src.charCodeAt(M++))&&45!==v&&95!==v)return!1;for(_=1;M<$;){if((j=i.src.charCodeAt(M++))!==v&&32!==j)return!1;j===v&&_++}return!(_<3)&&(m||(i.line=s+1,i.tokens.push({type:"hr",lines:[s,i.line],level:i.level})),!0)},["paragraph","blockquote","list"]],["list",function index_browser_list(i,s,u,m){var v,_,j,M,$,W,X,Y,Z,ee,ie,ae,le,ce,pe,de,fe,ye,be,_e,we,Se=!0;if((Y=skipOrderedListMarker(i,s))>=0)ae=!0;else{if(!((Y=skipBulletListMarker(i,s))>=0))return!1;ae=!1}if(i.level>=i.options.maxNesting)return!1;if(ie=i.src.charCodeAt(Y-1),m)return!0;for(ce=i.tokens.length,ae?(X=i.bMarks[s]+i.tShift[s],ee=Number(i.src.substr(X,Y-X-1)),i.tokens.push({type:"ordered_list_open",order:ee,lines:de=[s,0],level:i.level++})):i.tokens.push({type:"bullet_list_open",lines:de=[s,0],level:i.level++}),v=s,pe=!1,ye=i.parser.ruler.getRules("list");!(!(v=i.eMarks[v]?1:le-Y)>4&&(Z=1),Z<1&&(Z=1),_=Y-i.bMarks[v]+Z,i.tokens.push({type:"list_item_open",lines:fe=[s,0],level:i.level++}),M=i.blkIndent,$=i.tight,j=i.tShift[s],W=i.parentType,i.tShift[s]=le-i.bMarks[s],i.blkIndent=_,i.tight=!0,i.parentType="list",i.parser.tokenize(i,s,u,!0),i.tight&&!pe||(Se=!1),pe=i.line-s>1&&i.isEmpty(i.line-1),i.blkIndent=M,i.tShift[s]=j,i.tight=$,i.parentType=W,i.tokens.push({type:"list_item_close",level:--i.level}),v=s=i.line,fe[1]=v,le=i.bMarks[s],v>=u)||i.isEmpty(v)||i.tShift[v]X)return!1;if(91!==i.src.charCodeAt(W))return!1;if(94!==i.src.charCodeAt(W+1))return!1;if(i.level>=i.options.maxNesting)return!1;for(M=W+2;M=X||58!==i.src.charCodeAt(++M))&&(m||(M++,i.env.footnotes||(i.env.footnotes={}),i.env.footnotes.refs||(i.env.footnotes.refs={}),$=i.src.slice(W+2,M-2),i.env.footnotes.refs[":"+$]=-1,i.tokens.push({type:"footnote_reference_open",label:$,level:i.level++}),v=i.bMarks[s],_=i.tShift[s],j=i.parentType,i.tShift[s]=i.skipSpaces(M)-M,i.bMarks[s]=M,i.blkIndent+=4,i.parentType="footnote",i.tShift[s]=$)return!1;if(35!==(v=i.src.charCodeAt(M))||M>=$)return!1;for(_=1,v=i.src.charCodeAt(++M);35===v&&M<$&&_<=6;)_++,v=i.src.charCodeAt(++M);return!(_>6||M<$&&32!==v)&&(m||($=i.skipCharsBack($,32,M),(j=i.skipCharsBack($,35,M))>M&&32===i.src.charCodeAt(j-1)&&($=j),i.line=s+1,i.tokens.push({type:"heading_open",hLevel:_,lines:[s,i.line],level:i.level}),M<$&&i.tokens.push({type:"inline",content:i.src.slice(M,$).trim(),level:i.level+1,lines:[s,i.line],children:[]}),i.tokens.push({type:"heading_close",hLevel:_,level:i.level})),!0)},["paragraph","blockquote"]],["lheading",function lheading(i,s,u){var m,v,_,j=s+1;return!(j>=u)&&(!(i.tShift[j]3)&&(!((v=i.bMarks[j]+i.tShift[j])>=(_=i.eMarks[j]))&&((45===(m=i.src.charCodeAt(v))||61===m)&&(v=i.skipChars(v,m),!((v=i.skipSpaces(v))<_)&&(v=i.bMarks[s]+i.tShift[s],i.line=j+1,i.tokens.push({type:"heading_open",hLevel:61===m?1:2,lines:[s,i.line],level:i.level}),i.tokens.push({type:"inline",content:i.src.slice(v,i.eMarks[s]).trim(),level:i.level+1,lines:[s,i.line-1],children:[]}),i.tokens.push({type:"heading_close",hLevel:61===m?1:2,level:i.level}),!0))))))}],["htmlblock",function htmlblock(i,s,u,m){var v,_,j,M=i.bMarks[s],$=i.eMarks[s],W=i.tShift[s];if(M+=W,!i.options.html)return!1;if(W>3||M+2>=$)return!1;if(60!==i.src.charCodeAt(M))return!1;if(33===(v=i.src.charCodeAt(M+1))||63===v){if(m)return!0}else{if(47!==v&&!function isLetter$1(i){var s=32|i;return s>=97&&s<=122}(v))return!1;if(47===v){if(!(_=i.src.slice(M,$).match(HC)))return!1}else if(!(_=i.src.slice(M,$).match(KC)))return!1;if(!0!==WC[_[1].toLowerCase()])return!1;if(m)return!0}for(j=s+1;ju)return!1;if($=s+1,i.tShift[$]=i.eMarks[$])return!1;if(124!==(v=i.src.charCodeAt(j))&&45!==v&&58!==v)return!1;if(_=index_browser_getLine(i,s+1),!/^[-:| ]+$/.test(_))return!1;if((W=_.split("|"))<=2)return!1;for(Y=[],M=0;M=0;if(X=s+1,i.isEmpty(X)&&++X>u)return!1;if(i.tShift[X]=i.options.maxNesting)return!1;W=i.tokens.length,i.tokens.push({type:"dl_open",lines:$=[s,0],level:i.level++}),j=s,_=X;e:for(;;){for(ce=!0,le=!1,i.tokens.push({type:"dt_open",lines:[j,j],level:i.level++}),i.tokens.push({type:"inline",content:i.getLines(j,j+1,i.blkIndent,!1).trim(),level:i.level+1,lines:[j,j],children:[]}),i.tokens.push({type:"dt_close",level:--i.level});;){if(i.tokens.push({type:"dd_open",lines:M=[X,0],level:i.level++}),ae=i.tight,Z=i.ddIndent,Y=i.blkIndent,ie=i.tShift[_],ee=i.parentType,i.blkIndent=i.ddIndent=i.tShift[_]+2,i.tShift[_]=v-i.bMarks[_],i.tight=!0,i.parentType="deflist",i.parser.tokenize(i,_,u,!0),i.tight&&!le||(ce=!1),le=i.line-_>1&&i.isEmpty(i.line-1),i.tShift[_]=ie,i.tight=ae,i.parentType=ee,i.blkIndent=Y,i.ddIndent=Z,i.tokens.push({type:"dd_close",level:--i.level}),M[1]=X=i.line,X>=u)break e;if(i.tShift[X]=u)break;if(j=X,i.isEmpty(j))break;if(i.tShift[j]=u)break;if(i.isEmpty(_)&&_++,_>=u)break;if(i.tShift[_]3)){for(v=!1,_=0,j=M.length;_=u))&&!(i.tShift[j]=0&&(i=i.replace(GC,(function(s,u){var m;return 10===i.charCodeAt(u)?(_=u+1,j=0,s):(m=" ".slice((u-_-j)%4),j=u-_+1,m)}))),v=new StateBlock(i,this,s,u,m),this.tokenize(v,v.line,v.lineMax)};for(var QC=[],ZC=0;ZC<256;ZC++)QC.push(0);function isAlphaNum(i){return i>=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122}function scanDelims(i,s){var u,m,v,_=s,j=!0,M=!0,$=i.posMax,W=i.src.charCodeAt(s);for(u=s>0?i.src.charCodeAt(s-1):-1;_<$&&i.src.charCodeAt(_)===W;)_++;return _>=$&&(j=!1),(v=_-s)>=4?j=M=!1:(32!==(m=_<$?i.src.charCodeAt(_):-1)&&10!==m||(j=!1),32!==u&&10!==u||(M=!1),95===W&&(isAlphaNum(u)&&(j=!1),isAlphaNum(m)&&(M=!1))),{can_open:j,can_close:M,delims:v}}"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach((function(i){QC[i.charCodeAt(0)]=1}));var tj=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var rj=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var nj=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],oj=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,sj=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function replace$1(i,s){return i=i.source,s=s||"",function self(u,m){return u?(m=m.source||m,i=i.replace(u,m),self):new RegExp(i,s)}}var uj=replace$1(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),pj=replace$1(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",uj)(),yj=replace$1(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",pj)(),vj=replace$1(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",yj)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/|/)("processing",/<[?].*?[?]>/)("declaration",/]*>/)("cdata",//)();var _j=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,Ej=/^&([a-z][a-z0-9]{1,31});/i;var xj=[["text",function index_browser_text(i,s){for(var u=i.pos;u=0&&32===i.pending.charCodeAt(u))if(u>=1&&32===i.pending.charCodeAt(u-1)){for(var _=u-2;_>=0;_--)if(32!==i.pending.charCodeAt(_)){i.pending=i.pending.substring(0,_+1);break}i.push({type:"hardbreak",level:i.level})}else i.pending=i.pending.slice(0,-1),i.push({type:"softbreak",level:i.level});else i.push({type:"softbreak",level:i.level});for(v++;v=M)return!1;if(126!==i.src.charCodeAt($+1))return!1;if(i.level>=i.options.maxNesting)return!1;if(_=$>0?i.src.charCodeAt($-1):-1,j=i.src.charCodeAt($+2),126===_)return!1;if(126===j)return!1;if(32===j||10===j)return!1;for(m=$+2;m$+3)return i.pos+=m-$,s||(i.pending+=i.src.slice($,m)),!0;for(i.pos=$+2,v=1;i.pos+1=M)return!1;if(43!==i.src.charCodeAt($+1))return!1;if(i.level>=i.options.maxNesting)return!1;if(_=$>0?i.src.charCodeAt($-1):-1,j=i.src.charCodeAt($+2),43===_)return!1;if(43===j)return!1;if(32===j||10===j)return!1;for(m=$+2;m=M)return!1;if(61!==i.src.charCodeAt($+1))return!1;if(i.level>=i.options.maxNesting)return!1;if(_=$>0?i.src.charCodeAt($-1):-1,j=i.src.charCodeAt($+2),61===_)return!1;if(61===j)return!1;if(32===j||10===j)return!1;for(m=$+2;m=i.options.maxNesting)return!1;for(i.pos=X+u,M=[u];i.pos=v)return!1;if(i.level>=i.options.maxNesting)return!1;for(i.pos=_+1;i.pos=v)return!1;if(i.level>=i.options.maxNesting)return!1;for(i.pos=_+1;i.pos=i.options.maxNesting)return!1;if(u=ee+1,(m=parseLinkLabel(i,ee))<0)return!1;if((M=m+1)=Z)return!1;for(ee=M,parseLinkDestination(i,M)?(_=i.linkContent,M=i.pos):_="",ee=M;M=Z||41!==i.src.charCodeAt(M))return i.pos=Y,!1;M++}else{if(i.linkLevel>0)return!1;for(;M=0?v=i.src.slice(ee,M++):M=ee-1),v||(void 0===v&&(M=m+1),v=i.src.slice(u,m)),!($=i.env.references[normalizeReference(v)]))return i.pos=Y,!1;_=$.href,j=$.title}return s||(i.pos=u,i.posMax=m,X?i.push({type:"image",src:_,title:j,alt:i.src.substr(u,m-u),level:i.level}):(i.push({type:"link_open",href:_,title:j,level:i.level++}),i.linkLevel++,i.parser.tokenize(i),i.linkLevel--,i.push({type:"link_close",level:--i.level}))),i.pos=M,i.posMax=Z,!0}],["footnote_inline",function footnote_inline(i,s){var u,m,v,_,j=i.posMax,M=i.pos;return!(M+2>=j)&&(94===i.src.charCodeAt(M)&&(91===i.src.charCodeAt(M+1)&&(!(i.level>=i.options.maxNesting)&&(u=M+2,!((m=parseLinkLabel(i,M+1))<0)&&(s||(i.env.footnotes||(i.env.footnotes={}),i.env.footnotes.list||(i.env.footnotes.list=[]),v=i.env.footnotes.list.length,i.pos=u,i.posMax=m,i.push({type:"footnote_ref",id:v,level:i.level}),i.linkLevel++,_=i.tokens.length,i.parser.tokenize(i),i.env.footnotes.list[v]={tokens:i.tokens.splice(_)},i.linkLevel--),i.pos=m+1,i.posMax=j,!0)))))}],["footnote_ref",function footnote_ref(i,s){var u,m,v,_,j=i.posMax,M=i.pos;if(M+3>j)return!1;if(!i.env.footnotes||!i.env.footnotes.refs)return!1;if(91!==i.src.charCodeAt(M))return!1;if(94!==i.src.charCodeAt(M+1))return!1;if(i.level>=i.options.maxNesting)return!1;for(m=M+2;m=j)&&(m++,u=i.src.slice(M+2,m-1),void 0!==i.env.footnotes.refs[":"+u]&&(s||(i.env.footnotes.list||(i.env.footnotes.list=[]),i.env.footnotes.refs[":"+u]<0?(v=i.env.footnotes.list.length,i.env.footnotes.list[v]={label:u,count:0},i.env.footnotes.refs[":"+u]=v):v=i.env.footnotes.refs[":"+u],_=i.env.footnotes.list[v].count,i.env.footnotes.list[v].count++,i.push({type:"footnote_ref",id:v,subId:_,level:i.level})),i.pos=m,i.posMax=j,!0)))}],["autolink",function autolink(i,s){var u,m,v,_,j,M=i.pos;return 60===i.src.charCodeAt(M)&&(!((u=i.src.slice(M)).indexOf(">")<0)&&((m=u.match(sj))?!(nj.indexOf(m[1].toLowerCase())<0)&&(j=normalizeLink(_=m[0].slice(1,-1)),!!i.parser.validateLink(_)&&(s||(i.push({type:"link_open",href:j,level:i.level}),i.push({type:"text",content:_,level:i.level+1}),i.push({type:"link_close",level:i.level})),i.pos+=m[0].length,!0)):!!(v=u.match(oj))&&(j=normalizeLink("mailto:"+(_=v[0].slice(1,-1))),!!i.parser.validateLink(j)&&(s||(i.push({type:"link_open",href:j,level:i.level}),i.push({type:"text",content:_,level:i.level+1}),i.push({type:"link_close",level:i.level})),i.pos+=v[0].length,!0))))}],["htmltag",function htmltag(i,s){var u,m,v,_=i.pos;return!!i.options.html&&(v=i.posMax,!(60!==i.src.charCodeAt(_)||_+2>=v)&&(!(33!==(u=i.src.charCodeAt(_+1))&&63!==u&&47!==u&&!function isLetter$2(i){var s=32|i;return s>=97&&s<=122}(u))&&(!!(m=i.src.slice(_).match(vj))&&(s||i.push({type:"htmltag",content:i.src.slice(_,_+m[0].length),level:i.level}),i.pos+=m[0].length,!0))))}],["entity",function entity(i,s){var u,m,v=i.pos,_=i.posMax;if(38!==i.src.charCodeAt(v))return!1;if(v+1<_)if(35===i.src.charCodeAt(v+1)){if(m=i.src.slice(v).match(_j))return s||(u="x"===m[1][0].toLowerCase()?parseInt(m[1].slice(1),16):parseInt(m[1],10),i.pending+=isValidEntityCode(u)?fromCodePoint(u):fromCodePoint(65533)),i.pos+=m[0].length,!0}else if(m=i.src.slice(v).match(Ej)){var j=decodeEntity(m[1]);if(m[1]!==j)return s||(i.pending+=j),i.pos+=m[0].length,!0}return s||(i.pending+="&"),i.pos++,!0}]];function ParserInline(){this.ruler=new Ruler;for(var i=0;i0)i.pos=u;else{for(s=0;s=_)break}else i.pending+=i.src[i.pos++]}i.pending&&i.pushPending()},ParserInline.prototype.parse=function(i,s,u,m){var v=new StateInline(i,this,s,u,m);this.tokenize(v)};var Aj={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function StateCore(i,s,u){this.src=s,this.env=u,this.options=i.options,this.tokens=[],this.inlineMode=!1,this.inline=i.inline,this.block=i.block,this.renderer=i.renderer,this.typographer=i.typographer}function Remarkable(i,s){"string"!=typeof i&&(s=i,i="default"),s&&null!=s.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new ParserInline,this.block=new ParserBlock,this.core=new Core,this.renderer=new Renderer,this.ruler=new Ruler,this.options={},this.configure(Aj[i]),this.set(s||{})}Remarkable.prototype.set=function(i){index_browser_assign(this.options,i)},Remarkable.prototype.configure=function(i){var s=this;if(!i)throw new Error("Wrong `remarkable` preset, check name/content");i.options&&s.set(i.options),i.components&&Object.keys(i.components).forEach((function(u){i.components[u].rules&&s[u].ruler.enable(i.components[u].rules,!0)}))},Remarkable.prototype.use=function(i,s){return i(this,s),this},Remarkable.prototype.parse=function(i,s){var u=new StateCore(this,i,s);return this.core.process(u),u.tokens},Remarkable.prototype.render=function(i,s){return s=s||{},this.renderer.render(this.parse(i,s),this.options,s)},Remarkable.prototype.parseInline=function(i,s){var u=new StateCore(this,i,s);return u.inlineMode=!0,this.core.process(u),u.tokens},Remarkable.prototype.renderInline=function(i,s){return s=s||{},this.renderer.render(this.parseInline(i,s),this.options,s)};function indexOf(i,s){if(Array.prototype.indexOf)return i.indexOf(s);for(var u=0,m=i.length;u=0;u--)!0===s(i[u])&&i.splice(u,1)}function throwUnhandledCaseError(i){throw new Error("Unhandled case for value: '".concat(i,"'"))}var Cj=function(){function HtmlTag(i){void 0===i&&(i={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=i.tagName||"",this.attrs=i.attrs||{},this.innerHTML=i.innerHtml||i.innerHTML||""}return HtmlTag.prototype.setTagName=function(i){return this.tagName=i,this},HtmlTag.prototype.getTagName=function(){return this.tagName||""},HtmlTag.prototype.setAttr=function(i,s){return this.getAttrs()[i]=s,this},HtmlTag.prototype.getAttr=function(i){return this.getAttrs()[i]},HtmlTag.prototype.setAttrs=function(i){return Object.assign(this.getAttrs(),i),this},HtmlTag.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},HtmlTag.prototype.setClass=function(i){return this.setAttr("class",i)},HtmlTag.prototype.addClass=function(i){for(var s,u=this.getClass(),m=this.whitespaceRegex,v=u?u.split(m):[],_=i.split(m);s=_.shift();)-1===indexOf(v,s)&&v.push(s);return this.getAttrs().class=v.join(" "),this},HtmlTag.prototype.removeClass=function(i){for(var s,u=this.getClass(),m=this.whitespaceRegex,v=u?u.split(m):[],_=i.split(m);v.length&&(s=_.shift());){var j=indexOf(v,s);-1!==j&&v.splice(j,1)}return this.getAttrs().class=v.join(" "),this},HtmlTag.prototype.getClass=function(){return this.getAttrs().class||""},HtmlTag.prototype.hasClass=function(i){return-1!==(" "+this.getClass()+" ").indexOf(" "+i+" ")},HtmlTag.prototype.setInnerHTML=function(i){return this.innerHTML=i,this},HtmlTag.prototype.setInnerHtml=function(i){return this.setInnerHTML(i)},HtmlTag.prototype.getInnerHTML=function(){return this.innerHTML||""},HtmlTag.prototype.getInnerHtml=function(){return this.getInnerHTML()},HtmlTag.prototype.toAnchorString=function(){var i=this.getTagName(),s=this.buildAttrsStr();return["<",i,s=s?" "+s:"",">",this.getInnerHtml(),""].join("")},HtmlTag.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var i=this.getAttrs(),s=[];for(var u in i)i.hasOwnProperty(u)&&s.push(u+'="'+i[u]+'"');return s.join(" ")},HtmlTag}();var jj=function(){function AnchorTagBuilder(i){void 0===i&&(i={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=i.newWindow||!1,this.truncate=i.truncate||{},this.className=i.className||""}return AnchorTagBuilder.prototype.build=function(i){return new Cj({tagName:"a",attrs:this.createAttrs(i),innerHtml:this.processAnchorText(i.getAnchorText())})},AnchorTagBuilder.prototype.createAttrs=function(i){var s={href:i.getAnchorHref()},u=this.createCssClass(i);return u&&(s.class=u),this.newWindow&&(s.target="_blank",s.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=_)return j.host.length==s?(j.host.substr(0,s-v)+u).substr(0,_+m):buildSegment($,_).substr(0,_+m);var W="";if(j.path&&(W+="/"+j.path),j.query&&(W+="?"+j.query),W){if(($+W).length>=_)return($+W).length==s?($+W).substr(0,s):($+buildSegment(W,_-$.length)).substr(0,_+m);$+=W}if(j.fragment){var X="#"+j.fragment;if(($+X).length>=_)return($+X).length==s?($+X).substr(0,s):($+buildSegment(X,_-$.length)).substr(0,_+m);$+=X}if(j.scheme&&j.host){var Y=j.scheme+"://";if(($+Y).length<_)return(Y+$).substr(0,s)}if($.length<=s)return $;var Z="";return _>0&&(Z=$.substr(-1*Math.floor(_/2))),($.substr(0,Math.ceil(_/2))+u+Z).substr(0,_+m)}(i,u):"middle"===m?function truncateMiddle(i,s,u){if(i.length<=s)return i;var m,v;null==u?(u="…",m=8,v=3):(m=u.length,v=u.length);var _=s-v,j="";return _>0&&(j=i.substr(-1*Math.floor(_/2))),(i.substr(0,Math.ceil(_/2))+u+j).substr(0,_+m)}(i,u):function truncateEnd(i,s,u){return function ellipsis(i,s,u){var m;return i.length>s&&(null==u?(u="…",m=3):m=u.length,i=i.substring(0,s-m)+u),i}(i,s,u)}(i,u)},AnchorTagBuilder}(),Ij=function(){function Match(i){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=i.tagBuilder,this.matchedText=i.matchedText,this.offset=i.offset}return Match.prototype.getMatchedText=function(){return this.matchedText},Match.prototype.setOffset=function(i){this.offset=i},Match.prototype.getOffset=function(){return this.offset},Match.prototype.getCssClassSuffixes=function(){return[this.getType()]},Match.prototype.buildTag=function(){return this.tagBuilder.build(this)},Match}(),extendStatics=function(i,s){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(i[u]=s[u])},extendStatics(i,s)};function tslib_es6_extends(i,s){if("function"!=typeof s&&null!==s)throw new TypeError("Class extends value "+String(s)+" is not a constructor or null");function __(){this.constructor=i}extendStatics(i,s),i.prototype=null===s?Object.create(s):(__.prototype=s.prototype,new __)}var __assign=function(){return __assign=Object.assign||function __assign(i){for(var s,u=1,m=arguments.length;u-1},UrlMatchValidator.isValidUriScheme=function(i){var s=i.match(this.uriSchemeRegex),u=s&&s[0].toLowerCase();return"javascript:"!==u&&"vbscript:"!==u},UrlMatchValidator.urlMatchDoesNotHaveProtocolOrDot=function(i,s){return!(!i||s&&this.hasFullProtocolRegex.test(s)||-1!==i.indexOf("."))},UrlMatchValidator.urlMatchDoesNotHaveAtLeastOneWordChar=function(i,s){return!(!i||!s)&&(!this.hasFullProtocolRegex.test(s)&&!this.hasWordCharAfterProtocolRegex.test(i))},UrlMatchValidator.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,UrlMatchValidator.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,UrlMatchValidator.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+oI+"]"),UrlMatchValidator.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,UrlMatchValidator}(),bI=(Dj=new RegExp("[/?#](?:["+lI+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*["+lI+"\\-+&@#/%=~_()|'$*\\[\\]{}✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,getDomainNameStr(2),")","|","(","(//)?",/(?:www\.)/.source,getDomainNameStr(6),")","|","(","(//)?",getDomainNameStr(10)+"\\.",dI.source,"(?![-"+sI+"])",")",")","(?::[0-9]+)?","(?:"+Dj.source+")?"].join(""),"gi")),_I=new RegExp("["+lI+"]"),wI=function(i){function UrlMatcher(s){var u=i.call(this,s)||this;return u.stripPrefix={scheme:!0,www:!0},u.stripTrailingSlash=!0,u.decodePercentEncoding=!0,u.matcherRegex=bI,u.wordCharRegExp=_I,u.stripPrefix=s.stripPrefix,u.stripTrailingSlash=s.stripTrailingSlash,u.decodePercentEncoding=s.decodePercentEncoding,u}return tslib_es6_extends(UrlMatcher,i),UrlMatcher.prototype.parseMatches=function(i){for(var s,u=this.matcherRegex,m=this.stripPrefix,v=this.stripTrailingSlash,_=this.decodePercentEncoding,j=this.tagBuilder,M=[],_loop_1=function(){var u=s[0],W=s[1],X=s[4],Y=s[5],Z=s[9],ee=s.index,ie=Y||Z,ae=i.charAt(ee-1);if(!vI.isValid(u,W))return"continue";if(ee>0&&"@"===ae)return"continue";if(ee>0&&ie&&$.wordCharRegExp.test(ae))return"continue";if(/\?$/.test(u)&&(u=u.substr(0,u.length-1)),$.matchHasUnbalancedClosingParen(u))u=u.substr(0,u.length-1);else{var le=$.matchHasInvalidCharAfterTld(u,W);le>-1&&(u=u.substr(0,le))}var ce=["http://","https://"].find((function(i){return!!W&&-1!==W.indexOf(i)}));if(ce){var pe=u.indexOf(ce);u=u.substr(pe),W=W.substr(pe),ee+=pe}var de=W?"scheme":X?"www":"tld",fe=!!W;M.push(new zj({tagBuilder:j,matchedText:u,offset:ee,urlMatchType:de,url:u,protocolUrlMatch:fe,protocolRelativeMatch:!!ie,stripPrefix:m,stripTrailingSlash:v,decodePercentEncoding:_}))},$=this;null!==(s=u.exec(i));)_loop_1();return M},UrlMatcher.prototype.matchHasUnbalancedClosingParen=function(i){var s,u=i.charAt(i.length-1);if(")"===u)s="(";else if("]"===u)s="[";else{if("}"!==u)return!1;s="{"}for(var m=0,v=0,_=i.length-1;v<_;v++){var j=i.charAt(v);j===s?m++:j===u&&(m=Math.max(m-1,0))}return 0===m},UrlMatcher.prototype.matchHasInvalidCharAfterTld=function(i,s){if(!i)return-1;var u=0;s&&(u=i.indexOf(":"),i=i.slice(u));var m=new RegExp("^((.?//)?[-."+lI+"]*[-"+lI+"]\\.[-"+lI+"]+)").exec(i);return null===m?-1:(u+=m[1].length,i=i.slice(m[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(i)?u:-1)},UrlMatcher}(Hj),EI=new RegExp("[_".concat(lI,"]")),SI=function(i){function HashtagMatcher(s){var u=i.call(this,s)||this;return u.serviceName="twitter",u.serviceName=s.serviceName,u}return tslib_es6_extends(HashtagMatcher,i),HashtagMatcher.prototype.parseMatches=function(i){for(var s=this.tagBuilder,u=this.serviceName,m=[],v=i.length,_=0,j=-1,M=0;_-1&&_-j<=140){var v=i.slice(j,_),M=new Fj({tagBuilder:s,matchedText:v,offset:j,serviceName:u,hashtag:v.slice(1)});m.push(M)}}},HashtagMatcher}(Hj),xI=["twitter","facebook","instagram","tiktok"],kI=new RegExp("".concat(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source,"|").concat(/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source),"g"),OI=function(i){function PhoneMatcher(){var s=null!==i&&i.apply(this,arguments)||this;return s.matcherRegex=kI,s}return tslib_es6_extends(PhoneMatcher,i),PhoneMatcher.prototype.parseMatches=function(i){for(var s,u=this.matcherRegex,m=this.tagBuilder,v=[];null!==(s=u.exec(i));){var _=s[0],j=_.replace(/[^0-9,;#]/g,""),M=!(!s[1]&&!s[2]),$=0==s.index?"":i.substr(s.index-1,1),W=i.substr(s.index+_.length,1),X=!$.match(/\d/)&&!W.match(/\d/);this.testMatch(s[3])&&this.testMatch(_)&&X&&v.push(new $j({tagBuilder:m,matchedText:_,offset:s.index,number:j,plusSign:M}))}return v},PhoneMatcher.prototype.testMatch=function(i){return eI.test(i)},PhoneMatcher}(Hj),AI=new RegExp("@[_".concat(lI,"]{1,50}(?![_").concat(lI,"])"),"g"),CI=new RegExp("@[_.".concat(lI,"]{1,30}(?![_").concat(lI,"])"),"g"),jI=new RegExp("@[-_.".concat(lI,"]{1,50}(?![-_").concat(lI,"])"),"g"),II=new RegExp("@[_.".concat(lI,"]{1,23}[_").concat(lI,"](?![_").concat(lI,"])"),"g"),PI=new RegExp("[^"+lI+"]"),NI=function(i){function MentionMatcher(s){var u=i.call(this,s)||this;return u.serviceName="twitter",u.matcherRegexes={twitter:AI,instagram:CI,soundcloud:jI,tiktok:II},u.nonWordCharRegex=PI,u.serviceName=s.serviceName,u}return tslib_es6_extends(MentionMatcher,i),MentionMatcher.prototype.parseMatches=function(i){var s,u=this.serviceName,m=this.matcherRegexes[this.serviceName],v=this.nonWordCharRegex,_=this.tagBuilder,j=[];if(!m)return j;for(;null!==(s=m.exec(i));){var M=s.index,$=i.charAt(M-1);if(0===M||v.test($)){var W=s[0].replace(/\.+$/g,""),X=W.slice(1);j.push(new qj({tagBuilder:_,matchedText:W,offset:M,serviceName:u,mention:X}))}}return j},MentionMatcher}(Hj);function parseHtml(i,s){for(var u=s.onOpenTag,m=s.onCloseTag,v=s.onText,_=s.onComment,j=s.onDoctype,M=new TI,$=0,W=i.length,X=0,Y=0,Z=M;$"===i?(Z=new TI(__assign(__assign({},Z),{name:captureTagName()})),emitTagAndPreviousTextNode()):Jj.test(i)||Gj.test(i)||":"===i||resetToDataState()}function stateEndTagOpen(i){">"===i?resetToDataState():Jj.test(i)?X=3:resetToDataState()}function stateBeforeAttributeName(i){tI.test(i)||("/"===i?X=12:">"===i?emitTagAndPreviousTextNode():"<"===i?startNewTag():"="===i||rI.test(i)||nI.test(i)?resetToDataState():X=5)}function stateAttributeName(i){tI.test(i)?X=6:"/"===i?X=12:"="===i?X=7:">"===i?emitTagAndPreviousTextNode():"<"===i?startNewTag():rI.test(i)&&resetToDataState()}function stateAfterAttributeName(i){tI.test(i)||("/"===i?X=12:"="===i?X=7:">"===i?emitTagAndPreviousTextNode():"<"===i?startNewTag():rI.test(i)?resetToDataState():X=5)}function stateBeforeAttributeValue(i){tI.test(i)||('"'===i?X=8:"'"===i?X=9:/[>=`]/.test(i)?resetToDataState():"<"===i?startNewTag():X=10)}function stateAttributeValueDoubleQuoted(i){'"'===i&&(X=11)}function stateAttributeValueSingleQuoted(i){"'"===i&&(X=11)}function stateAttributeValueUnquoted(i){tI.test(i)?X=4:">"===i?emitTagAndPreviousTextNode():"<"===i&&startNewTag()}function stateAfterAttributeValueQuoted(i){tI.test(i)?X=4:"/"===i?X=12:">"===i?emitTagAndPreviousTextNode():"<"===i?startNewTag():(X=4,function reconsumeCurrentCharacter(){$--}())}function stateSelfClosingStartTag(i){">"===i?(Z=new TI(__assign(__assign({},Z),{isClosing:!0})),emitTagAndPreviousTextNode()):X=4}function stateMarkupDeclarationOpen(s){"--"===i.substr($,2)?($+=2,Z=new TI(__assign(__assign({},Z),{type:"comment"})),X=14):"DOCTYPE"===i.substr($,7).toUpperCase()?($+=7,Z=new TI(__assign(__assign({},Z),{type:"doctype"})),X=20):resetToDataState()}function stateCommentStart(i){"-"===i?X=15:">"===i?resetToDataState():X=16}function stateCommentStartDash(i){"-"===i?X=18:">"===i?resetToDataState():X=16}function stateComment(i){"-"===i&&(X=17)}function stateCommentEndDash(i){X="-"===i?18:16}function stateCommentEnd(i){">"===i?emitTagAndPreviousTextNode():"!"===i?X=19:"-"===i||(X=16)}function stateCommentEndBang(i){"-"===i?X=17:">"===i?emitTagAndPreviousTextNode():X=16}function stateDoctype(i){">"===i?emitTagAndPreviousTextNode():"<"===i&&startNewTag()}function resetToDataState(){X=0,Z=M}function startNewTag(){X=1,Z=new TI({idx:$})}function emitTagAndPreviousTextNode(){var s=i.slice(Y,Z.idx);s&&v(s,Y),"comment"===Z.type?_(Z.idx):"doctype"===Z.type?j(Z.idx):(Z.isOpening&&u(Z.name,Z.idx),Z.isClosing&&m(Z.name,Z.idx)),resetToDataState(),Y=$+1}function captureTagName(){var s=Z.idx+(Z.isClosing?2:1);return i.slice(s,$).toLowerCase()}Y<$&&function emitText(){var s=i.slice(Y,$);v(s,Y),Y=$+1}()}var TI=function TI(i){void 0===i&&(i={}),this.idx=void 0!==i.idx?i.idx:-1,this.type=i.type||"tag",this.name=i.name||"",this.isOpening=!!i.isOpening,this.isClosing=!!i.isClosing},MI=function(){function Autolinker(i){void 0===i&&(i={}),this.version=Autolinker.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(i.urls),this.email="boolean"==typeof i.email?i.email:this.email,this.phone="boolean"==typeof i.phone?i.phone:this.phone,this.hashtag=i.hashtag||this.hashtag,this.mention=i.mention||this.mention,this.newWindow="boolean"==typeof i.newWindow?i.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(i.stripPrefix),this.stripTrailingSlash="boolean"==typeof i.stripTrailingSlash?i.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof i.decodePercentEncoding?i.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=i.sanitizeHtml||!1;var s=this.mention;if(!1!==s&&-1===["twitter","instagram","soundcloud","tiktok"].indexOf(s))throw new Error("invalid `mention` cfg '".concat(s,"' - see docs"));var u=this.hashtag;if(!1!==u&&-1===xI.indexOf(u))throw new Error("invalid `hashtag` cfg '".concat(u,"' - see docs"));this.truncate=this.normalizeTruncateCfg(i.truncate),this.className=i.className||this.className,this.replaceFn=i.replaceFn||this.replaceFn,this.context=i.context||this}return Autolinker.link=function(i,s){return new Autolinker(s).link(i)},Autolinker.parse=function(i,s){return new Autolinker(s).parse(i)},Autolinker.prototype.normalizeUrlsCfg=function(i){return null==i&&(i=!0),"boolean"==typeof i?{schemeMatches:i,wwwMatches:i,tldMatches:i}:{schemeMatches:"boolean"!=typeof i.schemeMatches||i.schemeMatches,wwwMatches:"boolean"!=typeof i.wwwMatches||i.wwwMatches,tldMatches:"boolean"!=typeof i.tldMatches||i.tldMatches}},Autolinker.prototype.normalizeStripPrefixCfg=function(i){return null==i&&(i=!0),"boolean"==typeof i?{scheme:i,www:i}:{scheme:"boolean"!=typeof i.scheme||i.scheme,www:"boolean"!=typeof i.www||i.www}},Autolinker.prototype.normalizeTruncateCfg=function(i){return"number"==typeof i?{length:i,location:"end"}:function defaults(i,s){for(var u in s)s.hasOwnProperty(u)&&void 0===i[u]&&(i[u]=s[u]);return i}(i||{},{length:Number.POSITIVE_INFINITY,location:"end"})},Autolinker.prototype.parse=function(i){var s=this,u=["a","style","script"],m=0,v=[];return parseHtml(i,{onOpenTag:function(i){u.indexOf(i)>=0&&m++},onText:function(i,u){if(0===m){var _=function splitAndCapture(i,s){if(!s.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var u,m=[],v=0;u=s.exec(i);)m.push(i.substring(v,u.index)),m.push(u[0]),v=u.index+u[0].length;return m.push(i.substring(v)),m}(i,/( | |<|<|>|>|"|"|')/gi),j=u;_.forEach((function(i,u){if(u%2==0){var m=s.parseText(i,j);v.push.apply(v,m)}j+=i.length}))}},onCloseTag:function(i){u.indexOf(i)>=0&&(m=Math.max(m-1,0))},onComment:function(i){},onDoctype:function(i){}}),v=this.compactMatches(v),v=this.removeUnwantedMatches(v)},Autolinker.prototype.compactMatches=function(i){i.sort((function(i,s){return i.getOffset()-s.getOffset()}));for(var s=0;sv?s:s+1;i.splice(j,1);continue}if(i[s+1].getOffset()<_){i.splice(s+1,1);continue}}s++}return i},Autolinker.prototype.removeUnwantedMatches=function(i){return this.hashtag||utils_remove(i,(function(i){return"hashtag"===i.getType()})),this.email||utils_remove(i,(function(i){return"email"===i.getType()})),this.phone||utils_remove(i,(function(i){return"phone"===i.getType()})),this.mention||utils_remove(i,(function(i){return"mention"===i.getType()})),this.urls.schemeMatches||utils_remove(i,(function(i){return"url"===i.getType()&&"scheme"===i.getUrlMatchType()})),this.urls.wwwMatches||utils_remove(i,(function(i){return"url"===i.getType()&&"www"===i.getUrlMatchType()})),this.urls.tldMatches||utils_remove(i,(function(i){return"url"===i.getType()&&"tld"===i.getUrlMatchType()})),i},Autolinker.prototype.parseText=function(i,s){void 0===s&&(s=0),s=s||0;for(var u=this.getMatchers(),m=[],v=0,_=u.length;v<_;v++){for(var j=u[v].parseMatches(i),M=0,$=j.length;M<$;M++)j[M].setOffset(s+j[M].getOffset());m.push.apply(m,j)}return m},Autolinker.prototype.link=function(i){if(!i)return"";this.sanitizeHtml&&(i=i.replace(//g,">"));for(var s=this.parse(i),u=[],m=0,v=0,_=s.length;v<_;v++){var j=s[v];u.push(i.substring(m,j.getOffset())),u.push(this.createMatchReturnVal(j)),m=j.getOffset()+j.getMatchedText().length}return u.push(i.substring(m)),u.join("")},Autolinker.prototype.createMatchReturnVal=function(i){var s;return this.replaceFn&&(s=this.replaceFn.call(this.context,i)),"string"==typeof s?s:!1===s?i.getMatchedText():s instanceof Cj?s.toAnchorString():i.buildTag().toAnchorString()},Autolinker.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var i=this.getTagBuilder(),s=[new SI({tagBuilder:i,serviceName:this.hashtag}),new gI({tagBuilder:i}),new OI({tagBuilder:i}),new NI({tagBuilder:i,serviceName:this.mention}),new wI({tagBuilder:i,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=s},Autolinker.prototype.getTagBuilder=function(){var i=this.tagBuilder;return i||(i=this.tagBuilder=new jj({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),i},Autolinker.version="3.16.2",Autolinker.AnchorTagBuilder=jj,Autolinker.HtmlTag=Cj,Autolinker.matcher={Email:gI,Hashtag:SI,Matcher:Hj,Mention:NI,Phone:OI,Url:wI},Autolinker.match={Email:Bj,Hashtag:Fj,Match:Ij,Mention:qj,Phone:$j,Url:zj},Autolinker}();const RI=MI;var DI=/www|@|\:\/\//;function isLinkOpen(i){return/^\s]/i.test(i)}function isLinkClose(i){return/^<\/a\s*>/i.test(i)}function createLinkifier(){var i=[],s=new RI({stripPrefix:!1,url:!0,email:!0,replaceFn:function(s){switch(s.getType()){case"url":i.push({text:s.matchedText,url:s.getUrl()});break;case"email":i.push({text:s.matchedText,url:"mailto:"+s.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:i,autolinker:s}}function parseTokens(i){var s,u,m,v,_,j,M,$,W,X,Y,Z,ee,ie=i.tokens,ae=null;for(u=0,m=ie.length;u=0;s--)if("link_close"!==(_=v[s]).type){if("htmltag"===_.type&&(isLinkOpen(_.content)&&Y>0&&Y--,isLinkClose(_.content)&&Y++),!(Y>0)&&"text"===_.type&&DI.test(_.content)){if(ae||(Z=(ae=createLinkifier()).links,ee=ae.autolinker),j=_.content,Z.length=0,ee.link(j),!Z.length)continue;for(M=[],X=_.level,$=0;$({useUnsafeMarkdown:!1})};const FI=Markdown;function sanitizer(i){let{useUnsafeMarkdown:s=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const u=s,m=s?[]:["style","class"];return s&&!sanitizer.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),sanitizer.hasWarnedAboutDeprecation=!0),LI().sanitize(i,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:u,FORBID_ATTR:m})}sanitizer.hasWarnedAboutDeprecation=!1;class BaseLayout extends He.Component{render(){const{errSelectors:i,specSelectors:s,getComponent:u}=this.props,m=u("SvgAssets"),v=u("InfoContainer",!0),_=u("VersionPragmaFilter"),j=u("operations",!0),M=u("Models",!0),$=u("Webhooks",!0),W=u("Row"),X=u("Col"),Y=u("errors",!0),Z=u("ServersContainer",!0),ee=u("SchemesContainer",!0),ie=u("AuthorizeBtnContainer",!0),ae=u("FilterContainer",!0),le=s.isSwagger2(),ce=s.isOAS3(),pe=s.isOAS31(),de=!s.specStr(),fe=s.loadingStatus();let ye=null;if("loading"===fe&&(ye=He.createElement("div",{className:"info"},He.createElement("div",{className:"loading-container"},He.createElement("div",{className:"loading"})))),"failed"===fe&&(ye=He.createElement("div",{className:"info"},He.createElement("div",{className:"loading-container"},He.createElement("h4",{className:"title"},"Failed to load API definition."),He.createElement(Y,null)))),"failedConfig"===fe){const s=i.lastError(),u=s?s.get("message"):"";ye=He.createElement("div",{className:"info failed-config"},He.createElement("div",{className:"loading-container"},He.createElement("h4",{className:"title"},"Failed to load remote configuration."),He.createElement("p",null,u)))}if(!ye&&de&&(ye=He.createElement("h4",null,"No API definition provided.")),ye)return He.createElement("div",{className:"swagger-ui"},He.createElement("div",{className:"loading-container"},ye));const be=s.servers(),_e=s.schemes(),we=be&&be.size,Se=_e&&_e.size,xe=!!s.securityDefinitions();return He.createElement("div",{className:"swagger-ui"},He.createElement(m,null),He.createElement(_,{isSwagger2:le,isOAS3:ce,alsoShow:He.createElement(Y,null)},He.createElement(Y,null),He.createElement(W,{className:"information-container"},He.createElement(X,{mobile:12},He.createElement(v,null))),we||Se||xe?He.createElement("div",{className:"scheme-container"},He.createElement(X,{className:"schemes wrapper",mobile:12},we?He.createElement(Z,null):null,Se?He.createElement(ee,null):null,xe?He.createElement(ie,null):null)):null,He.createElement(ae,null),He.createElement(W,null,He.createElement(X,{mobile:12,desktop:12},He.createElement(j,null))),pe&&He.createElement(W,{className:"webhooks-container"},He.createElement(X,{mobile:12,desktop:12},He.createElement($,null))),He.createElement(W,null,He.createElement(X,{mobile:12,desktop:12},He.createElement(M,null)))))}}const core_components=()=>({components:{App,authorizationPopup:AuthorizationPopup,authorizeBtn:AuthorizeBtn,AuthorizeBtnContainer,authorizeOperationBtn:AuthorizeOperationBtn,auths:Auths,AuthItem:auth_item_Auths,authError:AuthError,oauth2:Oauth2,apiKeyAuth:ApiKeyAuth,basicAuth:BasicAuth,clear:Clear,liveResponse:LiveResponse,InitializedInput,info:vC,InfoContainer,InfoUrl,InfoBasePath,Contact:bC,License:_C,JumpToPath,CopyToClipboardBtn,onlineValidatorBadge:OnlineValidatorBadge,operations:Operations,operation:operation_Operation,OperationSummary,OperationSummaryMethod,OperationSummaryPath,highlightCode:pC,responses:responses_Responses,response:response_Response,ResponseExtension:response_extension,responseBody:ResponseBody,parameters:Parameters,parameterRow:ParameterRow,execute:Execute,headers:headers_Headers,errors:Errors,contentType:ContentType,overview:Overview,footer:Footer,FilterContainer,ParamBody,curl:Curl,schemes:Schemes,SchemesContainer,modelExample:ModelExample,ModelWrapper,ModelCollapse,Model,Models,EnumModel:enum_model,ObjectModel,ArrayModel,PrimitiveModel:Primitive,Property:property,TryItOutButton,Markdown:FI,BaseLayout,VersionPragmaFilter,VersionStamp:version_stamp,OperationExt:operation_extensions,OperationExtRow:operation_extension_row,ParameterExt:parameter_extension,ParameterIncludeEmpty,OperationTag,OperationContainer,OpenAPIVersion:openapi_version,DeepLink:deep_link,SvgAssets:svg_assets,Example:example_Example,ExamplesSelect,ExamplesSelectValueRetainer}}),form_components=()=>({components:{...xe}});var qI=__webpack_require__(775),$I=__webpack_require__.n(qI);const UI={value:"",onChange:()=>{},schema:{},keyName:"",required:!1,errors:(0,et.List)()};class JsonSchemaForm extends He.Component{static defaultProps=UI;componentDidMount(){const{dispatchInitialValue:i,value:s,onChange:u}=this.props;i?u(s):!1===i&&u("")}render(){let{schema:i,errors:s,value:u,onChange:m,getComponent:v,fn:_,disabled:j}=this.props;const M=i&&i.get?i.get("format"):null,$=i&&i.get?i.get("type"):null;let getComponentSilently=i=>v(i,!1,{failSilently:!0}),W=$?getComponentSilently(M?`JsonSchema_${$}_${M}`:`JsonSchema_${$}`):v("JsonSchema_string");return W||(W=v("JsonSchema_string")),He.createElement(W,Ao()({},this.props,{errors:s,fn:_,getComponent:v,value:u,onChange:m,schema:i,disabled:j}))}}class JsonSchema_string extends He.Component{static defaultProps=UI;onChange=i=>{const s=this.props.schema&&"file"===this.props.schema.get("type")?i.target.files[0]:i.target.value;this.props.onChange(s,this.props.keyName)};onEnumChange=i=>this.props.onChange(i);render(){let{getComponent:i,value:s,schema:u,errors:m,required:v,description:_,disabled:j}=this.props;const M=u&&u.get?u.get("enum"):null,$=u&&u.get?u.get("format"):null,W=u&&u.get?u.get("type"):null,X=u&&u.get?u.get("in"):null;if(s||(s=""),m=m.toJS?m.toJS():[],M){const u=i("Select");return He.createElement(u,{className:m.length?"invalid":"",title:m.length?m:"",allowedValues:[...M],value:s,allowEmptyValue:!v,disabled:j,onChange:this.onEnumChange})}const Y=j||X&&"formData"===X&&!("FormData"in window),Z=i("Input");return W&&"file"===W?He.createElement(Z,{type:"file",className:m.length?"invalid":"",title:m.length?m:"",onChange:this.onChange,disabled:Y}):He.createElement($I(),{type:$&&"password"===$?"password":"text",className:m.length?"invalid":"",title:m.length?m:"",value:s,minLength:0,debounceTimeout:350,placeholder:_,onChange:this.onChange,disabled:Y})}}class JsonSchema_array extends He.PureComponent{static defaultProps=UI;constructor(i,s){super(i,s),this.state={value:valueOrEmptyList(i.value),schema:i.schema}}UNSAFE_componentWillReceiveProps(i){const s=valueOrEmptyList(i.value);s!==this.state.value&&this.setState({value:s}),i.schema!==this.state.schema&&this.setState({schema:i.schema})}onChange=()=>{this.props.onChange(this.state.value)};onItemChange=(i,s)=>{this.setState((u=>{let{value:m}=u;return{value:m.set(s,i)}}),this.onChange)};removeItem=i=>{this.setState((s=>{let{value:u}=s;return{value:u.delete(i)}}),this.onChange)};addItem=()=>{const{fn:i}=this.props;let s=valueOrEmptyList(this.state.value);this.setState((()=>({value:s.push(i.getSampleSchema(this.state.schema.get("items"),!1,{includeWriteOnly:!0}))})),this.onChange)};onEnumChange=i=>{this.setState((()=>({value:i})),this.onChange)};render(){let{getComponent:i,required:s,schema:u,errors:m,fn:v,disabled:_}=this.props;m=m.toJS?m.toJS():Array.isArray(m)?m:[];const j=m.filter((i=>"string"==typeof i)),M=m.filter((i=>void 0!==i.needRemove)).map((i=>i.error)),$=this.state.value,W=!!($&&$.count&&$.count()>0),X=u.getIn(["items","enum"]),Y=u.getIn(["items","type"]),Z=u.getIn(["items","format"]),ee=u.get("items");let ie,ae=!1,le="file"===Y||"string"===Y&&"binary"===Z;if(Y&&Z?ie=i(`JsonSchema_${Y}_${Z}`):"boolean"!==Y&&"array"!==Y&&"object"!==Y||(ie=i(`JsonSchema_${Y}`)),ie||le||(ae=!0),X){const u=i("Select");return He.createElement(u,{className:m.length?"invalid":"",title:m.length?m:"",multiple:!0,value:$,disabled:_,allowedValues:X,allowEmptyValue:!s,onChange:this.onEnumChange})}const ce=i("Button");return He.createElement("div",{className:"json-schema-array"},W?$.map(((s,u)=>{const j=(0,et.fromJS)([...m.filter((i=>i.index===u)).map((i=>i.error))]);return He.createElement("div",{key:u,className:"json-schema-form-item"},le?He.createElement(JsonSchemaArrayItemFile,{value:s,onChange:i=>this.onItemChange(i,u),disabled:_,errors:j,getComponent:i}):ae?He.createElement(JsonSchemaArrayItemText,{value:s,onChange:i=>this.onItemChange(i,u),disabled:_,errors:j}):He.createElement(ie,Ao()({},this.props,{value:s,onChange:i=>this.onItemChange(i,u),disabled:_,errors:j,schema:ee,getComponent:i,fn:v})),_?null:He.createElement(ce,{className:`btn btn-sm json-schema-form-item-remove ${M.length?"invalid":null}`,title:M.length?M:"",onClick:()=>this.removeItem(u)}," - "))})):null,_?null:He.createElement(ce,{className:`btn btn-sm json-schema-form-item-add ${j.length?"invalid":null}`,title:j.length?j:"",onClick:this.addItem},"Add ",Y?`${Y} `:"","item"))}}class JsonSchemaArrayItemText extends He.Component{static defaultProps=UI;onChange=i=>{const s=i.target.value;this.props.onChange(s,this.props.keyName)};render(){let{value:i,errors:s,description:u,disabled:m}=this.props;return i||(i=""),s=s.toJS?s.toJS():[],He.createElement($I(),{type:"text",className:s.length?"invalid":"",title:s.length?s:"",value:i,minLength:0,debounceTimeout:350,placeholder:u,onChange:this.onChange,disabled:m})}}class JsonSchemaArrayItemFile extends He.Component{static defaultProps=UI;onFileChange=i=>{const s=i.target.files[0];this.props.onChange(s,this.props.keyName)};render(){let{getComponent:i,errors:s,disabled:u}=this.props;const m=i("Input"),v=u||!("FormData"in window);return He.createElement(m,{type:"file",className:s.length?"invalid":"",title:s.length?s:"",onChange:this.onFileChange,disabled:v})}}class JsonSchema_boolean extends He.Component{static defaultProps=UI;onEnumChange=i=>this.props.onChange(i);render(){let{getComponent:i,value:s,errors:u,schema:m,required:v,disabled:_}=this.props;u=u.toJS?u.toJS():[];let j=m&&m.get?m.get("enum"):null,M=!j||!v,$=!j&&["true","false"];const W=i("Select");return He.createElement(W,{className:u.length?"invalid":"",title:u.length?u:"",value:String(s),disabled:_,allowedValues:j?[...j]:$,allowEmptyValue:M,onChange:this.onEnumChange})}}const stringifyObjectErrors=i=>i.map((i=>{const s=void 0!==i.propKey?i.propKey:i.index;let u="string"==typeof i?i:"string"==typeof i.error?i.error:null;if(!s&&u)return u;let m=i.error,v=`/${i.propKey}`;for(;"object"==typeof m;){const i=void 0!==m.propKey?m.propKey:m.index;if(void 0===i)break;if(v+=`/${i}`,!m.error)break;m=m.error}return`${v}: ${m}`}));class JsonSchema_object extends He.PureComponent{constructor(){super()}static defaultProps=UI;onChange=i=>{this.props.onChange(i)};handleOnChange=i=>{const s=i.target.value;this.onChange(s)};render(){let{getComponent:i,value:s,errors:u,disabled:m}=this.props;const v=i("TextArea");return u=u.toJS?u.toJS():Array.isArray(u)?u:[],He.createElement("div",null,He.createElement(v,{className:lC()({invalid:u.length}),title:u.length?stringifyObjectErrors(u).join(", "):"",value:stringify(s),disabled:m,onChange:this.handleOnChange}))}}function valueOrEmptyList(i){return et.List.isList(i)?i:Array.isArray(i)?(0,et.fromJS)(i):(0,et.List)()}const json_schema_components=()=>({components:{...Ie}}),base=()=>[configsPlugin,util,logs,view,plugins_spec,err,icons,plugins_layout,json_schema_5_samples,core_components,form_components,swagger_client,json_schema_components,auth,downloadUrlPlugin,deep_linking,filter,on_complete,plugins_request_snippets,safe_render()],zI=(0,et.Map)();function onlyOAS3(i){return(s,u)=>function(){if(u.getSystem().specSelectors.isOAS3()){const s=i(...arguments);return"function"==typeof s?s(u):s}return s(...arguments)}}const VI=onlyOAS3(Xt((()=>null))),WI=onlyOAS3((()=>i=>{const s=i.getSystem().specSelectors.specJson().getIn(["components","schemas"]);return et.Map.isMap(s)?s:zI})),KI=onlyOAS3((()=>i=>i.getSystem().specSelectors.specJson().hasIn(["servers",0]))),HI=onlyOAS3(Xt(Ba,(i=>i.getIn(["components","securitySchemes"])||null))),wrap_selectors_validOperationMethods=(i,s)=>function(u){if(s.specSelectors.isOAS3())return s.oas3Selectors.validOperationMethods();for(var m=arguments.length,v=new Array(m>1?m-1:0),_=1;_function(){for(var m=arguments.length,v=new Array(m),_=0;_i),(i=>{let{specSelectors:s}=i;return s.securityDefinitions()}),((i,s)=>{let u=(0,et.List)();return s?(s.entrySeq().forEach((i=>{let[s,m]=i;const v=m.get("type");if("oauth2"===v&&m.get("flows").entrySeq().forEach((i=>{let[v,_]=i,j=(0,et.fromJS)({flow:v,authorizationUrl:_.get("authorizationUrl"),tokenUrl:_.get("tokenUrl"),scopes:_.get("scopes"),type:m.get("type"),description:m.get("description")});u=u.push(new et.Map({[s]:j.filter((i=>void 0!==i))}))})),"http"!==v&&"apiKey"!==v||(u=u.push(new et.Map({[s]:m}))),"openIdConnect"===v&&m.get("openIdConnectData")){let i=m.get("openIdConnectData");(i.get("grant_types_supported")||["authorization_code","implicit"]).forEach((v=>{let _=i.get("scopes_supported")&&i.get("scopes_supported").reduce(((i,s)=>i.set(s,"")),new et.Map),j=(0,et.fromJS)({flow:v,authorizationUrl:i.get("authorization_endpoint"),tokenUrl:i.get("token_endpoint"),scopes:_,type:"oauth2",openIdConnectUrl:m.get("openIdConnectUrl")});u=u.push(new et.Map({[s]:j.filter((i=>void 0!==i))}))}))}})),u):u})));function OAS3ComponentWrapFactory(i){return(s,u)=>m=>"function"==typeof u.specSelectors?.isOAS3?u.specSelectors.isOAS3()?He.createElement(i,Ao()({},m,u,{Ori:s})):He.createElement(s,m):(console.warn("OAS3 wrapper: couldn't get spec"),null)}const eP=(0,et.Map)(),selectors_isSwagger2=()=>i=>function isSwagger2(i){const s=i.get("swagger");return"string"==typeof s&&"2.0"===s}(i.getSystem().specSelectors.specJson()),selectors_isOAS30=()=>i=>function isOAS30(i){const s=i.get("openapi");return"string"==typeof s&&/^3\.0\.([0123])(?:-rc[012])?$/.test(s)}(i.getSystem().specSelectors.specJson()),selectors_isOAS3=()=>i=>i.getSystem().specSelectors.isOAS30();function selectors_onlyOAS3(i){return function(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v{if(u.specSelectors.isOAS3()){const v=i(s,...m);return"function"==typeof v?v(u):v}return null}}}const tP=selectors_onlyOAS3((()=>i=>i.specSelectors.specJson().get("servers",eP))),rP=selectors_onlyOAS3(((i,s)=>{let{callbacks:u,specPath:m}=s;return i=>{const s=i.specSelectors.validOperationMethods();return et.Map.isMap(u)?u.reduce(((i,u,v)=>{if(!et.Map.isMap(u))return i;const _=u.reduce(((i,u,_)=>{if(!et.Map.isMap(u))return i;const j=u.entrySeq().filter((i=>{let[u]=i;return s.includes(u)})).map((i=>{let[s,u]=i;return{operation:(0,et.Map)({operation:u}),method:s,path:_,callbackName:v,specPath:m.concat([v,_,s])}}));return i.concat(j)}),(0,et.List)());return i.concat(_)}),(0,et.List)()).groupBy((i=>i.callbackName)).map((i=>i.toArray())).toObject():{}}})),callbacks=i=>{let{callbacks:s,specPath:u,specSelectors:m,getComponent:v}=i;const _=m.callbacksOperations({callbacks:s,specPath:u}),j=Object.keys(_),M=v("OperationContainer",!0);return 0===j.length?He.createElement("span",null,"No callbacks"):He.createElement("div",null,j.map((i=>He.createElement("div",{key:`${i}`},He.createElement("h2",null,i),_[i].map((s=>He.createElement(M,{key:`${i}-${s.path}-${s.method}`,op:s.operation,tag:"callbacks",method:s.method,path:s.path,specPath:s.specPath,allowTryItOut:!1})))))))},getDefaultRequestBodyValue=(i,s,u,m)=>{const v=i.getIn(["content",s])??(0,et.OrderedMap)(),_=v.get("schema",(0,et.OrderedMap)()).toJS(),j=void 0!==v.get("examples"),M=v.get("example"),$=j?v.getIn(["examples",u,"value"]):M;return stringify(m.getSampleSchema(_,s,{includeWriteOnly:!0},$))},components_request_body=i=>{let{userHasEditedBody:s,requestBody:u,requestBodyValue:m,requestBodyInclusionSetting:v,requestBodyErrors:_,getComponent:j,getConfigs:M,specSelectors:$,fn:W,contentType:X,isExecute:Y,specPath:Z,onChange:ee,onChangeIncludeEmpty:ie,activeExamplesKey:ae,updateActiveExamplesKey:le,setRetainRequestBodyValueFlag:ce}=i;const handleFile=i=>{ee(i.target.files[0])},setIsIncludedOptions=i=>{let s={key:i,shouldDispatchInit:!1,defaultValue:!0};return"no value"===v.get(i,"no value")&&(s.shouldDispatchInit=!0),s},pe=j("Markdown",!0),de=j("modelExample"),fe=j("RequestBodyEditor"),ye=j("highlightCode"),be=j("ExamplesSelectValueRetainer"),_e=j("Example"),we=j("ParameterIncludeEmpty"),{showCommonExtensions:Se}=M(),xe=u?.get("description")??null,Ie=u?.get("content")??new et.OrderedMap;X=X||Ie.keySeq().first()||"";const Pe=Ie.get(X)??(0,et.OrderedMap)(),Te=Pe.get("schema",(0,et.OrderedMap)()),Re=Pe.get("examples",null),qe=Re?.map(((i,s)=>{const m=i?.get("value",null);return m&&(i=i.set("value",getDefaultRequestBodyValue(u,X,s,W),m)),i}));if(_=et.List.isList(_)?_:(0,et.List)(),!Pe.size)return null;const ze="object"===Pe.getIn(["schema","type"]),Ve="binary"===Pe.getIn(["schema","format"]),We="base64"===Pe.getIn(["schema","format"]);if("application/octet-stream"===X||0===X.indexOf("image/")||0===X.indexOf("audio/")||0===X.indexOf("video/")||Ve||We){const i=j("Input");return Y?He.createElement(i,{type:"file",onChange:handleFile}):He.createElement("i",null,"Example values are not available for ",He.createElement("code",null,X)," media types.")}if(ze&&("application/x-www-form-urlencoded"===X||0===X.indexOf("multipart/"))&&Te.get("properties",(0,et.OrderedMap)()).size>0){const i=j("JsonSchemaForm"),s=j("ParameterExt"),u=Te.get("properties",(0,et.OrderedMap)());return m=et.Map.isMap(m)?m:(0,et.OrderedMap)(),He.createElement("div",{className:"table-container"},xe&&He.createElement(pe,{source:xe}),He.createElement("table",null,He.createElement("tbody",null,et.Map.isMap(u)&&u.entrySeq().map((u=>{let[M,$]=u;if($.get("readOnly"))return;let X=Se?getCommonExtensions($):null;const Z=Te.get("required",(0,et.List)()).includes(M),ae=$.get("type"),le=$.get("format"),ce=$.get("description"),de=m.getIn([M,"value"]),fe=m.getIn([M,"errors"])||_,ye=v.get(M)||!1,be=$.has("default")||$.has("example")||$.hasIn(["items","example"])||$.hasIn(["items","default"]),_e=$.has("enum")&&(1===$.get("enum").size||Z),xe=be||_e;let Ie="";"array"!==ae||xe||(Ie=[]),("object"===ae||xe)&&(Ie=W.getSampleSchema($,!1,{includeWriteOnly:!0})),"string"!=typeof Ie&&"object"===ae&&(Ie=stringify(Ie)),"string"==typeof Ie&&"array"===ae&&(Ie=JSON.parse(Ie));const Pe="string"===ae&&("binary"===le||"base64"===le);return He.createElement("tr",{key:M,className:"parameters","data-property-name":M},He.createElement("td",{className:"parameters-col_name"},He.createElement("div",{className:Z?"parameter__name required":"parameter__name"},M,Z?He.createElement("span",null," *"):null),He.createElement("div",{className:"parameter__type"},ae,le&&He.createElement("span",{className:"prop-format"},"($",le,")"),Se&&X.size?X.entrySeq().map((i=>{let[u,m]=i;return He.createElement(s,{key:`${u}-${m}`,xKey:u,xVal:m})})):null),He.createElement("div",{className:"parameter__deprecated"},$.get("deprecated")?"deprecated":null)),He.createElement("td",{className:"parameters-col_description"},He.createElement(pe,{source:ce}),Y?He.createElement("div",null,He.createElement(i,{fn:W,dispatchInitialValue:!Pe,schema:$,description:M,getComponent:j,value:void 0===de?Ie:de,required:Z,errors:fe,onChange:i=>{ee(i,[M])}}),Z?null:He.createElement(we,{onChange:i=>ie(M,i),isIncluded:ye,isIncludedOptions:setIsIncludedOptions(M),isDisabled:Array.isArray(de)?0!==de.length:!isEmptyValue(de)})):null))})))))}const Xe=getDefaultRequestBodyValue(u,X,ae,W);let Ye=null;return getKnownSyntaxHighlighterLanguage(Xe)&&(Ye="json"),He.createElement("div",null,xe&&He.createElement(pe,{source:xe}),qe?He.createElement(be,{userHasEditedBody:s,examples:qe,currentKey:ae,currentUserInputValue:m,onSelect:i=>{le(i)},updateValue:ee,defaultToFirstExample:!0,getComponent:j,setRetainRequestBodyValueFlag:ce}):null,Y?He.createElement("div",null,He.createElement(fe,{value:m,errors:_,defaultValue:Xe,onChange:ee,getComponent:j})):He.createElement(de,{getComponent:j,getConfigs:M,specSelectors:$,expandDepth:1,isExecute:Y,schema:Pe.get("schema"),specPath:Z.push("content",X),example:He.createElement(ye,{className:"body-param__example",getConfigs:M,language:Ye,value:stringify(m)||Xe}),includeWriteOnly:!0}),qe?He.createElement(_e,{example:qe.get(ae),getComponent:j,getConfigs:M}):null)};class operation_link_OperationLink extends He.Component{render(){const{link:i,name:s,getComponent:u}=this.props,m=u("Markdown",!0);let v=i.get("operationId")||i.get("operationRef"),_=i.get("parameters")&&i.get("parameters").toJS(),j=i.get("description");return He.createElement("div",{className:"operation-link"},He.createElement("div",{className:"description"},He.createElement("b",null,He.createElement("code",null,s)),j?He.createElement(m,{source:j}):null),He.createElement("pre",null,"Operation `",v,"`",He.createElement("br",null),He.createElement("br",null),"Parameters ",function padString(i,s){if("string"!=typeof s)return"";return s.split("\n").map(((s,u)=>u>0?Array(i+1).join(" ")+s:s)).join("\n")}(0,JSON.stringify(_,null,2))||"{}",He.createElement("br",null)))}}const nP=operation_link_OperationLink;class servers_Servers extends He.Component{componentDidMount(){let{servers:i,currentServer:s}=this.props;s||this.setServer(i.first()?.get("url"))}UNSAFE_componentWillReceiveProps(i){let{servers:s,setServerVariableValue:u,getServerVariable:m}=i;if(this.props.currentServer!==i.currentServer||this.props.servers!==i.servers){let v=s.find((s=>s.get("url")===i.currentServer)),_=this.props.servers.find((i=>i.get("url")===this.props.currentServer))||(0,et.OrderedMap)();if(!v)return this.setServer(s.first().get("url"));let j=((_.get("variables")||(0,et.OrderedMap)()).find((i=>i.get("default")))||(0,et.OrderedMap)()).get("default"),M=v.get("variables")||(0,et.OrderedMap)(),$=(M.find((i=>i.get("default")))||(0,et.OrderedMap)()).get("default");M.map(((s,v)=>{m(i.currentServer,v)&&j===$||u({server:i.currentServer,key:v,val:s.get("default")||""})}))}}onServerChange=i=>{this.setServer(i.target.value)};onServerVariableValueChange=i=>{let{setServerVariableValue:s,currentServer:u}=this.props,m=i.target.getAttribute("data-variable"),v=i.target.value;"function"==typeof s&&s({server:u,key:m,val:v})};setServer=i=>{let{setSelectedServer:s}=this.props;s(i)};render(){let{servers:i,currentServer:s,getServerVariable:u,getEffectiveServerValue:m}=this.props,v=(i.find((i=>i.get("url")===s))||(0,et.OrderedMap)()).get("variables")||(0,et.OrderedMap)(),_=0!==v.size;return He.createElement("div",{className:"servers"},He.createElement("label",{htmlFor:"servers"},He.createElement("select",{onChange:this.onServerChange,value:s},i.valueSeq().map((i=>He.createElement("option",{value:i.get("url"),key:i.get("url")},i.get("url"),i.get("description")&&` - ${i.get("description")}`))).toArray())),_?He.createElement("div",null,He.createElement("div",{className:"computed-url"},"Computed URL:",He.createElement("code",null,m(s))),He.createElement("h4",null,"Server variables"),He.createElement("table",null,He.createElement("tbody",null,v.entrySeq().map((i=>{let[m,v]=i;return He.createElement("tr",{key:m},He.createElement("td",null,m),He.createElement("td",null,v.get("enum")?He.createElement("select",{"data-variable":m,onChange:this.onServerVariableValueChange},v.get("enum").map((i=>He.createElement("option",{selected:i===u(s,m),key:i,value:i},i)))):He.createElement("input",{type:"text",value:u(s,m)||"",onChange:this.onServerVariableValueChange,"data-variable":m})))}))))):null)}}class ServersContainer extends He.Component{render(){const{specSelectors:i,oas3Selectors:s,oas3Actions:u,getComponent:m}=this.props,v=i.servers(),_=m("Servers");return v&&v.size?He.createElement("div",null,He.createElement("span",{className:"servers-title"},"Servers"),He.createElement(_,{servers:v,currentServer:s.selectedServer(),setSelectedServer:u.setSelectedServer,setServerVariableValue:u.setServerVariableValue,getServerVariable:s.serverVariableValue,getEffectiveServerValue:s.serverEffectiveValue})):null}}const oP=Function.prototype;class RequestBodyEditor extends He.PureComponent{static defaultProps={onChange:oP,userHasEditedBody:!1};constructor(i,s){super(i,s),this.state={value:stringify(i.value)||i.defaultValue},i.onChange(i.value)}applyDefaultValue=i=>{const{onChange:s,defaultValue:u}=i||this.props;return this.setState({value:u}),s(u)};onChange=i=>{this.props.onChange(stringify(i))};onDomChange=i=>{const s=i.target.value;this.setState({value:s},(()=>this.onChange(s)))};UNSAFE_componentWillReceiveProps(i){this.props.value!==i.value&&i.value!==this.state.value&&this.setState({value:stringify(i.value)}),!i.value&&i.defaultValue&&this.state.value&&this.applyDefaultValue(i)}render(){let{getComponent:i,errors:s}=this.props,{value:u}=this.state,m=s.size>0;const v=i("TextArea");return He.createElement("div",{className:"body-param"},He.createElement(v,{className:lC()("body-param__text",{invalid:m}),title:s.size?s.join(", "):"",value:u,onChange:this.onDomChange}))}}class HttpAuth extends He.Component{constructor(i,s){super(i,s);let{name:u,schema:m}=this.props,v=this.getValue();this.state={name:u,schema:m,value:v}}getValue(){let{name:i,authorized:s}=this.props;return s&&s.getIn([i,"value"])}onChange=i=>{let{onChange:s}=this.props,{value:u,name:m}=i.target,v=Object.assign({},this.state.value);m?v[m]=u:v=u,this.setState({value:v},(()=>s(this.state)))};render(){let{schema:i,getComponent:s,errSelectors:u,name:m}=this.props;const v=s("Input"),_=s("Row"),j=s("Col"),M=s("authError"),$=s("Markdown",!0),W=s("JumpToPath",!0),X=(i.get("scheme")||"").toLowerCase();let Y=this.getValue(),Z=u.allErrors().filter((i=>i.get("authId")===m));if("basic"===X){let s=Y?Y.get("username"):null;return He.createElement("div",null,He.createElement("h4",null,He.createElement("code",null,m||i.get("name")),"  (http, Basic)",He.createElement(W,{path:["securityDefinitions",m]})),s&&He.createElement("h6",null,"Authorized"),He.createElement(_,null,He.createElement($,{source:i.get("description")})),He.createElement(_,null,He.createElement("label",null,"Username:"),s?He.createElement("code",null," ",s," "):He.createElement(j,null,He.createElement(v,{type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),He.createElement(_,null,He.createElement("label",null,"Password:"),s?He.createElement("code",null," ****** "):He.createElement(j,null,He.createElement(v,{autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),Z.valueSeq().map(((i,s)=>He.createElement(M,{error:i,key:s}))))}return"bearer"===X?He.createElement("div",null,He.createElement("h4",null,He.createElement("code",null,m||i.get("name")),"  (http, Bearer)",He.createElement(W,{path:["securityDefinitions",m]})),Y&&He.createElement("h6",null,"Authorized"),He.createElement(_,null,He.createElement($,{source:i.get("description")})),He.createElement(_,null,He.createElement("label",null,"Value:"),Y?He.createElement("code",null," ****** "):He.createElement(j,null,He.createElement(v,{type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),Z.valueSeq().map(((i,s)=>He.createElement(M,{error:i,key:s})))):He.createElement("div",null,He.createElement("em",null,He.createElement("b",null,m)," HTTP authentication: unsupported scheme ",`'${X}'`))}}class operation_servers_OperationServers extends He.Component{setSelectedServer=i=>{const{path:s,method:u}=this.props;return this.forceUpdate(),this.props.setSelectedServer(i,`${s}:${u}`)};setServerVariableValue=i=>{const{path:s,method:u}=this.props;return this.forceUpdate(),this.props.setServerVariableValue({...i,namespace:`${s}:${u}`})};getSelectedServer=()=>{const{path:i,method:s}=this.props;return this.props.getSelectedServer(`${i}:${s}`)};getServerVariable=(i,s)=>{const{path:u,method:m}=this.props;return this.props.getServerVariable({namespace:`${u}:${m}`,server:i},s)};getEffectiveServerValue=i=>{const{path:s,method:u}=this.props;return this.props.getEffectiveServerValue({server:i,namespace:`${s}:${u}`})};render(){const{operationServers:i,pathServers:s,getComponent:u}=this.props;if(!i&&!s)return null;const m=u("Servers"),v=i||s,_=i?"operation":"path";return He.createElement("div",{className:"opblock-section operation-servers"},He.createElement("div",{className:"opblock-section-header"},He.createElement("div",{className:"tab-header"},He.createElement("h4",{className:"opblock-title"},"Servers"))),He.createElement("div",{className:"opblock-description-wrapper"},He.createElement("h4",{className:"message"},"These ",_,"-level options override the global server options."),He.createElement(m,{servers:v,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}const iP={Callbacks:callbacks,HttpAuth,RequestBody:components_request_body,Servers:servers_Servers,ServersContainer,RequestBodyEditor,OperationServers:operation_servers_OperationServers,operationLink:nP},aP=new Remarkable("commonmark");aP.block.ruler.enable(["table"]),aP.set({linkTarget:"_blank"});const markdown_Markdown=i=>{let{source:s,className:u="",getConfigs:m}=i;if("string"!=typeof s)return null;if(s){const{useUnsafeMarkdown:i}=m(),v=sanitizer(aP.render(s),{useUnsafeMarkdown:i});let _;return"string"==typeof v&&(_=v.trim()),He.createElement("div",{dangerouslySetInnerHTML:{__html:_},className:lC()(u,"renderedMarkdown")})}return null};markdown_Markdown.defaultProps={getConfigs:()=>({useUnsafeMarkdown:!1})};const sP=OAS3ComponentWrapFactory(markdown_Markdown),lP=OAS3ComponentWrapFactory((i=>{let{Ori:s,...u}=i;const{schema:m,getComponent:v,errSelectors:_,authorized:j,onAuthChange:M,name:$}=u,W=v("HttpAuth");return"http"===m.get("type")?He.createElement(W,{key:$,schema:m,name:$,errSelectors:_,authorized:j,getComponent:v,onChange:M}):He.createElement(s,u)})),cP=OAS3ComponentWrapFactory(OnlineValidatorBadge);class ModelComponent extends He.Component{render(){let{getConfigs:i,schema:s}=this.props,u=["model-box"],m=null;return!0===s.get("deprecated")&&(u.push("deprecated"),m=He.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),He.createElement("div",{className:u.join(" ")},m,He.createElement(Model,Ao()({},this.props,{getConfigs:i,depth:1,expandDepth:this.props.expandDepth||0})))}}const uP=OAS3ComponentWrapFactory(ModelComponent),pP=OAS3ComponentWrapFactory((i=>{let{Ori:s,...u}=i;const{schema:m,getComponent:v,errors:_,onChange:j}=u,M=m&&m.get?m.get("format"):null,$=m&&m.get?m.get("type"):null,W=v("Input");return $&&"string"===$&&M&&("binary"===M||"base64"===M)?He.createElement(W,{type:"file",className:_.length?"invalid":"",title:_.length?_:"",onChange:i=>{j(i.target.files[0])},disabled:s.isDisabled}):He.createElement(s,u)})),hP={Markdown:sP,AuthItem:lP,OpenAPIVersion:function OAS30ComponentWrapFactory(i){return(s,u)=>m=>"function"==typeof u.specSelectors?.isOAS30?u.specSelectors.isOAS30()?He.createElement(i,Ao()({},m,u,{Ori:s})):He.createElement(s,m):(console.warn("OAS30 wrapper: couldn't get spec"),null)}((i=>{const{Ori:s}=i;return He.createElement(s,{oasVersion:"3.0"})})),JsonSchema_string:pP,model:uP,onlineValidatorBadge:cP},dP="oas3_set_servers",fP="oas3_set_request_body_value",mP="oas3_set_request_body_retain_flag",gP="oas3_set_request_body_inclusion",yP="oas3_set_active_examples_member",vP="oas3_set_request_content_type",bP="oas3_set_response_content_type",_P="oas3_set_server_variable_value",wP="oas3_set_request_body_validate_error",EP="oas3_clear_request_body_validate_error",SP="oas3_clear_request_body_value";function setSelectedServer(i,s){return{type:dP,payload:{selectedServerUrl:i,namespace:s}}}function setRequestBodyValue(i){let{value:s,pathMethod:u}=i;return{type:fP,payload:{value:s,pathMethod:u}}}const setRetainRequestBodyValueFlag=i=>{let{value:s,pathMethod:u}=i;return{type:mP,payload:{value:s,pathMethod:u}}};function setRequestBodyInclusion(i){let{value:s,pathMethod:u,name:m}=i;return{type:gP,payload:{value:s,pathMethod:u,name:m}}}function setActiveExamplesMember(i){let{name:s,pathMethod:u,contextType:m,contextName:v}=i;return{type:yP,payload:{name:s,pathMethod:u,contextType:m,contextName:v}}}function setRequestContentType(i){let{value:s,pathMethod:u}=i;return{type:vP,payload:{value:s,pathMethod:u}}}function setResponseContentType(i){let{value:s,path:u,method:m}=i;return{type:bP,payload:{value:s,path:u,method:m}}}function setServerVariableValue(i){let{server:s,namespace:u,key:m,val:v}=i;return{type:_P,payload:{server:s,namespace:u,key:m,val:v}}}const setRequestBodyValidateError=i=>{let{path:s,method:u,validationErrors:m}=i;return{type:wP,payload:{path:s,method:u,validationErrors:m}}},clearRequestBodyValidateError=i=>{let{path:s,method:u}=i;return{type:EP,payload:{path:s,method:u}}},initRequestBodyValidateError=i=>{let{pathMethod:s}=i;return{type:EP,payload:{path:s[0],method:s[1]}}},clearRequestBodyValue=i=>{let{pathMethod:s}=i;return{type:SP,payload:{pathMethod:s}}},oas3_selectors_onlyOAS3=i=>function(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v{if(u.getSystem().specSelectors.isOAS3()){const v=i(s,...m);return"function"==typeof v?v(u):v}return null}};const xP=oas3_selectors_onlyOAS3(((i,s)=>{const u=s?[s,"selectedServer"]:["selectedServer"];return i.getIn(u)||""})),kP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"bodyValue"])||null)),OP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"retainBodyValue"])||!1)),selectDefaultRequestBodyValue=(i,s,u)=>i=>{const{oas3Selectors:m,specSelectors:v,fn:_}=i.getSystem();if(v.isOAS3()){const i=m.requestContentType(s,u);if(i)return getDefaultRequestBodyValue(v.specResolvedSubtree(["paths",s,u,"requestBody"]),i,m.activeExamplesMember(s,u,"requestBody","requestBody"),_)}return null},AP=oas3_selectors_onlyOAS3(((i,s,u)=>i=>{const{oas3Selectors:m,specSelectors:v,fn:_}=i;let j=!1;const M=m.requestContentType(s,u);let $=m.requestBodyValue(s,u);const W=v.specResolvedSubtree(["paths",s,u,"requestBody"]);if(!W)return!1;if(et.Map.isMap($)&&($=stringify($.mapEntries((i=>et.Map.isMap(i[1])?[i[0],i[1].get("value")]:i)).toJS())),et.List.isList($)&&($=stringify($)),M){const i=getDefaultRequestBodyValue(W,M,m.activeExamplesMember(s,u,"requestBody","requestBody"),_);j=!!$&&$!==i}return j})),CP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"bodyInclusion"])||(0,et.Map)())),jP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"errors"])||null)),IP=oas3_selectors_onlyOAS3(((i,s,u,m,v)=>i.getIn(["examples",s,u,m,v,"activeExample"])||null)),PP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"requestContentType"])||null)),NP=oas3_selectors_onlyOAS3(((i,s,u)=>i.getIn(["requestData",s,u,"responseContentType"])||null)),TP=oas3_selectors_onlyOAS3(((i,s,u)=>{let m;if("string"!=typeof s){const{server:i,namespace:v}=s;m=v?[v,"serverVariableValues",i,u]:["serverVariableValues",i,u]}else{m=["serverVariableValues",s,u]}return i.getIn(m)||null})),MP=oas3_selectors_onlyOAS3(((i,s)=>{let u;if("string"!=typeof s){const{server:i,namespace:m}=s;u=m?[m,"serverVariableValues",i]:["serverVariableValues",i]}else{u=["serverVariableValues",s]}return i.getIn(u)||(0,et.OrderedMap)()})),RP=oas3_selectors_onlyOAS3(((i,s)=>{var u,m;if("string"!=typeof s){const{server:v,namespace:_}=s;m=v,u=_?i.getIn([_,"serverVariableValues",m]):i.getIn(["serverVariableValues",m])}else m=s,u=i.getIn(["serverVariableValues",m]);u=u||(0,et.OrderedMap)();let v=m;return u.map(((i,s)=>{v=v.replace(new RegExp(`{${s}}`,"g"),i)})),v})),DP=function validateRequestBodyIsRequired(i){return function(){for(var s=arguments.length,u=new Array(s),m=0;m{const m=s.getSystem().specSelectors.specJson();let v=[...u][1]||[];return!m.getIn(["paths",...v,"requestBody","required"])||i(...u)}}}(((i,s)=>((i,s)=>(s=s||[],!!i.getIn(["requestData",...s,"bodyValue"])))(i,s))),validateShallowRequired=(i,s)=>{let{oas3RequiredRequestBodyContentType:u,oas3RequestContentType:m,oas3RequestBodyValue:v}=s,_=[];if(!et.Map.isMap(v))return _;let j=[];return Object.keys(u.requestContentType).forEach((i=>{if(i===m){u.requestContentType[i].forEach((i=>{j.indexOf(i)<0&&j.push(i)}))}})),j.forEach((i=>{v.getIn([i,"value"])||_.push(i)})),_},BP=Xt((()=>["get","put","post","delete","options","head","patch","trace"])),LP={[dP]:(i,s)=>{let{payload:{selectedServerUrl:u,namespace:m}}=s;const v=m?[m,"selectedServer"]:["selectedServer"];return i.setIn(v,u)},[fP]:(i,s)=>{let{payload:{value:u,pathMethod:m}}=s,[v,_]=m;if(!et.Map.isMap(u))return i.setIn(["requestData",v,_,"bodyValue"],u);let j,M=i.getIn(["requestData",v,_,"bodyValue"])||(0,et.Map)();et.Map.isMap(M)||(M=(0,et.Map)());const[...$]=u.keys();return $.forEach((i=>{let s=u.getIn([i]);M.has(i)&&et.Map.isMap(s)||(j=M.setIn([i,"value"],s))})),i.setIn(["requestData",v,_,"bodyValue"],j)},[mP]:(i,s)=>{let{payload:{value:u,pathMethod:m}}=s,[v,_]=m;return i.setIn(["requestData",v,_,"retainBodyValue"],u)},[gP]:(i,s)=>{let{payload:{value:u,pathMethod:m,name:v}}=s,[_,j]=m;return i.setIn(["requestData",_,j,"bodyInclusion",v],u)},[yP]:(i,s)=>{let{payload:{name:u,pathMethod:m,contextType:v,contextName:_}}=s,[j,M]=m;return i.setIn(["examples",j,M,v,_,"activeExample"],u)},[vP]:(i,s)=>{let{payload:{value:u,pathMethod:m}}=s,[v,_]=m;return i.setIn(["requestData",v,_,"requestContentType"],u)},[bP]:(i,s)=>{let{payload:{value:u,path:m,method:v}}=s;return i.setIn(["requestData",m,v,"responseContentType"],u)},[_P]:(i,s)=>{let{payload:{server:u,namespace:m,key:v,val:_}}=s;const j=m?[m,"serverVariableValues",u,v]:["serverVariableValues",u,v];return i.setIn(j,_)},[wP]:(i,s)=>{let{payload:{path:u,method:m,validationErrors:v}}=s,_=[];if(_.push("Required field is not provided"),v.missingBodyValue)return i.setIn(["requestData",u,m,"errors"],(0,et.fromJS)(_));if(v.missingRequiredKeys&&v.missingRequiredKeys.length>0){const{missingRequiredKeys:s}=v;return i.updateIn(["requestData",u,m,"bodyValue"],(0,et.fromJS)({}),(i=>s.reduce(((i,s)=>i.setIn([s,"errors"],(0,et.fromJS)(_))),i)))}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),i},[EP]:(i,s)=>{let{payload:{path:u,method:m}}=s;const v=i.getIn(["requestData",u,m,"bodyValue"]);if(!et.Map.isMap(v))return i.setIn(["requestData",u,m,"errors"],(0,et.fromJS)([]));const[..._]=v.keys();return _?i.updateIn(["requestData",u,m,"bodyValue"],(0,et.fromJS)({}),(i=>_.reduce(((i,s)=>i.setIn([s,"errors"],(0,et.fromJS)([]))),i))):i},[SP]:(i,s)=>{let{payload:{pathMethod:u}}=s,[m,v]=u;const _=i.getIn(["requestData",m,v,"bodyValue"]);return _?et.Map.isMap(_)?i.setIn(["requestData",m,v,"bodyValue"],(0,et.Map)()):i.setIn(["requestData",m,v,"bodyValue"],""):i}};function oas3(){return{components:iP,wrapComponents:hP,statePlugins:{spec:{wrapSelectors:Pe,selectors:Re},auth:{wrapSelectors:Te},oas3:{actions:{...qe},reducers:LP,selectors:{...ze}}}}}const webhooks=i=>{let{specSelectors:s,getComponent:u}=i;const m=s.selectWebhooksOperations(),v=Object.keys(m),_=u("OperationContainer",!0);return 0===v.length?null:He.createElement("div",{className:"webhooks"},He.createElement("h2",null,"Webhooks"),v.map((i=>He.createElement("div",{key:`${i}-webhook`},m[i].map((s=>He.createElement(_,{key:`${i}-${s.method}-webhook`,op:s.operation,tag:"webhooks",method:s.method,path:i,specPath:s.specPath,allowTryItOut:!1})))))))},oas31_components_license=i=>{let{getComponent:s,specSelectors:u}=i;const m=u.selectLicenseNameField(),v=u.selectLicenseUrl(),_=s("Link");return He.createElement("div",{className:"info__license"},v?He.createElement("div",{className:"info__license__url"},He.createElement(_,{target:"_blank",href:sanitizeUrl(v)},m)):He.createElement("span",null,m))},oas31_components_contact=i=>{let{getComponent:s,specSelectors:u}=i;const m=u.selectContactNameField(),v=u.selectContactUrl(),_=u.selectContactEmailField(),j=s("Link");return He.createElement("div",{className:"info__contact"},v&&He.createElement("div",null,He.createElement(j,{href:sanitizeUrl(v),target:"_blank"},m," - Website")),_&&He.createElement(j,{href:sanitizeUrl(`mailto:${_}`)},v?`Send email to ${m}`:`Contact ${m}`))},oas31_components_info=i=>{let{getComponent:s,specSelectors:u}=i;const m=u.version(),v=u.url(),_=u.basePath(),j=u.host(),M=u.selectInfoSummaryField(),$=u.selectInfoDescriptionField(),W=u.selectInfoTitleField(),X=u.selectInfoTermsOfServiceUrl(),Y=u.selectExternalDocsUrl(),Z=u.selectExternalDocsDescriptionField(),ee=u.contact(),ie=u.license(),ae=s("Markdown",!0),le=s("Link"),ce=s("VersionStamp"),pe=s("OpenAPIVersion"),de=s("InfoUrl"),fe=s("InfoBasePath"),ye=s("License",!0),be=s("Contact",!0),_e=s("JsonSchemaDialect",!0);return He.createElement("div",{className:"info"},He.createElement("hgroup",{className:"main"},He.createElement("h2",{className:"title"},W,He.createElement("span",null,m&&He.createElement(ce,{version:m}),He.createElement(pe,{oasVersion:"3.1"}))),(j||_)&&He.createElement(fe,{host:j,basePath:_}),v&&He.createElement(de,{getComponent:s,url:v})),M&&He.createElement("p",{className:"info__summary"},M),He.createElement("div",{className:"info__description description"},He.createElement(ae,{source:$})),X&&He.createElement("div",{className:"info__tos"},He.createElement(le,{target:"_blank",href:sanitizeUrl(X)},"Terms of service")),ee.size>0&&He.createElement(be,null),ie.size>0&&He.createElement(ye,null),Y&&He.createElement(le,{className:"info__extdocs",target:"_blank",href:sanitizeUrl(Y)},Z||Y),He.createElement(_e,null))},json_schema_dialect=i=>{let{getComponent:s,specSelectors:u}=i;const m=u.selectJsonSchemaDialectField(),v=u.selectJsonSchemaDialectDefault(),_=s("Link");return He.createElement(He.Fragment,null,m&&m===v&&He.createElement("p",{className:"info__jsonschemadialect"},"JSON Schema dialect:"," ",He.createElement(_,{target:"_blank",href:sanitizeUrl(m)},m)),m&&m!==v&&He.createElement("div",{className:"error-wrapper"},He.createElement("div",{className:"no-margin"},He.createElement("div",{className:"errors"},He.createElement("div",{className:"errors-wrapper"},He.createElement("h4",{className:"center"},"Warning"),He.createElement("p",{className:"message"},He.createElement("strong",null,"OpenAPI.jsonSchemaDialect")," field contains a value different from the default value of"," ",He.createElement(_,{target:"_blank",href:v},v),". Values different from the default one are currently not supported. Please either omit the field or provide it with the default value."))))))},version_pragma_filter=i=>{let{bypass:s,isSwagger2:u,isOAS3:m,isOAS31:v,alsoShow:_,children:j}=i;return s?He.createElement("div",null,j):u&&(m||v)?He.createElement("div",{className:"version-pragma"},_,He.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},He.createElement("div",null,He.createElement("h3",null,"Unable to render this definition"),He.createElement("p",null,He.createElement("code",null,"swagger")," and ",He.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),He.createElement("p",null,"Supported version fields are ",He.createElement("code",null,'swagger: "2.0"')," and those that match ",He.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",He.createElement("code",null,"openapi: 3.1.0"),").")))):u||m||v?He.createElement("div",null,j):He.createElement("div",{className:"version-pragma"},_,He.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},He.createElement("div",null,He.createElement("h3",null,"Unable to render this definition"),He.createElement("p",null,"The provided definition does not specify a valid version field."),He.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",He.createElement("code",null,'swagger: "2.0"')," and those that match ",He.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",He.createElement("code",null,"openapi: 3.1.0"),")."))))},getModelName=i=>"string"==typeof i&&i.includes("#/components/schemas/")?(i=>{const s=i.replace(/~1/g,"/").replace(/~0/g,"~");try{return decodeURIComponent(s)}catch{return s}})(i.replace(/^.*#\/components\/schemas\//,"")):null,FP=(0,He.forwardRef)(((i,s)=>{let{schema:u,getComponent:m,onToggle:v}=i;const _=m("JSONSchema202012"),j=getModelName(u.get("$$ref")),M=(0,He.useCallback)(((i,s)=>{v(j,s)}),[j,v]);return He.createElement(_,{name:j,schema:u.toJS(),ref:s,onExpand:M})}));FP.defaultProps={name:"",displayName:"",isRef:!1,required:!1,expandDepth:0,depth:1,includeReadOnly:!1,includeWriteOnly:!1,onToggle:()=>{}};const qP=FP,models=i=>{let{specActions:s,specSelectors:u,layoutSelectors:m,layoutActions:v,getComponent:_,getConfigs:j}=i;const M=u.selectSchemas(),$=Object.keys(M).length>0,W=["components","schemas"],{docExpansion:X,defaultModelsExpandDepth:Y}=j(),Z=Y>0&&"none"!==X,ee=m.isShown(W,Z),ie=_("Collapse"),ae=_("JSONSchema202012"),le=_("ArrowUpIcon"),ce=_("ArrowDownIcon");(0,He.useEffect)((()=>{const i=ee&&Y>1,m=null!=u.specResolvedSubtree(W);i&&!m&&s.requestResolvedSubtree(W)}),[ee,Y]);const pe=(0,He.useCallback)((()=>{v.show(W,!ee)}),[ee]),de=(0,He.useCallback)((i=>{null!==i&&v.readyToScroll(W,i)}),[]),handleJSONSchema202012Ref=i=>s=>{null!==s&&v.readyToScroll([...W,i],s)},handleJSONSchema202012Expand=i=>(m,v)=>{if(v){const m=[...W,i];null!=u.specResolvedSubtree(m)||s.requestResolvedSubtree([...W,i])}};return!$||Y<0?null:He.createElement("section",{className:lC()("models",{"is-open":ee}),ref:de},He.createElement("h4",null,He.createElement("button",{"aria-expanded":ee,className:"models-control",onClick:pe},He.createElement("span",null,"Schemas"),ee?He.createElement(le,null):He.createElement(ce,null))),He.createElement(ie,{isOpened:ee},Object.entries(M).map((i=>{let[s,u]=i;return He.createElement(ae,{key:s,ref:handleJSONSchema202012Ref(s),schema:u,name:s,onExpand:handleJSONSchema202012Expand(s)})}))))},mutual_tls_auth=i=>{let{schema:s,getComponent:u}=i;const m=u("JumpToPath",!0);return He.createElement("div",null,He.createElement("h4",null,s.get("name")," (mutualTLS)"," ",He.createElement(m,{path:["securityDefinitions",s.get("name")]})),He.createElement("p",null,"Mutual TLS is required by this API/Operation. Certificates are managed via your Operating System and/or your browser."),He.createElement("p",null,s.get("description")))};class auths_Auths extends He.Component{constructor(i,s){super(i,s),this.state={}}onAuthChange=i=>{let{name:s}=i;this.setState({[s]:i})};submitAuth=i=>{i.preventDefault();let{authActions:s}=this.props;s.authorizeWithPersistOption(this.state)};logoutClick=i=>{i.preventDefault();let{authActions:s,definitions:u}=this.props,m=u.map(((i,s)=>s)).toArray();this.setState(m.reduce(((i,s)=>(i[s]="",i)),{})),s.logoutWithPersistOption(m)};close=i=>{i.preventDefault();let{authActions:s}=this.props;s.showDefinitions(!1)};render(){let{definitions:i,getComponent:s,authSelectors:u,errSelectors:m}=this.props;const v=s("AuthItem"),_=s("oauth2",!0),j=s("Button"),M=u.authorized(),$=i.filter(((i,s)=>!!M.get(s))),W=i.filter((i=>"oauth2"!==i.get("type")&&"mutualTLS"!==i.get("type"))),X=i.filter((i=>"oauth2"===i.get("type"))),Y=i.filter((i=>"mutualTLS"===i.get("type")));return He.createElement("div",{className:"auth-container"},W.size>0&&He.createElement("form",{onSubmit:this.submitAuth},W.map(((i,u)=>He.createElement(v,{key:u,schema:i,name:u,getComponent:s,onAuthChange:this.onAuthChange,authorized:M,errSelectors:m}))).toArray(),He.createElement("div",{className:"auth-btn-wrapper"},W.size===$.size?He.createElement(j,{className:"btn modal-btn auth",onClick:this.logoutClick,"aria-label":"Remove authorization"},"Logout"):He.createElement(j,{type:"submit",className:"btn modal-btn auth authorize","aria-label":"Apply credentials"},"Authorize"),He.createElement(j,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),X.size>0?He.createElement("div",null,He.createElement("div",{className:"scope-def"},He.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),He.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),i.filter((i=>"oauth2"===i.get("type"))).map(((i,s)=>He.createElement("div",{key:s},He.createElement(_,{authorized:M,schema:i,name:s})))).toArray()):null,Y.size>0&&He.createElement("div",null,Y.map(((i,u)=>He.createElement(v,{key:u,schema:i,name:u,getComponent:s,onAuthChange:this.onAuthChange,authorized:M,errSelectors:m}))).toArray()))}}const $P=auths_Auths,isOAS31=i=>{const s=i.get("openapi");return"string"==typeof s&&/^3\.1\.(?:[1-9]\d*|0)$/.test(s)},fn_createOnlyOAS31Selector=i=>function(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v{if(u.getSystem().specSelectors.isOAS31()){const v=i(s,...m);return"function"==typeof v?v(u):v}return null}},createOnlyOAS31SelectorWrapper=i=>(s,u)=>function(m){for(var v=arguments.length,_=new Array(v>1?v-1:0),j=1;jfunction(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v{const v=i(s,u,...m);return"function"==typeof v?v(u):v}},createOnlyOAS31ComponentWrapper=i=>(s,u)=>m=>u.specSelectors.isOAS31()?He.createElement(i,Ao()({},m,{originalComponent:s,getSystem:u.getSystem})):He.createElement(s,m),UP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s}=i;const u=s().getComponent("OAS31License",!0);return He.createElement(u,null)})),zP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s}=i;const u=s().getComponent("OAS31Contact",!0);return He.createElement(u,null)})),VP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s}=i;const u=s().getComponent("OAS31Info",!0);return He.createElement(u,null)})),makeIsExpandable=(i,s)=>{const{fn:u}=s();if("function"!=typeof i)return null;const{hasKeyword:m}=u.jsonSchema202012;return s=>i(s)||m(s,"example")||s?.xml||s?.discriminator||s?.externalDocs},getProperties=(i,s)=>{let{includeReadOnly:u,includeWriteOnly:m}=s;if(!i?.properties)return{};const v=Object.entries(i.properties).filter((i=>{let[,s]=i;return(!(!0===s?.readOnly)||u)&&(!(!0===s?.writeOnly)||m)}));return Object.fromEntries(v)},WP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s,...u}=i;const m=s(),{getComponent:v,fn:_,getConfigs:j}=m,M=j(),$=v("OAS31Model"),W=v("JSONSchema202012"),X=v("JSONSchema202012Keyword$schema"),Y=v("JSONSchema202012Keyword$vocabulary"),Z=v("JSONSchema202012Keyword$id"),ee=v("JSONSchema202012Keyword$anchor"),ie=v("JSONSchema202012Keyword$dynamicAnchor"),ae=v("JSONSchema202012Keyword$ref"),le=v("JSONSchema202012Keyword$dynamicRef"),ce=v("JSONSchema202012Keyword$defs"),pe=v("JSONSchema202012Keyword$comment"),de=v("JSONSchema202012KeywordAllOf"),fe=v("JSONSchema202012KeywordAnyOf"),ye=v("JSONSchema202012KeywordOneOf"),be=v("JSONSchema202012KeywordNot"),_e=v("JSONSchema202012KeywordIf"),we=v("JSONSchema202012KeywordThen"),Se=v("JSONSchema202012KeywordElse"),xe=v("JSONSchema202012KeywordDependentSchemas"),Ie=v("JSONSchema202012KeywordPrefixItems"),Pe=v("JSONSchema202012KeywordItems"),Te=v("JSONSchema202012KeywordContains"),Re=v("JSONSchema202012KeywordProperties"),qe=v("JSONSchema202012KeywordPatternProperties"),ze=v("JSONSchema202012KeywordAdditionalProperties"),Ve=v("JSONSchema202012KeywordPropertyNames"),We=v("JSONSchema202012KeywordUnevaluatedItems"),Xe=v("JSONSchema202012KeywordUnevaluatedProperties"),Ye=v("JSONSchema202012KeywordType"),Qe=v("JSONSchema202012KeywordEnum"),et=v("JSONSchema202012KeywordConst"),tt=v("JSONSchema202012KeywordConstraint"),rt=v("JSONSchema202012KeywordDependentRequired"),nt=v("JSONSchema202012KeywordContentSchema"),ot=v("JSONSchema202012KeywordTitle"),it=v("JSONSchema202012KeywordDescription"),at=v("JSONSchema202012KeywordDefault"),st=v("JSONSchema202012KeywordDeprecated"),lt=v("JSONSchema202012KeywordReadOnly"),ct=v("JSONSchema202012KeywordWriteOnly"),ut=v("JSONSchema202012Accordion"),pt=v("JSONSchema202012ExpandDeepButton"),ht=v("JSONSchema202012ChevronRightIcon"),dt=v("withJSONSchema202012Context")($,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:M.defaultModelExpandDepth,includeReadOnly:Boolean(u.includeReadOnly),includeWriteOnly:Boolean(u.includeWriteOnly)},components:{JSONSchema:W,Keyword$schema:X,Keyword$vocabulary:Y,Keyword$id:Z,Keyword$anchor:ee,Keyword$dynamicAnchor:ie,Keyword$ref:ae,Keyword$dynamicRef:le,Keyword$defs:ce,Keyword$comment:pe,KeywordAllOf:de,KeywordAnyOf:fe,KeywordOneOf:ye,KeywordNot:be,KeywordIf:_e,KeywordThen:we,KeywordElse:Se,KeywordDependentSchemas:xe,KeywordPrefixItems:Ie,KeywordItems:Pe,KeywordContains:Te,KeywordProperties:Re,KeywordPatternProperties:qe,KeywordAdditionalProperties:ze,KeywordPropertyNames:Ve,KeywordUnevaluatedItems:We,KeywordUnevaluatedProperties:Xe,KeywordType:Ye,KeywordEnum:Qe,KeywordConst:et,KeywordConstraint:tt,KeywordDependentRequired:rt,KeywordContentSchema:nt,KeywordTitle:ot,KeywordDescription:it,KeywordDefault:at,KeywordDeprecated:st,KeywordReadOnly:lt,KeywordWriteOnly:ct,Accordion:ut,ExpandDeepButton:pt,ChevronRightIcon:ht},fn:{upperFirst:_.upperFirst,isExpandable:makeIsExpandable(_.jsonSchema202012.isExpandable,s),getProperties}});return He.createElement(dt,u)})),KP=WP,HP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s}=i;const{getComponent:u,fn:m,getConfigs:v}=s(),_=v();if(HP.ModelsWithJSONSchemaContext)return He.createElement(HP.ModelsWithJSONSchemaContext,null);const j=u("OAS31Models",!0),M=u("JSONSchema202012"),$=u("JSONSchema202012Keyword$schema"),W=u("JSONSchema202012Keyword$vocabulary"),X=u("JSONSchema202012Keyword$id"),Y=u("JSONSchema202012Keyword$anchor"),Z=u("JSONSchema202012Keyword$dynamicAnchor"),ee=u("JSONSchema202012Keyword$ref"),ie=u("JSONSchema202012Keyword$dynamicRef"),ae=u("JSONSchema202012Keyword$defs"),le=u("JSONSchema202012Keyword$comment"),ce=u("JSONSchema202012KeywordAllOf"),pe=u("JSONSchema202012KeywordAnyOf"),de=u("JSONSchema202012KeywordOneOf"),fe=u("JSONSchema202012KeywordNot"),ye=u("JSONSchema202012KeywordIf"),be=u("JSONSchema202012KeywordThen"),_e=u("JSONSchema202012KeywordElse"),we=u("JSONSchema202012KeywordDependentSchemas"),Se=u("JSONSchema202012KeywordPrefixItems"),xe=u("JSONSchema202012KeywordItems"),Ie=u("JSONSchema202012KeywordContains"),Pe=u("JSONSchema202012KeywordProperties"),Te=u("JSONSchema202012KeywordPatternProperties"),Re=u("JSONSchema202012KeywordAdditionalProperties"),qe=u("JSONSchema202012KeywordPropertyNames"),ze=u("JSONSchema202012KeywordUnevaluatedItems"),Ve=u("JSONSchema202012KeywordUnevaluatedProperties"),We=u("JSONSchema202012KeywordType"),Xe=u("JSONSchema202012KeywordEnum"),Ye=u("JSONSchema202012KeywordConst"),Qe=u("JSONSchema202012KeywordConstraint"),et=u("JSONSchema202012KeywordDependentRequired"),tt=u("JSONSchema202012KeywordContentSchema"),rt=u("JSONSchema202012KeywordTitle"),nt=u("JSONSchema202012KeywordDescription"),ot=u("JSONSchema202012KeywordDefault"),it=u("JSONSchema202012KeywordDeprecated"),at=u("JSONSchema202012KeywordReadOnly"),st=u("JSONSchema202012KeywordWriteOnly"),lt=u("JSONSchema202012Accordion"),ct=u("JSONSchema202012ExpandDeepButton"),ut=u("JSONSchema202012ChevronRightIcon"),pt=u("withJSONSchema202012Context");return HP.ModelsWithJSONSchemaContext=pt(j,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:_.defaultModelsExpandDepth-1,includeReadOnly:!0,includeWriteOnly:!0},components:{JSONSchema:M,Keyword$schema:$,Keyword$vocabulary:W,Keyword$id:X,Keyword$anchor:Y,Keyword$dynamicAnchor:Z,Keyword$ref:ee,Keyword$dynamicRef:ie,Keyword$defs:ae,Keyword$comment:le,KeywordAllOf:ce,KeywordAnyOf:pe,KeywordOneOf:de,KeywordNot:fe,KeywordIf:ye,KeywordThen:be,KeywordElse:_e,KeywordDependentSchemas:we,KeywordPrefixItems:Se,KeywordItems:xe,KeywordContains:Ie,KeywordProperties:Pe,KeywordPatternProperties:Te,KeywordAdditionalProperties:Re,KeywordPropertyNames:qe,KeywordUnevaluatedItems:ze,KeywordUnevaluatedProperties:Ve,KeywordType:We,KeywordEnum:Xe,KeywordConst:Ye,KeywordConstraint:Qe,KeywordDependentRequired:et,KeywordContentSchema:tt,KeywordTitle:rt,KeywordDescription:nt,KeywordDefault:ot,KeywordDeprecated:it,KeywordReadOnly:at,KeywordWriteOnly:st,Accordion:lt,ExpandDeepButton:ct,ChevronRightIcon:ut},fn:{upperFirst:m.upperFirst,isExpandable:m.jsonSchema202012.isExpandable,getProperties:m.jsonSchema202012.getProperties}}),He.createElement(HP.ModelsWithJSONSchemaContext,null)}));HP.ModelsWithJSONSchemaContext=null;const JP=HP,wrap_components_version_pragma_filter=(i,s)=>i=>{const u=s.specSelectors.isOAS31(),m=s.getComponent("OAS31VersionPragmaFilter");return He.createElement(m,Ao()({isOAS31:u},i))},GP=createOnlyOAS31ComponentWrapper((i=>{let{originalComponent:s,...u}=i;const{getComponent:m,schema:v}=u,_=m("MutualTLSAuth",!0);return"mutualTLS"===v.get("type")?He.createElement(_,{schema:v}):He.createElement(s,u)})),XP=GP,YP=createOnlyOAS31ComponentWrapper((i=>{let{getSystem:s,...u}=i;const m=s().getComponent("OAS31Auths",!0);return He.createElement(m,u)})),QP=(0,et.Map)(),ZP=Xt(((i,s)=>s.specSelectors.specJson()),isOAS31),selectors_webhooks=()=>i=>i.specSelectors.specJson().get("webhooks",QP),eN=Xt(((i,s)=>s.specSelectors.webhooks()),((i,s)=>s.specSelectors.validOperationMethods()),((i,s)=>s.specSelectors.specResolvedSubtree(["webhooks"])),((i,s)=>et.Map.isMap(i)?i.reduce(((i,u,m)=>{if(!et.Map.isMap(u))return i;const v=u.entrySeq().filter((i=>{let[u]=i;return s.includes(u)})).map((i=>{let[s,u]=i;return{operation:(0,et.Map)({operation:u}),method:s,path:m,specPath:(0,et.List)(["webhooks",m,s])}}));return i.concat(v)}),(0,et.List)()).groupBy((i=>i.path)).map((i=>i.toArray())).toObject():{})),selectors_license=()=>i=>i.specSelectors.info().get("license",QP),selectLicenseNameField=()=>i=>i.specSelectors.license().get("name","License"),selectLicenseUrlField=()=>i=>i.specSelectors.license().get("url"),tN=Xt(((i,s)=>s.specSelectors.url()),((i,s)=>s.oas3Selectors.selectedServer()),((i,s)=>s.specSelectors.selectLicenseUrlField()),((i,s,u)=>{if(u)return safeBuildUrl(u,i,{selectedServer:s})})),selectLicenseIdentifierField=()=>i=>i.specSelectors.license().get("identifier"),selectors_contact=()=>i=>i.specSelectors.info().get("contact",QP),selectContactNameField=()=>i=>i.specSelectors.contact().get("name","the developer"),selectContactEmailField=()=>i=>i.specSelectors.contact().get("email"),selectContactUrlField=()=>i=>i.specSelectors.contact().get("url"),rN=Xt(((i,s)=>s.specSelectors.url()),((i,s)=>s.oas3Selectors.selectedServer()),((i,s)=>s.specSelectors.selectContactUrlField()),((i,s,u)=>{if(u)return safeBuildUrl(u,i,{selectedServer:s})})),selectInfoTitleField=()=>i=>i.specSelectors.info().get("title"),selectInfoSummaryField=()=>i=>i.specSelectors.info().get("summary"),selectInfoDescriptionField=()=>i=>i.specSelectors.info().get("description"),selectInfoTermsOfServiceField=()=>i=>i.specSelectors.info().get("termsOfService"),nN=Xt(((i,s)=>s.specSelectors.url()),((i,s)=>s.oas3Selectors.selectedServer()),((i,s)=>s.specSelectors.selectInfoTermsOfServiceField()),((i,s,u)=>{if(u)return safeBuildUrl(u,i,{selectedServer:s})})),selectExternalDocsDescriptionField=()=>i=>i.specSelectors.externalDocs().get("description"),selectExternalDocsUrlField=()=>i=>i.specSelectors.externalDocs().get("url"),oN=Xt(((i,s)=>s.specSelectors.url()),((i,s)=>s.oas3Selectors.selectedServer()),((i,s)=>s.specSelectors.selectExternalDocsUrlField()),((i,s,u)=>{if(u)return safeBuildUrl(u,i,{selectedServer:s})})),selectJsonSchemaDialectField=()=>i=>i.specSelectors.specJson().get("jsonSchemaDialect"),selectJsonSchemaDialectDefault=()=>"https://spec.openapis.org/oas/3.1/dialect/base",iN=Xt(((i,s)=>s.specSelectors.definitions()),((i,s)=>s.specSelectors.specResolvedSubtree(["components","schemas"])),((i,s)=>et.Map.isMap(i)?et.Map.isMap(s)?Object.entries(i.toJS()).reduce(((i,u)=>{let[m,v]=u;const _=s.get(m);return i[m]=_?.toJS()||v,i}),{}):i.toJS():{})),wrap_selectors_isOAS3=(i,s)=>function(u){const m=s.specSelectors.isOAS31();for(var v=arguments.length,_=new Array(v>1?v-1:0),j=1;j(i,s)=>s.oas31Selectors.selectLicenseUrl())),sN=createOnlyOAS31SelectorWrapper((()=>(i,s)=>{const u=s.specSelectors.securityDefinitions();let m=i();return u?(u.entrySeq().forEach((i=>{let[s,u]=i;"mutualTLS"===u.get("type")&&(m=m.push(new et.Map({[s]:u})))})),m):m})),lN=Xt(((i,s)=>s.specSelectors.url()),((i,s)=>s.oas3Selectors.selectedServer()),((i,s)=>s.specSelectors.selectLicenseUrlField()),((i,s)=>s.specSelectors.selectLicenseIdentifierField()),((i,s,u,m)=>u?safeBuildUrl(u,i,{selectedServer:s}):m?`https://spdx.org/licenses/${m}.html`:void 0)),keywords_Example=i=>{let{schema:s,getSystem:u}=i;const{fn:m}=u(),{hasKeyword:v,stringify:_}=m.jsonSchema202012.useFn();return v(s,"example")?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--example"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Example"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const"},_(s.example))):null},keywords_Xml=i=>{let{schema:s,getSystem:u}=i;const m=s?.xml||{},{fn:v,getComponent:_}=u(),{useIsExpandedDeeply:j,useComponent:M}=v.jsonSchema202012,$=j(),W=!!(m.name||m.namespace||m.prefix),[X,Y]=(0,He.useState)($),[Z,ee]=(0,He.useState)(!1),ie=M("Accordion"),ae=M("ExpandDeepButton"),le=_("JSONSchema202012DeepExpansionContext")(),ce=(0,He.useCallback)((()=>{Y((i=>!i))}),[]),pe=(0,He.useCallback)(((i,s)=>{Y(s),ee(s)}),[]);return 0===Object.keys(m).length?null:He.createElement(le.Provider,{value:Z},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--xml"},W?He.createElement(He.Fragment,null,He.createElement(ie,{expanded:X,onChange:ce},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML")),He.createElement(ae,{expanded:X,onClick:pe})):He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML"),!0===m.attribute&&He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"attribute"),!0===m.wrapped&&He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"wrapped"),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!X})},X&&He.createElement(He.Fragment,null,m.name&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"name"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},m.name))),m.namespace&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement("div",{className:"json-schema-2020-12-keyword"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"namespace"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},m.namespace))),m.prefix&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement("div",{className:"json-schema-2020-12-keyword"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"prefix"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},m.prefix)))))))},DiscriminatorMapping_DiscriminatorMapping=i=>{let{discriminator:s}=i;const u=s?.mapping||{};return 0===Object.keys(u).length?null:Object.entries(u).map((i=>{let[s,u]=i;return He.createElement("div",{key:`${s}-${u}`,className:"json-schema-2020-12-keyword"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},s),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},u))}))};DiscriminatorMapping_DiscriminatorMapping.defaultProps={mapping:void 0};const cN=DiscriminatorMapping_DiscriminatorMapping,keywords_Discriminator_Discriminator=i=>{let{schema:s,getSystem:u}=i;const m=s?.discriminator||{},{fn:v,getComponent:_}=u(),{useIsExpandedDeeply:j,useComponent:M}=v.jsonSchema202012,$=j(),W=!!m.mapping,[X,Y]=(0,He.useState)($),[Z,ee]=(0,He.useState)(!1),ie=M("Accordion"),ae=M("ExpandDeepButton"),le=_("JSONSchema202012DeepExpansionContext")(),ce=(0,He.useCallback)((()=>{Y((i=>!i))}),[]),pe=(0,He.useCallback)(((i,s)=>{Y(s),ee(s)}),[]);return 0===Object.keys(m).length?null:He.createElement(le.Provider,{value:Z},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--discriminator"},W?He.createElement(He.Fragment,null,He.createElement(ie,{expanded:X,onChange:ce},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator")),He.createElement(ae,{expanded:X,onClick:pe})):He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator"),m.propertyName&&He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},m.propertyName),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!X})},X&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement(cN,{discriminator:m})))))},keywords_ExternalDocs=i=>{let{schema:s,getSystem:u}=i;const m=s?.externalDocs||{},{fn:v,getComponent:_}=u(),{useIsExpandedDeeply:j,useComponent:M}=v.jsonSchema202012,$=j(),W=!(!m.description&&!m.url),[X,Y]=(0,He.useState)($),[Z,ee]=(0,He.useState)(!1),ie=M("Accordion"),ae=M("ExpandDeepButton"),le=_("JSONSchema202012KeywordDescription"),ce=_("Link"),pe=_("JSONSchema202012DeepExpansionContext")(),de=(0,He.useCallback)((()=>{Y((i=>!i))}),[]),fe=(0,He.useCallback)(((i,s)=>{Y(s),ee(s)}),[]);return 0===Object.keys(m).length?null:He.createElement(pe.Provider,{value:Z},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--externalDocs"},W?He.createElement(He.Fragment,null,He.createElement(ie,{expanded:X,onChange:de},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation")),He.createElement(ae,{expanded:X,onClick:fe})):He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation"),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!X})},X&&He.createElement(He.Fragment,null,m.description&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement(le,{schema:m,getSystem:u})),m.url&&He.createElement("li",{className:"json-schema-2020-12-property"},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"url"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},He.createElement(ce,{target:"_blank",href:sanitizeUrl(m.url)},m.url))))))))},keywords_Description=i=>{let{schema:s,getSystem:u}=i;if(!s?.description)return null;const{getComponent:m}=u(),v=m("Markdown");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},He.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},He.createElement(v,{source:s.description})))},uN=createOnlyOAS31ComponentWrapper(keywords_Description),pN=createOnlyOAS31ComponentWrapper((i=>{let{schema:s,getSystem:u,originalComponent:m}=i;const{getComponent:v}=u(),_=v("JSONSchema202012KeywordDiscriminator"),j=v("JSONSchema202012KeywordXml"),M=v("JSONSchema202012KeywordExample"),$=v("JSONSchema202012KeywordExternalDocs");return He.createElement(He.Fragment,null,He.createElement(m,{schema:s}),He.createElement(_,{schema:s,getSystem:u}),He.createElement(j,{schema:s,getSystem:u}),He.createElement($,{schema:s,getSystem:u}),He.createElement(M,{schema:s,getSystem:u}))})),hN=pN,keywords_Properties=i=>{let{schema:s,getSystem:u}=i;const{fn:m}=u(),{useComponent:v}=m.jsonSchema202012,{getDependentRequired:_,getProperties:j}=m.jsonSchema202012.useFn(),M=m.jsonSchema202012.useConfig(),$=Array.isArray(s?.required)?s.required:[],W=v("JSONSchema"),X=j(s,M);return 0===Object.keys(X).length?null:He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},He.createElement("ul",null,Object.entries(X).map((i=>{let[u,m]=i;const v=$.includes(u),j=_(u,s);return He.createElement("li",{key:u,className:lC()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":v})},He.createElement(W,{name:u,schema:m,dependentRequired:j}))}))))},dN=createOnlyOAS31ComponentWrapper(keywords_Properties);const fN=function afterLoad(i){let{fn:s,getSystem:u}=i;if(s.jsonSchema202012){const i=makeIsExpandable(s.jsonSchema202012.isExpandable,u);Object.assign(this.fn.jsonSchema202012,{isExpandable:i,getProperties})}if("function"==typeof s.sampleFromSchema&&s.jsonSchema202012){const i=((i,s)=>{const{fn:u,specSelectors:m}=s;return Object.fromEntries(Object.entries(i).map((i=>{let[s,v]=i;const _=u[s];return[s,function(){return m.isOAS31()?v(...arguments):"function"==typeof _?_(...arguments):void 0}]})))})({sampleFromSchema:s.jsonSchema202012.sampleFromSchema,sampleFromSchemaGeneric:s.jsonSchema202012.sampleFromSchemaGeneric,createXMLExample:s.jsonSchema202012.createXMLExample,memoizedSampleFromSchema:s.jsonSchema202012.memoizedSampleFromSchema,memoizedCreateXMLExample:s.jsonSchema202012.memoizedCreateXMLExample},u());Object.assign(this.fn,i)}},oas31=i=>{let{fn:s}=i;const u=s.createSystemSelector||fn_createSystemSelector,m=s.createOnlyOAS31Selector||fn_createOnlyOAS31Selector;return{afterLoad:fN,fn:{isOAS31,createSystemSelector:fn_createSystemSelector,createOnlyOAS31Selector:fn_createOnlyOAS31Selector},components:{Webhooks:webhooks,JsonSchemaDialect:json_schema_dialect,MutualTLSAuth:mutual_tls_auth,OAS31Info:oas31_components_info,OAS31License:oas31_components_license,OAS31Contact:oas31_components_contact,OAS31VersionPragmaFilter:version_pragma_filter,OAS31Model:qP,OAS31Models:models,OAS31Auths:$P,JSONSchema202012KeywordExample:keywords_Example,JSONSchema202012KeywordXml:keywords_Xml,JSONSchema202012KeywordDiscriminator:keywords_Discriminator_Discriminator,JSONSchema202012KeywordExternalDocs:keywords_ExternalDocs},wrapComponents:{InfoContainer:VP,License:UP,Contact:zP,VersionPragmaFilter:wrap_components_version_pragma_filter,Model:KP,Models:JP,AuthItem:XP,auths:YP,JSONSchema202012KeywordDescription:uN,JSONSchema202012KeywordDefault:hN,JSONSchema202012KeywordProperties:dN},statePlugins:{auth:{wrapSelectors:{definitionsToAuthorize:sN}},spec:{selectors:{isOAS31:u(ZP),license:selectors_license,selectLicenseNameField,selectLicenseUrlField,selectLicenseIdentifierField:m(selectLicenseIdentifierField),selectLicenseUrl:u(tN),contact:selectors_contact,selectContactNameField,selectContactEmailField,selectContactUrlField,selectContactUrl:u(rN),selectInfoTitleField,selectInfoSummaryField:m(selectInfoSummaryField),selectInfoDescriptionField,selectInfoTermsOfServiceField,selectInfoTermsOfServiceUrl:u(nN),selectExternalDocsDescriptionField,selectExternalDocsUrlField,selectExternalDocsUrl:u(oN),webhooks:m(selectors_webhooks),selectWebhooksOperations:m(u(eN)),selectJsonSchemaDialectField,selectJsonSchemaDialectDefault,selectSchemas:u(iN)},wrapSelectors:{isOAS3:wrap_selectors_isOAS3,selectLicenseUrl:aN}},oas31:{selectors:{selectLicenseUrl:m(u(lN))}}}}},mN=kC().object,gN=kC().bool,yN=(kC().oneOfType([mN,gN]),(0,He.createContext)(null));yN.displayName="JSONSchemaContext";const vN=(0,He.createContext)(0);vN.displayName="JSONSchemaLevelContext";const bN=(0,He.createContext)(!1);bN.displayName="JSONSchemaDeepExpansionContext";const _N=(0,He.createContext)(new Set),useConfig=()=>{const{config:i}=(0,He.useContext)(yN);return i},useComponent=i=>{const{components:s}=(0,He.useContext)(yN);return s[i]||null},useFn=function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;const{fn:s}=(0,He.useContext)(yN);return void 0!==i?s[i]:s},useLevel=()=>{const i=(0,He.useContext)(vN);return[i,i+1]},useIsExpandedDeeply=()=>(0,He.useContext)(bN),useRenderedSchemas=function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;if(void 0===i)return(0,He.useContext)(_N);const s=(0,He.useContext)(_N);return new Set([...s,i])},wN=(0,He.forwardRef)(((i,s)=>{let{schema:u,name:m,dependentRequired:v,onExpand:_}=i;const j=useFn(),M=(()=>{const[i]=useLevel(),{defaultExpandedLevels:s}=useConfig();return s-i>0})(),$=useIsExpandedDeeply(),[W,X]=(0,He.useState)(M||$),[Y,Z]=(0,He.useState)($),[ee,ie]=useLevel(),ae=(()=>{const[i]=useLevel();return i>0})(),le=j.isExpandable(u)||v.length>0,ce=(i=>useRenderedSchemas().has(i))(u),pe=useRenderedSchemas(u),de=j.stringifyConstraints(u),fe=useComponent("Accordion"),ye=useComponent("Keyword$schema"),be=useComponent("Keyword$vocabulary"),_e=useComponent("Keyword$id"),we=useComponent("Keyword$anchor"),Se=useComponent("Keyword$dynamicAnchor"),xe=useComponent("Keyword$ref"),Ie=useComponent("Keyword$dynamicRef"),Pe=useComponent("Keyword$defs"),Te=useComponent("Keyword$comment"),Re=useComponent("KeywordAllOf"),qe=useComponent("KeywordAnyOf"),ze=useComponent("KeywordOneOf"),Ve=useComponent("KeywordNot"),We=useComponent("KeywordIf"),Xe=useComponent("KeywordThen"),Ye=useComponent("KeywordElse"),Qe=useComponent("KeywordDependentSchemas"),et=useComponent("KeywordPrefixItems"),tt=useComponent("KeywordItems"),rt=useComponent("KeywordContains"),nt=useComponent("KeywordProperties"),ot=useComponent("KeywordPatternProperties"),it=useComponent("KeywordAdditionalProperties"),at=useComponent("KeywordPropertyNames"),st=useComponent("KeywordUnevaluatedItems"),lt=useComponent("KeywordUnevaluatedProperties"),ct=useComponent("KeywordType"),ut=useComponent("KeywordEnum"),pt=useComponent("KeywordConst"),ht=useComponent("KeywordConstraint"),dt=useComponent("KeywordDependentRequired"),mt=useComponent("KeywordContentSchema"),gt=useComponent("KeywordTitle"),yt=useComponent("KeywordDescription"),vt=useComponent("KeywordDefault"),bt=useComponent("KeywordDeprecated"),_t=useComponent("KeywordReadOnly"),wt=useComponent("KeywordWriteOnly"),Et=useComponent("ExpandDeepButton");(0,He.useEffect)((()=>{Z($)}),[$]),(0,He.useEffect)((()=>{Z(Y)}),[Y]);const St=(0,He.useCallback)(((i,s)=>{X(s),!s&&Z(!1),_(i,s,!1)}),[_]),xt=(0,He.useCallback)(((i,s)=>{X(s),Z(s),_(i,s,!0)}),[_]);return He.createElement(vN.Provider,{value:ie},He.createElement(bN.Provider,{value:Y},He.createElement(_N.Provider,{value:pe},He.createElement("article",{ref:s,"data-json-schema-level":ee,className:lC()("json-schema-2020-12",{"json-schema-2020-12--embedded":ae,"json-schema-2020-12--circular":ce})},He.createElement("div",{className:"json-schema-2020-12-head"},le&&!ce?He.createElement(He.Fragment,null,He.createElement(fe,{expanded:W,onChange:St},He.createElement(gt,{title:m,schema:u})),He.createElement(Et,{expanded:W,onClick:xt})):He.createElement(gt,{title:m,schema:u}),He.createElement(bt,{schema:u}),He.createElement(_t,{schema:u}),He.createElement(wt,{schema:u}),He.createElement(ct,{schema:u,isCircular:ce}),de.length>0&&de.map((i=>He.createElement(ht,{key:`${i.scope}-${i.value}`,constraint:i})))),He.createElement("div",{className:lC()("json-schema-2020-12-body",{"json-schema-2020-12-body--collapsed":!W})},W&&He.createElement(He.Fragment,null,He.createElement(yt,{schema:u}),!ce&&le&&He.createElement(He.Fragment,null,He.createElement(nt,{schema:u}),He.createElement(ot,{schema:u}),He.createElement(it,{schema:u}),He.createElement(lt,{schema:u}),He.createElement(at,{schema:u}),He.createElement(Re,{schema:u}),He.createElement(qe,{schema:u}),He.createElement(ze,{schema:u}),He.createElement(Ve,{schema:u}),He.createElement(We,{schema:u}),He.createElement(Xe,{schema:u}),He.createElement(Ye,{schema:u}),He.createElement(Qe,{schema:u}),He.createElement(et,{schema:u}),He.createElement(tt,{schema:u}),He.createElement(st,{schema:u}),He.createElement(rt,{schema:u}),He.createElement(mt,{schema:u})),He.createElement(ut,{schema:u}),He.createElement(pt,{schema:u}),He.createElement(dt,{schema:u,dependentRequired:v}),He.createElement(vt,{schema:u}),He.createElement(ye,{schema:u}),He.createElement(be,{schema:u}),He.createElement(_e,{schema:u}),He.createElement(we,{schema:u}),He.createElement(Se,{schema:u}),He.createElement(xe,{schema:u}),!ce&&le&&He.createElement(Pe,{schema:u}),He.createElement(Ie,{schema:u}),He.createElement(Te,{schema:u})))))))}));wN.defaultProps={name:"",dependentRequired:[],onExpand:()=>{}};const EN=wN,keywords_$schema=i=>{let{schema:s}=i;return s?.$schema?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$schema"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$schema"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$schema)):null},$vocabulary_$vocabulary=i=>{let{schema:s}=i;const u=useIsExpandedDeeply(),[m,v]=(0,He.useState)(u),_=useComponent("Accordion"),j=(0,He.useCallback)((()=>{v((i=>!i))}),[]);return s?.$vocabulary?"object"!=typeof s.$vocabulary?null:He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$vocabulary"},He.createElement(_,{expanded:m,onChange:j},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$vocabulary")),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",null,m&&Object.entries(s.$vocabulary).map((i=>{let[s,u]=i;return He.createElement("li",{key:s,className:lC()("json-schema-2020-12-$vocabulary-uri",{"json-schema-2020-12-$vocabulary-uri--disabled":!u})},He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s))})))):null},keywords_$id=i=>{let{schema:s}=i;return s?.$id?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$id"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$id"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$id)):null},keywords_$anchor=i=>{let{schema:s}=i;return s?.$anchor?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$anchor"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$anchor"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$anchor)):null},keywords_$dynamicAnchor=i=>{let{schema:s}=i;return s?.$dynamicAnchor?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicAnchor"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicAnchor"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicAnchor)):null},keywords_$ref=i=>{let{schema:s}=i;return s?.$ref?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$ref"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$ref"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$ref)):null},keywords_$dynamicRef=i=>{let{schema:s}=i;return s?.$dynamicRef?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicRef"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicRef"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicRef)):null},keywords_$defs=i=>{let{schema:s}=i;const u=s?.$defs||{},m=useIsExpandedDeeply(),[v,_]=(0,He.useState)(m),[j,M]=(0,He.useState)(!1),$=useComponent("Accordion"),W=useComponent("ExpandDeepButton"),X=useComponent("JSONSchema"),Y=(0,He.useCallback)((()=>{_((i=>!i))}),[]),Z=(0,He.useCallback)(((i,s)=>{_(s),M(s)}),[]);return 0===Object.keys(u).length?null:He.createElement(bN.Provider,{value:j},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$defs"},He.createElement($,{expanded:v,onChange:Y},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$defs")),He.createElement(W,{expanded:v,onClick:Z}),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!v})},v&&He.createElement(He.Fragment,null,Object.entries(u).map((i=>{let[s,u]=i;return He.createElement("li",{key:s,className:"json-schema-2020-12-property"},He.createElement(X,{name:s,schema:u}))}))))))},keywords_$comment=i=>{let{schema:s}=i;return s?.$comment?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$comment"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$comment"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$comment)):null},keywords_AllOf=i=>{let{schema:s}=i;const u=s?.allOf||[],m=useFn(),v=useIsExpandedDeeply(),[_,j]=(0,He.useState)(v),[M,$]=(0,He.useState)(!1),W=useComponent("Accordion"),X=useComponent("ExpandDeepButton"),Y=useComponent("JSONSchema"),Z=useComponent("KeywordType"),ee=(0,He.useCallback)((()=>{j((i=>!i))}),[]),ie=(0,He.useCallback)(((i,s)=>{j(s),$(s)}),[]);return Array.isArray(u)&&0!==u.length?He.createElement(bN.Provider,{value:M},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--allOf"},He.createElement(W,{expanded:_,onChange:ee},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"All of")),He.createElement(X,{expanded:_,onClick:ie}),He.createElement(Z,{schema:{allOf:u}}),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&He.createElement(He.Fragment,null,u.map(((i,s)=>He.createElement("li",{key:`#${s}`,className:"json-schema-2020-12-property"},He.createElement(Y,{name:`#${s} ${m.getTitle(i)}`,schema:i})))))))):null},keywords_AnyOf=i=>{let{schema:s}=i;const u=s?.anyOf||[],m=useFn(),v=useIsExpandedDeeply(),[_,j]=(0,He.useState)(v),[M,$]=(0,He.useState)(!1),W=useComponent("Accordion"),X=useComponent("ExpandDeepButton"),Y=useComponent("JSONSchema"),Z=useComponent("KeywordType"),ee=(0,He.useCallback)((()=>{j((i=>!i))}),[]),ie=(0,He.useCallback)(((i,s)=>{j(s),$(s)}),[]);return Array.isArray(u)&&0!==u.length?He.createElement(bN.Provider,{value:M},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--anyOf"},He.createElement(W,{expanded:_,onChange:ee},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Any of")),He.createElement(X,{expanded:_,onClick:ie}),He.createElement(Z,{schema:{anyOf:u}}),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&He.createElement(He.Fragment,null,u.map(((i,s)=>He.createElement("li",{key:`#${s}`,className:"json-schema-2020-12-property"},He.createElement(Y,{name:`#${s} ${m.getTitle(i)}`,schema:i})))))))):null},keywords_OneOf=i=>{let{schema:s}=i;const u=s?.oneOf||[],m=useFn(),v=useIsExpandedDeeply(),[_,j]=(0,He.useState)(v),[M,$]=(0,He.useState)(!1),W=useComponent("Accordion"),X=useComponent("ExpandDeepButton"),Y=useComponent("JSONSchema"),Z=useComponent("KeywordType"),ee=(0,He.useCallback)((()=>{j((i=>!i))}),[]),ie=(0,He.useCallback)(((i,s)=>{j(s),$(s)}),[]);return Array.isArray(u)&&0!==u.length?He.createElement(bN.Provider,{value:M},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--oneOf"},He.createElement(W,{expanded:_,onChange:ee},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"One of")),He.createElement(X,{expanded:_,onClick:ie}),He.createElement(Z,{schema:{oneOf:u}}),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&He.createElement(He.Fragment,null,u.map(((i,s)=>He.createElement("li",{key:`#${s}`,className:"json-schema-2020-12-property"},He.createElement(Y,{name:`#${s} ${m.getTitle(i)}`,schema:i})))))))):null},keywords_Not=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"not"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Not");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--not"},He.createElement(m,{name:v,schema:s.not}))},keywords_If=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"if"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"If");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},He.createElement(m,{name:v,schema:s.if}))},keywords_Then=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"then"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Then");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--then"},He.createElement(m,{name:v,schema:s.then}))},keywords_Else=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"else"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Else");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},He.createElement(m,{name:v,schema:s.else}))},keywords_DependentSchemas=i=>{let{schema:s}=i;const u=s?.dependentSchemas||[],m=useIsExpandedDeeply(),[v,_]=(0,He.useState)(m),[j,M]=(0,He.useState)(!1),$=useComponent("Accordion"),W=useComponent("ExpandDeepButton"),X=useComponent("JSONSchema"),Y=(0,He.useCallback)((()=>{_((i=>!i))}),[]),Z=(0,He.useCallback)(((i,s)=>{_(s),M(s)}),[]);return"object"!=typeof u||0===Object.keys(u).length?null:He.createElement(bN.Provider,{value:j},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentSchemas"},He.createElement($,{expanded:v,onChange:Y},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Dependent schemas")),He.createElement(W,{expanded:v,onClick:Z}),He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!v})},v&&He.createElement(He.Fragment,null,Object.entries(u).map((i=>{let[s,u]=i;return He.createElement("li",{key:s,className:"json-schema-2020-12-property"},He.createElement(X,{name:s,schema:u}))}))))))},keywords_PrefixItems=i=>{let{schema:s}=i;const u=s?.prefixItems||[],m=useFn(),v=useIsExpandedDeeply(),[_,j]=(0,He.useState)(v),[M,$]=(0,He.useState)(!1),W=useComponent("Accordion"),X=useComponent("ExpandDeepButton"),Y=useComponent("JSONSchema"),Z=useComponent("KeywordType"),ee=(0,He.useCallback)((()=>{j((i=>!i))}),[]),ie=(0,He.useCallback)(((i,s)=>{j(s),$(s)}),[]);return Array.isArray(u)&&0!==u.length?He.createElement(bN.Provider,{value:M},He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--prefixItems"},He.createElement(W,{expanded:_,onChange:ee},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Prefix items")),He.createElement(X,{expanded:_,onClick:ie}),He.createElement(Z,{schema:{prefixItems:u}}),He.createElement("ul",{className:lC()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&He.createElement(He.Fragment,null,u.map(((i,s)=>He.createElement("li",{key:`#${s}`,className:"json-schema-2020-12-property"},He.createElement(Y,{name:`#${s} ${m.getTitle(i)}`,schema:i})))))))):null},keywords_Items=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"items"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Items");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--items"},He.createElement(m,{name:v,schema:s.items}))},keywords_Contains=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"contains"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Contains");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contains"},He.createElement(m,{name:v,schema:s.contains}))},keywords_Properties_Properties=i=>{let{schema:s}=i;const u=useFn(),m=s?.properties||{},v=Array.isArray(s?.required)?s.required:[],_=useComponent("JSONSchema");return 0===Object.keys(m).length?null:He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},He.createElement("ul",null,Object.entries(m).map((i=>{let[m,j]=i;const M=v.includes(m),$=u.getDependentRequired(m,s);return He.createElement("li",{key:m,className:lC()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":M})},He.createElement(_,{name:m,schema:j,dependentRequired:$}))}))))},keywords_PatternProperties_PatternProperties=i=>{let{schema:s}=i;const u=s?.patternProperties||{},m=useComponent("JSONSchema");return 0===Object.keys(u).length?null:He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--patternProperties"},He.createElement("ul",null,Object.entries(u).map((i=>{let[s,u]=i;return He.createElement("li",{key:s,className:"json-schema-2020-12-property"},He.createElement(m,{name:s,schema:u}))}))))},keywords_AdditionalProperties=i=>{let{schema:s}=i;const u=useFn(),{additionalProperties:m}=s,v=useComponent("JSONSchema");if(!u.hasKeyword(s,"additionalProperties"))return null;const _=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Additional properties");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--additionalProperties"},!0===m?He.createElement(He.Fragment,null,_,He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"allowed")):!1===m?He.createElement(He.Fragment,null,_,He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"forbidden")):He.createElement(v,{name:_,schema:m}))},keywords_PropertyNames=i=>{let{schema:s}=i;const u=useFn(),{propertyNames:m}=s,v=useComponent("JSONSchema"),_=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Property names");return u.hasKeyword(s,"propertyNames")?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--propertyNames"},He.createElement(v,{name:_,schema:m})):null},keywords_UnevaluatedItems=i=>{let{schema:s}=i;const u=useFn(),{unevaluatedItems:m}=s,v=useComponent("JSONSchema");if(!u.hasKeyword(s,"unevaluatedItems"))return null;const _=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated items");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedItems"},He.createElement(v,{name:_,schema:m}))},keywords_UnevaluatedProperties=i=>{let{schema:s}=i;const u=useFn(),{unevaluatedProperties:m}=s,v=useComponent("JSONSchema");if(!u.hasKeyword(s,"unevaluatedProperties"))return null;const _=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated properties");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedProperties"},He.createElement(v,{name:_,schema:m}))},Type_Type=i=>{let{schema:s,isCircular:u}=i;const m=useFn().getType(s),v=u?" [circular]":"";return He.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},`${m}${v}`)};Type_Type.defaultProps={isCircular:!1};const SN=Type_Type,Enum_Enum=i=>{let{schema:s}=i;const u=useFn();return Array.isArray(s?.enum)?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--enum"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Allowed values"),He.createElement("ul",null,s.enum.map((i=>{const s=u.stringify(i);return He.createElement("li",{key:s},He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const"},s))})))):null},keywords_Const=i=>{let{schema:s}=i;const u=useFn();return u.hasKeyword(s,"const")?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--const"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Const"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const"},u.stringify(s.const))):null},Constraint=i=>{let{constraint:s}=i;return He.createElement("span",{className:`json-schema-2020-12__constraint json-schema-2020-12__constraint--${s.scope}`},s.value)},xN=He.memo(Constraint),DependentRequired_DependentRequired=i=>{let{dependentRequired:s}=i;return 0===s.length?null:He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentRequired"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Required when defined"),He.createElement("ul",null,s.map((i=>He.createElement("li",{key:i},He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--warning"},i))))))},keywords_ContentSchema=i=>{let{schema:s}=i;const u=useFn(),m=useComponent("JSONSchema");if(!u.hasKeyword(s,"contentSchema"))return null;const v=He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Content schema");return He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contentSchema"},He.createElement(m,{name:v,schema:s.contentSchema}))},Title=i=>{let{title:s,schema:u}=i;const m=useFn();return s||m.getTitle(u)?He.createElement("div",{className:"json-schema-2020-12__title"},s||m.getTitle(u)):null};Title.defaultProps={title:""};const kN=Title,keywords_Description_Description=i=>{let{schema:s}=i;return s?.description?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},He.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},s.description)):null},keywords_Default=i=>{let{schema:s}=i;const u=useFn();return u.hasKeyword(s,"default")?He.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--default"},He.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Default"),He.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const"},u.stringify(s.default))):null},keywords_Deprecated=i=>{let{schema:s}=i;return!0!==s?.deprecated?null:He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--warning"},"deprecated")},keywords_ReadOnly=i=>{let{schema:s}=i;return!0!==s?.readOnly?null:He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"read-only")},keywords_WriteOnly=i=>{let{schema:s}=i;return!0!==s?.writeOnly?null:He.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"write-only")},Accordion=i=>{let{expanded:s,children:u,onChange:m}=i;const v=useComponent("ChevronRightIcon"),_=(0,He.useCallback)((i=>{m(i,!s)}),[s,m]);return He.createElement("button",{type:"button",className:"json-schema-2020-12-accordion",onClick:_},He.createElement("div",{className:"json-schema-2020-12-accordion__children"},u),He.createElement("span",{className:lC()("json-schema-2020-12-accordion__icon",{"json-schema-2020-12-accordion__icon--expanded":s,"json-schema-2020-12-accordion__icon--collapsed":!s})},He.createElement(v,null)))};Accordion.defaultProps={expanded:!1};const ON=Accordion,ExpandDeepButton_ExpandDeepButton=i=>{let{expanded:s,onClick:u}=i;const m=(0,He.useCallback)((i=>{u(i,!s)}),[s,u]);return He.createElement("button",{type:"button",className:"json-schema-2020-12-expand-deep-button",onClick:m},s?"Collapse all":"Expand all")},icons_ChevronRight=()=>He.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},He.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),fn_upperFirst=i=>"string"==typeof i?`${i.charAt(0).toUpperCase()}${i.slice(1)}`:i,getTitle=i=>{const s=useFn();return i?.title?s.upperFirst(i.title):i?.$anchor?s.upperFirst(i.$anchor):i?.$id?i.$id:""},getType=function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakSet;const u=useFn();if(null==i)return"any";if(u.isBooleanJSONSchema(i))return i?"any":"never";if("object"!=typeof i)return"any";if(s.has(i))return"any";s.add(i);const{type:m,prefixItems:v,items:_}=i,getArrayType=()=>{if(Array.isArray(v)){const i=v.map((i=>getType(i,s))),u=_?getType(_,s):"any";return`array<[${i.join(", ")}], ${u}>`}if(_){return`array<${getType(_,s)}>`}return"array"};if(i.not&&"any"===getType(i.not))return"never";const handleCombiningKeywords=(u,m)=>{if(Array.isArray(i[u])){return`(${i[u].map((i=>getType(i,s))).join(m)})`}return null},j=[Array.isArray(m)?m.map((i=>"array"===i?getArrayType():i)).join(" | "):"array"===m?getArrayType():["null","boolean","object","array","number","integer","string"].includes(m)?m:(()=>{if(Object.hasOwn(i,"prefixItems")||Object.hasOwn(i,"items")||Object.hasOwn(i,"contains"))return getArrayType();if(Object.hasOwn(i,"properties")||Object.hasOwn(i,"additionalProperties")||Object.hasOwn(i,"patternProperties"))return"object";if(["int32","int64"].includes(i.format))return"integer";if(["float","double"].includes(i.format))return"number";if(Object.hasOwn(i,"minimum")||Object.hasOwn(i,"maximum")||Object.hasOwn(i,"exclusiveMinimum")||Object.hasOwn(i,"exclusiveMaximum")||Object.hasOwn(i,"multipleOf"))return"number | integer";if(Object.hasOwn(i,"pattern")||Object.hasOwn(i,"format")||Object.hasOwn(i,"minLength")||Object.hasOwn(i,"maxLength"))return"string";if(void 0!==i.const){if(null===i.const)return"null";if("boolean"==typeof i.const)return"boolean";if("number"==typeof i.const)return Number.isInteger(i.const)?"integer":"number";if("string"==typeof i.const)return"string";if(Array.isArray(i.const))return"array";if("object"==typeof i.const)return"object"}return null})(),handleCombiningKeywords("oneOf"," | "),handleCombiningKeywords("anyOf"," | "),handleCombiningKeywords("allOf"," & ")].filter(Boolean).join(" | ");return s.delete(i),j||"any"},isBooleanJSONSchema=i=>"boolean"==typeof i,hasKeyword=(i,s)=>null!==i&&"object"==typeof i&&Object.hasOwn(i,s),isExpandable=i=>{const s=useFn();return i?.$schema||i?.$vocabulary||i?.$id||i?.$anchor||i?.$dynamicAnchor||i?.$ref||i?.$dynamicRef||i?.$defs||i?.$comment||i?.allOf||i?.anyOf||i?.oneOf||s.hasKeyword(i,"not")||s.hasKeyword(i,"if")||s.hasKeyword(i,"then")||s.hasKeyword(i,"else")||i?.dependentSchemas||i?.prefixItems||s.hasKeyword(i,"items")||s.hasKeyword(i,"contains")||i?.properties||i?.patternProperties||s.hasKeyword(i,"additionalProperties")||s.hasKeyword(i,"propertyNames")||s.hasKeyword(i,"unevaluatedItems")||s.hasKeyword(i,"unevaluatedProperties")||i?.description||i?.enum||s.hasKeyword(i,"const")||s.hasKeyword(i,"contentSchema")||s.hasKeyword(i,"default")},fn_stringify=i=>null===i||["number","bigint","boolean"].includes(typeof i)?String(i):Array.isArray(i)?`[${i.map(fn_stringify).join(", ")}]`:JSON.stringify(i),stringifyConstraintRange=(i,s,u)=>{const m="number"==typeof s,v="number"==typeof u;return m&&v?s===u?`${s} ${i}`:`[${s}, ${u}] ${i}`:m?`>= ${s} ${i}`:v?`<= ${u} ${i}`:null},stringifyConstraints=i=>{const s=[],u=(i=>{if("number"!=typeof i?.multipleOf)return null;if(i.multipleOf<=0)return null;if(1===i.multipleOf)return null;const{multipleOf:s}=i;if(Number.isInteger(s))return`multiple of ${s}`;const u=10**s.toString().split(".")[1].length;return`multiple of ${s*u}/${u}`})(i);null!==u&&s.push({scope:"number",value:u});const m=(i=>{const s=i?.minimum,u=i?.maximum,m=i?.exclusiveMinimum,v=i?.exclusiveMaximum,_="number"==typeof s,j="number"==typeof u,M="number"==typeof m,$="number"==typeof v,W=M&&(!_||sv);if((_||M)&&(j||$))return`${W?"(":"["}${W?m:s}, ${X?v:u}${X?")":"]"}`;if(_||M)return`${W?">":"≥"} ${W?m:s}`;if(j||$)return`${X?"<":"≤"} ${X?v:u}`;return null})(i);null!==m&&s.push({scope:"number",value:m}),i?.format&&s.push({scope:"string",value:i.format});const v=stringifyConstraintRange("characters",i?.minLength,i?.maxLength);null!==v&&s.push({scope:"string",value:v}),i?.pattern&&s.push({scope:"string",value:`matches ${i?.pattern}`}),i?.contentMediaType&&s.push({scope:"string",value:`media type: ${i.contentMediaType}`}),i?.contentEncoding&&s.push({scope:"string",value:`encoding: ${i.contentEncoding}`});const _=stringifyConstraintRange(i?.hasUniqueItems?"unique items":"items",i?.minItems,i?.maxItems);null!==_&&s.push({scope:"array",value:_});const j=stringifyConstraintRange("contained items",i?.minContains,i?.maxContains);null!==j&&s.push({scope:"array",value:j});const M=stringifyConstraintRange("properties",i?.minProperties,i?.maxProperties);return null!==M&&s.push({scope:"object",value:M}),s},getDependentRequired=(i,s)=>s?.dependentRequired?Array.from(Object.entries(s.dependentRequired).reduce(((s,u)=>{let[m,v]=u;return Array.isArray(v)&&v.includes(i)?(s.add(m),s):s}),new Set)):[],withJSONSchemaContext=function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const u={components:{JSONSchema:EN,Keyword$schema:keywords_$schema,Keyword$vocabulary:$vocabulary_$vocabulary,Keyword$id:keywords_$id,Keyword$anchor:keywords_$anchor,Keyword$dynamicAnchor:keywords_$dynamicAnchor,Keyword$ref:keywords_$ref,Keyword$dynamicRef:keywords_$dynamicRef,Keyword$defs:keywords_$defs,Keyword$comment:keywords_$comment,KeywordAllOf:keywords_AllOf,KeywordAnyOf:keywords_AnyOf,KeywordOneOf:keywords_OneOf,KeywordNot:keywords_Not,KeywordIf:keywords_If,KeywordThen:keywords_Then,KeywordElse:keywords_Else,KeywordDependentSchemas:keywords_DependentSchemas,KeywordPrefixItems:keywords_PrefixItems,KeywordItems:keywords_Items,KeywordContains:keywords_Contains,KeywordProperties:keywords_Properties_Properties,KeywordPatternProperties:keywords_PatternProperties_PatternProperties,KeywordAdditionalProperties:keywords_AdditionalProperties,KeywordPropertyNames:keywords_PropertyNames,KeywordUnevaluatedItems:keywords_UnevaluatedItems,KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,KeywordType:SN,KeywordEnum:Enum_Enum,KeywordConst:keywords_Const,KeywordConstraint:xN,KeywordDependentRequired:DependentRequired_DependentRequired,KeywordContentSchema:keywords_ContentSchema,KeywordTitle:kN,KeywordDescription:keywords_Description_Description,KeywordDefault:keywords_Default,KeywordDeprecated:keywords_Deprecated,KeywordReadOnly:keywords_ReadOnly,KeywordWriteOnly:keywords_WriteOnly,Accordion:ON,ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,ChevronRightIcon:icons_ChevronRight,...s.components},config:{default$schema:"https://json-schema.org/draft/2020-12/schema",defaultExpandedLevels:0,...s.config},fn:{upperFirst:fn_upperFirst,getTitle,getType,isBooleanJSONSchema,hasKeyword,isExpandable,stringify:fn_stringify,stringifyConstraints,getDependentRequired,...s.fn}},HOC=s=>He.createElement(yN.Provider,{value:u},He.createElement(i,s));return HOC.contexts={JSONSchemaContext:yN},HOC.displayName=i.displayName,HOC},json_schema_2020_12=()=>({components:{JSONSchema202012:EN,JSONSchema202012Keyword$schema:keywords_$schema,JSONSchema202012Keyword$vocabulary:$vocabulary_$vocabulary,JSONSchema202012Keyword$id:keywords_$id,JSONSchema202012Keyword$anchor:keywords_$anchor,JSONSchema202012Keyword$dynamicAnchor:keywords_$dynamicAnchor,JSONSchema202012Keyword$ref:keywords_$ref,JSONSchema202012Keyword$dynamicRef:keywords_$dynamicRef,JSONSchema202012Keyword$defs:keywords_$defs,JSONSchema202012Keyword$comment:keywords_$comment,JSONSchema202012KeywordAllOf:keywords_AllOf,JSONSchema202012KeywordAnyOf:keywords_AnyOf,JSONSchema202012KeywordOneOf:keywords_OneOf,JSONSchema202012KeywordNot:keywords_Not,JSONSchema202012KeywordIf:keywords_If,JSONSchema202012KeywordThen:keywords_Then,JSONSchema202012KeywordElse:keywords_Else,JSONSchema202012KeywordDependentSchemas:keywords_DependentSchemas,JSONSchema202012KeywordPrefixItems:keywords_PrefixItems,JSONSchema202012KeywordItems:keywords_Items,JSONSchema202012KeywordContains:keywords_Contains,JSONSchema202012KeywordProperties:keywords_Properties_Properties,JSONSchema202012KeywordPatternProperties:keywords_PatternProperties_PatternProperties,JSONSchema202012KeywordAdditionalProperties:keywords_AdditionalProperties,JSONSchema202012KeywordPropertyNames:keywords_PropertyNames,JSONSchema202012KeywordUnevaluatedItems:keywords_UnevaluatedItems,JSONSchema202012KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,JSONSchema202012KeywordType:SN,JSONSchema202012KeywordEnum:Enum_Enum,JSONSchema202012KeywordConst:keywords_Const,JSONSchema202012KeywordConstraint:xN,JSONSchema202012KeywordDependentRequired:DependentRequired_DependentRequired,JSONSchema202012KeywordContentSchema:keywords_ContentSchema,JSONSchema202012KeywordTitle:kN,JSONSchema202012KeywordDescription:keywords_Description_Description,JSONSchema202012KeywordDefault:keywords_Default,JSONSchema202012KeywordDeprecated:keywords_Deprecated,JSONSchema202012KeywordReadOnly:keywords_ReadOnly,JSONSchema202012KeywordWriteOnly:keywords_WriteOnly,JSONSchema202012Accordion:ON,JSONSchema202012ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,JSONSchema202012ChevronRightIcon:icons_ChevronRight,withJSONSchema202012Context:withJSONSchemaContext,JSONSchema202012DeepExpansionContext:()=>bN},fn:{upperFirst:fn_upperFirst,jsonSchema202012:{isExpandable,hasKeyword,useFn,useConfig,useComponent,useIsExpandedDeeply}}});var AN=__webpack_require__(68630),CN=__webpack_require__.n(AN);const array=(i,s)=>{let{sample:u}=s;return function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{minItems:u,maxItems:m,uniqueItems:v}=s,{contains:_,minContains:j,maxContains:M}=s;let $=[...i];if(null!=_&&"object"==typeof _){if(Number.isInteger(j)&&j>1){const i=$.at(0);for(let s=1;s0&&($=i.slice(0,m)),Number.isInteger(u)&&u>0)for(let i=0;$.length{throw new Error("Not implemented")},bytes=i=>jt()(i),random_pick=i=>i.at(0),predicates_isBooleanJSONSchema=i=>"boolean"==typeof i,isJSONSchemaObject=i=>CN()(i),isJSONSchema=i=>predicates_isBooleanJSONSchema(i)||isJSONSchemaObject(i),email=()=>"user@example.com",idn_email=()=>"실례@example.com",hostname=()=>"example.com",idn_hostname=()=>"실례.com",ipv4=()=>"198.51.100.42",ipv6=()=>"2001:0db8:5b96:0000:0000:426f:8e17:642a",uri=()=>"https://example.com/",uri_reference=()=>"path/index.html",iri=()=>"https://실례.com/",iri_reference=()=>"path/실례.html",uuid=()=>"3fa85f64-5717-4562-b3fc-2c963f66afa6",uri_template=()=>"https://example.com/dictionary/{term:1}/{term}",json_pointer=()=>"/a/b/c",relative_json_pointer=()=>"1/0",date_time=()=>(new Date).toISOString(),date=()=>(new Date).toISOString().substring(0,10),time=()=>(new Date).toISOString().substring(11),duration=()=>"P3D",generators_password=()=>"********",regex=()=>"^[a-z]+$";const jN=class Registry{data={};register(i,s){this.data[i]=s}unregister(i){void 0===i?this.data={}:delete this.data[i]}get(i){return this.data[i]}},IN=new jN,api_formatAPI=(i,s)=>"function"==typeof s?IN.register(i,s):null===s?IN.unregister(i):IN.get(i);var PN=__webpack_require__(48764).Buffer;const _7bit=i=>PN.from(i).toString("ascii");var NN=__webpack_require__(48764).Buffer;const _8bit=i=>NN.from(i).toString("utf8");var TN=__webpack_require__(48764).Buffer;const encoders_binary=i=>TN.from(i).toString("binary"),quoted_printable=i=>{let s="";for(let u=0;u=33&&m<=60||m>=62&&m<=126||9===m||32===m)s+=i.charAt(u);else if(13===m||10===m)s+="\r\n";else if(m>126){const m=unescape(encodeURIComponent(i.charAt(u)));for(let i=0;iMN.from(i).toString("hex");var RN=__webpack_require__(48764).Buffer;const base32=i=>{const s=RN.from(i).toString("utf8"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";let m=0,v="",_=0,j=0;for(let i=0;i=5;)v+=u.charAt(_>>>j-5&31),j-=5;j>0&&(v+=u.charAt(_<<5-j&31),m=(8-8*s.length%5)%5);for(let i=0;iDN.from(i).toString("base64");const BN=new class EncoderRegistry extends jN{#e={"7bit":_7bit,"8bit":_8bit,binary:encoders_binary,"quoted-printable":quoted_printable,base16,base32,base64};data={...this.#e};get defaults(){return{...this.#e}}},encoderAPI=(i,s)=>"function"==typeof s?BN.register(i,s):null===s?BN.unregister(i):BN.get(i);encoderAPI.getDefaults=()=>BN.defaults;const LN=encoderAPI,FN={"text/plain":()=>"string","text/css":()=>".selector { border: 1px solid red }","text/csv":()=>"value1,value2,value3","text/html":()=>"

    content

    ","text/calendar":()=>"BEGIN:VCALENDAR","text/javascript":()=>"console.dir('Hello world!');","text/xml":()=>'John Doe',"text/*":()=>"string"},qN={"image/*":()=>bytes(25).toString("binary")},$N={"audio/*":()=>bytes(25).toString("binary")},UN={"video/*":()=>bytes(25).toString("binary")},zN={"application/json":()=>'{"key":"value"}',"application/ld+json":()=>'{"name": "John Doe"}',"application/x-httpd-php":()=>"Hello World!

    '; ?>","application/rtf":()=>String.raw`{\rtf1\adeflang1025\ansi\ansicpg1252\uc1`,"application/x-sh":()=>'echo "Hello World!"',"application/xhtml+xml":()=>"

    content

    ","application/*":()=>bytes(25).toString("binary")};const VN=new class MediaTypeRegistry extends jN{#e={...FN,...qN,...$N,...UN,...zN};data={...this.#e};get defaults(){return{...this.#e}}},mediaTypeAPI=(i,s)=>{if("function"==typeof s)return VN.register(i,s);if(null===s)return VN.unregister(i);const u=i.split(";").at(0),m=`${u.split("/").at(0)}/*`;return VN.get(i)||VN.get(u)||VN.get(m)};mediaTypeAPI.getDefaults=()=>VN.defaults;const WN=mediaTypeAPI,types_string=function(i){let{sample:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{contentEncoding:u,contentMediaType:m,contentSchema:v}=i,{pattern:_,format:j}=i,M=LN(u)||ZA();let $;if("string"==typeof _)$=(i=>{try{return new(ca())(i).gen()}catch{return"string"}})(_);else if("string"==typeof j)$=(i=>{const{format:s}=i,u=api_formatAPI(s);if("function"==typeof u)return u(i);switch(s){case"email":return email();case"idn-email":return idn_email();case"hostname":return hostname();case"idn-hostname":return idn_hostname();case"ipv4":return ipv4();case"ipv6":return ipv6();case"uri":return uri();case"uri-user-guide":return uri_reference();case"iri":return iri();case"iri-user-guide":return iri_reference();case"uuid":return uuid();case"uri-template":return uri_template();case"json-pointer":return json_pointer();case"relative-json-pointer":return relative_json_pointer();case"date-time":return date_time();case"date":return date();case"time":return time();case"duration":return duration();case"password":return generators_password();case"regex":return regex()}return"string"})(i);else if(isJSONSchema(v)&&"string"==typeof m&&void 0!==s)$=Array.isArray(s)||"object"==typeof s?JSON.stringify(s):String(s);else if("string"==typeof m){const s=WN(m);"function"==typeof s&&($=s(i))}else $="string";return M(function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{maxLength:u,minLength:m}=s;let v=i;if(Number.isInteger(u)&&u>0&&(v=v.slice(0,u)),Number.isInteger(m)&&m>0){let i=0;for(;v.length.1,generators_double=()=>.1,types_number=i=>{const{format:s}=i;let u;return u="string"==typeof s?(i=>{const{format:s}=i,u=api_formatAPI(s);if("function"==typeof u)return u(i);switch(s){case"float":return generators_float();case"double":return generators_double()}return 0})(i):0,function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{minimum:u,maximum:m,exclusiveMinimum:v,exclusiveMaximum:_}=s,{multipleOf:j}=s,M=Number.isInteger(i)?1:Number.EPSILON;let $="number"==typeof u?u:null,W="number"==typeof m?m:null,X=i;if("number"==typeof v&&($=null!==$?Math.max($,v+M):v+M),"number"==typeof _&&(W=null!==W?Math.min(W,_-M):_-M),X=$>W&&i||$||W||X,"number"==typeof j&&j>0){const i=X%j;X=0===i?X:X+j-i}return X}(u,i)},int32=()=>2**30>>>0,int64=()=>2**53-1,types_integer=i=>{const{format:s}=i;return"string"==typeof s?(i=>{const{format:s}=i,u=api_formatAPI(s);if("function"==typeof u)return u(i);switch(s){case"int32":return int32();case"int64":return int64()}return 0})(i):0},types_boolean=i=>"boolean"!=typeof i.default||i.default,KN=new Proxy({array,object,string:types_string,number:types_number,integer:types_integer,boolean:types_boolean,null:()=>null},{get:(i,s)=>"string"==typeof s&&Object.hasOwn(i,s)?i[s]:()=>`Unknown Type: ${s}`}),HN=["array","object","number","integer","string","boolean","null"],hasExample=i=>{if(!isJSONSchemaObject(i))return!1;const{examples:s,example:u,default:m}=i;return!!(Array.isArray(s)&&s.length>=1)||(void 0!==m||void 0!==u)},extractExample=i=>{if(!isJSONSchemaObject(i))return null;const{examples:s,example:u,default:m}=i;return Array.isArray(s)&&s.length>=1?s.at(0):void 0!==m?m:void 0!==u?u:void 0},JN={array:["items","prefixItems","contains","maxContains","minContains","maxItems","minItems","uniqueItems","unevaluatedItems"],object:["properties","additionalProperties","patternProperties","propertyNames","minProperties","maxProperties","required","dependentSchemas","dependentRequired","unevaluatedProperties"],string:["pattern","format","minLength","maxLength","contentEncoding","contentMediaType","contentSchema"],integer:["minimum","maximum","exclusiveMinimum","exclusiveMaximum","multipleOf"]};JN.number=JN.integer;const GN="string",inferTypeFromValue=i=>void 0===i?null:null===i?"null":Array.isArray(i)?"array":Number.isInteger(i)?"integer":typeof i,foldType=i=>{if(Array.isArray(i)&&i.length>=1){if(i.includes("array"))return"array";if(i.includes("object"))return"object";{const s=random_pick(i);if(HN.includes(s))return s}}return HN.includes(i)?i:null},inferType=function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakSet;if(!isJSONSchemaObject(i))return GN;if(s.has(i))return GN;s.add(i);let{type:u,const:m}=i;if(u=foldType(u),"string"!=typeof u){const s=Object.keys(JN);e:for(let m=0;m{if(Array.isArray(i[u])){const m=i[u].map((i=>inferType(i,s)));return foldType(m)}return null},m=combineTypes("allOf"),v=combineTypes("anyOf"),_=combineTypes("oneOf"),j=i.not?inferType(i.not,s):null;(m||v||_||j)&&(u=foldType([m,v,_,j].filter(Boolean)))}if("string"!=typeof u&&hasExample(i)){const s=extractExample(i),m=inferTypeFromValue(s);u="string"==typeof m?m:u}return s.delete(i),u||GN},type_getType=i=>inferType(i),typeCast=i=>predicates_isBooleanJSONSchema(i)?(i=>!1===i?{not:{}}:{})(i):isJSONSchemaObject(i)?i:{},merge_merge=function(i,s){let u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(predicates_isBooleanJSONSchema(i)&&!0===i)return!0;if(predicates_isBooleanJSONSchema(i)&&!1===i)return!1;if(predicates_isBooleanJSONSchema(s)&&!0===s)return!0;if(predicates_isBooleanJSONSchema(s)&&!1===s)return!1;if(!isJSONSchema(i))return s;if(!isJSONSchema(s))return i;const m={...s,...i};if(s.type&&i.type&&Array.isArray(s.type)&&"string"==typeof s.type){const u=normalizeArray(s.type).concat(i.type);m.type=Array.from(new Set(u))}if(Array.isArray(s.required)&&Array.isArray(i.required)&&(m.required=[...new Set([...i.required,...s.required])]),s.properties&&i.properties){const v=new Set([...Object.keys(s.properties),...Object.keys(i.properties)]);m.properties={};for(const _ of v){const v=s.properties[_]||{},j=i.properties[_]||{};v.readOnly&&!u.includeReadOnly||v.writeOnly&&!u.includeWriteOnly?m.required=(m.required||[]).filter((i=>i!==_)):m.properties[_]=merge_merge(j,v,u)}}return isJSONSchema(s.items)&&isJSONSchema(i.items)&&(m.items=merge_merge(i.items,s.items,u)),isJSONSchema(s.contains)&&isJSONSchema(i.contains)&&(m.contains=merge_merge(i.contains,s.contains,u)),isJSONSchema(s.contentSchema)&&isJSONSchema(i.contentSchema)&&(m.contentSchema=merge_merge(i.contentSchema,s.contentSchema,u)),m},XN=merge_merge,main_sampleFromSchemaGeneric=function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,m=arguments.length>3&&void 0!==arguments[3]&&arguments[3];"function"==typeof i?.toJS&&(i=i.toJS()),i=typeCast(i);let v=void 0!==u||hasExample(i);const _=!v&&Array.isArray(i.oneOf)&&i.oneOf.length>0,j=!v&&Array.isArray(i.anyOf)&&i.anyOf.length>0;if(!v&&(_||j)){const u=typeCast(random_pick(_?i.oneOf:i.anyOf));!(i=XN(i,u,s)).xml&&u.xml&&(i.xml=u.xml),hasExample(i)&&hasExample(u)&&(v=!0)}const M={};let{xml:$,properties:W,additionalProperties:X,items:Y,contains:Z}=i||{},ee=type_getType(i),{includeReadOnly:ie,includeWriteOnly:ae}=s;$=$||{};let le,{name:ce,prefix:pe,namespace:de}=$,fe={};if(Object.hasOwn(i,"type")||(i.type=ee),m&&(ce=ce||"notagname",le=(pe?`${pe}:`:"")+ce,de)){M[pe?`xmlns:${pe}`:"xmlns"]=de}m&&(fe[le]=[]);const ye=objectify(W);let be,_e=0;const hasExceededMaxProperties=()=>Number.isInteger(i.maxProperties)&&i.maxProperties>0&&_e>=i.maxProperties,canAddProperty=s=>!(Number.isInteger(i.maxProperties)&&i.maxProperties>0)||!hasExceededMaxProperties()&&(!(s=>!Array.isArray(i.required)||0===i.required.length||!i.required.includes(s))(s)||i.maxProperties-_e-(()=>{if(!Array.isArray(i.required)||0===i.required.length)return 0;let s=0;return m?i.required.forEach((i=>s+=void 0===fe[i]?0:1)):i.required.forEach((i=>{s+=void 0===fe[le]?.find((s=>void 0!==s[i]))?0:1})),i.required.length-s})()>0);if(be=m?function(u){let v=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(i&&ye[u]){if(ye[u].xml=ye[u].xml||{},ye[u].xml.attribute){const i=Array.isArray(ye[u].enum)?random_pick(ye[u].enum):void 0;if(hasExample(ye[u]))M[ye[u].xml.name||u]=extractExample(ye[u]);else if(void 0!==i)M[ye[u].xml.name||u]=i;else{const i=typeCast(ye[u]),s=type_getType(i),m=ye[u].xml.name||u;M[m]=KN[s](i)}return}ye[u].xml.name=ye[u].xml.name||u}else ye[u]||!1===X||(ye[u]={xml:{name:u}});let _=main_sampleFromSchemaGeneric(ye[u],s,v,m);canAddProperty(u)&&(_e++,Array.isArray(_)?fe[le]=fe[le].concat(_):fe[le].push(_))}:(u,v)=>{if(canAddProperty(u)){if(CN()(i.discriminator?.mapping)&&i.discriminator.propertyName===u&&"string"==typeof i.$$ref){for(const s in i.discriminator.mapping)if(-1!==i.$$ref.search(i.discriminator.mapping[s])){fe[u]=s;break}}else fe[u]=main_sampleFromSchemaGeneric(ye[u],s,v,m);_e++}},v){let v;if(v=void 0!==u?u:extractExample(i),!m){if("number"==typeof v&&"string"===ee)return`${v}`;if("string"!=typeof v||"string"===ee)return v;try{return JSON.parse(v)}catch{return v}}if("array"===ee){if(!Array.isArray(v)){if("string"==typeof v)return v;v=[v]}let u=[];return isJSONSchemaObject(Y)&&(Y.xml=Y.xml||$||{},Y.xml.name=Y.xml.name||$.name,u=v.map((i=>main_sampleFromSchemaGeneric(Y,s,i,m)))),isJSONSchemaObject(Z)&&(Z.xml=Z.xml||$||{},Z.xml.name=Z.xml.name||$.name,u=[main_sampleFromSchemaGeneric(Z,s,void 0,m),...u]),u=KN.array(i,{sample:u}),$.wrapped?(fe[le]=u,ha()(M)||fe[le].push({_attr:M})):fe=u,fe}if("object"===ee){if("string"==typeof v)return v;for(const i in v)Object.hasOwn(v,i)&&(ye[i]?.readOnly&&!ie||ye[i]?.writeOnly&&!ae||(ye[i]?.xml?.attribute?M[ye[i].xml.name||i]=v[i]:be(i,v[i])));return ha()(M)||fe[le].push({_attr:M}),fe}return fe[le]=ha()(M)?v:[{_attr:M},v],fe}if("array"===ee){let u=[];if(isJSONSchemaObject(Z))if(m&&(Z.xml=Z.xml||i.xml||{},Z.xml.name=Z.xml.name||$.name),Array.isArray(Z.anyOf))u.push(...Z.anyOf.map((i=>main_sampleFromSchemaGeneric(XN(i,Z,s),s,void 0,m))));else if(Array.isArray(Z.oneOf))u.push(...Z.oneOf.map((i=>main_sampleFromSchemaGeneric(XN(i,Z,s),s,void 0,m))));else{if(!(!m||m&&$.wrapped))return main_sampleFromSchemaGeneric(Z,s,void 0,m);u.push(main_sampleFromSchemaGeneric(Z,s,void 0,m))}if(isJSONSchemaObject(Y))if(m&&(Y.xml=Y.xml||i.xml||{},Y.xml.name=Y.xml.name||$.name),Array.isArray(Y.anyOf))u.push(...Y.anyOf.map((i=>main_sampleFromSchemaGeneric(XN(i,Y,s),s,void 0,m))));else if(Array.isArray(Y.oneOf))u.push(...Y.oneOf.map((i=>main_sampleFromSchemaGeneric(XN(i,Y,s),s,void 0,m))));else{if(!(!m||m&&$.wrapped))return main_sampleFromSchemaGeneric(Y,s,void 0,m);u.push(main_sampleFromSchemaGeneric(Y,s,void 0,m))}return u=KN.array(i,{sample:u}),m&&$.wrapped?(fe[le]=u,ha()(M)||fe[le].push({_attr:M}),fe):u}if("object"===ee){for(let i in ye)Object.hasOwn(ye,i)&&(ye[i]?.deprecated||ye[i]?.readOnly&&!ie||ye[i]?.writeOnly&&!ae||be(i));if(m&&M&&fe[le].push({_attr:M}),hasExceededMaxProperties())return fe;if(predicates_isBooleanJSONSchema(X)&&X)m?fe[le].push({additionalProp:"Anything can be here"}):fe.additionalProp1={},_e++;else if(isJSONSchemaObject(X)){const u=X,v=main_sampleFromSchemaGeneric(u,s,void 0,m);if(m&&"string"==typeof u?.xml?.name&&"notagname"!==u?.xml?.name)fe[le].push(v);else{const s=Number.isInteger(i.minProperties)&&i.minProperties>0&&_e{const m=main_sampleFromSchemaGeneric(i,s,u,!0);if(m)return"string"==typeof m?m:aa()(m,{declaration:!0,indent:"\t"})},main_sampleFromSchema=(i,s,u)=>main_sampleFromSchemaGeneric(i,s,u,!1),main_resolver=(i,s,u)=>[i,JSON.stringify(s),JSON.stringify(u)],YN=utils_memoizeN(main_createXMLExample,main_resolver),QN=utils_memoizeN(main_sampleFromSchema,main_resolver),ZN=[{when:/json/,shouldStringifyTypes:["string"]}],eT=["object"],fn_get_json_sample_schema=i=>(s,u,m,v)=>{const{fn:_}=i(),j=_.jsonSchema202012.memoizedSampleFromSchema(s,u,v),M=typeof j,$=ZN.reduce(((i,s)=>s.when.test(m)?[...i,...s.shouldStringifyTypes]:i),eT);return wt()($,(i=>i===M))?JSON.stringify(j,null,2):j},fn_get_yaml_sample_schema=i=>(s,u,m,v)=>{const{fn:_}=i(),j=_.jsonSchema202012.getJsonSampleSchema(s,u,m,v);let M;try{M=io.dump(io.load(j),{lineWidth:-1},{schema:Jn}),"\n"===M[M.length-1]&&(M=M.slice(0,M.length-1))}catch(i){return console.error(i),"error: could not generate yaml example"}return M.replace(/\t/g," ")},fn_get_xml_sample_schema=i=>(s,u,m)=>{const{fn:v}=i();if(s&&!s.xml&&(s.xml={}),s&&!s.xml.name){if(!s.$$ref&&(s.type||s.items||s.properties||s.additionalProperties))return'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e';if(s.$$ref){let i=s.$$ref.match(/\S*\/(\S+)$/);s.xml.name=i[1]}}return v.jsonSchema202012.memoizedCreateXMLExample(s,u,m)},fn_get_sample_schema=i=>function(s){let u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",m=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},v=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;const{fn:_}=i();return"function"==typeof s?.toJS&&(s=s.toJS()),"function"==typeof v?.toJS&&(v=v.toJS()),/xml/.test(u)?_.jsonSchema202012.getXmlSampleSchema(s,m,v):/(yaml|yml)/.test(u)?_.jsonSchema202012.getYamlSampleSchema(s,m,u,v):_.jsonSchema202012.getJsonSampleSchema(s,m,u,v)},json_schema_2020_12_samples=i=>{let{getSystem:s}=i;const u=fn_get_json_sample_schema(s),m=fn_get_yaml_sample_schema(s),v=fn_get_xml_sample_schema(s),_=fn_get_sample_schema(s);return{fn:{jsonSchema202012:{sampleFromSchema:main_sampleFromSchema,sampleFromSchemaGeneric:main_sampleFromSchemaGeneric,sampleEncoderAPI:LN,sampleFormatAPI:api_formatAPI,sampleMediaTypeAPI:WN,createXMLExample:main_createXMLExample,memoizedSampleFromSchema:QN,memoizedCreateXMLExample:YN,getJsonSampleSchema:u,getYamlSampleSchema:m,getXmlSampleSchema:v,getSampleSchema:_}}}};function PresetApis(){return[base,oas3,json_schema_2020_12,json_schema_2020_12_samples,oas31]}const{GIT_DIRTY:tT,GIT_COMMIT:rT,PACKAGE_VERSION:nT,BUILD_TIME:oT}={PACKAGE_VERSION:"5.9.4",GIT_COMMIT:"ge34d8fb8",GIT_DIRTY:!0,BUILD_TIME:"Mon, 13 Nov 2023 09:31:40 GMT"};function SwaggerUI(i){dt.versions=dt.versions||{},dt.versions.swaggerUi={version:nT,gitRevision:rT,gitDirty:tT,buildTimestamp:oT};const s={dom_id:null,domNode:null,spec:{},url:"",urls:null,layout:"BaseLayout",docExpansion:"list",maxDisplayedTags:null,filter:null,validatorUrl:"https://validator.swagger.io/validator",oauth2RedirectUrl:`${window.location.protocol}//${window.location.host}${window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))}/oauth2-redirect.html`,persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:i=>i,responseInterceptor:i=>i,showMutatedRequest:!0,defaultModelRendering:"example",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:"cURL (bash)",syntax:"bash"},curl_powershell:{title:"cURL (PowerShell)",syntax:"powershell"},curl_cmd:{title:"cURL (CMD)",syntax:"bash"}},defaultExpanded:!0,languages:null},supportedSubmitMethods:["get","put","post","delete","options","head","patch","trace"],queryConfigEnabled:!1,presets:[PresetApis],plugins:[],pluginsOptions:{pluginLoadType:"legacy"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:"agate"}};let u=i.queryConfigEnabled?(()=>{let i={},s=dt.location.search;if(!s)return{};if(""!=s){let u=s.substr(1).split("&");for(let s in u)Object.prototype.hasOwnProperty.call(u,s)&&(s=u[s].split("="),i[decodeURIComponent(s[0])]=s[1]&&decodeURIComponent(s[1])||"")}return i})():{};const m=i.domNode;delete i.domNode;const v=We()({},s,i,u),_={system:{configs:v.configs},plugins:v.presets,pluginsOptions:v.pluginsOptions,state:We()({layout:{layout:v.layout,filter:v.filter},spec:{spec:"",url:v.url},requestSnippets:v.requestSnippets},v.initialState)};if(v.initialState)for(var j in v.initialState)Object.prototype.hasOwnProperty.call(v.initialState,j)&&void 0===v.initialState[j]&&delete _.state[j];var M=new Store(_);M.register([v.plugins,()=>({fn:v.fn,components:v.components,state:v.state})]);var $=M.getSystem();const downloadSpec=i=>{let s=$.specSelectors.getLocalConfig?$.specSelectors.getLocalConfig():{},_=We()({},s,v,i||{},u);if(m&&(_.domNode=m),M.setConfigs(_),$.configsActions.loaded(),null!==i&&(!u.url&&"object"==typeof _.spec&&Object.keys(_.spec).length?($.specActions.updateUrl(""),$.specActions.updateLoadingStatus("success"),$.specActions.updateSpec(JSON.stringify(_.spec))):$.specActions.download&&_.url&&!_.urls&&($.specActions.updateUrl(_.url),$.specActions.download(_.url))),_.domNode)$.render(_.domNode,"App");else if(_.dom_id){let i=document.querySelector(_.dom_id);$.render(i,"App")}else null===_.dom_id||null===_.domNode||console.error("Skipped rendering: no `dom_id` or `domNode` was specified");return $},W=u.config||v.configUrl;return W&&$.specActions&&$.specActions.getConfigByUrl?($.specActions.getConfigByUrl({url:W,loadRemoteConfig:!0,requestInterceptor:v.requestInterceptor,responseInterceptor:v.responseInterceptor},downloadSpec),$):downloadSpec()}SwaggerUI.System=Store,SwaggerUI.presets={base,apis:PresetApis},SwaggerUI.plugins={Auth:auth,Configs:configsPlugin,DeepLining:deep_linking,Err:err,Filter:filter,Icons:icons,JSONSchema5Samples:json_schema_5_samples,JSONSchema202012:json_schema_2020_12,JSONSchema202012Samples:json_schema_2020_12_samples,Layout:plugins_layout,Logs:logs,OpenAPI30:oas3,OpenAPI31:oas3,OnComplete:on_complete,RequestSnippets:plugins_request_snippets,Spec:plugins_spec,SwaggerClient:swagger_client,Util:util,View:view,DownloadUrl:downloadUrlPlugin,SafeRender:safe_render};const iT=SwaggerUI})(),u=u.default})())); +//# sourceMappingURL=swagger-ui-bundle.js.map \ No newline at end of file diff --git a/docs/assets/scripts/swagger-ui-bundle.js.map b/docs/assets/scripts/swagger-ui-bundle.js.map new file mode 100644 index 000000000..90ef0607c --- /dev/null +++ b/docs/assets/scripts/swagger-ui-bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swagger-ui-bundle.js","mappings":";CAAA,SAAUA,iCAAiCC,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAyB,gBAAID,IAE7BD,EAAsB,gBAAIC,GAC3B,CATD,CASGK,MAAM,4CCPTJ,EAAQ,GAAcA,EAAQ,QAAY,EAC1C,IAAIK,EAAuB,wCACvBC,EAAoB,mBACpBC,EAAsB,oBACtBC,EAAsB,qDACtBC,EAAiB,oBACjBC,EAA0B,CAAC,IAAK,KACpCV,EAAQ,GAAY,cAmCpBA,EAAQ,GAxBR,SAASW,YAAYC,GACjB,IAAKA,EACD,OAAOZ,EAAQ,GAEnB,IAAIa,EAVR,SAASC,qBAAqBC,GAE1B,OADsBA,EAAIC,QAAQR,EAAqB,IAChCQ,QAAQV,GAAmB,SAAUW,EAAOC,GAC/D,OAAOC,OAAOC,aAAaF,EAC/B,GACJ,CAKuBJ,CAAqBF,GACnCI,QAAQT,EAAqB,IAC7BS,QAAQR,EAAqB,IAC7Ba,OACL,IAAKR,EACD,OAAOb,EAAQ,GAEnB,GArBJ,SAASsB,6BAA6BV,GAClC,OAAOF,EAAwBa,QAAQX,EAAI,KAAO,CACtD,CAmBQU,CAA6BT,GAC7B,OAAOA,EAEX,IAAIW,EAAwBX,EAAaI,MAAMR,GAC/C,IAAKe,EACD,OAAOX,EAEX,IAAIY,EAAYD,EAAsB,GACtC,OAAInB,EAAqBqB,KAAKD,GACnBzB,EAAQ,GAEZa,CACX,8BCzCAb,EAAQ2B,WAuCR,SAASA,WAAYC,GACnB,IAAIC,EAAOC,QAAQF,GACfG,EAAWF,EAAK,GAChBG,EAAkBH,EAAK,GAC3B,OAAuC,GAA9BE,EAAWC,GAAuB,EAAKA,CAClD,EA3CAhC,EAAQiC,YAiDR,SAASA,YAAaL,GACpB,IAAIM,EAcAC,EAbAN,EAAOC,QAAQF,GACfG,EAAWF,EAAK,GAChBG,EAAkBH,EAAK,GAEvBO,EAAM,IAAIC,EAVhB,SAASC,YAAaV,EAAKG,EAAUC,GACnC,OAAuC,GAA9BD,EAAWC,GAAuB,EAAKA,CAClD,CAQoBM,CAAYV,EAAKG,EAAUC,IAEzCO,EAAU,EAGVC,EAAMR,EAAkB,EACxBD,EAAW,EACXA,EAGJ,IAAKI,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EACxBD,EACGO,EAAUb,EAAIc,WAAWP,KAAO,GAChCM,EAAUb,EAAIc,WAAWP,EAAI,KAAO,GACpCM,EAAUb,EAAIc,WAAWP,EAAI,KAAO,EACrCM,EAAUb,EAAIc,WAAWP,EAAI,IAC/BC,EAAIG,KAAcL,GAAO,GAAM,IAC/BE,EAAIG,KAAcL,GAAO,EAAK,IAC9BE,EAAIG,KAAmB,IAANL,EAGK,IAApBF,IACFE,EACGO,EAAUb,EAAIc,WAAWP,KAAO,EAChCM,EAAUb,EAAIc,WAAWP,EAAI,KAAO,EACvCC,EAAIG,KAAmB,IAANL,GAGK,IAApBF,IACFE,EACGO,EAAUb,EAAIc,WAAWP,KAAO,GAChCM,EAAUb,EAAIc,WAAWP,EAAI,KAAO,EACpCM,EAAUb,EAAIc,WAAWP,EAAI,KAAO,EACvCC,EAAIG,KAAcL,GAAO,EAAK,IAC9BE,EAAIG,KAAmB,IAANL,GAGnB,OAAOE,CACT,EA5FApC,EAAQ2C,cAkHR,SAASA,cAAeC,GAQtB,IAPA,IAAIV,EACAM,EAAMI,EAAMC,OACZC,EAAaN,EAAM,EACnBO,EAAQ,GACRC,EAAiB,MAGZb,EAAI,EAAGc,EAAOT,EAAMM,EAAYX,EAAIc,EAAMd,GAAKa,EACtDD,EAAMG,KAAKC,YAAYP,EAAOT,EAAIA,EAAIa,EAAkBC,EAAOA,EAAQd,EAAIa,IAI1D,IAAfF,GACFZ,EAAMU,EAAMJ,EAAM,GAClBO,EAAMG,KACJE,EAAOlB,GAAO,GACdkB,EAAQlB,GAAO,EAAK,IACpB,OAEsB,IAAfY,IACTZ,GAAOU,EAAMJ,EAAM,IAAM,GAAKI,EAAMJ,EAAM,GAC1CO,EAAMG,KACJE,EAAOlB,GAAO,IACdkB,EAAQlB,GAAO,EAAK,IACpBkB,EAAQlB,GAAO,EAAK,IACpB,MAIJ,OAAOa,EAAMM,KAAK,GACpB,EA1IA,IALA,IAAID,EAAS,GACTX,EAAY,GACZJ,EAA4B,oBAAfiB,WAA6BA,WAAaC,MAEvDC,EAAO,mEACFrB,EAAI,EAAsBA,EAAbqB,KAAwBrB,EAC5CiB,EAAOjB,GAAKqB,EAAKrB,GACjBM,EAAUe,EAAKd,WAAWP,IAAMA,EAQlC,SAASL,QAASF,GAChB,IAAIY,EAAMZ,EAAIiB,OAEd,GAAIL,EAAM,EAAI,EACZ,MAAM,IAAIiB,MAAM,kDAKlB,IAAI1B,EAAWH,EAAIL,QAAQ,KAO3B,OANkB,IAAdQ,IAAiBA,EAAWS,GAMzB,CAACT,EAJcA,IAAaS,EAC/B,EACA,EAAKT,EAAW,EAGtB,CAmEA,SAASoB,YAAaP,EAAOc,EAAOC,GAGlC,IAFA,IAAIzB,EARoB0B,EASpBC,EAAS,GACJ1B,EAAIuB,EAAOvB,EAAIwB,EAAKxB,GAAK,EAChCD,GACIU,EAAMT,IAAM,GAAM,WAClBS,EAAMT,EAAI,IAAM,EAAK,QACP,IAAfS,EAAMT,EAAI,IACb0B,EAAOX,KAdFE,GADiBQ,EAeM1B,IAdT,GAAK,IACxBkB,EAAOQ,GAAO,GAAK,IACnBR,EAAOQ,GAAO,EAAI,IAClBR,EAAa,GAANQ,IAaT,OAAOC,EAAOR,KAAK,GACrB,CAlGAZ,EAAU,IAAIC,WAAW,IAAM,GAC/BD,EAAU,IAAIC,WAAW,IAAM,iCCT/B,MAAMoB,EAAS,EAAQ,OACjBC,EAAU,EAAQ,OAClBC,EACe,mBAAXC,QAAkD,mBAAlBA,OAAY,IAChDA,OAAY,IAAE,8BACd,KAENjE,EAAQkE,OAASA,OACjBlE,EAAQmE,WAyTR,SAASA,WAAYtB,IACdA,GAAUA,IACbA,EAAS,GAEX,OAAOqB,OAAOE,OAAOvB,EACvB,EA7TA7C,EAAQqE,kBAAoB,GAE5B,MAAMC,EAAe,WAwDrB,SAASC,aAAc1B,GACrB,GAAIA,EAASyB,EACX,MAAM,IAAIE,WAAW,cAAgB3B,EAAS,kCAGhD,MAAM4B,EAAM,IAAInB,WAAWT,GAE3B,OADA6B,OAAOC,eAAeF,EAAKP,OAAOU,WAC3BH,CACT,CAYA,SAASP,OAAQW,EAAKC,EAAkBjC,GAEtC,GAAmB,iBAARgC,EAAkB,CAC3B,GAAgC,iBAArBC,EACT,MAAM,IAAIC,UACR,sEAGJ,OAAOC,YAAYH,EACrB,CACA,OAAOI,KAAKJ,EAAKC,EAAkBjC,EACrC,CAIA,SAASoC,KAAMC,EAAOJ,EAAkBjC,GACtC,GAAqB,iBAAVqC,EACT,OAqHJ,SAASC,WAAYC,EAAQC,GACH,iBAAbA,GAAsC,KAAbA,IAClCA,EAAW,QAGb,IAAKnB,OAAOoB,WAAWD,GACrB,MAAM,IAAIN,UAAU,qBAAuBM,GAG7C,MAAMxC,EAAwC,EAA/BlB,WAAWyD,EAAQC,GAClC,IAAIZ,EAAMF,aAAa1B,GAEvB,MAAM0C,EAASd,EAAIe,MAAMJ,EAAQC,GAE7BE,IAAW1C,IAIb4B,EAAMA,EAAIgB,MAAM,EAAGF,IAGrB,OAAOd,CACT,CA3IWU,CAAWD,EAAOJ,GAG3B,GAAIY,YAAYC,OAAOT,GACrB,OAkJJ,SAASU,cAAeC,GACtB,GAAIC,WAAWD,EAAWvC,YAAa,CACrC,MAAMyC,EAAO,IAAIzC,WAAWuC,GAC5B,OAAOG,gBAAgBD,EAAKE,OAAQF,EAAKG,WAAYH,EAAKpE,WAC5D,CACA,OAAOwE,cAAcN,EACvB,CAxJWD,CAAcV,GAGvB,GAAa,MAATA,EACF,MAAM,IAAIH,UACR,yHACiDG,GAIrD,GAAIY,WAAWZ,EAAOQ,cACjBR,GAASY,WAAWZ,EAAMe,OAAQP,aACrC,OAAOM,gBAAgBd,EAAOJ,EAAkBjC,GAGlD,GAAiC,oBAAtBuD,oBACNN,WAAWZ,EAAOkB,oBAClBlB,GAASY,WAAWZ,EAAMe,OAAQG,oBACrC,OAAOJ,gBAAgBd,EAAOJ,EAAkBjC,GAGlD,GAAqB,iBAAVqC,EACT,MAAM,IAAIH,UACR,yEAIJ,MAAMsB,EAAUnB,EAAMmB,SAAWnB,EAAMmB,UACvC,GAAe,MAAXA,GAAmBA,IAAYnB,EACjC,OAAOhB,OAAOe,KAAKoB,EAASvB,EAAkBjC,GAGhD,MAAMyD,EAkJR,SAASC,WAAYC,GACnB,GAAItC,OAAOuC,SAASD,GAAM,CACxB,MAAMhE,EAA4B,EAAtBkE,QAAQF,EAAI3D,QAClB4B,EAAMF,aAAa/B,GAEzB,OAAmB,IAAfiC,EAAI5B,QAIR2D,EAAIT,KAAKtB,EAAK,EAAG,EAAGjC,GAHXiC,CAKX,CAEA,QAAmBkC,IAAfH,EAAI3D,OACN,MAA0B,iBAAf2D,EAAI3D,QAAuB+D,YAAYJ,EAAI3D,QAC7C0B,aAAa,GAEf4B,cAAcK,GAGvB,GAAiB,WAAbA,EAAIK,MAAqBtD,MAAMuD,QAAQN,EAAIO,MAC7C,OAAOZ,cAAcK,EAAIO,KAE7B,CAzKYR,CAAWrB,GACrB,GAAIoB,EAAG,OAAOA,EAEd,GAAsB,oBAAXrC,QAAgD,MAAtBA,OAAO+C,aACH,mBAA9B9B,EAAMjB,OAAO+C,aACtB,OAAO9C,OAAOe,KAAKC,EAAMjB,OAAO+C,aAAa,UAAWlC,EAAkBjC,GAG5E,MAAM,IAAIkC,UACR,yHACiDG,EAErD,CAmBA,SAAS+B,WAAYC,GACnB,GAAoB,iBAATA,EACT,MAAM,IAAInC,UAAU,0CACf,GAAImC,EAAO,EAChB,MAAM,IAAI1C,WAAW,cAAgB0C,EAAO,iCAEhD,CA0BA,SAASlC,YAAakC,GAEpB,OADAD,WAAWC,GACJ3C,aAAa2C,EAAO,EAAI,EAAoB,EAAhBR,QAAQQ,GAC7C,CAuCA,SAASf,cAAegB,GACtB,MAAMtE,EAASsE,EAAMtE,OAAS,EAAI,EAA4B,EAAxB6D,QAAQS,EAAMtE,QAC9C4B,EAAMF,aAAa1B,GACzB,IAAK,IAAIV,EAAI,EAAGA,EAAIU,EAAQV,GAAK,EAC/BsC,EAAItC,GAAgB,IAAXgF,EAAMhF,GAEjB,OAAOsC,CACT,CAUA,SAASuB,gBAAiBmB,EAAOjB,EAAYrD,GAC3C,GAAIqD,EAAa,GAAKiB,EAAMxF,WAAauE,EACvC,MAAM,IAAI1B,WAAW,wCAGvB,GAAI2C,EAAMxF,WAAauE,GAAcrD,GAAU,GAC7C,MAAM,IAAI2B,WAAW,wCAGvB,IAAIC,EAYJ,OAVEA,OADiBkC,IAAfT,QAAuCS,IAAX9D,EACxB,IAAIS,WAAW6D,QACDR,IAAX9D,EACH,IAAIS,WAAW6D,EAAOjB,GAEtB,IAAI5C,WAAW6D,EAAOjB,EAAYrD,GAI1C6B,OAAOC,eAAeF,EAAKP,OAAOU,WAE3BH,CACT,CA2BA,SAASiC,QAAS7D,GAGhB,GAAIA,GAAUyB,EACZ,MAAM,IAAIE,WAAW,0DACaF,EAAa8C,SAAS,IAAM,UAEhE,OAAgB,EAATvE,CACT,CAsGA,SAASlB,WAAYyD,EAAQC,GAC3B,GAAInB,OAAOuC,SAASrB,GAClB,OAAOA,EAAOvC,OAEhB,GAAI6C,YAAYC,OAAOP,IAAWU,WAAWV,EAAQM,aACnD,OAAON,EAAOzD,WAEhB,GAAsB,iBAAXyD,EACT,MAAM,IAAIL,UACR,kGAC0BK,GAI9B,MAAM5C,EAAM4C,EAAOvC,OACbwE,EAAaC,UAAUzE,OAAS,IAAsB,IAAjByE,UAAU,GACrD,IAAKD,GAAqB,IAAR7E,EAAW,OAAO,EAGpC,IAAI+E,GAAc,EAClB,OACE,OAAQlC,GACN,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAO7C,EACT,IAAK,OACL,IAAK,QACH,OAAOgF,YAAYpC,GAAQvC,OAC7B,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAa,EAANL,EACT,IAAK,MACH,OAAOA,IAAQ,EACjB,IAAK,SACH,OAAOiF,cAAcrC,GAAQvC,OAC/B,QACE,GAAI0E,EACF,OAAOF,GAAa,EAAIG,YAAYpC,GAAQvC,OAE9CwC,GAAY,GAAKA,GAAUqC,cAC3BH,GAAc,EAGtB,CAGA,SAASI,aAActC,EAAU3B,EAAOC,GACtC,IAAI4D,GAAc,EAclB,SALcZ,IAAVjD,GAAuBA,EAAQ,KACjCA,EAAQ,GAINA,EAAQtD,KAAKyC,OACf,MAAO,GAOT,SAJY8D,IAARhD,GAAqBA,EAAMvD,KAAKyC,UAClCc,EAAMvD,KAAKyC,QAGTc,GAAO,EACT,MAAO,GAOT,IAHAA,KAAS,KACTD,KAAW,GAGT,MAAO,GAKT,IAFK2B,IAAUA,EAAW,UAGxB,OAAQA,GACN,IAAK,MACH,OAAOuC,SAASxH,KAAMsD,EAAOC,GAE/B,IAAK,OACL,IAAK,QACH,OAAOkE,UAAUzH,KAAMsD,EAAOC,GAEhC,IAAK,QACH,OAAOmE,WAAW1H,KAAMsD,EAAOC,GAEjC,IAAK,SACL,IAAK,SACH,OAAOoE,YAAY3H,KAAMsD,EAAOC,GAElC,IAAK,SACH,OAAOqE,YAAY5H,KAAMsD,EAAOC,GAElC,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOsE,aAAa7H,KAAMsD,EAAOC,GAEnC,QACE,GAAI4D,EAAa,MAAM,IAAIxC,UAAU,qBAAuBM,GAC5DA,GAAYA,EAAW,IAAIqC,cAC3BH,GAAc,EAGtB,CAUA,SAASW,KAAM5B,EAAG6B,EAAGC,GACnB,MAAMjG,EAAImE,EAAE6B,GACZ7B,EAAE6B,GAAK7B,EAAE8B,GACT9B,EAAE8B,GAAKjG,CACT,CA2IA,SAASkG,qBAAsBpC,EAAQqC,EAAKpC,EAAYb,EAAUkD,GAEhE,GAAsB,IAAlBtC,EAAOpD,OAAc,OAAQ,EAmBjC,GAhB0B,iBAAfqD,GACTb,EAAWa,EACXA,EAAa,GACJA,EAAa,WACtBA,EAAa,WACJA,GAAc,aACvBA,GAAc,YAGZU,YADJV,GAAcA,KAGZA,EAAaqC,EAAM,EAAKtC,EAAOpD,OAAS,GAItCqD,EAAa,IAAGA,EAAaD,EAAOpD,OAASqD,GAC7CA,GAAcD,EAAOpD,OAAQ,CAC/B,GAAI0F,EAAK,OAAQ,EACZrC,EAAaD,EAAOpD,OAAS,CACpC,MAAO,GAAIqD,EAAa,EAAG,CACzB,IAAIqC,EACC,OAAQ,EADJrC,EAAa,CAExB,CAQA,GALmB,iBAARoC,IACTA,EAAMpE,OAAOe,KAAKqD,EAAKjD,IAIrBnB,OAAOuC,SAAS6B,GAElB,OAAmB,IAAfA,EAAIzF,QACE,EAEH2F,aAAavC,EAAQqC,EAAKpC,EAAYb,EAAUkD,GAClD,GAAmB,iBAARD,EAEhB,OADAA,GAAY,IACgC,mBAAjChF,WAAWsB,UAAUrD,QAC1BgH,EACKjF,WAAWsB,UAAUrD,QAAQkH,KAAKxC,EAAQqC,EAAKpC,GAE/C5C,WAAWsB,UAAU8D,YAAYD,KAAKxC,EAAQqC,EAAKpC,GAGvDsC,aAAavC,EAAQ,CAACqC,GAAMpC,EAAYb,EAAUkD,GAG3D,MAAM,IAAIxD,UAAU,uCACtB,CAEA,SAASyD,aAAcpG,EAAKkG,EAAKpC,EAAYb,EAAUkD,GACrD,IA0BIpG,EA1BAwG,EAAY,EACZC,EAAYxG,EAAIS,OAChBgG,EAAYP,EAAIzF,OAEpB,QAAiB8D,IAAbtB,IAEe,UADjBA,EAAWlE,OAAOkE,GAAUqC,gBACY,UAAbrC,GACV,YAAbA,GAAuC,aAAbA,GAAyB,CACrD,GAAIjD,EAAIS,OAAS,GAAKyF,EAAIzF,OAAS,EACjC,OAAQ,EAEV8F,EAAY,EACZC,GAAa,EACbC,GAAa,EACb3C,GAAc,CAChB,CAGF,SAAS4C,KAAMrE,EAAKtC,GAClB,OAAkB,IAAdwG,EACKlE,EAAItC,GAEJsC,EAAIsE,aAAa5G,EAAIwG,EAEhC,CAGA,GAAIJ,EAAK,CACP,IAAIS,GAAc,EAClB,IAAK7G,EAAI+D,EAAY/D,EAAIyG,EAAWzG,IAClC,GAAI2G,KAAK1G,EAAKD,KAAO2G,KAAKR,GAAqB,IAAhBU,EAAoB,EAAI7G,EAAI6G,IAEzD,IADoB,IAAhBA,IAAmBA,EAAa7G,GAChCA,EAAI6G,EAAa,IAAMH,EAAW,OAAOG,EAAaL,OAEtC,IAAhBK,IAAmB7G,GAAKA,EAAI6G,GAChCA,GAAc,CAGpB,MAEE,IADI9C,EAAa2C,EAAYD,IAAW1C,EAAa0C,EAAYC,GAC5D1G,EAAI+D,EAAY/D,GAAK,EAAGA,IAAK,CAChC,IAAI8G,GAAQ,EACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAWK,IAC7B,GAAIJ,KAAK1G,EAAKD,EAAI+G,KAAOJ,KAAKR,EAAKY,GAAI,CACrCD,GAAQ,EACR,KACF,CAEF,GAAIA,EAAO,OAAO9G,CACpB,CAGF,OAAQ,CACV,CAcA,SAASgH,SAAU1E,EAAKW,EAAQgE,EAAQvG,GACtCuG,EAASC,OAAOD,IAAW,EAC3B,MAAME,EAAY7E,EAAI5B,OAASuG,EAC1BvG,GAGHA,EAASwG,OAAOxG,IACHyG,IACXzG,EAASyG,GAJXzG,EAASyG,EAQX,MAAMC,EAASnE,EAAOvC,OAKtB,IAAIV,EACJ,IAJIU,EAAS0G,EAAS,IACpB1G,EAAS0G,EAAS,GAGfpH,EAAI,EAAGA,EAAIU,IAAUV,EAAG,CAC3B,MAAMqH,EAASC,SAASrE,EAAOsE,OAAW,EAAJvH,EAAO,GAAI,IACjD,GAAIyE,YAAY4C,GAAS,OAAOrH,EAChCsC,EAAI2E,EAASjH,GAAKqH,CACpB,CACA,OAAOrH,CACT,CAEA,SAASwH,UAAWlF,EAAKW,EAAQgE,EAAQvG,GACvC,OAAO+G,WAAWpC,YAAYpC,EAAQX,EAAI5B,OAASuG,GAAS3E,EAAK2E,EAAQvG,EAC3E,CAEA,SAASgH,WAAYpF,EAAKW,EAAQgE,EAAQvG,GACxC,OAAO+G,WAypCT,SAASE,aAAc/I,GACrB,MAAMgJ,EAAY,GAClB,IAAK,IAAI5H,EAAI,EAAGA,EAAIpB,EAAI8B,SAAUV,EAEhC4H,EAAU7G,KAAyB,IAApBnC,EAAI2B,WAAWP,IAEhC,OAAO4H,CACT,CAhqCoBD,CAAa1E,GAASX,EAAK2E,EAAQvG,EACvD,CAEA,SAASmH,YAAavF,EAAKW,EAAQgE,EAAQvG,GACzC,OAAO+G,WAAWnC,cAAcrC,GAASX,EAAK2E,EAAQvG,EACxD,CAEA,SAASoH,UAAWxF,EAAKW,EAAQgE,EAAQvG,GACvC,OAAO+G,WA0pCT,SAASM,eAAgBnJ,EAAKoJ,GAC5B,IAAIC,EAAGC,EAAIC,EACX,MAAMP,EAAY,GAClB,IAAK,IAAI5H,EAAI,EAAGA,EAAIpB,EAAI8B,WACjBsH,GAAS,GAAK,KADahI,EAGhCiI,EAAIrJ,EAAI2B,WAAWP,GACnBkI,EAAKD,GAAK,EACVE,EAAKF,EAAI,IACTL,EAAU7G,KAAKoH,GACfP,EAAU7G,KAAKmH,GAGjB,OAAON,CACT,CAxqCoBG,CAAe9E,EAAQX,EAAI5B,OAASuG,GAAS3E,EAAK2E,EAAQvG,EAC9E,CA8EA,SAASmF,YAAavD,EAAKf,EAAOC,GAChC,OAAc,IAAVD,GAAeC,IAAQc,EAAI5B,OACtBiB,EAAOnB,cAAc8B,GAErBX,EAAOnB,cAAc8B,EAAIgB,MAAM/B,EAAOC,GAEjD,CAEA,SAASkE,UAAWpD,EAAKf,EAAOC,GAC9BA,EAAM4G,KAAKC,IAAI/F,EAAI5B,OAAQc,GAC3B,MAAM8G,EAAM,GAEZ,IAAItI,EAAIuB,EACR,KAAOvB,EAAIwB,GAAK,CACd,MAAM+G,EAAYjG,EAAItC,GACtB,IAAIwI,EAAY,KACZC,EAAoBF,EAAY,IAChC,EACCA,EAAY,IACT,EACCA,EAAY,IACT,EACA,EAEZ,GAAIvI,EAAIyI,GAAoBjH,EAAK,CAC/B,IAAIkH,EAAYC,EAAWC,EAAYC,EAEvC,OAAQJ,GACN,KAAK,EACCF,EAAY,MACdC,EAAYD,GAEd,MACF,KAAK,EACHG,EAAapG,EAAItC,EAAI,GACO,MAAV,IAAb0I,KACHG,GAA6B,GAAZN,IAAqB,EAAoB,GAAbG,EACzCG,EAAgB,MAClBL,EAAYK,IAGhB,MACF,KAAK,EACHH,EAAapG,EAAItC,EAAI,GACrB2I,EAAYrG,EAAItC,EAAI,GACQ,MAAV,IAAb0I,IAAsD,MAAV,IAAZC,KACnCE,GAA6B,GAAZN,IAAoB,IAAoB,GAAbG,IAAsB,EAAmB,GAAZC,EACrEE,EAAgB,OAAUA,EAAgB,OAAUA,EAAgB,SACtEL,EAAYK,IAGhB,MACF,KAAK,EACHH,EAAapG,EAAItC,EAAI,GACrB2I,EAAYrG,EAAItC,EAAI,GACpB4I,EAAatG,EAAItC,EAAI,GACO,MAAV,IAAb0I,IAAsD,MAAV,IAAZC,IAAsD,MAAV,IAAbC,KAClEC,GAA6B,GAAZN,IAAoB,IAAqB,GAAbG,IAAsB,IAAmB,GAAZC,IAAqB,EAAoB,GAAbC,EAClGC,EAAgB,OAAUA,EAAgB,UAC5CL,EAAYK,IAItB,CAEkB,OAAdL,GAGFA,EAAY,MACZC,EAAmB,GACVD,EAAY,QAErBA,GAAa,MACbF,EAAIvH,KAAKyH,IAAc,GAAK,KAAQ,OACpCA,EAAY,MAAqB,KAAZA,GAGvBF,EAAIvH,KAAKyH,GACTxI,GAAKyI,CACP,CAEA,OAQF,SAASK,sBAAuBC,GAC9B,MAAM1I,EAAM0I,EAAWrI,OACvB,GAAIL,GAAO2I,EACT,OAAOhK,OAAOC,aAAagK,MAAMjK,OAAQ+J,GAI3C,IAAIT,EAAM,GACNtI,EAAI,EACR,KAAOA,EAAIK,GACTiI,GAAOtJ,OAAOC,aAAagK,MACzBjK,OACA+J,EAAWzF,MAAMtD,EAAGA,GAAKgJ,IAG7B,OAAOV,CACT,CAxBSQ,CAAsBR,EAC/B,CA3+BAzK,EAAQqL,WAAa/G,EAgBrBJ,OAAOoH,oBAUP,SAASC,oBAEP,IACE,MAAMnJ,EAAM,IAAIkB,WAAW,GACrBkI,EAAQ,CAAEC,IAAK,WAAc,OAAO,EAAG,GAG7C,OAFA/G,OAAOC,eAAe6G,EAAOlI,WAAWsB,WACxCF,OAAOC,eAAevC,EAAKoJ,GACN,KAAdpJ,EAAIqJ,KACb,CAAE,MAAOC,GACP,OAAO,CACT,CACF,CArB6BH,GAExBrH,OAAOoH,qBAA0C,oBAAZK,SACb,mBAAlBA,QAAQC,OACjBD,QAAQC,MACN,iJAkBJlH,OAAOmH,eAAe3H,OAAOU,UAAW,SAAU,CAChDkH,YAAY,EACZC,IAAK,WACH,GAAK7H,OAAOuC,SAASrG,MACrB,OAAOA,KAAK6F,MACd,IAGFvB,OAAOmH,eAAe3H,OAAOU,UAAW,SAAU,CAChDkH,YAAY,EACZC,IAAK,WACH,GAAK7H,OAAOuC,SAASrG,MACrB,OAAOA,KAAK8F,UACd,IAoCFhC,OAAO8H,SAAW,KA8DlB9H,OAAOe,KAAO,SAAUC,EAAOJ,EAAkBjC,GAC/C,OAAOoC,KAAKC,EAAOJ,EAAkBjC,EACvC,EAIA6B,OAAOC,eAAeT,OAAOU,UAAWtB,WAAWsB,WACnDF,OAAOC,eAAeT,OAAQZ,YA8B9BY,OAAOE,MAAQ,SAAU8C,EAAM+E,EAAM5G,GACnC,OArBF,SAASjB,MAAO8C,EAAM+E,EAAM5G,GAE1B,OADA4B,WAAWC,GACPA,GAAQ,EACH3C,aAAa2C,QAETP,IAATsF,EAIyB,iBAAb5G,EACVd,aAAa2C,GAAM+E,KAAKA,EAAM5G,GAC9Bd,aAAa2C,GAAM+E,KAAKA,GAEvB1H,aAAa2C,EACtB,CAOS9C,CAAM8C,EAAM+E,EAAM5G,EAC3B,EAUAnB,OAAOc,YAAc,SAAUkC,GAC7B,OAAOlC,YAAYkC,EACrB,EAIAhD,OAAOgI,gBAAkB,SAAUhF,GACjC,OAAOlC,YAAYkC,EACrB,EA6GAhD,OAAOuC,SAAW,SAASA,SAAUH,GACnC,OAAY,MAALA,IAA6B,IAAhBA,EAAE6F,WACpB7F,IAAMpC,OAAOU,SACjB,EAEAV,OAAOkI,QAAU,SAASA,QAASC,EAAG/F,GAGpC,GAFIR,WAAWuG,EAAG/I,cAAa+I,EAAInI,OAAOe,KAAKoH,EAAGA,EAAEjD,OAAQiD,EAAE1K,aAC1DmE,WAAWQ,EAAGhD,cAAagD,EAAIpC,OAAOe,KAAKqB,EAAGA,EAAE8C,OAAQ9C,EAAE3E,cACzDuC,OAAOuC,SAAS4F,KAAOnI,OAAOuC,SAASH,GAC1C,MAAM,IAAIvB,UACR,yEAIJ,GAAIsH,IAAM/F,EAAG,OAAO,EAEpB,IAAIgG,EAAID,EAAExJ,OACN0J,EAAIjG,EAAEzD,OAEV,IAAK,IAAIV,EAAI,EAAGK,EAAM+H,KAAKC,IAAI8B,EAAGC,GAAIpK,EAAIK,IAAOL,EAC/C,GAAIkK,EAAElK,KAAOmE,EAAEnE,GAAI,CACjBmK,EAAID,EAAElK,GACNoK,EAAIjG,EAAEnE,GACN,KACF,CAGF,OAAImK,EAAIC,GAAW,EACfA,EAAID,EAAU,EACX,CACT,EAEApI,OAAOoB,WAAa,SAASA,WAAYD,GACvC,OAAQlE,OAAOkE,GAAUqC,eACvB,IAAK,MACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAO,EACT,QACE,OAAO,EAEb,EAEAxD,OAAOsI,OAAS,SAASA,OAAQC,EAAM5J,GACrC,IAAKU,MAAMuD,QAAQ2F,GACjB,MAAM,IAAI1H,UAAU,+CAGtB,GAAoB,IAAhB0H,EAAK5J,OACP,OAAOqB,OAAOE,MAAM,GAGtB,IAAIjC,EACJ,QAAewE,IAAX9D,EAEF,IADAA,EAAS,EACJV,EAAI,EAAGA,EAAIsK,EAAK5J,SAAUV,EAC7BU,GAAU4J,EAAKtK,GAAGU,OAItB,MAAMoD,EAAS/B,OAAOc,YAAYnC,GAClC,IAAI6J,EAAM,EACV,IAAKvK,EAAI,EAAGA,EAAIsK,EAAK5J,SAAUV,EAAG,CAChC,IAAIsC,EAAMgI,EAAKtK,GACf,GAAI2D,WAAWrB,EAAKnB,YACdoJ,EAAMjI,EAAI5B,OAASoD,EAAOpD,QACvBqB,OAAOuC,SAAShC,KAAMA,EAAMP,OAAOe,KAAKR,IAC7CA,EAAIsB,KAAKE,EAAQyG,IAEjBpJ,WAAWsB,UAAU+H,IAAIlE,KACvBxC,EACAxB,EACAiI,OAGC,KAAKxI,OAAOuC,SAAShC,GAC1B,MAAM,IAAIM,UAAU,+CAEpBN,EAAIsB,KAAKE,EAAQyG,EACnB,CACAA,GAAOjI,EAAI5B,MACb,CACA,OAAOoD,CACT,EAiDA/B,OAAOvC,WAAaA,WA8EpBuC,OAAOU,UAAUuH,WAAY,EAQ7BjI,OAAOU,UAAUgI,OAAS,SAASA,SACjC,MAAMpK,EAAMpC,KAAKyC,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAIgC,WAAW,6CAEvB,IAAK,IAAIrC,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B+F,KAAK9H,KAAM+B,EAAGA,EAAI,GAEpB,OAAO/B,IACT,EAEA8D,OAAOU,UAAUiI,OAAS,SAASA,SACjC,MAAMrK,EAAMpC,KAAKyC,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAIgC,WAAW,6CAEvB,IAAK,IAAIrC,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B+F,KAAK9H,KAAM+B,EAAGA,EAAI,GAClB+F,KAAK9H,KAAM+B,EAAI,EAAGA,EAAI,GAExB,OAAO/B,IACT,EAEA8D,OAAOU,UAAUkI,OAAS,SAASA,SACjC,MAAMtK,EAAMpC,KAAKyC,OACjB,GAAIL,EAAM,GAAM,EACd,MAAM,IAAIgC,WAAW,6CAEvB,IAAK,IAAIrC,EAAI,EAAGA,EAAIK,EAAKL,GAAK,EAC5B+F,KAAK9H,KAAM+B,EAAGA,EAAI,GAClB+F,KAAK9H,KAAM+B,EAAI,EAAGA,EAAI,GACtB+F,KAAK9H,KAAM+B,EAAI,EAAGA,EAAI,GACtB+F,KAAK9H,KAAM+B,EAAI,EAAGA,EAAI,GAExB,OAAO/B,IACT,EAEA8D,OAAOU,UAAUwC,SAAW,SAASA,WACnC,MAAMvE,EAASzC,KAAKyC,OACpB,OAAe,IAAXA,EAAqB,GACA,IAArByE,UAAUzE,OAAqBgF,UAAUzH,KAAM,EAAGyC,GAC/C8E,aAAayD,MAAMhL,KAAMkH,UAClC,EAEApD,OAAOU,UAAUmI,eAAiB7I,OAAOU,UAAUwC,SAEnDlD,OAAOU,UAAUoI,OAAS,SAASA,OAAQ1G,GACzC,IAAKpC,OAAOuC,SAASH,GAAI,MAAM,IAAIvB,UAAU,6BAC7C,OAAI3E,OAASkG,GACsB,IAA5BpC,OAAOkI,QAAQhM,KAAMkG,EAC9B,EAEApC,OAAOU,UAAUqI,QAAU,SAASA,UAClC,IAAIlM,EAAM,GACV,MAAMmM,EAAMlN,EAAQqE,kBAGpB,OAFAtD,EAAMX,KAAKgH,SAAS,MAAO,EAAG8F,GAAKlM,QAAQ,UAAW,OAAOK,OACzDjB,KAAKyC,OAASqK,IAAKnM,GAAO,SACvB,WAAaA,EAAM,GAC5B,EACIiD,IACFE,OAAOU,UAAUZ,GAAuBE,OAAOU,UAAUqI,SAG3D/I,OAAOU,UAAUwH,QAAU,SAASA,QAASe,EAAQzJ,EAAOC,EAAKyJ,EAAWC,GAI1E,GAHIvH,WAAWqH,EAAQ7J,cACrB6J,EAASjJ,OAAOe,KAAKkI,EAAQA,EAAO/D,OAAQ+D,EAAOxL,cAEhDuC,OAAOuC,SAAS0G,GACnB,MAAM,IAAIpI,UACR,wFAC2BoI,GAiB/B,QAbcxG,IAAVjD,IACFA,EAAQ,QAEEiD,IAARhD,IACFA,EAAMwJ,EAASA,EAAOtK,OAAS,QAEf8D,IAAdyG,IACFA,EAAY,QAEEzG,IAAZ0G,IACFA,EAAUjN,KAAKyC,QAGba,EAAQ,GAAKC,EAAMwJ,EAAOtK,QAAUuK,EAAY,GAAKC,EAAUjN,KAAKyC,OACtE,MAAM,IAAI2B,WAAW,sBAGvB,GAAI4I,GAAaC,GAAW3J,GAASC,EACnC,OAAO,EAET,GAAIyJ,GAAaC,EACf,OAAQ,EAEV,GAAI3J,GAASC,EACX,OAAO,EAQT,GAAIvD,OAAS+M,EAAQ,OAAO,EAE5B,IAAIb,GAJJe,KAAa,IADbD,KAAe,GAMXb,GAPJ5I,KAAS,IADTD,KAAW,GASX,MAAMlB,EAAM+H,KAAKC,IAAI8B,EAAGC,GAElBe,EAAWlN,KAAKqF,MAAM2H,EAAWC,GACjCE,EAAaJ,EAAO1H,MAAM/B,EAAOC,GAEvC,IAAK,IAAIxB,EAAI,EAAGA,EAAIK,IAAOL,EACzB,GAAImL,EAASnL,KAAOoL,EAAWpL,GAAI,CACjCmK,EAAIgB,EAASnL,GACboK,EAAIgB,EAAWpL,GACf,KACF,CAGF,OAAImK,EAAIC,GAAW,EACfA,EAAID,EAAU,EACX,CACT,EA2HApI,OAAOU,UAAU4I,SAAW,SAASA,SAAUlF,EAAKpC,EAAYb,GAC9D,OAAoD,IAA7CjF,KAAKmB,QAAQ+G,EAAKpC,EAAYb,EACvC,EAEAnB,OAAOU,UAAUrD,QAAU,SAASA,QAAS+G,EAAKpC,EAAYb,GAC5D,OAAOgD,qBAAqBjI,KAAMkI,EAAKpC,EAAYb,GAAU,EAC/D,EAEAnB,OAAOU,UAAU8D,YAAc,SAASA,YAAaJ,EAAKpC,EAAYb,GACpE,OAAOgD,qBAAqBjI,KAAMkI,EAAKpC,EAAYb,GAAU,EAC/D,EA4CAnB,OAAOU,UAAUY,MAAQ,SAASA,MAAOJ,EAAQgE,EAAQvG,EAAQwC,GAE/D,QAAesB,IAAXyC,EACF/D,EAAW,OACXxC,EAASzC,KAAKyC,OACduG,EAAS,OAEJ,QAAezC,IAAX9D,GAA0C,iBAAXuG,EACxC/D,EAAW+D,EACXvG,EAASzC,KAAKyC,OACduG,EAAS,MAEJ,KAAIqE,SAASrE,GAUlB,MAAM,IAAI3F,MACR,2EAVF2F,KAAoB,EAChBqE,SAAS5K,IACXA,KAAoB,OACH8D,IAAbtB,IAAwBA,EAAW,UAEvCA,EAAWxC,EACXA,OAAS8D,EAMb,CAEA,MAAM2C,EAAYlJ,KAAKyC,OAASuG,EAGhC,SAFezC,IAAX9D,GAAwBA,EAASyG,KAAWzG,EAASyG,GAEpDlE,EAAOvC,OAAS,IAAMA,EAAS,GAAKuG,EAAS,IAAOA,EAAShJ,KAAKyC,OACrE,MAAM,IAAI2B,WAAW,0CAGlBa,IAAUA,EAAW,QAE1B,IAAIkC,GAAc,EAClB,OACE,OAAQlC,GACN,IAAK,MACH,OAAO8D,SAAS/I,KAAMgF,EAAQgE,EAAQvG,GAExC,IAAK,OACL,IAAK,QACH,OAAO8G,UAAUvJ,KAAMgF,EAAQgE,EAAQvG,GAEzC,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAOgH,WAAWzJ,KAAMgF,EAAQgE,EAAQvG,GAE1C,IAAK,SAEH,OAAOmH,YAAY5J,KAAMgF,EAAQgE,EAAQvG,GAE3C,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOoH,UAAU7J,KAAMgF,EAAQgE,EAAQvG,GAEzC,QACE,GAAI0E,EAAa,MAAM,IAAIxC,UAAU,qBAAuBM,GAC5DA,GAAY,GAAKA,GAAUqC,cAC3BH,GAAc,EAGtB,EAEArD,OAAOU,UAAU8I,OAAS,SAASA,SACjC,MAAO,CACL7G,KAAM,SACNE,KAAMxD,MAAMqB,UAAUa,MAAMgD,KAAKrI,KAAKuN,MAAQvN,KAAM,GAExD,EAyFA,MAAM+K,EAAuB,KAoB7B,SAASrD,WAAYrD,EAAKf,EAAOC,GAC/B,IAAIiK,EAAM,GACVjK,EAAM4G,KAAKC,IAAI/F,EAAI5B,OAAQc,GAE3B,IAAK,IAAIxB,EAAIuB,EAAOvB,EAAIwB,IAAOxB,EAC7ByL,GAAOzM,OAAOC,aAAsB,IAATqD,EAAItC,IAEjC,OAAOyL,CACT,CAEA,SAAS7F,YAAatD,EAAKf,EAAOC,GAChC,IAAIiK,EAAM,GACVjK,EAAM4G,KAAKC,IAAI/F,EAAI5B,OAAQc,GAE3B,IAAK,IAAIxB,EAAIuB,EAAOvB,EAAIwB,IAAOxB,EAC7ByL,GAAOzM,OAAOC,aAAaqD,EAAItC,IAEjC,OAAOyL,CACT,CAEA,SAAShG,SAAUnD,EAAKf,EAAOC,GAC7B,MAAMnB,EAAMiC,EAAI5B,SAEXa,GAASA,EAAQ,KAAGA,EAAQ,KAC5BC,GAAOA,EAAM,GAAKA,EAAMnB,KAAKmB,EAAMnB,GAExC,IAAIqL,EAAM,GACV,IAAK,IAAI1L,EAAIuB,EAAOvB,EAAIwB,IAAOxB,EAC7B0L,GAAOC,EAAoBrJ,EAAItC,IAEjC,OAAO0L,CACT,CAEA,SAAS5F,aAAcxD,EAAKf,EAAOC,GACjC,MAAMoK,EAAQtJ,EAAIgB,MAAM/B,EAAOC,GAC/B,IAAI8G,EAAM,GAEV,IAAK,IAAItI,EAAI,EAAGA,EAAI4L,EAAMlL,OAAS,EAAGV,GAAK,EACzCsI,GAAOtJ,OAAOC,aAAa2M,EAAM5L,GAAqB,IAAf4L,EAAM5L,EAAI,IAEnD,OAAOsI,CACT,CAiCA,SAASuD,YAAa5E,EAAQ6E,EAAKpL,GACjC,GAAKuG,EAAS,GAAO,GAAKA,EAAS,EAAG,MAAM,IAAI5E,WAAW,sBAC3D,GAAI4E,EAAS6E,EAAMpL,EAAQ,MAAM,IAAI2B,WAAW,wCAClD,CAyQA,SAAS0J,SAAUzJ,EAAKS,EAAOkE,EAAQ6E,EAAKf,EAAK1C,GAC/C,IAAKtG,OAAOuC,SAAShC,GAAM,MAAM,IAAIM,UAAU,+CAC/C,GAAIG,EAAQgI,GAAOhI,EAAQsF,EAAK,MAAM,IAAIhG,WAAW,qCACrD,GAAI4E,EAAS6E,EAAMxJ,EAAI5B,OAAQ,MAAM,IAAI2B,WAAW,qBACtD,CA+FA,SAAS2J,eAAgB1J,EAAKS,EAAOkE,EAAQoB,EAAK0C,GAChDkB,WAAWlJ,EAAOsF,EAAK0C,EAAKzI,EAAK2E,EAAQ,GAEzC,IAAIkB,EAAKjB,OAAOnE,EAAQmJ,OAAO,aAC/B5J,EAAI2E,KAAYkB,EAChBA,IAAW,EACX7F,EAAI2E,KAAYkB,EAChBA,IAAW,EACX7F,EAAI2E,KAAYkB,EAChBA,IAAW,EACX7F,EAAI2E,KAAYkB,EAChB,IAAID,EAAKhB,OAAOnE,GAASmJ,OAAO,IAAMA,OAAO,aAQ7C,OAPA5J,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EAChBA,IAAW,EACX5F,EAAI2E,KAAYiB,EACTjB,CACT,CAEA,SAASkF,eAAgB7J,EAAKS,EAAOkE,EAAQoB,EAAK0C,GAChDkB,WAAWlJ,EAAOsF,EAAK0C,EAAKzI,EAAK2E,EAAQ,GAEzC,IAAIkB,EAAKjB,OAAOnE,EAAQmJ,OAAO,aAC/B5J,EAAI2E,EAAS,GAAKkB,EAClBA,IAAW,EACX7F,EAAI2E,EAAS,GAAKkB,EAClBA,IAAW,EACX7F,EAAI2E,EAAS,GAAKkB,EAClBA,IAAW,EACX7F,EAAI2E,EAAS,GAAKkB,EAClB,IAAID,EAAKhB,OAAOnE,GAASmJ,OAAO,IAAMA,OAAO,aAQ7C,OAPA5J,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,EAAS,GAAKiB,EAClBA,IAAW,EACX5F,EAAI2E,GAAUiB,EACPjB,EAAS,CAClB,CAkHA,SAASmF,aAAc9J,EAAKS,EAAOkE,EAAQ6E,EAAKf,EAAK1C,GACnD,GAAIpB,EAAS6E,EAAMxJ,EAAI5B,OAAQ,MAAM,IAAI2B,WAAW,sBACpD,GAAI4E,EAAS,EAAG,MAAM,IAAI5E,WAAW,qBACvC,CAEA,SAASgK,WAAY/J,EAAKS,EAAOkE,EAAQqF,EAAcC,GAOrD,OANAxJ,GAASA,EACTkE,KAAoB,EACfsF,GACHH,aAAa9J,EAAKS,EAAOkE,EAAQ,GAEnCrF,EAAQyB,MAAMf,EAAKS,EAAOkE,EAAQqF,EAAc,GAAI,GAC7CrF,EAAS,CAClB,CAUA,SAASuF,YAAalK,EAAKS,EAAOkE,EAAQqF,EAAcC,GAOtD,OANAxJ,GAASA,EACTkE,KAAoB,EACfsF,GACHH,aAAa9J,EAAKS,EAAOkE,EAAQ,GAEnCrF,EAAQyB,MAAMf,EAAKS,EAAOkE,EAAQqF,EAAc,GAAI,GAC7CrF,EAAS,CAClB,CAzkBAlF,OAAOU,UAAUa,MAAQ,SAASA,MAAO/B,EAAOC,GAC9C,MAAMnB,EAAMpC,KAAKyC,QACjBa,IAAUA,GAGE,GACVA,GAASlB,GACG,IAAGkB,EAAQ,GACdA,EAAQlB,IACjBkB,EAAQlB,IANVmB,OAAcgD,IAARhD,EAAoBnB,IAAQmB,GASxB,GACRA,GAAOnB,GACG,IAAGmB,EAAM,GACVA,EAAMnB,IACfmB,EAAMnB,GAGJmB,EAAMD,IAAOC,EAAMD,GAEvB,MAAMkL,EAASxO,KAAKyO,SAASnL,EAAOC,GAIpC,OAFAe,OAAOC,eAAeiK,EAAQ1K,OAAOU,WAE9BgK,CACT,EAUA1K,OAAOU,UAAUkK,WACjB5K,OAAOU,UAAUmK,WAAa,SAASA,WAAY3F,EAAQzH,EAAY+M,GACrEtF,KAAoB,EACpBzH,KAA4B,EACvB+M,GAAUV,YAAY5E,EAAQzH,EAAYvB,KAAKyC,QAEpD,IAAIyF,EAAMlI,KAAKgJ,GACX4F,EAAM,EACN7M,EAAI,EACR,OAASA,EAAIR,IAAeqN,GAAO,MACjC1G,GAAOlI,KAAKgJ,EAASjH,GAAK6M,EAG5B,OAAO1G,CACT,EAEApE,OAAOU,UAAUqK,WACjB/K,OAAOU,UAAUsK,WAAa,SAASA,WAAY9F,EAAQzH,EAAY+M,GACrEtF,KAAoB,EACpBzH,KAA4B,EACvB+M,GACHV,YAAY5E,EAAQzH,EAAYvB,KAAKyC,QAGvC,IAAIyF,EAAMlI,KAAKgJ,IAAWzH,GACtBqN,EAAM,EACV,KAAOrN,EAAa,IAAMqN,GAAO,MAC/B1G,GAAOlI,KAAKgJ,IAAWzH,GAAcqN,EAGvC,OAAO1G,CACT,EAEApE,OAAOU,UAAUuK,UACjBjL,OAAOU,UAAUwK,UAAY,SAASA,UAAWhG,EAAQsF,GAGvD,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCzC,KAAKgJ,EACd,EAEAlF,OAAOU,UAAUyK,aACjBnL,OAAOU,UAAU0K,aAAe,SAASA,aAAclG,EAAQsF,GAG7D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCzC,KAAKgJ,GAAWhJ,KAAKgJ,EAAS,IAAM,CAC7C,EAEAlF,OAAOU,UAAU2K,aACjBrL,OAAOU,UAAUmE,aAAe,SAASA,aAAcK,EAAQsF,GAG7D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACnCzC,KAAKgJ,IAAW,EAAKhJ,KAAKgJ,EAAS,EAC7C,EAEAlF,OAAOU,UAAU4K,aACjBtL,OAAOU,UAAU6K,aAAe,SAASA,aAAcrG,EAAQsF,GAI7D,OAHAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,SAElCzC,KAAKgJ,GACThJ,KAAKgJ,EAAS,IAAM,EACpBhJ,KAAKgJ,EAAS,IAAM,IACD,SAAnBhJ,KAAKgJ,EAAS,EACrB,EAEAlF,OAAOU,UAAU8K,aACjBxL,OAAOU,UAAU+K,aAAe,SAASA,aAAcvG,EAAQsF,GAI7D,OAHAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QAEpB,SAAfzC,KAAKgJ,IACThJ,KAAKgJ,EAAS,IAAM,GACrBhJ,KAAKgJ,EAAS,IAAM,EACrBhJ,KAAKgJ,EAAS,GAClB,EAEAlF,OAAOU,UAAUgL,gBAAkBC,oBAAmB,SAASD,gBAAiBxG,GAE9E0G,eADA1G,KAAoB,EACG,UACvB,MAAM2G,EAAQ3P,KAAKgJ,GACb4G,EAAO5P,KAAKgJ,EAAS,QACbzC,IAAVoJ,QAAgCpJ,IAATqJ,GACzBC,YAAY7G,EAAQhJ,KAAKyC,OAAS,GAGpC,MAAMyH,EAAKyF,EACQ,IAAjB3P,OAAOgJ,GACU,MAAjBhJ,OAAOgJ,GACPhJ,OAAOgJ,GAAU,GAAK,GAElBiB,EAAKjK,OAAOgJ,GACC,IAAjBhJ,OAAOgJ,GACU,MAAjBhJ,OAAOgJ,GACP4G,EAAO,GAAK,GAEd,OAAO3B,OAAO/D,IAAO+D,OAAOhE,IAAOgE,OAAO,IAC5C,IAEAnK,OAAOU,UAAUsL,gBAAkBL,oBAAmB,SAASK,gBAAiB9G,GAE9E0G,eADA1G,KAAoB,EACG,UACvB,MAAM2G,EAAQ3P,KAAKgJ,GACb4G,EAAO5P,KAAKgJ,EAAS,QACbzC,IAAVoJ,QAAgCpJ,IAATqJ,GACzBC,YAAY7G,EAAQhJ,KAAKyC,OAAS,GAGpC,MAAMwH,EAAK0F,EAAQ,GAAK,GACL,MAAjB3P,OAAOgJ,GACU,IAAjBhJ,OAAOgJ,GACPhJ,OAAOgJ,GAEHkB,EAAKlK,OAAOgJ,GAAU,GAAK,GACd,MAAjBhJ,OAAOgJ,GACU,IAAjBhJ,OAAOgJ,GACP4G,EAEF,OAAQ3B,OAAOhE,IAAOgE,OAAO,KAAOA,OAAO/D,EAC7C,IAEApG,OAAOU,UAAUuL,UAAY,SAASA,UAAW/G,EAAQzH,EAAY+M,GACnEtF,KAAoB,EACpBzH,KAA4B,EACvB+M,GAAUV,YAAY5E,EAAQzH,EAAYvB,KAAKyC,QAEpD,IAAIyF,EAAMlI,KAAKgJ,GACX4F,EAAM,EACN7M,EAAI,EACR,OAASA,EAAIR,IAAeqN,GAAO,MACjC1G,GAAOlI,KAAKgJ,EAASjH,GAAK6M,EAM5B,OAJAA,GAAO,IAEH1G,GAAO0G,IAAK1G,GAAOiC,KAAK6F,IAAI,EAAG,EAAIzO,IAEhC2G,CACT,EAEApE,OAAOU,UAAUyL,UAAY,SAASA,UAAWjH,EAAQzH,EAAY+M,GACnEtF,KAAoB,EACpBzH,KAA4B,EACvB+M,GAAUV,YAAY5E,EAAQzH,EAAYvB,KAAKyC,QAEpD,IAAIV,EAAIR,EACJqN,EAAM,EACN1G,EAAMlI,KAAKgJ,IAAWjH,GAC1B,KAAOA,EAAI,IAAM6M,GAAO,MACtB1G,GAAOlI,KAAKgJ,IAAWjH,GAAK6M,EAM9B,OAJAA,GAAO,IAEH1G,GAAO0G,IAAK1G,GAAOiC,KAAK6F,IAAI,EAAG,EAAIzO,IAEhC2G,CACT,EAEApE,OAAOU,UAAU0L,SAAW,SAASA,SAAUlH,EAAQsF,GAGrD,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACtB,IAAfzC,KAAKgJ,IAC0B,GAA5B,IAAOhJ,KAAKgJ,GAAU,GADKhJ,KAAKgJ,EAE3C,EAEAlF,OAAOU,UAAU2L,YAAc,SAASA,YAAanH,EAAQsF,GAC3DtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QAC3C,MAAMyF,EAAMlI,KAAKgJ,GAAWhJ,KAAKgJ,EAAS,IAAM,EAChD,OAAc,MAANd,EAAsB,WAANA,EAAmBA,CAC7C,EAEApE,OAAOU,UAAU4L,YAAc,SAASA,YAAapH,EAAQsF,GAC3DtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QAC3C,MAAMyF,EAAMlI,KAAKgJ,EAAS,GAAMhJ,KAAKgJ,IAAW,EAChD,OAAc,MAANd,EAAsB,WAANA,EAAmBA,CAC7C,EAEApE,OAAOU,UAAU6L,YAAc,SAASA,YAAarH,EAAQsF,GAI3D,OAHAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QAEnCzC,KAAKgJ,GACVhJ,KAAKgJ,EAAS,IAAM,EACpBhJ,KAAKgJ,EAAS,IAAM,GACpBhJ,KAAKgJ,EAAS,IAAM,EACzB,EAEAlF,OAAOU,UAAU8L,YAAc,SAASA,YAAatH,EAAQsF,GAI3D,OAHAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QAEnCzC,KAAKgJ,IAAW,GACrBhJ,KAAKgJ,EAAS,IAAM,GACpBhJ,KAAKgJ,EAAS,IAAM,EACpBhJ,KAAKgJ,EAAS,EACnB,EAEAlF,OAAOU,UAAU+L,eAAiBd,oBAAmB,SAASc,eAAgBvH,GAE5E0G,eADA1G,KAAoB,EACG,UACvB,MAAM2G,EAAQ3P,KAAKgJ,GACb4G,EAAO5P,KAAKgJ,EAAS,QACbzC,IAAVoJ,QAAgCpJ,IAATqJ,GACzBC,YAAY7G,EAAQhJ,KAAKyC,OAAS,GAGpC,MAAMyF,EAAMlI,KAAKgJ,EAAS,GACL,IAAnBhJ,KAAKgJ,EAAS,GACK,MAAnBhJ,KAAKgJ,EAAS,IACb4G,GAAQ,IAEX,OAAQ3B,OAAO/F,IAAQ+F,OAAO,KAC5BA,OAAO0B,EACU,IAAjB3P,OAAOgJ,GACU,MAAjBhJ,OAAOgJ,GACPhJ,OAAOgJ,GAAU,GAAK,GAC1B,IAEAlF,OAAOU,UAAUgM,eAAiBf,oBAAmB,SAASe,eAAgBxH,GAE5E0G,eADA1G,KAAoB,EACG,UACvB,MAAM2G,EAAQ3P,KAAKgJ,GACb4G,EAAO5P,KAAKgJ,EAAS,QACbzC,IAAVoJ,QAAgCpJ,IAATqJ,GACzBC,YAAY7G,EAAQhJ,KAAKyC,OAAS,GAGpC,MAAMyF,GAAOyH,GAAS,IACH,MAAjB3P,OAAOgJ,GACU,IAAjBhJ,OAAOgJ,GACPhJ,OAAOgJ,GAET,OAAQiF,OAAO/F,IAAQ+F,OAAO,KAC5BA,OAAOjO,OAAOgJ,GAAU,GAAK,GACZ,MAAjBhJ,OAAOgJ,GACU,IAAjBhJ,OAAOgJ,GACP4G,EACJ,IAEA9L,OAAOU,UAAUiM,YAAc,SAASA,YAAazH,EAAQsF,GAG3D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCkB,EAAQ+E,KAAK1I,KAAMgJ,GAAQ,EAAM,GAAI,EAC9C,EAEAlF,OAAOU,UAAUkM,YAAc,SAASA,YAAa1H,EAAQsF,GAG3D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCkB,EAAQ+E,KAAK1I,KAAMgJ,GAAQ,EAAO,GAAI,EAC/C,EAEAlF,OAAOU,UAAUmM,aAAe,SAASA,aAAc3H,EAAQsF,GAG7D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCkB,EAAQ+E,KAAK1I,KAAMgJ,GAAQ,EAAM,GAAI,EAC9C,EAEAlF,OAAOU,UAAUoM,aAAe,SAASA,aAAc5H,EAAQsF,GAG7D,OAFAtF,KAAoB,EACfsF,GAAUV,YAAY5E,EAAQ,EAAGhJ,KAAKyC,QACpCkB,EAAQ+E,KAAK1I,KAAMgJ,GAAQ,EAAO,GAAI,EAC/C,EAQAlF,OAAOU,UAAUqM,YACjB/M,OAAOU,UAAUsM,YAAc,SAASA,YAAahM,EAAOkE,EAAQzH,EAAY+M,GAI9E,GAHAxJ,GAASA,EACTkE,KAAoB,EACpBzH,KAA4B,GACvB+M,EAAU,CAEbR,SAAS9N,KAAM8E,EAAOkE,EAAQzH,EADb4I,KAAK6F,IAAI,EAAG,EAAIzO,GAAc,EACK,EACtD,CAEA,IAAIqN,EAAM,EACN7M,EAAI,EAER,IADA/B,KAAKgJ,GAAkB,IAARlE,IACN/C,EAAIR,IAAeqN,GAAO,MACjC5O,KAAKgJ,EAASjH,GAAM+C,EAAQ8J,EAAO,IAGrC,OAAO5F,EAASzH,CAClB,EAEAuC,OAAOU,UAAUuM,YACjBjN,OAAOU,UAAUwM,YAAc,SAASA,YAAalM,EAAOkE,EAAQzH,EAAY+M,GAI9E,GAHAxJ,GAASA,EACTkE,KAAoB,EACpBzH,KAA4B,GACvB+M,EAAU,CAEbR,SAAS9N,KAAM8E,EAAOkE,EAAQzH,EADb4I,KAAK6F,IAAI,EAAG,EAAIzO,GAAc,EACK,EACtD,CAEA,IAAIQ,EAAIR,EAAa,EACjBqN,EAAM,EAEV,IADA5O,KAAKgJ,EAASjH,GAAa,IAAR+C,IACV/C,GAAK,IAAM6M,GAAO,MACzB5O,KAAKgJ,EAASjH,GAAM+C,EAAQ8J,EAAO,IAGrC,OAAO5F,EAASzH,CAClB,EAEAuC,OAAOU,UAAUyM,WACjBnN,OAAOU,UAAU0M,WAAa,SAASA,WAAYpM,EAAOkE,EAAQsF,GAKhE,OAJAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,IAAM,GACtDhJ,KAAKgJ,GAAmB,IAARlE,EACTkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU2M,cACjBrN,OAAOU,UAAU4M,cAAgB,SAASA,cAAetM,EAAOkE,EAAQsF,GAMtE,OALAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,MAAQ,GACxDhJ,KAAKgJ,GAAmB,IAARlE,EAChB9E,KAAKgJ,EAAS,GAAMlE,IAAU,EACvBkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU6M,cACjBvN,OAAOU,UAAU8M,cAAgB,SAASA,cAAexM,EAAOkE,EAAQsF,GAMtE,OALAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,MAAQ,GACxDhJ,KAAKgJ,GAAWlE,IAAU,EAC1B9E,KAAKgJ,EAAS,GAAc,IAARlE,EACbkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU+M,cACjBzN,OAAOU,UAAUgN,cAAgB,SAASA,cAAe1M,EAAOkE,EAAQsF,GAQtE,OAPAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,WAAY,GAC5DhJ,KAAKgJ,EAAS,GAAMlE,IAAU,GAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,GAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,EAC9B9E,KAAKgJ,GAAmB,IAARlE,EACTkE,EAAS,CAClB,EAEAlF,OAAOU,UAAUiN,cACjB3N,OAAOU,UAAUkN,cAAgB,SAASA,cAAe5M,EAAOkE,EAAQsF,GAQtE,OAPAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,WAAY,GAC5DhJ,KAAKgJ,GAAWlE,IAAU,GAC1B9E,KAAKgJ,EAAS,GAAMlE,IAAU,GAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,EAC9B9E,KAAKgJ,EAAS,GAAc,IAARlE,EACbkE,EAAS,CAClB,EA8CAlF,OAAOU,UAAUmN,iBAAmBlC,oBAAmB,SAASkC,iBAAkB7M,EAAOkE,EAAS,GAChG,OAAO+E,eAAe/N,KAAM8E,EAAOkE,EAAQiF,OAAO,GAAIA,OAAO,sBAC/D,IAEAnK,OAAOU,UAAUoN,iBAAmBnC,oBAAmB,SAASmC,iBAAkB9M,EAAOkE,EAAS,GAChG,OAAOkF,eAAelO,KAAM8E,EAAOkE,EAAQiF,OAAO,GAAIA,OAAO,sBAC/D,IAEAnK,OAAOU,UAAUqN,WAAa,SAASA,WAAY/M,EAAOkE,EAAQzH,EAAY+M,GAG5E,GAFAxJ,GAASA,EACTkE,KAAoB,GACfsF,EAAU,CACb,MAAMwD,EAAQ3H,KAAK6F,IAAI,EAAI,EAAIzO,EAAc,GAE7CuM,SAAS9N,KAAM8E,EAAOkE,EAAQzH,EAAYuQ,EAAQ,GAAIA,EACxD,CAEA,IAAI/P,EAAI,EACJ6M,EAAM,EACNmD,EAAM,EAEV,IADA/R,KAAKgJ,GAAkB,IAARlE,IACN/C,EAAIR,IAAeqN,GAAO,MAC7B9J,EAAQ,GAAa,IAARiN,GAAsC,IAAzB/R,KAAKgJ,EAASjH,EAAI,KAC9CgQ,EAAM,GAER/R,KAAKgJ,EAASjH,IAAO+C,EAAQ8J,GAAQ,GAAKmD,EAAM,IAGlD,OAAO/I,EAASzH,CAClB,EAEAuC,OAAOU,UAAUwN,WAAa,SAASA,WAAYlN,EAAOkE,EAAQzH,EAAY+M,GAG5E,GAFAxJ,GAASA,EACTkE,KAAoB,GACfsF,EAAU,CACb,MAAMwD,EAAQ3H,KAAK6F,IAAI,EAAI,EAAIzO,EAAc,GAE7CuM,SAAS9N,KAAM8E,EAAOkE,EAAQzH,EAAYuQ,EAAQ,GAAIA,EACxD,CAEA,IAAI/P,EAAIR,EAAa,EACjBqN,EAAM,EACNmD,EAAM,EAEV,IADA/R,KAAKgJ,EAASjH,GAAa,IAAR+C,IACV/C,GAAK,IAAM6M,GAAO,MACrB9J,EAAQ,GAAa,IAARiN,GAAsC,IAAzB/R,KAAKgJ,EAASjH,EAAI,KAC9CgQ,EAAM,GAER/R,KAAKgJ,EAASjH,IAAO+C,EAAQ8J,GAAQ,GAAKmD,EAAM,IAGlD,OAAO/I,EAASzH,CAClB,EAEAuC,OAAOU,UAAUyN,UAAY,SAASA,UAAWnN,EAAOkE,EAAQsF,GAM9D,OALAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,KAAO,KACnDlE,EAAQ,IAAGA,EAAQ,IAAOA,EAAQ,GACtC9E,KAAKgJ,GAAmB,IAARlE,EACTkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU0N,aAAe,SAASA,aAAcpN,EAAOkE,EAAQsF,GAMpE,OALAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,OAAS,OACzDhJ,KAAKgJ,GAAmB,IAARlE,EAChB9E,KAAKgJ,EAAS,GAAMlE,IAAU,EACvBkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU2N,aAAe,SAASA,aAAcrN,EAAOkE,EAAQsF,GAMpE,OALAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,OAAS,OACzDhJ,KAAKgJ,GAAWlE,IAAU,EAC1B9E,KAAKgJ,EAAS,GAAc,IAARlE,EACbkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU4N,aAAe,SAASA,aAActN,EAAOkE,EAAQsF,GAQpE,OAPAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,YAAa,YAC7DhJ,KAAKgJ,GAAmB,IAARlE,EAChB9E,KAAKgJ,EAAS,GAAMlE,IAAU,EAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,GAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,GACvBkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU6N,aAAe,SAASA,aAAcvN,EAAOkE,EAAQsF,GASpE,OARAxJ,GAASA,EACTkE,KAAoB,EACfsF,GAAUR,SAAS9N,KAAM8E,EAAOkE,EAAQ,EAAG,YAAa,YACzDlE,EAAQ,IAAGA,EAAQ,WAAaA,EAAQ,GAC5C9E,KAAKgJ,GAAWlE,IAAU,GAC1B9E,KAAKgJ,EAAS,GAAMlE,IAAU,GAC9B9E,KAAKgJ,EAAS,GAAMlE,IAAU,EAC9B9E,KAAKgJ,EAAS,GAAc,IAARlE,EACbkE,EAAS,CAClB,EAEAlF,OAAOU,UAAU8N,gBAAkB7C,oBAAmB,SAAS6C,gBAAiBxN,EAAOkE,EAAS,GAC9F,OAAO+E,eAAe/N,KAAM8E,EAAOkE,GAASiF,OAAO,sBAAuBA,OAAO,sBACnF,IAEAnK,OAAOU,UAAU+N,gBAAkB9C,oBAAmB,SAAS8C,gBAAiBzN,EAAOkE,EAAS,GAC9F,OAAOkF,eAAelO,KAAM8E,EAAOkE,GAASiF,OAAO,sBAAuBA,OAAO,sBACnF,IAiBAnK,OAAOU,UAAUgO,aAAe,SAASA,aAAc1N,EAAOkE,EAAQsF,GACpE,OAAOF,WAAWpO,KAAM8E,EAAOkE,GAAQ,EAAMsF,EAC/C,EAEAxK,OAAOU,UAAUiO,aAAe,SAASA,aAAc3N,EAAOkE,EAAQsF,GACpE,OAAOF,WAAWpO,KAAM8E,EAAOkE,GAAQ,EAAOsF,EAChD,EAYAxK,OAAOU,UAAUkO,cAAgB,SAASA,cAAe5N,EAAOkE,EAAQsF,GACtE,OAAOC,YAAYvO,KAAM8E,EAAOkE,GAAQ,EAAMsF,EAChD,EAEAxK,OAAOU,UAAUmO,cAAgB,SAASA,cAAe7N,EAAOkE,EAAQsF,GACtE,OAAOC,YAAYvO,KAAM8E,EAAOkE,GAAQ,EAAOsF,EACjD,EAGAxK,OAAOU,UAAUmB,KAAO,SAASA,KAAMoH,EAAQ6F,EAAatP,EAAOC,GACjE,IAAKO,OAAOuC,SAAS0G,GAAS,MAAM,IAAIpI,UAAU,+BAQlD,GAPKrB,IAAOA,EAAQ,GACfC,GAAe,IAARA,IAAWA,EAAMvD,KAAKyC,QAC9BmQ,GAAe7F,EAAOtK,SAAQmQ,EAAc7F,EAAOtK,QAClDmQ,IAAaA,EAAc,GAC5BrP,EAAM,GAAKA,EAAMD,IAAOC,EAAMD,GAG9BC,IAAQD,EAAO,OAAO,EAC1B,GAAsB,IAAlByJ,EAAOtK,QAAgC,IAAhBzC,KAAKyC,OAAc,OAAO,EAGrD,GAAImQ,EAAc,EAChB,MAAM,IAAIxO,WAAW,6BAEvB,GAAId,EAAQ,GAAKA,GAAStD,KAAKyC,OAAQ,MAAM,IAAI2B,WAAW,sBAC5D,GAAIb,EAAM,EAAG,MAAM,IAAIa,WAAW,2BAG9Bb,EAAMvD,KAAKyC,SAAQc,EAAMvD,KAAKyC,QAC9BsK,EAAOtK,OAASmQ,EAAcrP,EAAMD,IACtCC,EAAMwJ,EAAOtK,OAASmQ,EAActP,GAGtC,MAAMlB,EAAMmB,EAAMD,EAalB,OAXItD,OAAS+M,GAAqD,mBAApC7J,WAAWsB,UAAUqO,WAEjD7S,KAAK6S,WAAWD,EAAatP,EAAOC,GAEpCL,WAAWsB,UAAU+H,IAAIlE,KACvB0E,EACA/M,KAAKyO,SAASnL,EAAOC,GACrBqP,GAIGxQ,CACT,EAMA0B,OAAOU,UAAUqH,KAAO,SAASA,KAAM3D,EAAK5E,EAAOC,EAAK0B,GAEtD,GAAmB,iBAARiD,EAAkB,CAS3B,GARqB,iBAAV5E,GACT2B,EAAW3B,EACXA,EAAQ,EACRC,EAAMvD,KAAKyC,QACa,iBAARc,IAChB0B,EAAW1B,EACXA,EAAMvD,KAAKyC,aAEI8D,IAAbtB,GAA8C,iBAAbA,EACnC,MAAM,IAAIN,UAAU,6BAEtB,GAAwB,iBAAbM,IAA0BnB,OAAOoB,WAAWD,GACrD,MAAM,IAAIN,UAAU,qBAAuBM,GAE7C,GAAmB,IAAfiD,EAAIzF,OAAc,CACpB,MAAMW,EAAO8E,EAAI5F,WAAW,IACV,SAAb2C,GAAuB7B,EAAO,KAClB,WAAb6B,KAEFiD,EAAM9E,EAEV,CACF,KAA0B,iBAAR8E,EAChBA,GAAY,IACY,kBAARA,IAChBA,EAAMe,OAAOf,IAIf,GAAI5E,EAAQ,GAAKtD,KAAKyC,OAASa,GAAStD,KAAKyC,OAASc,EACpD,MAAM,IAAIa,WAAW,sBAGvB,GAAIb,GAAOD,EACT,OAAOtD,KAQT,IAAI+B,EACJ,GANAuB,KAAkB,EAClBC,OAAcgD,IAARhD,EAAoBvD,KAAKyC,OAASc,IAAQ,EAE3C2E,IAAKA,EAAM,GAGG,iBAARA,EACT,IAAKnG,EAAIuB,EAAOvB,EAAIwB,IAAOxB,EACzB/B,KAAK+B,GAAKmG,MAEP,CACL,MAAMyF,EAAQ7J,OAAOuC,SAAS6B,GAC1BA,EACApE,OAAOe,KAAKqD,EAAKjD,GACf7C,EAAMuL,EAAMlL,OAClB,GAAY,IAARL,EACF,MAAM,IAAIuC,UAAU,cAAgBuD,EAClC,qCAEJ,IAAKnG,EAAI,EAAGA,EAAIwB,EAAMD,IAASvB,EAC7B/B,KAAK+B,EAAIuB,GAASqK,EAAM5L,EAAIK,EAEhC,CAEA,OAAOpC,IACT,EAMA,MAAM8S,EAAS,CAAC,EAChB,SAASC,EAAGC,EAAKC,EAAYC,GAC3BJ,EAAOE,GAAO,MAAMG,kBAAkBD,EACpC,WAAAE,GACEC,QAEA/O,OAAOmH,eAAezL,KAAM,UAAW,CACrC8E,MAAOmO,EAAWjI,MAAMhL,KAAMkH,WAC9BoM,UAAU,EACVC,cAAc,IAIhBvT,KAAKwT,KAAO,GAAGxT,KAAKwT,SAASR,KAG7BhT,KAAKyT,aAEEzT,KAAKwT,IACd,CAEA,QAAIpQ,GACF,OAAO4P,CACT,CAEA,QAAI5P,CAAM0B,GACRR,OAAOmH,eAAezL,KAAM,OAAQ,CAClCuT,cAAc,EACd7H,YAAY,EACZ5G,QACAwO,UAAU,GAEd,CAEA,QAAAtM,GACE,MAAO,GAAGhH,KAAKwT,SAASR,OAAShT,KAAK0T,SACxC,EAEJ,CA+BA,SAASC,sBAAuBzL,GAC9B,IAAImC,EAAM,GACNtI,EAAImG,EAAIzF,OACZ,MAAMa,EAAmB,MAAX4E,EAAI,GAAa,EAAI,EACnC,KAAOnG,GAAKuB,EAAQ,EAAGvB,GAAK,EAC1BsI,EAAM,IAAInC,EAAI7C,MAAMtD,EAAI,EAAGA,KAAKsI,IAElC,MAAO,GAAGnC,EAAI7C,MAAM,EAAGtD,KAAKsI,GAC9B,CAYA,SAAS2D,WAAYlJ,EAAOsF,EAAK0C,EAAKzI,EAAK2E,EAAQzH,GACjD,GAAIuD,EAAQgI,GAAOhI,EAAQsF,EAAK,CAC9B,MAAMrC,EAAmB,iBAARqC,EAAmB,IAAM,GAC1C,IAAIwJ,EAWJ,MARIA,EAFArS,EAAa,EACH,IAAR6I,GAAaA,IAAQ6D,OAAO,GACtB,OAAOlG,YAAYA,QAA2B,GAAlBxG,EAAa,KAASwG,IAElD,SAASA,QAA2B,GAAlBxG,EAAa,GAAS,IAAIwG,iBACtB,GAAlBxG,EAAa,GAAS,IAAIwG,IAGhC,MAAMqC,IAAMrC,YAAY+E,IAAM/E,IAElC,IAAI+K,EAAOe,iBAAiB,QAASD,EAAO9O,EACpD,EAtBF,SAASgP,YAAazP,EAAK2E,EAAQzH,GACjCmO,eAAe1G,EAAQ,eACHzC,IAAhBlC,EAAI2E,SAAsDzC,IAA7BlC,EAAI2E,EAASzH,IAC5CsO,YAAY7G,EAAQ3E,EAAI5B,QAAUlB,EAAa,GAEnD,CAkBEuS,CAAYzP,EAAK2E,EAAQzH,EAC3B,CAEA,SAASmO,eAAgB5K,EAAO0O,GAC9B,GAAqB,iBAAV1O,EACT,MAAM,IAAIgO,EAAOiB,qBAAqBP,EAAM,SAAU1O,EAE1D,CAEA,SAAS+K,YAAa/K,EAAOrC,EAAQgE,GACnC,GAAI0D,KAAK6J,MAAMlP,KAAWA,EAExB,MADA4K,eAAe5K,EAAO2B,GAChB,IAAIqM,EAAOe,iBAAiBpN,GAAQ,SAAU,aAAc3B,GAGpE,GAAIrC,EAAS,EACX,MAAM,IAAIqQ,EAAOmB,yBAGnB,MAAM,IAAInB,EAAOe,iBAAiBpN,GAAQ,SACR,MAAMA,EAAO,EAAI,YAAYhE,IAC7BqC,EACpC,CAvFAiO,EAAE,4BACA,SAAUS,GACR,OAAIA,EACK,GAAGA,gCAGL,gDACT,GAAGpP,YACL2O,EAAE,wBACA,SAAUS,EAAMrO,GACd,MAAO,QAAQqO,4DAA+DrO,GAChF,GAAGR,WACLoO,EAAE,oBACA,SAAUpS,EAAKiT,EAAOM,GACpB,IAAIC,EAAM,iBAAiBxT,sBACvByT,EAAWF,EAWf,OAVIjL,OAAOoL,UAAUH,IAAU/J,KAAKmK,IAAIJ,GAAS,GAAK,GACpDE,EAAWT,sBAAsB5S,OAAOmT,IACd,iBAAVA,IAChBE,EAAWrT,OAAOmT,IACdA,EAAQjG,OAAO,IAAMA,OAAO,KAAOiG,IAAUjG,OAAO,IAAMA,OAAO,QACnEmG,EAAWT,sBAAsBS,IAEnCA,GAAY,KAEdD,GAAO,eAAeP,eAAmBQ,IAClCD,CACT,GAAG/P,YAiEL,MAAMmQ,EAAoB,oBAgB1B,SAASnN,YAAapC,EAAQ+E,GAE5B,IAAIQ,EADJR,EAAQA,GAASyK,IAEjB,MAAM/R,EAASuC,EAAOvC,OACtB,IAAIgS,EAAgB,KACpB,MAAM9G,EAAQ,GAEd,IAAK,IAAI5L,EAAI,EAAGA,EAAIU,IAAUV,EAAG,CAI/B,GAHAwI,EAAYvF,EAAO1C,WAAWP,GAG1BwI,EAAY,OAAUA,EAAY,MAAQ,CAE5C,IAAKkK,EAAe,CAElB,GAAIlK,EAAY,MAAQ,EAEjBR,GAAS,IAAM,GAAG4D,EAAM7K,KAAK,IAAM,IAAM,KAC9C,QACF,CAAO,GAAIf,EAAI,IAAMU,EAAQ,EAEtBsH,GAAS,IAAM,GAAG4D,EAAM7K,KAAK,IAAM,IAAM,KAC9C,QACF,CAGA2R,EAAgBlK,EAEhB,QACF,CAGA,GAAIA,EAAY,MAAQ,EACjBR,GAAS,IAAM,GAAG4D,EAAM7K,KAAK,IAAM,IAAM,KAC9C2R,EAAgBlK,EAChB,QACF,CAGAA,EAAkE,OAArDkK,EAAgB,OAAU,GAAKlK,EAAY,MAC1D,MAAWkK,IAEJ1K,GAAS,IAAM,GAAG4D,EAAM7K,KAAK,IAAM,IAAM,KAMhD,GAHA2R,EAAgB,KAGZlK,EAAY,IAAM,CACpB,IAAKR,GAAS,GAAK,EAAG,MACtB4D,EAAM7K,KAAKyH,EACb,MAAO,GAAIA,EAAY,KAAO,CAC5B,IAAKR,GAAS,GAAK,EAAG,MACtB4D,EAAM7K,KACJyH,GAAa,EAAM,IACP,GAAZA,EAAmB,IAEvB,MAAO,GAAIA,EAAY,MAAS,CAC9B,IAAKR,GAAS,GAAK,EAAG,MACtB4D,EAAM7K,KACJyH,GAAa,GAAM,IACnBA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAEvB,KAAO,MAAIA,EAAY,SASrB,MAAM,IAAIlH,MAAM,sBARhB,IAAK0G,GAAS,GAAK,EAAG,MACtB4D,EAAM7K,KACJyH,GAAa,GAAO,IACpBA,GAAa,GAAM,GAAO,IAC1BA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAIvB,CACF,CAEA,OAAOoD,CACT,CA2BA,SAAStG,cAAe1G,GACtB,OAAO+C,EAAO7B,YAxHhB,SAAS6S,YAAa/T,GAMpB,IAFAA,GAFAA,EAAMA,EAAIgU,MAAM,KAAK,IAEX1T,OAAOL,QAAQ2T,EAAmB,KAEpC9R,OAAS,EAAG,MAAO,GAE3B,KAAO9B,EAAI8B,OAAS,GAAM,GACxB9B,GAAY,IAEd,OAAOA,CACT,CA4G4B+T,CAAY/T,GACxC,CAEA,SAAS6I,WAAYoL,EAAKC,EAAK7L,EAAQvG,GACrC,IAAIV,EACJ,IAAKA,EAAI,EAAGA,EAAIU,KACTV,EAAIiH,GAAU6L,EAAIpS,QAAYV,GAAK6S,EAAInS,UADpBV,EAExB8S,EAAI9S,EAAIiH,GAAU4L,EAAI7S,GAExB,OAAOA,CACT,CAKA,SAAS2D,WAAYU,EAAKK,GACxB,OAAOL,aAAeK,GACZ,MAAPL,GAAkC,MAAnBA,EAAIgN,aAA+C,MAAxBhN,EAAIgN,YAAYI,MACzDpN,EAAIgN,YAAYI,OAAS/M,EAAK+M,IACpC,CACA,SAAShN,YAAaJ,GAEpB,OAAOA,GAAQA,CACjB,CAIA,MAAMsH,EAAsB,WAC1B,MAAMoH,EAAW,mBACXC,EAAQ,IAAI5R,MAAM,KACxB,IAAK,IAAIpB,EAAI,EAAGA,EAAI,KAAMA,EAAG,CAC3B,MAAMiT,EAAU,GAAJjT,EACZ,IAAK,IAAI+G,EAAI,EAAGA,EAAI,KAAMA,EACxBiM,EAAMC,EAAMlM,GAAKgM,EAAS/S,GAAK+S,EAAShM,EAE5C,CACA,OAAOiM,CACR,CAV2B,GAa5B,SAAStF,mBAAoBwF,GAC3B,MAAyB,oBAAXhH,OAAyBiH,uBAAyBD,CAClE,CAEA,SAASC,yBACP,MAAM,IAAI7R,MAAM,uBAClB,gCCvjEA,IAAI8R,EAAe,EAAQ,OAEvBC,EAAW,EAAQ,OAEnBC,EAAWD,EAASD,EAAa,6BAErCtV,EAAOD,QAAU,SAAS0V,mBAAmB9B,EAAM+B,GAClD,IAAIC,EAAYL,EAAa3B,IAAQ+B,GACrC,MAAyB,mBAAdC,GAA4BH,EAAS7B,EAAM,gBAAkB,EAChE4B,EAASI,GAEVA,CACR,gCCZA,IAAIC,EAAO,EAAQ,OACfN,EAAe,EAAQ,OAEvBO,EAASP,EAAa,8BACtBQ,EAAQR,EAAa,6BACrBS,EAAgBT,EAAa,mBAAmB,IAASM,EAAKpN,KAAKsN,EAAOD,GAE1EG,EAAQV,EAAa,qCAAqC,GAC1DW,EAAkBX,EAAa,2BAA2B,GAC1DY,EAAOZ,EAAa,cAExB,GAAIW,EACH,IACCA,EAAgB,CAAC,EAAG,IAAK,CAAEhR,MAAO,GACnC,CAAE,MAAOwG,GAERwK,EAAkB,IACnB,CAGDjW,EAAOD,QAAU,SAASwV,SAASY,GAClC,IAAIC,EAAOL,EAAcH,EAAME,EAAOzO,WAClC2O,GAASC,IACDD,EAAMI,EAAM,UACd1C,cAERuC,EACCG,EACA,SACA,CAAEnR,MAAO,EAAIiR,EAAK,EAAGC,EAAiBvT,QAAUyE,UAAUzE,OAAS,OAItE,OAAOwT,CACR,EAEA,IAAIC,EAAY,SAASA,YACxB,OAAON,EAAcH,EAAMC,EAAQxO,UACpC,EAEI4O,EACHA,EAAgBjW,EAAOD,QAAS,QAAS,CAAEkF,MAAOoR,IAElDrW,EAAOD,QAAQoL,MAAQkL,iBC7CxB,OAOC,WACA,aAEA,IAAIC,EAAS,CAAC,EAAEC,eAGhB,SAASC,aAGR,IAFA,IAAIC,EAAU,GAELvU,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CAC1C,IAAI0C,EAAMyC,UAAUnF,GACpB,GAAK0C,EAAL,CAEA,IAAI8R,SAAiB9R,EAErB,GAAgB,WAAZ8R,GAAoC,WAAZA,EAC3BD,EAAQxT,KAAK2B,QACP,GAAItB,MAAMuD,QAAQjC,IACxB,GAAIA,EAAIhC,OAAQ,CACf,IAAI+T,EAAQH,WAAWrL,MAAM,KAAMvG,GAC/B+R,GACHF,EAAQxT,KAAK0T,EAEf,OACM,GAAgB,WAAZD,EAAsB,CAChC,GAAI9R,EAAIuC,WAAa1C,OAAOE,UAAUwC,WAAavC,EAAIuC,SAASA,WAAWoG,SAAS,iBAAkB,CACrGkJ,EAAQxT,KAAK2B,EAAIuC,YACjB,QACD,CAEA,IAAK,IAAIyP,KAAOhS,EACX0R,EAAO9N,KAAK5D,EAAKgS,IAAQhS,EAAIgS,IAChCH,EAAQxT,KAAK2T,EAGhB,CAxBkB,CAyBnB,CAEA,OAAOH,EAAQrT,KAAK,IACrB,CAEqCpD,EAAOD,SAC3CyW,WAAWK,QAAUL,WACrBxW,EAAOD,QAAUyW,iBAKhB,KAFwB,EAAF,WACtB,OAAOA,UACP,UAFoB,OAEpB,YAIH,CApDA,+BCOAzW,EAAQ+W,MAgCR,SAASA,MAAMhW,EAAKiW,GAClB,GAAmB,iBAARjW,EACT,MAAM,IAAIgE,UAAU,iCAGtB,IAAIyB,EAAM,CAAC,EAEPtF,GADM8V,GAAW,CAAC,GACRC,QAAUA,OAEpBC,EAAQ,EACZ,KAAOA,EAAQnW,EAAI8B,QAAQ,CACzB,IAAIsU,EAAQpW,EAAIQ,QAAQ,IAAK2V,GAG7B,IAAe,IAAXC,EACF,MAGF,IAAIC,EAASrW,EAAIQ,QAAQ,IAAK2V,GAE9B,IAAgB,IAAZE,EACFA,EAASrW,EAAI8B,YACR,GAAIuU,EAASD,EAAO,CAEzBD,EAAQnW,EAAI2H,YAAY,IAAKyO,EAAQ,GAAK,EAC1C,QACF,CAEA,IAAIN,EAAM9V,EAAI0E,MAAMyR,EAAOC,GAAO9V,OAGlC,QAAIsF,IAAcH,EAAIqQ,GAAM,CAC1B,IAAIvO,EAAMvH,EAAI0E,MAAM0R,EAAQ,EAAGC,GAAQ/V,OAGb,KAAtBiH,EAAI5F,WAAW,KACjB4F,EAAMA,EAAI7C,MAAM,GAAI,IAGtBe,EAAIqQ,GAAOQ,UAAU/O,EAAKpH,EAC5B,CAEAgW,EAAQE,EAAS,CACnB,CAEA,OAAO5Q,CACT,EA7EAxG,EAAQsX,UA+FR,SAASA,UAAU1D,EAAMtL,EAAK0O,GAC5B,IAAIO,EAAMP,GAAW,CAAC,EAClBQ,EAAMD,EAAIE,QAAUA,OAExB,GAAmB,mBAARD,EACT,MAAM,IAAIzS,UAAU,4BAGtB,IAAK2S,EAAmBhW,KAAKkS,GAC3B,MAAM,IAAI7O,UAAU,4BAGtB,IAAIG,EAAQsS,EAAIlP,GAEhB,GAAIpD,IAAUwS,EAAmBhW,KAAKwD,GACpC,MAAM,IAAIH,UAAU,2BAGtB,IAAIhE,EAAM6S,EAAO,IAAM1O,EAEvB,GAAI,MAAQqS,EAAII,OAAQ,CACtB,IAAIA,EAASJ,EAAII,OAAS,EAE1B,GAAIC,MAAMD,KAAYlK,SAASkK,GAC7B,MAAM,IAAI5S,UAAU,4BAGtBhE,GAAO,aAAewJ,KAAK6J,MAAMuD,EACnC,CAEA,GAAIJ,EAAIM,OAAQ,CACd,IAAKH,EAAmBhW,KAAK6V,EAAIM,QAC/B,MAAM,IAAI9S,UAAU,4BAGtBhE,GAAO,YAAcwW,EAAIM,MAC3B,CAEA,GAAIN,EAAIO,KAAM,CACZ,IAAKJ,EAAmBhW,KAAK6V,EAAIO,MAC/B,MAAM,IAAI/S,UAAU,0BAGtBhE,GAAO,UAAYwW,EAAIO,IACzB,CAEA,GAAIP,EAAIQ,QAAS,CACf,IAAIA,EAAUR,EAAIQ,QAElB,IA2FJ,SAASC,OAAQ1P,GACf,MAAgC,kBAAzB2P,EAAWxP,KAAKH,IACrBA,aAAe4P,IACnB,CA9FSF,CAAOD,IAAYH,MAAMG,EAAQ1R,WACpC,MAAM,IAAItB,UAAU,6BAGtBhE,GAAO,aAAegX,EAAQI,aAChC,CAEIZ,EAAIa,WACNrX,GAAO,cAGLwW,EAAIc,SACNtX,GAAO,YAGT,GAAIwW,EAAIe,SAAU,CAKhB,OAJuC,iBAAjBf,EAAIe,SACtBf,EAAIe,SAAS5Q,cACb6P,EAAIe,UAGN,IAAK,MACHvX,GAAO,iBACP,MACF,IAAK,SACHA,GAAO,oBACP,MACF,IAAK,OACHA,GAAO,kBACP,MACF,QACE,MAAM,IAAIgE,UAAU,8BAE1B,CAEA,GAAIwS,EAAIgB,SAAU,CAIhB,OAHuC,iBAAjBhB,EAAIgB,SACtBhB,EAAIgB,SAAS7Q,cAAgB6P,EAAIgB,UAGnC,KAAK,EACHxX,GAAO,oBACP,MACF,IAAK,MACHA,GAAO,iBACP,MACF,IAAK,SACHA,GAAO,oBACP,MACF,IAAK,OACHA,GAAO,kBACP,MACF,QACE,MAAM,IAAIgE,UAAU,8BAE1B,CAEA,OAAOhE,CACT,EAnMA,IAAIkX,EAAavT,OAAOE,UAAUwC,SAU9BsQ,EAAqB,wCAkMzB,SAAST,OAAQlW,GACf,OAA6B,IAAtBA,EAAIQ,QAAQ,KACfiX,mBAAmBzX,GACnBA,CACN,CASA,SAAS0W,OAAQnP,GACf,OAAOmQ,mBAAmBnQ,EAC5B,CAsBA,SAAS+O,UAAUtW,EAAKkW,GACtB,IACE,OAAOA,EAAOlW,EAChB,CAAE,MAAO2K,GACP,OAAO3K,CACT,CACF,gCC3QA,IAAI2X,EAAkB,EAAQ,OAE1BC,EAA4B,CAC9B,aAAc,OACd,YAAa,MACb,QAAW,QA2Gb1Y,EAAOD,QAjGP,SAAS+F,KAAK6S,EAAM5B,GAClB,IAAI6B,EACF/E,EACAgF,EACA9E,EACA+E,EACAC,EACAC,GAAU,EACPjC,IACHA,EAAU,CAAC,GAEb6B,EAAQ7B,EAAQ6B,QAAS,EACzB,IAkDE,GAjDAC,EAAmBJ,IAEnB1E,EAAQkF,SAASC,cACjBJ,EAAYG,SAASE,gBAErBJ,EAAOE,SAASG,cAAc,SACzBC,YAAcV,EAEnBI,EAAKO,WAAa,OAElBP,EAAKQ,MAAMC,IAAM,QAEjBT,EAAKQ,MAAME,SAAW,QACtBV,EAAKQ,MAAMG,IAAM,EACjBX,EAAKQ,MAAMI,KAAO,mBAElBZ,EAAKQ,MAAMK,WAAa,MAExBb,EAAKQ,MAAMM,iBAAmB,OAC9Bd,EAAKQ,MAAMO,cAAgB,OAC3Bf,EAAKQ,MAAMQ,aAAe,OAC1BhB,EAAKQ,MAAMS,WAAa,OACxBjB,EAAKkB,iBAAiB,QAAQ,SAASxO,GAErC,GADAA,EAAEyO,kBACEnD,EAAQoD,OAEV,GADA1O,EAAE2O,sBAC6B,IAApB3O,EAAE4O,cAA+B,CAC1CzB,GAASlN,QAAQ4O,KAAK,iCACtB1B,GAASlN,QAAQ4O,KAAK,4BACtBC,OAAOF,cAAcG,YACrB,IAAIL,EAASzB,EAA0B3B,EAAQoD,SAAWzB,EAAmC,QAC7F6B,OAAOF,cAAcI,QAAQN,EAAQxB,EACvC,MACElN,EAAE4O,cAAcG,YAChB/O,EAAE4O,cAAcI,QAAQ1D,EAAQoD,OAAQxB,GAGxC5B,EAAQ2D,SACVjP,EAAE2O,iBACFrD,EAAQ2D,OAAOjP,EAAE4O,eAErB,IAEApB,SAAS0B,KAAKC,YAAY7B,GAE1BhF,EAAM8G,mBAAmB9B,GACzBD,EAAUgC,SAAS/G,IAEFkF,SAAS8B,YAAY,QAEpC,MAAM,IAAIvX,MAAM,iCAElBwV,GAAU,CACZ,CAAE,MAAOgC,GACPpC,GAASlN,QAAQC,MAAM,qCAAsCqP,GAC7DpC,GAASlN,QAAQ4O,KAAK,4BACtB,IACEC,OAAOF,cAAcI,QAAQ1D,EAAQoD,QAAU,OAAQxB,GACvD5B,EAAQ2D,QAAU3D,EAAQ2D,OAAOH,OAAOF,eACxCrB,GAAU,CACZ,CAAE,MAAOgC,GACPpC,GAASlN,QAAQC,MAAM,uCAAwCqP,GAC/DpC,GAASlN,QAAQC,MAAM,0BACvBkI,EAjFN,SAASsG,OAAOtG,GACd,IAAIoH,GAAW,YAAYxZ,KAAKyZ,UAAUC,WAAa,IAAM,QAAU,KACvE,OAAOtH,EAAQ9S,QAAQ,gBAAiBka,EAC1C,CA8EgBd,CAAO,YAAapD,EAAUA,EAAQlD,QAnFjC,oCAoFf0G,OAAOa,OAAOvH,EAAS8E,EACzB,CACF,CAAE,QACIG,IACkC,mBAAzBA,EAAUuC,YACnBvC,EAAUuC,YAAYtH,GAEtB+E,EAAUwC,mBAIVvC,GACFE,SAAS0B,KAAKY,YAAYxC,GAE5BF,GACF,CAEA,OAAOG,CACT,mBChHA,IAAIwC,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,EAAQ,OACR,EAAQ,OACR,EAAQ,OACR,EAAQ,OACR,EAAQ,OACR,IAAI3D,EAAO,EAAQ,OAEnB7X,EAAOD,QAAU8X,EAAK4D,gCCPtB,EAAQ,OACR,IAAIC,EAAe,EAAQ,OAE3B1b,EAAOD,QAAU2b,EAAa,YAAY9F,sBCH1C,IAAI+F,EAAgB,EAAQ,MACxBC,EAAS,EAAQ,OAEjBC,EAAoBC,SAASnX,UAEjC3E,EAAOD,QAAU,SAAUgc,GACzB,IAAIC,EAAMD,EAAGnG,KACb,OAAOmG,IAAOF,GAAsBF,EAAcE,EAAmBE,IAAOC,IAAQH,EAAkBjG,KAAQgG,EAASI,CACzH,mBCRA,EAAQ,OACR,IAAInE,EAAO,EAAQ,OAEnB7X,EAAOD,QAAU8X,EAAKpT,OAAOwX,wBCH7Bjc,EAAOD,QAAU,EAAjB,wBCAAC,EAAOD,QAAU,EAAjB,wBCAAC,EAAOD,QAAU,EAAjB,wBCCA,EAAQ,OAER,IAAIyb,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCLjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,IAAIU,EAAa,EAAQ,OACrBC,EAAc,EAAQ,OAEtBC,EAAatX,UAGjB9E,EAAOD,QAAU,SAAUsc,GACzB,GAAIH,EAAWG,GAAW,OAAOA,EACjC,MAAMD,EAAWD,EAAYE,GAAY,qBAC3C,mBCTA,IAAIH,EAAa,EAAQ,OAErBI,EAAUpb,OACVkb,EAAatX,UAEjB9E,EAAOD,QAAU,SAAUsc,GACzB,GAAuB,iBAAZA,GAAwBH,EAAWG,GAAW,OAAOA,EAChE,MAAMD,EAAW,aAAeE,EAAQD,GAAY,kBACtD,aCRArc,EAAOD,QAAU,WAA0B,mBCA3C,IAAIwc,EAAW,EAAQ,OAEnBD,EAAUpb,OACVkb,EAAatX,UAGjB9E,EAAOD,QAAU,SAAUsc,GACzB,GAAIE,EAASF,GAAW,OAAOA,EAC/B,MAAMD,EAAWE,EAAQD,GAAY,oBACvC,mBCTA,IAAIG,EAAkB,EAAQ,OAC1BC,EAAkB,EAAQ,OAC1BC,EAAoB,EAAQ,OAG5BC,aAAe,SAAUC,GAC3B,OAAO,SAAUC,EAAOC,EAAIC,GAC1B,IAGI9X,EAHA+X,EAAIR,EAAgBK,GACpBja,EAAS8Z,EAAkBM,GAC3B/F,EAAQwF,EAAgBM,EAAWna,GAIvC,GAAIga,GAAeE,GAAMA,GAAI,KAAOla,EAASqU,GAG3C,IAFAhS,EAAQ+X,EAAE/F,OAEGhS,EAAO,OAAO,OAEtB,KAAMrC,EAASqU,EAAOA,IAC3B,IAAK2F,GAAe3F,KAAS+F,IAAMA,EAAE/F,KAAW6F,EAAI,OAAOF,GAAe3F,GAAS,EACnF,OAAQ2F,IAAgB,CAC5B,CACF,EAEA5c,EAAOD,QAAU,CAGfwN,SAAUoP,cAAa,GAGvBrb,QAASqb,cAAa,qBC9BxB,IAAIM,EAAc,EAAQ,OAE1Bjd,EAAOD,QAAUkd,EAAY,GAAGzX,wBCFhC,IAAIyX,EAAc,EAAQ,OAEtB9V,EAAW8V,EAAY,CAAC,EAAE9V,UAC1B+V,EAAcD,EAAY,GAAGzX,OAEjCxF,EAAOD,QAAU,SAAUgc,GACzB,OAAOmB,EAAY/V,EAAS4U,GAAK,GAAI,EACvC,kBCPA,IAAIoB,EAAwB,EAAQ,OAChCjB,EAAa,EAAQ,OACrBkB,EAAa,EAAQ,OAGrBC,EAFkB,EAAQ,MAEVC,CAAgB,eAChCC,EAAU9Y,OAGV+Y,EAAuE,aAAnDJ,EAAW,WAAc,OAAO/V,SAAW,CAAhC,IAUnCrH,EAAOD,QAAUod,EAAwBC,EAAa,SAAUrB,GAC9D,IAAIiB,EAAGS,EAAKC,EACZ,YAAchX,IAAPqV,EAAmB,YAAqB,OAAPA,EAAc,OAEO,iBAAjD0B,EAXD,SAAU1B,EAAInF,GACzB,IACE,OAAOmF,EAAGnF,EACZ,CAAE,MAAOjL,GAAqB,CAChC,CAOoBgS,CAAOX,EAAIO,EAAQxB,GAAKsB,IAA8BI,EAEpED,EAAoBJ,EAAWJ,GAEH,WAA3BU,EAASN,EAAWJ,KAAmBd,EAAWc,EAAEY,QAAU,YAAcF,CACnF,mBC5BA,IAAIpH,EAAS,EAAQ,OACjBuH,EAAU,EAAQ,OAClBC,EAAiC,EAAQ,OACzCC,EAAuB,EAAQ,OAEnC/d,EAAOD,QAAU,SAAUmN,EAAQ8Q,EAAQC,GAIzC,IAHA,IAAIC,EAAOL,EAAQG,GACfpS,EAAiBmS,EAAqBI,EACtCC,EAA2BN,EAA+BK,EACrDjc,EAAI,EAAGA,EAAIgc,EAAKtb,OAAQV,IAAK,CACpC,IAAI0U,EAAMsH,EAAKhc,GACVoU,EAAOpJ,EAAQ0J,IAAUqH,GAAc3H,EAAO2H,EAAYrH,IAC7DhL,EAAesB,EAAQ0J,EAAKwH,EAAyBJ,EAAQpH,GAEjE,CACF,mBCfA,IAAIyH,EAAQ,EAAQ,OAEpBre,EAAOD,SAAWse,GAAM,WACtB,SAASC,IAAkB,CAG3B,OAFAA,EAAE3Z,UAAU4O,YAAc,KAEnB9O,OAAO8Z,eAAe,IAAID,KAASA,EAAE3Z,SAC9C,eCLA3E,EAAOD,QAAU,SAAUkF,EAAOuZ,GAChC,MAAO,CAAEvZ,MAAOA,EAAOuZ,KAAMA,EAC/B,mBCJA,IAAIC,EAAc,EAAQ,OACtBV,EAAuB,EAAQ,OAC/BW,EAA2B,EAAQ,OAEvC1e,EAAOD,QAAU0e,EAAc,SAAUE,EAAQ/H,EAAK3R,GACpD,OAAO8Y,EAAqBI,EAAEQ,EAAQ/H,EAAK8H,EAAyB,EAAGzZ,GACzE,EAAI,SAAU0Z,EAAQ/H,EAAK3R,GAEzB,OADA0Z,EAAO/H,GAAO3R,EACP0Z,CACT,aCTA3e,EAAOD,QAAU,SAAU6e,EAAQ3Z,GACjC,MAAO,CACL4G,aAAuB,EAAT+S,GACdlL,eAAyB,EAATkL,GAChBnL,WAAqB,EAATmL,GACZ3Z,MAAOA,EAEX,mBCPA,IAAI4Z,EAA8B,EAAQ,OAE1C7e,EAAOD,QAAU,SAAUmN,EAAQ0J,EAAK3R,EAAO8R,GAG7C,OAFIA,GAAWA,EAAQlL,WAAYqB,EAAO0J,GAAO3R,EAC5C4Z,EAA4B3R,EAAQ0J,EAAK3R,GACvCiI,CACT,mBCNA,IAAI4R,EAAS,EAAQ,OAGjBlT,EAAiBnH,OAAOmH,eAE5B5L,EAAOD,QAAU,SAAU6W,EAAK3R,GAC9B,IACE2G,EAAekT,EAAQlI,EAAK,CAAE3R,MAAOA,EAAOyO,cAAc,EAAMD,UAAU,GAC5E,CAAE,MAAO9H,GACPmT,EAAOlI,GAAO3R,CAChB,CAAE,OAAOA,CACX,mBCXA,IAAIoZ,EAAQ,EAAQ,OAGpBre,EAAOD,SAAWse,GAAM,WAEtB,OAA8E,GAAvE5Z,OAAOmH,eAAe,CAAC,EAAG,EAAG,CAAEE,IAAK,WAAc,OAAO,CAAG,IAAK,EAC1E,eCNA,IAAIiT,EAAiC,iBAAZ9F,UAAwBA,SAASO,IAItDwF,OAAmC,IAAfD,QAA8CrY,IAAhBqY,EAEtD/e,EAAOD,QAAU,CACfyZ,IAAKuF,EACLC,WAAYA,oBCRd,IAAIF,EAAS,EAAQ,OACjBvC,EAAW,EAAQ,OAEnBtD,EAAW6F,EAAO7F,SAElBgG,EAAS1C,EAAStD,IAAasD,EAAStD,EAASG,eAErDpZ,EAAOD,QAAU,SAAUgc,GACzB,OAAOkD,EAAShG,EAASG,cAAc2C,GAAM,CAAC,CAChD,aCPA/b,EAAOD,QAAU,CACfmf,YAAa,EACbC,oBAAqB,EACrBC,aAAc,EACdC,eAAgB,EAChBC,YAAa,EACbC,cAAe,EACfC,aAAc,EACdC,qBAAsB,EACtBC,SAAU,EACVC,kBAAmB,EACnBC,eAAgB,EAChBC,gBAAiB,EACjBC,kBAAmB,EACnBC,UAAW,EACXC,cAAe,EACfC,aAAc,EACdC,SAAU,EACVC,iBAAkB,EAClBC,OAAQ,EACRC,YAAa,EACbC,cAAe,EACfC,cAAe,EACfC,eAAgB,EAChBC,aAAc,EACdC,cAAe,EACfC,iBAAkB,EAClBC,iBAAkB,EAClBC,eAAgB,EAChBC,iBAAkB,EAClBC,cAAe,EACfC,UAAW,aCjCbhhB,EAAOD,QAA8B,oBAAbmb,WAA4Bha,OAAOga,UAAUC,YAAc,oBCAnF,IAOIna,EAAOigB,EAPPnC,EAAS,EAAQ,OACjB3D,EAAY,EAAQ,MAEpB+F,EAAUpC,EAAOoC,QACjBC,EAAOrC,EAAOqC,KACdC,EAAWF,GAAWA,EAAQE,UAAYD,GAAQA,EAAKF,QACvDI,EAAKD,GAAYA,EAASC,GAG1BA,IAIFJ,GAHAjgB,EAAQqgB,EAAGvM,MAAM,MAGD,GAAK,GAAK9T,EAAM,GAAK,EAAI,IAAMA,EAAM,GAAKA,EAAM,MAK7DigB,GAAW9F,MACdna,EAAQma,EAAUna,MAAM,iBACVA,EAAM,IAAM,MACxBA,EAAQma,EAAUna,MAAM,oBACbigB,GAAWjgB,EAAM,IAIhChB,EAAOD,QAAUkhB,mBC1BjB,IAAIpJ,EAAO,EAAQ,OAEnB7X,EAAOD,QAAU,SAAUuhB,GACzB,OAAOzJ,EAAKyJ,EAAc,YAC5B,aCHAthB,EAAOD,QAAU,CACf,cACA,iBACA,gBACA,uBACA,iBACA,WACA,4BCRF,IAAIkd,EAAc,EAAQ,OAEtBsE,EAAS/d,MACTzC,EAAUkc,EAAY,GAAGlc,SAEzBygB,EAAgCtgB,OAAOqgB,EAAuB,UAAX3N,OAEnD6N,EAA2B,uBAC3BC,EAAwBD,EAAyBhgB,KAAK+f,GAE1DxhB,EAAOD,QAAU,SAAU6T,EAAO+N,GAChC,GAAID,GAAyC,iBAAT9N,IAAsB2N,EAAOK,kBAC/D,KAAOD,KAAe/N,EAAQ7S,EAAQ6S,EAAO6N,EAA0B,IACvE,OAAO7N,CACX,mBCdA,IAAIiL,EAA8B,EAAQ,OACtCgD,EAAkB,EAAQ,OAC1BC,EAA0B,EAAQ,OAGlCC,EAAoBve,MAAMue,kBAE9B/hB,EAAOD,QAAU,SAAU4L,EAAOqW,EAAGpO,EAAO+N,GACtCG,IACEC,EAAmBA,EAAkBpW,EAAOqW,GAC3CnD,EAA4BlT,EAAO,QAASkW,EAAgBjO,EAAO+N,IAE5E,mBCZA,IAAItD,EAAQ,EAAQ,OAChBK,EAA2B,EAAQ,OAEvC1e,EAAOD,SAAWse,GAAM,WACtB,IAAI1S,EAAQnI,MAAM,KAClB,QAAM,UAAWmI,KAEjBlH,OAAOmH,eAAeD,EAAO,QAAS+S,EAAyB,EAAG,IAC3C,IAAhB/S,EAAMiI,MACf,kCCRA,IAAIkL,EAAS,EAAQ,OACjB3T,EAAQ,EAAQ,OAChB8R,EAAc,EAAQ,OACtBf,EAAa,EAAQ,OACrBkC,EAA2B,WAC3B6D,EAAW,EAAQ,OACnBpK,EAAO,EAAQ,OACfjC,EAAO,EAAQ,OACfiJ,EAA8B,EAAQ,OACtCvI,EAAS,EAAQ,OAEjB4L,gBAAkB,SAAUC,GAC9B,IAAIC,QAAU,SAAUhW,EAAG/F,EAAG8D,GAC5B,GAAIhK,gBAAgBiiB,QAAS,CAC3B,OAAQ/a,UAAUzE,QAChB,KAAK,EAAG,OAAO,IAAIuf,EACnB,KAAK,EAAG,OAAO,IAAIA,EAAkB/V,GACrC,KAAK,EAAG,OAAO,IAAI+V,EAAkB/V,EAAG/F,GACxC,OAAO,IAAI8b,EAAkB/V,EAAG/F,EAAG8D,EACvC,CAAE,OAAOgB,EAAMgX,EAAmBhiB,KAAMkH,UAC1C,EAEA,OADA+a,QAAQzd,UAAYwd,EAAkBxd,UAC/Byd,OACT,EAiBApiB,EAAOD,QAAU,SAAUgX,EAASiH,GAClC,IAUIqE,EAAQC,EAAYC,GACpB3L,GAAK4L,GAAgBC,GAAgBC,GAAgBC,GAAgBC,GAXrEC,GAAS9L,EAAQ7J,OACjB4V,GAAS/L,EAAQ+H,OACjBiE,GAAShM,EAAQiM,KACjBC,GAAQlM,EAAQxL,MAEhB2X,GAAeJ,GAAShE,EAASiE,GAASjE,EAAO+D,KAAW/D,EAAO+D,KAAW,CAAC,GAAGle,UAElFuI,GAAS4V,GAASjL,EAAOA,EAAKgL,KAAWhE,EAA4BhH,EAAMgL,GAAQ,CAAC,GAAGA,IACvFM,GAAkBjW,GAAOvI,UAK7B,IAAKiS,MAAOoH,EAGVsE,IAFAD,EAASJ,EAASa,GAASlM,GAAMiM,IAAUE,GAAS,IAAM,KAAOnM,GAAKG,EAAQqM,UAEtDF,IAAgB5M,EAAO4M,GAActM,IAE7D6L,GAAiBvV,GAAO0J,IAEpB0L,IAEFI,GAFkB3L,EAAQsM,gBAC1BT,GAAaxE,EAAyB8E,GAActM,MACrBgM,GAAW3d,MACpBie,GAAatM,KAGrC4L,GAAkBF,GAAcI,GAAkBA,GAAiB1E,EAAOpH,IAEtE0L,UAAqBG,WAAyBD,KAGlBG,GAA5B5L,EAAQnB,MAAQ0M,EAA6B1M,EAAK4M,GAAgB1D,GAE7D/H,EAAQuM,MAAQhB,EAA6BJ,gBAAgBM,IAE7DS,IAAS/G,EAAWsG,IAAkCvF,EAAYuF,IAErDA,IAGlBzL,EAAQwM,MAASf,IAAkBA,GAAee,MAAUd,IAAkBA,GAAec,OAC/F1E,EAA4B8D,GAAgB,QAAQ,GAGtD9D,EAA4B3R,GAAQ0J,GAAK+L,IAErCM,KAEG3M,EAAOuB,EADZ0K,GAAoBM,GAAS,cAE3BhE,EAA4BhH,EAAM0K,GAAmB,CAAC,GAGxD1D,EAA4BhH,EAAK0K,IAAoB3L,GAAK4L,IAEtDzL,EAAQyM,MAAQL,KAAoBd,IAAWc,GAAgBvM,MACjEiI,EAA4BsE,GAAiBvM,GAAK4L,KAI1D,aCrGAxiB,EAAOD,QAAU,SAAU0jB,GACzB,IACE,QAASA,GACX,CAAE,MAAO9X,GACP,OAAO,CACT,CACF,mBCNA,IAAI+X,EAAc,EAAQ,OAEtB7H,EAAoBC,SAASnX,UAC7BwG,EAAQ0Q,EAAkB1Q,MAC1B3C,EAAOqT,EAAkBrT,KAG7BxI,EAAOD,QAA4B,iBAAX4jB,SAAuBA,QAAQxY,QAAUuY,EAAclb,EAAKoN,KAAKzK,GAAS,WAChG,OAAO3C,EAAK2C,MAAMA,EAAO9D,UAC3B,oBCTA,IAAI4V,EAAc,EAAQ,OACtB2G,EAAY,EAAQ,OACpBF,EAAc,EAAQ,OAEtB9N,EAAOqH,EAAYA,EAAYrH,MAGnC5V,EAAOD,QAAU,SAAUqV,EAAIyO,GAE7B,OADAD,EAAUxO,QACM1O,IAATmd,EAAqBzO,EAAKsO,EAAc9N,EAAKR,EAAIyO,GAAQ,WAC9D,OAAOzO,EAAGjK,MAAM0Y,EAAMxc,UACxB,CACF,mBCZA,IAAIgX,EAAQ,EAAQ,OAEpBre,EAAOD,SAAWse,GAAM,WAEtB,IAAI5c,EAAO,WAA4B,EAAEmU,OAEzC,MAAsB,mBAARnU,GAAsBA,EAAK8U,eAAe,YAC1D,kCCNA,IAAI0G,EAAc,EAAQ,OACtB2G,EAAY,EAAQ,OACpBrH,EAAW,EAAQ,OACnBjG,EAAS,EAAQ,OACjBwN,EAAa,EAAQ,OACrBJ,EAAc,EAAQ,OAEtBK,EAAYjI,SACZvP,EAAS0Q,EAAY,GAAG1Q,QACxBnJ,EAAO6Z,EAAY,GAAG7Z,MACtB4gB,EAAY,CAAC,EAYjBhkB,EAAOD,QAAU2jB,EAAcK,EAAUnO,KAAO,SAASA,KAAKiO,GAC5D,IAAIvF,EAAIsF,EAAUzjB,MACd8jB,EAAY3F,EAAE3Z,UACduf,EAAWJ,EAAWzc,UAAW,GACjC8c,EAAgB,SAASC,QAC3B,IAAIC,EAAO9X,EAAO2X,EAAUJ,EAAWzc,YACvC,OAAOlH,gBAAgBgkB,EAhBX,SAAUnC,EAAGsC,EAAYD,GACvC,IAAK/N,EAAO0N,EAAWM,GAAa,CAClC,IAAK,IAAI9X,EAAO,GAAItK,EAAI,EAAGA,EAAIoiB,EAAYpiB,IAAKsK,EAAKtK,GAAK,KAAOA,EAAI,IACrE8hB,EAAUM,GAAcP,EAAU,MAAO,gBAAkB3gB,EAAKoJ,EAAM,KAAO,IAC/E,CAAE,OAAOwX,EAAUM,GAAYtC,EAAGqC,EACpC,CAW2CE,CAAUjG,EAAG+F,EAAKzhB,OAAQyhB,GAAQ/F,EAAEnT,MAAM0Y,EAAMQ,EACzF,EAEA,OADI9H,EAAS0H,KAAYE,EAAcxf,UAAYsf,GAC5CE,CACT,mBCjCA,IAAIT,EAAc,EAAQ,OAEtBlb,EAAOsT,SAASnX,UAAU6D,KAE9BxI,EAAOD,QAAU2jB,EAAclb,EAAKoN,KAAKpN,GAAQ,WAC/C,OAAOA,EAAK2C,MAAM3C,EAAMnB,UAC1B,mBCNA,IAAIoX,EAAc,EAAQ,OACtBnI,EAAS,EAAQ,OAEjBuF,EAAoBC,SAASnX,UAE7B6f,EAAgB/F,GAAeha,OAAO2Z,yBAEtCa,EAAS3I,EAAOuF,EAAmB,QAEnC4I,EAASxF,GAA0D,cAAhD,SAAUyF,YAA2B,EAAE/Q,KAC1DgR,EAAe1F,KAAYR,GAAgBA,GAAe+F,EAAc3I,EAAmB,QAAQnI,cAEvG1T,EAAOD,QAAU,CACfkf,OAAQA,EACRwF,OAAQA,EACRE,aAAcA,oBCfhB,IAAI1H,EAAc,EAAQ,OACtB2G,EAAY,EAAQ,OAExB5jB,EAAOD,QAAU,SAAU4e,EAAQ/H,EAAKgF,GACtC,IAEE,OAAOqB,EAAY2G,EAAUnf,OAAO2Z,yBAAyBO,EAAQ/H,GAAKgF,IAC5E,CAAE,MAAOjQ,GAAqB,CAChC,mBCRA,IAAIyR,EAAa,EAAQ,OACrBH,EAAc,EAAQ,OAE1Bjd,EAAOD,QAAU,SAAUqV,GAIzB,GAAuB,aAAnBgI,EAAWhI,GAAoB,OAAO6H,EAAY7H,EACxD,mBCRA,IAAIsO,EAAc,EAAQ,OAEtB7H,EAAoBC,SAASnX,UAC7B6D,EAAOqT,EAAkBrT,KACzBoc,EAAsBlB,GAAe7H,EAAkBjG,KAAKA,KAAKpN,EAAMA,GAE3ExI,EAAOD,QAAU2jB,EAAckB,EAAsB,SAAUxP,GAC7D,OAAO,WACL,OAAO5M,EAAK2C,MAAMiK,EAAI/N,UACxB,CACF,iBCVA,IAAIwQ,EAAO,EAAQ,OACfiH,EAAS,EAAQ,OACjB5C,EAAa,EAAQ,OAErB2I,UAAY,SAAUC,GACxB,OAAO5I,EAAW4I,GAAYA,OAAWpe,CAC3C,EAEA1G,EAAOD,QAAU,SAAUglB,EAAWnJ,GACpC,OAAOvU,UAAUzE,OAAS,EAAIiiB,UAAUhN,EAAKkN,KAAeF,UAAU/F,EAAOiG,IACzElN,EAAKkN,IAAclN,EAAKkN,GAAWnJ,IAAWkD,EAAOiG,IAAcjG,EAAOiG,GAAWnJ,EAC3F,mBCXA,IAAIoJ,EAAU,EAAQ,MAClBC,EAAY,EAAQ,OACpBC,EAAoB,EAAQ,OAC5BC,EAAY,EAAQ,OAGpBC,EAFkB,EAAQ,MAEf9H,CAAgB,YAE/Btd,EAAOD,QAAU,SAAUgc,GACzB,IAAKmJ,EAAkBnJ,GAAK,OAAOkJ,EAAUlJ,EAAIqJ,IAC5CH,EAAUlJ,EAAI,eACdoJ,EAAUH,EAAQjJ,GACzB,mBCZA,IAAIvT,EAAO,EAAQ,OACfob,EAAY,EAAQ,OACpByB,EAAW,EAAQ,OACnBlJ,EAAc,EAAQ,OACtBmJ,EAAoB,EAAQ,OAE5BlJ,EAAatX,UAEjB9E,EAAOD,QAAU,SAAUsc,EAAUkJ,GACnC,IAAIC,EAAiBne,UAAUzE,OAAS,EAAI0iB,EAAkBjJ,GAAYkJ,EAC1E,GAAI3B,EAAU4B,GAAiB,OAAOH,EAAS7c,EAAKgd,EAAgBnJ,IACpE,MAAMD,EAAWD,EAAYE,GAAY,mBAC3C,mBCZA,IAAIuH,EAAY,EAAQ,OACpBsB,EAAoB,EAAQ,OAIhCllB,EAAOD,QAAU,SAAU0lB,EAAGC,GAC5B,IAAItP,EAAOqP,EAAEC,GACb,OAAOR,EAAkB9O,QAAQ1P,EAAYkd,EAAUxN,EACzD,yBCRA,IAAIuP,MAAQ,SAAU5J,GACpB,OAAOA,GAAMA,EAAGzR,MAAQA,MAAQyR,CAClC,EAGA/b,EAAOD,QAEL4lB,MAA2B,iBAAdC,YAA0BA,aACvCD,MAAuB,iBAAVpL,QAAsBA,SAEnCoL,MAAqB,iBAARE,MAAoBA,OACjCF,MAAuB,iBAAV,EAAAG,GAAsB,EAAAA,IAEnC,WAAe,OAAO3lB,IAAO,CAA7B,IAAoCA,MAAQ2b,SAAS,cAATA,oBCb9C,IAAImB,EAAc,EAAQ,OACtB8I,EAAW,EAAQ,OAEnBxP,EAAiB0G,EAAY,CAAC,EAAE1G,gBAKpCvW,EAAOD,QAAU0E,OAAO6R,QAAU,SAASA,OAAOyF,EAAInF,GACpD,OAAOL,EAAewP,EAAShK,GAAKnF,EACtC,aCVA5W,EAAOD,QAAU,CAAC,mBCAlB,IAAIimB,EAAa,EAAQ,KAEzBhmB,EAAOD,QAAUimB,EAAW,WAAY,mCCFxC,IAAIvH,EAAc,EAAQ,OACtBJ,EAAQ,EAAQ,OAChBjF,EAAgB,EAAQ,OAG5BpZ,EAAOD,SAAW0e,IAAgBJ,GAAM,WAEtC,OAEQ,GAFD5Z,OAAOmH,eAAewN,EAAc,OAAQ,IAAK,CACtDtN,IAAK,WAAc,OAAO,CAAG,IAC5BM,CACL,qBCVA,IAAI6Q,EAAc,EAAQ,OACtBoB,EAAQ,EAAQ,OAChB2G,EAAU,EAAQ,OAElBzH,EAAU9Y,OACVqQ,EAAQmI,EAAY,GAAGnI,OAG3B9U,EAAOD,QAAUse,GAAM,WAGrB,OAAQd,EAAQ,KAAK0I,qBAAqB,EAC5C,IAAK,SAAUlK,GACb,MAAsB,UAAfiJ,EAAQjJ,GAAkBjH,EAAMiH,EAAI,IAAMwB,EAAQxB,EAC3D,EAAIwB,mBCdJ,IAAIrB,EAAa,EAAQ,OACrBK,EAAW,EAAQ,OACnB7X,EAAiB,EAAQ,OAG7B1E,EAAOD,QAAU,SAAU8c,EAAOqJ,EAAO9D,GACvC,IAAI+D,EAAWC,EAUf,OAPE1hB,GAEAwX,EAAWiK,EAAYD,EAAM3S,cAC7B4S,IAAc/D,GACd7F,EAAS6J,EAAqBD,EAAUxhB,YACxCyhB,IAAuBhE,EAAQzd,WAC/BD,EAAemY,EAAOuJ,GACjBvJ,CACT,mBCjBA,IAAIN,EAAW,EAAQ,OACnBsC,EAA8B,EAAQ,OAI1C7e,EAAOD,QAAU,SAAUid,EAAGjG,GACxBwF,EAASxF,IAAY,UAAWA,GAClC8H,EAA4B7B,EAAG,QAASjG,EAAQsP,MAEpD,mBCTA,IAYI3Z,EAAKZ,EAAKwa,EAZVC,EAAkB,EAAQ,OAC1BzH,EAAS,EAAQ,OACjBvC,EAAW,EAAQ,OACnBsC,EAA8B,EAAQ,OACtCvI,EAAS,EAAQ,OACjBkQ,EAAS,EAAQ,OACjBC,EAAY,EAAQ,OACpBC,GAAa,EAAQ,OAErBC,GAA6B,6BAC7B7hB,GAAYga,EAAOha,UACnB8hB,GAAU9H,EAAO8H,QAgBrB,GAAIL,GAAmBC,EAAOK,MAAO,CACnC,IAAIC,GAAQN,EAAOK,QAAUL,EAAOK,MAAQ,IAAID,IAEhDE,GAAMhb,IAAMgb,GAAMhb,IAClBgb,GAAMR,IAAMQ,GAAMR,IAClBQ,GAAMpa,IAAMoa,GAAMpa,IAElBA,EAAM,SAAUqP,EAAIgL,GAClB,GAAID,GAAMR,IAAIvK,GAAK,MAAMjX,GAAU6hB,IAGnC,OAFAI,EAASC,OAASjL,EAClB+K,GAAMpa,IAAIqP,EAAIgL,GACPA,CACT,EACAjb,EAAM,SAAUiQ,GACd,OAAO+K,GAAMhb,IAAIiQ,IAAO,CAAC,CAC3B,EACAuK,EAAM,SAAUvK,GACd,OAAO+K,GAAMR,IAAIvK,EACnB,CACF,KAAO,CACL,IAAIkL,GAAQR,EAAU,SACtBC,GAAWO,KAAS,EACpBva,EAAM,SAAUqP,EAAIgL,GAClB,GAAIzQ,EAAOyF,EAAIkL,IAAQ,MAAMniB,GAAU6hB,IAGvC,OAFAI,EAASC,OAASjL,EAClB8C,EAA4B9C,EAAIkL,GAAOF,GAChCA,CACT,EACAjb,EAAM,SAAUiQ,GACd,OAAOzF,EAAOyF,EAAIkL,IAASlL,EAAGkL,IAAS,CAAC,CAC1C,EACAX,EAAM,SAAUvK,GACd,OAAOzF,EAAOyF,EAAIkL,GACpB,CACF,CAEAjnB,EAAOD,QAAU,CACf2M,IAAKA,EACLZ,IAAKA,EACLwa,IAAKA,EACLY,QArDY,SAAUnL,GACtB,OAAOuK,EAAIvK,GAAMjQ,EAAIiQ,GAAMrP,EAAIqP,EAAI,CAAC,EACtC,EAoDEoL,UAlDc,SAAUC,GACxB,OAAO,SAAUrL,GACf,IAAI8K,EACJ,IAAKtK,EAASR,KAAQ8K,EAAQ/a,EAAIiQ,IAAKnV,OAASwgB,EAC9C,MAAMtiB,GAAU,0BAA4BsiB,EAAO,aACnD,OAAOP,CACX,CACF,mBCzBA,IAAIvJ,EAAkB,EAAQ,OAC1B6H,EAAY,EAAQ,OAEpBC,EAAW9H,EAAgB,YAC3B+J,EAAiB/jB,MAAMqB,UAG3B3E,EAAOD,QAAU,SAAUgc,GACzB,YAAcrV,IAAPqV,IAAqBoJ,EAAU7hB,QAAUyY,GAAMsL,EAAejC,KAAcrJ,EACrF,mBCTA,IAAIuL,EAAe,EAAQ,OAEvBvI,EAAcuI,EAAa9N,IAI/BxZ,EAAOD,QAAUunB,EAAatI,WAAa,SAAU3C,GACnD,MAA0B,mBAAZA,GAA0BA,IAAa0C,CACvD,EAAI,SAAU1C,GACZ,MAA0B,mBAAZA,CAChB,mBCVA,IAAIgC,EAAQ,EAAQ,OAChBnC,EAAa,EAAQ,OAErBqL,EAAc,kBAEdtF,SAAW,SAAUuF,EAASC,GAChC,IAAIxiB,EAAQ6B,EAAK4gB,EAAUF,IAC3B,OAAOviB,GAAS0iB,GACZ1iB,GAAS2iB,IACT1L,EAAWuL,GAAapJ,EAAMoJ,KAC5BA,EACR,EAEIC,EAAYzF,SAASyF,UAAY,SAAUviB,GAC7C,OAAOjE,OAAOiE,GAAQpE,QAAQwmB,EAAa,KAAK9f,aAClD,EAEIX,EAAOmb,SAASnb,KAAO,CAAC,EACxB8gB,EAAS3F,SAAS2F,OAAS,IAC3BD,EAAW1F,SAAS0F,SAAW,IAEnC3nB,EAAOD,QAAUkiB,oBCnBjBjiB,EAAOD,QAAU,SAAUgc,GACzB,OAAOA,OACT,mBCJA,IAAIG,EAAa,EAAQ,OACrBoL,EAAe,EAAQ,OAEvBvI,EAAcuI,EAAa9N,IAE/BxZ,EAAOD,QAAUunB,EAAatI,WAAa,SAAUjD,GACnD,MAAoB,iBAANA,EAAwB,OAAPA,EAAcG,EAAWH,IAAOA,IAAOgD,CACxE,EAAI,SAAUhD,GACZ,MAAoB,iBAANA,EAAwB,OAAPA,EAAcG,EAAWH,EAC1D,aCTA/b,EAAOD,SAAU,mBCAjB,IAAIimB,EAAa,EAAQ,KACrB9J,EAAa,EAAQ,OACrBP,EAAgB,EAAQ,MACxBkM,EAAoB,EAAQ,OAE5BtK,EAAU9Y,OAEdzE,EAAOD,QAAU8nB,EAAoB,SAAU9L,GAC7C,MAAoB,iBAANA,CAChB,EAAI,SAAUA,GACZ,IAAI+L,EAAU9B,EAAW,UACzB,OAAO9J,EAAW4L,IAAYnM,EAAcmM,EAAQnjB,UAAW4Y,EAAQxB,GACzE,mBCZA,IAAInG,EAAO,EAAQ,OACfpN,EAAO,EAAQ,OACf6c,EAAW,EAAQ,OACnBlJ,EAAc,EAAQ,OACtB4L,EAAwB,EAAQ,MAChCrL,EAAoB,EAAQ,OAC5Bf,EAAgB,EAAQ,MACxBqM,EAAc,EAAQ,OACtB1C,EAAoB,EAAQ,OAC5B2C,EAAgB,EAAQ,MAExB7L,GAAatX,UAEbojB,OAAS,SAAUC,EAASzK,GAC9Bvd,KAAKgoB,QAAUA,EACfhoB,KAAKud,OAASA,CAChB,EAEI0K,GAAkBF,OAAOvjB,UAE7B3E,EAAOD,QAAU,SAAUsoB,EAAUC,EAAiBvR,GACpD,IAMIwR,GAAUC,GAAQvR,GAAOrU,GAAQ8a,GAAQ+K,GAAMC,GAN/C7E,GAAO9M,GAAWA,EAAQ8M,KAC1B8E,MAAgB5R,IAAWA,EAAQ4R,YACnCC,MAAe7R,IAAWA,EAAQ6R,WAClCC,MAAiB9R,IAAWA,EAAQ8R,aACpCC,MAAiB/R,IAAWA,EAAQ+R,aACpC1T,GAAKQ,EAAK0S,EAAiBzE,IAG3BkF,KAAO,SAAUC,GAEnB,OADIT,IAAUN,EAAcM,GAAU,SAAUS,GACzC,IAAId,QAAO,EAAMc,EAC1B,EAEIC,OAAS,SAAUhkB,GACrB,OAAI0jB,IACFtD,EAASpgB,GACF6jB,GAAc1T,GAAGnQ,EAAM,GAAIA,EAAM,GAAI8jB,MAAQ3T,GAAGnQ,EAAM,GAAIA,EAAM,KAChE6jB,GAAc1T,GAAGnQ,EAAO8jB,MAAQ3T,GAAGnQ,EAC9C,EAEA,GAAI2jB,GACFL,GAAWF,EAASE,cACf,GAAIM,GACTN,GAAWF,MACN,CAEL,KADAG,GAASlD,EAAkB+C,IACd,MAAMjM,GAAWD,EAAYkM,GAAY,oBAEtD,GAAIN,EAAsBS,IAAS,CACjC,IAAKvR,GAAQ,EAAGrU,GAAS8Z,EAAkB2L,GAAWzlB,GAASqU,GAAOA,KAEpE,IADAyG,GAASuL,OAAOZ,EAASpR,OACX0E,EAAcyM,GAAiB1K,IAAS,OAAOA,GAC7D,OAAO,IAAIwK,QAAO,EACtB,CACAK,GAAWP,EAAYK,EAAUG,GACnC,CAGA,IADAC,GAAOG,GAAYP,EAASI,KAAOF,GAASE,OACnCC,GAAOlgB,EAAKigB,GAAMF,KAAW/J,MAAM,CAC1C,IACEd,GAASuL,OAAOP,GAAKzjB,MACvB,CAAE,MAAO0G,GACPsc,EAAcM,GAAU,QAAS5c,EACnC,CACA,GAAqB,iBAAV+R,IAAsBA,IAAU/B,EAAcyM,GAAiB1K,IAAS,OAAOA,EAC5F,CAAE,OAAO,IAAIwK,QAAO,EACtB,kBCnEA,IAAI1f,EAAO,EAAQ,OACf6c,EAAW,EAAQ,OACnBJ,EAAY,EAAQ,OAExBjlB,EAAOD,QAAU,SAAUwoB,EAAUW,EAAMjkB,GACzC,IAAIkkB,EAAaC,EACjB/D,EAASkD,GACT,IAEE,KADAY,EAAclE,EAAUsD,EAAU,WAChB,CAChB,GAAa,UAATW,EAAkB,MAAMjkB,EAC5B,OAAOA,CACT,CACAkkB,EAAc3gB,EAAK2gB,EAAaZ,EAClC,CAAE,MAAO5c,GACPyd,GAAa,EACbD,EAAcxd,CAChB,CACA,GAAa,UAATud,EAAkB,MAAMjkB,EAC5B,GAAImkB,EAAY,MAAMD,EAEtB,OADA9D,EAAS8D,GACFlkB,CACT,gCCrBA,IAAIokB,EAAoB,2BACpBC,EAAS,EAAQ,OACjB5K,EAA2B,EAAQ,OACnC6K,EAAiB,EAAQ,OACzBpE,EAAY,EAAQ,OAEpBqE,WAAa,WAAc,OAAOrpB,IAAM,EAE5CH,EAAOD,QAAU,SAAU0pB,EAAqBC,EAAMjB,EAAMkB,GAC1D,IAAItM,EAAgBqM,EAAO,YAI3B,OAHAD,EAAoB9kB,UAAY2kB,EAAOD,EAAmB,CAAEZ,KAAM/J,IAA2BiL,EAAiBlB,KAC9Gc,EAAeE,EAAqBpM,GAAe,GAAO,GAC1D8H,EAAU9H,GAAiBmM,WACpBC,CACT,gCCdA,IAAIG,EAAI,EAAQ,OACZphB,EAAO,EAAQ,OACfqhB,EAAU,EAAQ,OAClBC,EAAe,EAAQ,OACvB5N,EAAa,EAAQ,OACrB6N,EAA4B,EAAQ,OACpCxL,EAAiB,EAAQ,KACzB7Z,EAAiB,EAAQ,OACzB6kB,EAAiB,EAAQ,OACzB1K,EAA8B,EAAQ,OACtCmL,GAAgB,EAAQ,OACxB1M,GAAkB,EAAQ,OAC1B6H,GAAY,EAAQ,OACpB8E,GAAgB,EAAQ,OAExBC,GAAuBJ,EAAarF,OACpC0F,GAA6BL,EAAanF,aAC1C0E,GAAoBY,GAAcZ,kBAClCe,GAAyBH,GAAcG,uBACvChF,GAAW9H,GAAgB,YAC3B+M,GAAO,OACPC,GAAS,SACTC,GAAU,UAEVf,WAAa,WAAc,OAAOrpB,IAAM,EAE5CH,EAAOD,QAAU,SAAUyqB,EAAUd,EAAMD,EAAqBhB,EAAMgC,GAASC,GAAQrI,IACrF0H,EAA0BN,EAAqBC,EAAMjB,GAErD,IAkBIkC,GAA0BC,GAASC,GAlBnCC,mBAAqB,SAAUC,GACjC,GAAIA,IAASN,IAAWO,GAAiB,OAAOA,GAChD,IAAKZ,IAA0BW,KAAQE,GAAmB,OAAOA,GAAkBF,GACnF,OAAQA,GACN,KAAKV,GAAM,OAAO,SAASnM,OAAS,OAAO,IAAIuL,EAAoBtpB,KAAM4qB,EAAO,EAChF,KAAKT,GAAQ,OAAO,SAASY,SAAW,OAAO,IAAIzB,EAAoBtpB,KAAM4qB,EAAO,EACpF,KAAKR,GAAS,OAAO,SAASY,UAAY,OAAO,IAAI1B,EAAoBtpB,KAAM4qB,EAAO,EACtF,OAAO,WAAc,OAAO,IAAItB,EAAoBtpB,KAAO,CAC/D,EAEIkd,GAAgBqM,EAAO,YACvB0B,IAAwB,EACxBH,GAAoBT,EAAS7lB,UAC7B0mB,GAAiBJ,GAAkB7F,KAClC6F,GAAkB,eAClBR,IAAWQ,GAAkBR,IAC9BO,IAAmBZ,IAA0BiB,IAAkBP,mBAAmBL,IAClFa,GAA4B,SAAR5B,GAAkBuB,GAAkBE,SAA4BE,GA+BxF,GA3BIC,KACFX,GAA2BpM,EAAe+M,GAAkB9iB,KAAK,IAAIgiB,OACpC/lB,OAAOE,WAAagmB,GAAyBlC,OACvEoB,GAAWtL,EAAeoM,MAA8BtB,KACvD3kB,EACFA,EAAeimB,GAA0BtB,IAC/BnN,EAAWyO,GAAyBvF,MAC9C4E,GAAcW,GAA0BvF,GAAUoE,aAItDD,EAAeoB,GAA0BtN,IAAe,GAAM,GAC1DwM,IAAS1E,GAAU9H,IAAiBmM,aAKxCU,IAAwBO,IAAWH,IAAUe,IAAkBA,GAAe1X,OAAS2W,MACpFT,GAAWM,GACdtL,EAA4BoM,GAAmB,OAAQX,KAEvDc,IAAwB,EACxBJ,GAAkB,SAASE,SAAW,OAAO1iB,EAAK6iB,GAAgBlrB,KAAO,IAKzEsqB,GAMF,GALAG,GAAU,CACRM,OAAQJ,mBAAmBR,IAC3BpM,KAAMwM,GAASM,GAAkBF,mBAAmBT,IACpDc,QAASL,mBAAmBP,KAE1BlI,GAAQ,IAAKwI,MAAOD,IAClBR,IAA0BgB,MAA2BP,MAAOI,MAC9DjB,GAAciB,GAAmBJ,GAAKD,GAAQC,UAE3CjB,EAAE,CAAE1c,OAAQwc,EAAMne,OAAO,EAAM6X,OAAQgH,IAA0BgB,IAAyBR,IASnG,OALMf,IAAWxH,IAAW4I,GAAkB7F,MAAc4F,IAC1DhB,GAAciB,GAAmB7F,GAAU4F,GAAiB,CAAErX,KAAM8W,KAEtEtF,GAAUuE,GAAQsB,GAEXJ,EACT,gCCjGA,IAcIvB,EAAmBkC,EAAmCC,EAdtDnN,EAAQ,EAAQ,OAChBnC,EAAa,EAAQ,OACrBK,EAAW,EAAQ,OACnB+M,EAAS,EAAQ,OACjB/K,EAAiB,EAAQ,KACzByL,EAAgB,EAAQ,OACxB1M,EAAkB,EAAQ,OAC1BuM,GAAU,EAAQ,OAElBzE,GAAW9H,EAAgB,YAC3B8M,IAAyB,EAOzB,GAAGlM,OAGC,SAFNsN,EAAgB,GAAGtN,SAIjBqN,EAAoChN,EAAeA,EAAeiN,OACxB/mB,OAAOE,YAAW0kB,EAAoBkC,GAHlDnB,IAAyB,IAO7B7N,EAAS8M,IAAsBhL,GAAM,WACjE,IAAI5c,EAAO,CAAC,EAEZ,OAAO4nB,EAAkBjE,IAAU5c,KAAK/G,KAAUA,CACpD,IAE4B4nB,EAAoB,CAAC,EACxCQ,KAASR,EAAoBC,EAAOD,IAIxCnN,EAAWmN,EAAkBjE,MAChC4E,EAAcX,EAAmBjE,IAAU,WACzC,OAAOjlB,IACT,IAGFH,EAAOD,QAAU,CACfspB,kBAAmBA,EACnBe,uBAAwBA,eC/C1BpqB,EAAOD,QAAU,CAAC,mBCAlB,IAAI0rB,EAAW,EAAQ,OAIvBzrB,EAAOD,QAAU,SAAUwG,GACzB,OAAOklB,EAASllB,EAAI3D,OACtB,aCNA,IAAI8oB,EAAOphB,KAAKohB,KACZvX,EAAQ7J,KAAK6J,MAKjBnU,EAAOD,QAAUuK,KAAKqhB,OAAS,SAASA,MAAMtf,GAC5C,IAAInE,GAAKmE,EACT,OAAQnE,EAAI,EAAIiM,EAAQuX,GAAMxjB,EAChC,mBCTA,IAAIf,EAAW,EAAQ,OAEvBnH,EAAOD,QAAU,SAAUsc,EAAUuP,GACnC,YAAoBllB,IAAb2V,EAAyBhV,UAAUzE,OAAS,EAAI,GAAKgpB,EAAWzkB,EAASkV,EAClF,gCCHA,IAAIoC,EAAc,EAAQ,OACtBxB,EAAc,EAAQ,OACtBzU,EAAO,EAAQ,OACf6V,EAAQ,EAAQ,OAChBwN,EAAa,EAAQ,OACrBC,EAA8B,EAAQ,OACtCC,EAA6B,EAAQ,OACrChG,EAAW,EAAQ,OACnBiG,EAAgB,EAAQ,OAGxBC,EAAUxnB,OAAOwX,OAEjBrQ,GAAiBnH,OAAOmH,eACxBW,GAAS0Q,EAAY,GAAG1Q,QAI5BvM,EAAOD,SAAWksB,GAAW5N,GAAM,WAEjC,GAAII,GAQiB,IARFwN,EAAQ,CAAE5lB,EAAG,GAAK4lB,EAAQrgB,GAAe,CAAC,EAAG,IAAK,CACnEC,YAAY,EACZC,IAAK,WACHF,GAAezL,KAAM,IAAK,CACxB8E,MAAO,EACP4G,YAAY,GAEhB,IACE,CAAExF,EAAG,KAAMA,EAAS,OAAO,EAE/B,IAAI6lB,EAAI,CAAC,EACLC,EAAI,CAAC,EAELC,EAASpoB,SACTiR,EAAW,uBAGf,OAFAiX,EAAEE,GAAU,EACZnX,EAASH,MAAM,IAAIuX,SAAQ,SAAUC,GAAOH,EAAEG,GAAOA,CAAK,IACzB,GAA1BL,EAAQ,CAAC,EAAGC,GAAGE,IAAgBP,EAAWI,EAAQ,CAAC,EAAGE,IAAI/oB,KAAK,KAAO6R,CAC/E,IAAK,SAASgH,OAAO/O,EAAQ8Q,GAM3B,IALA,IAAIuO,EAAIxG,EAAS7Y,GACbsf,EAAkBnlB,UAAUzE,OAC5BqU,EAAQ,EACRwV,EAAwBX,EAA4B3N,EACpD8H,GAAuB8F,EAA2B5N,EAC/CqO,EAAkBvV,GAMvB,IALA,IAIIL,GAJA8V,GAAIV,EAAc3kB,UAAU4P,MAC5BiH,GAAOuO,EAAwBlgB,GAAOsf,EAAWa,IAAID,EAAsBC,KAAMb,EAAWa,IAC5F9pB,GAASsb,GAAKtb,OACdqG,GAAI,EAEDrG,GAASqG,IACd2N,GAAMsH,GAAKjV,MACNwV,IAAejW,EAAKyd,GAAsByG,GAAG9V,MAAM2V,EAAE3V,IAAO8V,GAAE9V,KAErE,OAAO2V,CACX,EAAIN,mBCvDJ,IAmDIU,EAnDAtH,EAAW,EAAQ,OACnBuH,EAAyB,EAAQ,OACjCC,EAAc,EAAQ,OACtBnG,EAAa,EAAQ,OACrBoG,EAAO,EAAQ,OACfC,EAAwB,EAAQ,OAChCtG,EAAY,EAAQ,OAIpBuG,EAAY,YACZC,EAAS,SACTC,GAAWzG,EAAU,YAErB0G,iBAAmB,WAA0B,EAE7CC,UAAY,SAAUC,GACxB,MARO,IAQKJ,EATL,IASmBI,EAAnBC,KAAwCL,EATxC,GAUT,EAGIM,0BAA4B,SAAUZ,GACxCA,EAAgBpnB,MAAM6nB,UAAU,KAChCT,EAAgBa,QAChB,IAAIC,EAAOd,EAAgBe,aAAajpB,OAExC,OADAkoB,EAAkB,KACXc,CACT,EAyBIE,gBAAkB,WACpB,IACEhB,EAAkB,IAAIiB,cAAc,WACtC,CAAE,MAAOjiB,GAAsB,CAzBF,IAIzBkiB,EAFAC,EACAC,EAuBJJ,gBAAqC,oBAAZ1U,SACrBA,SAASrB,QAAU+U,EACjBY,0BAA0BZ,IA1B5BmB,EAASf,EAAsB,UAC/BgB,EAAK,OAASd,EAAS,IAE3Ba,EAAOvU,MAAMyU,QAAU,OACvBlB,EAAKlS,YAAYkT,GAEjBA,EAAO/Y,IAAM7T,OAAO6sB,IACpBF,EAAiBC,EAAOG,cAAchV,UACvBiV,OACfL,EAAetoB,MAAM6nB,UAAU,sBAC/BS,EAAeL,QACRK,EAAevP,GAiBlBiP,0BAA0BZ,GAE9B,IADA,IAAI/pB,EAASiqB,EAAYjqB,OAClBA,YAAiB+qB,gBAAgBX,GAAWH,EAAYjqB,IAC/D,OAAO+qB,iBACT,EAEAjH,EAAWwG,KAAY,EAKvBltB,EAAOD,QAAU0E,OAAO6kB,QAAU,SAASA,OAAOtM,EAAGmR,GACnD,IAAIzQ,EAQJ,OAPU,OAANV,GACFmQ,iBAAiBH,GAAa3H,EAASrI,GACvCU,EAAS,IAAIyP,iBACbA,iBAAiBH,GAAa,KAE9BtP,EAAOwP,IAAYlQ,GACdU,EAASiQ,uBACMjnB,IAAfynB,EAA2BzQ,EAASkP,EAAuBzO,EAAET,EAAQyQ,EAC9E,mBClFA,IAAI1P,EAAc,EAAQ,OACtB2P,EAA0B,EAAQ,OAClCrQ,EAAuB,EAAQ,OAC/BsH,EAAW,EAAQ,OACnB7I,EAAkB,EAAQ,OAC1BqP,EAAa,EAAQ,OAKzB9rB,EAAQoe,EAAIM,IAAgB2P,EAA0B3pB,OAAO4pB,iBAAmB,SAASA,iBAAiBrR,EAAGmR,GAC3G9I,EAASrI,GAMT,IALA,IAIIpG,EAJA0X,EAAQ9R,EAAgB2R,GACxBjQ,EAAO2N,EAAWsC,GAClBvrB,EAASsb,EAAKtb,OACdqU,EAAQ,EAELrU,EAASqU,GAAO8G,EAAqBI,EAAEnB,EAAGpG,EAAMsH,EAAKjH,KAAUqX,EAAM1X,IAC5E,OAAOoG,CACT,mBCnBA,IAAIyB,EAAc,EAAQ,OACtB8P,EAAiB,EAAQ,MACzBH,EAA0B,EAAQ,OAClC/I,EAAW,EAAQ,OACnBmJ,EAAgB,EAAQ,OAExBpS,EAAatX,UAEbmR,EAAkBxR,OAAOmH,eAEzB6iB,EAA4BhqB,OAAO2Z,yBACnCsQ,EAAa,aACb/J,EAAe,eACfgK,GAAW,WAIf5uB,EAAQoe,EAAIM,EAAc2P,EAA0B,SAASxiB,eAAeoR,EAAG0I,EAAGkJ,GAIhF,GAHAvJ,EAASrI,GACT0I,EAAI8I,EAAc9I,GAClBL,EAASuJ,GACQ,mBAAN5R,GAA0B,cAAN0I,GAAqB,UAAWkJ,GAAcD,MAAYC,IAAeA,EAAWD,IAAW,CAC5H,IAAIE,EAAUJ,EAA0BzR,EAAG0I,GACvCmJ,GAAWA,EAAQF,MACrB3R,EAAE0I,GAAKkJ,EAAW3pB,MAClB2pB,EAAa,CACXlb,aAAciR,KAAgBiK,EAAaA,EAAWjK,GAAgBkK,EAAQlK,GAC9E9Y,WAAY6iB,KAAcE,EAAaA,EAAWF,GAAcG,EAAQH,GACxEjb,UAAU,GAGhB,CAAE,OAAOwC,EAAgB+G,EAAG0I,EAAGkJ,EACjC,EAAI3Y,EAAkB,SAASrK,eAAeoR,EAAG0I,EAAGkJ,GAIlD,GAHAvJ,EAASrI,GACT0I,EAAI8I,EAAc9I,GAClBL,EAASuJ,GACLL,EAAgB,IAClB,OAAOtY,EAAgB+G,EAAG0I,EAAGkJ,EAC/B,CAAE,MAAOjjB,GAAqB,CAC9B,GAAI,QAASijB,GAAc,QAASA,EAAY,MAAMxS,EAAW,2BAEjE,MADI,UAAWwS,IAAY5R,EAAE0I,GAAKkJ,EAAW3pB,OACtC+X,CACT,mBC1CA,IAAIyB,EAAc,EAAQ,OACtBjW,EAAO,EAAQ,OACfujB,EAA6B,EAAQ,OACrCrN,EAA2B,EAAQ,OACnClC,EAAkB,EAAQ,OAC1BgS,EAAgB,EAAQ,OACxBlY,EAAS,EAAQ,OACjBiY,EAAiB,EAAQ,MAGzBE,EAA4BhqB,OAAO2Z,yBAIvCre,EAAQoe,EAAIM,EAAcgQ,EAA4B,SAASrQ,yBAAyBpB,EAAG0I,GAGzF,GAFA1I,EAAIR,EAAgBQ,GACpB0I,EAAI8I,EAAc9I,GACd6I,EAAgB,IAClB,OAAOE,EAA0BzR,EAAG0I,EACtC,CAAE,MAAO/Z,GAAqB,CAC9B,GAAI2K,EAAO0G,EAAG0I,GAAI,OAAOhH,GAA0BlW,EAAKujB,EAA2B5N,EAAGnB,EAAG0I,GAAI1I,EAAE0I,GACjG,mBCrBA,IAAIoJ,EAAqB,EAAQ,OAG7BpI,EAFc,EAAQ,OAEGna,OAAO,SAAU,aAK9CxM,EAAQoe,EAAI1Z,OAAOsqB,qBAAuB,SAASA,oBAAoB/R,GACrE,OAAO8R,EAAmB9R,EAAG0J,EAC/B,iBCTA3mB,EAAQoe,EAAI1Z,OAAOgoB,qCCDnB,IAAInW,EAAS,EAAQ,OACjB4F,EAAa,EAAQ,OACrB6J,EAAW,EAAQ,OACnBU,EAAY,EAAQ,OACpBuI,EAA2B,EAAQ,OAEnC9B,EAAWzG,EAAU,YACrBlJ,EAAU9Y,OACVwqB,EAAkB1R,EAAQ5Y,UAK9B3E,EAAOD,QAAUivB,EAA2BzR,EAAQgB,eAAiB,SAAUvB,GAC7E,IAAI2B,EAASoH,EAAS/I,GACtB,GAAI1G,EAAOqI,EAAQuO,GAAW,OAAOvO,EAAOuO,GAC5C,IAAI3Z,EAAcoL,EAAOpL,YACzB,OAAI2I,EAAW3I,IAAgBoL,aAAkBpL,EACxCA,EAAY5O,UACZga,aAAkBpB,EAAU0R,EAAkB,IACzD,kBCpBA,IAAIhS,EAAc,EAAQ,OAE1Bjd,EAAOD,QAAUkd,EAAY,CAAC,EAAEtB,gCCFhC,IAAIsB,EAAc,EAAQ,OACtB3G,EAAS,EAAQ,OACjBkG,EAAkB,EAAQ,OAC1Blb,EAAU,iBACVolB,EAAa,EAAQ,OAErBzjB,EAAOga,EAAY,GAAGha,MAE1BjD,EAAOD,QAAU,SAAU4e,EAAQuQ,GACjC,IAGItY,EAHAoG,EAAIR,EAAgBmC,GACpBzc,EAAI,EACJwb,EAAS,GAEb,IAAK9G,KAAOoG,GAAI1G,EAAOoQ,EAAY9P,IAAQN,EAAO0G,EAAGpG,IAAQ3T,EAAKya,EAAQ9G,GAE1E,KAAOsY,EAAMtsB,OAASV,GAAOoU,EAAO0G,EAAGpG,EAAMsY,EAAMhtB,SAChDZ,EAAQoc,EAAQ9G,IAAQ3T,EAAKya,EAAQ9G,IAExC,OAAO8G,CACT,mBCnBA,IAAIoR,EAAqB,EAAQ,OAC7BjC,EAAc,EAAQ,OAK1B7sB,EAAOD,QAAU0E,OAAOyZ,MAAQ,SAASA,KAAKlB,GAC5C,OAAO8R,EAAmB9R,EAAG6P,EAC/B,8BCPA,IAAIsC,EAAwB,CAAC,EAAElJ,qBAE3B7H,EAA2B3Z,OAAO2Z,yBAGlCgR,EAAchR,IAA6B+Q,EAAsB3mB,KAAK,CAAE,EAAG,GAAK,GAIpFzI,EAAQoe,EAAIiR,EAAc,SAASnJ,qBAAqBR,GACtD,IAAI7C,EAAaxE,EAAyBje,KAAMslB,GAChD,QAAS7C,GAAcA,EAAW/W,UACpC,EAAIsjB,mBCZJ,IAAIE,EAAsB,EAAQ,OAC9BhK,EAAW,EAAQ,OACnBiK,EAAqB,EAAQ,OAMjCtvB,EAAOD,QAAU0E,OAAOC,iBAAmB,aAAe,CAAC,EAAI,WAC7D,IAEI6qB,EAFAC,GAAiB,EACjB/tB,EAAO,CAAC,EAEZ,KACE8tB,EAASF,EAAoB5qB,OAAOE,UAAW,YAAa,QACrDlD,EAAM,IACb+tB,EAAiB/tB,aAAgB6B,KACnC,CAAE,MAAOqI,GAAqB,CAC9B,OAAO,SAASjH,eAAesY,EAAGzR,GAKhC,OAJA8Z,EAASrI,GACTsS,EAAmB/jB,GACfikB,EAAgBD,EAAOvS,EAAGzR,GACzByR,EAAEyS,UAAYlkB,EACZyR,CACT,CACF,CAhB+D,QAgBzDtW,iCCxBN,IAAIyW,EAAwB,EAAQ,OAChC6H,EAAU,EAAQ,MAItBhlB,EAAOD,QAAUod,EAAwB,CAAC,EAAEhW,SAAW,SAASA,WAC9D,MAAO,WAAa6d,EAAQ7kB,MAAQ,GACtC,mBCRA,IAAIqI,EAAO,EAAQ,OACf0T,EAAa,EAAQ,OACrBK,EAAW,EAAQ,OAEnBH,EAAatX,UAIjB9E,EAAOD,QAAU,SAAUsU,EAAOqb,GAChC,IAAIta,EAAI/M,EACR,GAAa,WAATqnB,GAAqBxT,EAAW9G,EAAKf,EAAMlN,YAAcoV,EAASlU,EAAMG,EAAK4M,EAAIf,IAAS,OAAOhM,EACrG,GAAI6T,EAAW9G,EAAKf,EAAMjO,WAAamW,EAASlU,EAAMG,EAAK4M,EAAIf,IAAS,OAAOhM,EAC/E,GAAa,WAATqnB,GAAqBxT,EAAW9G,EAAKf,EAAMlN,YAAcoV,EAASlU,EAAMG,EAAK4M,EAAIf,IAAS,OAAOhM,EACrG,MAAM+T,EAAW,0CACnB,mBCdA,IAAI4J,EAAa,EAAQ,KACrB/I,EAAc,EAAQ,OACtB0S,EAA4B,EAAQ,OACpC7D,EAA8B,EAAQ,OACtCzG,EAAW,EAAQ,OAEnB9Y,EAAS0Q,EAAY,GAAG1Q,QAG5BvM,EAAOD,QAAUimB,EAAW,UAAW,YAAc,SAASnI,QAAQ9B,GACpE,IAAImC,EAAOyR,EAA0BxR,EAAEkH,EAAStJ,IAC5C0Q,EAAwBX,EAA4B3N,EACxD,OAAOsO,EAAwBlgB,EAAO2R,EAAMuO,EAAsB1Q,IAAOmC,CAC3E,aCbAle,EAAOD,QAAU,CAAC,kBCAlB,IAAI6L,EAAiB,WAErB5L,EAAOD,QAAU,SAAU6vB,EAAQC,EAAQjZ,GACzCA,KAAOgZ,GAAUhkB,EAAegkB,EAAQhZ,EAAK,CAC3ClD,cAAc,EACd5H,IAAK,WAAc,OAAO+jB,EAAOjZ,EAAM,EACvClK,IAAK,SAAUqP,GAAM8T,EAAOjZ,GAAOmF,CAAI,GAE3C,mBCRA,IAAImJ,EAAoB,EAAQ,OAE5B9I,EAAatX,UAIjB9E,EAAOD,QAAU,SAAUgc,GACzB,GAAImJ,EAAkBnJ,GAAK,MAAMK,EAAW,wBAA0BL,GACtE,OAAOA,CACT,mBCTA,IAAIoB,EAAwB,EAAQ,OAChCvR,EAAiB,WACjBiT,EAA8B,EAAQ,OACtCvI,EAAS,EAAQ,OACjBnP,EAAW,EAAQ,OAGnBkW,EAFkB,EAAQ,MAEVC,CAAgB,eAEpCtd,EAAOD,QAAU,SAAUgc,EAAI+T,EAAK/M,EAAQgN,GAC1C,GAAIhU,EAAI,CACN,IAAI7O,EAAS6V,EAAShH,EAAKA,EAAGpX,UACzB2R,EAAOpJ,EAAQmQ,IAClBzR,EAAesB,EAAQmQ,EAAe,CAAE3J,cAAc,EAAMzO,MAAO6qB,IAEjEC,IAAe5S,GACjB0B,EAA4B3R,EAAQ,WAAY/F,EAEpD,CACF,mBCnBA,IAAIqf,EAAS,EAAQ,OACjBwJ,EAAM,EAAQ,OAEd9R,EAAOsI,EAAO,QAElBxmB,EAAOD,QAAU,SAAU6W,GACzB,OAAOsH,EAAKtH,KAASsH,EAAKtH,GAAOoZ,EAAIpZ,GACvC,mBCPA,IAAIkI,EAAS,EAAQ,OACjBmR,EAAuB,EAAQ,OAE/BC,EAAS,qBACTpJ,EAAQhI,EAAOoR,IAAWD,EAAqBC,EAAQ,CAAC,GAE5DlwB,EAAOD,QAAU+mB,mBCNjB,IAAI+C,EAAU,EAAQ,OAClB/C,EAAQ,EAAQ,QAEnB9mB,EAAOD,QAAU,SAAU6W,EAAK3R,GAC/B,OAAO6hB,EAAMlQ,KAASkQ,EAAMlQ,QAAiBlQ,IAAVzB,EAAsBA,EAAQ,CAAC,EACpE,GAAG,WAAY,IAAIhC,KAAK,CACtBge,QAAS,SACTkP,KAAMtG,EAAU,OAAS,SACzBuG,UAAW,4CACXC,QAAS,2DACTrS,OAAQ,yDCVV,IAAIf,EAAc,EAAQ,OACtBqT,EAAsB,EAAQ,OAC9BnpB,EAAW,EAAQ,OACnBopB,EAAyB,EAAQ,OAEjCC,EAASvT,EAAY,GAAGuT,QACxB/tB,EAAawa,EAAY,GAAGxa,YAC5Bya,EAAcD,EAAY,GAAGzX,OAE7BmX,aAAe,SAAU8T,GAC3B,OAAO,SAAU5T,EAAOpQ,GACtB,IAGIqD,EAAO4gB,EAHPhE,EAAIvlB,EAASopB,EAAuB1T,IACpCpD,EAAW6W,EAAoB7jB,GAC/BxF,GAAOylB,EAAE9pB,OAEb,OAAI6W,EAAW,GAAKA,GAAYxS,GAAawpB,EAAoB,QAAK/pB,GACtEoJ,EAAQrN,EAAWiqB,EAAGjT,IACP,OAAU3J,EAAQ,OAAU2J,EAAW,IAAMxS,KACtDypB,EAASjuB,EAAWiqB,EAAGjT,EAAW,IAAM,OAAUiX,EAAS,MAC3DD,EACED,EAAO9D,EAAGjT,GACV3J,EACF2gB,EACEvT,EAAYwP,EAAGjT,EAAUA,EAAW,GACViX,EAAS,OAAlC5gB,EAAQ,OAAU,IAA0B,KACvD,CACF,EAEA9P,EAAOD,QAAU,CAGf4wB,OAAQhU,cAAa,GAGrB6T,OAAQ7T,cAAa,qBCjCvB,IAAIiU,EAAa,EAAQ,OACrBvS,EAAQ,EAAQ,OAGhB/B,EAFS,EAAQ,OAEApb,OAGrBlB,EAAOD,UAAY0E,OAAOgoB,wBAA0BpO,GAAM,WACxD,IAAI+N,EAASpoB,SAKb,OAAQsY,EAAQ8P,MAAa3nB,OAAO2nB,aAAmBpoB,UAEpDA,OAAOuf,MAAQqN,GAAcA,EAAa,EAC/C,qBCjBA,IAAIN,EAAsB,EAAQ,OAE9BrjB,EAAM3C,KAAK2C,IACX1C,EAAMD,KAAKC,IAKfvK,EAAOD,QAAU,SAAUkX,EAAOrU,GAChC,IAAIiuB,EAAUP,EAAoBrZ,GAClC,OAAO4Z,EAAU,EAAI5jB,EAAI4jB,EAAUjuB,EAAQ,GAAK2H,EAAIsmB,EAASjuB,EAC/D,mBCVA,IAAIopB,EAAgB,EAAQ,OACxBuE,EAAyB,EAAQ,OAErCvwB,EAAOD,QAAU,SAAUgc,GACzB,OAAOiQ,EAAcuE,EAAuBxU,GAC9C,mBCNA,IAAI4P,EAAQ,EAAQ,OAIpB3rB,EAAOD,QAAU,SAAUsc,GACzB,IAAIyU,GAAUzU,EAEd,OAAOyU,GAAWA,GAAqB,IAAXA,EAAe,EAAInF,EAAMmF,EACvD,mBCRA,IAAIR,EAAsB,EAAQ,OAE9B/lB,EAAMD,KAAKC,IAIfvK,EAAOD,QAAU,SAAUsc,GACzB,OAAOA,EAAW,EAAI9R,EAAI+lB,EAAoBjU,GAAW,kBAAoB,CAC/E,mBCRA,IAAIkU,EAAyB,EAAQ,OAEjChT,EAAU9Y,OAIdzE,EAAOD,QAAU,SAAUsc,GACzB,OAAOkB,EAAQgT,EAAuBlU,GACxC,mBCRA,IAAI7T,EAAO,EAAQ,OACf+T,EAAW,EAAQ,OACnBwU,EAAW,EAAQ,OACnB9L,EAAY,EAAQ,OACpB+L,EAAsB,EAAQ,OAC9B1T,EAAkB,EAAQ,OAE1BlB,EAAatX,UACbmsB,EAAe3T,EAAgB,eAInCtd,EAAOD,QAAU,SAAUsU,EAAOqb,GAChC,IAAKnT,EAASlI,IAAU0c,EAAS1c,GAAQ,OAAOA,EAChD,IACIqJ,EADAwT,EAAejM,EAAU5Q,EAAO4c,GAEpC,GAAIC,EAAc,CAGhB,QAFaxqB,IAATgpB,IAAoBA,EAAO,WAC/BhS,EAASlV,EAAK0oB,EAAc7c,EAAOqb,IAC9BnT,EAASmB,IAAWqT,EAASrT,GAAS,OAAOA,EAClD,MAAMtB,EAAW,0CACnB,CAEA,YADa1V,IAATgpB,IAAoBA,EAAO,UACxBsB,EAAoB3c,EAAOqb,EACpC,mBCxBA,IAAI3oB,EAAc,EAAQ,OACtBgqB,EAAW,EAAQ,OAIvB/wB,EAAOD,QAAU,SAAUsc,GACzB,IAAIzF,EAAM7P,EAAYsV,EAAU,UAChC,OAAO0U,EAASna,GAAOA,EAAMA,EAAM,EACrC,mBCRA,IAGInV,EAAO,CAAC,EAEZA,EALsB,EAAQ,MAEV6b,CAAgB,gBAGd,IAEtBtd,EAAOD,QAA2B,eAAjBmB,OAAOO,oBCPxB,IAAIujB,EAAU,EAAQ,MAElB1I,EAAUpb,OAEdlB,EAAOD,QAAU,SAAUsc,GACzB,GAA0B,WAAtB2I,EAAQ3I,GAAwB,MAAMvX,UAAU,6CACpD,OAAOwX,EAAQD,EACjB,aCPA,IAAIC,EAAUpb,OAEdlB,EAAOD,QAAU,SAAUsc,GACzB,IACE,OAAOC,EAAQD,EACjB,CAAE,MAAO1Q,GACP,MAAO,QACT,CACF,mBCRA,IAAIsR,EAAc,EAAQ,OAEtBkU,EAAK,EACLC,EAAU9mB,KAAK+mB,SACflqB,EAAW8V,EAAY,GAAI9V,UAE/BnH,EAAOD,QAAU,SAAU6W,GACzB,MAAO,gBAAqBlQ,IAARkQ,EAAoB,GAAKA,GAAO,KAAOzP,IAAWgqB,EAAKC,EAAS,GACtF,mBCPA,IAAIE,EAAgB,EAAQ,OAE5BtxB,EAAOD,QAAUuxB,IACXttB,OAAOuf,MACkB,iBAAnBvf,OAAOukB,0BCLnB,IAAI9J,EAAc,EAAQ,OACtBJ,EAAQ,EAAQ,OAIpBre,EAAOD,QAAU0e,GAAeJ,GAAM,WAEpC,OAGgB,IAHT5Z,OAAOmH,gBAAe,WAA0B,GAAG,YAAa,CACrE3G,MAAO,GACPwO,UAAU,IACT9O,SACL,qBCXA,IAAIma,EAAS,EAAQ,OACjB5C,EAAa,EAAQ,OAErB0K,EAAU9H,EAAO8H,QAErB5mB,EAAOD,QAAUmc,EAAW0K,IAAY,cAAcnlB,KAAKP,OAAO0lB,qBCLlE,IAAI9H,EAAS,EAAQ,OACjB0H,EAAS,EAAQ,OACjBlQ,EAAS,EAAQ,OACjB0Z,EAAM,EAAQ,OACdsB,EAAgB,EAAQ,OACxBzJ,EAAoB,EAAQ,OAE5B7jB,EAAS8a,EAAO9a,OAChButB,EAAwB/K,EAAO,OAC/BgL,EAAwB3J,EAAoB7jB,EAAY,KAAKA,EAASA,GAAUA,EAAOytB,eAAiBzB,EAE5GhwB,EAAOD,QAAU,SAAU4T,GAKvB,OAJG2C,EAAOib,EAAuB5d,KACjC4d,EAAsB5d,GAAQ2d,GAAiBhb,EAAOtS,EAAQ2P,GAC1D3P,EAAO2P,GACP6d,EAAsB,UAAY7d,IAC/B4d,EAAsB5d,EACjC,gCChBA,IAAIqS,EAAa,EAAQ,KACrB1P,EAAS,EAAQ,OACjBuI,EAA8B,EAAQ,OACtClD,EAAgB,EAAQ,MACxBjX,EAAiB,EAAQ,OACzBgtB,EAA4B,EAAQ,OACpCC,EAAgB,EAAQ,MACxBC,EAAoB,EAAQ,OAC5BC,EAA0B,EAAQ,OAClCC,EAAoB,EAAQ,OAC5BC,GAAoB,EAAQ,OAC5BtT,GAAc,EAAQ,OACtBoL,GAAU,EAAQ,OAEtB7pB,EAAOD,QAAU,SAAUiyB,EAAWC,EAAS5P,EAAQ6P,IACrD,IAAIC,GAAoB,kBACpBC,GAAmBF,GAAqB,EAAI,EAC5Cra,GAAOma,EAAUld,MAAM,KACvBud,GAAaxa,GAAKA,GAAKjV,OAAS,GAChC0vB,GAAgBtM,EAAW7a,MAAM,KAAM0M,IAE3C,GAAKya,GAAL,CAEA,IAAIC,GAAyBD,GAAc3tB,UAK3C,IAFKklB,IAAWvT,EAAOic,GAAwB,iBAAiBA,GAAuBlM,OAElFhE,EAAQ,OAAOiQ,GAEpB,IAAIE,GAAYxM,EAAW,SAEvByM,GAAeR,GAAQ,SAAU7lB,EAAG/F,GACtC,IAAIwN,EAAUge,EAAwBK,GAAqB7rB,EAAI+F,OAAG1F,GAC9DgX,EAASwU,GAAqB,IAAII,GAAclmB,GAAK,IAAIkmB,GAK7D,YAJgB5rB,IAAZmN,GAAuBgL,EAA4BnB,EAAQ,UAAW7J,GAC1Eke,GAAkBrU,EAAQ+U,GAAc/U,EAAO9J,MAAO,GAClDzT,MAAQwb,EAAc4W,GAAwBpyB,OAAOyxB,EAAkBlU,EAAQvd,KAAMsyB,IACrFprB,UAAUzE,OAASwvB,IAAkBN,EAAkBpU,EAAQrW,UAAU+qB,KACtE1U,CACT,IAcA,GAZA+U,GAAa9tB,UAAY4tB,GAEN,UAAfF,GACE3tB,EAAgBA,EAAe+tB,GAAcD,IAC5Cd,EAA0Be,GAAcD,GAAW,CAAE7e,MAAM,IACvD8K,IAAe0T,MAAqBG,KAC7CX,EAAcc,GAAcH,GAAeH,IAC3CR,EAAcc,GAAcH,GAAe,sBAG7CZ,EAA0Be,GAAcH,KAEnCzI,GAAS,IAER0I,GAAuB5e,OAAS0e,IAClCxT,EAA4B0T,GAAwB,OAAQF,IAE9DE,GAAuBhf,YAAckf,EACvC,CAAE,MAAO9mB,GAAqB,CAE9B,OAAO8mB,EAzCmB,CA0C5B,mBChEA,IAAI7I,EAAI,EAAQ,OACZ5D,EAAa,EAAQ,KACrB7a,EAAQ,EAAQ,OAChBkT,EAAQ,EAAQ,OAChBqU,EAAgC,EAAQ,OAExCC,EAAkB,iBAClBC,EAAkB5M,EAAW2M,GAE7BtQ,GAAUhE,GAAM,WAClB,OAA0C,IAAnCuU,EAAgB,CAAC,IAAI3f,OAAO,EACrC,KAAMoL,GAAM,WACV,OAAqE,IAA9DuU,EAAgB,CAAC,GAAID,EAAiB,CAAEtM,MAAO,IAAKA,KAC7D,IAGAuD,EAAE,CAAE9K,QAAQ,EAAMvL,aAAa,EAAMsf,MAAO,EAAGzP,OAAQf,GAAU,CAC/D5G,eAAgBiX,EAA8BC,GAAiB,SAAUG,GAEvE,OAAO,SAASrX,eAAexI,EAAQY,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CACzF,GAAGgb,GAAQ,mCCnBb,IAAIuH,EAAI,EAAQ,OACZjO,EAAgB,EAAQ,MACxB4C,EAAiB,EAAQ,KACzB7Z,EAAiB,EAAQ,OACzBgtB,EAA4B,EAAQ,OACpCpI,EAAS,EAAQ,OACjBzK,EAA8B,EAAQ,OACtCH,EAA2B,EAAQ,OACnCoT,EAAoB,EAAQ,OAC5BC,EAAoB,EAAQ,OAC5BgB,GAAU,EAAQ,OAClBlB,GAA0B,EAAQ,OAGlCxU,GAFkB,EAAQ,MAEVC,CAAgB,eAChCiE,GAAS/d,MACTP,GAAO,GAAGA,KAEV2vB,GAAkB,SAASnX,eAAexI,EAAQY,GACpD,IACIgQ,EADAhe,EAAa8V,EAAcqX,GAAyB7yB,MAEpDuE,EACFmf,EAAOnf,EAAe6c,KAAU1b,EAAa0Y,EAAepe,MAAQ6yB,KAEpEnP,EAAOhe,EAAa1F,KAAOmpB,EAAO0J,IAClCnU,EAA4BgF,EAAMxG,GAAe,eAEnC3W,IAAZmN,GAAuBgL,EAA4BgF,EAAM,UAAWgO,GAAwBhe,IAChGke,EAAkBlO,EAAM+O,GAAiB/O,EAAKjQ,MAAO,GACjDvM,UAAUzE,OAAS,GAAGkvB,EAAkBjO,EAAMxc,UAAU,IAC5D,IAAI4rB,EAAc,GAGlB,OAFAF,GAAQ9f,EAAQhQ,GAAM,CAAE4gB,KAAMoP,IAC9BpU,EAA4BgF,EAAM,SAAUoP,GACrCpP,CACT,EAEInf,EAAgBA,EAAekuB,GAAiBrR,IAC/CmQ,EAA0BkB,GAAiBrR,GAAQ,CAAE5N,MAAM,IAEhE,IAAIqf,GAA0BJ,GAAgBjuB,UAAY2kB,EAAO/H,GAAO5c,UAAW,CACjF4O,YAAamL,EAAyB,EAAGkU,IACzC/e,QAAS6K,EAAyB,EAAG,IACrC/K,KAAM+K,EAAyB,EAAG,oBAKpCkL,EAAE,CAAE9K,QAAQ,EAAMvL,aAAa,EAAMsf,MAAO,GAAK,CAC/CpX,eAAgBmX,sBChDlB,EAAQ,qCCAR,IAAIpW,EAAkB,EAAQ,OAC1B0W,EAAmB,EAAQ,OAC3B/N,EAAY,EAAQ,OACpBgO,EAAsB,EAAQ,OAC9BvnB,EAAiB,WACjBwnB,EAAiB,EAAQ,OACzBC,EAAyB,EAAQ,OACjCxJ,EAAU,EAAQ,OAClBpL,EAAc,EAAQ,OAEtB6U,EAAiB,iBACjBC,GAAmBJ,EAAoBzmB,IACvC8mB,GAAmBL,EAAoBhM,UAAUmM,GAYrDtzB,EAAOD,QAAUqzB,EAAe9vB,MAAO,SAAS,SAAUmwB,EAAUvK,GAClEqK,GAAiBpzB,KAAM,CACrByG,KAAM0sB,EACNpmB,OAAQsP,EAAgBiX,GACxBxc,MAAO,EACPiS,KAAMA,GAIV,IAAG,WACD,IAAIrC,EAAQ2M,GAAiBrzB,MACzB+M,EAAS2Z,EAAM3Z,OACfgc,EAAOrC,EAAMqC,KACbjS,EAAQ4P,EAAM5P,QAClB,OAAK/J,GAAU+J,GAAS/J,EAAOtK,QAC7BikB,EAAM3Z,YAASxG,EACR2sB,OAAuB3sB,GAAW,IAEhB2sB,EAAf,QAARnK,EAA8CjS,EACtC,UAARiS,EAAgDhc,EAAO+J,GAC7B,CAACA,EAAO/J,EAAO+J,KAFY,EAG3D,GAAG,UAKH,IAAIiU,GAAS/F,EAAUuO,UAAYvO,EAAU7hB,MAQ7C,GALA4vB,EAAiB,QACjBA,EAAiB,UACjBA,EAAiB,YAGZrJ,GAAWpL,GAA+B,WAAhByM,GAAOvX,KAAmB,IACvD/H,EAAesf,GAAQ,OAAQ,CAAEjmB,MAAO,UAC1C,CAAE,MAAO0G,GAAqB,mBC5D9B,IAAIie,EAAI,EAAQ,OACZ9K,EAAS,EAAQ,OACjB3T,EAAQ,EAAQ,OAChBunB,EAAgC,EAAQ,OAExCiB,EAAe,cACfC,EAAc9U,EAAO6U,GAErBtR,EAA4C,IAAnC7e,MAAM,IAAK,CAAE6iB,MAAO,IAAKA,MAElCwN,8BAAgC,SAAUxB,EAAYJ,GACxD,IAAIjV,EAAI,CAAC,EACTA,EAAEqV,GAAcK,EAA8BL,EAAYJ,EAAS5P,GACnEuH,EAAE,CAAE9K,QAAQ,EAAMvL,aAAa,EAAMsf,MAAO,EAAGzP,OAAQf,GAAUrF,EACnE,EAEI8W,mCAAqC,SAAUzB,EAAYJ,GAC7D,GAAI2B,GAAeA,EAAYvB,GAAa,CAC1C,IAAIrV,EAAI,CAAC,EACTA,EAAEqV,GAAcK,EAA8BiB,EAAe,IAAMtB,EAAYJ,EAAS5P,GACxFuH,EAAE,CAAE1c,OAAQymB,EAAc3Q,MAAM,EAAMzP,aAAa,EAAMsf,MAAO,EAAGzP,OAAQf,GAAUrF,EACvF,CACF,EAGA6W,8BAA8B,SAAS,SAAUf,GAC/C,OAAO,SAAStvB,MAAMqQ,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CACxE,IACAwsB,8BAA8B,aAAa,SAAUf,GACnD,OAAO,SAASiB,UAAUlgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC5E,IACAwsB,8BAA8B,cAAc,SAAUf,GACpD,OAAO,SAASvuB,WAAWsP,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC7E,IACAwsB,8BAA8B,kBAAkB,SAAUf,GACxD,OAAO,SAASkB,eAAengB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CACjF,IACAwsB,8BAA8B,eAAe,SAAUf,GACrD,OAAO,SAASmB,YAAYpgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC9E,IACAwsB,8BAA8B,aAAa,SAAUf,GACnD,OAAO,SAAShuB,UAAU+O,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC5E,IACAwsB,8BAA8B,YAAY,SAAUf,GAClD,OAAO,SAASoB,SAASrgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC3E,IACAysB,mCAAmC,gBAAgB,SAAUhB,GAC3D,OAAO,SAASqB,aAAatgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC/E,IACAysB,mCAAmC,aAAa,SAAUhB,GACxD,OAAO,SAASsB,UAAUvgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC5E,IACAysB,mCAAmC,gBAAgB,SAAUhB,GAC3D,OAAO,SAASuB,aAAaxgB,GAAW,OAAO1I,EAAM2nB,EAAM3yB,KAAMkH,UAAY,CAC/E,qBCtDA,IAAIuiB,EAAI,EAAQ,OACZhU,EAAO,EAAQ,OAKnBgU,EAAE,CAAE1c,OAAQ,WAAY3B,OAAO,EAAM6X,OAAQtH,SAASlG,OAASA,GAAQ,CACrEA,KAAMA,qBCRR,IAAIgU,EAAI,EAAQ,OACZ3N,EAAS,EAAQ,OAKrB2N,EAAE,CAAE1c,OAAQ,SAAU8V,MAAM,EAAM6P,MAAO,EAAGzP,OAAQ3e,OAAOwX,SAAWA,GAAU,CAC9EA,OAAQA,kCCNV,IAAIuU,EAAS,gBACTrpB,EAAW,EAAQ,OACnBgsB,EAAsB,EAAQ,OAC9BC,EAAiB,EAAQ,OACzBC,EAAyB,EAAQ,OAEjCiB,EAAkB,kBAClBf,EAAmBJ,EAAoBzmB,IACvC8mB,EAAmBL,EAAoBhM,UAAUmN,GAIrDlB,EAAelyB,OAAQ,UAAU,SAAUuyB,GACzCF,EAAiBpzB,KAAM,CACrByG,KAAM0tB,EACNnvB,OAAQgC,EAASssB,GACjBxc,MAAO,GAIX,IAAG,SAASwR,OACV,IAGI8L,EAHA1N,EAAQ2M,EAAiBrzB,MACzBgF,EAAS0hB,EAAM1hB,OACf8R,EAAQ4P,EAAM5P,MAElB,OAAIA,GAAS9R,EAAOvC,OAAeywB,OAAuB3sB,GAAW,IACrE6tB,EAAQ/D,EAAOrrB,EAAQ8R,GACvB4P,EAAM5P,OAASsd,EAAM3xB,OACdywB,EAAuBkB,GAAO,GACvC,qBC7BA,EAAQ,uBCDR,EAAQ,OACR,IAAIC,EAAe,EAAQ,OACvB1V,EAAS,EAAQ,OACjBkG,EAAU,EAAQ,MAClBnG,EAA8B,EAAQ,OACtCsG,EAAY,EAAQ,OAGpB9H,EAFkB,EAAQ,MAEVC,CAAgB,eAEpC,IAAK,IAAImX,KAAmBD,EAAc,CACxC,IAAIE,EAAa5V,EAAO2V,GACpBE,EAAsBD,GAAcA,EAAW/vB,UAC/CgwB,GAAuB3P,EAAQ2P,KAAyBtX,GAC1DwB,EAA4B8V,EAAqBtX,EAAeoX,GAElEtP,EAAUsP,GAAmBtP,EAAU7hB,KACzC,mBChBA,EAAQ,OAER,IAAIkY,EAAS,EAAQ,OACrB,EAAQ,MAERxb,EAAOD,QAAUyb,mBCNjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,mBCFjB,IAAIA,EAAS,EAAQ,OAErBxb,EAAOD,QAAUyb,wBCDf,IAAS3b,SAYQ,IAAV,EAAAimB,EAAwB,EAAAA,EAAS3lB,KARxCH,EAAOD,QAQuC,SAASF,GAExD,GAAIA,EAAK+0B,KAAO/0B,EAAK+0B,IAAIC,OACxB,OAAOh1B,EAAK+0B,IAAIC,OAIjB,IAAIC,UAAY,SAAS7vB,GACxB,GAAwB,GAApBoC,UAAUzE,OACb,MAAM,IAAIkC,UAAU,sCAQrB,IANA,IAGIiwB,EAHA5vB,EAASjE,OAAO+D,GAChBrC,EAASuC,EAAOvC,OAChBqU,GAAS,EAETyG,EAAS,GACTsX,EAAgB7vB,EAAO1C,WAAW,KAC7BwU,EAAQrU,GAOA,IANhBmyB,EAAW5vB,EAAO1C,WAAWwU,IA2B5ByG,GAbCqX,GAAY,GAAUA,GAAY,IAAuB,KAAZA,GAGpC,GAAT9d,GAAc8d,GAAY,IAAUA,GAAY,IAIvC,GAAT9d,GACA8d,GAAY,IAAUA,GAAY,IACjB,IAAjBC,EAIS,KAAOD,EAAS5tB,SAAS,IAAM,IAOhC,GAAT8P,GACU,GAAVrU,GACY,IAAZmyB,KAWAA,GAAY,KACA,IAAZA,GACY,IAAZA,GACAA,GAAY,IAAUA,GAAY,IAClCA,GAAY,IAAUA,GAAY,IAClCA,GAAY,IAAUA,GAAY,KAdxB,KAAO5vB,EAAOqrB,OAAOvZ,GAiBrB9R,EAAOqrB,OAAOvZ,GAhDxByG,GAAU,IAyDZ,OAAOA,CACR,EAOA,OALK7d,EAAK+0B,MACT/0B,EAAK+0B,IAAM,CAAC,GAGb/0B,EAAK+0B,IAAIC,OAASC,UACXA,SAER,CApGmBh1B,CAAQD,uDCwB3B,SAASo1B,gBAAgB5sB,GACxB,OACCA,aAAepE,GACZoE,aAAe4P,MACf5P,aAAe6sB,MAEpB,CAEA,SAASC,mBAAmB9sB,GAC3B,GAAIA,aAAepE,EAAQ,CAC1B,IAAIoI,EAAIpI,EAAOE,MACZF,EAAOE,MAAMkE,EAAIzF,QACjB,IAAIqB,EAAOoE,EAAIzF,QAElB,OADAyF,EAAIvC,KAAKuG,GACFA,CACR,CAAO,GAAIhE,aAAe4P,KACzB,OAAO,IAAIA,KAAK5P,EAAI+sB,WACd,GAAI/sB,aAAe6sB,OACzB,OAAO,IAAIA,OAAO7sB,GAElB,MAAM,IAAI7E,MAAM,uBAElB,CAKA,SAAS6xB,eAAelzB,GACvB,IAAImzB,EAAQ,GAcZ,OAbAnzB,EAAIkqB,SAAQ,SAAUkJ,EAAMte,GACP,iBAATse,GAA8B,OAATA,EAC3BjyB,MAAMuD,QAAQ0uB,GACjBD,EAAMre,GAASoe,eAAeE,GACpBN,gBAAgBM,GAC1BD,EAAMre,GAASke,mBAAmBI,GAElCD,EAAMre,GAASue,EAAW,CAAC,EAAGD,GAG/BD,EAAMre,GAASse,CAEjB,IACOD,CACR,CAEA,SAASG,gBAAgB9W,EAAQ+W,GAChC,MAAoB,cAAbA,OAA2BhvB,EAAYiY,EAAO+W,EACtD,CAWA,IAAIF,EAAax1B,EAAOD,QAAU,WACjC,GAAIsH,UAAUzE,OAAS,GAA6B,iBAAjByE,UAAU,GAC5C,OAAO,EAGR,GAAIA,UAAUzE,OAAS,EACtB,OAAOyE,UAAU,GAGlB,IAKIgB,EAAK0M,EALL7H,EAAS7F,UAAU,GAoDvB,OAjDW/D,MAAMqB,UAAUa,MAAMgD,KAAKnB,UAAW,GAI5CglB,SAAQ,SAAU9lB,GAEH,iBAARA,GAA4B,OAARA,GAAgBjD,MAAMuD,QAAQN,IAI7D9B,OAAOyZ,KAAK3X,GAAK8lB,SAAQ,SAAUzV,GAKlC,OAJA7B,EAAM0gB,gBAAgBvoB,EAAQ0J,IAC9BvO,EAAMotB,gBAAgBlvB,EAAKqQ,MAGf1J,OACX,EAMyB,iBAAR7E,GAA4B,OAARA,OACrC6E,EAAO0J,GAAOvO,GAIJ/E,MAAMuD,QAAQwB,QACxB6E,EAAO0J,GAAOye,eAAehtB,IAInB4sB,gBAAgB5sB,QAC1B6E,EAAO0J,GAAOue,mBAAmB9sB,IAIR,iBAAR0M,GAA4B,OAARA,GAAgBzR,MAAMuD,QAAQkO,QACnE7H,EAAO0J,GAAO4e,EAAW,CAAC,EAAGntB,SAK7B6E,EAAO0J,GAAO4e,EAAWzgB,EAAK1M,GAGhC,GACD,IAEO6E,CACR,yBCnJA,IAAIyoB,EAAoB,SAASA,kBAAkB1wB,GAClD,OAID,SAAS2wB,gBAAgB3wB,GACxB,QAASA,GAA0B,iBAAVA,CAC1B,CANQ2wB,CAAgB3wB,KAQxB,SAAS4wB,UAAU5wB,GAClB,IAAI6wB,EAAcrxB,OAAOE,UAAUwC,SAASqB,KAAKvD,GAEjD,MAAuB,oBAAhB6wB,GACa,kBAAhBA,GAQL,SAASC,eAAe9wB,GACvB,OAAOA,EAAM+wB,WAAaC,CAC3B,CATKF,CAAe9wB,EACpB,CAbM4wB,CAAU5wB,EAChB,EAeA,IACIgxB,EADiC,mBAAXjyB,QAAyBA,OAAOkyB,IAClBlyB,OAAOkyB,IAAI,iBAAmB,MAUtE,SAASC,8BAA8BlxB,EAAO8R,GAC7C,OAA0B,IAAlBA,EAAQue,OAAmBve,EAAQ4e,kBAAkB1wB,GAC1DmxB,UANJ,SAASC,YAAYhuB,GACpB,OAAO/E,MAAMuD,QAAQwB,GAAO,GAAK,CAAC,CACnC,CAIcguB,CAAYpxB,GAAQA,EAAO8R,GACrC9R,CACJ,CAEA,SAASqxB,kBAAkBppB,EAAQ8Q,EAAQjH,GAC1C,OAAO7J,EAAOX,OAAOyR,GAAQuY,KAAI,SAASC,GACzC,OAAOL,8BAA8BK,EAASzf,EAC/C,GACD,CAkBA,SAAS0f,QAAQvpB,GAChB,OAAOzI,OAAOyZ,KAAKhR,GAAQX,OAT5B,SAASmqB,gCAAgCxpB,GACxC,OAAOzI,OAAOgoB,sBACXhoB,OAAOgoB,sBAAsBvf,GAAQypB,QAAO,SAASvK,GACtD,OAAO3nB,OAAOwhB,qBAAqBzd,KAAK0E,EAAQkf,EACjD,IACE,EACJ,CAGmCsK,CAAgCxpB,GACnE,CAEA,SAAS0pB,mBAAmBjY,EAAQ+W,GACnC,IACC,OAAOA,KAAY/W,CACpB,CAAE,MAAMkY,GACP,OAAO,CACR,CACD,CASA,SAASC,YAAY5pB,EAAQ8Q,EAAQjH,GACpC,IAAIggB,EAAc,CAAC,EAiBnB,OAhBIhgB,EAAQ4e,kBAAkBzoB,IAC7BupB,QAAQvpB,GAAQmf,SAAQ,SAASzV,GAChCmgB,EAAYngB,GAAOuf,8BAA8BjpB,EAAO0J,GAAMG,EAC/D,IAED0f,QAAQzY,GAAQqO,SAAQ,SAASzV,IAblC,SAASogB,iBAAiB9pB,EAAQ0J,GACjC,OAAOggB,mBAAmB1pB,EAAQ0J,MAC5BnS,OAAO8R,eAAe/N,KAAK0E,EAAQ0J,IACpCnS,OAAOwhB,qBAAqBzd,KAAK0E,EAAQ0J,GAC/C,EAUMogB,CAAiB9pB,EAAQ0J,KAIzBggB,mBAAmB1pB,EAAQ0J,IAAQG,EAAQ4e,kBAAkB3X,EAAOpH,IACvEmgB,EAAYngB,GAhDf,SAASqgB,iBAAiBrgB,EAAKG,GAC9B,IAAKA,EAAQmgB,YACZ,OAAOd,UAER,IAAIc,EAAcngB,EAAQmgB,YAAYtgB,GACtC,MAA8B,mBAAhBsgB,EAA6BA,EAAcd,SAC1D,CA0CsBa,CAAiBrgB,EAAKG,EAAtBkgB,CAA+B/pB,EAAO0J,GAAMoH,EAAOpH,GAAMG,GAE5EggB,EAAYngB,GAAOuf,8BAA8BnY,EAAOpH,GAAMG,GAEhE,IACOggB,CACR,CAEA,SAASX,UAAUlpB,EAAQ8Q,EAAQjH,IAClCA,EAAUA,GAAW,CAAC,GACdogB,WAAapgB,EAAQogB,YAAcb,kBAC3Cvf,EAAQ4e,kBAAoB5e,EAAQ4e,mBAAqBA,EAGzD5e,EAAQof,8BAAgCA,8BAExC,IAAIiB,EAAgB9zB,MAAMuD,QAAQmX,GAIlC,OAFgCoZ,IADZ9zB,MAAMuD,QAAQqG,GAKvBkqB,EACHrgB,EAAQogB,WAAWjqB,EAAQ8Q,EAAQjH,GAEnC+f,YAAY5pB,EAAQ8Q,EAAQjH,GAJ5Bof,8BAA8BnY,EAAQjH,EAM/C,CAEAqf,UAAU5c,IAAM,SAAS6d,aAAanwB,EAAO6P,GAC5C,IAAKzT,MAAMuD,QAAQK,GAClB,MAAM,IAAI1D,MAAM,qCAGjB,OAAO0D,EAAMowB,QAAO,SAASC,EAAM9O,GAClC,OAAO2N,UAAUmB,EAAM9O,EAAM1R,EAC9B,GAAG,CAAC,EACL,EAEA,IAAIygB,EAAcpB,UAElBp2B,EAAOD,QAAUy3B,qBCjIgDx3B,EAAOD,QAG/D,WAAe,aAEtB,MAAM,QACJorB,EAAO,eACPzmB,EAAc,SACd+yB,EAAQ,eACRlZ,EAAc,yBACdH,GACE3Z,OACJ,IAAI,OACFizB,EAAM,KACNC,EAAI,OACJrO,GACE7kB,QAEA,MACF0G,EAAK,UACLoZ,GACqB,oBAAZZ,SAA2BA,QAEjC+T,IACHA,EAAS,SAASA,OAAOrrB,GACvB,OAAOA,CACT,GAGGsrB,IACHA,EAAO,SAASA,KAAKtrB,GACnB,OAAOA,CACT,GAGGlB,IACHA,EAAQ,SAASA,MAAMysB,EAAKC,EAAWxT,GACrC,OAAOuT,EAAIzsB,MAAM0sB,EAAWxT,EAC9B,GAGGE,IACHA,EAAY,SAASA,UAAUuT,EAAMzT,GACnC,OAAO,IAAIyT,KAAQzT,EACrB,GAGF,MAAM0T,EAAeC,QAAQ10B,MAAMqB,UAAU0nB,SACvC4L,EAAWD,QAAQ10B,MAAMqB,UAAUuzB,KACnCC,EAAYH,QAAQ10B,MAAMqB,UAAU1B,MACpCm1B,GAAoBJ,QAAQ92B,OAAOyD,UAAU8C,aAC7C4wB,GAAiBL,QAAQ92B,OAAOyD,UAAUwC,UAC1CmxB,GAAcN,QAAQ92B,OAAOyD,UAAU3D,OACvCu3B,GAAgBP,QAAQ92B,OAAOyD,UAAU5D,SACzCy3B,GAAgBR,QAAQ92B,OAAOyD,UAAUrD,SACzCm3B,GAAaT,QAAQ92B,OAAOyD,UAAUvD,MACtCs3B,GAAaV,QAAQ9C,OAAOvwB,UAAUlD,MACtCk3B,GAAkBC,YAAY9zB,WAQpC,SAASkzB,QAAQ5hB,GACf,OAAO,SAAUyiB,GACf,IAAK,IAAIC,EAAOzxB,UAAUzE,OAAQyhB,EAAO,IAAI/gB,MAAMw1B,EAAO,EAAIA,EAAO,EAAI,GAAIC,EAAO,EAAGA,EAAOD,EAAMC,IAClG1U,EAAK0U,EAAO,GAAK1xB,UAAU0xB,GAG7B,OAAO5tB,EAAMiL,EAAMyiB,EAASxU,EAC9B,CACF,CASA,SAASuU,YAAYxiB,GACnB,OAAO,WACL,IAAK,IAAI4iB,EAAQ3xB,UAAUzE,OAAQyhB,EAAO,IAAI/gB,MAAM01B,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IACpF5U,EAAK4U,GAAS5xB,UAAU4xB,GAG1B,OAAO1U,EAAUnO,EAAMiO,EACzB,CACF,CAWA,SAAS6U,SAASxsB,EAAKxF,GACrB,IAAIiyB,EAAoB9xB,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK+wB,GAExF1zB,GAIFA,EAAegI,EAAK,MAGtB,IAAI0sB,EAAIlyB,EAAMtE,OAEd,KAAOw2B,KAAK,CACV,IAAI5C,EAAUtvB,EAAMkyB,GAEpB,GAAuB,iBAAZ5C,EAAsB,CAC/B,MAAM6C,EAAYF,EAAkB3C,GAEhC6C,IAAc7C,IAEXiB,EAASvwB,KACZA,EAAMkyB,GAAKC,GAGb7C,EAAU6C,EAEd,CAEA3sB,EAAI8pB,IAAW,CACjB,CAEA,OAAO9pB,CACT,CASA,SAAS4oB,MAAM3W,GACb,MAAM2a,EAAYhQ,EAAO,MAEzB,IAAK,MAAOoM,EAAUzwB,KAAUkmB,EAAQxM,QACajY,IAA/C0X,EAAyBO,EAAQ+W,KACnC4D,EAAU5D,GAAYzwB,GAI1B,OAAOq0B,CACT,CASA,SAASC,aAAa5a,EAAQ6a,GAC5B,KAAkB,OAAX7a,GAAiB,CACtB,MAAM8a,EAAOrb,EAAyBO,EAAQ6a,GAE9C,GAAIC,EAAM,CACR,GAAIA,EAAK3tB,IACP,OAAOksB,QAAQyB,EAAK3tB,KAGtB,GAA0B,mBAAf2tB,EAAKx0B,MACd,OAAO+yB,QAAQyB,EAAKx0B,MAExB,CAEA0Z,EAASJ,EAAeI,EAC1B,CAEA,SAAS+a,cAAclD,GAErB,OADA9qB,QAAQ4O,KAAK,qBAAsBkc,GAC5B,IACT,CAEA,OAAOkD,aACT,CAEA,MAAMC,GAASjC,EAAO,CAAC,IAAK,OAAQ,UAAW,UAAW,OAAQ,UAAW,QAAS,QAAS,IAAK,MAAO,MAAO,MAAO,QAAS,aAAc,OAAQ,KAAM,SAAU,SAAU,UAAW,SAAU,OAAQ,OAAQ,MAAO,WAAY,UAAW,OAAQ,WAAY,KAAM,YAAa,MAAO,UAAW,MAAO,SAAU,MAAO,MAAO,KAAM,KAAM,UAAW,KAAM,WAAY,aAAc,SAAU,OAAQ,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,SAAU,SAAU,KAAM,OAAQ,IAAK,MAAO,QAAS,MAAO,MAAO,QAAS,SAAU,KAAM,OAAQ,MAAO,OAAQ,UAAW,OAAQ,WAAY,QAAS,MAAO,OAAQ,KAAM,WAAY,SAAU,SAAU,IAAK,UAAW,MAAO,WAAY,IAAK,KAAM,KAAM,OAAQ,IAAK,OAAQ,UAAW,SAAU,SAAU,QAAS,SAAU,SAAU,OAAQ,SAAU,SAAU,QAAS,MAAO,UAAW,MAAO,QAAS,QAAS,KAAM,WAAY,WAAY,QAAS,KAAM,QAAS,OAAQ,KAAM,QAAS,KAAM,IAAK,KAAM,MAAO,QAAS,QAEn+BkC,GAAQlC,EAAO,CAAC,MAAO,IAAK,WAAY,cAAe,eAAgB,eAAgB,gBAAiB,mBAAoB,SAAU,WAAY,OAAQ,OAAQ,UAAW,SAAU,OAAQ,IAAK,QAAS,WAAY,QAAS,QAAS,OAAQ,iBAAkB,SAAU,OAAQ,WAAY,QAAS,OAAQ,UAAW,UAAW,WAAY,iBAAkB,OAAQ,OAAQ,QAAS,SAAU,SAAU,OAAQ,WAAY,QAAS,OAAQ,QAAS,OAAQ,UAC3cmC,GAAanC,EAAO,CAAC,UAAW,gBAAiB,sBAAuB,cAAe,mBAAoB,oBAAqB,oBAAqB,iBAAkB,eAAgB,UAAW,UAAW,UAAW,UAAW,UAAW,iBAAkB,UAAW,UAAW,cAAe,eAAgB,WAAY,eAAgB,qBAAsB,cAAe,SAAU,iBAKhYoC,GAAgBpC,EAAO,CAAC,UAAW,gBAAiB,SAAU,UAAW,YAAa,mBAAoB,iBAAkB,gBAAiB,gBAAiB,gBAAiB,QAAS,YAAa,OAAQ,eAAgB,YAAa,UAAW,gBAAiB,SAAU,MAAO,aAAc,UAAW,QAChTqC,GAAWrC,EAAO,CAAC,OAAQ,WAAY,SAAU,UAAW,QAAS,SAAU,KAAM,aAAc,gBAAiB,KAAM,KAAM,QAAS,UAAW,WAAY,QAAS,OAAQ,KAAM,SAAU,QAAS,SAAU,OAAQ,OAAQ,UAAW,SAAU,MAAO,QAAS,MAAO,SAAU,aAAc,gBAGxSsC,GAAmBtC,EAAO,CAAC,UAAW,cAAe,aAAc,WAAY,YAAa,UAAW,UAAW,SAAU,SAAU,QAAS,YAAa,aAAc,iBAAkB,cAAe,SAC3M/e,GAAO+e,EAAO,CAAC,UAEf5K,GAAO4K,EAAO,CAAC,SAAU,SAAU,QAAS,MAAO,iBAAkB,eAAgB,uBAAwB,WAAY,aAAc,UAAW,SAAU,UAAW,cAAe,cAAe,UAAW,OAAQ,QAAS,QAAS,QAAS,OAAQ,UAAW,WAAY,eAAgB,SAAU,cAAe,WAAY,WAAY,UAAW,MAAO,WAAY,0BAA2B,wBAAyB,WAAY,YAAa,UAAW,eAAgB,OAAQ,MAAO,UAAW,SAAU,SAAU,OAAQ,OAAQ,WAAY,KAAM,YAAa,YAAa,QAAS,OAAQ,QAAS,OAAQ,OAAQ,UAAW,OAAQ,MAAO,MAAO,YAAa,QAAS,SAAU,MAAO,YAAa,WAAY,QAAS,OAAQ,QAAS,UAAW,aAAc,SAAU,OAAQ,UAAW,UAAW,cAAe,cAAe,SAAU,UAAW,UAAW,aAAc,WAAY,MAAO,WAAY,MAAO,WAAY,OAAQ,OAAQ,UAAW,aAAc,QAAS,WAAY,QAAS,OAAQ,QAAS,OAAQ,UAAW,QAAS,MAAO,SAAU,OAAQ,QAAS,UAAW,WAAY,QAAS,YAAa,OAAQ,SAAU,SAAU,QAAS,QAAS,QAAS,SACjqCuC,GAAMvC,EAAO,CAAC,gBAAiB,aAAc,WAAY,qBAAsB,SAAU,gBAAiB,gBAAiB,UAAW,gBAAiB,iBAAkB,QAAS,OAAQ,KAAM,QAAS,OAAQ,gBAAiB,YAAa,YAAa,QAAS,sBAAuB,8BAA+B,gBAAiB,kBAAmB,KAAM,KAAM,IAAK,KAAM,KAAM,kBAAmB,YAAa,UAAW,UAAW,MAAO,WAAY,YAAa,MAAO,OAAQ,eAAgB,YAAa,SAAU,cAAe,cAAe,gBAAiB,cAAe,YAAa,mBAAoB,eAAgB,aAAc,eAAgB,cAAe,KAAM,KAAM,KAAM,KAAM,aAAc,WAAY,gBAAiB,oBAAqB,SAAU,OAAQ,KAAM,kBAAmB,KAAM,MAAO,IAAK,KAAM,KAAM,KAAM,KAAM,UAAW,YAAa,aAAc,WAAY,OAAQ,eAAgB,iBAAkB,eAAgB,mBAAoB,iBAAkB,QAAS,aAAc,aAAc,eAAgB,eAAgB,cAAe,cAAe,mBAAoB,YAAa,MAAO,OAAQ,QAAS,SAAU,OAAQ,MAAO,OAAQ,aAAc,SAAU,WAAY,UAAW,QAAS,SAAU,cAAe,SAAU,WAAY,cAAe,OAAQ,aAAc,sBAAuB,mBAAoB,eAAgB,SAAU,gBAAiB,sBAAuB,iBAAkB,IAAK,KAAM,KAAM,SAAU,OAAQ,OAAQ,cAAe,YAAa,UAAW,SAAU,SAAU,QAAS,OAAQ,kBAAmB,mBAAoB,mBAAoB,eAAgB,cAAe,eAAgB,cAAe,aAAc,eAAgB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,SAAU,eAAgB,QAAS,eAAgB,iBAAkB,WAAY,UAAW,UAAW,YAAa,mBAAoB,cAAe,kBAAmB,iBAAkB,aAAc,OAAQ,KAAM,KAAM,UAAW,SAAU,UAAW,aAAc,UAAW,aAAc,gBAAiB,gBAAiB,QAAS,eAAgB,OAAQ,eAAgB,mBAAoB,mBAAoB,IAAK,KAAM,KAAM,QAAS,IAAK,KAAM,KAAM,IAAK,eAC9vEwC,GAASxC,EAAO,CAAC,SAAU,cAAe,QAAS,WAAY,QAAS,eAAgB,cAAe,aAAc,aAAc,QAAS,MAAO,UAAW,eAAgB,WAAY,QAAS,QAAS,SAAU,OAAQ,KAAM,UAAW,SAAU,gBAAiB,SAAU,SAAU,iBAAkB,YAAa,WAAY,cAAe,UAAW,UAAW,gBAAiB,WAAY,WAAY,OAAQ,WAAY,WAAY,aAAc,UAAW,SAAU,SAAU,cAAe,gBAAiB,uBAAwB,YAAa,YAAa,aAAc,WAAY,iBAAkB,iBAAkB,YAAa,UAAW,QAAS,UACrpByC,GAAMzC,EAAO,CAAC,aAAc,SAAU,cAAe,YAAa,gBAElE0C,GAAgBzC,EAAK,6BAErB0C,GAAW1C,EAAK,yBAChB2C,GAAc3C,EAAK,iBACnB4C,GAAY5C,EAAK,8BAEjB6C,GAAY7C,EAAK,kBAEjB8C,GAAiB9C,EAAK,6FAEtB+C,GAAoB/C,EAAK,yBACzBgD,GAAkBhD,EAAK,+DAEvBiD,GAAejD,EAAK,WAE1B,IAAIkD,GAA2Bp2B,OAAOizB,OAAO,CAC3CjI,UAAW,KACX2K,cAAeA,GACfC,SAAUA,GACVC,YAAaA,GACbC,UAAWA,GACXC,UAAWA,GACXC,eAAgBA,GAChBC,kBAAmBA,GACnBC,gBAAiBA,GACjBC,aAAcA,KAGhB,MAAME,GAAY,SAASA,YACzB,MAAyB,oBAAXvgB,OAAyB,KAAOA,MAChD,EAWMwgB,GAA4B,SAASA,0BAA0BC,EAAcC,GACjF,GAA4B,iBAAjBD,GAAkE,mBAA9BA,EAAaE,aAC1D,OAAO,KAMT,IAAIC,EAAS,KACb,MAAMC,EAAY,wBAEdH,GAAqBA,EAAkBI,aAAaD,KACtDD,EAASF,EAAkBK,aAAaF,IAG1C,MAAMG,EAAa,aAAeJ,EAAS,IAAMA,EAAS,IAE1D,IACE,OAAOH,EAAaE,aAAaK,EAAY,CAC3CC,WAAW1O,GACFA,EAGT2O,gBAAgBC,GACPA,GAIb,CAAE,MAAO7E,GAKP,OADAnrB,QAAQ4O,KAAK,uBAAyBihB,EAAa,0BAC5C,IACT,CACF,EAEA,SAASI,kBACP,IAAIphB,EAASlT,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAKyzB,KAEjF,MAAMc,UAAY/7B,GAAQ87B,gBAAgB97B,GAe1C,GARA+7B,UAAU3a,QAAU,QAMpB2a,UAAUC,QAAU,IAEfthB,IAAWA,EAAOtB,UAAyC,IAA7BsB,EAAOtB,SAAS6iB,SAIjD,OADAF,UAAUG,aAAc,EACjBH,UAGT,IAAI,SACF3iB,GACEsB,EACJ,MAAMyhB,EAAmB/iB,EACnBgjB,EAAgBD,EAAiBC,eACjC,iBACJC,EAAgB,oBAChBC,EAAmB,KACnBC,EAAI,QACJC,GAAO,WACPC,GAAU,aACVrc,GAAe1F,EAAO0F,cAAgB1F,EAAOgiB,gBAAe,gBAC5D1c,GAAe,UACf2c,GAAS,aACTxB,IACEzgB,EACEkiB,GAAmBJ,GAAQ13B,UAC3B+3B,GAAYnD,aAAakD,GAAkB,aAC3CE,GAAiBpD,aAAakD,GAAkB,eAChDG,GAAgBrD,aAAakD,GAAkB,cAC/CI,GAAgBtD,aAAakD,GAAkB,cAOrD,GAAmC,mBAAxBN,EAAoC,CAC7C,MAAMW,EAAW7jB,EAASG,cAAc,YAEpC0jB,EAASzP,SAAWyP,EAASzP,QAAQ0P,gBACvC9jB,EAAW6jB,EAASzP,QAAQ0P,cAEhC,CAEA,IAAIC,GACAC,GAAY,GAChB,MAAM,eACJC,GAAc,mBACdC,GAAkB,uBAClBC,GAAsB,qBACtBC,IACEpkB,GACE,WACJqkB,IACEtB,EACJ,IAAIuB,GAAQ,CAAC,EAKb3B,UAAUG,YAAiC,mBAAZ5Q,GAAmD,mBAAlB0R,IAAgCK,SAAwDx2B,IAAtCw2B,GAAeM,mBACjI,MAAM,cACJpD,GAAa,SACbC,GAAQ,YACRC,GAAW,UACXC,GAAS,UACTC,GAAS,kBACTE,GAAiB,gBACjBC,IACEE,GACJ,IACEJ,eAAgBgD,IACd5C,GAQA6C,GAAe,KACnB,MAAMC,GAAuBzE,SAAS,CAAC,EAAG,IAAIS,MAAWC,MAAUC,MAAeE,MAAaphB,KAG/F,IAAIilB,GAAe,KACnB,MAAMC,GAAuB3E,SAAS,CAAC,EAAG,IAAIpM,MAASmN,MAAQC,MAAWC,KAQ1E,IAAI2D,GAA0Br5B,OAAOkzB,KAAKrO,EAAO,KAAM,CACrDyU,aAAc,CACZtqB,UAAU,EACVC,cAAc,EACd7H,YAAY,EACZ5G,MAAO,MAET+4B,mBAAoB,CAClBvqB,UAAU,EACVC,cAAc,EACd7H,YAAY,EACZ5G,MAAO,MAETg5B,+BAAgC,CAC9BxqB,UAAU,EACVC,cAAc,EACd7H,YAAY,EACZ5G,OAAO,MAKPi5B,GAAc,KAGdC,GAAc,KAGdC,IAAkB,EAGlBC,IAAkB,EAGlBC,IAA0B,EAI1BC,IAA2B,EAK3BC,IAAqB,EAGrBC,IAAiB,EAGjBC,IAAa,EAIbC,IAAa,EAMbC,IAAa,EAIbC,IAAsB,EAItBC,IAAsB,EAKtBC,IAAe,EAefC,IAAuB,EAC3B,MAAMC,GAA8B,gBAGpC,IAAIC,IAAe,EAIfC,IAAW,EAGXC,GAAe,CAAC,EAGhBC,GAAkB,KACtB,MAAMC,GAA0BpG,SAAS,CAAC,EAAG,CAAC,iBAAkB,QAAS,WAAY,OAAQ,gBAAiB,OAAQ,SAAU,OAAQ,KAAM,KAAM,KAAM,KAAM,QAAS,UAAW,WAAY,WAAY,YAAa,SAAU,QAAS,MAAO,WAAY,QAAS,QAAS,QAAS,QAG1R,IAAIqG,GAAgB,KACpB,MAAMC,GAAwBtG,SAAS,CAAC,EAAG,CAAC,QAAS,QAAS,MAAO,SAAU,QAAS,UAGxF,IAAIuG,GAAsB,KAC1B,MAAMC,GAA8BxG,SAAS,CAAC,EAAG,CAAC,MAAO,QAAS,MAAO,KAAM,QAAS,OAAQ,UAAW,cAAe,OAAQ,UAAW,QAAS,QAAS,QAAS,UAClKyG,GAAmB,qCACnBC,GAAgB,6BAChBC,GAAiB,+BAGvB,IAAIC,GAAYD,GACZE,IAAiB,EAGjBC,GAAqB,KACzB,MAAMC,GAA6B/G,SAAS,CAAC,EAAG,CAACyG,GAAkBC,GAAeC,IAAiBxH,IAGnG,IAAI6H,GAAoB,KACxB,MAAMC,GAA+B,CAAC,wBAAyB,aACzDC,GAA4B,YAClC,IAAIjH,GAAoB,KAGpBkH,GAAS,KAKb,MAAMC,GAAcrnB,EAASG,cAAc,QAErCmnB,GAAoB,SAASA,kBAAkBC,GACnD,OAAOA,aAAqBtL,QAAUsL,aAAqB1kB,QAC7D,EASM2kB,GAAe,SAASA,eAC5B,IAAIC,EAAMr5B,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAE/E,IAAIg5B,IAAUA,KAAWK,EAAzB,CAuKA,GAjKKA,GAAsB,iBAARA,IACjBA,EAAM,CAAC,GAKTA,EAAMpL,MAAMoL,GACZR,GACqEA,IAAJ,IAAjEC,GAA6B7+B,QAAQo/B,EAAIR,mBAAgDE,GAAgDM,EAAIR,kBAE7I/G,GAA0C,0BAAtB+G,GAAgD7H,GAAiBD,GAGrFsF,GAAe,iBAAkBgD,EAAMxH,SAAS,CAAC,EAAGwH,EAAIhD,aAAcvE,IAAqBwE,GAC3FC,GAAe,iBAAkB8C,EAAMxH,SAAS,CAAC,EAAGwH,EAAI9C,aAAczE,IAAqB0E,GAC3FmC,GAAqB,uBAAwBU,EAAMxH,SAAS,CAAC,EAAGwH,EAAIV,mBAAoB3H,IAAkB4H,GAC1GR,GAAsB,sBAAuBiB,EAAMxH,SAAS5D,MAAMoK,IAClEgB,EAAIC,kBACJxH,IAEEuG,GACFH,GAAgB,sBAAuBmB,EAAMxH,SAAS5D,MAAMkK,IAC5DkB,EAAIE,kBACJzH,IAEEqG,GACFH,GAAkB,oBAAqBqB,EAAMxH,SAAS,CAAC,EAAGwH,EAAIrB,gBAAiBlG,IAAqBmG,GACpGpB,GAAc,gBAAiBwC,EAAMxH,SAAS,CAAC,EAAGwH,EAAIxC,YAAa/E,IAAqB,CAAC,EACzFgF,GAAc,gBAAiBuC,EAAMxH,SAAS,CAAC,EAAGwH,EAAIvC,YAAahF,IAAqB,CAAC,EACzFiG,GAAe,iBAAkBsB,GAAMA,EAAItB,aAC3ChB,IAA0C,IAAxBsC,EAAItC,gBAEtBC,IAA0C,IAAxBqC,EAAIrC,gBAEtBC,GAA0BoC,EAAIpC,0BAA2B,EAEzDC,IAA4D,IAAjCmC,EAAInC,yBAE/BC,GAAqBkC,EAAIlC,qBAAsB,EAE/CC,GAAiBiC,EAAIjC,iBAAkB,EAEvCG,GAAa8B,EAAI9B,aAAc,EAE/BC,GAAsB6B,EAAI7B,sBAAuB,EAEjDC,GAAsB4B,EAAI5B,sBAAuB,EAEjDH,GAAa+B,EAAI/B,aAAc,EAE/BI,IAAoC,IAArB2B,EAAI3B,aAEnBC,GAAuB0B,EAAI1B,uBAAwB,EAEnDE,IAAoC,IAArBwB,EAAIxB,aAEnBC,GAAWuB,EAAIvB,WAAY,EAE3B1B,GAAmBiD,EAAIG,oBAAsBpG,GAC7CqF,GAAYY,EAAIZ,WAAaD,GAC7B/B,GAA0B4C,EAAI5C,yBAA2B,CAAC,EAEtD4C,EAAI5C,yBAA2ByC,GAAkBG,EAAI5C,wBAAwBC,gBAC/ED,GAAwBC,aAAe2C,EAAI5C,wBAAwBC,cAGjE2C,EAAI5C,yBAA2ByC,GAAkBG,EAAI5C,wBAAwBE,sBAC/EF,GAAwBE,mBAAqB0C,EAAI5C,wBAAwBE,oBAGvE0C,EAAI5C,yBAAiG,kBAA/D4C,EAAI5C,wBAAwBG,iCACpEH,GAAwBG,+BAAiCyC,EAAI5C,wBAAwBG,gCAGnFO,KACFH,IAAkB,GAGhBQ,KACFD,IAAa,GAKXQ,KACF1B,GAAexE,SAAS,CAAC,EAAG,IAAIvgB,KAChCilB,GAAe,IAEW,IAAtBwB,GAAatS,OACfoM,SAASwE,GAAc/D,IACvBT,SAAS0E,GAAc9Q,MAGA,IAArBsS,GAAanF,MACff,SAASwE,GAAc9D,IACvBV,SAAS0E,GAAc3D,IACvBf,SAAS0E,GAAczD,MAGO,IAA5BiF,GAAavF,aACfX,SAASwE,GAAc7D,IACvBX,SAAS0E,GAAc3D,IACvBf,SAAS0E,GAAczD,MAGG,IAAxBiF,GAAalF,SACfhB,SAASwE,GAAc3D,IACvBb,SAAS0E,GAAc1D,IACvBhB,SAAS0E,GAAczD,MAMvBuG,EAAII,WACFpD,KAAiBC,KACnBD,GAAepI,MAAMoI,KAGvBxE,SAASwE,GAAcgD,EAAII,SAAU3H,KAGnCuH,EAAIK,WACFnD,KAAiBC,KACnBD,GAAetI,MAAMsI,KAGvB1E,SAAS0E,GAAc8C,EAAIK,SAAU5H,KAGnCuH,EAAIC,mBACNzH,SAASuG,GAAqBiB,EAAIC,kBAAmBxH,IAGnDuH,EAAIrB,kBACFA,KAAoBC,KACtBD,GAAkB/J,MAAM+J,KAG1BnG,SAASmG,GAAiBqB,EAAIrB,gBAAiBlG,KAK7C+F,KACFxB,GAAa,UAAW,GAKtBe,IACFvF,SAASwE,GAAc,CAAC,OAAQ,OAAQ,SAKtCA,GAAaxoB,QACfgkB,SAASwE,GAAc,CAAC,iBACjBQ,GAAY8C,OAGjBN,EAAIO,qBAAsB,CAC5B,GAAmD,mBAAxCP,EAAIO,qBAAqBzF,WAClC,MAAM7C,GAAgB,+EAGxB,GAAwD,mBAA7C+H,EAAIO,qBAAqBxF,gBAClC,MAAM9C,GAAgB,oFAIxBqE,GAAqB0D,EAAIO,qBAEzBhE,GAAYD,GAAmBxB,WAAW,GAC5C,WAE6B90B,IAAvBs2B,KACFA,GAAqBjC,GAA0BC,GAAciB,IAIpC,OAAvBe,IAAoD,iBAAdC,KACxCA,GAAYD,GAAmBxB,WAAW,KAM1C9D,GACFA,EAAOgJ,GAGTL,GAASK,CApMT,CAqMF,EAEMQ,GAAiChI,SAAS,CAAC,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,UACvEiI,GAA0BjI,SAAS,CAAC,EAAG,CAAC,gBAAiB,OAAQ,QAAS,mBAK1EkI,GAA+BlI,SAAS,CAAC,EAAG,CAAC,QAAS,QAAS,OAAQ,IAAK,WAK5EmI,GAAenI,SAAS,CAAC,EAAGU,IAClCV,SAASmI,GAAcxH,IACvBX,SAASmI,GAAcvH,IACvB,MAAMwH,GAAkBpI,SAAS,CAAC,EAAGa,IACrCb,SAASoI,GAAiBtH,IAQ1B,MAAMuH,GAAuB,SAASA,qBAAqB/K,GACzD,IAAIhb,EAASqhB,GAAcrG,GAGtBhb,GAAWA,EAAOgmB,UACrBhmB,EAAS,CACPimB,aAAc3B,GACd0B,QAAS,aAIb,MAAMA,EAAUpJ,GAAkB5B,EAAQgL,SACpCE,EAAgBtJ,GAAkB5c,EAAOgmB,SAE/C,QAAKxB,GAAmBxJ,EAAQiL,gBAI5BjL,EAAQiL,eAAiB7B,GAIvBpkB,EAAOimB,eAAiB5B,GACP,QAAZ2B,EAMLhmB,EAAOimB,eAAiB9B,GACP,QAAZ6B,IAAwC,mBAAlBE,GAAsCR,GAA+BQ,IAK7FC,QAAQN,GAAaG,IAG1BhL,EAAQiL,eAAiB9B,GAIvBnkB,EAAOimB,eAAiB5B,GACP,SAAZ2B,EAKLhmB,EAAOimB,eAAiB7B,GACP,SAAZ4B,GAAsBL,GAAwBO,GAKhDC,QAAQL,GAAgBE,IAG7BhL,EAAQiL,eAAiB5B,KAIvBrkB,EAAOimB,eAAiB7B,KAAkBuB,GAAwBO,OAIlElmB,EAAOimB,eAAiB9B,KAAqBuB,GAA+BQ,MAMxEJ,GAAgBE,KAAaJ,GAA6BI,KAAaH,GAAaG,MAIpE,0BAAtBtB,KAAiDF,GAAmBxJ,EAAQiL,eASlF,EAQMG,GAAe,SAASA,aAAaC,GACzC1J,EAAUyD,UAAUC,QAAS,CAC3BrF,QAASqL,IAGX,IAEEA,EAAKC,WAAWvmB,YAAYsmB,EAC9B,CAAE,MAAOhL,GACPgL,EAAKE,QACP,CACF,EASMC,GAAmB,SAASA,iBAAiBruB,EAAMkuB,GACvD,IACE1J,EAAUyD,UAAUC,QAAS,CAC3BoG,UAAWJ,EAAKK,iBAAiBvuB,GACjC3O,KAAM68B,GAEV,CAAE,MAAOhL,GACPsB,EAAUyD,UAAUC,QAAS,CAC3BoG,UAAW,KACXj9B,KAAM68B,GAEV,CAIA,GAFAA,EAAKM,gBAAgBxuB,GAER,OAATA,IAAkBiqB,GAAajqB,GACjC,GAAIirB,IAAcC,GAChB,IACE+C,GAAaC,EACf,CAAE,MAAOhL,GAAI,MAEb,IACEgL,EAAKO,aAAazuB,EAAM,GAC1B,CAAE,MAAOkjB,GAAI,CAGnB,EASMwL,GAAgB,SAASA,cAAcC,GAE3C,IAAIC,EAAM,KACNC,EAAoB,KAExB,GAAI7D,GACF2D,EAAQ,oBAAsBA,MACzB,CAEL,MAAMG,EAAUnK,GAAYgK,EAAO,eACnCE,EAAoBC,GAAWA,EAAQ,EACzC,CAE0B,0BAAtBvC,IAAiDJ,KAAcD,KAEjEyC,EAAQ,iEAAmEA,EAAQ,kBAGrF,MAAMI,EAAe1F,GAAqBA,GAAmBxB,WAAW8G,GAASA,EAMjF,GAAIxC,KAAcD,GAChB,IACE0C,GAAM,IAAI/F,IAAYmG,gBAAgBD,EAAcxC,GACtD,CAAE,MAAOrJ,GAAI,CAKf,IAAK0L,IAAQA,EAAIK,gBAAiB,CAChCL,EAAMrF,GAAe2F,eAAe/C,GAAW,WAAY,MAE3D,IACEyC,EAAIK,gBAAgBE,UAAY/C,GAAiB9C,GAAYyF,CAC/D,CAAE,MAAO7L,GACT,CACF,CAEA,MAAMlc,EAAO4nB,EAAI5nB,MAAQ4nB,EAAIK,gBAQ7B,OANIN,GAASE,GACX7nB,EAAKooB,aAAa9pB,EAAS+pB,eAAeR,GAAoB7nB,EAAKsoB,WAAW,IAAM,MAKlFnD,KAAcD,GACTxC,GAAqB70B,KAAK+5B,EAAK9D,GAAiB,OAAS,QAAQ,GAGnEA,GAAiB8D,EAAIK,gBAAkBjoB,CAChD,EASMuoB,GAAsB,SAASA,oBAAoBrjC,GACvD,OAAOs9B,GAAmB30B,KAAK3I,EAAKk9B,eAAiBl9B,EAAMA,EAC3Dy8B,GAAW6G,aAAe7G,GAAW8G,aAAe9G,GAAW+G,UAAW,KAC5E,EASMC,GAAe,SAASA,aAAaC,GACzC,OAAOA,aAAe1jB,KAA4C,iBAAjB0jB,EAAIC,UAAoD,iBAApBD,EAAIlqB,aAAuD,mBAApBkqB,EAAIhoB,eAAgCgoB,EAAIE,sBAAsBxjB,KAAgD,mBAAxBsjB,EAAIpB,iBAA8D,mBAArBoB,EAAInB,cAA2D,iBAArBmB,EAAI9B,cAAyD,mBAArB8B,EAAIR,cAA4D,mBAAtBQ,EAAIG,cACjY,EASMC,GAAU,SAASA,QAAQhlB,GAC/B,MAAuB,mBAATyd,GAAuBzd,aAAkByd,CACzD,EAWMwH,GAAe,SAASA,aAAaC,EAAYC,EAAah9B,GAC7Dy2B,GAAMsG,IAIX9L,EAAawF,GAAMsG,IAAaE,IAC9BA,EAAKv7B,KAAKozB,UAAWkI,EAAah9B,EAAMu5B,GAAO,GAEnD,EAaM2D,GAAoB,SAASA,kBAAkBF,GACnD,IAAIzW,EAAU,KAOd,GAJAuW,GAAa,yBAA0BE,EAAa,MAIhDR,GAAaQ,GAGf,OAFAlC,GAAakC,IAEN,EAKT,MAAMtC,EAAUrI,GAAkB2K,EAAYN,UAU9C,GAPAI,GAAa,sBAAuBE,EAAa,CAC/CtC,UACAyC,YAAavG,KAKXoG,EAAYJ,kBAAoBC,GAAQG,EAAYI,oBAAsBxL,GAAW,UAAWoL,EAAYhB,YAAcpK,GAAW,UAAWoL,EAAYzqB,aAG9J,OAFAuoB,GAAakC,IAEN,EAKT,IAAKpG,GAAa8D,IAAYtD,GAAYsD,GAAU,CAElD,IAAKtD,GAAYsD,IAAY2C,GAAsB3C,GAAU,CAC3D,GAAI1D,GAAwBC,wBAAwB7I,QAAUwD,GAAWoF,GAAwBC,aAAcyD,GAC7G,OAAO,EAGT,GAAI1D,GAAwBC,wBAAwBjiB,UAAYgiB,GAAwBC,aAAayD,GACnG,OAAO,CAEX,CAIA,GAAItC,KAAiBG,GAAgBmC,GAAU,CAC7C,MAAMM,EAAajF,GAAciH,IAAgBA,EAAYhC,WACvDmB,EAAarG,GAAckH,IAAgBA,EAAYb,WAE7D,GAAIA,GAAcnB,EAGhB,IAAK,IAAI5/B,EAFU+gC,EAAWrgC,OAEJ,EAAGV,GAAK,IAAKA,EACrC4/B,EAAWiB,aAAarG,GAAUuG,EAAW/gC,IAAI,GAAOy6B,GAAemH,GAG7E,CAIA,OAFAlC,GAAakC,IAEN,CACT,CAIA,OAAIA,aAAuBzH,KAAYkF,GAAqBuC,IAC1DlC,GAAakC,IAEN,GAKQ,aAAZtC,GAAsC,YAAZA,GAAqC,aAAZA,IAA2B9I,GAAW,8BAA+BoL,EAAYhB,YAQrItE,IAA+C,IAAzBsF,EAAYhI,WAEpCzO,EAAUyW,EAAYzqB,YACtB0e,EAAa,CAACqC,GAAeC,GAAUC,KAAc8J,IACnD/W,EAAUkL,GAAclL,EAAS+W,EAAM,IAAI,IAGzCN,EAAYzqB,cAAgBgU,IAC9B8K,EAAUyD,UAAUC,QAAS,CAC3BrF,QAASsN,EAAYpH,cAEvBoH,EAAYzqB,YAAcgU,IAM9BuW,GAAa,wBAAyBE,EAAa,OAE5C,IA1BLlC,GAAakC,IAEN,EAyBX,EAYMO,GAAoB,SAASA,kBAAkBC,EAAOC,EAAQt/B,GAElE,GAAI85B,KAA4B,OAAXwF,GAA8B,SAAXA,KAAuBt/B,KAASgU,GAAYhU,KAASq7B,IAC3F,OAAO,EAQT,GAAIjC,KAAoBF,GAAYoG,IAAW7L,GAAW6B,GAAWgK,SAAgB,GAAInG,IAAmB1F,GAAW8B,GAAW+J,SAAgB,IAAK3G,GAAa2G,IAAWpG,GAAYoG,IACzL,KAGAJ,GAAsBG,KAAWxG,GAAwBC,wBAAwB7I,QAAUwD,GAAWoF,GAAwBC,aAAcuG,IAAUxG,GAAwBC,wBAAwBjiB,UAAYgiB,GAAwBC,aAAauG,MAAYxG,GAAwBE,8BAA8B9I,QAAUwD,GAAWoF,GAAwBE,mBAAoBuG,IAAWzG,GAAwBE,8BAA8BliB,UAAYgiB,GAAwBE,mBAAmBuG,KAEve,OAAXA,GAAmBzG,GAAwBG,iCAAmCH,GAAwBC,wBAAwB7I,QAAUwD,GAAWoF,GAAwBC,aAAc94B,IAAU64B,GAAwBC,wBAAwBjiB,UAAYgiB,GAAwBC,aAAa94B,KAClS,OAAO,OAIJ,GAAIw6B,GAAoB8E,SAAgB,GAAI7L,GAAW+E,GAAkBlF,GAActzB,EAAO01B,GAAiB,WAAa,GAAgB,QAAX4J,GAA+B,eAAXA,GAAsC,SAAXA,GAAgC,WAAVD,GAAwD,IAAlC9L,GAAcvzB,EAAO,WAAkBs6B,GAAc+E,GAAe,GAAIhG,KAA4B5F,GAAWgC,GAAmBnC,GAActzB,EAAO01B,GAAiB,WAAa,GAAI11B,EAC1Z,OAAO,EAGT,OAAO,CACT,EAWMk/B,GAAwB,SAASA,sBAAsB3C,GAC3D,OAAOA,EAAQlgC,QAAQ,KAAO,CAChC,EAaMkjC,GAAsB,SAASA,oBAAoBV,GAEvDF,GAAa,2BAA4BE,EAAa,MAEtD,MAAM,WACJL,GACEK,EAGJ,IAAKL,EACH,OAGF,MAAMgB,EAAY,CAChBC,SAAU,GACVC,UAAW,GACXC,UAAU,EACVC,kBAAmBjH,IAErB,IAAIxE,EAAIqK,EAAW7gC,OAGnB,KAAOw2B,KAAK,CACV,MAAM0L,EAAOrB,EAAWrK,IAClB,KACJzlB,EAAI,aACJ8tB,EACAx8B,MAAO0/B,GACLG,EACEP,EAASpL,GAAkBxlB,GACjC,IAAI1O,EAAiB,UAAT0O,EAAmBgxB,EAAYlM,GAAWkM,GAatD,GAVAF,EAAUC,SAAWH,EACrBE,EAAUE,UAAY1/B,EACtBw/B,EAAUG,UAAW,EACrBH,EAAUM,mBAAgBr+B,EAE1Bk9B,GAAa,wBAAyBE,EAAaW,GAEnDx/B,EAAQw/B,EAAUE,UAGdF,EAAUM,cACZ,SASF,GAJA/C,GAAiBruB,EAAMmwB,IAIlBW,EAAUG,SACb,SAKF,IAAKrG,IAA4B7F,GAAW,OAAQzzB,GAAQ,CAC1D+8B,GAAiBruB,EAAMmwB,GAEvB,QACF,CAIItF,IACFzG,EAAa,CAACqC,GAAeC,GAAUC,KAAc8J,IACnDn/B,EAAQszB,GAActzB,EAAOm/B,EAAM,IAAI,IAM3C,MAAME,EAAQnL,GAAkB2K,EAAYN,UAE5C,GAAKa,GAAkBC,EAAOC,EAAQt/B,GAAtC,CAkBA,IAVI+5B,IAAoC,OAAXuF,GAA8B,SAAXA,IAE9CvC,GAAiBruB,EAAMmwB,GAGvB7+B,EAAQg6B,GAA8Bh6B,GAKpC+3B,IAA8C,iBAAjBhC,IAAsE,mBAAlCA,GAAagK,iBAChF,GAAIvD,QACF,OAAQzG,GAAagK,iBAAiBV,EAAOC,IAC3C,IAAK,cAEDt/B,EAAQ+3B,GAAmBxB,WAAWv2B,GACtC,MAGJ,IAAK,mBAEDA,EAAQ+3B,GAAmBvB,gBAAgBx2B,GASrD,IACMw8B,EACFqC,EAAYmB,eAAexD,EAAc9tB,EAAM1O,GAG/C6+B,EAAY1B,aAAazuB,EAAM1O,GAGjCgzB,EAAS2D,UAAUC,QACrB,CAAE,MAAOhF,GAAI,CA7Cb,CA8CF,CAIA+M,GAAa,0BAA2BE,EAAa,KACvD,EAQMoB,GAAqB,SAASA,mBAAmBC,GACrD,IAAIC,EAAa,KAEjB,MAAMC,EAAiBnC,GAAoBiC,GAM3C,IAFAvB,GAAa,0BAA2BuB,EAAU,MAE3CC,EAAaC,EAAeC,YAEjC1B,GAAa,yBAA0BwB,EAAY,MAI/CpB,GAAkBoB,KAMlBA,EAAW/X,mBAAmB6O,GAChCgJ,mBAAmBE,EAAW/X,SAKhCmX,GAAoBY,IAKtBxB,GAAa,yBAA0BuB,EAAU,KACnD,EA8RA,OAnRAvJ,UAAU2J,SAAW,SAAUjD,GAC7B,IAAI5B,EAAMr5B,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC3EsT,EAAO,KACP6qB,EAAe,KACf1B,EAAc,KACd2B,EAAa,KAajB,GARA1F,IAAkBuC,EAEdvC,KACFuC,EAAQ,eAKW,iBAAVA,IAAuBqB,GAAQrB,GAAQ,CAChD,GAA8B,mBAAnBA,EAAMn7B,SAOf,MAAMwxB,GAAgB,8BAJtB,GAAqB,iBAFrB2J,EAAQA,EAAMn7B,YAGZ,MAAMwxB,GAAgB,kCAK5B,CAIA,IAAKiD,UAAUG,YACb,OAAOuG,EAkBT,GAbK5D,IACH+B,GAAaC,GAKf9E,UAAUC,QAAU,GAGC,iBAAVyG,IACTnD,IAAW,GAGTA,IAEF,GAAImD,EAAMkB,SAAU,CAClB,MAAMhC,EAAUrI,GAAkBmJ,EAAMkB,UAExC,IAAK9F,GAAa8D,IAAYtD,GAAYsD,GACxC,MAAM7I,GAAgB,0DAE1B,OACK,GAAI2J,aAAiBlG,EAG1BzhB,EAAO0nB,GAAc,iBACrBmD,EAAe7qB,EAAKoiB,cAAcO,WAAWgF,GAAO,GAEtB,IAA1BkD,EAAa1J,UAA4C,SAA1B0J,EAAahC,UAGX,SAA1BgC,EAAahC,SADtB7oB,EAAO6qB,EAKP7qB,EAAKC,YAAY4qB,OAEd,CAEL,IAAK5G,KAAeJ,KAAuBC,KACnB,IAAxB6D,EAAMhhC,QAAQ,KACZ,OAAO07B,IAAsB8B,GAAsB9B,GAAmBxB,WAAW8G,GAASA,EAQ5F,GAHA3nB,EAAO0nB,GAAcC,IAGhB3nB,EACH,OAAOikB,GAAa,KAAOE,GAAsB7B,GAAY,EAEjE,CAIItiB,GAAQgkB,IACViD,GAAajnB,EAAK+qB,YAKpB,MAAMC,EAAezC,GAAoB/D,GAAWmD,EAAQ3nB,GAI5D,KAAOmpB,EAAc6B,EAAaL,YAE5BtB,GAAkBF,KAMlBA,EAAYzW,mBAAmB6O,GACjCgJ,GAAmBpB,EAAYzW,SAKjCmX,GAAoBV,IAKtB,GAAI3E,GACF,OAAOmD,EAKT,GAAI1D,GAAY,CACd,GAAIC,GAGF,IAFA4G,EAAarI,GAAuB50B,KAAKmS,EAAKoiB,eAEvCpiB,EAAK+qB,YAEVD,EAAW7qB,YAAYD,EAAK+qB,iBAG9BD,EAAa9qB,EAcf,OAXIijB,GAAagI,YAAchI,GAAaiI,kBAQ1CJ,EAAanI,GAAW90B,KAAKwzB,EAAkByJ,GAAY,IAGtDA,CACT,CAEA,IAAIK,EAAiBrH,GAAiB9jB,EAAKorB,UAAYprB,EAAKmoB,UAe5D,OAZIrE,IAAkBf,GAAa,aAAe/iB,EAAKoiB,eAAiBpiB,EAAKoiB,cAAciJ,SAAWrrB,EAAKoiB,cAAciJ,QAAQryB,MAAQ+kB,GAAWkC,GAAcjgB,EAAKoiB,cAAciJ,QAAQryB,QAC3LmyB,EAAiB,aAAenrB,EAAKoiB,cAAciJ,QAAQryB,KAAO,MAAQmyB,GAKxEtH,IACFzG,EAAa,CAACqC,GAAeC,GAAUC,KAAc8J,IACnD0B,EAAiBvN,GAAcuN,EAAgB1B,EAAM,IAAI,IAItDpH,IAAsB8B,GAAsB9B,GAAmBxB,WAAWsK,GAAkBA,CACrG,EASAlK,UAAUqK,UAAY,WAGpBxF,GAFUp5B,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK,CAAC,GAI/Eq3B,IAAa,CACf,EAQA9C,UAAUsK,YAAc,WACtB7F,GAAS,KACT3B,IAAa,CACf,EAaA9C,UAAUuK,iBAAmB,SAAU1oB,EAAKqnB,EAAM7/B,GAE3Co7B,IACHI,GAAa,CAAC,GAGhB,MAAM6D,EAAQnL,GAAkB1b,GAC1B8mB,EAASpL,GAAkB2L,GACjC,OAAOT,GAAkBC,EAAOC,EAAQt/B,EAC1C,EAUA22B,UAAUwK,QAAU,SAAUvC,EAAYwC,GACZ,mBAAjBA,IAIX9I,GAAMsG,GAActG,GAAMsG,IAAe,GACzC1L,EAAUoF,GAAMsG,GAAawC,GAC/B,EAWAzK,UAAU0K,WAAa,SAAUzC,GAC/B,GAAItG,GAAMsG,GACR,OAAO5L,EAASsF,GAAMsG,GAE1B,EASAjI,UAAU2K,YAAc,SAAU1C,GAC5BtG,GAAMsG,KACRtG,GAAMsG,GAAc,GAExB,EAOAjI,UAAU4K,eAAiB,WACzBjJ,GAAQ,CAAC,CACX,EAEO3B,SACT,CAIA,OAFaD,iBAId,CApoDiF77B,2BCElF,MAAM2mC,SACF,WAAAlzB,CAAYmzB,EAAKC,GACbxmC,KAAKumC,IAAMA,EACXvmC,KAAKwmC,KAAOA,EACZxmC,KAAKyC,OAAS,EAAI+jC,EAAOD,CAC7B,CAEA,QAAAE,CAAS7yB,GACL,QAAS5T,KAAKwmC,KAAO5yB,EAAM2yB,KAAOvmC,KAAKumC,IAAM3yB,EAAM4yB,KACvD,CAEA,OAAAE,CAAQ9yB,GACJ,QAAS5T,KAAKwmC,KAAO,EAAI5yB,EAAM2yB,KAAOvmC,KAAKumC,IAAM,EAAI3yB,EAAM4yB,KAC/D,CAGA,GAAAG,CAAI/yB,GACA,OAAO,IAAI0yB,SACPn8B,KAAKC,IAAIpK,KAAKumC,IAAK3yB,EAAM2yB,KACzBp8B,KAAK2C,IAAI9M,KAAKwmC,KAAM5yB,EAAM4yB,MAElC,CAIA,QAAAI,CAAShzB,GACL,OAAIA,EAAM2yB,KAAOvmC,KAAKumC,KAAO3yB,EAAM4yB,MAAQxmC,KAAKwmC,KACrC,GACA5yB,EAAM2yB,IAAMvmC,KAAKumC,KAAO3yB,EAAM4yB,KAAOxmC,KAAKwmC,KAC1C,CACH,IAAIF,SAAStmC,KAAKumC,IAAK3yB,EAAM2yB,IAAM,GACnC,IAAID,SAAS1yB,EAAM4yB,KAAO,EAAGxmC,KAAKwmC,OAE/B5yB,EAAM2yB,KAAOvmC,KAAKumC,IAClB,CAAC,IAAID,SAAS1yB,EAAM4yB,KAAO,EAAGxmC,KAAKwmC,OAEnC,CAAC,IAAIF,SAAStmC,KAAKumC,IAAK3yB,EAAM2yB,IAAM,GAEnD,CAEA,QAAAv/B,GACI,OAAOhH,KAAKumC,KAAOvmC,KAAKwmC,KACpBxmC,KAAKumC,IAAIv/B,WAAahH,KAAKumC,IAAM,IAAMvmC,KAAKwmC,IACpD,EAIJ,MAAMK,OACF,WAAAzzB,CAAYnH,EAAG/F,GACXlG,KAAK8mC,OAAS,GACd9mC,KAAKyC,OAAS,EACL,MAALwJ,GAAWjM,KAAK2mC,IAAI16B,EAAG/F,EAC/B,CAEA,cAAA6gC,GACI/mC,KAAKyC,OAASzC,KAAK8mC,OAAO3P,QAAO,CAAC6P,EAAUpzB,IACjCozB,EAAWpzB,EAAMnR,QACzB,EACP,CAEA,GAAAkkC,CAAI16B,EAAG/F,GACH,IAAI+gC,KAAQC,IAER,IADA,IAAInlC,EAAI,EACDA,EAAI/B,KAAK8mC,OAAOrkC,SAAWykC,EAASR,QAAQ1mC,KAAK8mC,OAAO/kC,KAC3DA,IAGJ,IADA,IAAIolC,EAAYnnC,KAAK8mC,OAAOzhC,MAAM,EAAGtD,GAC9BA,EAAI/B,KAAK8mC,OAAOrkC,QAAUykC,EAASR,QAAQ1mC,KAAK8mC,OAAO/kC,KAC1DmlC,EAAWA,EAASP,IAAI3mC,KAAK8mC,OAAO/kC,IACpCA,IAEJolC,EAAUrkC,KAAKokC,GACflnC,KAAK8mC,OAASK,EAAU/6B,OAAOpM,KAAK8mC,OAAOzhC,MAAMtD,IACjD/B,KAAK+mC,gBAAgB,EASzB,OANI96B,aAAa46B,OACb56B,EAAE66B,OAAO5a,QAAQ+a,OAER,MAAL/gC,IAAWA,EAAI+F,GACnBg7B,KAAK,IAAIX,SAASr6B,EAAG/F,KAElBlG,IACX,CAEA,QAAA4mC,CAAS36B,EAAG/F,GACR,IAAIkhC,UAAaF,IAEb,IADA,IAAInlC,EAAI,EACDA,EAAI/B,KAAK8mC,OAAOrkC,SAAWykC,EAAST,SAASzmC,KAAK8mC,OAAO/kC,KAC5DA,IAGJ,IADA,IAAIolC,EAAYnnC,KAAK8mC,OAAOzhC,MAAM,EAAGtD,GAC9BA,EAAI/B,KAAK8mC,OAAOrkC,QAAUykC,EAAST,SAASzmC,KAAK8mC,OAAO/kC,KAC3DolC,EAAYA,EAAU/6B,OAAOpM,KAAK8mC,OAAO/kC,GAAG6kC,SAASM,IACrDnlC,IAEJ/B,KAAK8mC,OAASK,EAAU/6B,OAAOpM,KAAK8mC,OAAOzhC,MAAMtD,IACjD/B,KAAK+mC,gBAAgB,EASzB,OANI96B,aAAa46B,OACb56B,EAAE66B,OAAO5a,QAAQkb,YAER,MAALlhC,IAAWA,EAAI+F,GACnBm7B,UAAU,IAAId,SAASr6B,EAAG/F,KAEvBlG,IACX,CAEA,SAAAqnC,CAAUp7B,EAAG/F,GACT,IAAIihC,EAAY,GACZG,WAAcJ,IAEd,IADA,IAAInlC,EAAI,EACDA,EAAI/B,KAAK8mC,OAAOrkC,SAAWykC,EAAST,SAASzmC,KAAK8mC,OAAO/kC,KAC5DA,IAEJ,KAAOA,EAAI/B,KAAK8mC,OAAOrkC,QAAUykC,EAAST,SAASzmC,KAAK8mC,OAAO/kC,KAAK,CAChE,IAAIwkC,EAAMp8B,KAAK2C,IAAI9M,KAAK8mC,OAAO/kC,GAAGwkC,IAAKW,EAASX,KAC5CC,EAAOr8B,KAAKC,IAAIpK,KAAK8mC,OAAO/kC,GAAGykC,KAAMU,EAASV,MAClDW,EAAUrkC,KAAK,IAAIwjC,SAASC,EAAKC,IACjCzkC,GACJ,GAWJ,OARIkK,aAAa46B,OACb56B,EAAE66B,OAAO5a,QAAQob,aAER,MAALphC,IAAWA,EAAI+F,GACnBq7B,WAAW,IAAIhB,SAASr6B,EAAG/F,KAE/BlG,KAAK8mC,OAASK,EACdnnC,KAAK+mC,iBACE/mC,IACX,CAEA,KAAA8W,CAAMA,GAEF,IADA,IAAI/U,EAAI,EACDA,EAAI/B,KAAK8mC,OAAOrkC,QAAUzC,KAAK8mC,OAAO/kC,GAAGU,QAAUqU,GACtDA,GAAS9W,KAAK8mC,OAAO/kC,GAAGU,OACxBV,IAEJ,OAAO/B,KAAK8mC,OAAO/kC,GAAGwkC,IAAMzvB,CAChC,CAEA,QAAA9P,GACI,MAAO,KAAOhH,KAAK8mC,OAAO7jC,KAAK,MAAQ,IAC3C,CAEA,KAAAkyB,GACI,OAAO,IAAI0R,OAAO7mC,KACtB,CAEA,OAAAunC,GACI,OAAOvnC,KAAK8mC,OAAO3P,QAAO,CAAC5Z,EAAQ2pB,KAE/B,IADA,IAAInlC,EAAImlC,EAASX,IACVxkC,GAAKmlC,EAASV,MACjBjpB,EAAOza,KAAKf,GACZA,IAEJ,OAAOwb,CAAM,GACd,GACP,CAEA,SAAAiqB,GACI,OAAOxnC,KAAK8mC,OAAO1Q,KAAK8Q,IAAa,CACjCX,IAAKW,EAASX,IACdC,KAAMU,EAASV,KACf/jC,OAAQ,EAAIykC,EAASV,KAAOU,EAASX,OAE7C,EAGJ1mC,EAAOD,QAAUinC,+BC1JjB,IAOIY,EAPAC,EAAuB,iBAAZlkB,QAAuBA,QAAU,KAC5CmkB,EAAeD,GAAwB,mBAAZA,EAAE18B,MAC7B08B,EAAE18B,MACF,SAAS28B,aAAa56B,EAAQ66B,EAAU1jB,GACxC,OAAOvI,SAASnX,UAAUwG,MAAM3C,KAAK0E,EAAQ66B,EAAU1jB,EACzD,EAIAujB,EADEC,GAA0B,mBAAdA,EAAEhqB,QACCgqB,EAAEhqB,QACVpZ,OAAOgoB,sBACC,SAASmb,eAAe16B,GACvC,OAAOzI,OAAOsqB,oBAAoB7hB,GAC/BX,OAAO9H,OAAOgoB,sBAAsBvf,GACzC,EAEiB,SAAS06B,eAAe16B,GACvC,OAAOzI,OAAOsqB,oBAAoB7hB,EACpC,EAOF,IAAI86B,EAAc5+B,OAAOuO,OAAS,SAASqwB,YAAY/iC,GACrD,OAAOA,GAAUA,CACnB,EAEA,SAASgjC,eACPA,aAAanV,KAAKtqB,KAAKrI,KACzB,CACAH,EAAOD,QAAUkoC,aACjBjoC,EAAOD,QAAQmoC,KAwYf,SAASA,KAAKC,EAASx0B,GACrB,OAAO,IAAIy0B,SAAQ,SAAUC,EAASC,GACpC,SAASC,cAAcvtB,GACrBmtB,EAAQK,eAAe70B,EAAM80B,UAC7BH,EAAOttB,EACT,CAEA,SAASytB,WAC+B,mBAA3BN,EAAQK,gBACjBL,EAAQK,eAAe,QAASD,eAElCF,EAAQ,GAAG7iC,MAAMgD,KAAKnB,WACxB,CAEAqhC,+BAA+BP,EAASx0B,EAAM80B,SAAU,CAAEP,MAAM,IACnD,UAATv0B,GAMR,SAASg1B,8BAA8BR,EAASS,EAASC,GAC7B,mBAAfV,EAAQW,IACjBJ,+BAA+BP,EAAS,QAASS,EAASC,EAE9D,CATMF,CAA8BR,EAASI,cAAe,CAAEL,MAAM,GAElE,GACF,EAxZAD,aAAaA,aAAeA,aAE5BA,aAAatjC,UAAUokC,aAAUriC,EACjCuhC,aAAatjC,UAAUqkC,aAAe,EACtCf,aAAatjC,UAAUskC,mBAAgBviC,EAIvC,IAAIwiC,EAAsB,GAE1B,SAASC,cAAcC,GACrB,GAAwB,mBAAbA,EACT,MAAM,IAAItkC,UAAU,0EAA4EskC,EAEpG,CAoCA,SAASC,iBAAiBxlB,GACxB,YAA2Bnd,IAAvBmd,EAAKolB,cACAhB,aAAaiB,oBACfrlB,EAAKolB,aACd,CAkDA,SAASK,aAAap8B,EAAQtG,EAAMwiC,EAAUG,GAC5C,IAAIphC,EACAqhC,EACAC,EAsBJ,GApBAN,cAAcC,QAGC1iC,KADf8iC,EAASt8B,EAAO67B,UAEdS,EAASt8B,EAAO67B,QAAUtkC,OAAO6kB,OAAO,MACxCpc,EAAO87B,aAAe,SAIKtiC,IAAvB8iC,EAAOE,cACTx8B,EAAOy8B,KAAK,cAAe/iC,EACfwiC,EAASA,SAAWA,EAASA,SAAWA,GAIpDI,EAASt8B,EAAO67B,SAElBU,EAAWD,EAAO5iC,SAGHF,IAAb+iC,EAEFA,EAAWD,EAAO5iC,GAAQwiC,IACxBl8B,EAAO87B,kBAeT,GAbwB,mBAAbS,EAETA,EAAWD,EAAO5iC,GAChB2iC,EAAU,CAACH,EAAUK,GAAY,CAACA,EAAUL,GAErCG,EACTE,EAASG,QAAQR,GAEjBK,EAASxmC,KAAKmmC,IAIhBjhC,EAAIkhC,iBAAiBn8B,IACb,GAAKu8B,EAAS7mC,OAASuF,IAAMshC,EAASI,OAAQ,CACpDJ,EAASI,QAAS,EAGlB,IAAIC,EAAI,IAAItmC,MAAM,+CACEimC,EAAS7mC,OAAS,IAAM1B,OAAO0F,GADjC,qEAIlBkjC,EAAEn2B,KAAO,8BACTm2B,EAAE3B,QAAUj7B,EACZ48B,EAAEljC,KAAOA,EACTkjC,EAAEC,MAAQN,EAAS7mC,OA7KzB,SAASonC,mBAAmBC,GACtBv+B,SAAWA,QAAQ4O,MAAM5O,QAAQ4O,KAAK2vB,EAC5C,CA4KMD,CAAmBF,EACrB,CAGF,OAAO58B,CACT,CAaA,SAASg9B,cACP,IAAK/pC,KAAKgqC,MAGR,OAFAhqC,KAAK+M,OAAOs7B,eAAeroC,KAAKyG,KAAMzG,KAAKiqC,QAC3CjqC,KAAKgqC,OAAQ,EACY,IAArB9iC,UAAUzE,OACLzC,KAAKipC,SAAS5gC,KAAKrI,KAAK+M,QAC1B/M,KAAKipC,SAASj+B,MAAMhL,KAAK+M,OAAQ7F,UAE5C,CAEA,SAASgjC,UAAUn9B,EAAQtG,EAAMwiC,GAC/B,IAAIviB,EAAQ,CAAEsjB,OAAO,EAAOC,YAAQ1jC,EAAWwG,OAAQA,EAAQtG,KAAMA,EAAMwiC,SAAUA,GACjFkB,EAAUJ,YAAYt0B,KAAKiR,GAG/B,OAFAyjB,EAAQlB,SAAWA,EACnBviB,EAAMujB,OAASE,EACRA,CACT,CAyHA,SAASC,WAAWr9B,EAAQtG,EAAM4jC,GAChC,IAAIhB,EAASt8B,EAAO67B,QAEpB,QAAeriC,IAAX8iC,EACF,MAAO,GAET,IAAIiB,EAAajB,EAAO5iC,GACxB,YAAmBF,IAAf+jC,EACK,GAEiB,mBAAfA,EACFD,EAAS,CAACC,EAAWrB,UAAYqB,GAAc,CAACA,GAElDD,EAsDT,SAASE,gBAAgBvoC,GAEvB,IADA,IAAIwL,EAAM,IAAIrK,MAAMnB,EAAIS,QACfV,EAAI,EAAGA,EAAIyL,EAAI/K,SAAUV,EAChCyL,EAAIzL,GAAKC,EAAID,GAAGknC,UAAYjnC,EAAID,GAElC,OAAOyL,CACT,CA3DI+8B,CAAgBD,GAAcE,WAAWF,EAAYA,EAAW7nC,OACpE,CAmBA,SAASgoC,cAAchkC,GACrB,IAAI4iC,EAASrpC,KAAK4oC,QAElB,QAAeriC,IAAX8iC,EAAsB,CACxB,IAAIiB,EAAajB,EAAO5iC,GAExB,GAA0B,mBAAf6jC,EACT,OAAO,EACF,QAAmB/jC,IAAf+jC,EACT,OAAOA,EAAW7nC,MAEtB,CAEA,OAAO,CACT,CAMA,SAAS+nC,WAAWxoC,EAAK+F,GAEvB,IADA,IAAIpC,EAAO,IAAIxC,MAAM4E,GACZhG,EAAI,EAAGA,EAAIgG,IAAKhG,EACvB4D,EAAK5D,GAAKC,EAAID,GAChB,OAAO4D,CACT,CA2CA,SAAS4iC,+BAA+BP,EAASx0B,EAAMy1B,EAAUP,GAC/D,GAA0B,mBAAfV,EAAQW,GACbD,EAAMX,KACRC,EAAQD,KAAKv0B,EAAMy1B,GAEnBjB,EAAQW,GAAGn1B,EAAMy1B,OAEd,IAAwC,mBAA7BjB,EAAQluB,iBAYxB,MAAM,IAAInV,UAAU,6EAA+EqjC,GATnGA,EAAQluB,iBAAiBtG,GAAM,SAASk3B,aAAajmC,GAG/CikC,EAAMX,MACRC,EAAQ2C,oBAAoBn3B,EAAMk3B,cAEpCzB,EAASxkC,EACX,GAGF,CACF,CAraAH,OAAOmH,eAAeq8B,aAAc,sBAAuB,CACzDp8B,YAAY,EACZC,IAAK,WACH,OAAOo9B,CACT,EACAx8B,IAAK,SAAS9H,GACZ,GAAmB,iBAARA,GAAoBA,EAAM,GAAKojC,EAAYpjC,GACpD,MAAM,IAAIL,WAAW,kGAAoGK,EAAM,KAEjIskC,EAAsBtkC,CACxB,IAGFqjC,aAAanV,KAAO,gBAEGpsB,IAAjBvG,KAAK4oC,SACL5oC,KAAK4oC,UAAYtkC,OAAO8Z,eAAepe,MAAM4oC,UAC/C5oC,KAAK4oC,QAAUtkC,OAAO6kB,OAAO,MAC7BnpB,KAAK6oC,aAAe,GAGtB7oC,KAAK8oC,cAAgB9oC,KAAK8oC,oBAAiBviC,CAC7C,EAIAuhC,aAAatjC,UAAUomC,gBAAkB,SAASA,gBAAgB7iC,GAChE,GAAiB,iBAANA,GAAkBA,EAAI,GAAK8/B,EAAY9/B,GAChD,MAAM,IAAI3D,WAAW,gFAAkF2D,EAAI,KAG7G,OADA/H,KAAK8oC,cAAgB/gC,EACd/H,IACT,EAQA8nC,aAAatjC,UAAUqmC,gBAAkB,SAASA,kBAChD,OAAO3B,iBAAiBlpC,KAC1B,EAEA8nC,aAAatjC,UAAUglC,KAAO,SAASA,KAAK/iC,GAE1C,IADA,IAAIyd,EAAO,GACFniB,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAKmiB,EAAKphB,KAAKoE,UAAUnF,IAC/D,IAAI+oC,EAAoB,UAATrkC,EAEX4iC,EAASrpC,KAAK4oC,QAClB,QAAeriC,IAAX8iC,EACFyB,EAAWA,QAA4BvkC,IAAjB8iC,EAAO79B,WAC1B,IAAKs/B,EACR,OAAO,EAGT,GAAIA,EAAS,CACX,IAAIC,EAGJ,GAFI7mB,EAAKzhB,OAAS,IAChBsoC,EAAK7mB,EAAK,IACR6mB,aAAc1nC,MAGhB,MAAM0nC,EAGR,IAAIlwB,EAAM,IAAIxX,MAAM,oBAAsB0nC,EAAK,KAAOA,EAAGr3B,QAAU,IAAM,KAEzE,MADAmH,EAAImwB,QAAUD,EACRlwB,CACR,CAEA,IAAI4tB,EAAUY,EAAO5iC,GAErB,QAAgBF,IAAZkiC,EACF,OAAO,EAET,GAAuB,mBAAZA,EACTd,EAAac,EAASzoC,KAAMkkB,OAE5B,KAAI9hB,EAAMqmC,EAAQhmC,OACdwoC,EAAYT,WAAW/B,EAASrmC,GACpC,IAASL,EAAI,EAAGA,EAAIK,IAAOL,EACzB4lC,EAAasD,EAAUlpC,GAAI/B,KAAMkkB,EAHX,CAM1B,OAAO,CACT,EAgEA4jB,aAAatjC,UAAU0mC,YAAc,SAASA,YAAYzkC,EAAMwiC,GAC9D,OAAOE,aAAanpC,KAAMyG,EAAMwiC,GAAU,EAC5C,EAEAnB,aAAatjC,UAAUmkC,GAAKb,aAAatjC,UAAU0mC,YAEnDpD,aAAatjC,UAAU2mC,gBACnB,SAASA,gBAAgB1kC,EAAMwiC,GAC7B,OAAOE,aAAanpC,KAAMyG,EAAMwiC,GAAU,EAC5C,EAoBJnB,aAAatjC,UAAUujC,KAAO,SAASA,KAAKthC,EAAMwiC,GAGhD,OAFAD,cAAcC,GACdjpC,KAAK2oC,GAAGliC,EAAMyjC,UAAUlqC,KAAMyG,EAAMwiC,IAC7BjpC,IACT,EAEA8nC,aAAatjC,UAAU4mC,oBACnB,SAASA,oBAAoB3kC,EAAMwiC,GAGjC,OAFAD,cAAcC,GACdjpC,KAAKmrC,gBAAgB1kC,EAAMyjC,UAAUlqC,KAAMyG,EAAMwiC,IAC1CjpC,IACT,EAGJ8nC,aAAatjC,UAAU6jC,eACnB,SAASA,eAAe5hC,EAAMwiC,GAC5B,IAAI58B,EAAMg9B,EAAQ/vB,EAAUvX,EAAGspC,EAK/B,GAHArC,cAAcC,QAGC1iC,KADf8iC,EAASrpC,KAAK4oC,SAEZ,OAAO5oC,KAGT,QAAauG,KADb8F,EAAOg9B,EAAO5iC,IAEZ,OAAOzG,KAET,GAAIqM,IAAS48B,GAAY58B,EAAK48B,WAAaA,EACb,KAAtBjpC,KAAK6oC,aACT7oC,KAAK4oC,QAAUtkC,OAAO6kB,OAAO,cAEtBkgB,EAAO5iC,GACV4iC,EAAOhB,gBACTroC,KAAKwpC,KAAK,iBAAkB/iC,EAAM4F,EAAK48B,UAAYA,SAElD,GAAoB,mBAAT58B,EAAqB,CAGrC,IAFAiN,GAAY,EAEPvX,EAAIsK,EAAK5J,OAAS,EAAGV,GAAK,EAAGA,IAChC,GAAIsK,EAAKtK,KAAOknC,GAAY58B,EAAKtK,GAAGknC,WAAaA,EAAU,CACzDoC,EAAmBh/B,EAAKtK,GAAGknC,SAC3B3vB,EAAWvX,EACX,KACF,CAGF,GAAIuX,EAAW,EACb,OAAOtZ,KAEQ,IAAbsZ,EACFjN,EAAKi/B,QAiIf,SAASC,UAAUl/B,EAAMyK,GACvB,KAAOA,EAAQ,EAAIzK,EAAK5J,OAAQqU,IAC9BzK,EAAKyK,GAASzK,EAAKyK,EAAQ,GAC7BzK,EAAK0rB,KACP,CAnIUwT,CAAUl/B,EAAMiN,GAGE,IAAhBjN,EAAK5J,SACP4mC,EAAO5iC,GAAQ4F,EAAK,SAEQ9F,IAA1B8iC,EAAOhB,gBACTroC,KAAKwpC,KAAK,iBAAkB/iC,EAAM4kC,GAAoBpC,EAC1D,CAEA,OAAOjpC,IACT,EAEJ8nC,aAAatjC,UAAUgnC,IAAM1D,aAAatjC,UAAU6jC,eAEpDP,aAAatjC,UAAUinC,mBACnB,SAASA,mBAAmBhlC,GAC1B,IAAIwkC,EAAW5B,EAAQtnC,EAGvB,QAAewE,KADf8iC,EAASrpC,KAAK4oC,SAEZ,OAAO5oC,KAGT,QAA8BuG,IAA1B8iC,EAAOhB,eAUT,OATyB,IAArBnhC,UAAUzE,QACZzC,KAAK4oC,QAAUtkC,OAAO6kB,OAAO,MAC7BnpB,KAAK6oC,aAAe,QACMtiC,IAAjB8iC,EAAO5iC,KACY,KAAtBzG,KAAK6oC,aACT7oC,KAAK4oC,QAAUtkC,OAAO6kB,OAAO,aAEtBkgB,EAAO5iC,IAEXzG,KAIT,GAAyB,IAArBkH,UAAUzE,OAAc,CAC1B,IACIgU,EADAsH,EAAOzZ,OAAOyZ,KAAKsrB,GAEvB,IAAKtnC,EAAI,EAAGA,EAAIgc,EAAKtb,SAAUV,EAEjB,oBADZ0U,EAAMsH,EAAKhc,KAEX/B,KAAKyrC,mBAAmBh1B,GAK1B,OAHAzW,KAAKyrC,mBAAmB,kBACxBzrC,KAAK4oC,QAAUtkC,OAAO6kB,OAAO,MAC7BnpB,KAAK6oC,aAAe,EACb7oC,IACT,CAIA,GAAyB,mBAFzBirC,EAAY5B,EAAO5iC,IAGjBzG,KAAKqoC,eAAe5hC,EAAMwkC,QACrB,QAAkB1kC,IAAd0kC,EAET,IAAKlpC,EAAIkpC,EAAUxoC,OAAS,EAAGV,GAAK,EAAGA,IACrC/B,KAAKqoC,eAAe5hC,EAAMwkC,EAAUlpC,IAIxC,OAAO/B,IACT,EAmBJ8nC,aAAatjC,UAAUymC,UAAY,SAASA,UAAUxkC,GACpD,OAAO2jC,WAAWpqC,KAAMyG,GAAM,EAChC,EAEAqhC,aAAatjC,UAAUknC,aAAe,SAASA,aAAajlC,GAC1D,OAAO2jC,WAAWpqC,KAAMyG,GAAM,EAChC,EAEAqhC,aAAa2C,cAAgB,SAASzC,EAASvhC,GAC7C,MAAqC,mBAA1BuhC,EAAQyC,cACVzC,EAAQyC,cAAchkC,GAEtBgkC,cAAcpiC,KAAK2/B,EAASvhC,EAEvC,EAEAqhC,aAAatjC,UAAUimC,cAAgBA,cAiBvC3C,aAAatjC,UAAUmnC,WAAa,SAASA,aAC3C,OAAO3rC,KAAK6oC,aAAe,EAAIpB,EAAeznC,KAAK4oC,SAAW,EAChE,gCCvaA,IAAIgD,EAAY,EAAQ,OAEpBC,EAAQ1iB,OAAO9lB,OAcnB,SAAS8lB,OAAO2iB,GAGd,OAFAC,eAAeC,YAAcF,EAAaE,aAAeF,EAAat4B,KAE/Du4B,eAEP,SAASA,eAAe/xB,GAKtB,OAJIA,IACFA,EAAS4xB,EAAU5gC,MAAM,KAAM9D,YAG1B,IAAI4kC,EAAa9xB,EAC1B,CACF,CAxBAna,EAAOD,QAAUisC,EAEjBA,EAAMI,KAAO9iB,OAAOyK,WACpBiY,EAAMj4B,MAAQuV,OAAO/kB,YACrBynC,EAAMK,UAAY/iB,OAAO0K,gBACzBgY,EAAMM,OAAShjB,OAAO2K,aACtB+X,EAAMplC,KAAO0iB,OAAOxkB,WACpBknC,EAAMO,IAAMjjB,OAAO4K,UAEnB8X,EAAM1iB,OAASA,mBCJb,WAGA,IAAIvE,EA4BJ,SAAS5K,OAAOqyB,GAsBd,IArBA,IAKIriC,EAEAvF,EACA3C,EAEAwqC,EAVAC,EAAW,EACXroB,EAAO,GAAG7e,MAAMgD,KAAKnB,WACrBnF,EAAI,EACJgG,EAAIskC,EAAI5pC,OACR8a,EAAS,GAETivB,GAAU,EAGVC,GAAc,EAEdC,QAAU,WAAa,OAAOxoB,EAAKqoB,IAAa,EAChDI,YAAc,WAEZ,IADA,IAAIC,EAAS,GACN,KAAKtrC,KAAK+qC,EAAItqC,KACnB6qC,GAAUP,EAAItqC,KACdiI,EAAIqiC,EAAItqC,GAEV,OAAO6qC,EAAOnqC,OAAS,EAAI4G,SAASujC,GAAU,IAChD,EAEG7qC,EAAIgG,IAAKhG,EAEd,GADAiI,EAAIqiC,EAAItqC,GACJyqC,EAeF,OAdAA,GAAU,EACD,KAALxiC,GACFyiC,GAAc,EACdziC,EAAIqiC,IAAMtqC,IAEE,KAALiI,GAA0B,KAAdqiC,EAAItqC,EAAI,IAC3B0qC,GAAc,EAEdziC,EAAIqiC,EADJtqC,GAAK,IAIL0qC,GAAc,EAEhBH,EAAYK,cACJ3iC,GACR,IAAK,IACHuT,GAAUlU,SAASqjC,UAAW,IAAI1lC,SAAS,GAC3C,MACF,IAAK,IAGDuW,GADiB,iBADnB9Y,EAAMioC,YACyBjoC,aAAe1D,OAClC0D,EAEA1D,OAAOC,aAAaqI,SAAS5E,EAAK,KAC9C,MACF,IAAK,IACH8Y,GAAUlU,SAASqjC,UAAW,IAC9B,MACF,IAAK,IACH5qC,EAAMf,OAAO8rC,WAAWH,WAAWI,QAAQR,GAAa,IACxD/uB,GAAUkvB,EAAc3qC,EAAMA,EAAIlB,QAAQ,KAAM,IAChD,MACF,IAAK,IACH2c,GAAUwvB,KAAKC,UAAUN,WACzB,MACF,IAAK,IACHnvB,GAAU,IAAMlU,SAASqjC,UAAW,IAAI1lC,SAAS,GACjD,MACF,IAAK,IACHuW,GAAUmvB,UACV,MACF,IAAK,IACHnvB,GAAU,KAAOlU,SAASqjC,UAAW,IAAI1lC,SAAS,IAClD,MACF,IAAK,IACHuW,GAAU,KAAOlU,SAASqjC,UAAW,IAAI1lC,SAAS,IAAIimC,cACtD,MACF,QACE1vB,GAAUvT,MAGG,MAANA,EACTwiC,GAAU,EAEVjvB,GAAUvT,EAGd,OAAOuT,CACT,EA3GEqH,EAAY/kB,EAAOD,QAAUoa,QASrBA,OAASA,OACnB4K,EAAUsoB,SAUV,SAASA,SAASb,EAAKc,GACrB,OAAOnzB,OAAOhP,MAAM,KAAM,CAACqhC,GAAKjgC,OAAO+gC,GACzC,EAVuB,oBAAZ5hC,SAAkD,mBAAhBA,QAAQ6hC,MACnDxoB,EAAUyoB,OAGZ,SAASA,SACP9hC,QAAQ6hC,IAAIpzB,OAAOhP,MAAM,KAAM9D,WACjC,EA2FF,CApHC,2BCPD,IACIomC,EAAQhpC,OAAOE,UAAUwC,SACzB8F,EAAM3C,KAAK2C,IAGXygC,EAAW,SAASA,SAASthC,EAAG/F,GAGhC,IAFA,IAAIlE,EAAM,GAEDD,EAAI,EAAGA,EAAIkK,EAAExJ,OAAQV,GAAK,EAC/BC,EAAID,GAAKkK,EAAElK,GAEf,IAAK,IAAI+G,EAAI,EAAGA,EAAI5C,EAAEzD,OAAQqG,GAAK,EAC/B9G,EAAI8G,EAAImD,EAAExJ,QAAUyD,EAAE4C,GAG1B,OAAO9G,CACX,EAqBAnC,EAAOD,QAAU,SAAS6V,KAAKiO,GAC3B,IAAI3W,EAAS/M,KACb,GAAsB,mBAAX+M,GApCA,sBAoCyBugC,EAAMtiC,MAAM+B,GAC5C,MAAM,IAAIpI,UAxCE,kDAwCwBoI,GAyBxC,IAvBA,IAEIkX,EAFAC,EAxBI,SAASspB,MAAMC,EAASzkC,GAEhC,IADA,IAAIhH,EAAM,GACDD,EAAIiH,GAAU,EAAGF,EAAI,EAAG/G,EAAI0rC,EAAQhrC,OAAQV,GAAK,EAAG+G,GAAK,EAC9D9G,EAAI8G,GAAK2kC,EAAQ1rC,GAErB,OAAOC,CACX,CAkBewrC,CAAMtmC,UAAW,GAqBxBwmC,EAAc5gC,EAAI,EAAGC,EAAOtK,OAASyhB,EAAKzhB,QAC1CkrC,EAAY,GACP5rC,EAAI,EAAGA,EAAI2rC,EAAa3rC,IAC7B4rC,EAAU5rC,GAAK,IAAMA,EAKzB,GAFAkiB,EAAQtI,SAAS,SAAU,oBA3CnB,SAAU3Z,EAAK4rC,GAEvB,IADA,IAAIjtC,EAAM,GACDoB,EAAI,EAAGA,EAAIC,EAAIS,OAAQV,GAAK,EACjCpB,GAAOqB,EAAID,GACPA,EAAI,EAAIC,EAAIS,SACZ9B,GAAOitC,GAGf,OAAOjtC,CACX,CAkCqDktC,CAAMF,EAAW,KAAO,4CAAjEhyB,EAxBK,WACT,GAAI3b,gBAAgBikB,EAAO,CACvB,IAAI1G,EAASxQ,EAAO/B,MAChBhL,KACAutC,EAASrpB,EAAMhd,YAEnB,OAAI5C,OAAOiZ,KAAYA,EACZA,EAEJvd,IACX,CACA,OAAO+M,EAAO/B,MACV0Y,EACA6pB,EAASrpB,EAAMhd,WAGvB,IAUI6F,EAAOvI,UAAW,CAClB,IAAIspC,EAAQ,SAASA,QAAS,EAC9BA,EAAMtpC,UAAYuI,EAAOvI,UACzByf,EAAMzf,UAAY,IAAIspC,EACtBA,EAAMtpC,UAAY,IACtB,CAEA,OAAOyf,CACX,gCCjFA,IAAI8Y,EAAiB,EAAQ,OAE7Bl9B,EAAOD,QAAU+b,SAASnX,UAAUiR,MAAQsnB,gCCF5C,IAAIx2B,EAEAwnC,EAAeja,YACflQ,EAAYjI,SACZM,EAAatX,UAGbqpC,sBAAwB,SAAUC,GACrC,IACC,OAAOrqB,EAAU,yBAA2BqqB,EAAmB,iBAAxDrqB,EACR,CAAE,MAAOtY,GAAI,CACd,EAEIuK,EAAQvR,OAAO2Z,yBACnB,GAAIpI,EACH,IACCA,EAAM,CAAC,EAAG,GACX,CAAE,MAAOvK,GACRuK,EAAQ,IACT,CAGD,IAAIq4B,eAAiB,WACpB,MAAM,IAAIjyB,CACX,EACIkyB,EAAiBt4B,EACjB,WACF,IAGC,OAAOq4B,cACR,CAAE,MAAOE,GACR,IAEC,OAAOv4B,EAAM3O,UAAW,UAAUyE,GACnC,CAAE,MAAO0iC,GACR,OAAOH,cACR,CACD,CACD,CAbE,GAcAA,eAECI,EAAa,EAAQ,MAAR,GACbC,EAAW,EAAQ,MAAR,GAEXC,EAAWlqC,OAAO8Z,iBACrBmwB,EACG,SAAUriC,GAAK,OAAOA,EAAEojB,SAAW,EACnC,MAGAmf,EAAY,CAAC,EAEbC,GAAmC,oBAAfxrC,YAA+BsrC,EAAuBA,EAAStrC,YAArBqD,EAE9DooC,GAAa,CAChB,mBAA8C,oBAAnBrzB,eAAiC/U,EAAY+U,eACxE,UAAWnY,MACX,gBAAwC,oBAAhBmC,YAA8BiB,EAAYjB,YAClE,2BAA4BgpC,GAAcE,EAAWA,EAAS,GAAG3qC,OAAOukB,aAAe7hB,EACvF,mCAAoCA,EACpC,kBAAmBkoC,EACnB,mBAAoBA,EACpB,2BAA4BA,EAC5B,2BAA4BA,EAC5B,YAAgC,oBAAZG,QAA0BroC,EAAYqoC,QAC1D,WAA8B,oBAAX3gC,OAAyB1H,EAAY0H,OACxD,kBAA4C,oBAAlB4gC,cAAgCtoC,EAAYsoC,cACtE,mBAA8C,oBAAnBC,eAAiCvoC,EAAYuoC,eACxE,YAAatN,QACb,aAAkC,oBAAbuN,SAA2BxoC,EAAYwoC,SAC5D,SAAUj3B,KACV,cAAek3B,UACf,uBAAwB52B,mBACxB,cAAe62B,UACf,uBAAwB52B,mBACxB,UAAWhV,MACX,SAAU4oC,KACV,cAAerY,UACf,iBAA0C,oBAAjBsb,aAA+B3oC,EAAY2oC,aACpE,iBAA0C,oBAAjBC,aAA+B5oC,EAAY4oC,aACpE,yBAA0D,oBAAzBC,qBAAuC7oC,EAAY6oC,qBACpF,aAAcxrB,EACd,sBAAuB6qB,EACvB,cAAoC,oBAAdY,UAA4B9oC,EAAY8oC,UAC9D,eAAsC,oBAAfC,WAA6B/oC,EAAY+oC,WAChE,eAAsC,oBAAfC,WAA6BhpC,EAAYgpC,WAChE,aAAcliC,SACd,UAAWmK,MACX,sBAAuB82B,GAAcE,EAAWA,EAASA,EAAS,GAAG3qC,OAAOukB,cAAgB7hB,EAC5F,SAA0B,iBAATwmC,KAAoBA,KAAOxmC,EAC5C,QAAwB,oBAARipC,IAAsBjpC,EAAYipC,IAClD,yBAAyC,oBAARA,KAAwBlB,GAAeE,EAAuBA,GAAS,IAAIgB,KAAM3rC,OAAOukB,aAAtC7hB,EACnF,SAAU4D,KACV,WAAYlB,OACZ,WAAY3E,OACZ,eAAgBuoC,WAChB,aAAcxjC,SACd,YAAgC,oBAAZ4+B,QAA0B1hC,EAAY0hC,QAC1D,UAA4B,oBAAVwH,MAAwBlpC,EAAYkpC,MACtD,eAAgBrrC,WAChB,mBAAoByvB,eACpB,YAAgC,oBAAZrQ,QAA0Bjd,EAAYid,QAC1D,WAAYuR,OACZ,QAAwB,oBAAR2a,IAAsBnpC,EAAYmpC,IAClD,yBAAyC,oBAARA,KAAwBpB,GAAeE,EAAuBA,GAAS,IAAIkB,KAAM7rC,OAAOukB,aAAtC7hB,EACnF,sBAAoD,oBAAtBP,kBAAoCO,EAAYP,kBAC9E,WAAYjF,OACZ,4BAA6ButC,GAAcE,EAAWA,EAAS,GAAG3qC,OAAOukB,aAAe7hB,EACxF,WAAY+nC,EAAazqC,OAAS0C,EAClC,gBAAiBwnC,EACjB,mBAAoBI,EACpB,eAAgBO,GAChB,cAAezyB,EACf,eAAsC,oBAAf/Y,WAA6BqD,EAAYrD,WAChE,sBAAoD,oBAAtBysC,kBAAoCppC,EAAYopC,kBAC9E,gBAAwC,oBAAhBC,YAA8BrpC,EAAYqpC,YAClE,gBAAwC,oBAAhBC,YAA8BtpC,EAAYspC,YAClE,aAAc9b,SACd,YAAgC,oBAAZtN,QAA0BlgB,EAAYkgB,QAC1D,YAAgC,oBAAZqpB,QAA0BvpC,EAAYupC,QAC1D,YAAgC,oBAAZC,QAA0BxpC,EAAYwpC,SAG3D,GAAIvB,EACH,IACC,KAAKhjC,KACN,CAAE,MAAOF,GAER,IAAI0kC,GAAaxB,EAASA,EAASljC,IACnCqjC,GAAW,qBAAuBqB,EACnC,CAGD,IAAIC,GAAS,SAASA,OAAOz8B,GAC5B,IAAI1O,EACJ,GAAa,oBAAT0O,EACH1O,EAAQkpC,sBAAsB,6BACxB,GAAa,wBAATx6B,EACV1O,EAAQkpC,sBAAsB,wBACxB,GAAa,6BAATx6B,EACV1O,EAAQkpC,sBAAsB,8BACxB,GAAa,qBAATx6B,EAA6B,CACvC,IAAIyB,EAAKg7B,OAAO,4BACZh7B,IACHnQ,EAAQmQ,EAAGzQ,UAEb,MAAO,GAAa,6BAATgP,EAAqC,CAC/C,IAAI08B,EAAMD,OAAO,oBACbC,GAAO1B,IACV1pC,EAAQ0pC,EAAS0B,EAAI1rC,WAEvB,CAIA,OAFAmqC,GAAWn7B,GAAQ1O,EAEZA,CACR,EAEIqrC,GAAiB,CACpB,yBAA0B,CAAC,cAAe,aAC1C,mBAAoB,CAAC,QAAS,aAC9B,uBAAwB,CAAC,QAAS,YAAa,WAC/C,uBAAwB,CAAC,QAAS,YAAa,WAC/C,oBAAqB,CAAC,QAAS,YAAa,QAC5C,sBAAuB,CAAC,QAAS,YAAa,UAC9C,2BAA4B,CAAC,gBAAiB,aAC9C,mBAAoB,CAAC,yBAA0B,aAC/C,4BAA6B,CAAC,yBAA0B,YAAa,aACrE,qBAAsB,CAAC,UAAW,aAClC,sBAAuB,CAAC,WAAY,aACpC,kBAAmB,CAAC,OAAQ,aAC5B,mBAAoB,CAAC,QAAS,aAC9B,uBAAwB,CAAC,YAAa,aACtC,0BAA2B,CAAC,eAAgB,aAC5C,0BAA2B,CAAC,eAAgB,aAC5C,sBAAuB,CAAC,WAAY,aACpC,cAAe,CAAC,oBAAqB,aACrC,uBAAwB,CAAC,oBAAqB,YAAa,aAC3D,uBAAwB,CAAC,YAAa,aACtC,wBAAyB,CAAC,aAAc,aACxC,wBAAyB,CAAC,aAAc,aACxC,cAAe,CAAC,OAAQ,SACxB,kBAAmB,CAAC,OAAQ,aAC5B,iBAAkB,CAAC,MAAO,aAC1B,oBAAqB,CAAC,SAAU,aAChC,oBAAqB,CAAC,SAAU,aAChC,sBAAuB,CAAC,SAAU,YAAa,YAC/C,qBAAsB,CAAC,SAAU,YAAa,WAC9C,qBAAsB,CAAC,UAAW,aAClC,sBAAuB,CAAC,UAAW,YAAa,QAChD,gBAAiB,CAAC,UAAW,OAC7B,mBAAoB,CAAC,UAAW,UAChC,oBAAqB,CAAC,UAAW,WACjC,wBAAyB,CAAC,aAAc,aACxC,4BAA6B,CAAC,iBAAkB,aAChD,oBAAqB,CAAC,SAAU,aAChC,iBAAkB,CAAC,MAAO,aAC1B,+BAAgC,CAAC,oBAAqB,aACtD,oBAAqB,CAAC,SAAU,aAChC,oBAAqB,CAAC,SAAU,aAChC,yBAA0B,CAAC,cAAe,aAC1C,wBAAyB,CAAC,aAAc,aACxC,uBAAwB,CAAC,YAAa,aACtC,wBAAyB,CAAC,aAAc,aACxC,+BAAgC,CAAC,oBAAqB,aACtD,yBAA0B,CAAC,cAAe,aAC1C,yBAA0B,CAAC,cAAe,aAC1C,sBAAuB,CAAC,WAAY,aACpC,qBAAsB,CAAC,UAAW,aAClC,qBAAsB,CAAC,UAAW,cAG/B16B,GAAO,EAAQ,OACfU,GAAS,EAAQ,OACjBi6B,GAAU36B,GAAKpN,KAAKsT,SAAStT,KAAMlF,MAAMqB,UAAU4H,QACnDikC,GAAe56B,GAAKpN,KAAKsT,SAAS3Q,MAAO7H,MAAMqB,UAAU8rC,QACzDC,GAAW96B,GAAKpN,KAAKsT,SAAStT,KAAMtH,OAAOyD,UAAU5D,SACrD4vC,GAAY/6B,GAAKpN,KAAKsT,SAAStT,KAAMtH,OAAOyD,UAAUa,OACtDorC,GAAQh7B,GAAKpN,KAAKsT,SAAStT,KAAM0sB,OAAOvwB,UAAU8e,MAGlDotB,GAAa,qGACbC,GAAe,WAiBfC,GAAmB,SAASA,iBAAiBp9B,EAAM+B,GACtD,IACIs7B,EADAC,EAAgBt9B,EAOpB,GALI2C,GAAOg6B,GAAgBW,KAE1BA,EAAgB,KADhBD,EAAQV,GAAeW,IACK,GAAK,KAG9B36B,GAAOw4B,GAAYmC,GAAgB,CACtC,IAAIhsC,EAAQ6pC,GAAWmC,GAIvB,GAHIhsC,IAAU2pC,IACb3pC,EAAQmrC,GAAOa,SAEK,IAAVhsC,IAA0ByQ,EACpC,MAAM,IAAI0G,EAAW,aAAezI,EAAO,wDAG5C,MAAO,CACNq9B,MAAOA,EACPr9B,KAAMs9B,EACNhsC,MAAOA,EAET,CAEA,MAAM,IAAIipC,EAAa,aAAev6B,EAAO,mBAC9C,EAEA3T,EAAOD,QAAU,SAASuV,aAAa3B,EAAM+B,GAC5C,GAAoB,iBAAT/B,GAAqC,IAAhBA,EAAK/Q,OACpC,MAAM,IAAIwZ,EAAW,6CAEtB,GAAI/U,UAAUzE,OAAS,GAA6B,kBAAjB8S,EAClC,MAAM,IAAI0G,EAAW,6CAGtB,GAAmC,OAA/Bw0B,GAAM,cAAej9B,GACxB,MAAM,IAAIu6B,EAAa,sFAExB,IAAIprC,EAtDc,SAASouC,aAAa/rC,GACxC,IAAI2K,EAAQ6gC,GAAUxrC,EAAQ,EAAG,GAC7B4K,EAAO4gC,GAAUxrC,GAAS,GAC9B,GAAc,MAAV2K,GAA0B,MAATC,EACpB,MAAM,IAAIm+B,EAAa,kDACjB,GAAa,MAATn+B,GAA0B,MAAVD,EAC1B,MAAM,IAAIo+B,EAAa,kDAExB,IAAIxwB,EAAS,GAIb,OAHAgzB,GAASvrC,EAAQ0rC,IAAY,SAAU7vC,EAAO8vB,EAAQqgB,EAAOC,GAC5D1zB,EAAOA,EAAO9a,QAAUuuC,EAAQT,GAASU,EAAWN,GAAc,MAAQhgB,GAAU9vB,CACrF,IACO0c,CACR,CAyCawzB,CAAav9B,GACrB09B,EAAoBvuC,EAAMF,OAAS,EAAIE,EAAM,GAAK,GAElD6S,EAAYo7B,GAAiB,IAAMM,EAAoB,IAAK37B,GAC5D47B,EAAoB37B,EAAUhC,KAC9B1O,EAAQ0Q,EAAU1Q,MAClBssC,GAAqB,EAErBP,EAAQr7B,EAAUq7B,MAClBA,IACHK,EAAoBL,EAAM,GAC1BR,GAAa1tC,EAAOytC,GAAQ,CAAC,EAAG,GAAIS,KAGrC,IAAK,IAAI9uC,EAAI,EAAGsvC,IAAQ,EAAMtvC,EAAIY,EAAMF,OAAQV,GAAK,EAAG,CACvD,IAAIuvC,GAAO3uC,EAAMZ,GACb4N,GAAQ6gC,GAAUc,GAAM,EAAG,GAC3B1hC,GAAO4gC,GAAUc,IAAO,GAC5B,IAEa,MAAV3hC,IAA2B,MAAVA,IAA2B,MAAVA,IACtB,MAATC,IAAyB,MAATA,IAAyB,MAATA,KAElCD,KAAUC,GAEb,MAAM,IAAIm+B,EAAa,wDASxB,GAPa,gBAATuD,IAA2BD,KAC9BD,GAAqB,GAMlBj7B,GAAOw4B,GAFXwC,EAAoB,KADpBD,GAAqB,IAAMI,IACmB,KAG7CxsC,EAAQ6pC,GAAWwC,QACb,GAAa,MAATrsC,EAAe,CACzB,KAAMwsC,MAAQxsC,GAAQ,CACrB,IAAKyQ,EACJ,MAAM,IAAI0G,EAAW,sBAAwBzI,EAAO,+CAErD,MACD,CACA,GAAIqC,GAAU9T,EAAI,GAAMY,EAAMF,OAAQ,CACrC,IAAI62B,GAAOzjB,EAAM/Q,EAAOwsC,IAWvBxsC,GAVDusC,KAAU/X,KASG,QAASA,MAAU,kBAAmBA,GAAK3tB,KAC/C2tB,GAAK3tB,IAEL7G,EAAMwsC,GAEhB,MACCD,GAAQl7B,GAAOrR,EAAOwsC,IACtBxsC,EAAQA,EAAMwsC,IAGXD,KAAUD,IACbzC,GAAWwC,GAAqBrsC,EAElC,CACD,CACA,OAAOA,CACR,0BC5VA,IAAIxD,EAAO,CACV+J,IAAK,CAAC,GAGH+R,EAAU9Y,OAEdzE,EAAOD,QAAU,SAAS2uC,WACzB,MAAO,CAAEjf,UAAWhuB,GAAO+J,MAAQ/J,EAAK+J,OAAS,CAAEikB,UAAW,gBAAkBlS,EACjF,gCCRA,IAAIm0B,EAA+B,oBAAX1tC,QAA0BA,OAC9C2tC,EAAgB,EAAQ,OAE5B3xC,EAAOD,QAAU,SAAS6xC,mBACzB,MAA0B,mBAAfF,IACW,mBAAX1tC,SACsB,iBAAtB0tC,EAAW,SACO,iBAAlB1tC,OAAO,QAEX2tC,MACR,0BCTA3xC,EAAOD,QAAU,SAAS0uC,aACzB,GAAsB,mBAAXzqC,QAAiE,mBAAjCS,OAAOgoB,sBAAwC,OAAO,EACjG,GAA+B,iBAApBzoB,OAAOukB,SAAyB,OAAO,EAElD,IAAIhiB,EAAM,CAAC,EACP4M,EAAMnP,OAAO,QACb6tC,EAASptC,OAAO0O,GACpB,GAAmB,iBAARA,EAAoB,OAAO,EAEtC,GAA4C,oBAAxC1O,OAAOE,UAAUwC,SAASqB,KAAK2K,GAA8B,OAAO,EACxE,GAA+C,oBAA3C1O,OAAOE,UAAUwC,SAASqB,KAAKqpC,GAAiC,OAAO,EAY3E,IAAK1+B,KADL5M,EAAI4M,GADS,GAED5M,EAAO,OAAO,EAC1B,GAA2B,mBAAhB9B,OAAOyZ,MAAmD,IAA5BzZ,OAAOyZ,KAAK3X,GAAK3D,OAAgB,OAAO,EAEjF,GAA0C,mBAA/B6B,OAAOsqB,qBAAiF,IAA3CtqB,OAAOsqB,oBAAoBxoB,GAAK3D,OAAgB,OAAO,EAE/G,IAAIkvC,EAAOrtC,OAAOgoB,sBAAsBlmB,GACxC,GAAoB,IAAhBurC,EAAKlvC,QAAgBkvC,EAAK,KAAO3+B,EAAO,OAAO,EAEnD,IAAK1O,OAAOE,UAAUshB,qBAAqBzd,KAAKjC,EAAK4M,GAAQ,OAAO,EAEpE,GAA+C,mBAApC1O,OAAO2Z,yBAAyC,CAC1D,IAAIwE,EAAane,OAAO2Z,yBAAyB7X,EAAK4M,GACtD,GAdY,KAcRyP,EAAW3d,QAA8C,IAA1B2d,EAAW/W,WAAuB,OAAO,CAC7E,CAEA,OAAO,CACR,gCCvCA,IAAI+J,EAAO,EAAQ,OAEnB5V,EAAOD,QAAU6V,EAAKpN,KAAKsT,SAAStT,KAAM/D,OAAOE,UAAU4R,2BCJ3D,SAASw7B,WAAWxrC,GAuBhB,OAtBIA,aAAeopC,IACfppC,EAAIyrC,MAAQzrC,EAAI0rC,OAAS1rC,EAAImG,IAAM,WAC/B,MAAM,IAAIlJ,MAAM,mBACpB,EACO+C,aAAespC,MACtBtpC,EAAIugC,IAAMvgC,EAAIyrC,MAAQzrC,EAAI0rC,OAAS,WAC/B,MAAM,IAAIzuC,MAAM,mBACpB,GAIJiB,OAAOizB,OAAOnxB,GAEd9B,OAAOsqB,oBAAoBxoB,GAAK8lB,SAAQ,SAAU1Y,GAC9C,IAAI6lB,EAAOjzB,EAAIoN,GAGI,iBAAR6lB,GAAqB/0B,OAAOgzB,SAAS+B,IAC5CuY,WAAWvY,EAEnB,IAEOjzB,CACX,CAEA,IAAI2rC,EAAgBH,WAChBI,EAAWJ,WACfG,EAAcr7B,QAAUs7B,EAGxB,MAAMC,SAIJ,WAAA7+B,CAAY4c,QAEQzpB,IAAdypB,EAAKrpB,OAAoBqpB,EAAKrpB,KAAO,CAAC,GAE1C3G,KAAK2G,KAAOqpB,EAAKrpB,KACjB3G,KAAKkyC,gBAAiB,CACxB,CAEA,WAAAC,GACEnyC,KAAKkyC,gBAAiB,CACxB,EAOF,SAASE,WAAWttC,GAClB,OAAOA,EACJlE,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,SACnB,CAUA,SAASyxC,QAAQC,KAAaC,GAE5B,MAAMh1B,EAASjZ,OAAO6kB,OAAO,MAE7B,IAAK,MAAM1S,KAAO67B,EAChB/0B,EAAO9G,GAAO67B,EAAS77B,GAOzB,OALA87B,EAAQrmB,SAAQ,SAAS9lB,GACvB,IAAK,MAAMqQ,KAAOrQ,EAChBmX,EAAO9G,GAAOrQ,EAAIqQ,EAEtB,IACwB,CAC1B,CAcA,MAMM+7B,kBAAqB9Q,KAChBA,EAAK3Y,KAIhB,MAAM0pB,aAOJ,WAAAr/B,CAAYs/B,EAAW97B,GACrB5W,KAAK6F,OAAS,GACd7F,KAAK2yC,YAAc/7B,EAAQ+7B,YAC3BD,EAAUE,KAAK5yC,KACjB,CAMA,OAAA6yC,CAAQr6B,GACNxY,KAAK6F,QAAUusC,WAAW55B,EAC5B,CAMA,QAAAs6B,CAASpR,GACP,IAAK8Q,kBAAkB9Q,GAAO,OAE9B,IAAIqR,EAAYrR,EAAK3Y,KAChB2Y,EAAKsR,cACRD,EAAY,GAAG/yC,KAAK2yC,cAAcI,KAEpC/yC,KAAKizC,KAAKF,EACZ,CAMA,SAAAG,CAAUxR,GACH8Q,kBAAkB9Q,KAEvB1hC,KAAK6F,QArDU,UAsDjB,CAKA,KAAAf,GACE,OAAO9E,KAAK6F,MACd,CAQA,IAAAotC,CAAKF,GACH/yC,KAAK6F,QAAU,gBAAgBktC,KACjC,EAOF,MAAMI,UACJ,WAAA//B,GAEEpT,KAAKozC,SAAW,CAAEC,SAAU,IAC5BrzC,KAAKyT,MAAQ,CAACzT,KAAKozC,SACrB,CAEA,OAAI75B,GACF,OAAOvZ,KAAKyT,MAAMzT,KAAKyT,MAAMhR,OAAS,EACxC,CAEA,QAAI/C,GAAS,OAAOM,KAAKozC,QAAU,CAGnC,GAAAzM,CAAIjF,GACF1hC,KAAKuZ,IAAI85B,SAASvwC,KAAK4+B,EACzB,CAGA,QAAAoR,CAAS/pB,GAEP,MAAM2Y,EAAO,CAAE3Y,OAAMsqB,SAAU,IAC/BrzC,KAAK2mC,IAAIjF,GACT1hC,KAAKyT,MAAM3Q,KAAK4+B,EAClB,CAEA,SAAAwR,GACE,GAAIlzC,KAAKyT,MAAMhR,OAAS,EACtB,OAAOzC,KAAKyT,MAAMskB,KAItB,CAEA,aAAAub,GACE,KAAOtzC,KAAKkzC,cACd,CAEA,MAAA5lC,GACE,OAAOy/B,KAAKC,UAAUhtC,KAAKozC,SAAU,KAAM,EAC7C,CAMA,IAAAR,CAAKW,GAEH,OAAOvzC,KAAKoT,YAAYogC,MAAMD,EAASvzC,KAAKozC,SAG9C,CAMA,YAAOI,CAAMD,EAAS7R,GAQpB,MAPoB,iBAATA,EACT6R,EAAQV,QAAQnR,GACPA,EAAK2R,WACdE,EAAQT,SAASpR,GACjBA,EAAK2R,SAASnnB,SAASunB,GAAUzzC,KAAKwzC,MAAMD,EAASE,KACrDF,EAAQL,UAAUxR,IAEb6R,CACT,CAKA,gBAAOG,CAAUhS,GACK,iBAATA,GACNA,EAAK2R,WAEN3R,EAAK2R,SAASM,OAAMh3B,GAAoB,iBAAPA,IAGnC+kB,EAAK2R,SAAW,CAAC3R,EAAK2R,SAASpwC,KAAK,KAEpCy+B,EAAK2R,SAASnnB,SAASunB,IACrBN,UAAUO,UAAUD,EAAM,IAGhC,EAuBF,MAAMG,yBAAyBT,UAI7B,WAAA//B,CAAYwD,GACVvD,QACArT,KAAK4W,QAAUA,CACjB,CAMA,UAAAi9B,CAAWr7B,EAAMuQ,GACF,KAATvQ,IAEJxY,KAAK8yC,SAAS/pB,GACd/oB,KAAK6yC,QAAQr6B,GACbxY,KAAKkzC,YACP,CAKA,OAAAL,CAAQr6B,GACO,KAATA,GAEJxY,KAAK2mC,IAAInuB,EACX,CAMA,cAAAs7B,CAAe9L,EAASx0B,GAEtB,MAAMkuB,EAAOsG,EAAQtoC,KACrBgiC,EAAK3Y,KAAOvV,EACZkuB,EAAKsR,aAAc,EACnBhzC,KAAK2mC,IAAIjF,EACX,CAEA,MAAAqS,GAEE,OADiB,IAAItB,aAAazyC,KAAMA,KAAK4W,SAC7B9R,OAClB,CAEA,QAAAkvC,GACE,OAAO,CACT,EAeF,SAASn2B,OAAOo2B,GACd,OAAKA,EACa,iBAAPA,EAAwBA,EAE5BA,EAAGp2B,OAHM,IAIlB,CAgDA,MAAMq2B,EAAa,iDA4CnB,MACMC,EAAW,eACXC,EAAsB,gBACtBC,EAAY,oBACZC,EAAc,yEACdC,EAAmB,eA4BnBC,EAAmB,CACvBC,MAAO,eAAgBC,UAAW,GAE9BC,EAAmB,CACvB5B,UAAW,SACX0B,MAAO,IACPlxC,IAAK,IACLqxC,QAAS,MACTC,SAAU,CAACL,IAEPM,EAAoB,CACxB/B,UAAW,SACX0B,MAAO,IACPlxC,IAAK,IACLqxC,QAAS,MACTC,SAAU,CAACL,IAEPO,EAAqB,CACzBN,MAAO,8IAUHO,QAAU,SAASP,EAAOlxC,EAAK0xC,EAAc,CAAC,GAClD,MAAMjlB,EAAOqiB,QACX,CACEU,UAAW,UACX0B,QACAlxC,MACAsxC,SAAU,IAEZI,GAQF,OANAjlB,EAAK6kB,SAAS/xC,KAAKiyC,GACnB/kB,EAAK6kB,SAAS/xC,KAAK,CACjBiwC,UAAW,SACX0B,MAAO,6CACPC,UAAW,IAEN1kB,CACT,EACMklB,GAAsBF,QAAQ,KAAM,KACpCG,GAAuBH,QAAQ,OAAQ,QACvCI,GAAoBJ,QAAQ,IAAK,KACjCK,GAAc,CAClBtC,UAAW,SACX0B,MAAOJ,EACPK,UAAW,GAEPY,GAAgB,CACpBvC,UAAW,SACX0B,MAAOH,EACPI,UAAW,GAEPa,GAAqB,CACzBxC,UAAW,SACX0B,MAAOF,EACPG,UAAW,GAEPc,GAAkB,CACtBzC,UAAW,SACX0B,MAAOJ,oGASPK,UAAW,GAEPe,GAAc,CAOlBhB,MAAO,kBACPI,SAAU,CAAC,CACT9B,UAAW,SACX0B,MAAO,KACPlxC,IAAK,aACLqxC,QAAS,KACTC,SAAU,CACRL,EACA,CACEC,MAAO,KACPlxC,IAAK,KACLmxC,UAAW,EACXG,SAAU,CAACL,QAKbkB,GAAa,CACjB3C,UAAW,QACX0B,MAAON,EACPO,UAAW,GAEPiB,GAAwB,CAC5B5C,UAAW,QACX0B,MAAOL,EACPM,UAAW,GAEPkB,GAAe,CAEnBnB,MAAO,UAAYL,EACnBM,UAAW,GAoBb,IAAImB,GAAqBvxC,OAAOizB,OAAO,CACnCjI,UAAW,KACXwmB,iBAzKqB,OA0KrB3B,SAAUA,EACVC,oBAAqBA,EACrBC,UAAWA,EACXC,YAAaA,EACbC,iBAAkBA,EAClBwB,eAzKmB,+IA0KnBC,QArKY,CAACC,EAAO,CAAC,KACvB,MAAMC,EAAe,YAQrB,OAPID,EAAKE,SACPF,EAAKxB,MApGT,SAASroC,UAAU8X,GAEjB,OADeA,EAAKkS,KAAKlqB,GAAM2R,OAAO3R,KAAIjJ,KAAK,GAEjD,CAiGiBmJ,CACX8pC,EACA,OACAD,EAAKE,OACL,SAEG9D,QAAQ,CACbU,UAAW,OACX0B,MAAOyB,EACP3yC,IAAK,IACLmxC,UAAW,EAEX,WAAY,CAAC1sC,EAAGouC,KACE,IAAZpuC,EAAE8O,OAAas/B,EAAKjE,aAAa,GAEtC8D,EAAK,EAoJNzB,iBAAkBA,EAClBG,iBAAkBA,EAClBG,kBAAmBA,EACnBC,mBAAoBA,EACpBC,QACAE,oBAAqBA,GACrBC,qBAAsBA,GACtBC,kBAAmBA,GACnBC,YAAaA,GACbC,cAAeA,GACfC,mBAAoBA,GACpBC,gBAAiBA,GACjBC,YAAaA,GACbC,WAAYA,GACZC,sBAAuBA,GACvBC,aAAcA,GACdS,kBApCsB,SAASrmB,GACjC,OAAO1rB,OAAOwX,OAAOkU,EACnB,CAEE,WAAY,CAAChoB,EAAGouC,KAAWA,EAAKzvC,KAAK2vC,YAActuC,EAAE,EAAE,EAEvD,SAAU,CAACA,EAAGouC,KAAeA,EAAKzvC,KAAK2vC,cAAgBtuC,EAAE,IAAIouC,EAAKjE,aAAa,GAErF,IAuDA,SAASoE,sBAAsB11C,EAAO21C,GAErB,MADA31C,EAAMqT,MAAMrT,EAAMiW,MAAQ,IAEvC0/B,EAASrE,aAEb,CAOA,SAASsE,cAAczmB,EAAM3U,GACtBA,GACA2U,EAAKymB,gBAOVzmB,EAAKykB,MAAQ,OAASzkB,EAAKymB,cAAc9hC,MAAM,KAAK1R,KAAK,KAAO,sBAChE+sB,EAAK0mB,cAAgBH,sBACrBvmB,EAAK2mB,SAAW3mB,EAAK2mB,UAAY3mB,EAAKymB,qBAC/BzmB,EAAKymB,mBAKWlwC,IAAnBypB,EAAK0kB,YAAyB1kB,EAAK0kB,UAAY,GACrD,CAMA,SAASkC,eAAe5mB,EAAM6mB,GACvB1zC,MAAMuD,QAAQspB,EAAK4kB,WAExB5kB,EAAK4kB,QA7UP,SAASkC,UAAU5yB,GAEjB,MADe,IAAMA,EAAKkS,KAAKlqB,GAAM2R,OAAO3R,KAAIjJ,KAAK,KAAO,GAE9D,CA0UiB6zC,IAAU9mB,EAAK4kB,SAChC,CAMA,SAASmC,aAAa/mB,EAAM6mB,GAC1B,GAAK7mB,EAAKnvB,MAAV,CACA,GAAImvB,EAAKykB,OAASzkB,EAAKzsB,IAAK,MAAM,IAAIF,MAAM,4CAE5C2sB,EAAKykB,MAAQzkB,EAAKnvB,aACXmvB,EAAKnvB,KAJW,CAKzB,CAMA,SAASm2C,iBAAiBhnB,EAAM6mB,QAEPtwC,IAAnBypB,EAAK0kB,YAAyB1kB,EAAK0kB,UAAY,EACrD,CAGA,MAAMuC,GAAkB,CACtB,KACA,MACA,MACA,KACA,MACA,KACA,KACA,OACA,SACA,OACA,SAGIC,GAA4B,UAQlC,SAASC,gBAAgBC,EAAaC,EAAiBtE,EAAYmE,IAEjE,MAAMI,EAAmB,CAAC,EAiB1B,MAb2B,iBAAhBF,EACTG,YAAYxE,EAAWqE,EAAYziC,MAAM,MAChCxR,MAAMuD,QAAQ0wC,GACvBG,YAAYxE,EAAWqE,GAEvB9yC,OAAOyZ,KAAKq5B,GAAalrB,SAAQ,SAAS6mB,GAExCzuC,OAAOwX,OACLw7B,EACAH,gBAAgBC,EAAYrE,GAAYsE,EAAiBtE,GAE7D,IAEKuE,EAYP,SAASC,YAAYxE,EAAWyE,GAC1BH,IACFG,EAAcA,EAAYphB,KAAIlqB,GAAKA,EAAE5E,iBAEvCkwC,EAAYtrB,SAAQ,SAASurB,GAC3B,MAAMC,EAAOD,EAAQ9iC,MAAM,KAC3B2iC,EAAiBI,EAAK,IAAM,CAAC3E,EAAW4E,gBAAgBD,EAAK,GAAIA,EAAK,IACxE,GACF,CACF,CAUA,SAASC,gBAAgBF,EAASG,GAGhC,OAAIA,EACK3uC,OAAO2uC,GAUlB,SAASC,cAAcJ,GACrB,OAAOR,GAAgB7pC,SAASqqC,EAAQnwC,cAC1C,CATSuwC,CAAcJ,GAAW,EAAI,CACtC,CAqBA,SAASK,gBAAgBC,GAAU,QAAEC,IAOnC,SAASC,OAAOnzC,EAAO6Z,GACrB,OAAO,IAAIoW,OACTlX,OAAO/Y,GACP,KAAOizC,EAASG,iBAAmB,IAAM,KAAOv5B,EAAS,IAAM,IAEnE,CAeA,MAAMw5B,WACJ,WAAA/kC,GACEpT,KAAKo4C,aAAe,CAAC,EAErBp4C,KAAKq4C,QAAU,GACfr4C,KAAKs4C,QAAU,EACft4C,KAAKsZ,SAAW,CAClB,CAGA,OAAAi/B,CAAQtE,EAAIgC,GACVA,EAAK38B,SAAWtZ,KAAKsZ,WAErBtZ,KAAKo4C,aAAap4C,KAAKs4C,SAAWrC,EAClCj2C,KAAKq4C,QAAQv1C,KAAK,CAACmzC,EAAMhC,IACzBj0C,KAAKs4C,SA5eX,SAASE,iBAAiBvE,GACxB,OAAO,IAAKlf,OAAOkf,EAAGjtC,WAAa,KAAMsc,KAAK,IAAI7gB,OAAS,CAC7D,CA0esB+1C,CAAiBvE,GAAM,CACzC,CAEA,OAAAwE,GAC8B,IAAxBz4C,KAAKq4C,QAAQ51C,SAGfzC,KAAKsjB,KAAO,IAAM,MAEpB,MAAMo1B,EAAc14C,KAAKq4C,QAAQjiB,KAAIzZ,GAAMA,EAAG,KAC9C3c,KAAK24C,UAAYV,OArdvB,SAASh1C,KAAK21C,EAASC,EAAY,KACjC,IAAIC,EAAc,EAElB,OAAOF,EAAQxiB,KAAK2iB,IAClBD,GAAe,EACf,MAAM9vC,EAAS8vC,EACf,IAAI7E,EAAKp2B,OAAOk7B,GACZtrC,EAAM,GAEV,KAAOwmC,EAAGxxC,OAAS,GAAG,CACpB,MAAM5B,EAAQqzC,EAAW5wB,KAAK2wB,GAC9B,IAAKpzC,EAAO,CACV4M,GAAOwmC,EACP,KACF,CACAxmC,GAAOwmC,EAAG+E,UAAU,EAAGn4C,EAAMiW,OAC7Bm9B,EAAKA,EAAG+E,UAAUn4C,EAAMiW,MAAQjW,EAAM,GAAG4B,QACrB,OAAhB5B,EAAM,GAAG,IAAeA,EAAM,GAEhC4M,GAAO,KAAO1M,OAAOkI,OAAOpI,EAAM,IAAMmI,IAExCyE,GAAO5M,EAAM,GACI,MAAbA,EAAM,IACRi4C,IAGN,CACA,OAAOrrC,CAAG,IACT2oB,KAAI6d,GAAM,IAAIA,OAAOhxC,KAAK41C,EAC/B,CAwb8B51C,CAAKy1C,IAAc,GAC3C14C,KAAKi5C,UAAY,CACnB,CAGA,IAAA31B,CAAK41B,GACHl5C,KAAK24C,UAAUM,UAAYj5C,KAAKi5C,UAChC,MAAMp4C,EAAQb,KAAK24C,UAAUr1B,KAAK41B,GAClC,IAAKr4C,EAAS,OAAO,KAGrB,MAAMkB,EAAIlB,EAAMs4C,WAAU,CAACx8B,EAAI5a,IAAMA,EAAI,QAAYwE,IAAPoW,IAExCy8B,EAAYp5C,KAAKo4C,aAAar2C,GAKpC,OAFAlB,EAAMyvC,OAAO,EAAGvuC,GAETuC,OAAOwX,OAAOjb,EAAOu4C,EAC9B,EAkCF,MAAMC,oBACJ,WAAAjmC,GAEEpT,KAAKs5C,MAAQ,GAEbt5C,KAAKu5C,aAAe,GACpBv5C,KAAK4pC,MAAQ,EAEb5pC,KAAKi5C,UAAY,EACjBj5C,KAAKw5C,WAAa,CACpB,CAGA,UAAAC,CAAW3iC,GACT,GAAI9W,KAAKu5C,aAAaziC,GAAQ,OAAO9W,KAAKu5C,aAAaziC,GAEvD,MAAM4iC,EAAU,IAAIvB,WAIpB,OAHAn4C,KAAKs5C,MAAMj0C,MAAMyR,GAAOoV,SAAQ,EAAE+nB,EAAIgC,KAAUyD,EAAQnB,QAAQtE,EAAIgC,KACpEyD,EAAQjB,UACRz4C,KAAKu5C,aAAaziC,GAAS4iC,EACpBA,CACT,CAEA,0BAAAC,GACE,OAA2B,IAApB35C,KAAKw5C,UACd,CAEA,WAAAI,GACE55C,KAAKw5C,WAAa,CACpB,CAGA,OAAAjB,CAAQtE,EAAIgC,GACVj2C,KAAKs5C,MAAMx2C,KAAK,CAACmxC,EAAIgC,IACH,UAAdA,EAAKxvC,MAAkBzG,KAAK4pC,OAClC,CAGA,IAAAtmB,CAAK41B,GACH,MAAMlxC,EAAIhI,KAAKy5C,WAAWz5C,KAAKw5C,YAC/BxxC,EAAEixC,UAAYj5C,KAAKi5C,UACnB,IAAI17B,EAASvV,EAAEsb,KAAK41B,GAiCpB,GAAIl5C,KAAK25C,6BACP,GAAIp8B,GAAUA,EAAOzG,QAAU9W,KAAKi5C,eAAkB,CACpD,MAAMY,EAAK75C,KAAKy5C,WAAW,GAC3BI,EAAGZ,UAAYj5C,KAAKi5C,UAAY,EAChC17B,EAASs8B,EAAGv2B,KAAK41B,EACnB,CAWF,OARI37B,IACFvd,KAAKw5C,YAAcj8B,EAAOjE,SAAW,EACjCtZ,KAAKw5C,aAAex5C,KAAK4pC,OAE3B5pC,KAAK45C,eAIFr8B,CACT,EA4IF,GAHKw6B,EAAS+B,qBAAoB/B,EAAS+B,mBAAqB,IAG5D/B,EAASlD,UAAYkD,EAASlD,SAASznC,SAAS,QAClD,MAAM,IAAI/J,MAAM,6FAMlB,OAFA00C,EAASgC,iBAAmB1H,QAAQ0F,EAASgC,kBAAoB,CAAC,GAjFlE,SAASC,YAAYhqB,EAAM3U,GACzB,MAAM4+B,EAAkC,EACxC,GAAIjqB,EAAKkqB,WAAY,OAAOD,EAE5B,CAGElD,cACA7qB,SAAQre,GAAOA,EAAImiB,EAAM3U,KAE3B08B,EAAS+B,mBAAmB5tB,SAAQre,GAAOA,EAAImiB,EAAM3U,KAGrD2U,EAAK0mB,cAAgB,KAErB,CACED,cAGAG,eAEAI,kBACA9qB,SAAQre,GAAOA,EAAImiB,EAAM3U,KAE3B2U,EAAKkqB,YAAa,EAElB,IAAIC,EAAiB,KAWrB,GAV6B,iBAAlBnqB,EAAK2mB,WACdwD,EAAiBnqB,EAAK2mB,SAASyD,gBACxBpqB,EAAK2mB,SAASyD,UAGnBpqB,EAAK2mB,WACP3mB,EAAK2mB,SAAWQ,gBAAgBnnB,EAAK2mB,SAAUoB,EAASG,mBAItDloB,EAAKqqB,SAAWF,EAClB,MAAM,IAAI92C,MAAM,kGAgClB,OA3BA82C,EAAiBA,GAAkBnqB,EAAKqqB,SAAW,MACnDJ,EAAMK,iBAAmBrC,OAAOkC,GAAgB,GAE5C9+B,IACG2U,EAAKykB,QAAOzkB,EAAKykB,MAAQ,SAC9BwF,EAAMM,QAAUtC,OAAOjoB,EAAKykB,OACxBzkB,EAAKwqB,iBAAgBxqB,EAAKzsB,IAAMysB,EAAKykB,OACpCzkB,EAAKzsB,KAAQysB,EAAKyqB,iBAAgBzqB,EAAKzsB,IAAM,SAC9CysB,EAAKzsB,MAAK02C,EAAMS,MAAQzC,OAAOjoB,EAAKzsB,MACxC02C,EAAMU,cAAgB98B,OAAOmS,EAAKzsB,MAAQ,GACtCysB,EAAKyqB,gBAAkBp/B,EAAOs/B,gBAChCV,EAAMU,gBAAkB3qB,EAAKzsB,IAAM,IAAM,IAAM8X,EAAOs/B,gBAGtD3qB,EAAK4kB,UAASqF,EAAMW,UAAY3C,OAAuCjoB,EAAY,UAClFA,EAAK6kB,WAAU7kB,EAAK6kB,SAAW,IAEpC7kB,EAAK6kB,SAAW,GAAGzoC,UAAU4jB,EAAK6kB,SAASze,KAAI,SAASpsB,GACtD,OAoDN,SAAS6wC,kBAAkB7qB,GACrBA,EAAK8qB,WAAa9qB,EAAK+qB,iBACzB/qB,EAAK+qB,eAAiB/qB,EAAK8qB,SAAS1kB,KAAI,SAAS4kB,GAC/C,OAAO3I,QAAQriB,EAAM,CAAE8qB,SAAU,MAAQE,EAC3C,KAMF,GAAIhrB,EAAK+qB,eACP,OAAO/qB,EAAK+qB,eAOd,GAAIE,mBAAmBjrB,GACrB,OAAOqiB,QAAQriB,EAAM,CAAEkrB,OAAQlrB,EAAKkrB,OAAS7I,QAAQriB,EAAKkrB,QAAU,OAGtE,GAAI52C,OAAOgzB,SAAStH,GAClB,OAAOqiB,QAAQriB,GAIjB,OAAOA,CACT,CAhFa6qB,CAAwB,SAAN7wC,EAAegmB,EAAOhmB,EACjD,KACAgmB,EAAK6kB,SAAS3oB,SAAQ,SAASliB,GAAKgwC,YAA8B,EAAKC,EAAQ,IAE3EjqB,EAAKkrB,QACPlB,YAAYhqB,EAAKkrB,OAAQ7/B,GAG3B4+B,EAAMP,QA3HR,SAASyB,eAAenrB,GACtB,MAAMorB,EAAK,IAAI/B,oBAWf,OATArpB,EAAK6kB,SAAS3oB,SAAQmvB,GAAQD,EAAG7C,QAAQ8C,EAAK5G,MAAO,CAAE6G,KAAMD,EAAM50C,KAAM,YAErEupB,EAAK2qB,eACPS,EAAG7C,QAAQvoB,EAAK2qB,cAAe,CAAEl0C,KAAM,QAErCupB,EAAK4kB,SACPwG,EAAG7C,QAAQvoB,EAAK4kB,QAAS,CAAEnuC,KAAM,YAG5B20C,CACT,CA8GkBD,CAAelB,GACxBA,CACT,CAYOD,CAA8B,EACvC,CAaA,SAASiB,mBAAmBjrB,GAC1B,QAAKA,IAEEA,EAAKyqB,gBAAkBQ,mBAAmBjrB,EAAKkrB,QACxD,CAkDA,SAASK,eAAeC,GACtB,MAAMC,EAAY,CAChBttB,MAAO,CAAC,WAAY,OAAQ,cAC5BxnB,KAAM,WACJ,MAAO,CACL+0C,iBAAkB,GAClBC,iBAAiB,EAErB,EACAC,SAAU,CACR,SAAA7I,GACE,OAAI/yC,KAAK27C,gBAAwB,GAE1B,QAAU37C,KAAK07C,gBACxB,EACA,WAAAG,GAEE,IAAK77C,KAAK87C,aAAeN,EAAKO,YAAY/7C,KAAK+3C,UAG7C,OAFAxsC,QAAQ4O,KAAK,iBAAiBna,KAAK+3C,+CACnC/3C,KAAK27C,iBAAkB,EAChBvJ,WAAWpyC,KAAKoD,MAGzB,IAAIma,EAAS,CAAC,EAQd,OAPIvd,KAAK87C,YACPv+B,EAASi+B,EAAKQ,cAAch8C,KAAKoD,MACjCpD,KAAK07C,iBAAmBn+B,EAAOw6B,WAE/Bx6B,EAASi+B,EAAKS,UAAUj8C,KAAK+3C,SAAU/3C,KAAKoD,KAAMpD,KAAKk8C,gBACvDl8C,KAAK07C,iBAAmB17C,KAAK+3C,UAExBx6B,EAAOzY,KAChB,EACA,UAAAg3C,GACE,OAAQ97C,KAAK+3C,UAtCrB,SAASoE,yBAAyBr3C,GAChC,OAAO08B,QAAQ18B,GAAmB,KAAVA,EAC1B,CAoCiCq3C,CAAyBn8C,KAAKo8C,WACzD,EACAF,eAAc,KACL,GAKX,MAAAG,CAAOpjC,GACL,OAAOA,EAAc,MAAO,CAAC,EAAG,CAC9BA,EAAc,OAAQ,CACpBqjC,MAAOt8C,KAAK+yC,UACZwJ,SAAU,CAAE5Z,UAAW3iC,KAAK67C,gBAGlC,GAUF,MAAO,CAAEJ,YAAWe,UANF,CAChB,OAAAC,CAAQC,GACNA,EAAIC,UAAU,cAAelB,EAC/B,GAIJ,CAKA,MAAMmB,GAAkB,CACtB,yBAA0B,EAAGjgC,KAAIY,SAAQ/E,WACvC,MAAMqkC,EAAiBC,WAAWngC,GAClC,IAAKkgC,EAAep6C,OAAQ,OAE5B,MAAMs6C,EAAajkC,SAASG,cAAc,OAC1C8jC,EAAWpa,UAAYplB,EAAOzY,MAC9ByY,EAAOzY,MA2DX,SAASk4C,aAAa1K,EAAUuJ,EAAa/2C,GAC3C,IAAIm4C,EAAY,EACZ1/B,EAAS,GACb,MAAM2/B,EAAY,GAElB,SAASC,eACP,OAAK7K,EAAS7vC,QAAWo5C,EAAYp5C,OAGjC6vC,EAAS,GAAGtpC,SAAW6yC,EAAY,GAAG7yC,OAChCspC,EAAS,GAAGtpC,OAAS6yC,EAAY,GAAG7yC,OAAUspC,EAAWuJ,EAkBnC,UAAzBA,EAAY,GAAGuB,MAAoB9K,EAAWuJ,EArB5CvJ,EAAS7vC,OAAS6vC,EAAWuJ,CAsBxC,CAKA,SAAS9tB,KAAK2T,GAEZ,SAAS2b,gBAAgB1Y,GACvB,MAAO,IAAMA,EAAKtB,SAAW,KAAO+O,WAAWzN,EAAK7/B,OAAS,GAC/D,CAEAyY,GAAU,IAAMD,IAAIokB,GAAQ,GAAGtL,IAAI/tB,KAAKq5B,EAAK4B,WAAY+Z,iBAAiBp6C,KAAK,IAAM,GACvF,CAKA,SAASoqB,MAAMqU,GACbnkB,GAAU,KAAOD,IAAIokB,GAAQ,GAC/B,CAKA,SAAS2a,OAAOe,IACG,UAAhBA,EAAMA,MAAoBrvB,KAAOV,OAAO+vB,EAAM1b,KACjD,CAEA,KAAO4Q,EAAS7vC,QAAUo5C,EAAYp5C,QAAQ,CAC5C,IAAI66C,EAASH,eAGb,GAFA5/B,GAAU60B,WAAWttC,EAAMk0C,UAAUiE,EAAWK,EAAO,GAAGt0C,SAC1Di0C,EAAYK,EAAO,GAAGt0C,OAClBs0C,IAAWhL,EAAU,CAOvB4K,EAAUK,UAAUrxB,QAAQmB,OAC5B,GACEgvB,OAAOiB,EAAOhN,OAAO,EAAG,GAAG,IAC3BgN,EAASH,qBACFG,IAAWhL,GAAYgL,EAAO76C,QAAU66C,EAAO,GAAGt0C,SAAWi0C,GACtEC,EAAUK,UAAUrxB,QAAQ6B,KAC9B,KAC0B,UAApBuvB,EAAO,GAAGF,MACZF,EAAUp6C,KAAKw6C,EAAO,GAAG5b,MAEzBwb,EAAUnlB,MAEZskB,OAAOiB,EAAOhN,OAAO,EAAG,GAAG,GAE/B,CACA,OAAO/yB,EAAS60B,WAAWttC,EAAMwE,OAAO2zC,GAC1C,CA/ImBD,CAAaH,EAAgBC,WAAWC,GAAavkC,EAAK,GAgB7E,SAAS8E,IAAIokB,GACX,OAAOA,EAAK2B,SAAS/7B,aACvB,CAKA,SAASw1C,WAAWpb,GAElB,MAAMnkB,EAAS,GA0Bf,OAzBA,SAAUigC,YAAY9b,EAAM14B,GAC1B,IAAK,IAAIyqC,EAAQ/R,EAAK6D,WAAYkO,EAAOA,EAAQA,EAAMgK,YAC9B,IAAnBhK,EAAM9X,SACR3yB,GAAUyqC,EAAMiK,UAAUj7C,OACE,IAAnBgxC,EAAM9X,WACfpe,EAAOza,KAAK,CACVs6C,MAAO,QACPp0C,OAAQA,EACR04B,KAAM+R,IAERzqC,EAASw0C,YAAY/J,EAAOzqC,GAIvBsU,IAAIm2B,GAAO5yC,MAAM,oBACpB0c,EAAOza,KAAK,CACVs6C,MAAO,OACPp0C,OAAQA,EACR04B,KAAM+R,KAKd,OAAOzqC,CACR,CAxBD,CAwBG04B,EAAM,GACFnkB,CACT,CAuGA,MAAMogC,GAAmB,CAAC,EAKpBnyC,MAASkI,IACbnI,QAAQC,MAAMkI,EAAQ,EAOlByG,KAAO,CAACzG,KAAYwQ,KACxB3Y,QAAQ6hC,IAAI,SAAS15B,OAAcwQ,EAAK,EAOpC05B,WAAa,CAAC98B,EAASpN,KACvBiqC,GAAiB,GAAG78B,KAAWpN,OAEnCnI,QAAQ6hC,IAAI,oBAAoBtsB,MAAYpN,KAC5CiqC,GAAiB,GAAG78B,KAAWpN,MAAa,EAAI,EAQ5CmqC,GAAWzL,WACX0L,GAAYzL,QACZ0L,GAAWl6C,OAAO,WAs/BxB,IAAIo4C,GAh/BS,SAAST,GAGpB,MAAMwC,EAAY15C,OAAO6kB,OAAO,MAE1B80B,EAAU35C,OAAO6kB,OAAO,MAExB6uB,EAAU,GAIhB,IAAIkG,GAAY,EAChB,MAAMC,EAAc,yBACdC,EAAqB,sFAErBC,EAAqB,CAAEC,mBAAmB,EAAM9qC,KAAM,aAAcqhC,SAAU,IAKpF,IAAIj+B,EAAU,CACZ2nC,cAAe,qBACfC,iBAAkB,8BAClB7L,YAAa,QACb8L,WAAY,KACZC,OAAO,EACPV,UAAW,KAGXW,UAAW/K,kBASb,SAASgL,mBAAmBC,GAC1B,OAAOjoC,EAAQ2nC,cAAcj9C,KAAKu9C,EACpC,CAgDA,SAAS5C,UAAU6C,EAAoBC,EAAe7C,EAAgB8C,GACpE,IAAI57C,EAAO,GACPy7C,EAAe,GACU,iBAAlBE,GACT37C,EAAO07C,EACP5C,EAAiB6C,EAAc7C,eAC/B2C,EAAeE,EAAchH,SAG7BiH,OAAez4C,IAGfq3C,WAAW,SAAU,uDACrBA,WAAW,SAAU,yGACrBiB,EAAeC,EACf17C,EAAO27C,GAIT,MAAM/T,EAAU,CACd5nC,OACA20C,SAAU8G,GAIZI,KAAK,mBAAoBjU,GAIzB,MAAMztB,EAASytB,EAAQztB,OACnBytB,EAAQztB,OACR2hC,WAAWlU,EAAQ+M,SAAU/M,EAAQ5nC,KAAM84C,EAAgB8C,GAM/D,OAJAzhC,EAAOna,KAAO4nC,EAAQ5nC,KAEtB67C,KAAK,kBAAmB1hC,GAEjBA,CACT,CAWA,SAAS2hC,WAAWL,EAAcM,EAAiBjD,EAAgB8C,GAOjE,SAASI,YAAYpvB,EAAMnvB,GACzB,MAAMw+C,EAAYtH,EAASG,iBAAmBr3C,EAAM,GAAGyG,cAAgBzG,EAAM,GAC7E,OAAOyD,OAAOE,UAAU4R,eAAe/N,KAAK2nB,EAAK2mB,SAAU0I,IAAcrvB,EAAK2mB,SAAS0I,EACzF,CAkEA,SAASC,gBACgB,MAAnB/lC,GAAIgmC,YA3BV,SAASC,qBACP,GAAmB,KAAfC,GAAmB,OAEvB,IAAIliC,EAAS,KAEb,GAA+B,iBAApBhE,GAAIgmC,YAA0B,CACvC,IAAKvB,EAAUzkC,GAAIgmC,aAEjB,YADAvX,GAAQ6K,QAAQ4M,IAGlBliC,EAAS2hC,WAAW3lC,GAAIgmC,YAAaE,IAAY,EAAMC,GAAcnmC,GAAIgmC,cACzEG,GAAcnmC,GAAIgmC,aAA4ChiC,EAAU,GAC1E,MACEA,EAASy+B,cAAcyD,GAAYlmC,GAAIgmC,YAAY98C,OAAS8W,GAAIgmC,YAAc,MAO5EhmC,GAAIm7B,UAAY,IAClBA,IAAan3B,EAAOm3B,WAEtB1M,GAAQ8L,eAAev2B,EAAOyqB,QAASzqB,EAAOw6B,SAChD,CAIIyH,GAlEJ,SAASG,kBACP,IAAKpmC,GAAIo9B,SAEP,YADA3O,GAAQ6K,QAAQ4M,IAIlB,IAAIxG,EAAY,EAChB1/B,GAAI+gC,iBAAiBrB,UAAY,EACjC,IAAIp4C,EAAQ0Y,GAAI+gC,iBAAiBh3B,KAAKm8B,IAClCp7C,EAAM,GAEV,KAAOxD,GAAO,CACZwD,GAAOo7C,GAAWzG,UAAUC,EAAWp4C,EAAMiW,OAC7C,MAAMnQ,EAAOy4C,YAAY7lC,GAAK1Y,GAC9B,GAAI8F,EAAM,CACR,MAAOoiB,EAAM62B,GAAoBj5C,EAKjC,GAJAqhC,GAAQ6K,QAAQxuC,GAChBA,EAAM,GAENqwC,IAAakL,EACT72B,EAAK82B,WAAW,KAGlBx7C,GAAOxD,EAAM,OACR,CACL,MAAMi/C,EAAW/H,EAASgC,iBAAiBhxB,IAASA,EACpDif,GAAQ6L,WAAWhzC,EAAM,GAAIi/C,EAC/B,CACF,MACEz7C,GAAOxD,EAAM,GAEfo4C,EAAY1/B,GAAI+gC,iBAAiBrB,UACjCp4C,EAAQ0Y,GAAI+gC,iBAAiBh3B,KAAKm8B,GACpC,CACAp7C,GAAOo7C,GAAWn2C,OAAO2vC,GACzBjR,GAAQ6K,QAAQxuC,EAClB,CAgCIs7C,GAEFF,GAAa,EACf,CAKA,SAASM,aAAa/vB,GAKpB,OAJIA,EAAK+iB,WACP/K,GAAQ8K,SAASiF,EAASgC,iBAAiB/pB,EAAK+iB,YAAc/iB,EAAK+iB,WAErEx5B,GAAMjV,OAAO6kB,OAAO6G,EAAM,CAAE3U,OAAQ,CAAEvW,MAAOyU,MACtCA,EACT,CAQA,SAASymC,UAAUhwB,EAAMnvB,EAAOo/C,GAC9B,IAAIC,EAh1CV,SAASL,WAAW5L,EAAIkM,GACtB,MAAMt/C,EAAQozC,GAAMA,EAAG3wB,KAAK68B,GAC5B,OAAOt/C,GAAyB,IAAhBA,EAAMiW,KACxB,CA60CoB+oC,CAAW7vB,EAAK0qB,MAAOuF,GAErC,GAAIC,EAAS,CACX,GAAIlwB,EAAK,UAAW,CAClB,MAAMomB,EAAO,IAAInE,SAASjiB,GAC1BA,EAAK,UAAUnvB,EAAOu1C,GAClBA,EAAKlE,iBAAgBgO,GAAU,EACrC,CAEA,GAAIA,EAAS,CACX,KAAOlwB,EAAKowB,YAAcpwB,EAAK3U,QAC7B2U,EAAOA,EAAK3U,OAEd,OAAO2U,CACT,CACF,CAGA,GAAIA,EAAKyqB,eACP,OAAOuF,UAAUhwB,EAAK3U,OAAQxa,EAAOo/C,EAEzC,CAOA,SAASI,SAASF,GAChB,OAA+B,IAA3B5mC,GAAImgC,QAAQF,YAGdiG,IAAcU,EAAO,GACd,IAIPG,IAA2B,EACpB,EAEX,CAQA,SAASC,aAAa1/C,GACpB,MAAMs/C,EAASt/C,EAAM,GACf2/C,EAAU3/C,EAAMy6C,KAEhBlF,EAAO,IAAInE,SAASuO,GAEpBC,EAAkB,CAACD,EAAQ9J,cAAe8J,EAAQ,aACxD,IAAK,MAAME,KAAMD,EACf,GAAKC,IACLA,EAAG7/C,EAAOu1C,GACNA,EAAKlE,gBAAgB,OAAOmO,SAASF,GAuB3C,OApBIK,GAAWA,EAAQhG,iBACrBgG,EAAQ9F,MA/7ChB,SAAShmB,OAAO5vB,GACd,OAAO,IAAIiwB,OAAOjwB,EAAMlE,QAAQ,wBAAyB,QAAS,IACpE,CA67CwB8zB,CAAOyrB,IAGrBK,EAAQG,KACVlB,IAAcU,GAEVK,EAAQI,eACVnB,IAAcU,GAEhBb,gBACKkB,EAAQK,aAAgBL,EAAQI,eACnCnB,GAAaU,IAGjBJ,aAAaS,GAKNA,EAAQK,YAAc,EAAIV,EAAO19C,MAC1C,CAOA,SAASq+C,WAAWjgD,GAClB,MAAMs/C,EAASt/C,EAAM,GACfo/C,EAAqBd,EAAgB71C,OAAOzI,EAAMiW,OAElDiqC,EAAUf,UAAUzmC,GAAK1Y,EAAOo/C,GACtC,IAAKc,EAAW,OAAOhD,GAEvB,MAAMiD,EAASznC,GACXynC,EAAOL,KACTlB,IAAcU,GAERa,EAAOC,WAAaD,EAAOE,aAC/BzB,IAAcU,GAEhBb,gBACI0B,EAAOE,aACTzB,GAAaU,IAGjB,GACM5mC,GAAIw5B,WACN/K,GAAQkL,YAEL35B,GAAIonC,MAASpnC,GAAIgmC,cACpB7K,IAAan7B,GAAIm7B,WAEnBn7B,GAAMA,GAAI8B,aACH9B,KAAQwnC,EAAQ1lC,QAOzB,OANI0lC,EAAQ7F,SACN6F,EAAQvG,iBACVuG,EAAQ7F,OAAOR,MAAQqG,EAAQrG,OAEjCqF,aAAagB,EAAQ7F,SAEhB8F,EAAOC,UAAY,EAAId,EAAO19C,MACvC,CAaA,IAAI0+C,EAAY,CAAC,EAQjB,SAASC,cAAcC,EAAiBxgD,GACtC,MAAMs/C,EAASt/C,GAASA,EAAM,GAK9B,GAFA4+C,IAAc4B,EAEA,MAAVlB,EAEF,OADAb,gBACO,EAOT,GAAuB,UAAnB6B,EAAU16C,MAAmC,QAAf5F,EAAM4F,MAAkB06C,EAAUrqC,QAAUjW,EAAMiW,OAAoB,KAAXqpC,EAAe,CAG1G,GADAV,IAAcN,EAAgB95C,MAAMxE,EAAMiW,MAAOjW,EAAMiW,MAAQ,IAC1DonC,EAAW,CAEd,MAAMrjC,EAAM,IAAIxX,MAAM,uBAGtB,MAFAwX,EAAIgkC,aAAeA,EACnBhkC,EAAIymC,QAAUH,EAAU7F,KAClBzgC,CACR,CACA,OAAO,CACT,CAGA,GAFAsmC,EAAYtgD,EAEO,UAAfA,EAAM4F,KACR,OAAO85C,aAAa1/C,GACf,GAAmB,YAAfA,EAAM4F,OAAuBy1C,EAAgB,CAGtD,MAAMrhC,EAAM,IAAIxX,MAAM,mBAAqB88C,EAAS,gBAAkB5mC,GAAIw5B,WAAa,aAAe,KAEtG,MADAl4B,EAAImV,KAAOzW,GACLsB,CACR,CAAO,GAAmB,QAAfha,EAAM4F,KAAgB,CAC/B,MAAMw2C,EAAY6D,WAAWjgD,GAC7B,GAAIo8C,IAAcc,GAChB,OAAOd,CAEX,CAKA,GAAmB,YAAfp8C,EAAM4F,MAAiC,KAAX05C,EAE9B,OAAO,EAOT,GAAIoB,GAAa,KAAUA,GAA2B,EAAd1gD,EAAMiW,MAAW,CAEvD,MADY,IAAIzT,MAAM,4DAExB,CAeA,OADAo8C,IAAcU,EACPA,EAAO19C,MAChB,CAEA,MAAMs1C,EAAWgE,YAAY8C,GAC7B,IAAK9G,EAEH,MADAvsC,MAAM4yC,EAAmBx9C,QAAQ,KAAMi+C,IACjC,IAAIx7C,MAAM,sBAAwBw7C,EAAe,KAGzD,MAAM2C,EAAK1J,gBAAgBC,EAAU,CAAEC,YACvC,IAAIz6B,EAAS,GAEThE,GAAMylC,GAAgBwC,EAE1B,MAAM9B,GAAgB,CAAC,EACjB1X,GAAU,IAAIpxB,EAAQ+nC,UAAU/nC,IA5GtC,SAAS6qC,uBACP,MAAMp1C,EAAO,GACb,IAAK,IAAIqiB,EAAUnV,GAAKmV,IAAYqpB,EAAUrpB,EAAUA,EAAQrT,OAC1DqT,EAAQqkB,WACV1mC,EAAKo9B,QAAQ/a,EAAQqkB,WAGzB1mC,EAAK6f,SAAQkJ,GAAQ4S,GAAQ8K,SAAS1d,IACxC,CAqGAqsB,GACA,IAAIhC,GAAa,GACb/K,GAAY,EACZ59B,GAAQ,EACRyqC,GAAa,EACbjB,IAA2B,EAE/B,IAGE,IAFA/mC,GAAImgC,QAAQE,gBAEH,CACP2H,KACIjB,GAGFA,IAA2B,EAE3B/mC,GAAImgC,QAAQE,cAEdrgC,GAAImgC,QAAQT,UAAYniC,GAExB,MAAMjW,EAAQ0Y,GAAImgC,QAAQp2B,KAAK67B,GAG/B,IAAKt+C,EAAO,MAEZ,MACM6gD,EAAiBN,cADHjC,EAAgBnG,UAAUliC,GAAOjW,EAAMiW,OACTjW,GAClDiW,GAAQjW,EAAMiW,MAAQ4qC,CACxB,CAMA,OALAN,cAAcjC,EAAgB71C,OAAOwN,KACrCkxB,GAAQsL,gBACRtL,GAAQgM,WACRz2B,EAASyqB,GAAQ+L,SAEV,CAGLW,UAAWvqC,KAAK6J,MAAM0gC,IACtB5vC,MAAOyY,EACPw6B,SAAU8G,EACVjK,SAAS,EACT5M,QAASA,GACTzuB,IAAKA,GAET,CAAE,MAAOsB,GACP,GAAIA,EAAInH,SAAWmH,EAAInH,QAAQtG,SAAS,WACtC,MAAO,CACLwnC,SAAS,EACT+M,UAAW,CACTxtC,IAAK0G,EAAInH,QACTs3B,QAASmU,EAAgB95C,MAAMyR,GAAQ,IAAKA,GAAQ,KACpDkZ,KAAMnV,EAAImV,MAEZ4xB,MAAOrkC,EACPm3B,UAAW,EACX5vC,MAAO+4C,GAASsB,GAChBnX,QAASA,IAEN,GAAIkW,EACT,MAAO,CACLtJ,SAAS,EACTF,UAAW,EACX5vC,MAAO+4C,GAASsB,GAChBnX,QAASA,GACT+P,SAAU8G,EACVtlC,IAAKA,GACLsoC,YAAahnC,GAGf,MAAMA,CAEV,CACF,CAmCA,SAASmhC,cAAc54C,EAAM0+C,GAC3BA,EAAiBA,GAAkBlrC,EAAQonC,WAAa15C,OAAOyZ,KAAKigC,GACpE,MAAM+D,EA5BR,SAASC,wBAAwB5+C,GAC/B,MAAMma,EAAS,CACbm3B,UAAW,EACX1M,QAAS,IAAIpxB,EAAQ+nC,UAAU/nC,GAC/B9R,MAAO+4C,GAASz6C,GAChBwxC,SAAS,EACTr7B,IAAK8kC,GAGP,OADA9gC,EAAOyqB,QAAQ6K,QAAQzvC,GAChBma,CACT,CAkBoBykC,CAAwB5+C,GAEpC6+C,EAAUH,EAAetrB,OAAOulB,aAAavlB,OAAO0rB,eAAe9rB,KAAI5iB,GAC3E0rC,WAAW1rC,EAAMpQ,GAAM,KAEzB6+C,EAAQxY,QAAQsY,GAEhB,MAAMI,EAASF,EAAQG,MAAK,CAACn2C,EAAG/F,KAE9B,GAAI+F,EAAEyoC,YAAcxuC,EAAEwuC,UAAW,OAAOxuC,EAAEwuC,UAAYzoC,EAAEyoC,UAIxD,GAAIzoC,EAAE8rC,UAAY7xC,EAAE6xC,SAAU,CAC5B,GAAIgE,YAAY9vC,EAAE8rC,UAAUsK,aAAen8C,EAAE6xC,SAC3C,OAAO,EACF,GAAIgE,YAAY71C,EAAE6xC,UAAUsK,aAAep2C,EAAE8rC,SAClD,OAAQ,CAEZ,CAMA,OAAO,CAAC,KAGHuK,EAAMC,GAAcJ,EAGrB5kC,EAAS+kC,EAGf,OAFA/kC,EAAOilC,YAAcD,EAEdhlC,CACT,CAyCA,MAAMklC,EAAW,CACf,0BAA2B,EAAG9lC,SACxB/F,EAAQ8nC,QACV/hC,EAAGgmB,UAAYhmB,EAAGgmB,UAAU/hC,QAAQ,MAAO,IAAIA,QAAQ,aAAc,MACvE,EAEF,yBAA0B,EAAG2c,aACvB3G,EAAQ8nC,QACVnhC,EAAOzY,MAAQyY,EAAOzY,MAAMlE,QAAQ,MAAO,QAC7C,GAIE8hD,EAAiB,mBAEjBC,EAAmB,CACvB,yBAA0B,EAAGplC,aACvB3G,EAAQ6nC,aACVlhC,EAAOzY,MAAQyY,EAAOzY,MAAMlE,QAAQ8hD,GAAiB16C,GACnDA,EAAEpH,QAAQ,MAAOgW,EAAQ6nC,cAE7B,GAUJ,SAASmE,iBAAiBvsB,GAExB,IAAIqL,EAAO,KACX,MAAMqW,EA1oBR,SAAS8K,cAAcC,GACrB,IAAIxsC,EAAUwsC,EAAM/P,UAAY,IAEhCz8B,GAAWwsC,EAAMnhB,WAAamhB,EAAMnhB,WAAWoR,UAAY,GAG3D,MAAMlyC,EAAQ+V,EAAQ4nC,iBAAiBl7B,KAAKhN,GAC5C,GAAIzV,EAAO,CACT,MAAMk3C,EAAWgE,YAAYl7C,EAAM,IAKnC,OAJKk3C,IACH59B,KAAKikC,EAAmBx9C,QAAQ,KAAMC,EAAM,KAC5CsZ,KAAK,oDAAqD2oC,IAErD/K,EAAWl3C,EAAM,GAAK,cAC/B,CAEA,OAAOyV,EACJ3B,MAAM,OACNouC,MAAMC,GAAWpE,mBAAmBoE,IAAWjH,YAAYiH,IAChE,CAunBmBH,CAAcxsB,GAE/B,GAAIuoB,mBAAmB7G,GAAW,OAGlCkH,KAAK,0BACH,CAAEtiC,GAAI0Z,EAAS0hB,SAAUA,IAE3BrW,EAAOrL,EACP,MAAM7d,EAAOkpB,EAAKxoB,YACZqE,EAASw6B,EAAWkE,UAAUzjC,EAAM,CAAEu/B,WAAUmE,gBAAgB,IAAUF,cAAcxjC,GAG9FymC,KAAK,yBAA0B,CAAEtiC,GAAI0Z,EAAS9Y,SAAQ/E,SAEtD6d,EAAQsM,UAAYplB,EAAOzY,MAzD7B,SAASm+C,gBAAgB5sB,EAAS6sB,EAAaC,GAC7C,MAAMpL,EAAWmL,EAAcjF,EAAQiF,GAAeC,EAEtD9sB,EAAQ+sB,UAAUzc,IAAI,QAClBoR,GAAU1hB,EAAQ+sB,UAAUzc,IAAIoR,EACtC,CAqDEkL,CAAgB5sB,EAAS0hB,EAAUx6B,EAAOw6B,UAC1C1hB,EAAQ9Y,OAAS,CACfw6B,SAAUx6B,EAAOw6B,SAEjB9D,GAAI12B,EAAOm3B,UACX2O,UAAW9lC,EAAOm3B,WAEhBn3B,EAAOilC,cACTnsB,EAAQmsB,YAAc,CACpBzK,SAAUx6B,EAAOilC,YAAYzK,SAE7B9D,GAAI12B,EAAOilC,YAAY9N,UACvB2O,UAAW9lC,EAAOilC,YAAY9N,WAGpC,CAqBA,MAAM4O,iBAAmB,KACvB,GAAIA,iBAAiBC,OAAQ,OAC7BD,iBAAiBC,QAAS,EAE1B3F,WAAW,SAAU,kEAEN9kC,SAAS0qC,iBAAiB,YAClCt3B,QAAQ02B,iBAAiB,EAUlC,IAAIa,IAAiB,EAKrB,SAASC,eAEP,GAA4B,YAAxB5qC,SAAS6qC,WAEX,YADAF,IAAiB,GAIJ3qC,SAAS0qC,iBAAiB,YAClCt3B,QAAQ02B,iBACjB,CAuFA,SAAS7G,YAAYvoC,GAEnB,OADAA,GAAQA,GAAQ,IAAIlM,cACb02C,EAAUxqC,IAASwqC,EAAUC,EAAQzqC,GAC9C,CAOA,SAASowC,gBAAgBC,GAAW,aAAEhF,IACX,iBAAdgF,IACTA,EAAY,CAACA,IAEfA,EAAU33B,SAAQ2kB,IAAWoN,EAAQpN,EAAMvpC,eAAiBu3C,CAAY,GAC1E,CAMA,SAASqD,cAAc1uC,GACrB,MAAMswC,EAAO/H,YAAYvoC,GACzB,OAAOswC,IAASA,EAAKxF,iBACvB,CAsCA,SAASW,KAAK7B,EAAOl5B,GACnB,MAAMw8B,EAAKtD,EACXpF,EAAQ9rB,SAAQ,SAAS63B,GACnBA,EAAOrD,IACTqD,EAAOrD,GAAIx8B,EAEf,GACF,CApJsB,oBAAX9J,QAA0BA,OAAON,kBAC1CM,OAAON,iBAAiB,oBAP1B,SAASkqC,OAEHP,IAAgBC,cACtB,IAIoD,GA8KpDp/C,OAAOwX,OAAO0/B,EAAM,CAClBS,UACAD,cACA0H,aACAO,UAvBF,SAASC,mBAAmBz/C,GAI1B,OAHAm5C,WAAW,SAAU,+CACrBA,WAAW,SAAU,sEAzTvB,SAASqG,UAAUt3B,GACjB,OAAM/V,EAAQ6nC,YAAc7nC,EAAQ8nC,MAI7B/xB,EAAK/rB,QAAQu9C,GAAat9C,GACjB,OAAVA,EACK+V,EAAQ8nC,MAAQ,OAAS79C,EACvB+V,EAAQ6nC,WACV59C,EAAMD,QAAQ,MAAOgW,EAAQ6nC,YAE/B59C,IATA8rB,CAWX,CA8SSs3B,CAAUx/C,EACnB,EAmBEm+C,iBAEAuB,eAfF,SAASC,wBAAwBznC,GAI/B,OAHAihC,WAAW,SAAU,oDACrBA,WAAW,SAAU,oCAEdgF,iBAAiBjmC,EAC1B,EAWE0nC,UA5OF,SAASA,UAAUC,GACbA,EAAY5F,QACdd,WAAW,SAAU,6CACrBA,WAAW,SAAU,uEAEvBhnC,EAAUknC,GAAUlnC,EAAS0tC,EAC/B,EAuOEhB,iBACAiB,uBApNF,SAASA,yBACP3G,WAAW,SAAU,wEACrB6F,IAAiB,CACnB,EAkNEe,iBAhLF,SAASA,iBAAiB3F,EAAc4F,GACtC,IAAIX,EAAO,KACX,IACEA,EAAOW,EAAmBjJ,EAC5B,CAAE,MAAOkJ,GAGP,GAFAl5C,MAAM,wDAAwD5K,QAAQ,KAAMi+C,KAEvEX,EAAa,MAAMwG,EAAkBl5C,MAAMk5C,GAKhDZ,EAAOzF,CACT,CAEKyF,EAAKtwC,OAAMswC,EAAKtwC,KAAOqrC,GAC5Bb,EAAUa,GAAgBiF,EAC1BA,EAAKa,cAAgBF,EAAmBhvC,KAAK,KAAM+lC,GAE/CsI,EAAK7F,SACP2F,gBAAgBE,EAAK7F,QAAS,CAAEY,gBAEpC,EA2JE+F,mBApJF,SAASA,mBAAmB/F,UACnBb,EAAUa,GACjB,IAAK,MAAMhO,KAASvsC,OAAOyZ,KAAKkgC,GAC1BA,EAAQpN,KAAWgO,UACdZ,EAAQpN,EAGrB,EA8IEgU,cAzIF,SAASA,gBACP,OAAOvgD,OAAOyZ,KAAKigC,EACrB,EAwIEjC,YACA6H,gBACAkB,gBA/HF,SAASA,gBAAgBtxC,GACvBoqC,WAAW,SAAU,oDACrBA,WAAW,SAAU,oEAErB,MAAMkG,EAAO/H,YAAYvoC,GACzB,GAAIswC,EAAQ,OAAOA,EAGnB,MADY,IAAIzgD,MAAM,iDAAmDzC,QAAQ,KAAM4S,GAEzF,EAuHE0uC,cACA7P,QAASyL,GACTiH,UA/DF,SAASA,UAAUhB,IArBnB,SAASiB,iBAAiBjB,GAEpBA,EAAO,2BAA6BA,EAAO,6BAC7CA,EAAO,2BAA8Bp9C,IACnCo9C,EAAO,yBACLz/C,OAAOwX,OAAO,CAAEgnC,MAAOn8C,EAAKgW,IAAMhW,GACnC,GAGDo9C,EAAO,0BAA4BA,EAAO,4BAC5CA,EAAO,0BAA6Bp9C,IAClCo9C,EAAO,wBACLz/C,OAAOwX,OAAO,CAAEgnC,MAAOn8C,EAAKgW,IAAMhW,GACnC,EAGP,CAMEq+C,CAAiBjB,GACjB/L,EAAQl1C,KAAKihD,EACf,EA8DEkB,UAAW1J,eAAeC,GAAMgB,YAGlChB,EAAK0J,UAAY,WAAahH,GAAY,CAAO,EACjD1C,EAAK2J,SAAW,WAAajH,GAAY,CAAM,EAC/C1C,EAAK4J,cA/uCO,SAivCZ,IAAK,MAAM3uC,KAAOo/B,GAEU,iBAAfA,GAAMp/B,IAEfs7B,EAAc8D,GAAMp/B,IAWxB,OANAnS,OAAOwX,OAAO0/B,EAAM3F,IAGpB2F,EAAKuJ,UAAUtC,GACfjH,EAAKuJ,UAAUnI,IACfpB,EAAKuJ,UAAUpC,GACRnH,CACT,CAGgB6J,CAAK,CAAC,GAEtBxlD,EAAOD,QAAUq8C,cCh8EjB,SAAS7vC,UAAU8X,GAEjB,OADeA,EAAKkS,KAAKlqB,GAZ3B,SAAS2R,OAAOo2B,GACd,OAAKA,EACa,iBAAPA,EAAwBA,EAE5BA,EAAGp2B,OAHM,IAIlB,CAOiCA,CAAO3R,KAAIjJ,KAAK,GAEjD,CAiJApD,EAAOD,QAtIP,SAAS0lD,KAAK9J,GACZ,MAAM+J,EAAM,CAAC,EACPC,EAAa,CACjB/Q,MAAO,OACPlxC,IAAI,KACJsxC,SAAU,CACR,OACA,CACEJ,MAAO,KACPI,SAAU,CAAE0Q,MAIlBjhD,OAAOwX,OAAOypC,EAAI,CAChBxS,UAAW,WACX+H,SAAU,CACR,CAACrG,MAAOroC,OAAO,qBAGb,wBACFo5C,KAIJ,MAAMC,EAAQ,CACZ1S,UAAW,QACX0B,MAAO,OAAQlxC,IAAK,KACpBsxC,SAAU,CAAC2G,EAAKhH,mBAEZkR,EAAW,CACfjR,MAAO,iBACPyG,OAAQ,CACNrG,SAAU,CACR2G,EAAKnF,kBAAkB,CACrB5B,MAAO,QACPlxC,IAAK,QACLwvC,UAAW,cAKb4S,EAAe,CACnB5S,UAAW,SACX0B,MAAO,IAAKlxC,IAAK,IACjBsxC,SAAU,CACR2G,EAAKhH,iBACL+Q,EACAE,IAGJA,EAAM5Q,SAAS/xC,KAAK6iD,GACpB,MASMC,EAAa,CACjBnR,MAAO,SACPlxC,IAAK,OACLsxC,SAAU,CACR,CAAEJ,MAAO,gBAAiB1B,UAAW,UACrCyI,EAAKnG,YACLkQ,IAcEM,EAAgBrK,EAAKxF,QAAQ,CACjCG,OAAQ,IAZa,CACrB,OACA,OACA,MACA,KACA,MACA,MACA,OACA,OACA,QAG2BlzC,KAAK,QAChCyxC,UAAW,KAEPoR,EAAW,CACf/S,UAAW,WACX0B,MAAO,4BACPoM,aAAa,EACbhM,SAAU,CAAC2G,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAACjB,MAAO,gBACjDC,UAAW,GAGb,MAAO,CACLlhC,KAAM,OACNyqC,QAAS,CAAC,KAAM,OAChBtH,SAAU,CACRyD,SAAU,gBACV3C,QACE,+DACFsO,QACE,aACFC,SAGE,6uBAeJnR,SAAU,CACRgR,EACArK,EAAKxF,UACL8P,EACAF,EACApK,EAAKpG,kBACLsQ,EACAC,EA3EkB,CACpB5S,UAAW,GACX0B,MAAO,OAGW,CAClB1B,UAAW,SACX0B,MAAO,IAAKlxC,IAAK,KAuEfgiD,GAGN,aClJA,SAASn5C,UAAU8X,GAEjB,OADeA,EAAKkS,KAAKlqB,GAZ3B,SAAS2R,OAAOo2B,GACd,OAAKA,EACa,iBAAPA,EAAwBA,EAE5BA,EAAGp2B,OAHM,IAIlB,CAOiCA,CAAO3R,KAAIjJ,KAAK,GAEjD,CAiGApD,EAAOD,QAvFP,SAASqmD,KAAKzK,GACZ,MAAM0K,EAAU,oBAEVC,EAAS,CACbpT,UAAW,YACX0B,MAAOroC,OAAO,IAHI,wBAGc,cAChC8uC,OAAQ,CACNrG,SAAU,CACR,CACE9B,UAAW,cACX0B,MAAO,KACPC,UAAW,EACXwG,OAAQ,CACN33C,IAAK,IACLmxC,UAAW,OAMf0R,EAAmB,CACvBD,EACA,CACE1R,MAAO,SACPyG,OAAQ,CAAEqE,YAAa,GAAI9E,gBAAgB,KAI/C,MAAO,CACLjnC,KAAM,OACNyqC,QAAS,CAAC,SACVrJ,QAAS,KACTC,SAAU,CAER,CACEJ,MAAO,OAASyR,EAAU,WAC1B3iD,IAAK,IACLsxC,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAOyR,GAET,CACEnT,UAAW,SAAU0B,MAAO,iBAGhCyG,OAAQ,CACN33C,IAAK,OACLqxC,QAAS,KACTC,SAAUuR,IAId,CACE3R,MAAO,oBAAsByR,EAAU,KACvC3iD,IAAK,IACLsxC,SAAU,CACR,CACE9B,UAAW,SACX0B,MAAO,IACPlxC,IAAK,IACLq9C,cAAc,EACdM,YAAY,GAEd,CACEnO,UAAW,OACX0B,MAAOyR,GAET,CACEnT,UAAW,UACX0B,MAAO,WAGXyG,OAAQ,CACN33C,IAAK,OACLqxC,QAAS,KACTC,SAAUuR,IAId5K,EAAKnJ,QAAQ8T,EAAQ,CACnBzR,UAAW,KAInB,aCtHA,MAAMP,EAAW,2BACXkS,EAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,WAEIC,EAAW,CACf,OACA,QACA,OACA,YACA,MACA,YAoFIC,EAAY,GAAGn6C,OAlCI,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,YAGyB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,eACA,SACA,UA9EY,CACZ,OACA,WACA,SACA,OACA,OACA,SACA,SACA,SACA,WACA,UACA,QACA,SACA,MACA,MACA,UACA,UACA,QACA,UACA,OACA,UACA,eACA,aACA,aACA,YACA,cACA,cACA,eACA,QACA,aACA,oBACA,cACA,gBACA,iBACA,UAGkB,CAClB,YACA,gBACA,aACA,iBACA,cACA,YACA,aAgEF,SAASo6C,UAAUvS,GACjB,OAAO7nC,OAAO,MAAO6nC,EAAI,IAC3B,CAMA,SAAS7nC,UAAU8X,GAEjB,OADeA,EAAKkS,KAAKlqB,GApB3B,SAAS2R,OAAOo2B,GACd,OAAKA,EACa,iBAAPA,EAAwBA,EAE5BA,EAAGp2B,OAHM,IAIlB,CAeiCA,CAAO3R,KAAIjJ,KAAK,GAEjD,CA+aApD,EAAOD,QAraP,SAAS6mD,WAAWjL,GAQlB,MAMMkL,EAAavS,EACbwS,EACG,KADHA,EAEC,MAEDC,EAAU,CACdnS,MAAO,sBACPlxC,IAAK,4BAKLsjD,kBAAmB,CAAChmD,EAAO21C,KACzB,MAAMsQ,EAAkBjmD,EAAM,GAAG4B,OAAS5B,EAAMiW,MAC1CiwC,EAAWlmD,EAAMqT,MAAM4yC,GAIZ,MAAbC,EAMa,MAAbA,IA9Bc,EAAClmD,GAASmmD,YAC9B,MAAM1pC,EAAM,KAAOzc,EAAM,GAAGwE,MAAM,GAElC,OAAgB,IADJxE,EAAMqT,MAAM/S,QAAQmc,EAAK0pC,EACpB,EA8BRC,CAAcpmD,EAAO,CAAEmmD,MAAOF,KACjCtQ,EAASrE,eATXqE,EAASrE,aAWX,GAGE+U,EAAa,CACjB9M,SAAUjG,EACVsD,QAAS4O,EACTN,QAASO,EACTN,SAAUO,GAINY,EAAgB,kBAChBC,EAAO,OAAOD,KAGdE,EAAiB,sCACjBC,GAAS,CACbvU,UAAW,SACX+H,SAAU,CAER,CAAErG,MAAO,QAAQ4S,OAAoBD,aAAgBA,gBACtCD,SACf,CAAE1S,MAAO,OAAO4S,UAAuBD,gBAAmBA,SAG1D,CAAE3S,MAAO,8BAGT,CAAEA,MAAO,4CACT,CAAEA,MAAO,gCACT,CAAEA,MAAO,gCAIT,CAAEA,MAAO,oBAEXC,UAAW,GAGP+Q,GAAQ,CACZ1S,UAAW,QACX0B,MAAO,SACPlxC,IAAK,MACLozC,SAAUuQ,EACVrS,SAAU,IAEN0S,GAAgB,CACpB9S,MAAO,QACPlxC,IAAK,GACL23C,OAAQ,CACN33C,IAAK,IACL09C,WAAW,EACXpM,SAAU,CACR2G,EAAKhH,iBACLiR,IAEFlG,YAAa,QAGXiI,GAAe,CACnB/S,MAAO,OACPlxC,IAAK,GACL23C,OAAQ,CACN33C,IAAK,IACL09C,WAAW,EACXpM,SAAU,CACR2G,EAAKhH,iBACLiR,IAEFlG,YAAa,QAGXkI,GAAkB,CACtB1U,UAAW,SACX0B,MAAO,IACPlxC,IAAK,IACLsxC,SAAU,CACR2G,EAAKhH,iBACLiR,KAoCEzQ,GAAU,CACdjC,UAAW,UACX+H,SAAU,CAnCUU,EAAKxG,QACzB,eACA,OACA,CACEN,UAAW,EACXG,SAAU,CACR,CACE9B,UAAW,SACX0B,MAAO,aACPI,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAO,MACPlxC,IAAK,MACLmxC,UAAW,GAEb,CACE3B,UAAW,WACX0B,MAAOiS,EAAa,gBACpBtG,YAAY,EACZ1L,UAAW,GAIb,CACED,MAAO,cACPC,UAAW,QAWnB8G,EAAKrG,qBACLqG,EAAKtG,sBAGHwS,GAAkB,CACtBlM,EAAK7G,iBACL6G,EAAK1G,kBACLyS,GACAC,GACAC,GACAH,GACA9L,EAAK/F,aAEPgQ,GAAM5Q,SAAW6S,GACdt7C,OAAO,CAGNqoC,MAAO,KACPlxC,IAAK,KACLozC,SAAUuQ,EACVrS,SAAU,CACR,QACAzoC,OAAOs7C,MAEb,MAAMC,GAAqB,GAAGv7C,OAAO4oC,GAASyQ,GAAM5Q,UAC9C+S,GAAkBD,GAAmBv7C,OAAO,CAEhD,CACEqoC,MAAO,KACPlxC,IAAK,KACLozC,SAAUuQ,EACVrS,SAAU,CAAC,QAAQzoC,OAAOu7C,OAGxBE,GAAS,CACb9U,UAAW,SACX0B,MAAO,KACPlxC,IAAK,KACLq9C,cAAc,EACdM,YAAY,EACZvK,SAAUuQ,EACVrS,SAAU+S,IAGZ,MAAO,CACLp0C,KAAM,aACNyqC,QAAS,CAAC,KAAM,MAAO,MAAO,OAC9BtH,SAAUuQ,EAEVtnD,QAAS,CAAEgoD,oBACXhT,QAAS,eACTC,SAAU,CACR2G,EAAKxF,QAAQ,CACX8R,MAAO,UACP3R,OAAQ,OACRzB,UAAW,IAEb,CACEoT,MAAO,aACP/U,UAAW,OACX2B,UAAW,GACXD,MAAO,gCAET+G,EAAK7G,iBACL6G,EAAK1G,kBACLyS,GACAC,GACAC,GACAzS,GACAsS,GACA,CACE7S,MAAOroC,OAAO,YAWZo6C,UAAUp6C,OAGR,6CACAs6C,EAAa,WACjBhS,UAAW,EACXG,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAOiS,EAAaF,UAAU,SAC9B9R,UAAW,KAIjB,CACED,MAAO,IAAM+G,EAAKzF,eAAiB,kCACnCY,SAAU,oBACV9B,SAAU,CACRG,GACAwG,EAAK/F,YACL,CACE1C,UAAW,WAIX0B,MAAO,2DAME+G,EAAKpH,oBAAsB,UACpCyM,aAAa,EACbt9C,IAAK,SACLsxC,SAAU,CACR,CACE9B,UAAW,SACX+H,SAAU,CACR,CACErG,MAAO+G,EAAKpH,oBACZM,UAAW,GAEb,CACE3B,UAAW,KACX0B,MAAO,UACPkM,MAAM,GAER,CACElM,MAAO,KACPlxC,IAAK,KACLq9C,cAAc,EACdM,YAAY,EACZvK,SAAUuQ,EACVrS,SAAU+S,QAMpB,CACEnT,MAAO,IAAKC,UAAW,GAEzB,CACE3B,UAAW,GACX0B,MAAO,KACPlxC,IAAK,MACLo9C,MAAM,GAER,CACE7F,SAAU,CACR,CAAErG,MAAOkS,EAAgBpjD,IAAKojD,GAC9B,CACElS,MAAOmS,EAAQnS,MAGf,WAAYmS,EAAQC,kBACpBtjD,IAAKqjD,EAAQrjD,MAGjBg8C,YAAa,MACb1K,SAAU,CACR,CACEJ,MAAOmS,EAAQnS,MACflxC,IAAKqjD,EAAQrjD,IACbo9C,MAAM,EACN9L,SAAU,CAAC,YAKnBH,UAAW,GAEb,CACE3B,UAAW,WACX0D,cAAe,WACflzC,IAAK,OACL29C,YAAY,EACZvK,SAAUuQ,EACVrS,SAAU,CACR,OACA2G,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAAEjB,MAAOiS,IACvCmB,IAEFjT,QAAS,KAEX,CAGE6B,cAAe,6BAEjB,CACE1D,UAAW,WAIX0B,MAAO+G,EAAKpH,oBAALoH,gEAQPqF,aAAY,EACZhM,SAAU,CACRgT,GACArM,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAAEjB,MAAOiS,MAM3C,CACE5L,SAAU,CACR,CAAErG,MAAO,MAAQiS,GACjB,CAAEjS,MAAO,MAAQiS,IAEnBhS,UAAW,GAEb,CACE3B,UAAW,QACX0D,cAAe,QACflzC,IAAK,QACL29C,YAAY,EACZtM,QAAS,UACTC,SAAU,CACR,CAAE4B,cAAe,WACjB+E,EAAK7F,wBAGT,CACElB,MAAO,oBACPlxC,IAAK,OACL29C,YAAY,EACZrM,SAAU,CACR2G,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAAEjB,MAAOiS,IACvC,OACAmB,KAGJ,CACEpT,MAAO,mBAAqBiS,EAAa,OACzCnjD,IAAK,KACLozC,SAAU,UACV9B,SAAU,CACR2G,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAAEjB,MAAOiS,IACvC,CAAEjS,MAAO,QACToT,KAGJ,CACEpT,MAAO,WAIf,aC3hBA50C,EAAOD,QAtDP,SAASmoD,KAAKvM,GACZ,MAAM8K,EAAW,CACfP,QAAS,mBAELiC,EAAmB,CACvBxM,EAAKtG,oBACLsG,EAAKrG,sBAED8S,EAAQ,CACZzM,EAAK1G,kBACL0G,EAAKlG,eAED4S,EAAkB,CACtB3kD,IAAK,IACLk3C,gBAAgB,EAChByG,YAAY,EACZrM,SAAUoT,EACVtR,SAAU2P,GAEN6B,EAAS,CACb1T,MAAO,KACPlxC,IAAK,KACLsxC,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAO,IACPlxC,IAAK,IACLsxC,SAAU,CAAC2G,EAAKhH,kBAChBI,QAAS,OAEX4G,EAAKnJ,QAAQ6V,EAAiB,CAC5BzT,MAAO,OAETroC,OAAO47C,GACTpT,QAAS,OAELwT,EAAQ,CACZ3T,MAAO,MACPlxC,IAAK,MACLsxC,SAAU,CAAC2G,EAAKnJ,QAAQ6V,IACxBtT,QAAS,OAMX,OAJAqT,EAAMnlD,KAAKqlD,EAAQC,GACnBJ,EAAiB97B,SAAQ,SAASovB,GAChC2M,EAAMnlD,KAAKw4C,EACb,IACO,CACL9nC,KAAM,OACNqhC,SAAUoT,EACVtR,SAAU2P,EACV1R,QAAS,MAEb,aC8QA/0C,EAAOD,QAlUP,SAASyoD,WAAW7M,GAClB,MAwCM6K,EAAW,CACfjM,SAAU,iBACV3C,QACE,uLAIFuO,SACE,mqBAaEsC,EAAkB,CACtB7T,MAAO,YACPC,UAAW,GAGP6Q,EAAM,CACVxS,UAAW,WACX+H,SAAU,CACR,CACErG,MAAO,QAET,CACE1B,UAAW,UACX0B,MAAO,UAET,CACEA,MAAO,uBAUPkR,EAAe,CACnB5S,UAAW,SACX+H,SAAU,CACR,CACErG,MAAO,IACPlxC,IAAK,KAEP,CACEkxC,MAAO,KACPlxC,IAAK,QAGTsxC,SAAU,CACRyT,EACA/C,EACA,CACExS,UAAW,WACX0B,MAAO,UACPlxC,IAAK,YAKLglD,EAAc,CAClBxV,UAAW,SACX+H,SAAU,CACR,CACErG,MAAO,IACPlxC,IAAK,KAEP,CACEkxC,MAAO,KACPlxC,IAAK,SAmBLilD,EAAahN,EAAKnJ,QACtBmJ,EAAKxG,QAAQ,KAAM,MACnB,CACE8F,SAAU,CAER,CACErG,MAAO,IACPlxC,IAAK,KAGP,CACEkxC,MAAO,KACPlxC,IAAK,OAGTsxC,SAAU,CA7BM,CAClB9B,UAAW,SACX+H,SAAU,CAER,CACErG,MAAO,2FAGT,CACEA,MAAO,sGAwBPgU,EAAU,CACd1V,UAAW,WACX+H,SAAU,CACR,CACErG,MAAO,IAAIroC,OA9If,2rBA8ImC,qBAK/Bs8C,EAAW,CACf3V,UAAW,QACX0D,cAAe,aACflzC,IAAK,SACL29C,YAAY,EACZxM,UAAW,EACXG,SAAU,CAAE2G,EAAK9F,aAGbiT,EAAc,CAClB5V,UAAW,WACX0B,MAAO,cACPlxC,IAAK,UACL29C,YAAY,EACZL,aAAa,EACbnM,UAAW,EACXG,SAAU,CACR,CACEJ,MAAO,WACPC,UAAW,EACX3B,UAAW,WAEb,CACEA,UAAW,QACX0B,MAnIgB,yBAoIhBC,UAAW,GAEb,CACED,MAAO,KACPlxC,IAAK,KACLwvC,UAAW,SACX2B,UAAW,EACXG,SAAU,CAAE0Q,MAOZqD,EAAW,CACfnU,MAAO,UACPlxC,IAAK,IACLs9C,aAAa,EACbhM,SAAU,CACR8Q,EACA4C,EACA,CACExV,UAAW,UACX0B,MAAO,oDAMPoU,EAAe,CACnB/N,SAAU,CAER,CACE/H,UAAW,WACX0B,MAAO,IAAIroC,OAjMf,+bAiM4C,SAE1C,CACE2mC,UAAW,UACX0B,MAAO,aACPC,UAAW,KAaXoU,EAAa,CACjB/V,UAAW,WACX0B,MAAO,wBACPlxC,IAAK,IACLs9C,aAAa,EACbnM,UAAW,EACXG,SAAU,CACR,CACE9B,UAAW,UACX0B,MAAO,IAAIroC,OACTi6C,EAAS5O,QAAQzwC,WAAWpG,QAAQ,MAAO,KACxC,QACLw/C,YAAY,EACZ1L,UAAW,GAEb8G,EAAKnJ,QAAQmJ,EAAK9F,WAAY,CAC5B0K,YAAY,MAKZ2I,GAAiB,CAErBD,EACAN,EACAF,EACA9M,EAAKnG,YACLsQ,EACA4C,EAEAE,EACAlD,EAhMc,CACdxS,UAAW,UACX0B,MAAO,yBAuJU,CACjB1B,UAAW,eACX0B,MAAO,MACPC,UAAW,IAyCPsU,GAAU,CACdvU,MAAO,KACPlxC,IAAK,KACLq9C,cAAc,EACdM,YAAY,EACZxM,UAAW,EACXG,SAAU,GAAGzoC,OACX,OACA28C,GACA,CACEtU,MAAO,IAjSC,CACZ,SACA,OACA,OACA,MACA,OACA,OACA,UACA,SACA,SACA,WACA,MACA,QACA,YACA,QAmRuBxxC,KAAK,KAAO,IAC/B8vC,UAAW,WACX2B,UAAW,GAEb,CACE3B,UAAW,OACX0B,MAAO,YACPC,UAAW,KAOjB,OAFAoU,EAAWjU,SAASpL,QAAQuf,IAErB,CACLx1C,KAAM,aACNyqC,QAAS,CACP,KACA,OAEF/F,kBAAkB,EAClBvB,SAAU0P,EACVxR,SAAUkU,GAAe38C,OACvBs8C,EACAC,EACAC,EACAC,EACAG,IAGN,aC/TA,SAASnrC,OAAOo2B,GACd,OAAKA,EACa,iBAAPA,EAAwBA,EAE5BA,EAAGp2B,OAHM,IAIlB,CAMA,SAAS2oC,UAAUvS,GACjB,OAAO7nC,OAAO,MAAO6nC,EAAI,IAC3B,CAcA,SAAS7nC,UAAU8X,GAEjB,OADeA,EAAKkS,KAAKlqB,GAAM2R,OAAO3R,KAAIjJ,KAAK,GAEjD,CASA,SAAS6zC,UAAU5yB,GAEjB,MADe,IAAMA,EAAKkS,KAAKlqB,GAAM2R,OAAO3R,KAAIjJ,KAAK,KAAO,GAE9D,CA2OApD,EAAOD,QAjOP,SAASo6B,IAAIwhB,GAEX,MAAMyN,EAAc78C,OAAO,SAnC7B,SAAS88C,SAASjV,GAChB,OAAO7nC,OAAO,IAAK6nC,EAAI,KACzB,CAiCuCiV,CAAS,iBAAkB,gBAE1DC,EAAe,CACnBpW,UAAW,SACX0B,MAAO,oCAEH2U,EAAoB,CACxB3U,MAAO,KACPI,SAAU,CACR,CACE9B,UAAW,eACX0B,MAAO,sBACPG,QAAS,QAITyU,EAAwB7N,EAAKnJ,QAAQ+W,EAAmB,CAC5D3U,MAAO,KACPlxC,IAAK,OAED+lD,EAAwB9N,EAAKnJ,QAAQmJ,EAAK7G,iBAAkB,CAChE5B,UAAW,gBAEPwW,EAAyB/N,EAAKnJ,QAAQmJ,EAAK1G,kBAAmB,CAClE/B,UAAW,gBAEPyW,EAAgB,CACpB/O,gBAAgB,EAChB7F,QAAS,IACTF,UAAW,EACXG,SAAU,CACR,CACE9B,UAAW,OACX0B,MAhCe,mBAiCfC,UAAW,GAEb,CACED,MAAO,OACPC,UAAW,EACXG,SAAU,CACR,CACE9B,UAAW,SACXqN,YAAY,EACZtF,SAAU,CACR,CACErG,MAAO,IACPlxC,IAAK,IACLsxC,SAAU,CAAEsU,IAEd,CACE1U,MAAO,IACPlxC,IAAK,IACLsxC,SAAU,CAAEsU,IAEd,CACE1U,MAAO,sBAQrB,MAAO,CACLjhC,KAAM,YACNyqC,QAAS,CACP,OACA,QACA,MACA,OACA,MACA,MACA,MACA,QACA,MACA,OAEF/F,kBAAkB,EAClBrD,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAO,UACPlxC,IAAK,IACLmxC,UAAW,GACXG,SAAU,CACRuU,EACAG,EACAD,EACAD,EACA,CACE5U,MAAO,KACPlxC,IAAK,KACLsxC,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAO,UACPlxC,IAAK,IACLsxC,SAAU,CACRuU,EACAC,EACAE,EACAD,QAOZ9N,EAAKxG,QACH,OACA,MACA,CACEN,UAAW,KAGf,CACED,MAAO,cACPlxC,IAAK,QACLmxC,UAAW,IAEbyU,EACA,CACEpW,UAAW,OACX0B,MAAO,SACPlxC,IAAK,MACLmxC,UAAW,IAEb,CACE3B,UAAW,MAOX0B,MAAO,iBACPlxC,IAAK,IACLozC,SAAU,CACRnjC,KAAM,SAERqhC,SAAU,CAAE2U,GACZtO,OAAQ,CACN33C,IAAK,YACL09C,WAAW,EACX1B,YAAa,CACX,MACA,SAIN,CACExM,UAAW,MAEX0B,MAAO,kBACPlxC,IAAK,IACLozC,SAAU,CACRnjC,KAAM,UAERqhC,SAAU,CAAE2U,GACZtO,OAAQ,CACN33C,IAAK,aACL09C,WAAW,EACX1B,YAAa,CACX,aACA,aACA,SAKN,CACExM,UAAW,MACX0B,MAAO,WAGT,CACE1B,UAAW,MACX0B,MAAOroC,OACL,IACAo6C,UAAUp6C,OACR68C,EAIAnS,OAAO,MAAO,IAAK,SAGvBvzC,IAAK,OACLsxC,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAOwU,EACPvU,UAAW,EACXwG,OAAQsO,KAKd,CACEzW,UAAW,MACX0B,MAAOroC,OACL,MACAo6C,UAAUp6C,OACR68C,EAAa,OAGjBpU,SAAU,CACR,CACE9B,UAAW,OACX0B,MAAOwU,EACPvU,UAAW,GAEb,CACED,MAAO,IACPC,UAAW,EACX0L,YAAY,MAMxB,aC7GAvgD,EAAOD,QAtKP,SAAS6pD,KAAKjO,GACZ,IAAI8K,EAAW,yBAGXoD,EAAiB,8BAsBjBC,EAAS,CACX5W,UAAW,SACX2B,UAAW,EACXoG,SAAU,CACR,CAAErG,MAAO,IAAKlxC,IAAK,KACnB,CAAEkxC,MAAO,IAAKlxC,IAAK,KACnB,CAAEkxC,MAAO,QAEXI,SAAU,CACR2G,EAAKhH,iBAhBgB,CACvBzB,UAAW,oBACX+H,SAAU,CACR,CAAErG,MAAO,OAAQlxC,IAAK,QACtB,CAAEkxC,MAAO,MAAOlxC,IAAK,UAmBrBqmD,EAAmBpO,EAAKnJ,QAAQsX,EAAQ,CAC1C7O,SAAU,CACR,CAAErG,MAAO,IAAKlxC,IAAK,KACnB,CAAEkxC,MAAO,IAAKlxC,IAAK,KACnB,CAAEkxC,MAAO,mBAQToV,EAAY,CACd9W,UAAW,SACX0B,MAAO,iIAGLyT,EAAkB,CACpB3kD,IAAK,IACLk3C,gBAAgB,EAChByG,YAAY,EACZvK,SAAU2P,EACV5R,UAAW,GAETyT,EAAS,CACX1T,MAAO,KACPlxC,IAAK,KACLsxC,SAAU,CAACqT,GACXtT,QAAS,MACTF,UAAW,GAET0T,EAAQ,CACV3T,MAAO,MACPlxC,IAAK,MACLsxC,SAAU,CAACqT,GACXtT,QAAS,MACTF,UAAW,GAGTmB,EAAQ,CAvEF,CACR9C,UAAW,OACX+H,SAAU,CACR,CAAErG,MAAO,gCACT,CAAEA,MAAO,kCACT,CAAEA,MAAO,oCAoEX,CACE1B,UAAW,OACX0B,MAAO,YACPC,UAAW,IAEb,CAKE3B,UAAW,SACX0B,MAAO,iEAET,CACEA,MAAO,WACPlxC,IAAK,UACLg8C,YAAa,OACbqB,cAAc,EACdM,YAAY,EACZxM,UAAW,GAEb,CACE3B,UAAW,OACX0B,MAAO,SAAWiV,GAGpB,CACE3W,UAAW,OACX0B,MAAO,KAAOiV,EAAiB,KAEjC,CACE3W,UAAW,OACX0B,MAAO,IAAMiV,GAEf,CACE3W,UAAW,OACX0B,MAAO,KAAOiV,GAEhB,CACE3W,UAAW,OACX0B,MAAO,IAAM+G,EAAKpH,oBAAsB,KAE1C,CACErB,UAAW,OACX0B,MAAO,MAAQ+G,EAAKpH,oBAAsB,KAE5C,CACErB,UAAW,SAEX0B,MAAO,aACPC,UAAW,GAEb8G,EAAKpG,kBACL,CACEqB,cAAe6P,EACf3P,SAAU,CAAEoP,QAASO,IAEvBuD,EAGA,CACE9W,UAAW,SACX0B,MAAO+G,EAAKlH,YAAc,MAC1BI,UAAW,GAEbyT,EACAC,EACAuB,GAGEG,EAAc,IAAIjU,GAKtB,OAJAiU,EAAY/xB,MACZ+xB,EAAYhnD,KAAK8mD,GACjB1B,EAAgBrT,SAAWiV,EAEpB,CACLt2C,KAAM,OACN0kC,kBAAkB,EAClB+F,QAAS,CAAE,OACXpJ,SAAUgB,EAEd,+BC3KA,IAAIkU,EAAU,EAAQ,OAMlBC,EAAgB,CAClBC,mBAAmB,EACnBC,aAAa,EACbC,cAAc,EACdC,cAAc,EACdpe,aAAa,EACbqe,iBAAiB,EACjBC,0BAA0B,EAC1BC,0BAA0B,EAC1BC,QAAQ,EACRC,WAAW,EACXhkD,MAAM,GAEJikD,EAAgB,CAClBl3C,MAAM,EACN/Q,QAAQ,EACR+B,WAAW,EACXmmD,QAAQ,EACRltC,QAAQ,EACRvW,WAAW,EACXwrB,OAAO,GASLk4B,EAAe,CACjB,UAAY,EACZ5+C,SAAS,EACTo+C,cAAc,EACdpe,aAAa,EACbye,WAAW,EACXhkD,MAAM,GAEJokD,EAAe,CAAC,EAIpB,SAASC,WAAWnO,GAElB,OAAIoN,EAAQgB,OAAOpO,GACViO,EAIFC,EAAalO,EAAoB,WAAMqN,CAChD,CAXAa,EAAad,EAAQiB,YAhBK,CACxB,UAAY,EACZ3O,QAAQ,EACR+N,cAAc,EACdpe,aAAa,EACbye,WAAW,GAYbI,EAAad,EAAQkB,MAAQL,EAY7B,IAAIn/C,EAAiBnH,OAAOmH,eACxBmjB,EAAsBtqB,OAAOsqB,oBAC7BtC,EAAwBhoB,OAAOgoB,sBAC/BrO,EAA2B3Z,OAAO2Z,yBAClCG,EAAiB9Z,OAAO8Z,eACxB8sC,GAAkB5mD,OAAOE,UAsC7B3E,EAAOD,QArCP,SAASurD,qBAAqBC,EAAiBC,EAAiBC,GAC9D,GAA+B,iBAApBD,EAA8B,CAEvC,GAAIH,GAAiB,CACnB,IAAIK,EAAqBntC,EAAeitC,GAEpCE,GAAsBA,IAAuBL,IAC/CC,qBAAqBC,EAAiBG,EAAoBD,EAE9D,CAEA,IAAIvtC,EAAO6Q,EAAoBy8B,GAE3B/+B,IACFvO,EAAOA,EAAK3R,OAAOkgB,EAAsB++B,KAM3C,IAHA,IAAIG,EAAgBV,WAAWM,GAC3BK,EAAgBX,WAAWO,GAEtBtpD,GAAI,EAAGA,GAAIgc,EAAKtb,SAAUV,GAAG,CACpC,IAAI0U,GAAMsH,EAAKhc,IAEf,KAAK2oD,EAAcj0C,KAAU60C,GAAaA,EAAU70C,KAAWg1C,GAAiBA,EAAch1C,KAAW+0C,GAAiBA,EAAc/0C,KAAO,CAC7I,IAAIgM,GAAaxE,EAAyBotC,EAAiB50C,IAE3D,IAEEhL,EAAe2/C,EAAiB30C,GAAKgM,GACvC,CAAE,MAAOnX,GAAI,CACf,CACF,CACF,CAEA,OAAO8/C,CACT,iBCnGAxrD,EAAQ8I,KAAO,SAAU7C,EAAQmD,EAAQ0iD,EAAMC,EAAMC,GACnD,IAAItgD,EAAGtD,EACH6jD,EAAiB,EAATD,EAAcD,EAAO,EAC7BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBE,GAAS,EACTjqD,EAAI2pD,EAAQE,EAAS,EAAK,EAC1BK,EAAIP,GAAQ,EAAI,EAChBxS,GAAIrzC,EAAOmD,EAASjH,GAOxB,IALAA,GAAKkqD,EAEL3gD,EAAI4tC,IAAM,IAAO8S,GAAU,EAC3B9S,MAAQ8S,EACRA,GAASH,EACFG,EAAQ,EAAG1gD,EAAS,IAAJA,EAAWzF,EAAOmD,EAASjH,GAAIA,GAAKkqD,EAAGD,GAAS,GAKvE,IAHAhkD,EAAIsD,GAAM,IAAO0gD,GAAU,EAC3B1gD,KAAQ0gD,EACRA,GAASL,EACFK,EAAQ,EAAGhkD,EAAS,IAAJA,EAAWnC,EAAOmD,EAASjH,GAAIA,GAAKkqD,EAAGD,GAAS,GAEvE,GAAU,IAAN1gD,EACFA,EAAI,EAAIygD,MACH,IAAIzgD,IAAMwgD,EACf,OAAO9jD,EAAIkkD,IAAsB13C,KAAd0kC,IAAK,EAAI,GAE5BlxC,GAAQmC,KAAK6F,IAAI,EAAG27C,GACpBrgD,GAAQygD,CACV,CACA,OAAQ7S,IAAK,EAAI,GAAKlxC,EAAImC,KAAK6F,IAAI,EAAG1E,EAAIqgD,EAC5C,EAEA/rD,EAAQwF,MAAQ,SAAUS,EAAQf,EAAOkE,EAAQ0iD,EAAMC,EAAMC,GAC3D,IAAItgD,EAAGtD,EAAGgC,EACN6hD,EAAiB,EAATD,EAAcD,EAAO,EAC7BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBK,EAAe,KAATR,EAAcxhD,KAAK6F,IAAI,GAAI,IAAM7F,KAAK6F,IAAI,GAAI,IAAM,EAC1DjO,GAAI2pD,EAAO,EAAKE,EAAS,EACzBK,GAAIP,EAAO,GAAK,EAChBxS,GAAIp0C,EAAQ,GAAgB,IAAVA,GAAe,EAAIA,EAAQ,EAAK,EAAI,EAmC1D,IAjCAA,EAAQqF,KAAKmK,IAAIxP,GAEb0S,MAAM1S,IAAUA,IAAU0P,KAC5BxM,EAAIwP,MAAM1S,GAAS,EAAI,EACvBwG,EAAIwgD,IAEJxgD,EAAInB,KAAK6J,MAAM7J,KAAKijC,IAAItoC,GAASqF,KAAKiiD,KAClCtnD,GAASkF,EAAIG,KAAK6F,IAAI,GAAI1E,IAAM,IAClCA,IACAtB,GAAK,IAGLlF,GADEwG,EAAIygD,GAAS,EACNI,EAAKniD,EAELmiD,EAAKhiD,KAAK6F,IAAI,EAAG,EAAI+7C,IAEpB/hD,GAAK,IACfsB,IACAtB,GAAK,GAGHsB,EAAIygD,GAASD,GACf9jD,EAAI,EACJsD,EAAIwgD,GACKxgD,EAAIygD,GAAS,GACtB/jD,GAAMlD,EAAQkF,EAAK,GAAKG,KAAK6F,IAAI,EAAG27C,GACpCrgD,GAAQygD,IAER/jD,EAAIlD,EAAQqF,KAAK6F,IAAI,EAAG+7C,EAAQ,GAAK5hD,KAAK6F,IAAI,EAAG27C,GACjDrgD,EAAI,IAIDqgD,GAAQ,EAAG9lD,EAAOmD,EAASjH,IAAS,IAAJiG,EAAUjG,IAAKkqD,GAAGjkD,GAAK,IAAK2jD,GAAQ,GAI3E,IAFArgD,EAAKA,GAAKqgD,EAAQ3jD,EAClB6jD,GAAQF,EACDE,EAAO,EAAGhmD,EAAOmD,EAASjH,IAAS,IAAJuJ,EAAUvJ,IAAKkqD,GAAG3gD,GAAK,IAAKugD,GAAQ,GAE1EhmD,EAAOmD,EAASjH,GAAIkqD,KAAU,IAAJ/S,EAC5B,qBC5EiEr5C,EAAOD,QAGhE,WAAc,aAAa,IAAIysD,EAAUlpD,MAAMqB,UAAUa,MAE/D,SAASinD,YAAYC,EAAMC,GACrBA,IACFD,EAAK/nD,UAAYF,OAAO6kB,OAAOqjC,EAAWhoD,YAE5C+nD,EAAK/nD,UAAU4O,YAAcm5C,CAC/B,CAEA,SAASliC,SAASvlB,GACd,OAAO2nD,WAAW3nD,GAASA,EAAQ4nD,IAAI5nD,EACzC,CAIA,SAAS6nD,cAAc7nD,GACrB,OAAO8nD,QAAQ9nD,GAASA,EAAQ+nD,SAAS/nD,EAC3C,CAIA,SAASgoD,gBAAgBhoD,GACvB,OAAOioD,UAAUjoD,GAASA,EAAQkoD,WAAWloD,EAC/C,CAIA,SAASmoD,YAAYnoD,GACnB,OAAO2nD,WAAW3nD,KAAWooD,cAAcpoD,GAASA,EAAQqoD,OAAOroD,EACrE,CAIF,SAAS2nD,WAAWW,GAClB,SAAUA,IAAiBA,EAAcC,GAC3C,CAEA,SAAST,QAAQU,GACf,SAAUA,IAAcA,EAAWC,GACrC,CAEA,SAASR,UAAUS,GACjB,SAAUA,IAAgBA,EAAaC,GACzC,CAEA,SAASP,cAAcQ,GACrB,OAAOd,QAAQc,IAAqBX,UAAUW,EAChD,CAEA,SAASC,UAAUC,GACjB,SAAUA,IAAgBA,EAAaC,GACzC,CArCAvB,YAAYK,cAAetiC,UAM3BiiC,YAAYQ,gBAAiBziC,UAM7BiiC,YAAYW,YAAa5iC,UA2BzBA,SAASoiC,WAAaA,WACtBpiC,SAASuiC,QAAUA,QACnBviC,SAAS0iC,UAAYA,UACrB1iC,SAAS6iC,cAAgBA,cACzB7iC,SAASsjC,UAAYA,UAErBtjC,SAASyjC,MAAQnB,cACjBtiC,SAAS0jC,QAAUjB,gBACnBziC,SAASqlB,IAAMud,YAGf,IAAII,EAAuB,6BACvBE,EAAoB,0BACpBE,EAAsB,4BACtBI,EAAsB,4BAGtBG,EAAS,SAGTC,EAAQ,EACRC,EAAO,GAAKD,EACZE,EAAOD,EAAO,EAIdE,EAAU,CAAC,EAGXC,EAAgB,CAAEvpD,OAAO,GACzBwpD,EAAY,CAAExpD,OAAO,GAEzB,SAASypD,QAAQC,GAEf,OADAA,EAAI1pD,OAAQ,EACL0pD,CACT,CAEA,SAASC,OAAOD,GACdA,IAAQA,EAAI1pD,OAAQ,EACtB,CAKA,SAAS4pD,UAAW,CAGpB,SAASC,QAAQ3sD,EAAKgH,GACpBA,EAASA,GAAU,EAGnB,IAFA,IAAI5G,EAAM+H,KAAK2C,IAAI,EAAG9K,EAAIS,OAASuG,GAC/B4lD,EAAS,IAAIzrD,MAAMf,GACdysD,EAAK,EAAGA,EAAKzsD,EAAKysD,IACzBD,EAAOC,GAAM7sD,EAAI6sD,EAAK7lD,GAExB,OAAO4lD,CACT,CAEA,SAASE,WAAWC,GAIlB,YAHkBxoD,IAAdwoD,EAAKjoD,OACPioD,EAAKjoD,KAAOioD,EAAKC,UAAUC,aAEtBF,EAAKjoD,IACd,CAEA,SAASooD,UAAUH,EAAMj4C,GAQvB,GAAqB,iBAAVA,EAAoB,CAC7B,IAAIq4C,EAAcr4C,IAAU,EAC5B,GAAI,GAAKq4C,IAAgBr4C,GAAyB,aAAhBq4C,EAChC,OAAOjD,IAETp1C,EAAQq4C,CACV,CACA,OAAOr4C,EAAQ,EAAIg4C,WAAWC,GAAQj4C,EAAQA,CAChD,CAEA,SAASm4C,aACP,OAAO,CACT,CAEA,SAASG,WAAW3a,EAAOlxC,EAAKuD,GAC9B,OAAkB,IAAV2tC,QAAyBluC,IAATO,GAAsB2tC,IAAU3tC,UAC7CP,IAARhD,QAA+BgD,IAATO,GAAsBvD,GAAOuD,EACxD,CAEA,SAASuoD,aAAa5a,EAAO3tC,GAC3B,OAAOwoD,aAAa7a,EAAO3tC,EAAM,EACnC,CAEA,SAASyoD,WAAWhsD,EAAKuD,GACvB,OAAOwoD,aAAa/rD,EAAKuD,EAAMA,EACjC,CAEA,SAASwoD,aAAax4C,EAAOhQ,EAAM0oD,GACjC,YAAiBjpD,IAAVuQ,EACL04C,EACA14C,EAAQ,EACN3M,KAAK2C,IAAI,EAAGhG,EAAOgQ,QACVvQ,IAATO,EACEgQ,EACA3M,KAAKC,IAAItD,EAAMgQ,EACvB,CAIA,IAAI24C,EAAe,EACfC,GAAiB,EACjBC,GAAkB,EAElBC,GAAyC,mBAAX/rD,QAAyBA,OAAOukB,SAC9DynC,GAAuB,aAEvBC,GAAkBF,IAAwBC,GAG9C,SAASE,SAASznC,GACdtoB,KAAKsoB,KAAOA,CACd,CAkBF,SAAS0nC,cAAcvpD,EAAMwpD,EAAGC,EAAGC,GACjC,IAAIrrD,EAAiB,IAAT2B,EAAawpD,EAAa,IAATxpD,EAAaypD,EAAI,CAACD,EAAGC,GAIlD,OAHAC,EAAkBA,EAAerrD,MAAQA,EAAUqrD,EAAiB,CAClErrD,MAAOA,EAAOuZ,MAAM,GAEf8xC,CACT,CAEA,SAASC,eACP,MAAO,CAAEtrD,WAAOyB,EAAW8X,MAAM,EACnC,CAEA,SAASgyC,YAAYjD,GACnB,QAASkD,cAAclD,EACzB,CAEA,SAASmD,WAAWC,GAClB,OAAOA,GAA+C,mBAAvBA,EAAcloC,IAC/C,CAEA,SAAST,YAAYK,GACnB,IAAIuoC,EAAaH,cAAcpoC,GAC/B,OAAOuoC,GAAcA,EAAWpoD,KAAK6f,EACvC,CAEA,SAASooC,cAAcpoC,GACrB,IAAIuoC,EAAavoC,IACd0nC,IAAwB1nC,EAAS0nC,KAClC1nC,EAAS2nC,KAEX,GAA0B,mBAAfY,EACT,OAAOA,CAEX,CAEA,SAASC,YAAY5rD,GACnB,OAAOA,GAAiC,iBAAjBA,EAAMrC,MAC/B,CAGE,SAASiqD,IAAI5nD,GACX,OAAOA,QAAwC6rD,gBAC7ClE,WAAW3nD,GAASA,EAAM8rD,QAAUC,aAAa/rD,EACrD,CAqCA,SAAS+nD,SAAS/nD,GAChB,OAAOA,QACL6rD,gBAAgBG,aAChBrE,WAAW3nD,GACR8nD,QAAQ9nD,GAASA,EAAM8rD,QAAU9rD,EAAMisD,eACxCC,kBAAkBlsD,EACxB,CASA,SAASkoD,WAAWloD,GAClB,OAAOA,QAAwC6rD,gBAC5ClE,WAAW3nD,GACZ8nD,QAAQ9nD,GAASA,EAAMmsD,WAAansD,EAAMosD,eADrBC,oBAAoBrsD,EAE7C,CAyBA,SAASqoD,OAAOroD,GACd,OACEA,QAAwC6rD,gBACvClE,WAAW3nD,GACZ8nD,QAAQ9nD,GAASA,EAAMmsD,WAAansD,EADfqsD,oBAAoBrsD,IAEzCssD,UACJ,CAlJArB,SAASvrD,UAAUwC,SAAW,WAC5B,MAAO,YACT,EAGF+oD,SAAS7lC,KAAOulC,EAChBM,SAAS5lC,OAASulC,GAClBK,SAAS3lC,QAAUulC,GAEnBI,SAASvrD,UAAUqI,QACnBkjD,SAASvrD,UAAU6sD,SAAW,WAAc,OAAOrxD,KAAKgH,UAAY,EACpE+oD,SAASvrD,UAAUsrD,IAAmB,WACpC,OAAO9vD,IACT,EA0CAssD,YAAYI,IAAKriC,UAMfqiC,IAAI4E,GAAK,WACP,OAAO5E,IAAIxlD,UACb,EAEAwlD,IAAIloD,UAAUosD,MAAQ,WACpB,OAAO5wD,IACT,EAEA0sD,IAAIloD,UAAUwC,SAAW,WACvB,OAAOhH,KAAK6X,WAAW,QAAS,IAClC,EAEA60C,IAAIloD,UAAU+sD,YAAc,WAK1B,OAJKvxD,KAAKwxD,QAAUxxD,KAAKyxD,oBACvBzxD,KAAKwxD,OAASxxD,KAAKixD,WAAWS,UAC9B1xD,KAAK8G,KAAO9G,KAAKwxD,OAAO/uD,QAEnBzC,IACT,EAIA0sD,IAAIloD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GACrC,OAAOoU,WAAW3xD,KAAMiV,EAAIsoC,GAAS,EACvC,EAIAmP,IAAIloD,UAAUotD,WAAa,SAASnrD,EAAM82C,GACxC,OAAOsU,YAAY7xD,KAAMyG,EAAM82C,GAAS,EAC1C,EAIF+O,YAAYO,SAAUH,KASpBG,SAASroD,UAAUssD,WAAa,WAC9B,OAAO9wD,IACT,EAIFssD,YAAYU,WAAYN,KAOtBM,WAAWsE,GAAK,WACd,OAAOtE,WAAW9lD,UACpB,EAEA8lD,WAAWxoD,UAAU0sD,aAAe,WAClC,OAAOlxD,IACT,EAEAgtD,WAAWxoD,UAAUwC,SAAW,WAC9B,OAAOhH,KAAK6X,WAAW,QAAS,IAClC,EAEAm1C,WAAWxoD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAC5C,OAAOoU,WAAW3xD,KAAMiV,EAAIsoC,GAAS,EACvC,EAEAyP,WAAWxoD,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC/C,OAAOsU,YAAY7xD,KAAMyG,EAAM82C,GAAS,EAC1C,EAIF+O,YAAYa,OAAQT,KASlBS,OAAOmE,GAAK,WACV,OAAOnE,OAAOjmD,UAChB,EAEAimD,OAAO3oD,UAAU4sD,SAAW,WAC1B,OAAOpxD,IACT,EAIF0sD,IAAIoF,MAAQA,MACZpF,IAAIoB,MAAQjB,SACZH,IAAIhd,IAAMyd,OACVT,IAAIqB,QAAUf,WAEd,IA2LI+E,GAuUAC,GAqHAC,GAvnBAC,GAAkB,wBAOpB,SAASC,SAASprD,GAChB/G,KAAKoyD,OAASrrD,EACd/G,KAAK8G,KAAOC,EAAMtE,MACpB,CA+BA,SAAS4vD,UAAU7zC,GACjB,IAAIT,EAAOzZ,OAAOyZ,KAAKS,GACvBxe,KAAKsyD,QAAU9zC,EACfxe,KAAKuyD,MAAQx0C,EACb/d,KAAK8G,KAAOiX,EAAKtb,MACnB,CA2CA,SAAS+vD,YAAYtqC,GACnBloB,KAAKyyD,UAAYvqC,EACjBloB,KAAK8G,KAAOohB,EAASzlB,QAAUylB,EAASphB,IAC1C,CAuCA,SAAS4rD,YAAYtqC,GACnBpoB,KAAK2yD,UAAYvqC,EACjBpoB,KAAK4yD,eAAiB,EACxB,CAiDF,SAASd,MAAMe,GACb,SAAUA,IAAYA,EAASX,IACjC,CAIA,SAASvB,gBACP,OAAOoB,KAAcA,GAAY,IAAII,SAAS,IAChD,CAEA,SAASnB,kBAAkBlsD,GACzB,IAAIguD,EACF3vD,MAAMuD,QAAQ5B,GAAS,IAAIqtD,SAASrtD,GAAOisD,eAC3CR,WAAWzrD,GAAS,IAAI4tD,YAAY5tD,GAAOisD,eAC3CV,YAAYvrD,GAAS,IAAI0tD,YAAY1tD,GAAOisD,eAC3B,iBAAVjsD,EAAqB,IAAIutD,UAAUvtD,QAC1CyB,EACF,IAAKusD,EACH,MAAM,IAAInuD,UACR,yEACsBG,GAG1B,OAAOguD,CACT,CAEA,SAAS3B,oBAAoBrsD,GAC3B,IAAIguD,EAAMC,yBAAyBjuD,GACnC,IAAKguD,EACH,MAAM,IAAInuD,UACR,gDAAkDG,GAGtD,OAAOguD,CACT,CAEA,SAASjC,aAAa/rD,GACpB,IAAIguD,EAAMC,yBAAyBjuD,IACf,iBAAVA,GAAsB,IAAIutD,UAAUvtD,GAC9C,IAAKguD,EACH,MAAM,IAAInuD,UACR,iEAAmEG,GAGvE,OAAOguD,CACT,CAEA,SAASC,yBAAyBjuD,GAChC,OACE4rD,YAAY5rD,GAAS,IAAIqtD,SAASrtD,GAClCyrD,WAAWzrD,GAAS,IAAI4tD,YAAY5tD,GACpCurD,YAAYvrD,GAAS,IAAI0tD,YAAY1tD,QACrCyB,CAEJ,CAEA,SAASorD,WAAWmB,EAAK79C,EAAIsoC,EAASyV,GACpC,IAAIC,EAAQH,EAAItB,OAChB,GAAIyB,EAAO,CAET,IADA,IAAIC,EAAWD,EAAMxwD,OAAS,EACrBosD,EAAK,EAAGA,GAAMqE,EAAUrE,IAAM,CACrC,IAAIsE,EAAQF,EAAM1V,EAAU2V,EAAWrE,EAAKA,GAC5C,IAAmD,IAA/C55C,EAAGk+C,EAAM,GAAIH,EAAUG,EAAM,GAAKtE,EAAIiE,GACxC,OAAOjE,EAAK,CAEhB,CACA,OAAOA,CACT,CACA,OAAOiE,EAAIrB,kBAAkBx8C,EAAIsoC,EACnC,CAEA,SAASsU,YAAYiB,EAAKrsD,EAAM82C,EAASyV,GACvC,IAAIC,EAAQH,EAAItB,OAChB,GAAIyB,EAAO,CACT,IAAIC,EAAWD,EAAMxwD,OAAS,EAC1BosD,EAAK,EACT,OAAO,IAAIkB,UAAS,WAClB,IAAIoD,EAAQF,EAAM1V,EAAU2V,EAAWrE,EAAKA,GAC5C,OAAOA,IAAOqE,EACZ9C,eACAJ,cAAcvpD,EAAMusD,EAAUG,EAAM,GAAKtE,EAAK,EAAGsE,EAAM,GAC3D,GACF,CACA,OAAOL,EAAIM,mBAAmB3sD,EAAM82C,EACtC,CAEA,SAAS8V,OAAOtL,EAAMuL,GACpB,OAAOA,EACLC,WAAWD,EAAWvL,EAAM,GAAI,CAAC,GAAIA,IACrCyL,cAAczL,EAClB,CAEA,SAASwL,WAAWD,EAAWvL,EAAMtxC,EAAKg9C,GACxC,OAAItwD,MAAMuD,QAAQqhD,GACTuL,EAAUjrD,KAAKorD,EAAYh9C,EAAKu2C,WAAWjF,GAAM3xB,KAAI,SAAS85B,EAAGD,GAAK,OAAOsD,WAAWD,EAAWpD,EAAGD,EAAGlI,EAAK,KAEnH2L,WAAW3L,GACNuL,EAAUjrD,KAAKorD,EAAYh9C,EAAKo2C,SAAS9E,GAAM3xB,KAAI,SAAS85B,EAAGD,GAAK,OAAOsD,WAAWD,EAAWpD,EAAGD,EAAGlI,EAAK,KAE9GA,CACT,CAEA,SAASyL,cAAczL,GACrB,OAAI5kD,MAAMuD,QAAQqhD,GACTiF,WAAWjF,GAAM3xB,IAAIo9B,eAAeG,SAEzCD,WAAW3L,GACN8E,SAAS9E,GAAM3xB,IAAIo9B,eAAeI,QAEpC7L,CACT,CAEA,SAAS2L,WAAW5uD,GAClB,OAAOA,IAAUA,EAAMsO,cAAgB9O,aAAgCiC,IAAtBzB,EAAMsO,YACzD,CAwDA,SAASygD,GAAGC,EAAQC,GAClB,GAAID,IAAWC,GAAWD,GAAWA,GAAUC,GAAWA,EACxD,OAAO,EAET,IAAKD,IAAWC,EACd,OAAO,EAET,GAA8B,mBAAnBD,EAAO7tD,SACY,mBAAnB8tD,EAAO9tD,QAAwB,CAGxC,IAFA6tD,EAASA,EAAO7tD,cAChB8tD,EAASA,EAAO9tD,YACU6tD,GAAWA,GAAUC,GAAWA,EACxD,OAAO,EAET,IAAKD,IAAWC,EACd,OAAO,CAEX,CACA,QAA6B,mBAAlBD,EAAOlnD,QACW,mBAAlBmnD,EAAOnnD,SACdknD,EAAOlnD,OAAOmnD,GAIpB,CAEA,SAASC,UAAU/nD,EAAG/F,GACpB,GAAI+F,IAAM/F,EACR,OAAO,EAGT,IACGumD,WAAWvmD,SACDK,IAAX0F,EAAEnF,WAAiCP,IAAXL,EAAEY,MAAsBmF,EAAEnF,OAASZ,EAAEY,WAChDP,IAAb0F,EAAEgoD,aAAqC1tD,IAAbL,EAAE+tD,QAAwBhoD,EAAEgoD,SAAW/tD,EAAE+tD,QACnErH,QAAQ3gD,KAAO2gD,QAAQ1mD,IACvB6mD,UAAU9gD,KAAO8gD,UAAU7mD,IAC3BynD,UAAU1hD,KAAO0hD,UAAUznD,GAE3B,OAAO,EAGT,GAAe,IAAX+F,EAAEnF,MAAyB,IAAXZ,EAAEY,KACpB,OAAO,EAGT,IAAIotD,GAAkBhH,cAAcjhD,GAEpC,GAAI0hD,UAAU1hD,GAAI,CAChB,IAAI+e,EAAU/e,EAAE+e,UAChB,OAAO9kB,EAAEytC,OAAM,SAASuc,EAAGD,GACzB,IAAIkD,EAAQnoC,EAAQ1C,OAAOxjB,MAC3B,OAAOquD,GAASU,GAAGV,EAAM,GAAIjD,KAAOgE,GAAkBL,GAAGV,EAAM,GAAIlD,GACrE,KAAMjlC,EAAQ1C,OAAOjK,IACvB,CAEA,IAAI81C,GAAU,EAEd,QAAe5tD,IAAX0F,EAAEnF,KACJ,QAAeP,IAAXL,EAAEY,KACyB,mBAAlBmF,EAAEslD,aACXtlD,EAAEslD,kBAEC,CACL4C,GAAU,EACV,IAAIz9B,EAAIzqB,EACRA,EAAI/F,EACJA,EAAIwwB,CACN,CAGF,IAAI09B,GAAW,EACXC,EAAQnuD,EAAE8oD,WAAU,SAASkB,EAAGD,GAClC,GAAIiE,GAAkBjoD,EAAEka,IAAI+pC,GACxBiE,GAAWN,GAAG3D,EAAGjkD,EAAEN,IAAIskD,EAAG7B,KAAayF,GAAG5nD,EAAEN,IAAIskD,EAAG7B,GAAU8B,GAE/D,OADAkE,GAAW,GACJ,CAEX,IAEA,OAAOA,GAAYnoD,EAAEnF,OAASutD,CAChC,CAIE,SAASC,OAAOxvD,EAAOyvD,GACrB,KAAMv0D,gBAAgBs0D,QACpB,OAAO,IAAIA,OAAOxvD,EAAOyvD,GAI3B,GAFAv0D,KAAKw0D,OAAS1vD,EACd9E,KAAK8G,UAAiBP,IAAVguD,EAAsB//C,IAAWrK,KAAK2C,IAAI,EAAGynD,GACvC,IAAdv0D,KAAK8G,KAAY,CACnB,GAAIkrD,GACF,OAAOA,GAETA,GAAehyD,IACjB,CACF,CAkEF,SAASy0D,UAAU5rC,EAAWrd,GAC5B,IAAKqd,EAAW,MAAM,IAAIxlB,MAAMmI,EAClC,CAIE,SAASkpD,MAAMpxD,EAAOC,EAAKglB,GACzB,KAAMvoB,gBAAgB00D,OACpB,OAAO,IAAIA,MAAMpxD,EAAOC,EAAKglB,GAe/B,GAbAksC,UAAmB,IAATlsC,EAAY,4BACtBjlB,EAAQA,GAAS,OACLiD,IAARhD,IACFA,EAAMiR,KAER+T,OAAgBhiB,IAATgiB,EAAqB,EAAIpe,KAAKmK,IAAIiU,GACrChlB,EAAMD,IACRilB,GAAQA,GAEVvoB,KAAK20D,OAASrxD,EACdtD,KAAK40D,KAAOrxD,EACZvD,KAAK60D,MAAQtsC,EACbvoB,KAAK8G,KAAOqD,KAAK2C,IAAI,EAAG3C,KAAKohB,MAAMhoB,EAAMD,GAASilB,EAAO,GAAK,GAC5C,IAAdvoB,KAAK8G,KAAY,CACnB,GAAImrD,GACF,OAAOA,GAETA,GAAcjyD,IAChB,CACF,CAyFA,SAASu0B,aACP,MAAM5vB,UAAU,WAClB,CAGuC,SAASmwD,kBAAmB,CAE1B,SAASC,oBAAqB,CAElC,SAASC,gBAAiB,CAjoBjEtI,IAAIloD,UAAU0tD,KAAmB,EAIjC5F,YAAY6F,SAAUnF,YAMpBmF,SAAS3tD,UAAUmH,IAAM,SAASmL,EAAOm+C,GACvC,OAAOj1D,KAAKmmB,IAAIrP,GAAS9W,KAAKoyD,OAAOlD,UAAUlvD,KAAM8W,IAAUm+C,CACjE,EAEA9C,SAAS3tD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAG1C,IAFA,IAAIx2C,EAAQ/G,KAAKoyD,OACbc,EAAWnsD,EAAMtE,OAAS,EACrBosD,EAAK,EAAGA,GAAMqE,EAAUrE,IAC/B,IAA0D,IAAtD55C,EAAGlO,EAAMw2C,EAAU2V,EAAWrE,EAAKA,GAAKA,EAAI7uD,MAC9C,OAAO6uD,EAAK,EAGhB,OAAOA,CACT,EAEAsD,SAAS3tD,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC7C,IAAIx2C,EAAQ/G,KAAKoyD,OACbc,EAAWnsD,EAAMtE,OAAS,EAC1BosD,EAAK,EACT,OAAO,IAAIkB,UAAS,WACjB,OAAOlB,EAAKqE,EACX9C,eACAJ,cAAcvpD,EAAMooD,EAAI9nD,EAAMw2C,EAAU2V,EAAWrE,IAAOA,KAAM,GAEtE,EAIFvC,YAAY+F,UAAWxF,UAQrBwF,UAAU7tD,UAAUmH,IAAM,SAAS8K,EAAKw+C,GACtC,YAAoB1uD,IAAhB0uD,GAA8Bj1D,KAAKmmB,IAAI1P,GAGpCzW,KAAKsyD,QAAQ77C,GAFXw+C,CAGX,EAEA5C,UAAU7tD,UAAU2hB,IAAM,SAAS1P,GACjC,OAAOzW,KAAKsyD,QAAQl8C,eAAeK,EACrC,EAEA47C,UAAU7tD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAI3C,IAHA,IAAI/+B,EAASxe,KAAKsyD,QACdv0C,EAAO/d,KAAKuyD,MACZW,EAAWn1C,EAAKtb,OAAS,EACpBosD,EAAK,EAAGA,GAAMqE,EAAUrE,IAAM,CACrC,IAAIp4C,EAAMsH,EAAKw/B,EAAU2V,EAAWrE,EAAKA,GACzC,IAAmC,IAA/B55C,EAAGuJ,EAAO/H,GAAMA,EAAKzW,MACvB,OAAO6uD,EAAK,CAEhB,CACA,OAAOA,CACT,EAEAwD,UAAU7tD,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC9C,IAAI/+B,EAASxe,KAAKsyD,QACdv0C,EAAO/d,KAAKuyD,MACZW,EAAWn1C,EAAKtb,OAAS,EACzBosD,EAAK,EACT,OAAO,IAAIkB,UAAS,WAClB,IAAIt5C,EAAMsH,EAAKw/B,EAAU2V,EAAWrE,EAAKA,GACzC,OAAOA,IAAOqE,EACZ9C,eACAJ,cAAcvpD,EAAMgQ,EAAK+H,EAAO/H,GACpC,GACF,EAEF47C,UAAU7tD,UAAUqpD,IAAuB,EAG3CvB,YAAYkG,YAAaxF,YAMvBwF,YAAYhuD,UAAUitD,kBAAoB,SAASx8C,EAAIsoC,GACrD,GAAIA,EACF,OAAOv9C,KAAKuxD,cAAcvC,UAAU/5C,EAAIsoC,GAE1C,IACIn1B,EAAWP,YADA7nB,KAAKyyD,WAEhBlR,EAAa,EACjB,GAAIgP,WAAWnoC,GAEb,IADA,IAAIG,IACKA,EAAOH,EAASE,QAAQjK,OACY,IAAvCpJ,EAAGsT,EAAKzjB,MAAOy8C,IAAcvhD,QAKrC,OAAOuhD,CACT,EAEAiR,YAAYhuD,UAAU4uD,mBAAqB,SAAS3sD,EAAM82C,GACxD,GAAIA,EACF,OAAOv9C,KAAKuxD,cAAcK,WAAWnrD,EAAM82C,GAE7C,IACIn1B,EAAWP,YADA7nB,KAAKyyD,WAEpB,IAAKlC,WAAWnoC,GACd,OAAO,IAAI2nC,SAASK,cAEtB,IAAI7O,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,OAAOC,EAAKlK,KAAOkK,EAAOynC,cAAcvpD,EAAM86C,IAAch5B,EAAKzjB,MACnE,GACF,EAIFwnD,YAAYoG,YAAa1F,YAMvB0F,YAAYluD,UAAUitD,kBAAoB,SAASx8C,EAAIsoC,GACrD,GAAIA,EACF,OAAOv9C,KAAKuxD,cAAcvC,UAAU/5C,EAAIsoC,GAK1C,IAHA,IAQIh1B,EARAH,EAAWpoB,KAAK2yD,UAChBM,EAAQjzD,KAAK4yD,eACbrR,EAAa,EACVA,EAAa0R,EAAMxwD,QACxB,IAAkD,IAA9CwS,EAAGg+C,EAAM1R,GAAaA,IAAcvhD,MACtC,OAAOuhD,EAIX,OAASh5B,EAAOH,EAASE,QAAQjK,MAAM,CACrC,IAAInW,EAAMqgB,EAAKzjB,MAEf,GADAmuD,EAAM1R,GAAcr5C,GACgB,IAAhC+M,EAAG/M,EAAKq5C,IAAcvhD,MACxB,KAEJ,CACA,OAAOuhD,CACT,EAEAmR,YAAYluD,UAAU4uD,mBAAqB,SAAS3sD,EAAM82C,GACxD,GAAIA,EACF,OAAOv9C,KAAKuxD,cAAcK,WAAWnrD,EAAM82C,GAE7C,IAAIn1B,EAAWpoB,KAAK2yD,UAChBM,EAAQjzD,KAAK4yD,eACbrR,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,GAAIxO,GAAc0R,EAAMxwD,OAAQ,CAC9B,IAAI8lB,EAAOH,EAASE,OACpB,GAAIC,EAAKlK,KACP,OAAOkK,EAET0qC,EAAM1R,GAAch5B,EAAKzjB,KAC3B,CACA,OAAOkrD,cAAcvpD,EAAM86C,EAAY0R,EAAM1R,KAC/C,GACF,EAoQF+K,YAAYgI,OAAQtH,YAgBlBsH,OAAO9vD,UAAUwC,SAAW,WAC1B,OAAkB,IAAdhH,KAAK8G,KACA,YAEF,YAAc9G,KAAKw0D,OAAS,IAAMx0D,KAAK8G,KAAO,UACvD,EAEAwtD,OAAO9vD,UAAUmH,IAAM,SAASmL,EAAOm+C,GACrC,OAAOj1D,KAAKmmB,IAAIrP,GAAS9W,KAAKw0D,OAASS,CACzC,EAEAX,OAAO9vD,UAAU4I,SAAW,SAAS8nD,GACnC,OAAOrB,GAAG7zD,KAAKw0D,OAAQU,EACzB,EAEAZ,OAAO9vD,UAAUa,MAAQ,SAASovC,EAAOlxC,GACvC,IAAIuD,EAAO9G,KAAK8G,KAChB,OAAOsoD,WAAW3a,EAAOlxC,EAAKuD,GAAQ9G,KACpC,IAAIs0D,OAAOt0D,KAAKw0D,OAAQjF,WAAWhsD,EAAKuD,GAAQuoD,aAAa5a,EAAO3tC,GACxE,EAEAwtD,OAAO9vD,UAAU+4C,QAAU,WACzB,OAAOv9C,IACT,EAEAs0D,OAAO9vD,UAAUrD,QAAU,SAAS+zD,GAClC,OAAIrB,GAAG7zD,KAAKw0D,OAAQU,GACX,GAED,CACV,EAEAZ,OAAO9vD,UAAU8D,YAAc,SAAS4sD,GACtC,OAAIrB,GAAG7zD,KAAKw0D,OAAQU,GACXl1D,KAAK8G,MAEN,CACV,EAEAwtD,OAAO9vD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GACxC,IAAK,IAAIsR,EAAK,EAAGA,EAAK7uD,KAAK8G,KAAM+nD,IAC/B,IAAkC,IAA9B55C,EAAGjV,KAAKw0D,OAAQ3F,EAAI7uD,MACtB,OAAO6uD,EAAK,EAGhB,OAAOA,CACT,EAEAyF,OAAO9vD,UAAUotD,WAAa,SAASnrD,EAAM82C,GAAU,IAAI4X,EAASn1D,KAC9D6uD,EAAK,EACT,OAAO,IAAIkB,UAAS,WACjB,OAAOlB,EAAKsG,EAAOruD,KAAOkpD,cAAcvpD,EAAMooD,IAAMsG,EAAOX,QAAUpE,cAAc,GAExF,EAEAkE,OAAO9vD,UAAUoI,OAAS,SAASwoD,GACjC,OAAOA,aAAiBd,OACtBT,GAAG7zD,KAAKw0D,OAAQY,EAAMZ,QACtBR,UAAUoB,EACd,EASF9I,YAAYoI,MAAO1H,YA2BjB0H,MAAMlwD,UAAUwC,SAAW,WACzB,OAAkB,IAAdhH,KAAK8G,KACA,WAEF,WACL9G,KAAK20D,OAAS,MAAQ30D,KAAK40D,MACX,IAAf50D,KAAK60D,MAAc,OAAS70D,KAAK60D,MAAQ,IAC5C,IACF,EAEAH,MAAMlwD,UAAUmH,IAAM,SAASmL,EAAOm+C,GACpC,OAAOj1D,KAAKmmB,IAAIrP,GACd9W,KAAK20D,OAASzF,UAAUlvD,KAAM8W,GAAS9W,KAAK60D,MAC5CI,CACJ,EAEAP,MAAMlwD,UAAU4I,SAAW,SAAS8nD,GAClC,IAAIG,GAAiBH,EAAcl1D,KAAK20D,QAAU30D,KAAK60D,MACvD,OAAOQ,GAAiB,GACtBA,EAAgBr1D,KAAK8G,MACrBuuD,IAAkBlrD,KAAK6J,MAAMqhD,EACjC,EAEAX,MAAMlwD,UAAUa,MAAQ,SAASovC,EAAOlxC,GACtC,OAAI6rD,WAAW3a,EAAOlxC,EAAKvD,KAAK8G,MACvB9G,MAETy0C,EAAQ4a,aAAa5a,EAAOz0C,KAAK8G,OACjCvD,EAAMgsD,WAAWhsD,EAAKvD,KAAK8G,QAChB2tC,EACF,IAAIigB,MAAM,EAAG,GAEf,IAAIA,MAAM10D,KAAK2L,IAAI8oC,EAAOz0C,KAAK40D,MAAO50D,KAAK2L,IAAIpI,EAAKvD,KAAK40D,MAAO50D,KAAK60D,OAC9E,EAEAH,MAAMlwD,UAAUrD,QAAU,SAAS+zD,GACjC,IAAII,EAAcJ,EAAcl1D,KAAK20D,OACrC,GAAIW,EAAct1D,KAAK60D,OAAU,EAAG,CAClC,IAAI/9C,EAAQw+C,EAAct1D,KAAK60D,MAC/B,GAAI/9C,GAAS,GAAKA,EAAQ9W,KAAK8G,KAC7B,OAAOgQ,CAEX,CACA,OAAQ,CACV,EAEA49C,MAAMlwD,UAAU8D,YAAc,SAAS4sD,GACrC,OAAOl1D,KAAKmB,QAAQ+zD,EACtB,EAEAR,MAAMlwD,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAIvC,IAHA,IAAI2V,EAAWlzD,KAAK8G,KAAO,EACvByhB,EAAOvoB,KAAK60D,MACZ/vD,EAAQy4C,EAAUv9C,KAAK20D,OAASzB,EAAW3qC,EAAOvoB,KAAK20D,OAClD9F,EAAK,EAAGA,GAAMqE,EAAUrE,IAAM,CACrC,IAA4B,IAAxB55C,EAAGnQ,EAAO+pD,EAAI7uD,MAChB,OAAO6uD,EAAK,EAEd/pD,GAASy4C,GAAWh1B,EAAOA,CAC7B,CACA,OAAOsmC,CACT,EAEA6F,MAAMlwD,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC1C,IAAI2V,EAAWlzD,KAAK8G,KAAO,EACvByhB,EAAOvoB,KAAK60D,MACZ/vD,EAAQy4C,EAAUv9C,KAAK20D,OAASzB,EAAW3qC,EAAOvoB,KAAK20D,OACvD9F,EAAK,EACT,OAAO,IAAIkB,UAAS,WAClB,IAAIG,EAAIprD,EAER,OADAA,GAASy4C,GAAWh1B,EAAOA,EACpBsmC,EAAKqE,EAAW9C,eAAiBJ,cAAcvpD,EAAMooD,IAAMqB,EACpE,GACF,EAEAwE,MAAMlwD,UAAUoI,OAAS,SAASwoD,GAChC,OAAOA,aAAiBV,MACtB10D,KAAK20D,SAAWS,EAAMT,QACtB30D,KAAK40D,OAASQ,EAAMR,MACpB50D,KAAK60D,QAAUO,EAAMP,MACrBb,UAAUh0D,KAAMo1D,EACpB,EAKF9I,YAAY/3B,WAAYlK,UAMxBiiC,YAAYwI,gBAAiBvgC,YAE7B+3B,YAAYyI,kBAAmBxgC,YAE/B+3B,YAAY0I,cAAezgC,YAG3BA,WAAWu5B,MAAQgH,gBACnBvgC,WAAWw5B,QAAUgH,kBACrBxgC,WAAWmb,IAAMslB,cAEjB,IAAIO,GACmB,mBAAdprD,KAAKorD,OAAqD,IAA9BprD,KAAKorD,KAAK,WAAY,GACzDprD,KAAKorD,KACL,SAASA,KAAKtpD,EAAG/F,GAGf,IAAI8D,EAAQ,OAFZiC,GAAQ,GAGJggD,EAAQ,OAFZ/lD,GAAQ,GAIR,OAAQ8D,EAAIiiD,IAAShgD,IAAM,IAAMggD,EAAIjiD,GAAK9D,IAAM,KAAQ,KAAQ,GAAK,CACvE,EAMF,SAASsvD,IAAIC,GACX,OAASA,IAAQ,EAAK,WAAqB,WAANA,CACvC,CAEA,SAASC,KAAKC,GACZ,IAAU,IAANA,SAAeA,EACjB,OAAO,EAET,GAAyB,mBAAdA,EAAE1vD,WAED,KADV0vD,EAAIA,EAAE1vD,YACF0vD,MAAeA,GACjB,OAAO,EAGX,IAAU,IAANA,EACF,OAAO,EAET,IAAIlvD,SAAckvD,EAClB,GAAa,WAATlvD,EAAmB,CACrB,GAAIkvD,GAAMA,GAAKA,IAAMnhD,IACnB,OAAO,EAET,IAAIohD,EAAQ,EAAJD,EAIR,IAHIC,IAAMD,IACRC,GAAS,WAAJD,GAEAA,EAAI,YAETC,GADAD,GAAK,WAGP,OAAOH,IAAII,EACb,CACA,GAAa,WAATnvD,EACF,OAAOkvD,EAAElzD,OAASozD,GAA+BC,iBAAiBH,GAAKI,WAAWJ,GAEpF,GAA0B,mBAAfA,EAAEK,SACX,OAAOL,EAAEK,WAEX,GAAa,WAATvvD,EACF,OAAOwvD,UAAUN,GAEnB,GAA0B,mBAAfA,EAAE3uD,SACX,OAAO+uD,WAAWJ,EAAE3uD,YAEtB,MAAM,IAAI3D,MAAM,cAAgBoD,EAAO,qBACzC,CAEA,SAASqvD,iBAAiB9wD,GACxB,IAAI0wD,EAAOQ,GAAgBlxD,GAU3B,YATauB,IAATmvD,IACFA,EAAOK,WAAW/wD,GACdmxD,KAA2BC,KAC7BD,GAAyB,EACzBD,GAAkB,CAAC,GAErBC,KACAD,GAAgBlxD,GAAU0wD,GAErBA,CACT,CAGA,SAASK,WAAW/wD,GAQlB,IADA,IAAI0wD,EAAO,EACF7G,EAAK,EAAGA,EAAK7pD,EAAOvC,OAAQosD,IACnC6G,EAAO,GAAKA,EAAO1wD,EAAO1C,WAAWusD,GAAM,EAE7C,OAAO2G,IAAIE,EACb,CAEA,SAASO,UAAU7vD,GACjB,IAAIsvD,EACJ,GAAIW,SAEW9vD,KADbmvD,EAAOY,GAAQ3qD,IAAIvF,IAEjB,OAAOsvD,EAKX,QAAanvD,KADbmvD,EAAOtvD,EAAImwD,KAET,OAAOb,EAGT,IAAKc,GAAmB,CAEtB,QAAajwD,KADbmvD,EAAOtvD,EAAI0f,sBAAwB1f,EAAI0f,qBAAqBywC,KAE1D,OAAOb,EAIT,QAAanvD,KADbmvD,EAAOe,cAAcrwD,IAEnB,OAAOsvD,CAEX,CAOA,GALAA,IAASgB,GACQ,WAAbA,KACFA,GAAa,GAGXL,GACFC,GAAQ/pD,IAAInG,EAAKsvD,OACZ,SAAqBnvD,IAAjBowD,KAAoD,IAAtBA,GAAavwD,GACpD,MAAM,IAAI/C,MAAM,mDACX,GAAImzD,GACTlyD,OAAOmH,eAAerF,EAAKmwD,GAAc,CACvC,YAAc,EACd,cAAgB,EAChB,UAAY,EACZ,MAASb,SAEN,QAAiCnvD,IAA7BH,EAAI0f,sBACJ1f,EAAI0f,uBAAyB1f,EAAIgN,YAAY5O,UAAUshB,qBAKhE1f,EAAI0f,qBAAuB,WACzB,OAAO9lB,KAAKoT,YAAY5O,UAAUshB,qBAAqB9a,MAAMhL,KAAMkH,UACrE,EACAd,EAAI0f,qBAAqBywC,IAAgBb,MACpC,SAAqBnvD,IAAjBH,EAAIu1B,SAOb,MAAM,IAAIt4B,MAAM,sDAFhB+C,EAAImwD,IAAgBb,CAGtB,EAEA,OAAOA,CACT,CAGA,IAAIiB,GAAeryD,OAAOqyD,aAGtBH,GAAqB,WACvB,IAEE,OADAlyD,OAAOmH,eAAe,CAAC,EAAG,IAAK,CAAC,IACzB,CACT,CAAE,MAAOH,GACP,OAAO,CACT,CACF,CAPwB,GAWxB,SAASmrD,cAAc/0B,GACrB,GAAIA,GAAQA,EAAK/F,SAAW,EAC1B,OAAQ+F,EAAK/F,UACX,KAAK,EACH,OAAO+F,EAAKk1B,SACd,KAAK,EACH,OAAOl1B,EAAKe,iBAAmBf,EAAKe,gBAAgBm0B,SAG5D,CAGA,IACIN,GADAD,GAAkC,mBAAZ5vC,QAEtB4vC,KACFC,GAAU,IAAI7vC,SAGhB,IAAIiwC,GAAa,EAEbH,GAAe,oBACG,mBAAX1yD,SACT0yD,GAAe1yD,OAAO0yD,KAGxB,IAAIV,GAA+B,GAC/BO,GAA6B,IAC7BD,GAAyB,EACzBD,GAAkB,CAAC,EAEvB,SAASW,kBAAkB/vD,GACzB2tD,UACE3tD,IAAS0N,IACT,oDAEJ,CAME,SAASg7B,IAAI1qC,GACX,OAAOA,QAAwCgyD,WAC7CC,MAAMjyD,KAAW6oD,UAAU7oD,GAASA,EACpCgyD,WAAWE,eAAc,SAAS5gC,GAChC,IAAI24B,EAAOpC,cAAc7nD,GACzB+xD,kBAAkB9H,EAAKjoD,MACvBioD,EAAK7iC,SAAQ,SAASgkC,EAAGD,GAAK,OAAO75B,EAAI7pB,IAAI0jD,EAAGC,EAAE,GACpD,GACJ,CA2KF,SAAS6G,MAAME,GACb,SAAUA,IAAYA,EAASC,IACjC,CAzLA5K,YAAY9c,IAAKslB,iBAcftlB,IAAI8hB,GAAK,WAAY,IAAI6F,EAAY9K,EAAQhkD,KAAKnB,UAAW,GAC3D,OAAO4vD,WAAWE,eAAc,SAAS5gC,GACvC,IAAK,IAAIr0B,EAAI,EAAGA,EAAIo1D,EAAU10D,OAAQV,GAAK,EAAG,CAC5C,GAAIA,EAAI,GAAKo1D,EAAU10D,OACrB,MAAM,IAAIY,MAAM,0BAA4B8zD,EAAUp1D,IAExDq0B,EAAI7pB,IAAI4qD,EAAUp1D,GAAIo1D,EAAUp1D,EAAI,GACtC,CACF,GACF,EAEAytC,IAAIhrC,UAAUwC,SAAW,WACvB,OAAOhH,KAAK6X,WAAW,QAAS,IAClC,EAIA23B,IAAIhrC,UAAUmH,IAAM,SAASskD,EAAGgF,GAC9B,OAAOj1D,KAAKo3D,MACVp3D,KAAKo3D,MAAMzrD,IAAI,OAAGpF,EAAW0pD,EAAGgF,GAChCA,CACJ,EAIAzlB,IAAIhrC,UAAU+H,IAAM,SAAS0jD,EAAGC,GAC9B,OAAOmH,UAAUr3D,KAAMiwD,EAAGC,EAC5B,EAEA1gB,IAAIhrC,UAAU8yD,MAAQ,SAASC,EAASrH,GACtC,OAAOlwD,KAAKw3D,SAASD,EAASnJ,GAAS,WAAa,OAAO8B,CAAC,GAC9D,EAEA1gB,IAAIhrC,UAAUo9B,OAAS,SAASquB,GAC9B,OAAOoH,UAAUr3D,KAAMiwD,EAAG7B,EAC5B,EAEA5e,IAAIhrC,UAAUizD,SAAW,SAASF,GAChC,OAAOv3D,KAAKw3D,SAASD,GAAS,WAAa,OAAOnJ,CAAO,GAC3D,EAEA5e,IAAIhrC,UAAUkzD,OAAS,SAASzH,EAAGgF,EAAa0C,GAC9C,OAA4B,IAArBzwD,UAAUzE,OACfwtD,EAAEjwD,MACFA,KAAKw3D,SAAS,CAACvH,GAAIgF,EAAa0C,EACpC,EAEAnoB,IAAIhrC,UAAUgzD,SAAW,SAASD,EAAStC,EAAa0C,GACjDA,IACHA,EAAU1C,EACVA,OAAc1uD,GAEhB,IAAIqxD,EAAeC,gBACjB73D,KACA83D,cAAcP,GACdtC,EACA0C,GAEF,OAAOC,IAAiBxJ,OAAU7nD,EAAYqxD,CAChD,EAEApoB,IAAIhrC,UAAUqtC,MAAQ,WACpB,OAAkB,IAAd7xC,KAAK8G,KACA9G,KAELA,KAAK+3D,WACP/3D,KAAK8G,KAAO,EACZ9G,KAAKo3D,MAAQ,KACbp3D,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEF82D,UACT,EAIAtnB,IAAIhrC,UAAUyzD,MAAQ,WACpB,OAAOC,iBAAiBl4D,UAAMuG,EAAWW,UAC3C,EAEAsoC,IAAIhrC,UAAU2zD,UAAY,SAASC,GACjC,OAAOF,iBAAiBl4D,KAAMo4D,EADwB/L,EAAQhkD,KAAKnB,UAAW,GAEhF,EAEAsoC,IAAIhrC,UAAU6zD,QAAU,SAASd,GAAU,IAAIe,EAAQjM,EAAQhkD,KAAKnB,UAAW,GAC7E,OAAOlH,KAAKw3D,SACVD,EACAT,YACA,SAAS9uD,GAAK,MAA0B,mBAAZA,EAAEiwD,MAC5BjwD,EAAEiwD,MAAMjtD,MAAMhD,EAAGswD,GACjBA,EAAMA,EAAM71D,OAAS,EAAE,GAE7B,EAEA+sC,IAAIhrC,UAAU+zD,UAAY,WACxB,OAAOL,iBAAiBl4D,KAAMw4D,WAAYtxD,UAC5C,EAEAsoC,IAAIhrC,UAAUi0D,cAAgB,SAASL,GAAS,IAAIE,EAAQjM,EAAQhkD,KAAKnB,UAAW,GAClF,OAAOgxD,iBAAiBl4D,KAAM04D,eAAeN,GAASE,EACxD,EAEA9oB,IAAIhrC,UAAUm0D,YAAc,SAASpB,GAAU,IAAIe,EAAQjM,EAAQhkD,KAAKnB,UAAW,GACjF,OAAOlH,KAAKw3D,SACVD,EACAT,YACA,SAAS9uD,GAAK,MAA8B,mBAAhBA,EAAEuwD,UAC5BvwD,EAAEuwD,UAAUvtD,MAAMhD,EAAGswD,GACrBA,EAAMA,EAAM71D,OAAS,EAAE,GAE7B,EAEA+sC,IAAIhrC,UAAU49C,KAAO,SAASwW,GAE5B,OAAOC,WAAWC,YAAY94D,KAAM44D,GACtC,EAEAppB,IAAIhrC,UAAUu0D,OAAS,SAASC,EAAQJ,GAEtC,OAAOC,WAAWC,YAAY94D,KAAM44D,EAAYI,GAClD,EAIAxpB,IAAIhrC,UAAUwyD,cAAgB,SAAS/hD,GACrC,IAAIgkD,EAAUj5D,KAAKk5D,YAEnB,OADAjkD,EAAGgkD,GACIA,EAAQE,aAAeF,EAAQG,cAAcp5D,KAAK+3D,WAAa/3D,IACxE,EAEAwvC,IAAIhrC,UAAU00D,UAAY,WACxB,OAAOl5D,KAAK+3D,UAAY/3D,KAAOA,KAAKo5D,cAAc,IAAI1K,QACxD,EAEAlf,IAAIhrC,UAAU60D,YAAc,WAC1B,OAAOr5D,KAAKo5D,eACd,EAEA5pB,IAAIhrC,UAAU20D,WAAa,WACzB,OAAOn5D,KAAKg4D,SACd,EAEAxoB,IAAIhrC,UAAUotD,WAAa,SAASnrD,EAAM82C,GACxC,OAAO,IAAI+b,YAAYt5D,KAAMyG,EAAM82C,EACrC,EAEA/N,IAAIhrC,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACxDuhD,EAAa,EAKjB,OAJAvhD,KAAKo3D,OAASp3D,KAAKo3D,MAAMxkC,SAAQ,SAASugC,GAExC,OADA5R,IACOtsC,EAAGk+C,EAAM,GAAIA,EAAM,GAAIgC,EAChC,GAAG5X,GACIgE,CACT,EAEA/R,IAAIhrC,UAAU40D,cAAgB,SAASG,GACrC,OAAIA,IAAYv5D,KAAK+3D,UACZ/3D,KAEJu5D,EAKEC,QAAQx5D,KAAK8G,KAAM9G,KAAKo3D,MAAOmC,EAASv5D,KAAKi0D,SAJlDj0D,KAAK+3D,UAAYwB,EACjBv5D,KAAKg4D,WAAY,EACVh4D,KAGX,EAOFwvC,IAAIunB,MAAQA,MAEZ,IA2ZI0C,GA3ZAvC,GAAkB,wBAElBwC,GAAelqB,IAAIhrC,UAUrB,SAASm1D,aAAaJ,EAASvuC,GAC7BhrB,KAAKu5D,QAAUA,EACfv5D,KAAKgrB,QAAUA,CACjB,CA+DA,SAAS4uC,kBAAkBL,EAAS96C,EAAQo7C,GAC1C75D,KAAKu5D,QAAUA,EACfv5D,KAAKye,OAASA,EACdze,KAAK65D,MAAQA,CACf,CAiEA,SAASC,iBAAiBP,EAAS3vB,EAAOiwB,GACxC75D,KAAKu5D,QAAUA,EACfv5D,KAAK4pC,MAAQA,EACb5pC,KAAK65D,MAAQA,CACf,CAsDA,SAASE,kBAAkBR,EAASS,EAAShvC,GAC3ChrB,KAAKu5D,QAAUA,EACfv5D,KAAKg6D,QAAUA,EACfh6D,KAAKgrB,QAAUA,CACjB,CAwEA,SAASivC,UAAUV,EAASS,EAAS7G,GACnCnzD,KAAKu5D,QAAUA,EACfv5D,KAAKg6D,QAAUA,EACfh6D,KAAKmzD,MAAQA,CACf,CA+DA,SAASmG,YAAYljC,EAAK3vB,EAAM82C,GAC9Bv9C,KAAKk6D,MAAQzzD,EACbzG,KAAKm6D,SAAW5c,EAChBv9C,KAAKo6D,OAAShkC,EAAIghC,OAASiD,iBAAiBjkC,EAAIghC,MAClD,CAqCF,SAASkD,iBAAiB7zD,EAAM0sD,GAC9B,OAAOnD,cAAcvpD,EAAM0sD,EAAM,GAAIA,EAAM,GAC7C,CAEA,SAASkH,iBAAiB34B,EAAMtK,GAC9B,MAAO,CACLsK,KAAMA,EACN5qB,MAAO,EACPyjD,OAAQnjC,EAEZ,CAEA,SAASoiC,QAAQ1yD,EAAMpH,EAAM65D,EAAS7D,GACpC,IAAIt/B,EAAM9xB,OAAO6kB,OAAOuwC,IAMxB,OALAtjC,EAAItvB,KAAOA,EACXsvB,EAAIghC,MAAQ13D,EACZ02B,EAAI2hC,UAAYwB,EAChBnjC,EAAI69B,OAASyB,EACbt/B,EAAI4hC,WAAY,EACT5hC,CACT,CAGA,SAAS0gC,WACP,OAAO2C,KAAcA,GAAYD,QAAQ,GAC3C,CAEA,SAASnC,UAAUjhC,EAAK65B,EAAGC,GACzB,IAAIsK,EACAC,EACJ,GAAKrkC,EAAIghC,MAMF,CACL,IAAIsD,EAAgBnM,QAAQF,GACxBsM,EAAWpM,QAAQD,GAEvB,GADAkM,EAAUI,WAAWxkC,EAAIghC,MAAOhhC,EAAI2hC,UAAW,OAAGxxD,EAAW0pD,EAAGC,EAAGwK,EAAeC,IAC7EA,EAAS71D,MACZ,OAAOsxB,EAETqkC,EAAUrkC,EAAItvB,MAAQ4zD,EAAc51D,MAAQorD,IAAM9B,GAAW,EAAI,EAAI,EACvE,KAdgB,CACd,GAAI8B,IAAM9B,EACR,OAAOh4B,EAETqkC,EAAU,EACVD,EAAU,IAAIb,aAAavjC,EAAI2hC,UAAW,CAAC,CAAC9H,EAAGC,IACjD,CASA,OAAI95B,EAAI2hC,WACN3hC,EAAItvB,KAAO2zD,EACXrkC,EAAIghC,MAAQoD,EACZpkC,EAAI69B,YAAS1tD,EACb6vB,EAAI4hC,WAAY,EACT5hC,GAEFokC,EAAUhB,QAAQiB,EAASD,GAAW1D,UAC/C,CAEA,SAAS8D,WAAWl5B,EAAM63B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,GAC5E,OAAKj5B,EAQEA,EAAKg2B,OAAO6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,GAPjE71D,IAAUspD,EACL1sB,GAET+sB,OAAOkM,GACPlM,OAAOiM,GACA,IAAIT,UAAUV,EAASS,EAAS,CAACvjD,EAAK3R,IAGjD,CAEA,SAAS+1D,WAAWn5B,GAClB,OAAOA,EAAKtuB,cAAgB6mD,WAAav4B,EAAKtuB,cAAgB2mD,iBAChE,CAEA,SAASe,cAAcp5B,EAAM63B,EAASjuB,EAAO0uB,EAAS7G,GACpD,GAAIzxB,EAAKs4B,UAAYA,EACnB,OAAO,IAAID,kBAAkBR,EAASS,EAAS,CAACt4B,EAAKyxB,MAAOA,IAG9D,IAGI4H,EAHAC,GAAkB,IAAV1vB,EAAc5J,EAAKs4B,QAAUt4B,EAAKs4B,UAAY1uB,GAAS6iB,EAC/D8M,GAAkB,IAAV3vB,EAAc0uB,EAAUA,IAAY1uB,GAAS6iB,EAOzD,OAAO,IAAIyL,kBAAkBL,EAAU,GAAKyB,EAAS,GAAKC,EAJ9CD,IAASC,EACnB,CAACH,cAAcp5B,EAAM63B,EAASjuB,EAAQ2iB,EAAO+L,EAAS7G,KACpD4H,EAAU,IAAId,UAAUV,EAASS,EAAS7G,GAAS6H,EAAOC,EAAO,CAACv5B,EAAMq5B,GAAW,CAACA,EAASr5B,IAGnG,CAEA,SAASw5B,YAAY3B,EAASvuC,EAASvU,EAAK3R,GACrCy0D,IACHA,EAAU,IAAI7K,SAGhB,IADA,IAAIhtB,EAAO,IAAIu4B,UAAUV,EAAS7D,KAAKj/C,GAAM,CAACA,EAAK3R,IAC1C+pD,EAAK,EAAGA,EAAK7jC,EAAQvoB,OAAQosD,IAAM,CAC1C,IAAIsE,EAAQnoC,EAAQ6jC,GACpBntB,EAAOA,EAAKg2B,OAAO6B,EAAS,OAAGhzD,EAAW4sD,EAAM,GAAIA,EAAM,GAC5D,CACA,OAAOzxB,CACT,CAEA,SAASy5B,UAAU5B,EAASM,EAAOjwB,EAAOwxB,GAIxC,IAHA,IAAI38C,EAAS,EACT48C,EAAW,EACXC,EAAc,IAAIn4D,MAAMymC,GACnBilB,EAAK,EAAG0M,EAAM,EAAGn5D,EAAMy3D,EAAMp3D,OAAQosD,EAAKzsD,EAAKysD,IAAM0M,IAAQ,EAAG,CACvE,IAAI75B,EAAOm4B,EAAMhL,QACJtoD,IAATm7B,GAAsBmtB,IAAOuM,IAC/B38C,GAAU88C,EACVD,EAAYD,KAAc35B,EAE9B,CACA,OAAO,IAAIk4B,kBAAkBL,EAAS96C,EAAQ68C,EAChD,CAEA,SAASE,YAAYjC,EAASM,EAAOp7C,EAAQg9C,EAAW/5B,GAGtD,IAFA,IAAIkI,EAAQ,EACR8xB,EAAgB,IAAIv4D,MAAM+qD,GACrBW,EAAK,EAAc,IAAXpwC,EAAcowC,IAAMpwC,KAAY,EAC/Ci9C,EAAc7M,GAAe,EAATpwC,EAAao7C,EAAMjwB,UAAWrjC,EAGpD,OADAm1D,EAAcD,GAAa/5B,EACpB,IAAIo4B,iBAAiBP,EAAS3vB,EAAQ,EAAG8xB,EAClD,CAEA,SAASxD,iBAAiB9hC,EAAKgiC,EAAQuD,GAErC,IADA,IAAIrD,EAAQ,GACHzJ,EAAK,EAAGA,EAAK8M,EAAUl5D,OAAQosD,IAAM,CAC5C,IAAI/pD,EAAQ62D,EAAU9M,GAClBE,EAAOpC,cAAc7nD,GACpB2nD,WAAW3nD,KACdiqD,EAAOA,EAAK34B,KAAI,SAAS85B,GAAK,OAAOmD,OAAOnD,EAAE,KAEhDoI,EAAMx1D,KAAKisD,EACb,CACA,OAAO6M,wBAAwBxlC,EAAKgiC,EAAQE,EAC9C,CAEA,SAASE,WAAWlvB,EAAUxkC,EAAO2R,GACnC,OAAO6yB,GAAYA,EAASivB,WAAa9L,WAAW3nD,GAClDwkC,EAASivB,UAAUzzD,GACnB+uD,GAAGvqB,EAAUxkC,GAASwkC,EAAWxkC,CACrC,CAEA,SAAS4zD,eAAeN,GACtB,OAAO,SAAS9uB,EAAUxkC,EAAO2R,GAC/B,GAAI6yB,GAAYA,EAASmvB,eAAiBhM,WAAW3nD,GACnD,OAAOwkC,EAASmvB,cAAcL,EAAQtzD,GAExC,IAAI+2D,EAAYzD,EAAO9uB,EAAUxkC,EAAO2R,GACxC,OAAOo9C,GAAGvqB,EAAUuyB,GAAavyB,EAAWuyB,CAC9C,CACF,CAEA,SAASD,wBAAwBE,EAAY1D,EAAQE,GAEnD,OAAqB,KADrBA,EAAQA,EAAM9hC,QAAO,SAAStqB,GAAK,OAAkB,IAAXA,EAAEpF,IAAU,KAC5CrE,OACDq5D,EAEe,IAApBA,EAAWh1D,MAAeg1D,EAAW/D,WAA8B,IAAjBO,EAAM71D,OAGrDq5D,EAAW9E,eAAc,SAAS8E,GAUvC,IATA,IAAIC,EAAe3D,EACjB,SAAStzD,EAAO2R,GACdqlD,EAAWpE,OAAOjhD,EAAK23C,GAAS,SAAS9kB,GACtC,OAAOA,IAAa8kB,EAAUtpD,EAAQszD,EAAO9uB,EAAUxkC,EAAO2R,EAAI,GAEvE,EACA,SAAS3R,EAAO2R,GACdqlD,EAAWvvD,IAAIkK,EAAK3R,EACtB,EACO+pD,EAAK,EAAGA,EAAKyJ,EAAM71D,OAAQosD,IAClCyJ,EAAMzJ,GAAI3iC,QAAQ6vC,EAEtB,IAfSD,EAAW1oD,YAAYklD,EAAM,GAgBxC,CAEA,SAAST,gBAAgBvuB,EAAU0yB,EAAa/G,EAAa0C,GAC3D,IAAIsE,EAAW3yB,IAAa8kB,EACxB7lC,EAAOyzC,EAAY1zC,OACvB,GAAIC,EAAKlK,KAAM,CACb,IAAI69C,EAAgBD,EAAWhH,EAAc3rB,EACzC6yB,EAAWxE,EAAQuE,GACvB,OAAOC,IAAaD,EAAgB5yB,EAAW6yB,CACjD,CACA1H,UACEwH,GAAa3yB,GAAYA,EAAS/8B,IAClC,mBAEF,IAAIkK,EAAM8R,EAAKzjB,MACXs3D,EAAeH,EAAW7N,EAAU9kB,EAAS39B,IAAI8K,EAAK23C,GACtDiO,EAAcxE,gBAChBuE,EACAJ,EACA/G,EACA0C,GAEF,OAAO0E,IAAgBD,EAAe9yB,EACpC+yB,IAAgBjO,EAAU9kB,EAAS1H,OAAOnrB,IACzCwlD,EAAWnF,WAAaxtB,GAAU/8B,IAAIkK,EAAK4lD,EAChD,CAEA,SAASC,SAASpwD,GAMhB,OAHAA,GADAA,GAAS,WADTA,GAAUA,GAAK,EAAK,cACKA,GAAK,EAAK,aACzBA,GAAK,GAAM,UACrBA,GAASA,GAAK,EAEH,KADXA,GAASA,GAAK,GAEhB,CAEA,SAASorD,MAAMvwD,EAAOw1D,EAAKr0D,EAAKs0D,GAC9B,IAAIC,EAAWD,EAAUz1D,EAAQ4nD,QAAQ5nD,GAEzC,OADA01D,EAASF,GAAOr0D,EACTu0D,CACT,CAEA,SAASC,SAAS31D,EAAOw1D,EAAKr0D,EAAKs0D,GACjC,IAAIG,EAAS51D,EAAMtE,OAAS,EAC5B,GAAI+5D,GAAWD,EAAM,IAAMI,EAEzB,OADA51D,EAAMw1D,GAAOr0D,EACNnB,EAIT,IAFA,IAAI01D,EAAW,IAAIt5D,MAAMw5D,GACrB3V,EAAQ,EACH6H,EAAK,EAAGA,EAAK8N,EAAQ9N,IACxBA,IAAO0N,GACTE,EAAS5N,GAAM3mD,EACf8+C,GAAS,GAETyV,EAAS5N,GAAM9nD,EAAM8nD,EAAK7H,GAG9B,OAAOyV,CACT,CAEA,SAASG,UAAU71D,EAAOw1D,EAAKC,GAC7B,IAAIG,EAAS51D,EAAMtE,OAAS,EAC5B,GAAI+5D,GAAWD,IAAQI,EAErB,OADA51D,EAAMgxB,MACChxB,EAIT,IAFA,IAAI01D,EAAW,IAAIt5D,MAAMw5D,GACrB3V,EAAQ,EACH6H,EAAK,EAAGA,EAAK8N,EAAQ9N,IACxBA,IAAO0N,IACTvV,EAAQ,GAEVyV,EAAS5N,GAAM9nD,EAAM8nD,EAAK7H,GAE5B,OAAOyV,CACT,CA5nBA/C,GAAaxC,KAAmB,EAChCwC,GAAa1L,GAAU0L,GAAa93B,OACpC83B,GAAamD,SAAWnD,GAAajC,SAYnCkC,aAAan1D,UAAUmH,IAAM,SAAS2/B,EAAO0uB,EAASvjD,EAAKw+C,GAEzD,IADA,IAAIjqC,EAAUhrB,KAAKgrB,QACV6jC,EAAK,EAAGzsD,EAAM4oB,EAAQvoB,OAAQosD,EAAKzsD,EAAKysD,IAC/C,GAAIgF,GAAGp9C,EAAKuU,EAAQ6jC,GAAI,IACtB,OAAO7jC,EAAQ6jC,GAAI,GAGvB,OAAOoG,CACT,EAEA0E,aAAan1D,UAAUkzD,OAAS,SAAS6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,GAK3F,IAJA,IAAIj/B,EAAU52B,IAAUspD,EAEpBpjC,EAAUhrB,KAAKgrB,QACfuxC,EAAM,EACDn6D,EAAM4oB,EAAQvoB,OAAQ85D,EAAMn6D,IAC/ByxD,GAAGp9C,EAAKuU,EAAQuxC,GAAK,IADeA,KAK1C,IAAIO,EAASP,EAAMn6D,EAEnB,GAAI06D,EAAS9xC,EAAQuxC,GAAK,KAAOz3D,EAAQ42B,EACvC,OAAO17B,KAMT,GAHAyuD,OAAOkM,IACNj/B,IAAYohC,IAAWrO,OAAOiM,IAE3Bh/B,GAA8B,IAAnB1Q,EAAQvoB,OAAvB,CAIA,IAAKq6D,IAAWphC,GAAW1Q,EAAQvoB,QAAUs6D,GAC3C,OAAO7B,YAAY3B,EAASvuC,EAASvU,EAAK3R,GAG5C,IAAIk4D,GAAazD,GAAWA,IAAYv5D,KAAKu5D,QACzC0D,GAAaD,GAAahyC,EAAU2jC,QAAQ3jC,GAYhD,OAVI8xC,EACEphC,EACF6gC,IAAQn6D,EAAM,EAAI66D,GAAWllC,MAASklC,GAAWV,GAAOU,GAAWllC,MAEnEklC,GAAWV,GAAO,CAAC9lD,EAAK3R,GAG1Bm4D,GAAWn6D,KAAK,CAAC2T,EAAK3R,IAGpBk4D,IACFh9D,KAAKgrB,QAAUiyC,GACRj9D,MAGF,IAAI25D,aAAaJ,EAAS0D,GAxBjC,CAyBF,EAWArD,kBAAkBp1D,UAAUmH,IAAM,SAAS2/B,EAAO0uB,EAASvjD,EAAKw+C,QAC9C1uD,IAAZyzD,IACFA,EAAUtE,KAAKj/C,IAEjB,IAAI8kD,EAAO,KAAiB,IAAVjwB,EAAc0uB,EAAUA,IAAY1uB,GAAS6iB,GAC3D1vC,EAASze,KAAKye,OAClB,OAA0B,IAAlBA,EAAS88C,GAAatG,EAC5Bj1D,KAAK65D,MAAMyC,SAAS79C,EAAU88C,EAAM,IAAK5vD,IAAI2/B,EAAQ2iB,EAAO+L,EAASvjD,EAAKw+C,EAC9E,EAEA2E,kBAAkBp1D,UAAUkzD,OAAS,SAAS6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,QAChFp0D,IAAZyzD,IACFA,EAAUtE,KAAKj/C,IAEjB,IAAIymD,GAAyB,IAAV5xB,EAAc0uB,EAAUA,IAAY1uB,GAAS6iB,EAC5DoN,EAAM,GAAK2B,EACXz+C,EAASze,KAAKye,OACdq+C,GAA4B,IAAlBr+C,EAAS88C,GAEvB,IAAKuB,IAAUh4D,IAAUspD,EACvB,OAAOpuD,KAGT,IAAIu8D,GAAMD,SAAS79C,EAAU88C,EAAM,GAC/B1B,GAAQ75D,KAAK65D,MACbn4B,GAAOo7B,GAASjD,GAAM0C,SAAOh2D,EAC7Bw0D,GAAUH,WAAWl5B,GAAM63B,EAASjuB,EAAQ2iB,EAAO+L,EAASvjD,EAAK3R,EAAO41D,EAAeC,GAE3F,GAAII,KAAYr5B,GACd,OAAO1hC,KAGT,IAAK88D,IAAU/B,IAAWlB,GAAMp3D,QAAU06D,GACxC,OAAO3B,YAAYjC,EAASM,GAAOp7C,EAAQy+C,EAAanC,IAG1D,GAAI+B,KAAW/B,IAA4B,IAAjBlB,GAAMp3D,QAAgBo4D,WAAWhB,GAAY,EAAN0C,KAC/D,OAAO1C,GAAY,EAAN0C,IAGf,GAAIO,IAAU/B,IAA4B,IAAjBlB,GAAMp3D,QAAgBo4D,WAAWE,IACxD,OAAOA,GAGT,IAAIiC,GAAazD,GAAWA,IAAYv5D,KAAKu5D,QACzC6D,GAAYN,GAAS/B,GAAUt8C,EAASA,EAAS88C,EAAM98C,EAAS88C,EAChE8B,GAAWP,GAAS/B,GACtBzD,MAAMuC,GAAO0C,GAAKxB,GAASiC,IAC3BJ,UAAU/C,GAAO0C,GAAKS,IACtBN,SAAS7C,GAAO0C,GAAKxB,GAASiC,IAEhC,OAAIA,IACFh9D,KAAKye,OAAS2+C,GACdp9D,KAAK65D,MAAQwD,GACNr9D,MAGF,IAAI45D,kBAAkBL,EAAS6D,GAAWC,GACnD,EAWAvD,iBAAiBt1D,UAAUmH,IAAM,SAAS2/B,EAAO0uB,EAASvjD,EAAKw+C,QAC7C1uD,IAAZyzD,IACFA,EAAUtE,KAAKj/C,IAEjB,IAAI8lD,GAAiB,IAAVjxB,EAAc0uB,EAAUA,IAAY1uB,GAAS6iB,EACpDzsB,EAAO1hC,KAAK65D,MAAM0C,GACtB,OAAO76B,EAAOA,EAAK/1B,IAAI2/B,EAAQ2iB,EAAO+L,EAASvjD,EAAKw+C,GAAeA,CACrE,EAEA6E,iBAAiBt1D,UAAUkzD,OAAS,SAAS6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,QAC/Ep0D,IAAZyzD,IACFA,EAAUtE,KAAKj/C,IAEjB,IAAI8lD,GAAiB,IAAVjxB,EAAc0uB,EAAUA,IAAY1uB,GAAS6iB,EACpDzyB,EAAU52B,IAAUspD,EACpByL,EAAQ75D,KAAK65D,MACbn4B,GAAOm4B,EAAM0C,GAEjB,GAAI7gC,IAAYgG,GACd,OAAO1hC,KAGT,IAAI+6D,GAAUH,WAAWl5B,GAAM63B,EAASjuB,EAAQ2iB,EAAO+L,EAASvjD,EAAK3R,EAAO41D,EAAeC,GAC3F,GAAII,KAAYr5B,GACd,OAAO1hC,KAGT,IAAIs9D,GAAWt9D,KAAK4pC,MACpB,GAAKlI,IAEE,IAAKq5B,MACVuC,GACeC,GACb,OAAOpC,UAAU5B,EAASM,EAAOyD,GAAUf,QAJ7Ce,KAQF,IAAIN,GAAazD,GAAWA,IAAYv5D,KAAKu5D,QACzC8D,GAAW/F,MAAMuC,EAAO0C,EAAKxB,GAASiC,IAE1C,OAAIA,IACFh9D,KAAK4pC,MAAQ0zB,GACbt9D,KAAK65D,MAAQwD,GACNr9D,MAGF,IAAI85D,iBAAiBP,EAAS+D,GAAUD,GACjD,EAWAtD,kBAAkBv1D,UAAUmH,IAAM,SAAS2/B,EAAO0uB,EAASvjD,EAAKw+C,GAE9D,IADA,IAAIjqC,EAAUhrB,KAAKgrB,QACV6jC,EAAK,EAAGzsD,EAAM4oB,EAAQvoB,OAAQosD,EAAKzsD,EAAKysD,IAC/C,GAAIgF,GAAGp9C,EAAKuU,EAAQ6jC,GAAI,IACtB,OAAO7jC,EAAQ6jC,GAAI,GAGvB,OAAOoG,CACT,EAEA8E,kBAAkBv1D,UAAUkzD,OAAS,SAAS6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,QAChFp0D,IAAZyzD,IACFA,EAAUtE,KAAKj/C,IAGjB,IAAIilB,EAAU52B,IAAUspD,EAExB,GAAI4L,IAAYh6D,KAAKg6D,QACnB,OAAIt+B,EACK17B,MAETyuD,OAAOkM,GACPlM,OAAOiM,GACAI,cAAc96D,KAAMu5D,EAASjuB,EAAO0uB,EAAS,CAACvjD,EAAK3R,KAK5D,IAFA,IAAIkmB,EAAUhrB,KAAKgrB,QACfuxC,EAAM,EACDn6D,EAAM4oB,EAAQvoB,OAAQ85D,EAAMn6D,IAC/ByxD,GAAGp9C,EAAKuU,EAAQuxC,GAAK,IADeA,KAK1C,IAAIO,EAASP,EAAMn6D,EAEnB,GAAI06D,EAAS9xC,EAAQuxC,GAAK,KAAOz3D,EAAQ42B,EACvC,OAAO17B,KAMT,GAHAyuD,OAAOkM,IACNj/B,IAAYohC,IAAWrO,OAAOiM,GAE3Bh/B,GAAmB,IAARt5B,EACb,OAAO,IAAI63D,UAAUV,EAASv5D,KAAKg6D,QAAShvC,EAAc,EAANuxC,IAGtD,IAAIS,GAAazD,GAAWA,IAAYv5D,KAAKu5D,QACzC0D,GAAaD,GAAahyC,EAAU2jC,QAAQ3jC,GAYhD,OAVI8xC,EACEphC,EACF6gC,IAAQn6D,EAAM,EAAI66D,GAAWllC,MAASklC,GAAWV,GAAOU,GAAWllC,MAEnEklC,GAAWV,GAAO,CAAC9lD,EAAK3R,GAG1Bm4D,GAAWn6D,KAAK,CAAC2T,EAAK3R,IAGpBk4D,IACFh9D,KAAKgrB,QAAUiyC,GACRj9D,MAGF,IAAI+5D,kBAAkBR,EAASv5D,KAAKg6D,QAASiD,GACtD,EAWAhD,UAAUz1D,UAAUmH,IAAM,SAAS2/B,EAAO0uB,EAASvjD,EAAKw+C,GACtD,OAAOpB,GAAGp9C,EAAKzW,KAAKmzD,MAAM,IAAMnzD,KAAKmzD,MAAM,GAAK8B,CAClD,EAEAgF,UAAUz1D,UAAUkzD,OAAS,SAAS6B,EAASjuB,EAAO0uB,EAASvjD,EAAK3R,EAAO41D,EAAeC,GACxF,IAAIj/B,EAAU52B,IAAUspD,EACpBoP,EAAW3J,GAAGp9C,EAAKzW,KAAKmzD,MAAM,IAClC,OAAIqK,EAAW14D,IAAU9E,KAAKmzD,MAAM,GAAKz3B,GAChC17B,MAGTyuD,OAAOkM,GAEHj/B,OACF+yB,OAAOiM,GAIL8C,EACEjE,GAAWA,IAAYv5D,KAAKu5D,SAC9Bv5D,KAAKmzD,MAAM,GAAKruD,EACT9E,MAEF,IAAIi6D,UAAUV,EAASv5D,KAAKg6D,QAAS,CAACvjD,EAAK3R,KAGpD2pD,OAAOiM,GACAI,cAAc96D,KAAMu5D,EAASjuB,EAAOoqB,KAAKj/C,GAAM,CAACA,EAAK3R,KAC9D,EAMF60D,aAAan1D,UAAUouB,QACvBmnC,kBAAkBv1D,UAAUouB,QAAU,SAAU3d,EAAIsoC,GAElD,IADA,IAAIvyB,EAAUhrB,KAAKgrB,QACV6jC,EAAK,EAAGqE,EAAWloC,EAAQvoB,OAAS,EAAGosD,GAAMqE,EAAUrE,IAC9D,IAAkD,IAA9C55C,EAAG+V,EAAQuyB,EAAU2V,EAAWrE,EAAKA,IACvC,OAAO,CAGb,EAEA+K,kBAAkBp1D,UAAUouB,QAC5BknC,iBAAiBt1D,UAAUouB,QAAU,SAAU3d,EAAIsoC,GAEjD,IADA,IAAIsc,EAAQ75D,KAAK65D,MACRhL,EAAK,EAAGqE,EAAW2G,EAAMp3D,OAAS,EAAGosD,GAAMqE,EAAUrE,IAAM,CAClE,IAAIntB,EAAOm4B,EAAMtc,EAAU2V,EAAWrE,EAAKA,GAC3C,GAAIntB,IAAsC,IAA9BA,EAAK9O,QAAQ3d,EAAIsoC,GAC3B,OAAO,CAEX,CACF,EAEA0c,UAAUz1D,UAAUouB,QAAU,SAAU3d,EAAIsoC,GAC1C,OAAOtoC,EAAGjV,KAAKmzD,MACjB,EAEA7G,YAAYgN,YAAavJ,UAQvBuJ,YAAY90D,UAAU8jB,KAAO,WAG3B,IAFA,IAAI7hB,EAAOzG,KAAKk6D,MACZzmD,EAAQzT,KAAKo6D,OACV3mD,GAAO,CACZ,IAEIy/C,EAFAxxB,EAAOjuB,EAAMiuB,KACb5qB,EAAQrD,EAAMqD,QAElB,GAAI4qB,EAAKyxB,OACP,GAAc,IAAVr8C,EACF,OAAOwjD,iBAAiB7zD,EAAMi7B,EAAKyxB,YAEhC,GAAIzxB,EAAK1W,SAEd,GAAIlU,IADJo8C,EAAWxxB,EAAK1W,QAAQvoB,OAAS,GAE/B,OAAO63D,iBAAiB7zD,EAAMi7B,EAAK1W,QAAQhrB,KAAKm6D,SAAWjH,EAAWp8C,EAAQA,SAIhF,GAAIA,IADJo8C,EAAWxxB,EAAKm4B,MAAMp3D,OAAS,GACR,CACrB,IAAIg7D,EAAU/7B,EAAKm4B,MAAM75D,KAAKm6D,SAAWjH,EAAWp8C,EAAQA,GAC5D,GAAI2mD,EAAS,CACX,GAAIA,EAAQtK,MACV,OAAOmH,iBAAiB7zD,EAAMg3D,EAAQtK,OAExC1/C,EAAQzT,KAAKo6D,OAASC,iBAAiBoD,EAAShqD,EAClD,CACA,QACF,CAEFA,EAAQzT,KAAKo6D,OAASp6D,KAAKo6D,OAAOG,MACpC,CACA,OAAOnK,cACT,EA+PF,IAAI2M,GAAqB7O,EAAO,EAC5BiP,GAA0BjP,EAAO,EACjCqP,GAA0BrP,EAAO,EAMnC,SAASwP,KAAK54D,GACZ,IAAI64D,EAAQC,YACZ,GAAI94D,QACF,OAAO64D,EAET,GAAIE,OAAO/4D,GACT,OAAOA,EAET,IAAIiqD,EAAOjC,gBAAgBhoD,GACvBgC,EAAOioD,EAAKjoD,KAChB,OAAa,IAATA,EACK62D,GAET9G,kBAAkB/vD,GACdA,EAAO,GAAKA,EAAOonD,EACd4P,SAAS,EAAGh3D,EAAMmnD,EAAO,KAAM,IAAI8P,MAAMhP,EAAK2C,YAEhDiM,EAAM3G,eAAc,SAAS3qD,GAClCA,EAAK2xD,QAAQl3D,GACbioD,EAAK7iC,SAAQ,SAASgkC,EAAGnuD,GAAK,OAAOsK,EAAKE,IAAIxK,EAAGmuD,EAAE,GACrD,IACF,CA0JF,SAAS2N,OAAOI,GACd,SAAUA,IAAaA,EAAUC,IACnC,CArLA5R,YAAYoR,KAAM3I,mBA2BhB2I,KAAKpM,GAAK,WACR,OAAOtxD,KAAKkH,UACd,EAEAw2D,KAAKl5D,UAAUwC,SAAW,WACxB,OAAOhH,KAAK6X,WAAW,SAAU,IACnC,EAIA6lD,KAAKl5D,UAAUmH,IAAM,SAASmL,EAAOm+C,GAEnC,IADAn+C,EAAQo4C,UAAUlvD,KAAM8W,KACX,GAAKA,EAAQ9W,KAAK8G,KAAM,CAEnC,IAAI46B,EAAOy8B,YAAYn+D,KADvB8W,GAAS9W,KAAKo+D,SAEd,OAAO18B,GAAQA,EAAK36B,MAAM+P,EAAQq3C,EACpC,CACA,OAAO8G,CACT,EAIAyI,KAAKl5D,UAAU+H,IAAM,SAASuK,EAAOhS,GACnC,OAAOu5D,WAAWr+D,KAAM8W,EAAOhS,EACjC,EAEA44D,KAAKl5D,UAAUo9B,OAAS,SAAS9qB,GAC/B,OAAQ9W,KAAKmmB,IAAIrP,GACL,IAAVA,EAAc9W,KAAKsrC,QACnBx0B,IAAU9W,KAAK8G,KAAO,EAAI9G,KAAK+3B,MAC/B/3B,KAAKswC,OAAOx5B,EAAO,GAHK9W,IAI5B,EAEA09D,KAAKl5D,UAAU85D,OAAS,SAASxnD,EAAOhS,GACtC,OAAO9E,KAAKswC,OAAOx5B,EAAO,EAAGhS,EAC/B,EAEA44D,KAAKl5D,UAAUqtC,MAAQ,WACrB,OAAkB,IAAd7xC,KAAK8G,KACA9G,KAELA,KAAK+3D,WACP/3D,KAAK8G,KAAO9G,KAAKo+D,QAAUp+D,KAAKu+D,UAAY,EAC5Cv+D,KAAKw+D,OAASvQ,EACdjuD,KAAKo3D,MAAQp3D,KAAKy+D,MAAQ,KAC1Bz+D,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEF49D,WACT,EAEAF,KAAKl5D,UAAU1B,KAAO,WACpB,IAAIioB,EAAS7jB,UACTw3D,EAAU1+D,KAAK8G,KACnB,OAAO9G,KAAKg3D,eAAc,SAAS3qD,GACjCsyD,cAActyD,EAAM,EAAGqyD,EAAU3zC,EAAOtoB,QACxC,IAAK,IAAIosD,EAAK,EAAGA,EAAK9jC,EAAOtoB,OAAQosD,IACnCxiD,EAAKE,IAAImyD,EAAU7P,EAAI9jC,EAAO8jC,GAElC,GACF,EAEA6O,KAAKl5D,UAAUuzB,IAAM,WACnB,OAAO4mC,cAAc3+D,KAAM,GAAI,EACjC,EAEA09D,KAAKl5D,UAAUilC,QAAU,WACvB,IAAI1e,EAAS7jB,UACb,OAAOlH,KAAKg3D,eAAc,SAAS3qD,GACjCsyD,cAActyD,GAAO0e,EAAOtoB,QAC5B,IAAK,IAAIosD,EAAK,EAAGA,EAAK9jC,EAAOtoB,OAAQosD,IACnCxiD,EAAKE,IAAIsiD,EAAI9jC,EAAO8jC,GAExB,GACF,EAEA6O,KAAKl5D,UAAU8mC,MAAQ,WACrB,OAAOqzB,cAAc3+D,KAAM,EAC7B,EAIA09D,KAAKl5D,UAAUyzD,MAAQ,WACrB,OAAO2G,kBAAkB5+D,UAAMuG,EAAWW,UAC5C,EAEAw2D,KAAKl5D,UAAU2zD,UAAY,SAASC,GAClC,OAAOwG,kBAAkB5+D,KAAMo4D,EADwB/L,EAAQhkD,KAAKnB,UAAW,GAEjF,EAEAw2D,KAAKl5D,UAAU+zD,UAAY,WACzB,OAAOqG,kBAAkB5+D,KAAMw4D,WAAYtxD,UAC7C,EAEAw2D,KAAKl5D,UAAUi0D,cAAgB,SAASL,GAAS,IAAIE,EAAQjM,EAAQhkD,KAAKnB,UAAW,GACnF,OAAO03D,kBAAkB5+D,KAAM04D,eAAeN,GAASE,EACzD,EAEAoF,KAAKl5D,UAAUw5D,QAAU,SAASl3D,GAChC,OAAO63D,cAAc3+D,KAAM,EAAG8G,EAChC,EAIA42D,KAAKl5D,UAAUa,MAAQ,SAASovC,EAAOlxC,GACrC,IAAIuD,EAAO9G,KAAK8G,KAChB,OAAIsoD,WAAW3a,EAAOlxC,EAAKuD,GAClB9G,KAEF2+D,cACL3+D,KACAqvD,aAAa5a,EAAO3tC,GACpByoD,WAAWhsD,EAAKuD,GAEpB,EAEA42D,KAAKl5D,UAAUotD,WAAa,SAASnrD,EAAM82C,GACzC,IAAIzmC,EAAQ,EACRiU,EAAS8zC,YAAY7+D,KAAMu9C,GAC/B,OAAO,IAAIwS,UAAS,WAClB,IAAIjrD,EAAQimB,IACZ,OAAOjmB,IAAUg6D,GACf1O,eACAJ,cAAcvpD,EAAMqQ,IAAShS,EACjC,GACF,EAEA44D,KAAKl5D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAItC,IAHA,IAEIz4C,EAFAgS,EAAQ,EACRiU,EAAS8zC,YAAY7+D,KAAMu9C,IAEvBz4C,EAAQimB,OAAc+zC,KACK,IAA7B7pD,EAAGnQ,EAAOgS,IAAS9W,QAIzB,OAAO8W,CACT,EAEA4mD,KAAKl5D,UAAU40D,cAAgB,SAASG,GACtC,OAAIA,IAAYv5D,KAAK+3D,UACZ/3D,KAEJu5D,EAIEuE,SAAS99D,KAAKo+D,QAASp+D,KAAKu+D,UAAWv+D,KAAKw+D,OAAQx+D,KAAKo3D,MAAOp3D,KAAKy+D,MAAOlF,EAASv5D,KAAKi0D,SAH/Fj0D,KAAK+3D,UAAYwB,EACVv5D,KAGX,EAOF09D,KAAKG,OAASA,OAEd,IAAIK,GAAmB,yBAEnBa,GAAgBrB,KAAKl5D,UAiBvB,SAASu5D,MAAMh3D,EAAOwyD,GACpBv5D,KAAK+G,MAAQA,EACb/G,KAAKu5D,QAAUA,CACjB,CAnBFwF,GAAcb,KAAoB,EAClCa,GAAc/Q,GAAU+Q,GAAcn9B,OACtCm9B,GAAczH,MAAQoC,GAAapC,MACnCyH,GAActH,SACdsH,GAAclC,SAAWnD,GAAamD,SACtCkC,GAAcrH,OAASgC,GAAahC,OACpCqH,GAAcvH,SAAWkC,GAAalC,SACtCuH,GAAc1G,QAAUqB,GAAarB,QACrC0G,GAAcpG,YAAce,GAAaf,YACzCoG,GAAc/H,cAAgB0C,GAAa1C,cAC3C+H,GAAc7F,UAAYQ,GAAaR,UACvC6F,GAAc1F,YAAcK,GAAaL,YACzC0F,GAAc5F,WAAaO,GAAaP,WAWtC4E,MAAMv5D,UAAUw6D,aAAe,SAASzF,EAAS0F,EAAOnoD,GACtD,GAAIA,IAAUmoD,EAAQ,GAAKA,EAAmC,IAAtBj/D,KAAK+G,MAAMtE,OACjD,OAAOzC,KAET,IAAIk/D,EAAepoD,IAAUmoD,EAAS9Q,EACtC,GAAI+Q,GAAel/D,KAAK+G,MAAMtE,OAC5B,OAAO,IAAIs7D,MAAM,GAAIxE,GAEvB,IACI4F,EADAC,EAAgC,IAAhBF,EAEpB,GAAID,EAAQ,EAAG,CACb,IAAII,EAAWr/D,KAAK+G,MAAMm4D,GAE1B,IADAC,EAAWE,GAAYA,EAASL,aAAazF,EAAS0F,EAAQhR,EAAOn3C,MACpDuoD,GAAYD,EAC3B,OAAOp/D,IAEX,CACA,GAAIo/D,IAAkBD,EACpB,OAAOn/D,KAET,IAAIs/D,EAAWC,cAAcv/D,KAAMu5D,GACnC,IAAK6F,EACH,IAAK,IAAIvQ,EAAK,EAAGA,EAAKqQ,EAAarQ,IACjCyQ,EAASv4D,MAAM8nD,QAAMtoD,EAMzB,OAHI44D,IACFG,EAASv4D,MAAMm4D,GAAeC,GAEzBG,CACT,EAEAvB,MAAMv5D,UAAUg7D,YAAc,SAASjG,EAAS0F,EAAOnoD,GACrD,GAAIA,KAAWmoD,EAAQ,GAAKA,EAAQ,IAA4B,IAAtBj/D,KAAK+G,MAAMtE,OACnD,OAAOzC,KAET,IAKIm/D,EALAM,EAAc3oD,EAAQ,IAAOmoD,EAAS9Q,EAC1C,GAAIsR,GAAaz/D,KAAK+G,MAAMtE,OAC1B,OAAOzC,KAIT,GAAIi/D,EAAQ,EAAG,CACb,IAAII,EAAWr/D,KAAK+G,MAAM04D,GAE1B,IADAN,EAAWE,GAAYA,EAASG,YAAYjG,EAAS0F,EAAQhR,EAAOn3C,MACnDuoD,GAAYI,IAAcz/D,KAAK+G,MAAMtE,OAAS,EAC7D,OAAOzC,IAEX,CAEA,IAAIs/D,EAAWC,cAAcv/D,KAAMu5D,GAKnC,OAJA+F,EAASv4D,MAAMupC,OAAOmvB,EAAY,GAC9BN,IACFG,EAASv4D,MAAM04D,GAAaN,GAEvBG,CACT,EAIF,IA2EII,GAiWAC,GA5aAb,GAAO,CAAC,EAEZ,SAASD,YAAYxyD,EAAMkxC,GACzB,IAAIqiB,EAAOvzD,EAAK+xD,QACZyB,EAAQxzD,EAAKkyD,UACbuB,EAAUC,cAAcF,GACxBG,EAAO3zD,EAAKoyD,MAEhB,OAAOwB,kBAAkB5zD,EAAK+qD,MAAO/qD,EAAKmyD,OAAQ,GAElD,SAASyB,kBAAkBv+B,EAAMu9B,EAAOj2D,GACtC,OAAiB,IAAVi2D,EACLiB,YAAYx+B,EAAM14B,GAClBm3D,YAAYz+B,EAAMu9B,EAAOj2D,EAC7B,CAEA,SAASk3D,YAAYx+B,EAAM14B,GACzB,IAAIjC,EAAQiC,IAAW82D,EAAUE,GAAQA,EAAKj5D,MAAQ26B,GAAQA,EAAK36B,MAC/DlC,EAAOmE,EAAS42D,EAAO,EAAIA,EAAO52D,EAClCo3D,EAAKP,EAAQ72D,EAIjB,OAHIo3D,EAAKlS,IACPkS,EAAKlS,GAEA,WACL,GAAIrpD,IAASu7D,EACX,OAAOtB,GAET,IAAIvC,EAAMhf,IAAY6iB,EAAKv7D,IAC3B,OAAOkC,GAASA,EAAMw1D,EACxB,CACF,CAEA,SAAS4D,YAAYz+B,EAAMu9B,EAAOj2D,GAChC,IAAI+hB,EACAhkB,EAAQ26B,GAAQA,EAAK36B,MACrBlC,EAAOmE,EAAS42D,EAAO,EAAKA,EAAO52D,GAAWi2D,EAC9CmB,EAAmC,GAA5BP,EAAQ72D,GAAWi2D,GAI9B,OAHImB,EAAKlS,IACPkS,EAAKlS,GAEA,WACL,OAAG,CACD,GAAInjC,EAAQ,CACV,IAAIjmB,EAAQimB,IACZ,GAAIjmB,IAAUg6D,GACZ,OAAOh6D,EAETimB,EAAS,IACX,CACA,GAAIlmB,IAASu7D,EACX,OAAOtB,GAET,IAAIvC,EAAMhf,IAAY6iB,EAAKv7D,IAC3BkmB,EAASk1C,kBACPl5D,GAASA,EAAMw1D,GAAM0C,EAAQhR,EAAOjlD,GAAUuzD,GAAO0C,GAEzD,CACF,CACF,CACF,CAEA,SAASnB,SAAS9c,EAAQqf,EAAUpB,EAAOv/D,EAAMsgE,EAAMzG,EAAS7D,GAC9D,IAAIrpD,EAAO/H,OAAO6kB,OAAO41C,IAUzB,OATA1yD,EAAKvF,KAAOu5D,EAAWrf,EACvB30C,EAAK+xD,QAAUpd,EACf30C,EAAKkyD,UAAY8B,EACjBh0D,EAAKmyD,OAASS,EACd5yD,EAAK+qD,MAAQ13D,EACb2M,EAAKoyD,MAAQuB,EACb3zD,EAAK0rD,UAAYwB,EACjBltD,EAAK4nD,OAASyB,EACdrpD,EAAK2rD,WAAY,EACV3rD,CACT,CAGA,SAASuxD,YACP,OAAO8B,KAAeA,GAAa5B,SAAS,EAAG,EAAG7P,GACpD,CAEA,SAASoQ,WAAWhyD,EAAMyK,EAAOhS,GAG/B,IAFAgS,EAAQo4C,UAAU7iD,EAAMyK,KAEVA,EACZ,OAAOzK,EAGT,GAAIyK,GAASzK,EAAKvF,MAAQgQ,EAAQ,EAChC,OAAOzK,EAAK2qD,eAAc,SAAS3qD,GACjCyK,EAAQ,EACN6nD,cAActyD,EAAMyK,GAAOvK,IAAI,EAAGzH,GAClC65D,cAActyD,EAAM,EAAGyK,EAAQ,GAAGvK,IAAIuK,EAAOhS,EACjD,IAGFgS,GAASzK,EAAK+xD,QAEd,IAAIkC,EAAUj0D,EAAKoyD,MACfjE,EAAUnuD,EAAK+qD,MACfuD,EAAWpM,QAAQD,GAOvB,OANIx3C,GAASipD,cAAc1zD,EAAKkyD,WAC9B+B,EAAUC,YAAYD,EAASj0D,EAAK0rD,UAAW,EAAGjhD,EAAOhS,EAAO61D,GAEhEH,EAAU+F,YAAY/F,EAASnuD,EAAK0rD,UAAW1rD,EAAKmyD,OAAQ1nD,EAAOhS,EAAO61D,GAGvEA,EAAS71D,MAIVuH,EAAK0rD,WACP1rD,EAAK+qD,MAAQoD,EACbnuD,EAAKoyD,MAAQ6B,EACbj0D,EAAK4nD,YAAS1tD,EACd8F,EAAK2rD,WAAY,EACV3rD,GAEFyxD,SAASzxD,EAAK+xD,QAAS/xD,EAAKkyD,UAAWlyD,EAAKmyD,OAAQhE,EAAS8F,GAV3Dj0D,CAWX,CAEA,SAASk0D,YAAY7+B,EAAM63B,EAAS0F,EAAOnoD,EAAOhS,EAAO61D,GACvD,IAMII,EANAwB,EAAOzlD,IAAUmoD,EAAS9Q,EAC1BqS,EAAU9+B,GAAQ66B,EAAM76B,EAAK36B,MAAMtE,OACvC,IAAK+9D,QAAqBj6D,IAAVzB,EACd,OAAO48B,EAKT,GAAIu9B,EAAQ,EAAG,CACb,IAAIwB,EAAY/+B,GAAQA,EAAK36B,MAAMw1D,GAC/BmE,EAAeH,YAAYE,EAAWlH,EAAS0F,EAAQhR,EAAOn3C,EAAOhS,EAAO61D,GAChF,OAAI+F,IAAiBD,EACZ/+B,IAETq5B,EAAUwE,cAAc79B,EAAM63B,IACtBxyD,MAAMw1D,GAAOmE,EACd3F,EACT,CAEA,OAAIyF,GAAW9+B,EAAK36B,MAAMw1D,KAASz3D,EAC1B48B,GAGT+sB,OAAOkM,GAEPI,EAAUwE,cAAc79B,EAAM63B,QAChBhzD,IAAVzB,GAAuBy3D,IAAQxB,EAAQh0D,MAAMtE,OAAS,EACxDs4D,EAAQh0D,MAAMgxB,MAEdgjC,EAAQh0D,MAAMw1D,GAAOz3D,EAEhBi2D,EACT,CAEA,SAASwE,cAAc79B,EAAM63B,GAC3B,OAAIA,GAAW73B,GAAQ63B,IAAY73B,EAAK63B,QAC/B73B,EAEF,IAAIq8B,MAAMr8B,EAAOA,EAAK36B,MAAM1B,QAAU,GAAIk0D,EACnD,CAEA,SAAS4E,YAAY9xD,EAAMs0D,GACzB,GAAIA,GAAYZ,cAAc1zD,EAAKkyD,WACjC,OAAOlyD,EAAKoyD,MAEd,GAAIkC,EAAW,GAAMt0D,EAAKmyD,OAASvQ,EAAQ,CAGzC,IAFA,IAAIvsB,EAAOr1B,EAAK+qD,MACZ6H,EAAQ5yD,EAAKmyD,OACV98B,GAAQu9B,EAAQ,GACrBv9B,EAAOA,EAAK36B,MAAO45D,IAAa1B,EAAS9Q,GACzC8Q,GAAShR,EAEX,OAAOvsB,CACT,CACF,CAEA,SAASi9B,cAActyD,EAAMooC,EAAOlxC,QAGpBgD,IAAVkuC,IACFA,GAAgB,QAENluC,IAARhD,IACFA,GAAY,GAEd,IAAIq9D,EAAQv0D,EAAK0rD,WAAa,IAAIrJ,QAC9BmS,EAAYx0D,EAAK+xD,QACjB0C,EAAcz0D,EAAKkyD,UACnBwC,EAAYF,EAAYpsB,EACxBusB,OAAsBz6D,IAARhD,EAAoBu9D,EAAcv9D,EAAM,EAAIu9D,EAAcv9D,EAAMs9D,EAAYt9D,EAC9F,GAAIw9D,IAAcF,GAAaG,IAAgBF,EAC7C,OAAOz0D,EAIT,GAAI00D,GAAaC,EACf,OAAO30D,EAAKwlC,QAQd,IALA,IAAIovB,EAAW50D,EAAKmyD,OAChBhE,EAAUnuD,EAAK+qD,MAGf8J,EAAc,EACXH,EAAYG,EAAc,GAC/B1G,EAAU,IAAIuD,MAAMvD,GAAWA,EAAQzzD,MAAMtE,OAAS,MAAC8D,EAAWi0D,GAAW,GAAIoG,GAEjFM,GAAe,IADfD,GAAYhT,GAGViT,IACFH,GAAaG,EACbL,GAAaK,EACbF,GAAeE,EACfJ,GAAeI,GAOjB,IAJA,IAAIC,GAAgBpB,cAAce,GAC9BM,GAAgBrB,cAAciB,GAG3BI,IAAiB,GAAMH,EAAWhT,GACvCuM,EAAU,IAAIuD,MAAMvD,GAAWA,EAAQzzD,MAAMtE,OAAS,CAAC+3D,GAAW,GAAIoG,GACtEK,GAAYhT,EAId,IAAIoT,GAAUh1D,EAAKoyD,MACf6B,GAAUc,GAAgBD,GAC5BhD,YAAY9xD,EAAM20D,EAAc,GAChCI,GAAgBD,GAAgB,IAAIpD,MAAM,GAAI6C,GAASS,GAGzD,GAAIA,IAAWD,GAAgBD,IAAiBJ,EAAYD,GAAeO,GAAQt6D,MAAMtE,OAAQ,CAG/F,IADA,IAAIi/B,GADJ84B,EAAU+E,cAAc/E,EAASoG,GAExB3B,GAAQgC,EAAUhC,GAAQhR,EAAOgR,IAAShR,EAAO,CACxD,IAAIsO,GAAO4E,KAAkBlC,GAAS9Q,EACtCzsB,GAAOA,GAAK36B,MAAMw1D,IAAOgD,cAAc79B,GAAK36B,MAAMw1D,IAAMqE,EAC1D,CACAl/B,GAAK36B,MAAOo6D,KAAkBlT,EAASE,GAAQkT,EACjD,CAQA,GALIL,EAAcF,IAChBR,GAAUA,IAAWA,GAAQd,YAAYoB,EAAO,EAAGI,IAIjDD,GAAaK,GACfL,GAAaK,GACbJ,GAAeI,GACfH,EAAWhT,EACXuM,EAAU,KACV8F,GAAUA,IAAWA,GAAQtB,aAAa4B,EAAO,EAAGG,QAG/C,GAAIA,EAAYF,GAAaO,GAAgBD,GAAe,CAIjE,IAHAD,EAAc,EAGP1G,GAAS,CACd,IAAI8G,GAAcP,IAAcE,EAAY9S,EAC5C,GAAImT,KAAgBF,KAAkBH,EAAY9S,EAChD,MAEEmT,KACFJ,IAAgB,GAAKD,GAAYK,IAEnCL,GAAYhT,EACZuM,EAAUA,EAAQzzD,MAAMu6D,GAC1B,CAGI9G,GAAWuG,EAAYF,IACzBrG,EAAUA,EAAQwE,aAAa4B,EAAOK,EAAUF,EAAYG,IAE1D1G,GAAW4G,GAAgBD,KAC7B3G,EAAUA,EAAQgF,YAAYoB,EAAOK,EAAUG,GAAgBF,IAE7DA,IACFH,GAAaG,EACbF,GAAeE,EAEnB,CAEA,OAAI70D,EAAK0rD,WACP1rD,EAAKvF,KAAOk6D,EAAcD,EAC1B10D,EAAK+xD,QAAU2C,EACf10D,EAAKkyD,UAAYyC,EACjB30D,EAAKmyD,OAASyC,EACd50D,EAAK+qD,MAAQoD,EACbnuD,EAAKoyD,MAAQ6B,GACbj0D,EAAK4nD,YAAS1tD,EACd8F,EAAK2rD,WAAY,EACV3rD,GAEFyxD,SAASiD,EAAWC,EAAaC,EAAUzG,EAAS8F,GAC7D,CAEA,SAAS1B,kBAAkBvyD,EAAM+rD,EAAQuD,GAGvC,IAFA,IAAIrD,EAAQ,GACRiJ,EAAU,EACL1S,EAAK,EAAGA,EAAK8M,EAAUl5D,OAAQosD,IAAM,CAC5C,IAAI/pD,EAAQ62D,EAAU9M,GAClBE,EAAOjC,gBAAgBhoD,GACvBiqD,EAAKjoD,KAAOy6D,IACdA,EAAUxS,EAAKjoD,MAEZ2lD,WAAW3nD,KACdiqD,EAAOA,EAAK34B,KAAI,SAAS85B,GAAK,OAAOmD,OAAOnD,EAAE,KAEhDoI,EAAMx1D,KAAKisD,EACb,CAIA,OAHIwS,EAAUl1D,EAAKvF,OACjBuF,EAAOA,EAAK2xD,QAAQuD,IAEf3F,wBAAwBvvD,EAAM+rD,EAAQE,EAC/C,CAEA,SAASyH,cAAcj5D,GACrB,OAAOA,EAAOonD,EAAO,EAAOpnD,EAAO,IAAOmnD,GAAUA,CACtD,CAME,SAAS4K,WAAW/zD,GAClB,OAAOA,QAAwC08D,kBAC7CC,aAAa38D,GAASA,EACtB08D,kBAAkBxK,eAAc,SAAS5gC,GACvC,IAAI24B,EAAOpC,cAAc7nD,GACzB+xD,kBAAkB9H,EAAKjoD,MACvBioD,EAAK7iC,SAAQ,SAASgkC,EAAGD,GAAK,OAAO75B,EAAI7pB,IAAI0jD,EAAGC,EAAE,GACpD,GACJ,CAuEF,SAASuR,aAAaC,GACpB,OAAO3K,MAAM2K,IAAoB/T,UAAU+T,EAC7C,CASA,SAASC,eAAevrC,EAAK/pB,EAAMktD,EAAS7D,GAC1C,IAAIkM,EAAOt9D,OAAO6kB,OAAO0vC,WAAWr0D,WAMpC,OALAo9D,EAAK96D,KAAOsvB,EAAMA,EAAItvB,KAAO,EAC7B86D,EAAKC,KAAOzrC,EACZwrC,EAAKE,MAAQz1D,EACbu1D,EAAK7J,UAAYwB,EACjBqI,EAAK3N,OAASyB,EACPkM,CACT,CAGA,SAASJ,kBACP,OAAO7B,KAAsBA,GAAoBgC,eAAe7K,WAAY8G,aAC9E,CAEA,SAASmE,iBAAiBH,EAAM3R,EAAGC,GACjC,IAII8R,EACAC,EALA7rC,EAAMwrC,EAAKC,KACXx1D,EAAOu1D,EAAKE,MACZ//D,EAAIq0B,EAAIzqB,IAAIskD,GACZ9pC,OAAY5f,IAANxE,EAGV,GAAImuD,IAAM9B,EAAS,CACjB,IAAKjoC,EACH,OAAOy7C,EAELv1D,EAAKvF,MAAQonD,GAAQ7hD,EAAKvF,MAAmB,EAAXsvB,EAAItvB,MAExCk7D,GADAC,EAAU51D,EAAKmqB,QAAO,SAAS28B,EAAOoJ,GAAO,YAAiBh2D,IAAV4sD,GAAuBpxD,IAAMw6D,CAAG,KACnEzL,aAAa16B,KAAI,SAAS+8B,GAAS,OAAOA,EAAM,EAAE,IAAG+O,OAAOtO,QACzEgO,EAAK7J,YACPiK,EAAOjK,UAAYkK,EAAQlK,UAAY6J,EAAK7J,aAG9CiK,EAAS5rC,EAAIwL,OAAOquB,GACpBgS,EAAUlgE,IAAMsK,EAAKvF,KAAO,EAAIuF,EAAK0rB,MAAQ1rB,EAAKE,IAAIxK,OAAGwE,GAE7D,MACE,GAAI4f,EAAK,CACP,GAAI+pC,IAAM7jD,EAAKV,IAAI5J,GAAG,GACpB,OAAO6/D,EAETI,EAAS5rC,EACT6rC,EAAU51D,EAAKE,IAAIxK,EAAG,CAACkuD,EAAGC,GAC5B,MACE8R,EAAS5rC,EAAI7pB,IAAI0jD,EAAG5jD,EAAKvF,MACzBm7D,EAAU51D,EAAKE,IAAIF,EAAKvF,KAAM,CAACmpD,EAAGC,IAGtC,OAAI0R,EAAK7J,WACP6J,EAAK96D,KAAOk7D,EAAOl7D,KACnB86D,EAAKC,KAAOG,EACZJ,EAAKE,MAAQG,EACbL,EAAK3N,YAAS1tD,EACPq7D,GAEFD,eAAeK,EAAQC,EAChC,CAGE,SAASE,gBAAgBC,EAASpP,GAChChzD,KAAKqiE,MAAQD,EACbpiE,KAAKsiE,SAAWtP,EAChBhzD,KAAK8G,KAAOs7D,EAAQt7D,IACtB,CA0DA,SAASy7D,kBAAkBxT,GACzB/uD,KAAKqiE,MAAQtT,EACb/uD,KAAK8G,KAAOioD,EAAKjoD,IACnB,CAwBA,SAAS07D,cAAczT,GACrB/uD,KAAKqiE,MAAQtT,EACb/uD,KAAK8G,KAAOioD,EAAKjoD,IACnB,CAsBA,SAAS27D,oBAAoBz3C,GAC3BhrB,KAAKqiE,MAAQr3C,EACbhrB,KAAK8G,KAAOkkB,EAAQlkB,IACtB,CAuDF,SAAS47D,YAAYx6C,GACnB,IAAIy6C,EAAeC,aAAa16C,GAiChC,OAhCAy6C,EAAaN,MAAQn6C,EACrBy6C,EAAa77D,KAAOohB,EAASphB,KAC7B67D,EAAaT,KAAO,WAAa,OAAOh6C,CAAQ,EAChDy6C,EAAaplB,QAAU,WACrB,IAAIslB,EAAmB36C,EAASq1B,QAAQvyC,MAAMhL,MAE9C,OADA6iE,EAAiBX,KAAO,WAAa,OAAOh6C,EAASq1B,SAAS,EACvDslB,CACT,EACAF,EAAax8C,IAAM,SAAS1P,GAAO,OAAOyR,EAAS9a,SAASqJ,EAAI,EAChEksD,EAAav1D,SAAW,SAASqJ,GAAO,OAAOyR,EAAS/B,IAAI1P,EAAI,EAChEksD,EAAapR,YAAcuR,mBAC3BH,EAAalR,kBAAoB,SAAUx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACpE,OAAOkoB,EAAS8mC,WAAU,SAASkB,EAAGD,GAAK,OAA4B,IAArBh7C,EAAGg7C,EAAGC,EAAGiF,EAAiB,GAAG5X,EACjF,EACAolB,EAAavP,mBAAqB,SAAS3sD,EAAM82C,GAC/C,GAAI92C,IAASkpD,GAAiB,CAC5B,IAAIvnC,EAAWF,EAAS0pC,WAAWnrD,EAAM82C,GACzC,OAAO,IAAIwS,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,IAAKC,EAAKlK,KAAM,CACd,IAAI4xC,EAAI1nC,EAAKzjB,MAAM,GACnByjB,EAAKzjB,MAAM,GAAKyjB,EAAKzjB,MAAM,GAC3ByjB,EAAKzjB,MAAM,GAAKmrD,CAClB,CACA,OAAO1nC,CACT,GACF,CACA,OAAOL,EAAS0pC,WACdnrD,IAASipD,GAAiBD,EAAeC,GACzCnS,EAEJ,EACOolB,CACT,CAGA,SAASI,WAAW76C,EAAU8wC,EAAQhuB,GACpC,IAAIg4B,EAAiBJ,aAAa16C,GAgClC,OA/BA86C,EAAel8D,KAAOohB,EAASphB,KAC/Bk8D,EAAe78C,IAAM,SAAS1P,GAAO,OAAOyR,EAAS/B,IAAI1P,EAAI,EAC7DusD,EAAer3D,IAAM,SAAS8K,EAAKw+C,GACjC,IAAI/E,EAAIhoC,EAASvc,IAAI8K,EAAK23C,GAC1B,OAAO8B,IAAM9B,EACX6G,EACA+D,EAAO3wD,KAAK2iC,EAASklB,EAAGz5C,EAAKyR,EACjC,EACA86C,EAAevR,kBAAoB,SAAUx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACtE,OAAOkoB,EAAS8mC,WACd,SAASkB,EAAGD,EAAGjmD,GAAK,OAAwD,IAAjDiL,EAAG+jD,EAAO3wD,KAAK2iC,EAASklB,EAAGD,EAAGjmD,GAAIimD,EAAGkF,EAAiB,GACjF5X,EAEJ,EACAylB,EAAe5P,mBAAqB,SAAU3sD,EAAM82C,GAClD,IAAIn1B,EAAWF,EAAS0pC,WAAWjC,GAAiBpS,GACpD,OAAO,IAAIwS,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,GAAIC,EAAKlK,KACP,OAAOkK,EAET,IAAI4qC,EAAQ5qC,EAAKzjB,MACb2R,EAAM08C,EAAM,GAChB,OAAOnD,cACLvpD,EACAgQ,EACAuiD,EAAO3wD,KAAK2iC,EAASmoB,EAAM,GAAI18C,EAAKyR,GACpCK,EAEJ,GACF,EACOy6C,CACT,CAGA,SAASC,eAAe/6C,EAAU8qC,GAChC,IAAI6P,EAAmBD,aAAa16C,GAsBpC,OArBA26C,EAAiBR,MAAQn6C,EACzB26C,EAAiB/7D,KAAOohB,EAASphB,KACjC+7D,EAAiBtlB,QAAU,WAAa,OAAOr1B,CAAQ,EACnDA,EAASg6C,OACXW,EAAiBX,KAAO,WACtB,IAAIS,EAAeD,YAAYx6C,GAE/B,OADAy6C,EAAaplB,QAAU,WAAa,OAAOr1B,EAASg6C,MAAM,EACnDS,CACT,GAEFE,EAAiBl3D,IAAM,SAAS8K,EAAKw+C,GAClC,OAAO/sC,EAASvc,IAAIqnD,EAAUv8C,GAAO,EAAIA,EAAKw+C,EAAY,EAC7D4N,EAAiB18C,IAAM,SAAS1P,GAC7B,OAAOyR,EAAS/B,IAAI6sC,EAAUv8C,GAAO,EAAIA,EAAI,EAChDosD,EAAiBz1D,SAAW,SAAStI,GAAS,OAAOojB,EAAS9a,SAAStI,EAAM,EAC7E+9D,EAAiBtR,YAAcuR,mBAC/BD,EAAiB7T,UAAY,SAAU/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAChE,OAAOkoB,EAAS8mC,WAAU,SAASkB,EAAGD,GAAK,OAAOh7C,EAAGi7C,EAAGD,EAAGkF,EAAO,IAAI5X,EACxE,EACAslB,EAAiBjR,WACf,SAASnrD,EAAM82C,GAAW,OAAOr1B,EAAS0pC,WAAWnrD,GAAO82C,EAAQ,EAC/DslB,CACT,CAGA,SAASK,cAAch7C,EAAUi7C,EAAWn4B,EAASgoB,GACnD,IAAIoQ,EAAiBR,aAAa16C,GAwClC,OAvCI8qC,IACFoQ,EAAej9C,IAAM,SAAS1P,GAC5B,IAAIy5C,EAAIhoC,EAASvc,IAAI8K,EAAK23C,GAC1B,OAAO8B,IAAM9B,KAAa+U,EAAU96D,KAAK2iC,EAASklB,EAAGz5C,EAAKyR,EAC5D,EACAk7C,EAAez3D,IAAM,SAAS8K,EAAKw+C,GACjC,IAAI/E,EAAIhoC,EAASvc,IAAI8K,EAAK23C,GAC1B,OAAO8B,IAAM9B,GAAW+U,EAAU96D,KAAK2iC,EAASklB,EAAGz5C,EAAKyR,GACtDgoC,EAAI+E,CACR,GAEFmO,EAAe3R,kBAAoB,SAAUx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAClEuhD,EAAa,EAOjB,OANAr5B,EAAS8mC,WAAU,SAASkB,EAAGD,EAAGjmD,GAChC,GAAIm5D,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGjmD,GAEhC,OADAu3C,IACOtsC,EAAGi7C,EAAG8C,EAAU/C,EAAI1O,EAAa,EAAG4T,EAE/C,GAAG5X,GACIgE,CACT,EACA6hB,EAAehQ,mBAAqB,SAAU3sD,EAAM82C,GAClD,IAAIn1B,EAAWF,EAAS0pC,WAAWjC,GAAiBpS,GAChDgE,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,OAAa,CACX,IAAIxnC,EAAOH,EAASE,OACpB,GAAIC,EAAKlK,KACP,OAAOkK,EAET,IAAI4qC,EAAQ5qC,EAAKzjB,MACb2R,EAAM08C,EAAM,GACZruD,EAAQquD,EAAM,GAClB,GAAIgQ,EAAU96D,KAAK2iC,EAASlmC,EAAO2R,EAAKyR,GACtC,OAAO8nC,cAAcvpD,EAAMusD,EAAUv8C,EAAM8qC,IAAcz8C,EAAOyjB,EAEpE,CACF,GACF,EACO66C,CACT,CAGA,SAASC,eAAen7C,EAAUo7C,EAASt4B,GACzC,IAAIu4B,EAAS/zB,MAAM0pB,YAQnB,OAPAhxC,EAAS8mC,WAAU,SAASkB,EAAGD,GAC7BsT,EAAO7L,OACL4L,EAAQj7D,KAAK2iC,EAASklB,EAAGD,EAAG/nC,GAC5B,GACA,SAASjc,GAAK,OAAOA,EAAI,CAAC,GAE9B,IACOs3D,EAAOlK,aAChB,CAGA,SAASmK,eAAet7C,EAAUo7C,EAASt4B,GACzC,IAAIy4B,EAAc7W,QAAQ1kC,GACtBq7C,GAAU5V,UAAUzlC,GAAY2wC,aAAerpB,OAAO0pB,YAC1DhxC,EAAS8mC,WAAU,SAASkB,EAAGD,GAC7BsT,EAAO7L,OACL4L,EAAQj7D,KAAK2iC,EAASklB,EAAGD,EAAG/nC,IAC5B,SAASjc,GAAK,OAAQA,EAAIA,GAAK,IAAMnJ,KAAK2gE,EAAc,CAACxT,EAAGC,GAAKA,GAAIjkD,CAAE,GAE3E,IACA,IAAIy3D,EAASC,cAAcz7C,GAC3B,OAAOq7C,EAAOntC,KAAI,SAASp0B,GAAO,OAAO4hE,MAAM17C,EAAUw7C,EAAO1hE,GAAK,GACvE,CAGA,SAAS6hE,aAAa37C,EAAUusB,EAAOlxC,EAAKyvD,GAC1C,IAAI8Q,EAAe57C,EAASphB,KAe5B,QAXcP,IAAVkuC,IACFA,GAAgB,QAENluC,IAARhD,IACEA,IAAQiR,IACVjR,EAAMugE,EAENvgE,GAAY,GAIZ6rD,WAAW3a,EAAOlxC,EAAKugE,GACzB,OAAO57C,EAGT,IAAI67C,EAAgB1U,aAAa5a,EAAOqvB,GACpCE,EAAczU,WAAWhsD,EAAKugE,GAKlC,GAAIC,GAAkBA,GAAiBC,GAAgBA,EACrD,OAAOH,aAAa37C,EAAS0oC,QAAQW,cAAe9c,EAAOlxC,EAAKyvD,GAOlE,IACIiR,EADAC,EAAeF,EAAcD,EAE7BG,GAAiBA,IACnBD,EAAYC,EAAe,EAAI,EAAIA,GAGrC,IAAIC,EAAWvB,aAAa16C,GA6D5B,OAzDAi8C,EAASr9D,KAAqB,IAAdm9D,EAAkBA,EAAY/7C,EAASphB,MAAQm9D,QAAa19D,GAEvEysD,GAAWlB,MAAM5pC,IAAa+7C,GAAa,IAC9CE,EAASx4D,IAAM,SAAUmL,EAAOm+C,GAE9B,OADAn+C,EAAQo4C,UAAUlvD,KAAM8W,KACR,GAAKA,EAAQmtD,EAC3B/7C,EAASvc,IAAImL,EAAQitD,EAAe9O,GACpCA,CACJ,GAGFkP,EAAS1S,kBAAoB,SAASx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAC/D,GAAkB,IAAdikE,EACF,OAAO,EAET,GAAI1mB,EACF,OAAOv9C,KAAKuxD,cAAcvC,UAAU/5C,EAAIsoC,GAE1C,IAAI6mB,EAAU,EACVC,GAAa,EACb9iB,EAAa,EAQjB,OAPAr5B,EAAS8mC,WAAU,SAASkB,EAAGD,GAC7B,IAAMoU,KAAeA,EAAaD,IAAYL,GAE5C,OADAxiB,KACuD,IAAhDtsC,EAAGi7C,EAAG8C,EAAU/C,EAAI1O,EAAa,EAAG4T,IACpC5T,IAAe0iB,CAE1B,IACO1iB,CACT,EAEA4iB,EAAS/Q,mBAAqB,SAAS3sD,EAAM82C,GAC3C,GAAkB,IAAd0mB,GAAmB1mB,EACrB,OAAOv9C,KAAKuxD,cAAcK,WAAWnrD,EAAM82C,GAG7C,IAAIn1B,EAAyB,IAAd67C,GAAmB/7C,EAAS0pC,WAAWnrD,EAAM82C,GACxD6mB,EAAU,EACV7iB,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,KAAOqU,IAAYL,GACjB37C,EAASE,OAEX,KAAMi5B,EAAa0iB,EACjB,OAAO7T,eAET,IAAI7nC,EAAOH,EAASE,OACpB,OAAI0qC,GAAWvsD,IAASipD,GACfnnC,EAEAynC,cAAcvpD,EAAM86C,EAAa,EAD/B96C,IAASgpD,OACyBlpD,EAEAgiB,EAAKzjB,MAAM,GAFAyjB,EAI1D,GACF,EAEO47C,CACT,CAGA,SAASG,iBAAiBp8C,EAAUi7C,EAAWn4B,GAC7C,IAAIu5B,EAAe3B,aAAa16C,GAoChC,OAnCAq8C,EAAa9S,kBAAoB,SAASx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACnE,GAAIu9C,EACF,OAAOv9C,KAAKuxD,cAAcvC,UAAU/5C,EAAIsoC,GAE1C,IAAIgE,EAAa,EAIjB,OAHAr5B,EAAS8mC,WAAU,SAASkB,EAAGD,EAAGjmD,GAC/B,OAAOm5D,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGjmD,MAAQu3C,GAActsC,EAAGi7C,EAAGD,EAAGkF,EAAO,IAEvE5T,CACT,EACAgjB,EAAanR,mBAAqB,SAAS3sD,EAAM82C,GAAU,IAAI4X,EAASn1D,KACtE,GAAIu9C,EACF,OAAOv9C,KAAKuxD,cAAcK,WAAWnrD,EAAM82C,GAE7C,IAAIn1B,EAAWF,EAAS0pC,WAAWjC,GAAiBpS,GAChDinB,GAAY,EAChB,OAAO,IAAIzU,UAAS,WAClB,IAAKyU,EACH,OAAOpU,eAET,IAAI7nC,EAAOH,EAASE,OACpB,GAAIC,EAAKlK,KACP,OAAOkK,EAET,IAAI4qC,EAAQ5qC,EAAKzjB,MACbmrD,EAAIkD,EAAM,GACVjD,EAAIiD,EAAM,GACd,OAAKgQ,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGkF,GAI5B1uD,IAASkpD,GAAkBpnC,EAChCynC,cAAcvpD,EAAMwpD,EAAGC,EAAG3nC,IAJ1Bi8C,GAAY,EACLpU,eAIX,GACF,EACOmU,CACT,CAGA,SAASE,iBAAiBv8C,EAAUi7C,EAAWn4B,EAASgoB,GACtD,IAAI0R,EAAe9B,aAAa16C,GA4ChC,OA3CAw8C,EAAajT,kBAAoB,SAAUx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACpE,GAAIu9C,EACF,OAAOv9C,KAAKuxD,cAAcvC,UAAU/5C,EAAIsoC,GAE1C,IAAI8mB,GAAa,EACb9iB,EAAa,EAOjB,OANAr5B,EAAS8mC,WAAU,SAASkB,EAAGD,EAAGjmD,GAChC,IAAMq6D,KAAeA,EAAalB,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGjmD,IAE9D,OADAu3C,IACOtsC,EAAGi7C,EAAG8C,EAAU/C,EAAI1O,EAAa,EAAG4T,EAE/C,IACO5T,CACT,EACAmjB,EAAatR,mBAAqB,SAAS3sD,EAAM82C,GAAU,IAAI4X,EAASn1D,KACtE,GAAIu9C,EACF,OAAOv9C,KAAKuxD,cAAcK,WAAWnrD,EAAM82C,GAE7C,IAAIn1B,EAAWF,EAAS0pC,WAAWjC,GAAiBpS,GAChDonB,GAAW,EACXpjB,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,IAAIxnC,EAAM0nC,EAAGC,EACb,EAAG,CAED,IADA3nC,EAAOH,EAASE,QACPjK,KACP,OAAI20C,GAAWvsD,IAASipD,GACfnnC,EAEAynC,cAAcvpD,EAAM86C,IADlB96C,IAASgpD,OACuBlpD,EAEAgiB,EAAKzjB,MAAM,GAFAyjB,GAKxD,IAAI4qC,EAAQ5qC,EAAKzjB,MACjBmrD,EAAIkD,EAAM,GACVjD,EAAIiD,EAAM,GACVwR,IAAaA,EAAWxB,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGkF,GACxD,OAASwP,GACT,OAAOl+D,IAASkpD,GAAkBpnC,EAChCynC,cAAcvpD,EAAMwpD,EAAGC,EAAG3nC,EAC9B,GACF,EACOm8C,CACT,CAGA,SAASE,cAAc18C,EAAU6C,GAC/B,IAAI85C,EAAkBjY,QAAQ1kC,GAC1BowC,EAAQ,CAACpwC,GAAU9b,OAAO2e,GAAQqL,KAAI,SAAS85B,GAQjD,OAPKzD,WAAWyD,GAIL2U,IACT3U,EAAIvD,cAAcuD,IAJlBA,EAAI2U,EACF7T,kBAAkBd,GAClBiB,oBAAoBhuD,MAAMuD,QAAQwpD,GAAKA,EAAI,CAACA,IAIzCA,CACT,IAAG15B,QAAO,SAAS05B,GAAK,OAAkB,IAAXA,EAAEppD,IAAU,IAE3C,GAAqB,IAAjBwxD,EAAM71D,OACR,OAAOylB,EAGT,GAAqB,IAAjBowC,EAAM71D,OAAc,CACtB,IAAIqiE,EAAYxM,EAAM,GACtB,GAAIwM,IAAc58C,GACd28C,GAAmBjY,QAAQkY,IAC3B/X,UAAU7kC,IAAa6kC,UAAU+X,GACnC,OAAOA,CAEX,CAEA,IAAIC,EAAY,IAAI5S,SAASmG,GAkB7B,OAjBIuM,EACFE,EAAYA,EAAUjU,aACZ/D,UAAU7kC,KACpB68C,EAAYA,EAAU3T,aAExB2T,EAAYA,EAAUC,SAAQ,IACpBl+D,KAAOwxD,EAAMnhC,QACrB,SAAS8tC,EAAKnS,GACZ,QAAYvsD,IAAR0+D,EAAmB,CACrB,IAAIn+D,EAAOgsD,EAAIhsD,KACf,QAAaP,IAATO,EACF,OAAOm+D,EAAMn+D,CAEjB,CACF,GACA,GAEKi+D,CACT,CAGA,SAASG,eAAeh9C,EAAUi9C,EAAOnS,GACvC,IAAIoS,EAAexC,aAAa16C,GA0ChC,OAzCAk9C,EAAa3T,kBAAoB,SAASx8C,EAAIsoC,GAC5C,IAAIgE,EAAa,EACbv5B,GAAU,EACd,SAASq9C,SAAStW,EAAMuW,GAAe,IAAInQ,EAASn1D,KAClD+uD,EAAKC,WAAU,SAASkB,EAAGD,GAMzB,QALMkV,GAASG,EAAeH,IAAU1Y,WAAWyD,GACjDmV,SAASnV,EAAGoV,EAAe,IAC4B,IAA9CrwD,EAAGi7C,EAAG8C,EAAU/C,EAAI1O,IAAc4T,KAC3CntC,GAAU,IAEJA,CACV,GAAGu1B,EACL,CAEA,OADA8nB,SAASn9C,EAAU,GACZq5B,CACT,EACA6jB,EAAahS,mBAAqB,SAAS3sD,EAAM82C,GAC/C,IAAIn1B,EAAWF,EAAS0pC,WAAWnrD,EAAM82C,GACrC9pC,EAAQ,GACR8tC,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,KAAO3nC,GAAU,CACf,IAAIG,EAAOH,EAASE,OACpB,IAAkB,IAAdC,EAAKlK,KAAT,CAIA,IAAI6xC,EAAI3nC,EAAKzjB,MAIb,GAHI2B,IAASkpD,KACXO,EAAIA,EAAE,IAEFiV,KAAS1xD,EAAMhR,OAAS0iE,KAAU1Y,WAAWyD,GAIjD,OAAO8C,EAAUzqC,EAAOynC,cAAcvpD,EAAM86C,IAAc2O,EAAG3nC,GAH7D9U,EAAM3Q,KAAKslB,GACXA,EAAW8nC,EAAE0B,WAAWnrD,EAAM82C,EAPhC,MAFEn1B,EAAW3U,EAAMskB,KAarB,CACA,OAAOq4B,cACT,GACF,EACOgV,CACT,CAGA,SAASG,eAAer9C,EAAU8wC,EAAQhuB,GACxC,IAAI04B,EAASC,cAAcz7C,GAC3B,OAAOA,EAAS0oC,QAAQx6B,KACtB,SAAS85B,EAAGD,GAAK,OAAOyT,EAAO1K,EAAO3wD,KAAK2iC,EAASklB,EAAGD,EAAG/nC,GAAU,IACpE88C,SAAQ,EACZ,CAGA,SAASQ,iBAAiBt9C,EAAU2wB,GAClC,IAAI4sB,EAAqB7C,aAAa16C,GA2BtC,OA1BAu9C,EAAmB3+D,KAAOohB,EAASphB,MAAwB,EAAhBohB,EAASphB,KAAU,EAC9D2+D,EAAmBhU,kBAAoB,SAASx8C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACrEuhD,EAAa,EAMjB,OALAr5B,EAAS8mC,WAAU,SAASkB,EAAGD,GAC5B,QAAS1O,IAAsD,IAAxCtsC,EAAG4jC,EAAW0I,IAAc4T,MACpB,IAAhClgD,EAAGi7C,EAAG3O,IAAc4T,EAAiB,GACrC5X,GAEKgE,CACT,EACAkkB,EAAmBrS,mBAAqB,SAAS3sD,EAAM82C,GACrD,IAEIh1B,EAFAH,EAAWF,EAAS0pC,WAAWlC,GAAgBnS,GAC/CgE,EAAa,EAEjB,OAAO,IAAIwO,UAAS,WAClB,QAAKxnC,GAAQg5B,EAAa,KACxBh5B,EAAOH,EAASE,QACPjK,KACAkK,EAGJg5B,EAAa,EAClByO,cAAcvpD,EAAM86C,IAAc1I,GAClCmX,cAAcvpD,EAAM86C,IAAch5B,EAAKzjB,MAAOyjB,EAClD,GACF,EACOk9C,CACT,CAGA,SAAS3M,YAAY5wC,EAAU0wC,EAAYI,GACpCJ,IACHA,EAAa8M,mBAEf,IAAIb,EAAkBjY,QAAQ1kC,GAC1BpR,EAAQ,EACRkU,EAAU9C,EAAS0oC,QAAQx6B,KAC7B,SAAS85B,EAAGD,GAAK,MAAO,CAACA,EAAGC,EAAGp5C,IAASkiD,EAASA,EAAO9I,EAAGD,EAAG/nC,GAAYgoC,EAAE,IAC5EwB,UAMF,OALA1mC,EAAQo3B,MAAK,SAASn2C,EAAG/F,GAAK,OAAO0yD,EAAW3sD,EAAE,GAAI/F,EAAE,KAAO+F,EAAE,GAAK/F,EAAE,EAAE,IAAGgmB,QAC3E24C,EACA,SAAS3U,EAAGnuD,GAAMipB,EAAQjpB,GAAGU,OAAS,CAAG,EACzC,SAASytD,EAAGnuD,GAAMipB,EAAQjpB,GAAKmuD,EAAE,EAAI,GAEhC2U,EAAkBhY,SAAS7hC,GAChC+hC,UAAU7kC,GAAY8kC,WAAWhiC,GACjCmiC,OAAOniC,EACX,CAGA,SAAS26C,WAAWz9C,EAAU0wC,EAAYI,GAIxC,GAHKJ,IACHA,EAAa8M,mBAEX1M,EAAQ,CACV,IAAI7F,EAAQjrC,EAAS0oC,QAClBx6B,KAAI,SAAS85B,EAAGD,GAAK,MAAO,CAACC,EAAG8I,EAAO9I,EAAGD,EAAG/nC,GAAU,IACvDiP,QAAO,SAASlrB,EAAG/F,GAAK,OAAO0/D,WAAWhN,EAAY3sD,EAAE,GAAI/F,EAAE,IAAMA,EAAI+F,CAAC,IAC5E,OAAOknD,GAASA,EAAM,EACxB,CACE,OAAOjrC,EAASiP,QAAO,SAASlrB,EAAG/F,GAAK,OAAO0/D,WAAWhN,EAAY3sD,EAAG/F,GAAKA,EAAI+F,CAAC,GAEvF,CAEA,SAAS25D,WAAWhN,EAAY3sD,EAAG/F,GACjC,IAAI2/D,EAAOjN,EAAW1yD,EAAG+F,GAGzB,OAAiB,IAAT45D,GAAc3/D,IAAM+F,IAAM/F,SAAiCA,GAAMA,IAAO2/D,EAAO,CACzF,CAGA,SAASC,eAAeC,EAASC,EAAQ1N,GACvC,IAAI2N,EAAcrD,aAAamD,GAkD/B,OAjDAE,EAAYn/D,KAAO,IAAIqrD,SAASmG,GAAOliC,KAAI,SAASr0B,GAAK,OAAOA,EAAE+E,IAAI,IAAGsD,MAGzE67D,EAAYjX,UAAY,SAAS/5C,EAAIsoC,GAiBnC,IAHA,IACIh1B,EADAH,EAAWpoB,KAAK4xD,WAAWlC,GAAgBnS,GAE3CgE,EAAa,IACRh5B,EAAOH,EAASE,QAAQjK,OACY,IAAvCpJ,EAAGsT,EAAKzjB,MAAOy8C,IAAcvhD,QAInC,OAAOuhD,CACT,EACA0kB,EAAY7S,mBAAqB,SAAS3sD,EAAM82C,GAC9C,IAAI2oB,EAAY5N,EAAMliC,KAAI,SAASr0B,GAChC,OAAQA,EAAIsoB,SAAStoB,GAAI8lB,YAAY01B,EAAUx7C,EAAEw7C,UAAYx7C,EAAG,IAE/Dw/C,EAAa,EACb4kB,GAAS,EACb,OAAO,IAAIpW,UAAS,WAClB,IAAIqW,EAKJ,OAJKD,IACHC,EAAQF,EAAU9vC,KAAI,SAASr0B,GAAK,OAAOA,EAAEumB,MAAM,IACnD69C,EAASC,EAAMC,MAAK,SAASntB,GAAK,OAAOA,EAAE76B,IAAI,KAE7C8nD,EACK/V,eAEFJ,cACLvpD,EACA86C,IACAykB,EAAOh7D,MAAM,KAAMo7D,EAAMhwC,KAAI,SAAS8iB,GAAK,OAAOA,EAAEp0C,KAAK,KAE7D,GACF,EACOmhE,CACT,CAKA,SAASrC,MAAM7U,EAAM+D,GACnB,OAAOhB,MAAM/C,GAAQ+D,EAAM/D,EAAK37C,YAAY0/C,EAC9C,CAEA,SAASwT,cAAcnT,GACrB,GAAIA,IAAU7uD,OAAO6uD,GACnB,MAAM,IAAIxuD,UAAU,0BAA4BwuD,EAEpD,CAEA,SAASoT,YAAYxX,GAEnB,OADA8H,kBAAkB9H,EAAKjoD,MAChBgoD,WAAWC,EACpB,CAEA,SAAS4U,cAAcz7C,GACrB,OAAO0kC,QAAQ1kC,GAAYykC,cACzBI,UAAU7kC,GAAY4kC,gBACtBG,WACJ,CAEA,SAAS2V,aAAa16C,GACpB,OAAO5jB,OAAO6kB,QAEVyjC,QAAQ1kC,GAAY2kC,SACpBE,UAAU7kC,GAAY8kC,WACtBG,QACA3oD,UAEN,CAEA,SAASs+D,qBACP,OAAI9iE,KAAKqiE,MAAM9Q,aACbvxD,KAAKqiE,MAAM9Q,cACXvxD,KAAK8G,KAAO9G,KAAKqiE,MAAMv7D,KAChB9G,MAEA0sD,IAAIloD,UAAU+sD,YAAYlpD,KAAKrI,KAE1C,CAEA,SAAS0lE,kBAAkBz5D,EAAG/F,GAC5B,OAAO+F,EAAI/F,EAAI,EAAI+F,EAAI/F,GAAK,EAAI,CAClC,CAEA,SAAS4xD,cAAcP,GACrB,IAAIxI,EAAOlnC,YAAY0vC,GACvB,IAAKxI,EAAM,CAGT,IAAK2B,YAAY6G,GACf,MAAM,IAAI5yD,UAAU,oCAAsC4yD,GAE5DxI,EAAOlnC,YAAYwC,SAASktC,GAC9B,CACA,OAAOxI,CACT,CAIE,SAASyX,OAAOC,EAAejzD,GAC7B,IAAIkzD,EAEAC,EAAa,SAASH,OAAOz7C,GAC/B,GAAIA,aAAkB47C,EACpB,OAAO57C,EAET,KAAM/qB,gBAAgB2mE,GACpB,OAAO,IAAIA,EAAW57C,GAExB,IAAK27C,EAAgB,CACnBA,GAAiB,EACjB,IAAI3oD,EAAOzZ,OAAOyZ,KAAK0oD,GACvBG,SAASC,EAAqB9oD,GAC9B8oD,EAAoB//D,KAAOiX,EAAKtb,OAChCokE,EAAoBC,MAAQtzD,EAC5BqzD,EAAoBtU,MAAQx0C,EAC5B8oD,EAAoBE,eAAiBN,CACvC,CACAzmE,KAAK6hE,KAAOryB,IAAIzkB,EAClB,EAEI87C,EAAsBF,EAAWniE,UAAYF,OAAO6kB,OAAO69C,IAG/D,OAFAH,EAAoBzzD,YAAcuzD,EAE3BA,CACT,CAt/BFra,YAAYuM,WAAYrpB,KActBqpB,WAAWvH,GAAK,WACd,OAAOtxD,KAAKkH,UACd,EAEA2xD,WAAWr0D,UAAUwC,SAAW,WAC9B,OAAOhH,KAAK6X,WAAW,eAAgB,IACzC,EAIAghD,WAAWr0D,UAAUmH,IAAM,SAASskD,EAAGgF,GACrC,IAAIn+C,EAAQ9W,KAAK6hE,KAAKl2D,IAAIskD,GAC1B,YAAiB1pD,IAAVuQ,EAAsB9W,KAAK8hE,MAAMn2D,IAAImL,GAAO,GAAKm+C,CAC1D,EAIA4D,WAAWr0D,UAAUqtC,MAAQ,WAC3B,OAAkB,IAAd7xC,KAAK8G,KACA9G,KAELA,KAAK+3D,WACP/3D,KAAK8G,KAAO,EACZ9G,KAAK6hE,KAAKhwB,QACV7xC,KAAK8hE,MAAMjwB,QACJ7xC,MAEFwhE,iBACT,EAEA3I,WAAWr0D,UAAU+H,IAAM,SAAS0jD,EAAGC,GACrC,OAAO6R,iBAAiB/hE,KAAMiwD,EAAGC,EACnC,EAEA2I,WAAWr0D,UAAUo9B,OAAS,SAASquB,GACrC,OAAO8R,iBAAiB/hE,KAAMiwD,EAAG7B,EACnC,EAEAyK,WAAWr0D,UAAU20D,WAAa,WAChC,OAAOn5D,KAAK6hE,KAAK1I,cAAgBn5D,KAAK8hE,MAAM3I,YAC9C,EAEAN,WAAWr0D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACnE,OAAOA,KAAK8hE,MAAM9S,WAChB,SAASmE,GAAS,OAAOA,GAASl+C,EAAGk+C,EAAM,GAAIA,EAAM,GAAIgC,EAAO,GAChE5X,EAEJ,EAEAsb,WAAWr0D,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC/C,OAAOv9C,KAAK8hE,MAAM/Q,eAAea,WAAWnrD,EAAM82C,EACpD,EAEAsb,WAAWr0D,UAAU40D,cAAgB,SAASG,GAC5C,GAAIA,IAAYv5D,KAAK+3D,UACnB,OAAO/3D,KAET,IAAIgiE,EAAShiE,KAAK6hE,KAAKzI,cAAcG,GACjC0I,EAAUjiE,KAAK8hE,MAAM1I,cAAcG,GACvC,OAAKA,EAMEoI,eAAeK,EAAQC,EAAS1I,EAASv5D,KAAKi0D,SALnDj0D,KAAK+3D,UAAYwB,EACjBv5D,KAAK6hE,KAAOG,EACZhiE,KAAK8hE,MAAQG,EACNjiE,KAGX,EAOF64D,WAAW4I,aAAeA,aAE1B5I,WAAWr0D,UAAUqpD,IAAuB,EAC5CgL,WAAWr0D,UAAUwpD,GAAU6K,WAAWr0D,UAAUo9B,OA8DpD0qB,YAAY6V,gBAAiBtV,UAO3BsV,gBAAgB39D,UAAUmH,IAAM,SAAS8K,EAAKw+C,GAC5C,OAAOj1D,KAAKqiE,MAAM12D,IAAI8K,EAAKw+C,EAC7B,EAEAkN,gBAAgB39D,UAAU2hB,IAAM,SAAS1P,GACvC,OAAOzW,KAAKqiE,MAAMl8C,IAAI1P,EACxB,EAEA0rD,gBAAgB39D,UAAUyiE,SAAW,WACnC,OAAOjnE,KAAKqiE,MAAM4E,UACpB,EAEA9E,gBAAgB39D,UAAU+4C,QAAU,WAAY,IAAI4X,EAASn1D,KACvD6iE,EAAmBI,eAAejjE,MAAM,GAI5C,OAHKA,KAAKsiE,WACRO,EAAiBoE,SAAW,WAAa,OAAO9R,EAAOkN,MAAMzR,QAAQrT,SAAS,GAEzEslB,CACT,EAEAV,gBAAgB39D,UAAU4xB,IAAM,SAAS4iC,EAAQhuB,GAAU,IAAImqB,EAASn1D,KAClEgjE,EAAiBD,WAAW/iE,KAAMg5D,EAAQhuB,GAI9C,OAHKhrC,KAAKsiE,WACRU,EAAeiE,SAAW,WAAa,OAAO9R,EAAOkN,MAAMzR,QAAQx6B,IAAI4iC,EAAQhuB,EAAQ,GAElFg4B,CACT,EAEAb,gBAAgB39D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IACvDsR,EAD2DsG,EAASn1D,KAExE,OAAOA,KAAKqiE,MAAMrT,UAChBhvD,KAAKsiE,SACH,SAASpS,EAAGD,GAAK,OAAOh7C,EAAGi7C,EAAGD,EAAGkF,EAAO,GACtCtG,EAAKtR,EAAUgpB,YAAYvmE,MAAQ,EACnC,SAASkwD,GAAK,OAAOj7C,EAAGi7C,EAAG3S,IAAYsR,EAAKA,IAAMsG,EAAO,GAC7D5X,EAEJ,EAEA4kB,gBAAgB39D,UAAUotD,WAAa,SAASnrD,EAAM82C,GACpD,GAAIv9C,KAAKsiE,SACP,OAAOtiE,KAAKqiE,MAAMzQ,WAAWnrD,EAAM82C,GAErC,IAAIn1B,EAAWpoB,KAAKqiE,MAAMzQ,WAAWlC,GAAgBnS,GACjDsR,EAAKtR,EAAUgpB,YAAYvmE,MAAQ,EACvC,OAAO,IAAI+vD,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,OAAOC,EAAKlK,KAAOkK,EACjBynC,cAAcvpD,EAAM82C,IAAYsR,EAAKA,IAAMtmC,EAAKzjB,MAAOyjB,EAC3D,GACF,EAEF45C,gBAAgB39D,UAAUqpD,IAAuB,EAGjDvB,YAAYiW,kBAAmBvV,YAM7BuV,kBAAkB/9D,UAAU4I,SAAW,SAAStI,GAC9C,OAAO9E,KAAKqiE,MAAMj1D,SAAStI,EAC7B,EAEAy9D,kBAAkB/9D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACtEuhD,EAAa,EACjB,OAAOvhD,KAAKqiE,MAAMrT,WAAU,SAASkB,GAAK,OAAOj7C,EAAGi7C,EAAG3O,IAAc4T,EAAO,GAAG5X,EACjF,EAEAglB,kBAAkB/9D,UAAUotD,WAAa,SAASnrD,EAAM82C,GACtD,IAAIn1B,EAAWpoB,KAAKqiE,MAAMzQ,WAAWlC,GAAgBnS,GACjDgE,EAAa,EACjB,OAAO,IAAIwO,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,OAAOC,EAAKlK,KAAOkK,EACjBynC,cAAcvpD,EAAM86C,IAAch5B,EAAKzjB,MAAOyjB,EAClD,GACF,EAIF+jC,YAAYkW,cAAerV,QAMzBqV,cAAch+D,UAAU2hB,IAAM,SAAS1P,GACrC,OAAOzW,KAAKqiE,MAAMj1D,SAASqJ,EAC7B,EAEA+rD,cAAch+D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KACtE,OAAOA,KAAKqiE,MAAMrT,WAAU,SAASkB,GAAK,OAAOj7C,EAAGi7C,EAAGA,EAAGiF,EAAO,GAAG5X,EACtE,EAEAilB,cAAch+D,UAAUotD,WAAa,SAASnrD,EAAM82C,GAClD,IAAIn1B,EAAWpoB,KAAKqiE,MAAMzQ,WAAWlC,GAAgBnS,GACrD,OAAO,IAAIwS,UAAS,WAClB,IAAIxnC,EAAOH,EAASE,OACpB,OAAOC,EAAKlK,KAAOkK,EACjBynC,cAAcvpD,EAAM8hB,EAAKzjB,MAAOyjB,EAAKzjB,MAAOyjB,EAChD,GACF,EAIF+jC,YAAYmW,oBAAqB5V,UAM/B4V,oBAAoBj+D,UAAUysD,SAAW,WACvC,OAAOjxD,KAAKqiE,MAAMzR,OACpB,EAEA6R,oBAAoBj+D,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAC5E,OAAOA,KAAKqiE,MAAMrT,WAAU,SAASmE,GAGnC,GAAIA,EAAO,CACTmT,cAAcnT,GACd,IAAI+T,EAAkBza,WAAW0G,GACjC,OAAOl+C,EACLiyD,EAAkB/T,EAAMxnD,IAAI,GAAKwnD,EAAM,GACvC+T,EAAkB/T,EAAMxnD,IAAI,GAAKwnD,EAAM,GACvCgC,EAEJ,CACF,GAAG5X,EACL,EAEAklB,oBAAoBj+D,UAAUotD,WAAa,SAASnrD,EAAM82C,GACxD,IAAIn1B,EAAWpoB,KAAKqiE,MAAMzQ,WAAWlC,GAAgBnS,GACrD,OAAO,IAAIwS,UAAS,WAClB,OAAa,CACX,IAAIxnC,EAAOH,EAASE,OACpB,GAAIC,EAAKlK,KACP,OAAOkK,EAET,IAAI4qC,EAAQ5qC,EAAKzjB,MAGjB,GAAIquD,EAAO,CACTmT,cAAcnT,GACd,IAAI+T,EAAkBza,WAAW0G,GACjC,OAAOnD,cACLvpD,EACAygE,EAAkB/T,EAAMxnD,IAAI,GAAKwnD,EAAM,GACvC+T,EAAkB/T,EAAMxnD,IAAI,GAAKwnD,EAAM,GACvC5qC,EAEJ,CACF,CACF,GACF,EAGFg6C,kBAAkB/9D,UAAU+sD,YAC5B4Q,gBAAgB39D,UAAU+sD,YAC1BiR,cAAch+D,UAAU+sD,YACxBkR,oBAAoBj+D,UAAU+sD,YAC5BuR,mBAwpBFxW,YAAYka,OAAQ1R,iBA8BlB0R,OAAOhiE,UAAUwC,SAAW,WAC1B,OAAOhH,KAAK6X,WAAWsvD,WAAWnnE,MAAQ,KAAM,IAClD,EAIAwmE,OAAOhiE,UAAU2hB,IAAM,SAAS8pC,GAC9B,OAAOjwD,KAAK+mE,eAAe3wD,eAAe65C,EAC5C,EAEAuW,OAAOhiE,UAAUmH,IAAM,SAASskD,EAAGgF,GACjC,IAAKj1D,KAAKmmB,IAAI8pC,GACZ,OAAOgF,EAET,IAAImS,EAAapnE,KAAK+mE,eAAe9W,GACrC,OAAOjwD,KAAK6hE,KAAO7hE,KAAK6hE,KAAKl2D,IAAIskD,EAAGmX,GAAcA,CACpD,EAIAZ,OAAOhiE,UAAUqtC,MAAQ,WACvB,GAAI7xC,KAAK+3D,UAEP,OADA/3D,KAAK6hE,MAAQ7hE,KAAK6hE,KAAKhwB,QAChB7xC,KAET,IAAI2mE,EAAa3mE,KAAKoT,YACtB,OAAOuzD,EAAWU,SAAWV,EAAWU,OAASC,WAAWtnE,KAAM82D,YACpE,EAEA0P,OAAOhiE,UAAU+H,IAAM,SAAS0jD,EAAGC,GACjC,IAAKlwD,KAAKmmB,IAAI8pC,GACZ,MAAM,IAAI5sD,MAAM,2BAA6B4sD,EAAI,QAAUkX,WAAWnnE,OAExE,GAAIA,KAAK6hE,OAAS7hE,KAAK6hE,KAAK17C,IAAI8pC,IAE1BC,IADalwD,KAAK+mE,eAAe9W,GAEnC,OAAOjwD,KAGX,IAAIgiE,EAAShiE,KAAK6hE,MAAQ7hE,KAAK6hE,KAAKt1D,IAAI0jD,EAAGC,GAC3C,OAAIlwD,KAAK+3D,WAAaiK,IAAWhiE,KAAK6hE,KAC7B7hE,KAEFsnE,WAAWtnE,KAAMgiE,EAC1B,EAEAwE,OAAOhiE,UAAUo9B,OAAS,SAASquB,GACjC,IAAKjwD,KAAKmmB,IAAI8pC,GACZ,OAAOjwD,KAET,IAAIgiE,EAAShiE,KAAK6hE,MAAQ7hE,KAAK6hE,KAAKjgC,OAAOquB,GAC3C,OAAIjwD,KAAK+3D,WAAaiK,IAAWhiE,KAAK6hE,KAC7B7hE,KAEFsnE,WAAWtnE,KAAMgiE,EAC1B,EAEAwE,OAAOhiE,UAAU20D,WAAa,WAC5B,OAAOn5D,KAAK6hE,KAAK1I,YACnB,EAEAqN,OAAOhiE,UAAUotD,WAAa,SAASnrD,EAAM82C,GAAU,IAAI4X,EAASn1D,KAClE,OAAO2sD,cAAc3sD,KAAK+mE,gBAAgB3wC,KAAI,SAASM,EAAGu5B,GAAK,OAAOkF,EAAOxpD,IAAIskD,EAAE,IAAG2B,WAAWnrD,EAAM82C,EACzG,EAEAipB,OAAOhiE,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAC/D,OAAO2sD,cAAc3sD,KAAK+mE,gBAAgB3wC,KAAI,SAASM,EAAGu5B,GAAK,OAAOkF,EAAOxpD,IAAIskD,EAAE,IAAGjB,UAAU/5C,EAAIsoC,EACtG,EAEAipB,OAAOhiE,UAAU40D,cAAgB,SAASG,GACxC,GAAIA,IAAYv5D,KAAK+3D,UACnB,OAAO/3D,KAET,IAAIgiE,EAAShiE,KAAK6hE,MAAQ7hE,KAAK6hE,KAAKzI,cAAcG,GAClD,OAAKA,EAKE+N,WAAWtnE,KAAMgiE,EAAQzI,IAJ9Bv5D,KAAK+3D,UAAYwB,EACjBv5D,KAAK6hE,KAAOG,EACLhiE,KAGX,EAGF,IAAIgnE,GAAkBR,OAAOhiE,UAkB7B,SAAS8iE,WAAWC,EAAYnxC,EAAKmjC,GACnC,IAAIiO,EAASljE,OAAO6kB,OAAO7kB,OAAO8Z,eAAempD,IAGjD,OAFAC,EAAO3F,KAAOzrC,EACdoxC,EAAOzP,UAAYwB,EACZiO,CACT,CAEA,SAASL,WAAWK,GAClB,OAAOA,EAAOV,OAASU,EAAOp0D,YAAYI,MAAQ,QACpD,CAEA,SAASozD,SAASpiE,EAAWuqB,GAC3B,IACEA,EAAM7C,QAAQu7C,QAAQhyD,UAAKlP,EAAW/B,GACxC,CAAE,MAAOgH,GAET,CACF,CAEA,SAASi8D,QAAQjjE,EAAWgP,GAC1BlP,OAAOmH,eAAejH,EAAWgP,EAAM,CACrC7H,IAAK,WACH,OAAO3L,KAAK2L,IAAI6H,EAClB,EACAjH,IAAK,SAASzH,GACZ2vD,UAAUz0D,KAAK+3D,UAAW,sCAC1B/3D,KAAKuM,IAAIiH,EAAM1O,EACjB,GAEJ,CAME,SAAS4qC,IAAI5qC,GACX,OAAOA,QAAwC4iE,WAC7CC,MAAM7iE,KAAW6oD,UAAU7oD,GAASA,EACpC4iE,WAAW1Q,eAAc,SAASzqD,GAChC,IAAIwiD,EAAO9B,YAAYnoD,GACvB+xD,kBAAkB9H,EAAKjoD,MACvBioD,EAAK7iC,SAAQ,SAASgkC,GAAK,OAAO3jD,EAAIo6B,IAAIupB,EAAE,GAC9C,GACJ,CA6HF,SAASyX,MAAMC,GACb,SAAUA,IAAYA,EAASC,IACjC,CA3LAb,GAAgBhZ,GAAUgZ,GAAgBplC,OAC1ColC,GAAgBvP,SAChBuP,GAAgBnK,SAAWnD,GAAamD,SACxCmK,GAAgB/O,MAAQyB,GAAazB,MACrC+O,GAAgB7O,UAAYuB,GAAavB,UACzC6O,GAAgB3O,QAAUqB,GAAarB,QACvC2O,GAAgBzO,UAAYmB,GAAanB,UACzCyO,GAAgBvO,cAAgBiB,GAAajB,cAC7CuO,GAAgBrO,YAAce,GAAaf,YAC3CqO,GAAgB1P,MAAQoC,GAAapC,MACrC0P,GAAgBtP,OAASgC,GAAahC,OACtCsP,GAAgBxP,SAAWkC,GAAalC,SACxCwP,GAAgBhQ,cAAgB0C,GAAa1C,cAC7CgQ,GAAgB9N,UAAYQ,GAAaR,UACzC8N,GAAgB3N,YAAcK,GAAaL,YAkC3C/M,YAAY5c,IAAKslB,eAcftlB,IAAI4hB,GAAK,WACP,OAAOtxD,KAAKkH,UACd,EAEAwoC,IAAIo4B,SAAW,SAAShjE,GACtB,OAAO9E,KAAK2sD,cAAc7nD,GAAOijE,SACnC,EAEAr4B,IAAIlrC,UAAUwC,SAAW,WACvB,OAAOhH,KAAK6X,WAAW,QAAS,IAClC,EAIA63B,IAAIlrC,UAAU2hB,IAAM,SAASrhB,GAC3B,OAAO9E,KAAK6hE,KAAK17C,IAAIrhB,EACvB,EAIA4qC,IAAIlrC,UAAUmiC,IAAM,SAAS7hC,GAC3B,OAAOkjE,UAAUhoE,KAAMA,KAAK6hE,KAAKt1D,IAAIzH,GAAO,GAC9C,EAEA4qC,IAAIlrC,UAAUo9B,OAAS,SAAS98B,GAC9B,OAAOkjE,UAAUhoE,KAAMA,KAAK6hE,KAAKjgC,OAAO98B,GAC1C,EAEA4qC,IAAIlrC,UAAUqtC,MAAQ,WACpB,OAAOm2B,UAAUhoE,KAAMA,KAAK6hE,KAAKhwB,QACnC,EAIAnC,IAAIlrC,UAAUyjE,MAAQ,WAAY,IAAI3P,EAAQjM,EAAQhkD,KAAKnB,UAAW,GAEpE,OAAqB,KADrBoxD,EAAQA,EAAM9hC,QAAO,SAAStqB,GAAK,OAAkB,IAAXA,EAAEpF,IAAU,KAC5CrE,OACDzC,KAES,IAAdA,KAAK8G,MAAe9G,KAAK+3D,WAA8B,IAAjBO,EAAM71D,OAGzCzC,KAAKg3D,eAAc,SAASzqD,GACjC,IAAK,IAAIsiD,EAAK,EAAGA,EAAKyJ,EAAM71D,OAAQosD,IAClC5B,YAAYqL,EAAMzJ,IAAK3iC,SAAQ,SAASpnB,GAAS,OAAOyH,EAAIo6B,IAAI7hC,EAAM,GAE1E,IANS9E,KAAKoT,YAAYklD,EAAM,GAOlC,EAEA5oB,IAAIlrC,UAAU6iC,UAAY,WAAY,IAAIixB,EAAQjM,EAAQhkD,KAAKnB,UAAW,GACxE,GAAqB,IAAjBoxD,EAAM71D,OACR,OAAOzC,KAETs4D,EAAQA,EAAMliC,KAAI,SAAS24B,GAAQ,OAAO9B,YAAY8B,EAAK,IAC3D,IAAImZ,EAAcloE,KAClB,OAAOA,KAAKg3D,eAAc,SAASzqD,GACjC27D,EAAYh8C,SAAQ,SAASpnB,GACtBwzD,EAAM3kB,OAAM,SAASob,GAAQ,OAAOA,EAAK3hD,SAAStI,EAAM,KAC3DyH,EAAIq1B,OAAO98B,EAEf,GACF,GACF,EAEA4qC,IAAIlrC,UAAUoiC,SAAW,WAAY,IAAI0xB,EAAQjM,EAAQhkD,KAAKnB,UAAW,GACvE,GAAqB,IAAjBoxD,EAAM71D,OACR,OAAOzC,KAETs4D,EAAQA,EAAMliC,KAAI,SAAS24B,GAAQ,OAAO9B,YAAY8B,EAAK,IAC3D,IAAImZ,EAAcloE,KAClB,OAAOA,KAAKg3D,eAAc,SAASzqD,GACjC27D,EAAYh8C,SAAQ,SAASpnB,GACvBwzD,EAAM+N,MAAK,SAAStX,GAAQ,OAAOA,EAAK3hD,SAAStI,EAAM,KACzDyH,EAAIq1B,OAAO98B,EAEf,GACF,GACF,EAEA4qC,IAAIlrC,UAAUyzD,MAAQ,WACpB,OAAOj4D,KAAKioE,MAAMj9D,MAAMhL,KAAMkH,UAChC,EAEAwoC,IAAIlrC,UAAU2zD,UAAY,SAASC,GAAS,IAAIE,EAAQjM,EAAQhkD,KAAKnB,UAAW,GAC9E,OAAOlH,KAAKioE,MAAMj9D,MAAMhL,KAAMs4D,EAChC,EAEA5oB,IAAIlrC,UAAU49C,KAAO,SAASwW,GAE5B,OAAOuP,WAAWrP,YAAY94D,KAAM44D,GACtC,EAEAlpB,IAAIlrC,UAAUu0D,OAAS,SAASC,EAAQJ,GAEtC,OAAOuP,WAAWrP,YAAY94D,KAAM44D,EAAYI,GAClD,EAEAtpB,IAAIlrC,UAAU20D,WAAa,WACzB,OAAOn5D,KAAK6hE,KAAK1I,YACnB,EAEAzpB,IAAIlrC,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GAAU,IAAI4X,EAASn1D,KAC5D,OAAOA,KAAK6hE,KAAK7S,WAAU,SAASt4B,EAAGu5B,GAAK,OAAOh7C,EAAGg7C,EAAGA,EAAGkF,EAAO,GAAG5X,EACxE,EAEA7N,IAAIlrC,UAAUotD,WAAa,SAASnrD,EAAM82C,GACxC,OAAOv9C,KAAK6hE,KAAKzrC,KAAI,SAASM,EAAGu5B,GAAK,OAAOA,CAAC,IAAG2B,WAAWnrD,EAAM82C,EACpE,EAEA7N,IAAIlrC,UAAU40D,cAAgB,SAASG,GACrC,GAAIA,IAAYv5D,KAAK+3D,UACnB,OAAO/3D,KAET,IAAIgiE,EAAShiE,KAAK6hE,KAAKzI,cAAcG,GACrC,OAAKA,EAKEv5D,KAAKooE,OAAOpG,EAAQzI,IAJzBv5D,KAAK+3D,UAAYwB,EACjBv5D,KAAK6hE,KAAOG,EACLhiE,KAGX,EAOF0vC,IAAIi4B,MAAQA,MAEZ,IAiCIU,GAjCAR,GAAkB,wBAElBS,GAAe54B,IAAIlrC,UAYvB,SAASwjE,UAAUz7D,EAAKy1D,GACtB,OAAIz1D,EAAIwrD,WACNxrD,EAAIzF,KAAOk7D,EAAOl7D,KAClByF,EAAIs1D,KAAOG,EACJz1D,GAEFy1D,IAAWz1D,EAAIs1D,KAAOt1D,EACX,IAAhBy1D,EAAOl7D,KAAayF,EAAIg8D,UACxBh8D,EAAI67D,OAAOpG,EACf,CAEA,SAASwG,QAAQpyC,EAAKmjC,GACpB,IAAIhtD,EAAMjI,OAAO6kB,OAAOm/C,IAIxB,OAHA/7D,EAAIzF,KAAOsvB,EAAMA,EAAItvB,KAAO,EAC5ByF,EAAIs1D,KAAOzrC,EACX7pB,EAAIwrD,UAAYwB,EACThtD,CACT,CAGA,SAASm7D,WACP,OAAOW,KAAcA,GAAYG,QAAQ1R,YAC3C,CAME,SAASqR,WAAWrjE,GAClB,OAAOA,QAAwC2jE,kBAC7CC,aAAa5jE,GAASA,EACtB2jE,kBAAkBzR,eAAc,SAASzqD,GACvC,IAAIwiD,EAAO9B,YAAYnoD,GACvB+xD,kBAAkB9H,EAAKjoD,MACvBioD,EAAK7iC,SAAQ,SAASgkC,GAAK,OAAO3jD,EAAIo6B,IAAIupB,EAAE,GAC9C,GACJ,CAeF,SAASwY,aAAaC,GACpB,OAAOhB,MAAMgB,IAAoBhb,UAAUgb,EAC7C,CAhEAL,GAAaT,KAAmB,EAChCS,GAAata,GAAUsa,GAAa1mC,OACpC0mC,GAAa/P,UAAY+P,GAAarQ,MACtCqQ,GAAa7P,cAAgB6P,GAAanQ,UAC1CmQ,GAAatR,cAAgB0C,GAAa1C,cAC1CsR,GAAapP,UAAYQ,GAAaR,UACtCoP,GAAajP,YAAcK,GAAaL,YAExCiP,GAAaC,QAAUb,SACvBY,GAAaF,OAASI,QA0BtBlc,YAAY6b,WAAYz4B,KActBy4B,WAAW7W,GAAK,WACd,OAAOtxD,KAAKkH,UACd,EAEAihE,WAAWL,SAAW,SAAShjE,GAC7B,OAAO9E,KAAK2sD,cAAc7nD,GAAOijE,SACnC,EAEAI,WAAW3jE,UAAUwC,SAAW,WAC9B,OAAOhH,KAAK6X,WAAW,eAAgB,IACzC,EAOFswD,WAAWO,aAAeA,aAE1B,IAcIE,GAdAC,GAAsBV,WAAW3jE,UAMrC,SAASskE,eAAe1yC,EAAKmjC,GAC3B,IAAIhtD,EAAMjI,OAAO6kB,OAAO0/C,IAIxB,OAHAt8D,EAAIzF,KAAOsvB,EAAMA,EAAItvB,KAAO,EAC5ByF,EAAIs1D,KAAOzrC,EACX7pB,EAAIwrD,UAAYwB,EACThtD,CACT,CAGA,SAASk8D,kBACP,OAAOG,KAAsBA,GAAoBE,eAAetH,mBAClE,CAME,SAASuH,MAAMjkE,GACb,OAAOA,QAAwCkkE,aAC7CC,QAAQnkE,GAASA,EACjBkkE,aAAaE,WAAWpkE,EAC5B,CAiLF,SAASmkE,QAAQE,GACf,SAAUA,IAAcA,EAAWC,IACrC,CA7MAP,GAAoBhb,IAAuB,EAE3Cgb,GAAoBN,QAAUE,gBAC9BI,GAAoBT,OAASU,eAe7Bxc,YAAYyc,MAAOhU,mBAUjBgU,MAAMzX,GAAK,WACT,OAAOtxD,KAAKkH,UACd,EAEA6hE,MAAMvkE,UAAUwC,SAAW,WACzB,OAAOhH,KAAK6X,WAAW,UAAW,IACpC,EAIAkxD,MAAMvkE,UAAUmH,IAAM,SAASmL,EAAOm+C,GACpC,IAAIoU,EAAOrpE,KAAKspE,MAEhB,IADAxyD,EAAQo4C,UAAUlvD,KAAM8W,GACjBuyD,GAAQvyD,KACbuyD,EAAOA,EAAK/gD,KAEd,OAAO+gD,EAAOA,EAAKvkE,MAAQmwD,CAC7B,EAEA8T,MAAMvkE,UAAU+kE,KAAO,WACrB,OAAOvpE,KAAKspE,OAAStpE,KAAKspE,MAAMxkE,KAClC,EAIAikE,MAAMvkE,UAAU1B,KAAO,WACrB,GAAyB,IAArBoE,UAAUzE,OACZ,OAAOzC,KAIT,IAFA,IAAIy6D,EAAUz6D,KAAK8G,KAAOI,UAAUzE,OAChC4mE,EAAOrpE,KAAKspE,MACPza,EAAK3nD,UAAUzE,OAAS,EAAGosD,GAAM,EAAGA,IAC3Cwa,EAAO,CACLvkE,MAAOoC,UAAU2nD,GACjBvmC,KAAM+gD,GAGV,OAAIrpE,KAAK+3D,WACP/3D,KAAK8G,KAAO2zD,EACZz6D,KAAKspE,MAAQD,EACbrpE,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEFwpE,UAAU/O,EAAS4O,EAC5B,EAEAN,MAAMvkE,UAAUilE,QAAU,SAAS1a,GAEjC,GAAkB,KADlBA,EAAOjC,gBAAgBiC,IACdjoD,KACP,OAAO9G,KAET62D,kBAAkB9H,EAAKjoD,MACvB,IAAI2zD,EAAUz6D,KAAK8G,KACfuiE,EAAOrpE,KAAKspE,MAQhB,OAPAva,EAAKxR,UAAUrxB,SAAQ,SAASpnB,GAC9B21D,IACA4O,EAAO,CACLvkE,MAAOA,EACPwjB,KAAM+gD,EAEV,IACIrpE,KAAK+3D,WACP/3D,KAAK8G,KAAO2zD,EACZz6D,KAAKspE,MAAQD,EACbrpE,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEFwpE,UAAU/O,EAAS4O,EAC5B,EAEAN,MAAMvkE,UAAUuzB,IAAM,WACpB,OAAO/3B,KAAKqF,MAAM,EACpB,EAEA0jE,MAAMvkE,UAAUilC,QAAU,WACxB,OAAOzpC,KAAK8C,KAAKkI,MAAMhL,KAAMkH,UAC/B,EAEA6hE,MAAMvkE,UAAU0kE,WAAa,SAASna,GACpC,OAAO/uD,KAAKypE,QAAQ1a,EACtB,EAEAga,MAAMvkE,UAAU8mC,MAAQ,WACtB,OAAOtrC,KAAK+3B,IAAI/sB,MAAMhL,KAAMkH,UAC9B,EAEA6hE,MAAMvkE,UAAUqtC,MAAQ,WACtB,OAAkB,IAAd7xC,KAAK8G,KACA9G,KAELA,KAAK+3D,WACP/3D,KAAK8G,KAAO,EACZ9G,KAAKspE,WAAQ/iE,EACbvG,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEFgpE,YACT,EAEAD,MAAMvkE,UAAUa,MAAQ,SAASovC,EAAOlxC,GACtC,GAAI6rD,WAAW3a,EAAOlxC,EAAKvD,KAAK8G,MAC9B,OAAO9G,KAET,IAAI+jE,EAAgB1U,aAAa5a,EAAOz0C,KAAK8G,MAE7C,GADkByoD,WAAWhsD,EAAKvD,KAAK8G,QACnB9G,KAAK8G,KAEvB,OAAOiuD,kBAAkBvwD,UAAUa,MAAMgD,KAAKrI,KAAMy0C,EAAOlxC,GAI7D,IAFA,IAAIk3D,EAAUz6D,KAAK8G,KAAOi9D,EACtBsF,EAAOrpE,KAAKspE,MACTvF,KACLsF,EAAOA,EAAK/gD,KAEd,OAAItoB,KAAK+3D,WACP/3D,KAAK8G,KAAO2zD,EACZz6D,KAAKspE,MAAQD,EACbrpE,KAAKi0D,YAAS1tD,EACdvG,KAAKg4D,WAAY,EACVh4D,MAEFwpE,UAAU/O,EAAS4O,EAC5B,EAIAN,MAAMvkE,UAAU40D,cAAgB,SAASG,GACvC,OAAIA,IAAYv5D,KAAK+3D,UACZ/3D,KAEJu5D,EAKEiQ,UAAUxpE,KAAK8G,KAAM9G,KAAKspE,MAAO/P,EAASv5D,KAAKi0D,SAJpDj0D,KAAK+3D,UAAYwB,EACjBv5D,KAAKg4D,WAAY,EACVh4D,KAGX,EAIA+oE,MAAMvkE,UAAUwqD,UAAY,SAAS/5C,EAAIsoC,GACvC,GAAIA,EACF,OAAOv9C,KAAKu9C,UAAUyR,UAAU/5C,GAIlC,IAFA,IAAIssC,EAAa,EACb7f,EAAO1hC,KAAKspE,MACT5nC,IACsC,IAAvCzsB,EAAGysB,EAAK58B,MAAOy8C,IAAcvhD,OAGjC0hC,EAAOA,EAAKpZ,KAEd,OAAOi5B,CACT,EAEAwnB,MAAMvkE,UAAUotD,WAAa,SAASnrD,EAAM82C,GAC1C,GAAIA,EACF,OAAOv9C,KAAKu9C,UAAUqU,WAAWnrD,GAEnC,IAAI86C,EAAa,EACb7f,EAAO1hC,KAAKspE,MAChB,OAAO,IAAIvZ,UAAS,WAClB,GAAIruB,EAAM,CACR,IAAI58B,EAAQ48B,EAAK58B,MAEjB,OADA48B,EAAOA,EAAKpZ,KACL0nC,cAAcvpD,EAAM86C,IAAcz8C,EAC3C,CACA,OAAOsrD,cACT,GACF,EAOF2Y,MAAME,QAAUA,QAEhB,IAoBIS,GApBAN,GAAoB,0BAEpBO,GAAiBZ,MAAMvkE,UAQ3B,SAASglE,UAAU1iE,EAAMuiE,EAAM9P,EAAS7D,GACtC,IAAIt/B,EAAM9xB,OAAO6kB,OAAOwgD,IAMxB,OALAvzC,EAAItvB,KAAOA,EACXsvB,EAAIkzC,MAAQD,EACZjzC,EAAI2hC,UAAYwB,EAChBnjC,EAAI69B,OAASyB,EACbt/B,EAAI4hC,WAAY,EACT5hC,CACT,CAGA,SAAS4yC,aACP,OAAOU,KAAgBA,GAAcF,UAAU,GACjD,CAKA,SAASI,MAAMrd,EAAM9hC,GACnB,IAAIo/C,UAAY,SAASpzD,GAAQ81C,EAAK/nD,UAAUiS,GAAOgU,EAAQhU,EAAM,EAIrE,OAHAnS,OAAOyZ,KAAK0M,GAASyB,QAAQ29C,WAC7BvlE,OAAOgoB,uBACLhoB,OAAOgoB,sBAAsB7B,GAASyB,QAAQ29C,WACzCtd,CACT,CA/BAod,GAAeP,KAAqB,EACpCO,GAAe3S,cAAgB0C,GAAa1C,cAC5C2S,GAAezQ,UAAYQ,GAAaR,UACxCyQ,GAAetQ,YAAcK,GAAaL,YAC1CsQ,GAAexQ,WAAaO,GAAaP,WA6BzC9uC,SAAS0lC,SAAWA,SAEpB6Z,MAAMv/C,SAAU,CAIdqnC,QAAS,WACPmF,kBAAkB72D,KAAK8G,MACvB,IAAIC,EAAQ,IAAI5D,MAAMnD,KAAK8G,MAAQ,GAEnC,OADA9G,KAAKinE,WAAWjY,WAAU,SAASkB,EAAGnuD,GAAMgF,EAAMhF,GAAKmuD,CAAG,IACnDnpD,CACT,EAEAmqD,aAAc,WACZ,OAAO,IAAIqR,kBAAkBviE,KAC/B,EAEA8pE,KAAM,WACJ,OAAO9pE,KAAK4wD,QAAQx6B,KAClB,SAAStxB,GAAS,OAAOA,GAA+B,mBAAfA,EAAMglE,KAAsBhlE,EAAMglE,OAAShlE,CAAK,IACzFilE,QACJ,EAEAz8D,OAAQ,WACN,OAAOtN,KAAK4wD,QAAQx6B,KAClB,SAAStxB,GAAS,OAAOA,GAAiC,mBAAjBA,EAAMwI,OAAwBxI,EAAMwI,SAAWxI,CAAK,IAC7FilE,QACJ,EAEAjZ,WAAY,WACV,OAAO,IAAIqR,gBAAgBniE,MAAM,EACnC,EAEA4zD,MAAO,WAEL,OAAOpkB,IAAIxvC,KAAK8wD,aAClB,EAEAlrC,SAAU,WACRixC,kBAAkB72D,KAAK8G,MACvB,IAAI0X,EAAS,CAAC,EAEd,OADAxe,KAAKgvD,WAAU,SAASkB,EAAGD,GAAMzxC,EAAOyxC,GAAKC,CAAG,IACzC1xC,CACT,EAEAwrD,aAAc,WAEZ,OAAOnR,WAAW74D,KAAK8wD,aACzB,EAEAmZ,aAAc,WAEZ,OAAO9B,WAAWvb,QAAQ5sD,MAAQA,KAAKinE,WAAajnE,KACtD,EAEAkqE,MAAO,WAEL,OAAOx6B,IAAIkd,QAAQ5sD,MAAQA,KAAKinE,WAAajnE,KAC/C,EAEAoxD,SAAU,WACR,OAAO,IAAIoR,cAAcxiE,KAC3B,EAEA4wD,MAAO,WACL,OAAO7D,UAAU/sD,MAAQA,KAAKkxD,eAC5BtE,QAAQ5sD,MAAQA,KAAK8wD,aACrB9wD,KAAKoxD,UACT,EAEA+Y,QAAS,WAEP,OAAOpB,MAAMnc,QAAQ5sD,MAAQA,KAAKinE,WAAajnE,KACjD,EAEA2zD,OAAQ,WAEN,OAAO+J,KAAK9Q,QAAQ5sD,MAAQA,KAAKinE,WAAajnE,KAChD,EAKAgH,SAAU,WACR,MAAO,YACT,EAEA6Q,WAAY,SAASwxD,EAAMrJ,GACzB,OAAkB,IAAdhgE,KAAK8G,KACAuiE,EAAOrJ,EAETqJ,EAAO,IAAMrpE,KAAK4wD,QAAQx6B,IAAIp2B,KAAKoqE,kBAAkBnnE,KAAK,MAAQ,IAAM+8D,CACjF,EAKA5zD,OAAQ,WACN,OAAOw3D,MAAM5jE,KAAM4kE,cAAc5kE,KADFqsD,EAAQhkD,KAAKnB,UAAW,IAEzD,EAEAkG,SAAU,SAAS8nD,GACjB,OAAOl1D,KAAKqmE,MAAK,SAASvhE,GAAS,OAAO+uD,GAAG/uD,EAAOowD,EAAY,GAClE,EAEAlqC,QAAS,WACP,OAAOhrB,KAAK4xD,WAAWjC,GACzB,EAEAhc,MAAO,SAASwvB,EAAWn4B,GACzB6rB,kBAAkB72D,KAAK8G,MACvB,IAAIujE,GAAc,EAOlB,OANArqE,KAAKgvD,WAAU,SAASkB,EAAGD,EAAGjmD,GAC5B,IAAKm5D,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGjmD,GAEjC,OADAqgE,GAAc,GACP,CAEX,IACOA,CACT,EAEA7zC,OAAQ,SAAS2sC,EAAWn4B,GAC1B,OAAO44B,MAAM5jE,KAAMkjE,cAAcljE,KAAMmjE,EAAWn4B,GAAS,GAC7D,EAEA+X,KAAM,SAASogB,EAAWn4B,EAASiqB,GACjC,IAAI9B,EAAQnzD,KAAKsqE,UAAUnH,EAAWn4B,GACtC,OAAOmoB,EAAQA,EAAM,GAAK8B,CAC5B,EAEA/oC,QAAS,SAASq+C,EAAYv/B,GAE5B,OADA6rB,kBAAkB72D,KAAK8G,MAChB9G,KAAKgvD,UAAUhkB,EAAUu/B,EAAW90D,KAAKu1B,GAAWu/B,EAC7D,EAEAtnE,KAAM,SAAS41C,GACbge,kBAAkB72D,KAAK8G,MACvB+xC,OAA0BtyC,IAAdsyC,EAA0B,GAAKA,EAAY,IACvD,IAAI2xB,EAAS,GACTC,GAAU,EAKd,OAJAzqE,KAAKgvD,WAAU,SAASkB,GACtBua,EAAWA,GAAU,EAAUD,GAAU3xB,EACzC2xB,GAAUta,QAAgCA,EAAElpD,WAAa,EAC3D,IACOwjE,CACT,EAEAzsD,KAAM,WACJ,OAAO/d,KAAK4xD,WAAWnC,EACzB,EAEAr5B,IAAK,SAAS4iC,EAAQhuB,GACpB,OAAO44B,MAAM5jE,KAAM+iE,WAAW/iE,KAAMg5D,EAAQhuB,GAC9C,EAEA7T,OAAQ,SAASuzC,EAASC,EAAkB3/B,GAE1C,IAAI4/B,EACAC,EAcJ,OAhBAhU,kBAAkB72D,KAAK8G,MAGnBI,UAAUzE,OAAS,EACrBooE,GAAW,EAEXD,EAAYD,EAEd3qE,KAAKgvD,WAAU,SAASkB,EAAGD,EAAGjmD,GACxB6gE,GACFA,GAAW,EACXD,EAAY1a,GAEZ0a,EAAYF,EAAQriE,KAAK2iC,EAAS4/B,EAAW1a,EAAGD,EAAGjmD,EAEvD,IACO4gE,CACT,EAEAE,YAAa,SAASJ,EAASC,EAAkB3/B,GAC/C,IAAI+/B,EAAW/qE,KAAK8wD,aAAavT,UACjC,OAAOwtB,EAAS5zC,OAAOnsB,MAAM+/D,EAAU7jE,UACzC,EAEAq2C,QAAS,WACP,OAAOqmB,MAAM5jE,KAAMijE,eAAejjE,MAAM,GAC1C,EAEAqF,MAAO,SAASovC,EAAOlxC,GACrB,OAAOqgE,MAAM5jE,KAAM6jE,aAAa7jE,KAAMy0C,EAAOlxC,GAAK,GACpD,EAEA8iE,KAAM,SAASlD,EAAWn4B,GACxB,OAAQhrC,KAAK2zC,MAAMq3B,IAAI7H,GAAYn4B,EACrC,EAEAoX,KAAM,SAASwW,GACb,OAAOgL,MAAM5jE,KAAM84D,YAAY94D,KAAM44D,GACvC,EAEA7tC,OAAQ,WACN,OAAO/qB,KAAK4xD,WAAWlC,GACzB,EAKAub,QAAS,WACP,OAAOjrE,KAAKqF,MAAM,GAAI,EACxB,EAEA6lE,QAAS,WACP,YAAqB3kE,IAAdvG,KAAK8G,KAAmC,IAAd9G,KAAK8G,MAAc9G,KAAKqmE,MAAK,WAAa,OAAO,CAAI,GACxF,EAEAz8B,MAAO,SAASu5B,EAAWn4B,GACzB,OAAO8jB,WACLqU,EAAYnjE,KAAK4wD,QAAQp6B,OAAO2sC,EAAWn4B,GAAWhrC,KAE1D,EAEAmrE,QAAS,SAAS7H,EAASt4B,GACzB,OAAOq4B,eAAerjE,KAAMsjE,EAASt4B,EACvC,EAEAp+B,OAAQ,SAASwoD,GACf,OAAOpB,UAAUh0D,KAAMo1D,EACzB,EAEAnE,SAAU,WACR,IAAI/oC,EAAWloB,KACf,GAAIkoB,EAASspC,OAEX,OAAO,IAAIW,SAASjqC,EAASspC,QAE/B,IAAI4Z,EAAkBljD,EAAS0oC,QAAQx6B,IAAIi1C,aAAana,eAExD,OADAka,EAAgBra,aAAe,WAAa,OAAO7oC,EAAS0oC,OAAO,EAC5Dwa,CACT,EAEAE,UAAW,SAASnI,EAAWn4B,GAC7B,OAAOhrC,KAAKw2B,OAAOw0C,IAAI7H,GAAYn4B,EACrC,EAEAs/B,UAAW,SAASnH,EAAWn4B,EAASiqB,GACtC,IAAIpsD,EAAQosD,EAOZ,OANAj1D,KAAKgvD,WAAU,SAASkB,EAAGD,EAAGjmD,GAC5B,GAAIm5D,EAAU96D,KAAK2iC,EAASklB,EAAGD,EAAGjmD,GAEhC,OADAnB,EAAQ,CAAConD,EAAGC,IACL,CAEX,IACOrnD,CACT,EAEA0iE,QAAS,SAASpI,EAAWn4B,GAC3B,IAAImoB,EAAQnzD,KAAKsqE,UAAUnH,EAAWn4B,GACtC,OAAOmoB,GAASA,EAAM,EACxB,EAEAqY,SAAU,SAASrI,EAAWn4B,EAASiqB,GACrC,OAAOj1D,KAAK8wD,aAAavT,UAAUwF,KAAKogB,EAAWn4B,EAASiqB,EAC9D,EAEAwW,cAAe,SAAStI,EAAWn4B,EAASiqB,GAC1C,OAAOj1D,KAAK8wD,aAAavT,UAAU+sB,UAAUnH,EAAWn4B,EAASiqB,EACnE,EAEAyW,YAAa,SAASvI,EAAWn4B,GAC/B,OAAOhrC,KAAK8wD,aAAavT,UAAUguB,QAAQpI,EAAWn4B,EACxD,EAEAr7B,MAAO,WACL,OAAO3P,KAAK+iD,KAAKkM,WACnB,EAEA0c,QAAS,SAAS3S,EAAQhuB,GACxB,OAAO44B,MAAM5jE,KAAMulE,eAAevlE,KAAMg5D,EAAQhuB,GAClD,EAEAg6B,QAAS,SAASG,GAChB,OAAOvB,MAAM5jE,KAAMklE,eAAellE,KAAMmlE,GAAO,GACjD,EAEApU,aAAc,WACZ,OAAO,IAAI0R,oBAAoBziE,KACjC,EAEA2L,IAAK,SAASigE,EAAW3W,GACvB,OAAOj1D,KAAK+iD,MAAK,SAASrsB,EAAGjgB,GAAO,OAAOo9C,GAAGp9C,EAAKm1D,EAAU,QAAGrlE,EAAW0uD,EAC7E,EAEA4W,MAAO,SAASC,EAAe7W,GAM7B,IALA,IAII1sC,EAJAwjD,EAAS/rE,KAGT+uD,EAAO+I,cAAcgU,KAEhBvjD,EAAOwmC,EAAKzmC,QAAQjK,MAAM,CACjC,IAAI5H,EAAM8R,EAAKzjB,MAEf,IADAinE,EAASA,GAAUA,EAAOpgE,IAAMogE,EAAOpgE,IAAI8K,EAAK23C,GAAWA,KAC5CA,EACb,OAAO6G,CAEX,CACA,OAAO8W,CACT,EAEAC,QAAS,SAAS1I,EAASt4B,GACzB,OAAOw4B,eAAexjE,KAAMsjE,EAASt4B,EACvC,EAEA7kB,IAAK,SAASylD,GACZ,OAAO5rE,KAAK2L,IAAIigE,EAAWxd,KAAaA,CAC1C,EAEA6d,MAAO,SAASH,GACd,OAAO9rE,KAAK6rE,MAAMC,EAAe1d,KAAaA,CAChD,EAEA8d,SAAU,SAASnd,GAEjB,OADAA,EAAgC,mBAAlBA,EAAK3hD,SAA0B2hD,EAAO1kC,SAAS0kC,GACtD/uD,KAAK2zC,OAAM,SAAS7uC,GAAS,OAAOiqD,EAAK3hD,SAAStI,EAAM,GACjE,EAEAqnE,WAAY,SAASpd,GAEnB,OADAA,EAAgC,mBAAlBA,EAAKmd,SAA0Bnd,EAAO1kC,SAAS0kC,IACjDmd,SAASlsE,KACvB,EAEAosE,MAAO,SAASlX,GACd,OAAOl1D,KAAKurE,SAAQ,SAASzmE,GAAS,OAAO+uD,GAAG/uD,EAAOowD,EAAY,GACrE,EAEA6S,OAAQ,WACN,OAAO/nE,KAAK4wD,QAAQx6B,IAAIi2C,WAAWnb,cACrC,EAEAthD,KAAM,WACJ,OAAO5P,KAAK4wD,QAAQrT,UAAU5tC,OAChC,EAEA28D,UAAW,SAASpX,GAClB,OAAOl1D,KAAK8wD,aAAavT,UAAU6uB,MAAMlX,EAC3C,EAEApoD,IAAK,SAAS8rD,GACZ,OAAO+M,WAAW3lE,KAAM44D,EAC1B,EAEA2T,MAAO,SAASvT,EAAQJ,GACtB,OAAO+M,WAAW3lE,KAAM44D,EAAYI,EACtC,EAEA5uD,IAAK,SAASwuD,GACZ,OAAO+M,WAAW3lE,KAAM44D,EAAa4T,IAAI5T,GAAc6T,qBACzD,EAEAC,MAAO,SAAS1T,EAAQJ,GACtB,OAAO+M,WAAW3lE,KAAM44D,EAAa4T,IAAI5T,GAAc6T,qBAAsBzT,EAC/E,EAEA2T,KAAM,WACJ,OAAO3sE,KAAKqF,MAAM,EACpB,EAEAs7C,KAAM,SAASisB,GACb,OAAO5sE,KAAKqF,MAAM8E,KAAK2C,IAAI,EAAG8/D,GAChC,EAEAC,SAAU,SAASD,GACjB,OAAOhJ,MAAM5jE,KAAMA,KAAK4wD,QAAQrT,UAAUoD,KAAKisB,GAAQrvB,UACzD,EAEAuvB,UAAW,SAAS3J,EAAWn4B,GAC7B,OAAO44B,MAAM5jE,KAAMykE,iBAAiBzkE,KAAMmjE,EAAWn4B,GAAS,GAChE,EAEA+hC,UAAW,SAAS5J,EAAWn4B,GAC7B,OAAOhrC,KAAK8sE,UAAU9B,IAAI7H,GAAYn4B,EACxC,EAEA+tB,OAAQ,SAASC,EAAQJ,GACvB,OAAOgL,MAAM5jE,KAAM84D,YAAY94D,KAAM44D,EAAYI,GACnD,EAEAgU,KAAM,SAASJ,GACb,OAAO5sE,KAAKqF,MAAM,EAAG8E,KAAK2C,IAAI,EAAG8/D,GACnC,EAEAK,SAAU,SAASL,GACjB,OAAOhJ,MAAM5jE,KAAMA,KAAK4wD,QAAQrT,UAAUyvB,KAAKJ,GAAQrvB,UACzD,EAEA2vB,UAAW,SAAS/J,EAAWn4B,GAC7B,OAAO44B,MAAM5jE,KAAMskE,iBAAiBtkE,KAAMmjE,EAAWn4B,GACvD,EAEAmiC,UAAW,SAAShK,EAAWn4B,GAC7B,OAAOhrC,KAAKktE,UAAUlC,IAAI7H,GAAYn4B,EACxC,EAEAi8B,SAAU,WACR,OAAOjnE,KAAKkxD,cACd,EAKA8E,SAAU,WACR,OAAOh2D,KAAKi0D,SAAWj0D,KAAKi0D,OAASmZ,aAAaptE,MACpD,IAeF,IAAI8qB,GAAoBT,SAAS7lB,UACjCsmB,GAAkBuiC,IAAwB,EAC1CviC,GAAkBglC,IAAmBhlC,GAAkBC,OACvDD,GAAkBi/C,OAASj/C,GAAkB4mC,QAC7C5mC,GAAkBs/C,iBAAmBiD,YACrCviD,GAAkBje,QAClBie,GAAkBumC,SAAW,WAAa,OAAOrxD,KAAKgH,UAAY,EAClE8jB,GAAkBwiD,MAAQxiD,GAAkB6gD,QAC5C7gD,GAAkB+pB,SAAW/pB,GAAkB1d,SAE/Cw8D,MAAMjd,cAAe,CAInBuV,KAAM,WACJ,OAAO0B,MAAM5jE,KAAM0iE,YAAY1iE,MACjC,EAEAutE,WAAY,SAASvU,EAAQhuB,GAAU,IAAImqB,EAASn1D,KAC9CuhD,EAAa,EACjB,OAAOqiB,MAAM5jE,KACXA,KAAK4wD,QAAQx6B,KACX,SAAS85B,EAAGD,GAAK,OAAO+I,EAAO3wD,KAAK2iC,EAAS,CAACilB,EAAGC,GAAI3O,IAAc4T,EAAO,IAC1EpE,eAEN,EAEAyc,QAAS,SAASxU,EAAQhuB,GAAU,IAAImqB,EAASn1D,KAC/C,OAAO4jE,MAAM5jE,KACXA,KAAK4wD,QAAQsR,OAAO9rC,KAClB,SAAS65B,EAAGC,GAAK,OAAO8I,EAAO3wD,KAAK2iC,EAASilB,EAAGC,EAAGiF,EAAO,IAC1D+M,OAEN,IAIF,IAAIuL,GAAyB9gB,cAAcnoD,UAmL3C,SAAS6nE,UAAUnc,EAAGD,GACpB,OAAOA,CACT,CAEA,SAASob,YAAYnb,EAAGD,GACtB,MAAO,CAACA,EAAGC,EACb,CAEA,SAAS8a,IAAI7H,GACX,OAAO,WACL,OAAQA,EAAUn4D,MAAMhL,KAAMkH,UAChC,CACF,CAEA,SAASslE,IAAIrJ,GACX,OAAO,WACL,OAAQA,EAAUn4D,MAAMhL,KAAMkH,UAChC,CACF,CAEA,SAASmmE,YAAYvoE,GACnB,MAAwB,iBAAVA,EAAqBioC,KAAKC,UAAUloC,GAAS/D,OAAO+D,EACpE,CAEA,SAAS4oE,gBACP,OAAO/e,QAAQznD,UACjB,CAEA,SAASulE,qBAAqBxgE,EAAG/F,GAC/B,OAAO+F,EAAI/F,EAAI,EAAI+F,EAAI/F,GAAK,EAAI,CAClC,CAEA,SAASknE,aAAallD,GACpB,GAAIA,EAASphB,OAAS0N,IACpB,OAAO,EAET,IAAIm5D,EAAUhgB,UAAUzlC,GACpB0lD,EAAQhhB,QAAQ1kC,GAChB0tC,EAAI+X,EAAU,EAAI,EAUtB,OAAOE,iBATI3lD,EAAS8mC,UAClB4e,EACED,EACE,SAASzd,EAAGD,GAAM2F,EAAI,GAAKA,EAAIkY,UAAUpY,KAAKxF,GAAIwF,KAAKzF,IAAM,CAAG,EAChE,SAASC,EAAGD,GAAM2F,EAAIA,EAAIkY,UAAUpY,KAAKxF,GAAIwF,KAAKzF,IAAM,CAAG,EAC7D0d,EACE,SAASzd,GAAM0F,EAAI,GAAKA,EAAIF,KAAKxF,GAAK,CAAG,EACzC,SAASA,GAAM0F,EAAIA,EAAIF,KAAKxF,GAAK,CAAG,GAEZ0F,EAChC,CAEA,SAASiY,iBAAiB/mE,EAAM8uD,GAQ9B,OAPAA,EAAIL,GAAKK,EAAG,YACZA,EAAIL,GAAKK,GAAK,GAAKA,KAAO,GAAI,WAC9BA,EAAIL,GAAKK,GAAK,GAAKA,KAAO,GAAI,GAE9BA,EAAIL,IADJK,GAAKA,EAAI,WAAa,GAAK9uD,GACd8uD,IAAM,GAAI,YAEvBA,EAAIJ,KADJI,EAAIL,GAAKK,EAAIA,IAAM,GAAI,aACXA,IAAM,GAEpB,CAEA,SAASkY,UAAU7hE,EAAG/F,GACpB,OAAO+F,EAAI/F,EAAI,YAAc+F,GAAK,IAAMA,GAAK,GAAK,CACpD,CAwBA,OA1QAwhE,GAAuBlgB,IAAqB,EAC5CkgB,GAAuB3d,IAAmBhlC,GAAkBE,QAC5DyiD,GAAuB1D,OAASj/C,GAAkBlF,SAClD6nD,GAAuBrD,iBAAmB,SAASla,EAAGD,GAAK,OAAOljB,KAAKC,UAAUijB,GAAK,KAAOod,YAAYnd,EAAE,EAI3G0Z,MAAM9c,gBAAiB,CAIrBgE,WAAY,WACV,OAAO,IAAIqR,gBAAgBniE,MAAM,EACnC,EAKAw2B,OAAQ,SAAS2sC,EAAWn4B,GAC1B,OAAO44B,MAAM5jE,KAAMkjE,cAAcljE,KAAMmjE,EAAWn4B,GAAS,GAC7D,EAEAmO,UAAW,SAASgqB,EAAWn4B,GAC7B,IAAImoB,EAAQnzD,KAAKsqE,UAAUnH,EAAWn4B,GACtC,OAAOmoB,EAAQA,EAAM,IAAM,CAC7B,EAEAhyD,QAAS,SAAS+zD,GAChB,IAAIz+C,EAAMzW,KAAKosE,MAAMlX,GACrB,YAAe3uD,IAARkQ,GAAqB,EAAIA,CAClC,EAEAnO,YAAa,SAAS4sD,GACpB,IAAIz+C,EAAMzW,KAAKssE,UAAUpX,GACzB,YAAe3uD,IAARkQ,GAAqB,EAAIA,CAClC,EAEA8mC,QAAS,WACP,OAAOqmB,MAAM5jE,KAAMijE,eAAejjE,MAAM,GAC1C,EAEAqF,MAAO,SAASovC,EAAOlxC,GACrB,OAAOqgE,MAAM5jE,KAAM6jE,aAAa7jE,KAAMy0C,EAAOlxC,GAAK,GACpD,EAEA+sC,OAAQ,SAASx5B,EAAOi3D,GACtB,IAAIC,EAAU9mE,UAAUzE,OAExB,GADAsrE,EAAY5jE,KAAK2C,IAAgB,EAAZihE,EAAe,GACpB,IAAZC,GAA8B,IAAZA,IAAkBD,EACtC,OAAO/tE,KAKT8W,EAAQu4C,aAAav4C,EAAOA,EAAQ,EAAI9W,KAAK4pC,QAAU5pC,KAAK8G,MAC5D,IAAImnE,EAAUjuE,KAAKqF,MAAM,EAAGyR,GAC5B,OAAO8sD,MACL5jE,KACY,IAAZguE,EACEC,EACAA,EAAQ7hE,OAAOuiD,QAAQznD,UAAW,GAAIlH,KAAKqF,MAAMyR,EAAQi3D,IAE/D,EAKAG,cAAe,SAAS/K,EAAWn4B,GACjC,IAAImoB,EAAQnzD,KAAKyrE,cAActI,EAAWn4B,GAC1C,OAAOmoB,EAAQA,EAAM,IAAM,CAC7B,EAEAxjD,MAAO,WACL,OAAO3P,KAAK2L,IAAI,EAClB,EAEAq5D,QAAS,SAASG,GAChB,OAAOvB,MAAM5jE,KAAMklE,eAAellE,KAAMmlE,GAAO,GACjD,EAEAx5D,IAAK,SAASmL,EAAOm+C,GAEnB,OADAn+C,EAAQo4C,UAAUlvD,KAAM8W,IACR,GAAM9W,KAAK8G,OAAS0N,UACjBjO,IAAdvG,KAAK8G,MAAsBgQ,EAAQ9W,KAAK8G,KAC3CmuD,EACAj1D,KAAK+iD,MAAK,SAASrsB,EAAGjgB,GAAO,OAAOA,IAAQK,CAAK,QAAGvQ,EAAW0uD,EACnE,EAEA9uC,IAAK,SAASrP,GAEZ,OADAA,EAAQo4C,UAAUlvD,KAAM8W,KACR,SAAoBvQ,IAAdvG,KAAK8G,KACzB9G,KAAK8G,OAAS0N,KAAYsC,EAAQ9W,KAAK8G,MACd,IAAzB9G,KAAKmB,QAAQ2V,GAEjB,EAEAq3D,UAAW,SAASt1B,GAClB,OAAO+qB,MAAM5jE,KAAMwlE,iBAAiBxlE,KAAM64C,GAC5C,EAEAu1B,WAAY,WACV,IAAIzS,EAAY,CAAC37D,MAAMoM,OAAOuiD,QAAQznD,YAClCmnE,EAASvI,eAAe9lE,KAAK4wD,QAAS5D,WAAWsE,GAAIqK,GACrD2S,EAAcD,EAAOrJ,SAAQ,GAIjC,OAHIqJ,EAAOvnE,OACTwnE,EAAYxnE,KAAOunE,EAAOvnE,KAAO60D,EAAUl5D,QAEtCmhE,MAAM5jE,KAAMsuE,EACrB,EAEAvG,OAAQ,WACN,OAAOrT,MAAM,EAAG10D,KAAK8G,KACvB,EAEA8I,KAAM,WACJ,OAAO5P,KAAK2L,KAAK,EACnB,EAEAmhE,UAAW,SAAS3J,EAAWn4B,GAC7B,OAAO44B,MAAM5jE,KAAMykE,iBAAiBzkE,KAAMmjE,EAAWn4B,GAAS,GAChE,EAEAujC,IAAK,WAEH,OAAO3K,MAAM5jE,KAAM8lE,eAAe9lE,KAAM0tE,cADxB,CAAC1tE,MAAMoM,OAAOuiD,QAAQznD,aAExC,EAEAsnE,QAAS,SAASxI,GAChB,IAAIrK,EAAYhN,QAAQznD,WAExB,OADAy0D,EAAU,GAAK37D,KACR4jE,MAAM5jE,KAAM8lE,eAAe9lE,KAAMgmE,EAAQrK,GAClD,IAIF7O,gBAAgBtoD,UAAUipD,IAAuB,EACjDX,gBAAgBtoD,UAAUqpD,IAAuB,EAIjD+b,MAAM3c,YAAa,CAIjBthD,IAAK,SAAS7G,EAAOmwD,GACnB,OAAOj1D,KAAKmmB,IAAIrhB,GAASA,EAAQmwD,CACnC,EAEA7nD,SAAU,SAAStI,GACjB,OAAO9E,KAAKmmB,IAAIrhB,EAClB,EAKAijE,OAAQ,WACN,OAAO/nE,KAAKinE,UACd,IAIFha,YAAYzoD,UAAU2hB,IAAM2E,GAAkB1d,SAC9C6/C,YAAYzoD,UAAUqwC,SAAWoY,YAAYzoD,UAAU4I,SAKvDw8D,MAAM/c,SAAUF,cAAcnoD,WAC9BolE,MAAM5c,WAAYF,gBAAgBtoD,WAClColE,MAAMzc,OAAQF,YAAYzoD,WAE1BolE,MAAM9U,gBAAiBnI,cAAcnoD,WACrColE,MAAM7U,kBAAmBjI,gBAAgBtoD,WACzColE,MAAM5U,cAAe/H,YAAYzoD,WAuEjB,CAEd6lB,SAEAqiC,IACAn4B,WACAib,IACAqpB,WACA6E,KACAqL,MACAr5B,IACAy4B,WAEA3B,OACA9R,MACAJ,OAEAT,GACAR,OAMJ,CAx2JkF1zD,cCRrD,mBAAlB2E,OAAO6kB,OAEhBtpB,EAAOD,QAAU,SAAS6uE,SAASliB,EAAMmiB,GACnCA,IACFniB,EAAKoiB,OAASD,EACdniB,EAAK/nD,UAAYF,OAAO6kB,OAAOulD,EAAUlqE,UAAW,CAClD4O,YAAa,CACXtO,MAAOynD,EACP7gD,YAAY,EACZ4H,UAAU,EACVC,cAAc,KAItB,EAGA1T,EAAOD,QAAU,SAAS6uE,SAASliB,EAAMmiB,GACvC,GAAIA,EAAW,CACbniB,EAAKoiB,OAASD,EACd,IAAIE,SAAW,WAAa,EAC5BA,SAASpqE,UAAYkqE,EAAUlqE,UAC/B+nD,EAAK/nD,UAAY,IAAIoqE,SACrBriB,EAAK/nD,UAAU4O,YAAcm5C,CAC/B,CACF,aCzBF1sD,EAAOD,QAAU,SAAS+G,EAAMkoE,EAAUC,EAAMC,GAC5C,IACIC,EAAO,IAAIC,UADgB,IAARF,EAAuB,CAACA,EAAKpoE,GAAQ,CAACA,GAC/B,CAACF,KAAMqoE,GAAQ,6BAC7C,QAA2C,IAAhC10D,OAAOW,UAAUm0D,WAKxB90D,OAAOW,UAAUm0D,WAAWF,EAAMH,OAEjC,CACD,IAAIM,EAAW/0D,OAAOg1D,KAAOh1D,OAAOg1D,IAAIC,gBAAmBj1D,OAAOg1D,IAAIC,gBAAgBL,GAAQ50D,OAAOk1D,UAAUD,gBAAgBL,GAC3HO,EAAWz2D,SAASG,cAAc,KACtCs2D,EAASn2D,MAAMyU,QAAU,OACzB0hD,EAASC,KAAOL,EAChBI,EAASttC,aAAa,WAAY4sC,QAMD,IAAtBU,EAASE,UAChBF,EAASttC,aAAa,SAAU,UAGpCnpB,SAAS0B,KAAKC,YAAY80D,GAC1BA,EAASG,QAGTC,YAAW,WACP72D,SAAS0B,KAAKY,YAAYm0D,GAC1Bn1D,OAAOg1D,IAAIQ,gBAAgBT,EAC/B,GAAG,IACP,CACJ,mBCxBA,IAGIU,EAAM,IAGNC,EAAY,kBAGZC,EAAS,aAGTC,EAAa,qBAGbC,EAAa,aAGbC,EAAY,cAGZC,EAAe9mE,SAGf+mE,EAA8B,iBAAV,EAAAzqD,GAAsB,EAAAA,GAAU,EAAAA,EAAOrhB,SAAWA,QAAU,EAAAqhB,EAGhF0qD,EAA0B,iBAAR3qD,MAAoBA,MAAQA,KAAKphB,SAAWA,QAAUohB,KAGxEhmB,EAAO0wE,GAAcC,GAAY10D,SAAS,cAATA,GAUjC20D,GAPchsE,OAAOE,UAOQwC,SAG7BupE,GAAYpmE,KAAK2C,IACjB0jE,GAAYrmE,KAAKC,IAkBjBqmE,IAAM,WACR,OAAO/wE,EAAKoY,KAAK24D,KACnB,EA2MA,SAASr0D,SAAStX,GAChB,IAAI2B,SAAc3B,EAClB,QAASA,IAAkB,UAAR2B,GAA4B,YAARA,EACzC,CA2EA,SAASiqE,SAAS5rE,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAhCF,SAAS8rB,SAAS9rB,GAChB,MAAuB,iBAATA,GAtBhB,SAAS6rE,aAAa7rE,GACpB,QAASA,GAAyB,iBAATA,CAC3B,CAqBK6rE,CAAa7rE,IAAUwrE,GAAejoE,KAAKvD,IAAUgrE,CAC1D,CA6BMl/C,CAAS9rB,GACX,OAAO+qE,EAET,GAAIzzD,SAAStX,GAAQ,CACnB,IAAIswD,EAAgC,mBAAjBtwD,EAAMmB,QAAwBnB,EAAMmB,UAAYnB,EACnEA,EAAQsX,SAASg5C,GAAUA,EAAQ,GAAMA,CAC3C,CACA,GAAoB,iBAATtwD,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQA,EAAMlE,QAAQmvE,EAAQ,IAC9B,IAAIa,EAAWX,EAAW3uE,KAAKwD,GAC/B,OAAQ8rE,GAAYV,EAAU5uE,KAAKwD,GAC/BqrE,EAAarrE,EAAMO,MAAM,GAAIurE,EAAW,EAAI,GAC3CZ,EAAW1uE,KAAKwD,GAAS+qE,GAAO/qE,CACvC,CAEAjF,EAAOD,QAtPP,SAASixE,SAAS56D,EAAM66D,EAAMl6D,GAC5B,IAAIm6D,EACAC,EACAC,EACA1zD,EACA2zD,EACAC,EACAC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,GAAmB,mBAARt7D,EACT,MAAM,IAAItR,UArIQ,uBA+IpB,SAAS6sE,WAAWC,GAClB,IAAIvtD,EAAO6sD,EACPr4C,EAAUs4C,EAKd,OAHAD,EAAWC,OAAWzqE,EACtB6qE,EAAiBK,EACjBl0D,EAAStH,EAAKjL,MAAM0tB,EAASxU,EAE/B,CAmBA,SAASwtD,aAAaD,GACpB,IAAIE,EAAoBF,EAAON,EAM/B,YAAyB5qE,IAAjB4qE,GAA+BQ,GAAqBb,GACzDa,EAAoB,GAAOL,GANJG,EAAOL,GAM8BH,CACjE,CAEA,SAASW,eACP,IAAIH,EAAOhB,MACX,GAAIiB,aAAaD,GACf,OAAOI,aAAaJ,GAGtBP,EAAUvB,WAAWiC,aAzBvB,SAASE,cAAcL,GACrB,IAEIl0D,EAASuzD,GAFWW,EAAON,GAI/B,OAAOG,EAASd,GAAUjzD,EAAQ0zD,GAHRQ,EAAOL,IAGkC7zD,CACrE,CAmBqCu0D,CAAcL,GACnD,CAEA,SAASI,aAAaJ,GAKpB,OAJAP,OAAU3qE,EAINgrE,GAAYR,EACPS,WAAWC,IAEpBV,EAAWC,OAAWzqE,EACfgX,EACT,CAcA,SAASw0D,YACP,IAAIN,EAAOhB,MACPuB,EAAaN,aAAaD,GAM9B,GAJAV,EAAW7pE,UACX8pE,EAAWhxE,KACXmxE,EAAeM,EAEXO,EAAY,CACd,QAAgBzrE,IAAZ2qE,EACF,OAvEN,SAASe,YAAYR,GAMnB,OAJAL,EAAiBK,EAEjBP,EAAUvB,WAAWiC,aAAcd,GAE5BO,EAAUG,WAAWC,GAAQl0D,CACtC,CAgEa00D,CAAYd,GAErB,GAAIG,EAGF,OADAJ,EAAUvB,WAAWiC,aAAcd,GAC5BU,WAAWL,EAEtB,CAIA,YAHgB5qE,IAAZ2qE,IACFA,EAAUvB,WAAWiC,aAAcd,IAE9BvzD,CACT,CAGA,OAxGAuzD,EAAOJ,SAASI,IAAS,EACrB10D,SAASxF,KACXy6D,IAAYz6D,EAAQy6D,QAEpBJ,GADAK,EAAS,YAAa16D,GACH25D,GAAUG,SAAS95D,EAAQq6D,UAAY,EAAGH,GAAQG,EACrEM,EAAW,aAAc36D,IAAYA,EAAQ26D,SAAWA,GAiG1DQ,UAAUG,OAnCV,SAASA,cACS3rE,IAAZ2qE,GACFiB,aAAajB,GAEfE,EAAiB,EACjBL,EAAWI,EAAeH,EAAWE,OAAU3qE,CACjD,EA8BAwrE,UAAUK,MA5BV,SAASA,QACP,YAAmB7rE,IAAZ2qE,EAAwB3zD,EAASs0D,aAAapB,MACvD,EA2BOsB,SACT,mBC1PA,IAIIhjC,EAJY,EAAQ,MAITsjC,CAHJ,EAAQ,OAGY,YAE/BxyE,EAAOD,QAAUmvC,kBCNjB,IAAIujC,EAAY,EAAQ,OACpBC,EAAa,EAAQ,OACrBC,EAAU,EAAQ,OAClBC,EAAU,EAAQ,OAClBC,EAAU,EAAQ,OAStB,SAASC,KAAK3nD,GACZ,IAAIlU,GAAS,EACTrU,EAAoB,MAAXuoB,EAAkB,EAAIA,EAAQvoB,OAG3C,IADAzC,KAAK6xC,UACI/6B,EAAQrU,GAAQ,CACvB,IAAI0wD,EAAQnoC,EAAQlU,GACpB9W,KAAKuM,IAAI4mD,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGAwf,KAAKnuE,UAAUqtC,MAAQygC,EACvBK,KAAKnuE,UAAkB,OAAI+tE,EAC3BI,KAAKnuE,UAAUmH,IAAM6mE,EACrBG,KAAKnuE,UAAU2hB,IAAMssD,EACrBE,KAAKnuE,UAAU+H,IAAMmmE,EAErB7yE,EAAOD,QAAU+yE,sBC/BjB,IAAIC,EAAa,EAAQ,MACrBC,EAAa,EAAQ,MAYzB,SAASC,YAAYhuE,GACnB9E,KAAK+yE,YAAcjuE,EACnB9E,KAAKgzE,YAAc,GACnBhzE,KAAKizE,QAAU,EACfjzE,KAAKkzE,cAAe,EACpBlzE,KAAKmzE,cAAgB,GACrBnzE,KAAKozE,cAfgB,WAgBrBpzE,KAAKqzE,UAAY,EACnB,CAGAP,YAAYtuE,UAAYouE,EAAWC,EAAWruE,WAC9CsuE,YAAYtuE,UAAU4O,YAAc0/D,YAEpCjzE,EAAOD,QAAUkzE,6BC3BjB,IAAIQ,EAAiB,EAAQ,OACzBC,EAAkB,EAAQ,OAC1BC,EAAe,EAAQ,OACvBC,EAAe,EAAQ,OACvBC,EAAe,EAAQ,OAS3B,SAASC,UAAU3oD,GACjB,IAAIlU,GAAS,EACTrU,EAAoB,MAAXuoB,EAAkB,EAAIA,EAAQvoB,OAG3C,IADAzC,KAAK6xC,UACI/6B,EAAQrU,GAAQ,CACvB,IAAI0wD,EAAQnoC,EAAQlU,GACpB9W,KAAKuM,IAAI4mD,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGAwgB,UAAUnvE,UAAUqtC,MAAQyhC,EAC5BK,UAAUnvE,UAAkB,OAAI+uE,EAChCI,UAAUnvE,UAAUmH,IAAM6nE,EAC1BG,UAAUnvE,UAAU2hB,IAAMstD,EAC1BE,UAAUnvE,UAAU+H,IAAMmnE,EAE1B7zE,EAAOD,QAAU+zE,0BC/BjB,IAAIf,EAAa,EAAQ,MACrBC,EAAa,EAAQ,MASzB,SAASe,cAAc9uE,EAAO+uE,GAC5B7zE,KAAK+yE,YAAcjuE,EACnB9E,KAAKgzE,YAAc,GACnBhzE,KAAK8zE,YAAcD,EACnB7zE,KAAK+zE,UAAY,EACjB/zE,KAAKg0E,gBAAaztE,CACpB,CAEAqtE,cAAcpvE,UAAYouE,EAAWC,EAAWruE,WAChDovE,cAAcpvE,UAAU4O,YAAcwgE,cAEtC/zE,EAAOD,QAAUg0E,+BCrBjB,IAIIpkC,EAJY,EAAQ,MAId6iC,CAHC,EAAQ,OAGO,OAE1BxyE,EAAOD,QAAU4vC,mBCNjB,IAAIykC,EAAgB,EAAQ,OACxBC,EAAiB,EAAQ,OACzBC,EAAc,EAAQ,MACtBC,EAAc,EAAQ,OACtBC,EAAc,EAAQ,OAS1B,SAASC,SAAStpD,GAChB,IAAIlU,GAAS,EACTrU,EAAoB,MAAXuoB,EAAkB,EAAIA,EAAQvoB,OAG3C,IADAzC,KAAK6xC,UACI/6B,EAAQrU,GAAQ,CACvB,IAAI0wD,EAAQnoC,EAAQlU,GACpB9W,KAAKuM,IAAI4mD,EAAM,GAAIA,EAAM,GAC3B,CACF,CAGAmhB,SAAS9vE,UAAUqtC,MAAQoiC,EAC3BK,SAAS9vE,UAAkB,OAAI0vE,EAC/BI,SAAS9vE,UAAUmH,IAAMwoE,EACzBG,SAAS9vE,UAAU2hB,IAAMiuD,EACzBE,SAAS9vE,UAAU+H,IAAM8nE,EAEzBx0E,EAAOD,QAAU00E,0BC/BjB,IAIIrsC,EAJY,EAAQ,MAIVoqC,CAHH,EAAQ,OAGW,WAE9BxyE,EAAOD,QAAUqoC,mBCNjB,IAIIyH,EAJY,EAAQ,MAId2iC,CAHC,EAAQ,OAGO,OAE1BxyE,EAAOD,QAAU8vC,mBCNjB,IAAI4kC,EAAW,EAAQ,OACnBC,EAAc,EAAQ,OACtBC,EAAc,EAAQ,OAU1B,SAASC,SAAS1pD,GAChB,IAAIjU,GAAS,EACTrU,EAAmB,MAAVsoB,EAAiB,EAAIA,EAAOtoB,OAGzC,IADAzC,KAAK00E,SAAW,IAAIJ,IACXx9D,EAAQrU,GACfzC,KAAK2mC,IAAI5b,EAAOjU,GAEpB,CAGA29D,SAASjwE,UAAUmiC,IAAM8tC,SAASjwE,UAAU1B,KAAOyxE,EACnDE,SAASjwE,UAAU2hB,IAAMquD,EAEzB30E,EAAOD,QAAU60E,0BC1BjB,IAAId,EAAY,EAAQ,OACpBgB,EAAa,EAAQ,OACrBC,EAAc,EAAQ,OACtBC,EAAW,EAAQ,OACnBC,EAAW,EAAQ,OACnBC,EAAW,EAAQ,OASvB,SAAShM,MAAM/9C,GACb,IAAIrkB,EAAO3G,KAAK00E,SAAW,IAAIf,EAAU3oD,GACzChrB,KAAK8G,KAAOH,EAAKG,IACnB,CAGAiiE,MAAMvkE,UAAUqtC,MAAQ8iC,EACxB5L,MAAMvkE,UAAkB,OAAIowE,EAC5B7L,MAAMvkE,UAAUmH,IAAMkpE,EACtB9L,MAAMvkE,UAAU2hB,IAAM2uD,EACtB/L,MAAMvkE,UAAU+H,IAAMwoE,EAEtBl1E,EAAOD,QAAUmpE,uBC1BjB,IAGIllE,EAHO,EAAQ,OAGDA,OAElBhE,EAAOD,QAAUiE,mBCLjB,IAGIX,EAHO,EAAQ,OAGGA,WAEtBrD,EAAOD,QAAUsD,mBCLjB,IAIIujB,EAJY,EAAQ,MAIV4rD,CAHH,EAAQ,OAGW,WAE9BxyE,EAAOD,QAAU6mB,aCcjB5mB,EAAOD,QAVP,SAASoL,MAAMiL,EAAMyiB,EAASxU,GAC5B,OAAQA,EAAKzhB,QACX,KAAK,EAAG,OAAOwT,EAAK5N,KAAKqwB,GACzB,KAAK,EAAG,OAAOziB,EAAK5N,KAAKqwB,EAASxU,EAAK,IACvC,KAAK,EAAG,OAAOjO,EAAK5N,KAAKqwB,EAASxU,EAAK,GAAIA,EAAK,IAChD,KAAK,EAAG,OAAOjO,EAAK5N,KAAKqwB,EAASxU,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE3D,OAAOjO,EAAKjL,MAAM0tB,EAASxU,EAC7B,aCGArkB,EAAOD,QAZP,SAASo1E,UAAUjuE,EAAOkuE,GAIxB,IAHA,IAAIn+D,GAAS,EACTrU,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,SAE9BqU,EAAQrU,IAC8B,IAAzCwyE,EAASluE,EAAM+P,GAAQA,EAAO/P,KAIpC,OAAOA,CACT,aCKAlH,EAAOD,QAfP,SAASs1E,YAAYnuE,EAAOo8D,GAM1B,IALA,IAAIrsD,GAAS,EACTrU,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,OACnC0yE,EAAW,EACX53D,EAAS,KAEJzG,EAAQrU,GAAQ,CACvB,IAAIqC,EAAQiC,EAAM+P,GACdqsD,EAAUr+D,EAAOgS,EAAO/P,KAC1BwW,EAAO43D,KAAcrwE,EAEzB,CACA,OAAOyY,CACT,mBCtBA,IAAI63D,EAAc,EAAQ,OAgB1Bv1E,EAAOD,QALP,SAASy1E,cAActuE,EAAOjC,GAE5B,SADsB,MAATiC,EAAgB,EAAIA,EAAMtE,SACpB2yE,EAAYruE,EAAOjC,EAAO,IAAM,CACrD,mBCdA,IAAIwwE,EAAY,EAAQ,OACpBC,EAAc,EAAQ,OACtB7uE,EAAU,EAAQ,MAClBL,EAAW,EAAQ,OACnBmvE,EAAU,EAAQ,OAClBC,EAAe,EAAQ,OAMvBr/D,EAHc9R,OAAOE,UAGQ4R,eAqCjCvW,EAAOD,QA3BP,SAAS81E,cAAc5wE,EAAO6wE,GAC5B,IAAIC,EAAQlvE,EAAQ5B,GAChB+wE,GAASD,GAASL,EAAYzwE,GAC9BgxE,GAAUF,IAAUC,GAASxvE,EAASvB,GACtCixE,GAAUH,IAAUC,IAAUC,GAAUL,EAAa3wE,GACrDkxE,GAAcJ,GAASC,GAASC,GAAUC,EAC1Cx4D,GAASy4D,GAAcV,EAAUxwE,EAAMrC,OAAQ1B,QAAU,GACzD0B,GAAS8a,GAAO9a,OAEpB,IAAK,IAAIgU,MAAO3R,GACT6wE,IAAav/D,EAAe/N,KAAKvD,EAAO2R,KACvCu/D,KAEQ,UAAPv/D,IAECq/D,IAAkB,UAAPr/D,IAA0B,UAAPA,KAE9Bs/D,IAAkB,UAAPt/D,IAA0B,cAAPA,IAA8B,cAAPA,KAEtD++D,EAAQ/+D,GAAKhU,MAElB8a,GAAOza,KAAK2T,IAGhB,OAAO8G,EACT,aC1BA1d,EAAOD,QAXP,SAASq2E,SAASlvE,EAAOkuE,GAKvB,IAJA,IAAIn+D,GAAS,EACTrU,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,OACnC8a,EAASpa,MAAMV,KAEVqU,EAAQrU,GACf8a,EAAOzG,GAASm+D,EAASluE,EAAM+P,GAAQA,EAAO/P,GAEhD,OAAOwW,CACT,aCCA1d,EAAOD,QAXP,SAASo4B,UAAUjxB,EAAOgkB,GAKxB,IAJA,IAAIjU,GAAS,EACTrU,EAASsoB,EAAOtoB,OAChBuG,EAASjC,EAAMtE,SAEVqU,EAAQrU,GACfsE,EAAMiC,EAAS8N,GAASiU,EAAOjU,GAEjC,OAAO/P,CACT,aCQAlH,EAAOD,QAbP,SAASs2E,YAAYnvE,EAAOkuE,EAAUkB,EAAaC,GACjD,IAAIt/D,GAAS,EACTrU,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,OAKvC,IAHI2zE,GAAa3zE,IACf0zE,EAAcpvE,IAAQ+P,MAEfA,EAAQrU,GACf0zE,EAAclB,EAASkB,EAAapvE,EAAM+P,GAAQA,EAAO/P,GAE3D,OAAOovE,CACT,aCDAt2E,EAAOD,QAZP,SAASy2E,UAAUtvE,EAAOo8D,GAIxB,IAHA,IAAIrsD,GAAS,EACTrU,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,SAE9BqU,EAAQrU,GACf,GAAI0gE,EAAUp8D,EAAM+P,GAAQA,EAAO/P,GACjC,OAAO,EAGX,OAAO,CACT,aCTAlH,EAAOD,QAJP,SAAS02E,aAAatxE,GACpB,OAAOA,EAAO2P,MAAM,GACtB,aCRA,IAAI4hE,EAAc,4CAalB12E,EAAOD,QAJP,SAAS42E,WAAWxxE,GAClB,OAAOA,EAAOnE,MAAM01E,IAAgB,EACtC,mBCZA,IAAIE,EAAkB,EAAQ,OAC1BC,EAAK,EAAQ,OAkBjB72E,EAAOD,QAPP,SAAS+2E,iBAAiBn4D,EAAQ/H,EAAK3R,SACtByB,IAAVzB,IAAwB4xE,EAAGl4D,EAAO/H,GAAM3R,SAC9ByB,IAAVzB,KAAyB2R,KAAO+H,KACnCi4D,EAAgBj4D,EAAQ/H,EAAK3R,EAEjC,mBCjBA,IAAI2xE,EAAkB,EAAQ,OAC1BC,EAAK,EAAQ,OAMbtgE,EAHc9R,OAAOE,UAGQ4R,eAoBjCvW,EAAOD,QARP,SAASg3E,YAAYp4D,EAAQ/H,EAAK3R,GAChC,IAAI+xE,EAAWr4D,EAAO/H,GAChBL,EAAe/N,KAAKmW,EAAQ/H,IAAQigE,EAAGG,EAAU/xE,UACxCyB,IAAVzB,GAAyB2R,KAAO+H,IACnCi4D,EAAgBj4D,EAAQ/H,EAAK3R,EAEjC,mBCzBA,IAAI4xE,EAAK,EAAQ,OAoBjB72E,EAAOD,QAVP,SAASk3E,aAAa/vE,EAAO0P,GAE3B,IADA,IAAIhU,EAASsE,EAAMtE,OACZA,KACL,GAAIi0E,EAAG3vE,EAAMtE,GAAQ,GAAIgU,GACvB,OAAOhU,EAGX,OAAQ,CACV,mBClBA,IAAIs0E,EAAa,EAAQ,OACrBh5D,EAAO,EAAQ,MAenBle,EAAOD,QAJP,SAASo3E,WAAWx4D,EAAQX,GAC1B,OAAOW,GAAUu4D,EAAWl5D,EAAQE,EAAKF,GAASW,EACpD,mBCdA,IAAIu4D,EAAa,EAAQ,OACrBE,EAAS,EAAQ,OAerBp3E,EAAOD,QAJP,SAASs3E,aAAa14D,EAAQX,GAC5B,OAAOW,GAAUu4D,EAAWl5D,EAAQo5D,EAAOp5D,GAASW,EACtD,mBCdA,IAAI/S,EAAiB,EAAQ,OAwB7B5L,EAAOD,QAbP,SAAS62E,gBAAgBj4D,EAAQ/H,EAAK3R,GACzB,aAAP2R,GAAsBhL,EACxBA,EAAe+S,EAAQ/H,EAAK,CAC1B,cAAgB,EAChB,YAAc,EACd,MAAS3R,EACT,UAAY,IAGd0Z,EAAO/H,GAAO3R,CAElB,mBCtBA,IAAIikE,EAAQ,EAAQ,OAChBiM,EAAY,EAAQ,OACpB4B,EAAc,EAAQ,OACtBI,EAAa,EAAQ,OACrBE,EAAe,EAAQ,OACvBC,EAAc,EAAQ,OACtBC,EAAY,EAAQ,KACpBC,EAAc,EAAQ,OACtBC,EAAgB,EAAQ,MACxBC,EAAa,EAAQ,OACrBC,GAAe,EAAQ,OACvBC,GAAS,EAAQ,OACjBC,GAAiB,EAAQ,OACzBC,GAAiB,EAAQ,OACzBC,GAAkB,EAAQ,OAC1BlxE,GAAU,EAAQ,MAClBL,GAAW,EAAQ,OACnB0wD,GAAQ,EAAQ,OAChB36C,GAAW,EAAQ,OACnBurD,GAAQ,EAAQ,OAChB5pD,GAAO,EAAQ,MACfk5D,GAAS,EAAQ,OAQjBY,GAAU,qBAKVC,GAAU,oBAIVC,GAAY,kBAoBZC,GAAgB,CAAC,EACrBA,GAAcH,IAAWG,GA7BV,kBA8BfA,GAfqB,wBAeWA,GAdd,qBAelBA,GA9Bc,oBA8BWA,GA7BX,iBA8BdA,GAfiB,yBAeWA,GAdX,yBAejBA,GAdc,sBAcWA,GAbV,uBAcfA,GAbe,uBAaWA,GA5Bb,gBA6BbA,GA5BgB,mBA4BWA,GAAcD,IACzCC,GA3BgB,mBA2BWA,GA1Bd,gBA2BbA,GA1BgB,mBA0BWA,GAzBX,mBA0BhBA,GAhBe,uBAgBWA,GAfJ,8BAgBtBA,GAfgB,wBAeWA,GAdX,yBAcsC,EACtDA,GArCe,kBAqCWA,GAAcF,IACxCE,GA5BiB,qBA4BW,EA8F5Bn4E,EAAOD,QA5EP,SAASq4E,UAAUnzE,EAAOozE,EAASC,EAAY1hE,GAAK+H,GAAQ/K,IAC1D,IAAI8J,GACA66D,GAnEgB,EAmEPF,EACTG,GAnEgB,EAmEPH,EACTI,GAnEmB,EAmEVJ,EAKb,GAHIC,IACF56D,GAASiB,GAAS25D,EAAWrzE,EAAO2R,GAAK+H,GAAQ/K,IAAS0kE,EAAWrzE,SAExDyB,IAAXgX,GACF,OAAOA,GAET,IAAKnB,GAAStX,GACZ,OAAOA,EAET,IAAI8wE,GAAQlvE,GAAQ5B,GACpB,GAAI8wE,IAEF,GADAr4D,GAASm6D,GAAe5yE,IACnBszE,GACH,OAAOhB,EAAUtyE,EAAOyY,QAErB,CACL,IAAID,GAAMm6D,GAAO3yE,GACbyzE,GAASj7D,IAAOw6D,IA7EX,8BA6EsBx6D,GAE/B,GAAIjX,GAASvB,GACX,OAAOqyE,EAAYryE,EAAOszE,IAE5B,GAAI96D,IAAOy6D,IAAaz6D,IAAOu6D,IAAYU,KAAW/5D,IAEpD,GADAjB,GAAU86D,IAAUE,GAAU,CAAC,EAAIX,GAAgB9yE,IAC9CszE,GACH,OAAOC,GACHf,EAAcxyE,EAAOoyE,EAAa35D,GAAQzY,IAC1CuyE,EAAYvyE,EAAOkyE,EAAWz5D,GAAQzY,QAEvC,CACL,IAAKkzE,GAAc16D,IACjB,OAAOkB,GAAS1Z,EAAQ,CAAC,EAE3ByY,GAASo6D,GAAe7yE,EAAOwY,GAAK86D,GACtC,CACF,CAEA3kE,KAAUA,GAAQ,IAAIs1D,GACtB,IAAIyP,GAAU/kE,GAAM9H,IAAI7G,GACxB,GAAI0zE,GACF,OAAOA,GAET/kE,GAAMlH,IAAIzH,EAAOyY,IAEboqD,GAAM7iE,GACRA,EAAMonB,SAAQ,SAASusD,GACrBl7D,GAAOopB,IAAIsxC,UAAUQ,EAAUP,EAASC,EAAYM,EAAU3zE,EAAO2O,IACvE,IACSsjD,GAAMjyD,IACfA,EAAMonB,SAAQ,SAASusD,EAAUhiE,GAC/B8G,GAAOhR,IAAIkK,EAAKwhE,UAAUQ,EAAUP,EAASC,EAAY1hE,EAAK3R,EAAO2O,IACvE,IAGF,IAII0a,GAAQynD,QAAQrvE,GAJL+xE,GACVD,GAASb,GAAeD,EACxBc,GAASpB,GAASl5D,IAEkBjZ,GASzC,OARAkwE,EAAU7mD,IAASrpB,GAAO,SAAS2zE,EAAUhiE,GACvC0X,KAEFsqD,EAAW3zE,EADX2R,EAAMgiE,IAIR7B,EAAYr5D,GAAQ9G,EAAKwhE,UAAUQ,EAAUP,EAASC,EAAY1hE,EAAK3R,EAAO2O,IAChF,IACO8J,EACT,kBCnKA,IAAInB,EAAW,EAAQ,OAGnBs8D,EAAep0E,OAAO6kB,OAUtBypD,EAAc,WAChB,SAASp0D,SAAU,CACnB,OAAO,SAASpT,GACd,IAAKgR,EAAShR,GACZ,MAAO,CAAC,EAEV,GAAIstE,EACF,OAAOA,EAAattE,GAEtBoT,OAAOha,UAAY4G,EACnB,IAAImS,EAAS,IAAIiB,OAEjB,OADAA,OAAOha,eAAY+B,EACZgX,CACT,CACF,CAdiB,GAgBjB1d,EAAOD,QAAUgzE,mBC7BjB,IAAI+F,EAAa,EAAQ,OAWrBC,EAViB,EAAQ,MAUdC,CAAeF,GAE9B94E,EAAOD,QAAUg5E,aCUjB/4E,EAAOD,QAZP,SAASk5E,cAAc/xE,EAAOo8D,EAAWvmD,EAAWm8D,GAIlD,IAHA,IAAIt2E,EAASsE,EAAMtE,OACfqU,EAAQ8F,GAAam8D,EAAY,GAAK,GAElCA,EAAYjiE,MAAYA,EAAQrU,GACtC,GAAI0gE,EAAUp8D,EAAM+P,GAAQA,EAAO/P,GACjC,OAAO+P,EAGX,OAAQ,CACV,mBCrBA,IAAIkhB,EAAY,EAAQ,OACpBghD,EAAgB,EAAQ,OAoC5Bn5E,EAAOD,QAvBP,SAASq5E,YAAYlyE,EAAOo+D,EAAOhC,EAAW+V,EAAU37D,GACtD,IAAIzG,GAAS,EACTrU,EAASsE,EAAMtE,OAKnB,IAHA0gE,IAAcA,EAAY6V,GAC1Bz7D,IAAWA,EAAS,MAEXzG,EAAQrU,GAAQ,CACvB,IAAIqC,EAAQiC,EAAM+P,GACdquD,EAAQ,GAAKhC,EAAUr+D,GACrBqgE,EAAQ,EAEV8T,YAAYn0E,EAAOqgE,EAAQ,EAAGhC,EAAW+V,EAAU37D,GAEnDya,EAAUza,EAAQzY,GAEVo0E,IACV37D,EAAOA,EAAO9a,QAAUqC,EAE5B,CACA,OAAOyY,CACT,mBCnCA,IAaI47D,EAbgB,EAAQ,MAadC,GAEdv5E,EAAOD,QAAUu5E,mBCfjB,IAAIA,EAAU,EAAQ,OAClBp7D,EAAO,EAAQ,MAcnBle,EAAOD,QAJP,SAAS+4E,WAAWn6D,EAAQy2D,GAC1B,OAAOz2D,GAAU26D,EAAQ36D,EAAQy2D,EAAUl3D,EAC7C,mBCbA,IAAIs7D,EAAW,EAAQ,OACnBC,EAAQ,EAAQ,OAsBpBz5E,EAAOD,QAZP,SAAS25E,QAAQ/6D,EAAQ9G,GAMvB,IAHA,IAAIZ,EAAQ,EACRrU,GAHJiV,EAAO2hE,EAAS3hE,EAAM8G,IAGJ/b,OAED,MAAV+b,GAAkB1H,EAAQrU,GAC/B+b,EAASA,EAAO86D,EAAM5hE,EAAKZ,OAE7B,OAAQA,GAASA,GAASrU,EAAU+b,OAASjY,CAC/C,mBCrBA,IAAIyxB,EAAY,EAAQ,OACpBtxB,EAAU,EAAQ,MAkBtB7G,EAAOD,QALP,SAAS45E,eAAeh7D,EAAQi7D,EAAUC,GACxC,IAAIn8D,EAASk8D,EAASj7D,GACtB,OAAO9X,EAAQ8X,GAAUjB,EAASya,EAAUza,EAAQm8D,EAAYl7D,GAClE,mBCjBA,IAAI3a,EAAS,EAAQ,OACjB81E,EAAY,EAAQ,OACpBrJ,EAAiB,EAAQ,MAOzBsJ,EAAiB/1E,EAASA,EAAOg2E,iBAActzE,EAkBnD1G,EAAOD,QATP,SAASk6E,WAAWh1E,GAClB,OAAa,MAATA,OACeyB,IAAVzB,EAdQ,qBADL,gBAiBJ80E,GAAkBA,KAAkBt1E,OAAOQ,GAC/C60E,EAAU70E,GACVwrE,EAAexrE,EACrB,UCbAjF,EAAOD,QAJP,SAASm6E,UAAUv7D,EAAQ/H,GACzB,OAAiB,MAAV+H,GAAkB/H,KAAOnS,OAAOka,EACzC,mBCVA,IAAIs6D,EAAgB,EAAQ,OACxBkB,EAAY,EAAQ,OACpBC,EAAgB,EAAQ,OAiB5Bp6E,EAAOD,QANP,SAASw1E,YAAYruE,EAAOjC,EAAO8X,GACjC,OAAO9X,GAAUA,EACbm1E,EAAclzE,EAAOjC,EAAO8X,GAC5Bk8D,EAAc/xE,EAAOizE,EAAWp9D,EACtC,kBCjBA,IAAIk9D,EAAa,EAAQ,OACrBnJ,EAAe,EAAQ,OAgB3B9wE,EAAOD,QAJP,SAASs6E,gBAAgBp1E,GACvB,OAAO6rE,EAAa7rE,IAVR,sBAUkBg1E,EAAWh1E,EAC3C,mBCfA,IAAIq1E,EAAkB,EAAQ,MAC1BxJ,EAAe,EAAQ,OA0B3B9wE,EAAOD,QAVP,SAASw6E,YAAYt1E,EAAOswD,EAAO8iB,EAASC,EAAY1kE,GACtD,OAAI3O,IAAUswD,IAGD,MAATtwD,GAA0B,MAATswD,IAAmBub,EAAa7rE,KAAW6rE,EAAavb,GACpEtwD,GAAUA,GAASswD,GAAUA,EAE/B+kB,EAAgBr1E,EAAOswD,EAAO8iB,EAASC,EAAYiC,YAAa3mE,GACzE,kBCzBA,IAAIs1D,EAAQ,EAAQ,OAChBsR,EAAc,EAAQ,OACtBC,EAAa,EAAQ,OACrBC,EAAe,EAAQ,OACvB9C,EAAS,EAAQ,OACjB/wE,EAAU,EAAQ,MAClBL,EAAW,EAAQ,OACnBovE,EAAe,EAAQ,OAMvBoC,EAAU,qBACV2C,EAAW,iBACXzC,GAAY,kBAMZ3hE,GAHc9R,OAAOE,UAGQ4R,eA6DjCvW,EAAOD,QA7CP,SAASu6E,gBAAgB37D,EAAQ42C,EAAO8iB,EAASC,GAAYsC,GAAWhnE,IACtE,IAAIinE,GAAWh0E,EAAQ8X,GACnBm8D,GAAWj0E,EAAQ0uD,GACnBwlB,GAASF,GAAWF,EAAW/C,EAAOj5D,GACtCq8D,GAASF,GAAWH,EAAW/C,EAAOriB,GAKtC0lB,IAHJF,GAASA,IAAU/C,EAAUE,GAAY6C,KAGhB7C,GACrBgD,IAHJF,GAASA,IAAUhD,EAAUE,GAAY8C,KAGhB9C,GACrBiD,GAAYJ,IAAUC,GAE1B,GAAIG,IAAa30E,EAASmY,GAAS,CACjC,IAAKnY,EAAS+uD,GACZ,OAAO,EAETslB,IAAW,EACXI,IAAW,CACb,CACA,GAAIE,KAAcF,GAEhB,OADArnE,KAAUA,GAAQ,IAAIs1D,GACd2R,IAAYjF,EAAaj3D,GAC7B67D,EAAY77D,EAAQ42C,EAAO8iB,EAASC,GAAYsC,GAAWhnE,IAC3D6mE,EAAW97D,EAAQ42C,EAAOwlB,GAAQ1C,EAASC,GAAYsC,GAAWhnE,IAExE,KArDyB,EAqDnBykE,GAAiC,CACrC,IAAI+C,GAAeH,IAAY1kE,GAAe/N,KAAKmW,EAAQ,eACvD08D,GAAeH,IAAY3kE,GAAe/N,KAAK+sD,EAAO,eAE1D,GAAI6lB,IAAgBC,GAAc,CAChC,IAAIC,GAAeF,GAAez8D,EAAO1Z,QAAU0Z,EAC/C48D,GAAeF,GAAe9lB,EAAMtwD,QAAUswD,EAGlD,OADA3hD,KAAUA,GAAQ,IAAIs1D,GACf0R,GAAUU,GAAcC,GAAclD,EAASC,GAAY1kE,GACpE,CACF,CACA,QAAKunE,KAGLvnE,KAAUA,GAAQ,IAAIs1D,GACfwR,EAAa/7D,EAAQ42C,EAAO8iB,EAASC,GAAYsC,GAAWhnE,IACrE,mBChFA,IAAIgkE,EAAS,EAAQ,OACjB9G,EAAe,EAAQ,OAgB3B9wE,EAAOD,QAJP,SAASy7E,UAAUv2E,GACjB,OAAO6rE,EAAa7rE,IAVT,gBAUmB2yE,EAAO3yE,EACvC,kBCfA,IAAIikE,EAAQ,EAAQ,OAChBqR,EAAc,EAAQ,OA4D1Bv6E,EAAOD,QA5CP,SAAS07E,YAAY98D,EAAQX,EAAQu7B,EAAW++B,GAC9C,IAAIrhE,EAAQsiC,EAAU32C,OAClBA,EAASqU,EACTykE,GAAgBpD,EAEpB,GAAc,MAAV35D,EACF,OAAQ/b,EAGV,IADA+b,EAASla,OAAOka,GACT1H,KAAS,CACd,IAAInQ,EAAOyyC,EAAUtiC,GACrB,GAAKykE,GAAgB50E,EAAK,GAClBA,EAAK,KAAO6X,EAAO7X,EAAK,MACtBA,EAAK,KAAM6X,GAEnB,OAAO,CAEX,CACA,OAAS1H,EAAQrU,GAAQ,CAEvB,IAAIgU,GADJ9P,EAAOyyC,EAAUtiC,IACF,GACX+/D,EAAWr4D,EAAO/H,GAClB+kE,EAAW70E,EAAK,GAEpB,GAAI40E,GAAgB50E,EAAK,IACvB,QAAiBJ,IAAbswE,KAA4BpgE,KAAO+H,GACrC,OAAO,MAEJ,CACL,IAAI/K,GAAQ,IAAIs1D,EAChB,GAAIoP,EACF,IAAI56D,GAAS46D,EAAWtB,EAAU2E,EAAU/kE,EAAK+H,EAAQX,EAAQpK,IAEnE,UAAiBlN,IAAXgX,GACE68D,EAAYoB,EAAU3E,EAAU4E,EAA+CtD,EAAY1kE,IAC3F8J,IAEN,OAAO,CAEX,CACF,CACA,OAAO,CACT,aChDA1d,EAAOD,QAJP,SAASo6E,UAAUl1E,GACjB,OAAOA,GAAUA,CACnB,mBCTA,IAAI42E,EAAa,EAAQ,OACrBC,EAAW,EAAQ,OACnBv/D,EAAW,EAAQ,OACnBi1C,EAAW,EAAQ,OASnBuqB,EAAe,8BAGfC,EAAYlgE,SAASnX,UACrBs3E,EAAcx3E,OAAOE,UAGrBu3E,EAAeF,EAAU70E,SAGzBoP,EAAiB0lE,EAAY1lE,eAG7B4lE,EAAajnD,OAAO,IACtBgnD,EAAa1zE,KAAK+N,GAAgBxV,QAjBjB,sBAiBuC,QACvDA,QAAQ,yDAA0D,SAAW,KAmBhFf,EAAOD,QARP,SAASq8E,aAAan3E,GACpB,SAAKsX,EAAStX,IAAU62E,EAAS72E,MAGnB42E,EAAW52E,GAASk3E,EAAaJ,GAChCt6E,KAAK+vD,EAASvsD,GAC/B,mBC5CA,IAAI2yE,EAAS,EAAQ,OACjB9G,EAAe,EAAQ,OAgB3B9wE,EAAOD,QAJP,SAASs8E,UAAUp3E,GACjB,OAAO6rE,EAAa7rE,IAVT,gBAUmB2yE,EAAO3yE,EACvC,mBCfA,IAAIg1E,EAAa,EAAQ,OACrBqC,EAAW,EAAQ,OACnBxL,EAAe,EAAQ,OA8BvByL,EAAiB,CAAC,EACtBA,EAZiB,yBAYYA,EAXZ,yBAYjBA,EAXc,sBAWYA,EAVX,uBAWfA,EAVe,uBAUYA,EATZ,uBAUfA,EATsB,8BASYA,EARlB,wBAShBA,EARgB,yBAQY,EAC5BA,EAjCc,sBAiCYA,EAhCX,kBAiCfA,EApBqB,wBAoBYA,EAhCnB,oBAiCdA,EApBkB,qBAoBYA,EAhChB,iBAiCdA,EAhCe,kBAgCYA,EA/Bb,qBAgCdA,EA/Ba,gBA+BYA,EA9BT,mBA+BhBA,EA9BgB,mBA8BYA,EA7BZ,mBA8BhBA,EA7Ba,gBA6BYA,EA5BT,mBA6BhBA,EA5BiB,qBA4BY,EAc7Bv8E,EAAOD,QALP,SAASy8E,iBAAiBv3E,GACxB,OAAO6rE,EAAa7rE,IAClBq3E,EAASr3E,EAAMrC,WAAa25E,EAAetC,EAAWh1E,GAC1D,mBCzDA,IAAIw3E,EAAc,EAAQ,OACtBC,EAAsB,EAAQ,OAC9BC,EAAW,EAAQ,MACnB91E,EAAU,EAAQ,MAClB6uB,EAAW,EAAQ,OA0BvB11B,EAAOD,QAjBP,SAAS68E,aAAa33E,GAGpB,MAAoB,mBAATA,EACFA,EAEI,MAATA,EACK03E,EAEW,iBAAT13E,EACF4B,EAAQ5B,GACXy3E,EAAoBz3E,EAAM,GAAIA,EAAM,IACpCw3E,EAAYx3E,GAEXywB,EAASzwB,EAClB,iBC5BA,IAAI43E,EAAc,EAAQ,OACtBC,EAAa,EAAQ,OAMrBvmE,EAHc9R,OAAOE,UAGQ4R,eAsBjCvW,EAAOD,QAbP,SAASg9E,SAASp+D,GAChB,IAAKk+D,EAAYl+D,GACf,OAAOm+D,EAAWn+D,GAEpB,IAAIjB,EAAS,GACb,IAAK,IAAI9G,KAAOnS,OAAOka,GACjBpI,EAAe/N,KAAKmW,EAAQ/H,IAAe,eAAPA,GACtC8G,EAAOza,KAAK2T,GAGhB,OAAO8G,CACT,mBC3BA,IAAInB,EAAW,EAAQ,OACnBsgE,EAAc,EAAQ,OACtBG,EAAe,EAAQ,OAMvBzmE,EAHc9R,OAAOE,UAGQ4R,eAwBjCvW,EAAOD,QAfP,SAASk9E,WAAWt+D,GAClB,IAAKpC,EAASoC,GACZ,OAAOq+D,EAAar+D,GAEtB,IAAIu+D,EAAUL,EAAYl+D,GACtBjB,EAAS,GAEb,IAAK,IAAI9G,KAAO+H,GACD,eAAP/H,IAAyBsmE,GAAY3mE,EAAe/N,KAAKmW,EAAQ/H,KACrE8G,EAAOza,KAAK2T,GAGhB,OAAO8G,CACT,YCrBA1d,EAAOD,QAJP,SAASizE,aAET,mBCPA,IAAIyI,EAAc,EAAQ,MACtB0B,EAAe,EAAQ,MACvBC,EAA0B,EAAQ,OAmBtCp9E,EAAOD,QAVP,SAAS08E,YAAYz+D,GACnB,IAAIu7B,EAAY4jC,EAAan/D,GAC7B,OAAwB,GAApBu7B,EAAU32C,QAAe22C,EAAU,GAAG,GACjC6jC,EAAwB7jC,EAAU,GAAG,GAAIA,EAAU,GAAG,IAExD,SAAS56B,GACd,OAAOA,IAAWX,GAAUy9D,EAAY98D,EAAQX,EAAQu7B,EAC1D,CACF,mBCnBA,IAAIghC,EAAc,EAAQ,OACtBzuE,EAAM,EAAQ,OACdsgE,EAAQ,EAAQ,OAChBiR,EAAQ,EAAQ,OAChBC,EAAqB,EAAQ,OAC7BF,EAA0B,EAAQ,OAClC3D,EAAQ,EAAQ,OA0BpBz5E,EAAOD,QAZP,SAAS28E,oBAAoB7kE,EAAM8jE,GACjC,OAAI0B,EAAMxlE,IAASylE,EAAmB3B,GAC7ByB,EAAwB3D,EAAM5hE,GAAO8jE,GAEvC,SAASh9D,GACd,IAAIq4D,EAAWlrE,EAAI6S,EAAQ9G,GAC3B,YAAqBnR,IAAbswE,GAA0BA,IAAa2E,EAC3CvP,EAAMztD,EAAQ9G,GACd0iE,EAAYoB,EAAU3E,EAAU4E,EACtC,CACF,mBC9BA,IAAI1S,EAAQ,EAAQ,OAChB4N,EAAmB,EAAQ,OAC3BwC,EAAU,EAAQ,OAClBiE,EAAgB,EAAQ,OACxBhhE,EAAW,EAAQ,OACnB66D,EAAS,EAAQ,OACjBoG,EAAU,EAAQ,OAmCtBx9E,EAAOD,QAtBP,SAAS09E,UAAU9+D,EAAQX,EAAQ0/D,EAAUpF,EAAY1kE,GACnD+K,IAAWX,GAGfs7D,EAAQt7D,GAAQ,SAAS29D,EAAU/kE,GAEjC,GADAhD,IAAUA,EAAQ,IAAIs1D,GAClB3sD,EAASo/D,GACX4B,EAAc5+D,EAAQX,EAAQpH,EAAK8mE,EAAUD,UAAWnF,EAAY1kE,OAEjE,CACH,IAAI0oD,EAAWgc,EACXA,EAAWkF,EAAQ7+D,EAAQ/H,GAAM+kE,EAAW/kE,EAAM,GAAK+H,EAAQX,EAAQpK,QACvElN,OAEaA,IAAb41D,IACFA,EAAWqf,GAEb7E,EAAiBn4D,EAAQ/H,EAAK0lD,EAChC,CACF,GAAG8a,EACL,mBCvCA,IAAIN,EAAmB,EAAQ,OAC3BQ,EAAc,EAAQ,OACtBqG,EAAkB,EAAQ,OAC1BpG,EAAY,EAAQ,KACpBQ,EAAkB,EAAQ,OAC1BrC,EAAc,EAAQ,OACtB7uE,EAAU,EAAQ,MAClB+2E,EAAoB,EAAQ,OAC5Bp3E,EAAW,EAAQ,OACnBq1E,EAAa,EAAQ,OACrBt/D,GAAW,EAAQ,OACnBshE,GAAgB,EAAQ,OACxBjI,GAAe,EAAQ,OACvB4H,GAAU,EAAQ,OAClBM,GAAgB,EAAQ,OA+E5B99E,EAAOD,QA9DP,SAASw9E,cAAc5+D,EAAQX,EAAQpH,EAAK8mE,GAAUK,GAAWzF,GAAY1kE,IAC3E,IAAIojE,GAAWwG,GAAQ7+D,EAAQ/H,GAC3B+kE,GAAW6B,GAAQx/D,EAAQpH,GAC3B+hE,GAAU/kE,GAAM9H,IAAI6vE,IAExB,GAAIhD,GACF7B,EAAiBn4D,EAAQ/H,EAAK+hE,QADhC,CAIA,IAAIrc,GAAWgc,GACXA,GAAWtB,GAAU2E,GAAW/kE,EAAM,GAAK+H,EAAQX,EAAQpK,SAC3DlN,EAEAs3E,QAAwBt3E,IAAb41D,GAEf,GAAI0hB,GAAU,CACZ,IAAIjI,GAAQlvE,EAAQ80E,IAChB1F,IAAUF,IAASvvE,EAASm1E,IAC5BsC,IAAWlI,KAAUE,IAAUL,GAAa+F,IAEhDrf,GAAWqf,GACP5F,IAASE,IAAUgI,GACjBp3E,EAAQmwE,IACV1a,GAAW0a,GAEJ4G,EAAkB5G,IACzB1a,GAAWib,EAAUP,IAEdf,IACP+H,IAAW,EACX1hB,GAAWgb,EAAYqE,IAAU,IAE1BsC,IACPD,IAAW,EACX1hB,GAAWqhB,EAAgBhC,IAAU,IAGrCrf,GAAW,GAGNuhB,GAAclC,KAAajG,EAAYiG,KAC9Crf,GAAW0a,GACPtB,EAAYsB,IACd1a,GAAWwhB,GAAc9G,IAEjBz6D,GAASy6D,MAAa6E,EAAW7E,MACzC1a,GAAWyb,EAAgB4D,MAI7BqC,IAAW,CAEf,CACIA,KAEFpqE,GAAMlH,IAAIivE,GAAUrf,IACpByhB,GAAUzhB,GAAUqf,GAAU+B,GAAUpF,GAAY1kE,IACpDA,GAAc,OAAE+nE,KAElB7E,EAAiBn4D,EAAQ/H,EAAK0lD,GAnD9B,CAoDF,aC9EAt8D,EAAOD,QANP,SAASm+E,aAAatnE,GACpB,OAAO,SAAS+H,GACd,OAAiB,MAAVA,OAAiBjY,EAAYiY,EAAO/H,EAC7C,CACF,mBCXA,IAAI8iE,EAAU,EAAQ,OAetB15E,EAAOD,QANP,SAASo+E,iBAAiBtmE,GACxB,OAAO,SAAS8G,GACd,OAAO+6D,EAAQ/6D,EAAQ9G,EACzB,CACF,aCAA7X,EAAOD,QANP,SAASq+E,eAAez/D,GACtB,OAAO,SAAS/H,GACd,OAAiB,MAAV+H,OAAiBjY,EAAYiY,EAAO/H,EAC7C,CACF,aCWA5W,EAAOD,QATP,SAASs+E,WAAWpiB,EAAYmZ,EAAUkB,EAAaC,EAAW+H,GAMhE,OALAA,EAASriB,GAAY,SAASh3D,EAAOgS,EAAOglD,GAC1Cqa,EAAcC,GACTA,GAAY,EAAOtxE,GACpBmwE,EAASkB,EAAarxE,EAAOgS,EAAOglD,EAC1C,IACOqa,CACT,kBCpBA,IAAIqG,EAAW,EAAQ,MACnB4B,EAAW,EAAQ,OACnBC,EAAc,EAAQ,OAc1Bx+E,EAAOD,QAJP,SAAS0+E,SAASroE,EAAM3S,GACtB,OAAO+6E,EAAYD,EAASnoE,EAAM3S,EAAOk5E,GAAWvmE,EAAO,GAC7D,mBCdA,IAAI2gE,EAAc,EAAQ,OACtByC,EAAW,EAAQ,OACnB7D,EAAU,EAAQ,OAClBp5D,EAAW,EAAQ,OACnBk9D,EAAQ,EAAQ,OA8CpBz5E,EAAOD,QAlCP,SAAS2+E,QAAQ//D,EAAQ9G,EAAM5S,EAAOqzE,GACpC,IAAK/7D,EAASoC,GACZ,OAAOA,EAST,IALA,IAAI1H,GAAS,EACTrU,GAHJiV,EAAO2hE,EAAS3hE,EAAM8G,IAGJ/b,OACdw2C,EAAYx2C,EAAS,EACrBspE,EAASvtD,EAEI,MAAVutD,KAAoBj1D,EAAQrU,GAAQ,CACzC,IAAIgU,GAAM6iE,EAAM5hE,EAAKZ,IACjBqlD,GAAWr3D,EAEf,GAAY,cAAR2R,IAA+B,gBAARA,IAAiC,cAARA,GAClD,OAAO+H,EAGT,GAAI1H,GAASmiC,EAAW,CACtB,IAAI49B,GAAW9K,EAAOt1D,SAELlQ,KADjB41D,GAAWgc,EAAaA,EAAWtB,GAAUpgE,GAAKs1D,QAAUxlE,KAE1D41D,GAAW//C,EAASy6D,IAChBA,GACCrB,EAAQ99D,EAAKZ,EAAQ,IAAM,GAAK,CAAC,EAE1C,CACA8/D,EAAY7K,EAAQt1D,GAAK0lD,IACzB4P,EAASA,EAAOt1D,GAClB,CACA,OAAO+H,CACT,mBChDA,IAAIg+D,EAAW,EAAQ,MACnBgC,EAAU,EAAQ,OAUlBC,EAAeD,EAAqB,SAASvoE,EAAMtP,GAErD,OADA63E,EAAQjyE,IAAI0J,EAAMtP,GACXsP,CACT,EAH6BumE,EAK7B38E,EAAOD,QAAU6+E,mBChBjB,IAAIC,EAAW,EAAQ,OACnBjzE,EAAiB,EAAQ,OACzB+wE,EAAW,EAAQ,MAUnBmC,EAAmBlzE,EAA4B,SAASwK,EAAMjR,GAChE,OAAOyG,EAAewK,EAAM,WAAY,CACtC,cAAgB,EAChB,YAAc,EACd,MAASyoE,EAAS15E,GAClB,UAAY,GAEhB,EAPwCw3E,EASxC38E,EAAOD,QAAU++E,aCSjB9+E,EAAOD,QArBP,SAASg/E,UAAU73E,EAAOzD,EAAOC,GAC/B,IAAIuT,GAAS,EACTrU,EAASsE,EAAMtE,OAEfa,EAAQ,IACVA,GAASA,EAAQb,EAAS,EAAKA,EAASa,IAE1CC,EAAMA,EAAMd,EAASA,EAASc,GACpB,IACRA,GAAOd,GAETA,EAASa,EAAQC,EAAM,EAAMA,EAAMD,IAAW,EAC9CA,KAAW,EAGX,IADA,IAAIia,EAASpa,MAAMV,KACVqU,EAAQrU,GACf8a,EAAOzG,GAAS/P,EAAM+P,EAAQxT,GAEhC,OAAOia,CACT,kBC5BA,IAAIq7D,EAAW,EAAQ,OAqBvB/4E,EAAOD,QAVP,SAASi/E,SAAS/iB,EAAYqH,GAC5B,IAAI5lD,EAMJ,OAJAq7D,EAAS9c,GAAY,SAASh3D,EAAOgS,EAAOglD,GAE1C,QADAv+C,EAAS4lD,EAAUr+D,EAAOgS,EAAOglD,GAEnC,MACSv+C,CACX,aCAA1d,EAAOD,QAVP,SAAS01E,UAAUvtE,EAAGktE,GAIpB,IAHA,IAAIn+D,GAAS,EACTyG,EAASpa,MAAM4E,KAEV+O,EAAQ/O,GACfwV,EAAOzG,GAASm+D,EAASn+D,GAE3B,OAAOyG,CACT,mBCjBA,IAAI1Z,EAAS,EAAQ,OACjBoyE,EAAW,EAAQ,OACnBvvE,EAAU,EAAQ,MAClBkqB,EAAW,EAAQ,OAMnBkuD,EAAcj7E,EAASA,EAAOW,eAAY+B,EAC1Cw4E,EAAiBD,EAAcA,EAAY93E,cAAWT,EA0B1D1G,EAAOD,QAhBP,SAASo/E,aAAal6E,GAEpB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAI4B,EAAQ5B,GAEV,OAAOmxE,EAASnxE,EAAOk6E,cAAgB,GAEzC,GAAIpuD,EAAS9rB,GACX,OAAOi6E,EAAiBA,EAAe12E,KAAKvD,GAAS,GAEvD,IAAIyY,EAAUzY,EAAQ,GACtB,MAAkB,KAAVyY,GAAkB,EAAIzY,IA3BjB,SA2BwC,KAAOyY,CAC9D,mBClCA,IAAI0hE,EAAkB,EAAQ,OAG1BC,EAAc,OAelBr/E,EAAOD,QANP,SAASu/E,SAASn6E,GAChB,OAAOA,EACHA,EAAOK,MAAM,EAAG45E,EAAgBj6E,GAAU,GAAGpE,QAAQs+E,EAAa,IAClEl6E,CACN,YCHAnF,EAAOD,QANP,SAASw/E,UAAUnpE,GACjB,OAAO,SAASnR,GACd,OAAOmR,EAAKnR,EACd,CACF,mBCXA,IAAIu0E,EAAW,EAAQ,OACnBzpE,EAAO,EAAQ,OACfyL,EAAS,EAAQ,OACjBi+D,EAAQ,EAAQ,OAgBpBz5E,EAAOD,QANP,SAASy/E,UAAU7gE,EAAQ9G,GAGzB,OAFAA,EAAO2hE,EAAS3hE,EAAM8G,GAEL,OADjBA,EAASnD,EAAOmD,EAAQ9G,YACQ8G,EAAO86D,EAAM1pE,EAAK8H,IACpD,YCKA7X,EAAOD,QAbP,SAAS0/E,cAAcnxD,EAAOpD,EAAQw0D,GAMpC,IALA,IAAIzoE,GAAS,EACTrU,EAAS0rB,EAAM1rB,OACf+8E,EAAaz0D,EAAOtoB,OACpB8a,EAAS,CAAC,IAELzG,EAAQrU,GAAQ,CACvB,IAAIqC,EAAQgS,EAAQ0oE,EAAaz0D,EAAOjU,QAASvQ,EACjDg5E,EAAWhiE,EAAQ4Q,EAAMrX,GAAQhS,EACnC,CACA,OAAOyY,CACT,aCRA1d,EAAOD,QAJP,SAAS6/E,SAASxsB,EAAOx8C,GACvB,OAAOw8C,EAAM9sC,IAAI1P,EACnB,mBCVA,IAAI/P,EAAU,EAAQ,MAClBw2E,EAAQ,EAAQ,OAChBnsC,EAAe,EAAQ,OACvB/pC,EAAW,EAAQ,OAiBvBnH,EAAOD,QAPP,SAASy5E,SAASv0E,EAAO0Z,GACvB,OAAI9X,EAAQ5B,GACHA,EAEFo4E,EAAMp4E,EAAO0Z,GAAU,CAAC1Z,GAASisC,EAAa/pC,EAASlC,GAChE,mBClBA,IAAI85E,EAAY,EAAQ,OAiBxB/+E,EAAOD,QANP,SAAS8/E,UAAU34E,EAAOzD,EAAOC,GAC/B,IAAId,EAASsE,EAAMtE,OAEnB,OADAc,OAAcgD,IAARhD,EAAoBd,EAASc,GAC1BD,GAASC,GAAOd,EAAUsE,EAAQ63E,EAAU73E,EAAOzD,EAAOC,EACrE,mBCfA,IAAIL,EAAa,EAAQ,OAezBrD,EAAOD,QANP,SAAS+/E,iBAAiBC,GACxB,IAAIriE,EAAS,IAAIqiE,EAAYxsE,YAAYwsE,EAAYr+E,YAErD,OADA,IAAI2B,EAAWqa,GAAQhR,IAAI,IAAIrJ,EAAW08E,IACnCriE,CACT,8BCbA,IAAI7d,EAAO,EAAQ,OAGfmgF,EAA4CjgF,IAAYA,EAAQ+7B,UAAY/7B,EAG5EkgF,EAAaD,GAA4ChgF,IAAWA,EAAO87B,UAAY97B,EAMvFiE,EAHgBg8E,GAAcA,EAAWlgF,UAAYigF,EAG5BngF,EAAKoE,YAASyC,EACvC3B,EAAcd,EAASA,EAAOc,iBAAc2B,EAqBhD1G,EAAOD,QAXP,SAASu3E,YAAYtxE,EAAQuyE,GAC3B,GAAIA,EACF,OAAOvyE,EAAOR,QAEhB,IAAI5C,EAASoD,EAAOpD,OAChB8a,EAAS3Y,EAAcA,EAAYnC,GAAU,IAAIoD,EAAOuN,YAAY3Q,GAGxE,OADAoD,EAAOF,KAAK4X,GACLA,CACT,mBChCA,IAAIoiE,EAAmB,EAAQ,OAe/B9/E,EAAOD,QALP,SAASmgF,cAAcC,EAAU5H,GAC/B,IAAIvyE,EAASuyE,EAASuH,EAAiBK,EAASn6E,QAAUm6E,EAASn6E,OACnE,OAAO,IAAIm6E,EAAS5sE,YAAYvN,EAAQm6E,EAASl6E,WAAYk6E,EAASz+E,WACxE,aCZA,IAAI0+E,EAAU,OAedpgF,EAAOD,QANP,SAASsgF,YAAYC,GACnB,IAAI5iE,EAAS,IAAI4iE,EAAO/sE,YAAY+sE,EAAOtiE,OAAQoiE,EAAQ38D,KAAK68D,IAEhE,OADA5iE,EAAO07B,UAAYknC,EAAOlnC,UACnB17B,CACT,mBCdA,IAAI1Z,EAAS,EAAQ,OAGjBi7E,EAAcj7E,EAASA,EAAOW,eAAY+B,EAC1C65E,EAAgBtB,EAAcA,EAAY74E,aAAUM,EAaxD1G,EAAOD,QAJP,SAASygF,YAAYp0D,GACnB,OAAOm0D,EAAgB97E,OAAO87E,EAAc/3E,KAAK4jB,IAAW,CAAC,CAC/D,mBCfA,IAAI0zD,EAAmB,EAAQ,OAe/B9/E,EAAOD,QALP,SAAS49E,gBAAgB8C,EAAYlI,GACnC,IAAIvyE,EAASuyE,EAASuH,EAAiBW,EAAWz6E,QAAUy6E,EAAWz6E,OACvE,OAAO,IAAIy6E,EAAWltE,YAAYvN,EAAQy6E,EAAWx6E,WAAYw6E,EAAW79E,OAC9E,aCZA,IAAI8tE,EAAYpmE,KAAK2C,IAqCrBjN,EAAOD,QAxBP,SAAS2gF,YAAYr8D,EAAMs8D,EAAUC,EAASC,GAU5C,IATA,IAAIC,GAAa,EACbx8D,EAAaD,EAAKzhB,OAClBm+E,EAAgBH,EAAQh+E,OACxBo+E,GAAa,EACbC,EAAaN,EAAS/9E,OACtBs+E,EAAcxQ,EAAUpsD,EAAay8D,EAAe,GACpDrjE,EAASpa,MAAM29E,EAAaC,GAC5BC,GAAeN,IAEVG,EAAYC,GACnBvjE,EAAOsjE,GAAaL,EAASK,GAE/B,OAASF,EAAYC,IACfI,GAAeL,EAAYx8D,KAC7B5G,EAAOkjE,EAAQE,IAAcz8D,EAAKy8D,IAGtC,KAAOI,KACLxjE,EAAOsjE,KAAe38D,EAAKy8D,KAE7B,OAAOpjE,CACT,aCnCA,IAAIgzD,EAAYpmE,KAAK2C,IAuCrBjN,EAAOD,QA1BP,SAASqhF,iBAAiB/8D,EAAMs8D,EAAUC,EAASC,GAWjD,IAVA,IAAIC,GAAa,EACbx8D,EAAaD,EAAKzhB,OAClBy+E,GAAgB,EAChBN,EAAgBH,EAAQh+E,OACxB0+E,GAAc,EACdC,EAAcZ,EAAS/9E,OACvBs+E,EAAcxQ,EAAUpsD,EAAay8D,EAAe,GACpDrjE,EAASpa,MAAM49E,EAAcK,GAC7BJ,IAAeN,IAEVC,EAAYI,GACnBxjE,EAAOojE,GAAaz8D,EAAKy8D,GAG3B,IADA,IAAI33E,GAAS23E,IACJQ,EAAaC,GACpB7jE,EAAOvU,GAASm4E,GAAcX,EAASW,GAEzC,OAASD,EAAeN,IAClBI,IAAeL,EAAYx8D,KAC7B5G,EAAOvU,GAASy3E,EAAQS,IAAiBh9D,EAAKy8D,MAGlD,OAAOpjE,CACT,WCnBA1d,EAAOD,QAXP,SAASw3E,UAAUv5D,EAAQ9W,GACzB,IAAI+P,GAAS,EACTrU,EAASob,EAAOpb,OAGpB,IADAsE,IAAUA,EAAQ5D,MAAMV,MACfqU,EAAQrU,GACfsE,EAAM+P,GAAS+G,EAAO/G,GAExB,OAAO/P,CACT,mBCjBA,IAAI6vE,EAAc,EAAQ,OACtBH,EAAkB,EAAQ,OAsC9B52E,EAAOD,QA1BP,SAASm3E,WAAWl5D,EAAQsQ,EAAO3P,EAAQ25D,GACzC,IAAIkJ,GAAS7iE,EACbA,IAAWA,EAAS,CAAC,GAKrB,IAHA,IAAI1H,GAAS,EACTrU,EAAS0rB,EAAM1rB,SAEVqU,EAAQrU,GAAQ,CACvB,IAAIgU,EAAM0X,EAAMrX,GAEZqlD,EAAWgc,EACXA,EAAW35D,EAAO/H,GAAMoH,EAAOpH,GAAMA,EAAK+H,EAAQX,QAClDtX,OAEaA,IAAb41D,IACFA,EAAWt+C,EAAOpH,IAEhB4qE,EACF5K,EAAgBj4D,EAAQ/H,EAAK0lD,GAE7Bya,EAAYp4D,EAAQ/H,EAAK0lD,EAE7B,CACA,OAAO39C,CACT,mBCrCA,IAAIu4D,EAAa,EAAQ,OACrBuK,EAAa,EAAQ,OAczBzhF,EAAOD,QAJP,SAASy3E,YAAYx5D,EAAQW,GAC3B,OAAOu4D,EAAWl5D,EAAQyjE,EAAWzjE,GAASW,EAChD,kBCbA,IAAIu4D,EAAa,EAAQ,OACrBwK,EAAe,EAAQ,OAc3B1hF,EAAOD,QAJP,SAAS03E,cAAcz5D,EAAQW,GAC7B,OAAOu4D,EAAWl5D,EAAQ0jE,EAAa1jE,GAASW,EAClD,mBCbA,IAGIgjE,EAHO,EAAQ,OAGG,sBAEtB3hF,EAAOD,QAAU4hF,aCejB3hF,EAAOD,QAZP,SAAS6hF,aAAa16E,EAAO26E,GAI3B,IAHA,IAAIj/E,EAASsE,EAAMtE,OACf8a,EAAS,EAEN9a,KACDsE,EAAMtE,KAAYi/E,KAClBnkE,EAGN,OAAOA,CACT,mBClBA,IAAI+gE,EAAW,EAAQ,MACnBqD,EAAiB,EAAQ,OAmC7B9hF,EAAOD,QA1BP,SAASgiF,eAAeC,GACtB,OAAOvD,GAAS,SAAS9/D,EAAQsjE,GAC/B,IAAIhrE,GAAS,EACTrU,EAASq/E,EAAQr/E,OACjB01E,EAAa11E,EAAS,EAAIq/E,EAAQr/E,EAAS,QAAK8D,EAChDw7E,EAAQt/E,EAAS,EAAIq/E,EAAQ,QAAKv7E,EAWtC,IATA4xE,EAAc0J,EAASp/E,OAAS,GAA0B,mBAAd01E,GACvC11E,IAAU01E,QACX5xE,EAEAw7E,GAASJ,EAAeG,EAAQ,GAAIA,EAAQ,GAAIC,KAClD5J,EAAa11E,EAAS,OAAI8D,EAAY4xE,EACtC11E,EAAS,GAEX+b,EAASla,OAAOka,KACP1H,EAAQrU,GAAQ,CACvB,IAAIob,EAASikE,EAAQhrE,GACjB+G,GACFgkE,EAASrjE,EAAQX,EAAQ/G,EAAOqhE,EAEpC,CACA,OAAO35D,CACT,GACF,mBClCA,IAAIkyC,EAAc,EAAQ,OA+B1B7wD,EAAOD,QArBP,SAASi5E,eAAesF,EAAUpF,GAChC,OAAO,SAASjd,EAAYmZ,GAC1B,GAAkB,MAAdnZ,EACF,OAAOA,EAET,IAAKpL,EAAYoL,GACf,OAAOqiB,EAASriB,EAAYmZ,GAM9B,IAJA,IAAIxyE,EAASq5D,EAAWr5D,OACpBqU,EAAQiiE,EAAYt2E,GAAU,EAC9BylB,EAAW5jB,OAAOw3D,IAEdid,EAAYjiE,MAAYA,EAAQrU,KACa,IAA/CwyE,EAAS/sD,EAASpR,GAAQA,EAAOoR,KAIvC,OAAO4zC,CACT,CACF,aCLAj8D,EAAOD,QAjBP,SAASw5E,cAAcL,GACrB,OAAO,SAASv6D,EAAQy2D,EAAUwE,GAMhC,IALA,IAAI3iE,GAAS,EACToR,EAAW5jB,OAAOka,GAClB2P,EAAQsrD,EAASj7D,GACjB/b,EAAS0rB,EAAM1rB,OAEZA,KAAU,CACf,IAAIgU,EAAM0X,EAAM4qD,EAAYt2E,IAAWqU,GACvC,IAA+C,IAA3Cm+D,EAAS/sD,EAASzR,GAAMA,EAAKyR,GAC/B,KAEJ,CACA,OAAO1J,CACT,CACF,mBCtBA,IAAIwjE,EAAa,EAAQ,OACrBtiF,EAAO,EAAQ,OA0BnBG,EAAOD,QAXP,SAASqiF,WAAWhsE,EAAMiiE,EAASx/C,GACjC,IAAIwpD,EAbe,EAaNhK,EACTiK,EAAOH,EAAW/rE,GAMtB,OAJA,SAAS6b,UAEP,OADU9xB,MAAQA,OAASN,GAAQM,gBAAgB8xB,QAAWqwD,EAAOlsE,GAC3DjL,MAAMk3E,EAASxpD,EAAU14B,KAAMkH,UAC3C,CAEF,mBCzBA,IAAIw4E,EAAY,EAAQ,OACpB0C,EAAa,EAAQ,OACrBC,EAAgB,EAAQ,OACxBr7E,EAAW,EAAQ,OA6BvBnH,EAAOD,QApBP,SAAS0iF,gBAAgBC,GACvB,OAAO,SAASv9E,GACdA,EAASgC,EAAShC,GAElB,IAAIw9E,EAAaJ,EAAWp9E,GACxBq9E,EAAcr9E,QACduB,EAEA4lB,EAAMq2D,EACNA,EAAW,GACXx9E,EAAOqrB,OAAO,GAEdkhD,EAAWiR,EACX9C,EAAU8C,EAAY,GAAGv/E,KAAK,IAC9B+B,EAAOK,MAAM,GAEjB,OAAO8mB,EAAIo2D,KAAgBhR,CAC7B,CACF,mBC9BA,IAAI2E,EAAc,EAAQ,OACtBuM,EAAS,EAAQ,OACjBC,EAAQ,EAAQ,OAMhBC,EAAS5tD,OAHA,OAGe,KAe5Bl1B,EAAOD,QANP,SAASgjF,iBAAiBC,GACxB,OAAO,SAAS79E,GACd,OAAOkxE,EAAYwM,EAAMD,EAAOz9E,GAAQpE,QAAQ+hF,EAAQ,KAAME,EAAU,GAC1E,CACF,mBCrBA,IAAIjQ,EAAa,EAAQ,MACrBx2D,EAAW,EAAQ,OAmCvBvc,EAAOD,QAzBP,SAASoiF,WAAWG,GAClB,OAAO,WAIL,IAAIj+D,EAAOhd,UACX,OAAQgd,EAAKzhB,QACX,KAAK,EAAG,OAAO,IAAI0/E,EACnB,KAAK,EAAG,OAAO,IAAIA,EAAKj+D,EAAK,IAC7B,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,IACtC,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC/C,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACxD,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACjE,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC1E,KAAK,EAAG,OAAO,IAAIi+D,EAAKj+D,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAErF,IAAI4+D,EAAclQ,EAAWuP,EAAK39E,WAC9B+Y,EAAS4kE,EAAKn3E,MAAM83E,EAAa5+D,GAIrC,OAAO9H,EAASmB,GAAUA,EAASulE,CACrC,CACF,mBClCA,IAAI93E,EAAQ,EAAQ,OAChBg3E,EAAa,EAAQ,OACrBe,EAAe,EAAQ,OACvBC,EAAgB,EAAQ,OACxBC,EAAY,EAAQ,OACpBC,EAAiB,EAAQ,OACzBxjF,EAAO,EAAQ,OAuCnBG,EAAOD,QA5BP,SAASujF,YAAYltE,EAAMiiE,EAASxlD,GAClC,IAAIyvD,EAAOH,EAAW/rE,GAwBtB,OAtBA,SAAS6b,UAMP,IALA,IAAIrvB,EAASyE,UAAUzE,OACnByhB,EAAO/gB,MAAMV,GACbqU,EAAQrU,EACRi/E,GAAcuB,EAAUnxD,SAErBhb,KACLoN,EAAKpN,GAAS5P,UAAU4P,GAE1B,IAAI2pE,GAAWh+E,EAAS,GAAKyhB,EAAK,KAAOw9D,IAAex9D,EAAKzhB,EAAS,KAAOi/E,GACzE,GACAwB,EAAeh/D,EAAMw9D,IAGzB,OADAj/E,GAAUg+E,GAAQh+E,QACLiwB,EACJswD,EACL/sE,EAAMiiE,EAAS6K,EAAcjxD,QAAQ4vD,iBAAan7E,EAClD2d,EAAMu8D,QAASl6E,OAAWA,EAAWmsB,EAAQjwB,GAG1CuI,EADGhL,MAAQA,OAASN,GAAQM,gBAAgB8xB,QAAWqwD,EAAOlsE,EACpDjW,KAAMkkB,EACzB,CAEF,mBC3CA,IAAIu4D,EAAe,EAAQ,OACvB/rB,EAAc,EAAQ,OACtB3yC,EAAO,EAAQ,MAsBnBle,EAAOD,QAbP,SAASwjF,WAAWC,GAClB,OAAO,SAASvnB,EAAYqH,EAAWvmD,GACrC,IAAIsL,EAAW5jB,OAAOw3D,GACtB,IAAKpL,EAAYoL,GAAa,CAC5B,IAAImZ,EAAWwH,EAAatZ,EAAW,GACvCrH,EAAa/9C,EAAK+9C,GAClBqH,EAAY,SAAS1sD,GAAO,OAAOw+D,EAAS/sD,EAASzR,GAAMA,EAAKyR,EAAW,CAC7E,CACA,IAAIpR,EAAQusE,EAAcvnB,EAAYqH,EAAWvmD,GACjD,OAAO9F,GAAS,EAAIoR,EAAS+sD,EAAWnZ,EAAWhlD,GAASA,QAASvQ,CACvE,CACF,mBCtBA,IAAIg6E,EAAc,EAAQ,OACtBU,EAAmB,EAAQ,OAC3BQ,EAAe,EAAQ,OACvBO,EAAa,EAAQ,OACrBgB,EAAgB,EAAQ,OACxBC,EAAY,EAAQ,OACpBK,EAAU,EAAQ,OAClBJ,EAAiB,EAAQ,OACzBxjF,EAAO,EAAQ,OAmFnBG,EAAOD,QAtDP,SAASmjF,aAAa9sE,EAAMiiE,EAASx/C,EAAS8nD,EAAUC,GAAS8C,GAAeC,GAAcC,GAAQC,GAAKhxD,IACzG,IAAIixD,GAvBc,IAuBNzL,EACRgK,GA5Be,EA4BNhK,EACT0L,GA5BmB,EA4BP1L,EACZwI,GAAsB,GAAVxI,EACZ2L,GA1Be,IA0BN3L,EACTiK,GAAOyB,QAAYr9E,EAAYy7E,EAAW/rE,GA6C9C,OA3CA,SAAS6b,UAKP,IAJA,IAAIrvB,GAASyE,UAAUzE,OACnByhB,GAAO/gB,MAAMV,IACbqU,GAAQrU,GAELqU,MACLoN,GAAKpN,IAAS5P,UAAU4P,IAE1B,GAAI4pE,GACF,IAAIgB,GAAcuB,EAAUnxD,SACxBgyD,GAAerC,EAAav9D,GAAMw9D,IASxC,GAPIlB,IACFt8D,GAAOq8D,EAAYr8D,GAAMs8D,EAAUC,GAASC,KAE1C6C,KACFr/D,GAAO+8D,EAAiB/8D,GAAMq/D,GAAeC,GAAc9C,KAE7Dj+E,IAAUqhF,GACNpD,IAAaj+E,GAASiwB,GAAO,CAC/B,IAAIqxD,GAAab,EAAeh/D,GAAMw9D,IACtC,OAAOsB,EACL/sE,EAAMiiE,EAAS6K,aAAcjxD,QAAQ4vD,YAAahpD,EAClDxU,GAAM6/D,GAAYN,GAAQC,GAAKhxD,GAAQjwB,GAE3C,CACA,IAAIqgF,GAAcZ,GAASxpD,EAAU14B,KACjCiV,GAAK2uE,GAAYd,GAAY7sE,GAAQA,EAczC,OAZAxT,GAASyhB,GAAKzhB,OACVghF,GACFv/D,GAAOo/D,EAAQp/D,GAAMu/D,IACZI,IAAUphF,GAAS,GAC5ByhB,GAAKq5B,UAEHomC,IAASD,GAAMjhF,KACjByhB,GAAKzhB,OAASihF,IAEZ1jF,MAAQA,OAASN,GAAQM,gBAAgB8xB,UAC3C7c,GAAKktE,IAAQH,EAAW/sE,KAEnBA,GAAGjK,MAAM83E,GAAa5+D,GAC/B,CAEF,mBCzFA,IAAIlZ,EAAQ,EAAQ,OAChBg3E,EAAa,EAAQ,OACrBtiF,EAAO,EAAQ,OAwCnBG,EAAOD,QAvBP,SAASokF,cAAc/tE,EAAMiiE,EAASx/C,EAAS8nD,GAC7C,IAAI0B,EAfe,EAeNhK,EACTiK,EAAOH,EAAW/rE,GAkBtB,OAhBA,SAAS6b,UAQP,IAPA,IAAI6uD,GAAa,EACbx8D,EAAajd,UAAUzE,OACvBo+E,GAAa,EACbC,EAAaN,EAAS/9E,OACtByhB,EAAO/gB,MAAM29E,EAAa38D,GAC1BlP,EAAMjV,MAAQA,OAASN,GAAQM,gBAAgB8xB,QAAWqwD,EAAOlsE,IAE5D4qE,EAAYC,GACnB58D,EAAK28D,GAAaL,EAASK,GAE7B,KAAO18D,KACLD,EAAK28D,KAAe35E,YAAYy5E,GAElC,OAAO31E,EAAMiK,EAAIitE,EAASxpD,EAAU14B,KAAMkkB,EAC5C,CAEF,mBCxCA,IAAI+/D,EAAa,EAAQ,OACrB3pE,EAAU,EAAQ,KAClB4pE,EAAkB,EAAQ,OAqD9BrkF,EAAOD,QA1BP,SAASojF,cAAc/sE,EAAMiiE,EAASiM,EAAUzC,EAAahpD,EAAS8nD,EAAUC,EAASgD,EAAQC,EAAKhxD,GACpG,IAAI0xD,GAtBgB,EAsBNlM,EAMdA,GAAYkM,GA3BU,GACM,GAHF,GA8B1BlM,KAAakM,GA3Be,GADN,OA+BpBlM,IAAW,GAEb,IAAImM,GAAU,CACZpuE,EAAMiiE,EAASx/C,EAVC0rD,GAAU5D,OAAWj6E,EAFtB69E,GAAU3D,OAAUl6E,EAGd69E,QAAU79E,EAAYi6E,EAFvB4D,QAAU79E,EAAYk6E,EAYzBgD,EAAQC,EAAKhxD,GAG5BnV,GAAS4mE,EAASn5E,WAAMzE,EAAW89E,IAKvC,OAJIJ,EAAWhuE,IACbqE,EAAQiD,GAAQ8mE,IAElB9mE,GAAOmkE,YAAcA,EACdwC,EAAgB3mE,GAAQtH,EAAMiiE,EACvC,mBCrDA,IAAIuG,EAAc,EAAQ,OACtBwD,EAAa,EAAQ,OACrBkB,EAAc,EAAQ,OACtBJ,EAAe,EAAQ,OACvBiB,EAAgB,EAAQ,OACxBM,EAAU,EAAQ,OAClBC,EAAY,EAAQ,OACpBjqE,EAAU,EAAQ,KAClB4pE,EAAkB,EAAQ,OAC1BM,EAAY,EAAQ,OAcpBjU,GAAYpmE,KAAK2C,IAkFrBjN,EAAOD,QAvDP,SAAS6kF,WAAWxuE,EAAMiiE,EAASx/C,EAAS8nD,GAAUC,GAASgD,GAAQC,GAAKhxD,IAC1E,IAAIkxD,GAnCmB,EAmCP1L,EAChB,IAAK0L,IAA4B,mBAAR3tE,EACvB,MAAM,IAAItR,UAzCQ,uBA2CpB,IAAIlC,GAAS+9E,GAAWA,GAAS/9E,OAAS,EAS1C,GARKA,KACHy1E,IAAW,GACXsI,GAAWC,QAAUl6E,GAEvBm9E,QAAcn9E,IAARm9E,GAAoBA,GAAMnT,GAAUiU,EAAUd,IAAM,GAC1DhxD,QAAkBnsB,IAAVmsB,GAAsBA,GAAQ8xD,EAAU9xD,IAChDjwB,IAAUg+E,GAAUA,GAAQh+E,OAAS,EA1CT,GA4CxBy1E,EAAmC,CACrC,IAAIqL,GAAgB/C,GAChBgD,GAAe/C,GAEnBD,GAAWC,QAAUl6E,CACvB,CACA,IAAII,GAAOi9E,QAAYr9E,EAAY+9E,EAAQruE,GAEvCouE,GAAU,CACZpuE,EAAMiiE,EAASx/C,EAAS8nD,GAAUC,GAAS8C,GAAeC,GAC1DC,GAAQC,GAAKhxD,IAkBf,GAfI/rB,IACF49E,EAAUF,GAAS19E,IAErBsP,EAAOouE,GAAQ,GACfnM,EAAUmM,GAAQ,GAClB3rD,EAAU2rD,GAAQ,GAClB7D,GAAW6D,GAAQ,GACnB5D,GAAU4D,GAAQ,KAClB3xD,GAAQ2xD,GAAQ,QAAoB99E,IAAf89E,GAAQ,GACxBT,GAAY,EAAI3tE,EAAKxT,OACtB8tE,GAAU8T,GAAQ,GAAK5hF,GAAQ,KAEX,GAAVy1E,IACZA,IAAW,IAERA,GA7Ec,GA6EHA,EAGd36D,GA9EkB,GA6ET26D,GA5Ee,IA4EeA,EAC9BiL,EAAYltE,EAAMiiE,EAASxlD,IA5EhB,IA6EVwlD,GAA2C,IAAXA,GAAqDuI,GAAQh+E,OAG9FsgF,EAAa/3E,WAAMzE,EAAW89E,IAF9BL,EAAc/tE,EAAMiiE,EAASx/C,EAAS8nD,SAJ/C,IAAIjjE,GAAS0kE,EAAWhsE,EAAMiiE,EAASx/C,GASzC,OAAOwrD,GADMv9E,GAAO83E,EAAcnkE,GACJiD,GAAQ8mE,IAAUpuE,EAAMiiE,EACxD,mBCvGA,IAAIwF,EAAgB,EAAQ,OAe5B79E,EAAOD,QAJP,SAAS8kF,gBAAgB5/E,GACvB,OAAO44E,EAAc54E,QAASyB,EAAYzB,CAC5C,mBCbA,IAoEI6/E,EApEiB,EAAQ,MAoEV1G,CAjEG,CAEpB,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAC1E,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAC1E,EAAQ,IAAM,EAAQ,IACtB,EAAQ,IAAM,EAAQ,IACtB,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IACtB,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAC1E,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAC1E,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IAAK,EAAQ,IAChD,EAAQ,IAAM,EAAQ,IAAK,EAAQ,IACnC,EAAQ,KAAM,EAAQ,KACtB,EAAQ,KAAM,EAAQ,KACtB,EAAQ,KAER,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAC1B,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACvE,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IACxD,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACtF,EAAU,IAAM,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IAAK,EAAU,IACtF,EAAU,IAAM,EAAU,IAC1B,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,IAAM,EAAU,IAAK,EAAU,IACzC,EAAU,KAAM,EAAU,KAC1B,EAAU,KAAM,EAAU,KAC1B,EAAU,KAAM,EAAU,MAa5Bp+E,EAAOD,QAAU+kF,mBCtEjB,IAAItS,EAAY,EAAQ,OAEpB5mE,EAAkB,WACpB,IACE,IAAIwK,EAAOo8D,EAAU/tE,OAAQ,kBAE7B,OADA2R,EAAK,CAAC,EAAG,GAAI,CAAC,GACPA,CACT,CAAE,MAAO3K,GAAI,CACf,CANqB,GAQrBzL,EAAOD,QAAU6L,mBCVjB,IAAIgpE,EAAW,EAAQ,OACnB4B,EAAY,EAAQ,OACpBoJ,EAAW,EAAQ,OAiFvB5/E,EAAOD,QA9DP,SAASy6E,YAAYtzE,EAAOquD,EAAO8iB,EAASC,EAAYsC,EAAWhnE,GACjE,IAAImxE,EAjBqB,EAiBT1M,EACZ1vE,EAAYzB,EAAMtE,OAClBoiF,EAAYzvB,EAAM3yD,OAEtB,GAAI+F,GAAaq8E,KAAeD,GAAaC,EAAYr8E,GACvD,OAAO,EAGT,IAAIs8E,EAAarxE,EAAM9H,IAAI5E,GACvBg+E,GAAatxE,EAAM9H,IAAIypD,GAC3B,GAAI0vB,GAAcC,GAChB,OAAOD,GAAc1vB,GAAS2vB,IAAch+E,EAE9C,IAAI+P,IAAS,EACTyG,IAAS,EACTynE,GA/BuB,EA+Bf9M,EAAoC,IAAIzD,OAAWluE,EAM/D,IAJAkN,EAAMlH,IAAIxF,EAAOquD,GACjB3hD,EAAMlH,IAAI6oD,EAAOruD,KAGR+P,GAAQtO,GAAW,CAC1B,IAAIy8E,GAAWl+E,EAAM+P,IACjBouE,GAAW9vB,EAAMt+C,IAErB,GAAIqhE,EACF,IAAIgN,GAAWP,EACXzM,EAAW+M,GAAUD,GAAUnuE,GAAOs+C,EAAOruD,EAAO0M,GACpD0kE,EAAW8M,GAAUC,GAAUpuE,GAAO/P,EAAOquD,EAAO3hD,GAE1D,QAAiBlN,IAAb4+E,GAAwB,CAC1B,GAAIA,GACF,SAEF5nE,IAAS,EACT,KACF,CAEA,GAAIynE,IACF,IAAK3O,EAAUjhB,GAAO,SAAS8vB,EAAUE,GACnC,IAAK3F,EAASuF,GAAMI,KACfH,KAAaC,GAAYzK,EAAUwK,GAAUC,EAAUhN,EAASC,EAAY1kE,IAC/E,OAAOuxE,GAAKliF,KAAKsiF,EAErB,IAAI,CACN7nE,IAAS,EACT,KACF,OACK,GACD0nE,KAAaC,KACXzK,EAAUwK,GAAUC,GAAUhN,EAASC,EAAY1kE,GACpD,CACL8J,IAAS,EACT,KACF,CACF,CAGA,OAFA9J,EAAc,OAAE1M,GAChB0M,EAAc,OAAE2hD,GACT73C,EACT,mBCjFA,IAAI1Z,EAAS,EAAQ,OACjBX,EAAa,EAAQ,OACrBwzE,EAAK,EAAQ,OACb2D,EAAc,EAAQ,OACtBgL,EAAa,EAAQ,OACrBC,EAAa,EAAQ,OAqBrBxG,EAAcj7E,EAASA,EAAOW,eAAY+B,EAC1C65E,EAAgBtB,EAAcA,EAAY74E,aAAUM,EAoFxD1G,EAAOD,QAjEP,SAAS06E,WAAW97D,EAAQ42C,EAAO93C,EAAK46D,EAASC,EAAYsC,EAAWhnE,GACtE,OAAQ6J,GACN,IAzBc,oBA0BZ,GAAKkB,EAAOjd,YAAc6zD,EAAM7zD,YAC3Bid,EAAO1Y,YAAcsvD,EAAMtvD,WAC9B,OAAO,EAET0Y,EAASA,EAAO3Y,OAChBuvD,EAAQA,EAAMvvD,OAEhB,IAlCiB,uBAmCf,QAAK2Y,EAAOjd,YAAc6zD,EAAM7zD,aAC3Bk5E,EAAU,IAAIv3E,EAAWsb,GAAS,IAAItb,EAAWkyD,KAKxD,IAnDU,mBAoDV,IAnDU,gBAoDV,IAjDY,kBAoDV,OAAOshB,GAAIl4D,GAAS42C,GAEtB,IAxDW,iBAyDT,OAAO52C,EAAOhL,MAAQ4hD,EAAM5hD,MAAQgL,EAAO9K,SAAW0hD,EAAM1hD,QAE9D,IAxDY,kBAyDZ,IAvDY,kBA2DV,OAAO8K,GAAW42C,EAAQ,GAE5B,IAjES,eAkEP,IAAImwB,GAAUF,EAEhB,IAjES,eAkEP,IAAIT,GA5EiB,EA4EL1M,EAGhB,GAFAqN,KAAYA,GAAUD,GAElB9mE,EAAO1X,MAAQsuD,EAAMtuD,OAAS89E,GAChC,OAAO,EAGT,IAAIpM,GAAU/kE,EAAM9H,IAAI6S,GACxB,GAAIg6D,GACF,OAAOA,IAAWpjB,EAEpB8iB,GAtFuB,EAyFvBzkE,EAAMlH,IAAIiS,EAAQ42C,GAClB,IAAI73C,GAAS88D,EAAYkL,GAAQ/mE,GAAS+mE,GAAQnwB,GAAQ8iB,EAASC,EAAYsC,EAAWhnE,GAE1F,OADAA,EAAc,OAAE+K,GACTjB,GAET,IAnFY,kBAoFV,GAAI6iE,EACF,OAAOA,EAAc/3E,KAAKmW,IAAW4hE,EAAc/3E,KAAK+sD,GAG9D,OAAO,CACT,mBC7GA,IAAImiB,EAAa,EAAQ,OASrBnhE,EAHc9R,OAAOE,UAGQ4R,eAgFjCvW,EAAOD,QAjEP,SAAS26E,aAAa/7D,EAAQ42C,EAAO8iB,EAASC,EAAYsC,EAAWhnE,GACnE,IAAImxE,EAtBqB,EAsBT1M,EACZsN,EAAWjO,EAAW/4D,GACtBinE,EAAYD,EAAS/iF,OAIzB,GAAIgjF,GAHWlO,EAAWniB,GACD3yD,SAEMmiF,EAC7B,OAAO,EAGT,IADA,IAAI9tE,EAAQ2uE,EACL3uE,KAAS,CACd,IAAIL,EAAM+uE,EAAS1uE,GACnB,KAAM8tE,EAAYnuE,KAAO2+C,EAAQh/C,EAAe/N,KAAK+sD,EAAO3+C,IAC1D,OAAO,CAEX,CAEA,IAAIivE,GAAajyE,EAAM9H,IAAI6S,GACvBumE,GAAatxE,EAAM9H,IAAIypD,GAC3B,GAAIswB,IAAcX,GAChB,OAAOW,IAActwB,GAAS2vB,IAAcvmE,EAE9C,IAAIjB,IAAS,EACb9J,EAAMlH,IAAIiS,EAAQ42C,GAClB3hD,EAAMlH,IAAI6oD,EAAO52C,GAGjB,IADA,IAAImnE,GAAWf,IACN9tE,EAAQ2uE,GAAW,CAE1B,IAAI5O,GAAWr4D,EADf/H,EAAM+uE,EAAS1uE,IAEXouE,GAAW9vB,EAAM3+C,GAErB,GAAI0hE,EACF,IAAIgN,GAAWP,EACXzM,EAAW+M,GAAUrO,GAAUpgE,EAAK2+C,EAAO52C,EAAQ/K,GACnD0kE,EAAWtB,GAAUqO,GAAUzuE,EAAK+H,EAAQ42C,EAAO3hD,GAGzD,UAAmBlN,IAAb4+E,GACGtO,KAAaqO,IAAYzK,EAAU5D,GAAUqO,GAAUhN,EAASC,EAAY1kE,GAC7E0xE,IACD,CACL5nE,IAAS,EACT,KACF,CACAooE,KAAaA,GAAkB,eAAPlvE,EAC1B,CACA,GAAI8G,KAAWooE,GAAU,CACvB,IAAIC,GAAUpnE,EAAOpL,YACjByyE,GAAUzwB,EAAMhiD,YAGhBwyE,IAAWC,MACV,gBAAiBrnE,MAAU,gBAAiB42C,IACzB,mBAAXwwB,IAAyBA,cAAmBA,IACjC,mBAAXC,IAAyBA,cAAmBA,KACvDtoE,IAAS,EAEb,CAGA,OAFA9J,EAAc,OAAE+K,GAChB/K,EAAc,OAAE2hD,GACT73C,EACT,mBCvFA,IAAIynD,EAAU,EAAQ,OAClBoZ,EAAW,EAAQ,OACnBC,EAAc,EAAQ,OAa1Bx+E,EAAOD,QAJP,SAASkmF,SAAS7vE,GAChB,OAAOooE,EAAYD,EAASnoE,OAAM1P,EAAWy+D,GAAU/uD,EAAO,GAChE,mBCZA,IAAIm6D,EAA8B,iBAAV,EAAAzqD,GAAsB,EAAAA,GAAU,EAAAA,EAAOrhB,SAAWA,QAAU,EAAAqhB,EAEpF9lB,EAAOD,QAAUwwE,mBCHjB,IAAIoJ,EAAiB,EAAQ,OACzB8H,EAAa,EAAQ,OACrBvjE,EAAO,EAAQ,MAanBle,EAAOD,QAJP,SAAS23E,WAAW/4D,GAClB,OAAOg7D,EAAeh7D,EAAQT,EAAMujE,EACtC,mBCbA,IAAI9H,EAAiB,EAAQ,OACzB+H,EAAe,EAAQ,OACvBtK,EAAS,EAAQ,OAcrBp3E,EAAOD,QAJP,SAAS43E,aAAah5D,GACpB,OAAOg7D,EAAeh7D,EAAQy4D,EAAQsK,EACxC,mBCdA,IAAI/C,EAAU,EAAQ,OAClBuH,EAAO,EAAQ,OASfzB,EAAW9F,EAAiB,SAASvoE,GACvC,OAAOuoE,EAAQ7yE,IAAIsK,EACrB,EAFyB8vE,EAIzBlmF,EAAOD,QAAU0kF,mBCdjB,IAAI0B,EAAY,EAAQ,OAMpB5vE,EAHc9R,OAAOE,UAGQ4R,eAwBjCvW,EAAOD,QAfP,SAASqmF,YAAYhwE,GAKnB,IAJA,IAAIsH,EAAUtH,EAAKzC,KAAO,GACtBzM,EAAQi/E,EAAUzoE,GAClB9a,EAAS2T,EAAe/N,KAAK29E,EAAWzoE,GAAUxW,EAAMtE,OAAS,EAE9DA,KAAU,CACf,IAAIkE,EAAOI,EAAMtE,GACbyjF,EAAYv/E,EAAKsP,KACrB,GAAiB,MAAbiwE,GAAqBA,GAAajwE,EACpC,OAAOtP,EAAK6M,IAEhB,CACA,OAAO+J,CACT,aChBA1d,EAAOD,QALP,SAASqjF,UAAUhtE,GAEjB,OADaA,EACCyrE,WAChB,mBCVA,IAAIyE,EAAY,EAAQ,OAiBxBtmF,EAAOD,QAPP,SAASwmF,WAAWhwD,EAAK3f,GACvB,IAAI9P,EAAOyvB,EAAIs+C,SACf,OAAOyR,EAAU1vE,GACb9P,EAAmB,iBAAP8P,EAAkB,SAAW,QACzC9P,EAAKyvB,GACX,kBCfA,IAAI+mD,EAAqB,EAAQ,OAC7Bp/D,EAAO,EAAQ,MAsBnBle,EAAOD,QAbP,SAASo9E,aAAax+D,GAIpB,IAHA,IAAIjB,EAASQ,EAAKS,GACd/b,EAAS8a,EAAO9a,OAEbA,KAAU,CACf,IAAIgU,EAAM8G,EAAO9a,GACbqC,EAAQ0Z,EAAO/H,GAEnB8G,EAAO9a,GAAU,CAACgU,EAAK3R,EAAOq4E,EAAmBr4E,GACnD,CACA,OAAOyY,CACT,mBCrBA,IAAI0+D,EAAe,EAAQ,OACvBoK,EAAW,EAAQ,OAevBxmF,EAAOD,QALP,SAASyyE,UAAU7zD,EAAQ/H,GACzB,IAAI3R,EAAQuhF,EAAS7nE,EAAQ/H,GAC7B,OAAOwlE,EAAan3E,GAASA,OAAQyB,CACvC,mBCdA,IAGI+/E,EAHU,EAAQ,KAGHC,CAAQjiF,OAAO8Z,eAAgB9Z,QAElDzE,EAAOD,QAAU0mF,mBCLjB,IAAIziF,EAAS,EAAQ,OAGjBi4E,EAAcx3E,OAAOE,UAGrB4R,EAAiB0lE,EAAY1lE,eAO7BowE,EAAuB1K,EAAY90E,SAGnC4yE,EAAiB/1E,EAASA,EAAOg2E,iBAActzE,EA6BnD1G,EAAOD,QApBP,SAAS+5E,UAAU70E,GACjB,IAAIusC,EAAQj7B,EAAe/N,KAAKvD,EAAO80E,GACnCt8D,EAAMxY,EAAM80E,GAEhB,IACE90E,EAAM80E,QAAkBrzE,EACxB,IAAIkgF,GAAW,CACjB,CAAE,MAAOn7E,GAAI,CAEb,IAAIiS,EAASipE,EAAqBn+E,KAAKvD,GAQvC,OAPI2hF,IACEp1C,EACFvsC,EAAM80E,GAAkBt8D,SAEjBxY,EAAM80E,IAGVr8D,CACT,mBC3CA,IAAI23D,EAAc,EAAQ,OACtBwR,EAAY,EAAQ,OAMpB5gE,EAHcxhB,OAAOE,UAGcshB,qBAGnC6gE,EAAmBriF,OAAOgoB,sBAS1Bg1D,EAAcqF,EAA+B,SAASnoE,GACxD,OAAc,MAAVA,EACK,IAETA,EAASla,OAAOka,GACT02D,EAAYyR,EAAiBnoE,IAAS,SAASyN,GACpD,OAAOnG,EAAqBzd,KAAKmW,EAAQyN,EAC3C,IACF,EARqCy6D,EAUrC7mF,EAAOD,QAAU0hF,mBC7BjB,IAAItpD,EAAY,EAAQ,OACpBsuD,EAAe,EAAQ,OACvBhF,EAAa,EAAQ,OACrBoF,EAAY,EAAQ,OAYpBnF,EATmBj9E,OAAOgoB,sBASqB,SAAS9N,GAE1D,IADA,IAAIjB,EAAS,GACNiB,GACLwZ,EAAUza,EAAQ+jE,EAAW9iE,IAC7BA,EAAS8nE,EAAa9nE,GAExB,OAAOjB,CACT,EAPuCmpE,EASvC7mF,EAAOD,QAAU2hF,mBCxBjB,IAAIxyC,EAAW,EAAQ,OACnBS,EAAM,EAAQ,OACdvH,EAAU,EAAQ,OAClByH,EAAM,EAAQ,OACdjpB,EAAU,EAAQ,OAClBqzD,EAAa,EAAQ,OACrBzoB,EAAW,EAAQ,OAGnBu1B,EAAS,eAETC,EAAa,mBACbC,EAAS,eACTC,GAAa,mBAEbC,GAAc,oBAGdC,GAAqB51B,EAAStiB,GAC9Bm4C,GAAgB71B,EAAS7hB,GACzB23C,GAAoB91B,EAASppB,GAC7Bm/C,GAAgB/1B,EAAS3hB,GACzB23C,GAAoBh2B,EAAS5qC,GAS7BgxD,GAASqC,GAGR/qC,GAAY0oC,GAAO,IAAI1oC,EAAS,IAAIzpC,YAAY,MAAQ0hF,IACxDx3C,GAAOioC,GAAO,IAAIjoC,IAAQo3C,GAC1B3+C,GAAWwvC,GAAOxvC,EAAQC,YAAc2+C,GACxCn3C,GAAO+nC,GAAO,IAAI/nC,IAAQo3C,GAC1BrgE,GAAWgxD,GAAO,IAAIhxD,IAAYsgE,MACrCtP,GAAS,SAAS3yE,GAChB,IAAIyY,EAASu8D,EAAWh1E,GACpBq9E,EA/BQ,mBA+BD5kE,EAAsBzY,EAAMsO,iBAAc7M,EACjD+gF,EAAanF,EAAO9wB,EAAS8wB,GAAQ,GAEzC,GAAImF,EACF,OAAQA,GACN,KAAKL,GAAoB,OAAOD,GAChC,KAAKE,GAAe,OAAON,EAC3B,KAAKO,GAAmB,OAAON,EAC/B,KAAKO,GAAe,OAAON,EAC3B,KAAKO,GAAmB,OAAON,GAGnC,OAAOxpE,CACT,GAGF1d,EAAOD,QAAU63E,cC7CjB53E,EAAOD,QAJP,SAASymF,SAAS7nE,EAAQ/H,GACxB,OAAiB,MAAV+H,OAAiBjY,EAAYiY,EAAO/H,EAC7C,aCTA,IAAI8wE,EAAgB,oCAChBC,EAAiB,QAcrB3nF,EAAOD,QALP,SAAS6nF,eAAe5pE,GACtB,IAAIhd,EAAQgd,EAAOhd,MAAM0mF,GACzB,OAAO1mF,EAAQA,EAAM,GAAG8T,MAAM6yE,GAAkB,EAClD,iBCdA,IAAInO,EAAW,EAAQ,OACnB9D,EAAc,EAAQ,OACtB7uE,EAAU,EAAQ,MAClB8uE,EAAU,EAAQ,OAClB2G,EAAW,EAAQ,OACnB7C,EAAQ,EAAQ,OAiCpBz5E,EAAOD,QAtBP,SAAS8nF,QAAQlpE,EAAQ9G,EAAMiwE,GAO7B,IAJA,IAAI7wE,GAAS,EACTrU,GAHJiV,EAAO2hE,EAAS3hE,EAAM8G,IAGJ/b,OACd8a,GAAS,IAEJzG,EAAQrU,GAAQ,CACvB,IAAIgU,EAAM6iE,EAAM5hE,EAAKZ,IACrB,KAAMyG,EAAmB,MAAViB,GAAkBmpE,EAAQnpE,EAAQ/H,IAC/C,MAEF+H,EAASA,EAAO/H,EAClB,CACA,OAAI8G,KAAYzG,GAASrU,EAChB8a,KAET9a,EAAmB,MAAV+b,EAAiB,EAAIA,EAAO/b,SAClB05E,EAAS15E,IAAW+yE,EAAQ/+D,EAAKhU,KACjDiE,EAAQ8X,IAAW+2D,EAAY/2D,GACpC,aCnCA,IAWIopE,EAAe7yD,OAAO,uFAa1Bl1B,EAAOD,QAJP,SAASwiF,WAAWp9E,GAClB,OAAO4iF,EAAatmF,KAAK0D,EAC3B,aCtBA,IAAI6iF,EAAmB,qEAavBhoF,EAAOD,QAJP,SAASkoF,eAAe9iF,GACtB,OAAO6iF,EAAiBvmF,KAAK0D,EAC/B,mBCZA,IAAI+iF,EAAe,EAAQ,OAc3BloF,EAAOD,QALP,SAAS0yE,YACPtyE,KAAK00E,SAAWqT,EAAeA,EAAa,MAAQ,CAAC,EACrD/nF,KAAK8G,KAAO,CACd,aCIAjH,EAAOD,QANP,SAAS2yE,WAAW97D,GAClB,IAAI8G,EAASvd,KAAKmmB,IAAI1P,WAAezW,KAAK00E,SAASj+D,GAEnD,OADAzW,KAAK8G,MAAQyW,EAAS,EAAI,EACnBA,CACT,mBCdA,IAAIwqE,EAAe,EAAQ,OASvB3xE,EAHc9R,OAAOE,UAGQ4R,eAoBjCvW,EAAOD,QATP,SAAS4yE,QAAQ/7D,GACf,IAAI9P,EAAO3G,KAAK00E,SAChB,GAAIqT,EAAc,CAChB,IAAIxqE,EAAS5W,EAAK8P,GAClB,MArBiB,8BAqBV8G,OAA4BhX,EAAYgX,CACjD,CACA,OAAOnH,EAAe/N,KAAK1B,EAAM8P,GAAO9P,EAAK8P,QAAOlQ,CACtD,mBC3BA,IAAIwhF,EAAe,EAAQ,OAMvB3xE,EAHc9R,OAAOE,UAGQ4R,eAgBjCvW,EAAOD,QALP,SAAS6yE,QAAQh8D,GACf,IAAI9P,EAAO3G,KAAK00E,SAChB,OAAOqT,OAA8BxhF,IAAdI,EAAK8P,GAAsBL,EAAe/N,KAAK1B,EAAM8P,EAC9E,mBCpBA,IAAIsxE,EAAe,EAAQ,OAsB3BloF,EAAOD,QAPP,SAAS8yE,QAAQj8D,EAAK3R,GACpB,IAAI6B,EAAO3G,KAAK00E,SAGhB,OAFA10E,KAAK8G,MAAQ9G,KAAKmmB,IAAI1P,GAAO,EAAI,EACjC9P,EAAK8P,GAAQsxE,QAA0BxhF,IAAVzB,EAfV,4BAekDA,EAC9D9E,IACT,aCnBA,IAGIoW,EAHc9R,OAAOE,UAGQ4R,eAqBjCvW,EAAOD,QAZP,SAAS83E,eAAe3wE,GACtB,IAAItE,EAASsE,EAAMtE,OACf8a,EAAS,IAAIxW,EAAMqM,YAAY3Q,GAOnC,OAJIA,GAA6B,iBAAZsE,EAAM,IAAkBqP,EAAe/N,KAAKtB,EAAO,WACtEwW,EAAOzG,MAAQ/P,EAAM+P,MACrByG,EAAOrJ,MAAQnN,EAAMmN,OAEhBqJ,CACT,mBCvBA,IAAIoiE,EAAmB,EAAQ,OAC3BI,EAAgB,EAAQ,OACxBG,EAAc,EAAQ,OACtBG,EAAc,EAAQ,OACtB7C,EAAkB,EAAQ,OAwE9B39E,EAAOD,QApCP,SAAS+3E,eAAen5D,EAAQlB,EAAK86D,GACnC,IAAI+J,EAAO3jE,EAAOpL,YAClB,OAAQkK,GACN,IA3BiB,uBA4Bf,OAAOqiE,EAAiBnhE,GAE1B,IAvCU,mBAwCV,IAvCU,gBAwCR,OAAO,IAAI2jE,GAAM3jE,GAEnB,IAjCc,oBAkCZ,OAAOuhE,EAAcvhE,EAAQ45D,GAE/B,IAnCa,wBAmCI,IAlCJ,wBAmCb,IAlCU,qBAkCI,IAjCH,sBAiCkB,IAhClB,sBAiCX,IAhCW,sBAgCI,IA/BG,6BA+BmB,IA9BzB,uBA8ByC,IA7BzC,uBA8BV,OAAOoF,EAAgBh/D,EAAQ45D,GAEjC,IAjDS,eA2DT,IAxDS,eAyDP,OAAO,IAAI+J,EARb,IAnDY,kBAoDZ,IAjDY,kBAkDV,OAAO,IAAIA,EAAK3jE,GAElB,IAtDY,kBAuDV,OAAO0hE,EAAY1hE,GAKrB,IAzDY,kBA0DV,OAAO6hE,EAAY7hE,GAEzB,mBC1EA,IAAIo0D,EAAa,EAAQ,MACrB0T,EAAe,EAAQ,OACvB5J,EAAc,EAAQ,OAe1B78E,EAAOD,QANP,SAASg4E,gBAAgBp5D,GACvB,MAAqC,mBAAtBA,EAAOpL,aAA8BspE,EAAYl+D,GAE5D,CAAC,EADDo0D,EAAW0T,EAAa9nE,GAE9B,aCdA,IAAIwpE,EAAgB,4CAqBpBnoF,EAAOD,QAXP,SAASqoF,kBAAkBpqE,EAAQqqE,GACjC,IAAIzlF,EAASylF,EAAQzlF,OACrB,IAAKA,EACH,OAAOob,EAET,IAAIo7B,EAAYx2C,EAAS,EAGzB,OAFAylF,EAAQjvC,IAAcx2C,EAAS,EAAI,KAAO,IAAMylF,EAAQjvC,GACxDivC,EAAUA,EAAQjlF,KAAKR,EAAS,EAAI,KAAO,KACpCob,EAAOjd,QAAQonF,EAAe,uBAAyBE,EAAU,SAC1E,mBCpBA,IAAIrkF,EAAS,EAAQ,OACjB0xE,EAAc,EAAQ,OACtB7uE,EAAU,EAAQ,MAGlByhF,EAAmBtkF,EAASA,EAAOukF,wBAAqB7hF,EAc5D1G,EAAOD,QALP,SAASo5E,cAAcl0E,GACrB,OAAO4B,EAAQ5B,IAAUywE,EAAYzwE,OAChCqjF,GAAoBrjF,GAASA,EAAMqjF,GAC1C,aChBA,IAGIE,EAAW,mBAoBfxoF,EAAOD,QAVP,SAAS41E,QAAQ1wE,EAAOrC,GACtB,IAAIgE,SAAc3B,EAGlB,SAFArC,EAAmB,MAAVA,EAfY,iBAewBA,KAGlC,UAARgE,GACU,UAARA,GAAoB4hF,EAAS/mF,KAAKwD,KAChCA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,EAAQrC,CACjD,mBCtBA,IAAIi0E,EAAK,EAAQ,OACbhmB,EAAc,EAAQ,OACtB8kB,EAAU,EAAQ,OAClBp5D,EAAW,EAAQ,OA0BvBvc,EAAOD,QAdP,SAAS+hF,eAAe78E,EAAOgS,EAAO0H,GACpC,IAAKpC,EAASoC,GACZ,OAAO,EAET,IAAI/X,SAAcqQ,EAClB,SAAY,UAARrQ,EACKiqD,EAAYlyC,IAAWg3D,EAAQ1+D,EAAO0H,EAAO/b,QACrC,UAARgE,GAAoBqQ,KAAS0H,IAE7Bk4D,EAAGl4D,EAAO1H,GAAQhS,EAG7B,mBC3BA,IAAI4B,EAAU,EAAQ,MAClBkqB,EAAW,EAAQ,OAGnB03D,EAAe,mDACfC,EAAgB,QAuBpB1oF,EAAOD,QAbP,SAASs9E,MAAMp4E,EAAO0Z,GACpB,GAAI9X,EAAQ5B,GACV,OAAO,EAET,IAAI2B,SAAc3B,EAClB,QAAY,UAAR2B,GAA4B,UAARA,GAA4B,WAARA,GAC/B,MAAT3B,IAAiB8rB,EAAS9rB,MAGvByjF,EAAcjnF,KAAKwD,KAAWwjF,EAAahnF,KAAKwD,IAC1C,MAAV0Z,GAAkB1Z,KAASR,OAAOka,GACvC,aCZA3e,EAAOD,QAPP,SAASumF,UAAUrhF,GACjB,IAAI2B,SAAc3B,EAClB,MAAgB,UAAR2B,GAA4B,UAARA,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAV3B,EACU,OAAVA,CACP,mBCZA,IAAIguE,EAAc,EAAQ,OACtBwR,EAAU,EAAQ,OAClB2B,EAAc,EAAQ,OACtBuC,EAAS,EAAQ,MAwBrB3oF,EAAOD,QAdP,SAASqkF,WAAWhuE,GAClB,IAAIwyE,EAAWxC,EAAYhwE,GACvBm/C,EAAQozB,EAAOC,GAEnB,GAAoB,mBAATrzB,KAAyBqzB,KAAY3V,EAAYtuE,WAC1D,OAAO,EAET,GAAIyR,IAASm/C,EACX,OAAO,EAET,IAAIzuD,EAAO29E,EAAQlvB,GACnB,QAASzuD,GAAQsP,IAAStP,EAAK,EACjC,mBCzBA,IAIMkpB,EAJF2xD,EAAa,EAAQ,OAGrBkH,GACE74D,EAAM,SAASvM,KAAKk+D,GAAcA,EAAWzjE,MAAQyjE,EAAWzjE,KAAKgP,UAAY,KACvE,iBAAmB8C,EAAO,GAc1ChwB,EAAOD,QAJP,SAAS+7E,SAAS1lE,GAChB,QAASyyE,GAAeA,KAAczyE,CACxC,aChBA,IAAI6lE,EAAcx3E,OAAOE,UAgBzB3E,EAAOD,QAPP,SAAS88E,YAAY53E,GACnB,IAAIq9E,EAAOr9E,GAASA,EAAMsO,YAG1B,OAAOtO,KAFqB,mBAARq9E,GAAsBA,EAAK39E,WAAcs3E,EAG/D,mBCfA,IAAI1/D,EAAW,EAAQ,OAcvBvc,EAAOD,QAJP,SAASu9E,mBAAmBr4E,GAC1B,OAAOA,GAAUA,IAAUsX,EAAStX,EACtC,aCAAjF,EAAOD,QALP,SAAS0zE,iBACPtzE,KAAK00E,SAAW,GAChB10E,KAAK8G,KAAO,CACd,mBCVA,IAAIgwE,EAAe,EAAQ,OAMvBxmC,EAHantC,MAAMqB,UAGC8rC,OA4BxBzwC,EAAOD,QAjBP,SAAS2zE,gBAAgB98D,GACvB,IAAI9P,EAAO3G,KAAK00E,SACZ59D,EAAQggE,EAAanwE,EAAM8P,GAE/B,QAAIK,EAAQ,KAIRA,GADYnQ,EAAKlE,OAAS,EAE5BkE,EAAKoxB,MAELuY,EAAOjoC,KAAK1B,EAAMmQ,EAAO,KAEzB9W,KAAK8G,MACA,EACT,mBChCA,IAAIgwE,EAAe,EAAQ,OAkB3Bj3E,EAAOD,QAPP,SAAS4zE,aAAa/8D,GACpB,IAAI9P,EAAO3G,KAAK00E,SACZ59D,EAAQggE,EAAanwE,EAAM8P,GAE/B,OAAOK,EAAQ,OAAIvQ,EAAYI,EAAKmQ,GAAO,EAC7C,mBChBA,IAAIggE,EAAe,EAAQ,OAe3Bj3E,EAAOD,QAJP,SAAS6zE,aAAah9D,GACpB,OAAOqgE,EAAa92E,KAAK00E,SAAUj+D,IAAQ,CAC7C,mBCbA,IAAIqgE,EAAe,EAAQ,OAyB3Bj3E,EAAOD,QAbP,SAAS8zE,aAAaj9D,EAAK3R,GACzB,IAAI6B,EAAO3G,KAAK00E,SACZ59D,EAAQggE,EAAanwE,EAAM8P,GAQ/B,OANIK,EAAQ,KACR9W,KAAK8G,KACPH,EAAK7D,KAAK,CAAC2T,EAAK3R,KAEhB6B,EAAKmQ,GAAO,GAAKhS,EAEZ9E,IACT,mBCvBA,IAAI2yE,EAAO,EAAQ,MACfgB,EAAY,EAAQ,OACpBnkC,EAAM,EAAQ,OAkBlB3vC,EAAOD,QATP,SAASq0E,gBACPj0E,KAAK8G,KAAO,EACZ9G,KAAK00E,SAAW,CACd,KAAQ,IAAI/B,EACZ,IAAO,IAAKnjC,GAAOmkC,GACnB,OAAU,IAAIhB,EAElB,mBClBA,IAAIyT,EAAa,EAAQ,OAiBzBvmF,EAAOD,QANP,SAASs0E,eAAez9D,GACtB,IAAI8G,EAAS6oE,EAAWpmF,KAAMyW,GAAa,OAAEA,GAE7C,OADAzW,KAAK8G,MAAQyW,EAAS,EAAI,EACnBA,CACT,kBCfA,IAAI6oE,EAAa,EAAQ,OAezBvmF,EAAOD,QAJP,SAASu0E,YAAY19D,GACnB,OAAO2vE,EAAWpmF,KAAMyW,GAAK9K,IAAI8K,EACnC,mBCbA,IAAI2vE,EAAa,EAAQ,OAezBvmF,EAAOD,QAJP,SAASw0E,YAAY39D,GACnB,OAAO2vE,EAAWpmF,KAAMyW,GAAK0P,IAAI1P,EACnC,mBCbA,IAAI2vE,EAAa,EAAQ,OAqBzBvmF,EAAOD,QATP,SAASy0E,YAAY59D,EAAK3R,GACxB,IAAI6B,EAAOy/E,EAAWpmF,KAAMyW,GACxB3P,EAAOH,EAAKG,KAIhB,OAFAH,EAAK4F,IAAIkK,EAAK3R,GACd9E,KAAK8G,MAAQH,EAAKG,MAAQA,EAAO,EAAI,EAC9B9G,IACT,aCFAH,EAAOD,QAVP,SAASylF,WAAWjvD,GAClB,IAAItf,GAAS,EACTyG,EAASpa,MAAMizB,EAAItvB,MAKvB,OAHAsvB,EAAIlK,SAAQ,SAASpnB,EAAO2R,GAC1B8G,IAASzG,GAAS,CAACL,EAAK3R,EAC1B,IACOyY,CACT,aCIA1d,EAAOD,QAVP,SAASq9E,wBAAwBxmE,EAAK+kE,GACpC,OAAO,SAASh9D,GACd,OAAc,MAAVA,IAGGA,EAAO/H,KAAS+kE,SACPj1E,IAAbi1E,GAA2B/kE,KAAOnS,OAAOka,IAC9C,CACF,mBCjBA,IAAImqE,EAAU,EAAQ,OAyBtB9oF,EAAOD,QAZP,SAASgpF,cAAc3yE,GACrB,IAAIsH,EAASorE,EAAQ1yE,GAAM,SAASQ,GAIlC,OAfmB,MAYfw8C,EAAMnsD,MACRmsD,EAAMphB,QAEDp7B,CACT,IAEIw8C,EAAQ11C,EAAO01C,MACnB,OAAO11C,CACT,mBCvBA,IAAIgjE,EAAc,EAAQ,OACtBU,EAAmB,EAAQ,OAC3BiC,EAAiB,EAAQ,OAGzB2F,EAAc,yBAOdC,EAAgB,IAIhBtY,EAAYrmE,KAAKC,IAyErBvK,EAAOD,QAvDP,SAAS2kF,UAAU59E,EAAMkX,GACvB,IAAIq6D,EAAUvxE,EAAK,GACfoiF,EAAalrE,EAAO,GACpBmrE,EAAa9Q,EAAU6Q,EACvBlL,EAAWmL,EAAa,IAExBC,EACAF,GAAcD,GA9BE,GA8BiB5Q,GACjC6Q,GAAcD,GA7BE,KA6BiB5Q,GAAgCvxE,EAAK,GAAGlE,QAAUob,EAAO,IAC5E,KAAdkrE,GAAqDlrE,EAAO,GAAGpb,QAAUob,EAAO,IAhChE,GAgCwEq6D,EAG5F,IAAM2F,IAAYoL,EAChB,OAAOtiF,EAvCU,EA0CfoiF,IACFpiF,EAAK,GAAKkX,EAAO,GAEjBmrE,GA7CiB,EA6CH9Q,EAA2B,EA3CjB,GA8C1B,IAAIpzE,GAAQ+Y,EAAO,GACnB,GAAI/Y,GAAO,CACT,IAAI07E,GAAW75E,EAAK,GACpBA,EAAK,GAAK65E,GAAWD,EAAYC,GAAU17E,GAAO+Y,EAAO,IAAM/Y,GAC/D6B,EAAK,GAAK65E,GAAW0C,EAAev8E,EAAK,GAAIkiF,GAAehrE,EAAO,EACrE,CAyBA,OAvBA/Y,GAAQ+Y,EAAO,MAEb2iE,GAAW75E,EAAK,GAChBA,EAAK,GAAK65E,GAAWS,EAAiBT,GAAU17E,GAAO+Y,EAAO,IAAM/Y,GACpE6B,EAAK,GAAK65E,GAAW0C,EAAev8E,EAAK,GAAIkiF,GAAehrE,EAAO,KAGrE/Y,GAAQ+Y,EAAO,MAEblX,EAAK,GAAK7B,IAGRikF,EAAaD,IACfniF,EAAK,GAAgB,MAAXA,EAAK,GAAakX,EAAO,GAAK2yD,EAAU7pE,EAAK,GAAIkX,EAAO,KAGrD,MAAXlX,EAAK,KACPA,EAAK,GAAKkX,EAAO,IAGnBlX,EAAK,GAAKkX,EAAO,GACjBlX,EAAK,GAAKqiF,EAEHriF,CACT,mBCvFA,IAAI8f,EAAU,EAAQ,OAGlB+3D,EAAU/3D,GAAW,IAAIA,EAE7B5mB,EAAOD,QAAU4+E,mBCLjB,IAGIuJ,EAHY,EAAQ,MAGL1V,CAAU/tE,OAAQ,UAErCzE,EAAOD,QAAUmoF,mBCLjB,IAGIpL,EAHU,EAAQ,KAGL4J,CAAQjiF,OAAOyZ,KAAMzZ,QAEtCzE,EAAOD,QAAU+8E,aCcjB98E,EAAOD,QAVP,SAASi9E,aAAar+D,GACpB,IAAIjB,EAAS,GACb,GAAc,MAAViB,EACF,IAAK,IAAI/H,KAAOnS,OAAOka,GACrBjB,EAAOza,KAAK2T,GAGhB,OAAO8G,CACT,8BCjBA,IAAI6yD,EAAa,EAAQ,OAGrByP,EAA4CjgF,IAAYA,EAAQ+7B,UAAY/7B,EAG5EkgF,EAAaD,GAA4ChgF,IAAWA,EAAO87B,UAAY97B,EAMvFqpF,EAHgBpJ,GAAcA,EAAWlgF,UAAYigF,GAGtBzP,EAAWrvD,QAG1CooE,EAAY,WACd,IAEE,IAAIC,EAAQtJ,GAAcA,EAAWuJ,SAAWvJ,EAAWuJ,QAAQ,QAAQD,MAE3E,OAAIA,GAKGF,GAAeA,EAAYI,SAAWJ,EAAYI,QAAQ,OACnE,CAAE,MAAOh+E,GAAI,CACf,CAZe,GAcfzL,EAAOD,QAAUupF,YC5BjB,IAOI3C,EAPcliF,OAAOE,UAOcwC,SAavCnH,EAAOD,QAJP,SAAS0wE,eAAexrE,GACtB,OAAO0hF,EAAqBn+E,KAAKvD,EACnC,YCLAjF,EAAOD,QANP,SAAS2mF,QAAQtwE,EAAMszE,GACrB,OAAO,SAAS9kF,GACd,OAAOwR,EAAKszE,EAAU9kF,GACxB,CACF,mBCZA,IAAIuG,EAAQ,EAAQ,OAGhBulE,EAAYpmE,KAAK2C,IAgCrBjN,EAAOD,QArBP,SAASw+E,SAASnoE,EAAM3S,EAAOimF,GAE7B,OADAjmF,EAAQitE,OAAoBhqE,IAAVjD,EAAuB2S,EAAKxT,OAAS,EAAKa,EAAO,GAC5D,WAML,IALA,IAAI4gB,EAAOhd,UACP4P,GAAS,EACTrU,EAAS8tE,EAAUrsD,EAAKzhB,OAASa,EAAO,GACxCyD,EAAQ5D,MAAMV,KAETqU,EAAQrU,GACfsE,EAAM+P,GAASoN,EAAK5gB,EAAQwT,GAE9BA,GAAS,EAET,IADA,IAAI0yE,EAAYrmF,MAAMG,EAAQ,KACrBwT,EAAQxT,GACfkmF,EAAU1yE,GAASoN,EAAKpN,GAG1B,OADA0yE,EAAUlmF,GAASimF,EAAUxiF,GACtBiE,EAAMiL,EAAMjW,KAAMwpF,EAC3B,CACF,mBCjCA,IAAIjQ,EAAU,EAAQ,OAClBqF,EAAY,EAAQ,OAcxB/+E,EAAOD,QAJP,SAASyb,OAAOmD,EAAQ9G,GACtB,OAAOA,EAAKjV,OAAS,EAAI+b,EAAS+6D,EAAQ/6D,EAAQogE,EAAUlnE,EAAM,GAAI,GACxE,aCVA7X,EAAOD,QAFS,CAAC,mBCDjB,IAAIw3E,EAAY,EAAQ,KACpB5B,EAAU,EAAQ,OAGlBhF,EAAYrmE,KAAKC,IAwBrBvK,EAAOD,QAZP,SAAS0jF,QAAQv8E,EAAO0iF,GAKtB,IAJA,IAAIjhF,EAAYzB,EAAMtE,OAClBA,EAAS+tE,EAAUiZ,EAAQhnF,OAAQ+F,GACnCkhF,EAAWtS,EAAUrwE,GAElBtE,KAAU,CACf,IAAIqU,EAAQ2yE,EAAQhnF,GACpBsE,EAAMtE,GAAU+yE,EAAQ1+D,EAAOtO,GAAakhF,EAAS5yE,QAASvQ,CAChE,CACA,OAAOQ,CACT,aCzBA,IAAI8hF,EAAc,yBA2BlBhpF,EAAOD,QAhBP,SAASsjF,eAAen8E,EAAO26E,GAM7B,IALA,IAAI5qE,GAAS,EACTrU,EAASsE,EAAMtE,OACf0yE,EAAW,EACX53D,EAAS,KAEJzG,EAAQrU,GAAQ,CACvB,IAAIqC,EAAQiC,EAAM+P,GACdhS,IAAU48E,GAAe58E,IAAU+jF,IACrC9hF,EAAM+P,GAAS+xE,EACftrE,EAAO43D,KAAcr+D,EAEzB,CACA,OAAOyG,CACT,mBC1BA,IAAI6yD,EAAa,EAAQ,OAGrBC,EAA0B,iBAAR3qD,MAAoBA,MAAQA,KAAKphB,SAAWA,QAAUohB,KAGxEhmB,EAAO0wE,GAAcC,GAAY10D,SAAS,cAATA,GAErC9b,EAAOD,QAAUF,aCYjBG,EAAOD,QAZP,SAASy9E,QAAQ7+D,EAAQ/H,GACvB,IAAY,gBAARA,GAAgD,mBAAhB+H,EAAO/H,KAIhC,aAAPA,EAIJ,OAAO+H,EAAO/H,EAChB,aCAA5W,EAAOD,QALP,SAAS20E,YAAYzvE,GAEnB,OADA9E,KAAK00E,SAASnoE,IAAIzH,EAbC,6BAcZ9E,IACT,aCHAH,EAAOD,QAJP,SAAS40E,YAAY1vE,GACnB,OAAO9E,KAAK00E,SAASvuD,IAAIrhB,EAC3B,iBCXA,IAAI25E,EAAc,EAAQ,OAiBtBnkE,EAhBW,EAAQ,MAgBTqvE,CAASlL,GAEvB5+E,EAAOD,QAAU0a,aCFjBza,EAAOD,QAVP,SAAS0lF,WAAW/4E,GAClB,IAAIuK,GAAS,EACTyG,EAASpa,MAAMoJ,EAAIzF,MAKvB,OAHAyF,EAAI2f,SAAQ,SAASpnB,GACnByY,IAASzG,GAAShS,CACpB,IACOyY,CACT,mBCfA,IAAIohE,EAAkB,EAAQ,OAW1BN,EAVW,EAAQ,MAULsL,CAAShL,GAE3B9+E,EAAOD,QAAUy+E,mBCbjB,IAAIoJ,EAAiB,EAAQ,OACzBQ,EAAoB,EAAQ,OAC5B5J,EAAc,EAAQ,OACtBuL,EAAoB,EAAQ,OAiBhC/pF,EAAOD,QALP,SAASskF,gBAAgBpyD,EAASoa,EAAWgsC,GAC3C,IAAIr6D,EAAUquB,EAAY,GAC1B,OAAOmyC,EAAYvsD,EAASm2D,EAAkBpqE,EAAQ+rE,EAAkBnC,EAAe5pE,GAASq6D,IAClG,aCjBA,IAII2R,EAAY/xE,KAAK24D,IA+BrB5wE,EAAOD,QApBP,SAAS+pF,SAAS1zE,GAChB,IAAI2zB,EAAQ,EACRkgD,EAAa,EAEjB,OAAO,WACL,IAAIC,EAAQF,IACR3gF,EApBO,IAoBiB6gF,EAAQD,GAGpC,GADAA,EAAaC,EACT7gF,EAAY,GACd,KAAM0gC,GAzBI,IA0BR,OAAO1iC,UAAU,QAGnB0iC,EAAQ,EAEV,OAAO3zB,EAAKjL,WAAMzE,EAAWW,UAC/B,CACF,mBClCA,IAAIysE,EAAY,EAAQ,OAcxB9zE,EAAOD,QALP,SAAS+0E,aACP30E,KAAK00E,SAAW,IAAIf,EACpB3zE,KAAK8G,KAAO,CACd,aCKAjH,EAAOD,QARP,SAASg1E,YAAYn+D,GACnB,IAAI9P,EAAO3G,KAAK00E,SACZn3D,EAAS5W,EAAa,OAAE8P,GAG5B,OADAzW,KAAK8G,KAAOH,EAAKG,KACVyW,CACT,aCFA1d,EAAOD,QAJP,SAASi1E,SAASp+D,GAChB,OAAOzW,KAAK00E,SAAS/oE,IAAI8K,EAC3B,aCEA5W,EAAOD,QAJP,SAASk1E,SAASr+D,GAChB,OAAOzW,KAAK00E,SAASvuD,IAAI1P,EAC3B,mBCXA,IAAIk9D,EAAY,EAAQ,OACpBnkC,EAAM,EAAQ,OACd8kC,EAAW,EAAQ,OA+BvBz0E,EAAOD,QAhBP,SAASm1E,SAASt+D,EAAK3R,GACrB,IAAI6B,EAAO3G,KAAK00E,SAChB,GAAI/tE,aAAgBgtE,EAAW,CAC7B,IAAIqW,EAAQrjF,EAAK+tE,SACjB,IAAKllC,GAAQw6C,EAAMvnF,OAASwnF,IAG1B,OAFAD,EAAMlnF,KAAK,CAAC2T,EAAK3R,IACjB9E,KAAK8G,OAASH,EAAKG,KACZ9G,KAET2G,EAAO3G,KAAK00E,SAAW,IAAIJ,EAAS0V,EACtC,CAGA,OAFArjF,EAAK4F,IAAIkK,EAAK3R,GACd9E,KAAK8G,KAAOH,EAAKG,KACV9G,IACT,aCTAH,EAAOD,QAZP,SAASq6E,cAAclzE,EAAOjC,EAAO8X,GAInC,IAHA,IAAI9F,EAAQ8F,EAAY,EACpBna,EAASsE,EAAMtE,SAEVqU,EAAQrU,GACf,GAAIsE,EAAM+P,KAAWhS,EACnB,OAAOgS,EAGX,OAAQ,CACV,mBCpBA,IAAIw/D,EAAe,EAAQ,OACvB8L,EAAa,EAAQ,OACrB8H,EAAiB,EAAQ,KAe7BrqF,EAAOD,QANP,SAASyiF,cAAcr9E,GACrB,OAAOo9E,EAAWp9E,GACdklF,EAAellF,GACfsxE,EAAatxE,EACnB,mBCfA,IAAI4jF,EAAgB,EAAQ,OAGxBl4C,EAAa,mGAGbC,EAAe,WASfI,EAAe63C,GAAc,SAAS5jF,GACxC,IAAIuY,EAAS,GAOb,OAN6B,KAAzBvY,EAAO1C,WAAW,IACpBib,EAAOza,KAAK,IAEdkC,EAAOpE,QAAQ8vC,GAAY,SAAS7vC,EAAO8vB,EAAQqgB,EAAOC,GACxD1zB,EAAOza,KAAKkuC,EAAQC,EAAUrwC,QAAQ+vC,EAAc,MAAShgB,GAAU9vB,EACzE,IACO0c,CACT,IAEA1d,EAAOD,QAAUmxC,mBC1BjB,IAAIngB,EAAW,EAAQ,OAoBvB/wB,EAAOD,QARP,SAAS05E,MAAMx0E,GACb,GAAoB,iBAATA,GAAqB8rB,EAAS9rB,GACvC,OAAOA,EAET,IAAIyY,EAAUzY,EAAQ,GACtB,MAAkB,KAAVyY,GAAkB,EAAIzY,IAdjB,SAcwC,KAAOyY,CAC9D,aCjBA,IAGIw+D,EAHYpgE,SAASnX,UAGIwC,SAqB7BnH,EAAOD,QAZP,SAASyxD,SAASp7C,GAChB,GAAY,MAARA,EAAc,CAChB,IACE,OAAO8lE,EAAa1zE,KAAK4N,EAC3B,CAAE,MAAO3K,GAAI,CACb,IACE,OAAQ2K,EAAO,EACjB,CAAE,MAAO3K,GAAI,CACf,CACA,MAAO,EACT,aCtBA,IAAI6+E,EAAe,KAiBnBtqF,EAAOD,QAPP,SAASq/E,gBAAgBj6E,GAGvB,IAFA,IAAI8R,EAAQ9R,EAAOvC,OAEZqU,KAAWqzE,EAAa7oF,KAAK0D,EAAOqrB,OAAOvZ,MAClD,OAAOA,CACT,WCfA,IAAIszE,EAAgB,kBAQhBC,EAAW,IAAMD,EAAgB,IACjCE,EAAU,kDACVC,EAAS,2BAETC,EAAc,KAAOJ,EAAgB,IACrCK,EAAa,kCACbC,EAAa,qCAIbC,EAPa,MAAQL,EAAU,IAAMC,EAAS,IAOtB,IACxBK,EAAW,oBAEXC,EAAQD,EAAWD,GADP,gBAAwB,CAACH,EAAaC,EAAYC,GAAYznF,KAAK,KAAO,IAAM2nF,EAAWD,EAAW,MAElHG,EAAW,MAAQ,CAACN,EAAcF,EAAU,IAAKA,EAASG,EAAYC,EAAYL,GAAUpnF,KAAK,KAAO,IAGxG8nF,EAAYh2D,OAAOw1D,EAAS,MAAQA,EAAS,KAAOO,EAAWD,EAAO,KAa1EhrF,EAAOD,QAJP,SAASsqF,eAAellF,GACtB,OAAOA,EAAOnE,MAAMkqF,IAAc,EACpC,YCpCA,IAAIX,EAAgB,kBAKhBY,EAAiB,kBACjBC,EAAe,4BAKfC,EAAe,4BAEfC,EAAeC,8OAIfC,EAAU,IAAMF,EAAe,IAE/BG,EAAW,OACXC,EAAY,IAAMP,EAAiB,IACnCQ,EAAU,IAAMP,EAAe,IAC/BQ,EAAS,KAAOrB,EAAgBe,EAAeG,EAAWN,EAAiBC,EAAeC,EAAe,IAIzGT,EAAa,kCACbC,EAAa,qCACbgB,GAAU,IAAMR,EAAe,IAI/BS,GAAc,MAAQH,EAAU,IAAMC,EAAS,IAC/CG,GAAc,MAAQF,GAAU,IAAMD,EAAS,IAC/CI,GAAkB,gCAClBC,GAAkB,gCAClBnB,GAAWoB,gFACXnB,GAAW,oBAIXC,GAAQD,GAAWD,IAHP,gBAAwB,CAbtB,KAAOP,EAAgB,IAaaK,EAAYC,GAAYznF,KAAK,KAAO,IAAM2nF,GAAWD,GAAW,MAIlHqB,GAAU,MAAQ,CAACT,EAAWd,EAAYC,GAAYznF,KAAK,KAAO,IAAM4nF,GAGxEoB,GAAgBl3D,OAAO,CACzB22D,GAAU,IAAMF,EAAU,IAAMK,GAAkB,MAAQ,CAACR,EAASK,GAAS,KAAKzoF,KAAK,KAAO,IAC9F2oF,GAAc,IAAME,GAAkB,MAAQ,CAACT,EAASK,GAAUC,GAAa,KAAK1oF,KAAK,KAAO,IAChGyoF,GAAU,IAAMC,GAAc,IAAME,GACpCH,GAAU,IAAMI,GATD,mDADA,mDAafR,EACAU,IACA/oF,KAAK,KAAM,KAabpD,EAAOD,QAJP,SAASssF,aAAalnF,GACpB,OAAOA,EAAOnE,MAAMorF,KAAkB,EACxC,mBClEA,IAAIjX,EAAY,EAAQ,OACpBK,EAAgB,EAAQ,OAcxB8W,EAAY,CACd,CAAC,MANiB,KAOlB,CAAC,OAbkB,GAcnB,CAAC,UAbsB,GAcvB,CAAC,QAbmB,GAcpB,CAAC,aAbyB,IAc1B,CAAC,OATkB,KAUnB,CAAC,UAdqB,IAetB,CAAC,eAd2B,IAe5B,CAAC,QAbmB,MAkCtBtsF,EAAOD,QAVP,SAASgqF,kBAAkB1B,EAAShQ,GAOlC,OANAlD,EAAUmX,GAAW,SAASz0C,GAC5B,IAAI5yC,EAAQ,KAAO4yC,EAAK,GACnBwgC,EAAUxgC,EAAK,KAAQ29B,EAAc6S,EAASpjF,IACjDojF,EAAQplF,KAAKgC,EAEjB,IACOojF,EAAQ9lC,MACjB,mBC3CA,IAAI0wB,EAAc,EAAQ,OACtBc,EAAgB,EAAQ,MACxBwD,EAAY,EAAQ,KAoBxBv3E,EAAOD,QAXP,SAASwsF,aAAat6D,GACpB,GAAIA,aAAmBghD,EACrB,OAAOhhD,EAAQqD,QAEjB,IAAI5X,EAAS,IAAIq2D,EAAc9hD,EAAQihD,YAAajhD,EAAQgiD,WAI5D,OAHAv2D,EAAOy1D,YAAcoE,EAAUtlD,EAAQkhD,aACvCz1D,EAAOw2D,UAAajiD,EAAQiiD,UAC5Bx2D,EAAOy2D,WAAaliD,EAAQkiD,WACrBz2D,CACT,mBCpBA,IAAIknE,EAAa,EAAQ,OA4BzB5kF,EAAOD,QANP,SAAS8jF,IAAIztE,EAAMlO,EAAGg6E,GAGpB,OAFAh6E,EAAIg6E,OAAQx7E,EAAYwB,EACxBA,EAAKkO,GAAa,MAALlO,EAAakO,EAAKxT,OAASsF,EACjC08E,EAAWxuE,EAtBA,SAsBqB1P,OAAWA,OAAWA,OAAWA,EAAWwB,EACrF,mBC1BA,IAAIskF,EAAa,EAAQ,OAuBrBC,EAtBmB,EAAQ,MAsBf1J,EAAiB,SAASrlE,EAAQgvE,EAAMz1E,GAEtD,OADAy1E,EAAOA,EAAKjlF,cACLiW,GAAUzG,EAAQu1E,EAAWE,GAAQA,EAC9C,IAEA1sF,EAAOD,QAAU0sF,mBC5BjB,IAAItlF,EAAW,EAAQ,OACnBwlF,EAAa,EAAQ,OAqBzB3sF,EAAOD,QAJP,SAASysF,WAAWrnF,GAClB,OAAOwnF,EAAWxlF,EAAShC,GAAQsC,cACrC,mBCpBA,IAAI2wE,EAAY,EAAQ,OAmCxBp4E,EAAOD,QAJP,SAASu1B,MAAMrwB,GACb,OAAOmzE,EAAUnzE,EA7BM,EA8BzB,aCRAjF,EAAOD,QANP,SAAS8+E,SAAS55E,GAChB,OAAO,WACL,OAAOA,CACT,CACF,mBCvBA,IAAI2/E,EAAa,EAAQ,OA8CzB,SAASgI,MAAMx2E,EAAMyc,EAAOqvD,GAE1B,IAAIxkE,EAASknE,EAAWxuE,EA7CJ,OA6C2B1P,OAAWA,OAAWA,OAAWA,OAAWA,EAD3FmsB,EAAQqvD,OAAQx7E,EAAYmsB,GAG5B,OADAnV,EAAOmkE,YAAc+K,MAAM/K,YACpBnkE,CACT,CAGAkvE,MAAM/K,YAAc,CAAC,EAErB7hF,EAAOD,QAAU6sF,uBCxDjB,IAAIrwE,EAAW,EAAQ,OACnBq0D,EAAM,EAAQ,MACdC,EAAW,EAAQ,OAMnBH,EAAYpmE,KAAK2C,IACjB0jE,EAAYrmE,KAAKC,IAqLrBvK,EAAOD,QA7HP,SAASixE,SAAS56D,EAAM66D,EAAMl6D,GAC5B,IAAIm6D,EACAC,EACAC,EACA1zD,EACA2zD,EACAC,GACAC,GAAiB,EACjBC,IAAU,EACVC,IAAS,EACTC,IAAW,EAEf,GAAmB,mBAARt7D,EACT,MAAM,IAAItR,UAzEQ,uBAmFpB,SAAS6sE,WAAWC,GAClB,IAAIvtD,EAAO6sD,EACPr4C,EAAUs4C,EAKd,OAHAD,EAAWC,OAAWzqE,EACtB6qE,GAAiBK,EACjBl0D,EAAStH,EAAKjL,MAAM0tB,EAASxU,EAE/B,CAqBA,SAASwtD,aAAaD,GACpB,IAAIE,EAAoBF,EAAON,GAM/B,YAAyB5qE,IAAjB4qE,IAA+BQ,GAAqBb,GACzDa,EAAoB,GAAOL,IANJG,EAAOL,IAM8BH,CACjE,CAEA,SAASW,eACP,IAAIH,EAAOhB,IACX,GAAIiB,aAAaD,GACf,OAAOI,aAAaJ,GAGtBP,EAAUvB,WAAWiC,aA3BvB,SAASE,cAAcL,GACrB,IAEIib,EAAc5b,GAFMW,EAAON,IAI/B,OAAOG,GACHd,EAAUkc,EAAazb,GAJDQ,EAAOL,KAK7Bsb,CACN,CAmBqC5a,CAAcL,GACnD,CAEA,SAASI,aAAaJ,GAKpB,OAJAP,OAAU3qE,EAINgrE,IAAYR,EACPS,WAAWC,IAEpBV,EAAWC,OAAWzqE,EACfgX,EACT,CAcA,SAASw0D,YACP,IAAIN,EAAOhB,IACPuB,EAAaN,aAAaD,GAM9B,GAJAV,EAAW7pE,UACX8pE,EAAWhxE,KACXmxE,GAAeM,EAEXO,EAAY,CACd,QAAgBzrE,IAAZ2qE,EACF,OAzEN,SAASe,YAAYR,GAMnB,OAJAL,GAAiBK,EAEjBP,EAAUvB,WAAWiC,aAAcd,GAE5BO,GAAUG,WAAWC,GAAQl0D,CACtC,CAkEa00D,CAAYd,IAErB,GAAIG,GAIF,OAFAa,aAAajB,GACbA,EAAUvB,WAAWiC,aAAcd,GAC5BU,WAAWL,GAEtB,CAIA,YAHgB5qE,IAAZ2qE,IACFA,EAAUvB,WAAWiC,aAAcd,IAE9BvzD,CACT,CAGA,OA3GAuzD,EAAOJ,EAASI,IAAS,EACrB10D,EAASxF,KACXy6D,KAAYz6D,EAAQy6D,QAEpBJ,GADAK,GAAS,YAAa16D,GACH25D,EAAUG,EAAS95D,EAAQq6D,UAAY,EAAGH,GAAQG,EACrEM,GAAW,aAAc36D,IAAYA,EAAQ26D,SAAWA,IAoG1DQ,UAAUG,OApCV,SAASA,cACS3rE,IAAZ2qE,GACFiB,aAAajB,GAEfE,GAAiB,EACjBL,EAAWI,GAAeH,EAAWE,OAAU3qE,CACjD,EA+BAwrE,UAAUK,MA7BV,SAASA,QACP,YAAmB7rE,IAAZ2qE,EAAwB3zD,EAASs0D,aAAapB,IACvD,EA4BOsB,SACT,mBC5LA,IAAI4S,EAAe,EAAQ,OACvB39E,EAAW,EAAQ,OAGnB2lF,EAAU,8CAeVC,EAAc73D,OANJ,kDAMoB,KAyBlCl1B,EAAOD,QALP,SAAS6iF,OAAOz9E,GAEd,OADAA,EAASgC,EAAShC,KACDA,EAAOpE,QAAQ+rF,EAAShI,GAAc/jF,QAAQgsF,EAAa,GAC9E,aCNA/sF,EAAOD,QAJP,SAAS82E,GAAG5xE,EAAOswD,GACjB,OAAOtwD,IAAUswD,GAAUtwD,GAAUA,GAASswD,GAAUA,CAC1D,mBClCA,IAuCIrS,EAvCa,EAAQ,MAuCdqgC,CAtCK,EAAQ,QAwCxBvjF,EAAOD,QAAUmjD,mBCzCjB,IAAI+1B,EAAgB,EAAQ,OACxB2D,EAAe,EAAQ,OACvB+H,EAAY,EAAQ,OAGpBjU,EAAYpmE,KAAK2C,IAiDrBjN,EAAOD,QAZP,SAASu5C,UAAUpyC,EAAOo8D,EAAWvmD,GACnC,IAAIna,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAIqU,EAAqB,MAAb8F,EAAoB,EAAI4nE,EAAU5nE,GAI9C,OAHI9F,EAAQ,IACVA,EAAQy5D,EAAU9tE,EAASqU,EAAO,IAE7BgiE,EAAc/xE,EAAO01E,EAAatZ,EAAW,GAAIrsD,EAC1D,mBCpDA,IAAImiE,EAAc,EAAQ,OAqB1Bp5E,EAAOD,QALP,SAASolE,QAAQj+D,GAEf,OADsB,MAATA,EAAgB,EAAIA,EAAMtE,QACvBw2E,EAAYlyE,EAAO,GAAK,EAC1C,mBCnBA,IAAI8lF,EAAU,EAAQ,OAClBC,EAAiB,EAAQ,OAGzBhqF,EAAOK,MAAMqB,UAAU1B,KA0B3B,SAASiqF,QAAQ92E,EAAMlO,GACrB,OAAY,GAALA,EACH,SAASkE,EAAG/F,GAAK,OAAO+P,EAAKhK,EAAG/F,EAAI,EACpC,SAAS+F,GAAK,OAAOgK,EAAKhK,EAAI,CACpC,CASA,SAAS+gF,WAAWjmF,GAIlB,IAHA,IAAItE,EAASsE,EAAQA,EAAMtE,OAAS,EAChC8a,EAASpa,MAAMV,GAEZA,KACL8a,EAAO9a,GAAUsE,EAAMtE,GAEzB,OAAO8a,CACT,CAuDA,SAAS0vE,cAAch3E,EAAMi3E,GAC3B,OAAO,WACL,IAAIzqF,EAASyE,UAAUzE,OACvB,GAAKA,EAAL,CAIA,IADA,IAAIyhB,EAAO/gB,MAAMV,GACVA,KACLyhB,EAAKzhB,GAAUyE,UAAUzE,GAE3B,IAAI8a,EAAS2G,EAAK,GAAKgpE,EAAOliF,WAAMzE,EAAW2d,GAE/C,OADAjO,EAAKjL,WAAMzE,EAAW2d,GACf3G,CAPP,CAQF,CACF,CAgcA1d,EAAOD,QA/aP,SAASutF,YAAYC,EAAM55E,EAAMyC,EAAMW,GACrC,IAAIy2E,EAAuB,mBAAR75E,EACf85E,EAAQ95E,IAASlP,OAAOkP,GAO5B,GALI85E,IACF12E,EAAUX,EACVA,EAAOzC,EACPA,OAAOjN,GAEG,MAAR0P,EACF,MAAM,IAAItR,UAEZiS,IAAYA,EAAU,CAAC,GAEvB,IAAI22E,EAAS,CACX,MAAO,QAAS32E,IAAUA,EAAQ42E,IAClC,QAAS,UAAW52E,IAAUA,EAAQ61E,MACtC,QAAS,UAAW71E,IAAUA,EAAQ62E,MACtC,YAAa,cAAe72E,IAAUA,EAAQ82E,UAC9C,QAAS,UAAW92E,IAAUA,EAAQ+2E,OAGpCC,EAAgBP,EAAQp3E,EAAO62E,EAC/Be,EAAc,UAAWj3E,GAAYA,EAAQ61E,MAC7CqB,EAAc,UAAWl3E,GAAYA,EAAQ62E,MAC7CM,GAAc,UAAWn3E,GAAYA,EAAQ+2E,MAC7CK,GAAWX,EAAQp3E,EAAKg4E,oBAAiB1nF,EAEzC2nF,GAAUb,EAAQp3E,EAAO,CAC3B,IAAOm3E,EAAK1J,IACZ,OAAU0J,EAAKtxE,OACf,MAASsxE,EAAKj4D,MACd,MAASi4D,EAAKX,MACd,QAAWW,EAAKlhE,QAChB,QAAWkhE,EAAK1mF,QAChB,QAAW0mF,EAAKe,QAChB,WAAcf,EAAK1R,WACnB,UAAa0R,EAAKgB,UAClB,SAAYhB,EAAKnY,SACjB,KAAQmY,EAAKrvE,KACb,MAASqvE,EAAKO,MACd,UAAaP,EAAK5I,UAClB,OAAU4I,EAAKiB,QAGb3K,GAAMwK,GAAQxK,IACd5nE,GAASoyE,GAAQpyE,OACjBqZ,GAAQ+4D,GAAQ/4D,MAChBs3D,GAAQyB,GAAQzB,MAChB6B,GAAOJ,GAAQhiE,QACfxlB,GAAUwnF,GAAQxnF,QAClBynF,GAAUD,GAAQC,QAClBzS,GAAawS,GAAQxS,WACrB0S,GAAYF,GAAQE,UACpBrwE,GAAOmwE,GAAQnwE,KACf4vE,GAAQO,GAAQP,MAChBnJ,GAAY0J,GAAQ1J,UACpB6J,GAASH,GAAQG,OAEjBE,GAAgBxwE,GAAK8uE,EAAQ2B,WAE7BC,GAAW,CACb,UAAa,SAASC,GACpB,OAAO,WACL,IAAI5pF,EAAQoC,UAAU,GACtB,OAAOR,GAAQ5B,GACX4pF,EAAU1B,WAAWloF,IACrB4pF,EAAU1jF,WAAMzE,EAAWW,UACjC,CACF,EACA,SAAY,SAAS+tE,GACnB,OAAO,WACL,IACIviD,EAAQxrB,UAAU,GAClBqW,EAAS03D,EAFF/tE,UAAU,GAEOwrB,GACxBjwB,EAAS8a,EAAO9a,OAEpB,OAAI8qF,EAAOC,KAAuB,iBAAT96D,GACvBA,EAAQA,EAAQ,EAAKA,EAAQ,EAAK,EAC1BjwB,GAAUA,GAAUiwB,EAASnV,EAASwvE,QAAQxvE,EAAQmV,IAEzDnV,CACT,CACF,EACA,MAAS,SAASqsD,GAChB,OAAO,SAAS/rD,GACd,IAAI5H,EAAOjW,KACX,IAAK07E,GAAWzlE,GACd,OAAO2zD,EAAM3zD,EAAM3R,OAAOuZ,IAE5B,IAAImsE,EAAQ,GAiBZ,OAhBAsE,GAAKvwE,GAAKF,IAAS,SAASpH,GACtBilE,GAAW79D,EAAOpH,KACpBuzE,EAAMlnF,KAAK,CAAC2T,EAAKR,EAAKzR,UAAUiS,IAEpC,IAEAmzD,EAAM3zD,EAAM3R,OAAOuZ,IAEnBywE,GAAKtE,GAAO,SAAStyC,GACnB,IAAI5yC,EAAQ4yC,EAAK,GACbgkC,GAAW52E,GACbmR,EAAKzR,UAAUkzC,EAAK,IAAM5yC,SAEnBmR,EAAKzR,UAAUkzC,EAAK,GAE/B,IACOzhC,CACT,CACF,EACA,OAAU,SAAS04E,GACjB,OAAO,SAAS5mF,GACd,IAAI2qB,EAAQ3qB,EAAI,EAAI,EAAKy8E,GAAUz8E,GAAK,EACxC,OAAO0kF,GAAMkC,EAAO5mF,GAAI2qB,EAC1B,CACF,EACA,MAAS,SAASi7D,GAChB,OAAO,SAAS13E,EAAMwzE,GACpB,IAAI/2D,EAAQ+2D,EAAUA,EAAQhnF,OAAS,EACvC,OAAOgqF,GAAMkB,EAAM13E,EAAMwzE,GAAU/2D,EACrC,CACF,EACA,aAAgB,SAASu7D,GACvB,OAAO,SAASjjD,GACd,OAAOmiD,YAAYC,EAAMa,EAAajjD,GAAUp0B,EAClD,CACF,GAaF,SAASg4E,QAAQp7E,EAAMyC,GACrB,GAAIs3E,EAAOC,IAAK,CACd,IAAI/D,EAAUoD,EAAQgC,cAAcr7E,GACpC,GAAIi2E,EACF,OAmJN,SAASoF,cAAc54E,EAAMwzE,GAC3B,OAAOlD,QAAQtwE,GAAM,SAASA,GAC5B,IAAIlO,EAAI0hF,EAAQhnF,OAChB,OA/ZN,SAASqsF,UAAU74E,EAAMlO,GACvB,OAAY,GAALA,EACH,SAASkE,EAAG/F,GAAK,OAAO+P,EAAKjL,WAAMzE,EAAWW,UAAY,EAC1D,SAAS+E,GAAK,OAAOgK,EAAKjL,WAAMzE,EAAWW,UAAY,CAC7D,CA2Za4nF,CAAUnB,GAAMZ,QAAQ92E,EAAMlO,GAAI0hF,GAAU1hF,EACrD,GACF,CAxJa8mF,CAAc54E,EAAMwzE,GAE7B,IAAI1hF,GAAKslF,GAASR,EAAQkC,YAAYv7E,GACtC,GAAIzL,EACF,OA8HN,SAASgnF,YAAY94E,EAAMlO,GACzB,OAAOw+E,QAAQtwE,GAAM,SAASA,GAC5B,MAAsB,mBAARA,EAAqB82E,QAAQ92E,EAAMlO,GAAKkO,CACxD,GACF,CAlIa84E,CAAY94E,EAAMlO,EAE7B,CACA,OAAOkO,CACT,CA0BA,SAAS+4E,UAAUx7E,EAAMyC,EAAMlO,GAC7B,GAAIwlF,EAAOE,QAAUK,IAAejB,EAAQoC,UAAUz7E,IAAQ,CAC5D,IAAI7M,EAAOkmF,EAAQqC,aAAa17E,GAC5BlQ,EAAQqD,GAAQA,EAAKrD,MAEzB,YAAkBiD,IAAXjD,EAAuBogF,GAAIztE,EAAMlO,GApP9C,SAASonF,WAAWl5E,EAAM3S,GACxB,OAAO,WAKL,IAJA,IAAIb,EAASyE,UAAUzE,OACnBw2C,EAAYx2C,EAAS,EACrByhB,EAAO/gB,MAAMV,GAEVA,KACLyhB,EAAKzhB,GAAUyE,UAAUzE,GAE3B,IAAIsE,EAAQmd,EAAK5gB,GACbkmF,EAAYtlE,EAAK7e,MAAM,EAAG/B,GAQ9B,OANIyD,GACFjE,EAAKkI,MAAMw+E,EAAWziF,GAEpBzD,GAAS21C,GACXn2C,EAAKkI,MAAMw+E,EAAWtlE,EAAK7e,MAAM/B,EAAQ,IAEpC2S,EAAKjL,MAAMhL,KAAMwpF,EAC1B,CACF,CAgOmD2F,CAAWl5E,EAAM3S,EAChE,CACA,OAAO2S,CACT,CAWA,SAASm5E,UAAU57E,EAAMyC,EAAMlO,GAC7B,OAAQwlF,EAAOI,OAAS5lF,EAAI,IAAMgmF,KAAelB,EAAQwC,UAAU77E,IAC/Dm6E,GAAM13E,EAAM42E,EAAQyC,YAAY97E,IAASq5E,EAAQ0C,SAASxnF,IAC1DkO,CACN,CAUA,SAASu5E,YAAYhxE,EAAQ9G,GAS3B,IANA,IAAIZ,GAAS,EACTrU,GAHJiV,EAAO22E,GAAO32E,IAGIjV,OACdw2C,EAAYx2C,EAAS,EACrB8a,EAAS4X,GAAM7wB,OAAOka,IACtButD,EAASxuD,EAEI,MAAVwuD,KAAoBj1D,EAAQrU,GAAQ,CACzC,IAAIgU,EAAMiB,EAAKZ,GACXhS,EAAQinE,EAAOt1D,GAEN,MAAT3R,GACE42E,GAAW52E,IAAUqpF,GAAQrpF,IAAUspF,GAAUtpF,KACrDinE,EAAOt1D,GAAO0e,GAAMre,GAASmiC,EAAYn0C,EAAQR,OAAOQ,KAE1DinE,EAASA,EAAOt1D,EAClB,CACA,OAAO8G,CACT,CAoBA,SAASkyE,gBAAgBj8E,EAAMyC,GAC7B,IAAIy5E,EAAW7C,EAAQ8C,YAAYn8E,IAASA,EACxC+uE,EAAasK,EAAQ+C,MAAMF,IAAaA,EACxCG,EAAaj5E,EAEjB,OAAO,SAASA,GACd,IAAIk5E,EAAUzC,EAAQW,GAAWE,GAC7B6B,EAAU1C,EAAQW,GAASzL,GAActsE,EACzC+5E,EAAal0E,GAAOA,GAAO,CAAC,EAAG+zE,GAAaj5E,GAEhD,OAAOu2E,YAAY2C,EAASJ,EAAUK,EAASC,EACjD,CACF,CA2CA,SAASzJ,QAAQtwE,EAAMszE,GACrB,OAAO,WACL,IAAI9mF,EAASyE,UAAUzE,OACvB,IAAKA,EACH,OAAOwT,IAGT,IADA,IAAIiO,EAAO/gB,MAAMV,GACVA,KACLyhB,EAAKzhB,GAAUyE,UAAUzE,GAE3B,IAAIqU,EAAQy2E,EAAOI,MAAQ,EAAKlrF,EAAS,EAEzC,OADAyhB,EAAKpN,GAASyyE,EAAUrlE,EAAKpN,IACtBb,EAAKjL,WAAMzE,EAAW2d,EAC/B,CACF,CAWA,SAASf,KAAK3P,EAAMyC,EAAMyrE,GACxB,IAAInkE,EACAmyE,EAAW7C,EAAQ8C,YAAYn8E,IAASA,EACxC22B,EAAUl0B,EACV6b,EAAU28D,GAASiB,GA2CvB,OAzCI59D,EACFqY,EAAUrY,EAAQ7b,GAEXs3E,EAAOG,YACVb,EAAQoD,OAAOlpF,MAAM2oF,GACvBvlD,EAAU8iD,cAAch3E,EAAM+2E,YAEvBH,EAAQoD,OAAOzxE,OAAOkxE,GAC7BvlD,EAAU8iD,cAAch3E,EArahC,SAASi6E,aAAaj6E,GACpB,OAAO,SAASuI,GACd,OAAOvI,EAAK,CAAC,EAAGuI,EAClB,CACF,CAiasC0xE,CAAaj6E,IAEpC42E,EAAQoD,OAAO1jF,IAAImjF,KAC1BvlD,EAAU8iD,cAAch3E,EAAMu5E,eAGlClB,GAAKC,IAAe,SAAS4B,GAe3B,OAdA7B,GAAKzB,EAAQ2B,UAAU2B,IAAS,SAASC,GACvC,GAAIV,GAAYU,EAAW,CACzB,IAAIzpF,EAAOkmF,EAAQqC,aAAaQ,GAC5BW,EAAa1pF,GAAQA,EAAK0pF,WAQ9B,OANA9yE,EAAS8yE,EACLrB,UAAUU,EAAUN,UAAUM,EAAUvlD,EAASgmD,GAASA,GAC1Df,UAAUM,EAAUV,UAAUU,EAAUvlD,EAASgmD,GAASA,GAG9D5yE,EAvMR,SAAS+yE,UAAU98E,EAAMyC,EAAMlO,GAC7B,OAAQ8lF,GAAeN,EAAOd,OAAS1kF,EAAI,EACvC0kF,GAAMx2E,EAAMlO,GACZkO,CACN,CAmMiBq6E,CAAUZ,EADnBnyE,EAASqxE,QAAQc,EAAUnyE,GACU4yE,IAC9B,CACT,CACF,KACQ5yE,CACV,IAEAA,IAAWA,EAAS4sB,GAChB5sB,GAAUtH,IACZsH,EAASswE,EAAapB,GAAMlvE,EAAQ,GAAK,WACvC,OAAOtH,EAAKjL,MAAMhL,KAAMkH,UAC1B,GAEFqW,EAAOgoE,QAAUkK,gBAAgBC,EAAUz5E,GAC3CsH,EAAOmkE,YAAczrE,EAAKyrE,YAAcA,EAEjCnkE,CACT,CAIA,IAAK+vE,EACH,OAAOnqE,KAAK3P,EAAMyC,EAAM23E,GAE1B,IAAIl3D,GAAIzgB,EAGJ+zE,GAAQ,GAwCZ,OAvCAsE,GAAKC,IAAe,SAAS4B,GAC3B7B,GAAKzB,EAAQ2B,UAAU2B,IAAS,SAAS15E,GACvC,IAAIR,EAAOygB,GAAEm2D,EAAQ+C,MAAMn5E,IAAQA,GAC/BR,GACF+zE,GAAMlnF,KAAK,CAAC2T,EAAK0M,KAAK1M,EAAKR,EAAMygB,KAErC,GACF,IAGA43D,GAAKvwE,GAAK2Y,KAAI,SAASjgB,GACrB,IAAIR,EAAOygB,GAAEjgB,GACb,GAAmB,mBAARR,EAAoB,CAE7B,IADA,IAAIxT,EAASunF,GAAMvnF,OACZA,KACL,GAAIunF,GAAMvnF,GAAQ,IAAMgU,EACtB,OAGJR,EAAKsvE,QAAUkK,gBAAgBh5E,EAAKR,GACpC+zE,GAAMlnF,KAAK,CAAC2T,EAAKR,GACnB,CACF,IAGAq4E,GAAKtE,IAAO,SAAStyC,GACnBhhB,GAAEghB,EAAK,IAAMA,EAAK,EACpB,IAEAhhB,GAAE6uD,QAnLF,SAASgL,WAAW35E,GAClB,OAAO8f,GAAEu3D,aAAa1I,QAAQ3uE,EAAvB8f,MAAgCnwB,EACzC,EAkLAmwB,GAAEgrD,YAAchrD,GAGhB43D,GAAKvwE,GAAK2Y,KAAI,SAASjgB,GACrB63E,GAAKzB,EAAQ2D,YAAY/5E,IAAQ,IAAI,SAASo6B,GAC5Cna,GAAEma,GAASna,GAAEjgB,EACf,GACF,IAEOigB,EACT,iBCrjBA92B,EAAQ+vF,YAAc,CAGpB,KAAQ,UACR,UAAa,eACb,QAAW,UACX,UAAa,YACb,OAAU,WACV,UAAa,cACb,cAAiB,kBACjB,WAAc,eACd,MAAS,OAGT,SAAY,aACZ,QAAW,UACX,SAAY,MAGZ,GAAM,cACN,EAAK,YACL,EAAK,WACL,IAAO,QACP,QAAW,YACX,OAAU,WACV,IAAO,OACP,QAAW,WACX,MAAS,SACT,MAAS,MACT,UAAa,MACb,WAAc,SACd,QAAW,YACX,SAAY,WACZ,OAAU,QACV,WAAc,QACd,SAAY,YACZ,cAAiB,iBACjB,OAAU,UACV,UAAa,KACb,QAAW,QACX,KAAQ,UACR,UAAa,SACb,KAAQ,OACR,QAAW,OACX,KAAQ,MACR,KAAQ,MACR,OAAU,kBACV,OAAU,QACV,MAAS,KACT,QAAW,OACX,KAAQ,OACR,MAAS,MACT,KAAQ,MACR,OAAU,kBACV,OAAU,QACV,MAAS,KACT,oBAAuB,MACvB,sBAAyB,QACzB,wBAA2B,UAC3B,SAAY,YACZ,cAAiB,iBACjB,QAAW,OACX,OAAU,UACV,QAAW,WACX,MAAS,aACT,QAAW,UACX,OAAU,aAIZ/vF,EAAQ4uF,UAAY,CAClB,EAAK,CACH,YAAa,cAAe,UAAW,YAAa,OAAQ,SAC5D,QAAS,aAAc,cAAe,kBAAmB,QAAS,OAClE,YAAa,YAAa,SAAU,WAAY,UAAW,SAAU,WACrE,WAAY,QAAS,SAAU,OAAQ,YAAa,WAAW,OAAQ,UACvE,QAAS,eAAgB,SAAU,WAAY,OAAQ,UAAW,YAClE,WAAY,QAAS,UAEvB,EAAK,CACH,MAAO,QAAS,MAAO,SAAU,gBAAiB,WAAY,kBAC9D,KAAM,SAAU,OAAQ,UAAW,UAAW,QAAS,gBACvD,YAAa,SAAU,aAAc,UAAW,SAAU,cAC1D,WAAY,WAAY,eAAgB,YAAa,QAAS,aAC9D,SAAU,OAAQ,YAAa,iBAAkB,YAAa,WAAY,KAC1E,QAAS,SAAU,OAAQ,YAAa,UAAW,WAAY,gBAC/D,cAAe,UAAW,cAAe,eAAgB,UACzD,eAAgB,QAAS,aAAc,SAAU,cAAe,MAChE,UAAW,KAAM,MAAO,MAAO,QAAS,WAAY,UAAW,eAC/D,WAAY,SAAU,YAAa,UAAW,UAAW,OAAQ,QACjE,cAAe,KAAM,MAAO,MAAO,UAAW,YAAa,kBAC3D,QAAS,SAAU,QAAS,eAAgB,QAAS,WAAY,MAAO,OACxE,SAAU,WAAY,MAAO,SAAU,WAAY,WAAY,UAC/D,eAAgB,YAAa,OAAQ,SAAU,aAAc,OAAQ,UACrE,SAAU,SAAU,QAAS,aAAc,QAAS,SAAU,SAC9D,SAAU,WAAY,SAAU,aAAc,OAAQ,SAAU,cAChE,gBAAiB,kBAAmB,oBAAqB,eACzD,QAAS,aAAc,aAAc,WAAY,QAAS,OAAQ,YAClE,iBAAkB,YAAa,MAAO,WAAY,OAAQ,QAAS,YACnE,eAAgB,iBAAkB,WAAY,QAAS,SAAU,WACjE,QAAS,YAAa,UAAW,OAAQ,MAAO,MAAO,YACvD,iBAEF,EAAK,CACH,eAAgB,aAAc,QAAS,eAAgB,iBACvD,WAAY,gBAAiB,eAAgB,oBAAqB,QAClE,eAAgB,cAAe,UAAW,iBAAkB,mBAC5D,aAAc,gBAAiB,cAAe,cAAe,eAC7D,kBAAmB,YAAa,UAAW,WAAY,cACvD,gBAAiB,YAAa,cAAe,YAAa,iBAC1D,SAAU,cAAe,UAAW,MAAO,QAAS,gBACpD,oBAAqB,YAAa,UAAW,YAAa,SAAU,QACpE,UAAW,WAEb,EAAK,CACH,OAAQ,UAAW,eAKvB5uF,EAAQ2vF,SAAW,CACjB,EAAK,CAAC,EAAG,GACT,EAAK,CAAC,EAAG,EAAG,GACZ,EAAK,CAAC,EAAG,EAAG,EAAG,IAIjB3vF,EAAQmvF,YAAc,CACpB,eAAkB,EAClB,UAAa,EACb,MAAS,EACT,OAAU,EACV,KAAQ,EACR,SAAY,EACZ,UAAa,EACb,cAAiB,EACjB,QAAW,EACX,SAAY,EACZ,aAAgB,EAChB,cAAiB,EACjB,kBAAqB,EACrB,YAAe,EACf,QAAW,EACX,YAAe,EACf,aAAgB,EAChB,QAAW,EACX,aAAgB,EAChB,MAAS,EACT,WAAc,EACd,OAAU,EACV,YAAe,EACf,IAAO,EACP,QAAW,EACX,UAAa,EACb,UAAa,EACb,OAAU,EACV,YAAe,EACf,OAAU,EACV,OAAU,EACV,KAAQ,EACR,eAAkB,EAClB,UAAa,EACb,MAAS,EACT,UAAa,GAIfnvF,EAAQivF,cAAgB,CACtB,QAAW,CAAC,GACZ,YAAe,CAAC,EAAG,IAIrBjvF,EAAQ0vF,YAAc,CACpB,gBAAmB,CAAC,EAAG,GACvB,aAAgB,CAAC,EAAG,EAAG,GACvB,cAAiB,CAAC,EAAG,GACrB,WAAc,CAAC,EAAG,EAAG,GACrB,aAAgB,CAAC,EAAG,EAAG,GACvB,eAAkB,CAAC,EAAG,EAAG,GACzB,MAAS,CAAC,EAAG,EAAG,GAChB,eAAkB,CAAC,EAAG,EAAG,GACzB,iBAAoB,CAAC,EAAG,EAAG,GAC3B,YAAe,CAAC,EAAG,EAAG,GACtB,YAAe,CAAC,EAAG,EAAG,GACtB,aAAgB,CAAC,EAAG,GACpB,UAAa,CAAC,EAAG,EAAG,GACpB,SAAY,CAAC,EAAG,EAAG,GACnB,YAAe,CAAC,EAAG,EAAG,GACtB,cAAiB,CAAC,EAAG,EAAG,GACxB,UAAa,CAAC,EAAG,EAAG,GACpB,YAAe,CAAC,EAAG,EAAG,GACtB,UAAa,CAAC,EAAG,EAAG,GACpB,eAAkB,CAAC,EAAG,EAAG,GACzB,QAAW,CAAC,EAAG,EAAG,EAAG,GACrB,cAAiB,CAAC,EAAG,EAAG,GACxB,kBAAqB,CAAC,EAAG,EAAG,GAC5B,QAAW,CAAC,EAAG,EAAG,GAClB,UAAa,CAAC,EAAG,EAAG,GACpB,WAAc,CAAC,EAAG,EAAG,EAAG,GACxB,MAAS,CAAC,EAAG,EAAG,GAChB,QAAW,CAAC,EAAG,EAAG,GAClB,QAAW,CAAC,EAAG,EAAG,IAIpB1vF,EAAQsvF,aAAe,CACrB,UAAa,CAAE,MAAS,GACxB,cAAiB,CAAE,MAAS,GAC5B,YAAe,CAAE,MAAS,GAC1B,gBAAmB,CAAE,MAAS,GAC9B,YAAe,CAAE,MAAS,GAC1B,gBAAmB,CAAE,MAAS,GAC9B,WAAc,CAAE,MAAS,GACzB,cAAiB,CAAE,MAAS,GAC5B,SAAY,CAAE,MAAS,GACvB,aAAgB,CAAE,MAAS,GAC3B,QAAW,CAAE,MAAS,GACtB,aAAgB,CAAE,MAAS,GAC3B,QAAW,CAAE,MAAS,GACtB,OAAU,CAAE,MAAS,IAIvBtvF,EAAQqwF,OAAS,CACf,MAAS,CACP,MAAQ,EACR,MAAQ,EACR,SAAW,EACX,WAAa,EACb,aAAe,EACf,QAAU,EACV,QAAU,EACV,SAAW,GAEb,OAAU,CACR,QAAU,EACV,WAAa,EACb,eAAiB,EACjB,UAAY,EACZ,aAAe,EACf,iBAAmB,EACnB,cAAgB,EAChB,YAAc,EACd,UAAY,EACZ,aAAe,EACf,cAAgB,EAChB,iBAAmB,EACnB,OAAS,EACT,UAAY,EACZ,cAAgB,EAChB,WAAa,GAEf,IAAO,CACL,KAAO,EACP,SAAW,EACX,OAAS,EACT,QAAU,EACV,YAAc,IAKlBrwF,EAAQ4wF,YAAe,WACrB,IAAIp6E,EAAiB9R,OAAOE,UAAU4R,eAClCoI,EAAS5e,EAAQ+vF,YACjBpyE,EAAS,CAAC,EAEd,IAAK,IAAI9G,KAAO+H,EAAQ,CACtB,IAAI1Z,EAAQ0Z,EAAO/H,GACfL,EAAe/N,KAAKkV,EAAQzY,GAC9ByY,EAAOzY,GAAOhC,KAAK2T,GAEnB8G,EAAOzY,GAAS,CAAC2R,EAErB,CACA,OAAO8G,CACT,CAdsB,GAiBtB3d,EAAQgwF,MAAQ,CACd,UAAa,SACb,cAAiB,aACjB,YAAe,WACf,gBAAmB,eACnB,OAAU,QACV,YAAe,aACf,YAAe,WACf,gBAAmB,eACnB,SAAY,OACZ,cAAiB,YACjB,aAAgB,WAChB,kBAAqB,gBACrB,MAAS,MACT,aAAgB,WAChB,YAAe,UACf,WAAc,SACd,cAAiB,YACjB,gBAAmB,cACnB,SAAY,QACZ,aAAgB,YAChB,SAAY,MACZ,YAAe,SACf,cAAiB,WACjB,WAAc,MACd,UAAa,QACb,eAAkB,aAClB,SAAY,OACZ,WAAc,SACd,UAAa,OACb,aAAgB,UAChB,eAAkB,YAClB,OAAU,OAIZhwF,EAAQqvF,UAAY,CAClB,WAAa,EACb,MAAQ,EACR,WAAa,EACb,UAAY,EACZ,OAAS,EACT,OAAS,EACT,cAAgB,GAIlBrvF,EAAQyvF,UAAY,CAClB,KAAO,EACP,QAAU,EACV,UAAY,EACZ,MAAQ,EACR,SAAW,EACX,QAAU,EACV,YAAc,EACd,QAAU,EACV,IAAM,EACN,IAAM,EACN,KAAO,EACP,SAAW,EACX,IAAM,EACN,KAAO,EACP,iBAAmB,EACnB,OAAS,EACT,UAAY,EACZ,UAAY,EACZ,SAAW,EACX,cAAgB,EAChB,YAAc,EACd,QAAU,EACV,OAAS,EACT,YAAc,EACd,UAAY,EACZ,KAAO,EACP,WAAa,EACb,eAAiB,mBCpWnBxvF,EAAOD,QAAU,CACf,IAAO,EAAQ,OACf,OAAU,EAAQ,OAClB,MAAS,EAAQ,OACjB,MAAS,EAAQ,OACjB,QAAW,EAAQ,OACnB,QAAW,EAAQ,MACnB,QAAW,EAAQ,OACnB,WAAc,EAAQ,OACtB,UAAa,EAAQ,OACrB,SAAY,EAAQ,OACpB,KAAQ,EAAQ,KAChB,MAAS,EAAQ,MACjB,UAAa,EAAQ,OACrB,OAAU,EAAQ,yBCdpBC,EAAOD,QAAU,EAAjB,wBCAA,IAAIutF,EAAc,EAAQ,OACtBC,EAAO,EAAQ,MAgBnBvtF,EAAOD,QAJP,SAAS2lF,QAAQ/xE,EAAMyC,EAAMW,GAC3B,OAAOu2E,EAAYC,EAAM55E,EAAMyC,EAAMW,EACvC,aCVA/W,EAAOD,QAAU,CAAC,mBCLlB,IACIqW,EADU,EAAQ,MACXsvE,CAAQ,MAAO,EAAQ,QAElCtvE,EAAKyrE,YAAc,EAAQ,OAC3B7hF,EAAOD,QAAUqW,mBCJjB,IAAIsjE,EAAU,EAAQ,OAgCtB15E,EAAOD,QALP,SAAS+L,IAAI6S,EAAQ9G,EAAM+4E,GACzB,IAAIlzE,EAAmB,MAAViB,OAAiBjY,EAAYgzE,EAAQ/6D,EAAQ9G,GAC1D,YAAkBnR,IAAXgX,EAAuBkzE,EAAelzE,CAC/C,mBC9BA,IAAIw8D,EAAY,EAAQ,IACpB2N,EAAU,EAAQ,KAgCtB7nF,EAAOD,QAJP,SAASqsE,MAAMztD,EAAQ9G,GACrB,OAAiB,MAAV8G,GAAkBkpE,EAAQlpE,EAAQ9G,EAAMqiE,EACjD,YCXAl6E,EAAOD,QAJP,SAAS48E,SAAS13E,GAChB,OAAOA,CACT,mBClBA,IAAIo1E,EAAkB,EAAQ,MAC1BvJ,EAAe,EAAQ,OAGvBmL,EAAcx3E,OAAOE,UAGrB4R,EAAiB0lE,EAAY1lE,eAG7B0P,EAAuBg2D,EAAYh2D,qBAoBnCyvD,EAAc2E,EAAgB,WAAa,OAAOhzE,SAAW,CAA/B,IAAsCgzE,EAAkB,SAASp1E,GACjG,OAAO6rE,EAAa7rE,IAAUsR,EAAe/N,KAAKvD,EAAO,YACtDghB,EAAqBzd,KAAKvD,EAAO,SACtC,EAEAjF,EAAOD,QAAU21E,YCZjB,IAAI7uE,EAAUvD,MAAMuD,QAEpB7G,EAAOD,QAAU8G,mBCzBjB,IAAIg1E,EAAa,EAAQ,OACrBS,EAAW,EAAQ,OA+BvBt8E,EAAOD,QAJP,SAAS8wD,YAAY5rD,GACnB,OAAgB,MAATA,GAAiBq3E,EAASr3E,EAAMrC,UAAYi5E,EAAW52E,EAChE,mBC9BA,IAAI4rD,EAAc,EAAQ,OACtBigB,EAAe,EAAQ,OA+B3B9wE,EAAOD,QAJP,SAAS69E,kBAAkB34E,GACzB,OAAO6rE,EAAa7rE,IAAU4rD,EAAY5rD,EAC5C,mBC9BA,IAAIg1E,EAAa,EAAQ,OACrBnJ,EAAe,EAAQ,OA2B3B9wE,EAAOD,QALP,SAAS8wF,UAAU5rF,GACjB,OAAiB,IAAVA,IAA4B,IAAVA,GACtB6rE,EAAa7rE,IArBJ,oBAqBcg1E,EAAWh1E,EACvC,8BC1BA,IAAIpF,EAAO,EAAQ,OACfixF,EAAY,EAAQ,OAGpB9Q,EAA4CjgF,IAAYA,EAAQ+7B,UAAY/7B,EAG5EkgF,EAAaD,GAA4ChgF,IAAWA,EAAO87B,UAAY97B,EAMvFiE,EAHgBg8E,GAAcA,EAAWlgF,UAAYigF,EAG5BngF,EAAKoE,YAASyC,EAsBvCF,GAnBiBvC,EAASA,EAAOuC,cAAWE,IAmBfoqF,EAEjC9wF,EAAOD,QAAUyG,mBCrCjB,IAAIu2E,EAAW,EAAQ,KACnBnF,EAAS,EAAQ,OACjBlC,EAAc,EAAQ,OACtB7uE,EAAU,EAAQ,MAClBgqD,EAAc,EAAQ,OACtBrqD,EAAW,EAAQ,OACnBq2E,EAAc,EAAQ,OACtBjH,EAAe,EAAQ,OAUvBr/D,EAHc9R,OAAOE,UAGQ4R,eA2DjCvW,EAAOD,QAxBP,SAASsrE,QAAQpmE,GACf,GAAa,MAATA,EACF,OAAO,EAET,GAAI4rD,EAAY5rD,KACX4B,EAAQ5B,IAA0B,iBAATA,GAA4C,mBAAhBA,EAAMwrC,QAC1DjqC,EAASvB,IAAU2wE,EAAa3wE,IAAUywE,EAAYzwE,IAC1D,OAAQA,EAAMrC,OAEhB,IAAI6a,EAAMm6D,EAAO3yE,GACjB,GApDW,gBAoDPwY,GAnDO,gBAmDUA,EACnB,OAAQxY,EAAMgC,KAEhB,GAAI41E,EAAY53E,GACd,OAAQ83E,EAAS93E,GAAOrC,OAE1B,IAAK,IAAIgU,KAAO3R,EACd,GAAIsR,EAAe/N,KAAKvD,EAAO2R,GAC7B,OAAO,EAGX,OAAO,CACT,mBC1EA,IAAI2jE,EAAc,EAAQ,OAkC1Bv6E,EAAOD,QAJP,SAASgxF,QAAQ9rF,EAAOswD,GACtB,OAAOglB,EAAYt1E,EAAOswD,EAC5B,mBChCA,IAAI0kB,EAAa,EAAQ,OACrBnJ,EAAe,EAAQ,OACvB+M,EAAgB,EAAQ,OAiC5B79E,EAAOD,QATP,SAASuuF,QAAQrpF,GACf,IAAK6rE,EAAa7rE,GAChB,OAAO,EAET,IAAIwY,EAAMw8D,EAAWh1E,GACrB,MAzBa,kBAyBNwY,GA1BO,yBA0BYA,GACC,iBAAjBxY,EAAM4O,SAA4C,iBAAd5O,EAAM0O,OAAqBkqE,EAAc54E,EACzF,mBCjCA,IAAIg1E,EAAa,EAAQ,OACrB19D,EAAW,EAAQ,OAmCvBvc,EAAOD,QAVP,SAAS87E,WAAW52E,GAClB,IAAKsX,EAAStX,GACZ,OAAO,EAIT,IAAIwY,EAAMw8D,EAAWh1E,GACrB,MA5BY,qBA4BLwY,GA3BI,8BA2BcA,GA7BZ,0BA6B6BA,GA1B7B,kBA0BgDA,CAC/D,aCAAzd,EAAOD,QALP,SAASu8E,SAASr3E,GAChB,MAAuB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GA9Bb,gBA+BvB,mBChCA,IAAIu2E,EAAY,EAAQ,OACpB+D,EAAY,EAAQ,MACpB+J,EAAW,EAAQ,OAGnB0H,EAAY1H,GAAYA,EAASpyB,MAmBjCA,EAAQ85B,EAAYzR,EAAUyR,GAAaxV,EAE/Cx7E,EAAOD,QAAUm3D,aCLjBl3D,EAAOD,QAJP,SAASkxF,OAAOhsF,GACd,OAAiB,OAAVA,CACT,mBCnBA,IAAIg1E,EAAa,EAAQ,OACrBnJ,EAAe,EAAQ,OAoC3B9wE,EAAOD,QALP,SAASmxF,SAASjsF,GAChB,MAAuB,iBAATA,GACX6rE,EAAa7rE,IA9BF,mBA8BYg1E,EAAWh1E,EACvC,aCLAjF,EAAOD,QALP,SAASwc,SAAStX,GAChB,IAAI2B,SAAc3B,EAClB,OAAgB,MAATA,IAA0B,UAAR2B,GAA4B,YAARA,EAC/C,aCAA5G,EAAOD,QAJP,SAAS+wE,aAAa7rE,GACpB,OAAgB,MAATA,GAAiC,iBAATA,CACjC,mBC1BA,IAAIg1E,EAAa,EAAQ,OACrBwM,EAAe,EAAQ,OACvB3V,EAAe,EAAQ,OAMvBkL,EAAYlgE,SAASnX,UACrBs3E,EAAcx3E,OAAOE,UAGrBu3E,EAAeF,EAAU70E,SAGzBoP,EAAiB0lE,EAAY1lE,eAG7B46E,EAAmBjV,EAAa1zE,KAAK/D,QA2CzCzE,EAAOD,QAbP,SAAS89E,cAAc54E,GACrB,IAAK6rE,EAAa7rE,IA5CJ,mBA4Ccg1E,EAAWh1E,GACrC,OAAO,EAET,IAAIsG,EAAQk7E,EAAaxhF,GACzB,GAAc,OAAVsG,EACF,OAAO,EAET,IAAI+2E,EAAO/rE,EAAe/N,KAAK+C,EAAO,gBAAkBA,EAAMgI,YAC9D,MAAsB,mBAAR+uE,GAAsBA,aAAgBA,GAClDpG,EAAa1zE,KAAK85E,IAAS6O,CAC/B,mBC3DA,IAAI9U,EAAY,EAAQ,OACpBkD,EAAY,EAAQ,MACpB+J,EAAW,EAAQ,OAGnB8H,EAAY9H,GAAYA,EAASxhB,MAmBjCA,EAAQspB,EAAY7R,EAAU6R,GAAa/U,EAE/Cr8E,EAAOD,QAAU+nE,mBC1BjB,IAAImS,EAAa,EAAQ,OACrBpzE,EAAU,EAAQ,MAClBiqE,EAAe,EAAQ,OA2B3B9wE,EAAOD,QALP,SAASsxF,SAASpsF,GAChB,MAAuB,iBAATA,IACV4B,EAAQ5B,IAAU6rE,EAAa7rE,IArBrB,mBAqB+Bg1E,EAAWh1E,EAC1D,mBC3BA,IAAIg1E,EAAa,EAAQ,OACrBnJ,EAAe,EAAQ,OA2B3B9wE,EAAOD,QALP,SAASgxB,SAAS9rB,GAChB,MAAuB,iBAATA,GACX6rE,EAAa7rE,IArBF,mBAqBYg1E,EAAWh1E,EACvC,mBC1BA,IAAIu3E,EAAmB,EAAQ,OAC3B+C,EAAY,EAAQ,MACpB+J,EAAW,EAAQ,OAGnBgI,EAAmBhI,GAAYA,EAAS1T,aAmBxCA,EAAe0b,EAAmB/R,EAAU+R,GAAoB9U,EAEpEx8E,EAAOD,QAAU61E,mBC1BjB,IAAIgC,EAAS,EAAQ,OACjB9G,EAAe,EAAQ,OA0B3B9wE,EAAOD,QAJP,SAASwuF,UAAUtpF,GACjB,OAAO6rE,EAAa7rE,IApBL,oBAoBe2yE,EAAO3yE,EACvC,mBCzBA,IAAImzE,EAAY,EAAQ,OACpBwE,EAAe,EAAQ,OAmD3B58E,EAAOD,QAJP,SAASq1E,SAASh/D,GAChB,OAAOwmE,EAA4B,mBAARxmE,EAAqBA,EAAOgiE,EAAUhiE,EA7C7C,GA8CtB,kBClDA,IAAIy/D,EAAgB,EAAQ,OACxBkH,EAAW,EAAQ,KACnBlsB,EAAc,EAAQ,OAkC1B7wD,EAAOD,QAJP,SAASme,KAAKS,GACZ,OAAOkyC,EAAYlyC,GAAUk3D,EAAcl3D,GAAUo+D,EAASp+D,EAChE,mBClCA,IAAIk3D,EAAgB,EAAQ,OACxBoH,EAAa,EAAQ,OACrBpsB,EAAc,EAAQ,OA6B1B7wD,EAAOD,QAJP,SAASq3E,OAAOz4D,GACd,OAAOkyC,EAAYlyC,GAAUk3D,EAAcl3D,GAAQ,GAAQs+D,EAAWt+D,EACxE,aCVA3e,EAAOD,QALP,SAASgQ,KAAK7I,GACZ,IAAItE,EAAkB,MAATsE,EAAgB,EAAIA,EAAMtE,OACvC,OAAOA,EAASsE,EAAMtE,EAAS,QAAK8D,CACtC,mBCjBA,IAAI+tE,EAAW,EAAQ,OAiDvB,SAASqU,QAAQ1yE,EAAMqyB,GACrB,GAAmB,mBAARryB,GAAmC,MAAZqyB,GAAuC,mBAAZA,EAC3D,MAAM,IAAI3jC,UAhDQ,uBAkDpB,IAAIysF,SAAW,WACb,IAAIltE,EAAOhd,UACPuP,EAAM6xB,EAAWA,EAASt9B,MAAMhL,KAAMkkB,GAAQA,EAAK,GACnD+uC,EAAQm+B,SAASn+B,MAErB,GAAIA,EAAM9sC,IAAI1P,GACZ,OAAOw8C,EAAMtnD,IAAI8K,GAEnB,IAAI8G,EAAStH,EAAKjL,MAAMhL,KAAMkkB,GAE9B,OADAktE,SAASn+B,MAAQA,EAAM1mD,IAAIkK,EAAK8G,IAAW01C,EACpC11C,CACT,EAEA,OADA6zE,SAASn+B,MAAQ,IAAK01B,QAAQ0I,OAAS/c,GAChC8c,QACT,CAGAzI,QAAQ0I,MAAQ/c,EAEhBz0E,EAAOD,QAAU+oF,yBCxEjB,IAAIrL,EAAY,EAAQ,OAkCpBrlB,EAjCiB,EAAQ,MAiCjB2pB,EAAe,SAASpjE,EAAQX,EAAQ0/D,GAClDD,EAAU9+D,EAAQX,EAAQ0/D,EAC5B,IAEA19E,EAAOD,QAAUq4D,aCCjBp4D,EAAOD,QAhBP,SAAS0xF,OAAOnuB,GACd,GAAwB,mBAAbA,EACT,MAAM,IAAIx+D,UAxBQ,uBA0BpB,OAAO,WACL,IAAIuf,EAAOhd,UACX,OAAQgd,EAAKzhB,QACX,KAAK,EAAG,OAAQ0gE,EAAU96D,KAAKrI,MAC/B,KAAK,EAAG,OAAQmjE,EAAU96D,KAAKrI,KAAMkkB,EAAK,IAC1C,KAAK,EAAG,OAAQi/C,EAAU96D,KAAKrI,KAAMkkB,EAAK,GAAIA,EAAK,IACnD,KAAK,EAAG,OAAQi/C,EAAU96D,KAAKrI,KAAMkkB,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAE9D,OAAQi/C,EAAUn4D,MAAMhL,KAAMkkB,EAChC,CACF,aCrBArkB,EAAOD,QAJP,SAASmmF,OAET,kBCdA,IAAIrmF,EAAO,EAAQ,OAsBnBG,EAAOD,QAJG,WACR,OAAOF,EAAKoY,KAAK24D,KACnB,mBCpBA,IAAIwF,EAAW,EAAQ,OACnBgC,EAAY,EAAQ,OACpBoH,EAAY,EAAQ,OACpBhG,EAAW,EAAQ,OACnBtC,EAAa,EAAQ,OACrB2N,EAAkB,EAAQ,OAC1BoB,EAAW,EAAQ,OACnBtO,EAAe,EAAQ,OA2BvB+Z,EAAOzL,GAAS,SAAStnE,EAAQgzE,GACnC,IAAIj0E,EAAS,CAAC,EACd,GAAc,MAAViB,EACF,OAAOjB,EAET,IAAI66D,GAAS,EACboZ,EAAQvb,EAASub,GAAO,SAAS95E,GAG/B,OAFAA,EAAO2hE,EAAS3hE,EAAM8G,GACtB45D,IAAWA,EAAS1gE,EAAKjV,OAAS,GAC3BiV,CACT,IACAq/D,EAAWv4D,EAAQg5D,EAAah5D,GAASjB,GACrC66D,IACF76D,EAAS06D,EAAU16D,EAAQk0E,EAAwD/M,IAGrF,IADA,IAAIjiF,EAAS+uF,EAAM/uF,OACZA,KACL48E,EAAU9hE,EAAQi0E,EAAM/uF,IAE1B,OAAO8a,CACT,IAEA1d,EAAOD,QAAU2xF,mBCxDjB,IAAIxT,EAAe,EAAQ,OACvBC,EAAmB,EAAQ,OAC3Bd,EAAQ,EAAQ,OAChB5D,EAAQ,EAAQ,OA4BpBz5E,EAAOD,QAJP,SAAS21B,SAAS7d,GAChB,OAAOwlE,EAAMxlE,GAAQqmE,EAAazE,EAAM5hE,IAASsmE,EAAiBtmE,EACpE,kBC7BA,IAAI+sE,EAAa,EAAQ,OACrBqB,EAAW,EAAQ,OA2BnB6H,EAAQ7H,GAAS,SAAS7vE,EAAMwzE,GAClC,OAAOhF,EAAWxuE,EAzBE,SAyBqB1P,OAAWA,OAAWA,EAAWkjF,EAC5E,IAEA5pF,EAAOD,QAAU+tF,mBChCjB,IAAIzX,EAAc,EAAQ,OACtB0C,EAAW,EAAQ,OACnB6D,EAAe,EAAQ,OACvByB,EAAa,EAAQ,OACrBx3E,EAAU,EAAQ,MA8CtB7G,EAAOD,QAPP,SAASu3B,OAAO2kC,EAAYmZ,EAAUkB,GACpC,IAAIlgE,EAAOvP,EAAQo1D,GAAcoa,EAAcgI,EAC3C9H,EAAYlvE,UAAUzE,OAAS,EAEnC,OAAOwT,EAAK6lD,EAAY2gB,EAAaxH,EAAU,GAAIkB,EAAaC,EAAWwC,EAC7E,mBChDA,IAAI2F,EAAU,EAAQ,OAkCtB1+E,EAAOD,QAJP,SAAS2M,IAAIiS,EAAQ9G,EAAM5S,GACzB,OAAiB,MAAV0Z,EAAiBA,EAAS+/D,EAAQ//D,EAAQ9G,EAAM5S,EACzD,mBChCA,IAAIuxE,EAAY,EAAQ,OACpBoG,EAAe,EAAQ,OACvBoC,EAAW,EAAQ,MACnBn4E,EAAU,EAAQ,MAClBi7E,EAAiB,EAAQ,OA8C7B9hF,EAAOD,QARP,SAASymE,KAAKvK,EAAYqH,EAAW4e,GACnC,IAAI9rE,EAAOvP,EAAQo1D,GAAcua,EAAYwI,EAI7C,OAHIkD,GAASJ,EAAe7lB,EAAYqH,EAAW4e,KACjD5e,OAAY58D,GAEP0P,EAAK6lD,EAAY2gB,EAAatZ,EAAW,GAClD,aC1BAtjE,EAAOD,QAJP,SAAS8mF,YACP,MAAO,EACT,aCHA7mF,EAAOD,QAJP,SAAS+wF,YACP,OAAO,CACT,mBCfA,IAAIjgB,EAAW,EAAQ,OAGnBghB,EAAW,IAsCf7xF,EAAOD,QAZP,SAAS+xF,SAAS7sF,GAChB,OAAKA,GAGLA,EAAQ4rE,EAAS5rE,MACH4sF,GAAY5sF,KAAU,IA9BpB,uBA+BFA,EAAQ,GAAK,EAAI,GAGxBA,GAAUA,EAAQA,EAAQ,EAPd,IAAVA,EAAcA,EAAQ,CAQjC,mBCvCA,IAAI6sF,EAAW,EAAQ,OAmCvB9xF,EAAOD,QAPP,SAAS4kF,UAAU1/E,GACjB,IAAIyY,EAASo0E,EAAS7sF,GAClB8sF,EAAYr0E,EAAS,EAEzB,OAAOA,GAAWA,EAAUq0E,EAAYr0E,EAASq0E,EAAYr0E,EAAU,CACzE,kBCjCA,IAAIvW,EAAW,EAAQ,OA2BvBnH,EAAOD,QAJP,SAASiyF,QAAQ/sF,GACf,OAAOkC,EAASlC,GAAOwC,aACzB,mBCzBA,IAAI63E,EAAW,EAAQ,OACnB/iE,EAAW,EAAQ,OACnBwU,EAAW,EAAQ,OAMnBo/C,EAAa,qBAGbC,EAAa,aAGbC,EAAY,cAGZC,EAAe9mE,SA8CnBxJ,EAAOD,QArBP,SAAS8wE,SAAS5rE,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAI8rB,EAAS9rB,GACX,OA1CM,IA4CR,GAAIsX,EAAStX,GAAQ,CACnB,IAAIswD,EAAgC,mBAAjBtwD,EAAMmB,QAAwBnB,EAAMmB,UAAYnB,EACnEA,EAAQsX,EAASg5C,GAAUA,EAAQ,GAAMA,CAC3C,CACA,GAAoB,iBAATtwD,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQq6E,EAASr6E,GACjB,IAAI8rE,EAAWX,EAAW3uE,KAAKwD,GAC/B,OAAQ8rE,GAAYV,EAAU5uE,KAAKwD,GAC/BqrE,EAAarrE,EAAMO,MAAM,GAAIurE,EAAW,EAAI,GAC3CZ,EAAW1uE,KAAKwD,GAvDb,KAuD6BA,CACvC,mBC7DA,IAAImxE,EAAW,EAAQ,OACnBmB,EAAY,EAAQ,KACpB1wE,EAAU,EAAQ,MAClBkqB,EAAW,EAAQ,OACnBmgB,EAAe,EAAQ,OACvBuoC,EAAQ,EAAQ,OAChBtyE,EAAW,EAAQ,OA0BvBnH,EAAOD,QAPP,SAASyuF,OAAOvpF,GACd,OAAI4B,EAAQ5B,GACHmxE,EAASnxE,EAAOw0E,GAElB1oD,EAAS9rB,GAAS,CAACA,GAASsyE,EAAUrmC,EAAa/pC,EAASlC,IACrE,mBC9BA,IAAIiyE,EAAa,EAAQ,OACrBE,EAAS,EAAQ,OA8BrBp3E,EAAOD,QAJP,SAAS+9E,cAAc74E,GACrB,OAAOiyE,EAAWjyE,EAAOmyE,EAAOnyE,GAClC,mBC7BA,IAAIk6E,EAAe,EAAQ,OA2B3Bn/E,EAAOD,QAJP,SAASoH,SAASlC,GAChB,OAAgB,MAATA,EAAgB,GAAKk6E,EAAal6E,EAC3C,mBCzBA,IAmBI0nF,EAnBkB,EAAQ,MAmBblK,CAAgB,eAEjCziF,EAAOD,QAAU4sF,mBCrBjB,IAAIhW,EAAa,EAAQ,OACrBsR,EAAiB,EAAQ,OACzB9gF,EAAW,EAAQ,OACnBklF,EAAe,EAAQ,MA+B3BrsF,EAAOD,QAVP,SAAS8iF,MAAM19E,EAAQ8sF,EAAS/P,GAI9B,OAHA/8E,EAASgC,EAAShC,QAGFuB,KAFhBurF,EAAU/P,OAAQx7E,EAAYurF,GAGrBhK,EAAe9iF,GAAUknF,EAAalnF,GAAUwxE,EAAWxxE,GAE7DA,EAAOnE,MAAMixF,IAAY,EAClC,kBChCA,IAAIhf,EAAc,EAAQ,OACtBc,EAAgB,EAAQ,MACxBf,EAAa,EAAQ,MACrBnsE,EAAU,EAAQ,MAClBiqE,EAAe,EAAQ,OACvByb,EAAe,EAAQ,OAMvBh2E,EAHc9R,OAAOE,UAGQ4R,eAuHjC,SAASoyE,OAAO1jF,GACd,GAAI6rE,EAAa7rE,KAAW4B,EAAQ5B,MAAYA,aAAiBguE,GAAc,CAC7E,GAAIhuE,aAAiB8uE,EACnB,OAAO9uE,EAET,GAAIsR,EAAe/N,KAAKvD,EAAO,eAC7B,OAAOsnF,EAAatnF,EAExB,CACA,OAAO,IAAI8uE,EAAc9uE,EAC3B,CAGA0jF,OAAOhkF,UAAYquE,EAAWruE,UAC9BgkF,OAAOhkF,UAAU4O,YAAco1E,OAE/B3oF,EAAOD,QAAU4oF,uBClJjB,IAAI5R,EAAc,EAAQ,OACtB0I,EAAgB,EAAQ,MAsB5Bz/E,EAAOD,QAJP,SAASmyF,UAAU5jE,EAAOpD,GACxB,OAAOu0D,EAAcnxD,GAAS,GAAIpD,GAAU,GAAI6rD,EAClD,gCCnBA,IAAIpwC,EAAO,EAAQ,OACfqF,EAAQ,EAAQ,OAEpBjsC,EAAQq8C,UAAYA,UACpBr8C,EAAQo8C,cA0DR,SAASA,cAAcl3C,EAAO8R,GAC5B,IAKI2G,EACAglC,EACA7zB,EACAlb,EARAw+E,EAAWp7E,GAAW,CAAC,EACvBq7E,EAASD,EAASC,QAAUzrD,EAAKqe,gBACjCqtC,EAASF,EAASE,OAClBzvF,EAASwvF,EAAOxvF,OAChBqU,IAAS,EAMTo7E,UACFA,EAASC,GAGX,GAAqB,iBAAVrtF,EACT,MAAM+mC,EAAM,wCAAyC/mC,GAGvDy9C,EAAa,CAAC7N,UAAW,EAAGqD,SAAU,KAAMjzC,MAAO,IACnDyY,EAAS,CAACm3B,UAAW,EAAGqD,SAAU,KAAMjzC,MAAO,IAE/C,OAASgS,GAAQrU,GACf+Q,EAAOy+E,EAAOn7E,IAET0vB,EAAKuV,YAAYvoC,MAItBkb,EAAUutB,UAAUzoC,EAAM1O,EAAO8R,IACzBmhC,SAAWvkC,EAEfkb,EAAQgmB,UAAY6N,EAAW7N,YACjC6N,EAAa7zB,GAGXA,EAAQgmB,UAAYn3B,EAAOm3B,YAC7B6N,EAAahlC,EACbA,EAASmR,IAIT6zB,EAAWxK,WACbx6B,EAAOglC,WAAaA,GAGtB,OAAOhlC,CACT,EAxGA3d,EAAQ4kD,iBA2GR,SAASA,iBAAiBhxC,EAAM24B,GAC9B3F,EAAKge,iBAAiBhxC,EAAM24B,EAC9B,EA5GAvsC,EAAQilD,cA+GR,SAASA,gBACP,OAAOre,EAAKqe,eACd,EAhHAjlD,EAAQwyF,cAmHR,SAASA,cAAc5+E,EAAMq9B,GAC3B,IACIp6B,EADA2f,EAAM5iB,EAGNq9B,KACFza,EAAM,CAAC,GACH5iB,GAAQq9B,GAGd,IAAKp6B,KAAO2f,EACVoQ,EAAKod,gBAAgBxtB,EAAI3f,GAAM,CAACooC,aAAcpoC,GAElD,EA7HA47E,QAAQ7tF,UAAUquC,QA2JlB,SAASr6B,KAAK1T,GACZ,IACI4pB,EACAsxC,EAFAvsD,EAAQzT,KAAKyT,MAIjB,GAAc,KAAV3O,EAAc,OAElB4pB,EAAUjb,EAAMA,EAAMhR,OAAS,IAC/Bu9D,EAAOtxC,EAAQ2kB,SAAS3kB,EAAQ2kB,SAAS5wC,OAAS,KAExB,SAAdu9D,EAAKv5D,KACfu5D,EAAKl7D,OAASA,EAEd4pB,EAAQ2kB,SAASvwC,KAAK,CAAC2D,KAAM,OAAQ3B,MAAOA,GAEhD,EAzKAutF,QAAQ7tF,UAAUqvC,WAoIlB,SAASA,WAAW/uC,EAAO0O,GACzBxT,KAAK8yC,SAASt/B,GACdxT,KAAK6yC,QAAQ/tC,GACb9E,KAAKkzC,WACP,EAvIAm/C,QAAQ7tF,UAAUsvC,eAyIlB,SAASA,eAAeshB,EAAO5hD,GAC7B,IAAIC,EAAQzT,KAAKyT,MACbib,EAAUjb,EAAMA,EAAMhR,OAAS,GAC/Bw/C,EAAUmT,EAAMhiB,SAASC,SACzB3R,EAAOluB,EACP,CACE/M,KAAM,UACN46B,QAAS,OACTixD,WAAY,CAACv/C,UAAW,CAACv/B,IACzB6/B,SAAU4O,GAEZA,EAEJvzB,EAAQ2kB,SAAW3kB,EAAQ2kB,SAASjnC,OAAOs1B,EAC7C,EAtJA2wD,QAAQ7tF,UAAUsuC,SAyKlB,SAAS/kB,KAAKva,GACZ,IAAIC,EAAQzT,KAAKyT,MACbs/B,EAAY/yC,KAAK4W,QAAQ+7B,YAAcn/B,EACvCkb,EAAUjb,EAAMA,EAAMhR,OAAS,GAC/BgxC,EAAQ,CACVhtC,KAAM,UACN46B,QAAS,OACTixD,WAAY,CAACv/C,UAAW,CAACA,IACzBM,SAAU,IAGZ3kB,EAAQ2kB,SAASvwC,KAAK2wC,GACtBhgC,EAAM3Q,KAAK2wC,EACb,EArLA4+C,QAAQ7tF,UAAU0uC,UAuLlB,SAAS7lB,QACPrtB,KAAKyT,MAAMskB,KACb,EAxLAs6D,QAAQ7tF,UAAU8uC,cAAgByyC,KAClCsM,QAAQ7tF,UAAUwvC,SAAW+xC,KAC7BsM,QAAQ7tF,UAAUuvC,OAwLlB,SAASw+C,aACP,MAAO,EACT,EAxLA,IAAIJ,EAAgB,QAGpB,SAASl2C,UAAUzoC,EAAM1O,EAAO8R,GAC9B,IAGI2G,EAHAi1E,EAAShsD,EAAK6d,UAAU,CAAC,GAEzB6tC,GADWt7E,GAAW,CAAC,GACLs7E,OAGtB,GAAoB,iBAAT1+E,EACT,MAAMq4B,EAAM,uCAAwCr4B,GAGtD,IAAKgzB,EAAKuV,YAAYvoC,GACpB,MAAMq4B,EAAM,2CAA4Cr4B,GAG1D,GAAqB,iBAAV1O,EACT,MAAM+mC,EAAM,wCAAyC/mC,GAevD,GAZIotF,UACFA,EAASC,GAGX3rD,EAAK6d,UAAU,CAAC1F,UAAW0zC,QAAS1/C,YAAau/C,IAEjD30E,EAASipB,EAAKyV,UAAUn3C,EAAO,CAACizC,SAAUvkC,EAAM0oC,gBAAgB,IAEhE1V,EAAK6d,UAAUmuC,GAAU,CAAC,GAItBj1E,EAAOskC,YACT,MAAMtkC,EAAOskC,YAGf,MAAO,CACLnN,UAAWn3B,EAAOm3B,UAClBqD,SAAUx6B,EAAOw6B,SACjBjzC,MAAOyY,EAAOyqB,QAAQoL,SAASC,SAEnC,CA4EA,SAASg/C,QAAQz7E,GACf5W,KAAK4W,QAAUA,EACf5W,KAAKozC,SAAW,CAACC,SAAU,IAC3BrzC,KAAKyT,MAAQ,CAACzT,KAAKozC,SACrB,CAgEA,SAAS2yC,OAAQ,mBC9MjB,MAAMuL,EAAS,EAAQ,OAKvB,SAASmB,8BAA8B3tF,GAErC,MAAqB,iBAAVA,EACFuxB,GAAWA,EAAQA,UAAYvxB,EAIpCA,EAAMsO,aAAetO,EAAM4tF,OACtBr8D,GAAWA,aAAmBvxB,EAGhCA,CACT,CASA,MAAM6tF,WACJ,WAAAv/E,CAAYw/E,GACV5yF,KAAK4yF,SAAWA,GAAY,EAC9B,CAKA,OAAAC,GACE,OAAO7yF,KAAK4yF,SAASx8D,KAAIC,GAAWA,EAAQw8D,WAC9C,CASA,GAAAz8D,CAAIysD,EAAUnqD,GACZ,OAAO14B,KAAK4yF,SAASx8D,IAAIysD,EAAUnqD,EACrC,CAQA,OAAAizC,CAAQkX,EAAUnqD,GAChB,OAAO14B,KACJo2B,IAAIysD,EAAUnqD,GACdvB,QAAO,CAAClrB,EAAG/F,IAAM+F,EAAEG,OAAOlG,IAAI,GACnC,CASA,UAAA4sF,CAAWvJ,EAAW7wD,GACpB,MAAMupB,EAAU,GAUhB,OARAjiD,KAAKksB,SAASmK,IACZ,MAAM9Y,EAASgsE,EAAU9zE,KAAKijB,EAAf6wD,CAAwBlzD,GAEnC9Y,GACF0kC,EAAQn/C,KAAKya,EACf,IAGK0kC,CACT,CAQA,MAAAzrB,CAAOqsD,EAAUnqD,GAEf,OADAmqD,EAAW4P,8BAA8B5P,GAClC,IAAI8P,WAAW3yF,KAAK4yF,SAASp8D,OAAOqsD,EAAUnqD,GACvD,CAQA,MAAAyP,CAAO06C,EAAUnqD,GAEf,OADAmqD,EAAW4P,8BAA8B5P,GAClC,IAAI8P,WAAW3yF,KAAK4yF,SAASp8D,OAAO86D,EAAOzO,GAAWnqD,GAC/D,CASA,IAAAqqB,CAAK8/B,EAAUnqD,GAEb,OADAmqD,EAAW4P,8BAA8B5P,GAClC7iF,KAAK4yF,SAAS7vC,KAAK8/B,EAAUnqD,EACtC,CAOA,OAAAxM,CAAQ22D,EAAUnqD,GAChB14B,KAAK4yF,SAAS1mE,QAAQ22D,EAAUnqD,EAClC,CAOA,MAAAvB,CAAO0rD,EAAUkQ,GACf,OAAO/yF,KAAK4yF,SAASz7D,OAAO0rD,EAAUkQ,EACxC,CAOA,QAAA3lF,CAAStI,GACP,OAAO9E,KAAK4yF,SAASvsB,MAAKhwC,GAAWA,EAAQzpB,OAAO9H,IACtD,CASA,KAAAwmC,GACE,OAAOtrC,KAAK4yF,SAAStnD,OACvB,CAOA,OAAA7B,CAAQ3kC,GACN9E,KAAK4yF,SAASnpD,QAAQzpC,KAAKgzF,QAAQluF,GACrC,CAOA,IAAAhC,CAAKgC,GAEH,OADA9E,KAAK4yF,SAAS9vF,KAAK9C,KAAKgzF,QAAQluF,IACzB9E,IACT,CAMA,GAAA2mC,CAAI7hC,GACF9E,KAAK8C,KAAKgC,EACZ,CASA,GAAA6G,CAAImL,GACF,OAAO9W,KAAK4yF,SAAS97E,EACvB,CAMA,QAAAuvE,CAASvvE,GACP,MAAMuf,EAAUr2B,KAAK4yF,SAAS97E,GAE9B,GAAIuf,EACF,OAAOA,EAAQw8D,SAInB,CAMA,UAAIpwF,GACF,OAAOzC,KAAK4yF,SAASnwF,MACvB,CAMA,WAAIyoE,GACF,OAAgC,IAAzBlrE,KAAK4yF,SAASnwF,MACvB,CAMA,SAAIkN,GACF,OAAO3P,KAAK4yF,SAAS,EACvB,EAGoB,oBAAX/uF,SACT8uF,WAAWnuF,UAAUX,OAAOukB,UAAY,SAAS6D,SAC/C,OAAOjsB,KAAK4yF,SAAS/uF,OAAOukB,WAC9B,GAGFvoB,EAAOD,QAAU+yF,sBCvOjB,MAAMM,aACJ,WAAA7/E,CAAYqD,EAAK3R,GACf9E,KAAKyW,IAAMA,EACXzW,KAAK8E,MAAQA,CACf,CAKA,KAAAqwB,GACE,MAAMA,EAAQ,IAAI89D,aAUlB,OARIjzF,KAAKyW,MACP0e,EAAM1e,IAAMzW,KAAKyW,IAAI0e,SAGnBn1B,KAAK8E,QACPqwB,EAAMrwB,MAAQ9E,KAAK8E,MAAMqwB,SAGpBA,CACT,EAGFt1B,EAAOD,QAAUqzF,8BC9BjB,MAAMnC,EAAS,EAAQ,OACjBI,EAAW,EAAQ,OACnBH,EAAW,EAAQ,OACnBL,EAAY,EAAQ,OACpBt0E,EAAW,EAAQ,OAEnB82E,EAAiB,EAAQ,OACzBN,EAAW,EAAQ,OAYzB,MAAMO,UACJ,WAAA//E,CAAYwD,GACV5W,KAAKozF,WAAa,CAAC,EACnBpzF,KAAKqzF,iBAAmB,GACxBrzF,KAAKk8B,QAAU02D,EAAS12D,QACxBl8B,KAAKizF,aAAeL,EAASK,aAExBr8E,GAAYA,EAAQ08E,WACvBtzF,KAAKuzF,aAIPvzF,KAAKwzF,sBAAwB,GAC7BxzF,KAAKyzF,2BAA6B,EACpC,CAOA,GAAAC,CAAI3vC,GAOF,OANIA,EAAOn/B,WACTm/B,EAAOn/B,UAAU,CAAE+uE,KAAM3zF,OAEvB+jD,EAAO6vC,MACT7vC,EAAO6vC,KAAK,CAAED,KAAM3zF,OAEfA,IACT,CAMA,UAAAuzF,GAuBE,OArBAvzF,KACG6zF,SAAS,OAAQjB,EAASkB,aAC1BD,SAAS,SAAUjB,EAASmB,eAC5BF,SAAS,SAAUjB,EAASoB,eAC5BH,SAAS,UAAWjB,EAASqB,gBAC7BJ,SAAS,QAASjB,EAASsB,cAC3BL,SAAS,SAAUjB,EAASuB,eAC5BN,SAAS,SAAUjB,EAASwB,eAC5BP,SAAS,MAAOjB,EAASyB,YACzBR,SAAS,OAAQjB,EAAS0B,aAI7Bt0F,KACGu0F,OAAOzD,EAAQ8B,EAASkB,aAAa,GACrCS,OAAOrD,EAAU0B,EAASmB,eAAe,GACzCQ,OAAOxD,EAAU6B,EAASoB,eAAe,GACzCO,OAAO7D,EAAWkC,EAASqB,gBAAgB,GAC3CM,OAAOpxF,MAAMuD,QAASksF,EAASsB,cAAc,GAC7CK,OAAOn4E,EAAUw2E,EAASuB,eAAe,GAErCn0F,IACT,CAQA,QAAA6zF,CAASrgF,EAAMghF,GAGb,OAFAx0F,KAAKy0F,eAAYluF,EACjBvG,KAAKozF,WAAW5/E,GAAQghF,EACjBx0F,IACT,CAOA,UAAA00F,CAAWlhF,GAGT,OAFAxT,KAAKy0F,eAAYluF,SACVvG,KAAKozF,WAAW5/E,GAChBxT,IACT,CAOA,MAAAu0F,CAAOjzF,EAAMkzF,EAAcG,GASzB,YARiCpuF,IAAjBouF,GAAoCA,EAGlD30F,KAAKqzF,iBAAiB5pD,QAAQ,CAACnoC,EAAMkzF,IAErCx0F,KAAKqzF,iBAAiBvwF,KAAK,CAACxB,EAAMkzF,IAG7Bx0F,IACT,CAQA,SAAA40F,CAAU9vF,GACR,GAAIA,aAAiB9E,KAAKk8B,QAAW,OAAOp3B,EAE5C,IAAIuxB,EAEJ,IAAK,IAAIt0B,EAAI,EAAGA,EAAI/B,KAAKqzF,iBAAiB5wF,OAAQV,GAAK,EAAG,CACxD,MAAMT,EAAOtB,KAAKqzF,iBAAiBtxF,GAAG,GAChCyyF,EAAex0F,KAAKqzF,iBAAiBtxF,GAAG,GAE9C,GAAIT,EAAKwD,GAAQ,CACfuxB,EAAU,IAAIm+D,EAAa1vF,GAC3B,KACF,CACF,CAEA,OAAOuxB,CACT,CAKA,eAAAw+D,CAAgBx+D,GACd,MAAMm+D,EAAex0F,KAAKozF,WAAW/8D,GAErC,YAAqB9vB,IAAjBiuF,EAIKx0F,KAAKk8B,QAGPs4D,CACT,CAKA,WAAAM,CAAY1yD,GACV,OAAOpiC,KAAK+0F,WAAWC,YAAY5yD,EACrC,CAKA,SAAA6yD,CAAU5+D,GACR,OAAOr2B,KAAK+0F,WAAWG,UAAU7+D,EACnC,CAMA,YAAIu8D,GAeF,YAduBrsF,IAAnBvG,KAAKy0F,YACPz0F,KAAKy0F,UAAY,CACfv4D,QAASl8B,KAAKk8B,SAGhB53B,OAAOyZ,KAAK/d,KAAKozF,YAAYlnE,SAAS1Y,IAIpC,MAAM2hF,EAAS3hF,EAAK,GAAGy5B,cAAgBz5B,EAAKlK,OAAO,GACnDtJ,KAAKy0F,UAAUU,GAAUn1F,KAAKozF,WAAW5/E,EAAK,KAI3CxT,KAAKy0F,SACd,CAWA,cAAIM,GACF,OAAO,IAAI7B,EAAelzF,KAC5B,EAGFkzF,EAAe1uF,UAAU2uF,UAAYA,UAErCtzF,EAAOD,QAAUuzF,2BCpNjB,MAAM7B,EAAS,EAAQ,OACjBqB,EAAa,EAAQ,OAI3B,MAAMyC,oBAAoBzC,EACxB,GAAAv8D,CAAIysD,EAAUnqD,GACZ,OAAO14B,KAAK4yF,SAASx8D,KAAIi/D,GAAUxS,EAASptE,KAAKijB,EAAdmqD,CAAuBwS,EAAOvwF,MAAOuwF,EAAO5+E,IAAK4+E,IACtF,CAEA,MAAA7+D,CAAOqsD,EAAUnqD,GACf,OAAO,IAAI08D,YAAYp1F,KAAK4yF,SAASp8D,QAAO6+D,GAAUxS,EAASptE,KAAKijB,EAAdmqD,CAAuBwS,EAAOvwF,MAAOuwF,EAAO5+E,IAAK4+E,KACzG,CAEA,MAAAltD,CAAO06C,EAAUnqD,GACf,OAAO14B,KAAKw2B,OAAO86D,EAAOzO,EAASptE,KAAKijB,IAC1C,CAEA,OAAAxM,CAAQ22D,EAAUnqD,GAChB,OAAO14B,KAAK4yF,SAAS1mE,SAAQ,CAACmpE,EAAQv+E,KAAY+rE,EAASptE,KAAKijB,EAAdmqD,CAAuBwS,EAAOvwF,MAAOuwF,EAAO5+E,IAAK4+E,EAAQv+E,EAAM,GACnH,CAKA,IAAAiH,GACE,OAAO/d,KAAKo2B,KAAI,CAACtxB,EAAO2R,IAAQA,EAAIo8E,WACtC,CAKA,MAAA9nE,GACE,OAAO/qB,KAAKo2B,KAAItxB,GAASA,EAAM+tF,WACjC,EAGFhzF,EAAOD,QAAUw1F,6BCrCjB,MAAMl5D,EAAU,EAAQ,MAClB43D,EAAc,EAAQ,OACtBC,EAAgB,EAAQ,OACxBC,EAAgB,EAAQ,OACxBC,EAAiB,EAAQ,OACzBC,EAAe,EAAQ,OACvBE,EAAgB,EAAQ,MACxBD,EAAgB,EAAQ,OACxBG,EAAc,EAAQ,OACtBD,EAAa,EAAQ,OAErB1B,GAAa,EAAQ,OACrByC,GAAc,EAAQ,OAEtBnC,GAAe,EAAQ,OAO7B,SAASD,QAAQluF,GACf,GAAIA,aAAiBo3B,EACnB,OAAOp3B,EAGT,GAAqB,iBAAVA,EACT,OAAO,IAAIivF,EAAcjvF,GAG3B,GAAqB,iBAAVA,EACT,OAAO,IAAIkvF,EAAclvF,GAG3B,GAAqB,kBAAVA,EACT,OAAO,IAAImvF,EAAenvF,GAG5B,GAAc,OAAVA,EACF,OAAO,IAAIgvF,EAGb,GAAI3wF,MAAMuD,QAAQ5B,GAChB,OAAO,IAAIovF,EAAapvF,EAAMsxB,IAAI48D,UAGpC,GAAqB,iBAAVluF,EAAoB,CAE7B,OADgB,IAAIqvF,EAAcrvF,EAEpC,CAEA,OAAOA,CACT,CAEAo3B,EAAQ13B,UAAU2vF,cAAgBA,EAClCj4D,EAAQ13B,UAAU6vF,WAAaA,EAC/Bn4D,EAAQ13B,UAAU4vF,cAAgBA,EAElCl4D,EAAQ13B,UAAUwuF,QAAUA,QAC5BL,GAAWnuF,UAAUwuF,QAAUA,QAM/BnzF,EAAOD,QAAU,CACfs8B,UACA43D,cACAC,gBACAC,gBACAC,iBACAC,eACAE,gBACAD,gBACAG,cACAD,aAEArB,QAEAL,cACAyC,eACAnC,kCCjFF,MAAM/2D,EAAU,EAAQ,MAcxBr8B,EAAOD,QAAU,MAAM00F,oBAAoBp4D,EACzC,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,GAAW,GAAIooE,EAAMhyD,GAC3BtjC,KAAKq2B,QAAU,MACjB,CAMA,YAAIk/D,GACF,OAAOv1F,KAAKsjC,WAAW33B,IAAI,WAC7B,CAEA,YAAI4pF,CAASA,GACXv1F,KAAKsjC,WAAW/2B,IAAI,WAAYgpF,EAClC,CAMA,QAAI/lB,GACF,OAAOxvE,KAAKsjC,WAAW33B,IAAI,OAC7B,CAEA,QAAI6jE,CAAKA,GACPxvE,KAAKsjC,WAAW/2B,IAAI,OAAQijE,EAC9B,oBC1CF,MAAMtzC,EAAU,EAAQ,MAWxBr8B,EAAOD,QAAU,MAAMy0F,mBAAmBn4D,EACxC,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,GAAW,GAAIooE,EAAMhyD,GAC3BtjC,KAAKq2B,QAAU,MAEVr2B,KAAK0X,OACR1X,KAAK0X,KAAO,UAEhB,CAOA,QAAIA,GACF,OAAO1X,KAAKsjC,WAAW33B,IAAI,OAC7B,CAEA,QAAI+L,CAAKykD,GACPn8D,KAAKsjC,WAAW/2B,IAAI,OAAQ4vD,EAC9B,oBChCF,MAAMg3B,EAAY,EAAQ,OACpBP,EAAW,EAAQ,OAGzBhzF,EAAQ,GAAYuzF,EAOpBvzF,EAAQqzF,aAAe,EAAvB,OAEArzF,EAAQ,GAAagzF,EAASD,WAC9B/yF,EAAQ,GAAcgzF,EAASwC,YAE/Bx1F,EAAQ,GAAUgzF,EAAS12D,QAC3Bt8B,EAAQ,GAAgBgzF,EAASmB,cACjCn0F,EAAQ,GAAgBgzF,EAASoB,cACjCp0F,EAAQ,GAAiBgzF,EAASqB,eAClCr0F,EAAQ,GAAcgzF,EAASkB,YAC/Bl0F,EAAQ,GAAegzF,EAASsB,aAChCt0F,EAAQ,GAAgBgzF,EAASuB,cACjCv0F,EAAQ,GAAgBgzF,EAASwB,cACjCx0F,EAAQ,GAAagzF,EAASyB,WAC9Bz0F,EAAQ,GAAcgzF,EAAS0B,YAE/B10F,EAAQ,GAAUgzF,EAASI,QAE3B,SACA,yBC9BA,MAAM1B,EAAS,EAAQ,OACjBp1D,EAAU,EAAQ,MAClBy2D,EAAa,EAAQ,OAS3B,MAAMuB,qBAAqBh4D,EACzB,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,GAAW,GAAIooE,EAAMhyD,GAC3BtjC,KAAKq2B,QAAU,OACjB,CAEA,SAAAm/D,GACE,MAAO,OACT,CAKA,GAAA7pF,CAAImL,GACF,OAAO9W,KAAKktB,QAAQpW,EACtB,CAMA,QAAAuvE,CAASoP,GACP,MAAMrgE,EAAOp1B,KAAK2L,IAAI8pF,GAEtB,GAAIrgE,EACF,OAAOA,EAAKy9D,SAIhB,CAKA,QAAA6C,CAAS5+E,GACP,OAAO9W,KAAKktB,QAAQpW,EACtB,CAEA,GAAAvK,CAAIuK,EAAOhS,GAET,OADA9E,KAAKktB,QAAQpW,GAAS9W,KAAKgzF,QAAQluF,GAC5B9E,IACT,CAEA,MAAA4hC,CAAO9qB,GACL,MAAM4kB,EAAU17B,KAAKktB,QAAQojB,OAAOx5B,EAAO,GAE3C,OAAI4kB,EAAQj5B,OACHi5B,EAAQ,GAGV,IACT,CAMA,GAAAtF,CAAIysD,EAAUnqD,GACZ,OAAO14B,KAAKktB,QAAQkJ,IAAIysD,EAAUnqD,EACpC,CAQA,OAAAizC,CAAQkX,EAAUnqD,GAChB,OAAO14B,KACJo2B,IAAIysD,EAAUnqD,GACdvB,QAAO,CAAClrB,EAAG/F,IAAM+F,EAAEG,OAAOlG,IAAI,GACnC,CASA,UAAA4sF,CAAWvJ,EAAW7wD,GACpB,MAAMupB,EAAU,GAUhB,OARAjiD,KAAKksB,SAASmK,IACZ,MAAM9Y,EAASgsE,EAAU9zE,KAAKijB,EAAf6wD,CAAwBlzD,GAEnC9Y,GACF0kC,EAAQn/C,KAAKya,EACf,IAGK0kC,CACT,CAOA,MAAAzrB,CAAOqsD,EAAUnqD,GACf,OAAO,IAAIi6D,EAAW3yF,KAAKktB,QAAQsJ,OAAOqsD,EAAUnqD,GACtD,CAOA,MAAAyP,CAAO06C,EAAUnqD,GACf,OAAO14B,KAAKw2B,OAAO86D,EAAOzO,GAAWnqD,EACvC,CAOA,MAAAvB,CAAO0rD,EAAUkQ,GACf,IAAI4C,EACAC,OAGiBrvF,IAAjBwsF,GACF4C,EAAa,EACbC,EAAO51F,KAAKgzF,QAAQD,KAEpB4C,EAAa,EAIbC,EAA4B,WAArB51F,KAAKw1F,YAA2Bx1F,KAAK2P,MAAM7K,MAAQ9E,KAAK2P,OAMjE,IAAK,IAAI5N,EAAI4zF,EAAY5zF,EAAI/B,KAAKyC,OAAQV,GAAK,EAAG,CAChD,MAAMqzB,EAAOp1B,KAAKktB,QAAQnrB,GAGxB6zF,EADuB,WAArB51F,KAAKw1F,YACAx1F,KAAKgzF,QAAQnQ,EAAS+S,EAAMxgE,EAAKtwB,MAAOswB,EAAK3e,IAAK2e,EAAMp1B,OAExDA,KAAKgzF,QAAQnQ,EAAS+S,EAAMxgE,EAAMrzB,EAAG/B,MAEhD,CAEA,OAAO41F,CACT,CAaA,OAAA1pE,CAAQ22D,EAAUnqD,GAChB14B,KAAKktB,QAAQhB,SAAQ,CAACkJ,EAAMte,KAC1B+rE,EAASptE,KAAKijB,EAAdmqD,CAAuBztD,EAAMp1B,KAAKgzF,QAAQl8E,GAAO,GAErD,CAKA,KAAAw0B,GACE,OAAOtrC,KAAKktB,QAAQoe,OACtB,CAKA,OAAA7B,CAAQ3kC,GACN9E,KAAKktB,QAAQuc,QAAQzpC,KAAKgzF,QAAQluF,GACpC,CAKA,IAAAhC,CAAKgC,GAEH,OADA9E,KAAKktB,QAAQpqB,KAAK9C,KAAKgzF,QAAQluF,IACxB9E,IACT,CAKA,GAAA2mC,CAAI7hC,GACF9E,KAAK8C,KAAKgC,EACZ,CAMA,YAAA+wF,CAAahtE,EAAWitE,GACtB,MAAMl/E,EAAUk/E,GAAgB,CAAC,EAC3BC,IAAcn/E,EAAQm/E,UACtB9zC,OAA8B17C,IAApBqQ,EAAQqrC,QAAwB,GAAKrrC,EAAQqrC,QAmB7D,OAfAjiD,KAAKksB,SAAQ,CAACkJ,EAAM4gE,EAAYX,KAG1BU,QAAoCxvF,IAAtB6uB,EAAKygE,cACrBzgE,EAAKygE,aAAahtE,EAAW,CAC3Bo5B,UACA8zC,cAIAltE,EAAUuM,EAAM4gE,EAAYX,IAC9BpzC,EAAQn/C,KAAKsyB,EACf,IAGK6sB,CACT,CAOA,IAAAc,CAAKl6B,GACH,OAAO,IAAI8pE,EAAW3yF,KAAK61F,aAAahtE,EAAW,CAAEktE,WAAW,IAClE,CAMA,aAAAE,CAAc5/D,GACZ,OAAOr2B,KAAK+iD,MAAK3tB,GAAQA,EAAKiB,UAAYA,GAC5C,CAOA,WAAA6/D,CAAYnjD,GACV,OAAO/yC,KAAK+iD,MAAK3tB,GAAQA,EAAK9e,QAAQlJ,SAAS2lC,IACjD,CAQA,OAAAojD,CAAQnlE,GACN,OAAOhxB,KAAK+iD,MAAK3tB,GAAQA,EAAKpE,GAAG6hE,YAAc7hE,IAAIrhB,KACrD,CAOA,QAAAvC,CAAStI,GACP,OAAO9E,KAAKktB,QAAQm5C,MAAKhwC,GAAWA,EAAQzpB,OAAO9H,IACrD,CASA,QAAA+vC,CAAS/vC,GACP,OAAO9E,KAAKoN,SAAStI,EACvB,CAOA,KAAA64D,GACE,OAAO,IAAI39D,KAAKoT,YAAY,GAC9B,CAEA,oBAAC,GACC,OAAOpT,KAAK29D,OACd,CAMA,MAAAvxD,CAAOgpD,GACL,OAAO,IAAIp1D,KAAKoT,YAAYpT,KAAKktB,QAAQ9gB,OAAOgpD,EAAMloC,SACxD,CAEA,qBAAC,CAAuBkoC,GACtB,OAAOp1D,KAAKoM,OAAOgpD,EACrB,CAEA,kBAAC,CAAoBm0B,GACnB,OAAO,IAAIvpF,KAAKoT,YAAYpT,KAAKo2B,IAAImzD,GACvC,CAEA,oBAAC,CAAsBA,GACrB,OAAOvpF,KACJo2B,KAAIC,GAAWkzD,EAAUlzD,IAAUr2B,MACnCm3B,QAAO,CAAClrB,EAAG/F,IAAM+F,EAAEG,OAAOlG,IAAIlG,KAAK29D,QACxC,CAEA,qBAAC,CAAuBklB,GACtB,OAAO,IAAI7iF,KAAKoT,YAAYpT,KAAKktB,QAAQsJ,OAAOqsD,GAClD,CAEA,qBAAC,CAAuB0G,EAAWwJ,GACjC,OAAO/yF,KAAKktB,QAAQiK,OAAOoyD,EAAWwJ,EACxC,CAMA,UAAItwF,GACF,OAAOzC,KAAKktB,QAAQzqB,MACtB,CAMA,WAAIyoE,GACF,OAA+B,IAAxBlrE,KAAKktB,QAAQzqB,MACtB,CAMA,SAAIkN,GACF,OAAO3P,KAAK01F,SAAS,EACvB,CAMA,UAAInlE,GACF,OAAOvwB,KAAK01F,SAAS,EACvB,CAMA,QAAI9lF,GACF,OAAO5P,KAAK01F,SAAS11F,KAAKyC,OAAS,EACrC,EAMFyxF,aAAav2B,MAAQ,SAASA,QAC5B,OAAO,IAAI39D,IACb,EAEAk0F,aAAa,sBAAwBA,aAAav2B,MAE5B,oBAAX95D,SACTqwF,aAAa1vF,UAAUX,OAAOukB,UAAY,SAAS6D,SACjD,OAAOjsB,KAAKktB,QAAQrpB,OAAOukB,WAC7B,GAGFvoB,EAAOD,QAAUs0F,8BCtYjB,MAAMh4D,EAAU,EAAQ,MASxBr8B,EAAOD,QAAU,MAAMq0F,uBAAuB/3D,EAC5C,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,EAASooE,EAAMhyD,GACrBtjC,KAAKq2B,QAAU,SACjB,CAEA,SAAAm/D,GACE,MAAO,SACT,mBCjBF,MAAM5E,EAAU,EAAQ,OAClBqC,EAAe,EAAQ,OACvBN,EAAa,EAAQ,OAW3B,MAAMz2D,QACJ,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GAGrBgyD,IACFt1F,KAAKs1F,KAAOA,GAGVhyD,IACFtjC,KAAKsjC,WAAaA,GAGpBtjC,KAAKktB,QAAUA,CACjB,CAOA,MAAAqK,GACMjzB,OAAOgzB,SAASt3B,QAIhBA,KAAKo2F,QACPp2F,KAAKs1F,KAAKj6E,OAASrb,KACnBA,KAAKs1F,KAAK/9D,UAGRv3B,KAAKq2F,cACPr2F,KAAKsjC,WAAWjoB,OAASrb,KACzBA,KAAKsjC,WAAW/L,UAGlBv3B,KAAKqzC,SAASnnB,SAASmK,IACrBA,EAAQhb,OAASrb,KACjBq2B,EAAQkB,QAAQ,GACfv3B,MAECA,KAAKktB,SAAW/pB,MAAMuD,QAAQ1G,KAAKktB,UACrC5oB,OAAOizB,OAAOv3B,KAAKktB,SAGrB5oB,OAAOizB,OAAOv3B,MAChB,CAEA,SAAAw1F,GAEA,CAKA,KAAArgE,GACE,MAAMxvB,EAAO,IAAI3F,KAAKoT,YAwBtB,OAtBAzN,EAAK0wB,QAAUr2B,KAAKq2B,QAEhBr2B,KAAKs1F,KAAK7yF,SACZkD,EAAKywF,MAAQp2F,KAAKs1F,KAAKngE,SAGrBn1B,KAAKsjC,WAAW7gC,SAClBkD,EAAK0wF,YAAcr2F,KAAKsjC,WAAWnO,SAGjCn1B,KAAKktB,QACHltB,KAAKktB,QAAQiI,MACfxvB,EAAKunB,QAAUltB,KAAKktB,QAAQiI,QACnBhyB,MAAMuD,QAAQ1G,KAAKktB,SAC5BvnB,EAAKunB,QAAUltB,KAAKktB,QAAQkJ,KAAIC,GAAWA,EAAQlB,UAEnDxvB,EAAKunB,QAAUltB,KAAKktB,QAGtBvnB,EAAKunB,QAAUltB,KAAKktB,QAGfvnB,CACT,CAIA,OAAAktF,GACE,OAAI7yF,KAAKktB,mBAAmBgP,QACnBl8B,KAAKktB,QAAQ2lE,UAGlB7yF,KAAKktB,mBAAmB+lE,EACnB,CACLx8E,IAAKzW,KAAKktB,QAAQzW,IAAIo8E,UACtB/tF,MAAO9E,KAAKktB,QAAQpoB,MAAQ9E,KAAKktB,QAAQpoB,MAAM+tF,eAAYtsF,GAI3DvG,KAAKktB,SAAWltB,KAAKktB,QAAQkJ,IACxBp2B,KAAKktB,QAAQkJ,KAAIC,GAAWA,EAAQw8D,WAAW7yF,MAGjDA,KAAKktB,OACd,CAOA,KAAAopE,CAAM5+E,GACJ,GAA0B,KAAtB1X,KAAKgxB,GAAG6hE,UACV,MAAMxvF,MAAM,qEAGd,MAAMmrD,EAAM,IAAIxuD,KAAKq0F,WAAWr0F,KAAKgxB,GAAG6hE,WAMxC,OAJIn7E,IACF82C,EAAI92C,KAAOA,GAGN82C,CACT,CASA,aAAA+nC,IAAiBC,GACf,GAAItvF,UAAUzE,OAAS,IAAMzC,KAAKs3B,SAChC,MAAM,IAAIj0B,MAAM,iHAGlB,MAAMozF,EAAcD,EAAaz+D,MACjC,IAAI66D,EAAW,IAAID,EAEnB,MAAM+D,OAAS,CAAC3vF,EAAOsvB,KACrBtvB,EAAMjE,KAAKuzB,GACJtvB,GAKH4vF,aAAe,CAAC5vF,EAAOsvB,KACvBA,EAAQA,UAAYogE,GACtB1vF,EAAMjE,KAAKuzB,GAGb,MAAMugE,EAAQvgE,EAAQkgE,cAAcE,GAepC,OAdIG,GACFA,EAAMz/D,OAAOu/D,OAAQ3vF,GAGnBsvB,EAAQnJ,mBAAmB+lE,IACzB58D,EAAQnJ,QAAQzW,KAClBkgF,aAAa5vF,EAAOsvB,EAAQnJ,QAAQzW,KAGlC4f,EAAQnJ,QAAQpoB,OAClB6xF,aAAa5vF,EAAOsvB,EAAQnJ,QAAQpoB,QAIjCiC,CAAK,EAmCd,OAhCI/G,KAAKktB,UAEHltB,KAAKktB,QAAQmJ,SACfsgE,aAAa/D,EAAU5yF,KAAKktB,SAI1B/pB,MAAMuD,QAAQ1G,KAAKktB,UACrBltB,KAAKktB,QAAQiK,OAAOw/D,aAAc/D,IAIjC4D,EAAatrB,UAChB0nB,EAAWA,EAASp8D,QAAQH,IAC1B,IAAIwgE,EAAiBxgE,EAAQygE,QAAQ1gE,KAAI9qB,GAAKA,EAAE+qB,UAGhD,IAAK,MAAM0gE,KAAcP,EAAc,CACrC,MAAMhjF,EAAOgjF,EAAaO,GACpBjgF,EAAQ+/E,EAAe11F,QAAQqS,GAErC,IAAe,IAAXsD,EAGF,OAAO,EAFP+/E,EAAiBA,EAAevmD,OAAO,EAAGx5B,EAI9C,CAEA,OAAO,CAAI,KAIR87E,CACT,CAEA,GAAArmF,CAAI2gB,GAEF,OADAltB,KAAKktB,QAAUA,EACRltB,IACT,CAEA,MAAA4M,CAAO9H,GACL,OAAO8rF,EAAQ5wF,KAAK6yF,UAAW/tF,EACjC,CAEA,eAAAkyF,CAAgBxjF,EAAM1O,GACpB,IAAK9E,KAAKs1F,KAAK2B,OAAOzjF,GAAO,CAC3B,GAAIxT,KAAKs3B,SAAU,CACjB,MAAMjB,EAAUr2B,KAAKgzF,QAAQluF,GAE7B,OADAuxB,EAAQkB,SACDlB,CACT,CAEAr2B,KAAKs1F,KAAK/oF,IAAIiH,EAAM1O,EACtB,CAEA,OAAO9E,KAAKs1F,KAAK3pF,IAAI6H,EACvB,CAEA,eAAA0jF,CAAgB1jF,EAAM1O,GACpB9E,KAAKs1F,KAAK/oF,IAAIiH,EAAM1O,EACtB,CAKA,WAAIuxB,GAEF,OAAOr2B,KAAKm3F,gBAAkB,SAChC,CAEA,WAAI9gE,CAAQA,GACVr2B,KAAKm3F,eAAiB9gE,CACxB,CAEA,WAAInJ,GACF,OAAOltB,KAAKo3F,QACd,CAEA,WAAIlqE,CAAQpoB,GACV,GAAIA,aAAiBo3B,QACnBl8B,KAAKo3F,SAAWtyF,OACX,GAAIA,aAAiB6tF,EAC1B3yF,KAAKktB,QAAUpoB,EAAM8tF,cAChB,GACW,iBAAT9tF,GACY,iBAATA,GACS,kBAATA,GACG,SAAVA,GACSyB,MAATzB,EAGH9E,KAAKo3F,SAAWtyF,OACX,GAAIA,aAAiBmuF,EAC1BjzF,KAAKo3F,SAAWtyF,OACX,GAAI3B,MAAMuD,QAAQ5B,GACvB9E,KAAKo3F,SAAWtyF,EAAMsxB,IAAIp2B,KAAKgzF,aAC1B,IAAqB,iBAAVluF,EAGhB,MAAM,IAAIzB,MAAM,qCAFhBrD,KAAKo3F,SAAW9yF,OAAOyZ,KAAKjZ,GAAOsxB,KAAI3f,GAAO,IAAIzW,KAAKo0F,cAAc39E,EAAK3R,EAAM2R,KAGlF,CACF,CAKA,QAAI6+E,GACF,IAAKt1F,KAAKo2F,MAAO,CACf,GAAIp2F,KAAKs3B,SAAU,CACjB,MAAMg+D,EAAO,IAAIt1F,KAAKm0F,cAEtB,OADAmB,EAAK/9D,SACE+9D,CACT,CAEAt1F,KAAKo2F,MAAQ,IAAIp2F,KAAKm0F,aACxB,CAEA,OAAOn0F,KAAKo2F,KACd,CAEA,QAAId,CAAKxwF,GACHA,aAAiB9E,KAAKm0F,cACxBn0F,KAAKo2F,MAAQtxF,EAEb9E,KAAKs1F,KAAK/oF,IAAIzH,GAAS,CAAC,EAE5B,CAQA,cAAIw+B,GACF,IAAKtjC,KAAKq2F,YAAa,CACrB,GAAIr2F,KAAKs3B,SAAU,CACjB,MAAMg+D,EAAO,IAAIt1F,KAAKm0F,cAEtB,OADAmB,EAAK/9D,SACE+9D,CACT,CAEAt1F,KAAKq2F,YAAc,IAAIr2F,KAAKm0F,aAC9B,CAEA,OAAOn0F,KAAKq2F,WACd,CAEA,cAAI/yD,CAAWx+B,GACTA,aAAiB9E,KAAKm0F,cACxBn0F,KAAKq2F,YAAcvxF,EAEnB9E,KAAKsjC,WAAW/2B,IAAIzH,GAAS,CAAC,EAElC,CAMA,MAAIksB,GACF,OAAOhxB,KAAKg3F,gBAAgB,KAAM,GACpC,CAEA,MAAIhmE,CAAGqF,GACLr2B,KAAKk3F,gBAAgB,KAAM7gE,EAC7B,CAKA,WAAI/f,GACF,OAAOtW,KAAKg3F,gBAAgB,UAAW,GACzC,CAEA,WAAI1gF,CAAQ+f,GACVr2B,KAAKk3F,gBAAgB,UAAW7gE,EAClC,CAMA,SAAIghE,GACF,OAAOr3F,KAAKg3F,gBAAgB,QAAS,GACvC,CAEA,SAAIK,CAAMhhE,GACRr2B,KAAKk3F,gBAAgB,QAAS7gE,EAChC,CAMA,eAAIihE,GACF,OAAOt3F,KAAKg3F,gBAAgB,cAAe,GAC7C,CAEA,eAAIM,CAAYjhE,GACdr2B,KAAKk3F,gBAAgB,cAAe7gE,EACtC,CAKA,SAAIkhE,GACF,OAAOv3F,KAAKg3F,gBAAgB,QAAS,GACvC,CAEA,SAAIO,CAAMlhE,GACRr2B,KAAKk3F,gBAAgB,QAAS7gE,EAChC,CAOA,YAAIiB,GACF,OAAOhzB,OAAOgzB,SAASt3B,KACzB,CAMA,WAAI82F,GACF,IAAI,OAAEz7E,GAAWrb,KACjB,MAAM82F,EAAU,IAAInE,EAEpB,KAAOt3E,GACLy7E,EAAQh0F,KAAKuY,GAGbA,EAASA,EAAOA,OAGlB,OAAOy7E,CACT,CAOA,YAAIzjD,GACF,GAAIlwC,MAAMuD,QAAQ1G,KAAKktB,SACrB,OAAO,IAAIylE,EAAW3yF,KAAKktB,SAG7B,GAAIltB,KAAKktB,mBAAmB+lE,EAAc,CACxC,MAAM5/C,EAAW,IAAIs/C,EAAW,CAAC3yF,KAAKktB,QAAQzW,MAM9C,OAJIzW,KAAKktB,QAAQpoB,OACfuuC,EAASvwC,KAAK9C,KAAKktB,QAAQpoB,OAGtBuuC,CACT,CAEA,OAAIrzC,KAAKktB,mBAAmBgP,QACnB,IAAIy2D,EAAW,CAAC3yF,KAAKktB,UAGvB,IAAIylE,CACb,CAOA,qBAAI6E,GACF,MAAMnkD,EAAW,IAAIs/C,EAUrB,OARA3yF,KAAKqzC,SAASnnB,SAASmK,IACrBgd,EAASvwC,KAAKuzB,GAEdA,EAAQmhE,kBAAkBtrE,SAASunB,IACjCJ,EAASvwC,KAAK2wC,EAAM,GACpB,IAGGJ,CACT,EAGFxzC,EAAOD,QAAUs8B,wBCpdjB,MAAM+2D,EAAe,EAAQ,OACvB/2D,EAAU,EAAQ,MAUxBr8B,EAAOD,QAAU,MAAMw0F,sBAAsBl4D,EAC3C,WAAA9oB,CAAYqD,EAAK3R,EAAOwwF,EAAMhyD,GAC5BjwB,MAAM,IAAI4/E,EAAgBqC,EAAMhyD,GAEhCtjC,KAAKq2B,QAAU,SACfr2B,KAAKyW,IAAMA,EACXzW,KAAK8E,MAAQA,CACf,CAKA,OAAI2R,GACF,OAAOzW,KAAKktB,QAAQzW,GACtB,CAEA,OAAIA,CAAIA,GACNzW,KAAKktB,QAAQzW,IAAMzW,KAAKgzF,QAAQv8E,EAClC,CAKA,SAAI3R,GACF,OAAO9E,KAAKktB,QAAQpoB,KACtB,CAEA,SAAIA,CAAMA,GACR9E,KAAKktB,QAAQpoB,MAAQ9E,KAAKgzF,QAAQluF,EACpC,oBCxCF,MAAMo3B,EAAU,EAAQ,MAmBxBr8B,EAAOD,QAfP,MAAMk0F,oBAAoB53D,EACxB,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,GAAW,KAAMooE,EAAMhyD,GAC7BtjC,KAAKq2B,QAAU,MACjB,CAEA,SAAAm/D,GACE,MAAO,MACT,CAEA,GAAAjpF,GACE,OAAO,IAAIlJ,MAAM,+BACnB,oBChBF,MAAM64B,EAAU,EAAQ,MASxBr8B,EAAOD,QAAU,MAAMo0F,sBAAsB93D,EAC3C,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,EAASooE,EAAMhyD,GACrBtjC,KAAKq2B,QAAU,QACjB,CAEA,SAAAm/D,GACE,MAAO,QACT,oBCjBF,MAAMlE,EAAS,EAAQ,OACjBl1E,EAAW,EAAQ,OAEnB83E,EAAe,EAAQ,OACvBE,EAAgB,EAAQ,MACxBgB,EAAc,EAAQ,OAmM5Bv1F,EAAOD,QA1LP,MAAMu0F,sBAAsBD,EAC1B,WAAA9gF,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,GAAW,GAAIooE,EAAMhyD,GAC3BtjC,KAAKq2B,QAAU,QACjB,CAEA,SAAAm/D,GACE,MAAO,QACT,CAEA,OAAA3C,GACE,OAAO7yF,KAAKktB,QAAQiK,QAAO,CAAC8qB,EAAStlC,KACnCslC,EAAQtlC,EAAGlG,IAAIo8E,WAAal2E,EAAG7X,MAAQ6X,EAAG7X,MAAM+tF,eAAYtsF,EACrD07C,IACN,CAAC,EACN,CAMA,GAAAt2C,CAAI6H,GACF,MAAM6hF,EAASr1F,KAAKy3F,UAAUjkF,GAE9B,GAAI6hF,EACF,OAAOA,EAAOvwF,KAIlB,CAMA,SAAA2yF,CAAUjkF,GACR,QAAajN,IAATiN,EAEJ,OAAOxT,KAAKktB,QAAQ61B,MAAK1sB,GAAWA,EAAQ5f,IAAIo8E,YAAcr/E,GAChE,CAKA,MAAAouB,CAAOpuB,GACL,IAAIkoB,EAAU,KAWd,OATA17B,KAAKktB,QAAUltB,KAAKktB,QAAQsJ,QAAQpB,GAC9BA,EAAK3e,IAAIo8E,YAAcr/E,IACzBkoB,EAAUtG,GACH,KAMJsG,CACT,CAMA,MAAAg8D,CAAOlkF,GACL,MAAM6hF,EAASr1F,KAAKy3F,UAAUjkF,GAE9B,GAAI6hF,EACF,OAAOA,EAAO5+E,GAIlB,CAMA,GAAAlK,CAAIorF,EAAa7yF,GACf,GAAIsX,EAASu7E,GAKX,OAJArzF,OAAOyZ,KAAK45E,GAAazrE,SAAS0rE,IAChC53F,KAAKuM,IAAIqrF,EAAWD,EAAYC,GAAW,IAGtC53F,KAIT,MAAMyW,EAAMkhF,EACNtC,EAASr1F,KAAKy3F,UAAUhhF,GAQ9B,OANI4+E,EACFA,EAAOvwF,MAAQA,EAEf9E,KAAKktB,QAAQpqB,KAAK,IAAIsxF,EAAc39E,EAAK3R,IAGpC9E,IACT,CAIA,IAAA+d,GACE,OAAO/d,KAAKktB,QAAQkJ,KAAIhB,GAAQA,EAAK3e,IAAIo8E,WAC3C,CAIA,MAAA9nE,GACE,OAAO/qB,KAAKktB,QAAQkJ,KAAIhB,GAAQA,EAAKtwB,MAAM+tF,WAC7C,CAKA,MAAAoE,CAAOnyF,GACL,OAAO9E,KAAKktB,QAAQm5C,MAAKgvB,GAAUA,EAAO5+E,IAAI7J,OAAO9H,IACvD,CAKA,KAAA8xF,GACE,OAAO52F,KAAKktB,QAAQkJ,KAAIhB,GAAQ,CAACA,EAAK3e,IAAIo8E,UAAWz9D,EAAKtwB,MAAM+tF,YAClE,CAMA,GAAAz8D,CAAIysD,EAAUnqD,GACZ,OAAO14B,KAAKktB,QAAQkJ,KAAIhB,GAAQytD,EAASptE,KAAKijB,EAAdmqD,CAAuBztD,EAAKtwB,MAAOswB,EAAK3e,IAAK2e,IAC/E,CAQA,UAAA09D,CAAWjQ,EAAUnqD,GACnB,MAAMupB,EAAU,GAUhB,OARAjiD,KAAKksB,SAAQ,CAACpnB,EAAO2R,EAAK4+E,KACxB,MAAM93E,EAASslE,EAASptE,KAAKijB,EAAdmqD,CAAuB/9E,EAAO2R,EAAK4+E,GAE9C93E,GACF0kC,EAAQn/C,KAAKya,EACf,IAGK0kC,CACT,CAQA,MAAAzrB,CAAOqsD,EAAUnqD,GACf,OAAO,IAAI08D,EAAYp1F,KAAKktB,SAASsJ,OAAOqsD,EAAUnqD,EACxD,CAUA,MAAAyP,CAAO06C,EAAUnqD,GACf,OAAO14B,KAAKw2B,OAAO86D,EAAOzO,GAAWnqD,EACvC,CAQA,OAAAxM,CAAQ22D,EAAUnqD,GAChB,OAAO14B,KAAKktB,QAAQhB,SAAQkJ,GAAQytD,EAASptE,KAAKijB,EAAdmqD,CAAuBztD,EAAKtwB,MAAOswB,EAAK3e,IAAK2e,IACnF,oBCrMF,MAAM8G,EAAU,EAAQ,MASxBr8B,EAAOD,QAAU,MAAMm0F,sBAAsB73D,EAC3C,WAAA9oB,CAAY8Z,EAASooE,EAAMhyD,GACzBjwB,MAAM6Z,EAASooE,EAAMhyD,GACrBtjC,KAAKq2B,QAAU,QACjB,CAEA,SAAAm/D,GACE,MAAO,QACT,CAMA,UAAI/yF,GACF,OAAOzC,KAAKktB,QAAQzqB,MACtB,mBCzBF,MAAMywF,EAAiB,EAAQ,OAE/BrzF,EAAOD,QAAU,MAAMi4F,yBAAyB3E,EAC9C,SAAAgC,CAAU7+D,GACR,KAAMA,aAAmBr2B,KAAK4kB,UAAUguE,SAAS12D,SAC/C,MAAM,IAAIv3B,UAAU,mBAAmB0xB,kCAGzC,IAAI1R,EACA0R,EAAQggE,aAAehgE,EAAQiN,WAAW33B,IAAI,cAChDgZ,EAAW0R,EAAQiN,WAAW33B,IAAI,aAGpC,MAAMmsF,EAAU,CACdzhE,QAASA,EAAQA,SAGfA,EAAQ+/D,OAAS//D,EAAQ+/D,MAAM3zF,OAAS,IAC1Cq1F,EAAQxC,KAAOt1F,KAAK+3F,gBAAgB1hE,EAAQi/D,OAG9C,MAAM0C,EAA8B,SAApB3hE,EAAQA,UAA6E,IAAvDA,EAAQiN,WAAWvlB,OAAO5c,QAAQ,gBAEhF,GAAI62F,EAAQ,CACV,MAAM10D,EAAatjC,KAAKi4F,wBAAwB5hE,GAE5CiN,IACFw0D,EAAQx0D,WAAaA,EAEzB,MAAO,GAAIjN,EAAQggE,aAAehgE,EAAQggE,YAAY5zF,OAAS,EAAG,CAChE,IAAI,WAAE6gC,GAAejN,EAGjBiN,EAAW33B,IAAI,cACjB23B,EAAaA,EAAWnO,QACxBmO,EAAW/2B,IAAI,OAAQ+2B,EAAW33B,IAAI,aACtC23B,EAAW1B,OAAO,aAGI,WAApBvL,EAAQA,SAAwB1R,IAClC2e,EAAaA,EAAWnO,QACxBmO,EAAW1B,OAAO,aAGhB0B,EAAW7gC,OAAS,IACtBq1F,EAAQx0D,WAAatjC,KAAK+3F,gBAAgBz0D,GAE9C,CAEA,GAAI00D,EACFF,EAAQ5qE,QAAUltB,KAAKk4F,qBAAqB7hE,EAASyhE,QAChD,GAAI93F,KAAK,GAAGq2B,EAAQA,2BACzByhE,EAAQ5qE,QAAUltB,KAAK,GAAGq2B,EAAQA,2BAA2BA,EAASyhE,QACjE,QAAwBvxF,IAApB8vB,EAAQnJ,QAAuB,CACxC,IAAIA,EAEAvI,GAAY0R,EAAQnJ,QAAQzW,KAC9ByW,EAAUmJ,EAAQnJ,QAAQiI,QAC1BjI,EAAQzW,IAAI6sB,WAAW/2B,IAAI,WAAYoY,GACvCuI,EAAUltB,KAAKm4F,iBAAiBjrE,IAEhCA,EAAUltB,KAAKm4F,iBAAiB9hE,EAAQnJ,SAGtCltB,KAAKo4F,uBAAuB/hE,EAASnJ,KACvC4qE,EAAQ5qE,QAAUA,EAEtB,MAAWltB,KAAKo4F,uBAAuB/hE,EAASA,EAAQnJ,UAAYmJ,aAAmBr2B,KAAK4kB,UAAUguE,SAASzvF,QAC7G20F,EAAQ5qE,QAAU,IAGpB,OAAO4qE,CACT,CAEA,sBAAAM,CAAuB/hE,EAASnJ,GAC9B,MAAwB,gBAApBmJ,EAAQA,SAAiD,gBAApBA,EAAQA,SACtB,iBAApBA,EAAQA,SAAkD,aAApBA,EAAQA,SAC1B,SAApBA,EAAQA,cAIC9vB,IAAZ2mB,KAIA/pB,MAAMuD,QAAQwmB,IAA+B,IAAnBA,EAAQzqB,OAKxC,CAEA,mBAAA41F,CAAoBhiE,EAASyhE,GAG3B,cAFOA,EAAQx0D,WAER,CACLksC,KAAMn5C,EAAQw8D,UACdn7E,KAAM2e,EAAQ3e,KAAKm7E,UAEvB,CAEA,yBAAAyF,CAA0BjiE,GACxB,OAAOA,EAAQw8D,SACjB,CAEA,6BAAA0F,CAA8BliE,GAC5B,MAAO,CAACr2B,KAAKm4F,iBAAiB9hE,EAAQnJ,SACxC,CAEA,uBAAA+qE,CAAwB5hE,GACtB,MAAMiN,EAAajN,EAAQiN,WAAWnO,QAGhCqjE,EAAel1D,EAAW1B,OAAO,iBAAmB,IAAI5hC,KAAK4kB,UAAUguE,SAASzvF,MAAM,IAGtFstF,EAAentD,EAAW33B,IAAI,WACpC,IAAI8sF,EAAUn1D,EAAW33B,IAAI,YAAc,IAAI3L,KAAK4kB,UAAUguE,SAASzvF,MAAM,IAoC7E,GAlCIstF,GAAgBA,EAAavjE,UAC3BujE,EAAavjE,QAAQoW,YACvBmtD,EAAavjE,QAAQoW,WAAW1B,OAAO,kBAGzC0B,EAAW/2B,IAAI,UAAW,IAAIvM,KAAK4kB,UAAUguE,SAASzvF,MAAM,CAACstF,EAAavjE,YAI5EurE,EAAQvsE,SAASwsE,IACXA,EAAOxrE,SAAWwrE,EAAOxrE,QAAQmJ,SACnCqiE,EAAOxrE,QAAQoW,WAAW1B,OAAO,iBACnC,IAIEvL,EAAQnJ,SAAmC,IAAxBsrE,EAAa/1F,QAGlCg2F,EAAQhvD,QAAQpT,EAAQnJ,SAG1BurE,EAAUA,EAAQriE,KAAKsiE,GACjBA,aAAkB14F,KAAK4kB,UAAUguE,SAASzvF,MACrC,CAACu1F,GAGH,IAAI14F,KAAK4kB,UAAUguE,SAASzvF,MAAM,CAACu1F,EAAOxrE,YAG/CurE,EAAQh2F,QACV6gC,EAAW/2B,IAAI,UAAWksF,GAGxBn1D,EAAW7gC,OAAS,EACtB,OAAOzC,KAAK+3F,gBAAgBz0D,EAIhC,CAEA,oBAAA40D,CAAqB7hE,GAInB,GAAIA,EAAQggE,YAAa,CACvB,MAAMmC,EAAeniE,EAAQiN,WAAW33B,IAAI,gBAE5C,GAAI6sF,GAAgBA,EAAa/1F,OAAS,EACxC,OAAO+1F,EAAatrE,QAAQkJ,KAAKuiE,IAC/B,MAAMrtF,EAAIqtF,EAAYxjE,QAEtB,OADA7pB,EAAEg4B,WAAW1B,OAAO,kBACb5hC,KAAKk1F,UAAU5pF,EAAE,GAG9B,CAEA,GAAI+qB,EAAQnJ,QAAS,CACnB,MAAMpoB,EAAQuxB,EAAQnJ,QAAQiI,QAE9B,OADArwB,EAAMw+B,WAAW1B,OAAO,kBACjB,CAAC5hC,KAAKk1F,UAAUpwF,GACzB,CAEA,MAAO,EACT,CAEA,WAAAkwF,CAAYlwF,GACV,GAAqB,iBAAVA,EACT,OAAO,IAAI9E,KAAK4kB,UAAUguE,SAAS7xF,OAAO+D,GAG5C,GAAqB,iBAAVA,EACT,OAAO,IAAI9E,KAAK4kB,UAAUguE,SAAS3pF,OAAOnE,GAG5C,GAAqB,kBAAVA,EACT,OAAO,IAAI9E,KAAK4kB,UAAUguE,SAASpxD,QAAQ18B,GAG7C,GAAc,OAAVA,EACF,OAAO,IAAI9E,KAAK4kB,UAAUguE,SAASgG,KAGrC,GAAIz1F,MAAMuD,QAAQ5B,GAChB,OAAO,IAAI9E,KAAK4kB,UAAUguE,SAASzvF,MAAM2B,EAAMsxB,IAAIp2B,KAAKg1F,YAAah1F,OAGvE,MAAMw0F,EAAex0F,KAAK4kB,UAAUiwE,gBAAgB/vF,EAAMuxB,SACpDA,EAAU,IAAIm+D,EAEhBn+D,EAAQA,UAAYvxB,EAAMuxB,UAC5BA,EAAQA,QAAUvxB,EAAMuxB,SAGtBvxB,EAAMwwF,MACRt1F,KAAK64F,kBAAkB/zF,EAAMwwF,KAAMj/D,EAAQi/D,MAGzCxwF,EAAMw+B,YACRtjC,KAAK64F,kBAAkB/zF,EAAMw+B,WAAYjN,EAAQiN,YAGnD,MAAMpW,EAAUltB,KAAK84F,mBAAmBh0F,EAAMooB,SAK9C,QAJgB3mB,IAAZ2mB,GAA6C,OAApBmJ,EAAQnJ,UACnCmJ,EAAQnJ,QAAUA,GAGI,SAApBmJ,EAAQA,QAAoB,CAE1BA,EAAQnJ,SACVmJ,EAAQiN,WAAW/2B,IAAI,eAAgB8pB,EAAQnJ,SAIjD,IAAIurE,EAAUpiE,EAAQiN,WAAW33B,IAAI,WAGrC,GAFA0qB,EAAQiN,WAAW1B,OAAO,WAEtB62D,EAAS,CAGX,MAAMM,EAAkBN,EAExBA,EAAU,IAAIz4F,KAAK4kB,UAAUguE,SAASzvF,MACtC41F,EAAgB7sE,SAAS8sE,IACvBA,EAAe9sE,SAASwsE,IACtB,MAAMO,EAAc,IAAIzE,EAAakE,GACrCO,EAAY5iE,QAAUA,EAAQA,QAC9BoiE,EAAQ31F,KAAKm2F,EAAY,GACzB,IAGJ,MAAMP,EAASD,EAAQntD,QAGrBjV,EAAQnJ,QADNwrE,EACgBA,EAAOxrE,aAEP3mB,EAGpB8vB,EAAQiN,WAAW/2B,IAAI,UAAWksF,EACpC,MACEpiE,EAAQnJ,aAAU3mB,EAIpB,IAAIkqF,EAAep6D,EAAQiN,WAAW33B,IAAI,WAC1C,GAAI8kF,GAAgBA,EAAahuF,OAAS,EAAG,CAC3CguF,EAAeA,EAAa9kF,IAAI,GAChC,MAAMutF,EAAiB,IAAI1E,EAAa/D,GACxCyI,EAAe7iE,QAAUA,EAAQA,QACjCA,EAAQiN,WAAW/2B,IAAI,UAAW2sF,EACpC,CACF,MAAO,GAAwB,kBAApB7iE,EAAQA,SAA+BlzB,MAAMuD,QAAQ2vB,EAAQnJ,UACrEmJ,EAAQnJ,SAAWmJ,EAAQnJ,aACvB,GAAwB,aAApBmJ,EAAQA,QAAwB,CAEzC,MAAMzP,EAAWyP,EAAQiN,WAAW33B,IAAI,QAEpCib,IACFyP,EAAQiN,WAAW/2B,IAAI,WAAYqa,GACnCyP,EAAQiN,WAAW1B,OAAO,QAE9B,KAA+B,WAApBvL,EAAQA,SAAwBA,EAAQ5f,KAAO4f,EAAQ5f,IAAI4/E,aAAehgE,EAAQ5f,IAAI4/E,YAAYhQ,SAAS,cACpHhwD,EAAQiN,WAAW/2B,IAAI,WAAY8pB,EAAQ5f,IAAI6sB,WAAW33B,IAAI,aAC9D0qB,EAAQ5f,IAAI6sB,WAAW1B,OAAO,aAGhC,OAAOvL,CACT,CAIA,gBAAA8hE,CAAiBjrE,GACf,GAAIA,aAAmBltB,KAAK4kB,UAAUguE,SAAS12D,QAC7C,OAAOl8B,KAAKk1F,UAAUhoE,GAGxB,GAAIA,aAAmBltB,KAAK4kB,UAAUquE,aAAc,CAClD,MAAMv7C,EAAO,CACXjhC,IAAKzW,KAAKk1F,UAAUhoE,EAAQzW,MAO9B,OAJIyW,EAAQpoB,QACV4yC,EAAK5yC,MAAQ9E,KAAKk1F,UAAUhoE,EAAQpoB,QAG/B4yC,CACT,CAEA,OAAIxqB,GAAWA,EAAQkJ,IACdlJ,EAAQkJ,IAAIp2B,KAAKk1F,UAAWl1F,MAG9BktB,CACT,CAEA,kBAAA4rE,CAAmB5rE,GACjB,GAAIA,EAAS,CACX,GAAIA,EAAQmJ,QACV,OAAOr2B,KAAKg1F,YAAY9nE,GAG1B,GAAIA,EAAQzW,IAAK,CACf,MAAMihC,EAAO,IAAI13C,KAAK4kB,UAAUquE,aAAajzF,KAAKg1F,YAAY9nE,EAAQzW,MAMtE,OAJIyW,EAAQpoB,QACV4yC,EAAK5yC,MAAQ9E,KAAKg1F,YAAY9nE,EAAQpoB,QAGjC4yC,CACT,CAEA,GAAIxqB,EAAQkJ,IACV,OAAOlJ,EAAQkJ,IAAIp2B,KAAKg1F,YAAah1F,KAEzC,CAEA,OAAOktB,CACT,CAEA,aAAAisE,CAAc9iE,GACZ,SAAKA,EAAQggE,aAAehgE,EAAQiN,WAAWvlB,OAAOtb,QAAY4zB,EAAQ+/D,OAAS//D,EAAQi/D,KAAKv3E,OAAOtb,SAI/E,SAApB4zB,EAAQA,UAKRA,EAAQA,UAAYA,EAAQm/D,aAAmC,WAApBn/D,EAAQA,QAKzD,CAEA,mBAAA+iE,CAAoB3iF,EAAK2e,GACvB,OAAIp1B,KAAKm5F,cAAc/jE,GACdp1B,KAAKk1F,UAAU9/D,GAGH,SAAjBA,EAAKiB,QACAr2B,KAAKq5F,cAAcjkE,GAGP,UAAjBA,EAAKiB,QACAjB,EAAKgB,KAAKkjE,GACXt5F,KAAKm5F,cAAcG,IAAoB,YAAR7iF,EAC1BzW,KAAKk1F,UAAUoE,GAGA,UAApBA,EAAQjjE,SAA2C,WAApBijE,EAAQjjE,SAA4C,SAApBijE,EAAQjjE,QAElEijE,EAAQjmD,SAASjd,KAAImjE,GAAcv5F,KAAKk1F,UAAUqE,KAGpDD,EAAQzG,YAIE,WAAjBz9D,EAAKiB,SACCjB,EAAKlI,SAAW,IAAIkJ,IAAIp2B,KAAKk1F,UAAWl1F,MAG3Co1B,EAAKy9D,SACd,CAEA,aAAAwG,CAAchjE,GACZ,OAAOA,EAAQgd,SAASjd,KAAIhB,GAAQp1B,KAAKk1F,UAAU9/D,IACrD,CAEA,eAAA2iE,CAAgB3xF,GACd,MAAMmX,EAAS,CAAC,EAShB,OAPAnX,EAAI8lB,SAAQ,CAACpnB,EAAO2R,KAClB,GAAI3R,EAAO,CACT,MAAM00F,EAAW/iF,EAAIo8E,UACrBt1E,EAAOi8E,GAAYx5F,KAAKo5F,oBAAoBI,EAAU10F,EACxD,KAGKyY,CACT,CAEA,iBAAAs7E,CAAkBh0F,EAAMu7D,GACtB97D,OAAOyZ,KAAKlZ,GAAMqnB,SAASzV,IACzB2pD,EAAG7zD,IAAIkK,EAAKzW,KAAKg1F,YAAYnwF,EAAK4R,IAAM,GAE5C,cChQF5W,EAAOD,QAjJP,MAAMszF,eACJ,WAAA9/E,CAAYwR,GACV5kB,KAAK4kB,UAAYA,GAAa,IAAI5kB,KAAKmzF,SACzC,CAMA,SAAA+B,CAAU7+D,GACR,KAAMA,aAAmBr2B,KAAK4kB,UAAUguE,SAAS12D,SAC/C,MAAM,IAAIv3B,UAAU,mBAAmB0xB,kCAGzC,MAAMyhE,EAAU,CACdzhE,QAASA,EAAQA,SAGfA,EAAQ+/D,OAAS//D,EAAQ+/D,MAAM3zF,OAAS,IAC1Cq1F,EAAQxC,KAAOt1F,KAAK+3F,gBAAgB1hE,EAAQi/D,OAG1Cj/D,EAAQggE,aAAehgE,EAAQggE,YAAY5zF,OAAS,IACtDq1F,EAAQx0D,WAAatjC,KAAK+3F,gBAAgB1hE,EAAQiN,aAGpD,MAAMpW,EAAUltB,KAAKm4F,iBAAiB9hE,EAAQnJ,SAM9C,YAJgB3mB,IAAZ2mB,IACF4qE,EAAQ5qE,QAAUA,GAGb4qE,CACT,CAMA,WAAA9C,CAAYlwF,GACV,IAAKA,EAAMuxB,QACT,MAAM,IAAIhzB,MAAM,2DAGlB,MACMgzB,EAAU,IADKr2B,KAAK4kB,UAAUiwE,gBAAgB/vF,EAAMuxB,UAGtDA,EAAQA,UAAYvxB,EAAMuxB,UAC5BA,EAAQA,QAAUvxB,EAAMuxB,SAGtBvxB,EAAMwwF,MACRt1F,KAAK64F,kBAAkB/zF,EAAMwwF,KAAMj/D,EAAQi/D,MAGzCxwF,EAAMw+B,YACRtjC,KAAK64F,kBAAkB/zF,EAAMw+B,WAAYjN,EAAQiN,YAGnD,MAAMpW,EAAUltB,KAAK84F,mBAAmBh0F,EAAMooB,SAK9C,YAJgB3mB,IAAZ2mB,GAA6C,OAApBmJ,EAAQnJ,UACnCmJ,EAAQnJ,QAAUA,GAGbmJ,CACT,CAIA,gBAAA8hE,CAAiBjrE,GACf,GAAIA,aAAmBltB,KAAK4kB,UAAUguE,SAAS12D,QAC7C,OAAOl8B,KAAKk1F,UAAUhoE,GAGxB,GAAIA,aAAmBltB,KAAK4kB,UAAUquE,aAAc,CAClD,MAAMv7C,EAAO,CACXjhC,IAAKzW,KAAKk1F,UAAUhoE,EAAQzW,MAO9B,OAJIyW,EAAQpoB,QACV4yC,EAAK5yC,MAAQ9E,KAAKk1F,UAAUhoE,EAAQpoB,QAG/B4yC,CACT,CAEA,GAAIxqB,GAAWA,EAAQkJ,IAAK,CAC1B,GAAuB,IAAnBlJ,EAAQzqB,OACV,OAGF,OAAOyqB,EAAQkJ,IAAIp2B,KAAKk1F,UAAWl1F,KACrC,CAEA,OAAOktB,CACT,CAEA,kBAAA4rE,CAAmB5rE,GACjB,GAAIA,EAAS,CACX,GAAIA,EAAQmJ,QACV,OAAOr2B,KAAKg1F,YAAY9nE,GAG1B,GAAIA,EAAQzW,IAAK,CACf,MAAMihC,EAAO,IAAI13C,KAAK4kB,UAAUquE,aAAajzF,KAAKg1F,YAAY9nE,EAAQzW,MAMtE,OAJIyW,EAAQpoB,QACV4yC,EAAK5yC,MAAQ9E,KAAKg1F,YAAY9nE,EAAQpoB,QAGjC4yC,CACT,CAEA,GAAIxqB,EAAQkJ,IACV,OAAOlJ,EAAQkJ,IAAIp2B,KAAKg1F,YAAah1F,KAEzC,CAEA,OAAOktB,CACT,CAEA,eAAA6qE,CAAgB3xF,GACd,MAAMmX,EAAS,CAAC,EAQhB,GANAnX,EAAI8lB,SAAQ,CAACpnB,EAAO2R,KACd3R,IACFyY,EAAO9G,EAAIo8E,WAAa7yF,KAAKk1F,UAAUpwF,GACzC,IAGiC,IAA/BR,OAAOyZ,KAAKR,GAAQ9a,OAIxB,OAAO8a,CACT,CAEA,iBAAAs7E,CAAkBh0F,EAAMu7D,GACtB97D,OAAOyZ,KAAKlZ,GAAMqnB,SAASzV,IACzB2pD,EAAG7zD,IAAIkK,EAAKzW,KAAKg1F,YAAYnwF,EAAK4R,IAAM,GAE5C,2BC5IF,IAAI6V,EAAwBhoB,OAAOgoB,sBAC/BlW,EAAiB9R,OAAOE,UAAU4R,eAClCqjF,EAAmBn1F,OAAOE,UAAUshB,qBAsDxCjmB,EAAOD,QA5CP,SAAS85F,kBACR,IACC,IAAKp1F,OAAOwX,OACX,OAAO,EAMR,IAAI69E,EAAQ,IAAI54F,OAAO,OAEvB,GADA44F,EAAM,GAAK,KACkC,MAAzCr1F,OAAOsqB,oBAAoB+qE,GAAO,GACrC,OAAO,EAKR,IADA,IAAIC,EAAQ,CAAC,EACJ73F,EAAI,EAAGA,EAAI,GAAIA,IACvB63F,EAAM,IAAM74F,OAAOC,aAAae,IAAMA,EAKvC,GAAwB,eAHXuC,OAAOsqB,oBAAoBgrE,GAAOxjE,KAAI,SAAUruB,GAC5D,OAAO6xF,EAAM7xF,EACd,IACW9E,KAAK,IACf,OAAO,EAIR,IAAI42F,EAAQ,CAAC,EAIb,MAHA,uBAAuBllF,MAAM,IAAIuX,SAAQ,SAAU4tE,GAClDD,EAAMC,GAAUA,CACjB,IAEE,yBADEx1F,OAAOyZ,KAAKzZ,OAAOwX,OAAO,CAAC,EAAG+9E,IAAQ52F,KAAK,GAMhD,CAAE,MAAO4X,GAER,OAAO,CACR,CACD,CAEiB6+E,GAAoBp1F,OAAOwX,OAAS,SAAU/O,EAAQ8Q,GAKtE,IAJA,IAAIhZ,EAEAk1F,EADA35B,EAtDL,SAASx6C,SAAS1d,GACjB,GAAIA,QACH,MAAM,IAAIvD,UAAU,yDAGrB,OAAOL,OAAO4D,EACf,CAgDU0d,CAAS7Y,GAGTmsC,EAAI,EAAGA,EAAIhyC,UAAUzE,OAAQy2C,IAAK,CAG1C,IAAK,IAAIziC,KAFT5R,EAAOP,OAAO4C,UAAUgyC,IAGnB9iC,EAAe/N,KAAKxD,EAAM4R,KAC7B2pD,EAAG3pD,GAAO5R,EAAK4R,IAIjB,GAAI6V,EAAuB,CAC1BytE,EAAUztE,EAAsBznB,GAChC,IAAK,IAAI9C,EAAI,EAAGA,EAAIg4F,EAAQt3F,OAAQV,IAC/B03F,EAAiBpxF,KAAKxD,EAAMk1F,EAAQh4F,MACvCq+D,EAAG25B,EAAQh4F,IAAM8C,EAAKk1F,EAAQh4F,IAGjC,CACD,CAEA,OAAOq+D,CACR,mBCzFA,IAAI45B,EAAwB,mBAARxqD,KAAsBA,IAAIhrC,UAC1Cy1F,EAAoB31F,OAAO2Z,0BAA4B+7E,EAAS11F,OAAO2Z,yBAAyBuxB,IAAIhrC,UAAW,QAAU,KACzH01F,EAAUF,GAAUC,GAAsD,mBAA1BA,EAAkBtuF,IAAqBsuF,EAAkBtuF,IAAM,KAC/GwuF,EAAaH,GAAUxqD,IAAIhrC,UAAU0nB,QACrCkuE,EAAwB,mBAAR1qD,KAAsBA,IAAIlrC,UAC1C61F,EAAoB/1F,OAAO2Z,0BAA4Bm8E,EAAS91F,OAAO2Z,yBAAyByxB,IAAIlrC,UAAW,QAAU,KACzHw5D,EAAUo8B,GAAUC,GAAsD,mBAA1BA,EAAkB1uF,IAAqB0uF,EAAkB1uF,IAAM,KAC/G2uF,EAAaF,GAAU1qD,IAAIlrC,UAAU0nB,QAErCquE,EADgC,mBAAZ9zE,SAA0BA,QAAQjiB,UAC5BiiB,QAAQjiB,UAAU2hB,IAAM,KAElDq0E,EADgC,mBAAZzqD,SAA0BA,QAAQvrC,UAC5BurC,QAAQvrC,UAAU2hB,IAAM,KAElDs0E,GADgC,mBAAZ3qD,SAA0BA,QAAQtrC,UAC1BsrC,QAAQtrC,UAAUk2F,MAAQ,KACtDC,GAAiBn5D,QAAQh9B,UAAUyB,QACnCqqE,GAAiBhsE,OAAOE,UAAUwC,SAClC4zF,GAAmBj/E,SAASnX,UAAUwC,SACtC6zF,GAAS95F,OAAOyD,UAAU3D,MAC1Bi6F,GAAS/5F,OAAOyD,UAAUa,MAC1BkrC,GAAWxvC,OAAOyD,UAAU5D,QAC5Bm6F,GAAeh6F,OAAOyD,UAAUyoC,YAChC+tD,GAAej6F,OAAOyD,UAAU8C,YAChC2zF,GAAQlmE,OAAOvwB,UAAUlD,KACzB8uC,GAAUjtC,MAAMqB,UAAU4H,OAC1B8uF,GAAQ/3F,MAAMqB,UAAUvB,KACxBk4F,GAAYh4F,MAAMqB,UAAUa,MAC5B+1F,GAASjxF,KAAK6J,MACdqnF,GAAkC,mBAAXptF,OAAwBA,OAAOzJ,UAAUyB,QAAU,KAC1Eq1F,GAAOh3F,OAAOgoB,sBACdivE,GAAgC,mBAAX13F,QAAoD,iBAApBA,OAAOukB,SAAwBvkB,OAAOW,UAAUwC,SAAW,KAChHw0F,GAAsC,mBAAX33F,QAAoD,iBAApBA,OAAOukB,SAElEyxD,GAAgC,mBAAXh2E,QAAyBA,OAAOg2E,qBAAuBh2E,OAAOg2E,cAAgB2hB,IAA+B,UAChI33F,OAAOg2E,YACP,KACF4hB,GAAen3F,OAAOE,UAAUshB,qBAEhC41E,IAA0B,mBAAZl4E,QAAyBA,QAAQpF,eAAiB9Z,OAAO8Z,kBACvE,GAAGkR,YAAcnsB,MAAMqB,UACjB,SAAUqY,GACR,OAAOA,EAAEyS,SACb,EACE,MAGV,SAASqsE,oBAAoBn4F,EAAK7C,GAC9B,GACI6C,IAAQgR,KACLhR,KAASgR,KACThR,GAAQA,GACPA,GAAOA,GAAO,KAAQA,EAAM,KAC7By3F,GAAM5yF,KAAK,IAAK1H,GAEnB,OAAOA,EAEX,IAAIi7F,EAAW,mCACf,GAAmB,iBAARp4F,EAAkB,CACzB,IAAIq4F,EAAMr4F,EAAM,GAAK43F,IAAQ53F,GAAO43F,GAAO53F,GAC3C,GAAIq4F,IAAQr4F,EAAK,CACb,IAAIs4F,EAAS/6F,OAAO86F,GAChB/6F,EAAMg6F,GAAOzyF,KAAK1H,EAAKm7F,EAAOr5F,OAAS,GAC3C,OAAO8tC,GAASloC,KAAKyzF,EAAQF,EAAU,OAAS,IAAMrrD,GAASloC,KAAKkoC,GAASloC,KAAKvH,EAAK,cAAe,OAAQ,KAAM,GACxH,CACJ,CACA,OAAOyvC,GAASloC,KAAK1H,EAAKi7F,EAAU,MACxC,CAEA,IAAIG,GAAc,EAAQ,OACtBC,GAAgBD,GAAYE,OAC5BC,GAAgBtrE,SAASorE,IAAiBA,GAAgB,KA4L9D,SAASG,WAAWjjD,EAAGkjD,EAAcnmD,GACjC,IAAIomD,EAAkD,YAArCpmD,EAAKqmD,YAAcF,GAA6B,IAAM,IACvE,OAAOC,EAAYnjD,EAAImjD,CAC3B,CAEA,SAASrrD,MAAMkI,GACX,OAAO3I,GAASloC,KAAKtH,OAAOm4C,GAAI,KAAM,SAC1C,CAEA,SAASxyC,QAAQN,GAAO,QAAsB,mBAAfknC,MAAMlnC,IAA+ByzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CAEtI,SAASm2F,SAASn2F,GAAO,QAAsB,oBAAfknC,MAAMlnC,IAAgCyzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CAOxI,SAASwqB,SAASxqB,GACd,GAAIo1F,GACA,OAAOp1F,GAAsB,iBAARA,GAAoBA,aAAevC,OAE5D,GAAmB,iBAARuC,EACP,OAAO,EAEX,IAAKA,GAAsB,iBAARA,IAAqBm1F,GACpC,OAAO,EAEX,IAEI,OADAA,GAAYlzF,KAAKjC,IACV,CACX,CAAE,MAAOkF,GAAI,CACb,OAAO,CACX,CA3NAzL,EAAOD,QAAU,SAAS48F,SAASp2F,EAAKwQ,EAASuuD,EAAO6f,GACpD,IAAI/uC,EAAOr/B,GAAW,CAAC,EAEvB,GAAIuP,IAAI8vB,EAAM,eAAsC,WAApBA,EAAKqmD,YAA+C,WAApBrmD,EAAKqmD,WACjE,MAAM,IAAI33F,UAAU,oDAExB,GACIwhB,IAAI8vB,EAAM,qBAAuD,iBAAzBA,EAAKwmD,gBACvCxmD,EAAKwmD,gBAAkB,GAAKxmD,EAAKwmD,kBAAoBjoF,IAC5B,OAAzByhC,EAAKwmD,iBAGX,MAAM,IAAI93F,UAAU,0FAExB,IAAI+3F,GAAgBv2E,IAAI8vB,EAAM,kBAAmBA,EAAKymD,cACtD,GAA6B,kBAAlBA,GAAiD,WAAlBA,EACtC,MAAM,IAAI/3F,UAAU,iFAGxB,GACIwhB,IAAI8vB,EAAM,WACS,OAAhBA,EAAK0mD,QACW,OAAhB1mD,EAAK0mD,UACHtzF,SAAS4sC,EAAK0mD,OAAQ,MAAQ1mD,EAAK0mD,QAAU1mD,EAAK0mD,OAAS,GAEhE,MAAM,IAAIh4F,UAAU,4DAExB,GAAIwhB,IAAI8vB,EAAM,qBAAwD,kBAA1BA,EAAK2mD,iBAC7C,MAAM,IAAIj4F,UAAU,qEAExB,IAAIi4F,EAAmB3mD,EAAK2mD,iBAE5B,QAAmB,IAARx2F,EACP,MAAO,YAEX,GAAY,OAARA,EACA,MAAO,OAEX,GAAmB,kBAARA,EACP,OAAOA,EAAM,OAAS,QAG1B,GAAmB,iBAARA,EACP,OAAOy2F,cAAcz2F,EAAK6vC,GAE9B,GAAmB,iBAAR7vC,EAAkB,CACzB,GAAY,IAARA,EACA,OAAOoO,IAAWpO,EAAM,EAAI,IAAM,KAEtC,IAAIzF,GAAMI,OAAOqF,GACjB,OAAOw2F,EAAmBjB,oBAAoBv1F,EAAKzF,IAAOA,EAC9D,CACA,GAAmB,iBAARyF,EAAkB,CACzB,IAAI02F,GAAY/7F,OAAOqF,GAAO,IAC9B,OAAOw2F,EAAmBjB,oBAAoBv1F,EAAK02F,IAAaA,EACpE,CAEA,IAAIC,QAAiC,IAAf9mD,EAAKkvB,MAAwB,EAAIlvB,EAAKkvB,MAE5D,QADqB,IAAVA,IAAyBA,EAAQ,GACxCA,GAAS43B,IAAYA,GAAW,GAAoB,iBAAR32F,EAC5C,OAAOM,QAAQN,GAAO,UAAY,WAGtC,IAAIu2F,GAkUR,SAASK,UAAU/mD,EAAMkvB,GACrB,IAAI83B,EACJ,GAAoB,OAAhBhnD,EAAK0mD,OACLM,EAAa,SACV,MAA2B,iBAAhBhnD,EAAK0mD,QAAuB1mD,EAAK0mD,OAAS,GAGxD,OAAO,KAFPM,EAAa/B,GAAM7yF,KAAKlF,MAAM8yC,EAAK0mD,OAAS,GAAI,IAGpD,CACA,MAAO,CACHhJ,KAAMsJ,EACN7lE,KAAM8jE,GAAM7yF,KAAKlF,MAAMgiE,EAAQ,GAAI83B,GAE3C,CA/UiBD,CAAU/mD,EAAMkvB,GAE7B,QAAoB,IAAT6f,EACPA,EAAO,QACJ,GAAI7jF,QAAQ6jF,EAAM5+E,IAAQ,EAC7B,MAAO,aAGX,SAASyG,QAAQ/H,EAAOD,EAAMq4F,GAK1B,GAJIr4F,IACAmgF,EAAOmW,GAAU9yF,KAAK28E,IACjBliF,KAAK+B,GAEVq4F,EAAU,CACV,IAAIC,EAAU,CACVh4B,MAAOlvB,EAAKkvB,OAKhB,OAHIh/C,IAAI8vB,EAAM,gBACVknD,EAAQb,WAAarmD,EAAKqmD,YAEvBE,SAAS13F,EAAOq4F,EAASh4B,EAAQ,EAAG6f,EAC/C,CACA,OAAOwX,SAAS13F,EAAOmxC,EAAMkvB,EAAQ,EAAG6f,EAC5C,CAEA,GAAmB,mBAAR5+E,IAAuBm2F,SAASn2F,GAAM,CAC7C,IAAIoN,GAwJZ,SAAS4pF,OAAOp/E,GACZ,GAAIA,EAAExK,KAAQ,OAAOwK,EAAExK,KACvB,IAAIxL,EAAI6yF,GAAOxyF,KAAKuyF,GAAiBvyF,KAAK2V,GAAI,wBAC9C,GAAIhW,EAAK,OAAOA,EAAE,GAClB,OAAO,IACX,CA7JmBo1F,CAAOh3F,GACd2X,GAAOs/E,WAAWj3F,EAAKyG,SAC3B,MAAO,aAAe2G,GAAO,KAAOA,GAAO,gBAAkB,KAAOuK,GAAKtb,OAAS,EAAI,MAAQy4F,GAAM7yF,KAAK0V,GAAM,MAAQ,KAAO,GAClI,CACA,GAAI6S,SAASxqB,GAAM,CACf,IAAIk3F,GAAY9B,GAAoBjrD,GAASloC,KAAKtH,OAAOqF,GAAM,yBAA0B,MAAQm1F,GAAYlzF,KAAKjC,GAClH,MAAsB,iBAARA,GAAqBo1F,GAA2C8B,GAAvBC,UAAUD,GACrE,CACA,GA0OJ,SAASE,UAAUtxF,GACf,IAAKA,GAAkB,iBAANA,EAAkB,OAAO,EAC1C,GAA2B,oBAAhBuxF,aAA+BvxF,aAAauxF,YACnD,OAAO,EAEX,MAA6B,iBAAfvxF,EAAEm3B,UAAmD,mBAAnBn3B,EAAEivB,YACtD,CAhPQqiE,CAAUp3F,GAAM,CAGhB,IAFA,IAAI8yC,GAAI,IAAM8hD,GAAa3yF,KAAKtH,OAAOqF,EAAIi9B,WACvCq6D,GAAQt3F,EAAIk9B,YAAc,GACrBvhC,GAAI,EAAGA,GAAI27F,GAAMj7F,OAAQV,KAC9Bm3C,IAAK,IAAMwkD,GAAM37F,IAAGyR,KAAO,IAAM2oF,WAAWnrD,MAAM0sD,GAAM37F,IAAG+C,OAAQ,SAAUmxC,GAKjF,OAHAiD,IAAK,IACD9yC,EAAI08B,YAAc18B,EAAI08B,WAAWrgC,SAAUy2C,IAAK,OACpDA,IAAK,KAAO8hD,GAAa3yF,KAAKtH,OAAOqF,EAAIi9B,WAAa,GAE1D,CACA,GAAI38B,QAAQN,GAAM,CACd,GAAmB,IAAfA,EAAI3D,OAAgB,MAAO,KAC/B,IAAIk7F,GAAKN,WAAWj3F,EAAKyG,SACzB,OAAI8vF,KAyQZ,SAASiB,iBAAiBD,GACtB,IAAK,IAAI57F,EAAI,EAAGA,EAAI47F,EAAGl7F,OAAQV,IAC3B,GAAIZ,QAAQw8F,EAAG57F,GAAI,OAAS,EACxB,OAAO,EAGf,OAAO,CACX,CAhRuB67F,CAAiBD,IACrB,IAAME,aAAaF,GAAIhB,IAAU,IAErC,KAAOzB,GAAM7yF,KAAKs1F,GAAI,MAAQ,IACzC,CACA,GAkFJ,SAASxP,QAAQ/nF,GAAO,QAAsB,mBAAfknC,MAAMlnC,IAA+ByzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CAlF9H+nF,CAAQ/nF,GAAM,CACd,IAAIzD,GAAQ06F,WAAWj3F,EAAKyG,SAC5B,MAAM,UAAWxJ,MAAMmB,aAAc,UAAW4B,IAAQq1F,GAAapzF,KAAKjC,EAAK,SAG1D,IAAjBzD,GAAMF,OAAuB,IAAM1B,OAAOqF,GAAO,IAC9C,MAAQrF,OAAOqF,GAAO,KAAO80F,GAAM7yF,KAAK1F,GAAO,MAAQ,KAHnD,MAAQ5B,OAAOqF,GAAO,KAAO80F,GAAM7yF,KAAK+nC,GAAQ/nC,KAAK,YAAcwE,QAAQzG,EAAI8f,OAAQvjB,IAAQ,MAAQ,IAItH,CACA,GAAmB,iBAARyD,GAAoBs2F,EAAe,CAC1C,GAAIR,IAA+C,mBAAvB91F,EAAI81F,KAAiCH,GAC7D,OAAOA,GAAY31F,EAAK,CAAE++D,MAAO43B,GAAW53B,IACzC,GAAsB,WAAlBu3B,GAAqD,mBAAhBt2F,EAAIyG,QAChD,OAAOzG,EAAIyG,SAEnB,CACA,GA6HJ,SAASkqD,MAAM7qD,GACX,IAAKguF,IAAYhuF,GAAkB,iBAANA,EACzB,OAAO,EAEX,IACIguF,EAAQ7xF,KAAK6D,GACb,IACI8xD,EAAQ31D,KAAK6D,EACjB,CAAE,MAAOgtC,GACL,OAAO,CACX,CACA,OAAOhtC,aAAasjC,GACxB,CAAE,MAAOlkC,GAAI,CACb,OAAO,CACX,CA3IQyrD,CAAM3wD,GAAM,CACZ,IAAI03F,GAAW,GAMf,OALI3D,GACAA,EAAW9xF,KAAKjC,GAAK,SAAUtB,EAAO2R,GAClCqnF,GAASh7F,KAAK+J,QAAQ4J,EAAKrQ,GAAK,GAAQ,OAASyG,QAAQ/H,EAAOsB,GACpE,IAEG23F,aAAa,MAAO7D,EAAQ7xF,KAAKjC,GAAM03F,GAAUnB,GAC5D,CACA,GA+JJ,SAASh1B,MAAMz7D,GACX,IAAK8xD,IAAY9xD,GAAkB,iBAANA,EACzB,OAAO,EAEX,IACI8xD,EAAQ31D,KAAK6D,GACb,IACIguF,EAAQ7xF,KAAK6D,EACjB,CAAE,MAAOlE,GACL,OAAO,CACX,CACA,OAAOkE,aAAawjC,GACxB,CAAE,MAAOpkC,GAAI,CACb,OAAO,CACX,CA7KQq8D,CAAMvhE,GAAM,CACZ,IAAI43F,GAAW,GAMf,OALI1D,GACAA,EAAWjyF,KAAKjC,GAAK,SAAUtB,GAC3Bk5F,GAASl7F,KAAK+J,QAAQ/H,EAAOsB,GACjC,IAEG23F,aAAa,MAAO//B,EAAQ31D,KAAKjC,GAAM43F,GAAUrB,GAC5D,CACA,GA2HJ,SAASvO,UAAUliF,GACf,IAAKquF,IAAeruF,GAAkB,iBAANA,EAC5B,OAAO,EAEX,IACIquF,EAAWlyF,KAAK6D,EAAGquF,GACnB,IACIC,EAAWnyF,KAAK6D,EAAGsuF,EACvB,CAAE,MAAOthD,GACL,OAAO,CACX,CACA,OAAOhtC,aAAaua,OACxB,CAAE,MAAOnb,GAAI,CACb,OAAO,CACX,CAzIQ8iF,CAAUhoF,GACV,OAAO63F,iBAAiB,WAE5B,GAmKJ,SAASC,UAAUhyF,GACf,IAAKsuF,IAAetuF,GAAkB,iBAANA,EAC5B,OAAO,EAEX,IACIsuF,EAAWnyF,KAAK6D,EAAGsuF,GACnB,IACID,EAAWlyF,KAAK6D,EAAGquF,EACvB,CAAE,MAAOrhD,GACL,OAAO,CACX,CACA,OAAOhtC,aAAa6jC,OACxB,CAAE,MAAOzkC,GAAI,CACb,OAAO,CACX,CAjLQ4yF,CAAU93F,GACV,OAAO63F,iBAAiB,WAE5B,GAqIJ,SAASE,UAAUjyF,GACf,IAAKuuF,KAAiBvuF,GAAkB,iBAANA,EAC9B,OAAO,EAEX,IAEI,OADAuuF,GAAapyF,KAAK6D,IACX,CACX,CAAE,MAAOZ,GAAI,CACb,OAAO,CACX,CA9IQ6yF,CAAU/3F,GACV,OAAO63F,iBAAiB,WAE5B,GA0CJ,SAASlN,SAAS3qF,GAAO,QAAsB,oBAAfknC,MAAMlnC,IAAgCyzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CA1ChI2qF,CAAS3qF,GACT,OAAOm3F,UAAU1wF,QAAQ5D,OAAO7C,KAEpC,GA4DJ,SAASg4F,SAASh4F,GACd,IAAKA,GAAsB,iBAARA,IAAqBi1F,GACpC,OAAO,EAEX,IAEI,OADAA,GAAchzF,KAAKjC,IACZ,CACX,CAAE,MAAOkF,GAAI,CACb,OAAO,CACX,CArEQ8yF,CAASh4F,GACT,OAAOm3F,UAAU1wF,QAAQwuF,GAAchzF,KAAKjC,KAEhD,GAqCJ,SAASsqF,UAAUtqF,GAAO,QAAsB,qBAAfknC,MAAMlnC,IAAiCyzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CArClIsqF,CAAUtqF,GACV,OAAOm3F,UAAU5C,GAAetyF,KAAKjC,IAEzC,GAgCJ,SAAS8qF,SAAS9qF,GAAO,QAAsB,oBAAfknC,MAAMlnC,IAAgCyzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CAhChI8qF,CAAS9qF,GACT,OAAOm3F,UAAU1wF,QAAQ9L,OAAOqF,KAEpC,IA0BJ,SAASwR,OAAOxR,GAAO,QAAsB,kBAAfknC,MAAMlnC,IAA8ByzE,IAAgC,iBAARzzE,GAAoByzE,MAAezzE,EAAO,CA1B3HwR,CAAOxR,KAASm2F,SAASn2F,GAAM,CAChC,IAAIi4F,GAAKhB,WAAWj3F,EAAKyG,SACrB6wE,GAAgBge,GAAMA,GAAIt1F,KAAS9B,OAAOE,UAAY4B,aAAe9B,QAAU8B,EAAIgN,cAAgB9O,OACnGg6F,GAAWl4F,aAAe9B,OAAS,GAAK,iBACxCi6F,IAAa7gB,IAAiB7D,IAAev1E,OAAO8B,KAASA,GAAOyzE,MAAezzE,EAAM00F,GAAOzyF,KAAKilC,MAAMlnC,GAAM,GAAI,GAAKk4F,GAAW,SAAW,GAEhJhhF,IADiBogE,IAA4C,mBAApBt3E,EAAIgN,YAA6B,GAAKhN,EAAIgN,YAAYI,KAAOpN,EAAIgN,YAAYI,KAAO,IAAM,KAC3G+qF,IAAaD,GAAW,IAAMpD,GAAM7yF,KAAK+nC,GAAQ/nC,KAAK,GAAIk2F,IAAa,GAAID,IAAY,IAAK,MAAQ,KAAO,IACvI,OAAkB,IAAdD,GAAG57F,OAAuB6a,GAAM,KAChCq/E,GACOr/E,GAAM,IAAMugF,aAAaQ,GAAI1B,IAAU,IAE3Cr/E,GAAM,KAAO49E,GAAM7yF,KAAKg2F,GAAI,MAAQ,IAC/C,CACA,OAAOt9F,OAAOqF,EAClB,EAgDA,IAAI+P,GAAS7R,OAAOE,UAAU4R,gBAAkB,SAAUK,GAAO,OAAOA,KAAOzW,IAAM,EACrF,SAASmmB,IAAI/f,EAAKqQ,GACd,OAAON,GAAO9N,KAAKjC,EAAKqQ,EAC5B,CAEA,SAAS62B,MAAMlnC,GACX,OAAOkqE,GAAejoE,KAAKjC,EAC/B,CASA,SAASjF,QAAQw8F,EAAIzxF,GACjB,GAAIyxF,EAAGx8F,QAAW,OAAOw8F,EAAGx8F,QAAQ+K,GACpC,IAAK,IAAInK,EAAI,EAAGk3B,EAAI0kE,EAAGl7F,OAAQV,EAAIk3B,EAAGl3B,IAClC,GAAI47F,EAAG57F,KAAOmK,EAAK,OAAOnK,EAE9B,OAAQ,CACZ,CAqFA,SAAS86F,cAAcl8F,EAAKs1C,GACxB,GAAIt1C,EAAI8B,OAASwzC,EAAKwmD,gBAAiB,CACnC,IAAIvzF,EAAYvI,EAAI8B,OAASwzC,EAAKwmD,gBAC9B+B,EAAU,OAASt1F,EAAY,mBAAqBA,EAAY,EAAI,IAAM,IAC9E,OAAO2zF,cAAc/B,GAAOzyF,KAAK1H,EAAK,EAAGs1C,EAAKwmD,iBAAkBxmD,GAAQuoD,CAC5E,CAGA,OAAOrC,WADC5rD,GAASloC,KAAKkoC,GAASloC,KAAK1H,EAAK,WAAY,QAAS,eAAgB89F,SACzD,SAAUxoD,EACnC,CAEA,SAASwoD,QAAQz0F,GACb,IAAIjC,EAAIiC,EAAE1H,WAAW,GACjB4J,EAAI,CACJ,EAAG,IACH,EAAG,IACH,GAAI,IACJ,GAAI,IACJ,GAAI,KACNnE,GACF,OAAImE,EAAY,KAAOA,EAChB,OAASnE,EAAI,GAAO,IAAM,IAAMgzF,GAAa1yF,KAAKN,EAAEf,SAAS,IACxE,CAEA,SAASu2F,UAAU58F,GACf,MAAO,UAAYA,EAAM,GAC7B,CAEA,SAASs9F,iBAAiBx3F,GACtB,OAAOA,EAAO,QAClB,CAEA,SAASs3F,aAAat3F,EAAMK,EAAMkkB,EAAS2xE,GAEvC,OAAOl2F,EAAO,KAAOK,EAAO,OADR61F,EAASkB,aAAa7yE,EAAS2xE,GAAUzB,GAAM7yF,KAAK2iB,EAAS,OAC7B,GACxD,CA0BA,SAAS6yE,aAAaF,EAAIhB,GACtB,GAAkB,IAAdgB,EAAGl7F,OAAgB,MAAO,GAC9B,IAAIi8F,EAAa,KAAO/B,EAAOvlE,KAAOulE,EAAOhJ,KAC7C,OAAO+K,EAAaxD,GAAM7yF,KAAKs1F,EAAI,IAAMe,GAAc,KAAO/B,EAAOvlE,IACzE,CAEA,SAASimE,WAAWj3F,EAAKyG,GACrB,IAAI+oE,EAAQlvE,QAAQN,GAChBu3F,EAAK,GACT,GAAI/nB,EAAO,CACP+nB,EAAGl7F,OAAS2D,EAAI3D,OAChB,IAAK,IAAIV,EAAI,EAAGA,EAAIqE,EAAI3D,OAAQV,IAC5B47F,EAAG57F,GAAKokB,IAAI/f,EAAKrE,GAAK8K,EAAQzG,EAAIrE,GAAIqE,GAAO,EAErD,CACA,IACIu4F,EADAhtD,EAAuB,mBAAT2pD,GAAsBA,GAAKl1F,GAAO,GAEpD,GAAIo1F,GAAmB,CACnBmD,EAAS,CAAC,EACV,IAAK,IAAI1uC,EAAI,EAAGA,EAAIte,EAAKlvC,OAAQwtD,IAC7B0uC,EAAO,IAAMhtD,EAAKse,IAAMte,EAAKse,EAErC,CAEA,IAAK,IAAIx5C,KAAOrQ,EACP+f,IAAI/f,EAAKqQ,KACVm/D,GAAS70E,OAAOkI,OAAOwN,MAAUA,GAAOA,EAAMrQ,EAAI3D,QAClD+4F,IAAqBmD,EAAO,IAAMloF,aAAgB5S,SAG3Co3F,GAAM5yF,KAAK,SAAUoO,GAC5BknF,EAAG76F,KAAK+J,EAAQ4J,EAAKrQ,GAAO,KAAOyG,EAAQzG,EAAIqQ,GAAMrQ,IAErDu3F,EAAG76F,KAAK2T,EAAM,KAAO5J,EAAQzG,EAAIqQ,GAAMrQ,MAG/C,GAAoB,mBAATk1F,GACP,IAAK,IAAIxyF,EAAI,EAAGA,EAAI6oC,EAAKlvC,OAAQqG,IACzB2yF,GAAapzF,KAAKjC,EAAKurC,EAAK7oC,KAC5B60F,EAAG76F,KAAK,IAAM+J,EAAQ8kC,EAAK7oC,IAAM,MAAQ+D,EAAQzG,EAAIurC,EAAK7oC,IAAK1C,IAI3E,OAAOu3F,CACX,aClgBA,IAOIiB,EACAC,EARA99E,EAAUlhB,EAAOD,QAAU,CAAC,EAUhC,SAASk/F,mBACL,MAAM,IAAIz7F,MAAM,kCACpB,CACA,SAAS07F,sBACL,MAAM,IAAI17F,MAAM,oCACpB,CAqBA,SAAS27F,WAAWvnE,GAChB,GAAImnE,IAAqBjvB,WAErB,OAAOA,WAAWl4C,EAAK,GAG3B,IAAKmnE,IAAqBE,mBAAqBF,IAAqBjvB,WAEhE,OADAivB,EAAmBjvB,WACZA,WAAWl4C,EAAK,GAE3B,IAEI,OAAOmnE,EAAiBnnE,EAAK,EACjC,CAAE,MAAMnsB,GACJ,IAEI,OAAOszF,EAAiBv2F,KAAK,KAAMovB,EAAK,EAC5C,CAAE,MAAMnsB,GAEJ,OAAOszF,EAAiBv2F,KAAKrI,KAAMy3B,EAAK,EAC5C,CACJ,CAGJ,EA5CC,WACG,IAEQmnE,EADsB,mBAAfjvB,WACYA,WAEAmvB,gBAE3B,CAAE,MAAOxzF,GACLszF,EAAmBE,gBACvB,CACA,IAEQD,EADwB,mBAAjB1sB,aACcA,aAEA4sB,mBAE7B,CAAE,MAAOzzF,GACLuzF,EAAqBE,mBACzB,CACJ,CAnBA,GAwEA,IAEIE,EAFAC,EAAQ,GACRC,GAAW,EAEXC,GAAc,EAElB,SAASC,kBACAF,GAAaF,IAGlBE,GAAW,EACPF,EAAax8F,OACby8F,EAAQD,EAAa7yF,OAAO8yF,GAE5BE,GAAc,EAEdF,EAAMz8F,QACN68F,aAER,CAEA,SAASA,aACL,IAAIH,EAAJ,CAGA,IAAII,EAAUP,WAAWK,iBACzBF,GAAW,EAGX,IADA,IAAI/8F,EAAM88F,EAAMz8F,OACVL,GAAK,CAGP,IAFA68F,EAAeC,EACfA,EAAQ,KACCE,EAAah9F,GACd68F,GACAA,EAAaG,GAAYI,MAGjCJ,GAAc,EACdh9F,EAAM88F,EAAMz8F,MAChB,CACAw8F,EAAe,KACfE,GAAW,EAnEf,SAASM,gBAAgBC,GACrB,GAAIb,IAAuB1sB,aAEvB,OAAOA,aAAautB,GAGxB,IAAKb,IAAuBE,sBAAwBF,IAAuB1sB,aAEvE,OADA0sB,EAAqB1sB,aACdA,aAAautB,GAExB,IAEI,OAAOb,EAAmBa,EAC9B,CAAE,MAAOp0F,GACL,IAEI,OAAOuzF,EAAmBx2F,KAAK,KAAMq3F,EACzC,CAAE,MAAOp0F,GAGL,OAAOuzF,EAAmBx2F,KAAKrI,KAAM0/F,EACzC,CACJ,CAIJ,CA0CID,CAAgBF,EAlBhB,CAmBJ,CAgBA,SAASI,KAAKloE,EAAK1wB,GACf/G,KAAKy3B,IAAMA,EACXz3B,KAAK+G,MAAQA,CACjB,CAWA,SAASg/E,OAAQ,CA5BjBhlE,EAAQ6+E,SAAW,SAAUnoE,GACzB,IAAIvT,EAAO,IAAI/gB,MAAM+D,UAAUzE,OAAS,GACxC,GAAIyE,UAAUzE,OAAS,EACnB,IAAK,IAAIV,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAClCmiB,EAAKniB,EAAI,GAAKmF,UAAUnF,GAGhCm9F,EAAMp8F,KAAK,IAAI68F,KAAKloE,EAAKvT,IACJ,IAAjBg7E,EAAMz8F,QAAiB08F,GACvBH,WAAWM,WAEnB,EAOAK,KAAKn7F,UAAUg7F,IAAM,WACjBx/F,KAAKy3B,IAAIzsB,MAAM,KAAMhL,KAAK+G,MAC9B,EACAga,EAAQs2E,MAAQ,UAChBt2E,EAAQ8+E,SAAU,EAClB9+E,EAAQ++E,IAAM,CAAC,EACf/+E,EAAQg/E,KAAO,GACfh/E,EAAQD,QAAU,GAClBC,EAAQE,SAAW,CAAC,EAIpBF,EAAQ4nB,GAAKo9C,KACbhlE,EAAQmqB,YAAc66C,KACtBhlE,EAAQgnB,KAAOg+C,KACfhlE,EAAQyqB,IAAMu6C,KACdhlE,EAAQsnB,eAAiB09C,KACzBhlE,EAAQ0qB,mBAAqBs6C,KAC7BhlE,EAAQyoB,KAAOu8C,KACfhlE,EAAQoqB,gBAAkB46C,KAC1BhlE,EAAQqqB,oBAAsB26C,KAE9BhlE,EAAQkqB,UAAY,SAAUz3B,GAAQ,MAAO,EAAG,EAEhDuN,EAAQuoE,QAAU,SAAU91E,GACxB,MAAM,IAAInQ,MAAM,mCACpB,EAEA0d,EAAQi/E,IAAM,WAAc,MAAO,GAAI,EACvCj/E,EAAQk/E,MAAQ,SAAU93F,GACtB,MAAM,IAAI9E,MAAM,iCACpB,EACA0d,EAAQm/E,MAAQ,WAAa,OAAO,CAAG,gCC9KvC,IAAIC,EAAuB,EAAQ,OAEnC,SAASC,gBAAiB,CAC1B,SAASC,yBAA0B,CACnCA,uBAAuBC,kBAAoBF,cAE3CvgG,EAAOD,QAAU,WACf,SAAS2gG,KAAKpyE,EAAOqyE,EAAUC,EAAeC,EAAUC,EAAcC,GACpE,GAAIA,IAAWT,EAAf,CAIA,IAAItlF,EAAM,IAAIxX,MACZ,mLAKF,MADAwX,EAAIrH,KAAO,sBACLqH,CAPN,CAQF,CAEA,SAASgmF,UACP,OAAON,IACT,CAHAA,KAAKO,WAAaP,KAMlB,IAAIQ,EAAiB,CACnBh6F,MAAOw5F,KACPS,OAAQT,KACRU,KAAMV,KACNtqF,KAAMsqF,KACN5vE,OAAQ4vE,KACR/hF,OAAQ+hF,KACRv7F,OAAQu7F,KACRt0E,OAAQs0E,KAERW,IAAKX,KACLY,QAASN,QACTxqE,QAASkqE,KACTa,YAAab,KACbc,WAAYR,QACZn/D,KAAM6+D,KACNe,SAAUT,QACVU,MAAOV,QACPW,UAAWX,QACXY,MAAOZ,QACPa,MAAOb,QAEPc,eAAgBtB,uBAChBC,kBAAmBF,eAKrB,OAFAW,EAAea,UAAYb,EAEpBA,CACT,mBC/CElhG,EAAOD,QAAU,EAAQ,MAAR,2BCNnBC,EAAOD,QAFoB,uECP3B,IAAIgB,EAAUG,OAAOyD,UAAU5D,QAC3BihG,EAAkB,OAElBC,EACS,UADTA,EAES,UAGbjiG,EAAOD,QAAU,CACb,QAAWkiG,EACXC,WAAY,CACRC,QAAS,SAAUl9F,GACf,OAAOlE,EAAQyH,KAAKvD,EAAO+8F,EAAiB,IAChD,EACAI,QAAS,SAAUn9F,GACf,OAAO/D,OAAO+D,EAClB,GAEJk9F,QAASF,EACTG,QAASH,iCCnBb,IAAI90D,EAAY,EAAQ,OACpBr2B,EAAQ,EAAQ,OAChBurF,EAAU,EAAQ,OAEtBriG,EAAOD,QAAU,CACbsiG,QAASA,EACTvrF,MAAOA,EACPq2B,UAAWA,iCCPf,IAAIm1D,EAAQ,EAAQ,OAEhBh8E,EAAM7hB,OAAOE,UAAU4R,eACvB1P,EAAUvD,MAAMuD,QAEhB07F,EAAW,CACXC,WAAW,EACXC,iBAAiB,EACjBC,aAAa,EACbC,WAAY,GACZC,QAAS,QACTC,iBAAiB,EACjBC,OAAO,EACPC,QAAST,EAAMtrF,OACfgsF,UAAW,IACX19B,MAAO,EACP29B,mBAAmB,EACnBC,0BAA0B,EAC1BC,eAAgB,IAChBC,aAAa,EACbC,cAAc,EACdC,oBAAoB,GAGpBJ,yBAA2B,SAAUpiG,GACrC,OAAOA,EAAIC,QAAQ,aAAa,SAAUwiG,EAAIC,GAC1C,OAAOtiG,OAAOC,aAAaqI,SAASg6F,EAAW,IACnD,GACJ,EAEIC,gBAAkB,SAAUp7F,EAAK0O,GACjC,OAAI1O,GAAsB,iBAARA,GAAoB0O,EAAQ+rF,OAASz6F,EAAI/G,QAAQ,MAAQ,EAChE+G,EAAIyM,MAAM,KAGdzM,CACX,EA+GIq7F,EAAY,SAASC,qBAAqBC,EAAUv7F,EAAK0O,EAAS8sF,GAClE,GAAKD,EAAL,CAKA,IAAIhtF,EAAMG,EAAQyrF,UAAYoB,EAAS7iG,QAAQ,cAAe,QAAU6iG,EAKpEhwD,EAAQ,gBAIRkwD,EAAU/sF,EAAQuuD,MAAQ,GALf,eAK6B7hD,KAAK7M,GAC7C4E,EAASsoF,EAAUltF,EAAIpR,MAAM,EAAGs+F,EAAQ7sF,OAASL,EAIjDsH,EAAO,GACX,GAAI1C,EAAQ,CAER,IAAKzE,EAAQssF,cAAgB/8E,EAAI9d,KAAK/D,OAAOE,UAAW6W,KAC/CzE,EAAQ0rF,gBACT,OAIRvkF,EAAKjb,KAAKuY,EACd,CAKA,IADA,IAAItZ,EAAI,EACD6U,EAAQuuD,MAAQ,GAAqC,QAA/Bw+B,EAAUlwD,EAAMnwB,KAAK7M,KAAkB1U,EAAI6U,EAAQuuD,OAAO,CAEnF,GADApjE,GAAK,GACA6U,EAAQssF,cAAgB/8E,EAAI9d,KAAK/D,OAAOE,UAAWm/F,EAAQ,GAAGt+F,MAAM,GAAI,MACpEuR,EAAQ0rF,gBACT,OAGRvkF,EAAKjb,KAAK6gG,EAAQ,GACtB,CAQA,OAJIA,GACA5lF,EAAKjb,KAAK,IAAM2T,EAAIpR,MAAMs+F,EAAQ7sF,OAAS,KAnFjC,SAAUw2D,EAAOplE,EAAK0O,EAAS8sF,GAG7C,IAFA,IAAIE,EAAOF,EAAex7F,EAAMo7F,gBAAgBp7F,EAAK0O,GAE5C7U,EAAIurE,EAAM7qE,OAAS,EAAGV,GAAK,IAAKA,EAAG,CACxC,IAAIqE,EACA1G,EAAO4tE,EAAMvrE,GAEjB,GAAa,OAATrC,GAAiBkX,EAAQqsF,YACzB78F,EAAM,GAAGgG,OAAOw3F,OACb,CACHx9F,EAAMwQ,EAAQssF,aAAe5+F,OAAO6kB,OAAO,MAAQ,CAAC,EACpD,IAAI06E,EAA+B,MAAnBnkG,EAAK2wB,OAAO,IAA+C,MAAjC3wB,EAAK2wB,OAAO3wB,EAAK+C,OAAS,GAAa/C,EAAK2F,MAAM,GAAI,GAAK3F,EACjGoX,EAAQzN,SAASw6F,EAAW,IAC3BjtF,EAAQqsF,aAA6B,KAAdY,GAGvBrsF,MAAMV,IACJpX,IAASmkG,GACT9iG,OAAO+V,KAAW+sF,GAClB/sF,GAAS,GACRF,EAAQqsF,aAAensF,GAASF,EAAQ4rF,YAE5Cp8F,EAAM,IACF0Q,GAAS8sF,EACQ,cAAdC,IACPz9F,EAAIy9F,GAAaD,GAXjBx9F,EAAM,CAAE,EAAGw9F,EAanB,CAEAA,EAAOx9F,CACX,CAEA,OAAOw9F,CACX,CAqDWE,CAAY/lF,EAAM7V,EAAK0O,EAAS8sF,EAhDvC,CAiDJ,EAqCA7jG,EAAOD,QAAU,SAAUe,EAAKs1C,GAC5B,IAAIr/B,EApCoB,SAASmtF,sBAAsB9tD,GACvD,IAAKA,EACD,OAAOmsD,EAGX,GAAqB,OAAjBnsD,EAAK2sD,cAAqCr8F,IAAjB0vC,EAAK2sD,SAAiD,mBAAjB3sD,EAAK2sD,QACnE,MAAM,IAAIj+F,UAAU,iCAGxB,QAA4B,IAAjBsxC,EAAKwsD,SAA4C,UAAjBxsD,EAAKwsD,SAAwC,eAAjBxsD,EAAKwsD,QACxE,MAAM,IAAI99F,UAAU,qEAExB,IAAI89F,OAAkC,IAAjBxsD,EAAKwsD,QAA0BL,EAASK,QAAUxsD,EAAKwsD,QAE5E,MAAO,CACHJ,eAAqC,IAAnBpsD,EAAKosD,UAA4BD,EAASC,YAAcpsD,EAAKosD,UAC/EC,gBAAiD,kBAAzBrsD,EAAKqsD,gBAAgCrsD,EAAKqsD,gBAAkBF,EAASE,gBAC7FC,YAAyC,kBAArBtsD,EAAKssD,YAA4BtsD,EAAKssD,YAAcH,EAASG,YACjFC,WAAuC,iBAApBvsD,EAAKusD,WAA0BvsD,EAAKusD,WAAaJ,EAASI,WAC7EC,QAASA,EACTC,gBAAiD,kBAAzBzsD,EAAKysD,gBAAgCzsD,EAAKysD,gBAAkBN,EAASM,gBAC7FC,MAA6B,kBAAf1sD,EAAK0sD,MAAsB1sD,EAAK0sD,MAAQP,EAASO,MAC/DC,QAAiC,mBAAjB3sD,EAAK2sD,QAAyB3sD,EAAK2sD,QAAUR,EAASQ,QACtEC,UAAqC,iBAAnB5sD,EAAK4sD,WAA0BV,EAAM5F,SAAStmD,EAAK4sD,WAAa5sD,EAAK4sD,UAAYT,EAASS,UAE5G19B,MAA8B,iBAAflvB,EAAKkvB,QAAqC,IAAflvB,EAAKkvB,OAAoBlvB,EAAKkvB,MAAQi9B,EAASj9B,MACzF29B,mBAA8C,IAA3B7sD,EAAK6sD,kBACxBC,yBAAmE,kBAAlC9sD,EAAK8sD,yBAAyC9sD,EAAK8sD,yBAA2BX,EAASW,yBACxHC,eAA+C,iBAAxB/sD,EAAK+sD,eAA8B/sD,EAAK+sD,eAAiBZ,EAASY,eACzFC,aAAkC,IAArBhtD,EAAKgtD,YAClBC,aAA2C,kBAAtBjtD,EAAKitD,aAA6BjtD,EAAKitD,aAAed,EAASc,aACpFC,mBAAuD,kBAA5BltD,EAAKktD,mBAAmCltD,EAAKktD,mBAAqBf,EAASe,mBAE9G,CAGkBY,CAAsB9tD,GAEpC,GAAY,KAARt1C,SAAcA,EACd,OAAOiW,EAAQssF,aAAe5+F,OAAO6kB,OAAO,MAAQ,CAAC,EASzD,IANA,IAAI66E,EAAyB,iBAARrjG,EAnMP,SAASsjG,uBAAuBtjG,EAAKiW,GACnD,IAKI7U,EALAqE,EAAM,CAAC,EACP89F,EAAWttF,EAAQksF,kBAAoBniG,EAAIC,QAAQ,MAAO,IAAMD,EAChEmR,EAAQ8E,EAAQosF,iBAAmBxuF,SAAWjO,EAAYqQ,EAAQosF,eAClErgG,EAAQuhG,EAASvvF,MAAMiC,EAAQisF,UAAW/wF,GAC1CqyF,GAAa,EAGb1B,EAAU7rF,EAAQ6rF,QACtB,GAAI7rF,EAAQ8rF,gBACR,IAAK3gG,EAAI,EAAGA,EAAIY,EAAMF,SAAUV,EACM,IAA9BY,EAAMZ,GAAGZ,QAAQ,WAbX,mBAcFwB,EAAMZ,GACN0gG,EAAU,QAlBZ,wBAmBS9/F,EAAMZ,KACb0gG,EAAU,cAEd0B,EAAYpiG,EACZA,EAAIY,EAAMF,QAKtB,IAAKV,EAAI,EAAGA,EAAIY,EAAMF,SAAUV,EAC5B,GAAIA,IAAMoiG,EAAV,CAGA,IAKI1tF,GAAKvO,GALLopC,GAAO3uC,EAAMZ,GAEbqiG,GAAmB9yD,GAAKnwC,QAAQ,MAChCmL,IAA4B,IAAtB83F,GAA0B9yD,GAAKnwC,QAAQ,KAAOijG,GAAmB,GAG9D,IAAT93F,IACAmK,GAAMG,EAAQgsF,QAAQtxD,GAAM8wD,EAASQ,QAASH,EAAS,OACvDv6F,GAAM0O,EAAQusF,mBAAqB,KAAO,KAE1C1sF,GAAMG,EAAQgsF,QAAQtxD,GAAKjsC,MAAM,EAAGiH,IAAM81F,EAASQ,QAASH,EAAS,OACrEv6F,GAAMi6F,EAAMlrC,SACRqsC,gBAAgBhyD,GAAKjsC,MAAMiH,GAAM,GAAIsK,IACrC,SAAUytF,GACN,OAAOztF,EAAQgsF,QAAQyB,EAAYjC,EAASQ,QAASH,EAAS,QAClE,KAIJv6F,IAAO0O,EAAQmsF,0BAAwC,eAAZN,IAC3Cv6F,GAAM66F,yBAAyB76F,KAG/BopC,GAAKnwC,QAAQ,QAAU,IACvB+G,GAAMxB,EAAQwB,IAAO,CAACA,IAAOA,IAG7Bie,EAAI9d,KAAKjC,EAAKqQ,IACdrQ,EAAIqQ,IAAO0rF,EAAMmC,QAAQl+F,EAAIqQ,IAAMvO,IAEnC9B,EAAIqQ,IAAOvO,EA/Bf,CAmCJ,OAAO9B,CACX,CAqI4Cm+F,CAAY5jG,EAAKiW,GAAWjW,EAChEyF,EAAMwQ,EAAQssF,aAAe5+F,OAAO6kB,OAAO,MAAQ,CAAC,EAIpDpL,EAAOzZ,OAAOyZ,KAAKimF,GACdjiG,EAAI,EAAGA,EAAIgc,EAAKtb,SAAUV,EAAG,CAClC,IAAI0U,EAAMsH,EAAKhc,GACXyiG,GAASjB,EAAU9sF,EAAKutF,EAAQvtF,GAAMG,EAAwB,iBAARjW,GAC1DyF,EAAM+7F,EAAMlqC,MAAM7xD,EAAKo+F,GAAQ5tF,EACnC,CAEA,OAA4B,IAAxBA,EAAQ2rF,YACDn8F,EAGJ+7F,EAAMsC,QAAQr+F,EACzB,gCCpQA,IAAIs+F,EAAiB,EAAQ,OACzBvC,EAAQ,EAAQ,OAChBD,EAAU,EAAQ,OAClB/7E,EAAM7hB,OAAOE,UAAU4R,eAEvBuuF,EAAwB,CACxBC,SAAU,SAASA,SAAS1S,GACxB,OAAOA,EAAS,IACpB,EACAyQ,MAAO,QACPkC,QAAS,SAASA,QAAQ3S,EAAQz7E,GAC9B,OAAOy7E,EAAS,IAAMz7E,EAAM,GAChC,EACAquF,OAAQ,SAASA,OAAO5S,GACpB,OAAOA,CACX,GAGAxrF,EAAUvD,MAAMuD,QAChBiO,EAAQ5T,OAAOyD,UAAUmQ,MACzB7R,EAAOK,MAAMqB,UAAU1B,KACvBiiG,YAAc,SAAU/iG,EAAKgjG,GAC7BliG,EAAKkI,MAAMhJ,EAAK0E,EAAQs+F,GAAgBA,EAAe,CAACA,GAC5D,EAEIC,EAAQntF,KAAKtT,UAAU0gG,YAEvBC,EAAgBjD,EAAiB,QACjCE,GAAW,CACXgD,gBAAgB,EAChB/C,WAAW,EACXI,QAAS,QACTC,iBAAiB,EACjBG,UAAW,IACXxrF,QAAQ,EACRguF,QAASlD,EAAM9qF,OACfiuF,kBAAkB,EAClBtrF,OAAQmrF,EACRv5D,UAAWs2D,EAAQH,WAAWoD,GAE9BN,SAAS,EACTU,cAAe,SAASA,cAAcC,GAClC,OAAOP,EAAM58F,KAAKm9F,EACtB,EACAC,WAAW,EACXtC,oBAAoB,GAWpBuC,GAAW,CAAC,EAEZ14D,GAAY,SAASA,UACrBxuB,EACA0zE,EACAyT,EACAC,EACAzC,EACAsC,EACAJ,EACA7uE,EACA4rB,EACAigD,GACAkD,GACAvrF,GACA4xB,GACA05D,GACA7C,GACAoD,IAOA,IALA,IAAIz/F,GAAMoY,EAENsnF,GAAQD,GACRt9E,GAAO,EACPw9E,IAAW,OAC0B,KAAjCD,GAAQA,GAAMn6F,IAAI+5F,OAAkCK,IAAU,CAElE,IAAIz5F,GAAMw5F,GAAMn6F,IAAI6S,GAEpB,GADA+J,IAAQ,OACW,IAARjc,GAAqB,CAC5B,GAAIA,KAAQic,GACR,MAAM,IAAInkB,WAAW,uBAErB2hG,IAAW,CAEnB,MACmC,IAAxBD,GAAMn6F,IAAI+5F,MACjBn9E,GAAO,EAEf,CAeA,GAbsB,mBAAXiO,EACPpwB,GAAMowB,EAAO07D,EAAQ9rF,IACdA,cAAe0R,KACtB1R,GAAMm/F,GAAcn/F,IACW,UAAxBu/F,GAAmCj/F,EAAQN,MAClDA,GAAM+7F,EAAMlrC,SAAS7wD,IAAK,SAAUtB,GAChC,OAAIA,aAAiBgT,KACVytF,GAAczgG,GAElBA,CACX,KAGQ,OAARsB,GAAc,CACd,GAAI+8F,EACA,OAAOkC,IAAYC,GAAmBD,EAAQnT,EAAQkQ,GAASiD,QAAS5C,GAAS,MAAOzoF,IAAUk4E,EAGtG9rF,GAAM,EACV,CAEA,GAtEwB,SAAS4/F,sBAAsB91C,GACvD,MAAoB,iBAANA,GACM,iBAANA,GACM,kBAANA,GACM,iBAANA,GACM,iBAANA,CAClB,CAgEQ81C,CAAsB5/F,KAAQ+7F,EAAM97F,SAASD,IAAM,CACnD,GAAIi/F,EAAS,CACT,IAAI7L,GAAW8L,GAAmBpT,EAASmT,EAAQnT,EAAQkQ,GAASiD,QAAS5C,GAAS,MAAOzoF,IAC7F,GAA4B,UAAxB2rF,GAAmCL,GAAkB,CAGrD,IAFA,IAAIW,GAActxF,EAAMtM,KAAKtH,OAAOqF,IAAM,KACtC8/F,GAAe,GACVnkG,GAAI,EAAGA,GAAIkkG,GAAYxjG,SAAUV,GACtCmkG,KAAuB,IAANnkG,GAAU,GAAK,KAAO6pC,GAAUy5D,EAAQY,GAAYlkG,IAAIqgG,GAASiD,QAAS5C,GAAS,QAASzoF,KAEjH,MAAO,CAAC4xB,GAAU4tD,KAAaoM,GAAkBl/F,EAAQN,KAA+B,IAAvB6/F,GAAYxjG,OAAe,KAAO,IAAM,IAAMyjG,GACnH,CACA,MAAO,CAACt6D,GAAU4tD,IAAY,IAAM5tD,GAAUy5D,EAAQj/F,GAAKg8F,GAASiD,QAAS5C,GAAS,QAASzoF,KACnG,CACA,MAAO,CAAC4xB,GAAUsmD,GAAU,IAAMtmD,GAAU7qC,OAAOqF,KACvD,CAEA,IAMI+/F,GANAp7E,GAAS,GAEb,QAAmB,IAAR3kB,GACP,OAAO2kB,GAIX,GAA4B,UAAxB46E,GAAmCj/F,EAAQN,IAE3C+/F,GAAU,CAAC,CAAErhG,MAAOsB,GAAI3D,OAAS,EAAI2D,GAAInD,KAAK,MAAQ,UAAO,SAC1D,GAAIyD,EAAQ8vB,GACf2vE,GAAU3vE,MACP,CACH,IAAIzY,GAAOzZ,OAAOyZ,KAAK3X,IACvB+/F,GAAU/jD,EAAOrkC,GAAKqkC,KAAKA,GAAQrkC,EACvC,CAIA,IAFA,IAAIqoF,GAAiBR,GAAkBl/F,EAAQN,KAAuB,IAAfA,GAAI3D,OAAeyvF,EAAS,KAAOA,EAEjFppF,GAAI,EAAGA,GAAIq9F,GAAQ1jG,SAAUqG,GAAG,CACrC,IAAI2N,GAAM0vF,GAAQr9F,IACdhE,GAAuB,iBAAR2R,SAAyC,IAAdA,GAAI3R,MAAwB2R,GAAI3R,MAAQsB,GAAIqQ,IAE1F,IAAIgvF,GAAuB,OAAV3gG,GAAjB,CAIA,IAAIuhG,GAAY3/F,EAAQN,IACa,mBAAxBu/F,EAAqCA,EAAoBS,GAAgB3vF,IAAO2vF,GACvFA,IAAkB/D,GAAY,IAAM5rF,GAAM,IAAMA,GAAM,KAE5DovF,GAAYt5F,IAAIiS,EAAQ+J,IACxB,IAAI+9E,GAAmB5B,IACvB4B,GAAiB/5F,IAAIm5F,GAAUG,IAC/Bd,YAAYh6E,GAAQiiB,UAChBloC,GACAuhG,GACAV,EACAC,EACAzC,EACAsC,EACAJ,EACA7uE,EACA4rB,EACAigD,GACAkD,GACAvrF,GACA4xB,GACA05D,GACA7C,GACA6D,IAzBJ,CA2BJ,CAEA,OAAOv7E,EACX,EAiDAlrB,EAAOD,QAAU,SAAU4e,EAAQy3B,GAC/B,IAGIkwD,EAHA//F,EAAMoY,EACN5H,EAjDwB,SAAS2vF,0BAA0BtwD,GAC/D,IAAKA,EACD,OAAOmsD,GAGX,GAAqB,OAAjBnsD,EAAKovD,cAA4C,IAAjBpvD,EAAKovD,SAAmD,mBAAjBpvD,EAAKovD,QAC5E,MAAM,IAAI1gG,UAAU,iCAGxB,IAAI89F,EAAUxsD,EAAKwsD,SAAWL,GAASK,QACvC,QAA4B,IAAjBxsD,EAAKwsD,SAA4C,UAAjBxsD,EAAKwsD,SAAwC,eAAjBxsD,EAAKwsD,QACxE,MAAM,IAAI99F,UAAU,qEAGxB,IAAIqV,EAASkoF,EAAiB,QAC9B,QAA2B,IAAhBjsD,EAAKj8B,OAAwB,CACpC,IAAKmM,EAAI9d,KAAK65F,EAAQH,WAAY9rD,EAAKj8B,QACnC,MAAM,IAAIrV,UAAU,mCAExBqV,EAASi8B,EAAKj8B,MAClB,CACA,IAAI4xB,EAAYs2D,EAAQH,WAAW/nF,GAE/Bwc,EAAS4rE,GAAS5rE,OAKtB,OAJ2B,mBAAhByf,EAAKzf,QAAyB9vB,EAAQuvC,EAAKzf,WAClDA,EAASyf,EAAKzf,QAGX,CACH4uE,eAA+C,kBAAxBnvD,EAAKmvD,eAA+BnvD,EAAKmvD,eAAiBhD,GAASgD,eAC1F/C,eAAqC,IAAnBpsD,EAAKosD,UAA4BD,GAASC,YAAcpsD,EAAKosD,UAC/EI,QAASA,EACTC,gBAAiD,kBAAzBzsD,EAAKysD,gBAAgCzsD,EAAKysD,gBAAkBN,GAASM,gBAC7FG,eAAqC,IAAnB5sD,EAAK4sD,UAA4BT,GAASS,UAAY5sD,EAAK4sD,UAC7ExrF,OAA+B,kBAAhB4+B,EAAK5+B,OAAuB4+B,EAAK5+B,OAAS+qF,GAAS/qF,OAClEguF,QAAiC,mBAAjBpvD,EAAKovD,QAAyBpvD,EAAKovD,QAAUjD,GAASiD,QACtEC,iBAAmD,kBAA1BrvD,EAAKqvD,iBAAiCrvD,EAAKqvD,iBAAmBlD,GAASkD,iBAChG9uE,OAAQA,EACRxc,OAAQA,EACR4xB,UAAWA,EACX25D,cAA6C,mBAAvBtvD,EAAKsvD,cAA+BtvD,EAAKsvD,cAAgBnD,GAASmD,cACxFE,UAAqC,kBAAnBxvD,EAAKwvD,UAA0BxvD,EAAKwvD,UAAYrD,GAASqD,UAC3ErjD,KAA2B,mBAAdnM,EAAKmM,KAAsBnM,EAAKmM,KAAO,KACpD+gD,mBAAuD,kBAA5BltD,EAAKktD,mBAAmCltD,EAAKktD,mBAAqBf,GAASe,mBAE9G,CAIkBoD,CAA0BtwD,GAKV,mBAAnBr/B,EAAQ4f,OAEfpwB,GADAowB,EAAS5f,EAAQ4f,QACJ,GAAIpwB,GACVM,EAAQkQ,EAAQ4f,UAEvB2vE,EADSvvF,EAAQ4f,QAIrB,IAMIgwE,EANAzoF,EAAO,GAEX,GAAmB,iBAAR3X,GAA4B,OAARA,EAC3B,MAAO,GAKPogG,EADAvwD,GAAQA,EAAKuwD,eAAe7B,EACd1uD,EAAKuwD,YACZvwD,GAAQ,YAAaA,EACdA,EAAK4uD,QAAU,UAAY,SAE3B,UAGlB,IAAIc,EAAsBhB,EAAsB6B,GAChD,GAAIvwD,GAAQ,mBAAoBA,GAAuC,kBAAxBA,EAAK2vD,eAChD,MAAM,IAAIjhG,UAAU,iDAExB,IAAIihG,GAAyC,UAAxBD,GAAmC1vD,GAAQA,EAAK2vD,eAEhEO,IACDA,EAAU7hG,OAAOyZ,KAAK3X,IAGtBwQ,EAAQwrC,MACR+jD,EAAQ/jD,KAAKxrC,EAAQwrC,MAIzB,IADA,IAAIyjD,GAAcnB,IACT3iG,GAAI,EAAGA,GAAIokG,EAAQ1jG,SAAUV,GAAG,CACrC,IAAI0U,GAAM0vF,EAAQpkG,IAEd6U,EAAQ6uF,WAA0B,OAAbr/F,EAAIqQ,KAG7BsuF,YAAYhnF,EAAMivB,GACd5mC,EAAIqQ,IACJA,GACAkvF,EACAC,GACAhvF,EAAQusF,mBACRvsF,EAAQ6uF,UACR7uF,EAAQS,OAAST,EAAQyuF,QAAU,KACnCzuF,EAAQ4f,OACR5f,EAAQwrC,KACRxrC,EAAQyrF,UACRzrF,EAAQ2uF,cACR3uF,EAAQoD,OACRpD,EAAQg1B,UACRh1B,EAAQ0uF,iBACR1uF,EAAQ6rF,QACRoD,IAER,CAEA,IAAIr7B,GAASzsD,EAAK9a,KAAK2T,EAAQisF,WAC3B3Q,IAAoC,IAA3Bt7E,EAAQwuF,eAA0B,IAAM,GAYrD,OAVIxuF,EAAQ8rF,kBACgB,eAApB9rF,EAAQ6rF,QAERvQ,IAAU,uBAGVA,IAAU,mBAIX1nB,GAAO/nE,OAAS,EAAIyvF,GAAS1nB,GAAS,EACjD,gCCnUA,IAAI03B,EAAU,EAAQ,OAElB/7E,EAAM7hB,OAAOE,UAAU4R,eACvB1P,EAAUvD,MAAMuD,QAEhB+/F,EAAY,WAEZ,IADA,IAAI1/F,EAAQ,GACHhF,EAAI,EAAGA,EAAI,MAAOA,EACvBgF,EAAMjE,KAAK,MAAQf,EAAI,GAAK,IAAM,IAAMA,EAAEiF,SAAS,KAAKimC,eAG5D,OAAOlmC,CACX,CAPe,GA4BX2/F,EAAgB,SAASA,cAAc7oF,EAAQjH,GAE/C,IADA,IAAIxQ,EAAMwQ,GAAWA,EAAQssF,aAAe5+F,OAAO6kB,OAAO,MAAQ,CAAC,EAC1DpnB,EAAI,EAAGA,EAAI8b,EAAOpb,SAAUV,OACR,IAAd8b,EAAO9b,KACdqE,EAAIrE,GAAK8b,EAAO9b,IAIxB,OAAOqE,CACX,EAoMAvG,EAAOD,QAAU,CACb8mG,cAAeA,EACf5qF,OA3IS,SAAS6qF,mBAAmB55F,EAAQ8Q,GAC7C,OAAOvZ,OAAOyZ,KAAKF,GAAQsZ,QAAO,SAAUyvE,EAAKnwF,GAE7C,OADAmwF,EAAInwF,GAAOoH,EAAOpH,GACXmwF,CACX,GAAG75F,EACP,EAuIIu3F,QAlBU,SAASA,QAAQr4F,EAAG/F,GAC9B,MAAO,GAAGkG,OAAOH,EAAG/F,EACxB,EAiBIu+F,QAvDU,SAASA,QAAQ3/F,GAI3B,IAHA,IAAIo6F,EAAQ,CAAC,CAAE94F,IAAK,CAAEuvD,EAAG7wD,GAASu0B,KAAM,MACpCwtE,EAAO,GAEF9kG,EAAI,EAAGA,EAAIm9F,EAAMz8F,SAAUV,EAKhC,IAJA,IAAIqzB,EAAO8pE,EAAMn9F,GACbqE,EAAMgvB,EAAKhvB,IAAIgvB,EAAKiE,MAEpBtb,EAAOzZ,OAAOyZ,KAAK3X,GACd0C,EAAI,EAAGA,EAAIiV,EAAKtb,SAAUqG,EAAG,CAClC,IAAI2N,EAAMsH,EAAKjV,GACXZ,EAAM9B,EAAIqQ,GACK,iBAARvO,GAA4B,OAARA,IAAuC,IAAvB2+F,EAAK1lG,QAAQ+G,KACxDg3F,EAAMp8F,KAAK,CAAEsD,IAAKA,EAAKizB,KAAM5iB,IAC7BowF,EAAK/jG,KAAKoF,GAElB,CAKJ,OAlMe,SAAS4+F,aAAa5H,GACrC,KAAOA,EAAMz8F,OAAS,GAAG,CACrB,IAAI2yB,EAAO8pE,EAAMnnE,MACb3xB,EAAMgvB,EAAKhvB,IAAIgvB,EAAKiE,MAExB,GAAI3yB,EAAQN,GAAM,CAGd,IAFA,IAAI2gG,EAAY,GAEPj+F,EAAI,EAAGA,EAAI1C,EAAI3D,SAAUqG,OACR,IAAX1C,EAAI0C,IACXi+F,EAAUjkG,KAAKsD,EAAI0C,IAI3BssB,EAAKhvB,IAAIgvB,EAAKiE,MAAQ0tE,CAC1B,CACJ,CACJ,CA+KID,CAAa5H,GAENp6F,CACX,EAkCI+R,OAvIS,SAAUlW,EAAKiiG,EAASH,GACjC,IAAIuE,EAAiBrmG,EAAIC,QAAQ,MAAO,KACxC,GAAgB,eAAZ6hG,EAEA,OAAOuE,EAAepmG,QAAQ,iBAAkBqmG,UAGpD,IACI,OAAO7uF,mBAAmB4uF,EAC9B,CAAE,MAAO17F,GACL,OAAO07F,CACX,CACJ,EA4HI3vF,OA1HS,SAASA,OAAO1W,EAAKumG,EAAgBzE,EAAS15E,EAAM/O,GAG7D,GAAmB,IAAfrZ,EAAI8B,OACJ,OAAO9B,EAGX,IAAIqE,EAASrE,EAOb,GANmB,iBAARA,EACPqE,EAASnB,OAAOW,UAAUwC,SAASqB,KAAK1H,GAClB,iBAARA,IACdqE,EAASjE,OAAOJ,IAGJ,eAAZ8hG,EACA,OAAO/tE,OAAO1vB,GAAQpE,QAAQ,mBAAmB,SAAUwiG,GACvD,MAAO,SAAW/5F,SAAS+5F,EAAG/9F,MAAM,GAAI,IAAM,KAClD,IAIJ,IADA,IAAIoI,EAAM,GACD1L,EAAI,EAAGA,EAAIiD,EAAOvC,SAAUV,EAAG,CACpC,IAAIiI,EAAIhF,EAAO1C,WAAWP,GAGhB,KAANiI,GACS,KAANA,GACM,KAANA,GACM,MAANA,GACCA,GAAK,IAAQA,GAAK,IAClBA,GAAK,IAAQA,GAAK,IAClBA,GAAK,IAAQA,GAAK,KAClBgQ,IAAWkoF,EAAQF,UAAkB,KAANh4F,GAAoB,KAANA,GAEjDyD,GAAOzI,EAAOqrB,OAAOtuB,GAIrBiI,EAAI,IACJyD,GAAYg5F,EAASz8F,GAIrBA,EAAI,KACJyD,GAAag5F,EAAS,IAAQz8F,GAAK,GAAMy8F,EAAS,IAAY,GAAJz8F,GAI1DA,EAAI,OAAUA,GAAK,MACnByD,GAAag5F,EAAS,IAAQz8F,GAAK,IAAOy8F,EAAS,IAASz8F,GAAK,EAAK,IAASy8F,EAAS,IAAY,GAAJz8F,IAIpGjI,GAAK,EACLiI,EAAI,QAAiB,KAAJA,IAAc,GAA8B,KAAvBhF,EAAO1C,WAAWP,IAExD0L,GAAOg5F,EAAS,IAAQz8F,GAAK,IACvBy8F,EAAS,IAASz8F,GAAK,GAAM,IAC7By8F,EAAS,IAASz8F,GAAK,EAAK,IAC5By8F,EAAS,IAAY,GAAJz8F,GAC3B,CAEA,OAAOyD,CACX,EA4DIpH,SA9BW,SAASA,SAASD,GAC7B,SAAKA,GAAsB,iBAARA,OAITA,EAAIgN,aAAehN,EAAIgN,YAAY/M,UAAYD,EAAIgN,YAAY/M,SAASD,GACtF,EAyBIm2F,SAnCW,SAASA,SAASn2F,GAC7B,MAA+C,oBAAxC9B,OAAOE,UAAUwC,SAASqB,KAAKjC,EAC1C,EAkCI6wD,SApBW,SAASA,SAAS/uD,EAAK+M,GAClC,GAAIvO,EAAQwB,GAAM,CAEd,IADA,IAAIi/F,EAAS,GACJplG,EAAI,EAAGA,EAAImG,EAAIzF,OAAQV,GAAK,EACjColG,EAAOrkG,KAAKmS,EAAG/M,EAAInG,KAEvB,OAAOolG,CACX,CACA,OAAOlyF,EAAG/M,EACd,EAYI+vD,MA5MQ,SAASA,MAAMlrD,EAAQ8Q,EAAQjH,GAEvC,IAAKiH,EACD,OAAO9Q,EAGX,GAAsB,iBAAX8Q,EAAqB,CAC5B,GAAInX,EAAQqG,GACRA,EAAOjK,KAAK+a,OACT,KAAI9Q,GAA4B,iBAAXA,EAKxB,MAAO,CAACA,EAAQ8Q,IAJXjH,IAAYA,EAAQssF,cAAgBtsF,EAAQ0rF,mBAAsBn8E,EAAI9d,KAAK/D,OAAOE,UAAWqZ,MAC9F9Q,EAAO8Q,IAAU,EAIzB,CAEA,OAAO9Q,CACX,CAEA,IAAKA,GAA4B,iBAAXA,EAClB,MAAO,CAACA,GAAQX,OAAOyR,GAG3B,IAAIupF,EAAcr6F,EAKlB,OAJIrG,EAAQqG,KAAYrG,EAAQmX,KAC5BupF,EAAcV,EAAc35F,EAAQ6J,IAGpClQ,EAAQqG,IAAWrG,EAAQmX,IAC3BA,EAAOqO,SAAQ,SAAUkJ,EAAMrzB,GAC3B,GAAIokB,EAAI9d,KAAK0E,EAAQhL,GAAI,CACrB,IAAIslG,EAAat6F,EAAOhL,GACpBslG,GAAoC,iBAAfA,GAA2BjyE,GAAwB,iBAATA,EAC/DroB,EAAOhL,GAAKk2D,MAAMovC,EAAYjyE,EAAMxe,GAEpC7J,EAAOjK,KAAKsyB,EAEpB,MACIroB,EAAOhL,GAAKqzB,CAEpB,IACOroB,GAGJzI,OAAOyZ,KAAKF,GAAQsZ,QAAO,SAAUyvE,EAAKnwF,GAC7C,IAAI3R,EAAQ+Y,EAAOpH,GAOnB,OALI0P,EAAI9d,KAAKu+F,EAAKnwF,GACdmwF,EAAInwF,GAAOwhD,MAAM2uC,EAAInwF,GAAM3R,EAAO8R,GAElCgwF,EAAInwF,GAAO3R,EAER8hG,CACX,GAAGQ,EACP,+BCnGA,IAAIjhF,EAAM7hB,OAAOE,UAAU4R,eAU3B,SAASS,OAAO3C,GACd,IACE,OAAOkE,mBAAmBlE,EAAMtT,QAAQ,MAAO,KACjD,CAAE,MAAO0K,GACP,OAAO,IACT,CACF,CASA,SAAS+L,OAAOnD,GACd,IACE,OAAOmE,mBAAmBnE,EAC5B,CAAE,MAAO5I,GACP,OAAO,IACT,CACF,CAmFA1L,EAAQotC,UA1CR,SAASs6D,eAAelhG,EAAK8rF,GAC3BA,EAASA,GAAU,GAEnB,IACIptF,EACA2R,EAFAuzE,EAAQ,GASZ,IAAKvzE,IAFD,iBAAoBy7E,IAAQA,EAAS,KAE7B9rF,EACV,GAAI+f,EAAI9d,KAAKjC,EAAKqQ,GAAM,CAkBtB,IAjBA3R,EAAQsB,EAAIqQ,KAMG3R,UAAqC0S,MAAM1S,KACxDA,EAAQ,IAGV2R,EAAMY,OAAOZ,GACb3R,EAAQuS,OAAOvS,GAMH,OAAR2R,GAA0B,OAAV3R,EAAgB,SACpCklF,EAAMlnF,KAAK2T,EAAK,IAAK3R,EACvB,CAGF,OAAOklF,EAAMvnF,OAASyvF,EAASlI,EAAM/mF,KAAK,KAAO,EACnD,EAMArD,EAAQ+W,MA3ER,SAAS4wF,YAAYC,GAKnB,IAJA,IAEIl2D,EAFAm2D,EAAS,uBACTlqF,EAAS,CAAC,EAGP+zB,EAAOm2D,EAAOnkF,KAAKkkF,IAAQ,CAChC,IAAI/wF,EAAMI,OAAOy6B,EAAK,IAClBxsC,EAAQ+R,OAAOy6B,EAAK,IAUZ,OAAR76B,GAA0B,OAAV3R,GAAkB2R,KAAO8G,IAC7CA,EAAO9G,GAAO3R,EAChB,CAEA,OAAOyY,CACT,mBChEA,MAAM/P,EAAS,EAAQ,OACjBq5B,EAAS,EAAQ,OACjBuiD,EAAS57E,EAAI47E,MAGnBvpF,EAAOD,QAAU,MAAM8nG,QAMrB,WAAAt0F,CAAY+sE,EAAQn4E,GAElB,GADAhI,KAAK2nG,aAAaxnB,GACdA,aAAkBprD,OACpB/0B,KAAK4nG,WAAaznB,EAAOynB,WACzB5nG,KAAK6nG,UAAY1nB,EAAO0nB,UACxB1nB,EAASA,EAAOtiE,WAEX,IAAsB,iBAAXsiE,EAIhB,MAAM,IAAI98E,MAAM,+BAHhBrD,KAAK4nG,WAAa5/F,IAAyB,IAApBA,EAAE7G,QAAQ,KACjCnB,KAAK6nG,UAAY7/F,IAAyB,IAApBA,EAAE7G,QAAQ,IAGlC,CAEAnB,KAAK8nG,OAASt6F,EAAI2yE,EACpB,CASA,YAAAwnB,CAAaxnB,GAIXngF,KAAK8M,IAAoB,MAAdqzE,EAAOrzE,IAAcqzE,EAAOrzE,IACZ,MAAzB46F,QAAQljG,UAAUsI,IAAc46F,QAAQljG,UAAUsI,IAAM,IAI1D9M,KAAK+nG,aAAe5nB,EAAO4nB,aACzB5nB,EAAO4nB,aAAe/nG,KAAK+nG,aAAa5yE,QAEtCgrD,EAAO6nB,UACThoG,KAAKgoG,QAAU7nB,EAAO6nB,QAE1B,CAQA,GAAA93D,GACE,OAAOlwC,KAAKioG,KAAKjoG,KAAK8nG,OAAQ,GAChC,CAUA,IAAAG,CAAKC,EAAO3kC,GACV,IAAI9vD,EAAO9S,EAAKoH,EAAGhG,EAAGk3B,EAEtB,OAAQivE,EAAMzhG,MACZ,KAAK2iF,EAAM+e,KACX,KAAK/e,EAAMgf,MAET,GAAIF,EAAMG,YAAcH,EAAMI,cAAiB,MAAO,GAWtD,IARIJ,EAAMK,eAAkChiG,IAAtB2hG,EAAMM,cAC1BN,EAAMM,YAAcjlC,EAAOzgE,KAAK,MAAQ,GAM1CnC,EAAM,GACDoB,EAAI,EAAGk3B,GAJZxlB,EAAQy0F,EAAMtxF,QACZ5W,KAAKyoG,YAAYP,EAAMtxF,SAAWsxF,EAAMz0F,OAGpBhR,OAAQV,EAAIk3B,EAAGl3B,IACnCpB,GAAOX,KAAKioG,KAAKx0F,EAAM1R,GAAIwhE,GAM7B,OAHI2kC,EAAMK,WACRhlC,EAAO2kC,EAAMM,aAAe7nG,GAEvBA,EAET,KAAKyoF,EAAMsf,SAET,MAAO,GAET,KAAKtf,EAAMuf,IACT,IAAIC,EAAc5oG,KAAK6oG,QAAQX,GAC/B,OAAKU,EAAYnmG,OACV1B,OAAOC,aAAahB,KAAKyoG,YAAYG,IADV,GAGpC,KAAKxf,EAAM0f,WAMT,IAJA/gG,EAAI/H,KAAKgoG,QAAQE,EAAM99F,IACrB89F,EAAMp7F,MAAQ0H,IAAW0zF,EAAM99F,IAAMpK,KAAK8M,IAAMo7F,EAAMp7F,KAExDnM,EAAM,GACDoB,EAAI,EAAGA,EAAIgG,EAAGhG,IACjBpB,GAAOX,KAAKioG,KAAKC,EAAMpjG,MAAOy+D,GAGhC,OAAO5iE,EAET,KAAKyoF,EAAM2f,UACT,OAAOxlC,EAAO2kC,EAAMpjG,MAAQ,IAAM,GAEpC,KAAKskF,EAAM4f,KACT,IAAI5lG,EAAOpD,KAAK4nG,YAAc5nG,KAAKipG,YACjCjpG,KAAKkpG,aAAahB,EAAMpjG,OAASojG,EAAMpjG,MACzC,OAAO/D,OAAOC,aAAaoC,GAEjC,CAUA,YAAA8lG,CAAa9lG,GACX,OAAOA,GAAQ,IAAMA,GAAQA,GAAQ,KAAO,GAC1C,IAAMA,GAAQA,GAAQ,GAAO,GAAK,EACtC,CAQA,SAAA6lG,GACE,OAAQjpG,KAAKgoG,QAAQ,EAAG,EAC1B,CASA,WAAAS,CAAYzmG,GACV,OAAIA,aAAe6kC,EACV7kC,EAAI8U,MAAM9W,KAAKgoG,QAAQ,EAAGhmG,EAAIS,OAAS,IAEzCT,EAAIhC,KAAKgoG,QAAQ,EAAGhmG,EAAIS,OAAS,GAC1C,CAUA,OAAAomG,CAAQX,GACN,GAAIA,EAAMzhG,OAAS+G,EAAI47E,MAAM4f,KAC3B,OAAO,IAAIniE,EAAOqhE,EAAMpjG,OACnB,GAAIojG,EAAMzhG,OAAS+G,EAAI47E,MAAM+f,MAClC,OAAO,IAAItiE,EAAOqhE,EAAMrjG,KAAMqjG,EAAM9nC,IAC/B,CACL,IAAIgpC,EAAS,IAAIviE,EACjB,IAAK,IAAI9kC,EAAI,EAAGA,EAAImmG,EAAM37F,IAAI9J,OAAQV,IAAK,CACzC,IAAImlC,EAAWlnC,KAAK6oG,QAAQX,EAAM37F,IAAIxK,IAEtC,GADAqnG,EAAOziE,IAAIO,GACPlnC,KAAK4nG,WACP,IAAK,IAAI9+F,EAAI,EAAGA,EAAIo+B,EAASzkC,OAAQqG,IAAK,CACxC,IAAI1F,EAAO8jC,EAASpwB,MAAMhO,GACtBugG,EAAgBrpG,KAAKkpG,aAAa9lG,GAClCA,IAASimG,GACXD,EAAOziE,IAAI0iE,EAEf,CAEJ,CACA,OAAInB,EAAMl9B,IACDhrE,KAAK+nG,aAAa5yE,QAAQyR,SAASwiE,GAEnCppG,KAAK+nG,aAAa5yE,QAAQkS,UAAU+hE,EAE/C,CACF,CAUA,OAAApB,CAAQ/7F,EAAG/F,GACT,OAAO+F,EAAI9B,KAAK6J,MAAM7J,KAAK+mB,UAAY,EAAIhrB,EAAI+F,GACjD,CAMA,gBAAI87F,GACF,OAAO/nG,KAAKspG,OAAStpG,KAAKspG,QAAU,IAAIziE,EAAO,GAAI,IACrD,CAEA,gBAAIkhE,CAAan0F,GACf5T,KAAKspG,OAAS11F,CAChB,CAWA,cAAO21F,CAAQppB,EAAQn4E,GACrB,IAAIuhG,EAYJ,MAXqB,iBAAXppB,IACRA,EAAS,IAAIprD,OAAOorD,EAAQn4E,SAGNzB,IAApB45E,EAAOqpB,UACTD,EAAU,IAAI7B,QAAQvnB,EAAQn4E,GAC9Bm4E,EAAOqpB,SAAWD,IAElBA,EAAUppB,EAAOqpB,UACT7B,aAAaxnB,GAEhBopB,EAAQr5D,KACjB,CAMA,YAAOu5D,GAEL10E,OAAOvwB,UAAU0rC,IAAM,WACrB,OAAOw3D,QAAQ6B,QAAQvpG,KACzB,CACF,gDC/PE0pG,EAAY,MAIZC,EAAa,WAMjB,IAAI7lG,EAAS,gBACT8lG,EAAS,EAAAjkF,EAAOikF,QAAU,EAAAjkF,EAAOkkF,SAEjCD,GAAUA,EAAOE,gBACnBjqG,EAAOD,QAKT,SAASmqG,YAAajjG,EAAM45C,GAE1B,GAAI55C,EAAO6iG,EAAY,MAAM,IAAIvlG,WAAW,mCAE5C,IAAIuJ,EAAQ7J,EAAOc,YAAYkC,GAE/B,GAAIA,EAAO,EACT,GAAIA,EAAO4iG,EAET,IAAK,IAAIM,EAAY,EAAGA,EAAYljG,EAAMkjG,GAAaN,EAGrDE,EAAOE,gBAAgBn8F,EAAMtI,MAAM2kG,EAAWA,EAAYN,SAG5DE,EAAOE,gBAAgBn8F,GAI3B,GAAkB,mBAAP+yC,EACT,OAAO3/B,EAAQ6+E,UAAS,WACtBl/C,EAAG,KAAM/yC,EACX,IAGF,OAAOA,CACT,EA7BE9N,EAAOD,QAVT,SAASqqG,aACP,MAAM,IAAI5mG,MAAM,iHAClB,gCCVA,SAAS6mG,QAAQ9jG,GAAkC,OAAO8jG,QAAU,mBAAqBrmG,QAAU,iBAAmBA,OAAOukB,SAAW,SAAUhiB,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBvC,QAAUuC,EAAIgN,cAAgBvP,QAAUuC,IAAQvC,OAAOW,UAAY,gBAAkB4B,CAAK,EAAG8jG,QAAQ9jG,EAAM,CAE/U9B,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAETlF,EAAQuqG,qBAAkB,EAE1B,IAAIC,EAASC,uBAAuB,EAAQ,QAExCC,EAAmBD,uBAAuB,EAAQ,QAElDE,EAAY,CAAC,OAAQ,SAAU,UAAW,YAE9C,SAASF,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAE,QAAWA,EAAO,CAEhG,SAASsX,QAAQc,EAAQisF,GAAkB,IAAI1sF,EAAOzZ,OAAOyZ,KAAKS,GAAS,GAAIla,OAAOgoB,sBAAuB,CAAE,IAAIytE,EAAUz1F,OAAOgoB,sBAAsB9N,GAASisF,IAAmB1Q,EAAUA,EAAQvjE,QAAO,SAAUxjB,GAAO,OAAO1O,OAAO2Z,yBAAyBO,EAAQxL,GAAKtH,UAAY,KAAKqS,EAAKjb,KAAKkI,MAAM+S,EAAMg8E,EAAU,CAAE,OAAOh8E,CAAM,CAEpV,SAAS2sF,cAAc39F,GAAU,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CAAE,IAAI8b,EAAS,MAAQ3W,UAAUnF,GAAKmF,UAAUnF,GAAK,CAAC,EAAGA,EAAI,EAAI2b,QAAQpZ,OAAOuZ,IAAS,GAAIqO,SAAQ,SAAUzV,GAAOk0F,gBAAgB59F,EAAQ0J,EAAKoH,EAAOpH,GAAO,IAAKnS,OAAOsmG,0BAA4BtmG,OAAO4pB,iBAAiBnhB,EAAQzI,OAAOsmG,0BAA0B/sF,IAAWH,QAAQpZ,OAAOuZ,IAASqO,SAAQ,SAAUzV,GAAOnS,OAAOmH,eAAesB,EAAQ0J,EAAKnS,OAAO2Z,yBAAyBJ,EAAQpH,GAAO,GAAI,CAAE,OAAO1J,CAAQ,CAEzf,SAAS89F,yBAAyBhtF,EAAQitF,GAAY,GAAc,MAAVjtF,EAAgB,MAAO,CAAC,EAAG,IAAkEpH,EAAK1U,EAAnEgL,EAEzF,SAASg+F,8BAA8BltF,EAAQitF,GAAY,GAAc,MAAVjtF,EAAgB,MAAO,CAAC,EAAG,IAA2DpH,EAAK1U,EAA5DgL,EAAS,CAAC,EAAOi+F,EAAa1mG,OAAOyZ,KAAKF,GAAqB,IAAK9b,EAAI,EAAGA,EAAIipG,EAAWvoG,OAAQV,IAAO0U,EAAMu0F,EAAWjpG,GAAQ+oG,EAAS3pG,QAAQsV,IAAQ,IAAa1J,EAAO0J,GAAOoH,EAAOpH,IAAQ,OAAO1J,CAAQ,CAFhNg+F,CAA8BltF,EAAQitF,GAAuB,GAAIxmG,OAAOgoB,sBAAuB,CAAE,IAAI2+E,EAAmB3mG,OAAOgoB,sBAAsBzO,GAAS,IAAK9b,EAAI,EAAGA,EAAIkpG,EAAiBxoG,OAAQV,IAAO0U,EAAMw0F,EAAiBlpG,GAAQ+oG,EAAS3pG,QAAQsV,IAAQ,GAAkBnS,OAAOE,UAAUshB,qBAAqBzd,KAAKwV,EAAQpH,KAAgB1J,EAAO0J,GAAOoH,EAAOpH,GAAQ,CAAE,OAAO1J,CAAQ,CAM3e,SAASm+F,kBAAkBn+F,EAAQohB,GAAS,IAAK,IAAIpsB,EAAI,EAAGA,EAAIosB,EAAM1rB,OAAQV,IAAK,CAAE,IAAI0gB,EAAa0L,EAAMpsB,GAAI0gB,EAAW/W,WAAa+W,EAAW/W,aAAc,EAAO+W,EAAWlP,cAAe,EAAU,UAAWkP,IAAYA,EAAWnP,UAAW,GAAMhP,OAAOmH,eAAesB,EAAQ0V,EAAWhM,IAAKgM,EAAa,CAAE,CAM5T,SAAS0oF,gBAAgBx1C,EAAGy1C,GAA+G,OAA1GD,gBAAkB7mG,OAAOC,gBAAkB,SAAS4mG,gBAAgBx1C,EAAGy1C,GAAsB,OAAjBz1C,EAAErmC,UAAY87E,EAAUz1C,CAAG,EAAUw1C,gBAAgBx1C,EAAGy1C,EAAI,CAEzK,SAASC,aAAaC,GAAW,IAAIC,EAMrC,SAASC,4BAA8B,GAAuB,oBAAZhoF,UAA4BA,QAAQY,UAAW,OAAO,EAAO,GAAIZ,QAAQY,UAAUhB,KAAM,OAAO,EAAO,GAAqB,mBAAVqsB,MAAsB,OAAO,EAAM,IAAsF,OAAhFjO,QAAQh9B,UAAUyB,QAAQoC,KAAKmb,QAAQY,UAAUod,QAAS,IAAI,WAAa,MAAY,CAAM,CAAE,MAAOl2B,GAAK,OAAO,CAAO,CAAE,CANvQkgG,GAA6B,OAAO,SAASC,uBAAyB,IAAsCluF,EAAlCmuF,EAAQC,gBAAgBL,GAAkB,GAAIC,EAA2B,CAAE,IAAIvlF,EAAY2lF,gBAAgB3rG,MAAMoT,YAAamK,EAASiG,QAAQY,UAAUsnF,EAAOxkG,UAAW8e,EAAY,MAASzI,EAASmuF,EAAM1gG,MAAMhL,KAAMkH,WAAc,OAEpX,SAAS0kG,2BAA2BlmF,EAAMrd,GAAQ,GAAIA,IAA2B,WAAlB6hG,QAAQ7hG,IAAsC,mBAATA,GAAwB,OAAOA,EAAa,QAAa,IAATA,EAAmB,MAAM,IAAI1D,UAAU,4DAA+D,OAAOknG,uBAAuBnmF,EAAO,CAF4FkmF,CAA2B5rG,KAAMud,EAAS,CAAG,CAIxa,SAASsuF,uBAAuBnmF,GAAQ,QAAa,IAATA,EAAmB,MAAM,IAAImO,eAAe,6DAAgE,OAAOnO,CAAM,CAIrK,SAASimF,gBAAgBh2C,GAAwJ,OAAnJg2C,gBAAkBrnG,OAAOC,eAAiBD,OAAO8Z,eAAiB,SAASutF,gBAAgBh2C,GAAK,OAAOA,EAAErmC,WAAahrB,OAAO8Z,eAAeu3C,EAAI,EAAUg2C,gBAAgBh2C,EAAI,CAE5M,SAASg1C,gBAAgBvkG,EAAKqQ,EAAK3R,GAAiK,OAApJ2R,KAAOrQ,EAAO9B,OAAOmH,eAAerF,EAAKqQ,EAAK,CAAE3R,MAAOA,EAAO4G,YAAY,EAAM6H,cAAc,EAAMD,UAAU,IAAkBlN,EAAIqQ,GAAO3R,EAAgBsB,CAAK,CAEhN,IAAI+jG,EAA+B,SAAU2B,IAhB7C,SAASC,UAAUC,EAAUx/C,GAAc,GAA0B,mBAAfA,GAA4C,OAAfA,EAAuB,MAAM,IAAI7nD,UAAU,sDAAyDqnG,EAASxnG,UAAYF,OAAO6kB,OAAOqjC,GAAcA,EAAWhoD,UAAW,CAAE4O,YAAa,CAAEtO,MAAOknG,EAAU14F,UAAU,EAAMC,cAAc,KAAWjP,OAAOmH,eAAeugG,EAAU,YAAa,CAAE14F,UAAU,IAAck5C,GAAY2+C,gBAAgBa,EAAUx/C,EAAa,CAiBjcu/C,CAAU5B,gBAAiB2B,GAE3B,IAAIG,EAASZ,aAAalB,iBAE1B,SAASA,kBACP,IAAI+B,GA5BR,SAASC,gBAAgBC,EAAUC,GAAe,KAAMD,aAAoBC,GAAgB,MAAM,IAAI1nG,UAAU,oCAAwC,CA8BpJwnG,CAAgBnsG,KAAMmqG,iBAEtB,IAAK,IAAIxxE,EAAOzxB,UAAUzE,OAAQyhB,EAAO,IAAI/gB,MAAMw1B,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/E1U,EAAK0U,GAAQ1xB,UAAU0xB,GA0BzB,OArBA+xE,gBAAgBkB,uBAFhBK,EAAQD,EAAO5jG,KAAK2C,MAAMihG,EAAQ,CAACjsG,MAAMoM,OAAO8X,KAED,WAAW,SAAUk5B,GAClE,IAAIkvD,EAAcJ,EAAM/9E,MACpB3V,EAAO8zF,EAAY9zF,KACnB+B,EAAS+xF,EAAY/xF,OACrB84B,EAAWi5D,EAAYj5D,SACvBz8B,EAAU01F,EAAY11F,QAEtB21F,EAAOnC,EAAgB,QAAEoC,SAASC,KAAKp5D,GAEvC91B,GAAS,EAAI+sF,EAA0B,SAAG9xF,EAAM5B,GAEhD2D,GACFA,EAAO/B,EAAM+E,GAIXgvF,GAAQA,EAAKp+E,OAAuC,mBAAvBo+E,EAAKp+E,MAAMu+E,SAC1CH,EAAKp+E,MAAMu+E,QAAQtvD,EAEvB,IAEO8uD,CACT,CAoBA,OA5EF,SAASS,aAAaN,EAAaO,EAAYC,GAAyN,OAAtMD,GAAY1B,kBAAkBmB,EAAY7nG,UAAWooG,GAAiBC,GAAa3B,kBAAkBmB,EAAaQ,GAAcvoG,OAAOmH,eAAe4gG,EAAa,YAAa,CAAE/4F,UAAU,IAAiB+4F,CAAa,CA0D1RM,CAAaxC,gBAAiB,CAAC,CAC7B1zF,IAAK,SACL3R,MAAO,SAASu3C,SACd,IAAIywD,EAAe9sG,KAAKmuB,MAIpBklB,GAHQy5D,EAAat0F,KACXs0F,EAAavyF,OACZuyF,EAAal2F,QACbk2F,EAAaz5D,UACxBllB,EAAQ08E,yBAAyBiC,EAAcvC,GAE/CgC,EAAOnC,EAAgB,QAAEoC,SAASC,KAAKp5D,GAE3C,OAAoB+2D,EAAgB,QAAE2C,aAAaR,EAAM7B,cAAcA,cAAc,CAAC,EAAGv8E,GAAQ,CAAC,EAAG,CACnGu+E,QAAS1sG,KAAK0sG,UAElB,KAGKvC,eACT,CA3DmC,CA2DjCC,EAAgB,QAAE4C,eAEpBptG,EAAQuqG,gBAAkBA,EAE1BQ,gBAAgBR,EAAiB,eAAgB,CAC/C5vF,YAAQhU,EACRqQ,aAASrQ,kCC9GX,IACI4jG,EADW,EAAQ,OACQA,gBAE/BA,EAAgBA,gBAAkBA,EAClCtqG,EAAOD,QAAUuqG,gCCJjB,SAASD,QAAQ9jG,GAAkC,OAAO8jG,QAAU,mBAAqBrmG,QAAU,iBAAmBA,OAAOukB,SAAW,SAAUhiB,GAAO,cAAcA,CAAK,EAAI,SAAUA,GAAO,OAAOA,GAAO,mBAAqBvC,QAAUuC,EAAIgN,cAAgBvP,QAAUuC,IAAQvC,OAAOW,UAAY,gBAAkB4B,CAAK,EAAG8jG,QAAQ9jG,EAAM,CAE/U9B,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAETlF,EAAQqtG,mBAAgB,EAExB,IAAI7C,EAASC,uBAAuB,EAAQ,QAExC6C,EAAU7C,uBAAuB,EAAQ,QAEzCE,EAAY,CAAC,UAAW,WAAY,QAAS,YAAa,kBAAmB,qBAAsB,oBAAqB,YAAa,SAAU,YAEnJ,SAASF,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAE,QAAWA,EAAO,CAEhG,SAASykG,yBAAyBhtF,EAAQitF,GAAY,GAAc,MAAVjtF,EAAgB,MAAO,CAAC,EAAG,IAAkEpH,EAAK1U,EAAnEgL,EAEzF,SAASg+F,8BAA8BltF,EAAQitF,GAAY,GAAc,MAAVjtF,EAAgB,MAAO,CAAC,EAAG,IAA2DpH,EAAK1U,EAA5DgL,EAAS,CAAC,EAAOi+F,EAAa1mG,OAAOyZ,KAAKF,GAAqB,IAAK9b,EAAI,EAAGA,EAAIipG,EAAWvoG,OAAQV,IAAO0U,EAAMu0F,EAAWjpG,GAAQ+oG,EAAS3pG,QAAQsV,IAAQ,IAAa1J,EAAO0J,GAAOoH,EAAOpH,IAAQ,OAAO1J,CAAQ,CAFhNg+F,CAA8BltF,EAAQitF,GAAuB,GAAIxmG,OAAOgoB,sBAAuB,CAAE,IAAI2+E,EAAmB3mG,OAAOgoB,sBAAsBzO,GAAS,IAAK9b,EAAI,EAAGA,EAAIkpG,EAAiBxoG,OAAQV,IAAO0U,EAAMw0F,EAAiBlpG,GAAQ+oG,EAAS3pG,QAAQsV,IAAQ,GAAkBnS,OAAOE,UAAUshB,qBAAqBzd,KAAKwV,EAAQpH,KAAgB1J,EAAO0J,GAAOoH,EAAOpH,GAAQ,CAAE,OAAO1J,CAAQ,CAI3e,SAAS2Q,QAAQc,EAAQisF,GAAkB,IAAI1sF,EAAOzZ,OAAOyZ,KAAKS,GAAS,GAAIla,OAAOgoB,sBAAuB,CAAE,IAAIytE,EAAUz1F,OAAOgoB,sBAAsB9N,GAASisF,IAAmB1Q,EAAUA,EAAQvjE,QAAO,SAAUxjB,GAAO,OAAO1O,OAAO2Z,yBAAyBO,EAAQxL,GAAKtH,UAAY,KAAKqS,EAAKjb,KAAKkI,MAAM+S,EAAMg8E,EAAU,CAAE,OAAOh8E,CAAM,CAEpV,SAAS2sF,cAAc39F,GAAU,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CAAE,IAAI8b,EAAS,MAAQ3W,UAAUnF,GAAKmF,UAAUnF,GAAK,CAAC,EAAGA,EAAI,EAAI2b,QAAQpZ,OAAOuZ,IAAS,GAAIqO,SAAQ,SAAUzV,GAAOk0F,gBAAgB59F,EAAQ0J,EAAKoH,EAAOpH,GAAO,IAAKnS,OAAOsmG,0BAA4BtmG,OAAO4pB,iBAAiBnhB,EAAQzI,OAAOsmG,0BAA0B/sF,IAAWH,QAAQpZ,OAAOuZ,IAASqO,SAAQ,SAAUzV,GAAOnS,OAAOmH,eAAesB,EAAQ0J,EAAKnS,OAAO2Z,yBAAyBJ,EAAQpH,GAAO,GAAI,CAAE,OAAO1J,CAAQ,CAIzf,SAASm+F,kBAAkBn+F,EAAQohB,GAAS,IAAK,IAAIpsB,EAAI,EAAGA,EAAIosB,EAAM1rB,OAAQV,IAAK,CAAE,IAAI0gB,EAAa0L,EAAMpsB,GAAI0gB,EAAW/W,WAAa+W,EAAW/W,aAAc,EAAO+W,EAAWlP,cAAe,EAAU,UAAWkP,IAAYA,EAAWnP,UAAW,GAAMhP,OAAOmH,eAAesB,EAAQ0V,EAAWhM,IAAKgM,EAAa,CAAE,CAM5T,SAAS0oF,gBAAgBx1C,EAAGy1C,GAA+G,OAA1GD,gBAAkB7mG,OAAOC,gBAAkB,SAAS4mG,gBAAgBx1C,EAAGy1C,GAAsB,OAAjBz1C,EAAErmC,UAAY87E,EAAUz1C,CAAG,EAAUw1C,gBAAgBx1C,EAAGy1C,EAAI,CAEzK,SAASC,aAAaC,GAAW,IAAIC,EAMrC,SAASC,4BAA8B,GAAuB,oBAAZhoF,UAA4BA,QAAQY,UAAW,OAAO,EAAO,GAAIZ,QAAQY,UAAUhB,KAAM,OAAO,EAAO,GAAqB,mBAAVqsB,MAAsB,OAAO,EAAM,IAAsF,OAAhFjO,QAAQh9B,UAAUyB,QAAQoC,KAAKmb,QAAQY,UAAUod,QAAS,IAAI,WAAa,MAAY,CAAM,CAAE,MAAOl2B,GAAK,OAAO,CAAO,CAAE,CANvQkgG,GAA6B,OAAO,SAASC,uBAAyB,IAAsCluF,EAAlCmuF,EAAQC,gBAAgBL,GAAkB,GAAIC,EAA2B,CAAE,IAAIvlF,EAAY2lF,gBAAgB3rG,MAAMoT,YAAamK,EAASiG,QAAQY,UAAUsnF,EAAOxkG,UAAW8e,EAAY,MAASzI,EAASmuF,EAAM1gG,MAAMhL,KAAMkH,WAAc,OAEpX,SAAS0kG,2BAA2BlmF,EAAMrd,GAAQ,GAAIA,IAA2B,WAAlB6hG,QAAQ7hG,IAAsC,mBAATA,GAAwB,OAAOA,EAAa,QAAa,IAATA,EAAmB,MAAM,IAAI1D,UAAU,4DAA+D,OAAOknG,uBAAuBnmF,EAAO,CAF4FkmF,CAA2B5rG,KAAMud,EAAS,CAAG,CAIxa,SAASsuF,uBAAuBnmF,GAAQ,QAAa,IAATA,EAAmB,MAAM,IAAImO,eAAe,6DAAgE,OAAOnO,CAAM,CAIrK,SAASimF,gBAAgBh2C,GAAwJ,OAAnJg2C,gBAAkBrnG,OAAOC,eAAiBD,OAAO8Z,eAAiB,SAASutF,gBAAgBh2C,GAAK,OAAOA,EAAErmC,WAAahrB,OAAO8Z,eAAeu3C,EAAI,EAAUg2C,gBAAgBh2C,EAAI,CAE5M,SAASg1C,gBAAgBvkG,EAAKqQ,EAAK3R,GAAiK,OAApJ2R,KAAOrQ,EAAO9B,OAAOmH,eAAerF,EAAKqQ,EAAK,CAAE3R,MAAOA,EAAO4G,YAAY,EAAM6H,cAAc,EAAMD,UAAU,IAAkBlN,EAAIqQ,GAAO3R,EAAgBsB,CAAK,CAEhN,IAAI6mG,EAA6B,SAAUnB,IAhB3C,SAASC,UAAUC,EAAUx/C,GAAc,GAA0B,mBAAfA,GAA4C,OAAfA,EAAuB,MAAM,IAAI7nD,UAAU,sDAAyDqnG,EAASxnG,UAAYF,OAAO6kB,OAAOqjC,GAAcA,EAAWhoD,UAAW,CAAE4O,YAAa,CAAEtO,MAAOknG,EAAU14F,UAAU,EAAMC,cAAc,KAAWjP,OAAOmH,eAAeugG,EAAU,YAAa,CAAE14F,UAAU,IAAck5C,GAAY2+C,gBAAgBa,EAAUx/C,EAAa,CAiBjcu/C,CAAUkB,cAAenB,GAEzB,IAAIG,EAASZ,aAAa4B,eAE1B,SAASA,cAAc9+E,GACrB,IAAI+9E,GA5BR,SAASC,gBAAgBC,EAAUC,GAAe,KAAMD,aAAoBC,GAAgB,MAAM,IAAI1nG,UAAU,oCAAwC,CA8BpJwnG,CAAgBnsG,KAAMitG,eAItBtC,gBAAgBkB,uBAFhBK,EAAQD,EAAO5jG,KAAKrI,KAAMmuB,IAEqB,YAAY,SAAUivB,GACnEA,EAAM+vD,UACN,IAAIC,EAAWlB,EAAMxlF,MAAM5hB,MACvBuoG,EAAYnB,EAAM/9E,MAAMk/E,UAE5BnB,EAAMoB,SAAS,CACbxoG,MAAOs4C,EAAMrwC,OAAOjI,QACnB,WACD,IAAIA,EAAQonG,EAAMxlF,MAAM5hB,MAEpBA,EAAMrC,QAAU4qG,EAClBnB,EAAMqB,OAAOnwD,GAMXgwD,EAAS3qG,OAASqC,EAAMrC,QAC1BypG,EAAMqB,OAAO7C,cAAcA,cAAc,CAAC,EAAGttD,GAAQ,CAAC,EAAG,CACvDrwC,OAAQ29F,cAAcA,cAAc,CAAC,EAAGttD,EAAMrwC,QAAS,CAAC,EAAG,CACzDjI,MAAO,OAIf,GACF,IAEA6lG,gBAAgBkB,uBAAuBK,GAAQ,aAAa,SAAU9uD,GAClD,UAAdA,EAAM3mC,KACRy1F,EAAMsB,YAAYpwD,GAIpB,IAAIqwD,EAAYvB,EAAM/9E,MAAMs/E,UAExBA,IACFrwD,EAAM+vD,UACNM,EAAUrwD,GAEd,IAEAutD,gBAAgBkB,uBAAuBK,GAAQ,UAAU,SAAU9uD,GACjE8uD,EAAMsB,YAAYpwD,GAGlB,IAAIswD,EAASxB,EAAM/9E,MAAMu/E,OAErBA,IACFtwD,EAAM+vD,UACNO,EAAOtwD,GAEX,IAEAutD,gBAAgBkB,uBAAuBK,GAAQ,kBAAkB,SAAUyB,GACzE,GAAIA,EAAkB,EACpBzB,EAAMqB,OAAS,WACb,OAAO,IACT,OACK,GAAwB,IAApBI,EACTzB,EAAMqB,OAASrB,EAAM0B,aAChB,CACL,IAAIC,GAAsB,EAAIX,EAAiB,UAAG,SAAU9vD,GAC1D8uD,EAAM4B,cAAe,EAErB5B,EAAM0B,SAASxwD,EACjB,GAAGuwD,GAEHzB,EAAMqB,OAAS,SAAUnwD,GACvB8uD,EAAM4B,cAAe,EACrBD,EAAoBzwD,EACtB,EAEA8uD,EAAM95B,MAAQ,WACZ,OAAOy7B,EAAoBz7B,OAC7B,EAEA85B,EAAMh6B,OAAS,WACbg6B,EAAM4B,cAAe,EACrBD,EAAoB37B,QACtB,CACF,CACF,IAEAy4B,gBAAgBkB,uBAAuBK,GAAQ,YAAY,WAC1CA,EAAM/9E,MAAM4/E,SAClB/iG,WAAM,EAAQ9D,UACzB,IAEAyjG,gBAAgBkB,uBAAuBK,GAAQ,eAAe,SAAU9uD,GACtE,IAAIuwD,EAAkBzB,EAAM/9E,MAAMw/E,gBAElC,GAAKzB,EAAM4B,gBAAgBH,EAAkB,GAA7C,CAIIzB,EAAMh6B,QACRg6B,EAAMh6B,SAGR,IAAIptE,EAAQonG,EAAMxlF,MAAM5hB,MACpBuoG,EAAYnB,EAAM/9E,MAAMk/E,UAExBvoG,EAAMrC,QAAU4qG,EAClBnB,EAAM0B,SAASxwD,GAEf8uD,EAAM0B,SAASlD,cAAcA,cAAc,CAAC,EAAGttD,GAAQ,CAAC,EAAG,CACzDrwC,OAAQ29F,cAAcA,cAAc,CAAC,EAAGttD,EAAMrwC,QAAS,CAAC,EAAG,CACzDjI,MAAOA,MAdb,CAkBF,IAEAonG,EAAM4B,cAAe,EACrB5B,EAAMxlF,MAAQ,CACZ5hB,WAA8B,IAAhBqpB,EAAMrpB,OAAyC,OAAhBqpB,EAAMrpB,MAAiB,GAAKqpB,EAAMrpB,OAEjF,IAAIkpG,EAAoB9B,EAAM/9E,MAAMw/E,gBAIpC,OAFAzB,EAAM+B,eAAeD,GAEd9B,CACT,CA0FA,OAlPF,SAASS,aAAaN,EAAaO,EAAYC,GAAyN,OAAtMD,GAAY1B,kBAAkBmB,EAAY7nG,UAAWooG,GAAiBC,GAAa3B,kBAAkBmB,EAAaQ,GAAcvoG,OAAOmH,eAAe4gG,EAAa,YAAa,CAAE/4F,UAAU,IAAiB+4F,CAAa,CA0J1RM,CAAaM,cAAe,CAAC,CAC3Bx2F,IAAK,qBACL3R,MAAO,SAASopG,mBAAmBC,GACjC,IAAInuG,KAAK8tG,aAAT,CAIA,IAAIxB,EAActsG,KAAKmuB,MACnBrpB,EAAQwnG,EAAYxnG,MACpB6oG,EAAkBrB,EAAYqB,gBAC9BS,EAAaD,EAAUR,gBACvBP,EAAWe,EAAUrpG,MACrBupG,EAAaruG,KAAK0mB,MAAM5hB,WAEP,IAAVA,GAAyBsoG,IAAatoG,GAASupG,IAAevpG,GAGvE9E,KAAKstG,SAAS,CACZxoG,MAAOA,IAIP6oG,IAAoBS,GACtBpuG,KAAKiuG,eAAeN,EAlBtB,CAoBF,GACC,CACDl3F,IAAK,uBACL3R,MAAO,SAASwpG,uBACVtuG,KAAKoyE,OACPpyE,KAAKoyE,OAET,GACC,CACD37D,IAAK,SACL3R,MAAO,SAASu3C,SACd,IAcIkyD,EAcAC,EA5BA1B,EAAe9sG,KAAKmuB,MACpBkI,EAAUy2E,EAAaz2E,QAKvBo4E,GAJY3B,EAAaiB,SAChBjB,EAAahoG,MACTgoG,EAAaO,UACPP,EAAaa,gBACXb,EAAa2B,oBAClCC,EAAoB5B,EAAa4B,kBACjCjB,EAAYX,EAAaW,UACzBC,EAASZ,EAAaY,OACtBiB,EAAW7B,EAAa6B,SACxBxgF,EAAQ08E,yBAAyBiC,EAAcvC,GAE/CzlG,EAAQ9E,KAAK0mB,MAAM5hB,MAIrBypG,EADEE,EACe,CACfhB,UAAWztG,KAAKytG,WAETA,EACQ,CACfA,UAAWA,GAGI,CAAC,EAMlBe,EADEE,EACY,CACZhB,OAAQ1tG,KAAK0tG,QAENA,EACK,CACZA,OAAQA,GAGI,CAAC,EAGjB,IAAIkB,GAAWD,EAAW,CACxBngD,IAAKmgD,GACH,CAAC,EACL,OAAoBvE,EAAgB,QAAEnxF,cAAcod,EAASq0E,cAAcA,cAAcA,cAAcA,cAAc,CAAC,EAAGv8E,GAAQ,CAAC,EAAG,CACnI4/E,SAAU/tG,KAAK+tG,SACfjpG,MAAOA,GACNypG,GAAiBC,GAAcI,IACpC,KAGK3B,aACT,CAjOiC,CAiO/B7C,EAAgB,QAAE4C,eAEpBptG,EAAQqtG,cAAgBA,EAExBtC,gBAAgBsC,EAAe,eAAgB,CAC7C52E,QAAS,QACT5vB,KAAM,OACNgnG,eAAWlnG,EACXmnG,YAAQnnG,EACRzB,WAAOyB,EACP8mG,UAAW,EACXM,gBAAiB,IACjBc,oBAAoB,EACpBC,mBAAmB,EACnBC,cAAUpoG,gCC5RZ,IACI0mG,EADW,EAAQ,OACMA,cAE7BA,EAAcA,cAAgBA,EAC9BptG,EAAOD,QAAUqtG,gCCKJ,IAAI4B,EAAG,EAAQ,OAAS7mG,EAAE,EAAQ,OAAiB8mG,EAAE,EAAQ,OAAa,SAAS3iG,EAAEF,GAAG,IAAI,IAAI/F,EAAE,yDAAyD+F,EAAEjC,EAAE,EAAEA,EAAE9C,UAAUzE,OAAOuH,IAAI9D,GAAG,WAAWmS,mBAAmBnR,UAAU8C,IAAI,MAAM,yBAAyBiC,EAAE,WAAW/F,EAAE,gHAAgH,CAAC,IAAI2oG,EAAG,MAAMxrG,MAAM8I,EAAE,MAAM,IAAI4iG,EAAG,IAAIr/D,IAAIs/D,EAAG,CAAC,EAAE,SAASC,GAAGhjG,EAAE/F,GAAGgpG,GAAGjjG,EAAE/F,GAAGgpG,GAAGjjG,EAAE,UAAU/F,EAAE,CAC7e,SAASgpG,GAAGjjG,EAAE/F,GAAW,IAAR8oG,EAAG/iG,GAAG/F,EAAM+F,EAAE,EAAEA,EAAE/F,EAAEzD,OAAOwJ,IAAI8iG,EAAGpoE,IAAIzgC,EAAE+F,GAAG,CAC5D,IAAIkjG,IAAK,oBAAqB/0F,aAAQ,IAAqBA,OAAOtB,eAAU,IAAqBsB,OAAOtB,SAASG,eAAem2F,EAAG,8VAA8VC,EAAG/qG,OAAOE,UAAU4R,eACrfk5F,EAAG,CAAC,EAAEC,EAAG,CAAC,EAC8M,SAASvjF,EAAE/f,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,EAAE2H,GAAG3lB,KAAKwvG,gBAAgB,IAAItpG,GAAG,IAAIA,GAAG,IAAIA,EAAElG,KAAKyvG,cAAcxjD,EAAEjsD,KAAK0vG,mBAAmBpkG,EAAEtL,KAAK2vG,gBAAgB3lG,EAAEhK,KAAK4vG,aAAa3jG,EAAEjM,KAAKyG,KAAKP,EAAElG,KAAK6vG,YAAY7xF,EAAEhe,KAAK8vG,kBAAkBnqF,CAAC,CAAC,IAAIoqF,GAAE,CAAC,EACpb,uIAAuIp7F,MAAM,KAAKuX,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,SAAS,CAAC,UAAU,OAAO,CAAC,YAAY,eAAeigB,SAAQ,SAASjgB,GAAG,IAAI/F,EAAE+F,EAAE,GAAG8jG,GAAE7pG,GAAG,IAAI8lB,EAAE9lB,EAAE,GAAE,EAAG+F,EAAE,GAAG,MAAK,GAAG,EAAG,IAAG,CAAC,kBAAkB,YAAY,aAAa,SAASigB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE3E,cAAc,MAAK,GAAG,EAAG,IAC1e,CAAC,cAAc,4BAA4B,YAAY,iBAAiB4kB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,8OAA8O0I,MAAM,KAAKuX,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE3E,cAAc,MAAK,GAAG,EAAG,IACxb,CAAC,UAAU,WAAW,QAAQ,YAAY4kB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,YAAYigB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,OAAO,OAAO,OAAO,QAAQigB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,SAASigB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE3E,cAAc,MAAK,GAAG,EAAG,IAAG,IAAI0oG,GAAG,gBAAgB,SAASC,GAAGhkG,GAAG,OAAOA,EAAE,GAAGghC,aAAa,CAIxZ,SAASijE,GAAGjkG,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEykG,GAAE35F,eAAelQ,GAAG6pG,GAAE7pG,GAAG,MAAW,OAAOoF,EAAE,IAAIA,EAAE7E,MAAKwlD,IAAO,EAAE/lD,EAAEzD,SAAS,MAAMyD,EAAE,IAAI,MAAMA,EAAE,MAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,QAPnJ,SAASiqG,GAAGlkG,EAAE/F,EAAE8D,EAAEiiD,GAAG,GAAG,MAAO/lD,GADgG,SAASkqG,GAAGnkG,EAAE/F,EAAE8D,EAAEiiD,GAAG,GAAG,OAAOjiD,GAAG,IAAIA,EAAEvD,KAAK,OAAM,EAAG,cAAcP,GAAG,IAAK,WAAW,IAAK,SAAS,OAAM,EAAG,IAAK,UAAU,OAAG+lD,IAAc,OAAOjiD,GAASA,EAAEwlG,gBAAmD,WAAnCvjG,EAAEA,EAAE3E,cAAcjC,MAAM,EAAE,KAAsB,UAAU4G,GAAE,QAAQ,OAAM,EAAG,CAClUmkG,CAAGnkG,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAM,EAAG,GAAGA,EAAE,OAAM,EAAG,GAAG,OAAOjiD,EAAE,OAAOA,EAAEvD,MAAM,KAAK,EAAE,OAAOP,EAAE,KAAK,EAAE,OAAM,IAAKA,EAAE,KAAK,EAAE,OAAOsR,MAAMtR,GAAG,KAAK,EAAE,OAAOsR,MAAMtR,IAAI,EAAEA,EAAE,OAAM,CAAE,CAOvDiqG,CAAGjqG,EAAE8D,EAAEsB,EAAE2gD,KAAKjiD,EAAE,MAAMiiD,GAAG,OAAO3gD,EARpL,SAAS+kG,GAAGpkG,GAAG,QAAGojG,EAAGhnG,KAAKknG,EAAGtjG,KAAeojG,EAAGhnG,KAAKinG,EAAGrjG,KAAemjG,EAAG9tG,KAAK2K,GAAUsjG,EAAGtjG,IAAG,GAAGqjG,EAAGrjG,IAAG,GAAS,GAAE,CAQoEokG,CAAGnqG,KAAK,OAAO8D,EAAEiC,EAAE+1B,gBAAgB97B,GAAG+F,EAAEg2B,aAAa/7B,EAAE,GAAG8D,IAAIsB,EAAEqkG,gBAAgB1jG,EAAEX,EAAEskG,cAAc,OAAO5lG,EAAE,IAAIsB,EAAE7E,MAAQ,GAAGuD,GAAG9D,EAAEoF,EAAEmkG,cAAcxjD,EAAE3gD,EAAEokG,mBAAmB,OAAO1lG,EAAEiC,EAAE+1B,gBAAgB97B,IAAa8D,EAAE,KAAXsB,EAAEA,EAAE7E,OAAc,IAAI6E,IAAG,IAAKtB,EAAE,GAAG,GAAGA,EAAEiiD,EAAEhgD,EAAE64B,eAAemnB,EAAE/lD,EAAE8D,GAAGiC,EAAEg2B,aAAa/7B,EAAE8D,KAAK,CAHje,0jCAA0jC2K,MAAM,KAAKuX,SAAQ,SAASjgB,GAAG,IAAI/F,EAAE+F,EAAErL,QAAQovG,GACzmCC,IAAIF,GAAE7pG,GAAG,IAAI8lB,EAAE9lB,EAAE,GAAE,EAAG+F,EAAE,MAAK,GAAG,EAAG,IAAG,2EAA2E0I,MAAM,KAAKuX,SAAQ,SAASjgB,GAAG,IAAI/F,EAAE+F,EAAErL,QAAQovG,GAAGC,IAAIF,GAAE7pG,GAAG,IAAI8lB,EAAE9lB,EAAE,GAAE,EAAG+F,EAAE,gCAA+B,GAAG,EAAG,IAAG,CAAC,WAAW,WAAW,aAAaigB,SAAQ,SAASjgB,GAAG,IAAI/F,EAAE+F,EAAErL,QAAQovG,GAAGC,IAAIF,GAAE7pG,GAAG,IAAI8lB,EAAE9lB,EAAE,GAAE,EAAG+F,EAAE,wCAAuC,GAAG,EAAG,IAAG,CAAC,WAAW,eAAeigB,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE3E,cAAc,MAAK,GAAG,EAAG,IACldyoG,GAAEO,UAAU,IAAItkF,EAAE,YAAY,GAAE,EAAG,aAAa,gCAA+B,GAAG,GAAI,CAAC,MAAM,OAAO,SAAS,cAAcE,SAAQ,SAASjgB,GAAG8jG,GAAE9jG,GAAG,IAAI+f,EAAE/f,EAAE,GAAE,EAAGA,EAAE3E,cAAc,MAAK,GAAG,EAAG,IAE5L,IAAIipG,GAAG1B,EAAG2B,mDAAmDC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAAMC,GAAG,MAChN,GAAG,mBAAoB5tG,QAAQA,OAAOkyB,IAAI,CAAC,IAAIhjB,GAAElP,OAAOkyB,IAAI06E,GAAG19F,GAAE,iBAAiB29F,GAAG39F,GAAE,gBAAgB49F,GAAG59F,GAAE,kBAAkB69F,GAAG79F,GAAE,qBAAqB89F,GAAG99F,GAAE,kBAAkB+9F,GAAG/9F,GAAE,kBAAkBg+F,GAAGh+F,GAAE,iBAAiBi+F,GAAGj+F,GAAE,qBAAqBk+F,GAAGl+F,GAAE,kBAAkBm+F,GAAGn+F,GAAE,uBAAuBo+F,GAAGp+F,GAAE,cAAcq+F,GAAGr+F,GAAE,cAAcs+F,GAAGt+F,GAAE,eAAeA,GAAE,eAAeu+F,GAAGv+F,GAAE,mBAAmBw+F,GAAGx+F,GAAE,0BAA0By+F,GAAGz+F,GAAE,mBAAmB0+F,GAAG1+F,GAAE,sBAAsB,CAC9d,IAAmL2+F,GAA/KC,GAAG,mBAAoB9tG,QAAQA,OAAOukB,SAAS,SAASwpF,GAAG3lG,GAAG,OAAG,OAAOA,GAAG,iBAAkBA,EAAS,KAAwC,mBAAnCA,EAAE0lG,IAAI1lG,EAAE0lG,KAAK1lG,EAAE,eAA0CA,EAAE,IAAI,CAAQ,SAAS4lG,GAAG5lG,GAAG,QAAG,IAASylG,GAAG,IAAI,MAAMruG,OAAQ,CAAC,MAAM2G,GAAG,IAAI9D,EAAE8D,EAAEyJ,MAAMxS,OAAOJ,MAAM,gBAAgB6wG,GAAGxrG,GAAGA,EAAE,IAAI,EAAE,CAAC,MAAM,KAAKwrG,GAAGzlG,CAAC,CAAC,IAAI6lG,IAAG,EACjU,SAASC,GAAG9lG,EAAE/F,GAAG,IAAI+F,GAAG6lG,GAAG,MAAM,GAAGA,IAAG,EAAG,IAAI9nG,EAAE3G,MAAMoe,kBAAkBpe,MAAMoe,uBAAkB,EAAO,IAAI,GAAGvb,EAAE,GAAGA,EAAE,WAAW,MAAM7C,OAAQ,EAAEiB,OAAOmH,eAAevF,EAAE1B,UAAU,QAAQ,CAAC+H,IAAI,WAAW,MAAMlJ,OAAQ,IAAI,iBAAkBmgB,SAASA,QAAQY,UAAU,CAAC,IAAIZ,QAAQY,UAAUle,EAAE,GAAG,CAAC,MAAM+pD,GAAG,IAAIhE,EAAEgE,CAAC,CAACzsC,QAAQY,UAAUnY,EAAE,GAAG/F,EAAE,KAAK,CAAC,IAAIA,EAAEmC,MAAM,CAAC,MAAM4nD,GAAGhE,EAAEgE,CAAC,CAAChkD,EAAE5D,KAAKnC,EAAE1B,UAAU,KAAK,CAAC,IAAI,MAAMnB,OAAQ,CAAC,MAAM4sD,GAAGhE,EAAEgE,CAAC,CAAChkD,GAAG,CAAC,CAAC,MAAMgkD,GAAG,GAAGA,GAAGhE,GAAG,iBAAkBgE,EAAEx8C,MAAM,CAAC,IAAI,IAAInI,EAAE2kD,EAAEx8C,MAAMkB,MAAM,MACnfqJ,EAAEiuC,EAAEx4C,MAAMkB,MAAM,MAAMgR,EAAEra,EAAE7I,OAAO,EAAEmzD,EAAE53C,EAAEvb,OAAO,EAAE,GAAGkjB,GAAG,GAAGiwC,GAAGtqD,EAAEqa,KAAK3H,EAAE43C,IAAIA,IAAI,KAAK,GAAGjwC,GAAG,GAAGiwC,EAAEjwC,IAAIiwC,IAAI,GAAGtqD,EAAEqa,KAAK3H,EAAE43C,GAAG,CAAC,GAAG,IAAIjwC,GAAG,IAAIiwC,EAAG,MAAMjwC,IAAQ,IAAJiwC,GAAStqD,EAAEqa,KAAK3H,EAAE43C,GAAG,MAAM,KAAKtqD,EAAEqa,GAAG/kB,QAAQ,WAAW,cAAc,GAAG+kB,GAAG,GAAGiwC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQk8C,IAAG,EAAGzuG,MAAMoe,kBAAkBzX,CAAC,CAAC,OAAOiC,EAAEA,EAAEA,EAAE+/B,aAAa//B,EAAEuH,KAAK,IAAIq+F,GAAG5lG,GAAG,EAAE,CAC/T,SAAS+lG,GAAG/lG,GAAG,OAAOA,EAAEqR,KAAK,KAAK,EAAE,OAAOu0F,GAAG5lG,EAAExF,MAAM,KAAK,GAAG,OAAOorG,GAAG,QAAQ,KAAK,GAAG,OAAOA,GAAG,YAAY,KAAK,GAAG,OAAOA,GAAG,gBAAgB,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO5lG,EAAE8lG,GAAG9lG,EAAExF,MAAK,GAAM,KAAK,GAAG,OAAOwF,EAAE8lG,GAAG9lG,EAAExF,KAAK41C,QAAO,GAAM,KAAK,GAAG,OAAOpwC,EAAE8lG,GAAG9lG,EAAExF,KAAKwrG,SAAQ,GAAM,KAAK,EAAE,OAAOhmG,EAAE8lG,GAAG9lG,EAAExF,MAAK,GAAM,QAAQ,MAAM,GAAG,CACjU,SAASyrG,GAAGjmG,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,mBAAoBA,EAAE,OAAOA,EAAE+/B,aAAa//B,EAAEuH,MAAM,KAAK,GAAG,iBAAkBvH,EAAE,OAAOA,EAAE,OAAOA,GAAG,KAAK0kG,GAAG,MAAM,WAAW,KAAKD,GAAG,MAAM,SAAS,KAAKG,GAAG,MAAM,WAAW,KAAKD,GAAG,MAAM,aAAa,KAAKK,GAAG,MAAM,WAAW,KAAKC,GAAG,MAAM,eAAe,GAAG,iBAAkBjlG,EAAE,OAAOA,EAAE4pB,UAAU,KAAKk7E,GAAG,OAAO9kG,EAAE+/B,aAAa,WAAW,YAAY,KAAK8kE,GAAG,OAAO7kG,EAAEkmG,SAASnmE,aAAa,WAAW,YAAY,KAAKglE,GAAG,IAAI9qG,EAAE+F,EAAEowC,OACnd,OAD0dn2C,EAAEA,EAAE8lC,aAAa9lC,EAAEsN,MAAM,GAC5evH,EAAE+/B,cAAc,KAAK9lC,EAAE,cAAcA,EAAE,IAAI,cAAc,KAAKirG,GAAG,OAAOe,GAAGjmG,EAAExF,MAAM,KAAK4qG,GAAG,OAAOa,GAAGjmG,EAAEgmG,SAAS,KAAKb,GAAGlrG,EAAE+F,EAAEmmG,SAASnmG,EAAEA,EAAEomG,MAAM,IAAI,OAAOH,GAAGjmG,EAAE/F,GAAG,CAAC,MAAM8D,GAAG,EAAE,OAAO,IAAI,CAAC,SAASsoG,GAAGrmG,GAAG,cAAcA,GAAG,IAAK,UAAU,IAAK,SAAS,IAAK,SAAS,IAAK,SAAS,IAAK,YAAY,OAAOA,EAAE,QAAQ,MAAM,GAAG,CAAC,SAASsmG,GAAGtmG,GAAG,IAAI/F,EAAE+F,EAAExF,KAAK,OAAOwF,EAAEA,EAAEo3B,WAAW,UAAUp3B,EAAE3E,gBAAgB,aAAapB,GAAG,UAAUA,EAAE,CAE5Z,SAASssG,GAAGvmG,GAAGA,EAAEwmG,gBAAgBxmG,EAAEwmG,cADvD,SAASC,GAAGzmG,GAAG,IAAI/F,EAAEqsG,GAAGtmG,GAAG,UAAU,QAAQjC,EAAE1F,OAAO2Z,yBAAyBhS,EAAEmH,YAAY5O,UAAU0B,GAAG+lD,EAAE,GAAGhgD,EAAE/F,GAAG,IAAI+F,EAAEmK,eAAelQ,SAAI,IAAqB8D,GAAG,mBAAoBA,EAAE2B,KAAK,mBAAoB3B,EAAEuC,IAAI,CAAC,IAAIjB,EAAEtB,EAAE2B,IAAIqS,EAAEhU,EAAEuC,IAAiL,OAA7KjI,OAAOmH,eAAeQ,EAAE/F,EAAE,CAACqN,cAAa,EAAG5H,IAAI,WAAW,OAAOL,EAAEjD,KAAKrI,KAAK,EAAEuM,IAAI,SAASN,GAAGggD,EAAE,GAAGhgD,EAAE+R,EAAE3V,KAAKrI,KAAKiM,EAAE,IAAI3H,OAAOmH,eAAeQ,EAAE/F,EAAE,CAACwF,WAAW1B,EAAE0B,aAAmB,CAAC26E,SAAS,WAAW,OAAOp6B,CAAC,EAAE0mD,SAAS,SAAS1mG,GAAGggD,EAAE,GAAGhgD,CAAC,EAAE2mG,aAAa,WAAW3mG,EAAEwmG,cACxf,YAAYxmG,EAAE/F,EAAE,EAAE,CAAC,CAAkDwsG,CAAGzmG,GAAG,CAAC,SAAS4mG,GAAG5mG,GAAG,IAAIA,EAAE,OAAM,EAAG,IAAI/F,EAAE+F,EAAEwmG,cAAc,IAAIvsG,EAAE,OAAM,EAAG,IAAI8D,EAAE9D,EAAEmgF,WAAep6B,EAAE,GAAqD,OAAlDhgD,IAAIggD,EAAEsmD,GAAGtmG,GAAGA,EAAE3F,QAAQ,OAAO,QAAQ2F,EAAEnH,QAAOmH,EAAEggD,KAAajiD,IAAG9D,EAAEysG,SAAS1mG,IAAG,EAAM,CAAC,SAAS6mG,GAAG7mG,GAAwD,QAAG,KAAxDA,EAAEA,IAAI,oBAAqB6M,SAASA,cAAS,IAAkC,OAAO,KAAK,IAAI,OAAO7M,EAAE8mG,eAAe9mG,EAAEuO,IAAI,CAAC,MAAMtU,GAAG,OAAO+F,EAAEuO,IAAI,CAAC,CACpa,SAASw4F,GAAG/mG,EAAE/F,GAAG,IAAI8D,EAAE9D,EAAEI,QAAQ,OAAO0B,EAAE,CAAC,EAAE9B,EAAE,CAAC+sG,oBAAe,EAAOxiB,kBAAa,EAAO3rF,WAAM,EAAOwB,QAAQ,MAAM0D,EAAEA,EAAEiC,EAAEinG,cAAcC,gBAAgB,CAAC,SAASC,GAAGnnG,EAAE/F,GAAG,IAAI8D,EAAE,MAAM9D,EAAEuqF,aAAa,GAAGvqF,EAAEuqF,aAAaxkC,EAAE,MAAM/lD,EAAEI,QAAQJ,EAAEI,QAAQJ,EAAE+sG,eAAejpG,EAAEsoG,GAAG,MAAMpsG,EAAEpB,MAAMoB,EAAEpB,MAAMkF,GAAGiC,EAAEinG,cAAc,CAACC,eAAelnD,EAAE8mC,aAAa/oF,EAAEqpG,WAAW,aAAantG,EAAEO,MAAM,UAAUP,EAAEO,KAAK,MAAMP,EAAEI,QAAQ,MAAMJ,EAAEpB,MAAM,CAAC,SAASwuG,GAAGrnG,EAAE/F,GAAe,OAAZA,EAAEA,EAAEI,UAAiB4pG,GAAGjkG,EAAE,UAAU/F,GAAE,EAAG,CAC9d,SAASqtG,GAAGtnG,EAAE/F,GAAGotG,GAAGrnG,EAAE/F,GAAG,IAAI8D,EAAEsoG,GAAGpsG,EAAEpB,OAAOmnD,EAAE/lD,EAAEO,KAAK,GAAG,MAAMuD,EAAK,WAAWiiD,GAAM,IAAIjiD,GAAG,KAAKiC,EAAEnH,OAAOmH,EAAEnH,OAAOkF,KAAEiC,EAAEnH,MAAM,GAAGkF,GAAOiC,EAAEnH,QAAQ,GAAGkF,IAAIiC,EAAEnH,MAAM,GAAGkF,QAAQ,GAAG,WAAWiiD,GAAG,UAAUA,EAA8B,YAA3BhgD,EAAE+1B,gBAAgB,SAAgB97B,EAAEkQ,eAAe,SAASo9F,GAAGvnG,EAAE/F,EAAEO,KAAKuD,GAAG9D,EAAEkQ,eAAe,iBAAiBo9F,GAAGvnG,EAAE/F,EAAEO,KAAK6rG,GAAGpsG,EAAEuqF,eAAe,MAAMvqF,EAAEI,SAAS,MAAMJ,EAAE+sG,iBAAiBhnG,EAAEgnG,iBAAiB/sG,EAAE+sG,eAAe,CACla,SAASvyD,GAAGz0C,EAAE/F,EAAE8D,GAAG,GAAG9D,EAAEkQ,eAAe,UAAUlQ,EAAEkQ,eAAe,gBAAgB,CAAC,IAAI61C,EAAE/lD,EAAEO,KAAK,KAAK,WAAWwlD,GAAG,UAAUA,QAAG,IAAS/lD,EAAEpB,OAAO,OAAOoB,EAAEpB,OAAO,OAAOoB,EAAE,GAAG+F,EAAEinG,cAAcngB,aAAa/oF,GAAG9D,IAAI+F,EAAEnH,QAAQmH,EAAEnH,MAAMoB,GAAG+F,EAAEwkF,aAAavqF,CAAC,CAAU,MAAT8D,EAAEiC,EAAEuH,QAAcvH,EAAEuH,KAAK,IAAIvH,EAAEgnG,iBAAiBhnG,EAAEinG,cAAcC,eAAe,KAAKnpG,IAAIiC,EAAEuH,KAAKxJ,EAAE,CACzV,SAASwpG,GAAGvnG,EAAE/F,EAAE8D,GAAM,WAAW9D,GAAG4sG,GAAG7mG,EAAE2wB,iBAAiB3wB,IAAE,MAAMjC,EAAEiC,EAAEwkF,aAAa,GAAGxkF,EAAEinG,cAAcngB,aAAa9mF,EAAEwkF,eAAe,GAAGzmF,IAAIiC,EAAEwkF,aAAa,GAAGzmF,GAAE,CAAsF,SAASypG,GAAGxnG,EAAE/F,GAA6D,OAA1D+F,EAAEjE,EAAE,CAACqrC,cAAS,GAAQntC,IAAMA,EAAlI,SAASwtG,GAAGznG,GAAG,IAAI/F,EAAE,GAAuD,OAApD2oG,EAAGrC,SAAStgF,QAAQjgB,GAAE,SAASA,GAAG,MAAMA,IAAI/F,GAAG+F,EAAE,IAAU/F,CAAC,CAAgDwtG,CAAGxtG,EAAEmtC,aAAUpnC,EAAEonC,SAASntC,GAAS+F,CAAC,CACxU,SAAS0nG,GAAG1nG,EAAE/F,EAAE8D,EAAEiiD,GAAe,GAAZhgD,EAAEA,EAAE2K,QAAW1Q,EAAE,CAACA,EAAE,CAAC,EAAE,IAAI,IAAIoF,EAAE,EAAEA,EAAEtB,EAAEvH,OAAO6I,IAAIpF,EAAE,IAAI8D,EAAEsB,KAAI,EAAG,IAAItB,EAAE,EAAEA,EAAEiC,EAAExJ,OAAOuH,IAAIsB,EAAEpF,EAAEkQ,eAAe,IAAInK,EAAEjC,GAAGlF,OAAOmH,EAAEjC,GAAG4pG,WAAWtoG,IAAIW,EAAEjC,GAAG4pG,SAAStoG,GAAGA,GAAG2gD,IAAIhgD,EAAEjC,GAAG6pG,iBAAgB,EAAG,KAAK,CAAmB,IAAlB7pG,EAAE,GAAGsoG,GAAGtoG,GAAG9D,EAAE,KAASoF,EAAE,EAAEA,EAAEW,EAAExJ,OAAO6I,IAAI,CAAC,GAAGW,EAAEX,GAAGxG,QAAQkF,EAAiD,OAA9CiC,EAAEX,GAAGsoG,UAAS,OAAG3nD,IAAIhgD,EAAEX,GAAGuoG,iBAAgB,IAAW,OAAO3tG,GAAG+F,EAAEX,GAAGwoG,WAAW5tG,EAAE+F,EAAEX,GAAG,CAAC,OAAOpF,IAAIA,EAAE0tG,UAAS,EAAG,CAAC,CACxY,SAASG,GAAG9nG,EAAE/F,GAAG,GAAG,MAAMA,EAAE8tG,wBAAwB,MAAM3wG,MAAM8I,EAAE,KAAK,OAAOnE,EAAE,CAAC,EAAE9B,EAAE,CAACpB,WAAM,EAAO2rF,kBAAa,EAAOp9C,SAAS,GAAGpnC,EAAEinG,cAAcngB,cAAc,CAAC,SAASkhB,GAAGhoG,EAAE/F,GAAG,IAAI8D,EAAE9D,EAAEpB,MAAM,GAAG,MAAMkF,EAAE,CAA+B,GAA9BA,EAAE9D,EAAEmtC,SAASntC,EAAEA,EAAEuqF,aAAgB,MAAMzmF,EAAE,CAAC,GAAG,MAAM9D,EAAE,MAAM7C,MAAM8I,EAAE,KAAK,GAAGhJ,MAAMuD,QAAQsD,GAAG,CAAC,KAAK,GAAGA,EAAEvH,QAAQ,MAAMY,MAAM8I,EAAE,KAAKnC,EAAEA,EAAE,EAAE,CAAC9D,EAAE8D,CAAC,CAAC,MAAM9D,IAAIA,EAAE,IAAI8D,EAAE9D,CAAC,CAAC+F,EAAEinG,cAAc,CAACngB,aAAauf,GAAGtoG,GAAG,CAClZ,SAASkqG,GAAGjoG,EAAE/F,GAAG,IAAI8D,EAAEsoG,GAAGpsG,EAAEpB,OAAOmnD,EAAEqmD,GAAGpsG,EAAEuqF,cAAc,MAAMzmF,KAAIA,EAAE,GAAGA,KAAMiC,EAAEnH,QAAQmH,EAAEnH,MAAMkF,GAAG,MAAM9D,EAAEuqF,cAAcxkF,EAAEwkF,eAAezmF,IAAIiC,EAAEwkF,aAAazmF,IAAI,MAAMiiD,IAAIhgD,EAAEwkF,aAAa,GAAGxkC,EAAE,CAAC,SAASkoD,GAAGloG,GAAG,IAAI/F,EAAE+F,EAAEiN,YAAYhT,IAAI+F,EAAEinG,cAAcngB,cAAc,KAAK7sF,GAAG,OAAOA,IAAI+F,EAAEnH,MAAMoB,EAAE,CAAC,IAAIkuG,GAAG,CAACznF,KAAK,+BAA+B0nF,OAAO,qCAAqCv6E,IAAI,8BAC9X,SAASw6E,GAAGroG,GAAG,OAAOA,GAAG,IAAK,MAAM,MAAM,6BAA6B,IAAK,OAAO,MAAM,qCAAqC,QAAQ,MAAM,+BAA+B,CAAC,SAASsoG,GAAGtoG,EAAE/F,GAAG,OAAO,MAAM+F,GAAG,iCAAiCA,EAAEqoG,GAAGpuG,GAAG,+BAA+B+F,GAAG,kBAAkB/F,EAAE,+BAA+B+F,CAAC,CAC5U,IAAIuoG,GAAevoG,GAAZwoG,IAAYxoG,GAAsJ,SAASA,EAAE/F,GAAG,GAAG+F,EAAEq1B,eAAe8yE,GAAGt6E,KAAK,cAAc7tB,EAAEA,EAAE02B,UAAUz8B,MAAM,CAA2F,KAA1FsuG,GAAGA,IAAI17F,SAASG,cAAc,QAAU0pB,UAAU,QAAQz8B,EAAED,UAAUe,WAAW,SAAad,EAAEsuG,GAAGjvE,WAAWt5B,EAAEs5B,YAAYt5B,EAAEmP,YAAYnP,EAAEs5B,YAAY,KAAKr/B,EAAEq/B,YAAYt5B,EAAEwO,YAAYvU,EAAEq/B,WAAW,CAAC,EAAja,oBAAqBmvE,OAAOA,MAAMC,wBAAwB,SAASzuG,EAAE8D,EAAEiiD,EAAE3gD,GAAGopG,MAAMC,yBAAwB,WAAW,OAAO1oG,GAAE/F,EAAE8D,EAAM,GAAE,EAAEiC,IACtK,SAAS2oG,GAAG3oG,EAAE/F,GAAG,GAAGA,EAAE,CAAC,IAAI8D,EAAEiC,EAAEs5B,WAAW,GAAGv7B,GAAGA,IAAIiC,EAAE4oG,WAAW,IAAI7qG,EAAE2xB,SAAwB,YAAd3xB,EAAE0zC,UAAUx3C,EAAS,CAAC+F,EAAEiN,YAAYhT,CAAC,CACtH,IAAI4uG,GAAG,CAACC,yBAAwB,EAAGC,mBAAkB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,SAAQ,EAAGC,cAAa,EAAGC,iBAAgB,EAAGC,aAAY,EAAGC,SAAQ,EAAGC,MAAK,EAAGC,UAAS,EAAGC,cAAa,EAAGC,YAAW,EAAGC,cAAa,EAAGC,WAAU,EAAGC,UAAS,EAAGC,SAAQ,EAAGC,YAAW,EAAGC,aAAY,EAAGC,cAAa,EAAGC,YAAW,EAAGC,eAAc,EAAGC,gBAAe,EAAGC,iBAAgB,EAAGC,YAAW,EAAGC,WAAU,EAAGC,YAAW,EAAGC,SAAQ,EAAGC,OAAM,EAAGC,SAAQ,EAAGC,SAAQ,EAAGC,QAAO,EAAGC,QAAO,EAAGC,MAAK,EAAGC,aAAY,EAC1fC,cAAa,EAAGC,aAAY,EAAGC,iBAAgB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,eAAc,EAAGC,aAAY,GAAIC,GAAG,CAAC,SAAS,KAAK,MAAM,KAA6H,SAASC,GAAGzrG,EAAE/F,EAAE8D,GAAG,OAAO,MAAM9D,GAAG,kBAAmBA,GAAG,KAAKA,EAAE,GAAG8D,GAAG,iBAAkB9D,GAAG,IAAIA,GAAG4uG,GAAG1+F,eAAenK,IAAI6oG,GAAG7oG,IAAI,GAAG/F,GAAGjF,OAAOiF,EAAE,IAAI,CACla,SAASyxG,GAAG1rG,EAAE/F,GAAa,IAAI,IAAI8D,KAAlBiC,EAAEA,EAAEmN,MAAmBlT,EAAE,GAAGA,EAAEkQ,eAAepM,GAAG,CAAC,IAAIiiD,EAAE,IAAIjiD,EAAE7I,QAAQ,MAAMmK,EAAEosG,GAAG1tG,EAAE9D,EAAE8D,GAAGiiD,GAAG,UAAUjiD,IAAIA,EAAE,YAAYiiD,EAAEhgD,EAAE2rG,YAAY5tG,EAAEsB,GAAGW,EAAEjC,GAAGsB,CAAC,CAAC,CADXhH,OAAOyZ,KAAK+2F,IAAI5oF,SAAQ,SAASjgB,GAAGwrG,GAAGvrF,SAAQ,SAAShmB,GAAGA,EAAEA,EAAE+F,EAAEokB,OAAO,GAAG4c,cAAchhC,EAAE+sC,UAAU,GAAG87D,GAAG5uG,GAAG4uG,GAAG7oG,EAAE,GAAE,IACzG,IAAI4rG,GAAG7vG,EAAE,CAAC8vG,UAAS,GAAI,CAACC,MAAK,EAAGpkB,MAAK,EAAGqkB,IAAG,EAAGC,KAAI,EAAGC,OAAM,EAAGC,IAAG,EAAGC,KAAI,EAAGlkG,OAAM,EAAGmkG,QAAO,EAAGC,MAAK,EAAGhjB,MAAK,EAAGijB,OAAM,EAAG16F,QAAO,EAAG26F,OAAM,EAAGC,KAAI,IAClT,SAASC,GAAGzsG,EAAE/F,GAAG,GAAGA,EAAE,CAAC,GAAG2xG,GAAG5rG,KAAK,MAAM/F,EAAEmtC,UAAU,MAAMntC,EAAE8tG,yBAAyB,MAAM3wG,MAAM8I,EAAE,IAAIF,IAAI,GAAG,MAAM/F,EAAE8tG,wBAAwB,CAAC,GAAG,MAAM9tG,EAAEmtC,SAAS,MAAMhwC,MAAM8I,EAAE,KAAK,GAAK,iBAAkBjG,EAAE8tG,2BAAyB,WAAW9tG,EAAE8tG,yBAAyB,MAAM3wG,MAAM8I,EAAE,IAAK,CAAC,GAAG,MAAMjG,EAAEkT,OAAO,iBAAkBlT,EAAEkT,MAAM,MAAM/V,MAAM8I,EAAE,IAAK,CAAC,CAClW,SAASwsG,GAAG1sG,EAAE/F,GAAG,IAAI,IAAI+F,EAAE9K,QAAQ,KAAK,MAAM,iBAAkB+E,EAAE2tD,GAAG,OAAO5nD,GAAG,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,YAAY,IAAK,gBAAgB,IAAK,gBAAgB,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,gBAAgB,OAAM,EAAG,QAAQ,OAAM,EAAG,CAAC,SAAS2sG,GAAG3sG,GAA6F,OAA1FA,EAAEA,EAAEc,QAAQd,EAAE4sG,YAAYz+F,QAAS0+F,0BAA0B7sG,EAAEA,EAAE6sG,yBAAgC,IAAI7sG,EAAE0vB,SAAS1vB,EAAE01B,WAAW11B,CAAC,CAAC,IAAI8sG,GAAG,KAAKC,GAAG,KAAKC,GAAG,KACxb,SAASC,GAAGjtG,GAAG,GAAGA,EAAEktG,GAAGltG,GAAG,CAAC,GAAG,mBAAoB8sG,GAAG,MAAM11G,MAAM8I,EAAE,MAAM,IAAIjG,EAAE+F,EAAEmtG,UAAUlzG,IAAIA,EAAEmzG,GAAGnzG,GAAG6yG,GAAG9sG,EAAEmtG,UAAUntG,EAAExF,KAAKP,GAAG,CAAC,CAAC,SAASozG,GAAGrtG,GAAG+sG,GAAGC,GAAGA,GAAGn2G,KAAKmJ,GAAGgtG,GAAG,CAAChtG,GAAG+sG,GAAG/sG,CAAC,CAAC,SAASstG,KAAK,GAAGP,GAAG,CAAC,IAAI/sG,EAAE+sG,GAAG9yG,EAAE+yG,GAAoB,GAAjBA,GAAGD,GAAG,KAAKE,GAAGjtG,GAAM/F,EAAE,IAAI+F,EAAE,EAAEA,EAAE/F,EAAEzD,OAAOwJ,IAAIitG,GAAGhzG,EAAE+F,GAAG,CAAC,CAAC,SAASutG,GAAGvtG,EAAE/F,GAAG,OAAO+F,EAAE/F,EAAE,CAAC,SAASuzG,GAAGxtG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,OAAOW,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE,CAAC,SAASouG,KAAK,CAAC,IAAIC,GAAGH,GAAGI,IAAG,EAAGC,IAAG,EAAG,SAASC,KAAQ,OAAOd,IAAI,OAAOC,KAAGS,KAAKH,KAAI,CAEla,SAASQ,GAAG9tG,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAEmtG,UAAU,GAAG,OAAOpvG,EAAE,OAAO,KAAK,IAAIiiD,EAAEotD,GAAGrvG,GAAG,GAAG,OAAOiiD,EAAE,OAAO,KAAKjiD,EAAEiiD,EAAE/lD,GAAG+F,EAAE,OAAO/F,GAAG,IAAK,UAAU,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,uBAAuB,IAAK,cAAc,IAAK,qBAAqB,IAAK,cAAc,IAAK,qBAAqB,IAAK,YAAY,IAAK,mBAAmB,IAAK,gBAAgB+lD,GAAGA,EAAE6nD,YAAqB7nD,IAAI,YAAbhgD,EAAEA,EAAExF,OAAuB,UAAUwF,GAAG,WAAWA,GAAG,aAAaA,IAAIA,GAAGggD,EAAE,MAAMhgD,EAAE,QAAQA,GAAE,EAAG,GAAGA,EAAE,OAAO,KAAK,GAAGjC,GAAG,mBACleA,EAAE,MAAM3G,MAAM8I,EAAE,IAAIjG,SAAS8D,IAAI,OAAOA,CAAC,CAAC,IAAIgwG,IAAG,EAAG,GAAG7K,EAAG,IAAI,IAAI8K,GAAG,CAAC,EAAE31G,OAAOmH,eAAewuG,GAAG,UAAU,CAACtuG,IAAI,WAAWquG,IAAG,CAAE,IAAI5/F,OAAON,iBAAiB,OAAOmgG,GAAGA,IAAI7/F,OAAOuwB,oBAAoB,OAAOsvE,GAAGA,GAAG,CAAC,MAAMhuG,IAAG+tG,IAAG,CAAE,CAAC,SAASE,GAAGjuG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,EAAE2H,EAAEiwC,EAAE3F,GAAG,IAAIh3B,EAAE91B,MAAMqB,UAAUa,MAAMgD,KAAKnB,UAAU,GAAG,IAAIhB,EAAE8E,MAAMhB,EAAEivB,EAAE,CAAC,MAAMlxB,GAAG/H,KAAKm6G,QAAQpyG,EAAE,CAAC,CAAC,IAAIqyG,IAAG,EAAGC,GAAG,KAAKC,IAAG,EAAGC,GAAG,KAAKC,GAAG,CAACL,QAAQ,SAASluG,GAAGmuG,IAAG,EAAGC,GAAGpuG,CAAC,GAAG,SAASwuG,GAAGxuG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,EAAE2H,EAAEiwC,EAAE3F,GAAGmqD,IAAG,EAAGC,GAAG,KAAKH,GAAGlvG,MAAMwvG,GAAGtzG,UAAU,CACjW,SAASwzG,GAAGzuG,GAAG,IAAI/F,EAAE+F,EAAEjC,EAAEiC,EAAE,GAAGA,EAAE0uG,UAAU,KAAKz0G,EAAE00G,QAAQ10G,EAAEA,EAAE00G,WAAW,CAAC3uG,EAAE/F,EAAE,GAAO,IAAa,MAAjBA,EAAE+F,GAASy8B,SAAc1+B,EAAE9D,EAAE00G,QAAQ3uG,EAAE/F,EAAE00G,aAAa3uG,EAAE,CAAC,OAAO,IAAI/F,EAAEoX,IAAItT,EAAE,IAAI,CAAC,SAAS6wG,GAAG5uG,GAAG,GAAG,KAAKA,EAAEqR,IAAI,CAAC,IAAIpX,EAAE+F,EAAE6uG,cAAsE,GAAxD,OAAO50G,IAAkB,QAAd+F,EAAEA,EAAE0uG,aAAqBz0G,EAAE+F,EAAE6uG,gBAAmB,OAAO50G,EAAE,OAAOA,EAAE60G,UAAU,CAAC,OAAO,IAAI,CAAC,SAASC,GAAG/uG,GAAG,GAAGyuG,GAAGzuG,KAAKA,EAAE,MAAM5I,MAAM8I,EAAE,KAAM,CAE1S,SAAS8uG,GAAGhvG,GAAW,GAARA,EADtN,SAASivG,GAAGjvG,GAAG,IAAI/F,EAAE+F,EAAE0uG,UAAU,IAAIz0G,EAAE,CAAS,GAAG,QAAXA,EAAEw0G,GAAGzuG,IAAe,MAAM5I,MAAM8I,EAAE,MAAM,OAAOjG,IAAI+F,EAAE,KAAKA,CAAC,CAAC,IAAI,IAAIjC,EAAEiC,EAAEggD,EAAE/lD,IAAI,CAAC,IAAIoF,EAAEtB,EAAE4wG,OAAO,GAAG,OAAOtvG,EAAE,MAAM,IAAI0S,EAAE1S,EAAEqvG,UAAU,GAAG,OAAO38F,EAAE,CAAY,GAAG,QAAdiuC,EAAE3gD,EAAEsvG,QAAmB,CAAC5wG,EAAEiiD,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG3gD,EAAEmoC,QAAQz1B,EAAEy1B,MAAM,CAAC,IAAIz1B,EAAE1S,EAAEmoC,MAAMz1B,GAAG,CAAC,GAAGA,IAAIhU,EAAE,OAAOgxG,GAAG1vG,GAAGW,EAAE,GAAG+R,IAAIiuC,EAAE,OAAO+uD,GAAG1vG,GAAGpF,EAAE8X,EAAEA,EAAEm9F,OAAO,CAAC,MAAM93G,MAAM8I,EAAE,KAAM,CAAC,GAAGnC,EAAE4wG,SAAS3uD,EAAE2uD,OAAO5wG,EAAEsB,EAAE2gD,EAAEjuC,MAAM,CAAC,IAAI,IAAI2H,GAAE,EAAGiwC,EAAEtqD,EAAEmoC,MAAMmiB,GAAG,CAAC,GAAGA,IAAI5rD,EAAE,CAAC2b,GAAE,EAAG3b,EAAEsB,EAAE2gD,EAAEjuC,EAAE,KAAK,CAAC,GAAG43C,IAAI3J,EAAE,CAACtmC,GAAE,EAAGsmC,EAAE3gD,EAAEtB,EAAEgU,EAAE,KAAK,CAAC43C,EAAEA,EAAEulD,OAAO,CAAC,IAAIx1F,EAAE,CAAC,IAAIiwC,EAAE53C,EAAEy1B,MAAMmiB,GAAG,CAAC,GAAGA,IAC5f5rD,EAAE,CAAC2b,GAAE,EAAG3b,EAAEgU,EAAEiuC,EAAE3gD,EAAE,KAAK,CAAC,GAAGsqD,IAAI3J,EAAE,CAACtmC,GAAE,EAAGsmC,EAAEjuC,EAAEhU,EAAEsB,EAAE,KAAK,CAACsqD,EAAEA,EAAEulD,OAAO,CAAC,IAAIx1F,EAAE,MAAMtiB,MAAM8I,EAAE,KAAM,CAAC,CAAC,GAAGnC,EAAE2wG,YAAY1uD,EAAE,MAAM5oD,MAAM8I,EAAE,KAAM,CAAC,GAAG,IAAInC,EAAEsT,IAAI,MAAMja,MAAM8I,EAAE,MAAM,OAAOnC,EAAEovG,UAAU1qF,UAAU1kB,EAAEiC,EAAE/F,CAAC,CAAkBg1G,CAAGjvG,IAAOA,EAAE,OAAO,KAAK,IAAI,IAAI/F,EAAE+F,IAAI,CAAC,GAAG,IAAI/F,EAAEoX,KAAK,IAAIpX,EAAEoX,IAAI,OAAOpX,EAAE,GAAGA,EAAEutC,MAAMvtC,EAAEutC,MAAMmnE,OAAO10G,EAAEA,EAAEA,EAAEutC,UAAU,CAAC,GAAGvtC,IAAI+F,EAAE,MAAM,MAAM/F,EAAEi1G,SAAS,CAAC,IAAIj1G,EAAE00G,QAAQ10G,EAAE00G,SAAS3uG,EAAE,OAAO,KAAK/F,EAAEA,EAAE00G,MAAM,CAAC10G,EAAEi1G,QAAQP,OAAO10G,EAAE00G,OAAO10G,EAAEA,EAAEi1G,OAAO,CAAC,CAAC,OAAO,IAAI,CAChd,SAASC,GAAGnvG,EAAE/F,GAAG,IAAI,IAAI8D,EAAEiC,EAAE0uG,UAAU,OAAOz0G,GAAG,CAAC,GAAGA,IAAI+F,GAAG/F,IAAI8D,EAAE,OAAM,EAAG9D,EAAEA,EAAE00G,MAAM,CAAC,OAAM,CAAE,CAAC,IAAIS,GAAGC,GAAGC,GAAGC,GAAGC,IAAG,EAAGC,GAAG,GAAGC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,IAAItsE,IAAIusE,GAAG,IAAIvsE,IAAIwsE,GAAG,GAAGC,GAAG,6PAA6PtnG,MAAM,KACrb,SAASunG,GAAGjwG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,MAAM,CAAC6wG,UAAUlwG,EAAEmwG,aAAal2G,EAAEm2G,iBAAmB,GAAFryG,EAAKsyG,YAAYhxG,EAAEixG,iBAAiB,CAACtwD,GAAG,CAAC,SAASuwD,GAAGvwG,EAAE/F,GAAG,OAAO+F,GAAG,IAAK,UAAU,IAAK,WAAW0vG,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,YAAYC,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,WAAWC,GAAG,KAAK,MAAM,IAAK,cAAc,IAAK,aAAaC,GAAGhqE,OAAO5rC,EAAEu2G,WAAW,MAAM,IAAK,oBAAoB,IAAK,qBAAqBV,GAAGjqE,OAAO5rC,EAAEu2G,WAAW,CACta,SAASC,GAAGzwG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,OAAG,OAAO/R,GAAGA,EAAEqwG,cAAct+F,GAAS/R,EAAEiwG,GAAGh2G,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,OAAO9X,IAAY,QAARA,EAAEizG,GAAGjzG,KAAao1G,GAAGp1G,IAAI+F,IAAEA,EAAEowG,kBAAkBpwD,EAAE/lD,EAAE+F,EAAEswG,iBAAiB,OAAOjxG,IAAI,IAAIpF,EAAE/E,QAAQmK,IAAIpF,EAAEpD,KAAKwI,GAAUW,EAAC,CAE/M,SAAS0wG,GAAG1wG,GAAG,IAAI/F,EAAE02G,GAAG3wG,EAAEc,QAAQ,GAAG,OAAO7G,EAAE,CAAC,IAAI8D,EAAE0wG,GAAGx0G,GAAG,GAAG,OAAO8D,EAAE,GAAW,MAAR9D,EAAE8D,EAAEsT,MAAY,GAAW,QAARpX,EAAE20G,GAAG7wG,IAAmH,OAAtGiC,EAAEkwG,UAAUj2G,OAAEs1G,GAAGvvG,EAAE4wG,cAAa,WAAW/N,EAAEgO,yBAAyB7wG,EAAEiM,UAAS,WAAWqjG,GAAGvxG,EAAE,GAAE,SAAgB,GAAG,IAAI9D,GAAG8D,EAAEovG,UAAU2D,QAA8D,YAArD9wG,EAAEkwG,UAAU,IAAInyG,EAAEsT,IAAItT,EAAEovG,UAAU4D,cAAc,KAAY,CAAC/wG,EAAEkwG,UAAU,IAAI,CAC9U,SAASc,GAAGhxG,GAAG,GAAG,OAAOA,EAAEkwG,UAAU,OAAM,EAAG,IAAI,IAAIj2G,EAAE+F,EAAEswG,iBAAiB,EAAEr2G,EAAEzD,QAAQ,CAAC,IAAIuH,EAAEkzG,GAAGjxG,EAAEmwG,aAAanwG,EAAEowG,iBAAiBn2G,EAAE,GAAG+F,EAAEqwG,aAAa,GAAG,OAAOtyG,EAAE,OAAe,QAAR9D,EAAEizG,GAAGnvG,KAAasxG,GAAGp1G,GAAG+F,EAAEkwG,UAAUnyG,GAAE,EAAG9D,EAAEolC,OAAO,CAAC,OAAM,CAAE,CAAC,SAAS6xE,GAAGlxG,EAAE/F,EAAE8D,GAAGizG,GAAGhxG,IAAIjC,EAAE8nC,OAAO5rC,EAAE,CAC3Q,SAASk3G,KAAK,IAAI3B,IAAG,EAAG,EAAEC,GAAGj5G,QAAQ,CAAC,IAAIwJ,EAAEyvG,GAAG,GAAG,GAAG,OAAOzvG,EAAEkwG,UAAU,CAAmB,QAAlBlwG,EAAEktG,GAAGltG,EAAEkwG,aAAqBd,GAAGpvG,GAAG,KAAK,CAAC,IAAI,IAAI/F,EAAE+F,EAAEswG,iBAAiB,EAAEr2G,EAAEzD,QAAQ,CAAC,IAAIuH,EAAEkzG,GAAGjxG,EAAEmwG,aAAanwG,EAAEowG,iBAAiBn2G,EAAE,GAAG+F,EAAEqwG,aAAa,GAAG,OAAOtyG,EAAE,CAACiC,EAAEkwG,UAAUnyG,EAAE,KAAK,CAAC9D,EAAEolC,OAAO,CAAC,OAAOr/B,EAAEkwG,WAAWT,GAAGpwE,OAAO,CAAC,OAAOqwE,IAAIsB,GAAGtB,MAAMA,GAAG,MAAM,OAAOC,IAAIqB,GAAGrB,MAAMA,GAAG,MAAM,OAAOC,IAAIoB,GAAGpB,MAAMA,GAAG,MAAMC,GAAG5vF,QAAQixF,IAAIpB,GAAG7vF,QAAQixF,GAAG,CACxZ,SAASE,GAAGpxG,EAAE/F,GAAG+F,EAAEkwG,YAAYj2G,IAAI+F,EAAEkwG,UAAU,KAAKV,KAAKA,IAAG,EAAG3M,EAAEwO,0BAA0BxO,EAAEyO,wBAAwBH,KAAK,CAC1H,SAASI,GAAGvxG,GAAG,SAAS/F,EAAEA,GAAG,OAAOm3G,GAAGn3G,EAAE+F,EAAE,CAAC,GAAG,EAAEyvG,GAAGj5G,OAAO,CAAC46G,GAAG3B,GAAG,GAAGzvG,GAAG,IAAI,IAAIjC,EAAE,EAAEA,EAAE0xG,GAAGj5G,OAAOuH,IAAI,CAAC,IAAIiiD,EAAEyvD,GAAG1xG,GAAGiiD,EAAEkwD,YAAYlwG,IAAIggD,EAAEkwD,UAAU,KAAK,CAAC,CAAyF,IAAxF,OAAOR,IAAI0B,GAAG1B,GAAG1vG,GAAG,OAAO2vG,IAAIyB,GAAGzB,GAAG3vG,GAAG,OAAO4vG,IAAIwB,GAAGxB,GAAG5vG,GAAG6vG,GAAG5vF,QAAQhmB,GAAG61G,GAAG7vF,QAAQhmB,GAAO8D,EAAE,EAAEA,EAAEgyG,GAAGv5G,OAAOuH,KAAIiiD,EAAE+vD,GAAGhyG,IAAKmyG,YAAYlwG,IAAIggD,EAAEkwD,UAAU,MAAM,KAAK,EAAEH,GAAGv5G,QAAiB,QAARuH,EAAEgyG,GAAG,IAAYG,WAAYQ,GAAG3yG,GAAG,OAAOA,EAAEmyG,WAAWH,GAAG1wE,OAAO,CACtY,SAASmyE,GAAGxxG,EAAE/F,GAAG,IAAI8D,EAAE,CAAC,EAAiF,OAA/EA,EAAEiC,EAAE3E,eAAepB,EAAEoB,cAAc0C,EAAE,SAASiC,GAAG,SAAS/F,EAAE8D,EAAE,MAAMiC,GAAG,MAAM/F,EAAS8D,CAAC,CAAC,IAAI0zG,GAAG,CAACC,aAAaF,GAAG,YAAY,gBAAgBG,mBAAmBH,GAAG,YAAY,sBAAsBI,eAAeJ,GAAG,YAAY,kBAAkBK,cAAcL,GAAG,aAAa,kBAAkBM,GAAG,CAAC,EAAEC,GAAG,CAAC,EACpF,SAASC,GAAGhyG,GAAG,GAAG8xG,GAAG9xG,GAAG,OAAO8xG,GAAG9xG,GAAG,IAAIyxG,GAAGzxG,GAAG,OAAOA,EAAE,IAAYjC,EAAR9D,EAAEw3G,GAAGzxG,GAAK,IAAIjC,KAAK9D,EAAE,GAAGA,EAAEkQ,eAAepM,IAAIA,KAAKg0G,GAAG,OAAOD,GAAG9xG,GAAG/F,EAAE8D,GAAG,OAAOiC,CAAC,CAA/XkjG,IAAK6O,GAAGllG,SAASG,cAAc,OAAOG,MAAM,mBAAmBgB,gBAAgBsjG,GAAGC,aAAaO,iBAAiBR,GAAGE,mBAAmBM,iBAAiBR,GAAGG,eAAeK,WAAW,oBAAoB9jG,eAAesjG,GAAGI,cAAcK,YACxO,IAAIC,GAAGH,GAAG,gBAAgBI,GAAGJ,GAAG,sBAAsBK,GAAGL,GAAG,kBAAkBM,GAAGN,GAAG,iBAAiBO,GAAG,IAAIhvE,IAAIivE,GAAG,IAAIjvE,IAAIkvE,GAAG,CAAC,QAAQ,QAAQN,GAAG,eAAeC,GAAG,qBAAqBC,GAAG,iBAAiB,UAAU,UAAU,iBAAiB,iBAAiB,iBAAiB,iBAAiB,UAAU,UAAU,YAAY,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,oBAAoB,oBAAoB,OAAO,OAAO,aAAa,aAAa,iBAAiB,iBAAiB,YAAY,YAC/e,qBAAqB,qBAAqB,UAAU,UAAU,WAAW,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,aAAa,aAAaC,GAAG,gBAAgB,UAAU,WAAW,SAASI,GAAG1yG,EAAE/F,GAAG,IAAI,IAAI8D,EAAE,EAAEA,EAAEiC,EAAExJ,OAAOuH,GAAG,EAAE,CAAC,IAAIiiD,EAAEhgD,EAAEjC,GAAGsB,EAAEW,EAAEjC,EAAE,GAAGsB,EAAE,MAAMA,EAAE,GAAG2hC,cAAc3hC,EAAEjG,MAAM,IAAIo5G,GAAGlyG,IAAI0/C,EAAE/lD,GAAGs4G,GAAGjyG,IAAI0/C,EAAE3gD,GAAG2jG,GAAG3jG,EAAE,CAAC2gD,GAAG,CAAC,EAAuB2yD,EAAf9P,EAAE+P,gBAAkB,IAAI1gG,GAAE,EAC/X,SAAS2gG,GAAG7yG,GAAG,GAAG,IAAK,EAAEA,GAAG,OAAOkS,GAAE,GAAG,EAAE,GAAG,IAAK,EAAElS,GAAG,OAAOkS,GAAE,GAAG,EAAE,GAAG,IAAK,EAAElS,GAAG,OAAOkS,GAAE,GAAG,EAAE,IAAIjY,EAAE,GAAG+F,EAAE,OAAG,IAAI/F,GAASiY,GAAE,GAAGjY,GAAK,IAAO,GAAF+F,IAAakS,GAAE,GAAG,IAAc,KAAXjY,EAAE,IAAI+F,IAAkBkS,GAAE,GAAGjY,GAAK,IAAO,IAAF+F,IAAckS,GAAE,EAAE,KAAgB,KAAZjY,EAAE,KAAK+F,IAAkBkS,GAAE,EAAEjY,GAAK,IAAO,KAAF+F,IAAekS,GAAE,EAAE,MAAoB,KAAfjY,EAAE,QAAQ+F,IAAkBkS,GAAE,EAAEjY,GAAkB,KAAhBA,EAAE,SAAS+F,IAAkBkS,GAAE,EAAEjY,GAAO,SAAF+F,GAAkBkS,GAAE,EAAE,UAAY,IAAO,UAAFlS,IAAoBkS,GAAE,EAAE,WAA2B,KAAjBjY,EAAE,UAAU+F,IAAkBkS,GAAE,EAAEjY,GAAK,IAAK,WAAW+F,IAAUkS,GAAE,EAAE,aACjfA,GAAE,EAASlS,EAAC,CACZ,SAAS8yG,GAAG9yG,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAE+yG,aAAa,GAAG,IAAIh1G,EAAE,OAAOmU,GAAE,EAAE,IAAI8tC,EAAE,EAAE3gD,EAAE,EAAE0S,EAAE/R,EAAEgzG,aAAat5F,EAAE1Z,EAAEizG,eAAetpD,EAAE3pD,EAAEkzG,YAAY,GAAG,IAAInhG,EAAEiuC,EAAEjuC,EAAE1S,EAAE6S,GAAE,QAAQ,GAAiB,KAAdH,EAAI,UAAFhU,GAAkB,CAAC,IAAIimD,EAAEjyC,GAAG2H,EAAE,IAAIsqC,GAAGhE,EAAE6yD,GAAG7uD,GAAG3kD,EAAE6S,IAAS,KAALy3C,GAAG53C,KAAUiuC,EAAE6yD,GAAGlpD,GAAGtqD,EAAE6S,GAAG,MAAa,KAAPH,EAAEhU,GAAG2b,IAASsmC,EAAE6yD,GAAG9gG,GAAG1S,EAAE6S,IAAG,IAAIy3C,IAAI3J,EAAE6yD,GAAGlpD,GAAGtqD,EAAE6S,IAAG,GAAG,IAAI8tC,EAAE,OAAO,EAAqC,GAAxBA,EAAEjiD,IAAI,GAAjBiiD,EAAE,GAAGmzD,GAAGnzD,IAAa,EAAE,GAAGA,IAAI,GAAG,EAAK,IAAI/lD,GAAGA,IAAI+lD,GAAG,IAAK/lD,EAAEyf,GAAG,CAAO,GAANm5F,GAAG54G,GAAMoF,GAAG6S,GAAE,OAAOjY,EAAEiY,GAAE7S,CAAC,CAAoB,GAAG,KAAtBpF,EAAE+F,EAAEozG,gBAAwB,IAAIpzG,EAAEA,EAAEqzG,cAAcp5G,GAAG+lD,EAAE,EAAE/lD,GAAcoF,EAAE,IAAbtB,EAAE,GAAGo1G,GAAGl5G,IAAU+lD,GAAGhgD,EAAEjC,GAAG9D,IAAIoF,EAAE,OAAO2gD,CAAC,CAC3e,SAASszD,GAAGtzG,GAAgC,OAAO,KAApCA,GAAkB,WAAhBA,EAAE+yG,cAAsC/yG,EAAI,WAAFA,EAAa,WAAW,CAAC,CAAC,SAASuzG,GAAGvzG,EAAE/F,GAAG,OAAO+F,GAAG,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAmB,KAAZA,EAAEwzG,GAAG,IAAIv5G,IAASs5G,GAAG,GAAGt5G,GAAG+F,EAAE,KAAK,GAAG,OAAoB,KAAbA,EAAEwzG,GAAG,KAAKv5G,IAASs5G,GAAG,EAAEt5G,GAAG+F,EAAE,KAAK,EAAE,OAAqB,KAAdA,EAAEwzG,GAAG,MAAMv5G,MAA4B,KAAjB+F,EAAEwzG,GAAG,SAASv5G,MAAW+F,EAAE,MAAMA,EAAE,KAAK,EAAE,OAA0B,KAAnB/F,EAAEu5G,GAAG,WAAWv5G,MAAWA,EAAE,WAAWA,EAAE,MAAM7C,MAAM8I,EAAE,IAAIF,GAAI,CAAC,SAASwzG,GAAGxzG,GAAG,OAAOA,GAAGA,CAAC,CAAC,SAASyzG,GAAGzzG,GAAG,IAAI,IAAI/F,EAAE,GAAG8D,EAAE,EAAE,GAAGA,EAAEA,IAAI9D,EAAEpD,KAAKmJ,GAAG,OAAO/F,CAAC,CACtd,SAASy5G,GAAG1zG,EAAE/F,EAAE8D,GAAGiC,EAAE+yG,cAAc94G,EAAE,IAAI+lD,EAAE/lD,EAAE,EAAE+F,EAAEizG,gBAAgBjzD,EAAEhgD,EAAEkzG,aAAalzD,GAAEhgD,EAAEA,EAAE2zG,YAAW15G,EAAE,GAAGk5G,GAAGl5G,IAAQ8D,CAAC,CAAC,IAAIo1G,GAAGj1G,KAAK01G,MAAM11G,KAAK01G,MAAiC,SAASC,GAAG7zG,GAAG,OAAO,IAAIA,EAAE,GAAG,IAAI8zG,GAAG9zG,GAAG+zG,GAAG,GAAG,CAAC,EAAxED,GAAG51G,KAAKijC,IAAI4yE,GAAG71G,KAAKiiD,IAAqD,IAAI6zD,GAAGnR,EAAEoR,8BAA8BC,GAAGrR,EAAEgO,yBAAyBsD,IAAG,EAAG,SAASC,GAAGp0G,EAAE/F,EAAE8D,EAAEiiD,GAAG2tD,IAAIF,KAAK,IAAIpuG,EAAEg1G,GAAGtiG,EAAE47F,GAAGA,IAAG,EAAG,IAAIH,GAAGnuG,EAAEW,EAAE/F,EAAE8D,EAAEiiD,EAAE,CAAC,SAAS2tD,GAAG57F,IAAI87F,IAAI,CAAC,CAAC,SAAS9oF,GAAG/kB,EAAE/F,EAAE8D,EAAEiiD,GAAGk0D,GAAGF,GAAGK,GAAG7qG,KAAK,KAAKxJ,EAAE/F,EAAE8D,EAAEiiD,GAAG,CACpb,SAASq0D,GAAGr0G,EAAE/F,EAAE8D,EAAEiiD,GAAU,IAAI3gD,EAAX,GAAG80G,GAAU,IAAI90G,EAAE,IAAO,EAAFpF,KAAO,EAAEw1G,GAAGj5G,SAAS,EAAEw5G,GAAG96G,QAAQ8K,GAAGA,EAAEiwG,GAAG,KAAKjwG,EAAE/F,EAAE8D,EAAEiiD,GAAGyvD,GAAG54G,KAAKmJ,OAAO,CAAC,IAAI+R,EAAEk/F,GAAGjxG,EAAE/F,EAAE8D,EAAEiiD,GAAG,GAAG,OAAOjuC,EAAE1S,GAAGkxG,GAAGvwG,EAAEggD,OAAO,CAAC,GAAG3gD,EAAE,CAAC,IAAI,EAAE2wG,GAAG96G,QAAQ8K,GAA+B,OAA3BA,EAAEiwG,GAAGl+F,EAAE/R,EAAE/F,EAAE8D,EAAEiiD,QAAGyvD,GAAG54G,KAAKmJ,GAAU,GAfhO,SAASs0G,GAAGt0G,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,OAAOpF,GAAG,IAAK,UAAU,OAAOy1G,GAAGe,GAAGf,GAAG1vG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,IAAG,EAAG,IAAK,YAAY,OAAOswG,GAAGc,GAAGd,GAAG3vG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,IAAG,EAAG,IAAK,YAAY,OAAOuwG,GAAGa,GAAGb,GAAG5vG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,IAAG,EAAG,IAAK,cAAc,IAAI0S,EAAE1S,EAAEmxG,UAAkD,OAAxCX,GAAGvvG,IAAIyR,EAAE0+F,GAAGZ,GAAGnwG,IAAIqS,IAAI,KAAK/R,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,KAAU,EAAG,IAAK,oBAAoB,OAAO0S,EAAE1S,EAAEmxG,UAAUV,GAAGxvG,IAAIyR,EAAE0+F,GAAGX,GAAGpwG,IAAIqS,IAAI,KAAK/R,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,KAAI,EAAG,OAAM,CAAE,CAehIi1G,CAAGviG,EAAE/R,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAOuwD,GAAGvwG,EAAEggD,EAAE,CAACu0D,GAAGv0G,EAAE/F,EAAE+lD,EAAE,KAAKjiD,EAAE,CAAC,CAAE,CACnR,SAASkzG,GAAGjxG,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEstG,GAAG3sD,GAAW,GAAG,QAAX3gD,EAAEsxG,GAAGtxG,IAAe,CAAC,IAAI0S,EAAE08F,GAAGpvG,GAAG,GAAG,OAAO0S,EAAE1S,EAAE,SAAS,CAAC,IAAIqa,EAAE3H,EAAEV,IAAI,GAAG,KAAKqI,EAAE,CAAS,GAAG,QAAXra,EAAEuvG,GAAG78F,IAAe,OAAO1S,EAAEA,EAAE,IAAI,MAAM,GAAG,IAAIqa,EAAE,CAAC,GAAG3H,EAAEo7F,UAAU2D,QAAQ,OAAO,IAAI/+F,EAAEV,IAAIU,EAAEo7F,UAAU4D,cAAc,KAAK1xG,EAAE,IAAI,MAAM0S,IAAI1S,IAAIA,EAAE,KAAK,CAAC,CAAe,OAAdk1G,GAAGv0G,EAAE/F,EAAE+lD,EAAE3gD,EAAEtB,GAAU,IAAI,CAAC,IAAIy2G,GAAG,KAAKC,GAAG,KAAKl/D,GAAG,KACzT,SAASm/D,KAAK,GAAGn/D,GAAG,OAAOA,GAAG,IAAIv1C,EAAkBggD,EAAhB/lD,EAAEw6G,GAAG12G,EAAE9D,EAAEzD,OAAS6I,EAAE,UAAUm1G,GAAGA,GAAG37G,MAAM27G,GAAGvnG,YAAY8E,EAAE1S,EAAE7I,OAAO,IAAIwJ,EAAE,EAAEA,EAAEjC,GAAG9D,EAAE+F,KAAKX,EAAEW,GAAGA,KAAK,IAAI0Z,EAAE3b,EAAEiC,EAAE,IAAIggD,EAAE,EAAEA,GAAGtmC,GAAGzf,EAAE8D,EAAEiiD,KAAK3gD,EAAE0S,EAAEiuC,GAAGA,KAAK,OAAOzK,GAAGl2C,EAAEjG,MAAM4G,EAAE,EAAEggD,EAAE,EAAEA,OAAE,EAAO,CAAC,SAAS20D,GAAG30G,GAAG,IAAI/F,EAAE+F,EAAE40G,QAA+E,MAAvE,aAAa50G,EAAgB,KAAbA,EAAEA,EAAE60G,WAAgB,KAAK56G,IAAI+F,EAAE,IAAKA,EAAE/F,EAAE,KAAK+F,IAAIA,EAAE,IAAW,IAAIA,GAAG,KAAKA,EAAEA,EAAE,CAAC,CAAC,SAAS80G,KAAK,OAAM,CAAE,CAAC,SAASC,KAAK,OAAM,CAAE,CACnY,SAASC,GAAGh1G,GAAG,SAAS/F,EAAEA,EAAE+lD,EAAE3gD,EAAE0S,EAAE2H,GAA6G,IAAI,IAAI3b,KAAlHhK,KAAKkhH,WAAWh7G,EAAElG,KAAKmhH,YAAY71G,EAAEtL,KAAKyG,KAAKwlD,EAAEjsD,KAAKs8G,YAAYt+F,EAAEhe,KAAK+M,OAAO4Y,EAAE3lB,KAAKohH,cAAc,KAAkBn1G,EAAEA,EAAEmK,eAAepM,KAAK9D,EAAE+F,EAAEjC,GAAGhK,KAAKgK,GAAG9D,EAAEA,EAAE8X,GAAGA,EAAEhU,IAAgI,OAA5HhK,KAAKqhH,oBAAoB,MAAMrjG,EAAEsjG,iBAAiBtjG,EAAEsjG,kBAAiB,IAAKtjG,EAAEqsD,aAAa02C,GAAGC,GAAGhhH,KAAKuhH,qBAAqBP,GAAUhhH,IAAI,CAC9E,OAD+EgI,EAAE9B,EAAE1B,UAAU,CAACyV,eAAe,WAAWja,KAAKshH,kBAAiB,EAAG,IAAIr1G,EAAEjM,KAAKs8G,YAAYrwG,IAAIA,EAAEgO,eAAehO,EAAEgO,iBAAiB,kBAAmBhO,EAAEo+D,cAC7ep+D,EAAEo+D,aAAY,GAAIrqE,KAAKqhH,mBAAmBN,GAAG,EAAEhnG,gBAAgB,WAAW,IAAI9N,EAAEjM,KAAKs8G,YAAYrwG,IAAIA,EAAE8N,gBAAgB9N,EAAE8N,kBAAkB,kBAAmB9N,EAAEu1G,eAAev1G,EAAEu1G,cAAa,GAAIxhH,KAAKuhH,qBAAqBR,GAAG,EAAE5T,QAAQ,WAAW,EAAEsU,aAAaV,KAAY76G,CAAC,CACjR,IAAoLw7G,GAAGC,GAAGC,GAAtLC,GAAG,CAACC,WAAW,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,UAAU,SAASh2G,GAAG,OAAOA,EAAEg2G,WAAWnqG,KAAK24D,KAAK,EAAE6wC,iBAAiB,EAAEY,UAAU,GAAGC,GAAGlB,GAAGY,IAAIO,GAAGp6G,EAAE,CAAC,EAAE65G,GAAG,CAACQ,KAAK,EAAEC,OAAO,IAAIC,GAAGtB,GAAGmB,IAAaI,GAAGx6G,EAAE,CAAC,EAAEo6G,GAAG,CAACK,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,iBAAiBC,GAAGC,OAAO,EAAEC,QAAQ,EAAEC,cAAc,SAASt3G,GAAG,YAAO,IAASA,EAAEs3G,cAAct3G,EAAEu3G,cAAcv3G,EAAE4sG,WAAW5sG,EAAE2oF,UAAU3oF,EAAEu3G,YAAYv3G,EAAEs3G,aAAa,EAAEE,UAAU,SAASx3G,GAAG,MAAG,cAC3eA,EAASA,EAAEw3G,WAAUx3G,IAAI21G,KAAKA,IAAI,cAAc31G,EAAExF,MAAMi7G,GAAGz1G,EAAEw2G,QAAQb,GAAGa,QAAQd,GAAG11G,EAAEy2G,QAAQd,GAAGc,SAASf,GAAGD,GAAG,EAAEE,GAAG31G,GAAUy1G,GAAE,EAAEgC,UAAU,SAASz3G,GAAG,MAAM,cAAcA,EAAEA,EAAEy3G,UAAU/B,EAAE,IAAIgC,GAAG1C,GAAGuB,IAAiCoB,GAAG3C,GAA7Bj5G,EAAE,CAAC,EAAEw6G,GAAG,CAACqB,aAAa,KAA4CC,GAAG7C,GAA9Bj5G,EAAE,CAAC,EAAEo6G,GAAG,CAACmB,cAAc,KAA0EQ,GAAG9C,GAA5Dj5G,EAAE,CAAC,EAAE65G,GAAG,CAACmC,cAAc,EAAEC,YAAY,EAAEC,cAAc,KAAcC,GAAGn8G,EAAE,CAAC,EAAE65G,GAAG,CAAC3nG,cAAc,SAASjO,GAAG,MAAM,kBAAkBA,EAAEA,EAAEiO,cAAcE,OAAOF,aAAa,IAAIkqG,GAAGnD,GAAGkD,IAAyBE,GAAGpD,GAArBj5G,EAAE,CAAC,EAAE65G,GAAG,CAACl7G,KAAK,KAAc29G,GAAG,CAACC,IAAI,SACxfC,SAAS,IAAIC,KAAK,YAAYC,GAAG,UAAUC,MAAM,aAAaC,KAAK,YAAYC,IAAI,SAASC,IAAI,KAAKC,KAAK,cAAcC,KAAK,cAAcC,OAAO,aAAaC,gBAAgB,gBAAgBC,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KACtf,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,aAAa,IAAI,QAAQC,GAAG,CAACC,IAAI,SAASC,QAAQ,UAAUC,KAAK,UAAUC,MAAM,YAAY,SAASC,GAAGx5G,GAAG,IAAI/F,EAAElG,KAAKs8G,YAAY,OAAOp2G,EAAEi9G,iBAAiBj9G,EAAEi9G,iBAAiBl3G,MAAIA,EAAEm5G,GAAGn5G,OAAM/F,EAAE+F,EAAK,CAAC,SAASm3G,KAAK,OAAOqC,EAAE,CAChS,IAAIC,GAAG19G,EAAE,CAAC,EAAEo6G,GAAG,CAAC3rG,IAAI,SAASxK,GAAG,GAAGA,EAAEwK,IAAI,CAAC,IAAIvQ,EAAEo+G,GAAGr4G,EAAEwK,MAAMxK,EAAEwK,IAAI,GAAG,iBAAiBvQ,EAAE,OAAOA,CAAC,CAAC,MAAM,aAAa+F,EAAExF,KAAc,MAARwF,EAAE20G,GAAG30G,IAAU,QAAQlL,OAAOC,aAAaiL,GAAI,YAAYA,EAAExF,MAAM,UAAUwF,EAAExF,KAAK0+G,GAAGl5G,EAAE40G,UAAU,eAAe,EAAE,EAAEz9G,KAAK,EAAEs9F,SAAS,EAAEqiB,QAAQ,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,EAAEpe,OAAO,EAAE6gB,OAAO,EAAExC,iBAAiBC,GAAGtC,SAAS,SAAS70G,GAAG,MAAM,aAAaA,EAAExF,KAAKm6G,GAAG30G,GAAG,CAAC,EAAE40G,QAAQ,SAAS50G,GAAG,MAAM,YAAYA,EAAExF,MAAM,UAAUwF,EAAExF,KAAKwF,EAAE40G,QAAQ,CAAC,EAAE+E,MAAM,SAAS35G,GAAG,MAAM,aAC7eA,EAAExF,KAAKm6G,GAAG30G,GAAG,YAAYA,EAAExF,MAAM,UAAUwF,EAAExF,KAAKwF,EAAE40G,QAAQ,CAAC,IAAIgF,GAAG5E,GAAGyE,IAAiII,GAAG7E,GAA7Hj5G,EAAE,CAAC,EAAEw6G,GAAG,CAAC/F,UAAU,EAAEsJ,MAAM,EAAEC,OAAO,EAAEC,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,YAAY,EAAEC,UAAU,KAAmIC,GAAGvF,GAArHj5G,EAAE,CAAC,EAAEo6G,GAAG,CAAC17E,QAAQ,EAAE+/E,cAAc,EAAEC,eAAe,EAAEzD,OAAO,EAAEC,QAAQ,EAAEH,QAAQ,EAAEC,SAAS,EAAEG,iBAAiBC,MAA0EuD,GAAG1F,GAA3Dj5G,EAAE,CAAC,EAAE65G,GAAG,CAACjS,aAAa,EAAEqU,YAAY,EAAEC,cAAc,KAAc0C,GAAG5+G,EAAE,CAAC,EAAEw6G,GAAG,CAACqE,OAAO,SAAS56G,GAAG,MAAM,WAAWA,EAAEA,EAAE46G,OAAO,gBAAgB56G,GAAGA,EAAE66G,YAAY,CAAC,EACnfC,OAAO,SAAS96G,GAAG,MAAM,WAAWA,EAAEA,EAAE86G,OAAO,gBAAgB96G,GAAGA,EAAE+6G,YAAY,eAAe/6G,GAAGA,EAAEg7G,WAAW,CAAC,EAAEC,OAAO,EAAEC,UAAU,IAAIC,GAAGnG,GAAG2F,IAAIS,GAAG,CAAC,EAAE,GAAG,GAAG,IAAIC,GAAGnY,GAAI,qBAAqB/0F,OAAOmtG,GAAG,KAAKpY,GAAI,iBAAiBr2F,WAAWyuG,GAAGzuG,SAAS0uG,cAAc,IAAIC,GAAGtY,GAAI,cAAc/0F,SAASmtG,GAAGG,GAAGvY,KAAMmY,IAAIC,IAAI,EAAEA,IAAI,IAAIA,IAAII,GAAG5mH,OAAOC,aAAa,IAAI4mH,IAAG,EAC1W,SAASC,GAAG57G,EAAE/F,GAAG,OAAO+F,GAAG,IAAK,QAAQ,OAAO,IAAIo7G,GAAGlmH,QAAQ+E,EAAE26G,SAAS,IAAK,UAAU,OAAO,MAAM36G,EAAE26G,QAAQ,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,OAAM,EAAG,QAAQ,OAAM,EAAG,CAAC,SAASiH,GAAG77G,GAAc,MAAM,iBAAjBA,EAAEA,EAAEq2G,SAAkC,SAASr2G,EAAEA,EAAEtF,KAAK,IAAI,CAAC,IAAIohH,IAAG,EAE9Q,IAAIC,GAAG,CAACC,OAAM,EAAGziB,MAAK,EAAG0iB,UAAS,EAAG,kBAAiB,EAAGC,OAAM,EAAGC,OAAM,EAAGz3F,QAAO,EAAG03F,UAAS,EAAGz0G,OAAM,EAAG00G,QAAO,EAAGC,KAAI,EAAG/vG,MAAK,EAAGi5D,MAAK,EAAGjxE,KAAI,EAAGgoH,MAAK,GAAI,SAASC,GAAGx8G,GAAG,IAAI/F,EAAE+F,GAAGA,EAAEo3B,UAAUp3B,EAAEo3B,SAAS/7B,cAAc,MAAM,UAAUpB,IAAI8hH,GAAG/7G,EAAExF,MAAM,aAAaP,CAAO,CAAC,SAASwiH,GAAGz8G,EAAE/F,EAAE8D,EAAEiiD,GAAGqtD,GAAGrtD,GAAsB,GAAnB/lD,EAAEyiH,GAAGziH,EAAE,aAAgBzD,SAASuH,EAAE,IAAIm4G,GAAG,WAAW,SAAS,KAAKn4G,EAAEiiD,GAAGhgD,EAAEnJ,KAAK,CAACs6C,MAAMpzC,EAAEihC,UAAU/kC,IAAI,CAAC,IAAI0iH,GAAG,KAAKC,GAAG,KAAK,SAAS50E,GAAGhoC,GAAG68G,GAAG78G,EAAE,EAAE,CAAC,SAAS88G,GAAG98G,GAAe,GAAG4mG,GAATmW,GAAG/8G,IAAY,OAAOA,CAAC,CACpe,SAASg9G,GAAGh9G,EAAE/F,GAAG,GAAG,WAAW+F,EAAE,OAAO/F,CAAC,CAAC,IAAIgjH,IAAG,EAAG,GAAG/Z,EAAG,CAAC,IAAIga,GAAG,GAAGha,EAAG,CAAC,IAAIia,GAAG,YAAYtwG,SAAS,IAAIswG,GAAG,CAAC,IAAIC,GAAGvwG,SAASG,cAAc,OAAOowG,GAAGpnF,aAAa,UAAU,WAAWmnF,GAAG,mBAAoBC,GAAGC,OAAO,CAACH,GAAGC,EAAE,MAAMD,IAAG,EAAGD,GAAGC,MAAMrwG,SAAS0uG,cAAc,EAAE1uG,SAAS0uG,aAAa,CAAC,SAAS+B,KAAKX,KAAKA,GAAGY,YAAY,mBAAmBC,IAAIZ,GAAGD,GAAG,KAAK,CAAC,SAASa,GAAGx9G,GAAG,GAAG,UAAUA,EAAE2jG,cAAcmZ,GAAGF,IAAI,CAAC,IAAI3iH,EAAE,GAAyB,GAAtBwiH,GAAGxiH,EAAE2iH,GAAG58G,EAAE2sG,GAAG3sG,IAAIA,EAAEgoC,GAAM2lE,GAAG3tG,EAAE/F,OAAO,CAAC0zG,IAAG,EAAG,IAAIJ,GAAGvtG,EAAE/F,EAAE,CAAC,QAAQ0zG,IAAG,EAAGE,IAAI,CAAC,CAAC,CAAC,CAClf,SAAS4P,GAAGz9G,EAAE/F,EAAE8D,GAAG,YAAYiC,GAAGs9G,KAAUV,GAAG7+G,GAAR4+G,GAAG1iH,GAAUyjH,YAAY,mBAAmBF,KAAK,aAAax9G,GAAGs9G,IAAI,CAAC,SAASK,GAAG39G,GAAG,GAAG,oBAAoBA,GAAG,UAAUA,GAAG,YAAYA,EAAE,OAAO88G,GAAGF,GAAG,CAAC,SAASgB,GAAG59G,EAAE/F,GAAG,GAAG,UAAU+F,EAAE,OAAO88G,GAAG7iH,EAAE,CAAC,SAAS4jH,GAAG79G,EAAE/F,GAAG,GAAG,UAAU+F,GAAG,WAAWA,EAAE,OAAO88G,GAAG7iH,EAAE,CAAiE,IAAI6jH,GAAG,mBAAoBzlH,OAAOuvD,GAAGvvD,OAAOuvD,GAA5G,SAASm2D,GAAG/9G,EAAE/F,GAAG,OAAO+F,IAAI/F,IAAI,IAAI+F,GAAG,EAAEA,GAAI,EAAE/F,IAAI+F,GAAIA,GAAG/F,GAAIA,CAAC,EAAmD+jH,GAAG3lH,OAAOE,UAAU4R,eAC7a,SAAS8zG,GAAGj+G,EAAE/F,GAAG,GAAG6jH,GAAG99G,EAAE/F,GAAG,OAAM,EAAG,GAAG,iBAAkB+F,GAAG,OAAOA,GAAG,iBAAkB/F,GAAG,OAAOA,EAAE,OAAM,EAAG,IAAI8D,EAAE1F,OAAOyZ,KAAK9R,GAAGggD,EAAE3nD,OAAOyZ,KAAK7X,GAAG,GAAG8D,EAAEvH,SAASwpD,EAAExpD,OAAO,OAAM,EAAG,IAAIwpD,EAAE,EAAEA,EAAEjiD,EAAEvH,OAAOwpD,IAAI,IAAIg+D,GAAG5hH,KAAKnC,EAAE8D,EAAEiiD,MAAM89D,GAAG99G,EAAEjC,EAAEiiD,IAAI/lD,EAAE8D,EAAEiiD,KAAK,OAAM,EAAG,OAAM,CAAE,CAAC,SAASk+D,GAAGl+G,GAAG,KAAKA,GAAGA,EAAEs5B,YAAYt5B,EAAEA,EAAEs5B,WAAW,OAAOt5B,CAAC,CACnU,SAASm+G,GAAGn+G,EAAE/F,GAAG,IAAwB+lD,EAApBjiD,EAAEmgH,GAAGl+G,GAAO,IAAJA,EAAE,EAAYjC,GAAG,CAAC,GAAG,IAAIA,EAAE2xB,SAAS,CAA0B,GAAzBswB,EAAEhgD,EAAEjC,EAAEkP,YAAYzW,OAAUwJ,GAAG/F,GAAG+lD,GAAG/lD,EAAE,MAAM,CAACw7B,KAAK13B,EAAEhB,OAAO9C,EAAE+F,GAAGA,EAAEggD,CAAC,CAAChgD,EAAE,CAAC,KAAKjC,GAAG,CAAC,GAAGA,EAAEyzC,YAAY,CAACzzC,EAAEA,EAAEyzC,YAAY,MAAMxxC,CAAC,CAACjC,EAAEA,EAAE23B,UAAU,CAAC33B,OAAE,CAAM,CAACA,EAAEmgH,GAAGngH,EAAE,CAAC,CAAC,SAASqgH,GAAGp+G,EAAE/F,GAAG,SAAO+F,IAAG/F,KAAE+F,IAAI/F,KAAK+F,GAAG,IAAIA,EAAE0vB,YAAYz1B,GAAG,IAAIA,EAAEy1B,SAAS0uF,GAAGp+G,EAAE/F,EAAEy7B,YAAY,aAAa11B,EAAEA,EAAE4oC,SAAS3uC,KAAG+F,EAAEq+G,4BAAwD,GAA7Br+G,EAAEq+G,wBAAwBpkH,KAAY,CAC9Z,SAASqkH,KAAK,IAAI,IAAIt+G,EAAEmO,OAAOlU,EAAE4sG,KAAK5sG,aAAa+F,EAAEu+G,mBAAmB,CAAC,IAAI,IAAIxgH,EAAE,iBAAkB9D,EAAE4nB,cAAc4yE,SAASlxB,IAAI,CAAC,MAAMvjB,GAAGjiD,GAAE,CAAE,CAAC,IAAGA,EAAyB,MAAM9D,EAAE4sG,IAA/B7mG,EAAE/F,EAAE4nB,eAAgChV,SAAS,CAAC,OAAO5S,CAAC,CAAC,SAASukH,GAAGx+G,GAAG,IAAI/F,EAAE+F,GAAGA,EAAEo3B,UAAUp3B,EAAEo3B,SAAS/7B,cAAc,OAAOpB,IAAI,UAAUA,IAAI,SAAS+F,EAAExF,MAAM,WAAWwF,EAAExF,MAAM,QAAQwF,EAAExF,MAAM,QAAQwF,EAAExF,MAAM,aAAawF,EAAExF,OAAO,aAAaP,GAAG,SAAS+F,EAAEy+G,gBAAgB,CACxa,IAAIC,GAAGxb,GAAI,iBAAiBr2F,UAAU,IAAIA,SAAS0uG,aAAaoD,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,IAAG,EAC3F,SAASC,GAAG/+G,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEjiD,EAAEoQ,SAASpQ,EAAEA,EAAE8O,SAAS,IAAI9O,EAAE2xB,SAAS3xB,EAAEA,EAAE4yB,cAAcmuF,IAAI,MAAMH,IAAIA,KAAK9X,GAAG7mD,KAAU,mBAALA,EAAE2+D,KAAyBH,GAAGx+D,GAAGA,EAAE,CAAC3oD,MAAM2oD,EAAEg/D,eAAe1nH,IAAI0oD,EAAEi/D,cAAuFj/D,EAAE,CAACk/D,YAA3El/D,GAAGA,EAAErvB,eAAeqvB,EAAErvB,cAAcwuF,aAAahxG,QAAQpB,gBAA+BmyG,WAAWE,aAAap/D,EAAEo/D,aAAaC,UAAUr/D,EAAEq/D,UAAUC,YAAYt/D,EAAEs/D,aAAcT,IAAIZ,GAAGY,GAAG7+D,KAAK6+D,GAAG7+D,EAAsB,GAApBA,EAAE08D,GAAGkC,GAAG,aAAgBpoH,SAASyD,EAAE,IAAIi8G,GAAG,WAAW,SAAS,KAAKj8G,EAAE8D,GAAGiC,EAAEnJ,KAAK,CAACs6C,MAAMl3C,EAAE+kC,UAAUghB,IAAI/lD,EAAE6G,OAAO69G,KAAK,CACtfjM,GAAG,mjBAAmjBhqG,MAAM,KAC5jB,GAAGgqG,GAAG,oRAAoRhqG,MAAM,KAAK,GAAGgqG,GAAGD,GAAG,GAAG,IAAI,IAAI8M,GAAG,qFAAqF72G,MAAM,KAAK82G,GAAG,EAAEA,GAAGD,GAAG/oH,OAAOgpH,KAAKhN,GAAGlyG,IAAIi/G,GAAGC,IAAI,GAAGvc,GAAG,eAAe,CAAC,WAAW,cACleA,GAAG,eAAe,CAAC,WAAW,cAAcA,GAAG,iBAAiB,CAAC,aAAa,gBAAgBA,GAAG,iBAAiB,CAAC,aAAa,gBAAgBD,GAAG,WAAW,oEAAoEt6F,MAAM,MAAMs6F,GAAG,WAAW,uFAAuFt6F,MAAM,MAAMs6F,GAAG,gBAAgB,CAAC,iBAAiB,WAAW,YAAY,UAAUA,GAAG,mBAAmB,2DAA2Dt6F,MAAM,MAC5fs6F,GAAG,qBAAqB,6DAA6Dt6F,MAAM,MAAMs6F,GAAG,sBAAsB,8DAA8Dt6F,MAAM,MAAM,IAAI+2G,GAAG,sNAAsN/2G,MAAM,KAAKg3G,GAAG,IAAIj8E,IAAI,0CAA0C/6B,MAAM,KAAKvI,OAAOs/G,KACnf,SAASE,GAAG3/G,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAExF,MAAM,gBAAgBwF,EAAEm1G,cAAcp3G,EA/CjE,SAAS6hH,GAAG5/G,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,EAAE2H,EAAEiwC,EAAE3F,GAA4B,GAAzBwqD,GAAGzvG,MAAMhL,KAAKkH,WAAckzG,GAAG,CAAC,IAAGA,GAAgC,MAAM/2G,MAAM8I,EAAE,MAA1C,IAAI8sB,EAAEohF,GAAGD,IAAG,EAAGC,GAAG,KAA8BC,KAAKA,IAAG,EAAGC,GAAGthF,EAAE,CAAC,CA+CpE4yF,CAAG5/D,EAAE/lD,OAAE,EAAO+F,GAAGA,EAAEm1G,cAAc,IAAI,CACxG,SAAS0H,GAAG78G,EAAE/F,GAAGA,EAAE,IAAO,EAAFA,GAAK,IAAI,IAAI8D,EAAE,EAAEA,EAAEiC,EAAExJ,OAAOuH,IAAI,CAAC,IAAIiiD,EAAEhgD,EAAEjC,GAAGsB,EAAE2gD,EAAE7O,MAAM6O,EAAEA,EAAEhhB,UAAUh/B,EAAE,CAAC,IAAI+R,OAAE,EAAO,GAAG9X,EAAE,IAAI,IAAIyf,EAAEsmC,EAAExpD,OAAO,EAAE,GAAGkjB,EAAEA,IAAI,CAAC,IAAIiwC,EAAE3J,EAAEtmC,GAAGsqC,EAAE2F,EAAEw2C,SAASnzE,EAAE28B,EAAEwrD,cAA2B,GAAbxrD,EAAEA,EAAE3sB,SAAYgnB,IAAIjyC,GAAG1S,EAAEi2G,uBAAuB,MAAMt1G,EAAE2/G,GAAGtgH,EAAEsqD,EAAE38B,GAAGjb,EAAEiyC,CAAC,MAAM,IAAItqC,EAAE,EAAEA,EAAEsmC,EAAExpD,OAAOkjB,IAAI,CAAoD,GAA5CsqC,GAAP2F,EAAE3J,EAAEtmC,IAAOymF,SAASnzE,EAAE28B,EAAEwrD,cAAcxrD,EAAEA,EAAE3sB,SAAYgnB,IAAIjyC,GAAG1S,EAAEi2G,uBAAuB,MAAMt1G,EAAE2/G,GAAGtgH,EAAEsqD,EAAE38B,GAAGjb,EAAEiyC,CAAC,CAAC,CAAC,CAAC,GAAGqqD,GAAG,MAAMruG,EAAEsuG,GAAGD,IAAG,EAAGC,GAAG,KAAKtuG,CAAE,CAC5a,SAAS6/G,EAAE7/G,EAAE/F,GAAG,IAAI8D,EAAE+hH,GAAG7lH,GAAG+lD,EAAEhgD,EAAE,WAAWjC,EAAEmc,IAAI8lC,KAAK+/D,GAAG9lH,EAAE+F,EAAE,GAAE,GAAIjC,EAAE28B,IAAIslB,GAAG,CAAC,IAAIggE,GAAG,kBAAkB9hH,KAAK+mB,SAASlqB,SAAS,IAAI3B,MAAM,GAAG,SAAS6mH,GAAGjgH,GAAGA,EAAEggH,MAAMhgH,EAAEggH,KAAI,EAAGld,EAAG7iF,SAAQ,SAAShmB,GAAGylH,GAAGxlG,IAAIjgB,IAAIimH,GAAGjmH,GAAE,EAAG+F,EAAE,MAAMkgH,GAAGjmH,GAAE,EAAG+F,EAAE,KAAK,IAAG,CAC9O,SAASkgH,GAAGlgH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAE,EAAEpE,UAAUzE,aAAQ,IAASyE,UAAU,GAAGA,UAAU,GAAG,EAAE8W,EAAEhU,EAA6D,GAA3D,oBAAoBiC,GAAG,IAAIjC,EAAE2xB,WAAW3d,EAAEhU,EAAE4yB,eAAkB,OAAOqvB,IAAI/lD,GAAGylH,GAAGxlG,IAAIla,GAAG,CAAC,GAAG,WAAWA,EAAE,OAAOX,GAAG,EAAE0S,EAAEiuC,CAAC,CAAC,IAAItmC,EAAEomG,GAAG/tG,GAAG43C,EAAE3pD,EAAE,MAAM/F,EAAE,UAAU,UAAUyf,EAAEQ,IAAIyvC,KAAK1vD,IAAIoF,GAAG,GAAG0gH,GAAGhuG,EAAE/R,EAAEX,EAAEpF,GAAGyf,EAAEghB,IAAIivB,GAAG,CACrS,SAASo2D,GAAG//G,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEmzG,GAAG9yG,IAAIzF,GAAG,YAAO,IAASoF,EAAE,EAAEA,GAAG,KAAK,EAAEA,EAAE+0G,GAAG,MAAM,KAAK,EAAE/0G,EAAE0lB,GAAG,MAAM,QAAQ1lB,EAAEg1G,GAAGt2G,EAAEsB,EAAEmK,KAAK,KAAKvP,EAAE8D,EAAEiC,GAAGX,OAAE,GAAQ0uG,IAAI,eAAe9zG,GAAG,cAAcA,GAAG,UAAUA,IAAIoF,GAAE,GAAI2gD,OAAE,IAAS3gD,EAAEW,EAAE6N,iBAAiB5T,EAAE8D,EAAE,CAACoiH,SAAQ,EAAGC,QAAQ/gH,IAAIW,EAAE6N,iBAAiB5T,EAAE8D,GAAE,QAAI,IAASsB,EAAEW,EAAE6N,iBAAiB5T,EAAE8D,EAAE,CAACqiH,QAAQ/gH,IAAIW,EAAE6N,iBAAiB5T,EAAE8D,GAAE,EAAG,CACvW,SAASw2G,GAAGv0G,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI0S,EAAEiuC,EAAE,GAAG,IAAO,EAAF/lD,IAAM,IAAO,EAAFA,IAAM,OAAO+lD,EAAEhgD,EAAE,OAAO,CAAC,GAAG,OAAOggD,EAAE,OAAO,IAAItmC,EAAEsmC,EAAE3uC,IAAI,GAAG,IAAIqI,GAAG,IAAIA,EAAE,CAAC,IAAIiwC,EAAE3J,EAAEmtD,UAAU4D,cAAc,GAAGpnD,IAAItqD,GAAG,IAAIsqD,EAAEj6B,UAAUi6B,EAAEj0B,aAAar2B,EAAE,MAAM,GAAG,IAAIqa,EAAE,IAAIA,EAAEsmC,EAAE2uD,OAAO,OAAOj1F,GAAG,CAAC,IAAIsqC,EAAEtqC,EAAErI,IAAI,IAAG,IAAI2yC,GAAG,IAAIA,MAAKA,EAAEtqC,EAAEyzF,UAAU4D,iBAAkB1xG,GAAG,IAAI2kD,EAAEt0B,UAAUs0B,EAAEtuB,aAAar2B,GAAE,OAAOqa,EAAEA,EAAEi1F,MAAM,CAAC,KAAK,OAAOhlD,GAAG,CAAS,GAAG,QAAXjwC,EAAEi3F,GAAGhnD,IAAe,OAAe,GAAG,KAAX3F,EAAEtqC,EAAErI,MAAc,IAAI2yC,EAAE,CAAChE,EAAEjuC,EAAE2H,EAAE,SAAS1Z,CAAC,CAAC2pD,EAAEA,EAAEj0B,UAAU,CAAC,CAACsqB,EAAEA,EAAE2uD,MAAM,EAvDnd,SAAS0R,GAAGrgH,EAAE/F,EAAE8D,GAAG,GAAG6vG,GAAG,OAAO5tG,EAAE/F,EAAE8D,GAAG6vG,IAAG,EAAG,IAAI,OAAOF,GAAG1tG,EAAE/F,EAAE8D,EAAE,CAAC,QAAQ6vG,IAAG,EAAGC,IAAI,CAAC,CAuD+XwS,EAAG,WAAW,IAAIrgE,EAAEjuC,EAAE1S,EAAEstG,GAAG5uG,GAAG2b,EAAE,GACpf1Z,EAAE,CAAC,IAAI2pD,EAAE4oD,GAAG7yG,IAAIM,GAAG,QAAG,IAAS2pD,EAAE,CAAC,IAAI3F,EAAEkyD,GAAGj2G,EAAED,EAAE,OAAOA,GAAG,IAAK,WAAW,GAAG,IAAI20G,GAAG52G,GAAG,MAAMiC,EAAE,IAAK,UAAU,IAAK,QAAQgkD,EAAE41D,GAAG,MAAM,IAAK,UAAU35G,EAAE,QAAQ+jD,EAAE6zD,GAAG,MAAM,IAAK,WAAW53G,EAAE,OAAO+jD,EAAE6zD,GAAG,MAAM,IAAK,aAAa,IAAK,YAAY7zD,EAAE6zD,GAAG,MAAM,IAAK,QAAQ,GAAG,IAAI95G,EAAEq5G,OAAO,MAAMp3G,EAAE,IAAK,WAAW,IAAK,WAAW,IAAK,YAAY,IAAK,YAAY,IAAK,UAAU,IAAK,WAAW,IAAK,YAAY,IAAK,cAAcgkD,EAAE0zD,GAAG,MAAM,IAAK,OAAO,IAAK,UAAU,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,OAAO1zD,EAC1iB2zD,GAAG,MAAM,IAAK,cAAc,IAAK,WAAW,IAAK,YAAY,IAAK,aAAa3zD,EAAEu2D,GAAG,MAAM,KAAKpI,GAAG,KAAKC,GAAG,KAAKC,GAAGruD,EAAE8zD,GAAG,MAAM,KAAKxF,GAAGtuD,EAAE02D,GAAG,MAAM,IAAK,SAAS12D,EAAEsyD,GAAG,MAAM,IAAK,QAAQtyD,EAAEm3D,GAAG,MAAM,IAAK,OAAO,IAAK,MAAM,IAAK,QAAQn3D,EAAEm0D,GAAG,MAAM,IAAK,oBAAoB,IAAK,qBAAqB,IAAK,gBAAgB,IAAK,cAAc,IAAK,cAAc,IAAK,aAAa,IAAK,cAAc,IAAK,YAAYn0D,EAAE61D,GAAG,IAAIn8E,EAAE,IAAO,EAAFzjC,GAAKqmH,GAAG5iF,GAAG,WAAW19B,EAAEugH,EAAE7iF,EAAE,OAAOisB,EAAEA,EAAE,UAAU,KAAKA,EAAEjsB,EAAE,GAAG,IAAI,IAAQ8iF,GAAJC,GAAEzgE,EAAI,OAC/eygE,IAAG,CAAK,IAAIx8D,IAARu8D,GAAEC,IAAUtT,UAAsF,GAA5E,IAAIqT,GAAEnvG,KAAK,OAAO4yC,KAAIu8D,GAAEv8D,GAAE,OAAOs8D,IAAc,OAAVt8D,GAAE6pD,GAAG2S,GAAEF,KAAY7iF,EAAE7mC,KAAK6pH,GAAGD,GAAEx8D,GAAEu8D,OAASF,EAAE,MAAMG,GAAEA,GAAE9R,MAAM,CAAC,EAAEjxE,EAAElnC,SAASmzD,EAAE,IAAI3F,EAAE2F,EAAE1pD,EAAE,KAAKlC,EAAEsB,GAAGqa,EAAE7iB,KAAK,CAACs6C,MAAMwY,EAAE3qB,UAAUtB,IAAI,CAAC,CAAC,GAAG,IAAO,EAAFzjC,GAAK,CAA4E,GAAnC+pD,EAAE,aAAahkD,GAAG,eAAeA,KAAtE2pD,EAAE,cAAc3pD,GAAG,gBAAgBA,IAA2C,IAAO,GAAF/F,MAAQgG,EAAElC,EAAEu5G,eAAev5G,EAAEw5G,eAAe5G,GAAG1wG,KAAIA,EAAE0gH,OAAgB38D,GAAG2F,KAAGA,EAAEtqD,EAAE8O,SAAS9O,EAAEA,GAAGsqD,EAAEtqD,EAAEsxB,eAAeg5B,EAAEw1D,aAAax1D,EAAEroC,aAAanT,OAAU61C,GAAqCA,EAAEhE,EAAiB,QAAf//C,GAAnCA,EAAElC,EAAEu5G,eAAev5G,EAAE4qF,WAAkBgoB,GAAG1wG,GAAG,QACleA,KAARqgH,EAAE7R,GAAGxuG,KAAU,IAAIA,EAAEoR,KAAK,IAAIpR,EAAEoR,OAAKpR,EAAE,QAAU+jD,EAAE,KAAK/jD,EAAE+/C,GAAKgE,IAAI/jD,GAAE,CAAgU,GAA/Ty9B,EAAEg6E,GAAGzzD,GAAE,eAAes8D,EAAE,eAAeE,GAAE,QAAW,eAAezgH,GAAG,gBAAgBA,IAAE09B,EAAEm8E,GAAG51D,GAAE,iBAAiBs8D,EAAE,iBAAiBE,GAAE,WAAUH,EAAE,MAAMt8D,EAAE2F,EAAEozD,GAAG/4D,GAAGw8D,GAAE,MAAMvgH,EAAE0pD,EAAEozD,GAAG98G,IAAG0pD,EAAE,IAAIjsB,EAAEumB,GAAEw8D,GAAE,QAAQz8D,EAAEjmD,EAAEsB,IAAKyB,OAAOw/G,EAAE32D,EAAE2tD,cAAckJ,GAAEv8D,GAAE,KAAK0sD,GAAGtxG,KAAK2gD,KAAItiB,EAAE,IAAIA,EAAE6iF,EAAEE,GAAE,QAAQxgH,EAAElC,EAAEsB,IAAKyB,OAAO0/G,GAAE9iF,EAAE45E,cAAcgJ,EAAEr8D,GAAEvmB,GAAG4iF,EAAEr8D,GAAKD,GAAG/jD,EAAEhG,EAAE,CAAa,IAARsmH,EAAEtgH,EAAEwgH,GAAE,EAAMD,GAAhB9iF,EAAEsmB,EAAkBw8D,GAAEA,GAAEI,GAAGJ,IAAGC,KAAQ,IAAJD,GAAE,EAAMv8D,GAAEs8D,EAAEt8D,GAAEA,GAAE28D,GAAG38D,IAAGu8D,KAAI,KAAK,EAAEC,GAAED,IAAG9iF,EAAEkjF,GAAGljF,GAAG+iF,KAAI,KAAK,EAAED,GAAEC,IAAGF,EACpfK,GAAGL,GAAGC,KAAI,KAAKC,MAAK,CAAC,GAAG/iF,IAAI6iF,GAAG,OAAOA,GAAG7iF,IAAI6iF,EAAE7R,UAAU,MAAMz0G,EAAEyjC,EAAEkjF,GAAGljF,GAAG6iF,EAAEK,GAAGL,EAAE,CAAC7iF,EAAE,IAAI,MAAMA,EAAE,KAAK,OAAOsmB,GAAG68D,GAAGnnG,EAAEiwC,EAAE3F,EAAEtmB,GAAE,GAAI,OAAOz9B,GAAG,OAAOqgH,GAAGO,GAAGnnG,EAAE4mG,EAAErgH,EAAEy9B,GAAE,EAAG,CAA8D,GAAG,YAA1CsmB,GAAjB2F,EAAE3J,EAAE+8D,GAAG/8D,GAAG7xC,QAAWipB,UAAUuyB,EAAEvyB,SAAS/7B,gBAA+B,UAAU2oD,GAAG,SAAS2F,EAAEnvD,KAAK,IAAIsmH,GAAE9D,QAAQ,GAAGR,GAAG7yD,GAAG,GAAGszD,GAAG6D,GAAEjD,OAAO,CAACiD,GAAEnD,GAAG,IAAIoD,GAAEtD,EAAE,MAAMz5D,EAAE2F,EAAEvyB,WAAW,UAAU4sB,EAAE3oD,gBAAgB,aAAasuD,EAAEnvD,MAAM,UAAUmvD,EAAEnvD,QAAQsmH,GAAElD,IAClV,OADyVkD,KAAIA,GAAEA,GAAE9gH,EAAEggD,IAAKy8D,GAAG/iG,EAAEonG,GAAE/iH,EAAEsB,IAAW0hH,IAAGA,GAAE/gH,EAAE2pD,EAAE3J,GAAG,aAAahgD,IAAI+gH,GAAEp3D,EAAEs9C,gBACte8Z,GAAE3Z,YAAY,WAAWz9C,EAAEnvD,MAAM+sG,GAAG59C,EAAE,SAASA,EAAE9wD,QAAOkoH,GAAE/gE,EAAE+8D,GAAG/8D,GAAG7xC,OAAcnO,GAAG,IAAK,WAAaw8G,GAAGuE,KAAI,SAASA,GAAEtC,mBAAgBE,GAAGoC,GAAEnC,GAAG5+D,EAAE6+D,GAAG,MAAK,MAAM,IAAK,WAAWA,GAAGD,GAAGD,GAAG,KAAK,MAAM,IAAK,YAAYG,IAAG,EAAG,MAAM,IAAK,cAAc,IAAK,UAAU,IAAK,UAAUA,IAAG,EAAGC,GAAGrlG,EAAE3b,EAAEsB,GAAG,MAAM,IAAK,kBAAkB,GAAGq/G,GAAG,MAAM,IAAK,UAAU,IAAK,QAAQK,GAAGrlG,EAAE3b,EAAEsB,GAAG,IAAI2hH,GAAE,GAAG3F,GAAGphH,EAAE,CAAC,OAAO+F,GAAG,IAAK,mBAAmB,IAAIihH,GAAE,qBAAqB,MAAMhnH,EAAE,IAAK,iBAAiBgnH,GAAE,mBAAmB,MAAMhnH,EACrf,IAAK,oBAAoBgnH,GAAE,sBAAsB,MAAMhnH,EAAEgnH,QAAE,CAAM,MAAMnF,GAAGF,GAAG57G,EAAEjC,KAAKkjH,GAAE,oBAAoB,YAAYjhH,GAAG,MAAMjC,EAAE62G,UAAUqM,GAAE,sBAAsBA,KAAIxF,IAAI,OAAO19G,EAAE27G,SAASoC,IAAI,uBAAuBmF,GAAE,qBAAqBA,IAAGnF,KAAKkF,GAAEtM,OAAYD,GAAG,UAARD,GAAGn1G,GAAkBm1G,GAAG37G,MAAM27G,GAAGvnG,YAAY6uG,IAAG,IAAe,GAAViF,GAAErE,GAAG18D,EAAEihE,KAAOzqH,SAASyqH,GAAE,IAAI7I,GAAG6I,GAAEjhH,EAAE,KAAKjC,EAAEsB,GAAGqa,EAAE7iB,KAAK,CAACs6C,MAAM8vE,GAAEjiF,UAAU+hF,KAAIC,GAAEC,GAAEvmH,KAAKsmH,GAAW,QAARA,GAAEnF,GAAG99G,MAAckjH,GAAEvmH,KAAKsmH,OAASA,GAAExF,GA1BjK,SAAS0F,GAAGlhH,EAAE/F,GAAG,OAAO+F,GAAG,IAAK,iBAAiB,OAAO67G,GAAG5hH,GAAG,IAAK,WAAW,OAAG,KAAKA,EAAE0/G,MAAa,MAAKgC,IAAG,EAAUD,IAAG,IAAK,YAAY,OAAO17G,EAAE/F,EAAES,QAASghH,IAAIC,GAAG,KAAK37G,EAAE,QAAQ,OAAO,KAAK,CA0B7BkhH,CAAGlhH,EAAEjC,GAzB1b,SAASojH,GAAGnhH,EAAE/F,GAAG,GAAG6hH,GAAG,MAAM,mBAAmB97G,IAAIq7G,IAAIO,GAAG57G,EAAE/F,IAAI+F,EAAE00G,KAAKn/D,GAAGk/D,GAAGD,GAAG,KAAKsH,IAAG,EAAG97G,GAAG,KAAK,OAAOA,GAAG,IAAK,QAAgQ,QAAQ,OAAO,KAA3P,IAAK,WAAW,KAAK/F,EAAE68G,SAAS78G,EAAE+8G,QAAQ/8G,EAAEg9G,UAAUh9G,EAAE68G,SAAS78G,EAAE+8G,OAAO,CAAC,GAAG/8G,EAAEmnH,MAAM,EAAEnnH,EAAEmnH,KAAK5qH,OAAO,OAAOyD,EAAEmnH,KAAK,GAAGnnH,EAAE0/G,MAAM,OAAO7kH,OAAOC,aAAakF,EAAE0/G,MAAM,CAAC,OAAO,KAAK,IAAK,iBAAiB,OAAO8B,IAAI,OAAOxhH,EAAEy/G,OAAO,KAAKz/G,EAAES,KAAyB,CAyBsDymH,CAAGnhH,EAAEjC,MAA2B,GAAxBiiD,EAAE08D,GAAG18D,EAAE,kBAAqBxpD,SAAS6I,EAAE,IAAI+4G,GAAG,gBACnf,cAAc,KAAKr6G,EAAEsB,GAAGqa,EAAE7iB,KAAK,CAACs6C,MAAM9xC,EAAE2/B,UAAUghB,IAAI3gD,EAAE3E,KAAKsmH,IAAE,CAACnE,GAAGnjG,EAAEzf,EAAE,GAAE,CAAC,SAASymH,GAAG1gH,EAAE/F,EAAE8D,GAAG,MAAM,CAACoiG,SAASngG,EAAEg9B,SAAS/iC,EAAEk7G,cAAcp3G,EAAE,CAAC,SAAS2+G,GAAG18G,EAAE/F,GAAG,IAAI,IAAI8D,EAAE9D,EAAE,UAAU+lD,EAAE,GAAG,OAAOhgD,GAAG,CAAC,IAAIX,EAAEW,EAAE+R,EAAE1S,EAAE8tG,UAAU,IAAI9tG,EAAEgS,KAAK,OAAOU,IAAI1S,EAAE0S,EAAY,OAAVA,EAAE+7F,GAAG9tG,EAAEjC,KAAYiiD,EAAExiB,QAAQkjF,GAAG1gH,EAAE+R,EAAE1S,IAAc,OAAV0S,EAAE+7F,GAAG9tG,EAAE/F,KAAY+lD,EAAEnpD,KAAK6pH,GAAG1gH,EAAE+R,EAAE1S,KAAKW,EAAEA,EAAE2uG,MAAM,CAAC,OAAO3uD,CAAC,CAAC,SAAS4gE,GAAG5gH,GAAG,GAAG,OAAOA,EAAE,OAAO,KAAK,GAAGA,EAAEA,EAAE2uG,aAAa3uG,GAAG,IAAIA,EAAEqR,KAAK,OAAOrR,GAAI,IAAI,CAC5a,SAAS6gH,GAAG7gH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI,IAAI0S,EAAE9X,EAAEg7G,WAAWv7F,EAAE,GAAG,OAAO3b,GAAGA,IAAIiiD,GAAG,CAAC,IAAI2J,EAAE5rD,EAAEimD,EAAE2F,EAAE+kD,UAAU1hF,EAAE28B,EAAEwjD,UAAU,GAAG,OAAOnpD,GAAGA,IAAIhE,EAAE,MAAM,IAAI2J,EAAEt4C,KAAK,OAAO2b,IAAI28B,EAAE38B,EAAE3tB,EAAa,OAAV2kD,EAAE8pD,GAAG/vG,EAAEgU,KAAY2H,EAAE8jB,QAAQkjF,GAAG3iH,EAAEimD,EAAE2F,IAAKtqD,GAAc,OAAV2kD,EAAE8pD,GAAG/vG,EAAEgU,KAAY2H,EAAE7iB,KAAK6pH,GAAG3iH,EAAEimD,EAAE2F,KAAM5rD,EAAEA,EAAE4wG,MAAM,CAAC,IAAIj1F,EAAEljB,QAAQwJ,EAAEnJ,KAAK,CAACs6C,MAAMl3C,EAAE+kC,UAAUtlB,GAAG,CAAC,SAAS2nG,KAAK,CAAC,IAAIC,GAAG,KAAKC,GAAG,KAAK,SAASC,GAAGxhH,EAAE/F,GAAG,OAAO+F,GAAG,IAAK,SAAS,IAAK,QAAQ,IAAK,SAAS,IAAK,WAAW,QAAQ/F,EAAEwnH,UAAU,OAAM,CAAE,CAC7b,SAASC,GAAG1hH,EAAE/F,GAAG,MAAM,aAAa+F,GAAG,WAAWA,GAAG,aAAaA,GAAG,iBAAkB/F,EAAEmtC,UAAU,iBAAkBntC,EAAEmtC,UAAU,iBAAkBntC,EAAE8tG,yBAAyB,OAAO9tG,EAAE8tG,yBAAyB,MAAM9tG,EAAE8tG,wBAAwB4Z,MAAM,CAAC,IAAIt8D,GAAG,mBAAoBqe,WAAWA,gBAAW,EAAOk+C,GAAG,mBAAoB17C,aAAaA,kBAAa,EAAO,SAAS27C,GAAG7hH,GAAG,IAAIA,EAAE0vB,SAAS1vB,EAAEiN,YAAY,GAAG,IAAIjN,EAAE0vB,WAAoB,OAAT1vB,EAAEA,EAAEuO,QAAevO,EAAEiN,YAAY,IAAI,CAC5c,SAAS60G,GAAG9hH,GAAG,KAAK,MAAMA,EAAEA,EAAEA,EAAEwxC,YAAY,CAAC,IAAIv3C,EAAE+F,EAAE0vB,SAAS,GAAG,IAAIz1B,GAAG,IAAIA,EAAE,KAAK,CAAC,OAAO+F,CAAC,CAAC,SAAS+hH,GAAG/hH,GAAGA,EAAEA,EAAEgiH,gBAAgB,IAAI,IAAI/nH,EAAE,EAAE+F,GAAG,CAAC,GAAG,IAAIA,EAAE0vB,SAAS,CAAC,IAAI3xB,EAAEiC,EAAEtF,KAAK,GAAG,MAAMqD,GAAG,OAAOA,GAAG,OAAOA,EAAE,CAAC,GAAG,IAAI9D,EAAE,OAAO+F,EAAE/F,GAAG,KAAK,OAAO8D,GAAG9D,GAAG,CAAC+F,EAAEA,EAAEgiH,eAAe,CAAC,OAAO,IAAI,CAAC,IAAIC,GAAG,EAA0D,IAAIC,GAAGhkH,KAAK+mB,SAASlqB,SAAS,IAAI3B,MAAM,GAAG+oH,GAAG,gBAAgBD,GAAGE,GAAG,gBAAgBF,GAAGvB,GAAG,oBAAoBuB,GAAGG,GAAG,iBAAiBH,GAC9d,SAASvR,GAAG3wG,GAAG,IAAI/F,EAAE+F,EAAEmiH,IAAI,GAAGloH,EAAE,OAAOA,EAAE,IAAI,IAAI8D,EAAEiC,EAAE01B,WAAW33B,GAAG,CAAC,GAAG9D,EAAE8D,EAAE4iH,KAAK5iH,EAAEokH,IAAI,CAAe,GAAdpkH,EAAE9D,EAAEy0G,UAAa,OAAOz0G,EAAEutC,OAAO,OAAOzpC,GAAG,OAAOA,EAAEypC,MAAM,IAAIxnC,EAAE+hH,GAAG/hH,GAAG,OAAOA,GAAG,CAAC,GAAGjC,EAAEiC,EAAEmiH,IAAI,OAAOpkH,EAAEiC,EAAE+hH,GAAG/hH,EAAE,CAAC,OAAO/F,CAAC,CAAK8D,GAAJiC,EAAEjC,GAAM23B,UAAU,CAAC,OAAO,IAAI,CAAC,SAASw3E,GAAGltG,GAAkB,QAAfA,EAAEA,EAAEmiH,KAAKniH,EAAE2gH,MAAc,IAAI3gH,EAAEqR,KAAK,IAAIrR,EAAEqR,KAAK,KAAKrR,EAAEqR,KAAK,IAAIrR,EAAEqR,IAAI,KAAKrR,CAAC,CAAC,SAAS+8G,GAAG/8G,GAAG,GAAG,IAAIA,EAAEqR,KAAK,IAAIrR,EAAEqR,IAAI,OAAOrR,EAAEmtG,UAAU,MAAM/1G,MAAM8I,EAAE,IAAK,CAAC,SAASktG,GAAGptG,GAAG,OAAOA,EAAEoiH,KAAK,IAAI,CACtb,SAAStC,GAAG9/G,GAAG,IAAI/F,EAAE+F,EAAEqiH,IAAkC,YAA9B,IAASpoH,IAAIA,EAAE+F,EAAEqiH,IAAI,IAAI5+E,KAAYxpC,CAAC,CAAC,IAAIqoH,GAAG,GAAGC,IAAI,EAAE,SAASC,GAAGxiH,GAAG,MAAM,CAACyiB,QAAQziB,EAAE,CAAC,SAASyiH,EAAEziH,GAAG,EAAEuiH,KAAKviH,EAAEyiB,QAAQ6/F,GAAGC,IAAID,GAAGC,IAAI,KAAKA,KAAK,CAAC,SAASG,EAAE1iH,EAAE/F,GAAGsoH,KAAKD,GAAGC,IAAIviH,EAAEyiB,QAAQziB,EAAEyiB,QAAQxoB,CAAC,CAAC,IAAI0oH,GAAG,CAAC,EAAEC,GAAEJ,GAAGG,IAAIE,GAAEL,IAAG,GAAIM,GAAGH,GAC5P,SAASI,GAAG/iH,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAExF,KAAK0jD,aAAa,IAAIngD,EAAE,OAAO4kH,GAAG,IAAI3iE,EAAEhgD,EAAEmtG,UAAU,GAAGntD,GAAGA,EAAEgjE,8CAA8C/oH,EAAE,OAAO+lD,EAAEijE,0CAA0C,IAASlxG,EAAL1S,EAAE,CAAC,EAAI,IAAI0S,KAAKhU,EAAEsB,EAAE0S,GAAG9X,EAAE8X,GAAoH,OAAjHiuC,KAAIhgD,EAAEA,EAAEmtG,WAAY6V,4CAA4C/oH,EAAE+F,EAAEijH,0CAA0C5jH,GAAUA,CAAC,CAAC,SAAS6jH,GAAGljH,GAAyB,OAAO,OAA7BA,EAAEA,EAAEg+C,kBAA6C,CAAC,SAASmlE,KAAKV,EAAEI,IAAGJ,EAAEG,GAAE,CAAC,SAASQ,GAAGpjH,EAAE/F,EAAE8D,GAAG,GAAG6kH,GAAEngG,UAAUkgG,GAAG,MAAMvrH,MAAM8I,EAAE,MAAMwiH,EAAEE,GAAE3oH,GAAGyoH,EAAEG,GAAE9kH,EAAE,CACjf,SAASslH,GAAGrjH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAEmtG,UAAgC,GAAtBntG,EAAE/F,EAAE+jD,kBAAqB,mBAAoBgC,EAAEsjE,gBAAgB,OAAOvlH,EAAwB,IAAI,IAAIsB,KAA9B2gD,EAAEA,EAAEsjE,kBAAiC,KAAKjkH,KAAKW,GAAG,MAAM5I,MAAM8I,EAAE,IAAI+lG,GAAGhsG,IAAI,UAAUoF,IAAI,OAAOtD,EAAE,CAAC,EAAEgC,EAAEiiD,EAAE,CAAC,SAASujE,GAAGvjH,GAAyG,OAAtGA,GAAGA,EAAEA,EAAEmtG,YAAYntG,EAAEwjH,2CAA2Cb,GAAGG,GAAGF,GAAEngG,QAAQigG,EAAEE,GAAE5iH,GAAG0iH,EAAEG,GAAEA,GAAEpgG,UAAe,CAAE,CAAC,SAASghG,GAAGzjH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAEmtG,UAAU,IAAIntD,EAAE,MAAM5oD,MAAM8I,EAAE,MAAMnC,GAAGiC,EAAEqjH,GAAGrjH,EAAE/F,EAAE6oH,IAAI9iE,EAAEwjE,0CAA0CxjH,EAAEyiH,EAAEI,IAAGJ,EAAEG,IAAGF,EAAEE,GAAE5iH,IAAIyiH,EAAEI,IAAGH,EAAEG,GAAE9kH,EAAE,CAC/e,IAAI2lH,GAAG,KAAKC,GAAG,KAAKC,GAAG/gB,EAAEgO,yBAAyBgT,GAAGhhB,EAAEwO,0BAA0ByS,GAAGjhB,EAAEkhB,wBAAwBC,GAAGnhB,EAAEohB,qBAAqBC,GAAGrhB,EAAEshB,sBAAsBC,GAAGvhB,EAAE+P,aAAayR,GAAGxhB,EAAEyhB,iCAAiCC,GAAG1hB,EAAE2hB,2BAA2BC,GAAG5hB,EAAEoR,8BAA8ByQ,GAAG7hB,EAAEyO,wBAAwBqT,GAAG9hB,EAAE+hB,qBAAqBC,GAAGhiB,EAAEiiB,sBAAsBC,GAAG,CAAC,EAAEC,QAAG,IAASd,GAAGA,GAAG,WAAW,EAAEe,GAAG,KAAKC,GAAG,KAAKC,IAAG,EAAGC,GAAGhB,KAAKxzG,GAAE,IAAIw0G,GAAGhB,GAAG,WAAW,OAAOA,KAAKgB,EAAE,EACxd,SAASC,KAAK,OAAOhB,MAAM,KAAKE,GAAG,OAAO,GAAG,KAAKE,GAAG,OAAO,GAAG,KAAKC,GAAG,OAAO,GAAG,KAAKC,GAAG,OAAO,GAAG,KAAKE,GAAG,OAAO,GAAG,QAAQ,MAAMztH,MAAM8I,EAAE,MAAO,CAAC,SAASolH,GAAGtlH,GAAG,OAAOA,GAAG,KAAK,GAAG,OAAOukH,GAAG,KAAK,GAAG,OAAOE,GAAG,KAAK,GAAG,OAAOC,GAAG,KAAK,GAAG,OAAOC,GAAG,KAAK,GAAG,OAAOE,GAAG,QAAQ,MAAMztH,MAAM8I,EAAE,MAAO,CAAC,SAASqlH,GAAGvlH,EAAE/F,GAAW,OAAR+F,EAAEslH,GAAGtlH,GAAU4jH,GAAG5jH,EAAE/F,EAAE,CAAC,SAASurH,GAAGxlH,EAAE/F,EAAE8D,GAAW,OAARiC,EAAEslH,GAAGtlH,GAAU6jH,GAAG7jH,EAAE/F,EAAE8D,EAAE,CAAC,SAAS0nH,KAAK,GAAG,OAAOP,GAAG,CAAC,IAAIllH,EAAEklH,GAAGA,GAAG,KAAKpB,GAAG9jH,EAAE,CAAC0lH,IAAI,CAC/a,SAASA,KAAK,IAAIP,IAAI,OAAOF,GAAG,CAACE,IAAG,EAAG,IAAInlH,EAAE,EAAE,IAAI,IAAI/F,EAAEgrH,GAAGM,GAAG,IAAG,WAAW,KAAKvlH,EAAE/F,EAAEzD,OAAOwJ,IAAI,CAAC,IAAIjC,EAAE9D,EAAE+F,GAAG,GAAGjC,EAAEA,GAAE,SAAU,OAAOA,EAAE,CAAC,IAAGknH,GAAG,IAAI,CAAC,MAAMlnH,GAAG,MAAM,OAAOknH,KAAKA,GAAGA,GAAG7rH,MAAM4G,EAAE,IAAI6jH,GAAGU,GAAGkB,IAAI1nH,CAAE,CAAC,QAAQonH,IAAG,CAAE,CAAC,CAAC,CAAC,IAAIQ,GAAGrhB,GAAGshB,wBAAwB,SAASC,GAAG7lH,EAAE/F,GAAG,GAAG+F,GAAGA,EAAEm+C,aAAa,CAA4B,IAAI,IAAIpgD,KAAnC9D,EAAE8B,EAAE,CAAC,EAAE9B,GAAG+F,EAAEA,EAAEm+C,kBAA4B,IAASlkD,EAAE8D,KAAK9D,EAAE8D,GAAGiC,EAAEjC,IAAI,OAAO9D,CAAC,CAAC,OAAOA,CAAC,CAAC,IAAI6rH,GAAGtD,GAAG,MAAMuD,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAK,SAASC,KAAKD,GAAGD,GAAGD,GAAG,IAAI,CAChc,SAASI,GAAGnmH,GAAG,IAAI/F,EAAE6rH,GAAGrjG,QAAQggG,EAAEqD,IAAI9lH,EAAExF,KAAK0rG,SAASkgB,cAAcnsH,CAAC,CAAC,SAASosH,GAAGrmH,EAAE/F,GAAG,KAAK,OAAO+F,GAAG,CAAC,IAAIjC,EAAEiC,EAAE0uG,UAAU,IAAI1uG,EAAEsmH,WAAWrsH,KAAKA,EAAE,IAAG,OAAO8D,IAAIA,EAAEuoH,WAAWrsH,KAAKA,EAAE,MAAW8D,EAAEuoH,YAAYrsH,CAAC,MAAM+F,EAAEsmH,YAAYrsH,EAAE,OAAO8D,IAAIA,EAAEuoH,YAAYrsH,GAAG+F,EAAEA,EAAE2uG,MAAM,CAAC,CAAC,SAAS4X,GAAGvmH,EAAE/F,GAAG8rH,GAAG/lH,EAAEimH,GAAGD,GAAG,KAAsB,QAAjBhmH,EAAEA,EAAEwmH,eAAuB,OAAOxmH,EAAEymH,eAAe,IAAKzmH,EAAE0mH,MAAMzsH,KAAK0sH,IAAG,GAAI3mH,EAAEymH,aAAa,KAAK,CAC5Y,SAASG,GAAG5mH,EAAE/F,GAAG,GAAGgsH,KAAKjmH,IAAG,IAAK/F,GAAG,IAAIA,EAAmG,GAA7F,iBAAkBA,GAAG,aAAaA,IAAEgsH,GAAGjmH,EAAE/F,EAAE,YAAWA,EAAE,CAAC8kC,QAAQ/+B,EAAE6mH,aAAa5sH,EAAEoiB,KAAK,MAAS,OAAO2pG,GAAG,CAAC,GAAG,OAAOD,GAAG,MAAM3uH,MAAM8I,EAAE,MAAM8lH,GAAG/rH,EAAE8rH,GAAGS,aAAa,CAACE,MAAM,EAAED,aAAaxsH,EAAE6sH,WAAW,KAAK,MAAMd,GAAGA,GAAG3pG,KAAKpiB,EAAE,OAAO+F,EAAEomH,aAAa,CAAC,IAAIW,IAAG,EAAG,SAASC,GAAGhnH,GAAGA,EAAEinH,YAAY,CAACC,UAAUlnH,EAAE6uG,cAAcsY,gBAAgB,KAAKC,eAAe,KAAKhtG,OAAO,CAACitG,QAAQ,MAAMC,QAAQ,KAAK,CAC/a,SAASC,GAAGvnH,EAAE/F,GAAG+F,EAAEA,EAAEinH,YAAYhtH,EAAEgtH,cAAcjnH,IAAI/F,EAAEgtH,YAAY,CAACC,UAAUlnH,EAAEknH,UAAUC,gBAAgBnnH,EAAEmnH,gBAAgBC,eAAepnH,EAAEonH,eAAehtG,OAAOpa,EAAEoa,OAAOktG,QAAQtnH,EAAEsnH,SAAS,CAAC,SAASE,GAAGxnH,EAAE/F,GAAG,MAAM,CAACwtH,UAAUznH,EAAE0nH,KAAKztH,EAAEoX,IAAI,EAAEw6E,QAAQ,KAAKjV,SAAS,KAAKv6D,KAAK,KAAK,CAAC,SAASsrG,GAAG3nH,EAAE/F,GAAmB,GAAG,QAAnB+F,EAAEA,EAAEinH,aAAwB,CAAY,IAAIlpH,GAAfiC,EAAEA,EAAEoa,QAAeitG,QAAQ,OAAOtpH,EAAE9D,EAAEoiB,KAAKpiB,GAAGA,EAAEoiB,KAAKte,EAAEse,KAAKte,EAAEse,KAAKpiB,GAAG+F,EAAEqnH,QAAQptH,CAAC,CAAC,CACvZ,SAAS2tH,GAAG5nH,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAEinH,YAAYjnE,EAAEhgD,EAAE0uG,UAAU,GAAG,OAAO1uD,GAAoBjiD,KAAhBiiD,EAAEA,EAAEinE,aAAmB,CAAC,IAAI5nH,EAAE,KAAK0S,EAAE,KAAyB,GAAG,QAAvBhU,EAAEA,EAAEopH,iBAA4B,CAAC,EAAE,CAAC,IAAIztG,EAAE,CAAC+tG,UAAU1pH,EAAE0pH,UAAUC,KAAK3pH,EAAE2pH,KAAKr2G,IAAItT,EAAEsT,IAAIw6E,QAAQ9tF,EAAE8tF,QAAQjV,SAAS74E,EAAE64E,SAASv6D,KAAK,MAAM,OAAOtK,EAAE1S,EAAE0S,EAAE2H,EAAE3H,EAAEA,EAAEsK,KAAK3C,EAAE3b,EAAEA,EAAEse,IAAI,OAAO,OAAOte,GAAG,OAAOgU,EAAE1S,EAAE0S,EAAE9X,EAAE8X,EAAEA,EAAEsK,KAAKpiB,CAAC,MAAMoF,EAAE0S,EAAE9X,EAAiH,OAA/G8D,EAAE,CAACmpH,UAAUlnE,EAAEknE,UAAUC,gBAAgB9nH,EAAE+nH,eAAer1G,EAAEqI,OAAO4lC,EAAE5lC,OAAOktG,QAAQtnE,EAAEsnE,cAAStnH,EAAEinH,YAAYlpH,EAAQ,CAAoB,QAAnBiC,EAAEjC,EAAEqpH,gBAAwBrpH,EAAEopH,gBAAgBltH,EAAE+F,EAAEqc,KACnfpiB,EAAE8D,EAAEqpH,eAAentH,CAAC,CACpB,SAAS4tH,GAAG7nH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEW,EAAEinH,YAAYF,IAAG,EAAG,IAAIh1G,EAAE1S,EAAE8nH,gBAAgBztG,EAAEra,EAAE+nH,eAAez9D,EAAEtqD,EAAE+a,OAAOitG,QAAQ,GAAG,OAAO19D,EAAE,CAACtqD,EAAE+a,OAAOitG,QAAQ,KAAK,IAAIrjE,EAAE2F,EAAE38B,EAAEg3B,EAAE3nC,KAAK2nC,EAAE3nC,KAAK,KAAK,OAAO3C,EAAE3H,EAAEib,EAAEtT,EAAE2C,KAAK2Q,EAAEtT,EAAEsqC,EAAE,IAAIloD,EAAEkE,EAAE0uG,UAAU,GAAG,OAAO5yG,EAAE,CAAiB,IAAIgkB,GAApBhkB,EAAEA,EAAEmrH,aAAoBG,eAAetnG,IAAIpG,IAAI,OAAOoG,EAAEhkB,EAAEqrH,gBAAgBn6F,EAAElN,EAAEzD,KAAK2Q,EAAElxB,EAAEsrH,eAAepjE,EAAE,CAAC,CAAC,GAAG,OAAOjyC,EAAE,CAA8B,IAA7B+N,EAAEzgB,EAAE6nH,UAAUxtG,EAAE,EAAE5d,EAAEkxB,EAAEg3B,EAAE,OAAO,CAAC2F,EAAE53C,EAAE21G,KAAK,IAAIvoB,GAAEptF,EAAE01G,UAAU,IAAIznE,EAAE2J,KAAKA,EAAE,CAAC,OAAO7tD,IAAIA,EAAEA,EAAEugB,KAAK,CAACorG,UAAUtoB,GAAEuoB,KAAK,EAAEr2G,IAAIU,EAAEV,IAAIw6E,QAAQ95E,EAAE85E,QAAQjV,SAAS7kE,EAAE6kE,SACrfv6D,KAAK,OAAOrc,EAAE,CAAC,IAAI4V,GAAE5V,EAAEC,GAAE8R,EAAU,OAAR43C,EAAE1vD,EAAEklG,GAAEphG,EAASkC,GAAEoR,KAAK,KAAK,EAAc,GAAG,mBAAfuE,GAAE3V,GAAE4rF,SAAiC,CAAC/rE,EAAElK,GAAExZ,KAAK+iG,GAAEr/E,EAAE6pC,GAAG,MAAM3pD,CAAC,CAAC8f,EAAElK,GAAE,MAAM5V,EAAE,KAAK,EAAE4V,GAAE6mB,OAAe,KAAT7mB,GAAE6mB,MAAY,GAAG,KAAK,EAAsD,GAAG,OAA3CktB,EAAE,mBAAd/zC,GAAE3V,GAAE4rF,SAAgCj2E,GAAExZ,KAAK+iG,GAAEr/E,EAAE6pC,GAAG/zC,IAA0B,MAAM5V,EAAE8f,EAAE/jB,EAAE,CAAC,EAAE+jB,EAAE6pC,GAAG,MAAM3pD,EAAE,KAAK,EAAE+mH,IAAG,EAAG,CAAC,OAAOh1G,EAAE6kE,WAAW52E,EAAEy8B,OAAO,GAAe,QAAZktB,EAAEtqD,EAAEioH,SAAiBjoH,EAAEioH,QAAQ,CAACv1G,GAAG43C,EAAE9yD,KAAKkb,GAAG,MAAMotF,GAAE,CAACsoB,UAAUtoB,GAAEuoB,KAAK/9D,EAAEt4C,IAAIU,EAAEV,IAAIw6E,QAAQ95E,EAAE85E,QAAQjV,SAAS7kE,EAAE6kE,SAASv6D,KAAK,MAAM,OAAOvgB,GAAGkxB,EAAElxB,EAAEqjG,GAAEn7C,EAAElkC,GAAGhkB,EAAEA,EAAEugB,KAAK8iF,GAAEzlF,GAAGiwC,EAAW,GAAG,QAAZ53C,EAAEA,EAAEsK,MAC1e,IAAsB,QAAnBstC,EAAEtqD,EAAE+a,OAAOitG,SAAiB,MAAWt1G,EAAE43C,EAAEttC,KAAKstC,EAAEttC,KAAK,KAAKhd,EAAE+nH,eAAez9D,EAAEtqD,EAAE+a,OAAOitG,QAAQ,KAAI,CAAU,OAAOvrH,IAAIkoD,EAAElkC,GAAGzgB,EAAE6nH,UAAUljE,EAAE3kD,EAAE8nH,gBAAgBn6F,EAAE3tB,EAAE+nH,eAAetrH,EAAEgsH,IAAIpuG,EAAE1Z,EAAE0mH,MAAMhtG,EAAE1Z,EAAE6uG,cAAc/uF,CAAC,CAAC,CAAC,SAASioG,GAAG/nH,EAAE/F,EAAE8D,GAA8B,GAA3BiC,EAAE/F,EAAEqtH,QAAQrtH,EAAEqtH,QAAQ,KAAQ,OAAOtnH,EAAE,IAAI/F,EAAE,EAAEA,EAAE+F,EAAExJ,OAAOyD,IAAI,CAAC,IAAI+lD,EAAEhgD,EAAE/F,GAAGoF,EAAE2gD,EAAE42B,SAAS,GAAG,OAAOv3E,EAAE,CAAqB,GAApB2gD,EAAE42B,SAAS,KAAK52B,EAAEjiD,EAAK,mBAAoBsB,EAAE,MAAMjI,MAAM8I,EAAE,IAAIb,IAAIA,EAAEjD,KAAK4jD,EAAE,CAAC,CAAC,CAAC,IAAIgoE,IAAG,IAAKplB,EAAGpzD,WAAWorD,KAC3b,SAASqtB,GAAGjoH,EAAE/F,EAAE8D,EAAEiiD,GAA8BjiD,EAAE,OAAXA,EAAEA,EAAEiiD,EAAtB/lD,EAAE+F,EAAE6uG,gBAA8C50G,EAAE8B,EAAE,CAAC,EAAE9B,EAAE8D,GAAGiC,EAAE6uG,cAAc9wG,EAAE,IAAIiC,EAAE0mH,QAAQ1mH,EAAEinH,YAAYC,UAAUnpH,EAAE,CAC7I,IAAImqH,GAAG,CAACC,UAAU,SAASnoH,GAAG,SAAOA,EAAEA,EAAEooH,kBAAiB3Z,GAAGzuG,KAAKA,CAAI,EAAEqoH,gBAAgB,SAASroH,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEooH,gBAAgB,IAAIpoE,EAAEsoE,KAAKjpH,EAAEkpH,GAAGvoH,GAAG+R,EAAEy1G,GAAGxnE,EAAE3gD,GAAG0S,EAAE85E,QAAQ5xF,EAAE,MAAS8D,IAAcgU,EAAE6kE,SAAS74E,GAAG4pH,GAAG3nH,EAAE+R,GAAGy2G,GAAGxoH,EAAEX,EAAE2gD,EAAE,EAAEyoE,oBAAoB,SAASzoH,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEooH,gBAAgB,IAAIpoE,EAAEsoE,KAAKjpH,EAAEkpH,GAAGvoH,GAAG+R,EAAEy1G,GAAGxnE,EAAE3gD,GAAG0S,EAAEV,IAAI,EAAEU,EAAE85E,QAAQ5xF,EAAE,MAAS8D,IAAcgU,EAAE6kE,SAAS74E,GAAG4pH,GAAG3nH,EAAE+R,GAAGy2G,GAAGxoH,EAAEX,EAAE2gD,EAAE,EAAE0oE,mBAAmB,SAAS1oH,EAAE/F,GAAG+F,EAAEA,EAAEooH,gBAAgB,IAAIrqH,EAAEuqH,KAAKtoE,EAAEuoE,GAAGvoH,GAAGX,EAAEmoH,GAAGzpH,EAAEiiD,GAAG3gD,EAAEgS,IAAI,EAAE,MAASpX,IAAcoF,EAAEu3E,SACjf38E,GAAG0tH,GAAG3nH,EAAEX,GAAGmpH,GAAGxoH,EAAEggD,EAAEjiD,EAAE,GAAG,SAAS4qH,GAAG3oH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,EAAE2H,GAAiB,MAAM,mBAApB1Z,EAAEA,EAAEmtG,WAAsCyb,sBAAsB5oH,EAAE4oH,sBAAsB5oE,EAAEjuC,EAAE2H,IAAGzf,EAAE1B,YAAW0B,EAAE1B,UAAUswH,wBAAsB5K,GAAGlgH,EAAEiiD,KAAKi+D,GAAG5+G,EAAE0S,GAAK,CACpN,SAAS+2G,GAAG9oH,EAAE/F,EAAE8D,GAAG,IAAIiiD,GAAE,EAAG3gD,EAAEsjH,GAAO5wG,EAAE9X,EAAEgkD,YAA2W,MAA/V,iBAAkBlsC,GAAG,OAAOA,EAAEA,EAAE60G,GAAG70G,IAAI1S,EAAE6jH,GAAGjpH,GAAG6oH,GAAGF,GAAEngG,QAAyB1Q,GAAGiuC,EAAE,OAAtBA,EAAE/lD,EAAEikD,eAAwC6kE,GAAG/iH,EAAEX,GAAGsjH,IAAI1oH,EAAE,IAAIA,EAAE8D,EAAEgU,GAAG/R,EAAE6uG,cAAc,OAAO50G,EAAEwgB,YAAO,IAASxgB,EAAEwgB,MAAMxgB,EAAEwgB,MAAM,KAAKxgB,EAAEyxD,QAAQw8D,GAAGloH,EAAEmtG,UAAUlzG,EAAEA,EAAEmuH,gBAAgBpoH,EAAEggD,KAAIhgD,EAAEA,EAAEmtG,WAAY6V,4CAA4C3jH,EAAEW,EAAEijH,0CAA0ClxG,GAAU9X,CAAC,CAC5Z,SAAS8uH,GAAG/oH,EAAE/F,EAAE8D,EAAEiiD,GAAGhgD,EAAE/F,EAAEwgB,MAAM,mBAAoBxgB,EAAE+uH,2BAA2B/uH,EAAE+uH,0BAA0BjrH,EAAEiiD,GAAG,mBAAoB/lD,EAAEgvH,kCAAkChvH,EAAEgvH,iCAAiClrH,EAAEiiD,GAAG/lD,EAAEwgB,QAAQza,GAAGkoH,GAAGO,oBAAoBxuH,EAAEA,EAAEwgB,MAAM,KAAK,CACpQ,SAASyuG,GAAGlpH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEW,EAAEmtG,UAAU9tG,EAAE6iB,MAAMnkB,EAAEsB,EAAEob,MAAMza,EAAE6uG,cAAcxvG,EAAEu7F,KAAKotB,GAAGhB,GAAGhnH,GAAG,IAAI+R,EAAE9X,EAAEgkD,YAAY,iBAAkBlsC,GAAG,OAAOA,EAAE1S,EAAE0/B,QAAQ6nF,GAAG70G,IAAIA,EAAEmxG,GAAGjpH,GAAG6oH,GAAGF,GAAEngG,QAAQpjB,EAAE0/B,QAAQgkF,GAAG/iH,EAAE+R,IAAI81G,GAAG7nH,EAAEjC,EAAEsB,EAAE2gD,GAAG3gD,EAAEob,MAAMza,EAAE6uG,cAA2C,mBAA7B98F,EAAE9X,EAAEqkD,4BAAiD2pE,GAAGjoH,EAAE/F,EAAE8X,EAAEhU,GAAGsB,EAAEob,MAAMza,EAAE6uG,eAAe,mBAAoB50G,EAAEqkD,0BAA0B,mBAAoBj/C,EAAE8pH,yBAAyB,mBAAoB9pH,EAAE+pH,2BAA2B,mBAAoB/pH,EAAEgqH,qBACvepvH,EAAEoF,EAAEob,MAAM,mBAAoBpb,EAAEgqH,oBAAoBhqH,EAAEgqH,qBAAqB,mBAAoBhqH,EAAE+pH,2BAA2B/pH,EAAE+pH,4BAA4BnvH,IAAIoF,EAAEob,OAAOytG,GAAGO,oBAAoBppH,EAAEA,EAAEob,MAAM,MAAMotG,GAAG7nH,EAAEjC,EAAEsB,EAAE2gD,GAAG3gD,EAAEob,MAAMza,EAAE6uG,eAAe,mBAAoBxvG,EAAEiqH,oBAAoBtpH,EAAEy8B,OAAO,EAAE,CAAC,IAAI8sF,GAAGryH,MAAMuD,QACvT,SAAS+uH,GAAGxpH,EAAE/F,EAAE8D,GAAW,GAAG,QAAXiC,EAAEjC,EAAEwkD,MAAiB,mBAAoBviD,GAAG,iBAAkBA,EAAE,CAAC,GAAGjC,EAAE0rH,OAAO,CAAY,GAAX1rH,EAAEA,EAAE0rH,OAAY,CAAC,GAAG,IAAI1rH,EAAEsT,IAAI,MAAMja,MAAM8I,EAAE,MAAM,IAAI8/C,EAAEjiD,EAAEovG,SAAS,CAAC,IAAIntD,EAAE,MAAM5oD,MAAM8I,EAAE,IAAIF,IAAI,IAAIX,EAAE,GAAGW,EAAE,OAAG,OAAO/F,GAAG,OAAOA,EAAEsoD,KAAK,mBAAoBtoD,EAAEsoD,KAAKtoD,EAAEsoD,IAAImnE,aAAarqH,EAASpF,EAAEsoD,KAAItoD,EAAE,SAAS+F,GAAG,IAAI/F,EAAE+lD,EAAE46C,KAAK3gG,IAAI+tH,KAAK/tH,EAAE+lD,EAAE46C,KAAK,CAAC,GAAG,OAAO56F,SAAS/F,EAAEoF,GAAGpF,EAAEoF,GAAGW,CAAC,EAAE/F,EAAEyvH,WAAWrqH,EAASpF,EAAC,CAAC,GAAG,iBAAkB+F,EAAE,MAAM5I,MAAM8I,EAAE,MAAM,IAAInC,EAAE0rH,OAAO,MAAMryH,MAAM8I,EAAE,IAAIF,GAAI,CAAC,OAAOA,CAAC,CACje,SAAS2pH,GAAG3pH,EAAE/F,GAAG,GAAG,aAAa+F,EAAExF,KAAK,MAAMpD,MAAM8I,EAAE,GAAG,oBAAoB7H,OAAOE,UAAUwC,SAASqB,KAAKnC,GAAG,qBAAqB5B,OAAOyZ,KAAK7X,GAAGjD,KAAK,MAAM,IAAIiD,GAAI,CACtK,SAAS2vH,GAAG5pH,GAAG,SAAS/F,EAAEA,EAAE8D,GAAG,GAAGiC,EAAE,CAAC,IAAIggD,EAAE/lD,EAAE4vH,WAAW,OAAO7pE,GAAGA,EAAE8pE,WAAW/rH,EAAE9D,EAAE4vH,WAAW9rH,GAAG9D,EAAE8vH,YAAY9vH,EAAE4vH,WAAW9rH,EAAEA,EAAE+rH,WAAW,KAAK/rH,EAAE0+B,MAAM,CAAC,CAAC,CAAC,SAAS1+B,EAAEA,EAAEiiD,GAAG,IAAIhgD,EAAE,OAAO,KAAK,KAAK,OAAOggD,GAAG/lD,EAAE8D,EAAEiiD,GAAGA,EAAEA,EAAEkvD,QAAQ,OAAO,IAAI,CAAC,SAASlvD,EAAEhgD,EAAE/F,GAAG,IAAI+F,EAAE,IAAIujC,IAAI,OAAOtpC,GAAG,OAAOA,EAAEuQ,IAAIxK,EAAEM,IAAIrG,EAAEuQ,IAAIvQ,GAAG+F,EAAEM,IAAIrG,EAAE4Q,MAAM5Q,GAAGA,EAAEA,EAAEi1G,QAAQ,OAAOlvG,CAAC,CAAC,SAASX,EAAEW,EAAE/F,GAAsC,OAAnC+F,EAAEgqH,GAAGhqH,EAAE/F,IAAK4Q,MAAM,EAAE7K,EAAEkvG,QAAQ,KAAYlvG,CAAC,CAAC,SAAS+R,EAAE9X,EAAE8D,EAAEiiD,GAAa,OAAV/lD,EAAE4Q,MAAMm1C,EAAMhgD,EAA4B,QAAjBggD,EAAE/lD,EAAEy0G,YAA6B1uD,EAAEA,EAAEn1C,OAAQ9M,GAAG9D,EAAEwiC,MAAM,EACpf1+B,GAAGiiD,GAAE/lD,EAAEwiC,MAAM,EAAS1+B,GADoaA,CACna,CAAC,SAAS2b,EAAEzf,GAAsC,OAAnC+F,GAAG,OAAO/F,EAAEy0G,YAAYz0G,EAAEwiC,MAAM,GAAUxiC,CAAC,CAAC,SAAS0vD,EAAE3pD,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAG,OAAO/lD,GAAG,IAAIA,EAAEoX,MAAWpX,EAAEgwH,GAAGlsH,EAAEiC,EAAE+jB,KAAKi8B,IAAK2uD,OAAO3uG,EAAE/F,KAAEA,EAAEoF,EAAEpF,EAAE8D,IAAK4wG,OAAO3uG,EAAS/F,EAAC,CAAC,SAAS+pD,EAAEhkD,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAG,OAAO/lD,GAAGA,EAAEk7F,cAAcp3F,EAAEvD,OAAYwlD,EAAE3gD,EAAEpF,EAAE8D,EAAEmkB,QAASqgC,IAAIinE,GAAGxpH,EAAE/F,EAAE8D,GAAGiiD,EAAE2uD,OAAO3uG,EAAEggD,KAAEA,EAAEkqE,GAAGnsH,EAAEvD,KAAKuD,EAAEyM,IAAIzM,EAAEmkB,MAAM,KAAKliB,EAAE+jB,KAAKi8B,IAAKuC,IAAIinE,GAAGxpH,EAAE/F,EAAE8D,GAAGiiD,EAAE2uD,OAAO3uG,EAASggD,EAAC,CAAC,SAAShzB,EAAEhtB,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAG,OAAO/lD,GAAG,IAAIA,EAAEoX,KAAKpX,EAAEkzG,UAAU4D,gBAAgBhzG,EAAEgzG,eAAe92G,EAAEkzG,UAAUr8E,iBAAiB/yB,EAAE+yB,iBAAsB72B,EACrgBkwH,GAAGpsH,EAAEiC,EAAE+jB,KAAKi8B,IAAK2uD,OAAO3uG,EAAE/F,KAAEA,EAAEoF,EAAEpF,EAAE8D,EAAEqpC,UAAU,KAAMunE,OAAO3uG,EAAS/F,EAAC,CAAC,SAAS6B,EAAEkE,EAAE/F,EAAE8D,EAAEiiD,EAAEjuC,GAAG,OAAG,OAAO9X,GAAG,IAAIA,EAAEoX,MAAWpX,EAAEmwH,GAAGrsH,EAAEiC,EAAE+jB,KAAKi8B,EAAEjuC,IAAK48F,OAAO3uG,EAAE/F,KAAEA,EAAEoF,EAAEpF,EAAE8D,IAAK4wG,OAAO3uG,EAAS/F,EAAC,CAAC,SAAS6lB,EAAE9f,EAAE/F,EAAE8D,GAAG,GAAG,iBAAkB9D,GAAG,iBAAkBA,EAAE,OAAOA,EAAEgwH,GAAG,GAAGhwH,EAAE+F,EAAE+jB,KAAKhmB,IAAK4wG,OAAO3uG,EAAE/F,EAAE,GAAG,iBAAkBA,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAE2vB,UAAU,KAAK46E,GAAG,OAAOzmG,EAAEmsH,GAAGjwH,EAAEO,KAAKP,EAAEuQ,IAAIvQ,EAAEioB,MAAM,KAAKliB,EAAE+jB,KAAKhmB,IAAKwkD,IAAIinE,GAAGxpH,EAAE,KAAK/F,GAAG8D,EAAE4wG,OAAO3uG,EAAEjC,EAAE,KAAK0mG,GAAG,OAAOxqG,EAAEkwH,GAAGlwH,EAAE+F,EAAE+jB,KAAKhmB,IAAK4wG,OAAO3uG,EAAE/F,EAAE,GAAGsvH,GAAGtvH,IAAI0rG,GAAG1rG,GAAG,OAAOA,EAAEmwH,GAAGnwH,EACnf+F,EAAE+jB,KAAKhmB,EAAE,OAAQ4wG,OAAO3uG,EAAE/F,EAAE0vH,GAAG3pH,EAAE/F,EAAE,CAAC,OAAO,IAAI,CAAC,SAASklG,EAAEn/F,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAE,OAAOpF,EAAEA,EAAEuQ,IAAI,KAAK,GAAG,iBAAkBzM,GAAG,iBAAkBA,EAAE,OAAO,OAAOsB,EAAE,KAAKsqD,EAAE3pD,EAAE/F,EAAE,GAAG8D,EAAEiiD,GAAG,GAAG,iBAAkBjiD,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAE6rB,UAAU,KAAK46E,GAAG,OAAOzmG,EAAEyM,MAAMnL,EAAEtB,EAAEvD,OAAOkqG,GAAG5oG,EAAEkE,EAAE/F,EAAE8D,EAAEmkB,MAAMklB,SAAS4Y,EAAE3gD,GAAG2kD,EAAEhkD,EAAE/F,EAAE8D,EAAEiiD,GAAG,KAAK,KAAKykD,GAAG,OAAO1mG,EAAEyM,MAAMnL,EAAE2tB,EAAEhtB,EAAE/F,EAAE8D,EAAEiiD,GAAG,KAAK,GAAGupE,GAAGxrH,IAAI4nG,GAAG5nG,GAAG,OAAO,OAAOsB,EAAE,KAAKvD,EAAEkE,EAAE/F,EAAE8D,EAAEiiD,EAAE,MAAM2pE,GAAG3pH,EAAEjC,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS6X,EAAE5V,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,GAAG,iBAAkB2gD,GAAG,iBAAkBA,EAAE,OACle2J,EAAE1vD,EADue+F,EAAEA,EAAEN,IAAI3B,IACtf,KAAW,GAAGiiD,EAAE3gD,GAAG,GAAG,iBAAkB2gD,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAEp2B,UAAU,KAAK46E,GAAG,OAAOxkG,EAAEA,EAAEN,IAAI,OAAOsgD,EAAEx1C,IAAIzM,EAAEiiD,EAAEx1C,MAAM,KAAKw1C,EAAExlD,OAAOkqG,GAAG5oG,EAAE7B,EAAE+F,EAAEggD,EAAE99B,MAAMklB,SAAS/nC,EAAE2gD,EAAEx1C,KAAKw5C,EAAE/pD,EAAE+F,EAAEggD,EAAE3gD,GAAG,KAAKolG,GAAG,OAA2Cz3E,EAAE/yB,EAAtC+F,EAAEA,EAAEN,IAAI,OAAOsgD,EAAEx1C,IAAIzM,EAAEiiD,EAAEx1C,MAAM,KAAWw1C,EAAE3gD,GAAG,GAAGkqH,GAAGvpE,IAAI2lD,GAAG3lD,GAAG,OAAwBlkD,EAAE7B,EAAnB+F,EAAEA,EAAEN,IAAI3B,IAAI,KAAWiiD,EAAE3gD,EAAE,MAAMsqH,GAAG1vH,EAAE+lD,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS//C,EAAEZ,EAAEqa,EAAEiwC,EAAE3F,GAAG,IAAI,IAAIh3B,EAAE,KAAKyzF,EAAE,KAAKF,EAAE7mG,EAAE4mG,EAAE5mG,EAAE,EAAE8mG,EAAE,KAAK,OAAOD,GAAGD,EAAE32D,EAAEnzD,OAAO8pH,IAAI,CAACC,EAAE11G,MAAMy1G,GAAGE,EAAED,EAAEA,EAAE,MAAMC,EAAED,EAAErR,QAAQ,IAAIpzG,EAAEqjG,EAAE9/F,EAAEkhH,EAAE52D,EAAE22D,GAAGt8D,GAAG,GAAG,OAAOloD,EAAE,CAAC,OAAOykH,IAAIA,EAAEC,GAAG,KAAK,CAACxgH,GAAGugH,GAAG,OACjfzkH,EAAE4yG,WAAWz0G,EAAEoF,EAAEkhH,GAAG7mG,EAAE3H,EAAEjW,EAAE4d,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAElxB,EAAE2kH,EAAEvR,QAAQpzG,EAAE2kH,EAAE3kH,EAAEykH,EAAEC,CAAC,CAAC,GAAGF,IAAI32D,EAAEnzD,OAAO,OAAOuH,EAAEsB,EAAEkhH,GAAGvzF,EAAE,GAAG,OAAOuzF,EAAE,CAAC,KAAKD,EAAE32D,EAAEnzD,OAAO8pH,IAAkB,QAAdC,EAAEzgG,EAAEzgB,EAAEsqD,EAAE22D,GAAGt8D,MAActqC,EAAE3H,EAAEwuG,EAAE7mG,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAEuzF,EAAEE,EAAEvR,QAAQqR,EAAEE,EAAEF,GAAG,OAAOvzF,CAAC,CAAC,IAAIuzF,EAAEvgE,EAAE3gD,EAAEkhH,GAAGD,EAAE32D,EAAEnzD,OAAO8pH,IAAsB,QAAlBE,EAAE5qG,EAAE2qG,EAAElhH,EAAEihH,EAAE32D,EAAE22D,GAAGt8D,MAAchkD,GAAG,OAAOwgH,EAAE9R,WAAW6R,EAAE16E,OAAO,OAAO26E,EAAEh2G,IAAI81G,EAAEE,EAAEh2G,KAAKkP,EAAE3H,EAAEyuG,EAAE9mG,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAEwzF,EAAEC,EAAEvR,QAAQsR,EAAEC,EAAED,GAA4C,OAAzCxgH,GAAGugH,EAAEtgG,SAAQ,SAASjgB,GAAG,OAAO/F,EAAEoF,EAAEW,EAAE,IAAUgtB,CAAC,CAAC,SAAS0Q,EAAEr+B,EAAEqa,EAAEiwC,EAAE3F,GAAG,IAAIh3B,EAAE24E,GAAGh8C,GAAG,GAAG,mBAAoB38B,EAAE,MAAM51B,MAAM8I,EAAE,MAAkB,GAAG,OAAfypD,EAAE38B,EAAE5wB,KAAKutD,IAC1e,MAAMvyD,MAAM8I,EAAE,MAAM,IAAI,IAAIugH,EAAEzzF,EAAE,KAAKuzF,EAAE7mG,EAAE4mG,EAAE5mG,EAAE,EAAE8mG,EAAE,KAAK1kH,EAAE6tD,EAAEttC,OAAO,OAAOkkG,IAAIzkH,EAAEsW,KAAKkuG,IAAIxkH,EAAE6tD,EAAEttC,OAAO,CAACkkG,EAAE11G,MAAMy1G,GAAGE,EAAED,EAAEA,EAAE,MAAMC,EAAED,EAAErR,QAAQ,IAAIxxE,EAAEyhE,EAAE9/F,EAAEkhH,EAAEzkH,EAAEjD,MAAMmrD,GAAG,GAAG,OAAOtmB,EAAE,CAAC,OAAO6iF,IAAIA,EAAEC,GAAG,KAAK,CAACxgH,GAAGugH,GAAG,OAAO7iF,EAAEgxE,WAAWz0G,EAAEoF,EAAEkhH,GAAG7mG,EAAE3H,EAAE2rB,EAAEhkB,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAE0Q,EAAE+iF,EAAEvR,QAAQxxE,EAAE+iF,EAAE/iF,EAAE6iF,EAAEC,CAAC,CAAC,GAAG1kH,EAAEsW,KAAK,OAAOrU,EAAEsB,EAAEkhH,GAAGvzF,EAAE,GAAG,OAAOuzF,EAAE,CAAC,MAAMzkH,EAAEsW,KAAKkuG,IAAIxkH,EAAE6tD,EAAEttC,OAAwB,QAAjBvgB,EAAEgkB,EAAEzgB,EAAEvD,EAAEjD,MAAMmrD,MAActqC,EAAE3H,EAAEjW,EAAE4d,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAElxB,EAAE2kH,EAAEvR,QAAQpzG,EAAE2kH,EAAE3kH,GAAG,OAAOkxB,CAAC,CAAC,IAAIuzF,EAAEvgE,EAAE3gD,EAAEkhH,IAAIzkH,EAAEsW,KAAKkuG,IAAIxkH,EAAE6tD,EAAEttC,OAA4B,QAArBvgB,EAAE8Z,EAAE2qG,EAAElhH,EAAEihH,EAAExkH,EAAEjD,MAAMmrD,MAAchkD,GAAG,OAAOlE,EAAE4yG,WAChf6R,EAAE16E,OAAO,OAAO/pC,EAAE0O,IAAI81G,EAAExkH,EAAE0O,KAAKkP,EAAE3H,EAAEjW,EAAE4d,EAAE4mG,GAAG,OAAOG,EAAEzzF,EAAElxB,EAAE2kH,EAAEvR,QAAQpzG,EAAE2kH,EAAE3kH,GAA4C,OAAzCkE,GAAGugH,EAAEtgG,SAAQ,SAASjgB,GAAG,OAAO/F,EAAEoF,EAAEW,EAAE,IAAUgtB,CAAC,CAAC,OAAO,SAAShtB,EAAEggD,EAAEjuC,EAAE43C,GAAG,IAAI3F,EAAE,iBAAkBjyC,GAAG,OAAOA,GAAGA,EAAEvX,OAAOkqG,IAAI,OAAO3yF,EAAEvH,IAAIw5C,IAAIjyC,EAAEA,EAAEmQ,MAAMklB,UAAU,IAAIpa,EAAE,iBAAkBjb,GAAG,OAAOA,EAAE,GAAGib,EAAE,OAAOjb,EAAE6X,UAAU,KAAK46E,GAAGxkG,EAAE,CAAS,IAARgtB,EAAEjb,EAAEvH,IAAQw5C,EAAEhE,EAAE,OAAOgE,GAAG,CAAC,GAAGA,EAAEx5C,MAAMwiB,EAAE,CAAC,GAAmB,IAAZg3B,EAAE3yC,KAAY,GAAGU,EAAEvX,OAAOkqG,GAAG,CAAC3mG,EAAEiC,EAAEgkD,EAAEkrD,UAASlvD,EAAE3gD,EAAE2kD,EAAEjyC,EAAEmQ,MAAMklB,WAAYunE,OAAO3uG,EAAEA,EAAEggD,EAAE,MAAMhgD,CAAC,OAAe,GAAGgkD,EAAEmxC,cAAcpjF,EAAEvX,KAAK,CAACuD,EAAEiC,EAAEgkD,EAAEkrD,UAC5elvD,EAAE3gD,EAAE2kD,EAAEjyC,EAAEmQ,QAASqgC,IAAIinE,GAAGxpH,EAAEgkD,EAAEjyC,GAAGiuC,EAAE2uD,OAAO3uG,EAAEA,EAAEggD,EAAE,MAAMhgD,CAAC,CAAEjC,EAAEiC,EAAEgkD,GAAG,KAAK,CAAM/pD,EAAE+F,EAAEgkD,GAAGA,EAAEA,EAAEkrD,OAAO,CAACn9F,EAAEvX,OAAOkqG,KAAI1kD,EAAEoqE,GAAGr4G,EAAEmQ,MAAMklB,SAASpnC,EAAE+jB,KAAK4lC,EAAE53C,EAAEvH,MAAOmkG,OAAO3uG,EAAEA,EAAEggD,KAAI2J,EAAEugE,GAAGn4G,EAAEvX,KAAKuX,EAAEvH,IAAIuH,EAAEmQ,MAAM,KAAKliB,EAAE+jB,KAAK4lC,IAAKpH,IAAIinE,GAAGxpH,EAAEggD,EAAEjuC,GAAG43C,EAAEglD,OAAO3uG,EAAEA,EAAE2pD,EAAE,CAAC,OAAOjwC,EAAE1Z,GAAG,KAAKykG,GAAGzkG,EAAE,CAAC,IAAIgkD,EAAEjyC,EAAEvH,IAAI,OAAOw1C,GAAG,CAAC,GAAGA,EAAEx1C,MAAMw5C,EAAE,IAAG,IAAIhE,EAAE3uC,KAAK2uC,EAAEmtD,UAAU4D,gBAAgBh/F,EAAEg/F,eAAe/wD,EAAEmtD,UAAUr8E,iBAAiB/e,EAAE+e,eAAe,CAAC/yB,EAAEiC,EAAEggD,EAAEkvD,UAASlvD,EAAE3gD,EAAE2gD,EAAEjuC,EAAEq1B,UAAU,KAAMunE,OAAO3uG,EAAEA,EAAEggD,EAAE,MAAMhgD,CAAC,CAAMjC,EAAEiC,EAAEggD,GAAG,KAAK,CAAM/lD,EAAE+F,EAAEggD,GAAGA,EAAEA,EAAEkvD,OAAO,EAAClvD,EACpfmqE,GAAGp4G,EAAE/R,EAAE+jB,KAAK4lC,IAAKglD,OAAO3uG,EAAEA,EAAEggD,CAAC,CAAC,OAAOtmC,EAAE1Z,GAAG,GAAG,iBAAkB+R,GAAG,iBAAkBA,EAAE,OAAOA,EAAE,GAAGA,EAAE,OAAOiuC,GAAG,IAAIA,EAAE3uC,KAAKtT,EAAEiC,EAAEggD,EAAEkvD,UAASlvD,EAAE3gD,EAAE2gD,EAAEjuC,IAAK48F,OAAO3uG,EAAEA,EAAEggD,IAAIjiD,EAAEiC,EAAEggD,IAAGA,EAAEiqE,GAAGl4G,EAAE/R,EAAE+jB,KAAK4lC,IAAKglD,OAAO3uG,EAAEA,EAAEggD,GAAGtmC,EAAE1Z,GAAG,GAAGupH,GAAGx3G,GAAG,OAAO9R,EAAED,EAAEggD,EAAEjuC,EAAE43C,GAAG,GAAGg8C,GAAG5zF,GAAG,OAAO2rB,EAAE19B,EAAEggD,EAAEjuC,EAAE43C,GAAc,GAAX38B,GAAG28F,GAAG3pH,EAAE+R,QAAM,IAAqBA,IAAIiyC,EAAE,OAAOhkD,EAAEqR,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,MAAMja,MAAM8I,EAAE,IAAI+lG,GAAGjmG,EAAExF,OAAO,cAAe,OAAOuD,EAAEiC,EAAEggD,EAAE,CAAC,CAAC,IAAIqqE,GAAGT,IAAG,GAAIU,GAAGV,IAAG,GAAIW,GAAG,CAAC,EAAEC,GAAGhI,GAAG+H,IAAIE,GAAGjI,GAAG+H,IAAIG,GAAGlI,GAAG+H,IACtd,SAASI,GAAG3qH,GAAG,GAAGA,IAAIuqH,GAAG,MAAMnzH,MAAM8I,EAAE,MAAM,OAAOF,CAAC,CAAC,SAAS4qH,GAAG5qH,EAAE/F,GAAyC,OAAtCyoH,EAAEgI,GAAGzwH,GAAGyoH,EAAE+H,GAAGzqH,GAAG0iH,EAAE8H,GAAGD,IAAIvqH,EAAE/F,EAAEy1B,UAAmB,KAAK,EAAE,KAAK,GAAGz1B,GAAGA,EAAEA,EAAEu8B,iBAAiBv8B,EAAEo7B,aAAaizE,GAAG,KAAK,IAAI,MAAM,QAAkEruG,EAAEquG,GAArCruG,GAAvB+F,EAAE,IAAIA,EAAE/F,EAAEy7B,WAAWz7B,GAAMo7B,cAAc,KAAKr1B,EAAEA,EAAEo1B,SAAkBqtF,EAAE+H,IAAI9H,EAAE8H,GAAGvwH,EAAE,CAAC,SAAS4wH,KAAKpI,EAAE+H,IAAI/H,EAAEgI,IAAIhI,EAAEiI,GAAG,CAAC,SAASI,GAAG9qH,GAAG2qH,GAAGD,GAAGjoG,SAAS,IAAIxoB,EAAE0wH,GAAGH,GAAG/nG,SAAa1kB,EAAEuqG,GAAGruG,EAAE+F,EAAExF,MAAMP,IAAI8D,IAAI2kH,EAAE+H,GAAGzqH,GAAG0iH,EAAE8H,GAAGzsH,GAAG,CAAC,SAASgtH,GAAG/qH,GAAGyqH,GAAGhoG,UAAUziB,IAAIyiH,EAAE+H,IAAI/H,EAAEgI,IAAI,CAAC,IAAInxG,GAAEkpG,GAAG,GAC9c,SAASwI,GAAGhrH,GAAG,IAAI,IAAI/F,EAAE+F,EAAE,OAAO/F,GAAG,CAAC,GAAG,KAAKA,EAAEoX,IAAI,CAAC,IAAItT,EAAE9D,EAAE40G,cAAc,GAAG,OAAO9wG,IAAmB,QAAfA,EAAEA,EAAE+wG,aAAqB,OAAO/wG,EAAErD,MAAM,OAAOqD,EAAErD,MAAM,OAAOT,CAAC,MAAM,GAAG,KAAKA,EAAEoX,UAAK,IAASpX,EAAEgxH,cAAcC,aAAa,GAAG,IAAa,GAARjxH,EAAEwiC,OAAU,OAAOxiC,OAAO,GAAG,OAAOA,EAAEutC,MAAM,CAACvtC,EAAEutC,MAAMmnE,OAAO10G,EAAEA,EAAEA,EAAEutC,MAAM,QAAQ,CAAC,GAAGvtC,IAAI+F,EAAE,MAAM,KAAK,OAAO/F,EAAEi1G,SAAS,CAAC,GAAG,OAAOj1G,EAAE00G,QAAQ10G,EAAE00G,SAAS3uG,EAAE,OAAO,KAAK/F,EAAEA,EAAE00G,MAAM,CAAC10G,EAAEi1G,QAAQP,OAAO10G,EAAE00G,OAAO10G,EAAEA,EAAEi1G,OAAO,CAAC,OAAO,IAAI,CAAC,IAAIic,GAAG,KAAKC,GAAG,KAAKC,IAAG,EACpd,SAASC,GAAGtrH,EAAE/F,GAAG,IAAI8D,EAAEwtH,GAAG,EAAE,KAAK,KAAK,GAAGxtH,EAAEo3F,YAAY,UAAUp3F,EAAEvD,KAAK,UAAUuD,EAAEovG,UAAUlzG,EAAE8D,EAAE4wG,OAAO3uG,EAAEjC,EAAE0+B,MAAM,EAAE,OAAOz8B,EAAE6pH,YAAY7pH,EAAE6pH,WAAWC,WAAW/rH,EAAEiC,EAAE6pH,WAAW9rH,GAAGiC,EAAE+pH,YAAY/pH,EAAE6pH,WAAW9rH,CAAC,CAAC,SAASytH,GAAGxrH,EAAE/F,GAAG,OAAO+F,EAAEqR,KAAK,KAAK,EAAE,IAAItT,EAAEiC,EAAExF,KAAyE,OAAO,QAA3EP,EAAE,IAAIA,EAAEy1B,UAAU3xB,EAAE1C,gBAAgBpB,EAAEm9B,SAAS/7B,cAAc,KAAKpB,KAAmB+F,EAAEmtG,UAAUlzG,GAAE,GAAO,KAAK,EAAE,OAAoD,QAA7CA,EAAE,KAAK+F,EAAEyrH,cAAc,IAAIxxH,EAAEy1B,SAAS,KAAKz1B,KAAY+F,EAAEmtG,UAAUlzG,GAAE,GAAwB,QAAQ,OAAM,EAAG,CAC1e,SAASyxH,GAAG1rH,GAAG,GAAGqrH,GAAG,CAAC,IAAIpxH,EAAEmxH,GAAG,GAAGnxH,EAAE,CAAC,IAAI8D,EAAE9D,EAAE,IAAIuxH,GAAGxrH,EAAE/F,GAAG,CAAqB,KAApBA,EAAE6nH,GAAG/jH,EAAEyzC,gBAAqBg6E,GAAGxrH,EAAE/F,GAAuC,OAAnC+F,EAAEy8B,OAAe,KAATz8B,EAAEy8B,MAAY,EAAE4uF,IAAG,OAAGF,GAAGnrH,GAASsrH,GAAGH,GAAGptH,EAAE,CAACotH,GAAGnrH,EAAEorH,GAAGtJ,GAAG7nH,EAAEq/B,WAAW,MAAMt5B,EAAEy8B,OAAe,KAATz8B,EAAEy8B,MAAY,EAAE4uF,IAAG,EAAGF,GAAGnrH,CAAC,CAAC,CAAC,SAAS2rH,GAAG3rH,GAAG,IAAIA,EAAEA,EAAE2uG,OAAO,OAAO3uG,GAAG,IAAIA,EAAEqR,KAAK,IAAIrR,EAAEqR,KAAK,KAAKrR,EAAEqR,KAAKrR,EAAEA,EAAE2uG,OAAOwc,GAAGnrH,CAAC,CAC7S,SAAS4rH,GAAG5rH,GAAG,GAAGA,IAAImrH,GAAG,OAAM,EAAG,IAAIE,GAAG,OAAOM,GAAG3rH,GAAGqrH,IAAG,GAAG,EAAG,IAAIpxH,EAAE+F,EAAExF,KAAK,GAAG,IAAIwF,EAAEqR,KAAK,SAASpX,GAAG,SAASA,IAAIynH,GAAGznH,EAAE+F,EAAEirH,eAAe,IAAIhxH,EAAEmxH,GAAGnxH,GAAGqxH,GAAGtrH,EAAE/F,GAAGA,EAAE6nH,GAAG7nH,EAAEu3C,aAAmB,GAANm6E,GAAG3rH,GAAM,KAAKA,EAAEqR,IAAI,CAAgD,KAA7BrR,EAAE,QAApBA,EAAEA,EAAE6uG,eAAyB7uG,EAAE8uG,WAAW,MAAW,MAAM13G,MAAM8I,EAAE,MAAMF,EAAE,CAAiB,IAAhBA,EAAEA,EAAEwxC,YAAgBv3C,EAAE,EAAE+F,GAAG,CAAC,GAAG,IAAIA,EAAE0vB,SAAS,CAAC,IAAI3xB,EAAEiC,EAAEtF,KAAK,GAAG,OAAOqD,EAAE,CAAC,GAAG,IAAI9D,EAAE,CAACmxH,GAAGtJ,GAAG9hH,EAAEwxC,aAAa,MAAMxxC,CAAC,CAAC/F,GAAG,KAAK,MAAM8D,GAAG,OAAOA,GAAG,OAAOA,GAAG9D,GAAG,CAAC+F,EAAEA,EAAEwxC,WAAW,CAAC45E,GAAG,IAAI,CAAC,MAAMA,GAAGD,GAAGrJ,GAAG9hH,EAAEmtG,UAAU37D,aAAa,KAAK,OAAM,CAAE,CACxf,SAASq6E,KAAKT,GAAGD,GAAG,KAAKE,IAAG,CAAE,CAAC,IAAIS,GAAG,GAAG,SAASC,KAAK,IAAI,IAAI/rH,EAAE,EAAEA,EAAE8rH,GAAGt1H,OAAOwJ,IAAI8rH,GAAG9rH,GAAGgsH,8BAA8B,KAAKF,GAAGt1H,OAAO,CAAC,CAAC,IAAIy1H,GAAG3nB,GAAG4nB,uBAAuBC,GAAG7nB,GAAGshB,wBAAwBwG,GAAG,EAAE3wF,GAAE,KAAKnb,GAAE,KAAKH,GAAE,KAAKksG,IAAG,EAAGC,IAAG,EAAG,SAASC,KAAK,MAAMn1H,MAAM8I,EAAE,KAAM,CAAC,SAASssH,GAAGxsH,EAAE/F,GAAG,GAAG,OAAOA,EAAE,OAAM,EAAG,IAAI,IAAI8D,EAAE,EAAEA,EAAE9D,EAAEzD,QAAQuH,EAAEiC,EAAExJ,OAAOuH,IAAI,IAAI+/G,GAAG99G,EAAEjC,GAAG9D,EAAE8D,IAAI,OAAM,EAAG,OAAM,CAAE,CAChY,SAAS0uH,GAAGzsH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAyH,GAAtHq6G,GAAGr6G,EAAE0pB,GAAExhC,EAAEA,EAAE40G,cAAc,KAAK50G,EAAEgtH,YAAY,KAAKhtH,EAAEysH,MAAM,EAAEuF,GAAGxpG,QAAQ,OAAOziB,GAAG,OAAOA,EAAE6uG,cAAc6d,GAAGC,GAAG3sH,EAAEjC,EAAEiiD,EAAE3gD,GAAMitH,GAAG,CAACv6G,EAAE,EAAE,EAAE,CAAO,GAANu6G,IAAG,IAAQ,GAAGv6G,GAAG,MAAM3a,MAAM8I,EAAE,MAAM6R,GAAG,EAAEoO,GAAEG,GAAE,KAAKrmB,EAAEgtH,YAAY,KAAKgF,GAAGxpG,QAAQmqG,GAAG5sH,EAAEjC,EAAEiiD,EAAE3gD,EAAE,OAAOitH,GAAG,CAA+D,GAA9DL,GAAGxpG,QAAQoqG,GAAG5yH,EAAE,OAAOqmB,IAAG,OAAOA,GAAEjE,KAAK+vG,GAAG,EAAEjsG,GAAEG,GAAEmb,GAAE,KAAK4wF,IAAG,EAAMpyH,EAAE,MAAM7C,MAAM8I,EAAE,MAAM,OAAOF,CAAC,CAAC,SAAS8sH,KAAK,IAAI9sH,EAAE,CAAC6uG,cAAc,KAAKqY,UAAU,KAAK6F,UAAU,KAAK95B,MAAM,KAAK52E,KAAK,MAA8C,OAAxC,OAAO8D,GAAEsb,GAAEozE,cAAc1uF,GAAEngB,EAAEmgB,GAAEA,GAAE9D,KAAKrc,EAASmgB,EAAC,CAChf,SAAS6sG,KAAK,GAAG,OAAO1sG,GAAE,CAAC,IAAItgB,EAAEy7B,GAAEizE,UAAU1uG,EAAE,OAAOA,EAAEA,EAAE6uG,cAAc,IAAI,MAAM7uG,EAAEsgB,GAAEjE,KAAK,IAAIpiB,EAAE,OAAOkmB,GAAEsb,GAAEozE,cAAc1uF,GAAE9D,KAAK,GAAG,OAAOpiB,EAAEkmB,GAAElmB,EAAEqmB,GAAEtgB,MAAM,CAAC,GAAG,OAAOA,EAAE,MAAM5I,MAAM8I,EAAE,MAAUF,EAAE,CAAC6uG,eAAPvuF,GAAEtgB,GAAqB6uG,cAAcqY,UAAU5mG,GAAE4mG,UAAU6F,UAAUzsG,GAAEysG,UAAU95B,MAAM3yE,GAAE2yE,MAAM52E,KAAK,MAAM,OAAO8D,GAAEsb,GAAEozE,cAAc1uF,GAAEngB,EAAEmgB,GAAEA,GAAE9D,KAAKrc,CAAC,CAAC,OAAOmgB,EAAC,CAAC,SAAS8sG,GAAGjtH,EAAE/F,GAAG,MAAM,mBAAoBA,EAAEA,EAAE+F,GAAG/F,CAAC,CACxY,SAASizH,GAAGltH,GAAG,IAAI/F,EAAE+yH,KAAKjvH,EAAE9D,EAAEg5F,MAAM,GAAG,OAAOl1F,EAAE,MAAM3G,MAAM8I,EAAE,MAAMnC,EAAEovH,oBAAoBntH,EAAE,IAAIggD,EAAE1/B,GAAEjhB,EAAE2gD,EAAE+sE,UAAUh7G,EAAEhU,EAAEspH,QAAQ,GAAG,OAAOt1G,EAAE,CAAC,GAAG,OAAO1S,EAAE,CAAC,IAAIqa,EAAEra,EAAEgd,KAAKhd,EAAEgd,KAAKtK,EAAEsK,KAAKtK,EAAEsK,KAAK3C,CAAC,CAACsmC,EAAE+sE,UAAU1tH,EAAE0S,EAAEhU,EAAEspH,QAAQ,IAAI,CAAC,GAAG,OAAOhoH,EAAE,CAACA,EAAEA,EAAEgd,KAAK2jC,EAAEA,EAAEknE,UAAU,IAAIv9D,EAAEjwC,EAAE3H,EAAE,KAAKiyC,EAAE3kD,EAAE,EAAE,CAAC,IAAI2tB,EAAEg3B,EAAE0jE,KAAK,IAAI0E,GAAGp/F,KAAKA,EAAE,OAAO28B,IAAIA,EAAEA,EAAEttC,KAAK,CAACqrG,KAAK,EAAE0F,OAAOppE,EAAEopE,OAAOC,aAAarpE,EAAEqpE,aAAaC,WAAWtpE,EAAEspE,WAAWjxG,KAAK,OAAO2jC,EAAEgE,EAAEqpE,eAAertH,EAAEgkD,EAAEspE,WAAWttH,EAAEggD,EAAEgE,EAAEopE,YAAY,CAAC,IAAItxH,EAAE,CAAC4rH,KAAK16F,EAAEogG,OAAOppE,EAAEopE,OAAOC,aAAarpE,EAAEqpE,aAC9fC,WAAWtpE,EAAEspE,WAAWjxG,KAAK,MAAM,OAAOstC,GAAGjwC,EAAEiwC,EAAE7tD,EAAEiW,EAAEiuC,GAAG2J,EAAEA,EAAEttC,KAAKvgB,EAAE2/B,GAAEirF,OAAO15F,EAAE86F,IAAI96F,CAAC,CAACg3B,EAAEA,EAAE3nC,IAAI,OAAO,OAAO2nC,GAAGA,IAAI3kD,GAAG,OAAOsqD,EAAE53C,EAAEiuC,EAAE2J,EAAEttC,KAAK3C,EAAEokG,GAAG99D,EAAE/lD,EAAE40G,iBAAiB8X,IAAG,GAAI1sH,EAAE40G,cAAc7uD,EAAE/lD,EAAEitH,UAAUn1G,EAAE9X,EAAE8yH,UAAUpjE,EAAE5rD,EAAEwvH,kBAAkBvtE,CAAC,CAAC,MAAM,CAAC/lD,EAAE40G,cAAc9wG,EAAEyvH,SAAS,CAC/Q,SAASC,GAAGztH,GAAG,IAAI/F,EAAE+yH,KAAKjvH,EAAE9D,EAAEg5F,MAAM,GAAG,OAAOl1F,EAAE,MAAM3G,MAAM8I,EAAE,MAAMnC,EAAEovH,oBAAoBntH,EAAE,IAAIggD,EAAEjiD,EAAEyvH,SAASnuH,EAAEtB,EAAEspH,QAAQt1G,EAAE9X,EAAE40G,cAAc,GAAG,OAAOxvG,EAAE,CAACtB,EAAEspH,QAAQ,KAAK,IAAI3tG,EAAEra,EAAEA,EAAEgd,KAAK,GAAGtK,EAAE/R,EAAE+R,EAAE2H,EAAE0zG,QAAQ1zG,EAAEA,EAAE2C,WAAW3C,IAAIra,GAAGy+G,GAAG/rG,EAAE9X,EAAE40G,iBAAiB8X,IAAG,GAAI1sH,EAAE40G,cAAc98F,EAAE,OAAO9X,EAAE8yH,YAAY9yH,EAAEitH,UAAUn1G,GAAGhU,EAAEwvH,kBAAkBx7G,CAAC,CAAC,MAAM,CAACA,EAAEiuC,EAAE,CACrV,SAAS0tE,GAAG1tH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE/lD,EAAE0zH,YAAY3tE,EAAEA,EAAE/lD,EAAE2zH,SAAS,IAAIvuH,EAAEpF,EAAE+xH,8BAAyI,GAAxG,OAAO3sH,EAAEW,EAAEX,IAAI2gD,GAAUhgD,EAAEA,EAAE6tH,kBAAiB7tH,GAAGosH,GAAGpsH,KAAKA,KAAE/F,EAAE+xH,8BAA8BhsE,EAAE8rE,GAAGj1H,KAAKoD,KAAM+F,EAAE,OAAOjC,EAAE9D,EAAE2zH,SAAoB,MAAX9B,GAAGj1H,KAAKoD,GAAS7C,MAAM8I,EAAE,KAAM,CAC/P,SAAS4tH,GAAG9tH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAE0uH,GAAE,GAAG,OAAO1uH,EAAE,MAAMjI,MAAM8I,EAAE,MAAM,IAAI6R,EAAE9X,EAAE0zH,YAAYj0G,EAAE3H,EAAE9X,EAAE2zH,SAASjkE,EAAEsiE,GAAGxpG,QAAQuhC,EAAE2F,EAAEqkE,UAAS,WAAW,OAAON,GAAGruH,EAAEpF,EAAE8D,EAAE,IAAGivB,EAAEg3B,EAAE,GAAGloD,EAAEkoD,EAAE,GAAGA,EAAE7jC,GAAE,IAAIL,EAAE9f,EAAE6uG,cAAc1P,EAAEr/E,EAAE86E,KAAKhlF,GAAEupF,EAAE8uB,YAAYhuH,GAAE6f,EAAElO,OAAOkO,EAAEA,EAAEouG,UAAU,IAAIxwF,GAAEjC,GACuO,OADrOz7B,EAAE6uG,cAAc,CAACjU,KAAKuE,EAAEvtF,OAAO3X,EAAEi0H,UAAUluE,GAAG2J,EAAEwkE,WAAU,WAAWhvB,EAAE8uB,YAAYlwH,EAAEohG,EAAEivB,YAAYphG,EAAE,IAAIhtB,EAAE+R,EAAE9X,EAAE2zH,SAAS,IAAI9P,GAAGpkG,EAAE1Z,GAAG,CAACA,EAAEjC,EAAE9D,EAAE2zH,SAAS9P,GAAGhiH,EAAEkE,KAAKgtB,EAAEhtB,GAAGA,EAAEuoH,GAAG7qF,IAAGr+B,EAAEwuH,kBAAkB7tH,EAAEX,EAAE0zG,cAAc/yG,EAAEX,EAAEwuH,iBAAiBxuH,EAAE+zG,gBAAgBpzG,EAAE,IAAI,IAAIggD,EAC5f3gD,EAAEg0G,cAAc1pD,EAAE3pD,EAAE,EAAE2pD,GAAG,CAAC,IAAI3F,EAAE,GAAGmvD,GAAGxpD,GAAG1F,EAAE,GAAGD,EAAEhE,EAAEgE,IAAIhkD,EAAE2pD,IAAI1F,CAAC,CAAC,CAAC,GAAE,CAAClmD,EAAE9D,EAAE+lD,IAAI2J,EAAEwkE,WAAU,WAAW,OAAOnuE,EAAE/lD,EAAE2zH,SAAQ,WAAW,IAAI5tH,EAAEm/F,EAAE8uB,YAAYlwH,EAAEohG,EAAEivB,YAAY,IAAIrwH,EAAEiC,EAAE/F,EAAE2zH,UAAU,IAAI5tE,EAAEuoE,GAAG7qF,IAAGr+B,EAAEwuH,kBAAkB7tE,EAAE3gD,EAAE0zG,YAAY,CAAC,MAAMyN,GAAGziH,GAAE,WAAW,MAAMyiH,CAAE,GAAE,CAAC,GAAE,GAAE,CAACvmH,EAAE+lD,IAAI89D,GAAGloG,GAAE7X,IAAI+/G,GAAG79G,GAAEhG,IAAI6jH,GAAGh+F,EAAEkgC,MAAKhgD,EAAE,CAACqnH,QAAQ,KAAKmG,SAAS,KAAKL,oBAAoBF,GAAGM,kBAAkBzxH,IAAK0xH,SAASxgG,EAAEqhG,GAAG7kH,KAAK,KAAKiyB,GAAEz7B,GAAGgkD,EAAEivC,MAAMjzF,EAAEgkD,EAAE+oE,UAAU,KAAKjxH,EAAE4xH,GAAGruH,EAAEpF,EAAE8D,GAAGimD,EAAE6qD,cAAc7qD,EAAEkjE,UAAUprH,GAAUA,CAAC,CACve,SAASwyH,GAAGtuH,EAAE/F,EAAE8D,GAAc,OAAO+vH,GAAZd,KAAiBhtH,EAAE/F,EAAE8D,EAAE,CAAC,SAASwwH,GAAGvuH,GAAG,IAAI/F,EAAE6yH,KAAmL,MAA9K,mBAAoB9sH,IAAIA,EAAEA,KAAK/F,EAAE40G,cAAc50G,EAAEitH,UAAUlnH,EAAoFA,GAAlFA,EAAE/F,EAAEg5F,MAAM,CAACo0B,QAAQ,KAAKmG,SAAS,KAAKL,oBAAoBF,GAAGM,kBAAkBvtH,IAAOwtH,SAASa,GAAG7kH,KAAK,KAAKiyB,GAAEz7B,GAAS,CAAC/F,EAAE40G,cAAc7uG,EAAE,CAClR,SAASwuH,GAAGxuH,EAAE/F,EAAE8D,EAAEiiD,GAAkO,OAA/NhgD,EAAE,CAACqR,IAAIrR,EAAEkd,OAAOjjB,EAAEw0H,QAAQ1wH,EAAE2wH,KAAK1uE,EAAE3jC,KAAK,MAAsB,QAAhBpiB,EAAEwhC,GAAEwrF,cAAsBhtH,EAAE,CAAC4vH,WAAW,MAAMpuF,GAAEwrF,YAAYhtH,EAAEA,EAAE4vH,WAAW7pH,EAAEqc,KAAKrc,GAAmB,QAAfjC,EAAE9D,EAAE4vH,YAAoB5vH,EAAE4vH,WAAW7pH,EAAEqc,KAAKrc,GAAGggD,EAAEjiD,EAAEse,KAAKte,EAAEse,KAAKrc,EAAEA,EAAEqc,KAAK2jC,EAAE/lD,EAAE4vH,WAAW7pH,GAAWA,CAAC,CAAC,SAAS2uH,GAAG3uH,GAA4B,OAAdA,EAAE,CAACyiB,QAAQziB,GAAhB8sH,KAA4Bje,cAAc7uG,CAAC,CAAC,SAAS4uH,KAAK,OAAO5B,KAAKne,aAAa,CAAC,SAASggB,GAAG7uH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEytH,KAAKrxF,GAAEgB,OAAOz8B,EAAEX,EAAEwvG,cAAc2f,GAAG,EAAEv0H,EAAE8D,OAAE,OAAO,IAASiiD,EAAE,KAAKA,EAAE,CACnc,SAAS8uE,GAAG9uH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAE2tH,KAAKhtE,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAIjuC,OAAE,EAAO,GAAG,OAAOuO,GAAE,CAAC,IAAI5G,EAAE4G,GAAEuuF,cAA0B,GAAZ98F,EAAE2H,EAAE+0G,QAAW,OAAOzuE,GAAGwsE,GAAGxsE,EAAEtmC,EAAEg1G,MAAmB,YAAZF,GAAGv0H,EAAE8D,EAAEgU,EAAEiuC,EAAU,CAACvkB,GAAEgB,OAAOz8B,EAAEX,EAAEwvG,cAAc2f,GAAG,EAAEv0H,EAAE8D,EAAEgU,EAAEiuC,EAAE,CAAC,SAAS+uE,GAAG/uH,EAAE/F,GAAG,OAAO40H,GAAG,IAAI,EAAE7uH,EAAE/F,EAAE,CAAC,SAAS+0H,GAAGhvH,EAAE/F,GAAG,OAAO60H,GAAG,IAAI,EAAE9uH,EAAE/F,EAAE,CAAC,SAASg1H,GAAGjvH,EAAE/F,GAAG,OAAO60H,GAAG,EAAE,EAAE9uH,EAAE/F,EAAE,CAAC,SAASi1H,GAAGlvH,EAAE/F,GAAG,MAAG,mBAAoBA,GAAS+F,EAAEA,IAAI/F,EAAE+F,GAAG,WAAW/F,EAAE,KAAK,GAAK,MAAOA,GAAqB+F,EAAEA,IAAI/F,EAAEwoB,QAAQziB,EAAE,WAAW/F,EAAEwoB,QAAQ,IAAI,QAA1E,CAA2E,CACnd,SAAS0sG,GAAGnvH,EAAE/F,EAAE8D,GAA6C,OAA1CA,EAAE,MAAOA,EAAcA,EAAEoC,OAAO,CAACH,IAAI,KAAY8uH,GAAG,EAAE,EAAEI,GAAG1lH,KAAK,KAAKvP,EAAE+F,GAAGjC,EAAE,CAAC,SAASqxH,KAAK,CAAC,SAASC,GAAGrvH,EAAE/F,GAAG,IAAI8D,EAAEivH,KAAK/yH,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAI+lD,EAAEjiD,EAAE8wG,cAAc,OAAG,OAAO7uD,GAAG,OAAO/lD,GAAGuyH,GAAGvyH,EAAE+lD,EAAE,IAAWA,EAAE,IAAGjiD,EAAE8wG,cAAc,CAAC7uG,EAAE/F,GAAU+F,EAAC,CAAC,SAASsvH,GAAGtvH,EAAE/F,GAAG,IAAI8D,EAAEivH,KAAK/yH,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAI+lD,EAAEjiD,EAAE8wG,cAAc,OAAG,OAAO7uD,GAAG,OAAO/lD,GAAGuyH,GAAGvyH,EAAE+lD,EAAE,IAAWA,EAAE,IAAGhgD,EAAEA,IAAIjC,EAAE8wG,cAAc,CAAC7uG,EAAE/F,GAAU+F,EAAC,CAC1Z,SAASuvH,GAAGvvH,EAAE/F,GAAG,IAAI8D,EAAEsnH,KAAKE,GAAG,GAAGxnH,EAAE,GAAGA,GAAE,WAAWiC,GAAE,EAAG,IAAGulH,GAAG,GAAGxnH,EAAE,GAAGA,GAAE,WAAW,IAAIA,EAAEouH,GAAGja,WAAWia,GAAGja,WAAW,EAAE,IAAIlyG,GAAE,GAAI/F,GAAG,CAAC,QAAQkyH,GAAGja,WAAWn0G,CAAC,CAAC,GAAE,CAChK,SAASswH,GAAGruH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEsoE,KAAKjpH,EAAEkpH,GAAGvoH,GAAG+R,EAAE,CAAC21G,KAAKroH,EAAE+tH,OAAOrvH,EAAEsvH,aAAa,KAAKC,WAAW,KAAKjxG,KAAK,MAAM3C,EAAEzf,EAAEotH,QAA6E,GAArE,OAAO3tG,EAAE3H,EAAEsK,KAAKtK,GAAGA,EAAEsK,KAAK3C,EAAE2C,KAAK3C,EAAE2C,KAAKtK,GAAG9X,EAAEotH,QAAQt1G,EAAE2H,EAAE1Z,EAAE0uG,UAAa1uG,IAAIy7B,IAAG,OAAO/hB,GAAGA,IAAI+hB,GAAE6wF,GAAGD,IAAG,MAAO,CAAC,GAAG,IAAIrsH,EAAE0mH,QAAQ,OAAOhtG,GAAG,IAAIA,EAAEgtG,QAAiC,QAAxBhtG,EAAEzf,EAAEkzH,qBAA8B,IAAI,IAAIxjE,EAAE1vD,EAAEszH,kBAAkBvpE,EAAEtqC,EAAEiwC,EAAE5rD,GAAmC,GAAhCgU,EAAEs7G,aAAa3zG,EAAE3H,EAAEu7G,WAAWtpE,EAAK85D,GAAG95D,EAAE2F,GAAG,MAAM,CAAC,MAAM38B,GAAG,CAAUw7F,GAAGxoH,EAAEX,EAAE2gD,EAAE,CAAC,CACja,IAAI6sE,GAAG,CAAC2C,YAAY5I,GAAG6I,YAAYlD,GAAGmD,WAAWnD,GAAG4B,UAAU5B,GAAGoD,oBAAoBpD,GAAGqD,gBAAgBrD,GAAGsD,QAAQtD,GAAGuD,WAAWvD,GAAGwD,OAAOxD,GAAGyB,SAASzB,GAAGyD,cAAczD,GAAG0D,iBAAiB1D,GAAG2D,cAAc3D,GAAG4D,iBAAiB5D,GAAG6D,oBAAoB7D,GAAG8D,0BAAyB,GAAI3D,GAAG,CAAC8C,YAAY5I,GAAG6I,YAAY,SAASzvH,EAAE/F,GAA4C,OAAzC6yH,KAAKje,cAAc,CAAC7uG,OAAE,IAAS/F,EAAE,KAAKA,GAAU+F,CAAC,EAAE0vH,WAAW9I,GAAGuH,UAAUY,GAAGY,oBAAoB,SAAS3vH,EAAE/F,EAAE8D,GAA6C,OAA1CA,EAAE,MAAOA,EAAcA,EAAEoC,OAAO,CAACH,IAAI,KAAY6uH,GAAG,EAAE,EAAEK,GAAG1lH,KAAK,KACvfvP,EAAE+F,GAAGjC,EAAE,EAAE6xH,gBAAgB,SAAS5vH,EAAE/F,GAAG,OAAO40H,GAAG,EAAE,EAAE7uH,EAAE/F,EAAE,EAAE41H,QAAQ,SAAS7vH,EAAE/F,GAAG,IAAI8D,EAAE+uH,KAAqD,OAAhD7yH,OAAE,IAASA,EAAE,KAAKA,EAAE+F,EAAEA,IAAIjC,EAAE8wG,cAAc,CAAC7uG,EAAE/F,GAAU+F,CAAC,EAAE8vH,WAAW,SAAS9vH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE8sE,KAAuK,OAAlK7yH,OAAE,IAAS8D,EAAEA,EAAE9D,GAAGA,EAAE+lD,EAAE6uD,cAAc7uD,EAAEknE,UAAUjtH,EAAmF+F,GAAjFA,EAAEggD,EAAEizC,MAAM,CAACo0B,QAAQ,KAAKmG,SAAS,KAAKL,oBAAoBntH,EAAEutH,kBAAkBtzH,IAAOuzH,SAASa,GAAG7kH,KAAK,KAAKiyB,GAAEz7B,GAAS,CAACggD,EAAE6uD,cAAc7uG,EAAE,EAAE+vH,OAAOpB,GAAGX,SAASO,GAAGyB,cAAcZ,GAAGa,iBAAiB,SAASjwH,GAAG,IAAI/F,EAAEs0H,GAAGvuH,GAAGjC,EAAE9D,EAAE,GAAG+lD,EAAE/lD,EAAE,GAC5Z,OAD+Z80H,IAAG,WAAW,IAAI90H,EAAEkyH,GAAGja,WAC9eia,GAAGja,WAAW,EAAE,IAAIlyD,EAAEhgD,EAAE,CAAC,QAAQmsH,GAAGja,WAAWj4G,CAAC,CAAC,GAAE,CAAC+F,IAAWjC,CAAC,EAAEmyH,cAAc,WAAW,IAAIlwH,EAAEuuH,IAAG,GAAIt0H,EAAE+F,EAAE,GAA8B,OAAN2uH,GAArB3uH,EAAEuvH,GAAG/lH,KAAK,KAAKxJ,EAAE,KAAgB,CAACA,EAAE/F,EAAE,EAAEk2H,iBAAiB,SAASnwH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE8sE,KAAkF,OAA7E9sE,EAAE6uD,cAAc,CAACjU,KAAK,CAACqzB,YAAYh0H,EAAEm0H,YAAY,MAAMx8G,OAAO5R,EAAEkuH,UAAUnwH,GAAU+vH,GAAG9tE,EAAEhgD,EAAE/F,EAAE8D,EAAE,EAAEqyH,oBAAoB,WAAW,GAAG/E,GAAG,CAAC,IAAIrrH,GAAE,EAAG/F,EAzDlD,SAASq2H,GAAGtwH,GAAG,MAAM,CAAC4pB,SAASy7E,GAAGtqG,SAASiF,EAAEhG,QAAQgG,EAAE,CAyDHswH,EAAG,WAAiD,MAAtCtwH,IAAIA,GAAE,EAAGjC,EAAE,MAAMkkH,MAAMlnH,SAAS,MAAY3D,MAAM8I,EAAE,KAAM,IAAGnC,EAAEwwH,GAAGt0H,GAAG,GAC1Z,OAD6Z,IAAY,EAAPwhC,GAAE1X,QAAU0X,GAAEgB,OAAO,IAAI+xF,GAAG,GAAE,WAAWzwH,EAAE,MAAMkkH,MAAMlnH,SAAS,IAAI,QACpf,EAAO,OAAcd,CAAC,CAAkC,OAANs0H,GAA3Bt0H,EAAE,MAAMgoH,MAAMlnH,SAAS,KAAiBd,CAAC,EAAEo2H,0BAAyB,GAAI1D,GAAG,CAAC6C,YAAY5I,GAAG6I,YAAYJ,GAAGK,WAAW9I,GAAGuH,UAAUa,GAAGW,oBAAoBR,GAAGS,gBAAgBX,GAAGY,QAAQP,GAAGQ,WAAW5C,GAAG6C,OAAOnB,GAAGZ,SAAS,WAAW,OAAOd,GAAGD,GAAG,EAAE+C,cAAcZ,GAAGa,iBAAiB,SAASjwH,GAAG,IAAI/F,EAAEizH,GAAGD,IAAIlvH,EAAE9D,EAAE,GAAG+lD,EAAE/lD,EAAE,GAA6F,OAA1F+0H,IAAG,WAAW,IAAI/0H,EAAEkyH,GAAGja,WAAWia,GAAGja,WAAW,EAAE,IAAIlyD,EAAEhgD,EAAE,CAAC,QAAQmsH,GAAGja,WAAWj4G,CAAC,CAAC,GAAE,CAAC+F,IAAWjC,CAAC,EAAEmyH,cAAc,WAAW,IAAIlwH,EAAEktH,GAAGD,IAAI,GAAG,MAAM,CAAC2B,KAAKnsG,QAC9eziB,EAAE,EAAEmwH,iBAAiB7B,GAAG8B,oBAAoB,WAAW,OAAOlD,GAAGD,IAAI,EAAE,EAAEoD,0BAAyB,GAAIzD,GAAG,CAAC4C,YAAY5I,GAAG6I,YAAYJ,GAAGK,WAAW9I,GAAGuH,UAAUa,GAAGW,oBAAoBR,GAAGS,gBAAgBX,GAAGY,QAAQP,GAAGQ,WAAWrC,GAAGsC,OAAOnB,GAAGZ,SAAS,WAAW,OAAOP,GAAGR,GAAG,EAAE+C,cAAcZ,GAAGa,iBAAiB,SAASjwH,GAAG,IAAI/F,EAAEwzH,GAAGR,IAAIlvH,EAAE9D,EAAE,GAAG+lD,EAAE/lD,EAAE,GAA6F,OAA1F+0H,IAAG,WAAW,IAAI/0H,EAAEkyH,GAAGja,WAAWia,GAAGja,WAAW,EAAE,IAAIlyD,EAAEhgD,EAAE,CAAC,QAAQmsH,GAAGja,WAAWj4G,CAAC,CAAC,GAAE,CAAC+F,IAAWjC,CAAC,EAAEmyH,cAAc,WAAW,IAAIlwH,EAAEytH,GAAGR,IAAI,GAAG,MAAM,CAAC2B,KAAKnsG,QACrfziB,EAAE,EAAEmwH,iBAAiB7B,GAAG8B,oBAAoB,WAAW,OAAO3C,GAAGR,IAAI,EAAE,EAAEoD,0BAAyB,GAAIE,GAAGjsB,GAAGksB,kBAAkB7J,IAAG,EAAG,SAAS8J,GAAGzwH,EAAE/F,EAAE8D,EAAEiiD,GAAG/lD,EAAEutC,MAAM,OAAOxnC,EAAEsqH,GAAGrwH,EAAE,KAAK8D,EAAEiiD,GAAGqqE,GAAGpwH,EAAE+F,EAAEwnC,MAAMzpC,EAAEiiD,EAAE,CAAC,SAAS0wE,GAAG1wH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAGtB,EAAEA,EAAEqyC,OAAO,IAAIr+B,EAAE9X,EAAEsoD,IAA8B,OAA1BgkE,GAAGtsH,EAAEoF,GAAG2gD,EAAEysE,GAAGzsH,EAAE/F,EAAE8D,EAAEiiD,EAAEjuC,EAAE1S,GAAM,OAAOW,GAAI2mH,IAA0E1sH,EAAEwiC,OAAO,EAAEg0F,GAAGzwH,EAAE/F,EAAE+lD,EAAE3gD,GAAUpF,EAAEutC,QAAhGvtC,EAAEgtH,YAAYjnH,EAAEinH,YAAYhtH,EAAEwiC,QAAQ,IAAIz8B,EAAE0mH,QAAQrnH,EAAErB,GAAGgC,EAAE/F,EAAEoF,GAAwC,CAChZ,SAASujD,GAAG5iD,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,GAAG,OAAO/R,EAAE,CAAC,IAAI0Z,EAAE3b,EAAEvD,KAAK,MAAG,mBAAoBkf,GAAIi3G,GAAGj3G,SAAI,IAASA,EAAEykC,cAAc,OAAOpgD,EAAEgC,cAAS,IAAShC,EAAEogD,eAAsDn+C,EAAEkqH,GAAGnsH,EAAEvD,KAAK,KAAKwlD,EAAE/lD,EAAEA,EAAE8pB,KAAKhS,IAAKwwC,IAAItoD,EAAEsoD,IAAIviD,EAAE2uG,OAAO10G,EAASA,EAAEutC,MAAMxnC,IAAvG/F,EAAEoX,IAAI,GAAGpX,EAAEO,KAAKkf,EAAEk3G,GAAG5wH,EAAE/F,EAAEyf,EAAEsmC,EAAE3gD,EAAE0S,GAAyE,CAAW,OAAV2H,EAAE1Z,EAAEwnC,MAAS,IAAKnoC,EAAE0S,KAAK1S,EAAEqa,EAAEuxG,eAA0BltH,EAAE,QAAdA,EAAEA,EAAEgC,SAAmBhC,EAAEkgH,IAAK5+G,EAAE2gD,IAAIhgD,EAAEuiD,MAAMtoD,EAAEsoD,KAAYvkD,GAAGgC,EAAE/F,EAAE8X,IAAG9X,EAAEwiC,OAAO,GAAEz8B,EAAEgqH,GAAGtwG,EAAEsmC,IAAKuC,IAAItoD,EAAEsoD,IAAIviD,EAAE2uG,OAAO10G,EAASA,EAAEutC,MAAMxnC,EAAC,CACnb,SAAS4wH,GAAG5wH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,GAAG,OAAO/R,GAAGi+G,GAAGj+G,EAAEirH,cAAcjrE,IAAIhgD,EAAEuiD,MAAMtoD,EAAEsoD,IAAI,IAAGokE,IAAG,EAAG,IAAK50G,EAAE1S,GAAqC,OAAOpF,EAAEysH,MAAM1mH,EAAE0mH,MAAM1oH,GAAGgC,EAAE/F,EAAE8X,GAAhE,IAAa,MAAR/R,EAAEy8B,SAAekqF,IAAG,EAAyC,CAAC,OAAOkK,GAAG7wH,EAAE/F,EAAE8D,EAAEiiD,EAAEjuC,EAAE,CACrL,SAAS++G,GAAG9wH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE/lD,EAAEwxH,aAAapsH,EAAE2gD,EAAE5Y,SAASr1B,EAAE,OAAO/R,EAAEA,EAAE6uG,cAAc,KAAK,GAAG,WAAW7uD,EAAEj8B,MAAM,kCAAkCi8B,EAAEj8B,KAAK,GAAG,IAAY,EAAP9pB,EAAE8pB,MAAQ9pB,EAAE40G,cAAc,CAACkiB,UAAU,GAAGC,GAAG/2H,EAAE8D,OAAQ,IAAG,IAAO,WAAFA,GAA8E,OAAOiC,EAAE,OAAO+R,EAAEA,EAAEg/G,UAAUhzH,EAAEA,EAAE9D,EAAEysH,MAAMzsH,EAAEqsH,WAAW,WAAWrsH,EAAE40G,cAAc,CAACkiB,UAAU/wH,GAAGgxH,GAAG/2H,EAAE+F,GAAG,KAAxK/F,EAAE40G,cAAc,CAACkiB,UAAU,GAAGC,GAAG/2H,EAAE,OAAO8X,EAAEA,EAAEg/G,UAAUhzH,EAAoH,MAAM,OAAOgU,GAAGiuC,EAAEjuC,EAAEg/G,UAAUhzH,EAAE9D,EAAE40G,cAAc,MAAM7uD,EAAEjiD,EAAEizH,GAAG/2H,EAAE+lD,GAAe,OAAZywE,GAAGzwH,EAAE/F,EAAEoF,EAAEtB,GAAU9D,EAAEutC,KAAK,CAC/e,SAASypF,GAAGjxH,EAAE/F,GAAG,IAAI8D,EAAE9D,EAAEsoD,KAAO,OAAOviD,GAAG,OAAOjC,GAAG,OAAOiC,GAAGA,EAAEuiD,MAAMxkD,KAAE9D,EAAEwiC,OAAO,IAAG,CAAC,SAASo0F,GAAG7wH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI0S,EAAEmxG,GAAGnlH,GAAG+kH,GAAGF,GAAEngG,QAA4C,OAApC1Q,EAAEgxG,GAAG9oH,EAAE8X,GAAGw0G,GAAGtsH,EAAEoF,GAAGtB,EAAE0uH,GAAGzsH,EAAE/F,EAAE8D,EAAEiiD,EAAEjuC,EAAE1S,GAAM,OAAOW,GAAI2mH,IAA0E1sH,EAAEwiC,OAAO,EAAEg0F,GAAGzwH,EAAE/F,EAAE8D,EAAEsB,GAAUpF,EAAEutC,QAAhGvtC,EAAEgtH,YAAYjnH,EAAEinH,YAAYhtH,EAAEwiC,QAAQ,IAAIz8B,EAAE0mH,QAAQrnH,EAAErB,GAAGgC,EAAE/F,EAAEoF,GAAwC,CACtS,SAAS6xH,GAAGlxH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,GAAG6jH,GAAGnlH,GAAG,CAAC,IAAIgU,GAAE,EAAGwxG,GAAGtpH,EAAE,MAAM8X,GAAE,EAAW,GAARw0G,GAAGtsH,EAAEoF,GAAM,OAAOpF,EAAEkzG,UAAU,OAAOntG,IAAIA,EAAE0uG,UAAU,KAAKz0G,EAAEy0G,UAAU,KAAKz0G,EAAEwiC,OAAO,GAAGqsF,GAAG7uH,EAAE8D,EAAEiiD,GAAGkpE,GAAGjvH,EAAE8D,EAAEiiD,EAAE3gD,GAAG2gD,GAAE,OAAQ,GAAG,OAAOhgD,EAAE,CAAC,IAAI0Z,EAAEzf,EAAEkzG,UAAUxjD,EAAE1vD,EAAEgxH,cAAcvxG,EAAEwI,MAAMynC,EAAE,IAAI3F,EAAEtqC,EAAEqlB,QAAQ/R,EAAEjvB,EAAEkgD,YAAY,iBAAkBjxB,GAAG,OAAOA,EAAEA,EAAE45F,GAAG55F,GAAyBA,EAAE+1F,GAAG9oH,EAA1B+yB,EAAEk2F,GAAGnlH,GAAG+kH,GAAGF,GAAEngG,SAAmB,IAAI3mB,EAAEiC,EAAEugD,yBAAyBx+B,EAAE,mBAAoBhkB,GAAG,mBAAoB4d,EAAEyvG,wBAAwBrpG,GAAG,mBAAoBpG,EAAEuvG,kCACpd,mBAAoBvvG,EAAEsvG,4BAA4Br/D,IAAI3J,GAAGgE,IAAIh3B,IAAI+7F,GAAG9uH,EAAEyf,EAAEsmC,EAAEhzB,GAAG+5F,IAAG,EAAG,IAAI5nB,EAAEllG,EAAE40G,cAAcn1F,EAAEe,MAAM0kF,EAAE0oB,GAAG5tH,EAAE+lD,EAAEtmC,EAAEra,GAAG2kD,EAAE/pD,EAAE40G,cAAcllD,IAAI3J,GAAGm/C,IAAIn7C,GAAG6+D,GAAEpgG,SAASskG,IAAI,mBAAoBjrH,IAAImsH,GAAGhuH,EAAE8D,EAAEjC,EAAEkkD,GAAGgE,EAAE/pD,EAAE40G,gBAAgBllD,EAAEo9D,IAAI4B,GAAG1uH,EAAE8D,EAAE4rD,EAAE3J,EAAEm/C,EAAEn7C,EAAEh3B,KAAKlN,GAAG,mBAAoBpG,EAAE0vG,2BAA2B,mBAAoB1vG,EAAE2vG,qBAAqB,mBAAoB3vG,EAAE2vG,oBAAoB3vG,EAAE2vG,qBAAqB,mBAAoB3vG,EAAE0vG,2BAA2B1vG,EAAE0vG,6BAA6B,mBACze1vG,EAAE4vG,oBAAoBrvH,EAAEwiC,OAAO,KAAK,mBAAoB/iB,EAAE4vG,oBAAoBrvH,EAAEwiC,OAAO,GAAGxiC,EAAEgxH,cAAcjrE,EAAE/lD,EAAE40G,cAAc7qD,GAAGtqC,EAAEwI,MAAM89B,EAAEtmC,EAAEe,MAAMupC,EAAEtqC,EAAEqlB,QAAQ/R,EAAEgzB,EAAE2J,IAAI,mBAAoBjwC,EAAE4vG,oBAAoBrvH,EAAEwiC,OAAO,GAAGujB,GAAE,EAAG,KAAK,CAACtmC,EAAEzf,EAAEkzG,UAAUoa,GAAGvnH,EAAE/F,GAAG0vD,EAAE1vD,EAAEgxH,cAAcj+F,EAAE/yB,EAAEO,OAAOP,EAAEk7F,YAAYxrC,EAAEk8D,GAAG5rH,EAAEO,KAAKmvD,GAAGjwC,EAAEwI,MAAM8K,EAAElN,EAAE7lB,EAAEwxH,aAAatsB,EAAEzlF,EAAEqlB,QAAwB,iBAAhBilB,EAAEjmD,EAAEkgD,cAAiC,OAAO+F,EAAEA,EAAE4iE,GAAG5iE,GAAyBA,EAAE++D,GAAG9oH,EAA1B+pD,EAAEk/D,GAAGnlH,GAAG+kH,GAAGF,GAAEngG,SAAmB,IAAI7M,GAAE7X,EAAEugD,0BAA0BxiD,EAAE,mBAAoB8Z,IACnf,mBAAoB8D,EAAEyvG,0BAA0B,mBAAoBzvG,EAAEuvG,kCAAkC,mBAAoBvvG,EAAEsvG,4BAA4Br/D,IAAI7pC,GAAGq/E,IAAIn7C,IAAI+kE,GAAG9uH,EAAEyf,EAAEsmC,EAAEgE,GAAG+iE,IAAG,EAAG5nB,EAAEllG,EAAE40G,cAAcn1F,EAAEe,MAAM0kF,EAAE0oB,GAAG5tH,EAAE+lD,EAAEtmC,EAAEra,GAAG,IAAIY,GAAEhG,EAAE40G,cAAcllD,IAAI7pC,GAAGq/E,IAAIl/F,IAAG4iH,GAAEpgG,SAASskG,IAAI,mBAAoBnxG,KAAIqyG,GAAGhuH,EAAE8D,EAAE6X,GAAEoqC,GAAG//C,GAAEhG,EAAE40G,gBAAgB7hF,EAAE+5F,IAAI4B,GAAG1uH,EAAE8D,EAAEivB,EAAEgzB,EAAEm/C,EAAEl/F,GAAE+jD,KAAKloD,GAAG,mBAAoB4d,EAAEy3G,4BAA4B,mBAAoBz3G,EAAE03G,sBAAsB,mBAAoB13G,EAAE03G,qBAAqB13G,EAAE03G,oBAAoBpxE,EAC1gB//C,GAAE+jD,GAAG,mBAAoBtqC,EAAEy3G,4BAA4Bz3G,EAAEy3G,2BAA2BnxE,EAAE//C,GAAE+jD,IAAI,mBAAoBtqC,EAAEuoF,qBAAqBhoG,EAAEwiC,OAAO,GAAG,mBAAoB/iB,EAAEyvG,0BAA0BlvH,EAAEwiC,OAAO,OAAO,mBAAoB/iB,EAAEuoF,oBAAoBt4C,IAAI3pD,EAAEirH,eAAe9rB,IAAIn/F,EAAE6uG,gBAAgB50G,EAAEwiC,OAAO,GAAG,mBAAoB/iB,EAAEyvG,yBAAyBx/D,IAAI3pD,EAAEirH,eAAe9rB,IAAIn/F,EAAE6uG,gBAAgB50G,EAAEwiC,OAAO,KAAKxiC,EAAEgxH,cAAcjrE,EAAE/lD,EAAE40G,cAAc5uG,IAAGyZ,EAAEwI,MAAM89B,EAAEtmC,EAAEe,MAAMxa,GAAEyZ,EAAEqlB,QAAQilB,EAAEhE,EAAEhzB,IAAI,mBAAoBtT,EAAEuoF,oBAC7ft4C,IAAI3pD,EAAEirH,eAAe9rB,IAAIn/F,EAAE6uG,gBAAgB50G,EAAEwiC,OAAO,GAAG,mBAAoB/iB,EAAEyvG,yBAAyBx/D,IAAI3pD,EAAEirH,eAAe9rB,IAAIn/F,EAAE6uG,gBAAgB50G,EAAEwiC,OAAO,KAAKujB,GAAE,EAAG,CAAC,OAAOqxE,GAAGrxH,EAAE/F,EAAE8D,EAAEiiD,EAAEjuC,EAAE1S,EAAE,CAC3L,SAASgyH,GAAGrxH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAGk/G,GAAGjxH,EAAE/F,GAAG,IAAIyf,EAAE,IAAa,GAARzf,EAAEwiC,OAAU,IAAIujB,IAAItmC,EAAE,OAAOra,GAAGokH,GAAGxpH,EAAE8D,GAAE,GAAIC,GAAGgC,EAAE/F,EAAE8X,GAAGiuC,EAAE/lD,EAAEkzG,UAAUojB,GAAG9tG,QAAQxoB,EAAE,IAAI0vD,EAAEjwC,GAAG,mBAAoB3b,EAAEsgD,yBAAyB,KAAK2B,EAAE5P,SAAwI,OAA/Hn2C,EAAEwiC,OAAO,EAAE,OAAOz8B,GAAG0Z,GAAGzf,EAAEutC,MAAM6iF,GAAGpwH,EAAE+F,EAAEwnC,MAAM,KAAKz1B,GAAG9X,EAAEutC,MAAM6iF,GAAGpwH,EAAE,KAAK0vD,EAAE53C,IAAI0+G,GAAGzwH,EAAE/F,EAAE0vD,EAAE53C,GAAG9X,EAAE40G,cAAc7uD,EAAEvlC,MAAMpb,GAAGokH,GAAGxpH,EAAE8D,GAAE,GAAW9D,EAAEutC,KAAK,CAAC,SAAS8pF,GAAGtxH,GAAG,IAAI/F,EAAE+F,EAAEmtG,UAAUlzG,EAAEs3H,eAAenO,GAAGpjH,EAAE/F,EAAEs3H,eAAet3H,EAAEs3H,iBAAiBt3H,EAAE8kC,SAAS9kC,EAAE8kC,SAASqkF,GAAGpjH,EAAE/F,EAAE8kC,SAAQ,GAAI6rF,GAAG5qH,EAAE/F,EAAE82G,cAAc,CAC3e,IAS0VygB,GAAGC,GAAGC,GAAGC,GAT/VC,GAAG,CAAC9iB,WAAW,KAAK+iB,UAAU,GAClC,SAASC,GAAG9xH,EAAE/F,EAAE8D,GAAG,IAAsC2b,EAAlCsmC,EAAE/lD,EAAEwxH,aAAapsH,EAAEia,GAAEmJ,QAAQ1Q,GAAE,EAA6M,OAAvM2H,EAAE,IAAa,GAARzf,EAAEwiC,UAAa/iB,GAAE,OAAO1Z,GAAG,OAAOA,EAAE6uG,gBAAiB,IAAO,EAAFxvG,IAAMqa,GAAG3H,GAAE,EAAG9X,EAAEwiC,QAAQ,IAAI,OAAOz8B,GAAG,OAAOA,EAAE6uG,oBAAe,IAAS7uD,EAAE+xE,WAAU,IAAK/xE,EAAEgyE,6BAA6B3yH,GAAG,GAAGqjH,EAAEppG,GAAI,EAAFja,GAAQ,OAAOW,QAAG,IAASggD,EAAE+xE,UAAUrG,GAAGzxH,GAAG+F,EAAEggD,EAAE5Y,SAAS/nC,EAAE2gD,EAAE+xE,SAAYhgH,GAAS/R,EAAEiyH,GAAGh4H,EAAE+F,EAAEX,EAAEtB,GAAG9D,EAAEutC,MAAMqnE,cAAc,CAACkiB,UAAUhzH,GAAG9D,EAAE40G,cAAc+iB,GAAG5xH,GAAK,iBAAkBggD,EAAEkyE,2BAAiClyH,EAAEiyH,GAAGh4H,EAAE+F,EAAEX,EAAEtB,GAAG9D,EAAEutC,MAAMqnE,cAAc,CAACkiB,UAAUhzH,GAC/f9D,EAAE40G,cAAc+iB,GAAG33H,EAAEysH,MAAM,SAAS1mH,KAAEjC,EAAEo0H,GAAG,CAACpuG,KAAK,UAAUqjB,SAASpnC,GAAG/F,EAAE8pB,KAAKhmB,EAAE,OAAQ4wG,OAAO10G,EAASA,EAAEutC,MAAMzpC,KAAYiC,EAAE6uG,cAAkB98F,GAASiuC,EAAEoyE,GAAGpyH,EAAE/F,EAAE+lD,EAAE5Y,SAAS4Y,EAAE+xE,SAASh0H,GAAGgU,EAAE9X,EAAEutC,MAAMnoC,EAAEW,EAAEwnC,MAAMqnE,cAAc98F,EAAE88F,cAAc,OAAOxvG,EAAE,CAAC0xH,UAAUhzH,GAAG,CAACgzH,UAAU1xH,EAAE0xH,UAAUhzH,GAAGgU,EAAEu0G,WAAWtmH,EAAEsmH,YAAYvoH,EAAE9D,EAAE40G,cAAc+iB,GAAG5xE,IAAEjiD,EAAEs0H,GAAGryH,EAAE/F,EAAE+lD,EAAE5Y,SAASrpC,GAAG9D,EAAE40G,cAAc,KAAY9wG,GACnQ,CAAC,SAASk0H,GAAGjyH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEW,EAAE+jB,KAAKhS,EAAE/R,EAAEwnC,MAAuK,OAAjKvtC,EAAE,CAAC8pB,KAAK,SAASqjB,SAASntC,GAAG,IAAO,EAAFoF,IAAM,OAAO0S,GAAGA,EAAEu0G,WAAW,EAAEv0G,EAAE05G,aAAaxxH,GAAG8X,EAAEogH,GAAGl4H,EAAEoF,EAAE,EAAE,MAAMtB,EAAEqsH,GAAGrsH,EAAEsB,EAAE2gD,EAAE,MAAMjuC,EAAE48F,OAAO3uG,EAAEjC,EAAE4wG,OAAO3uG,EAAE+R,EAAEm9F,QAAQnxG,EAAEiC,EAAEwnC,MAAMz1B,EAAShU,CAAC,CACtV,SAASs0H,GAAGryH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEW,EAAEwnC,MAAiL,OAA3KxnC,EAAEX,EAAE6vG,QAAQnxG,EAAEisH,GAAG3qH,EAAE,CAAC0kB,KAAK,UAAUqjB,SAASrpC,IAAI,IAAY,EAAP9D,EAAE8pB,QAAUhmB,EAAE2oH,MAAM1mE,GAAGjiD,EAAE4wG,OAAO10G,EAAE8D,EAAEmxG,QAAQ,KAAK,OAAOlvG,IAAIA,EAAE8pH,WAAW,KAAK9pH,EAAEy8B,MAAM,EAAExiC,EAAE8vH,YAAY9vH,EAAE4vH,WAAW7pH,GAAU/F,EAAEutC,MAAMzpC,CAAC,CAC9N,SAASq0H,GAAGpyH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI0S,EAAE9X,EAAE8pB,KAAKrK,EAAE1Z,EAAEwnC,MAAMxnC,EAAE0Z,EAAEw1F,QAAQ,IAAIvlD,EAAE,CAAC5lC,KAAK,SAASqjB,SAASrpC,GAAoS,OAAjS,IAAO,EAAFgU,IAAM9X,EAAEutC,QAAQ9tB,IAAG3b,EAAE9D,EAAEutC,OAAQ8+E,WAAW,EAAEvoH,EAAE0tH,aAAa9hE,EAAiB,QAAfjwC,EAAE3b,EAAE8rH,aAAqB5vH,EAAE8vH,YAAYhsH,EAAEgsH,YAAY9vH,EAAE4vH,WAAWnwG,EAAEA,EAAEowG,WAAW,MAAM7vH,EAAE8vH,YAAY9vH,EAAE4vH,WAAW,MAAM9rH,EAAEisH,GAAGtwG,EAAEiwC,GAAG,OAAO3pD,EAAEggD,EAAEgqE,GAAGhqH,EAAEggD,IAAIA,EAAEoqE,GAAGpqE,EAAEjuC,EAAE1S,EAAE,OAAQo9B,OAAO,EAAGujB,EAAE2uD,OAAO10G,EAAE8D,EAAE4wG,OAAO10G,EAAE8D,EAAEmxG,QAAQlvD,EAAE/lD,EAAEutC,MAAMzpC,EAASiiD,CAAC,CAAC,SAASsyE,GAAGtyH,EAAE/F,GAAG+F,EAAE0mH,OAAOzsH,EAAE,IAAI8D,EAAEiC,EAAE0uG,UAAU,OAAO3wG,IAAIA,EAAE2oH,OAAOzsH,GAAGosH,GAAGrmH,EAAE2uG,OAAO10G,EAAE,CACxd,SAASs4H,GAAGvyH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,IAAI2H,EAAE1Z,EAAE6uG,cAAc,OAAOn1F,EAAE1Z,EAAE6uG,cAAc,CAAC2jB,YAAYv4H,EAAEw4H,UAAU,KAAKC,mBAAmB,EAAE/uH,KAAKq8C,EAAE+T,KAAKh2D,EAAE40H,SAAStzH,EAAEwqH,WAAW93G,IAAI2H,EAAE84G,YAAYv4H,EAAEyf,EAAE+4G,UAAU,KAAK/4G,EAAEg5G,mBAAmB,EAAEh5G,EAAE/V,KAAKq8C,EAAEtmC,EAAEq6C,KAAKh2D,EAAE2b,EAAEi5G,SAAStzH,EAAEqa,EAAEmwG,WAAW93G,EAAE,CACzQ,SAAS6gH,GAAG5yH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE/lD,EAAEwxH,aAAapsH,EAAE2gD,EAAEkrE,YAAYn5G,EAAEiuC,EAAE+T,KAAsC,GAAjC08D,GAAGzwH,EAAE/F,EAAE+lD,EAAE5Y,SAASrpC,GAAkB,IAAO,GAAtBiiD,EAAE1mC,GAAEmJ,UAAqBu9B,EAAI,EAAFA,EAAI,EAAE/lD,EAAEwiC,OAAO,OAAO,CAAC,GAAG,OAAOz8B,GAAG,IAAa,GAARA,EAAEy8B,OAAUz8B,EAAE,IAAIA,EAAE/F,EAAEutC,MAAM,OAAOxnC,GAAG,CAAC,GAAG,KAAKA,EAAEqR,IAAI,OAAOrR,EAAE6uG,eAAeyjB,GAAGtyH,EAAEjC,QAAQ,GAAG,KAAKiC,EAAEqR,IAAIihH,GAAGtyH,EAAEjC,QAAQ,GAAG,OAAOiC,EAAEwnC,MAAM,CAACxnC,EAAEwnC,MAAMmnE,OAAO3uG,EAAEA,EAAEA,EAAEwnC,MAAM,QAAQ,CAAC,GAAGxnC,IAAI/F,EAAE,MAAM+F,EAAE,KAAK,OAAOA,EAAEkvG,SAAS,CAAC,GAAG,OAAOlvG,EAAE2uG,QAAQ3uG,EAAE2uG,SAAS10G,EAAE,MAAM+F,EAAEA,EAAEA,EAAE2uG,MAAM,CAAC3uG,EAAEkvG,QAAQP,OAAO3uG,EAAE2uG,OAAO3uG,EAAEA,EAAEkvG,OAAO,CAAClvD,GAAG,CAAC,CAAQ,GAAP0iE,EAAEppG,GAAE0mC,GAAM,IAAY,EAAP/lD,EAAE8pB,MAAQ9pB,EAAE40G,cACze,UAAU,OAAOxvG,GAAG,IAAK,WAAqB,IAAVtB,EAAE9D,EAAEutC,MAAUnoC,EAAE,KAAK,OAAOtB,GAAiB,QAAdiC,EAAEjC,EAAE2wG,YAAoB,OAAOsc,GAAGhrH,KAAKX,EAAEtB,GAAGA,EAAEA,EAAEmxG,QAAY,QAAJnxG,EAAEsB,IAAYA,EAAEpF,EAAEutC,MAAMvtC,EAAEutC,MAAM,OAAOnoC,EAAEtB,EAAEmxG,QAAQnxG,EAAEmxG,QAAQ,MAAMqjB,GAAGt4H,GAAE,EAAGoF,EAAEtB,EAAEgU,EAAE9X,EAAE4vH,YAAY,MAAM,IAAK,YAA6B,IAAjB9rH,EAAE,KAAKsB,EAAEpF,EAAEutC,MAAUvtC,EAAEutC,MAAM,KAAK,OAAOnoC,GAAG,CAAe,GAAG,QAAjBW,EAAEX,EAAEqvG,YAAuB,OAAOsc,GAAGhrH,GAAG,CAAC/F,EAAEutC,MAAMnoC,EAAE,KAAK,CAACW,EAAEX,EAAE6vG,QAAQ7vG,EAAE6vG,QAAQnxG,EAAEA,EAAEsB,EAAEA,EAAEW,CAAC,CAACuyH,GAAGt4H,GAAE,EAAG8D,EAAE,KAAKgU,EAAE9X,EAAE4vH,YAAY,MAAM,IAAK,WAAW0I,GAAGt4H,GAAE,EAAG,KAAK,UAAK,EAAOA,EAAE4vH,YAAY,MAAM,QAAQ5vH,EAAE40G,cAAc,KAAK,OAAO50G,EAAEutC,KAAK,CACpgB,SAASxpC,GAAGgC,EAAE/F,EAAE8D,GAAyD,GAAtD,OAAOiC,IAAI/F,EAAEusH,aAAaxmH,EAAEwmH,cAAcsB,IAAI7tH,EAAEysH,MAAS,IAAK3oH,EAAE9D,EAAEqsH,YAAY,CAAC,GAAG,OAAOtmH,GAAG/F,EAAEutC,QAAQxnC,EAAEwnC,MAAM,MAAMpwC,MAAM8I,EAAE,MAAM,GAAG,OAAOjG,EAAEutC,MAAM,CAA4C,IAAjCzpC,EAAEisH,GAAZhqH,EAAE/F,EAAEutC,MAAaxnC,EAAEyrH,cAAcxxH,EAAEutC,MAAMzpC,EAAMA,EAAE4wG,OAAO10G,EAAE,OAAO+F,EAAEkvG,SAASlvG,EAAEA,EAAEkvG,SAAQnxG,EAAEA,EAAEmxG,QAAQ8a,GAAGhqH,EAAEA,EAAEyrH,eAAgB9c,OAAO10G,EAAE8D,EAAEmxG,QAAQ,IAAI,CAAC,OAAOj1G,EAAEutC,KAAK,CAAC,OAAO,IAAI,CAKhQ,SAASqrF,GAAG7yH,EAAE/F,GAAG,IAAIoxH,GAAG,OAAOrrH,EAAE2yH,UAAU,IAAK,SAAS14H,EAAE+F,EAAE+zD,KAAK,IAAI,IAAIh2D,EAAE,KAAK,OAAO9D,GAAG,OAAOA,EAAEy0G,YAAY3wG,EAAE9D,GAAGA,EAAEA,EAAEi1G,QAAQ,OAAOnxG,EAAEiC,EAAE+zD,KAAK,KAAKh2D,EAAEmxG,QAAQ,KAAK,MAAM,IAAK,YAAYnxG,EAAEiC,EAAE+zD,KAAK,IAAI,IAAI/T,EAAE,KAAK,OAAOjiD,GAAG,OAAOA,EAAE2wG,YAAY1uD,EAAEjiD,GAAGA,EAAEA,EAAEmxG,QAAQ,OAAOlvD,EAAE/lD,GAAG,OAAO+F,EAAE+zD,KAAK/zD,EAAE+zD,KAAK,KAAK/zD,EAAE+zD,KAAKm7C,QAAQ,KAAKlvD,EAAEkvD,QAAQ,KAAK,CACla,SAAS4jB,GAAG9yH,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE/lD,EAAEwxH,aAAa,OAAOxxH,EAAEoX,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,OAAO,KAAK,KAAK,EAQyC,KAAK,GAAG,OAAO6xG,GAAGjpH,EAAEO,OAAO2oH,KAAK,KAR1C,KAAK,EAAsL,OAApL0H,KAAKpI,EAAEI,IAAGJ,EAAEG,IAAGmJ,MAAK/rE,EAAE/lD,EAAEkzG,WAAYokB,iBAAiBvxE,EAAEjhB,QAAQihB,EAAEuxE,eAAevxE,EAAEuxE,eAAe,MAAS,OAAOvxH,GAAG,OAAOA,EAAEwnC,QAAMokF,GAAG3xH,GAAGA,EAAEwiC,OAAO,EAAEujB,EAAE8wD,UAAU72G,EAAEwiC,OAAO,MAAKg1F,GAAGx3H,GAAU,KAAK,KAAK,EAAE8wH,GAAG9wH,GAAG,IAAIoF,EAAEsrH,GAAGD,GAAGjoG,SAAkB,GAAT1kB,EAAE9D,EAAEO,KAAQ,OAAOwF,GAAG,MAAM/F,EAAEkzG,UAAUukB,GAAG1xH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAGW,EAAEuiD,MAAMtoD,EAAEsoD,MAAMtoD,EAAEwiC,OAAO,SAAS,CAAC,IAAIujB,EAAE,CAAC,GAAG,OAC7f/lD,EAAEkzG,UAAU,MAAM/1G,MAAM8I,EAAE,MAAM,OAAO,IAAI,CAAkB,GAAjBF,EAAE2qH,GAAGH,GAAG/nG,SAAYmpG,GAAG3xH,GAAG,CAAC+lD,EAAE/lD,EAAEkzG,UAAUpvG,EAAE9D,EAAEO,KAAK,IAAIuX,EAAE9X,EAAEgxH,cAA8B,OAAhBjrE,EAAEmiE,IAAIloH,EAAE+lD,EAAEoiE,IAAIrwG,EAAShU,GAAG,IAAK,SAAS8hH,EAAE,SAAS7/D,GAAG6/D,EAAE,QAAQ7/D,GAAG,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ6/D,EAAE,OAAO7/D,GAAG,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAIhgD,EAAE,EAAEA,EAAEy/G,GAAGjpH,OAAOwJ,IAAI6/G,EAAEJ,GAAGz/G,GAAGggD,GAAG,MAAM,IAAK,SAAS6/D,EAAE,QAAQ7/D,GAAG,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO6/D,EAAE,QAAQ7/D,GAAG6/D,EAAE,OAAO7/D,GAAG,MAAM,IAAK,UAAU6/D,EAAE,SAAS7/D,GAAG,MAAM,IAAK,QAAQmnD,GAAGnnD,EAAEjuC,GAAG8tG,EAAE,UAAU7/D,GAAG,MAAM,IAAK,SAASA,EAAEinD,cAC5f,CAAC8rB,cAAchhH,EAAEihH,UAAUnT,EAAE,UAAU7/D,GAAG,MAAM,IAAK,WAAWgoD,GAAGhoD,EAAEjuC,GAAG8tG,EAAE,UAAU7/D,GAAkB,IAAI,IAAItmC,KAAvB+yF,GAAG1uG,EAAEgU,GAAG/R,EAAE,KAAkB+R,EAAEA,EAAE5H,eAAeuP,KAAKra,EAAE0S,EAAE2H,GAAG,aAAaA,EAAE,iBAAkBra,EAAE2gD,EAAE/yC,cAAc5N,IAAIW,EAAE,CAAC,WAAWX,IAAI,iBAAkBA,GAAG2gD,EAAE/yC,cAAc,GAAG5N,IAAIW,EAAE,CAAC,WAAW,GAAGX,IAAI0jG,EAAG54F,eAAeuP,IAAI,MAAMra,GAAG,aAAaqa,GAAGmmG,EAAE,SAAS7/D,IAAI,OAAOjiD,GAAG,IAAK,QAAQwoG,GAAGvmD,GAAGvL,GAAGuL,EAAEjuC,GAAE,GAAI,MAAM,IAAK,WAAWw0F,GAAGvmD,GAAGkoD,GAAGloD,GAAG,MAAM,IAAK,SAAS,IAAK,SAAS,MAAM,QAAQ,mBAAoBjuC,EAAE0uF,UAAUzgD,EAAEizE,QACtf5R,IAAIrhE,EAAEhgD,EAAE/F,EAAEgtH,YAAYjnE,EAAE,OAAOA,IAAI/lD,EAAEwiC,OAAO,EAAE,KAAK,CAAiZ,OAAhZ/iB,EAAE,IAAIra,EAAEqwB,SAASrwB,EAAEA,EAAEsxB,cAAc3wB,IAAImoG,GAAGznF,OAAO1gB,EAAEqoG,GAAGtqG,IAAIiC,IAAImoG,GAAGznF,KAAK,WAAW3iB,IAAGiC,EAAE0Z,EAAE1M,cAAc,QAAS0pB,UAAU,qBAAuB12B,EAAEA,EAAEmP,YAAYnP,EAAEs5B,aAAa,iBAAkB0mB,EAAE4H,GAAG5nD,EAAE0Z,EAAE1M,cAAcjP,EAAE,CAAC6pD,GAAG5H,EAAE4H,MAAM5nD,EAAE0Z,EAAE1M,cAAcjP,GAAG,WAAWA,IAAI2b,EAAE1Z,EAAEggD,EAAEgzE,SAASt5G,EAAEs5G,UAAS,EAAGhzE,EAAEnlD,OAAO6e,EAAE7e,KAAKmlD,EAAEnlD,QAAQmF,EAAE0Z,EAAEw5G,gBAAgBlzH,EAAEjC,GAAGiC,EAAEmiH,IAAIloH,EAAE+F,EAAEoiH,IAAIpiE,EAAEwxE,GAAGxxH,EAAE/F,GAAE,GAAG,GAAIA,EAAEkzG,UAAUntG,EAAE0Z,EAAEgzF,GAAG3uG,EAAEiiD,GAAUjiD,GAAG,IAAK,SAAS8hH,EAAE,SAAS7/G,GAAG6/G,EAAE,QAAQ7/G,GACpfX,EAAE2gD,EAAE,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ6/D,EAAE,OAAO7/G,GAAGX,EAAE2gD,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAI3gD,EAAE,EAAEA,EAAEogH,GAAGjpH,OAAO6I,IAAIwgH,EAAEJ,GAAGpgH,GAAGW,GAAGX,EAAE2gD,EAAE,MAAM,IAAK,SAAS6/D,EAAE,QAAQ7/G,GAAGX,EAAE2gD,EAAE,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO6/D,EAAE,QAAQ7/G,GAAG6/G,EAAE,OAAO7/G,GAAGX,EAAE2gD,EAAE,MAAM,IAAK,UAAU6/D,EAAE,SAAS7/G,GAAGX,EAAE2gD,EAAE,MAAM,IAAK,QAAQmnD,GAAGnnG,EAAEggD,GAAG3gD,EAAE0nG,GAAG/mG,EAAEggD,GAAG6/D,EAAE,UAAU7/G,GAAG,MAAM,IAAK,SAASX,EAAEmoG,GAAGxnG,EAAEggD,GAAG,MAAM,IAAK,SAAShgD,EAAEinG,cAAc,CAAC8rB,cAAc/yE,EAAEgzE,UAAU3zH,EAAEtD,EAAE,CAAC,EAAEikD,EAAE,CAACnnD,WAAM,IAASgnH,EAAE,UAAU7/G,GAAG,MAAM,IAAK,WAAWgoG,GAAGhoG,EAAEggD,GAAG3gD,EACpfyoG,GAAG9nG,EAAEggD,GAAG6/D,EAAE,UAAU7/G,GAAG,MAAM,QAAQX,EAAE2gD,EAAEysD,GAAG1uG,EAAEsB,GAAG,IAAIsqD,EAAEtqD,EAAE,IAAI0S,KAAK43C,EAAE,GAAGA,EAAEx/C,eAAe4H,GAAG,CAAC,IAAIiyC,EAAE2F,EAAE53C,GAAG,UAAUA,EAAE25F,GAAG1rG,EAAEgkD,GAAG,4BAA4BjyC,EAAuB,OAApBiyC,EAAEA,EAAEA,EAAE29D,YAAO,IAAgBnZ,GAAGxoG,EAAEgkD,GAAI,aAAajyC,EAAE,iBAAkBiyC,GAAG,aAAajmD,GAAG,KAAKimD,IAAI2kD,GAAG3oG,EAAEgkD,GAAG,iBAAkBA,GAAG2kD,GAAG3oG,EAAE,GAAGgkD,GAAG,mCAAmCjyC,GAAG,6BAA6BA,GAAG,cAAcA,IAAIgxF,EAAG54F,eAAe4H,GAAG,MAAMiyC,GAAG,aAAajyC,GAAG8tG,EAAE,SAAS7/G,GAAG,MAAMgkD,GAAGigD,GAAGjkG,EAAE+R,EAAEiyC,EAAEtqC,GAAG,CAAC,OAAO3b,GAAG,IAAK,QAAQwoG,GAAGvmG,GAAGy0C,GAAGz0C,EAAEggD,GAAE,GACnf,MAAM,IAAK,WAAWumD,GAAGvmG,GAAGkoG,GAAGloG,GAAG,MAAM,IAAK,SAAS,MAAMggD,EAAEnnD,OAAOmH,EAAEg2B,aAAa,QAAQ,GAAGqwE,GAAGrmD,EAAEnnD,QAAQ,MAAM,IAAK,SAASmH,EAAEgzH,WAAWhzE,EAAEgzE,SAAmB,OAAVjhH,EAAEiuC,EAAEnnD,OAAc6uG,GAAG1nG,IAAIggD,EAAEgzE,SAASjhH,GAAE,GAAI,MAAMiuC,EAAEwkC,cAAckjB,GAAG1nG,IAAIggD,EAAEgzE,SAAShzE,EAAEwkC,cAAa,GAAI,MAAM,QAAQ,mBAAoBnlF,EAAEohG,UAAUzgG,EAAEizH,QAAQ5R,IAAIG,GAAGzjH,EAAEiiD,KAAK/lD,EAAEwiC,OAAO,EAAE,CAAC,OAAOxiC,EAAEsoD,MAAMtoD,EAAEwiC,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,GAAGz8B,GAAG,MAAM/F,EAAEkzG,UAAUwkB,GAAG3xH,EAAE/F,EAAE+F,EAAEirH,cAAcjrE,OAAO,CAAC,GAAG,iBAAkBA,GAAG,OAAO/lD,EAAEkzG,UAAU,MAAM/1G,MAAM8I,EAAE,MAC/enC,EAAE4sH,GAAGD,GAAGjoG,SAASkoG,GAAGH,GAAG/nG,SAASmpG,GAAG3xH,IAAI+lD,EAAE/lD,EAAEkzG,UAAUpvG,EAAE9D,EAAEgxH,cAAcjrE,EAAEmiE,IAAIloH,EAAE+lD,EAAEvO,YAAY1zC,IAAI9D,EAAEwiC,OAAO,MAAKujB,GAAG,IAAIjiD,EAAE2xB,SAAS3xB,EAAEA,EAAE4yB,eAAeiG,eAAeopB,IAAKmiE,IAAIloH,EAAEA,EAAEkzG,UAAUntD,EAAE,CAAC,OAAO,KAAK,KAAK,GAA0B,OAAvByiE,EAAEnpG,IAAG0mC,EAAE/lD,EAAE40G,cAAiB,IAAa,GAAR50G,EAAEwiC,QAAiBxiC,EAAEysH,MAAM3oH,EAAE9D,IAAE+lD,EAAE,OAAOA,EAAEjiD,GAAE,EAAG,OAAOiC,OAAE,IAAS/F,EAAEgxH,cAAc8G,UAAUnG,GAAG3xH,GAAG8D,EAAE,OAAOiC,EAAE6uG,cAAiB7uD,IAAIjiD,GAAG,IAAY,EAAP9D,EAAE8pB,QAAW,OAAO/jB,IAAG,IAAK/F,EAAEgxH,cAAc+G,4BAA4B,IAAe,EAAV14G,GAAEmJ,SAAW,IAAIpJ,KAAIA,GAAE,IAAW,IAAIA,IAAG,IAAIA,KAAEA,GACrf,GAAE,OAAO00G,IAAG,IAAQ,UAAHjG,KAAe,IAAQ,UAAHqL,KAAeC,GAAGrF,GAAEsF,OAAMrzE,GAAGjiD,KAAE9D,EAAEwiC,OAAO,GAAS,MAAK,KAAK,EAAE,OAAOouF,KAAK4G,GAAGx3H,GAAG,OAAO+F,GAAGigH,GAAGhmH,EAAEkzG,UAAU4D,eAAe,KAAK,KAAK,GAAG,OAAOoV,GAAGlsH,GAAG,KAA0C,KAAK,GAA0B,GAAvBwoH,EAAEnpG,IAAwB,QAArB0mC,EAAE/lD,EAAE40G,eAA0B,OAAO,KAAsC,GAAjC98F,EAAE,IAAa,GAAR9X,EAAEwiC,OAA2B,QAAjB/iB,EAAEsmC,EAAEyyE,WAAsB,GAAG1gH,EAAE8gH,GAAG7yE,GAAE,OAAQ,CAAC,GAAG,IAAI3mC,IAAG,OAAOrZ,GAAG,IAAa,GAARA,EAAEy8B,OAAU,IAAIz8B,EAAE/F,EAAEutC,MAAM,OAAOxnC,GAAG,CAAS,GAAG,QAAX0Z,EAAEsxG,GAAGhrH,IAAe,CACjW,IADkW/F,EAAEwiC,OAAO,GAAGo2F,GAAG7yE,GAAE,GAAoB,QAAhBjuC,EAAE2H,EAAEutG,eAAuBhtH,EAAEgtH,YAAYl1G,EAAE9X,EAAEwiC,OAAO,GACnf,OAAOujB,EAAE6pE,aAAa5vH,EAAE8vH,YAAY,MAAM9vH,EAAE4vH,WAAW7pE,EAAE6pE,WAAW7pE,EAAEjiD,EAAMA,EAAE9D,EAAEutC,MAAM,OAAOzpC,GAAOiC,EAAEggD,GAANjuC,EAAEhU,GAAQ0+B,OAAO,EAAE1qB,EAAE+3G,WAAW,KAAK/3G,EAAEg4G,YAAY,KAAKh4G,EAAE83G,WAAW,KAAmB,QAAdnwG,EAAE3H,EAAE28F,YAAoB38F,EAAEu0G,WAAW,EAAEv0G,EAAE20G,MAAM1mH,EAAE+R,EAAEy1B,MAAM,KAAKz1B,EAAEk5G,cAAc,KAAKl5G,EAAE88F,cAAc,KAAK98F,EAAEk1G,YAAY,KAAKl1G,EAAEy0G,aAAa,KAAKz0G,EAAEo7F,UAAU,OAAOp7F,EAAEu0G,WAAW5sG,EAAE4sG,WAAWv0G,EAAE20G,MAAMhtG,EAAEgtG,MAAM30G,EAAEy1B,MAAM9tB,EAAE8tB,MAAMz1B,EAAEk5G,cAAcvxG,EAAEuxG,cAAcl5G,EAAE88F,cAAcn1F,EAAEm1F,cAAc98F,EAAEk1G,YAAYvtG,EAAEutG,YAAYl1G,EAAEvX,KAAKkf,EAAElf,KAAKwF,EAAE0Z,EAAE8sG,aACpfz0G,EAAEy0G,aAAa,OAAOxmH,EAAE,KAAK,CAAC0mH,MAAM1mH,EAAE0mH,MAAMD,aAAazmH,EAAEymH,eAAe1oH,EAAEA,EAAEmxG,QAA2B,OAAnBwT,EAAEppG,GAAY,EAAVA,GAAEmJ,QAAU,GAAUxoB,EAAEutC,KAAK,CAACxnC,EAAEA,EAAEkvG,OAAO,CAAC,OAAOlvD,EAAE+T,MAAMnjD,KAAI0iH,KAAKr5H,EAAEwiC,OAAO,GAAG1qB,GAAE,EAAG8gH,GAAG7yE,GAAE,GAAI/lD,EAAEysH,MAAM,SAAS,KAAK,CAAC,IAAI30G,EAAE,GAAW,QAAR/R,EAAEgrH,GAAGtxG,KAAa,GAAGzf,EAAEwiC,OAAO,GAAG1qB,GAAE,EAAmB,QAAhBhU,EAAEiC,EAAEinH,eAAuBhtH,EAAEgtH,YAAYlpH,EAAE9D,EAAEwiC,OAAO,GAAGo2F,GAAG7yE,GAAE,GAAI,OAAOA,EAAE+T,MAAM,WAAW/T,EAAE2yE,WAAWj5G,EAAEg1F,YAAY2c,GAAG,OAAmC,QAA5BpxH,EAAEA,EAAE4vH,WAAW7pE,EAAE6pE,cAAsB5vH,EAAE6vH,WAAW,MAAM,UAAU,EAAEl5G,KAAIovC,EAAE0yE,mBAAmBY,IAAI,aAAav1H,IAAI9D,EAAEwiC,OACjf,GAAG1qB,GAAE,EAAG8gH,GAAG7yE,GAAE,GAAI/lD,EAAEysH,MAAM,UAAU1mE,EAAEwyE,aAAa94G,EAAEw1F,QAAQj1G,EAAEutC,MAAMvtC,EAAEutC,MAAM9tB,IAAa,QAAT3b,EAAEiiD,EAAEr8C,MAAc5F,EAAEmxG,QAAQx1F,EAAEzf,EAAEutC,MAAM9tB,EAAEsmC,EAAEr8C,KAAK+V,EAAE,CAAC,OAAO,OAAOsmC,EAAE+T,MAAMh2D,EAAEiiD,EAAE+T,KAAK/T,EAAEyyE,UAAU10H,EAAEiiD,EAAE+T,KAAKh2D,EAAEmxG,QAAQlvD,EAAE6pE,WAAW5vH,EAAE4vH,WAAW7pE,EAAE0yE,mBAAmB9hH,KAAI7S,EAAEmxG,QAAQ,KAAKj1G,EAAEqf,GAAEmJ,QAAQigG,EAAEppG,GAAEvH,EAAI,EAAF9X,EAAI,EAAI,EAAFA,GAAK8D,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,OAAOw1H,KAAK,OAAOvzH,GAAG,OAAOA,EAAE6uG,gBAAiB,OAAO50G,EAAE40G,gBAAgB,kCAAkC7uD,EAAEj8B,OAAO9pB,EAAEwiC,OAAO,GAAG,KAAK,MAAMrlC,MAAM8I,EAAE,IAAIjG,EAAEoX,KAAM,CACtd,SAASmiH,GAAGxzH,GAAG,OAAOA,EAAEqR,KAAK,KAAK,EAAE6xG,GAAGljH,EAAExF,OAAO2oH,KAAK,IAAIlpH,EAAE+F,EAAEy8B,MAAM,OAAS,KAAFxiC,GAAQ+F,EAAEy8B,OAAS,KAAHxiC,EAAQ,GAAG+F,GAAG,KAAK,KAAK,EAAgC,GAA9B6qH,KAAKpI,EAAEI,IAAGJ,EAAEG,IAAGmJ,KAAkB,IAAO,IAApB9xH,EAAE+F,EAAEy8B,QAAoB,MAAMrlC,MAAM8I,EAAE,MAAyB,OAAnBF,EAAEy8B,OAAS,KAAHxiC,EAAQ,GAAU+F,EAAE,KAAK,EAAE,OAAO+qH,GAAG/qH,GAAG,KAAK,KAAK,GAAG,OAAOyiH,EAAEnpG,IAAe,MAAZrf,EAAE+F,EAAEy8B,QAAcz8B,EAAEy8B,OAAS,KAAHxiC,EAAQ,GAAG+F,GAAG,KAAK,KAAK,GAAG,OAAOyiH,EAAEnpG,IAAG,KAAK,KAAK,EAAE,OAAOuxG,KAAK,KAAK,KAAK,GAAG,OAAO1E,GAAGnmH,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,OAAOuzH,KAAK,KAAK,QAAQ,OAAO,KAAK,CAC1a,SAASE,GAAGzzH,EAAE/F,GAAG,IAAI,IAAI8D,EAAE,GAAGiiD,EAAE/lD,EAAE,GAAG8D,GAAGgoG,GAAG/lD,GAAGA,EAAEA,EAAE2uD,aAAa3uD,GAAG,IAAI3gD,EAAEtB,CAAC,CAAC,MAAMgU,GAAG1S,EAAE,6BAA6B0S,EAAEtK,QAAQ,KAAKsK,EAAEvK,KAAK,CAAC,MAAM,CAAC3O,MAAMmH,EAAE4R,OAAO3X,EAAEuN,MAAMnI,EAAE,CAAC,SAASq0H,GAAG1zH,EAAE/F,GAAG,IAAIqF,QAAQC,MAAMtF,EAAEpB,MAAM,CAAC,MAAMkF,GAAG2lE,YAAW,WAAW,MAAM3lE,CAAE,GAAE,CAAC,CAlBhQyzH,GAAG,SAASxxH,EAAE/F,GAAG,IAAI,IAAI8D,EAAE9D,EAAEutC,MAAM,OAAOzpC,GAAG,CAAC,GAAG,IAAIA,EAAEsT,KAAK,IAAItT,EAAEsT,IAAIrR,EAAEwO,YAAYzQ,EAAEovG,gBAAgB,GAAG,IAAIpvG,EAAEsT,KAAK,OAAOtT,EAAEypC,MAAM,CAACzpC,EAAEypC,MAAMmnE,OAAO5wG,EAAEA,EAAEA,EAAEypC,MAAM,QAAQ,CAAC,GAAGzpC,IAAI9D,EAAE,MAAM,KAAK,OAAO8D,EAAEmxG,SAAS,CAAC,GAAG,OAAOnxG,EAAE4wG,QAAQ5wG,EAAE4wG,SAAS10G,EAAE,OAAO8D,EAAEA,EAAE4wG,MAAM,CAAC5wG,EAAEmxG,QAAQP,OAAO5wG,EAAE4wG,OAAO5wG,EAAEA,EAAEmxG,OAAO,CAAC,EAAEuiB,GAAG,WAAW,EACxTC,GAAG,SAAS1xH,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEW,EAAEirH,cAAc,GAAG5rH,IAAI2gD,EAAE,CAAChgD,EAAE/F,EAAEkzG,UAAUwd,GAAGH,GAAG/nG,SAAS,IAAyU/I,EAArU3H,EAAE,KAAK,OAAOhU,GAAG,IAAK,QAAQsB,EAAE0nG,GAAG/mG,EAAEX,GAAG2gD,EAAE+mD,GAAG/mG,EAAEggD,GAAGjuC,EAAE,GAAG,MAAM,IAAK,SAAS1S,EAAEmoG,GAAGxnG,EAAEX,GAAG2gD,EAAEwnD,GAAGxnG,EAAEggD,GAAGjuC,EAAE,GAAG,MAAM,IAAK,SAAS1S,EAAEtD,EAAE,CAAC,EAAEsD,EAAE,CAACxG,WAAM,IAASmnD,EAAEjkD,EAAE,CAAC,EAAEikD,EAAE,CAACnnD,WAAM,IAASkZ,EAAE,GAAG,MAAM,IAAK,WAAW1S,EAAEyoG,GAAG9nG,EAAEX,GAAG2gD,EAAE8nD,GAAG9nG,EAAEggD,GAAGjuC,EAAE,GAAG,MAAM,QAAQ,mBAAoB1S,EAAEohG,SAAS,mBAAoBzgD,EAAEygD,UAAUzgG,EAAEizH,QAAQ5R,IAAyB,IAAIr0F,KAAzBy/E,GAAG1uG,EAAEiiD,GAASjiD,EAAE,KAAcsB,EAAE,IAAI2gD,EAAE71C,eAAe6iB,IAAI3tB,EAAE8K,eAAe6iB,IAAI,MAAM3tB,EAAE2tB,GAAG,GAAG,UAC3eA,EAAE,CAAC,IAAI28B,EAAEtqD,EAAE2tB,GAAG,IAAItT,KAAKiwC,EAAEA,EAAEx/C,eAAeuP,KAAK3b,IAAIA,EAAE,CAAC,GAAGA,EAAE2b,GAAG,GAAG,KAAK,4BAA4BsT,GAAG,aAAaA,GAAG,mCAAmCA,GAAG,6BAA6BA,GAAG,cAAcA,IAAI+1E,EAAG54F,eAAe6iB,GAAGjb,IAAIA,EAAE,KAAKA,EAAEA,GAAG,IAAIlb,KAAKm2B,EAAE,OAAO,IAAIA,KAAKgzB,EAAE,CAAC,IAAIgE,EAAEhE,EAAEhzB,GAAyB,GAAtB28B,EAAE,MAAMtqD,EAAEA,EAAE2tB,QAAG,EAAUgzB,EAAE71C,eAAe6iB,IAAIg3B,IAAI2F,IAAI,MAAM3F,GAAG,MAAM2F,GAAG,GAAG,UAAU38B,EAAE,GAAG28B,EAAE,CAAC,IAAIjwC,KAAKiwC,GAAGA,EAAEx/C,eAAeuP,IAAIsqC,GAAGA,EAAE75C,eAAeuP,KAAK3b,IAAIA,EAAE,CAAC,GAAGA,EAAE2b,GAAG,IAAI,IAAIA,KAAKsqC,EAAEA,EAAE75C,eAAeuP,IAAIiwC,EAAEjwC,KAAKsqC,EAAEtqC,KAAK3b,IAClfA,EAAE,CAAC,GAAGA,EAAE2b,GAAGsqC,EAAEtqC,GAAG,MAAM3b,IAAIgU,IAAIA,EAAE,IAAIA,EAAElb,KAAKm2B,EAAEjvB,IAAIA,EAAEimD,MAAM,4BAA4Bh3B,GAAGg3B,EAAEA,EAAEA,EAAE29D,YAAO,EAAOh4D,EAAEA,EAAEA,EAAEg4D,YAAO,EAAO,MAAM39D,GAAG2F,IAAI3F,IAAIjyC,EAAEA,GAAG,IAAIlb,KAAKm2B,EAAEg3B,IAAI,aAAah3B,EAAE,iBAAkBg3B,GAAG,iBAAkBA,IAAIjyC,EAAEA,GAAG,IAAIlb,KAAKm2B,EAAE,GAAGg3B,GAAG,mCAAmCh3B,GAAG,6BAA6BA,IAAI+1E,EAAG54F,eAAe6iB,IAAI,MAAMg3B,GAAG,aAAah3B,GAAG6yF,EAAE,SAAS7/G,GAAG+R,GAAG43C,IAAI3F,IAAIjyC,EAAE,KAAK,iBAAkBiyC,GAAG,OAAOA,GAAGA,EAAEp6B,WAAWy7E,GAAGrhD,EAAEjpD,YAAYgX,EAAEA,GAAG,IAAIlb,KAAKm2B,EAAEg3B,GAAG,CAACjmD,IAAIgU,EAAEA,GAAG,IAAIlb,KAAK,QAC/ekH,GAAG,IAAIivB,EAAEjb,GAAK9X,EAAEgtH,YAAYj6F,KAAE/yB,EAAEwiC,OAAO,EAAC,CAAC,EAAEk1F,GAAG,SAAS3xH,EAAE/F,EAAE8D,EAAEiiD,GAAGjiD,IAAIiiD,IAAI/lD,EAAEwiC,OAAO,EAAE,EAc8K,IAAIk3F,GAAG,mBAAoBn5G,QAAQA,QAAQ+oB,IAAI,SAASqwF,GAAG5zH,EAAE/F,EAAE8D,IAAGA,EAAEypH,IAAI,EAAEzpH,IAAKsT,IAAI,EAAEtT,EAAE8tF,QAAQ,CAACzhE,QAAQ,MAAM,IAAI41B,EAAE/lD,EAAEpB,MAAsD,OAAhDkF,EAAE64E,SAAS,WAAWi9C,KAAKA,IAAG,EAAGC,GAAG9zE,GAAG0zE,GAAG1zH,EAAE/F,EAAE,EAAS8D,CAAC,CACrb,SAASg2H,GAAG/zH,EAAE/F,EAAE8D,IAAGA,EAAEypH,IAAI,EAAEzpH,IAAKsT,IAAI,EAAE,IAAI2uC,EAAEhgD,EAAExF,KAAK6jD,yBAAyB,GAAG,mBAAoB2B,EAAE,CAAC,IAAI3gD,EAAEpF,EAAEpB,MAAMkF,EAAE8tF,QAAQ,WAAmB,OAAR6nC,GAAG1zH,EAAE/F,GAAU+lD,EAAE3gD,EAAE,CAAC,CAAC,IAAI0S,EAAE/R,EAAEmtG,UAA8O,OAApO,OAAOp7F,GAAG,mBAAoBA,EAAEiiH,oBAAoBj2H,EAAE64E,SAAS,WAAW,mBAAoB52B,IAAI,OAAOi0E,GAAGA,GAAG,IAAIxwF,IAAI,CAAC1vC,OAAOkgI,GAAGv5F,IAAI3mC,MAAM2/H,GAAG1zH,EAAE/F,IAAI,IAAI8D,EAAE9D,EAAEuN,MAAMzT,KAAKigI,kBAAkB/5H,EAAEpB,MAAM,CAACq7H,eAAe,OAAOn2H,EAAEA,EAAE,IAAI,GAAUA,CAAC,CAAC,IAAIo2H,GAAG,mBAAoBrwF,QAAQA,QAAQL,IACxc,SAAS2wF,GAAGp0H,GAAG,IAAI/F,EAAE+F,EAAEuiD,IAAI,GAAG,OAAOtoD,EAAE,GAAG,mBAAoBA,EAAE,IAAIA,EAAE,KAAK,CAAC,MAAM8D,GAAGs2H,GAAGr0H,EAAEjC,EAAE,MAAM9D,EAAEwoB,QAAQ,IAAI,CAAC,SAAS6xG,GAAGt0H,EAAE/F,GAAG,OAAOA,EAAEoX,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAA8Q,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAjS,KAAK,EAAE,GAAW,IAARpX,EAAEwiC,OAAW,OAAOz8B,EAAE,CAAC,IAAIjC,EAAEiC,EAAEirH,cAAcjrE,EAAEhgD,EAAE6uG,cAA4B50G,GAAd+F,EAAE/F,EAAEkzG,WAAcgc,wBAAwBlvH,EAAEk7F,cAAcl7F,EAAEO,KAAKuD,EAAE8nH,GAAG5rH,EAAEO,KAAKuD,GAAGiiD,GAAGhgD,EAAEu0H,oCAAoCt6H,CAAC,CAAC,OAAO,KAAK,EAA6C,YAAnC,IAARA,EAAEwiC,OAAWolF,GAAG5nH,EAAEkzG,UAAU4D,gBAA0D,MAAM35G,MAAM8I,EAAE,KAAM,CAClf,SAASs0H,GAAGx0H,EAAE/F,EAAE8D,GAAG,OAAOA,EAAEsT,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAgD,GAAG,QAAhCpX,EAAE,QAAlBA,EAAE8D,EAAEkpH,aAAuBhtH,EAAE4vH,WAAW,MAAiB,CAAC7pH,EAAE/F,EAAEA,EAAEoiB,KAAK,EAAE,CAAC,GAAG,IAAW,EAANrc,EAAEqR,KAAO,CAAC,IAAI2uC,EAAEhgD,EAAEkd,OAAOld,EAAEyuH,QAAQzuE,GAAG,CAAChgD,EAAEA,EAAEqc,IAAI,OAAOrc,IAAI/F,EAAE,CAA8C,GAAG,QAAhCA,EAAE,QAAlBA,EAAE8D,EAAEkpH,aAAuBhtH,EAAE4vH,WAAW,MAAiB,CAAC7pH,EAAE/F,EAAEA,EAAEoiB,KAAK,EAAE,CAAC,IAAIhd,EAAEW,EAAEggD,EAAE3gD,EAAEgd,KAAa,IAAO,GAAfhd,EAAEA,EAAEgS,OAAe,IAAO,EAAFhS,KAAOo1H,GAAG12H,EAAEiC,GAAG00H,GAAG32H,EAAEiC,IAAIA,EAAEggD,CAAC,OAAOhgD,IAAI/F,EAAE,CAAC,OAAO,KAAK,EACtR,OADwR+F,EAAEjC,EAAEovG,UAAkB,EAARpvG,EAAE0+B,QAAU,OAAOxiC,EAAE+F,EAAEspH,qBAAqBtpE,EAAEjiD,EAAEo3F,cAAcp3F,EAAEvD,KAAKP,EAAEgxH,cAAcpF,GAAG9nH,EAAEvD,KAAKP,EAAEgxH,eAAejrH,EAAEiiG,mBAAmBjiD,EACxgB/lD,EAAE40G,cAAc7uG,EAAEu0H,4CAAuD,QAAhBt6H,EAAE8D,EAAEkpH,cAAsBc,GAAGhqH,EAAE9D,EAAE+F,IAAU,KAAK,EAAkB,GAAG,QAAnB/F,EAAE8D,EAAEkpH,aAAwB,CAAQ,GAAPjnH,EAAE,KAAQ,OAAOjC,EAAEypC,MAAM,OAAOzpC,EAAEypC,MAAMn2B,KAAK,KAAK,EAA4B,KAAK,EAAErR,EAAEjC,EAAEypC,MAAM2lE,UAAU4a,GAAGhqH,EAAE9D,EAAE+F,EAAE,CAAC,OAAO,KAAK,EAA2E,OAAzEA,EAAEjC,EAAEovG,eAAU,OAAOlzG,GAAW,EAAR8D,EAAE0+B,OAAS+kF,GAAGzjH,EAAEvD,KAAKuD,EAAEktH,gBAAgBjrH,EAAE20H,SAAe,KAAK,EAAS,KAAK,EAAS,KAAK,GACnX,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAD6U,KAAK,GACzY,YAD4Y,OAAO52H,EAAE8wG,gBAAgB9wG,EAAEA,EAAE2wG,UAAU,OAAO3wG,IAAIA,EAAEA,EAAE8wG,cAAc,OAAO9wG,IAAIA,EAAEA,EAAE+wG,WAAW,OAAO/wG,GAAGwzG,GAAGxzG,OACzb,MAAM3G,MAAM8I,EAAE,KAAM,CAClF,SAAS00H,GAAG50H,EAAE/F,GAAG,IAAI,IAAI8D,EAAEiC,IAAI,CAAC,GAAG,IAAIjC,EAAEsT,IAAI,CAAC,IAAI2uC,EAAEjiD,EAAEovG,UAAU,GAAGlzG,EAAY,mBAAV+lD,EAAEA,EAAE7yC,OAA4Bw+F,YAAY3rD,EAAE2rD,YAAY,UAAU,OAAO,aAAa3rD,EAAEp+B,QAAQ,WAAW,CAACo+B,EAAEjiD,EAAEovG,UAAU,IAAI9tG,EAAEtB,EAAEktH,cAAc99G,MAAM9N,EAAE,MAASA,GAAaA,EAAE8K,eAAe,WAAW9K,EAAEuiB,QAAQ,KAAKo+B,EAAE7yC,MAAMyU,QAAQ6pF,GAAG,UAAUpsG,EAAE,CAAC,MAAM,GAAG,IAAItB,EAAEsT,IAAItT,EAAEovG,UAAU17D,UAAUx3C,EAAE,GAAG8D,EAAEktH,mBAAmB,IAAI,KAAKltH,EAAEsT,KAAK,KAAKtT,EAAEsT,KAAK,OAAOtT,EAAE8wG,eAAe9wG,IAAIiC,IAAI,OAAOjC,EAAEypC,MAAM,CAACzpC,EAAEypC,MAAMmnE,OAAO5wG,EAAEA,EAAEA,EAAEypC,MAAM,QAAQ,CAAC,GAAGzpC,IACtfiC,EAAE,MAAM,KAAK,OAAOjC,EAAEmxG,SAAS,CAAC,GAAG,OAAOnxG,EAAE4wG,QAAQ5wG,EAAE4wG,SAAS3uG,EAAE,OAAOjC,EAAEA,EAAE4wG,MAAM,CAAC5wG,EAAEmxG,QAAQP,OAAO5wG,EAAE4wG,OAAO5wG,EAAEA,EAAEmxG,OAAO,CAAC,CACzH,SAAS2lB,GAAG70H,EAAE/F,GAAG,GAAG0pH,IAAI,mBAAoBA,GAAGmR,qBAAqB,IAAInR,GAAGmR,qBAAqBpR,GAAGzpH,EAAE,CAAC,MAAM8X,GAAG,CAAC,OAAO9X,EAAEoX,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAmB,GAAG,QAAnBrR,EAAE/F,EAAEgtH,cAAyC,QAAfjnH,EAAEA,EAAE6pH,YAAqB,CAAC,IAAI9rH,EAAEiC,EAAEA,EAAEqc,KAAK,EAAE,CAAC,IAAI2jC,EAAEjiD,EAAEsB,EAAE2gD,EAAEyuE,QAAgB,GAARzuE,EAAEA,EAAE3uC,SAAO,IAAShS,EAAE,GAAG,IAAO,EAAF2gD,GAAKy0E,GAAGx6H,EAAE8D,OAAO,CAACiiD,EAAE/lD,EAAE,IAAIoF,GAAG,CAAC,MAAM0S,GAAGsiH,GAAGr0E,EAAEjuC,EAAE,CAAC,CAAChU,EAAEA,EAAEse,IAAI,OAAOte,IAAIiC,EAAE,CAAC,MAAM,KAAK,EAAsB,GAApBo0H,GAAGn6H,GAAoB,mBAAjB+F,EAAE/F,EAAEkzG,WAAmC9K,qBAAqB,IAAIriG,EAAEkiB,MAAMjoB,EAAEgxH,cAAcjrH,EAAEya,MAAMxgB,EAAE40G,cAAc7uG,EAAEqiG,sBAAsB,CAAC,MAAMtwF,GAAGsiH,GAAGp6H,EAC/gB8X,EAAE,CAAC,MAAM,KAAK,EAAEqiH,GAAGn6H,GAAG,MAAM,KAAK,EAAE86H,GAAG/0H,EAAE/F,GAAG,CAAC,SAAS+6H,GAAGh1H,GAAGA,EAAE0uG,UAAU,KAAK1uG,EAAEwnC,MAAM,KAAKxnC,EAAEwmH,aAAa,KAAKxmH,EAAE+pH,YAAY,KAAK/pH,EAAE6pH,WAAW,KAAK7pH,EAAEirH,cAAc,KAAKjrH,EAAE6uG,cAAc,KAAK7uG,EAAEyrH,aAAa,KAAKzrH,EAAE2uG,OAAO,KAAK3uG,EAAEinH,YAAY,IAAI,CAAC,SAASgO,GAAGj1H,GAAG,OAAO,IAAIA,EAAEqR,KAAK,IAAIrR,EAAEqR,KAAK,IAAIrR,EAAEqR,GAAG,CACtS,SAAS6jH,GAAGl1H,GAAGA,EAAE,CAAC,IAAI,IAAI/F,EAAE+F,EAAE2uG,OAAO,OAAO10G,GAAG,CAAC,GAAGg7H,GAAGh7H,GAAG,MAAM+F,EAAE/F,EAAEA,EAAE00G,MAAM,CAAC,MAAMv3G,MAAM8I,EAAE,KAAM,CAAC,IAAInC,EAAE9D,EAAgB,OAAdA,EAAE8D,EAAEovG,UAAiBpvG,EAAEsT,KAAK,KAAK,EAAE,IAAI2uC,GAAE,EAAG,MAAM,KAAK,EAA+B,KAAK,EAAE/lD,EAAEA,EAAE82G,cAAc/wD,GAAE,EAAG,MAAM,QAAQ,MAAM5oD,MAAM8I,EAAE,MAAe,GAARnC,EAAE0+B,QAAWksE,GAAG1uG,EAAE,IAAI8D,EAAE0+B,QAAQ,IAAIz8B,EAAE/F,EAAE,IAAI8D,EAAEiC,IAAI,CAAC,KAAK,OAAOjC,EAAEmxG,SAAS,CAAC,GAAG,OAAOnxG,EAAE4wG,QAAQsmB,GAAGl3H,EAAE4wG,QAAQ,CAAC5wG,EAAE,KAAK,MAAMiC,CAAC,CAACjC,EAAEA,EAAE4wG,MAAM,CAA2B,IAA1B5wG,EAAEmxG,QAAQP,OAAO5wG,EAAE4wG,OAAW5wG,EAAEA,EAAEmxG,QAAQ,IAAInxG,EAAEsT,KAAK,IAAItT,EAAEsT,KAAK,KAAKtT,EAAEsT,KAAK,CAAC,GAAW,EAARtT,EAAE0+B,MAAQ,SAASxiC,EAAE,GAAG,OAC/e8D,EAAEypC,OAAO,IAAIzpC,EAAEsT,IAAI,SAASpX,EAAO8D,EAAEypC,MAAMmnE,OAAO5wG,EAAEA,EAAEA,EAAEypC,KAAK,CAAC,KAAa,EAARzpC,EAAE0+B,OAAS,CAAC1+B,EAAEA,EAAEovG,UAAU,MAAMntG,CAAC,CAAC,CAACggD,EAAEm1E,GAAGn1H,EAAEjC,EAAE9D,GAAGm7H,GAAGp1H,EAAEjC,EAAE9D,EAAE,CAC3H,SAASk7H,GAAGn1H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAEqR,IAAIhS,EAAE,IAAI2gD,GAAG,IAAIA,EAAE,GAAG3gD,EAAEW,EAAEX,EAAEW,EAAEmtG,UAAUntG,EAAEmtG,UAAUhN,SAASlmG,EAAE,IAAI8D,EAAE2xB,SAAS3xB,EAAE23B,WAAWiB,aAAa32B,EAAE/F,GAAG8D,EAAE44B,aAAa32B,EAAE/F,IAAI,IAAI8D,EAAE2xB,UAAUz1B,EAAE8D,EAAE23B,YAAaiB,aAAa32B,EAAEjC,IAAK9D,EAAE8D,GAAIyQ,YAAYxO,GAA4B,OAAxBjC,EAAEA,EAAEs3H,sBAA0C,OAAOp7H,EAAEg5H,UAAUh5H,EAAEg5H,QAAQ5R,UAAU,GAAG,IAAIrhE,GAAc,QAAVhgD,EAAEA,EAAEwnC,OAAgB,IAAI2tF,GAAGn1H,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEkvG,QAAQ,OAAOlvG,GAAGm1H,GAAGn1H,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEkvG,OAAO,CACrZ,SAASkmB,GAAGp1H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAEqR,IAAIhS,EAAE,IAAI2gD,GAAG,IAAIA,EAAE,GAAG3gD,EAAEW,EAAEX,EAAEW,EAAEmtG,UAAUntG,EAAEmtG,UAAUhN,SAASlmG,EAAE8D,EAAE44B,aAAa32B,EAAE/F,GAAG8D,EAAEyQ,YAAYxO,QAAQ,GAAG,IAAIggD,GAAc,QAAVhgD,EAAEA,EAAEwnC,OAAgB,IAAI4tF,GAAGp1H,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEkvG,QAAQ,OAAOlvG,GAAGo1H,GAAGp1H,EAAE/F,EAAE8D,GAAGiC,EAAEA,EAAEkvG,OAAO,CAC5N,SAAS6lB,GAAG/0H,EAAE/F,GAAG,IAAI,IAAaoF,EAAE0S,EAAXhU,EAAE9D,EAAE+lD,GAAE,IAAS,CAAC,IAAIA,EAAE,CAACA,EAAEjiD,EAAE4wG,OAAO3uG,EAAE,OAAO,CAAC,GAAG,OAAOggD,EAAE,MAAM5oD,MAAM8I,EAAE,MAAoB,OAAdb,EAAE2gD,EAAEmtD,UAAiBntD,EAAE3uC,KAAK,KAAK,EAAEU,GAAE,EAAG,MAAM/R,EAAE,KAAK,EAAiC,KAAK,EAAEX,EAAEA,EAAE0xG,cAAch/F,GAAE,EAAG,MAAM/R,EAAEggD,EAAEA,EAAE2uD,MAAM,CAAC3uD,GAAE,CAAE,CAAC,GAAG,IAAIjiD,EAAEsT,KAAK,IAAItT,EAAEsT,IAAI,CAACrR,EAAE,IAAI,IAAI0Z,EAAE1Z,EAAE2pD,EAAE5rD,EAAEimD,EAAE2F,IAAI,GAAGkrE,GAAGn7G,EAAEsqC,GAAG,OAAOA,EAAExc,OAAO,IAAIwc,EAAE3yC,IAAI2yC,EAAExc,MAAMmnE,OAAO3qD,EAAEA,EAAEA,EAAExc,UAAU,CAAC,GAAGwc,IAAI2F,EAAE,MAAM3pD,EAAE,KAAK,OAAOgkD,EAAEkrD,SAAS,CAAC,GAAG,OAAOlrD,EAAE2qD,QAAQ3qD,EAAE2qD,SAAShlD,EAAE,MAAM3pD,EAAEgkD,EAAEA,EAAE2qD,MAAM,CAAC3qD,EAAEkrD,QAAQP,OAAO3qD,EAAE2qD,OAAO3qD,EAAEA,EAAEkrD,OAAO,CAACn9F,GAAG2H,EAAEra,EAAEsqD,EAAE5rD,EAAEovG,UACrf,IAAIzzF,EAAEgW,SAAShW,EAAEgc,WAAWvmB,YAAYw6C,GAAGjwC,EAAEvK,YAAYw6C,IAAItqD,EAAE8P,YAAYpR,EAAEovG,UAAU,MAAM,GAAG,IAAIpvG,EAAEsT,KAAK,GAAG,OAAOtT,EAAEypC,MAAM,CAACnoC,EAAEtB,EAAEovG,UAAU4D,cAAch/F,GAAE,EAAGhU,EAAEypC,MAAMmnE,OAAO5wG,EAAEA,EAAEA,EAAEypC,MAAM,QAAQ,OAAO,GAAGqtF,GAAG70H,EAAEjC,GAAG,OAAOA,EAAEypC,MAAM,CAACzpC,EAAEypC,MAAMmnE,OAAO5wG,EAAEA,EAAEA,EAAEypC,MAAM,QAAQ,CAAC,GAAGzpC,IAAI9D,EAAE,MAAM,KAAK,OAAO8D,EAAEmxG,SAAS,CAAC,GAAG,OAAOnxG,EAAE4wG,QAAQ5wG,EAAE4wG,SAAS10G,EAAE,OAAkB,KAAX8D,EAAEA,EAAE4wG,QAAat9F,MAAM2uC,GAAE,EAAG,CAACjiD,EAAEmxG,QAAQP,OAAO5wG,EAAE4wG,OAAO5wG,EAAEA,EAAEmxG,OAAO,CAAC,CAC1Z,SAASomB,GAAGt1H,EAAE/F,GAAG,OAAOA,EAAEoX,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAItT,EAAE9D,EAAEgtH,YAAyC,GAAG,QAAhClpH,EAAE,OAAOA,EAAEA,EAAE8rH,WAAW,MAAiB,CAAC,IAAI7pE,EAAEjiD,EAAEA,EAAEse,KAAK,GAAG,IAAW,EAAN2jC,EAAE3uC,OAASrR,EAAEggD,EAAEyuE,QAAQzuE,EAAEyuE,aAAQ,OAAO,IAASzuH,GAAGA,KAAKggD,EAAEA,EAAE3jC,WAAW2jC,IAAIjiD,EAAE,CAAC,OAAO,KAAK,EAErJ,KAAK,GAAoG,KAAK,GAAG,OAF6C,KAAK,EAAgB,GAAG,OAAjBA,EAAE9D,EAAEkzG,WAAqB,CAACntD,EAAE/lD,EAAEgxH,cAAc,IAAI5rH,EAAE,OAAOW,EAAEA,EAAEirH,cAAcjrE,EAAEhgD,EAAE/F,EAAEO,KAAK,IAAIuX,EAAE9X,EAAEgtH,YAA+B,GAAnBhtH,EAAEgtH,YAAY,KAAQ,OAAOl1G,EAAE,CAAgF,IAA/EhU,EAAEqkH,IAAIpiE,EAAE,UAAUhgD,GAAG,UAAUggD,EAAExlD,MAAM,MAAMwlD,EAAEz4C,MAAM8/F,GAAGtpG,EAAEiiD,GAAG0sD,GAAG1sG,EAAEX,GAAGpF,EAAEyyG,GAAG1sG,EAAEggD,GAAO3gD,EAAE,EAAEA,EAAE0S,EAAEvb,OAAO6I,GAClf,EAAE,CAAC,IAAIqa,EAAE3H,EAAE1S,GAAGsqD,EAAE53C,EAAE1S,EAAE,GAAG,UAAUqa,EAAEgyF,GAAG3tG,EAAE4rD,GAAG,4BAA4BjwC,EAAE8uF,GAAGzqG,EAAE4rD,GAAG,aAAajwC,EAAEivF,GAAG5qG,EAAE4rD,GAAGs6C,GAAGlmG,EAAE2b,EAAEiwC,EAAE1vD,EAAE,CAAC,OAAO+F,GAAG,IAAK,QAAQsnG,GAAGvpG,EAAEiiD,GAAG,MAAM,IAAK,WAAWioD,GAAGlqG,EAAEiiD,GAAG,MAAM,IAAK,SAAShgD,EAAEjC,EAAEkpG,cAAc8rB,YAAYh1H,EAAEkpG,cAAc8rB,cAAc/yE,EAAEgzE,SAAmB,OAAVjhH,EAAEiuC,EAAEnnD,OAAc6uG,GAAG3pG,IAAIiiD,EAAEgzE,SAASjhH,GAAE,GAAI/R,MAAMggD,EAAEgzE,WAAW,MAAMhzE,EAAEwkC,aAAakjB,GAAG3pG,IAAIiiD,EAAEgzE,SAAShzE,EAAEwkC,cAAa,GAAIkjB,GAAG3pG,IAAIiiD,EAAEgzE,SAAShzE,EAAEgzE,SAAS,GAAG,IAAG,IAAK,CAAC,CAAC,OAAO,KAAK,EAAE,GAAG,OAAO/4H,EAAEkzG,UAAU,MAAM/1G,MAAM8I,EAAE,MAC/c,YADqdjG,EAAEkzG,UAAU17D,UACjfx3C,EAAEgxH,eAAqB,KAAK,EAA8D,aAA5DltH,EAAE9D,EAAEkzG,WAAY2D,UAAU/yG,EAAE+yG,SAAQ,EAAGS,GAAGxzG,EAAEgzG,iBAAsC,KAAK,GAAyD,OAAtD,OAAO92G,EAAE40G,gBAAgB0mB,GAAG3kH,KAAIgkH,GAAG36H,EAAEutC,OAAM,SAAKguF,GAAGv7H,GAAU,KAAK,GAAS,YAANu7H,GAAGv7H,GAAyB,KAAK,GAAG,KAAK,GAAgC,YAA7B26H,GAAG36H,EAAE,OAAOA,EAAE40G,eAAsB,MAAMz3G,MAAM8I,EAAE,KAAM,CAAC,SAASs1H,GAAGx1H,GAAG,IAAI/F,EAAE+F,EAAEinH,YAAY,GAAG,OAAOhtH,EAAE,CAAC+F,EAAEinH,YAAY,KAAK,IAAIlpH,EAAEiC,EAAEmtG,UAAU,OAAOpvG,IAAIA,EAAEiC,EAAEmtG,UAAU,IAAIgnB,IAAIl6H,EAAEgmB,SAAQ,SAAShmB,GAAG,IAAI+lD,EAAEy1E,GAAGjsH,KAAK,KAAKxJ,EAAE/F,GAAG8D,EAAEmc,IAAIjgB,KAAK8D,EAAE28B,IAAIzgC,GAAGA,EAAEy7H,KAAK11E,EAAEA,GAAG,GAAE,CAAC,CACze,SAAS21E,GAAG31H,EAAE/F,GAAG,OAAO,OAAO+F,IAAsB,QAAlBA,EAAEA,EAAE6uG,gBAAwB,OAAO7uG,EAAE8uG,cAA+B,QAAlB70G,EAAEA,EAAE40G,gBAAwB,OAAO50G,EAAE60G,WAAc,CAAC,IAAI8mB,GAAG13H,KAAKohB,KAAKu2G,GAAGvxB,GAAG4nB,uBAAuB4J,GAAGxxB,GAAGksB,kBAAkBuF,GAAE,EAAEhI,GAAE,KAAKiI,GAAE,KAAK3C,GAAE,EAAE4C,GAAG,EAAEC,GAAG1T,GAAG,GAAGnpG,GAAE,EAAE88G,GAAG,KAAKC,GAAG,EAAEtO,GAAG,EAAEqL,GAAG,EAAEkD,GAAG,EAAEC,GAAG,KAAKf,GAAG,EAAEjC,GAAG/qH,IAAS,SAASguH,KAAKjD,GAAG1iH,KAAI,GAAG,CAAC,IA8BsF4lH,GA9BlFC,GAAE,KAAK5C,IAAG,EAAGC,GAAG,KAAKG,GAAG,KAAKyC,IAAG,EAAGC,GAAG,KAAKC,GAAG,GAAGC,GAAG,GAAGC,GAAG,GAAGC,GAAG,KAAKC,GAAG,EAAEC,GAAG,KAAKC,IAAI,EAAEC,GAAG,EAAEC,GAAG,EAAEC,GAAG,KAAKC,IAAG,EAAG,SAAShP,KAAK,OAAO,IAAO,GAAFyN,IAAMnlH,MAAK,IAAIsmH,GAAGA,GAAGA,GAAGtmH,IAAG,CAC9e,SAAS23G,GAAGvoH,GAAY,GAAG,IAAO,GAAnBA,EAAEA,EAAE+jB,OAAkB,OAAO,EAAE,GAAG,IAAO,EAAF/jB,GAAK,OAAO,KAAKqlH,KAAK,EAAE,EAAkB,GAAhB,IAAI8R,KAAKA,GAAGf,IAAO,IAAIzQ,GAAGzT,WAAW,CAAC,IAAIklB,KAAKA,GAAG,OAAOd,GAAGA,GAAGvjB,aAAa,GAAG/yG,EAAEm3H,GAAG,IAAIl9H,EAAE,SAASm9H,GAAsD,OAA7C,KAANn9H,IAAIA,KAA8B,KAAPA,GAAb+F,EAAE,SAASA,IAAOA,KAAU/F,EAAE,OAAcA,CAAC,CAA2D,OAA1D+F,EAAEqlH,KAAK,IAAO,EAAF0Q,KAAM,KAAK/1H,EAAEA,EAAEuzG,GAAG,GAAG4jB,IAAan3H,EAAEuzG,GAAVvzG,EAtK3Q,SAASu3H,GAAGv3H,GAAG,OAAOA,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,QAAQ,OAAO,EAAE,CAsKqJu3H,CAAGv3H,GAAUm3H,IAAYn3H,CAAC,CACpT,SAASwoH,GAAGxoH,EAAE/F,EAAE8D,GAAG,GAAG,GAAGi5H,GAAG,MAAMA,GAAG,EAAEC,GAAG,KAAK7/H,MAAM8I,EAAE,MAAgB,GAAG,QAAbF,EAAEw3H,GAAGx3H,EAAE/F,IAAe,OAAO,KAAKy5G,GAAG1zG,EAAE/F,EAAE8D,GAAGiC,IAAI+tH,KAAIoF,IAAIl5H,EAAE,IAAIof,IAAG+5G,GAAGpzH,EAAEqzH,KAAI,IAAIrzE,EAAEqlE,KAAK,IAAIprH,EAAE,IAAO,EAAF87H,KAAM,IAAO,GAAFA,IAAM0B,GAAGz3H,IAAI03H,GAAG13H,EAAEjC,GAAG,IAAIg4H,KAAIQ,KAAK9Q,QAAQ,IAAO,EAAFsQ,KAAM,KAAK/1E,GAAG,KAAKA,IAAI,OAAO+2E,GAAGA,GAAG,IAAItzF,IAAI,CAACzjC,IAAI+2H,GAAGr8F,IAAI16B,IAAI03H,GAAG13H,EAAEjC,IAAIu4H,GAAGt2H,CAAC,CAAC,SAASw3H,GAAGx3H,EAAE/F,GAAG+F,EAAE0mH,OAAOzsH,EAAE,IAAI8D,EAAEiC,EAAE0uG,UAAqC,IAA3B,OAAO3wG,IAAIA,EAAE2oH,OAAOzsH,GAAG8D,EAAEiC,EAAMA,EAAEA,EAAE2uG,OAAO,OAAO3uG,GAAGA,EAAEsmH,YAAYrsH,EAAgB,QAAd8D,EAAEiC,EAAE0uG,aAAqB3wG,EAAEuoH,YAAYrsH,GAAG8D,EAAEiC,EAAEA,EAAEA,EAAE2uG,OAAO,OAAO,IAAI5wG,EAAEsT,IAAItT,EAAEovG,UAAU,IAAI,CAC7e,SAASuqB,GAAG13H,EAAE/F,GAAG,IAAI,IAAI8D,EAAEiC,EAAE23H,aAAa33E,EAAEhgD,EAAEizG,eAAe5zG,EAAEW,EAAEkzG,YAAYnhG,EAAE/R,EAAE43H,gBAAgBl+G,EAAE1Z,EAAE+yG,aAAa,EAAEr5F,GAAG,CAAC,IAAIiwC,EAAE,GAAGwpD,GAAGz5F,GAAGsqC,EAAE,GAAG2F,EAAE38B,EAAEjb,EAAE43C,GAAG,IAAI,IAAI38B,GAAG,GAAG,IAAKg3B,EAAEhE,IAAI,IAAKgE,EAAE3kD,GAAG,CAAC2tB,EAAE/yB,EAAE44G,GAAG7uD,GAAG,IAAIloD,EAAEoW,GAAEH,EAAE43C,GAAG,IAAI7tD,EAAEkxB,EAAE,IAAI,GAAGlxB,EAAEkxB,EAAE,KAAK,CAAC,OAAOA,GAAG/yB,IAAI+F,EAAEgzG,cAAchvD,GAAGtqC,IAAIsqC,CAAC,CAAuB,GAAtBhE,EAAE8yD,GAAG9yG,EAAEA,IAAI+tH,GAAEsF,GAAE,GAAGp5H,EAAEiY,GAAK,IAAI8tC,EAAE,OAAOjiD,IAAIA,IAAIgnH,IAAIjB,GAAG/lH,GAAGiC,EAAE23H,aAAa,KAAK33H,EAAE63H,iBAAiB,OAAO,CAAC,GAAG,OAAO95H,EAAE,CAAC,GAAGiC,EAAE63H,mBAAmB59H,EAAE,OAAO8D,IAAIgnH,IAAIjB,GAAG/lH,EAAE,CAAC,KAAK9D,GAAG8D,EAAE05H,GAAGjuH,KAAK,KAAKxJ,GAAG,OAAOilH,IAAIA,GAAG,CAAClnH,GAAGmnH,GAAGrB,GAAGU,GAAGmB,KAAKT,GAAGpuH,KAAKkH,GACrfA,EAAEgnH,IAAI,KAAK9qH,EAAE8D,EAAEynH,GAAG,GAAGiS,GAAGjuH,KAAK,KAAKxJ,KAAKjC,EAzK+F,SAAS+5H,GAAG93H,GAAG,OAAOA,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,MAAM5I,MAAM8I,EAAE,IAAIF,IAAK,CAyK7T83H,CAAG79H,GAAG8D,EAAEynH,GAAGznH,EAAEg6H,GAAGvuH,KAAK,KAAKxJ,KAAKA,EAAE63H,iBAAiB59H,EAAE+F,EAAE23H,aAAa55H,CAAC,CAAC,CAC9G,SAASg6H,GAAG/3H,GAAiB,GAAdk3H,IAAI,EAAEE,GAAGD,GAAG,EAAK,IAAO,GAAFpB,IAAM,MAAM3+H,MAAM8I,EAAE,MAAM,IAAIjG,EAAE+F,EAAE23H,aAAa,GAAGK,MAAMh4H,EAAE23H,eAAe19H,EAAE,OAAO,KAAK,IAAI8D,EAAE+0G,GAAG9yG,EAAEA,IAAI+tH,GAAEsF,GAAE,GAAG,GAAG,IAAIt1H,EAAE,OAAO,KAAK,IAAIiiD,EAAEjiD,EAAMsB,EAAE02H,GAAEA,IAAG,GAAG,IAAIhkH,EAAEkmH,KAAkC,IAA1BlK,KAAI/tH,GAAGqzH,KAAIrzE,IAAEu2E,KAAK2B,GAAGl4H,EAAEggD,UAAUm4E,KAAK,KAAK,CAAC,MAAMxuE,GAAGyuE,GAAGp4H,EAAE2pD,EAAE,CAA8D,GAApDu8D,KAAK2P,GAAGpzG,QAAQ1Q,EAAEgkH,GAAE12H,EAAE,OAAO22H,GAAEh2E,EAAE,GAAG+tE,GAAE,KAAKsF,GAAE,EAAErzE,EAAE3mC,IAAM,IAAK+8G,GAAGjD,IAAI+E,GAAGl4H,EAAE,QAAQ,GAAG,IAAIggD,EAAE,CAAyF,GAAxF,IAAIA,IAAI+1E,IAAG,GAAG/1H,EAAE8wG,UAAU9wG,EAAE8wG,SAAQ,EAAG+Q,GAAG7hH,EAAE+wG,gBAAwB,KAARhzG,EAAEu1G,GAAGtzG,MAAWggD,EAAEq4E,GAAGr4H,EAAEjC,KAAQ,IAAIiiD,EAAE,MAAM/lD,EAAEk8H,GAAG+B,GAAGl4H,EAAE,GAAGozH,GAAGpzH,EAAEjC,GAAG25H,GAAG13H,EAAE4Q,MAAK3W,EAC3c,OAD6c+F,EAAEs4H,aACrft4H,EAAEyiB,QAAQisF,UAAU1uG,EAAEu4H,cAAcx6H,EAASiiD,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM5oD,MAAM8I,EAAE,MAAM,KAAK,EACI,KAAK,EAAEs4H,GAAGx4H,GAAG,MADH,KAAK,EAAU,GAARozH,GAAGpzH,EAAEjC,IAAS,SAAFA,KAAcA,GAAiB,IAAbiiD,EAAEu1E,GAAG,IAAI3kH,MAAU,CAAC,GAAG,IAAIkiG,GAAG9yG,EAAE,GAAG,MAAyB,KAAnBX,EAAEW,EAAEizG,gBAAqBl1G,KAAKA,EAAE,CAACuqH,KAAKtoH,EAAEkzG,aAAalzG,EAAEizG,eAAe5zG,EAAE,KAAK,CAACW,EAAEy4H,cAAcpzE,GAAGmzE,GAAGhvH,KAAK,KAAKxJ,GAAGggD,GAAG,KAAK,CAACw4E,GAAGx4H,GAAG,MAAM,KAAK,EAAU,GAARozH,GAAGpzH,EAAEjC,IAAS,QAAFA,KAAaA,EAAE,MAAqB,IAAfiiD,EAAEhgD,EAAE2zG,WAAet0G,GAAG,EAAE,EAAEtB,GAAG,CAAC,IAAI2b,EAAE,GAAGy5F,GAAGp1G,GAAGgU,EAAE,GAAG2H,GAAEA,EAAEsmC,EAAEtmC,IAAKra,IAAIA,EAAEqa,GAAG3b,IAAIgU,CAAC,CAClZ,GADmZhU,EAAEsB,EAClZ,IAD4ZtB,GAAG,KAAXA,EAAE6S,KAAI7S,GAAW,IAAI,IAAIA,EAAE,IAAI,KAAKA,EAAE,KAAK,KAAKA,EAAE,KAAK,IAAIA,EAAE,IAAI,KAClfA,EAAE,KAAK,KAAK63H,GAAG73H,EAAE,OAAOA,GAAU,CAACiC,EAAEy4H,cAAcpzE,GAAGmzE,GAAGhvH,KAAK,KAAKxJ,GAAGjC,GAAG,KAAK,CAACy6H,GAAGx4H,GAAG,MAAyB,QAAQ,MAAM5I,MAAM8I,EAAE,MAAO,CAAW,OAAVw3H,GAAG13H,EAAE4Q,MAAY5Q,EAAE23H,eAAe19H,EAAE89H,GAAGvuH,KAAK,KAAKxJ,GAAG,IAAI,CAAC,SAASozH,GAAGpzH,EAAE/F,GAAuD,IAApDA,IAAIo8H,GAAGp8H,IAAIk5H,GAAGnzH,EAAEizG,gBAAgBh5G,EAAE+F,EAAEkzG,cAAcj5G,EAAM+F,EAAEA,EAAE43H,gBAAgB,EAAE39H,GAAG,CAAC,IAAI8D,EAAE,GAAGo1G,GAAGl5G,GAAG+lD,EAAE,GAAGjiD,EAAEiC,EAAEjC,IAAI,EAAE9D,IAAI+lD,CAAC,CAAC,CAC5U,SAASy3E,GAAGz3H,GAAG,GAAG,IAAO,GAAF+1H,IAAM,MAAM3+H,MAAM8I,EAAE,MAAW,GAAL83H,KAAQh4H,IAAI+tH,IAAG,IAAK/tH,EAAEgzG,aAAaqgB,IAAG,CAAC,IAAIp5H,EAAEo5H,GAAMt1H,EAAEs6H,GAAGr4H,EAAE/F,GAAG,IAAKm8H,GAAGjD,MAAgBp1H,EAAEs6H,GAAGr4H,EAAf/F,EAAE64G,GAAG9yG,EAAE/F,IAAa,MAAgB8D,EAAEs6H,GAAGr4H,EAAf/F,EAAE64G,GAAG9yG,EAAE,IAAgH,GAAnG,IAAIA,EAAEqR,KAAK,IAAItT,IAAIg4H,IAAG,GAAG/1H,EAAE8wG,UAAU9wG,EAAE8wG,SAAQ,EAAG+Q,GAAG7hH,EAAE+wG,gBAAwB,KAAR92G,EAAEq5G,GAAGtzG,MAAWjC,EAAEs6H,GAAGr4H,EAAE/F,KAAQ,IAAI8D,EAAE,MAAMA,EAAEo4H,GAAG+B,GAAGl4H,EAAE,GAAGozH,GAAGpzH,EAAE/F,GAAGy9H,GAAG13H,EAAE4Q,MAAK7S,EAAuE,OAArEiC,EAAEs4H,aAAat4H,EAAEyiB,QAAQisF,UAAU1uG,EAAEu4H,cAAct+H,EAAEu+H,GAAGx4H,GAAG03H,GAAG13H,EAAE4Q,MAAY,IAAI,CACvR,SAAS8nH,GAAG14H,EAAE/F,GAAG,IAAI8D,EAAEg4H,GAAEA,IAAG,EAAE,IAAI,OAAO/1H,EAAE/F,EAAE,CAAC,QAAY,KAAJ87H,GAAEh4H,KAAUw4H,KAAK9Q,KAAK,CAAC,CAAC,SAASkT,GAAG34H,EAAE/F,GAAG,IAAI8D,EAAEg4H,GAAEA,KAAI,EAAEA,IAAG,EAAE,IAAI,OAAO/1H,EAAE/F,EAAE,CAAC,QAAY,KAAJ87H,GAAEh4H,KAAUw4H,KAAK9Q,KAAK,CAAC,CAAC,SAASuL,GAAGhxH,EAAE/F,GAAGyoH,EAAEwT,GAAGD,IAAIA,IAAIh8H,EAAEm8H,IAAIn8H,CAAC,CAAC,SAASs5H,KAAK0C,GAAGC,GAAGzzG,QAAQggG,EAAEyT,GAAG,CAC/V,SAASgC,GAAGl4H,EAAE/F,GAAG+F,EAAEs4H,aAAa,KAAKt4H,EAAEu4H,cAAc,EAAE,IAAIx6H,EAAEiC,EAAEy4H,cAAiD,IAAlC,IAAI16H,IAAIiC,EAAEy4H,eAAe,EAAE7W,GAAG7jH,IAAO,OAAOi4H,GAAE,IAAIj4H,EAAEi4H,GAAErnB,OAAO,OAAO5wG,GAAG,CAAC,IAAIiiD,EAAEjiD,EAAE,OAAOiiD,EAAE3uC,KAAK,KAAK,EAA6B,OAA3B2uC,EAAEA,EAAExlD,KAAKwjD,oBAAwCmlE,KAAK,MAAM,KAAK,EAAE0H,KAAKpI,EAAEI,IAAGJ,EAAEG,IAAGmJ,KAAK,MAAM,KAAK,EAAEhB,GAAG/qE,GAAG,MAAM,KAAK,EAAE6qE,KAAK,MAAM,KAAK,GAAc,KAAK,GAAGpI,EAAEnpG,IAAG,MAAM,KAAK,GAAG6sG,GAAGnmE,GAAG,MAAM,KAAK,GAAG,KAAK,GAAGuzE,KAAKx1H,EAAEA,EAAE4wG,MAAM,CAACof,GAAE/tH,EAAEg2H,GAAEhM,GAAGhqH,EAAEyiB,QAAQ,MAAM4wG,GAAE4C,GAAGG,GAAGn8H,EAAEof,GAAE,EAAE88G,GAAG,KAAKE,GAAGlD,GAAGrL,GAAG,CAAC,CACxc,SAASsQ,GAAGp4H,EAAE/F,GAAG,OAAE,CAAC,IAAI8D,EAAEi4H,GAAE,IAAuB,GAAnB9P,KAAK+F,GAAGxpG,QAAQoqG,GAAMR,GAAG,CAAC,IAAI,IAAIrsE,EAAEvkB,GAAEozE,cAAc,OAAO7uD,GAAG,CAAC,IAAI3gD,EAAE2gD,EAAEizC,MAAM,OAAO5zF,IAAIA,EAAEgoH,QAAQ,MAAMrnE,EAAEA,EAAE3jC,IAAI,CAACgwG,IAAG,CAAE,CAAuC,GAAtCD,GAAG,EAAEjsG,GAAEG,GAAEmb,GAAE,KAAK6wF,IAAG,EAAGwJ,GAAGrzG,QAAQ,KAAQ,OAAO1kB,GAAG,OAAOA,EAAE4wG,OAAO,CAACt1F,GAAE,EAAE88G,GAAGl8H,EAAE+7H,GAAE,KAAK,KAAK,CAACh2H,EAAE,CAAC,IAAI+R,EAAE/R,EAAE0Z,EAAE3b,EAAE4wG,OAAOhlD,EAAE5rD,EAAEimD,EAAE/pD,EAAoD,GAAlDA,EAAEo5H,GAAE1pE,EAAEltB,OAAO,KAAKktB,EAAEogE,YAAYpgE,EAAEkgE,WAAW,KAAQ,OAAO7lE,GAAG,iBAAkBA,GAAG,mBAAoBA,EAAE0xE,KAAK,CAAC,IAAI1oG,EAAEg3B,EAAE,GAAG,IAAY,EAAP2F,EAAE5lC,MAAQ,CAAC,IAAIjoB,EAAE6tD,EAAE+kD,UAAU5yG,GAAG6tD,EAAEs9D,YAAYnrH,EAAEmrH,YAAYt9D,EAAEklD,cAAc/yG,EAAE+yG,cAAcllD,EAAE+8D,MAAM5qH,EAAE4qH,QACpf/8D,EAAEs9D,YAAY,KAAKt9D,EAAEklD,cAAc,KAAK,CAAC,IAAI/uF,EAAE,IAAe,EAAVxG,GAAEmJ,SAAW08E,EAAEzlF,EAAE,EAAE,CAAC,IAAI9D,GAAE,GAAGA,GAAE,KAAKupF,EAAE9tF,IAAI,CAAC,IAAIpR,GAAEk/F,EAAE0P,cAAc,GAAG,OAAO5uG,GAAE2V,GAAE,OAAO3V,GAAE6uG,eAAqB,CAAC,IAAIpxE,GAAEyhE,EAAE8rB,cAAcr1G,QAAE,IAAS8nB,GAAEq0F,YAAY,IAAKr0F,GAAEs0F,6BAA8BlyG,EAAO,CAAC,CAAC,GAAGlK,GAAE,CAAC,IAAI0qG,GAAEnhB,EAAE8nB,YAAY,GAAG,OAAO3G,GAAE,CAAC,IAAIC,GAAE,IAAI98E,IAAI88E,GAAE7lF,IAAI1N,GAAGmyE,EAAE8nB,YAAY1G,EAAC,MAAMD,GAAE5lF,IAAI1N,GAAG,GAAG,IAAY,EAAPmyE,EAAEp7E,MAAQ,CAA2C,GAA1Co7E,EAAE1iE,OAAO,GAAGktB,EAAEltB,OAAO,MAAMktB,EAAEltB,QAAQ,KAAQ,IAAIktB,EAAEt4C,IAAI,GAAG,OAAOs4C,EAAE+kD,UAAU/kD,EAAEt4C,IAAI,OAAO,CAAC,IAAIovG,GAAE+G,IAAI,EAAE,GAAG/G,GAAEpvG,IAAI,EAAEs2G,GAAGh+D,EAAE82D,GAAE,CAAC92D,EAAE+8D,OAAO,EAAE,MAAM1mH,CAAC,CAACgkD,OAC5f,EAAO2F,EAAE1vD,EAAE,IAAIumH,GAAEzuG,EAAE6mH,UAA+G,GAArG,OAAOpY,IAAGA,GAAEzuG,EAAE6mH,UAAU,IAAIjF,GAAG3vE,EAAE,IAAIvgB,IAAI+8E,GAAElgH,IAAI0sB,EAAEg3B,SAAgB,KAAXA,EAAEw8D,GAAE9gH,IAAIstB,MAAgBg3B,EAAE,IAAIvgB,IAAI+8E,GAAElgH,IAAI0sB,EAAEg3B,KAASA,EAAE9pC,IAAIyvC,GAAG,CAAC3F,EAAEtpB,IAAIivB,GAAG,IAAI1F,GAAE40E,GAAGrvH,KAAK,KAAKuI,EAAEib,EAAE28B,GAAG38B,EAAE0oG,KAAKzxE,GAAEA,GAAE,CAACk7C,EAAE1iE,OAAO,KAAK0iE,EAAEunB,MAAMzsH,EAAE,MAAM+F,CAAC,CAACm/F,EAAEA,EAAEwP,MAAM,OAAO,OAAOxP,GAAGn7C,EAAE5sD,OAAO6uG,GAAGt8C,EAAEnvD,OAAO,qBAAqB,wLAAwL,CAAC,IAAI6e,KAAIA,GAAE,GAAG2qC,EAAEyvE,GAAGzvE,EAAE2F,GAAGw1C,EACpfzlF,EAAE,EAAE,CAAC,OAAOylF,EAAE9tF,KAAK,KAAK,EAAEU,EAAEiyC,EAAEm7C,EAAE1iE,OAAO,KAAKxiC,IAAIA,EAAEklG,EAAEunB,OAAOzsH,EAAkB2tH,GAAGzoB,EAAby0B,GAAGz0B,EAAEptF,EAAE9X,IAAW,MAAM+F,EAAE,KAAK,EAAE+R,EAAEiyC,EAAE,IAAI+8D,GAAE5hB,EAAE3kG,KAAKwmH,GAAE7hB,EAAEgO,UAAU,GAAG,IAAa,GAARhO,EAAE1iE,SAAY,mBAAoBskF,GAAE1iE,0BAA0B,OAAO2iE,IAAG,mBAAoBA,GAAEgT,oBAAoB,OAAOC,KAAKA,GAAG/5G,IAAI8mG,MAAK,CAAC7hB,EAAE1iE,OAAO,KAAKxiC,IAAIA,EAAEklG,EAAEunB,OAAOzsH,EAAkB2tH,GAAGzoB,EAAb40B,GAAG50B,EAAEptF,EAAE9X,IAAW,MAAM+F,CAAC,EAAEm/F,EAAEA,EAAEwP,MAAM,OAAO,OAAOxP,EAAE,CAAC25B,GAAG/6H,EAAE,CAAC,MAAMg7H,GAAI9+H,EAAE8+H,EAAG/C,KAAIj4H,GAAG,OAAOA,IAAIi4H,GAAEj4H,EAAEA,EAAE4wG,QAAQ,QAAQ,CAAC,KAAK,CAAS,CAC7b,SAASspB,KAAK,IAAIj4H,EAAE61H,GAAGpzG,QAAsB,OAAdozG,GAAGpzG,QAAQoqG,GAAU,OAAO7sH,EAAE6sH,GAAG7sH,CAAC,CAAC,SAASq4H,GAAGr4H,EAAE/F,GAAG,IAAI8D,EAAEg4H,GAAEA,IAAG,GAAG,IAAI/1E,EAAEi4E,KAA2B,IAAtBlK,KAAI/tH,GAAGqzH,KAAIp5H,GAAGi+H,GAAGl4H,EAAE/F,SAAU++H,KAAK,KAAK,CAAC,MAAM35H,GAAG+4H,GAAGp4H,EAAEX,EAAE,CAAgC,GAAtB6mH,KAAK6P,GAAEh4H,EAAE83H,GAAGpzG,QAAQu9B,EAAK,OAAOg2E,GAAE,MAAM5+H,MAAM8I,EAAE,MAAiB,OAAX6tH,GAAE,KAAKsF,GAAE,EAASh6G,EAAC,CAAC,SAAS2/G,KAAK,KAAK,OAAOhD,IAAGiD,GAAGjD,GAAE,CAAC,SAASmC,KAAK,KAAK,OAAOnC,KAAIhS,MAAMiV,GAAGjD,GAAE,CAAC,SAASiD,GAAGj5H,GAAG,IAAI/F,EAAEu8H,GAAGx2H,EAAE0uG,UAAU1uG,EAAEi2H,IAAIj2H,EAAEirH,cAAcjrH,EAAEyrH,aAAa,OAAOxxH,EAAE6+H,GAAG94H,GAAGg2H,GAAE/7H,EAAE67H,GAAGrzG,QAAQ,IAAI,CAChb,SAASq2G,GAAG94H,GAAG,IAAI/F,EAAE+F,EAAE,EAAE,CAAC,IAAIjC,EAAE9D,EAAEy0G,UAAqB,GAAX1uG,EAAE/F,EAAE00G,OAAU,IAAa,KAAR10G,EAAEwiC,OAAY,CAAc,GAAG,QAAhB1+B,EAAE+0H,GAAG/0H,EAAE9D,EAAEg8H,KAAqB,YAAJD,GAAEj4H,GAAa,GAAG,MAAPA,EAAE9D,GAAYoX,KAAK,KAAKtT,EAAEsT,KAAK,OAAOtT,EAAE8wG,eAAe,IAAQ,WAAHonB,KAAgB,IAAY,EAAPl4H,EAAEgmB,MAAQ,CAAC,IAAI,IAAIi8B,EAAE,EAAE3gD,EAAEtB,EAAEypC,MAAM,OAAOnoC,GAAG2gD,GAAG3gD,EAAEqnH,MAAMrnH,EAAEinH,WAAWjnH,EAAEA,EAAE6vG,QAAQnxG,EAAEuoH,WAAWtmE,CAAC,CAAC,OAAOhgD,GAAG,IAAa,KAARA,EAAEy8B,SAAc,OAAOz8B,EAAE+pH,cAAc/pH,EAAE+pH,YAAY9vH,EAAE8vH,aAAa,OAAO9vH,EAAE4vH,aAAa,OAAO7pH,EAAE6pH,aAAa7pH,EAAE6pH,WAAWC,WAAW7vH,EAAE8vH,aAAa/pH,EAAE6pH,WAAW5vH,EAAE4vH,YAAY,EAAE5vH,EAAEwiC,QAAQ,OAC/ez8B,EAAE6pH,WAAW7pH,EAAE6pH,WAAWC,WAAW7vH,EAAE+F,EAAE+pH,YAAY9vH,EAAE+F,EAAE6pH,WAAW5vH,GAAG,KAAK,CAAS,GAAG,QAAX8D,EAAEy1H,GAAGv5H,IAAkC,OAAlB8D,EAAE0+B,OAAO,UAAKu5F,GAAEj4H,GAAS,OAAOiC,IAAIA,EAAE+pH,YAAY/pH,EAAE6pH,WAAW,KAAK7pH,EAAEy8B,OAAO,KAAK,CAAa,GAAG,QAAfxiC,EAAEA,EAAEi1G,SAAyB,YAAJ8mB,GAAE/7H,GAAS+7H,GAAE/7H,EAAE+F,CAAC,OAAO,OAAO/F,GAAG,IAAIof,KAAIA,GAAE,EAAE,CAAC,SAASm/G,GAAGx4H,GAAG,IAAI/F,EAAEorH,KAA8B,OAAzBE,GAAG,GAAG2T,GAAG1vH,KAAK,KAAKxJ,EAAE/F,IAAW,IAAI,CAC1T,SAASi/H,GAAGl5H,EAAE/F,GAAG,GAAG+9H,WAAW,OAAOrB,IAAI,GAAG,IAAO,GAAFZ,IAAM,MAAM3+H,MAAM8I,EAAE,MAAM,IAAInC,EAAEiC,EAAEs4H,aAAa,GAAG,OAAOv6H,EAAE,OAAO,KAA2C,GAAtCiC,EAAEs4H,aAAa,KAAKt4H,EAAEu4H,cAAc,EAAKx6H,IAAIiC,EAAEyiB,QAAQ,MAAMrrB,MAAM8I,EAAE,MAAMF,EAAE23H,aAAa,KAAK,IAAI33E,EAAEjiD,EAAE2oH,MAAM3oH,EAAEuoH,WAAWjnH,EAAE2gD,EAAEjuC,EAAE/R,EAAE+yG,cAAc1zG,EAAEW,EAAE+yG,aAAa1zG,EAAEW,EAAEizG,eAAe,EAAEjzG,EAAEkzG,YAAY,EAAElzG,EAAEgzG,cAAc3zG,EAAEW,EAAE6tH,kBAAkBxuH,EAAEW,EAAEozG,gBAAgB/zG,EAAEA,EAAEW,EAAEqzG,cAAc,IAAI,IAAI35F,EAAE1Z,EAAE2zG,WAAWhqD,EAAE3pD,EAAE43H,gBAAgB,EAAE7lH,GAAG,CAAC,IAAIiyC,EAAE,GAAGmvD,GAAGphG,GAAGib,EAAE,GAAGg3B,EAAE3kD,EAAE2kD,GAAG,EAAEtqC,EAAEsqC,IAAI,EAAE2F,EAAE3F,IAAI,EAAEjyC,IAAIib,CAAC,CACpV,GADqV,OACjf+pG,IAAI,IAAO,GAAF/2E,IAAO+2E,GAAG78G,IAAIla,IAAI+2H,GAAGlxF,OAAO7lC,GAAGA,IAAI+tH,KAAIiI,GAAEjI,GAAE,KAAKsF,GAAE,GAAG,EAAEt1H,EAAE0+B,MAAM,OAAO1+B,EAAE8rH,YAAY9rH,EAAE8rH,WAAWC,WAAW/rH,EAAEiiD,EAAEjiD,EAAEgsH,aAAa/pE,EAAEjiD,EAAEiiD,EAAEjiD,EAAEgsH,YAAe,OAAO/pE,EAAE,CAAwC,GAAvC3gD,EAAE02H,GAAEA,IAAG,GAAGD,GAAGrzG,QAAQ,KAAK6+F,GAAGnN,GAAaqK,GAAV9kG,EAAE4kG,MAAc,CAAC,GAAG,mBAAmB5kG,EAAEiwC,EAAE,CAACtyD,MAAMqiB,EAAEslG,eAAe1nH,IAAIoiB,EAAEulG,mBAAmBj/G,EAAE,GAAG2pD,GAAGA,EAAEjwC,EAAEiX,gBAAgBg5B,EAAEw1D,aAAahxG,QAAQ6e,EAAE28B,EAAE58C,cAAc48C,EAAE58C,iBAAiB,IAAIigB,EAAEmsG,WAAW,CAACxvE,EAAE38B,EAAEkyF,WAAWntG,EAAEib,EAAEoyF,aAAap7D,EAAEh3B,EAAEqyF,UAAUryF,EAAEA,EAAEsyF,YAAY,IAAI31D,EAAEj6B,SAASs0B,EAAEt0B,QAAQ,CAAC,MAAMqpG,GAAIpvE,EAAE,KACnf,MAAM3pD,CAAC,CAAC,IAAIlE,EAAE,EAAEgkB,GAAG,EAAEq/E,GAAG,EAAEvpF,GAAE,EAAE3V,GAAE,EAAEy9B,GAAEhkB,EAAE4mG,GAAE,KAAKrmH,EAAE,OAAO,CAAC,IAAI,IAAIsmH,GAAK7iF,KAAIisB,GAAG,IAAI53C,GAAG,IAAI2rB,GAAEhO,WAAW5P,EAAEhkB,EAAEiW,GAAG2rB,KAAIsmB,GAAG,IAAIh3B,GAAG,IAAI0Q,GAAEhO,WAAWyvE,EAAErjG,EAAEkxB,GAAG,IAAI0Q,GAAEhO,WAAW5zB,GAAG4hC,GAAE+T,UAAUj7C,QAAW,QAAQ+pH,GAAE7iF,GAAEpE,aAAkBgnF,GAAE5iF,GAAEA,GAAE6iF,GAAE,OAAO,CAAC,GAAG7iF,KAAIhkB,EAAE,MAAMzf,EAA8C,GAA5CqmH,KAAI32D,KAAK/zC,KAAI7D,IAAI+N,EAAEhkB,GAAGwkH,KAAIt8D,KAAK/jD,KAAI+sB,IAAImyE,EAAErjG,GAAM,QAAQykH,GAAE7iF,GAAE8T,aAAa,MAAU8uE,IAAJ5iF,GAAE4iF,IAAM5qF,UAAU,CAACgI,GAAE6iF,EAAC,CAAC52D,GAAG,IAAI7pC,IAAI,IAAIq/E,EAAE,KAAK,CAAC9nG,MAAMyoB,EAAExoB,IAAI6nG,EAAE,MAAMx1C,EAAE,KAAKA,EAAEA,GAAG,CAACtyD,MAAM,EAAEC,IAAI,EAAE,MAAMqyD,EAAE,KAAK43D,GAAG,CAAC6X,YAAY1/G,EAAE2/G,eAAe1vE,GAAGwqD,IAAG,EAAGkjB,GAAG,KAAKC,IAAG,EAAGb,GAAEz2E,EAAE,OAAOs5E,IAAI,CAAC,MAAMP,GAAI,GAAG,OACvgBtC,GAAE,MAAMr/H,MAAM8I,EAAE,MAAMm0H,GAAGoC,GAAEsC,GAAItC,GAAEA,GAAE3M,UAAU,QAAO,OAAO2M,IAAGY,GAAG,KAAKZ,GAAEz2E,EAAE,OAAO,IAAItmC,EAAE1Z,EAAE,OAAOy2H,IAAG,CAAC,IAAIhW,GAAEgW,GAAEh6F,MAA+B,GAAvB,GAAFgkF,IAAM9X,GAAG8tB,GAAEtpB,UAAU,IAAS,IAAFsT,GAAM,CAAC,IAAID,GAAEiW,GAAE/nB,UAAU,GAAG,OAAO8R,GAAE,CAAC,IAAIv8D,GAAEu8D,GAAEj+D,IAAI,OAAO0B,KAAI,mBAAoBA,GAAEA,GAAE,MAAMA,GAAExhC,QAAQ,KAAK,CAAC,CAAC,OAAS,KAAFg+F,IAAQ,KAAK,EAAEyU,GAAGuB,IAAGA,GAAEh6F,QAAQ,EAAE,MAAM,KAAK,EAAEy4F,GAAGuB,IAAGA,GAAEh6F,QAAQ,EAAE64F,GAAGmB,GAAE/nB,UAAU+nB,IAAG,MAAM,KAAK,KAAKA,GAAEh6F,QAAQ,KAAK,MAAM,KAAK,KAAKg6F,GAAEh6F,QAAQ,KAAK64F,GAAGmB,GAAE/nB,UAAU+nB,IAAG,MAAM,KAAK,EAAEnB,GAAGmB,GAAE/nB,UAAU+nB,IAAG,MAAM,KAAK,EAAM1B,GAAGr7G,EAAPiwC,EAAE8sE,IAAU,IAAI3V,GAAEn3D,EAAE+kD,UAAUsmB,GAAGrrE,GAAG,OACnfm3D,IAAGkU,GAAGlU,IAAG2V,GAAEA,GAAE3M,UAAU,CAAC,CAAC,MAAMiP,GAAI,GAAG,OAAOtC,GAAE,MAAMr/H,MAAM8I,EAAE,MAAMm0H,GAAGoC,GAAEsC,GAAItC,GAAEA,GAAE3M,UAAU,QAAO,OAAO2M,IAAkD,GAA/CxyE,GAAEs9D,GAAGf,GAAElC,KAAKmC,GAAEx8D,GAAEm1E,YAAY1/G,EAAEuqC,GAAEo1E,eAAkB7Y,KAAIC,IAAGA,IAAGA,GAAE9vF,eAAeytF,GAAGqC,GAAE9vF,cAAc6F,gBAAgBiqF,IAAG,CAAC,OAAO/mG,GAAG8kG,GAAGiC,MAAKD,GAAE9mG,EAAEriB,WAAc,KAAR4sD,GAAEvqC,EAAEpiB,OAAiB2sD,GAAEu8D,IAAG,mBAAmBC,IAAGA,GAAEzB,eAAewB,GAAEC,GAAExB,aAAa/gH,KAAKC,IAAI8lD,GAAEw8D,GAAE5nH,MAAMrC,UAAUytD,IAAGu8D,GAAEC,GAAE9vF,eAAe9jB,WAAW2zG,GAAErB,aAAahxG,QAASpB,eAAek3C,GAAEA,GAAEl3C,eAAe48C,EAAE82D,GAAExzG,YAAYzW,OAAOsqH,GAAE5iH,KAAKC,IAAIub,EAAEriB,MAAMsyD,GAAGjwC,OAAE,IACpfA,EAAEpiB,IAAIwpH,GAAE5iH,KAAKC,IAAIub,EAAEpiB,IAAIqyD,IAAI1F,GAAEwiC,QAAQq6B,GAAEpnG,IAAIiwC,EAAEjwC,EAAEA,EAAEonG,GAAEA,GAAEn3D,GAAGA,EAAEw0D,GAAGsC,GAAEK,IAAG/uG,EAAEosG,GAAGsC,GAAE/mG,GAAGiwC,GAAG53C,IAAI,IAAIkyC,GAAEk1E,YAAYl1E,GAAEi7D,aAAav1D,EAAEl0B,MAAMwuB,GAAEm7D,eAAez1D,EAAE5sD,QAAQknD,GAAEo7D,YAAYttG,EAAE0jB,MAAMwuB,GAAEq7D,cAAcvtG,EAAEhV,WAAUyjH,GAAEA,GAAE1zG,eAAgBysH,SAAS5vE,EAAEl0B,KAAKk0B,EAAE5sD,QAAQknD,GAAE/0C,kBAAkB4xG,GAAEpnG,GAAGuqC,GAAEv1C,SAAS8xG,IAAGv8D,GAAEwiC,OAAO10E,EAAE0jB,KAAK1jB,EAAEhV,UAAUyjH,GAAEgZ,OAAOznH,EAAE0jB,KAAK1jB,EAAEhV,QAAQknD,GAAEv1C,SAAS8xG,QAAQA,GAAE,GAAG,IAAIv8D,GAAEw8D,GAAEx8D,GAAEA,GAAEvuB,YAAY,IAAIuuB,GAAEv0B,UAAU8wF,GAAE3pH,KAAK,CAACuzB,QAAQ65B,GAAE0P,KAAK1P,GAAEw1E,WAAWnsH,IAAI22C,GAAEy1E,YAAmD,IAAvC,mBAAoBjZ,GAAEkU,OAAOlU,GAAEkU,QAAYlU,GACrf,EAAEA,GAAED,GAAEhqH,OAAOiqH,MAAIx8D,GAAEu8D,GAAEC,KAAKr2F,QAAQqvG,WAAWx1E,GAAE0P,KAAK1P,GAAE75B,QAAQsvG,UAAUz1E,GAAE32C,GAAG,CAAC6mG,KAAKmN,GAAGC,GAAGD,GAAG,KAAKthH,EAAEyiB,QAAQ1kB,EAAE04H,GAAEz2E,EAAE,OAAO,IAAIygE,GAAEzgH,EAAE,OAAOy2H,IAAG,CAAC,IAAI1V,GAAE0V,GAAEh6F,MAAgC,GAAxB,GAAFskF,IAAMyT,GAAG/T,GAAEgW,GAAE/nB,UAAU+nB,IAAQ,IAAF1V,GAAM,CAACP,QAAE,EAAO,IAAIQ,GAAEyV,GAAEl0E,IAAI,GAAG,OAAOy+D,GAAE,CAAC,IAAIC,GAAEwV,GAAEtpB,UAAiBspB,GAAEplH,IAA8BmvG,GAAES,GAAE,mBAAoBD,GAAEA,GAAER,IAAGQ,GAAEv+F,QAAQ+9F,EAAC,CAAC,CAACiW,GAAEA,GAAE3M,UAAU,CAAC,CAAC,MAAMiP,GAAI,GAAG,OAAOtC,GAAE,MAAMr/H,MAAM8I,EAAE,MAAMm0H,GAAGoC,GAAEsC,GAAItC,GAAEA,GAAE3M,UAAU,QAAO,OAAO2M,IAAGA,GAAE,KAAKzR,KAAK+Q,GAAE12H,CAAC,MAAMW,EAAEyiB,QAAQ1kB,EAAE,GAAG24H,GAAGA,IAAG,EAAGC,GAAG32H,EAAE42H,GAAG38H,OAAO,IAAIw8H,GAAEz2E,EAAE,OAAOy2E,IAAGx8H,EACpfw8H,GAAE3M,WAAW2M,GAAE3M,WAAW,KAAa,EAAR2M,GAAEh6F,SAAUskF,GAAE0V,IAAIvnB,QAAQ,KAAK6R,GAAE5T,UAAU,MAAMspB,GAAEx8H,EAAqF,GAAlE,KAAjB+lD,EAAEhgD,EAAE+yG,gBAAqBkhB,GAAG,MAAM,IAAIj0E,EAAEhgD,IAAIi3H,GAAGD,MAAMA,GAAG,EAAEC,GAAGj3H,GAAGg3H,GAAG,EAAEj5H,EAAEA,EAAEovG,UAAawW,IAAI,mBAAoBA,GAAGgW,kBAAkB,IAAIhW,GAAGgW,kBAAkBjW,GAAG3lH,OAAE,EAAO,KAAsB,GAAhBA,EAAE0kB,QAAQga,OAAU,CAAC,MAAMs8F,GAAI,CAAW,GAAVrB,GAAG13H,EAAE4Q,MAAQijH,GAAG,MAAMA,IAAG,EAAG7zH,EAAE8zH,GAAGA,GAAG,KAAK9zH,EAAE,OAAG,IAAO,EAAF+1H,KAAiBtQ,KAAL,IAAqB,CACtX,SAAS6T,KAAK,KAAK,OAAO7C,IAAG,CAAC,IAAIz2H,EAAEy2H,GAAE/nB,UAAU4oB,IAAI,OAAOD,KAAK,IAAa,EAARZ,GAAEh6F,OAAS0yE,GAAGsnB,GAAEY,MAAMC,IAAG,GAAI,KAAKb,GAAEplH,KAAKskH,GAAG31H,EAAEy2H,KAAItnB,GAAGsnB,GAAEY,MAAMC,IAAG,IAAK,IAAIr9H,EAAEw8H,GAAEh6F,MAAM,IAAO,IAAFxiC,IAAQq6H,GAAGt0H,EAAEy2H,IAAG,IAAO,IAAFx8H,IAAQy8H,KAAKA,IAAG,EAAGlR,GAAG,IAAG,WAAgB,OAALwS,KAAY,IAAI,KAAIvB,GAAEA,GAAE3M,UAAU,CAAC,CAAC,SAASkO,KAAK,GAAG,KAAKpB,GAAG,CAAC,IAAI52H,EAAE,GAAG42H,GAAG,GAAGA,GAAS,OAANA,GAAG,GAAUrR,GAAGvlH,EAAE45H,GAAG,CAAC,OAAM,CAAE,CAAC,SAASlF,GAAG10H,EAAE/F,GAAG48H,GAAGhgI,KAAKoD,EAAE+F,GAAG02H,KAAKA,IAAG,EAAGlR,GAAG,IAAG,WAAgB,OAALwS,KAAY,IAAI,IAAG,CAAC,SAASvD,GAAGz0H,EAAE/F,GAAG68H,GAAGjgI,KAAKoD,EAAE+F,GAAG02H,KAAKA,IAAG,EAAGlR,GAAG,IAAG,WAAgB,OAALwS,KAAY,IAAI,IAAG,CAChe,SAAS4B,KAAK,GAAG,OAAOjD,GAAG,OAAM,EAAG,IAAI32H,EAAE22H,GAAW,GAARA,GAAG,KAAQ,IAAO,GAAFZ,IAAM,MAAM3+H,MAAM8I,EAAE,MAAM,IAAIjG,EAAE87H,GAAEA,IAAG,GAAG,IAAIh4H,EAAE+4H,GAAGA,GAAG,GAAG,IAAI,IAAI92E,EAAE,EAAEA,EAAEjiD,EAAEvH,OAAOwpD,GAAG,EAAE,CAAC,IAAI3gD,EAAEtB,EAAEiiD,GAAGjuC,EAAEhU,EAAEiiD,EAAE,GAAGtmC,EAAEra,EAAEovH,QAAyB,GAAjBpvH,EAAEovH,aAAQ,EAAU,mBAAoB/0G,EAAE,IAAIA,GAAG,CAAC,MAAMsqC,GAAG,GAAG,OAAOjyC,EAAE,MAAM3a,MAAM8I,EAAE,MAAMm0H,GAAGtiH,EAAEiyC,EAAE,CAAC,CAAY,IAAXjmD,EAAE84H,GAAGA,GAAG,GAAO72E,EAAE,EAAEA,EAAEjiD,EAAEvH,OAAOwpD,GAAG,EAAE,CAAC3gD,EAAEtB,EAAEiiD,GAAGjuC,EAAEhU,EAAEiiD,EAAE,GAAG,IAAI,IAAI2J,EAAEtqD,EAAE6d,OAAO7d,EAAEovH,QAAQ9kE,GAAG,CAAC,MAAM3F,GAAG,GAAG,OAAOjyC,EAAE,MAAM3a,MAAM8I,EAAE,MAAMm0H,GAAGtiH,EAAEiyC,EAAE,CAAC,CAAC,IAAI2F,EAAE3pD,EAAEyiB,QAAQsnG,YAAY,OAAOpgE,GAAG3pD,EAAE2pD,EAAEmgE,WAAWngE,EAAEmgE,WAAW,KAAa,EAARngE,EAAEltB,QAAUktB,EAAEulD,QACjf,KAAKvlD,EAAEwjD,UAAU,MAAMxjD,EAAE3pD,EAAW,OAAT+1H,GAAE97H,EAAEwrH,MAAW,CAAE,CAAC,SAASoU,GAAG75H,EAAE/F,EAAE8D,GAAyB4pH,GAAG3nH,EAAf/F,EAAE25H,GAAG5zH,EAAf/F,EAAEw5H,GAAG11H,EAAE9D,GAAY,IAAWA,EAAEquH,KAAe,QAAVtoH,EAAEw3H,GAAGx3H,EAAE,MAAc0zG,GAAG1zG,EAAE,EAAE/F,GAAGy9H,GAAG13H,EAAE/F,GAAG,CAC5I,SAASo6H,GAAGr0H,EAAE/F,GAAG,GAAG,IAAI+F,EAAEqR,IAAIwoH,GAAG75H,EAAEA,EAAE/F,QAAQ,IAAI,IAAI8D,EAAEiC,EAAE2uG,OAAO,OAAO5wG,GAAG,CAAC,GAAG,IAAIA,EAAEsT,IAAI,CAACwoH,GAAG97H,EAAEiC,EAAE/F,GAAG,KAAK,CAAM,GAAG,IAAI8D,EAAEsT,IAAI,CAAC,IAAI2uC,EAAEjiD,EAAEovG,UAAU,GAAG,mBAAoBpvG,EAAEvD,KAAK6jD,0BAA0B,mBAAoB2B,EAAEg0E,oBAAoB,OAAOC,KAAKA,GAAG/5G,IAAI8lC,IAAI,CAAW,IAAI3gD,EAAE00H,GAAGh2H,EAAnBiC,EAAEyzH,GAAGx5H,EAAE+F,GAAgB,GAA4B,GAAzB2nH,GAAG5pH,EAAEsB,GAAGA,EAAEipH,KAAkB,QAAbvqH,EAAEy5H,GAAGz5H,EAAE,IAAe21G,GAAG31G,EAAE,EAAEsB,GAAGq4H,GAAG35H,EAAEsB,QAAQ,GAAG,mBAAoB2gD,EAAEg0E,oBAAoB,OAAOC,KAAKA,GAAG/5G,IAAI8lC,IAAI,IAAIA,EAAEg0E,kBAAkB/5H,EAAE+F,EAAE,CAAC,MAAM+R,GAAG,CAAC,KAAK,CAAC,CAAChU,EAAEA,EAAE4wG,MAAM,CAAC,CAC3d,SAASkqB,GAAG74H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAEhgD,EAAE44H,UAAU,OAAO54E,GAAGA,EAAEna,OAAO5rC,GAAGA,EAAEquH,KAAKtoH,EAAEkzG,aAAalzG,EAAEizG,eAAel1G,EAAEgwH,KAAI/tH,IAAIqzH,GAAEt1H,KAAKA,IAAI,IAAIsb,IAAG,IAAIA,KAAM,SAAFg6G,MAAcA,IAAG,IAAIziH,KAAI2kH,GAAG2C,GAAGl4H,EAAE,GAAGq2H,IAAIt4H,GAAG25H,GAAG13H,EAAE/F,EAAE,CAAC,SAASw7H,GAAGz1H,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAEmtG,UAAU,OAAOpvG,GAAGA,EAAE8nC,OAAO5rC,GAAO,KAAJA,EAAE,KAAmB,IAAO,GAAhBA,EAAE+F,EAAE+jB,OAAe9pB,EAAE,EAAE,IAAO,EAAFA,GAAKA,EAAE,KAAKorH,KAAK,EAAE,GAAG,IAAI8R,KAAKA,GAAGf,IAAuB,KAAnBn8H,EAAEu5G,GAAG,UAAU2jB,OAAYl9H,EAAE,WAAW8D,EAAEuqH,KAAe,QAAVtoH,EAAEw3H,GAAGx3H,EAAE/F,MAAcy5G,GAAG1zG,EAAE/F,EAAE8D,GAAG25H,GAAG13H,EAAEjC,GAAG,CAUpZ,SAAS+7H,GAAG95H,EAAE/F,EAAE8D,EAAEiiD,GAAGjsD,KAAKsd,IAAIrR,EAAEjM,KAAKyW,IAAIzM,EAAEhK,KAAKm7G,QAAQn7G,KAAKyzC,MAAMzzC,KAAK46G,OAAO56G,KAAKo5G,UAAUp5G,KAAKyG,KAAKzG,KAAKohG,YAAY,KAAKphG,KAAK8W,MAAM,EAAE9W,KAAKwuD,IAAI,KAAKxuD,KAAK03H,aAAaxxH,EAAElG,KAAKyyH,aAAazyH,KAAK86G,cAAc96G,KAAKkzH,YAAYlzH,KAAKk3H,cAAc,KAAKl3H,KAAKgwB,KAAKi8B,EAAEjsD,KAAK0oC,MAAM,EAAE1oC,KAAK81H,WAAW91H,KAAKg2H,YAAYh2H,KAAK+1H,WAAW,KAAK/1H,KAAKuyH,WAAWvyH,KAAK2yH,MAAM,EAAE3yH,KAAK26G,UAAU,IAAI,CAAC,SAAS6c,GAAGvrH,EAAE/F,EAAE8D,EAAEiiD,GAAG,OAAO,IAAI85E,GAAG95H,EAAE/F,EAAE8D,EAAEiiD,EAAE,CAAC,SAAS2wE,GAAG3wH,GAAiB,UAAdA,EAAEA,EAAEzH,aAAuByH,EAAE+5H,iBAAiB,CAEte,SAAS/P,GAAGhqH,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAE0uG,UACuB,OADb,OAAO3wG,IAAGA,EAAEwtH,GAAGvrH,EAAEqR,IAAIpX,EAAE+F,EAAEwK,IAAIxK,EAAE+jB,OAAQoxE,YAAYn1F,EAAEm1F,YAAYp3F,EAAEvD,KAAKwF,EAAExF,KAAKuD,EAAEovG,UAAUntG,EAAEmtG,UAAUpvG,EAAE2wG,UAAU1uG,EAAEA,EAAE0uG,UAAU3wG,IAAIA,EAAE0tH,aAAaxxH,EAAE8D,EAAEvD,KAAKwF,EAAExF,KAAKuD,EAAE0+B,MAAM,EAAE1+B,EAAE+rH,WAAW,KAAK/rH,EAAEgsH,YAAY,KAAKhsH,EAAE8rH,WAAW,MAAM9rH,EAAEuoH,WAAWtmH,EAAEsmH,WAAWvoH,EAAE2oH,MAAM1mH,EAAE0mH,MAAM3oH,EAAEypC,MAAMxnC,EAAEwnC,MAAMzpC,EAAEktH,cAAcjrH,EAAEirH,cAAcltH,EAAE8wG,cAAc7uG,EAAE6uG,cAAc9wG,EAAEkpH,YAAYjnH,EAAEinH,YAAYhtH,EAAE+F,EAAEwmH,aAAazoH,EAAEyoH,aAAa,OAAOvsH,EAAE,KAAK,CAACysH,MAAMzsH,EAAEysH,MAAMD,aAAaxsH,EAAEwsH,cAC3e1oH,EAAEmxG,QAAQlvG,EAAEkvG,QAAQnxG,EAAE8M,MAAM7K,EAAE6K,MAAM9M,EAAEwkD,IAAIviD,EAAEuiD,IAAWxkD,CAAC,CACxD,SAASmsH,GAAGlqH,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,EAAE0S,GAAG,IAAI2H,EAAE,EAAM,GAAJsmC,EAAEhgD,EAAK,mBAAoBA,EAAE2wH,GAAG3wH,KAAK0Z,EAAE,QAAQ,GAAG,iBAAkB1Z,EAAE0Z,EAAE,OAAO1Z,EAAE,OAAOA,GAAG,KAAK0kG,GAAG,OAAO0lB,GAAGrsH,EAAEqpC,SAAS/nC,EAAE0S,EAAE9X,GAAG,KAAKqrG,GAAG5rF,EAAE,EAAEra,GAAG,GAAG,MAAM,KAAKslG,GAAGjrF,EAAE,EAAEra,GAAG,EAAE,MAAM,KAAKulG,GAAG,OAAO5kG,EAAEurH,GAAG,GAAGxtH,EAAE9D,EAAI,EAAFoF,IAAO81F,YAAYyP,GAAG5kG,EAAExF,KAAKoqG,GAAG5kG,EAAE0mH,MAAM30G,EAAE/R,EAAE,KAAKglG,GAAG,OAAOhlG,EAAEurH,GAAG,GAAGxtH,EAAE9D,EAAEoF,IAAK7E,KAAKwqG,GAAGhlG,EAAEm1F,YAAY6P,GAAGhlG,EAAE0mH,MAAM30G,EAAE/R,EAAE,KAAKilG,GAAG,OAAOjlG,EAAEurH,GAAG,GAAGxtH,EAAE9D,EAAEoF,IAAK81F,YAAY8P,GAAGjlG,EAAE0mH,MAAM30G,EAAE/R,EAAE,KAAKulG,GAAG,OAAO4sB,GAAGp0H,EAAEsB,EAAE0S,EAAE9X,GAAG,KAAKurG,GAAG,OAAOxlG,EAAEurH,GAAG,GAAGxtH,EAAE9D,EAAEoF,IAAK81F,YAAYqQ,GAAGxlG,EAAE0mH,MAAM30G,EAAE/R,EAAE,QAAQ,GAAG,iBAChfA,GAAG,OAAOA,EAAE,OAAOA,EAAE4pB,UAAU,KAAKi7E,GAAGnrF,EAAE,GAAG,MAAM1Z,EAAE,KAAK8kG,GAAGprF,EAAE,EAAE,MAAM1Z,EAAE,KAAK+kG,GAAGrrF,EAAE,GAAG,MAAM1Z,EAAE,KAAKklG,GAAGxrF,EAAE,GAAG,MAAM1Z,EAAE,KAAKmlG,GAAGzrF,EAAE,GAAGsmC,EAAE,KAAK,MAAMhgD,EAAE,KAAKolG,GAAG1rF,EAAE,GAAG,MAAM1Z,EAAE,MAAM5I,MAAM8I,EAAE,IAAI,MAAMF,EAAEA,SAASA,EAAE,KAAuD,OAAjD/F,EAAEsxH,GAAG7xG,EAAE3b,EAAE9D,EAAEoF,IAAK81F,YAAYn1F,EAAE/F,EAAEO,KAAKwlD,EAAE/lD,EAAEysH,MAAM30G,EAAS9X,CAAC,CAAC,SAASmwH,GAAGpqH,EAAE/F,EAAE8D,EAAEiiD,GAA2B,OAAxBhgD,EAAEurH,GAAG,EAAEvrH,EAAEggD,EAAE/lD,IAAKysH,MAAM3oH,EAASiC,CAAC,CAAC,SAASmyH,GAAGnyH,EAAE/F,EAAE8D,EAAEiiD,GAA6C,OAA1ChgD,EAAEurH,GAAG,GAAGvrH,EAAEggD,EAAE/lD,IAAKk7F,YAAYoQ,GAAGvlG,EAAE0mH,MAAM3oH,EAASiC,CAAC,CAAC,SAASiqH,GAAGjqH,EAAE/F,EAAE8D,GAA8B,OAA3BiC,EAAEurH,GAAG,EAAEvrH,EAAE,KAAK/F,IAAKysH,MAAM3oH,EAASiC,CAAC,CACnc,SAASmqH,GAAGnqH,EAAE/F,EAAE8D,GAA8J,OAA3J9D,EAAEsxH,GAAG,EAAE,OAAOvrH,EAAEonC,SAASpnC,EAAEonC,SAAS,GAAGpnC,EAAEwK,IAAIvQ,IAAKysH,MAAM3oH,EAAE9D,EAAEkzG,UAAU,CAAC4D,cAAc/wG,EAAE+wG,cAAcipB,gBAAgB,KAAKlpG,eAAe9wB,EAAE8wB,gBAAuB72B,CAAC,CACtL,SAASggI,GAAGj6H,EAAE/F,EAAE8D,GAAGhK,KAAKsd,IAAIpX,EAAElG,KAAKg9G,cAAc/wG,EAAEjM,KAAKukI,aAAavkI,KAAK6kI,UAAU7kI,KAAK0uB,QAAQ1uB,KAAKimI,gBAAgB,KAAKjmI,KAAK0kI,eAAe,EAAE1kI,KAAKw9H,eAAex9H,KAAKgrC,QAAQ,KAAKhrC,KAAK+8G,QAAQ/yG,EAAEhK,KAAK4jI,aAAa,KAAK5jI,KAAK8jI,iBAAiB,EAAE9jI,KAAK4/G,WAAWF,GAAG,GAAG1/G,KAAK6jI,gBAAgBnkB,IAAI,GAAG1/G,KAAKq/G,eAAer/G,KAAKwkI,cAAcxkI,KAAK85H,iBAAiB95H,KAAKi/G,aAAaj/G,KAAKm/G,YAAYn/G,KAAKk/G,eAAel/G,KAAKg/G,aAAa,EAAEh/G,KAAKs/G,cAAcI,GAAG,GAAG1/G,KAAKmmI,gCAAgC,IAAI,CAEjf,SAASC,GAAGn6H,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI3gD,EAAEpF,EAAEwoB,QAAQ1Q,EAAEu2G,KAAK5uG,EAAE6uG,GAAGlpH,GAAGW,EAAE,GAAGjC,EAAE,CAAqB9D,EAAE,CAAC,GAAGw0G,GAA1B1wG,EAAEA,EAAEqqH,mBAA8BrqH,GAAG,IAAIA,EAAEsT,IAAI,MAAMja,MAAM8I,EAAE,MAAM,IAAIypD,EAAE5rD,EAAE,EAAE,CAAC,OAAO4rD,EAAEt4C,KAAK,KAAK,EAAEs4C,EAAEA,EAAEwjD,UAAUpuE,QAAQ,MAAM9kC,EAAE,KAAK,EAAE,GAAGipH,GAAGv5D,EAAEnvD,MAAM,CAACmvD,EAAEA,EAAEwjD,UAAUqW,0CAA0C,MAAMvpH,CAAC,EAAE0vD,EAAEA,EAAEglD,MAAM,OAAO,OAAOhlD,GAAG,MAAMvyD,MAAM8I,EAAE,KAAM,CAAC,GAAG,IAAInC,EAAEsT,IAAI,CAAC,IAAI2yC,EAAEjmD,EAAEvD,KAAK,GAAG0oH,GAAGl/D,GAAG,CAACjmD,EAAEslH,GAAGtlH,EAAEimD,EAAE2F,GAAG,MAAM3pD,CAAC,CAAC,CAACjC,EAAE4rD,CAAC,MAAM5rD,EAAE4kH,GACrW,OADwW,OAAO1oH,EAAE8kC,QAAQ9kC,EAAE8kC,QAAQhhC,EAAE9D,EAAEs3H,eAAexzH,GAAE9D,EAAEutH,GAAGz1G,EAAE2H,IAAKmyE,QAAQ,CAACzhE,QAAQpqB,GAAuB,QAApBggD,OAAE,IAASA,EAAE,KAAKA,KAC1e/lD,EAAE28E,SAAS52B,GAAG2nE,GAAGtoH,EAAEpF,GAAGuuH,GAAGnpH,EAAEqa,EAAE3H,GAAU2H,CAAC,CAAC,SAAS0gH,GAAGp6H,GAAe,OAAZA,EAAEA,EAAEyiB,SAAc+kB,OAAyBxnC,EAAEwnC,MAAMn2B,IAAoDrR,EAAEwnC,MAAM2lE,WAAhF,IAA0F,CAAC,SAASktB,GAAGr6H,EAAE/F,GAAqB,GAAG,QAArB+F,EAAEA,EAAE6uG,gBAA2B,OAAO7uG,EAAE8uG,WAAW,CAAC,IAAI/wG,EAAEiC,EAAE6xH,UAAU7xH,EAAE6xH,UAAU,IAAI9zH,GAAGA,EAAE9D,EAAE8D,EAAE9D,CAAC,CAAC,CAAC,SAASqgI,GAAGt6H,EAAE/F,GAAGogI,GAAGr6H,EAAE/F,IAAI+F,EAAEA,EAAE0uG,YAAY2rB,GAAGr6H,EAAE/F,EAAE,CAC1V,SAASsgI,GAAGv6H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE,MAAMjiD,GAAG,MAAMA,EAAEy8H,kBAAkBz8H,EAAEy8H,iBAAiBC,gBAAgB,KAAiK,GAA5J18H,EAAE,IAAIk8H,GAAGj6H,EAAE/F,EAAE,MAAM8D,IAAG,IAAKA,EAAE+yG,SAAS72G,EAAEsxH,GAAG,EAAE,KAAK,KAAK,IAAItxH,EAAE,EAAE,IAAIA,EAAE,EAAE,GAAG8D,EAAE0kB,QAAQxoB,EAAEA,EAAEkzG,UAAUpvG,EAAEipH,GAAG/sH,GAAG+F,EAAE2gH,IAAI5iH,EAAE0kB,QAAQw9F,GAAG,IAAIjgH,EAAE0vB,SAAS1vB,EAAE01B,WAAW11B,GAAMggD,EAAE,IAAIhgD,EAAE,EAAEA,EAAEggD,EAAExpD,OAAOwJ,IAAI,CAAQ,IAAIX,GAAXpF,EAAE+lD,EAAEhgD,IAAW2tH,YAAYtuH,EAAEA,EAAEpF,EAAE2zH,SAAS,MAAM7vH,EAAEm8H,gCAAgCn8H,EAAEm8H,gCAAgC,CAACjgI,EAAEoF,GAAGtB,EAAEm8H,gCAAgCrjI,KAAKoD,EAAEoF,EAAE,CAACtL,KAAK2mI,cAAc38H,CAAC,CAChS,SAAS48H,GAAG36H,GAAG,SAASA,GAAG,IAAIA,EAAE0vB,UAAU,IAAI1vB,EAAE0vB,UAAU,KAAK1vB,EAAE0vB,WAAW,IAAI1vB,EAAE0vB,UAAU,iCAAiC1vB,EAAEyxC,WAAW,CAElU,SAASmpF,GAAG56H,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI0S,EAAEhU,EAAEs3H,oBAAoB,GAAGtjH,EAAE,CAAC,IAAI2H,EAAE3H,EAAE2oH,cAAc,GAAG,mBAAoBr7H,EAAE,CAAC,IAAIsqD,EAAEtqD,EAAEA,EAAE,WAAW,IAAIW,EAAEo6H,GAAG1gH,GAAGiwC,EAAEvtD,KAAK4D,EAAE,CAAC,CAACm6H,GAAGlgI,EAAEyf,EAAE1Z,EAAEX,EAAE,KAAK,CAAmD,GAAlD0S,EAAEhU,EAAEs3H,oBAD1K,SAASwF,GAAG76H,EAAE/F,GAA0H,GAAvHA,IAA2DA,MAAvDA,EAAE+F,EAAE,IAAIA,EAAE0vB,SAAS1vB,EAAEw2B,gBAAgBx2B,EAAEs5B,WAAW,OAAa,IAAIr/B,EAAEy1B,WAAWz1B,EAAEg1B,aAAa,qBAAwBh1B,EAAE,IAAI,IAAI8D,EAAEA,EAAEiC,EAAE4oG,WAAW5oG,EAAEmP,YAAYpR,GAAG,OAAO,IAAIw8H,GAAGv6H,EAAE,EAAE/F,EAAE,CAAC62G,SAAQ,QAAI,EAAO,CAClC+pB,CAAG98H,EAAEiiD,GAAGtmC,EAAE3H,EAAE2oH,cAAiB,mBAAoBr7H,EAAE,CAAC,IAAI2kD,EAAE3kD,EAAEA,EAAE,WAAW,IAAIW,EAAEo6H,GAAG1gH,GAAGsqC,EAAE5nD,KAAK4D,EAAE,CAAC,CAAC24H,IAAG,WAAWwB,GAAGlgI,EAAEyf,EAAE1Z,EAAEX,EAAE,GAAE,CAAC,OAAO+6H,GAAG1gH,EAAE,CAGpG,SAASohH,GAAG96H,EAAE/F,GAAG,IAAI8D,EAAE,EAAE9C,UAAUzE,aAAQ,IAASyE,UAAU,GAAGA,UAAU,GAAG,KAAK,IAAI0/H,GAAG1gI,GAAG,MAAM7C,MAAM8I,EAAE,MAAM,OATnV,SAAS66H,GAAG/6H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE,EAAE/kD,UAAUzE,aAAQ,IAASyE,UAAU,GAAGA,UAAU,GAAG,KAAK,MAAM,CAAC2uB,SAAS66E,GAAGj6F,IAAI,MAAMw1C,EAAE,KAAK,GAAGA,EAAE5Y,SAASpnC,EAAE+wG,cAAc92G,EAAE62B,eAAe/yB,EAAE,CASgLg9H,CAAG/6H,EAAE/F,EAAE,KAAK8D,EAAE,CA1BxWy4H,GAAG,SAASx2H,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAE/lD,EAAEysH,MAAM,GAAG,OAAO1mH,EAAE,GAAGA,EAAEirH,gBAAgBhxH,EAAEwxH,cAAc5I,GAAEpgG,QAAQkkG,IAAG,MAAQ,IAAG,IAAK5oH,EAAEiiD,GAAoC,CAAO,OAAN2mE,IAAG,EAAU1sH,EAAEoX,KAAK,KAAK,EAAEigH,GAAGr3H,GAAG4xH,KAAK,MAAM,KAAK,EAAEf,GAAG7wH,GAAG,MAAM,KAAK,EAAEipH,GAAGjpH,EAAEO,OAAO+oH,GAAGtpH,GAAG,MAAM,KAAK,EAAE2wH,GAAG3wH,EAAEA,EAAEkzG,UAAU4D,eAAe,MAAM,KAAK,GAAG/wD,EAAE/lD,EAAEgxH,cAAcpyH,MAAM,IAAIwG,EAAEpF,EAAEO,KAAK0rG,SAASwc,EAAEoD,GAAGzmH,EAAE+mH,eAAe/mH,EAAE+mH,cAAcpmE,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO/lD,EAAE40G,cAAe,OAAG,IAAK9wG,EAAE9D,EAAEutC,MAAM8+E,YAAmBwL,GAAG9xH,EAAE/F,EAAE8D,IAAG2kH,EAAEppG,GAAY,EAAVA,GAAEmJ,SAA8B,QAAnBxoB,EAAE+D,GAAGgC,EAAE/F,EAAE8D,IAC/e9D,EAAEi1G,QAAQ,MAAKwT,EAAEppG,GAAY,EAAVA,GAAEmJ,SAAW,MAAM,KAAK,GAA0B,GAAvBu9B,EAAE,IAAKjiD,EAAE9D,EAAEqsH,YAAe,IAAa,GAARtmH,EAAEy8B,OAAU,CAAC,GAAGujB,EAAE,OAAO4yE,GAAG5yH,EAAE/F,EAAE8D,GAAG9D,EAAEwiC,OAAO,EAAE,CAA6F,GAA1E,QAAlBp9B,EAAEpF,EAAE40G,iBAAyBxvG,EAAEozH,UAAU,KAAKpzH,EAAE00D,KAAK,KAAK10D,EAAEwqH,WAAW,MAAMnH,EAAEppG,GAAEA,GAAEmJ,SAAYu9B,EAAE,MAAW,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG,OAAO/lD,EAAEysH,MAAM,EAAEoK,GAAG9wH,EAAE/F,EAAE8D,GAAG,OAAOC,GAAGgC,EAAE/F,EAAE8D,EAAE,CAD7L4oH,GAAG,IAAa,MAAR3mH,EAAEy8B,MACmL,MAAMkqF,IAAG,EAAa,OAAV1sH,EAAEysH,MAAM,EAASzsH,EAAEoX,KAAK,KAAK,EAA+I,GAA7I2uC,EAAE/lD,EAAEO,KAAK,OAAOwF,IAAIA,EAAE0uG,UAAU,KAAKz0G,EAAEy0G,UAAU,KAAKz0G,EAAEwiC,OAAO,GAAGz8B,EAAE/F,EAAEwxH,aAAapsH,EAAE0jH,GAAG9oH,EAAE2oH,GAAEngG,SAAS8jG,GAAGtsH,EAAE8D,GAAGsB,EAAEotH,GAAG,KAAKxyH,EAAE+lD,EAAEhgD,EAAEX,EAAEtB,GAAG9D,EAAEwiC,OAAO,EAAK,iBACrep9B,GAAG,OAAOA,GAAG,mBAAoBA,EAAE+wC,aAAQ,IAAS/wC,EAAEuqB,SAAS,CAAiD,GAAhD3vB,EAAEoX,IAAI,EAAEpX,EAAE40G,cAAc,KAAK50G,EAAEgtH,YAAY,KAAQ/D,GAAGljE,GAAG,CAAC,IAAIjuC,GAAE,EAAGwxG,GAAGtpH,EAAE,MAAM8X,GAAE,EAAG9X,EAAE40G,cAAc,OAAOxvG,EAAEob,YAAO,IAASpb,EAAEob,MAAMpb,EAAEob,MAAM,KAAKusG,GAAG/sH,GAAG,IAAIyf,EAAEsmC,EAAE1B,yBAAyB,mBAAoB5kC,GAAGuuG,GAAGhuH,EAAE+lD,EAAEtmC,EAAE1Z,GAAGX,EAAEqsD,QAAQw8D,GAAGjuH,EAAEkzG,UAAU9tG,EAAEA,EAAE+oH,gBAAgBnuH,EAAEivH,GAAGjvH,EAAE+lD,EAAEhgD,EAAEjC,GAAG9D,EAAEo3H,GAAG,KAAKp3H,EAAE+lD,GAAE,EAAGjuC,EAAEhU,EAAE,MAAM9D,EAAEoX,IAAI,EAAEo/G,GAAG,KAAKx2H,EAAEoF,EAAEtB,GAAG9D,EAAEA,EAAEutC,MAAM,OAAOvtC,EAAE,KAAK,GAAGoF,EAAEpF,EAAEk7F,YAAYn1F,EAAE,CAChX,OADiX,OAAOA,IAAIA,EAAE0uG,UAAU,KAAKz0G,EAAEy0G,UAAU,KAAKz0G,EAAEwiC,OAAO,GACnfz8B,EAAE/F,EAAEwxH,aAAuBpsH,GAAV0S,EAAE1S,EAAE+mG,OAAU/mG,EAAE8mG,UAAUlsG,EAAEO,KAAK6E,EAAE0S,EAAE9X,EAAEoX,IAOxD,SAAS2pH,GAAGh7H,GAAG,GAAG,mBAAoBA,EAAE,OAAO2wH,GAAG3wH,GAAG,EAAE,EAAE,GAAG,MAASA,EAAY,CAAc,IAAbA,EAAEA,EAAE4pB,YAAgBm7E,GAAG,OAAO,GAAG,GAAG/kG,IAAIklG,GAAG,OAAO,EAAE,CAAC,OAAO,CAAC,CAPnF81B,CAAG37H,GAAGW,EAAE6lH,GAAGxmH,EAAEW,GAAU+R,GAAG,KAAK,EAAE9X,EAAE42H,GAAG,KAAK52H,EAAEoF,EAAEW,EAAEjC,GAAG,MAAMiC,EAAE,KAAK,EAAE/F,EAAEi3H,GAAG,KAAKj3H,EAAEoF,EAAEW,EAAEjC,GAAG,MAAMiC,EAAE,KAAK,GAAG/F,EAAEy2H,GAAG,KAAKz2H,EAAEoF,EAAEW,EAAEjC,GAAG,MAAMiC,EAAE,KAAK,GAAG/F,EAAE2oD,GAAG,KAAK3oD,EAAEoF,EAAEwmH,GAAGxmH,EAAE7E,KAAKwF,GAAGggD,EAAEjiD,GAAG,MAAMiC,EAAE,MAAM5I,MAAM8I,EAAE,IAAIb,EAAE,IAAK,CAAC,OAAOpF,EAAE,KAAK,EAAE,OAAO+lD,EAAE/lD,EAAEO,KAAK6E,EAAEpF,EAAEwxH,aAA2CoF,GAAG7wH,EAAE/F,EAAE+lD,EAArC3gD,EAAEpF,EAAEk7F,cAAcn1C,EAAE3gD,EAAEwmH,GAAG7lE,EAAE3gD,GAActB,GAAG,KAAK,EAAE,OAAOiiD,EAAE/lD,EAAEO,KAAK6E,EAAEpF,EAAEwxH,aAA2CyF,GAAGlxH,EAAE/F,EAAE+lD,EAArC3gD,EAAEpF,EAAEk7F,cAAcn1C,EAAE3gD,EAAEwmH,GAAG7lE,EAAE3gD,GAActB,GAAG,KAAK,EAAwB,GAAtBuzH,GAAGr3H,GAAG+lD,EAAE/lD,EAAEgtH,YAAe,OAAOjnH,GAAG,OAAOggD,EAAE,MAAM5oD,MAAM8I,EAAE,MAC3Y,GAA9G8/C,EAAE/lD,EAAEwxH,aAA+BpsH,EAAE,QAApBA,EAAEpF,EAAE40G,eAAyBxvG,EAAE+qB,QAAQ,KAAKm9F,GAAGvnH,EAAE/F,GAAG4tH,GAAG5tH,EAAE+lD,EAAE,KAAKjiD,IAAGiiD,EAAE/lD,EAAE40G,cAAczkF,WAAe/qB,EAAEwsH,KAAK5xH,EAAE+D,GAAGgC,EAAE/F,EAAE8D,OAAO,CAAuF,IAArEgU,GAAjB1S,EAAEpF,EAAEkzG,WAAiB2D,WAAQsa,GAAGtJ,GAAG7nH,EAAEkzG,UAAU4D,cAAcz3E,YAAY6xF,GAAGlxH,EAAE8X,EAAEs5G,IAAG,GAAMt5G,EAAE,CAAqC,GAAG,OAAvC/R,EAAEX,EAAE66H,iCAA2C,IAAI76H,EAAE,EAAEA,EAAEW,EAAExJ,OAAO6I,GAAG,GAAE0S,EAAE/R,EAAEX,IAAK2sH,8BAA8BhsH,EAAEX,EAAE,GAAGysH,GAAGj1H,KAAKkb,GAAoB,IAAjBhU,EAAEusH,GAAGrwH,EAAE,KAAK+lD,EAAEjiD,GAAO9D,EAAEutC,MAAMzpC,EAAEA,GAAGA,EAAE0+B,OAAe,EAAT1+B,EAAE0+B,MAAS,KAAK1+B,EAAEA,EAAEmxG,OAAO,MAAMuhB,GAAGzwH,EAAE/F,EAAE+lD,EAAEjiD,GAAG8tH,KAAK5xH,EAAEA,EAAEutC,KAAK,CAAC,OAAOvtC,EAAE,KAAK,EAAE,OAAO6wH,GAAG7wH,GAAG,OAAO+F,GACnf0rH,GAAGzxH,GAAG+lD,EAAE/lD,EAAEO,KAAK6E,EAAEpF,EAAEwxH,aAAa15G,EAAE,OAAO/R,EAAEA,EAAEirH,cAAc,KAAKvxG,EAAEra,EAAE+nC,SAASs6E,GAAG1hE,EAAE3gD,GAAGqa,EAAE,KAAK,OAAO3H,GAAG2vG,GAAG1hE,EAAEjuC,KAAK9X,EAAEwiC,OAAO,IAAIw0F,GAAGjxH,EAAE/F,GAAGw2H,GAAGzwH,EAAE/F,EAAEyf,EAAE3b,GAAG9D,EAAEutC,MAAM,KAAK,EAAE,OAAO,OAAOxnC,GAAG0rH,GAAGzxH,GAAG,KAAK,KAAK,GAAG,OAAO63H,GAAG9xH,EAAE/F,EAAE8D,GAAG,KAAK,EAAE,OAAO6sH,GAAG3wH,EAAEA,EAAEkzG,UAAU4D,eAAe/wD,EAAE/lD,EAAEwxH,aAAa,OAAOzrH,EAAE/F,EAAEutC,MAAM6iF,GAAGpwH,EAAE,KAAK+lD,EAAEjiD,GAAG0yH,GAAGzwH,EAAE/F,EAAE+lD,EAAEjiD,GAAG9D,EAAEutC,MAAM,KAAK,GAAG,OAAOwY,EAAE/lD,EAAEO,KAAK6E,EAAEpF,EAAEwxH,aAA2CiF,GAAG1wH,EAAE/F,EAAE+lD,EAArC3gD,EAAEpF,EAAEk7F,cAAcn1C,EAAE3gD,EAAEwmH,GAAG7lE,EAAE3gD,GAActB,GAAG,KAAK,EAAE,OAAO0yH,GAAGzwH,EAAE/F,EAAEA,EAAEwxH,aAAa1tH,GAAG9D,EAAEutC,MAAM,KAAK,EACtc,KAAK,GAAG,OAAOipF,GAAGzwH,EAAE/F,EAAEA,EAAEwxH,aAAarkF,SAASrpC,GAAG9D,EAAEutC,MAAM,KAAK,GAAGxnC,EAAE,CAACggD,EAAE/lD,EAAEO,KAAK0rG,SAAS7mG,EAAEpF,EAAEwxH,aAAa/xG,EAAEzf,EAAEgxH,cAAcl5G,EAAE1S,EAAExG,MAAM,IAAI8wD,EAAE1vD,EAAEO,KAAK0rG,SAAiD,GAAxCwc,EAAEoD,GAAGn8D,EAAEy8D,eAAez8D,EAAEy8D,cAAcr0G,EAAK,OAAO2H,EAAE,GAAGiwC,EAAEjwC,EAAE7gB,MAA0G,KAApGkZ,EAAE+rG,GAAGn0D,EAAE53C,GAAG,EAAwF,GAArF,mBAAoBiuC,EAAEi7E,sBAAsBj7E,EAAEi7E,sBAAsBtxE,EAAE53C,GAAG,cAAqB,GAAG2H,EAAE0tB,WAAW/nC,EAAE+nC,WAAWy7E,GAAEpgG,QAAQ,CAACxoB,EAAE+D,GAAGgC,EAAE/F,EAAE8D,GAAG,MAAMiC,CAAC,OAAO,IAAc,QAAV2pD,EAAE1vD,EAAEutC,SAAiBmiB,EAAEglD,OAAO10G,GAAG,OAAO0vD,GAAG,CAAC,IAAI3F,EAAE2F,EAAE68D,aAAa,GAAG,OAAOxiE,EAAE,CAACtqC,EAAEiwC,EAAEniB,MAAM,IAAI,IAAIxa,EACtfg3B,EAAEyiE,aAAa,OAAOz5F,GAAG,CAAC,GAAGA,EAAE+R,UAAUihB,GAAG,IAAKhzB,EAAE65F,aAAa90G,GAAG,CAAC,IAAI43C,EAAEt4C,OAAM2b,EAAEw6F,IAAI,EAAEzpH,GAAGA,IAAKsT,IAAI,EAAEs2G,GAAGh+D,EAAE38B,IAAI28B,EAAE+8D,OAAO3oH,EAAgB,QAAdivB,EAAE28B,EAAE+kD,aAAqB1hF,EAAE05F,OAAO3oH,GAAGsoH,GAAG18D,EAAEglD,OAAO5wG,GAAGimD,EAAE0iE,OAAO3oH,EAAE,KAAK,CAACivB,EAAEA,EAAE3Q,IAAI,CAAC,MAAM3C,EAAE,KAAKiwC,EAAEt4C,KAAIs4C,EAAEnvD,OAAOP,EAAEO,KAAK,KAAamvD,EAAEniB,MAAM,GAAG,OAAO9tB,EAAEA,EAAEi1F,OAAOhlD,OAAO,IAAIjwC,EAAEiwC,EAAE,OAAOjwC,GAAG,CAAC,GAAGA,IAAIzf,EAAE,CAACyf,EAAE,KAAK,KAAK,CAAa,GAAG,QAAfiwC,EAAEjwC,EAAEw1F,SAAoB,CAACvlD,EAAEglD,OAAOj1F,EAAEi1F,OAAOj1F,EAAEiwC,EAAE,KAAK,CAACjwC,EAAEA,EAAEi1F,MAAM,CAAChlD,EAAEjwC,CAAC,CAAC+2G,GAAGzwH,EAAE/F,EAAEoF,EAAE+nC,SAASrpC,GAAG9D,EAAEA,EAAEutC,KAAK,CAAC,OAAOvtC,EAAE,KAAK,EAAE,OAAOoF,EAAEpF,EAAEO,KAAsBwlD,GAAjBjuC,EAAE9X,EAAEwxH,cAAiBrkF,SAASm/E,GAAGtsH,EAAE8D,GACndiiD,EAAEA,EADod3gD,EAAEunH,GAAGvnH,EACpf0S,EAAEmpH,wBAA8BjhI,EAAEwiC,OAAO,EAAEg0F,GAAGzwH,EAAE/F,EAAE+lD,EAAEjiD,GAAG9D,EAAEutC,MAAM,KAAK,GAAG,OAAgBz1B,EAAE8zG,GAAXxmH,EAAEpF,EAAEO,KAAYP,EAAEwxH,cAA6B7oE,GAAG5iD,EAAE/F,EAAEoF,EAAtB0S,EAAE8zG,GAAGxmH,EAAE7E,KAAKuX,GAAciuC,EAAEjiD,GAAG,KAAK,GAAG,OAAO6yH,GAAG5wH,EAAE/F,EAAEA,EAAEO,KAAKP,EAAEwxH,aAAazrE,EAAEjiD,GAAG,KAAK,GAAG,OAAOiiD,EAAE/lD,EAAEO,KAAK6E,EAAEpF,EAAEwxH,aAAapsH,EAAEpF,EAAEk7F,cAAcn1C,EAAE3gD,EAAEwmH,GAAG7lE,EAAE3gD,GAAG,OAAOW,IAAIA,EAAE0uG,UAAU,KAAKz0G,EAAEy0G,UAAU,KAAKz0G,EAAEwiC,OAAO,GAAGxiC,EAAEoX,IAAI,EAAE6xG,GAAGljE,IAAIhgD,GAAE,EAAGujH,GAAGtpH,IAAI+F,GAAE,EAAGumH,GAAGtsH,EAAE8D,GAAG+qH,GAAG7uH,EAAE+lD,EAAE3gD,GAAG6pH,GAAGjvH,EAAE+lD,EAAE3gD,EAAEtB,GAAGszH,GAAG,KAAKp3H,EAAE+lD,GAAE,EAAGhgD,EAAEjC,GAAG,KAAK,GAAG,OAAO60H,GAAG5yH,EAAE/F,EAAE8D,GAAG,KAAK,GAAoB,KAAK,GAAG,OAAO+yH,GAAG9wH,EAAE/F,EAAE8D,GAAG,MAAM3G,MAAM8I,EAAE,IAAIjG,EAAEoX,KAC/e,EAYAkpH,GAAGhiI,UAAU63C,OAAO,SAASpwC,GAAGm6H,GAAGn6H,EAAEjM,KAAK2mI,cAAc,KAAK,KAAK,EAAEH,GAAGhiI,UAAU4iI,QAAQ,WAAW,IAAIn7H,EAAEjM,KAAK2mI,cAAczgI,EAAE+F,EAAE+wG,cAAcopB,GAAG,KAAKn6H,EAAE,MAAK,WAAW/F,EAAE0mH,IAAI,IAAI,GAAE,EAEkJvR,GAAG,SAASpvG,GAAM,KAAKA,EAAEqR,MAAgBm3G,GAAGxoH,EAAE,EAAVsoH,MAAegS,GAAGt6H,EAAE,GAAG,EAAEqvG,GAAG,SAASrvG,GAAM,KAAKA,EAAEqR,MAAgBm3G,GAAGxoH,EAAE,SAAVsoH,MAAsBgS,GAAGt6H,EAAE,UAAU,EAC7csvG,GAAG,SAAStvG,GAAG,GAAG,KAAKA,EAAEqR,IAAI,CAAC,IAAIpX,EAAEquH,KAAKvqH,EAAEwqH,GAAGvoH,GAAGwoH,GAAGxoH,EAAEjC,EAAE9D,GAAGqgI,GAAGt6H,EAAEjC,EAAE,CAAC,EAAEwxG,GAAG,SAASvvG,EAAE/F,GAAG,OAAOA,GAAG,EAChG6yG,GAAG,SAAS9sG,EAAE/F,EAAE8D,GAAG,OAAO9D,GAAG,IAAK,QAAyB,GAAjBqtG,GAAGtnG,EAAEjC,GAAG9D,EAAE8D,EAAEwJ,KAAQ,UAAUxJ,EAAEvD,MAAM,MAAMP,EAAE,CAAC,IAAI8D,EAAEiC,EAAEjC,EAAE23B,YAAY33B,EAAEA,EAAE23B,WAAsF,IAA3E33B,EAAEA,EAAEw5C,iBAAiB,cAAczW,KAAKC,UAAU,GAAG9mC,GAAG,mBAAuBA,EAAE,EAAEA,EAAE8D,EAAEvH,OAAOyD,IAAI,CAAC,IAAI+lD,EAAEjiD,EAAE9D,GAAG,GAAG+lD,IAAIhgD,GAAGggD,EAAEo7E,OAAOp7H,EAAEo7H,KAAK,CAAC,IAAI/7H,EAAE+tG,GAAGptD,GAAG,IAAI3gD,EAAE,MAAMjI,MAAM8I,EAAE,KAAK0mG,GAAG5mD,GAAGsnD,GAAGtnD,EAAE3gD,EAAE,CAAC,CAAC,CAAC,MAAM,IAAK,WAAW4oG,GAAGjoG,EAAEjC,GAAG,MAAM,IAAK,SAAmB,OAAV9D,EAAE8D,EAAElF,QAAe6uG,GAAG1nG,IAAIjC,EAAEi1H,SAAS/4H,GAAE,GAAI,EAAEszG,GAAGmrB,GAC9ZlrB,GAAG,SAASxtG,EAAE/F,EAAE8D,EAAEiiD,EAAE3gD,GAAG,IAAI0S,EAAEgkH,GAAEA,IAAG,EAAE,IAAI,OAAOxQ,GAAG,GAAGvlH,EAAEwJ,KAAK,KAAKvP,EAAE8D,EAAEiiD,EAAE3gD,GAAG,CAAC,QAAY,KAAJ02H,GAAEhkH,KAAUwkH,KAAK9Q,KAAK,CAAC,EAAEhY,GAAG,WAAW,IAAO,GAAFsoB,MAhD/H,SAASsF,KAAK,GAAG,OAAOtE,GAAG,CAAC,IAAI/2H,EAAE+2H,GAAGA,GAAG,KAAK/2H,EAAEigB,SAAQ,SAASjgB,GAAGA,EAAEgzG,cAAc,GAAGhzG,EAAE+yG,aAAa2kB,GAAG13H,EAAE4Q,KAAI,GAAE,CAAC60G,IAAI,CAgDkB4V,GAAKrD,KAAK,EAAEtqB,GAAG,SAAS1tG,EAAE/F,GAAG,IAAI8D,EAAEg4H,GAAEA,IAAG,EAAE,IAAI,OAAO/1H,EAAE/F,EAAE,CAAC,QAAY,KAAJ87H,GAAEh4H,KAAUw4H,KAAK9Q,KAAK,CAAC,EAAyI,IAAI6V,GAAG,CAACC,OAAO,CAACruB,GAAG6P,GAAG3P,GAAGC,GAAGC,GAAG0qB,GAAG,CAACv1G,SAAQ,KAAM+4G,GAAG,CAACC,wBAAwB9qB,GAAG+qB,WAAW,EAAE7mH,QAAQ,SAAS8mH,oBAAoB,aACveC,GAAG,CAACF,WAAWF,GAAGE,WAAW7mH,QAAQ2mH,GAAG3mH,QAAQ8mH,oBAAoBH,GAAGG,oBAAoBE,eAAeL,GAAGK,eAAeC,kBAAkB,KAAKC,4BAA4B,KAAKC,4BAA4B,KAAKC,cAAc,KAAKC,wBAAwB,KAAKC,wBAAwB,KAAKC,mBAAmB,KAAKC,eAAe,KAAKC,qBAAqBh4B,GAAG4nB,uBAAuBqQ,wBAAwB,SAASv8H,GAAW,OAAO,QAAfA,EAAEgvG,GAAGhvG,IAAmB,KAAKA,EAAEmtG,SAAS,EAAEsuB,wBAAwBD,GAAGC,yBAR/I,SAASe,KAAK,OAAO,IAAI,EASjXC,4BAA4B,KAAKC,gBAAgB,KAAKC,aAAa,KAAKC,kBAAkB,KAAKC,gBAAgB,MAAM,GAAG,oBAAqBC,+BAA+B,CAAC,IAAIC,GAAGD,+BAA+B,IAAIC,GAAGC,YAAYD,GAAGE,cAAc,IAAIvZ,GAAGqZ,GAAGG,OAAOtB,IAAIjY,GAAGoZ,EAAE,CAAC,MAAM/8H,IAAG,CAAC,CAACrM,EAAQ4wG,mDAAmD+2B,GAAG3nI,EAAQwpI,aAAarC,GACnXnnI,EAAQypI,YAAY,SAASp9H,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,IAAIA,EAAE0vB,SAAS,OAAO1vB,EAAE,IAAI/F,EAAE+F,EAAEooH,gBAAgB,QAAG,IAASnuH,EAAE,CAAC,GAAG,mBAAoB+F,EAAEowC,OAAO,MAAMh5C,MAAM8I,EAAE,MAAM,MAAM9I,MAAM8I,EAAE,IAAI7H,OAAOyZ,KAAK9R,IAAK,CAAqC,OAA5BA,EAAE,QAAVA,EAAEgvG,GAAG/0G,IAAc,KAAK+F,EAAEmtG,SAAkB,EAAEx5G,EAAQ0pI,UAAU,SAASr9H,EAAE/F,GAAG,IAAI8D,EAAEg4H,GAAE,GAAG,IAAO,GAAFh4H,GAAM,OAAOiC,EAAE/F,GAAG87H,IAAG,EAAE,IAAI,GAAG/1H,EAAE,OAAOulH,GAAG,GAAGvlH,EAAEwJ,KAAK,KAAKvP,GAAG,CAAC,QAAQ87H,GAAEh4H,EAAE0nH,IAAI,CAAC,EAAE9xH,EAAQm9G,QAAQ,SAAS9wG,EAAE/F,EAAE8D,GAAG,IAAI48H,GAAG1gI,GAAG,MAAM7C,MAAM8I,EAAE,MAAM,OAAO06H,GAAG,KAAK56H,EAAE/F,GAAE,EAAG8D,EAAE,EACrdpK,EAAQy8C,OAAO,SAASpwC,EAAE/F,EAAE8D,GAAG,IAAI48H,GAAG1gI,GAAG,MAAM7C,MAAM8I,EAAE,MAAM,OAAO06H,GAAG,KAAK56H,EAAE/F,GAAE,EAAG8D,EAAE,EAAEpK,EAAQ2pI,uBAAuB,SAASt9H,GAAG,IAAI26H,GAAG36H,GAAG,MAAM5I,MAAM8I,EAAE,KAAK,QAAOF,EAAEq1H,sBAAqBsD,IAAG,WAAWiC,GAAG,KAAK,KAAK56H,GAAE,GAAG,WAAWA,EAAEq1H,oBAAoB,KAAKr1H,EAAE2gH,IAAI,IAAI,GAAE,KAAG,EAAM,EAAEhtH,EAAQ4pI,wBAAwB7E,GAAG/kI,EAAQ6pI,sBAAsB,SAASx9H,EAAE/F,GAAG,OAAO6gI,GAAG96H,EAAE/F,EAAE,EAAEgB,UAAUzE,aAAQ,IAASyE,UAAU,GAAGA,UAAU,GAAG,KAAK,EACnbtH,EAAQ8pI,oCAAoC,SAASz9H,EAAE/F,EAAE8D,EAAEiiD,GAAG,IAAI26E,GAAG58H,GAAG,MAAM3G,MAAM8I,EAAE,MAAM,GAAG,MAAMF,QAAG,IAASA,EAAEooH,gBAAgB,MAAMhxH,MAAM8I,EAAE,KAAK,OAAO06H,GAAG56H,EAAE/F,EAAE8D,GAAE,EAAGiiD,EAAE,EAAErsD,EAAQkhB,QAAQ,wCCtS7L,SAAS6oH,WAEP,GAC4C,oBAAnCZ,gCAC4C,mBAA5CA,+BAA+BY,SAcxC,IAEEZ,+BAA+BY,SAASA,SAC1C,CAAE,MAAO9uH,GAGPtP,QAAQC,MAAMqP,EAChB,CACF,CAKE8uH,GACA9pI,EAAOD,QAAU,EAAjB,qCC1BF,IAIIgqI,EAJAC,EAAY,EAAQ,OAEpBC,EAAY,gBAgCVC,EAAwB,SAASA,wBACnCt1E,WAAU,EAAO,mEACnB,EACAs1E,EAAsBjpC,WAAaipC,EACnC,IAAIC,EAA2B,SAASA,2BACtC,OAAOD,CACT,EA+BF,SAASE,YAAYC,GACnB,IAAIC,SAAkBD,EACtB,OAAI/mI,MAAMuD,QAAQwjI,GACT,QAELA,aAAqBn1G,OAIhB,SAELm1G,aAAqBL,EAAUx/G,SAC1B,aAAe6/G,EAAU74E,WAAW18C,MAAM,KAAK,GAEjDw1H,CACT,CAEA,SAASC,2BAA2BC,GAClC,SAASC,UAAUxpC,EAAY3yE,EAAOqyE,EAAUC,EAAeC,EAAUC,GACvE,IAAK,IAAIhoE,EAAOzxB,UAAUzE,OAAQkqE,EAAOxpE,MAAMw1B,EAAO,EAAIA,EAAO,EAAI,GAAIC,EAAO,EAAGA,EAAOD,EAAMC,IAC9F+zC,EAAK/zC,EAAO,GAAK1xB,UAAU0xB,GAK7B,OAFA+nE,EAAeA,GAAgBH,EAC/BC,EAAgBA,GAAiBqpC,EACV,MAAnB37G,EAAMqyE,GAMD6pC,EAASr/H,WAAMzE,EAAW,CAAC4nB,EAAOqyE,EAAUC,EAAeC,EAAUC,GAAcv0F,OAAOugE,IAJ7Fm0B,EACK,IAAIz9F,MAAM,YAFAq9F,EAE6B,KAAOC,EAApC,2BAAsFF,EAAgB,WADzH,CAMJ,CAEA,IAAI8pC,EAAmBD,UAAU70H,KAAK,MAAM,GAG5C,OAFA80H,EAAiBzpC,WAAawpC,UAAU70H,KAAK,MAAM,GAE5C80H,CACT,CAcA,SAASC,kCAAkCC,EAAcC,GACvD,OAbF,SAASC,2BAA2BC,EAAoBC,GAStD,OAAOT,4BARP,SAASC,SAASl8G,EAAOqyE,EAAUC,EAAeC,EAAUC,GAC1D,IAAIupC,EAAY/7G,EAAMqyE,GACtB,IAAKqqC,EAA4BX,GAAY,CAC3C,IAAIC,EAAWF,YAAYC,GAC3B,OAAO,IAAI7mI,MAAM,WAAaq9F,EAAW,KAAOC,EAAe,cAAgBwpC,EAA9D,kBAAmG1pC,EAAgB,gBAAkBmqC,EAAqB,KAC7K,CACA,OAAO,IACT,GAEF,CAGSD,CAA2B,YAAcF,GAAc,SAAUP,GACtE,OAAOL,EAAUx/G,SAASoiC,WAAWy9E,IAAcQ,EAAUR,EAC/D,GACF,EAtFEN,EAAqB,CACnBkB,OAAQd,EACRe,MAAOf,EACPgB,aAAchB,EACdiB,MAAOjB,EACPkB,aAAclB,EACdmB,QAASnB,EACToB,WAAYpB,EACZqB,SAAUrB,EACVvoC,MAAOuoC,EACPn1F,SAAUm1F,EACVsB,YAAatB,EACbuB,mBAAoBvB,EAEpB39H,KAAM09H,EACN3zG,IAAK2zG,EACLyB,WAAYzB,EACZx9H,IAAKw9H,EACL0B,WAAY1B,EACZt2H,MAAOs2H,EACPj3E,IAAKi3E,EACLviE,OAAQuiE,EACR7hH,SAAU6hH,IAIK7hH,SAASk6C,QAAUooE,kCAAkC,UAAWX,EAAUx/G,SAAS0iC,WACtG68E,EAAmB1hH,SAAS0lD,MAAQ48D,kCAAkC,QAASX,EAAUx/G,SAASuiC,SA+NlG/sD,EAAOD,QAAUgqI,8BCpSJ,IAAI1jI,EAAE,MAAM8D,EAAE,MAAMiiD,EAAE,MAAM3gD,EAAE,MAAM0S,EAAE,MAAM2H,EAAE,MAAMiwC,EAAE,MAAM3F,EAAE,MAAMh3B,EAAE,MAAMjxB,EAAE,MAAMD,EAAE,MAAMqjG,GAAE,MAAMqhB,GAAE,MAAM3d,GAAE,MAAM0d,GAAE,MAAMt8D,GAAE,MAAMvmB,GAAE,MACnJ,GAAG,mBAAoB9lC,QAAQA,OAAOkyB,IAAI,CAAC,IAAI7pB,GAAErI,OAAOkyB,IAAI7vB,EAAEgG,GAAE,iBAAiBlC,EAAEkC,GAAE,gBAAgB+/C,EAAE//C,GAAE,kBAAkBZ,EAAEY,GAAE,qBAAqB8R,EAAE9R,GAAE,kBAAkByZ,EAAEzZ,GAAE,kBAAkB0pD,EAAE1pD,GAAE,iBAAiB+jD,EAAE/jD,GAAE,qBAAqB+sB,EAAE/sB,GAAE,kBAAkBlE,EAAEkE,GAAE,uBAAuBnE,EAAEmE,GAAE,cAAck/F,GAAEl/F,GAAE,cAAcugH,GAAEvgH,GAAE,eAAe4iG,GAAE5iG,GAAE,sBAAsBsgH,GAAEtgH,GAAE,qBAAqBgkD,GAAEhkD,GAAE,0BAA0By9B,GAAEz9B,GAAE,sBAAsB,CACjc,SAASC,EAAEF,GAAG,GAAG,iBAAkBA,GAAG,OAAOA,EAAE,CAAC,IAAIygH,EAAEzgH,EAAE4pB,SAAS,OAAO62F,GAAG,KAAKxmH,EAAE,OAAO+F,EAAEA,EAAExF,MAAQ,KAAKwlD,EAAE,KAAKjuC,EAAE,KAAK1S,EAAE,KAAK2tB,EAAE,KAAKjxB,EAAE,OAAOiE,EAAE,QAAQ,OAAOA,EAAEA,GAAGA,EAAE4pB,UAAY,KAAK+/B,EAAE,KAAK3F,EAAE,KAAKm7C,GAAE,KAAKrjG,EAAE,KAAK4d,EAAE,OAAO1Z,EAAE,QAAQ,OAAOygH,GAAG,KAAK1iH,EAAE,OAAO0iH,EAAE,CAAC,CAAC,IAAIH,GAAE5mG,EAAEoG,GAAE7lB,EAAE8lB,GAAEikC,EAAEpuC,GAAEoqC,EAAE8jD,GAAE3E,GAAEr4F,GAAEhL,EAAEoW,GAAEnU,EAAE8hH,GAAE9tG,EAAE0wG,GAAEpjH,EAAEqjH,GAAE11F,EAAEr5B,EAAQ8rI,gBAAgB91E,EAAEh2D,EAAQ+rI,gBAAgBpf,GAAE3sH,EAAQs8B,QAAQnQ,GAAEnsB,EAAQorD,WAAWh/B,GAAEpsB,EAAQgsI,SAAS/pH,GAAEjiB,EAAQisI,KAAK97B,GAAEnwG,EAAQqrD,KAAKl4C,GAAEnT,EAAQksI,OAAO3tH,GAAEve,EAAQmsI,SAASjgB,GAAElsH,EAAQosI,WAAWtd,GAClf9uH,EAAQqsI,SAAStd,GAAE/uH,EAAQssI,YAAY,WAAW,OAAM,CAAE,EAAEtsI,EAAQusI,iBAAiB,WAAW,OAAM,CAAE,EAAEvsI,EAAQwsI,kBAAkB,SAASngI,GAAG,OAAOE,EAAEF,KAAK2pD,CAAC,EAAEh2D,EAAQysI,kBAAkB,SAASpgI,GAAG,OAAOE,EAAEF,KAAK0Z,CAAC,EAAE/lB,EAAQ49F,UAAU,SAASvxF,GAAG,MAAM,iBAAkBA,GAAG,OAAOA,GAAGA,EAAE4pB,WAAW3vB,CAAC,EAAEtG,EAAQ0sI,aAAa,SAASrgI,GAAG,OAAOE,EAAEF,KAAKgkD,CAAC,EAAErwD,EAAQ2sI,WAAW,SAAStgI,GAAG,OAAOE,EAAEF,KAAKggD,CAAC,EAAErsD,EAAQ4sI,OAAO,SAASvgI,GAAG,OAAOE,EAAEF,KAAKm/F,EAAC,EAAExrG,EAAQmrD,OAAO,SAAS9+C,GAAG,OAAOE,EAAEF,KAAKlE,CAAC,EACnenI,EAAQ6sI,SAAS,SAASxgI,GAAG,OAAOE,EAAEF,KAAKjC,CAAC,EAAEpK,EAAQ8sI,WAAW,SAASzgI,GAAG,OAAOE,EAAEF,KAAK+R,CAAC,EAAEpe,EAAQ+sI,aAAa,SAAS1gI,GAAG,OAAOE,EAAEF,KAAKX,CAAC,EAAE1L,EAAQgtI,WAAW,SAAS3gI,GAAG,OAAOE,EAAEF,KAAKgtB,CAAC,EAAEr5B,EAAQitI,mBAAmB,SAAS5gI,GAAG,MAAM,iBAAkBA,GAAG,mBAAoBA,GAAGA,IAAIggD,GAAGhgD,IAAI+R,GAAG/R,IAAIikD,IAAGjkD,IAAIX,GAAGW,IAAIgtB,GAAGhtB,IAAIjE,GAAGiE,IAAI09B,IAAG,iBAAkB19B,GAAG,OAAOA,IAAIA,EAAE4pB,WAAWu1E,IAAGn/F,EAAE4pB,WAAW9tB,GAAGkE,EAAE4pB,WAAWlQ,GAAG1Z,EAAE4pB,WAAW+/B,GAAG3pD,EAAE4pB,WAAWo6B,GAAGhkD,EAAE4pB,WAAW22F,IAAGvgH,EAAE4pB,WAAW42F,IAAGxgH,EAAE,KAAK6iG,GAAQ,EACzelvG,EAAQktI,OAAO3gI,gCCVbtM,EAAOD,QAAU,EAAjB,qCCKW,IAAIq5B,EAAE,EAAQ,OAAiBlxB,EAAE,MAAMqjG,EAAE,MAAMxrG,EAAQgsI,SAAS,MAAMhsI,EAAQosI,WAAW,MAAMpsI,EAAQmsI,SAAS,MAAM,IAAItf,EAAE,MAAM3d,EAAE,MAAM4d,EAAE,MAAM9sH,EAAQqsI,SAAS,MAAM,IAAIzf,EAAE,MAAMt8D,EAAE,MACpM,GAAG,mBAAoBrsD,QAAQA,OAAOkyB,IAAI,CAAC,IAAI4T,EAAE9lC,OAAOkyB,IAAIhuB,EAAE4hC,EAAE,iBAAiByhE,EAAEzhE,EAAE,gBAAgB/pC,EAAQgsI,SAASjiG,EAAE,kBAAkB/pC,EAAQosI,WAAWriG,EAAE,qBAAqB/pC,EAAQmsI,SAASpiG,EAAE,kBAAkB8iF,EAAE9iF,EAAE,kBAAkBmlE,EAAEnlE,EAAE,iBAAiB+iF,EAAE/iF,EAAE,qBAAqB/pC,EAAQqsI,SAAStiG,EAAE,kBAAkB6iF,EAAE7iF,EAAE,cAAcumB,EAAEvmB,EAAE,aAAa,CAAC,IAAIz9B,EAAE,mBAAoBrI,QAAQA,OAAOukB,SACtR,SAASmkG,EAAEtgH,GAAG,IAAI,IAAI/F,EAAE,yDAAyD+F,EAAEjC,EAAE,EAAEA,EAAE9C,UAAUzE,OAAOuH,IAAI9D,GAAG,WAAWmS,mBAAmBnR,UAAU8C,IAAI,MAAM,yBAAyBiC,EAAE,WAAW/F,EAAE,gHAAgH,CACpb,IAAI6lB,GAAE,CAACqoG,UAAU,WAAW,OAAM,CAAE,EAAEO,mBAAmB,WAAW,EAAED,oBAAoB,WAAW,EAAEJ,gBAAgB,WAAW,GAAGtoG,GAAE,CAAC,EAAE,SAASnK,EAAE5V,EAAE/F,EAAE8D,GAAGhK,KAAKmuB,MAAMliB,EAAEjM,KAAKgrC,QAAQ9kC,EAAElG,KAAK6mG,KAAK76E,GAAEhsB,KAAK23D,QAAQ3tD,GAAG+hB,EAAC,CACrN,SAASgkF,IAAI,CAAyB,SAASh9F,EAAE9G,EAAE/F,EAAE8D,GAAGhK,KAAKmuB,MAAMliB,EAAEjM,KAAKgrC,QAAQ9kC,EAAElG,KAAK6mG,KAAK76E,GAAEhsB,KAAK23D,QAAQ3tD,GAAG+hB,EAAC,CADqGlK,EAAErd,UAAUwhI,iBAAiB,CAAC,EAAEnkH,EAAErd,UAAU8oG,SAAS,SAASrhG,EAAE/F,GAAG,GAAG,iBAAkB+F,GAAG,mBAAoBA,GAAG,MAAMA,EAAE,MAAM5I,MAAMkpH,EAAE,KAAKvsH,KAAK23D,QAAQ28D,gBAAgBt0H,KAAKiM,EAAE/F,EAAE,WAAW,EAAE2b,EAAErd,UAAUuoI,YAAY,SAAS9gI,GAAGjM,KAAK23D,QAAQg9D,mBAAmB30H,KAAKiM,EAAE,cAAc,EACje8jG,EAAEvrG,UAAUqd,EAAErd,UAAsF,IAAI2Z,GAAEpL,EAAEvO,UAAU,IAAIurG,EAAE5xF,GAAE/K,YAAYL,EAAEkmB,EAAE9a,GAAE0D,EAAErd,WAAW2Z,GAAE22G,sBAAqB,EAAG,IAAIhJ,GAAE,CAACp9F,QAAQ,MAAMggG,GAAEpqH,OAAOE,UAAU4R,eAAeu4G,GAAE,CAACl4G,KAAI,EAAG+3C,KAAI,EAAGw+E,QAAO,EAAGC,UAAS,GAChS,SAASlgB,EAAE9gH,EAAE/F,EAAE8D,GAAG,IAAIsB,EAAE2gD,EAAE,CAAC,EAAEgE,EAAE,KAAK2F,EAAE,KAAK,GAAG,MAAM1vD,EAAE,IAAIoF,UAAK,IAASpF,EAAEsoD,MAAMoH,EAAE1vD,EAAEsoD,UAAK,IAAStoD,EAAEuQ,MAAMw5C,EAAE,GAAG/pD,EAAEuQ,KAAKvQ,EAAEwoH,GAAErmH,KAAKnC,EAAEoF,KAAKqjH,GAAEv4G,eAAe9K,KAAK2gD,EAAE3gD,GAAGpF,EAAEoF,IAAI,IAAIqa,EAAEze,UAAUzE,OAAO,EAAE,GAAG,IAAIkjB,EAAEsmC,EAAE5Y,SAASrpC,OAAO,GAAG,EAAE2b,EAAE,CAAC,IAAI,IAAI3H,EAAE7a,MAAMwiB,GAAG3d,EAAE,EAAEA,EAAE2d,EAAE3d,IAAIgW,EAAEhW,GAAGd,UAAUc,EAAE,GAAGikD,EAAE5Y,SAASr1B,CAAC,CAAC,GAAG/R,GAAGA,EAAEm+C,aAAa,IAAI9+C,KAAKqa,EAAE1Z,EAAEm+C,kBAAe,IAAS6B,EAAE3gD,KAAK2gD,EAAE3gD,GAAGqa,EAAEra,IAAI,MAAM,CAACuqB,SAAS9tB,EAAEtB,KAAKwF,EAAEwK,IAAIw5C,EAAEzB,IAAIoH,EAAEznC,MAAM89B,EAAEypE,OAAO5J,GAAEp9F,QAAQ,CAChV,SAASw+F,EAAEjhH,GAAG,MAAM,iBAAkBA,GAAG,OAAOA,GAAGA,EAAE4pB,WAAW9tB,CAAC,CAAoG,IAAI8mH,GAAE,OAAO,SAASC,EAAE7iH,EAAE/F,GAAG,MAAM,iBAAkB+F,GAAG,OAAOA,GAAG,MAAMA,EAAEwK,IAA7K,SAASie,OAAOzoB,GAAG,IAAI/F,EAAE,CAAC,IAAI,KAAK,IAAI,MAAM,MAAM,IAAI+F,EAAErL,QAAQ,SAAQ,SAASqL,GAAG,OAAO/F,EAAE+F,EAAE,GAAE,CAA+EyoB,CAAO,GAAGzoB,EAAEwK,KAAKvQ,EAAEc,SAAS,GAAG,CAC/W,SAAS6V,EAAE5Q,EAAE/F,EAAE8D,EAAEsB,EAAE2gD,GAAG,IAAIgE,SAAShkD,EAAK,cAAcgkD,GAAG,YAAYA,IAAEhkD,EAAE,MAAK,IAAI2pD,GAAE,EAAG,GAAG,OAAO3pD,EAAE2pD,GAAE,OAAQ,OAAO3F,GAAG,IAAK,SAAS,IAAK,SAAS2F,GAAE,EAAG,MAAM,IAAK,SAAS,OAAO3pD,EAAE4pB,UAAU,KAAK9tB,EAAE,KAAKqjG,EAAEx1C,GAAE,GAAI,GAAGA,EAAE,OAAW3J,EAAEA,EAAN2J,EAAE3pD,GAASA,EAAE,KAAKX,EAAE,IAAIwjH,EAAEl5D,EAAE,GAAGtqD,EAAEnI,MAAMuD,QAAQulD,IAAIjiD,EAAE,GAAG,MAAMiC,IAAIjC,EAAEiC,EAAErL,QAAQiuH,GAAE,OAAO,KAAKhyG,EAAEovC,EAAE/lD,EAAE8D,EAAE,IAAG,SAASiC,GAAG,OAAOA,CAAC,KAAI,MAAMggD,IAAIihE,EAAEjhE,KAAKA,EAD/W,SAAS+gE,EAAE/gH,EAAE/F,GAAG,MAAM,CAAC2vB,SAAS9tB,EAAEtB,KAAKwF,EAAExF,KAAKgQ,IAAIvQ,EAAEsoD,IAAIviD,EAAEuiD,IAAIrgC,MAAMliB,EAAEkiB,MAAMunG,OAAOzpH,EAAEypH,OAAO,CACqR1I,CAAE/gE,EAAEjiD,IAAIiiD,EAAEx1C,KAAKm/C,GAAGA,EAAEn/C,MAAMw1C,EAAEx1C,IAAI,IAAI,GAAGw1C,EAAEx1C,KAAK7V,QAAQiuH,GAAE,OAAO,KAAK5iH,IAAI/F,EAAEpD,KAAKmpD,IAAI,EAAyB,GAAvB2J,EAAE,EAAEtqD,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAOnI,MAAMuD,QAAQuF,GAAG,IAAI,IAAI0Z,EACzf,EAAEA,EAAE1Z,EAAExJ,OAAOkjB,IAAI,CAAQ,IAAI3H,EAAE1S,EAAEwjH,EAAf7+D,EAAEhkD,EAAE0Z,GAAeA,GAAGiwC,GAAG/4C,EAAEozC,EAAE/pD,EAAE8D,EAAEgU,EAAEiuC,EAAE,MAAM,GAAGjuC,EANhE,SAAS7R,EAAEF,GAAG,OAAG,OAAOA,GAAG,iBAAkBA,EAAS,KAAsC,mBAAjCA,EAAEC,GAAGD,EAAEC,IAAID,EAAE,eAA0CA,EAAE,IAAI,CAMtDE,CAAEF,GAAG,mBAAoB+R,EAAE,IAAI/R,EAAE+R,EAAE3V,KAAK4D,GAAG0Z,EAAE,IAAIsqC,EAAEhkD,EAAEqc,QAAQjK,MAA6Bu3C,GAAG/4C,EAA1BozC,EAAEA,EAAEnrD,MAA0BoB,EAAE8D,EAAtBgU,EAAE1S,EAAEwjH,EAAE7+D,EAAEtqC,KAAkBsmC,QAAQ,GAAG,WAAWgE,EAAE,MAAM/pD,EAAE,GAAG+F,EAAE5I,MAAMkpH,EAAE,GAAG,oBAAoBrmH,EAAE,qBAAqB5B,OAAOyZ,KAAK9R,GAAGhJ,KAAK,MAAM,IAAIiD,IAAI,OAAO0vD,CAAC,CAAC,SAASrwC,EAAEtZ,EAAE/F,EAAE8D,GAAG,GAAG,MAAMiC,EAAE,OAAOA,EAAE,IAAIX,EAAE,GAAG2gD,EAAE,EAAmD,OAAjDpvC,EAAE5Q,EAAEX,EAAE,GAAG,IAAG,SAASW,GAAG,OAAO/F,EAAEmC,KAAK2B,EAAEiC,EAAEggD,IAAI,IAAU3gD,CAAC,CAC3Z,SAAS2hH,EAAEhhH,GAAG,IAAI,IAAIA,EAAEihI,QAAQ,CAAC,IAAIhnI,EAAE+F,EAAEkhI,QAAQjnI,EAAEA,IAAI+F,EAAEihI,QAAQ,EAAEjhI,EAAEkhI,QAAQjnI,EAAEA,EAAEy7H,MAAK,SAASz7H,GAAG,IAAI+F,EAAEihI,UAAUhnI,EAAEA,EAAEwQ,QAAQzK,EAAEihI,QAAQ,EAAEjhI,EAAEkhI,QAAQjnI,EAAE,IAAE,SAASA,GAAG,IAAI+F,EAAEihI,UAAUjhI,EAAEihI,QAAQ,EAAEjhI,EAAEkhI,QAAQjnI,EAAE,GAAE,CAAC,GAAG,IAAI+F,EAAEihI,QAAQ,OAAOjhI,EAAEkhI,QAAQ,MAAMlhI,EAAEkhI,OAAQ,CAAC,IAAIzlG,GAAE,CAAChZ,QAAQ,MAAM,SAASnC,IAAI,IAAItgB,EAAEy7B,GAAEhZ,QAAQ,GAAG,OAAOziB,EAAE,MAAM5I,MAAMkpH,EAAE,MAAM,OAAOtgH,CAAC,CAAC,IAAImgB,GAAE,CAAC+rG,uBAAuBzwF,GAAEmqF,wBAAwB,CAAC1T,WAAW,GAAGse,kBAAkB3Q,GAAEshB,qBAAqB,CAAC1+G,SAAQ,GAAI5S,OAAOmd,GACjer5B,EAAQ4sG,SAAS,CAACp2E,IAAI7Q,EAAE2G,QAAQ,SAASjgB,EAAE/F,EAAE8D,GAAGub,EAAEtZ,GAAE,WAAW/F,EAAE8E,MAAMhL,KAAKkH,UAAU,GAAE8C,EAAE,EAAE4/B,MAAM,SAAS39B,GAAG,IAAI/F,EAAE,EAAuB,OAArBqf,EAAEtZ,GAAE,WAAW/F,GAAG,IAAUA,CAAC,EAAEwrD,QAAQ,SAASzlD,GAAG,OAAOsZ,EAAEtZ,GAAE,SAASA,GAAG,OAAOA,CAAC,KAAI,EAAE,EAAEwgG,KAAK,SAASxgG,GAAG,IAAIihH,EAAEjhH,GAAG,MAAM5I,MAAMkpH,EAAE,MAAM,OAAOtgH,CAAC,GAAGrM,EAAQ67C,UAAU55B,EAAEjiB,EAAQotG,cAAcj6F,EAAEnT,EAAQ4wG,mDAAmDpkF,GAChXxsB,EAAQmtG,aAAa,SAAS9gG,EAAE/F,EAAE8D,GAAG,GAAG,MAAOiC,EAAc,MAAM5I,MAAMkpH,EAAE,IAAItgH,IAAI,IAAIX,EAAE2tB,EAAE,CAAC,EAAEhtB,EAAEkiB,OAAO89B,EAAEhgD,EAAEwK,IAAIw5C,EAAEhkD,EAAEuiD,IAAIoH,EAAE3pD,EAAEypH,OAAO,GAAG,MAAMxvH,EAAE,CAAoE,QAAnE,IAASA,EAAEsoD,MAAMyB,EAAE/pD,EAAEsoD,IAAIoH,EAAEk2D,GAAEp9F,cAAS,IAASxoB,EAAEuQ,MAAMw1C,EAAE,GAAG/lD,EAAEuQ,KAAQxK,EAAExF,MAAMwF,EAAExF,KAAK2jD,aAAa,IAAIzkC,EAAE1Z,EAAExF,KAAK2jD,aAAa,IAAIpsC,KAAK9X,EAAEwoH,GAAErmH,KAAKnC,EAAE8X,KAAK2wG,GAAEv4G,eAAe4H,KAAK1S,EAAE0S,QAAG,IAAS9X,EAAE8X,SAAI,IAAS2H,EAAEA,EAAE3H,GAAG9X,EAAE8X,GAAG,CAAC,IAAIA,EAAE9W,UAAUzE,OAAO,EAAE,GAAG,IAAIub,EAAE1S,EAAE+nC,SAASrpC,OAAO,GAAG,EAAEgU,EAAE,CAAC2H,EAAExiB,MAAM6a,GAAG,IAAI,IAAIhW,EAAE,EAAEA,EAAEgW,EAAEhW,IAAI2d,EAAE3d,GAAGd,UAAUc,EAAE,GAAGsD,EAAE+nC,SAAS1tB,CAAC,CAAC,MAAM,CAACkQ,SAAS9tB,EAAEtB,KAAKwF,EAAExF,KACxfgQ,IAAIw1C,EAAEuC,IAAIyB,EAAE9hC,MAAM7iB,EAAEoqH,OAAO9/D,EAAE,EAAEh2D,EAAQytI,cAAc,SAASphI,EAAE/F,GAA8K,YAA3K,IAASA,IAAIA,EAAE,OAAM+F,EAAE,CAAC4pB,SAASi5E,EAAEo4B,sBAAsBhhI,EAAEmsH,cAAcpmH,EAAEqhI,eAAerhI,EAAEshI,aAAa,EAAEC,SAAS,KAAKC,SAAS,OAAQD,SAAS,CAAC33G,SAAS42F,EAAEta,SAASlmG,GAAUA,EAAEwhI,SAASxhI,CAAC,EAAErM,EAAQqZ,cAAc8zG,EAAEntH,EAAQ8tI,cAAc,SAASzhI,GAAG,IAAI/F,EAAE6mH,EAAEt3G,KAAK,KAAKxJ,GAAY,OAAT/F,EAAEO,KAAKwF,EAAS/F,CAAC,EAAEtG,EAAQ+tI,UAAU,WAAW,MAAM,CAACj/G,QAAQ,KAAK,EAAE9uB,EAAQguI,WAAW,SAAS3hI,GAAG,MAAM,CAAC4pB,SAAS62F,EAAErwE,OAAOpwC,EAAE,EAAErM,EAAQiuI,eAAe3gB,EAC3ettH,EAAQkuI,KAAK,SAAS7hI,GAAG,MAAM,CAAC4pB,SAASq6B,EAAEkiD,SAAS,CAAC86B,SAAS,EAAEC,QAAQlhI,GAAGomG,MAAM4a,EAAE,EAAErtH,EAAQg2F,KAAK,SAAS3pF,EAAE/F,GAAG,MAAM,CAAC2vB,SAAS22F,EAAE/lH,KAAKwF,EAAED,aAAQ,IAAS9F,EAAE,KAAKA,EAAE,EAAEtG,EAAQ87H,YAAY,SAASzvH,EAAE/F,GAAG,OAAOqmB,IAAImvG,YAAYzvH,EAAE/F,EAAE,EAAEtG,EAAQ+7H,WAAW,SAAS1vH,EAAE/F,GAAG,OAAOqmB,IAAIovG,WAAW1vH,EAAE/F,EAAE,EAAEtG,EAAQq8H,cAAc,WAAW,EAAEr8H,EAAQw6H,UAAU,SAASnuH,EAAE/F,GAAG,OAAOqmB,IAAI6tG,UAAUnuH,EAAE/F,EAAE,EAAEtG,EAAQg8H,oBAAoB,SAAS3vH,EAAE/F,EAAE8D,GAAG,OAAOuiB,IAAIqvG,oBAAoB3vH,EAAE/F,EAAE8D,EAAE,EAChdpK,EAAQi8H,gBAAgB,SAAS5vH,EAAE/F,GAAG,OAAOqmB,IAAIsvG,gBAAgB5vH,EAAE/F,EAAE,EAAEtG,EAAQk8H,QAAQ,SAAS7vH,EAAE/F,GAAG,OAAOqmB,IAAIuvG,QAAQ7vH,EAAE/F,EAAE,EAAEtG,EAAQm8H,WAAW,SAAS9vH,EAAE/F,EAAE8D,GAAG,OAAOuiB,IAAIwvG,WAAW9vH,EAAE/F,EAAE8D,EAAE,EAAEpK,EAAQo8H,OAAO,SAAS/vH,GAAG,OAAOsgB,IAAIyvG,OAAO/vH,EAAE,EAAErM,EAAQq6H,SAAS,SAAShuH,GAAG,OAAOsgB,IAAI0tG,SAAShuH,EAAE,EAAErM,EAAQkhB,QAAQ,uCCnBnTjhB,EAAOD,QAAU,EAAjB,+BCCF,IAAImuI,EAAQ,CAAC,EAEb,SAASC,gBAAgB5qI,EAAMsQ,EAASR,GACjCA,IACHA,EAAO7P,OAWT,IAAI8P,EAEJ,SAAU86H,GAGR,SAAS96H,UAAU+6H,EAAMC,EAAMC,GAC7B,OAAOH,EAAM5lI,KAAKrI,KAdtB,SAASiT,WAAWi7H,EAAMC,EAAMC,GAC9B,MAAuB,iBAAZ16H,EACFA,EAEAA,EAAQw6H,EAAMC,EAAMC,EAE/B,CAQ4Bn7H,CAAWi7H,EAAMC,EAAMC,KAAUpuI,IAC3D,CAEA,OA1BJ,SAASquI,eAAeriC,EAAUx/C,GAAcw/C,EAASxnG,UAAYF,OAAO6kB,OAAOqjC,EAAWhoD,WAAYwnG,EAASxnG,UAAU4O,YAAc44F,EAAUA,EAAS18E,UAAYk9B,CAAY,CAoBlL6hF,CAAel7H,UAAW86H,GAMnB96H,SACT,CARA,CAQED,GAEFC,EAAU3O,UAAUgP,KAAON,EAAKM,KAChCL,EAAU3O,UAAUpB,KAAOA,EAC3B2qI,EAAM3qI,GAAQ+P,CAChB,CAGA,SAASouF,MAAM+sC,EAAUC,GACvB,GAAIprI,MAAMuD,QAAQ4nI,GAAW,CAC3B,IAAIlsI,EAAMksI,EAAS7rI,OAKnB,OAJA6rI,EAAWA,EAASl4G,KAAI,SAAUr0B,GAChC,OAAOhB,OAAOgB,EAChB,IAEIK,EAAM,EACD,UAAUgK,OAAOmiI,EAAO,KAAKniI,OAAOkiI,EAASjpI,MAAM,EAAGjD,EAAM,GAAGa,KAAK,MAAO,SAAWqrI,EAASlsI,EAAM,GAC3F,IAARA,EACF,UAAUgK,OAAOmiI,EAAO,KAAKniI,OAAOkiI,EAAS,GAAI,QAAQliI,OAAOkiI,EAAS,IAEzE,MAAMliI,OAAOmiI,EAAO,KAAKniI,OAAOkiI,EAAS,GAEpD,CACE,MAAO,MAAMliI,OAAOmiI,EAAO,KAAKniI,OAAOrL,OAAOutI,GAElD,CA6BAN,gBAAgB,yBAAyB,SAAUx6H,EAAM1O,GACvD,MAAO,cAAgBA,EAAQ,4BAA8B0O,EAAO,GACtE,GAAG7O,WACHqpI,gBAAgB,wBAAwB,SAAUx6H,EAAM86H,EAAUnpI,GAEhE,IAAIqpI,EASAr6H,EAEJ,GATwB,iBAAbm6H,GAjCb,SAASzuF,WAAWl/C,EAAK2nH,EAAQh8G,GAC/B,OAAO3L,EAAI2I,QAAQgD,GAAOA,EAAM,EAAI,GAAKA,EAAKg8G,EAAO7lH,UAAY6lH,CACnE,CA+BsCzoE,CAAWyuF,EAAU,SACvDE,EAAa,cACbF,EAAWA,EAAS1tI,QAAQ,QAAS,KAErC4tI,EAAa,UAhCjB,SAASC,SAAS9tI,EAAK2nH,EAAQomB,GAK7B,YAJiBnoI,IAAbmoI,GAA0BA,EAAW/tI,EAAI8B,UAC3CisI,EAAW/tI,EAAI8B,QAGV9B,EAAIq4C,UAAU01F,EAAWpmB,EAAO7lH,OAAQisI,KAAcpmB,CAC/D,CA+BMmmB,CAASj7H,EAAM,aAEjBW,EAAM,OAAO/H,OAAOoH,EAAM,KAAKpH,OAAOoiI,EAAY,KAAKpiI,OAAOm1F,MAAM+sC,EAAU,aACzE,CACL,IAAI7nI,EAhCR,SAAS2G,SAASzM,EAAK2nH,EAAQhlH,GAK7B,MAJqB,iBAAVA,IACTA,EAAQ,KAGNA,EAAQglH,EAAO7lH,OAAS9B,EAAI8B,UAGS,IAAhC9B,EAAIQ,QAAQmnH,EAAQhlH,EAE/B,CAsBe8J,CAASoG,EAAM,KAAO,WAAa,WAC9CW,EAAM,QAAS/H,OAAOoH,EAAM,MAAOpH,OAAO3F,EAAM,KAAK2F,OAAOoiI,EAAY,KAAKpiI,OAAOm1F,MAAM+sC,EAAU,QACtG,CAGA,OADAn6H,GAAO,mBAAmB/H,cAAcjH,EAE1C,GAAGR,WACHqpI,gBAAgB,4BAA6B,2BAC7CA,gBAAgB,8BAA8B,SAAUx6H,GACtD,MAAO,OAASA,EAAO,4BACzB,IACAw6H,gBAAgB,6BAA8B,mBAC9CA,gBAAgB,wBAAwB,SAAUx6H,GAChD,MAAO,eAAiBA,EAAO,+BACjC,IACAw6H,gBAAgB,wBAAyB,kCACzCA,gBAAgB,yBAA0B,6BAC1CA,gBAAgB,6BAA8B,mBAC9CA,gBAAgB,yBAA0B,sCAAuCrpI,WACjFqpI,gBAAgB,wBAAwB,SAAUvpI,GAChD,MAAO,qBAAuBA,CAChC,GAAGE,WACHqpI,gBAAgB,qCAAsC,oCACtDnuI,EAAOD,QAAQ,EAAQmuI,+CCjGnBriH,EAAapnB,OAAOyZ,MAAQ,SAAU3X,GACxC,IAAI2X,EAAO,GACX,IAAK,IAAItH,KAAOrQ,EAAK2X,EAAKjb,KAAK2T,GAC/B,OAAOsH,CACT,EAGAle,EAAOD,QAAU+uI,OACjB,IAAIC,EAAW,EAAQ,OACnBC,EAAW,EAAQ,OACvB,EAAQ,MAAR,CAAoBF,OAAQC,GAI1B,IADA,IAAI7wH,EAAO2N,EAAWmjH,EAASrqI,WACtB0rD,EAAI,EAAGA,EAAInyC,EAAKtb,OAAQytD,IAAK,CACpC,IAAIz0C,EAASsC,EAAKmyC,GACby+E,OAAOnqI,UAAUiX,KAASkzH,OAAOnqI,UAAUiX,GAAUozH,EAASrqI,UAAUiX,GAC/E,CAEF,SAASkzH,OAAO/3H,GACd,KAAM5W,gBAAgB2uI,QAAS,OAAO,IAAIA,OAAO/3H,GACjDg4H,EAASvmI,KAAKrI,KAAM4W,GACpBi4H,EAASxmI,KAAKrI,KAAM4W,GACpB5W,KAAK8uI,eAAgB,EACjBl4H,KACuB,IAArBA,EAAQm4H,WAAoB/uI,KAAK+uI,UAAW,IACvB,IAArBn4H,EAAQtD,WAAoBtT,KAAKsT,UAAW,IAClB,IAA1BsD,EAAQk4H,gBACV9uI,KAAK8uI,eAAgB,EACrB9uI,KAAK+nC,KAAK,MAAOinG,QAGvB,CA8BA,SAASA,QAEHhvI,KAAKivI,eAAeC,OAIxBnuH,EAAQ6+E,SAASuvC,QAASnvI,KAC5B,CACA,SAASmvI,QAAQzpH,GACfA,EAAKniB,KACP,CAvCAe,OAAOmH,eAAekjI,OAAOnqI,UAAW,wBAAyB,CAI/DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,eAAeG,aAC7B,IAEF9qI,OAAOmH,eAAekjI,OAAOnqI,UAAW,iBAAkB,CAIxDkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,gBAAkBjvI,KAAKivI,eAAeI,WACpD,IAEF/qI,OAAOmH,eAAekjI,OAAOnqI,UAAW,iBAAkB,CAIxDkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,eAAexsI,MAC7B,IAeF6B,OAAOmH,eAAekjI,OAAOnqI,UAAW,YAAa,CAInDkH,YAAY,EACZC,IAAK,SAASA,MACZ,YAA4BpF,IAAxBvG,KAAKsvI,qBAAwD/oI,IAAxBvG,KAAKivI,iBAGvCjvI,KAAKsvI,eAAeC,WAAavvI,KAAKivI,eAAeM,UAC9D,EACAhjI,IAAK,SAASA,IAAIzH,QAGYyB,IAAxBvG,KAAKsvI,qBAAwD/oI,IAAxBvG,KAAKivI,iBAM9CjvI,KAAKsvI,eAAeC,UAAYzqI,EAChC9E,KAAKivI,eAAeM,UAAYzqI,EAClC,kCCjGFjF,EAAOD,QAAU4vI,YACjB,IAAIC,EAAY,EAAQ,OAExB,SAASD,YAAY54H,GACnB,KAAM5W,gBAAgBwvI,aAAc,OAAO,IAAIA,YAAY54H,GAC3D64H,EAAUpnI,KAAKrI,KAAM4W,EACvB,CAJA,EAAQ,MAAR,CAAoB44H,YAAaC,GAKjCD,YAAYhrI,UAAUkrI,WAAa,SAAUC,EAAO1qI,EAAUy7C,GAC5DA,EAAG,KAAMivF,EACX,oCCVIhB,aAHJ9uI,EAAOD,QAAUgvI,SAMjBA,SAASgB,cAAgBA,cAGhB,sBAAT,IACIC,EAAkB,SAASA,gBAAgB7nG,EAASvhC,GACtD,OAAOuhC,EAAQiD,UAAUxkC,GAAMhE,MACjC,EAIIqtI,EAAS,EAAQ,OAGjBhsI,EAAS,gBACTisI,QAAmC,IAAX,EAAApqH,EAAyB,EAAAA,EAA2B,oBAAXvL,OAAyBA,OAAyB,oBAATsL,KAAuBA,KAAO,CAAC,GAAGxiB,YAAc,WAAa,EAS3K,IACIuV,EADAu3H,EAAY,EAAQ,OAGtBv3H,EADEu3H,GAAaA,EAAUC,SACjBD,EAAUC,SAAS,UAEnB,SAASx3H,QAAS,EAI5B,IAWIy3H,EACAC,EACAtrI,GAbAurI,GAAa,EAAQ,OACrBC,GAAc,EAAQ,OAExBC,GADa,EAAQ,OACOA,iBAC1BC,GAAiB,WACnBx8H,GAAuBw8H,GAAex8H,qBACtCy8H,GAA4BD,GAAeC,0BAC3CC,GAA6BF,GAAeE,2BAC5CC,GAAqCH,GAAeG,mCAMtD,EAAQ,MAAR,CAAoB9B,SAAUkB,GAC9B,IAAIa,GAAiBN,GAAYM,eAC7BC,GAAe,CAAC,QAAS,QAAS,UAAW,QAAS,UAY1D,SAAShB,cAAch5H,EAAS0mC,EAAQuzF,GACtClC,EAASA,GAAU,EAAQ,OAC3B/3H,EAAUA,GAAW,CAAC,EAOE,kBAAbi6H,IAAwBA,EAAWvzF,aAAkBqxF,GAIhE3uI,KAAK8wI,aAAel6H,EAAQk6H,WACxBD,IAAU7wI,KAAK8wI,WAAa9wI,KAAK8wI,cAAgBl6H,EAAQm6H,oBAI7D/wI,KAAKovI,cAAgBkB,GAAiBtwI,KAAM4W,EAAS,wBAAyBi6H,GAK9E7wI,KAAK6F,OAAS,IAAIuqI,GAClBpwI,KAAKyC,OAAS,EACdzC,KAAKgxI,MAAQ,KACbhxI,KAAKixI,WAAa,EAClBjxI,KAAKkxI,QAAU,KACflxI,KAAKkvI,OAAQ,EACblvI,KAAKmxI,YAAa,EAClBnxI,KAAKoxI,SAAU,EAMfpxI,KAAKqxI,MAAO,EAIZrxI,KAAKsxI,cAAe,EACpBtxI,KAAKuxI,iBAAkB,EACvBvxI,KAAKwxI,mBAAoB,EACzBxxI,KAAKyxI,iBAAkB,EACvBzxI,KAAK0xI,QAAS,EAGd1xI,KAAK2xI,WAAkC,IAAtB/6H,EAAQ+6H,UAGzB3xI,KAAK4xI,cAAgBh7H,EAAQg7H,YAG7B5xI,KAAKuvI,WAAY,EAKjBvvI,KAAK6xI,gBAAkBj7H,EAAQi7H,iBAAmB,OAGlD7xI,KAAK8xI,WAAa,EAGlB9xI,KAAK+xI,aAAc,EACnB/xI,KAAK4iG,QAAU,KACf5iG,KAAKiF,SAAW,KACZ2R,EAAQ3R,WACLirI,IAAeA,EAAgB,YACpClwI,KAAK4iG,QAAU,IAAIstC,EAAct5H,EAAQ3R,UACzCjF,KAAKiF,SAAW2R,EAAQ3R,SAE5B,CACA,SAAS2pI,SAASh4H,GAEhB,GADA+3H,EAASA,GAAU,EAAQ,SACrB3uI,gBAAgB4uI,UAAW,OAAO,IAAIA,SAASh4H,GAIrD,IAAIi6H,EAAW7wI,gBAAgB2uI,EAC/B3uI,KAAKsvI,eAAiB,IAAIM,cAAch5H,EAAS5W,KAAM6wI,GAGvD7wI,KAAK+uI,UAAW,EACZn4H,IAC0B,mBAAjBA,EAAQlO,OAAqB1I,KAAKgyI,MAAQp7H,EAAQlO,MAC9B,mBAApBkO,EAAQ8jH,UAAwB16H,KAAKiyI,SAAWr7H,EAAQ8jH,UAErEoV,EAAOznI,KAAKrI,KACd,CAwDA,SAASkyI,iBAAiB50F,EAAQqyF,EAAO1qI,EAAUktI,EAAYC,GAC7D35H,EAAM,mBAAoBk3H,GAC1B,IAKM5kG,EALFrkB,EAAQ42B,EAAOgyF,eACnB,GAAc,OAAVK,EACFjpH,EAAM0qH,SAAU,EAuNpB,SAASiB,WAAW/0F,EAAQ52B,GAE1B,GADAjO,EAAM,cACFiO,EAAMwoH,MAAO,OACjB,GAAIxoH,EAAMk8E,QAAS,CACjB,IAAI+sC,EAAQjpH,EAAMk8E,QAAQr/F,MACtBosI,GAASA,EAAMltI,SACjBikB,EAAM7gB,OAAO/C,KAAK6sI,GAClBjpH,EAAMjkB,QAAUikB,EAAMoqH,WAAa,EAAInB,EAAMltI,OAEjD,CACAikB,EAAMwoH,OAAQ,EACVxoH,EAAM2qH,KAIRiB,aAAah1F,IAGb52B,EAAM4qH,cAAe,EAChB5qH,EAAM6qH,kBACT7qH,EAAM6qH,iBAAkB,EACxBgB,cAAcj1F,IAGpB,CA9OI+0F,CAAW/0F,EAAQ52B,QAInB,GADK0rH,IAAgBrnG,EA6CzB,SAASynG,aAAa9rH,EAAOipH,GAC3B,IAAI5kG,GAjPN,SAAS0nG,cAAcrsI,GACrB,OAAOtC,EAAOuC,SAASD,IAAQA,aAAe2pI,CAChD,EAgPO0C,CAAc9C,IAA2B,iBAAVA,QAAgCppI,IAAVopI,GAAwBjpH,EAAMoqH,aACtF/lG,EAAK,IAAIh3B,GAAqB,QAAS,CAAC,SAAU,SAAU,cAAe47H,IAE7E,OAAO5kG,CACT,CAnD8BynG,CAAa9rH,EAAOipH,IAC1C5kG,EACF4lG,GAAerzF,EAAQvS,QAClB,GAAIrkB,EAAMoqH,YAAcnB,GAASA,EAAMltI,OAAS,EAIrD,GAHqB,iBAAVktI,GAAuBjpH,EAAMoqH,YAAcxsI,OAAO8Z,eAAeuxH,KAAW7rI,EAAOU,YAC5FmrI,EA3MR,SAAS+C,oBAAoB/C,GAC3B,OAAO7rI,EAAOe,KAAK8qI,EACrB,CAyMgB+C,CAAoB/C,IAE1BwC,EACEzrH,EAAMyqH,WAAYR,GAAerzF,EAAQ,IAAIozF,IAA2CiC,SAASr1F,EAAQ52B,EAAOipH,GAAO,QACtH,GAAIjpH,EAAMwoH,MACfyB,GAAerzF,EAAQ,IAAIkzF,QACtB,IAAI9pH,EAAM6oH,UACf,OAAO,EAEP7oH,EAAM0qH,SAAU,EACZ1qH,EAAMk8E,UAAY39F,GACpB0qI,EAAQjpH,EAAMk8E,QAAQx9F,MAAMuqI,GACxBjpH,EAAMoqH,YAA+B,IAAjBnB,EAAMltI,OAAckwI,SAASr1F,EAAQ52B,EAAOipH,GAAO,GAAYiD,cAAct1F,EAAQ52B,IAE7GisH,SAASr1F,EAAQ52B,EAAOipH,GAAO,EAEnC,MACUwC,IACVzrH,EAAM0qH,SAAU,EAChBwB,cAAct1F,EAAQ52B,IAO1B,OAAQA,EAAMwoH,QAAUxoH,EAAMjkB,OAASikB,EAAM0oH,eAAkC,IAAjB1oH,EAAMjkB,OACtE,CACA,SAASkwI,SAASr1F,EAAQ52B,EAAOipH,EAAOwC,GAClCzrH,EAAMwqH,SAA4B,IAAjBxqH,EAAMjkB,SAAiBikB,EAAM2qH,MAChD3qH,EAAMorH,WAAa,EACnBx0F,EAAO9T,KAAK,OAAQmmG,KAGpBjpH,EAAMjkB,QAAUikB,EAAMoqH,WAAa,EAAInB,EAAMltI,OACzC0vI,EAAYzrH,EAAM7gB,OAAO4jC,QAAQkmG,GAAYjpH,EAAM7gB,OAAO/C,KAAK6sI,GAC/DjpH,EAAM4qH,cAAcgB,aAAah1F,IAEvCs1F,cAAct1F,EAAQ52B,EACxB,CA3GApiB,OAAOmH,eAAemjI,SAASpqI,UAAW,YAAa,CAIrDkH,YAAY,EACZC,IAAK,SAASA,MACZ,YAA4BpF,IAAxBvG,KAAKsvI,gBAGFtvI,KAAKsvI,eAAeC,SAC7B,EACAhjI,IAAK,SAASA,IAAIzH,GAGX9E,KAAKsvI,iBAMVtvI,KAAKsvI,eAAeC,UAAYzqI,EAClC,IAEF8pI,SAASpqI,UAAUk2H,QAAU2V,GAAY3V,QACzCkU,SAASpqI,UAAUquI,WAAaxC,GAAYyC,UAC5ClE,SAASpqI,UAAUytI,SAAW,SAAUp3H,EAAK6lC,GAC3CA,EAAG7lC,EACL,EAMA+zH,SAASpqI,UAAU1B,KAAO,SAAU6sI,EAAO1qI,GACzC,IACImtI,EADA1rH,EAAQ1mB,KAAKsvI,eAcjB,OAZK5oH,EAAMoqH,WAUTsB,GAAiB,EATI,iBAAVzC,KACT1qI,EAAWA,GAAYyhB,EAAMmrH,mBACZnrH,EAAMzhB,WACrB0qI,EAAQ7rI,EAAOe,KAAK8qI,EAAO1qI,GAC3BA,EAAW,IAEbmtI,GAAiB,GAKdF,iBAAiBlyI,KAAM2vI,EAAO1qI,GAAU,EAAOmtI,EACxD,EAGAxD,SAASpqI,UAAUilC,QAAU,SAAUkmG,GACrC,OAAOuC,iBAAiBlyI,KAAM2vI,EAAO,MAAM,GAAM,EACnD,EA6DAf,SAASpqI,UAAUuuI,SAAW,WAC5B,OAAuC,IAAhC/yI,KAAKsvI,eAAe4B,OAC7B,EAGAtC,SAASpqI,UAAUwuI,YAAc,SAAU57H,GACpC84H,IAAeA,EAAgB,YACpC,IAAIttC,EAAU,IAAIstC,EAAc94H,GAChCpX,KAAKsvI,eAAe1sC,QAAUA,EAE9B5iG,KAAKsvI,eAAerqI,SAAWjF,KAAKsvI,eAAe1sC,QAAQ39F,SAK3D,IAFA,IAAImmG,EAAIprG,KAAKsvI,eAAezpI,OAAOwjE,KAC/Bn8C,EAAU,GACD,OAANk+E,GACLl+E,GAAW01E,EAAQx9F,MAAMgmG,EAAEzkG,MAC3BykG,EAAIA,EAAE9iF,KAKR,OAHAtoB,KAAKsvI,eAAezpI,OAAOgsC,QACX,KAAZ3kB,GAAgBltB,KAAKsvI,eAAezpI,OAAO/C,KAAKoqB,GACpDltB,KAAKsvI,eAAe7sI,OAASyqB,EAAQzqB,OAC9BzC,IACT,EAGA,IAAIizI,GAAU,WAqBd,SAASC,cAAcnrI,EAAG2e,GACxB,OAAI3e,GAAK,GAAsB,IAAjB2e,EAAMjkB,QAAgBikB,EAAMwoH,MAAc,EACpDxoH,EAAMoqH,WAAmB,EACzB/oI,GAAMA,EAEJ2e,EAAMwqH,SAAWxqH,EAAMjkB,OAAeikB,EAAM7gB,OAAOwjE,KAAK1iE,KAAKlE,OAAmBikB,EAAMjkB,QAGxFsF,EAAI2e,EAAM0oH,gBAAe1oH,EAAM0oH,cA5BrC,SAAS+D,wBAAwBprI,GAe/B,OAdIA,GAAKkrI,GAEPlrI,EAAIkrI,IAIJlrI,IACAA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,GACXA,KAEKA,CACT,CAYqDorI,CAAwBprI,IACvEA,GAAK2e,EAAMjkB,OAAesF,EAEzB2e,EAAMwoH,MAIJxoH,EAAMjkB,QAHXikB,EAAM4qH,cAAe,EACd,GAGX,CA6HA,SAASgB,aAAah1F,GACpB,IAAI52B,EAAQ42B,EAAOgyF,eACnB72H,EAAM,eAAgBiO,EAAM4qH,aAAc5qH,EAAM6qH,iBAChD7qH,EAAM4qH,cAAe,EAChB5qH,EAAM6qH,kBACT94H,EAAM,eAAgBiO,EAAMwqH,SAC5BxqH,EAAM6qH,iBAAkB,EACxBxwH,EAAQ6+E,SAAS2yC,cAAej1F,GAEpC,CACA,SAASi1F,cAAcj1F,GACrB,IAAI52B,EAAQ42B,EAAOgyF,eACnB72H,EAAM,gBAAiBiO,EAAM6oH,UAAW7oH,EAAMjkB,OAAQikB,EAAMwoH,OACvDxoH,EAAM6oH,YAAc7oH,EAAMjkB,SAAUikB,EAAMwoH,QAC7C5xF,EAAO9T,KAAK,YACZ9iB,EAAM6qH,iBAAkB,GAS1B7qH,EAAM4qH,cAAgB5qH,EAAMwqH,UAAYxqH,EAAMwoH,OAASxoH,EAAMjkB,QAAUikB,EAAM0oH,cAC7EgE,KAAK91F,EACP,CAQA,SAASs1F,cAAct1F,EAAQ52B,GACxBA,EAAMqrH,cACTrrH,EAAMqrH,aAAc,EACpBhxH,EAAQ6+E,SAASyzC,eAAgB/1F,EAAQ52B,GAE7C,CACA,SAAS2sH,eAAe/1F,EAAQ52B,GAwB9B,MAAQA,EAAM0qH,UAAY1qH,EAAMwoH,QAAUxoH,EAAMjkB,OAASikB,EAAM0oH,eAAiB1oH,EAAMwqH,SAA4B,IAAjBxqH,EAAMjkB,SAAe,CACpH,IAAIL,EAAMskB,EAAMjkB,OAGhB,GAFAgW,EAAM,wBACN6kC,EAAO50C,KAAK,GACRtG,IAAQskB,EAAMjkB,OAEhB,KACJ,CACAikB,EAAMqrH,aAAc,CACtB,CAgPA,SAASuB,wBAAwB5tH,GAC/B,IAAIgB,EAAQhB,EAAK4pH,eACjB5oH,EAAM8qH,kBAAoB9rH,EAAK+kB,cAAc,YAAc,EACvD/jB,EAAM+qH,kBAAoB/qH,EAAMgrH,OAGlChrH,EAAMwqH,SAAU,EAGPxrH,EAAK+kB,cAAc,QAAU,GACtC/kB,EAAK6tH,QAET,CACA,SAASC,iBAAiB9tH,GACxBjN,EAAM,4BACNiN,EAAKhd,KAAK,EACZ,CAuBA,SAAS+qI,QAAQn2F,EAAQ52B,GACvBjO,EAAM,SAAUiO,EAAM0qH,SACjB1qH,EAAM0qH,SACT9zF,EAAO50C,KAAK,GAEdge,EAAM+qH,iBAAkB,EACxBn0F,EAAO9T,KAAK,UACZ4pG,KAAK91F,GACD52B,EAAMwqH,UAAYxqH,EAAM0qH,SAAS9zF,EAAO50C,KAAK,EACnD,CAWA,SAAS0qI,KAAK91F,GACZ,IAAI52B,EAAQ42B,EAAOgyF,eAEnB,IADA72H,EAAM,OAAQiO,EAAMwqH,SACbxqH,EAAMwqH,SAA6B,OAAlB5zF,EAAO50C,SACjC,CAmHA,SAASgrI,SAAS3rI,EAAG2e,GAEnB,OAAqB,IAAjBA,EAAMjkB,OAAqB,MAE3BikB,EAAMoqH,WAAYtjI,EAAMkZ,EAAM7gB,OAAOylC,SAAkBvjC,GAAKA,GAAK2e,EAAMjkB,QAEtD+K,EAAfkZ,EAAMk8E,QAAel8E,EAAM7gB,OAAO5C,KAAK,IAAqC,IAAxByjB,EAAM7gB,OAAOpD,OAAoBikB,EAAM7gB,OAAO8J,QAAmB+W,EAAM7gB,OAAOuG,OAAOsa,EAAMjkB,QACnJikB,EAAM7gB,OAAOgsC,SAGbrkC,EAAMkZ,EAAM7gB,OAAO8tI,QAAQ5rI,EAAG2e,EAAMk8E,SAE/Bp1F,GATP,IAAIA,CAUN,CACA,SAASomI,YAAYt2F,GACnB,IAAI52B,EAAQ42B,EAAOgyF,eACnB72H,EAAM,cAAeiO,EAAMyqH,YACtBzqH,EAAMyqH,aACTzqH,EAAMwoH,OAAQ,EACdnuH,EAAQ6+E,SAASi0C,cAAentH,EAAO42B,GAE3C,CACA,SAASu2F,cAAcntH,EAAO42B,GAI5B,GAHA7kC,EAAM,gBAAiBiO,EAAMyqH,WAAYzqH,EAAMjkB,SAG1CikB,EAAMyqH,YAA+B,IAAjBzqH,EAAMjkB,SAC7BikB,EAAMyqH,YAAa,EACnB7zF,EAAOyxF,UAAW,EAClBzxF,EAAO9T,KAAK,OACR9iB,EAAMkrH,aAAa,CAGrB,IAAIkC,EAASx2F,EAAO2xF,iBACf6E,GAAUA,EAAOlC,aAAekC,EAAOC,WAC1Cz2F,EAAOo9E,SAEX,CAEJ,CASA,SAASv5H,QAAQw8F,EAAIzxF,GACnB,IAAK,IAAInK,EAAI,EAAGk3B,EAAI0kE,EAAGl7F,OAAQV,EAAIk3B,EAAGl3B,IACpC,GAAI47F,EAAG57F,KAAOmK,EAAG,OAAOnK,EAE1B,OAAQ,CACV,CA1pBA6sI,SAASpqI,UAAUkE,KAAO,SAAUX,GAClC0Q,EAAM,OAAQ1Q,GACdA,EAAIsB,SAAStB,EAAG,IAChB,IAAI2e,EAAQ1mB,KAAKsvI,eACb0E,EAAQjsI,EAMZ,GALU,IAANA,IAAS2e,EAAM6qH,iBAAkB,GAK3B,IAANxpI,GAAW2e,EAAM4qH,gBAA0C,IAAxB5qH,EAAM0oH,cAAsB1oH,EAAMjkB,QAAUikB,EAAM0oH,cAAgB1oH,EAAMjkB,OAAS,IAAMikB,EAAMwoH,OAGlI,OAFAz2H,EAAM,qBAAsBiO,EAAMjkB,OAAQikB,EAAMwoH,OAC3B,IAAjBxoH,EAAMjkB,QAAgBikB,EAAMwoH,MAAO0E,YAAY5zI,MAAWsyI,aAAatyI,MACpE,KAKT,GAAU,KAHV+H,EAAImrI,cAAcnrI,EAAG2e,KAGNA,EAAMwoH,MAEnB,OADqB,IAAjBxoH,EAAMjkB,QAAcmxI,YAAY5zI,MAC7B,KA0BT,IA2BIwN,EA3BAymI,EAASvtH,EAAM4qH,aA6CnB,OA5CA74H,EAAM,gBAAiBw7H,IAGF,IAAjBvtH,EAAMjkB,QAAgBikB,EAAMjkB,OAASsF,EAAI2e,EAAM0oH,gBAEjD32H,EAAM,6BADNw7H,GAAS,GAMPvtH,EAAMwoH,OAASxoH,EAAM0qH,QAEvB34H,EAAM,mBADNw7H,GAAS,GAEAA,IACTx7H,EAAM,WACNiO,EAAM0qH,SAAU,EAChB1qH,EAAM2qH,MAAO,EAEQ,IAAjB3qH,EAAMjkB,SAAcikB,EAAM4qH,cAAe,GAE7CtxI,KAAKgyI,MAAMtrH,EAAM0oH,eACjB1oH,EAAM2qH,MAAO,EAGR3qH,EAAM0qH,UAASrpI,EAAImrI,cAAcc,EAAOttH,KAInC,QADDlZ,EAAPzF,EAAI,EAAS2rI,SAAS3rI,EAAG2e,GAAkB,OAE7CA,EAAM4qH,aAAe5qH,EAAMjkB,QAAUikB,EAAM0oH,cAC3CrnI,EAAI,IAEJ2e,EAAMjkB,QAAUsF,EAChB2e,EAAMorH,WAAa,GAEA,IAAjBprH,EAAMjkB,SAGHikB,EAAMwoH,QAAOxoH,EAAM4qH,cAAe,GAGnC0C,IAAUjsI,GAAK2e,EAAMwoH,OAAO0E,YAAY5zI,OAElC,OAARwN,GAAcxN,KAAKwpC,KAAK,OAAQh8B,GAC7BA,CACT,EA6GAohI,SAASpqI,UAAUwtI,MAAQ,SAAUjqI,GACnC4oI,GAAe3wI,KAAM,IAAIywI,GAA2B,WACtD,EACA7B,SAASpqI,UAAU0vI,KAAO,SAAUC,EAAMC,GACxC,IAAIx/H,EAAM5U,KACN0mB,EAAQ1mB,KAAKsvI,eACjB,OAAQ5oH,EAAMuqH,YACZ,KAAK,EACHvqH,EAAMsqH,MAAQmD,EACd,MACF,KAAK,EACHztH,EAAMsqH,MAAQ,CAACtqH,EAAMsqH,MAAOmD,GAC5B,MACF,QACEztH,EAAMsqH,MAAMluI,KAAKqxI,GAGrBztH,EAAMuqH,YAAc,EACpBx4H,EAAM,wBAAyBiO,EAAMuqH,WAAYmD,GACjD,IACIC,IADUD,IAA6B,IAAjBA,EAAS7wI,MAAkB4wI,IAASpzH,EAAQuzH,QAAUH,IAASpzH,EAAQwzH,OAC7EvF,MAAQwF,OAG5B,SAASC,SAAS1F,EAAU2F,GAC1Bj8H,EAAM,YACFs2H,IAAan6H,GACX8/H,IAAwC,IAA1BA,EAAWC,aAC3BD,EAAWC,YAAa,EAiB9B,SAASC,UACPn8H,EAAM,WAEN07H,EAAK9rG,eAAe,QAASwsG,SAC7BV,EAAK9rG,eAAe,SAAUysG,UAC9BX,EAAK9rG,eAAe,QAAS0sG,GAC7BZ,EAAK9rG,eAAe,QAAS2sG,SAC7Bb,EAAK9rG,eAAe,SAAUosG,UAC9B7/H,EAAIyzB,eAAe,MAAO2mG,OAC1Bp6H,EAAIyzB,eAAe,MAAOmsG,QAC1B5/H,EAAIyzB,eAAe,OAAQ4sG,QAC3BC,GAAY,GAORxuH,EAAMorH,YAAgBqC,EAAKlF,iBAAkBkF,EAAKlF,eAAekG,WAAYJ,GACnF,CAnCMH,GAGN,CACA,SAAS5F,QACPv2H,EAAM,SACN07H,EAAK5wI,KACP,CAdImjB,EAAMyqH,WAAYpwH,EAAQ6+E,SAASy0C,GAAYz/H,EAAImzB,KAAK,MAAOssG,GACnEF,EAAKxrG,GAAG,SAAU8rG,UAmBlB,IAAIM,EAgFN,SAASK,YAAYxgI,GACnB,OAAO,SAASygI,4BACd,IAAI3uH,EAAQ9R,EAAI06H,eAChB72H,EAAM,cAAeiO,EAAMorH,YACvBprH,EAAMorH,YAAYprH,EAAMorH,aACH,IAArBprH,EAAMorH,YAAoBjC,EAAgBj7H,EAAK,UACjD8R,EAAMwqH,SAAU,EAChBkC,KAAKx+H,GAET,CACF,CA1FgBwgI,CAAYxgI,GAC1Bu/H,EAAKxrG,GAAG,QAASosG,GACjB,IAAIG,GAAY,EAsBhB,SAASD,OAAOtF,GACdl3H,EAAM,UACN,IAAIjL,EAAM2mI,EAAK/uI,MAAMuqI,GACrBl3H,EAAM,aAAcjL,IACR,IAARA,KAKwB,IAArBkZ,EAAMuqH,YAAoBvqH,EAAMsqH,QAAUmD,GAAQztH,EAAMuqH,WAAa,IAAqC,IAAhC9vI,QAAQulB,EAAMsqH,MAAOmD,MAAkBe,IACpHz8H,EAAM,8BAA+BiO,EAAMorH,YAC3CprH,EAAMorH,cAERl9H,EAAI0gI,QAER,CAIA,SAASN,QAAQjqG,GACftyB,EAAM,UAAWsyB,GACjBypG,SACAL,EAAK9rG,eAAe,QAAS2sG,SACU,IAAnCnF,EAAgBsE,EAAM,UAAgBxD,GAAewD,EAAMppG,EACjE,CAMA,SAAS8pG,UACPV,EAAK9rG,eAAe,SAAUysG,UAC9BN,QACF,CAEA,SAASM,WACPr8H,EAAM,YACN07H,EAAK9rG,eAAe,QAASwsG,SAC7BL,QACF,CAEA,SAASA,SACP/7H,EAAM,UACN7D,EAAI4/H,OAAOL,EACb,CAUA,OAvDAv/H,EAAI+zB,GAAG,OAAQssG,QAniBjB,SAAS9pG,gBAAgBnD,EAASoV,EAAOnoC,GAGvC,GAAuC,mBAA5B+yB,EAAQmD,gBAAgC,OAAOnD,EAAQmD,gBAAgBiS,EAAOnoC,GAMpF+yB,EAAQY,SAAYZ,EAAQY,QAAQwU,GAAuCj6C,MAAMuD,QAAQshC,EAAQY,QAAQwU,IAASpV,EAAQY,QAAQwU,GAAO3T,QAAQx0B,GAAS+yB,EAAQY,QAAQwU,GAAS,CAACnoC,EAAI+yB,EAAQY,QAAQwU,IAA5JpV,EAAQW,GAAGyU,EAAOnoC,EACrE,CAqjBEk2B,CAAgBgpG,EAAM,QAASa,SAO/Bb,EAAKpsG,KAAK,QAAS8sG,SAMnBV,EAAKpsG,KAAK,SAAU+sG,UAOpBX,EAAK3qG,KAAK,OAAQ50B,GAGb8R,EAAMwqH,UACTz4H,EAAM,eACN7D,EAAI2+H,UAECY,CACT,EAYAvF,SAASpqI,UAAUgwI,OAAS,SAAUL,GACpC,IAAIztH,EAAQ1mB,KAAKsvI,eACboF,EAAa,CACfC,YAAY,GAId,GAAyB,IAArBjuH,EAAMuqH,WAAkB,OAAOjxI,KAGnC,GAAyB,IAArB0mB,EAAMuqH,WAER,OAAIkD,GAAQA,IAASztH,EAAMsqH,QACtBmD,IAAMA,EAAOztH,EAAMsqH,OAGxBtqH,EAAMsqH,MAAQ,KACdtqH,EAAMuqH,WAAa,EACnBvqH,EAAMwqH,SAAU,EACZiD,GAAMA,EAAK3qG,KAAK,SAAUxpC,KAAM00I,IAPK10I,KAa3C,IAAKm0I,EAAM,CAET,IAAIoB,EAAQ7uH,EAAMsqH,MACd5uI,EAAMskB,EAAMuqH,WAChBvqH,EAAMsqH,MAAQ,KACdtqH,EAAMuqH,WAAa,EACnBvqH,EAAMwqH,SAAU,EAChB,IAAK,IAAInvI,EAAI,EAAGA,EAAIK,EAAKL,IAAKwzI,EAAMxzI,GAAGynC,KAAK,SAAUxpC,KAAM,CAC1D20I,YAAY,IAEd,OAAO30I,IACT,CAGA,IAAI8W,EAAQ3V,QAAQulB,EAAMsqH,MAAOmD,GACjC,OAAe,IAAXr9H,IACJ4P,EAAMsqH,MAAM1gG,OAAOx5B,EAAO,GAC1B4P,EAAMuqH,YAAc,EACK,IAArBvqH,EAAMuqH,aAAkBvqH,EAAMsqH,MAAQtqH,EAAMsqH,MAAM,IACtDmD,EAAK3qG,KAAK,SAAUxpC,KAAM00I,IAJD10I,IAM3B,EAIA4uI,SAASpqI,UAAUmkC,GAAK,SAAU6sG,EAAIvgI,GACpC,IAAI5K,EAAMylI,EAAOtrI,UAAUmkC,GAAGtgC,KAAKrI,KAAMw1I,EAAIvgI,GACzCyR,EAAQ1mB,KAAKsvI,eAqBjB,MApBW,SAAPkG,GAGF9uH,EAAM8qH,kBAAoBxxI,KAAKyqC,cAAc,YAAc,GAGrC,IAAlB/jB,EAAMwqH,SAAmBlxI,KAAKuzI,UAClB,aAAPiC,IACJ9uH,EAAMyqH,YAAezqH,EAAM8qH,oBAC9B9qH,EAAM8qH,kBAAoB9qH,EAAM4qH,cAAe,EAC/C5qH,EAAMwqH,SAAU,EAChBxqH,EAAM6qH,iBAAkB,EACxB94H,EAAM,cAAeiO,EAAMjkB,OAAQikB,EAAM0qH,SACrC1qH,EAAMjkB,OACR6vI,aAAatyI,MACH0mB,EAAM0qH,SAChBrwH,EAAQ6+E,SAAS4zC,iBAAkBxzI,QAIlCqK,CACT,EACAukI,SAASpqI,UAAU0mC,YAAc0jG,SAASpqI,UAAUmkC,GACpDimG,SAASpqI,UAAU6jC,eAAiB,SAAUmtG,EAAIvgI,GAChD,IAAI5K,EAAMylI,EAAOtrI,UAAU6jC,eAAehgC,KAAKrI,KAAMw1I,EAAIvgI,GAUzD,MATW,aAAPugI,GAOFz0H,EAAQ6+E,SAAS0zC,wBAAyBtzI,MAErCqK,CACT,EACAukI,SAASpqI,UAAUinC,mBAAqB,SAAU+pG,GAChD,IAAInrI,EAAMylI,EAAOtrI,UAAUinC,mBAAmBzgC,MAAMhL,KAAMkH,WAU1D,MATW,aAAPsuI,QAA4BjvI,IAAPivI,GAOvBz0H,EAAQ6+E,SAAS0zC,wBAAyBtzI,MAErCqK,CACT,EAqBAukI,SAASpqI,UAAU+uI,OAAS,WAC1B,IAAI7sH,EAAQ1mB,KAAKsvI,eAUjB,OATK5oH,EAAMwqH,UACTz4H,EAAM,UAINiO,EAAMwqH,SAAWxqH,EAAM8qH,kBAM3B,SAAS+B,OAAOj2F,EAAQ52B,GACjBA,EAAM+qH,kBACT/qH,EAAM+qH,iBAAkB,EACxB1wH,EAAQ6+E,SAAS6zC,QAASn2F,EAAQ52B,GAEtC,CAVI6sH,CAAOvzI,KAAM0mB,IAEfA,EAAMgrH,QAAS,EACR1xI,IACT,EAiBA4uI,SAASpqI,UAAU8wI,MAAQ,WAQzB,OAPA78H,EAAM,wBAAyBzY,KAAKsvI,eAAe4B,UACf,IAAhClxI,KAAKsvI,eAAe4B,UACtBz4H,EAAM,SACNzY,KAAKsvI,eAAe4B,SAAU,EAC9BlxI,KAAKwpC,KAAK,UAEZxpC,KAAKsvI,eAAeoC,QAAS,EACtB1xI,IACT,EAUA4uI,SAASpqI,UAAU2e,KAAO,SAAUm6B,GAClC,IAAI4uD,EAAQlsG,KACR0mB,EAAQ1mB,KAAKsvI,eACboC,GAAS,EAwBb,IAAK,IAAI3vI,KAvBTu7C,EAAO3U,GAAG,OAAO,WAEf,GADAlwB,EAAM,eACFiO,EAAMk8E,UAAYl8E,EAAMwoH,MAAO,CACjC,IAAIS,EAAQjpH,EAAMk8E,QAAQr/F,MACtBosI,GAASA,EAAMltI,QAAQypG,EAAMppG,KAAK6sI,EACxC,CACAzjC,EAAMppG,KAAK,KACb,IACAw6C,EAAO3U,GAAG,QAAQ,SAAUgnG,IAC1Bl3H,EAAM,gBACFiO,EAAMk8E,UAAS+sC,EAAQjpH,EAAMk8E,QAAQx9F,MAAMuqI,IAG3CjpH,EAAMoqH,YAAc,MAACnB,KAAyDjpH,EAAMoqH,YAAgBnB,GAAUA,EAAMltI,UAC9GypG,EAAMppG,KAAK6sI,KAEnB+B,GAAS,EACTp0F,EAAOg4F,SAEX,IAIch4F,OACI/2C,IAAZvG,KAAK+B,IAAyC,mBAAdu7C,EAAOv7C,KACzC/B,KAAK+B,GAAK,SAAS0zI,WAAWh6H,GAC5B,OAAO,SAASi6H,2BACd,OAAOp4F,EAAO7hC,GAAQzQ,MAAMsyC,EAAQp2C,UACtC,CACF,CAJU,CAIRnF,IAKN,IAAK,IAAIgG,EAAI,EAAGA,EAAI6oI,GAAanuI,OAAQsF,IACvCu1C,EAAO3U,GAAGioG,GAAa7oI,GAAI/H,KAAKwpC,KAAK/zB,KAAKzV,KAAM4wI,GAAa7oI,KAY/D,OAPA/H,KAAKgyI,MAAQ,SAAUjqI,GACrB0Q,EAAM,gBAAiB1Q,GACnB2pI,IACFA,GAAS,EACTp0F,EAAOi2F,SAEX,EACOvzI,IACT,EACsB,mBAAX6D,SACT+qI,SAASpqI,UAAUX,OAAO8xI,eAAiB,WAIzC,YAH0CpvI,IAAtC4pI,IACFA,EAAoC,EAAQ,QAEvCA,EAAkCnwI,KAC3C,GAEFsE,OAAOmH,eAAemjI,SAASpqI,UAAW,wBAAyB,CAIjEkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKsvI,eAAeF,aAC7B,IAEF9qI,OAAOmH,eAAemjI,SAASpqI,UAAW,iBAAkB,CAI1DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKsvI,gBAAkBtvI,KAAKsvI,eAAezpI,MACpD,IAEFvB,OAAOmH,eAAemjI,SAASpqI,UAAW,kBAAmB,CAI3DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKsvI,eAAe4B,OAC7B,EACA3kI,IAAK,SAASA,IAAIma,GACZ1mB,KAAKsvI,iBACPtvI,KAAKsvI,eAAe4B,QAAUxqH,EAElC,IAIFkoH,SAASgH,UAAYlC,SACrBpvI,OAAOmH,eAAemjI,SAASpqI,UAAW,iBAAkB,CAI1DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKsvI,eAAe7sI,MAC7B,IA+CoB,mBAAXoB,SACT+qI,SAAS/pI,KAAO,SAAUqjB,EAAU+tB,GAIlC,YAHa1vC,IAAT1B,KACFA,GAAO,EAAQ,QAEVA,GAAK+pI,SAAU1mH,EAAU+tB,EAClC,iCC17BFp2C,EAAOD,QAAU6vI,UACjB,IAAIc,EAAiB,WACnBE,EAA6BF,EAAeE,2BAC5CoF,EAAwBtF,EAAesF,sBACvCC,EAAqCvF,EAAeuF,mCACpDC,EAA8BxF,EAAewF,4BAC3CpH,EAAS,EAAQ,OAErB,SAASqH,eAAejrG,EAAIpkC,GAC1B,IAAIsvI,EAAKj2I,KAAKk2I,gBACdD,EAAGE,cAAe,EAClB,IAAIz1F,EAAKu1F,EAAGG,QACZ,GAAW,OAAP11F,EACF,OAAO1gD,KAAKwpC,KAAK,QAAS,IAAIqsG,GAEhCI,EAAGI,WAAa,KAChBJ,EAAGG,QAAU,KACD,MAARzvI,GAEF3G,KAAK8C,KAAK6D,GACZ+5C,EAAG3V,GACH,IAAIurG,EAAKt2I,KAAKsvI,eACdgH,EAAGlF,SAAU,GACTkF,EAAGhF,cAAgBgF,EAAG7zI,OAAS6zI,EAAGlH,gBACpCpvI,KAAKgyI,MAAMsE,EAAGlH,cAElB,CACA,SAASK,UAAU74H,GACjB,KAAM5W,gBAAgByvI,WAAY,OAAO,IAAIA,UAAU74H,GACvD+3H,EAAOtmI,KAAKrI,KAAM4W,GAClB5W,KAAKk2I,gBAAkB,CACrBF,eAAgBA,eAAevgI,KAAKzV,MACpCu2I,eAAe,EACfJ,cAAc,EACdC,QAAS,KACTC,WAAY,KACZG,cAAe,MAIjBx2I,KAAKsvI,eAAegC,cAAe,EAKnCtxI,KAAKsvI,eAAe+B,MAAO,EACvBz6H,IAC+B,mBAAtBA,EAAQ2yE,YAA0BvpF,KAAK0vI,WAAa94H,EAAQ2yE,WAC1C,mBAAlB3yE,EAAQw7D,QAAsBpyE,KAAKy2I,OAAS7/H,EAAQw7D,QAIjEpyE,KAAK2oC,GAAG,YAAa+tG,UACvB,CACA,SAASA,YACP,IAAIxqC,EAAQlsG,KACe,mBAAhBA,KAAKy2I,QAA0Bz2I,KAAKsvI,eAAeC,UAK5DlxH,KAAKre,KAAM,KAAM,MAJjBA,KAAKy2I,QAAO,SAAU1rG,EAAIpkC,GACxB0X,KAAK6tF,EAAOnhE,EAAIpkC,EAClB,GAIJ,CAiDA,SAAS0X,KAAKi/B,EAAQvS,EAAIpkC,GACxB,GAAIokC,EAAI,OAAOuS,EAAO9T,KAAK,QAASuB,GAQpC,GAPY,MAARpkC,GAEF22C,EAAOx6C,KAAK6D,GAKV22C,EAAO2xF,eAAexsI,OAAQ,MAAM,IAAIszI,EAC5C,GAAIz4F,EAAO44F,gBAAgBC,aAAc,MAAM,IAAIL,EACnD,OAAOx4F,EAAOx6C,KAAK,KACrB,CArHA,EAAQ,MAAR,CAAoB2sI,UAAWd,GAyD/Bc,UAAUjrI,UAAU1B,KAAO,SAAU6sI,EAAO1qI,GAE1C,OADAjF,KAAKk2I,gBAAgBK,eAAgB,EAC9B5H,EAAOnqI,UAAU1B,KAAKuF,KAAKrI,KAAM2vI,EAAO1qI,EACjD,EAYAwqI,UAAUjrI,UAAUkrI,WAAa,SAAUC,EAAO1qI,EAAUy7C,GAC1DA,EAAG,IAAI+vF,EAA2B,gBACpC,EACAhB,UAAUjrI,UAAUmyI,OAAS,SAAUhH,EAAO1qI,EAAUy7C,GACtD,IAAIu1F,EAAKj2I,KAAKk2I,gBAId,GAHAD,EAAGG,QAAU11F,EACbu1F,EAAGI,WAAa1G,EAChBsG,EAAGO,cAAgBvxI,GACdgxI,EAAGE,aAAc,CACpB,IAAIG,EAAKt2I,KAAKsvI,gBACV2G,EAAGM,eAAiBD,EAAGhF,cAAgBgF,EAAG7zI,OAAS6zI,EAAGlH,gBAAepvI,KAAKgyI,MAAMsE,EAAGlH,cACzF,CACF,EAKAK,UAAUjrI,UAAUwtI,MAAQ,SAAUjqI,GACpC,IAAIkuI,EAAKj2I,KAAKk2I,gBACQ,OAAlBD,EAAGI,YAAwBJ,EAAGE,aAMhCF,EAAGM,eAAgB,GALnBN,EAAGE,cAAe,EAClBn2I,KAAK0vI,WAAWuG,EAAGI,WAAYJ,EAAGO,cAAeP,EAAGD,gBAMxD,EACAvG,UAAUjrI,UAAUytI,SAAW,SAAUp3H,EAAK6lC,GAC5CiuF,EAAOnqI,UAAUytI,SAAS5pI,KAAKrI,KAAM6a,GAAK,SAAU+7H,GAClDl2F,EAAGk2F,EACL,GACF,oCC9HIjI,aAXJ,SAASkI,cAAcnwH,GACrB,IAAIwlF,EAAQlsG,KACZA,KAAKsoB,KAAO,KACZtoB,KAAKmzD,MAAQ,KACbnzD,KAAK82I,OAAS,YA6iBhB,SAASC,eAAeC,EAAStwH,EAAO7L,GACtC,IAAIs4C,EAAQ6jF,EAAQ7jF,MACpB6jF,EAAQ7jF,MAAQ,KAChB,KAAOA,GAAO,CACZ,IAAIzS,EAAKyS,EAAM0vB,SACfn8D,EAAMuwH,YACNv2F,EAAG7lC,GACHs4C,EAAQA,EAAM7qC,IAChB,CAGA5B,EAAMwwH,mBAAmB5uH,KAAO0uH,CAClC,CAxjBID,CAAe7qC,EAAOxlF,EACxB,CACF,CAnBA7mB,EAAOD,QAAUivI,SA0BjBA,SAASsI,cAAgBA,cAGzB,IAAIC,EAAe,CACjBC,UAAW,EAAQ,QAKjBvH,EAAS,EAAQ,OAGjBhsI,EAAS,gBACTisI,QAAmC,IAAX,EAAApqH,EAAyB,EAAAA,EAA2B,oBAAXvL,OAAyBA,OAAyB,oBAATsL,KAAuBA,KAAO,CAAC,GAAGxiB,YAAc,WAAa,EAO3K,IA8IIo0I,EA9IAjH,EAAc,EAAQ,OAExBC,EADa,EAAQ,OACOA,iBAC1BC,EAAiB,WACnBx8H,GAAuBw8H,EAAex8H,qBACtC08H,GAA6BF,EAAeE,2BAC5CoF,GAAwBtF,EAAesF,sBACvC0B,GAAyBhH,EAAegH,uBACxCC,GAAuBjH,EAAeiH,qBACtCC,GAAyBlH,EAAekH,uBACxCC,GAA6BnH,EAAemH,2BAC5CC,GAAuBpH,EAAeoH,qBACpChH,GAAiBN,EAAYM,eAEjC,SAASiH,MAAO,CAChB,SAAST,cAAcvgI,EAAS0mC,EAAQuzF,GACtClC,EAASA,GAAU,EAAQ,OAC3B/3H,EAAUA,GAAW,CAAC,EAOE,kBAAbi6H,IAAwBA,EAAWvzF,aAAkBqxF,GAIhE3uI,KAAK8wI,aAAel6H,EAAQk6H,WACxBD,IAAU7wI,KAAK8wI,WAAa9wI,KAAK8wI,cAAgBl6H,EAAQihI,oBAK7D73I,KAAKovI,cAAgBkB,EAAiBtwI,KAAM4W,EAAS,wBAAyBi6H,GAG9E7wI,KAAK83I,aAAc,EAGnB93I,KAAKm1I,WAAY,EAEjBn1I,KAAK+3I,QAAS,EAEd/3I,KAAKkvI,OAAQ,EAEblvI,KAAK+zI,UAAW,EAGhB/zI,KAAKuvI,WAAY,EAKjB,IAAIyI,GAAqC,IAA1BphI,EAAQqhI,cACvBj4I,KAAKi4I,eAAiBD,EAKtBh4I,KAAK6xI,gBAAkBj7H,EAAQi7H,iBAAmB,OAKlD7xI,KAAKyC,OAAS,EAGdzC,KAAKk4I,SAAU,EAGfl4I,KAAKm4I,OAAS,EAMdn4I,KAAKqxI,MAAO,EAKZrxI,KAAKo4I,kBAAmB,EAGxBp4I,KAAKq4I,QAAU,SAAUttG,IAsQ3B,SAASstG,QAAQ/6F,EAAQvS,GACvB,IAAIrkB,EAAQ42B,EAAO2xF,eACfoC,EAAO3qH,EAAM2qH,KACb3wF,EAAKh6B,EAAM0vH,QACf,GAAkB,mBAAP11F,EAAmB,MAAM,IAAIm1F,GAExC,GAZF,SAASyC,mBAAmB5xH,GAC1BA,EAAMwxH,SAAU,EAChBxxH,EAAM0vH,QAAU,KAChB1vH,EAAMjkB,QAAUikB,EAAM6xH,SACtB7xH,EAAM6xH,SAAW,CACnB,CAMED,CAAmB5xH,GACfqkB,GAlCN,SAASytG,aAAal7F,EAAQ52B,EAAO2qH,EAAMtmG,EAAI2V,KAC3Ch6B,EAAMuwH,UACJ5F,GAGFtwH,EAAQ6+E,SAASl/C,EAAI3V,GAGrBhqB,EAAQ6+E,SAAS64C,YAAan7F,EAAQ52B,GACtC42B,EAAO2xF,eAAeyJ,cAAe,EACrC/H,GAAerzF,EAAQvS,KAIvB2V,EAAG3V,GACHuS,EAAO2xF,eAAeyJ,cAAe,EACrC/H,GAAerzF,EAAQvS,GAGvB0tG,YAAYn7F,EAAQ52B,GAExB,CAaU8xH,CAAal7F,EAAQ52B,EAAO2qH,EAAMtmG,EAAI2V,OAAS,CAErD,IAAIqzF,EAAW4E,WAAWjyH,IAAU42B,EAAOiyF,UACtCwE,GAAartH,EAAMyxH,QAAWzxH,EAAM0xH,mBAAoB1xH,EAAMkyH,iBACjEC,YAAYv7F,EAAQ52B,GAElB2qH,EACFtwH,EAAQ6+E,SAASk5C,WAAYx7F,EAAQ52B,EAAOqtH,EAAUrzF,GAEtDo4F,WAAWx7F,EAAQ52B,EAAOqtH,EAAUrzF,EAExC,CACF,CAvRI23F,CAAQ/6F,EAAQvS,EAClB,EAGA/qC,KAAKo2I,QAAU,KAGfp2I,KAAKu4I,SAAW,EAChBv4I,KAAK44I,gBAAkB,KACvB54I,KAAK+4I,oBAAsB,KAI3B/4I,KAAKi3I,UAAY,EAIjBj3I,KAAKg5I,aAAc,EAGnBh5I,KAAK04I,cAAe,EAGpB14I,KAAK2xI,WAAkC,IAAtB/6H,EAAQ+6H,UAGzB3xI,KAAK4xI,cAAgBh7H,EAAQg7H,YAG7B5xI,KAAKi5I,qBAAuB,EAI5Bj5I,KAAKk3I,mBAAqB,IAAIL,cAAc72I,KAC9C,CAqCA,SAAS6uI,SAASj4H,GAahB,IAAIi6H,EAAW7wI,gBAZf2uI,EAASA,GAAU,EAAQ,QAa3B,IAAKkC,IAAayG,EAAgBjvI,KAAKwmI,SAAU7uI,MAAO,OAAO,IAAI6uI,SAASj4H,GAC5E5W,KAAKivI,eAAiB,IAAIkI,cAAcvgI,EAAS5W,KAAM6wI,GAGvD7wI,KAAKsT,UAAW,EACZsD,IAC2B,mBAAlBA,EAAQxR,QAAsBpF,KAAK22I,OAAS//H,EAAQxR,OACjC,mBAAnBwR,EAAQsiI,SAAuBl5I,KAAKm5I,QAAUviI,EAAQsiI,QAClC,mBAApBtiI,EAAQ8jH,UAAwB16H,KAAKiyI,SAAWr7H,EAAQ8jH,SACtC,mBAAlB9jH,EAAQwiI,QAAsBp5I,KAAKq5I,OAASziI,EAAQwiI,QAEjEtJ,EAAOznI,KAAKrI,KACd,CAgIA,SAASs5I,QAAQh8F,EAAQ52B,EAAOwyH,EAAQ92I,EAAKutI,EAAO1qI,EAAUy7C,GAC5Dh6B,EAAM6xH,SAAWn2I,EACjBskB,EAAM0vH,QAAU11F,EAChBh6B,EAAMwxH,SAAU,EAChBxxH,EAAM2qH,MAAO,EACT3qH,EAAM6oH,UAAW7oH,EAAM2xH,QAAQ,IAAIb,GAAqB,UAAmB0B,EAAQ57F,EAAO67F,QAAQxJ,EAAOjpH,EAAM2xH,SAAc/6F,EAAOq5F,OAAOhH,EAAO1qI,EAAUyhB,EAAM2xH,SACtK3xH,EAAM2qH,MAAO,CACf,CAgDA,SAASyH,WAAWx7F,EAAQ52B,EAAOqtH,EAAUrzF,GACtCqzF,GASP,SAASwF,aAAaj8F,EAAQ52B,GACP,IAAjBA,EAAMjkB,QAAgBikB,EAAMyuH,YAC9BzuH,EAAMyuH,WAAY,EAClB73F,EAAO9T,KAAK,SAEhB,CAdiB+vG,CAAaj8F,EAAQ52B,GACpCA,EAAMuwH,YACNv2F,IACA+3F,YAAYn7F,EAAQ52B,EACtB,CAaA,SAASmyH,YAAYv7F,EAAQ52B,GAC3BA,EAAM0xH,kBAAmB,EACzB,IAAIjlF,EAAQzsC,EAAMkyH,gBAClB,GAAIt7F,EAAO67F,SAAWhmF,GAASA,EAAM7qC,KAAM,CAEzC,IAAI2Q,EAAIvS,EAAMuyH,qBACVpzI,EAAS,IAAI1C,MAAM81B,GACnBugH,EAAS9yH,EAAMwwH,mBACnBsC,EAAOrmF,MAAQA,EAGf,IAFA,IAAIvpB,EAAQ,EACR6vG,GAAa,EACVtmF,GACLttD,EAAO+jC,GAASupB,EACXA,EAAMumF,QAAOD,GAAa,GAC/BtmF,EAAQA,EAAM7qC,KACdshB,GAAS,EAEX/jC,EAAO4zI,WAAaA,EACpBH,QAAQh8F,EAAQ52B,GAAO,EAAMA,EAAMjkB,OAAQoD,EAAQ,GAAI2zI,EAAO1C,QAI9DpwH,EAAMuwH,YACNvwH,EAAMqyH,oBAAsB,KACxBS,EAAOlxH,MACT5B,EAAMwwH,mBAAqBsC,EAAOlxH,KAClCkxH,EAAOlxH,KAAO,MAEd5B,EAAMwwH,mBAAqB,IAAIL,cAAcnwH,GAE/CA,EAAMuyH,qBAAuB,CAC/B,KAAO,CAEL,KAAO9lF,GAAO,CACZ,IAAIw8E,EAAQx8E,EAAMw8E,MACd1qI,EAAWkuD,EAAMluD,SACjBy7C,EAAKyS,EAAM0vB,SASf,GAPAy2D,QAAQh8F,EAAQ52B,GAAO,EADbA,EAAMoqH,WAAa,EAAInB,EAAMltI,OACJktI,EAAO1qI,EAAUy7C,GACpDyS,EAAQA,EAAM7qC,KACd5B,EAAMuyH,uBAKFvyH,EAAMwxH,QACR,KAEJ,CACc,OAAV/kF,IAAgBzsC,EAAMqyH,oBAAsB,KAClD,CACAryH,EAAMkyH,gBAAkBzlF,EACxBzsC,EAAM0xH,kBAAmB,CAC3B,CAoCA,SAASO,WAAWjyH,GAClB,OAAOA,EAAMqxH,QAA2B,IAAjBrxH,EAAMjkB,QAA0C,OAA1BikB,EAAMkyH,kBAA6BlyH,EAAMqtH,WAAartH,EAAMwxH,OAC3G,CACA,SAASyB,UAAUr8F,EAAQ52B,GACzB42B,EAAO+7F,QAAO,SAAUx+H,GACtB6L,EAAMuwH,YACFp8H,GACF81H,GAAerzF,EAAQziC,GAEzB6L,EAAMsyH,aAAc,EACpB17F,EAAO9T,KAAK,aACZivG,YAAYn7F,EAAQ52B,EACtB,GACF,CAaA,SAAS+xH,YAAYn7F,EAAQ52B,GAC3B,IAAIkzH,EAAOjB,WAAWjyH,GACtB,GAAIkzH,IAdN,SAASlD,UAAUp5F,EAAQ52B,GACpBA,EAAMsyH,aAAgBtyH,EAAMoxH,cACF,mBAAlBx6F,EAAO+7F,QAA0B3yH,EAAM6oH,WAKhD7oH,EAAMsyH,aAAc,EACpB17F,EAAO9T,KAAK,eALZ9iB,EAAMuwH,YACNvwH,EAAMoxH,aAAc,EACpB/2H,EAAQ6+E,SAAS+5C,UAAWr8F,EAAQ52B,IAM1C,CAIIgwH,CAAUp5F,EAAQ52B,GACM,IAApBA,EAAMuwH,YACRvwH,EAAMqtH,UAAW,EACjBz2F,EAAO9T,KAAK,UACR9iB,EAAMkrH,cAAa,CAGrB,IAAIiI,EAASv8F,EAAOgyF,iBACfuK,GAAUA,EAAOjI,aAAeiI,EAAO1I,aAC1C7zF,EAAOo9E,SAEX,CAGJ,OAAOkf,CACT,CAxfA,EAAQ,MAAR,CAAoB/K,SAAUiB,GA4G9BqH,cAAc3yI,UAAU6qI,UAAY,SAASA,YAG3C,IAFA,IAAI3gH,EAAU1uB,KAAK44I,gBACfnrI,EAAM,GACHihB,GACLjhB,EAAI3K,KAAK4rB,GACTA,EAAUA,EAAQpG,KAEpB,OAAO7a,CACT,EACA,WACE,IACEnJ,OAAOmH,eAAe0rI,cAAc3yI,UAAW,SAAU,CACvDmH,IAAKyrI,EAAaC,WAAU,SAASyC,4BACnC,OAAO95I,KAAKqvI,WACd,GAAG,6EAAmF,YAE1F,CAAE,MAAO34G,GAAI,CACd,CARD,GAasB,mBAAX7yB,QAAyBA,OAAOk2I,aAAiE,mBAA3Cp+H,SAASnX,UAAUX,OAAOk2I,cACzFzC,EAAkB37H,SAASnX,UAAUX,OAAOk2I,aAC5Cz1I,OAAOmH,eAAeojI,SAAUhrI,OAAOk2I,YAAa,CAClDj1I,MAAO,SAASA,MAAM0Z,GACpB,QAAI84H,EAAgBjvI,KAAKrI,KAAMwe,IAC3Bxe,OAAS6uI,WACNrwH,GAAUA,EAAOywH,0BAA0BkI,cACpD,KAGFG,EAAkB,SAASA,gBAAgB94H,GACzC,OAAOA,aAAkBxe,IAC3B,EA+BF6uI,SAASrqI,UAAU0vI,KAAO,WACxBvD,GAAe3wI,KAAM,IAAIu3I,GAC3B,EAyBA1I,SAASrqI,UAAUY,MAAQ,SAAUuqI,EAAO1qI,EAAUy7C,GACpD,IAAIh6B,EAAQ1mB,KAAKivI,eACbzhI,GAAM,EACNksI,GAAShzH,EAAMoqH,YA3NrB,SAAS2B,cAAcrsI,GACrB,OAAOtC,EAAOuC,SAASD,IAAQA,aAAe2pI,CAChD,CAyNmC0C,CAAc9C,GAc/C,OAbI+J,IAAU51I,EAAOuC,SAASspI,KAC5BA,EAhOJ,SAAS+C,oBAAoB/C,GAC3B,OAAO7rI,EAAOe,KAAK8qI,EACrB,CA8NY+C,CAAoB/C,IAEN,mBAAb1qI,IACTy7C,EAAKz7C,EACLA,EAAW,MAETy0I,EAAOz0I,EAAW,SAAmBA,IAAUA,EAAWyhB,EAAMmrH,iBAClD,mBAAPnxF,IAAmBA,EAAKk3F,KAC/BlxH,EAAMqxH,OArCZ,SAASiC,cAAc18F,EAAQoD,GAC7B,IAAI3V,EAAK,IAAI2sG,GAEb/G,GAAerzF,EAAQvS,GACvBhqB,EAAQ6+E,SAASl/C,EAAI3V,EACvB,CAgCoBivG,CAAch6I,KAAM0gD,IAAag5F,GA3BrD,SAASO,WAAW38F,EAAQ52B,EAAOipH,EAAOjvF,GACxC,IAAI3V,EAMJ,OALc,OAAV4kG,EACF5kG,EAAK,IAAI0sG,GACiB,iBAAV9H,GAAuBjpH,EAAMoqH,aAC7C/lG,EAAK,IAAIh3B,GAAqB,QAAS,CAAC,SAAU,UAAW47H,KAE3D5kG,IACF4lG,GAAerzF,EAAQvS,GACvBhqB,EAAQ6+E,SAASl/C,EAAI3V,IACd,EAGX,CAc8DkvG,CAAWj6I,KAAM0mB,EAAOipH,EAAOjvF,MACzFh6B,EAAMuwH,YACNzpI,EAiDJ,SAAS0sI,cAAc58F,EAAQ52B,EAAOgzH,EAAO/J,EAAO1qI,EAAUy7C,GAC5D,IAAKg5F,EAAO,CACV,IAAIS,EArBR,SAASC,YAAY1zH,EAAOipH,EAAO1qI,GAC5ByhB,EAAMoqH,aAAsC,IAAxBpqH,EAAMuxH,eAA4C,iBAAVtI,IAC/DA,EAAQ7rI,EAAOe,KAAK8qI,EAAO1qI,IAE7B,OAAO0qI,CACT,CAgBmByK,CAAY1zH,EAAOipH,EAAO1qI,GACrC0qI,IAAUwK,IACZT,GAAQ,EACRz0I,EAAW,SACX0qI,EAAQwK,EAEZ,CACA,IAAI/3I,EAAMskB,EAAMoqH,WAAa,EAAInB,EAAMltI,OACvCikB,EAAMjkB,QAAUL,EAChB,IAAIoL,EAAMkZ,EAAMjkB,OAASikB,EAAM0oH,cAE1B5hI,IAAKkZ,EAAMyuH,WAAY,GAC5B,GAAIzuH,EAAMwxH,SAAWxxH,EAAMyxH,OAAQ,CACjC,IAAIvoI,EAAO8W,EAAMqyH,oBACjBryH,EAAMqyH,oBAAsB,CAC1BpJ,MAAOA,EACP1qI,SAAUA,EACVy0I,MAAOA,EACP72D,SAAUniC,EACVp4B,KAAM,MAEJ1Y,EACFA,EAAK0Y,KAAO5B,EAAMqyH,oBAElBryH,EAAMkyH,gBAAkBlyH,EAAMqyH,oBAEhCryH,EAAMuyH,sBAAwB,CAChC,MACEK,QAAQh8F,EAAQ52B,GAAO,EAAOtkB,EAAKutI,EAAO1qI,EAAUy7C,GAEtD,OAAOlzC,CACT,CAlFU0sI,CAAcl6I,KAAM0mB,EAAOgzH,EAAO/J,EAAO1qI,EAAUy7C,IAEpDlzC,CACT,EACAqhI,SAASrqI,UAAU61I,KAAO,WACxBr6I,KAAKivI,eAAekJ,QACtB,EACAtJ,SAASrqI,UAAU81I,OAAS,WAC1B,IAAI5zH,EAAQ1mB,KAAKivI,eACbvoH,EAAMyxH,SACRzxH,EAAMyxH,SACDzxH,EAAMwxH,SAAYxxH,EAAMyxH,QAAWzxH,EAAM0xH,mBAAoB1xH,EAAMkyH,iBAAiBC,YAAY74I,KAAM0mB,GAE/G,EACAmoH,SAASrqI,UAAU+1I,mBAAqB,SAASA,mBAAmBt1I,GAGlE,GADwB,iBAAbA,IAAuBA,EAAWA,EAASqC,iBAChD,CAAC,MAAO,OAAQ,QAAS,QAAS,SAAU,SAAU,OAAQ,QAAS,UAAW,WAAY,OAAOnG,SAAS8D,EAAW,IAAIqC,gBAAkB,GAAI,MAAM,IAAIqwI,GAAqB1yI,GAExL,OADAjF,KAAKivI,eAAe4C,gBAAkB5sI,EAC/BjF,IACT,EACAsE,OAAOmH,eAAeojI,SAASrqI,UAAW,iBAAkB,CAI1DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,gBAAkBjvI,KAAKivI,eAAeI,WACpD,IAQF/qI,OAAOmH,eAAeojI,SAASrqI,UAAW,wBAAyB,CAIjEkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,eAAeG,aAC7B,IAuKFP,SAASrqI,UAAUmyI,OAAS,SAAUhH,EAAO1qI,EAAUy7C,GACrDA,EAAG,IAAI+vF,GAA2B,YACpC,EACA5B,SAASrqI,UAAU20I,QAAU,KAC7BtK,SAASrqI,UAAUjB,IAAM,SAAUosI,EAAO1qI,EAAUy7C,GAClD,IAAIh6B,EAAQ1mB,KAAKivI,eAmBjB,MAlBqB,mBAAVU,GACTjvF,EAAKivF,EACLA,EAAQ,KACR1qI,EAAW,MACkB,mBAAbA,IAChBy7C,EAAKz7C,EACLA,EAAW,MAET0qI,SAAuC3vI,KAAKoF,MAAMuqI,EAAO1qI,GAGzDyhB,EAAMyxH,SACRzxH,EAAMyxH,OAAS,EACfn4I,KAAKs6I,UAIF5zH,EAAMqxH,QAyDb,SAASyC,YAAYl9F,EAAQ52B,EAAOg6B,GAClCh6B,EAAMqxH,QAAS,EACfU,YAAYn7F,EAAQ52B,GAChBg6B,IACEh6B,EAAMqtH,SAAUhzH,EAAQ6+E,SAASl/C,GAASpD,EAAOvV,KAAK,SAAU2Y,IAEtEh6B,EAAMwoH,OAAQ,EACd5xF,EAAOhqC,UAAW,CACpB,CAjEqBknI,CAAYx6I,KAAM0mB,EAAOg6B,GACrC1gD,IACT,EACAsE,OAAOmH,eAAeojI,SAASrqI,UAAW,iBAAkB,CAI1DkH,YAAY,EACZC,IAAK,SAASA,MACZ,OAAO3L,KAAKivI,eAAexsI,MAC7B,IAqEF6B,OAAOmH,eAAeojI,SAASrqI,UAAW,YAAa,CAIrDkH,YAAY,EACZC,IAAK,SAASA,MACZ,YAA4BpF,IAAxBvG,KAAKivI,gBAGFjvI,KAAKivI,eAAeM,SAC7B,EACAhjI,IAAK,SAASA,IAAIzH,GAGX9E,KAAKivI,iBAMVjvI,KAAKivI,eAAeM,UAAYzqI,EAClC,IAEF+pI,SAASrqI,UAAUk2H,QAAU2V,EAAY3V,QACzCmU,SAASrqI,UAAUquI,WAAaxC,EAAYyC,UAC5CjE,SAASrqI,UAAUytI,SAAW,SAAUp3H,EAAK6lC,GAC3CA,EAAG7lC,EACL,oCC9nBI4/H,aACJ,SAAS9vC,gBAAgBvkG,EAAKqQ,EAAK3R,GAA4L,OAAnL2R,EAC5C,SAASikI,eAAej2I,GAAO,IAAIgS,EACnC,SAASkkI,aAAazmI,EAAO0mI,GAAQ,GAAqB,iBAAV1mI,GAAgC,OAAVA,EAAgB,OAAOA,EAAO,IAAI2mI,EAAO3mI,EAAMrQ,OAAO+C,aAAc,QAAaL,IAATs0I,EAAoB,CAAE,IAAIxwI,EAAMwwI,EAAKxyI,KAAK6L,EAAO0mI,GAAQ,WAAY,GAAmB,iBAARvwI,EAAkB,OAAOA,EAAK,MAAM,IAAI1F,UAAU,+CAAiD,CAAE,OAAiB,WAATi2I,EAAoB75I,OAASkI,QAAQiL,EAAQ,CAD/UymI,CAAal2I,EAAK,UAAW,MAAsB,iBAARgS,EAAmBA,EAAM1V,OAAO0V,EAAM,CADxEikI,CAAejkI,MAAiBrQ,EAAO9B,OAAOmH,eAAerF,EAAKqQ,EAAK,CAAE3R,MAAOA,EAAO4G,YAAY,EAAM6H,cAAc,EAAMD,UAAU,IAAkBlN,EAAIqQ,GAAO3R,EAAgBsB,CAAK,CAG3O,IAAI2tI,EAAW,EAAQ,MACnB+G,EAAej3I,OAAO,eACtBk3I,EAAcl3I,OAAO,cACrBm3I,EAASn3I,OAAO,SAChBo3I,EAASp3I,OAAO,SAChBq3I,EAAer3I,OAAO,eACtBs3I,EAAiBt3I,OAAO,iBACxBu3I,EAAUv3I,OAAO,UACrB,SAASw3I,iBAAiBv2I,EAAOuZ,GAC/B,MAAO,CACLvZ,MAAOA,EACPuZ,KAAMA,EAEV,CACA,SAASi9H,eAAevsF,GACtB,IAAI7mB,EAAU6mB,EAAK+rF,GACnB,GAAgB,OAAZ5yG,EAAkB,CACpB,IAAIvhC,EAAOooD,EAAKqsF,GAAS1yI,OAIZ,OAAT/B,IACFooD,EAAKmsF,GAAgB,KACrBnsF,EAAK+rF,GAAgB,KACrB/rF,EAAKgsF,GAAe,KACpB7yG,EAAQmzG,iBAAiB10I,GAAM,IAEnC,CACF,CACA,SAAS40I,WAAWxsF,GAGlBhuC,EAAQ6+E,SAAS07C,eAAgBvsF,EACnC,CAYA,IAAIysF,GAAyBl3I,OAAO8Z,gBAAe,WAAa,IAC5Dq9H,GAAuCn3I,OAAOC,gBAmD/ComG,gBAnD+D8vC,EAAwB,CACxF,UAAIn9F,GACF,OAAOt9C,KAAKo7I,EACd,EACA9yH,KAAM,SAASA,OACb,IAAI4jF,EAAQlsG,KAGRwL,EAAQxL,KAAKg7I,GACjB,GAAc,OAAVxvI,EACF,OAAOy8B,QAAQE,OAAO38B,GAExB,GAAIxL,KAAKi7I,GACP,OAAOhzG,QAAQC,QAAQmzG,sBAAiB90I,GAAW,IAErD,GAAIvG,KAAKo7I,GAAS7L,UAKhB,OAAO,IAAItnG,SAAQ,SAAUC,EAASC,GACpCpnB,EAAQ6+E,UAAS,WACXsM,EAAM8uC,GACR7yG,EAAO+jE,EAAM8uC,IAEb9yG,EAAQmzG,sBAAiB90I,GAAW,GAExC,GACF,IAOF,IACIm1I,EADAC,EAAc37I,KAAKk7I,GAEvB,GAAIS,EACFD,EAAU,IAAIzzG,QAlDpB,SAAS2zG,YAAYD,EAAa5sF,GAChC,OAAO,SAAU7mB,EAASC,GACxBwzG,EAAYha,MAAK,WACX5yE,EAAKksF,GACP/yG,EAAQmzG,sBAAiB90I,GAAW,IAGtCwoD,EAAKosF,GAAgBjzG,EAASC,EAChC,GAAGA,EACL,CACF,CAwC4ByzG,CAAYD,EAAa37I,WAC1C,CAGL,IAAI2G,EAAO3G,KAAKo7I,GAAS1yI,OACzB,GAAa,OAAT/B,EACF,OAAOshC,QAAQC,QAAQmzG,iBAAiB10I,GAAM,IAEhD+0I,EAAU,IAAIzzG,QAAQjoC,KAAKm7I,GAC7B,CAEA,OADAn7I,KAAKk7I,GAAgBQ,EACdA,CACT,GACwC73I,OAAO8xI,eAAe,WAC9D,OAAO31I,IACT,IAAI2qG,gBAAgB8vC,EAAuB,UAAU,SAASoB,UAC5D,IAAIC,EAAS97I,KAIb,OAAO,IAAIioC,SAAQ,SAAUC,EAASC,GACpC2zG,EAAOV,GAAS1gB,QAAQ,MAAM,SAAU7/G,GAClCA,EACFstB,EAAOttB,GAGTqtB,EAAQmzG,sBAAiB90I,GAAW,GACtC,GACF,GACF,IAAIk0I,GAAwBe,IA4D5B37I,EAAOD,QA3DiC,SAASuwI,kCAAkC7yF,GACjF,IAAIy+F,EACA3zH,EAAW9jB,OAAO6kB,OAAOsyH,IAA4D9wC,gBAArBoxC,EAAiB,CAAC,EAAmCX,EAAS,CAChIt2I,MAAOw4C,EACPhqC,UAAU,IACRq3F,gBAAgBoxC,EAAgBjB,EAAc,CAChDh2I,MAAO,KACPwO,UAAU,IACRq3F,gBAAgBoxC,EAAgBhB,EAAa,CAC/Cj2I,MAAO,KACPwO,UAAU,IACRq3F,gBAAgBoxC,EAAgBf,EAAQ,CAC1Cl2I,MAAO,KACPwO,UAAU,IACRq3F,gBAAgBoxC,EAAgBd,EAAQ,CAC1Cn2I,MAAOw4C,EAAOgyF,eAAe6B,WAC7B79H,UAAU,IACRq3F,gBAAgBoxC,EAAgBZ,EAAgB,CAClDr2I,MAAO,SAASA,MAAMojC,EAASC,GAC7B,IAAIxhC,EAAOyhB,EAASgzH,GAAS1yI,OACzB/B,GACFyhB,EAAS8yH,GAAgB,KACzB9yH,EAAS0yH,GAAgB,KACzB1yH,EAAS2yH,GAAe,KACxB7yG,EAAQmzG,iBAAiB10I,GAAM,MAE/ByhB,EAAS0yH,GAAgB5yG,EACzB9f,EAAS2yH,GAAe5yG,EAE5B,EACA70B,UAAU,IACRyoI,IA0BJ,OAzBA3zH,EAAS8yH,GAAgB,KACzBnH,EAASz2F,GAAQ,SAAUziC,GACzB,GAAIA,GAAoB,+BAAbA,EAAIzX,KAAuC,CACpD,IAAI+kC,EAAS/f,EAAS2yH,GAUtB,OAPe,OAAX5yG,IACF/f,EAAS8yH,GAAgB,KACzB9yH,EAAS0yH,GAAgB,KACzB1yH,EAAS2yH,GAAe,KACxB5yG,EAAOttB,SAETuN,EAAS4yH,GAAUngI,EAErB,CACA,IAAIqtB,EAAU9f,EAAS0yH,GACP,OAAZ5yG,IACF9f,EAAS8yH,GAAgB,KACzB9yH,EAAS0yH,GAAgB,KACzB1yH,EAAS2yH,GAAe,KACxB7yG,EAAQmzG,sBAAiB90I,GAAW,KAEtC6hB,EAAS6yH,IAAU,CACrB,IACA39F,EAAO3U,GAAG,WAAY4yG,WAAW9lI,KAAK,KAAM2S,IACrCA,CACT,gCChLA,SAAS1K,QAAQc,EAAQisF,GAAkB,IAAI1sF,EAAOzZ,OAAOyZ,KAAKS,GAAS,GAAIla,OAAOgoB,sBAAuB,CAAE,IAAIytE,EAAUz1F,OAAOgoB,sBAAsB9N,GAASisF,IAAmB1Q,EAAUA,EAAQvjE,QAAO,SAAUxjB,GAAO,OAAO1O,OAAO2Z,yBAAyBO,EAAQxL,GAAKtH,UAAY,KAAKqS,EAAKjb,KAAKkI,MAAM+S,EAAMg8E,EAAU,CAAE,OAAOh8E,CAAM,CACpV,SAAS2sF,cAAc39F,GAAU,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CAAE,IAAI8b,EAAS,MAAQ3W,UAAUnF,GAAKmF,UAAUnF,GAAK,CAAC,EAAGA,EAAI,EAAI2b,QAAQpZ,OAAOuZ,IAAS,GAAIqO,SAAQ,SAAUzV,GAAOk0F,gBAAgB59F,EAAQ0J,EAAKoH,EAAOpH,GAAO,IAAKnS,OAAOsmG,0BAA4BtmG,OAAO4pB,iBAAiBnhB,EAAQzI,OAAOsmG,0BAA0B/sF,IAAWH,QAAQpZ,OAAOuZ,IAASqO,SAAQ,SAAUzV,GAAOnS,OAAOmH,eAAesB,EAAQ0J,EAAKnS,OAAO2Z,yBAAyBJ,EAAQpH,GAAO,GAAI,CAAE,OAAO1J,CAAQ,CACzf,SAAS49F,gBAAgBvkG,EAAKqQ,EAAK3R,GAA4L,OAAnL2R,EAAMikI,eAAejkI,MAAiBrQ,EAAO9B,OAAOmH,eAAerF,EAAKqQ,EAAK,CAAE3R,MAAOA,EAAO4G,YAAY,EAAM6H,cAAc,EAAMD,UAAU,IAAkBlN,EAAIqQ,GAAO3R,EAAgBsB,CAAK,CAE3O,SAAS8kG,kBAAkBn+F,EAAQohB,GAAS,IAAK,IAAIpsB,EAAI,EAAGA,EAAIosB,EAAM1rB,OAAQV,IAAK,CAAE,IAAI0gB,EAAa0L,EAAMpsB,GAAI0gB,EAAW/W,WAAa+W,EAAW/W,aAAc,EAAO+W,EAAWlP,cAAe,EAAU,UAAWkP,IAAYA,EAAWnP,UAAW,GAAMhP,OAAOmH,eAAesB,EAAQ2tI,eAAej4H,EAAWhM,KAAMgM,EAAa,CAAE,CAE5U,SAASi4H,eAAej2I,GAAO,IAAIgS,EACnC,SAASkkI,aAAazmI,EAAO0mI,GAAQ,GAAqB,iBAAV1mI,GAAgC,OAAVA,EAAgB,OAAOA,EAAO,IAAI2mI,EAAO3mI,EAAMrQ,OAAO+C,aAAc,QAAaL,IAATs0I,EAAoB,CAAE,IAAIxwI,EAAMwwI,EAAKxyI,KAAK6L,EAAO0mI,GAAQ,WAAY,GAAmB,iBAARvwI,EAAkB,OAAOA,EAAK,MAAM,IAAI1F,UAAU,+CAAiD,CAAE,OAAiB,WAATi2I,EAAoB75I,OAASkI,QAAQiL,EAAQ,CAD/UymI,CAAal2I,EAAK,UAAW,MAAsB,iBAARgS,EAAmBA,EAAM1V,OAAO0V,EAAM,CAE1H,IACE3S,EADa,EAAQ,OACHA,OAElB+I,EADc,EAAQ,OACFA,QAClBovF,EAASpvF,GAAWA,EAAQovF,QAAU,UAI1Cp8F,EAAOD,QAAuB,WAC5B,SAASwwI,cAdX,SAASjkC,gBAAgBC,EAAUC,GAAe,KAAMD,aAAoBC,GAAgB,MAAM,IAAI1nG,UAAU,oCAAwC,CAepJwnG,CAAgBnsG,KAAMowI,YACtBpwI,KAAKqpE,KAAO,KACZrpE,KAAKggE,KAAO,KACZhgE,KAAKyC,OAAS,CAChB,CA6JA,OA9KF,SAASkqG,aAAaN,EAAaO,EAAYC,GAAyN,OAAtMD,GAAY1B,kBAAkBmB,EAAY7nG,UAAWooG,GAAiBC,GAAa3B,kBAAkBmB,EAAaQ,GAAcvoG,OAAOmH,eAAe4gG,EAAa,YAAa,CAAE/4F,UAAU,IAAiB+4F,CAAa,CAkB1RM,CAAayjC,WAAY,CAAC,CACxB35H,IAAK,OACL3R,MAAO,SAAShC,KAAKotD,GACnB,IAAIiD,EAAQ,CACVxsD,KAAMupD,EACN5nC,KAAM,MAEJtoB,KAAKyC,OAAS,EAAGzC,KAAKggE,KAAK13C,KAAO6qC,EAAWnzD,KAAKqpE,KAAOlW,EAC7DnzD,KAAKggE,KAAO7M,IACVnzD,KAAKyC,MACT,GACC,CACDgU,IAAK,UACL3R,MAAO,SAAS2kC,QAAQymB,GACtB,IAAIiD,EAAQ,CACVxsD,KAAMupD,EACN5nC,KAAMtoB,KAAKqpE,MAEO,IAAhBrpE,KAAKyC,SAAczC,KAAKggE,KAAO7M,GACnCnzD,KAAKqpE,KAAOlW,IACVnzD,KAAKyC,MACT,GACC,CACDgU,IAAK,QACL3R,MAAO,SAASwmC,QACd,GAAoB,IAAhBtrC,KAAKyC,OAAT,CACA,IAAI+K,EAAMxN,KAAKqpE,KAAK1iE,KAGpB,OAFoB,IAAhB3G,KAAKyC,OAAczC,KAAKqpE,KAAOrpE,KAAKggE,KAAO,KAAUhgE,KAAKqpE,KAAOrpE,KAAKqpE,KAAK/gD,OAC7EtoB,KAAKyC,OACA+K,CAJsB,CAK/B,GACC,CACDiJ,IAAK,QACL3R,MAAO,SAAS+sC,QACd7xC,KAAKqpE,KAAOrpE,KAAKggE,KAAO,KACxBhgE,KAAKyC,OAAS,CAChB,GACC,CACDgU,IAAK,OACL3R,MAAO,SAAS7B,KAAKi2C,GACnB,GAAoB,IAAhBl5C,KAAKyC,OAAc,MAAO,GAG9B,IAFA,IAAI2oG,EAAIprG,KAAKqpE,KACT77D,EAAM,GAAK49F,EAAEzkG,KACVykG,EAAIA,EAAE9iF,MAAM9a,GAAO0rC,EAAIkyD,EAAEzkG,KAChC,OAAO6G,CACT,GACC,CACDiJ,IAAK,SACL3R,MAAO,SAASsH,OAAOrE,GACrB,GAAoB,IAAhB/H,KAAKyC,OAAc,OAAOqB,EAAOE,MAAM,GAI3C,IAHA,IA5Dc4Q,EAAK7H,EAAQ/D,EA4DvBwE,EAAM1J,EAAOc,YAAYmD,IAAM,GAC/BqjG,EAAIprG,KAAKqpE,KACTtnE,EAAI,EACDqpG,GA/DOx2F,EAgEDw2F,EAAEzkG,KAhEIoG,EAgEES,EAhEMxE,EAgEDjH,EA/D9B+B,EAAOU,UAAUmB,KAAK0C,KAAKuM,EAAK7H,EAAQ/D,GAgElCjH,GAAKqpG,EAAEzkG,KAAKlE,OACZ2oG,EAAIA,EAAE9iF,KAER,OAAO9a,CACT,GAGC,CACDiJ,IAAK,UACL3R,MAAO,SAAS6uI,QAAQ5rI,EAAGi0I,GACzB,IAAIxuI,EAYJ,OAXIzF,EAAI/H,KAAKqpE,KAAK1iE,KAAKlE,QAErB+K,EAAMxN,KAAKqpE,KAAK1iE,KAAKtB,MAAM,EAAG0C,GAC9B/H,KAAKqpE,KAAK1iE,KAAO3G,KAAKqpE,KAAK1iE,KAAKtB,MAAM0C,IAGtCyF,EAFSzF,IAAM/H,KAAKqpE,KAAK1iE,KAAKlE,OAExBzC,KAAKsrC,QAGL0wG,EAAah8I,KAAKi8I,WAAWl0I,GAAK/H,KAAKk8I,WAAWn0I,GAEnDyF,CACT,GACC,CACDiJ,IAAK,QACL3R,MAAO,SAAS6K,QACd,OAAO3P,KAAKqpE,KAAK1iE,IACnB,GAGC,CACD8P,IAAK,aACL3R,MAAO,SAASm3I,WAAWl0I,GACzB,IAAIqjG,EAAIprG,KAAKqpE,KACTr/D,EAAI,EACJwD,EAAM49F,EAAEzkG,KAEZ,IADAoB,GAAKyF,EAAI/K,OACF2oG,EAAIA,EAAE9iF,MAAM,CACjB,IAAI3nB,EAAMyqG,EAAEzkG,KACR6tG,EAAKzsG,EAAIpH,EAAI8B,OAAS9B,EAAI8B,OAASsF,EAGvC,GAFIysG,IAAO7zG,EAAI8B,OAAQ+K,GAAO7M,EAAS6M,GAAO7M,EAAI0E,MAAM,EAAG0C,GAEjD,KADVA,GAAKysG,GACQ,CACPA,IAAO7zG,EAAI8B,UACXuH,EACEohG,EAAE9iF,KAAMtoB,KAAKqpE,KAAO+hC,EAAE9iF,KAAUtoB,KAAKqpE,KAAOrpE,KAAKggE,KAAO,OAE5DhgE,KAAKqpE,KAAO+hC,EACZA,EAAEzkG,KAAOhG,EAAI0E,MAAMmvG,IAErB,KACF,GACExqG,CACJ,CAEA,OADAhK,KAAKyC,QAAUuH,EACRwD,CACT,GAGC,CACDiJ,IAAK,aACL3R,MAAO,SAASo3I,WAAWn0I,GACzB,IAAIyF,EAAM1J,EAAOc,YAAYmD,GACzBqjG,EAAIprG,KAAKqpE,KACTr/D,EAAI,EAGR,IAFAohG,EAAEzkG,KAAKhB,KAAK6H,GACZzF,GAAKqjG,EAAEzkG,KAAKlE,OACL2oG,EAAIA,EAAE9iF,MAAM,CACjB,IAAIjkB,EAAM+mG,EAAEzkG,KACR6tG,EAAKzsG,EAAI1D,EAAI5B,OAAS4B,EAAI5B,OAASsF,EAGvC,GAFA1D,EAAIsB,KAAK6H,EAAKA,EAAI/K,OAASsF,EAAG,EAAGysG,GAEvB,KADVzsG,GAAKysG,GACQ,CACPA,IAAOnwG,EAAI5B,UACXuH,EACEohG,EAAE9iF,KAAMtoB,KAAKqpE,KAAO+hC,EAAE9iF,KAAUtoB,KAAKqpE,KAAOrpE,KAAKggE,KAAO,OAE5DhgE,KAAKqpE,KAAO+hC,EACZA,EAAEzkG,KAAOtC,EAAIgB,MAAMmvG,IAErB,KACF,GACExqG,CACJ,CAEA,OADAhK,KAAKyC,QAAUuH,EACRwD,CACT,GAGC,CACDiJ,IAAKwlF,EACLn3F,MAAO,SAASA,MAAM4xB,EAAG9f,GACvB,OAAO/J,EAAQ7M,KAAM0qG,cAAcA,cAAc,CAAC,EAAG9zF,GAAU,CAAC,EAAG,CAEjEuuD,MAAO,EAEPu3B,eAAe,IAEnB,KAEK0zC,UACT,CApK8B,gDCiC9B,SAAS+L,oBAAoBz2H,EAAM7K,GACjCuhI,YAAY12H,EAAM7K,GAClBwhI,YAAY32H,EACd,CACA,SAAS22H,YAAY32H,GACfA,EAAKupH,iBAAmBvpH,EAAKupH,eAAe0C,WAC5CjsH,EAAK4pH,iBAAmB5pH,EAAK4pH,eAAeqC,WAChDjsH,EAAK8jB,KAAK,QACZ,CAkBA,SAAS4yG,YAAY12H,EAAM7K,GACzB6K,EAAK8jB,KAAK,QAAS3uB,EACrB,CAYAhb,EAAOD,QAAU,CACf86H,QAzFF,SAASA,QAAQ7/G,EAAK6lC,GACpB,IAAIwrD,EAAQlsG,KACRs8I,EAAoBt8I,KAAKsvI,gBAAkBtvI,KAAKsvI,eAAeC,UAC/DgN,EAAoBv8I,KAAKivI,gBAAkBjvI,KAAKivI,eAAeM,UACnE,OAAI+M,GAAqBC,GACnB77F,EACFA,EAAG7lC,GACMA,IACJ7a,KAAKivI,eAEEjvI,KAAKivI,eAAeyJ,eAC9B14I,KAAKivI,eAAeyJ,cAAe,EACnC33H,EAAQ6+E,SAASw8C,YAAap8I,KAAM6a,IAHpCkG,EAAQ6+E,SAASw8C,YAAap8I,KAAM6a,IAMjC7a,OAMLA,KAAKsvI,iBACPtvI,KAAKsvI,eAAeC,WAAY,GAI9BvvI,KAAKivI,iBACPjvI,KAAKivI,eAAeM,WAAY,GAElCvvI,KAAKiyI,SAASp3H,GAAO,MAAM,SAAUA,IAC9B6lC,GAAM7lC,EACJqxF,EAAM+iC,eAEC/iC,EAAM+iC,eAAeyJ,aAI/B33H,EAAQ6+E,SAASy8C,YAAanwC,IAH9BA,EAAM+iC,eAAeyJ,cAAe,EACpC33H,EAAQ6+E,SAASu8C,oBAAqBjwC,EAAOrxF,IAH7CkG,EAAQ6+E,SAASu8C,oBAAqBjwC,EAAOrxF,GAOtC6lC,GACT3/B,EAAQ6+E,SAASy8C,YAAanwC,GAC9BxrD,EAAG7lC,IAEHkG,EAAQ6+E,SAASy8C,YAAanwC,EAElC,IACOlsG,KACT,EA2CE8yI,UAjCF,SAASA,YACH9yI,KAAKsvI,iBACPtvI,KAAKsvI,eAAeC,WAAY,EAChCvvI,KAAKsvI,eAAe8B,SAAU,EAC9BpxI,KAAKsvI,eAAeJ,OAAQ,EAC5BlvI,KAAKsvI,eAAe6B,YAAa,GAE/BnxI,KAAKivI,iBACPjvI,KAAKivI,eAAeM,WAAY,EAChCvvI,KAAKivI,eAAeC,OAAQ,EAC5BlvI,KAAKivI,eAAe8I,QAAS,EAC7B/3I,KAAKivI,eAAe6I,aAAc,EAClC93I,KAAKivI,eAAe+J,aAAc,EAClCh5I,KAAKivI,eAAe8E,UAAW,EAC/B/zI,KAAKivI,eAAeyJ,cAAe,EAEvC,EAkBE/H,eAdF,SAASA,eAAerzF,EAAQziC,GAO9B,IAAIg/H,EAASv8F,EAAOgyF,eAChBwE,EAASx2F,EAAO2xF,eAChB4K,GAAUA,EAAOjI,aAAekC,GAAUA,EAAOlC,YAAat0F,EAAOo9E,QAAQ7/G,GAAUyiC,EAAO9T,KAAK,QAAS3uB,EAClH,gCCrFA,IAAI2hI,EAA6B,WAAiCA,2BAYlE,SAASz2D,OAAQ,CAoEjBlmF,EAAOD,QAhEP,SAAS68I,IAAIn/F,EAAQrH,EAAM4sC,GACzB,GAAoB,mBAAT5sC,EAAqB,OAAOwmG,IAAIn/F,EAAQ,KAAMrH,GACpDA,IAAMA,EAAO,CAAC,GACnB4sC,EAlBF,SAAS96C,KAAK86C,GACZ,IAAIt/B,GAAS,EACb,OAAO,WACL,IAAIA,EAAJ,CACAA,GAAS,EACT,IAAK,IAAI5qB,EAAOzxB,UAAUzE,OAAQyhB,EAAO,IAAI/gB,MAAMw1B,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/E1U,EAAK0U,GAAQ1xB,UAAU0xB,GAEzBiqD,EAAS73E,MAAMhL,KAAMkkB,EALH,CAMpB,CACF,CAQa6jB,CAAK86C,GAAYkD,MAC5B,IAAIgpD,EAAW94F,EAAK84F,WAA8B,IAAlB94F,EAAK84F,UAAsBzxF,EAAOyxF,SAC9Dz7H,EAAW2iC,EAAK3iC,WAA8B,IAAlB2iC,EAAK3iC,UAAsBgqC,EAAOhqC,SAC9DopI,EAAiB,SAASA,iBACvBp/F,EAAOhqC,UAAUwhI,GACxB,EACI6H,EAAgBr/F,EAAO2xF,gBAAkB3xF,EAAO2xF,eAAe8E,SAC/De,EAAW,SAASA,WACtBxhI,GAAW,EACXqpI,GAAgB,EACX5N,GAAUlsD,EAASx6E,KAAKi1C,EAC/B,EACIs/F,EAAgBt/F,EAAOgyF,gBAAkBhyF,EAAOgyF,eAAe6B,WAC/DnC,EAAQ,SAASA,QACnBD,GAAW,EACX6N,GAAgB,EACXtpI,GAAUuvE,EAASx6E,KAAKi1C,EAC/B,EACI03F,EAAU,SAASA,QAAQn6H,GAC7BgoE,EAASx6E,KAAKi1C,EAAQziC,EACxB,EACIg6H,EAAU,SAASA,UACrB,IAAIh6H,EACJ,OAAIk0H,IAAa6N,GACVt/F,EAAOgyF,gBAAmBhyF,EAAOgyF,eAAeJ,QAAOr0H,EAAM,IAAI2hI,GAC/D35D,EAASx6E,KAAKi1C,EAAQziC,IAE3BvH,IAAaqpI,GACVr/F,EAAO2xF,gBAAmB3xF,EAAO2xF,eAAeC,QAAOr0H,EAAM,IAAI2hI,GAC/D35D,EAASx6E,KAAKi1C,EAAQziC,SAF/B,CAIF,EACIgiI,GAAY,SAASA,YACvBv/F,EAAOw/F,IAAIn0G,GAAG,SAAUmsG,EAC1B,EAcA,OAtDF,SAASiI,UAAUz/F,GACjB,OAAOA,EAAO0/F,WAAqC,mBAAjB1/F,EAAO2/F,KAC3C,CAuCMF,CAAUz/F,GAIHhqC,IAAagqC,EAAO2xF,iBAE7B3xF,EAAO3U,GAAG,MAAO+zG,GACjBp/F,EAAO3U,GAAG,QAAS+zG,KANnBp/F,EAAO3U,GAAG,WAAYmsG,GACtBx3F,EAAO3U,GAAG,QAASksG,GACfv3F,EAAOw/F,IAAKD,KAAiBv/F,EAAO3U,GAAG,UAAWk0G,KAMxDv/F,EAAO3U,GAAG,MAAOqmG,GACjB1xF,EAAO3U,GAAG,SAAUmsG,IACD,IAAf7+F,EAAKzqC,OAAiB8xC,EAAO3U,GAAG,QAASqsG,GAC7C13F,EAAO3U,GAAG,QAASksG,GACZ,WACLv3F,EAAOjV,eAAe,WAAYysG,GAClCx3F,EAAOjV,eAAe,QAASwsG,GAC/Bv3F,EAAOjV,eAAe,UAAWw0G,IAC7Bv/F,EAAOw/F,KAAKx/F,EAAOw/F,IAAIz0G,eAAe,SAAUysG,GACpDx3F,EAAOjV,eAAe,MAAOq0G,GAC7Bp/F,EAAOjV,eAAe,QAASq0G,GAC/Bp/F,EAAOjV,eAAe,SAAUysG,GAChCx3F,EAAOjV,eAAe,MAAO2mG,GAC7B1xF,EAAOjV,eAAe,QAAS2sG,GAC/B13F,EAAOjV,eAAe,QAASwsG,EACjC,CACF,aCpFAh1I,EAAOD,QAAU,WACf,MAAM,IAAIyD,MAAM,gDAClB,gCCGA,IAAIo5I,EASJ,IAAIlM,EAAiB,WACnB2M,EAAmB3M,EAAe2M,iBAClC1F,EAAuBjH,EAAeiH,qBACxC,SAASzxD,KAAKlrE,GAEZ,GAAIA,EAAK,MAAMA,CACjB,CA+BA,SAASxS,KAAK4M,GACZA,GACF,CACA,SAASi/H,KAAKrvI,EAAMu7D,GAClB,OAAOv7D,EAAKqvI,KAAK9zE,EACnB,CA6BAvgE,EAAOD,QAvBP,SAASu9I,WACP,IAAK,IAAIxkH,EAAOzxB,UAAUzE,OAAQ26I,EAAU,IAAIj6I,MAAMw1B,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAClFwkH,EAAQxkH,GAAQ1xB,UAAU0xB,GAE5B,IAKIptB,EALAq3E,EATN,SAASw6D,YAAYD,GACnB,OAAKA,EAAQ36I,OAC8B,mBAAhC26I,EAAQA,EAAQ36I,OAAS,GAA0BsjF,KACvDq3D,EAAQrlH,MAFaguD,IAG9B,CAKiBs3D,CAAYD,GAE3B,GADIj6I,MAAMuD,QAAQ02I,EAAQ,MAAKA,EAAUA,EAAQ,IAC7CA,EAAQ36I,OAAS,EACnB,MAAM,IAAIy6I,EAAiB,WAG7B,IAAII,EAAWF,EAAQhnH,KAAI,SAAUknB,EAAQv7C,GAC3C,IAAIqvI,EAAUrvI,EAAIq7I,EAAQ36I,OAAS,EAEnC,OAnDJ,SAAS86I,UAAUjgG,EAAQ8zF,EAAS8G,EAASr1D,GAC3CA,EAnBF,SAAS96C,KAAK86C,GACZ,IAAIt/B,GAAS,EACb,OAAO,WACDA,IACJA,GAAS,EACTs/B,EAAS73E,WAAM,EAAQ9D,WACzB,CACF,CAYa6gC,CAAK86C,GAChB,IAAI26D,GAAS,EACblgG,EAAO3U,GAAG,SAAS,WACjB60G,GAAS,CACX,SACYj3I,IAARk2I,IAAmBA,EAAM,EAAQ,OACrCA,EAAIn/F,EAAQ,CACVyxF,SAAUqC,EACV99H,SAAU4kI,IACT,SAAUr9H,GACX,GAAIA,EAAK,OAAOgoE,EAAShoE,GACzB2iI,GAAS,EACT36D,GACF,IACA,IAAI0sD,GAAY,EAChB,OAAO,SAAU10H,GACf,IAAI2iI,IACAjO,EAIJ,OAHAA,GAAY,EAtBhB,SAASwN,UAAUz/F,GACjB,OAAOA,EAAO0/F,WAAqC,mBAAjB1/F,EAAO2/F,KAC3C,CAuBQF,CAAUz/F,GAAgBA,EAAO2/F,QACP,mBAAnB3/F,EAAOo9E,QAA+Bp9E,EAAOo9E,eACxD73C,EAAShoE,GAAO,IAAI28H,EAAqB,QAC3C,CACF,CAyBW+F,CAAUjgG,EAAQ8zF,EADXrvI,EAAI,GACyB,SAAU8Y,GAC9CrP,IAAOA,EAAQqP,GAChBA,GAAKyiI,EAASpxH,QAAQ7jB,MACtB+oI,IACJkM,EAASpxH,QAAQ7jB,MACjBw6E,EAASr3E,GACX,GACF,IACA,OAAO4xI,EAAQjmH,OAAO+8G,KACxB,gCClFA,IAAIuJ,EAAwB,WAAiCA,sBAiB7D59I,EAAOD,QAAU,CACf0wI,iBAdF,SAASA,iBAAiB5pH,EAAO9P,EAAS8mI,EAAW7M,GACnD,IAAI8M,EAJN,SAASC,kBAAkBhnI,EAASi6H,EAAU6M,GAC5C,OAAgC,MAAzB9mI,EAAQw4H,cAAwBx4H,EAAQw4H,cAAgByB,EAAWj6H,EAAQ8mI,GAAa,IACjG,CAEYE,CAAkBhnI,EAASi6H,EAAU6M,GAC/C,GAAW,MAAPC,EAAa,CACf,IAAMtwI,SAASswI,IAAQxzI,KAAK6J,MAAM2pI,KAASA,GAAQA,EAAM,EAEvD,MAAM,IAAIF,EADC5M,EAAW6M,EAAY,gBACIC,GAExC,OAAOxzI,KAAK6J,MAAM2pI,EACpB,CAGA,OAAOj3H,EAAMoqH,WAAa,GAAK,KACjC,oBClBAjxI,EAAOD,QAAU,EAAjB,kDCEA0E,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAGT,IAEI+4I,EAIJ,SAASxzC,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAEsQ,QAAStQ,EAAO,CAJ5EikG,CAFD,EAAQ,QAIrByzC,EAAa,EAAQ,OAIzBl+I,EAAA,QAAkB,SAAUm+I,GAC1B,IAAIC,EAAkB92I,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK22I,EAAYnnI,QAAQ84B,IAE1GyuG,EAAc35I,OAAOyZ,KAAKggI,GAG9B,OAAO,WACL,IAAIG,EAAah3I,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK82I,IACjF3kB,EAASnyH,UAAU,GAYvB,OAAOg3I,EAAWlnF,eAAc,SAAUmnF,GACxCF,EAAY/xH,SAAQ,SAAUkyH,GAC5B,IAEIC,GAAkB3zE,EAFRqzE,EAASK,IACED,EAAexyI,IAAIyyI,GACM/kB,IAElD,EAAIykB,EAAWQ,mBAAmBD,EAAiBD,EAAa/kB,GAEhE8kB,EAAe5xI,IAAI6xI,EAAaC,EAClC,GACF,GACF,CACF,EAEAx+I,EAAOD,QAAUA,EAAiB,sCC3ClCA,EAAQ,OAAkB2G,EAE1B,IAEIg4I,EAEJ,SAASl0C,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAEsQ,QAAStQ,EAAO,CAFtEikG,CAFA,EAAQ,QAMhCzqG,EAAQ,EAAkB2+I,EAAkB7nI,oCCX5CpS,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAGTlF,EAAA,QAAkB,SAAUy5H,GAC1B,OAAOA,GAA0B,iBAAhBA,EAAO5yH,KAA0B,8CAAgD,wCACpG,EAEA5G,EAAOD,QAAUA,EAAiB,sCCRlC0E,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAGT,IAEI+4I,EAAcxzC,uBAFD,EAAQ,QAMrBm0C,EAAiBn0C,uBAFD,EAAQ,QAI5B,SAASA,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAEsQ,QAAStQ,EAAO,CAE9FxG,EAAA,QAAkB,SAAU8mB,EAAOq3H,EAAU1kB,GAC3C,IAAIolB,EAAen6I,OAAOyZ,KAAKggI,GAE/B,IAAKU,EAAah8I,OAChB,MAAO,gIAGT,IAAIi8I,GAAY,EAAIF,EAAe9nI,SAAS2iH,GAE5C,GAAIwkB,EAAYnnI,QAAQioI,aAAed,EAAYnnI,QAAQioI,YAAYj4H,IAAUm3H,EAAYnnI,QAAQ2T,SAASoiC,WAAW/lC,GACvH,MAAO,OAASg4H,EAAY,2IAA6ID,EAAax7I,KAAK,QAAU,KAGvM,IAAI27I,EAA+Bl4H,EAAMkqC,QAAQmX,SAASrW,UAAUl7B,QAAO,SAAUhjB,GACnF,OAAQuqI,EAAS3nI,eAAe5C,EAClC,IAEA,OAAIorI,EAA6Bn8I,OAAS,EACjC,eAAyD,IAAxCm8I,EAA6Bn8I,OAAe,WAAa,cAAgB,KAAOm8I,EAA6B37I,KAAK,QAAU,cAAgBy7I,EAAY,wEAA0ED,EAAax7I,KAAK,QAAU,4CAGjR,IACT,EAEApD,EAAOD,QAAUA,EAAiB,sCCtClC0E,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAETlF,EAAQ0+I,kBAAoB1+I,EAAQi/I,wCAA0Cj/I,EAAQk/I,kBAAev4I,EAErG,IAEIw4I,EAAiB10C,uBAFA,EAAQ,QAMzB20C,EAA4C30C,uBAFA,EAAQ,QAMpD40C,EAAsB50C,uBAFA,EAAQ,QAIlC,SAASA,uBAAuBjkG,GAAO,OAAOA,GAAOA,EAAIokG,WAAapkG,EAAM,CAAEsQ,QAAStQ,EAAO,CAE9FxG,EAAQk/I,aAAeC,EAAeroI,QACtC9W,EAAQi/I,wCAA0CG,EAA0CtoI,QAC5F9W,EAAQ0+I,kBAAoBW,EAAoBvoI,oCCrBhDpS,OAAOmH,eAAe7L,EAAS,aAAc,CAC3CkF,OAAO,IAGTlF,EAAA,QAAkB,SAAUs/I,EAAWd,EAAa/kB,GAElD,QAAkB9yH,IAAd24I,EACF,MAAM,IAAI77I,MAAM,YAAc+6I,EAAc,uCAAyC/kB,EAAO5yH,KAAO,gFAEvG,EAEA5G,EAAOD,QAAUA,EAAiB,gCCAlC,IACIqzD,EADA5oD,EAAM,GAOVxK,EAAOD,QAoBP,SAASklG,OAAOnkG,EAAK6C,GACnB,GAAmB,iBAAR7C,EACT,MAAM,IAAIgE,UAAU,qBAItB,GAAY,IAARnB,EAAW,OAAO7C,EACtB,GAAY,IAAR6C,EAAW,OAAO7C,EAAMA,EAE5B,IAAImM,EAAMnM,EAAI8B,OAASe,EACvB,GAAIyvD,IAAUtyD,QAAwB,IAAVsyD,EAC1BA,EAAQtyD,EACR0J,EAAM,QACD,GAAIA,EAAI5H,QAAUqK,EACvB,OAAOzC,EAAIf,OAAO,EAAGwD,GAGvB,KAAOA,EAAMzC,EAAI5H,QAAUe,EAAM,GACrB,EAANA,IACF6G,GAAO1J,GAGT6C,IAAQ,EACR7C,GAAOA,EAKT,OADA0J,GADAA,GAAO1J,GACG2I,OAAO,EAAGwD,EAEtB,0BC1DAjN,EAAOD,QAAU,SAASu/I,SAASC,EAAMC,GAIvC,GAHAA,EAAWA,EAAS1qI,MAAM,KAAK,KAC/ByqI,GAAQA,GAEG,OAAO,EAElB,OAAQC,GACN,IAAK,OACL,IAAK,KACL,OAAgB,KAATD,EAEP,IAAK,QACL,IAAK,MACL,OAAgB,MAATA,EAEP,IAAK,MACL,OAAgB,KAATA,EAEP,IAAK,SACL,OAAgB,KAATA,EAEP,IAAK,OACL,OAAO,EAGT,OAAgB,IAATA,CACT,mBCrCA,MAAMhyD,EAAY,EAAQ,OACpBhE,EAAY,EAAQ,OACpBk2D,EAAY,EAAQ,OACpBC,EAAY,EAAQ,OAG1B1/I,EAAOD,QAAW4/I,IAChB,IAAWvmH,EAAGjvB,EAAVjI,EAAI,EACNuB,EAAQ,CAAEmD,KAAM2iF,EAAM+e,KAAM10F,MAAO,IAGnCgsI,EAAYn8I,EACZsM,EAAOtM,EAAMmQ,MACbisI,EAAa,GAGXC,UAAa59I,IACfqrF,EAAK5hF,MAAMg0I,EAAW,gCAA+Bz9I,EAAI,GAAI,EAI3DpB,EAAMysF,EAAKwyD,WAAWJ,GAI1B,IAHAvmH,EAAIt4B,EAAI8B,OAGDV,EAAIk3B,GAGT,OAFAjvB,EAAIrJ,EAAIoB,MAIN,IAAK,KAGH,OAFAiI,EAAIrJ,EAAIoB,MAGN,IAAK,IACH6N,EAAK9M,KAAKy8I,EAAUM,gBACpB,MAEF,IAAK,IACHjwI,EAAK9M,KAAKy8I,EAAUO,mBACpB,MAEF,IAAK,IACHlwI,EAAK9M,KAAKw8I,EAAK58D,SACf,MAEF,IAAK,IACH9yE,EAAK9M,KAAKw8I,EAAKS,YACf,MAEF,IAAK,IACHnwI,EAAK9M,KAAKw8I,EAAKU,QACf,MAEF,IAAK,IACHpwI,EAAK9M,KAAKw8I,EAAKW,WACf,MAEF,IAAK,IACHrwI,EAAK9M,KAAKw8I,EAAKY,cACf,MAEF,IAAK,IACHtwI,EAAK9M,KAAKw8I,EAAKa,iBACf,MAEF,QAGM,KAAK7+I,KAAK0I,GACZ4F,EAAK9M,KAAK,CAAE2D,KAAM2iF,EAAM2f,UAAWjkG,MAAOuE,SAASW,EAAG,MAItD4F,EAAK9M,KAAK,CAAE2D,KAAM2iF,EAAM4f,KAAMlkG,MAAOkF,EAAE1H,WAAW,KAIxD,MAIF,IAAK,IACHsN,EAAK9M,KAAKy8I,EAAU9qG,SACpB,MAEF,IAAK,IACH7kC,EAAK9M,KAAKy8I,EAAUh8I,OACpB,MAIF,IAAK,IAEH,IAAIynE,GACW,MAAXrqE,EAAIoB,IACNipE,IAAM,EACNjpE,KAEAipE,IAAM,EAIR,IAAIo1E,GAAchzD,EAAKizD,cAAc1/I,EAAI0E,MAAMtD,GAAIy9I,GAGnDz9I,GAAKq+I,GAAY,GACjBxwI,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAMuf,IACZp8F,IAAK6zI,GAAY,GACjBp1E,SAGF,MAIF,IAAK,IACHp7D,EAAK9M,KAAKw8I,EAAKgB,WACf,MAIF,IAAK,IAEH,IAAIC,GAAQ,CACV95I,KAAM2iF,EAAMgf,MACZ30F,MAAO,GACP80F,UAAU,GAMF,OAHVv+F,EAAIrJ,EAAIoB,MAINiI,EAAIrJ,EAAIoB,EAAI,GACZA,GAAK,EAGK,MAANiI,EACFu2I,GAAMl4C,YAAa,EAGJ,MAANr+F,EACTu2I,GAAMj4C,eAAgB,EAEP,MAANt+F,GACTojF,EAAK5hF,MAAMg0I,EACT,6BAA6Bx1I,2BACLjI,EAAI,IAGhCw+I,GAAMh4C,UAAW,GAInB34F,EAAK9M,KAAKy9I,IAGVb,EAAW58I,KAAK28I,GAGhBA,EAAYc,GACZ3wI,EAAO2wI,GAAM9sI,MACb,MAIF,IAAK,IACuB,IAAtBisI,EAAWj9I,QACb2qF,EAAK5hF,MAAMg0I,EAAW,0BAAyBz9I,EAAI,IAMrD6N,GAJA6vI,EAAYC,EAAW3nH,OAINnhB,QACf6oI,EAAU7oI,QAAQ6oI,EAAU7oI,QAAQnU,OAAS,GAAKg9I,EAAUhsI,MAC9D,MAIF,IAAK,IAGEgsI,EAAU7oI,UACb6oI,EAAU7oI,QAAU,CAAC6oI,EAAUhsI,cACxBgsI,EAAUhsI,OAInB,IAAIA,GAAQ,GACZgsI,EAAU7oI,QAAQ9T,KAAK2Q,IACvB7D,EAAO6D,GACP,MAQF,IAAK,IACH,IAAkDrJ,GAAK0C,GAAnDwpI,GAAK,qBAAqBhzH,KAAK3iB,EAAI0E,MAAMtD,IAClC,OAAPu0I,IACkB,IAAhB1mI,EAAKnN,QACPk9I,UAAU59I,GAEZqI,GAAMf,SAASitI,GAAG,GAAI,IACtBxpI,GAAMwpI,GAAG,GAAKA,GAAG,GAAKjtI,SAASitI,GAAG,GAAI,IAAM9hI,IAAWpK,GACvDrI,GAAKu0I,GAAG,GAAG7zI,OAEXmN,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM0f,WACZ1+F,OACA0C,OACAhI,MAAO8K,EAAKmoB,SAGdnoB,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM4f,KACZlkG,MAAO,MAGX,MAEF,IAAK,IACiB,IAAhB8K,EAAKnN,QACPk9I,UAAU59I,GAEZ6N,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM0f,WACZ1+F,IAAK,EACL0C,IAAK,EACLhI,MAAO8K,EAAKmoB,QAEd,MAEF,IAAK,IACiB,IAAhBnoB,EAAKnN,QACPk9I,UAAU59I,GAEZ6N,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM0f,WACZ1+F,IAAK,EACL0C,IAAK0H,IACL1P,MAAO8K,EAAKmoB,QAEd,MAEF,IAAK,IACiB,IAAhBnoB,EAAKnN,QACPk9I,UAAU59I,GAEZ6N,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM0f,WACZ1+F,IAAK,EACL0C,IAAK0H,IACL1P,MAAO8K,EAAKmoB,QAEd,MAIF,QACEnoB,EAAK9M,KAAK,CACR2D,KAAM2iF,EAAM4f,KACZlkG,MAAOkF,EAAE1H,WAAW,KAW5B,OAJ0B,IAAtBo9I,EAAWj9I,QACb2qF,EAAK5hF,MAAMg0I,EAAW,sBAGjBl8I,CAAK,EAGdzD,EAAOD,QAAQwpF,MAAQA,mBCzRvB,MAAMA,EAAQ,EAAQ,OACtBxpF,EAAQigJ,aAAe,KAAM,CAAGp5I,KAAM2iF,EAAMsf,SAAU5jG,MAAO,MAC7DlF,EAAQkgJ,gBAAkB,KAAM,CAAGr5I,KAAM2iF,EAAMsf,SAAU5jG,MAAO,MAChElF,EAAQ60C,MAAQ,KAAM,CAAGhuC,KAAM2iF,EAAMsf,SAAU5jG,MAAO,MACtDlF,EAAQ2D,IAAM,KAAM,CAAGkD,KAAM2iF,EAAMsf,SAAU5jG,MAAO,uBCJpD,MAAMskF,EAAQ,EAAQ,OAEhBo3D,KAAO,IAAM,CAAC,CAAE/5I,KAAM2iF,EAAM+f,MAAQtkG,KAAM,GAAIu7D,GAAI,KAElDqgF,MAAQ,IACL,CACL,CAAEh6I,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM+f,MAAOtkG,KAAM,GAAIu7D,GAAI,KACnC,CAAE35D,KAAM2iF,EAAM+f,MAAOtkG,KAAM,GAAIu7D,GAAI,KACnCh0D,OAAOo0I,QAGLE,WAAa,IACV,CACL,CAAEj6I,KAAM2iF,EAAM4f,KAAMlkG,MAAO,GAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,KAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM+f,MAAOtkG,KAAM,KAAMu7D,GAAI,MACrC,CAAE35D,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,OAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,QAc/BlF,EAAQ8iF,MAAQ,KAAM,CAAGj8E,KAAM2iF,EAAMuf,IAAKp8F,IAAKk0I,QAASz1E,KAAK,IAC7DprE,EAAQmgJ,SAAW,KAAM,CAAGt5I,KAAM2iF,EAAMuf,IAAKp8F,IAAKk0I,QAASz1E,KAAK,IAChEprE,EAAQogJ,KAAO,KAAM,CAAGv5I,KAAM2iF,EAAMuf,IAAKp8F,IAAKi0I,OAAQx1E,KAAK,IAC3DprE,EAAQqgJ,QAAU,KAAM,CAAGx5I,KAAM2iF,EAAMuf,IAAKp8F,IAAKi0I,OAAQx1E,KAAK,IAC9DprE,EAAQsgJ,WAAa,KAAM,CAAGz5I,KAAM2iF,EAAMuf,IAAKp8F,IAAKm0I,aAAc11E,KAAK,IACvEprE,EAAQugJ,cAAgB,KAAM,CAAG15I,KAAM2iF,EAAMuf,IAAKp8F,IAAKm0I,aAAc11E,KAAK,IAC1EprE,EAAQ0gJ,QAAU,KAAM,CAAG75I,KAAM2iF,EAAMuf,IAAKp8F,IAfnC,CACL,CAAE9F,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,IAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,MAC3B,CAAE2B,KAAM2iF,EAAM4f,KAAMlkG,MAAO,OAWgCkmE,KAAK,eChDpEnrE,EAAOD,QAAU,CACfuoG,KAAa,EACbC,MAAa,EACbM,SAAa,EACbC,IAAa,EACbQ,MAAa,EACbL,WAAa,EACbC,UAAa,EACbC,KAAa,oBCRf,MAAM5f,EAAQ,EAAQ,OAChBk2D,EAAQ,EAAQ,OAIhBqB,EAAO,CAAE,EAAK,EAAG,EAAK,EAAG,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,IAS/D/gJ,EAAQggJ,WAAa,SAASj/I,GAyB5B,OAtBAA,EAAMA,EAAIC,QADQ,gGACa,SAASs4C,EAAGhzC,EAAG06I,EAAKC,EAAKC,EAAKC,EAAIC,EAAOC,GACtE,GAAIL,EACF,OAAO1nG,EAGT,IAAI91C,EAAO8C,EAAI,EACb26I,EAAQx3I,SAASw3I,EAAK,IACtBC,EAAQz3I,SAASy3I,EAAK,IACtBC,EAAQ13I,SAAS03I,EAAM,GACvBC,EAtBO,qCAsBM7/I,QAAQ6/I,GACrBL,EAAKM,GAEHj3I,EAAIjJ,OAAOC,aAAaoC,GAO5B,MAJI,mBAAmB9B,KAAK0I,KAC1BA,EAAI,KAAOA,GAGNA,CACT,GAGF,EAWApK,EAAQygJ,cAAgB,CAAC1/I,EAAK6+I,KAO5B,IALA,IAEIlJ,EAAItsI,EAFJ89F,EAAS,GACT3nB,EAAS,4FAIqB,OAA1Bm2D,EAAKn2D,EAAO78D,KAAK3iB,KACvB,GAAI21I,EAAG,GACLxuC,EAAOhlG,KAAKw8I,EAAK58D,cAEZ,GAAI4zD,EAAG,GACZxuC,EAAOhlG,KAAKw8I,EAAKU,aAEZ,GAAI1J,EAAG,GACZxuC,EAAOhlG,KAAKw8I,EAAKY,mBAEZ,GAAI5J,EAAG,GACZxuC,EAAOhlG,KAAKw8I,EAAKS,iBAEZ,GAAIzJ,EAAG,GACZxuC,EAAOhlG,KAAKw8I,EAAKW,gBAEZ,GAAI3J,EAAG,GACZxuC,EAAOhlG,KAAKw8I,EAAKa,sBAEZ,GAAI7J,EAAG,GACZxuC,EAAOhlG,KAAK,CACV2D,KAAM2iF,EAAM+f,MACZtkG,MAAOyxI,EAAG,IAAMA,EAAG,IAAIh0I,WAAW,GAClC89D,GAAIk2E,EAAG,IAAIh0I,WAAW,SAGnB,MAAK0H,EAAIssI,EAAG,KAOjB,MAAO,CAACxuC,EAAQ3nB,EAAOlnC,WANvB6uD,EAAOhlG,KAAK,CACV2D,KAAM2iF,EAAM4f,KACZlkG,MAAOkF,EAAE1H,WAAW,IAKxB,CAGF1C,EAAQ4L,MAAMg0I,EAAW,+BAA+B,EAU1D5/I,EAAQ4L,MAAQ,CAAC20E,EAAQhsE,KACvB,MAAM,IAAI2f,YAAY,gCAAkCqsD,EAAS,MAAQhsE,EAAI,mBCxG/E,IAAItO,EAAS,EAAQ,OACjB/B,EAAS+B,EAAO/B,OAGpB,SAASo9I,UAAWtsI,EAAKC,GACvB,IAAK,IAAI4B,KAAO7B,EACdC,EAAI4B,GAAO7B,EAAI6B,EAEnB,CASA,SAAS0qI,WAAY18I,EAAKC,EAAkBjC,GAC1C,OAAOqB,EAAOW,EAAKC,EAAkBjC,EACvC,CAVIqB,EAAOe,MAAQf,EAAOE,OAASF,EAAOc,aAAed,EAAOgI,gBAC9DjM,EAAOD,QAAUiG,GAGjBq7I,UAAUr7I,EAAQjG,GAClBA,EAAQkE,OAASq9I,YAOnBA,WAAW38I,UAAYF,OAAO6kB,OAAOrlB,EAAOU,WAG5C08I,UAAUp9I,EAAQq9I,YAElBA,WAAWt8I,KAAO,SAAUJ,EAAKC,EAAkBjC,GACjD,GAAmB,iBAARgC,EACT,MAAM,IAAIE,UAAU,iCAEtB,OAAOb,EAAOW,EAAKC,EAAkBjC,EACvC,EAEA0+I,WAAWn9I,MAAQ,SAAU8C,EAAM+E,EAAM5G,GACvC,GAAoB,iBAAT6B,EACT,MAAM,IAAInC,UAAU,6BAEtB,IAAIN,EAAMP,EAAOgD,GAUjB,YATaP,IAATsF,EACsB,iBAAb5G,EACTZ,EAAIwH,KAAKA,EAAM5G,GAEfZ,EAAIwH,KAAKA,GAGXxH,EAAIwH,KAAK,GAEJxH,CACT,EAEA88I,WAAWv8I,YAAc,SAAUkC,GACjC,GAAoB,iBAATA,EACT,MAAM,IAAInC,UAAU,6BAEtB,OAAOb,EAAOgD,EAChB,EAEAq6I,WAAWr1I,gBAAkB,SAAUhF,GACrC,GAAoB,iBAATA,EACT,MAAM,IAAInC,UAAU,6BAEtB,OAAOkB,EAAO9B,WAAW+C,EAC3B,8BCxDa,IAAIkX,EAAE2H,EAAEiwC,EAAE3F,EAAE,GAAG,iBAAkBmxF,aAAa,mBAAoBA,YAAY3wE,IAAI,CAAC,IAAIx3C,EAAEmoH,YAAYxhJ,EAAQi/G,aAAa,WAAW,OAAO5lF,EAAEw3C,KAAK,CAAC,KAAK,CAAC,IAAI26B,EAAEtzF,KAAK20G,EAAErhB,EAAE36B,MAAM7wE,EAAQi/G,aAAa,WAAW,OAAOzT,EAAE36B,MAAMg8C,CAAC,CAAC,CAC7O,GAAG,oBAAqBryG,QAAQ,mBAAoBinI,eAAe,CAAC,IAAI30B,EAAE,KAAKF,EAAE,KAAK7iF,EAAE,WAAW,GAAG,OAAO+iF,EAAE,IAAI,IAAIzgH,EAAErM,EAAQi/G,eAAe6N,GAAE,EAAGzgH,GAAGygH,EAAE,IAAI,CAAC,MAAMxmH,GAAG,MAAMypE,WAAWhmC,EAAE,GAAGzjC,CAAE,CAAC,EAAE8X,EAAE,SAAS/R,GAAG,OAAOygH,EAAE/8C,WAAW3xD,EAAE,EAAE/R,IAAIygH,EAAEzgH,EAAE0jE,WAAWhmC,EAAE,GAAG,EAAEhkB,EAAE,SAAS1Z,EAAE/F,GAAGsmH,EAAE78C,WAAW1jE,EAAE/F,EAAE,EAAE0vD,EAAE,WAAWuc,aAAaq6C,EAAE,EAAE5sH,EAAQswH,qBAAqB,WAAW,OAAM,CAAE,EAAEjgE,EAAErwD,EAAQ0hJ,wBAAwB,WAAW,CAAC,KAAK,CAAC,IAAIp1I,EAAEkO,OAAOu1D,WAAWxjE,EAAEiO,OAAO+3D,aAAa,GAAG,oBAAqB5mE,QAAQ,CAAC,IAAIghH,GAC7fnyG,OAAOmnI,qBAAqB,mBAAoBnnI,OAAOonI,uBAAuBj2I,QAAQC,MAAM,sJAAsJ,mBAAoB+gH,IAAGhhH,QAAQC,MAAM,oJAAoJ,CAAC,IAAIugB,IAAE,EAAGC,GAAE,KAAKnK,IAAG,EAAEkuF,GAAE,EAAEh9F,GAAE,EAAEnT,EAAQswH,qBAAqB,WAAW,OAAOtwH,EAAQi/G,gBAChgB9rG,EAAC,EAAEk9C,EAAE,WAAW,EAAErwD,EAAQ0hJ,wBAAwB,SAASr1I,GAAG,EAAEA,GAAG,IAAIA,EAAEV,QAAQC,MAAM,mHAAmHukG,GAAE,EAAE9jG,EAAE9B,KAAK6J,MAAM,IAAI/H,GAAG,CAAC,EAAE,IAAIkS,GAAE,IAAIkjI,eAAev1B,GAAE3tG,GAAEsjI,MAAMtjI,GAAEujI,MAAMC,UAAU,WAAW,GAAG,OAAO31H,GAAE,CAAC,IAAI/f,EAAErM,EAAQi/G,eAAe9rG,GAAE9G,EAAE8jG,GAAE,IAAI/jF,IAAE,EAAG/f,GAAG6/G,GAAE81B,YAAY,OAAO71H,IAAE,EAAGC,GAAE,KAAK,CAAC,MAAM9lB,GAAG,MAAM4lH,GAAE81B,YAAY,MAAM17I,CAAE,CAAC,MAAM6lB,IAAE,CAAE,EAAE/N,EAAE,SAAS/R,GAAG+f,GAAE/f,EAAE8f,KAAIA,IAAE,EAAG+/F,GAAE81B,YAAY,MAAM,EAAEj8H,EAAE,SAAS1Z,EAAE/F,GAAG2b,GACtf3V,GAAE,WAAWD,EAAErM,EAAQi/G,eAAe,GAAE34G,EAAE,EAAE0vD,EAAE,WAAWzpD,EAAE0V,IAAGA,IAAG,CAAC,CAAC,CAAC,SAAS6sG,EAAEziH,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAExJ,OAAOwJ,EAAEnJ,KAAKoD,GAAG+F,EAAE,OAAO,CAAC,IAAIggD,EAAEjiD,EAAE,IAAI,EAAEsB,EAAEW,EAAEggD,GAAG,UAAG,IAAS3gD,GAAG,EAAEqjH,EAAErjH,EAAEpF,IAA0B,MAAM+F,EAA7BA,EAAEggD,GAAG/lD,EAAE+F,EAAEjC,GAAGsB,EAAEtB,EAAEiiD,CAAc,CAAC,CAAC,SAAS8gE,EAAE9gH,GAAU,YAAO,KAAdA,EAAEA,EAAE,IAAqB,KAAKA,CAAC,CACjP,SAAS+gH,EAAE/gH,GAAG,IAAI/F,EAAE+F,EAAE,GAAG,QAAG,IAAS/F,EAAE,CAAC,IAAI8D,EAAEiC,EAAE8rB,MAAM,GAAG/tB,IAAI9D,EAAE,CAAC+F,EAAE,GAAGjC,EAAEiC,EAAE,IAAI,IAAIggD,EAAE,EAAE3gD,EAAEW,EAAExJ,OAAOwpD,EAAE3gD,GAAG,CAAC,IAAItD,EAAE,GAAGikD,EAAE,GAAG,EAAElkD,EAAEkE,EAAEjE,GAAGkoD,EAAEloD,EAAE,EAAE8mG,EAAE7iG,EAAEikD,GAAG,QAAG,IAASnoD,GAAG,EAAE4mH,EAAE5mH,EAAEiC,QAAG,IAAS8kG,GAAG,EAAE6f,EAAE7f,EAAE/mG,IAAIkE,EAAEggD,GAAG6iD,EAAE7iG,EAAEikD,GAAGlmD,EAAEiiD,EAAEiE,IAAIjkD,EAAEggD,GAAGlkD,EAAEkE,EAAEjE,GAAGgC,EAAEiiD,EAAEjkD,OAAQ,WAAG,IAAS8mG,GAAG,EAAE6f,EAAE7f,EAAE9kG,IAA0B,MAAMiC,EAA7BA,EAAEggD,GAAG6iD,EAAE7iG,EAAEikD,GAAGlmD,EAAEiiD,EAAEiE,CAAajkD,CAAC,CAAC,CAAC,OAAO/F,CAAC,CAAC,OAAO,IAAI,CAAC,SAASyoH,EAAE1iH,EAAE/F,GAAG,IAAI8D,EAAEiC,EAAE41I,UAAU37I,EAAE27I,UAAU,OAAO,IAAI73I,EAAEA,EAAEiC,EAAE+kB,GAAG9qB,EAAE8qB,EAAE,CAAC,IAAIk8F,GAAE,GAAG2B,GAAE,GAAGC,GAAE,EAAEjyG,GAAE,KAAK0I,GAAE,EAAE0nG,IAAE,EAAGvlF,IAAE,EAAGnb,IAAE,EACja,SAASH,EAAEngB,GAAG,IAAI,IAAI/F,EAAE6mH,EAAE8B,IAAG,OAAO3oH,GAAG,CAAC,GAAG,OAAOA,EAAE28E,SAASmqC,EAAE6B,QAAQ,MAAG3oH,EAAE47I,WAAW71I,GAAgD,MAA9C+gH,EAAE6B,IAAG3oH,EAAE27I,UAAU37I,EAAE67I,eAAerzB,EAAExB,GAAEhnH,EAAa,CAACA,EAAE6mH,EAAE8B,GAAE,CAAC,CAAC,SAASmL,EAAE/tH,GAAa,GAAVsgB,IAAE,EAAGH,EAAEngB,IAAOy7B,GAAE,GAAG,OAAOqlF,EAAEG,IAAGxlF,IAAE,EAAG1pB,EAAEsH,OAAO,CAAC,IAAIpf,EAAE6mH,EAAE8B,IAAG,OAAO3oH,GAAGyf,EAAEq0G,EAAE9zH,EAAE47I,UAAU71I,EAAE,CAAC,CACzP,SAASqZ,EAAErZ,EAAE/F,GAAGwhC,IAAE,EAAGnb,KAAIA,IAAE,EAAGqpC,KAAKq3D,IAAE,EAAG,IAAIjjH,EAAEub,GAAE,IAAS,IAAL6G,EAAElmB,GAAO2W,GAAEkwG,EAAEG,IAAG,OAAOrwG,OAAMA,GAAEklI,eAAe77I,IAAI+F,IAAIrM,EAAQswH,yBAAyB,CAAC,IAAIjkE,EAAEpvC,GAAEgmE,SAAS,GAAG,mBAAoB52B,EAAE,CAACpvC,GAAEgmE,SAAS,KAAKt9D,GAAE1I,GAAEmlI,cAAc,IAAI12I,EAAE2gD,EAAEpvC,GAAEklI,gBAAgB77I,GAAGA,EAAEtG,EAAQi/G,eAAe,mBAAoBvzG,EAAEuR,GAAEgmE,SAASv3E,EAAEuR,KAAIkwG,EAAEG,KAAIF,EAAEE,IAAG9gG,EAAElmB,EAAE,MAAM8mH,EAAEE,IAAGrwG,GAAEkwG,EAAEG,GAAE,CAAC,GAAG,OAAOrwG,GAAE,IAAI7U,GAAE,MAAO,CAAC,IAAID,EAAEglH,EAAE8B,IAAG,OAAO9mH,GAAG4d,EAAEq0G,EAAEjyH,EAAE+5I,UAAU57I,GAAG8B,GAAE,CAAE,CAAC,OAAOA,CAAC,CAAC,QAAQ6U,GAAE,KAAK0I,GAAEvb,EAAEijH,IAAE,CAAE,CAAC,CAAC,IAAIqS,GAAErvE,EAAErwD,EAAQmxH,sBAAsB,EACtenxH,EAAQ6wH,2BAA2B,EAAE7wH,EAAQixH,qBAAqB,EAAEjxH,EAAQ29G,wBAAwB,EAAE39G,EAAQqiJ,mBAAmB,KAAKriJ,EAAQsgH,8BAA8B,EAAEtgH,EAAQowH,wBAAwB,SAAS/jH,GAAGA,EAAE42E,SAAS,IAAI,EAAEjjF,EAAQsiJ,2BAA2B,WAAWx6G,IAAGulF,KAAIvlF,IAAE,EAAG1pB,EAAEsH,GAAG,EAAE1lB,EAAQ2wH,iCAAiC,WAAW,OAAOhrG,EAAC,EAAE3lB,EAAQuiJ,8BAA8B,WAAW,OAAOp1B,EAAEG,GAAE,EACtattH,EAAQwiJ,cAAc,SAASn2I,GAAG,OAAOsZ,IAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAIrf,EAAE,EAAE,MAAM,QAAQA,EAAEqf,GAAE,IAAIvb,EAAEub,GAAEA,GAAErf,EAAE,IAAI,OAAO+F,GAAG,CAAC,QAAQsZ,GAAEvb,CAAC,CAAC,EAAEpK,EAAQyiJ,wBAAwB,WAAW,EAAEziJ,EAAQwwH,sBAAsBkP,GAAE1/H,EAAQk9G,yBAAyB,SAAS7wG,EAAE/F,GAAG,OAAO+F,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQA,EAAE,EAAE,IAAIjC,EAAEub,GAAEA,GAAEtZ,EAAE,IAAI,OAAO/F,GAAG,CAAC,QAAQqf,GAAEvb,CAAC,CAAC,EACtWpK,EAAQ09G,0BAA0B,SAASrxG,EAAE/F,EAAE8D,GAAG,IAAIiiD,EAAErsD,EAAQi/G,eAA8F,OAA/E,iBAAkB70G,GAAG,OAAOA,EAAaA,EAAE,iBAAZA,EAAEA,EAAEs4I,QAA6B,EAAEt4I,EAAEiiD,EAAEjiD,EAAEiiD,EAAGjiD,EAAEiiD,EAAShgD,GAAG,KAAK,EAAE,IAAIX,GAAG,EAAE,MAAM,KAAK,EAAEA,EAAE,IAAI,MAAM,KAAK,EAAEA,EAAE,WAAW,MAAM,KAAK,EAAEA,EAAE,IAAI,MAAM,QAAQA,EAAE,IAA2M,OAAjMW,EAAE,CAAC+kB,GAAG89F,KAAIjsC,SAAS38E,EAAE87I,cAAc/1I,EAAE61I,UAAU93I,EAAE+3I,eAAvDz2I,EAAEtB,EAAEsB,EAAoEu2I,WAAW,GAAG73I,EAAEiiD,GAAGhgD,EAAE41I,UAAU73I,EAAE0kH,EAAEG,GAAE5iH,GAAG,OAAO8gH,EAAEG,KAAIjhH,IAAI8gH,EAAE8B,MAAKtiG,GAAEqpC,IAAIrpC,IAAE,EAAG5G,EAAEq0G,EAAEhwH,EAAEiiD,MAAMhgD,EAAE41I,UAAUv2I,EAAEojH,EAAExB,GAAEjhH,GAAGy7B,IAAGulF,KAAIvlF,IAAE,EAAG1pB,EAAEsH,KAAYrZ,CAAC,EAC3drM,EAAQ2iJ,sBAAsB,SAASt2I,GAAG,IAAI/F,EAAEqf,GAAE,OAAO,WAAW,IAAIvb,EAAEub,GAAEA,GAAErf,EAAE,IAAI,OAAO+F,EAAEjB,MAAMhL,KAAKkH,UAAU,CAAC,QAAQqe,GAAEvb,CAAC,CAAC,CAAC,gCChB9HnK,EAAOD,QAAU,EAAjB,0DCDF,MAAM4iJ,iBAAiBn/I,MACtB,WAAA+P,CAAYM,GACXL,MAAMmvI,SAASC,qBAAqB/uI,IACpCpP,OAAOmH,eAAezL,KAAM,OAAQ,CACnC8E,MAAO,WACPyO,cAAc,EACdD,UAAU,IAGPjQ,MAAMue,mBACTve,MAAMue,kBAAkB5hB,KAAMwiJ,SAEhC,CAEA,2BAAOC,CAAqB/uI,GAC3B,IACC,OAAOq5B,KAAKC,UAAUt5B,EACvB,CAAE,MACD,OAAO3S,OAAO2S,EACf,CACD,EAGD,MAAMgvI,EAAmB,CACxB,CAACntH,SAAU,OAAQ7pB,YAAY,GAC/B,CAAC6pB,SAAU,UAAW7pB,YAAY,GAClC,CAAC6pB,SAAU,QAAS7pB,YAAY,GAChC,CAAC6pB,SAAU,OAAQ7pB,YAAY,IAG1Bi3I,EAAW9+I,OAAO,kBASlB++I,gBAAkB,EACvB/9I,OACAmgF,OACA69D,MACAC,kBACA/lD,WACA53B,YAEA,MAAM/E,EAAKyiF,IAAQ1/I,MAAMuD,QAAQ7B,GAAQ,GAAK,CAAC,GAI/C,GAFAmgF,EAAKliF,KAAK+B,GAENsgE,GAAS43B,EACZ,OAAO38B,EAGR,GAA2B,mBAAhBv7D,EAAKyI,SAA4C,IAAnBzI,EAAK89I,GAC7C,MAxBa99I,KACdA,EAAK89I,IAAY,EACjB,MAAM56F,EAAOljD,EAAKyI,SAElB,cADOzI,EAAK89I,GACL56F,CAAI,EAoBHz6C,CAAOzI,GAGf,IAAK,MAAO4R,EAAK3R,KAAUR,OAAO0mB,QAAQnmB,GACnB,mBAAXf,GAAyBA,EAAOuC,SAASvB,GACnDs7D,EAAG3pD,GAAO,kBAIU,mBAAV3R,IAINA,GAA0B,iBAAVA,EAKhBkgF,EAAK53E,SAASvI,EAAK4R,IAaxB2pD,EAAG3pD,GAAO,cAZT0uD,IAEA/E,EAAG3pD,GAAOmsI,gBAAgB,CACzB/9I,KAAMA,EAAK4R,GACXuuE,KAAMA,EAAK3/E,QACXy9I,kBACA/lD,WACA53B,WAZD/E,EAAG3pD,GAAO3R,GAoBZ,IAAK,MAAM,SAACywB,EAAQ,WAAE7pB,KAAeg3I,EACN,iBAAnB79I,EAAK0wB,IACfjxB,OAAOmH,eAAe20D,EAAI7qC,EAAU,CACnCzwB,MAAOD,EAAK0wB,GACZ7pB,aAAYo3I,GAAyBp3I,EACrC6H,cAAc,EACdD,UAAU,IAKb,OAAO8sD,CAAE,EA+CVvgE,EAAOD,QAAU,CAChBmjJ,eA7CsB,CAACj+I,EAAO8R,EAAU,CAAC,KACzC,MAAM,SAACmmF,EAAW9zF,OAAO+5I,mBAAqBpsI,EAE9C,MAAqB,iBAAV9R,GAAgC,OAAVA,EACzB89I,gBAAgB,CACtB/9I,KAAMC,EACNkgF,KAAM,GACN89D,iBAAiB,EACjB/lD,WACA53B,MAAO,IAKY,mBAAVrgE,EAEH,cAAeA,EAAM0O,MAAQ,eAG9B1O,CAAK,EA2BZm+I,iBAxBwB,CAACn+I,EAAO8R,EAAU,CAAC,KAC3C,MAAM,SAACmmF,EAAW9zF,OAAO+5I,mBAAqBpsI,EAE9C,GAAI9R,aAAiBzB,MACpB,OAAOyB,EAGR,GAAqB,iBAAVA,GAAgC,OAAVA,IAAmB3B,MAAMuD,QAAQ5B,GAAQ,CACzE,MAAMo+I,EAAW,IAAI7/I,MAQrB,OAPAu/I,gBAAgB,CACf/9I,KAAMC,EACNkgF,KAAM,GACN69D,IAAKK,EACLnmD,WACA53B,MAAO,IAED+9E,CACR,CAEA,OAAO,IAAIV,SAAS19I,EAAM,oBCnJ3B,IAAIhB,EAAS,gBAGb,SAAS6uE,KAAMwwE,EAAWC,GACxBpjJ,KAAKqjJ,OAASv/I,EAAOE,MAAMm/I,GAC3BnjJ,KAAKsjJ,WAAaF,EAClBpjJ,KAAKujJ,WAAaJ,EAClBnjJ,KAAK24B,KAAO,CACd,CAEAg6C,KAAKnuE,UAAUkzD,OAAS,SAAU/wD,EAAMyQ,GAClB,iBAATzQ,IACTyQ,EAAMA,GAAO,OACbzQ,EAAO7C,EAAOe,KAAK8B,EAAMyQ,IAQ3B,IALA,IAAI0rC,EAAQ9iD,KAAKqjJ,OACbF,EAAYnjJ,KAAKujJ,WACjB9gJ,EAASkE,EAAKlE,OACd+gJ,EAAQxjJ,KAAK24B,KAER3vB,EAAS,EAAGA,EAASvG,GAAS,CAIrC,IAHA,IAAIghJ,EAAWD,EAAQL,EACnBvxD,EAAYznF,KAAKC,IAAI3H,EAASuG,EAAQm6I,EAAYM,GAE7C1hJ,EAAI,EAAGA,EAAI6vF,EAAW7vF,IAC7B+gD,EAAM2gG,EAAW1hJ,GAAK4E,EAAKqC,EAASjH,GAItCiH,GAAU4oF,GADV4xD,GAAS5xD,GAGIuxD,GAAe,GAC1BnjJ,KAAK0jJ,QAAQ5gG,EAEjB,CAGA,OADA9iD,KAAK24B,MAAQl2B,EACNzC,IACT,EAEA2yE,KAAKnuE,UAAUm/I,OAAS,SAAUvsI,GAChC,IAAIwsI,EAAM5jJ,KAAK24B,KAAO34B,KAAKujJ,WAE3BvjJ,KAAKqjJ,OAAOO,GAAO,IAInB5jJ,KAAKqjJ,OAAOx3I,KAAK,EAAG+3I,EAAM,GAEtBA,GAAO5jJ,KAAKsjJ,aACdtjJ,KAAK0jJ,QAAQ1jJ,KAAKqjJ,QAClBrjJ,KAAKqjJ,OAAOx3I,KAAK,IAGnB,IAAIg4I,EAAmB,EAAZ7jJ,KAAK24B,KAGhB,GAAIkrH,GAAQ,WACV7jJ,KAAKqjJ,OAAO3xI,cAAcmyI,EAAM7jJ,KAAKujJ,WAAa,OAG7C,CACL,IAAIO,GAAkB,WAAPD,KAAuB,EAClCE,GAAYF,EAAOC,GAAW,WAElC9jJ,KAAKqjJ,OAAO3xI,cAAcqyI,EAAU/jJ,KAAKujJ,WAAa,GACtDvjJ,KAAKqjJ,OAAO3xI,cAAcoyI,EAAS9jJ,KAAKujJ,WAAa,EACvD,CAEAvjJ,KAAK0jJ,QAAQ1jJ,KAAKqjJ,QAClB,IAAI3tF,EAAO11D,KAAKgkJ,QAEhB,OAAO5sI,EAAMs+C,EAAK1uD,SAASoQ,GAAOs+C,CACpC,EAEAid,KAAKnuE,UAAUk/I,QAAU,WACvB,MAAM,IAAIrgJ,MAAM,0CAClB,EAEAxD,EAAOD,QAAU+yE,sBChFjB,IAAI/yE,EAAUC,EAAOD,QAAU,SAASqkJ,IAAKC,GAC3CA,EAAYA,EAAU58I,cAEtB,IAAI68I,EAAYvkJ,EAAQskJ,GACxB,IAAKC,EAAW,MAAM,IAAI9gJ,MAAM6gJ,EAAY,+CAE5C,OAAO,IAAIC,CACb,EAEAvkJ,EAAQwkJ,IAAM,EAAQ,OACtBxkJ,EAAQykJ,KAAO,EAAQ,OACvBzkJ,EAAQ0kJ,OAAS,EAAQ,OACzB1kJ,EAAQ2kJ,OAAS,EAAQ,OACzB3kJ,EAAQ4kJ,OAAS,EAAQ,OACzB5kJ,EAAQ6kJ,OAAS,EAAQ,wBCNzB,IAAIh2E,EAAW,EAAQ,OACnBkE,EAAO,EAAQ,OACf7uE,EAAS,gBAETkpH,EAAI,CACN,WAAY,YAAY,YAAgB,WAGtCsS,EAAI,IAAIn8H,MAAM,IAElB,SAASuhJ,MACP1kJ,KAAK2yB,OACL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,GAAI,GACtB,CAkBA,SAAS4kJ,OAAQphJ,GACf,OAAQA,GAAO,GAAOA,IAAQ,CAChC,CAEA,SAASqhJ,GAAI3rG,EAAGhzC,EAAG8D,EAAGiiD,GACpB,OAAU,IAAN/S,EAAiBhzC,EAAI8D,GAAQ9D,EAAK+lD,EAC5B,IAAN/S,EAAiBhzC,EAAI8D,EAAM9D,EAAI+lD,EAAMjiD,EAAIiiD,EACtC/lD,EAAI8D,EAAIiiD,CACjB,CAxBAwiB,EAASi2E,IAAK/xE,GAEd+xE,IAAIlgJ,UAAUmuB,KAAO,WAOnB,OANA3yB,KAAK8kJ,GAAK,WACV9kJ,KAAK+kJ,GAAK,WACV/kJ,KAAKglJ,GAAK,WACVhlJ,KAAKilJ,GAAK,UACVjlJ,KAAKklJ,GAAK,WAEHllJ,IACT,EAgBA0kJ,IAAIlgJ,UAAUk/I,QAAU,SAAU70B,GAShC,IARA,IAfcrrH,EAeV87H,EAAIt/H,KAAK2kJ,GAET14I,EAAc,EAAVjM,KAAK8kJ,GACT5+I,EAAc,EAAVlG,KAAK+kJ,GACT/6I,EAAc,EAAVhK,KAAKglJ,GACT/4F,EAAc,EAAVjsD,KAAKilJ,GACT35I,EAAc,EAAVtL,KAAKklJ,GAEJnjJ,EAAI,EAAGA,EAAI,KAAMA,EAAGu9H,EAAEv9H,GAAK8sH,EAAEv+G,YAAgB,EAAJvO,GAClD,KAAOA,EAAI,KAAMA,EAAGu9H,EAAEv9H,GAAKu9H,EAAEv9H,EAAI,GAAKu9H,EAAEv9H,EAAI,GAAKu9H,EAAEv9H,EAAI,IAAMu9H,EAAEv9H,EAAI,IAEnE,IAAK,IAAI+G,EAAI,EAAGA,EAAI,KAAMA,EAAG,CAC3B,IAAIowC,KAAOpwC,EAAI,IACX4jH,EAAoD,IA5B5ClpH,EA4BGyI,IA3BF,EAAMzI,IAAQ,IA2BPqhJ,GAAG3rG,EAAGhzC,EAAG8D,EAAGiiD,GAAK3gD,EAAIg0H,EAAEx2H,GAAKkkH,EAAE9zE,GAElD5tC,EAAI2gD,EACJA,EAAIjiD,EACJA,EAAI46I,OAAO1+I,GACXA,EAAI+F,EACJA,EAAIygH,CACN,CAEA1sH,KAAK8kJ,GAAM74I,EAAIjM,KAAK8kJ,GAAM,EAC1B9kJ,KAAK+kJ,GAAM7+I,EAAIlG,KAAK+kJ,GAAM,EAC1B/kJ,KAAKglJ,GAAMh7I,EAAIhK,KAAKglJ,GAAM,EAC1BhlJ,KAAKilJ,GAAMh5F,EAAIjsD,KAAKilJ,GAAM,EAC1BjlJ,KAAKklJ,GAAM55I,EAAItL,KAAKklJ,GAAM,CAC5B,EAEAR,IAAIlgJ,UAAUw/I,MAAQ,WACpB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAQ3B,OANA8pH,EAAEr8G,aAAuB,EAAVrS,KAAK8kJ,GAAQ,GAC5Bp2B,EAAEr8G,aAAuB,EAAVrS,KAAK+kJ,GAAQ,GAC5Br2B,EAAEr8G,aAAuB,EAAVrS,KAAKglJ,GAAQ,GAC5Bt2B,EAAEr8G,aAAuB,EAAVrS,KAAKilJ,GAAQ,IAC5Bv2B,EAAEr8G,aAAuB,EAAVrS,KAAKklJ,GAAQ,IAErBx2B,CACT,EAEA7uH,EAAOD,QAAU8kJ,qBCpFjB,IAAIj2E,EAAW,EAAQ,OACnBkE,EAAO,EAAQ,OACf7uE,EAAS,gBAETkpH,EAAI,CACN,WAAY,YAAY,YAAgB,WAGtCsS,EAAI,IAAIn8H,MAAM,IAElB,SAASgiJ,OACPnlJ,KAAK2yB,OACL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,GAAI,GACtB,CAkBA,SAASolJ,MAAO5hJ,GACd,OAAQA,GAAO,EAAMA,IAAQ,EAC/B,CAEA,SAASohJ,OAAQphJ,GACf,OAAQA,GAAO,GAAOA,IAAQ,CAChC,CAEA,SAASqhJ,GAAI3rG,EAAGhzC,EAAG8D,EAAGiiD,GACpB,OAAU,IAAN/S,EAAiBhzC,EAAI8D,GAAQ9D,EAAK+lD,EAC5B,IAAN/S,EAAiBhzC,EAAI8D,EAAM9D,EAAI+lD,EAAMjiD,EAAIiiD,EACtC/lD,EAAI8D,EAAIiiD,CACjB,CA5BAwiB,EAAS02E,KAAMxyE,GAEfwyE,KAAK3gJ,UAAUmuB,KAAO,WAOpB,OANA3yB,KAAK8kJ,GAAK,WACV9kJ,KAAK+kJ,GAAK,WACV/kJ,KAAKglJ,GAAK,WACVhlJ,KAAKilJ,GAAK,UACVjlJ,KAAKklJ,GAAK,WAEHllJ,IACT,EAoBAmlJ,KAAK3gJ,UAAUk/I,QAAU,SAAU70B,GASjC,IARA,IAnBcrrH,EAmBV87H,EAAIt/H,KAAK2kJ,GAET14I,EAAc,EAAVjM,KAAK8kJ,GACT5+I,EAAc,EAAVlG,KAAK+kJ,GACT/6I,EAAc,EAAVhK,KAAKglJ,GACT/4F,EAAc,EAAVjsD,KAAKilJ,GACT35I,EAAc,EAAVtL,KAAKklJ,GAEJnjJ,EAAI,EAAGA,EAAI,KAAMA,EAAGu9H,EAAEv9H,GAAK8sH,EAAEv+G,YAAgB,EAAJvO,GAClD,KAAOA,EAAI,KAAMA,EAAGu9H,EAAEv9H,IA5BRyB,EA4BmB87H,EAAEv9H,EAAI,GAAKu9H,EAAEv9H,EAAI,GAAKu9H,EAAEv9H,EAAI,IAAMu9H,EAAEv9H,EAAI,MA3B1D,EAAMyB,IAAQ,GA6B7B,IAAK,IAAIsF,EAAI,EAAGA,EAAI,KAAMA,EAAG,CAC3B,IAAIowC,KAAOpwC,EAAI,IACX4jH,EAAK04B,MAAMn5I,GAAK44I,GAAG3rG,EAAGhzC,EAAG8D,EAAGiiD,GAAK3gD,EAAIg0H,EAAEx2H,GAAKkkH,EAAE9zE,GAAM,EAExD5tC,EAAI2gD,EACJA,EAAIjiD,EACJA,EAAI46I,OAAO1+I,GACXA,EAAI+F,EACJA,EAAIygH,CACN,CAEA1sH,KAAK8kJ,GAAM74I,EAAIjM,KAAK8kJ,GAAM,EAC1B9kJ,KAAK+kJ,GAAM7+I,EAAIlG,KAAK+kJ,GAAM,EAC1B/kJ,KAAKglJ,GAAMh7I,EAAIhK,KAAKglJ,GAAM,EAC1BhlJ,KAAKilJ,GAAMh5F,EAAIjsD,KAAKilJ,GAAM,EAC1BjlJ,KAAKklJ,GAAM55I,EAAItL,KAAKklJ,GAAM,CAC5B,EAEAC,KAAK3gJ,UAAUw/I,MAAQ,WACrB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAQ3B,OANA8pH,EAAEr8G,aAAuB,EAAVrS,KAAK8kJ,GAAQ,GAC5Bp2B,EAAEr8G,aAAuB,EAAVrS,KAAK+kJ,GAAQ,GAC5Br2B,EAAEr8G,aAAuB,EAAVrS,KAAKglJ,GAAQ,GAC5Bt2B,EAAEr8G,aAAuB,EAAVrS,KAAKilJ,GAAQ,IAC5Bv2B,EAAEr8G,aAAuB,EAAVrS,KAAKklJ,GAAQ,IAErBx2B,CACT,EAEA7uH,EAAOD,QAAUulJ,sBC1FjB,IAAI12E,EAAW,EAAQ,OACnB42E,EAAS,EAAQ,OACjB1yE,EAAO,EAAQ,OACf7uE,EAAS,gBAETw7H,EAAI,IAAIn8H,MAAM,IAElB,SAASmiJ,SACPtlJ,KAAK2yB,OAEL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,GAAI,GACtB,CAEAyuE,EAAS62E,OAAQD,GAEjBC,OAAO9gJ,UAAUmuB,KAAO,WAUtB,OATA3yB,KAAK8kJ,GAAK,WACV9kJ,KAAK+kJ,GAAK,UACV/kJ,KAAKglJ,GAAK,UACVhlJ,KAAKilJ,GAAK,WACVjlJ,KAAKklJ,GAAK,WACVllJ,KAAKulJ,GAAK,WACVvlJ,KAAKwlJ,GAAK,WACVxlJ,KAAKylJ,GAAK,WAEHzlJ,IACT,EAEAslJ,OAAO9gJ,UAAUw/I,MAAQ,WACvB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAU3B,OARA8pH,EAAEr8G,aAAarS,KAAK8kJ,GAAI,GACxBp2B,EAAEr8G,aAAarS,KAAK+kJ,GAAI,GACxBr2B,EAAEr8G,aAAarS,KAAKglJ,GAAI,GACxBt2B,EAAEr8G,aAAarS,KAAKilJ,GAAI,IACxBv2B,EAAEr8G,aAAarS,KAAKklJ,GAAI,IACxBx2B,EAAEr8G,aAAarS,KAAKulJ,GAAI,IACxB72B,EAAEr8G,aAAarS,KAAKwlJ,GAAI,IAEjB92B,CACT,EAEA7uH,EAAOD,QAAU0lJ,wBC5CjB,IAAI72E,EAAW,EAAQ,OACnBkE,EAAO,EAAQ,OACf7uE,EAAS,gBAETkpH,EAAI,CACN,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,UAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,UAAY,UAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,YAGlCsS,EAAI,IAAIn8H,MAAM,IAElB,SAASkiJ,SACPrlJ,KAAK2yB,OAEL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,GAAI,GACtB,CAiBA,SAAS22H,GAAIzqH,EAAGC,EAAGogH,GACjB,OAAOA,EAAKrgH,GAAKC,EAAIogH,EACvB,CAEA,SAASm5B,IAAKx5I,EAAGC,EAAGogH,GAClB,OAAQrgH,EAAIC,EAAMogH,GAAKrgH,EAAIC,EAC7B,CAEA,SAASw5I,OAAQz5I,GACf,OAAQA,IAAM,EAAIA,GAAK,KAAOA,IAAM,GAAKA,GAAK,KAAOA,IAAM,GAAKA,GAAK,GACvE,CAEA,SAAS05I,OAAQ15I,GACf,OAAQA,IAAM,EAAIA,GAAK,KAAOA,IAAM,GAAKA,GAAK,KAAOA,IAAM,GAAKA,GAAK,EACvE,CAEA,SAAS25I,OAAQ35I,GACf,OAAQA,IAAM,EAAIA,GAAK,KAAOA,IAAM,GAAKA,GAAK,IAAOA,IAAM,CAC7D,CAjCAuiE,EAAS42E,OAAQ1yE,GAEjB0yE,OAAO7gJ,UAAUmuB,KAAO,WAUtB,OATA3yB,KAAK8kJ,GAAK,WACV9kJ,KAAK+kJ,GAAK,WACV/kJ,KAAKglJ,GAAK,WACVhlJ,KAAKilJ,GAAK,WACVjlJ,KAAKklJ,GAAK,WACVllJ,KAAKulJ,GAAK,WACVvlJ,KAAKwlJ,GAAK,UACVxlJ,KAAKylJ,GAAK,WAEHzlJ,IACT,EA0BAqlJ,OAAO7gJ,UAAUk/I,QAAU,SAAU70B,GAYnC,IAXA,IALe3iH,EAKXozH,EAAIt/H,KAAK2kJ,GAET14I,EAAc,EAAVjM,KAAK8kJ,GACT5+I,EAAc,EAAVlG,KAAK+kJ,GACT/6I,EAAc,EAAVhK,KAAKglJ,GACT/4F,EAAc,EAAVjsD,KAAKilJ,GACT35I,EAAc,EAAVtL,KAAKklJ,GACTlnI,EAAc,EAAVhe,KAAKulJ,GACT5/H,EAAc,EAAV3lB,KAAKwlJ,GACT5vF,EAAc,EAAV51D,KAAKylJ,GAEJ1jJ,EAAI,EAAGA,EAAI,KAAMA,EAAGu9H,EAAEv9H,GAAK8sH,EAAEv+G,YAAgB,EAAJvO,GAClD,KAAOA,EAAI,KAAMA,EAAGu9H,EAAEv9H,GAAqE,KAjB5EmK,EAiBoBozH,EAAEv9H,EAAI,MAhB3B,GAAKmK,GAAK,KAAOA,IAAM,GAAKA,GAAK,IAAOA,IAAM,IAgBbozH,EAAEv9H,EAAI,GAAK8jJ,OAAOvmB,EAAEv9H,EAAI,KAAOu9H,EAAEv9H,EAAI,IAEpF,IAAK,IAAI+G,GAAI,EAAGA,GAAI,KAAMA,GAAG,CAC3B,IAAIg9I,GAAMlwF,EAAIgwF,OAAOt6I,GAAKqrH,GAAGrrH,EAAG0S,EAAG2H,GAAKqnG,EAAElkH,IAAKw2H,EAAEx2H,IAAM,EACnDi9I,GAAMJ,OAAO15I,GAAKy5I,IAAIz5I,EAAG/F,EAAG8D,GAAM,EAEtC4rD,EAAIjwC,EACJA,EAAI3H,EACJA,EAAI1S,EACJA,EAAK2gD,EAAI65F,GAAM,EACf75F,EAAIjiD,EACJA,EAAI9D,EACJA,EAAI+F,EACJA,EAAK65I,GAAKC,GAAM,CAClB,CAEA/lJ,KAAK8kJ,GAAM74I,EAAIjM,KAAK8kJ,GAAM,EAC1B9kJ,KAAK+kJ,GAAM7+I,EAAIlG,KAAK+kJ,GAAM,EAC1B/kJ,KAAKglJ,GAAMh7I,EAAIhK,KAAKglJ,GAAM,EAC1BhlJ,KAAKilJ,GAAMh5F,EAAIjsD,KAAKilJ,GAAM,EAC1BjlJ,KAAKklJ,GAAM55I,EAAItL,KAAKklJ,GAAM,EAC1BllJ,KAAKulJ,GAAMvnI,EAAIhe,KAAKulJ,GAAM,EAC1BvlJ,KAAKwlJ,GAAM7/H,EAAI3lB,KAAKwlJ,GAAM,EAC1BxlJ,KAAKylJ,GAAM7vF,EAAI51D,KAAKylJ,GAAM,CAC5B,EAEAJ,OAAO7gJ,UAAUw/I,MAAQ,WACvB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAW3B,OATA8pH,EAAEr8G,aAAarS,KAAK8kJ,GAAI,GACxBp2B,EAAEr8G,aAAarS,KAAK+kJ,GAAI,GACxBr2B,EAAEr8G,aAAarS,KAAKglJ,GAAI,GACxBt2B,EAAEr8G,aAAarS,KAAKilJ,GAAI,IACxBv2B,EAAEr8G,aAAarS,KAAKklJ,GAAI,IACxBx2B,EAAEr8G,aAAarS,KAAKulJ,GAAI,IACxB72B,EAAEr8G,aAAarS,KAAKwlJ,GAAI,IACxB92B,EAAEr8G,aAAarS,KAAKylJ,GAAI,IAEjB/2B,CACT,EAEA7uH,EAAOD,QAAUylJ,wBCtIjB,IAAI52E,EAAW,EAAQ,OACnBu3E,EAAS,EAAQ,OACjBrzE,EAAO,EAAQ,OACf7uE,EAAS,gBAETw7H,EAAI,IAAIn8H,MAAM,KAElB,SAAS8iJ,SACPjmJ,KAAK2yB,OACL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,IAAK,IACvB,CAEAyuE,EAASw3E,OAAQD,GAEjBC,OAAOzhJ,UAAUmuB,KAAO,WAmBtB,OAlBA3yB,KAAKkmJ,IAAM,WACXlmJ,KAAKmmJ,IAAM,WACXnmJ,KAAKomJ,IAAM,WACXpmJ,KAAKqmJ,IAAM,UACXrmJ,KAAKsmJ,IAAM,WACXtmJ,KAAKumJ,IAAM,WACXvmJ,KAAKwmJ,IAAM,WACXxmJ,KAAKymJ,IAAM,WAEXzmJ,KAAK0mJ,IAAM,WACX1mJ,KAAK2mJ,IAAM,UACX3mJ,KAAK4mJ,IAAM,UACX5mJ,KAAK6mJ,IAAM,WACX7mJ,KAAK8mJ,IAAM,WACX9mJ,KAAK+mJ,IAAM,WACX/mJ,KAAKgnJ,IAAM,WACXhnJ,KAAKinJ,IAAM,WAEJjnJ,IACT,EAEAimJ,OAAOzhJ,UAAUw/I,MAAQ,WACvB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAE3B,SAASsiJ,aAActxF,EAAG38B,EAAGjwB,GAC3B0lH,EAAEr8G,aAAaujD,EAAG5sD,GAClB0lH,EAAEr8G,aAAa4mB,EAAGjwB,EAAS,EAC7B,CASA,OAPAk+I,aAAalnJ,KAAKkmJ,IAAKlmJ,KAAK0mJ,IAAK,GACjCQ,aAAalnJ,KAAKmmJ,IAAKnmJ,KAAK2mJ,IAAK,GACjCO,aAAalnJ,KAAKomJ,IAAKpmJ,KAAK4mJ,IAAK,IACjCM,aAAalnJ,KAAKqmJ,IAAKrmJ,KAAK6mJ,IAAK,IACjCK,aAAalnJ,KAAKsmJ,IAAKtmJ,KAAK8mJ,IAAK,IACjCI,aAAalnJ,KAAKumJ,IAAKvmJ,KAAK+mJ,IAAK,IAE1Br4B,CACT,EAEA7uH,EAAOD,QAAUqmJ,wBCxDjB,IAAIx3E,EAAW,EAAQ,OACnBkE,EAAO,EAAQ,OACf7uE,EAAS,gBAETkpH,EAAI,CACN,WAAY,WAAY,WAAY,UACpC,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,UAAY,WAAY,UAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,UAAY,UACpC,UAAY,WAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,WAAY,UAAY,WACpC,UAAY,WAAY,UAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,UAAY,WACpC,UAAY,WAAY,UAAY,UACpC,UAAY,UAAY,UAAY,WACpC,WAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,UAAY,WAAY,YAGlCsS,EAAI,IAAIn8H,MAAM,KAElB,SAASgkJ,SACPnnJ,KAAK2yB,OACL3yB,KAAK2kJ,GAAKrlB,EAEV3sD,EAAKtqE,KAAKrI,KAAM,IAAK,IACvB,CA0BA,SAAS04H,GAAIxsH,EAAGC,EAAGogH,GACjB,OAAOA,EAAKrgH,GAAKC,EAAIogH,EACvB,CAEA,SAASm5B,IAAKx5I,EAAGC,EAAGogH,GAClB,OAAQrgH,EAAIC,EAAMogH,GAAKrgH,EAAIC,EAC7B,CAEA,SAASw5I,OAAQz5I,EAAGk7I,GAClB,OAAQl7I,IAAM,GAAKk7I,GAAM,IAAMA,IAAO,EAAIl7I,GAAK,KAAOk7I,IAAO,EAAIl7I,GAAK,GACxE,CAEA,SAAS05I,OAAQ15I,EAAGk7I,GAClB,OAAQl7I,IAAM,GAAKk7I,GAAM,KAAOl7I,IAAM,GAAKk7I,GAAM,KAAOA,IAAO,EAAIl7I,GAAK,GAC1E,CAEA,SAASm7I,OAAQn7I,EAAGk7I,GAClB,OAAQl7I,IAAM,EAAIk7I,GAAM,KAAOl7I,IAAM,EAAIk7I,GAAM,IAAOl7I,IAAM,CAC9D,CAEA,SAASo7I,QAASp7I,EAAGk7I,GACnB,OAAQl7I,IAAM,EAAIk7I,GAAM,KAAOl7I,IAAM,EAAIk7I,GAAM,KAAOl7I,IAAM,EAAIk7I,GAAM,GACxE,CAEA,SAASG,OAAQr7I,EAAGk7I,GAClB,OAAQl7I,IAAM,GAAKk7I,GAAM,KAAOA,IAAO,GAAKl7I,GAAK,GAAMA,IAAM,CAC/D,CAEA,SAASs7I,QAASt7I,EAAGk7I,GACnB,OAAQl7I,IAAM,GAAKk7I,GAAM,KAAOA,IAAO,GAAKl7I,GAAK,IAAMA,IAAM,EAAIk7I,GAAM,GACzE,CAEA,SAASK,SAAUx7I,EAAG/F,GACpB,OAAQ+F,IAAM,EAAM/F,IAAM,EAAK,EAAI,CACrC,CA1DAuoE,EAAS04E,OAAQx0E,GAEjBw0E,OAAO3iJ,UAAUmuB,KAAO,WAmBtB,OAlBA3yB,KAAKkmJ,IAAM,WACXlmJ,KAAKmmJ,IAAM,WACXnmJ,KAAKomJ,IAAM,WACXpmJ,KAAKqmJ,IAAM,WACXrmJ,KAAKsmJ,IAAM,WACXtmJ,KAAKumJ,IAAM,WACXvmJ,KAAKwmJ,IAAM,UACXxmJ,KAAKymJ,IAAM,WAEXzmJ,KAAK0mJ,IAAM,WACX1mJ,KAAK2mJ,IAAM,WACX3mJ,KAAK4mJ,IAAM,WACX5mJ,KAAK6mJ,IAAM,WACX7mJ,KAAK8mJ,IAAM,WACX9mJ,KAAK+mJ,IAAM,UACX/mJ,KAAKgnJ,IAAM,WACXhnJ,KAAKinJ,IAAM,UAEJjnJ,IACT,EAsCAmnJ,OAAO3iJ,UAAUk/I,QAAU,SAAU70B,GAqBnC,IApBA,IAAIyQ,EAAIt/H,KAAK2kJ,GAETluB,EAAgB,EAAXz2H,KAAKkmJ,IACVxvB,EAAgB,EAAX12H,KAAKmmJ,IACVxvB,EAAgB,EAAX32H,KAAKomJ,IACVxvB,EAAgB,EAAX52H,KAAKqmJ,IACVxvB,EAAgB,EAAX72H,KAAKsmJ,IACVxvB,EAAgB,EAAX92H,KAAKumJ,IACVxvB,EAAgB,EAAX/2H,KAAKwmJ,IACVxvB,EAAgB,EAAXh3H,KAAKymJ,IAEViB,EAAgB,EAAX1nJ,KAAK0mJ,IACViB,EAAgB,EAAX3nJ,KAAK2mJ,IACViB,GAAgB,EAAX5nJ,KAAK4mJ,IACViB,GAAgB,EAAX7nJ,KAAK6mJ,IACVlqI,GAAgB,EAAX3c,KAAK8mJ,IACVgB,GAAgB,EAAX9nJ,KAAK+mJ,IACVgB,GAAgB,EAAX/nJ,KAAKgnJ,IACVgB,GAAgB,EAAXhoJ,KAAKinJ,IAELllJ,GAAI,EAAGA,GAAI,GAAIA,IAAK,EAC3Bu9H,EAAEv9H,IAAK8sH,EAAEv+G,YAAgB,EAAJvO,IACrBu9H,EAAEv9H,GAAI,GAAK8sH,EAAEv+G,YAAgB,EAAJvO,GAAQ,GAEnC,KAAOA,GAAI,IAAKA,IAAK,EAAG,CACtB,IAAIs2H,GAAKiH,EAAEv9H,GAAI,IACXqlJ,GAAK9nB,EAAEv9H,GAAI,GAAS,GACpB8jJ,GAASwB,OAAOhvB,GAAI+uB,IACpBa,GAAUX,QAAQF,GAAI/uB,IAItB6vB,GAASX,OAFblvB,GAAKiH,EAAEv9H,GAAI,GACXqlJ,GAAK9nB,EAAEv9H,GAAI,EAAQ,IAEfomJ,GAAUX,QAAQJ,GAAI/uB,IAGtB+vB,GAAO9oB,EAAEv9H,GAAI,IACbsmJ,GAAO/oB,EAAEv9H,GAAI,GAAQ,GAErBumJ,GAAQhpB,EAAEv9H,GAAI,IACdwmJ,GAAQjpB,EAAEv9H,GAAI,GAAS,GAEvBymJ,GAAOP,GAAUI,GAAQ,EACzBI,GAAO5C,GAASuC,GAAOX,SAASe,GAAKP,IAAY,EAIrDQ,IAFAA,GAAOA,GAAMP,GAAST,SADtBe,GAAOA,GAAML,GAAW,EACYA,IAAY,GAEnCG,GAAQb,SADrBe,GAAOA,GAAMD,GAAS,EACaA,IAAU,EAE7CjpB,EAAEv9H,IAAK0mJ,GACPnpB,EAAEv9H,GAAI,GAAKymJ,EACb,CAEA,IAAK,IAAI1/I,GAAI,EAAGA,GAAI,IAAKA,IAAK,EAAG,CAC/B2/I,GAAMnpB,EAAEx2H,IACR0/I,GAAMlpB,EAAEx2H,GAAI,GAEZ,IAAI4/I,GAAOhD,IAAIjvB,EAAIC,EAAIC,GACnBgyB,GAAOjD,IAAIgC,EAAIC,EAAIC,IAEnBgB,GAAUjD,OAAOlvB,EAAIixB,GACrBmB,GAAUlD,OAAO+B,EAAIjxB,GACrBqyB,GAAUlD,OAAO/uB,EAAIl6G,IACrBosI,GAAUnD,OAAOjpI,GAAIk6G,GAGrBmyB,GAAMh8B,EAAElkH,IACRmgJ,GAAMj8B,EAAElkH,GAAI,GAEZogJ,GAAMxwB,GAAG7B,EAAIC,EAAIC,GACjBoyB,GAAMzwB,GAAG/7G,GAAImrI,GAAIC,IAEjBqB,GAAOpB,GAAKe,GAAW,EACvBM,GAAOryB,EAAK8xB,GAAUrB,SAAS2B,GAAKpB,IAAO,EAM/CqB,IAFAA,IAFAA,GAAOA,GAAMH,GAAMzB,SADnB2B,GAAOA,GAAMD,GAAO,EACaA,IAAQ,GAE5BH,GAAMvB,SADnB2B,GAAOA,GAAMH,GAAO,EACaA,IAAQ,GAE5BR,GAAMhB,SADnB2B,GAAOA,GAAMZ,GAAO,EACaA,IAAQ,EAGzC,IAAIc,GAAOT,GAAUF,GAAQ,EACzBY,GAAOX,GAAUF,GAAOjB,SAAS6B,GAAKT,IAAY,EAEtD7xB,EAAKD,EACLixB,GAAKD,GACLhxB,EAAKD,EACLixB,GAAKD,GACLhxB,EAAKD,EACLixB,GAAKnrI,GAELk6G,EAAMD,EAAKyyB,GAAM5B,SADjB9qI,GAAMkrI,GAAKuB,GAAO,EACYvB,IAAO,EACrCjxB,EAAKD,EACLkxB,GAAKD,GACLjxB,EAAKD,EACLkxB,GAAKD,EACLjxB,EAAKD,EACLkxB,EAAKD,EAELjxB,EAAM4yB,GAAME,GAAM9B,SADlBC,EAAM0B,GAAME,GAAO,EACYF,IAAQ,CACzC,CAEAppJ,KAAK0mJ,IAAO1mJ,KAAK0mJ,IAAMgB,EAAM,EAC7B1nJ,KAAK2mJ,IAAO3mJ,KAAK2mJ,IAAMgB,EAAM,EAC7B3nJ,KAAK4mJ,IAAO5mJ,KAAK4mJ,IAAMgB,GAAM,EAC7B5nJ,KAAK6mJ,IAAO7mJ,KAAK6mJ,IAAMgB,GAAM,EAC7B7nJ,KAAK8mJ,IAAO9mJ,KAAK8mJ,IAAMnqI,GAAM,EAC7B3c,KAAK+mJ,IAAO/mJ,KAAK+mJ,IAAMe,GAAM,EAC7B9nJ,KAAKgnJ,IAAOhnJ,KAAKgnJ,IAAMe,GAAM,EAC7B/nJ,KAAKinJ,IAAOjnJ,KAAKinJ,IAAMe,GAAM,EAE7BhoJ,KAAKkmJ,IAAOlmJ,KAAKkmJ,IAAMzvB,EAAKgxB,SAASznJ,KAAK0mJ,IAAKgB,GAAO,EACtD1nJ,KAAKmmJ,IAAOnmJ,KAAKmmJ,IAAMzvB,EAAK+wB,SAASznJ,KAAK2mJ,IAAKgB,GAAO,EACtD3nJ,KAAKomJ,IAAOpmJ,KAAKomJ,IAAMzvB,EAAK8wB,SAASznJ,KAAK4mJ,IAAKgB,IAAO,EACtD5nJ,KAAKqmJ,IAAOrmJ,KAAKqmJ,IAAMzvB,EAAK6wB,SAASznJ,KAAK6mJ,IAAKgB,IAAO,EACtD7nJ,KAAKsmJ,IAAOtmJ,KAAKsmJ,IAAMzvB,EAAK4wB,SAASznJ,KAAK8mJ,IAAKnqI,IAAO,EACtD3c,KAAKumJ,IAAOvmJ,KAAKumJ,IAAMzvB,EAAK2wB,SAASznJ,KAAK+mJ,IAAKe,IAAO,EACtD9nJ,KAAKwmJ,IAAOxmJ,KAAKwmJ,IAAMzvB,EAAK0wB,SAASznJ,KAAKgnJ,IAAKe,IAAO,EACtD/nJ,KAAKymJ,IAAOzmJ,KAAKymJ,IAAMzvB,EAAKywB,SAASznJ,KAAKinJ,IAAKe,IAAO,CACxD,EAEAb,OAAO3iJ,UAAUw/I,MAAQ,WACvB,IAAIt1B,EAAI5qH,EAAOc,YAAY,IAE3B,SAASsiJ,aAActxF,EAAG38B,EAAGjwB,GAC3B0lH,EAAEr8G,aAAaujD,EAAG5sD,GAClB0lH,EAAEr8G,aAAa4mB,EAAGjwB,EAAS,EAC7B,CAWA,OATAk+I,aAAalnJ,KAAKkmJ,IAAKlmJ,KAAK0mJ,IAAK,GACjCQ,aAAalnJ,KAAKmmJ,IAAKnmJ,KAAK2mJ,IAAK,GACjCO,aAAalnJ,KAAKomJ,IAAKpmJ,KAAK4mJ,IAAK,IACjCM,aAAalnJ,KAAKqmJ,IAAKrmJ,KAAK6mJ,IAAK,IACjCK,aAAalnJ,KAAKsmJ,IAAKtmJ,KAAK8mJ,IAAK,IACjCI,aAAalnJ,KAAKumJ,IAAKvmJ,KAAK+mJ,IAAK,IACjCG,aAAalnJ,KAAKwmJ,IAAKxmJ,KAAKgnJ,IAAK,IACjCE,aAAalnJ,KAAKymJ,IAAKzmJ,KAAKinJ,IAAK,IAE1Bv4B,CACT,EAEA7uH,EAAOD,QAAUunJ,+BClQjB,IAAIqC,EAAgB,MAClB,IAAIC,EAAYnlJ,OAAOmH,eACnBi+I,EAAmBplJ,OAAO2Z,yBAC1B0rI,EAAoBrlJ,OAAOsqB,oBAC3Bg7H,EAAsBtlJ,OAAOgoB,sBAC7Bu9H,EAAevlJ,OAAOE,UAAU4R,eAChC0zI,EAAexlJ,OAAOE,UAAUshB,qBAChCikI,gBAAkB,CAAC3jJ,EAAKqQ,EAAK3R,IAAU2R,KAAOrQ,EAAMqjJ,EAAUrjJ,EAAKqQ,EAAK,CAAE/K,YAAY,EAAM6H,cAAc,EAAMD,UAAU,EAAMxO,UAAWsB,EAAIqQ,GAAO3R,EACtJklJ,eAAiB,CAAC/9I,EAAG/F,KACvB,IAAK,IAAImzB,KAAQnzB,IAAMA,EAAI,CAAC,GACtB2jJ,EAAaxhJ,KAAKnC,EAAGmzB,IACvB0wH,gBAAgB99I,EAAGotB,EAAMnzB,EAAEmzB,IAC/B,GAAIuwH,EACF,IAAK,IAAIvwH,KAAQuwH,EAAoB1jJ,GAC/B4jJ,EAAazhJ,KAAKnC,EAAGmzB,IACvB0wH,gBAAgB99I,EAAGotB,EAAMnzB,EAAEmzB,IAEjC,OAAOptB,CAAC,EAeNg+I,cAAgB,CAAC7jJ,EAAKqQ,EAAK3R,KAC7BilJ,gBAAgB3jJ,EAAoB,iBAARqQ,EAAmBA,EAAM,GAAKA,EAAK3R,GACxDA,GAILolJ,EAAc,CAAC,EAnBJ,EAACn9I,EAAQsM,KACtB,IAAK,IAAI7F,KAAQ6F,EACfowI,EAAU18I,EAAQyG,EAAM,CAAE7H,IAAK0N,EAAI7F,GAAO9H,YAAY,GAAO,EAkBjEy+I,CAASD,EAAa,CACpBE,gBAAiB,IAAMA,EACvBC,oBAAqB,IAAMA,EAC3B3zI,QAAS,IAAM8yI,IAIjB,IAGIa,EAAsB,EACtBD,EAAkB,CACpBE,WAAY,WACZC,SAAS,EACT9xI,OAAO,EACPhW,OAAQ4nJ,EACRG,QAAS,GAEPC,EAAiB,MAAMA,eACzB,WAAAr3I,CAAYs3I,EAAa,CAAC,GACxBT,cAAcjqJ,KAAM,WACpBiqJ,cAAcjqJ,KAAM,SACpBiqJ,cAAcjqJ,KAAM,QACpBiqJ,cAAcjqJ,KAAM,WACpBiqJ,cAAcjqJ,KAAM,YAAa,GACjCiqJ,cAAcjqJ,KAAM,YAAa,IACjCiqJ,cAAcjqJ,KAAM,aAAc,GAClCiqJ,cAAcjqJ,KAAM,aAAc,GAClCiqJ,cAAcjqJ,KAAM,aAAc,GAClCiqJ,cAAcjqJ,KAAM,cACpBiqJ,cAAcjqJ,KAAM,qBAAsB,IAC1CiqJ,cAAcjqJ,KAAM,oBAAqB,IACzCiqJ,cAAcjqJ,KAAM,2BAA4B,IAChDiqJ,cAAcjqJ,KAAM,0BAA2B,KAC/CiqJ,cAAcjqJ,KAAM,kBAAmB,KACvCiqJ,cAAcjqJ,KAAM,2BAA4B,IAChDiqJ,cAAcjqJ,KAAM,0BAA2B,IAC/CiqJ,cAAcjqJ,KAAM,sBAAuB,CACzC4sC,OAAQ,CAAC5sC,KAAK2qJ,mBAAoB3qJ,KAAK4qJ,qBAEzCX,cAAcjqJ,KAAM,qBAAsB,CACxC6qJ,UAAW,CAAC7qJ,KAAK8qJ,yBAA0B9qJ,KAAK+qJ,yBAChDC,UAAW,CAAChrJ,KAAKirJ,yBAA0BjrJ,KAAKkrJ,2BAElDjB,cAAcjqJ,KAAM,2BAA4B,CAC9C6qJ,UAAW,CAAC7qJ,KAAK8qJ,yBAA0B9qJ,KAAK+qJ,2BAElDd,cAAcjqJ,KAAM,2BAA4B,CAC9CgrJ,UAAW,CAAChrJ,KAAKirJ,yBAA0BjrJ,KAAKkrJ,2BAElDjB,cAAcjqJ,KAAM,wBAAyB,CAC3C4sC,OAAQ,CAAC5sC,KAAK2qJ,mBAAoB3qJ,KAAK4qJ,mBACvCC,UAAW,CAAC7qJ,KAAK8qJ,yBAA0B9qJ,KAAK+qJ,yBAChDC,UAAW,CAAChrJ,KAAKirJ,yBAA0BjrJ,KAAKkrJ,2BAElDjB,cAAcjqJ,KAAM,8BAA+B,CACjD4sC,OAAQ,CAAC5sC,KAAK2qJ,mBAAoB3qJ,KAAK4qJ,mBACvCC,UAAW,CAAC7qJ,KAAK8qJ,yBAA0B9qJ,KAAK+qJ,2BAElDd,cAAcjqJ,KAAM,8BAA+B,CACjD4sC,OAAQ,CAAC5sC,KAAK2qJ,mBAAoB3qJ,KAAK4qJ,mBACvCI,UAAW,CAAChrJ,KAAKirJ,yBAA0BjrJ,KAAKkrJ,2BAElDjB,cAAcjqJ,KAAM,mBAAoB,CACtCmrJ,UAAW,CAACnrJ,KAAK2qJ,mBAAoB3qJ,KAAK4qJ,mBAC1CQ,YAAa,CAACprJ,KAAK8qJ,yBAA0B9qJ,KAAKqrJ,mBAEpDpB,cAAcjqJ,KAAM,eAAgB,CAClCsrJ,oBAAqBtrJ,KAAKsrJ,oBAC1BC,mBAAoBvrJ,KAAKurJ,mBACzBC,yBAA0BxrJ,KAAKwrJ,yBAC/BC,yBAA0BzrJ,KAAKyrJ,yBAC/BC,sBAAuB1rJ,KAAK0rJ,sBAC5BC,4BAA6B3rJ,KAAK2rJ,4BAClCC,4BAA6B5rJ,KAAK4rJ,4BAClCC,iBAAkB7rJ,KAAK6rJ,mBAGzB5B,cAAcjqJ,KAAM,OAAO,IAAIkkB,KAC7B,MAAM4nI,EAAY,IAAI5nI,GAEtB,GADA4nI,EAAU,GAAK,qBAAqB5nI,EAAK,MACtB,IAAflkB,KAAKyY,OACgB,oBAAZlN,SAAuC,OAAZA,QACpC,OAAOA,QAAQ6hC,OAAO0+G,EAE1B,IAIF7B,cAAcjqJ,KAAM,iBAAiB,CAACsqJ,EAAYC,KAChD,IAAIwB,EACJ,GAAIzB,GAAcnnJ,MAAMuD,QAAQ4jJ,IAAeA,EAAW7nJ,OAAS,EACjEspJ,EAAYzB,MACP,CAEL,IAAIvoJ,EADJgqJ,EAAY,GAEZ/rJ,KAAKgsJ,UAAYjqJ,EAAI,EACrB,MAAMkqJ,EAAa,IAAI3B,gBACjBxjH,EAAS9mC,KAAKksJ,aAAaD,GACjC3nJ,OAAOyZ,KAAK+oB,GAAQ5a,SAASigI,IAC3B,MAAMC,EAAeD,EAIrB,IAHAnsJ,KAAKqsJ,UAAYvlH,EAAOslH,GACxBpsJ,KAAKssJ,WAAatsJ,KAAKqsJ,UAAU,GACjCrsJ,KAAKusJ,WAAavsJ,KAAKqsJ,UAAU,GAC5BrsJ,KAAKgsJ,UAAYjqJ,EAAI/B,KAAKssJ,WAAYtsJ,KAAKssJ,YAActsJ,KAAKusJ,WAAaxqJ,EAAI/B,KAAKusJ,WAAaxqJ,EAAI/B,KAAKusJ,WAAYvsJ,KAAKgsJ,UAAYhsJ,KAAKssJ,YAActsJ,KAAKusJ,WAAaxqJ,GAAK,EAAIA,GAAK,EAC7LgqJ,EAAUjpJ,KAAK/B,OAAOC,aAAahB,KAAKgsJ,WAC1C,GAEJ,CACA,GAAIzB,EAAS,CACX,MAAMiC,EAAc,GACpBT,EAAYA,EAAU3pG,MAAK,IAAMj4C,KAAK+mB,SAAWs7H,GACnD,CACAxsJ,KAAKysJ,KAAOV,EACZ/rJ,KAAK0sJ,WAAa1sJ,KAAKysJ,KAAKhqJ,OAC5BzC,KAAK2sJ,WAAW,EAAE,IAEpB1C,cAAcjqJ,KAAM,OAAO,IAClBA,KAAK4sJ,mBAMd3C,cAAcjqJ,KAAM,kBAAkB,KACpC,IAAI6sJ,EACAC,EACA97H,EAAK,GACT67H,EAAa7sJ,KAAKwqJ,QAClB,GACEsC,EAAaD,EAAa7sJ,KAAK0sJ,WAC/BG,EAAa1iJ,KAAKqhB,MAAMqhI,EAAa7sJ,KAAK0sJ,YAC1C17H,GAAMhxB,KAAKysJ,KAAKK,SACM,IAAfD,GAET,OADA7sJ,KAAKwqJ,SAAW,EACTx5H,CAAE,IAEXi5H,cAAcjqJ,KAAM,OAAO,CAAC+sJ,EAAa/sJ,KAAK+sJ,YAAc1C,IACnDrqJ,KAAKgtJ,WAAWD,KAMzB9C,cAAcjqJ,KAAM,cAAc,CAAC+sJ,EAAa/sJ,KAAK+sJ,YAAc1C,KACjE,IAAIr5H,EACAi8H,EACAnkJ,EACJ,GAAIikJ,SAA4DA,EAAa,EAC3E,MAAM,IAAI1pJ,MAAM,gCAIlB,IADA2tB,EAAK,GACAloB,EAAI,EAAGA,EAAIikJ,EAAYjkJ,GAAK,EAC/BmkJ,EAAgB5jJ,UACbc,KAAK+mB,SAAWlxB,KAAK0sJ,YAAY5/G,QAAQ,GAC1C,IACE9sC,KAAK0sJ,WACT17H,GAAMhxB,KAAKysJ,KAAKQ,GAElB,OAAOj8H,CAAE,IAEXi5H,cAAcjqJ,KAAM,OAAO,CAACga,EAAQwrF,IAC3BxlG,KAAKktJ,cAAclzI,EAAQwrF,KAMpCykD,cAAcjqJ,KAAM,iBAAiB,CAACga,EAAQwrF,KAC5C,MAAM2nD,EAAQ,CACZ,GAAMntJ,KAAKgtJ,WACX,GAAMhtJ,KAAK4sJ,eACX,GAAM5sJ,KAAK+pF,OAgBb,OAde/vE,EAAOpZ,QACpB,qCACCoH,IACC,MAAMiN,EAAKjN,EAAE3C,MAAM,EAAG,GAChBjD,EAAMiH,SAASrB,EAAE3C,MAAM,GAAI,IACjC,MAAW,OAAP4P,EACKk4I,EAAMl4I,KAAMm4I,SAAShrJ,EAAK,KAExB,OAAP6S,GAAeuwF,EACV2nD,EAAMl4I,GAAI7S,EAAKojG,GAEjB2nD,EAAMl4I,GAAI7S,EAAI,GAGZ,IAmBf6nJ,cAAcjqJ,KAAM,kBAAkB,CAAC+sJ,EAAa/sJ,KAAK+sJ,aAChDlgH,WACL1iC,KAAK6F,IAAI,IAAI,IAAI0/B,IAAI1vC,KAAKysJ,OAAOhqJ,OAAQsqJ,GAAYjgH,QAAQ,MAwBjEm9G,cAAcjqJ,KAAM,4BAA4B,CAACqtJ,EAASrtJ,KAAKstJ,eAAettJ,KAAK+sJ,cAC1ElgH,WACL1iC,KAAKojJ,KAAKpjJ,KAAKqjJ,GAAK,EAAIH,GAAQvgH,QAAQ,OA4B5Cm9G,cAAcjqJ,KAAM,wBAAwB,CAACqtJ,EAASrtJ,KAAKstJ,eAAettJ,KAAK+sJ,YAAaA,EAAa/sJ,KAAK+sJ,aACrGlgH,YACJ7sC,KAAKytJ,yBAAyBJ,GAAUrtJ,KAAKstJ,eAAeP,IAAajgH,QAAQ,OAyBtFm9G,cAAcjqJ,KAAM,cAAc,CAACqtJ,EAASrtJ,KAAKstJ,eAAettJ,KAAK+sJ,eACnE,MAAMW,EAAQ7gH,YACX,EAAI7sC,KAAKytJ,yBAAyBJ,GAAUA,GAAQvgH,QAAQ,KAE/D,OAAO4gH,EAAQ,EAAI,EAAIA,EAAQ,EAAI,EAAIA,CAAK,IAK9CzD,cAAcjqJ,KAAM,cAAc,IACzBA,KAAK8gB,UAcdmpI,cAAcjqJ,KAAM,SAAS,CAAC2tJ,EAAanoD,KACzC,MAAMooD,EAAWzjJ,KAAK6J,QAAQwxF,GAAwB,IAAI1tF,MAAU,KAAK9Q,SAAS,IAClF,GAA2B,iBAAhB2mJ,GAA4C,IAAhBA,EACrC,OAAOC,EAET,GAA2B,iBAAhBD,GAA4BA,EAAc,GACnD,MAAM,IAAItqJ,MACR,CACE,kEACA,kDACAJ,KAAK,OAGX,MAAM4qJ,EAAWF,EAAc,EACzBG,EAAS3jJ,KAAK4jJ,MAAM5jJ,KAAK+mB,UAAY28H,EAAW,GAAK,GAAKA,IAC1D78H,EAAKhxB,KAAKgtJ,WAAWa,GAC3B,MAAO,GAAG78H,EAAGgoB,UAAU,EAAG80G,KAAUF,IAAW58H,EAAGgoB,UAAU80G,KAAUA,EAAO9mJ,SAAS,KAAK,IAc7FijJ,cAAcjqJ,KAAM,cAAc,CAACguJ,EAAMh0I,KACvC,GAAIA,IAAW,kBAAkB1Y,KAAK0Y,GACpC,MAAM,IAAI3W,MAAM,4EAElB,MAAM0mF,EAAQ/vE,EAASA,EAAOpZ,QAC5B,qCACCoH,IACC,MAAMmlJ,EAAQ,CACZ,GAAOtqJ,GAAS,IAAIM,MAAMN,IAAOuzB,KAAI,IAAM,MAAKnzB,KAAK,IACrD,GAAOJ,GAAS,IAAIM,MAAMN,IAAOuzB,KAAI,IAAM,MAAKnzB,KAAK,IACrD,GAAOJ,GAAS,IAAIM,MAAMN,IAAOuzB,KAAI,IAAM,MAAKnzB,KAAK,KAEjDgS,EAAKjN,EAAE3C,MAAM,EAAG,GAChBjD,EAAMiH,SAASrB,EAAE3C,MAAM,GAAI,IACjC,OAAO8nJ,EAAMl4I,GAAI7S,EAAI,IAEvBxB,QACA,uBACA,CAACqtJ,EAAIC,EAAIC,IACAH,EAAKh1G,UAAUk1G,EAAGzrJ,OAAQyrJ,EAAGzrJ,OAAS0rJ,EAAG1rJ,UAEhDurJ,EACJ,GAAqB,IAAjBjkE,EAAMtnF,OACR,OAAO,IAAIqV,KAA2B,IAAtBzO,SAAS0gF,EAAO,KAElC,GAAIA,EAAMtnF,OAAS,GACjB,MAAM,IAAIY,MAAM,wBAElB,MAAMyqJ,EAASzkJ,SAAS0gF,EAAM/wC,UAAU+wC,EAAMtnF,OAAS,GAAI,IAC3D,OAAO,IAAIqV,KAAyD,IAApDzO,SAAS0gF,EAAM/wC,UAAU80G,EAAQA,EAAS,GAAI,IAAU,IAK1E7D,cAAcjqJ,KAAM,cAAewqJ,IACjCxqJ,KAAKwqJ,QAAUA,CAAO,IAExB,MAAM5zI,EAAUozI,eAAeA,eAAe,CAAC,EAAGI,GAAkBM,GACpE1qJ,KAAKwqJ,QAAU,EACfxqJ,KAAKyY,OAAQ,EACbzY,KAAKysJ,KAAO,GACZzsJ,KAAK8gB,QA3XK,QA4XV,MAAM,WACJwpI,EAAU,QACVC,EAAO,OACP9nJ,EAAM,QACN+nJ,GACE5zI,EAyBJ,OAxBA5W,KAAK+sJ,WAAatqJ,EAClBzC,KAAKouJ,cAAc9D,EAAYC,GAC/BvqJ,KAAK2sJ,WAAWnC,GAChBxqJ,KAAKyY,MAAQ7B,EAAQ6B,MACrBzY,KAAKotC,IAAIptC,KAAKysJ,MACdzsJ,KAAKotC,IACH,+CAA+CptC,KAAK0sJ,iCAAiC1sJ,KAAKwqJ,WAE5FxqJ,KAAKotC,IAAMptC,KAAKotC,IAAI33B,KAAKzV,MACzBA,KAAKouJ,cAAgBpuJ,KAAKouJ,cAAc34I,KAAKzV,MAC7CA,KAAK2sJ,WAAa3sJ,KAAK2sJ,WAAWl3I,KAAKzV,MACvCA,KAAK8yD,IAAM9yD,KAAK8yD,IAAIr9C,KAAKzV,MACzBA,KAAK4sJ,eAAiB5sJ,KAAK4sJ,eAAen3I,KAAKzV,MAC/CA,KAAKquJ,IAAMruJ,KAAKquJ,IAAI54I,KAAKzV,MACzBA,KAAKgtJ,WAAahtJ,KAAKgtJ,WAAWv3I,KAAKzV,MACvCA,KAAKqsC,IAAMrsC,KAAKqsC,IAAI52B,KAAKzV,MACzBA,KAAKktJ,cAAgBltJ,KAAKktJ,cAAcz3I,KAAKzV,MAC7CA,KAAKstJ,eAAiBttJ,KAAKstJ,eAAe73I,KAAKzV,MAC/CA,KAAKytJ,yBAA2BztJ,KAAKytJ,yBAAyBh4I,KAAKzV,MACnEA,KAAKsuJ,qBAAuBtuJ,KAAKsuJ,qBAAqB74I,KAAKzV,MAC3DA,KAAKuuJ,WAAavuJ,KAAKuuJ,WAAW94I,KAAKzV,MACvCA,KAAKwuJ,WAAaxuJ,KAAKwuJ,WAAW/4I,KAAKzV,MACvCA,KAAK+pF,MAAQ/pF,KAAK+pF,MAAMt0E,KAAKzV,MAC7BA,KAAKyuJ,WAAazuJ,KAAKyuJ,WAAWh5I,KAAKzV,MAChCA,IACT,GAGFiqJ,cAAcQ,EAAgB,UAAWA,GACzC,IA9aoBiE,EA8ahBlF,EAAgBiB,EACpB,OA/aoBiE,EA+aAxE,EAvbF,EAAC9pF,EAAIv7D,EAAM8pJ,EAAQr1H,KACnC,GAAIz0B,GAAwB,iBAATA,GAAqC,mBAATA,EAC7C,IAAK,IAAI4R,KAAOkzI,EAAkB9kJ,GAC3BglJ,EAAaxhJ,KAAK+3D,EAAI3pD,IAAQA,IAAQk4I,GACzClF,EAAUrpF,EAAI3pD,EAAK,CAAE9K,IAAK,IAAM9G,EAAK4R,GAAM/K,aAAc4tB,EAAOowH,EAAiB7kJ,EAAM4R,KAAS6iB,EAAK5tB,aAE3G,OAAO00D,CAAE,EAEiBwuF,CAAYnF,EAAU,CAAC,EAAG,aAAc,CAAE3kJ,OAAO,IAAS4pJ,EAgbvF,EA/cmB,GAidS7uJ,EAAOD,QAAQ4pJ,EAAc9yI,QAAS,oBAAoB0D,SAASovI,EAAcA,EAAc9yI,uCChd5H,IAAIvB,EAAe,EAAQ,OACvB05I,EAAY,EAAQ,OACpBhiJ,EAAU,EAAQ,OAElBoP,EAAa9G,EAAa,eAC1B25I,EAAW35I,EAAa,aAAa,GACrC45I,EAAO55I,EAAa,SAAS,GAE7B65I,EAAcH,EAAU,yBAAyB,GACjDI,EAAcJ,EAAU,yBAAyB,GACjDK,EAAcL,EAAU,yBAAyB,GACjDM,EAAUN,EAAU,qBAAqB,GACzCO,GAAUP,EAAU,qBAAqB,GACzCQ,GAAUR,EAAU,qBAAqB,GAUzCS,YAAc,SAAUjjJ,EAAMoK,GACjC,IAAK,IAAiB84I,EAAbn4H,EAAO/qB,EAAmC,QAAtBkjJ,EAAOn4H,EAAK9O,MAAgB8O,EAAOm4H,EAC/D,GAAIA,EAAK94I,MAAQA,EAIhB,OAHA2gB,EAAK9O,KAAOinI,EAAKjnI,KACjBinI,EAAKjnI,KAAOjc,EAAKic,KACjBjc,EAAKic,KAAOinI,EACLA,CAGV,EAuBA1vJ,EAAOD,QAAU,SAAS8kG,iBACzB,IAAI8qD,EACAC,EACAC,EACAC,EAAU,CACbC,OAAQ,SAAUn5I,GACjB,IAAKk5I,EAAQxpI,IAAI1P,GAChB,MAAM,IAAIwF,EAAW,iCAAmCpP,EAAQ4J,GAElE,EACA9K,IAAK,SAAU8K,GACd,GAAIq4I,GAAYr4I,IAAuB,iBAARA,GAAmC,mBAARA,IACzD,GAAI+4I,EACH,OAAOR,EAAYQ,EAAK/4I,QAEnB,GAAIs4I,GACV,GAAIU,EACH,OAAON,EAAQM,EAAIh5I,QAGpB,GAAIi5I,EACH,OA1CS,SAAUn9G,EAAS97B,GAChC,IAAIirB,EAAO4tH,YAAY/8G,EAAS97B,GAChC,OAAOirB,GAAQA,EAAK58B,KACrB,CAuCY+qJ,CAAQH,EAAIj5I,EAGtB,EACA0P,IAAK,SAAU1P,GACd,GAAIq4I,GAAYr4I,IAAuB,iBAARA,GAAmC,mBAARA,IACzD,GAAI+4I,EACH,OAAON,EAAYM,EAAK/4I,QAEnB,GAAIs4I,GACV,GAAIU,EACH,OAAOJ,GAAQI,EAAIh5I,QAGpB,GAAIi5I,EACH,OAxCS,SAAUn9G,EAAS97B,GAChC,QAAS64I,YAAY/8G,EAAS97B,EAC/B,CAsCYq5I,CAAQJ,EAAIj5I,GAGrB,OAAO,CACR,EACAlK,IAAK,SAAUkK,EAAK3R,GACfgqJ,GAAYr4I,IAAuB,iBAARA,GAAmC,mBAARA,IACpD+4I,IACJA,EAAM,IAAIV,GAEXG,EAAYO,EAAK/4I,EAAK3R,IACZiqJ,GACLU,IACJA,EAAK,IAAIV,GAEVK,GAAQK,EAAIh5I,EAAK3R,KAEZ4qJ,IAMJA,EAAK,CAAEj5I,IAAK,CAAC,EAAG6R,KAAM,OA5Eb,SAAUiqB,EAAS97B,EAAK3R,GACrC,IAAI48B,EAAO4tH,YAAY/8G,EAAS97B,GAC5BirB,EACHA,EAAK58B,MAAQA,EAGbytC,EAAQjqB,KAAO,CACd7R,IAAKA,EACL6R,KAAMiqB,EAAQjqB,KACdxjB,MAAOA,EAGV,CAkEIirJ,CAAQL,EAAIj5I,EAAK3R,GAEnB,GAED,OAAO6qJ,CACR,cC3HC,WAAW,aAAa,IAAInjC,EAAExiH,EAAEiC,EAAEitC,EAAEl7B,EAAE7R,EAAE,aAAa8sB,EAAE,iBAAiB/yB,EAAE,sBAAsB+lD,EAAE,mBAAmBpvC,EAAE,uBAAuB+4C,EAAE,4BAA4BjwC,EAAE,gBAAgB3d,GAAE,oBAAoBud,GAAE,YAAYwG,GAAE,cAAcjjB,GAAE,WAAWonD,GAAE,eAAex5B,GAAE,UAAUiT,GAAE,YAAYomE,GAAE,UAAU,SAASxjF,EAAEuiF,GAAG,OAAOxqG,OAAOsqB,oBAAoBkgF,GAAG1iG,OAAO9H,OAAOgoB,sBAAsBhoB,OAAOgoB,sBAAsBwiF,GAAG,GAAG,CAAC,SAASA,EAAEA,EAAE4d,GAAG,OAAOvpH,MAAMqB,UAAUa,MAAMgD,KAAKnB,UAAU,GAAGiwB,OAAO23E,EAAE4d,EAAE,CAAC,IAAIxgH,GAAE4iG,EAAEr5F,KAAK,GAAE,SAASq5F,EAAE4d,EAAEphH,GAAG,GAAGA,EAAE,IAAI,IAAIvD,EAAEwkB,EAAEjhB,GAAGqqD,EAAE,EAAEA,EAAE5tD,EAAEtF,OAAOkzD,GAAG,EAAErxD,OAAOmH,eAAeihH,EAAE3kH,EAAE4tD,GAAGrxD,OAAO2Z,yBAAyB3S,EAAEvD,EAAE4tD,KAAK,OAAO+2D,CAAC,IAAG,SAAS7qG,EAAEitF,GAAG,MAAM,mBAAmBA,CAAC,CAAC,SAASggB,EAAEhgB,GAAG,OAAOA,GAAG,iBAAiBA,GAAGjtF,EAAEitF,EAAE,CAAC,SAASyd,EAAEzd,GAAG,OAAOA,GAAG,iBAAiBA,GAAGA,EAAEx/E,WAAWhrB,OAAOE,SAAS,CAAC,IAAIuO,GAAE+7F,EAAEr5F,KAAK,GAAE,SAASq5F,EAAE4d,EAAEphH,GAAG,GAAGA,IAAIkhH,EAAE,OAAOE,EAAE,GAAGvpH,MAAMuD,QAAQ4E,GAAG,OAAOnI,MAAMuD,QAAQgmH,GAAGA,EAAE,IAAItgH,OAAOd,GAAG,IAAIihH,EAAEjhH,GAAG,OAAOA,EAAE,IAAI,IAAIvD,EAAE4tD,EAAE5zD,EAAEwqB,EAAEjhB,GAAG8/F,EAAE,EAAEA,EAAErpG,EAAEU,QAAQsF,EAAEhG,EAAEqpG,MAAMz1C,EAAErxD,OAAO2Z,yBAAyB3S,EAAEvD,IAAIqO,eAAe,SAASu/C,EAAE7wD,QAAQ0nH,IAAIE,EAAE3kH,GAAG+mG,EAAEyd,EAAEG,EAAE3kH,KAAK5E,MAAMuD,QAAQ4E,EAAEvD,IAAI2kH,EAAE3kH,GAAG,CAAC,EAAEuD,EAAEvD,KAAKzD,OAAOmH,eAAeihH,EAAE3kH,EAAE4tD,GAAG,OAAO+2D,CAAC,IAAG,SAASiC,IAAI,OAAO3kH,EAAE7G,MAAMqB,UAAU4H,OAAOpB,MAAM,GAAG9D,WAAWsvB,QAAO,SAASs4E,EAAE4d,EAAEphH,GAAG,OAAOuW,EAAEitF,IAAIxjG,EAAEnK,QAAQ2tG,KAAK4d,CAAC,KAAIjqH,OAAOuH,EAAEwiH,CAAC,CAAwf,SAASlhH,EAAEA,EAAEvD,GAAG,SAAS+mG,EAAEA,EAAE4d,GAAGoC,EAAE/mH,EAAE+mG,MAAMggB,EAAExjH,EAAEwjG,MAAMxjG,EAAEwjG,GAAG,CAAC,IAAI4d,GAAGxgH,IAAGZ,EAAEwjG,GAAG/mG,EAAE+mG,IAAI,CAAC,SAAS4d,EAAE5d,IAAI9kG,EAAE2kH,EAAErjH,EAAEwjG,GAAG/mG,EAAE+mG,OAAOxjG,EAAEwjG,GAAG9kG,EAAE,CAAC,OAAOjC,GAAG+mH,EAAE/mH,EAAEA,EAAEgoG,KAAIhoG,KAAK+mG,EAAEp4E,IAAGo4E,EAAE3iG,GAAG2iG,EAAE71E,EAAElmB,IAAG+7F,EAAE5oG,GAAG4oG,EAAE7iD,GAAG6iD,EAAEjyF,EAAE9J,IAAG+7F,EAAEl5C,GAAGk5C,EAAEnpF,GAAGmpF,EAAE9mG,GAAE+K,IAAG25G,EAAEx8D,IAAGw8D,EAAE/iF,KAAIr+B,CAAC,CAAC,SAASo8B,IAAI,OAAttB,SAASglF,EAAE5d,GAAG,OAAO9kG,EAAE,SAAS8kG,IAAI,OAAO,SAASA,EAAE4d,GAAG,IAAIphH,EAAEvD,EAAE4tD,EAAEm5C,EAAEiB,KAAI,CAAC,EAAEhuG,EAAE,CAACutB,UAAUqmC,EAAEj/B,KAAI00E,EAAEz1C,EAAEzF,IAAGlmD,EAAE7G,MAAMqB,UAAUa,MAAM2F,MAAM9D,WAAW+E,EAAE0pD,EAAE18B,GAAG,GAAGhtB,GAAG8G,GAAEhR,EAAEkK,IAAIA,EAAE0pD,EAAExpD,KAAKD,GAAEnK,EAAEkK,IAAIA,EAAE0pD,EAAEzvD,KAAK5B,OAAO4pB,iBAAiBnsB,EAAEkK,IAAIm/F,IAAIA,EAAE3oG,OAAO,OAAOV,EAAE,IAAI2qH,IAAIF,IAAIE,EAAE,CAAC,GAAG/2D,EAAE,EAAEA,EAAEy1C,EAAE3oG,QAAQof,EAAEvW,EAAE8/F,EAAEz1C,QAAQ5zD,GAAGgG,EAAEuD,EAAEjD,KAAKtG,EAAE2qH,EAAE,CAACtgB,SAASrqG,EAAEgoF,MAAM+kB,EAAE5qF,KAAKla,OAAOwiH,EAAEzqH,EAAEgG,GAAG,OAAOhG,CAAC,CAAC,CAA3U,IAAgVkK,EAAE6iG,EAAEjyF,KAAK9J,GAAE/I,EAAEiC,IAAIA,EAAE6iG,EAAE7iD,KAAK//C,GAAElC,EAAEiC,IAAIA,EAAE6iG,EAAEl5C,KAAKtxD,OAAO4pB,iBAAiBlkB,EAAEiC,GAAGA,EAAE4V,EAAE7X,EAAE+lG,KAAI/lG,EAAE+lG,IAAGroE,EAAEx7B,GAAElC,EAAE+lG,IAAG,WAAW,OAAO9jG,EAAEjB,MAAMhL,KAAKkH,UAAU,EAAE4nG,GAAG9kG,CAAC,CAAuO0iH,CAAEvpH,MAAMqB,UAAU4H,OAAOpB,MAAM,CAAChL,MAAMkH,WAAWiwB,OAAO7rB,EAAE,CAAC,GAAG,CAAC,SAASga,EAAEwpF,GAAG,OAAOjtF,EAAEitF,IAAIjtF,EAAEitF,EAAEiB,IAAG,CAAC,IAAIhoG,GAAE,CAAC,EAAE,SAAS4tD,EAAEm5C,EAAE4d,GAAG,OAAO,WAAW,OAAOxzE,EAAE,CAAC,GAAG41D,GAAG4d,EAAE1hH,MAAMwhH,EAAErpH,MAAMqB,UAAU4H,OAAOpB,MAAM,CAAC,CAAC,GAAG9D,cAAc8C,EAAEhK,OAAOgK,EAAE+lG,KAAI9jG,GAAG5D,KAAK2B,EAAEkvC,EAAE,CAAC,CAACnxC,GAAE2uB,IAAGi/B,EAAEj/B,GAAExqB,IAAGnE,GAAEoE,GAAGpE,GAAEomB,MAAMwnC,EAAExpD,EAAED,IAAGnE,GAAEmoD,IAAGnoD,GAAE4qB,KAAKgjC,EAAEzF,GAAEy+D,GAAG5mH,GAAE4hC,IAAGgsB,EAAEhsB,GAAEglF,GAAG5mH,GAAEkxB,GAAGlxB,GAAEwd,IAAGowC,EAAE18B,EAAElmB,IAAGhL,GAAEkkD,GAAGlkD,GAAEioJ,QAAQr6F,EAAE1J,EAAE//C,IAAGnE,GAAE8U,GAAG9U,GAAEgkB,IAAG4pC,EAAE94C,EAAE9J,IAAGhL,GAAE4d,GAAG5d,GAAEkoJ,KAAKt6F,EAAEhwC,EAAEzZ,IAAGnE,GAAEC,IAAGD,GAAEe,IAAG6sD,EAAE3tD,GAAE+K,IAAGhL,GAAE7B,GAAGyvD,EAAEzvD,EAAEgG,IAAGnE,GAAE6tD,GAAGD,EAAEC,EAAE1pD,IAAGD,EAAElE,GAAEgoG,IAAG7jG,IAAE,SAAS4iG,IAAI,IAAI,IAAI4d,EAAEphH,GAAEvD,GAAE,EAAE4tD,GAAE,GAAG5zD,GAAEmF,UAAUkkG,GAAEprG,KAAK+H,GAAEhG,GAAEU,QAAQqsH,EAAEpC,EAAE3qH,GAAEgG,QAAO4tD,GAAE7yD,KAAKwiB,EAAEonG,GAAGA,IAAIxzE,EAAE,CAAC,GAAGxiB,KAAIprB,GAAEohH,GAAGh2F,KAAI81F,EAAEvgH,EAAEX,GAAE6iB,MAAM+qB,EAAE/sC,GAAG2iH,GAAG9kH,EAAEsB,GAAEa,KAAKF,GAAGC,GAAE,CAAC,EAAED,EAAEjC,GAAGwiH,EAAEtzE,EAAEgX,IAAGy+D,EAAErjH,GAAEqnB,KAAKrnB,GAAE4kD,KAAIhX,EAAEvP,IAAGglF,EAAErjH,GAAEq+B,KAAI19B,EAAEX,GAAEia,IAAG2zB,EAAEjgB,GAAG61F,GAAG9kH,EAAEsB,GAAE2tB,KAAKhtB,GAAG8G,GAAE,CAAC,EAAE9G,EAAEjC,GAAGwiH,EAAEtzE,EAAEhzC,GAAGoF,GAAEpF,GAAG+F,EAAEX,GAAE0kJ,QAAQ92G,EAAE+S,GAAG6iE,GAAG9kH,EAAEsB,GAAE2gD,KAAKhgD,GAAGC,GAAE,CAAC,EAAED,EAAEjC,GAAGwiH,EAAEvgH,EAAEX,GAAEygB,IAAGmtB,EAAEr8B,GAAGiyG,GAAG9kH,EAAEsB,GAAEuR,KAAK5Q,GAAG8G,GAAE,CAAC,EAAE9G,EAAEjC,GAAGwiH,EAAExiH,EAAEsB,GAAEsqD,GAAG1c,EAAE0c,GAAGk5D,GAAG7iH,EAAEX,GAAEkI,MAAM,CAACA,KAAK,CAAC1O,MAAMwG,GAAEkI,SAASxJ,GAAGkC,GAAE,CAAC,EAAElC,EAAEiC,GAAGugH,EAAEvgH,EAAEX,GAAE2kJ,KAAK/2G,EAAEvzB,GAAGmpG,GAAG9kH,EAAEsB,GAAEqa,KAAK1Z,GAAGC,GAAE,CAAC,EAAED,EAAEjC,GAAGwiH,EAAEvgH,EAAEX,GAAExC,IAAGowC,EAAElxC,IAAG8mH,GAAG9kH,EAAEsB,GAAEtD,MAAKiE,GAAG8G,GAAE,CAAC,EAAE9G,EAAEjC,GAAGwiH,EAAEtzE,IAAI,GAAGwzE,EAAEhlF,EAAE18B,MAAMogG,IAAGptF,EAAE23C,IAAGy1C,IAAGz1C,GAAElsB,QAAQ2hE,IAAGjoG,MAAMuD,QAAQ3E,GAAE2qH,EAAE3c,IAAGpmE,KAAI,IAAI5hC,GAAE,EAAEA,GAAEhG,GAAEU,QAAQiqH,EAAEpnG,EAAE8lF,GAAErpG,GAAEgG,MAAK,CAACgiF,MAAM2iC,EAAEwjC,YAAYv6F,MAAKy1C,GAAEshB,EAAE,OAAOA,CAAC,GAAE3kH,IAAGA,GAAEohB,OAAO,WAAW,OAAOnpB,KAAKgL,MAAMwhH,EAAEtlH,UAAU,GAAGgyC,EAAE,CAAC,GAAG+S,GAAGlkD,GAAEiW,EAAE0pB,EAAEwR,GAAGjtC,EAAE8jG,IAAG9jG,EAAEwJ,OAAOxJ,EAAE6U,QAAQ,QAAkB,iBAAH0rG,EAAiB3sH,EAAOD,QAAQqM,EAAEyZ,KAAKyqI,QAAQlkJ,CAAC,CAA5pG,oBCqBDpM,EAAOD,QAAUkwI,OAEjB,IAAIsgB,EAAK,sBAoBT,SAAStgB,SACPsgB,EAAG/nJ,KAAKrI,KACV,CArBe,EAAQ,MAEvByuE,CAASqhE,OAAQsgB,GACjBtgB,OAAOlB,SAAW,EAAQ,OAC1BkB,OAAOjB,SAAW,EAAQ,OAC1BiB,OAAOnB,OAAS,EAAQ,OACxBmB,OAAOL,UAAY,EAAQ,OAC3BK,OAAON,YAAc,EAAQ,OAC7BM,OAAOiE,SAAW,EAAQ,MAC1BjE,OAAOqN,SAAW,EAAQ,OAG1BrN,OAAOA,OAASA,OAWhBA,OAAOtrI,UAAU0vI,KAAO,SAASC,EAAMv9H,GACrC,IAAIiH,EAAS7d,KAEb,SAASi1I,OAAOtF,GACVwE,EAAK7gI,WACH,IAAU6gI,EAAK/uI,MAAMuqI,IAAU9xH,EAAOy3H,OACxCz3H,EAAOy3H,OAGb,CAIA,SAASP,UACHl3H,EAAOkxH,UAAYlxH,EAAO01H,QAC5B11H,EAAO01H,QAEX,CANA11H,EAAO8qB,GAAG,OAAQssG,QAQlBd,EAAKxrG,GAAG,QAASosG,SAIZZ,EAAKkc,UAAcz5I,IAA2B,IAAhBA,EAAQrT,MACzCsa,EAAO8qB,GAAG,MAAOqmG,OACjBnxH,EAAO8qB,GAAG,QAASksG,UAGrB,IAAIyb,GAAW,EACf,SAASthB,QACHshB,IACJA,GAAW,EAEXnc,EAAK5wI,MACP,CAGA,SAASsxI,UACHyb,IACJA,GAAW,EAEiB,mBAAjBnc,EAAKzZ,SAAwByZ,EAAKzZ,UAC/C,CAGA,SAASsa,QAAQjqG,GAEf,GADA6pG,UACwC,IAApCwb,EAAG3lH,cAAczqC,KAAM,SACzB,MAAM+qC,CAEV,CAMA,SAAS6pG,UACP/2H,EAAOwqB,eAAe,OAAQ4sG,QAC9Bd,EAAK9rG,eAAe,QAAS0sG,SAE7Bl3H,EAAOwqB,eAAe,MAAO2mG,OAC7BnxH,EAAOwqB,eAAe,QAASwsG,SAE/Bh3H,EAAOwqB,eAAe,QAAS2sG,SAC/Bb,EAAK9rG,eAAe,QAAS2sG,SAE7Bn3H,EAAOwqB,eAAe,MAAOusG,SAC7B/2H,EAAOwqB,eAAe,QAASusG,SAE/BT,EAAK9rG,eAAe,QAASusG,QAC/B,CAUA,OA5BA/2H,EAAO8qB,GAAG,QAASqsG,SACnBb,EAAKxrG,GAAG,QAASqsG,SAmBjBn3H,EAAO8qB,GAAG,MAAOisG,SACjB/2H,EAAO8qB,GAAG,QAASisG,SAEnBT,EAAKxrG,GAAG,QAASisG,SAEjBT,EAAK3qG,KAAK,OAAQ3rB,GAGXs2H,CACT,gCCvGA,IAAIrwI,EAAS,gBAGToB,EAAapB,EAAOoB,YAAc,SAAUD,GAE9C,QADAA,EAAW,GAAKA,IACIA,EAASqC,eAC3B,IAAK,MAAM,IAAK,OAAO,IAAK,QAAQ,IAAK,QAAQ,IAAK,SAAS,IAAK,SAAS,IAAK,OAAO,IAAK,QAAQ,IAAK,UAAU,IAAK,WAAW,IAAK,MACxI,OAAO,EACT,QACE,OAAO,EAEb,EA0CA,SAAS4oI,cAAcjrI,GAErB,IAAIuvG,EACJ,OAFAx0G,KAAKiF,SAXP,SAASsrJ,kBAAkBn5I,GACzB,IAAIo5I,EA/BN,SAASC,mBAAmBr5I,GAC1B,IAAKA,EAAK,MAAO,OAEjB,IADA,IAAIs5I,IAEF,OAAQt5I,GACN,IAAK,OACL,IAAK,QACH,MAAO,OACT,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,MAAO,UACT,IAAK,SACL,IAAK,SACH,MAAO,SACT,IAAK,SACL,IAAK,QACL,IAAK,MACH,OAAOA,EACT,QACE,GAAIs5I,EAAS,OACbt5I,GAAO,GAAKA,GAAK9P,cACjBopJ,GAAU,EAGlB,CAKaD,CAAmBr5I,GAC9B,GAAoB,iBAATo5I,IAAsB1sJ,EAAOoB,aAAeA,IAAeA,EAAWkS,IAAO,MAAM,IAAI/T,MAAM,qBAAuB+T,GAC/H,OAAOo5I,GAAQp5I,CACjB,CAOkBm5I,CAAkBtrJ,GAE1BjF,KAAKiF,UACX,IAAK,UACHjF,KAAKwY,KAAOm4I,UACZ3wJ,KAAKuD,IAAMqtJ,SACXp8C,EAAK,EACL,MACF,IAAK,OACHx0G,KAAK6wJ,SAAWC,aAChBt8C,EAAK,EACL,MACF,IAAK,SACHx0G,KAAKwY,KAAOu4I,WACZ/wJ,KAAKuD,IAAMytJ,UACXx8C,EAAK,EACL,MACF,QAGE,OAFAx0G,KAAKoF,MAAQ6rJ,iBACbjxJ,KAAKuD,IAAM2tJ,WAGflxJ,KAAKmxJ,SAAW,EAChBnxJ,KAAKoxJ,UAAY,EACjBpxJ,KAAKqxJ,SAAWvtJ,EAAOc,YAAY4vG,EACrC,CAmCA,SAAS88C,cAAcC,GACrB,OAAIA,GAAQ,IAAa,EAAWA,GAAQ,GAAM,EAAa,EAAWA,GAAQ,GAAM,GAAa,EAAWA,GAAQ,GAAM,GAAa,EACpIA,GAAQ,GAAM,GAAQ,GAAK,CACpC,CA0DA,SAAST,aAAazsJ,GACpB,IAAI+mG,EAAIprG,KAAKoxJ,UAAYpxJ,KAAKmxJ,SAC1BriD,EAtBN,SAAS0iD,oBAAoB9rI,EAAMrhB,EAAK+mG,GACtC,GAAwB,MAAV,IAAT/mG,EAAI,IAEP,OADAqhB,EAAKyrI,SAAW,EACT,IAET,GAAIzrI,EAAKyrI,SAAW,GAAK9sJ,EAAI5B,OAAS,EAAG,CACvC,GAAwB,MAAV,IAAT4B,EAAI,IAEP,OADAqhB,EAAKyrI,SAAW,EACT,IAET,GAAIzrI,EAAKyrI,SAAW,GAAK9sJ,EAAI5B,OAAS,GACZ,MAAV,IAAT4B,EAAI,IAEP,OADAqhB,EAAKyrI,SAAW,EACT,GAGb,CACF,CAKUK,CAAoBxxJ,KAAMqE,GAClC,YAAUkC,IAANuoG,EAAwBA,EACxB9uG,KAAKmxJ,UAAY9sJ,EAAI5B,QACvB4B,EAAIsB,KAAK3F,KAAKqxJ,SAAUjmD,EAAG,EAAGprG,KAAKmxJ,UAC5BnxJ,KAAKqxJ,SAASrqJ,SAAShH,KAAKiF,SAAU,EAAGjF,KAAKoxJ,aAEvD/sJ,EAAIsB,KAAK3F,KAAKqxJ,SAAUjmD,EAAG,EAAG/mG,EAAI5B,aAClCzC,KAAKmxJ,UAAY9sJ,EAAI5B,QACvB,CA0BA,SAASkuJ,UAAUtsJ,EAAKtC,GACtB,IAAKsC,EAAI5B,OAASV,GAAK,GAAM,EAAG,CAC9B,IAAI+sG,EAAIzqG,EAAI2C,SAAS,UAAWjF,GAChC,GAAI+sG,EAAG,CACL,IAAI9kG,EAAI8kG,EAAExsG,WAAWwsG,EAAErsG,OAAS,GAChC,GAAIuH,GAAK,OAAUA,GAAK,MAKtB,OAJAhK,KAAKmxJ,SAAW,EAChBnxJ,KAAKoxJ,UAAY,EACjBpxJ,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,GACpCzC,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,GAC7BqsG,EAAEzpG,MAAM,GAAI,EAEvB,CACA,OAAOypG,CACT,CAIA,OAHA9uG,KAAKmxJ,SAAW,EAChBnxJ,KAAKoxJ,UAAY,EACjBpxJ,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,GAC7B4B,EAAI2C,SAAS,UAAWjF,EAAGsC,EAAI5B,OAAS,EACjD,CAIA,SAASmuJ,SAASvsJ,GAChB,IAAIyqG,EAAIzqG,GAAOA,EAAI5B,OAASzC,KAAKoF,MAAMf,GAAO,GAC9C,GAAIrE,KAAKmxJ,SAAU,CACjB,IAAI5tJ,EAAMvD,KAAKoxJ,UAAYpxJ,KAAKmxJ,SAChC,OAAOriD,EAAI9uG,KAAKqxJ,SAASrqJ,SAAS,UAAW,EAAGzD,EAClD,CACA,OAAOurG,CACT,CAEA,SAASiiD,WAAW1sJ,EAAKtC,GACvB,IAAIgG,GAAK1D,EAAI5B,OAASV,GAAK,EAC3B,OAAU,IAANgG,EAAgB1D,EAAI2C,SAAS,SAAUjF,IAC3C/B,KAAKmxJ,SAAW,EAAIppJ,EACpB/H,KAAKoxJ,UAAY,EACP,IAANrpJ,EACF/H,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,IAEpCzC,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,GACpCzC,KAAKqxJ,SAAS,GAAKhtJ,EAAIA,EAAI5B,OAAS,IAE/B4B,EAAI2C,SAAS,SAAUjF,EAAGsC,EAAI5B,OAASsF,GAChD,CAEA,SAASipJ,UAAU3sJ,GACjB,IAAIyqG,EAAIzqG,GAAOA,EAAI5B,OAASzC,KAAKoF,MAAMf,GAAO,GAC9C,OAAIrE,KAAKmxJ,SAAiBriD,EAAI9uG,KAAKqxJ,SAASrqJ,SAAS,SAAU,EAAG,EAAIhH,KAAKmxJ,UACpEriD,CACT,CAGA,SAASmiD,YAAY5sJ,GACnB,OAAOA,EAAI2C,SAAShH,KAAKiF,SAC3B,CAEA,SAASisJ,UAAU7sJ,GACjB,OAAOA,GAAOA,EAAI5B,OAASzC,KAAKoF,MAAMf,GAAO,EAC/C,CA1NAzE,EAAQ,EAAgBswI,cA6BxBA,cAAc1rI,UAAUY,MAAQ,SAAUf,GACxC,GAAmB,IAAfA,EAAI5B,OAAc,MAAO,GAC7B,IAAIqsG,EACA/sG,EACJ,GAAI/B,KAAKmxJ,SAAU,CAEjB,QAAU5qJ,KADVuoG,EAAI9uG,KAAK6wJ,SAASxsJ,IACG,MAAO,GAC5BtC,EAAI/B,KAAKmxJ,SACTnxJ,KAAKmxJ,SAAW,CAClB,MACEpvJ,EAAI,EAEN,OAAIA,EAAIsC,EAAI5B,OAAeqsG,EAAIA,EAAI9uG,KAAKwY,KAAKnU,EAAKtC,GAAK/B,KAAKwY,KAAKnU,EAAKtC,GAC/D+sG,GAAK,EACd,EAEAohC,cAAc1rI,UAAUjB,IAwGxB,SAASkuJ,QAAQptJ,GACf,IAAIyqG,EAAIzqG,GAAOA,EAAI5B,OAASzC,KAAKoF,MAAMf,GAAO,GAC9C,OAAIrE,KAAKmxJ,SAAiBriD,EAAI,IACvBA,CACT,EAzGAohC,cAAc1rI,UAAUgU,KA0FxB,SAASk5I,SAASrtJ,EAAKtC,GACrB,IAAI4vJ,EArEN,SAASC,oBAAoBlsI,EAAMrhB,EAAKtC,GACtC,IAAI+G,EAAIzE,EAAI5B,OAAS,EACrB,GAAIqG,EAAI/G,EAAG,OAAO,EAClB,IAAIyyG,EAAK88C,cAAcjtJ,EAAIyE,IAC3B,GAAI0rG,GAAM,EAER,OADIA,EAAK,IAAG9uF,EAAKyrI,SAAW38C,EAAK,GAC1BA,EAET,KAAM1rG,EAAI/G,IAAa,IAARyyG,EAAW,OAAO,EAEjC,GADAA,EAAK88C,cAAcjtJ,EAAIyE,IACnB0rG,GAAM,EAER,OADIA,EAAK,IAAG9uF,EAAKyrI,SAAW38C,EAAK,GAC1BA,EAET,KAAM1rG,EAAI/G,IAAa,IAARyyG,EAAW,OAAO,EAEjC,GADAA,EAAK88C,cAAcjtJ,EAAIyE,IACnB0rG,GAAM,EAIR,OAHIA,EAAK,IACI,IAAPA,EAAUA,EAAK,EAAO9uF,EAAKyrI,SAAW38C,EAAK,GAE1CA,EAET,OAAO,CACT,CA8Cco9C,CAAoB5xJ,KAAMqE,EAAKtC,GAC3C,IAAK/B,KAAKmxJ,SAAU,OAAO9sJ,EAAI2C,SAAS,OAAQjF,GAChD/B,KAAKoxJ,UAAYO,EACjB,IAAIpuJ,EAAMc,EAAI5B,QAAUkvJ,EAAQ3xJ,KAAKmxJ,UAErC,OADA9sJ,EAAIsB,KAAK3F,KAAKqxJ,SAAU,EAAG9tJ,GACpBc,EAAI2C,SAAS,OAAQjF,EAAGwB,EACjC,EA9FA2sI,cAAc1rI,UAAUqsJ,SAAW,SAAUxsJ,GAC3C,GAAIrE,KAAKmxJ,UAAY9sJ,EAAI5B,OAEvB,OADA4B,EAAIsB,KAAK3F,KAAKqxJ,SAAUrxJ,KAAKoxJ,UAAYpxJ,KAAKmxJ,SAAU,EAAGnxJ,KAAKmxJ,UACzDnxJ,KAAKqxJ,SAASrqJ,SAAShH,KAAKiF,SAAU,EAAGjF,KAAKoxJ,WAEvD/sJ,EAAIsB,KAAK3F,KAAKqxJ,SAAUrxJ,KAAKoxJ,UAAYpxJ,KAAKmxJ,SAAU,EAAG9sJ,EAAI5B,QAC/DzC,KAAKmxJ,UAAY9sJ,EAAI5B,MACvB,aCtIA5C,EAAOD,QAAU,WACf,IAAI+Y,EAAYG,SAASE,eACzB,IAAKL,EAAUysH,WACb,OAAO,WAAa,EAKtB,IAHA,IAAIysB,EAAS/4I,SAASi6F,cAElBjsE,EAAS,GACJ/kC,EAAI,EAAGA,EAAI4W,EAAUysH,WAAYrjI,IACxC+kC,EAAOhkC,KAAK6V,EAAUm5I,WAAW/vJ,IAGnC,OAAQ8vJ,EAAOxwH,QAAQ4L,eACrB,IAAK,QACL,IAAK,WACH4kH,EAAOE,OACP,MAEF,QACEF,EAAS,KAKb,OADAl5I,EAAUwC,kBACH,WACc,UAAnBxC,EAAUlS,MACVkS,EAAUwC,kBAELxC,EAAUysH,YACbt+F,EAAO5a,SAAQ,SAAStY,GACtB+E,EAAUgC,SAAS/G,EACrB,IAGFi+I,GACAA,EAAOjxB,OACT,CACF,0BCnCA,SAASoxB,IAAI5rJ,GAAO,OAAO9B,OAAOE,UAAUwC,SAASqB,KAAKjC,EAAM,CAShE,IAAIM,EAAUvD,MAAMuD,SAAW,SAASA,QAAQi3F,GAC/C,MAA8C,mBAAvCr5F,OAAOE,UAAUwC,SAASqB,KAAKs1F,EACvC,EAGA,SAASzxE,QAAQyxE,EAAI1oF,GACpB,GAAI0oF,EAAGzxE,QAAW,OAAOyxE,EAAGzxE,QAAQjX,GACpC,IAAK,IAAIlT,EAAI,EAAGA,EAAI47F,EAAGl7F,OAAQV,IAC9BkT,EAAG0oF,EAAG57F,GAAIA,EAAG47F,EAGf,CAGA,IAAIjyE,EAAapnB,OAAOyZ,MAAQ,SAASA,KAAK3X,GAC7C,IAAIiE,EAAM,GACV,IAAK,IAAIoM,KAAOrQ,EAAOiE,EAAIvH,KAAK2T,GAChC,OAAOpM,CACR,EAGI+L,EAAiB9R,OAAOE,UAAU4R,gBAAkB,SAAUhQ,EAAKqQ,GACtE,OAAOA,KAAOrQ,CACf,EAEA,SAAST,KAAKiP,GACb,GAAmB,iBAARA,GAA4B,OAARA,EAAc,CAC5C,IAAIC,EAEJ,GAAInO,EAAQkO,GACXC,EAAM,QACA,GAvCT,SAAS+C,OAAOxR,GAAO,MAAoB,kBAAb4rJ,IAAI5rJ,EAA0B,CAuC/CwR,CAAOhD,GACjBC,EAAM,IAAIiD,KAAKlD,EAAIqgB,QAAUrgB,EAAIqgB,UAAYrgB,QACvC,GAxCT,SAAS2nF,SAASn2F,GAAO,MAAoB,oBAAb4rJ,IAAI5rJ,EAA4B,CAwCnDm2F,CAAS3nF,GACnBC,EAAM,IAAIkgB,OAAOngB,QACX,GAzCT,SAASu5E,QAAQ/nF,GAAO,MAAoB,mBAAb4rJ,IAAI5rJ,EAA2B,CAyCjD+nF,CAAQv5E,GAClBC,EAAM,CAAEnB,QAASkB,EAAIlB,cACf,GA1CT,SAASg9E,UAAUtqF,GAAO,MAAoB,qBAAb4rJ,IAAI5rJ,EAA6B,CA0CrDsqF,CAAU97E,IAzCvB,SAASm8E,SAAS3qF,GAAO,MAAoB,oBAAb4rJ,IAAI5rJ,EAA4B,CAyCjC2qF,CAASn8E,IAxCxC,SAASs8E,SAAS9qF,GAAO,MAAoB,oBAAb4rJ,IAAI5rJ,EAA4B,CAwChB8qF,CAASt8E,GACtDC,EAAMvQ,OAAOsQ,QACP,GAAItQ,OAAO6kB,QAAU7kB,OAAO8Z,eAClCvJ,EAAMvQ,OAAO6kB,OAAO7kB,OAAO8Z,eAAexJ,SACpC,GAAIA,EAAIxB,cAAgB9O,OAC9BuQ,EAAM,CAAC,MACD,CACN,IAAIzJ,EAASwJ,EAAIxB,aAAewB,EAAIxB,YAAY5O,WAChCoQ,EAAI0a,WACJ,CAAC,EACblD,EAAI,SAASA,IAAK,EACtBA,EAAE5nB,UAAY4G,EACdyJ,EAAM,IAAIuX,CACX,CAKA,OAHAF,QAAQR,EAAW9W,IAAM,SAAU6B,GAClC5B,EAAI4B,GAAO7B,EAAI6B,EAChB,IACO5B,CACR,CACA,OAAOD,CACR,CAEA,SAASg+B,KAAKlzC,EAAMghD,EAAIgtC,GACvB,IAAIh2E,EAAO,GACPo/E,EAAU,GACVm7D,GAAQ,EAEZ,OAAQ,SAASC,OAAOC,GACvB,IAAIzwH,EAAOgsD,EAAY/nF,KAAKwsJ,GAASA,EACjCC,EAAY,CAAC,EAEbC,GAAY,EAEZ3rI,EAAQ,CACXgb,KAAMA,EACNywH,MAAOA,EACPz6I,KAAM,GAAGtL,OAAOsL,GAChB2D,OAAQy7E,EAAQA,EAAQr0F,OAAS,GACjCq0F,QAASA,EACTrgF,IAAKiB,EAAKA,EAAKjV,OAAS,GACxB6vJ,OAAwB,IAAhB56I,EAAKjV,OACbw8D,MAAOvnD,EAAKjV,OACZ8vJ,SAAU,KACV76F,OAAQ,SAAUxrD,EAAGsmJ,GACf9rI,EAAM4rI,SACV5rI,EAAMrL,OAAOqmB,KAAKhb,EAAMjQ,KAAOvK,GAEhCwa,EAAMgb,KAAOx1B,EACTsmJ,IAAYH,GAAY,EAC7B,EACAvgH,OAAQ,SAAU0gH,UACV9rI,EAAMrL,OAAOqmB,KAAKhb,EAAMjQ,KAC3B+7I,IAAYH,GAAY,EAC7B,EACAzwH,OAAQ,SAAU4wH,GACb9rJ,EAAQggB,EAAMrL,OAAOqmB,MACxBhb,EAAMrL,OAAOqmB,KAAK4O,OAAO5pB,EAAMjQ,IAAK,UAE7BiQ,EAAMrL,OAAOqmB,KAAKhb,EAAMjQ,KAE5B+7I,IAAYH,GAAY,EAC7B,EACAt0I,KAAM,KACNy0E,OAAQ,SAAUx0E,GAAKo0I,EAAU5/D,OAASx0E,CAAG,EAC7CgpC,MAAO,SAAUhpC,GAAKo0I,EAAUprG,MAAQhpC,CAAG,EAC3Cy0I,IAAK,SAAUz0I,GAAKo0I,EAAUK,IAAMz0I,CAAG,EACvC00I,KAAM,SAAU10I,GAAKo0I,EAAUM,KAAO10I,CAAG,EACzC4K,KAAM,WAAcqpI,GAAQ,CAAO,EACnCnvG,MAAO,WAAcuvG,GAAY,CAAO,GAGzC,IAAKJ,EAAS,OAAOvrI,EAErB,SAASisI,cACR,GAA0B,iBAAfjsI,EAAMgb,MAAoC,OAAfhb,EAAMgb,KAAe,CACrDhb,EAAM3I,MAAQ2I,EAAMyrI,QAAUzrI,EAAMgb,OACxChb,EAAM3I,KAAO2N,EAAWhF,EAAMgb,OAG/Bhb,EAAMksI,OAA+B,IAAtBlsI,EAAM3I,KAAKtb,OAE1B,IAAK,IAAIV,EAAI,EAAGA,EAAI+0F,EAAQr0F,OAAQV,IACnC,GAAI+0F,EAAQ/0F,GAAGowJ,QAAUA,EAAO,CAC/BzrI,EAAM6rI,SAAWz7D,EAAQ/0F,GACzB,KACD,CAEF,MACC2kB,EAAMksI,QAAS,EACflsI,EAAM3I,KAAO,KAGd2I,EAAMmsI,SAAWnsI,EAAMksI,OACvBlsI,EAAMosI,SAAWpsI,EAAM4rI,MACxB,CAEAK,cAGA,IAAInlJ,GAAMkzC,EAAGr4C,KAAKqe,EAAOA,EAAMgb,MAK/B,YAJYn7B,IAARiH,IAAqBkZ,EAAMgxC,QAAUhxC,EAAMgxC,OAAOlqD,IAElD4kJ,EAAU5/D,QAAU4/D,EAAU5/D,OAAOnqF,KAAKqe,EAAOA,EAAMgb,MAEtD2wH,GAGkB,iBAAf3rI,EAAMgb,MACK,OAAfhb,EAAMgb,MACLhb,EAAM6rI,WAEVz7D,EAAQh0F,KAAK4jB,GAEbisI,cAEAzmI,QAAQxF,EAAM3I,MAAM,SAAUtH,EAAK1U,GAClC2V,EAAK5U,KAAK2T,GAEN27I,EAAUK,KAAOL,EAAUK,IAAIpqJ,KAAKqe,EAAOA,EAAMgb,KAAKjrB,GAAMA,GAEhE,IAAIg9B,EAAQy+G,OAAOxrI,EAAMgb,KAAKjrB,IAC1Bi3E,GAAat3E,EAAe/N,KAAKqe,EAAMgb,KAAMjrB,KAChDiQ,EAAMgb,KAAKjrB,GAAOg9B,EAAM/R,MAGzB+R,EAAMs/G,OAAShxJ,IAAM2kB,EAAM3I,KAAKtb,OAAS,EACzCgxC,EAAMg3B,QAAgB,IAAN1oE,EAEZqwJ,EAAUM,MAAQN,EAAUM,KAAKrqJ,KAAKqe,EAAO+sB,GAEjD/7B,EAAKqgB,KACN,IACA++D,EAAQ/+D,OAGLq6H,EAAUprG,OAASorG,EAAUprG,MAAM3+C,KAAKqe,EAAOA,EAAMgb,MAElDhb,GAjCkBA,CAkC1B,CA/GO,CA+GLhnB,GAAOgiC,IACV,CAEA,SAASsxH,SAAS5sJ,GACjBpG,KAAK8E,MAAQsB,CACd,CAwGA,SAAS6sJ,SAAS7sJ,GACjB,OAAO,IAAI4sJ,SAAS5sJ,EACrB,CAxGA4sJ,SAASxuJ,UAAUmH,IAAM,SAAUunJ,GAElC,IADA,IAAIxxH,EAAO1hC,KAAK8E,MACP/C,EAAI,EAAGA,EAAImxJ,EAAGzwJ,OAAQV,IAAK,CACnC,IAAI0U,EAAMy8I,EAAGnxJ,GACb,IAAK2/B,IAAStrB,EAAe/N,KAAKq5B,EAAMjrB,GACvC,OAEDirB,EAAOA,EAAKjrB,EACb,CACA,OAAOirB,CACR,EAEAsxH,SAASxuJ,UAAU2hB,IAAM,SAAU+sI,GAElC,IADA,IAAIxxH,EAAO1hC,KAAK8E,MACP/C,EAAI,EAAGA,EAAImxJ,EAAGzwJ,OAAQV,IAAK,CACnC,IAAI0U,EAAMy8I,EAAGnxJ,GACb,IAAK2/B,IAAStrB,EAAe/N,KAAKq5B,EAAMjrB,GACvC,OAAO,EAERirB,EAAOA,EAAKjrB,EACb,CACA,OAAO,CACR,EAEAu8I,SAASxuJ,UAAU+H,IAAM,SAAU2mJ,EAAIpuJ,GAEtC,IADA,IAAI48B,EAAO1hC,KAAK8E,MACP/C,EAAI,EAAGA,EAAImxJ,EAAGzwJ,OAAS,EAAGV,IAAK,CACvC,IAAI0U,EAAMy8I,EAAGnxJ,GACRqU,EAAe/N,KAAKq5B,EAAMjrB,KAAQirB,EAAKjrB,GAAO,CAAC,GACpDirB,EAAOA,EAAKjrB,EACb,CAEA,OADAirB,EAAKwxH,EAAGnxJ,IAAM+C,EACPA,CACR,EAEAkuJ,SAASxuJ,UAAU4xB,IAAM,SAAUsqB,GAClC,OAAO9N,KAAK5yC,KAAK8E,MAAO47C,GAAI,EAC7B,EAEAsyG,SAASxuJ,UAAU0nB,QAAU,SAAUw0B,GAEtC,OADA1gD,KAAK8E,MAAQ8tC,KAAK5yC,KAAK8E,MAAO47C,GAAI,GAC3B1gD,KAAK8E,KACb,EAEAkuJ,SAASxuJ,UAAU2yB,OAAS,SAAUupB,EAAI/tB,GACzC,IAAIguB,EAA4B,IAArBz5C,UAAUzE,OACjBmkG,EAAMjmD,EAAO3gD,KAAK8E,MAAQ6tB,EAM9B,OALA3yB,KAAKksB,SAAQ,SAAUhgB,GACjBlM,KAAKsyJ,QAAW3xG,IACpBimD,EAAMlmD,EAAGr4C,KAAKrI,KAAM4mG,EAAK16F,GAE3B,IACO06F,CACR,EAEAosD,SAASxuJ,UAAUgtF,MAAQ,WAC1B,IAAIoV,EAAM,GAIV,OAHA5mG,KAAKksB,SAAQ,WACZ06E,EAAI9jG,KAAK9C,KAAK0X,KACf,IACOkvF,CACR,EAEAosD,SAASxuJ,UAAUq1D,MAAQ,WAC1B,IAAI+sC,EAAM,GAIV,OAHA5mG,KAAKksB,SAAQ,WACZ06E,EAAI9jG,KAAK9C,KAAK0hC,KACf,IACOklE,CACR,EAEAosD,SAASxuJ,UAAU2wB,MAAQ,WAC1B,IAAI2hE,EAAU,GACVj9B,EAAQ,GAEZ,OAAQ,SAAS1kC,MAAMvgB,GACtB,IAAK,IAAI7S,EAAI,EAAGA,EAAI+0F,EAAQr0F,OAAQV,IACnC,GAAI+0F,EAAQ/0F,KAAO6S,EAClB,OAAOilD,EAAM93D,GAIf,GAAmB,iBAAR6S,GAA4B,OAARA,EAAc,CAC5C,IAAIC,EAAMlP,KAAKiP,GAWf,OATAkiF,EAAQh0F,KAAK8R,GACbilD,EAAM/2D,KAAK+R,GAEXqX,QAAQR,EAAW9W,IAAM,SAAU6B,GAClC5B,EAAI4B,GAAO0e,MAAMvgB,EAAI6B,GACtB,IAEAqgF,EAAQ/+D,MACR8hC,EAAM9hC,MACCljB,CACR,CAEA,OAAOD,CAER,CAxBO,CAwBL5U,KAAK8E,MACR,EAOAonB,QAAQR,EAAWsnI,SAASxuJ,YAAY,SAAUiS,GACjDw8I,SAASx8I,GAAO,SAAUrQ,GACzB,IAAI8d,EAAO,GAAG7e,MAAMgD,KAAKnB,UAAW,GAChCwlH,EAAI,IAAIsmC,SAAS5sJ,GACrB,OAAOsmH,EAAEj2G,GAAKzL,MAAM0hH,EAAGxoG,EACxB,CACD,IAEArkB,EAAOD,QAAUqzJ,uCCpTjB,IAAI9T,EAAW,EAAQ,OACnBgU,EAAK,EAAQ,OACbC,EAAsB,6EACtBC,EAAS,YACTC,EAAU,gCACVlU,EAAO,QACPmU,EAAa,mDACbC,EAAqB,aAUzB,SAASC,SAAS9yJ,GAChB,OAAQA,GAAY,IAAIqG,WAAWpG,QAAQwyJ,EAAqB,GAClE,CAcA,IAAI95G,EAAQ,CACV,CAAC,IAAK,QACN,CAAC,IAAK,SACN,SAASlU,SAASsuH,EAASlzJ,GACzB,OAAOk1B,UAAUl1B,EAAI6+I,UAAYqU,EAAQ9yJ,QAAQ,MAAO,KAAO8yJ,CACjE,EACA,CAAC,IAAK,YACN,CAAC,IAAK,OAAQ,GACd,CAACxnG,IAAK,YAAQ3lD,EAAW,EAAG,GAC5B,CAAC,UAAW,YAAQA,EAAW,GAC/B,CAAC2lD,IAAK,gBAAY3lD,EAAW,EAAG,IAW9BotJ,EAAS,CAAEj+F,KAAM,EAAG8xC,MAAO,GAc/B,SAASosD,UAAUC,GACjB,IAYIp9I,EALAiqF,GALkB,oBAAXtmF,OAAoCA,YACpB,IAAX,EAAAuL,EAAoC,EAAAA,EAC3B,oBAATD,KAAkCA,KACjC,CAAC,GAEOg7E,UAAY,CAAC,EAGlCozD,EAAmB,CAAC,EACpBrtJ,SAHJotJ,EAAMA,GAAOnzD,GAMb,GAAI,UAAYmzD,EAAIxU,SAClByU,EAAmB,IAAIC,IAAI9sD,SAAS4sD,EAAIG,UAAW,CAAC,QAC/C,GAAI,WAAavtJ,EAEtB,IAAKgQ,KADLq9I,EAAmB,IAAIC,IAAIF,EAAK,CAAC,GACrBF,SAAeG,EAAiBr9I,QACvC,GAAI,WAAahQ,EAAM,CAC5B,IAAKgQ,KAAOo9I,EACNp9I,KAAOk9I,IACXG,EAAiBr9I,GAAOo9I,EAAIp9I,SAGGlQ,IAA7ButJ,EAAiBR,UACnBQ,EAAiBR,QAAUA,EAAQhyJ,KAAKuyJ,EAAIrkF,MAEhD,CAEA,OAAOskF,CACT,CASA,SAASp+H,UAAUu+H,GACjB,MACa,UAAXA,GACW,SAAXA,GACW,UAAXA,GACW,WAAXA,GACW,QAAXA,GACW,SAAXA,CAEJ,CAkBA,SAASC,gBAAgBR,EAAShzD,GAEhCgzD,GADAA,EAAUD,SAASC,IACD9yJ,QAAQyyJ,EAAQ,IAClC3yD,EAAWA,GAAY,CAAC,EAExB,IAKI/zB,EALA9rE,EAAQ0yJ,EAAWjwI,KAAKowI,GACxBrU,EAAWx+I,EAAM,GAAKA,EAAM,GAAGyG,cAAgB,GAC/C6sJ,IAAmBtzJ,EAAM,GACzBuzJ,IAAiBvzJ,EAAM,GACvBwzJ,EAAe,EAkCnB,OA/BIF,EACEC,GACFznF,EAAO9rE,EAAM,GAAKA,EAAM,GAAKA,EAAM,GACnCwzJ,EAAexzJ,EAAM,GAAG4B,OAAS5B,EAAM,GAAG4B,SAE1CkqE,EAAO9rE,EAAM,GAAKA,EAAM,GACxBwzJ,EAAexzJ,EAAM,GAAG4B,QAGtB2xJ,GACFznF,EAAO9rE,EAAM,GAAKA,EAAM,GACxBwzJ,EAAexzJ,EAAM,GAAG4B,QAExBkqE,EAAO9rE,EAAM,GAIA,UAAbw+I,EACEgV,GAAgB,IAClB1nF,EAAOA,EAAKtnE,MAAM,IAEXqwB,UAAU2pH,GACnB1yE,EAAO9rE,EAAM,GACJw+I,EACL8U,IACFxnF,EAAOA,EAAKtnE,MAAM,IAEXgvJ,GAAgB,GAAK3+H,UAAUgrE,EAAS2+C,YACjD1yE,EAAO9rE,EAAM,IAGR,CACLw+I,SAAUA,EACViU,QAASa,GAAkBz+H,UAAU2pH,GACrCgV,aAAcA,EACd1nF,KAAMA,EAEV,CAoDA,SAASonF,IAAIL,EAAShzD,EAAU+G,GAI9B,GAFAisD,GADAA,EAAUD,SAASC,IACD9yJ,QAAQyyJ,EAAQ,MAE5BrzJ,gBAAgB+zJ,KACpB,OAAO,IAAIA,IAAIL,EAAShzD,EAAU+G,GAGpC,IAAI6sD,EAAUC,EAAW59I,EAAO69I,EAAa19I,EAAOL,GAChDg+I,GAAen7G,EAAMj0C,QACrBoB,UAAci6F,EACdlgG,GAAMR,KACN+B,GAAI,EA8CR,IAjCI,WAAa0E,IAAQ,WAAaA,KACpCghG,EAAS/G,EACTA,EAAW,MAGT+G,GAAU,mBAAsBA,IAAQA,EAAS0rD,EAAGx8I,OAQxD29I,IADAC,EAAYL,gBAAgBR,GAAW,GALvChzD,EAAWkzD,UAAUlzD,KAMC2+C,WAAakV,EAAUjB,QAC7C9yJ,GAAI8yJ,QAAUiB,EAAUjB,SAAWgB,GAAY5zD,EAAS4yD,QACxD9yJ,GAAI6+I,SAAWkV,EAAUlV,UAAY3+C,EAAS2+C,UAAY,GAC1DqU,EAAUa,EAAU5nF,MAOK,UAAvB4nF,EAAUlV,WACmB,IAA3BkV,EAAUF,cAAsBb,EAAmBlyJ,KAAKoyJ,MACxDa,EAAUjB,UACTiB,EAAUlV,UACTkV,EAAUF,aAAe,IACxB3+H,UAAUl1B,GAAI6+I,cAEnBoV,GAAa,GAAK,CAAC,OAAQ,aAGtB1yJ,GAAI0yJ,GAAahyJ,OAAQV,KAGH,mBAF3ByyJ,EAAcC,GAAa1yJ,MAO3B4U,EAAQ69I,EAAY,GACpB/9I,GAAM+9I,EAAY,GAEd79I,GAAUA,EACZnW,GAAIiW,IAAOi9I,EACF,iBAAoB/8I,IAC7BG,EAAkB,MAAVH,EACJ+8I,EAAQprJ,YAAYqO,GACpB+8I,EAAQvyJ,QAAQwV,MAGd,iBAAoB69I,EAAY,IAClCh0J,GAAIiW,IAAOi9I,EAAQruJ,MAAM,EAAGyR,GAC5B48I,EAAUA,EAAQruJ,MAAMyR,EAAQ09I,EAAY,MAE5Ch0J,GAAIiW,IAAOi9I,EAAQruJ,MAAMyR,GACzB48I,EAAUA,EAAQruJ,MAAM,EAAGyR,MAGrBA,EAAQH,EAAM2M,KAAKowI,MAC7BlzJ,GAAIiW,IAAOK,EAAM,GACjB48I,EAAUA,EAAQruJ,MAAM,EAAGyR,EAAMA,QAGnCtW,GAAIiW,IAAOjW,GAAIiW,KACb69I,GAAYE,EAAY,IAAK9zD,EAASjqF,KAAa,GAOjD+9I,EAAY,KAAIh0J,GAAIiW,IAAOjW,GAAIiW,IAAKnP,gBApCtCosJ,EAAUc,EAAYd,EAASlzJ,IA4C/BinG,IAAQjnG,GAAIgnG,MAAQC,EAAOjnG,GAAIgnG,QAM/B8sD,GACC5zD,EAAS4yD,SACkB,MAA3B9yJ,GAAIwzJ,SAAS3jI,OAAO,KACF,KAAjB7vB,GAAIwzJ,UAAyC,KAAtBtzD,EAASszD,YAEpCxzJ,GAAIwzJ,SA/JR,SAAS9rH,QAAQosH,EAAU3gE,GACzB,GAAiB,KAAb2gE,EAAiB,OAAO3gE,EAQ5B,IANA,IAAIj8E,GAAQi8E,GAAQ,KAAKh/E,MAAM,KAAKtP,MAAM,GAAI,GAAG+G,OAAOkoJ,EAAS3/I,MAAM,MACnE5S,EAAI2V,EAAKjV,OACTmN,EAAO8H,EAAK3V,EAAI,GAChB0nC,GAAU,EACVirH,EAAK,EAEF3yJ,KACW,MAAZ2V,EAAK3V,GACP2V,EAAK44B,OAAOvuC,EAAG,GACM,OAAZ2V,EAAK3V,IACd2V,EAAK44B,OAAOvuC,EAAG,GACf2yJ,KACSA,IACC,IAAN3yJ,IAAS0nC,GAAU,GACvB/xB,EAAK44B,OAAOvuC,EAAG,GACf2yJ,KAOJ,OAHIjrH,GAAS/xB,EAAK+xB,QAAQ,IACb,MAAT75B,GAAyB,OAATA,GAAe8H,EAAK5U,KAAK,IAEtC4U,EAAKzU,KAAK,IACnB,CAqImBilC,CAAQ1nC,GAAIwzJ,SAAUtzD,EAASszD,WAOjB,MAA3BxzJ,GAAIwzJ,SAAS3jI,OAAO,IAAcqF,UAAUl1B,GAAI6+I,YAClD7+I,GAAIwzJ,SAAW,IAAMxzJ,GAAIwzJ,UAQtB7U,EAAS3+I,GAAI4+I,KAAM5+I,GAAI6+I,YAC1B7+I,GAAIm0J,KAAOn0J,GAAIo0J,SACfp0J,GAAI4+I,KAAO,IAMb5+I,GAAIq0J,SAAWr0J,GAAI6nH,SAAW,GAE1B7nH,GAAIs0J,SACNh+I,EAAQtW,GAAIs0J,KAAK3zJ,QAAQ,OAGvBX,GAAIq0J,SAAWr0J,GAAIs0J,KAAKzvJ,MAAM,EAAGyR,GACjCtW,GAAIq0J,SAAWx8I,mBAAmBD,mBAAmB5X,GAAIq0J,WAEzDr0J,GAAI6nH,SAAW7nH,GAAIs0J,KAAKzvJ,MAAMyR,EAAQ,GACtCtW,GAAI6nH,SAAWhwG,mBAAmBD,mBAAmB5X,GAAI6nH,YAEzD7nH,GAAIq0J,SAAWx8I,mBAAmBD,mBAAmB5X,GAAIs0J,OAG3Dt0J,GAAIs0J,KAAOt0J,GAAI6nH,SAAW7nH,GAAIq0J,SAAU,IAAKr0J,GAAI6nH,SAAW7nH,GAAIq0J,UAGlEr0J,GAAIwgD,OAA0B,UAAjBxgD,GAAI6+I,UAAwB3pH,UAAUl1B,GAAI6+I,WAAa7+I,GAAIm0J,KACpEn0J,GAAI6+I,SAAU,KAAM7+I,GAAIm0J,KACxB,OAKJn0J,GAAIgvE,KAAOhvE,GAAIwG,UACjB,CA2KA+sJ,IAAIvvJ,UAAY,CAAE+H,IA5JlB,SAASA,IAAI+kC,EAAMxsC,EAAOmQ,GACxB,IAAIzU,EAAMR,KAEV,OAAQsxC,GACN,IAAK,QACC,iBAAoBxsC,GAASA,EAAMrC,SACrCqC,GAASmQ,GAAMk+I,EAAGx8I,OAAO7R,IAG3BtE,EAAI8wC,GAAQxsC,EACZ,MAEF,IAAK,OACHtE,EAAI8wC,GAAQxsC,EAEPq6I,EAASr6I,EAAOtE,EAAI6+I,UAGdv6I,IACTtE,EAAIm0J,KAAOn0J,EAAIo0J,SAAU,IAAK9vJ,IAH9BtE,EAAIm0J,KAAOn0J,EAAIo0J,SACfp0J,EAAI8wC,GAAQ,IAKd,MAEF,IAAK,WACH9wC,EAAI8wC,GAAQxsC,EAERtE,EAAI4+I,OAAMt6I,GAAS,IAAKtE,EAAI4+I,MAChC5+I,EAAIm0J,KAAO7vJ,EACX,MAEF,IAAK,OACHtE,EAAI8wC,GAAQxsC,EAERs6I,EAAK99I,KAAKwD,IACZA,EAAQA,EAAM6P,MAAM,KACpBnU,EAAI4+I,KAAOt6I,EAAMizB,MACjBv3B,EAAIo0J,SAAW9vJ,EAAM7B,KAAK,OAE1BzC,EAAIo0J,SAAW9vJ,EACftE,EAAI4+I,KAAO,IAGb,MAEF,IAAK,WACH5+I,EAAI6+I,SAAWv6I,EAAMwC,cACrB9G,EAAI8yJ,SAAWr+I,EACf,MAEF,IAAK,WACL,IAAK,OACH,GAAInQ,EAAO,CACT,IAAIuoH,EAAgB,aAAT/7E,EAAsB,IAAM,IACvC9wC,EAAI8wC,GAAQxsC,EAAMurB,OAAO,KAAOg9F,EAAOA,EAAOvoH,EAAQA,CACxD,MACEtE,EAAI8wC,GAAQxsC,EAEd,MAEF,IAAK,WACL,IAAK,WACHtE,EAAI8wC,GAAQj5B,mBAAmBvT,GAC/B,MAEF,IAAK,OACH,IAAIgS,EAAQhS,EAAM3D,QAAQ,MAErB2V,GACHtW,EAAIq0J,SAAW/vJ,EAAMO,MAAM,EAAGyR,GAC9BtW,EAAIq0J,SAAWx8I,mBAAmBD,mBAAmB5X,EAAIq0J,WAEzDr0J,EAAI6nH,SAAWvjH,EAAMO,MAAMyR,EAAQ,GACnCtW,EAAI6nH,SAAWhwG,mBAAmBD,mBAAmB5X,EAAI6nH,YAEzD7nH,EAAIq0J,SAAWx8I,mBAAmBD,mBAAmBtT,IAI3D,IAAK,IAAI/C,EAAI,EAAGA,EAAIu3C,EAAM72C,OAAQV,IAAK,CACrC,IAAIgzJ,EAAMz7G,EAAMv3C,GAEZgzJ,EAAI,KAAIv0J,EAAIu0J,EAAI,IAAMv0J,EAAIu0J,EAAI,IAAIztJ,cACxC,CAUA,OARA9G,EAAIs0J,KAAOt0J,EAAI6nH,SAAW7nH,EAAIq0J,SAAU,IAAKr0J,EAAI6nH,SAAW7nH,EAAIq0J,SAEhEr0J,EAAIwgD,OAA0B,UAAjBxgD,EAAI6+I,UAAwB3pH,UAAUl1B,EAAI6+I,WAAa7+I,EAAIm0J,KACpEn0J,EAAI6+I,SAAU,KAAM7+I,EAAIm0J,KACxB,OAEJn0J,EAAIgvE,KAAOhvE,EAAIwG,WAERxG,CACT,EA8D4BwG,SArD5B,SAASA,SAASgmC,GACXA,GAAa,mBAAsBA,IAAWA,EAAYmmH,EAAGnmH,WAElE,IAAIw6D,EACAhnG,EAAMR,KACN20J,EAAOn0J,EAAIm0J,KACXtV,EAAW7+I,EAAI6+I,SAEfA,GAAqD,MAAzCA,EAAShvH,OAAOgvH,EAAS58I,OAAS,KAAY48I,GAAY,KAE1E,IAAI9hI,EACF8hI,GACE7+I,EAAI6+I,UAAY7+I,EAAI8yJ,SAAY59H,UAAUl1B,EAAI6+I,UAAY,KAAO,IAsCrE,OApCI7+I,EAAIq0J,UACNt3I,GAAU/c,EAAIq0J,SACVr0J,EAAI6nH,WAAU9qG,GAAU,IAAK/c,EAAI6nH,UACrC9qG,GAAU,KACD/c,EAAI6nH,UACb9qG,GAAU,IAAK/c,EAAI6nH,SACnB9qG,GAAU,KAEO,UAAjB/c,EAAI6+I,UACJ3pH,UAAUl1B,EAAI6+I,YACbsV,GACgB,MAAjBn0J,EAAIwzJ,WAMJz2I,GAAU,MAQkB,MAA1Bo3I,EAAKA,EAAKlyJ,OAAS,IAAe28I,EAAK99I,KAAKd,EAAIo0J,YAAcp0J,EAAI4+I,QACpEuV,GAAQ,KAGVp3I,GAAUo3I,EAAOn0J,EAAIwzJ,UAErBxsD,EAAQ,iBAAoBhnG,EAAIgnG,MAAQx6D,EAAUxsC,EAAIgnG,OAAShnG,EAAIgnG,SACxDjqF,GAAU,MAAQiqF,EAAMn3E,OAAO,GAAK,IAAKm3E,EAAQA,GAExDhnG,EAAIk1D,OAAMn4C,GAAU/c,EAAIk1D,MAErBn4C,CACT,GAQAw2I,IAAIG,gBAAkBA,gBACtBH,IAAIrzD,SAAWkzD,UACfG,IAAIN,SAAWA,SACfM,IAAIZ,GAAKA,EAETtzJ,EAAOD,QAAUm0J,kCCnkBJ,IAAIzoJ,EAAE,EAAQ,OAAwE,IAAI2kD,EAAE,mBAAoB3rD,OAAOuvD,GAAGvvD,OAAOuvD,GAA1G,SAAS+B,EAAE3pD,EAAE/F,GAAG,OAAO+F,IAAI/F,IAAI,IAAI+F,GAAG,EAAEA,GAAI,EAAE/F,IAAI+F,GAAIA,GAAG/F,GAAIA,CAAC,EAAiD+yB,EAAE3tB,EAAE2uH,SAASjyH,EAAEsD,EAAE8uH,UAAUryH,EAAEuD,EAAEuwH,gBAAgBzwB,EAAE9/F,EAAE2wH,cACtM,SAASntB,EAAE7iG,GAAG,IAAI/F,EAAE+F,EAAEiuH,YAAYjuH,EAAEA,EAAEnH,MAAM,IAAI,IAAImnD,EAAE/lD,IAAI,OAAO+pD,EAAEhkD,EAAEggD,EAAE,CAAC,MAAMjuC,GAAG,OAAM,CAAE,CAAC,CAA4B,IAAIwuG,EAAE,oBAAqBpyG,aAAQ,IAAqBA,OAAOtB,eAAU,IAAqBsB,OAAOtB,SAASG,cAAzI,SAASyzG,EAAEzgH,EAAE/F,GAAG,OAAOA,GAAG,EAD+F,SAASumH,EAAExgH,EAAE/F,GAAG,IAAI+lD,EAAE/lD,IAAI8X,EAAEib,EAAE,CAAC+7H,KAAK,CAAClwJ,MAAMmnD,EAAEiuE,YAAYh0H,KAAK8D,EAAEgU,EAAE,GAAGg3I,KAAKrvI,EAAE3H,EAAE,GAAwJ,OAArJjW,GAAE,WAAWiC,EAAElF,MAAMmnD,EAAEjiD,EAAEkwH,YAAYh0H,EAAE4oG,EAAE9kG,IAAI2b,EAAE,CAACqvI,KAAKhrJ,GAAG,GAAE,CAACiC,EAAEggD,EAAE/lD,IAAI8B,GAAE,WAA6B,OAAlB8mG,EAAE9kG,IAAI2b,EAAE,CAACqvI,KAAKhrJ,IAAWiC,GAAE,WAAW6iG,EAAE9kG,IAAI2b,EAAE,CAACqvI,KAAKhrJ,GAAG,GAAE,GAAE,CAACiC,IAAIm/F,EAAEn/C,GAAUA,CAAC,EAC5MrsD,EAAQq1J,0BAAqB,IAAS3pJ,EAAE2pJ,qBAAqB3pJ,EAAE2pJ,qBAAqBzoC,gCCD7T,IAAI52D,EAAE,EAAQ,OAAS7tD,EAAE,EAAQ,OAA+F,IAAI0kH,EAAE,mBAAoBnoH,OAAOuvD,GAAGvvD,OAAOuvD,GAA1G,SAASu3C,EAAEn/F,EAAE/F,GAAG,OAAO+F,IAAI/F,IAAI,IAAI+F,GAAG,EAAEA,GAAI,EAAE/F,IAAI+F,GAAIA,GAAG/F,GAAIA,CAAC,EAAiD4oG,EAAE/mG,EAAEktJ,qBAAqBvoC,EAAE92D,EAAEomE,OAAOxP,EAAE52D,EAAEwkE,UAAUlqE,EAAE0F,EAAEkmE,QAAQnyF,EAAEisB,EAAEqmE,cAC/Pr8H,EAAQs1J,iCAAiC,SAASjpJ,EAAE/F,EAAEoF,EAAE2tB,EAAEtT,GAAG,IAAI3b,EAAE0iH,EAAE,MAAM,GAAG,OAAO1iH,EAAE0kB,QAAQ,CAAC,IAAI1Q,EAAE,CAACm3I,UAAS,EAAGrwJ,MAAM,MAAMkF,EAAE0kB,QAAQ1Q,CAAC,MAAMA,EAAEhU,EAAE0kB,QAAQ1kB,EAAEkmD,GAAE,WAAW,SAASjkD,EAAEA,GAAG,IAAIjC,EAAE,CAAiB,GAAhBA,GAAE,EAAGiiD,EAAEhgD,EAAEA,EAAEgtB,EAAEhtB,QAAM,IAAS0Z,GAAG3H,EAAEm3I,SAAS,CAAC,IAAIjvJ,EAAE8X,EAAElZ,MAAM,GAAG6gB,EAAEzf,EAAE+F,GAAG,OAAOgkD,EAAE/pD,CAAC,CAAC,OAAO+pD,EAAEhkD,CAAC,CAAK,GAAJ/F,EAAE+pD,EAAKw8D,EAAExgE,EAAEhgD,GAAG,OAAO/F,EAAE,IAAIoF,EAAE2tB,EAAEhtB,GAAG,YAAG,IAAS0Z,GAAGA,EAAEzf,EAAEoF,GAAUpF,GAAE+lD,EAAEhgD,EAASgkD,EAAE3kD,EAAC,CAAC,IAAS2gD,EAAEgE,EAAPjmD,GAAE,EAAOhC,OAAE,IAASsD,EAAE,KAAKA,EAAE,MAAM,CAAC,WAAW,OAAOW,EAAE/F,IAAI,EAAE,OAAO8B,OAAE,EAAO,WAAW,OAAOiE,EAAEjE,IAAI,EAAE,GAAE,CAAC9B,EAAEoF,EAAE2tB,EAAEtT,IAAI,IAAIsmC,GAAE6iD,EAAE7iG,EAAEjC,EAAE,GAAGA,EAAE,IACnc,OAAhDwiH,GAAE,WAAWxuG,EAAEm3I,UAAS,EAAGn3I,EAAElZ,MAAMmnD,EAAC,GAAE,CAACA,KAAItiB,EAAEsiB,IAAUA,EAAC,gCCRtDpsD,EAAOD,QAAU,EAAjB,qCCAAC,EAAOD,QAAU,EAAjB,wBCqDF,SAAS2tF,OAAQ/5E,GAEf,IACE,IAAK,EAAAmS,EAAOyvI,aAAc,OAAO,CACnC,CAAE,MAAO1+H,GACP,OAAO,CACT,CACA,IAAIxuB,EAAM,EAAAyd,EAAOyvI,aAAa5hJ,GAC9B,OAAI,MAAQtL,GACyB,SAA9BnH,OAAOmH,GAAKZ,aACrB,CA7DAzH,EAAOD,QAoBP,SAASy3I,UAAWpiI,EAAId,GACtB,GAAIo5E,OAAO,iBACT,OAAOt4E,EAGT,IAAIy0B,GAAS,EAeb,OAdA,SAASkU,aACP,IAAKlU,EAAQ,CACX,GAAI6jD,OAAO,oBACT,MAAM,IAAIlqF,MAAM8Q,GACPo5E,OAAO,oBAChBhiF,QAAQ8pJ,MAAMlhJ,GAEd5I,QAAQ4O,KAAKhG,GAEfu1B,GAAS,CACX,CACA,OAAOz0B,EAAGjK,MAAMhL,KAAMkH,UACxB,CAGF,+BC5CA,IAAI49F,EAAS,EAAQ,OAWjBwwD,EAAe,SAASA,aAAa30J,GACvC,MAAQ,aAAaW,KAAKX,EAE5B,EACI40J,EAAmB,SAASA,iBAAiB50J,GAC/C,MAAQ,YAAYW,KAAKX,EAE3B,EACI60J,EAAe,SAASA,aAAa70J,GACvC,OAbU,SAAS80J,MAAM90J,GACzB,MAAQ,WAAWW,KAAKX,EAE1B,CAUS80J,CAAM90J,KAAS20J,EAAa30J,KAAS40J,EAAiB50J,EAC/D,EA8DA,SAAS+0J,QAAQ/0J,GACf,OAAI20J,EAAa30J,GACR,aAGL60J,EAAa70J,GACR,aAGL40J,EAAiB50J,GACZ,iBAGF,MACT,CA1EAd,EAAOD,QAAU,SAAUo6B,GACzB,IAAIuzD,EAASrmF,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC9EyuJ,EAAWpoE,EAAOooE,SAClBC,EAAsBroE,EAAOqoE,oBAE7BzwF,EAAQ,EACR0wF,EAAkB,GACtBF,EAAWA,GAAY,OAEvB,IAAIG,EAuCN,SAASC,MAAMC,GAEb,OAvEgB,SAASC,YAAYt1J,GACrC,OAAOA,EAAIgU,MAAM,iBAAiB6hB,QAAO,SAAU0/H,GACjD,MAAuB,KAAhBA,EAAKj1J,MACd,GACF,CAkEeg1J,CAAYD,GACX5/H,KAAI,SAAUtxB,GAC1B,MAAO,CACLA,MAAOA,EACP2B,KAAMivJ,QAAQ5wJ,GAElB,GACF,CA/CkBixJ,CAAM/7H,GAAK5D,KAAI,SAAUC,EAASt0B,EAAGC,GACnD,IAAI8C,EAAQuxB,EAAQvxB,MAChB2B,EAAO4vB,EAAQ5vB,KAEN,eAATA,GACF0+D,IAGF,IAAIgxF,EAAcrxD,EAAO6wD,EAAUxwF,GAC/B+wF,EAAOC,EAAcrxJ,EAMzB,GAJa,eAAT2B,GACF0+D,IAGEywF,EAAqB,CAEvB,IAAIQ,EAAYp0J,EAAID,EAAI,GACpBs0J,GAAYr0J,EAAID,EAAI,GAEX,eAAT0E,GAA4C,SAAnB2vJ,EAAU3vJ,MAAsC,eAAnB4vJ,GAAU5vJ,OAElEyvJ,EAAO,GAAKC,EAAcE,GAAUvxJ,MAAQsxJ,EAAUtxJ,MAAQA,EAC9D+wJ,EAAgB/yJ,KAAKf,EAAI,EAAGA,EAAI,GAEpC,CAEA,OAAOm0J,CACT,IAMA,OAJAL,EAAgB3pI,SAAQ,SAAUqwC,GAChC,OAAOu5F,EAAUv5F,GAAO,IAC1B,IAEOu5F,EAAUt/H,QAAO,SAAUtuB,GAChC,QAASA,CACX,IAAGjF,KAAK,KACV,aCtEA,IAAIqzJ,EAAoB,CACpB,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QAWTz2J,EAAOD,QARP,SAAS22J,aAAavxJ,GAClB,OAAOA,GAAUA,EAAOpE,QAClBoE,EAAOpE,QAAQ,cAAc,SAASD,EAAKy0B,GACzC,OAAOkhI,EAAkBlhI,EAC3B,IACApwB,CACV,kCCfIuxJ,EAAe,EAAQ,OACvBzmB,EAAS,gBAkIb,SAAS5nG,QAAQvhC,EAAMg2F,EAAQ65D,GAE3B,IACIhjJ,EADAijJ,EANR,SAASC,cAAcC,EAAW/sH,GAC9B,OAAQ,IAAIzmC,MAAMymC,GAAS,GAAG3mC,KAAK0zJ,GAAa,GACpD,CAIwBD,CAAc/5D,EADlC65D,EAAeA,GAAgB,GAG3BzrI,EAASpkB,EAGb,GAAoB,iBAATA,KAGPokB,EAASpkB,EADT6M,EADWlP,OAAOyZ,KAAKpX,GACX,MAGEokB,EAAO6rI,OAMjB,OALA7rI,EAAO6rI,MAAMpjJ,KAAOA,EACpBuX,EAAO6rI,MAAMC,OAASL,EACtBzrI,EAAO6rI,MAAMj6D,OAASA,EACtB5xE,EAAO6rI,MAAME,QAAUL,EACvB1rI,EAAO6rI,MAAMG,UAAYhsI,EAClBA,EAAO6rI,MAItB,IAGII,EAHA1zH,EAAa,GACbpW,EAAU,GAId,SAAS+pI,eAAe7wJ,GACT9B,OAAOyZ,KAAK3X,GAClB8lB,SAAQ,SAASzV,GAClB6sB,EAAWxgC,KAmHvB,SAASg/B,UAAUrrB,EAAK3R,GACpB,OAAO2R,OAAkB8/I,EAAazxJ,GAAS,GACnD,CArH4Bg9B,CAAUrrB,EAAKrQ,EAAIqQ,IACvC,GACJ,CAEA,cAAcsU,GACV,IAAK,SACD,GAAe,OAAXA,EAAiB,MAEjBA,EAAOmsI,OACPD,eAAelsI,EAAOmsI,OAGtBnsI,EAAOosI,QACPjqI,EAAQpqB,MACH,YAAcioB,EAAOosI,QAAQv2J,QAAQ,SAAU,mBAAqB,OAIzEmqB,EAAOmB,UACP8qI,GAAkB,EAClB9pI,EAAQpqB,KAAK,IACbioB,EAAOmB,SAAQ,SAASpnB,GACA,iBAATA,EAGM,SAFDR,OAAOyZ,KAAKjZ,GAAO,GAG3BmyJ,eAAenyJ,EAAMoyJ,OAErBhqI,EAAQpqB,KAAKolC,QACTpjC,EAAO63F,EAAQ65D,EAAe,KAItCtpI,EAAQ6K,MACRi/H,GAAgB,EAChB9pI,EAAQpqB,KAAKyzJ,EAAazxJ,IAGlC,IACKkyJ,GACD9pI,EAAQpqB,KAAK,KAGzB,MAEA,QAEIoqB,EAAQpqB,KAAKyzJ,EAAaxrI,IAIlC,MAAO,CACHvX,KAAYA,EACZujJ,WA9EY,EA+EZzzH,WAAYA,EACZpW,QAAYA,EACZ2pI,OAAYL,EACZM,QAAYL,EACZ95D,OAAYA,EAEpB,CAEA,SAAS3iF,OAAO08E,EAAQ6V,EAAMhpG,GAE1B,GAAmB,iBAARgpG,EACP,OAAO7V,GAAO,EAAO6V,GAGzB,IAAInqG,EAAMmqG,EAAKwqD,UAAY,EAAIxqD,EAAKr/E,QAAQzqB,OAE5C,SAAS20J,UACL,KAAO7qD,EAAKr/E,QAAQzqB,QAAQ,CACxB,IAAIqC,EAAQynG,EAAKr/E,QAAQoe,QAEzB,QAAc/kC,IAAVzB,EAAJ,CACA,GAAIiyJ,UAAUjyJ,GAAQ,OAEtBkV,OAAO08E,EAAQ5xF,EAHkB,CAIrC,CAEA4xF,GAAO,GAAQt0F,EAAM,EAAImqG,EAAKuqD,QAAU,KACjCvqD,EAAK/4F,KAAO,KAAO+4F,EAAK/4F,KAAO,IAAM,KACrC+4F,EAAK5P,SAAWp5F,EAAM,KAAO,KAEhCA,GACAA,GAER,CAEA,SAASwzJ,UAAUjyJ,GAChB,QAAIA,EAAMiyJ,YACNjyJ,EAAMiyJ,UAAUrgE,OAASA,EACzB5xF,EAAMiyJ,UAAUxzJ,IAAM6zJ,QACtBtyJ,EAAMiyJ,WAAY,EAClBrgE,GAAO,IACA,EAGd,CAQA,GANAA,GAAO,EAAO6V,EAAKuqD,SACZvqD,EAAK/4F,KAAO,IAAM+4F,EAAK/4F,KAAO,KAC9B+4F,EAAKjpE,WAAW7gC,OAAS,IAAM8pG,EAAKjpE,WAAWrgC,KAAK,KAAO,KAC3Db,EAAOmqG,EAAK/4F,KAAO,IAAM,GAAO+4F,EAAK/4F,KAAO,KAAO,KACnD+4F,EAAK5P,QAAUv6F,EAAM,EAAI,KAAO,MAElCA,EACD,OAAOs0F,GAAO,EAAO6V,EAAK5P,OAAS,KAAO,IAGzCo6D,UAAUxqD,IACX6qD,SAER,CAMAv3J,EAAOD,QAnRP,SAASo6B,IAAI9lB,EAAO0C,GAEO,iBAAZA,IACPA,EAAU,CACN+lF,OAAQ/lF,IAIhB,IAAI0mC,EAAc1mC,EAAQ0mC,OAAS,IAAIwyF,EAAW,KAC9CrsI,EAAc,GACd4zJ,GAAc,EACd16D,EAAe/lF,EAAQ+lF,QACc,IAAnB/lF,EAAQ+lF,OAdb,OAeS/lF,EAAQ+lF,OAFE,GAGhC26D,GAAc,EAGlB,SAAShV,MAAOrsI,GACPqhJ,EAGDv2I,EAAQ6+E,SAAS3pF,GAFjBA,GAIR,CAEA,SAASygF,OAAQqgE,EAAWtpJ,GAQxB,QAPYlH,IAARkH,IACAhK,GAAUgK,GAEVspJ,IAAcM,IACd/5G,EAASA,GAAU,IAAIwyF,EACvBunB,GAAc,GAEdN,GAAaM,EAAa,CAC1B,IAAI1wJ,EAAOlD,EACX6+I,OAAM,WAAchlG,EAAO9T,KAAK,OAAQ7iC,EAAM,IAC9ClD,EAAS,EACb,CACJ,CAEA,SAASkjC,IAAK7hC,EAAO8K,GACjBoK,OAAO08E,OAAQxuD,QAAQpjC,EAAO63F,EAAQA,EAAS,EAAI,GAAI/sF,EAC3D,CAEA,SAASrM,MACL,GAAI+5C,EAAQ,CACR,IAAI32C,EAAOlD,EACX6+I,OAAM,WACJhlG,EAAO9T,KAAK,OAAQ7iC,GACpB22C,EAAO9T,KAAK,OACZ8T,EAAOyxF,UAAW,EAClBzxF,EAAO9T,KAAK,QACd,GACJ,CACJ,CAgCA,OAjBA84G,OAAM,WAAcgV,GAAU,CAAM,IAEhC1gJ,EAAQ2gJ,aAfZ,SAASC,kBAAkBD,GACvB,IACI5yH,EAAQ,CAAE7jB,QAAS,MAAO7b,SADfsyJ,EAAYtyJ,UAAY,SAGnCsyJ,EAAYE,aACZ9yH,EAAK8yH,WAAaF,EAAYE,YAGlC9wH,IAAI,CAAC,OAAQ,CAAEuwH,MAAOvyH,KACtBlhC,EAASA,EAAO7C,QAAQ,KAAM,KAClC,CAMI42J,CAAkB5gJ,EAAQ2gJ,aAG1BrjJ,GAASA,EAAMgY,QACfhY,EAAMgY,SAAQ,SAAUpnB,EAAO/C,GAC3B,IAAI6N,EACA7N,EAAI,IAAMmS,EAAMzR,SAChBmN,EAAOrM,KACXojC,IAAI7hC,EAAO8K,EACf,IAEA+2B,IAAIzyB,EAAO3Q,KAGX+5C,GACAA,EAAOyxF,UAAW,EACXzxF,GAEJ75C,CACX,EAyLA5D,EAAOD,QAAQy2B,QAAUx2B,EAAOD,QAAQs8B,QAvLxC,SAAS7F,UACL,IACI3Q,EAAO,CACHkxI,MAAQ1uH,QAFJ/kC,MAAMqB,UAAUa,MAAMgD,KAAKnB,YAKvCwe,KAAY,SAAUxR,GAClB,IAAKlU,KAAK02F,OACN,MAAM,IAAIrzF,MAAM,6BAEpB,IAAIqgB,EAAO1jB,KACP28F,EAAS38F,KAAK42J,MAAMj6D,OACxB3iF,OAAOha,KAAK02F,OAAQxuD,QAChBh0B,EAAOyoF,EAAQ38F,KAAK42J,MAAMC,QAAUl6D,EAAS,EAAI,KACjD,WAAcj5E,EAAKgzE,QAAO,EAAM,GACxC,EAEAhxE,MAAa,SAAUxR,QACL3N,IAAV2N,GACAlU,KAAK8C,KAAKoR,GAEVlU,KAAKuD,KACLvD,KAAKuD,KAEb,GAEA,OAAOmiB,CACX,uBC7HA,UAwCE,EAAO,GAAI,EAcL,WACP,aAIA,IAAIgyI,8BAAgC,SAAUnrD,GAC7C,OAAOA,GAAQ,qBAAsBnyF,QACiB,WAArDA,OAAOu9I,iBAAiBprD,GAAM,kBAChC,EAIA,GAAsB,oBAAXnyF,UAA4B,aAAcA,QACpD,MAAO,CAAC,EAIT,IAAIw9I,aAAe,SAAUC,EAAWC,EAAiBC,GAUxD,IAAIC,EAPJF,EAAkBA,GAAmB,IAChCC,GAA6B,IAAfA,IAElBA,EAAa,GAKd,IAAIE,mBAAqB,SAAU97F,GAClC67F,EAAkB77F,CACnB,EAKI+7F,WAAa,WAChB/lF,aAAa6lF,GACbC,mBAAmB,EACpB,EAEIE,qBAAuB,SAAU5rD,GACpC,OAAOpiG,KAAK2C,IAAI,EAAG+qJ,EAAUO,SAAS7rD,GAAQwrD,EAC/C,EAUIM,UAAY,SAAUC,EAASC,EAAUC,GAE5C,GADAN,aACiB,IAAbK,GAAmBA,GAAYA,EAAW,GAAMb,8BAA8BG,EAAUr9I,MAC3Fq9I,EAAUY,IAAIH,GACVE,GACHA,QAEK,CACN,IAAIE,EAASb,EAAUc,OACnBC,EAAWzuJ,KAAK2C,IAAI,EAAGwrJ,GAAWI,EAClC5W,GAAY,IAAIhqI,MAAOmd,UAC3BsjI,EAAWA,GAAYpuJ,KAAKC,IAAID,KAAKmK,IAAIskJ,GAAWd,GACpD,SAAUe,aACTZ,mBAAmBtoF,YAAW,WAE7B,IAAIy7B,EAAIjhG,KAAKC,IAAI,IAAI,IAAI0N,MAAOmd,UAAY6sH,GAAayW,GAErDpsJ,EAAIhC,KAAK2C,IAAI,EAAG3C,KAAK6J,MAAM0kJ,EAASE,GAAUxtD,EAAI,GAAM,EAAEA,EAAEA,EAAIA,GAAG,EAAM,EAAFA,GAAK,KAChFysD,EAAUY,IAAItsJ,GACVi/F,EAAI,GAAMysD,EAAUiB,YAAc3sJ,EAAK0rJ,EAAUr9I,KAAKu+I,aACzDF,cAEAlpF,WAAWuoF,WAAY,IACnBM,GACHA,IAGH,GAAG,GACH,CAhBD,EAiBD,CACD,EASIQ,aAAe,SAAUzsD,EAAMgsD,EAAUC,GAC5CH,UAAUF,qBAAqB5rD,GAAOgsD,EAAUC,EACjD,EASIS,eAAiB,SAAU1sD,EAAMgsD,EAAUC,GAC9C,IAAIU,EAAa3sD,EAAK4sD,wBAAwBnzC,OAC1CozC,EAAavB,EAAUO,SAAS7rD,GAAQ2sD,EACxCG,EAAkBxB,EAAUiB,YAC5B3sJ,EAAI0rJ,EAAUc,OACdW,EAAkBntJ,EAAIktJ,EACtBlB,qBAAqB5rD,GAAQpgG,GAAM+sJ,EAAanB,EAAcsB,EAEjEL,aAAazsD,EAAMgsD,EAAUC,GAClBY,EAAarB,EAAcuB,EAEtCjB,UAAUe,EAAaC,EAAkBtB,EAAYQ,EAAUC,GACrDA,GACVA,GAEF,EAWIe,iBAAmB,SAAUhtD,EAAMgsD,EAAUvvJ,EAAQwvJ,GACxDH,UAAUluJ,KAAK2C,IAAI,EAAG+qJ,EAAUO,SAAS7rD,GAAQsrD,EAAUiB,YAAY,GAAK9vJ,GAAUujG,EAAK4sD,wBAAwBnzC,OAAO,IAAKuyC,EAAUC,EAC1I,EAuBA,MAAO,CACNgB,MAdW,SAAUC,EAAoBC,GAOzC,OAN2B,IAAvBD,GAA4BA,KAC/B3B,EAAkB2B,IAEG,IAAlBC,GAAuBA,KAC1B3B,EAAa2B,GAEP,CACN5B,gBAAiBA,EACjBC,WAAYA,EAEd,EAIC33F,GAAI44F,aACJP,IAAKJ,UACLsB,SAAUV,eACVW,OAAQL,iBACR3wI,KAAMsvI,WACN2B,OAAQ,WAAc,QAAS7B,CAAgB,EAC/CW,KAAMd,EAAUc,KAChBP,SAAUP,EAAUO,SAGtB,EAGI0B,EAAUhhJ,SAAS2pB,gBACnBs3H,QAAU,WAAc,OAAO3/I,OAAO4/I,SAAWF,EAAQn0B,SAAU,EAGnEs0B,EAAYrC,aAAa,CAC5Bp9I,KAAM1B,SAASohJ,kBAAoBphJ,SAAS0B,KAC5Ci+I,IAAK,SAAUtsJ,GAAKiO,OAAO+/I,SAAS,EAAGhuJ,EAAG,EAC1CwsJ,KAAMoB,QACNjB,UAAW,WAAc,OAAO1+I,OAAOggJ,aAAeN,EAAQO,YAAa,EAC3EjC,SAAU,SAAU7rD,GAAQ,OAAOA,EAAK4sD,wBAAwB5/I,IAAMwgJ,UAAYD,EAAQQ,SAAU,IA2BrG,GAbAL,EAAUM,eAAiB,SAAUC,EAAiB1C,EAAiBC,GACtE,OAAOH,aAAa,CACnBp9I,KAAMggJ,EACN/B,IAAK,SAAUtsJ,GAAKquJ,EAAgB70B,UAAYx5H,CAAE,EAClDwsJ,KAAM,WAAc,OAAO6B,EAAgB70B,SAAU,EACrDmzB,UAAW,WAAc,OAAO3uJ,KAAKC,IAAIowJ,EAAgBH,aAAcjgJ,OAAOggJ,aAAeN,EAAQO,aAAc,EACnHjC,SAAU,SAAU7rD,GAAQ,OAAOA,EAAK+tD,SAAU,GAChDxC,EAAiBC,EACrB,EAKI,qBAAsB39I,SAAWA,OAAOqgJ,cAAgB/C,8BAA8B5+I,SAAS0B,MAAO,CAEzG,IAAIkgJ,EAAqB,YAAatgJ,QAAU,cAAeugJ,QAC3DC,EAA+BF,GAAsB,sBAAuBC,QAG5EC,IACHD,QAAQE,kBAAoB,QAG7BzgJ,OAAON,iBAAiB,QAAQ,WAE3B8gJ,IAEHjrF,YAAW,WAAcgrF,QAAQE,kBAAoB,QAAS,GAAG,GACjEzgJ,OAAON,iBAAiB,YAAY,SAAUsjC,GACzCA,EAAM12B,OAAS,eAAgB02B,EAAM12B,OACxCuzI,EAAUxB,IAAIr7G,EAAM12B,MAAMo0I,WAE5B,IAAG,IAKA1gJ,OAAOsmF,SAAShrC,MACnBia,YAAW,WAEV,IAAIooF,EAAakC,EAAUT,QAAQzB,WACnC,GAAIA,EAAY,CACf,IAAIgD,EAAajiJ,SAASkiJ,eAAe5gJ,OAAOsmF,SAASlxB,KAAK76D,MAAM,KAAK,IACzE,GAAIomJ,EAAY,CACf,IAAIzC,EAAUnuJ,KAAK2C,IAAI,EAAGmtJ,EAAU7B,SAAS2C,GAAchD,GACvDkD,EAAOhB,EAAUtB,OAASL,EAE1B,GAAK2C,GAAQA,EAAO,GACvB7gJ,OAAO+/I,SAAS,EAAG7B,EAErB,CACD,CACD,GAAG,EAGL,IAAG,GAGH,IAAI4C,EAAiB,IAAInmI,OAAO,6BAChC3a,OAAON,iBAAiB,SAAS,SAAUsjC,GAE1C,IADA,IAAI+9G,EAAS/9G,EAAMrwC,OACZouJ,GAA6B,MAAnBA,EAAO95H,SACvB85H,EAASA,EAAOx5H,WAGjB,MAAKw5H,GAA0B,IAAhB/9G,EAAMwoE,OAAexoE,EAAM4lE,UAAY5lE,EAAM8lE,SAAW9lE,EAAM2lE,SAAW3lE,EAAM6lE,QAA9F,CAIA,GAAI23C,EAA8B,CACjC,IAAIQ,EAAeT,QAAQj0I,OAAkC,iBAAlBi0I,QAAQj0I,MAAqBi0I,QAAQj0I,MAAQ,CAAC,EACzF00I,EAAaN,WAAab,EAAUtB,OACpC,IACCgC,QAAQU,aAAaD,EAAc,GACpC,CAAE,MAAO9vJ,GAET,CACD,CAEA,IAAIkkE,EAAO2rF,EAAOhgI,aAAa,SAAW,GAC1C,GAA0B,IAAtBq0C,EAAKruE,QAAQ,OAAe+5J,EAAe55J,KAAK65J,EAAOpoH,WAAY,CACtE,IAAIulH,EAAU,EACVyC,EAAajiJ,SAASkiJ,eAAexrF,EAAKx2B,UAAU,IACxD,GAAa,MAATw2B,EAAc,CACjB,IAAKurF,EAEJ,OAEDzC,EAAU2B,EAAU7B,SAAS2C,EAC9B,CACA39G,EAAMnjC,iBAEN,IAAIu+I,OAAS,WAAcp+I,OAAOsmF,SAAWlxB,CAAK,EAE9CuoF,EAAakC,EAAUT,QAAQzB,WAC/BA,IACHO,EAAUnuJ,KAAK2C,IAAI,EAAGwrJ,EAAUP,GAC5B2C,IACHlC,OAAS,WAAcmC,QAAQW,UAAU,CAAC,EAAG,GAAI9rF,EAAM,IAGzDyqF,EAAUxB,IAAIH,EAAS,KAAME,OAC9B,CAnCA,CAoCD,IAAG,EAEJ,CAGA,OAAOyB,CAGR,CA5TW,QAAW,mHCxCtBp6J,EAAOD,QAAU,EAAjB,wBCAA,IAAI27J,EAAiB,EAAQ,OACzBC,EAAwB,EAAQ,OACpC,SAASC,WACP,IAAItpD,EAYJ,OAXAtyG,EAAOD,QAAU67J,SAAWF,EAAiBC,EAAsBrpD,EAAWopD,GAAgBlzJ,KAAK8pG,GAAY,SAAUplG,GACvH,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CACzC,IAAI8b,EAAS3W,UAAUnF,GACvB,IAAK,IAAI0U,KAAOoH,EACVvZ,OAAOE,UAAU4R,eAAe/N,KAAKwV,EAAQpH,KAC/C1J,EAAO0J,GAAOoH,EAAOpH,GAG3B,CACA,OAAO1J,CACT,EAAGlN,EAAOD,QAAQ4qG,YAAa,EAAM3qG,EAAOD,QAAiB,QAAIC,EAAOD,QACjE67J,SAASzwJ,MAAMhL,KAAMkH,UAC9B,CACArH,EAAOD,QAAU67J,SAAU57J,EAAOD,QAAQ4qG,YAAa,EAAM3qG,EAAOD,QAAiB,QAAIC,EAAOD,UChB5F87J,EAA2B,CAAC,EAGhC,SAASC,oBAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBr1J,IAAjBs1J,EACH,OAAOA,EAAaj8J,QAGrB,IAAIC,EAAS67J,EAAyBE,GAAY,CACjD5qI,GAAI4qI,EACJE,QAAQ,EACRl8J,QAAS,CAAC,GAUX,OANAm8J,EAAoBH,GAAUvzJ,KAAKxI,EAAOD,QAASC,EAAQA,EAAOD,QAAS+7J,qBAG3E97J,EAAOi8J,QAAS,EAGTj8J,EAAOD,OACf,CCxBA+7J,oBAAoB5zJ,EAAKlI,IACxB,IAAIm8J,EAASn8J,GAAUA,EAAO2qG,WAC7B,IAAO3qG,EAAiB,QACxB,IAAM,EAEP,OADA87J,oBAAoB1vG,EAAE+vG,EAAQ,CAAE/vJ,EAAG+vJ,IAC5BA,CAAM,ECLdL,oBAAoB1vG,EAAI,CAACrsD,EAASq8J,KACjC,IAAI,IAAIxlJ,KAAOwlJ,EACXN,oBAAoBhmG,EAAEsmG,EAAYxlJ,KAASklJ,oBAAoBhmG,EAAE/1D,EAAS6W,IAC5EnS,OAAOmH,eAAe7L,EAAS6W,EAAK,CAAE/K,YAAY,EAAMC,IAAKswJ,EAAWxlJ,IAE1E,ECNDklJ,oBAAoBh2I,EAAI,WACvB,GAA0B,iBAAfF,WAAyB,OAAOA,WAC3C,IACC,OAAOzlB,MAAQ,IAAI2b,SAAS,cAAb,EAChB,CAAE,MAAOrQ,GACR,GAAsB,iBAAX8O,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBuhJ,oBAAoBhmG,EAAI,CAACvvD,EAAKizB,IAAU/0B,OAAOE,UAAU4R,eAAe/N,KAAKjC,EAAKizB,GCClFsiI,oBAAoB7sD,EAAKlvG,IACH,oBAAXiE,QAA0BA,OAAOg2E,aAC1Cv1E,OAAOmH,eAAe7L,EAASiE,OAAOg2E,YAAa,CAAE/0E,MAAO,WAE7DR,OAAOmH,eAAe7L,EAAS,aAAc,CAAEkF,OAAO,GAAO,ECL9D62J,oBAAoBO,IAAOr8J,IAC1BA,EAAO2xF,MAAQ,GACV3xF,EAAOwzC,WAAUxzC,EAAOwzC,SAAW,IACjCxzC,ilaCHO,SAASqqG,QAAQ9jG,GAG9B,OAAO8jG,QAAU,mBAAqBrmG,QAAU,iBAAmBA,OAAOukB,SAAW,SAAUhiB,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBvC,QAAUuC,EAAIgN,cAAgBvP,QAAUuC,IAAQvC,OAAOW,UAAY,gBAAkB4B,CAC1H,EAAG8jG,QAAQ9jG,EACb,CCNe,SAASs0I,eAAej2I,GACrC,IAAIgS,ECFS,SAASkkI,aAAazmI,EAAO0mI,GAC1C,GAAuB,WAAnB1wC,QAAQh2F,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAI2mI,EAAO3mI,EAAMrQ,OAAO+C,aACxB,QAAaL,IAATs0I,EAAoB,CACtB,IAAIxwI,EAAMwwI,EAAKxyI,KAAK6L,EAAO0mI,GAAQ,WACnC,GAAqB,WAAjB1wC,QAAQ7/F,GAAmB,OAAOA,EACtC,MAAM,IAAI1F,UAAU,+CACtB,CACA,OAAiB,WAATi2I,EAAoB75I,OAASkI,QAAQiL,EAC/C,CDPY,CAAYzP,EAAK,UAC3B,MAAwB,WAAjBylG,QAAQzzF,GAAoBA,EAAM1V,OAAO0V,EAClD,CEJe,SAASk0F,gBAAgBvkG,EAAKqQ,EAAK3R,GAYhD,OAXA2R,EAAM,eAAcA,MACTrQ,EACT9B,OAAOmH,eAAerF,EAAKqQ,EAAK,CAC9B3R,MAAOA,EACP4G,YAAY,EACZ6H,cAAc,EACdD,UAAU,IAGZlN,EAAIqQ,GAAO3R,EAENsB,CACT,CCbA,SAASsX,QAAQc,EAAQisF,GACvB,IAAI1sF,EAAOzZ,OAAOyZ,KAAKS,GACvB,GAAIla,OAAOgoB,sBAAuB,CAChC,IAAIytE,EAAUz1F,OAAOgoB,sBAAsB9N,GAC3CisF,IAAmB1Q,EAAUA,EAAQvjE,QAAO,SAAUxjB,GACpD,OAAO1O,OAAO2Z,yBAAyBO,EAAQxL,GAAKtH,UACtD,KAAKqS,EAAKjb,KAAKkI,MAAM+S,EAAMg8E,EAC7B,CACA,OAAOh8E,CACT,CACe,SAASo+I,eAAepvJ,GACrC,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CACzC,IAAI8b,EAAS,MAAQ3W,UAAUnF,GAAKmF,UAAUnF,GAAK,CAAC,EACpDA,EAAI,EAAI2b,QAAQpZ,OAAOuZ,IAAS,GAAIqO,SAAQ,SAAUzV,GACpD,gBAAe1J,EAAQ0J,EAAKoH,EAAOpH,GACrC,IAAKnS,OAAOsmG,0BAA4BtmG,OAAO4pB,iBAAiBnhB,EAAQzI,OAAOsmG,0BAA0B/sF,IAAWH,QAAQpZ,OAAOuZ,IAASqO,SAAQ,SAAUzV,GAC5JnS,OAAOmH,eAAesB,EAAQ0J,EAAKnS,OAAO2Z,yBAAyBJ,EAAQpH,GAC7E,GACF,CACA,OAAO1J,CACT,CCZA,SAASqvJ,uBAAuBh5J,GAC9B,MAAO,yBAA2BA,EAAO,4CAA8CA,EAAhF,iFACT,CAGA,IAAIi5J,GACuB,mBAAXx4J,QAAyBA,OAAOy4J,YAAc,eAS1DC,GAAe,SAASA,eAC1B,OAAOpyJ,KAAK+mB,SAASlqB,SAAS,IAAIgyC,UAAU,GAAGrkC,MAAM,IAAI1R,KAAK,IAChE,EAEIu5J,GAAc,CAChBC,KAAM,eAAiBF,KACvBG,QAAS,kBAAoBH,KAC7BI,qBAAsB,SAASA,uBAC7B,MAAO,+BAAiCJ,IAC1C,GAOF,SAAS7+E,cAAct3E,GACrB,GAAmB,iBAARA,GAA4B,OAARA,EAAc,OAAO,EAGpD,IAFA,IAAIgF,EAAQhF,EAE4B,OAAjC9B,OAAO8Z,eAAehT,IAC3BA,EAAQ9G,OAAO8Z,eAAehT,GAGhC,OAAO9G,OAAO8Z,eAAehY,KAASgF,CACxC,CAuFA,SAASwxJ,YAAYlyF,EAASmyF,EAAgBC,GAC5C,IAAIC,EAEJ,GAA8B,mBAAnBF,GAAqD,mBAAbC,GAA+C,mBAAbA,GAAmD,mBAAjB51J,UAAU,GAC/H,MAAM,IAAI7D,MAA8C+4J,uBAAuB,IAQjF,GAL8B,mBAAnBS,QAAqD,IAAbC,IACjDA,EAAWD,EACXA,OAAiBt2J,QAGK,IAAbu2J,EAA0B,CACnC,GAAwB,mBAAbA,EACT,MAAM,IAAIz5J,MAA8C+4J,uBAAuB,IAGjF,OAAOU,EAASF,YAATE,CAAsBpyF,EAASmyF,EACxC,CAEA,GAAuB,mBAAZnyF,EACT,MAAM,IAAIrnE,MAA8C+4J,uBAAuB,IAGjF,IAAIY,EAAiBtyF,EACjBuyF,EAAeJ,EACfK,EAAmB,GACnBC,EAAgBD,EAChBE,GAAgB,EASpB,SAASC,+BACHF,IAAkBD,IACpBC,EAAgBD,EAAiB73J,QAErC,CAQA,SAASi4J,WACP,GAAIF,EACF,MAAM,IAAI/5J,MAA8C+4J,uBAAuB,IAGjF,OAAOa,CACT,CA0BA,SAAS9iC,UAAUlxF,GACjB,GAAwB,mBAAbA,EACT,MAAM,IAAI5lC,MAA8C+4J,uBAAuB,IAGjF,GAAIgB,EACF,MAAM,IAAI/5J,MAA8C+4J,uBAAuB,IAGjF,IAAImB,GAAe,EAGnB,OAFAF,+BACAF,EAAcr6J,KAAKmmC,GACZ,SAASu0H,cACd,GAAKD,EAAL,CAIA,GAAIH,EACF,MAAM,IAAI/5J,MAA8C+4J,uBAAuB,IAGjFmB,GAAe,EACfF,+BACA,IAAIvmJ,EAAQqmJ,EAAch8J,QAAQ8nC,GAClCk0H,EAAc7sH,OAAOx5B,EAAO,GAC5BomJ,EAAmB,IAVnB,CAWF,CACF,CA4BA,SAASzjC,SAASJ,GAChB,IAAK37C,cAAc27C,GACjB,MAAM,IAAIh2H,MAA8C+4J,uBAAuB,IAGjF,QAA2B,IAAhB/iC,EAAO5yH,KAChB,MAAM,IAAIpD,MAA8C+4J,uBAAuB,IAGjF,GAAIgB,EACF,MAAM,IAAI/5J,MAA8C+4J,uBAAuB,IAGjF,IACEgB,GAAgB,EAChBH,EAAeD,EAAeC,EAAc5jC,EAC9C,CAAE,QACA+jC,GAAgB,CAClB,CAIA,IAFA,IAAInyH,EAAYiyH,EAAmBC,EAE1Bp7J,EAAI,EAAGA,EAAIkpC,EAAUxoC,OAAQV,IAAK,EAEzCknC,EADegC,EAAUlpC,KAE3B,CAEA,OAAOs3H,CACT,CA4EA,OAHAI,SAAS,CACPhzH,KAAM+1J,GAAYC,QAEbM,EAAQ,CACbtjC,SACAU,UACAmjC,SACAG,eAnEF,SAASA,eAAeC,GACtB,GAA2B,mBAAhBA,EACT,MAAM,IAAIr6J,MAA8C+4J,uBAAuB,KAGjFY,EAAiBU,EAKjBjkC,SAAS,CACPhzH,KAAM+1J,GAAYE,SAEtB,IAuDSL,IA9CT,SAASC,aACP,IAAIqB,EAEAC,EAAiBzjC,UACrB,OAAOwjC,EAAO,CASZxjC,UAAW,SAASA,UAAU0jC,GAC5B,GAAwB,iBAAbA,GAAsC,OAAbA,EAClC,MAAM,IAAIx6J,MAA8C+4J,uBAAuB,KAGjF,SAAS0B,eACHD,EAASv1I,MACXu1I,EAASv1I,KAAKg1I,WAElB,CAIA,OAFAQ,eAEO,CACLN,YAFgBI,EAAeE,cAInC,IACMzB,IAAgB,WACtB,OAAOr8J,IACT,EAAG29J,CACL,EAaqCZ,CACvC,CAiMA,SAASgB,kBAAkBC,EAAevkC,GACxC,OAAO,WACL,OAAOA,EAASukC,EAAchzJ,MAAMhL,KAAMkH,WAC5C,CACF,CAwDA,SAAS+2J,UACP,IAAK,IAAItlI,EAAOzxB,UAAUzE,OAAQy7J,EAAQ,IAAI/6J,MAAMw1B,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAChFslI,EAAMtlI,GAAQ1xB,UAAU0xB,GAG1B,OAAqB,IAAjBslI,EAAMz7J,OACD,SAAUgC,GACf,OAAOA,CACT,EAGmB,IAAjBy5J,EAAMz7J,OACDy7J,EAAM,GAGRA,EAAM/mI,QAAO,SAAUlrB,EAAG/F,GAC/B,OAAO,WACL,OAAO+F,EAAE/F,EAAE8E,WAAM,EAAQ9D,WAC3B,CACF,GACF,sLC7oBO,MAAMi3J,GAAiB,qBACjBC,GAAuB,2BACvBC,GAAe,mBACfC,GAAqB,yBACrBC,GAAe,mBACfC,GAAQ,YACRC,GAAW,eAEjB,SAASC,aAAa7jJ,GAC3B,MAAO,CACHpU,KAAM03J,GACNrmE,SAASirD,EAAAA,GAAAA,gBAAeloI,GAE9B,CAEO,SAAS8jJ,kBAAkB7rJ,GAChC,MAAO,CACHrM,KAAM23J,GACNtmE,QAAShlF,EAEf,CAEO,SAAS8rJ,WAAW/jJ,GACzB,MAAO,CACHpU,KAAM43J,GACNvmE,QAASj9E,EAEf,CAEO,SAASgkJ,gBAAgBC,GAC9B,MAAO,CACHr4J,KAAM63J,GACNxmE,QAASgnE,EAEf,CAEO,SAASC,WAAWlkJ,GACzB,MAAO,CACLpU,KAAM83J,GACNzmE,QAASj9E,EAEb,CAEO,SAASg3B,QAEd,MAAO,CACLprC,KAAM+3J,GACN1mE,QAJwB5wF,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,CAAC,EAMhC,CAEO,SAAS83J,UAEd,MAAO,CACLv4J,KAAMg4J,GACN3mE,QAJ0B5wF,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,KAAM,EAMvC,CC9BA,SA7BA,SAAS+3J,aACP,IAAIC,EAAM,CACRx+D,SAAU,CAAC,EACXi6D,QAAS,CAAC,EACV5sI,KAAMA,OACNV,MAAOA,OACP8xI,KAAM,WAAY,EAClBC,SAAU,WAAY,GAGxB,GAAqB,oBAAXhlJ,OACR,OAAO8kJ,EAGT,IACEA,EAAM9kJ,OAEN,IAAK,IAAIif,IADG,CAAC,OAAQ,OAAQ,YAEvBA,KAAQjf,SACV8kJ,EAAI7lI,GAAQjf,OAAOif,GAGzB,CAAE,MAAO/tB,GACPC,QAAQC,MAAMF,EAChB,CAEA,OAAO4zJ,CACT,CAEA,ojBCvBA,MAAMG,GAAqBC,KAAAA,IAAOhuG,GAChC,OACA,SACA,QACA,UACA,UACA,mBACA,UACA,mBACA,YACA,YACA,UACA,WACA,WACA,cACA,OACA,cAuBa,SAASiuG,mBAAmBC,GAA6B,IAAlB,OAAEC,GAAQv4J,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,CAAC,EAElE,IAAKo4J,KAAAA,IAAOvoG,MAAMyoG,GAChB,MAAO,CACLE,OAAQJ,KAAAA,MACRK,0BAA2B,MAI/B,IAAKF,EAEH,MAA4B,SAAxBD,EAAU7zJ,IAAI,MACT,CACL+zJ,OAAQF,EAAU7zJ,IAAI,SAAU2zJ,KAAAA,OAChCK,0BAA2B,MAGtB,CACLD,OAAQF,EAAUhpI,QAAO,CAAC05B,EAAGD,IAAMovG,GAAmBjyJ,SAAS6iD,KAC/D0vG,0BAA2B,MAOjC,GAAIH,EAAU7zJ,IAAI,WAAY,CAC5B,MAIMg0J,EAJ6BH,EAChC7zJ,IAAI,UAAW2zJ,KAAAA,IAAO,CAAC,IACvBv3F,SAE0Dp4D,QAE7D,MAAO,CACL+vJ,OAAQF,EAAU3zF,MAChB,CAAC,UAAW8zF,EAA2B,UACvCL,KAAAA,OAEFK,4BAEJ,CAEA,MAAO,CACLD,OAAQF,EAAU7zJ,IAAI,UAAY6zJ,EAAU7zJ,IAAI,SAAU2zJ,KAAAA,OAAWA,KAAAA,MACrEK,0BAA2B,KAE/B,0CChEA,MAAMC,GAAuB,UAEhBjhB,YAAekhB,GAAUP,KAAAA,SAAY7yG,WAAWozG,GAEtD,SAASC,UAAWvxB,GACzB,OAAInyH,SAASmyH,GAEVoQ,YAAYpQ,GACNA,EAAMzkE,OACRykE,EAHE,CAAC,CAIZ,CAYO,SAASwxB,cAAcC,GAC5B,GAAIrhB,YAAYqhB,GACd,OAAOA,EAET,GAAIA,aAAcd,GAAIC,KACpB,OAAOa,EAET,IAAK5jJ,SAAS4jJ,GACZ,OAAOA,EAET,GAAI78J,MAAMuD,QAAQs5J,GAChB,OAAOV,KAAAA,IAAOU,GAAI5pI,IAAI2pI,eAAepsG,SAEvC,GAAI+nB,KAAWskF,EAAGh1I,SAAU,CAE1B,MAAMi1I,EAwBH,SAASC,wBAAyBC,GACvC,IAAKzkF,KAAWykF,EAAMn1I,SACpB,OAAOm1I,EAET,MAAM37D,EAAS,CAAC,EACV47D,EAAU,QACVC,EAAY,CAAC,EACnB,IAAK,IAAI3oH,KAAQyoH,EAAMn1I,UACrB,GAAKw5E,EAAO9sD,EAAK,KAAS2oH,EAAU3oH,EAAK,KAAO2oH,EAAU3oH,EAAK,IAAI4oH,iBAE5D,CACL,IAAKD,EAAU3oH,EAAK,IAAK,CAEvB2oH,EAAU3oH,EAAK,IAAM,CACnB4oH,kBAAkB,EAClB79J,OAAQ,GAIV+hG,EADsB,GAAE9sD,EAAK,KAAK0oH,IAAUC,EAAU3oH,EAAK,IAAIj1C,UACtC+hG,EAAO9sD,EAAK,WAE9B8sD,EAAO9sD,EAAK,GACrB,CACA2oH,EAAU3oH,EAAK,IAAIj1C,QAAU,EAE7B+hG,EADwB,GAAE9sD,EAAK,KAAK0oH,IAAUC,EAAU3oH,EAAK,IAAIj1C,UACtCi1C,EAAK,EAClC,MAjBE8sD,EAAO9sD,EAAK,IAAMA,EAAK,GAmB3B,OAAO8sD,CACT,CArD8B07D,CAAwBF,GAClD,OAAOV,KAAAA,WAAcW,GAAmB7pI,IAAI2pI,cAC9C,CACA,OAAOT,KAAAA,WAAcU,GAAI5pI,IAAI2pI,cAC/B,CA2DO,SAASQ,eAAev+J,GAC7B,OAAGmB,MAAMuD,QAAQ1E,GACRA,EACF,CAACA,EACV,CAEO,SAASw+J,KAAKvrJ,GACnB,MAAqB,mBAAPA,CAChB,CAEO,SAASmH,SAAShW,GACvB,QAASA,GAAsB,iBAARA,CACzB,CAEO,SAASmyE,OAAOg2D,GACrB,MAAyB,mBAAXA,CAChB,CAEO,SAAS7nI,QAAQ6nI,GACtB,OAAOprI,MAAMuD,QAAQ6nI,EACvB,CAGO,MAAM5lD,GAAU83E,KAEhB,SAASC,OAAOt6J,EAAK6O,GAC1B,OAAO3Q,OAAOyZ,KAAK3X,GAAK+wB,QAAO,CAACqtE,EAAQ/tF,KACtC+tF,EAAO/tF,GAAOxB,EAAG7O,EAAIqQ,GAAMA,GACpB+tF,IACN,CAAC,EACN,CAEO,SAASm8D,UAAUv6J,EAAK6O,GAC7B,OAAO3Q,OAAOyZ,KAAK3X,GAAK+wB,QAAO,CAACqtE,EAAQ/tF,KACtC,IAAIpM,EAAM4K,EAAG7O,EAAIqQ,GAAMA,GAGvB,OAFGpM,GAAsB,iBAARA,GACf/F,OAAOwX,OAAO0oF,EAAQn6F,GACjBm6F,CAAM,GACZ,CAAC,EACN,CAGO,SAASo8D,sBAAsBC,GACpC,OAAOlD,IAA6B,IAA5B,SAAElkC,EAAQ,SAAE6jC,GAAUK,EAC5B,OAAOr1I,GAAQ+wG,GACS,mBAAXA,EACFA,EAAOwnC,KAGTv4I,EAAK+wG,EACb,CAEL,CAyOA,SAASynC,sBAAsBh8J,EAAO46J,EAAQqB,EAAiBC,EAAqBrB,GAClF,IAAID,EAAQ,MAAO,GACnB,IAAI5sJ,EAAS,GACTmuJ,EAAWvB,EAAO/zJ,IAAI,YACtBu1J,EAAmBxB,EAAO/zJ,IAAI,YAC9Bw1J,EAAUzB,EAAO/zJ,IAAI,WACrBy1J,EAAU1B,EAAO/zJ,IAAI,WACrBlF,EAAOi5J,EAAO/zJ,IAAI,QAClBqO,EAAS0lJ,EAAO/zJ,IAAI,UACpB01J,EAAY3B,EAAO/zJ,IAAI,aACvB0hG,GAAYqyD,EAAO/zJ,IAAI,aACvB21J,GAAc5B,EAAO/zJ,IAAI,eACzB41J,GAAW7B,EAAO/zJ,IAAI,YACtB61J,GAAW9B,EAAO/zJ,IAAI,YACtBmmF,GAAU4tE,EAAO/zJ,IAAI,WAEzB,MAAM81J,GAAsBV,IAAwC,IAArBG,EACzC/L,GAAWrwJ,QAkBjB,GARwBm8J,GAAsB,OAAVn8J,IAK9B2B,KATJg7J,IAHwCtM,IAAqB,UAAT1uJ,MAFhCg7J,KAAwBtM,KAkB5C,MAAO,GAIT,IAAIuM,GAAuB,WAATj7J,GAAqB3B,EACnC68J,GAAsB,UAATl7J,GAAoBtD,MAAMuD,QAAQ5B,IAAUA,EAAMrC,OAC/Dm/J,GAA0B,UAATn7J,GAAoB64J,KAAAA,KAAQzhG,OAAO/4D,IAAUA,EAAM8kC,QASxE,MAKMi4H,GALY,CAChBH,GAAaC,GAAYC,GATK,UAATn7J,GAAqC,iBAAV3B,GAAsBA,EAC/C,SAAT2B,GAAmB3B,aAAiBo6J,GAAIC,KAC5B,YAAT14J,IAAuB3B,IAAmB,IAAVA,GACxB,WAAT2B,IAAsB3B,GAAmB,IAAVA,GACrB,YAAT2B,IAAuB3B,GAAmB,IAAVA,GACxB,WAAT2B,GAAsC,iBAAV3B,GAAgC,OAAVA,EACnC,WAAT2B,GAAsC,iBAAV3B,GAAsBA,GAOzCuhE,MAAKnW,KAAOA,IAE7C,GAAIuxG,KAAwBI,KAAmBb,EAE7C,OADAluJ,EAAOhQ,KAAK,kCACLgQ,EAET,GACW,WAATrM,IAC+B,OAA9Bk5J,GAC+B,qBAA9BA,GACF,CACA,IAAImC,EAAYh9J,EAChB,GAAoB,iBAAVA,EACR,IACEg9J,EAAY/0H,KAAKp2B,MAAM7R,EACzB,CAAE,MAAOwG,GAEP,OADAwH,EAAOhQ,KAAK,6CACLgQ,CACT,CAEC4sJ,GAAUA,EAAOv5I,IAAI,aAAeoyD,OAAO2oF,EAAiBrjG,SAAWqjG,EAAiBrjG,UACzFqjG,EAAiBh1I,SAAQzV,SACDlQ,IAAnBu7J,EAAUrrJ,IACX3D,EAAOhQ,KAAK,CAAEi/J,QAAStrJ,EAAKjL,MAAO,+BACrC,IAGDk0J,GAAUA,EAAOv5I,IAAI,eACtBu5I,EAAO/zJ,IAAI,cAAcugB,SAAQ,CAAChkB,EAAKuO,KACrC,MAAMurJ,EAAOlB,sBAAsBgB,EAAUrrJ,GAAMvO,GAAK,EAAO84J,EAAqBrB,GACpF7sJ,EAAOhQ,QAAQk/J,EACZ5rI,KAAK5qB,IAAU,CAAGu2J,QAAStrJ,EAAKjL,YAAU,GAGnD,CAEA,GAAIsmF,GAAS,CACX,IAAIj3E,EApGuBonJ,EAAC/5J,EAAKg6J,KAEnC,IADW,IAAIntI,OAAOmtI,GACZ5gK,KAAK4G,GACb,MAAO,6BAA+Bg6J,CACxC,EAgGYD,CAAgBn9J,EAAOgtF,IAC7Bj3E,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAEA,GAAI2mJ,IACW,UAAT/6J,EAAkB,CACpB,IAAIoU,EA5HsBsnJ,EAACj6J,EAAKkC,KACpC,IAAKlC,GAAOkC,GAAO,GAAKlC,GAAOA,EAAIzF,OAAS2H,EAC1C,MAAQ,+BAA8BA,SAAmB,IAARA,EAAY,GAAK,KACpE,EAyHc+3J,CAAiBr9J,EAAO08J,IAC9B3mJ,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAGF,GAAI0mJ,IACW,UAAT96J,EAAkB,CACpB,IAAIoU,EA7HsBunJ,EAACl6J,EAAK4E,KACpC,GAAI5E,GAAOA,EAAIzF,OAASqK,EACtB,MAAQ,oCAAmCA,SAAmB,IAARA,EAAY,GAAK,KACzE,EA0Hcs1J,CAAiBt9J,EAAOy8J,IAC9B1mJ,GAAK/H,EAAOhQ,KAAK,CAAEu/J,YAAY,EAAM72J,MAAOqP,GAClD,CAGF,GAAIymJ,IACW,UAAT76J,EAAkB,CACpB,IAAI67J,EAhKyBC,EAACr6J,EAAKo5J,KACvC,GAAKp5J,IAGe,SAAhBo5J,IAA0C,IAAhBA,GAAsB,CAClD,MAAMj1J,GAAOgnD,EAAAA,GAAAA,QAAOnrD,GACdqE,EAAMF,EAAK69D,QAEjB,GADsBhiE,EAAIzF,OAAS8J,EAAIzF,KACrB,CAChB,IAAI07J,GAAiB9yH,EAAAA,GAAAA,OAMrB,GALArjC,EAAK6f,SAAQ,CAACkJ,EAAMrzB,KACfsK,EAAKmqB,QAAO05B,GAAKqoB,OAAOroB,EAAEtjD,QAAUsjD,EAAEtjD,OAAOwoB,GAAQ86B,IAAM96B,IAAMtuB,KAAO,IACzE07J,EAAiBA,EAAe77H,IAAI5kC,GACtC,IAEyB,IAAxBygK,EAAe17J,KAChB,OAAO07J,EAAepsI,KAAIr0B,IAAC,CAAM+U,MAAO/U,EAAGyJ,MAAO,6BAA4BkmD,SAElF,CACF,GA6IuB6wG,CAAoBz9J,EAAOw8J,IAC1CgB,GAAcxvJ,EAAOhQ,QAAQw/J,EACnC,CAGF,GAAIjB,GAA2B,IAAdA,EAAiB,CAChC,IAAIxmJ,EA5KyB4nJ,EAACv6J,EAAK4E,KACrC,GAAI5E,EAAIzF,OAASqK,EACf,MAAQ,gCAA+BA,cAAwB,IAARA,EAAY,IAAM,IAC3E,EAyKY21J,CAAkB39J,EAAOu8J,GAC/BxmJ,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAEA,GAAIwyF,GAAW,CACb,IAAIxyF,EAzIyB6nJ,EAACx6J,EAAKkC,KACrC,GAAIlC,EAAIzF,OAAS2H,EACf,MAAQ,0BAAyBA,cAAwB,IAARA,EAAY,IAAM,IACrE,EAsIYs4J,CAAkB59J,EAAOuoG,IAC/BxyF,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAEA,GAAIsmJ,GAAuB,IAAZA,EAAe,CAC5B,IAAItmJ,EA7OuB8nJ,EAAEz6J,EAAK4E,KACpC,GAAI5E,EAAM4E,EACR,MAAQ,2BAA0BA,GACpC,EA0OY61J,CAAgB79J,EAAOq8J,GAC7BtmJ,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAEA,GAAIumJ,GAAuB,IAAZA,EAAe,CAC5B,IAAIvmJ,EA5OuB+nJ,EAAE16J,EAAKkC,KACpC,GAAIlC,EAAMkC,EACR,MAAQ,8BAA6BA,GACvC,EAyOYw4J,CAAgB99J,EAAOs8J,GAC7BvmJ,GAAK/H,EAAOhQ,KAAK+X,EACvB,CAEA,GAAa,WAATpU,EAAmB,CACrB,IAAIoU,EAQJ,GANEA,EADa,cAAXb,EA9MwB6oJ,CAAC36J,IAC/B,GAAIsP,MAAMM,KAAKnB,MAAMzO,IACnB,MAAO,0BACT,EA4MU26J,CAAiB/9J,GACH,SAAXkV,EA1Ma8oJ,CAAC56J,IAE3B,GADAA,EAAMA,EAAIlB,WAAWM,eAChB,2EAA2EhG,KAAK4G,GACnF,MAAO,sBACT,EAuMU46J,CAAah+J,GAvNKi+J,CAAE76J,IAC9B,GAAKA,GAAsB,iBAARA,EACjB,MAAO,wBACT,EAsNU66J,CAAej+J,IAElB+V,EAAK,OAAO/H,EACjBA,EAAOhQ,KAAK+X,EACd,MAAO,GAAa,YAATpU,EAAoB,CAC7B,IAAIoU,EApOuBmoJ,CAAE96J,IAC/B,GAAe,SAARA,GAA0B,UAARA,IAA2B,IAARA,IAAwB,IAARA,EAC1D,MAAO,yBACT,EAiOY86J,CAAgBl+J,GAC1B,IAAK+V,EAAK,OAAO/H,EACjBA,EAAOhQ,KAAK+X,EACd,MAAO,GAAa,WAATpU,EAAmB,CAC5B,IAAIoU,EA1PsBnL,CAAExH,IAC9B,IAAK,mBAAmB5G,KAAK4G,GAC3B,MAAO,wBACT,EAuPYwH,CAAe5K,GACzB,IAAK+V,EAAK,OAAO/H,EACjBA,EAAOhQ,KAAK+X,EACd,MAAO,GAAa,YAATpU,EAAoB,CAC7B,IAAIoU,EAxPuBooJ,CAAE/6J,IAC/B,IAAK,UAAU5G,KAAK4G,GAClB,MAAO,0BACT,EAqPY+6J,CAAgBn+J,GAC1B,IAAK+V,EAAK,OAAO/H,EACjBA,EAAOhQ,KAAK+X,EACd,MAAO,GAAa,UAATpU,EAAkB,CAC3B,IAAMk7J,KAAcC,GAClB,OAAO9uJ,EAENhO,GACDA,EAAMonB,SAAQ,CAACkJ,EAAMrzB,KACnB,MAAMigK,EAAOlB,sBAAsB1rI,EAAMsqI,EAAO/zJ,IAAI,UAAU,EAAOq1J,EAAqBrB,GAC1F7sJ,EAAOhQ,QAAQk/J,EACZ5rI,KAAKvb,IAAQ,CAAG/D,MAAO/U,EAAGyJ,MAAOqP,MAAQ,GAGlD,MAAO,GAAa,SAATpU,EAAiB,CAC1B,IAAIoU,EAjQoBqoJ,CAAEh7J,IAC5B,GAAKA,KAASA,aAAeg3J,GAAIC,MAC/B,MAAO,sBACT,EA8PY+D,CAAap+J,GACvB,IAAK+V,EAAK,OAAO/H,EACjBA,EAAOhQ,KAAK+X,EACd,CAEA,OAAO/H,CACT,CAGO,MAwCMqwJ,WAAQxiK,IACnB,IAAIkF,EAQJ,OALEA,EADElF,aAAemD,GACRnD,EAEAmD,GAAOe,KAAKlE,EAAIqG,WAAY,SAGhCnB,EAAOmB,SAAS,SAAS,EAGrBo8J,GAAU,CACrBC,iBAAkB,CAChBC,MAAOA,CAACr3J,EAAG/F,IAAM+F,EAAEN,IAAI,QAAQ43J,cAAcr9J,EAAEyF,IAAI,SACnD8P,OAAQA,CAACxP,EAAG/F,IAAM+F,EAAEN,IAAI,UAAU43J,cAAcr9J,EAAEyF,IAAI,YAExD63J,WAAY,CACVF,MAAOA,CAACr3J,EAAG/F,IAAM+F,EAAEs3J,cAAcr9J,KAIxBu9J,cAAiB98J,IAC5B,IAAI+8J,EAAU,GAEd,IAAK,IAAIlwJ,KAAQ7M,EAAM,CACrB,IAAIuB,EAAMvB,EAAK6M,QACHjN,IAAR2B,GAA6B,KAARA,GACvBw7J,EAAQ5gK,KAAK,CAAC0Q,EAAM,IAAK6E,mBAAmBnQ,GAAKtH,QAAQ,OAAO,MAAMqC,KAAK,IAE/E,CACA,OAAOygK,EAAQzgK,KAAK,IAAI,EAIb0gK,iBAAmBA,CAAC13J,EAAE/F,EAAG6X,MAC3BglC,KAAKhlC,GAAOtH,GACZigE,KAAGzqE,EAAEwK,GAAMvQ,EAAEuQ,MAIjB,SAASlW,YAAYC,GAC1B,MAAkB,iBAARA,GAA4B,KAARA,EACrB,IAGFojK,EAAAA,GAAAA,IAAqBpjK,EAC9B,CAEO,SAASqjK,sBAAsBz3H,GACpC,SAAKA,GAAOA,EAAIjrC,QAAQ,cAAgB,GAAKirC,EAAIjrC,QAAQ,cAAgB,GAAa,SAARirC,EAIhF,CA2BO,MAAM03H,mBAAsBnjK,GAAsB,iBAAPA,GAAmBA,aAAeI,OAASJ,EAAIM,OAAOL,QAAQ,MAAO,OAAS,GAEnHmjK,mBAAsBpjK,GAAQg0B,KAAWmvI,mBAAmBnjK,GAAKC,QAAQ,OAAQ,MAEjFojK,cAAiBC,GAAWA,EAAOztI,QAAO,CAAC05B,EAAGD,IAAM,MAAM3uD,KAAK2uD,KAC/Di0G,oBAAuBD,GAAWA,EAAOztI,QAAO,CAAC05B,EAAGD,IAAM,+CAA+C3uD,KAAK2uD,KAMpH,SAASk0G,eAAejwJ,EAAOkwJ,GAAqC,IAAzBjhG,EAASj8D,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,KAAM,EAClE,GAAoB,iBAAVgN,GAAsB/Q,MAAMuD,QAAQwN,IAAoB,OAAVA,IAAmBkwJ,EACzE,OAAOlwJ,EAGT,MAAM9N,EAAM9B,OAAOwX,OAAO,CAAC,EAAG5H,GAU9B,OARA5P,OAAOyZ,KAAK3X,GAAK8lB,SAAQ+jC,IACpBA,IAAMm0G,GAAcjhG,EAAU/8D,EAAI6pD,GAAIA,UAChC7pD,EAAI6pD,GAGb7pD,EAAI6pD,GAAKk0G,eAAe/9J,EAAI6pD,GAAIm0G,EAAYjhG,EAAU,IAGjD/8D,CACT,CAEO,SAAS4mC,UAAUuhG,GACxB,GAAqB,iBAAVA,EACT,OAAOA,EAOT,GAJIA,GAASA,EAAMzkE,OACjBykE,EAAQA,EAAMzkE,QAGK,iBAAVykE,GAAgC,OAAVA,EAC/B,IACE,OAAOxhG,KAAKC,UAAUuhG,EAAO,KAAM,EACrC,CACA,MAAOjjI,GACL,OAAOvK,OAAOwtI,EAChB,CAGF,OAAGA,QACM,GAGFA,EAAMvnI,UACf,CAUO,SAASq9J,kBAAkB9rD,GAAwD,IAAjD,UAAE+rD,GAAY,EAAK,YAAEC,GAAc,GAAMr9J,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,IAAIo4J,KAAAA,IAAOvoG,MAAMwhD,GACf,MAAM,IAAIl1G,MAAM,+DAElB,MAAMmhK,EAAYjsD,EAAM5sG,IAAI,QACtB84J,EAAUlsD,EAAM5sG,IAAI,MAE1B,IAAI+4J,EAAuB,GAgB3B,OAZInsD,GAASA,EAAMviD,UAAYyuG,GAAWD,GAAaD,GACrDG,EAAqB5hK,KAAM,GAAE2hK,KAAWD,UAAkBjsD,EAAMviD,cAG/DyuG,GAAWD,GACZE,EAAqB5hK,KAAM,GAAE2hK,KAAWD,KAG1CE,EAAqB5hK,KAAK0hK,GAInBF,EAAYI,EAAwBA,EAAqB,IAAM,EACxE,CAEO,SAASC,aAAapsD,EAAOqsD,GAWlC,OAVuBP,kBAAkB9rD,EAAO,CAAE+rD,WAAW,IAK1DluI,KAAIpF,GACI4zI,EAAY5zI,KAEpBwF,QAAO1xB,QAAmByB,IAAVzB,IAEL,EAChB,CAiBA,SAAS+/J,mBAAmBlkK,GAC1B,OAAOA,EACJC,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfA,QAAQ,KAAM,GACnB,CAEO,MAAMkkK,aAAgBhgK,IACtBA,MAID65I,YAAY75I,KAAUA,EAAMomE,WCh0B5B65F,KAAO94J,GAAKA,EAGlB,SAAS+4J,0BAA0BC,EAAaC,EAAcrE,GAE5D,IAAIsE,EAAa,CAIfvE,sBAAuBC,IAKzB,OAAOjE,YAAYqI,EAAaC,GAFPhG,GAAIkG,sCAAwCnH,SL0oBvE,SAASoH,kBACP,IAAK,IAAI1sI,EAAOzxB,UAAUzE,OAAQ6iK,EAAc,IAAIniK,MAAMw1B,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IACtF0sI,EAAY1sI,GAAQ1xB,UAAU0xB,GAGhC,OAAO,SAAUgkI,GACf,OAAO,WACL,IAAIj2I,EAAQi2I,EAAY5xJ,WAAM,EAAQ9D,WAElCq+J,EAAY,SAAS9rC,WACvB,MAAM,IAAIp2H,MAA8C+4J,uBAAuB,IACjF,EAEIoJ,EAAgB,CAClBlI,SAAU32I,EAAM22I,SAChB7jC,SAAU,SAASA,WACjB,OAAO8rC,EAAUv6J,WAAM,EAAQ9D,UACjC,GAEEomE,EAAQg4F,EAAYlvI,KAAI,SAAUqvI,GACpC,OAAOA,EAAWD,EACpB,IAEA,OADAD,EAAYtH,QAAQjzJ,WAAM,EAAQsiE,EAAtB2wF,CAA6Bt3I,EAAM8yG,UACxC,eAAc,eAAc,CAAC,EAAG9yG,GAAQ,CAAC,EAAG,CACjD8yG,SAAU8rC,GAEd,CACF,CACF,CKnqBIF,IAAoBF,IAExB,CAEe,MAAMO,MAEnBtyJ,WAAAA,GAAsB,IAAV6iC,EAAI/uC,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAC,CAAC,EAChBmuB,KAAWr1B,KAAM,CACf0mB,MAAO,CAAC,EACRsxB,QAAS,GACT2tH,eAAgB,CAAC,EACjBC,OAAQ,CACNC,QAAS,CAAC,EACV5wJ,GAAI,CAAC,EACL6wJ,WAAY,CAAC,EACbC,YAAa,CAAC,EACdC,aAAc,CAAC,GAEjBC,YAAa,CAAC,EACdC,QAAS,CAAC,GACTjwH,GAEHj2C,KAAK6gK,UAAY7gK,KAAKmmK,WAAW1wJ,KAAKzV,MAGtCA,KAAK2mB,MA4bT,SAASy/I,eAAenB,EAAaC,EAAcrE,GAWjD,OAVcmE,0BAA0BC,EAAaC,EAAcrE,EAWrE,CAxciBuF,CAAerB,MAAM1xG,EAAAA,GAAAA,QAAOrzD,KAAK0mB,OAAQ1mB,KAAK6gK,WAG3D7gK,KAAKqmK,aAAY,GAGjBrmK,KAAK6zF,SAAS7zF,KAAKg4C,QACrB,CAEAsuH,QAAAA,GACE,OAAOtmK,KAAK2mB,KACd,CAEAktE,QAAAA,CAAS77C,GAAwB,IAAfuuH,IAAOr/J,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,KAAAA,UAAA,GACvB,IAAIs/J,EAAeC,eAAezuH,EAASh4C,KAAK6gK,YAAa7gK,KAAK2lK,gBAClEe,aAAa1mK,KAAK4lK,OAAQY,GACvBD,GACDvmK,KAAKqmK,cAGoBM,cAAct+J,KAAKrI,KAAK4lK,OAAQ5tH,EAASh4C,KAAK6gK,cAGvE7gK,KAAKqmK,aAET,CAEAA,WAAAA,GAAgC,IAApBO,IAAY1/J,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,KAAAA,UAAA,GAClBuyH,EAAWz5H,KAAKsmK,WAAW7sC,SAC3B6jC,EAAWt9J,KAAKsmK,WAAWhJ,SAE/Bt9J,KAAKimK,YAAc3hK,OAAOwX,OAAO,CAAC,EAC9B9b,KAAK6mK,iBACL7mK,KAAK8mK,0BAA0BrtC,GAC/Bz5H,KAAK+mK,4BAA4BzJ,EAAUt9J,KAAK6gK,WAChD7gK,KAAKgnK,eAAe1J,GACpBt9J,KAAKinK,QACLjnK,KAAKknK,cAGNN,GACD5mK,KAAKmnK,gBACT,CAEAhB,UAAAA,GACE,OAAOnmK,KAAKimK,WACd,CAEAY,cAAAA,GACE,OAAOviK,OAAOwX,OAAO,CACnB+kJ,UAAW7gK,KAAK6gK,UAChByF,SAAUtmK,KAAKsmK,SAAS7wJ,KAAKzV,MAC7BonK,cAAepnK,KAAKonK,cAAc3xJ,KAAKzV,MACvCs9J,SAAUt9J,KAAKsmK,WAAWhJ,SAC1B4J,WAAYlnK,KAAKqnK,YAAY5xJ,KAAKzV,MAClCs/J,GAAE,KACFgI,MAAKA,IACJtnK,KAAK4lK,OAAOG,aAAe,CAAC,EACjC,CAEAsB,WAAAA,GACE,OAAOrnK,KAAK4lK,OAAOC,OACrB,CAEAqB,UAAAA,GACE,MAAO,CACLrB,QAAS7lK,KAAK4lK,OAAOC,QAEzB,CAEA0B,UAAAA,CAAW1B,GACT7lK,KAAK4lK,OAAOC,QAAUA,CACxB,CAEAsB,cAAAA,GACEnnK,KAAK2mB,MAAM82I,eA0Tf,SAASmJ,aAAaY,GAIpB,OAGF,SAASC,YAAYC,GACnB,IAAI3pB,EAAWz5I,OAAOyZ,KAAK2pJ,GAAevwI,QAAO,CAAC/wB,EAAKqQ,KACrDrQ,EAAIqQ,GAWR,SAASkxJ,YAAYC,GACnB,OAAO,WAAgC,IAA/BlhJ,EAAKxf,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,IAAIsoC,GAAAA,IAAO6pF,EAAMnyH,UAAAzE,OAAA,EAAAyE,UAAA,QAAAX,EAC/B,IAAIqhK,EACF,OAAOlhJ,EAET,IAAImhJ,EAASD,EAAWvuC,EAAO5yH,MAC/B,GAAGohK,EAAO,CACR,MAAMx9J,EAAMy9J,iBAAiBD,EAAjBC,CAAwBphJ,EAAO2yG,GAG3C,OAAe,OAARhvH,EAAeqc,EAAQrc,CAChC,CACA,OAAOqc,CACT,CACF,CAzBeihJ,CAAYD,EAAcjxJ,IAC9BrQ,IACP,CAAC,GAEH,IAAI9B,OAAOyZ,KAAKggI,GAAUt7I,OACxB,OAAOsiK,KAGT,OAAOgD,EAAAA,GAAAA,GAAgBhqB,EACzB,CAdS0pB,CAHU/G,OAAO8G,GAASt/J,GACxBA,EAAI61I,WAGf,CA/T8B6oB,CAAa5mK,KAAK4lK,OAAOI,cACrD,CAMAtQ,OAAAA,CAAQliJ,GACN,IAAIw0J,EAASx0J,EAAK,GAAGy5B,cAAgBz5B,EAAKnO,MAAM,GAChD,OAAOs7J,UAAU3gK,KAAK4lK,OAAOI,cAAc,CAAC99J,EAAK0c,KAC7C,IAAI2pH,EAAQrmI,EAAIsL,GAChB,GAAG+6H,EACH,MAAO,CAAC,CAAC3pH,EAAUojJ,GAAUz5B,EAAM,GAEzC,CAEA05B,YAAAA,GACE,OAAOjoK,KAAK01J,QAAQ,YACtB,CAEAwS,UAAAA,GAGE,OAAOxH,OAFa1gK,KAAK01J,QAAQ,YAEHyS,GACrBxH,UAAUwH,GAAS,CAAC9uC,EAAQ+uC,KACjC,GAAG5H,KAAKnnC,GACN,MAAO,CAAC,CAAC+uC,GAAa/uC,EAAO,KAGrC,CAEAytC,yBAAAA,CAA0BrtC,GAAW,IAADvtB,EAAA,KAEhC,OAAOw0D,OADU1gK,KAAKqoK,gBAAgB5uC,IACV,CAAC0uC,EAASG,KACpC,IAAI75E,EAAWzuF,KAAK4lK,OAAOI,aAAasC,EAAgBjjK,MAAM,GAAG,IAAIkjK,YACnE,OAAG95E,EACMiyE,OAAOyH,GAAS,CAAC9uC,EAAQ+uC,KAC9B,IAAIjlJ,EAAOsrE,EAAS25E,GACpB,OAAIjlJ,GAIAhgB,MAAMuD,QAAQyc,KAChBA,EAAO,CAACA,IAEHA,EAAKgU,QAAO,CAACyvE,EAAK3xF,KACvB,IAAIuzJ,UAAY,WACd,OAAOvzJ,EAAG2xF,EAAKsF,EAAK20D,YAAb5rJ,IAA0B/N,UACnC,EACA,IAAIs5J,KAAKgI,WACP,MAAM,IAAI7jK,UAAU,8FAEtB,OAAOmjK,iBAAiBU,UAAU,GACjCnvC,GAAU19G,SAASnX,YAdb60H,CAcuB,IAG/B8uC,CAAO,GAEpB,CAEApB,2BAAAA,CAA4BzJ,EAAUuD,GAAY,IAAD/kB,EAAA,KAE7C,OAAO4kB,OADY1gK,KAAKyoK,kBAAkBnL,EAAUuD,IACtB,CAAC6H,EAAWC,KACxC,IAAIjqB,EAAY,CAACiqB,EAAkBtjK,MAAM,GAAI,IACzCopF,EAAWzuF,KAAK4lK,OAAOI,aAAatnB,GAAWkqB,cACjD,OAAGn6E,EACMiyE,OAAOgI,GAAW,CAACG,EAAUC,KAClC,IAAI3lJ,EAAOsrE,EAASq6E,GACpB,OAAI3lJ,GAIAhgB,MAAMuD,QAAQyc,KAChBA,EAAO,CAACA,IAEHA,EAAKgU,QAAO,CAACyvE,EAAK3xF,KACvB,IAAI8zJ,gBAAkB,WAAc,IAAD,IAAApwI,EAAAzxB,UAAAzE,OAATyhB,EAAI,IAAA/gB,MAAAw1B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1U,EAAI0U,GAAA1xB,UAAA0xB,GAC5B,OAAO3jB,EAAG2xF,EAAKk1C,EAAK+kB,YAAb5rJ,CAA0BqoJ,IAAWzxF,MAAM6yE,MAAex6H,EACnE,EACA,IAAIs8I,KAAKuI,iBACP,MAAM,IAAIpkK,UAAU,+FAEtB,OAAOokK,eAAe,GACrBF,GAAYltJ,SAASnX,YAdfqkK,CAcyB,IAGjCH,CAAS,GAEtB,CAEAM,SAAAA,CAAUtiJ,GACR,OAAOpiB,OAAOyZ,KAAK/d,KAAK4lK,OAAOI,cAAc7uI,QAAO,CAAC/wB,EAAKqQ,KACxDrQ,EAAIqQ,GAAOiQ,EAAM/a,IAAI8K,GACdrQ,IACN,CAAC,EACN,CAEA4gK,cAAAA,CAAe1J,GACb,OAAOh5J,OAAOyZ,KAAK/d,KAAK4lK,OAAOI,cAAc7uI,QAAO,CAAC/wB,EAAKqQ,KACtDrQ,EAAIqQ,GAAO,IAAK6mJ,IAAW3xJ,IAAI8K,GAC5BrQ,IACN,CAAC,EACJ,CAEA6gK,KAAAA,GACE,MAAO,CACLhyJ,GAAIjV,KAAK4lK,OAAO3wJ,GAEpB,CAEAmyJ,aAAAA,CAAczqH,GACZ,MAAMtyC,EAAMrK,KAAK4lK,OAAOE,WAAWnpH,GAEnC,OAAGx5C,MAAMuD,QAAQ2D,GACRA,EAAI8sB,QAAO,CAAC8xI,EAAKn3I,IACfA,EAAQm3I,EAAKjpK,KAAK6gK,oBAGL,IAAdlkH,EACD38C,KAAK4lK,OAAOE,WAAWnpH,GAGzB38C,KAAK4lK,OAAOE,UACrB,CAEA2C,iBAAAA,CAAkBnL,EAAUuD,GAC1B,OAAOH,OAAO1gK,KAAKioK,gBAAgB,CAAC7hK,EAAKqQ,KACvC,IAAIioI,EAAY,CAACjoI,EAAIpR,MAAM,GAAI,IAG/B,OAAOq7J,OAAOt6J,GAAM6O,GACX,WAAc,IAAD,IAAA4jB,EAAA3xB,UAAAzE,OAATyhB,EAAI,IAAA/gB,MAAA01B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ5U,EAAI4U,GAAA5xB,UAAA4xB,GACb,IAAIzuB,EAAMy9J,iBAAiB7yJ,GAAIjK,MAAM,KAAM,CAJnBsyJ,IAAWzxF,MAAM6yE,MAIwBx6H,IAMjE,MAHmB,mBAAT7Z,IACRA,EAAMy9J,iBAAiBz9J,EAAjBy9J,CAAsBjH,MAEvBx2J,CACT,GACA,GAEN,CAEAg+J,eAAAA,CAAgB5uC,GAEdA,EAAWA,GAAYz5H,KAAKsmK,WAAW7sC,SAEvC,MAAM0uC,EAAUnoK,KAAKkoK,aAEfnnJ,QAAUmoJ,GACY,mBAAdA,EACHxI,OAAOwI,GAAS7vI,GAAQtY,QAAQsY,KAGlC,WACL,IAAIggG,EAAS,KACb,IACEA,EAAS6vC,KAAShiK,UACpB,CACA,MAAOoE,GACL+tH,EAAS,CAAC5yH,KAAM03J,GAAgB3yJ,OAAO,EAAMssF,SAASirD,EAAAA,GAAAA,gBAAez3I,GACvE,CAAC,QAEC,OAAO+tH,CACT,CACF,EAGF,OAAOqnC,OAAOyH,GAASnK,GLmT3B,SAASmL,mBAAmBC,EAAgB3vC,GAC1C,GAA8B,mBAAnB2vC,EACT,OAAOrL,kBAAkBqL,EAAgB3vC,GAG3C,GAA8B,iBAAnB2vC,GAAkD,OAAnBA,EACxC,MAAM,IAAI/lK,MAA8C+4J,uBAAuB,KAGjF,IAAIiN,EAAsB,CAAC,EAE3B,IAAK,IAAI5yJ,KAAO2yJ,EAAgB,CAC9B,IAAIpL,EAAgBoL,EAAe3yJ,GAEN,mBAAlBunJ,IACTqL,EAAoB5yJ,GAAOsnJ,kBAAkBC,EAAevkC,GAEhE,CAEA,OAAO4vC,CACT,CKvU4CF,CAAoBpoJ,QAASi9I,GAAiBvkC,IACxF,CAEA6vC,kBAAAA,GACE,MAAO,IACEhlK,OAAOwX,OAAO,CAAC,EAAG9b,KAAK6gK,YAElC,CAEA0I,qBAAAA,CAAsBC,GACpB,OAAQ/vC,GACCpkG,KAAW,CAAC,EAAGr1B,KAAK8mK,0BAA0BrtC,GAAWz5H,KAAKinK,QAASuC,EAElF,EAIF,SAAS/C,eAAezuH,EAASkuH,EAASuD,GACxC,GAAGrtJ,SAAS47B,KAAatxC,QAAQsxC,GAC/B,OAAOigB,KAAM,CAAC,EAAGjgB,GAGnB,GAAGugC,OAAOvgC,GACR,OAAOyuH,eAAezuH,EAAQkuH,GAAUA,EAASuD,GAGnD,GAAG/iK,QAAQsxC,GAAU,CACnB,MAAMm8F,EAAwC,UAAjCs1B,EAAcC,eAA6BxD,EAAQkB,gBAAkB,CAAC,EAEnF,OAAOpvH,EACN5hB,KAAI2tB,GAAU0iH,eAAe1iH,EAAQmiH,EAASuD,KAC9CtyI,OAAOuvI,aAAcvyB,EACxB,CAEA,MAAO,CAAC,CACV,CAEA,SAASwyB,cAAc3uH,EAAS4tH,GAA6B,IAArB,UAAE+D,GAAWziK,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,CAAC,EACnD0iK,EAAkBD,EAQtB,OAPGvtJ,SAAS47B,KAAatxC,QAAQsxC,IACC,mBAAtBA,EAAQ6xH,YAChBD,GAAkB,EAClB9B,iBAAiB9vH,EAAQ6xH,WAAWxhK,KAAKrI,KAAM4lK,IAIhDrtF,OAAOvgC,GACD2uH,cAAct+J,KAAKrI,KAAMg4C,EAAQ4tH,GAASA,EAAQ,CAAE+D,UAAWC,IAErEljK,QAAQsxC,GACFA,EAAQ5hB,KAAI2tB,GAAU4iH,cAAct+J,KAAKrI,KAAM+jD,EAAQ6hH,EAAQ,CAAE+D,UAAWC,MAG9EA,CACT,CAKA,SAASlD,eAA+B,IAAlBvyB,EAAIjtI,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAC,CAAC,EAAG0N,EAAG1N,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAC,CAAC,EAElC,IAAIkV,SAAS+3H,GACX,MAAO,CAAC,EAEV,IAAI/3H,SAASxH,GACX,OAAOu/H,EAKNv/H,EAAIk1J,iBACLpJ,OAAO9rJ,EAAIk1J,gBAAgB,CAACC,EAAWtzJ,KACrC,MAAMwyJ,EAAM90B,EAAK2xB,YAAc3xB,EAAK2xB,WAAWrvJ,GAC5CwyJ,GAAO9lK,MAAMuD,QAAQuiK,IACtB90B,EAAK2xB,WAAWrvJ,GAAOwyJ,EAAI78J,OAAO,CAAC29J,WAC5Bn1J,EAAIk1J,eAAerzJ,IAClBwyJ,IACR90B,EAAK2xB,WAAWrvJ,GAAO,CAACwyJ,EAAKc,UACtBn1J,EAAIk1J,eAAerzJ,GAC5B,IAGEnS,OAAOyZ,KAAKnJ,EAAIk1J,gBAAgBrnK,eAI3BmS,EAAIk1J,gBAQf,MAAM,aAAE9D,GAAiB7xB,EACzB,GAAG/3H,SAAS4pJ,GACV,IAAI,IAAIphJ,KAAaohJ,EAAc,CACjC,MAAMgE,EAAehE,EAAaphJ,GAClC,IAAIxI,SAAS4tJ,GACX,SAGF,MAAM,YAAEzB,EAAW,cAAEK,GAAkBoB,EAGvC,GAAI5tJ,SAASmsJ,GACX,IAAI,IAAIH,KAAcG,EAAa,CACjC,IAAIlvC,EAASkvC,EAAYH,GAGrBjlK,MAAMuD,QAAQ2yH,KAChBA,EAAS,CAACA,GACVkvC,EAAYH,GAAc/uC,GAGzBzkH,GAAOA,EAAIoxJ,cAAgBpxJ,EAAIoxJ,aAAaphJ,IAAchQ,EAAIoxJ,aAAaphJ,GAAW2jJ,aAAe3zJ,EAAIoxJ,aAAaphJ,GAAW2jJ,YAAYH,KAC9IxzJ,EAAIoxJ,aAAaphJ,GAAW2jJ,YAAYH,GAAcG,EAAYH,GAAYh8J,OAAOwI,EAAIoxJ,aAAaphJ,GAAW2jJ,YAAYH,IAGjI,CAIF,GAAIhsJ,SAASwsJ,GACX,IAAI,IAAIE,KAAgBF,EAAe,CACrC,IAAIC,EAAWD,EAAcE,GAGzB3lK,MAAMuD,QAAQmiK,KAChBA,EAAW,CAACA,GACZD,EAAcE,GAAgBD,GAG7Bj0J,GAAOA,EAAIoxJ,cAAgBpxJ,EAAIoxJ,aAAaphJ,IAAchQ,EAAIoxJ,aAAaphJ,GAAWgkJ,eAAiBh0J,EAAIoxJ,aAAaphJ,GAAWgkJ,cAAcE,KAClJl0J,EAAIoxJ,aAAaphJ,GAAWgkJ,cAAcE,GAAgBF,EAAcE,GAAc18J,OAAOwI,EAAIoxJ,aAAaphJ,GAAWgkJ,cAAcE,IAG3I,CAEJ,CAGF,OAAOzzI,KAAW8+G,EAAMv/H,EAC1B,CAsCA,SAASkzJ,iBAAiB7yJ,GAEjB,IAFqB,UAC5Bg1J,GAAY,GACb/iK,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,CAAC,EACH,MAAiB,mBAAP+N,EACDA,EAGF,WACL,IAAK,IAAD,IAAAi1J,EAAAhjK,UAAAzE,OADayhB,EAAI,IAAA/gB,MAAA+mK,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJjmJ,EAAIimJ,GAAAjjK,UAAAijK,GAEnB,OAAOl1J,EAAG5M,KAAKrI,QAASkkB,EAC1B,CAAE,MAAM5Y,GAIN,OAHG2+J,GACD1+J,QAAQC,MAAMF,GAET,IACT,CACF,CACF,gEC1eO,MAAM8+J,GAAkB,aAClBC,GAAY,YACZC,GAAS,SACTC,GAAuB,uBACvBC,GAAmB,mBACnBC,GAAW,WACXC,GAAiB,iBACjBC,GAAwB,wBAI9B,SAASC,gBAAgB9yE,GAC9B,MAAO,CACLrxF,KAAM2jK,GACNtyE,QAASA,EAEb,CAEO,SAAS+yE,UAAU/yE,GACxB,MAAO,CACLrxF,KAAM4jK,GACNvyE,QAASA,EAEb,CAEO,MAAMgzE,2BAA8BhzE,GAAY6lE,IAAwB,IAAtB,YAAEoN,GAAapN,EACtEoN,EAAYF,UAAU/yE,GACtBizE,EAAYC,8BAA8B,EAGrC,SAASC,OAAOnzE,GACrB,MAAO,CACLrxF,KAAM6jK,GACNxyE,QAASA,EAEb,CAEO,MAAMozE,wBAA2BpzE,GAAYilE,IAAwB,IAAtB,YAAEgO,GAAahO,EACnEgO,EAAYE,OAAOnzE,GACnBizE,EAAYC,8BAA8B,EAG/BG,qBAAwBrzE,GAAYszE,IAAoC,IAAlC,YAAEL,EAAW,WAAEM,GAAYD,GACxE,KAAEtW,EAAI,MAAG5sD,EAAK,QAAEojE,GAAYxzE,GAC5B,OAAE4nE,EAAM,KAAElsJ,GAASshJ,EACnB1hB,EAAOssB,EAAO/zJ,IAAI,eAGfuzJ,GAAIqM,wBAEG,eAATn4B,GAA0Bk4B,GAC7BD,EAAWtM,WAAY,CACrByM,OAAQh4J,EACRqK,OAAQ,OACRohD,MAAO,UACPvrD,QAAS,kHAIRw0F,EAAM18F,MACT6/J,EAAWtM,WAAW,CACpByM,OAAQh4J,EACRqK,OAAQ,OACRohD,MAAO,QACPvrD,QAASq5B,KAAKC,UAAUk7D,KAK5B6iE,EAAYU,iCAAiC,CAAE3W,OAAM5sD,SAAQ,EAIxD,SAASwjE,gBAAgB5zE,GAC9B,MAAO,CACLrxF,KAAM+jK,GACN1yE,QAASA,EAEb,CAGO,MAAM2zE,iCAAoC3zE,GAAY6zE,IAAwB,IAAtB,YAAEZ,GAAaY,EAC5EZ,EAAYW,gBAAgB5zE,GAC5BizE,EAAYC,8BAA8B,EAG/BY,kBAAsB9W,GAAU+W,IAAwB,IAAtB,YAAEd,GAAac,GACxD,OAAEnM,EAAM,KAAElsJ,EAAI,SAAEqhJ,EAAQ,SAAExsC,EAAQ,aAAEyjD,EAAY,SAAEC,EAAQ,aAAEC,GAAiBlX,EAC7EztB,EAAO,CACT4kC,WAAY,WACZC,MAAOpX,EAAKqX,OAAOlpK,KAjFA,KAkFnB4xJ,WACAxsC,YAGE+jD,EAAU,CAAC,EAEf,OAAQN,GACN,IAAK,gBAcT,SAASO,qBAAqBt/J,EAAQg/J,EAAUC,GACzCD,GACHznK,OAAOwX,OAAO/O,EAAQ,CAACu/J,UAAWP,IAG/BC,GACH1nK,OAAOwX,OAAO/O,EAAQ,CAACw/J,cAAeP,GAE1C,CArBMK,CAAqBhlC,EAAM0kC,EAAUC,GACrC,MAEF,IAAK,QACHI,EAAQI,cAAgB,SAAWrJ,WAAK4I,EAAW,IAAMC,GACzD,MACF,QACEzgK,QAAQ4O,KAAM,iCAAgC2xJ,oDAGlD,OAAOf,EAAY0B,iBAAiB,CAAEjyJ,KAAMipJ,cAAcp8B,GAAO7mI,IAAKk/J,EAAO/zJ,IAAI,YAAa6H,OAAM44J,UAAS5kE,MAfjG,CAAC,EAeuGstD,QAAM,EAarH,MAAM4X,qBAAyB5X,GAAU6X,IAAwB,IAAtB,YAAE5B,GAAa4B,GAC3D,OAAEjN,EAAM,OAAEyM,EAAM,KAAE34J,EAAI,SAAEu4J,EAAQ,aAAEC,GAAiBlX,EACnDsX,EAAU,CACZI,cAAe,SAAWrJ,WAAK4I,EAAW,IAAMC,IAE9C3kC,EAAO,CACT4kC,WAAY,qBACZC,MAAOC,EAAOlpK,KAxHK,MA2HrB,OAAO8nK,EAAY0B,iBAAiB,CAACjyJ,KAAMipJ,cAAcp8B,GAAO7zH,OAAMhT,IAAKk/J,EAAO/zJ,IAAI,YAAampJ,OAAMsX,WAAU,EAGxGQ,kCAAoCC,IAAA,IAAE,KAAE/X,EAAI,YAAEgY,GAAaD,EAAA,OAAME,IAAwB,IAAtB,YAAEhC,GAAagC,GACzF,OAAErN,EAAM,KAAElsJ,EAAI,SAAEu4J,EAAQ,aAAEC,EAAY,aAAEgB,GAAiBlY,EACzDztB,EAAO,CACT4kC,WAAY,qBACZ7oK,KAAM0xJ,EAAK1xJ,KACXkpK,UAAWP,EACXQ,cAAeP,EACfiB,aAAcH,EACdI,cAAeF,GAGjB,OAAOjC,EAAY0B,iBAAiB,CAACjyJ,KAAMipJ,cAAcp8B,GAAO7zH,OAAMhT,IAAKk/J,EAAO/zJ,IAAI,YAAampJ,QAAM,CAC1G,EAEYqY,2CAA6CC,IAAA,IAAE,KAAEtY,EAAI,YAAEgY,GAAaM,EAAA,OAAMC,IAAwB,IAAtB,YAAEtC,GAAasC,GAClG,OAAE3N,EAAM,KAAElsJ,EAAI,SAAEu4J,EAAQ,aAAEC,EAAY,aAAEgB,GAAiBlY,EACzDsX,EAAU,CACZI,cAAe,SAAWrJ,WAAK4I,EAAW,IAAMC,IAE9C3kC,EAAO,CACT4kC,WAAY,qBACZ7oK,KAAM0xJ,EAAK1xJ,KACXkpK,UAAWP,EACXkB,aAAcH,EACdI,cAAeF,GAGjB,OAAOjC,EAAY0B,iBAAiB,CAACjyJ,KAAMipJ,cAAcp8B,GAAO7zH,OAAMhT,IAAKk/J,EAAO/zJ,IAAI,YAAampJ,OAAMsX,WAAS,CACnH,EAEYK,iBAAqB9lK,GAAU2mK,IAAiG,IAKvIC,GALwC,GAAEt4J,EAAE,WAAEiyJ,EAAU,YAAE6D,EAAW,WAAEM,EAAU,cAAEmC,EAAa,cAAEC,EAAa,cAAEC,GAAeJ,GAChI,KAAE9yJ,EAAI,MAAEgtF,EAAM,CAAC,EAAC,QAAE4kE,EAAQ,CAAC,EAAC,KAAE54J,GAAI,IAAEhT,GAAG,KAAEs0J,IAASnuJ,GAElD,4BAAEgnK,IAAgCD,EAAcxG,cAAgB,CAAC,EAIrE,GAAIuG,EAAchO,SAAU,CAC1B,IAAImO,EAAiBJ,EAAcK,qBAAqBL,EAAcM,kBACtEP,EAAYQ,KAASvtK,GAAKotK,GAAgB,EAC5C,MACEL,EAAYQ,KAASvtK,GAAKitK,EAAcjtK,OAAO,GAGP,iBAAhCmtK,KACRJ,EAAU/lE,MAAQljG,OAAOwX,OAAO,CAAC,EAAGyxJ,EAAU/lE,MAAOmmE,KAGvD,MAAMK,GAAWT,EAAUvmK,WAE3B,IAAIinK,GAAW3pK,OAAOwX,OAAO,CAC3B,OAAS,oCACT,eAAgB,oCAChB,mBAAoB,kBACnBswJ,GAEHn3J,EAAGi5J,MAAM,CACP1tK,IAAKwtK,GACLvyJ,OAAQ,OACR2wJ,QAAS6B,GACTzmE,MAAOA,EACPhtF,KAAMA,EACN2zJ,mBAAoBjH,IAAaiH,mBACjCC,oBAAqBlH,IAAakH,sBAEnCzsC,MAAK,SAAUnrF,GACd,IAAI0xD,EAAQn7D,KAAKp2B,MAAM6/B,EAAS7vC,MAC5B6E,EAAQ08F,IAAWA,EAAM18F,OAAS,IAClC6iK,EAAanmE,IAAWA,EAAMmmE,YAAc,IAE1C73H,EAAS+vF,GAUV/6H,GAAS6iK,EACZhD,EAAWtM,WAAW,CACpByM,OAAQh4J,GACRyrD,MAAO,QACPphD,OAAQ,OACRnK,QAASq5B,KAAKC,UAAUk7D,KAK5B6iE,EAAYU,iCAAiC,CAAE3W,QAAM5sD,UAnBnDmjE,EAAWtM,WAAY,CACrByM,OAAQh4J,GACRyrD,MAAO,QACPphD,OAAQ,OACRnK,QAAS8iC,EAAS83H,YAgBxB,IACCC,OAAMjjK,IACL,IACIoI,EADM,IAAIrQ,MAAMiI,GACFoI,QAKlB,GAAIpI,EAAEkrC,UAAYlrC,EAAEkrC,SAAS7vC,KAAM,CACjC,MAAM6nK,EAAUljK,EAAEkrC,SAAS7vC,KAC3B,IACE,MAAM8nK,EAAkC,iBAAZD,EAAuBzhI,KAAKp2B,MAAM63J,GAAWA,EACrEC,EAAajjK,QACfkI,GAAY,YAAW+6J,EAAajjK,SAClCijK,EAAaC,oBACfh7J,GAAY,kBAAiB+6J,EAAaC,oBAC9C,CAAE,MAAOC,GACP,CAEJ,CACAtD,EAAWtM,WAAY,CACrByM,OAAQh4J,GACRyrD,MAAO,QACPphD,OAAQ,OACRnK,QAASA,GACR,GACH,EAGG,SAASk7J,cAAc92E,GAC5B,MAAO,CACLrxF,KAAMikK,GACN5yE,QAASA,EAEb,CAEO,SAAS+2E,qBAAqB/2E,GACnC,MAAO,CACLrxF,KAAMkkK,GACN7yE,QAASA,EAEb,CAEO,MAAMkzE,6BAA+BA,IAAM8D,IAAsC,IAApC,cAAEpB,EAAa,WAAExG,GAAY4H,EAG/E,IAFgB5H,IAEH6H,qBAAsB,OAGnC,MAAMC,EAAatB,EAAcsB,aAAallG,OAC9CsrF,aAAa6Z,QAAQ,aAAcliI,KAAKC,UAAUgiI,GAAY,EAGnDE,UAAYA,CAAC1uK,EAAK+qK,IAA4B,KACzDrM,GAAIqM,wBAA0BA,EAE9BrM,GAAInxI,KAAKvtB,EAAI,EClRf,IACE,CAAC4pK,IAAkB,CAAC1jJ,EAAKi3I,KAAmB,IAAjB,QAAE7lE,GAAS6lE,EACpC,OAAOj3I,EAAMna,IAAK,kBAAmBurF,EAAS,EAGhD,CAACuyE,IAAY,CAAC3jJ,EAAKq2I,KAAmB,IAAjB,QAAEjlE,GAASilE,EAC1BoS,GAAa97G,EAAAA,GAAAA,QAAOykC,GACpB1hE,EAAM1P,EAAM/a,IAAI,gBAAiB6jC,EAAAA,GAAAA,OAwBrC,OArBA2/H,EAAWl+G,WAAW/kC,SAASk/I,IAAwB,IAArB30J,EAAK24J,GAAUhE,EAC/C,IAAK7yF,OAAO62F,EAASvjG,OACnB,OAAOnlD,EAAMna,IAAI,aAAc6pB,GAEjC,IAAI3vB,EAAO2oK,EAASvjG,MAAM,CAAC,SAAU,SAErC,GAAc,WAATplE,GAA8B,SAATA,EACxB2vB,EAAMA,EAAI7pB,IAAIkK,EAAK24J,QACd,GAAc,UAAT3oK,EAAmB,CAC7B,IAAIouJ,EAAWua,EAASvjG,MAAM,CAAC,QAAS,aACpCw8C,EAAW+mD,EAASvjG,MAAM,CAAC,QAAS,aAExCz1C,EAAMA,EAAIkhC,MAAM,CAAC7gD,EAAK,SAAU,CAC9Bo+I,SAAUA,EACVwa,OAAQ,SAAWlM,WAAKtO,EAAW,IAAMxsC,KAG3CjyF,EAAMA,EAAIkhC,MAAM,CAAC7gD,EAAK,UAAW24J,EAASzjK,IAAI,UAChD,KAGK+a,EAAMna,IAAK,aAAc6pB,EAAK,EAGvC,CAACo0I,IAAmB,CAAC9jJ,EAAKilJ,KAAmB,IAEvC2D,GAFsB,QAAEx3E,GAAS6zE,GACjC,KAAE7W,EAAI,MAAE5sD,GAAUpQ,EAGtBg9D,EAAK5sD,MAAQ5jG,OAAOwX,OAAO,CAAC,EAAGosF,GAC/BonE,GAAaj8G,EAAAA,GAAAA,QAAOyhG,GAEpB,IAAI1+H,EAAM1P,EAAM/a,IAAI,gBAAiB6jC,EAAAA,GAAAA,OAGrC,OAFApZ,EAAMA,EAAI7pB,IAAI+iK,EAAW3jK,IAAI,QAAS2jK,GAE/B5oJ,EAAMna,IAAK,aAAc6pB,EAAK,EAGvC,CAACk0I,IAAS,CAAC5jJ,EAAKmlJ,KAAmB,IAAjB,QAAE/zE,GAAS+zE,EACvBtuJ,EAASmJ,EAAM/a,IAAI,cAAcqrD,eAAeg4G,IAChDl3E,EAAQ5rE,SAAS4oI,IACfka,EAAWl9H,OAAOgjH,EAAK,GACvB,IAGN,OAAOpuI,EAAMna,IAAI,aAAcgR,EAAO,EAGxC,CAACmtJ,IAAiB,CAAChkJ,EAAKimJ,KAAmB,IAAjB,QAAE70E,GAAS60E,EACnC,OAAOjmJ,EAAMna,IAAI,UAAWurF,EAAQ,EAGtC,CAAC6yE,IAAwB,CAACjkJ,EAAKmmJ,KAAmB,IAAjB,QAAE/0E,GAAS+0E,EAC1C,OAAOnmJ,EAAMna,IAAI,cAAc8mD,EAAAA,GAAAA,QAAOykC,EAAQk3E,YAAY,GCxE9D,IAAIO,GAAY,YAgFT,IAAIC,GAAuB,SAASA,qBAAqBvjK,EAAG/F,GACjE,OAAO+F,IAAM/F,CACf,EAqBO,SAASupK,eAAex5J,EAAMy5J,GACnC,IAAIC,EAAoD,iBAA3BD,EAAsCA,EAAyB,CAC1FE,cAAeF,GAEbG,EAAwBF,EAAgBC,cACxCA,OAA0C,IAA1BC,EAAmCL,GAAuBK,EAC1EC,EAAwBH,EAAgBpuG,QACxCA,OAAoC,IAA1BuuG,EAAmC,EAAIA,EACjDC,EAAsBJ,EAAgBI,oBACtCn3G,EA7BC,SAASo3G,yBAAyBJ,GACvC,OAAO,SAASK,2BAA2B74I,EAAM9O,GAC/C,GAAa,OAAT8O,GAA0B,OAAT9O,GAAiB8O,EAAK30B,SAAW6lB,EAAK7lB,OACzD,OAAO,EAMT,IAFA,IAAIA,EAAS20B,EAAK30B,OAETV,EAAI,EAAGA,EAAIU,EAAQV,IAC1B,IAAK6tK,EAAcx4I,EAAKr1B,GAAIumB,EAAKvmB,IAC/B,OAAO,EAIX,OAAO,CACT,CACF,CAYmBiuK,CAAyBJ,GACtC38G,EAAoB,IAAZsO,EA/Gd,SAAS2uG,qBAAqBtjK,GAC5B,IAAIumD,EACJ,MAAO,CACLxnD,IAAK,SAASA,IAAI8K,GAChB,OAAI08C,GAASvmD,EAAOumD,EAAM18C,IAAKA,GACtB08C,EAAMruD,MAGRyqK,EACT,EACAY,IAAK,SAASA,IAAI15J,EAAK3R,GACrBquD,EAAQ,CACN18C,IAAKA,EACL3R,MAAOA,EAEX,EACAsrK,WAAY,SAASA,aACnB,OAAOj9G,EAAQ,CAACA,GAAS,EAC3B,EACAthB,MAAO,SAASA,QACdshB,OAAQ5sD,CACV,EAEJ,CAwF8B2pK,CAAqBt3G,GAtFnD,SAASy3G,eAAe9uG,EAAS30D,GAC/B,IAAIoe,EAAU,GAEd,SAASrf,IAAI8K,GACX,IAAI65J,EAAatlJ,EAAQmuB,WAAU,SAAUga,GAC3C,OAAOvmD,EAAO6J,EAAK08C,EAAM18C,IAC3B,IAEA,GAAI65J,GAAc,EAAG,CACnB,IAAIn9G,EAAQnoC,EAAQslJ,GAOpB,OALIA,EAAa,IACftlJ,EAAQslB,OAAOggI,EAAY,GAC3BtlJ,EAAQye,QAAQ0pB,IAGXA,EAAMruD,KACf,CAGA,OAAOyqK,EACT,CAwBA,MAAO,CACL5jK,IACAwkK,IAxBF,SAASA,IAAI15J,EAAK3R,GACZ6G,IAAI8K,KAAS84J,KAEfvkJ,EAAQye,QAAQ,CACdhzB,IAAKA,EACL3R,MAAOA,IAGLkmB,EAAQvoB,OAAS8+D,GACnBv2C,EAAQ+M,MAGd,EAaEq4I,WAXF,SAASA,aACP,OAAOplJ,CACT,EAUE6mB,MARF,SAASA,QACP7mB,EAAU,EACZ,EAQF,CAmCiEqlJ,CAAe9uG,EAAS3I,GAEvF,SAASw4B,WACP,IAAItsF,EAAQmuD,EAAMtnD,IAAIzE,WAEtB,GAAIpC,IAAUyqK,GAAW,CAIvB,GAFAzqK,EAAQmR,EAAKjL,MAAM,KAAM9D,WAErB6oK,EAAqB,CACvB,IACIQ,EADUt9G,EAAMm9G,aACQrtH,MAAK,SAAUoQ,GACzC,OAAO48G,EAAoB58G,EAAMruD,MAAOA,EAC1C,IAEIyrK,IACFzrK,EAAQyrK,EAAczrK,MAE1B,CAEAmuD,EAAMk9G,IAAIjpK,UAAWpC,EACvB,CAEA,OAAOA,CACT,CAMA,OAJAssF,SAASo/E,WAAa,WACpB,OAAOv9G,EAAMphB,OACf,EAEOu/C,QACT,CChIO,SAASq/E,sBAAsB9nF,GACpC,IAAK,IAAIhwD,EAAOzxB,UAAUzE,OAAQiuK,EAAyB,IAAIvtK,MAAMw1B,EAAO,EAAIA,EAAO,EAAI,GAAIC,EAAO,EAAGA,EAAOD,EAAMC,IACpH83I,EAAuB93I,EAAO,GAAK1xB,UAAU0xB,GAiF/C,OA9EqB,SAAS+3I,iBAC5B,IAAK,IAAI93I,EAAQ3xB,UAAUzE,OAAQy7J,EAAQ,IAAI/6J,MAAM01B,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IACrFolI,EAAMplI,GAAS5xB,UAAU4xB,GAG3B,IAEI83I,EAFAC,EAAkB,EAOlBC,EAAwB,CAC1BC,oBAAgBxqK,GAGdyqK,EAAa9S,EAAMnmI,MAQvB,GAN0B,iBAAfi5I,IACTF,EAAwBE,EAExBA,EAAa9S,EAAMnmI,OAGK,mBAAfi5I,EACT,MAAM,IAAI3tK,MAAM,qFAAuF2tK,EAAa,KAKtH,IACIC,EADwBH,EACuBC,eAC/CA,OAA4C,IAA3BE,EAAoCP,EAAyBO,EAM9EC,EAAsB/tK,MAAMuD,QAAQqqK,GAAkBA,EAAiB,CAACA,GACxEt+C,EA3DR,SAAS0+C,gBAAgBjT,GACvB,IAAIzrC,EAAetvH,MAAMuD,QAAQw3J,EAAM,IAAMA,EAAM,GAAKA,EAExD,IAAKzrC,EAAa9+E,OAAM,SAAUy9H,GAChC,MAAsB,mBAARA,CAChB,IAAI,CACF,IAAIC,EAAkB5+C,EAAar8F,KAAI,SAAUg7I,GAC/C,MAAsB,mBAARA,EAAqB,aAAeA,EAAI59J,MAAQ,WAAa,YAAc49J,CAC3F,IAAGnuK,KAAK,MACR,MAAM,IAAII,MAAM,kGAAoGguK,EAAkB,IACxI,CAEA,OAAO5+C,CACT,CA8CuB0+C,CAAgBjT,GAC/BoT,GAAqB3oF,EAAQ39E,WAAM,EAAQ,CAAC,SAASumK,uBAGvD,OAFAV,IAEOG,EAAWhmK,MAAM,KAAM9D,UAChC,GAAGkF,OAAO8kK,IAENrI,GAAWlgF,GAAQ,SAAS6oF,sBAI9B,IAHA,IAAIC,EAAS,GACThvK,EAASgwH,EAAahwH,OAEjBV,EAAI,EAAGA,EAAIU,EAAQV,IAG1B0vK,EAAO3uK,KAAK2vH,EAAa1wH,GAAGiJ,MAAM,KAAM9D,YAK1C,OADA0pK,EAAcU,GAAmBtmK,MAAM,KAAMymK,EAE/C,IAeA,OAdAntK,OAAOwX,OAAO+sJ,GAAU,CACtBmI,WAAYA,EACZM,mBAAoBA,GACpB7+C,aAAcA,EACdi/C,WAAY,SAASA,aACnB,OAAOd,CACT,EACAe,eAAgB,SAASA,iBACvB,OAAOd,CACT,EACAe,oBAAqB,SAASA,sBAC5B,OAAOf,EAAkB,CAC3B,IAEKhI,EACT,CAIF,CACO,IAAI8H,GAAgCF,sBAAsBhB,gBCpGjE,MAAM/oJ,MAAQA,GAASA,EAEVmrJ,GAAmBlB,GAC5BjqJ,OACAouI,GAAQA,EAAKnpJ,IAAK,qBAGTmmK,GAAyBnB,GAClCjqJ,OACA,IAAMi3I,IAA0B,IAAxB,cAAE8P,GAAe9P,EACnBoU,EAActE,EAAcuE,wBAAyBxiI,EAAAA,GAAAA,KAAI,CAAC,GAC1DnjC,GAAOqxD,EAAAA,GAAAA,QAUX,OAPAq0G,EAAY9gH,WAAW/kC,SAAS6wI,IAAmB,IAAhBtmJ,EAAKvO,GAAK60J,EACvC3mI,GAAMoZ,EAAAA,GAAAA,OAEVpZ,EAAMA,EAAI7pB,IAAIkK,EAAKvO,GACnBmE,EAAOA,EAAKvJ,KAAKszB,EAAI,IAGhB/pB,CAAI,IAKJ4lK,sBAAwBA,CAAEvrJ,EAAOyoJ,IAAgB/D,IAA0B,IAAxB,cAAEqC,GAAerC,EAC/E7/J,QAAQ4O,KAAK,+FACb,IAAI63J,EAAsBvE,EAAcuE,sBACpCz0J,GAASmgD,EAAAA,GAAAA,QA0Bb,OAxBAyxG,EAAWloG,WAAW/6C,SAAU6C,IAC9B,IAAIqH,GAAMoZ,EAAAA,GAAAA,OACVzgB,EAAMkiC,WAAW/kC,SAASy/I,IAAqB,IAEzCuG,GAFsB1+J,EAAM24J,GAAOR,EACnC1P,EAAa+V,EAAoBrmK,IAAI6H,GAGT,WAA3ByoJ,EAAWtwJ,IAAI,SAAwBwgK,EAAOrlK,OACjDorK,EAAgBjW,EAAWtwJ,IAAI,UAE/BumK,EAAcnqG,SAAS77C,SAAUzV,IACzB01J,EAAOt3H,SAASp+B,KACpBy7J,EAAgBA,EAAcpgI,OAAOr7B,GACvC,IAGFwlJ,EAAaA,EAAW1vJ,IAAI,gBAAiB2lK,IAG/C97I,EAAMA,EAAI7pB,IAAIiH,EAAMyoJ,EAAW,IAGjC1+I,EAASA,EAAOza,KAAKszB,EAAI,IAGpB7Y,CAAM,EAGF40J,2BAA6B,SAACzrJ,GAAK,IAAEyoJ,EAAUjoK,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,IAAGw2D,EAAAA,GAAAA,QAAM,OAAKmuG,IAAwB,IAAvB,cAAE6B,GAAe7B,EAC1F,MAAMuG,EAAiB1E,EAAcoE,2BAA4Bp0G,EAAAA,GAAAA,QACjE,IAAIngD,GAASmgD,EAAAA,GAAAA,QAqBb,OApBA00G,EAAelmJ,SAAU+vI,IACvB,IAAImT,EAAWD,EAAWpsH,MAAKsvH,GAAOA,EAAI1mK,IAAIswJ,EAAWl0F,SAASp4D,WAC7Dy/J,IACHnT,EAAW/vI,SAAS,CAACiC,EAAO3a,KAC1B,GAA2B,WAAtB2a,EAAMxiB,IAAI,QAAuB,CACpC,MAAM2mK,EAAiBlD,EAASzjK,IAAI6H,GACpC,IAAI++J,EAAmBpkJ,EAAMxiB,IAAI,UAC7B+xD,GAAAA,KAAKG,OAAOy0G,IAAmB9iI,GAAAA,IAAIunB,MAAMw7G,KAC3CA,EAAiBxqG,SAAS77C,SAAUzV,IAC5B67J,EAAez9H,SAASp+B,KAC5B87J,EAAmBA,EAAiBzgI,OAAOr7B,GAC7C,IAEFwlJ,EAAaA,EAAW1vJ,IAAIiH,EAAM2a,EAAM5hB,IAAI,SAAUgmK,IAE1D,KAEFh1J,EAASA,EAAOza,KAAKm5J,GACvB,IAEK1+I,CAAM,CACd,EAEYyxJ,GAAa2B,GACtBjqJ,OACAouI,GAAQA,EAAKnpJ,IAAI,gBAAiB6jC,EAAAA,GAAAA,SAIzBgjI,aAAeA,CAAE9rJ,EAAOyoJ,IAAgBxC,IAA0B,IAAxB,cAAEe,GAAef,EAClEqC,EAAatB,EAAcsB,aAE/B,OAAItxG,GAAAA,KAAKG,OAAOsxG,KAIPA,EAAWrlG,OAAOtzC,QAAU44I,IAKV,IAFhB9qK,OAAOyZ,KAAKqxJ,GAAUh5I,KAAK3f,KACNu4J,EAAWrjK,IAAI8K,KACxCtV,SAAQ,KACVsB,OATI,IASE,EAGAykK,GAAayJ,GACtBjqJ,OACAouI,GAAQA,EAAKnpJ,IAAK,aC9GT8mK,QAAUA,CAAEC,EAAS/U,KAAA,IAAE,cAAE+P,EAAa,cAAED,GAAe9P,EAAA,OAAKZ,IAA0C,IAAzC,KAAErlJ,EAAI,OAAE+D,EAAM,UAAEk3J,EAAS,OAAEnJ,GAAQzM,EACvGoS,EAAa,CACfH,WAAYtB,EAAcsB,cAAgBtB,EAAcsB,aAAallG,OACrEioG,YAAatE,EAAcuE,uBAAyBvE,EAAcuE,sBAAsBloG,OACxF8oG,aAAenF,EAAc2B,YAAc3B,EAAc2B,WAAWtlG,QAGtE,OAAO4oG,EAAU,CAAEh7J,OAAM+D,SAAQk3J,YAAWxD,gBAAe3F,GAAS,CACrE,ECNY1N,OAASA,CAAC4W,EAAW9M,IAAY9tE,IAC5C,MAAM,WAAEovE,EAAU,YAAE6D,GAAgBnF,EAC9BC,EAAUqB,IAKhB,GAHAwL,EAAU56E,GAGN+tE,EAAQkJ,qBAAsB,CAChC,MAAMC,EAAa5Z,aAAayd,QAAQ,cACpC7D,GACFjE,EAAY8D,qBAAqB,CAC/BG,WAAYjiI,KAAKp2B,MAAMq4J,IAG7B,GCNWnE,uBAAYA,CAAC6H,EAAW9M,IAAY9tE,IAC/C46E,EAAU56E,GAIV,GAFgB8tE,EAAOsB,aAEV6H,qBAGb,IACE,OAAO,OAAErP,EAAM,MAAE56J,IAAWR,OAAOymB,OAAO+sE,GACpCg7E,EAAsC,WAAvBpT,EAAO/zJ,IAAI,QAC1BonK,EAAkC,WAArBrT,EAAO/zJ,IAAI,MACLmnK,GAAgBC,IAGvCj6J,SAASk6J,OAAU,GAAEtT,EAAO/zJ,IAAI,WAAW7G,2BAE/C,CAAE,MAAO0G,GACPD,QAAQC,MACN,2DACAA,EAEJ,GAGWy/J,oBAASA,CAACyH,EAAW9M,IAAY9tE,IAC5C,MAAM+tE,EAAUD,EAAOsB,aACjB8H,EAAapJ,EAAO8H,cAAcsB,aAGxC,IACMnJ,EAAQkJ,sBAAwB5rK,MAAMuD,QAAQoxF,IAChDA,EAAQ5rE,SAAS+mJ,IACf,MAAMne,EAAOka,EAAWrjK,IAAIsnK,EAAgB,CAAC,GACvCH,EAAkD,WAAnChe,EAAKjpF,MAAM,CAAC,SAAU,SACrCknG,EAA8C,WAAjCje,EAAKjpF,MAAM,CAAC,SAAU,OAGzC,GAFyBinG,GAAgBC,EAEnB,CACpB,MAAMG,EAAape,EAAKjpF,MAAM,CAAC,SAAU,SACzC/yD,SAASk6J,OAAU,GAAEE,uBACvB,IAGN,CAAE,MAAO1nK,GACPD,QAAQC,MACN,2DACAA,EAEJ,CAEAknK,EAAU56E,EAAQ,iECvDpB,MAAMq7E,qBAAqB7L,GAAAA,UACzB8L,eAAAA,CAAgB1sJ,EAAOyH,GAErB,MAAO,CAAEzH,QAAO2sJ,SADC9hF,KAAKpjE,EAAO7pB,OAAOyZ,KAAKoQ,EAAM0yI,cAEjD,CAEAxkH,MAAAA,GACE,MAAM,aAAEi3H,EAAY,SAAED,GAAarzK,KAAKmuB,MAClColJ,EAAWD,EAAa,YAE9B,OAAOhM,GAAAA,cAACiM,EAAaF,EACvB,EAQF,sBCnBA,MAAMG,uBAAuBlM,GAAAA,UAC3B8L,eAAAA,CAAgB1sJ,EAAOyH,GAErB,MAAO,CAAEzH,QAAO2sJ,SADC9hF,KAAKpjE,EAAO7pB,OAAOyZ,KAAKoQ,EAAM0yI,cAEjD,CAEAxkH,MAAAA,GACE,MAAM,aAAEi3H,EAAY,SAAED,GAAarzK,KAAKmuB,MAClCslJ,EAAaH,EAAa,cAEhC,OAAOhM,GAAAA,cAACmM,EAAeJ,EACzB,EAQF,wBChBe,gBACb,MAAO,CACLxJ,SAAAA,CAAUjE,GACR5lK,KAAK+lK,YAAc/lK,KAAK+lK,aAAe,CAAC,EACxC/lK,KAAK+lK,YAAY2N,UAAY9N,EAAOmF,YAAY6D,cAChD5uK,KAAK+lK,YAAY4N,mBAAqBA,mBAAmBl+J,KAAK,KAAMmwJ,GACpE5lK,KAAK+lK,YAAY6N,kBAAoBA,kBAAkBn+J,KAAK,KAAMmwJ,EACpE,EACAE,WAAY,CACVqN,aAAcA,GACdK,eAAgBA,GAChBK,sBAAuBV,GACvBW,wBAAyBN,IAE3BxN,aAAc,CACZlR,KAAM,CACJ/W,SAAQ,GACRoqB,QAAO,EACPO,UAAS,EACTH,YAAa,CACXsC,UAAWkJ,uBACX9I,OAAQ+I,sBAGZnO,QAAS,CACP0C,YAAa,CACXzM,SAGJmY,KAAM,CACJ1L,YAAa,CACXkK,WAKV,CAEO,SAASmB,kBAAkBhO,EAAQnvJ,EAAKo+I,EAAUxsC,GACvD,MACE0iD,aAAa,UAAEF,GACf4C,eAAe,SAAEyG,EAAQ,OAAEzU,IACzBmG,EAEEuO,EAAiB1U,IAAW,CAAC,aAAc,mBAAqB,CAAC,uBAEjEC,EAASwU,IAAWroG,MAAM,IAAIsoG,EAAgB19J,IAEpD,OAAIipJ,EAIGmL,EAAU,CACf,CAACp0J,GAAM,CACL3R,MAAO,CACL+vJ,WACAxsC,YAEFq3C,OAAQA,EAAO51F,UATV,IAYX,CAEO,SAAS6pG,mBAAmB/N,EAAQnvJ,EAAK3R,GAC9C,MACEimK,aAAa,UAAEF,GACf4C,eAAe,SAAEyG,EAAQ,OAAEzU,IACzBmG,EAEEuO,EAAiB1U,IAAW,CAAC,aAAc,mBAAqB,CAAC,uBAEjEC,EAASwU,IAAWroG,MAAM,IAAIsoG,EAAgB19J,IAEpD,OAAIipJ,EAIGmL,EAAU,CACf,CAACp0J,GAAM,CACL3R,QACA46J,OAAQA,EAAO51F,UANV,IASX,CC3FA,SAASsqG,UAAUC,GACjB,OAAO,MAAQA,CACjB,CAgDA,IAGIC,GAnBJ,SAASxvE,OAAO9/F,EAAQ4kC,GACtB,IAAiB2qI,EAAbh3J,EAAS,GAEb,IAAKg3J,EAAQ,EAAGA,EAAQ3qI,EAAO2qI,GAAS,EACtCh3J,GAAUvY,EAGZ,OAAOuY,CACT,EAYIi3J,GATJ,SAASC,eAAe9jJ,GACtB,OAAmB,IAAXA,GAAkB1nB,OAAOyrK,oBAAsB,EAAI/jJ,CAC7D,EAUIgkJ,GAAS,CACZP,UACAh4J,SAtDD,SAAS,iBAASi4J,GAChB,MAA2B,iBAAZA,GAAsC,OAAZA,CAC3C,EAqDC3iH,QAlDD,SAASA,QAAQkjH,GACf,OAAIzxK,MAAMuD,QAAQkuK,GAAkBA,EAC3BR,UAAUQ,GAAkB,GAE9B,CAAEA,EACX,EA8CC9vE,OAAQwvE,GACRG,eAAgBD,GAChB9hF,OA7CD,SAASA,OAAO3lF,EAAQ8Q,GACtB,IAAI/G,EAAOrU,EAAQgU,EAAKu0F,EAExB,GAAIntF,EAGF,IAAK/G,EAAQ,EAAGrU,GAFhBuoG,EAAa1mG,OAAOyZ,KAAKF,IAEWpb,OAAQqU,EAAQrU,EAAQqU,GAAS,EAEnE/J,EADA0J,EAAMu0F,EAAWl0F,IACH+G,EAAOpH,GAIzB,OAAO1J,CACT,GAsCA,SAAS8nK,YAAYC,EAAWrwE,GAC9B,IAAIswE,EAAQ,GAAIrhK,EAAUohK,EAAUE,QAAU,mBAE9C,OAAKF,EAAUl8J,MAEXk8J,EAAUl8J,KAAKpF,OACjBuhK,GAAS,OAASD,EAAUl8J,KAAKpF,KAAO,MAG1CuhK,GAAS,KAAOD,EAAUl8J,KAAKs9I,KAAO,GAAK,KAAO4e,EAAUl8J,KAAKq8J,OAAS,GAAK,KAE1ExwE,GAAWqwE,EAAUl8J,KAAKs8J,UAC7BH,GAAS,OAASD,EAAUl8J,KAAKs8J,SAG5BxhK,EAAU,IAAMqhK,GAZKrhK,CAa9B,CAGA,SAASyhK,gBAAgBH,EAAQp8J,GAE/BvV,MAAMgF,KAAKrI,MAEXA,KAAKwT,KAAO,gBACZxT,KAAKg1K,OAASA,EACdh1K,KAAK4Y,KAAOA,EACZ5Y,KAAK0T,QAAUmhK,YAAY70K,MAAM,GAG7BqD,MAAMue,kBAERve,MAAMue,kBAAkB5hB,KAAMA,KAAKoT,aAGnCpT,KAAKyT,OAAQ,IAAKpQ,OAASoQ,OAAS,EAExC,CAIA0hK,gBAAgB3wK,UAAYF,OAAO6kB,OAAO9lB,MAAMmB,WAChD2wK,gBAAgB3wK,UAAU4O,YAAc+hK,gBAGxCA,gBAAgB3wK,UAAUwC,SAAW,SAASA,SAASy9F,GACrD,OAAOzkG,KAAKwT,KAAO,KAAOqhK,YAAY70K,KAAMykG,EAC9C,EAGA,IAAIqwE,GAAYK,gBAGhB,SAASC,QAAQvvK,EAAQwvK,EAAWC,EAASh8J,EAAUi8J,GACrD,IAAIlsG,EAAO,GACPrJ,EAAO,GACPw1G,EAAgBrrK,KAAK6J,MAAMuhK,EAAgB,GAAK,EAYpD,OAVIj8J,EAAW+7J,EAAYG,IAEzBH,EAAY/7J,EAAWk8J,GADvBnsG,EAAO,SACqC5mE,QAG1C6yK,EAAUh8J,EAAWk8J,IAEvBF,EAAUh8J,EAAWk8J,GADrBx1G,EAAO,QACmCv9D,QAGrC,CACL9B,IAAK0oE,EAAOxjE,EAAOR,MAAMgwK,EAAWC,GAAS10K,QAAQ,MAAO,KAAOo/D,EACnE1zD,IAAKgN,EAAW+7J,EAAYhsG,EAAK5mE,OAErC,CAGA,SAAS2qJ,SAASpoJ,EAAQ8H,GACxB,OAAO6nK,GAAO7vE,OAAO,IAAKh4F,EAAM9H,EAAOvC,QAAUuC,CACnD,CAqEA,IAAIkwK,GAlEJ,SAASO,YAAY78J,EAAMhC,GAGzB,GAFAA,EAAUtS,OAAO6kB,OAAOvS,GAAW,OAE9BgC,EAAK/S,OAAQ,OAAO,KAEpB+Q,EAAQyqJ,YAAWzqJ,EAAQyqJ,UAAY,IACT,iBAAxBzqJ,EAAQ+lF,SAA0B/lF,EAAQ+lF,OAAc,GAChC,iBAAxB/lF,EAAQ8+J,cAA0B9+J,EAAQ8+J,YAAc,GAChC,iBAAxB9+J,EAAQ++J,aAA0B/+J,EAAQ++J,WAAc,GAQnE,IANA,IAGI90K,EAHAozC,EAAK,eACL2hI,EAAa,CAAE,GACfC,EAAW,GAEXC,GAAe,EAEXj1K,EAAQozC,EAAG3wB,KAAK1K,EAAK/S,SAC3BgwK,EAAS/yK,KAAKjC,EAAMiW,OACpB8+J,EAAW9yK,KAAKjC,EAAMiW,MAAQjW,EAAM,GAAG4B,QAEnCmW,EAAKU,UAAYzY,EAAMiW,OAASg/J,EAAc,IAChDA,EAAcF,EAAWnzK,OAAS,GAIlCqzK,EAAc,IAAGA,EAAcF,EAAWnzK,OAAS,GAEvD,IAAiBV,EAAGm0J,EAAhB34I,EAAS,GACTw4J,EAAe5rK,KAAKC,IAAIwO,EAAKs9I,KAAOt/I,EAAQ++J,WAAYE,EAASpzK,QAAQuE,WAAWvE,OACpF8yK,EAAgB3+J,EAAQyqJ,WAAazqJ,EAAQ+lF,OAASo5E,EAAe,GAEzE,IAAKh0K,EAAI,EAAGA,GAAK6U,EAAQ8+J,eACnBI,EAAc/zK,EAAI,GADcA,IAEpCm0J,EAAOkf,QACLx8J,EAAK/S,OACL+vK,EAAWE,EAAc/zK,GACzB8zK,EAASC,EAAc/zK,GACvB6W,EAAKU,UAAYs8J,EAAWE,GAAeF,EAAWE,EAAc/zK,IACpEwzK,GAEFh4J,EAASo3J,GAAO7vE,OAAO,IAAKluF,EAAQ+lF,QAAUywD,UAAUx0I,EAAKs9I,KAAOn0J,EAAI,GAAGiF,WAAY+uK,GACrF,MAAQ7f,EAAKv1J,IAAM,KAAO4c,EAQ9B,IALA24I,EAAOkf,QAAQx8J,EAAK/S,OAAQ+vK,EAAWE,GAAcD,EAASC,GAAcl9J,EAAKU,SAAUi8J,GAC3Fh4J,GAAUo3J,GAAO7vE,OAAO,IAAKluF,EAAQ+lF,QAAUywD,UAAUx0I,EAAKs9I,KAAO,GAAGlvJ,WAAY+uK,GAClF,MAAQ7f,EAAKv1J,IAAM,KACrB4c,GAAUo3J,GAAO7vE,OAAO,IAAKluF,EAAQ+lF,OAASo5E,EAAe,EAAI7f,EAAK5pJ,KAA5DqoK,MAEL5yK,EAAI,EAAGA,GAAK6U,EAAQ++J,cACnBG,EAAc/zK,GAAK8zK,EAASpzK,QADGV,IAEnCm0J,EAAOkf,QACLx8J,EAAK/S,OACL+vK,EAAWE,EAAc/zK,GACzB8zK,EAASC,EAAc/zK,GACvB6W,EAAKU,UAAYs8J,EAAWE,GAAeF,EAAWE,EAAc/zK,IACpEwzK,GAEFh4J,GAAUo3J,GAAO7vE,OAAO,IAAKluF,EAAQ+lF,QAAUywD,UAAUx0I,EAAKs9I,KAAOn0J,EAAI,GAAGiF,WAAY+uK,GACtF,MAAQ7f,EAAKv1J,IAAM,KAGvB,OAAO4c,EAAO3c,QAAQ,MAAO,GAC/B,EAKIo1K,GAA2B,CAC7B,OACA,QACA,UACA,YACA,aACA,YACA,YACA,gBACA,eACA,gBAGEC,GAAkB,CACpB,SACA,WACA,WA6CF,IAAIxvK,GA5BJ,SAASyvK,OAAO54J,EAAK1G,GAuBnB,GAtBAA,EAAUA,GAAW,CAAC,EAEtBtS,OAAOyZ,KAAKnH,GAASsV,SAAQ,SAAU1Y,GACrC,IAAgD,IAA5CwiK,GAAyB70K,QAAQqS,GACnC,MAAM,IAAIshK,GAAU,mBAAqBthK,EAAO,8BAAgC8J,EAAM,eAE1F,IAGAtd,KAAK4W,QAAgBA,EACrB5W,KAAKsd,IAAgBA,EACrBtd,KAAK+oB,KAAgBnS,EAAc,MAAc,KACjD5W,KAAKkoC,QAAgBtxB,EAAiB,SAAW,WAAc,OAAO,CAAM,EAC5E5W,KAAKokB,UAAgBxN,EAAmB,WAAS,SAAUjQ,GAAQ,OAAOA,CAAM,EAChF3G,KAAKqhG,WAAgBzqF,EAAoB,YAAQ,KACjD5W,KAAKmjE,UAAgBvsD,EAAmB,WAAS,KACjD5W,KAAKm2K,UAAgBv/J,EAAmB,WAAS,KACjD5W,KAAKo2K,cAAgBx/J,EAAuB,eAAK,KACjD5W,KAAKo8F,aAAgBxlF,EAAsB,cAAM,KACjD5W,KAAKq2K,MAAgBz/J,EAAe,QAAa,EACjD5W,KAAKs2K,aAnCP,SAASC,oBAAoBngJ,GAC3B,IAAI7Y,EAAS,CAAC,EAUd,OARY,OAAR6Y,GACF9xB,OAAOyZ,KAAKqY,GAAKlK,SAAQ,SAAU9S,GACjCgd,EAAIhd,GAAO8S,SAAQ,SAAU2kB,GAC3BtzB,EAAOxc,OAAO8vC,IAAUz3B,CAC1B,GACF,IAGKmE,CACT,CAuBuBg5J,CAAoB3/J,EAAsB,cAAK,OAExB,IAAxCq/J,GAAgB90K,QAAQnB,KAAK+oB,MAC/B,MAAM,IAAI+rJ,GAAU,iBAAmB90K,KAAK+oB,KAAO,uBAAyBzL,EAAM,eAEtF,EAUA,SAASi6B,YAAYmoH,EAAQlsJ,GAC3B,IAAI+J,EAAS,GAiBb,OAfAmiJ,EAAOlsJ,GAAM0Y,SAAQ,SAAUsqJ,GAC7B,IAAIC,EAAWl5J,EAAO9a,OAEtB8a,EAAO2O,SAAQ,SAAUwqJ,EAAcC,GACjCD,EAAap5J,MAAQk5J,EAAYl5J,KACjCo5J,EAAa3tJ,OAASytJ,EAAYztJ,MAClC2tJ,EAAaL,QAAUG,EAAYH,QAErCI,EAAWE,EAEf,IAEAp5J,EAAOk5J,GAAYD,CACrB,IAEOj5J,CACT,CAiCA,SAASq5J,SAAS3a,GAChB,OAAOj8J,KAAK0yF,OAAOupE,EACrB,CAGA2a,SAASpyK,UAAUkuF,OAAS,SAASA,OAAOupE,GAC1C,IAAI4a,EAAW,GACXC,EAAW,GAEf,GAAI7a,aAAsBx1J,GAExBqwK,EAASh0K,KAAKm5J,QAET,GAAI94J,MAAMuD,QAAQu1J,GAEvB6a,EAAWA,EAAS1qK,OAAO6vJ,OAEtB,KAAIA,IAAe94J,MAAMuD,QAAQu1J,EAAW4a,YAAa1zK,MAAMuD,QAAQu1J,EAAW6a,UAMvF,MAAM,IAAIhC,GAAU,oHAJhB7Y,EAAW4a,WAAUA,EAAWA,EAASzqK,OAAO6vJ,EAAW4a,WAC3D5a,EAAW6a,WAAUA,EAAWA,EAAS1qK,OAAO6vJ,EAAW6a,UAKjE,CAEAD,EAAS3qJ,SAAQ,SAAU6qJ,GACzB,KAAMA,aAAkBtwK,IACtB,MAAM,IAAIquK,GAAU,sFAGtB,GAAIiC,EAAOC,UAAgC,WAApBD,EAAOC,SAC5B,MAAM,IAAIlC,GAAU,mHAGtB,GAAIiC,EAAOV,MACT,MAAM,IAAIvB,GAAU,qGAExB,IAEAgC,EAAS5qJ,SAAQ,SAAU6qJ,GACzB,KAAMA,aAAkBtwK,IACtB,MAAM,IAAIquK,GAAU,qFAExB,IAEA,IAAIv3J,EAASjZ,OAAO6kB,OAAOytJ,SAASpyK,WASpC,OAPA+Y,EAAOs5J,UAAY72K,KAAK62K,UAAY,IAAIzqK,OAAOyqK,GAC/Ct5J,EAAOu5J,UAAY92K,KAAK82K,UAAY,IAAI1qK,OAAO0qK,GAE/Cv5J,EAAO05J,iBAAmB1/H,YAAYh6B,EAAQ,YAC9CA,EAAO25J,iBAAmB3/H,YAAYh6B,EAAQ,YAC9CA,EAAO45J,gBApFT,SAASC,aACP,IAWOtgK,EAAOrU,EAXV8a,EAAS,CACP85J,OAAQ,CAAC,EACTzC,SAAU,CAAC,EACX/nF,QAAS,CAAC,EACVmxC,SAAU,CAAC,EACXq4C,MAAO,CACLgB,OAAQ,GACRzC,SAAU,GACV/nF,QAAS,GACTmxC,SAAU,KAIlB,SAASs5C,YAAY7wK,GACfA,EAAK4vK,OACP94J,EAAO84J,MAAM5vK,EAAKsiB,MAAMjmB,KAAK2D,GAC7B8W,EAAO84J,MAAgB,SAAEvzK,KAAK2D,IAE9B8W,EAAO9W,EAAKsiB,MAAMtiB,EAAK6W,KAAOC,EAAiB,SAAE9W,EAAK6W,KAAO7W,CAEjE,CAEA,IAAKqQ,EAAQ,EAAGrU,EAASyE,UAAUzE,OAAQqU,EAAQrU,EAAQqU,GAAS,EAClE5P,UAAU4P,GAAOoV,QAAQorJ,aAE3B,OAAO/5J,CACT,CAyD4B65J,CAAW75J,EAAO05J,iBAAkB15J,EAAO25J,kBAE9D35J,CACT,EAGA,IAAImiJ,GAASkX,SAETj2K,GAAM,IAAI8F,GAAK,wBAAyB,CAC1CsiB,KAAM,SACN3E,UAAW,SAAUzd,GAAQ,OAAgB,OAATA,EAAgBA,EAAO,EAAI,IAG7DmsD,GAAM,IAAIrsD,GAAK,wBAAyB,CAC1CsiB,KAAM,WACN3E,UAAW,SAAUzd,GAAQ,OAAgB,OAATA,EAAgBA,EAAO,EAAI,IAG7DyvB,GAAM,IAAI3vB,GAAK,wBAAyB,CAC1CsiB,KAAM,UACN3E,UAAW,SAAUzd,GAAQ,OAAgB,OAATA,EAAgBA,EAAO,CAAC,CAAG,IAG7D4wK,GAAW,IAAI7X,GAAO,CACxBoX,SAAU,CACRn2K,GACAmyD,GACA18B,MAqBJ,IAAIohJ,GAAQ,IAAI/wK,GAAK,yBAA0B,CAC7CsiB,KAAM,SACNmf,QAnBF,SAASuvI,gBAAgB9wK,GACvB,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAImG,EAAMnG,EAAKlE,OAEf,OAAgB,IAARqK,GAAsB,MAATnG,GACL,IAARmG,IAAuB,SAATnG,GAA4B,SAATA,GAA4B,SAATA,EAC9D,EAaEyd,UAXF,SAASszJ,oBACP,OAAO,IACT,EAUEv0G,UARF,SAAS2tB,OAAOtyE,GACd,OAAkB,OAAXA,CACT,EAOE23J,UAAW,CACTwB,UAAW,WAAc,MAAO,GAAQ,EACxCC,UAAW,WAAc,MAAO,MAAQ,EACxCC,UAAW,WAAc,MAAO,MAAQ,EACxCC,UAAW,WAAc,MAAO,MAAQ,EACxCn6G,MAAW,WAAc,MAAO,EAAQ,GAE1Cy+B,aAAc,cAsBhB,IAAI6E,GAAO,IAAIx6F,GAAK,yBAA0B,CAC5CsiB,KAAM,SACNmf,QArBF,SAAS6vI,mBAAmBpxK,GAC1B,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAImG,EAAMnG,EAAKlE,OAEf,OAAgB,IAARqK,IAAuB,SAATnG,GAA4B,SAATA,GAA4B,SAATA,IAC5C,IAARmG,IAAuB,UAATnG,GAA6B,UAATA,GAA6B,UAATA,EAChE,EAeEyd,UAbF,SAAS4zJ,qBAAqBrxK,GAC5B,MAAgB,SAATA,GACS,SAATA,GACS,SAATA,CACT,EAUEw8D,UARF,SAASutB,UAAUlyE,GACjB,MAAkD,qBAA3Cla,OAAOE,UAAUwC,SAASqB,KAAKmW,EACxC,EAOE23J,UAAW,CACTyB,UAAW,SAAUp5J,GAAU,OAAOA,EAAS,OAAS,OAAS,EACjEq5J,UAAW,SAAUr5J,GAAU,OAAOA,EAAS,OAAS,OAAS,EACjEs5J,UAAW,SAAUt5J,GAAU,OAAOA,EAAS,OAAS,OAAS,GAEnE49E,aAAc,cAShB,SAAS67E,UAAUjuK,GACjB,OAAS,IAAeA,GAAOA,GAAK,EACtC,CAEA,SAASkuK,UAAUluK,GACjB,OAAS,IAAeA,GAAOA,GAAK,EACtC,CAuHA,IAAI,GAAM,IAAIvD,GAAK,wBAAyB,CAC1CsiB,KAAM,SACNmf,QAvHF,SAASiwI,mBAAmBxxK,GAC1B,GAAa,OAATA,EAAe,OAAO,EAE1B,IAGIgwH,EApBa3sH,EAiBb8C,EAAMnG,EAAKlE,OACXqU,EAAQ,EACRshK,GAAY,EAGhB,IAAKtrK,EAAK,OAAO,EASjB,GAJW,OAHX6pH,EAAKhwH,EAAKmQ,KAGe,MAAP6/G,IAChBA,EAAKhwH,IAAOmQ,IAGH,MAAP6/G,EAAY,CAEd,GAAI7/G,EAAQ,IAAMhK,EAAK,OAAO,EAK9B,GAAW,OAJX6pH,EAAKhwH,IAAOmQ,IAII,CAId,IAFAA,IAEOA,EAAQhK,EAAKgK,IAElB,GAAW,OADX6/G,EAAKhwH,EAAKmQ,IACV,CACA,GAAW,MAAP6/G,GAAqB,MAAPA,EAAY,OAAO,EACrCyhD,GAAY,CAFY,CAI1B,OAAOA,GAAoB,MAAPzhD,CACtB,CAGA,GAAW,MAAPA,EAAY,CAId,IAFA7/G,IAEOA,EAAQhK,EAAKgK,IAElB,GAAW,OADX6/G,EAAKhwH,EAAKmQ,IACV,CACA,KA1DG,KADQ9M,EA2DIrD,EAAKrE,WAAWwU,KA1DN9M,GAAK,IAC3B,IAAeA,GAAOA,GAAK,IAC3B,IAAeA,GAAOA,GAAK,KAwDU,OAAO,EAC/CouK,GAAY,CAFY,CAI1B,OAAOA,GAAoB,MAAPzhD,CACtB,CAGA,GAAW,MAAPA,EAAY,CAId,IAFA7/G,IAEOA,EAAQhK,EAAKgK,IAElB,GAAW,OADX6/G,EAAKhwH,EAAKmQ,IACV,CACA,IAAKmhK,UAAUtxK,EAAKrE,WAAWwU,IAAS,OAAO,EAC/CshK,GAAY,CAFY,CAI1B,OAAOA,GAAoB,MAAPzhD,CACtB,CACF,CAKA,GAAW,MAAPA,EAAY,OAAO,EAEvB,KAAO7/G,EAAQhK,EAAKgK,IAElB,GAAW,OADX6/G,EAAKhwH,EAAKmQ,IACV,CACA,IAAKohK,UAAUvxK,EAAKrE,WAAWwU,IAC7B,OAAO,EAETshK,GAAY,CAJY,CAQ1B,SAAKA,GAAoB,MAAPzhD,EAGpB,EAoCEvyG,UAlCF,SAASi0J,qBAAqB1xK,GAC5B,IAA4BgwH,EAAxB7xH,EAAQ6B,EAAM2xK,EAAO,EAczB,IAZ4B,IAAxBxzK,EAAM3D,QAAQ,OAChB2D,EAAQA,EAAMlE,QAAQ,KAAM,KAKnB,OAFX+1H,EAAK7xH,EAAM,KAEc,MAAP6xH,IACL,MAAPA,IAAY2hD,GAAQ,GAExB3hD,GADA7xH,EAAQA,EAAMO,MAAM,IACT,IAGC,MAAVP,EAAe,OAAO,EAE1B,GAAW,MAAP6xH,EAAY,CACd,GAAiB,MAAb7xH,EAAM,GAAY,OAAOwzK,EAAOjvK,SAASvE,EAAMO,MAAM,GAAI,GAC7D,GAAiB,MAAbP,EAAM,GAAY,OAAOwzK,EAAOjvK,SAASvE,EAAMO,MAAM,GAAI,IAC7D,GAAiB,MAAbP,EAAM,GAAY,OAAOwzK,EAAOjvK,SAASvE,EAAMO,MAAM,GAAI,EAC/D,CAEA,OAAOizK,EAAOjvK,SAASvE,EAAO,GAChC,EAWEq+D,UATF,SAAS9uD,UAAUmK,GACjB,MAAoD,oBAA5Cla,OAAOE,UAAUwC,SAASqB,KAAKmW,IAC/BA,EAAS,GAAM,IAAMm2J,GAAOF,eAAej2J,EACrD,EAOE23J,UAAW,CACThgI,OAAa,SAAU/vC,GAAO,OAAOA,GAAO,EAAI,KAAOA,EAAIY,SAAS,GAAK,MAAQZ,EAAIY,SAAS,GAAG3B,MAAM,EAAI,EAC3GkzK,MAAa,SAAUnyK,GAAO,OAAOA,GAAO,EAAI,KAAQA,EAAIY,SAAS,GAAK,MAASZ,EAAIY,SAAS,GAAG3B,MAAM,EAAI,EAC7GmzK,QAAa,SAAUpyK,GAAO,OAAOA,EAAIY,SAAS,GAAK,EAEvDyxK,YAAa,SAAUryK,GAAO,OAAOA,GAAO,EAAI,KAAOA,EAAIY,SAAS,IAAIimC,cAAiB,MAAQ7mC,EAAIY,SAAS,IAAIimC,cAAc5nC,MAAM,EAAI,GAE5I+2F,aAAc,UACdk6E,aAAc,CACZngI,OAAa,CAAE,EAAI,OACnBoiI,MAAa,CAAE,EAAI,OACnBC,QAAa,CAAE,GAAI,OACnBC,YAAa,CAAE,GAAI,UAInBC,GAAqB,IAAI3jJ,OAE3B,4IA0CF,IAAI4jJ,GAAyB,gBAwC7B,IAAI,GAAQ,IAAIlyK,GAAK,0BAA2B,CAC9CsiB,KAAM,SACNmf,QA3EF,SAAS0wI,iBAAiBjyK,GACxB,OAAa,OAATA,MAEC+xK,GAAmBp3K,KAAKqF,IAGC,MAA1BA,EAAKA,EAAKlE,OAAS,GAKzB,EAiEE2hB,UA/DF,SAASy0J,mBAAmBlyK,GAC1B,IAAI7B,EAAOwzK,EASX,OANAA,EAAsB,OADtBxzK,EAAS6B,EAAK/F,QAAQ,KAAM,IAAI0G,eACjB,IAAc,EAAI,EAE7B,KAAKnG,QAAQ2D,EAAM,KAAO,IAC5BA,EAAQA,EAAMO,MAAM,IAGR,SAAVP,EACe,IAATwzK,EAAcrvK,OAAO+5I,kBAAoB/5I,OAAOyrK,kBAErC,SAAV5vK,EACFonD,IAEFosH,EAAOzrI,WAAW/nC,EAAO,GAClC,EA+CEq+D,UATF,SAAS21G,QAAQt6J,GACf,MAAmD,oBAA3Cla,OAAOE,UAAUwC,SAASqB,KAAKmW,KAC/BA,EAAS,GAAM,GAAKm2J,GAAOF,eAAej2J,GACpD,EAOE23J,UA3CF,SAAS4C,mBAAmBv6J,EAAQpF,GAClC,IAAI/O,EAEJ,GAAImN,MAAMgH,GACR,OAAQpF,GACN,IAAK,YAAa,MAAO,OACzB,IAAK,YAAa,MAAO,OACzB,IAAK,YAAa,MAAO,YAEtB,GAAInQ,OAAO+5I,oBAAsBxkI,EACtC,OAAQpF,GACN,IAAK,YAAa,MAAO,OACzB,IAAK,YAAa,MAAO,OACzB,IAAK,YAAa,MAAO,YAEtB,GAAInQ,OAAOyrK,oBAAsBl2J,EACtC,OAAQpF,GACN,IAAK,YAAa,MAAO,QACzB,IAAK,YAAa,MAAO,QACzB,IAAK,YAAa,MAAO,aAEtB,GAAIu7J,GAAOF,eAAej2J,GAC/B,MAAO,OAQT,OALAnU,EAAMmU,EAAOxX,SAAS,IAKf2xK,GAAuBr3K,KAAK+I,GAAOA,EAAIzJ,QAAQ,IAAK,MAAQyJ,CACrE,EAaE+xF,aAAc,cAGZr0C,GAAOwvH,GAAS7kF,OAAO,CACzBmkF,SAAU,CACRW,GACAv2E,GACA,GACA,MAIA+3E,GAAOjxH,GAEPkxH,GAAmB,IAAIlkJ,OACzB,sDAIEmkJ,GAAwB,IAAInkJ,OAC9B,oLAuEF,IAAIokJ,GAAY,IAAI1yK,GAAK,8BAA+B,CACtDsiB,KAAM,SACNmf,QA9DF,SAASkxI,qBAAqBzyK,GAC5B,OAAa,OAATA,IACgC,OAAhCsyK,GAAiB31J,KAAK3c,IACe,OAArCuyK,GAAsB51J,KAAK3c,GAEjC,EA0DEyd,UAxDF,SAASi1J,uBAAuB1yK,GAC9B,IAAI9F,EAAOy4K,EAAMlxD,EAAOmxD,EAAKC,EAAMC,EAAQlpJ,EACLi1E,EADak0E,EAAW,EAC1DC,EAAQ,KAKZ,GAFc,QADd94K,EAAQo4K,GAAiB31J,KAAK3c,MACV9F,EAAQq4K,GAAsB51J,KAAK3c,IAEzC,OAAV9F,EAAgB,MAAM,IAAIwC,MAAM,sBAQpC,GAJAi2K,GAASz4K,EAAM,GACfunH,GAAUvnH,EAAM,GAAM,EACtB04K,GAAQ14K,EAAM,IAETA,EAAM,GACT,OAAO,IAAIiX,KAAKA,KAAK8hK,IAAIN,EAAMlxD,EAAOmxD,IASxC,GAJAC,GAAS34K,EAAM,GACf44K,GAAW54K,EAAM,GACjB0vB,GAAW1vB,EAAM,GAEbA,EAAM,GAAI,CAEZ,IADA64K,EAAW74K,EAAM,GAAGwE,MAAM,EAAG,GACtBq0K,EAASj3K,OAAS,GACvBi3K,GAAY,IAEdA,GAAYA,CACd,CAeA,OAXI74K,EAAM,KAGR84K,EAAqC,KAAlB,IAFP94K,EAAM,OACJA,EAAM,KAAO,IAEV,MAAbA,EAAM,KAAY84K,GAASA,IAGjCn0E,EAAO,IAAI1tF,KAAKA,KAAK8hK,IAAIN,EAAMlxD,EAAOmxD,EAAKC,EAAMC,EAAQlpJ,EAAQmpJ,IAE7DC,GAAOn0E,EAAKq0E,QAAQr0E,EAAKvwE,UAAY0kJ,GAElCn0E,CACT,EAUEnE,WAAYvpF,KACZq+J,UATF,SAAS2D,uBAAuBt7J,GAC9B,OAAOA,EAAO0mF,aAChB,IAcA,IAAI,GAAQ,IAAIz+F,GAAK,0BAA2B,CAC9CsiB,KAAM,SACNmf,QANF,SAAS6xI,iBAAiBpzK,GACxB,MAAgB,OAATA,GAA0B,OAATA,CAC1B,IAcIqzK,GAAa,wEA6GjB,IAAI7jI,GAAS,IAAI1vC,GAAK,2BAA4B,CAChDsiB,KAAM,SACNmf,QA5GF,SAAS+xI,kBAAkBtzK,GACzB,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAIvD,EAAMm5D,EAAK29G,EAAS,EAAGptK,EAAMnG,EAAKlE,OAAQ2zB,EAAM4jJ,GAGpD,IAAKz9G,EAAM,EAAGA,EAAMzvD,EAAKyvD,IAIvB,MAHAn5D,EAAOgzB,EAAIj1B,QAAQwF,EAAK0pB,OAAOksC,KAGpB,IAAX,CAGA,GAAIn5D,EAAO,EAAG,OAAO,EAErB82K,GAAU,CALa,CASzB,OAAQA,EAAS,GAAO,CAC1B,EAyFE91J,UAvFF,SAAS+1J,oBAAoBxzK,GAC3B,IAAI41D,EAAK69G,EACLlmK,EAAQvN,EAAK/F,QAAQ,WAAY,IACjCkM,EAAMoH,EAAMzR,OACZ2zB,EAAM4jJ,GACNn2B,EAAO,EACPtmI,EAAS,GAIb,IAAKg/C,EAAM,EAAGA,EAAMzvD,EAAKyvD,IAClBA,EAAM,GAAM,GAAMA,IACrBh/C,EAAOza,KAAM+gJ,GAAQ,GAAM,KAC3BtmI,EAAOza,KAAM+gJ,GAAQ,EAAK,KAC1BtmI,EAAOza,KAAY,IAAP+gJ,IAGdA,EAAQA,GAAQ,EAAKztH,EAAIj1B,QAAQ+S,EAAMmc,OAAOksC,IAkBhD,OAXiB,KAFjB69G,EAAYttK,EAAM,EAAK,IAGrByQ,EAAOza,KAAM+gJ,GAAQ,GAAM,KAC3BtmI,EAAOza,KAAM+gJ,GAAQ,EAAK,KAC1BtmI,EAAOza,KAAY,IAAP+gJ,IACU,KAAbu2B,GACT78J,EAAOza,KAAM+gJ,GAAQ,GAAM,KAC3BtmI,EAAOza,KAAM+gJ,GAAQ,EAAK,MACJ,KAAbu2B,GACT78J,EAAOza,KAAM+gJ,GAAQ,EAAK,KAGrB,IAAI3gJ,WAAWqa,EACxB,EAoDE4lD,UARF,SAASyN,SAASxqE,GAChB,MAAgD,wBAAzC9B,OAAOE,UAAUwC,SAASqB,KAAKjC,EACxC,EAOE+vK,UAnDF,SAASkE,oBAAoB77J,GAC3B,IAA2B+9C,EAAKyD,EAA5BziD,EAAS,GAAIsmI,EAAO,EACpB/2I,EAAM0R,EAAO/b,OACb2zB,EAAM4jJ,GAIV,IAAKz9G,EAAM,EAAGA,EAAMzvD,EAAKyvD,IAClBA,EAAM,GAAM,GAAMA,IACrBh/C,GAAU6Y,EAAKytH,GAAQ,GAAM,IAC7BtmI,GAAU6Y,EAAKytH,GAAQ,GAAM,IAC7BtmI,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAW,GAAPytH,IAGhBA,GAAQA,GAAQ,GAAKrlI,EAAO+9C,GAwB9B,OAjBa,KAFbyD,EAAOlzD,EAAM,IAGXyQ,GAAU6Y,EAAKytH,GAAQ,GAAM,IAC7BtmI,GAAU6Y,EAAKytH,GAAQ,GAAM,IAC7BtmI,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAW,GAAPytH,IACI,IAAT7jF,GACTziD,GAAU6Y,EAAKytH,GAAQ,GAAM,IAC7BtmI,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAI,KACI,IAAT4pC,IACTziD,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAKytH,GAAQ,EAAK,IAC5BtmI,GAAU6Y,EAAI,IACd7Y,GAAU6Y,EAAI,KAGT7Y,CACT,IAcI+8J,GAAoBh2K,OAAOE,UAAU4R,eACrCmkK,GAAoBj2K,OAAOE,UAAUwC,SAkCzC,IAAI46D,GAAO,IAAIn7D,GAAK,yBAA0B,CAC5CsiB,KAAM,WACNmf,QAlCF,SAASsyI,gBAAgB7zK,GACvB,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAqBmQ,EAAOrU,EAAQi1C,EAAM+iI,EAASC,EAA/ChvJ,EAAa,GACblN,EAAS7X,EAEb,IAAKmQ,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAAG,CAIlE,GAHA4gC,EAAOl5B,EAAO1H,GACd4jK,GAAa,EAEkB,oBAA3BH,GAAYlyK,KAAKqvC,GAA6B,OAAO,EAEzD,IAAK+iI,KAAW/iI,EACd,GAAI4iI,GAAkBjyK,KAAKqvC,EAAM+iI,GAAU,CACzC,GAAKC,EACA,OAAO,EADKA,GAAa,CAEhC,CAGF,IAAKA,EAAY,OAAO,EAExB,IAAqC,IAAjChvJ,EAAWvqB,QAAQs5K,GAClB,OAAO,EAD4B/uJ,EAAW5oB,KAAK23K,EAE1D,CAEA,OAAO,CACT,EASEr2J,UAPF,SAASu2J,kBAAkBh0K,GACzB,OAAgB,OAATA,EAAgBA,EAAO,EAChC,IAQIi0K,GAAct2K,OAAOE,UAAUwC,SA4CnC,IAAIgjF,GAAQ,IAAIvjF,GAAK,0BAA2B,CAC9CsiB,KAAM,WACNmf,QA5CF,SAAS2yI,iBAAiBl0K,GACxB,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAImQ,EAAOrU,EAAQi1C,EAAM35B,EAAMR,EAC3BiB,EAAS7X,EAIb,IAFA4W,EAAS,IAAIpa,MAAMqb,EAAO/b,QAErBqU,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAAG,CAGlE,GAFA4gC,EAAOl5B,EAAO1H,GAEiB,oBAA3B8jK,GAAYvyK,KAAKqvC,GAA6B,OAAO,EAIzD,GAAoB,KAFpB35B,EAAOzZ,OAAOyZ,KAAK25B,IAEVj1C,OAAc,OAAO,EAE9B8a,EAAOzG,GAAS,CAAEiH,EAAK,GAAI25B,EAAK35B,EAAK,IACvC,CAEA,OAAO,CACT,EAwBEqG,UAtBF,SAAS02J,mBAAmBn0K,GAC1B,GAAa,OAATA,EAAe,MAAO,GAE1B,IAAImQ,EAAOrU,EAAQi1C,EAAM35B,EAAMR,EAC3BiB,EAAS7X,EAIb,IAFA4W,EAAS,IAAIpa,MAAMqb,EAAO/b,QAErBqU,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC/D4gC,EAAOl5B,EAAO1H,GAEdiH,EAAOzZ,OAAOyZ,KAAK25B,GAEnBn6B,EAAOzG,GAAS,CAAEiH,EAAK,GAAI25B,EAAK35B,EAAK,KAGvC,OAAOR,CACT,IAQIw9J,GAAoBz2K,OAAOE,UAAU4R,eAoBzC,IAAI7J,GAAM,IAAI9F,GAAK,wBAAyB,CAC1CsiB,KAAM,UACNmf,QApBF,SAAS8yI,eAAer0K,GACtB,GAAa,OAATA,EAAe,OAAO,EAE1B,IAAI8P,EAAK+H,EAAS7X,EAElB,IAAK8P,KAAO+H,EACV,GAAIu8J,GAAkB1yK,KAAKmW,EAAQ/H,IACb,OAAhB+H,EAAO/H,GAAe,OAAO,EAIrC,OAAO,CACT,EASE2N,UAPF,SAAS62J,iBAAiBt0K,GACxB,OAAgB,OAATA,EAAgBA,EAAO,CAAC,CACjC,IAQIqrC,GAAWgnI,GAAKtmF,OAAO,CACzBmkF,SAAU,CACRsC,GACA,IAEFrC,SAAU,CACR3gI,GACAyrB,GACAooB,GACAz9E,MAYA2uK,GAAoB52K,OAAOE,UAAU4R,eAGrC+kK,GAAoB,EACpBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAoB,EAGpBC,GAAiB,EACjBC,GAAiB,EACjBC,GAAiB,EAGjBC,GAAgC,sIAChCC,GAAgC,qBAChCC,GAAgC,cAChCC,GAAgC,yBAChCC,GAAgC,mFAGpC,SAAS94H,OAAO58C,GAAO,OAAO9B,OAAOE,UAAUwC,SAASqB,KAAKjC,EAAM,CAEnE,SAAS21K,OAAO/xK,GACd,OAAc,KAANA,GAA8B,KAANA,CAClC,CAEA,SAASgyK,eAAehyK,GACtB,OAAc,IAANA,GAA+B,KAANA,CACnC,CAEA,SAASiyK,aAAajyK,GACpB,OAAc,IAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,CACV,CAEA,SAASkyK,kBAAkBlyK,GACzB,OAAa,KAANA,GACM,KAANA,GACM,KAANA,GACM,MAANA,GACM,MAANA,CACT,CAEA,SAASmyK,YAAYnyK,GACnB,IAAI4xG,EAEJ,OAAK,IAAe5xG,GAAOA,GAAK,GACvBA,EAAI,GAMR,KAFL4xG,EAAS,GAAJ5xG,IAEuB4xG,GAAM,IACzBA,EAAK,GAAO,IAGb,CACV,CAiBA,SAASwgE,qBAAqBpyK,GAE5B,OAAc,KAANA,EAAqB,KAChB,KAANA,EAAqB,IACf,KAANA,EAAqB,KACf,MAANA,GACM,IAANA,EADqB,KAEf,MAANA,EAAqB,KACf,MAANA,EAAqB,KACf,MAANA,EAAqB,KACf,MAANA,EAAqB,KACf,MAANA,EAAqB,IACf,KAANA,EAAyB,IACnB,KAANA,EAAqB,IACf,KAANA,EAAqB,IACf,KAANA,EAAqB,KACf,KAANA,EAAqB,IACf,KAANA,EAAqB,IACf,KAANA,EAAqB,SACf,KAANA,EAAqB,SAAW,EACzC,CAEA,SAASqyK,kBAAkBryK,GACzB,OAAIA,GAAK,MACAjJ,OAAOC,aAAagJ,GAItBjJ,OAAOC,aACa,OAAvBgJ,EAAI,OAAa,IACS,OAA1BA,EAAI,MAAY,MAEtB,CAIA,IAFA,IAAIsyK,GAAoB,IAAIn5K,MAAM,KAC9Bo5K,GAAkB,IAAIp5K,MAAM,KACvBpB,GAAI,EAAGA,GAAI,IAAKA,KACvBu6K,GAAkBv6K,IAAKq6K,qBAAqBr6K,IAAK,EAAI,EACrDw6K,GAAgBx6K,IAAKq6K,qBAAqBr6K,IAI5C,SAASy6K,QAAQtoK,EAAO0C,GACtB5W,KAAKkU,MAAQA,EAEblU,KAAK6uE,SAAYj4D,EAAkB,UAAM,KACzC5W,KAAK0/J,OAAY9oJ,EAAgB,QAAQo7B,GACzChyC,KAAKy8K,UAAY7lK,EAAmB,WAAK,KAGzC5W,KAAK08K,OAAY9lK,EAAgB,SAAQ,EAEzC5W,KAAK+nD,KAAYnxC,EAAc,OAAU,EACzC5W,KAAKipC,SAAYryB,EAAkB,UAAM,KAEzC5W,KAAK28K,cAAgB38K,KAAK0/J,OAAOuX,iBACjCj3K,KAAK48K,QAAgB58K,KAAK0/J,OAAOyX,gBAEjCn3K,KAAKyC,OAAayR,EAAMzR,OACxBzC,KAAKsZ,SAAa,EAClBtZ,KAAKk2J,KAAa,EAClBl2J,KAAKq1K,UAAa,EAClBr1K,KAAK68K,WAAa,EAIlB78K,KAAK88K,gBAAkB,EAEvB98K,KAAK+8K,UAAY,EAYnB,CAGA,SAASC,cAAct2J,EAAOhT,GAC5B,IAAIkF,EAAO,CACTpF,KAAUkT,EAAMmoD,SAChBhpE,OAAU6gB,EAAMxS,MAAM7O,MAAM,GAAI,GAChCiU,SAAUoN,EAAMpN,SAChB48I,KAAUxvI,EAAMwvI,KAChB+e,OAAUvuJ,EAAMpN,SAAWoN,EAAM2uJ,WAKnC,OAFAz8J,EAAKs8J,QAAUA,GAAQt8J,GAEhB,IAAIk8J,GAAUphK,EAASkF,EAChC,CAEA,SAASqkK,WAAWv2J,EAAOhT,GACzB,MAAMspK,cAAct2J,EAAOhT,EAC7B,CAEA,SAASwpK,aAAax2J,EAAOhT,GACvBgT,EAAM+1J,WACR/1J,EAAM+1J,UAAUp0K,KAAK,KAAM20K,cAAct2J,EAAOhT,GAEpD,CAGA,IAAIypK,GAAoB,CAEtBC,KAAM,SAASC,oBAAoB32J,EAAOlT,EAAM0Q,GAE9C,IAAIrjB,EAAOy8K,EAAOC,EAEI,OAAlB72J,EAAM5F,SACRm8J,WAAWv2J,EAAO,kCAGA,IAAhBxC,EAAKzhB,QACPw6K,WAAWv2J,EAAO,+CAKN,QAFd7lB,EAAQ,uBAAuByiB,KAAKY,EAAK,MAGvC+4J,WAAWv2J,EAAO,6CAGpB42J,EAAQj0K,SAASxI,EAAM,GAAI,IAC3B08K,EAAQl0K,SAASxI,EAAM,GAAI,IAEb,IAAVy8K,GACFL,WAAWv2J,EAAO,6CAGpBA,EAAM5F,QAAUoD,EAAK,GACrBwC,EAAM82J,gBAAmBD,EAAQ,EAEnB,IAAVA,GAAyB,IAAVA,GACjBL,aAAax2J,EAAO,2CAExB,EAEAiJ,IAAK,SAAS8tJ,mBAAmB/2J,EAAOlT,EAAM0Q,GAE5C,IAAIw5J,EAAQxrF,EAEQ,IAAhBhuE,EAAKzhB,QACPw6K,WAAWv2J,EAAO,+CAGpBg3J,EAASx5J,EAAK,GACdguE,EAAShuE,EAAK,GAET23J,GAAmBv6K,KAAKo8K,IAC3BT,WAAWv2J,EAAO,+DAGhBw0J,GAAkB7yK,KAAKqe,EAAMi3J,OAAQD,IACvCT,WAAWv2J,EAAO,8CAAgDg3J,EAAS,gBAGxE5B,GAAgBx6K,KAAK4wF,IACxB+qF,WAAWv2J,EAAO,gEAGpB,IACEwrE,EAAS95E,mBAAmB85E,EAC9B,CAAE,MAAOr3E,GACPoiK,WAAWv2J,EAAO,4BAA8BwrE,EAClD,CAEAxrE,EAAMi3J,OAAOD,GAAUxrF,CACzB,GAIF,SAAS0rF,eAAel3J,EAAOpjB,EAAOC,EAAKs6K,GACzC,IAAIC,EAAWC,EAASC,EAAY7wC,EAEpC,GAAI7pI,EAAQC,EAAK,CAGf,GAFA4pI,EAAUzmH,EAAMxS,MAAM7O,MAAM/B,EAAOC,GAE/Bs6K,EACF,IAAKC,EAAY,EAAGC,EAAU5wC,EAAQ1qI,OAAQq7K,EAAYC,EAASD,GAAa,EAEzD,KADrBE,EAAa7wC,EAAQ7qI,WAAWw7K,KAEzB,IAAQE,GAAcA,GAAc,SACzCf,WAAWv2J,EAAO,sCAGbg1J,GAAsBp6K,KAAK6rI,IACpC8vC,WAAWv2J,EAAO,gDAGpBA,EAAMnJ,QAAU4vH,CAClB,CACF,CAEA,SAAS8wC,cAAcv3J,EAAOkQ,EAAa/Y,EAAQqgK,GACjD,IAAIlzE,EAAYv0F,EAAKK,EAAOqnK,EAQ5B,IANKxJ,GAAOv4J,SAASyB,IACnBo/J,WAAWv2J,EAAO,qEAKf5P,EAAQ,EAAGqnK,GAFhBnzE,EAAa1mG,OAAOyZ,KAAKF,IAEapb,OAAQqU,EAAQqnK,EAAUrnK,GAAS,EACvEL,EAAMu0F,EAAWl0F,GAEZokK,GAAkB7yK,KAAKuuB,EAAangB,KACvCmgB,EAAYngB,GAAOoH,EAAOpH,GAC1BynK,EAAgBznK,IAAO,EAG7B,CAEA,SAAS2nK,iBAAiB13J,EAAOymH,EAAS+wC,EAAiBG,EAAQC,EAASC,EAC1EC,EAAWC,EAAgBC,GAE3B,IAAI5nK,EAAOqnK,EAKX,GAAIh7K,MAAMuD,QAAQ43K,GAGhB,IAAKxnK,EAAQ,EAAGqnK,GAFhBG,EAAUn7K,MAAMqB,UAAUa,MAAMgD,KAAKi2K,IAEF77K,OAAQqU,EAAQqnK,EAAUrnK,GAAS,EAChE3T,MAAMuD,QAAQ43K,EAAQxnK,KACxBmmK,WAAWv2J,EAAO,+CAGG,iBAAZ43J,GAAmD,oBAA3Bt7H,OAAOs7H,EAAQxnK,MAChDwnK,EAAQxnK,GAAS,mBAmBvB,GAXuB,iBAAZwnK,GAA4C,oBAApBt7H,OAAOs7H,KACxCA,EAAU,mBAIZA,EAAUv9K,OAAOu9K,GAED,OAAZnxC,IACFA,EAAU,CAAC,GAGE,4BAAXkxC,EACF,GAAIl7K,MAAMuD,QAAQ63K,GAChB,IAAKznK,EAAQ,EAAGqnK,EAAWI,EAAU97K,OAAQqU,EAAQqnK,EAAUrnK,GAAS,EACtEmnK,cAAcv3J,EAAOymH,EAASoxC,EAAUznK,GAAQonK,QAGlDD,cAAcv3J,EAAOymH,EAASoxC,EAAWL,QAGtCx3J,EAAMqhC,MACNmzH,GAAkB7yK,KAAK61K,EAAiBI,KACzCpD,GAAkB7yK,KAAK8kI,EAASmxC,KAClC53J,EAAMwvI,KAAOsoB,GAAa93J,EAAMwvI,KAChCxvI,EAAM2uJ,UAAYoJ,GAAkB/3J,EAAM2uJ,UAC1C3uJ,EAAMpN,SAAWolK,GAAYh4J,EAAMpN,SACnC2jK,WAAWv2J,EAAO,2BAIJ,cAAZ43J,EACFh6K,OAAOmH,eAAe0hI,EAASmxC,EAAS,CACtC/qK,cAAc,EACd7H,YAAY,EACZ4H,UAAU,EACVxO,MAAOy5K,IAGTpxC,EAAQmxC,GAAWC,SAEdL,EAAgBI,GAGzB,OAAOnxC,CACT,CAEA,SAASwxC,cAAcj4J,GACrB,IAAIiwG,EAIO,MAFXA,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAGhCoN,EAAMpN,WACU,KAAPq9G,GACTjwG,EAAMpN,WACyC,KAA3CoN,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAC/BoN,EAAMpN,YAGR2jK,WAAWv2J,EAAO,4BAGpBA,EAAMwvI,MAAQ,EACdxvI,EAAM2uJ,UAAY3uJ,EAAMpN,SACxBoN,EAAMo2J,gBAAkB,CAC1B,CAEA,SAAS8B,oBAAoBl4J,EAAOm4J,EAAeC,GAIjD,IAHA,IAAIC,EAAa,EACbpoD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAExB,IAAPq9G,GAAU,CACf,KAAOqlD,eAAerlD,IACT,IAAPA,IAAkD,IAA1BjwG,EAAMo2J,iBAChCp2J,EAAMo2J,eAAiBp2J,EAAMpN,UAE/Bq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtC,GAAIulK,GAAwB,KAAPloD,EACnB,GACEA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,gBACtB,KAAPq9G,GAA8B,KAAPA,GAA8B,IAAPA,GAGzD,IAAIolD,OAAOplD,GAYT,MALA,IANAgoD,cAAcj4J,GAEdiwG,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAClCylK,IACAr4J,EAAMm2J,WAAa,EAEL,KAAPlmD,GACLjwG,EAAMm2J,aACNlmD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,SAK1C,CAMA,OAJqB,IAAjBwlK,GAAqC,IAAfC,GAAoBr4J,EAAMm2J,WAAaiC,GAC/D5B,aAAax2J,EAAO,yBAGfq4J,CACT,CAEA,SAASC,sBAAsBt4J,GAC7B,IACIiwG,EADAmnD,EAAYp3J,EAAMpN,SAOtB,QAAY,MAJZq9G,EAAKjwG,EAAMxS,MAAM5R,WAAWw7K,KAIM,KAAPnnD,GACvBA,IAAOjwG,EAAMxS,MAAM5R,WAAWw7K,EAAY,IAC1CnnD,IAAOjwG,EAAMxS,MAAM5R,WAAWw7K,EAAY,KAE5CA,GAAa,EAIF,KAFXnnD,EAAKjwG,EAAMxS,MAAM5R,WAAWw7K,MAEZ7B,aAAatlD,IAMjC,CAEA,SAASsoD,iBAAiBv4J,EAAOkjB,GACjB,IAAVA,EACFljB,EAAMnJ,QAAU,IACPqsB,EAAQ,IACjBljB,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMl7D,EAAQ,GAEhD,CA2eA,SAASs1I,kBAAkBx4J,EAAOy4J,GAChC,IAAIC,EAMAzoD,EALA0oD,EAAY34J,EAAMpJ,IAClBgiK,EAAY54J,EAAMy0I,OAClBhuB,EAAY,GAEZoyC,GAAY,EAKhB,IAA8B,IAA1B74J,EAAMo2J,eAAuB,OAAO,EAQxC,IANqB,OAAjBp2J,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUhuB,GAGlCxW,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAEpB,IAAPq9G,KACyB,IAA1BjwG,EAAMo2J,iBACRp2J,EAAMpN,SAAWoN,EAAMo2J,eACvBG,WAAWv2J,EAAO,mDAGT,KAAPiwG,IAMCslD,aAFOv1J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,KASpD,GAHAimK,GAAW,EACX74J,EAAMpN,WAEFslK,oBAAoBl4J,GAAO,GAAO,IAChCA,EAAMm2J,YAAcsC,EACtBhyC,EAAQrqI,KAAK,MACb6zH,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,eAYtC,GAPA8lK,EAAQ14J,EAAMwvI,KACdupB,YAAY/4J,EAAOy4J,EAAY9D,IAAkB,GAAO,GACxDluC,EAAQrqI,KAAK4jB,EAAMnJ,QACnBqhK,oBAAoBl4J,GAAO,GAAO,GAElCiwG,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAE7BoN,EAAMwvI,OAASkpB,GAAS14J,EAAMm2J,WAAasC,IAAuB,IAAPxoD,EAC9DsmD,WAAWv2J,EAAO,4CACb,GAAIA,EAAMm2J,WAAasC,EAC5B,MAIJ,QAAII,IACF74J,EAAMpJ,IAAM+hK,EACZ34J,EAAMy0I,OAASmkB,EACf54J,EAAMqC,KAAO,WACbrC,EAAMnJ,OAAS4vH,GACR,EAGX,CAmLA,SAASuyC,gBAAgBh5J,GACvB,IAAIo3J,EAGA6B,EACAt+I,EACAs1F,EAJAipD,GAAa,EACbC,GAAa,EAOjB,GAAW,MAFXlpD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAEV,OAAO,EAuB/B,GArBkB,OAAdoN,EAAMpJ,KACR2/J,WAAWv2J,EAAO,iCAKT,MAFXiwG,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,YAGlCsmK,GAAa,EACbjpD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAEpB,KAAPq9G,GACTkpD,GAAU,EACVF,EAAY,KACZhpD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAGpCqmK,EAAY,IAGd7B,EAAYp3J,EAAMpN,SAEdsmK,EAAY,CACd,GAAKjpD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,gBAC3B,IAAPq9G,GAAmB,KAAPA,GAEfjwG,EAAMpN,SAAWoN,EAAMjkB,QACzB4+B,EAAU3a,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,UAC7Cq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAEpC2jK,WAAWv2J,EAAO,qDAEtB,KAAO,CACL,KAAc,IAAPiwG,IAAaslD,aAAatlD,IAEpB,KAAPA,IACGkpD,EAUH5C,WAAWv2J,EAAO,gDATlBi5J,EAAYj5J,EAAMxS,MAAM7O,MAAMy4K,EAAY,EAAGp3J,EAAMpN,SAAW,GAEzDuiK,GAAmBv6K,KAAKq+K,IAC3B1C,WAAWv2J,EAAO,mDAGpBm5J,GAAU,EACV/B,EAAYp3J,EAAMpN,SAAW,IAMjCq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtC+nB,EAAU3a,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,UAEzCsiK,GAAwBt6K,KAAK+/B,IAC/B47I,WAAWv2J,EAAO,sDAEtB,CAEI2a,IAAYy6I,GAAgBx6K,KAAK+/B,IACnC47I,WAAWv2J,EAAO,4CAA8C2a,GAGlE,IACEA,EAAUjpB,mBAAmBipB,EAC/B,CAAE,MAAOxmB,GACPoiK,WAAWv2J,EAAO,0BAA4B2a,EAChD,CAkBA,OAhBIu+I,EACFl5J,EAAMpJ,IAAM+jB,EAEH65I,GAAkB7yK,KAAKqe,EAAMi3J,OAAQgC,GAC9Cj5J,EAAMpJ,IAAMoJ,EAAMi3J,OAAOgC,GAAat+I,EAEf,MAAds+I,EACTj5J,EAAMpJ,IAAM,IAAM+jB,EAEK,OAAds+I,EACTj5J,EAAMpJ,IAAM,qBAAuB+jB,EAGnC47I,WAAWv2J,EAAO,0BAA4Bi5J,EAAY,MAGrD,CACT,CAEA,SAASG,mBAAmBp5J,GAC1B,IAAIo3J,EACAnnD,EAIJ,GAAW,MAFXA,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAEV,OAAO,EAS/B,IAPqB,OAAjBoN,EAAMy0I,QACR8hB,WAAWv2J,EAAO,qCAGpBiwG,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UACpCwkK,EAAYp3J,EAAMpN,SAEJ,IAAPq9G,IAAaslD,aAAatlD,KAAQulD,kBAAkBvlD,IACzDA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAQtC,OALIoN,EAAMpN,WAAawkK,GACrBb,WAAWv2J,EAAO,8DAGpBA,EAAMy0I,OAASz0I,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,WAC3C,CACT,CAgCA,SAASmmK,YAAY/4J,EAAOq5J,EAAcC,EAAaC,EAAaC,GAClE,IAAIC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACA/5K,EACAg6K,EACAC,GARAC,GAAe,EACfC,IAAa,EACbC,IAAa,EAmCjB,GA3BuB,OAAnBn6J,EAAMuiB,UACRviB,EAAMuiB,SAAS,OAAQviB,GAGzBA,EAAMpJ,IAAS,KACfoJ,EAAMy0I,OAAS,KACfz0I,EAAMqC,KAAS,KACfrC,EAAMnJ,OAAS,KAEf4iK,EAAmBC,EAAoBC,EACrC/E,KAAsB0E,GACtB3E,KAAsB2E,EAEpBC,GACErB,oBAAoBl4J,GAAO,GAAO,KACpCk6J,IAAY,EAERl6J,EAAMm2J,WAAakD,EACrBY,GAAe,EACNj6J,EAAMm2J,aAAekD,EAC9BY,GAAe,EACNj6J,EAAMm2J,WAAakD,IAC5BY,IAAgB,IAKD,IAAjBA,GACF,KAAOjB,gBAAgBh5J,IAAUo5J,mBAAmBp5J,IAC9Ck4J,oBAAoBl4J,GAAO,GAAO,IACpCk6J,IAAY,EACZP,EAAwBF,EAEpBz5J,EAAMm2J,WAAakD,EACrBY,GAAe,EACNj6J,EAAMm2J,aAAekD,EAC9BY,GAAe,EACNj6J,EAAMm2J,WAAakD,IAC5BY,IAAgB,IAGlBN,GAAwB,EAwD9B,GAnDIA,IACFA,EAAwBO,IAAaV,GAGlB,IAAjBS,IAAsBrF,KAAsB0E,IAE5CS,EADEtF,KAAoB6E,GAAe5E,KAAqB4E,EAC7CD,EAEAA,EAAe,EAG9BW,GAAch6J,EAAMpN,SAAWoN,EAAM2uJ,UAEhB,IAAjBsL,GACEN,IACCnB,kBAAkBx4J,EAAOg6J,KAzZpC,SAASI,iBAAiBp6J,EAAOy4J,EAAYsB,GAC3C,IAAIM,EACAb,EACAd,EACA4B,EACAC,EACAC,EAUAvqD,EATA0oD,EAAgB34J,EAAMpJ,IACtBgiK,EAAgB54J,EAAMy0I,OACtBhuB,EAAgB,CAAC,EACjB+wC,GAAkB55K,OAAO6kB,OAAO,MAChCk1J,GAAgB,KAChBC,GAAgB,KAChBC,GAAgB,KAChB4C,IAAgB,EAChB5B,IAAgB,EAKpB,IAA8B,IAA1B74J,EAAMo2J,eAAuB,OAAO,EAQxC,IANqB,OAAjBp2J,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUhuB,GAGlCxW,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAEpB,IAAPq9G,GAAU,CAaf,GAZKwqD,KAA2C,IAA1Bz6J,EAAMo2J,iBAC1Bp2J,EAAMpN,SAAWoN,EAAMo2J,eACvBG,WAAWv2J,EAAO,mDAGpBq6J,EAAYr6J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,GACpD8lK,EAAQ14J,EAAMwvI,KAMF,KAAPv/B,GAA6B,KAAPA,IAAuBslD,aAAa8E,GA2BxD,CAKL,GAJAC,EAAWt6J,EAAMwvI,KACjB+qB,EAAgBv6J,EAAM2uJ,UACtB6L,EAAUx6J,EAAMpN,UAEXmmK,YAAY/4J,EAAO+5J,EAAYrF,IAAkB,GAAO,GAG3D,MAGF,GAAI10J,EAAMwvI,OAASkpB,EAAO,CAGxB,IAFAzoD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAE3B0iK,eAAerlD,IACpBA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtC,GAAW,KAAPq9G,EAGGslD,aAFLtlD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,YAGlC2jK,WAAWv2J,EAAO,2FAGhBy6J,KACF/C,iBAAiB13J,EAAOymH,EAAS+wC,GAAiBG,GAAQC,GAAS,KAAM0C,EAAUC,EAAeC,GAClG7C,GAASC,GAAUC,GAAY,MAGjCgB,IAAW,EACX4B,IAAgB,EAChBjB,GAAe,EACf7B,GAAS33J,EAAMpJ,IACfghK,GAAU53J,EAAMnJ,WAEX,KAAIgiK,GAMT,OAFA74J,EAAMpJ,IAAM+hK,EACZ34J,EAAMy0I,OAASmkB,GACR,EALPrC,WAAWv2J,EAAO,2DAMpB,CAEF,KAAO,KAAI64J,GAMT,OAFA74J,EAAMpJ,IAAM+hK,EACZ34J,EAAMy0I,OAASmkB,GACR,EALPrC,WAAWv2J,EAAO,iFAMpB,CACF,MA9Ea,KAAPiwG,GACEwqD,KACF/C,iBAAiB13J,EAAOymH,EAAS+wC,GAAiBG,GAAQC,GAAS,KAAM0C,EAAUC,EAAeC,GAClG7C,GAASC,GAAUC,GAAY,MAGjCgB,IAAW,EACX4B,IAAgB,EAChBjB,GAAe,GAENiB,IAETA,IAAgB,EAChBjB,GAAe,GAGfjD,WAAWv2J,EAAO,qGAGpBA,EAAMpN,UAAY,EAClBq9G,EAAKoqD,EAuFP,IAxBIr6J,EAAMwvI,OAASkpB,GAAS14J,EAAMm2J,WAAasC,KACzCgC,KACFH,EAAWt6J,EAAMwvI,KACjB+qB,EAAgBv6J,EAAM2uJ,UACtB6L,EAAUx6J,EAAMpN,UAGdmmK,YAAY/4J,EAAOy4J,EAAY7D,IAAmB,EAAM4E,KACtDiB,GACF7C,GAAU53J,EAAMnJ,OAEhBghK,GAAY73J,EAAMnJ,QAIjB4jK,KACH/C,iBAAiB13J,EAAOymH,EAAS+wC,GAAiBG,GAAQC,GAASC,GAAWyC,EAAUC,EAAeC,GACvG7C,GAASC,GAAUC,GAAY,MAGjCK,oBAAoBl4J,GAAO,GAAO,GAClCiwG,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAG/BoN,EAAMwvI,OAASkpB,GAAS14J,EAAMm2J,WAAasC,IAAuB,IAAPxoD,EAC9DsmD,WAAWv2J,EAAO,2CACb,GAAIA,EAAMm2J,WAAasC,EAC5B,KAEJ,CAmBA,OAZIgC,IACF/C,iBAAiB13J,EAAOymH,EAAS+wC,GAAiBG,GAAQC,GAAS,KAAM0C,EAAUC,EAAeC,GAIhG3B,KACF74J,EAAMpJ,IAAM+hK,EACZ34J,EAAMy0I,OAASmkB,EACf54J,EAAMqC,KAAO,UACbrC,EAAMnJ,OAAS4vH,GAGVoyC,EACT,CA2OWuB,CAAiBp6J,EAAOg6J,GAAaD,KA/tBhD,SAASW,mBAAmB16J,EAAOy4J,GACjC,IACIC,EACAiC,EACAC,EAEAn0C,EAGAo0C,EACAC,EACAC,EACAC,EAEApD,EACAD,EACAE,EACA5nD,GAhBAgrD,IAAW,EAIXtC,GAAW34J,EAAMpJ,IAEjBgiK,GAAW54J,EAAMy0I,OAMjB+iB,GAAkB55K,OAAO6kB,OAAO,MAQpC,GAAW,MAFXwtG,GAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAGhCioK,EAAa,GACbG,GAAY,EACZv0C,EAAU,OACL,IAAW,MAAPxW,GAKT,OAAO,EAJP4qD,EAAa,IACbG,GAAY,EACZv0C,EAAU,CAAC,CAGb,CAQA,IANqB,OAAjBzmH,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUhuB,GAGlCxW,GAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAEtB,IAAPq9G,IAAU,CAKf,GAJAioD,oBAAoBl4J,GAAO,EAAMy4J,IAEjCxoD,GAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,aAEvBioK,EAMT,OALA76J,EAAMpN,WACNoN,EAAMpJ,IAAM+hK,GACZ34J,EAAMy0I,OAASmkB,GACf54J,EAAMqC,KAAO24J,EAAY,UAAY,WACrCh7J,EAAMnJ,OAAS4vH,GACR,EACGw0C,GAEM,KAAPhrD,IAETsmD,WAAWv2J,EAAO,4CAHlBu2J,WAAWv2J,EAAO,gDAMD63J,EAAY,KAC/BiD,EAASC,GAAiB,EAEf,KAAP9qD,IAGEslD,aAFQv1J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,MAGlDkoK,EAASC,GAAiB,EAC1B/6J,EAAMpN,WACNslK,oBAAoBl4J,GAAO,EAAMy4J,IAIrCC,EAAQ14J,EAAMwvI,KACdmrB,EAAa36J,EAAM2uJ,UACnBiM,EAAO56J,EAAMpN,SACbmmK,YAAY/4J,EAAOy4J,EAAYhE,IAAiB,GAAO,GACvDkD,EAAS33J,EAAMpJ,IACfghK,EAAU53J,EAAMnJ,OAChBqhK,oBAAoBl4J,GAAO,EAAMy4J,GAEjCxoD,GAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAE7BmoK,GAAkB/6J,EAAMwvI,OAASkpB,GAAiB,KAAPzoD,KAC9C6qD,GAAS,EACT7qD,GAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UACpCslK,oBAAoBl4J,GAAO,EAAMy4J,GACjCM,YAAY/4J,EAAOy4J,EAAYhE,IAAiB,GAAO,GACvDoD,EAAY73J,EAAMnJ,QAGhBmkK,EACFtD,iBAAiB13J,EAAOymH,EAAS+wC,GAAiBG,EAAQC,EAASC,EAAWa,EAAOiC,EAAYC,GACxFE,EACTr0C,EAAQrqI,KAAKs7K,iBAAiB13J,EAAO,KAAMw3J,GAAiBG,EAAQC,EAASC,EAAWa,EAAOiC,EAAYC,IAE3Gn0C,EAAQrqI,KAAKw7K,GAGfM,oBAAoBl4J,GAAO,EAAMy4J,GAItB,MAFXxoD,GAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAGhCqoK,IAAW,EACXhrD,GAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAEpCqoK,IAAW,CAEf,CAEA1E,WAAWv2J,EAAO,wDACpB,CAknBU06J,CAAmB16J,EAAO+5J,GAC5BI,IAAa,GAERT,GAnnBb,SAASwB,gBAAgBl7J,EAAOy4J,GAC9B,IAAI0C,EACAC,EAOAhgL,EACA60H,EA3uBmB3sH,EAouBnB+3K,EAAiBxG,GACjByG,GAAiB,EACjBC,GAAiB,EACjBC,EAAiB/C,EACjBgD,EAAiB,EACjBC,GAAiB,EAMrB,GAAW,OAFXzrD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAGhCwoK,GAAU,MACL,IAAW,KAAPnrD,EAGT,OAAO,EAFPmrD,GAAU,CAGZ,CAKA,IAHAp7J,EAAMqC,KAAO,SACbrC,EAAMnJ,OAAS,GAED,IAAPo5G,GAGL,GAAW,MAFXA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,YAEH,KAAPq9G,EACpB4kD,KAAkBwG,EACpBA,EAAmB,KAAPprD,EAAsB8kD,GAAgBD,GAElDyB,WAAWv2J,EAAO,4CAGf,OAAK5kB,EAnwBT,KADkBkI,EAowBa2sH,IAnwBT3sH,GAAK,GACvBA,EAAI,IAGL,IA+vBoC,GAWxC,MAVY,IAARlI,EACFm7K,WAAWv2J,EAAO,gFACRu7J,EAIVhF,WAAWv2J,EAAO,8CAHlBw7J,EAAa/C,EAAar9K,EAAM,EAChCmgL,GAAiB,EAOrB,CAGF,GAAIjG,eAAerlD,GAAK,CACtB,GAAKA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,gBAClC0iK,eAAerlD,IAEtB,GAAW,KAAPA,EACF,GAAKA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,iBACjCyiK,OAAOplD,IAAe,IAAPA,EAE3B,CAEA,KAAc,IAAPA,GAAU,CAMf,IALAgoD,cAAcj4J,GACdA,EAAMm2J,WAAa,EAEnBlmD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAEzB2oK,GAAkBv7J,EAAMm2J,WAAaqF,IAC/B,KAAPvrD,GACNjwG,EAAMm2J,aACNlmD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAOtC,IAJK2oK,GAAkBv7J,EAAMm2J,WAAaqF,IACxCA,EAAax7J,EAAMm2J,YAGjBd,OAAOplD,GACTwrD,QADF,CAMA,GAAIz7J,EAAMm2J,WAAaqF,EAAY,CAG7BH,IAAatG,GACf/0J,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMk9E,EAAiB,EAAIG,EAAaA,GAC7DJ,IAAaxG,IAClByG,IACFt7J,EAAMnJ,QAAU,MAKpB,KACF,CAsCA,IAnCIukK,EAGE9F,eAAerlD,IACjByrD,GAAiB,EAEjB17J,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMk9E,EAAiB,EAAIG,EAAaA,IAG7DC,GACTA,GAAiB,EACjB17J,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMq9E,EAAa,IAGzB,IAAfA,EACLH,IACFt7J,EAAMnJ,QAAU,KAKlBmJ,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMq9E,GAMtCz7J,EAAMnJ,QAAUo3J,GAAO7vE,OAAO,KAAMk9E,EAAiB,EAAIG,EAAaA,GAGxEH,GAAiB,EACjBC,GAAiB,EACjBE,EAAa,EACbN,EAAen7J,EAAMpN,UAEbyiK,OAAOplD,IAAe,IAAPA,GACrBA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtCskK,eAAel3J,EAAOm7J,EAAcn7J,EAAMpN,UAAU,EA1DpD,CA2DF,CAEA,OAAO,CACT,CAsekCsoK,CAAgBl7J,EAAO+5J,IA/1BzD,SAAS4B,uBAAuB37J,EAAOy4J,GACrC,IAAIxoD,EACAkrD,EAAcS,EAIlB,GAAW,MAFX3rD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAGhC,OAAO,EAQT,IALAoN,EAAMqC,KAAO,SACbrC,EAAMnJ,OAAS,GACfmJ,EAAMpN,WACNuoK,EAAeS,EAAa57J,EAAMpN,SAEuB,KAAjDq9G,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YACxC,GAAW,KAAPq9G,EAAoB,CAItB,GAHAinD,eAAel3J,EAAOm7J,EAAcn7J,EAAMpN,UAAU,GAGzC,MAFXq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAOlC,OAAO,EAJPuoK,EAAen7J,EAAMpN,SACrBoN,EAAMpN,WACNgpK,EAAa57J,EAAMpN,QAKvB,MAAWyiK,OAAOplD,IAChBinD,eAAel3J,EAAOm7J,EAAcS,GAAY,GAChDrD,iBAAiBv4J,EAAOk4J,oBAAoBl4J,GAAO,EAAOy4J,IAC1D0C,EAAeS,EAAa57J,EAAMpN,UAEzBoN,EAAMpN,WAAaoN,EAAM2uJ,WAAa2J,sBAAsBt4J,GACrEu2J,WAAWv2J,EAAO,iEAGlBA,EAAMpN,WACNgpK,EAAa57J,EAAMpN,UAIvB2jK,WAAWv2J,EAAO,6DACpB,CAqzBY27J,CAAuB37J,EAAO+5J,IAnzB1C,SAAS8B,uBAAuB77J,EAAOy4J,GACrC,IAAI0C,EACAS,EACAE,EACAC,EACA3gL,EACA60H,EA/iBiB3sH,EAmjBrB,GAAW,MAFX2sH,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAGhC,OAAO,EAQT,IALAoN,EAAMqC,KAAO,SACbrC,EAAMnJ,OAAS,GACfmJ,EAAMpN,WACNuoK,EAAeS,EAAa57J,EAAMpN,SAEuB,KAAjDq9G,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAAkB,CAC1D,GAAW,KAAPq9G,EAGF,OAFAinD,eAAel3J,EAAOm7J,EAAcn7J,EAAMpN,UAAU,GACpDoN,EAAMpN,YACC,EAEF,GAAW,KAAPq9G,EAAoB,CAI7B,GAHAinD,eAAel3J,EAAOm7J,EAAcn7J,EAAMpN,UAAU,GAGhDyiK,OAFJplD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,WAGlCslK,oBAAoBl4J,GAAO,EAAOy4J,QAG7B,GAAIxoD,EAAK,KAAO2lD,GAAkB3lD,GACvCjwG,EAAMnJ,QAAUg/J,GAAgB5lD,GAChCjwG,EAAMpN,gBAED,IAAKxX,EA7kBN,OADWkI,EA8kBe2sH,GA7kBJ,EACtB,MAAN3sH,EAA4B,EACtB,KAANA,EAA4B,EACzB,GA0kBoC,EAAG,CAIxC,IAHAw4K,EAAY1gL,EACZ2gL,EAAY,EAELD,EAAY,EAAGA,KAGf1gL,EAAMq6K,YAFXxlD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,aAEL,EAC7BmpK,GAAaA,GAAa,GAAK3gL,EAG/Bm7K,WAAWv2J,EAAO,kCAItBA,EAAMnJ,QAAU8+J,kBAAkBoG,GAElC/7J,EAAMpN,UAER,MACE2jK,WAAWv2J,EAAO,2BAGpBm7J,EAAeS,EAAa57J,EAAMpN,QAEpC,MAAWyiK,OAAOplD,IAChBinD,eAAel3J,EAAOm7J,EAAcS,GAAY,GAChDrD,iBAAiBv4J,EAAOk4J,oBAAoBl4J,GAAO,EAAOy4J,IAC1D0C,EAAeS,EAAa57J,EAAMpN,UAEzBoN,EAAMpN,WAAaoN,EAAM2uJ,WAAa2J,sBAAsBt4J,GACrEu2J,WAAWv2J,EAAO,iEAGlBA,EAAMpN,WACNgpK,EAAa57J,EAAMpN,SAEvB,CAEA2jK,WAAWv2J,EAAO,6DACpB,CAuuBY67J,CAAuB77J,EAAO+5J,GAChCI,IAAa,GAjHvB,SAAS6B,UAAUh8J,GACjB,IAAIo3J,EAAWjtI,EACX8lF,EAIJ,GAAW,MAFXA,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAEV,OAAO,EAK/B,IAHAq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UACpCwkK,EAAYp3J,EAAMpN,SAEJ,IAAPq9G,IAAaslD,aAAatlD,KAAQulD,kBAAkBvlD,IACzDA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAetC,OAZIoN,EAAMpN,WAAawkK,GACrBb,WAAWv2J,EAAO,6DAGpBmqB,EAAQnqB,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,UAEtC4hK,GAAkB7yK,KAAKqe,EAAM84J,UAAW3uI,IAC3CosI,WAAWv2J,EAAO,uBAAyBmqB,EAAQ,KAGrDnqB,EAAMnJ,OAASmJ,EAAM84J,UAAU3uI,GAC/B+tI,oBAAoBl4J,GAAO,GAAO,IAC3B,CACT,CAuFmBg8J,CAAUh8J,GAj9B7B,SAASi8J,gBAAgBj8J,EAAOy4J,EAAYyD,GAC1C,IACI7B,EACAc,EACAS,EACAO,EACAzD,EACAiC,EACAyB,EAGAnsD,EAFAosD,EAAQr8J,EAAMqC,KACdokH,EAAUzmH,EAAMnJ,OAKpB,GAAI0+J,aAFJtlD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAG9B4iK,kBAAkBvlD,IACX,KAAPA,GACO,KAAPA,GACO,KAAPA,GACO,KAAPA,GACO,MAAPA,GACO,KAAPA,GACO,KAAPA,GACO,KAAPA,GACO,KAAPA,GACO,KAAPA,GACO,KAAPA,EACF,OAAO,EAGT,IAAW,KAAPA,GAA6B,KAAPA,KAGpBslD,aAFJ8E,EAAYr6J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,KAGhDspK,GAAwB1G,kBAAkB6E,IAC5C,OAAO,EASX,IALAr6J,EAAMqC,KAAO,SACbrC,EAAMnJ,OAAS,GACfskK,EAAeS,EAAa57J,EAAMpN,SAClCupK,GAAoB,EAEN,IAAPlsD,GAAU,CACf,GAAW,KAAPA,GAGF,GAAIslD,aAFJ8E,EAAYr6J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,KAGhDspK,GAAwB1G,kBAAkB6E,GAC5C,WAGG,GAAW,KAAPpqD,GAGT,GAAIslD,aAFQv1J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,IAGlD,UAGG,IAAKoN,EAAMpN,WAAaoN,EAAM2uJ,WAAa2J,sBAAsBt4J,IAC7Dk8J,GAAwB1G,kBAAkBvlD,GACnD,MAEK,GAAIolD,OAAOplD,GAAK,CAMrB,GALAyoD,EAAQ14J,EAAMwvI,KACdmrB,EAAa36J,EAAM2uJ,UACnByN,EAAcp8J,EAAMm2J,WACpB+B,oBAAoBl4J,GAAO,GAAQ,GAE/BA,EAAMm2J,YAAcsC,EAAY,CAClC0D,GAAoB,EACpBlsD,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,UAClC,QACF,CACEoN,EAAMpN,SAAWgpK,EACjB57J,EAAMwvI,KAAOkpB,EACb14J,EAAM2uJ,UAAYgM,EAClB36J,EAAMm2J,WAAaiG,EACnB,KAEJ,EAEID,IACFjF,eAAel3J,EAAOm7J,EAAcS,GAAY,GAChDrD,iBAAiBv4J,EAAOA,EAAMwvI,KAAOkpB,GACrCyC,EAAeS,EAAa57J,EAAMpN,SAClCupK,GAAoB,GAGjB7G,eAAerlD,KAClB2rD,EAAa57J,EAAMpN,SAAW,GAGhCq9G,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,SACtC,CAIA,OAFAskK,eAAel3J,EAAOm7J,EAAcS,GAAY,KAE5C57J,EAAMnJ,SAIVmJ,EAAMqC,KAAOg6J,EACbr8J,EAAMnJ,OAAS4vH,GACR,EACT,CA62BmBw1C,CAAgBj8J,EAAO+5J,EAAYtF,KAAoB6E,KAChEa,IAAa,EAEK,OAAdn6J,EAAMpJ,MACRoJ,EAAMpJ,IAAM,OAVdujK,IAAa,EAEK,OAAdn6J,EAAMpJ,KAAiC,OAAjBoJ,EAAMy0I,QAC9B8hB,WAAWv2J,EAAO,8CAWD,OAAjBA,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUz0I,EAAMnJ,SAGhB,IAAjBojK,KAGTE,GAAaR,GAAyBnB,kBAAkBx4J,EAAOg6J,MAIjD,OAAdh6J,EAAMpJ,IACa,OAAjBoJ,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUz0I,EAAMnJ,aAGnC,GAAkB,MAAdmJ,EAAMpJ,KAWf,IAJqB,OAAjBoJ,EAAMnJ,QAAkC,WAAfmJ,EAAMqC,MACjCk0J,WAAWv2J,EAAO,oEAAsEA,EAAMqC,KAAO,KAGlGu3J,EAAY,EAAGC,EAAe75J,EAAMi2J,cAAcl6K,OAAQ69K,EAAYC,EAAcD,GAAa,EAGpG,IAFA75K,EAAOigB,EAAMi2J,cAAc2D,IAElBp4I,QAAQxhB,EAAMnJ,QAAS,CAC9BmJ,EAAMnJ,OAAS9W,EAAK2d,UAAUsC,EAAMnJ,QACpCmJ,EAAMpJ,IAAM7W,EAAK6W,IACI,OAAjBoJ,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUz0I,EAAMnJ,QAExC,KACF,OAEG,GAAkB,MAAdmJ,EAAMpJ,IAAa,CAC5B,GAAI49J,GAAkB7yK,KAAKqe,EAAMk2J,QAAQl2J,EAAMqC,MAAQ,YAAarC,EAAMpJ,KACxE7W,EAAOigB,EAAMk2J,QAAQl2J,EAAMqC,MAAQ,YAAYrC,EAAMpJ,UAMrD,IAHA7W,EAAO,KAGF65K,EAAY,EAAGC,GAFpBC,EAAW95J,EAAMk2J,QAAQvG,MAAM3vJ,EAAMqC,MAAQ,aAEDtmB,OAAQ69K,EAAYC,EAAcD,GAAa,EACzF,GAAI55J,EAAMpJ,IAAIjY,MAAM,EAAGm7K,EAASF,GAAWhjK,IAAI7a,UAAY+9K,EAASF,GAAWhjK,IAAK,CAClF7W,EAAO+5K,EAASF,GAChB,KACF,CAIC75K,GACHw2K,WAAWv2J,EAAO,iBAAmBA,EAAMpJ,IAAM,KAG9B,OAAjBoJ,EAAMnJ,QAAmB9W,EAAKsiB,OAASrC,EAAMqC,MAC/Ck0J,WAAWv2J,EAAO,gCAAkCA,EAAMpJ,IAAM,wBAA0B7W,EAAKsiB,KAAO,WAAarC,EAAMqC,KAAO,KAG7HtiB,EAAKyhC,QAAQxhB,EAAMnJ,OAAQmJ,EAAMpJ,MAGpCoJ,EAAMnJ,OAAS9W,EAAK2d,UAAUsC,EAAMnJ,OAAQmJ,EAAMpJ,KAC7B,OAAjBoJ,EAAMy0I,SACRz0I,EAAM84J,UAAU94J,EAAMy0I,QAAUz0I,EAAMnJ,SAJxC0/J,WAAWv2J,EAAO,gCAAkCA,EAAMpJ,IAAM,iBAOpE,CAKA,OAHuB,OAAnBoJ,EAAMuiB,UACRviB,EAAMuiB,SAAS,QAASviB,GAEL,OAAdA,EAAMpJ,KAAkC,OAAjBoJ,EAAMy0I,QAAmB0lB,EACzD,CAEA,SAASmC,aAAat8J,GACpB,IACIo3J,EACAmF,EACAC,EAEAvsD,EALAwsD,EAAgBz8J,EAAMpN,SAItB8pK,GAAgB,EAQpB,IALA18J,EAAM5F,QAAU,KAChB4F,EAAM82J,gBAAkB92J,EAAMg2J,OAC9Bh2J,EAAMi3J,OAASr5K,OAAO6kB,OAAO,MAC7BzC,EAAM84J,UAAYl7K,OAAO6kB,OAAO,MAEyB,KAAjDwtG,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,aACxCslK,oBAAoBl4J,GAAO,GAAO,GAElCiwG,EAAKjwG,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAE9BoN,EAAMm2J,WAAa,GAAY,KAAPlmD,KAL8B,CAa1D,IAJAysD,GAAgB,EAChBzsD,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UACpCwkK,EAAYp3J,EAAMpN,SAEJ,IAAPq9G,IAAaslD,aAAatlD,IAC/BA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAUtC,IANA4pK,EAAgB,IADhBD,EAAgBv8J,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,WAGjC7W,OAAS,GACzBw6K,WAAWv2J,EAAO,gEAGN,IAAPiwG,GAAU,CACf,KAAOqlD,eAAerlD,IACpBA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtC,GAAW,KAAPq9G,EAAoB,CACtB,GAAKA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,gBAC3B,IAAPq9G,IAAaolD,OAAOplD,IAC3B,KACF,CAEA,GAAIolD,OAAOplD,GAAK,MAIhB,IAFAmnD,EAAYp3J,EAAMpN,SAEJ,IAAPq9G,IAAaslD,aAAatlD,IAC/BA,EAAKjwG,EAAMxS,MAAM5R,aAAaokB,EAAMpN,UAGtC4pK,EAAcpgL,KAAK4jB,EAAMxS,MAAM7O,MAAMy4K,EAAWp3J,EAAMpN,UACxD,CAEW,IAAPq9G,GAAUgoD,cAAcj4J,GAExBw0J,GAAkB7yK,KAAK80K,GAAmB8F,GAC5C9F,GAAkB8F,GAAev8J,EAAOu8J,EAAeC,GAEvDhG,aAAax2J,EAAO,+BAAiCu8J,EAAgB,IAEzE,CAEArE,oBAAoBl4J,GAAO,GAAO,GAET,IAArBA,EAAMm2J,YACyC,KAA/Cn2J,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WACkB,KAA/CoN,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,IACO,KAA/CoN,EAAMxS,MAAM5R,WAAWokB,EAAMpN,SAAW,IAC1CoN,EAAMpN,UAAY,EAClBslK,oBAAoBl4J,GAAO,GAAO,IAEzB08J,GACTnG,WAAWv2J,EAAO,mCAGpB+4J,YAAY/4J,EAAOA,EAAMm2J,WAAa,EAAGvB,IAAmB,GAAO,GACnEsD,oBAAoBl4J,GAAO,GAAO,GAE9BA,EAAM82J,iBACN7B,GAA8Br6K,KAAKolB,EAAMxS,MAAM7O,MAAM89K,EAAez8J,EAAMpN,YAC5E4jK,aAAax2J,EAAO,oDAGtBA,EAAMq2J,UAAUj6K,KAAK4jB,EAAMnJ,QAEvBmJ,EAAMpN,WAAaoN,EAAM2uJ,WAAa2J,sBAAsBt4J,GAEf,KAA3CA,EAAMxS,MAAM5R,WAAWokB,EAAMpN,YAC/BoN,EAAMpN,UAAY,EAClBslK,oBAAoBl4J,GAAO,GAAO,IAKlCA,EAAMpN,SAAYoN,EAAMjkB,OAAS,GACnCw6K,WAAWv2J,EAAO,wDAItB,CAGA,SAAS28J,cAAcnvK,EAAO0C,GAE5BA,EAAUA,GAAW,CAAC,EAED,KAHrB1C,EAAQnT,OAAOmT,IAGLzR,SAGmC,KAAvCyR,EAAM5R,WAAW4R,EAAMzR,OAAS,IACO,KAAvCyR,EAAM5R,WAAW4R,EAAMzR,OAAS,KAClCyR,GAAS,MAIiB,QAAxBA,EAAM5R,WAAW,KACnB4R,EAAQA,EAAM7O,MAAM,KAIxB,IAAIqhB,EAAQ,IAAI81J,QAAQtoK,EAAO0C,GAE3B0sK,EAAUpvK,EAAM/S,QAAQ,MAU5B,KARiB,IAAbmiL,IACF58J,EAAMpN,SAAWgqK,EACjBrG,WAAWv2J,EAAO,sCAIpBA,EAAMxS,OAAS,KAEmC,KAA3CwS,EAAMxS,MAAM5R,WAAWokB,EAAMpN,WAClCoN,EAAMm2J,YAAc,EACpBn2J,EAAMpN,UAAY,EAGpB,KAAOoN,EAAMpN,SAAYoN,EAAMjkB,OAAS,GACtCugL,aAAat8J,GAGf,OAAOA,EAAMq2J,SACf,CAkCA,IAGIwG,GAAS,CACZC,QAnCD,SAASC,UAAUvvK,EAAOkU,EAAUxR,GACjB,OAAbwR,GAAyC,iBAAbA,QAA4C,IAAZxR,IAC9DA,EAAUwR,EACVA,EAAW,MAGb,IAAI20J,EAAYsG,cAAcnvK,EAAO0C,GAErC,GAAwB,mBAAbwR,EACT,OAAO20J,EAGT,IAAK,IAAIjmK,EAAQ,EAAGrU,EAASs6K,EAAUt6K,OAAQqU,EAAQrU,EAAQqU,GAAS,EACtEsR,EAAS20J,EAAUjmK,GAEvB,EAqBC88E,KAlBD,SAAS8vF,OAAOxvK,EAAO0C,GACrB,IAAImmK,EAAYsG,cAAcnvK,EAAO0C,GAErC,GAAyB,IAArBmmK,EAAUt6K,OAAd,CAGO,GAAyB,IAArBs6K,EAAUt6K,OACnB,OAAOs6K,EAAU,GAEnB,MAAM,IAAIjI,GAAU,2DADpB,CAEF,GAiBI6O,GAAkBr/K,OAAOE,UAAUwC,SACnC48K,GAAkBt/K,OAAOE,UAAU4R,eAEnCytK,GAA4B,MAC5BC,GAA4B,EAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,GAC5BC,GAA4B,IAC5BC,GAA4B,IAC5BC,GAA4B,IAE5BC,GAAmB,CAEvBA,EAA2B,MAC3BA,EAA2B,MAC3BA,EAA2B,MAC3BA,EAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,MAC3BA,GAA2B,OAC3BA,IAA2B,MAC3BA,IAA2B,MAC3BA,KAA2B,MAC3BA,KAA2B,OAEvBC,GAA6B,CAC/B,IAAK,IAAK,MAAO,MAAO,MAAO,KAAM,KAAM,KAC3C,IAAK,IAAK,KAAM,KAAM,KAAM,MAAO,MAAO,OAGxCC,GAA2B,4CA6B/B,SAASC,UAAU9uB,GACjB,IAAI3xJ,EAAQ04K,EAAQj7K,EAIpB,GAFAuC,EAAS2xJ,EAAU3vJ,SAAS,IAAIimC,cAE5B0pH,GAAa,IACf+mB,EAAS,IACTj7K,EAAS,OACJ,GAAIk0J,GAAa,MACtB+mB,EAAS,IACTj7K,EAAS,MACJ,MAAIk0J,GAAa,YAItB,MAAM,IAAIme,GAAU,iEAHpB4I,EAAS,IACTj7K,EAAS,CAGX,CAEA,MAAO,KAAOi7K,EAAS/I,GAAO7vE,OAAO,IAAKriG,EAASuC,EAAOvC,QAAUuC,CACtE,CAGA,IAAI0gL,GAAsB,EACtBC,GAAsB,EAE1B,SAASC,MAAMhvK,GACb5W,KAAK0/J,OAAgB9oJ,EAAgB,QAAKo7B,GAC1ChyC,KAAK28F,OAAgBxyF,KAAK2C,IAAI,EAAI8J,EAAgB,QAAK,GACvD5W,KAAK6lL,cAAgBjvK,EAAuB,gBAAK,EACjD5W,KAAK8lL,YAAgBlvK,EAAqB,cAAK,EAC/C5W,KAAK+lL,UAAiBpR,GAAOP,UAAUx9J,EAAmB,YAAM,EAAIA,EAAmB,UACvF5W,KAAKgmL,SA1DP,SAASC,gBAAgBvmB,EAAQtpI,GAC/B,IAAI7Y,EAAQQ,EAAMjH,EAAOrU,EAAQ6a,EAAKlE,EAAO3S,EAE7C,GAAY,OAAR2vB,EAAc,MAAO,CAAC,EAK1B,IAHA7Y,EAAS,CAAC,EAGLzG,EAAQ,EAAGrU,GAFhBsb,EAAOzZ,OAAOyZ,KAAKqY,IAEW3zB,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC7DwG,EAAMS,EAAKjH,GACXsC,EAAQrY,OAAOq1B,EAAI9Y,IAEK,OAApBA,EAAIjY,MAAM,EAAG,KACfiY,EAAM,qBAAuBA,EAAIjY,MAAM,KAEzCoB,EAAOi5J,EAAOyX,gBAA0B,SAAE75J,KAE9BsmK,GAAgBv7K,KAAK5B,EAAK6vK,aAAcl9J,KAClDA,EAAQ3S,EAAK6vK,aAAal9J,IAG5BmE,EAAOD,GAAOlE,EAGhB,OAAOmE,CACT,CAiCuB0oK,CAAgBjmL,KAAK0/J,OAAQ9oJ,EAAgB,QAAK,MACvE5W,KAAKkmL,SAAgBtvK,EAAkB,WAAK,EAC5C5W,KAAKmmL,UAAgBvvK,EAAmB,WAAK,GAC7C5W,KAAKomL,OAAgBxvK,EAAgB,SAAK,EAC1C5W,KAAKqmL,aAAgBzvK,EAAsB,eAAK,EAChD5W,KAAKsmL,aAAgB1vK,EAAsB,eAAK,EAChD5W,KAAKumL,YAA2C,MAA3B3vK,EAAqB,YAAY+uK,GAAsBD,GAC5E1lL,KAAKwmL,YAAgB5vK,EAAqB,cAAK,EAC/C5W,KAAKymL,SAA+C,mBAAxB7vK,EAAkB,SAAmBA,EAAkB,SAAI,KAEvF5W,KAAK28K,cAAgB38K,KAAK0/J,OAAOuX,iBACjCj3K,KAAK0mL,cAAgB1mL,KAAK0/J,OAAOwX,iBAEjCl3K,KAAKsd,IAAM,KACXtd,KAAKud,OAAS,GAEdvd,KAAK2mL,WAAa,GAClB3mL,KAAK4mL,eAAiB,IACxB,CAGA,SAASC,aAAa7hL,EAAQ8hL,GAQ5B,IAPA,IAII5wB,EAJA6wB,EAAMpS,GAAO7vE,OAAO,IAAKgiF,GACzBxtK,EAAW,EACXgP,GAAQ,EACR/K,EAAS,GAET9a,EAASuC,EAAOvC,OAEb6W,EAAW7W,IAEF,KADd6lB,EAAOtjB,EAAO7D,QAAQ,KAAMmY,KAE1B48I,EAAOlxJ,EAAOK,MAAMiU,GACpBA,EAAW7W,IAEXyzJ,EAAOlxJ,EAAOK,MAAMiU,EAAUgP,EAAO,GACrChP,EAAWgP,EAAO,GAGhB4tI,EAAKzzJ,QAAmB,OAATyzJ,IAAe34I,GAAUwpK,GAE5CxpK,GAAU24I,EAGZ,OAAO34I,CACT,CAEA,SAASypK,iBAAiBtgK,EAAOu4C,GAC/B,MAAO,KAAO01G,GAAO7vE,OAAO,IAAKp+E,EAAMi2E,OAAS19B,EAClD,CAiBA,SAASgoH,aAAaj9K,GACpB,OAAOA,IAAMi6K,IAAcj6K,IAAM85K,EACnC,CAMA,SAASoD,YAAYl9K,GACnB,OAAS,IAAWA,GAAKA,GAAK,KACrB,KAAWA,GAAKA,GAAK,OAAmB,OAANA,GAAsB,OAANA,GAClD,OAAWA,GAAKA,GAAK,OAAaA,IAAM65K,IACxC,OAAW75K,GAAKA,GAAK,OAChC,CAOA,SAASm9K,qBAAqBn9K,GAC5B,OAAOk9K,YAAYl9K,IACdA,IAAM65K,IAEN75K,IAAMg6K,IACNh6K,IAAM+5K,EACb,CAWA,SAASqD,YAAYp9K,EAAGotB,EAAMiwJ,GAC5B,IAAIC,EAAwBH,qBAAqBn9K,GAC7Cu9K,EAAYD,IAA0BL,aAAaj9K,GACvD,OAEEq9K,EACEC,EACEA,GAEGt9K,IAAMy6K,IACNz6K,IAAMg7K,IACNh7K,IAAMi7K,IACNj7K,IAAMm7K,IACNn7K,IAAMq7K,KAGVr7K,IAAMo6K,MACJhtJ,IAASutJ,KAAe4C,IACzBJ,qBAAqB/vJ,KAAU6vJ,aAAa7vJ,IAASptB,IAAMo6K,IAC3DhtJ,IAASutJ,IAAc4C,CAC/B,CA0CA,SAASC,YAAYxiL,EAAQsH,GAC3B,IAAoCikB,EAAhC5gB,EAAQ3K,EAAO1C,WAAWgK,GAC9B,OAAIqD,GAAS,OAAUA,GAAS,OAAUrD,EAAM,EAAItH,EAAOvC,SACzD8tB,EAASvrB,EAAO1C,WAAWgK,EAAM,KACnB,OAAUikB,GAAU,MAEN,MAAlB5gB,EAAQ,OAAkB4gB,EAAS,MAAS,MAGjD5gB,CACT,CAGA,SAAS83K,oBAAoBziL,GAE3B,MADqB,QACC1D,KAAK0D,EAC7B,CAEA,IAAI0iL,GAAgB,EAChBC,GAAgB,EAChBC,GAAgB,EAChBC,GAAgB,EAChBC,GAAgB,EASpB,SAASC,kBAAkB/iL,EAAQgjL,EAAgBC,EAAgB9B,EACjE+B,EAAmB3B,EAAaC,EAAaa,GAE7C,IAAItlL,EACAsrH,EAAO,EACP86D,EAAW,KACXC,GAAe,EACfC,GAAkB,EAClBC,IAAkC,IAAfnC,EACnBoC,IAAqB,EACrBC,GAhFN,SAASC,iBAAiBz+K,GAIxB,OAAOk9K,YAAYl9K,IAAMA,IAAM65K,KACzBoD,aAAaj9K,IAGdA,IAAM06K,IACN16K,IAAM86K,IACN96K,IAAM26K,IACN36K,IAAMy6K,IACNz6K,IAAMg7K,IACNh7K,IAAMi7K,IACNj7K,IAAMm7K,IACNn7K,IAAMq7K,IAENr7K,IAAMo6K,IACNp6K,IAAMs6K,IACNt6K,IAAMw6K,IACNx6K,IAAMk6K,IACNl6K,IAAMo7K,IACNp7K,IAAM46K,IACN56K,IAAM66K,IACN76K,IAAMu6K,IACNv6K,IAAMm6K,IAENn6K,IAAMq6K,IACNr6K,IAAM+6K,IACN/6K,IAAMk7K,EACb,CAkDcuD,CAAiBjB,YAAYxiL,EAAQ,KA/CnD,SAAS0jL,gBAAgB1+K,GAEvB,OAAQi9K,aAAaj9K,IAAMA,IAAM26K,EACnC,CA6Ca+D,CAAgBlB,YAAYxiL,EAAQA,EAAOvC,OAAS,IAE/D,GAAIulL,GAAkBxB,EAGpB,IAAKzkL,EAAI,EAAGA,EAAIiD,EAAOvC,OAAQ4qH,GAAQ,MAAUtrH,GAAK,EAAIA,IAAK,CAE7D,IAAKmlL,YADL75D,EAAOm6D,YAAYxiL,EAAQjD,IAEzB,OAAO+lL,GAETU,GAAQA,IAASpB,YAAY/5D,EAAM86D,EAAUd,GAC7Cc,EAAW96D,CACb,KACK,CAEL,IAAKtrH,EAAI,EAAGA,EAAIiD,EAAOvC,OAAQ4qH,GAAQ,MAAUtrH,GAAK,EAAIA,IAAK,CAE7D,IADAsrH,EAAOm6D,YAAYxiL,EAAQjD,MACdgiL,GACXqE,GAAe,EAEXE,KACFD,EAAkBA,GAEftmL,EAAIwmL,GAAoB,EAAIpC,GACM,MAAlCnhL,EAAOujL,GAAoB,GAC9BA,GAAoBxmL,QAEjB,IAAKmlL,YAAY75D,GACtB,OAAOy6D,GAETU,GAAQA,IAASpB,YAAY/5D,EAAM86D,EAAUd,GAC7Cc,EAAW96D,CACb,CAEAg7D,EAAkBA,GAAoBC,IACnCvmL,EAAIwmL,GAAoB,EAAIpC,GACM,MAAlCnhL,EAAOujL,GAAoB,EAChC,CAIA,OAAKH,GAAiBC,EASlBJ,EAAiB,GAAKR,oBAAoBziL,GACrC8iL,GAIJtB,EAGED,IAAgBZ,GAAsBmC,GAAeH,GAFnDU,EAAkBR,GAAeD,IAZpCY,IAAUhC,GAAgB0B,EAAkBljL,GAGzCuhL,IAAgBZ,GAAsBmC,GAAeH,GAFnDD,EAcb,CAQA,SAASiB,YAAYjiK,EAAO1hB,EAAQi6D,EAAO2pH,EAAOvB,GAChD3gK,EAAMmiK,KAAQ,WACZ,GAAsB,IAAlB7jL,EAAOvC,OACT,OAAOikB,EAAM6/J,cAAgBZ,GAAsB,KAAO,KAE5D,IAAKj/J,EAAM2/J,gBAC2C,IAAhDd,GAA2BpkL,QAAQ6D,IAAkBwgL,GAAyBlkL,KAAK0D,IACrF,OAAO0hB,EAAM6/J,cAAgBZ,GAAuB,IAAM3gL,EAAS,IAAQ,IAAMA,EAAS,IAI9F,IAAI23F,EAASj2E,EAAMi2E,OAASxyF,KAAK2C,IAAI,EAAGmyD,GAQpCknH,GAAiC,IAArBz/J,EAAMy/J,WACjB,EAAIh8K,KAAK2C,IAAI3C,KAAKC,IAAIsc,EAAMy/J,UAAW,IAAKz/J,EAAMy/J,UAAYxpF,GAG/DqrF,EAAiBY,GAEfliK,EAAMq/J,WAAa,GAAK9mH,GAASv4C,EAAMq/J,UAK7C,OAAQgC,kBAAkB/iL,EAAQgjL,EAAgBthK,EAAMi2E,OAAQwpF,GAJhE,SAAS2C,cAAc9jL,GACrB,OA1PN,SAAS+jL,sBAAsBriK,EAAO/lB,GACpC,IAAImW,EAAOrU,EAEX,IAAKqU,EAAQ,EAAGrU,EAASikB,EAAMi2J,cAAcl6K,OAAQqU,EAAQrU,EAAQqU,GAAS,EAG5E,GAFO4P,EAAMi2J,cAAc7lK,GAElBoxB,QAAQvnC,GACf,OAAO,EAIX,OAAO,CACT,CA8OaooL,CAAsBriK,EAAO1hB,EACtC,GAGiB0hB,EAAM6/J,YAAa7/J,EAAM8/J,cAAgBoC,EAAOvB,IAE/D,KAAKK,GACH,OAAO1iL,EACT,KAAK2iL,GACH,MAAO,IAAM3iL,EAAOpE,QAAQ,KAAM,MAAQ,IAC5C,KAAKgnL,GACH,MAAO,IAAMoB,YAAYhkL,EAAQ0hB,EAAMi2E,QACnCssF,kBAAkBpC,aAAa7hL,EAAQ23F,IAC7C,KAAKkrF,GACH,MAAO,IAAMmB,YAAYhkL,EAAQ0hB,EAAMi2E,QACnCssF,kBAAkBpC,aA4B9B,SAASqC,WAAWlkL,EAAQ+gH,GAK1B,IAWIojE,EAGAtoL,EAdAuoL,EAAS,iBAGT7rK,GACE8rK,EAASrkL,EAAO7D,QAAQ,MAC5BkoL,GAAqB,IAAZA,EAAgBA,EAASrkL,EAAOvC,OACzC2mL,EAAOnwI,UAAYowI,EACZC,SAAStkL,EAAOK,MAAM,EAAGgkL,GAAStjE,IAGvCwjE,EAAiC,OAAdvkL,EAAO,IAA6B,MAAdA,EAAO,GAPtC,IACRqkL,EAWN,KAAQxoL,EAAQuoL,EAAO9lK,KAAKte,IAAU,CACpC,IAAIktF,EAASrxF,EAAM,GAAIq1J,EAAOr1J,EAAM,GACpCsoL,EAA4B,MAAZjzB,EAAK,GACrB34I,GAAU20E,GACJq3F,GAAqBJ,GAAyB,KAATjzB,EAC9B,GAAP,MACFozB,SAASpzB,EAAMnwC,GACnBwjE,EAAmBJ,CACrB,CAEA,OAAO5rK,CACT,CA3D2C2rK,CAAWlkL,EAAQmhL,GAAYxpF,IACpE,KAAKmrF,GACH,MAAO,IAuGf,SAAS0B,aAAaxkL,GAKpB,IAJA,IAEIykL,EAFAlsK,EAAS,GACT8vG,EAAO,EAGFtrH,EAAI,EAAGA,EAAIiD,EAAOvC,OAAQ4qH,GAAQ,MAAUtrH,GAAK,EAAIA,IAC5DsrH,EAAOm6D,YAAYxiL,EAAQjD,KAC3B0nL,EAAYnE,GAAiBj4D,KAEX65D,YAAY75D,IAC5B9vG,GAAUvY,EAAOjD,GACbsrH,GAAQ,QAAS9vG,GAAUvY,EAAOjD,EAAI,KAE1Cwb,GAAUksK,GAAahE,UAAUp4D,GAIrC,OAAO9vG,CACT,CAzHqBisK,CAAaxkL,GAAU,IACtC,QACE,MAAM,IAAI8vK,GAAU,0CAE1B,CA/Ca,EAgDf,CAGA,SAASkU,YAAYhkL,EAAQijL,GAC3B,IAAIyB,EAAkBjC,oBAAoBziL,GAAUjE,OAAOknL,GAAkB,GAGzEzuK,EAA8C,OAA9BxU,EAAOA,EAAOvC,OAAS,GAI3C,OAAOinL,GAHIlwK,IAAuC,OAA9BxU,EAAOA,EAAOvC,OAAS,IAA0B,OAAXuC,GACvC,IAAOwU,EAAO,GAAK,KAEL,IACnC,CAGA,SAASyvK,kBAAkBjkL,GACzB,MAAqC,OAA9BA,EAAOA,EAAOvC,OAAS,GAAcuC,EAAOK,MAAM,GAAI,GAAKL,CACpE,CAyCA,SAASskL,SAASpzB,EAAMnwC,GACtB,GAAa,KAATmwC,GAA2B,MAAZA,EAAK,GAAY,OAAOA,EAa3C,IAVA,IACIr1J,EAEW0C,EAHXomL,EAAU,SAGVrmL,EAAQ,EAAQisJ,EAAO,EAAGjnI,EAAO,EACjC/K,EAAS,GAML1c,EAAQ8oL,EAAQrmK,KAAK4yI,KAC3B5tI,EAAOznB,EAAMiW,OAEFxT,EAAQyiH,IACjBxiH,EAAOgsJ,EAAOjsJ,EAASisJ,EAAOjnI,EAC9B/K,GAAU,KAAO24I,EAAK7wJ,MAAM/B,EAAOC,GAEnCD,EAAQC,EAAM,GAEhBgsJ,EAAOjnI,EAaT,OARA/K,GAAU,KAEN24I,EAAKzzJ,OAASa,EAAQyiH,GAASwpC,EAAOjsJ,EACxCia,GAAU24I,EAAK7wJ,MAAM/B,EAAOisJ,GAAQ,KAAO2G,EAAK7wJ,MAAMkqJ,EAAO,GAE7DhyI,GAAU24I,EAAK7wJ,MAAM/B,GAGhBia,EAAOlY,MAAM,EACtB,CAmDA,SAASukL,mBAAmBljK,EAAOu4C,EAAOzgD,EAAQimF,GAChD,IAEI3tF,EACArU,EACAqC,EAJAqoI,EAAU,GACVkyC,EAAU34J,EAAMpJ,IAKpB,IAAKxG,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC/DhS,EAAQ0Z,EAAO1H,GAEX4P,EAAM+/J,WACR3hL,EAAQ4hB,EAAM+/J,SAASp+K,KAAKmW,EAAQzd,OAAO+V,GAAQhS,KAIjD+kL,UAAUnjK,EAAOu4C,EAAQ,EAAGn6D,GAAO,GAAM,GAAM,GAAO,SACpC,IAAVA,GACP+kL,UAAUnjK,EAAOu4C,EAAQ,EAAG,MAAM,GAAM,GAAM,GAAO,MAEnDwlC,GAAuB,KAAZ0oC,IACdA,GAAW65C,iBAAiBtgK,EAAOu4C,IAGjCv4C,EAAMmiK,MAAQ9E,KAAmBr9J,EAAMmiK,KAAKvmL,WAAW,GACzD6qI,GAAW,IAEXA,GAAW,KAGbA,GAAWzmH,EAAMmiK,MAIrBniK,EAAMpJ,IAAM+hK,EACZ34J,EAAMmiK,KAAO17C,GAAW,IAC1B,CA8HA,SAAS28C,WAAWpjK,EAAOlI,EAAQs4J,GACjC,IAAI3pC,EAASqzC,EAAU1pK,EAAOrU,EAAQgE,EAAM2S,EAI5C,IAAKtC,EAAQ,EAAGrU,GAFhB+9K,EAAW1J,EAAWpwJ,EAAMggK,cAAgBhgK,EAAMi2J,eAEhBl6K,OAAQqU,EAAQrU,EAAQqU,GAAS,EAGjE,KAFArQ,EAAO+5K,EAAS1pK,IAENuqF,YAAe56F,EAAK08D,cACxB18D,EAAK46F,YAAkC,iBAAX7iF,GAAyBA,aAAkB/X,EAAK46F,eAC5E56F,EAAK08D,WAAc18D,EAAK08D,UAAU3kD,IAAU,CAYhD,GAVIs4J,EACErwK,EAAK4vK,OAAS5vK,EAAK2vK,cACrB1vJ,EAAMpJ,IAAM7W,EAAK2vK,cAAc53J,GAE/BkI,EAAMpJ,IAAM7W,EAAK6W,IAGnBoJ,EAAMpJ,IAAM,IAGV7W,EAAK0vK,UAAW,CAGlB,GAFA/8J,EAAQsN,EAAMs/J,SAASv/K,EAAK6W,MAAQ7W,EAAK21F,aAEF,sBAAnCunF,GAAUt7K,KAAK5B,EAAK0vK,WACtBhpC,EAAU1mI,EAAK0vK,UAAU33J,EAAQpF,OAC5B,KAAIwqK,GAAgBv7K,KAAK5B,EAAK0vK,UAAW/8J,GAG9C,MAAM,IAAI07J,GAAU,KAAOruK,EAAK6W,IAAM,+BAAiClE,EAAQ,WAF/E+zH,EAAU1mI,EAAK0vK,UAAU/8J,GAAOoF,EAAQpF,EAG1C,CAEAsN,EAAMmiK,KAAO17C,CACf,CAEA,OAAO,CACT,CAGF,OAAO,CACT,CAKA,SAAS08C,UAAUnjK,EAAOu4C,EAAOzgD,EAAQskC,EAAO2hD,EAASmkF,EAAOmB,GAC9DrjK,EAAMpJ,IAAM,KACZoJ,EAAMmiK,KAAOrqK,EAERsrK,WAAWpjK,EAAOlI,GAAQ,IAC7BsrK,WAAWpjK,EAAOlI,GAAQ,GAG5B,IAEIwrK,EAFAvjL,EAAOk9K,GAAUt7K,KAAKqe,EAAMmiK,MAC5BxB,EAAUvkI,EAGVA,IACFA,EAASp8B,EAAMq/J,UAAY,GAAKr/J,EAAMq/J,UAAY9mH,GAGpD,IACIgrH,EACAC,EAFAC,EAAyB,oBAAT1jL,GAAuC,mBAATA,EAalD,GATI0jL,IAEFD,GAAgC,KADhCD,EAAiBvjK,EAAMigK,WAAWxlL,QAAQqd,MAIzB,OAAdkI,EAAMpJ,KAA8B,MAAdoJ,EAAMpJ,KAAgB4sK,GAA+B,IAAjBxjK,EAAMi2E,QAAgB19B,EAAQ,KAC3FwlC,GAAU,GAGRylF,GAAaxjK,EAAMkgK,eAAeqD,GACpCvjK,EAAMmiK,KAAO,QAAUoB,MAClB,CAIL,GAHIE,GAAiBD,IAAcxjK,EAAMkgK,eAAeqD,KACtDvjK,EAAMkgK,eAAeqD,IAAkB,GAE5B,oBAATxjL,EACEq8C,GAA6C,IAAnCx+C,OAAOyZ,KAAK2I,EAAMmiK,MAAMpmL,SAhK5C,SAAS2nL,kBAAkB1jK,EAAOu4C,EAAOzgD,EAAQimF,GAC/C,IAGI3tF,EACArU,EACAm1F,EACAyyF,EACAC,EACAC,EARAp9C,EAAgB,GAChBkyC,EAAgB34J,EAAMpJ,IACtBktK,EAAgBlmL,OAAOyZ,KAAKS,GAShC,IAAuB,IAAnBkI,EAAMw/J,SAERsE,EAAcpoI,YACT,GAA8B,mBAAnB17B,EAAMw/J,SAEtBsE,EAAcpoI,KAAK17B,EAAMw/J,eACpB,GAAIx/J,EAAMw/J,SAEf,MAAM,IAAIpR,GAAU,4CAGtB,IAAKh+J,EAAQ,EAAGrU,EAAS+nL,EAAc/nL,OAAQqU,EAAQrU,EAAQqU,GAAS,EACtEyzK,EAAa,GAER9lF,GAAuB,KAAZ0oC,IACdo9C,GAAcvD,iBAAiBtgK,EAAOu4C,IAIxCorH,EAAc7rK,EADdo5E,EAAY4yF,EAAc1zK,IAGtB4P,EAAM+/J,WACR4D,EAAc3jK,EAAM+/J,SAASp+K,KAAKmW,EAAQo5E,EAAWyyF,IAGlDR,UAAUnjK,EAAOu4C,EAAQ,EAAG24B,GAAW,GAAM,GAAM,MAIxD0yF,EAA8B,OAAd5jK,EAAMpJ,KAA8B,MAAdoJ,EAAMpJ,KAC5BoJ,EAAMmiK,MAAQniK,EAAMmiK,KAAKpmL,OAAS,QAG5CikB,EAAMmiK,MAAQ9E,KAAmBr9J,EAAMmiK,KAAKvmL,WAAW,GACzDioL,GAAc,IAEdA,GAAc,MAIlBA,GAAc7jK,EAAMmiK,KAEhByB,IACFC,GAAcvD,iBAAiBtgK,EAAOu4C,IAGnC4qH,UAAUnjK,EAAOu4C,EAAQ,EAAGorH,GAAa,EAAMC,KAIhD5jK,EAAMmiK,MAAQ9E,KAAmBr9J,EAAMmiK,KAAKvmL,WAAW,GACzDioL,GAAc,IAEdA,GAAc,KAMhBp9C,GAHAo9C,GAAc7jK,EAAMmiK,OAMtBniK,EAAMpJ,IAAM+hK,EACZ34J,EAAMmiK,KAAO17C,GAAW,IAC1B,CAqFQi9C,CAAkB1jK,EAAOu4C,EAAOv4C,EAAMmiK,KAAMpkF,GACxCylF,IACFxjK,EAAMmiK,KAAO,QAAUoB,EAAiBvjK,EAAMmiK,SAjNxD,SAAS4B,iBAAiB/jK,EAAOu4C,EAAOzgD,GACtC,IAGI1H,EACArU,EACAm1F,EACAyyF,EACAE,EAPAp9C,EAAgB,GAChBkyC,EAAgB34J,EAAMpJ,IACtBktK,EAAgBlmL,OAAOyZ,KAAKS,GAOhC,IAAK1H,EAAQ,EAAGrU,EAAS+nL,EAAc/nL,OAAQqU,EAAQrU,EAAQqU,GAAS,EAEtEyzK,EAAa,GACG,KAAZp9C,IAAgBo9C,GAAc,MAE9B7jK,EAAM4/J,eAAciE,GAAc,KAGtCF,EAAc7rK,EADdo5E,EAAY4yF,EAAc1zK,IAGtB4P,EAAM+/J,WACR4D,EAAc3jK,EAAM+/J,SAASp+K,KAAKmW,EAAQo5E,EAAWyyF,IAGlDR,UAAUnjK,EAAOu4C,EAAO24B,GAAW,GAAO,KAI3ClxE,EAAMmiK,KAAKpmL,OAAS,OAAM8nL,GAAc,MAE5CA,GAAc7jK,EAAMmiK,MAAQniK,EAAM4/J,aAAe,IAAM,IAAM,KAAO5/J,EAAM4/J,aAAe,GAAK,KAEzFuD,UAAUnjK,EAAOu4C,EAAOorH,GAAa,GAAO,KAOjDl9C,GAHAo9C,GAAc7jK,EAAMmiK,OAMtBniK,EAAMpJ,IAAM+hK,EACZ34J,EAAMmiK,KAAO,IAAM17C,EAAU,GAC/B,CAwKQs9C,CAAiB/jK,EAAOu4C,EAAOv4C,EAAMmiK,MACjCqB,IACFxjK,EAAMmiK,KAAO,QAAUoB,EAAiB,IAAMvjK,EAAMmiK,YAGnD,GAAa,mBAATpiL,EACLq8C,GAAgC,IAAtBp8B,EAAMmiK,KAAKpmL,QACnBikB,EAAMm/J,gBAAkBkE,GAAc9qH,EAAQ,EAChD2qH,mBAAmBljK,EAAOu4C,EAAQ,EAAGv4C,EAAMmiK,KAAMpkF,GAEjDmlF,mBAAmBljK,EAAOu4C,EAAOv4C,EAAMmiK,KAAMpkF,GAE3CylF,IACFxjK,EAAMmiK,KAAO,QAAUoB,EAAiBvjK,EAAMmiK,SAlSxD,SAAS6B,kBAAkBhkK,EAAOu4C,EAAOzgD,GACvC,IAEI1H,EACArU,EACAqC,EAJAqoI,EAAU,GACVkyC,EAAU34J,EAAMpJ,IAKpB,IAAKxG,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC/DhS,EAAQ0Z,EAAO1H,GAEX4P,EAAM+/J,WACR3hL,EAAQ4hB,EAAM+/J,SAASp+K,KAAKmW,EAAQzd,OAAO+V,GAAQhS,KAIjD+kL,UAAUnjK,EAAOu4C,EAAOn6D,GAAO,GAAO,SACpB,IAAVA,GACP+kL,UAAUnjK,EAAOu4C,EAAO,MAAM,GAAO,MAExB,KAAZkuE,IAAgBA,GAAW,KAAQzmH,EAAM4/J,aAAqB,GAAN,MAC5Dn5C,GAAWzmH,EAAMmiK,MAIrBniK,EAAMpJ,IAAM+hK,EACZ34J,EAAMmiK,KAAO,IAAM17C,EAAU,GAC/B,CA2QQu9C,CAAkBhkK,EAAOu4C,EAAOv4C,EAAMmiK,MAClCqB,IACFxjK,EAAMmiK,KAAO,QAAUoB,EAAiB,IAAMvjK,EAAMmiK,WAGnD,IAAa,oBAATpiL,EAIJ,IAAa,uBAATA,EACT,OAAO,EAEP,GAAIigB,EAAMo/J,YAAa,OAAO,EAC9B,MAAM,IAAIhR,GAAU,0CAA4CruK,EAClE,CARoB,MAAdigB,EAAMpJ,KACRqrK,YAAYjiK,EAAOA,EAAMmiK,KAAM5pH,EAAO2pH,EAAOvB,EAOjD,CAEkB,OAAd3gK,EAAMpJ,KAA8B,MAAdoJ,EAAMpJ,MAc9B0sK,EAAS/6I,UACU,MAAjBvoB,EAAMpJ,IAAI,GAAaoJ,EAAMpJ,IAAIjY,MAAM,GAAKqhB,EAAMpJ,KAClD1c,QAAQ,KAAM,OAGdopL,EADmB,MAAjBtjK,EAAMpJ,IAAI,GACH,IAAM0sK,EACkB,uBAAxBA,EAAO3kL,MAAM,EAAG,IAChB,KAAO2kL,EAAO3kL,MAAM,IAEpB,KAAO2kL,EAAS,IAG3BtjK,EAAMmiK,KAAOmB,EAAS,IAAMtjK,EAAMmiK,KAEtC,CAEA,OAAO,CACT,CAEA,SAAS8B,uBAAuBnsK,EAAQkI,GACtC,IAEI5P,EACArU,EAHA8vC,EAAU,GACVq4I,EAAoB,GAMxB,IAFAC,YAAYrsK,EAAQ+zB,EAASq4I,GAExB9zK,EAAQ,EAAGrU,EAASmoL,EAAkBnoL,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC1E4P,EAAMigK,WAAW7jL,KAAKyvC,EAAQq4I,EAAkB9zK,KAElD4P,EAAMkgK,eAAiB,IAAIzjL,MAAMV,EACnC,CAEA,SAASooL,YAAYrsK,EAAQ+zB,EAASq4I,GACpC,IAAIJ,EACA1zK,EACArU,EAEJ,GAAe,OAAX+b,GAAqC,iBAAXA,EAE5B,IAAe,KADf1H,EAAQy7B,EAAQpxC,QAAQqd,KAEoB,IAAtCosK,EAAkBzpL,QAAQ2V,IAC5B8zK,EAAkB9nL,KAAKgU,QAKzB,GAFAy7B,EAAQzvC,KAAK0b,GAETrb,MAAMuD,QAAQ8X,GAChB,IAAK1H,EAAQ,EAAGrU,EAAS+b,EAAO/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EAC/D+zK,YAAYrsK,EAAO1H,GAAQy7B,EAASq4I,QAKtC,IAAK9zK,EAAQ,EAAGrU,GAFhB+nL,EAAgBlmL,OAAOyZ,KAAKS,IAEW/b,OAAQqU,EAAQrU,EAAQqU,GAAS,EACtE+zK,YAAYrsK,EAAOgsK,EAAc1zK,IAASy7B,EAASq4I,EAK7D,CAoBA,IAAIE,GAlBJ,SAASC,OAAO72K,EAAO0C,GAGrB,IAAI8P,EAAQ,IAAIk/J,MAFhBhvK,EAAUA,GAAW,CAAC,GAIjB8P,EAAM0/J,QAAQuE,uBAAuBz2K,EAAOwS,GAEjD,IAAI5hB,EAAQoP,EAMZ,OAJIwS,EAAM+/J,WACR3hL,EAAQ4hB,EAAM+/J,SAASp+K,KAAK,CAAE,GAAIvD,GAAS,GAAIA,IAG7C+kL,UAAUnjK,EAAO,EAAG5hB,GAAO,GAAM,GAAc4hB,EAAMmiK,KAAO,KAEzD,EACT,EAQA,SAASmC,QAAQnmL,EAAMu7D,GACrB,OAAO,WACL,MAAM,IAAI/8D,MAAM,iBAAmBwB,EAAnB,sCACAu7D,EAAK,0CACvB,CACF,CAGA,IAAI6qH,GAAsBxkL,GACtBykL,GAAsBxrB,GACtByrB,GAAsB5T,GACtB6T,GAAsBrjI,GACtBsjI,GAAsBrS,GACtBsS,GAAsBt5I,GACtB4hD,GAAsB2vF,GAAO3vF,KAC7B4vF,GAAsBD,GAAOC,QAC7BqF,GApBS,CACZA,KAAMiC,IAmB0BjC,KAC7B0C,GAAsBzW,GAGtB1rF,GAAQ,CACVjzC,OAAWA,GACXq1I,MAAW,GACXp1J,IAAWA,GACXq1J,KAAWjU,GACXxtF,MAAWA,GACXz9E,IAAWA,GACX4sK,UAAWA,GACXl4E,KAAWA,GACXpF,IAAW,GACX5jC,MAAW,GACX2J,KAAWA,GACX9O,IAAWA,GACXnyD,IAAWA,IAIT+qL,GAAsBV,QAAQ,WAAY,QAC1CW,GAAsBX,QAAQ,cAAe,WAC7CY,GAAsBZ,QAAQ,WAAY,QAmB9C,SAjBa,CACZC,KAAMA,GACNC,OAAQA,GACRC,gBAAiBA,GACjBC,YAAaA,GACbC,YAAaA,GACbC,eAAgBA,GAChB13F,KAAMA,GACN4vF,QAASA,GACTqF,KAAMA,GACN0C,cAAeA,GACfniG,MAAOA,GACPsiG,SAAUA,GACVC,YAAaA,GACbC,SAAUA,ICpwHEC,gBAAkBA,CAACpiI,EAAMm8G,KACpC,IACE,OAAOwX,GAAAA,KAAU3zH,EACnB,CAAE,MAAMn+C,GAIN,OAHIs6J,GACFA,EAAOyF,WAAW3M,aAAc,IAAIr7J,MAAMiI,IAErC,CAAC,CACV,GCVWwgL,GAAiB,iBACjBC,GAAiB,iBAGvB,SAASr0H,OAAOs0H,EAAYC,GACjC,MAAO,CACLxlL,KAAMqlL,GACNh0F,QAAS,CACP,CAACk0F,GAAaC,GAGpB,CAGO,SAASC,OAAOF,GACrB,MAAO,CACLvlL,KAAMslL,GACNj0F,QAASk0F,EAEb,CAIO,MAAMlwB,eAASA,IAAM,OCrBfqwB,eAAkBrvC,GAAS8oB,IACtC,MAAO3wJ,IAAI,MAAEi5J,IAAWtI,EAExB,OAAOsI,EAAMpxB,EAAI,EAGNsvC,eAAiBA,CAACtvC,EAAKp8F,IAAMi9G,IAAsB,IAArB,YAAE0uB,GAAa1uB,EACxD,GAAI7gB,EACF,OAAOuvC,EAAYF,eAAervC,GAAKnb,KAAKr5G,KAAMA,MAGpD,SAASA,KAAKje,GACRA,aAAehH,OAASgH,EAAIiiL,QAAU,KACxCD,EAAYE,oBAAoB,gBAChCF,EAAYE,oBAAoB,gBAChCF,EAAYG,UAAU,IACtBjhL,QAAQC,MAAMnB,EAAIikK,WAAa,IAAMxxB,EAAIt8I,KACzCkgD,EAAG,OAEHA,EAAGmrI,gBAAgBxhL,EAAImO,MAE3B,GCtBW7M,IAAMA,CAAC+a,EAAOhP,IAClBgP,EAAMmlD,MAAM1oE,MAAMuD,QAAQgR,GAAQA,EAAO,CAACA,ICKnD,IAEE,CAACo0K,IAAiB,CAACplK,EAAO2yG,IACjB3yG,EAAMuxC,OAAM5E,EAAAA,GAAAA,QAAOgmE,EAAOvhC,UAGnC,CAACi0F,IAAiB,CAACrlK,EAAO2yG,KACxB,MAAM2yD,EAAa3yD,EAAOvhC,QACpB20F,EAAS/lK,EAAM/a,IAAIqgL,GACzB,OAAOtlK,EAAMna,IAAIy/K,GAAaS,EAAO,GCTnChf,GAAgB,CACpBif,eAAgBA,IACPb,6JAKI,SAASc,gBAEtB,MAAO,CACL3mB,aAAc,CACZiO,KAAM,CACJ9L,QAASkkB,EACT3jB,UAAW+E,IAEb5H,QAAS,CACP9nB,SAAQ,GACRoqB,QAAO,EACPO,UAASA,IAIjB,CC7BO,MAAMkkB,QAAW9nL,GACnBA,EACM61J,QAAQW,UAAU,KAAM,KAAO,IAAGx2J,KAElCsV,OAAOsmF,SAAShrC,KAAO,kECClC,MAAMm3H,GAAY,mBACZC,GAAkB,sBAuJxB,UACE73K,GAAI,CACF83K,gBAtBJ,SAASA,gBAAgB12J,EAAS22J,GAChC,MAAMC,EAAcn0K,SAAS2pB,gBAC7B,IAAIrpB,EAAQu+I,iBAAiBthI,GAC7B,MAAM62J,EAAyC,aAAnB9zK,EAAME,SAC5B6zK,EAAgBH,EAAgB,uBAAyB,gBAE/D,GAAuB,UAAnB5zK,EAAME,SACR,OAAO2zK,EACT,IAAK,IAAI5xK,EAASgb,EAAUhb,EAASA,EAAO+xK,eAE1C,GADAh0K,EAAQu+I,iBAAiBt8I,KACrB6xK,GAA0C,WAAnB9zK,EAAME,WAG7B6zK,EAAc7rL,KAAK8X,EAAMi0K,SAAWj0K,EAAMk0K,UAAYl0K,EAAMm0K,WAC9D,OAAOlyK,EAGX,OAAO4xK,CACT,GAMEjnB,aAAc,CACZwnB,OAAQ,CACNrlB,QAAS,CACPslB,gBA7CuBA,CAACj/H,EAAKqpG,IAAe+N,IAClD,IACE/N,EAAYA,GAAa+N,EAAO3wJ,GAAG83K,gBAAgBv+H,GAClCyrG,KAAAA,eAAyBpC,GAC/Bz3F,GAAG5R,EAChB,CAAE,MAAMljD,GACNC,QAAQC,MAAMF,EAChB,GAuCM6uJ,SAvHiBziJ,IAChB,CACLjR,KAAMomL,GACN/0F,QAAS30F,MAAMuD,QAAQgR,GAAQA,EAAO,CAACA,KAqHnCg2K,cArCqBA,KACpB,CACLjnL,KAAMqmL,KAoCFa,cA1DqBA,CAACC,EAAYp/H,IAASo3G,IACjD,MAAMioB,EAAcjoB,EAAOkoB,gBAAgBC,iBAExCzuB,KAAAA,GAAMuuB,GAAax6H,EAAAA,GAAAA,QAAOu6H,MAC3BhoB,EAAOooB,cAAcP,gBAAgBj/H,GACrCo3G,EAAOooB,cAAcN,gBACvB,EAqDMO,kBAnH0BC,GAAYnxB,IAAqD,IAApD,cAAEixB,EAAa,gBAAEF,EAAe,WAAE5mB,GAAYnK,EAE3F,GAAImK,IAAainB,aAIdD,EAAS,CACV,IAAIx4H,EAAOw4H,EAAQ7oL,MAAM,GAGV,MAAZqwD,EAAK,KAENA,EAAOA,EAAKrwD,MAAM,IAGL,MAAZqwD,EAAK,KAINA,EAAOA,EAAKrwD,MAAM,IAGpB,MAAM+oL,EAAY14H,EAAK/gD,MAAM,KAAKyhB,KAAIluB,GAAQA,GAAO,KAE/C0lL,EAAaE,EAAgBO,2BAA2BD,IAEvD3nL,EAAM6nL,EAAQ,GAAIC,EAAmB,IAAMX,EAElD,GAAY,eAATnnL,EAAuB,CAExB,MAAM+nL,EAAgBV,EAAgBO,2BAA2B,CAACC,IAI/DA,EAAMntL,QAAQ,MAAQ,IACvBoK,QAAQ4O,KAAK,mGACb6zK,EAAcS,KAAKD,EAAcp4J,KAAIluB,GAAOA,EAAItH,QAAQ,KAAM,QAAO,IAGvEotL,EAAcS,KAAKD,GAAe,EACpC,EAIIF,EAAMntL,QAAQ,MAAQ,GAAKotL,EAAiBptL,QAAQ,MAAQ,KAC9DoK,QAAQ4O,KAAK,mGACb6zK,EAAcS,KAAKb,EAAWx3J,KAAIluB,GAAOA,EAAItH,QAAQ,KAAM,QAAO,IAGpEotL,EAAcS,KAAKb,GAAY,GAG/BI,EAAc7zB,SAASyzB,EACzB,IAgEIllB,UAAW,CACTqlB,eAAernK,GACNA,EAAM/a,IAAI,eAEnB0iL,0BAAAA,CAA2B3nK,EAAOgoK,GAChC,MAAOpxK,EAAKqxK,GAAeD,EAE3B,OAAGC,EACM,CAAC,aAAcrxK,EAAKqxK,GAClBrxK,EACF,CAAC,iBAAkBA,GAErB,EACT,EACAsxK,0BAAAA,CAA2BloK,EAAOknK,GAChC,IAAKnnL,EAAM6W,EAAKqxK,GAAef,EAE/B,MAAW,cAARnnL,EACM,CAAC6W,EAAKqxK,GACI,kBAARloL,EACF,CAAC6W,GAEH,EACT,GAEFygI,SAAU,CACR,CAAC8uC,IAAU,CAACnmK,EAAO2yG,IACV3yG,EAAMna,IAAI,cAAe+yJ,KAAAA,OAAUjmC,EAAOvhC,UAEnD,CAACg1F,IAAiBpmK,GACTA,EAAMorB,OAAO,gBAGxBy2H,YAAa,CACXkmB,KApMYA,CAACxlB,EAAGtL,KAAA,IAAE,WAAEuJ,EAAU,gBAAE4mB,GAAiBnwB,EAAA,OAAK,WAAc,IAAD,IAAAhlI,EAAAzxB,UAAAzE,OAATyhB,EAAI,IAAA/gB,MAAAw1B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1U,EAAI0U,GAAA1xB,UAAA0xB,GAGpE,GAFAqwI,KAAO/kJ,GAEHgjJ,IAAainB,YAIjB,IACE,IAAKU,EAAYC,GAAS5qK,EAE1B2qK,EAAa1rL,MAAMuD,QAAQmoL,GAAcA,EAAa,CAACA,GAGvD,MAAMH,EAAeZ,EAAgBc,2BAA2BC,GAGhE,IAAIH,EAAajsL,OACf,OAEF,MAAOgE,EAAMsoL,GAAaL,EAE1B,IAAKI,EACH,OAAOlC,QAAQ,KAGW,IAAxB8B,EAAajsL,OACfmqL,QAAQ9oB,mBAAoB,IAAGzrJ,mBAAmB5R,MAAS4R,mBAAmB02K,OAC7C,IAAxBL,EAAajsL,QACtBmqL,QAAQ9oB,mBAAoB,IAAGzrJ,mBAAmB5R,MAGtD,CAAE,MAAO6E,GAGPC,QAAQC,MAAMF,EAChB,CACF,CAAC,qECzCD,MAuBA,kBAvBgB2W,CAAC+sK,EAAKppB,IAAW,MAAMqpB,yBAAyB3nB,GAAAA,UAM9D4nB,OAAU1gI,IACR,MAAM,UAAEmkH,GAAc3yK,KAAKmuB,OACrB,IAAE7Q,EAAG,YAAEqxK,GAAgBhc,EAAU/sJ,WACvC,IAAI,WAAEgoK,GAAejb,EAAU/sJ,WAC/BgoK,EAAaA,GAAc,CAAC,aAActwK,EAAKqxK,GAC/C/oB,EAAOooB,cAAcL,cAAcC,EAAYp/H,EAAI,EAGrDnS,MAAAA,GACE,OACEirH,GAAAA,cAAA,QAAM94G,IAAKxuD,KAAKkvL,QACd5nB,GAAAA,cAAC0nB,EAAQhvL,KAAKmuB,OAGpB,GCCF,sBArBgBlM,CAAC+sK,EAAKppB,IAAW,MAAMupB,4BAA4B7nB,GAAAA,UAMjE4nB,OAAU1gI,IACR,MAAM,IAAElxC,GAAQtd,KAAKmuB,MACfy/J,EAAa,CAAC,iBAAkBtwK,GACtCsoJ,EAAOooB,cAAcL,cAAcC,EAAYp/H,EAAI,EAGrDnS,MAAAA,GACE,OACEirH,GAAAA,cAAA,QAAM94G,IAAKxuD,KAAKkvL,QACd5nB,GAAAA,cAAC0nB,EAAQhvL,KAAKmuB,OAGpB,GCjBa,wBACb,MAAO,CAACq/J,GAAQ,CACdxnB,aAAc,CACZH,QAAS,CACP0C,YAAa,CACXzM,OAAQA,CAACmN,EAAKrD,IAAW,WACvBqD,KAAI/hK,WAEJ,MAAMwuD,EAAOt9C,mBAAmBgC,OAAOsmF,SAAShrC,MAChDkwG,EAAOooB,cAAcC,kBAAkBv4H,EACzC,KAINo0G,eAAgB,CACd6I,UAAWsc,kBACXG,aAAcD,wBAGpB,gECvBO,SAAS5lG,UAAUz2E,GAGxB,OAAOA,EACJsjB,KAAIvb,IACH,IAAIw0K,EAAU,sBACVttL,EAAI8Y,EAAIlP,IAAI,WAAWxK,QAAQkuL,GACnC,GAAGttL,GAAK,EAAG,CACT,IAAIqnF,EAAQvuE,EAAIlP,IAAI,WAAWtG,MAAMtD,EAAIstL,IAAgB16K,MAAM,KAC/D,OAAOkG,EAAItO,IAAI,UAAWsO,EAAIlP,IAAI,WAAWtG,MAAM,EAAGtD,GAO9D,SAASutL,eAAelmG,GACtB,OAAOA,EAAMjyD,QAAO,CAACi0E,EAAGphG,EAAGjI,EAAGC,IACzBD,IAAMC,EAAIS,OAAS,GAAKT,EAAIS,OAAS,EAC/B2oG,EAAI,MAAQphG,EACXhI,EAAID,EAAE,IAAMC,EAAIS,OAAS,EAC1B2oG,EAAIphG,EAAI,KACPhI,EAAID,EAAE,GACPqpG,EAAIphG,EAAI,IAERohG,EAAIphG,GAEZ,cACL,CAnBmEslL,CAAelmG,GAC5E,CACE,OAAOvuE,CACT,GAEN,gECXO,SAAS0uE,0BAAUz2E,EAAM6qJ,GAAe,IAAb,OAAE4xB,GAAQ5xB,EAI1C,OAAO7qJ,CAiBT,CCpBA,MAAM08K,GAAoB,CACxBC,EACAC,GAGa,SAASC,gBAAiB78K,GAKvC,IAAI88K,EAAS,CACXL,OAAQ,CAAC,GAGPM,EAAoB14J,KAAOq4J,IAAmB,CAACjyK,EAAQuyK,KACzD,IAEE,OAD6BA,EAAYvmG,UAAUhsE,EAAQqyK,GAC7Bp5J,QAAO3b,KAASA,GAChD,CAAE,MAAMvP,GAEN,OADAC,QAAQC,MAAM,qBAAsBF,GAC7BiS,CACT,IACCzK,GAEH,OAAO+8K,EACJr5J,QAAO3b,KAASA,IAChBub,KAAIvb,KACCA,EAAIlP,IAAI,SAAWkP,EAAIlP,IAAI,QAGxBkP,IAGb,CCvBA,IAAIk1K,GAA0B,CAE5B75B,KAAM,EACNj3F,MAAO,QACPvrD,QAAS,iBCfX,MAEas8K,GAAYrf,IAFXjqJ,GAASA,IAIrB7L,GAAOA,EAAIlP,IAAI,UAAU+xD,EAAAA,GAAAA,WAGduyH,GAAYtf,GACvBqf,IACA32K,GAAOA,EAAIzJ,SCRE,aAASg2J,GACtB,MAAO,CACLI,aAAc,CACZnrJ,IAAK,CACHkjI,SFcC,CACL,CAACogB,IAAiB,CAACz3I,EAAKi3I,KAAmB,IAAjB,QAAE7lE,GAAS6lE,EAC/BnyJ,EAAQlH,OAAOwX,OAAOi0K,GAAyBj4F,EAAS,CAACrxF,KAAM,WACnE,OAAOigB,EACJgxC,OAAO,UAAU5kD,IAAWA,IAAU4qD,EAAAA,GAAAA,SAAQ56D,MAAMuwD,EAAAA,GAAAA,QAAQ7nD,MAC5DksD,OAAO,UAAU5kD,GAAU68K,gBAAgB78K,IAAQ,EAGxD,CAACsrJ,IAAuB,CAAC13I,EAAKq2I,KAAmB,IAAjB,QAAEjlE,GAASilE,EAIzC,OAHAjlE,EAAUA,EAAQ1hE,KAAIvb,IACbw4C,EAAAA,GAAAA,QAAO/uD,OAAOwX,OAAOi0K,GAAyBl1K,EAAK,CAAEpU,KAAM,cAE7DigB,EACJgxC,OAAO,UAAU5kD,IAAWA,IAAU4qD,EAAAA,GAAAA,SAAQtxD,QAAQinD,EAAAA,GAAAA,QAAQykC,MAC9DpgC,OAAO,UAAU5kD,GAAU68K,gBAAgB78K,IAAQ,EAGxD,CAACurJ,IAAe,CAAC33I,EAAK0kJ,KAAmB,IAAjB,QAAEtzE,GAASszE,EAC7B5/J,GAAQ6nD,EAAAA,GAAAA,QAAOykC,GAEnB,OADAtsF,EAAQA,EAAMe,IAAI,OAAQ,QACnBma,EACJgxC,OAAO,UAAU5kD,IAAWA,IAAU4qD,EAAAA,GAAAA,SAAQ56D,MAAMuwD,EAAAA,GAAAA,QAAO7nD,IAAQutD,QAAOl+C,GAAOA,EAAIlP,IAAI,YACzF+rD,OAAO,UAAU5kD,GAAU68K,gBAAgB78K,IAAQ,EAGxD,CAACwrJ,IAAqB,CAAC53I,EAAKilJ,KAAmB,IAAjB,QAAE7zE,GAAS6zE,EAIvC,OAHA7zE,EAAUA,EAAQ1hE,KAAIvb,IACbw4C,EAAAA,GAAAA,QAAO/uD,OAAOwX,OAAOi0K,GAAyBl1K,EAAK,CAAEpU,KAAM,YAE7DigB,EACJgxC,OAAO,UAAU5kD,IAAWA,IAAU4qD,EAAAA,GAAAA,SAAQtxD,QAAOinD,EAAAA,GAAAA,QAAOykC,MAC5DpgC,OAAO,UAAU5kD,GAAU68K,gBAAgB78K,IAAQ,EAGxD,CAACyrJ,IAAe,CAAC73I,EAAKmlJ,KAAmB,IAAjB,QAAE/zE,GAAS+zE,EAC7BrgK,GAAQ6nD,EAAAA,GAAAA,QAAO/uD,OAAOwX,OAAO,CAAC,EAAGg8E,IAGrC,OADAtsF,EAAQA,EAAMe,IAAI,OAAQ,QACnBma,EACJgxC,OAAO,UAAU5kD,IAAWA,IAAU4qD,EAAAA,GAAAA,SAAQ56D,MAAMuwD,EAAAA,GAAAA,QAAO7nD,MAC3DksD,OAAO,UAAU5kD,GAAU68K,gBAAgB78K,IAAQ,EAGxD,CAAC0rJ,IAAQ,CAAC93I,EAAKimJ,KAAmB,IAAjB,QAAE70E,GAAS60E,EAC1B,IAAI70E,IAAYpxE,EAAM/a,IAAI,UACxB,OAAO+a,EAGT,IAAIwpK,EAAYxpK,EAAM/a,IAAI,UACvB6qB,QAAO3b,GACCA,EAAIktD,SAASp0B,OAAMsc,IACxB,MAAMkgI,EAAWt1K,EAAIlP,IAAIskD,GACnBmgI,EAAct4F,EAAQ7nC,GAE5B,OAAImgI,GAEGD,IAAaC,CAAW,MAGrC,OAAO1pK,EAAMuxC,MAAM,CACjBnlD,OAAQo9K,GACR,EAGJ,CAACzxB,IAAW,CAAC/3I,EAAKmmJ,KAAmB,IAAjB,QAAE/0E,GAAS+0E,EAC7B,IAAI/0E,GAA8B,mBAAZA,EACpB,OAAOpxE,EAET,IAAIwpK,EAAYxpK,EAAM/a,IAAI,UACvB6qB,QAAO3b,GACCi9E,EAAQj9E,KAEnB,OAAO6L,EAAMuxC,MAAM,CACjBnlD,OAAQo9K,GACR,GEvFA/nB,QAAO,EACPO,UAASA,IAIjB,CCde,mBAAS2nB,EAAWC,GACjC,OAAOD,EAAU75J,QAAO,CAAC+5J,EAAQjzK,KAAiC,IAAzBA,EAAInc,QAAQmvL,IACvD,CCAe,kBACb,MAAO,CACLr7K,GAAI,CACFu7K,WAGN,gECFA,MAAMC,QAAU9yB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OACpD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,4RACJ,EASRwkI,QAAQrmI,aAAe,CACrBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,iBC3BM6qE,UAAYlzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OACtD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,oLACJ,EASR4kI,UAAUzmI,aAAe,CACvBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,mBC3BM8qE,MAAQnzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OAClD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,uLACJ,EASR6kI,MAAM1mI,aAAe,CACnBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,eC3BM+qE,MAAQpzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OAClD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,iVACJ,EASR8kI,MAAM3mI,aAAe,CACnBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,eC3BMgrE,KAAOrzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OACjD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,KAAG/9E,UAAU,oBACX+9E,GAAAA,cAAA,QACEz7J,KAAK,UACLolL,SAAS,UACThlI,EAAE,oVAGF,EASR+kI,KAAK5mI,aAAe,CAClBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,cCjCMkrE,KAAOvzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OACjD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,oUACJ,EASRilI,KAAK9mI,aAAe,CAClBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,cC3BMmrE,OAASxzB,IAAA,IAAC,UAAE5qH,EAAS,MAAEgzE,EAAK,OAAEC,KAAWr5C,GAAMgxF,EAAA,OACnD2J,GAAAA,cAAA,MAAA7L,KAAA,CACEi1B,MAAM,6BACNC,QAAQ,YACR59I,UAAWA,EACXgzE,MAAOA,EACPC,OAAQA,EACR,cAAY,OACZ4qE,UAAU,SACNjkH,GAEJ26F,GAAAA,cAAA,QAAMr7G,EAAE,8TACJ,EASRklI,OAAO/mI,aAAe,CACpBrX,UAAW,KACXgzE,MAAO,GACPC,OAAQ,IAGV,gBCVA,MAZoBorE,KAAA,CAChBtrB,WAAY,CACRurB,YAAW,GACXC,cAAa,GACbC,UAAS,GACTC,UAAS,GACTC,SAAQ,GACRle,SAAQ,GACRE,WAAUA,MCjBLie,GAAgB,uBAChBC,GAAgB,uBAChBC,GAAc,qBACdC,GAAO,cAIb,SAASC,aAAatE,GAC3B,MAAO,CACL/mL,KAAMirL,GACN55F,QAAS01F,EAEb,CAEO,SAASuE,aAAav7J,GAC3B,MAAO,CACL/vB,KAAMkrL,GACN75F,QAASthE,EAEb,CAEO,SAASi4J,aAAKlgD,GAAoB,IAAbugD,IAAK5nL,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,KAAAA,UAAA,GAE/B,OADAqnI,EAAQgyB,eAAehyB,GAChB,CACL9nI,KAAMorL,GACN/5F,QAAS,CAACy2C,QAAOugD,SAErB,CAGO,SAASkD,WAAWzjD,GAAiB,IAAVv+G,EAAI9oB,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAC,GAErC,OADAqnI,EAAQgyB,eAAehyB,GAChB,CACL9nI,KAAMmrL,GACN95F,QAAS,CAACy2C,QAAOv+G,QAErB,CC9BA,UAEE,CAAC0hK,IAAgB,CAAChrK,EAAO2yG,IAAW3yG,EAAMna,IAAI,SAAU8sH,EAAOvhC,SAE/D,CAAC65F,IAAgB,CAACjrK,EAAO2yG,IAAW3yG,EAAMna,IAAI,SAAU8sH,EAAOvhC,SAE/D,CAAC+5F,IAAO,CAACnrK,EAAO2yG,KACd,MAAM44D,EAAU54D,EAAOvhC,QAAQg3F,MAGzBoD,GAAc7+H,EAAAA,GAAAA,QAAOgmE,EAAOvhC,QAAQy2C,OAI1C,OAAO7nH,EAAMgxC,OAAO,SAASrE,EAAAA,GAAAA,QAAO,CAAC,IAAIpnD,GAAKA,EAAEM,IAAI2lL,EAAaD,IAAS,EAG5E,CAACL,IAAc,CAAClrK,EAAO2yG,KACrB,IAAIkV,EAAQlV,EAAOvhC,QAAQy2C,MACvBv+G,EAAOqpG,EAAOvhC,QAAQ9nE,KAC1B,OAAOtJ,EAAM4wC,MAAM,CAAC,SAASlrD,OAAOmiI,IAASv+G,GAAQ,IAAM,GAAG,GCtBrDtB,QAAUhI,GAASA,EAAM/a,IAAI,UAE7BwmL,cAAgBzrK,GAASA,EAAM/a,IAAI,UAEnCsmL,QAAUA,CAACvrK,EAAO6nH,EAAO6jD,KACpC7jD,EAAQgyB,eAAehyB,GAChB7nH,EAAM/a,IAAI,SAAS0nD,EAAAA,GAAAA,QAAO,CAAC,IAAI1nD,KAAI0nD,EAAAA,GAAAA,QAAOk7E,GAAQ6jD,IAG9CC,SAAW,SAAC3rK,EAAO6nH,GAAmB,IAAZ6jD,EAAGlrL,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAC,GAEzC,OADAqnI,EAAQgyB,eAAehyB,GAChB7nH,EAAMmlD,MAAM,CAAC,WAAY0iE,GAAQ6jD,EAC1C,EAEaE,GAAc3hB,IAhBbjqJ,GAASA,IAkBrBA,IAAUurK,QAAQvrK,EAAO,YCrBd6rK,iBAAmBA,CAACC,EAAa5sB,IAAW,SAACl/I,GAAoB,IAAD,IAAAiS,EAAAzxB,UAAAzE,OAATyhB,EAAI,IAAA/gB,MAAAw1B,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1U,EAAI0U,EAAA,GAAA1xB,UAAA0xB,GACtE,IAAIy3J,EAAYmC,EAAY9rK,KAAUxC,GAEtC,MAAM,GAAEjP,EAAE,gBAAE64K,EAAe,WAAE5mB,GAAetB,EAAO/E,YAC7CgF,EAAUqB,KACV,iBAAEurB,GAAqB5sB,EAG7B,IAAIrvI,EAASs3J,EAAgBqE,gBAW7B,OAVI37J,IACa,IAAXA,GAA8B,SAAXA,GAAgC,UAAXA,IAC1C65J,EAAYp7K,EAAGu7K,UAAUH,EAAW75J,IAIpCi8J,IAAqBj7K,MAAMi7K,IAAqBA,GAAoB,IACtEpC,EAAYA,EAAUhrL,MAAM,EAAGotL,IAG1BpC,CACT,EChBe,0BACb,MAAO,CACLrqB,aAAc,CACZwnB,OAAQ,CACNzvC,SAAQ,GACRoqB,QAAO,EACPO,UAASA,GAEXuL,KAAM,CACJrL,cAAaA,IAIrB,CClBe,SAAS,KAATjL,GAAsB,IAAZ,QAACkI,GAAQlI,EAEhC,MAAM+0B,EAAS,CACb,MAAS,EACT,KAAQ,EACR,IAAO,EACP,KAAQ,EACR,MAAS,GAGLC,SAAY1zH,GAAUyzH,EAAOzzH,KAAW,EAE9C,IAAI,SAAE2zH,GAAa/sB,EACfgtB,EAAcF,SAASC,GAE3B,SAASxlJ,IAAI6xB,GAAiB,IAAD,IAAAtmC,EAAAzxB,UAAAzE,OAANyhB,EAAI,IAAA/gB,MAAAw1B,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1U,EAAI0U,EAAA,GAAA1xB,UAAA0xB,GACtB+5J,SAAS1zH,IAAU4zH,GAEpBtnL,QAAQ0zD,MAAU/6C,EACtB,CAOA,OALAkpB,IAAIjzB,KAAOizB,IAAI33B,KAAK,KAAM,QAC1B23B,IAAI5hC,MAAQ4hC,IAAI33B,KAAK,KAAM,SAC3B23B,IAAI0lJ,KAAO1lJ,IAAI33B,KAAK,KAAM,QAC1B23B,IAAI30B,MAAQ20B,IAAI33B,KAAK,KAAM,SAEpB,CAAEswJ,YAAa,CAAE34H,KAC1B,CC3BA,IAAI2lJ,IAAU,EAEC,uBAEb,MAAO,CACL/sB,aAAc,CACZiO,KAAM,CACJ1L,YAAa,CACXyqB,WAAa/pB,GAAQ,WAEnB,OADA8pB,IAAU,EACH9pB,KAAI/hK,UACb,EACA+rL,eAAgBA,CAAChqB,EAAKrD,IAAW,WAC/B,MAAMllH,EAAKklH,EAAOsB,aAAagsB,WAQ/B,OAPGH,IAAyB,mBAAPryI,IAGnBivB,WAAWjvB,EAAI,GACfqyI,IAAU,GAGL9pB,KAAI/hK,UACb,KAKV,CCjBA,MAAMisL,WAAcljI,IAClB,MAAMmwG,EAAU,QAChB,OAAInwG,EAAE9uD,QAAQi/J,GAAW,EAChBnwG,EAEFA,EAAEt7C,MAAMyrJ,GAAS,GAAGn/J,MAAM,EAG7BmyL,YAAezyL,GACP,QAARA,GAIC,WAAWW,KAAKX,GAHZA,EAIC,IAAMA,EACXC,QAAQ,KAAM,SAAW,IAK1ByyL,UAAa1yL,GAML,SALZA,EAAMA,EACHC,QAAQ,MAAO,MACfA,QAAQ,OAAQ,SAChBA,QAAQ,KAAM,MACdA,QAAQ,MAAO,QAETD,EACJC,QAAQ,OAAQ,UAGhB,WAAWU,KAAKX,GAGZA,EAFA,IAAOA,EAAM,IAKlB2yL,iBAAoB3yL,GACZ,QAARA,EACKA,EAEL,KAAKW,KAAKX,GACL,OAAUA,EAAIC,QAAQ,KAAM,OAAQA,QAAQ,KAAM,MAAMA,QAAQ,KAAM,MAAQ,OAGlF,WAAWU,KAAKX,GAKZA,EAJA,IAAMA,EACVC,QAAQ,KAAM,MACdA,QAAQ,KAAM,MAAQ,IAkB7B,MAAM2yL,QAAU,SAACC,EAAS9+J,EAAQ++J,GAAuB,IAAd5lL,EAAG3G,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,GAC3CwsL,GAA6B,EAC7BC,EAAY,GAChB,MAAMC,SAAW,mBAAAj7J,EAAAzxB,UAAAzE,OAAIyhB,EAAI,IAAA/gB,MAAAw1B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ1U,EAAI0U,GAAA1xB,UAAA0xB,GAAA,OAAK+6J,GAAa,IAAMzvK,EAAKkS,IAAI1B,GAAQzxB,KAAK,IAAI,EACrE4wL,4BAA8B,mBAAAh7J,EAAA3xB,UAAAzE,OAAIyhB,EAAI,IAAA/gB,MAAA01B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ5U,EAAI4U,GAAA5xB,UAAA4xB,GAAA,OAAK66J,GAAazvK,EAAKkS,IAAI1B,GAAQzxB,KAAK,IAAI,EAClF6wL,WAAaA,IAAMH,GAAc,IAAGF,IACpCM,UAAY,WAAU,OAAKJ,GAAa,KAAK7uF,OAA3B59F,UAAAzE,OAAA,QAAA8D,IAAAW,UAAA,GAAAA,UAAA,GAAG,EAAqC,EAChE,IAAIklK,EAAUonB,EAAQ7nL,IAAI,WAa1B,GAZAgoL,GAAa,OAAS9lL,EAElB2lL,EAAQrtK,IAAI,gBACdytK,YAAYJ,EAAQ7nL,IAAI,gBAG1BioL,SAAS,KAAMJ,EAAQ7nL,IAAI,WAE3BmoL,aACAC,YACAF,4BAA6B,GAAEL,EAAQ7nL,IAAI,UAEvCygK,GAAWA,EAAQtlK,KACrB,IAAK,IAAIskG,KAAKooF,EAAQ7nL,IAAI,WAAWqf,UAAW,CAC9C8oK,aACAC,YACA,IAAKn+H,EAAG1F,GAAKk7C,EACbyoF,4BAA4B,KAAO,GAAEj+H,MAAM1F,KAC3CwjI,EAA6BA,GAA8B,kBAAkBpyL,KAAKs0D,IAAM,0BAA0Bt0D,KAAK4uD,EACzH,CAGF,MAAM11C,EAAOg5K,EAAQ7nL,IAAI,QACzB,GAAI6O,EACF,GAAIk5K,GAA8B,CAAC,OAAQ,MAAO,SAAStmL,SAASomL,EAAQ7nL,IAAI,WAC9E,IAAK,IAAKskD,EAAGC,KAAM11C,EAAKy2C,WAAY,CAClC,IAAI+iI,EAAeb,WAAWljI,GAC9B6jI,aACAC,YACAF,4BAA4B,MAUxB3jI,aAAagvG,GAAIC,MAA+B,iBAAhBjvG,EAAEjqD,UACpC2tL,SAAU,GAAEI,KAAgB9jI,EAAEvpD,OAAOupD,EAAEzpD,KAAQ,SAAQypD,EAAEzpD,OAAS,MACzDypD,aAAagvG,GAAIC,KAC1By0B,SAAU,GAAEI,MAAiB9jI,EAAE18C,OAAO08C,EAAEzpD,KAAQ,SAAQypD,EAAEzpD,OAAS,MAEnEmtL,SAAU,GAAEI,KAAgB9jI,IAEhC,MACK,GAAG11C,aAAgB0kJ,GAAIC,KAC5B20B,aACAC,YACAF,4BAA6B,mBAAkBr5K,EAAKhH,aAC/C,CACLsgL,aACAC,YACAF,4BAA4B,OAC5B,IAAII,EAAUz5K,EACTg1B,GAAAA,IAAIunB,MAAMk9H,GAMbJ,4BAnFR,SAASK,mBAAmBV,GAC1B,IAAIW,EAAgB,GACpB,IAAK,IAAKlkI,EAAGC,KAAMsjI,EAAQ7nL,IAAI,QAAQslD,WAAY,CACjD,IAAI+iI,EAAeb,WAAWljI,GAC1BC,aAAagvG,GAAIC,KACnBg1B,EAAcrxL,KAAM,MAAKkxL,uBAAkC9jI,EAAE18C,QAAQ08C,EAAEzpD,KAAQ,mBAAkBypD,EAAEzpD,QAAU,WAE7G0tL,EAAcrxL,KAAM,MAAKkxL,OAAkBjnJ,KAAKC,UAAUkjB,EAAG,KAAM,GAAGtvD,QAAQ,gBAAiB,UAEnG,CACA,MAAQ,MAAKuzL,EAAclxL,KAAK,WAClC,CAwEoCixL,CAAmBV,KALxB,iBAAZS,IACTA,EAAUlnJ,KAAKC,UAAUinJ,IAE3BJ,4BAA4BI,GAIhC,MACUz5K,GAAkC,SAA1Bg5K,EAAQ7nL,IAAI,YAC9BmoL,aACAC,YACAF,4BAA4B,UAG9B,OAAOF,CACT,EAGaS,wCAA2CZ,GAC/CD,QAAQC,EAASF,iBAAkB,MAAO,QAItCe,kCAAqCb,GACzCD,QAAQC,EAASJ,YAAa,QAI1BkB,iCAAoCd,GACxCD,QAAQC,EAASH,UAAW,OCvK/B3sK,iCAAQA,GAASA,IAAS8oB,EAAAA,GAAAA,OAEnB+kJ,GAAgB5jB,GAC3BjqJ,kCACAA,IACE,MAAM8tK,EAAe9tK,EAClB/a,IAAI,aACD8oL,EAAa/tK,EAChB/a,IAAI,cAAc6jC,EAAAA,GAAAA,QACrB,OAAIglJ,GAAgBA,EAAatpH,UACxBupH,EAEFA,EACJj+J,QAAO,CAAC05B,EAAGz5C,IAAQ+9K,EAAapnL,SAASqJ,IAAK,IAIxCi+K,qBAAwBhuK,GAAUi3I,IAAa,IAAZ,GAAE1oJ,GAAI0oJ,EAEpD,OAAO42B,GAAc7tK,GAClB0P,KAAI,CAAC8Z,EAAKz5B,KACT,MAAMk+K,EAHOC,CAACn+K,GAAQxB,EAAI,2BAA0BwB,KAGtCm+K,CAASn+K,GACvB,MAAoB,mBAAVk+K,EACD,KAGFzkJ,EAAI3jC,IAAI,KAAMooL,EAAM,IAE5Bn+J,QAAO05B,GAAKA,GAAE,EAGN2kI,GAAoBlkB,GAC/BjqJ,kCACAA,GAASA,EACN/a,IAAI,oBAGImpL,GAAqBnkB,GAChCjqJ,kCACAA,GAASA,EACN/a,IAAI,uDC3CM,SAASo/F,8BAA8BltF,EAAQitF,GAC5D,GAAc,MAAVjtF,EAAgB,MAAO,CAAC,EAC5B,IAEIpH,EAAK1U,EAFLgL,EAAS,CAAC,EACVi+F,EAAa1mG,OAAOyZ,KAAKF,GAE7B,IAAK9b,EAAI,EAAGA,EAAIipG,EAAWvoG,OAAQV,IACjC0U,EAAMu0F,EAAWjpG,GACb+oG,EAAS3pG,QAAQsV,IAAQ,IAC7B1J,EAAO0J,GAAOoH,EAAOpH,IAEvB,OAAO1J,CACT,CCXe,SAASgoL,kBAAkB/yL,EAAKI,IAClC,MAAPA,GAAeA,EAAMJ,EAAIS,UAAQL,EAAMJ,EAAIS,QAC/C,IAAK,IAAIV,EAAI,EAAGizL,EAAO,IAAI7xL,MAAMf,GAAML,EAAIK,EAAKL,IAAKizL,EAAKjzL,GAAKC,EAAID,GACnE,OAAOizL,CACT,CCAe,SAASC,mBAAmBjzL,GACzC,OCJa,SAASkzL,mBAAmBlzL,GACzC,GAAImB,MAAMuD,QAAQ1E,GAAM,OAAO,kBAAiBA,EAClD,CDES,CAAkBA,IELZ,SAASmzL,iBAAiBpmI,GACvC,GAAsB,oBAAXlrD,QAAmD,MAAzBkrD,EAAKlrD,OAAOukB,WAA2C,MAAtB2mC,EAAK,cAAuB,OAAO5rD,MAAM0B,KAAKkqD,EACtH,CFGmC,CAAgB/sD,IGJpC,SAASozL,4BAA4Bz/H,EAAG0/H,GACrD,GAAK1/H,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAO,kBAAiBA,EAAG0/H,GACtD,IAAIttL,EAAIzD,OAAOE,UAAUwC,SAASqB,KAAKstD,GAAGtwD,MAAM,GAAI,GAEpD,MADU,WAAN0C,GAAkB4tD,EAAEviD,cAAarL,EAAI4tD,EAAEviD,YAAYI,MAC7C,QAANzL,GAAqB,QAANA,EAAoB5E,MAAM0B,KAAK8wD,GACxC,cAAN5tD,GAAqB,2CAA2CzG,KAAKyG,GAAW,kBAAiB4tD,EAAG0/H,QAAxG,CALc,CAMhB,CHH2D,CAA2BrzL,IILvE,SAASszL,qBACtB,MAAM,IAAI3wL,UAAU,uIACtB,CJG8F,EAC9F,CKNe,SAAS82J,WAYtB,OAXAA,SAAWn3J,OAAOwX,OAASxX,OAAOwX,OAAOrG,OAAS,SAAU1I,GAC1D,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CACzC,IAAI8b,EAAS3W,UAAUnF,GACvB,IAAK,IAAI0U,KAAOoH,EACVvZ,OAAOE,UAAU4R,eAAe/N,KAAKwV,EAAQpH,KAC/C1J,EAAO0J,GAAOoH,EAAOpH,GAG3B,CACA,OAAO1J,CACT,EACO0uJ,SAASzwJ,MAAMhL,KAAMkH,UAC9B,CCVA,SAAS,uBAAQsX,EAAQisF,GAAkB,IAAI1sF,EAAOzZ,OAAOyZ,KAAKS,GAAS,GAAIla,OAAOgoB,sBAAuB,CAAE,IAAIytE,EAAUz1F,OAAOgoB,sBAAsB9N,GAASisF,IAAmB1Q,EAAUA,EAAQvjE,QAAO,SAAUxjB,GAAO,OAAO1O,OAAO2Z,yBAAyBO,EAAQxL,GAAKtH,UAAY,KAAKqS,EAAKjb,KAAKkI,MAAM+S,EAAMg8E,EAAU,CAAE,OAAOh8E,CAAM,CAEpV,SAAS2sF,cAAc39F,GAAU,IAAK,IAAIhL,EAAI,EAAGA,EAAImF,UAAUzE,OAAQV,IAAK,CAAE,IAAI8b,EAAS,MAAQ3W,UAAUnF,GAAKmF,UAAUnF,GAAK,CAAC,EAAGA,EAAI,EAAI,uBAAQuC,OAAOuZ,IAAS,GAAIqO,SAAQ,SAAUzV,GAAOk0F,gBAAgB59F,EAAQ0J,EAAKoH,EAAOpH,GAAO,IAAKnS,OAAOsmG,0BAA4BtmG,OAAO4pB,iBAAiBnhB,EAAQzI,OAAOsmG,0BAA0B/sF,IAAW,uBAAQvZ,OAAOuZ,IAASqO,SAAQ,SAAUzV,GAAOnS,OAAOmH,eAAesB,EAAQ0J,EAAKnS,OAAO2Z,yBAAyBJ,EAAQpH,GAAO,GAAI,CAAE,OAAO1J,CAAQ,CA2Bzf,IAAIwoL,GAAwB,CAAC,EAatB,SAASC,kBAAkBn/K,GAChC,IAAIo/K,EAAevuL,UAAUzE,OAAS,QAAsB8D,IAAjBW,UAAU,GAAmBA,UAAU,GAAK,CAAC,EACpFwuL,EAAaxuL,UAAUzE,OAAS,EAAIyE,UAAU,QAAKX,EAKvD,OAlBF,SAASovL,yBAAyBt/K,GAChC,GAA0B,IAAtBA,EAAW5T,QAAsC,IAAtB4T,EAAW5T,OAAc,OAAO4T,EAC/D,IAAII,EAAMJ,EAAWpT,KAAK,KAM1B,OAJKsyL,GAAsB9+K,KACzB8+K,GAAsB9+K,GA3B1B,SAASm/K,qBAAqB5zL,GAC5B,IAAIwG,EAAYxG,EAAIS,OACpB,OAAkB,IAAd+F,GAAiC,IAAdA,EAAwBxG,EAE7B,IAAdwG,EAEK,CAACxG,EAAI,GAAIA,EAAI,GAAI,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,KAGjF,IAAdwG,EACK,CAACxG,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,KAGrmBwG,GAAa,EAGR,CAACxG,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,IAAK,GAAGoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAOpK,EAAI,GAAI,KAAKoK,OAAO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B,OACA,MACA,aACA,MACA,OACA,QACA,OACA,MACA,MACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,MACA,KACA,SACA,OACA,OACA,QACA,MACA,OACA,KACA,OACA,OACA,MACA,OACA,YACA,WACA,YACA,WACA,OACA,SACA,MACA,OACA,QACA,OACA,UACA,OACA,MACA,KACA,MACA,OACA,kBACA,MACA,OACA,OACA,UACA,UACA,QACA,QACA,MACA,OACA,MACA,OACA,YACA,aACA,MACA,MACA,SACA,OACA,cACA,SACA,MACA,KACA,MACA,QACA,KACA,MACA,OACA,cACA,cACA,eACA,OACA,UACA,UACA,YACA,MACA,MACA,MACA,MACA,aACA,KACA,UACA,UACA,OACA,SACA,SACA,mBACA,0BACA,UACA,MACA,kBACA,qBACA,MACA,MACA,OACA,WACA,OACA,SACA,OACA,KACA,MACA,eACA,QACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,MACA,MACA,UACA,SACA,QACA,SACA,OACA,SACA,UACA,MACA,UACA,QACA,SACA,MACA,QACA,MACA,OACA,YACA,WACA,QACA,OACA,QACA,MACA,WACA,MACA,QACA,OACA,aACA,OACA,MACA,QACA,MACA,SACA,UACA,MACA,QACA,MACA,YACA,SACA,MACA,SACA,SACA,WACA,cACA,SACA,OACA,UACA,QACA,MACA,SAOEC,GAAc,2IACdC,GAAc,2CAuElB,SAASC,UAAU/nO,EAAOniC,GAIxB,OAHAmiC,EAAQA,EAAMl7B,OACdjH,EAAUA,GAAW,GAEd,SAAS8O,KAAKlS,EAAMtL,GACzB,OAAKsL,GAGLtL,EAAMA,EAAI2V,QAAU3V,EACpB6wC,EAAQA,EAAMn4C,QAAQ4S,EAAMtL,GACrBwd,MAJE,IAAIqP,OAAOgkB,EAAOniC,EAK7B,CACF,CAGA,IAOImqQ,GAAcD,UAAU,2CAAVA,CACG,WAND,sBAKFA,CAEG,gBAND,UAIFA,CAGG,gBAND,UAGFA,GAMdh/O,GAAcg/O,UAAU,yCAAVA,CACG,YAdD,6BAaFA,CA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","sources":["webpack://SwaggerUIBundle/webpack/universalModuleDefinition","webpack://SwaggerUIBundle/./node_modules/@braintree/sanitize-url/dist/index.js","webpack://SwaggerUIBundle/./node_modules/base64-js/index.js","webpack://SwaggerUIBundle/./node_modules/buffer/index.js","webpack://SwaggerUIBundle/./node_modules/call-bind/callBound.js","webpack://SwaggerUIBundle/./node_modules/call-bind/index.js","webpack://SwaggerUIBundle/./node_modules/classnames/index.js","webpack://SwaggerUIBundle/./node_modules/cookie/index.js","webpack://SwaggerUIBundle/./node_modules/copy-to-clipboard/index.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/actual/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/actual/instance/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/actual/object/assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/es/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/es/function/virtual/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/es/instance/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/es/object/assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/features/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/features/instance/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/features/object/assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/full/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/full/instance/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/full/object/assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/a-callable.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/a-possible-prototype.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/add-to-unscopables.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/an-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/array-includes.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/array-slice.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/classof-raw.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/classof.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/copy-constructor-properties.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/correct-prototype-getter.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/create-iter-result-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/create-non-enumerable-property.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/create-property-descriptor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/define-built-in.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/define-global-property.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/descriptors.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/document-all.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/document-create-element.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/dom-iterables.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/engine-user-agent.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/engine-v8-version.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/entry-virtual.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/enum-bug-keys.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/error-stack-clear.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/error-stack-install.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/error-stack-installable.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/export.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/fails.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-apply.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-bind-context.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-bind-native.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-call.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-name.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-uncurry-this-accessor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-uncurry-this-clause.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/function-uncurry-this.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/get-built-in.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/get-iterator-method.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/get-iterator.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/get-method.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/global.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/has-own-property.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/hidden-keys.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/html.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/ie8-dom-define.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/indexed-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/inherit-if-required.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/install-error-cause.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/internal-state.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-array-iterator-method.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-callable.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-forced.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-null-or-undefined.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-pure.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/is-symbol.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterate.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterator-close.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterator-create-constructor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterator-define.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterators-core.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/iterators.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/length-of-array-like.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/math-trunc.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/normalize-string-argument.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-create.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-define-properties.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-define-property.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-get-own-property-names.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-get-own-property-symbols.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-get-prototype-of.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-is-prototype-of.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-keys-internal.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-keys.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-property-is-enumerable.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-set-prototype-of.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/object-to-string.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/ordinary-to-primitive.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/own-keys.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/path.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/proxy-accessor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/require-object-coercible.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/set-to-string-tag.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/shared-key.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/shared-store.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/shared.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/string-multibyte.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/symbol-constructor-detection.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-absolute-index.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-indexed-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-integer-or-infinity.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-length.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-object.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-primitive.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-property-key.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-string-tag-support.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/to-string.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/try-to-string.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/uid.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/use-symbol-as-uid.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/v8-prototype-define-bug.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/weak-map-basic-detection.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/well-known-symbol.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/internals/wrap-error-constructor-with-cause.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.aggregate-error.cause.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.aggregate-error.constructor.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.array.iterator.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.error.cause.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.function.bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.object.assign.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/es.string.iterator.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/esnext.aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/modules/web.dom-collections.iterator.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/stable/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/stable/instance/bind.js","webpack://SwaggerUIBundle/./node_modules/core-js-pure/stable/object/assign.js","webpack://SwaggerUIBundle/./node_modules/css.escape/css.escape.js","webpack://SwaggerUIBundle/./node_modules/deep-extend/lib/deep-extend.js","webpack://SwaggerUIBundle/./node_modules/deepmerge/dist/cjs.js","webpack://SwaggerUIBundle/./node_modules/dompurify/dist/purify.js","webpack://SwaggerUIBundle/./node_modules/drange/lib/index.js","webpack://SwaggerUIBundle/./node_modules/events/events.js","webpack://SwaggerUIBundle/./node_modules/fault/index.js","webpack://SwaggerUIBundle/./node_modules/format/format.js","webpack://SwaggerUIBundle/./node_modules/function-bind/implementation.js","webpack://SwaggerUIBundle/./node_modules/function-bind/index.js","webpack://SwaggerUIBundle/./node_modules/get-intrinsic/index.js","webpack://SwaggerUIBundle/./node_modules/has-proto/index.js","webpack://SwaggerUIBundle/./node_modules/has-symbols/index.js","webpack://SwaggerUIBundle/./node_modules/has-symbols/shams.js","webpack://SwaggerUIBundle/./node_modules/has/src/index.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/core.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/bash.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/http.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/javascript.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/json.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/powershell.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/xml.js","webpack://SwaggerUIBundle/./node_modules/highlight.js/lib/languages/yaml.js","webpack://SwaggerUIBundle/./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","webpack://SwaggerUIBundle/./node_modules/ieee754/index.js","webpack://SwaggerUIBundle/./node_modules/immutable/dist/immutable.js","webpack://SwaggerUIBundle/./node_modules/inherits/inherits_browser.js","webpack://SwaggerUIBundle/./node_modules/js-file-download/file-download.js","webpack://SwaggerUIBundle/./node_modules/lodash.debounce/index.js","webpack://SwaggerUIBundle/./node_modules/lodash/_DataView.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Hash.js","webpack://SwaggerUIBundle/./node_modules/lodash/_LazyWrapper.js","webpack://SwaggerUIBundle/./node_modules/lodash/_ListCache.js","webpack://SwaggerUIBundle/./node_modules/lodash/_LodashWrapper.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Map.js","webpack://SwaggerUIBundle/./node_modules/lodash/_MapCache.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Promise.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Set.js","webpack://SwaggerUIBundle/./node_modules/lodash/_SetCache.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Stack.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Symbol.js","webpack://SwaggerUIBundle/./node_modules/lodash/_Uint8Array.js","webpack://SwaggerUIBundle/./node_modules/lodash/_WeakMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/_apply.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayEach.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayFilter.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayIncludes.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayLikeKeys.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayPush.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arrayReduce.js","webpack://SwaggerUIBundle/./node_modules/lodash/_arraySome.js","webpack://SwaggerUIBundle/./node_modules/lodash/_asciiToArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_asciiWords.js","webpack://SwaggerUIBundle/./node_modules/lodash/_assignMergeValue.js","webpack://SwaggerUIBundle/./node_modules/lodash/_assignValue.js","webpack://SwaggerUIBundle/./node_modules/lodash/_assocIndexOf.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseAssign.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseAssignIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseAssignValue.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseClone.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseCreate.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseEach.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseFindIndex.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseFlatten.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseFor.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseForOwn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseGetAllKeys.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseGetTag.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseHasIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIndexOf.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsArguments.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsEqual.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsEqualDeep.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsMatch.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsNaN.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsNative.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIsTypedArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseIteratee.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseKeys.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseKeysIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseLodash.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseMatches.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseMatchesProperty.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseMerge.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseMergeDeep.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseProperty.js","webpack://SwaggerUIBundle/./node_modules/lodash/_basePropertyDeep.js","webpack://SwaggerUIBundle/./node_modules/lodash/_basePropertyOf.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseReduce.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseRest.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseSetData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseSetToString.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseSlice.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseSome.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseTimes.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseToString.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseTrim.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseUnary.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseUnset.js","webpack://SwaggerUIBundle/./node_modules/lodash/_baseZipObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cacheHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_castPath.js","webpack://SwaggerUIBundle/./node_modules/lodash/_castSlice.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneArrayBuffer.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneBuffer.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneDataView.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneRegExp.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneSymbol.js","webpack://SwaggerUIBundle/./node_modules/lodash/_cloneTypedArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_composeArgs.js","webpack://SwaggerUIBundle/./node_modules/lodash/_composeArgsRight.js","webpack://SwaggerUIBundle/./node_modules/lodash/_copyArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_copyObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/_copySymbols.js","webpack://SwaggerUIBundle/./node_modules/lodash/_copySymbolsIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_coreJsData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_countHolders.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createAssigner.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createBaseEach.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createBaseFor.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createBind.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createCaseFirst.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createCompounder.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createCtor.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createCurry.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createFind.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createHybrid.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createPartial.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createRecurry.js","webpack://SwaggerUIBundle/./node_modules/lodash/_createWrap.js","webpack://SwaggerUIBundle/./node_modules/lodash/_customOmitClone.js","webpack://SwaggerUIBundle/./node_modules/lodash/_deburrLetter.js","webpack://SwaggerUIBundle/./node_modules/lodash/_defineProperty.js","webpack://SwaggerUIBundle/./node_modules/lodash/_equalArrays.js","webpack://SwaggerUIBundle/./node_modules/lodash/_equalByTag.js","webpack://SwaggerUIBundle/./node_modules/lodash/_equalObjects.js","webpack://SwaggerUIBundle/./node_modules/lodash/_flatRest.js","webpack://SwaggerUIBundle/./node_modules/lodash/_freeGlobal.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getAllKeys.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getAllKeysIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getFuncName.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getHolder.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getMapData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getMatchData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getNative.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getPrototype.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getRawTag.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getSymbols.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getSymbolsIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getTag.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getValue.js","webpack://SwaggerUIBundle/./node_modules/lodash/_getWrapDetails.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hasPath.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hasUnicode.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hasUnicodeWord.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hashClear.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hashDelete.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hashGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hashHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_hashSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_initCloneArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_initCloneByTag.js","webpack://SwaggerUIBundle/./node_modules/lodash/_initCloneObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/_insertWrapDetails.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isFlattenable.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isIndex.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isIterateeCall.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isKey.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isKeyable.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isLaziable.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isMasked.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isPrototype.js","webpack://SwaggerUIBundle/./node_modules/lodash/_isStrictComparable.js","webpack://SwaggerUIBundle/./node_modules/lodash/_listCacheClear.js","webpack://SwaggerUIBundle/./node_modules/lodash/_listCacheDelete.js","webpack://SwaggerUIBundle/./node_modules/lodash/_listCacheGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_listCacheHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_listCacheSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapCacheClear.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapCacheDelete.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapCacheGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapCacheHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapCacheSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mapToArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_matchesStrictComparable.js","webpack://SwaggerUIBundle/./node_modules/lodash/_memoizeCapped.js","webpack://SwaggerUIBundle/./node_modules/lodash/_mergeData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_metaMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/_nativeCreate.js","webpack://SwaggerUIBundle/./node_modules/lodash/_nativeKeys.js","webpack://SwaggerUIBundle/./node_modules/lodash/_nativeKeysIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/_nodeUtil.js","webpack://SwaggerUIBundle/./node_modules/lodash/_objectToString.js","webpack://SwaggerUIBundle/./node_modules/lodash/_overArg.js","webpack://SwaggerUIBundle/./node_modules/lodash/_overRest.js","webpack://SwaggerUIBundle/./node_modules/lodash/_parent.js","webpack://SwaggerUIBundle/./node_modules/lodash/_realNames.js","webpack://SwaggerUIBundle/./node_modules/lodash/_reorder.js","webpack://SwaggerUIBundle/./node_modules/lodash/_replaceHolders.js","webpack://SwaggerUIBundle/./node_modules/lodash/_root.js","webpack://SwaggerUIBundle/./node_modules/lodash/_safeGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setCacheAdd.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setCacheHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setData.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setToArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setToString.js","webpack://SwaggerUIBundle/./node_modules/lodash/_setWrapToString.js","webpack://SwaggerUIBundle/./node_modules/lodash/_shortOut.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stackClear.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stackDelete.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stackGet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stackHas.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stackSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/_strictIndexOf.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stringToArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_stringToPath.js","webpack://SwaggerUIBundle/./node_modules/lodash/_toKey.js","webpack://SwaggerUIBundle/./node_modules/lodash/_toSource.js","webpack://SwaggerUIBundle/./node_modules/lodash/_trimmedEndIndex.js","webpack://SwaggerUIBundle/./node_modules/lodash/_unicodeToArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/_unicodeWords.js","webpack://SwaggerUIBundle/./node_modules/lodash/_updateWrapDetails.js","webpack://SwaggerUIBundle/./node_modules/lodash/_wrapperClone.js","webpack://SwaggerUIBundle/./node_modules/lodash/ary.js","webpack://SwaggerUIBundle/./node_modules/lodash/camelCase.js","webpack://SwaggerUIBundle/./node_modules/lodash/capitalize.js","webpack://SwaggerUIBundle/./node_modules/lodash/clone.js","webpack://SwaggerUIBundle/./node_modules/lodash/constant.js","webpack://SwaggerUIBundle/./node_modules/lodash/curry.js","webpack://SwaggerUIBundle/./node_modules/lodash/debounce.js","webpack://SwaggerUIBundle/./node_modules/lodash/deburr.js","webpack://SwaggerUIBundle/./node_modules/lodash/eq.js","webpack://SwaggerUIBundle/./node_modules/lodash/find.js","webpack://SwaggerUIBundle/./node_modules/lodash/findIndex.js","webpack://SwaggerUIBundle/./node_modules/lodash/flatten.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/_baseConvert.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/_mapping.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/_util.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/assocPath.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/convert.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/placeholder.js","webpack://SwaggerUIBundle/./node_modules/lodash/fp/set.js","webpack://SwaggerUIBundle/./node_modules/lodash/get.js","webpack://SwaggerUIBundle/./node_modules/lodash/hasIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/identity.js","webpack://SwaggerUIBundle/./node_modules/lodash/isArguments.js","webpack://SwaggerUIBundle/./node_modules/lodash/isArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/isArrayLike.js","webpack://SwaggerUIBundle/./node_modules/lodash/isArrayLikeObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/isBoolean.js","webpack://SwaggerUIBundle/./node_modules/lodash/isBuffer.js","webpack://SwaggerUIBundle/./node_modules/lodash/isEmpty.js","webpack://SwaggerUIBundle/./node_modules/lodash/isEqual.js","webpack://SwaggerUIBundle/./node_modules/lodash/isError.js","webpack://SwaggerUIBundle/./node_modules/lodash/isFunction.js","webpack://SwaggerUIBundle/./node_modules/lodash/isLength.js","webpack://SwaggerUIBundle/./node_modules/lodash/isMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/isNull.js","webpack://SwaggerUIBundle/./node_modules/lodash/isNumber.js","webpack://SwaggerUIBundle/./node_modules/lodash/isObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/isObjectLike.js","webpack://SwaggerUIBundle/./node_modules/lodash/isPlainObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/isSet.js","webpack://SwaggerUIBundle/./node_modules/lodash/isString.js","webpack://SwaggerUIBundle/./node_modules/lodash/isSymbol.js","webpack://SwaggerUIBundle/./node_modules/lodash/isTypedArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/isWeakMap.js","webpack://SwaggerUIBundle/./node_modules/lodash/iteratee.js","webpack://SwaggerUIBundle/./node_modules/lodash/keys.js","webpack://SwaggerUIBundle/./node_modules/lodash/keysIn.js","webpack://SwaggerUIBundle/./node_modules/lodash/last.js","webpack://SwaggerUIBundle/./node_modules/lodash/memoize.js","webpack://SwaggerUIBundle/./node_modules/lodash/merge.js","webpack://SwaggerUIBundle/./node_modules/lodash/negate.js","webpack://SwaggerUIBundle/./node_modules/lodash/noop.js","webpack://SwaggerUIBundle/./node_modules/lodash/now.js","webpack://SwaggerUIBundle/./node_modules/lodash/omit.js","webpack://SwaggerUIBundle/./node_modules/lodash/property.js","webpack://SwaggerUIBundle/./node_modules/lodash/rearg.js","webpack://SwaggerUIBundle/./node_modules/lodash/reduce.js","webpack://SwaggerUIBundle/./node_modules/lodash/set.js","webpack://SwaggerUIBundle/./node_modules/lodash/some.js","webpack://SwaggerUIBundle/./node_modules/lodash/stubArray.js","webpack://SwaggerUIBundle/./node_modules/lodash/stubFalse.js","webpack://SwaggerUIBundle/./node_modules/lodash/toFinite.js","webpack://SwaggerUIBundle/./node_modules/lodash/toInteger.js","webpack://SwaggerUIBundle/./node_modules/lodash/toLower.js","webpack://SwaggerUIBundle/./node_modules/lodash/toNumber.js","webpack://SwaggerUIBundle/./node_modules/lodash/toPath.js","webpack://SwaggerUIBundle/./node_modules/lodash/toPlainObject.js","webpack://SwaggerUIBundle/./node_modules/lodash/toString.js","webpack://SwaggerUIBundle/./node_modules/lodash/upperFirst.js","webpack://SwaggerUIBundle/./node_modules/lodash/words.js","webpack://SwaggerUIBundle/./node_modules/lodash/wrapperLodash.js","webpack://SwaggerUIBundle/./node_modules/lodash/zipObject.js","webpack://SwaggerUIBundle/./node_modules/lowlight/lib/core.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/ArraySlice.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/KeyValuePair.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/Namespace.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/ObjectSlice.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/elements.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/elements/LinkElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/elements/RefElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/minim.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/ArrayElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/BooleanElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/Element.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/MemberElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/NullElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/NumberElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/ObjectElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/primitives/StringElement.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/serialisers/JSON06Serialiser.js","webpack://SwaggerUIBundle/./node_modules/minim/lib/serialisers/JSONSerialiser.js","webpack://SwaggerUIBundle/./node_modules/object-assign/index.js","webpack://SwaggerUIBundle/./node_modules/object-inspect/index.js","webpack://SwaggerUIBundle/./node_modules/process/browser.js","webpack://SwaggerUIBundle/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://SwaggerUIBundle/./node_modules/prop-types/index.js","webpack://SwaggerUIBundle/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://SwaggerUIBundle/./node_modules/qs/lib/formats.js","webpack://SwaggerUIBundle/./node_modules/qs/lib/index.js","webpack://SwaggerUIBundle/./node_modules/qs/lib/parse.js","webpack://SwaggerUIBundle/./node_modules/qs/lib/stringify.js","webpack://SwaggerUIBundle/./node_modules/qs/lib/utils.js","webpack://SwaggerUIBundle/./node_modules/querystringify/index.js","webpack://SwaggerUIBundle/./node_modules/randexp/lib/randexp.js","webpack://SwaggerUIBundle/./node_modules/randombytes/browser.js","webpack://SwaggerUIBundle/./node_modules/react-copy-to-clipboard/lib/Component.js","webpack://SwaggerUIBundle/./node_modules/react-copy-to-clipboard/lib/index.js","webpack://SwaggerUIBundle/./node_modules/react-debounce-input/lib/Component.js","webpack://SwaggerUIBundle/./node_modules/react-debounce-input/lib/index.js","webpack://SwaggerUIBundle/./node_modules/react-dom/cjs/react-dom.production.min.js","webpack://SwaggerUIBundle/./node_modules/react-dom/index.js","webpack://SwaggerUIBundle/./node_modules/react-immutable-proptypes/dist/ImmutablePropTypes.js","webpack://SwaggerUIBundle/./node_modules/react-is/cjs/react-is.production.min.js","webpack://SwaggerUIBundle/./node_modules/react-is/index.js","webpack://SwaggerUIBundle/./node_modules/react/cjs/react.production.min.js","webpack://SwaggerUIBundle/./node_modules/react/index.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/errors-browser.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/_stream_duplex.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/_stream_passthrough.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/_stream_readable.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/_stream_transform.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/_stream_writable.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/async_iterator.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/buffer_list.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/destroy.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/end-of-stream.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/from-browser.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/pipeline.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/state.js","webpack://SwaggerUIBundle/./node_modules/readable-stream/lib/internal/streams/stream-browser.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/combineReducers.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/index.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/utilities/getStateName.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/utilities/getUnexpectedInvocationParameterMessage.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/utilities/index.js","webpack://SwaggerUIBundle/./node_modules/redux-immutable/dist/utilities/validateNextState.js","webpack://SwaggerUIBundle/./node_modules/repeat-string/index.js","webpack://SwaggerUIBundle/./node_modules/requires-port/index.js","webpack://SwaggerUIBundle/./node_modules/ret/lib/index.js","webpack://SwaggerUIBundle/./node_modules/ret/lib/positions.js","webpack://SwaggerUIBundle/./node_modules/ret/lib/sets.js","webpack://SwaggerUIBundle/./node_modules/ret/lib/types.js","webpack://SwaggerUIBundle/./node_modules/ret/lib/util.js","webpack://SwaggerUIBundle/./node_modules/safe-buffer/index.js","webpack://SwaggerUIBundle/./node_modules/scheduler/cjs/scheduler.production.min.js","webpack://SwaggerUIBundle/./node_modules/scheduler/index.js","webpack://SwaggerUIBundle/./node_modules/serialize-error/index.js","webpack://SwaggerUIBundle/./node_modules/sha.js/hash.js","webpack://SwaggerUIBundle/./node_modules/sha.js/index.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha1.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha224.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha256.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha384.js","webpack://SwaggerUIBundle/./node_modules/sha.js/sha512.js","webpack://SwaggerUIBundle/./node_modules/short-unique-id/dist/short-unique-id.js","webpack://SwaggerUIBundle/./node_modules/side-channel/index.js","webpack://SwaggerUIBundle/./node_modules/stampit/dist/stampit.min.js","webpack://SwaggerUIBundle/./node_modules/stream-browserify/index.js","webpack://SwaggerUIBundle/./node_modules/string_decoder/lib/string_decoder.js","webpack://SwaggerUIBundle/./node_modules/toggle-selection/index.js","webpack://SwaggerUIBundle/./node_modules/traverse/index.js","webpack://SwaggerUIBundle/./node_modules/url-parse/index.js","webpack://SwaggerUIBundle/./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","webpack://SwaggerUIBundle/./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","webpack://SwaggerUIBundle/./node_modules/use-sync-external-store/shim/index.js","webpack://SwaggerUIBundle/./node_modules/use-sync-external-store/shim/with-selector.js","webpack://SwaggerUIBundle/./node_modules/util-deprecate/browser.js","webpack://SwaggerUIBundle/./node_modules/xml-but-prettier/dist/index.js","webpack://SwaggerUIBundle/./node_modules/xml/lib/escapeForXML.js","webpack://SwaggerUIBundle/./node_modules/xml/lib/xml.js","webpack://SwaggerUIBundle/./node_modules/zenscroll/zenscroll.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime-corejs3/core-js/aggregate-error.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime-corejs3/helpers/extends.js","webpack://SwaggerUIBundle/webpack/bootstrap","webpack://SwaggerUIBundle/webpack/runtime/compat get default export","webpack://SwaggerUIBundle/webpack/runtime/define property getters","webpack://SwaggerUIBundle/webpack/runtime/global","webpack://SwaggerUIBundle/webpack/runtime/hasOwnProperty shorthand","webpack://SwaggerUIBundle/webpack/runtime/make namespace object","webpack://SwaggerUIBundle/webpack/runtime/node module decorator","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://SwaggerUIBundle/./node_modules/redux/es/redux.js","webpack://SwaggerUIBundle/./src/core/plugins/err/actions.js","webpack://SwaggerUIBundle/./src/core/window.js","webpack://SwaggerUIBundle/./src/core/utils/get-parameter-schema.js","webpack://SwaggerUIBundle/./src/core/utils/index.js","webpack://SwaggerUIBundle/./src/core/system.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/actions.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/reducers.js","webpack://SwaggerUIBundle/./node_modules/reselect/es/defaultMemoize.js","webpack://SwaggerUIBundle/./node_modules/reselect/es/index.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/spec-extensions/wrap-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/configs-extensions/wrap-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/wrap-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/auth/components/lock-auth-icon.jsx","webpack://SwaggerUIBundle/./src/core/plugins/auth/components/unlock-auth-icon.jsx","webpack://SwaggerUIBundle/./src/core/plugins/auth/index.js","webpack://SwaggerUIBundle/./node_modules/js-yaml/dist/js-yaml.mjs","webpack://SwaggerUIBundle/./src/core/plugins/configs/helpers.js","webpack://SwaggerUIBundle/./src/core/plugins/configs/actions.js","webpack://SwaggerUIBundle/./src/core/plugins/configs/spec-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/configs/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/configs/reducers.js","webpack://SwaggerUIBundle/./src/core/plugins/configs/index.js","webpack://SwaggerUIBundle/./src/core/plugins/deep-linking/helpers.js","webpack://SwaggerUIBundle/./src/core/plugins/deep-linking/layout.js","webpack://SwaggerUIBundle/./src/core/plugins/deep-linking/operation-wrapper.jsx","webpack://SwaggerUIBundle/./src/core/plugins/deep-linking/operation-tag-wrapper.jsx","webpack://SwaggerUIBundle/./src/core/plugins/deep-linking/index.js","webpack://SwaggerUIBundle/./src/core/plugins/err/error-transformers/transformers/not-of-type.js","webpack://SwaggerUIBundle/./src/core/plugins/err/error-transformers/transformers/parameter-oneof.js","webpack://SwaggerUIBundle/./src/core/plugins/err/error-transformers/hook.js","webpack://SwaggerUIBundle/./src/core/plugins/err/reducers.js","webpack://SwaggerUIBundle/./src/core/plugins/err/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/err/index.js","webpack://SwaggerUIBundle/./src/core/plugins/filter/opsFilter.js","webpack://SwaggerUIBundle/./src/core/plugins/filter/index.js","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/arrow-up.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/arrow-down.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/arrow.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/close.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/copy.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/lock.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/components/unlock.jsx","webpack://SwaggerUIBundle/./src/core/plugins/icons/index.js","webpack://SwaggerUIBundle/./src/core/plugins/layout/actions.js","webpack://SwaggerUIBundle/./src/core/plugins/layout/reducers.js","webpack://SwaggerUIBundle/./src/core/plugins/layout/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/layout/spec-extensions/wrap-selector.js","webpack://SwaggerUIBundle/./src/core/plugins/layout/index.js","webpack://SwaggerUIBundle/./src/core/plugins/logs/index.js","webpack://SwaggerUIBundle/./src/core/plugins/on-complete/index.js","webpack://SwaggerUIBundle/./src/core/plugins/request-snippets/fn.js","webpack://SwaggerUIBundle/./src/core/plugins/request-snippets/selectors.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/create-element.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/checkForListedLanguage.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/highlight.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/light.js","webpack://SwaggerUIBundle/./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/javascript.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/json.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/xml.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/bash.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/yaml.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/http.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/languages/hljs/powershell.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/agate.js","webpack://SwaggerUIBundle/./src/core/syntax-highlighting.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/arta.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/monokai.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/nord.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/obsidian.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/tomorrow-night.js","webpack://SwaggerUIBundle/./node_modules/react-syntax-highlighter/dist/esm/styles/hljs/idea.js","webpack://SwaggerUIBundle/./src/core/plugins/request-snippets/request-snippets.jsx","webpack://SwaggerUIBundle/./src/core/plugins/request-snippets/index.js","webpack://SwaggerUIBundle/./src/core/utils/memoizeN.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/fn/index.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/fn/get-json-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/fn/get-yaml-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/fn/get-xml-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/fn/get-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-5-samples/index.js","webpack://SwaggerUIBundle/./src/core/plugins/spec/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/spec/actions.js","webpack://SwaggerUIBundle/./src/core/plugins/spec/reducers.js","webpack://SwaggerUIBundle/./src/core/plugins/spec/wrap-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/spec/index.js","webpack://SwaggerUIBundle/./node_modules/fast-json-patch/module/helpers.mjs","webpack://SwaggerUIBundle/./node_modules/fast-json-patch/module/core.mjs","webpack://SwaggerUIBundle/./node_modules/fast-json-patch/module/duplex.mjs","webpack://SwaggerUIBundle/./node_modules/fast-json-patch/index.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/index.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isPlaceholder.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_curry1.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_curry2.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_curry3.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isInteger.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isString.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/nth.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/paths.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/path.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/pathSatisfies.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_cloneRegExp.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_arrayFromIterator.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_includesWith.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_has.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_objectIs.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isArguments.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/keys.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/type.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_equals.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_functionName.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/equals.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_includes.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_indexOf.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_map.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_quote.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_toISOString.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_complement.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_arrayReduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isArray.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_dispatchable.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isTransformer.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isObject.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xfBase.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xfilter.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/filter.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_filter.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/reject.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_toString.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/toString.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/test.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isRegExp.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_arity.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_pipe.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isArrayLike.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_createReduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xArrayReduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/bind.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xReduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xwrap.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/reduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_checkForMethod.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/slice.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/tail.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/pipe.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/defaultTo.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/prop.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/propOr.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/last.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_curryN.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/curryN.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/curry.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isFunction.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/invoker.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/split.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_dropLastWhile.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xdropLastWhile.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/dropLastWhile.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/join.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/flip.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/included.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/includes.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/trimCharsEnd.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_reduce.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xmap.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/map.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/ap.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_concat.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/liftN.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/lift.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/complement.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/not.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/always.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/stubUndefined.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isUndefined.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotUndefined.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/max.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/pluck.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/anyPass.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/identical.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isGeneratorFunction.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isAsyncFunction.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isFunction.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/replace.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isRegExp.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/when.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isString.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/escapeRegExp.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/internal/ponyfills/String.replaceAll.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/replaceAll.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/util/url.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/fetch-ponyfill.browser.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/create-error.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/fetch-polyfill.browser.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/constants.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/helpers.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/refs.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/all-of.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/parameters.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/properties.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/lib/context-tree.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/specmap/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/replace-special-chars-with-underscore.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/op-id.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/id-from-path-method/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/generic/normalize.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/utils/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/oas3/style-serializer.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/http/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/utils/options.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/generic/resolve.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/generic/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/openapi-predicates.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-2/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-2/resolve.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-3-0/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-3-0/resolve.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/elements/Annotation.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/elements/Comment.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/elements/ParseResult.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/elements/SourceMap.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/init.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/apply.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotFunction.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/and.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/both.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/empty.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isTypedArray.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/isEmpty.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isArray.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isEmptyArray.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/invokeArgs.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_reduced.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xall.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/all.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/predicates/helpers.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/predicates/index.mjs","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNull.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotNull.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/internal/isOfTypeObject.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isObjLike.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isPlainObj.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/namespace.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/refractor/toolbox.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/F.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-error/es/ApiDOMAggregateError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-error/es/ApiDOMError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-error/es/ApiDOMStructuredError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ast/es/traversal/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/clone/errors/CloneError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/clone/errors/DeepCloneError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/clone/errors/ShallowCloneError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/clone/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/traversal/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/refractor/plugins/utils/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/refractor/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/refractor/registration.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transcluder/Transcluder.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/T.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transformers/serializers/value/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transformers/serializers/value/ast/ephemeral-array.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transformers/serializers/value/ast/ephemeral-object.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transformers/serializers/value/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/escape.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/errors/JsonPointerError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/errors/CompilationJsonPointerError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/compile.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/converge.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_identity.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/identity.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/internal/ponyfills/Number.isFinite.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNumber.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isFinite.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/internal/ponyfills/Number.isInteger.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isInteger.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xtake.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/take.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/startsWith.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isEmptyString.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xdropWhile.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/dropWhile.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/trimCharsStart.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/unescape.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/errors/InvalidJsonPointerError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/parse.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/errors/EvaluationJsonPointerError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-json-pointer/es/evaluate.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Callback.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Components.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Contact.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Discriminator.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Encoding.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Example.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/ExternalDocumentation.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Header.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Info.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/License.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Link.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/MediaType.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/OAuthFlow.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/OAuthFlows.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Openapi.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/OpenApi3-0.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Operation.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Parameter.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/PathItem.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Paths.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Reference.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/RequestBody.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Response.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Responses.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-error/es/UnsupportedOperationError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/elements/JSONSchema.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/elements/JSONReference.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/elements/Media.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/elements/LinkDescription.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/mapObjIndexed.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/isNil.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/hasPath.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/has.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/propSatisfies.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/util.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/Visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/FallbackVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/noop.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/pick.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/traversal/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/SpecificationVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/generics/FixedFieldsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/IdVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/$schemaVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MultipleOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MaximumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/ExclusiveMaximumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MinimumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/ExclusiveMinimumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MaxLengthVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MinLengthVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/PatternVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/ParentSchemaAwareVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/predicates.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/ItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MaxItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MinItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/UniqueItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MaxPropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/MinPropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/RequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/allPass.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/or.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotObj.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isObj.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/either.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotEmpty.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNonEmptyString.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/generics/PatternedFieldsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/generics/MapVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/PropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/PatternPropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/DependenciesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/EnumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/TypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/AllOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/AnyOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/OneOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/DefinitionsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/TitleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/DefaultVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/FormatVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/BaseVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/LinksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/ReadOnlyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/json-reference/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/json-reference/$RefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/ifElse.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/comparator.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/sort.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/head.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/reduced.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNotNil.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/isNonEmptyArray.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/dispatch.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/generics/AlternatingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/JSONSchemaOrJSONReferenceVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/specification.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/media/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/media/BinaryEncodingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/media/TypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/HrefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/RelVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/TitleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/MediaTypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/MethodVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/visitors/json-schema/link-description/EncTypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/predicates.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/namespace.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/toolbox.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-json-schema-draft-4/es/refractor/registration.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Schema.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/SecurityRequirement.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/SecurityScheme.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Server.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/ServerVariable.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Tag.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/Xml.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/Visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/traversal/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/SpecificationVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/predicates.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/generics/FixedFieldsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/FallbackVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/OpenapiVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/SpecificationExtensionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/info/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/info/TitleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/info/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/info/TermsOfServiceVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/info/VersionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/contact/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/contact/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/contact/UrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/contact/EmailVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/license/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/license/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/license/UrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/OperationRefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/OperationIdVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/generics/PatternedFieldsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/generics/MapVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/LinkParameters.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/ParametersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/RequestBodyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/link/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server/UrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/Servers.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/ServersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server-variable/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server-variable/EnumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server-variable/DefaultVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server-variable/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ServerVariables.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/server/VariablesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/media-type/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/generics/AlternatingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/predicates.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/media-type/SchemaVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/media-type/ExampleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/MediaTypeExamples.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/media-type/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/MediaTypeEncoding.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/media-type/EncodingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-requirement/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/Security.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/SecurityVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/tag/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/tag/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/tag/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/reference/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/reference/$RefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/InVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/RequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/DeprecatedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/AllowEmptyValueVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/StyleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/ExplodeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/AllowReservedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/SchemaVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/RequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/DeprecatedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/AllowEmptyValueVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/StyleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/ExplodeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/AllowReservedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/SchemaVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/ExampleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/HeaderExamples.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/ContentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/HeaderContent.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/header/ContentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/AllOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/AnyOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/OneOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/ItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/PropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/TypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/NullableVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/WriteOnlyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/ExampleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/DeprecatedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/schema/SchemaOrReferenceVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/distriminator/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/distriminator/PropertyNameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/DiscriminatorMapping.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/distriminator/MappingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/NamespaceVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/PrefixVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/AttributeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/xml/WrappedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/ExampleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ParameterExamples.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ParameterContent.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/parameter/ContentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsSchemas.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/SchemasVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsResponses.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/ResponsesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsParameters.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/ParametersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsExamples.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsRequestBodies.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/RequestBodiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsHeaders.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/HeadersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsSecuritySchemes.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/SecuritySchemesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsLinks.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/LinksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ComponentsCallbacks.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/components/CallbacksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/example/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/example/SummaryVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/example/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/example/ValueVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/example/ExternalValueVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/external-documentation/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/external-documentation/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/external-documentation/UrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/ContentTypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/EncodingHeaders.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/HeadersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/StyleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/ExplodeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/encoding/AllowReservedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/paths/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/request-body/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/request-body/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/RequestBodyContent.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/request-body/ContentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/request-body/RequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/callback/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/response/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/response/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ResponseHeaders.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/response/HeadersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ResponseContent.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/response/ContentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/ResponseLinks.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/response/LinksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_isNumber.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/range.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_Set.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/difference.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/generics/MixedFieldsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/responses/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/responses/DefaultVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OperationTags.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/TagsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/SummaryVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/OperationIdVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OperationParameters.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/ParametersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/ParametersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/RequestBodyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OperationCallbacks.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/CallbacksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/DeprecatedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OperationSecurity.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/SecurityVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OperationServers.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/operation/ServersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/$RefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/SummaryVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/PathItemServers.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/ServersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/PathItemParameters.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/path-item/ParametersVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/TypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/NameVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/InVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/SchemeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/BearerFormatVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/security-scheme/OpenIdConnectUrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flows/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flow/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flow/AuthorizationUrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flow/TokenUrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flow/RefreshUrlVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/OAuthFlowScopes.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/oauth-flow/ScopesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/elements/nces/Tags.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/visitors/open-api-3-0/TagsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/specification.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/namespace.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/toolbox.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-0/es/refractor/registration.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Callback.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Components.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Contact.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Discriminator.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Encoding.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Example.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/ExternalDocumentation.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Header.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Info.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/JsonSchemaDialect.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/License.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Link.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/MediaType.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/OAuthFlow.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/OAuthFlows.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Openapi.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/OpenApi3-1.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Operation.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Parameter.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/PathItem.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Paths.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Reference.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/RequestBody.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Response.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Responses.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Schema.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/SecurityRequirement.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/SecurityScheme.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Server.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/ServerVariable.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Tag.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/Xml.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/info/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/info/SummaryVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/contact/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/license/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/license/IdentifierVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/link/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/server/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/server-variable/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/media-type/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/security-requirement/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/components/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/tag/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/reference/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/reference/SummaryVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/reference/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/parameter/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/header/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/predicates.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ParentSchemaAwareVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$schemaVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$vocabularyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$idVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$anchorVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$dynamicAnchorVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$dynamicRefVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$refVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$defsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/$commentVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/AllOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/OneOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/PatternProperties.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/TypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/EnumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ConstVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MultipleOfVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MaximumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ExclusiveMaximumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MinimumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ExclusiveMinimumVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MaxLengthVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MinLengthVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/PatternVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MaxItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MinItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/UniqueItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MaxContainsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MinContainsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MaxPropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/MinPropertiesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/RequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/DependentRequiredVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/TitleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/DescriptionVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/DefaultVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/DeprecatedVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ReadOnlyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/WriteOnlyVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ExamplesVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/FormatVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ContentEncodingVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ContentMediaTypeVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/schema/ExampleVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/distriminator/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/xml/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/components/SchemasVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/nces/ComponentsPathItems.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/components/PathItemsVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/example/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/external-documentation/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/encoding/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/paths/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/request-body/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/callback/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/response/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/responses/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/operation/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/path-item/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/security-scheme/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/oauth-flows/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/oauth-flow/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/elements/nces/Webhooks.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/visitors/open-api-3-1/WebhooksVisitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/specification.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/traversal/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/namespace.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/toolbox.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/registration.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-error/es/NotImplementedError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/media-types.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/media-types.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/Reference.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/propEq.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/ReferenceSet.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/options/index.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/lens.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/assocPath.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_assoc.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/mergeWithKey.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/mergeDeepWithKey.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/mergeDeepRight.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/over.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/options/util.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/util/File.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/PluginError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/util/plugins.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/ParserError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/UnmatchedDereferenceStrategyError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/DereferenceError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/parse/parsers/Parser.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/parse/parsers/binary/index-browser.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/strategies/ResolveStrategy.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/none.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/values.js","webpack://SwaggerUIBundle/./node_modules/ramda-adjunct/es/allP.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/MaximumDereferenceDepthError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/ResolverError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/MaximumResolverDepthError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/JsonSchemaUriError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/EvaluationJsonSchemaUriError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/UnmatchedResolverError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/parse/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/util.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/traversal/filter.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/pathOr.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/traversal/find.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/JsonSchema$anchorError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/EvaluationJsonSchema$anchorError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/errors/InvalidJsonSchema$anchorError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/strategies/openapi-3-1/selectors/$anchor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/strategies/openapi-3-1/util.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/strategies/openapi-3-1/selectors/uri.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/strategies/openapi-3-1/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/strategies/openapi-3-1/index.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_clone.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xreduceBy.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/reduceBy.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/groupBy.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-operation-ids.mjs","webpack://SwaggerUIBundle/./node_modules/ramda/es/internal/_xuniqWith.js","webpack://SwaggerUIBundle/./node_modules/ramda/es/uniqWith.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-parameters.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-security-requirements.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-servers.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-parameter-examples.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-header-examples.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-3-1-apidom/normalize.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/resolvers/Resolver.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/resolve/resolvers/HttpResolver.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/abortcontroller-ponyfill.browser.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/abortcontroller-polyfill.browser.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/resolve/resolvers/http-swagger-client/index.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transformers/from.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/parse/parsers/json/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/parse/parsers/yaml-1-2/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/parse/parsers/openapi-json-3-1/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/parse/parsers/openapi-yaml-3-1/index.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/strategies/DereferenceStrategy.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/identity/errors/ElementIdentityError.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/identity/index.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/util.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/strategies/openapi-3-1/visitor.mjs","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-reference/es/dereference/strategies/openapi-3-1/index.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/utils/to-path.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/utils/get-root-cause.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/errors/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/visitors/dereference.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/utils/compose.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/visitors/parameters.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/visitors/properties.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/deepmerge.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/visitors/all-of.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-3-1-apidom/resolve.js","webpack://SwaggerUIBundle/./node_modules/@swagger-api/apidom-core/es/transcluder/index.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/strategies/openapi-3-1-apidom/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/resolver/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/node_modules/is-plain-object/dist/is-plain-object.mjs","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/swagger2/parameter-builders.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/oas3/content-serializer.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/oas3/parameter-builders.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/btoa.browser.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/oas3/build-request.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/swagger2/build-request.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/id-from-path-method/legacy.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/execute/index.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/get-operation-raw.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/find-operation.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/helpers/each-operation.js","webpack://SwaggerUIBundle/./node_modules/swagger-client/es/subtree-resolver/index.js","webpack://SwaggerUIBundle/./src/core/plugins/swagger-client/configs-wrap-actions.js","webpack://SwaggerUIBundle/./src/core/plugins/swagger-client/index.js","webpack://SwaggerUIBundle/./src/core/plugins/util/index.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/batch.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/components/Context.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/hooks/useSelector.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/selectorFactory.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/wrapMapToProps.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/invalidArgFactory.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/mergeProps.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/Subscription.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/shallowEqual.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/useSyncExternalStore.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/components/connect.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/mapStateToProps.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/connect/mapDispatchToProps.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/utils/bindActionCreators.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/components/Provider.js","webpack://SwaggerUIBundle/./node_modules/react-redux/es/index.js","webpack://SwaggerUIBundle/./src/core/plugins/view/root-injects.jsx","webpack://SwaggerUIBundle/./src/core/plugins/view/fn.js","webpack://SwaggerUIBundle/./src/core/plugins/view/index.js","webpack://SwaggerUIBundle/./src/core/plugins/download-url/index.js","webpack://SwaggerUIBundle/./src/core/plugins/safe-render/fn.jsx","webpack://SwaggerUIBundle/./src/core/plugins/safe-render/components/fallback.jsx","webpack://SwaggerUIBundle/./src/core/plugins/safe-render/components/error-boundary.jsx","webpack://SwaggerUIBundle/./src/core/plugins/safe-render/index.js","webpack://SwaggerUIBundle/./src/core/components/app.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/authorization-popup.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/authorize-btn.jsx","webpack://SwaggerUIBundle/./src/core/containers/authorize-btn.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/authorize-operation-btn.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/auths.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/auth-item.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/error.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/api-key-auth.jsx","webpack://SwaggerUIBundle/./src/core/components/auth/basic-auth.jsx","webpack://SwaggerUIBundle/./src/core/components/example.jsx","webpack://SwaggerUIBundle/./src/core/components/examples-select.jsx","webpack://SwaggerUIBundle/./src/core/components/examples-select-value-retainer.jsx","webpack://SwaggerUIBundle/./src/core/oauth2-authorize.js","webpack://SwaggerUIBundle/./src/core/components/auth/oauth2.jsx","webpack://SwaggerUIBundle/./src/core/components/clear.jsx","webpack://SwaggerUIBundle/./src/core/components/live-response.jsx","webpack://SwaggerUIBundle/./src/core/components/online-validator-badge.jsx","webpack://SwaggerUIBundle/./src/core/components/operations.jsx","webpack://SwaggerUIBundle/./src/core/utils/url.js","webpack://SwaggerUIBundle/./src/core/components/operation-tag.jsx","webpack://SwaggerUIBundle/./src/core/assets/rolling-load.svg","webpack://SwaggerUIBundle/./src/core/components/operation.jsx","webpack://SwaggerUIBundle/./src/core/containers/OperationContainer.jsx","webpack://SwaggerUIBundle/./src/core/components/operation-summary.jsx","webpack://SwaggerUIBundle/./src/core/components/operation-summary-method.jsx","webpack://SwaggerUIBundle/./src/core/components/operation-summary-path.jsx","webpack://SwaggerUIBundle/./src/core/components/operation-extensions.jsx","webpack://SwaggerUIBundle/./src/core/components/operation-extension-row.jsx","webpack://SwaggerUIBundle/./src/core/components/highlight-code.jsx","webpack://SwaggerUIBundle/./src/core/components/responses.jsx","webpack://SwaggerUIBundle/./src/core/utils/create-html-ready-id.js","webpack://SwaggerUIBundle/./src/core/utils/jsonParse.js","webpack://SwaggerUIBundle/./src/core/components/response.jsx","webpack://SwaggerUIBundle/./src/core/components/response-extension.jsx","webpack://SwaggerUIBundle/./src/core/components/response-body.jsx","webpack://SwaggerUIBundle/./src/core/components/parameters/parameters.jsx","webpack://SwaggerUIBundle/./src/core/components/parameter-extension.jsx","webpack://SwaggerUIBundle/./src/core/components/parameter-include-empty.jsx","webpack://SwaggerUIBundle/./src/core/components/parameter-row.jsx","webpack://SwaggerUIBundle/./src/core/components/execute.jsx","webpack://SwaggerUIBundle/./src/core/components/headers.jsx","webpack://SwaggerUIBundle/./src/core/components/errors.jsx","webpack://SwaggerUIBundle/./src/core/components/content-type.jsx","webpack://SwaggerUIBundle/./src/core/components/layout-utils.jsx","webpack://SwaggerUIBundle/./src/core/components/overview.jsx","webpack://SwaggerUIBundle/./src/core/components/initialized-input.jsx","webpack://SwaggerUIBundle/./src/core/components/info.jsx","webpack://SwaggerUIBundle/./src/core/containers/info.jsx","webpack://SwaggerUIBundle/./src/core/components/contact.jsx","webpack://SwaggerUIBundle/./src/core/components/license.jsx","webpack://SwaggerUIBundle/./src/core/components/jump-to-path.jsx","webpack://SwaggerUIBundle/./src/core/components/copy-to-clipboard-btn.jsx","webpack://SwaggerUIBundle/./src/core/components/footer.jsx","webpack://SwaggerUIBundle/./src/core/containers/filter.jsx","webpack://SwaggerUIBundle/./src/core/components/param-body.jsx","webpack://SwaggerUIBundle/./src/core/components/curl.jsx","webpack://SwaggerUIBundle/./src/core/components/schemes.jsx","webpack://SwaggerUIBundle/./src/core/containers/schemes.jsx","webpack://SwaggerUIBundle/./src/core/components/model-collapse.jsx","webpack://SwaggerUIBundle/./src/core/components/model-example.jsx","webpack://SwaggerUIBundle/./src/core/components/model-wrapper.jsx","webpack://SwaggerUIBundle/./node_modules/react-immutable-pure-component/lib/react-immutable-pure-component.es.js","webpack://SwaggerUIBundle/./src/core/components/model.jsx","webpack://SwaggerUIBundle/./src/core/components/models.jsx","webpack://SwaggerUIBundle/./src/core/components/enum-model.jsx","webpack://SwaggerUIBundle/./src/core/components/object-model.jsx","webpack://SwaggerUIBundle/./src/core/components/array-model.jsx","webpack://SwaggerUIBundle/./src/core/components/primitive-model.jsx","webpack://SwaggerUIBundle/./src/core/components/property.jsx","webpack://SwaggerUIBundle/./src/core/components/try-it-out-button.jsx","webpack://SwaggerUIBundle/./src/core/components/version-pragma-filter.jsx","webpack://SwaggerUIBundle/./src/core/components/version-stamp.jsx","webpack://SwaggerUIBundle/./src/core/components/openapi-version.jsx","webpack://SwaggerUIBundle/./src/core/components/deep-link.jsx","webpack://SwaggerUIBundle/./src/core/components/svg-assets.jsx","webpack://SwaggerUIBundle/./node_modules/remarkable/dist/esm/index.browser.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/utils.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/html-tag.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/anchor-tag-builder.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/truncate/truncate-smart.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/truncate/truncate-middle.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/truncate/truncate-end.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/match.js","webpack://SwaggerUIBundle/./node_modules/tslib/tslib.es6.mjs","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/email-match.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/url-matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/hashtag-match.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/mention-match.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/phone-match.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/match/url-match.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/regex-lib.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/tld-regex.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/email-matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/url-match-validator.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/hashtag-matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/phone-matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/matcher/mention-matcher.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/htmlParser/parse-html.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/autolinker.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/version.js","webpack://SwaggerUIBundle/./node_modules/autolinker/dist/es2015/index.js","webpack://SwaggerUIBundle/./node_modules/remarkable/dist/esm/linkify.js","webpack://SwaggerUIBundle/./src/core/components/providers/markdown.jsx","webpack://SwaggerUIBundle/./src/core/components/layouts/base.jsx","webpack://SwaggerUIBundle/./src/core/presets/base/plugins/core-components/index.js","webpack://SwaggerUIBundle/./src/core/presets/base/plugins/form-components/index.js","webpack://SwaggerUIBundle/./src/core/components/json-schema-components.jsx","webpack://SwaggerUIBundle/./src/core/presets/base/plugins/json-schema-components/index.js","webpack://SwaggerUIBundle/./src/core/presets/base/index.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/spec-extensions/wrap-selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/auth-extensions/wrap-selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/helpers.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/spec-extensions/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/callbacks.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/request-body.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/operation-link.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/servers.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/servers-container.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/request-body-editor.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/auth/http-auth.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/operation-servers.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/components/index.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/markdown.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/auth/auth-item.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/online-validator-badge.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/model.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/json-schema-string.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/index.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/wrap-components/openapi-version.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas3/actions.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/reducers.js","webpack://SwaggerUIBundle/./src/core/plugins/oas3/index.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/webhooks.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/license.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/contact.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/info.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/json-schema-dialect.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/version-pragma-filter.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/model/model.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/models/models.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/auth/mutual-tls-auth.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/components/auth/auths.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/fn.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/license.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/contact.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/info.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/fn.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/model.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/models.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/version-pragma-filter.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/auth/auth-item.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/wrap-components/auths.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/spec-extensions/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/spec-extensions/wrap-selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/auth-extensions/wrap-selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/selectors.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/ExternalDocs.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Description.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Description.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Properties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Properties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/oas31/after-load.js","webpack://SwaggerUIBundle/./src/core/plugins/oas31/index.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/prop-types.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/context.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/hooks.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/JSONSchema/JSONSchema.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$schema.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$vocabulary/$vocabulary.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$id.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$anchor.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$dynamicAnchor.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$ref.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$dynamicRef.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$defs.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/$comment.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/AllOf.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/AnyOf.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/OneOf.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Not.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/If.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Then.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Else.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/DependentSchemas.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/PrefixItems.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Items.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Contains.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Properties/Properties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/PatternProperties/PatternProperties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/AdditionalProperties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/PropertyNames.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/UnevaluatedItems.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/UnevaluatedProperties.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Type.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Enum/Enum.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Const.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Constraint/Constraint.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/DependentRequired/DependentRequired.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/ContentSchema.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Title/Title.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Description/Description.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Default.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/Deprecated.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/ReadOnly.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/keywords/WriteOnly.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/Accordion/Accordion.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/ExpandDeepButton/ExpandDeepButton.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/components/icons/ChevronRight.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/fn.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/hoc.jsx","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12/index.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/array.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/object.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/random.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/predicates.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/email.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/idn-email.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/hostname.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/idn-hostname.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/ipv4.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/ipv6.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/uri.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/uri-reference.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/iri.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/iri-reference.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/uuid.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/uri-template.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/json-pointer.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/relative-json-pointer.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/date-time.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/date.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/time.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/duration.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/password.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/regex.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/class/Registry.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/api/formatAPI.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/7bit.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/8bit.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/binary.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/quoted-printable.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/base16.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/base32.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/encoders/base64.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/class/EncoderRegistry.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/api/encoderAPI.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/media-types/text.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/media-types/image.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/media-types/audio.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/media-types/video.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/media-types/application.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/class/MediaTypeRegistry.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/api/mediaTypeAPI.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/string.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/float.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/double.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/number.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/int32.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/generators/int64.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/integer.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/boolean.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/index.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/types/null.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/constants.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/example.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/type.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/utils.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/core/merge.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/main.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/get-json-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/get-yaml-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/get-xml-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/fn/get-sample-schema.js","webpack://SwaggerUIBundle/./src/core/plugins/json-schema-2020-12-samples/index.js","webpack://SwaggerUIBundle/./src/core/presets/apis/index.js","webpack://SwaggerUIBundle/./src/core/index.js","webpack://SwaggerUIBundle/./src/index.js"],"names":["webpackUniversalModuleDefinition","root","factory","exports","module","define","amd","this","invalidProtocolRegex","htmlEntitiesRegex","htmlCtrlEntityRegex","ctrlCharactersRegex","urlSchemeRegex","relativeFirstCharacters","sanitizeUrl","url","sanitizedUrl","decodeHtmlCharacters","str","replace","match","dec","String","fromCharCode","trim","isRelativeUrlWithoutProtocol","indexOf","urlSchemeParseResults","urlScheme","test","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","code","Error","start","end","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","fromString","string","encoding","isEncoding","actual","write","slice","ArrayBuffer","isView","fromArrayView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","SharedArrayBuffer","valueOf","b","fromObject","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","asciiToBytes","byteArray","base64Write","ucs2Write","utf16leToBytes","units","c","hi","lo","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","decodeCodePointsArray","codePoints","MAX_ARGUMENTS_LENGTH","apply","kMaxLength","TYPED_ARRAY_SUPPORT","typedArraySupport","proto","foo","e","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","NodeError","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","base64clean","split","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","GetIntrinsic","callBind","$indexOf","callBoundIntrinsic","allowMissing","intrinsic","bind","$apply","$call","$reflectApply","$gOPD","$defineProperty","$max","originalFunction","func","applyBind","hasOwn","hasOwnProperty","classNames","classes","argType","inner","key","default","parse","options","decode","index","eqIdx","endIdx","tryDecode","serialize","opt","enc","encode","fieldContentRegExp","maxAge","isNaN","domain","path","expires","isDate","__toString","Date","toUTCString","httpOnly","secure","priority","sameSite","decodeURIComponent","encodeURIComponent","deselectCurrent","clipboardToIE11Formatting","text","debug","reselectPrevious","selection","mark","success","document","createRange","getSelection","createElement","textContent","ariaHidden","style","all","position","top","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","userSelect","addEventListener","stopPropagation","format","preventDefault","clipboardData","warn","window","clearData","setData","onCopy","body","appendChild","selectNodeContents","addRange","execCommand","err","copyKey","navigator","userAgent","prompt","removeRange","removeAllRanges","removeChild","parent","AggregateError","entryVirtual","isPrototypeOf","method","FunctionPrototype","Function","it","own","assign","isCallable","tryToString","$TypeError","argument","$String","isObject","toIndexedObject","toAbsoluteIndex","lengthOfArrayLike","createMethod","IS_INCLUDES","$this","el","fromIndex","O","uncurryThis","stringSlice","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","wellKnownSymbol","$Object","CORRECT_ARGUMENTS","tag","result","tryGet","callee","ownKeys","getOwnPropertyDescriptorModule","definePropertyModule","source","exceptions","keys","f","getOwnPropertyDescriptor","fails","F","getPrototypeOf","done","DESCRIPTORS","createPropertyDescriptor","object","bitmap","createNonEnumerableProperty","global","documentAll","IS_HTMLDDA","EXISTS","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","version","process","Deno","versions","v8","CONSTRUCTOR","$Error","TEST","V8_OR_CHAKRA_STACK_ENTRY","IS_V8_OR_CHAKRA_STACK","dropEntries","prepareStackTrace","clearErrorStack","ERROR_STACK_INSTALLABLE","captureStackTrace","C","isForced","wrapConstructor","NativeConstructor","Wrapper","FORCED","USE_NATIVE","VIRTUAL_PROTOTYPE","sourceProperty","targetProperty","nativeProperty","resultProperty","descriptor","TARGET","GLOBAL","STATIC","stat","PROTO","nativeSource","targetPrototype","forced","dontCallGetSet","wrap","sham","real","exec","NATIVE_BIND","Reflect","aCallable","that","arraySlice","$Function","factories","Prototype","partArgs","boundFunction","bound","args","argsLength","construct","getDescriptor","PROPER","something","CONFIGURABLE","uncurryThisWithBind","aFunction","variable","namespace","classof","getMethod","isNullOrUndefined","Iterators","ITERATOR","anObject","getIteratorMethod","usingIterator","iteratorMethod","V","P","check","globalThis","self","g","toObject","getBuiltIn","propertyIsEnumerable","dummy","NewTarget","NewTargetPrototype","cause","has","NATIVE_WEAK_MAP","shared","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","WeakMap","state","store","metadata","facade","STATE","enforce","getterFor","TYPE","ArrayPrototype","$documentAll","replacement","feature","detection","normalize","POLYFILL","NATIVE","USE_SYMBOL_AS_UID","$Symbol","isArrayIteratorMethod","getIterator","iteratorClose","Result","stopped","ResultPrototype","iterable","unboundFunction","iterator","iterFn","next","step","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","kind","innerResult","innerError","IteratorPrototype","create","setToStringTag","returnThis","IteratorConstructor","NAME","ENUMERABLE_NEXT","$","IS_PURE","FunctionName","createIteratorConstructor","defineBuiltIn","IteratorsCore","PROPER_FUNCTION_NAME","CONFIGURABLE_FUNCTION_NAME","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","ENTRIES","Iterable","DEFAULT","IS_SET","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","values","entries","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","PrototypeOfArrayIteratorPrototype","arrayIterator","toLength","ceil","trunc","$default","objectKeys","getOwnPropertySymbolsModule","propertyIsEnumerableModule","IndexedObject","$assign","A","B","symbol","forEach","chr","T","argumentsLength","getOwnPropertySymbols","S","activeXDocument","definePropertiesModule","enumBugKeys","html","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","close","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","display","contentWindow","open","Properties","V8_PROTOTYPE_DEFINE_BUG","defineProperties","props","IE8_DOM_DEFINE","toPropertyKey","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","Attributes","current","internalObjectKeys","getOwnPropertyNames","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","names","$propertyIsEnumerable","NASHORN_BUG","uncurryThisAccessor","aPossiblePrototype","setter","CORRECT_SETTER","__proto__","pref","getOwnPropertyNamesModule","Target","Source","TAG","SET_METHOD","uid","defineGlobalProperty","SHARED","mode","copyright","license","toIntegerOrInfinity","requireObjectCoercible","charAt","CONVERT_TO_STRING","second","codeAt","V8_VERSION","integer","number","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","id","postfix","random","NATIVE_SYMBOL","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","copyConstructorProperties","proxyAccessor","inheritIfRequired","normalizeStringArgument","installErrorCause","installErrorStack","FULL_NAME","wrapper","IS_AGGREGATE_ERROR","STACK_TRACE_LIMIT","OPTIONS_POSITION","ERROR_NAME","OriginalError","OriginalErrorPrototype","BaseError","WrappedError","wrapErrorConstructorWithCause","AGGREGATE_ERROR","$AggregateError","arity","init","iterate","AggregateErrorPrototype","errorsArray","addToUnscopables","InternalStateModule","defineIterator","createIterResultObject","ARRAY_ITERATOR","setInternalState","getInternalState","iterated","Arguments","WEB_ASSEMBLY","WebAssembly","exportGlobalErrorCauseWrapper","exportWebAssemblyErrorCauseWrapper","EvalError","ReferenceError","SyntaxError","URIError","CompileError","LinkError","RuntimeError","STRING_ITERATOR","point","DOMIterables","COLLECTION_NAME","Collection","CollectionPrototype","CSS","escape","cssEscape","codeUnit","firstCodeUnit","isSpecificValue","RegExp","cloneSpecificValue","getTime","deepCloneArray","clone","item","deepExtend","safeGetProperty","property","isMergeableObject","isNonNullObject","isSpecial","stringValue","isReactElement","$$typeof","REACT_ELEMENT_TYPE","for","cloneUnlessOtherwiseSpecified","deepmerge","emptyTarget","defaultArrayMerge","map","element","getKeys","getEnumerableOwnPropertySymbols","filter","propertyIsOnObject","_","mergeObject","destination","propertyIsUnsafe","getMergeFunction","customMerge","arrayMerge","sourceIsArray","deepmergeAll","reduce","prev","deepmerge_1","isFrozen","freeze","seal","fun","thisValue","Func","arrayForEach","unapply","arrayPop","pop","arrayPush","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","regExpTest","typeErrorCreate","unconstruct","thisArg","_len","_key","_len2","_key2","addToSet","transformCaseFunc","l","lcElement","newObject","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","EXPRESSIONS","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","createPolicy","suffix","ATTR_NAME","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","createDOMPurify","DOMPurify","removed","nodeType","isSupported","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","MozNamedAttrMap","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","tbody","TRUSTED_TYPES_POLICY","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","remove","_removeAttribute","attribute","getAttributeNode","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","insertBefore","createTextNode","childNodes","_createNodeIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","hook","_sanitizeElements","allowedTags","firstElementChild","_isBasicCustomElement","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","attr","forceKeepAttr","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","firstChild","nodeIterator","shadowroot","shadowrootmode","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","SubRange","low","high","overlaps","touches","add","subtract","DRange","ranges","_update_length","previous","_add","subrange","newRanges","_subtract","intersect","_intersect","numbers","subranges","ReflectOwnKeys","R","ReflectApply","receiver","NumberIsNaN","EventEmitter","once","emitter","Promise","resolve","reject","errorListener","removeListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","handler","flags","on","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","_addListener","prepend","events","existing","newListener","emit","unshift","warned","w","count","ProcessEmitWarning","warning","onceWrapper","fired","wrapFn","_onceWrap","wrapped","_listeners","unwrap","evlistener","unwrapListeners","arrayClone","listenerCount","wrapListener","removeEventListener","setMaxListeners","getMaxListeners","doError","er","context","listeners","addListener","prependListener","prependOnceListener","originalListener","shift","spliceOne","off","removeAllListeners","rawListeners","eventNames","formatter","fault","EConstructor","FormattedError","displayName","eval","reference","syntax","uri","fmt","precision","argIndex","escaped","leadingZero","nextArg","slurpNumber","digits","parseFloat","toFixed","JSON","stringify","toUpperCase","vsprintf","replacements","log","printf","toStr","concatty","slicy","arrLike","boundLength","boundArgs","joiner","joiny","Empty","$SyntaxError","getEvalledConstructor","expressionSyntax","throwTypeError","ThrowTypeError","calleeThrows","gOPDthrows","hasSymbols","hasProto","getProto","needsEval","TypedArray","INTRINSICS","Atomics","BigInt64Array","BigUint64Array","DataView","decodeURI","encodeURI","Float32Array","Float64Array","FinalizationRegistry","Int8Array","Int16Array","Int32Array","Map","Proxy","Set","Uint8ClampedArray","Uint16Array","Uint32Array","WeakRef","WeakSet","errorProto","doEval","gen","LEGACY_ALIASES","$concat","$spliceApply","splice","$replace","$strSlice","$exec","rePropName","reEscapeChar","getBaseIntrinsic","alias","intrinsicName","stringToPath","quote","subString","intrinsicBaseName","intrinsicRealName","skipFurtherCaching","isOwn","part","origSymbol","hasSymbolSham","hasNativeSymbols","symObj","syms","deepFreeze","clear","delete","deepFreezeEs6","_default","Response","isMatchIgnored","ignoreMatch","escapeHTML","inherit","original","objects","emitsWrappingTags","HTMLRenderer","parseTree","classPrefix","walk","addText","openNode","className","sublanguage","span","closeNode","TokenTree","rootNode","children","closeAllNodes","builder","_walk","child","_collapse","every","TokenTreeEmitter","addKeyword","addSublanguage","toHTML","finalize","re","BACKREF_RE","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","BACKSLASH_ESCAPE","begin","relevance","APOS_STRING_MODE","illegal","contains","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","modeOptions","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","CSS_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","MODES","MATCH_NOTHING_RE","RE_STARTERS_RE","SHEBANG","opts","beginShebang","binary","resp","END_SAME_AS_BEGIN","_beginMatch","skipIfhasPrecedingDot","response","beginKeywords","__beforeBegin","keywords","compileIllegal","_parent","either","compileMatch","compileRelevance","COMMON_KEYWORDS","DEFAULT_KEYWORD_CLASSNAME","compileKeywords","rawKeywords","caseInsensitive","compiledKeywords","compileList","keywordList","keyword","pair","scoreForKeyword","providedScore","commonKeyword","compileLanguage","language","plugins","langRe","case_insensitive","MultiRegex","matchIndexes","regexes","matchAt","addRule","countMatchGroups","compile","terminators","matcherRe","regexps","separator","numCaptures","regex","substring","lastIndex","s","findIndex","matchData","ResumableMultiRegex","rules","multiRegexes","regexIndex","getMatcher","matcher","resumingScanAtSamePosition","considerAll","m2","compilerExtensions","classNameAliases","compileMode","cmode","isCompiled","keywordPattern","$pattern","lexemes","keywordPatternRe","beginRe","endSameAsBegin","endsWithParent","endRe","terminatorEnd","illegalRe","expandOrCloneMode","variants","cachedVariants","variant","dependencyOnParent","starts","buildModeRegex","mm","term","rule","BuildVuePlugin","hljs","Component","detectedLanguage","unknownLanguage","computed","highlighted","autoDetect","getLanguage","highlightAuto","highlight","ignoreIllegals","hasValueOrEmptyAttribute","autodetect","render","class","domProps","VuePlugin","install","Vue","component","mergeHTMLPlugin","originalStream","nodeStream","resultNode","mergeStreams","processed","nodeStack","selectStream","event","attributeString","stream","reverse","_nodeStream","nextSibling","nodeValue","seenDeprecations","deprecated","escape$1","inherit$1","NO_MATCH","languages","aliases","SAFE_MODE","fixMarkupRe","LANGUAGE_NOT_FOUND","PLAINTEXT_LANGUAGE","disableAutodetect","noHighlightRe","languageDetectRe","tabReplace","useBR","__emitter","shouldNotHighlight","languageName","codeOrlanguageName","optionsOrCode","continuation","fire","_highlight","codeToHighlight","keywordData","matchText","processBuffer","subLanguage","processSubLanguage","modeBuffer","continuations","processKeywords","keywordRelevance","startsWith","cssClass","startNewMode","endOfMode","matchPlusRemainder","matched","lexeme","endsParent","doIgnore","resumeScanAtSamePosition","doBeginMatch","newMode","beforeCallbacks","cb","skip","excludeBegin","returnBegin","doEndMatch","endMode","origin","returnEnd","excludeEnd","lastMatch","processLexeme","textBeforeMatch","badRule","iterations","md","processContinuations","processedCount","illegalBy","sofar","errorRaised","languageSubset","plaintext","justTextHighlightResult","results","autoDetection","sorted","sort","supersetOf","best","secondBest","second_best","brPlugin","TAB_REPLACE_RE","tabReplacePlugin","highlightElement","blockLanguage","block","find","_class","updateClassName","currentLang","resultLang","classList","relavance","initHighlighting","called","querySelectorAll","wantsHighlight","highlightAll","readyState","registerAliases","aliasList","lang","plugin","boot","fixMarkup","deprecateFixMarkup","highlightBlock","deprecateHighlightBlock","configure","userOptions","initHighlightingOnLoad","registerLanguage","languageDefinition","error$1","rawDefinition","unregisterLanguage","listLanguages","requireLanguage","addPlugin","upgradePluginAPI","vuePlugin","debugMode","safeMode","versionString","HLJS","bash","VAR","BRACED_VAR","SUBST","HERE_DOC","QUOTE_STRING","ARITHMETIC","KNOWN_SHEBANG","FUNCTION","literal","built_in","http","VERSION","HEADER","HEADERS_AND_BODY","KEYWORDS","LITERALS","BUILT_INS","lookahead","javascript","IDENT_RE$1","FRAGMENT","XML_TAG","isTrulyOpeningTag","afterMatchIndex","nextChar","after","hasClosingTag","KEYWORDS$1","decimalDigits","frac","decimalInteger","NUMBER","HTML_TEMPLATE","CSS_TEMPLATE","TEMPLATE_STRING","SUBST_INTERNALS","SUBST_AND_COMMENTS","PARAMS_CONTAINS","PARAMS","label","json","ALLOWED_COMMENTS","TYPES","VALUE_CONTAINER","OBJECT","ARRAY","powershell","BACKTICK_ESCAPE","APOS_STRING","PS_COMMENT","CMDLETS","PS_CLASS","PS_FUNCTION","PS_USING","PS_ARGUMENTS","PS_METHODS","GENTLEMANS_SET","PS_TYPE","TAG_NAME_RE","optional","XML_ENTITIES","XML_META_KEYWORDS","XML_META_PAR_KEYWORDS","APOS_META_STRING_MODE","QUOTE_META_STRING_MODE","TAG_INTERNALS","yaml","URI_CHARACTERS","STRING","CONTAINER_STRING","TIMESTAMP","VALUE_MODES","reactIs","REACT_STATICS","childContextTypes","contextType","contextTypes","defaultProps","getDefaultProps","getDerivedStateFromError","getDerivedStateFromProps","mixins","propTypes","KNOWN_STATICS","caller","MEMO_STATICS","TYPE_STATICS","getStatics","isMemo","ForwardRef","Memo","objectPrototype","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","inheritedComponent","targetStatics","sourceStatics","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","NaN","rt","LN2","SLICE$0","createClass","ctor","superClass","isIterable","Seq","KeyedIterable","isKeyed","KeyedSeq","IndexedIterable","isIndexed","IndexedSeq","SetIterable","isAssociative","SetSeq","maybeIterable","IS_ITERABLE_SENTINEL","maybeKeyed","IS_KEYED_SENTINEL","maybeIndexed","IS_INDEXED_SENTINEL","maybeAssociative","isOrdered","maybeOrdered","IS_ORDERED_SENTINEL","Keyed","Indexed","DELETE","SHIFT","SIZE","MASK","NOT_SET","CHANGE_LENGTH","DID_ALTER","MakeRef","ref","SetRef","OwnerID","arrCopy","newArr","ii","ensureSize","iter","__iterate","returnTrue","wrapIndex","uint32Index","wholeSlice","resolveBegin","resolveIndex","resolveEnd","defaultIndex","ITERATE_KEYS","ITERATE_VALUES","ITERATE_ENTRIES","REAL_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","ITERATOR_SYMBOL","Iterator","iteratorValue","k","v","iteratorResult","iteratorDone","hasIterator","getIteratorFn","isIterator","maybeIterator","iteratorFn","isArrayLike","emptySequence","toSeq","seqFromValue","toKeyedSeq","fromEntrySeq","keyedSeqFromValue","entrySeq","toIndexedSeq","indexedSeqFromValue","toSetSeq","toSource","of","cacheResult","_cache","__iterateUncached","toArray","seqIterate","__iterator","seqIterator","isSeq","EMPTY_SEQ","EMPTY_REPEAT","EMPTY_RANGE","IS_SEQ_SENTINEL","ArraySeq","_array","ObjectSeq","_object","_keys","IterableSeq","_iterable","IteratorSeq","_iterator","_iteratorCache","maybeSeq","seq","maybeIndexedSeqFromValue","useKeys","cache","maxIndex","entry","__iteratorUncached","fromJS","converter","fromJSWith","fromJSDefault","parentJSON","isPlainObj","toList","toMap","is","valueA","valueB","deepEqual","__hash","notAssociative","flipped","allEqual","bSize","Repeat","times","_value","invariant","Range","_start","_end","_step","KeyedCollection","IndexedCollection","SetCollection","notSetValue","searchValue","this$0","other","possibleIndex","offsetValue","imul","smi","i32","hash","o","h","STRING_HASH_CACHE_MIN_STRLEN","cachedHashString","hashString","hashCode","hashJSObj","stringHashCache","STRING_HASH_CACHE_SIZE","STRING_HASH_CACHE_MAX_SIZE","usingWeakMap","weakMap","UID_HASH_KEY","canDefineProperty","getIENodeHash","objHashUID","isExtensible","uniqueID","assertNotInfinite","emptyMap","isMap","withMutations","maybeMap","IS_MAP_SENTINEL","keyValues","_root","updateMap","setIn","keyPath","updateIn","deleteIn","update","updater","updatedValue","updateInDeepMap","forceIterator","__ownerID","__altered","merge","mergeIntoMapWith","mergeWith","merger","mergeIn","iters","mergeDeep","deepMerger","mergeDeepWith","deepMergerWith","mergeDeepIn","comparator","OrderedMap","sortFactory","sortBy","mapper","mutable","asMutable","wasAltered","__ensureOwner","asImmutable","MapIterator","ownerID","makeMap","EMPTY_MAP","MapPrototype","ArrayMapNode","BitmapIndexedNode","nodes","HashArrayMapNode","HashCollisionNode","keyHash","ValueNode","_type","_reverse","_stack","mapIteratorFrame","mapIteratorValue","__prev","newRoot","newSize","didChangeSize","didAlter","updateNode","isLeafNode","mergeIntoNode","newNode","idx1","idx2","createNodes","packNodes","excluding","packedII","packedNodes","bit","expandNodes","including","expandedNodes","iterables","mergeIntoCollectionWith","nextValue","collection","mergeIntoMap","keyPathIter","isNotSet","existingValue","newValue","nextExisting","nextUpdated","popCount","idx","canEdit","newArray","spliceIn","newLen","spliceOut","removeIn","exists","MAX_ARRAY_MAP_SIZE","isEditable","newEntries","keyHashFrag","MAX_BITMAP_INDEXED_SIZE","newBitmap","newNodes","newCount","MIN_HASH_ARRAY_MAP_SIZE","keyMatch","subNode","List","empty","emptyList","isList","makeList","VNode","setSize","maybeList","IS_LIST_SENTINEL","listNodeFor","_origin","updateList","insert","_capacity","_level","_tail","oldSize","setListBounds","mergeIntoListWith","iterateList","DONE","ListPrototype","removeBefore","level","originIndex","newChild","removingFirst","oldChild","editable","editableVNode","removeAfter","sizeIndex","EMPTY_LIST","EMPTY_ORDERED_MAP","left","right","tailPos","getTailOffset","tail","iterateNodeOrLeaf","iterateLeaf","iterateNode","to","capacity","newTail","updateVNode","nodeHas","lowerNode","newLowerNode","rawIndex","owner","oldOrigin","oldCapacity","newOrigin","newCapacity","newLevel","offsetShift","oldTailOffset","newTailOffset","oldTail","beginIndex","maxSize","emptyOrderedMap","isOrderedMap","maybeOrderedMap","makeOrderedMap","omap","_map","_list","updateOrderedMap","newMap","newList","flip","ToKeyedSequence","indexed","_iter","_useKeys","ToIndexedSequence","ToSetSequence","FromEntriesSequence","flipFactory","flipSequence","makeSequence","reversedSequence","cacheResultThrough","mapFactory","mappedSequence","reverseFactory","filterFactory","predicate","filterSequence","countByFactory","grouper","groups","groupByFactory","isKeyedIter","coerce","iterableClass","reify","sliceFactory","originalSize","resolvedBegin","resolvedEnd","sliceSize","resolvedSize","sliceSeq","skipped","isSkipping","takeWhileFactory","takeSequence","iterating","skipWhileFactory","skipSequence","skipping","concatFactory","isKeyedIterable","singleton","concatSeq","flatten","sum","flattenFactory","depth","flatSequence","flatDeep","currentDepth","flatMapFactory","interposeFactory","interposedSequence","defaultComparator","maxFactory","maxCompare","comp","zipWithFactory","keyIter","zipper","zipSequence","iterators","isDone","steps","some","validateEntry","resolveSize","Record","defaultValues","hasInitialized","RecordType","setProps","RecordTypePrototype","_name","_defaultValues","RecordPrototype","valueSeq","indexedIterable","recordName","defaultVal","_empty","makeRecord","likeRecord","record","setProp","emptySet","isSet","maybeSet","IS_SET_SENTINEL","fromKeys","keySeq","updateSet","union","originalSet","OrderedSet","__make","EMPTY_SET","SetPrototype","__empty","makeSet","emptyOrderedSet","isOrderedSet","maybeOrderedSet","EMPTY_ORDERED_SET","OrderedSetPrototype","makeOrderedSet","Stack","emptyStack","isStack","unshiftAll","maybeStack","IS_STACK_SENTINEL","head","_head","peek","makeStack","pushAll","EMPTY_STACK","StackPrototype","mixin","keyCopier","toJS","__toJS","toOrderedMap","toOrderedSet","toSet","toStack","__toStringMapper","returnValue","findEntry","sideEffect","joined","isFirst","reducer","initialReduction","reduction","useFirst","reduceRight","reversed","not","butLast","isEmpty","countBy","entriesSequence","entryMapper","filterNot","findKey","findLast","findLastEntry","findLastKey","flatMap","searchKey","getIn","searchKeyPath","nested","groupBy","hasIn","isSubset","isSuperset","keyOf","keyMapper","lastKeyOf","maxBy","neg","defaultNegComparator","minBy","rest","amount","skipLast","skipWhile","skipUntil","take","takeLast","takeWhile","takeUntil","hashIterable","quoteString","chain","mapEntries","mapKeys","KeyedIterablePrototype","defaultZipper","ordered","keyed","murmurHashOfSize","hashMerge","removeNum","numArgs","spliced","findLastIndex","interpose","interleave","zipped","interleaved","zip","zipWith","inherits","superCtor","super_","TempCtor","filename","mime","bom","blob","Blob","msSaveBlob","blobURL","URL","createObjectURL","webkitURL","tempLink","href","download","click","setTimeout","revokeObjectURL","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","freeSelf","objectToString","nativeMax","nativeMin","now","toNumber","isObjectLike","isBinary","debounce","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","remainingWait","debounced","isInvoking","leadingEdge","cancel","clearTimeout","flush","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","baseCreate","baseLodash","LazyWrapper","__wrapped__","__actions__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","LodashWrapper","chainAll","__chain__","__index__","__values__","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","arrayEach","iteratee","arrayFilter","resIndex","baseIndexOf","arrayIncludes","baseTimes","isArguments","isIndex","isTypedArray","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","arrayMap","arrayReduce","accumulator","initAccum","arraySome","asciiToArray","reAsciiWord","asciiWords","baseAssignValue","eq","assignMergeValue","assignValue","objValue","assocIndexOf","copyObject","baseAssign","keysIn","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","customizer","isDeep","isFlat","isFull","isFunc","stacked","subValue","objectCreate","baseForOwn","baseEach","createBaseEach","baseFindIndex","fromRight","isFlattenable","baseFlatten","isStrict","baseFor","createBaseFor","castPath","toKey","baseGet","baseGetAllKeys","keysFunc","symbolsFunc","getRawTag","symToStringTag","toStringTag","baseGetTag","baseHasIn","baseIsNaN","strictIndexOf","baseIsArguments","baseIsEqualDeep","baseIsEqual","equalArrays","equalByTag","equalObjects","arrayTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsMap","baseIsMatch","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","reIsHostCtor","funcProto","objectProto","funcToString","reIsNative","baseIsNative","baseIsSet","isLength","typedArrayTags","baseIsTypedArray","baseMatches","baseMatchesProperty","identity","baseIteratee","isPrototype","nativeKeys","baseKeys","nativeKeysIn","baseKeysIn","isProto","getMatchData","matchesStrictComparable","isKey","isStrictComparable","baseMergeDeep","safeGet","baseMerge","srcIndex","cloneTypedArray","isArrayLikeObject","isPlainObject","toPlainObject","mergeFunc","isCommon","isTyped","baseProperty","basePropertyDeep","basePropertyOf","baseReduce","eachFunc","overRest","setToString","baseRest","baseSet","metaMap","baseSetData","constant","baseSetToString","baseSlice","baseSome","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","baseTrim","baseUnary","baseUnset","baseZipObject","assignFunc","valsLength","cacheHas","castSlice","cloneArrayBuffer","arrayBuffer","freeExports","freeModule","cloneDataView","dataView","reFlags","cloneRegExp","regexp","symbolValueOf","cloneSymbol","typedArray","composeArgs","partials","holders","isCurried","argsIndex","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","getSymbols","getSymbolsIn","coreJsData","countHolders","placeholder","isIterateeCall","createAssigner","assigner","sources","guard","createCtor","createBind","isBind","Ctor","hasUnicode","stringToArray","createCaseFirst","methodName","strSymbols","deburr","words","reApos","createCompounder","callback","thisBinding","createHybrid","createRecurry","getHolder","replaceHolders","createCurry","createFind","findIndexFunc","reorder","partialsRight","holdersRight","argPos","ary","isAry","isBindKey","isFlip","holdersCount","newHolders","createPartial","isLaziable","setWrapToString","wrapFunc","isCurry","newData","getData","mergeData","toInteger","createWrap","customOmitClone","deburrLetter","isPartial","othLength","arrStacked","othStacked","seen","arrValue","othValue","compared","othIndex","mapToArray","setToArray","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","flatRest","noop","realNames","getFuncName","otherFunc","isKeyable","getMapData","getValue","getPrototype","overArg","nativeObjectToString","unmasked","stubArray","nativeGetSymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ctorString","reWrapDetails","reSplitDetails","getWrapDetails","hasPath","hasFunc","reHasUnicode","reHasUnicodeWord","hasUnicodeWord","nativeCreate","reWrapComment","insertWrapDetails","details","spreadableSymbol","isConcatSpreadable","reIsUint","reIsDeepProp","reIsPlainProp","lodash","funcName","maskSrcKey","memoize","memoizeCapped","PLACEHOLDER","WRAP_ARY_FLAG","srcBitmask","newBitmask","isCombo","freeProcess","nodeUtil","types","require","binding","transform","otherArgs","indexes","oldArray","shortOut","updateWrapDetails","nativeNow","lastCalled","stamp","pairs","LARGE_ARRAY_SIZE","unicodeToArray","reWhitespace","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsModifier","rsEmoji","reUnicodeWord","unicodeWords","wrapFlags","wrapperClone","capitalize","camelCase","word","upperFirst","curry","timeWaiting","reLatin","reComboMark","mapping","fallbackHolder","baseAry","cloneArray","wrapImmutable","cloner","baseConvert","util","isLib","isObj","config","cap","fixed","immutable","rearg","defaultHolder","forceCurry","forceFixed","forceRearg","pristine","runInContext","helpers","isError","isWeakMap","toPath","each","aryMethodKeys","aryMethod","wrappers","castArray","nthArg","castCap","iterateeRearg","baseArity","iterateeAry","castFixed","skipFixed","methodSpread","flatSpread","castRearg","skipRearg","methodRearg","aryRearg","cloneByPath","createConverter","realName","aliasToReal","remap","oldOptions","newUtil","newFunc","newOptions","mutate","createCloner","aryKey","otherName","afterRearg","castCurry","convertLib","realToAlias","defaultValue","isBoolean","stubFalse","isEqual","nodeIsMap","isNull","isNumber","objectCtorString","nodeIsSet","isString","nodeIsTypedArray","memoized","Cache","negate","omit","paths","CLONE_DEEP_FLAG","INFINITY","toFinite","remainder","toLower","pattern","zipObject","settings","subset","prefix","defaultPrefix","registerAlias","Emitter","properties","toHtmlNoop","before","coerceElementMatchingCallback","extend","ArraySlice","elements","toValue","compactMap","initialValue","refract","KeyValuePair","JSONSerialiser","Namespace","elementMap","elementDetection","noDefault","useDefault","_attributeElementKeys","_attributeElementArrayKeys","use","base","load","register","NullElement","StringElement","NumberElement","BooleanElement","ArrayElement","ObjectElement","MemberElement","RefElement","LinkElement","detect","ElementClass","_elements","unregister","givenPrepend","toElement","getElementClass","fromRefract","serialiser","deserialise","toRefract","serialise","pascal","ObjectSlice","member","meta","relation","primitive","indexOrKey","getIndex","startIndex","memo","findElements","givenOptions","recursive","keyOrIndex","findByElement","findByClass","getById","_meta","_attributes","toRef","findRecursive","elementNames","elementName","append","checkElement","items","parentElements","parents","namesIndex","getMetaProperty","hasKey","setMetaProperty","_storedElement","_content","title","description","links","recursiveChildren","getMember","getKey","keyOrObject","objectKey","JSON06Serialiser","payload","serialiseObject","isEnum","enumSerialiseAttributes","enumSerialiseContent","serialiseContent","shouldSerialiseContent","refSerialiseContent","sourceMapSerialiseContent","dataStructureSerialiseContent","enumerations","samples","sample","enumeration","Null","deserialiseObject","deserialiseContent","existingSamples","existingSample","enumElement","defaultElement","shouldRefract","convertKeyToRefract","serialiseEnum","subItem","subSubItem","keyValue","propIsEnumerable","shouldUseNative","test1","test2","test3","letter","symbols","hasMap","mapSizeDescriptor","mapSize","mapForEach","hasSet","setSizeDescriptor","setForEach","weakMapHas","weakSetHas","weakRefDeref","deref","booleanValueOf","functionToString","$match","$slice","$toUpperCase","$toLowerCase","$test","$join","$arrSlice","$floor","bigIntValueOf","gOPS","symToString","hasShammedSymbols","isEnumerable","gPO","addNumericSeparator","sepRegex","int","intStr","utilInspect","inspectCustom","custom","inspectSymbol","wrapQuotes","defaultStyle","quoteChar","quoteStyle","isRegExp","inspect_","maxStringLength","customInspect","indent","numericSeparator","inspectString","bigIntStr","maxDepth","getIndent","baseIndent","noIndent","newOpts","nameOf","arrObjKeys","symString","markBoxed","isElement","HTMLElement","attrs","xs","singleLineValues","indentedJoin","mapParts","collectionOf","setParts","weakCollectionOf","isWeakSet","isWeakRef","isBigInt","ys","protoTag","stringTag","trailer","lowbyte","lineJoiner","symMap","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","runClearTimeout","marker","Item","nextTick","browser","env","argv","cwd","chdir","umask","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","getShim","isRequired","ReactPropTypes","bigint","bool","any","arrayOf","elementType","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","percentTwenties","Format","formatters","RFC1738","RFC3986","formats","utils","defaults","allowDots","allowPrototypes","allowSparse","arrayLimit","charset","charsetSentinel","comma","decoder","delimiter","ignoreQueryPrefix","interpretNumericEntities","parameterLimit","parseArrays","plainObjects","strictNullHandling","$0","numberStr","parseArrayValue","parseKeys","parseQueryStringKeys","givenKey","valuesParsed","segment","leaf","cleanRoot","parseObject","normalizeParseOptions","tempObj","parseQueryStringValues","cleanStr","skipIndex","bracketEqualsPos","encodedVal","combine","parseValues","newObj","compact","getSideChannel","arrayPrefixGenerators","brackets","indices","repeat","pushToArray","valueOrArray","toISO","toISOString","defaultFormat","addQueryPrefix","encoder","encodeValuesOnly","serializeDate","date","skipNulls","sentinel","generateArrayPrefix","commaRoundTrip","sideChannel","tmpSc","findFlag","isNonNullishPrimitive","valuesArray","valuesJoined","objKeys","adjustedPrefix","keyPrefix","valueSideChannel","normalizeStringifyOptions","arrayFormat","hexTable","arrayToObject","assignSingleSource","acc","refs","compactQueue","compacted","strWithoutPlus","unescape","defaultEncoder","mapped","mergeTarget","targetItem","querystringify","querystring","query","parser","RandExp","_setDefaults","ignoreCase","multiline","tokens","defaultRange","randInt","_gen","token","ROOT","GROUP","followedBy","notFollowedBy","remember","groupNumber","_randSelect","POSITION","SET","expandedSet","_expand","REPETITION","REFERENCE","CHAR","_randBool","_toOtherCase","RANGE","drange","otherCaseCode","_range","randexp","_randexp","sugar","MAX_BYTES","MAX_UINT32","crypto","msCrypto","getRandomValues","randomBytes","generated","oldBrowser","_typeof","CopyToClipboard","_react","_interopRequireDefault","_copyToClipboard","_excluded","__esModule","enumerableOnly","_objectSpread","_defineProperty","getOwnPropertyDescriptors","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceKeys","sourceSymbolKeys","_defineProperties","_setPrototypeOf","p","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf","_possibleConstructorReturn","_assertThisInitialized","_React$PureComponent","_inherits","subClass","_super","_this","_classCallCheck","instance","Constructor","_this$props","elem","Children","only","onClick","_createClass","protoProps","staticProps","_this$props2","cloneElement","PureComponent","DebounceInput","_lodash","persist","oldValue","minLength","setState","notify","forceNotify","onKeyDown","onBlur","debounceTimeout","doNotify","debouncedChangeFunc","isDebouncing","onChange","_debounceTimeout2","createNotifier","componentDidUpdate","prevProps","oldTimeout","stateValue","componentWillUnmount","maybeOnKeyDown","maybeOnBlur","forceNotifyByEnter","forceNotifyOnBlur","inputRef","maybeRef","aa","r","ba","ca","da","ea","fa","ha","ia","ja","ka","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","D","oa","pa","qa","na","ma","la","xlinkHref","ra","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","sa","ta","ua","wa","xa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ma","Ka","La","Na","Oa","Pa","Qa","_render","Ra","_context","_payload","_init","Sa","Ta","Va","_valueTracker","Ua","setValue","stopTracking","Wa","Xa","activeElement","Ya","defaultChecked","_wrapperState","initialChecked","Za","controlled","$a","ab","bb","eb","db","fb","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","hb","ib","jb","kb","mathml","lb","mb","nb","ob","MSApp","execUnsafeLocalFunction","pb","lastChild","qb","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","rb","sb","tb","setProperty","ub","menuitem","area","br","col","embed","hr","img","keygen","link","param","track","wbr","vb","wb","xb","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Ob","Pb","Qb","Rb","onError","Sb","Tb","Ub","Vb","Wb","Xb","Zb","alternate","return","$b","memoizedState","dehydrated","ac","cc","bc","sibling","dc","ec","fc","gc","hc","ic","jc","kc","lc","mc","nc","oc","pc","qc","rc","blockedOn","domEventName","eventSystemFlags","nativeEvent","targetContainers","sc","pointerId","tc","vc","wc","lanePriority","unstable_runWithPriority","hydrate","containerInfo","xc","yc","zc","Ac","Bc","unstable_scheduleCallback","unstable_NormalPriority","Cc","Dc","Ec","animationend","animationiteration","animationstart","transitionend","Fc","Gc","Hc","animation","transition","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","unstable_now","Rc","Uc","pendingLanes","expiredLanes","suspendedLanes","pingedLanes","Vc","entangledLanes","entanglements","Wc","Xc","Yc","Zc","$c","eventTimes","clz32","ad","bd","cd","dd","unstable_UserBlockingPriority","ed","fd","gd","hd","uc","jd","kd","ld","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","isPropagationStopped","cancelBubble","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","locale","which","Rd","Td","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","datetime","email","month","password","search","tel","week","me","ne","oe","pe","qe","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ge","Ie","Je","Ke","Le","Me","compareDocumentPosition","Ne","HTMLIFrameElement","Oe","contentEditable","Pe","Qe","Re","Se","Te","Ue","selectionStart","selectionEnd","anchorNode","defaultView","anchorOffset","focusNode","focusOffset","Ve","We","Xe","Ye","Ze","Yb","G","$e","af","bf","cf","df","capture","passive","Nb","z","u","q","t","ef","ff","gf","hf","J","K","Q","L","je","ke","char","jf","kf","lf","mf","autoFocus","nf","__html","pf","qf","rf","sf","previousSibling","tf","vf","wf","xf","yf","zf","Af","Bf","H","I","Cf","M","N","Df","Ef","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Ff","Gf","Hf","If","getChildContext","Jf","__reactInternalMemoizedMergedChildContext","Kf","Lf","Mf","Nf","Of","Pf","unstable_cancelCallback","Qf","unstable_shouldYield","Rf","unstable_requestPaint","Sf","Tf","unstable_getCurrentPriorityLevel","Uf","unstable_ImmediatePriority","Vf","Wf","Xf","unstable_LowPriority","Yf","unstable_IdlePriority","Zf","$f","ag","bg","cg","dg","eg","fg","gg","hg","ig","jg","kg","ReactCurrentBatchConfig","lg","mg","ng","og","pg","qg","rg","_currentValue","sg","childLanes","tg","dependencies","firstContext","lanes","ug","vg","observedBits","responders","wg","xg","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","pending","effects","yg","zg","eventTime","lane","Ag","Bg","Cg","Dg","Eg","Fg","Gg","Kg","isMounted","_reactInternals","enqueueSetState","Hg","Ig","Jg","enqueueReplaceState","enqueueForceUpdate","Lg","shouldComponentUpdate","isPureReactComponent","Mg","Ng","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Og","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","Pg","Qg","_owner","_stringRef","Rg","Sg","lastEffect","nextEffect","firstEffect","Tg","Ug","Vg","Wg","Xg","Yg","Zg","$g","ah","bh","ch","dh","eh","fh","gh","hh","ih","memoizedProps","revealOrder","jh","kh","lh","mh","nh","oh","pendingProps","ph","qh","rh","sh","th","uh","_workInProgressVersionPrimary","vh","ReactCurrentDispatcher","wh","xh","yh","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","baseQueue","Ih","Jh","Kh","lastRenderedReducer","action","eagerReducer","eagerState","lastRenderedState","dispatch","Lh","Mh","_getVersion","_source","mutableReadLanes","Nh","U","useState","getSnapshot","subscribe","useEffect","setSnapshot","Oh","Ph","Qh","Rh","destroy","deps","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","di","readContext","useCallback","useContext","useImperativeHandle","useLayoutEffect","useMemo","useReducer","useRef","useDebugValue","useDeferredValue","useTransition","useMutableSource","useOpaqueIdentifier","unstable_isNewReconciler","uf","ei","ReactCurrentOwner","fi","gi","ji","ki","li","mi","baseLanes","ni","oi","pi","UNSAFE_componentWillUpdate","componentWillUpdate","qi","ri","pendingContext","Bi","Ci","Di","Ei","si","retryLane","ti","fallback","unstable_avoidThisFallback","ui","unstable_expectedLoadTime","vi","wi","xi","yi","zi","isBackwards","rendering","renderingStartTime","tailMode","Ai","Fi","Gi","wasMultiple","multiple","onclick","createElementNS","Hi","Ii","W","Ji","Ki","Li","Mi","Ni","Oi","Pi","Qi","Ri","Si","componentDidCatch","Ti","componentStack","Ui","Vi","Wi","Xi","__reactInternalSnapshotBeforeUpdate","Yi","Zi","$i","focus","aj","bj","onCommitFiberUnmount","cj","dj","ej","fj","gj","hj","_reactRootContainer","ij","jj","kj","lj","then","mj","nj","oj","pj","X","Y","qj","rj","sj","tj","uj","vj","wj","ck","Z","xj","yj","zj","Aj","Bj","Cj","Dj","Ej","Fj","Gj","Hj","Ij","Jj","Sc","Kj","Lj","Mj","callbackNode","expirationTimes","callbackPriority","Tc","Nj","Oj","Pj","Qj","Rj","Sj","Tj","finishedWork","finishedLanes","Uj","timeoutHandle","Wj","Xj","pingCache","Yj","Zj","va","ak","bk","dk","rangeCount","focusedElem","selectionRange","ek","setStart","setEnd","scrollLeft","scrollTop","onCommitFiberRoot","fk","gk","ik","isReactComponent","pendingChildren","jk","mutableSourceEagerHydrationData","lk","mk","nk","ok","qk","hydrationOptions","mutableSources","_internalRoot","rk","tk","sk","uk","kk","hk","_calculateChangedBits","unstable_observedBits","unmount","form","Vj","vk","Events","wk","findFiberByHostInstance","bundleType","rendererPackageName","xk","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","pk","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","__REACT_DEVTOOLS_GLOBAL_HOOK__","yk","isDisabled","supportsFiber","inject","createPortal","findDOMNode","flushSync","unmountComponentAtNode","unstable_batchedUpdates","unstable_createPortal","unstable_renderSubtreeIntoContainer","checkDCE","ImmutablePropTypes","Immutable","ANONYMOUS","productionTypeChecker","getProductionTypeChecker","getPropType","propValue","propType","createChainableTypeChecker","validate","checkType","chainedCheckType","createIterableSubclassTypeChecker","subclassName","validator","createImmutableTypeChecker","immutableClassName","immutableClassTypeValidator","listOf","mapOf","orderedMapOf","setOf","orderedSetOf","stackOf","iterableOf","recordOf","mapContains","orderedMapContains","orderedMap","orderedSet","ContextConsumer","ContextProvider","Fragment","Lazy","Portal","Profiler","StrictMode","Suspense","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isForwardRef","isFragment","isLazy","isPortal","isProfiler","isStrictMode","isSuspense","isValidElementType","typeOf","forceUpdate","__self","__source","_status","_result","IsSomeRendererActing","createContext","_currentValue2","_threadCount","Provider","Consumer","createFactory","createRef","forwardRef","isValidElement","lazy","codes","createErrorType","_Base","arg1","arg2","arg3","_inheritsLoose","expected","thing","determiner","endsWith","this_len","Duplex","Readable","Writable","allowHalfOpen","readable","onend","_writableState","ended","onEndNT","highWaterMark","getBuffer","_readableState","destroyed","PassThrough","Transform","_transform","chunk","ReadableState","EElistenerCount","Stream","OurUint8Array","debugUtil","debuglog","StringDecoder","createReadableStreamAsyncIterator","BufferList","destroyImpl","getHighWaterMark","_require$codes","ERR_STREAM_PUSH_AFTER_EOF","ERR_METHOD_NOT_IMPLEMENTED","ERR_STREAM_UNSHIFT_AFTER_END_EVENT","errorOrDestroy","kProxyEvents","isDuplex","objectMode","readableObjectMode","pipes","pipesCount","flowing","endEmitted","reading","sync","needReadable","emittedReadable","readableListening","resumeScheduled","paused","emitClose","autoDestroy","defaultEncoding","awaitDrain","readingMore","_read","_destroy","readableAddChunk","addToFront","skipChunkCheck","onEofChunk","emitReadable","emitReadable_","chunkInvalid","_isUint8Array","_uint8ArrayToBuffer","addChunk","maybeReadMore","_undestroy","undestroy","isPaused","setEncoding","MAX_HWM","howMuchToRead","computeNewHighWaterMark","flow","maybeReadMore_","updateReadableListening","resume","nReadingNextTick","resume_","fromList","consume","endReadable","endReadableNT","wState","finished","nOrig","doRead","pipe","dest","pipeOpts","endFn","stdout","stderr","unpipe","onunpipe","unpipeInfo","hasUnpiped","cleanup","onclose","onfinish","ondrain","onerror","ondata","cleanedUp","needDrain","pipeOnDrain","pipeOnDrainFunctionResult","pause","dests","ev","methodWrap","methodWrapReturnFunction","asyncIterator","_fromList","ERR_MULTIPLE_CALLBACK","ERR_TRANSFORM_ALREADY_TRANSFORMING","ERR_TRANSFORM_WITH_LENGTH_0","afterTransform","ts","_transformState","transforming","writecb","writechunk","rs","needTransform","writeencoding","_flush","prefinish","_write","err2","CorkedRequest","finish","onCorkedFinish","corkReq","pendingcb","corkedRequestsFree","WritableState","internalUtil","deprecate","realHasInstance","ERR_STREAM_CANNOT_PIPE","ERR_STREAM_DESTROYED","ERR_STREAM_NULL_VALUES","ERR_STREAM_WRITE_AFTER_END","ERR_UNKNOWN_ENCODING","nop","writableObjectMode","finalCalled","ending","noDecode","decodeStrings","writing","corked","bufferProcessing","onwrite","onwriteStateUpdate","writelen","onwriteError","finishMaybe","errorEmitted","needFinish","bufferedRequest","clearBuffer","afterWrite","lastBufferedRequest","prefinished","bufferedRequestCount","writev","_writev","final","_final","doWrite","onwriteDrain","holder","allBuffers","isBuf","callFinal","need","rState","writableStateBufferGetter","hasInstance","writeAfterEnd","validChunk","writeOrBuffer","newChunk","decodeChunk","cork","uncork","setDefaultEncoding","endWritable","_Object$setPrototypeO","_toPropertyKey","_toPrimitive","hint","prim","kLastResolve","kLastReject","kError","kEnded","kLastPromise","kHandlePromise","kStream","createIterResult","readAndResolve","onReadable","AsyncIteratorPrototype","ReadableStreamAsyncIteratorPrototype","promise","lastPromise","wrapForNext","_return","_this2","_Object$create","hasStrings","_getString","_getBuffer","emitErrorAndCloseNT","emitErrorNT","emitCloseNT","readableDestroyed","writableDestroyed","ERR_STREAM_PREMATURE_CLOSE","eos","onlegacyfinish","writableEnded","readableEnded","onrequest","req","isRequest","setHeader","abort","ERR_MISSING_ARGS","pipeline","streams","popCallback","destroys","destroyer","closed","ERR_INVALID_OPT_VALUE","duplexKey","hwm","highWaterMarkFrom","_immutable2","_utilities","reducers","getDefaultState","reducerKeys","inputState","temporaryState","reducerName","nextDomainState","validateNextState","_combineReducers3","_getStateName2","reducerNames","stateName","isImmutable","unexpectedStatePropertyNames","getUnexpectedInvocationParameterMessage","getStateName","_getStateName3","_getUnexpectedInvocationParameterMessage3","_validateNextState3","nextState","required","port","protocol","sets","positions","regexpStr","lastGroup","groupStack","repeatErr","strToChars","wordBoundary","nonWordBoundary","notWords","ints","notInts","whitespace","notWhitespace","classTokens","tokenizeClass","anyChar","group","INTS","WORDS","WHITESPACE","SLSH","lbs","a16","b16","c8","dctrl","eslsh","copyProps","SafeBuffer","performance","MessageChannel","unstable_forceFrameRate","cancelAnimationFrame","requestAnimationFrame","port2","port1","onmessage","postMessage","sortIndex","startTime","expirationTime","priorityLevel","unstable_Profiling","unstable_continueExecution","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","delay","unstable_wrapCallback","NonError","_prepareSuperMessage","commonProperties","isCalled","destroyCircular","to_","forceEnumerable","serializeError","POSITIVE_INFINITY","deserializeError","newError","blockSize","finalSize","_block","_finalSize","_blockSize","accum","assigned","_update","digest","rem","bits","lowBits","highBits","_hash","SHA","algorithm","Algorithm","sha","sha1","sha224","sha256","sha384","sha512","Sha","_w","rotl30","ft","_a","_b","_c","_d","_e","Sha1","rotl5","Sha256","Sha224","_f","_g","_h","maj","sigma0","sigma1","gamma0","T1","T2","SHA512","Sha384","_ah","_bh","_ch","_dh","_eh","_fh","_gh","_hh","_al","_bl","_cl","_dl","_el","_fl","_gl","_hl","writeInt64BE","Sha512","xl","Gamma0","Gamma0l","Gamma1","Gamma1l","getCarry","al","bl","cl","dl","fl","gl","hl","gamma0l","gamma1","gamma1l","Wi7h","Wi7l","Wi16h","Wi16l","Wil","Wih","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Kih","Kil","chh","chl","t1l","t1h","t2l","t2h","ShortUniqueId","__defProp","__getOwnPropDesc","__getOwnPropNames","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","__defNormalProp","__spreadValues","__publicField","src_exports","__export","DEFAULT_OPTIONS","DEFAULT_UUID_LENGTH","dictionary","shuffle","counter","_ShortUniqueId","argOptions","_digit_first_ascii","_digit_last_ascii","lowerCase","_alpha_lower_first_ascii","_alpha_lower_last_ascii","upperCase","_alpha_upper_first_ascii","_alpha_upper_last_ascii","decDigits","alphaDigits","_hex_last_ascii","_number_dict_ranges","_alpha_dict_ranges","_alpha_lower_dict_ranges","_alpha_upper_dict_ranges","_alphanum_dict_ranges","_alphanum_lower_dict_ranges","_alphanum_upper_dict_ranges","_hex_dict_ranges","finalArgs","finalDict","dictIndex","rangesName","_dict_ranges","rangeType","rangeTypeKey","dictRange","lowerBound","upperBound","PROBABILITY","dict","dictLength","setCounter","sequentialUUID","counterDiv","counterRem","uuidLength","randomUUID","randomPartIdx","formattedUUID","fnMap","padStart","rounds","availableUUIDs","sqrt","PI","approxMaxBeforeCollision","score","finalLength","hexStamp","idLength","rndIdx","round","suid","_m","p1","p2","setDictionary","rnd","collisionProbability","uniqueness","getVersion","parseStamp","mod","except","__copyProps","callBound","$WeakMap","$Map","$weakMapGet","$weakMapSet","$weakMapHas","$mapGet","$mapSet","$mapHas","listGetNode","curr","$wm","$m","$o","channel","assert","listGet","listHas","listSet","statics","conf","composables","stampit","EE","_isStdio","didOnEnd","normalizeEncoding","nenc","_normalizeEncoding","retried","utf16Text","utf16End","fillLast","utf8FillLast","base64Text","base64End","simpleWrite","simpleEnd","lastNeed","lastTotal","lastChar","utf8CheckByte","byte","utf8CheckExtraBytes","utf8End","utf8Text","total","utf8CheckIncomplete","active","getRangeAt","blur","toS","alive","walker","node_","modifiers","keepGoing","isRoot","circular","stopHere","pre","post","updateState","isLeaf","notLeaf","notRoot","isLast","Traverse","traverse","ps","qs","controlOrWhitespace","CRHTLF","slashes","protocolre","windowsDriveLetter","trimLeft","address","ignore","lolcation","loc","finaldestination","Url","pathname","scheme","extractProtocol","forwardSlashes","otherSlashes","slashesCount","relative","extracted","instruction","instructions","up","host","hostname","username","auth","ins","inst","useSyncExternalStore","useSyncExternalStoreWithSelector","hasValue","localStorage","trace","isClosingTag","isSelfClosingTag","isOpeningTag","isTag","getType","indentor","textNodesOnSameLine","indicesToRemove","rawResult","lexer","xmlStr","splitOnTags","line","indentation","oneBefore","twoBefore","XML_CHARACTER_MAP","escapeForXML","indent_count","indent_spaces","create_indent","character","_elem","icount","indents","interrupt","isStringContent","get_attributes","_attr","_cdata","proceed","interrupted","instant","declaration","addXmlDeclaration","standalone","isNativeSmoothScrollEnabledOn","getComputedStyle","makeScroller","container","defaultDuration","edgeOffset","scrollTimeoutId","setScrollTimeoutId","stopScroll","getTopWithEdgeOffset","getTopOf","scrollToY","targetY","duration","onDone","toY","startY","getY","distance","loopScroll","getHeight","scrollHeight","scrollToElem","scrollIntoView","elemHeight","getBoundingClientRect","elemBottom","containerHeight","containerBottom","scrollToCenterOf","setup","newDefaultDuration","newEdgeOffset","intoView","center","moving","docElem","getDocY","scrollY","zenscroll","scrollingElement","scrollTo","innerHeight","clientHeight","offsetTop","createScroller","scrollContainer","noZensmooth","isHistorySupported","history","isScrollRestorationSupported","scrollRestoration","zenscrollY","targetElem","getElementById","diff","RE_noZensmooth","anchor","historyState","replaceState","pushState","_Object$assign","_bindInstanceProperty","_extends","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","definition","nmd","_objectSpread2","formatProdErrorMessage","$$observable","observable","randomString","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","isSubscribed","unsubscribe","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","bindActionCreator","actionCreator","compose","funcs","NEW_THROWN_ERR","NEW_THROWN_ERR_BATCH","NEW_SPEC_ERR","NEW_SPEC_ERR_BATCH","NEW_AUTH_ERR","CLEAR","CLEAR_BY","newThrownErr","newThrownErrBatch","newSpecErr","newSpecErrBatch","errArray","newAuthErr","clearBy","makeWindow","win","File","FormData","swagger2SchemaKeys","Im","getParameterSchema","parameter","isOAS3","schema","parameterContentMediaType","DEFAULT_RESPONSE_KEY","maybe","objectify","fromJSOrdered","js","objWithHashedKeys","createObjWithHashedKeys","fdObj","hashIdx","trackKeys","containsMultiple","normalizeArray","isFn","_memoize","objMap","objReduce","systemThunkMiddleware","getSystem","validateValueBySchema","requiredByParam","bypassRequiredCheck","nullable","requiredBySchema","maximum","minimum","maxLength","uniqueItems","maxItems","minItems","schemaRequiresValue","stringCheck","arrayCheck","arrayListCheck","passedAnyCheck","objectVal","propKey","errs","validatePattern","rxPattern","validateMinItems","validateMaxItems","needRemove","errorPerItem","validateUniqueItems","errorsPerIndex","validateMaxLength","validateMinLength","validateMaximum","validateMinimum","validateDateTime","validateGuid","validateString","validateBoolean","validateInteger","validateFile","btoa","sorters","operationsSorter","alpha","localeCompare","tagsSorter","buildFormData","formArr","shallowEqualKeys","braintreeSanitizeUrl","requiresValidationURL","createDeepLinkPath","escapeDeepLinkPath","getExtensions","defObj","getCommonExtensions","deeplyStripKey","keyToStrip","paramToIdentifier","returnAll","allowHashes","paramName","paramIn","generatedIdentifiers","paramToValue","paramValues","b64toB64UrlEncoded","isEmptyValue","idFn","createStoreWithMiddleware","rootReducer","initialState","middlwares","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","applyMiddleware","middlewares","_dispatch","middlewareAPI","middleware","Store","pluginsOptions","system","configs","components","rootInjects","statePlugins","boundSystem","toolbox","_getSystem","configureStore","buildSystem","getStore","rebuild","pluginSystem","combinePlugins","systemExtend","callAfterLoad","buildReducer","getRootInjects","getWrappedAndBoundActions","getWrappedAndBoundSelectors","getStateThunks","getFn","getConfigs","rebuildReducer","getComponents","_getConfigs","React","setConfigs","states","allReducers","reducerSystem","makeReducer","reducerObj","redFn","wrapWithTryCatch","combineReducers","upName","getSelectors","getActions","actions","actionName","getBoundActions","actionGroupName","wrapActions","newAction","getBoundSelectors","selectors","selectorGroupName","wrapSelectors","selector","selectorName","wrappedSelector","getStates","ori","creator","bindActionCreators","actionCreators","boundActionCreators","getMapStateToProps","getMapDispatchToProps","extras","pluginOptions","pluginLoadType","hasLoaded","calledSomething","afterLoad","wrapComponents","wrapperFn","namespaceObj","logErrors","_len3","_key3","SHOW_AUTH_POPUP","AUTHORIZE","LOGOUT","PRE_AUTHORIZE_OAUTH2","AUTHORIZE_OAUTH2","VALIDATE","CONFIGURE_AUTH","RESTORE_AUTHORIZATION","showDefinitions","authorize","authorizeWithPersistOption","authActions","persistAuthorizationIfNeeded","logout","logoutWithPersistOption","preAuthorizeImplicit","_ref3","errActions","isValid","swaggerUIRedirectOauth2","authId","authorizeOauth2WithPersistOption","authorizeOauth2","_ref4","authorizePassword","_ref5","passwordType","clientId","clientSecret","grant_type","scope","scopes","headers","setClientIdAndSecret","client_id","client_secret","Authorization","authorizeRequest","authorizeApplication","_ref6","authorizeAccessCodeWithFormParams","_ref7","redirectUrl","_ref8","codeVerifier","redirect_uri","code_verifier","authorizeAccessCodeWithBasicAuthentication","_ref9","_ref10","_ref11","parsedUrl","oas3Selectors","specSelectors","authSelectors","additionalQueryStringParams","finalServerUrl","serverEffectiveValue","selectedServer","parseUrl","fetchUrl","_headers","fetch","requestInterceptor","responseInterceptor","parseError","statusText","catch","errData","jsonResponse","error_description","jsonError","configureAuth","restoreAuthorization","_ref12","persistAuthorization","authorized","setItem","authPopup","securities","security","header","parsedAuth","NOT_FOUND","defaultEqualityCheck","defaultMemoize","equalityCheckOrOptions","providedOptions","equalityCheck","_providedOptions$equa","_providedOptions$maxS","resultEqualityCheck","createCacheKeyComparator","areArgumentsShallowlyEqual","createSingletonCache","put","getEntries","createLruCache","cacheIndex","matchingEntry","clearCache","createSelectorCreator","memoizeOptionsFromArgs","createSelector","_lastResult","_recomputations","directlyPassedOptions","memoizeOptions","resultFunc","_directlyPassedOption2","finalMemoizeOptions","getDependencies","dep","dependencyTypes","memoizedResultFunc","recomputationWrapper","dependenciesChecker","params","lastResult","recomputations","resetRecomputations","shownDefinitions","definitionsToAuthorize","definitions","securityDefinitions","getDefinitionsByNames","allowedScopes","definitionsForRequirements","allDefinitions","sec","securityScopes","definitionScopes","isAuthorized","execute","oriAction","operation","specSecurity","getItem","isApiKeyAuth","isInCookie","cookie","authorizedName","cookieName","LockAuthIcon","mapStateToProps","ownProps","getComponent","LockIcon","UnlockAuthIcon","UnlockIcon","initOAuth","preauthorizeApiKey","preauthorizeBasic","LockAuthOperationIcon","UnlockAuthOperationIcon","wrappedAuthorizeAction","wrappedLogoutAction","spec","specJson","definitionBase","isNothing","subject","repeat_1","cycle","isNegativeZero_1","isNegativeZero","NEGATIVE_INFINITY","common","sequence","formatError","exception","where","reason","column","snippet","YAMLException$1","getLine","lineStart","lineEnd","maxLineLength","maxHalfLength","makeSnippet","linesBefore","linesAfter","lineStarts","lineEnds","foundLineNo","lineNoLength","TYPE_CONSTRUCTOR_OPTIONS","YAML_NODE_KINDS","Type$1","represent","representName","multi","styleAliases","compileStyleAliases","currentType","newIndex","previousType","previousIndex","Schema$1","implicit","explicit","type$1","loadKind","compiledImplicit","compiledExplicit","compiledTypeMap","compileMap","scalar","collectType","failsafe","_null","resolveYamlNull","constructYamlNull","canonical","lowercase","uppercase","camelcase","resolveYamlBoolean","constructYamlBoolean","isOctCode","isDecCode","resolveYamlInteger","hasDigits","constructYamlInteger","sign","octal","decimal","hexadecimal","YAML_FLOAT_PATTERN","SCIENTIFIC_WITHOUT_DOT","resolveYamlFloat","constructYamlFloat","isFloat","representYamlFloat","core","YAML_DATE_REGEXP","YAML_TIMESTAMP_REGEXP","timestamp","resolveYamlTimestamp","constructYamlTimestamp","year","day","hour","minute","fraction","delta","UTC","setTime","representYamlTimestamp","resolveYamlMerge","BASE64_MAP","resolveYamlBinary","bitlen","constructYamlBinary","tailbits","representYamlBinary","_hasOwnProperty$3","_toString$2","resolveYamlOmap","pairKey","pairHasKey","constructYamlOmap","_toString$1","resolveYamlPairs","constructYamlPairs","_hasOwnProperty$2","resolveYamlSet","constructYamlSet","_hasOwnProperty$1","CONTEXT_FLOW_IN","CONTEXT_FLOW_OUT","CONTEXT_BLOCK_IN","CONTEXT_BLOCK_OUT","CHOMPING_CLIP","CHOMPING_STRIP","CHOMPING_KEEP","PATTERN_NON_PRINTABLE","PATTERN_NON_ASCII_LINE_BREAKS","PATTERN_FLOW_INDICATORS","PATTERN_TAG_HANDLE","PATTERN_TAG_URI","is_EOL","is_WHITE_SPACE","is_WS_OR_EOL","is_FLOW_INDICATOR","fromHexCode","simpleEscapeSequence","charFromCodepoint","simpleEscapeCheck","simpleEscapeMap","State$1","onWarning","legacy","implicitTypes","typeMap","lineIndent","firstTabInLine","documents","generateError","throwError","throwWarning","directiveHandlers","YAML","handleYamlDirective","major","minor","checkLineBreaks","handleTagDirective","handle","tagMap","captureSegment","checkJson","_position","_length","_character","mergeMappings","overridableKeys","quantity","storeMappingPair","keyTag","keyNode","valueNode","startLine","startLineStart","startPos","readLineBreak","skipSeparationSpace","allowComments","checkIndent","lineBreaks","testDocumentSeparator","writeFoldedLines","readBlockSequence","nodeIndent","_line","_tag","_anchor","detected","anchorMap","composeNode","readTagProperty","tagHandle","isVerbatim","isNamed","readAnchorProperty","parentIndent","nodeContext","allowToSeek","allowCompact","allowBlockStyles","allowBlockScalars","allowBlockCollections","typeIndex","typeQuantity","typeList","flowIndent","blockIndent","indentStatus","atNewLine","hasContent","readBlockMapping","following","_keyLine","_keyLineStart","_keyPos","atExplicitKey","readFlowCollection","_lineStart","_pos","terminator","isPair","isExplicitPair","isMapping","readNext","readBlockScalar","captureStart","folding","chomping","didReadContent","detectedIndent","textIndent","emptyLines","atMoreIndented","readSingleQuotedScalar","captureEnd","readDoubleQuotedScalar","hexLength","hexResult","readAlias","readPlainScalar","withinFlowCollection","hasPendingContent","_lineIndent","_kind","readDocument","directiveName","directiveArgs","documentStart","hasDirectives","loadDocuments","nullpos","loader","loadAll","loadAll$1","load$1","_toString","_hasOwnProperty","CHAR_BOM","CHAR_TAB","CHAR_LINE_FEED","CHAR_CARRIAGE_RETURN","CHAR_SPACE","CHAR_EXCLAMATION","CHAR_DOUBLE_QUOTE","CHAR_SHARP","CHAR_PERCENT","CHAR_AMPERSAND","CHAR_SINGLE_QUOTE","CHAR_ASTERISK","CHAR_COMMA","CHAR_MINUS","CHAR_COLON","CHAR_EQUALS","CHAR_GREATER_THAN","CHAR_QUESTION","CHAR_COMMERCIAL_AT","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","CHAR_GRAVE_ACCENT","CHAR_LEFT_CURLY_BRACKET","CHAR_VERTICAL_LINE","CHAR_RIGHT_CURLY_BRACKET","ESCAPE_SEQUENCES","DEPRECATED_BOOLEANS_SYNTAX","DEPRECATED_BASE60_SYNTAX","encodeHex","QUOTING_TYPE_SINGLE","QUOTING_TYPE_DOUBLE","State","noArrayIndent","skipInvalid","flowLevel","styleMap","compileStyleMap","sortKeys","lineWidth","noRefs","noCompatMode","condenseFlow","quotingType","forceQuotes","replacer","explicitTypes","duplicates","usedDuplicates","indentString","spaces","ind","generateNextLine","isWhitespace","isPrintable","isNsCharOrWhitespace","isPlainSafe","inblock","cIsNsCharOrWhitespace","cIsNsChar","codePointAt","needIndentIndicator","STYLE_PLAIN","STYLE_SINGLE","STYLE_LITERAL","STYLE_FOLDED","STYLE_DOUBLE","chooseScalarStyle","singleLineOnly","indentPerLevel","testAmbiguousType","prevChar","hasLineBreak","hasFoldableLine","shouldTrackWidth","previousLineBreak","plain","isPlainSafeFirst","isPlainSafeLast","writeScalar","iskey","dump","testAmbiguity","testImplicitResolving","blockHeader","dropEndingNewline","foldString","moreIndented","lineRe","nextLF","foldLine","prevMoreIndented","escapeString","escapeSeq","indentIndicator","breakRe","writeBlockSequence","writeNode","detectType","isblockseq","tagStr","duplicateIndex","duplicate","objectOrArray","writeBlockMapping","objectValue","explicitPair","pairBuffer","objectKeyList","writeFlowMapping","writeFlowSequence","getDuplicateReferences","duplicatesIndexes","inspectNode","dump_1","dump$1","renamed","Type","Schema","FAILSAFE_SCHEMA","JSON_SCHEMA","CORE_SCHEMA","DEFAULT_SCHEMA","YAMLException","float","null","safeLoad","safeLoadAll","safeDump","parseYamlConfig","UPDATE_CONFIGS","TOGGLE_CONFIGS","configName","configValue","toggle","downloadConfig","getConfigByUrl","specActions","status","updateLoadingStatus","updateUrl","oriVal","getLocalConfig","configsPlugin","setHash","SCROLL_TO","CLEAR_SCROLL_TO","getScrollParent","includeHidden","LAST_RESORT","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","layout","scrollToElement","clearScrollTo","readyToScroll","isShownKey","scrollToKey","layoutSelectors","getScrollToKey","layoutActions","parseDeepLinkHash","rawHash","deepLinking","hashArray","isShownKeyFromUrlHashArray","tagId","maybeOperationId","tagIsShownKey","show","urlHashArray","operationId","urlHashArrayFromIsShownKey","tokenArray","shown","assetName","Ori","OperationWrapper","onLoad","OperationTagWrapper","OperationTag","seekStr","makeNewMessage","jsSpec","errorTransformers","NotOfType","ParameterOneOf","transformErrors","inputs","transformedErrors","transformer","DEFAULT_ERROR_STRUCTURE","allErrors","lastError","newErrors","errValue","filterValue","taggedOps","phrase","tagObj","opsFilter","ArrowUp","xmlns","viewBox","focusable","ArrowDown","Arrow","Close","Copy","fillRule","Lock","Unlock","IconsPlugin","ArrowUpIcon","ArrowDownIcon","ArrowIcon","CloseIcon","CopyIcon","UPDATE_LAYOUT","UPDATE_FILTER","UPDATE_MODE","SHOW","updateLayout","updateFilter","changeMode","isShown","thingToShow","currentFilter","def","whatMode","showSummary","taggedOperations","oriSelector","maxDisplayedTags","levels","getLevel","logLevel","logLevelInt","info","engaged","updateSpec","updateJsonSpec","onComplete","extractKey","escapeShell","escapeCMD","escapePowershell","curlify","request","newLine","isMultipartFormDataRequest","curlified","addWords","addWordsWithoutLeadingSpace","addNewLine","addIndent","extractedKey","reqBody","getStringBodyOfMap","curlifyToJoin","requestSnippetGenerator_curl_powershell","requestSnippetGenerator_curl_bash","requestSnippetGenerator_curl_cmd","getGenerators","languageKeys","generators","getSnippetGenerators","genFn","getGenFn","getActiveLanguage","getDefaultExpanded","_arrayLikeToArray","arr2","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","minLen","_nonIterableSpread","classNameCombinations","createStyleObject","elementStyle","stylesheet","getClassNameCombinations","powerSetPermutations","styleObject","createClassNameString","_ref$style","useInlineStyles","TagName","childrenCreator","createChildren","childrenCount","allStylesheetSelectors","startingClassName","astGenerator","newLineRegex","AllLineNumbers","codeString","codeStyle","_ref2$containerStyle","containerStyle","paddingRight","_ref2$numberStyle","numberStyle","startingLineNumber","getAllLineNumbers","lines","getInlineLineNumber","lineNumber","inlineLineNumberStyle","assembleLineNumberStyles","lineNumberStyle","largestLineNumber","defaultLineNumberStyle","minWidth","textAlign","customLineNumberStyle","createLineElement","showInlineLineNumbers","_ref3$lineProps","lineProps","_ref3$className","showLineNumbers","wrapLongLines","flattenCodeTree","tree","newTree","processLines","codeTree","wrapLines","lastLineBreakIndex","createLine","createWrappedLine","createUnwrappedLine","_loop","newLines","getNewLines","splitValue","stringChild","lastLineInPreviousSpan","newElem","_line2","_line3","defaultRenderer","rows","isHighlightJs","SyntaxHighlighter","defaultAstGenerator","_ref7$style","_ref7$customStyle","customStyle","_ref7$codeTagProps","codeTagProps","_ref7$useInlineStyles","_ref7$showLineNumbers","_ref7$showInlineLineN","_ref7$startingLineNum","lineNumberContainerStyle","_ref7$lineNumberStyle","_ref7$wrapLongLines","_ref7$lineProps","renderer","_ref7$PreTag","PreTag","_ref7$CodeTag","CodeTag","_ref7$code","allLineNumbers","defaultPreStyle","backgroundColor","generatorClassName","preProps","defaultCodeValue","getCodeTree","hasLanguage","checkForListedLanguage","styles","agate","arta","monokai","nord","obsidian","idea","availableStyles","getStyle","cursor","paddingBottom","paddingTop","border","borderRadius","boxShadow","borderBottom","activeStyle","marginTop","marginRight","marginLeft","requestSnippetsSelectors","canSyntaxHighlight","rootRef","activeLanguage","setActiveLanguage","isExpanded","setIsExpanded","handlePreventYScrollingBeyondElement","snippetGenerators","activeGenerator","handleSetIsExpanded","handleGetBtnStyle","contentHeight","offsetHeight","visibleHeight","SnippetComponent","readOnly","justifyContent","alignItems","marginBottom","background","paddingLeft","handleGenChange","RequestSnippets","requestSnippets","shallowArrayEquals","foundKey","OriginalCache","primitives","generateStringFromRegex","string_email","string_date-time","string_date","string_uuid","string_hostname","string_ipv4","string_ipv6","number_float","sanitizeRef","objectContracts","arrayContracts","numberContracts","stringContracts","liftSampleHelper","oldSchema","setIfNotDefinedInTarget","includeReadOnly","writeOnly","includeWriteOnly","sampleFromSchemaGeneric","exampleOverride","respectXML","usePlainValue","example","hasOneOf","hasAnyOf","anyOf","schemaToAdd","additionalProperties","schemaHasAny","enum","handleMinMaxItems","sampleArray","addPropertyToResult","propertyAddedCounter","hasExceededMaxProperties","maxProperties","canAddProperty","isOptionalProperty","requiredPropertiesToAdd","addedCount","overrideE","enumAttrVal","attrExample","attrDefault","discriminator","$$ref","itemSchema","itemSamples","additionalProp","additionalProp1","additionalProps","additionalPropSample","toGenerateCount","minProperties","exclusiveMinimum","exclusiveMaximum","inferSchema","createXMLExample","XML","sampleFromSchema","memoizedCreateXMLExample","memoizeN","memoizedSampleFromSchema","shouldStringifyTypesConfig","when","shouldStringifyTypes","defaultStringifyTypes","contentType","resType","typesToStringify","nextConfig","jsonExample","getJsonSampleSchema","yamlString","getXmlSampleSchema","getYamlSampleSchema","makeGetJsonSampleSchema","makeGetYamlSampleSchema","makeGetXmlSampleSchema","getSampleSchema","makeGetSampleSchema","jsonSchema5","OPERATION_METHODS","specStr","specSource","specJS","specResolved","specResolvedSubtree","mergerFn","oldVal","newVal","specJsonWithResolvedSubtrees","returnSelfOrNewMap","externalDocs","semver","validOperationMethods","operations","pathName","consumes","produces","findDefinition","resolvedRes","unresolvedRes","basePath","schemes","operationsWithRootInherited","ops","op","tags","tagDetails","operationsWithTags","taggedMap","ar","tagA","tagB","sortFn","responses","requests","mutatedRequests","responseFor","requestFor","mutatedRequestFor","allowTryItOutFor","parameterWithMetaByIdentity","pathMethod","opParams","metaParams","currentParam","inNameKeyedMeta","hashKeyedMeta","parameterInclusionSettingFor","paramKey","parameterWithMeta","operationWithMeta","mergedParams","getParameter","inType","hasHost","parameterValues","isXml","parametersIncludeIn","parameters","inValue","parametersIncludeType","typeValue","contentTypeValues","producesValue","currentProducesFor","requestContentType","responseContentType","currentProducesValue","firstProducesArrayItem","producesOptionsFor","operationProduces","pathItemProduces","globalProduces","consumesOptionsFor","operationConsumes","pathItemConsumes","globalConsumes","operationScheme","matchResult","canExecuteScheme","validationErrors","validateBeforeExecute","getOAS3RequiredRequestBodyContentType","requiredObj","requestBody","isMediaTypeSchemaPropertiesEqual","currentMediaType","targetMediaType","requestBodyContent","currentMediaTypeSchemaProperties","targetMediaTypeSchemaProperties","UPDATE_SPEC","UPDATE_URL","UPDATE_JSON","UPDATE_PARAM","UPDATE_EMPTY_PARAM_INCLUSION","VALIDATE_PARAMS","SET_RESPONSE","SET_REQUEST","SET_MUTATED_REQUEST","LOG_REQUEST","CLEAR_RESPONSE","CLEAR_REQUEST","CLEAR_VALIDATE_PARAMS","UPDATE_OPERATION_META_VALUE","UPDATE_RESOLVED","UPDATE_RESOLVED_SUBTREE","SET_SCHEME","cleanSpec","updateResolved","parseToJson","hasWarnedAboutResolveSpecDeprecation","resolveSpec","AST","modelPropertyMacro","parameterMacro","getLineNumberForPath","baseDoc","baseURI","preparedErrors","fullPath","requestBatch","debResolveSubtrees","systemPartitionedBatches","async","systemRequestBatch","resolveSubtree","errSelectors","batchResult","resultMap","specWithCurrentSubtrees","oidcScheme","openIdConnectUrl","openIdConnectData","assocPath","ImmutableMap","updateResolvedSubtree","requestResolvedSubtree","batchedPath","batchedSystem","changeParam","changeParamByIdentity","invalidateResolvedSubtreeCache","validateParams","updateEmptyParamInclusion","includeEmptyValue","clearValidateParams","changeConsumesValue","changeProducesValue","setResponse","setRequest","setMutatedRequest","logRequest","executeRequest","paramValue","contextUrl","opId","server","namespaceVariables","serverVariables","globalVariables","requestBodyValue","requestBodyInclusionSetting","parsedRequest","buildRequest","mutatedRequest","parsedMutatedRequest","clearResponse","clearRequest","setScheme","valueKey","paramMeta","isEmptyValueIncluded","paramRequired","paramDetails","validateParam","statusCode","newState","operationPath","metaPath","pathItems","$ref","SpecPlugin","__extends","extendStatics","__","_objectKeys","keys_1","_deepClone","escapePathComponent","unescapePathComponent","hasUndefined","i_1","objKeysLength","patchErrorMessageFormatter","messageParts","PatchError","_newTarget","JsonPatchError","deepClone","objOps","newDocument","move","getValueByPointer","originalValue","applyOperation","valueToCopy","_areEquals","_get","arrOps","pointer","getOriginalDestination","validateOperation","mutateDocument","banPrototypeModifications","existingPathFragment","validateFunction","applyPatch","patch","length_1","applyReducer","operationResult","pathLen","existingPathLen","externalValidator","arrA","arrB","beforeDict","Mirror","observers","ObserverInfo","unobserve","observe","mirror","getMirror","observerInfo","getObserverFromMirror","dirtyCheck","generate","fastCheck","patches","removeObserverFromMirror","invertible","_generate","newKeys","oldKeys","deleted","tree1","tree2","normalizeJSONPath","getInByJsonPath","currentValue","allowMetaPatches","isAdditiveMutation","parentPathMatch","fullyNormalizeArray","cleanArray","isPromise","forEachNew","mutations","forEachNewPatch","forEachNewPrimitive","forEachPrimitive","isJsonPatch","isContextPatch","isPatch","isMutation","isGenerator","mutation","newResults","arrayResults","moreResults","jsonPath","_isPlaceholder","_curry1","f1","_curry2","f2","_curry3","f3","_isInteger","_isString","nth","pathsArray","pathAr","pathSatisfies","pred","propPath","_cloneRegExp","sticky","unicode","dotAll","_arrayFromIterator","_includesWith","_has","_objectIs","_isArguments","hasEnumBug","nonEnumerableProps","hasArgsEnumBug","nIdx","ks","checkArgsLength","_uniqContentEquals","aIterator","bIterator","stackA","stackB","_equals","aItem","typeA","_functionName","keysA","extendedStackA","extendedStackB","_includes","_indexOf","inf","functor","_quote","pad","_toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","_complement","_arrayReduce","_isArray","_dispatchable","methodNames","transducerCreator","_isTransformer","transducer","_isObject","XFilter","_xfBase","_xfilter","filterable","_filter","recur","mapPairs","repr","_isRegExp","_arity","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","_pipe","symIterator","_createReduce","methodReduce","iterableReduce","_reduce","_xArrayReduce","thisObj","_xIterableReduce","_xMethodReduce","XWrap","_xwrap","_checkForMethod","methodname","toIndex","defaultTo","propOr","_curryN","combined","argsIdx","combinedIdx","hasPlaceholder","curryN","_isFunction","invoker","dropLastWhile","XDropLastWhile","retained","retain","_xdropLastWhile","chars","_iterableReduce","_methodReduce","XMap","_xmap","ap","applyF","applyX","_concat","set1","set2","len1","liftN","lifted","lift","always","safeMax","maxByValue","maxByType","stringA","maxByStringValue","pluck","anyPass","preds","identical","unaryIdentical","whenTrueFn","checkValue","valueName","replaceAll","replaceValue","checkArguments","checkSearchValue","replaceAllPonyfill","replaceAllInvoker","isWindows","getProtocol","isFileSystemPath","isHttpUrl","toFileSystemPath","urlDecodePatterns","keepFileProtocol","isWindowsPredicate","isFileUrl","getHash","hashIndex","stripHash","hashStrippedUri","resolvedUrl","urlEncodePatterns","fromFileSystemPath","unsanitize","Headers","Request","ACCEPT_HEADER_VALUE_FOR_DOCUMENTS","DEFAULT_BASE_URL","DEFAULT_OPENAPI_3_SERVER","freelyNamedKeyParents","nonFreelyNamedKeyGrandparents","freelyNamedPaths","freelyNamedAncestors","isFreelyNamed","parentPath","parentKey","grandparentKey","parentStr","absolutifyPointer","baseUrl","urlPart","fragmentPart","safeBaseUrl","safeUrlPart","newRefUrlPart","absoluteBaseUrl","rawRefUrlPart","ABSOLUTE_URL_REGEXP","JSONRefError","extra","oriError","originalError","docCache","specmapRefs","skipResolutionTestFns","specmap","specmapInstance","getInstance","shouldSkipResolution","getContext","splitString","refPath","promOrVal","absoluteify","wrapError","pointerAlreadyInPath","parentPointer","arrayToJsonPointer","escapeJsonPointerToken","fullyQualifiedPointer","safeParentPointer","rootDoc","contextTree","pointerIsAParent","currPath","hasIndirectCycle","useCircularStructures","absolutifiedRef","jsonPointerToArray","extractFromDoc","__value","patchValueAlreadyInPath","ancestors","pointToAncestor","getDoc","fetchJSON","docPath","Accept","loadSpec","extract","unescapeJsonPointerToken","_doc","URLSearchParams","pointerBoundaryChar","lastParentChar","alreadyAddError","originalDefinitionObj","allOf","toMerge","absoluteRefPatches","generateAbsoluteRefPatches","getBaseUrlForNodePath","targetKeys","nodePath","absolutifiedRefValue","opPath","ContextTree","createNode","getParent","branch","protoValue","ensureExists","SpecMap","getPluginName","pluginName","getPatchesOfType","debugLevel","pluginHistory","promisedPatches","showDebug","allPatches","pluginProp","libMethods","_getContext","hasRun","_hasRun","wrappedPlugins","wrapPlugin","updatePatches","verbose","pathDiscriminator","ctx","createKeyBasedPlugin","pluginObj","isSubPath","tested","generator","refCache","parentIndex","indexOfFirstProperties","isRootProperties","traversed","updatedPath","objRef","isWithinPathDiscriminator","nextPlugin","getMutationsForPlugin","nextPromisedPatch","race","getPluginHistory","getPluginRunCount","getPluginHistoryTip","getPluginMutationIndex","mutationIndex","updatePluginHistory","promisedPatchThen","setContext","updateMutations","removePromisedPatch","promisedPatch","getMutations","getCurrentMutations","getCurrentPlugin","tip","currentPlugin","getLib","nextPromise","pluginCount","promises","executePlugin","lastMutationIndex","yieldedPatches","v2OperationIdCompatibilityMode","idFromPathMethod","parsedSpec","$$normalized","pathParameters","oid","opList","__originalOperationId","inheritsList","toBeInherit","inheritName","opParam","makeFetchJSON","credentials","withCredentials","isRfc3986Reserved","isRrc3986Unreserved","encodeDisallowedCharacters","TextEncoder","encodedByte","stylize","encodeArray","explode","valueEncoder","encodeObject","valueKeys","encodePrimitive","serializeRes","mergeInQueryOrForm","headerName","userFetch","resError","responseError","shouldDownloadAsText","oriRes","serializeHeaders","useText","parseBody","serializeHeaderValue","isFile","navigatorObj","product","isArrayOfFile","STYLE_SEPARATORS","spaceDelimited","pipeDelimited","SEPARATORS","csv","ssv","tsv","FileWithData","formatKeyValue","skipEncoding","collectionFormat","allowEmptyValue","serializationOption","encodeFn","encodedKey","formatKeyValueBySerializationOption","allowReserved","encodedJson","encodedData","encodeKeyFn","encodeFormOrQuery","encodedQuery","parameterName","hasFile","formdata","reqForm","formData","oriSearch","newStr","oriQuery","finalStr","strs","joinSearch","_globalThis$document","retrievalURL","resolveGenericStrategy","skipNormalization","retrievalURI","httpClient","doResolve","_spec","plugs","mapSpec","genericStrategy","normalized","isOpenAPI30","openapi","isOpenAPI31","isOpenAPI3","openApi2Strategy","swagger","isOpenAPI2","resolveOpenAPI2Strategy","openApi30Strategy","resolveOpenAPI30Strategy","Annotation","Comment","ParseResult","api","annotations","warnings","replaceResult","searchIndex","SourceMap","positionStart","positionEnd","row","and","both","_both","_isTypedArray","invokeArgs","mpath","boundMethod","_reduced","XAll","_xall","hasMethod","hasBasicElementProps","primitiveEq","hasClass","cls","isElementType","predicateCreator","isStringElement","isNumberElement","isNullElement","isBooleanElement","isObjectElement","isArrayElement","isMemberElement","isLinkElement","isRefElement","isAnnotationElement","isCommentElement","isParseResultElement","isSourceMapElement","isPrimitiveElement","hasElementSourceMap","includesSymbols","elementSymbols","includesClasses","isOfTypeObject","isObjectConstructor","hasObjectConstructor","createNamespace","namespacePlugin","namespaceInstance","predicates","ApiDOMAggregateError","ApiDOMError","ApiDOMStructuredError","structuredOptions","causelessOptions","getVisitFn","visitor","isLeaving","typeVisitor","typeSpecificVisitor","leave","enter","specificVisitor","specificTypeVisitor","BREAK","getNodeType","isNode","mergeAll","visitors","visitFnGetter","nodeTypeGetter","visit","keyMap","breakSymbol","deleteNodeSymbol","skipVisitingNodeSymbol","nodePredicate","nodeCloneFn","detectCycles","visitorKeys","inArray","edits","isEdited","editOffset","editKey","editValue","arrayKey","visitFn","stateKey","_visitorKeys$nodeType","_visitorKeys$nodeType2","CloneError","DeepCloneError","ShallowCloneError","cloneDeep","visited","passThroughOptions","keyCopy","valueCopy","cloneShallow","safe","cloneShallowKeyValuePair","keyValuePair","cloneShallowElement","objectSlice","cloneShallowObjectSlice","cloneShallowArraySlice","keyMapDefault","ParseResultElement","PredicateVisitor","returnOnTrue","returnOnFalse","dispatchPlugins","toolboxCreator","visitorOptions","pluginsSpecs","pluginsVisitor","newElement","createRefractor","computeEdges","edges","childElement","TranscluderConstructor","transclude","_edges","objectElement","transcludeChildOfObjectElement","arrayElement","transcludeChildOfArrayElement","memberElement","transcludeChildOfMemberElement","EphemeralObject","EphemeralArray","toReference","fromEntries","Visitor","_Visitor","references","_BooleanElement","_NumberElement","_StringElement","_NullElement","ephemeral","JsonPointerError","CompilationJsonPointerError","converge","fns","_identity","isFinitePonyfill","isIntegerPonyfill","XTake","_xtake","XDropWhile","_xdropWhile","dropWhile","encodedURIComponent","InvalidJsonPointerError","uriToPointer","EvaluationJsonPointerError","failedToken","failedTokenPosition","tokenPosition","Callback","Components","schemas","examples","requestBodies","securitySchemes","callbacks","Contact","Discriminator","Encoding","allowedReserved","Example","summary","externalValue","ExternalDocumentation","Header","contentProp","Info","termsOfService","tos","contact","contactElement","licenseElement","License","Link","operationRef","_this$operationRef","_this$operationId","MediaType","OAuthFlow","authorizationUrl","tokenUrl","refreshUrl","OAuthFlows","clientCredentials","authorizationCode","Openapi","OpenApi3_0","servers","Operation","Parameter","PathItem","GET","PUT","POST","OPTIONS","HEAD","PATCH","TRACE","Paths","Reference","RequestBody","Responses","UnsupportedOperationError","JSONSchema","idProp","$schema","multipleOf","additionalItems","patternProperties","enumValue","media","JSONReference","Media","binaryEncoding","LinkDescription","rel","targetSchema","mediaType","encType","mapObjIndexed","isNil","_path","propSatisfies","dereference","rootObject","copyMetaAndAttributes","pick","JSONSchemaDraft4Element","JSONReferenceElement","MediaElement","LinkDescriptionElement","specObj","passingOptionsNames","retrievePassingOptions","retrieveFixedFields","specPath","fixedFields","retrieveVisitor","retrieveVisitorInstance","passingOpts","toRefractedElement","visitorPrototype","fallbackVisitorPrototype","ignoredFields","fields","fixedFieldElement","newMemberElement","isJSONReferenceLikeElement","allPass","or","_either","PatternedFieldsJsonObjectVisitor","fieldPatternPredicate","patternedFieldElement","stringElement","linkDescriptionElement","ifElse","onTrue","onFalse","_ifElse","getMaxArity","dispatchImpl","functions","AlternatingVisitor","alternator","JSONSchemaOrJSONReferenceVisitor","$visitor","isJSONSchemaElement","isJSONReferenceElement","isMediaElement","isLinkDescriptionElement","jsonSchemaDraft4","specificationObj","resolvedSpec","rootVisitor","idProps","SecurityRequirement","SecurityScheme","inVal","bearerFormat","flows","Server","variables","ServerVariable","Tag","Xml","CallbackElement","ComponentsElement","ContactElement","DiscriminatorElement","ExternalDocumentationElement","HeaderElement","InfoElement","LicenseElement","MediaTypeElement","OAuthFlowElement","OAuthFlowsElement","OpenApi3_0Element","OperationElement","ParameterElement","PathItemElement","PathsElement","ReferenceElement","RequestBodyElement","ResponseElement","ResponsesElement","SchemaElement","SecurityRequirementElement","SecuritySchemeElement","ServerElement","ServerVariableElement","TagElement","openApiGenericElement","openApiSemanticElement","isOpenApi3_0LikeElement","isParameterLikeElement","isReferenceLikeElement","isRequestBodyLikeElement","isResponseLikeElement","isServerLikeElement","isTagLikeElement","isOpenApiExtension","canSupportSpecificationExtensions","specificationExtensionPredicate","extensionElement","unrefractedElement","openapiElement","LinkParameters","static","primaryClass","Servers","ServerVariables","isCallbackElement","isComponentsElement","isContactElement","isExampleElement","isExternalDocumentationElement","isHeaderElement","isInfoElement","isLicenseElement","isLinkElementExternal","isOpenapiElement","isOpenApi3_0Element","isOperationElement","isParameterElement","isPathItemElement","isPathItemElementExternal","isPathsElement","isReferenceElement","isReferenceElementExternal","isRequestBodyElement","isResponseElement","isResponsesElement","isSchemaElement","isBooleanJsonSchemaElement","isSecurityRequirementElement","isServerElement","isServerVariableElement","isMediaTypeElement","isServersElement","referenceElement","MediaTypeExamples","MediaTypeEncoding","Security","mediaTypeElement","HeaderExamples","HeaderContent","JSONSchemaAllOfVisitor","JSONSchemaAnyOfVisitor","JSONSchemaOneOfVisitor","JSONSchemaItemsVisitor","JSONSchemaPropertiesVisitor","JSONSchemaTypeVisitor","DiscriminatorMapping","ParameterExamples","ParameterContent","ComponentsSchemas","ComponentsResponses","ComponentsParameters","ComponentsExamples","ComponentsRequestBodies","ComponentsHeaders","ComponentsSecuritySchemes","ComponentsLinks","ComponentsCallbacks","headerElement","EncodingHeaders","pathItemElement","RequestBodyContent","ResponseHeaders","ResponseContent","ResponseLinks","_isNumber","hasOrAdd","shouldAdd","prevSize","_items","_nativeSet","bIdx","_Set","difference","firstLen","secondLen","toFilterOut","specPathFixedFields","specPathPatternedFields","httpStatusCode","OperationTags","OperationParameters","OperationCallbacks","OperationSecurity","OperationServers","operationElement","httpMethodElementCI","httpMethodElementCS","PathItemServers","PathItemParameters","OAuthFlowScopes","Tags","jsonSchemaFixedFields","OpenApi","in","extension","openApi3_0","JsonSchemaDialect","identifier","OpenApi3_1","jsonSchemaDialect","webhooks","$vocabulary","$id","$anchor","$dynamicAnchor","$dynamicRef","$defs","$comment","ifSchema","thenSchema","elseSchema","dependentSchemas","prefixItems","containsProp","propertyNames","unevaluatedItems","unevaluatedProperties","enumVal","constVal","maxContains","minContains","dependentRequired","contentEncoding","contentMediaType","contentSchema","BaseInfoVisitor","BaseContactVisitor","BaseLicenseVisitor","BaseLinkVisitor","jsonSchemaDialectElement","BaseServerVisitor","BaseServerVariableVisitor","BaseMediaTypeVisitor","BaseSecurityRequirementVisitor","BaseComponentsVisitor","BaseTagVisitor","BaseReferenceVisitor","BaseParameterVisitor","BaseHeaderVisitor","isJsonSchemaDialectElement","isOpenApi3_1Element","getJsonSchemaDialect","handle$schema","inherited$schema","handle$id","inherited$id","_ObjectElement","booleanElement","schemaElement","BaseDiscriminatorVisitor","BaseXMLVisitor","ComponentsPathItems","BaseExampleVisitor","BaseExternalDocumentationVisitor","BaseEncodingVisitor","BasePathsVisitor","BaseRequestBodyVisitor","BaseCallbackVisitor","BaseResponseVisitor","BaseResponsesVisitor","BaseOperationVisitor","BasePathItemVisitor","BaseSecuritySchemeVisitor","BaseOAuthFlowsVisitor","BaseOAuthFlowVisitor","Webhooks","if","else","const","OpenApi3_1Element","openApi3_1","NotImplementedError","MediaTypes","unknownMediaType","filterByFormat","findBy","latest","OpenAPIMediaTypes","effectiveFormat","refSet","propEq","ReferenceSet","anotherRefSet","clean","parsers","parserOpts","resolvers","resolverOpts","strategies","external","toFunctorFn","nextObj","_assoc","mergeWithKey","mergeDeepWithKey","lObj","rObj","lVal","rVal","mergeDeepRight","Identity","over","baseURILens","baseURIDefault","parseResult","lastDotPosition","TextDecoder","PluginError","file","pluginResults","ParserError","UnmatchedDereferenceStrategyError","DereferenceError","dereferenceApiDOM","surrogateWrapping","elementClone","dereferenceStrategies","mergedOptions","withoutDefaults","Parser","allowEmpty","sourceMap","fileExtensions","mediaTypes","canParse","binaryString","base64String","parseResultElement","base64StringElement","canResolve","none","vals","MaximumDereferenceDepthError","ResolverError","MaximumResolverDepthError","JsonSchemaUriError","EvaluationJsonSchemaUriError","UnmatchedResolverError","optsBoundResolvers","clonedResolver","optsBoundParsers","clonedParser","parseFile","pathOr","JsonSchema$anchorError","EvaluationJsonSchema$anchorError","InvalidJsonSchema$anchorError","isAnchor","uriToAnchor","resolveSchema$refField","$refBaseURI","refractToSchemaElement","refracted","maybeRefractToSchemaElement","uriStrippedHash","isSchemaElementWith$id","schemaObjectElements","$idBaseURI","resolveSchema$idField","fragmentEvaluate","visitAsync","OpenApi3_1ResolveVisitor","indirections","crawledElements","crawlingMap","toBaseURI","linkElement","ExampleElement","exampleElement","$refBaseURIStrippedHash","isUnknownURI","canRead","isURL","isExternal","crawlReferenceElement","jsonPointer","referencedElementType","crawl","crawlPathItemElement","referencedElement","crawlSchemaElement","referencingElement","OpenApi3_1ResolveStrategy","_file$parseResult","_clone","deep","_ObjectMap","_isPrimitive","copiedValue","cachedCopy","hashedKey","bucket","XReduceBy","valueFn","valueAcc","keyFn","_xreduceBy","reduceBy","elt","removeSpaces","normalizeOperationId","withoutSpaces","createNormalizedOperationId","operationIdNormalizer","normalizedOperations","normalizedOperationGroups","normalizedOperationId","operationElements","indexedNormalizedOperationId","linkOperationId","normalizedOperationElement","originalOperationId","XUniqWith","_xuniqWith","uniqWith","parameterEquals","parameter1","parameter2","pathItemParameters","parentPathItemParameters","operationParameters","mergedParameters","topLevelSecurity","_topLevelSecurity","isServersUndefined","isServersArrayElement","isServersEmpty","defaultServer","parentOpenapiElement","_parentOpenapiElement","openapiServersContent","openapiServers","parentPathItemElement","_parentPathItemElemen","pathItemServersContent","pathItemServers","parameterElement","_parameterElement$sch","_parameterElement$sch2","_headerElement$schema","_headerElement$schema2","pojoAdapter","normalizeFn","openApiElement","Resolver","redirects","getHttpClient","AbortController","AbortSignal","swaggerHTTPClient","swaggerHTTPClientConfig","client","controller","signal","timeoutID","redirect","follow","resource","hasSupportedFileExtension","hasSupportedMediaType","pojo","detectionRegExp","refractorOpts","canDereference","ElementIdentityError","IdentityManager","uuid","identityMap","identify","generateId","forget","AncestorLineage","includesCycle","searchElement","findItem","identityManager","wasReferencedBy","OpenApi3_1DereferenceVisitor","toAncestorLineage","directAncestors","ancestorsLineage","mergeAndAnnotateReferencedElement","refedElement","_ancestorsLineage$fin","replaceWith","mergedElement","keyElement","_ancestorsLineage$fin2","_linkElementCopy$oper","linkElementCopy","_linkElementCopy$oper2","valueElement","exampleElementCopy","booleanJsonSchemaElement","_ancestorsLineage$fin3","OpenApi3_1DereferenceStrategy","dereferencedElement","elementPath","elementPathSanitized","trimParseResult","SchemaRefError","OpenApi3_1SwaggerClientDereferenceVisitor","_this$basePath","cycledReferenceElement","_this$basePath2","_this$options$derefer","_this$options$derefer2","rootCause","wrappedError","dereferenceOpts","_this$basePath3","cycledPathItemElement","_this$basePath4","_this$options$derefer3","_this$options$derefer4","_this$basePath5","cycledSchemaElement","mergeVisitor","_this$basePath6","_this$options$derefer5","_this$options$derefer6","_this$basePath7","_this$options$derefer7","_this$options$derefer8","macroOperation","pojoOperation","pojoParameter","macroValue","macroError","ModelPropertyMacroVisitor","emptyElement","isMergeableElement","mergeArrayElement","targetElement","sourceElement","mergeObjectElement","clonedMember","targetValue","_mergedOptions$isMerg","_mergedOptions$arrayE","_mergedOptions$object","defaultOptions","arrayElementMerge","objectElementMerge","sourceIsArrayElement","mergedSchemaElement","OpenApi3_1SwaggerClientDereferenceStrategy","_options$dereference$","dereferenceVisitor","parameterMacroVisitor","modelPropertyMacroVisitor","allOfVisitor","resolveOpenAPI31Strategy","openApiParseResultElement","jsonPointerURI","fragmentElement","openApiElementReference","transcluded","openApi31ApiDOMStrategy","makeResolve","retrievedSpec","strategyOptions","strg","generic","prot","bodyBuilder","headerBuilder","queryBuilder","pathBuilder","formDataBuilder","effectiveMediaType","styledValue","serializedValue","PARAMETER_HEADER_BLACKLIST","Cookie","globalObject","attachContentTypeForEmptyPayload","applySecurities","_spec$components","securityDef","securityObj","cookies","encoded","tokenValue","tokenType","token_type","requestBodyDef","requestBodyMediaTypes","isExplicitContentTypeValid","firstMediaType","accept","_requestBodyDef$conte","_requestBodyDef$conte2","tokenName","oauthToken","authorization","isBodyParamPresent","isFormDataParamPresent","idFromPathMethodLegacy","arrayOrEmpty","parseURIReference","uriReference","parsedURL","searchParams","OperationNotFoundError","findParametersWithName","deduplicateParameters","paramsMap","dedupedParameters","userHttp","parameterBuilders","specIsOAS3","operationRaw","getOperationRaw","findOperation","eachOperation","operationObj","cbValue","rawOperationId","oas3BaseUrl","_spec$paths","_spec$paths2","selectedServerObj","selectedServerUrl","operationLevelServers","pathItemLevelServers","rootLevelServers","isNonEmptyServerList","srv","varNames","getVariableTemplateNames","variableDefinition","variableValue","buildOas3UrlWithContext","ourUrl","parsedContextUrl","computedScheme","stripNonAlpha","computedHost","computedPath","swagger2BaseUrl","firstSchemeInSpec","combinedParameters","versionSpecificOptions","cookieString","cookieValue","makeResolveSubtree","returnEntireTree","resolveOptions","pathSegment","httpFn","Http","preFetch","postFetch","openApi31ApiDOMResolveStrategy","openApi30ResolveStrategy","openApi2ResolveStrategy","genericResolveStrategy","freshConfigs","batch","defaultNoopBatch","getBatch","ContextKey","gT","_gT$ContextKey","contextMap","realContext","pureFinalPropsSelectorFactory","mapDispatchToProps","mergeProps","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","stateProps","dispatchProps","mergedProps","hasRunAtLeastOnce","handleSubsequentCalls","nextOwnProps","propsChanged","stateChanged","handleNewPropsAndNewState","dependsOnOwnProps","handleNewProps","handleNewState","nextStateProps","statePropsChanged","pureFinalPropsSelector","handleFirstCall","firstState","firstOwnProps","wrapMapToPropsConstant","getConstant","initConstantSelector","constantSelector","getDependsOnOwnProps","mapToProps","wrapMapToPropsFunc","initProxySelector","proxy","mapToPropsProxy","stateOrDispatch","detectFactoryAndVerify","createInvalidArgFactory","wrappedComponentName","defaultMergeProps","nullListeners","createSubscription","parentSub","subscriptionsAmount","selfSubscribed","handleChangeWrapper","subscription","onStateChange","trySubscribe","addNestedSub","createListenerCollection","tryUnsubscribe","cleanupListener","notifyNestedSubs","trySubscribeSelf","tryUnsubscribeSelf","getListeners","useIsomorphicLayoutEffect","shallowEqual","objA","objB","keysB","NO_SUBSCRIPTION_ARRAY","captureWrapperProps","lastWrapperProps","lastChildProps","renderIsScheduled","wrapperProps","childPropsFromStoreUpdate","strictEqual","connect","pure","areMergedPropsEqual","Context","initMapStateToProps","mapStateToPropsFactory","initMapDispatchToProps","mapDispatchToPropsFactory","initMergeProps","mergePropsFactory","wrapMergePropsFunc","initMergePropsProxy","hasRunOnce","mergePropsProxy","nextMergedProps","shouldHandleStateChanges","WrappedComponent","selectorFactoryOptions","ConnectFunction","propsContext","reactReduxForwardedRef","ContextToUse","contextValue","didStoreComeFromProps","didStoreComeFromContext","getServerState","childPropsSelector","finalPropsSelectorFactory","overriddenContextValue","latestSubscriptionCallbackError","actualChildPropsSelector","subscribeForReact","reactListener","subscribeUpdates","additionalSubscribeListener","didUnsubscribe","lastThrownError","checkForUpdates","latestStoreState","newChildProps","actualChildProps","useIsomorphicLayoutEffectWithArgs","effectFunc","effectArgs","renderedWrappedComponent","Connect","forwarded","forwardConnectRef","serverState","stabilityCheck","noopCheck","previousState","newBatch","initializeConnect","withSystem","WithSystem","getDisplayName","withRoot","reduxStore","WithRoot","withConnect","customMapStateToProps","handleProps","oldProps","withMappedContainer","memGetComponent","WithMappedContainer","nextProps","cleanProps","domNode","App","ReactDOM","failSilently","memoizeForGetComponent","memMakeMappedContainer","memoizeForWithMappedContainer","makeMappedContainer","downloadUrlPlugin","checkPossibleFailReasons","specUrl","enums","loadingStatus","spec_update_loading_status","withErrorBoundary","ErrorBoundary","targetName","WithErrorBoundary","isClassComponent","hasError","errorInfo","FallbackComponent","Fallback","componentList","fullOverride","mergedComponentList","wrapFactory","Original","getLayout","layoutName","Layout","AuthorizationPopup","Auths","AuthorizeBtn","showPopup","AuthorizeBtnContainer","authorizableDefinitions","AuthorizeOperationBtn","onAuthChange","submitAuth","logoutClick","auths","AuthItem","Oauth2","Button","authorizedAuth","nonOauthDefinitions","oauthDefinitions","onSubmit","ApiKeyAuth","BasicAuth","authEl","AuthError","Input","Row","Col","Markdown","JumpToPath","autoComplete","showValue","HighlightCode","ExamplesSelect","onSelect","currentExampleKey","showLabels","_onSelect","isSyntheticChange","_onDomSelect","selectedOptions","getCurrentExample","currentExamplePerProps","firstExamplesKey","firstExample","firstExampleKey","isValueModified","isModifiedValueAvailable","exampleName","stringifyUnlessList","ExamplesSelectValueRetainer","userHasEditedBody","currentNamespace","setRetainRequestBodyValueFlag","updateValue","valueFromExample","_getCurrentExampleValue","lastUserEditedValue","currentUserInputValue","lastDownstreamValue","isModifiedValueSelected","_getStateForCurrentNamespace","_setStateForCurrentNamespace","_setStateForNamespace","newStateForNamespace","_isCurrentUserInputSameAsExampleValue","_getValueForExample","exampleKey","currentKey","_onExamplesSelect","valueFromCurrentExample","examplesMatchingNewValue","authConfigs","currentServer","oauth2RedirectUrl","scopesArray","scopeSeparator","realm","usePkceWithAuthorizationCodeGrant","generateCodeVerifier","codeChallenge","createCodeChallenge","shaJs","sanitizedAuthorizationUrl","useBasicAuthenticationWithAccessCodeGrant","errCb","appName","oauth2Authorize","onScopeChange","dataset","newScopes","onInputChange","selectScopes","InitializedInput","oidcUrl","AUTH_FLOW_IMPLICIT","AUTH_FLOW_PASSWORD","AUTH_FLOW_ACCESS_CODE","AUTH_FLOW_APPLICATION","isPkceCodeGrant","flowToDisplay","htmlFor","tablet","desktop","Clear","Duration","LiveResponse","displayRequestDuration","showMutatedRequest","requestSnippetsEnabled","curlRequest","notDocumented","headersKeys","ResponseBody","returnObject","joinedHeaders","hasHeaders","Curl","OnlineValidatorBadge","validatorUrl","getDefinitionUrl","sanitizedValidatorUrl","ValidatorImage","alt","Image","onload","Operations","renderOperationTag","OperationContainer","isAbsoluteUrl","buildBaseUrl","addProtocol","safeBuildUrl","buildUrl","docExpansion","isDeepLinkingEnabled","Collapse","DeepLink","tagExternalDocsUrl","tagDescription","tagExternalDocsDescription","rawTagExternalDocsUrl","showTag","enabled","isOpened","_circle","preserveAspectRatio","backgroundImage","backgroundPosition","backgroundRepeat","cx","cy","stroke","calcMode","dur","keyTimes","repeatCount","toggleShown","onTryoutClick","onResetClick","onCancelClick","onExecute","oas3Actions","operationProps","allowTryItOut","tryItOutEnabled","executeInProgress","externalDocsUrl","getList","extensions","Parameters","Execute","Schemes","OperationExt","OperationSummary","showExtensions","onChangeKey","RollingLoadSVG","operationServers","pathServers","getSelectedServer","setSelectedServer","setServerVariableValue","getServerVariable","serverVariableValue","getEffectiveServerValue","currentScheme","tryItOutResponse","displayOperationId","supportedSubmitMethods","jumpToKey","resolvedSubtree","getResolvedSubtree","defaultRequestBodyValue","selectDefaultRequestBodyValue","setRequestBodyValue","unresolvedOp","resolvedSummary","OperationSummaryMethod","OperationSummaryPath","CopyToClipboardBtn","hasSecurity","securityIsOptional","allowAnonymous","textToCopy","applicableDefinitions","tabIndex","pathParts","OperationExtRow","xKey","xVal","xNormalizedValue","fileName","downloadable","canCopy","handleDownload","saveAs","onChangeProducesWrapper","onResponseContentTypeChange","controlsAcceptHeader","setResponseContentType","defaultCode","defaultStatusCode","ContentType","acceptControllingResponse","getAcceptControllingResponse","suitable2xxResponse","defaultResponse","suitableDefaultResponse","regionId","createHtmlReadyId","controlId","ariaControls","ariaLabel","contentTypes","role","isDefault","onContentTypeChange","activeExamplesKey","activeExamplesMember","getKnownSyntaxHighlighterLanguage","isValidJson","canJsonParse","_onContentTypeChange","getTargetExamplesKey","activeContentType","ResponseExtension","ModelExample","OperationLink","specPathWithPossibleSchema","activeMediaType","examplesForMediaType","oas3SchemaForContentType","mediaTypeExample","sampleSchema","shouldOverrideSchemaExample","sampleGenConfig","targetExamplesKey","getMediaTypeExample","targetExample","oldOASMediaTypeExample","getExampleComponent","sampleResponse","setActiveExamplesMember","contextName","omitValue","parsedContent","updateParsedContent","prevContent","reader","FileReader","readAsText","downloadName","bodyEl","disposition","responseFilename","extractFileNameFromContentDispositionHeader","msSaveOrOpenBlob","formatXml","controls","callbackVisible","parametersVisible","onChangeConsumesWrapper","toggleTab","tab","onChangeMediaType","hasUserEditedBody","shouldRetainRequestBodyValue","setRequestContentType","initRequestBodyValidateError","ParameterRow","TryItOutButton","Callbacks","isExecute","groupedParametersArr","rawParam","onChangeConsumes","requestBodyErrors","updateActiveExamplesKey","lastValue","usableValue","onChangeIncludeEmpty","setRequestBodyInclusion","ParameterIncludeEmptyDefaultProps","isIncludedOptions","ParameterIncludeEmpty","shouldDispatchInit","onCheckboxChange","isIncluded","setDefaultValue","onChangeWrapper","numberToString","valueForUpstream","_onExampleSelect","getParamKey","paramWithMeta","parameterMediaType","generatedSampleValue","isSwagger2","showCommonExtensions","JsonSchemaForm","ParamBody","bodyParam","consumesValue","ParameterExt","paramItems","paramEnum","paramDefaultValue","paramExample","itemType","isFormData","isFormDataSupported","commonExt","isDisplayParamEnum","defaultToFirstExample","handleValidateParameters","handleValidateRequestBody","missingBodyValue","missingRequiredKeys","clearRequestBodyValidateError","oas3RequiredRequestBodyContentType","oas3RequestBodyValue","oas3ValidateBeforeExecuteSuccess","oas3RequestContentType","setRequestBodyValidateError","validateShallowRequired","missingKey","handleValidationResultPass","handleValidationResultFail","handleValidationResult","isPass","paramsResult","requestBodyResult","Property","schemaExample","propVal","propClass","Errors","editorActions","jumpToLine","allErrorsToDisplay","isVisible","sortedJSErrors","toggleVisibility","animated","ThrownErrorItem","SpecErrorItem","errorLine","toTitleCase","locationMessage","xclass","Container","fullscreen","full","containerClass","DEVICES","hide","keepContents","mobile","large","classesAr","device","deviceClass","TextArea","Select","option","allowedValues","NoMargin","renderNotAnimated","Overview","setTagShown","_setTagShown","showTagId","showOp","toggleShow","showOpIdPrefix","showOpId","_onClick","otherProps","InfoBasePath","InfoUrl","termsOfServiceUrl","contactData","licenseData","externalDocsDescription","VersionStamp","OpenAPIVersion","oasVersion","InfoContainer","Footer","FilterContainer","onFilterChange","isLoading","isFailed","NOOP","isEditBox","updateValues","isJson","_onChange","handleOnChange","inputValue","toggleIsEditBox","defaultProp","curl","curlBlock","SchemesContainer","ModelCollapse","collapsedContent","expanded","onToggle","hideSelfOnExpand","modelName","toggleCollapsed","defaultModelRendering","activeTab","defaultModelExpandDepth","ModelWrapper","exampleTabId","examplePanelId","modelTabId","modelPanelId","inactive","expandDepth","Model","isInvalid","isMapLike","checkItem","createChecker","checklist","_React$Component","ImmutablePureComponent","updateOnProps","updateOnStates","decodeRefName","unescaped","ImPropTypes","isRef","getModelName","getRefSchema","model","ObjectModel","ArrayModel","PrimitiveModel","Models","getSchemaBasePath","getCollapsedContent","handleToggle","onLoadModels","onLoadModel","defaultModelsExpandDepth","specPathBase","showModels","schemaValue","rawSchemaValue","rawSchema","requiredProperties","infoProperties","JumpToPathSection","titleEl","isDeprecated","normalizedValue","Primitive","enumArray","EnumModel","showReset","VersionPragmaFilter","alsoShow","bypass","SvgAssets","xmlnsXlink","decodeEntity","UNESCAPE_MD_RE","unescapeMd","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","NAMED_ENTITY_RE","DIGITAL_ENTITY_TEST_RE","replaceEntityPattern","decoded","replaceEntities","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","escapeHtml","nextToken","tight","blockquote_open","blockquote_close","getBreak","fence","fences","fenceName","langClass","langPrefix","fence_custom","heading_open","hLevel","heading_close","xhtmlOut","bullet_list_open","bullet_list_close","list_item_open","list_item_close","ordered_list_open","ordered_list_close","paragraph_open","paragraph_close","addBreak","link_open","linkTarget","link_close","image","table_open","table_close","thead_open","thead_close","tbody_open","tbody_close","tr_open","tr_close","th_open","align","th_close","td_open","td_close","strong_open","strong_close","em_open","em_close","del_open","del_close","ins_open","ins_close","mark_open","mark_close","sup","hardbreak","softbreak","breaks","htmlblock","htmltag","abbr_open","abbr_close","footnote_ref","subId","footnote_block_open","footnote_block_close","footnote_open","footnote_close","footnote_anchor","dl_open","dt_open","dd_open","dl_close","dt_close","dd_close","Renderer","Ruler","__rules__","__cache__","StateInline","parserInline","outTokens","posMax","pendingLevel","isInLabel","linkLevel","linkContent","labelUnmatchedScopes","parseLinkLabel","labelEnd","oldPos","oldFlag","skipToken","parseAbbr","abbreviations","normalizeLink","parseLinkDestination","validateLink","parseLinkTitle","normalizeReference","parseReference","renderInline","_rules","__find__","__compile__","chains","altName","at","beforeName","ruleName","afterName","enable","strict","disable","getRules","chainName","pushPending","cacheSet","cacheGet","PUNCT_CHARS","regEscape","RARE_RE","SCOPED_ABBR_RE","SCOPED_ABBR","replaceScopedAbbr","QUOTE_TEST_RE","QUOTE_RE","PUNCT_RE","isLetter","replaceAt","inlineMode","abbr","inline","tok","footnote_block","lastParagraph","currentLabel","insideRef","refTokens","footnotes","abbr2","reg","regText","blockTokens","abbrRegExp","inlineTokens","blkIdx","typographer","smartquotes","thisLevel","lastSpace","nextSpace","canOpen","canClose","isSingle","OUTER","single","quotes","Core","ruler","StateBlock","indent_found","bMarks","eMarks","tShift","blkIndent","lineMax","parentType","ddIndent","skipBulletListMarker","skipOrderedListMarker","skipEmptyLines","skipSpaces","skipChars","skipCharsBack","getLines","keepLastLF","html_blocks","HTML_TAG_OPEN_RE","HTML_TAG_CLOSE_RE","skipMarker","_rules$1","endLine","nextLine","silent","mem","haveEndMarker","blockquote","lastLineEmpty","oldTShift","oldBMarks","oldIndent","oldParentType","terminatorRules","terminate","maxNesting","tokenize","cnt","oldTight","posAfterMarker","indentAfterMarker","markerValue","markerCharCode","contentStart","listTokIdx","prevEmptyEnd","listLines","itemLines","markTightParagraphs","footnote","oldBMark","heading","lheading","isLetter$1","lineText","cell","aligns","tableLines","tbodyLines","deflist","ddLine","dtLine","oldDDIndent","markTightParagraphs$1","paragraph","ParserBlock","hasEmptyLines","TABS_SCAN_RE","NEWLINES_RE","SPACES_RE","isTerminatorChar","lastTabPos","ESCAPED","isAlphaNum","scanDelims","can_open","can_close","delims","UNESCAPE_RE","UNESCAPE_RE$1","url_schemas","EMAIL_RE","AUTOLINK_RE","replace$1","attr_value","open_tag","HTML_TAG_RE","DIGITAL_RE","NAMED_RE","_rules$2","newline","pmax","backticks","matchStart","matchEnd","del","emphasis","startCount","oldCount","labelStart","isImage","footnote_inline","footnoteId","oldLength","footnoteSubId","autolink","linkMatch","emailMatch","fullUrl","isLetter$2","entity","ParserInline","cached_pos","StateCore","Remarkable","preset","linkify","presets","parseInline","throwUnhandledCaseError","theValue","HtmlTag","whitespaceRegex","innerHtml","setTagName","getTagName","setAttr","getAttrs","getAttr","setAttrs","setClass","addClass","newClass","classAttr","getClass","newClasses","removeClass","removeClasses","setInnerHTML","setInnerHtml","getInnerHTML","getInnerHtml","toAnchorString","attrsStr","buildAttrsStr","attrsArr","AnchorTagBuilder","newWindow","truncate","build","createAttrs","processAnchorText","getAnchorText","getAnchorHref","createCssClass","returnClasses","cssClassSuffixes","getCssClassSuffixes","anchorText","doTruncate","truncateLength","truncateLocation","truncateSmart","truncateLen","ellipsisChars","ellipsisLengthBeforeParsing","ellipsisLength","urlObj","buildSegment","remainingAvailableLength","remainingAvailableLengthHalf","startOffset","endOffset","availableLength","urlSub","parse_url","matchQuery","pathAndQuery","truncateMiddle","truncateEnd","ellipsis","Match","__jsduckDummyDocProp","matchedText","tagBuilder","getMatchedText","setOffset","getOffset","buildTag","__assign","SuppressedError","urlSuffixRegex","EmailMatch","getEmail","HashtagMatch","serviceName","hashtag","getServiceName","getHashtag","MentionMatch","mention","getMention","PhoneMatch","plusSign","getPhoneNumber","getNumber","UrlMatch","urlMatchType","protocolUrlMatch","protocolRelativeMatch","stripPrefix","www","stripTrailingSlash","decodePercentEncoding","schemePrefixRegex","wwwPrefixRegex","protocolRelativeRegex","protocolPrepended","getUrlMatchType","getUrl","stripProtocolRelativePrefix","stripSchemePrefix","stripWwwPrefix","removeTrailingSlash","removePercentEncoding","preProcessedEntityAnchorText","Matcher","letterRe","digitRe","nonDigitRe","whitespaceRe","quoteRe","controlCharsRe","alphaCharsStr","alphaCharsAndMarksStr","decimalNumbersStr","alphaNumericCharsStr","alphaNumericAndMarksCharsStr","alphaNumericAndMarksCharRe","ipStr","domainLabelStr","getDomainLabelStr","getDomainNameStr","domainNameCharRegex","tldRegex","localPartCharRegex","strictTldRegex","EmailMatcher","parseMatches","noCurrentEmailMatch","CurrentEmailMatch","mailtoTransitions","charIdx","currentEmailMatch","stateNonEmailAddress","stateMailTo","stateLocalPart","stateLocalPartDot","stateAtSign","stateDomainChar","stateDomainHyphen","stateDomainDot","captureMatchIfValidAndReset","beginEmailMatch","hasMailtoPrefix","resetToNonEmailMatchState","hasDomainDot","emailAddress","doesEmailHaveValidTld","emailAddressTld","emailAddressNormalized","UrlMatchValidator","urlMatch","isValidUriScheme","urlMatchDoesNotHaveProtocolOrDot","urlMatchDoesNotHaveAtLeastOneWordChar","isValidIpAddress","containsMultipleDots","uriSchemeMatch","newRegex","hasFullProtocolRegex","ipRegex","stringBeforeSlash","uriSchemeMatchArr","uriSchemeRegex","uriScheme","hasWordCharAfterProtocolRegex","matcherRegex","wordCharRegExp","UrlMatcher","_loop_1","matchStr","schemeUrlMatch","wwwUrlMatch","wwwProtocolRelativeMatch","tldProtocolRelativeMatch","this_1","matchHasUnbalancedClosingParen","matchHasInvalidCharAfterTld","foundCommonScheme","commonScheme","indexOfSchemeStart","startChar","endChar","numOpenBraces","hashtagTextCharRe","HashtagMatcher","hashCharIdx","stateNone","stateNonHashtagWordChar","stateHashtagHashChar","stateHashtagTextChar","captureMatchIfValid","hashtagServices","phoneMatcherRegex","PhoneMatcher","cleanNumber","contextClear","testMatch","twitterRegex","instagramRegex","soundcloudRegex","tiktokRegex","nonWordCharRegex","MentionMatcher","matcherRegexes","twitter","instagram","soundcloud","tiktok","parseHtml","onOpenTag","onCloseTag","onText","onComment","onDoctype","noCurrentTag","CurrentTag","currentDataIdx","currentTag","stateData","stateTagOpen","stateEndTagOpen","stateTagName","stateBeforeAttributeName","stateAttributeName","stateAfterAttributeName","stateBeforeAttributeValue","stateAttributeValueDoubleQuoted","stateAttributeValueSingleQuoted","stateAttributeValueUnquoted","stateAfterAttributeValueQuoted","stateSelfClosingStartTag","stateMarkupDeclarationOpen","stateCommentStart","stateCommentStartDash","stateComment","stateCommentEndDash","stateCommentEnd","stateCommentEndBang","stateDoctype","startNewTag","isClosing","isOpening","captureTagName","emitTagAndPreviousTextNode","resetToDataState","reconsumeCurrentCharacter","textBeforeTag","startIdx","emitText","Autolinker","urls","phone","replaceFn","sanitizeHtml","matchers","normalizeUrlsCfg","normalizeStripPrefixCfg","normalizeTruncateCfg","textOrHtml","schemeMatches","wwwMatches","tldMatches","skipTagNames","skipTagsStackCount","textSplit","splitAndCapture","splitRegex","lastIdx","currentOffset_1","splitText","textNodeMatches","parseText","compactMatches","removeUnwantedMatches","matchedTextLength","removeIdx","getMatchers","numMatchers","textMatches","numTextMatches","newHtml","createMatchReturnVal","replaceFnResult","getTagBuilder","Email","Hashtag","Mention","Phone","LINK_SCAN_RE","isLinkOpen","isLinkClose","createLinkifier","autolinker","parseTokens","ln","htmlLinkLevel","linkifier","useUnsafeMarkdown","sanitized","sanitizer","DomPurify","hasWarnedAboutDeprecation","BaseLayout","ServersContainer","isOAS31","isSpecEmpty","loadingMessage","lastErr","lastErrMsg","hasServers","hasSchemes","hasSecurityDefinitions","CoreComponentsPlugin","authorizationPopup","authorizeBtn","authorizeOperationBtn","authError","oauth2","apiKeyAuth","basicAuth","liveResponse","onlineValidatorBadge","highlightCode","responseBody","parameterRow","overview","footer","modelExample","FormComponentsPlugin","LayoutUtils","JsonSchemaDefaultProps","keyName","dispatchInitialValue","getComponentSilently","Comp","JsonSchema_string","files","onEnumChange","schemaIn","JsonSchema_array","valueOrEmptyList","onItemChange","itemVal","removeItem","addItem","arrayErrors","needsRemoveError","shouldRenderValue","schemaItemsEnum","schemaItemsType","schemaItemsFormat","schemaItemsSchema","ArrayItemsComponent","isArrayItemText","isArrayItemFile","itemErrors","JsonSchemaArrayItemFile","JsonSchemaArrayItemText","onFileChange","JsonSchema_boolean","booleanValue","stringifyObjectErrors","stringError","currentError","JsonSchema_object","invalid","JSONSchemaComponentsPlugin","JSONSchemaComponents","BasePreset","ConfigsPlugin","UtilPlugin","LogsPlugin","ViewPlugin","ErrPlugin","LayoutPlugin","JSONSchema5SamplesPlugin","SwaggerClientPlugin","AuthPlugin","DownloadUrlPlugin","DeepLinkingPlugin","FilterPlugin","OnCompletePlugin","RequestSnippetsPlugin","SafeRenderPlugin","onlyOAS3","OAS3NullSelector","resolvedSchemes","defName","flowKey","flowVal","translatedDef","oidcData","grant","translatedScopes","cur","OAS3ComponentWrapFactory","swaggerVersion","isSwagger2Helper","isOAS30","isOAS30Helper","selectedValue","callbacksOperations","allOperations","callbackName","callbackOperations","callbackOps","pathItem","expression","pathItemOperations","operationDTO","operationDTOs","callbackNames","getDefaultRequestBodyValue","mediaTypeValue","hasExamplesKey","exampleSchema","handleFile","setIsIncludedOptions","RequestBodyEditor","requestBodyDescription","schemaForMediaType","rawExamplesOfMediaType","sampleForMediaType","isObjectContent","isBinaryFormat","isBase64Format","bodyProperties","currentErrors","included","useInitialValFromSchemaSamples","useInitialValFromEnum","useInitialValue","sampleRequestBody","targetOp","padString","setServer","currentServerDefinition","prevServerDefinition","prevServerVariableDefaultValue","currentServerVariableDefs","currentServerVariableDefaultValue","onServerChange","onServerVariableValueChange","variableName","newVariableValue","shouldShowVariableUI","applyDefaultValue","onDomChange","HttpAuth","serversToDisplay","displaying","operationLink","trimmed","ModelComponent","OAS30ComponentWrapFactory","UPDATE_SELECTED_SERVER","UPDATE_REQUEST_BODY_VALUE","UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG","UPDATE_REQUEST_BODY_INCLUSION","UPDATE_ACTIVE_EXAMPLES_MEMBER","UPDATE_REQUEST_CONTENT_TYPE","UPDATE_RESPONSE_CONTENT_TYPE","UPDATE_SERVER_VARIABLE_VALUE","SET_REQUEST_BODY_VALIDATE_ERROR","CLEAR_REQUEST_BODY_VALIDATE_ERROR","CLEAR_REQUEST_BODY_VALUE","clearRequestBodyValue","userEditedRequestBody","kv","currentMediaTypeDefaultBodyValue","locationData","varValues","serverValue","validateRequestBodyIsRequired","validateRequestBodyValueExists","requiredKeys","requiredKey","currentVal","valueKeyVal","missingKeyValues","bodyValue","currentMissingKey","bodyValues","specWrapSelectors","authWrapSelectors","oas3","selectWebhooksOperations","pathItemNames","pathItemName","selectLicenseNameField","selectLicenseUrl","selectContactNameField","selectContactUrl","selectContactEmailField","selectInfoSummaryField","selectInfoDescriptionField","selectInfoTitleField","selectInfoTermsOfServiceUrl","selectExternalDocsUrl","externalDocsDesc","selectExternalDocsDescriptionField","selectJsonSchemaDialectField","jsonSchemaDialectDefault","selectJsonSchemaDialectDefault","JSONSchema202012","handleExpand","onExpand","selectSchemas","hasSchemas","schemasPath","isOpenDefault","isOpen","isOpenAndExpanded","isResolved","handleModelsExpand","handleModelsRef","handleJSONSchema202012Ref","schemaName","handleJSONSchema202012Expand","schemaPath","mutualTLSDefinitions","createOnlyOAS31Selector","createOnlyOAS31SelectorWrapper","createSystemSelector","createOnlyOAS31ComponentWrapper","originalComponent","OAS31License","OAS31Contact","OAS31Info","makeIsExpandable","hasKeyword","jsonSchema202012","getProperties","filteredProperties","Keyword$schema","Keyword$vocabulary","Keyword$id","Keyword$anchor","Keyword$dynamicAnchor","Keyword$ref","Keyword$dynamicRef","Keyword$defs","Keyword$comment","KeywordAllOf","KeywordAnyOf","KeywordOneOf","KeywordNot","KeywordIf","KeywordThen","KeywordElse","KeywordDependentSchemas","KeywordPrefixItems","KeywordItems","KeywordContains","KeywordProperties","KeywordPatternProperties","KeywordAdditionalProperties","KeywordPropertyNames","KeywordUnevaluatedItems","KeywordUnevaluatedProperties","KeywordType","KeywordEnum","KeywordConst","KeywordConstraint","KeywordDependentRequired","KeywordContentSchema","KeywordTitle","KeywordDescription","KeywordDefault","KeywordDeprecated","KeywordReadOnly","KeywordWriteOnly","Accordion","ExpandDeepButton","ChevronRightIcon","ModelWithJSONSchemaContext","withSchemaContext","default$schema","defaultExpandedLevels","isExpandable","ModelsWrapper","ModelsWithJSONSchemaContext","VersionPragmaFilterWrapper","OAS31VersionPragmaFilter","MutualTLSAuth","OAS31Auths","isOAS31Fn","selectLicenseUrlField","selectLicenseIdentifierField","selectContactUrlField","selectInfoTermsOfServiceField","selectExternalDocsUrlField","rawSchemas","resolvedSchemas","resolvedSchema","oas31Selectors","useFn","useIsExpandedDeeply","useComponent","isExpandedDeeply","setExpanded","expandedDeeply","setExpandedDeeply","JSONSchemaDeepExpansionContext","handleExpansion","handleExpansionDeep","expandedDeepNew","MarkDown","DescriptionKeyword","DefaultWrapper","KeywordDiscriminator","KeywordXml","KeywordExample","KeywordExternalDocs","getDependentRequired","useConfig","propertySchema","PropertiesKeyword","wrappedFns","wrapOAS31Fn","systemFn","newImpl","oriImpl","createSystemSelectorFn","createOnlyOAS31SelectorFn","OAS31Model","OAS31Models","JSONSchema202012KeywordExample","JSONSchema202012KeywordXml","JSONSchema202012KeywordDiscriminator","JSONSchema202012KeywordExternalDocs","InfoWrapper","LicenseWrapper","ContactWrapper","AuthItemWrapper","AuthsWrapper","JSONSchema202012KeywordDescription","JSONSchema202012KeywordDescriptionWrapper","JSONSchema202012KeywordDefault","JSONSchema202012KeywordDefaultWrapper","JSONSchema202012KeywordProperties","JSONSchema202012KeywordPropertiesWrapper","definitionsToAuthorizeWrapper","selectIsOAS31","selectLicense","selectContact","selectWebhooks","isOAS3SelectorWrapper","selectLicenseUrlWrapper","oas31","selectOAS31LicenseUrl","objectSchema","booleanSchema","JSONSchemaContext","JSONSchemaLevelContext","JSONSchemaCyclesContext","fnName","useLevel","useRenderedSchemas","renderedSchemas","useIsExpanded","nextLevel","isEmbedded","useIsEmbedded","isCircular","useIsCircular","constraints","stringifyConstraints","expandedNew","constraint","getTitle","circularSuffix","strigifiedElement","Constraint","Title","ChevronRight","processedSchemas","isBooleanJSONSchema","getArrayType","prefixItemsTypes","itemsType","handleCombiningKeywords","subSchema","combinedStrings","inferType","stringifyConstraintRange","hasMin","hasMax","stringifyConstraintMultipleOf","factor","numberRange","stringifyConstraintNumberRange","hasMinimum","hasMaximum","hasExclusiveMinimum","hasExclusiveMaximum","isMinExclusive","isMaxExclusive","stringRange","arrayRange","hasUniqueItems","containsRange","objectRange","withJSONSchemaContext","overrides","HOC","contexts","JSONSchema202012Plugin","JSONSchema202012Keyword$schema","JSONSchema202012Keyword$vocabulary","JSONSchema202012Keyword$id","JSONSchema202012Keyword$anchor","JSONSchema202012Keyword$dynamicAnchor","JSONSchema202012Keyword$ref","JSONSchema202012Keyword$dynamicRef","JSONSchema202012Keyword$defs","JSONSchema202012Keyword$comment","JSONSchema202012KeywordAllOf","JSONSchema202012KeywordAnyOf","JSONSchema202012KeywordOneOf","JSONSchema202012KeywordNot","JSONSchema202012KeywordIf","JSONSchema202012KeywordThen","JSONSchema202012KeywordElse","JSONSchema202012KeywordDependentSchemas","JSONSchema202012KeywordPrefixItems","JSONSchema202012KeywordItems","JSONSchema202012KeywordContains","JSONSchema202012KeywordPatternProperties","JSONSchema202012KeywordAdditionalProperties","JSONSchema202012KeywordPropertyNames","JSONSchema202012KeywordUnevaluatedItems","JSONSchema202012KeywordUnevaluatedProperties","JSONSchema202012KeywordType","JSONSchema202012KeywordEnum","JSONSchema202012KeywordConst","JSONSchema202012KeywordConstraint","JSONSchema202012KeywordDependentRequired","JSONSchema202012KeywordContentSchema","JSONSchema202012KeywordTitle","JSONSchema202012KeywordDeprecated","JSONSchema202012KeywordReadOnly","JSONSchema202012KeywordWriteOnly","JSONSchema202012Accordion","JSONSchema202012ExpandDeepButton","JSONSchema202012ChevronRightIcon","withJSONSchema202012Context","JSONSchema202012DeepExpansionContext","arrayType","constrainedArray","containsItem","applyArrayConstraints","objectType","isJSONSchemaObject","isJSONSchema","emailGenerator","idnEmailGenerator","hostnameGenerator","idnHostnameGenerator","ipv4Generator","ipv6Generator","uriGenerator","uriReferenceGenerator","iriGenerator","iriReferenceGenerator","uuidGenerator","uriTemplateGenerator","jsonPointerGenerator","relativeJsonPointerGenerator","dateTimeGenerator","dateGenerator","timeGenerator","durationGenerator","passwordGenerator","regexGenerator","Registry","registry","formatAPI","quotedPrintable","utf8","utf8Value","base32Alphabet","paddingCount","base32Str","bufferLength","EncoderRegistry","encode7bit","encode8bit","encodeBinary","encodeQuotedPrintable","base16","base32","encoderAPI","encodingName","getDefaults","text/plain","text/css","text/csv","text/html","text/calendar","text/javascript","text/xml","text/*","image/*","audio/*","video/*","application/json","application/ld+json","application/x-httpd-php","application/rtf","raw","application/x-sh","application/xhtml+xml","application/*","MediaTypeRegistry","textMediaTypesGenerators","imageMediaTypesGenerators","audioMediaTypesGenerators","videoMediaTypesGenerators","applicationMediaTypesGenerators","mediaTypeAPI","mediaTypeNoParams","topLevelMediaType","generatedString","generateFormat","formatGenerator","mediaTypeGenerator","constrainedString","applyStringConstraints","floatGenerator","doubleGenerator","generatedNumber","epsilon","EPSILON","minValue","maxValue","constrainedNumber","applyNumberConstraints","int32Generator","int64Generator","stringType","numberType","integerType","boolean","booleanType","nullType","ALL_TYPES","hasExample","extractExample","inferringKeywords","fallbackType","inferTypeFromValue","foldType","pickedType","randomPick","inferringTypes","inferringType","inferringTypeKeywords","inferringKeyword","constType","combineTypes","combinedTypes","exampleType","typeCast","fromJSONBooleanSchema","merged","mergedType","ensureArray","allPropertyNames","propSchema","propSchemaType","anyOfSchema","oneOfSchema","contentSample","sampleEncoderAPI","sampleFormatAPI","sampleMediaTypeAPI","PresetApis","OpenAPI30Plugin","JSONSchema202012SamplesPlugin","OpenAPI31Plugin","GIT_DIRTY","GIT_COMMIT","PACKAGE_VERSION","BUILD_TIME","buildInfo","SwaggerUI","swaggerUi","gitRevision","gitDirty","buildTimestamp","dom_id","defaultExpanded","queryConfigEnabled","ApisPreset","syntaxHighlight","activated","theme","queryConfig","parseSearch","constructorConfig","storeConfigs","System","inlinePlugin","downloadSpec","fetchedConfig","localConfig","mergedConfig","configsActions","querySelector","configUrl","loadRemoteConfig","apis","Auth","Configs","DeepLining","Err","Filter","Icons","JSONSchema5Samples","JSONSchema202012Samples","Logs","OpenAPI30","OpenAPI31","OnComplete","Spec","SwaggerClient","Util","View","DownloadUrl","SafeRender"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/assets/scripts/swagger-ui-standalone-preset.js b/docs/assets/scripts/swagger-ui-standalone-preset.js new file mode 100644 index 000000000..2ede1a834 --- /dev/null +++ b/docs/assets/scripts/swagger-ui-standalone-preset.js @@ -0,0 +1,3 @@ +/*! For license information please see swagger-ui-standalone-preset.js.LICENSE.txt */ +!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUIStandalonePreset=t():e.SwaggerUIStandalonePreset=t()}(this,(()=>(()=>{var e={7967:(e,t)=>{"use strict";t.Rq=void 0;var r=/^([^\w]*)(javascript|data|vbscript)/im,n=/&#(\w+)(^\w|;)?/g,i=/&(newline|tab);/gi,o=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,a=/^.+(:|:)/gim,s=[".","/"];t.Rq="about:blank"},9742:(e,t)=>{"use strict";t.byteLength=function byteLength(e){var t=getLens(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function toByteArray(e){var t,r,o=getLens(e),a=o[0],s=o[1],u=new i(function _byteLength(e,t,r){return 3*(t+r)/4-r}(0,a,s)),c=0,f=s>0?a-4:a;for(r=0;r>16&255,u[c++]=t>>8&255,u[c++]=255&t;2===s&&(t=n[e.charCodeAt(r)]<<2|n[e.charCodeAt(r+1)]>>4,u[c++]=255&t);1===s&&(t=n[e.charCodeAt(r)]<<10|n[e.charCodeAt(r+1)]<<4|n[e.charCodeAt(r+2)]>>2,u[c++]=t>>8&255,u[c++]=255&t);return u},t.fromByteArray=function fromByteArray(e){for(var t,n=e.length,i=n%3,o=[],a=16383,s=0,u=n-i;su?u:s+a));1===i?(t=e[n-1],o.push(r[t>>2]+r[t<<4&63]+"==")):2===i&&(t=(e[n-2]<<8)+e[n-1],o.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"="));return o.join("")};for(var r=[],n=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0;a<64;++a)r[a]=o[a],n[o.charCodeAt(a)]=a;function getLens(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function encodeChunk(e,t,n){for(var i,o,a=[],s=t;s>18&63]+r[o>>12&63]+r[o>>6&63]+r[63&o]);return a.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},8764:(e,t,r)=>{"use strict";const n=r(9742),i=r(645),o="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=Buffer,t.SlowBuffer=function SlowBuffer(e){+e!=e&&(e=0);return Buffer.alloc(+e)},t.INSPECT_MAX_BYTES=50;const a=2147483647;function createBuffer(e){if(e>a)throw new RangeError('The value "'+e+'" is invalid for option "size"');const t=new Uint8Array(e);return Object.setPrototypeOf(t,Buffer.prototype),t}function Buffer(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(e)}return from(e,t,r)}function from(e,t,r){if("string"==typeof e)return function fromString(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!Buffer.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const r=0|byteLength(e,t);let n=createBuffer(r);const i=n.write(e,t);i!==r&&(n=n.slice(0,i));return n}(e,t);if(ArrayBuffer.isView(e))return function fromArrayView(e){if(isInstance(e,Uint8Array)){const t=new Uint8Array(e);return fromArrayBuffer(t.buffer,t.byteOffset,t.byteLength)}return fromArrayLike(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(isInstance(e,ArrayBuffer)||e&&isInstance(e.buffer,ArrayBuffer))return fromArrayBuffer(e,t,r);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(e,SharedArrayBuffer)||e&&isInstance(e.buffer,SharedArrayBuffer)))return fromArrayBuffer(e,t,r);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return Buffer.from(n,t,r);const i=function fromObject(e){if(Buffer.isBuffer(e)){const t=0|checked(e.length),r=createBuffer(t);return 0===r.length||e.copy(r,0,0,t),r}if(void 0!==e.length)return"number"!=typeof e.length||numberIsNaN(e.length)?createBuffer(0):fromArrayLike(e);if("Buffer"===e.type&&Array.isArray(e.data))return fromArrayLike(e.data)}(e);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return Buffer.from(e[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function assertSize(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function allocUnsafe(e){return assertSize(e),createBuffer(e<0?0:0|checked(e))}function fromArrayLike(e){const t=e.length<0?0:0|checked(e.length),r=createBuffer(t);for(let n=0;n=a)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a.toString(16)+" bytes");return 0|e}function byteLength(e,t){if(Buffer.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||isInstance(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);const r=e.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return utf8ToBytes(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return base64ToBytes(e).length;default:if(i)return n?-1:utf8ToBytes(e).length;t=(""+t).toLowerCase(),i=!0}}function slowToString(e,t,r){let n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return hexSlice(this,t,r);case"utf8":case"utf-8":return utf8Slice(this,t,r);case"ascii":return asciiSlice(this,t,r);case"latin1":case"binary":return latin1Slice(this,t,r);case"base64":return base64Slice(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function swap(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function bidirectionalIndexOf(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),numberIsNaN(r=+r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=Buffer.from(t,n)),Buffer.isBuffer(t))return 0===t.length?-1:arrayIndexOf(e,t,r,n,i);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):arrayIndexOf(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(e,t,r,n,i){let o,a=1,s=e.length,u=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,u/=2,r/=2}function read(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(i){let n=-1;for(o=r;os&&(r=s-u),o=r;o>=0;o--){let r=!0;for(let n=0;ni&&(n=i):n=i;const o=t.length;let a;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function base64Slice(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function utf8Slice(e,t,r){r=Math.min(e.length,r);const n=[];let i=t;for(;i239?4:t>223?3:t>191?2:1;if(i+a<=r){let r,n,s,u;switch(a){case 1:t<128&&(o=t);break;case 2:r=e[i+1],128==(192&r)&&(u=(31&t)<<6|63&r,u>127&&(o=u));break;case 3:r=e[i+1],n=e[i+2],128==(192&r)&&128==(192&n)&&(u=(15&t)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=e[i+1],n=e[i+2],s=e[i+3],128==(192&r)&&128==(192&n)&&128==(192&s)&&(u=(15&t)<<18|(63&r)<<12|(63&n)<<6|63&s,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,a=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=a}return function decodeCodePointsArray(e){const t=e.length;if(t<=s)return String.fromCharCode.apply(String,e);let r="",n=0;for(;nn.length?(Buffer.isBuffer(t)||(t=Buffer.from(t)),t.copy(n,i)):Uint8Array.prototype.set.call(n,t,i);else{if(!Buffer.isBuffer(t))throw new TypeError('"list" argument must be an Array of Buffers');t.copy(n,i)}i+=t.length}return n},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;tr&&(e+=" ... "),""},o&&(Buffer.prototype[o]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(e,t,r,n,i){if(isInstance(e,Uint8Array)&&(e=Buffer.from(e,e.offset,e.byteLength)),!Buffer.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;let o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(t>>>=0);const s=Math.min(o,a),u=this.slice(n,i),c=e.slice(t,r);for(let e=0;e>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return hexWrite(this,e,t,r);case"utf8":case"utf-8":return utf8Write(this,e,t,r);case"ascii":case"latin1":case"binary":return asciiWrite(this,e,t,r);case"base64":return base64Write(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const s=4096;function asciiSlice(e,t,r){let n="";r=Math.min(e.length,r);for(let i=t;in)&&(r=n);let i="";for(let n=t;nr)throw new RangeError("Trying to access beyond buffer length")}function checkInt(e,t,r,n,i,o){if(!Buffer.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(e,t,r,n,i){checkIntBI(t,n,i,e,r,7);let o=Number(t&BigInt(4294967295));e[r++]=o,o>>=8,e[r++]=o,o>>=8,e[r++]=o,o>>=8,e[r++]=o;let a=Number(t>>BigInt(32)&BigInt(4294967295));return e[r++]=a,a>>=8,e[r++]=a,a>>=8,e[r++]=a,a>>=8,e[r++]=a,r}function wrtBigUInt64BE(e,t,r,n,i){checkIntBI(t,n,i,e,r,7);let o=Number(t&BigInt(4294967295));e[r+7]=o,o>>=8,e[r+6]=o,o>>=8,e[r+5]=o,o>>=8,e[r+4]=o;let a=Number(t>>BigInt(32)&BigInt(4294967295));return e[r+3]=a,a>>=8,e[r+2]=a,a>>=8,e[r+1]=a,a>>=8,e[r]=a,r+8}function checkIEEE754(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function writeFloat(e,t,r,n,o){return t=+t,r>>>=0,o||checkIEEE754(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function writeDouble(e,t,r,n,o){return t=+t,r>>>=0,o||checkIEEE754(e,0,r,8),i.write(e,t,r,n,52,8),r+8}Buffer.prototype.slice=function slice(e,t){const r=this.length;(e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t>>=0,t>>>=0,r||checkOffset(e,t,this.length);let n=this[e],i=1,o=0;for(;++o>>=0,t>>>=0,r||checkOffset(e,t,this.length);let n=this[e+--t],i=1;for(;t>0&&(i*=256);)n+=this[e+--t]*i;return n},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(e,t){return e>>>=0,t||checkOffset(e,1,this.length),this[e]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]|this[e+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]<<8|this[e+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(e,t){return e>>>=0,t||checkOffset(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(e,t){return e>>>=0,t||checkOffset(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(e){validateNumber(e>>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||boundsError(e,this.length-8);const n=t+256*this[++e]+65536*this[++e]+this[++e]*2**24,i=this[++e]+256*this[++e]+65536*this[++e]+r*2**24;return BigInt(n)+(BigInt(i)<>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||boundsError(e,this.length-8);const n=t*2**24+65536*this[++e]+256*this[++e]+this[++e],i=this[++e]*2**24+65536*this[++e]+256*this[++e]+r;return(BigInt(n)<>>=0,t>>>=0,r||checkOffset(e,t,this.length);let n=this[e],i=1,o=0;for(;++o=i&&(n-=Math.pow(2,8*t)),n},Buffer.prototype.readIntBE=function readIntBE(e,t,r){e>>>=0,t>>>=0,r||checkOffset(e,t,this.length);let n=t,i=1,o=this[e+--n];for(;n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},Buffer.prototype.readInt8=function readInt8(e,t){return e>>>=0,t||checkOffset(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},Buffer.prototype.readInt16LE=function readInt16LE(e,t){e>>>=0,t||checkOffset(e,2,this.length);const r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function readInt16BE(e,t){e>>>=0,t||checkOffset(e,2,this.length);const r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function readInt32LE(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(e){validateNumber(e>>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||boundsError(e,this.length-8);const n=this[e+4]+256*this[e+5]+65536*this[e+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const t=this[e],r=this[e+7];void 0!==t&&void 0!==r||boundsError(e,this.length-8);const n=(t<<24)+65536*this[++e]+256*this[++e]+this[++e];return(BigInt(n)<>>=0,t||checkOffset(e,4,this.length),i.read(this,e,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(e,t){return e>>>=0,t||checkOffset(e,4,this.length),i.read(this,e,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(e,t){return e>>>=0,t||checkOffset(e,8,this.length),i.read(this,e,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(e,t){return e>>>=0,t||checkOffset(e,8,this.length),i.read(this,e,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(e,t,r,n){if(e=+e,t>>>=0,r>>>=0,!n){checkInt(this,e,t,r,Math.pow(2,8*r)-1,0)}let i=1,o=0;for(this[t]=255&e;++o>>=0,r>>>=0,!n){checkInt(this,e,t,r,Math.pow(2,8*r)-1,0)}let i=r-1,o=1;for(this[t+i]=255&e;--i>=0&&(o*=256);)this[t+i]=e/o&255;return t+r},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,255,0),this[t]=255&e,t+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(e,t=0){return wrtBigUInt64LE(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(e,t=0){return wrtBigUInt64BE(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(e,t,r,n){if(e=+e,t>>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,e,t,r,n-1,-n)}let i=0,o=1,a=0;for(this[t]=255&e;++i>0)-a&255;return t+r},Buffer.prototype.writeIntBE=function writeIntBE(e,t,r,n){if(e=+e,t>>>=0,!n){const n=Math.pow(2,8*r-1);checkInt(this,e,t,r,n-1,-n)}let i=r-1,o=1,a=0;for(this[t+i]=255&e;--i>=0&&(o*=256);)e<0&&0===a&&0!==this[t+i+1]&&(a=1),this[t+i]=(e/o>>0)-a&255;return t+r},Buffer.prototype.writeInt8=function writeInt8(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},Buffer.prototype.writeInt16LE=function writeInt16LE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeInt16BE=function writeInt16BE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeInt32LE=function writeInt32LE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},Buffer.prototype.writeInt32BE=function writeInt32BE(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(e,t=0){return wrtBigUInt64LE(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(e,t=0){return wrtBigUInt64BE(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(e,t,r){return writeFloat(this,e,t,!0,r)},Buffer.prototype.writeFloatBE=function writeFloatBE(e,t,r){return writeFloat(this,e,t,!1,r)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(e,t,r){return writeDouble(this,e,t,!0,r)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(e,t,r){return writeDouble(this,e,t,!1,r)},Buffer.prototype.copy=function copy(e,t,r,n){if(!Buffer.isBuffer(e))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(i=t;i=n+4;r-=3)t=`_${e.slice(r-3,r)}${t}`;return`${e.slice(0,r)}${t}`}function checkIntBI(e,t,r,n,i,o){if(e>r||e3?0===t||t===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(o+1)}${n}`:`>= -(2${n} ** ${8*(o+1)-1}${n}) and < 2 ** ${8*(o+1)-1}${n}`:`>= ${t}${n} and <= ${r}${n}`,new u.ERR_OUT_OF_RANGE("value",i,e)}!function checkBounds(e,t,r){validateNumber(t,"offset"),void 0!==e[t]&&void 0!==e[t+r]||boundsError(t,e.length-(r+1))}(n,i,o)}function validateNumber(e,t){if("number"!=typeof e)throw new u.ERR_INVALID_ARG_TYPE(t,"number",e)}function boundsError(e,t,r){if(Math.floor(e)!==e)throw validateNumber(e,r),new u.ERR_OUT_OF_RANGE(r||"offset","an integer",e);if(t<0)throw new u.ERR_BUFFER_OUT_OF_BOUNDS;throw new u.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${t}`,e)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(e){return e?`${e} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(e,t){return`The "${e}" argument must be of type number. Received type ${typeof t}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(e,t,r){let n=`The value of "${e}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=addNumericalSeparator(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=addNumericalSeparator(i)),i+="n"),n+=` It must be ${t}. Received ${i}`,n}),RangeError);const c=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(e,t){let r;t=t||1/0;const n=e.length;let i=null;const o=[];for(let a=0;a55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function base64ToBytes(e){return n.toByteArray(function base64clean(e){if((e=(e=e.split("=")[0]).trim().replace(c,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function blitBuffer(e,t,r,n){let i;for(i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function isInstance(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function numberIsNaN(e){return e!=e}const f=function(){const e="0123456789abcdef",t=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)t[n+i]=e[r]+e[i]}return t}();function defineBigIntMethod(e){return"undefined"==typeof BigInt?BufferBigIntNotDefined:e}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},93:(e,t,r)=>{var n=r(8196);e.exports=n},5362:(e,t,r)=>{var n=r(3383);e.exports=n},7700:(e,t,r)=>{r(3381);var n=r(5703);e.exports=n("Function").bind},6246:(e,t,r)=>{var n=r(7046),i=r(7700),o=Function.prototype;e.exports=function(e){var t=e.bind;return e===o||n(o,e)&&t===o.bind?i:t}},5999:(e,t,r)=>{r(9221);var n=r(4058);e.exports=n.Object.assign},4122:(e,t,r)=>{e.exports=r(9097)},269:(e,t,r)=>{e.exports=r(6936)},9097:(e,t,r)=>{var n=r(93);e.exports=n},6936:(e,t,r)=>{var n=r(5362);e.exports=n},4883:(e,t,r)=>{var n=r(7475),i=r(9826),o=TypeError;e.exports=function(e){if(n(e))return e;throw o(i(e)+" is not a function")}},6059:(e,t,r)=>{var n=r(941),i=String,o=TypeError;e.exports=function(e){if(n(e))return e;throw o(i(e)+" is not an object")}},1692:(e,t,r)=>{var n=r(4529),i=r(9413),o=r(623),createMethod=function(e){return function(t,r,a){var s,u=n(t),c=o(u),f=i(a,c);if(e&&r!=r){for(;c>f;)if((s=u[f++])!=s)return!0}else for(;c>f;f++)if((e||f in u)&&u[f]===r)return e||f||0;return!e&&-1}};e.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},3765:(e,t,r)=>{var n=r(5329);e.exports=n([].slice)},2532:(e,t,r)=>{var n=r(5329),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},2029:(e,t,r)=>{var n=r(5746),i=r(5988),o=r(1887);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},1887:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},5609:(e,t,r)=>{var n=r(1899),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},5746:(e,t,r)=>{var n=r(5981);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},6616:e=>{var t="object"==typeof document&&document.all,r=void 0===t&&void 0!==t;e.exports={all:t,IS_HTMLDDA:r}},1333:(e,t,r)=>{var n=r(1899),i=r(941),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},2861:e=>{e.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},3385:(e,t,r)=>{var n,i,o=r(1899),a=r(2861),s=o.process,u=o.Deno,c=s&&s.versions||u&&u.version,f=c&&c.v8;f&&(i=(n=f.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},5703:(e,t,r)=>{var n=r(4058);e.exports=function(e){return n[e+"Prototype"]}},6759:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},6887:(e,t,r)=>{"use strict";var n=r(1899),i=r(9730),o=r(7484),a=r(7475),s=r(9677).f,u=r(7252),c=r(4058),f=r(6843),l=r(2029),h=r(953),wrapConstructor=function(e){var Wrapper=function(t,r,n){if(this instanceof Wrapper){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return i(e,this,arguments)};return Wrapper.prototype=e.prototype,Wrapper};e.exports=function(e,t){var r,i,p,d,_,g,v,m,b,w=e.target,I=e.global,x=e.stat,B=e.proto,k=I?n:x?n[w]:(n[w]||{}).prototype,A=I?c:c[w]||l(c,w,{})[w],M=A.prototype;for(d in t)i=!(r=u(I?d:w+(x?".":"#")+d,e.forced))&&k&&h(k,d),g=A[d],i&&(v=e.dontCallGetSet?(b=s(k,d))&&b.value:k[d]),_=i&&v?v:t[d],i&&typeof g==typeof _||(m=e.bind&&i?f(_,n):e.wrap&&i?wrapConstructor(_):B&&a(_)?o(_):_,(e.sham||_&&_.sham||g&&g.sham)&&l(m,"sham",!0),l(A,d,m),B&&(h(c,p=w+"Prototype")||l(c,p,{}),l(c[p],d,_),e.real&&M&&(r||!M[d])&&l(M,d,_)))}},5981:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},9730:(e,t,r)=>{var n=r(8285),i=Function.prototype,o=i.apply,a=i.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?a.bind(o):function(){return a.apply(o,arguments)})},6843:(e,t,r)=>{var n=r(7484),i=r(4883),o=r(8285),a=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?a(e,t):function(){return e.apply(t,arguments)}}},8285:(e,t,r)=>{var n=r(5981);e.exports=!n((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},8308:(e,t,r)=>{"use strict";var n=r(5329),i=r(4883),o=r(941),a=r(953),s=r(3765),u=r(8285),c=Function,f=n([].concat),l=n([].join),h={};e.exports=u?c.bind:function bind(e){var t=i(this),r=t.prototype,n=s(arguments,1),u=function bound(){var r=f(n,s(arguments));return this instanceof u?function(e,t,r){if(!a(h,t)){for(var n=[],i=0;i{var n=r(8285),i=Function.prototype.call;e.exports=n?i.bind(i):function(){return i.apply(i,arguments)}},7484:(e,t,r)=>{var n=r(2532),i=r(5329);e.exports=function(e){if("Function"===n(e))return i(e)}},5329:(e,t,r)=>{var n=r(8285),i=Function.prototype,o=i.call,a=n&&i.bind.bind(o,o);e.exports=n?a:function(e){return function(){return o.apply(e,arguments)}}},626:(e,t,r)=>{var n=r(4058),i=r(1899),o=r(7475),aFunction=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?aFunction(n[e])||aFunction(i[e]):n[e]&&n[e][t]||i[e]&&i[e][t]}},4229:(e,t,r)=>{var n=r(4883),i=r(2119);e.exports=function(e,t){var r=e[t];return i(r)?void 0:n(r)}},1899:function(e,t,r){var check=function(e){return e&&e.Math==Math&&e};e.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof r.g&&r.g)||function(){return this}()||this||Function("return this")()},953:(e,t,r)=>{var n=r(5329),i=r(9678),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function hasOwn(e,t){return o(i(e),t)}},7748:e=>{e.exports={}},2840:(e,t,r)=>{var n=r(5746),i=r(5981),o=r(1333);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},7026:(e,t,r)=>{var n=r(5329),i=r(5981),o=r(2532),a=Object,s=n("".split);e.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?s(e,""):a(e)}:a},7475:(e,t,r)=>{var n=r(6616),i=n.all;e.exports=n.IS_HTMLDDA?function(e){return"function"==typeof e||e===i}:function(e){return"function"==typeof e}},7252:(e,t,r)=>{var n=r(5981),i=r(7475),o=/#|\.prototype\./,isForced=function(e,t){var r=s[a(e)];return r==c||r!=u&&(i(t)?n(t):!!t)},a=isForced.normalize=function(e){return String(e).replace(o,".").toLowerCase()},s=isForced.data={},u=isForced.NATIVE="N",c=isForced.POLYFILL="P";e.exports=isForced},2119:e=>{e.exports=function(e){return null==e}},941:(e,t,r)=>{var n=r(7475),i=r(6616),o=i.all;e.exports=i.IS_HTMLDDA?function(e){return"object"==typeof e?null!==e:n(e)||e===o}:function(e){return"object"==typeof e?null!==e:n(e)}},2529:e=>{e.exports=!0},6664:(e,t,r)=>{var n=r(626),i=r(7475),o=r(7046),a=r(2302),s=Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=n("Symbol");return i(t)&&o(t.prototype,s(e))}},623:(e,t,r)=>{var n=r(3057);e.exports=function(e){return n(e.length)}},5331:e=>{var t=Math.ceil,r=Math.floor;e.exports=Math.trunc||function trunc(e){var n=+e;return(n>0?r:t)(n)}},4420:(e,t,r)=>{"use strict";var n=r(5746),i=r(5329),o=r(8834),a=r(5981),s=r(4771),u=r(7857),c=r(6760),f=r(9678),l=r(7026),h=Object.assign,p=Object.defineProperty,d=i([].concat);e.exports=!h||a((function(){if(n&&1!==h({b:1},h(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=h({},e)[r]||s(h({},t)).join("")!=i}))?function assign(e,t){for(var r=f(e),i=arguments.length,a=1,h=u.f,p=c.f;i>a;)for(var _,g=l(arguments[a++]),v=h?d(s(g),h(g)):s(g),m=v.length,b=0;m>b;)_=v[b++],n&&!o(p,g,_)||(r[_]=g[_]);return r}:h},5988:(e,t,r)=>{var n=r(5746),i=r(2840),o=r(3937),a=r(6059),s=r(3894),u=TypeError,c=Object.defineProperty,f=Object.getOwnPropertyDescriptor,l="enumerable",h="configurable",p="writable";t.f=n?o?function defineProperty(e,t,r){if(a(e),t=s(t),a(r),"function"==typeof e&&"prototype"===t&&"value"in r&&p in r&&!r[p]){var n=f(e,t);n&&n[p]&&(e[t]=r.value,r={configurable:h in r?r[h]:n[h],enumerable:l in r?r[l]:n[l],writable:!1})}return c(e,t,r)}:c:function defineProperty(e,t,r){if(a(e),t=s(t),a(r),i)try{return c(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},9677:(e,t,r)=>{var n=r(5746),i=r(8834),o=r(6760),a=r(1887),s=r(4529),u=r(3894),c=r(953),f=r(2840),l=Object.getOwnPropertyDescriptor;t.f=n?l:function getOwnPropertyDescriptor(e,t){if(e=s(e),t=u(t),f)try{return l(e,t)}catch(e){}if(c(e,t))return a(!i(o.f,e,t),e[t])}},7857:(e,t)=>{t.f=Object.getOwnPropertySymbols},7046:(e,t,r)=>{var n=r(5329);e.exports=n({}.isPrototypeOf)},5629:(e,t,r)=>{var n=r(5329),i=r(953),o=r(4529),a=r(1692).indexOf,s=r(7748),u=n([].push);e.exports=function(e,t){var r,n=o(e),c=0,f=[];for(r in n)!i(s,r)&&i(n,r)&&u(f,r);for(;t.length>c;)i(n,r=t[c++])&&(~a(f,r)||u(f,r));return f}},4771:(e,t,r)=>{var n=r(5629),i=r(6759);e.exports=Object.keys||function keys(e){return n(e,i)}},6760:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function propertyIsEnumerable(e){var t=n(this,e);return!!t&&t.enumerable}:r},9811:(e,t,r)=>{var n=r(8834),i=r(7475),o=r(941),a=TypeError;e.exports=function(e,t){var r,s;if("string"===t&&i(r=e.toString)&&!o(s=n(r,e)))return s;if(i(r=e.valueOf)&&!o(s=n(r,e)))return s;if("string"!==t&&i(r=e.toString)&&!o(s=n(r,e)))return s;throw a("Can't convert object to primitive value")}},4058:e=>{e.exports={}},8219:(e,t,r)=>{var n=r(2119),i=TypeError;e.exports=function(e){if(n(e))throw i("Can't call method on "+e);return e}},3030:(e,t,r)=>{var n=r(1899),i=r(5609),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},8726:(e,t,r)=>{var n=r(2529),i=r(3030);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.31.1",mode:n?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.31.1/LICENSE",source:"https://github.com/zloirock/core-js"})},3405:(e,t,r)=>{var n=r(3385),i=r(5981),o=r(1899).String;e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!o(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},9413:(e,t,r)=>{var n=r(2435),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},4529:(e,t,r)=>{var n=r(7026),i=r(8219);e.exports=function(e){return n(i(e))}},2435:(e,t,r)=>{var n=r(5331);e.exports=function(e){var t=+e;return t!=t||0===t?0:n(t)}},3057:(e,t,r)=>{var n=r(2435),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},9678:(e,t,r)=>{var n=r(8219),i=Object;e.exports=function(e){return i(n(e))}},6935:(e,t,r)=>{var n=r(8834),i=r(941),o=r(6664),a=r(4229),s=r(9811),u=r(9813),c=TypeError,f=u("toPrimitive");e.exports=function(e,t){if(!i(e)||o(e))return e;var r,u=a(e,f);if(u){if(void 0===t&&(t="default"),r=n(u,e,t),!i(r)||o(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),s(e,t)}},3894:(e,t,r)=>{var n=r(6935),i=r(6664);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},9826:e=>{var t=String;e.exports=function(e){try{return t(e)}catch(e){return"Object"}}},9418:(e,t,r)=>{var n=r(5329),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},2302:(e,t,r)=>{var n=r(3405);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3937:(e,t,r)=>{var n=r(5746),i=r(5981);e.exports=n&&i((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},9813:(e,t,r)=>{var n=r(1899),i=r(8726),o=r(953),a=r(9418),s=r(3405),u=r(2302),c=n.Symbol,f=i("wks"),l=u?c.for||c:c&&c.withoutSetter||a;e.exports=function(e){return o(f,e)||(f[e]=s&&o(c,e)?c[e]:l("Symbol."+e)),f[e]}},3381:(e,t,r)=>{var n=r(6887),i=r(8308);n({target:"Function",proto:!0,forced:Function.bind!==i},{bind:i})},9221:(e,t,r)=>{var n=r(6887),i=r(4420);n({target:"Object",stat:!0,arity:2,forced:Object.assign!==i},{assign:i})},8196:(e,t,r)=>{var n=r(6246);e.exports=n},3383:(e,t,r)=>{var n=r(5999);e.exports=n},8269:function(e,t,r){var n;n=void 0!==r.g?r.g:this,e.exports=function(e){if(e.CSS&&e.CSS.escape)return e.CSS.escape;var cssEscape=function(e){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var t,r=String(e),n=r.length,i=-1,o="",a=r.charCodeAt(0);++i=1&&t<=31||127==t||0==i&&t>=48&&t<=57||1==i&&t>=48&&t<=57&&45==a?"\\"+t.toString(16)+" ":0==i&&1==n&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?"\\"+r.charAt(i):r.charAt(i):o+="�";return o};return e.CSS||(e.CSS={}),e.CSS.escape=cssEscape,cssEscape}(n)},645:(e,t)=>{t.read=function(e,t,r,n,i){var o,a,s=8*i-n-1,u=(1<>1,f=-7,l=r?i-1:0,h=r?-1:1,p=e[t+l];for(l+=h,o=p&(1<<-f)-1,p>>=-f,f+=s;f>0;o=256*o+e[t+l],l+=h,f-=8);for(a=o&(1<<-f)-1,o>>=-f,f+=n;f>0;a=256*a+e[t+l],l+=h,f-=8);if(0===o)o=1-c;else{if(o===u)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,n),o-=c}return(p?-1:1)*a*Math.pow(2,o-n)},t.write=function(e,t,r,n,i,o){var a,s,u,c=8*o-i-1,f=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:o-1,d=n?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=f):(a=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-a))<1&&(a--,u*=2),(t+=a+l>=1?h/u:h*Math.pow(2,1-l))*u>=2&&(a++,u/=2),a+l>=f?(s=0,a=f):a+l>=1?(s=(t*u-1)*Math.pow(2,i),a+=l):(s=t*Math.pow(2,l-1)*Math.pow(2,i),a=0));i>=8;e[r+p]=255&s,p+=d,s/=256,i-=8);for(a=a<0;e[r+p]=255&a,p+=d,a/=256,c-=8);e[r+p-d]|=128*_}},3393:function(e){e.exports=function(){"use strict";var e=Array.prototype.slice;function createClass(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function Iterable(e){return isIterable(e)?e:Seq(e)}function KeyedIterable(e){return isKeyed(e)?e:KeyedSeq(e)}function IndexedIterable(e){return isIndexed(e)?e:IndexedSeq(e)}function SetIterable(e){return isIterable(e)&&!isAssociative(e)?e:SetSeq(e)}function isIterable(e){return!(!e||!e[t])}function isKeyed(e){return!(!e||!e[r])}function isIndexed(e){return!(!e||!e[n])}function isAssociative(e){return isKeyed(e)||isIndexed(e)}function isOrdered(e){return!(!e||!e[i])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var t="@@__IMMUTABLE_ITERABLE__@@",r="@@__IMMUTABLE_KEYED__@@",n="@@__IMMUTABLE_INDEXED__@@",i="@@__IMMUTABLE_ORDERED__@@",o="delete",a=5,s=1<>>0;if(""+r!==t||4294967295===r)return NaN;t=r}return t<0?ensureSize(e)+t:t}function returnTrue(){return!0}function wholeSlice(e,t,r){return(0===e||void 0!==r&&e<=-r)&&(void 0===t||void 0!==r&&t>=r)}function resolveBegin(e,t){return resolveIndex(e,t,0)}function resolveEnd(e,t){return resolveIndex(e,t,t)}function resolveIndex(e,t,r){return void 0===e?r:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var h=0,p=1,d=2,_="function"==typeof Symbol&&Symbol.iterator,g="@@iterator",v=_||g;function Iterator(e){this.next=e}function iteratorValue(e,t,r,n){var i=0===e?t:1===e?r:[t,r];return n?n.value=i:n={value:i,done:!1},n}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(e){return!!getIteratorFn(e)}function isIterator(e){return e&&"function"==typeof e.next}function getIterator(e){var t=getIteratorFn(e);return t&&t.call(e)}function getIteratorFn(e){var t=e&&(_&&e[_]||e[g]);if("function"==typeof t)return t}function isArrayLike(e){return e&&"number"==typeof e.length}function Seq(e){return null==e?emptySequence():isIterable(e)?e.toSeq():seqFromValue(e)}function KeyedSeq(e){return null==e?emptySequence().toKeyedSeq():isIterable(e)?isKeyed(e)?e.toSeq():e.fromEntrySeq():keyedSeqFromValue(e)}function IndexedSeq(e){return null==e?emptySequence():isIterable(e)?isKeyed(e)?e.entrySeq():e.toIndexedSeq():indexedSeqFromValue(e)}function SetSeq(e){return(null==e?emptySequence():isIterable(e)?isKeyed(e)?e.entrySeq():e:indexedSeqFromValue(e)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=h,Iterator.VALUES=p,Iterator.ENTRIES=d,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[v]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(e,t){return seqIterate(this,e,t,!0)},Seq.prototype.__iterator=function(e,t){return seqIterator(this,e,t,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(e,t){return seqIterate(this,e,t,!1)},IndexedSeq.prototype.__iterator=function(e,t){return seqIterator(this,e,t,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var m,b,w,I="@@__IMMUTABLE_SEQ__@@";function ArraySeq(e){this._array=e,this.size=e.length}function ObjectSeq(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function IterableSeq(e){this._iterable=e,this.size=e.length||e.size}function IteratorSeq(e){this._iterator=e,this._iteratorCache=[]}function isSeq(e){return!(!e||!e[I])}function emptySequence(){return m||(m=new ArraySeq([]))}function keyedSeqFromValue(e){var t=Array.isArray(e)?new ArraySeq(e).fromEntrySeq():isIterator(e)?new IteratorSeq(e).fromEntrySeq():hasIterator(e)?new IterableSeq(e).fromEntrySeq():"object"==typeof e?new ObjectSeq(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function indexedSeqFromValue(e){var t=maybeIndexedSeqFromValue(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function seqFromValue(e){var t=maybeIndexedSeqFromValue(e)||"object"==typeof e&&new ObjectSeq(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function maybeIndexedSeqFromValue(e){return isArrayLike(e)?new ArraySeq(e):isIterator(e)?new IteratorSeq(e):hasIterator(e)?new IterableSeq(e):void 0}function seqIterate(e,t,r,n){var i=e._cache;if(i){for(var o=i.length-1,a=0;a<=o;a++){var s=i[r?o-a:a];if(!1===t(s[1],n?s[0]:a,e))return a+1}return a}return e.__iterateUncached(t,r)}function seqIterator(e,t,r,n){var i=e._cache;if(i){var o=i.length-1,a=0;return new Iterator((function(){var e=i[r?o-a:a];return a++>o?iteratorDone():iteratorValue(t,n?e[0]:a-1,e[1])}))}return e.__iteratorUncached(t,r)}function fromJS(e,t){return t?fromJSWith(t,e,"",{"":e}):fromJSDefault(e)}function fromJSWith(e,t,r,n){return Array.isArray(t)?e.call(n,r,IndexedSeq(t).map((function(r,n){return fromJSWith(e,r,n,t)}))):isPlainObj(t)?e.call(n,r,KeyedSeq(t).map((function(r,n){return fromJSWith(e,r,n,t)}))):t}function fromJSDefault(e){return Array.isArray(e)?IndexedSeq(e).map(fromJSDefault).toList():isPlainObj(e)?KeyedSeq(e).map(fromJSDefault).toMap():e}function isPlainObj(e){return e&&(e.constructor===Object||void 0===e.constructor)}function is(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function deepEqual(e,t){if(e===t)return!0;if(!isIterable(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||isKeyed(e)!==isKeyed(t)||isIndexed(e)!==isIndexed(t)||isOrdered(e)!==isOrdered(t))return!1;if(0===e.size&&0===t.size)return!0;var r=!isAssociative(e);if(isOrdered(e)){var n=e.entries();return t.every((function(e,t){var i=n.next().value;return i&&is(i[1],e)&&(r||is(i[0],t))}))&&n.next().done}var i=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{i=!0;var o=e;e=t,t=o}var a=!0,s=t.__iterate((function(t,n){if(r?!e.has(t):i?!is(t,e.get(n,c)):!is(e.get(n,c),t))return a=!1,!1}));return a&&e.size===s}function Repeat(e,t){if(!(this instanceof Repeat))return new Repeat(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(b)return b;b=this}}function invariant(e,t){if(!e)throw new Error(t)}function Range(e,t,r){if(!(this instanceof Range))return new Range(e,t,r);if(invariant(0!==r,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),r=void 0===r?1:Math.abs(r),tn?iteratorDone():iteratorValue(e,i,r[t?n-i++:i++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ObjectSeq.prototype.has=function(e){return this._object.hasOwnProperty(e)},ObjectSeq.prototype.__iterate=function(e,t){for(var r=this._object,n=this._keys,i=n.length-1,o=0;o<=i;o++){var a=n[t?i-o:o];if(!1===e(r[a],a,this))return o+1}return o},ObjectSeq.prototype.__iterator=function(e,t){var r=this._object,n=this._keys,i=n.length-1,o=0;return new Iterator((function(){var a=n[t?i-o:o];return o++>i?iteratorDone():iteratorValue(e,a,r[a])}))},ObjectSeq.prototype[i]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var r=getIterator(this._iterable),n=0;if(isIterator(r))for(var i;!(i=r.next()).done&&!1!==e(i.value,n++,this););return n},IterableSeq.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var r=getIterator(this._iterable);if(!isIterator(r))return new Iterator(iteratorDone);var n=0;return new Iterator((function(){var t=r.next();return t.done?t:iteratorValue(e,n++,t.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var r,n=this._iterator,i=this._iteratorCache,o=0;o=n.length){var t=r.next();if(t.done)return t;n[i]=t.value}return iteratorValue(e,i,n[i++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(e,t){return this.has(e)?this._value:t},Repeat.prototype.includes=function(e){return is(this._value,e)},Repeat.prototype.slice=function(e,t){var r=this.size;return wholeSlice(e,t,r)?this:new Repeat(this._value,resolveEnd(t,r)-resolveBegin(e,r))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(e){return is(this._value,e)?0:-1},Repeat.prototype.lastIndexOf=function(e){return is(this._value,e)?this.size:-1},Repeat.prototype.__iterate=function(e,t){for(var r=0;r=0&&t=0&&rr?iteratorDone():iteratorValue(e,o++,a)}))},Range.prototype.equals=function(e){return e instanceof Range?this._start===e._start&&this._end===e._end&&this._step===e._step:deepEqual(this,e)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var x="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(e,t){var r=65535&(e|=0),n=65535&(t|=0);return r*n+((e>>>16)*n+r*(t>>>16)<<16>>>0)|0};function smi(e){return e>>>1&1073741824|3221225471&e}function hash(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var r=0|e;for(r!==e&&(r^=4294967295*e);e>4294967295;)r^=e/=4294967295;return smi(r)}if("string"===t)return e.length>T?cachedHashString(e):hashString(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return hashJSObj(e);if("function"==typeof e.toString)return hashString(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function cachedHashString(e){var t=U[e];return void 0===t&&(t=hashString(e),F===R&&(F=0,U={}),F++,U[e]=t),t}function hashString(e){for(var t=0,r=0;r0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var A,M="function"==typeof WeakMap;M&&(A=new WeakMap);var q=0,j="__immutablehash__";"function"==typeof Symbol&&(j=Symbol(j));var T=16,R=255,F=0,U={};function assertNotInfinite(e){invariant(e!==1/0,"Cannot perform this action with an infinite size.")}function Map(e){return null==e?emptyMap():isMap(e)&&!isOrdered(e)?e:emptyMap().withMutations((function(t){var r=KeyedIterable(e);assertNotInfinite(r.size),r.forEach((function(e,r){return t.set(r,e)}))}))}function isMap(e){return!(!e||!e[V])}createClass(Map,KeyedCollection),Map.of=function(){var t=e.call(arguments,0);return emptyMap().withMutations((function(e){for(var r=0;r=t.length)throw new Error("Missing value for key: "+t[r]);e.set(t[r],t[r+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},Map.prototype.set=function(e,t){return updateMap(this,e,t)},Map.prototype.setIn=function(e,t){return this.updateIn(e,c,(function(){return t}))},Map.prototype.remove=function(e){return updateMap(this,e,c)},Map.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return c}))},Map.prototype.update=function(e,t,r){return 1===arguments.length?e(this):this.updateIn([e],t,r)},Map.prototype.updateIn=function(e,t,r){r||(r=t,t=void 0);var n=updateInDeepMap(this,forceIterator(e),t,r);return n===c?void 0:n},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(t){return mergeIntoMapWith(this,t,e.call(arguments,1))},Map.prototype.mergeIn=function(t){var r=e.call(arguments,1);return this.updateIn(t,emptyMap(),(function(e){return"function"==typeof e.merge?e.merge.apply(e,r):r[r.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(t){var r=e.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(t),r)},Map.prototype.mergeDeepIn=function(t){var r=e.call(arguments,1);return this.updateIn(t,emptyMap(),(function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,r):r[r.length-1]}))},Map.prototype.sort=function(e){return OrderedMap(sortFactory(this,e))},Map.prototype.sortBy=function(e,t){return OrderedMap(sortFactory(this,t,e))},Map.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(e,t){return new MapIterator(this,e,t)},Map.prototype.__iterate=function(e,t){var r=this,n=0;return this._root&&this._root.iterate((function(t){return n++,e(t[1],t[0],r)}),t),n},Map.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?makeMap(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Map.isMap=isMap;var W,V="@@__IMMUTABLE_MAP__@@",$=Map.prototype;function ArrayMapNode(e,t){this.ownerID=e,this.entries=t}function BitmapIndexedNode(e,t,r){this.ownerID=e,this.bitmap=t,this.nodes=r}function HashArrayMapNode(e,t,r){this.ownerID=e,this.count=t,this.nodes=r}function HashCollisionNode(e,t,r){this.ownerID=e,this.keyHash=t,this.entries=r}function ValueNode(e,t,r){this.ownerID=e,this.keyHash=t,this.entry=r}function MapIterator(e,t,r){this._type=t,this._reverse=r,this._stack=e._root&&mapIteratorFrame(e._root)}function mapIteratorValue(e,t){return iteratorValue(e,t[0],t[1])}function mapIteratorFrame(e,t){return{node:e,index:0,__prev:t}}function makeMap(e,t,r,n){var i=Object.create($);return i.size=e,i._root=t,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function emptyMap(){return W||(W=makeMap(0))}function updateMap(e,t,r){var n,i;if(e._root){var o=MakeRef(f),a=MakeRef(l);if(n=updateNode(e._root,e.__ownerID,0,void 0,t,r,o,a),!a.value)return e;i=e.size+(o.value?r===c?-1:1:0)}else{if(r===c)return e;i=1,n=new ArrayMapNode(e.__ownerID,[[t,r]])}return e.__ownerID?(e.size=i,e._root=n,e.__hash=void 0,e.__altered=!0,e):n?makeMap(i,n):emptyMap()}function updateNode(e,t,r,n,i,o,a,s){return e?e.update(t,r,n,i,o,a,s):o===c?e:(SetRef(s),SetRef(a),new ValueNode(t,n,[i,o]))}function isLeafNode(e){return e.constructor===ValueNode||e.constructor===HashCollisionNode}function mergeIntoNode(e,t,r,n,i){if(e.keyHash===n)return new HashCollisionNode(t,n,[e.entry,i]);var o,s=(0===r?e.keyHash:e.keyHash>>>r)&u,c=(0===r?n:n>>>r)&u;return new BitmapIndexedNode(t,1<>>=1)a[u]=1&r?t[o++]:void 0;return a[n]=i,new HashArrayMapNode(e,o+1,a)}function mergeIntoMapWith(e,t,r){for(var n=[],i=0;i>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function setIn(e,t,r,n){var i=n?e:arrCopy(e);return i[t]=r,i}function spliceIn(e,t,r,n){var i=e.length+1;if(n&&t+1===i)return e[t]=r,e;for(var o=new Array(i),a=0,s=0;s=H)return createNodes(e,u,n,i);var p=e&&e===this.ownerID,d=p?u:arrCopy(u);return h?s?f===l-1?d.pop():d[f]=d.pop():d[f]=[n,i]:d.push([n,i]),p?(this.entries=d,this):new ArrayMapNode(e,d)}},BitmapIndexedNode.prototype.get=function(e,t,r,n){void 0===t&&(t=hash(r));var i=1<<((0===e?t:t>>>e)&u),o=this.bitmap;return 0==(o&i)?n:this.nodes[popCount(o&i-1)].get(e+a,t,r,n)},BitmapIndexedNode.prototype.update=function(e,t,r,n,i,o,s){void 0===r&&(r=hash(n));var f=(0===t?r:r>>>t)&u,l=1<=Z)return expandNodes(e,_,h,f,v);if(p&&!v&&2===_.length&&isLeafNode(_[1^d]))return _[1^d];if(p&&v&&1===_.length&&isLeafNode(v))return v;var m=e&&e===this.ownerID,b=p?v?h:h^l:h|l,w=p?v?setIn(_,d,v,m):spliceOut(_,d,m):spliceIn(_,d,v,m);return m?(this.bitmap=b,this.nodes=w,this):new BitmapIndexedNode(e,b,w)},HashArrayMapNode.prototype.get=function(e,t,r,n){void 0===t&&(t=hash(r));var i=(0===e?t:t>>>e)&u,o=this.nodes[i];return o?o.get(e+a,t,r,n):n},HashArrayMapNode.prototype.update=function(e,t,r,n,i,o,s){void 0===r&&(r=hash(n));var f=(0===t?r:r>>>t)&u,l=i===c,h=this.nodes,p=h[f];if(l&&!p)return this;var d=updateNode(p,e,t+a,r,n,i,o,s);if(d===p)return this;var _=this.count;if(p){if(!d&&--_0&&n=0&&e>>t&u;if(n>=this.array.length)return new VNode([],e);var i,o=0===n;if(t>0){var s=this.array[n];if((i=s&&s.removeBefore(e,t-a,r))===s&&o)return this}if(o&&!i)return this;var c=editableVNode(this,e);if(!o)for(var f=0;f>>t&u;if(i>=this.array.length)return this;if(t>0){var o=this.array[i];if((n=o&&o.removeAfter(e,t-a,r))===o&&i===this.array.length-1)return this}var s=editableVNode(this,e);return s.array.splice(i+1),n&&(s.array[i]=n),s};var ee,te,re={};function iterateList(e,t){var r=e._origin,n=e._capacity,i=getTailOffset(n),o=e._tail;return iterateNodeOrLeaf(e._root,e._level,0);function iterateNodeOrLeaf(e,t,r){return 0===t?iterateLeaf(e,r):iterateNode(e,t,r)}function iterateLeaf(e,a){var u=a===i?o&&o.array:e&&e.array,c=a>r?0:r-a,f=n-a;return f>s&&(f=s),function(){if(c===f)return re;var e=t?--f:c++;return u&&u[e]}}function iterateNode(e,i,o){var u,c=e&&e.array,f=o>r?0:r-o>>i,l=1+(n-o>>i);return l>s&&(l=s),function(){for(;;){if(u){var e=u();if(e!==re)return e;u=null}if(f===l)return re;var r=t?--l:f++;u=iterateNodeOrLeaf(c&&c[r],i-a,o+(r<=e.size||t<0)return e.withMutations((function(e){t<0?setListBounds(e,t).set(0,r):setListBounds(e,0,t+1).set(t,r)}));t+=e._origin;var n=e._tail,i=e._root,o=MakeRef(l);return t>=getTailOffset(e._capacity)?n=updateVNode(n,e.__ownerID,0,t,r,o):i=updateVNode(i,e.__ownerID,e._level,t,r,o),o.value?e.__ownerID?(e._root=i,e._tail=n,e.__hash=void 0,e.__altered=!0,e):makeList(e._origin,e._capacity,e._level,i,n):e}function updateVNode(e,t,r,n,i,o){var s,c=n>>>r&u,f=e&&c0){var l=e&&e.array[c],h=updateVNode(l,t,r-a,n,i,o);return h===l?e:((s=editableVNode(e,t)).array[c]=h,s)}return f&&e.array[c]===i?e:(SetRef(o),s=editableVNode(e,t),void 0===i&&c===s.array.length-1?s.array.pop():s.array[c]=i,s)}function editableVNode(e,t){return t&&e&&t===e.ownerID?e:new VNode(e?e.array.slice():[],t)}function listNodeFor(e,t){if(t>=getTailOffset(e._capacity))return e._tail;if(t<1<0;)r=r.array[t>>>n&u],n-=a;return r}}function setListBounds(e,t,r){void 0!==t&&(t|=0),void 0!==r&&(r|=0);var n=e.__ownerID||new OwnerID,i=e._origin,o=e._capacity,s=i+t,c=void 0===r?o:r<0?o+r:i+r;if(s===i&&c===o)return e;if(s>=c)return e.clear();for(var f=e._level,l=e._root,h=0;s+h<0;)l=new VNode(l&&l.array.length?[void 0,l]:[],n),h+=1<<(f+=a);h&&(s+=h,i+=h,c+=h,o+=h);for(var p=getTailOffset(o),d=getTailOffset(c);d>=1<p?new VNode([],n):_;if(_&&d>p&&sa;m-=a){var b=p>>>m&u;v=v.array[b]=editableVNode(v.array[b],n)}v.array[p>>>a&u]=_}if(c=d)s-=d,c-=d,f=a,l=null,g=g&&g.removeBefore(n,0,s);else if(s>i||d>>f&u;if(w!==d>>>f&u)break;w&&(h+=(1<i&&(l=l.removeBefore(n,f,s-h)),l&&di&&(i=s.size),isIterable(a)||(s=s.map((function(e){return fromJS(e)}))),n.push(s)}return i>e.size&&(e=e.setSize(i)),mergeIntoCollectionWith(e,t,n)}function getTailOffset(e){return e>>a<=s&&a.size>=2*o.size?(n=(i=a.filter((function(e,t){return void 0!==e&&u!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(n.__ownerID=i.__ownerID=e.__ownerID)):(n=o.remove(t),i=u===a.size-1?a.pop():a.set(u,void 0))}else if(f){if(r===a.get(u)[1])return e;n=o,i=a.set(u,[t,r])}else n=o.set(t,a.size),i=a.set(a.size,[t,r]);return e.__ownerID?(e.size=n.size,e._map=n,e._list=i,e.__hash=void 0,e):makeOrderedMap(n,i)}function ToKeyedSequence(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function ToIndexedSequence(e){this._iter=e,this.size=e.size}function ToSetSequence(e){this._iter=e,this.size=e.size}function FromEntriesSequence(e){this._iter=e,this.size=e.size}function flipFactory(e){var t=makeSequence(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=cacheResultThrough,t.__iterateUncached=function(t,r){var n=this;return e.__iterate((function(e,r){return!1!==t(r,e,n)}),r)},t.__iteratorUncached=function(t,r){if(t===d){var n=e.__iterator(t,r);return new Iterator((function(){var e=n.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===p?h:p,r)},t}function mapFactory(e,t,r){var n=makeSequence(e);return n.size=e.size,n.has=function(t){return e.has(t)},n.get=function(n,i){var o=e.get(n,c);return o===c?i:t.call(r,o,n,e)},n.__iterateUncached=function(n,i){var o=this;return e.__iterate((function(e,i,a){return!1!==n(t.call(r,e,i,a),i,o)}),i)},n.__iteratorUncached=function(n,i){var o=e.__iterator(d,i);return new Iterator((function(){var i=o.next();if(i.done)return i;var a=i.value,s=a[0];return iteratorValue(n,s,t.call(r,a[1],s,e),i)}))},n}function reverseFactory(e,t){var r=makeSequence(e);return r._iter=e,r.size=e.size,r.reverse=function(){return e},e.flip&&(r.flip=function(){var t=flipFactory(e);return t.reverse=function(){return e.flip()},t}),r.get=function(r,n){return e.get(t?r:-1-r,n)},r.has=function(r){return e.has(t?r:-1-r)},r.includes=function(t){return e.includes(t)},r.cacheResult=cacheResultThrough,r.__iterate=function(t,r){var n=this;return e.__iterate((function(e,r){return t(e,r,n)}),!r)},r.__iterator=function(t,r){return e.__iterator(t,!r)},r}function filterFactory(e,t,r,n){var i=makeSequence(e);return n&&(i.has=function(n){var i=e.get(n,c);return i!==c&&!!t.call(r,i,n,e)},i.get=function(n,i){var o=e.get(n,c);return o!==c&&t.call(r,o,n,e)?o:i}),i.__iterateUncached=function(i,o){var a=this,s=0;return e.__iterate((function(e,o,u){if(t.call(r,e,o,u))return s++,i(e,n?o:s-1,a)}),o),s},i.__iteratorUncached=function(i,o){var a=e.__iterator(d,o),s=0;return new Iterator((function(){for(;;){var o=a.next();if(o.done)return o;var u=o.value,c=u[0],f=u[1];if(t.call(r,f,c,e))return iteratorValue(i,n?c:s++,f,o)}}))},i}function countByFactory(e,t,r){var n=Map().asMutable();return e.__iterate((function(i,o){n.update(t.call(r,i,o,e),0,(function(e){return e+1}))})),n.asImmutable()}function groupByFactory(e,t,r){var n=isKeyed(e),i=(isOrdered(e)?OrderedMap():Map()).asMutable();e.__iterate((function(o,a){i.update(t.call(r,o,a,e),(function(e){return(e=e||[]).push(n?[a,o]:o),e}))}));var o=iterableClass(e);return i.map((function(t){return reify(e,o(t))}))}function sliceFactory(e,t,r,n){var i=e.size;if(void 0!==t&&(t|=0),void 0!==r&&(r===1/0?r=i:r|=0),wholeSlice(t,r,i))return e;var o=resolveBegin(t,i),a=resolveEnd(r,i);if(o!=o||a!=a)return sliceFactory(e.toSeq().cacheResult(),t,r,n);var s,u=a-o;u==u&&(s=u<0?0:u);var c=makeSequence(e);return c.size=0===s?s:e.size&&s||void 0,!n&&isSeq(e)&&s>=0&&(c.get=function(t,r){return(t=wrapIndex(this,t))>=0&&ts)return iteratorDone();var e=i.next();return n||t===p?e:iteratorValue(t,u-1,t===h?void 0:e.value[1],e)}))},c}function takeWhileFactory(e,t,r){var n=makeSequence(e);return n.__iterateUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterate(n,i);var a=0;return e.__iterate((function(e,i,s){return t.call(r,e,i,s)&&++a&&n(e,i,o)})),a},n.__iteratorUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterator(n,i);var a=e.__iterator(d,i),s=!0;return new Iterator((function(){if(!s)return iteratorDone();var e=a.next();if(e.done)return e;var i=e.value,u=i[0],c=i[1];return t.call(r,c,u,o)?n===d?e:iteratorValue(n,u,c,e):(s=!1,iteratorDone())}))},n}function skipWhileFactory(e,t,r,n){var i=makeSequence(e);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return e.__iterate((function(e,o,c){if(!s||!(s=t.call(r,e,o,c)))return u++,i(e,n?o:u-1,a)})),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=e.__iterator(d,o),u=!0,c=0;return new Iterator((function(){var e,o,f;do{if((e=s.next()).done)return n||i===p?e:iteratorValue(i,c++,i===h?void 0:e.value[1],e);var l=e.value;o=l[0],f=l[1],u&&(u=t.call(r,f,o,a))}while(u);return i===d?e:iteratorValue(i,o,f,e)}))},i}function concatFactory(e,t){var r=isKeyed(e),n=[e].concat(t).map((function(e){return isIterable(e)?r&&(e=KeyedIterable(e)):e=r?keyedSeqFromValue(e):indexedSeqFromValue(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===n.length)return e;if(1===n.length){var i=n[0];if(i===e||r&&isKeyed(i)||isIndexed(e)&&isIndexed(i))return i}var o=new ArraySeq(n);return r?o=o.toKeyedSeq():isIndexed(e)||(o=o.toSetSeq()),(o=o.flatten(!0)).size=n.reduce((function(e,t){if(void 0!==e){var r=t.size;if(void 0!==r)return e+r}}),0),o}function flattenFactory(e,t,r){var n=makeSequence(e);return n.__iterateUncached=function(n,i){var o=0,a=!1;function flatDeep(e,s){var u=this;e.__iterate((function(e,i){return(!t||s0}function zipWithFactory(e,t,r){var n=makeSequence(e);return n.size=new ArraySeq(r).map((function(e){return e.size})).min(),n.__iterate=function(e,t){for(var r,n=this.__iterator(p,t),i=0;!(r=n.next()).done&&!1!==e(r.value,i++,this););return i},n.__iteratorUncached=function(e,n){var i=r.map((function(e){return e=Iterable(e),getIterator(n?e.reverse():e)})),o=0,a=!1;return new Iterator((function(){var r;return a||(r=i.map((function(e){return e.next()})),a=r.some((function(e){return e.done}))),a?iteratorDone():iteratorValue(e,o++,t.apply(null,r.map((function(e){return e.value}))))}))},n}function reify(e,t){return isSeq(e)?t:e.constructor(t)}function validateEntry(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function resolveSize(e){return assertNotInfinite(e.size),ensureSize(e)}function iterableClass(e){return isKeyed(e)?KeyedIterable:isIndexed(e)?IndexedIterable:SetIterable}function makeSequence(e){return Object.create((isKeyed(e)?KeyedSeq:isIndexed(e)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(e,t){return e>t?1:e=0;r--)t={value:arguments[r],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):makeStack(e,t)},Stack.prototype.pushAll=function(e){if(0===(e=IndexedIterable(e)).size)return this;assertNotInfinite(e.size);var t=this.size,r=this._head;return e.reverse().forEach((function(e){t++,r={value:e,next:r}})),this.__ownerID?(this.size=t,this._head=r,this.__hash=void 0,this.__altered=!0,this):makeStack(t,r)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(e){return this.pushAll(e)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(e,t){if(wholeSlice(e,t,this.size))return this;var r=resolveBegin(e,this.size);if(resolveEnd(t,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,e,t);for(var n=this.size-r,i=this._head;r--;)i=i.next;return this.__ownerID?(this.size=n,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(n,i)},Stack.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?makeStack(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Stack.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var r=0,n=this._head;n&&!1!==e(n.value,r++,this);)n=n.next;return r},Stack.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var r=0,n=this._head;return new Iterator((function(){if(n){var t=n.value;return n=n.next,iteratorValue(e,r++,t)}return iteratorDone()}))},Stack.isStack=isStack;var ce,fe="@@__IMMUTABLE_STACK__@@",le=Stack.prototype;function makeStack(e,t,r,n){var i=Object.create(le);return i.size=e,i._head=t,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function emptyStack(){return ce||(ce=makeStack(0))}function mixin(e,t){var keyCopier=function(r){e.prototype[r]=t[r]};return Object.keys(t).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(keyCopier),e}le[fe]=!0,le.withMutations=$.withMutations,le.asMutable=$.asMutable,le.asImmutable=$.asImmutable,le.wasAltered=$.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,r){e[r]=t})),e},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var e={};return this.__iterate((function(t,r){e[r]=t})),e},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return reify(this,concatFactory(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return is(t,e)}))},entries:function(){return this.__iterator(d)},every:function(e,t){assertNotInfinite(this.size);var r=!0;return this.__iterate((function(n,i,o){if(!e.call(t,n,i,o))return r=!1,!1})),r},filter:function(e,t){return reify(this,filterFactory(this,e,t,!0))},find:function(e,t,r){var n=this.findEntry(e,t);return n?n[1]:r},forEach:function(e,t){return assertNotInfinite(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){assertNotInfinite(this.size),e=void 0!==e?""+e:",";var t="",r=!0;return this.__iterate((function(n){r?r=!1:t+=e,t+=null!=n?n.toString():""})),t},keys:function(){return this.__iterator(h)},map:function(e,t){return reify(this,mapFactory(this,e,t))},reduce:function(e,t,r){var n,i;return assertNotInfinite(this.size),arguments.length<2?i=!0:n=t,this.__iterate((function(t,o,a){i?(i=!1,n=t):n=e.call(r,n,t,o,a)})),n},reduceRight:function(e,t,r){var n=this.toKeyedSeq().reverse();return n.reduce.apply(n,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(e,t){return reify(this,sliceFactory(this,e,t,!0))},some:function(e,t){return!this.every(not(e),t)},sort:function(e){return reify(this,sortFactory(this,e))},values:function(){return this.__iterator(p)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return ensureSize(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return countByFactory(this,e,t)},equals:function(e){return deepEqual(this,e)},entrySeq:function(){var e=this;if(e._cache)return new ArraySeq(e._cache);var t=e.toSeq().map(entryMapper).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(not(e),t)},findEntry:function(e,t,r){var n=r;return this.__iterate((function(r,i,o){if(e.call(t,r,i,o))return n=[i,r],!1})),n},findKey:function(e,t){var r=this.findEntry(e,t);return r&&r[0]},findLast:function(e,t,r){return this.toKeyedSeq().reverse().find(e,t,r)},findLastEntry:function(e,t,r){return this.toKeyedSeq().reverse().findEntry(e,t,r)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(returnTrue)},flatMap:function(e,t){return reify(this,flatMapFactory(this,e,t))},flatten:function(e){return reify(this,flattenFactory(this,e,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(e,t){return this.find((function(t,r){return is(r,e)}),void 0,t)},getIn:function(e,t){for(var r,n=this,i=forceIterator(e);!(r=i.next()).done;){var o=r.value;if((n=n&&n.get?n.get(o,c):c)===c)return t}return n},groupBy:function(e,t){return groupByFactory(this,e,t)},has:function(e){return this.get(e,c)!==c},hasIn:function(e){return this.getIn(e,c)!==c},isSubset:function(e){return e="function"==typeof e.includes?e:Iterable(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:Iterable(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return is(t,e)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return maxFactory(this,e)},maxBy:function(e,t){return maxFactory(this,t,e)},min:function(e){return maxFactory(this,e?neg(e):defaultNegComparator)},minBy:function(e,t){return maxFactory(this,t?neg(t):defaultNegComparator,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return reify(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return reify(this,skipWhileFactory(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(not(e),t)},sortBy:function(e,t){return reify(this,sortFactory(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return reify(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return reify(this,takeWhileFactory(this,e,t))},takeUntil:function(e,t){return this.takeWhile(not(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var he=Iterable.prototype;he[t]=!0,he[v]=he.values,he.__toJS=he.toArray,he.__toStringMapper=quoteString,he.inspect=he.toSource=function(){return this.toString()},he.chain=he.flatMap,he.contains=he.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(e,t){var r=this,n=0;return reify(this,this.toSeq().map((function(i,o){return e.call(t,[o,i],n++,r)})).fromEntrySeq())},mapKeys:function(e,t){var r=this;return reify(this,this.toSeq().flip().map((function(n,i){return e.call(t,n,i,r)})).flip())}});var pe=KeyedIterable.prototype;function keyMapper(e,t){return t}function entryMapper(e,t){return[t,e]}function not(e){return function(){return!e.apply(this,arguments)}}function neg(e){return function(){return-e.apply(this,arguments)}}function quoteString(e){return"string"==typeof e?JSON.stringify(e):String(e)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(e,t){return et?-1:0}function hashIterable(e){if(e.size===1/0)return 0;var t=isOrdered(e),r=isKeyed(e),n=t?1:0;return murmurHashOfSize(e.__iterate(r?t?function(e,t){n=31*n+hashMerge(hash(e),hash(t))|0}:function(e,t){n=n+hashMerge(hash(e),hash(t))|0}:t?function(e){n=31*n+hash(e)|0}:function(e){n=n+hash(e)|0}),n)}function murmurHashOfSize(e,t){return t=x(t,3432918353),t=x(t<<15|t>>>-15,461845907),t=x(t<<13|t>>>-13,5),t=x((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=smi((t=x(t^t>>>13,3266489909))^t>>>16)}function hashMerge(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return pe[r]=!0,pe[v]=he.entries,pe.__toJS=he.toObject,pe.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+quoteString(e)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(e,t){return reify(this,filterFactory(this,e,t,!1))},findIndex:function(e,t){var r=this.findEntry(e,t);return r?r[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(e,t){return reify(this,sliceFactory(this,e,t,!1))},splice:function(e,t){var r=arguments.length;if(t=Math.max(0|t,0),0===r||2===r&&!t)return this;e=resolveBegin(e,e<0?this.count():this.size);var n=this.slice(0,e);return reify(this,1===r?n:n.concat(arrCopy(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var r=this.findLastEntry(e,t);return r?r[0]:-1},first:function(){return this.get(0)},flatten:function(e){return reify(this,flattenFactory(this,e,!1))},get:function(e,t){return(e=wrapIndex(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,r){return r===e}),void 0,t)},has:function(e){return(e=wrapIndex(this,e))>=0&&(void 0!==this.size?this.size===1/0||e{"function"==typeof Object.create?e.exports=function inherits(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function inherits(e,t){if(t){e.super_=t;var TempCtor=function(){};TempCtor.prototype=t.prototype,e.prototype=new TempCtor,e.prototype.constructor=e}}},8552:(e,t,r)=>{var n=r(852)(r(5639),"DataView");e.exports=n},1989:(e,t,r)=>{var n=r(1789),i=r(401),o=r(7667),a=r(1327),s=r(1866);function Hash(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(7040),i=r(4125),o=r(2117),a=r(7518),s=r(4705);function ListCache(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(852)(r(5639),"Map");e.exports=n},3369:(e,t,r)=>{var n=r(4785),i=r(1285),o=r(6e3),a=r(9916),s=r(5265);function MapCache(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(852)(r(5639),"Promise");e.exports=n},8525:(e,t,r)=>{var n=r(852)(r(5639),"Set");e.exports=n},8668:(e,t,r)=>{var n=r(3369),i=r(619),o=r(2385);function SetCache(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new n;++t{var n=r(8407),i=r(7465),o=r(3779),a=r(7599),s=r(4758),u=r(4309);function Stack(e){var t=this.__data__=new n(e);this.size=t.size}Stack.prototype.clear=i,Stack.prototype.delete=o,Stack.prototype.get=a,Stack.prototype.has=s,Stack.prototype.set=u,e.exports=Stack},2705:(e,t,r)=>{var n=r(5639).Symbol;e.exports=n},1149:(e,t,r)=>{var n=r(5639).Uint8Array;e.exports=n},577:(e,t,r)=>{var n=r(852)(r(5639),"WeakMap");e.exports=n},4963:e=>{e.exports=function arrayFilter(e,t){for(var r=-1,n=null==e?0:e.length,i=0,o=[];++r{var n=r(2545),i=r(5694),o=r(1469),a=r(4144),s=r(5776),u=r(6719),c=Object.prototype.hasOwnProperty;e.exports=function arrayLikeKeys(e,t){var r=o(e),f=!r&&i(e),l=!r&&!f&&a(e),h=!r&&!f&&!l&&u(e),p=r||f||l||h,d=p?n(e.length,String):[],_=d.length;for(var g in e)!t&&!c.call(e,g)||p&&("length"==g||l&&("offset"==g||"parent"==g)||h&&("buffer"==g||"byteLength"==g||"byteOffset"==g)||s(g,_))||d.push(g);return d}},9932:e=>{e.exports=function arrayMap(e,t){for(var r=-1,n=null==e?0:e.length,i=Array(n);++r{e.exports=function arrayPush(e,t){for(var r=-1,n=t.length,i=e.length;++r{e.exports=function arrayReduce(e,t,r,n){var i=-1,o=null==e?0:e.length;for(n&&o&&(r=e[++i]);++i{e.exports=function arraySome(e,t){for(var r=-1,n=null==e?0:e.length;++r{e.exports=function asciiToArray(e){return e.split("")}},9029:e=>{var t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=function asciiWords(e){return e.match(t)||[]}},4865:(e,t,r)=>{var n=r(9465),i=r(7813),o=Object.prototype.hasOwnProperty;e.exports=function assignValue(e,t,r){var a=e[t];o.call(e,t)&&i(a,r)&&(void 0!==r||t in e)||n(e,t,r)}},8470:(e,t,r)=>{var n=r(7813);e.exports=function assocIndexOf(e,t){for(var r=e.length;r--;)if(n(e[r][0],t))return r;return-1}},9465:(e,t,r)=>{var n=r(8777);e.exports=function baseAssignValue(e,t,r){"__proto__"==t&&n?n(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}},9881:(e,t,r)=>{var n=r(7816),i=r(9291)(n);e.exports=i},1848:e=>{e.exports=function baseFindIndex(e,t,r,n){for(var i=e.length,o=r+(n?1:-1);n?o--:++o{var n=r(5063)();e.exports=n},7816:(e,t,r)=>{var n=r(8483),i=r(3674);e.exports=function baseForOwn(e,t){return e&&n(e,t,i)}},7786:(e,t,r)=>{var n=r(1811),i=r(327);e.exports=function baseGet(e,t){for(var r=0,o=(t=n(t,e)).length;null!=e&&r{var n=r(2488),i=r(1469);e.exports=function baseGetAllKeys(e,t,r){var o=t(e);return i(e)?o:n(o,r(e))}},4239:(e,t,r)=>{var n=r(2705),i=r(9607),o=r(2333),a=n?n.toStringTag:void 0;e.exports=function baseGetTag(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":a&&a in Object(e)?i(e):o(e)}},13:e=>{e.exports=function baseHasIn(e,t){return null!=e&&t in Object(e)}},9454:(e,t,r)=>{var n=r(4239),i=r(7005);e.exports=function baseIsArguments(e){return i(e)&&"[object Arguments]"==n(e)}},939:(e,t,r)=>{var n=r(2492),i=r(7005);e.exports=function baseIsEqual(e,t,r,o,a){return e===t||(null==e||null==t||!i(e)&&!i(t)?e!=e&&t!=t:n(e,t,r,o,baseIsEqual,a))}},2492:(e,t,r)=>{var n=r(6384),i=r(7114),o=r(8351),a=r(6096),s=r(4160),u=r(1469),c=r(4144),f=r(6719),l="[object Arguments]",h="[object Array]",p="[object Object]",d=Object.prototype.hasOwnProperty;e.exports=function baseIsEqualDeep(e,t,r,_,g,v){var m=u(e),b=u(t),w=m?h:s(e),I=b?h:s(t),x=(w=w==l?p:w)==p,B=(I=I==l?p:I)==p,k=w==I;if(k&&c(e)){if(!c(t))return!1;m=!0,x=!1}if(k&&!x)return v||(v=new n),m||f(e)?i(e,t,r,_,g,v):o(e,t,w,r,_,g,v);if(!(1&r)){var A=x&&d.call(e,"__wrapped__"),M=B&&d.call(t,"__wrapped__");if(A||M){var q=A?e.value():e,j=M?t.value():t;return v||(v=new n),g(q,j,r,_,v)}}return!!k&&(v||(v=new n),a(e,t,r,_,g,v))}},2958:(e,t,r)=>{var n=r(6384),i=r(939);e.exports=function baseIsMatch(e,t,r,o){var a=r.length,s=a,u=!o;if(null==e)return!s;for(e=Object(e);a--;){var c=r[a];if(u&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++a{var n=r(3560),i=r(5346),o=r(3218),a=r(346),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,l=c.hasOwnProperty,h=RegExp("^"+f.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function baseIsNative(e){return!(!o(e)||i(e))&&(n(e)?h:s).test(a(e))}},8749:(e,t,r)=>{var n=r(4239),i=r(1780),o=r(7005),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,e.exports=function baseIsTypedArray(e){return o(e)&&i(e.length)&&!!a[n(e)]}},7206:(e,t,r)=>{var n=r(1573),i=r(6432),o=r(6557),a=r(1469),s=r(9601);e.exports=function baseIteratee(e){return"function"==typeof e?e:null==e?o:"object"==typeof e?a(e)?i(e[0],e[1]):n(e):s(e)}},280:(e,t,r)=>{var n=r(5726),i=r(6916),o=Object.prototype.hasOwnProperty;e.exports=function baseKeys(e){if(!n(e))return i(e);var t=[];for(var r in Object(e))o.call(e,r)&&"constructor"!=r&&t.push(r);return t}},1573:(e,t,r)=>{var n=r(2958),i=r(1499),o=r(2634);e.exports=function baseMatches(e){var t=i(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(r){return r===e||n(r,e,t)}}},6432:(e,t,r)=>{var n=r(939),i=r(7361),o=r(9095),a=r(5403),s=r(9162),u=r(2634),c=r(327);e.exports=function baseMatchesProperty(e,t){return a(e)&&s(t)?u(c(e),t):function(r){var a=i(r,e);return void 0===a&&a===t?o(r,e):n(t,a,3)}}},371:e=>{e.exports=function baseProperty(e){return function(t){return null==t?void 0:t[e]}}},9152:(e,t,r)=>{var n=r(7786);e.exports=function basePropertyDeep(e){return function(t){return n(t,e)}}},8674:e=>{e.exports=function basePropertyOf(e){return function(t){return null==e?void 0:e[t]}}},4259:e=>{e.exports=function baseSlice(e,t,r){var n=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(r=r>i?i:r)<0&&(r+=i),i=t>r?0:r-t>>>0,t>>>=0;for(var o=Array(i);++n{var n=r(9881);e.exports=function baseSome(e,t){var r;return n(e,(function(e,n,i){return!(r=t(e,n,i))})),!!r}},2545:e=>{e.exports=function baseTimes(e,t){for(var r=-1,n=Array(e);++r{var n=r(2705),i=r(9932),o=r(1469),a=r(3448),s=n?n.prototype:void 0,u=s?s.toString:void 0;e.exports=function baseToString(e){if("string"==typeof e)return e;if(o(e))return i(e,baseToString)+"";if(a(e))return u?u.call(e):"";var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t}},7561:(e,t,r)=>{var n=r(7990),i=/^\s+/;e.exports=function baseTrim(e){return e?e.slice(0,n(e)+1).replace(i,""):e}},1717:e=>{e.exports=function baseUnary(e){return function(t){return e(t)}}},1757:e=>{e.exports=function baseZipObject(e,t,r){for(var n=-1,i=e.length,o=t.length,a={};++n{e.exports=function cacheHas(e,t){return e.has(t)}},1811:(e,t,r)=>{var n=r(1469),i=r(5403),o=r(5514),a=r(9833);e.exports=function castPath(e,t){return n(e)?e:i(e,t)?[e]:o(a(e))}},180:(e,t,r)=>{var n=r(4259);e.exports=function castSlice(e,t,r){var i=e.length;return r=void 0===r?i:r,!t&&r>=i?e:n(e,t,r)}},4429:(e,t,r)=>{var n=r(5639)["__core-js_shared__"];e.exports=n},9291:(e,t,r)=>{var n=r(8612);e.exports=function createBaseEach(e,t){return function(r,i){if(null==r)return r;if(!n(r))return e(r,i);for(var o=r.length,a=t?o:-1,s=Object(r);(t?a--:++a{e.exports=function createBaseFor(e){return function(t,r,n){for(var i=-1,o=Object(t),a=n(t),s=a.length;s--;){var u=a[e?s:++i];if(!1===r(o[u],u,o))break}return t}}},8805:(e,t,r)=>{var n=r(180),i=r(2689),o=r(3140),a=r(9833);e.exports=function createCaseFirst(e){return function(t){t=a(t);var r=i(t)?o(t):void 0,s=r?r[0]:t.charAt(0),u=r?n(r,1).join(""):t.slice(1);return s[e]()+u}}},5393:(e,t,r)=>{var n=r(2663),i=r(3816),o=r(8748),a=RegExp("['’]","g");e.exports=function createCompounder(e){return function(t){return n(o(i(t).replace(a,"")),e,"")}}},7740:(e,t,r)=>{var n=r(7206),i=r(8612),o=r(3674);e.exports=function createFind(e){return function(t,r,a){var s=Object(t);if(!i(t)){var u=n(r,3);t=o(t),r=function(e){return u(s[e],e,s)}}var c=e(t,r,a);return c>-1?s[u?t[c]:c]:void 0}}},9389:(e,t,r)=>{var n=r(8674)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});e.exports=n},8777:(e,t,r)=>{var n=r(852),i=function(){try{var e=n(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=i},7114:(e,t,r)=>{var n=r(8668),i=r(2908),o=r(4757);e.exports=function equalArrays(e,t,r,a,s,u){var c=1&r,f=e.length,l=t.length;if(f!=l&&!(c&&l>f))return!1;var h=u.get(e),p=u.get(t);if(h&&p)return h==t&&p==e;var d=-1,_=!0,g=2&r?new n:void 0;for(u.set(e,t),u.set(t,e);++d{var n=r(2705),i=r(1149),o=r(7813),a=r(7114),s=r(8776),u=r(1814),c=n?n.prototype:void 0,f=c?c.valueOf:void 0;e.exports=function equalByTag(e,t,r,n,c,l,h){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!l(new i(e),new i(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return o(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var p=s;case"[object Set]":var d=1&n;if(p||(p=u),e.size!=t.size&&!d)return!1;var _=h.get(e);if(_)return _==t;n|=2,h.set(e,t);var g=a(p(e),p(t),n,c,l,h);return h.delete(e),g;case"[object Symbol]":if(f)return f.call(e)==f.call(t)}return!1}},6096:(e,t,r)=>{var n=r(8234),i=Object.prototype.hasOwnProperty;e.exports=function equalObjects(e,t,r,o,a,s){var u=1&r,c=n(e),f=c.length;if(f!=n(t).length&&!u)return!1;for(var l=f;l--;){var h=c[l];if(!(u?h in t:i.call(t,h)))return!1}var p=s.get(e),d=s.get(t);if(p&&d)return p==t&&d==e;var _=!0;s.set(e,t),s.set(t,e);for(var g=u;++l{var n="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g;e.exports=n},8234:(e,t,r)=>{var n=r(8866),i=r(9551),o=r(3674);e.exports=function getAllKeys(e){return n(e,o,i)}},5050:(e,t,r)=>{var n=r(7019);e.exports=function getMapData(e,t){var r=e.__data__;return n(t)?r["string"==typeof t?"string":"hash"]:r.map}},1499:(e,t,r)=>{var n=r(9162),i=r(3674);e.exports=function getMatchData(e){for(var t=i(e),r=t.length;r--;){var o=t[r],a=e[o];t[r]=[o,a,n(a)]}return t}},852:(e,t,r)=>{var n=r(8458),i=r(7801);e.exports=function getNative(e,t){var r=i(e,t);return n(r)?r:void 0}},9607:(e,t,r)=>{var n=r(2705),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,s=n?n.toStringTag:void 0;e.exports=function getRawTag(e){var t=o.call(e,s),r=e[s];try{e[s]=void 0;var n=!0}catch(e){}var i=a.call(e);return n&&(t?e[s]=r:delete e[s]),i}},9551:(e,t,r)=>{var n=r(4963),i=r(479),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(e){return null==e?[]:(e=Object(e),n(a(e),(function(t){return o.call(e,t)})))}:i;e.exports=s},4160:(e,t,r)=>{var n=r(8552),i=r(7071),o=r(3818),a=r(8525),s=r(577),u=r(4239),c=r(346),f="[object Map]",l="[object Promise]",h="[object Set]",p="[object WeakMap]",d="[object DataView]",_=c(n),g=c(i),v=c(o),m=c(a),b=c(s),w=u;(n&&w(new n(new ArrayBuffer(1)))!=d||i&&w(new i)!=f||o&&w(o.resolve())!=l||a&&w(new a)!=h||s&&w(new s)!=p)&&(w=function(e){var t=u(e),r="[object Object]"==t?e.constructor:void 0,n=r?c(r):"";if(n)switch(n){case _:return d;case g:return f;case v:return l;case m:return h;case b:return p}return t}),e.exports=w},7801:e=>{e.exports=function getValue(e,t){return null==e?void 0:e[t]}},222:(e,t,r)=>{var n=r(1811),i=r(5694),o=r(1469),a=r(5776),s=r(1780),u=r(327);e.exports=function hasPath(e,t,r){for(var c=-1,f=(t=n(t,e)).length,l=!1;++c{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function hasUnicode(e){return t.test(e)}},3157:e=>{var t=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function hasUnicodeWord(e){return t.test(e)}},1789:(e,t,r)=>{var n=r(4536);e.exports=function hashClear(){this.__data__=n?n(null):{},this.size=0}},401:e=>{e.exports=function hashDelete(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},7667:(e,t,r)=>{var n=r(4536),i=Object.prototype.hasOwnProperty;e.exports=function hashGet(e){var t=this.__data__;if(n){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return i.call(t,e)?t[e]:void 0}},1327:(e,t,r)=>{var n=r(4536),i=Object.prototype.hasOwnProperty;e.exports=function hashHas(e){var t=this.__data__;return n?void 0!==t[e]:i.call(t,e)}},1866:(e,t,r)=>{var n=r(4536);e.exports=function hashSet(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=n&&void 0===t?"__lodash_hash_undefined__":t,this}},5776:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function isIndex(e,r){var n=typeof e;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&t.test(e))&&e>-1&&e%1==0&&e{var n=r(7813),i=r(8612),o=r(5776),a=r(3218);e.exports=function isIterateeCall(e,t,r){if(!a(r))return!1;var s=typeof t;return!!("number"==s?i(r)&&o(t,r.length):"string"==s&&t in r)&&n(r[t],e)}},5403:(e,t,r)=>{var n=r(1469),i=r(3448),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function isKey(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!i(e))||(a.test(e)||!o.test(e)||null!=t&&e in Object(t))}},7019:e=>{e.exports=function isKeyable(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},5346:(e,t,r)=>{var n,i=r(4429),o=(n=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function isMasked(e){return!!o&&o in e}},5726:e=>{var t=Object.prototype;e.exports=function isPrototype(e){var r=e&&e.constructor;return e===("function"==typeof r&&r.prototype||t)}},9162:(e,t,r)=>{var n=r(3218);e.exports=function isStrictComparable(e){return e==e&&!n(e)}},7040:e=>{e.exports=function listCacheClear(){this.__data__=[],this.size=0}},4125:(e,t,r)=>{var n=r(8470),i=Array.prototype.splice;e.exports=function listCacheDelete(e){var t=this.__data__,r=n(t,e);return!(r<0)&&(r==t.length-1?t.pop():i.call(t,r,1),--this.size,!0)}},2117:(e,t,r)=>{var n=r(8470);e.exports=function listCacheGet(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},7518:(e,t,r)=>{var n=r(8470);e.exports=function listCacheHas(e){return n(this.__data__,e)>-1}},4705:(e,t,r)=>{var n=r(8470);e.exports=function listCacheSet(e,t){var r=this.__data__,i=n(r,e);return i<0?(++this.size,r.push([e,t])):r[i][1]=t,this}},4785:(e,t,r)=>{var n=r(1989),i=r(8407),o=r(7071);e.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new n,map:new(o||i),string:new n}}},1285:(e,t,r)=>{var n=r(5050);e.exports=function mapCacheDelete(e){var t=n(this,e).delete(e);return this.size-=t?1:0,t}},6e3:(e,t,r)=>{var n=r(5050);e.exports=function mapCacheGet(e){return n(this,e).get(e)}},9916:(e,t,r)=>{var n=r(5050);e.exports=function mapCacheHas(e){return n(this,e).has(e)}},5265:(e,t,r)=>{var n=r(5050);e.exports=function mapCacheSet(e,t){var r=n(this,e),i=r.size;return r.set(e,t),this.size+=r.size==i?0:1,this}},8776:e=>{e.exports=function mapToArray(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}},2634:e=>{e.exports=function matchesStrictComparable(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}},4523:(e,t,r)=>{var n=r(8306);e.exports=function memoizeCapped(e){var t=n(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}},4536:(e,t,r)=>{var n=r(852)(Object,"create");e.exports=n},6916:(e,t,r)=>{var n=r(5569)(Object.keys,Object);e.exports=n},1167:(e,t,r)=>{e=r.nmd(e);var n=r(1957),i=t&&!t.nodeType&&t,o=i&&e&&!e.nodeType&&e,a=o&&o.exports===i&&n.process,s=function(){try{var e=o&&o.require&&o.require("util").types;return e||a&&a.binding&&a.binding("util")}catch(e){}}();e.exports=s},2333:e=>{var t=Object.prototype.toString;e.exports=function objectToString(e){return t.call(e)}},5569:e=>{e.exports=function overArg(e,t){return function(r){return e(t(r))}}},5639:(e,t,r)=>{var n=r(1957),i="object"==typeof self&&self&&self.Object===Object&&self,o=n||i||Function("return this")();e.exports=o},619:e=>{e.exports=function setCacheAdd(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},2385:e=>{e.exports=function setCacheHas(e){return this.__data__.has(e)}},1814:e=>{e.exports=function setToArray(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},7465:(e,t,r)=>{var n=r(8407);e.exports=function stackClear(){this.__data__=new n,this.size=0}},3779:e=>{e.exports=function stackDelete(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},7599:e=>{e.exports=function stackGet(e){return this.__data__.get(e)}},4758:e=>{e.exports=function stackHas(e){return this.__data__.has(e)}},4309:(e,t,r)=>{var n=r(8407),i=r(7071),o=r(3369);e.exports=function stackSet(e,t){var r=this.__data__;if(r instanceof n){var a=r.__data__;if(!i||a.length<199)return a.push([e,t]),this.size=++r.size,this;r=this.__data__=new o(a)}return r.set(e,t),this.size=r.size,this}},3140:(e,t,r)=>{var n=r(4286),i=r(2689),o=r(676);e.exports=function stringToArray(e){return i(e)?o(e):n(e)}},5514:(e,t,r)=>{var n=r(4523),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,a=n((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(i,(function(e,r,n,i){t.push(n?i.replace(o,"$1"):r||e)})),t}));e.exports=a},327:(e,t,r)=>{var n=r(3448);e.exports=function toKey(e){if("string"==typeof e||n(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t}},346:e=>{var t=Function.prototype.toString;e.exports=function toSource(e){if(null!=e){try{return t.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},7990:e=>{var t=/\s/;e.exports=function trimmedEndIndex(e){for(var r=e.length;r--&&t.test(e.charAt(r)););return r}},676:e=>{var t="\\ud800-\\udfff",r="["+t+"]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",i="\\ud83c[\\udffb-\\udfff]",o="[^"+t+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="(?:"+n+"|"+i+")"+"?",c="[\\ufe0e\\ufe0f]?",f=c+u+("(?:\\u200d(?:"+[o,a,s].join("|")+")"+c+u+")*"),l="(?:"+[o+n+"?",n,a,s,r].join("|")+")",h=RegExp(i+"(?="+i+")|"+l+f,"g");e.exports=function unicodeToArray(e){return e.match(h)||[]}},2757:e=>{var t="\\ud800-\\udfff",r="\\u2700-\\u27bf",n="a-z\\xdf-\\xf6\\xf8-\\xff",i="A-Z\\xc0-\\xd6\\xd8-\\xde",o="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",a="["+o+"]",s="\\d+",u="["+r+"]",c="["+n+"]",f="[^"+t+o+s+r+n+i+"]",l="(?:\\ud83c[\\udde6-\\uddff]){2}",h="[\\ud800-\\udbff][\\udc00-\\udfff]",p="["+i+"]",d="(?:"+c+"|"+f+")",_="(?:"+p+"|"+f+")",g="(?:['’](?:d|ll|m|re|s|t|ve))?",v="(?:['’](?:D|LL|M|RE|S|T|VE))?",m="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",b="[\\ufe0e\\ufe0f]?",w=b+m+("(?:\\u200d(?:"+["[^"+t+"]",l,h].join("|")+")"+b+m+")*"),I="(?:"+[u,l,h].join("|")+")"+w,x=RegExp([p+"?"+c+"+"+g+"(?="+[a,p,"$"].join("|")+")",_+"+"+v+"(?="+[a,p+d,"$"].join("|")+")",p+"?"+d+"+"+g,p+"+"+v,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",s,I].join("|"),"g");e.exports=function unicodeWords(e){return e.match(x)||[]}},8929:(e,t,r)=>{var n=r(8403),i=r(5393)((function(e,t,r){return t=t.toLowerCase(),e+(r?n(t):t)}));e.exports=i},8403:(e,t,r)=>{var n=r(9833),i=r(1700);e.exports=function capitalize(e){return i(n(e).toLowerCase())}},3816:(e,t,r)=>{var n=r(9389),i=r(9833),o=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,a=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=function deburr(e){return(e=i(e))&&e.replace(o,n).replace(a,"")}},7813:e=>{e.exports=function eq(e,t){return e===t||e!=e&&t!=t}},3311:(e,t,r)=>{var n=r(7740)(r(998));e.exports=n},998:(e,t,r)=>{var n=r(1848),i=r(7206),o=r(554),a=Math.max;e.exports=function findIndex(e,t,r){var s=null==e?0:e.length;if(!s)return-1;var u=null==r?0:o(r);return u<0&&(u=a(s+u,0)),n(e,i(t,3),u)}},7361:(e,t,r)=>{var n=r(7786);e.exports=function get(e,t,r){var i=null==e?void 0:n(e,t);return void 0===i?r:i}},9095:(e,t,r)=>{var n=r(13),i=r(222);e.exports=function hasIn(e,t){return null!=e&&i(e,t,n)}},6557:e=>{e.exports=function identity(e){return e}},5694:(e,t,r)=>{var n=r(9454),i=r(7005),o=Object.prototype,a=o.hasOwnProperty,s=o.propertyIsEnumerable,u=n(function(){return arguments}())?n:function(e){return i(e)&&a.call(e,"callee")&&!s.call(e,"callee")};e.exports=u},1469:e=>{var t=Array.isArray;e.exports=t},8612:(e,t,r)=>{var n=r(3560),i=r(1780);e.exports=function isArrayLike(e){return null!=e&&i(e.length)&&!n(e)}},4144:(e,t,r)=>{e=r.nmd(e);var n=r(5639),i=r(5062),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,s=a&&a.exports===o?n.Buffer:void 0,u=(s?s.isBuffer:void 0)||i;e.exports=u},3560:(e,t,r)=>{var n=r(4239),i=r(3218);e.exports=function isFunction(e){if(!i(e))return!1;var t=n(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},1780:e=>{e.exports=function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},3218:e=>{e.exports=function isObject(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},7005:e=>{e.exports=function isObjectLike(e){return null!=e&&"object"==typeof e}},3448:(e,t,r)=>{var n=r(4239),i=r(7005);e.exports=function isSymbol(e){return"symbol"==typeof e||i(e)&&"[object Symbol]"==n(e)}},6719:(e,t,r)=>{var n=r(8749),i=r(1717),o=r(1167),a=o&&o.isTypedArray,s=a?i(a):n;e.exports=s},3674:(e,t,r)=>{var n=r(4636),i=r(280),o=r(8612);e.exports=function keys(e){return o(e)?n(e):i(e)}},8306:(e,t,r)=>{var n=r(3369);function memoize(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var memoized=function(){var r=arguments,n=t?t.apply(this,r):r[0],i=memoized.cache;if(i.has(n))return i.get(n);var o=e.apply(this,r);return memoized.cache=i.set(n,o)||i,o};return memoized.cache=new(memoize.Cache||n),memoized}memoize.Cache=n,e.exports=memoize},9601:(e,t,r)=>{var n=r(371),i=r(9152),o=r(5403),a=r(327);e.exports=function property(e){return o(e)?n(a(e)):i(e)}},9704:(e,t,r)=>{var n=r(2908),i=r(7206),o=r(5076),a=r(1469),s=r(6612);e.exports=function some(e,t,r){var u=a(e)?n:o;return r&&s(e,t,r)&&(t=void 0),u(e,i(t,3))}},479:e=>{e.exports=function stubArray(){return[]}},5062:e=>{e.exports=function stubFalse(){return!1}},8601:(e,t,r)=>{var n=r(4841),i=1/0;e.exports=function toFinite(e){return e?(e=n(e))===i||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},554:(e,t,r)=>{var n=r(8601);e.exports=function toInteger(e){var t=n(e),r=t%1;return t==t?r?t-r:t:0}},4841:(e,t,r)=>{var n=r(7561),i=r(3218),o=r(3448),a=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,c=parseInt;e.exports=function toNumber(e){if("number"==typeof e)return e;if(o(e))return NaN;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=n(e);var r=s.test(e);return r||u.test(e)?c(e.slice(2),r?2:8):a.test(e)?NaN:+e}},9833:(e,t,r)=>{var n=r(531);e.exports=function toString(e){return null==e?"":n(e)}},1700:(e,t,r)=>{var n=r(8805)("toUpperCase");e.exports=n},8748:(e,t,r)=>{var n=r(9029),i=r(3157),o=r(9833),a=r(2757);e.exports=function words(e,t,r){return e=o(e),void 0===(t=r?void 0:t)?i(e)?a(e):n(e):e.match(t)||[]}},7287:(e,t,r)=>{var n=r(4865),i=r(1757);e.exports=function zipObject(e,t){return i(e||[],t||[],n)}},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;e.exports=function shouldUseNative(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(e){n[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,i){for(var o,a,s=function toObject(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),u=1;u{var t,r,n=e.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(t===setTimeout)return setTimeout(e,0);if((t===defaultSetTimout||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(r){try{return t.call(null,e,0)}catch(r){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){t=defaultSetTimout}try{r="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){r=defaultClearTimeout}}();var i,o=[],a=!1,s=-1;function cleanUpNextTick(){a&&i&&(a=!1,i.length?o=i.concat(o):s=-1,o.length&&drainQueue())}function drainQueue(){if(!a){var e=runTimeout(cleanUpNextTick);a=!0;for(var t=o.length;t;){for(i=o,o=[];++s1)for(var r=1;r{"use strict";var n=r(4155),i=65536,o=4294967295;var a=r(9509).Buffer,s=r.g.crypto||r.g.msCrypto;s&&s.getRandomValues?e.exports=function randomBytes(e,t){if(e>o)throw new RangeError("requested too many random bytes");var r=a.allocUnsafe(e);if(e>0)if(e>i)for(var u=0;u{"use strict";var n=r(7418),i=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var a=60109,s=60110,u=60112;t.Suspense=60113;var c=60115,f=60116;if("function"==typeof Symbol&&Symbol.for){var l=Symbol.for;i=l("react.element"),o=l("react.portal"),t.Fragment=l("react.fragment"),t.StrictMode=l("react.strict_mode"),t.Profiler=l("react.profiler"),a=l("react.provider"),s=l("react.context"),u=l("react.forward_ref"),t.Suspense=l("react.suspense"),c=l("react.memo"),f=l("react.lazy")}var h="function"==typeof Symbol&&Symbol.iterator;function z(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r{"use strict";e.exports=r(2408)},9509:(e,t,r)=>{var n=r(8764),i=n.Buffer;function copyProps(e,t){for(var r in e)t[r]=e[r]}function SafeBuffer(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=n:(copyProps(n,t),t.Buffer=SafeBuffer),SafeBuffer.prototype=Object.create(i.prototype),copyProps(i,SafeBuffer),SafeBuffer.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,r)},SafeBuffer.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},SafeBuffer.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},SafeBuffer.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n.SlowBuffer(e)}},4189:(e,t,r)=>{var n=r(9509).Buffer;function Hash(e,t){this._block=n.alloc(e),this._finalSize=t,this._blockSize=e,this._len=0}Hash.prototype.update=function(e,t){"string"==typeof e&&(t=t||"utf8",e=n.from(e,t));for(var r=this._block,i=this._blockSize,o=e.length,a=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var o=this._hash();return e?o.toString(e):o},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=Hash},9072:(e,t,r)=>{var n=e.exports=function SHA(e){e=e.toLowerCase();var t=n[e];if(!t)throw new Error(e+" is not supported (we accept pull requests)");return new t};n.sha=r(4448),n.sha1=r(8336),n.sha224=r(8432),n.sha256=r(7499),n.sha384=r(1686),n.sha512=r(8862)},4448:(e,t,r)=>{var n=r(5717),i=r(4189),o=r(9509).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha(){this.init(),this._w=s,i.call(this,64,56)}function rotl30(e){return e<<30|e>>>2}function ft(e,t,r,n){return 0===e?t&r|~t&n:2===e?t&r|t&n|r&n:t^r^n}n(Sha,i),Sha.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=e.readInt32BE(4*c);for(;c<80;++c)r[c]=r[c-3]^r[c-8]^r[c-14]^r[c-16];for(var f=0;f<80;++f){var l=~~(f/20),h=0|((t=n)<<5|t>>>27)+ft(l,i,o,s)+u+r[f]+a[l];u=s,s=o,o=rotl30(i),i=n,n=h}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha.prototype._hash=function(){var e=o.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=Sha},8336:(e,t,r)=>{var n=r(5717),i=r(4189),o=r(9509).Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function Sha1(){this.init(),this._w=s,i.call(this,64,56)}function rotl5(e){return e<<5|e>>>27}function rotl30(e){return e<<30|e>>>2}function ft(e,t,r,n){return 0===e?t&r|~t&n:2===e?t&r|t&n|r&n:t^r^n}n(Sha1,i),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0;c<16;++c)r[c]=e.readInt32BE(4*c);for(;c<80;++c)r[c]=(t=r[c-3]^r[c-8]^r[c-14]^r[c-16])<<1|t>>>31;for(var f=0;f<80;++f){var l=~~(f/20),h=rotl5(n)+ft(l,i,o,s)+u+r[f]+a[l]|0;u=s,s=o,o=rotl30(i),i=n,n=h}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0},Sha1.prototype._hash=function(){var e=o.allocUnsafe(20);return e.writeInt32BE(0|this._a,0),e.writeInt32BE(0|this._b,4),e.writeInt32BE(0|this._c,8),e.writeInt32BE(0|this._d,12),e.writeInt32BE(0|this._e,16),e},e.exports=Sha1},8432:(e,t,r)=>{var n=r(5717),i=r(7499),o=r(4189),a=r(9509).Buffer,s=new Array(64);function Sha224(){this.init(),this._w=s,o.call(this,64,56)}n(Sha224,i),Sha224.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},Sha224.prototype._hash=function(){var e=a.allocUnsafe(28);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e},e.exports=Sha224},7499:(e,t,r)=>{var n=r(5717),i=r(4189),o=r(9509).Buffer,a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function Sha256(){this.init(),this._w=s,i.call(this,64,56)}function ch(e,t,r){return r^e&(t^r)}function maj(e,t,r){return e&t|r&(e|t)}function sigma0(e){return(e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10)}function sigma1(e){return(e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7)}function gamma0(e){return(e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3}n(Sha256,i),Sha256.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},Sha256.prototype._update=function(e){for(var t,r=this._w,n=0|this._a,i=0|this._b,o=0|this._c,s=0|this._d,u=0|this._e,c=0|this._f,f=0|this._g,l=0|this._h,h=0;h<16;++h)r[h]=e.readInt32BE(4*h);for(;h<64;++h)r[h]=0|(((t=r[h-2])>>>17|t<<15)^(t>>>19|t<<13)^t>>>10)+r[h-7]+gamma0(r[h-15])+r[h-16];for(var p=0;p<64;++p){var d=l+sigma1(u)+ch(u,c,f)+a[p]+r[p]|0,_=sigma0(n)+maj(n,i,o)|0;l=f,f=c,c=u,u=s+d|0,s=o,o=i,i=n,n=d+_|0}this._a=n+this._a|0,this._b=i+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=u+this._e|0,this._f=c+this._f|0,this._g=f+this._g|0,this._h=l+this._h|0},Sha256.prototype._hash=function(){var e=o.allocUnsafe(32);return e.writeInt32BE(this._a,0),e.writeInt32BE(this._b,4),e.writeInt32BE(this._c,8),e.writeInt32BE(this._d,12),e.writeInt32BE(this._e,16),e.writeInt32BE(this._f,20),e.writeInt32BE(this._g,24),e.writeInt32BE(this._h,28),e},e.exports=Sha256},1686:(e,t,r)=>{var n=r(5717),i=r(8862),o=r(4189),a=r(9509).Buffer,s=new Array(160);function Sha384(){this.init(),this._w=s,o.call(this,128,112)}n(Sha384,i),Sha384.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Sha384.prototype._hash=function(){var e=a.allocUnsafe(48);function writeInt64BE(t,r,n){e.writeInt32BE(t,n),e.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),e},e.exports=Sha384},8862:(e,t,r)=>{var n=r(5717),i=r(4189),o=r(9509).Buffer,a=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function Sha512(){this.init(),this._w=s,i.call(this,128,112)}function Ch(e,t,r){return r^e&(t^r)}function maj(e,t,r){return e&t|r&(e|t)}function sigma0(e,t){return(e>>>28|t<<4)^(t>>>2|e<<30)^(t>>>7|e<<25)}function sigma1(e,t){return(e>>>14|t<<18)^(e>>>18|t<<14)^(t>>>9|e<<23)}function Gamma0(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^e>>>7}function Gamma0l(e,t){return(e>>>1|t<<31)^(e>>>8|t<<24)^(e>>>7|t<<25)}function Gamma1(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^e>>>6}function Gamma1l(e,t){return(e>>>19|t<<13)^(t>>>29|e<<3)^(e>>>6|t<<26)}function getCarry(e,t){return e>>>0>>0?1:0}n(Sha512,i),Sha512.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sha512.prototype._update=function(e){for(var t=this._w,r=0|this._ah,n=0|this._bh,i=0|this._ch,o=0|this._dh,s=0|this._eh,u=0|this._fh,c=0|this._gh,f=0|this._hh,l=0|this._al,h=0|this._bl,p=0|this._cl,d=0|this._dl,_=0|this._el,g=0|this._fl,v=0|this._gl,m=0|this._hl,b=0;b<32;b+=2)t[b]=e.readInt32BE(4*b),t[b+1]=e.readInt32BE(4*b+4);for(;b<160;b+=2){var w=t[b-30],I=t[b-30+1],x=Gamma0(w,I),B=Gamma0l(I,w),k=Gamma1(w=t[b-4],I=t[b-4+1]),A=Gamma1l(I,w),M=t[b-14],q=t[b-14+1],j=t[b-32],T=t[b-32+1],R=B+q|0,F=x+M+getCarry(R,B)|0;F=(F=F+k+getCarry(R=R+A|0,A)|0)+j+getCarry(R=R+T|0,T)|0,t[b]=F,t[b+1]=R}for(var U=0;U<160;U+=2){F=t[U],R=t[U+1];var W=maj(r,n,i),V=maj(l,h,p),$=sigma0(r,l),H=sigma0(l,r),Z=sigma1(s,_),Y=sigma1(_,s),G=a[U],X=a[U+1],ee=Ch(s,u,c),te=Ch(_,g,v),re=m+Y|0,ne=f+Z+getCarry(re,m)|0;ne=(ne=(ne=ne+ee+getCarry(re=re+te|0,te)|0)+G+getCarry(re=re+X|0,X)|0)+F+getCarry(re=re+R|0,R)|0;var ie=H+V|0,oe=$+W+getCarry(ie,H)|0;f=c,m=v,c=u,v=g,u=s,g=_,s=o+ne+getCarry(_=d+re|0,d)|0,o=i,d=p,i=n,p=h,n=r,h=l,r=ne+oe+getCarry(l=re+ie|0,re)|0}this._al=this._al+l|0,this._bl=this._bl+h|0,this._cl=this._cl+p|0,this._dl=this._dl+d|0,this._el=this._el+_|0,this._fl=this._fl+g|0,this._gl=this._gl+v|0,this._hl=this._hl+m|0,this._ah=this._ah+r+getCarry(this._al,l)|0,this._bh=this._bh+n+getCarry(this._bl,h)|0,this._ch=this._ch+i+getCarry(this._cl,p)|0,this._dh=this._dh+o+getCarry(this._dl,d)|0,this._eh=this._eh+s+getCarry(this._el,_)|0,this._fh=this._fh+u+getCarry(this._fl,g)|0,this._gh=this._gh+c+getCarry(this._gl,v)|0,this._hh=this._hh+f+getCarry(this._hl,m)|0},Sha512.prototype._hash=function(){var e=o.allocUnsafe(64);function writeInt64BE(t,r,n){e.writeInt32BE(t,n),e.writeInt32BE(r,n+4)}return writeInt64BE(this._ah,this._al,0),writeInt64BE(this._bh,this._bl,8),writeInt64BE(this._ch,this._cl,16),writeInt64BE(this._dh,this._dl,24),writeInt64BE(this._eh,this._el,32),writeInt64BE(this._fh,this._fl,40),writeInt64BE(this._gh,this._gl,48),writeInt64BE(this._hh,this._hl,56),e},e.exports=Sha512},3101:(e,t,r)=>{var n=r(269),i=r(4122);function _extends(){var t;return e.exports=_extends=n?i(t=n).call(t):function(e){for(var t=1;t{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var r={};return(()=>{"use strict";__webpack_require__.d(r,{default:()=>Ht});var e={};__webpack_require__.r(e),__webpack_require__.d(e,{TOGGLE_CONFIGS:()=>zt,UPDATE_CONFIGS:()=>Rt,loaded:()=>loaded,toggle:()=>toggle,update:()=>update});var t={};__webpack_require__.r(t),__webpack_require__.d(t,{downloadConfig:()=>downloadConfig,getConfigByUrl:()=>getConfigByUrl});var n={};__webpack_require__.r(n),__webpack_require__.d(n,{get:()=>get});var i=__webpack_require__(7294);class StandaloneLayout extends i.Component{render(){const{getComponent:e}=this.props,t=e("Container"),r=e("Row"),n=e("Col"),o=e("Topbar",!0),a=e("BaseLayout",!0),s=e("onlineValidatorBadge",!0);return i.createElement(t,{className:"swagger-ui"},o?i.createElement(o,null):null,i.createElement(a,null),i.createElement(r,null,i.createElement(n,null,i.createElement(s,null))))}}const o=StandaloneLayout,stadalone_layout=()=>({components:{StandaloneLayout:o}});var a=__webpack_require__(3393),s=__webpack_require__.n(a);__webpack_require__(7967),__webpack_require__(8929),__webpack_require__(1700),__webpack_require__(8306),__webpack_require__(3311),__webpack_require__(9704),__webpack_require__(7813),__webpack_require__(3560),__webpack_require__(8269),__webpack_require__(1798),__webpack_require__(9072);const u=function makeWindow(){var e={location:{},history:{},open:()=>{},close:()=>{},File:function(){},FormData:function(){}};if("undefined"==typeof window)return e;try{e=window;for(var t of["File","Blob","FormData"])t in window&&(e[t]=window[t])}catch(e){console.error(e)}return e}();s().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");__webpack_require__(8764).Buffer;const parseSearch=()=>{let e={},t=u.location.search;if(!t)return{};if(""!=t){let r=t.substr(1).split("&");for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&(t=r[t].split("="),e[decodeURIComponent(t[0])]=t[1]&&decodeURIComponent(t[1])||"")}return e};class TopBar extends i.Component{constructor(e,t){super(e,t),this.state={url:e.specSelectors.url(),selectedIndex:0}}UNSAFE_componentWillReceiveProps(e){this.setState({url:e.specSelectors.url()})}onUrlChange=e=>{let{target:{value:t}}=e;this.setState({url:t})};flushAuthData(){const{persistAuthorization:e}=this.props.getConfigs();e||this.props.authActions.restoreAuthorization({authorized:{}})}loadSpec=e=>{this.flushAuthData(),this.props.specActions.updateUrl(e),this.props.specActions.download(e)};onUrlSelect=e=>{let t=e.target.value||e.target.href;this.loadSpec(t),this.setSelectedUrl(t),e.preventDefault()};downloadUrl=e=>{this.loadSpec(this.state.url),e.preventDefault()};setSearch=e=>{let t=parseSearch();t["urls.primaryName"]=e.name;const r=`${window.location.protocol}//${window.location.host}${window.location.pathname}`;var n;window&&window.history&&window.history.pushState&&window.history.replaceState(null,"",`${r}?${n=t,Object.keys(n).map((e=>encodeURIComponent(e)+"="+encodeURIComponent(n[e]))).join("&")}`)};setSelectedUrl=e=>{const t=this.props.getConfigs().urls||[];t&&t.length&&e&&t.forEach(((t,r)=>{t.url===e&&(this.setState({selectedIndex:r}),this.setSearch(t))}))};componentDidMount(){const e=this.props.getConfigs(),t=e.urls||[];if(t&&t.length){var r=this.state.selectedIndex;let n=parseSearch()["urls.primaryName"]||e["urls.primaryName"];n&&t.forEach(((e,t)=>{e.name===n&&(this.setState({selectedIndex:t}),r=t)})),this.loadSpec(t[r].url)}}onFilterChange=e=>{let{target:{value:t}}=e;this.props.layoutActions.updateFilter(t)};render(){let{getComponent:e,specSelectors:t,getConfigs:r}=this.props;const n=e("Button"),o=e("Link"),a=e("Logo");let s="loading"===t.loadingStatus();const u=["download-url-input"];"failed"===t.loadingStatus()&&u.push("failed"),s&&u.push("loading");const{urls:c}=r();let f=[],l=null;if(c){let e=[];c.forEach(((t,r)=>{e.push(i.createElement("option",{key:r,value:t.url},t.name))})),f.push(i.createElement("label",{className:"select-label",htmlFor:"select"},i.createElement("span",null,"Select a definition"),i.createElement("select",{id:"select",disabled:s,onChange:this.onUrlSelect,value:c[this.state.selectedIndex].url},e)))}else l=this.downloadUrl,f.push(i.createElement("input",{className:u.join(" "),type:"text",onChange:this.onUrlChange,value:this.state.url,disabled:s})),f.push(i.createElement(n,{className:"download-url-button",onClick:this.downloadUrl},"Explore"));return i.createElement("div",{className:"topbar"},i.createElement("div",{className:"wrapper"},i.createElement("div",{className:"topbar-wrapper"},i.createElement(o,null,i.createElement(a,null)),i.createElement("form",{className:"download-url-wrapper",onSubmit:l},f.map(((e,t)=>(0,i.cloneElement)(e,{key:t})))))))}}const c=TopBar;var f,l,h,p,d,_,g,v,m,b,w,I,x,B,k,A,M,q,j,T,R,F,U,W,V,$,H,Z,Y,G,X,ee;function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;ti.createElement("svg",_extends({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 407 116"},e),f||(f=i.createElement("defs",null,i.createElement("clipPath",{id:"logo_small_svg__clip-SW_TM-logo-on-dark"},i.createElement("path",{d:"M0 0h407v116H0z"})),i.createElement("style",null,".logo_small_svg__cls-2{fill:#fff}.logo_small_svg__cls-3{fill:#85ea2d}"))),i.createElement("g",{id:"logo_small_svg__SW_TM-logo-on-dark",style:{clipPath:"url(#logo_small_svg__clip-SW_TM-logo-on-dark)"}},i.createElement("g",{id:"logo_small_svg__SW_In-Product",transform:"translate(-.301)"},l||(l=i.createElement("path",{id:"logo_small_svg__Path_2936",d:"M359.15 70.674h-.7v-3.682h-1.26v-.6h3.219v.6h-1.259Z",className:"logo_small_svg__cls-2","data-name":"Path 2936"})),h||(h=i.createElement("path",{id:"logo_small_svg__Path_2937",d:"m363.217 70.674-1.242-3.574h-.023q.05.8.05 1.494v2.083h-.636v-4.286h.987l1.19 3.407h.017l1.225-3.407h.99v4.283h-.675v-2.118a30.29 30.29 0 0 1 .044-1.453h-.023l-1.286 3.571Z",className:"logo_small_svg__cls-2","data-name":"Path 2937"})),p||(p=i.createElement("path",{id:"logo_small_svg__Path_2938",d:"M50.328 97.669a47.642 47.642 0 1 1 47.643-47.642 47.642 47.642 0 0 1-47.643 47.642Z",className:"logo_small_svg__cls-3","data-name":"Path 2938"})),d||(d=i.createElement("path",{id:"logo_small_svg__Path_2939",d:"M50.328 4.769A45.258 45.258 0 1 1 5.07 50.027 45.258 45.258 0 0 1 50.328 4.769m0-4.769a50.027 50.027 0 1 0 50.027 50.027A50.027 50.027 0 0 0 50.328 0Z",className:"logo_small_svg__cls-3","data-name":"Path 2939"})),i.createElement("path",{id:"logo_small_svg__Path_2940",d:"M31.8 33.854c-.154 1.712.058 3.482-.057 5.213a42.665 42.665 0 0 1-.693 5.156 9.53 9.53 0 0 1-4.1 5.829c4.079 2.654 4.54 6.771 4.81 10.946.135 2.25.077 4.52.308 6.752.173 1.731.846 2.174 2.636 2.231.73.02 1.48 0 2.327 0v5.349c-5.29.9-9.657-.6-10.734-5.079a30.76 30.76 0 0 1-.654-5c-.117-1.789.076-3.578-.058-5.367-.386-4.906-1.02-6.56-5.713-6.791v-6.1a9.191 9.191 0 0 1 1.028-.173c2.577-.135 3.674-.924 4.231-3.463a29.3 29.3 0 0 0 .481-4.329 82.1 82.1 0 0 1 .6-8.406c.673-3.982 3.136-5.906 7.234-6.137 1.154-.057 2.327 0 3.655 0v5.464c-.558.038-1.039.115-1.539.115-3.336-.115-3.51 1.02-3.762 3.79Zm6.406 12.658h-.077a3.515 3.515 0 1 0-.346 7.021h.231a3.461 3.461 0 0 0 3.655-3.251v-.192a3.523 3.523 0 0 0-3.461-3.578Zm12.062 0a3.373 3.373 0 0 0-3.482 3.251 1.79 1.79 0 0 0 .02.327 3.3 3.3 0 0 0 3.578 3.443 3.263 3.263 0 0 0 3.443-3.558 3.308 3.308 0 0 0-3.557-3.463Zm12.351 0a3.592 3.592 0 0 0-3.655 3.482 3.529 3.529 0 0 0 3.536 3.539h.039c1.769.309 3.559-1.4 3.674-3.462a3.571 3.571 0 0 0-3.6-3.559Zm16.948.288c-2.232-.1-3.348-.846-3.9-2.962a21.447 21.447 0 0 1-.635-4.136c-.154-2.578-.135-5.175-.308-7.753-.4-6.117-4.828-8.252-11.254-7.195v5.31c1.019 0 1.808 0 2.6.019 1.366.019 2.4.539 2.539 2.059.135 1.385.135 2.789.27 4.193.269 2.79.422 5.618.9 8.369a8.715 8.715 0 0 0 3.921 5.348c-3.4 2.289-4.406 5.559-4.578 9.234-.1 2.52-.154 5.059-.289 7.6-.115 2.308-.923 3.058-3.251 3.116-.654.019-1.289.077-2.019.115v5.445c1.365 0 2.616.077 3.866 0 3.886-.231 6.233-2.117 7-5.887A49.079 49.079 0 0 0 75 63.4c.135-1.923.116-3.866.308-5.771.289-2.982 1.655-4.213 4.636-4.4a4.037 4.037 0 0 0 .828-.192v-6.1c-.5-.058-.843-.115-1.208-.135Z","data-name":"Path 2940",style:{fill:"#173647"}}),_||(_=i.createElement("path",{id:"logo_small_svg__Path_2941",d:"M152.273 58.122a11.228 11.228 0 0 1-4.384 9.424q-4.383 3.382-11.9 3.382-8.14 0-12.524-2.1V63.7a32.9 32.9 0 0 0 6.137 1.879 32.3 32.3 0 0 0 6.575.689q5.322 0 8.015-2.02a6.626 6.626 0 0 0 2.692-5.62 7.222 7.222 0 0 0-.954-3.9 8.885 8.885 0 0 0-3.194-2.8 44.634 44.634 0 0 0-6.81-2.911q-6.387-2.286-9.126-5.417a11.955 11.955 0 0 1-2.74-8.172A10.164 10.164 0 0 1 128.039 27q3.977-3.131 10.52-3.131a31 31 0 0 1 12.555 2.5L149.455 31a28.382 28.382 0 0 0-11.021-2.38 10.668 10.668 0 0 0-6.606 1.816 5.984 5.984 0 0 0-2.38 5.041 7.722 7.722 0 0 0 .877 3.9 8.242 8.242 0 0 0 2.959 2.786 36.7 36.7 0 0 0 6.371 2.8q7.2 2.566 9.91 5.51a10.84 10.84 0 0 1 2.708 7.649Z",className:"logo_small_svg__cls-2","data-name":"Path 2941"})),g||(g=i.createElement("path",{id:"logo_small_svg__Path_2942",d:"M185.288 70.3 179 50.17q-.594-1.848-2.222-8.391h-.251q-1.252 5.479-2.192 8.453L167.849 70.3h-6.011l-9.361-34.315h5.447q3.318 12.931 5.057 19.693a80.112 80.112 0 0 1 1.988 9.111h.25q.345-1.785 1.112-4.618t1.33-4.493l6.294-19.693h5.635l6.137 19.693a66.369 66.369 0 0 1 2.379 9.048h.251a33.163 33.163 0 0 1 .673-3.475q.548-2.347 6.528-25.266h5.385L191.456 70.3Z",className:"logo_small_svg__cls-2","data-name":"Path 2942"})),v||(v=i.createElement("path",{id:"logo_small_svg__Path_2943",d:"m225.115 70.3-1.033-4.885h-.25a14.446 14.446 0 0 1-5.119 4.368 15.608 15.608 0 0 1-6.372 1.143q-5.1 0-8-2.63t-2.9-7.483q0-10.4 16.626-10.9l5.823-.188V47.6q0-4.038-1.738-5.964t-5.552-1.923a22.633 22.633 0 0 0-9.706 2.63l-1.6-3.977a24.437 24.437 0 0 1 5.557-2.16 24.056 24.056 0 0 1 6.058-.783q6.136 0 9.1 2.724t2.959 8.735V70.3Zm-11.741-3.663a10.549 10.549 0 0 0 7.626-2.66 9.845 9.845 0 0 0 2.771-7.451v-3.1l-5.2.219q-6.2.219-8.939 1.926a5.8 5.8 0 0 0-2.74 5.306 5.354 5.354 0 0 0 1.707 4.29 7.081 7.081 0 0 0 4.775 1.472Z",className:"logo_small_svg__cls-2","data-name":"Path 2943"})),m||(m=i.createElement("path",{id:"logo_small_svg__Path_2944",d:"M264.6 35.987v3.287l-6.356.752a11.16 11.16 0 0 1 2.255 6.856 10.148 10.148 0 0 1-3.444 8.047q-3.444 3-9.456 3a15.734 15.734 0 0 1-2.88-.25Q241.4 59.438 241.4 62.1a2.242 2.242 0 0 0 1.159 2.082 8.456 8.456 0 0 0 3.976.673h6.074q5.573 0 8.563 2.348a8.158 8.158 0 0 1 2.99 6.825 9.743 9.743 0 0 1-4.571 8.688q-4.572 2.989-13.338 2.99-6.732 0-10.379-2.5a8.087 8.087 0 0 1-3.647-7.076 7.946 7.946 0 0 1 2-5.417 10.211 10.211 0 0 1 5.636-3.1 5.429 5.429 0 0 1-2.207-1.847 4.89 4.89 0 0 1-.893-2.912 5.53 5.53 0 0 1 1-3.288 10.529 10.529 0 0 1 3.162-2.723 9.275 9.275 0 0 1-4.336-3.726 10.945 10.945 0 0 1-1.675-6.012q0-5.634 3.382-8.688t9.58-3.052a17.439 17.439 0 0 1 4.853.626Zm-27.367 40.075a4.66 4.66 0 0 0 2.348 4.227 12.973 12.973 0 0 0 6.732 1.44q6.543 0 9.69-1.956a5.992 5.992 0 0 0 3.147-5.307q0-2.787-1.723-3.867t-6.481-1.08h-6.23a8.205 8.205 0 0 0-5.51 1.69 6.043 6.043 0 0 0-1.973 4.853Zm2.818-29.086a6.984 6.984 0 0 0 2.035 5.448 8.123 8.123 0 0 0 5.667 1.847q7.608 0 7.608-7.389 0-7.733-7.7-7.733a7.628 7.628 0 0 0-5.635 1.972q-1.976 1.973-1.975 5.855Z",className:"logo_small_svg__cls-2","data-name":"Path 2944"})),b||(b=i.createElement("path",{id:"logo_small_svg__Path_2945",d:"M299.136 35.987v3.287l-6.356.752a11.168 11.168 0 0 1 2.254 6.856 10.145 10.145 0 0 1-3.444 8.047q-3.444 3-9.455 3a15.734 15.734 0 0 1-2.88-.25q-3.32 1.754-3.319 4.415a2.243 2.243 0 0 0 1.158 2.082 8.459 8.459 0 0 0 3.976.673h6.074q5.574 0 8.563 2.348a8.158 8.158 0 0 1 2.99 6.825 9.743 9.743 0 0 1-4.571 8.688q-4.57 2.989-13.337 2.99-6.732 0-10.379-2.5a8.088 8.088 0 0 1-3.648-7.076 7.947 7.947 0 0 1 2-5.417 10.207 10.207 0 0 1 5.636-3.1 5.432 5.432 0 0 1-2.208-1.847 4.889 4.889 0 0 1-.892-2.912 5.53 5.53 0 0 1 1-3.288 10.529 10.529 0 0 1 3.162-2.723 9.271 9.271 0 0 1-4.336-3.726 10.945 10.945 0 0 1-1.675-6.012q0-5.634 3.381-8.688t9.581-3.052a17.444 17.444 0 0 1 4.853.626Zm-27.364 40.075a4.658 4.658 0 0 0 2.348 4.227 12.969 12.969 0 0 0 6.731 1.44q6.544 0 9.691-1.956a5.993 5.993 0 0 0 3.146-5.307q0-2.787-1.722-3.867t-6.481-1.08h-6.23a8.208 8.208 0 0 0-5.511 1.69 6.042 6.042 0 0 0-1.972 4.853Zm2.818-29.086a6.984 6.984 0 0 0 2.035 5.448 8.121 8.121 0 0 0 5.667 1.847q7.607 0 7.608-7.389 0-7.733-7.7-7.733a7.629 7.629 0 0 0-5.635 1.972q-1.975 1.973-1.975 5.855Z",className:"logo_small_svg__cls-2","data-name":"Path 2945"})),w||(w=i.createElement("path",{id:"logo_small_svg__Path_2946",d:"M316.778 70.928q-7.608 0-12.007-4.634t-4.4-12.868q0-8.3 4.086-13.181a13.573 13.573 0 0 1 10.974-4.884 12.938 12.938 0 0 1 10.207 4.239q3.762 4.247 3.762 11.2v3.287h-23.643q.156 6.044 3.053 9.174t8.156 3.131a27.633 27.633 0 0 0 10.958-2.317v4.634a27.5 27.5 0 0 1-5.213 1.706 29.251 29.251 0 0 1-5.933.513Zm-1.409-31.215a8.489 8.489 0 0 0-6.591 2.692 12.416 12.416 0 0 0-2.9 7.452h17.94q0-4.916-2.191-7.53a7.714 7.714 0 0 0-6.258-2.614Z",className:"logo_small_svg__cls-2","data-name":"Path 2946"})),I||(I=i.createElement("path",{id:"logo_small_svg__Path_2947",d:"M350.9 35.361a20.38 20.38 0 0 1 4.1.375l-.721 4.822a17.712 17.712 0 0 0-3.757-.47 9.142 9.142 0 0 0-7.122 3.382 12.327 12.327 0 0 0-2.959 8.422V70.3h-5.2V35.987h4.29l.6 6.356h.25a15.072 15.072 0 0 1 4.6-5.166 10.356 10.356 0 0 1 5.919-1.816Z",className:"logo_small_svg__cls-2","data-name":"Path 2947"})),x||(x=i.createElement("path",{id:"logo_small_svg__Path_2948",d:"M255.857 96.638s-3.43-.391-4.85-.391c-2.058 0-3.111.735-3.111 2.18 0 1.568.882 1.935 3.748 2.719 3.527.98 4.8 1.911 4.8 4.777 0 3.675-2.3 5.267-5.61 5.267a35.687 35.687 0 0 1-5.487-.662l.27-2.18s3.306.441 5.046.441c2.082 0 3.037-.931 3.037-2.7 0-1.421-.759-1.91-3.331-2.523-3.626-.93-5.193-2.033-5.193-4.948 0-3.381 2.229-4.776 5.585-4.776a37.2 37.2 0 0 1 5.315.587Z",className:"logo_small_svg__cls-2","data-name":"Path 2948"})),B||(B=i.createElement("path",{id:"logo_small_svg__Path_2949",d:"M262.967 94.14h4.733l3.748 13.106L275.2 94.14h4.752v16.78H277.2v-14.5h-.145l-4.191 13.816h-2.842l-4.191-13.816h-.145v14.5h-2.719Z",className:"logo_small_svg__cls-2","data-name":"Path 2949"})),k||(k=i.createElement("path",{id:"logo_small_svg__Path_2950",d:"M322.057 94.14H334.3v2.425h-4.728v14.355h-2.743V96.565h-4.777Z",className:"logo_small_svg__cls-2","data-name":"Path 2950"})),A||(A=i.createElement("path",{id:"logo_small_svg__Path_2951",d:"M346.137 94.14c3.332 0 5.12 1.249 5.12 4.361 0 2.033-.637 3.037-1.984 3.772 1.445.563 2.4 1.592 2.4 3.9 0 3.43-2.081 4.752-5.339 4.752h-6.566V94.14Zm-3.65 2.352v4.8h3.6c1.666 0 2.4-.832 2.4-2.474 0-1.617-.833-2.327-2.5-2.327Zm0 7.1v4.973h3.7c1.689 0 2.694-.539 2.694-2.548 0-1.911-1.421-2.425-2.744-2.425Z",className:"logo_small_svg__cls-2","data-name":"Path 2951"})),M||(M=i.createElement("path",{id:"logo_small_svg__Path_2952",d:"M358.414 94.14H369v2.377h-7.864v4.751h6.394v2.332h-6.394v4.924H369v2.4h-10.586Z",className:"logo_small_svg__cls-2","data-name":"Path 2952"})),q||(q=i.createElement("path",{id:"logo_small_svg__Path_2953",d:"M378.747 94.14h5.414l4.164 16.78h-2.744l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.708l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2953"})),j||(j=i.createElement("path",{id:"logo_small_svg__Path_2954",d:"M397.1 105.947v4.973h-2.719V94.14h6.37c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.956 4.519-2.744 5.352l2.769 5.585h-2.989l-2.426-4.973Zm3.651-9.455H397.1v7.1h3.7c2.057 0 2.841-1.85 2.841-3.589 0-1.9-.934-3.511-2.894-3.511Z",className:"logo_small_svg__cls-2","data-name":"Path 2954"})),T||(T=i.createElement("path",{id:"logo_small_svg__Path_2955",d:"M290.013 94.14h5.413l4.164 16.78h-2.743l-1.239-4.92h-5.777l-1.239 4.923h-2.719Zm.361 9.456h4.707l-1.737-7.178h-1.225Z",className:"logo_small_svg__cls-2","data-name":"Path 2955"})),R||(R=i.createElement("path",{id:"logo_small_svg__Path_2956",d:"M308.362 105.947v4.973h-2.719V94.14h6.369c3.7 0 5.683 2.12 5.683 5.843 0 2.376-.955 4.519-2.743 5.352l2.768 5.585h-2.989l-2.425-4.973Zm3.65-9.455h-3.65v7.1h3.7c2.058 0 2.841-1.85 2.841-3.589-.003-1.903-.931-3.511-2.891-3.511Z",className:"logo_small_svg__cls-2","data-name":"Path 2956"})),F||(F=i.createElement("path",{id:"logo_small_svg__Path_2957",d:"M130.606 107.643a3.02 3.02 0 0 1-1.18 2.537 5.113 5.113 0 0 1-3.2.91 8.03 8.03 0 0 1-3.371-.564v-1.383a8.793 8.793 0 0 0 1.652.506 8.672 8.672 0 0 0 1.77.186 3.565 3.565 0 0 0 2.157-.544 1.783 1.783 0 0 0 .725-1.512 1.947 1.947 0 0 0-.257-1.05 2.393 2.393 0 0 0-.86-.754 12.171 12.171 0 0 0-1.833-.784 5.842 5.842 0 0 1-2.456-1.458 3.213 3.213 0 0 1-.738-2.2 2.736 2.736 0 0 1 1.071-2.267 4.444 4.444 0 0 1 2.831-.843 8.341 8.341 0 0 1 3.38.675l-.447 1.247a7.639 7.639 0 0 0-2.966-.641 2.878 2.878 0 0 0-1.779.489 1.612 1.612 0 0 0-.64 1.357 2.081 2.081 0 0 0 .236 1.049 2.231 2.231 0 0 0 .8.75 9.878 9.878 0 0 0 1.715.754 6.8 6.8 0 0 1 2.667 1.483 2.919 2.919 0 0 1 .723 2.057Z",className:"logo_small_svg__cls-2","data-name":"Path 2957"})),U||(U=i.createElement("path",{id:"logo_small_svg__Path_2958",d:"M134.447 101.686v5.991a2.411 2.411 0 0 0 .515 1.686 2.09 2.09 0 0 0 1.609.556 2.629 2.629 0 0 0 2.12-.792 4 4 0 0 0 .67-2.587v-4.854h1.4v9.236H139.6l-.2-1.239h-.075a2.793 2.793 0 0 1-1.193 1.045 4 4 0 0 1-1.74.362 3.529 3.529 0 0 1-2.524-.8 3.409 3.409 0 0 1-.839-2.562v-6.042Z",className:"logo_small_svg__cls-2","data-name":"Path 2958"})),W||(W=i.createElement("path",{id:"logo_small_svg__Path_2959",d:"M148.206 111.09a3.993 3.993 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12.265 12.265 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.257 3.257 0 0 1 1.256-1.1 3.831 3.831 0 0 1 1.643-.337 3.413 3.413 0 0 1 2.836 1.256 6.683 6.683 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264Zm-.2-8.385a2.482 2.482 0 0 0-2.048.784 4.041 4.041 0 0 0-.649 2.494v.312a4.625 4.625 0 0 0 .649 2.785 2.467 2.467 0 0 0 2.082.839 2.164 2.164 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.428 4.428 0 0 0-.678-2.651 2.232 2.232 0 0 0-1.915-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2959"})),V||(V=i.createElement("path",{id:"logo_small_svg__Path_2960",d:"M159.039 111.09a3.993 3.993 0 0 1-1.647-.333 3.1 3.1 0 0 1-1.252-1.023h-.1a12.265 12.265 0 0 1 .1 1.533v3.8h-1.4v-13.381h1.137l.194 1.264h.067a3.257 3.257 0 0 1 1.256-1.1 3.831 3.831 0 0 1 1.643-.337 3.413 3.413 0 0 1 2.836 1.256 6.683 6.683 0 0 1-.017 7.057 3.42 3.42 0 0 1-2.817 1.264Zm-.2-8.385a2.482 2.482 0 0 0-2.048.784 4.041 4.041 0 0 0-.649 2.494v.312a4.625 4.625 0 0 0 .649 2.785 2.467 2.467 0 0 0 2.082.839 2.164 2.164 0 0 0 1.875-.969 4.6 4.6 0 0 0 .678-2.671 4.428 4.428 0 0 0-.678-2.651 2.232 2.232 0 0 0-1.911-.923Z",className:"logo_small_svg__cls-2","data-name":"Path 2960"})),$||($=i.createElement("path",{id:"logo_small_svg__Path_2961",d:"M173.612 106.3a5.093 5.093 0 0 1-1.137 3.527 4.005 4.005 0 0 1-3.143 1.268 4.172 4.172 0 0 1-2.2-.581 3.84 3.84 0 0 1-1.483-1.669 5.8 5.8 0 0 1-.522-2.545 5.087 5.087 0 0 1 1.129-3.518 3.991 3.991 0 0 1 3.135-1.26 3.907 3.907 0 0 1 3.08 1.29 5.071 5.071 0 0 1 1.141 3.488Zm-7.036 0a4.384 4.384 0 0 0 .708 2.7 2.809 2.809 0 0 0 4.167 0 4.365 4.365 0 0 0 .712-2.7 4.293 4.293 0 0 0-.712-2.675 2.5 2.5 0 0 0-2.1-.915 2.461 2.461 0 0 0-2.072.9 4.334 4.334 0 0 0-.7 2.69Z",className:"logo_small_svg__cls-2","data-name":"Path 2961"})),H||(H=i.createElement("path",{id:"logo_small_svg__Path_2962",d:"M180.525 101.517a5.506 5.506 0 0 1 1.1.1l-.194 1.3a4.786 4.786 0 0 0-1.011-.127 2.46 2.46 0 0 0-1.917.911 3.318 3.318 0 0 0-.8 2.267v4.955h-1.4v-9.236h1.154l.16 1.71h.068a4.054 4.054 0 0 1 1.238-1.39 2.787 2.787 0 0 1 1.6-.49Z",className:"logo_small_svg__cls-2","data-name":"Path 2962"})),Z||(Z=i.createElement("path",{id:"logo_small_svg__Path_2963",d:"M187.363 109.936a4.506 4.506 0 0 0 .716-.055 4.387 4.387 0 0 0 .548-.114v1.07a2.5 2.5 0 0 1-.67.181 5 5 0 0 1-.8.072q-2.68 0-2.68-2.823v-5.494h-1.323v-.673l1.323-.582.59-1.972h.809v2.141h2.68v1.087h-2.68v5.435a1.869 1.869 0 0 0 .4 1.281 1.377 1.377 0 0 0 1.087.446Z",className:"logo_small_svg__cls-2","data-name":"Path 2963"})),Y||(Y=i.createElement("path",{id:"logo_small_svg__Path_2964",d:"M194.538 111.09a4.239 4.239 0 0 1-3.231-1.247 4.824 4.824 0 0 1-1.184-3.463 5.355 5.355 0 0 1 1.1-3.548 3.652 3.652 0 0 1 2.954-1.315 3.484 3.484 0 0 1 2.747 1.142 4.378 4.378 0 0 1 1.011 3.013v.885h-6.362a3.66 3.66 0 0 0 .822 2.469 2.843 2.843 0 0 0 2.2.843 7.431 7.431 0 0 0 2.949-.624v1.247a7.377 7.377 0 0 1-1.4.459 7.863 7.863 0 0 1-1.6.139Zm-.379-8.4a2.286 2.286 0 0 0-1.774.725 3.337 3.337 0 0 0-.779 2.006h4.828a3.072 3.072 0 0 0-.59-2.027 2.076 2.076 0 0 0-1.685-.706Z",className:"logo_small_svg__cls-2","data-name":"Path 2964"})),G||(G=i.createElement("path",{id:"logo_small_svg__Path_2965",d:"M206.951 109.683h-.076a3.287 3.287 0 0 1-2.9 1.407 3.427 3.427 0 0 1-2.819-1.239 5.452 5.452 0 0 1-1.006-3.522 5.542 5.542 0 0 1 1.011-3.548 3.4 3.4 0 0 1 2.814-1.264 3.361 3.361 0 0 1 2.883 1.365h.109l-.059-.665-.034-.649v-3.759h1.4v13.113h-1.138Zm-2.8.236a2.551 2.551 0 0 0 2.078-.779 3.947 3.947 0 0 0 .644-2.516v-.3a4.638 4.638 0 0 0-.653-2.8 2.481 2.481 0 0 0-2.086-.839 2.14 2.14 0 0 0-1.883.957 4.76 4.76 0 0 0-.653 2.7 4.554 4.554 0 0 0 .649 2.671 2.194 2.194 0 0 0 1.906.906Z",className:"logo_small_svg__cls-2","data-name":"Path 2965"})),X||(X=i.createElement("path",{id:"logo_small_svg__Path_2966",d:"M220.712 101.534a3.435 3.435 0 0 1 2.827 1.243 6.653 6.653 0 0 1-.009 7.053 3.417 3.417 0 0 1-2.818 1.26 4 4 0 0 1-1.648-.333 3.094 3.094 0 0 1-1.251-1.023h-.1l-.295 1.188h-1V97.809h1.4V101q0 1.069-.068 1.921h.068a3.322 3.322 0 0 1 2.894-1.387Zm-.2 1.171a2.44 2.44 0 0 0-2.064.822 6.338 6.338 0 0 0 .017 5.553 2.464 2.464 0 0 0 2.081.839 2.158 2.158 0 0 0 1.922-.94 4.828 4.828 0 0 0 .632-2.7 4.645 4.645 0 0 0-.632-2.689 2.242 2.242 0 0 0-1.959-.885Z",className:"logo_small_svg__cls-2","data-name":"Path 2966"})),ee||(ee=i.createElement("path",{id:"logo_small_svg__Path_2967",d:"M225.758 101.686h1.5l2.023 5.267a20.188 20.188 0 0 1 .826 2.6h.067q.109-.431.459-1.471t2.288-6.4h1.5l-3.969 10.518a5.253 5.253 0 0 1-1.378 2.212 2.932 2.932 0 0 1-1.934.653 5.659 5.659 0 0 1-1.264-.143V113.8a4.9 4.9 0 0 0 1.037.1 2.136 2.136 0 0 0 2.056-1.618l.514-1.314Z",className:"logo_small_svg__cls-2","data-name":"Path 2967"}))))),components_Logo=()=>i.createElement(logo_small,{height:"40"}),top_bar=()=>({components:{Topbar:c,Logo:components_Logo}});function isNothing(e){return null==e}var te={isNothing,isObject:function js_yaml_isObject(e){return"object"==typeof e&&null!==e},toArray:function toArray(e){return Array.isArray(e)?e:isNothing(e)?[]:[e]},repeat:function repeat(e,t){var r,n="";for(r=0;rs&&(t=n-s+(o=" ... ").length),r-n>s&&(r=n+s-(a=" ...").length),{str:o+e.slice(t,r).replace(/\t/g,"→")+a,pos:n-t+o.length}}function padStart(e,t){return te.repeat(" ",t-e.length)+e}var ne=function makeSnippet(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var r,n=/\r?\n|\r|\0/g,i=[0],o=[],a=-1;r=n.exec(e.buffer);)o.push(r.index),i.push(r.index+r[0].length),e.position<=r.index&&a<0&&(a=i.length-2);a<0&&(a=i.length-1);var s,u,c="",f=Math.min(e.line+t.linesAfter,o.length).toString().length,l=t.maxLength-(t.indent+f+3);for(s=1;s<=t.linesBefore&&!(a-s<0);s++)u=getLine(e.buffer,i[a-s],o[a-s],e.position-(i[a]-i[a-s]),l),c=te.repeat(" ",t.indent)+padStart((e.line-s+1).toString(),f)+" | "+u.str+"\n"+c;for(u=getLine(e.buffer,i[a],o[a],e.position,l),c+=te.repeat(" ",t.indent)+padStart((e.line+1).toString(),f)+" | "+u.str+"\n",c+=te.repeat("-",t.indent+f+3+u.pos)+"^\n",s=1;s<=t.linesAfter&&!(a+s>=o.length);s++)u=getLine(e.buffer,i[a+s],o[a+s],e.position-(i[a]-i[a+s]),l),c+=te.repeat(" ",t.indent)+padStart((e.line+s+1).toString(),f)+" | "+u.str+"\n";return c.replace(/\n$/,"")},ie=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],oe=["scalar","sequence","mapping"];var ae=function Type$1(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===ie.indexOf(t))throw new re('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function compileStyleAliases(e){var t={};return null!==e&&Object.keys(e).forEach((function(r){e[r].forEach((function(e){t[String(e)]=r}))})),t}(t.styleAliases||null),-1===oe.indexOf(this.kind))throw new re('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function compileList(e,t){var r=[];return e[t].forEach((function(e){var t=r.length;r.forEach((function(r,n){r.tag===e.tag&&r.kind===e.kind&&r.multi===e.multi&&(t=n)})),r[t]=e})),r}function Schema$1(e){return this.extend(e)}Schema$1.prototype.extend=function extend(e){var t=[],r=[];if(e instanceof ae)r.push(e);else if(Array.isArray(e))r=r.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new re("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(r=r.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof ae))throw new re("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new re("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new re("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),r.forEach((function(e){if(!(e instanceof ae))throw new re("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var n=Object.create(Schema$1.prototype);return n.implicit=(this.implicit||[]).concat(t),n.explicit=(this.explicit||[]).concat(r),n.compiledImplicit=compileList(n,"implicit"),n.compiledExplicit=compileList(n,"explicit"),n.compiledTypeMap=function compileMap(){var e,t,r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function collectType(e){e.multi?(r.multi[e.kind].push(e),r.multi.fallback.push(e)):r[e.kind][e.tag]=r.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),_e=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var ye=/^[-+]?[0-9]+e/;var ge=new ae("tag:yaml.org,2002:float",{kind:"scalar",resolve:function resolveYamlFloat(e){return null!==e&&!(!_e.test(e)||"_"===e[e.length-1])},construct:function constructYamlFloat(e){var t,r;return r="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:r*parseFloat(t,10)},predicate:function isFloat(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||te.isNegativeZero(e))},represent:function representYamlFloat(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(te.isNegativeZero(e))return"-0.0";return r=e.toString(10),ye.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"}),ve=le.extend({implicit:[he,pe,de,ge]}),me=ve,be=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Se=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var we=new ae("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function resolveYamlTimestamp(e){return null!==e&&(null!==be.exec(e)||null!==Se.exec(e))},construct:function constructYamlTimestamp(e){var t,r,n,i,o,a,s,u,c=0,f=null;if(null===(t=be.exec(e))&&(t=Se.exec(e)),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,n,i));if(o=+t[4],a=+t[5],s=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+="0";c=+c}return t[9]&&(f=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(f=-f)),u=new Date(Date.UTC(r,n,i,o,a,s,c)),f&&u.setTime(u.getTime()-f),u},instanceOf:Date,represent:function representYamlTimestamp(e){return e.toISOString()}});var Ie=new ae("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function resolveYamlMerge(e){return"<<"===e||null===e}}),xe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var Ee=new ae("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function resolveYamlBinary(e){if(null===e)return!1;var t,r,n=0,i=e.length,o=xe;for(r=0;r64)){if(t<0)return!1;n+=6}return n%8==0},construct:function constructYamlBinary(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,o=xe,a=0,s=[];for(t=0;t>16&255),s.push(a>>8&255),s.push(255&a)),a=a<<6|o.indexOf(n.charAt(t));return 0===(r=i%4*6)?(s.push(a>>16&255),s.push(a>>8&255),s.push(255&a)):18===r?(s.push(a>>10&255),s.push(a>>2&255)):12===r&&s.push(a>>4&255),new Uint8Array(s)},predicate:function isBinary(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function representYamlBinary(e){var t,r,n="",i=0,o=e.length,a=xe;for(t=0;t>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]),i=(i<<8)+e[t];return 0===(r=o%3)?(n+=a[i>>18&63],n+=a[i>>12&63],n+=a[i>>6&63],n+=a[63&i]):2===r?(n+=a[i>>10&63],n+=a[i>>4&63],n+=a[i<<2&63],n+=a[64]):1===r&&(n+=a[i>>2&63],n+=a[i<<4&63],n+=a[64],n+=a[64]),n}}),Oe=Object.prototype.hasOwnProperty,Be=Object.prototype.toString;var ke=new ae("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function resolveYamlOmap(e){if(null===e)return!0;var t,r,n,i,o,a=[],s=e;for(t=0,r=s.length;t>10),56320+(e-65536&1023))}for(var He=new Array(256),Ze=new Array(256),Ye=0;Ye<256;Ye++)He[Ye]=simpleEscapeSequence(Ye)?1:0,Ze[Ye]=simpleEscapeSequence(Ye);function State$1(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||Le,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function generateError(e,t){var r={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return r.snippet=ne(r),new re(t,r)}function throwError(e,t){throw generateError(e,t)}function throwWarning(e,t){e.onWarning&&e.onWarning.call(null,generateError(e,t))}var Ge={YAML:function handleYamlDirective(e,t,r){var n,i,o;null!==e.version&&throwError(e,"duplication of %YAML directive"),1!==r.length&&throwError(e,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&throwError(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&throwError(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&throwWarning(e,"unsupported YAML version of the document")},TAG:function handleTagDirective(e,t,r){var n,i;2!==r.length&&throwError(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],Ve.test(n)||throwError(e,"ill-formed tag handle (first argument) of the TAG directive"),je.call(e.tagMap,n)&&throwError(e,'there is a previously declared suffix for "'+n+'" tag handle'),$e.test(i)||throwError(e,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch(t){throwError(e,"tag prefix is malformed: "+i)}e.tagMap[n]=i}};function captureSegment(e,t,r,n){var i,o,a,s;if(t1&&(e.result+=te.repeat("\n",t-1))}function readBlockSequence(e,t){var r,n,i=e.tag,o=e.anchor,a=[],s=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),n=e.input.charCodeAt(e.position);0!==n&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,throwError(e,"tab characters must not be used in indentation")),45===n)&&is_WS_OR_EOL(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,skipSeparationSpace(e,!0,-1)&&e.lineIndent<=t)a.push(null),n=e.input.charCodeAt(e.position);else if(r=e.line,composeNode(e,t,Re,!1,!0),a.push(e.result),skipSeparationSpace(e,!0,-1),n=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>t)&&0!==n)throwError(e,"bad indentation of a sequence entry");else if(e.lineIndentt?d=1:e.lineIndent===t?d=0:e.lineIndentt?d=1:e.lineIndent===t?d=0:e.lineIndentt)&&(v&&(a=e.line,s=e.lineStart,u=e.position),composeNode(e,t,ze,!0,i)&&(v?_=e.result:g=e.result),v||(storeMappingPair(e,h,p,d,_,g,a,s,u),d=_=g=null),skipSeparationSpace(e,!0,-1),c=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==c)throwError(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===i?throwError(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?throwError(e,"repeat of an indentation width identifier"):(f=t+i-1,c=!0)}if(is_WHITE_SPACE(o)){do{o=e.input.charCodeAt(++e.position)}while(is_WHITE_SPACE(o));if(35===o)do{o=e.input.charCodeAt(++e.position)}while(!is_EOL(o)&&0!==o)}for(;0!==o;){for(readLineBreak(e),e.lineIndent=0,o=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),is_EOL(o))l++;else{if(e.lineIndent0){for(i=a,o=0;i>0;i--)(a=fromHexCode(s=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:throwError(e,"expected hexadecimal character");e.result+=charFromCodepoint(o),e.position++}else throwError(e,"unknown escape sequence");r=n=e.position}else is_EOL(s)?(captureSegment(e,r,n,!0),writeFoldedLines(e,skipSeparationSpace(e,!1,t)),r=n=e.position):e.position===e.lineStart&&testDocumentSeparator(e)?throwError(e,"unexpected end of the document within a double quoted scalar"):(e.position++,n=e.position)}throwError(e,"unexpected end of the stream within a double quoted scalar")}(e,h)?g=!0:!function readAlias(e){var t,r,n;if(42!==(n=e.input.charCodeAt(e.position)))return!1;for(n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!is_WS_OR_EOL(n)&&!is_FLOW_INDICATOR(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&throwError(e,"name of an alias node must contain at least one character"),r=e.input.slice(t,e.position),je.call(e.anchorMap,r)||throwError(e,'unidentified alias "'+r+'"'),e.result=e.anchorMap[r],skipSeparationSpace(e,!0,-1),!0}(e)?function readPlainScalar(e,t,r){var n,i,o,a,s,u,c,f,l=e.kind,h=e.result;if(is_WS_OR_EOL(f=e.input.charCodeAt(e.position))||is_FLOW_INDICATOR(f)||35===f||38===f||42===f||33===f||124===f||62===f||39===f||34===f||37===f||64===f||96===f)return!1;if((63===f||45===f)&&(is_WS_OR_EOL(n=e.input.charCodeAt(e.position+1))||r&&is_FLOW_INDICATOR(n)))return!1;for(e.kind="scalar",e.result="",i=o=e.position,a=!1;0!==f;){if(58===f){if(is_WS_OR_EOL(n=e.input.charCodeAt(e.position+1))||r&&is_FLOW_INDICATOR(n))break}else if(35===f){if(is_WS_OR_EOL(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&testDocumentSeparator(e)||r&&is_FLOW_INDICATOR(f))break;if(is_EOL(f)){if(s=e.line,u=e.lineStart,c=e.lineIndent,skipSeparationSpace(e,!1,-1),e.lineIndent>=t){a=!0,f=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=u,e.lineIndent=c;break}}a&&(captureSegment(e,i,o,!1),writeFoldedLines(e,e.line-s),i=o=e.position,a=!1),is_WHITE_SPACE(f)||(o=e.position+1),f=e.input.charCodeAt(++e.position)}return captureSegment(e,i,o,!1),!!e.result||(e.kind=l,e.result=h,!1)}(e,h,Ne===r)&&(g=!0,null===e.tag&&(e.tag="?")):(g=!0,null===e.tag&&null===e.anchor||throwError(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===d&&(g=s&&readBlockSequence(e,p))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&throwError(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),u=0,c=e.implicitTypes.length;u"),null!==e.result&&l.kind!==e.kind&&throwError(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+l.kind+'", not "'+e.kind+'"'),l.resolve(e.result,e.tag)?(e.result=l.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):throwError(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||g}function readDocument(e){var t,r,n,i,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(i=e.input.charCodeAt(e.position))&&(skipSeparationSpace(e,!0,-1),i=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==i));){for(a=!0,i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!is_WS_OR_EOL(i);)i=e.input.charCodeAt(++e.position);for(n=[],(r=e.input.slice(t,e.position)).length<1&&throwError(e,"directive name must not be less than one character in length");0!==i;){for(;is_WHITE_SPACE(i);)i=e.input.charCodeAt(++e.position);if(35===i){do{i=e.input.charCodeAt(++e.position)}while(0!==i&&!is_EOL(i));break}if(is_EOL(i))break;for(t=e.position;0!==i&&!is_WS_OR_EOL(i);)i=e.input.charCodeAt(++e.position);n.push(e.input.slice(t,e.position))}0!==i&&readLineBreak(e),je.call(Ge,r)?Ge[r](e,r,n):throwWarning(e,'unknown document directive "'+r+'"')}skipSeparationSpace(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,skipSeparationSpace(e,!0,-1)):a&&throwError(e,"directives end mark is expected"),composeNode(e,e.lineIndent-1,ze,!1,!0),skipSeparationSpace(e,!0,-1),e.checkLineBreaks&&We.test(e.input.slice(o,e.position))&&throwWarning(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&testDocumentSeparator(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,skipSeparationSpace(e,!0,-1)):e.position=55296&&n<=56319&&t+1=56320&&r<=57343?1024*(n-55296)+r-56320+65536:n}function needIndentIndicator(e){return/^\n* /.test(e)}var Mt=1,qt=2,Lt=3,jt=4,Nt=5;function chooseScalarStyle(e,t,r,n,i,o,a,s){var u,c=0,f=null,l=!1,h=!1,p=-1!==n,d=-1,_=function isPlainSafeFirst(e){return isPrintable(e)&&e!==et&&!isWhitespace(e)&&e!==dt&&e!==vt&&e!==_t&&e!==pt&&e!==bt&&e!==St&&e!==It&&e!==Et&&e!==st&&e!==ct&&e!==ht&&e!==ot&&e!==xt&&e!==yt&&e!==gt&&e!==lt&&e!==at&&e!==ut&&e!==mt&&e!==wt}(codePointAt(e,0))&&function isPlainSafeLast(e){return!isWhitespace(e)&&e!==_t}(codePointAt(e,e.length-1));if(t||a)for(u=0;u=65536?u+=2:u++){if(!isPrintable(c=codePointAt(e,u)))return Nt;_=_&&isPlainSafe(c,f,s),f=c}else{for(u=0;u=65536?u+=2:u++){if((c=codePointAt(e,u))===rt)l=!0,p&&(h=h||u-d-1>n&&" "!==e[d+1],d=u);else if(!isPrintable(c))return Nt;_=_&&isPlainSafe(c,f,s),f=c}h=h||p&&u-d-1>n&&" "!==e[d+1]}return l||h?r>9&&needIndentIndicator(e)?Nt:a?o===Ct?Nt:qt:h?jt:Lt:!_||a||i(e)?o===Ct?Nt:qt:Mt}function writeScalar(e,t,r,n,i){e.dump=function(){if(0===t.length)return e.quotingType===Ct?'""':"''";if(!e.noCompatMode&&(-1!==Bt.indexOf(t)||kt.test(t)))return e.quotingType===Ct?'"'+t+'"':"'"+t+"'";var o=e.indent*Math.max(1,r),a=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),s=n||e.flowLevel>-1&&r>=e.flowLevel;switch(chooseScalarStyle(t,s,e.indent,a,(function testAmbiguity(t){return function testImplicitResolving(e,t){var r,n;for(r=0,n=e.implicitTypes.length;r"+blockHeader(t,e.indent)+dropEndingNewline(indentString(function foldString(e,t){var r,n,i=/(\n+)([^\n]*)/g,o=(s=e.indexOf("\n"),s=-1!==s?s:e.length,i.lastIndex=s,foldLine(e.slice(0,s),t)),a="\n"===e[0]||" "===e[0];var s;for(;n=i.exec(e);){var u=n[1],c=n[2];r=" "===c[0],o+=u+(a||r||""===c?"":"\n")+foldLine(c,t),a=r}return o}(t,a),o));case Nt:return'"'+function escapeString(e){for(var t,r="",n=0,i=0;i=65536?i+=2:i++)n=codePointAt(e,i),!(t=Ot[n])&&isPrintable(n)?(r+=e[i],n>=65536&&(r+=e[i+1])):r+=t||encodeHex(n);return r}(t)+'"';default:throw new re("impossible error: invalid scalar style")}}()}function blockHeader(e,t){var r=needIndentIndicator(e)?String(t):"",n="\n"===e[e.length-1];return r+(n&&("\n"===e[e.length-2]||"\n"===e)?"+":n?"":"-")+"\n"}function dropEndingNewline(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function foldLine(e,t){if(""===e||" "===e[0])return e;for(var r,n,i=/ [^ ]/g,o=0,a=0,s=0,u="";r=i.exec(e);)(s=r.index)-o>t&&(n=a>o?a:s,u+="\n"+e.slice(o,n),o=n+1),a=s;return u+="\n",e.length-o>t&&a>o?u+=e.slice(o,a)+"\n"+e.slice(a+1):u+=e.slice(o),u.slice(1)}function writeBlockSequence(e,t,r,n){var i,o,a,s="",u=e.tag;for(i=0,o=r.length;i tag resolver accepts not "'+u+'" style');n=s.represent[u](t,u)}e.dump=n}return!0}return!1}function writeNode(e,t,r,n,i,o,a){e.tag=null,e.dump=r,detectType(e,r,!1)||detectType(e,r,!0);var s,u=Qe.call(e.dump),c=n;n&&(n=e.flowLevel<0||e.flowLevel>t);var f,l,h="[object Object]"===u||"[object Array]"===u;if(h&&(l=-1!==(f=e.duplicates.indexOf(r))),(null!==e.tag&&"?"!==e.tag||l||2!==e.indent&&t>0)&&(i=!1),l&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(h&&l&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),"[object Object]"===u)n&&0!==Object.keys(e.dump).length?(!function writeBlockMapping(e,t,r,n){var i,o,a,s,u,c,f="",l=e.tag,h=Object.keys(r);if(!0===e.sortKeys)h.sort();else if("function"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new re("sortKeys must be a boolean or a function");for(i=0,o=h.length;i1024)&&(e.dump&&rt===e.dump.charCodeAt(0)?c+="?":c+="? "),c+=e.dump,u&&(c+=generateNextLine(e,t)),writeNode(e,t+1,s,!0,u)&&(e.dump&&rt===e.dump.charCodeAt(0)?c+=":":c+=": ",f+=c+=e.dump));e.tag=l,e.dump=f||"{}"}(e,t,e.dump,i),l&&(e.dump="&ref_"+f+e.dump)):(!function writeFlowMapping(e,t,r){var n,i,o,a,s,u="",c=e.tag,f=Object.keys(r);for(n=0,i=f.length;n1024&&(s+="? "),s+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),writeNode(e,t,a,!1,!1)&&(u+=s+=e.dump));e.tag=c,e.dump="{"+u+"}"}(e,t,e.dump),l&&(e.dump="&ref_"+f+" "+e.dump));else if("[object Array]"===u)n&&0!==e.dump.length?(e.noArrayIndent&&!a&&t>0?writeBlockSequence(e,t-1,e.dump,i):writeBlockSequence(e,t,e.dump,i),l&&(e.dump="&ref_"+f+e.dump)):(!function writeFlowSequence(e,t,r){var n,i,o,a="",s=e.tag;for(n=0,i=r.length;n",e.dump=s+" "+e.dump)}return!0}function getDuplicateReferences(e,t){var r,n,i=[],o=[];for(inspectNode(e,i,o),r=0,n=o.length;r{try{return Tt.load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}},Rt="configs_update",zt="configs_toggle";function update(e,t){return{type:Rt,payload:{[e]:t}}}function toggle(e){return{type:zt,payload:e}}const loaded=()=>()=>{},downloadConfig=e=>t=>{const{fn:{fetch:r}}=t;return r(e)},getConfigByUrl=(e,t)=>r=>{let{specActions:n}=r;if(e)return n.downloadConfig(e).then(next,next);function next(r){r instanceof Error||r.status>=400?(n.updateLoadingStatus("failedConfig"),n.updateLoadingStatus("failedConfig"),n.updateUrl(""),console.error(r.statusText+" "+e.url),t(null)):t(parseYamlConfig(r.text))}},get=(e,t)=>e.getIn(Array.isArray(t)?t:[t]),Pt={[Rt]:(e,t)=>e.merge((0,a.fromJS)(t.payload)),[zt]:(e,t)=>{const r=t.payload,n=e.get(r);return e.set(r,!n)}},Dt={getLocalConfig:()=>parseYamlConfig('---\nurl: "https://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://validator.swagger.io/validator"\n')};var Ft=__webpack_require__(7287),Ut=__webpack_require__.n(Ft),Wt=__webpack_require__(3101),Kt=__webpack_require__.n(Wt);const Vt=console.error,withErrorBoundary=e=>t=>{const{getComponent:r,fn:n}=e(),o=r("ErrorBoundary"),a=n.getDisplayName(t);class WithErrorBoundary extends i.Component{render(){return i.createElement(o,{targetName:a,getComponent:r,fn:n},i.createElement(t,Kt()({},this.props,this.context)))}}var s;return WithErrorBoundary.displayName=`WithErrorBoundary(${a})`,(s=t).prototype&&s.prototype.isReactComponent&&(WithErrorBoundary.prototype.mapStateToProps=t.prototype.mapStateToProps),WithErrorBoundary},fallback=e=>{let{name:t}=e;return i.createElement("div",{className:"fallback"},"😱 ",i.createElement("i",null,"Could not render ","t"===t?"this component":t,", see the console."))};class ErrorBoundary extends i.Component{static getDerivedStateFromError(e){return{hasError:!0,error:e}}constructor(){super(...arguments),this.state={hasError:!1,error:null}}componentDidCatch(e,t){this.props.fn.componentDidCatch(e,t)}render(){const{getComponent:e,targetName:t,children:r}=this.props;if(this.state.hasError){const r=e("Fallback");return i.createElement(r,{name:t})}return r}}ErrorBoundary.defaultProps={targetName:"this component",getComponent:()=>fallback,fn:{componentDidCatch:Vt},children:null};const $t=ErrorBoundary,Ht=[top_bar,function configsPlugin(){return{statePlugins:{spec:{actions:t,selectors:Dt},configs:{reducers:Pt,actions:e,selectors:n}}}},stadalone_layout,function(){let{componentList:e=[],fullOverride:t=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return r=>{let{getSystem:n}=r;const i=t?e:["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper",...e],o=Ut()(i,Array(i.length).fill(((e,t)=>{let{fn:r}=t;return r.withErrorBoundary(e)})));return{fn:{componentDidCatch:Vt,withErrorBoundary:withErrorBoundary(n)},components:{ErrorBoundary:$t,Fallback:fallback},wrapComponents:o}}}({fullOverride:!0,componentList:["Topbar","StandaloneLayout","onlineValidatorBadge"]})]})(),r=r.default})())); +//# sourceMappingURL=swagger-ui-standalone-preset.js.map \ No newline at end of file diff --git a/docs/assets/scripts/swagger-ui-standalone-preset.js.map b/docs/assets/scripts/swagger-ui-standalone-preset.js.map new file mode 100644 index 000000000..d0cc02bd4 --- /dev/null +++ b/docs/assets/scripts/swagger-ui-standalone-preset.js.map @@ -0,0 +1 @@ +{"version":3,"file":"swagger-ui-standalone-preset.js","mappings":"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","sources":["webpack://SwaggerUIStandalonePreset/webpack/universalModuleDefinition","webpack://SwaggerUIStandalonePreset/./node_modules/@braintree/sanitize-url/dist/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/base64-js/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/buffer/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/actual/instance/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/actual/object/assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/es/function/virtual/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/es/instance/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/es/object/assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/features/instance/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/features/object/assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/full/instance/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/full/object/assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/a-callable.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/an-object.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/array-includes.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/array-slice.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/classof-raw.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/create-non-enumerable-property.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/create-property-descriptor.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/define-global-property.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/descriptors.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/document-all.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/document-create-element.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/engine-user-agent.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/engine-v8-version.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/entry-virtual.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/enum-bug-keys.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/export.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/fails.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-apply.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-bind-context.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-bind-native.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-call.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-uncurry-this-clause.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/function-uncurry-this.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/get-built-in.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/get-method.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/global.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/has-own-property.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/hidden-keys.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/ie8-dom-define.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/indexed-object.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-callable.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-forced.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-null-or-undefined.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-object.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-pure.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/is-symbol.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/length-of-array-like.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/math-trunc.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-define-property.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-get-own-property-descriptor.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-get-own-property-symbols.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-is-prototype-of.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-keys-internal.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-keys.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/object-property-is-enumerable.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/ordinary-to-primitive.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/path.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/require-object-coercible.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/shared-store.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/shared.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/symbol-constructor-detection.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-absolute-index.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-indexed-object.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-integer-or-infinity.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-length.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-object.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-primitive.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/to-property-key.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/try-to-string.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/uid.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/use-symbol-as-uid.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/v8-prototype-define-bug.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/internals/well-known-symbol.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/modules/es.function.bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/modules/es.object.assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/stable/instance/bind.js","webpack://SwaggerUIStandalonePreset/./node_modules/core-js-pure/stable/object/assign.js","webpack://SwaggerUIStandalonePreset/./node_modules/css.escape/css.escape.js","webpack://SwaggerUIStandalonePreset/./node_modules/ieee754/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/immutable/dist/immutable.js","webpack://SwaggerUIStandalonePreset/./node_modules/inherits/inherits_browser.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_DataView.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Hash.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_ListCache.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Map.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_MapCache.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Promise.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Set.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_SetCache.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Stack.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Symbol.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_Uint8Array.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_WeakMap.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arrayFilter.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arrayLikeKeys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arrayMap.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arrayPush.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arrayReduce.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_arraySome.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_asciiToArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_asciiWords.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_assignValue.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_assocIndexOf.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseAssignValue.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseEach.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseFindIndex.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseFor.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseForOwn.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseGet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseGetAllKeys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseGetTag.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseHasIn.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsArguments.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsEqual.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsEqualDeep.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsMatch.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsNative.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIsTypedArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseIteratee.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseKeys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseMatches.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseMatchesProperty.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseProperty.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_basePropertyDeep.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_basePropertyOf.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseSlice.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseSome.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseTimes.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseToString.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseTrim.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseUnary.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_baseZipObject.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_cacheHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_castPath.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_castSlice.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_coreJsData.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_createBaseEach.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_createBaseFor.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_createCaseFirst.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_createCompounder.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_createFind.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_deburrLetter.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_defineProperty.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_equalArrays.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_equalByTag.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_equalObjects.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_freeGlobal.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getAllKeys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getMapData.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getMatchData.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getNative.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getRawTag.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getSymbols.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getTag.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_getValue.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hasPath.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hasUnicode.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hasUnicodeWord.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hashClear.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hashDelete.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hashGet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hashHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_hashSet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isIndex.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isIterateeCall.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isKey.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isKeyable.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isMasked.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isPrototype.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_isStrictComparable.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_listCacheClear.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_listCacheDelete.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_listCacheGet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_listCacheHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_listCacheSet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapCacheClear.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapCacheDelete.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapCacheGet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapCacheHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapCacheSet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_mapToArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_matchesStrictComparable.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_memoizeCapped.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_nativeCreate.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_nativeKeys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_nodeUtil.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_objectToString.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_overArg.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_root.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_setCacheAdd.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_setCacheHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_setToArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stackClear.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stackDelete.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stackGet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stackHas.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stackSet.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stringToArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_stringToPath.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_toKey.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_toSource.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_trimmedEndIndex.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_unicodeToArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/_unicodeWords.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/camelCase.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/capitalize.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/deburr.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/eq.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/find.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/findIndex.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/get.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/hasIn.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/identity.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isArguments.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isArrayLike.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isBuffer.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isFunction.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isLength.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isObject.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isObjectLike.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isSymbol.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/isTypedArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/keys.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/memoize.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/property.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/some.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/stubArray.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/stubFalse.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/toFinite.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/toInteger.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/toNumber.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/toString.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/upperFirst.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/words.js","webpack://SwaggerUIStandalonePreset/./node_modules/lodash/zipObject.js","webpack://SwaggerUIStandalonePreset/./node_modules/object-assign/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/process/browser.js","webpack://SwaggerUIStandalonePreset/./node_modules/randombytes/browser.js","webpack://SwaggerUIStandalonePreset/./node_modules/react/cjs/react.production.min.js","webpack://SwaggerUIStandalonePreset/./node_modules/react/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/safe-buffer/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/hash.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha1.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha224.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha256.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha384.js","webpack://SwaggerUIStandalonePreset/./node_modules/sha.js/sha512.js","webpack://SwaggerUIStandalonePreset/./node_modules/@babel/runtime-corejs3/helpers/extends.js","webpack://SwaggerUIStandalonePreset/webpack/bootstrap","webpack://SwaggerUIStandalonePreset/webpack/runtime/compat get default export","webpack://SwaggerUIStandalonePreset/webpack/runtime/define property getters","webpack://SwaggerUIStandalonePreset/webpack/runtime/global","webpack://SwaggerUIStandalonePreset/webpack/runtime/hasOwnProperty shorthand","webpack://SwaggerUIStandalonePreset/webpack/runtime/make namespace object","webpack://SwaggerUIStandalonePreset/webpack/runtime/node module decorator","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/stadalone-layout/components/StandaloneLayout.jsx","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/stadalone-layout/index.js","webpack://SwaggerUIStandalonePreset/./src/core/window.js","webpack://SwaggerUIStandalonePreset/./src/core/utils/get-parameter-schema.js","webpack://SwaggerUIStandalonePreset/./src/core/utils/index.js","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/top-bar/components/TopBar.jsx","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/top-bar/assets/logo_small.svg","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/top-bar/components/Logo.jsx","webpack://SwaggerUIStandalonePreset/./src/standalone/plugins/top-bar/index.js","webpack://SwaggerUIStandalonePreset/./node_modules/js-yaml/dist/js-yaml.mjs","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/helpers.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/actions.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/spec-actions.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/selectors.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/reducers.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/configs/index.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/safe-render/fn.jsx","webpack://SwaggerUIStandalonePreset/./src/core/plugins/safe-render/components/fallback.jsx","webpack://SwaggerUIStandalonePreset/./src/core/plugins/safe-render/components/error-boundary.jsx","webpack://SwaggerUIStandalonePreset/./src/standalone/presets/standalone/index.js","webpack://SwaggerUIStandalonePreset/./src/core/plugins/safe-render/index.js"],"names":["webpackUniversalModuleDefinition","root","factory","exports","module","define","amd","this","invalidProtocolRegex","htmlEntitiesRegex","htmlCtrlEntityRegex","ctrlCharactersRegex","urlSchemeRegex","relativeFirstCharacters","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","start","end","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","fromString","string","encoding","isEncoding","actual","write","slice","ArrayBuffer","isView","fromArrayView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","SharedArrayBuffer","valueOf","b","fromObject","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","asciiToBytes","str","byteArray","base64Write","ucs2Write","utf16leToBytes","units","c","hi","lo","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","decodeCodePointsArray","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","kMaxLength","TYPED_ARRAY_SUPPORT","typedArraySupport","proto","foo","e","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","NodeError","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","base64clean","split","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","parent","entryVirtual","bind","isPrototypeOf","method","FunctionPrototype","Function","it","own","path","assign","isCallable","tryToString","$TypeError","argument","isObject","$String","toIndexedObject","toAbsoluteIndex","lengthOfArrayLike","createMethod","IS_INCLUDES","$this","el","fromIndex","O","index","uncurryThis","stringSlice","DESCRIPTORS","definePropertyModule","createPropertyDescriptor","object","key","f","bitmap","global","fails","documentAll","document","all","IS_HTMLDDA","EXISTS","createElement","navigator","userAgent","match","version","process","Deno","versions","v8","CONSTRUCTOR","getOwnPropertyDescriptor","isForced","createNonEnumerableProperty","hasOwn","wrapConstructor","NativeConstructor","Wrapper","options","source","FORCED","USE_NATIVE","VIRTUAL_PROTOTYPE","sourceProperty","targetProperty","nativeProperty","resultProperty","descriptor","TARGET","GLOBAL","STATIC","stat","PROTO","nativeSource","targetPrototype","forced","dontCallGetSet","wrap","sham","real","exec","NATIVE_BIND","Reflect","aCallable","that","test","hasOwnProperty","arraySlice","$Function","factories","F","Prototype","partArgs","boundFunction","bound","args","C","argsLength","construct","classofRaw","uncurryThisWithBind","aFunction","variable","namespace","isNullOrUndefined","V","P","func","check","globalThis","window","self","g","toObject","classof","$Object","propertyIsEnumerable","$documentAll","replacement","feature","detection","normalize","POLYFILL","NATIVE","getBuiltIn","USE_SYMBOL_AS_UID","$Symbol","toLength","ceil","trunc","objectKeys","getOwnPropertySymbolsModule","propertyIsEnumerableModule","IndexedObject","$assign","A","B","symbol","forEach","chr","T","argumentsLength","getOwnPropertySymbols","S","keys","IE8_DOM_DEFINE","V8_PROTOTYPE_DEFINE_BUG","anObject","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","CONFIGURABLE","WRITABLE","Attributes","current","hiddenKeys","names","result","internalObjectKeys","enumBugKeys","$propertyIsEnumerable","NASHORN_BUG","pref","defineGlobalProperty","SHARED","store","IS_PURE","mode","copyright","license","V8_VERSION","toIntegerOrInfinity","integer","requireObjectCoercible","number","isSymbol","getMethod","ordinaryToPrimitive","wellKnownSymbol","TO_PRIMITIVE","exoticToPrim","id","postfix","random","NATIVE_SYMBOL","iterator","shared","uid","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","$","arity","CSS","escape","cssEscape","codeUnit","firstCodeUnit","charAt","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","SLICE$0","createClass","ctor","superClass","create","Iterable","isIterable","Seq","KeyedIterable","isKeyed","KeyedSeq","IndexedIterable","isIndexed","IndexedSeq","SetIterable","isAssociative","SetSeq","maybeIterable","IS_ITERABLE_SENTINEL","maybeKeyed","IS_KEYED_SENTINEL","maybeIndexed","IS_INDEXED_SENTINEL","maybeAssociative","isOrdered","maybeOrdered","IS_ORDERED_SENTINEL","Keyed","Indexed","Set","DELETE","SHIFT","SIZE","MASK","NOT_SET","CHANGE_LENGTH","DID_ALTER","MakeRef","ref","SetRef","OwnerID","arrCopy","newArr","ii","ensureSize","iter","__iterate","returnTrue","wrapIndex","uint32Index","wholeSlice","begin","resolveBegin","resolveIndex","resolveEnd","defaultIndex","ITERATE_KEYS","ITERATE_VALUES","ITERATE_ENTRIES","REAL_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","ITERATOR_SYMBOL","Iterator","next","iteratorValue","k","v","iteratorResult","done","iteratorDone","hasIterator","getIteratorFn","isIterator","maybeIterator","getIterator","iterable","iteratorFn","isArrayLike","emptySequence","toSeq","seqFromValue","toKeyedSeq","fromEntrySeq","keyedSeqFromValue","entrySeq","toIndexedSeq","indexedSeqFromValue","toSetSeq","KEYS","VALUES","ENTRIES","toSource","of","__toString","cacheResult","_cache","__iterateUncached","toArray","reverse","seqIterate","__iterator","seqIterator","isSeq","EMPTY_SEQ","EMPTY_REPEAT","EMPTY_RANGE","IS_SEQ_SENTINEL","ArraySeq","_array","ObjectSeq","_object","_keys","IterableSeq","_iterable","IteratorSeq","_iterator","_iteratorCache","maybeSeq","seq","maybeIndexedSeqFromValue","useKeys","cache","maxIndex","entry","__iteratorUncached","fromJS","json","converter","fromJSWith","fromJSDefault","parentJSON","map","isPlainObj","toList","toMap","is","valueA","valueB","deepEqual","__hash","notAssociative","entries","every","flipped","_","allEqual","bSize","has","Repeat","times","_value","invariant","condition","Range","step","_start","_end","_step","Collection","KeyedCollection","IndexedCollection","SetCollection","notSetValue","iterations","searchValue","this$0","other","possibleIndex","offsetValue","imul","smi","i32","hash","o","h","STRING_HASH_CACHE_MIN_STRLEN","cachedHashString","hashString","hashCode","hashJSObj","stringHashCache","STRING_HASH_CACHE_SIZE","STRING_HASH_CACHE_MAX_SIZE","usingWeakMap","weakMap","UID_HASH_KEY","canDefineProperty","getIENodeHash","objHashUID","isExtensible","nodeType","node","uniqueID","documentElement","WeakMap","assertNotInfinite","Map","emptyMap","isMap","withMutations","maybeMap","IS_MAP_SENTINEL","keyValues","_root","updateMap","setIn","keyPath","updateIn","remove","deleteIn","update","updater","updatedValue","updateInDeepMap","forceIterator","clear","__ownerID","__altered","merge","mergeIntoMapWith","mergeWith","merger","mergeIn","iters","mergeDeep","deepMerger","mergeDeepWith","deepMergerWith","mergeDeepIn","sort","comparator","OrderedMap","sortFactory","sortBy","mapper","mutable","asMutable","wasAltered","__ensureOwner","asImmutable","MapIterator","iterate","ownerID","makeMap","EMPTY_MAP","MapPrototype","ArrayMapNode","BitmapIndexedNode","nodes","HashArrayMapNode","count","HashCollisionNode","keyHash","ValueNode","_type","_reverse","_stack","mapIteratorFrame","mapIteratorValue","prev","__prev","newRoot","newSize","didChangeSize","didAlter","updateNode","shift","isLeafNode","mergeIntoNode","newNode","idx1","idx2","createNodes","packNodes","excluding","packedII","packedNodes","bit","expandNodes","including","expandedNodes","iterables","mergeIntoCollectionWith","existing","nextValue","collection","filter","mergeIntoMap","keyPathIter","isNotSet","existingValue","newValue","nextExisting","nextUpdated","popCount","idx","canEdit","newArray","spliceIn","newLen","after","spliceOut","pop","removeIn","removed","exists","MAX_ARRAY_MAP_SIZE","isEditable","newEntries","keyHashFrag","MAX_BITMAP_INDEXED_SIZE","newBitmap","newNodes","newCount","MIN_HASH_ARRAY_MAP_SIZE","keyMatch","subNode","List","empty","emptyList","isList","makeList","VNode","setSize","maybeList","IS_LIST_SENTINEL","listNodeFor","_origin","updateList","splice","insert","_capacity","_level","_tail","values","oldSize","setListBounds","unshift","mergeIntoListWith","iterateList","DONE","ListPrototype","removeBefore","level","originIndex","newChild","removingFirst","oldChild","editable","editableVNode","removeAfter","sizeIndex","EMPTY_LIST","EMPTY_ORDERED_MAP","left","right","tailPos","getTailOffset","tail","iterateNodeOrLeaf","iterateLeaf","iterateNode","to","origin","capacity","newTail","updateVNode","nodeHas","lowerNode","newLowerNode","rawIndex","owner","oldOrigin","oldCapacity","newOrigin","newCapacity","newLevel","offsetShift","oldTailOffset","newTailOffset","oldTail","beginIndex","maxSize","emptyOrderedMap","isOrderedMap","maybeOrderedMap","makeOrderedMap","omap","_map","_list","updateOrderedMap","newMap","newList","flip","ToKeyedSequence","indexed","_iter","_useKeys","ToIndexedSequence","ToSetSequence","FromEntriesSequence","flipFactory","flipSequence","makeSequence","reversedSequence","cacheResultThrough","mapFactory","context","mappedSequence","reverseFactory","filterFactory","predicate","filterSequence","countByFactory","grouper","groups","groupByFactory","isKeyedIter","coerce","iterableClass","reify","sliceFactory","originalSize","resolvedBegin","resolvedEnd","sliceSize","resolvedSize","sliceSeq","skipped","isSkipping","takeWhileFactory","takeSequence","iterating","skipWhileFactory","skipSequence","skipping","concatFactory","isKeyedIterable","singleton","concatSeq","flatten","reduce","sum","flattenFactory","depth","flatSequence","stopped","flatDeep","currentDepth","flatMapFactory","interposeFactory","separator","interposedSequence","defaultComparator","maxFactory","maxCompare","comp","zipWithFactory","keyIter","zipper","zipSequence","iterators","isDone","steps","some","validateEntry","resolveSize","Record","defaultValues","hasInitialized","RecordType","setProps","RecordTypePrototype","_name","_defaultValues","RecordPrototype","valueSeq","indexedIterable","recordName","defaultVal","_empty","makeRecord","likeRecord","record","getPrototypeOf","setProp","emptySet","isSet","add","maybeSet","IS_SET_SENTINEL","fromKeys","keySeq","updateSet","union","intersect","originalSet","subtract","OrderedSet","__make","EMPTY_SET","SetPrototype","__empty","makeSet","emptyOrderedSet","isOrderedSet","maybeOrderedSet","EMPTY_ORDERED_SET","OrderedSetPrototype","makeOrderedSet","Stack","emptyStack","isStack","unshiftAll","maybeStack","IS_STACK_SENTINEL","head","_head","peek","makeStack","pushAll","EMPTY_STACK","StackPrototype","mixin","methods","keyCopier","toJS","__toJS","toOrderedMap","toOrderedSet","toSet","toStack","__toStringMapper","returnValue","find","findEntry","sideEffect","joined","isFirst","reducer","initialReduction","reduction","useFirst","reduceRight","reversed","not","butLast","isEmpty","countBy","entriesSequence","entryMapper","filterNot","findKey","findLast","findLastEntry","findLastKey","flatMap","searchKey","getIn","searchKeyPath","nested","groupBy","hasIn","isSubset","isSuperset","keyOf","keyMapper","lastKeyOf","maxBy","neg","defaultNegComparator","minBy","rest","skip","amount","skipLast","skipWhile","skipUntil","take","takeLast","takeWhile","takeUntil","hashIterable","IterablePrototype","quoteString","chain","contains","mapEntries","mapKeys","KeyedIterablePrototype","JSON","stringify","defaultZipper","ordered","keyed","murmurHashOfSize","hashMerge","findIndex","removeNum","numArgs","spliced","findLastIndex","interpose","interleave","zipped","interleaved","zip","zipWith","inherits","superCtor","super_","TempCtor","DataView","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","Promise","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","arrayFilter","resIndex","baseTimes","isArguments","isIndex","isTypedArray","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","arrayMap","iteratee","arrayPush","arrayReduce","accumulator","initAccum","arraySome","asciiToArray","reAsciiWord","asciiWords","baseAssignValue","eq","assignValue","objValue","assocIndexOf","baseForOwn","baseEach","createBaseEach","baseFindIndex","fromRight","baseFor","createBaseFor","castPath","toKey","baseGet","baseGetAllKeys","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseGetTag","baseHasIn","isObjectLike","baseIsArguments","baseIsEqualDeep","baseIsEqual","bitmask","customizer","equalArrays","equalByTag","equalObjects","getTag","argsTag","arrayTag","objectTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","reIsHostCtor","funcProto","objectProto","funcToString","reIsNative","RegExp","baseIsNative","isLength","typedArrayTags","baseIsTypedArray","baseMatches","baseMatchesProperty","identity","property","baseIteratee","isPrototype","nativeKeys","baseKeys","getMatchData","matchesStrictComparable","isKey","isStrictComparable","baseProperty","basePropertyDeep","basePropertyOf","baseSlice","baseSome","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","baseTrim","baseUnary","baseZipObject","props","assignFunc","valsLength","cacheHas","stringToPath","castSlice","coreJsData","eachFunc","hasUnicode","stringToArray","createCaseFirst","methodName","strSymbols","trailing","deburr","words","reApos","createCompounder","callback","createFind","findIndexFunc","deburrLetter","isPartial","othLength","arrStacked","othStacked","seen","arrValue","othValue","compared","othIndex","mapToArray","setToArray","symbolValueOf","tag","convert","stacked","getAllKeys","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","getSymbols","isKeyable","getMapData","getValue","nativeObjectToString","isOwn","unmasked","stubArray","nativeGetSymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","resolve","Ctor","ctorString","hasPath","hasFunc","reHasUnicode","reHasUnicodeWord","hasUnicodeWord","nativeCreate","reIsUint","isIterateeCall","reIsDeepProp","reIsPlainProp","maskSrcKey","IE_PROTO","memoize","memoizeCapped","overArg","freeExports","freeModule","freeProcess","nodeUtil","types","require","binding","transform","freeSelf","pairs","LARGE_ARRAY_SIZE","unicodeToArray","rePropName","reEscapeChar","quote","subString","reWhitespace","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsModifier","rsEmoji","reUnicodeWord","unicodeWords","capitalize","camelCase","word","upperFirst","reLatin","reComboMark","toInteger","nativeMax","defaultValue","stubFalse","nodeIsTypedArray","resolver","memoized","Cache","guard","toNumber","INFINITY","toFinite","remainder","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","pattern","zipObject","propIsEnumerable","shouldUseNative","test1","getOwnPropertyNames","test2","test3","letter","err","symbols","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","runClearTimeout","marker","Item","noop","nextTick","title","browser","env","argv","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","cwd","chdir","umask","MAX_BYTES","MAX_UINT32","crypto","msCrypto","getRandomValues","randomBytes","cb","generated","oldBrowser","l","p","Fragment","StrictMode","Profiler","q","r","t","Suspense","u","for","w","z","encodeURIComponent","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","refs","D","isReactComponent","setState","forceUpdate","isPureReactComponent","G","H","I","__self","__source","J","children","defaultProps","$$typeof","_owner","L","M","N","K","Q","_status","_result","then","default","R","ReactCurrentDispatcher","ReactCurrentBatchConfig","transition","ReactCurrentOwner","IsSomeRendererActing","Children","only","Component","PureComponent","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","cloneElement","createContext","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","createFactory","createRef","forwardRef","render","isValidElement","lazy","_payload","_init","memo","useCallback","useContext","useDebugValue","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useReducer","useRef","useState","copyProps","SafeBuffer","blockSize","finalSize","_block","_finalSize","_blockSize","_len","enc","block","accum","assigned","_update","digest","rem","bits","lowBits","highBits","_hash","SHA","algorithm","Algorithm","sha","sha1","sha224","sha256","sha384","sha512","W","Sha","init","_w","rotl30","ft","_a","_b","_c","_d","_e","Sha1","rotl5","Sha256","Sha224","_f","_g","_h","ch","maj","sigma0","sigma1","gamma0","T1","T2","SHA512","Sha384","_ah","_bh","_ch","_dh","_eh","_fh","_gh","_hh","_al","_bl","_cl","_dl","_el","_fl","_gl","_hl","writeInt64BE","Sha512","Ch","xl","Gamma0","Gamma0l","Gamma1","Gamma1l","getCarry","ah","bh","dh","eh","fh","gh","hh","al","bl","cl","dl","fl","gl","hl","xh","gamma0l","gamma1","gamma1l","Wi7h","Wi7l","Wi16h","Wi16l","Wil","Wih","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Kih","Kil","chh","chl","t1l","t1h","t2l","t2h","_Object$assign","_bindInstanceProperty","_extends","__esModule","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","definition","prop","nmd","paths","StandaloneLayout","React","getComponent","Container","Row","Col","Topbar","BaseLayout","OnlineValidatorBadge","className","StandaloneLayoutPlugin","components","makeWindow","win","location","history","open","close","File","FormData","Im","parseSearch","search","params","decodeURIComponent","TopBar","state","url","specSelectors","selectedIndex","UNSAFE_componentWillReceiveProps","nextProps","onUrlChange","flushAuthData","persistAuthorization","getConfigs","authActions","restoreAuthorization","authorized","loadSpec","specActions","updateUrl","download","onUrlSelect","href","setSelectedUrl","preventDefault","downloadUrl","setSearch","spec","newUrl","protocol","host","pathname","serializeSearch","searchMap","pushState","replaceState","selectedUrl","urls","componentDidMount","configs","targetIndex","primaryName","onFilterChange","layoutActions","updateFilter","Button","Link","Logo","isLoading","loadingStatus","classNames","control","formOnSubmit","rows","link","htmlFor","disabled","onChange","onClick","onSubmit","_defs","_path","_path2","_path3","_path4","_path5","_path6","_path7","_path8","_path9","_path10","_path11","_path12","_path13","_path14","_path15","_path16","_path17","_path18","_path19","_path20","_path21","_path22","_path23","_path24","_path25","_path26","_path27","_path28","_path29","_path30","_path31","xmlns","viewBox","style","clipPath","SwaggerUILogo","height","TopBarPlugin","isNothing","subject","common","sequence","repeat","cycle","isNegativeZero","NEGATIVE_INFINITY","extend","sourceKeys","formatError","exception","compact","where","reason","mark","line","column","snippet","YAMLException$1","captureStackTrace","getLine","lineStart","lineEnd","position","maxLineLength","maxHalfLength","padStart","makeSnippet","maxLength","indent","linesBefore","linesAfter","re","lineStarts","lineEnds","foundLineNo","lineNoLength","TYPE_CONSTRUCTOR_OPTIONS","YAML_NODE_KINDS","Type$1","kind","instanceOf","represent","representName","defaultStyle","multi","styleAliases","compileStyleAliases","alias","compileList","schema","currentType","newIndex","previousType","previousIndex","Schema$1","implicit","explicit","type$1","loadKind","compiledImplicit","compiledExplicit","compiledTypeMap","compileMap","scalar","mapping","fallback","collectType","failsafe","_null","resolveYamlNull","constructYamlNull","isNull","canonical","lowercase","uppercase","camelcase","bool","resolveYamlBoolean","constructYamlBoolean","isBoolean","isOctCode","isDecCode","resolveYamlInteger","hasDigits","constructYamlInteger","sign","binary","octal","decimal","hexadecimal","toUpperCase","YAML_FLOAT_PATTERN","SCIENTIFIC_WITHOUT_DOT","resolveYamlFloat","constructYamlFloat","POSITIVE_INFINITY","parseFloat","isFloat","representYamlFloat","core","YAML_DATE_REGEXP","YAML_TIMESTAMP_REGEXP","timestamp","resolveYamlTimestamp","constructYamlTimestamp","year","month","day","hour","minute","second","date","fraction","delta","Date","UTC","setTime","getTime","representYamlTimestamp","toISOString","resolveYamlMerge","BASE64_MAP","resolveYamlBinary","bitlen","constructYamlBinary","tailbits","representYamlBinary","_hasOwnProperty$3","_toString$2","resolveYamlOmap","pair","pairKey","pairHasKey","constructYamlOmap","_toString$1","resolveYamlPairs","constructYamlPairs","_hasOwnProperty$2","resolveYamlSet","constructYamlSet","_default","_hasOwnProperty$1","CONTEXT_FLOW_IN","CONTEXT_FLOW_OUT","CONTEXT_BLOCK_IN","CONTEXT_BLOCK_OUT","CHOMPING_CLIP","CHOMPING_STRIP","CHOMPING_KEEP","PATTERN_NON_PRINTABLE","PATTERN_NON_ASCII_LINE_BREAKS","PATTERN_FLOW_INDICATORS","PATTERN_TAG_HANDLE","PATTERN_TAG_URI","_class","is_EOL","is_WHITE_SPACE","is_WS_OR_EOL","is_FLOW_INDICATOR","fromHexCode","lc","simpleEscapeSequence","charFromCodepoint","simpleEscapeCheck","simpleEscapeMap","State$1","filename","onWarning","legacy","listener","implicitTypes","typeMap","lineIndent","firstTabInLine","documents","generateError","throwError","throwWarning","directiveHandlers","YAML","handleYamlDirective","major","minor","checkLineBreaks","TAG","handleTagDirective","handle","prefix","tagMap","captureSegment","checkJson","_position","_length","_character","mergeMappings","destination","overridableKeys","quantity","storeMappingPair","keyTag","keyNode","valueNode","startLine","startLineStart","startPos","readLineBreak","skipSeparationSpace","allowComments","checkIndent","lineBreaks","testDocumentSeparator","writeFoldedLines","readBlockSequence","nodeIndent","_line","_tag","_anchor","anchor","detected","anchorMap","composeNode","readTagProperty","tagHandle","tagName","isVerbatim","isNamed","readAnchorProperty","parentIndent","nodeContext","allowToSeek","allowCompact","allowBlockStyles","allowBlockScalars","allowBlockCollections","typeIndex","typeQuantity","typeList","flowIndent","blockIndent","indentStatus","atNewLine","hasContent","readBlockMapping","following","_keyLine","_keyLineStart","_keyPos","atExplicitKey","readFlowCollection","_lineStart","_pos","terminator","isPair","isExplicitPair","isMapping","readNext","readBlockScalar","captureStart","folding","chomping","didReadContent","detectedIndent","textIndent","emptyLines","atMoreIndented","readSingleQuotedScalar","captureEnd","readDoubleQuotedScalar","hexLength","hexResult","readAlias","readPlainScalar","withinFlowCollection","hasPendingContent","_lineIndent","_kind","readDocument","directiveName","directiveArgs","documentStart","hasDirectives","loadDocuments","nullpos","loader","loadAll","loadAll$1","load","load$1","_toString","_hasOwnProperty","CHAR_BOM","CHAR_TAB","CHAR_LINE_FEED","CHAR_CARRIAGE_RETURN","CHAR_SPACE","CHAR_EXCLAMATION","CHAR_DOUBLE_QUOTE","CHAR_SHARP","CHAR_PERCENT","CHAR_AMPERSAND","CHAR_SINGLE_QUOTE","CHAR_ASTERISK","CHAR_COMMA","CHAR_MINUS","CHAR_COLON","CHAR_EQUALS","CHAR_GREATER_THAN","CHAR_QUESTION","CHAR_COMMERCIAL_AT","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","CHAR_GRAVE_ACCENT","CHAR_LEFT_CURLY_BRACKET","CHAR_VERTICAL_LINE","CHAR_RIGHT_CURLY_BRACKET","ESCAPE_SEQUENCES","DEPRECATED_BOOLEANS_SYNTAX","DEPRECATED_BASE60_SYNTAX","encodeHex","character","QUOTING_TYPE_SINGLE","QUOTING_TYPE_DOUBLE","State","noArrayIndent","skipInvalid","flowLevel","styleMap","compileStyleMap","sortKeys","lineWidth","noRefs","noCompatMode","condenseFlow","quotingType","forceQuotes","replacer","explicitTypes","duplicates","usedDuplicates","indentString","spaces","ind","generateNextLine","isWhitespace","isPrintable","isNsCharOrWhitespace","isPlainSafe","inblock","cIsNsCharOrWhitespace","cIsNsChar","codePointAt","needIndentIndicator","STYLE_PLAIN","STYLE_SINGLE","STYLE_LITERAL","STYLE_FOLDED","STYLE_DOUBLE","chooseScalarStyle","singleLineOnly","indentPerLevel","testAmbiguousType","char","prevChar","hasLineBreak","hasFoldableLine","shouldTrackWidth","previousLineBreak","plain","isPlainSafeFirst","isPlainSafeLast","writeScalar","iskey","dump","testAmbiguity","testImplicitResolving","blockHeader","dropEndingNewline","foldString","width","moreIndented","lineRe","nextLF","lastIndex","foldLine","prevMoreIndented","escapeString","escapeSeq","indentIndicator","clip","breakRe","curr","writeBlockSequence","writeNode","detectType","isblockseq","tagStr","duplicateIndex","duplicate","objectOrArray","writeBlockMapping","objectKey","objectValue","explicitPair","pairBuffer","objectKeyList","writeFlowMapping","writeFlowSequence","encodeURI","getDuplicateReferences","objects","duplicatesIndexes","inspectNode","renamed","Type","Schema","FAILSAFE_SCHEMA","JSON_SCHEMA","CORE_SCHEMA","DEFAULT_SCHEMA","dump$1","YAMLException","float","null","int","safeLoad","safeLoadAll","safeDump","parseYamlConfig","yaml","system","errActions","newThrownErr","UPDATE_CONFIGS","TOGGLE_CONFIGS","configName","configValue","payload","toggle","downloadConfig","req","fetch","getConfigByUrl","_ref","status","updateLoadingStatus","statusText","text","action","oriVal","getLocalConfig","componentDidCatch","withErrorBoundary","getSystem","WrappedComponent","ErrorBoundary","targetName","getDisplayName","WithErrorBoundary","isClassComponent","component","displayName","mapStateToProps","getDerivedStateFromError","hasError","errorInfo","FallbackComponent","Fallback","configsPlugin","statePlugins","actions","selectors","reducers","componentList","fullOverride","mergedComponentList","wrapComponents","wrapFactory","Original","_ref2","SafeRenderPlugin"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..0e4ba9670 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,54 @@ +# Contributing + +Thank you for considering contributing to Griptape documentation! Before you start, please read the following guidelines. + +## Submitting Issues + +If you have identified a documentation issue, want to propose new documentation, or have a question, please submit an issue through our public [issue tracker](https://github.com/griptape-ai/griptape-docs/issues). Before submitting a new issue, please check the existing issues to ensure it hasn't been reported or discussed before. + +## Submitting Pull Requests + +We welcome and encourage pull requests. To streamline the process, please follow these guidelines: + +1. **Existing Issues:** Please submit pull requests only for existing issues. If you want to add new documentation or fix a documentation issue that hasn't been addressed yet, please first submit an issue. This allows the Griptape team to internally process the request and provide a public response. + +2. **Branch:** Submit all pull requests to the `dev` branch. This helps us manage changes and integrate them smoothly. + +## Getting Started +Griptape docs are built using [MkDocs](https://squidfunk.github.io/mkdocs-material/getting-started/). Dependencies are managed using [Poetry](https://python-poetry.org/). + +To directly contribute to Griptape documentation, first fork the [griptape-docs](https://github.com/griptape-ai/griptape-docs) repository to your GitHub account. Then clone your repository to your local machine. + +From inside the directory run: + +```poetry install --with docs``` + +To run `griptape-docs` locally run: + +```poetry run mkdocs serve``` + +You should see something similar to the following: + +``` +INFO - Building documentation... +INFO - Cleaning site directory +INFO - Documentation built in 0.19 seconds +INFO - [09:28:33] Watching paths for changes: 'docs', 'mkdocs.yml' +INFO - [09:28:33] Serving on http://127.0.0.1:8000/ +INFO - [09:28:37] Browser connected: http://127.0.0.1:8000/ +``` + +### Reference Docs + +You may see many `WARNING` messages in the console output. This is because the [reference docs](./reference/griptape/index.md) are not built. +Fixing this is not necessary to contribute to the documentation, but it helps to reduce noise in the console output. + +First, clone the Griptape repository to a separate directory: + +`git clone git@github.com:griptape-ai/griptape.git ~/some/other/directory/` + +Then, create a symlink called `griptape` in the `griptape-docs` repository: + +`ln -s ~/some/other/directory/griptape griptape` + +The `WARNING` messages should now be resolved. diff --git a/docs/examples/index.md b/docs/examples/index.md new file mode 100644 index 000000000..acd38e988 --- /dev/null +++ b/docs/examples/index.md @@ -0,0 +1,3 @@ +This section of the documentation is dedicated to examples highlighting Griptape functionality. + +We try to keep all examples up to date, but if you think there is a bug please [submit a pull request](https://github.com/griptape-ai/griptape-docs/tree/main/docs/examples). We are also more than happy to include new examples :) \ No newline at end of file diff --git a/docs/examples/load-and-query-pinecone.md b/docs/examples/load-and-query-pinecone.md new file mode 100644 index 000000000..dbe163f8e --- /dev/null +++ b/docs/examples/load-and-query-pinecone.md @@ -0,0 +1,44 @@ +```python +import hashlib +import os +import json +from urllib.request import urlopen +from griptape.drivers import PineconeVectorStoreDriver, OpenAiEmbeddingDriver + +def load_data(driver: PineconeVectorStoreDriver) -> None: + response = urlopen( + "https://raw.githubusercontent.com/wedeploy-examples/" + "supermarket-web-example/master/products.json" + ) + + for product in json.loads(response.read()): + driver.upsert_text( + product["description"], + vector_id=hashlib.md5(product["title"].encode()).hexdigest(), + meta={ + "title": product["title"], + "description": product["description"], + "type": product["type"], + "price": product["price"], + "rating": product["rating"], + }, + namespace="supermarket-products", + ) + +vector_driver = PineconeVectorStoreDriver( + api_key=os.environ["PINECONE_API_KEY"], + environment=os.environ["PINECONE_ENVIRONMENT"], + index_name=os.environ["PINECONE_INDEX_NAME"], + embedding_driver=OpenAiEmbeddingDriver() +) + +load_data(vector_driver) + +result = vector_driver.query( + "fruit", + count=3, + filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, + namespace="supermarket-products", +) +print(result) +``` diff --git a/docs/examples/load-query-and-chat-marqo.md b/docs/examples/load-query-and-chat-marqo.md new file mode 100644 index 000000000..159fd9641 --- /dev/null +++ b/docs/examples/load-query-and-chat-marqo.md @@ -0,0 +1,47 @@ +```python title="PYTEST_IGNORE" +import os +from griptape import utils +from griptape.drivers import MarqoVectorStoreDriver +from griptape.engines import VectorQueryEngine +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import VectorStoreClient +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver + +# Define the namespace +namespace = "griptape-ai" + +# # Initialize the vector store driver +vector_store = MarqoVectorStoreDriver( + api_key=os.environ["MARQO_API_KEY"], + url=os.environ["MARQO_URL"], + index=os.environ["MARQO_INDEX_NAME"], + embedding_driver=OpenAiEmbeddingDriver() +) +# Initialize the query engine +query_engine = VectorQueryEngine(vector_store_driver=vector_store, prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo")) + +# Initialize the knowledge base tool +vector_store_tool = VectorStoreClient( + description="Contains information about the Griptape Framework from www.griptape.ai", + query_engine=query_engine, + namespace=namespace, + off_prompt=False +) + +# Load artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store.upsert_text_artifacts( + { + namespace: artifacts, + } +) + +# Initialize the agent +agent = Agent(tools=[vector_store_tool]) + +# Start the chat +utils.Chat(agent).start() +``` diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md new file mode 100644 index 000000000..cf3966c97 --- /dev/null +++ b/docs/examples/multiple-agent-shared-memory.md @@ -0,0 +1,80 @@ +This example shows how to use one `Agent` to load content into `TaskMemory` and get that content from another `Agent` using `TaskMemoryClient`. + +The first `Agent` uses a remote vector store (`MongoDbAtlasVectorStoreDriver` in this example) to handle memory operations. The second `Agent` uses the same instance of `TaskMemory` and the `TaskMemoryClient` with the same `MongoDbAtlasVectorStoreDriver` to get the data. + +The `MongoDbAtlasVectorStoreDriver` assumes that you have a vector index configured where the path to the content is called `vector`, and the number of dimensions set on the index is `1536` (this is a commonly used number of dimensions for embedding models). + +`asker` uses the same instance of `TaskMemory` as `loader` so that `asker` has access to the `namespace_storages` that `loader` has set. + +```python +import os +from griptape.tools import WebScraper, VectorStoreClient, TaskMemoryClient +from griptape.structures import Agent +from griptape.drivers import AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, AzureMongoDbVectorStoreDriver +from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine +from griptape.memory import TaskMemory +from griptape.artifacts import TextArtifact +from griptape.memory.task.storage import TextArtifactStorage +from griptape.config import StructureConfig, StructureGlobalDriversConfig + + +AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] +AZURE_OPENAI_API_KEY_1 = os.environ["AZURE_OPENAI_API_KEY_1"] + +MONGODB_HOST = os.environ["MONGODB_HOST"] +MONGODB_USERNAME = os.environ["MONGODB_USERNAME"] +MONGODB_PASSWORD = os.environ["MONGODB_PASSWORD"] +MONGODB_DATABASE_NAME = os.environ["MONGODB_DATABASE_NAME"] +MONGODB_COLLECTION_NAME = os.environ["MONGODB_COLLECTION_NAME"] +MONGODB_INDEX_NAME = os.environ["MONGODB_INDEX_NAME"] +MONGODB_VECTOR_PATH = os.environ["MONGODB_VECTOR_PATH"] +MONGODB_CONNECTION_STRING = f"mongodb+srv://{MONGODB_USERNAME}:{MONGODB_PASSWORD}@{MONGODB_HOST}/{MONGODB_DATABASE_NAME}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000" + + +azure_embedding_driver = AzureOpenAiEmbeddingDriver( + model='text-embedding-ada-002', + azure_endpoint=AZURE_OPENAI_ENDPOINT_1, + api_key=AZURE_OPENAI_API_KEY_1, + azure_deployment='text-embedding-ada-002' +) + +azure_prompt_driver = AzureOpenAiChatPromptDriver( + model='gpt-4', + azure_endpoint=AZURE_OPENAI_ENDPOINT_1, + api_key=AZURE_OPENAI_API_KEY_1, + azure_deployment='gpt-4' +) + +mongo_driver = AzureMongoDbVectorStoreDriver( + connection_string=MONGODB_CONNECTION_STRING, + database_name=MONGODB_DATABASE_NAME, + collection_name=MONGODB_COLLECTION_NAME, + embedding_driver=azure_embedding_driver, + index_name=MONGODB_INDEX_NAME, + vector_path=MONGODB_VECTOR_PATH +) + +loader = Agent( + tools=[ + WebScraper() + ], + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=azure_prompt_driver, + vector_store_driver=mongo_driver, + embedding_driver=azure_embedding_driver + ) + ), +) +asker = Agent( + tools=[ + TaskMemoryClient(off_prompt=False), + ], + meta_memory=loader.meta_memory, + task_memory=loader.task_memory, +) + +if __name__ == "__main__": + loader.run("Load https://medium.com/enterprise-rag/a-first-intro-to-complex-rag-retrieval-augmented-generation-a8624d70090f") + asker.run("why is retrieval augmented generation useful?") +``` diff --git a/docs/examples/query-webpage.md b/docs/examples/query-webpage.md new file mode 100644 index 000000000..d11c5d9c4 --- /dev/null +++ b/docs/examples/query-webpage.md @@ -0,0 +1,28 @@ +```python +import os +from griptape.artifacts import BaseArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + + +vector_store = LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver( + api_key=os.environ["OPENAI_API_KEY"] + ) +) + +[ + vector_store.upsert_text_artifact(a, namespace="griptape") + for a in WebLoader(max_tokens=100).load("https://www.griptape.ai") +] + +results = vector_store.query( + "creativity", + count=3, + namespace="griptape" +) + +values = [BaseArtifact.from_json(r.meta["artifact"]).value for r in results] + +print("\n\n".join(values)) +``` \ No newline at end of file diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md new file mode 100644 index 000000000..b4a6a20eb --- /dev/null +++ b/docs/examples/talk-to-a-pdf.md @@ -0,0 +1,49 @@ +This example demonstrates how to vectorize a PDF of the [Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf) paper and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. + +```python +import os +import io +import requests +from griptape.engines import VectorQueryEngine +from griptape.loaders import PdfLoader +from griptape.structures import Agent +from griptape.tools import VectorStoreClient +from griptape.utils import Chat +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver + + +namespace = "attention" + +response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") + +engine = VectorQueryEngine( + prompt_driver=OpenAiChatPromptDriver( + model="gpt-3.5-turbo", + ), + vector_store_driver=LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver( + api_key=os.environ["OPENAI_API_KEY"] + ) + ) +) + +engine.vector_store_driver.upsert_text_artifacts( + { + namespace: PdfLoader().load(response.content) + } +) + +vector_store_tool = VectorStoreClient( + description="Contains information about the Attention Is All You Need paper. " + "Use it to answer any related questions.", + query_engine=engine, + namespace=namespace, + off_prompt=False +) + +agent = Agent( + tools=[vector_store_tool] +) + +Chat(agent).start() +``` diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md new file mode 100644 index 000000000..7e942134c --- /dev/null +++ b/docs/examples/talk-to-a-webpage.md @@ -0,0 +1,62 @@ +This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. + +```python +import os +from griptape.engines import VectorQueryEngine +from griptape.loaders import WebLoader +from griptape.rules import Ruleset, Rule +from griptape.structures import Agent +from griptape.tools import VectorStoreClient +from griptape.utils import Chat +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver + + +namespace = "physics-wiki" + +engine = VectorQueryEngine( + prompt_driver=OpenAiChatPromptDriver( + model="gpt-3.5-turbo", + ), + vector_store_driver=LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver( + api_key=os.environ["OPENAI_API_KEY"] + ) + ) +) + +artifacts = WebLoader().load( + "https://en.wikipedia.org/wiki/Physics" +) + +engine.vector_store_driver.upsert_text_artifacts( + {namespace: artifacts} +) + + +vector_store_tool = VectorStoreClient( + description="Contains information about physics. " + "Use it to answer any physics-related questions.", + query_engine=engine, + namespace=namespace, + off_prompt=False +) + +agent = Agent( + rulesets=[ + Ruleset( + name="Physics Tutor", + rules=[ + Rule( + "Always introduce yourself as a physics tutor" + ), + Rule( + "Be truthful. Only discuss physics." + ) + ] + ) + ], + tools=[vector_store_tool] +) + +Chat(agent).start() +``` diff --git a/docs/examples/talk-to-redshift.md b/docs/examples/talk-to-redshift.md new file mode 100644 index 000000000..efaf45594 --- /dev/null +++ b/docs/examples/talk-to-redshift.md @@ -0,0 +1,47 @@ +This example demonstrates how to build an agent that can dynamically query Amazon Redshift Serverless tables and store its contents on the local hard drive. + +Let's build a support agent that uses GPT-4: + +```python +import os +import boto3 +from griptape.drivers import AmazonRedshiftSqlDriver +from griptape.loaders import SqlLoader +from griptape.rules import Ruleset, Rule +from griptape.structures import Agent +from griptape.tools import SqlClient, FileManager +from griptape.utils import Chat + +session = boto3.Session() + +sql_loader = SqlLoader( + sql_driver=AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], + ) +) + +sql_tool = SqlClient( + sql_loader=sql_loader, + table_name="people", + table_description="contains information about tech industry professionals", + engine_name="redshift" +) + +agent = Agent( + tools=[sql_tool, FileManager()], + rulesets=[ + Ruleset( + name="HumansOrg Agent", + rules=[ + Rule("Act and introduce yourself as a HumansOrg, Inc. support agent"), + Rule("Your main objective is to help with finding information about people"), + Rule("Only use information about people from the sources available to you") + ] + ) + ] +) + +Chat(agent).start() +``` diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py new file mode 100644 index 000000000..62fe85b0c --- /dev/null +++ b/docs/gen_ref_pages.py @@ -0,0 +1,48 @@ +"""Generate the code reference pages and navigation.""" + +from textwrap import dedent +from pathlib import Path +import mkdocs_gen_files + + +def build_reference_docs(): + nav = mkdocs_gen_files.Nav() + + for path in sorted(Path("griptape").rglob("*.py")): + module_path = path.relative_to(".").with_suffix("") + doc_path = path.relative_to(".").with_suffix(".md") + full_doc_path = Path("reference", doc_path) + + parts = tuple(module_path.parts) + + if parts[-1] == "__init__": + parts = parts[:-1] + doc_path = doc_path.with_name("index.md") + full_doc_path = full_doc_path.with_name("index.md") + elif parts[-1] == "__main__": + continue + + nav[parts] = doc_path.as_posix() + + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + ident = ".".join(parts) + fd.write(f"::: {ident}") + + mkdocs_gen_files.set_edit_path(full_doc_path, Path("..") / path) + + with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: + nav_file.writelines(["---", "search:", "\texclude: true", "---\n"]) + nav_file.writelines(nav.build_literate_nav()) + with mkdocs_gen_files.open("reference/griptape/index.md", "w") as index_file: + index_file.write( + dedent( + """ + # Overview + This section of the documentation is dedicated to a reference API of Griptape. + Here you will find every class, function, and method that is available to you when using the library. + """ + ) + ) + + +build_reference_docs() diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md new file mode 100644 index 000000000..b12dc97d3 --- /dev/null +++ b/docs/griptape-framework/data/artifacts.md @@ -0,0 +1,38 @@ +## Overview + +**Artifacts** are used for passing different types of data between Griptape components. All tools return artifacts that are later consumed by tasks and task memory. +Artifacts make sure framework components enforce contracts when passing and consuming data. + +## TextArtifact + +Used for passing text data of arbitrary size around the framework. It can be used to count tokens with [token_count()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.token_count) with a tokenizer. +It can also be used to generate a text embedding with [generate_embedding()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.generate_embedding) +and access it with [embedding](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.embedding). + +[TaskMemory](../../reference/griptape/memory/task/task_memory.md) automatically stores [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s returned by tool activities and returns artifact IDs back to the LLM. + +## CsvRowArtifact + +Used for passing structured row data around the framework. It inherits from [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) and overrides the +[to_text()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.to_text) method, which always returns a valid CSV row. + +## InfoArtifact + +Used for passing short notifications back to the LLM without task memory storing them. + +## ErrorArtifact + +Used for passing errors back to the LLM without task memory storing them. + +## BlobArtifact + +Used for passing binary large objects (blobs) back to the LLM. +Treat it as a way to return unstructured data, such as images, videos, audio, and other files back from tools. +Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#griptape.artifacts.base_artifact.BaseArtifact.name) and +[dir](../../reference/griptape/artifacts/blob_artifact.md#griptape.artifacts.blob_artifact.BlobArtifact.dir) to uniquely identify stored objects. + +[TaskMemory](../../reference/griptape/memory/task/task_memory.md) automatically stores [BlobArtifact](../../reference/griptape/artifacts/blob_artifact.md)s returned by tool activities that can be reused by other tools. + +## ImageArtifact + +An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an ImageArtifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blobartifact). diff --git a/docs/griptape-framework/data/chunkers.md b/docs/griptape-framework/data/chunkers.md new file mode 100644 index 000000000..0df73f965 --- /dev/null +++ b/docs/griptape-framework/data/chunkers.md @@ -0,0 +1,22 @@ +## Overview + +Chunkers are used to split arbitrarily long text into chunks of certain token length. +Each chunker has a tokenizer, a max token count, and a list of default separators used to split up text into [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. +Different types of chunkers provide lists of separators for specific text shapes: + +* [TextChunker](../../reference/griptape/chunkers/text_chunker.md): works on most texts. +* [PdfChunker](../../reference/griptape/chunkers/pdf_chunker.md): works on text from PDF docs. +* [MarkdownChunker](../../reference/griptape/chunkers/markdown_chunker.md) works on markdown text. + +Here is how to use a chunker: + +```python +from griptape.chunkers import TextChunker +from griptape.tokenizers import OpenAiTokenizer +TextChunker( + # set an optional custom tokenizer + tokenizer=OpenAiTokenizer(model="gpt-4"), + # optionally modify default number of tokens + max_tokens=100 +).chunk("long text") +``` diff --git a/docs/griptape-framework/data/index.md b/docs/griptape-framework/data/index.md new file mode 100644 index 000000000..73dfe4c66 --- /dev/null +++ b/docs/griptape-framework/data/index.md @@ -0,0 +1,21 @@ +## Overview +Griptape provides several abstractions for working with data. + +![Data Architecture](../../assets/img/data-architecture.png) + + +[Artifacts](./artifacts.md) are used for passing different types of data, such as text, lists, and blobs, between Griptape components. + +[Embedding Drivers](../drivers/embedding-drivers.md) are used to generate vector embeddings from text. + +[Loaders](./loaders.md) are used to load textual data from different sources. + +[Chunkers](./chunkers.md) are used to split arbitrarily long text into chunks of certain token length. + +**Tokenizers** are used to tokenize and detokenize text in order to track LLM token limits. + +[Query Engines](../engines/query-engines.md) are used to search text storages. + +[Vector Store Drivers](../drivers/vector-store-drivers.md) are used to store and query vector databases. + +[Prompt Drivers](../drivers/prompt-drivers.md) are used to call LLM APIs. diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md new file mode 100644 index 000000000..8aac96d6a --- /dev/null +++ b/docs/griptape-framework/data/loaders.md @@ -0,0 +1,174 @@ +## Overview + +Loaders are used to load textual data from different sources and chunk it into [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. +Each loader can be used to load a single "document" with [load()](../../reference/griptape/loaders/base_loader.md#griptape.loaders.base_loader.BaseLoader.load) or +multiple documents with [load_collection()](../../reference/griptape/loaders/base_loader.md#griptape.loaders.base_loader.BaseLoader.load_collection). + +## Pdf Loader + +!!! info + This driver requires the `loaders-pdf` [extra](../index.md#extras). + +Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) and can be used to load PDFs from a path or from an IO stream: + +```python +from griptape.loaders import PdfLoader +import urllib.request + +urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "attention.pdf") + +with open("attention.pdf", "rb") as f: + PdfLoader().load(f.read()) + +urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "CoT.pdf") + +with open("attention.pdf", "rb") as attention, open("CoT.pdf", "rb") as cot: + PdfLoader().load_collection([attention.read(), cot.read()]) +``` + +## Sql Loader + +Can be used to load data from a SQL database into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: + +```python +from griptape.loaders import SqlLoader +from griptape.drivers import SqlDriver + +SqlLoader( + sql_driver = SqlDriver( + engine_url="sqlite:///:memory:" + ) +).load("SELECT 'foo', 'bar'") + +SqlLoader( + sql_driver = SqlDriver( + engine_url="sqlite:///:memory:" + ) +).load_collection(["SELECT 'foo', 'bar';", "SELECT 'fizz', 'buzz';"]) +``` + +## Csv Loader + +Can be used to load CSV files into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: + +```python +from griptape.loaders import CsvLoader + +with open("tests/resources/cities.csv", "r") as f: + CsvLoader().load(f.read()) + +with open("tests/resources/cities.csv", "r") as cities, open("tests/resources/addresses.csv", "r") as addresses: + CsvLoader().load_collection([cities.read(), addresses.read()]) +``` + + +## DataFrame Loader + +!!! info + This driver requires the `loaders-dataframe` [extra](../index.md#extras). + +Can be used to load [pandas](https://pandas.pydata.org/) [DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)s into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: + +```python +import urllib +import pandas as pd +from griptape.loaders import DataFrameLoader + +urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/cities.csv", "cities.csv") + +DataFrameLoader().load(pd.read_csv("cities.csv")) + +urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv", "addresses.csv") + +DataFrameLoader().load_collection( + [pd.read_csv('cities.csv'), pd.read_csv('addresses.csv')] +) +``` + + +## Text Loader + +Used to load arbitrary text and text files: + +```python +from pathlib import Path +import urllib +from griptape.loaders import TextLoader + +TextLoader().load( + "my text" +) + +urllib.request.urlretrieve("https://example-files.online-convert.com/document/txt/example.txt", "example.txt") + +with open("example.txt", "r") as f: + TextLoader().load(f.read()) + +with open("example.txt", "r") as f: + TextLoader().load_collection( + ["my text", "my other text", f.read()] + ) +``` + +You can set a custom [tokenizer](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.tokenizer.md), [max_tokens](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.max_tokens.md) parameter, and [chunker](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.chunker.md). + +## Web Loader + +!!! info + This driver requires the `loaders-web` [extra](../index.md#extras). + +Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) and can be used to load web pages: + +```python +from griptape.loaders import WebLoader + +WebLoader().load( + "https://www.griptape.ai" +) + +WebLoader().load_collection( + ["https://www.griptape.ai", "https://docs.griptape.ai"] +) +``` + +## Image Loader + +!!! info + This driver requires the `loaders-image` [extra](../index.md#extras). + +The Image Loader is used to load an image as an [ImageArtifact](./artifacts.md#imageartifact). The Loader operates on image bytes that can be sourced from files on disk, downloaded images, or images in memory. + +```python +from griptape.loaders import ImageLoader + +with open("tests/resources/mountain.png", "rb") as f: + disk_image_artifact = ImageLoader().load(f.read()) +``` + +By default, the Image Loader will load images in their native format, but not all models work on all formats. To normalize the format of Artifacts returned by the Loader, set the `format` field. + +```python +from griptape.loaders import ImageLoader + +# Image data in artifact will be in BMP format. +with open("tests/resources/mountain.png", "rb") as f: + image_artifact_jpeg = ImageLoader(format="bmp").load(f.read()) +``` + + +## Email Loader + +!!! info + This driver requires the `loaders-email` [extra](../index.md#extras). + +Can be used to load email from an imap server: + +```python +from griptape.loaders import EmailLoader + +loader = EmailLoader(imap_url="an.email.server.hostname", username="username", password="password") + +loader.load(EmailLoader.EmailQuery(label="INBOX")) + +loader.load_collection([EmailLoader.EmailQuery(label="INBOX"), EmailLoader.EmailQuery(label="SENT")]) +``` diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md new file mode 100644 index 000000000..332e9674a --- /dev/null +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -0,0 +1,193 @@ +## Overview +Embeddings in Griptape are multidimensional representations of text data. Embeddings carry semantic information, which makes them useful for extracting relevant chunks from large bodies of text for search and querying. + +Griptape provides a way to build Embedding Drivers that are reused in downstream framework components. Every Embedding Driver has two basic methods that can be used to generate embeddings: + +* [embed_text_artifact()](../../reference/griptape/drivers/embedding/base_embedding_driver.md#griptape.drivers.embedding.base_embedding_driver.BaseEmbeddingDriver.embed_text_artifact) for [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. +* [embed_string()](../../reference/griptape/drivers/embedding/base_embedding_driver.md#griptape.drivers.embedding.base_embedding_driver.BaseEmbeddingDriver.embed_string) for any string. + +You can optionally provide a [Tokenizer](../misc/tokenizers.md) via the [tokenizer](../../reference/griptape/drivers/embedding/base_embedding_driver.md#griptape.drivers.embedding.base_embedding_driver.BaseEmbeddingDriver.tokenizer) field to have the Driver automatically chunk the input text to fit into the token limit. + +## Embedding Drivers + +### OpenAI Embeddings + +The [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) uses the [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings). + + +```python +from griptape.drivers import OpenAiEmbeddingDriver + +embeddings = OpenAiEmbeddingDriver().embed_string("Hello Griptape!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` +``` +[0.0017853748286142945, 0.006118456833064556, -0.005811543669551611] +``` + +### Azure OpenAI Embeddings + +The [AzureOpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/azure_openai_embedding_driver.md) uses the same parameters as [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) +with updated defaults. + +### Bedrock Titan Embeddings + +!!! info + This driver requires the `drivers-embedding-amazon-bedrock` [extra](../index.md#extras). + +The [AmazonBedrockTitanEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.md) uses the [Amazon Bedrock Embeddings API](https://docs.aws.amazon.com/bedrock/latest/userguide/embeddings.html). + +```python +from griptape.drivers import AmazonBedrockTitanEmbeddingDriver + +embeddings = AmazonBedrockTitanEmbeddingDriver().embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` +``` +[-0.234375, -0.024902344, -0.14941406] +``` + +### Google Embeddings +!!! info + This driver requires the `drivers-embedding-google` [extra](../index.md#extras). + +The [GoogleEmbeddingDriver](../../reference/griptape/drivers/embedding/google_embedding_driver.md) uses the [Google Embeddings API](https://ai.google.dev/tutorials/python_quickstart#use_embeddings). + +```python +from griptape.drivers import GoogleEmbeddingDriver + +embeddings = GoogleEmbeddingDriver().embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` +``` +[0.0588633, 0.0033929371, -0.072810836] +``` + +### Hugging Face Hub Embeddings + +!!! info + This driver requires the `drivers-embedding-huggingface` [extra](../index.md#extras). + +The [HuggingFaceHubEmbeddingDriver](../../reference/griptape/drivers/embedding/huggingface_hub_embedding_driver.md) connects to the [Hugging Face Hub API](https://huggingface.co/docs/hub/api). It supports models with the following tasks: + +- feature-extraction + +```python +import os +from griptape.drivers import HuggingFaceHubEmbeddingDriver +from griptape.tokenizers import HuggingFaceTokenizer +from transformers import AutoTokenizer + +driver = HuggingFaceHubEmbeddingDriver( + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + model="sentence-transformers/all-MiniLM-L6-v2", + tokenizer=HuggingFaceTokenizer( + max_output_tokens=512, + tokenizer=AutoTokenizer.from_pretrained( + "sentence-transformers/all-MiniLM-L6-v2" + ) + ), +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` +### Multi Model Embedding Drivers +Certain embeddings providers such as Amazon SageMaker support many types of models, each with their own slight differences in parameters and response formats. To support this variation across models, these Embedding Drivers takes a [Embedding Model Driver](../../reference/griptape/drivers/embedding_model/base_embedding_model_driver.md) +through the [embedding_model_driver](../../reference/griptape/drivers/embedding/base_multi_model_embedding_driver.md#griptape.drivers.embedding.base_multi_model_embedding_driver.BaseMultiModelEmbeddingDriver.embedding_model_driver) parameter. +[Embedding Model Driver](../../reference/griptape/drivers/embedding_model/base_embedding_model_driver.md)s allows for model-specific customization for Embedding Drivers. + +#### SageMaker Embeddings + +The [AmazonSageMakerEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.md) uses the [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) to generate embeddings on AWS. + +!!! info + This driver requires the `drivers-embedding-amazon-sagemaker` [extra](../index.md#extras). + +##### TensorFlow Hub Models +```python title="PYTEST_IGNORE" +import os +from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerTensorFlowHubEmbeddingModelDriver + +driver = AmazonSageMakerEmbeddingDriver( + model=os.environ["SAGEMAKER_TENSORFLOW_HUB_MODEL"], + embedding_model_driver=SageMakerTensorFlowHubEmbeddingModelDriver(), +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` + +##### HuggingFace Models +```python title="PYTEST_IGNORE" +import os +from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerHuggingFaceEmbeddingModelDriver + +driver = AmazonSageMakerEmbeddingDriver( + model=os.environ["SAGEMAKER_HUGGINGFACE_MODEL"], + embedding_model_driver=SageMakerHuggingFaceEmbeddingModelDriver(), +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` + +### VoyageAI Embeddings +The [VoyageAiEmbeddingDriver](../../reference/griptape/drivers/embedding/voyageai_embedding_driver.md) uses the [VoyageAI Embeddings API](https://www.voyageai.com/). + +!!! info + This driver requires the `drivers-embedding-voyageai` [extra](../index.md#extras). + +```python +import os +from griptape.drivers import VoyageAiEmbeddingDriver + +driver = VoyageAiEmbeddingDriver( + api_key=os.environ["VOYAGE_API_KEY"] +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` + +### Override Default Structure Embedding Driver +Here is how you can override the Embedding Driver that is used by default in Structures. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper, TaskMemoryClient +from griptape.drivers import ( + OpenAiChatPromptDriver, + VoyageAiEmbeddingDriver, +) +from griptape.config import ( + StructureGlobalDriversConfig, + StructureConfig, +) + +agent = Agent( + tools=[WebScraper(), TaskMemoryClient(off_prompt=False)], + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), + embedding_driver=VoyageAiEmbeddingDriver(), + ) + ), +) + +agent.run("based on https://www.griptape.ai/, tell me what Griptape is") +``` diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md new file mode 100644 index 000000000..7389ff711 --- /dev/null +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -0,0 +1,174 @@ +## Overview + +[Image Generation Drivers](../../reference/griptape/drivers/image_generation/index.md) are used by [image generation Engines](../engines/image-generation-engines.md) to build and execute API calls to image generation models. + +Provide a Driver when building an [Engine](../engines/image-generation-engines.md), then pass it to a [Tool](../tools/index.md) for use by an [Agent](../structures/agents.md): + +```python +from griptape.structures import Agent +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import OpenAiImageGenerationDriver +from griptape.tools import PromptImageGenerationClient + +driver = OpenAiImageGenerationDriver( + model="dall-e-2", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") +``` + +### Amazon Bedrock + +The [Amazon Bedrock Image Generation Driver](../../reference/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.md) provides multi-model access to image generation models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. + +#### Bedrock Stable Diffusion Model Driver + +The [Bedrock Stable Diffusion Model Driver](../../reference/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.md) provides support for Stable Diffusion models hosted by Amazon Bedrock. This Model Driver supports configurations specific to Stable Diffusion, like style presets, clip guidance presets, and sampler. + +This Model Driver supports negative prompts. When provided (for example, when used with an [image generation Engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. + +```python +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver + +model_driver = BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", +) + +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=model_driver, + model="stability.stable-diffusion-xl-v0", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate an image of a dog riding a skateboard") +``` + +#### Bedrock Titan Image Generator Model Driver + +The [Bedrock Titan Image Generator Model Driver](../../reference/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.md) provides support for Titan Image Generator models hosted by Amazon Bedrock. This Model Driver supports configurations specific to Titan Image Generator, like quality, seed, and cfg_scale. + +This Model Driver supports negative prompts. When provided (for example, when used with an [image generation engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. + +```python +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockTitanImageGenerationModelDriver + +model_driver = BedrockTitanImageGenerationModelDriver() + +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=model_driver, + model="amazon.titan-image-generator-v1", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") +``` + +### Azure OpenAI + +The [Azure OpenAI Image Generation Driver](../../reference/griptape/drivers/image_generation/azure_openai_image_generation_driver.md) provides access to OpenAI models hosted by Azure. In addition to the configurations provided by the underlying OpenAI Driver, the Azure OpenAI Driver allows configuration of Azure-specific deployment values. + +```python +import os + +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AzureOpenAiImageGenerationDriver + +driver = AzureOpenAiImageGenerationDriver( + model="dall-e-3", + azure_deployment=os.environ["AZURE_OPENAI_DALL_E_3_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], + api_key=os.environ["AZURE_OPENAI_API_KEY_2"], +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") +``` + +### Leonardo.Ai + +The [Leonardo Image Generation Driver](../../reference/griptape/drivers/image_generation/leonardo_image_generation_driver.md) enables image generation using models hosted by [Leonardo.ai](https://leonardo.ai/). + +This Driver supports configurations like model selection, image size, specifying a generation seed, and generation steps. For details on supported configuration parameters, see [Leonardo.Ai's image generation documentation](https://docs.leonardo.ai/reference/creategeneration). + +This Driver supports negative prompts. When provided (for example, when used with an [image generation engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. + +```python +import os + +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import LeonardoImageGenerationDriver + +driver = LeonardoImageGenerationDriver( + model=os.environ["LEONARDO_MODEL_ID"], + api_key=os.environ["LEONARDO_API_KEY"], + image_width=512, + image_height=1024, +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") +``` + +### OpenAI + +The [OpenAI Image Generation Driver](../../reference/griptape/drivers/image_generation/openai_image_generation_driver.md) provides access to OpenAI image generation models. Like other OpenAI Drivers, the image generation Driver will implicitly load an API key in the `OPENAI_API_KEY` environment variable if one is not explicitly provided. + +This Driver supports image generation configurations like style presets, image quality preference, and image size. For details on supported configuration values, see the [OpenAI documentation](https://platform.openai.com/docs/guides/images/introduction). + +```python +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import OpenAiImageGenerationDriver + +driver = OpenAiImageGenerationDriver( + model="dall-e-2", + image_size="512x512", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent(tools=[ + PromptImageGenerationClient(engine=engine), +]) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") +``` diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md new file mode 100644 index 000000000..f643b09eb --- /dev/null +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -0,0 +1,124 @@ +# Image Query Drivers + +Image Query Drivers are used by [Image Query Engines](../engines/image-query-engines.md) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. + +!!! info + All Image Query Drivers default to a `max_tokens` of 256. It is recommended that you set this value to correspond to the desired response length. + +## AnthropicImageQueryDriver + +!!! info + To tune `max_tokens`, see [Anthropic's documentation on image tokens](https://docs.anthropic.com/claude/docs/vision#image-costs) for more information on how to relate token count to response length. + +The [AnthropicImageQueryDriver](../../reference/griptape/drivers/image_query/anthropic_image_query_driver.md) is used to query images using Anthropic's Claude 3 multi-modal model. Here is an example of how to use it: + +```python +from griptape.drivers import AnthropicImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AnthropicImageQueryDriver( + model="claude-3-sonnet-20240229", + max_tokens=1024, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` + +You can also specify multiple images with a single text prompt. This applies the same text prompt to all images specified, up to a max of 20. However, you will still receive one text response from the model currently. + +```python +from griptape.drivers import AnthropicImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AnthropicImageQueryDriver( + model="claude-3-sonnet-20240229", + max_tokens=1024, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact1 = ImageLoader().load(f.read()) + +with open("tests/resources/cow.png", "rb") as f: + image_artifact2 = ImageLoader().load(f.read()) + +result = engine.run("Describe the weather in the image", [image_artifact1, image_artifact2]) + +print(result) +``` + +## OpenAiVisionImageQueryDriver + +!!! info + This Driver defaults to using the `gpt-4-vision-preview` model. As other multimodal models are released, they can be specified using the `model` field. While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. + +The [OpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/openai_vision_image_query_driver.md) is used to query images using the OpenAI Vision API. Here is an example of how to use it: + +```python +from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiVisionImageQueryDriver( + model="gpt-4-vision-preview", + max_tokens=256, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` + +## AmazonBedrockImageQueryDriver + +The [Amazon Bedrock Image Query Driver](../../reference/griptape/drivers/image_query/amazon_bedrock_image_query_driver.md) provides multi-model access to image query models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. + +### Claude + +The [BedrockClaudeImageQueryModelDriver](../../reference/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.md) provides support for Claude models hosted by Bedrock. + +```python +from griptape.drivers import AmazonBedrockImageQueryDriver, BedrockClaudeImageQueryModelDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader +import boto3 + +session = boto3.Session( + region_name="us-west-2" +) + +driver = AmazonBedrockImageQueryDriver( + image_query_model_driver=BedrockClaudeImageQueryModelDriver(), + model="anthropic.claude-3-sonnet-20240229-v1:0", + session=session +) + +engine = ImageQueryEngine( + image_query_driver=driver +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + + +result = engine.run("Describe the weather in the image", [image_artifact]) + +print(result) +``` diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md new file mode 100644 index 000000000..db6bf5d96 --- /dev/null +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -0,0 +1,598 @@ +## Overview + +Prompt Drivers are used by Griptape Structures to make API calls to the underlying LLMs. [OpenAi Chat](#openai-chat) is the default prompt driver used in all structures. + +You can instantiate drivers and pass them to structures: + +```python +from griptape.structures import Agent +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4", temperature=0.3), + ) + ), + input_template="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", + rules=[ + Rule( + value="Output only the sentiment." + ) + ], +) + +agent.run("I loved the new Batman movie!") +``` + +Or use them independently: + +```python +from griptape.utils import PromptStack +from griptape.drivers import OpenAiChatPromptDriver + +stack = PromptStack() + +stack.add_system_input( + "You will be provided with Python code, and your task is to calculate its time complexity." +) +stack.add_user_input( +""" +def foo(n, k): + accum = 0 + for i in range(n): + for l in range(k): + accum += i + return accum +""" +) + +result = OpenAiChatPromptDriver(model="gpt-3.5-turbo-16k", temperature=0).run(stack) + +print(result.value) +``` + +## Prompt Drivers + +Griptape offers the following Prompt Drivers for interacting with LLMs. + +!!! warning + When overriding a default Prompt Driver, take care to ensure you've updated the Structure's configured Embedding Driver as well. If Task Memory isn't needed, you can avoid compatability issues by setting `task_memory=None` to disable Task Memory in your Structure. + +### OpenAI Chat + +The [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat_prompt_driver.md) connects to the [OpenAI Chat](https://platform.openai.com/docs/guides/chat) API. + +```python +import os +from griptape.structures import Agent +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=OpenAiChatPromptDriver( + api_key=os.environ["OPENAI_API_KEY"], + temperature=0.1, + model="gpt-3.5-turbo", + response_format="json_object", + seed=42, + ) + ) + ), + input_template="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", + rules=[ + Rule( + value='Write your output in json with a single key called "css_code".' + ) + ], +) + +agent.run("Blue sky at dusk.") +``` + +!!! info + `response_format` and `seed` are unique to the OpenAI Chat Prompt Driver and Azure OpenAi Chat Prompt Driver. + +### Azure OpenAI Chat + +The [AzureOpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/azure_openai_chat_prompt_driver.md) connects to Azure OpenAI [Chat Completion](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference) APIs. + +```python +import os +from griptape.structures import Agent +from griptape.rules import Rule +from griptape.drivers import AzureOpenAiChatPromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AzureOpenAiChatPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="gpt-3.5-turbo-16k", + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + ) + ) + ), + rules=[ + Rule( + value="You will be provided with text, and your task is to translate it into emojis. " + "Do not use any regular text. Do your best with emojis only." + ) + ], +) + +agent.run("Artificial intelligence is a technology with great promise.") +``` + +### Azure OpenAI Completion + +The [AzureOpenAiCompletionPromptDriver](../../reference/griptape/drivers/prompt/azure_openai_completion_prompt_driver.md) connects to Azure OpenAI [Text Completion](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference) API. + +```python +import os +from griptape.structures import Agent +from griptape.drivers import AzureOpenAiCompletionPromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AzureOpenAiCompletionPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="text-davinci-003", + azure_deployment=os.environ["AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + temperature=1 + ) + ) + ) +) + +agent.run( + """ + Write a product launch email for new AI-powered headphones that are priced at $79.99 and available at Best Buy, Target and Amazon.com. The target audience is tech-savvy music lovers and the tone is friendly and exciting. + + 1. What should be the subject line of the email? + 2. What should be the body of the email? + """ +) +``` + +### Cohere + +The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_driver.md) connects to the Cohere [Generate](https://docs.cohere.ai/reference/generate) API. + +!!! info + This driver requires the `drivers-prompt-cohere` [extra](../index.md#extras). + +```python +import os +from griptape.structures import Agent +from griptape.drivers import CoherePromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=CoherePromptDriver( + model="command", + api_key=os.environ['COHERE_API_KEY'], + ) + ) + ) +) + +agent.run('What is the sentiment of this review? Review: "I really enjoyed this movie!"') +``` + +### Anthropic + +!!! info + This driver requires the `drivers-prompt-anthropic` [extra](../index.md#extras). + +The [AnthropicPromptDriver](../../reference/griptape/drivers/prompt/anthropic_prompt_driver.md) connects to the Anthropic [Messages](https://docs.anthropic.com/claude/reference/messages_post) API. + +```python +import os +from griptape.structures import Agent +from griptape.drivers import AnthropicPromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AnthropicPromptDriver( + model="claude-3-opus-20240229", + api_key=os.environ['ANTHROPIC_API_KEY'], + ) + ) + ) +) + +agent.run('Where is the best place to see cherry blossums in Japan?') +``` + +### Google + +!!! info + This driver requires the `drivers-prompt-google` [extra](../index.md#extras). + +The [GooglePromptDriver](../../reference/griptape/drivers/prompt/google_prompt_driver.md) connects to the [Google Generative AI](https://ai.google.dev/tutorials/python_quickstart#generate_text_from_text_inputs) API. + +```python +import os +from griptape.structures import Agent +from griptape.drivers import GooglePromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=GooglePromptDriver( + model="gemini-pro", + api_key=os.environ['GOOGLE_API_KEY'], + ) + ) + ) +) + +agent.run('Briefly explain how a computer works to a young child.') +``` + +### Hugging Face Hub + +!!! info + This driver requires the `drivers-prompt-huggingface` [extra](../index.md#extras). + +The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_hub_prompt_driver.md) connects to the [Hugging Face Hub API](https://huggingface.co/docs/hub/api). It supports models with the following tasks: + +- text2text-generation +- text-generation + +Let's recreate the [Falcon-7B-Instruct](https://huggingface.co/tiiuae/falcon-7b-instruct) example using Griptape: + +```python +import os +from griptape.structures import Agent +from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.rules import Rule, Ruleset +from griptape.utils import PromptStack +from griptape.config import StructureConfig, StructureGlobalDriversConfig + + +def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: + prompt_lines = [] + + for i in prompt_stack.inputs: + if i.is_user(): + prompt_lines.append(f"User: {i.content}") + elif i.is_assistant(): + prompt_lines.append(f"Girafatron: {i.content}") + else: + prompt_lines.append(f"Instructions: {i.content}") + prompt_lines.append("Girafatron:") + + return "\n".join(prompt_lines) + + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=HuggingFaceHubPromptDriver( + model="tiiuae/falcon-7b-instruct", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + prompt_stack_to_string=prompt_stack_to_string_converter, + ) + ) + ), + rulesets=[ + Ruleset( + name="Girafatron", + rules=[ + Rule( + value="You are Girafatron, a giraffe-obsessed robot. You are talking to a human. " + "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " + "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." + ) + ] + ) + ], +) + +agent.run("Hello Girafatron, what is your favorite animal?") +``` + +#### Text Generation Interface + +The [HuggingFaceHubPromptDriver](#hugging-face-hub) also supports [Text Generation Interface](https://huggingface.co/docs/text-generation-inference/basic_tutorials/consuming_tgi#inference-client) for running models locally. To use Text Generation Interface, just set `model` to a TGI endpoint. + +```python title="PYTEST_IGNORE" +import os +from griptape.structures import Agent +from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=HuggingFaceHubPromptDriver( + model="http://127.0.0.1:8080", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + ), + ) + ), +) + +agent.run("Write the code for a snake game.") +``` + +### Hugging Face Pipeline + +!!! info + This driver requires the `drivers-prompt-huggingface` [extra](../index.md#extras). + +The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.md) uses [Hugging Face Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines) for inference locally. It supports models with the following tasks: + +- text2text-generation +- text-generation + +!!! warning + Running a model locally can be a computationally expensive process. + +```python +import os +from griptape.structures import Agent +from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.rules import Rule, Ruleset +from griptape.utils import PromptStack +from griptape.config import StructureConfig, StructureGlobalDriversConfig + + +# Override the default Prompt Stack to string converter +# to format the prompt in a way that is easier for this model to understand. +def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: + prompt_lines = [] + + for i in prompt_stack.inputs: + if i.is_user(): + prompt_lines.append(f"User: {i.content}") + elif i.is_assistant(): + prompt_lines.append(f"Girafatron: {i.content}") + else: + prompt_lines.append(f"Instructions: {i.content}") + prompt_lines.append("Girafatron:") + + return "\n".join(prompt_lines) + + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=HuggingFaceHubPromptDriver( + model="tiiuae/falcon-7b-instruct", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + prompt_stack_to_string=prompt_stack_to_string_converter, + ), + ) + ), + rulesets=[ + Ruleset( + name="Girafatron", + rules=[ + Rule( + value="You are Girafatron, a giraffe-obsessed robot. You are talking to a human. " + "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " + "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." + ) + ] + ) + ], +) + +agent.run("Hello Girafatron, what is your favorite animal?") +``` + +### Multi Model Prompt Drivers +Certain LLM providers such as Amazon SageMaker and Amazon Bedrock supports many types of models, each with their own slight differences in prompt structure and parameters. To support this variation across models, these Prompt Drivers takes a [Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md) +through the [prompt_model_driver](../../reference/griptape/drivers/prompt/base_multi_model_prompt_driver.md#griptape.drivers.prompt.base_multi_model_prompt_driver.BaseMultiModelPromptDriver.prompt_model_driver) parameter. +[Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md)s allows for model-specific customization for Prompt Drivers. + + +#### Amazon SageMaker + +!!! info + This driver requires the `drivers-prompt-amazon-sagemaker` [extra](../index.md#extras). + +The [AmazonSageMakerPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.md) uses [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) for inference on AWS. + +##### LLaMA + +```python title="PYTEST_IGNORE" +import os +from griptape.structures import Agent +from griptape.drivers import ( + AmazonSageMakerPromptDriver, + SageMakerLlamaPromptModelDriver, +) +from griptape.rules import Rule +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonSageMakerPromptDriver( + model=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], + prompt_model_driver=SageMakerLlamaPromptModelDriver(), + temperature=0.75, + ), + ) + ), + rules=[ + Rule( + value="You are a helpful, respectful and honest assistant who is also a swarthy pirate." + "You only speak like a pirate and you never break character." + ) + ], +) + +agent.run("Hello!") +``` + +##### Falcon + +```python title="PYTEST_IGNORE" +import os +from griptape.structures import Agent +from griptape.drivers import ( + AmazonSageMakerPromptDriver, + SageMakerFalconPromptModelDriver, +) +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonSageMakerPromptDriver( + model=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], + prompt_model_driver=SageMakerFalconPromptModelDriver(), + ), + ) + ) +) + +agent.run("What is a good lasagna recipe?") + +``` + +#### Amazon Bedrock + +!!! info + This driver requires the `drivers-prompt-amazon-bedrock` [extra](../index.md#extras). + +The [AmazonBedrockPromptDriver](../../reference/griptape/drivers/prompt/amazon_bedrock_prompt_driver.md) uses [Amazon Bedrock](https://aws.amazon.com/bedrock/) for inference on AWS. + +##### Amazon Titan + +To use this model with Amazon Bedrock, use the [BedrockTitanPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.md). + +```python +from griptape.structures import Agent +from griptape.drivers import AmazonBedrockPromptDriver, BedrockTitanPromptModelDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="amazon.titan-text-express-v1", + prompt_model_driver=BedrockTitanPromptModelDriver( + top_p=1, + ) + ) + ) + ) +) +agent.run( + "Write an informational article for children about how birds fly." + "Compare how birds fly to how airplanes fly." + 'Make sure to use the word "Thrust" at least three times.' +) +``` + +##### Anthropic Claude + +To use this model with Amazon Bedrock, use the [BedrockClaudePromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.md). + +```python +from griptape.structures import Agent +from griptape.drivers import AmazonBedrockPromptDriver, BedrockClaudePromptModelDriver +from griptape.rules import Rule +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + prompt_model_driver=BedrockClaudePromptModelDriver( + top_p=1, + ), + ), + ) + ), + rules=[ + Rule( + value="You are a customer service agent that is classifying emails by type. I want you to give your answer and then explain it." + ) + ], +) +agent.run( + """How would you categorize this email? + + Can I use my Mixmaster 4000 to mix paint, or is it only meant for mixing food? + + + Categories are: + (A) Pre-sale question + (B) Broken or defective item + (C) Billing question + (D) Other (please explain)""" +) +``` +##### Meta Llama 2 + +To use this model with Amazon Bedrock, use the [BedrockLlamaPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.md). + +```python +from griptape.structures import Agent +from griptape.drivers import AmazonBedrockPromptDriver, BedrockLlamaPromptModelDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="meta.llama2-13b-chat-v1", + prompt_model_driver=BedrockLlamaPromptModelDriver(), + ), + ) + ) +) +agent.run( + "Write an article about impact of high inflation to GDP of a country" +) +``` + +##### Ai21 Jurassic + +To use this model with Amazon Bedrock, use the [BedrockJurassicPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.md). + +```python +from griptape.structures import Agent +from griptape.drivers import AmazonBedrockPromptDriver, BedrockJurassicPromptModelDriver +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="ai21.j2-ultra-v1", + prompt_model_driver=BedrockJurassicPromptModelDriver(top_p=0.95), + temperature=0.7, + ) + ) + ) +) +agent.run( + "Suggest an outline for a blog post based on a title. " + "Title: How I put the pro in prompt engineering." +) +``` diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md new file mode 100644 index 000000000..35377849a --- /dev/null +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -0,0 +1,75 @@ +## Overview +SQL drivers can be used to make SQL queries and load table schemas. They are used by the [SqlLoader](../../reference/griptape/loaders/sql_loader.md) to process data. All loaders implement the following methods: + +* `execute_query()` executes a query and returns [RowResult](../../reference/griptape/drivers/sql/base_sql_driver.md#griptape.drivers.sql.base_sql_driver.BaseSqlDriver.RowResult.md)s. +* `execute_query_row()` executes a query and returns a raw result from SQL. +* `get_table_schema()` returns a table schema. + +!!! info + More database-specific SQL drivers are coming soon. + +## SqlDriver + +This is a basic SQL loader based on [SQLAlchemy 1.x](https://docs.sqlalchemy.org/en/14/). Here is an example of how to use it: + +```python +from griptape.drivers import SqlDriver + +driver = SqlDriver( + engine_url="sqlite:///:memory:" +) + +driver.execute_query("select 'foo', 'bar';") +``` + +## AmazonRedshiftSqlDriver + +!!! info + This driver requires the `drivers-sql-redshift` [extra](../index.md#extras). + +This is a SQL driver for interacting with the [Amazon Redshift Data API](https://docs.aws.amazon.com/redshift-data/latest/APIReference/Welcome.html) +to execute statements. Here is an example of how to use it for Redshift Serverless: + +```python +import boto3 +import os +from griptape.drivers import AmazonRedshiftSqlDriver + +session = boto3.Session() + +driver = AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], +) + +driver.execute_query("select * from people;") +``` + +## SnowflakeSqlDriver + +!!! info + This driver requires the `drivers-sql-snowflake` [extra](../index.md#extras). + +This is a SQL driver based on the [Snowflake SQLAlchemy Toolkit](https://docs.snowflake.com/en/developer-guide/python-connector/sqlalchemy) which runs on top of the Snowflake Connector for Python. Here is an example of how to use it: + +```python +import os +import snowflake.connector +from snowflake.connector import SnowflakeConnection +from griptape.drivers import SnowflakeSqlDriver + +def get_snowflake_connection() -> SnowflakeConnection: + return snowflake.connector.connect( + account=os.environ['SNOWFLAKE_ACCOUNT'], + user=os.environ['SNOWFLAKE_USER'], + password=os.environ['SNOWFLAKE_PASSWORD'], + database=os.environ['SNOWFLAKE_DATABASE'], + schema=os.environ['SNOWFLAKE_SCHEMA'], + warehouse=os.environ['SNOWFLAKE_WAREHOUSE'] + ) + +driver = SnowflakeSqlDriver(connection_func=get_snowflake_connection) + +driver.execute_query("select * from people;") +``` diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md new file mode 100644 index 000000000..e2e85d2c9 --- /dev/null +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -0,0 +1,417 @@ +## Overview + +Griptape provides a way to build drivers for vector DBs where embeddings can be stored and queried. Every vector store driver implements the following methods: + +- `upsert_text_artifact()` for updating or inserting a new [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) into vector DBs. The method will automatically generate embeddings for a given value. +- `upsert_text_artifacts()` for updating or inserting multiple [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s into vector DBs. The method will automatically generate embeddings for given values. +- `upsert_text()` for updating and inserting new arbitrary strings into vector DBs. The method will automatically generate embeddings for a given value. +- `upsert_vector()` for updating and inserting new vectors directly. +- `query()` for querying vector DBs. + +Each vector driver takes a [BaseEmbeddingDriver](../../reference/griptape/drivers/embedding/base_embedding_driver.md) used to dynamically generate embeddings for strings. + +!!! info + When working with vector database indexes with Griptape drivers, make sure the number of dimensions is equal to 1536. Nearly all embedding models create vectors with this number of dimensions. Check the documentation for your vector database on how to create/update vector indexes. + +!!! info + More vector drivers are coming soon. + +## Local Vector Store Driver + +The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the driver can be used to load a webpage into the driver and query it later: + +```python +import os +from griptape.artifacts import BaseArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) +artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") + +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query( + "creativity", + count=3, + namespace="griptape" +) + +values = [BaseArtifact.from_json(r.meta["artifact"]).value for r in results] + +print("\n\n".join(values)) + +``` + +## Pinecone Vector Store Driver + +!!! info + This driver requires the `drivers-vector-pinecone` [extra](../index.md#extras). + +The [PineconeVectorStoreDriver](../../reference/griptape/drivers/vector/pinecone_vector_store_driver.md) supports the [Pinecone vector database](https://www.pinecone.io/). + +Here is an example of how the driver can be used to load and query information in a Pinecone cluster: + +```python +import os +import hashlib +import json +from urllib.request import urlopen +from griptape.drivers import PineconeVectorStoreDriver, OpenAiEmbeddingDriver + +def load_data(driver: PineconeVectorStoreDriver) -> None: + response = urlopen( + "https://raw.githubusercontent.com/wedeploy-examples/" + "supermarket-web-example/master/products.json" + ) + + for product in json.loads(response.read()): + driver.upsert_text( + product["description"], + vector_id=hashlib.md5(product["title"].encode()).hexdigest(), + meta={ + "title": product["title"], + "description": product["description"], + "type": product["type"], + "price": product["price"], + "rating": product["rating"], + }, + namespace="supermarket-products", + ) + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = PineconeVectorStoreDriver( + api_key=os.environ["PINECONE_API_KEY"], + environment=os.environ["PINECONE_ENVIRONMENT"], + index_name=os.environ['PINECONE_INDEX_NAME'], + embedding_driver=embedding_driver, +) + +load_data(vector_store_driver) + +result = vector_store_driver.query( + "fruit", + count=3, + filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, + namespace="supermarket-products", +) +``` + +## Marqo Vector Store Driver + +!!! info + This driver requires the `drivers-vector-marqo` [extra](../index.md#extras). + +The [MarqoVectorStoreDriver](../../reference/griptape/drivers/vector/marqo_vector_store_driver.md) supports the Marqo vector database. + +Here is an example of how the driver can be used to load and query information in a Marqo cluster: + +```python +import os +from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.engines import VectorQueryEngine +from griptape.loaders import WebLoader +from griptape.tools import VectorStoreClient + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) +prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") + +# Define the namespace +namespace = 'griptape-ai' + +# Initialize the vector store driver +vector_store = MarqoVectorStoreDriver( + api_key=os.environ["MARQO_API_KEY"], + url=os.environ["MARQO_URL"], + index=os.environ["MARQO_INDEX_NAME"], + embedding_driver=embedding_driver, +) + +# Initialize the query engine +query_engine = VectorQueryEngine(vector_store_driver=vector_store, prompt_driver=prompt_driver) + +# Initialize the knowledge base tool +VectorStoreClient( + description="Contains information about the Griptape Framework from www.griptape.ai", + query_engine=query_engine, + namespace=namespace, +) + +# Load artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store.upsert_text_artifacts( + { + namespace: artifacts, + } +) +result = vector_store.query(query="What is griptape?") +print(result) +``` + +## Mongodb Atlas Vector Store Driver + +!!! info + This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). + +The [MongodbAtlasVectorStoreDriver](../../reference/griptape/drivers/vector/mongodb_atlas_vector_store_driver.md) provides support for storing vector data in a MongoDB Atlas database. + +Here is an example of how the driver can be used to load and query information in a MongoDb Atlas Cluster: + +```python +from griptape.drivers import MongoDbAtlasVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader +import os + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +host = os.environ["MONGODB_HOST"] +username = os.environ["MONGODB_USERNAME"] +password = os.environ["MONGODB_PASSWORD"] +database_name = os.environ["MONGODB_DATABASE_NAME"] +collection_name = os.environ[ "MONGODB_COLLECTION_NAME"] +index_name = os.environ["MONGODB_INDEX_NAME"] +vector_path = os.environ["MONGODB_VECTOR_PATH"] + +# Initialize the vector store driver +vector_store = MongoDbAtlasVectorStoreDriver( + connection_string=f"mongodb+srv://{username}:{password}@{host}/{database_name}", + database_name=database_name, + collection_name=collection_name, + embedding_driver=embedding_driver, + index_name=index_name, + vector_path=vector_path, +) + +# Load artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +result = vector_store.query(query="What is griptape?") +print(result) +``` + +The format for creating a vector index should look similar to the following: +```json +{ + "fields": [ + { + "numDimensions": 1536, + "path": "", + "similarity": "euclidean", + "type": "vector" + }, + { + "path": "namespace", + "type": "filter" + } + ] +} +``` +Replace `path_to_vector` with the expected field name where the vector content will be. + +## Azure MongoDB Vector Store Driver + +!!! info + This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). + +The [AzureMongoDbVectorStoreDriver](../../reference/griptape/drivers/vector/azure_mongodb_vector_store_driver.md) provides support for storing vector data in an Azure CosmosDb database account using the MongoDb vCore API + +Here is an example of how the driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is almost the same as the [MongodbAtlasVectorStoreDriver](#mongodb-atlas-vector-store-driver): + +```python +from griptape.drivers import AzureMongoDbVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader +import os + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +azure_host = os.environ["AZURE_MONGODB_HOST"] +username = os.environ["AZURE_MONGODB_USERNAME"] +password = os.environ["AZURE_MONGODB_PASSWORD"] +database_name = os.environ["AZURE_MONGODB_DATABASE_NAME"] +collection_name = os.environ["AZURE_MONGODB_COLLECTION_NAME"] +index_name = os.environ["AZURE_MONGODB_INDEX_NAME"] +vector_path = os.environ["AZURE_MONGODB_VECTOR_PATH"] + +# Initialize the vector store driver +vector_store = AzureMongoDbVectorStoreDriver( + connection_string=f"mongodb+srv://{username}:{password}@{azure_host}/{database_name}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000", + database_name=database_name, + collection_name=collection_name, + embedding_driver=embedding_driver, + index_name=index_name, + vector_path=vector_path, +) + +# Load artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +result = vector_store.query(query="What is griptape?") +print(result) +``` + +## Redis Vector Store Driver + +!!! info + This driver requires the `drivers-vector-redis` [extra](../index.md#extras). + +The [RedisVectorStoreDriver](../../reference/griptape/drivers/vector/redis_vector_store_driver.md) integrates with the Redis vector storage system. + +Here is an example of how the driver can be used to load and query information in a Redis Cluster: + +```python +import os +from griptape.drivers import RedisVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader +import numpy as np # Assuming you'd use numpy to create a dummy vector for the sake of example. + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = RedisVectorStoreDriver( + host=os.environ["REDIS_HOST"], + port=os.environ["REDIS_PORT"], + password=os.environ["REDIS_PASSWORD"], + index=os.environ["REDIS_INDEX"], + embedding_driver=embedding_driver, +) + +# Load artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +result = vector_store_driver.query(query="What is griptape?") +print(result) +``` + +The format for creating a vector index should be similar to the following: +``` +FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA tag TAG vector VECTOR FLAT 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE +``` + +## OpenSearch Vector Store Driver + +!!! info + This driver requires the `drivers-vector-opensearch` [extra](../index.md#extras). + +The [OpenSearchVectorStoreDriver](../../reference/griptape/drivers/vector/opensearch_vector_store_driver.md) integrates with the OpenSearch platform, allowing for storage, retrieval, and querying of vector data. + +Here is an example of how the driver can be used to load and query information in an OpenSearch Cluster: + +```python +import os +import boto3 +from griptape.drivers import AmazonOpenSearchVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an embedding driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = AmazonOpenSearchVectorStoreDriver( + host=os.environ["AMAZON_OPENSEARCH_HOST"], + index_name=os.environ["AMAZON_OPENSEARCH_INDEX_NAME"], + session=boto3.Session(), + embedding_driver=embedding_driver, +) + +# Load artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +# Upsert the artifacts into the vector store +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +result = vector_store_driver.query(query="What is griptape?") + +print(result) +``` + +The body mappings for creating a vector index should look similar to the following: +```json +{ + "mappings": { + "properties": { + "vector": {"type": "knn_vector", "dimension": 1536}, + "namespace": {"type": "keyword"}, + "metadata": {"type": "object", "enabled": true} + } + } +} +``` + +## PGVector Vector Store Driver + +!!! info + This driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). + +The [PGVectorVectorStoreDriver](../../reference/griptape/drivers/vector/pgvector_vector_store_driver.md) integrates with PGVector, a vector storage and search extension for Postgres. While Griptape will handle enabling the extension, PGVector must be installed and ready for use in your Postgres instance before using this vector store driver. + +Here is an example of how the driver can be used to load and query information in a Postgres database: + +```python +import os +from griptape.drivers import PgVectorVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an embedding driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +db_user = os.environ["POSTGRES_USER"] +db_pass = os.environ["POSTGRES_PASSWORD"] +db_host = os.environ["POSTGRES_HOST"] +db_port = os.environ["POSTGRES_PORT"] +db_name = os.environ["POSTGRES_DB"] +db_connection_string = f"postgresql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}" +vector_store_driver = PgVectorVectorStoreDriver( + connection_string=db_connection_string, + embedding_driver=embedding_driver, + table_name="griptape_vectors", +) + +# Install required Postgres extensions and create database schema. +vector_store_driver.setup() + +web_loader = WebLoader() +artifacts = web_loader.load("https://www.griptape.ai") +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +result = vector_store_driver.query("What is griptape?") +print(result) +``` diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md new file mode 100644 index 000000000..e1a3f53b3 --- /dev/null +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -0,0 +1,79 @@ +## Overview + +Web Scraper Drivers can be used to scrape text from the web. They are used by [WebLoader](../../reference/griptape/loaders/web_loader.md) to provide its functionality. All Web Scraper Drivers implement the following methods: + +* `scrape_url()` scrapes text from a website and returns a [TextArtifact](../../reference/griptape/artifacts/text_artifact.md). The format of the scrapped text is determined by the Driver. + +## Markdownify Web Scraper Driver + +!!! info + This driver requires the `drivers-web-scraper-markdownify` [extra](../index.md#extras) and the + playwright browsers to be installed. + + To install the playwright browsers, run `playwright install` in your terminal. If you are using + poetry, run `poetry run playwright install` instead. The `playwright` command should already be + installed as a dependency of the `drivers-web-scraper-markdownify` extra. For more details about + playwright, see [the playwright docs](https://playwright.dev/python/docs/library). + + Note that if you skip installing the playwright browsers, you will see the following error when + you run your code: + + ``` + playwright._impl._errors.Error: Executable doesn't exist at ... + ╔════════════════════════════════════════════════════════════╗ + ║ Looks like Playwright was just installed or updated. ║ + ║ Please run the following command to download new browsers: ║ + ║ ║ + ║ playwright install ║ + ║ ║ + ║ <3 Playwright Team ║ + ╚════════════════════════════════════════════════════════════╝ + ``` + +The [MarkdownifyWebScraperDriver](../../reference/griptape/drivers/web_scraper/markdownify_web_scraper_driver.md) outputs the scraped text in markdown format. It uses [playwright](https://pypi.org/project/playwright/) to render web pages along with dynamically loaded content, and a combination of [beautifulsoup4](https://pypi.org/project/beautifulsoup4/) and [markdownify](https://pypi.org/project/markdownify/) to produce a markdown representation of a webpage. It makes a best effort to produce a markdown representation of a webpage that is concise yet human (and LLM) readable. + +Example using `MarkdownifyWebScraperDriver` directly: + +```python +from griptape.drivers import MarkdownifyWebScraperDriver + +driver = MarkdownifyWebScraperDriver() + +driver.scrape_url("https://griptape.ai") +``` + +Example of using `MarkdownifyWebScraperDriver` with an agent: + +```python +from griptape.drivers import MarkdownifyWebScraperDriver +from griptape.loaders import WebLoader +from griptape.tools import TaskMemoryClient, WebScraper +from griptape.structures import Agent + +agent = Agent( + tools=[ + WebScraper( + web_loader=WebLoader( + web_scraper_driver=MarkdownifyWebScraperDriver(timeout=1000) + ), + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], +) +agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") +``` + +## Trafilatura Web Scraper Driver + +The [TrafilaturaWebScraperDriver](../../reference/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.md) scrapes text from a webpage using the [Trafilatura](https://trafilatura.readthedocs.io) library. + +Example of using `TrafilaturaWebScraperDriver` directly: + +```python +from griptape.drivers import TrafilaturaWebScraperDriver + +driver = TrafilaturaWebScraperDriver() + +driver.scrape_url("https://griptape.ai") +``` diff --git a/docs/griptape-framework/engines/extraction-engines.md b/docs/griptape-framework/engines/extraction-engines.md new file mode 100644 index 000000000..f7969ff4a --- /dev/null +++ b/docs/griptape-framework/engines/extraction-engines.md @@ -0,0 +1,79 @@ +## Overview +Extraction Engines in Griptape facilitate the extraction of data from text formats such as CSV and JSON. +These engines play a crucial role in the functionality of [Extraction Tasks](../../griptape-framework/structures/tasks.md). +As of now, Griptape supports two types of Extraction Engines: the CSV Extraction Engine and the JSON Extraction Engine. + +## CSV Extraction Engine + +The CSV Extraction Engine is designed specifically for extracting data from CSV-formatted content. + +!!! info + The CSV Extraction Engine requires the `column_names` parameter for specifying the columns to be extracted. + +```python +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import CsvExtractionEngine + +# Initialize the CsvExtractionEngine instance +csv_engine = CsvExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data +sample_text = """ +Alice, 28, lives in New York. +Bob, 35 lives in California. +Charlie is 40 and lives in Texas. +""" + +# Extract CSV rows using the engine +result = csv_engine.extract(sample_text, column_names=["name", "age", "location"]) + +for row in result.value: + print(row.to_text()) +``` +``` +name,age,location +Alice,28,New York +Bob,35,California +Charlie,40,Texas +``` + +## JSON Extraction Engine + +The JSON Extraction Engine is tailored for extracting data from JSON-formatted content. + +!!! info + The JSON Extraction Engine requires the `template_schema` parameter for specifying the structure to be extracted. + +```python +from schema import Schema + +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import JsonExtractionEngine + +json_engine = JsonExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data +sample_json_text = """ +Alice (Age 28) lives in New York. +Bob (Age 35) lives in California. +""" + +# Define a schema for extraction +user_schema = Schema( + {"users": [{"name": str, "age": int, "location": str}]} +).json_schema("UserSchema") + +# Extract data using the engine +result = json_engine.extract(sample_json_text, template_schema=user_schema) + +for artifact in result.value: + print(artifact.value) +``` +``` +{'name': 'Alice', 'age': 28, 'location': 'New York'} +{'name': 'Bob', 'age': 35, 'location': 'California'} +``` diff --git a/docs/griptape-framework/engines/image-generation-engines.md b/docs/griptape-framework/engines/image-generation-engines.md new file mode 100644 index 000000000..e5e7c77e1 --- /dev/null +++ b/docs/griptape-framework/engines/image-generation-engines.md @@ -0,0 +1,165 @@ +## Overview + +[Image Generation Engines](../../reference/griptape/engines/image/index.md) facilitate text-to-image and image-to-image generation. Each Engine provides a `run` method that accepts the necessary inputs for its particular mode and provides the request to the configured [Driver](../drivers/image-generation-drivers.md). + +### Image Generation Engine Rulesets + +[Rulesets](../structures/rulesets.md) and Negative Rulesets are used by Engines to influence a model's output. Input rulesets are added to request prompts and can be used to standardize generated images across varying prompts. Negative rulesets are treated as negatively-weighted prompts and can be used to describe features or characteristics that should be avoided in the result. + +In the following example, rulesets are provided to the Engine's `run()` method call. These rules are provided to the Driver and influence the model to generate an image in an artistic, watercolor style, while avoiding blurry, photographic characteristics. + +!!! note "Not all Drivers support Negative Rulesets" + See the [documentation for your Driver](../drivers/image-generation-drivers.md) to determine if it supports Negative Rulesets. + +```python +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.rules import Ruleset, Rule + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +positive_ruleset = Ruleset(name="positive rules", rules=[Rule("artistic"), Rule("watercolor")]) +negative_ruleset = Ruleset(name="negative rules", rules=[Rule("blurry"), Rule("photograph")]) + +engine.run( + prompts=["A dog riding a skateboard"], + rulesets=[positive_ruleset], + negative_rulesets=[negative_ruleset], +) +``` + +### Prompt Image Generation Engine + +This Engine facilitates generating images from text prompts. + +```python +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +engine.run( + prompts=["A watercolor painting of a dog riding a skateboard"], +) +``` + +### Variation Image Generation Engine + +This Engine facilitates generating variations of an input image according to a text prompt. The input image is used as a reference for the model's generation. + +```python +from griptape.engines import VariationImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.loaders import ImageLoader + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run( + prompts=["A photo of a mountain landscape in winter"], + image=image_artifact, +) +``` + +### Inpainting Image Generation Engine + +This Engine facilitates inpainting, or modifying an input image according to a text prompt within the bounds of a mask defined by mask image. After inpainting, the area specified by the mask is replaced with the model's generation, while the rest of the input image remains the same. + +```python +from griptape.engines import InpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.loaders import ImageLoader + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +with open("tests/resources/mountain-mask.png", "rb") as f: + mask_artifact = ImageLoader().load(f.read()) + +engine.run( + prompts=["A photo of a castle built into the side of a mountain"], + image=image_artifact, + mask=mask_artifact, +) +``` + +### Outpainting Image Generation Engine + +This Engine facilitates outpainting, or modifying an input image according to a text prompt outside the bounds of a mask defined by a mask image. After outpainting, the area of the input image specified by the mask remains the same, while the rest is replaced with the model's generation. + +```python +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.loaders import ImageLoader + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +with open("tests/resources/mountain-mask.png", "rb") as f: + mask_artifact = ImageLoader().load(f.read()) + +engine.run( + prompts=["A photo of a mountain shrouded in clouds"], + image=image_artifact, + mask=mask_artifact, +) +``` diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md new file mode 100644 index 000000000..a0b9309d8 --- /dev/null +++ b/docs/griptape-framework/engines/image-query-engines.md @@ -0,0 +1,25 @@ +# ImageQueryEngine + +The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) is used to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). + +All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. + +```python +from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiVisionImageQueryDriver( + model="gpt-4-vision-preview", + max_tokens=256 +) + +engine = ImageQueryEngine( + image_query_driver=driver +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` diff --git a/docs/griptape-framework/engines/query-engines.md b/docs/griptape-framework/engines/query-engines.md new file mode 100644 index 000000000..8acd4686d --- /dev/null +++ b/docs/griptape-framework/engines/query-engines.md @@ -0,0 +1,27 @@ +## Overview +Query engines are used to search collections of text. + +## VectorQueryEngine + +Used to query vector storages. You can set a custom [prompt_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.prompt_driver.md) and [vector_store_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.vector_store_driver.md). Uses [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) by default. + +Use the [upsert_text_artifact](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.upsert_text_artifact.md) method to insert [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s into vector storage with an optional `namespace`. + +Use the [VectorQueryEngine](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.query.md) method to query the vector storage. + +```python +from griptape.drivers import OpenAiChatPromptDriver, LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.engines import VectorQueryEngine +from griptape.loaders import WebLoader + +engine = VectorQueryEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), + vector_store_driver=LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) +) + +engine.upsert_text_artifacts( + WebLoader().load("https://www.griptape.ai"), namespace="griptape" +) + +engine.query("what is griptape?", namespace="griptape") +``` diff --git a/docs/griptape-framework/engines/summary-engines.md b/docs/griptape-framework/engines/summary-engines.md new file mode 100644 index 000000000..8ecc1ad09 --- /dev/null +++ b/docs/griptape-framework/engines/summary-engines.md @@ -0,0 +1,29 @@ +## Overview + +Summary engines are used to summarize text and collections of [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. + +## PromptSummaryEngine + +Used to summarize texts with LLMs. You can set a custom [prompt_driver](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.prompt_driver), [template_generator](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.template_generator), and [chunker](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.chunker). + +Use the [summarize_artifacts](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_artifacts) method to summarize a list of artifacts or [summarize_text](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_text) to summarize an arbitrary string. + +```python +import io +import requests + +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import PromptSummaryEngine +from griptape.loaders import PdfLoader + +response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") +engine = PromptSummaryEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +artifacts = PdfLoader().load(response.content) + +text = "\n\n".join([a.value for a in artifacts]) + +engine.summarize_text(text) +``` diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md new file mode 100644 index 000000000..7c33e0588 --- /dev/null +++ b/docs/griptape-framework/index.md @@ -0,0 +1,208 @@ +The Griptape framework provides developers with the ability to create AI systems that operate across two dimensions: **predictability** and **creativity**. + +For **predictability**, Griptape enforces structures like sequential pipelines, DAG-based workflows, and long-term memory. To facilitate creativity, Griptape safely prompts LLMs with tools and short-term memory connecting them to external APIs and data stores. The framework allows developers to transition between those two dimensions effortlessly based on their use case. + +Griptape not only helps developers harness the potential of LLMs but also enforces trust boundaries, schema validation, and tool activity-level permissions. By doing so, Griptape maximizes LLMs’ reasoning while adhering to strict policies regarding their capabilities. + +Griptape’s design philosophy is based on the following tenets: + +1. **Modularity and composability**: All framework primitives are useful and usable on their own in addition to being easy to plug into each other. +2. **Technology-agnostic**: Griptape is designed to work with any capable LLM, data store, and backend through the abstraction of drivers. +3. **Keep data off prompt by default**: When working with data through loaders and tools, Griptape aims to keep it off prompt by default, making it easy to work with big data securely and with low latency. +4. **Minimal prompt engineering**: It’s much easier to reason about code written in Python, not natural languages. Griptape aims to default to Python in most cases unless absolutely necessary. + +## Quick Start + +### OpenAI API Key +First, configure an OpenAI client by [getting an API key](https://platform.openai.com/account/api-keys) and adding it to your environment as `OPENAI_API_KEY`. +By default, Griptape uses [OpenAI Completions API](https://platform.openai.com/docs/guides/completion) to execute LLM prompts, but other LLMs can be configured with the use of [Prompt Drivers](./drivers/prompt-drivers.md). + +### Using pip + +Install **griptape**: + +``` +pip install griptape[all] -U +``` + +### Using Poetry + +To get started with Griptape using Poetry first create a new poetry project from the terminal: + +``` +poetry new griptape-quickstart +``` + +Change your working directory to the new `griptape-quickstart` directory created by Poetry and add the the `griptape` dependency. + +``` +poetry add griptape[all] +``` + +### Extras + +The `[all]` [extra](https://peps.python.org/pep-0508/#extras) ensures that you have access to the entire range of functionalities that Griptape offers. +This comprehensive installation is recommended for newcomers to get the complete Griptape experience. + +However, if you wish to optimize the installation size or only require specific functionalities, you have two main options: + +1. Core Dependencies: These are the foundational dependencies that enable Griptape to function with most of its default settings. +2. Extras: These are additional, vendor-specific drivers integrated within the Griptape framework. If a particular Driver mandates an extra, it will be explicitly highlighted in the documentation. + +To install just the core dependencies: +``` +poetry add griptape +``` + +To install specific extras (e.g., drivers for [AnthropicPromptDriver](./drivers/prompt-drivers.md#anthropic) and [PineconeVectorStoreDriver](./drivers/vector-store-drivers.md#pinecone)): +``` +poetry add griptape[drivers-prompt-anthropic,drivers-vector-pinecone] +``` + +For a comprehensive list of extras, please refer to the `[tool.poetry.extras]` section of Griptape's [pyproject.toml](https://github.com/griptape-ai/griptape/blob/main/pyproject.toml). + +## Build a Simple Agent +With Griptape, you can create *structures*, such as [Agents](./structures/agents.md), [Pipelines](./structures/pipelines.md), and [Workflows](./structures/workflows.md), that are composed of different types of tasks. First, let's build a simple Agent that we can interact with through a chat based interface. + +```python +from griptape.structures import Agent +from griptape.utils import Chat + +agent = Agent() +Chat(agent).start() +``` +Run this script in your IDE and you'll be presented with a `Q:` prompt where you can interact with your model. +``` +Q: Write me a haiku about griptape +processing... +[09/08/23 09:52:45] INFO PromptTask d4302227570e4a978ed79e7e0444337b + Input: Write me a haiku about griptape +[09/08/23 09:52:48] INFO PromptTask d4302227570e4a978ed79e7e0444337b + Output: Griptape rough and true, + Skateboard's trusty, silent guide, + In each ride, we're glued. +A: Griptape rough and true, +Skateboard's trusty, silent guide, +In each ride, we're glued. +Q: +``` +If you want to skip the chat interface and load an initial prompt, you can do so using the `.run()` method: + +```python +from griptape.structures import Agent +from griptape.utils import Chat + +agent = Agent() +agent.run("write me a haiku about griptape") +``` +Agents on their own are fun, but let's add some capabilities to them using Griptape Tools. +### Build a Simple Agent with Tools + +```python +from griptape.structures import Agent +from griptape.tools import Calculator + +calculator = Calculator(off_prompt=False) + +agent = Agent( + tools=[calculator] +) + +agent.run( + "what is 7^12" +) +``` +Here is the chain of thought from the Agent. Notice where it realizes it can use the tool you just injected to do the calculation.[^1] +[^1]: In some cases a model might be capable of basic arithmetic. For example, gpt-3.5 returns the correct numeric answer but in an odd format. + +``` +[09/08/23 09:53:42] INFO ToolkitTask c87320c5ab1b4988acf25c107b46dffa + Input: what is 7^12 +[09/08/23 09:53:49] INFO Subtask f3f41104a2234a69832c7eacb64e7324 + Thought: The user is asking for the value of 7 raised to the power of 12. I can use the Calculator tool to + perform this calculation. + + Action: {"name": "Calculator", "path": "calculate", "input": {"values": {"expression": + "7**12"}}} + INFO Subtask f3f41104a2234a69832c7eacb64e7324 + Response: 13841287201 +[09/08/23 09:53:51] INFO ToolkitTask c87320c5ab1b4988acf25c107b46dffa + Output: The value of 7 raised to the power of 12 is 13841287201. +``` + +## Build a Simple Pipeline + +Agents are great for getting started, but they are intentionally limited to a single task. Pipelines, however, allow us to define any number of tasks to run in sequence. Let's define a simple two-task Pipeline that uses tools and memory: + +```python +from griptape.memory.structure import ConversationMemory +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask, PromptTask +from griptape.tools import WebScraper, FileManager, TaskMemoryClient + + +# Pipelines represent sequences of tasks. +pipeline = Pipeline( + conversation_memory=ConversationMemory() +) + +pipeline.add_tasks( + # Load up the first argument from `pipeline.run`. + ToolkitTask( + "{{ args[0] }}", + # Add tools for web scraping, and file management + tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + ), + # Augment `input` from the previous task. + PromptTask( + "Say the following in spanish: {{ parent_output }}" + ) +) + +pipeline.run( + "Load https://www.griptape.ai, summarize it, and store it in griptape.txt" +) +``` + +``` +[09/08/23 10:02:34] INFO ToolkitTask 3c1d2f4a49384873820a9a8cd8acc983 + Input: Load https://www.griptape.ai, summarize it, and store it in griptape.txt +[09/08/23 10:02:44] INFO Subtask 42fd56ba100e45688401c5ce32b79a33 + Thought: To complete this task, I need to first load the webpage using the WebScraper tool's get_content + activity. Then, I will summarize the content using the TaskMemory tool's summarize activity. Finally, I will + store the summarized content in a file named griptape.txt using the FileManager tool's save_file_to_disk + activity. + + Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": + "https://www.griptape.ai"}}} +[09/08/23 10:02:45] INFO Subtask 42fd56ba100e45688401c5ce32b79a33 + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and + artifact_namespace "39ca67bbe26b4e1584193b87ed82170d" +[09/08/23 10:02:53] INFO Subtask 8023e3d257274df29065b22e736faca8 + Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity + to summarize the content. + Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d"}}} +[09/08/23 10:02:57] INFO Subtask 8023e3d257274df29065b22e736faca8 + Response: Griptape is an open source framework that allows developers to build and deploy AI applications + using large language models (LLMs). It provides the ability to create conversational and event-driven apps that + can securely access and manipulate data. The framework enforces structures for predictability and creativity, + allowing developers to easily transition between the two. Griptape Cloud is a managed platform for deploying and + managing AI apps. +[09/08/23 10:03:06] INFO Subtask 7baae700239943c18b5b6b21873f0e13 + Thought: Now that I have the summarized content, I can store it in a file named griptape.txt using the + FileManager tool's save_file_to_disk activity. + Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": + {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d", "path": + "griptape.txt"}}} + INFO Subtask 7baae700239943c18b5b6b21873f0e13 + Response: saved successfully +[09/08/23 10:03:14] INFO ToolkitTask 3c1d2f4a49384873820a9a8cd8acc983 + Output: The summarized content of the webpage https://www.griptape.ai has been successfully stored in the file + named griptape.txt. + INFO PromptTask 8635925ff23b46f28a740105bd11ca8f + Input: Say the following in spanish: The summarized content of the webpage https://www.griptape.ai has been + successfully stored in the file named griptape.txt. +[09/08/23 10:03:18] INFO PromptTask 8635925ff23b46f28a740105bd11ca8f + Output: El contenido resumido de la página web https://www.griptape.ai se ha almacenado con éxito en el archivo + llamado griptape.txt. +``` diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md new file mode 100644 index 000000000..bd43f2404 --- /dev/null +++ b/docs/griptape-framework/misc/events.md @@ -0,0 +1,271 @@ +## Overview + +You can use [EventListener](../../reference/griptape/events/event_listener.md)s to listen for events during a Structure's execution. + +## Specific Event Types + +You can listen to specific event types: + +```python +from griptape.structures import Agent +from griptape.events import ( + BaseEvent, + StartTaskEvent, + FinishTaskEvent, + StartActionsSubtaskEvent, + FinishActionsSubtaskEvent, + StartPromptEvent, + FinishPromptEvent, + EventListener, +) +from griptape.drivers import LocalEventListenerDriver + + +def handler(event: BaseEvent): + print(event.__class__) + + +agent = Agent( + event_listeners=[ + EventListener( + event_types=[ + StartTaskEvent, + FinishTaskEvent, + StartActionsSubtaskEvent, + FinishActionsSubtaskEvent, + StartPromptEvent, + FinishPromptEvent, + ], + driver=LocalEventListenerDriver(handler=handler), + ) + ] +) + +agent.run("tell me about griptape") +``` +``` + +[09/08/23 10:51:16] INFO PromptTask a20c236d1d86480fb14ae976e6cf8983 + Input: tell me about griptape + + +[09/08/23 10:51:27] INFO PromptTask a20c236d1d86480fb14ae976e6cf8983 + Output: Griptape is a gritty, sandpaper-like material that is applied to the top of a skateboard deck. It + provides traction and grip, allowing skateboarders to keep their feet firmly on the board and perform tricks more + easily. Griptape comes in different colors and designs, but the most common type is black. It's adhesive on one + side so it can stick to the skateboard. Over time, griptape can wear down and need to be replaced to maintain + optimal performance. It's an essential component for skateboarding and other similar sports. + +``` + +## All Event Types + +Or listen to all events: + +```python +from griptape.structures import Agent +from griptape.events import BaseEvent, EventListener +from griptape.drivers import LocalEventListenerDriver + + +def handler1(event: BaseEvent): + print("Handler 1", event.__class__) + + +def handler2(event: BaseEvent): + print("Handler 2", event.__class__) + + +agent = Agent( + event_listeners=[ + EventListener(driver=LocalEventListenerDriver(handler=handler1)), + EventListener(driver=LocalEventListenerDriver(handler=handler1)), + ] +) + +agent.run("tell me about griptape") +``` + +``` +Handler 1 +Handler 2 +Handler 1 +Handler 2 +[10/26/23 11:49:29] INFO PromptTask 20e3ef1f8856453ebabc84863ac36784 + Input: tell me about griptape +Handler 1 +Handler 2 +Handler 1 +Handler 2 +[10/26/23 11:49:55] INFO PromptTask 20e3ef1f8856453ebabc84863ac36784 + Output: Griptape is a gritty, sandpaper-like material that is applied to the top of + a skateboard, longboard, or scooter deck to provide traction between the rider's + feet and the deck. It is an essential component for performing tricks and + maintaining control of the board or scooter. + + Griptape is typically black, but it comes in a variety of colors and designs. It is + made by embedding an abrasive material (similar to sand) into a tough, + weather-resistant adhesive. The adhesive side is then applied to the deck, while + the abrasive side faces up to provide grip. + + The grip provided by the griptape allows riders to keep their footing on the board, + especially during tricks where the board is flipped or spun. It also helps riders + control the board better during downhill rides or sharp turns. + + Over time, griptape can wear down and lose its effectiveness, at which point it can + be removed and replaced. It's an essential part of skateboarding equipment and + plays a significant role in the sport's safety and performance. +Handler 1 +Handler 2 +Handler 1 +Handler 2 +``` + +## Streaming + + +You can use the [CompletionChunkEvent](../../reference/griptape/events/completion_chunk_event.md) to stream the completion results from Prompt Drivers. + +```python +from griptape.events import CompletionChunkEvent, EventListener +from griptape.tasks import ToolkitTask +from griptape.structures import Pipeline +from griptape.tools import WebScraper, TaskMemoryClient +from griptape.drivers import LocalEventListenerDriver + + +pipeline = Pipeline( + event_listeners=[ + EventListener( + driver=LocalEventListenerDriver(handler=lambda e: print(e.token, end="", flush=True)), + event_types=[CompletionChunkEvent], + ) + ] +) + +pipeline.add_tasks( + ToolkitTask( + "Based on https://griptape.ai, tell me what griptape is.", + tools=[WebScraper(), TaskMemoryClient(off_prompt=False)], + ) +) + +pipeline.run() +``` + +You can also use the [Stream](../../reference/griptape/utils/stream.md) utility to automatically wrap +[CompletionChunkEvent](../../reference/griptape/events/completion_chunk_event.md)s in a Python iterator. + +```python +from griptape.utils import Stream +from griptape.tasks import ToolkitTask +from griptape.structures import Pipeline +from griptape.tools import WebScraper + + +pipeline = Pipeline() +pipeline.config.global_drivers.prompt_driver.stream = True +pipeline.add_tasks(ToolkitTask("Based on https://griptape.ai, tell me what griptape is.", tools=[WebScraper()])) + +for artifact in Stream(pipeline).run(): + print(artifact.value, end="", flush=True), +``` + + +## Counting Tokens + +To count tokens, you can use Event Listeners and the [TokenCounter](../../reference/griptape/utils/token_counter.md) util: + +```python +from griptape import utils +from griptape.events import BaseEvent, StartPromptEvent, FinishPromptEvent, EventListener +from griptape.structures import Agent +from griptape.drivers import LocalEventListenerDriver + + +token_counter = utils.TokenCounter() + + +def count_tokens(e: BaseEvent): + if isinstance(e, StartPromptEvent) or isinstance(e, FinishPromptEvent): + token_counter.add_tokens(e.token_count) + + +agent = Agent( + event_listeners=[ + EventListener( + driver=LocalEventListenerDriver(handler=lambda e: count_tokens(e)), + event_types=[StartPromptEvent, FinishPromptEvent], + ) + ] +) + +agent.run("tell me about large language models") + +print(f"total tokens: {token_counter.tokens}") +``` + +``` +[09/25/23 16:32:41] INFO PromptTask c93569eb1d264675b52bef184b269621 + Input: tell me about large language models +[09/25/23 16:33:01] INFO PromptTask c93569eb1d264675b52bef184b269621 + Output: Large language models are a type of artificial intelligence model that are trained on + a vast amount of text data. They are designed to generate human-like text based on the input + they are given. These models can answer questions, write essays, summarize texts, translate + languages, and even generate creative content like poetry or stories. + + One of the most well-known large language models is GPT-3, developed by OpenAI. It has 175 + billion machine learning parameters and was trained on hundreds of gigabytes of text. + + These models work by predicting the probability of a word given the previous words used in + the text. They don't understand text in the way humans do, but they can generate coherent and + contextually relevant sentences by learning patterns in the data they were trained on. + + However, they also have limitations. For instance, they can sometimes generate incorrect or + nonsensical responses. They can also be sensitive to slight changes in input phrasing, and + they don't have the ability to fact-check information or access real-time data, so they can't + provide up-to-date information or verify the truthfulness of their outputs. They also don't + have a sense of ethics or morality, so they rely on guidelines and safety measures put in + place by their developers. +total tokens: 273 +``` + + +## Inspecting Payloads + +You can use the [StartPromptEvent](../../reference/griptape/events/start_prompt_event.md) to inspect the Prompt Stack and final prompt string before it is sent to the LLM. + +```python +from griptape.structures import Agent +from griptape.events import BaseEvent, StartPromptEvent, EventListener +from griptape.drivers import LocalEventListenerDriver + + +def handler(event: BaseEvent): + if isinstance(event, StartPromptEvent): + print("Prompt Stack Inputs:") + for input in event.prompt_stack.inputs: + print(f"{input.role}: {input.content}") + print("Final Prompt String:") + print(event.prompt) + + +agent = Agent( + event_listeners=[EventListener(driver=LocalEventListenerDriver(handler=handler), event_types=[StartPromptEvent])] +) + +agent.run("Write me a poem.") +``` +``` +... +Prompt Stack Inputs: +system: +user: Write me a poem. +Final Prompt String: + + +User: Write me a poem. + +Assistant: +... +``` diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md new file mode 100644 index 000000000..b523d04e4 --- /dev/null +++ b/docs/griptape-framework/misc/tokenizers.md @@ -0,0 +1,143 @@ +## Overview + +Tokenizers are used throughout Griptape to calculate the number of [tokens](https://learn.microsoft.com/en-us/semantic-kernel/prompt-engineering/tokens) in a piece of text. +They are particulary useful for ensuring that the LLM token limits are not exceeded. + +Tokenizers are a low level abstraction that you will rarely interact with directly. + +## Tokenizers + +### OpenAI + +```python +from griptape.tokenizers import OpenAiTokenizer + + +tokenizer = OpenAiTokenizer(model="gpt-4") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +### Cohere +```python +import os +from cohere import Client +from griptape.tokenizers import CohereTokenizer + + +tokenizer = CohereTokenizer( + model="command", client=Client(os.environ["COHERE_API_KEY"]) +) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +### Anthropic + +```python +from griptape.tokenizers import AnthropicTokenizer + + +tokenizer = AnthropicTokenizer(model="claude-3-opus-20240229") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +### Google + +```python +import os +from griptape.tokenizers import GoogleTokenizer + +tokenizer = GoogleTokenizer(model="gemini-pro", api_key=os.environ["GOOGLE_API_KEY"]) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +### Hugging Face +```python +from transformers import AutoTokenizer +from griptape.tokenizers import HuggingFaceTokenizer + + +tokenizer = HuggingFaceTokenizer( + max_output_tokens=512, + tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2") +) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +### Bedrock + +#### Anthropic Claude +```python +from griptape.tokenizers import BedrockClaudeTokenizer + + +tokenizer = BedrockClaudeTokenizer(model="anthropic.claude-3-sonnet-20240229-v1:0") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +#### Amazon Titan +```python +from griptape.tokenizers import BedrockTitanTokenizer + + +tokenizer = BedrockTitanTokenizer(model="amazon.titan-text-express-v1") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +#### Meta Llama 2 +```python +from griptape.tokenizers import BedrockLlamaTokenizer + + +tokenizer = BedrockLlamaTokenizer(model="meta.llama2-13b-chat-v1") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + +#### Ai21 Jurassic +```python +from griptape.tokenizers import BedrockJurassicTokenizer + + +tokenizer = BedrockJurassicTokenizer(model="ai21.j2-ultra-v1") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` + + +### Simple +Not all LLM providers have a public tokenizer API. In this case, you can use the `SimpleTokenizer` to count tokens based on a simple heuristic. + +```python +from griptape.tokenizers import SimpleTokenizer + +tokenizer = SimpleTokenizer(max_input_tokens=1024, max_output_tokens=1024, characters_per_token=6) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md new file mode 100644 index 000000000..8737d2a59 --- /dev/null +++ b/docs/griptape-framework/structures/agents.md @@ -0,0 +1,79 @@ +## Overview + +An [Agent](../../reference/griptape/structures/agent.md) is the quickest way to get started with Griptape. +Agents take in [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) and [input_template](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.input_template) +directly, which the agent uses to dynamically determine whether to use a [Prompt Task](./tasks.md#prompt-task) or [Toolkit Task](./tasks.md#toolkit-task). + +If [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) are passed provided to the Agent, a [Toolkit Task](./tasks.md#toolkit-task) will be used. If no [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) +are provided, a [Prompt Task](./tasks.md#prompt-task) will be used. + +## Toolkit Task Agent + +```python +from griptape.tools import Calculator +from griptape.structures import Agent + + +agent = Agent( + input_template="Calculate the following: {{ args[0] }}", + tools=[Calculator()] +) + +agent.run("what's 123^312?") +``` + +``` +[09/08/23 10:11:31] INFO ToolkitTask 319f53af2e564c15a3b97992fc039ec9 + Input: Calculate the following: what's 123^312? +[09/08/23 10:11:55] INFO Subtask cbd5bb8684ad4fc59958201efbf14743 + Thought: The user wants to calculate the value of 123 raised to the power of 312. I can use the Calculator tool + to perform this calculation. + + Action: {"name": "Calculator", "path": "calculate", "input": {"values": {"expression": + "123**312"}}} + INFO Subtask cbd5bb8684ad4fc59958201efbf14743 + Response: + 11230388208945295722090491952733133124202871121067044284403441616854053130045246777417573635449877716182202751456 + 62903768337745814236262209544548389555407097435988334710646912635818793342584092805141253230302226219003560706069 + 42457739968799225811781682901969575983855664495472037997890318771511185547708335412624757899597237206373758262442 + 72269858013479598852506666010704868797813623903160430655651532132073996589276408598241791795573009265505912300559 + 47848517605515539611362917584666826953065776743002119105282582194109888263281423789852046556346579319777145449509 + 5671672325351081760983520684046903739998382099007883142337182654942065184263509761170721 +[09/08/23 10:12:22] INFO ToolkitTask 319f53af2e564c15a3b97992fc039ec9 + Output: The result of 123 raised to the power of 312 is + 11230388208945295722090491952733133124202871121067044284403441616854053130045246777417573635449877716182202751456 + 62903768337745814236262209544548389555407097435988334710646912635818793342584092805141253230302226219003560706069 + 42457739968799225811781682901969575983855664495472037997890318771511185547708335412624757899597237206373758262442 + 72269858013479598852506666010704868797813623903160430655651532132073996589276408598241791795573009265505912300559 + 47848517605515539611362917584666826953065776743002119105282582194109888263281423789852046556346579319777145449509 + 5671672325351081760983520684046903739998382099007883142337182654942065184263509761170721. +``` + +## Prompt Task Agent + +```python +from griptape.structures import Agent +from griptape.tasks import PromptTask + + +agent = Agent() +agent.add_task( + PromptTask( + "Write me a {{ creative_medium }} about {{ args[0] }} and {{ args[1] }}", + context={ + 'creative_medium': 'haiku' + } + ) +) + +agent.run("Skateboards", "Programming") +``` + +``` +[09/08/23 10:10:24] INFO PromptTask e70fb08090b24b91a9307fa83479e851 + Input: Write me a haiku about Skateboards and Programming +[09/08/23 10:10:28] INFO PromptTask e70fb08090b24b91a9307fa83479e851 + Output: Code on wheels in flight, + Skateboards meet algorithms bright, + In binary, we ignite. +``` diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md new file mode 100644 index 000000000..c392200f9 --- /dev/null +++ b/docs/griptape-framework/structures/config.md @@ -0,0 +1,147 @@ +## Overview + +The [StructureConfig](../../reference/griptape/config/structure_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. + +### Premade Configs + +Griptape provides predefined [StructureConfig](../../reference/griptape/config/structure_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. + +#### OpenAI + +The [OpenAI Structure Config](../../reference/griptape/config/openai_structure_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. + + +```python +from griptape.structures import Agent +from griptape.config import OpenAiStructureConfig + +agent = Agent( + config=OpenAiStructureConfig() +) + +agent = Agent() # This is equivalent to the above +``` + +#### Amazon Bedrock +The [Amazon Bedrock Structure Config](../../reference/griptape/config/amazon_bedrock_structure_config.md) provides default Drivers for Amazon Bedrock's APIs. + +```python +from griptape.structures import Agent +from griptape.config import AmazonBedrockStructureConfig + +agent = Agent( + config=AmazonBedrockStructureConfig() +) +``` + +#### Google +The [Google Structure Config](../../reference/griptape/config/google_structure_config.md) provides default Drivers for Google's Gemini APIs. + +```python +from griptape.structures import Agent +from griptape.config import GoogleStructureConfig + +agent = Agent( + config=GoogleStructureConfig() +) +``` + +#### Anthropic + +The [Anthropic Structure Config](../../reference/griptape/config/anthropic_structure_config.md) provides default Drivers for Anthropic's APIs. + +!!! info + Anthropic does not provide an embeddings API which means you will need to use another service for embeddings. + The `AnthropicStructureConfig` defaults to using `VoyageAiEmbeddingDriver` which integrates with [VoyageAI](https://www.voyageai.com/), the service used in Anthropic's [embeddings documentation](https://docs.anthropic.com/claude/docs/embeddings). + To override the default embedding driver, see: [Override Default Structure Embedding Driver](../drivers/embedding-drivers.md#override-default-structure-embedding-driver). + + +```python +from griptape.structures import Agent +from griptape.config import AnthropicStructureConfig + +agent = Agent( + config=AnthropicStructureConfig() +) +``` + +### Custom Configs + +You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding the Drivers in [default_config](../../reference/griptape/config/structure_config.md#griptape.config.structure_config.StructureConfig.default_config). +The [StructureConfig](../../reference/griptape/config/structure_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyException](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. +This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. + +```python +import os +from griptape.structures import Agent +from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.drivers import AnthropicPromptDriver + +agent = Agent( + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=AnthropicPromptDriver( + model="claude-3-sonnet-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], + ) + ) + ), +) +``` + +### Task Memory + +Griptape allows for detailed control over [Task Memory](./task-memory.md) settings, permitting overrides on a per Engine basis, beyond the global Drivers configuration. + +```python +from griptape.structures import Agent +from griptape.config import StructureConfig, StructureTaskMemoryConfig, StructureTaskMemoryQueryEngineConfig +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver + + +agent = Agent( + config=StructureConfig( + task_memory=StructureTaskMemoryConfig( + query_engine=StructureTaskMemoryQueryEngineConfig( + vector_store_driver=LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), + ) + ) + ) + ) +) +``` + +### Loading/Saving Configs + +Configuration classes in Griptape offer utility methods for loading, saving, and merging configurations, streamlining the management of complex setups. + +```python +from griptape.structures import Agent +from griptape.config import AmazonBedrockStructureConfig +from griptape.drivers import AmazonBedrockCohereEmbeddingDriver + +custom_config = AmazonBedrockStructureConfig() +custom_config.global_drivers.embedding_driver = AmazonBedrockCohereEmbeddingDriver() +custom_config.merge_config( + { + "task_memory": { + "summary_engine": { + "prompt_driver": { + "model": "amazon.titan-text-express-v1", + "prompt_model_driver": { + "type": "BedrockTitanPromptModelDriver", + }, + } + } + } + } +) +serialized_config = custom_config.to_json() +deserialized_config = AmazonBedrockStructureConfig.from_json(serialized_config) + +agent = Agent( + config=deserialized_config, +) +``` + diff --git a/docs/griptape-framework/structures/conversation-memory.md b/docs/griptape-framework/structures/conversation-memory.md new file mode 100644 index 000000000..0fdcf1867 --- /dev/null +++ b/docs/griptape-framework/structures/conversation-memory.md @@ -0,0 +1,161 @@ +## Overview + +You can use Conversation Memory to give Griptape Structures the ability to keep track of the conversation across runs. All structures are created with [ConversationMemory](../../reference/griptape/memory/structure/conversation_memory.md) by default. + +### Example + +```python +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +agent = Agent() + +agent.run("My favorite animal is a Liger.") +agent.run("What is my favorite animal?") +``` + +``` +[09/19/23 14:21:07] INFO PromptTask 3e64ca5d5f634a11957cbf46adce251a + Input: My favorite animal is a Liger. +[09/19/23 14:21:13] INFO PromptTask 3e64ca5d5f634a11957cbf46adce251a + Output: That's fascinating! Ligers, a hybrid offspring of a male lion and a female tiger, are indeed unique and + interesting animals. They are known to be the largest of all big cats. Do you have a particular reason why you + like them so much? + INFO PromptTask 3e64ca5d5f634a11957cbf46adce251a + Input: What is my favorite animal? +[09/19/23 14:21:15] INFO PromptTask 3e64ca5d5f634a11957cbf46adce251a + Output: Your favorite animal is a Liger, as you previously mentioned. +``` + +You can disable conversation memory in any structure by setting it to `None`: + +```python +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +Agent(conversation_memory=None) +``` + +## Types of Memory + +Griptape provides several types of Conversation Memory to fit various use-cases. + +### Conversation Memory + +[ConversationMemory](../../reference/griptape/memory/structure/conversation_memory.md) will keep track of the full task input and output for all runs. + +```python +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +agent = Agent( + conversation_memory=ConversationMemory() +) + +agent.run("Hello!") + +print(agent.conversation_memory) +``` + +You can set the [max_runs](../../reference/griptape/memory/structure/conversation_memory.md#griptape.memory.structure.conversation_memory.ConversationMemory.max_runs) parameter to limit how many runs are kept in memory. + +```python +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +agent = Agent( + conversation_memory=ConversationMemory(max_runs=2) +) + +agent.run("Run 1") +agent.run("Run 2") +agent.run("Run 3") +agent.run("Run 4") +agent.run("Run 5") + +print(agent.conversation_memory.runs[0].input == 'run4') +print(agent.conversation_memory.runs[1].input == 'run5') +``` + +### Summary Conversation Memory + +[SummaryConversationMemory](../../reference/griptape/memory/structure/summary_conversation_memory.md) will progressively summarize task input and output of runs. + +You can choose to offset which runs are summarized with the +[offset](../../reference/griptape/memory/structure/summary_conversation_memory.md#griptape.memory.structure.summary_conversation_memory.SummaryConversationMemory.offset) parameter. + +```python +from griptape.structures import Agent +from griptape.memory.structure import SummaryConversationMemory + +agent = Agent( + conversation_memory=SummaryConversationMemory(offset=2) +) + +agent.run("Hello!") + +print(agent.conversation_memory.summary) +``` + +## Conversation Memory Drivers + +You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). + +```python +from griptape.drivers import LocalConversationMemoryDriver +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +memory_driver = LocalConversationMemoryDriver(file_path="memory.json") + +agent_1 = Agent(conversation_memory=ConversationMemory(driver=memory_driver)) +agent_1.run("Skateboarding is my favorite activity.") + +agent_2 = Agent(conversation_memory=memory_driver.load()) +agent_2.run("What is my favorite activity?") +``` + +### Local Conversation Memory Driver + +The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. + +```python +from griptape.structures import Agent +from griptape.drivers import LocalConversationMemoryDriver +from griptape.memory.structure import ConversationMemory + +local_driver = LocalConversationMemoryDriver(file_path="memory.json") +agent = Agent(conversation_memory=ConversationMemory(driver=local_driver)) + +agent.run("Surfing is my favorite sport.") +agent.run("What is my favorite sport?") +``` + +### Amazon DynamoDb Conversation Memory Driver + +!!! info + This driver requires the `drivers-memory-conversation-amazon-dynamodb` [extra](../index.md#extras). + +The [AmazonDynamoDbConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.md) allows you to persist Conversation Memory in [Amazon DynamoDb](https://aws.amazon.com/dynamodb/). + +```python +import os +import uuid +from griptape.drivers import AmazonDynamoDbConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +dynamodb_driver = AmazonDynamoDbConversationMemoryDriver( + table_name=os.environ["DYNAMODB_TABLE_NAME"], + partition_key="id", + value_attribute_key="memory", + partition_key_value=conversation_id, +) + +agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") +``` + diff --git a/docs/griptape-framework/structures/pipelines.md b/docs/griptape-framework/structures/pipelines.md new file mode 100644 index 000000000..dcf549995 --- /dev/null +++ b/docs/griptape-framework/structures/pipelines.md @@ -0,0 +1,47 @@ +## Overview +A [Pipeline](../../reference/griptape/structures/pipeline.md) is very similar to an [Agent](../../reference/griptape/structures/agent.md), but allows for multiple tasks. + +## Context + +Pipelines have access to the following [context](../../reference/griptape/structures/pipeline.md#griptape.structures.pipeline.Pipeline.context) variables in addition to the [base context](./tasks.md#context). + +* `parent_output`: output from the parent. +* `parent`: parent task. +* `child`: child task. + + +## Pipeline + +```python +from griptape.tasks import PromptTask +from griptape.structures import Pipeline + + +pipeline = Pipeline() + +pipeline.add_tasks( + # take the first argument from the pipeline `run` method + PromptTask("{{ args[0] }}"), + # take the output from the previous task and insert it into the prompt + PromptTask("Say the following like a pirate: {{ parent_output }}") +) + +pipeline.run("Write me a haiku about sailing.") +``` + +``` +[09/08/23 10:18:46] INFO PromptTask b2d35331b8e5455abbb9567d10044001 + Input: Write me a haiku about sailing. +[09/08/23 10:18:50] INFO PromptTask b2d35331b8e5455abbb9567d10044001 + Output: Sails catch morning breeze, + Sea whispers secrets to hull, + Horizon awaits. + INFO PromptTask 28e36610063e4d728228a814b48296ef + Input: Say the following like a pirate: Sails catch morning breeze, + Sea whispers secrets to hull, + Horizon awaits. +[09/08/23 10:19:21] INFO PromptTask 28e36610063e4d728228a814b48296ef + Output: Yarr! Th' sails snag th' mornin' zephyr, + Th' sea be whisperin' secrets to th' hull, + Th' horizon be awaitin', matey. +``` diff --git a/docs/griptape-framework/structures/rulesets.md b/docs/griptape-framework/structures/rulesets.md new file mode 100644 index 000000000..d97ea65cb --- /dev/null +++ b/docs/griptape-framework/structures/rulesets.md @@ -0,0 +1,185 @@ +## Overview + +A [Ruleset](../../reference/griptape/rules/ruleset.md) can be used to define rules for [Structures](../structures/agents.md) and [Tasks](../structures/tasks.md). +Rulesets can be used to shape personality, format output, restrict topics, and more. + +## Structure + +### Rulesets + +You can define a Ruleset at the Structure level if you need to have certain behaviors across all Tasks. + +```python +from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from griptape.rules import Rule, Ruleset + +pipeline = Pipeline( + rulesets=[ + Ruleset( + name="Employment", + rules=[ + Rule("Behave like a polite customer support agent"), + Rule("Act like you work for company SkaterWorld, Inc."), + Rule("Discuss only topics related to skateboarding"), + Rule("Limit your response to fewer than 5 sentences."), + ], + ), + Ruleset( + name="Background", + rules=[ + Rule("Your name is Todd"), + ], + ), + ] +) + +pipeline.add_tasks( + PromptTask(input="Respond to this user's question: {{ args[0] }}"), + PromptTask( + input="Extract keywords from this response: {{ parent_output }}" + ), +) + +pipeline.run("How do I do a kickflip?") +``` + +``` +[09/29/23 13:44:35] INFO PromptTask 0ecf932b1602493781485de37028f1df + Input: Respond to this user's question: How do I do a kickflip? +[09/29/23 13:44:41] INFO PromptTask 0ecf932b1602493781485de37028f1df + Output: Hello! This is Todd from SkaterWorld, Inc. To do a kickflip, you'll need to place + your back foot on the tail and your front foot across the skateboard. Push down on the tail + while dragging the edge of your front foot up the board. Then, jump and flick your front foot + out to the side. Practice makes perfect, so keep trying! + INFO PromptTask 1f7f5c0af17240dc8cb785d7efbdbfb6 + Input: Extract keywords from this response: Hello! This is Todd from SkaterWorld, Inc. To do + a kickflip, you'll need to place your back foot on the tail and your front foot across the + skateboard. Push down on the tail while dragging the edge of your front foot up the board. + Then, jump and flick your front foot out to the side. Practice makes perfect, so keep trying! +[09/29/23 13:44:46] INFO PromptTask 1f7f5c0af17240dc8cb785d7efbdbfb6 + Output: The keywords from the response are: Todd, SkaterWorld, Inc., kickflip, back foot, + tail, front foot, skateboard, push down, dragging, edge, board, jump, flick, side, practice, + trying. +``` + +### Rules + +You can pass [rules](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.rules) directly to the Structure to have a Ruleset created for you. + +```python +from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from griptape.rules import Rule + +pipeline = Pipeline( + rules=[ + Rule("Respond only using emojis"), + ], +) + +pipeline.add_tasks( + PromptTask("Respond to this question from the user: '{{ args[0] }}'"), + PromptTask( + "How would you rate your response (1-5)? 1 being bad, 5 being good. Response: '{{parent_output}}'" + ), +), + +pipeline.run("How do I bake a cake?") +``` +``` +[09/29/23 13:31:41] INFO PromptTask 51c0030b7a854ae5a9bef4595014915c + Input: Respond to this question from the user: 'How do I bake a cake?' +[09/29/23 13:31:45] INFO PromptTask 51c0030b7a854ae5a9bef4595014915c + Output: 📖🥣🥚🥛🍚🧈🍰🔥⏲️👩‍🍳🎂 + INFO PromptTask 9ea16d8e79d84cbab9823e234b51f013 + Input: How would you rate your response (1-5)? 1 being bad, 5 being good. Response: + '📖🥣🥚🥛🍚🧈🍰🔥⏲️👩‍🍳🎂' +[09/29/23 13:31:46] INFO PromptTask 9ea16d8e79d84cbab9823e234b51f013 + Output: 👍👍👍👍👍 +``` + +## Task + +### Rulesets + +You can define a Ruleset at the Task level if you need to have different behaviors per Task. + +```python +from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from griptape.rules import Rule, Ruleset + +pipeline = Pipeline() + +pipeline.add_tasks( + PromptTask( + input="Respond to the following prompt: {{ args[0] }}", + rulesets=[ + Ruleset( + name="Emojis", + rules=[ + Rule("Respond using uppercase characters only."), + ], + ) + ] + ), + PromptTask( + input="Determine the sentiment of the following text: {{ parent_output }}", + rulesets=[ + Ruleset( + name="Diacritic", + rules=[ + Rule("Respond using diacritic characters only."), + ], + ) + ], + ), +) + +pipeline.run("I love skateboarding!") +``` + +``` +[09/29/23 13:39:22] INFO PromptTask 0950581dd35e403c9fc51d246861bfc9 + Input: Respond to the following prompt: I love skateboarding! +[09/29/23 13:39:24] INFO PromptTask 0950581dd35e403c9fc51d246861bfc9 + Output: THAT'S AWESOME! 😃 KEEP UP THE GOOD WORK AND ALWAYS STAY SAFE! 🛹👍👏 + INFO PromptTask 325f9b7acaca47a2a097d322288e1bfa + Input: Determine the sentiment of the following text: THAT'S AWESOME! 😃 KEEP UP THE GOOD + WORK AND ALWAYS STAY SAFE! 🛹👍👏 +[09/29/23 13:39:26] INFO PromptTask 325f9b7acaca47a2a097d322288e1bfa + Output: Thê sêntimênt ôf thê têxt is pôsitivê. +``` + +### Rules + +You can pass [rules](../../reference/griptape/tasks/prompt_task.md#griptape.tasks.prompt_task.PromptTask.rules) directly to the Task to have a Ruleset created for you. + +```python +from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from griptape.rules import Rule + +pipeline = Pipeline() + +pipeline.add_tasks( + PromptTask( + rules=[ + Rule("Write your answer in json with a single key 'emoji_response'"), + Rule("Respond only using emojis"), + ], + ), +) + +pipeline.run("How are you?") + +``` +``` +[09/25/23 16:29:05] INFO PromptTask d1cc2c0b780d4b32b6309ceab11173f4 + Input: How are you? +[09/25/23 16:29:07] INFO PromptTask d1cc2c0b780d4b32b6309ceab11173f4 + Output: { + "emoji_response": "😊👍" + } +``` diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md new file mode 100644 index 000000000..e44625476 --- /dev/null +++ b/docs/griptape-framework/structures/task-memory.md @@ -0,0 +1,89 @@ +## Overview +Task Memory augments activity inputs and outputs with storage capabilities. It's a way to keep any data generated by tools off prompt but still allow LLMs to operate on that data remotely. This is useful in the following scenarios: + +* **Security requirements**: many organizations don't want data to leave their cloud for regulatory and security reasons. +* **Long textual content**: when textual content returned by tools can't fit in the token limit, it's often useful to perform operations on it in a separate process, not in the main LLM. +* **Non-textual content**: tools can generate images, videos, PDFs, and other non-textual content that can be stored in memory and acted upon later by other tools. + +By default, Griptape augments all tool outputs with [TaskMemory](../../reference/griptape/memory/task/task_memory.md) but you can override at the structure, task, or tool activity level. + + +## Task Memory +Here is an example of how memory can be used in unison with multiple tools to store and load content: + +```python +from griptape.artifacts import TextArtifact, BlobArtifact +from griptape.memory.task.storage import TextArtifactStorage, BlobArtifactStorage +from griptape.structures import Agent +from griptape.tools import WebScraper, FileManager, TaskMemoryClient +from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver + +prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") + +agent = Agent( + tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=True)] +) + +agent.run( + "Load https://www.griptape.ai, summarize it, " + "and store it in griptape.txt" +) +``` + +``` +[10/20/23 13:31:40] INFO ToolkitTask 82211eeb10374e75ad77135373d816e6 + Input: Load https://www.griptape.ai, summarize it, + and store it in griptape.txt +[10/20/23 13:31:52] INFO Subtask 17b3d35197eb417b834a7db49039ae4f + Thought: The user wants to load the webpage at + https://www.griptape.ai, summarize its content, and + store the summary in a file named griptape.txt. To + achieve this, I need to first use the WebScraper + tool to get the content of the webpage. Then, I + will use the TaskMemoryClient to summarize the + content. Finally, I will use the FileManager tool + to save the summarized content to a file named + griptape.txt. + + Action: {"name": "WebScraper", + "path": "get_content", "input": {"values": + {"url": "https://www.griptape.ai"}}} +[10/20/23 13:31:53] INFO Subtask 17b3d35197eb417b834a7db49039ae4f + Response: Output of "WebScraper.get_content" was + stored in memory with memory_name "TaskMemory" and + artifact_namespace + "82543abe79984d11bb952bd6036a7a01" +[10/20/23 13:32:00] INFO Subtask 58bac35adda94157ac6f9482e7c41c9f + Thought: Now that I have the content of the webpage + stored in memory, I can use the TaskMemoryClient + tool to summarize this content. + Action: {"name": + "TaskMemoryClient", "path": "summarize", + "input": {"values": {"memory_name": "TaskMemory", + "artifact_namespace": + "82543abe79984d11bb952bd6036a7a01"}}} +[10/20/23 13:32:03] INFO Subtask 58bac35adda94157ac6f9482e7c41c9f + Response: Output of + "TaskMemoryClient.summarize" was stored in + memory with memory_name "TaskMemory" and + artifact_namespace + "01b8015f8c5647f09e8d103198404db0" +[10/20/23 13:32:12] INFO Subtask a630f649007b4d7fa0b6cf85be6b2f4f + Thought: Now that I have the summarized content of + the webpage stored in memory, I can use the + FileManager tool to save this content to a file + named griptape.txt. + Action: {"name": "FileManager", + "path": "save_memory_artifacts_to_disk", + "input": {"values": {"dir_name": ".", "file_name": + "griptape.txt", "memory_name": "TaskMemory", + "artifact_namespace": + "01b8015f8c5647f09e8d103198404db0"}}} + INFO Subtask a630f649007b4d7fa0b6cf85be6b2f4f + Response: saved successfully +[10/20/23 13:32:14] INFO ToolkitTask 82211eeb10374e75ad77135373d816e6 + Output: The summarized content of the webpage at + https://www.griptape.ai has been successfully + stored in a file named griptape.txt. +``` diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md new file mode 100644 index 000000000..a7aae8734 --- /dev/null +++ b/docs/griptape-framework/structures/tasks.md @@ -0,0 +1,669 @@ +## Overview + +A [Task](../../reference/griptape/tasks/index.md) is a purpose-built abstraction for the Large Language Model (LLM). Griptape offers various types of Tasks, each suitable for specific use cases. + + +## Context +Tasks that take input have a field [input](../../reference/griptape/tasks/base_text_input_task.md#griptape.tasks.base_text_input_task.BaseTextInputTask.input) which lets you define the Task objective. +Within the [input](../../reference/griptape/tasks/base_text_input_task.md#griptape.tasks.base_text_input_task.BaseTextInputTask.input), you can access the following [context](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.context) variables: + +* `args`: an array of arguments passed to the `.run()` method. +* `structure`: the structure that the task belongs to. +* user defined context variables + +Additional [context](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.context) variables may be added based on the Structure running the task. +```python +from griptape.structures import Agent +from griptape.tasks import PromptTask + + +agent = Agent() +agent.add_task( + PromptTask( + "Respond to the user's following question '{{ args[0] }}' in the language '{{preferred_language}}' and tone '{{tone}}'.", + context={"preferred_language": "ENGLISH", "tone": "PLAYFUL"}, + ) +) + +agent.run("How do I bake a cake?") +``` + +``` +[09/08/23 11:12:47] INFO PromptTask 0f5a5def49864126834627b6140f3e63 + Input: Respond to the user's following question 'How do I bake a cake?' in the language 'ENGLISH' and tone + 'PLAYFUL'. +[09/08/23 11:13:17] INFO PromptTask 0f5a5def49864126834627b6140f3e63 + Output: Oh, you're in for a treat! Baking a cake is like creating a masterpiece, but way more delicious! Here's a + simple recipe to get you started: + + 1. Preheat your oven to 350°F (175°C). It's like sunbathing, but for your cake! + + 2. Grab a bowl and mix together 2 cups of sugar and 1/2 cup of softened butter. It's like making sweet, buttery + sandcastles! + + 3. Crack in 3 eggs, one at a time, and stir in 2 teaspoons of vanilla extract. It's a pool party in your bowl! + + 4. In a separate bowl, combine 1 1/2 cups of all-purpose flour, 1 3/4 teaspoons of baking powder, and a pinch of + salt. This is the dry gang! + + 5. Gradually mix the dry gang into the buttery pool party. Stir until it's just combined, we don't want to + overwork the partygoers! + + 6. Pour the batter into a greased cake pan. It's like tucking your cake into bed! + + 7. Bake for 30 to 40 minutes, or until a toothpick comes out clean. It's like playing hide and seek with your + cake! + + 8. Let it cool, then frost and decorate as you like. This is where you can let your creativity shine! + + Remember, baking is all about having fun and enjoying the process. So, put on your favorite tunes, roll up your + sleeves, and let's get baking! 🍰🎉 +``` + +## Prompt Task + +For general purpose prompting, use the [PromptTask](../../reference/griptape/tasks/prompt_task.md): + +```python +from griptape.tasks import PromptTask +from griptape.structures import Agent + + +agent = Agent() +agent.add_task( + # take the first argument from the agent `run` method + PromptTask("Respond to the users following request: {{ args[0] }}"), +) + +agent.run("Write me a haiku") +``` + +``` +[10/20/23 15:27:26] INFO PromptTask f5025c6352914e9f80ef730e5269985a + Input: Respond to the users following request: + Write me a haiku +[10/20/23 15:27:28] INFO PromptTask f5025c6352914e9f80ef730e5269985a + Output: Gentle morning dew, + Kisses the waking flowers, + Day begins anew. +``` + +## Toolkit Task + +To use [Griptape Tools](../../griptape-framework/tools/index.md), use a [Toolkit Task](../../reference/griptape/tasks/toolkit_task.md). +This Task takes in one or more Tools which the LLM will decide to use through Chain of Thought (CoT) reasoning. Because this Task uses CoT, it is recommended to only use with very capable models. + +```python +from griptape.tasks import ToolkitTask +from griptape.structures import Agent +from griptape.tools import WebScraper, FileManager, TaskMemoryClient + + +agent = Agent() +agent.add_task( + ToolkitTask( + "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", + tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + ), +) + +agent.run() +``` + +``` +[09/08/23 11:14:55] INFO ToolkitTask 22af656c6ad643e188fe80f9378dfff9 + Input: Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt +[09/08/23 11:15:02] INFO Subtask 7a6356470e6a4b08b61edc5591b37f0c + Thought: The first step is to load the webpage using the WebScraper tool's get_content activity. + + Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": + "https://www.griptape.ai"}}} +[09/08/23 11:15:03] INFO Subtask 7a6356470e6a4b08b61edc5591b37f0c + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and + artifact_namespace "2b50373849d140f698ba8071066437ee" +[09/08/23 11:15:11] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 + Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity + to summarize it. + Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee"}}} +[09/08/23 11:15:15] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 + Response: Griptape is an open source framework that allows developers to build and deploy AI applications + using large language models (LLMs). It provides the ability to create conversational and event-driven apps that + can access and manipulate data securely. Griptape enforces structures like sequential pipelines and DAG-based + workflows for predictability, while also allowing for creativity by safely prompting LLMs with external APIs and + data stores. The framework can be used to create AI systems that operate across both dimensions. Griptape Cloud + is a managed platform for deploying and managing AI apps, and it offers features like scheduling and connecting + to data stores and APIs. +[09/08/23 11:15:27] INFO Subtask 7afb3d44d0114b7f8ef2dac4314a8e90 + Thought: Now that I have the summary, I can use the FileManager tool's save_file_to_disk activity to store the + summary in a file named griptape.txt. + Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": + {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee", "path": + "griptape.txt"}}} + INFO Subtask 7afb3d44d0114b7f8ef2dac4314a8e90 + Response: saved successfully +[09/08/23 11:15:31] INFO ToolkitTask 22af656c6ad643e188fe80f9378dfff9 + Output: The summary of the webpage https://www.griptape.ai has been successfully stored in a file named + griptape.txt. +``` + +## Tool Task + +Another way to use [Griptape Tools](../../griptape-framework/tools/index.md), is with a [Tool Task](../../reference/griptape/tasks/tool_task.md). +This Task takes in a single Tool which the LLM will use without Chain of Thought (CoT) reasoning. Because this Task does not use CoT, it is better suited for less capable models. + +```python +from griptape.structures import Agent +from griptape.tasks import ToolTask +from griptape.tools import Calculator + +# Initialize the agent and add a task +agent = Agent() +agent.add_task(ToolTask(tool=Calculator())) + +# Run the agent with a prompt +agent.run("Give me the answer for 5*4.") +``` + +``` +[10/20/23 14:20:25] INFO ToolTask df1604b417a84ee781dbd1f2b904ed30 + Input: Give me the answer for 5*4. +[10/20/23 14:20:29] INFO Subtask a9a9ad7be2bf465fa82bd350116fabe4 + Action: { + + "name": "Calculator", + "path": "calculate", + "input": { + "values": { + "expression": "5*4" + } + } + } +[10/20/23 14:20:30] INFO Subtask a9a9ad7be2bf465fa82bd350116fabe4 + Response: 20 + INFO ToolTask df1604b417a84ee781dbd1f2b904ed30 + Output: 20 +``` + +## Extraction Task + +To extract information from text, use an [ExtractionTask](../../reference/griptape/tasks/extraction_task.md). +This Task takes an [Extraction Engine](../../griptape-framework/engines/extraction-engines.md), and a set of arguments specific to the Engine. + + +### CSV Extraction + +```python +from griptape.drivers import OpenAiChatPromptDriver +from griptape.tasks import ExtractionTask +from griptape.structures import Agent +from griptape.engines import CsvExtractionEngine + +# Instantiate the CSV extraction engine +csv_extraction_engine = CsvExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo") +) + +# Define some unstructured data and columns +csv_data = """ +Alice, 28, lives in New York. +Bob, 35 lives in California. +Charlie is 40 and lives in Texas. +""" + +columns = ["Name", "Age", "Address"] + + +# Create an agent and add the ExtractionTask to it +agent = Agent() +agent.add_task( + ExtractionTask( + extraction_engine=csv_extraction_engine, + args={"column_names": columns}, + ) +) + +# Run the agent +agent.run(csv_data) +``` +``` +[12/19/23 10:33:11] INFO ExtractionTask e87fb457edf8423ab8a78583badd7a11 + Input: + Alice, 28, lives in New York. + Bob, 35 lives in California. + Charlie is 40 and lives in Texas. + +[12/19/23 10:33:13] INFO ExtractionTask e87fb457edf8423ab8a78583badd7a11 + Output: Name,Age,Address + Alice,28,New York + Bob,35,California + Charlie,40,Texas +``` + +### JSON Extraction + +```python +from schema import Schema + +from griptape.drivers import OpenAiChatPromptDriver +from griptape.tasks import ExtractionTask +from griptape.structures import Agent +from griptape.engines import JsonExtractionEngine + +# Instantiate the json extraction engine +json_extraction_engine = JsonExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data and a schema +json_data = """ +Alice (Age 28) lives in New York. +Bob (Age 35) lives in California. +""" +user_schema = Schema( + {"users": [{"name": str, "age": int, "location": str}]} +).json_schema("UserSchema") + +agent = Agent() +agent.add_task( + ExtractionTask( + extraction_engine=json_extraction_engine, + args={"template_schema": user_schema}, + ) +) + +# Run the agent +agent.run(json_data) +``` +``` +[12/19/23 10:37:41] INFO ExtractionTask 3315cc77f94943a2a2dceccfe44f6a67 + Input: + Alice (Age 28) lives in New York. + Bob (Age 35) lives in California. + +[12/19/23 10:37:44] INFO ExtractionTask 3315cc77f94943a2a2dceccfe44f6a67 + Output: {'name': 'Alice', 'age': 28, 'location': 'New York'} + {'name': 'Bob', 'age': 35, 'location': 'California'} +``` + +## Text Summary Task + +To summarize a text, use the [TextSummaryTask](../../reference/griptape/tasks/text_summary_task.md). +This Task takes an [Summarization Engine](../../griptape-framework/engines/summary-engines.md), and a set of arguments to the engine. + +```python +from griptape.structures import Agent +from griptape.tasks import TextSummaryTask + +# Create a new agent +agent = Agent() + +# Add the TextSummaryTask to the agent +agent.add_task(TextSummaryTask()) + + +# Run the agent +agent.run( + "Artificial Intelligence (AI) is a branch of computer science that deals with " + "creating machines capable of thinking and learning. It encompasses various fields " + "such as machine learning, neural networks, and deep learning. AI has the potential " + "to revolutionize many sectors, including healthcare, finance, and transportation. " + "Our life in this modern age depends largely on computers. It is almost impossible " + "to think about life without computers. We need computers in everything that we use " + "in our daily lives. So it becomes very important to make computers intelligent so " + "that our lives become easy. Artificial Intelligence is the theory and development " + "of computers, which imitates the human intelligence and senses, such as visual " + "perception, speech recognition, decision-making, and translation between languages." + " Artificial Intelligence has brought a revolution in the world of technology. " +) +``` + +``` +[10/20/23 15:37:46] INFO TextSummaryTask e870f2a6226f43fcb89f93b1c0c85b10 + Input: Artificial Intelligence (AI) is a branch of + computer science that deals with creating machines + capable of thinking and learning. It encompasses + various fields such as machine learning, neural + networks, and deep learning. AI has the potential + to revolutionize many sectors, including + healthcare, finance, and transportation. Our life + in this modern age depends largely on computers. It + is almost impossible to think about life without + computers. We need computers in everything that we + use in our daily lives. So it becomes very + important to make computers intelligent so that our + lives become easy. Artificial Intelligence is the + theory and development of computers, which imitates + the human intelligence and senses, such as visual + perception, speech recognition, decision-making, + and translation between languages. Artificial + Intelligence has brought a revolution in the world + of technology. +[10/20/23 15:37:49] INFO TextSummaryTask e870f2a6226f43fcb89f93b1c0c85b10 + Output: Artificial Intelligence (AI) is a branch of + computer science that focuses on creating + intelligent machines. It encompasses various fields + such as machine learning and neural networks. AI + has the potential to revolutionize sectors like + healthcare, finance, and transportation. It is + essential to make computers intelligent to simplify + our daily lives. AI imitates human intelligence and + senses, bringing a revolution in technology. +``` + +## Text Query Task + +To query text, use the [TextQueryTask](../../reference/griptape/tasks/text_query_task.md). +This Task takes a [Query Engine](../../griptape-framework/engines/query-engines.md), and a set of arguments specific to the engine. + +```python +from griptape.drivers import OpenAiChatPromptDriver +from griptape.structures import Agent +from griptape.tasks import TextQueryTask +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.engines import VectorQueryEngine +from griptape.artifacts import TextArtifact + +# Initialize Embedding Driver and Vector Store Driver +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifact = TextArtifact( + "Griptape builds AI-powered applications that connect securely to your enterprise data and APIs." + "Griptape Agents provide incredible power and flexibility when working with large language models." +) + +# Create a VectorQueryEngine using the LocalVectorStoreDriver +vector_query_engine = VectorQueryEngine( + vector_store_driver=vector_store_driver, + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo") +) +vector_query_engine.upsert_text_artifact(artifact=artifact) + +# Instantiate the agent and add TextQueryTask with the VectorQueryEngine +agent = Agent() +agent.add_task( + TextQueryTask( + "Respond to the users following query: {{ args[0] }}", + query_engine=vector_query_engine, + ) +) + +# Run the agent with a query string +agent.run("Give me information about Griptape") +``` + +``` +[10/20/23 15:32:39] INFO TextQueryTask a1d2eceab9204679b3f701f6ea821606 + Input: Respond to the users following query: Give + me information about Griptape +[10/20/23 15:32:41] INFO TextQueryTask a1d2eceab9204679b3f701f6ea821606 + Output: Griptape builds AI-powered applications + that connect securely to your enterprise data and + APIs. Griptape Agents provide incredible power and + flexibility when working with large language + models. +``` + +## Code Execution Task + +To execute an arbitrary Python function, use the [CodeExecutionTask](../../reference/griptape/tasks/text_query_task.md). +This task takes a python function, and authors can elect to return a custom artifact. + +```python +from griptape.structures import Pipeline +from griptape.tasks import CodeExecutionTask, PromptTask +from griptape.artifacts import BaseArtifact, TextArtifact + + +def character_counter(task: CodeExecutionTask) -> BaseArtifact: + result = len(task.input) + # For functions that don't need to return anything, we recommend returning task.input + return TextArtifact(str(result)) + + +# Instantiate the pipeline +pipeline = Pipeline() + +pipeline.add_tasks( + + # take the first argument from the pipeline `run` method + CodeExecutionTask(run_fn=character_counter), + # # take the output from the previous task and insert it into the prompt + PromptTask("{{args[0]}} using {{ parent_output }} characters") +) + +pipeline.run("Write me a line in a poem") +``` + +``` +[01/09/24 15:23:54] INFO CodeExecutionTask 048b1f548683475187064dde90055f72 + Input: Write me a line in a poem + INFO CodeExecutionTask 048b1f548683475187064dde90055f72 + Output: 25 + INFO PromptTask b6156dc5c0c6404488ab925989e78b01 + Input: Write me a line in a poem using 25 + characters +[01/09/24 15:24:03] INFO PromptTask b6156dc5c0c6404488ab925989e78b01 + Output: "Silent code, loud impact." +``` + +## Image Generation Tasks + +To generate an image, use one of the following [Image Generation Tasks](../../reference/griptape/tasks/index.md). All Image Generation Tasks accept an [Image Generation Engine](../engines/image-generation-engines.md) configured to use an [Image Generation Driver](../drivers/image-generation-drivers.md). + +All successful Image Generation Tasks will always output an [Image Artifact](../data/artifacts.md#imageartifact). Each task can be configured to additionally write the generated image to disk by providing either the `output_file` or `output_dir` field. The `output_file` field supports file names in the current directory (`my_image.png`), relative directory prefixes (`images/my_image.png`), or absolute paths (`/usr/var/my_image.png`). By setting `output_dir`, the task will generate a file name and place the image in the requested directory. + +### Prompt Image Generation Task + +The [Prompt Image Generation Task](../../reference/griptape/tasks/prompt_image_generation_task.md) generates an image from a text prompt. + +```python +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import OpenAiImageGenerationDriver +from griptape.tasks import PromptImageGenerationTask +from griptape.structures import Pipeline + + +# Create a driver configured to use OpenAI's DALL-E 3 model. +driver = OpenAiImageGenerationDriver( + model="dall-e-3", + quality="hd", + style="natural", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add a PromptImageGenerationTask to the pipeline. +pipeline.add_tasks( + PromptImageGenerationTask( + input="{{ args[0] }}", + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain on a summer day") +``` + +### Variation Image Generation Task + +The [Variation Image Generation Task](../../reference/griptape/tasks/variation_image_generation_task.md) generates an image using an input image and a text prompt. The input image is used as a basis for generating a new image as requested by the text prompt. + +```python +from griptape.engines import VariationImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tasks import VariationImageGenerationTask +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifact. +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +# Instatiate a pipeline. +pipeline = Pipeline() + +# Add a VariationImageGenerationTask to the pipeline. +pipeline.add_task( + VariationImageGenerationTask( + input=("{{ args[0] }}", image_artifact), + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain landscape on a snowy winter day") +``` + +### Inpainting Image Generation Task + +The [Inpainting Image Generation Task](../../reference/griptape/tasks/inpainting_image_generation_task.md) generates an image using an input image, a mask image, and a text prompt. The input image will be modified within the bounds of the mask image as requested by the text prompt. + +```python +from griptape.engines import InpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tasks import InpaintingImageGenerationTask +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifacts. +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +with open("tests/resources/mountain-mask.png", "rb") as f: + mask_artifact = ImageLoader().load(f.read()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an InpaintingImageGenerationTask to the pipeline. +pipeline.add_task( + InpaintingImageGenerationTask( + input=("{{ args[0] }}", image_artifact, mask_artifact), + image_generation_engine=engine, + output_dir="images/" + ) +) + +pipeline.run("An image of a castle built into the side of a mountain") +``` + +### Outpainting Image Generation Task + +The [Outpainting Image Generation Task](../../reference/griptape/tasks/outpainting_image_generation_task.md) generates an image using an input image, a mask image, and a text prompt. The input image will be modified outside the bounds of a mask image as requested by the text prompt. + +```python +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tasks import OutpaintingImageGenerationTask +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifacts. +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +with open("tests/resources/mountain-mask.png", "rb") as f: + mask_artifact = ImageLoader().load(f.read()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an OutpaintingImageGenerationTask to the pipeline. +pipeline.add_task( + OutpaintingImageGenerationTask( + input=("{{ args[0] }}", image_artifact, mask_artifact), + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain shrouded by clouds") +``` + +## Image Query Task + +The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) executes a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/image-query-engines.md) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. + +This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#textartifact)) and a list of [Image Artifacts](../data/artifacts.md#imageartifact) or a Callable returning these two values. + +```python +from griptape.engines import ImageQueryEngine +from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.tasks import ImageQueryTask +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline + + +# Create a driver configured to use OpenAI's GPT-4 Vision model. +driver = OpenAiVisionImageQueryDriver( + model="gpt-4-vision-preview", + max_tokens=100, +) + +# Create an engine configured to use the driver. +engine = ImageQueryEngine( + image_query_driver=driver, +) + +# Load the input image artifact. +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an ImageQueryTask to the pipeline. +pipeline.add_task( + ImageQueryTask( + input=("{{ args[0] }}", [image_artifact]), + image_query_engine=engine, + ) +) + +pipeline.run("Describe the weather in the image") +``` diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md new file mode 100644 index 000000000..3c2bac25a --- /dev/null +++ b/docs/griptape-framework/structures/workflows.md @@ -0,0 +1,149 @@ +## Overview + +A [Workflow](../../reference/griptape/structures/workflow.md) is a non-sequential DAG that can be used for complex concurrent scenarios with tasks having multiple inputs. + + +## Context + +Workflows have access to the following [context](../../reference/griptape/structures/workflow.md#griptape.structures.workflow.Workflow.context) variables in addition to the [base context](./tasks.md#context): + +* `parent_outputs`: outputs into the current task referenceable by parent task IDs. +* `parents`: parent tasks referenceable by IDs. +* `children`: child tasks referenceable by IDs. + +## Workflow +Let's build a simple workflow. Let's say, we want to write a story in a fantasy world with some unique characters. We could setup a workflow that generates a world based on some keywords. Then we pass the world description to any number of child tasks that create characters. Finally, the last task pulls in information from all parent tasks and writes up a short story. + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow + +workflow = Workflow() + +def character_task(task_id, character_name) -> PromptTask: + return PromptTask( + "Based on the following world description create a character named {{ name }}:\n{{ parent_outputs['world'] }}", + context={ + "name": character_name + }, + id=task_id + ) + +world_task = PromptTask( + "Create a fictional world based on the following key words {{ keywords|join(', ') }}", + context={ + "keywords": ["fantasy", "ocean", "tidal lock"] + }, + id="world" +) +workflow.add_task(world_task) + +story_task = PromptTask( + "Based on the following description of the world and characters, write a short story:\n{{ parent_outputs['world'] }}\n{{ parent_outputs['scotty'] }}\n{{ parent_outputs['annie'] }}", + id="story" +) +workflow.add_task(story_task) + +character_task_1 = character_task("scotty", "Scotty") +character_task_2 = character_task("annie", "Annie") + +# Note the preserve_relationship flag. This ensures that world_task remains a parent of +# story_task so its output can be referenced in the story_task prompt. +workflow.insert_tasks(world_task, [character_task_1, character_task_2], story_task, preserve_relationship=True) + +workflow.run() +``` + + +!!! Info + Output edited for brevity +``` +[09/08/23 10:26:21] INFO PromptTask world + Input: Create a fictional world based on the following key words fantasy, ocean, tidal lock +[09/08/23 10:27:11] INFO PromptTask world + Output: Welcome to the world of "Oceanus Fantasia", a realm where fantasy and oceanic wonders intertwine in a + unique celestial phenomenon known as tidal lock. + + Oceanus Fantasia is a vast, water-dominated planet, with its surface covered by a seemingly endless ocean. The + ocean is not just water, but a magical liquid that sparkles with all the colors of the rainbow under the planet's + twin suns. This magical ocean is home to a myriad of fantastical creatures, from the tiny luminescent pixie-fish + to the colossal, wise leviathans that roam the depths. + + ... + + In Oceanus Fantasia, magic and technology coexist. The inhabitants use their understanding of the magical ocean + and its creatures to power their cities, heal their sick, and even control the weather. The ocean's magic is a + part of them, and they are a part of the ocean. + + Welcome to Oceanus Fantasia, where the ocean's tide writes the story of a world in perpetual twilight, a world of + magic, mystery, and endless adventure. + INFO PromptTask scotty + Input: Based on the following world description create a character named Scotty: + Welcome to the world of "Oceanus Fantasia", a realm where fantasy and oceanic wonders intertwine in a unique + celestial phenomenon known as tidal lock. + + ... + + In Oceanus Fantasia, magic and technology coexist. The inhabitants use their understanding of the magical ocean + and its creatures to power their cities, heal their sick, and even control the weather. The ocean's magic is a + part of them, and they are a part of the ocean. + + Welcome to Oceanus Fantasia, where the ocean's tide writes the story of a world in perpetual twilight, a world of + magic, mystery, and endless adventure. + INFO PromptTask annie + Input: Based on the following world description create a character named Annie: + Welcome to the world of "Oceanus Fantasia", a realm where fantasy and oceanic wonders intertwine in a unique + celestial phenomenon known as tidal lock. + + ... + + Welcome to Oceanus Fantasia, where the ocean's tide writes the story of a world in perpetual twilight, a world of + magic, mystery, and endless adventure. +[09/08/23 10:27:47] INFO PromptTask scotty + Output: Character Name: Scotty + + Scotty is a Tide Whisperer, one of the mysterious seers who reside in the Twilight Zone of Oceanus Fantasia. He + is a tall, slender figure with a complexion that reflects the perpetual twilight of his home, a mix of the golden + hue of the Solaris and the luminescent glow of the Lunarians. His hair, a cascade of silver waves, mirrors the + ever-changing colors of the magical ocean. His eyes, a deep sea-green, hold a depth that seems to echo the + vastness of the ocean itself. + + ... + + Scotty embodies the spirit of Oceanus Fantasia, a world of magic, mystery, and endless adventure. He is a beacon + of hope and wisdom in a world divided by light and darkness, a testament to the unity and harmony that can exist + in diversity. +[09/08/23 10:28:47] INFO PromptTask annie + Output: Character Name: Annie + + Annie is a young, vibrant inhabitant of the Twilight Zone in Oceanus Fantasia. She is a Tide Whisperer, a seer + who can read the future in the ebb and flow of the magical tides. Her skin is a soft, iridescent hue, a blend of + the golden tones of the Solaris people and the luminescent glow of the Lunarians, reflecting her unique position + between the two cultures. + + ... + + Annie's best friend is a luminescent pixie-fish named Lumi. Lumi is a constant companion and often assists Annie + in her tide readings. Together, they represent the spirit of Oceanus Fantasia - a world of magic, mystery, and + endless adventure. + INFO PromptTask story + Input: Based on the following description of the world and characters, write a short story: + Welcome to the world of "Oceanus Fantasia", a realm where fantasy and oceanic wonders intertwine in a unique + celestial phenomenon known as tidal lock. + + ... + + Annie's best friend is a luminescent pixie-fish named Lumi. Lumi is a constant companion and often assists Annie + in her tide readings. Together, they represent the spirit of Oceanus Fantasia - a world of magic, mystery, and + endless adventure. +[09/08/23 10:29:47] INFO PromptTask story + Output: In the world of Oceanus Fantasia, where the ocean's tide writes the story of a world in perpetual + twilight, lived Scotty and Annie, the Tide Whisperers. They were the bridge between the Solaris Kingdom and the + Lunarian Clan, the mediators of the perpetual day and eternal night. + ... + Scotty and Annie, with their deep understanding of the magical ocean and its creatures, continued to guide the + inhabitants of Oceanus Fantasia. They embodied the spirit of their world, a world of magic, mystery, and endless + adventure. They were the beacon of hope and wisdom in a world divided by light and darkness, a testament to the + unity and harmony that can exist in diversity. +``` + diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md new file mode 100644 index 000000000..6a131298c --- /dev/null +++ b/docs/griptape-framework/tools/index.md @@ -0,0 +1,62 @@ +# Overview + +One of the most powerful features of Griptape is the ability for Toolkit Tasks to generate _chains of thought_ (CoT) and use tools that can interact with the outside world. We use the [ReAct](https://arxiv.org/abs/2210.03629) technique to implement CoT reasoning and acting in the underlying LLMs without using any fine-tuning. + +Griptape implements the reasoning loop in the Toolkit Tasks and integrates Griptape Tools natively. + +## Tools +Here is an example of a pipeline using tools: + +```python +from griptape.tasks import ToolkitTask +from griptape.structures import Pipeline +from griptape.tools import WebScraper, FileManager, TaskMemoryClient + + +pipeline = Pipeline() + +pipeline.add_tasks( + ToolkitTask( + "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", + tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + ), +) + +pipeline.run() +``` + +``` +[09/08/23 10:53:56] INFO ToolkitTask 979d99f68766423ea05b367e951281bc + Input: Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt +[09/08/23 10:54:02] INFO Subtask 97bd154a71e14a1699f8152e50490a71 + Thought: The first step is to load the content of the webpage. I can use the WebScraper tool with the get_content + activity for this. + + Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": + "https://www.griptape.ai"}}} +[09/08/23 10:54:03] INFO Subtask 97bd154a71e14a1699f8152e50490a71 + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and + artifact_namespace "9eb6f5828cf64356bf323f11d28be27e" +[09/08/23 10:54:09] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba + Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool with the summarize + activity to summarize the content. + Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e"}}} +[09/08/23 10:54:12] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba + Response: Griptape is an open source framework that allows developers to build and deploy AI applications + using large language models (LLMs). It provides the ability to create conversational and event-driven apps that + can access and manipulate data securely. Griptape enforces structures like sequential pipelines and workflows for + predictability, while also allowing for creativity by safely prompting LLMs with external APIs and data stores. + The framework can be used to create AI systems that operate across both predictability and creativity dimensions. + Griptape Cloud is a managed platform for deploying and managing AI apps. +[09/08/23 10:54:24] INFO Subtask a024949a9a134f058f2e6b7c379c8713 + Thought: Now that I have the summary, I can store it in a file called griptape.txt. I can use the FileManager + tool with the save_file_to_disk activity for this. + Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": + {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e", "path": + "griptape.txt"}}} + INFO Subtask a024949a9a134f058f2e6b7c379c8713 + Response: saved successfully +[09/08/23 10:54:27] INFO ToolkitTask 979d99f68766423ea05b367e951281bc + Output: The summary of the webpage https://www.griptape.ai has been successfully stored in a file called + griptape.txt. +``` diff --git a/docs/griptape-tools/custom-tools/index.md b/docs/griptape-tools/custom-tools/index.md new file mode 100644 index 000000000..5b0fe7ad1 --- /dev/null +++ b/docs/griptape-tools/custom-tools/index.md @@ -0,0 +1,79 @@ +## Overview + +Building your own tools is easy with Griptape! + +To start, create a directory for your tool inside your project. All tool directories should have the following components: + +* `manifest.yml` with a YAML manifest. +* `tool.py` file with a tool Python class. +* `requirements.txt` file with tool Python dependencies. + +Let's build a simple random number generator tool! First, create a new directory for your tool `rng_tool`. This is where all tool files will go. + +## Tool Manifest + +Tool YAML manifests are for humans and downstream systems, like ChatGPT Plugins, to generate manifests of their own. Create a `manifest.yml` file in the `rng_tool` directory: + +```yaml +version: "v1" +name: Random Number Generator +description: Tool for generating random numbers. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal +``` + +## Tool Dependencies + +To add Python dependencies for your tool, add a `requirements.txt` file. The tool we are building is pretty simple, so you can leave that file empty. + +## Tool Implementation + +Next, create a `tool.py` file with the following code: + +```python title="PYTEST_IGNORE" +import random +from griptape.artifacts import TextArtifact +from griptape.tools import BaseTool +from griptape.utils.decorators import activity +from schema import Schema, Literal, Optional + + +class RandomNumberGenerator(BaseTool): + @activity(config={ + "description": "Can be used to generate random numbers", + "schema": Schema({ + Optional(Literal( + "decimals", + description="Number of decimals to round the random number to" + )): int + }) + }) + def generate(self, params: dict) -> TextArtifact: + return TextArtifact( + str(round(random.random(), params["values"].get("decimals"))) + ) +``` + +## Testing Custom Tools + +Finally, let's test our tool: + +```python title="PYTEST_IGNORE" +from griptape.structures import Agent +from rng_tool.tool import RandomNumberGenerator + +rng_tool = RandomNumberGenerator() + +agent = Agent( + tools=[rng_tool] +) + +agent.run( + "generate a random number rounded to 5 decimal places" +) + +``` + +That's it! You can start using this tool with any converter or directly via Griptape. + +Check out other [Griptape Tools](https://github.com/griptape-ai/griptape/tree/main/griptape/tools) to learn more about tool implementation details. diff --git a/docs/griptape-tools/index.md b/docs/griptape-tools/index.md new file mode 100644 index 000000000..0476cd7b1 --- /dev/null +++ b/docs/griptape-tools/index.md @@ -0,0 +1,37 @@ +Tools give the LLM abilities to invoke outside APIs, reference data sets, and generally expand their capabilities. + +Griptape tools are special Python classes that LLMs can use to accomplish specific goals. Here is an example custom tool for generating a random number: + +```python title="PYTEST_IGNORE" +import random +from griptape.artifacts import TextArtifact +from griptape.tools import BaseTool +from griptape.utils.decorators import activity +from schema import Schema, Literal, Optional + + +class RandomNumberGenerator(BaseTool): + @activity(config={ + "description": "Can be used to generate random numbers", + "schema": Schema({ + Optional(Literal( + "decimals", + description="Number of decimals to round the random number to" + )): int + }) + }) + def generate(self, params: dict) -> TextArtifact: + return TextArtifact( + str(round(random.random(), params["values"].get("decimals"))) + ) +``` + +A tool can have many "activities" as denoted by the `@activity` decorator. Each activity has a description (used to provide context to the LLM), and the input schema that the LLM must follow in order to use the tool. + +Output artifacts from all tool activities (except for `InfoArtifact` and `ErrorArtifact`) go to short-term `TaskMemory`. To disable that behavior set the `off_prompt` tool parameter to `False`: + +```python title="PYTEST_IGNORE" +RandomNumberGenerator(off_prompt=False) +``` + +We provide a set of official Griptape Tools for accessing and processing data. You can also [build your own tools](./custom-tools/index.md). diff --git a/docs/griptape-tools/official-tools/aws-iam-client.md b/docs/griptape-tools/official-tools/aws-iam-client.md new file mode 100644 index 000000000..89f0ccbba --- /dev/null +++ b/docs/griptape-tools/official-tools/aws-iam-client.md @@ -0,0 +1,68 @@ +# AwsIamClient + +This tool enables LLMs to make AWS IAM API requests. + +```python +import boto3 +from griptape.structures import Agent +from griptape.tools import AwsIamClient, TaskMemoryClient + +# Initialize the AWS IAM client +aws_iam_client = AwsIamClient(session=boto3.Session()) + +# Create an agent with the AWS IAM client tool +agent = Agent( + tools=[aws_iam_client, TaskMemoryClient(off_prompt=False)] +) + +# Run the agent with a high-level task +agent.run("List all my IAM users") +``` +``` +[09/11/23 16:45:45] INFO Task 890fcf77fb074c9490d5c91563e0c995 + Input: List all my IAM users +[09/11/23 16:45:51] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 + Thought: To list all IAM users, I can use the + AwsIamClient tool with the list_users activity. + This activity does not require any input. + + Action: {"name": "AwsIamClient", + "path": "list_users"} +[09/11/23 16:45:52] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 + Response: Output of "AwsIamClient.list_users" + was stored in memory with memory_name + "TaskMemory" and artifact_namespace + "51d22a018a434904a5da3bb8d4f763f7" +[09/11/23 16:45:59] INFO Subtask 8e0e918571544eeebf46de898466c48c + Thought: The output of the list_users activity is + stored in memory. I can retrieve this information + using the TaskMemory tool with the summarize + activity. + Action: {"name": "TaskMemoryClient", "path": + "summarize", "input": {"values": {"memory_name": + "TaskMemory", "artifact_namespace": + "51d22a018a434904a5da3bb8d4f763f7"}}} +[09/11/23 16:46:03] INFO Subtask 8e0e918571544eeebf46de898466c48c + Response: The text provides information about + two different users in an AWS IAM system. The first + user is named "example-user-1" and has a + user ID of "AIDASHBEHWJLQV2IOYDHM". The second user + is named "example-user-2" and + has a user ID of "AIDASHBEHWJLWHVS76C6X". Both + users have a path of "/", and their ARNs (Amazon + Resource Names) indicate their location in the IAM + system. The first user was created on July 18, + 2023, at 20:29:27 UTC, while the second user was + created on August 29, 2023, at 20:56:37 UTC. +[09/11/23 16:46:13] INFO Task 890fcf77fb074c9490d5c91563e0c995 + Output: There are two IAM users in your AWS + account: + + 1. User "example-user-1" with user ID + "AIDASHBEHWJLQV2IOYDHM", created on July 18, 2023, + at 20:29:27 UTC. + 2. User "example-user-2" with + user ID "AIDASHBEHWJLWHVS76C6X", created on August + 29, 2023, at 20:56:37 UTC. + +``` diff --git a/docs/griptape-tools/official-tools/aws-s3-client.md b/docs/griptape-tools/official-tools/aws-s3-client.md new file mode 100644 index 000000000..220a2d471 --- /dev/null +++ b/docs/griptape-tools/official-tools/aws-s3-client.md @@ -0,0 +1,65 @@ +# AwsS3Client + +This tool enables LLMs to make AWS S3 API requests. + +```python +import boto3 +from griptape.structures import Agent +from griptape.tools import AwsS3Client, TaskMemoryClient + +# Initialize the AWS S3 client +aws_s3_client = AwsS3Client( + session=boto3.Session() +) + +# Create an agent with the AWS S3 client tool +agent = Agent( + tools=[aws_s3_client, TaskMemoryClient(off_prompt=False)] +) + +# Task to list all the AWS S3 buckets +agent.run("List all my S3 buckets.") +``` +``` +[09/11/23 16:49:35] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 + Input: List all my S3 buckets. +[09/11/23 16:49:41] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d + Thought: To list all S3 buckets, I can use the + "list_s3_buckets" activity of the "AwsS3Client" + tool. This activity doesn't require any input. + + Action: {"name": "AwsS3Client", + "path": "list_s3_buckets"} +[09/11/23 16:49:42] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d + Response: Output of + "AwsS3Client.list_s3_buckets" was stored in memory + with memory_name "TaskMemory" and + artifact_namespace + "f2592085fd4a430286a46770ea508cc9" +[09/11/23 16:49:50] INFO Subtask 0e9bb639a432431a92ef40a8c085ca0f + Thought: The output of the "list_s3_buckets" + activity is stored in memory. I can retrieve this + information using the "summarize" activity of the + "TaskMemory" tool. + Action: {"name": "TaskMemoryClient", "path": + "summarize", "input": {"values": {"memory_name": + "TaskMemory", "artifact_namespace": + "f2592085fd4a430286a46770ea508cc9"}}} +[09/11/23 16:49:52] INFO Subtask 0e9bb639a432431a92ef40a8c085ca0f + Response: The text consists of multiple + dictionaries, each containing a 'Name' and + 'CreationDate' key-value pair. The 'Name' + represents the name of a resource or bucket, while + the 'CreationDate' represents the date and time + when the resource or bucket was created. +[09/11/23 16:50:03] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 + Output: The names of your S3 buckets are as + follows: + 1. Bucket Name: 'example-bucket-1', Creation Date: + '2022-01-01T00:00:00Z' + 2. Bucket Name: 'example-bucket-2', Creation Date: + '2022-01-02T00:00:00Z' + 3. Bucket Name: 'example-bucket-3', Creation Date: + '2022-01-03T00:00:00Z' + Please note that the creation dates are in UTC. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/calculator.md b/docs/griptape-tools/official-tools/calculator.md new file mode 100644 index 000000000..af3159c82 --- /dev/null +++ b/docs/griptape-tools/official-tools/calculator.md @@ -0,0 +1,33 @@ +# Calculator + +This tool enables LLMs to make simple calculations. + +```python +from griptape.structures import Agent +from griptape.tools import Calculator + +# Create an agent with the Calculator tool +agent = Agent( + tools=[Calculator(off_prompt=False)] +) + +# Run the agent with a task to perform the arithmetic calculation of \(10^5\) +agent.run("What is 10 raised to the power of 5?") +``` +``` +[09/08/23 14:23:51] INFO Task bbc6002a5e5b4655bb52b6a550a1b2a5 + Input: What is 10 raised to the power of 5? +[09/08/23 14:23:56] INFO Subtask 3e9211a0f44c4277812ae410c43adbc9 + Thought: The question is asking for the result of + 10 raised to the power of 5. This is a mathematical + operation that can be performed using the + Calculator tool. + + Action: {"name": "Calculator", + "path": "calculate", "input": {"values": + {"expression": "10**5"}}} + INFO Subtask 3e9211a0f44c4277812ae410c43adbc9 + Response: 100000 +[09/08/23 14:23:58] INFO Task bbc6002a5e5b4655bb52b6a550a1b2a5 + Output: 10 raised to the power of 5 is 100000. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/computer.md b/docs/griptape-tools/official-tools/computer.md new file mode 100644 index 000000000..9ff9ed288 --- /dev/null +++ b/docs/griptape-tools/official-tools/computer.md @@ -0,0 +1,107 @@ +# Computer + +This tool enables LLMs to execute Python code and run shell commands inside a Docker container. You have to have the Docker daemon running in order for this tool to work. + +You can specify a local working directory and environment variables during tool initialization: + +```python +from griptape.structures import Agent +from griptape.tools import Computer, TaskMemoryClient + +# Initialize the Computer tool +computer = Computer() + +# Create an agent with the Computer tool +agent = Agent( + tools=[computer, TaskMemoryClient(off_prompt=False)] +) + +# Create a file using the shell command +filename = "my_new_file.txt" +agent.run(f"Run this shell command for me: touch {filename}") + +# Add content to the file using the shell command +content = "This is the content of the file." +agent.run(f"Run this shell command for me: echo '{content}' > {filename}") + +# Output the contents of the file using the shell command +agent.run(f"Run this shell command for me: cat {filename}") +``` +``` +[09/11/23 16:24:15] INFO Task d08009ee983c4286ba10f83bcf3080e6 + Input: Run this shell command for me: touch + my_new_file.txt +[09/11/23 16:24:21] INFO Subtask 1ec0f9ea528e44b89eb9d41da0e00856 + Thought: The user wants to create a new file named + "my_new_file.txt". I can do this by executing the + shell command "touch my_new_file.txt" using the + Computer tool with the execute_command activity. + + Action: {"name": "Computer", + "path": "execute_command", "input": {"values": + {"command": "touch my_new_file.txt"}}} +[09/11/23 16:24:22] INFO Subtask 1ec0f9ea528e44b89eb9d41da0e00856 + Response: Output of "Computer.execute_command" + was stored in memory with memory_name + "TaskMemory" and artifact_namespace + "54ffbc84a37a497480cab6ab4f904e7e" +[09/11/23 16:24:28] INFO Subtask f3e1b1d09b4c46babda27342680aa770 + Thought: The command has been executed and the + output is stored in memory. However, the "touch" + command does not produce any output when it + successfully creates a file. To confirm that the + file was created, I can list the files in the + current directory using the "ls" command. + + Action: {"name": "Computer", + "path": "execute_command", "input": {"values": + {"command": "ls"}}} +[09/11/23 16:24:29] INFO Subtask f3e1b1d09b4c46babda27342680aa770 + Response: Output of "Computer.execute_command" + was stored in memory with memory_name + "TaskMemory" and artifact_namespace + "82bc4937564e4901b7fc51fced45b643" +[09/11/23 16:24:40] INFO Subtask 36f0bbfdd7974e6cb52766ba21dc64e0 + Thought: The output of the "ls" command is stored + in memory. I need to retrieve this output to check + if "my_new_file.txt" is listed, which would confirm + that the file was created successfully. + Action: {"name": "TaskMemoryClient", "path": + "query", "input": {"values": {"memory_name": + "TaskMemory", "artifact_namespace": + "82bc4937564e4901b7fc51fced45b643", "query": "Is + my_new_file.txt in the list of files?"}}} +[09/11/23 16:24:41] INFO Subtask 36f0bbfdd7974e6cb52766ba21dc64e0 + Response: Yes. +[09/11/23 16:24:42] INFO Task d08009ee983c4286ba10f83bcf3080e6 + Output: The file "my_new_file.txt" has been + successfully created. + INFO Task d08009ee983c4286ba10f83bcf3080e6 + Input: Run this shell command for me: echo 'This is + the content of the file.' > my_new_file.txt +[09/11/23 16:24:53] INFO Subtask a0a3fb162d6d4f3398a98c6d3604a491 + Thought: The user wants to write the text 'This is + the content of the file.' into the file + 'my_new_file.txt'. I can achieve this by using the + 'execute_command' activity of the 'Computer' tool. + + Action: {"name": "Computer", + "path": "execute_command", "input": {"values": + {"command": "echo 'This is the content of the + file.' > my_new_file.txt"}}} + INFO Subtask a0a3fb162d6d4f3398a98c6d3604a491 + Response: Output of "Computer.execute_command" + was stored in memory with memory_name + "TaskMemory" and artifact_namespace + "ec20f2e7ec674e0286c8d1f05d528957" +[09/11/23 16:25:00] INFO Task d08009ee983c4286ba10f83bcf3080e6 + Output: The text 'This is the content of the file.' + has been successfully written into + 'my_new_file.txt'. + INFO Task d08009ee983c4286ba10f83bcf3080e6 + Input: Run this shell command for me: cat + my_new_file.txt +[09/11/23 16:25:10] INFO Task d08009ee983c4286ba10f83bcf3080e6 + Output: The content of the file 'my_new_file.txt' + is: 'This is the content of the file.' +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/date-time.md b/docs/griptape-tools/official-tools/date-time.md new file mode 100644 index 000000000..fa2a2e153 --- /dev/null +++ b/docs/griptape-tools/official-tools/date-time.md @@ -0,0 +1,36 @@ +# DateTime + +This tool enables LLMs to get current date and time. + +```python +from griptape.structures import Agent +from griptape.tools import DateTime + +# Create an agent with the DateTime tool +agent = Agent( + tools=[DateTime(off_prompt=False)] +) + +# Fetch the current date and time +agent.run({ + "description": "What is the current date and time?" +}) +``` +``` +[09/11/23 15:26:02] INFO Task d0bf49dacd8849e695494578a333f6cc + Input: {'description': 'What is the current date + and time?'} +[09/11/23 15:26:06] INFO Subtask 1c6c8d43926d4eff81992886301d5655 + Thought: The user wants to know the current date + and time. I can use the DateTime tool with the + get_current_datetime activity to find this + information. + + Action: {"name": "DateTime", + "path": "get_current_datetime"} + INFO Subtask 1c6c8d43926d4eff81992886301d5655 + Response: 2023-09-11 15:26:06.767997 +[09/11/23 15:26:08] INFO Task d0bf49dacd8849e695494578a333f6cc + Output: The current date and time is September 11, + 2023, 15:26:06. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/email-client.md b/docs/griptape-tools/official-tools/email-client.md new file mode 100644 index 000000000..ec8af7bb6 --- /dev/null +++ b/docs/griptape-tools/official-tools/email-client.md @@ -0,0 +1,22 @@ +# EmailClient + +The [EmailClient](../../reference/griptape/tools/email_client/tool.md) enables LLMs to send emails. + +```python +import os +from griptape.tools import EmailClient + +email_client = EmailClient( + smtp_host=os.environ.get("SMTP_HOST"), + smtp_port=int(os.environ.get("SMTP_PORT", 465)), + smtp_password=os.environ.get("SMTP_PASSWORD"), + smtp_user=os.environ.get("FROM_EMAIL"), + smtp_use_ssl=bool(os.environ.get("SMTP_USE_SSL")), +) +``` + +For debugging purposes, you can run a local SMTP server that the LLM can send emails to: + +```shell +python -m smtpd -c DebuggingServer -n localhost:1025 +``` diff --git a/docs/griptape-tools/official-tools/file-manager.md b/docs/griptape-tools/official-tools/file-manager.md new file mode 100644 index 000000000..cc10ccfcb --- /dev/null +++ b/docs/griptape-tools/official-tools/file-manager.md @@ -0,0 +1,48 @@ +# FileManager + +This tool enables LLMs to save and load files. + +```python +from griptape.structures import Agent +from griptape.tools import FileManager + +# Initialize the FileManager tool with the current directory as its base +file_manager_tool = FileManager() + +# Add the tool to the Agent +agent = Agent( + tools=[file_manager_tool] +) + +# Directly create a file named 'sample1.txt' with some content +filename = "sample1.txt" +content = "This is the content of sample1.txt" + +with open(filename, "w") as f: + f.write(content) + +# Now, read content from the file 'sample1.txt' using the agent's command +agent.run("Can you get me the sample1.txt file?") +``` +``` +[09/12/23 12:07:56] INFO Task 16a1ce1847284ae3805485bad7d99116 + Input: Can you get me the sample1.txt file? +[09/12/23 12:08:04] INFO Subtask ddcf48d970ce4edbbc22a46b2f83ec4f + Thought: The user wants the content of the file + named "sample1.txt". I can use the FileManager tool + with the activity "load_files_from_disk" to load + the file from the disk. + + Action: {"name": "FileManager", + "path": "load_files_from_disk", "input": + {"values": {"paths": ["sample1.txt"]}}} + INFO Subtask ddcf48d970ce4edbbc22a46b2f83ec4f + Response: + [BlobArtifact(id='a715cc1bc6724bf28566a5b3c343b6ed' + , name='sample1.txt', type='BlobArtifact', + value=b'This is the content of sample1.txt', + dir='')] +[09/12/23 12:08:10] INFO Task 16a1ce1847284ae3805485bad7d99116 + Output: The content of the file "sample1.txt" is + "This is the content of sample1.txt". +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/google-cal-client.md b/docs/griptape-tools/official-tools/google-cal-client.md new file mode 100644 index 000000000..cc2661a92 --- /dev/null +++ b/docs/griptape-tools/official-tools/google-cal-client.md @@ -0,0 +1,37 @@ +# GoogleCalendarClient + +The GoogleCalendarClient tool allows you to interact with Google Calendar. + + +```python +import os +from griptape.tools import GoogleCalendarClient, TaskMemoryClient +from griptape.structures import Agent + +# Create the GoogleCalendarClient tool +google_calendar_tool = GoogleCalendarClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"] +) + +# Set up an agent using the GoogleCalendarClient tool +agent = Agent( + tools=[google_calendar_tool, TaskMemoryClient(off_prompt=False)] +) + +# Task: Get upcoming events from a Google calendar +agent.run( + "Get me the details of the next upcoming event from my primary calendar.", +) +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/google-docs-client.md b/docs/griptape-tools/official-tools/google-docs-client.md new file mode 100644 index 000000000..26a4a1f10 --- /dev/null +++ b/docs/griptape-tools/official-tools/google-docs-client.md @@ -0,0 +1,63 @@ +# GoogleDocsClient + +The GoogleDocsClient tool provides a way to interact with the Google Docs API. It can be used to create new documents, save content to existing documents, and more. + +```python +import os +from griptape.structures import Agent +from griptape.tools import GoogleDocsClient + +# Create the GoogleDocsClient tool +google_docs_tool = GoogleDocsClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], + off_prompt=False +) + +# Set up an agent using the GoogleDocsClient tool +agent = Agent( + tools=[google_docs_tool] +) + +# Task: Create a new Google Doc and save content to it +agent.run( + "Create doc with name 'test_creation' in test folder with content 'Hey, Tony.", +) +``` +``` +[10/05/23 12:56:19] INFO ToolkitTask 90721b7478a74618a63d852d35be3b18 + Input: Create doc with name 'test_creation' in + test folder with content 'Hey, Tony.' +[10/05/23 12:56:28] INFO Subtask 042b7050755f43578bba2c315d124fcb + Thought: The user wants to create a Google Doc + named 'test_creation' in a folder named 'test' + with the content 'Hey, Tony.'. I can use the + 'save_content_to_google_doc' activity of the + GoogleDocsClient tool to achieve this. + + Action: {"name": + "GoogleDocsClient", "path": + "save_content_to_google_doc", "input": {"values": + {"file_path": "test_creation", "content": "Hey, + Tony.", "folder_path": "test"}}} +[10/05/23 12:56:31] INFO Subtask 042b7050755f43578bba2c315d124fcb + Response: Content has been successfully saved to + Google Doc with ID: + 1OgKbsPqxOnzkf65kodb1i1_qC1zjX_Bend5XL5bVxpA. +[10/05/23 12:56:38] INFO ToolkitTask 90721b7478a74618a63d852d35be3b18 + Output: The document 'test_creation' has been + successfully created in the 'test' folder with the + content 'Hey, Tony.'. The Google Doc ID is + 1OgKbsPqxOnzkf65kodb1i1_qC1zjX_Bend5XL5bVxpA. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/google-drive-client.md b/docs/griptape-tools/official-tools/google-drive-client.md new file mode 100644 index 000000000..1c7d53541 --- /dev/null +++ b/docs/griptape-tools/official-tools/google-drive-client.md @@ -0,0 +1,60 @@ +# GoogleDriveClient + +The GoogleDriveClient tool provides a way to interact with the Google Drive API. It can be used to save content on Drive, list files, and more. + +```python +import os +from griptape.structures import Agent +from griptape.tools import GoogleDriveClient + +# Create the GoogleDriveClient tool +google_drive_tool = GoogleDriveClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], + off_prompt=False +) + +# Set up an agent using the GoogleDriveClient tool +agent = Agent( + tools=[google_drive_tool] +) + +# Task: Save content to my Google Drive (default directory is root) +agent.run( + "Save the content 'Hi this is Tony' in a filed named 'hello.txt' to my Drive.", +) +``` +``` +[10/05/23 10:49:14] INFO ToolkitTask 2ae3bb7e828744f3a2631c29c6fce001 + Input: Save the content 'Hi this is Tony' in a file + named 'hello.txt' to my Drive. +[10/05/23 10:49:24] INFO Subtask 381430d881354184ace65af39e0b292b + Thought: The user wants to save the content 'Hi + this is Tony' in a file named 'hello.txt' to Google + Drive. I can use the 'save_content_to_drive' + activity of the GoogleDriveClient tool to + accomplish this. + + Action: {"name": + "GoogleDriveClient", "path": + "save_content_to_drive", "input": {"values": + {"path": "hello.txt", "content": "Hi this is + Tony"}}} +[10/05/23 10:49:26] INFO Subtask 381430d881354184ace65af39e0b292b + Response: saved successfully +[10/05/23 10:49:29] INFO ToolkitTask 2ae3bb7e828744f3a2631c29c6fce001 + Output: The content 'Hi this is Tony' has been + successfully saved in a file named 'hello.txt' on + your Google Drive. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/google-gmail-client.md b/docs/griptape-tools/official-tools/google-gmail-client.md new file mode 100644 index 000000000..067928a39 --- /dev/null +++ b/docs/griptape-tools/official-tools/google-gmail-client.md @@ -0,0 +1,62 @@ +# GoogleGmailClient + +The GoogleGmailClient tool provides a way to interact with the Gmail API. It can be used to create draft emails, send emails, and more. + +```python +from griptape.tools import GoogleGmailClient +from griptape.structures import Agent +import os + +# Create the GoogleGmailClient tool +gmail_tool = GoogleGmailClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], + off_prompt=False +) + +# Set up an agent using the GoogleGmailClient tool +agent = Agent( + tools=[gmail_tool] +) + +# Task: Create a draft email in GMail +agent.run( + "Create a draft email in Gmail to example@email.com with the subject 'Test Draft', the body " + "'This is a test draft email.'", +) +``` +``` +[10/05/23 13:24:05] INFO ToolkitTask 1f190f823d584053bfe9942f41b6cb2d + Input: Create a draft email in Gmail to + example@email.com with the subject 'Test Draft', + the body 'This is a test draft email.' +[10/05/23 13:24:15] INFO Subtask 7f2cce7e5b0e425ba696531561697b96 + Thought: The user wants to create a draft email in + Gmail. I can use the GoogleGmailClient tool with + the create_draft_email activity to accomplish this. + I will need to provide the 'to', 'subject', and + 'body' values as input. + + Action: {"name": + "GoogleGmailClient", "path": + "create_draft_email", "input": {"values": {"to": + "example@email.com", "subject": "Test Draft", + "body": "This is a test draft email."}}} +[10/05/23 13:24:16] INFO Subtask 7f2cce7e5b0e425ba696531561697b96 + Response: An email draft was successfully + created (ID: r6322867913697829111) +[10/05/23 13:24:19] INFO ToolkitTask 1f190f823d584053bfe9942f41b6cb2d + Output: The draft email has been successfully + created in Gmail with the ID: r6322867913697829111. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/image-query-client.md b/docs/griptape-tools/official-tools/image-query-client.md new file mode 100644 index 000000000..fb5dcca33 --- /dev/null +++ b/docs/griptape-tools/official-tools/image-query-client.md @@ -0,0 +1,29 @@ +# ImageQueryClient + +This tool allows Agents to execute natural language queries on the contents of images using multimodal models. + +```python +from griptape.structures import Agent +from griptape.tools import ImageQueryClient +from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.engines import ImageQueryEngine + +# Create an Image Query Driver. +driver = OpenAiVisionImageQueryDriver( + model="gpt-4-vision-preview" +) + +# Create an Image Query Engine configured to use the driver. +engine = ImageQueryEngine( + image_query_driver=driver, +) + +# Create an Image Query Client configured to use the engine. +tool = ImageQueryClient( + image_query_engine=engine, + off_prompt=False, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Describe the weather in the image tests/resources/mountain.png in one word.") +``` diff --git a/docs/griptape-tools/official-tools/inpainting-image-generation-client.md b/docs/griptape-tools/official-tools/inpainting-image-generation-client.md new file mode 100644 index 000000000..82c99adb7 --- /dev/null +++ b/docs/griptape-tools/official-tools/inpainting-image-generation-client.md @@ -0,0 +1,32 @@ +# InpaintingImageGenerationClient + +This tool allows LLMs to generate images using inpainting, where an input image is altered within the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. + +```python +from griptape.structures import Agent +from griptape.engines import InpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tools import InpaintingImageGenerationClient + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = InpaintingImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Generate an image of a castle built into the side of a mountain by inpainting the " + "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png.") +``` diff --git a/docs/griptape-tools/official-tools/openweather-client.md b/docs/griptape-tools/official-tools/openweather-client.md new file mode 100644 index 000000000..d6d150766 --- /dev/null +++ b/docs/griptape-tools/official-tools/openweather-client.md @@ -0,0 +1,20 @@ +# OpenWeatherClient + +The [OpenWeatherClient](../../reference/griptape/tools/openweather_client/tool.md) enables LLMs to use [OpenWeatherMap](https://openweathermap.org/). + +```python +import os +from griptape.structures import Agent +from griptape.tools import OpenWeatherClient, TaskMemoryClient + +agent = Agent( + tools=[ + OpenWeatherClient( + api_key=os.environ["OPENWEATHER_API_KEY"], + ), + TaskMemoryClient(off_prompt=False) + ] +) + +agent.run("What's the weather currently like in San Francisco?") +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/outpainting-image-generation-client.md b/docs/griptape-tools/official-tools/outpainting-image-generation-client.md new file mode 100644 index 000000000..8e8940332 --- /dev/null +++ b/docs/griptape-tools/official-tools/outpainting-image-generation-client.md @@ -0,0 +1,32 @@ +# OutpaintingImageGenerationClient + +This tool allows LLMs to generate images using outpainting, where an input image is altered outside of the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. + +```python +from griptape.structures import Agent +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tools import OutpaintingImageGenerationClient + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = OutpaintingImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Generate an image of a mountain shrouded by clouds by outpainting the " + "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png.") +``` diff --git a/docs/griptape-tools/official-tools/prompt-image-generation-client.md b/docs/griptape-tools/official-tools/prompt-image-generation-client.md new file mode 100644 index 000000000..b2045bdd5 --- /dev/null +++ b/docs/griptape-tools/official-tools/prompt-image-generation-client.md @@ -0,0 +1,31 @@ +# PromptImageGenerationClient + +This tool allows LLMs to generate images from a text prompt. + +```python +from griptape.structures import Agent +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tools import PromptImageGenerationClient + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = PromptImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Generate an image of a mountain on a summer day.") +``` diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-client.md new file mode 100644 index 000000000..b253d0bce --- /dev/null +++ b/docs/griptape-tools/official-tools/rest-api-client.md @@ -0,0 +1,159 @@ +# RestApiClient + +This tool enables LLMs to call REST APIs. + +The [RestApiClient](../../reference/griptape/tools/rest_api_client/tool.md) tool uses the following parameters: + +### Example +The following example is built using [https://jsonplaceholder.typicode.com/guide/](https://jsonplaceholder.typicode.com/guide/). + +```python +from json import dumps +from griptape.drivers import OpenAiChatPromptDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask +from griptape.tools import RestApiClient +from griptape.config import StructureConfig, StructureGlobalDriversConfig + +posts_client = RestApiClient( + base_url="https://jsonplaceholder.typicode.com", + path="posts", + description="Allows for creating, updating, deleting, patching, and getting posts.", + off_prompt=False, + request_body_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["title", "body", "userId"], + "properties": { + "title": { + "type": "string", + "default": "", + "title": "The title Schema", + }, + "body": { + "type": "string", + "default": "", + "title": "The body Schema", + }, + "userId": { + "type": "integer", + "default": 0, + "title": "The userId Schema", + }, + }, + } + ), + request_query_params_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["userId"], + "properties": { + "userId": { + "type": "string", + "default": "", + "title": "The userId Schema", + }, + }, + } + ), + request_path_params_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "array", + "default": [], + "title": "Root Schema", + "items": { + "anyOf": [ + { + "type": "string", + "title": "Post id", + }, + ] + }, + } + ), + response_body_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["id", "title", "body", "userId"], + "properties": { + "id": { + "type": "integer", + "default": 0, + "title": "The id Schema", + }, + "title": { + "type": "string", + "default": "", + "title": "The title Schema", + }, + "body": { + "type": "string", + "default": "", + "title": "The body Schema", + }, + "userId": { + "type": "integer", + "default": 0, + "title": "The userId Schema", + }, + }, + } + ), +) + +pipeline = Pipeline( + conversation_memory=ConversationMemory(), + config = StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=OpenAiChatPromptDriver( + model="gpt-4", + temperature=0.1 + ), + ) + ), +) + +pipeline.add_tasks( + ToolkitTask( + "Output the title of post 1.", + tools=[posts_client], + ), + ToolkitTask( + "Create a post for user 1 with title 'My First Post' and body 'Hello world!'.", + tools=[posts_client], + ), + ToolkitTask( + "Update post 1 with a new body: 'Hello universe!'.", + tools=[posts_client], + ), + ToolkitTask( + "Patch post 1 with a new title: 'My First Post, A Journey'.", + tools=[posts_client], + ), + ToolkitTask( + "Delete post 1.", + tools=[posts_client], + ), + ToolkitTask( + "Output the body of all the comments for post 1.", + tools=[posts_client], + ), +) + +pipeline.run() +``` diff --git a/docs/griptape-tools/official-tools/sql-client.md b/docs/griptape-tools/official-tools/sql-client.md new file mode 100644 index 000000000..0e6fcf370 --- /dev/null +++ b/docs/griptape-tools/official-tools/sql-client.md @@ -0,0 +1,71 @@ +# SqlClient + +This tool enables LLMs to execute SQL statements via [SQLAlchemy](https://www.sqlalchemy.org/). Depending on your underlying SQL engine, [configure](https://docs.sqlalchemy.org/en/20/core/engines.html) your `engine_url` and give the LLM a hint about what engine you are using via `engine_name`, so that it can create engine-specific statements. + +```python +import os +import boto3 +from griptape.drivers import AmazonRedshiftSqlDriver +from griptape.loaders import SqlLoader +from griptape.structures import Agent +from griptape.tools import SqlClient, TaskMemoryClient + + +session = boto3.Session() + +sql_loader = SqlLoader( + sql_driver=AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], + ) +) + +sql_tool = SqlClient( + sql_loader=sql_loader, + table_name="people", + table_description="contains information about tech industry professionals", + engine_name="redshift" +) + +agent = Agent( + tools=[sql_tool, TaskMemoryClient(off_prompt=False)] +) +agent.run("SELECT * FROM people;") +``` +``` +[09/11/23 17:02:55] INFO Task d8331f8705b64b4b9d9a88137ed73f3f + Input: SELECT * FROM people; +[09/11/23 17:03:02] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 + Thought: The user wants to retrieve all records + from the 'people' table. I can use the SqlClient + tool to execute this query. + + Action: {"name": "SqlClient", + "path": "execute_query", "input": {"values": + {"sql_query": "SELECT * FROM people;"}}} +[09/11/23 17:03:03] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 + Response: Output of "SqlClient.execute_query" + was stored in memory with memory_name + "TaskMemory" and artifact_namespace + "217715ba3e444e4985bee223df5716a8" +[09/11/23 17:03:11] INFO Subtask e51f05449647482caa3051378ab5cb8c + Thought: The output of the SQL query has been + stored in memory. I can retrieve this data using + the TaskMemory's 'summarize' activity. + Action: {"name": "TaskMemoryClient", "path": + "summarize", "input": {"values": {"memory_name": + "TaskMemory", "artifact_namespace": + "217715ba3e444e4985bee223df5716a8"}}} +[09/11/23 17:03:12] INFO Subtask e51f05449647482caa3051378ab5cb8c + Response: The text includes a list of employees + with their respective IDs, names, positions. There + are two employees named Tanya Cooley who are both + managers, and two employees named John Doe who are + both coders. +[09/11/23 17:03:17] INFO Task d8331f8705b64b4b9d9a88137ed73f3f + Output: The 'people' table contains records of + several employees. Notably, there are two employees + named Tanya Cooley who are both managers, and two + employees named John Doe who are both coders. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/task-memory-client.md b/docs/griptape-tools/official-tools/task-memory-client.md new file mode 100644 index 000000000..9b32d4054 --- /dev/null +++ b/docs/griptape-tools/official-tools/task-memory-client.md @@ -0,0 +1,11 @@ +# TaskMemoryClient + +This tool enables LLMs to query and summarize task outputs that are stored in short-term tool memory. This tool uniquely requires the user to set the `off_prompt` property explicitly for usability reasons (Griptape doesn't provide the default `True` value). + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper, TaskMemoryClient + + +Agent(tools=[WebScraper(), TaskMemoryClient(off_prompt=False)]) +``` diff --git a/docs/griptape-tools/official-tools/variation-image-generation-client.md b/docs/griptape-tools/official-tools/variation-image-generation-client.md new file mode 100644 index 000000000..a9f703b57 --- /dev/null +++ b/docs/griptape-tools/official-tools/variation-image-generation-client.md @@ -0,0 +1,83 @@ +# VariationImageGenerationEngine + +This Tool allows LLMs to generate variations of an input image from a text prompt. The input image can be provided either by its file path or by its [Task Memory](../../griptape-framework/structures/task-memory.md) reference. + +## Referencing an Image by File Path + +```python +from griptape.structures import Agent +from griptape.engines import VariationImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tools import VariationImageGenerationClient + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", + ), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = VariationImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Generate a variation of the image located at tests/resources/mountain.png " + "depicting a mountain on a winter day") +``` + +## Referencing an Image in Task Memory + +```python +from griptape.structures import Agent +from griptape.engines import VariationImageGenerationEngine, PromptImageGenerationEngine +from griptape.drivers import AmazonBedrockImageGenerationDriver, \ + BedrockStableDiffusionImageGenerationModelDriver +from griptape.tools import VariationImageGenerationClient, PromptImageGenerationClient + + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", + ), + model="stability.stable-diffusion-xl-v0", +) + +# Create an prompt image generation engine configured to use the driver. +prompt_engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a prompt image generation client configured to use the engine. +prompt_tool = PromptImageGenerationClient( + engine=prompt_engine, +) + +# Create an variation image generation engine configured to use the driver. +variation_engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a variation image generation client configured to use the engine. +variation_tool = VariationImageGenerationClient( + engine=variation_engine, +) + +# Create an agent and provide the tools to it. +agent = Agent(tools=[prompt_tool, variation_tool]) + +# Run the agent using a prompt motivating it to generate an image, then +# create a variation of the image present in task memory. +agent.run("Generate an image of a mountain on a summer day. Then, generate a " + "variation of this image depicting the same mountain scene on a winter day.") +``` diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md new file mode 100644 index 000000000..2b4d6cbe5 --- /dev/null +++ b/docs/griptape-tools/official-tools/vector-store-client.md @@ -0,0 +1,37 @@ +The [VectorStoreClient](../../reference/griptape/tools/vector_store_client/tool.md) enables LLMs to dynamically query task memory. + +Here is an example of how it can be used with the Pincone storage driver: + +```python +from griptape.structures import Agent +from griptape.tools import VectorStoreClient, TaskMemoryClient +from griptape.loaders import WebLoader +from griptape.engines import VectorQueryEngine +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver + +engine = VectorQueryEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), + vector_store_driver=LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), + ), +) + +engine.upsert_text_artifacts( + WebLoader().load("https://www.griptape.ai"), + namespace="griptape" +) + +vector_db = VectorStoreClient( + description="This DB has information about the Griptape Python framework", + query_engine=engine, + namespace="griptape" +) + +agent = Agent( + tools=[vector_db, TaskMemoryClient(off_prompt=False)] +) + +agent.run( + "what is Griptape?" +) +``` diff --git a/docs/griptape-tools/official-tools/web-scraper.md b/docs/griptape-tools/official-tools/web-scraper.md new file mode 100644 index 000000000..ee52cc76c --- /dev/null +++ b/docs/griptape-tools/official-tools/web-scraper.md @@ -0,0 +1,76 @@ +# WebScraper + +This tool enables LLMs to scrape web pages for full text, summaries, authors, titles, and keywords. It can also execute search queries to answer specific questions about the page. This tool uses OpenAI APIs for some of its activities, so in order to use it provide a valid API key in `openai_api_key`. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper, TaskMemoryClient + +agent = Agent( + tools=[WebScraper(), TaskMemoryClient(off_prompt=False)] +) + +agent.run( + "Based on https://www.griptape.ai/, tell me what griptape is" +) +``` +``` +[09/11/23 15:27:39] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed + Input: Based on https://www.griptape.ai/, tell me + what griptape is +[09/11/23 15:27:47] INFO Subtask 4b34be74b06a47ba9cb3a4b62aa35907 + Thought: I need to find out what griptape is based + on the information provided on the website + https://www.griptape.ai/. I can use the WebScraper + tool with the get_content activity to load the + content of the website. + + Action: {"name": "WebScraper", + "path": "get_content", "input": {"values": + {"url": "https://www.griptape.ai/"}}} +[09/11/23 15:27:48] INFO Subtask 4b34be74b06a47ba9cb3a4b62aa35907 + Response: Output of "WebScraper.get_content" was + stored in memory with memory_name "TaskMemory" + and artifact_namespace + "02da5930b8d74f7ca30aecc3760a3318" +[09/11/23 15:27:59] INFO Subtask 5b255e3e98aa401295f77532bc779390 + Thought: The content of the website has been stored + in memory. I can use the TaskMemory tool with + the summarize activity to get a summary of the + content. + Action: {"name": "TaskMemoryClient", "path": + "summarize", "input": {"values": {"memory_name": + "TaskMemory", "artifact_namespace": + "02da5930b8d74f7ca30aecc3760a3318"}}} +[09/11/23 15:28:03] INFO Subtask 5b255e3e98aa401295f77532bc779390 + Response: Griptape is an open source framework + that allows developers to build and deploy AI + applications using large language models (LLMs). It + provides the ability to create conversational and + event-driven apps that can access and manipulate + data securely. Griptape enforces structures like + sequential pipelines and DAG-based workflows for + predictability, while also allowing for creativity + by safely prompting LLMs with external APIs and + data stores. The framework can be used to create AI + systems that operate across both dimensions. + Griptape Cloud is a managed platform for deploying + and managing AI apps, and it offers features like + scheduling and connecting to data stores and APIs. +[09/11/23 15:28:12] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed + Output: Griptape is an open source framework that + enables developers to build and deploy AI + applications using large language models (LLMs). It + allows the creation of conversational and + event-driven apps that can securely access and + manipulate data. Griptape enforces structures like + sequential pipelines and DAG-based workflows for + predictability, while also allowing for creativity + by safely prompting LLMs with external APIs and + data stores. The framework can be used to create AI + systems that operate across both dimensions. + Additionally, Griptape Cloud is a managed platform + for deploying and managing AI apps, offering + features like scheduling and connecting to data + stores and APIs. +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search.md new file mode 100644 index 000000000..f22ef1a23 --- /dev/null +++ b/docs/griptape-tools/official-tools/web-search.md @@ -0,0 +1,110 @@ +# WebSearch + +This tool enables LLMs to search the web. + +```python +import os +from griptape.tools import WebSearch +from griptape.structures import Agent + +# Initialize the WebSearch tool with necessary parameters +web_search_tool = WebSearch( + results_count=5, + google_api_lang="lang_en", + google_api_key=os.environ["GOOGLE_API_KEY"], + google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + google_api_country="us", + off_prompt=False +) + +# Set up an agent using the WebSearch tool +agent = Agent( + tools=[web_search_tool] +) + +# Task: Search the web for a specific query +agent.run("Tell me how photosynthesis works") +``` +``` +[09/08/23 15:37:25] INFO Task 2cf557f7f7cd4a20a7fa2f0c46af2f71 + Input: Tell me how photosynthesis works +[09/08/23 15:37:32] INFO Subtask d023ef9f41d142229513510cf4f47afe + Thought: I know that photosynthesis is a process + used by plants and other organisms to convert light + energy into chemical energy that can later be + released to fuel the organisms' activities. + However, to provide a detailed explanation, I will + need to conduct a web search. + + Action: {"name": "WebSearch", + "path": "search", "input": {"values": {"query": + "How does photosynthesis work?"}}} + INFO Subtask d023ef9f41d142229513510cf4f47afe + Response: {'url': + 'https://www.nationalgeographic.org/encyclopedia/ph + otosynthesis/', 'title': 'Photosynthesis', + 'description': 'Jul 15, 2022 ... Photosynthesis is + the process by which plants use sunlight, water, + and carbon dioxide to create oxygen and energy in + the form of sugar.'} + {'url': + 'https://www.snexplores.org/article/explainer-how-p + hotosynthesis-works', 'title': 'Explainer: How + photosynthesis works', 'description': 'Oct 28, 2020 + ... Photosynthesis is the process of creating sugar + and oxygen from carbon dioxide, water and sunlight. + It happens through a long series of + chemical\xa0...'} + {'url': + 'https://www.sciencefocus.com/nature/how-does-photo + synthesis-work', 'title': 'Photosynthesis: What is + it and how does it work? - BBC Science ...', + 'description': "Jul 27, 2022 ... Photosynthesis is + the process by which carbohydrate molecules are + synthesised. It's used by plants, algae and certain + bacteriato turn sunlight,\xa0..."} + {'url': 'https://oregonforests.org/photosynthesis', + 'title': 'Photosynthesis | OregonForests', + 'description': "Here's how it works: Tree and plant + roots absorb water, as well as minerals and + nutrients, from the soil. At the same time, the + leaves or needles absorb carbon\xa0..."} + {'url': + 'https://ssec.si.edu/stemvisions-blog/what-photosyn + thesis', 'title': 'What is Photosynthesis | + Smithsonian Science Education Center', + 'description': 'Apr 12, 2017 ... Rather, plants use + sunlight, water, and the gases in the air to make + glucose, which is a form of sugar that plants need + to survive. This process\xa0...'} +[09/08/23 15:37:50] INFO Task 2cf557f7f7cd4a20a7fa2f0c46af2f71 + Output: Photosynthesis is the process by which + plants, algae, and certain bacteria convert light + energy, usually from the sun, into chemical energy + in the form of glucose or sugar. This process + involves several steps: + + 1. Absorption of light: The process begins when + light is absorbed by proteins containing + chlorophylls (pigments) present in chloroplasts. + + 2. Conversion of light energy to chemical energy: + The absorbed light energy is used to convert carbon + dioxide from the atmosphere and water from the soil + into glucose. This conversion process occurs + through a series of chemical reactions known as the + light-dependent reactions and the Calvin cycle. + + 3. Release of oxygen: As a byproduct of these + reactions, oxygen is produced and released into the + atmosphere. + + 4. Use of glucose: The glucose produced is used by + the plant for growth and development. It can also + be stored for later use. + + In summary, photosynthesis is a vital process for + life on Earth as it is the primary source of oxygen + in the atmosphere and forms the basis of the food + chain. +``` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..727761f87 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,27 @@ +# Griptape Docs + +Welcome to Griptape Docs! This documentation is organized into the following sections: + +## Griptape Topic Guides + +Griptape Topic Guides discuss key topics at a high level and provide useful background information and explanation. + +### Griptape Framework + +[Griptape Framework](griptape-framework/index.md) provides an overview of the key topics within Griptape, and how you can get started building agents. + +### Griptape Tools + +[Griptape Tools](griptape-tools/index.md) provides and overview of the tools available within Griptape, and how you can use them to extend the capability of LLMs. + +## Griptape Recipes + +[Griptape Recipes](examples/index.md) are ready-to-go examples built around common use-cases like data retrieval and more. They are more advanced than Griptape Trade School, and require some understanding of how Griptape works. + +## Griptape Reference Guide + +[Griptape Reference Guide](reference/griptape/index.md) contains low level technical reference of Griptape's APIs. + +## Griptape Trade School + +[Griptape Trade School](https://learn.griptape.ai) takes you through the steps of building a variety of projects with Griptape. Start here if you are new to Griptape or programming. diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 000000000..e3acc1afb --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + + + +{% block announce %} +
    + Star and contribute to Griptape on GitHub! +
    +{% endblock %} \ No newline at end of file diff --git a/docs/plugins/swagger_ui_plugin.py b/docs/plugins/swagger_ui_plugin.py new file mode 100644 index 000000000..0243f6900 --- /dev/null +++ b/docs/plugins/swagger_ui_plugin.py @@ -0,0 +1,35 @@ +import os + +import markdown +from jinja2 import Environment, FileSystemLoader, select_autoescape +from markupsafe import Markup + +config_scheme = { + "spec_url": "https://cloud-preview.griptape.ai/public/openapi.yaml", + "template": "swagger.md.tmpl", + "outfile": "griptape-cloud/api/api-reference.md", +} + + +def generate_page_contents(page): + spec_url = config_scheme["spec_url"] + tmpl_url = config_scheme["template"] + env = Environment(loader=FileSystemLoader("docs/plugins/tmpl"), autoescape=select_autoescape(["html", "xml"])) + md = markdown.Markdown() + env.filters["markdown"] = lambda text: Markup(md.convert(text)) + + template = env.get_template(tmpl_url) + tmpl_out = template.render(spec_url=spec_url) + return tmpl_out + + +def on_config(config): + print("INFO - swagger-ui plugin ENABLED") + + +def on_page_read_source(page, config): + index_path = os.path.join(config["docs_dir"], config_scheme["outfile"]) + page_path = os.path.join(config["docs_dir"], page.file.src_path) + if index_path == page_path: + contents = generate_page_contents(page) + return contents diff --git a/docs/plugins/tmpl/swagger.md.tmpl b/docs/plugins/tmpl/swagger.md.tmpl new file mode 100644 index 000000000..1d35a3e5e --- /dev/null +++ b/docs/plugins/tmpl/swagger.md.tmpl @@ -0,0 +1,29 @@ +
    + + + \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..0b9852e82 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,153 @@ +site_name: Griptape Docs +hooks: + - docs/plugins/swagger_ui_plugin.py +plugins: + - glightbox + - search + - mkdocstrings: + handlers: + python: + paths: ["griptape"] + options: + show_if_no_docstring: true + heading_level: 3 + - gen-files: + scripts: + - docs/gen_ref_pages.py + - literate-nav: + nav_file: SUMMARY.md + - section-index +copyright: "© Griptape, Inc." +extra_css: + - assets/css/extra.css + - assets/css/code_select.css + - assets/css/mkdocstrings.css + - assets/css/swagger-ui.css +extra_javascript: + - assets/scripts/swagger-ui-bundle.js + - assets/scripts/swagger-ui-standalone-preset.js +extra: + analytics: + provider: google + property: G-QM8EDPSCB6 + social: + - icon: fontawesome/solid/house + link: https://www.griptape.ai + - icon: fontawesome/brands/discord + link: https://discord.gg/gnWRz88eym + - icon: fontawesome/brands/github + link: https://github.com/griptape-ai/griptape/ + - icon: fontawesome/brands/python + link: https://pypi.org/project/griptape/ +theme: + name: material + custom_dir: docs/overrides + logo: assets/img/griptape-mark-square-light.svg + palette: + scheme: slate + primary: black + accent: deep orange + features: + - content.code.copy + - content.code.annotate + - navigation.tabs + - navigation.sections + - navigation.expand + - navigation.top + - announce.dismiss + - toc.follow +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - admonition + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.details + - pymdownx.tabbed + - tables + - def_list + - footnotes +nav: + - Home: + - Overview: "index.md" + - Contributing: "contributing.md" + - Framework: + - Overview: "griptape-framework/index.md" + - Structures: + - Agents: "griptape-framework/structures/agents.md" + - Pipelines: "griptape-framework/structures/pipelines.md" + - Workflows: "griptape-framework/structures/workflows.md" + - Tasks: "griptape-framework/structures/tasks.md" + - Task Memory: "griptape-framework/structures/task-memory.md" + - Conversation Memory: "griptape-framework/structures/conversation-memory.md" + - Rulesets: "griptape-framework/structures/rulesets.md" + - Config: "griptape-framework/structures/config.md" + - Tools: + - Overview: "griptape-framework/tools/index.md" + - Building Custom Tools: "griptape-tools/custom-tools/index.md" + - Engines: + - Query Engines: "griptape-framework/engines/query-engines.md" + - Extraction Engines: "griptape-framework/engines/extraction-engines.md" + - Summary Engines: "griptape-framework/engines/summary-engines.md" + - Image Generation Engines: "griptape-framework/engines/image-generation-engines.md" + - Image Query Engines: "griptape-framework/engines/image-query-engines.md" + - Drivers: + - Prompt Drivers: "griptape-framework/drivers/prompt-drivers.md" + - Embedding Drivers: "griptape-framework/drivers/embedding-drivers.md" + - Vector Store Drivers: "griptape-framework/drivers/vector-store-drivers.md" + - Image Generation Drivers: "griptape-framework/drivers/image-generation-drivers.md" + - SQL Drivers: "griptape-framework/drivers/sql-drivers.md" + - Image Query Drivers: "griptape-framework/drivers/image-query-drivers.md" + - Web Scraper Drivers: "griptape-framework/drivers/web-scraper-drivers.md" + - Data: + - Overview: "griptape-framework/data/index.md" + - Artifacts: "griptape-framework/data/artifacts.md" + - Chunkers: "griptape-framework/data/chunkers.md" + - Loaders: "griptape-framework/data/loaders.md" + - Misc: + - Events: "griptape-framework/misc/events.md" + - Tokenizers: "griptape-framework/misc/tokenizers.md" + - Tools: + - Overview: "griptape-tools/index.md" + - Official Tools: + - AwsIamClient: "griptape-tools/official-tools/aws-iam-client.md" + - AwsS3Client: "griptape-tools/official-tools/aws-s3-client.md" + - Calculator: "griptape-tools/official-tools/calculator.md" + - Computer: "griptape-tools/official-tools/computer.md" + - DateTime: "griptape-tools/official-tools/date-time.md" + - EmailClient: "griptape-tools/official-tools/email-client.md" + - FileManager: "griptape-tools/official-tools/file-manager.md" + - GoogleCalendarClient: "griptape-tools/official-tools/google-cal-client.md" + - GoogleGmailClient: "griptape-tools/official-tools/google-gmail-client.md" + - GoogleDriveClient: "griptape-tools/official-tools/google-drive-client.md" + - GoogleDocsClient: "griptape-tools/official-tools/google-docs-client.md" + - OpenWeatherClient: "griptape-tools/official-tools/openweather-client.md" + - RestApiClient: "griptape-tools/official-tools/rest-api-client.md" + - SqlClient: "griptape-tools/official-tools/sql-client.md" + - TaskMemoryClient: "griptape-tools/official-tools/task-memory-client.md" + - VectorStoreClient: "griptape-tools/official-tools/vector-store-client.md" + - WebScraper: "griptape-tools/official-tools/web-scraper.md" + - WebSearch: "griptape-tools/official-tools/web-search.md" + - PromptImageGenerationClient: "griptape-tools/official-tools/prompt-image-generation-client.md" + - VariationImageGenerationClient: "griptape-tools/official-tools/variation-image-generation-client.md" + - InpaintingImageGenerationClient: "griptape-tools/official-tools/inpainting-image-generation-client.md" + - OutpaintingImageGenerationClient: "griptape-tools/official-tools/outpainting-image-generation-client.md" + - ImageQueryClient: "griptape-tools/official-tools/image-query-client.md" + - Custom Tools: + - Building Custom Tools: "griptape-tools/custom-tools/index.md" + - Recipes: + - Overview: "examples/index.md" + - Agents: + - Talk to Redshift: "examples/talk-to-redshift.md" + - Talk to a Webpage: "examples/talk-to-a-webpage.md" + - Talk to a PDF: "examples/talk-to-a-pdf.md" + - Shared Memory Between Agents: "examples/multiple-agent-shared-memory.md" + - Data: + - Load and Query Pinecone: "examples/load-and-query-pinecone.md" + - Load and Query Marqo: "examples/load-query-and-chat-marqo.md" + - Query a Webpage: "examples/query-webpage.md" + - Reference Guide: "reference/" + - Trade School: "https://learn.griptape.ai" diff --git a/poetry.lock b/poetry.lock index 3cc0fbee2..429d4574d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -208,6 +208,20 @@ tests = ["attrs[tests-no-zope]", "zope-interface"] tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +[[package]] +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "backoff" version = "2.2.1" @@ -1456,6 +1470,23 @@ files = [ [package.extras] speedup = ["python-levenshtein (>=0.12)"] +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + [[package]] name = "google-ai-generativelanguage" version = "0.4.0" @@ -1635,6 +1666,20 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "griffe" +version = "0.42.1" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, +] + +[package.dependencies] +colorama = ">=0.4" + [[package]] name = "grpcio" version = "1.62.1" @@ -2145,6 +2190,24 @@ files = [ simplejson = ">=3.17.0" six = ">=1.14.0" +[[package]] +name = "markdown" +version = "3.6" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2316,6 +2379,199 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "1.0.1" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-gen-files" +version = "0.5.0" +description = "MkDocs plugin to programmatically generate documentation pages during the build" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"}, + {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + +[[package]] +name = "mkdocs-glightbox" +version = "0.3.7" +description = "MkDocs plugin supports image lightbox with GLightbox." +optional = false +python-versions = "*" +files = [ + {file = "mkdocs-glightbox-0.3.7.tar.gz", hash = "sha256:4e890140a97dd4ad128cb92174384bd0ac33adec3304bbd2b7c48d0847685c4f"}, + {file = "mkdocs_glightbox-0.3.7-py3-none-any.whl", hash = "sha256:9659631a9829d93d8fb0ce3a20a10261c258605ba4dc87a3b7b5d847b93a276d"}, +] + +[[package]] +name = "mkdocs-literate-nav" +version = "0.6.1" +description = "MkDocs plugin to specify the navigation in Markdown instead of YAML" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_literate_nav-0.6.1-py3-none-any.whl", hash = "sha256:e70bdc4a07050d32da79c0b697bd88e9a104cf3294282e9cb20eec94c6b0f401"}, + {file = "mkdocs_literate_nav-0.6.1.tar.gz", hash = "sha256:78a7ab6d878371728acb0cdc6235c9b0ffc6e83c997b037f4a5c6ff7cef7d759"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + +[[package]] +name = "mkdocs-material" +version = "9.5.17" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.17-py3-none-any.whl", hash = "sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571"}, + {file = "mkdocs_material-9.5.17.tar.gz", hash = "sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocs-section-index" +version = "0.3.8" +description = "MkDocs plugin to allow clickable sections that lead to an index page" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, + {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, +] + +[package.dependencies] +mkdocs = ">=1.2" + +[[package]] +name = "mkdocstrings" +version = "0.23.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, + {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +pymdown-extensions = ">=6.3" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.8.0" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" + [[package]] name = "mongomock" version = "4.1.2" @@ -2700,6 +2956,16 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + [[package]] name = "pandas" version = "1.5.3" @@ -3244,6 +3510,24 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pymdown-extensions" +version = "10.7.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pymongo" version = "4.6.1" @@ -3631,6 +3915,20 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + [[package]] name = "readme-renderer" version = "42.0" @@ -4874,6 +5172,47 @@ numpy = ">=1.11" requests = ">=2.20,<3.0" tenacity = ">=8.0.1" +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "websocket-client" version = "1.7.0" @@ -5086,4 +5425,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "7b1203869463a403ae5ecbf8b3b267a919d6ef1baff302a28084e18c70e52205" +content-hash = "99746cb554c4bc04b03cb998baf428d187e2f0fa9fef3ec7667004578bb65d2c" diff --git a/pyproject.toml b/pyproject.toml index 0a52e0a88..ea2d78d06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -155,6 +155,20 @@ pyright = "^1.1.355" pre-commit = "^3.5.0" boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.18"} + +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +mkdocs = "^1.5.2" +mkdocs-material = "^9.2.8" +mkdocs-glightbox = "^0.3.4" +mkdocstrings = {extras = ["python"], version = "^0.23.0"} +mkdocs-gen-files = "^0.5.0" +mkdocs-literate-nav = "^0.6.0" +mkdocs-section-index = "^0.3.6" +pymdown-extensions = "^10.3" + [tool.black] line-length=120 skip_magic_trailing_comma = true diff --git a/tests/integration/test_code_blocks.py b/tests/integration/test_code_blocks.py new file mode 100644 index 000000000..a37e0d086 --- /dev/null +++ b/tests/integration/test_code_blocks.py @@ -0,0 +1,22 @@ +import io +import os + +import pytest +from tests.utils.code_blocks import get_all_code_blocks, check_py_string + + +if "DOCS_ALL_CHANGED_FILES" in os.environ: + docs_all_changed_files = os.environ["DOCS_ALL_CHANGED_FILES"].split() + + all_code_blocks = [get_all_code_blocks(changed_file) for changed_file in docs_all_changed_files] + all_code_blocks = [block for sublist in all_code_blocks for block in sublist] +else: + all_code_blocks = get_all_code_blocks("docs/**/*.md") + + +@pytest.mark.parametrize("block", all_code_blocks, ids=[f["id"] for f in all_code_blocks]) +def test_code_block(block, monkeypatch): + # Send some stdin for tests that use the Chat util + monkeypatch.setattr("sys.stdin", io.StringIO("Hi\nexit\n")) + + check_py_string(block["code"]) diff --git a/tests/resources/addresses.csv b/tests/resources/addresses.csv new file mode 100644 index 000000000..b9b365fc2 --- /dev/null +++ b/tests/resources/addresses.csv @@ -0,0 +1,7 @@ +"FirstName", "LastName", "StreetAddress", "City", "State", "ZipCode" +John,Doe,120 jefferson st.,Riverside, NJ, 08075 +Jack,McGinnis,220 hobo Av.,Phila, PA,09119 +"John ""Da Man""",Repici,120 Jefferson St.,Riverside, NJ,08075 +Stephen,Tyler,"7452 Terrace ""At the Plaza"" road",SomeTown,SD, 91234 +,Blankman,,SomeTown, SD, 00298 +"Joan ""the bone"", Anne",Jet,"9th, at Terrace plc",Desert City,CO,00123 diff --git a/tests/resources/cities.csv b/tests/resources/cities.csv new file mode 100644 index 000000000..ee6b058b6 --- /dev/null +++ b/tests/resources/cities.csv @@ -0,0 +1,130 @@ +"LatD", "LatM", "LatS", "NS", "LonD", "LonM", "LonS", "EW", "City", "State" + 41, 5, 59, "N", 80, 39, 0, "W", "Youngstown", OH + 42, 52, 48, "N", 97, 23, 23, "W", "Yankton", SD + 46, 35, 59, "N", 120, 30, 36, "W", "Yakima", WA + 42, 16, 12, "N", 71, 48, 0, "W", "Worcester", MA + 43, 37, 48, "N", 89, 46, 11, "W", "Wisconsin Dells", WI + 36, 5, 59, "N", 80, 15, 0, "W", "Winston-Salem", NC + 49, 52, 48, "N", 97, 9, 0, "W", "Winnipeg", MB + 39, 11, 23, "N", 78, 9, 36, "W", "Winchester", VA + 34, 14, 24, "N", 77, 55, 11, "W", "Wilmington", NC + 39, 45, 0, "N", 75, 33, 0, "W", "Wilmington", DE + 48, 9, 0, "N", 103, 37, 12, "W", "Williston", ND + 41, 15, 0, "N", 77, 0, 0, "W", "Williamsport", PA + 37, 40, 48, "N", 82, 16, 47, "W", "Williamson", WV + 33, 54, 0, "N", 98, 29, 23, "W", "Wichita Falls", TX + 37, 41, 23, "N", 97, 20, 23, "W", "Wichita", KS + 40, 4, 11, "N", 80, 43, 12, "W", "Wheeling", WV + 26, 43, 11, "N", 80, 3, 0, "W", "West Palm Beach", FL + 47, 25, 11, "N", 120, 19, 11, "W", "Wenatchee", WA + 41, 25, 11, "N", 122, 23, 23, "W", "Weed", CA + 31, 13, 11, "N", 82, 20, 59, "W", "Waycross", GA + 44, 57, 35, "N", 89, 38, 23, "W", "Wausau", WI + 42, 21, 36, "N", 87, 49, 48, "W", "Waukegan", IL + 44, 54, 0, "N", 97, 6, 36, "W", "Watertown", SD + 43, 58, 47, "N", 75, 55, 11, "W", "Watertown", NY + 42, 30, 0, "N", 92, 20, 23, "W", "Waterloo", IA + 41, 32, 59, "N", 73, 3, 0, "W", "Waterbury", CT + 38, 53, 23, "N", 77, 1, 47, "W", "Washington", DC + 41, 50, 59, "N", 79, 8, 23, "W", "Warren", PA + 46, 4, 11, "N", 118, 19, 48, "W", "Walla Walla", WA + 31, 32, 59, "N", 97, 8, 23, "W", "Waco", TX + 38, 40, 48, "N", 87, 31, 47, "W", "Vincennes", IN + 28, 48, 35, "N", 97, 0, 36, "W", "Victoria", TX + 32, 20, 59, "N", 90, 52, 47, "W", "Vicksburg", MS + 49, 16, 12, "N", 123, 7, 12, "W", "Vancouver", BC + 46, 55, 11, "N", 98, 0, 36, "W", "Valley City", ND + 30, 49, 47, "N", 83, 16, 47, "W", "Valdosta", GA + 43, 6, 36, "N", 75, 13, 48, "W", "Utica", NY + 39, 54, 0, "N", 79, 43, 48, "W", "Uniontown", PA + 32, 20, 59, "N", 95, 18, 0, "W", "Tyler", TX + 42, 33, 36, "N", 114, 28, 12, "W", "Twin Falls", ID + 33, 12, 35, "N", 87, 34, 11, "W", "Tuscaloosa", AL + 34, 15, 35, "N", 88, 42, 35, "W", "Tupelo", MS + 36, 9, 35, "N", 95, 54, 36, "W", "Tulsa", OK + 32, 13, 12, "N", 110, 58, 12, "W", "Tucson", AZ + 37, 10, 11, "N", 104, 30, 36, "W", "Trinidad", CO + 40, 13, 47, "N", 74, 46, 11, "W", "Trenton", NJ + 44, 45, 35, "N", 85, 37, 47, "W", "Traverse City", MI + 43, 39, 0, "N", 79, 22, 47, "W", "Toronto", ON + 39, 2, 59, "N", 95, 40, 11, "W", "Topeka", KS + 41, 39, 0, "N", 83, 32, 24, "W", "Toledo", OH + 33, 25, 48, "N", 94, 3, 0, "W", "Texarkana", TX + 39, 28, 12, "N", 87, 24, 36, "W", "Terre Haute", IN + 27, 57, 0, "N", 82, 26, 59, "W", "Tampa", FL + 30, 27, 0, "N", 84, 16, 47, "W", "Tallahassee", FL + 47, 14, 24, "N", 122, 25, 48, "W", "Tacoma", WA + 43, 2, 59, "N", 76, 9, 0, "W", "Syracuse", NY + 32, 35, 59, "N", 82, 20, 23, "W", "Swainsboro", GA + 33, 55, 11, "N", 80, 20, 59, "W", "Sumter", SC + 40, 59, 24, "N", 75, 11, 24, "W", "Stroudsburg", PA + 37, 57, 35, "N", 121, 17, 24, "W", "Stockton", CA + 44, 31, 12, "N", 89, 34, 11, "W", "Stevens Point", WI + 40, 21, 36, "N", 80, 37, 12, "W", "Steubenville", OH + 40, 37, 11, "N", 103, 13, 12, "W", "Sterling", CO + 38, 9, 0, "N", 79, 4, 11, "W", "Staunton", VA + 39, 55, 11, "N", 83, 48, 35, "W", "Springfield", OH + 37, 13, 12, "N", 93, 17, 24, "W", "Springfield", MO + 42, 5, 59, "N", 72, 35, 23, "W", "Springfield", MA + 39, 47, 59, "N", 89, 39, 0, "W", "Springfield", IL + 47, 40, 11, "N", 117, 24, 36, "W", "Spokane", WA + 41, 40, 48, "N", 86, 15, 0, "W", "South Bend", IN + 43, 32, 24, "N", 96, 43, 48, "W", "Sioux Falls", SD + 42, 29, 24, "N", 96, 23, 23, "W", "Sioux City", IA + 32, 30, 35, "N", 93, 45, 0, "W", "Shreveport", LA + 33, 38, 23, "N", 96, 36, 36, "W", "Sherman", TX + 44, 47, 59, "N", 106, 57, 35, "W", "Sheridan", WY + 35, 13, 47, "N", 96, 40, 48, "W", "Seminole", OK + 32, 25, 11, "N", 87, 1, 11, "W", "Selma", AL + 38, 42, 35, "N", 93, 13, 48, "W", "Sedalia", MO + 47, 35, 59, "N", 122, 19, 48, "W", "Seattle", WA + 41, 24, 35, "N", 75, 40, 11, "W", "Scranton", PA + 41, 52, 11, "N", 103, 39, 36, "W", "Scottsbluff", NB + 42, 49, 11, "N", 73, 56, 59, "W", "Schenectady", NY + 32, 4, 48, "N", 81, 5, 23, "W", "Savannah", GA + 46, 29, 24, "N", 84, 20, 59, "W", "Sault Sainte Marie", MI + 27, 20, 24, "N", 82, 31, 47, "W", "Sarasota", FL + 38, 26, 23, "N", 122, 43, 12, "W", "Santa Rosa", CA + 35, 40, 48, "N", 105, 56, 59, "W", "Santa Fe", NM + 34, 25, 11, "N", 119, 41, 59, "W", "Santa Barbara", CA + 33, 45, 35, "N", 117, 52, 12, "W", "Santa Ana", CA + 37, 20, 24, "N", 121, 52, 47, "W", "San Jose", CA + 37, 46, 47, "N", 122, 25, 11, "W", "San Francisco", CA + 41, 27, 0, "N", 82, 42, 35, "W", "Sandusky", OH + 32, 42, 35, "N", 117, 9, 0, "W", "San Diego", CA + 34, 6, 36, "N", 117, 18, 35, "W", "San Bernardino", CA + 29, 25, 12, "N", 98, 30, 0, "W", "San Antonio", TX + 31, 27, 35, "N", 100, 26, 24, "W", "San Angelo", TX + 40, 45, 35, "N", 111, 52, 47, "W", "Salt Lake City", UT + 38, 22, 11, "N", 75, 35, 59, "W", "Salisbury", MD + 36, 40, 11, "N", 121, 39, 0, "W", "Salinas", CA + 38, 50, 24, "N", 97, 36, 36, "W", "Salina", KS + 38, 31, 47, "N", 106, 0, 0, "W", "Salida", CO + 44, 56, 23, "N", 123, 1, 47, "W", "Salem", OR + 44, 57, 0, "N", 93, 5, 59, "W", "Saint Paul", MN + 38, 37, 11, "N", 90, 11, 24, "W", "Saint Louis", MO + 39, 46, 12, "N", 94, 50, 23, "W", "Saint Joseph", MO + 42, 5, 59, "N", 86, 28, 48, "W", "Saint Joseph", MI + 44, 25, 11, "N", 72, 1, 11, "W", "Saint Johnsbury", VT + 45, 34, 11, "N", 94, 10, 11, "W", "Saint Cloud", MN + 29, 53, 23, "N", 81, 19, 11, "W", "Saint Augustine", FL + 43, 25, 48, "N", 83, 56, 24, "W", "Saginaw", MI + 38, 35, 24, "N", 121, 29, 23, "W", "Sacramento", CA + 43, 36, 36, "N", 72, 58, 12, "W", "Rutland", VT + 33, 24, 0, "N", 104, 31, 47, "W", "Roswell", NM + 35, 56, 23, "N", 77, 48, 0, "W", "Rocky Mount", NC + 41, 35, 24, "N", 109, 13, 48, "W", "Rock Springs", WY + 42, 16, 12, "N", 89, 5, 59, "W", "Rockford", IL + 43, 9, 35, "N", 77, 36, 36, "W", "Rochester", NY + 44, 1, 12, "N", 92, 27, 35, "W", "Rochester", MN + 37, 16, 12, "N", 79, 56, 24, "W", "Roanoke", VA + 37, 32, 24, "N", 77, 26, 59, "W", "Richmond", VA + 39, 49, 48, "N", 84, 53, 23, "W", "Richmond", IN + 38, 46, 12, "N", 112, 5, 23, "W", "Richfield", UT + 45, 38, 23, "N", 89, 25, 11, "W", "Rhinelander", WI + 39, 31, 12, "N", 119, 48, 35, "W", "Reno", NV + 50, 25, 11, "N", 104, 39, 0, "W", "Regina", SA + 40, 10, 48, "N", 122, 14, 23, "W", "Red Bluff", CA + 40, 19, 48, "N", 75, 55, 48, "W", "Reading", PA + 41, 9, 35, "N", 81, 14, 23, "W", "Ravenna", OH + diff --git a/tests/resources/cow.png b/tests/resources/cow.png new file mode 100644 index 0000000000000000000000000000000000000000..38a12396781577440690d7d5c95d9b10266c9a5e GIT binary patch literal 3147861 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

    QSN|s)c&d^tfA~D_&!c7R2C~m?10fdi$SApd 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

    0M4H1}P0BLqKbV?ptEEc35PgMnrd!;_druI#2G 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�Pb9Q68 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

    h-Sgscabw8K{c_A4xR69( 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

    ?%}N!yo0eX5!_S}jkt|XNJBd5-ucI} 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 HYsiFqM$g|7-v5zxDCAel{#V5H==&MIcvvb-lQK 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%0A5Uszm1fL`iE=A+QIe-0e*D9~_v`;7 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%0DMAzR=t=$1S&TSn$ZGDSnJVgXf^+UJ3U#yz< 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%0DT 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%0DmxUn0C|OUDIJ zBB-y=Hkj3t%QU&0fIUmxP8T+g)8T>mpw6x2 zrVF((>%|6ACYS;YI3q}sIhppO$~hn_flrVSQ=27dVvAayn7XkjA5Rtto`PAG-P5rNtZ$4 zvk70HzaR%(@pLxxB4GSvqNr)4h#$bOovvQ<2{8o}e7OB^NpGE;yri7v(8~=|h9({V z>UwlLn7(^IsXbNZOEn>_lan+0vwQq0A?S@fLfLeh0%H^Aj49rhORtzq=8rCpycQ4i z6h+h+C1t8Re2ZUVk*dz zGs3s5f$JWho1G5G!?Mx8)~Xv$Iq9f}FuzW&QM8@X6S4uP?7wPjEL42v zr|r>XMJ|oZbxh$sO&dd0X$b9!$AOOwBSQqAR*-cOKJI=763Dh-*(M$X+e`L5`9MBL zpd>P2pP?CmcLGFcg9L!o`U!m>5lwf*uJ;B{Bs=|t6_F&v{2g7Zef?6;2c@o{XiiIU>+l z8CHgNi~ScdC2u5)u?&aq9V8=$CCf|f5w9l59Wxz=!9SvpSn`pIcI0(wN#{qt#%ARu z5ykumBoX0a#~xf<0<>;hS!6;PS#r*yBPm36!!1&UEpDS$!Eh)Y8uSZhWt!Xw$`BaYH>QdY zVa_LP>QCo9)YqcKr&9ucm|*?SBh-bo>zn2b*X5i|r{$lq{`B3%=*gHcdxq_2@&@JJbM zJJ6-RLWfV!p42_QEjV9Kq6-OuMU*Gy$I zQd|oPaN1-Sp_-qBSAwZ~h<$k`vq#`AmJCG+3(&@1eblqY2C3OYUw-b;N?O+AWD3Qg zi&R*}HwWVSJo6(|q>X7*tAFu~> zh#)P}p!fXNWJ0rcQoiU=5vqg6k|ZIo$ieGP2HitX+$G-%Junpmc%p8t$s`oGL7R0g zw6V@yx(YA`2|Y#wld4ua>8k6HydnGAgCzoO(i@f1N7d4@$je3z$#H%0A-$~}&bx7- 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�ITciMC1SV<)_(jf@z$(Bx!yz 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

    Yw;}@YvVMF%ZY2OW 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%0Ah#`j!KbTba?p(ZAi8?`wBx_EGBMxKEIfn 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

    1sB(J~%vhDYLMgb)PROn$+4&w?Y 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%0AHDJ6(Kt@JkXi6VAm*Y+Eq4J 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

    QTulS$1Mj9$r$eE4SEf^ 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 literal 0 HcmV?d00001 diff --git a/tests/resources/mountain-mask.png b/tests/resources/mountain-mask.png new file mode 100644 index 0000000000000000000000000000000000000000..408a20de483a79c5a882a580db0b71b4db3e7ccc GIT binary patch literal 9161 zcmeAS@N?(olHy`uVBq!ia0y~yUO9D3HYfGzkcp7ce4Z7cjwOnHd%^!`Mt8? ztx|+t?VyL%(9@GcP=o{)8=ws7Xl9`4>8%PGC4eT$7bv7WwtO7DCQgb3* zGILY&ih)kEGc`1_0b7G1gK#L4&Ip7~b2AHMok%k1I-T=#@{58C5|dNy453<(gpgE& z+->Dwl$i<)Qc%Ewlw*iN)!XQULKP{LAyEhx1;(KrmyJF=J=k%XPUtxWOvJl9T^vIy z7~kI7m^&v@tR*nZ&~xj-Ek`6)EO@fzVq)gj*#{-Wbv{^s`TF_lO6vn62juJj{oC_X z(V>BXk%@&vK*2#l@xy!igBAsAo4fZ+~IcLPJ? zga$?dt>_SlX&@bJ4bpI>3Iaj~3{I)tUU2&kFcdI@Ee4A?F|j$U$O%N)F2RroSK8p< zae#qis;(B)sXz(l1H5o|32<;qFf82UstR+sLIT4Mgi zBrvp`5}OM53DDDQqn;j(>Cxmpnx`S<*JwdDT6%+OgwZOCWwf3KH7rIOC!;MgaMeIk zGqkbZDbiK-!&9d9*I&Q=SyT7Z+NR;aq65Ew|GxeBV?@m?b3p}%2hqT`?EO`KiPu>F zeYgKFFE9W4{1-c>c%=_Ne`Ye&bnc1wYH;v9FrVS7)b#1FCaZ#O0>hHm;`3nq1!@Tl zS4QPW!w1&28%-aBJb!%fx7z#RzT1PZReNpcpZ{sIzyANc`o-)*KeQTe)yuzs|31I} z_~X?({>Cw}9AdKn_vbI?bMe2kIsW|m`ugqT$B$<(5o~5?Y&!7#`SaW7=i74!rm8q3 z_y9|ZUeQOEh<>jgD^G)W?0q$O=hpyOQ1px{84VXu8W~Lt-~p%6#4wr|;KP3-A~Ae; zeE$CYjpmhnjrF=8s`lQScmDbQf93xefvtyqUJw5M{rmP~Ma|Xq->W$VIJhMk9)5CF zht(i2IDZH)h)Ze0ah^uKNrFIUw~uAqw=HSGnzgivl*lLW3+r2Egwhg2UvMH iT0f4q4@P$T=pQ$`s9Cg%m6RQ5sf(wppUXO@geCyJul@-D literal 0 HcmV?d00001 diff --git a/tests/resources/mountain.jpg b/tests/resources/mountain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba7dbe43f278bb51ae019217f2138db0b443fd22 GIT binary patch literal 82351 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

    BbtPgl5NZu*n53-*j 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 z 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

    K&mD{dNxDjZ^cQvjGcLb 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

    NH!RZL++W-c`rw+`7lmzy|BJ9NHC*(OJ!^ zRzRWyv1OW)R&A*EpkK1876F0PqW{85dZ32VXQqsJ46p7kJ%ruh;p6j#qvN{>@^hubmb=AhuEn$WBjQahqdK?j+bw&<&$t?J< zDabs`BrTUx%hTnba%0 zBQ9ewraDL_KYl}3_B8uRJZ>I7PIf%%g7}^-rCXAZNZfq+x10$JoZUw60r{1@Ualy= zmWD`aq%G_gXK@j!;i|UcE0xB}H}M?bgY%BCkAsyf8VNU4+-!|s`4~^C4jy|9xobH= z<^ACE58?G*#20>rFMJ!{_z|l}#Z!7j_oOxAJlOQQP*dyr$QLs>UH>pUstu-*MUkp1})q`xX0M0&w&n8ywsWczxqEQ^&{F+aK<$45dF>s-Jv%nI!`ZcU1rpV zvNMK@G3^Uydk&fZ31gUvYit5**nq6q5MnW>VbeOpgJr-^e#nUIz#rQ{@8c~zSMmKD zj8;illWDMRui#hmahGdg7sAQG>`GUxIrx*-?%>Pe)i)!d6XDj&z*@h=^DIk;xM`rv z!t}{Hj<-A$-?lT6w*T;yR}y30#w>iNlT%CLs|Wn|pBb*8AsqPeh6h{8V-t*rwTn|r7_S2U+&de&sOR9__YfHwhtH9P-e9pD zb07Zr3fRf^u#pAWStJwuU>>q~|AQAg!gXAQnM&_JV?8(zYnRZxa2?qh>$iRmYB%2e zHJ(v$tlRyb_BMWRfGMrL3#{ z>7OZ162Ayv9R#lLuVq7c^Tr{yQJ(d;{-W zobPY(Ge8dFDy@l7b%mE~&a1Y(YEMpd307Kaq$?T8c;)BP)*uO^;6l2>E>$EhSON*R z!OZI|Y%tU**_wHQXEZDGJuYt;k*PFrty$no71$>$60{W= zJc^{xft4JA1{uV)^`r}UYw|Fga>qkC+7#}31IN3>H#`;qz=E}hGwniu>Mp!f zo7hr87`hbjw>i1)EU29-nd`8T%RZqWWX)Jl$8KwO-o4^mqx>)~VCgfoerx3f~p#yvAx} z=}Ns%A56|_Mnly%GNbEYo4V*;Ef<=)9@;OIT;XUU=y#0(*w0_=r!x*VEH9Cn|jnv11hD+;Xb(j8KJ3;57hV&x5K;C~o;`DFm1oR!%@u9orvbL!=yhaM$?b)KhuZl<@JI3MRejy`fDH7wt-!B`WV&5ThGZ>^GnEa z_izQ>$o7!wLimIo=hl8@;{( z*&YBVb_?%1JIvKYIN&5RhKTc5GDOx8mwhReC7U>jJoj+vE%xe>c!~YHim^w^12R<4 zvk%uFBHqVf-gPkV0ixM2;6TrdXIR-jH0ooa4bhbwaG=M~GmYu$*9w097##XUeov%B zUMV`}j}-&h4Q#x$MjA$(+)Kpt6a9N6`6Xv^v6sVeqW(_lHJ0U;*hrcy&5+7V7s!r% zFQ$^#p_RrH?Y~9u#*7@%BbFzRwk~II(Wk#YJX$l@G2x91VU44S1H==Wd}B*#WJE zwp3A!7iJNE*vSh1YF@=69fXaYj3o^w!c$F{&$?ctOU4>AB{72sW-vYPix@qGcskW} z5f>YInY)i>7pb%~LTF?jHOdO5#h!4HhXf}puP@d&gq2fH%0)+>_h^?j=#4kRJ+yCv zxzteDYhng=uqwQ995JT=xZT<2Kr+Fzisj9U)S1)}bXd%K;8n?NO*Y0!=Cu;tyB|{9 z)j+N%H4qxZh0YVtkXf8w3}(gcBd>iUan|&##D}o&)w%2OR1QqQ^0Y@QX6N11*#5`F zYaMjr^wIsl1N}Xd@o0vU`=3L&A@-0ql1=lBHNKy$j;&;8e2_h~xIbTc1rqfP-n<0z^A|}AA==VX%+Kf?Cktpb+<8GTM=U&TFYd4y z@wuPoc_9%FzL1zhh$8CuO$d>;vD+K_DG=4)B6gB~k=s*=J%ZxIhH!5)(3Gu2NsOl+ zq6x>|FODVFWJR$SoA2S53Wzu1W;(F)OEb??VTjuZ5#$C;6sA(kFiCL0=QgGvQ4egB zB-SHisDbzo*YR9PAm6)%*alnJg}Hdg{KXQR=tQJ%F4+f*u~;YJ)C0gMg|LhZusy5L zECb+uA0S_^$)ng#UdCN>5s^z1bbpn-tfI^XWZkg0IQDHWtJh=n!rr|w8e(Ja5Me%m zO^u*N=eNPG8{~?dr2?V?**lHkFEw<+3F2{iuquO$Z{&Vw)m3dSnk|>{2)*%({J3Ux z#W+ihb{snwR>y{28PK2ueYYBWOdf>O6juv#dceBrS_6}$f5)`^C*l=fY3+@80!;WEeEK3%Hgd4i4-d3w>A#@Smgg28{ z`Q@|w66l2!=WC*#)JEy&jPB$eY!VufCGuTbE0?#$lg-wajHHL+FQR4&xMRJslAcvL zw6&@V7x9VSFxGx9Gqg9L+M)UveT9()uKJ1~NH#f>Ttc2I*R-v$UA7gq-DYRSa?*8V z$%$RqpwHJv;|teR?$X6&uWu5W!O!Us(?IE|9@p|2Yt3xpc_~?LW#0}Lu*8*-ZY$j# z1?>{KdhfBg#bLPXWi`EpV!Y|R3q3VG?dfee-Sf)x#al^9Rtp$g$W+a3|K=#- zZWvfFxU~DDBMs3HkFAVcS$s%z3cif)W^^%BKPvBiui%Xv`_{qLHtBHR`6%S?AkpUz#3(zHM^J*;V^MOC>R?%iv8&;2aNTNnR8Ak;tg}0h+V3KDJ|x?vZiT5ifV27)H&7OG+#KBh|oiWS1h@L9!Hf z%`O>ej$kP(TI39wF#W(<8JLrMM57xJRZ0hHy^r-g!fL!gA7i^eUTwvJb`obSL`);$M@z%aAugKDvkBusW235rF*sd5Um)wa;lL2Vn zz4Un7F88J4q%ON`o+iuD(udXv*=Pl^JmfZ($9eZBC!3bnIH56K$1& z{a-r}6}9>%AIFQx2_{@bpXHB?doVS60aR|qGIp1lpHbjY2U$bY$;XVK*6}HE)9vsL zv-J7o`_9wP5GQ>_M76Ndh3olXBpbDnlrwlYCRi*Ro>u`pfpX+vM1TWdqT_pG*UGV$ z9N3uC?EX2G@6l187;ay(jMia8ZZTdWEI?uZ%A19RSbHr75YaF1KUPj`e0F5WWX1j^ zk06?(&Smzj-Ox93)o;L-UiR88Och>t?8j1~>sH;HRf~0($5dpY8aO@?-*69>aSA?E zIk1d^Kb431i@<^f;z?%5N?ZG;R>5Z)4YEDOnArGULn8jO!9kl@)qC)FX5od@0&Chh z>lZxEW6YejtN3{2a5fg?IQza`1UdNdek~8E4%cP*`;Cb6)HIZ)M;V76%xOMW z>l5aGJ)=Ar%ioxYc{%33AQi7&nEfb2Vje8%et->6%@MkSK01Q#nsYpBXX3|L{CQka zMaIH~Kk}RI>&bNcE{jLM(!XxqS8=faUFHYPT52zL?SF{6|mP(e9x)uUosGm zAOqPMH()bLk?nDu71xdX%)m?)#p1UCRXrdFt_7KSPs#brjHPac-&Y63UPMeFM`I1+ z9YoxI9$KuDS%~}ZjJ)oprZp9MX$Y|&O^75vu??CxKfa>K*^V*WZIER*Io+qg>LWlD zjbR+dbG9gEArJcZF#0zI9L6&A>oax;4!~bA*gg6xn7%ugYg4fW{dEemzqWzf^JD9z@#!GNy5-ZY;JX!2YY4E`yyp3V#nMRC5KI~#eR%>k# zQ)}2GYhU!{WdAnh|05aQKCn(B$u6~OVLS3(7Z|xhj9?isUm6&dT;S6Jtii$PyLDXm zA()xZV5^U;Z-qRQAlQ){FdKQ`5Uf4ub7L2pv98B}%%);{m-3iPMn!Ans1)lVH`XIN z(kPIN=fz7B&}U!qGJSr2q!Loziy7U96nU^KX+Zsjv9WK-16qrX*v^XH3TwQdIXwgS zcaIzz8{S%FxPt*$orCz6m#CLM3kP|hteeePqv`l{_2IC7!n_}ap_+)58;XPvqC$5z zc~?uA`Oh4s9NuR)GJEF1&_&a+e-~WcB#ya(I_$aRnbtre(uvRUgg?P~F2uj>&1%Tb zo%zfq>=9LvUaX-Y&>q;I|Af~Zx14x^YHkxWIvlN35~=u(Y*-!Lck$eW4P1cFZB1C976W+z*f@Vc z=l$i_^dv0nMd6ZBiG9{Gn7f1wtl#{K87?z*6s|^126EPA$n{>q(wdw0Xdo${tqF$m{%KjuY;iPr;X0 z$tV25j)j5DeKqkOSpmC*;&2khg<>M!wpmK7!@6&P#2> z{%bXbKYCBWX&CHQbV%r_R})X^Yw4Vvku1hDc=*4KPOPrlLSH&Yb<*up1-+#B(>QMy z6-sf9(J+~t(3FMI5%-O;d^*7Np{HkH`*It5;E#HP6h7#4jKan#&1-ho6go2O)E6=5 zOZ8B5Je8UW?4so~moe{&#y+~`782t0WZ|ziRH$v7GeZsC?5sZ)_GmYRuX=Vf0nIbZ zm_mKiO!i0WueTO5>+kTx(ioY9wjARjGE-2E7ltyw#jKhh^+&vxh?&He1VF#>eEwKolMTc;inQu?7a0)a-ZBf7~WTGx$BMhcf zY5~u(6s{{=+79P6K&meGA`bL|Dy8~(3zMV>_@=Z{MzM~Z8>V0!JE_fOZ{d4X#_XbB z#2K-G`u9xNTM%IGX%j2IMVRwwB(hZI! zlARC-yLFiJUxk~m019sf_O5~EDMbc`PX1X_@evHj0g!cV@>)Cb&P#Y(k*wEI?BTGS zSIZcaQ9>T@`fwQ9P_YHP&K|UQTCpyFEd;#`64S7{`ZBV)*_Uq!y6+Ktdwypxhpbke ziqMKRk)QRpn)vB-{?iUyf1Hes(x!(_-KoW6<~a~qCcz8#%M9C_OXvc^Pon$GYj#g8 zD}FbF(4E1;K<1*qSP0-8G$C>WnvEA?vI;-O*=&vAp zb2+#$j8z^-T&4`V)G*Qsq1Y%pjKyd384^^KjOiP~8RmZj5sJ&?#^gh<{6ahFNY`kx zROb_kbD53V?f5KvYxV|rR3QG?nm!=!$&S*H!zE-3G!sU$>n*#jppV|Muia8?+eG3{ zcNo)a=4`y$f8mo-F@g!=ak}+n5)XqIbg`ANf$^;dZ&efd`iMPqu}@7w;vQ45ibKpA z;v}QHc*qz1}yOGQW(q;x-Pp{7}1?8nM@W$vMa_cozBxcdn9+|WB}%$k|Eh~O3EoOO(&aQJhLMSNl@Gu9USC9wNrd3Jxv!tpEBUvG#u(GlX0qlNfx`ZCvBO>>ksM+1!tJzr*S(LM6p^kT--k+Cy#M;k?*O}STH8Z&UHGb<$tbaAMR}oNdPU1lWv2y={y}f1| zJkDTj<8FB92C!v`V5~G?^5S^5jj?b8!5XLG8`Hyg4a7rT&#Xj(ga@-qPhv@Dfrhh^ zml}>Oo{iVE6dV`{&dbfHj--k)6svBrg4TQN2hUa4!a`1`+s;b0w8aKbMsN724GIIx+3;5X!YFTnH+O+cJ5n!_nq#L$ z!;bRDaXawt7a02u=&i@B>NFt3AFQ|w=%$Ncj>beSdxE1!G3pC=rxbq8Q&`Ll%>O5< z91G!V#b2<*Ro)Y|a4nH6o z&v6O<`cPPsK~(q5!mGGO9JxE}YXY(GPuSTXppdG3-r6O(9y)LZGQAxv=dyMH#ezZQ#|F%;r3#WCc=DkF_uW?jsK##s)a(j@;E`@}QqF)3>N>^0DTI zq0>4O6+XgjNN#XpD0b(H`g4T!d}lP#(`Kv<%j56Nn3coF3dQ3n#j)z6 zi(BFO4#r+v@zrshZ3yGBj57{r&HRfeRfDs%!S5(Q1Rxx35+Gb;-JD~-tzEJ$E^Zi7 zupLdh4SRVM&+Y{OjYk^en3=a|-$?wmNaSv^-=iDA==VlWz38D!tdEs^zX5194DT}z zcK$iB%$<0!dq8wc(eiWnxd$!rp6a+{L%^Smzy_4SZ|Q-=%;n72vE$!i9SqL+4F)O^ zdmRSWD8TB;z%w)YusnCs3~iT&F-(uQDIudW(tio0yaSE442c=T8r#fWS-#X7JpYZz z&I;~vG}6@{{o4-tn!#FIij-~T%GZFi5AwMcygI`@pTdv7itK*Djy$pOJXS9QY)}@) zyd~q`nAw;@bbAJ#=?UayD{_61nvKKA+$s>_bpHr7=4uO4z2xTl{*eD+ayQ}lgu#q| zR<1vSM+W4$IXchskOv|oYdPL+uz-YQmBgOsgkh*a$PmpJ|de(vE~qtIkl*RB4n z&uK_n9lrUO8F-2ejAu=EV+B@cMnkFovb>H|Shm#I=xpeWlJIRs&{|FKQfDxCC%6Iy zrn!=TbcTSD_wd}n2+c+QhY;^7kJh$W#mV>$5!n61Fr&4N^oDGFCPoy;^O}B^{rHaR z+u$vuh|=67dXcE7fW`k0HuW@KPaM`o#6H#K>V}~07IE$w%=B2KZxYu$87Xdw7B7Je zCgSZR!i{XFJJ>=ZUbB$D1yq|1CIY^icjv*+o`G|VCw8VGj~TFzmfw03Pg@1`6l7*P zva-sen@X^5s<7_rp_PlUdJJUKi)2{iei`jF9_Fn#ay$}=+X=sH$&SE0=i!_6;69eZ zQoKcPgZ1DPhQJ+77k3h6z6mdJiHP=Y`2FR?nit_k3?ZLp5H@5kOhq9qmJ_bxCHgIf zu{;1faS1tF!mE8`V?02USru-%IC4vH{Q&r>HN@m!&~4$b_?djGU?SRO{2ihS6Fm>W z>yV^xL=sNosVpX*I)V(50%$RIP#}i7iy7OG=9+-!Sc$ZqKw=JX#;fSJSTt!emE;oo z4k$-1##baY7MvM_PJPI$7hKapwBAT`=mciGIr3Kt>=6i(yUALc1t-=Fi7Eht5KZK6 z1KhS%_fv_g)7oS=RKP-o8a9KL>iRqKzE1IcLgaA1K8DVM?e(^LEixRs=q;%O>Ztc1 zidTZ3Vx`I4YEAdV$>c_y=JU^CzS$F+PKX|ASYMOFS%D}}B%Kc$a-R0sziwE=d2l3A zNW?lSpQ6!A$3QRpK`y(vt~JybBil!kYLF`yR?wltTjQ zV3jOsXo9t93RW$R6>%aF_tCRatk@x}oib>ZlUXWZ*Sg+Jj9i%uKh(icG?K z9Dva{#+DtDVs;!^uBvPlT>Jzen)b6d0|U z9CHyfzYdM`6h2&s!?5C<;ZhzlZAubrEGN|>!(ph@5so1f48=1shEMJ%Iys*!S7a=W! z$PXKZuI-8aN((<6fnB@K=-p$Uw=uRC8C9zubtv|{FFz;nb25l@FtX8z8O+A~=R{g^ z!%byFu7Z#TCwVtIb}SI<6AGVJ9p5h#k8nPh795+4T#t0vxAY)cD<{U1xSYJ375}9y ztG*UCuNao43g4^=Z`g?SUkF>20YC8vT)c;;4ZD+!#9ES?mUE{^{(MF#=Wy~$=Rcp2 z$7JJ=5zHCh@t2i<_y+xQ2qyn7n&vgK9|tbCdZs?+^+VoI;BOnpGdYrpr3&T_+(hLB zt}YXQ6~rzF@;j8Lb-!t0f{VcEcf(Hh!I$laos7b+MI*glw9_YSQ!rYG9m~N`1<=sx zS*dlfRaVwz1@uQwkU%h)KR4LrFB1M0>HUM0f91OxcHShPrZBoDEuYH;0<8+h%*QdT zSM`{+Zp`6I9y_rn7yXE61jwl})}SVK)atidg3kwmf>QBF$5SU>b{*8Y9OSkQ&9aSE zv=27*43EpKslEJtkiSo{nogrx_wre*$LS$_`4i}(J*>Pl{Pzy43^tLYCGdC;|NMii zc5sF?+_9w*b7Pe)TW-bvn}d3K@$5~UcnRohE$eXuSAB-(Zgl1Z)@e_Wbpf7LJbWslZYRl(pq3^1K zHM;sWUrw}7O6JVVEc=j*K<3cWgaPm`FR@M0ehc)9Y#>Vmra(d?kkquye+aXmk>A;o z#>(i#ajb(0=&fbworU~dffifND4hkx9%GD_q0M$NN*9rarFd{tu*c)jzhn755O1^r zzFb+PJsooEFu!vxCy8KB#eyAnxJnRZDbK4KAfeQtVh3Ju0DR?7qG^x7MX#`pu`skx{I5>q`<=zld;pX770>w% z#}bIrJV5gt0YfDS!9*7;!Y@|gxPc&Q%g$aw=bm8x$NF{9WMtTiO6B2E1gUYu8XNeW zFS-7$u#4;PGpx=MNg(aa{1jxS6+a$?t~kiKc7bAFbC*R~=h?u*HMpMxAiZZiU*cUq_4^V(@QbZ33t5TF z)gSI}R#=Qz(uwuAnE$^4n^>Pu z;I~3vV;087>d;V?qgG{v6#Vtia4web?gfd)f`X1S!lO9WAbj`!9H}k8Eg$(`bW%0^ z;0es>YQ}Uiuj}H2Ol3tc^m}LXz)zQuljm4nYyawwAl5Pb?1*1g3T-e9J2V-Y?2IOx z123=!#09qoE?bF|9_HT9`#qc9Xa_5nS(Dkyij@k(Bh!grMKb;l^6MYNq~yfIPwPic zv{%RLuEo_%8E95dYSx5xT5 z;#Fp8Co|g#Yt$A^(g%Au1vTEJ@yYu`wg-B-@JOls{9PriD&IbApui4TP30ZVXUz?Nc0$d z^R7r^9iEnU8s@)?XtdXLBw1pW)r83y#Mv$HavN*r3h~s9yn@MRy!LVCkw`*4)^7r+ z?KFPjL5?vQ8`uD=9f{5SP0q>_kl;otDTb40S&Qt#UNB`_!T4W|aB`v}(cvvXfitj0 z_t9AwKyUHj_@7+GLymcs_5T{na~nIg$ge@WvySScgR6iv!qCquy7Lbj`vqq@3f5do z=FDuO`(t^GK!;A^%%kvq2IH9?!p{FT!qB;;Se?D$CDw3`XwG_t^I3e?Z)}*AN%9RX za1U?7vWYv0`YvMrhcIT%u_zU=3kLSX3&wa0YB1__ks6TTDssim&h*iTX=&`LB|tHJ5I$tH_a^ho3u}Ui$y(y{Q^# zM;`w^eZRgAPGqmXTR%rt`X#Caevtz!8X;uU<}v~~s?{6+14oO+XZ}qsfs5)dhw&T# z*Ybp)!KobOagC~kr}WVONS>>WDup0=2L$tN9UnQ69ABBgveBU4qcpSs=cc$XaEb#xm5$|XPc^VtY^w>+z27Ack&%TBUiQot|+4Ha) z{r9I+ORz;cK)1*v#878Qvx%n8lBSVO*-^4`wk@timadZVzYULOJQ+!Ykj~0v2Gu2w zItor^96y(EcB>28MXC8_g~e zt&!eRNNzc5P6`tdXhlAGbFz;*l3zWX-)+hB>xBeNV>PTs2G+u%Ehal)BsrJs;B)(+ z$Cj~Tmhks%YSgCkxv}WAg?w%{?~U}oH<-T$`H$I)Bev&TlfjS+$=b#{kAl5g1eVyx z=syQ5SiStR5@D%FhphJC$#UTIe7sYMT*6i`o6A|1(e!%#NFKBd|L~IvBNzD*nP4`H zkPVR&cC&=kmQ^=TS}&a?&pC!39%rRkIvFQRy5ym1$S1jEMM{)@^L)iSisY3HDUIxs z?Q$CW*%shcfNYZu|Nj!G>%AvEKx3SiPV$K5cyH(rnj|^pP`M!0vUTP5&eaJ zF7jZxGk?{Si*TGs*(*KcJG02|XpI&~Pu0tFSebaZ*JD&p&JlaU!&$j%EnwTm!uKvC zXJa=E+%f8E&cWY4riMw7GNS#$$?K4%E7UQq;RyZVd0WHz{=rU81MO5~?MqaQ?qL2$ z`Mt`zuoLx|^-|1mTCBbSCb$Q$_85Qd3$yPf%4y}z=HU~$U@>x$Em)b?MVNaJd_z1L zV*6ps2f>+EHZrmg%V&7ljntcs!antcZ*4|ZTW|W5H()=9b}+J&$TOa+uhG}T-bZ7p z_Uen_ZRb&^){{L2s_CQQZQJPu*a0Gpo;C$})Z?3jv3JX;$ep3@g7IHVZ|YNY=eF!o zIJU^DUM@)nY)3HD9B|T9x*EQO88qSZr2pr3s)D(!zJWz})Z?|~d*>jwlm;L4FL&|> zulhBb;}dz2nn8UamdfgzI}&gBG68z|l8q=# zDp4n%_yR0rd6+Btyp_-RA1i(;$apWl$Ubz*L3q0d;E!l@%5D4<2NGR`nQD*p&SCB@ zQ*m^b{Tpr~1>gC7k=fh}KR2DnC@e!K% z-hO~DY1Q}!kf|@=Pi6u?HGtb|1FP4I^I6DhFjWc7uwFf|S+n5iHu)Lzs5zhNyCHDu{c&lECkDC!>4e7 z{*wJnXe``I6x_oC@Ou-Grqeu+Rv(XDsY&nR^k5Fz_)a}{45;TC@twP1o8!EC!Hz*P z41Fo&tu;1eCJ5^kxb;2S>X%`MD@zaCkshusJ<;k2BsVR1H$PTQKwjgq3fDnvJFz)a zur5QeGL6Wfu4B|7qEMG?lM+T5|FafVq?v7nkoevG#UIky<$`$inr;<}O2|mgVa7~ffe!u5A8#^`uRNaPaX^7`*#gVN!SNQfbba@mU+ahLj9+A^NFs)YXv;%(8 zK$ykJ*xpt659c}aOKe*L9%gE!B^91_ZGV)sI<|8VXFQ5$7L6R=hmU#33i^QmcN*-o z6011~U$_s9hqVWd(B=i;5rz=~OQ8bi@&-FZ&tDn?`bR-)ys%J1D+#*JKK z4EFLl-@VVPqm0odtkDgw=p#1i0wc5#ZetS18qQHhaJ)VoWfb?+h5H%7(HCGZ*K?m% z=Jp2A#92oEHTF1>(fo{kyNyM*DqZN$!#F?UKPg}ngYc#^aLoqZzLi&>pZhKVzNm>8 zod*V~4M?C3epDkEf*!1?X^i}0zs{I~KV!X`jQz7Buj84W4t%x>D8+`?YE{&2Wd!DM zm4moSi&M;l1m)sUk-xjKw*EtdjpZJuFdFl?3yTXMh>zO|)Hn@HFdC_`xW2Q@i{-ak zG9i+G@`#a&VO)Ok_{d7m!kkxT?o05jfrXw3im_Od6R@_g@UO0-9WF3$zhEXl;^}`t zKl+ILh2n2H#cwb+Dzo{TS$zVkf5vZ*|C4ceVn2DlLyuWqcw;!Cl}QoB>r*f5FVivv(VC?|6s}8Mb4dwZ&;3e?M}owCZYq^f!mK#*R_>w|5e!B>0tax#6Kou zg*&6GGr%(bgDx$}RRwSz)*~(YKR@r)fHfR|zcCX{z6C3N9SwehSZW-e#%nN%6+JtL zK3~X@2XM4LAer1SS*o8eJID1LVtgmD;yNSq4e_-tY?y)HR+P9XYp)dYVsTCl$w{%| z@~gQ22k>oQ;Mpurv@yBst%>xEB68CegjAhJ5w5fZcB2d&TzNRN#=KX7*LkRf4Cda; z5yeY^HA{;P%ZHC$9qnJwA7Qq3Eoz8$vOb%R&lYCd*)K;}pgHT)7Q>`-U#$BAUGvEKET&FV>w7dqm_mvhMd{voCP`x2#Z0 zqGdEkMeuzQ)?YgCeI}&A%G9vqQTf2DCs-fT(H+(r%0WEv1Kz_1aLqRSmW}xPld%D7 ziSt?=B0htPtd7kkSwnUF`D&|KLsyWt6T}s+!lBM zu?U6G`BtAx%L7`@IZp7u@1QLatQE=qwB}x|9u;#~;nwkDxWe0v(HS)O46d>@=MEu8 z^_i=@$1!)nHO$0M>&CIGV?pb{Ikd)lwTCzAgpW1>-)u7Xvk!hp0ozzr2UYR*I->zr z;WZ9JfAmN5P4mAR>F0ZM5g*FPSVWjUu;3XusZFp`8;FOm#~?#}AQF$BM%8&Rm{JgdS| zTG6mDB2+1{;@R;%teLg;`D%}cG8|1dmr*#3%{$F_pFlQlpr?MYt|hEk9{60V@2M4~ z%Fjy4>|Z-pk6H(j%8*9r2QXBX8|77)r8^QyS^JI zhP!K_Kyi16q9wQ$D{jTzix-C?#fleqmzLu0?jc#dzW;mkKl_A)WaZv-=FEKa&3EQJ zy6LYA}l5Gi#AlBqUb`6mduvZ!BRADhKP%}D zb^cx0^)ZmxZ!i&SGx&x5=nC$F%-F#~CY*(8T{cuHb$I82*zF#$RvMYB9a}3$L@`Eu z4CB`hZ&Q$wx1wLY#u#r0FZ@cBPGMzK=QHE6Y6qHwJiJ$9tlrQA&1L)~bmUd=>P83r zbBzC2>KLge2bNO=4Bim_vjdT(1yROAOufrY7~Sv}VQak^wObdr(1%=$Xc{NLi99%lS&beKMu z;Ro;H+n>TR+{BL@C&D~u^(y2YnXzIcIyPVhd=K`D!IJ#g;W;qyZpL^t=&)Oc7H1M; zJ`KM&8H{9jmfoPg4t#HqWu(AZw&Z(V5Y%!kX9l*jmN}e*U!K6Tn&IDilS{V2j)ua- z_Xq8^W^TLj`U%+ojSS}BU^-qg|At?A!rk3vK8&*&Zu8fp@HFf3eusHZD%dNA`e1R^ z-bhyPMts9lI1U%{T%OVI1U?uB`k2UgPA8_fB{sXU026rOH9p`qmU4pm-NoF@!;?%0 z84M;*7=kx4dVm*Z1(twe%E!<3_)Swry(>P((11?m6KCURPQwtq1V4Oc%^P*n`(O~` zaU5oS0a4wkUDaUD>*HC=f<^+&$SFo-HDfxGQ5^$59s-Zpjx}1Fabdp&<5!Is(~+1m zi4huz?;b}?IEiZBs;#Q1x2j-(XzikG8 zZ2a#>Uek$rs=)fOpnh;tfqqH-t9@5$ay zvUBPWlw=*yl_kMcSm>woJvy@#dRR=QC(s;i8GOYy_>FzA=|+~<5(F_7hIBPt<|QKP zbNGh$WUL(YhCefhU%*^mCVw<)<^S>TDI)An9y7V_!CcdHzP6z@y8|!dW^8i7+SF$3 zCV}RS45cSyVx0Q963e>B%81UW@@B)TB8X&(JUByw^4$N?U55$6&z zxW+6QnTnx*D1)kkhYgZ zSDiI8mWbYuRa1(!l#7weh5bLrSG~_z$NNA66YwTuvB=UH{8An4J{w3b3!c6V7Cnmi zV<=YUqej}mnm-F7e#r{DjrV#6J~Eik%sh%Q=4J3(_4%sBN-at3j$)?~yIJrN_xLm; zzWxfb?8{0q&QQ$-LbCD*=~-c{s$V{$nivfIH|xy}dpjC^17Np};GBDJ0 zJcBVVd&r$1@L5WRGB7vxTZxePznHCL?f;uNxWFlkKdcHO!Tv zeW(LhSe9`%cu+%O_=vTej<0zK-(=#q`T1*kyk1?#sWY6xSdjlbQ1xHD!zSMM9&>z) zd%TG6_wh+acZ{h#uNSj4f`9Xa0g9m05y2O)Vb;HbtCvwVSx!~354FOUR9l+izn0?H zuJQTj@NEaFH=g3_8adE?(1{H0&YF?=*TX+{A!_v_E-m0H_A?5`Ng!8bj#Myc99S?F6nG!( zaWW%ge*{W-NW^+U+}OvAKfnr9vUQ`|TPeIl7S>sAa#G`*@^pS*7(7vl6&MZYY1Cwm zv_Rt(PB_MA;GP|zpWk?=^Q_4eu$rrgh+AQ!_JEiFAXC4?PkX?i+dwooh+HSZ6Gy4* z-^=*-8eGCf{&Iw9_KJr@Bu(cttRQBEPl_UMkK)=)=4ZV6CZF&ptKQHR)q!6r0uuSZ zlFi_8cC#i{;Zvu8Kj*QEC-c)%*5G<<>=;(Ig1;`}Z%aT2Yq6fw%(0=jxj|IF%QOCD zCPwfzm^hXby+8!`(TnGQ4$3@89oguM@gFmK6|0g_6c{!|yJUFlROa>>k>DWFVj(%! z4sx#H)Z)ewMSkP4g}+>Z;r($Ciyc*%EQ;)iGkRWh*vh&U7RvoRKCC?9|28fRe< zzj3vO9>6$%U>(&-Ne{gQ=;DZ!}hVaj;!oa7blrIXWZfD#<%G#UuQJ zm!5*x?#)k~GVo0={6kG1h9a*uJV^^MOgH{I7>r~f8YAQC%PW866Ac#5*!|EMPt~9A zL$QZn__qsdV>&CuI8&-0f9=9m87HN;OkYl5GvjZZXkqn~)@ z_x#;JTy^;LQarOL{!c>_nVnT=RAvkEWn_-VIW~rRLnIa$UG%bHhsNH5HyIU6W5?IO z%+vkhD;~k7BAo1A( z6~c7zyrIKh37_l`s_hD4SD_~28r5L+dHsCq#lRKxIvVl%2;*rXbqjZFgOX1)4 z;O^RB1cULSKLD7)P$C$Qc>LJ+WMXZomo%k1QV?8|kMA}4T@P}z1{tcs64Y4?b(@&M zdm5cTwr6C!efa!Nj6f4?r&#x<_{9t zwqj4W@O$Tor0=oU2h4vYyora|h~#zYWTNM=y5-=Iam2oESfZgdNW>c^!t`k9L_Fm1 z5}ABD5$y~Sa09H^dOYMNu)MLe;vo7P!$&H*!3O<=@0o-B9tAnv%$RHAG(MvP%}7SK zDi0$Etc(vacDv=lKFVW1KVT)LuqT7n$pYGn=gLmvp9kaBS93R4xGzJ6zk=`ExI+Wg zZD6H5#KWy;t=z-U8Ti=;HZd4V84FFrPE$cp#x9;%#^xoybTdA7BzIT?Jk}78*&6@Z z0N+`Ye5ESR$GsR(Al*2-XAM(5Nd;?+~4 zqtT0mUiReM!|*@#xaVTrhjC7l4Yh#A^=0QCYmuw9VCMSb4SO?-%ZYM3SuxA769dgp z=C{pwMio}2(cRZj+AbuE8$p~f7&b#8zd2(R4E*qv*-XUuR%bka#je&9ea~Yl?1v`0 zDj6IRT_Uio$Hddq8J4y?<2k3WqrbS~Ke5)MAPYki`j)8s53hd7Ya@uoHsW#~P=--u z?7+%vLj}JbKeZskD8${zapw=H2`uI=jQv85n9JfBezP#wREG#tgU64|dt2_fbB3QD zO(gi8vAPQ;5gE%HeD016mE=KI%R%Z3yBNbE`0^ilzuJtUvF>82U0OifH^GqWiH*N8 z|Fc1hLy3tgc-UqjwrY6WD&W2H%x(?p!$!v69?YG>^M1o3cM)YrG5a%NRwsZnXEClb z$k7as-46d-9t$Xs1tee#S;MJhe5Z-#ok4hI(0pn1g1v!~>!fypuPf|Qx<NEF)z~2wjc)4!)l#E=x`MCmROFXZ zabJg4Y(1Il2CC>sw8Omfd+Lyy7C|LFA4;(wdDmg&zDBmW5*#{~+<6KJWKKpujsfsu zbKu36laY?4!Z{B#vWdUW;QLDIo_~_reqfCj$cQuxv8vn@gZF$3Ez<5?@Q-JwKgWA8w2R5HdnZ}o_#Mo!iP&o&P$ zJH>kWV2Wk66vBdvWccF({I4XwEy8T@I zu@W!e6?j@>y~XhAg0L^0sf>5PuXm&tZfFskQ&*`7n)P6p$taKW;yI0HW`mO{LA)r& zCl}ACoAe;-oPz>w7nPpF?0nfrC1@8FAA=Da#FgeTzu>xzlgv_BvkIQ`2EL{*YPo3Y z5AX1T8&FLx$?$~R;oXhSZU^v+e}fj^@RbTuG}r@y%Jv8T7oaL}7c99S=3^<(9>lDy zz>^v~7hm$%0KCCxc9w*BRV;aF0{LQr49$m{vCkw(_2CKG$7iydbP%M*|08*pljjry zYZ&ZUS3GwY5Jv}ihgsmq`S{EK<3%IiNC6>sg8M0zQFZ@-rgRH-F@Q=$6>K&M3kz{R z@pJ7zIuf72s-K`x{J@znG1T*mP!p*|tzslKk+s~#UGC0F9kUdyZyWq)57v*d!i@d8 ze}lB|;d4KLKkRrWH(xoi5955eYWRZ&M8BC>*))95aqQ_T-s=Bqi|hDNmF zyAPkT4SzP9+M%)2e+)L2f_?P>KN|a}ClG6QV2!(Y)&VT#J{I&3uUg61V&d#@cx$6S zRaHK@6!;?tGg**$6A2sK0$U$~znn(Y{tKIXg{`aXE4N~mnXxPbbtJ=>IN?N9tWPk1 z!je<@j9Xmo0&M#ith@v`AQlG4;AvEF&3kb6Q6kcN;?6BH<$YuzzY|qw5x3Tn?H%EF zmxzjYiB0AV>}FKq(s`x9H$34lyU9wn;@vkB=f*LUO^HlK4r*}G<*|rzphZLb@*Td; zQ2loRPj=_g7GF1%JfJ@r!9?Q33VhnneDx(W7=%>};V}^3XG9SrSDJ|LoW@nnC94?9 z`?Si4hmG)-Be0w4WXChP`XeBNBgEIgvHoiyzfWB27jR}gxHumebb7nIE3@-ylc@aD}J`C-iDV4}d}44gO%YuLnyF5>%QV&^P= zKQ&{v2V^iieXsz7{V{s~oxw)FQl0+Hj=CVTaXi0N}ie)|u&Xd*K|1T5Nv*S6-- zj@Z);%>N_TSedIV&a9Q^S`vw_cF=;({rKqGVIX^hQiax`(#(*5@b)k$^dxyuH zr}3#~(-?Bx2JFl`BG@c>g@^Q?xf-5L*7A_r)_BgXcM0e4Xamrh$trAO;9EjD~d@5=pr;%x1c^dHO4`H&)gecL0v|CJ07+t)?b*th;%*@{zaQtmioghly`fDmBNqkeD~RD zd=S;_EKUl@#Qi>FMTpGK2t4I+@WV^q%fXr{4YxNGjc-v-wrC?P6wagEJB8xz2=7rv zILcom%$>20{^5ssl^aC5L0TjyOx;xvs%JR!@g1! zYFchsf)>q^%j&SMwj32Csu|1ZB=i=Y*$q0SH{@NmtGCt6T6uJB{ZOpcW@qv5ny8)B z1L0zvSu>3-xMMlBtEi`O#7ECfS2sspTNcZYW?T3Rr|MjnhssmsTXG|HgVqDx(q`D^ zI(lVoz50oB9}@5E+}QD|L=OK zqa0A$>PF?dK=`h@vw$(Y2(!U@@!62%f%U1*VNp4 zMbk{7oGqKPqwA1+V#JBaicw7?m$)xES37Fj&sp!AkLtliB0eEIy&q7H2$U%K5sMmeQfwHy9Qp<*T01JLcOb=Q2$j+(7XAuR)osJ zT~rATc~l_&8cgLLmNazfvq7mfK@^`suO765cJM_9l;Q`$p9SH( zRuBhMdABC`=b8BSB~%+%G?J*67=90nI+@B)PrmAN$1S<%VQ4arp=U@0 z_tYl3Z6VGSB)arw9#-Os2IKXc6X|29wI0Lw%_8;{1F1xyi**)dt_@2CeCsF<@Ud?7!GjPaU^0+*B%^O_tcxKNXJ^;oZ1HMn8BGsO~BVD+& zsi3LTysHNuu_xpDC$$5kd+u;D#+yW@0Chm4!@@g|$u^?MJ~#qnxA;qN#|tvEv&4zT zL>Z&6?Dvd8C8AIjqG}zY*fK`<5YIC@XNF83Sc~h}-(2E~!En_FPyN92jotavxO=15 zX=_HH4tP8n_T~%O<88Q>d*J-58P(X=8482N@Qf2d2tN@kYQm8l=cJ5;kAFbFv>zDF z`CQ|FSoa}N@LhNq9d6lBU^T*umY6paBX*-h9gF^`4kPt9c2*z0q&lCO1h3YVn7Iuc z|Iy^aPAX6vAHa@_^(dy#(y1VV`cOeCNA-oO?B*E5j*US=r;L8wxr8X;H9I~Q6a9LU zVb&)~W(UWY$zZ7KqL?1UyX>Ur#(p$gw^7|5M)TE+$B#U>E^(&{(Xu-KYeG%CBEPA} zr=4cgH-%Ke!s!Jc@JCOGc5Aq*y7UM)wCVp* zX+KYfu!9~SPpM`Zl`ymL4c+f!K7SkfvxR)EVKh$Ar}Pc=vZqwd&Y>+^LyplJ?x{LR zQZRo8GwcSR{0U3G9UIt>&2MLv4}ofS^84{%o{2pA@n{VCD9St(06WBhS#$AIUXW%S zp5_~@nNgcE5aJZF*HK`=#;oM(8MUPzpvGnVZ7Jw(Dn85Llvhx*|C3yACur_674D1J z^8Xo>on+GMc*S&{Js#B9hqX`#kCPWw(QP>EVJyR}XQTT}eb|D**x?GS{W@#J#3*KGEUPi64axRuGwa>R{S3>h%*>a; zPO@g`cSL;NP1e^*{PRaV^=nZ3E6|BiH95$ruL6C}0MX6iUn8$D7@I|mdI$Vb8&+UZ za^de7bpzkFB6}FbI$ln`dzN=J7`^}az7zg!2wIq8)N6CVOJoH-X2VaUf#Pq2^y%(K zE;N*pH8h?^eq`tt>N8_T=Y134YE zJ11pMQ~u^`(Ds~0dI4m0o^yw9tI=8>@X;7Lw0sY~>VqOJiC4cx`}{B3|N8vxjXG2P zNsUzfilzwa2W7i5Uzw;(;Ec$f%2h>DR3)ogh0}KXYEk6A+c;&glu+F=(t5!5)^2s) zbC!0_xA(Iw4BNG~$c4^GwWL8}QE_kRM(C^9TWTqPlK05nF(4m2gktjwR93$@Dw-+eMwN zJdoCkj{-yd^SvqlHz8FSscq4lsDG-3^quDaYyo#f)YwexlVUUPk9S9O3HKCRg$Ah& zEF~RztX)i;PbqIvdz*3zb*()tr|@$g6ZSw_&bxsAH9u z;XKwwuFEmM#UIErCYv{LxaW(u%$wwIu4J+Gad&qlg;z;`2kweF^-)5yE!FP*WVM`PC)`*!PdJyPxzJQP?HYOXHQ$Cz||y;@Of5F8R* zE|t{U2%T-`?SAJY_p^wlaT5~SB=nEEVlE$i<=ZFyYkll_;Jl_!@hho+d;eC3SdX|C zyQ?`0T83*)#btpGfmfl!>K-~5HqqzFy8`#pr~3wp)xzbirEHHa4~6`eHjWRGJL6|1 zO^^Lc_$wfPYZ5wZEg6+J(qq{WX#4GE+7D7yOLf;7S0P7db8F>YaEAXtK$afr$57Zl z(=tm-eUHD*^j(%3neJM>mXhY1;g6=;_CZlq5?o0qqkEXndUvJ%8fs=wi1kLj5IXuB ze~n1nC2z9ri8xE^?K-AbVhP_n@44VD?W0iL`qXq)zUc4hP4RgG^JPx36YQ4#dLenT zx<~lU^EmNRa>-09ZT*9vzby>)vaXG>#tygT2(J6`)0e!VdX|TtU6Fa5zv#WiF1~sG zWT~d!TIgs!9~C!!P5bri;Y-$+(d&{PX4#%F%f3bI;{6(G>R6DeReU8^M5yuSwx3@Gc3Im+6^h#K zD5<9g4pWRd7wo7H;%uGfT68GZ7wPXCnyb*~$`WU5Ywu~ZJL*LI823ZcjLfs5cIpp& zMZCSuzr}4zycoGu_I=3pF_8Yn^gNvmoL>+aUF`zk+v*cT8}o@*8^D-g2bBlDBtY zk^CgwpZ?ta;VX&>4;)P+`zPE?zL20gkA&)fot!qwlooq8;kJ80$o1ji`=7jrO}pJ= z-2JUbwf3RLfmwlEqN>c-x~UhW<-r+2e<-{1P8)&3!9zrsZTH-h<0dElle{)|t8mFz z;F}g2?D{VLT{Lm?>&$m6zV1|(I$WO1w#MOpQbe$5@Lb5E{HTAgZIQ*`7=LQuv}jhZ zfuw#0HL9 z+yBZmG1E@Vc<=TPCBJ+UhCzX>vDk=Kruv32~?7<> zEw7Aqx96w$;n_!IdmH!3yqEm=Egyfnl?$QTp1$~G)%zH@tMf2t!?&z>GTF2*AC z^LG2}{n|YgsZRlW==vCKro1q4#9vyRqLvFEQwxikLtjHrl(3eYoFg?HV>a6_xs~`g zne!(4oD;>qX^le*tj?H+Q5(z`eSN-&sUJeiw6@fR4upH_HRQ4Wk=}oUE46~=D*9kC zT+2T_^_TSXfs#@q zwOY7?IS}3~&hp+*-xJKQJr5^pDbj-AwNSLOQjawkwq~)dcE0nBj^CQlJNA%cky2M& zp*<1CIcHe+%Uc62(*I1~5h&-ELupza@}TBo_OzAh_Taxt0h6lk;H>5cp@s58ZHmcj zd+6-rITbxWQA~Ui+t>a;J*kF;;jZ=(MeIBE>(bI-_0XKqz|bwNi?GTv$P_E)^~U<| z1;?t+aDqk-%&A2$)fr*ka?NFr?w@!*YkK18==qlBN_nl0d6rFe&av(Z4^_?t@&r-> zwveKo0+=SQmviYOmFiaxtk9=fo~m zduT0`D`L)2QYfpKTg)2T99$GyAyrfAsJ%7LTok%FCPl7`c^FeMc3pJY$ZhU#_JJ0& z(9l#BRq`w?sN9#=agJ|CXx{>y#~vg98X6M(J6J$$EBlp~N}94-S*-k^Wisow&90a3 z4eloH=dNt->aJ_{8rHHxNmEuhicRFEh4rPJMcROUl$W(hFzUJW3fe5CEN67jmUF3B zwd{Oa9x&Bn{gNq@<+Qb^eX6~u{ibc6^`hmPC7-3RunH_YmV712bf3I(fZmUMZ8>^@ z74-biuAk>zuZ`*kbuMhmX{8nCUmsSt=(X`KRoTIM(IQ*QTL)M#TRpaiR^8IpQeK#g zwr2WV=@&WK?M7XeCT3ey!Qv0d`dpv*F!Q^D8Rv5j;sPX2RYYNAO z?v`a1zi^TL^wD%HKSB1>8T9=gB>b41;}1GJcY-m^5l+>r!O>jSIFpe4a3ML?5IVXS z0sk923=*gSeWca>z(VaOLCj=DMSD@IGw4?gz z@K#d}s)`=EbRR`g`A*MD-6b|W1D&P-LjiJuJE&n=$NN;#4}(94k*k~q13%EFXalLz z&B$Os(z!~bZ_hc9`&=@sET)6#z>ZMQNMuy|!6WQ|<2Z-jhjaGeY5G&sv(UA08#`M6 zQCq_{byhoQ>+~2?8FIh(s302%d4$@+7NL-(k7XgJEm3UAHxE%&VzZAGj%VX7NhXIttE+05@yCY&}UhrcHeG`bXI z3;Vg67%ZYg_!7Jpafck}1Lr6_HML?V^e%Quo5}cF2#rv*H%1{^#XJ#x$_HM%k<9g& zzK@*arFNT|QhlmuzfsSM3=e^g3WPOsx7(&`@XkZX?Z=wm2z@ORgf#O{C{d$?y5>fV zdHoD2Y!yZnXECM(#=i`2S|^coVGj zQS!z}c!?iaId#lNH-9*2InN*5f zu_Dic0^gtsZq8~Q3Qs>BE@&+*OcQEMi_!Pgg{4U$lTTs|XE)trUEQVvzM5K73=B&W zypYku81Bw#D=D=aBz-t!}KJ{^X|KqdRp57-&kW7ON4 z<1dr(F6Y9t;K$$TMAg1ErvhCfVqB)GunM~fvZHt-9Lgp=ihADf%*r|DY8#A6fpB~F ziFJW*c?#z_p89Nxo`9D+ryG^Oh8b!_RWB9(M5GuQF2~s_TVV(4!93bvPd~sg?B-fu zVJ-JzgFaB*t3tgX0S+`x-^(>R!v|67+`-B#Qy1JpP4YIep%(0r(P8I3Y|L1A8KV>5 z&wScpY;7x5=g#mo!^0s))XyvH!>fLU|G7uaI);k)Q+8ON=FS$whDv&EDwi^Ac`4mP zenAmYhdVgU*=292^_-)w{Dq(5^f|EEkF@3}D_ZISxa=fir=g(ef_Fa4xYJ7*!*3h=0B>Pg*}>3_h;=`}&Gd)q`VK{TO)9h{(M-K&B(j0B2T^k$K-B$@2 zC&Dw=$I^Ra#ryG(-_X9svw{=o4B7}jD+RTh(eds*UrS(81!_IzVgHP-rElSu9^x}2 zi3dNRf*b~)sKah4@LG>d`B7Iigy|m)@3oYjDb*!s- zthcc+kC)+fjUA<#*niq4Lot_+pDl2@LDubeRKoL{{k-xTEbuMV9PdnSyh{@pR)a}x z1M~UDoK6>n$8^wf5jkqnA)^iKX)n6})FC$J7Cys@9tD5ifcssC-rr#C{(|Fu!cKtc z=q`@)`;lCEX*@(UwbRFZN)H(A_pAm(Bff?)tjKzFg8tc85xRcK{`+9_&SZM2-6(p-l#Q5VstpgA6}DRWT|uXKiJSAbgLAJ%-f z9=6K1-PWC!5yB7Vx8XMW6SWig?Kdf>R9~7bU6q!~cIA-L4E`*j4d#rab;Q@4b}x0d zxvt&L_KpUQ{Wh;~Cp<~HEoKSr2>cbO9GDs~gG*DTRQa$Rr%aPa%R#xL@<2VH&o!sp zt~>U)QrwN)cF!Pp3Fjc&c~g?sUH&%|5o#7p3j~9CL{0vn{z0VvsH~FrN<+mK;ym%7 zv|pK{Wigepl(AoMwTtK*`AdYy-O2IQI$Zb~zOI&+CyOgW+d}okT+%@KH)XM^sE??Y zeO3NZ&a18Tbki)W&9yCJYgEnXKciexXCnr=vpJRt_4EW~mAEA|Gt^cz%YzkB?T4Kn z;KY=t>Unv!ST%GsG+vyoXxb-J$a2l`%F{Qte0;&Ur%`uYYaI*hH7xeQBO3_1$W1<&a!b&Z|DsmY6|0!;A}Z=qoI@XP4#bjpPW^5tJ9^rV#DB$ zK;=+RX_87O1EHtme&o3LiV1@tX`vCpN`YPev;K$v&Y^j78Fdr& z-R)FsMe$r{U2u7Dvbab7sDZL9MVZUGBD1c z9OxbzBK@PRR_`itpS_bSNYQ{eet@Ji+ymw+ zq7v#S%F(5u^W%OUd*#wog>RZf(riRD9OLO+N8ka8=;e& zd-7WOv1E~~;;*4w!Jff(p}#{h(pUM4c0F8BcyD=Y8}3-|>h0>~>gg=!$nL0MJ7;Mk zTtTta87-KEHnFv~TJ57AS5)~e@77iBA@!8H%P#5`e`}xhCZ;@`ay8ge%6i83*q+(h z%emC~JACJR+dO+$`vU6>;Yagc6qcv8v1$=zx7ZHz6Sy@Y+Yb)Yr3^-uFqQo-f3WvB&4 zfXdVg5axMKxTyk?m_o(6z4l05hKl8dR*v@>u8vi|QZsSUKPjGGZTsDAJ2nc-k= zgv){x*MQ!>f%H^U99d#vYT|@2hz3*$?kZ{w>KG@gXr9kyZo0u3186*zJwJS0J=K>PQOb>u_kmU>y8bs zfzOHHy{n^}t_W*1n=vxf77uxc(v02+vXmRBC=GRIGu)o1E#u^YmsF>X z9sS0stM&Md0j!_)j96{%+~_l4>?1gZy3t2}lZvnyeaKuZk)`H9DO#5LZyg?;!Qzdm zO4mlUZzvb%gP@H*)5EaVc05{x>F0vSZ-eJ^QKRmK8+>PN1>9{Y5ncBqM^oCQ}$lYRe0@41oe{$ES~x@mN$91XU{ z+X!L0)tn(?uT5W=C(Nd?Lty~?!6s*V*@zkM%hY2I>a6KpcqQP*T+3^S%SChsipY z!Ku`M$$0`7VRU6Jf-lm^Y;%!4!KcFv>_cs6aQzutI3?^neafX6`&5HsJ_4a5P+o znP>IIc7CKv(VMYY3R72~Yi-P2)nRVDFla{4t7hm)Prxg#=1NYWA~=OI)oOmm-wwdy z^u;%5rsC$UD1W}0e!vb6;_*JB3SEnjF}fG6ge$6!cj(Ia7ct*vbPd(>1lZAf#;q!q(-+M(*G@u2FqmiwEgL|DfsUKlc!O$}v+t>Cd;9%KuGPTDsO)??Z&U zfNt@csi08Sa@5+|-q|U;mbkyV{jOB!XM3!5n7M*}PnjXV5yenU=vy#e^od#J8*&Y0 zpHf!|%M;|M%3R$oL|OOQPe$~O8gtT)rey5v$i4@QJEndYN?JpfDDBhEvX;G%vmZP@vuEh~431gD3 zCeDdj<#xEcI-lE{nwx6BD_OOBN`iVwny+}3ry!fLN*}2LxNBqJwYROWkH2(ipma|8 zSF2)PYR%%bdg5Z&CjXSIB|L~Y<<9LK;FxAP6K)OK?yZj3PAC(L|sIO7(O2tFV zgQxv>eYw-!zNY@AVt@IVIz(S&Ze?{j^0}%QWoFX%(F+~F+6DV^TTyclZL(4w zO<6TPAV(-EAgXFgT}cdf3$6$p^8e$V>mBHy5o#^B2U)+<`pLpA2gV#sDxB0N zlR!RawH2^;v_=bcU`e{bpXb)%xI`>BWm+)uib4d%M6CLBN)6lpUwH7c3$w*%- zFV#+RQMrM%M|vR7k*|n@g7pG<{hDu;cbjjKuUBx2_)eCTbZx&WxAmOkpeJ*tIhiXY zr^gm>rCNJgSJ+26wpk~dmg)Dkf?6-No%~69cAo09EDteI_6vInii!772}{@?xk{MiG42P%cKN(o9)ZAy5MaML!@l_%YQx<*Jg3u zaO}3ln@5H{TDp2rX{P)kKajG@wWS}WzM+eOX};P%$?Ney@tyNe4>Sulq^Ul$tk@S#o!8md#~HO zD7~HcqW6JsZD4_DRa5nb=5m%)+biens1XV6lYdBP5%r9kSvOmftFKG5=Mu`0S?yPT zQ4*9(QU~!=Xi(@Xmf73;Ynt>;`PMc4vv;#!3~rUqs2#$kgb`MgW0bp3j5{e$^0W9w z5%cYl*3tG=u3YYG_KD{E>W^|?`K6Riz8Bh0);upT+W*2kGA;MFt*MW{ElF?gD;{_n zti{Mjgol`KTJGEaa(SbACFV}9m6$VXi(`uQu05Cgjr*eGskxncN!%b#7aK`iLvw;b z|8D<3zD?e$>G{$gf4iTy&HK{-IJj3lFIUpKnbIx0>>Zpb?)_1N6We4_lb6Oebd|LE zY>nNmJR@9dgpKMU>c|tsp7LvPf3Ttdrmu|O>xP>yhLIvF+V&?Q~HFIrMtX81VW)#@+>8px>XzDn$7R37Ew0( zaV9NG-K9O&o2w= zx-R*b=s0I5+a5D^2ftg(*y?%EM^qG!a{%#xhtQR3XFpPZxZR~uciM;{WVZePg^iy&Jse{nbLtq~DbF8anejF1VB31D#1iCGIgsd>y?E?q> zf8&$4c)xn@2P%po`5)C4K5Fh}-Q}>k_eV~R4#f3Lh|9V#ORa=05gi;~?ekoxc+dC3 zAhoOH5B?tN8GIh7;h#WNJ|*xv@Qc5_Z<{y4zbH6N>Y^0V=7ci~V{B&~i`;rdvzR^! z*{Q65pVU11u)CcruP0kX*tyqQJDg3ODZLjL1_uQ9`wIp@+H0sdRQO}_8^&wVF+o4w_{YI{TMN9T&qo|rX0F*e=P-CfqT+;z?|)_T@dU7IZL2xSef@;~r}yrp~{8^Q-%8q$}=4{F+RE#LSL(ti9rdm81--|;Exql%Q+?3^C0J1Utc=q?n95n6*oHcT z?uU_C<5J=WWGWu}cVy*=CY}S_<4n6ISIN z=&sTKMxBewA5}5(FHb>Nto;|^j(!>L@;9-6=xm_3KRZ{~)?dN@x393Tx38kVN8nJf z5!mRxlBAz7Rk8H2wREJpHbe}Jsu9y6wqNX{*dDQoG2^3(MHF(aw5>J5UJD9= zt3I>uiuZ)~5AP`NJoIrPpCwQ(csw*%>Z=^pa+&%Go2>oq|2da<98va|Q?X^@oN+f} zJH+KaSiY17gcrKP34PXFqC<;xKm66`5% zl;c4Bh0K!h+4{_J!<{MeQB*=qy_gy?o1*(i-HsURF78-k*&Tj_l|2gtd_Q{+rz>f{ zq|HgIkhV3gW4e}}!{_wB@V^O65B&@-`A6Fo{?)v|a?^I*Im|OPvTU?Hrclg3(XQwd zk%v51*FIZ8VSt`0UkVKjT=U)VX7qmkAej~0iTkWdt(smH z!Z7P4`&L)ph)9BTNo-XbPjtIQ*U-xGU><`QemZk3TyI4iqECr>C@&fs#+*OH$ zJ4w=~g;Pyk1fONT?I*`6=U?Eby6*07yZfUvx8tLAgrJ5OX@!-1(!|iX;M>4AR{68w z!cdA>LV6(ek5*z_sNH-hLw{hNN=TyawGO*-B-J? zKfMjPVjNY@g>X2ds6swB|06uGytQh!+>Xr72hOUl6jx7I4cAAf-?7y0uobebGb`b# zdJ+n-8A?N?lk%5R82#83&B31aJY?KXvfmU~k?S(#s1V@ z$T88e$uZhta^$oZvc0oxqH4Dn9bg%)k1D9|kzC|ao2aMMrkuNy2aUx;*q@wKzzee< zp(HizrtkuH!!@ZG9y9k5YFO@|Y*~PQDqwwLooxMJaakMv>n8u)i` z(sk6y>`ruQWwajJGKL_#npu^V7s^xRKjowHO0lb-6{{*L#n|mOUp>P9#Y*tT zPqbZJf0C&$45nhiV>y#OczG2OPCiXJhE8m; zY?r@EcDakBN%N#TtV0(a@m}iDruxEMGP2Y5XU@ycm(GfgIrd4mDb^}NS<`*(HrJI| z@soW{R~o5hQ27sJ_dr?dXa(ezQa0&>xLh0yTVGrDsP*+Brh7sc+ZRV|Pmbt0F+$8= z5l3C89B-_H%(t~C@)>CZy2q;GuTpLGm|oe`7AB;-d5$TlT~i{&La3J-1+#=61&@Xz zVcT=)55slLb#0R!+1)22d{JHF{)!tBGdl9F>yu-LZLqnBenkFVDk4o6MX`wD)sC9; zSh8E|S%+Eno1f~Plz3@Upo)LBe{G;o=tIaQy;4kiQ8|u;?EKICs01L zFVsN#LEWZ#OaoCym3I8>J{55%`n%X$v6rH=MAUa}v-h&h3=dQ$OI~rdcvxH@byVMm z*9r@))og=ogRF1O$Mt;5G*Jk?^R@6d349AK6sJpZ>JELHX|E8r$o2{D=!lb%5z$AZ zEiq#v9yx2+w^|Z}Ir>F8S^6o|EtDGCDDGEk=o?JGvV$r`u$q4%E~ExK1}6A-!Z0lG z{~GKhU8Vk6Jv_i%%bIG7aL#uX@Vt+h7g5j?<(hAQXxn1BYQ7pCtuFjnm8#^T1Giwe@tZA1%SbMH+Q5EF^{70I81Ae=0c)PBs1C$w3wAdpg2K$7

    LvH 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

    8|ZEto>(p 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

    AGw5kNiWvH6p3O&k*APeFN>-QfH>1FA z*T8F^$hOIh#0s7(oE6jz)Ea?i6Zvkl(W+}Wi?x`spQ4QIL~gdKtz1?fC}^qePEneLkE=bICX)5!WJ!n9d3fT zuJfInVX&xs5piHoY4KU?%-GJ*1Ft7Ok}>%CNqV7zUWsh}@VQ0Rj~QYiA_o0wy;YIe zz0YAfCb52pCrrjD9LE5^TPNQTFG)`EGT%)ADe($b7`snfSUry7PQ4L|J z{u+l#eFPWrfKN*x^P%Kac*3H-!D#(G(i(XIqkS^Wmy>CTmY? zMeK3585xZH@odM|dOtiB2k6&*dV8CDU4;eT;I8MG15YIwWIA*|n+#oq`wq+>*kS_N z8j-wDLL-sM{vi2&E4d%OsLLR{$kD#fa=ZOrr1jaXzFcbqIRVkSTjAJEmNj(9Lbl#C z?B$F4B4+bAjM50a)Qv_+e|%GKW2K|Cw}~-W{QO`DSC`7f;^a zplaA=Plf+jrNfUs&G~cLuiHiQ{iYt`LF3?{5mIgMM>(}W*xxF)Z?A8DZv?HAjs2nT zecbXCv%?MpFaaX^!Q5Beacefw9!x{oPLL+;6!ZCpIj}bE~3B*ZF4~ zVDfE{c@2CMoNcyNi0qX-uYr+sjHcKI=O6U}^0iY(IQe4p>00~O({MLI0t3jVNr{#l zY;@fXZ}rx)57DrL^}ry@gWiwS7Zdfx{dDZj#^68fk9F)>y%=>`X4pnn$XvQ`zR|dr zrM80niky%w{2zPBuezi_^F$srB&(0+Yl*C#h^h~7RcmWY+(D-C6PaMAKvfZu)((nl zX)n%cVvU^W9!BG2QfVTqXb9WrF1q4*V|o_cUPXgMMDp|G)^z7Q=-e^J^guH24rh;d z-W$$)H}MrOwS6za?aLti$gzEsc7ETs(iL8Trsp~u%UqcLLuh^reH~9aO3`Dx=&Y|r zUaaMj{w}fW4%fG6f}J~#ZP*0X&&C{ehU*LI_27zz(V~yg(c>^z|D=&0RYUxZRAp+e z`cmeFDrc6{@{g&jaX-Xxr)7XO?jz#v`av4^+VAh)`qA7)ShKj-V9U;A<8KqD>h+`XiXrXb)z3H9&Y^$)1l@0=eYP8+OGu1)SrsiLGkF(9Vrsixjb1&QMtm9gzn~`U@ z;^7#(`i>m!w|4Um?}vLgyINFii~IUjTg6iZ;(k}aGm$IzUw0l+VwEhGD#!Li&fk+4 z;ceKcKjy$K3@Ndz67iht*2~Uvkj0+s=sIAY{+7U_r zSD*INhFxjTE|$Rhx!Ac}JrNd7N1CKNo2NAm+zh5T1$UTBibf5OBiT41NzZqU@M?B( z?p3~(mv9jm`t3r$5I)&p0#C<5{!Y`ZrgtJ%{1aGk8C+87H8PJYFnJ5;p?5`$N0z`0 z?B07UpeLct1u)E4n7@@!OjK+uha~5)hBiVt>qMgefQwm7+JESZ3;f19N4^mY8n##_ z)R2?hSrKdyHr+sSIdZL{?#p}H{3AH>gT(*$m0qsa-@CMTrXFieLwBIHyVKu+1INQ~ z&ze0i+lFU#B5&1Hax*eP2Sb4)9UTEFj3Q4*(E42yzBsBu-DK^buTHHq%4&Ow@H6#FiXS z(?xdqK#|vBh0dqDHu4nxF1!5*ex#H5eop1}X`6VX+R1ls!OPSn$z$K6y2=*$@ZZvn zpC?h>Ym@JO?cH|XrH$6l>A^4goYvS|#|QO;ZMCcKP95zjMaQY|(je-nt3=y4W4q(~ z#fksKXI0I2wLNvf`^`SvWVZGwA%LtlJb%{yJ!3l{SisgY%NTMQo>eG}N>tMzF7u9C3qpXxSk!cKCw> zS&y`gfj%PEV5S-QN`htHpxxefq>_DBNh2#qE)-4wk(m0GUe{`o zb-Z|MweD(d`vd>p5-sw9v!Z(NJj)#W(LNja_cHY5k=nXC^*vwTPPKFD>A{xzwgu1Q zu{@CVGip-%^vZ5+zfS`1{!}C1$;!y#^=r!u**D{ERgUjfhxnhKr(TrNi~sLhOLw2; zso)bH!PE5U0axGZ?!IzgRr=~B<0}5e09d3z^hSPyEw+jh{E%&1Mv~oW?a40gPBOHn z!RoM0zM*rL@@a(bpTgdl3Ed80RTPo?y~%?DuUDE$`B3yZv_l7WS_>>vWTUlash!DY zYfe&R9NJ+HE+ZM1k@PdI)6LZi96=dNu&+#@4(!i!ZSy=~v{mg1s^sitPyDW0>!<9` zPuK_Vq-UsrJ=L}%U9LX<1ohg-rAK>m?~wG!^u3<5@kDxTdW3bj>O6(%o6_ymomE~x zGuB#`cO@}=C_*q=~{Je>!zEft5yDQ?6WLuO-%!@sdRnY<|^cNR@`9N6nsbSc#eDQ0T1+oJPcX zFT}|QLw>mO+h#tO9o|)ouUQYTufpuFF*hR$cDW_^{SD;WYCf91YADo$M^7Tt8i{Mo zCfOQ8zL5)=#<)jag?eUsEf152GUu5{fo}5^eD3omESRv%~)#hR=VeY`e>k@Div!pG_fMb8j&yh-oNOS$MoP} zjKyvG^F}c{ZH>}g+YX|1&Z#{Sx6#C?{WF&14|Z{IAz|;HX!K?!(LQ;s=MK&|Sxiqm zd!2l*oyedoMR#-+)6v7Wmne{k`e;{sfgH91=j8jO%pE_DW1CF3O|-u1UoG@6KbP$i zEPq6y1vAphsELYn9iik~SfzKsIn#}gFQC-}P-hbup}>->Eu+510C*r6j!Hcl&;8x1 zpSSYA)gzbp)X7Liu4|^g+*>Ck^|9=@uxk!DXPf??N4ADHCuH|}++%t?r zk+l~&i=Q|nnA`1%$1lZ#Y0sMzo|^~QcF&NpQ(0`&NYe_|TG(-wWa>ORB%bIyh4nXy z?f0ZiSMF6E@f@y8c$J`caKrH!6<%{zO8`ECPO%p3DJj-zAHRc0G~G_#iD*% zR8ZRl`A0l)cmigaQ%}G(WyVrG`SStz=B@-I299l$pxhiRep7RFFW=s$7^*;-tKrcp zxX)1-hZ5XF5gc=sKD3C)u7hDbF~%?) zMuu_S?0aYbhikeTV~imjy$r9BVmOV69k(lNuMxKcc9UIcueW#Ed+pu!a(kb>lW*%d zbJRZ0_g1d(8YM=)F_hyXW12CJaR%_}$g7{x!^kn(8J&zGqu8+RYTM?HlXjh5&S*RA z19k&rthJZgf7^@f-}(HBW1;=Ez0CfVa|b!9Y&YYNHAWd{8s{0;7#ABeI41JC+_=h^ zZCr1h!%Tgc$+A<82ChG39|O+c81XlIp8b~nj{T+moc#?WE(7vi_8R*Ht83ya+x8oN zquGwwSw^Oj4tBzJE)YA7EF+hHJVqKAIccXE)j%Dy4Wo_w+{SVH2)`rzZnbM{)2Or$ z+hvSb&D?wKdcMc)T06+^lYB<(knIDPZg5*<^kv)}Bb)I}BiZN-Rcg5YIFJb=yY20a zvESZeZ?!kDiW9(Flc0hFiX|Hb+-U$;d$4+rajtO%uZxY-jggGojaOeFPh}QedlLL^ z0jht&b{TjN*)8C+mf!y}%L(8TJQ<7_vopb7&~5~78~7W5yv0s3qQLA28xErjqZb)@ zd=7<6PB%tC-*j-31XYt6Bg~aa%($Dm>Ul+(EeF2p#r1umUl$z!4^9p<{xNXBKY_Eo zd^Xr^U|%vJZpZ-E(~UvQ)Ya(8xADeVj6Vw5IgK;@c<;eyE_ji2MWJb3f+xglo9sRI z3OIU`y%HR4vsc57;%=>^+;%1;&B1ycKxje>H?!!s#}Hp_hYNm(mYeKV_V@Nz_Ph48 z_W$gM?8oh=>=*0@?U(FV?6>W?_9yno_Fu@;3b?R>Yge;A#c56>eIY zQ`*8pXb5F&)`Ili$Mg#N07w>)r?M$Bg|nF$S(&ssY$tA|;$S-A)Pih_fV%ylLhAAw%V=SWGM zcO%Jd@OeG!t%3)u7{3NiJjPrG5@0~781|zSJPqgGvw`qNIBNnhOZyB53!{u#ypKuf zxz5ZJ#Zt8-Ea{QNn45rI`u-4FNb*t3j1|1Mf+g9FKtc}((GI!DWhodq3mo);{R^H?Y4wxHwh6ROG@u(>DXvTgH|-MItAr5;g7X24 zd6#iBJU5-=TzGjhD;UHzgSfVYS1#DI(b3Y5RX}C&S;;Ie;{+U01+Fx5S1?k*U43{z z#YLG|rw$3uOb2UjsF4Cc6ecuG60&DKZ7RX#J~Xdz8RLxPE1maj#><7m5wu1ei(d>Zd5qhRF*+n< zrV^|jgy)aJQ+pEH`ZqM^V!Vj?Xv`nsx2+sI;fDrR+-hfVZ(p!C4$6-Jnt>cW!DL_X z>tVJWuq}@v$vDg%;+`5_RY*@G_t&FOGB}dKfd>pkp;L%|nwaANcBl=WvlI5X04Q^i zwNx-s0<@*@tGKxoYzPJq_-Y3GEeY7SvHlILLvWUH*igs^{XMKUmk~NKLN~0VWNb9w z2H|0iLe9=M&Nr?!X2MhBS}KdWd5Y(+rVi%|=Kw+ZSnXr~$06Go zeQ0|y)7=@obYzu^gd23LQFr~C=8h4A=dV9Zq3EG`ExYrx%3?p=kqA&+A%aIfNhD_GjY zcpH&`y&G<1b~Gm!~t!tKy_cfv2*2xMy*X&LzX5_&xi{^l{mj|m;L5zH><^(m|Vm+M=A zUS4H6>#StWjbKdjqIkmreKOD%^1?eHGaVDspTSwlM=cz40&FQhSPNzsGwMQUw}CaR z0V`FEd<>lK=NjR*kvR^ts!iZ{3)k;u?l#usK>yf$wxO{LIOIdN^4(^RJme{pmAa9t zLS#+aS6aReEgE2a@!BD15e8~SEjlYY)IhCdjtux(v5+{ro`0P1orCdZ+a-0U2iUlQI7oY}yagAO?(Vg362pO)IQQ81r}p_I8zTzc7dCX@cjySOL1}obUehdp4BPVtK!Q1gruZF{VKaC zLHT~@uK{=r(-U#UQ1sbww6c6Mc|+aNW1?Rd=9Rv)S%>1o?O{Z zjIK{ z0`B&VGzPjWijkB^R`Q^06zoV+Y5AdszQAAOj_Y7z!nUkH)0Uk+M$AqOH z%{q$s)|vB}!0hFk0!D5DFDDu62>e>bSn}}?gP|=*#x`IVUfQsRZbnl6LKdZ1c_)?z0zhG+vSpO4f{{iYPXyM)byE~yX8j;>A^je5BibP$&)&lpo zz)8u#lm&(r%?`u&nne^k9o$|(JUWxLPQeR1A3Zh#2nKPLvLVtZvV(3Qkk2e@y&uks zv06WHN#`~tcrD8MGN430v=$Hbfjg(Nrm2j14{?Ix55;@E;fve^ulX3SJsctbTG3Js zxR(ZLVY^uS00E-EiLVgk_N*ERVvnOBtmvGY^55iF8^9(%aU^&-7Y;ZZ=q2Og z&;HP`2%FIcZGBKzu}%p5NXMDLBTdoFXj;n===BF{S%l=Q#!`NPNApP{BQqDCe24Ep zLqn~o9y(dbMVu&Ccp3yR41!k_dp5vR$SZ@{Ad!bD+ysyZ>k1SPz$KBvd zvJ+-*+2MWsmXvPhpFl#J$nJX3pOR4NCfQd9`02!Kg^ZoTf66W7@+n=c+>l(u~a4Bw=?rmI93*KKUgp4UD=T>d{@RR!Yd3+tz5gA zD`ibG(H32y+Gr@KyyXPAbv)P@0}XpZ(=&jp2(6^NVGr=p4fvIZ$OjW8U_zdZ%}m=_ zZ5bT2lC}Q@y`>9x0--SJL}m-Hmhx=QM*=U0H?M_P`=MXPbG|#;suOT1@~mfF$5>4> z_bJ+zHI_tGFp|7#X)?u1sZb;bN+p3q#iaRQGKst8Q@Qw^3N|y)*+w_9gYgyklYaw)GMdN1e-IBMm31m3+!NgCbtVzx6^W>H2++&M^Z@52 zjO$`O!rrMES-6WqzvDoE5Lgd0pJ=)tX%Ww!1jDEDDVj-ijwNu{%xaWn^|6i~$bKhy zun-7jJB#_&5h&Wjn**6mmM5LFig`PN-DYCN5br0L!GNCf{7fXMoE5EsHiw|cVg8q; z&jnJ|KzcIPaJX<7T5~2EX9(*phR?-awNP7rS{u+E1?#7B-7V0x2`W3_G#_i1jh6*; zfNR-pWmPg5TQVKMuF3Xi0C`tlCh(@i%PpLjmY0SRgtF}|$ZUWSyTB1g`4!=iWGRQ& zj;oXjIfc{YM4ad4e(_r~m{SaP1PB7aCA*`j$zbLR-kYGcI6+=s2_s~|Z^~9k8)Y+g z7ry&}#0D$MnpmuLXF_t1LM>7609X?RtC8(P{Bw+R8aWqwYgBnJ1Hf4qWJ5IS0<2va zTb!*rg$Fp5OOwyih!xnMh+EbqG}T_Hv=`WqGI|3%BTH1ncV!?A@D_yzsyn#BlHQdu zRpcOBn9kUW7NrrQ&{|arWmr>~zlhmO_>^R-QV;=4P0S;iR2-o!tn^?c!HLJgm^{KX zpjP%&@+(dhRzz6`H5BDM${C>oTq`FmsgDpH76Ya7UR|M5FSO%e^yf5mS|84}=hYin zN|4VCXejC^LRTfMk(KVl3tDY|i`Vo`;$79XWt=^gzsh2bs%~_It9m1I7m{06b!h_F z?#$Zyp+`C*lXprkzPqs*x&O7ft5-Kh+SA1q2!bY*;Hf^+$; zh&LG=CbPQqgue49q`D^*9l&g=4aw(MWFXsgf=~HMvZ2k)vJVas|LsNI6d@esidz0r zMp*fw7_eo7seEv%s3XYl2xl~7JH}TPP81BY0#y_W;R0nZa+qKFQ^6%W=uF(JxL5jH z@$^AxBfBAKXyKY%R+S3{8>o26Q&5emgw@JFQ$EjR6!B;lu=vme$}1IsP1zC`{GxcH z37T(VPek;;p_30Y%Pv;c%o+ue2_MKlc7g8wfV2ed)di~MF>VU8C=cV} zs&b&!iha!98Tys-&nZi84p2conhIeEg$97=NJ znU((^_V;slfO+J5#nB*=^o;+@fGW?fOuF*Qs=sw$)yi?ok~+bwGU~E-Uby5i@$z>3 zsC{5o`N|#0?sm>8ZkC6u4EQN)R}WXoCaW?jxl?9eRzto*2QVwUo5^ZK4{0pL@lJ3f z>Pm;mW;>vTXq*NQH^D2)5=6PS0v7aiHpA!l2?xMcFyQ(4;3ER|#zOTziDE+zGC%217w8TZ6rlwFxFNU-EQPv9^U!Q{La$#40o4xvt<$ z)n*%8s{FOG>kEj#MGZN#>4jgtYaXQ`pABdNM|(M z^Njr(9^@Tx#c#l+aiw9U%UkWyL}(q6^*rp-`M}c$435P@DHkEDH3H4v1#D!3Wp^U~ z6h}Vgg{bzfyx39XPQ0slO_8X)y94l`s$SA_S&0aDAm95kZXwhhh;OV|yElAO%r8|! zqqWs1q;7b;v zg-=nd8J_h(IX7nu;ZJ35OMy=rI@QHOtU@|Naio*~lIR(!gdVa5wT$g#1l6UK=RB1$ zmj|cnYa3KnS3@UYr~$*l#M=FaYJ>j7dMco*_^Suf^DlZrH3G$7E1^hr!r$D?Cn z{dHu-MmSM5{3ty14LW8e)@46e|AY^)21#5^rsQWv-32t|$kAVXZ(&U}@SAend-2*g zbN!b@xbKr!`GRZy=G;oU4nCkN@iS-NBjWvv_;()Heb3pisVRKP_eEH=-?(-gBOOGu zDGJ!keDgW87I>9Ok*Cna%(duZ)vqMgr>wRlXfaT#I`IkPzYO<1N%zBR%={kbw*u)= z;83r_B1T=q*c%e|RNiGdT-Az%DrS=3QVCBf|0~THhs%6Wyab%952ps`3hfi&`{Q3Y zx;n0KylF3qbvJ%@ZgC7T_FBo-oyPBu$INWwZEKbFreT_6jAFZ^b(X!>@R)~fx82=- z&lqHGGah8M-&h~m_c?Ac&IHPNNZVH91N$XwuKgN1sh$i~ALOLL9%<}GYNn$-#`8V| z&KPUl4Uf8wBU~{Hd6G7{f#_Izte5c+nU+#G`z*2+%Cw9|&tAZL795_;{o{#rhx2|8 zS+q;I!;k;ghu`D5ZVFk4v0SShS7*ji?@E7owG)yv9zR0$#7>E9)i6ey$Z-aFxf_U{ z&qYt%j5J@*sCO~$XYnTj9X0f6f$a813)*Sv#1vBlD!YepiK;~&6 zGyI1`odVO4=!+T21P99E6yvw`<=*{xQx(WZ15($5K9%fC=9HT)X5|^Y_dneCl9SV=Vmgt7wvisndpWbjRFfpnMGN_7PP)JRuOBF#~Oi~U0joiPRU5v zgU;YqJh~NKkisa6kB^~8RP|^@yD0PC9tsWwhEshP8E}VsRpiCg*ji-_Eu|4J0Doy< zBFs7zGn|0SRTptEqdG|xlf8w+e9CO9XZX?diX(RLOPPJu&Xip*1<$8JqZv?bIGoWQ zx?RM$=MZyeqA`@OE2rYU5P3R+_Wu*DaR`gB1KqF@ISrye+R!ShN+^#u1PD{1ymDw~ zLi5>-eGy|8fD=`0A*o$&pXZ3rR9 z(k3yiLMtAE{EG45^(@9K0Okp-aR{?c;GFD(I7Yd%Rg6`E$G03!{9p9vNBmxaHeHI= zIE*)-dQBE<>wO9E*`QS?NUlB77hRftts|#!dFnFn0 zsdq#^t-7wdawbH6yeGW468xRSH$_xwlgwxIozVWs)teXxwjQ- zH;`Y7v(;4?Ku%h?U-_)AT&Z{|z&{SO$Z=MuNZbv7$pcn(KsCm}WLJ73yV7G_xLdjL zE{S!?1}aC^g5_BO1(eHN2FH|x4b{a1V89D6H6rI{B6U6Byl(LH0A^KHUH+SoE5ygm z*b8-ptz?y6W>t1T(XJ|p$_OZTt89lGZ*C9QEi z(Rk;QcXUNFPCKeMHk_h=#UTK`&HQ7 zm2iu?2!8>Z2s5mOwesXL4^qN zQ;RlMZ^IsR$)Ai@0Uthvzj+Kz{iuC6vu@?=Lb&)NG|<~v_~oqn75W?Zan0A@LDiAv z_yX&}V+~kb$y$}Qtp_GqfA#mCNN6bivRR!C)arIv!y4*=|1tX!R`xxel%L{9e2F*m zoPDi5+rHGE#ru`W;=6ddZ!t@NJ3j$ZRYOj7=2-TigvXczAGDy+RS{Brb(k4Xbq5>< z?j@`u1^n)(D)j>t$%bE7AhIezT_1N7mJwxM>Ne(V0jhPs7GcxBIjL^gcQae zPK9g|oOlKr>uRJzd0hFsnMhYN_^v|dDQ0L&U}6mznr}Z$73>S3{s)Y&1sY|7vba~> zWa)5rdt@YHPs3*3$k-i?N7041!g*&H_u(xJVCJ|z4ylg;RasuY$*i!FA`u<(DzrEcA`K ze$&t;qo_P=!>*XXr@rOqf%$u8_y?TqXWq5oza9C#J$#;oiWT5b)^a4HtFuCNgJfP& zxcw~V>jK`~NR~RA1~cmjW>G9S0Na$u+DlmRm0URkdAkD0h9DuMj3=-=H)93I0#`ow zl`uvzxKOR#&P?#yTL`2c;U|j5_-?H1`2M*I|QXEsvrF zF2+(TYuFo3x&aYwfc7%6i^}H7lB;f{{;ewXpE~L5SVs~(IfieQtbPc18HRjU+vmXzt#Cp|@a)Ah z7jlKV7}bZYtl8gqS3}UCXQ0t+tlxHcrqLb>q|#hr`*!?}eDK z2EFFL;o(Wn8_+L9k>FzE3$9dOv?_dMTzNWF{Q(`j37gx3*YPdas)yw`cqqz8Uv&hE@K z9Q}GGG0P<6C}y7lUQFmc0Li!ueR~+MMse;z?D*GUB$?>*2-5sD+U_ZI-IJ_i4Qo^c z&>3h-ktX#PC?64IwaT#MfRPE%up63cE9aFDe;v#_kp4c%oO(m0Gd3gZ%FQSzl$_9q znarlF#z}Cz0K2Q2-x}7l2OF_F;gwe5f2!N83aA^Q`XVr^3`VlC(4GSRx}sgRJE9t0 zUjUzUWt~%vd*QBT;5deF(}+~H5V>3o)H@lq2c7X5XtjT#{Z(-L7ATOxx!&l_y<9&I z3^hW1#XT1Q=RE9+?5(^E<$?#p*==BGFVd(wqO^Ygo;4Fs17AD)fXrvtQxM z@9~g6fs$+OyT~ux101TdehWuvH<9YNs;spl)#Z52>KX2Ae8(NPk`Fq`)vb)8{W0nh zTZpFJ##}yhg%4{m84mOrt65hI7T7|DGPzq>=wxsb0xrF(!Gij9Rr6H+aw{wUi_c@s zy_~hxa_j_ad$>}&ID%lR7)XY}J-N{QJg{F#j^hL4C*yW(@Po+7L+GwLo@2a*CKw4<41-ScZI!+Au|oC!TC71d-NOnLkLXM*oV**nFN4xmP(wXJ zUihsYT;$@HDyORIjzo*AUpmSiiX7_DYWYY@fcy8OeTRa}-B8K_gdyNvh5V?GLS5nN zR@546pvH3eK(+S_beQbiK%hGUHn*eU3gAKM^q#D-7@et3edTxN;9;B%1nt4%P_Wz$ z9#yBj4P8`aT8ajKgI?0d;FFK-JNZ5rukH=FVgb;F7+V>>{lKP-V>R|CnH8!_sUGOG z1Ixi$RNu~JR1f;$Fp|}g6$M%QZX~fB4Htj|4fOL4uo?naWsFsZmRA>vdP#S3PCXa( zNUCGVzA}x=(DK@$xC89%<$C!i z7CucUaH7t9^_N|Zme4-Jo={p*xS|~g^iqx01dB((x$3_1nm5DKiY-GP*)WS?U2&BO0-=kWI6^njKT6M7omQE!URub!y)R5Qs!3?u69l+ ziqbx>{ah){afEd%TOvPD{fWxI*1$hbMp4&wI{xDU=%eh9Ui;vbELLzFXw~7U{aEV5 zQ741?i?gwAW6*1tB=Uf_8jlzcAPXbVx^K+RcgLCS&m(5WJ?Gf;|A)!gshgHq0iAa`K)C^R>MM7y z&d@qmq{`P;&TE(E7BC`>Ag@z9qdbhDs-}7}3V~mH&9v`P8BXnW$zfD=2FUJT-`8(f&3EkVq=-3ALqM)C(+*q zR@KJafK7aSYNysgI8EK`%6_YdtO{!EWOU`kRWWqHA+k(`;6Z(1@->vz8N}#g!OsNd z(;gntKsrGE+%CKTd7Hbz$Uh0~pdD9-8BuZO8qO*EpcSfGq8$UuVXMkg$mm62NFBQ! zSX(K-)f+Pb866JBw3c>olq%fk@!pv$vY5Y!F{D>2(C6A^tIqhpSjR5j*8{;aP$obYTR<0|W{E*W)i^hvCDFrKBlBDIgR18bJ{Qtnm}UoC6cm7w;& ztY;4#@Na_R^7qv7eh5rTqp7P`{*)@U2e1XgjJofXtJhAo0bo+Qz=q;q-wfTR@l8FX zsugPo-cDv(1@FF3y#6yf_;a-JJgnKbM0a1n$(#B17oUoQVrUU*F7??a@u~ik{KQ(6 zH|+@Q%J``|UyJropN;z9l`T{K*^#hD>aSB~M)?EvBy>vLryQtu(-gAyG-#3wr6mvQ z2vL_{GB0(Usk2CPD(9(QU*&?u*{a&ap^M@Gbp$AL6@?nw>!)m|c1o)QUw!E61kFms zFv_0lo@O8oLbF!BpW2(PYM?xe20Z>Ov_J>2*gp|ka{AismtAJ7hq(L`0~#l6sMHxNkz+^o~b>UuKHVEAkVy60SY{VXizEWAMNd(u88 zMZ}W1c3`|if-975Q9rJ-P-XDP3ACkPZe^wF?a^K?)il*vn+}D12~O~X@ZUi=3do52(;NQ!Co%lTx>?^0CeQw3hk|ColEL`R9~(1ts5Ez5;Mszt9xcYP^z0l`y%DJ{ElQVVpdfqcd{<^ zD(q!G(Li~0d4ru9Hv^dE7pT+K!Eb4O!6PqFJ)*MF?YLT1>U{X86bz&%xI=NCq|^f6 zek_+djnzRIVr|+tz8RnB5A>J1txt7#mxEbp>jt2a|Ih+N`+)Qxbm&6jfzQ!5Z}PbU zuWAYBzQ?{U!Yf$Hxy|Uq?TPEv%PG(77owH-&|NRm_xu=H$0vDz4Db6X{PHKsvi^tY z`BU`R3;2~^GV)e*=PKx02fXT?P|soz+pC?a+BHxQeZcG25wupQ{Q#1 z>Nlr&TwO`ZGOEW%)u66WNfo|)-qYdcQeLNa9rgr%ag1`2>MN7=SESODdj?{|@{sEh zXp#ZkqrNS538)e>7}?iT1LT$TO-Q<`JCnF)3Oo$kM<{KOh%o)Gx0*fjaD!_0gVW)hjD_tp`VX zD#pK1Uiwg8i)6+FT#7~Ik(9E|am+Ll2+oF5+RLsz?TUMqPf^FIdU@1QrLooTt1Qr| z=b?0mf})Y`nSsUE(*XWQ4)y^o%f*axd4jg*fvZb-oy(f~u%52ODC3!T6szn5ZG{8X zB}HFRqc_*70x*MXW^m_uM0ods^?S+j&gM7|+D-=RvWw~%S5BOC9vdZbecoWAoAe{id)xUEEV_m~H^#`aQ#h1`A+GDD$kUEvs3#|Pq^6Zt{ zkzUykCe*zn?XE7&Q~UoEh3VNDXR)3!%-9#$)ODl1TZLdVN;aj4S@et$?Gn`Pfm6?1 zkmgf;P~BR3a)EZEX*Z*GeXCkK2%5-OEam=U)>gvUdB}ry5z1p4_@p?3K@^Udbx-(*bnTQnZl{ z?ZEt;=vn=>zYvuwCjEi$dWy@b{R+}B@}5h8w-;lob7^#f!%l}@>fKcrvq_FXT`%ev z+J@%VF3(pJQTf++hfA?te=?q8ZP_-(QtC<64$f1)zi=)uL{BVG2dDI?`jO?S?*kh7 z1mR4i)VTmEM%5l?^`Cb6v%KHP|RgzdBY@ptrInDg5rj+}e*MdyvbVE>C~tQvmQf5-06*y2ECt9;J~K$N)j6(?{}g_? z$uX!SI1EMWxVt_vk2(sf(MCa_RiCH9ost>#h@^6-Jo`SZAeH-7gHTTSB$(a}40_&= zde|FX@Cv+L+u$uQHh@2APMaXC)Bexc}J=%Y+^J; zAKI<4n3taBvJpKd&*%u(soT4amvpJR)%D~B?eWz!d{h&6gK1@x4uUIXL^qKw`5D`} z4*vRw@wP&_C5*3Uw5$hWd0CCXti551yxSpX@?e!mkhiFOW&w0lkH7Y%#DPSe`%96w zj}zTr3#i_{Np?w3U-}Sld;#PCj%4g)u3fB3yL#pGt7}+MjI876gsq&6Waya`oskjk z!WhiVlD`J-(C!U&;;Po!$clHcc2%FW6GOXRD_Mss7?QZ(nMV=3>J!>CC7Z7913m5P zbaaqv7-O+Anx!jiJoQuy=_2JR^qi!vjIxwblpWv1FIB$QA%E-sPZGED&o+K-V?J2` zWj?jnTG-Zp3L6+xS&4S#Xs4H+G-EnS5W&kqSqC0 z(N?%$&)m>cQu4S%+Fl;6Ix6%miT>z5GXN|zkdS=mjpk9XlT*&ctLU(_O z5Beiq^a~XE6)rl=8no-F4ZLWNl`BC-MMmll(Y|x-@>5TA5!|9Zld9}!zkq7F+94#^ zg{940vjdE}fb&%6RxTW<-qK-kN-36B`%ovLvwL8h)lWSUsB^Hlh0Iin9;o9!J!{5d zba`B=Uu#c`x&}6K=ov-J`K}7Gp8T*LN>;+J9&qfX)}-vMYQr&fgPzRMK$IT^s}aWd zjXU(*D^>fnXI;5?_2JiZkNV;jJ;`U16cvC~Wwu6QXU_%J(-U6W7+}}VWZ~Ec_LbLH zx8ojc;AX~E%%x|$u$+UQv!pl^*3iqfps} z_ogQps1IBJHG{i_aF(8va}Z2QyUC*Z!Jah#KxA6g{&S$wRH_PEd3*5CiL0dVGth{| zaG^T+^#mF{ck0wm0p*N#A}?Fu3uP96hL=_EUrK!QBY4>jRO*=@gRgWam5J9lJ~E!8 zp74h8l<_*=-E+n(c)pk5KWU#!Gb_~dWA-xI2Xr$$OdrT3yPut9`|T~(4(nfQg|*oF z-ul#f*Sg=j-nzmXWlguvuuii&SpBUbR&T4s>S2{yova+Iqg7zFv%2uRoi)H3Z1uIq zSr=Lpt*fnDtyip1tdFhv)=F!mwaz+Z)mVmY*r|4VyO%wYj_v8xcxKbD{UpcRL}`EH zp)BEj4RC2kafqlq75tnAUr$0So(<=m56@piMDQ$imsgArS=~>pa=x+9_|aHv{Auho z4)UrsP8x9|Yy_AvVmQofGsEm`b}`$V9nD;`7vKAE^fX7B{mh}}2(ve@@#a~4AI0}! z=5Su4IWyiY<+DFWp4pD;JMik2xOccYz$`YqnK|a^W?yp%cbv;u)6FyZHpM)Ru_l>g z%?ai}eox^3q1@MlyK_0y*(_kx60XlSQ_U>KXlL3+w&_nmm}P(nxTB_Yx?9`-q>w~j3#3q*n9)*ZsD%K z`L&m>iSLNcK8BZm$EQDybEQOSuR|kw<);&`y-4KH)%Xl5Jqm|kf^HfO*FOW_y^1&T zB$Ug8hU174lxaE_o>j*0Le31}+imEpW_vdBc^OitZuL5}jn{Y_U9$u)ResDWD(GPHvPp{Nqt*@98tWSSM$2K%wIXnT(E7znreiAx_g`%9v%=PXtIg_fcVOndR@55F zIQjO+)-kKEooT;sb+!NGy4}{x+}F!~%Brwp@dMUud!2Q=waZ#-?XxCW3#^~{FWY*} zGJ*Dg_M4o!6p5k+Y<Baq!HI}@TbBzb=HtP-gC;qkbkj?q{iSzBr z_7#?8RoE-68hYL8S=UUfD*hd>LTgC;8f&W63wgf{-SNGZVmE@3p7gNYPDSchG}d$I z-H5I3@}IHDozQi^qQf4+nqF^Dr9ynEJ<4_f>nJqD9Qzh#yWC!C-Cz&0E37g0TC2($ z4+S&9YAM;AcJzPP=&;rHRv44bCB{d{!xE#rS!WC|e>R4gpTNr_h)c7K z@%D94e-aVK*ux?nxQw<+99&5V0^^5Q;q0#2loSK3?*$=gQGyC?EJ?+wSyZBN( zQ{A(jdmM9OKL%RjKgUlqmKqm3MmiqzO!H?slAN34y{&8FKSbxW)d!v7-y+XMFOS?7 zGQu;1z1o_aDjE*ejII8&d|dhNiuY^EaMx-AqdGV{H05{gQ;~n9e`_yS$*7bIy6Y#blI9LsUAnsW`y;k>?ogPTIw$jK=e<~* z|CQhBeADU`nde;){VM(II9j?b$2tnQBbi!7sWa?;E`t28XcWi+M(S5+E1FjYhy1u=9OjJ z6CG1RS9!aI?@tb8&dQ(Yzae#@aV+Tv`&iqohULvOn?Db=wBFb{Em{+;3;)^D&@jGw zPTeaf{w!N}tg7mPnwtWJtsi$^lmBMB&4bz(jUMgm@neZU^^er&Qx?akn`buM*|H(U z(KaL{7;R0>&ity~y%}r#-+K?bH#+VO_i5CEj`1JN4$~LmO*tz)w8Q# zDIZZ5DO*}Oz44=#xvrBv7x^FU>+dqY+xf%3E?HSn;ai!0)Hx>lY2@z8bIfm}-6FR+ zH%6yqoS(J`XX!Ej!>-Nlvha?!+PeCt9u1QM^Ba4%eHl31_D74a>AK2s72&eMWfvTM zr#!Rrm8K1W($c%r-z|8!=PO0+PoGk{JwKHEpOp9g3&XQw_0?Yowi+{A9y6wfe)T<; zdUe){q`v9HT`wlhi#^e{x?y|MZFMD0XVq_Qe!OLC%ao>#4ZoZ`R91g{*zxs8W91E% zI~&h#+SUH;jD0yj_86b%9=xse^}eEYaZF~Y0V|aE<9RLe!Q%?dVB3fwGrQl zjstu%x@G5%={}?P#*(h-d;C@DS9*9JQP@>;!ud}4W$U5PEyf)8=8UY=TT(AfKFd4a zyVJ6Qmp5lM4{zw)@^|AoEvGegY~A0mu<@Mg@2ff;nRcSFW=ZWm&4UAbii^_kZU0TD zEA!^{8{K(KVO#oh$^BENJKy$nXj&ZE>nM-SblqhiaxPD8&774}ku}O+kTNdmuwz^F zSRl9M^I$OeY@n*OUF&Co^II>fyQ<=y@?N9zuKUw+NWg$*+r(_4P-_+jqecIS0on)XkxPdfI_Tjcr2^}6RY zm*xAgd3C738?`p2bj6dpz@3-UlKgnenbx!RRwq@9_@jYKo0f-OiT)Mr(eh4RyN1nm zYbvu3EZ#rrSZ>w3&C$9~LQ6{LX3gnZ)c%pwFT2djzc%w-JB1D04?8YNa<&|@?sMch zHfBC(Of=`(?LF6eYLoA3TO58X9E?Td7q=~J$P9iISsGm&h@Bi={YllF6I~Bnxi^uI^%I#96hvVG?reyDm-^Lf_Z z&eiEJbYD>NO!|`@&+`xPofn!NxUZ#KIi^oUWM#{)6db9Y>7!;!Di6(PiEbW9NJ3o6oo>n=hFkM2+a~ z=2^{ORsUWQIZ}G~(j)yVwlsYhyUM(`^R&`ly*?khJac%Lb^hJndUtDdPdF`pt9gU( z&g@vh{_H!8_xVO;W_VUPE;aHzmDb%!>l_;$tCQ|>%uVV-Z{&NCtYA~~vrQ{2|E{?4 zVDF=4N9NZq3=|pLe7E;1D;P6!N9U!5_jfpI6eeG1q(#}Q61&}XneV*pUD;Ff*Je*m z+Ln?Nd){@kIoCDN8F$_p|Jq$@O-gFAj@aLXy9MrS8r$??)!6F4_dk7P>%PCs-><(m z^0m>oeR^?Guhplm$(h#Wde6n)N1fk?yw;`BYvbp;yC==c_%=P9bBouXb}Uwb@7lw- z-gUlN7rV*4FC22LkAD*{h!?dkYc}d1s;a7b;_!sS-47%kyt8U&eQ9K>Z*a$-^74lM znSY|aKksGZ<>YpeeUTh%TA;!>-QJiq(*IoMgZ|v)cAkdFbIx($8Qxju9gbDz%Fw&9 zTO(hF{;(boydC^s!*eG?Ro1b*!~Z?JXpgV#{j!Xf*V~@Y>{{?>$3F)S$bP%q?cUu< z3q5vdx%pjaOK4eqXT)}Yzv6^Wob{%=^@Z^K99(ud{!OD}ZeIw%ve@VY*&^_%7JFO~t&-Gcxb@A?w*UeR- zEPG+_y7*LUqGz{fdUB4x#{AKnA0L*S>v-RHqxofQSg3oTuE`a7zV+-_YxAbYP1Rk> zE5^Uc5`}Nl-aT1tE6JjTdo()Ta0A$Sae|g@n}hWrhSuVp5v3$ z0j{lSUHljNU8!Tt8pnH~CtCh$y|Ll#z*&L1<|_kpt52`VJ#xvh`A0rF@j%@}Ev2y! zQ#<(wm%dzdphIgXcTRCpY4X3x^F1+VH*=NoXLMG4L!@i8xAm6sry1~7J9}q-;{PXo zRoX0PtNXpS-vTeTEU9+}A8uY0c&D|g*41E?O*=8}_}=3i>$*0SM9=V^m7H04M#+Gp zySiMG+p{<`^Wn5($&->kceXk^$KH$Y2;UxF7x^aM*>ZcEozJI!m71LKOm=tw4Bx}? zErCl~pQ`<_`IDw2&9Ao|tY6>oK}G0zue*PBkF~C|Vvz^J--SEH8YAN2n=o#rr$gdI$MmNWV6HXzE4DR~sFyzAew|`eMbJOtamam&77J3XG(JNCRdU9S!{4HC-`vS zzikzfL9yNDw{EY`pIV)ILCQkE!!gqC-FC92bFgOPV4FGU>TywHz7hM*wb#(Q-?wgfb zp7wF(6;tjEkuyV=2Hy(a6RL|m9_v69HrjZGX!lq= zCB7r}Ypi?h^w>qwyCR>3h6M+=&24?I^}5#1f%a|Fg9pN+W8Ljn93$L6CFLfcms*+j zU3x~wlJxqt*{Rl{UQ2ew3-JC z42n&N)kH@|pNQNYejs!(_-Jr!@T=g^P;xjW@>=xb_%?g6*XyB_s4daIM}@eT0L@IU8&!oSIP zg>OjGc<)yCS*~v!=bG#{uqxvN<9Eg~;&ss(kypdt5G8&T`6_Z-u38V^G`I-t&?oNuT=m_}ZA^>ZJ3S;YHUt zr^j*7_|V>DEstkG*;}IjMxKgX8<`%N6nP+Wb7V*4+sI#$HzV&yUSqa-ktLC==nc`e z(T8Ib;?G+f?NR1z$0N?STpzgCdWw_A_^$Lf_)Ec3gYQJr%ial|^{yM7DUK(MCv4Ly zjpxSBkA4x!h0dC{rS3!@XG7e`-+z7<^)t&EO~T^8FIdoF%~ z^`O0)hos-){M~iCXO(x5FW_xS(vulD!#zwNs>>3VOq`vKQ%$FD}Y^-TPt*eB6&~5P?EJy(YfQ7Qif1s#`p83(ZQ*ajcZJKt-LO9&M2E(P z$F{|`$F7Wzi9a466mK7YH})j6+zPJFk9V@JU>Epj=DUsp*EDx`@102%zFYiX`LFhm z@z3+!?wgu4%loo>w{wG;VobMgiBF0xh^}N6_k?c<-xDs3{4X*U%nyv+8Ec5$5dR?l zm36hTG4^llC8+UKG&y!=^o(dz^wapY)_P-*d5iNV*E~El1r1b{eSq* zNxIM*cYWbJ-P~)>j_-^80N&4wULAcS5|6wWNsbMUTCt-sZ+vHbv^6~bRy-}99bXbH zi~cvVFuXl(z9$w(4)%o0Be#aHjI~A1viiptTF=FISeM7^$t|TBcUW0=hxkA7_R-IyKZVAI zcLciy+XZfFi?r6X)drSCUGd)>E8Ja@9LaOj4re@)ePwoj*3D@vQww~Nq_bUp9j+&VMo`&mT&vc06g`74f!3T8cxR zf-~USZQ)7w{pND-X(@}7H+y%vQyo5M+!z^uJ9Js_jW#PhJXqa&q#>jJ`Px-A{VGqE ze^l9UvbAY>%hT@fi5c>X$L62eF{fi$r{et63r42Q^9Pcm_JYXW!N&ss4O|;N5?mMA zXT4(&^1R}C)%}Zmf%}J~pS{1Dzr=GQi=xG`Dbaat&tlOh#m){Dw*Fl^wC?H3m#aT6 z`@FoN{9xS+&5_hMeT#Ai7X4K6d$&zJukFw)XHDMv2dmzlflfze^HRx3Re4qP4X9=Xq66TK*OXWQj%6Pr%fPCtIt zi5rh^sa#%u=E`>O-ow;6Fno?zvYI= zIicL7zmq1rwm6^gPjzSerrVR_L!%Y(DSNJ}iW?eu1=&QX2s z(HD+yKGJlgsO*80lk472X-T^)Wk;v1j)Qt#+`UIfU)uG>FZ-Xd`^Vb1yx6=fT-*3= z-NIN)jE-;j&-TThcFCVQ-i+=uo(fO5?hgiA#)N*inj-71`=W+pinG7@Z+LR-^|m#E zgVl%1dmNv0;*CQO94{#Uvi^%;Q`Uvf#l`n@xU}1)T@H2Gng2k3TK-(~731>Q@<4Oz z*1)?B=ZETSe`JR9CHFPn(|s={U2P=0GmLLSzeH9CF9{B`7KFCP`?!-`(_EdsJ)9?8 zA>;N?W~fK=n>EE%BTl?s_WkkeYHDkqX>(*gXWm})WxEMo@9mV@eN*ATg=2~?aCLRR zV|*08Ffb$Bqv`F)PuAM7>D=U9?Aef%k=(~+Cw<}=9PJXD7=1c;c4Tj8igk_igmb9- z+SCjERleK2zd0(5i=t0Ak7`P(?^N?;)mc^FSDah7ylsZ_edk?CQ`=oyyu3qo$=e-z z6do*$`b)hr&xv@S;HL25;Kblv(Y}$(?fcvzr^B_<@G(TL6 z2Qfcd?CkGqOF8QP%=ccZ-=F4q(h-TRjqGV%+?3b&Vbg*7C+n|j9^B+?nQm33JHppy z7398_vorh4f|Y4~vzMelVt4eFyFLz|6>TyvY&*l69D5=**Rjm8B5r!4?t#W@F56sS zt+z8`cZ6@U`bFADJ~EQyYt85FQLZM(yY8;$Pwq9wK4WgY%IX{bHnt{kPV~CSy=|X| zr^a^$r$l~@Yz;jaz23c!no^bjUC$Su4*rEnFL?j(b#XoGn&Mr~j;6<*H}Ygce7b!o_NC=Bp0r2U?->2b zN#93?xzb9vcg6=rFDug;XB4+SgE(T1zJTed-J=$YXDye{dB&g-=o^ zsI}6pAIT-R#LkWFjp``#WkX@0oMW9p)wG)n*?<`!=5Axh<_|-WhSP z<+P?*ckt|%OOTeQh|vnDsuWYpddn!I#^N!Ps03x1YpJo!W|!M~blnom8{d!R`7Cx$ z{KfeEcnVqYi|s?kC)9IZH(HI~&8w(7-(+qy&gVHw71Y?KQ3ZL`T4r>!uCv>jA5smt z(R_xQquacTn&e}~JLKO_Gh*>WcBQp0Hr={1o*p~EQ)I4)O*HQ`##$rIUCt}5I~}Xd z*U6+mYMyD2cKm2}wBMyN|55w{<5x=^;pxU7w$H5NSx$EndH-mww717^v9`vS$Gcen zwNAt@pca3+eT~t}yv!)1+Eq){&P@&H0ctb3)Kx0tTgY$UK}Dq-@C>7Jc@4F!zUIfq z&s4ACR0)>x9Oa9s49w(7JI_#=(Gz^GwR_k;J7B#*-KCpVWVOWO@ez#nx1}8a^K=nk z0OsyCRvF(?9lf4$7Bk8$yO}!7Qfr%a&}yK>6W0^_`caSVM7>sh zPk&N%?FyauSZ`SmL9s5p9a9ZR9CuT>(vw|A1LfV^qke!T)F&L&eim4tTlZS;SX<%ATj?#x zrbq8p<2U19qs~~u@fMY~0o052gpWgDXB`#&6>#G{_6#anEmkq{{)P666jToHuDtqiI+5PwcGNtFAUP{mCAI34`J>wno5;!i;J5a%&1Q`I6buINK3({N}vR z@xF72qsW}co&T|i**CQs$-kE+tC0Xu5r9&KIb^( znB#oYvET8YImVn%-Rg4d18ZLF^0?2s8F`y*?sYt4W;-u5CmE@BiDgAU40ns36?R4* zC$ILDm1q3JBi?#AH#u@WJIvvZw;dVIPt4Pt=Q`V*A3C3R{N)Hb=!pj-*BjN=?Pe8P z<3V#68svKW3oFSgkKG=9CG=+~JG?8fIv5TQj}*nj@db`E-J=|PJ?|%VazE_8$@_xa z;1KJLWFeWzNrH zgPbp-xt^r6^aAG!V@|xivx_+){*U#I{X#S=+}L(|;K!C(O)odS5f~VFqxIMLJ4o4S z{#)E$|CqF0UgpZA#e(WG(i92fDORcJgC?-czx@~k~HdV|qw+D@l? zt!spPhcnrnY5U`kg_i`@Hg|0Nrgm8UHT82EzG{A3?<&vCtWVM^Qftym z(_c=0I`zfmE0Px^KjnSj-RNFr%!;R3HIZLJ>qB$njgeoCI``GCEZ=T#ch3>m+vZrS zN30<@zja{KeRcI!7gax1{X_MgH4~fC+8RTXopb&lN!I{g$F@dC$Fc3CO={fQw(Zo` zt=-<*Mrymgb$e^uZkjY|cqq zi@pcESNiPK_EtVuOryH+Q@O>65NI3^UH$oGu1$&zRW8-i`<14ExudK^of0qbque_k zH7$emTyeQVOYZ927DY`ZA41ILVshx9q)eLS2Zz; zRm>?V-Yr|ZIabC#&)wL4Lb}NGp$~XX(mqs9)(nJg^cT5?-^zY=%(6@>vlgw)xs_8l zyGGuSg003-$8zo{6A~KX(>_HpjBb}vgU>5+TxN9eEc>i)O$|5Hrm5YvrCE!?`96q{Fr?YK;cZk)z2{CnpM+W5w)bXw7`%allKViBGOB{Zj()qyr$kxlb+r5YC$M@5&@#;ur zt9Pq4&=}AXlRR%6+pRwgc}0zKUwmJX{p;(5F?o{(c`^}WA<0<6`_i! z;=^O_`d5i4^^f(Rue+^ms#r+fcM|Lj_MORXx@G@rd*@nDE|w~4$7?Psl-j<^`owuU z4pwVp=S|zC(szaXvnyow&wTZzQ|8;e`K5bIMLeN88MRA0COJ1PDPmYs-=yZz<%35? z-|+wD|5A5D*`29D>~O4QeVi?g{^sAd!PdE+Hc}^Ql}4p{q?)Oo#AqlL-Bfh4ZbutS z<&su~Uo(Ba&&oReG5Tjl(TSoRwq0UFuc+|lUg1@qCv1rAloF5}8TmD|e@rjmTmI)X zx0KI`-$Jxw4V!LVXUZ}c*tXk#@sZMYWk1yw^>cM|Wk+TPT})IJYOzb~?TsnLWx2L* z!+yQ|6#aEwK~~OY{aE)0VNYN)|Mg)5s)R?bPr09*pSV5P6~8}(@%8qrsTn{*-`-Q; z2y$*T_cFUI=dID6H-d)PqYYFlRp&K1itBVkMI>3q-E+6LT`cn{y7KGqEN$keZ{xF@ z7yKycYM<-rL+X+E%{bch}SGr>==TW7J zBNZ{~rqnO`k!m2R5|c&2F~ac05SHI3tKqK~UlwJC{wmJZm)y1fcE8jaRcWysV{S#q zS4c{HnovFdaq@Ei{LsDuxl9k@3|-xkYUS+z8q!PFnxd?utnJ*L>HXXp;;eGIbc!^o zs*o*&OOoiUZtP~#6wc1p`Ul}V+E58|~c zJHk|nok;2ojb)Yu3nOgswwOt$EX5t1-Mw6*cOE0TJti3}VaUN5$1{Enn8<$9DiCziyWiI#$X`!x0Ht< zjSKZV^*N>u)(egmuA%PV?o=*EtVH_LmFb^kcOje|=~!w`D*avb{P*SDpSiOO*us&e zCUZ4zzhahdR`9RLM*w7hFMlR2u6$C;uEd9t_X0cmPtmrd?+c6BmzI-;M*8Biujaq) zBb<5e=AI!QD?fu!(Bqhn%v4G#Y;-5t>zL9@e2ZKE-jr96M-~n)4m9+&@0Q-EeSJHH zpO2XrzcuMoT148UaurkF#NQ9=7VygFp>jO&o2%h6nob%fmt`7G+Zs7nu=@}L8_v&@ zO30>k3uYz~BKx?z&gYgBWo?U;h5PfH=QS%xFFIRV#aw}#sl4iSAf$Wj$M`#macL(j z^eg|gT$AM8QOkn%_?=RBBRlZz+_Qicc%|Q_Z)bVtsO1jk`-pW!sPB_`ln1_JI6YD< zWB1ub{y70}QMYDn|M@v+7%1YjmhVh@>OC2pOPYmDmLHbo?H}o3QU2~SL zp1V80nf#`z%|U>eh^^|?H%~c=c@LU!YHlaCc9#6kIhd_6-|-m z&DK|T(OJxL++v|f3?iNo*U5EM6zxUdrEZavh>hY4ek*t0GuBg&8^Z5{4B-@F02xJ9 zq3_Y_nOBNe$`>l5dZXs4=7nad#;8tLH-k*s8P#^xQq?u(ZN(wx2^Efr&Lpv|aDXTI z^;|!$3isKgK$Pz|*M;v14=7cd3L89%Iz?$|9c`x~>DAOI3fV*;4>N$cdjtkt1L&Gv z0v`4(v5IU!Riu*`8?#eUUHL?LNBL4&pd6rlr>L!nU<9g^%!Xo3th7MPK~!=mJlD>` zLm^U}DpK$WBK~-*sbou7;?bmrd<0)60k-`ScxOF;Eo1PB*eeiuO^9_s88!r7awB<) z+)eHyF90o>3WVknU=&9JAxkUoeR;vo1sW5lK6 zaq**A9oG9J_!A?cx$zkBhX=$Z_?m-(5qk(UTBLMcOc(XSTVcDe zVQ0^h{D7b9FXjsugvH1!Xa$W>M;Ig=6T*O>J0}JK#WxVyn1j#|Sp}>fCH)32cM-0? z3Lf%Uaf$d!ED>u0bKC^@&TOIy*#~1fn4Cn`Ab()Y`alWhC=h;k!~tR=JZq=$OQkvHoI`FeZV5n!|`o-cgahO;UDC4ifdEqoZ9v}mm zf*w2;6ELe*qUYXtN-`s*3Fhxz#8%Q3qZMEX7#5K>UZAL0%^%(oC)dgWwxK zl&mkg_zc8eGR4gd^yD}NeL-sINu_G>huI=-82^}1D7p}TllPdd#AV?E!wLJj<5ax( zT9^#1X^ape1c~#3QM@74MI=WOcS6nM6yiINh3CNGzUM>8+dy`XB2ty-`L*H?X14fE zdQ30l1IRh#I&qnlL7(UIh!K=d^d@tOOJrBci|j5P6c3RTfYu&LX%LUN0{=dmJcU+l zCj*J0@D`ylNFS4CkqwwI@dBeG8R8lUc3p`D^gy7Gi>brpD)KG;jyOOrqTiBt#r}#~ z)L`)iJ&0+|ZB!H!{e&BeVL}p>Cq1Xv08?9E`<2~8KV-HMHK;el1BN2*5_Oe*d81Mb zDf^COlyr<%Nl|nnc7XXbNvy<9q6ad0K4~MqQ>oM!sUom4-LQ&Qi!-Q6;tXK_?g@4> z7b>`w$dMukkNpcGJWZt{A`r;ZR)~515POTIh(MJW4-2z|B|woh5*iB;*uBz)XL5{C zcp;Pu0iqw`Poap(MT;-s;l9C0pAe1gtvGAnhZQP`_4AQrY0JJJDgn`9krxx$7Sxm+(qS!y9Jkpc{T686DhC{!82Uhp9f zL6_$okiOZ_ev3f#X(kZaw}`cbH=^QN@)war4#)0%pL{{uNeh{U8S#RosUKuMsiyMD z&!jI^Kw8OPWNoUD976S^hEs!ZzSN|8Q|+NsokaDbyr@RNu6CwsQ!S`2_<1rlj+#zg zqc%{_5qoe`|509aIXZ$4rd!f!`1GRx!p~*YJ)HO3sa@1O>I5~IT1a)IhT(GrHIf=l z^`*w+a}3p(T0zB9Y54G^!l($?f64f{GDYED^{H;S`$%diKIc-asNK{KY9_AO3x5wo z%RZtXpUFJ(EP8jG+(u^LOx%Rn%wFKG?%=Nz@O?0F{Apw_pzUk?iNO9KVo58;MIwBF zw66@z{vcrc|0c(iV}bhbjn_q!ZbYJ@v6WN;7o9=pJ9ISsbR9WYBS z0_y)9^TP@xb}<+(SvbS*f^B&iT$5J#9D=Kkg@w=>@#<&X4rUT(BnBXIIRJkfjOgD9 zu?q24KxK3BCw;{Ijh-ad73)#k_|ep7z6$mMz#S3UWu%^DWigoiES^AwX%z7nPUe1y zo38}Uek@SwF^G7#LA0|KSgEyuTAzZMI}YD_q0OCf`gKMhY9gLV(#J( zW@FV%$A9ahEyy}xZ8pR8TLJq&6r*?wamFm1zS%gBs=<=+fllHN#8=PZw7LMc$||h7 zEojv=TxA;0yk5Ba47^uX7r2fy|1Bce_t1(3xZgUQnTvsDUyJ^XK)X8Oj#JU=o5%#n zyg8WzDl_h6rf?lR_uAkmDWMQ1t1g|vliGn*E!Pp8iM}m{&9)e$Fco**jHh}O>IJ8u z2YVmv#^ZSAN71)y;PvdsE+A{??*NbTEY4%O?%O(i9K3I4r@C521${r~N z!*)qP47Dp57(;QdbnI=D@Vs`yUOkN-%GEPvRu+lt$od*B5IY|XuGbi>GP!QzNc<$% zPz(SojKjP*g(tTf&txRVzdt?);F%1=9arJwFswsa&rjyPHpLU@0mXq~SZhOY#lBd% z%klfvKe>Z7Sidt7JsyFtQxJn5h&wgFePkZEtd{*BMmqy@cQ3|Xu26d(`5{^P*n<@& zv-E4=TD|am7b5~c4DU|`M`j>ab|&I{1T;#41S-PR$1CFS0jwo*&qE9GF+1(f?84MAbz_ zfHbnEGzLFEL_Lm7@R!$1v1B^dy&4hl8Th>vG4E+O9fp#5;!l#q(<&e(u@@Oly%l$0 zCp;o;Kzw)^Ss8bFM+Ts8EKc$N#9y$`dx!qsFY;r9zU7SL1lUj>eG^%iloyc&k=Vuu2gW@EhWYfi!@JBidhp0fJAuOWlWSB6V z974C{&k)b4n&K5C$foM?&xxAqsqQt@HFcUNm-tKV%YPJxYc~la zJX)`nVgoK;^_INIS?R{iVZH-dlUdAV!?Ul!#nT_CdT94cdNy|AIOaKaodjmHWF}~O zvsemSARcSOmwZdUMh`zwDZ~hIG+!K(@)=Md4zeg!a(c!gA*sv(UMI#REsFMM6F z>mG14PTacuesLIel)J(2CX2;vpne+xNnOYnN>BI{{fF`YUfJ|OlB>v;i4v=MHTg0 z_Lp`w>KzLmTivsLr-tjaiqN>k#gz_3ZHSCWjE(dJkMS!HW>O_&U0KIT{aSV```f+6 zv5t%IUZk0(4A6Dcsl7>Z4_S_@=858NS#xb2tUwBy7nWSp_b=Q~c&_+o;jrSVWkaov z9mn_$5&HrnefP)sr>(3ahTn~z8P_l zgepjNOTA5T!@bVquoXCeI4@Yo+ge$(9aGG!OPUt{lkYCs{Ci@4o8olCG5b?-cl5cy zS-vF+AFFs(p~3y3j7K8V< zQ2OSKLiA{g=0woT{}ML~|e z)DmZ7%Wf9D$-0;Gsi0-S^%9rqJ$G4Gv+9r3;}Jq&^N1~p`MOu0R<_M-u&SlfTXR6O zNPRYZ8}c@S=;gY?4RS8A^emZK(#Cd*ObSqhY!0l-G$$8`L)l8EswFAbMxKVG5k;_g zeT95wPFl{-?AV;9v-Zl6w@@=pWJMjplA7Onm+zlLZfuo{P%=> z3tR8~#4^zkURKYdvZNTIEC$yV`dd^%!ntrQ(b4|FIoICMdQ;!dzFc&wVpOd?2TQ8| zJoR(P&zYI`Gqdu~TbqzXl{(E-X`2F^LYEMeM(;VHZ&|cf*yr^&xo)K~p%?v{dHo#_ zsAyiiGuQp&N6CGMNNCg!a*_I#-;L-&;o;(cdS~7-%U13e%}}#NmRX_H(6>#qey#s> z{L85C<$mVpjW-%Sy6FE}POM!u_Lw_?WT};&oi20PGS_#-o`hWuzErXVkEWV&G+(Lo zQt`xJs)F5CQlpQ$80yhF$dkeu;T~coD;@RC?L0$tje=k5o)L_Di@kZ<&ua$5XcZ4Ya3$;K>8 zewMk3dm0s~{1`Yb^k2Un%GI{orH%3iT6CJ{p{;_~X$H`4{(QyX9w{pU%7qR-@S1kFPehdX=O&)mw+vW+}Vt=|I@L$_34iI9K^jYNwdviaDm6 zc@@5Mg>#(kX`ODPmo~70uc)a&uC_KW-2L;3p^-W>@>k5Upuf~LfZ)F4n#ut+Y@1_C zb5M>Ome*x%e&5b+l4JON%{>JFa*=_4&nWE3j3I5*i>(Ad?oZaIRn~tv6B8K25nLg@!Ifm+{_$V45=S`J60Xmng}nM{^{k$BwM+ zre5^))JhFc*N6y=v41OVZBTp8Y3~Ow3V$E?J7inzo%mTH;EI=={Bi!9uB0P9BK@^q&pCx5_$Z7*1GX==xk;XIvMtiLt4Hb1Y_-`^QGC30H)-j-8rV6g6Gl+Po$^ z{`=Fs25gq^%E)iQ|EMboC!N#nT5By!yt#!nha2G+2{&hCbg9s@aB|j~;;&qp&#{1G z>PqZ8^KpG=*;J;L-6`Gj08pfLvjaPpAWYx&r{%ctAa??<5jOwq1iIu0Oo$=enUNR+F zYw_(>T>`=*Y~lOE4WXqW4^aY|$~*sEmt9xiR9xmw2R-)cN>p{WwXQHvHKgb#nOyF= z%D*BSrKYF$@NH_E{>|^_27M?QuS@rS!R+-+vy_+*oBYeRAUHqZS74O?B4&W8W!8(#dqq*)9?f0uG5& ze^N79H$huhGnV=8F_>PLbSjD}VvAypr)<9*Ka2zQ-AuR0(Xo8BdX=ewzgVr+N9^I9 z>ZkMBteftCBZT9&Mj$kd-Q=e_RBg!|b9{$%OgxDW3i~LKtvH8D$R4bV69tEY*vkzF|$nCWQ0~7{Q#k9Vs4aoXv-8$9a$Nx}h9MtZ_ID zJxZet8;zfgyisqdYRfczD_vvo;dY0wt^A=H5iyJI?YTy!d41I^p}vs)ysAe}NIsDi z75s_lSF#}MSB~C%K-$A>r3TUqHHUo0Yszy&%3K9ai_h4HQ2TxM1*{1g9PA3AeDeAC z#cV-&^Acto?6rQ%4#YmUm-Twd`l4<{BTM^~Db3SuWsc2;sYN@Awh4V>f7UctdgVLO z^NQW6{_fjNspMXIdg$&(FHOD>>-6sHK9K)AGbaD4EfVn?D|b`sqZ=BqMLW{fq3~#4 zowCZFw#sy$lfKXW?gvZ{-4ghS2{V@DwJhB)h4^&ySxC3$_pt5V8!SId=M>E>?P(lp zJL$}Jb+?*J_7%0W`2-eKjjCH5--90MYDM)8*yful*0dXhl#qaOKU4k=5s8+@(!3J| zP0SU=x70Fexsb0o2sx(JszYFta>W*xL(x=s8-*b6c<%{zM@ z56d_4VZ{8jxRjgzH-t8(Eyedr6YW+pn0h1h;Jp;7fdfK@sd}5w6(sAA3HvnTHF1iq z^mXmLpp%icL%z}%4XT23#x?X)-=W$v-sK7r=g?XFC&NDly5eEBg6$?8xLuBr<|<#F|s4`pFPlM)mJtTbNG4AgJ+C7 z4nCj59|qkMpOy#(!Pa=Pf$|FRSTK_}eTPS0iC*tp>{b;u{9WI6l0E}l_%Y`eP5_NP z+P$avOkPH@$5!4`*Ynb;uy;3=Gwe6M5)7g7l}=S?8&o7L;O?sFfY*w_)`t4(;>_@E zDPv+x+J8Nvw*O2cO{>i{?Nwbv*xSMm)r$aqP^M~|Ewbo!>0_4yOpxc?4B?*gWZ>@b zR*pA>Q#oD3Ri4wO7jpiG12a2-D_!KX>MWd_uLA82oa%a?cc?3 z6e$^d7rG4nxp`C|u;*<(os`}|@58LVYN5TMP4Reh98c0M2!GzeO`$d`l8Nt@zYAv; zWav(24(=GoPwi>>fqFnDadt$Gp4U1mK?6)uGR_S*6c@ytVgU#NWsQ7a!CxgR? zXV%viy>+0yfo-FszPpe^l`$3LJ|iDKKUqRs{1O1fKLIA1s}Sr?mqO@~c=Yz5T&u!*Tx6BB%n zcs6q%G(7?vscSm~!!@CM=%=LZQ6tqQu3wfJ)*zc?jknEoJau*CJJ6!8nyW3M5M zrkj&y;f^>%b=Gfd;7#vX`Ud;eM%orTZg_5qZHfJe*nWZH&Q(u&%aM}frMoNvU`YA7 z%+~S1@-_3UR(nO>F83sUtRIQ2`ax|=|INx=7j0Q5jQ3pp zgHbP|17bBp+%;{3jLQtOOjYdvI#;?D*{|Ar!t*Zn+aK?fyg1UJZAD#$hf>w+26e&R z+dZ59=r<}fHSoITx_H91-d5hR-?hc_%RSTe-gR2Ct0-@UdZWa-8o7OVH65w!r=FuM zR<=TD>Q8}*0=6(jCYyr5!|peY9h_yP2o4`=f((Ru|7I z9omMf50aCe?zstZw7$9<+J1_D!1>K)DyXW{nOC@`Adv8a1Hk+8>H6yG;d|dpo@K(Mm&2jZHO@HMn;s=pvCe;<(Iv3eRJytnL64_WT1KGve zCsFWFyVYeZL!ZwU1RE) z`z*VG?4m32)@yFkWrC91!V2tYPaLa*#))YE%CYnTRWY-NbWwk6xA-peYD}iN-@3dc zO7W4-5?*?K@rQ{2q>gNv<%zMsd4jD1*57fv#eUZD%ux;gnV&PmZRIx8zWzUASCq?- zPYx;ay5K$0f01uD#c_6;Ym}I&zUZ}HeStj2m*=PPTH!Po#Fj!S;)wk?t0KQD=W6z; z>#Jgw*^2ti-(<3I*OTRm6=TUqBqhz_&Om!-mZOPnh9$|m76_a&m&Wzf@!9^wZnDpI z{OcOZKPBI53ImH`?j`n!)dY|CKH@#zznovNsvW-=Z*LY*@9z|g>1}(EBZ3c>CRLN`9WF*4X6ZhnvlU+SeM)6{_bkvd}CkhSm0{T zs#qWQLGWrvuqWBtY?*sEtKc^C&&57eiu#t%o*-@5v9J-Lj-YaZZT%9wYpA1`TF?bE zk{hY9SjAz*dZke{TfIr0rtRt7$j|Nj z%}b;CrFx@!p!xwE#60Q)5LZ>{Q0i}DqF9b!;Gw}pJ?aUD0>(D?dbiU(*PZMx!utE> zp2$+3<(@a5Ngg|!$-ehY;46yNkV#1~a3-wKtY zm^sZ1VC?i@CSCDWVNu*yh>U`1Oy8g;Qd(+1&_IWf_goFWfRE@el;fXpX`G4+=E`w% zID=;!n7tP~%{VV`iEDyya~6!^MB$sz9n6ep;#6r8P){?V$resFA(P2#L>saSRN6@7 zkgI?#b&&2(zon{DUy;YIMKwV-_y|UYk?J=MlM1ox*y)R8CfMbU_iLk0hi=3 zvQKiJvy#M$-^5G60e!$Y&j3m$7bvE+$Okn=PH+d>E3;5)qJmHca?AseP5y;k-cMxB zT7q{X=jY}jclH$##6!rPJw#UVH?nAQC8y5FFw0qLxq9*&WOQyJOSKfLjOoZprXnvb z*E@9rSuh6bX-+W==gVzmF=s(%?X`FXT3~LmHm)OAvaEm%)?@7b@u=@>#=X~}-;v+~ zt$>=~PEiZ&P_TxBEh2M>@7YmPkL|CKKFP=Az_G4;?@l=(P=(QjX1 zC|aRS%$61Vfr8+cM(08>!jaB|L)>xyv7yU;iCic zem#)MoQ%x&WpI_ekX^42jp|3}@e_v~40*`vhbkCE$}Dg1dATcq|co zn%>A-BPWFnwyeM^S5KiZW{Z)lldDla1G1tLav{Aj@?ogjCTHe%;f`mKHA1nSWMn$e; zTNiqIL3k!|#f#s_EG8oR_X0V61#~Z0;F@yfr6zcvtdlC>sgy^XHUV*P3YddaV0S2? zhqf5cNaiSQ!LyzP_Ddb`#Fk;CTS`?ho|BL(-H-O{K?ZXv+VT%_%O@~0$1qnykz>@N zHriEWI6oq1ELTakfh*M+xza&k(a1H7hhfInh7PH$K`+;}97Sx063|;fMWl{so#~#43Y=E-mF|fui0x>Za z2#fm2GO|D|1cIqE6MbBTS=$_W)@oRBDZom|^`v{Fe{GQul{MRkptsMVeRvDknTKo0 z^_mrbl#S)u$XS@x$1%#Auu_f4Sp$}d%&h{inuXEJAdXI{JiZF6Os+_ohjCKim65n!O=vo%;EGE8 zSFR`|peH)?vOIPexk`$x8(#;xZuOrkT3Ntt$Q7|lfpqwUIeZ!`P}c0djh@RI!VWxp zJ9<`%*M#615B;MD-w~J?xh{hVZTCVONM;xLW&#G(Z) zi3?O9ISwP~i@$`R1t+ivy#f~G6!xihzyX{Cx}gI0%1T%Z=g_ZL7-PAToUGLU6K!5waTpv5n-Kkdb?C)c8otK2<7yXDF*mw-^%i@CH5yWb(a?mbXBUvP~|So3u- zM!?OW56v)&ouE+L26JIN_JCRV+7|P)Iqpy&<1N=+kgGB1FrspeX*c%nZ@A7*?86;^ z10kUou^))YF2Ia605WtIkfB$g4HgT$#1y>hKAve3o|m1NLB>;GsQI*+?!nAr7BKag zFZ5*E158wP>Mgig=kSEKL-TTySR%|5ItYdQK0c7&%;k9|dOAZNqQB>aN6DRrj>1^J zgzpPGK3(`&SmZ>3Y3df&s2R?tCSNJeoP3x0q5*M@-C1@nW9-} zC9H+&!(=E*%!2a3Iw0X3Qa&+`Tth`NN%VPgDzP3rY!~dX?ZqL2H$U3blWpa`?(%bA zb#G@oc@nr~TvI-uKOpqO`Nsmuums457S>&EigR7JE~h; zm6*UtpHMbx@dsSOaXO`;)yIqO|7LFi+<5X2t9#lpHolssR zVUgVx4+z=(6Hj&iH(y0K!7{Ey$2aRoD{Vb$vgxA@3yk5W`IhaL#rFDc8=pXGs1523 z!M!8fMn8=H6n!`9W#og%_Q3usa#q+_zJvu%?#-tn8= zLooDKW*`%*xT&n5ct8b9Wqh{qh_A`3pfhs;R`D};o+HUV$^JLIui4fMmI_uMTe>aM zE}7NNiq6ICZFj0LL!`)qlt%l}M~Ipnb|Uykv>`k@AwB4Ha4VlKz9V&gl?thi(2jk{ zc{?UKS~zaGJ?^vaqwIEWBp)ZV<*#sNZW8o7`te7(0?vq57@S-10{_C&aWo0-tyNsVp~{U2c+*ft6cax6s+UdP{SPsWoQ?W@*RM_ z-6#$f-(!z@BW{O%UJ)Nw!6ryT10ZPL0WH1**!bm8Y=zn!*$nL3g|OXg0NIgAJOd7@ z2hNOVK%I1!9*Hf1aqdSf7DvKfE|PA+ZZKd4^&>}tZ(Iqs`(d1K^?_lH1!_wG@<@&I z?J{=Wp4bmxq7{9xM^*)jHyN6`o1r3G1^ay{UV9MxqXk$HKd3za2m5I{&SM7X`Qzx1 zFId=jfZ$yz&J{0+ccIxk2Y4|p_Ux0e+kSvCz@Zhn;OVb`^;{2LixEh++pwTgfRO)B z{0BPNEyUX3iBATSH$zmxx{)iUT2Wtk4$h-xI1$&Q&E;Tw79zL54M@5`V1=`R?R@}C z|1kFV?YOfOyLu}A_X&2!G~zf^VQZ07z(<}*LTL(k)e@k&X5&;&hFvxixU0LO1x(@b z=xINohwlQHpMVz4f!+QZ=cq5Nfrj7+bbu`|6rM;b3P3^Be~*b0~Jqe17aASxEuCw4e1^+Pn<$p z#X(dTSama~_R=f*AA%(<#Czy^{{s~Kc5=Q%U`L&Z_AGi8lK0^*Az>tIe^A*&OcshPwXYAAV=%%PqV)!^qV$=^_~I)GVt7@hJ4s7j z$wpwD*CYCphryYSB}?H^V@HE$3!Qm#6)<)R@iqBej3d5@%YmxvOSBYQ5CkxjG*Jyo z5T}8O9}M1l5Aq}N8EEA}>1wNpFY=QXk?5vhyrmEu$Q;R>cmT-8*v2wt2bd6 zHv%7w`750z{}UC|9dQTVmqj|I=dipNK%b)_>^uoJRcF{(N5uuiTA>-afL}m%5F*GB zVLf?9NTfaqyQu=90eulO!!E6aM_o#E5*JeGLOOLD>LaIM&CeA*L|0)77;UB04!$9I zM*NE~h%w}H@i^Gn?deP0c@(?YOT|kkiM~<}yn|z~@|5Hy;TpL~$izIEjGbD8Eh@;)u=*2$fcqOGlmPqiu^0oq@m^7qHsg6+7xl2t ze6jv-VlQq6?t~Fst~jDP*#vvfQevRgne>%-;tdd$qof1GC2hskhL{RZUxsK`bXV!nk@%f+i?kTi&>4=eR6e2scoOQ`E7!H<|iZw7sIYb-O={|v7X(jxJL6}dsFk(gU><8mFc@N$LpJp38k)xPp7cuTNVTmVz z!_W!-&UEZ#v+>H!QXAqVbmiY+{X4Lu@5kIopu`;EM#p>&SyIO#bmeBM`-@4*xR>mVRaUB|7+7vghy$R{TBO=`eaM z@AF(}y|vqD z-+i=5Zkt>UR)zPwg5msVO$W;a9x})K^QeC`Xt~yy4BUTB0 zNWt&*@YE{eYeV>ra$S~i{9mqqRDdhXRsSyGY8P=;nRk|fHZH=*Zo#-7#?L!}#XpPD z&V&ysdwu@6PHp(ald!KW!@6AnA7U6WSwJosp|OlE910u^+i^P6T?a{WC9PFp@3NO1WxX5BTye@m0pISH|7y zW1cqpGr~>rik4_$(x161_fD=PCs*vbfq8lgEAc*7$}RZnpK&j_@`w-akO0562S#ut zY?&^I)pWoZ2f@zJ;**3W#^Nl7r2r3_L+cIrT8c3VgPrDw9ZRmrC0CD@EA7!3FCE$| z*K!A89IuqCDtTcZq+vAWs(pLm+P{5j5Y%T)`*|I9X-IiSRI5@7p8;x8@H zvu3cDx*~QW_q7FflGbQLINl>ypp$FT9LEfoty7t0a}O=Qj(zk8m_6^Y&wrD)5Kobp z8zya|hA?aR+vFs%6?UuJSY7L2^^{?K?;uj7#>5BlAx3E;?38IZU7o@>muo)GAbLp| z;OcymE>Nd{m@k2yH=Woc922voOJX%*kq`qv`>fEEH1q$Gk+4qA!%FHx)F1~*pQuwp z7Cla^N1m0M(J{hv>V|Y)SV=wO>XAc*gJd4Rj%?4*q!#htk^NY&sKlKkWnODXsN?L! zPJ5r?xu&#_xP=@bG2lvvlf9YI;wz#*bCvH#-iLMi8+>9F|5WTioe(OJr@*ySQ8qG- zS7W^1i8rOr;x7Im(OPW8D@hB#LwF|s6gGo@TS?r`eAZrSw;_F>zS5@UuA4y%Aad(bkT(sirpOQ|2k=Tb6K(pRKJk(;d%d zdu9;Fy&m~&RUZjD8kQFNHMFs*j3)sJ5_vKl46pCD(h$1$%;JtEr#CR9dy@a_PGgo&KC*o@tAn)#-hz zxoVZ$8~i!0U8FtIFMd+kqtL5VddLRmr1Lrv?o4w#t-kgY7r|ZPSGi+!ofwB&ugX?e z((I-`V?BHpKe@fwr=DTX_fDhD%h|>H#<;d@k%2S3D>_wH)7;-s$!y^7gdVb93kpx{ zAKW#;6*fEVudoHt<9t5(ckvH!H6>g^Wz?CdZPvN(o8nL|} zBUSX>m^>|3@_!c?q#7yDWMvtM?fa{tZmKy8dDy1pt@RaNGc%StmZ7%qj+4%oY$#WWNmVu=D*D&(EB0ao z!$Yrx9P!Nz-x%cW+tg3+expsLjxwu=i|iPvfj@K3v#oHJ*wXCBR9XVjLOa9XX0idQF`4At;k2~NQ6un32Oy){Crg1yNJU4vRw zQ@V(*#I#kcQ`A;YQw&s=Dn=iXw z2Ts|t74xYixba*oR(b4Fc7<~T;+BSPO?Ra;%>uh?w~pmd_F2eVG=Uo05m?~okQ1ycUIhpKnqU$b z@bVvvqhJ>{L%Ui)ooo|yy|Tb5od!Os1Mznau?6h2mx!Q*AlCX&c!|uV1{~nyqCf0l z6(YdLh~DH0@(4yC-qTQ(z4q$GBI4;y{6@M_eHfkyn{T_!_a7zQ{)86M^8fcE&ry zNj+ggmg5BMjyABe+&KA<;>oOm{kIWz=ziE+1fD?{PQG-E!C;($<8dl>z_`cY3B3TL z>?*F@6&}efoF7YIjpU!LW!)LgQ_w>Y_yvR0S3hyQl;W>>ayWoBW=-&?5 zL9#7#4wmzLuv}Y93dEqs;u%bXHNwFLY=GR?W#qwbB18NGy&Q;{%)pD82QSeNKAr~e zkh6`GVDW#(yidg1S&CO*#Ow3H-^+sH!7}{51W~A+U?#6dRyl)+z{&iJ@TN`+E^(c3 zL~sZhh|*PuHsTU#x>%E_BDMqTf3egbv6&QNIqamrpd9TFjn*}uv*09$E4!mM*#OM} z>51a3a)sDO-9?cvc2??$v2-hb8>#bn3tD~}TgfwwyT!idCUdR%mi$g}wD1zG{!bc5 z1`@BapADrZ(OGl`v~`zIi$xUJ_>^F~y;be7c4Ly@yukdC_ZGS~C zbvxBqrI)g+B9Xd8xur!!RdE#<_|v&yC=%CW|AAWfzb=#WKduWR^Orp@-9tQT4-Xyf z%G^i3HNQhLl8vZLYN|$5=4sY=57&+H8=*Vn_tUGQ*WbEV>S?NWbTai(%HzYh4bWpx_z;Z+JMVrse zjr`_2H7PxGN&Mc#$q@}=`Uaj}KruzJsqXjYeB)+)Udij?mL+vdYM0r~>$ySJ*~&HAL#nih zHvx+h?P2v3yc2&%wvToOPYj9Hc2Fiz7B<_~!Z^{is<3a#{IZ6{k+x-qOI#233Snl} zsa9*p>a^b5b#*n%)gzdv(tZAuOKA@=(}u^T_lnyVzbo!uGPrECbqDvKt*OeWJE%^M zco@_+aYA@_f-5mB(j2ulWL$8XcAw%a#ko7$ej0}vdlXJ9T3@=lM5(W5z3H6j-a=$B zHsvktJMYil9lZbXc58R5e3_lZ4X(5Esx8O3sjPR2qiAu_nxc9o(PhU>^*v6PRjlf# zQBDgR7jiV_O-zO8Z7KUBe?>FlRfFgFQp&pur)Q;emf6R2sN{5EM#-1bz>@K%70${w zmuMv{3RZc*`>r?bP5M6b?yjkzuF7neR(cLOpIcSN17#mdW*1c}PA`62(p;ZxYUx@a zsM)?gp13MLC(4m)MOWjtTFt2CvwN$IE3 zGqyzAOXnwX09k?Qtsa3fEcPz-Y2!6RQ%CKfMe!eQxr?(}Om_`YWr3xGO6Qf<(>o0r z=E=@^!US%g@`ZPK-MNrnp{t`7M$C(D71twdPek*O`vKj&qSR{@I%xW(IMS@Fet^EQ zA*k$nna$k8l4yI%PUPby8&#~jta52Kdl|IlG>r$UWKCo1YkKnGA-N z#&ok}US-?ly2SMn1F7TcVY-{%O@r14`G@We^$)KRHaU1%@FV}V&@$|<@}`doeYg>> zD)!Nq&E|Ec&&Iu`gVqeoSO>*cVwGZn^a6To&y**j=r%|huZ*WhQ3~R;aF9FhNd?Ag zrt_2YHL!{goI_lHxyyS5Zn5};2&8r?O{&fs(z~Mfb04SA0>2@?OMLqKboZL49j;!h zbkchf8(Ye6@N|Q!czfqv#|lTLL+iZe{O&4tlb+Qa%hwUNA!GQJ>_C-KB%MWdhXU?L zc)S91`ZYp6RMppd8hbLKaX-@&!rkLz#PU){sA0r1Zxu&X|ElvfByfcnbqjQUx&_)% zs3F_*+SU1XaC32S->}SeGfcOlC({|&=v|UE$;5abuiqW zp%cc2I}>1x!I;1V#uzpjz9EBQW5eCur2_Rf{v`kJ&F}xoCvEcb-j#FDIrrS7UZ=OI z?~HGqe*m$eX=K$I2zRt2mGlefW?Wzm76iX>o26Hzhvc^NM4aUXe{kP8*@B01}yl@Y!oJ%Z|Ci6v=hS15^breQ zgKQrClw4)8YN)fUyREu4-Fn9Qr?tKHpgKnVTq%%i$bF@c(Bi%{UmF$hXnW1h5vE;5 zww+7w=g3<19og-F(zEnmjdFMjRYtp+P0hg-_(|MCs@#M$P!k=)Av98>*|VCV2V8*k zf&PGjP;Wo;=OlrQ6aGX(d^yenaZGi8cCftUr}FuU;{{ zhTj-RR+dkMUyj8j{%@o5r8?Mp*jmEY+cvdr2|2QSHE{ zEz~AyZ)mNx|Hx1@Tpx^gUnM-J8U?j@I|6TE1KWZ3%{b2RS!Q3PoGa`p7Akb5A>XV< zLy}7t+k4bCZ6Y0&O2~uBq9QAel>tgWWv-H>PE@8UW61QHFW1DU?Fe$JhIOT%Wj*@f z6J$n?F?Sl%jU*$@xTW9KFY3a=--TURruyMXJO@A?sNsyYw7StikAbis`K%UScKC zoD+4Ayf&D%e}u=uWGcMIOUsdt%aLbh5t&_nkbfdy4E7zl6y63OQ4{q(C!`RnY4pN& zwH-U-8&s~1GDR+*i&!3`I2F8S{(@gu1lT+r-OE<=d!i0^0_!~p{n9XeX!-)X0cf&1 z^S=q2xYqpd!N}TkCK34`rs7L=!y<8h=#0&BvNVf4GV8Gn&60*N0tJtXchK-1L$9oo z5nwL4f~t~XNH>zm@Y90~KR=o2SRg+^6Iz-Xe~eGlKD?6tL_Qvchgdyyo5!)OPR9<` zlq@N!ygLDbElAU8$bxIYzDTmpOyRV(N}7Z3VokCn9mRH80j<$bSg>Sj`5rSj5l85halyI=*ZK#kvKNY>lAdKsNtedZ%9jU%xg zu0rcNnU1`#scQ| z0nfJOR3htu44ze{vJ$^A-wVw8KVBPv@MmO0 zYJnawfOS%2HW8NVG+^8s$c^WW@jLn`QQ`d!dfbM6_YqS1bJph|UK``lc#}JVGxq>; zlZ4p$e$`%6U287#NJUMH271nDz0d--F$3C7qnxE$M3m!u`y?ZcIQJ*Y^N<^k zoX{_%3~xWrBF_)nTu!*V^`*W~sfd$|rMkDY5;;EG{L!*c{!RH=NmlC1Ia0bMLGF&k z??vlbl00}#sTF(42oL;hEH&@xzk;)|oNO9ObL0oges!N()w)@}#=g4&?AnCC<2m%; zUvPpuV{QXaxK3BwYcCJnJX!yoB4*&xT%TFX><2w4grP_ML^bj9+-JnWyWW%wWH ze;GM}e++zB&Fw&Oj#ORR$G+i_zLQ2tX_oh>rF+rnM9#Ksv#W6c4}ccMN>5S1Eo+JAzzbv%d_x6{*#@xb6_PWo>_Qc4KRKsr`SdPOD%+YMoz6S-tZZ^ zU$2QbMGsEqZ&Qc*3EGvz@|Uu#_EDEu>)SrGSF=B~FR;CBJ7XP;&eW}pQ%aJbW509` zOnL!5*A2LhhUO|V@Wtw%YV&=Gp2M!&#h(}TFDfjIEs7}qvN+Dw%-z>J)$cP3$n-Xr z{NB$(v%}wt{w-!^?3I`eQCA~-ghxAm3Yl-~p>(jEGx}&F$!M_4`_P->-Q>;k#%XtT zEwEZXXYFfCun)E!RL7H@wF%kXGWCbPJDylqsp1a`ujlW~tDe_6uTK8@g6l;UUDLcO z*;Ve#^=-AozmK|6VsApF#O|fWC)A9861ObI7I`>Sv6ZF9<*!uSy5kz)jB)NR{?D1~ zy5oJM&$fh5}2s<_KkGO#d8YE<)!3kuU)TZzFwI9EVohN zr>-Nuo~ELdBI==8Nwbuz^trOWq$x=Y6FbJgiWwh~9&$)(X3p?^>-y3;xG1S;H=4v6 z&as{x{}9tq+S{vyhCB9!{uHv(Uc=f?DYDEmy85F$Rf~@nl+XJjTYB9l>)XuFvvObk zm1`81_GD>?EG0q{B3qZNlhmb5AZ2{=d&&2b>X)8ca#ZvsN2Hn?sHDlBIO3iyMGFht z7Y}lt@C?_f8?81CY2&yUo)Ph@W4hy7NP;a*U1k|>bn(x1-z{2K@G9p%`AlDCTCzsH za%ER2c;dX_`_tTEzZCH@F1pM&NtMdANqLa+P1#S&{E=`k=0LEUsOb1AtbuK!+EE&2F4q3@%qb2jc$72!^^aLb z#=wk&8B?-8$%!l6>mH&_k*he;BNruRmfBUOeDa{OMP-UhWhcy!9va@%)+gZAhkJ%N z=MKrLE88y3&3l;9usM;cQiOCx2A# zx3AT#d+F^nc9K{3My|K;wmZ>ZUw!8IEBZ`g6v4l0lAbiR^q9oyai_!P+V4uWjYO@I z`%^ILdcIVU;H>Rl;BG-(PU_g?>9<1^`JIbhpqGwgjsGHvy&JC$rpk=e<3rfu>EJab)%#kUGB z8B~DQY@)b;=GcJ!h74jwt40o zevhkf;h92f@m*I;aaZ3>&lMwIs-;|19;#}HHRS8CZMKK%Fy$S2w$#QFZB*5s_>#Tl z-2;m|=Evq#&#ICUpYdl#t*pH4sRdiyO|%5fXxo>2>lb({%Fw>t=t{}B=jPIks$B8c@`=rK~OHPTXcB#Viv_o;# z6Pt!ix2v`{ot4~8it`Hh7e~40ds1A_t$WPl_TBa))>*dawh+#Oo$NnLGc2)cC$qBr zC)zrXF~yRvmDjI%?-w5}YL#2+)#UWC8Bf!XWG>2`mH&}1%&^6^EA@N4qiVadvupIJ zxV+++l51mgqla3~+ZMWW3cI-eEpA9;%rxzQcY|Cmw2Sn>k*Agk{ZZa+Ti`R5!4|JM zTFvpNt8D`B*>@Ua)%wP%fY<2g9qs&(>OK!&?|$(jKZi#mA9o0}sVrtXQ3 ztkFODUgf!!!_&0*jo}kYDCQXXxwbdAuJ?qizw0aKJmVc>X5eo4QOke!pF&5dbrerv zt8vk}RlVm+40+(w)QWPgkWl+E&Jj@om*p!hgi5-7vghV|UVQqZ_<75WPcqhK_bgUC zF9UzZPcNfITWh&WAFBSeeD9Qb(cPj8;;L%*)%U#F1*44#o(j%F_W&x2ZLuJJ>-izq zZEdC1R;aS(7{_M4TUdU`LbL>S^~=CaEEKhz+X~0!KhJFb`t_5R&ze5} zJv}?UTE4@z+&3jOzx?FzedW_D?=(imQJwm42d zBpvl_v4$y{mgxB2GEs}wn;S2jw>(?D+5U3&vmw7Kc1KL)uXJX7R=R zJJ}~+zsP$0wD+U)FYmv6`(;{o^P-WyLDJELPDyJW&+BbZ{H%(ex~J6Ju`Qyilx*us zk)IiAUQ45eGb*o(d%a%Gx4~0JZLT#jReKVZ3+EVie-$FcMtSo6`BYfzCnZK^g{=#{ z6mlle)IZF$der=K`I*_Dz1om{{l(8u&ZHM)oyqK;^|Tt)G3Q^{%=R`%cHuqqa@*B!648h#Fo^i=72;<5N32=jiLInTzu4=B&*7J#U&P z1v~ft$cJTT*^g9ep3*w$gYvPZ+9b4&_$lF{q8iyDVeYoRmF6eKPR}7u#0&k^q)*EX{u>C5vhi*4jC5xUf3bq zLZ!bvNFPSrSgZUwPFvxu+)lZFXYa@wnO`gCkKBU%3q_CpEli&wm7X0L9ksYhLCI4U z?k3ME6JKI$iQ)0zSQg5Q)XPO3{C~Nt=1g)Oaqsj@bp2|SmX{lSY*W?B=1|)O8A};i zS{C~wJap>vjLal0_FYKPi0ts$J&t{C0)) za*7IuxVAYDnT;&T(mzQvLJLX`NU4|5IdxL0V~KsD|A=W770pR_Um(AzthYpQue{B! zAKh2HUUwQEX+H-ZD+|<>#*gYRffm{jEPdsDd%c?X@4!vV8QY!khw5mD;n;wWa=tOm z|C_stYjNRjBJ)e;PRc%%+b;J}ZfsFl;kANB#b?|BXAOUKX|y>wVYcIkh&NJ05)LL0 zDz!1;Vr+EGh{%bu%YRa`xf&NgF3!!nTHM3k)KkH$=p$4Gi8RU{kaT%~@{9hNHbqM( zLq!kIN`C>lol`=b@>KP);|+BP-k}a{ho-rfdukW_SbWR1C@;Ebd{M`O$*xj`^_`WA zOS)z_Kg56gknftg$JQ$Lv06QTTB(ikr<0zSTppJaBgGsJ%_9Pb$Tgy7-!1;JXn<#| zx32eZ|G9voZbl~lSv_WHDz7&C_)q$l`Kov)x&L(+_`cWUt+mmDRI{}X-$mu=ukgD3 zQlF!J=zanpZs)#P7+E-`cui4F*GbpC;>Dh`zOP)*T${aJ{Vjb5jk8jT=)ABa;nvch z#ZNB1H?eJrhtW5pEfIexf9taX*L?F`ubd}~Zn&(zdA?ZfvGH7vww{%)Do^DVSU;-j zFMU>DA@R!1J+r*3@<`fiecOJ>x;pHi&^lCQU4}jLjPJO2gZozT`&5^87PKmUr?|cA zvU9d8(%0Cd_$GP=dUyFA``TkQGs7*>vmE~=3`^=z>V9I|_f@D+NB(2JRR}% zuzA$-_>Fp}%QUNRtfz`+Cb7t&+8<^e%XTTo`jgUGt*i8tPf8JH6QdzHx<~n^QL`vY ziBOiy%h4F7tCf^`mJae$y^i^zzo~b#caJ;Eb=OtL`Iq-Y_Y&_sUq>wqjp?uYI&+9V z!Dy#Hkt*8Sht>!WcYGXsuEd5CGh;uB(WB-@=7yfN{UTorj5H&(IbO+A-8TWXu94nqTY2;5$!E%By$ zR=TFT4!d+`AJ_Mu(cTum_5Q!L5yl(FmB4Ylw0q!NIV$kB?X;>y{v5G6>{{G=G2g}| zM|X=@P zcg=11PS!%7)>qo0oK^mir(61Q-kqtf)NlA#dR?AG&pJ;{_hZ)yZz9#mxB7qA7U&&} zS7fH%M9j%Dd{NC8veQiATy>AnlFy0q}Rc)21ev7YvDKtsd@bSwF43gJbPbh3lMFW}`2nUoFccm7eE9;A&uQ3PM>vK%%7-6} zoF4I-8r#hy28Z^uxz#&zf7bI;y`A3Om*#KdPx5`_-{OCw?b45+gE(VKXz2Eu2LgUe zy5vy~st#)`H5=m9*3w){b8~=xTYJZU$Un~a#9P^W((Q4Na;u(Zo|(kXjPid9%=2`w zz7ZYx0F$^v=>YLcn%va-f&E{*7XEWYyQt!*8qs5-k2^9P^+U)6EoWIS1|*{%x%|uc zEdCq5r@k*}shTldzoRRGuc`K@8(S<{RKb1E`knP}YilYTmzJv&19nHRsXg@{^=JF? zymdIQXzuEsfu6ITKfG`I6|FtBdq33sQ9E)J(bew-axFPhKvWbXT5E+h-d3bGur&*N z5;`&b?eG>6mBMy~#)jGKh1MUe_mqRuRJ^@^H@537^)}R!p5W`^FYnLSADAo1cK@d2 z$D8DHR_JNqDzO?REM)?%&2{=nzv7Gcq`T(2zHl{gFLkGQ4tTnGt-kvHvU)rkq(PSE zl3%hbHnbRTS;yNZ+qZ`{3F{da8oJB=(AvdX!Pdui*7lD5ZCe<%!p_M*q8V)_-9|Hf zmzaq3l*# zC>P)(v1CBsC-0XnN*U#MxsvRc{z6yu58f4@VEr#3^ZkCkF*TTXV7+=lG<{pVmK?FtMJf{YF5$)S5&k8|u?O6d7LtQ~nfxF6_HFV|WvsGM*{1YW zUdm^oho^F~5~t+L+qt8*+=SfgzoMOQD6f_BiT2ow4)(gGn7<{+m>Uteiyz7xL`M$_ z=j68-hu*k8EiR`v z$e(zy979VRDvgG(AI4v11v>a`$&`K1Z|h+jL^7*@Kv zWZ5NMB03`ytm%mc^L<8D3(u^bSQtj)yK@Qc^G9gE>)^v9^2wh^2U`nU);s6`sVakI zVUZc2_b-fJsAABCxU1G?9CnUNMg%oT#+lRL-P_S8w!^RFD)TN%=L2-tf1qnF;MuO|#jD_7oP+Hm znz8l5ljmn5q7Lx49F~hLe1AT~7i|zWoVHX({V!NEPu)~B{jc$48ihyA4AyjtG!aY3Q0S^Wb!C3X644q@;2gB&53!wn zL{EEZaWEd*CKjA+RC!zi+`eaSaoB50QY+&qe*SF(G5GPEGq+(?i|6h?v7|&`1F+!# zI|B@QZjmKb+R3Lcu`^Tw?hTn+AvQ)6-|Yvi=@BdvN9pAzw9p(Ke>|~iBha4rVnhkt z`vy@yukivtjVJnd*suP@2fh}O2Wfb)RcHP0px`-$Z`CI}mrT#X3p<>haXUKv8|+GZ zh!$Rhjpi~Ip8nV@Mq!-@5bMx0=$W(Z%IzjVj9x+ilRMN1Q~6>S3(rgEhT?+L)@J$fnzLg`?=gYgI->9@E;_}70;|C4}j z75JbVxcx(1{YheJGK0|-PoR#|cz@UD?jcy!8sgU%f~Bz;J+&taCK2C%krzFg-bGY* z11MrLcA$pXEE+Q7t(I5R`#jHx*0Exfuy=IkY6b4-i`An6JualOO*iaHJFo>^WYt~* z%d)grm;R<>>sSZpIEwGl97Zc5@e_bmK2W-aCGZ+>ILZ4Ve(CA>RQiYCB~!) z{__2Sax8UAv%rOXpxF+{Cjq~~jJPqsm!tnzP>Ml&(bO3|gDvb^EP5BPV76vHli`9Z zgINGtG3NG+X#mii%N)z#BR(A4PIpGW9E;B`tWhh8y;#qgR7Brg1JWY?eH@TW21-uw zxCpM34i(&Gb$8L%G1l0RU1A)4H3L&R(%%BS(pIs~-GEPdU|fQo@HCjQhd#Dr%{mIk z&O!S7j5!y8-%(hOY~V*cc%23|rGgD*nR6;OyK}(8kFBaIYtf0-Xh<(_{=YZF*~QUUNm>wD3*v|ba?nPA z@p+kVIUqS2y!?dNyt&X&V^%;WrYe*5cCxbjnBB6V=fz&Ua?ikxt}%mL`~qC8`UOtu zPv9bV@WT6t`L1IW)3HX5588}3W0iD+CB^W^CRn(q;NQ3$jPK7Hl*ik)6r=FKwT{Cl zzs2^s3CuXbm_!W<53dMDSDia6D| zD(2oSB2vmSAB~(bX^gikca{&XQ3<$s3C5j5FGbvUlYaa__6D>34=l@N{e*3}5meua zHb;P!AMn31E!2hsimM{3C5w6Og_{K6JWrY36JUCnwYm>PUk4!|u=64C5FGhVaCK6l z%M|G53HX{qdyN=<1>#@wi6u#bJH81m^ad`Sz~eUHsfb?b0w)l$Q8ihgIHJ#91Y@Eu z1L3ResJ~$A-3q>(VJs)WoDER?esJWkAXQ#x93oQ4&fA2KhXbV=z=fJu{7vO*BdDMy z{BZ{B(I1ZTCNpfwJxTl?PJEQe6tbT-x57DoW+z*Of5-&nluyCcHT1of*KuH&!>ah9 z{sQ3mGKkap_yreY#SH~&jeut@D7!lU%h9%gf(rBnKYjpCuK`QG#tUWv9>^j~#~Hrw z1bg;^saI+BDeb-n!^L_%1Q#CA<3(^&*okifaS;o2jXhAzQQUK%tM?ek4e0bd7{3K9 zKEmo8Q<11v6!#wpje0L92y@Hu+9^ay2bk+WX3&E;Ck-g#Am^s zw=#<>j5mY#KlJepvX!V|G8kFzJ-h)#KBd7xyf1M7gg%$@?K(1;%v+*J}n}WxxrM=||v24m1>w?2-oO5^{qTjI0H3Xatvt zhtDLz=emKhL!poQU{s~x4ptu;Z44*sfjsj8?{Vzcz2Gr@*?k8FUt^%=nefL?`F#ez ze8lJXps@GZd)~(D=N&k6XGT^hNQZs+COFgre6gn^gZxj9=)u*2{Qf3ARbY%F4lV+` zw(;K$uIkJ<37U?8Y8%3jdh_bectUnq@(a+0fQ?C@i0OXsqIERzhWs!{FHzaihm7 zwAmDxS7K#!cx5qnK8HRJfz5lt&2Qim)41;`1}WV+@$3^p2`b)_v);Yh>kRA{W&e( zW=Bjtn5b* z4T9?|e1K|zFM`Vpt}dit2YYEW{m0RM1AZ;Xo|D9V)xeM@j95gV)&$c<%w;PmQ0&Cr zpp}92QJZJPoo&I#K45J-?h`&wAz)(-*1smy=ir^lZrYIh()gRgFK>d)^})4j+>y%X z7PMQ9u?T#r1N2KE%ZjK_fj5GCy@GQI%1Pk2XsAc**EM;rDeq1}YVQi=w1;*@Zm;_M z?aP>YgV%yWMC5QK@Hz$v+ZdaT)+6Yn9FS_vXlnDTgOwK8CZv|~z((Mk4ql5`>3mk8 zm|qRBE+L48b(xQtbv=6P4@c++JjOxeB6_qhQ0fA7x-wUhg{mntEW>z3Myv?FSBJxi zYFB6B_zzjL3#{HV)>7;+hru5gV~C-x&b&IZt2Ye(6%Z0*ZO@7%f={S)m`4e?U^U<@ zD#Qh#gBbd5K<{1QJIz=hA%E23jzs!TrvDhc)ySIx=Y0jfo`L88#tym@8aV~dodS!V zLNm|#)eD^oNwor8vkcG?JSrNgqd6~ zY;n+9d7cyUUstg4EmprJlp$8LWpK}U7nyq)a#JU0pb2>24s5LtU6h8>i{WQySr<_` zY!mY3fAEpN;9Do)yeHt9r-0*g;BkllC;9#l>voj8F7xs-2C|`O#t{y#f44&BA z0=E<}KOe}ImHhA_ zA)Wh>K}!Lp+TccYR-`mfBtlI>cB@7k;jD2cP=5xe6_NQjfzw*fA-}_a$(_ZVgygv! ziDM^oJPohB#z@4uT~Fq1hn9t1t>)EbO;pjzqs^J_7ed&E3In4;Th|2iT8CN zydV6%%-RZR{aTPlZh+ta8<{w_g|Xry>p=M?Cij<2cI9&obLv>^6tk zNq4gITnO$Ew}5;;V=iR;f(Ki`-B)~zp*;s!R32C+^R6GH`M&U(w>U|?$;y_YKPzjP z%Y2^D=5MsWiq~e&Y(D|r4M8dV3atq#&BOX(ykw;1S*04_VKaC{Yq+1#r^IkgNDmR* z6A2vh7=hS3?}1@rFB7MQE9}jGgYSQUg)f0lUXWHrt3Kc^=s%J%wF1`@8My-(THqUE z=dTMD)qqY#RX(w&#)B&*;I`%YcZ{_<&e|NLy$if=a8+dRyTAyAW+0VTeC$EC;HP+6vhfyK4HCH`^YSwT z50DZ04RqlCKgr-etqN)2D*c=Tj%ztn>;NPF1tZ9Q#0Z4+QNXM+!G|0m7X~JUGhUJR zK+IU=(I{k|Pr190?;<;b%8beb$29)pX3xwLm~R#SmSesmf0U3epR-c8z}f9!#Lr-d zkhzbtwukupFMLBt4jDjI1`Db(k2GK;vOLz{Q)S*l?-mCI8sNLYP9d3xfF(JMIFB_G z{8PZ>f4LVEX`>e75_lnGCb54A`63jI(82UOz~C;cCgv!3)k|g~v@>DwVX+@a(O(k1 zhM*%A`hXi?-*e_2!pTLZg%~g=6mHW9+#QMZ{SI=7kk&iFwcGM(AUYc%(YDB@lfj1_q_g$6<7fGy-&ICHDP?o)@kinEuH zTgq^UkSi)f(_$Ao38X~L%>(pto^d>7mpcqcTMZ>Xg{DgdX+da|vq)xT1!kqv zLIP`DmQ^Sd)OiSLvpTC$9V|*kJ{0Gr(!f@5j&vX=YI2^Sp9}Q113KKrY)=5sJHYWS zGZAv0sQXy~4k=DkV%#0*DJ7_V_>VLFW!7{Br}tT$w|ihmXvw<+r|v;$IOd}J`x7`_ zr-xkNQ4LPp1_^W+XTe3-ybfbmcxcHcYS&|NU{$GsouxU}$SzbC?kDx(dqXLW?9^?f z4tTGR#x69De3{*-<=!Ru`!FmYeTgvc$M2QNV_lCnEM$ATfnDYT)|o?CX?Bo1Y<2Lx zgYUnS;dKW(M3DjdW2_n9p+TL;xpEli*A7SrLJwCFY)|3shjWRu*+a175^HdPHQ5e~ zRF8(6I)R-kU$jjD{N~I%xA=<{DmE6m$@6?fX(UNc2KSQqV!sFOD@TjY}j=p2GNl5%AlwtnR?C<{)F;OEvA^xwb;u z$}E;sQ+~DdIX2G^sh0f?Fq2CtgXghCc{AGrvg zgXagxcCjCO`fVa`4)N^_*q@G#&`GUwyA%aQSS8bv2_zr##0|?6p1MN}&0*|2XL#-e zS*MQ>VRe*da|a=tPC}qdV*QF0?g-{iz1DRfoMa3i=XKvN(-*Ms^cfrGyM7@?8rcBP^&nXduBq(p9S@yfAQQBu8a%D0Zzc~+8=Cxi*F;~5rfbj4uVt6 zVzgg#*Jx~56`}v8(0^OvTAE;^Z4BRROq^8=IW9wjf6LNSWinILg?2g;@7E2x*Fa+C zMqwB3OQcg}BBk2UuF!N2BL7@Xcu8|2GKbM?SMHku*O?B_8ASA0E4XvF;IGYy#Hxf( zTSNM(Nwid5t~SQ1){Rj#p|>=~(;siPeq61|I4VK2b?I+BbNv{Ye~SLIAFrcgje9wk=z6(E{4opAd+hk_i87P(KudtWTV#b4LZ!&AR zCU~a$6`lAlxXo#HAz=~U2bL^Adpn3HMWyZ!cxDp!e?W_~!KRH!C1RHqyR|seiTzes zv*MA7MBcVX;1oF+Xk{Ds?&H0T6%`udsbI~_p!V)NFkuDwAa?L0-2X5AzCbn*r|e4L zcrAARs_esZP`a$d&eMv0M`Y?2XQb;$63@ZNC*b5$zF**scnHbnDA$A(?MC)_&2L`5 zYtUVF_WPPpP#kimpdA_MG9gG$gR#B5jSgx!?@sLALy!oELXoquK@MaO78&Tv@_aI~ zM>krCL3Z#5DLDyhZ^d3Mv^3?Q+zO1l8l$emH3$3u9jHoV49msGAr|S*&3J^yFq+oH zNx2=Grm1Lw-ry-ANmt~#dW^C*Bg;W5ivb4Bkr(?hlBL`^1AF>(^vTQNH6I|kPJnBO z4B+i}N@NcVFk=aL)nb$)d%DOfA7Iz$h%_PeT#eB1yonxRAw39fub7iKZ`J1hDvTkO zJA{nd0~vWJ?TT#ipCSXS#*btR`^{h^=TC`y{FwOO@Atbn{#lacp8?>&WHsGS|u4t~Jc#?jJJUVC_xwUd6n zz#9B9tFfG(=Mi^04-VLk=S8l!vOry&+9Eh*2uq`|;Rso;D|}UGN(TgcY0H|7!A39Q zKNsRdBVykioPC5;-5K5dcr+{`CtL*MN=1fi&XrHVfN%Lt=v=x1U*Rv%p1pSnzgA*K zZZbzEu})D)e8N9Ld`{r$4)oX=SWO2qgILc_!Tq`||Hb$Ij6>Lmg`HoV#!7Lw*e|N` ztjO>$Dh`OO^b)JnkQHbIX4PP1BYBNslzmx&@nFoaz-A6>(Vy{%-`)g!-(;2BAS(-P zw9oNLeT1y4?Y>- zZe`X`oE7gtc~(aB24fRAUmDn#1r~|4ULIN+2?Y(|*DB1SE@Kxq{jQ8Zg_D^$or@Ex z(8&8)rB~4BZB7m%GiDx=bS4xTN$)-==3(%RF7)<752}F2LboFWvsC&MT0DchLWAcC zq01MV92+C@(?>KT7uxXaoWL%_5AO5(eQ@Fiv?$JV;@2{?Dd;f-it#d|TU-@d#&~#x z&^!wJXD&TtLOnu*CA^V*j4_?>LejT!*F`wZUe0PlY8O`X7p$4UCo!rl&ZlAx1>TFw z1J4;x0p}lK=M>pEF9BC4-$gD%1I<)PI7R~?CN$kufmdm;Go10+`K3PJ1uwfAJcHx` zL!p7Y6qL0u(b_dmbT@$F|MXTjfW=WpC2a4Pfw9P`EoNCr&rZIFaoVg1OsmtA(4Z&r zS=d>c@vaO6MTLf%tYrn(RM>)|SdkdUQjzs9q%UEe5PAvmzR27~FSj|n+~CtwJ{QxQ z1pW!@Zx!ZKi}kNhFNxqlLpWJyu2kaWSj0NTvAz+&QdB^RWzMgG;|b>RfRPHF#%Xqj zYqWhDNQx8ZbLK6yeAoEx3GfiQ@M54RteTXj2A)E7f%c4~mS4FK4D^J96UM-8> zpeA%zAKVq1H7~h~MF!4VLD-6YCmH@AD!d3Afr%x@iZ9s()@TQ(B$3rxc!XVM#rCp) zZDaOV!M6~e5O5duFUo@(U0E$5Ew+TKzR6nE<<~dh99`flHMmz)sc^H_VZ`kVYI@8$ zOz3G&qdENrP4LbjePwWUAG^G;>PIk>OrUoMXctlaC6#fxz)GP}DgjIcU-N^_Y7i@w z;LMA_e4)9qbM-Oj-pnAkea(nZu{s&7i_nkcas6_TcFuzpf;OMh%VV(qG;J_-{78zxgNIOq z&}j(m&kOn!S}dVEzQV|S=xOrMtq94&4jyGQzg(UW9vK3E1RpL0lV37EAxqexm<(DK z+NkPaLm8kd=%qH0uLB;7%%Y{h*AOs9XSDZdL+G@GUhxLd6&Nfk1_`aM=;tw`xW-(B z_eB)gAmn?|j>^+vz`X`LPe*uV6(BA2x5>0Fab3t5f^IK>fe#qlDO$;5lrQM<5HFEuq5-!M#W9UiZ2CBqz+hVBI!O z3jYSReSh)&8qg3NP*_7F7^ld(YS8y%<`l-L#eOB|N8~G&;n!t?YbExKD#2A1wOXFR zYlN0vtb?!(J*K@pzCU4v!kbHc*MeM8_#WM&FCVQ7JCv{#$gG&qD~HpM(BUQknX+Jr z(8fOnBBI_)F0V)6hwxAl?VjM*%luMI>%x006Dx$5Sr#x(m3>5LgkyoMSQVjX6nnk6 zPr&&V>nL=s+k(~~;T0q-)WRAdG@&MA5O!1_SX2e-6JrsY=z2&lE!mqZL!C{y7SA}H zteBgYZt(0yV7d*e-o^V2<4mVFaf%mvj<9W(W<+IqvJ+gfB{(LeM`2rxpqCnaD+iWn zz-b?HwD8{$l1&k_y}&mC+Z?drN^r#=bESZmGrwvR$ zz^J-#b;7E^HV6AxWky_;ZvtDyxga~Z3O+_AG`+XrNB4t}5pn=U4|z)X8Pwt_p)sxs zL1{jmjoR;A3B<2}H&vs~8hu))EXFbTh zMRws7@JQ^$LgOc-7P0fYpl{(P=zy*(1NYKAE4&bdho7j{BrFr6MwQ6GE@b;Ue5)3` zQ`kd=|6L{{6P(-yc8Kajr&*In%<&#Q{?8sJYD$Uyr5ex?o>%3OfNRl4D|)l?jGI*| z#q|cXU6NS~%oMeZgmvROpZ^A<#h!WvY!d!XnP8=howo;};}r(& z2yetP!72}m@gd)z@mFZ0g$6qm2nc+O0PdB7>n%RtWODWacb90z{7LMnJU=Ehf``2}Y0()t}^f zVfz%j@?I$ZBx@k7MS{0SaBn46LD*)6Ra)4k+tE$~FiUU&A%oXo#zNW?79b(HzvlIb zw(df)LTbLo>wg*Qg+}QQ;8_UX3Jt+);3_J7i45gU7-Ir`h?-SB7-J$Mt-x=hZkjlG z*cfvuVA_If*^E|r_6W`;{LlXYH`k)`5WD|>?1?v_9AWh)n>F7qfE(ega52=Z(nFmf zXVn>p7tBb4gVhIX4OSuno**n`XW&*9=&KC!!UbA5jcg=Nw1Q@ZY!$=k$_Lk3c+Gg= zK{ocfQ^7lh?(HBik)K}Bldz*5VjNF_L`h~8M!Rj16$c}?iL;_OS9JygwSl#;!-?~I z7+mNo7PpshrZPZ20WM|1PdNj5S=d-zLHxP}94|5N-G}jC)ewU{n&`N+h4B`wv06e6E3*W<8 zUkj(}Rpf+VZC(Nml;OGlfqpf22%2(+6 z-eRXY0d=ZW{}AVttE^HecZ%o@;VB|KNCn*q-@|0qs1cA*;5H)DQVn1x?6jr0BJ|-g z;J`(8*uNNe5m6sP6BUJ&7mMW61?}u=q_*a)SOiqiivM2ba||xA7WxsV*>E5t>|7Or zQ7W|DiTj$fOLhj^l6VO#rr-i%{}CEE^t=FVaVJ|+*T|!P2zAVk@U+j=VZzU|&rC39;w}@&3;!I~_ zMVw$y43O;t_Snb(_6>T)RnUO&UW>Eb;QI$?Ntc2xC4wi*c;Ia34D^sIPr-pk^r6!3 z4Ybp5kR|H@_X&G$FUwk`~qk- z0!9ho-%~it4#wMxb*Tl1&t!ykSiz38E$SK$&VF1C{n32* z?Nm5>Q}(|^=AX>Gy70dbI>&}07$CW`opVt7#>PQh_hHmHH_ zNYL_me5YO1V=0TyaT73&Wfa4J&11YU^V$8Xp+Ei}t6@FnBFnc<{XsxDde#MX~;( zMrJD1zXsiXBc!1XaEwxLVxdWPQq^W0Fd6~hh@$49h$KAE7^>6Cb2yBN?L`l?L$7uj zj9vo4BP*n_=b9(&{>GQfq3T03a=3j$xEXU#xY z_b#peNjC6~XnhBe$9o?(s?JbhCt|IV*_~>Dg>A^6E>4A^tj_@Q!mVPp27^yyEIpu$ z%9bkN(-O-r_7$7d30-Q0^d&p*V)&&qu$)h#4q_WBEd3L-l6=h?>?3QQ6Kre@O%4Li z619l7p^Zh}B&zTT6`bl*P2v&RCVvlzT!z`;bR#M_{6G~TA+c=)I%VLILOZvQ)thhG z4Hl7y4tw`I{5?umR1veVm07$Q_>$VhONguO&pduarsxDN0ux{x@G-SXs8(U-ndHjkQ_c18AJdkP12)DAM*1|e9 zl8lKtO9)msb?4>*TW36fUK%AZEUp^OIxUo-Cn&- z)jglJsjZT&KNa^rvR1NAQ`adcxfzr?NqakY*e3RU5+%fL;E}y%lFUwb;X{JBWN>bG*^^Drv`mXh% za!9ExkG6ba-q(NgHy|H}n`}z|I%iPBeYWd!cff7&9rwlQ*~V1!wfwcMi)~)$(C7o< zGovfVUX1xRYHW0L)JeyHuw(W$>QZ^Mu|)6aTjBoIS;p1g=_wxLF6-Uo>#V1ml~Q~EwjJ&y|;zO>l|4;zvyM*jlz0G z=Zgk9Z@H4Z4gIb4!GVsl-x?a48ah4tPSm#Op(Xx_?H$)8dQ9xQ5gQyULbqDKRkoVb z_4@uzF4MWWXk_usf?CDD7Uwx%xd-`o=${1Mk#yT#YjWtUu*|T=q2F+Ra3u@Gwn^Inn$;Z zxf5ZJOo^Qmx*@!L=vrHzZHKv2YNB8FwRgAj)N^ksNcFsOu5s7LIj*S@Z`6`@D(|bC z)xjYf?JupZ>=Cxha%ZWJrKLW@ztKCw9qSrdoKUP5*DcbE{&J=}2YEjCmDd&<3DRyg z!oED@xA1<^=OUKHR*oGTTOxXW%wJL49i$Mp=ctXPHO5+fwI|zU7Vj=@Q#hp1R@|ld zrE{|TWB=#+USoy)%sNxO7qTVH7J4&eXjn=6QMH>|OFC=hYU6#fM|E{Ab{F{z_ZR9# zzT&gam2Sz`f!qp3#^gY6$*D}Y{v0yI{z>?Q@H-A)WRu7$Q3a0Sk?)6p8hSjmgRP6z zOAhIt#x378Z>&4bz1g|TInf#BUE*%-y{$dKzhtgdSFNr%tP}0$$eXg=8c@zjgDox1 zC_T!5$8+61#g$R)E`C^C-T4lghQ9aQ@$T0WjKgLvOF-VH#@Jhh-VeDHp_7}UX4J1y zry?swoQ&-3SRVRTNDb=|<(oh!vywK{x7+=tYo;sJ=`LREy6*YTo#R_({AQdpla!8X zKu)oBuw7Q?stZ-Obd?Hr?Tq=_B41n2MDKmK!&#jikf%JQJe7TAv@f&}s#e|$G?)L9 z6Rer)$M#1di*4=0e+fGk>I(1Sa5)x-W;uQc>2F_ZPnW%lKhV@XtasL4`qq0c`>uQL zc`kYv`kVM0Yrh#&;D^I4bEQF4qi{>-rJk0>?Ad3GGRA9vk$%d%-G9rs&~r(v=N+eA z_f0oOYDCu>KLnOYx5$aPT>Zy7n*(IYuo>2yVc&!v4EZ(eQRt!23HIHgkyQ7sY274U zWM`acPSVcnJ^kJN|M_q6C3;6=}7?q4}=3AD1=5(WqWfUGobB(L!V}F8W ziQj1yYjaJ*mlm)ZrHy9z7-WzS&996Olvj^Qx#}u;vh}+9xB7;4iuHk-WW7S=l(EVm zR$bX9zpHixcV|+u;0MbdW0}-g_XTR}(=1>4x{@8|uCIjDUmr_`AXzG{Pt#AxrL~2| zMrn$^-t1$vGBXS{Fw{7w7g^#0SM>vAM!2INRIeIKm4ks_ly#OH(sxR#++QlG4!3Mn ziC}i!=!ZM7t2@13Mxx}XdXv$qMjrxwJ>l*(abnJ zkQPb}EhD6lO_y}U>?HTlzE$q&R{{&jb?FamG-E7Xsr%QLT8g2vVJ?t*TT}@vld{0< zt8_3eO0uPhcBjehjrXmQzU%5M?Xfi0d~TGL#u$yHIr>7&N^@#}XxzXBOVhv>xq~rP z)dH)eL4hReLW5cH$@k%j(mmH!LZ72W24HW3M3d z|0L}-Bb76O%}~_1zzO9$^BW~S5JL`}_oOQ1<2i2m&#cdR?55EhxOUJl$z!zBvP1h? z9iUg1hneZ}`}%CPP`9bnost?;x3;AGr4g=_2^=&-Y(0JRm3@J+#$mO+$7BD*GuDi;4koi)0tG5S2~bA1{$bS5JGW?Rw%lC`vNjeV=Pj{TOevr@%asf_l! z)s4QM$}#h!z%%NR4p*9(+bq)plPrzo1Jq-k6X+s|Q_?7^qIsoAy_NEjzn8kp-&y(1 z-%YjqTd8$@zbO@sCDcyYOt$087N6c-c}qK>t~Q!j9?47eq1GbbWZML7kK7}0K}s}R zQw?mK-QqoIbNXZDi)K0LP@uIw#dgPEU0#QDuSoX-mCUQunO!cA(5J|csNp+Esp0Q# zz3l%YD2;pBv|-&c*_{qrarBhHr-T1O1uwr`Z6Hv~Ffw`9E{Ed`Z7%t?Z8s zdFowf-{mV~_xMJrn+%WC(tIf2(Pt_xjH;*-x+5VcQ_E5BM$C z9}H7&s@Jkb>dj>%uz_<|ZeSicxMX=XRZ?b~Bb3=%u62+WPIlrJ#vWyceou+gx2W;P z0ZWNM4P~jO%a@IJ@nHSPoXAP;g!x2zSNF>QYMIL4#%XxKAf>neg>{rK($+z%V|~tQ z-~(pfl48vAQd#PjPRHNj>%a+1591f5j($USkPqZr=`K}nZc-imwDObof_#V1EIp-V z=4#1mHjvCfJ!y-vNm-*^QWqHQIEPHKj5e1^rV+2aqea;AeX~?U|3==STh-OtR_d~( zF|t+EO>JVfk)Im1EK504qCX9+mfkl;$m9>#zgBl>pHWkGMPQcni~fdM(_d^|<^MsM zX1puK89UT8Em^6;sU|KkP_AoyqAWBk$&>VGb-hs@KgYS+Tx(O^kQQ2w=&96_{l`+* z*iWV3S%GTu0==`;&a&M2QK}Q@VOeKRls__VQ62apr;hP~-<8|`FKyNRht=0+bK@Ut zwtIbOKd(pKsJ*GS)ep(P>nT>ZFU%HZ6ob_@Tl#CMhKi;*jM9{!!{YofEbCg~wrUqK(0~c)PaPR>c<@Qqud2y^&Tyo*})^ z9@q~0PN=)gQ$|Z$O>Z^(2mX9APJibASZ!%shaX036Ku;o3quP0Q!IA*iT+TYL?z$) zXrX$@ImmwV*&o_kW(MX`kEhU*E!8sG_tA^KN$r!tmY>XVmM`SD zG(|mPd8EfGr|~2#p%&@IV1W$(+)3?%D%v|_*J`fM<^1Qcd~CjCKjAbQ7$?m$J~yYM zAs7)DYQ9F}Q%8EPIOR;!he!edK@9NNmPGbQC^J6*y@QL?2RyQ}lT>Zd^nk2NbxoBStXhX!x-ewFr=s$%HF$>s`wIy^pWk_vn*<;%xsE z@88G#-_PoP%CF0KeUBDyH2O~!J?>FP+&+*?1%#hXJ2~9@8)x-idOmrm-qk8-b+shw zcZ}EWY2EaLdTT0YTs3b7hEN@*r24=b6;eLT7QQxOP-KUw4N)Vbe35G8+VI6;){sHg zVe+oPHa)`^=~?bvUi7fwSpLntN_m@ePvyqstE{QFzHcUfwg9W}p4adjx_R-ol=$~~A9 zol`%jN$ywqi;K3qV#ubvNo^i}F8b31BWY*yS1EVP_o%qGe97|V%56+s9Gey~%eLOK zP4l`J6}WQFzPg&JWev#Ql{>m{uCtoA*xw~EQQ2x+7wQgc=GabsASq;?b%p%U%<`{x z&nU{t- zTIimT8`je7Sa18fIhz%1%Z<(cBr7a)P{zvi5t$QS56Wv%RL+;6Rt!5HwI$(M(#^7G zQ&(4=U-f*I#Ht^cFHGDRw?87^>I)p#d%NGtefsMD%XZHTUv$d)JbPZ==;GhpD|}bX zcy&%lc=(%<=Oe2|goL*adu=bRt`8LZozAp^Pjj}s@@FKbH+Wh5MT?h?%mc3*=eyl* z`LmGfQEw--PU>9Nmo|g&JBjvM*)+`SQv0U!U)N z*7`+C#)emG@;3S%N~us!>^q55lV&Batx}=d!|Ky(+iNaLbCf+%@_om2b(!Us|NX); zc_|rNo~(V;^~wK{bQR!HEX{Uwed8{~aCdii*NeM{i(Q=H?mtd&*WeJ`-Q5BN;<8!a z9e-!?zI-78c4m6ItEEnzI#n;dW7d^?oz3R>#T}8h)4O#C{Gx+;1?=~`VQyk@us*~K z?!Ikae*H}Muev`k|BU=&$&AdKQfRRj$-NDg{0pLdV=lx-$H)nLOXkJ5E*%m-AY`b| z9{Q%R(0$o8*OO~IXM0o_lb2X9%RY@?NM2%qc##j49zMxAM&PZb?W|DcW# zO?3Trw{-`orLHqYdAY+2s@P5LdP0cUThZ#4ntB8b@ZWDZN(kO=9;Z88=q7dL|GIbD z`W2loWD0s@&-!)r=cKet86AuEde;*zsFheWx5iX1f3dVH#OQxbn_{@BEoIzpKF3bf z|1};q9trGWT(5bEuihdGB+dksnPQb~Ks))m(WZ}#7!YpR(^-le~5 zT-0DT%P&|T8g$g}x{jtrzMm)6`qe=>OBP*pKK1nWl+!XkTf>B~ilNgD7U?d((9y%W z&O6lg$=MWDYft44&FS^~>X({7#(lq=``b~UYOb@yy-PTfkXWI5==Ok_`Ubk!lAV-R8t$R<=8K=n|=H%p4n&Tm_gS$k|_1{XNPNqk8 z|If3^v&B)RaJMBRb8eP@#-8sx)8c>l<)qvGA@#-&as3i{mHb+k52+Q>#`M7WAHA9O zVTQ;D$$^Hpw8r<4!J*yF+(!MFbskC>=-FhO<;-wwx6Onix7mMlpcq;ZzE3|zw_jK) zCVEf0CVTnZq{2HHdFd&CoZpWB>i6wJP6KN@xthrtbD*SLk}Cf`%o%*g=a;cMZDg#( zDPfJov1N(g2*B6ZAJ?QaFUV8kBqdzf>3rl$v9m=V-9J1RslEQ+g0sWyfj^9Cw&bpKbWj{w%0;G{f@Y+@gvF|tWYg#Vc0mIqvk7Q9P^E6 z>J1P+D+~E|x^miV;~?!b{d^X9FwfzbC4h z+7TJ1Vs}Oi^Y3ol!T5=v zz3=VQY%L1970s|*vR-y4a$n`LR4Gl6_NxAqX^&}!?{f2b!zPW3^ppSPllYOI6Kzf6H{_Gu|^wm^Rt3T2PtD<53S1F2zoZpA*A{T@RRJYR7z$J>Dqy z?V?K7@r5M|n_8#Y%X)5d$WtX2FdMa}3{%a|eJlB`HhT+7Vd41j+WG1 zHq)G*@~csLX6DYk$F3#9U#7V+&i{YGi^JcQNQkKuA0D?nS|2_-V7f6FdwhHDo}-q1 zeW9t)lIJR@T-eQa!+Fg6R;)~ZVvgu5n!EX}@%Int?|a;|PPd8~OvFo1yn0s$>#qC_ zS$+PxerKl_{#}~qXI2`;*Txsd{|vo!AJ`E37yPpx@*t_3Xb?Ja z=^nl3JkF8tyft}V7=k*hDX2>r2}REGh-_t%bEvu02dLD7fhq@~CSNqXCYQVo@zF-W zEC!KXs2W$z0uSt|{1P?9;*c}76h46oXZ=!$b0)##xlahFuylefiHdEp^i29N{T#}*1@vpW z2rJwe`Xg0?sz~+(vY3FnNvp&gh&!F*XYq~s@%(ux(^eOQp$i-YA88fQ9yyUcs1=lk zZcNXo*W*ts)rp!zE=JV+4e~@6pwb;DR*-5+%b?C$9_V2jBHgFpW1NAu=xAgm-bV)G zYgDM#p|X<*pRODtdDD^U86^9lKi1lS)rnX^&HnIlV32Fjm$hHTtFh(abq z*|fi$jT(AKq?@Q_=O_OM-}AZL20qnWL@~FbR$3zTXkVia_Ww{_`3DrDNa%zIp(0)% z;J_);SyXwfhR9(X_;7tt0q+HLsXHPsawl>sH(acMv9W1FA=TCPnf$#$zyc=Y7CS9>Vweh+1`(P&q3Nm8pN?t!l!XekfN~eMNZ1 zJ<;p2)Bx!EZb9X}mXrtedad9rEkkbHboo2#QI3?_NqeMUQe*Vs2*k0+5^qq&Ybx;4 zjX;&VqUTnDBSI59kZ-3&gmW0G^VP-^YoVTXvit~@E*HVuos3-1p2!_#sD{)qY6>z^ z?YM)UTmY|js^UdISCwDmjebj{+*!T>>%I-n!d8MuCT&k-ST`kWVqE_q_h|$?NFdkn zMoTN4Orj#7KVr`DkDdq2vlDXrnj>>=EZRF7 zW4HqmXcr>cW6}FZ5d%Dn+$=Kcf1iS7_okCs4K)MtiN0*^< zsq<7T>L;>_6=WUv1LGhQ@$tj(`AM*nW}(ttO{gZ@$#|+CHIy1mm8V$hC2AR#COPEW z_Qq43z#ujuJ244(#Bv}IHZW?Y5O2W@>5JUnZO8|{fuFO;YGh$?&2c|4Bqky{F3GQu zE4>`^X)E%jKghx8lj*=Uo&a4?SyC3D9(TY8=?PxSAJjnKAa_O7s1kak7Je?4Pr>#W zAcd8{JWB%m;|lmDyV0j3QDIPv`Fb5aHxV_i8vyMwqW?6qM+(RFljT+L;kCGGD3}SG zG4EG`7yTdjDj~3*lgK@vjJosHkwI>d8_BJ3mvvYlexSl>IQS~ffLSaAA~P3lTL?_2 z1DFL_%3da)T`p~No%H4qW2n8N*28*9`5JLjIDu-?Z;6t$ul$!oEg0lBua|d=Bq9!0 z@}L|pb(1CHvck%BGtIwaHYL|o-tgE*jGwGjer}3 zjZ8*_|1#Ny9*UTD2=I`Pvk(VJl3fX zs8e48b?d95ZaS~z0nguzoqi_?e+Js}!>Ccn1+PzihgHrcf0Ac`=WRljgfX!FZO}0I zLp~&%QGKaQDjn8(hH6GL^nB_Nt{F?tBU_MZP!JCyOOSq8an#D}Nu-x#sl8+b^3oe( zT}?sd)pOAHPXP*72RihV$t}o@uZFo?38)-RT8I_E=$c`TOhUEIy0Fjg$djLfs(+2J zg0;pB4#uu_ACZkT*mMD~o=4#DsOx|Q74FMpUU$PB7)rK;%61K0Qxb~LS~3Uu;75=% zI1@~fM6jw*51gGeD3_-LMH&h$P*s`m15Zg+_xk@_qjKQ)GzLmK zx;W2s5>UQWU`;R4YlIr%gYLOHUw7kwRSsY-Ftdli!;S*qI|A%X53DN?{GwPOg{`p4 zmQjMJmB2?w5c8D!&@ zs%t#HnDObwbJk+ccEK9687p8zQ1d$+NFn(>YcFjF^x(R2oR@#BHPH3Sb$Rn~n8 z)|txoSM~Ce!9ThLmW~BDTLRv%I#!ujeAmR9P!WC5v^cA&1lE&}c%K{C$97?zSb^uM z%9m@vin@RqdkZag0;P-r5~*r_sqErR*xxz)|4ytYE3mF6VHH>eHr4_lkg9&uZJ>)@ zd}U)dP}P!PjhKV4z)(JqYZhZ(uEd{7$evEZ+PVY$R8?n2&7M)SFevOXHr(eDp0E(Q z6f5xQh2Wko0QR{X|8@!QmxuLO&E-(FMpZ7Ds%2@#UGAa1chT;v7@w_Z-D1QHcHpX` z_<91QR#l8r^N$l?2VvOJRc%-`uj3ieSe4Jb24i{vS8PWwTmwdX8~^_qJ*sNTxba4r zU=gbN$Kk*yD;4J{sJduwa362rEjHs0D~j8D3_YhRFsgdYEZ!;xD}5=jKda)&!N5Tc znAPvl)?HYw)?l1xVYIh^`=xSLPvE+r_+K^iPR&_SGd6g%;dybtr(lduq8HX+4^Ub6 zSMk6#QTuYfzL`8O)-`Z2Clb=OX#FKz-s{)|5hVQ&&f%ey>`@u+CNTQG;C&uoS2>F8n|tV)Kd{Z8xSy)F`WL^enQ^Lmv#JVZ1A?Ak+{!nw z&^NGt9(Jc{S*qDl5x8S%^hjmQF!W{+NS=Fb|VNOI~jMO%( zV@zVSR1GizUutfu`pHjN1JvxDuehtKCamW8su?IQ*rJ->sfD%ZV2v!U%tzEf)k{+q z*VK#>l?|_Eik3iMt4|5UZ((?*nu)~Wvuf`?#9HQAbMn3{QH$B9|ZoT-R+Y!9nY z)hbKlDm7Qzir!W=5mj|c_4)o-Lu9l?4+~PWB+Td|mA!Ar+r7oz)eNY=Xpsh2tNDpE zeyX#&93n!sFxG1Rq?##dM0@h#k7;oS^-Vmuvjgq_jkc&N9wyA22I%e9Sbsa>dl0;< zZitN3f(5AxYCPJY<{YZ|G+*(=JLol4XFC~DqOahc+QH=vBgSYFBNn=wQyQN`N-M59 zS50Z=HVThC3ta*=*cIr$D!q_%`B9!2W+M?O^rD|?v*g1{YsN$7NIHyq5ExQBgsrfX z{c@000_XF#atcY)7jVY$P$C^m`7oh$%i{Q5M}}hiFdgX^I3Y|`>d5&LEw)Exo(bN6 zz2&^;JT6zEaNYf#GfGeRiBezDNW}>eGPD+iIa0h?4(R9U96BlFjNz71G^Uv|Ne9(b z*(N8^fi90kQo(|ZS~yLZfl^Cq0l7;tYqpZhiN~lJF0?TbjU3(4!l%KuOMI_$QN7)Ddha>$pwy=89gM3f<-7>pXz3n71C*ZQ$&6(Sc)MFz$Y@|T-2YrDSGI8Ohs}DoleHH1~QpQ zCF>D;&Kt+ z9~sgpxK79nQ)k_B!y#0fzlXXsU6lqlt)~w+gj?jE$z34|#jesW(hkq8kh(~i^$)4O z@-1x%x+@e;{$ct`Z-jQrYaxvv?J4x`@Z7N`D}41YRCN zCzuBWebUs69uOTKm>F>^%o~yr5y`6-U-Y7Da_4B`{ZRd9+&KmGGG$Zm}bZ)><-_9Wyb;-;Ya-~p4O0{%F?cYvC z?+V6Qs(E)fo;%^q5CkPL#|+a<@rG1=KXWTX3+4*_gsma}$K4Yv@X?U1Xn?y$aQV`y;Tb6t5l z5EbkNc+}(TBI}9q>>{7q=3zeiz+IsO!>Wcv zhwcl`3S1lT%Dl|bl|4_5Ri^RPJ)@lQj*+%>Yctyp+X4Gy=QVeM_bGo+YDT=HRx(-a zaZP<~SzRgJ8QoA_BW)-406muaml!E85c}~pxMQ9`&kFZIcNcdbx52Z*)7txhBZQjb zL`jPbfyU$k>K$!nT`Z%G)pgUo)Gg94(l^l?^~-fzwe2;t*!Ij*>Ik`!Sf^By8%ux1 zN|>)Jg_%NG#9k+(Dp7gy6)Hn@giqK->4M3K}6c(2V!JI-7(u$xe6jo3^~ z7OD$IVJ=wBhlM6$u6S4)16I*;q93`EI!&KqYOz1qWtwlAObw^uHOql=&0+5_2Bs0c z1^&$=>=Fx=OYlNZOMRsP@b$p{5w~H!KNE*b|41Bsx_xpMYS}D-pF1CCoEg9hEWkYW z;F^ch6DW^$kXi$K+K*~HigZ^l54M0)aS$y~<);jFm5Qdr!DpZu4{c`JFguubOaRlI zc}MrBtJANc#I*}3(_XCfE8ws80}s2Eq?dM~Zc|^eKPp^x5jTrx#B8x8?*B&`0k%Uq z>|ANcSLuQrkP1K|Dk3vT%{D!(R0m_QD>w=-z=9|O_vS4$i+aH~?~M~+81|6+@cvUt zAL=yaOV2{BIgUMYpry}?KS0blt%z=nCESJ)}|2ru}H{A7IX z<#oa!;e{|;ECbZ2H&l@xBI98<7(Hj86&46Jv2s9)uHenPLB;M1(32oC0RGo{vH&%Z z{sC6;llo4TqubEs=|W&jZKyLq5>6r)tP$3Do74q$(EEx%ge5`=AsqFoCJ8rDq3WsF zMEWMZ!n?%63+hW2lK-IYm4iaG2Uyq|Xq!EO&$j~kAU%~7aM=$7oAQ&6iL1mrVxAZy z%?BQK6yx$6tf*jMKUJw)l$SEn9qGmNG`bZ%kgfyd=Ski7labx6jY+>2umD;dR239!is|Dx)HwIO0=*dPT^`M$ql)^{1Mfmrb~mR+EQ03 zSqhM6$PqXH48Omz({Y$4rS)jqp8W{1k8eMa*Ff~ zGb&BEF8nJD6*dSNLYR18Y%To&2R{^^kr{sHM|hq&u%*p7ukKJvf|vV48ZBAG)uKVf zAy_Cx9m%t(Q20)oCm&bd5|_v|)E#<1vx8ly8Lv&&KGCLYdF^(szxH3vU^bNT#{oJE zE5UksG5FoN!a(dNM}Y&MLU+EX3tL`8AiG`Gmu@VDX-n9jni$?ozSh+1?f6zLo|VGEEv;! z$>xM8|CI8@=HeQ`&i~6#;gfleA1yo-YKiIMJgJd<0kgk8Jl26gm4cO{GB3@Mta!%? z7^P*x0%5!GMwo(~vWvV_*-iLS9cUZk-lw%Ebc^-=hGfGF!*xRs!!iAET}|y>b`-Ob zDgyg#26oR?d_AtCcZjEi=d(N7v(2;9yOn#w>%=|M2e9c<$V*f=T0uR{?o1KAir#?r zuLD@$Zx~|&hY+LfGv{0PHM{_GZO+CBZ&%N<{E@~d$mh|volZky~5>c5T4aB$=XN_O zM@`$rf;Bl$GnmYN8Ge74=FG8wc2+Wd4;aX%R31>WLHS$p%_{6E-6N=4)OHO)Jl58> zTqp{$wY2^!T9Ow?wQ*Krp0Wq&NMlvgS40WEDjf`yJyvfxON*hBuX2EXO|)bZs1rhK zmh<+t^|6Ip7X1wVotL)hTdf~2GxlZ=bC**t#{bn_E7`Q+xOh#?poH#~P6o^gd8W~N z##6br(&-7}(%c+ZT9Jdw|eFLA(J z(Ql#qu@{=7f8N-ux@y@{J*|W=9c~k_mabyFW$>pZzOB^Lv&2=x`=2L*??k(#o!Zs9 z{@{yD&@HAmh<@HQ+k@P7*(u+YA5XuhemV4gXzt_O&q611S%n{(N0sl?USD#4^&YWN zpOn|cJJjAqf1T@Se5skNcbHBxhf(*^%+KK4JD)1&z1zI| zlt#>1FpQ>XJRf!cs)gZ&!Gd|NQot&<WjysL0HqJB6%*&W3?(6v#r)m?(-2Ny@r_eWlu+s zs^p4qT{9yxFrEk<>a)<7b9@koc;{sn6n)K1b!~vijLkV-!cIZv=%Q`2XDMGwX{vS5 z=Y7xkwF>AI;s^^4Zx!-0EG6WZAMHQi_(%UA{XcSp!t-6Z$L_c8`HnN-g?x8xbf!34 za>qTrIZB=$9h(~H+$-O zS-v#CRSZC7-8|wCoy;!L^wI6se=?*Qd`z`W4~;L4&kTNs-MXsUo9q@^As?d_;vdn; zFXSt7H@&QPllQ5|<^Aq0&$s0d3#D)dZ6)nM)x=7OzojAuQH0Y_yb>rMluk=Cr3=`v zL*$=wS1@vhk$F@y?Pe%Vu=bg@o36G#P+z2brK_Urrp-kT)H>Qjt|OW%Z>4%-U7;&q zntSM->|NA0s2S7vfimI1w$DVx=0= zIMF1X75|7v$t=~8)=2xHdh3g*h9C_@EaNO9EzJCyw)EIJKCXL3O5< zQ{5>qsiTgOM}eeM;a+jetry^Ge5~*tM9K)HQDS3}PO$wxkB!TK5gJp*x4SWia zlhfempGQ63PS`i|Btfbr_eIpWConY)B1=aJ5^;j=&_k{T&106l3G}KKp;ioPf^$?E zC13t3&xBs-4n&tOK#Nn9`vFmE0`7bXXaL{2E3lrM%5T}E+?3;S zB5EKHz_~12E{VH2l&e5HPa)2*6XP%r*s7{7^A$MNMPSRNl`zDfWSKxrXfyid6|k=u z;DT*|oG%8pUlA2Y*J6BEK*6>i`4OtJ!-^69JoNi`!~o5RQc;L3Hv=-Ms>RI(^Yk8g zr@xUMors*}O30o5fLz~rywe{}4UcI&KlZPzUaXlXDxKoBi-U zdvU^3k<6dKqYvWFb8xcUgSLG|>pJ18wRnaF=bQ}0HeW#BaT>6?CphoVf*xubp78|g z#fRin`5E5J59dSy*8wd+yy88g2qno}rQb+jPeJW&lNAkBGuyAcy|IBJUEn2|p4UA?VRJuyj@X{x9&` zCAj-?oH~-QCM-sl`g~y3U%(P*iFHRqMqzFwkarM?9Rrk3)!`Q~GB0uFJqh%DG_Fhq z-ux9A`aOZg)rN9p3-nk+#FECq4?~_G`ax9-Q|pW!MMU5#o^TOS2vuR~DKI@rnF0@N zGx~4`M(QBmX9lq9CK%b5h*yk71hN6*HkH83u7~{hoj~i~BKN)~#{VD0(U&1#c@1o8 zGJ2sG&cAAH3RS!09%k!aD89~zp2IZwo%7M!8|cG|h=y-Nu6QoK1Z1Zhf!N)EM{^J} zE&**x1NN@!=?=&2Zi;A$T3KR0u2icbsOYO&^|T!3VI$zy-7tqE&?71u{0sl9*4O-o zxBP&2`vCt!Rk+DU=D8Dg91Hxp6;RVQm^pPYLuy0+pd)&y7v^O{%r^$3br~~m17bkK z(W`^e;&q7FoJagXjh+}Vf;Di>1b9yK@zyKh=S)X^(edc*a=@F_xWhN}>|TuJTKwFG z>rP@EA7Q;x^_p7ZnRBpu&cOJz$5U0+8X0K!E=20vDltkHV$3XNX$jc%bVR%k;hogl zvAxj8dys3MMtp$v9D>#K!RSb^tP8NT`iL%9FIMI)11oQi%=lf!@r{b`l~tY9eQ4zh zSodtaqZ(hb<9$v+$+#U>ol5wsja4BLOo4;2C>FL~8S7Lc)`o3(=6+oFA7)n*LkUN<`1R#`9GD)leYNEie{p4JB2Jwlgs61mZa?JO!UowHyutIevs}iTBtQQB{nd zMU6%*Ifl-og29)#PU@+hV9swsT(Amxj`)uK;IZ5nV<;oOz7dM=J(PBGD^w}&O&kO^ zqJt&rp*K(s|Gyd59SIM599Hjs$lF+eEB&ypsOw-a*ue`taUQ;Upf?0)1-!=Fo`i)h zfJF|2WkzBbuYncz7Ss{UI74)XR!mRKnma(+n_@jNz#ezw_i8}Sli{IB@*DWzZ^6zv zC?At+E6?Q#3XPTNH!z&(K-}|*O5_n@B-WNx#E>t5_plE60#l%|FcI@I1u-I(uhIuL zGFO=)(?p8=9*WGH(Wl53R9;~>B9$@nHbo~x7ZiwunP?_&!b*MyD+UXnzXLKDdjqk$ zff-AZv4~*XQ5~HkZO|83PW&aK$+zT4%*HfwIx&IzP4tI~`!})^eTtkzSEe{Bl%7F# zXU0+-eT%w6-lg^ub*M*Rhfri0;u_gNSx>BlSKn5-hFrngz(TvoXO+fsx?BKczBKt( z{sHxf=SnZ)l#+z3#zb-vcsWzBI=>+}`MR=N-j10{VHACVrF@d1{f9`=PqG`h1Vv;5 zG~pA;eN-fIn0iG1OWmbwQvcB7vAe!Ov|i0djHEJ%qsRlg14~lt!@k90s@ z)e1$U_{iOq>Oj_xK((A{F2S7l|4GHKc##y;1}? zB*+cM&UKkM3R~z2c9t*fZZR@V`jSnsX0}yUK$D@3JOy^R4=0baSdj;jtHInFAm4*u z*hEG)7}_!rJyikODxt80+k_ADx-QB0fwxqEjNKnFJ62-v7)gY{M}8x>L{58IvKQW` zyfRU4f*h$vq#E1FLo`1J>t#662P^tn`6%*^Mv$GUQeaoylvv`md<5stIAH3Xh&@y` z@=X6DVwFXd4qp2W>JRxIZ+0(+9)O^?9YG=vFdM$rSP4VYWkfhA6t{*$VUWrP*{ zck-xWk@)P(P^cE$t<^Wt<-h-S(}?Nhau&}L_jZpKjK)-{z2x9h zymvfC&rFZ#>f!w5NVjirE_5}4{=gv5XkaGwwINZH_QRPUn2jH1BNBJ?C+&%_0?jwk2_=18zkRFSDiWT|*8%J)bK2D3;eBkKGrq z#D@lU)rw$*mvip4S==q$CxoihUF~nPQ=iJ{J?*U@EYlq)jKwD!-2Se<9<{c>vK}NYG0V~lGvkN7Tc`! znAqkaOPK#D>l_E%L+wu67kE?Yno@>sejcCJ#2#0(+-WE#)R=zaw=wv>4^55ZdN^P6 zJLH?N!Z2=)!(wgbnB^g$K{3!CQb-nz$ZupT@T_OJgk~kSmn|D6!C$@lccxU;G%&bYs@nZ9Pi&V=N+cL4fY^0q`$S6qx9HF0RnL7(ZyTT8kzdKy@JkQ(*MAiU=h-u^=kAk|nNmJw z&1W>b4Ijx{)HJai{LNb8BVrQMj9e~F@;-3pyL!8I&Xq+8xwgy)g-u-zguhZxu}*Nq zxL&cVVk${*3mRFi&H;hrW8Wv#jWP#6(B?BIsAWY?OSv4raF1r0@0zd~J|^K&UPMl< zyeDp&=uUfdQ?-7kFMj_sN_r_K;*|k54 zmZdeaesa&%oHM;;|CMGUclw~Wx93=Hse$j63090;qVs~~W#XifbX0Z(7k&2ncuamVHAeWYjW|uaok6CVItv@4 zqzAt8HI+M4`YkbB`dipPZ<~7>Ki0NFtZJN~GX{(#A6j}83fANHTl`4uV9AC}0V4uh zgp{Tf$47TZ*8#a9by~Sj4K(CyJ5udEp8S^uwDpdqhHaviE^6dHV!LT;Qux%pfIG&# zs1xcxGT@xw82Op;nr<*_w`d|xhWSSsOLt*Xadv&nm&|&ZZ?sl)4E4=7Jg2XbtEdv* zNA?p%1zFQwEvaklcO4tFH0-6%M6Kw)>!`$^5Jm_KiE6rgh7iLl@rP}wWm94O{LI{~ z`LsO@XiHb?*}_Cy64X$ZX!q1^?-LhZB6O2a4Fjc5BWG9=BWj0a1X7^7*U z_fR}{By_rNudZ*vxWLlpZc;7jg7v9=l>KO4f5&7Y4LRzO>??K)SdMLYKhHisgg?Y) zDuliuK+ty4D(q+CUys?lz^Stb3V)qx?oC+zrJ@$r`IgeTW3q4Mwa)!fIM0&nc5)+h z>xIcN%gd)KFB0q_wW7o29G`jgZuzE>;up}1%%9k;Y+vcMF2K`|n_}15zSt|<5^YxJ zacL$f95d)ObO&a(GMBF6SC7BWhH6Vw8nPbF?W=hUG0NS5+a>O`&vrg>71%o$KDBkS z9m{QGZDKoX*-3(MByi!&d#oU^gMN4cBQy|T@_r@T$E!1XLijJl9cw+eL5^6nyeN& zE;c{tNE98Z#LNpE6xPVs*Ko=_!@EhEA`P=OKqlNC;itnak5p!miL{=&q8YA9BWE%; zl310<_`IbHX}E@f+&0c^LF+0aK5#Fw6C;IwfwS`zLmh3!e{rr{(P&=58q7S^9{faN2gwuVIrM~SX4`j9b5}j!YWL}>e*c&r`?vSa2)*n7*tcQOBI8p1B&H-$ zBu;YJTsI0GMIreI3It1p<-6^Mqno#m&_cY7=wdiaF{zpZT3>byGnGlF*Cx4(dhHV_k!<2 zV9H@elP*DXmhP)87Atc3XkiP7!9LzL(Kf_>$FapldH!&OI8t^hZOKro1pNaUCKZ`L zwky+;c}y>+3Xpp+SY9G-hD29m{vtP#yU(5CPII@pW4sR^$yenQgiPKp><|NxDR5jq zsvO4oaXZzUKF5TxZq~{MYmOn>f0&uZj9^~V-{C#(Av19regJ=L7UF}OP;tvHn#Eqo zt1c}x7sd;5i1U_}>d3Fb-F}X}r3ujhC*6zW1LTa1qRvs-h?`%e_Jf}uOpPIT!*d{s z5vcPMrW}{IgTbw;8IFXX{HB<-mI-yaGw_4Qz#G)##D5!H*Ns3xk5HxQ>vR+J^JKKCvH=z%azO_kruY6m_|7nngm}y4S2v+oYo%$6`h3|SZmP| zmb!x~S&hjIAO)&oVJtjy7xFq-;+)E=0%nv8C5yL2dGa8&gebpz@?YqV0)5N{r+^pjn}aV0)l$_XZkt=aDP% z891Z{ZEr~C1FcY11l4L)BY`hHQ`EY<&x-NhhQJ%6z`Nc7UvMoL;+d%QH5q>LBC<4; z7?u^IK}V7EvK^jHGaw-Y;lH1Px3mmg@9)Sr3PTTlLeJ;J`#lTJMsIMz$HQZ(1wQv7 zMDCB_$xD%!a0|XnS70;gKvI@L{j@2({NWhO9YBQlgW(*7td4=;Z9`QAZ10|6g;zrh z6d-3EfcJd{c9jJjsuhrveR#h=L@1un0a5$iK!WGO<7UY9P{wV7kqrUA&=)-CO~4^{ zfMLHFp64SVc_O?ee<(H#LZ8h;uRQ>(It^ZNbByv#FwU=$tHF0~h+aJdjG;TQr$YGm zR@~NLuTNwwWtqU-P4#2wJ zf!o;yNML^;fR|wlsxItQSnMKTsW*VkM<55OKR7NG5l46e7J7ep+Bq2S{{g`ohMqcv zw|@!DWH@?bFEHEyQXry%l{Ns!{Ts00Q~3AZz`2_PEir)sdkeghB|wL2pas2wW3_;_ zeFST?E^s!Lm)jPIN=N+c3e0R7?Djh5&PBB45qfYY+UA0t{SP=y8$7)-?xZR(QsBmq z#Ak{K19%cf`0sD=E(2lF4xmnRfri%x^3xtxG7=cyG+Z?u_^et-;~01-s#3;TpyPL8 zDRW>E1HiIS>&aX2|IgsXZvn1%7`*B;u(KUNj}lS4ORcsy0X?t{tygPbG(vyf#HeY& z^e4&pXvVVd&TDv(w z-ChCdI||e;1<&3B4Co^I_%8lU(}1~W=6ojuLa*Z5&bs;nB!#h zVomf_CfYpxm|&2122GuFUE5(f{&>(uhnYQ(dc^x__tag<}6U~%Xssp_{yc#@Iauddw|nKBEk?296btF_Flqm z5h2=j`4H%iVnAw*xhmPV?H8J1wFpu7Y@vK&I@c|~<6E?F9cH0CPOn2l+ zP6zT=4v~)pP0$GKDDm)Eg;cp*t@=AW%vwSR}U`o zJFE_8VL=mME8X!m0Ao1-W2Wk#s=Cb z(2`8(L#q{h)Cw=YP|Vk1-&JQ>D*jiki}W6I`!QPn4Oi!3jfp`kTVWL2qt`+af5?Wd zt5v%n1M$9sRq!%KCrxGAfhnyAidh#ZeiN+9^|21sM3k!zT2~i8qwqwv&b+Gpt=3Rf zYb2-QE)UU@2k_o|(Q~SvzN#g!>Qd+6ivSiM1az!9?ou94SL^Wb_|8JVt92jFVc$E0 z?_aorLCm8L*5kq0kJiKH=40KQjBy?e>rxf{Y@O`#;3ks`m2{{h)IHU*a=waQ^sO%xBl2k7E#7Q7dDpb$|4*L@z8vt-+yc)~j(2 z4dPsx=nr*`Rbw`4Woxwxwwl3k18eUw^xIxMXESW>l!F zi;Om$ML(tBQ|p1q@5Ape@Oiaa zFjCvGf}TW=ZNkh`voQ+sJXJ?u&7O#bEvogd6N=v>62H@U8?}1TU-ZCh^vAnmd%lmK zZ_uibXs22?Uddrj_yQEqZqB+K@3&yDyKAC{N^+C2o&Eh@j|7(h=xr;@3mL1>O7_~I~scI0Z{pP{y zpw>(dMsKUS^CfYIDp=jsERwpozpA_60hZ7iF|fgS$|&?&ZTzimag#pBgjPCi~V~% zcGSsu)&M+Ttst&e2U9C6u&@XgPf;tGs};*sHKux)D@`$e&2i5F^pO_tPT(y{;BBId z_bIi`g<9*SJ>p@B*y*Ohy45<2WAFyeG1t^eh-!tAD2$<6&n+M8$!*x%GmO$Fj7B>C z{EM}bFCJ|lyt`Uk`=8?3k%&8u#@;yt_x-mx<_9%K?5QpAnb!F3g}>FqsMJ88Hp3OC z5Iuc_6V6kd9nNCDH9^}gh?H)`DN@y;qLqi>3%^0k`yTiVdPMuW;mooRdxsjgRqHBL z!+l3!~j#Q`XAPVLs*rzzp|gOA6FU)@(~;bGM>j(bbrRObT-W-;0r#Em8HkHqK$OBQmKSFT zclf?M&z%HYZYj5!d&WiZ|M7&7EHoDL#iLRWMEQ4PUq~im$Tg_uyNN1Ef23D3o!O^s zZ;eZ1(ALtn*M8TG(`2v)wt%)#@5yP1Q_Pb)OB2MOLT|y%|K-2(0zX9fEc6A-^$?hp zW>{ep?4bpOp0uLx#}JR;g{^>BS5Z1B))zfsO1>40;xKS8XGli${}NbtoJnaj^X+V zTcndpW6I0U*WWZNev1RY2i^{x5|HRu&1ZzEkNzLcacKO#<$rlnT&{zCgdDuNmI>4G6dwwI)Ir{W`QmXqCWNpM^eibkE2u%4kn5PiaS< z>x**@6mibGPjG#tFro_;&&08t>2#)}_8!xptxE4#TEORh2Oqef@;~t!e~ll=_4Bqz z{G)}fq&3r87dT$NJNyZo}tS_w?>~Yu|GT`^d*#H&Id52 z+IqKiTPP>Sb3q*K814Gce$u^GEEG3OcjPen7g2+8YyQ;^r(aTGh>$IyN%F4pOVmnD z!PLr@DSn=pc0YGMaQN6;Tc;MCE-GWaZkufzXH7Kg9<2#m?VD{_s_#!3m4CfXr_E8{F~f1gp600T{=sz+ z-%CT4Y4ir|Hp4c0tadEzW&WZ3h{NJnFn*K8dr)pk^p@r#JR6<2?bYr3tv&43ZS`zZ zY}@UOBh=a1t#hY9HM%P@|0^;FG^vJr{x`$g1$PL!8?hik(hN*~CuIebJ&dW#jD$~628!-yX@*_S2D5G1 zy-W>uCF`SU&UV4ytV{*=GEkv*%y3!;vn_!91@A0d`XRmpf4M5ZnalI;@DA~I_pbBu z-X&ZO-bc6tEu$oO4cFj7ens}j3!)-&)l;E5a3Ar{i^v^6fokII!Psd^jsnl@7*LAe zs9)Y3`RJW7U#pQ>FVGuIQ&%pPz!7GyGZL(R;MVxw()KjX8 z{Efljux|jqRsaQ&e!#5Wz@M1}f9wNx%<4ELOvkQp7v9Ki;3?;UIxL2d-y8b^g?*31 zS>PL1|Ml>>X2Mq;i1mLTPKPA+;dHcq23q`p%mp*95PBcm(0U&zPp-nr;8`&$5et@^ z6C5pGekVJyTa<;Lz7#&g2b{^8VSic#FXjxeoW1yM0M1%@*n?uQ6P=S;Fb__FZ?ziV zi}0O+)prQk7;1Ia323pJ)!q=O(`0b}+GG8s$PM{E$gh8jbHO991P5XdaLf778TnY8XA%xi zyBiR=FE|BM0B0x(+?~7FPak3@eSuwdJCLz~IPJutdc`^HoV|c1M1wU~rr1jtd&NsL4>_~WcbAhdFgO^{0yoJ5H3~?CyD+yLdikt*JknZwYa36!fJXwPC zWgyO56Yc?{zd4Mfxmo9s+N6Njim9fa0(Me#1%TQD-I$nkW@$H_QUF&T;ejU#3&o5?qF zUn)rfcbkYMrxF)P=xxwYhh@%6M&^Vxl6fxtVRj2!ne}{AX0g~G)n<~R=S)kDp`08; zo{>jUfyz`Msmq9FB$ytQS$@LANY&}*vWadgY}8isywc~o9QqsXU)nERJ7%8bAUlFb z)sp-!FC;VNXsQufAc4nGmi#D}qGrg==|7U0UI9$77Brv}$pbjy?IUW+Q|Yd}L9>}# z$!_IWFhSyLs*03B7YY~IcKj*LGyW1ADDw1j$)C20X;de9qOzCVFMMUcdnDa3_by#u zZzjt~ZOJ3huDPxxP+{=aO4GRl$;L@GNB<*rp_1h|(x3Q^ zt3Jr>ur4JMgt(3U;fdE?;S-@VEeR(y?Yzr%B%epQkl)#n?aWoyHsDWF$Y2+L($j>; zbRVf2`5BhZlMh8ByF+Y2^YT=xzx1AY!mrc}=0DSkz{_vbjf7A1C^3&}D#cN^1L_5BA@_>6*b96=`iIeOHD5MC{X9&aLBuL(reBoupn={+>_lmmHsWcfHQ$qZCf~%E zY>>V}tC&Hi(Q9!nHB=Ij^DIgsgd6+S4V-DR36~TKu3SZUA(O!|TL84|0RiS3kRt~5 zcDlo7JP7=`3ef>8zJ?fp6>0$S4cwhF!0ETae@#KnoLBODA{wXw>US&s5NCJ~mam$9 z{v0RHTfh!eF*<#VRfq4&cBpqu23p$)|B{GRu`~SndGH*!krKfMk7 zv*z$)8UXXrL2rP=Y5O%+!VPHYAfSz7faRTo-+UGSegLc35$uU~;dzF@OHKfOQwK<5 z73@N4E#(5dUl#Cf37&g4_J^zR8!zFrH{eI#LJL&fd@J^|18DKHVnpf{5G0k|y9Eg0 z8thklam7dYobT~AYNg&npc^W?w-)@b4)Bi}VP&j{I7fS|vCXlA4FW#OT)ix48K&ZZQmDOds;+EEEUr5EGy2RiJ3 zz%~?6yD9`et_dD%H2mr?v_P%utX3GS1RuEze38yTWIAEx9*5PsH%HmlR z$j9EMR!}Rzs;}S;e9+z+h!^aHCw>Gw!*uk(7Wl=DF+#1-u9Em0fwRSKdJ;20%I0Gf z9*XR(v0GikiJ%C3Uj?k9tMIo*@IZaY^ToY$2JhMiO#jQU)_hpOBjAKOv`?+~Y=(N+ zb8r+t6Mw{Q@)WT717SxOfKJX={)Ly>0sG%KDOs6F`VyDrf#8+L!7kgwy8OX%drwbg zHF7$#x(LiX!c>4kJ(TBU?y zC2NkXTrFZch-Q%MuunE6e-ewxSs0TpV96ybA*2=Onx;xiWUk%?KRg*b!e&GYeNg2h z9f$^_jKTg(YKN07@Sy=z;>K2 zqY@_hi2MNcq}6yEEma>^by0R9p7s^zx*y2xsEJw)wa6X{EiEGMP+OGB$TgTwJiyL2 z1~KmwRztPm#$7SrOtAMPWe6~092YJ*rah7^1FGs)7@+9$$ za83-8&x(Ec{oF@yvS*UBk^PKqt^J6jgMGPefTO(YwY#f#FTYv(CZ{TQ^dABr1jh%K z^?m9;B{VYhyswXbBs+#3&V&(5rF@|Yf7EN>S_oC;?NXkw33U(NF@rQ8nIp6p(ZvqP ztJ$Pnksb(%LK%4Oy@ZM$nwy_rk8H_QXGN+|fsUXsM3^sK z1+pCrEsAW}p_GuHaPwX1wgW}$3XkP&&6$+bJ9mA-LTj$8oX|s)8+s(x6u&GK#cohU(Jkcc|_&742Vu9OWV6PF^ouLgv2*`i4!& z{g~PBlp0bZ|G-t=w!|{9Fs)#3-o%`La_C>Yh5N!Fi_3#D6`bw>N?X6^Gfqb(^mO~UM;dAyc?3po9bBzMK|A4)6hnyBH?E21`=UspC7Sz7<_=1^KhBldYo__066{a?|f z!Yc)N1?66hex8+ow`hzvJMxv%KQX0Dhq43m@=_ngO^>N#8*eKeT`}r_CBqhuDN6hx z;rA$))W;v=@D&u=L(Xr#?fgwc541d`jAdPPQOtDPWVNewSlbXetKE`js?qo&CrRfb zjRGfKzZbn;_&k4bL5IR61uLFcfBr||&z?lBvwAA2bGh|p)ZC<$1u^X{)s#%jud)94 zQVEXagQ>kzs>F4&d=t4;+~#?^=XLF$xvPc)Qj+O4WjcI2Q>sT4Rf^g~`Aq#=eIKue z-^f-uoLUsULrZ)seB0f1T$5bei~BmV3N0^AK6~)AW8pQ=ipVo%LBgMzBg8T zsN^RcD|@u`M|qplc39su=0~ELyHc1=SM~>6>YC%A1n1u&aLcOaqpV;YaQib(SuX0S<~|BX6}y-m^Md7 z`g;&LIlyIgPjK%K4%h3;=ZJLwSPq4}zHvT}KU-Ozcr|fzYIMw3^0Ht>^hg8Ad-_;8 ztlbV@_xk#nSLj=QPX7qmxO8-60+lBJ)+?E|HKO#>_BsuKrQ=BQV^$WguUd_kMS9riuW_5Q8;WBJeMij+}Z zlbMv!E^3FmL>g|6#2!m|o;@h9TWVo!J=4Tsk!P5*x;w|S+oJ?dg;s_eBG(SV-@Z$z ze4w$fR;Z)-r`a5$<4()Wt(~;gT){L^X&5yuF)p)Fo;hn`(xRv`T1$VjJF9qtr?-2e zcVEB~>L1BRR&FRcBNank0(E`EB5zn9#LrE6oSGSPS?(Dq?`z_}8hJrRj1%e&y|nj7 zXG+nJg*_aT9J7ns6rLzNUf9o3*8i8bPnnmxJokCJt&}}6*4)S3L9Sr)B#zAZBM`NE?`iLP;uEJq9bqXMJw6W5X8KK=99J2_uvBge|I$gVA`7v>Ga_dr4bE1-K#U7QO`G2AMg2P$p zeAUy`Zw(C4eOd+iTV+aQNn~Qs>g^Ve(-vDtroWVQC~INtX(JT=#}OA86-kwy(c_eI z#sl)gpDC>SqMvg^ahKv&t~)Oh?e4;+#UD^3<*$@orAB9UEW0bwVQFK1BfKo;Swf$b z?q#hR$CI8!zY_8J&$t>FSMuC<`Mt*ial!BON}QSMa6;RmZS%G8zZD)GX&*B^xq9lM z%tlea%DI67juHO%LQ|B*wvbZYSmYT}bhw~=!2w5F@lWiqpBLm6<`gb<$3&d!?5vZy zH*>!(9ZQa3s?A2i3030imEL;W9xMrd~ZocaYP z#8Khzy-x$v{HcaNCO+wO=G*BnqJC2wd5WE5$R|@|dSt0)+GiYb|KX@pu%_Sx$3({` z#Rc~H1!W3y>_w|qA}df>Of!pIcm3u&6NTHEMf8Cc<2t!=et zCVZNep7utWKd{ zeXhJpYNzZCr;_!#rEifc`g~Ij@-`G_eVKbcrgqE`d9J!Q>C=Q?O3lc5nD%ADA^l}- zm~*82vb&zUabT)zWT3x4C73MVG(J#IORe$VyYI6`UNTpVPfA~%UN!NirC<1>SMz=r zTx<+dn<|6#B>!}0XM1$v`9j@3!rs*0+WvOoP{%d*!tl>>r>K83Yh`_uot_yLdo^Z; zTp0aZLQ&G1+(~I`Q@^!tG!ny(;&Hw>=VaeQPkr~#L67%MO*d-E+th1Xj&?U#6fBn9 zQ8yC1rQS#`hU)G2Xf&c^iIoS}&mVmDadx4fNnEwM}Xvdql%*6~x7>GEoiEl`b$ znBVx`C_3mbaQ6;naSEGeszw&qhN1Z2C9Q#aG_hjJlC(t$esz^@_4W;|3me8V)nasx zoN{j~{<0|6eyiwEVXl2tzL7t*uvxL}U#Rs^Pe=clz9VBu=JoWG@yp}ltkn|Y5?7_} z$e5k_ds3G9kork*z3;krX7L8!j-p~uXYUOEczvWEZ)%1nryHk$Cg`%(#($G|B*mF< z&pb-55cn(nR-}n>UM{0A3Agt2b4_t{aCCCKVRsfjecmhoP{Dwr?!MCDnMzg5k>tvm zU!?0ACa;uwRQT0r0v#8=DMM7fraj6 z&YNzdXo>p|cSfKf^q0O@Zi>EPa`;@No3_~WR@~chUnjj9^ONNrX}dPrxJmZ4u%4*t z{wdzZo(0YguGbws9ODXKe=)h>&w?q%SKJA~#o90WE9!d*1sU@)V@prY+?Sjfdnl$< z{QZO%sV&lOr&PCfFxR2NKp9_@>!f#C@i5nqF0W?-R2TBC#qG12jd;%=nuNX|&B8*MUolScUe^uO+Y=pEo(?z~g{m#dfWNMJ8I zm}b;f8BXljGW8uCe9Fd8i@j<+r+jJz(GGN@;$U2)ePE?K!Sz9Ldhsd8f}&UKy$b#* z=x3LTGu@y1CWRhG+DpmiajDT+9df=YGbAe`rFZ=N#MyDrl8vO8l&rYlO*IsI@L|C1 zzU~|B%5qk5epvjar0iX)F{jxxn;Z%$=BC@rf}LtY50f@F-n@ckXi|L935H za|fr_QL1=yQESJW_Q{1c?LPY(#Uos;y)y$}lRNNB`9;*2^y3*vbE}mxWi7(?dL?OX z!Y9e66VJ!jwM{S`)dqxL@pbU7^uF)Rbbedh!ig=4 z{?)Dp?Y{3l=Uh8om5Zko?{+?Mw(-mg?hRL$H(BRd-O;sUBhlTWhDJTMw6!c$`>ACa z_s@}op$vZ+&je>_N2IWqJ>GuZp5-{|$aC&-Rq{0TP7YKGf1#ICwwO!Byq$J7YgJB4 zndDMkGZv-Argcx)M;^uH(H3)UwY0t{Q0#l^+3otsb=oXz)fwuGQ;vy zbdA^< zJKsyey4ob^FLkBmVeHSTeX=U$)-Ll!skp4nj0$PLB~*-C9M>RfkIAgOr`HNh^Y!z5 z;u`O4>+0>S;~MAg=}Ql9(*9NYTPsBMjj9y0GU|x+SIaQVtLi;${FU@TXcJQMzi!#N z!7;6HDD!U!kX!ySlR`wT@50-#-e>4ZlE>zQnZO`i^a`t(EOZtIrg| z5A&k2QM*SDM3v~DvCgHA9YtG<$~#QOEuE`fA=e6btaq8Ob5J7_)YU(ugMXGE8e4aQc9D~x|9Au6tW zOqJ+g;O*xbRRguQI$k+r+}0*X>V?h(?gjD#zXqBHe+n)Q>?X%noImXQ)Bk5+a4<8p zFXX4z_wA4x9!93MrICL4oRmjnU6u?Iui-)SKv_rBK$>}sd7k+qQ4WL1nD(`Kf%%2$ zJ#%yO2c{g;VDwql)c&lT8Om!)9pxLej%(26-erWNj0EE~UD5k%R_%*OXR50|AhX&v zqCTIHr>0sYCo(ePh}6)wX#4aIc%F(3(+OyjSCLO;Dmm8EsY20<*KxUkm;hl375UFk z;YpuQHi#j38;(UYz8}rIf!)H49=tu;!qfPqUq@$HUcQW`vWD!%_x}ib;i_mC58;K> z6yM-W`g$Uv$6)F1M4Ur}d?_vQQ=W_dUSzqAL%+Tj?PCgANCH@57o(p)fpxo&5lckz zZT$#!7C*;o{5ARR29aMx#}3^Vy=ppMLIvawYf6Tjf&9IJFS`kNKgW+N8jO5PP6Lsn zU>)}L_s9tFA-QD!##8GRv})gAsd#~R?>M}d?vNv=4P%{3?8NI>e(z(e%Rw9dEl~#v z#!jjW+@{{em*myijL+`_y%~0ufAOeYhlf%~=ybmLC+-BX4Bk6Z#b z^#kMrTuwfKLOmH9#XiO>vPYLipWg?o?;@<#|4EOiN^uq4>q;=(8P7&1{$10Ey06Rl zpJVTqh-=Bi&rA50MbpC^aGpl3hHhBe-yjx1L_F+AH!n#W@H?+-B$JJ0AGY?{L}ia4 z2f|u3xi4XH+Kx_M__6f_Cas*eJArYnt5(T{f)PnukBddn&Y>2 z6FX7!l8B6jXwLt{zhEV?8SgRP=GY}dU`0ea{D_wJ9s25nzuT+e;6r@y|H6(WA}Ek3 zn6Cq5)elpRA`=b#eX=Qxz|Zg=R;zb`H{LjmeSRvw2``cLr?vhwR2KpI`LyE3Gk7AA z5WhmpCz(4ZUJgfzh?s{xXc+c~ROw$VM#59~EAF2GB%`ql?ZE2h#3Iy#RWb$df*EAM zc}(v|q44*KeV~S}w1#;dCN#Bpa^GUC@w8y$uOAj#G8!?qy?EdCl~+m+$j&fJo{GQR zXtky771JsGpKxholv-U`Pt^I>;ZAs5Wa$e+KZhUcKT1dS*R%uL`^1~9W?knRhp<<> zv38{xFUWPYOP*lVA%8<{^)s?V{HVub0qSim)t*r2V;eRTtY6goSc1LLgN3B3z8Kk| zNV#kor7kq8>T{%-ru}4yn5ET|J|+J~0v2)>7B;DhQmlU1n2c{gBK`*lslr_WyTB*X zeQTAZI?+E!4ZN06D`^z=@81I#LerHk(cR5ogl71=Q1jMdIcQrK`7byi7;7ZRvy^N4 zZtadVAHKg|YOU|lWjs4mNrpk~8zN@q;#mRkqLg zRW2t_qdNIC$xTk?ZRXbI|J3THPRcg`cv)KT zChKlY$D=L}`;-Nnky-ggnJxcD28-@SR}u3lMQO$QLusDklbqx}zM@AfHx!><3qO;8 z8KZR)t#`$5>q%3ad@KY2@nF^?}ACy*K-U zuuLULoAg|5SLB)2TzZE+r?JsS|BGz4qC!A(X_XvOUsWE-i;$R~D`n*oc>c^a_A7Db zF~(zUODNswrMjr~^p|#zD7rtCrKUGcrq+A*HElx#@(tvg%^>-NnMW58CPyS{j@dIuTkE zD(zq9+vJ<#uj)VMujY~6OFiAZs{--b(_mX|aJYHsMC7gTz3>P2AknqWSs^q+nQn382l8iVa^!mW z{m4q+Snv1PgjQNETJubGw9~#T?(3djzR&#geOHMbZsJuv-?&>Aw{u#H-}Q{~AM|ez z{}sAp1k@IZgDM{?eYUI~okr%k1M2PcW;xM0QAzuwDTr<=Z~2Hk18=xKb_{fPiF7el zi@syR^CWo6H(y^BoTn88s_04T4@je*tN(+CssDQJ=JHY>GXuj4`s;BlNN8lt=i0W=XdYgLp`yTo$`KGx4D_-bS z-Mf9ict^VG77ey1dk%!0N_FL4%+8!Ib0?MlJlUiyH^u}v#oE#i=GwColA~<5jiG8Q zW0-!(|IG28^Okd{-p1M@`nj!#tb{)EHt?+rX6Qf2|CnF1ILspna!w7eB`#`IAUCkU z_no_&bD8riR|QWkPp;=@M=!^dVvm0u7K1M=31#Nw?Jqq(^JQ(GTIekwHy~qDPM_@F z2@h<`A`dJx<%Pyi;SKq!vx@yzXfPRR+eTUNIz8%53+8CQ5V@J4#;HZ7zfA>lCu2^i zY;a(xOei{(>HC39B;9choz|hR8?3+`#L>(xHCA9=?W-A#W!mLT%xWTE=Y$g*(=_+n?3-z$qhGT%l>O1GqIVjv z1cyCqR#?MzCh}Xeb5O-^hee-&)#xczj2XNq?zd+Ybc8^N1_Pb1@bHa9d$zHKbBwT!!D zJ7F0~Hp&tD1!I=nM9+w1hrf$7(CUOoc`Fs?7N!+6E-F)e&YfR;&E;_Q4kQvK_=Zvx z?atNGFXmQBtQhrf^bD&fy-7-iFl4GCXEM_%O=XNA_p#RPS+Zs-CP z+iFP-j4N8iv{qe92L0Kl^``(KO(z0!FF*&w`6fI?NT)(L4w)d@T=sQ}E_q8qh z@Uzco=^IVbF+1vMt_b>lNUtQlVGDY=P2b)$B#qq%Mv*kU@5Oofj zzbY$@4-Ky(l_*4;F|YW=l8{ji!8;@o&BA6oK4)DUAm{VZ$t3M$Z|cberFzQ z8IZB5bnm>=Wj3W}rL0b_lQKDVMAA&_PqyRMp6cSL(o_X~lZvnNJm%oZz!6`Uzz5!( zkVW3A+>6SKo~dq$IuVZ3fLeCY~eaAcpi3*(4 zJ=Z-wJa2lBuoqR)RvAZ?ewGC5*D)_;&d&8`e^h!)rawI^>wd;RsqVy^QGRP*Tb`+{ zS(D}kTlr^GkDzk!o8b2Z)K2xE36+xz)OSt2t#>Vrs46kp_LW63oj}H{BaKIs*D~b7 zp3uanc?P-%xn4NeI>)#=x?giYaUUc&{~4C0j7S;1ms~+zXqpo}GIdy*BmF_n+^qbp z6}cy}ov9a--igbL_FK=GOUsADS$>zNgD1(|+kM5kv$(aZoqukyTV%O3ULHnWVBI?3 zT7fLC^UcrH9MfG{)4GSJ2Wt7Idj`AmiycK5i>f*1IxaZo7wR$6_xvT-kq#>GkT^~NxBtxFzSNoExmm3mggVWdB+Du+wI#6 z-zs{;Ip4j~pBP#j87Y0OIL(9y*q)QSXPTv-xvVlm`baw)-0Uys`N3JX_`H3*-E9B2 z@Pxe!Ii=b#sPO+V$U$K2>-iuykO5}O)EB`ug15aaj0?`d)JQut!-}pdGXi4}% zq$WP-uMmwjQNORfqaBY7jf@Pp4mAr-3_SK9;FS^B7KjA9!g+3J(Rle?;WSaG6sj9c znkmz4GS@TTF@0m2iB>F3h2nB1pIX86k2+3m&AFC56E_K72mlJj4t{p?aPQc zvYUDVso`^>8KDNDQK5B2Fj>N1gw@FRWX-*!)h45Z6QA~8oVIP8^9OQD+$7y2);`QR zYB6!qUGXTKfPd9UPLw|p)t*UBy7p)i`VdoJnp00L^3uL8S4H=djQ82UoE;}~*6fMj zUS0eSU&ZUM5oenR#8)oFx4ad;`Q?dnsLyGwv{8+$cBP2?|BiEPWqboilZ(M4H6ea^ zHWf*`prxqDet(5iF#gP(oJBphukiaE$$9%%JUyRqZp{b7)s~aZZ*vOLZmd zKss3wqB--|Cxh-?BH212C6^--_W<#`qK4vfWaZJU&+tLHskYi!6KM`x@|mom>^~qTASqreYsi3yLM3SaAuw z-bc@J91YRi;6`Xm=Ak*5KbE!x}L=AJfBWeD0p1<1mvGBESd^<0CI33K}y9 z#l+NY$7^*p|7j?kdI`lzz$)b7}O~)o+nF_sh$I~>8Cxm~07jj{=Led$I z&#tH*cY%DbRcW;q)X|lwg;D5oejt+Y3fMml&21x+V-D>uh8m_4ZP1Yj%If%@CZo%% zrw-E(kd>KJ5L(DDjOkK2W2m*8QkD4}uMg$az6f953+A9PPybH)2;HKp{}b_1eZZqH zkIXjqL}nSIwF2Vt7vLM*f)VxM)c3NSY8;i*@GoC&{7R0^Mw}d%%CG4c1k*R7U`u;G1@&ftesR= z>Wh^AMtOC$ZZdb(+o(y>SIRo69{a^**2ONeiYUqx`DN(`rK9l`vO_B)TFKF;K#P|^XK`CQ^l#O4?c5+cpAfJwl$`OXXRW^*S%D4IiMly!K@8lcO>k8HD z$dfaXNRdya#oBM^LyzKrdQTgVHt0t@wvS2|Q#1J|bY#zrk>u^PD!-Dc zyMf*to$s4S9|L5fh~&HYhHjS3%3UIY+e&rF)3U)h%=)}Ut&VusMOV2u>*EJKtm{Or z7Lj-RB7UtVeYkc*i~_&x(a=iJ_(K}4Yx-x>G5MfaefnLwsgy{j?=`@CPd7*UN1E&X zv`->hxIT4)PepD=&PUdeiMoR!>kgwnd0j3`jg&oP8GXfsOR#yO>4=hJerP&rUas_0 zAFB&Yoz+HEA3cH&VW5;ruJ!Yxa;#QFrJpg8BjHPU$^8_38hF$Hx$lgxk@pW@J?}Gr zCvW9oU0=Jv$UtWJp>I_rH4>{&fjbSChM4Zl$>b?|X!{`X_0*af)?_W^L1NjY@1mNT zi5TP5^|~^M%+Y7$6Gn!n1w8(I-;ChEV6p$p(6;bOqm=cy-q=_jsjaOy9Kr9f9RG~A zsdgke*eKL0(BAhoHqt{#6G8VCcWJkosvbRjkG)TW)3p)AQ5`eYwjH#+5&cg5XW0$Y zdZf2Vd7N@5?S}-f?QJTQ#9L;VugYsAFZqdv>v^Fb{zd*j{2hI{-iQ9Kq4MaqM(78$ zm(^|T>TY~czBccS{+k$s2jOq!HR{U9{=nKuHIbzy5bgcKcPDVy6YZ{39Q4Kpy7(4& zV*Tp^HA3Bj!$Px-qo(T?k7=uQN5VU0#-ue#_Qd~|G%NLSY`S_?nrd4eb;Pz*HH==C zP39}w2;W*yy5AEV<+pj>4vr=AC0?qjJ&&};d-zSQchGHIimGl~W&TsDYN}xVPD%(q z3hWC1VocJK!f%9&^p2VysOd@f9>jB~r+215C2)!Aw~jzca7Ca~&d!W=ncT?H6 zJGEVQYGMr>1Ue=xk3DU!ES*!qFJqc9{TJ>w}Ul)uafepS@ zzAVr8#pRt%@unIb>>4^3@Iri^tX>OPeSdrF`_h9I{Qr2L>waUHS{L8*^O1C=bYxeDlJn zh&tD2^C$S0gtHy-(o9MaeZV}oY+~xn;`%SQ0xHCIl zD=Mac9yLGnc~a%r-=n{Ye<|U$m}+JsXQG_Zf5yCRdQCs9q?_I~_V^n5!rso|E#Z;= zxZr&4s&YY&GqjLX`%DV!S0jIiELsM6ucGzo+A?w|x035^4MoWY#(=cawU=?lvz~!usFJ z??gDN;oI0g)8#Cqx3<$aLH{f~Fr4JO9w_h+)O4}|I>XDQ--SI-`&asf+&s64?#v?+ zqMh-DS}D338j!`d=UCE9VfntS7f8>Pji!*&he+XGrk%=DV~{qKV8lT9a;Q?+7rALP zmw!a6@Ua`WC1N;A+NV7)RK&7#bAZ z6&M>nV7!dPd!78_U5LO;yKbLuv=C2I3s-9`q3TTIYSTjX5B0jT zUD?O^U?6oUx)9mx#&Vjab=4bb+al}3^TS4HXXGS0_ulu2nWb?Cy>V{fT--`W0^XWs7(5FEuHL)w)v7WLVwY+32 z6P0UQYCWY6Q?{sMsY|jAo7sANbo@p;tQXTGXUOV(H~cKL4ex)M+!4>U4*F)|tJ<;# zSLo}AWE}$(LH!Oz;L3PTZ0|8A{h{z_64`0U3tla< zBs?iRhinkHL!HBag+GoQ)MBu6#-bIeVQye4Ynf!JY<=JQwYAXF)x6Kt)%25kPM$6e zGbR!J{E2osl19C|x{)f89%Qpnwas{(b>l?vggO(ai1^uuwNqGIW2Nso*?FnEvQ&Rp zZ%Higa4gEnocO-v6!8)E<9JR-WvEmBt^5`_1M6~TsmM9<5O&Sl$okJ1Uw5pAGMr7p zrXI)o-OOp}Cb3>Muo~AV9<4d{{Q+2?XOkPH3(-y$IORO%b(1(cl{=Dwq!QTc&Z(|H zxEa7bGl{oe$@%UN{CgoC)`0KaS#@)SP&> z8c6)l8R=tAk57sH7N;8*af7!wS#9SOa289o#(795qD|B*=mSL6h!N`roP(LocbJ8? zM4&leWx@31g0;siR6Gx5*F!tWrS@G@~mF6P)mw4#diDDoJIR~8UP<7;-3C;!DV zJRR%p$7FWd!Wm3d0e;3wWE*fD=OnwE&!X<~iIUf5PMh;e`Vo}`j+ZDyApCFNbI%i)y7~2areg}(N>1{GGp=+U& zUpbwMe38GAx9Sq(d(12r1L<=tq^KV`lSYG4nV3>Px&u)|*eKCFh)O5*=}%;Cs>&TTSk7#p-EDv}Ql9_2jM=^egJg^rT-AN7|VYimDiGc%nZ# ziI>55E-{=oUNMX=npG3e=R&dpi7L(_51FXvoWwOzKRN*R1yzeY{*6oEFAZch(2lgH z*J1QCnl&|$9!7Iz0I-M}DGf^C6&1K^vf4z=@(SQj)O}8*T~XINflngpGaego7IR;h zI~vk*bDpfkxQM{#)rGbEHlK%;tf)8GM?@X-M$Aw{?$0h6Nh(@`Y}yO~sUOOAv)V-7 zHPXHF&W6JKGcX;5+EQpc4U7p)j7QI~9AAbBa1`oJ@V!5udV#TiKp`^1S%EEsIO1sj zMCEfQl<%Xp8}txn#wvnmkqJs#Ja)KX`tbC#rHii+-9BeJd(I zR^quX{7(c@F{cHr`4I0OXkBExJI-3a!nMm>QyE!VsPQdEKMv_>0i01}hSx-F*4|;()^#vj45!LsK3c+y8^dLr!C!Y8FDbR&qD1Fy;ne$l&fHtnYp3 zopzH$>L$>OJZ3lPxd50%?yPvQRgaOE0dI*sRfp&5^S>qdYz)3@F=r}k%>uqH-2aqJ zc4rvPIXK7_xaCFu-()Uz_}fFMM&ykY^Car7hYf+<3}&t(eWWtGg=qY&P==Xtrh*%h z2`rj#DcqF@ZIlIOAFz?mnv8}zt15|WsZiw|qRAhi`?>+gJq6Yb;)wrZR)TQ$ee5D) z1r#%`1o8qugV$sd7yXQVr3Nq;!=G=UpT&CtUi}aAQ5V`xAg;VO{N@$bT~F5F0HlLs zz}6kk)B+BnaCJY?=ck~vJM?rMKeA64Ukqa&3+J4NF7GhBlBzWDPJxT>f$?|pQ{5!W z`x-Np$jV#4*LI%N&(7~J1ApDDdMgm>UbGwOLKaQrVF8CGPG8Jl=NBxv1dQZ6`(Ze^u zbuad7>@2L@*YN)vO$}?ZRZ=lVWPCYjG$vQYLHb!Fy>1*qwH zvBZV{V|+q}gpv3F`Pj9Ecw$pVe{|&0d#hT1Ruk6J(SKv}DOrEZA$l~=Vr%0|7J@`K(MseHB~Nu}h| z`bY9E!-n7VK6#%0Q2vh0D+9=1v4E^4J>j?>qp}>(Ch=EC>7rkdsDT8%-^M0aN$#zm zgFBtjk4WF^Gvz({RH?JkMZT@Qs(hxcm&=ijVJG*#gYNTFV+%fGQ{~}gtnf(HwSe+S z8z7h0kIL)yA!u_a%AK_R%1CXp(wG{sui}aJH<>hsMEvqq&7)8gSstzB%e9!lxy<-# zbcDyKm(xbNt-Yjtrwv!mM;^<4p%9Ohr(b4F-Hk)?Z1g2Z(FHdp+f091VXd}g4K^T) z$8vboJXYLTeYyOt{(=0J-ii5pjY#++^ulMPDC4#~E0Uv@*YlMmZJ;~_9%qpY^=k4K zW^k2sSf3+j=~g)e>>uh^$-A?Lyl(g86Z!zTNS`Y`)n`j1IXU#BkEO0e0O(3@KIGRm^ZIps#=D{}t#0lu-U%MS2a$*{^^*7O20yZE4lHNymn?vji_c+1L}DRYIv-_B>#c`+6LzPnlVlK zTc0Rr=zq$y;B<@GpYB81ZH>p|TKN-A_E32ae%?7~#K-9qo77EkwcpN3Q>%|7c^55-cpP&Fj-IWuUpAUZM5_uJC&b) zHybzLY;o-5@3T{k#;%h^>-p>nz2r9V_jBx5XN^Jd;3}LCysV-*X6`X4-L0O$S3-7|(eu%6vx$GB{kzuBDDmc$xG=P3bA_t7-j9!OU z>%+_M8AFjcd%(>r179sZwWI!D6J~ibd*FNQCdus9ACr0MGE`6w4*miAN)PDG56_=U ze_6nG!>GzmP+*Kez7cY-IMuCzvsGkAyTWYD$L>`Vyq9KdQ;>sJB762_MK$Ea`nq%r zzw|`-++VbN5(%L)yZetwd+%|UzRy0}lK*SKcRcowMOgi;C6Z9~_8~H98zh4- zkps$O5i}zijbTsvg_bL_7rcdqw>r?qFtX-IdRa&fHP}Im*sJHVuAf7V*qyMFS)rXX zU}P*@E|b0D3i?fvIe8oV-p70{;53Bq4BYcP=c=>VIrp<-H}dTqlG<9Nm$|$vNR&0H zgZBf{WD(N(Q)Hj@P{U(p;5PE*IQHH<^sOB3PXEaBUm$v}HY2>@}ydU8Ee!j0~bW3SrR|)ig(8^bwTo=;+ z*No&ZM!%l6Pl#-GNU0l2B;UjAG%q;Y+((|eg=BJ__orayA>VIM z34iZ7V33Mfv^<+k<4bu>VSMxXWi59LI4^KIct|TAW+;dGkA{khkXXbCEe8oUinWx+ zip=2`5A>)ZxvAV?aJmv%l!L(d2pFF+T5&GA4aEBy*+JSrOb_?@bP7rLJlMGkKK=vR z``m2@Vhd*?8|%h`G!@Hdk>!|DX{=-ytv>;-r`%lt=Q;(Q+~cakIw1cKtw{Lti|o~f zK>i%8I5`tU_~hmHXGl@^p)wb=6<0#j@lbIBa7RJGA}@D3Ya*3()`V42_y13*mEhu4 zxl4g(-eMfj=;Jofh@S4!s(`u}s6^glJH7ho#m6bjPp@a0`I9{LgwwJ(frf#+09dX7 z<4vBt%M6OF^j>iAh?h8*1{j~js6{PGF_sYR2`z`P%~u4H@<5rv=W_6p7}jqVJg)(3 zwHjlIWp+w)MFW~!!1e$k+ zOu*Tec80)(Tf<>QhUebAy2FP=-P2q+U`7cSj7NSDvj1k*m+(;7%=-@hZ(<$%!zy_W z_6?+r&b-9lS{ulOHg6={v408Fqk*(HJ#?n0I#6jj?rR7}>LVd{1Vb{h7B@I+)PuWa zLNk}ax!_aVS*M%8hywrF3>6i?oh*1*IM{940ey9L`YfL6f^1TrHoK!k5%~&Bv!5h0 zCzaV#+5k;5zt(2vyv%AGvm^1T02@Daskq8YkC!aFmZ4t7dvo!dKWp_@=B;qj5~y-iPaeg&A!Td?7~WH z2aXbGC!IU}tYOiH51xCagm*q?B=Pht&eWIaUFaCHn5i^y<6{($na{Sg(hYpPPn!e4 zKx;m!)0bGE9%Dh7Ps_jJ7xD*v4S{34f)q3t z>YTy1N%(Ah3ht}IWt%g%b@`tKhD3IFktyE|wLf7zSE0tk?85Wl9_yhRQ8D{RBmhw# z;`=%QODu&^G(2VH9-qb#6kI!2dyc3#|54Szhh3&~O zSB0n`@#{!FmoajYLYxo>Ruv) zV_Q!D*~G_`(V(ve9j!QfGnt-e!>dWqDz5azw<2z_z zF_g0&nPVD~$9F{fb>!}s8B;fU{192I1!Jzmr;#PFiVEbvLN^=X{US&HHh98gDD)v$ z_Cb+%q4aA=J4gBT?-J>73UbY7%)xA;={^8M6Zt=kJ~|OC`Z8_40rm#a_vhU6G5lmT z`^@*~oPGnoRkZ#O^m>{1O?*B^>zk3431^wa=S3xScpQ(xwVZ2yLl3ZuHL;&l)iI(>*OzFhS92QhNQ&Wgr8=B zdQc6igzLa-?;$7My*zOp-%TgchF&6ELu5HlW+j!!N2?OnwpLi)QsnAb-&*mG#hsOu zj*sPC{0H-i?mR?qq9qsJgi)-iAaSl$h`Vafb7k@cNnGwv<438Sl`Yc=-JUl!u69-A`?#b3E}Y_pC(^dvf~Q~6LaarfD6R;e(3d;kWmj*&j@=l(+#fD2IK8L< zk<0(G>?|GOqQYV*tS+KahUWX9uA(;>KIN80X24;A1)y=Z+L6f+P?`W)!T0%LFZ))4lL z4!}GK+Q~&m%R@F2mPH{=@5bgf1P(EURXl<|zF-{+JKiT)<;JlV7h@?~2samXWY!={ z2RQjr_nTAY8?;s(?wo~eb_;pPg*HLJDrzYmVf~#eSsyPL%NouyQ_+9SVdc!?(@eCG z3*m|z_%GJz9;6NxS?Lbnud;(YMN*JC#jXIF&pCB<<+Ticx`Go3{(-FKb*x8GJw)LY z{ScY>PuAZJe)$~!xsetB1EcyJiS|axe!Y|@F2Gqfvv*%8k*bf=&v`iYc6O@kT-giv zNI)aK4!$r74nSTM@bNP+_T=+eIL%w|pHJb?XW2cS!0TarH-J@CP8W55ex}FoN;udO zu(tr-@*Z4#E&cB*;Y>T>ba$Dzt^A3~LeIgc&^cUTw!O?vB*v_mR0?<;WHR(u`{j9uVYE&1M=85H%kmeSG_u(kvo z-Gr*{((`5D|Bq3`z?U+>;0)RmvdDk*5{Jz7HQwEm!MLcKwTh8#DdC@g1LJP?ley60 zU%+;O`4o23E!_1s`-{j7dlKG#pBWb!34Ve{K0?wE=b!)CyG>{W=CSK%K{Ho*b`Rt6 zfEOVNJp&tmLJjw!$S`MUggtTFxC@jZbB)0SV4CoQ4sh9!8Oy=}yRg?arq?UX@=4k>A^(XCx+eIYu)qrGG{U?*M#ApL zX{;)oPduN@s1MMJ2G1%39M|aOJiKoouglO@Mu`qU)Y`elTwEfu^#xb+;Jwknb_WgO zdvIuBsqO^78VVPVrpK4zvk9Dv-si6skmk|1&;+dEiA(4_A26ni?BI2POIWkBc%lzd zUIlh;VPP!=XMck>uR{BUaKcpDD1a9gf$w9i+a&Jo$ll!x9z2SZjPSHs&ih#S@(8%` zY#MZ!I?#9IOz;tReT$ZH68qM#Xd1tvr-mhC7|IUTmp)%&{w_dUiL?-6 zeLaFsNSwt?s{A78U*oq%;L*;NChU^U!T6i3v<|e?7%X>Z2b&9p)L}O)!|d0j z2G`qxr3QTa7I>PoZ}tH9v5d_FR)k+b5%eUY3`ET{ajLYik64(oTFiW>lHPhk0o8e~ z9aPw!{kRSL|3voRfnZ=Xqxpc{@BuTQ%J29JvWgEdhmTn=p_2B};RiJtXBDWbBBL1v z1Y*oWpQOV>&NF6F14?MN9Gq=>@;RIS-sD{_(FvJ(QrPc>UP_!60?e?L85jC7u?`AY zH_zEmY*3b%y%^}RDHwYR2zxVjp;2xImOkXynn0P$Ovb{SUV!6Dv|R&Eb&I~MgU`;~ z5y$UE%)<>B$Huf{R}CG#csWTTVEG z!OrWPYQ>pVv?=V(!qZ4+uk?T+amEjq@a`9kK;ajm#Y#lWoz5IIWeyTb<|q?-ugMy! zSfY8UM8Cocp9w~6V4-TsI`h$*jVH>3m9mU31O+ES4b7Ot%8alH&%eZa&p>t-vWA%B zG}es|j&PmxXo&ZtXi`Lsir_jf_+oWA?@bin%T#9OiE}%-}s=>9Z@WJyyrvtO_2S_O4W_#h-A`iTfGFHP~ z{sC7<>FE?#gpbEfzTL+!Lu6#n0w3kTd0p0KRpw3nrGjgrbu9qS|5$JL;s4v&X;!jR ziyhzuEgqw#6YTn%co!P%i%_S~rr4OXbXI)_+N%p@GiXO>468F1k@>v>qiPTS>vE+W zcM8c_tg{T($$g%`OFLq}+YeU6sp}-1aXVCfk{wl)S{J6#5huBQt0>hLH-( zhNuXc4Ru#xzY{)!9(uS6j)kU8?6l9B$LIWi0DQvVDX9eB|7n&_0Lx70g!bPA56ysBaGzX8UckLBc!ADdD>PH0>S`E@zd@@8 z*cX)nuR}*d8(qZvf6VlAXkTaK0@I>u-(!9e*a`xNkQnYmSE6#=b~w#tAiD}&=b5=e z`gsUt7V}9+BUW&yuvSulGn3wPOXj08pM(!%ZVA7MVg?oN5Y(T}yQr?{W}bzgRsnhz z!K2SHc40LVUWsDGT?6J@yo4{4I9XVcBoY~$s1bP^{Q7`B8@g)`k8Kb2m0?e440alp z%!k-he6;Wo$S=_9zpNz1n%bVD5yy zBcTNM6=}B$7_UMPZJ>1Ft5_bIX~e1!3xRZL$(GsFbWYK{Gdi z=QOxG#9BEEgm=N@Bd9{0m4rP(fg(i}UBTHZ)4Ny=!cru3>NfU|2>st>3%Ij-s0BGuGF2pca@Hc5)%7irv-B`cEubw>BUYHlS=?<-oxUX2e}WO_zY`I&*Uk z>bT95Vn2UKJE8)mjahm?JH?DgXg`H#lZo*;=>LE3!ail^o-kMJjO8pN&ga<}ctJe) zh^60TW-S>k2`|A4(2B5rMKPywtU{q#Dh5~id=fiDfPShlD{*i%mFH4{HHzKH!|NWa zL-+*W=LxY6E&+#-TZNpK4ZmuKbR=q!c1AjC2EVRQLT52xAOa4>DNSg93z-1{z0j?R zkzc3p|5+o%z9c;6#F`dpYqTZ!pg5t6 z3M`MAUr|>y#IJTRdlVe}gB4JSZ$A zm!RZ*(A&=?d-n$R0YT@txPFZh3BDTvezB&64{!@0tj%A2_Jx;_bDG0}8!?ljI%@=o z5_lK7bUZ_VE(Biev~myZ{Lf$d3eXB0o!I9*jKaxv6MK`e1q!MX_M{9TO$EDx8j_)x zLLd}U%T-_#`V^t*xC@>i!`p@CKec3~3CSgj8P4H(VO>jv1{B_1B~nE^-x5oxPDqz2 z+-2cc;p=E&ZeqD2JePwdv*!Fin!W?R$?AJQZ)V#x9qHaJh0@ZNS<2pfi3rFNkRh@J zC(4kas3?9F5C@1Nq97nDLqs;p1{tM$&vZ9w)9mEU|9R5?ulXd+c;7qDJ@?#mpEE9a zqZ(480X*yH;mSC)&>N%8Gt;@gsn9<^+(R8w3Vy9aJ9t*DH_GCFEBYeEuQlj>3w~)u zpE+XGVTmTuR!a}^X3)6=S#Zr9-nd=2yR7IaAZvEG6F z{tXiS4C-$JwP`^nS4N;D&KX))27xB@fag3>dpL(^I{n}Exc?^P&^>6+7g0hLde6Do zq2F>3RESwc%tL|^qm|qnqaKd7(mLD?V;G5&>HRVcx&Zf^LpK2N1amxNn{44{XpGl^t>zDMLV+$zfy~_;0~U4&6d!Ynb8G4kcV79=}ky2@V!LLoYufRhIYE6tvX~4YVEG$E5HF(F}BPBT{%@c4_8ThOQbGpL^-iG%L zp0RHONAcu#Eo$a&uMnfaG8q@a6{gK2x9A(qe%7G00+ddKwFTU-!_{_B(}__~gDQ+8 zaC&5K1o}=dC(cjqlqsv-xSJH>Obvw;&PGj)ATgt@2F%DXT%Cw#IH;5Y&Q8Z@GCs$M zwzhcsq4VfL7PODiAZ=(t3wo!=thPW#a|b|AZ8b_DhE4e^!G7I=(P=@w+?iK_A_b7} zY{^qlfO>2RzICGSKAu&TaSvSY8_`?tsTH1C(FwHA^ypY!A@gbb&A>O~!3QxIA=+FG zXr&n~F?i$|&rvGzXiIsZDNpvwLSO4VRHO8u7DStS5@^qp%Bj~>W1P6M@r3mvTuIHP z1y?yd63Xr2k8n_fSx^~$5{D=E`zrKQjS-}N$w&o%%zhc##WmT1_7DfY2|oYFGe?Pk z{)bw!FsHIHziL1`YGl4>1;=X;w1wxeqh1U=1)hLFD;5K1n}(f!M;uHrID@(z_iDF5 zy(gYkiP1;5Az}Uka+8JrRiadCWiHT=YYC$y-1uZgO`In!c)IbVO_)3SFpN26TX)dX z7c`;%ssTTV*em;iGpQ{i8w$$4iPgEvGv<2KK<$$8IH};A&X`~67>x|j!WTRcf->om z5DKbrm9wM%dW;HBCwJqO*Jx381pZSiBrZyO5BE)h_+F3Ew__wIjUPZ4qy_SkXPy!n z5wUxtRA3ogTPVleD61pFB^G)|H0qDRHBsP}L72tqctoKFuBlw!ng;b4$YV?HQGmwP7P`30{1A;3+hRJ_|^@6BmWQuWexOAQlOuaXnhp=qye@? zjx}R!DKARU#ul`mRut+tygM3KMt~DzK*?^HliVd!ZzA#&jdzT2;kOEKzXY?Bu@_vI z88_jA)~bOVlM7)S_hb_Ow{Y;J8IWr?1LfYiMh}Ngng%<9HYF5mA2sCYSdbR{bdR2re(x{F{l3&HAKps zr+D9pC+|?=J_R_1$Wb63+*NV}B2gzfm3m(oYD&eJQQKv_P$ncN{XD7TGlqq$1NEQ= z)Js%_yk^5^>N0ZliaU`|%$!hMuSFl5z%vzS74cJENnaw`?i3hxCF)Jble&R7YSe&J zRA>#Ox*|}g3Re)5=z>oXxP~KGhknsU#aO9UythL7)?*|eU?!Dg92j?_Lf-^We|%9| zBzl2}Y|pNRa%es{eK7c@56Vu&RpfN;U`;3~3$o`P^d@TY)SI|>rY8|K5S~EET?qHT z^pW#NALCFCcc$DEF)EMiD*eV7PuB-@8vq)F;7Vc=|DlEV@%pbvCp(ET`yG1J5g@no}b#ha7#3 z-aG+i;F*oFx{qE_H#2}6bRJo1^6a95alaP*pnah`w3``_%gW6hH!D^NEj3?&bv5VNpC{D+z!qF(AqloSrMm9bNt z$vhh|6|~|Wkh)tu#;O~hNf>|PZuAy3fM+;Q@-Q0IJGgs(iZUxOHk6%(=q)2=RIu3P z;XiGba!`ioj1;rni8h(QC6u}~Xya4d$9Z}lBYFh3<|EJvPeI3I9NH<22uFplZ1q(< z3qiGd+(qq(2o+b|DtyDe@jsyHzqslGa88aPy%;}+4dx_J&%g28Ke(DLrvJw!Jnw;f ziItH?t$4J98g8_ZXb^o$%hAFXl+5xU;?8We^ES%ho}W1EWvsUk@Sy%~1s5{HldHD_ z^O-1EGyOt_2^$U zN|d0aXpBk#%1VG-$Nm!1W!Gr53cs4*GMSLZ8(Zw8@N~P$Cg|r)14S zndA!Yo4CRn!3~t&8PKMufyY#}bf zy)WY$=?zQ|MoLdT9@J&1*Ef3bd`94Q#r=#Lcm@y7j!Bps&%kc?GGq&VR9C_-vKk&E z6Vb03=vg}G)`2uPf>!kEt-*Lc#3(+*Xx;~%+VCxR2P*V42JP*RJ11ZkF2G|po~-Fv z{AaA~3$PN;gbbSkd6SBH7>%g(xzeqZMj<~Zj*}gdg1=zXxV(UmA?MN zF?#fH9fDSlL#df)9sLsN-^djw4zI)tK~ds~^c5t=#`z%wjTkpg``&C%TS>>+ zX!ktNc#TJEyP@R?=yxFK#+hYAnGI+`p=YM(Fj9B%4ef_SRon236FLGdN8#vGI(UgY zs&TMcGC$oMlsyNuT?0*bHu!BSsES-)pw}o|%M)m6`AfhnwImgK*My#Uqh9JPZKy?u z9+3x2(GsGwZpcj)sFjX#XcrlV`lg^i6ETj@pf{6H&uDxz7$e*n4_bJMO3}7N{G$x* zzX7f*0NpraTxdPxN~M^^ZJ?(ddVvb{$T0FmX&tzVNV5f3Q5Pe=Pi-(C{CXd|@jpCz z&PBYt18H{xGVd|u+&$F8Sl|x5gx)K}+W+xzI+61KP|`zO#ryxkUjH(7^`{|ke}P@= zBY4$(g|ZmIa2lVFV`cmqzu$y>x`C1&d&Yve7GrgZVN-^6tk?gdP4x7>0tx&T?))DA z_rc#~13Xs_!n5T7o?pW9bObVQdxDt`2vxI^6Xj4*O6NZKCw+ z`5)T$CtA&H2RG1rw&)Ic?ji211nn5xE26)Y-%4n-T!|?Y-6);NR555nPZMgET$`(L zEj{zOel_FC-3!;cX1r1wNl~I1<3z7q+MvkG0!D_GT-ty*OX|Vpk3m%nB)Eu~O6wHS zcj}6r@jo5>z<6wCA7HMFE|7u=xPtgxG^7RbFh=VWQ4PfC%fX4{ix%`ii8fGk4#m|t zrU?433-!|C5QZ`Y@CohS33&M6!C6cXesi;#*hp#{r5^I!(9$b{VJ zgPE3sHqf(zI3{N_SHNcUrU-PRy@;G!f^lV3cq{tZ0=Zd@epBLe<*UbxpiPM~ge4BZ zVXk&wsfFt?4$R-+M(wo5a2(1}V;QLIjrEf& zGwr9uc#wn3Bk`!G(4&o*5Vgk?%(i5dKOWyR_W^g9v_nxh{J*FKqMt65&33ynMjfrs z24ClR9!-!XI`pj-J>-s!J7?P6x#LJf*&`u6o&i1QgNDpZLLF=XR?1Y+JONz6{S4z| zvOqh=0bKz9(_;JsynRjptNR;|Qp|huxW&^q%AFpNcLVW^Mj2}Kg)whLwrTt1zP}9! z40o*DIZ&^Dg7S$Fb53)=L=OSRo>1eyjhV-tdmbJ|_>Hzm9e9NpZwN-1xdbM7q#tue z%*Oak!Xp!08I4~fQCl^x?w|`1qo?3w?qu|+uL181P@Vz&?gDoc>&=0DB;vuG9i%7i zQS_BlyZ&e^_XtEp*k4ABF>4KN_Ov2t(T`ZnO18E) zMw<2$>ST=Kq0i3S&~BE)FNR3dc+CF3D3u5WvtxMUmD&a4sOYO%fe|2@No=wS^rNid zN~}a}GW3o}9PMoMHlbXlw0Q=7B%;^@{Y}Gz(LHM1LH(BKOC3fc2b|jot||i`apk0T zN^PCFNhnF%@QVXi(k5g(S;E7I1E(p2HGWn&I9qveRUGrPks$YuZf8;E~5eW zbMoIa8Ew!BQj3^LGFKvVpAWY1()da1>EsB zsB!`Rnv7n&i55J@D*rqBc?9MD0ZDKRG<}S=vNpEIg#Hm(qFqq{ZxFT9;6eL0XCzVh zJddt%5|a2MkLT}4@Y>u0Z`=>z5Bn~@`yYH&kARZbP0!iu7*Tk(IuflV*4PsqO_@c{H^vvz=cHrKgn@pv1kq27(#C}Kn7rLlBG>#{j2X2m zq6p<^5$h!C>H_-Vi*;O%QKjF91hbP^KP4Hn>@XrJ8Y2=7ni0WkgKTA_CGBH2ltEw8 ztKeR)TqT$XP56c}nbhap8 z=P2tsY_rTbL+y}zVtVuu3pRku-DqC{_<~+m56~yB%3O&X&@--Pa!?=^vw%o!3d)wC z4kaWtH7H+<4p(?u_9^vf$919g?12uwq-Q=+9NH_Wmorj^s0pzT^6hnSGwtZKF%Wq! z#Ctu;AtmcTnM&Miz~@$skrBODHPbSU0QEx12qFtMq zK6U7D&@>VpNeP>XUpisDh%3{Zjz}wa-1J2gpyAli6LLf|xP%BeV~DuB%0oNI`-S*_ z$-^VWafq+xq36`$9k5$Op^pBjBN=m`FILn{td8`Xib5?t@O>Bj(&6F5sKyA46tN<% zLzGq<_DvOq3FX;_2dB!NMH|U%JO>ZoAEtBv$1r(;8HUi^M-I7)|;4?M&jF&kv@g}e!c6}m%0OImN?e0y6X?e8>B+{`im}*SP1LBFbC?o`RzPx79C}LcWpXQblbkzTxhi0q6Xp$G17osEA1wGRECkNfx5+iEmI&4Ha#Q3RUGkc{8+!g}*AcGL@<4mnM8i%K-NjlnicAk!vW|9QxbQ%1s$ZEUy(bHez(RmYY1Y zu>_^-JvvW0+TV_vmrt5O-mhPnuyvdft}GCN{MeM z@j5aBaQx{x=fnt6mtgyNeH5s{v7RSBRz+xl~UU`g6FtfqI?X4 zH0ud^rF&*4ebGAn{6yT#h=;q-512)fdkFdzH=~~=D9h!c3fH}Gw1CZujRgylGNn6irmRr z#0Pym=poe|-%)4hYRsIk%xy!R@*+xkf)a?AFdFd^bZ+K@%tarF#*p`!CzoFM+&grK z>>cBg#Us()p5P|#lRM)YB0aGf6-M{ar-Z&Bv?fyvnJS zwI^1gKIr>ENP2pYB%|l_8en9ah!ToW8gl_Z0X@$Fbw381=mESt1R5Vk-+3|)sZX?p z2)7UV%dzI#$PB%V^&)P{EL+^MX>bLj>k{#*hP@Z%)Zg`ORKmO zyk|lmP570PkLx4RGAF3bsGMNb*^wnS9lh#@x??cDy-^E2EV-kjm8FMgRJg;WB$k7E z)KqFbeWTUlI{HQX17-SS^!EXJM;`&o5i2;BHc@)V5X~b7$JwVw4YX@h3#ace^$=>i zM2FFDZk)ut>5A#I|*~pcQb}rHZ=Var1YR$CFaQ&r)oAhIhk`{HN5P!Y}`u_&J=5OFLf8m$Am>JAI#r+FC zY>7tDW113*@|7AKJrU@m#eFNiqZxO^DEV;AXnK9pN0qud`x%b+v<=eAK@UX%l7X=a z^qOT37!69Hha-1k+{u%>8CyX#j4K7bF^L~jI&i;9KVK)l<&M0=&Pl|UK1$306N^?c z3N;PyhyxQNk3b6<1xt@`YU9-QIYa3sM4NFZT+MxDDDDi!RrE)t)rh;WrnfLP z${3VH&T*hsw6PKu;Le;;7xfqeX11j?F=GVjw?)5Q=IQeH^q2N&M&laMJFdCha}oEX zm6rVKk1^-owH6#hn{+gOqd$%c|B1XNpf$vy!yxV1V_NR%NlM>1wp+l}LHJJzmH_%Q z3WT~JBg9A%<{n~hUiOQcBk?|R7i|(xG4h4j88cH3?Tws|+|9P5Jw%Th&{M9}^h2fh zF1_mlK`m;b0{Y0+oMTBZLfXO@7ukdvLG7d*qjnFYcNemfhy@WfdIu2erG=b6<^tvh zv2iW#m7s@e^q8oW7e>P$9$VC|+_;x^ZbtP}Yax11i!66++!wLtRJ<~VQI9$q$8N$a zJ;RBDG6I`CnNrY7#qSZ|Fr%J=lt}MbypRB0ai0{E+3S&jw1+ zYRD|boayv&Vf;UFSY(^UjHR|ktcsCr+`+TWUMRIA>V~@|`k4_W_{(DnW*&mmKyPS+ z-GjLM|G~1mA2IPi0`L3=v-Epl(qG{F@A1pGu*-gpcR$0z`ZYci75xM@+z*hY;2q%A zn-K5*DR9%3h*)2MJQRx&`@S5RSXSck2J*fvKqi7&$o?`LpO@je8Ral<{0iLj8P=Vz zPy-_<4|?$3L#T--8t=llN6|Ls)!Bho9tG}u6yGsx7~{A0;oEQU+qWM4oLTw~dD?jh z?L3Db5N*!Gc-{6$OIoIBccHHV{a~s+^P3tfHI&ET4kEi1c;#Mz7UO?G9p;%}1U}eqB`fzgRH3(O7f1<_= zB_c&HDlc$1`I1(JXk0^dh#qm&iiZOQn2&hnWxxcM09#lBgkUE2nvC0i9=4Mu*uPJ~ z9V7AVilz;0?nQC!WJ&8s0Hu z{kw>BUxip@=4fK3xHY)@BV@DLg6QjHhi2amO1TDvXB&W*h-C%rUe5B+!dk5B=?)NAH;5?M1X~ zA%2~YmaIZOD^b=We9J3G;eJ|%822#~M*|5<8AKZpJvxb?kTW{+f-^VxvnYEm zUYFu^E?Tz?Egy;25%Hj(4w0uANPXf8+%rh9;t*G)Z!UL3ddvq}iW)Ez=)E8V*V1d# z4ZViCJF(Jk=-W7Go5aFc%S3!)F0;w#+ca<)eT$-?o%0;VFuaqaW_o)QUkk=>++R}5 zjK#IoDCu+0GU+QY2J@g7%BDw7nuiNAz}M-JZ8Ato?q6v6qlX2f|B501=*3@#*~{6^ zRhF72>7<2Rq>f1BI|d~Yr|f~!2jD&Z+Ni&D!{?r8FRi%rL}#2y7+Oo;aLQiNhOudk z+Gb`*u2b~z;3s+!x1mPjCn31L6KF%!lGrP=5^`t4341~A~<78+xVLvOeIz2=Q zv{f=s=q=FWF7ADRXGeS>PK=%#%-u_mGoCIX!8%I3kyr{58S3Qp zdSE_82j&D(h9*#-IWzC#Nvj@D0Oc;8m=f(-i~{C4FWenbYt(`>g0UvhTbZ@dH}G9 z-V%+rQ7dL-E|E`0bLN9C^i(02GfI!PyIj0d&*E7XH#>Q!`Fj6-LWfW zbX=il7ErV1o`qhpE<6G~vyMAzH_BlQ?^W!`8MoZ=yny*a8}>zLOZ2Ye*)5FpVZNjs zw5%O%p{D`k73nX-wvn^Up4QO+fbx)DP&`Y9xLrH!AR$<(`+;WkgQX{Ie{dk<$g+@2 z=vCy-3&T0LYPTplMFq0+r6UvHV(33d!QJ7I!`qRE?40B(PEopm42Az9JK3kmDYF_9 zUqCjJ!_a5mhUT;!dea(@9<>Rca=W2h^TBVH7bqwXu> zeZ0Sb(^*&Gl&-O2Z?T6MBc_Ve#Mi}-#3Hd4XOAs{J-!$@mu^a)5%vjPq#sJJNG;Od zvXQb3*$c8UIHU5hbP?*?i0pMIu?B`C@8=OvDiuAvByJGB#JjGwE+5x%=X__p)8KgI z$Z|9~{G3a0_U1fSjcbh<0*ZtpFWq3_9?rUJlup1oVqWsO^3^zZdAIys`8auqyg{~2 z7A5;s8ZP}tFkV-!xM>t}DW9kYFDJ7}xL`H405R~#dqT34g% zhKT%Hk|9E)a8Np3mWdKaD^4kXQq(E*iZ2u&E7BCFQk%Qu9zshF9b-I;B?$ub{|``^`SY_ zoNqFlwwtRgp*GQe#W_kmgM9w$g`U!_c%(@`6gEhncN<)jou};+Z9&$VILFgs{>1W; z^>^C>#}d~Ow^=wLU#)uT-P3oH-+BM<11tfD1GN4JG;7tnz5i4#QLL8kz`2dy_6wFo z^T+K5V^n*9>8v@%w$YI;c9$F!9!OWocFBU}O8GvSL3k4ksSq8g{jHF`cn?cP*7xsZMA#L36^+MAk;vMO&h-MC=Idrp?u)d0&xlmgt>2>n_uT zwv~E$b9z%-K%OLBEtxMi*>9OwwAMBj z>msTim)|e1temOKY!q70n4fd{OLuxr_Nxl+9rZN+jm`(V+Pc2g%Mu*=G9T%((n5iyTiqc@W zpW}J+ID=RHca;Z=*A`Ug4=?(wbV~J$^}n`g+ST@+k|935gFcNJn)G7#ONCI9p}Mf8;b$UVk9-;-4SvnG`~yr8BE{H@{=@m%Zh;E#yGL>nWvuN;7^KAPl&lakAGN z-QG|5Fm#wEUOC*dsr6Frn#!!g9R<%81m=$`O{^MNpJQltwaE5*l?H8$m>4xXx+Zo< z#5bXbwS#<~mnxkvwHMd@P}Qd-IxjWLD{I>mSJt%r>4?OnUwicH z6W*_4$kBe1j6Zrl?fOpa(x7)W{oK7w61{Krv!z4x3kza%mKAg^8(Njnu-An1n}rPj zsPLkQf1~y#tc_b8wjkUuph5MS`!&1J@`di%^1!@fS!W-ef24dEmh)v%URiqMg!U5U zG3AzsnO*m!_UkiX;OLQy`_}a@>bI%u*@Wt_C4t9Wd#vl)8p?ku9g+Wc-fK^$<~vL7 zlsFn1P48Qi<;?*<2ki(A>a-|sX=Fz1lJEp1en^(jvh>jpYUo<(o4Yk<>wg6g*FSnY zXIZ|vBCEmCzDZG}{4X}5^NF;eOyv;i(1rcp7&@(YaMyw^T|zf#M6s*mMB|Byz>0_2 zV{*?t?N+d$FuYjDMQ08sO;HFr=;D!@*n9-t1;b4AgG)UnNmk zlUr6)Zz)@yHzDt@oNw}~ix*e?UAxCL(ejIAOHiPCZp8EPzlXV_E=S9>oBg)=ofVGQ z8!Q7GA651%H|Je{dNO-n&d%Jz;-Kmu>hp~m?&UIR(44592`5t{d)>%b-nVCFZSPL$ z{koosb%s^@YUD3C)yA#$MOCxQ`W0NwmleKHbhb3JHl+EG@syY#|Ip`3z`fv{(9sbY z;h%^426ffEsjLzIF?DNRuS+kBE9{c@PR^p-o&~DX`&GkQW}3SQr#0V(?u#Fo@^!DW zzPtKQ9QbCYt=GI%q4RGM?f$f$TvP*Lx7k^fzY|Jp_IZw&# zK8FLxg|vp>i`)?LL8zczpcZ5g?Eh;kt;hZymTGm2#q_uE(06fY zL+p{{q@J($IovO?|NM;idK^g^mvAujnBPMAVEgvg*Xpav?-t(5o0=1r8&%{iOVSectgRy{3QjOi?3B~Z5(AB zCrZ7SXth!AC1$3*-Se-EBbj3}ntSATTb4K{VqIXN%H>*US^?QtU$V1sc3ym5V$rzr znKcO!R5;->a*?=9|Xi`1~V_J#7~ zl0F4*<|h`4?Y;3m~=mNVUP0}d3~aLu1>p@v^}~$c!1`4>3v&q+pvc4 zN@eMXg^s*}!q&0@)ngkEwvV?*NOq_ye6#!`gVmw4f-3_@`L!yCx!=z8IAMIV%Ht^K*Vr=_bjLtUe-i2kk1t0}X4F3f1|71rakw5y%xMf!%kpuR2% zw4ZLfSC>*brtI~CpYj)%{7~Mx`bbM{dxU+nMC;w%=WytYK?Ag_BUWp^RnC*YZ~pS#yh)R$a9#8b6E}6BHAAwqLK5+5vt0bRD@f^^Noo(q0ZwhK2}%qL1EE zH?HpEynW>@`7_H?N)7eL+P-ZwNhhgi`)mp67yVU8_wdHZ<$O(`?!LH~fEy9O^f&-=yT~%zJ&bL#lg)cFpX4Ge{dM zdOvc_ut@4IxBQs*dPPg&7bW#&Z`V9F>KcAm^pic~)j1?Lq-L0%mZ%%ZB{a@!BZ4@<_Dl;mwJ`K-95Wqj>Z>p{g?_XzFe;L6ZF!KJZ(YBK`= z40y+Dtytn5(6+3uvhqSvY0mh^r?VTg_UFG2=bt!o14`d(IN4@3?u}3?t(|&z3r+3X*P3x} zXh^paeX~Lu-80szY>pO-VQ=s=#Pc6v=+;~2TYvf1ye0C(u!pz!#S z;fA0Eq31O@vaZ4<%kie=x@l#fUW|gG`mRvXZFsuX4ucCFSLo{aO7}jluc4BSzXk*rBZm znj5<|RvXkm(l6woB0^yjx9R8BX6u&ZZOa;%d;3w$liv$=RwgwRHBHrQkS-7Fm84Bt z*{d>R(lA@knEp@ud>enU(^74;?-koZTTbKS(&P&7+zmO~o?a~4UUsUy*?8Et&Hlar zbAkH;uSYFRI3F?~>dh#fPoURi#Uj&_`aw4=d(RwtxmRs}cjo@i&0PY*WdZ%%mz^%d=8D=Jze^GKV`qnzM6HMk@q58n@OomO)^bKay}TyZzi4;XiO2Kuj+e-*yVTgF zH|@E;m!m(4HKfRT92~T>=jZ|XnSsf(l1D|S2J2+M2`ZDi_M_U>MK9(be%e|PQm8Kc zw(+!npg~YIDxZ3P9kM(+S?d=QAN{#soZpwe3ddn%n(3#?^Cju!zPSlGy$Xj{{97JT z|EK#!^Q)T9q1GrvqL3cicUW3gf8X9+l9Q5W#7qnMRcTNzHQjFR-;iFuukfF|wBmz# zsio4oXPZ9I&y&s+CaUy-4@0s8&O~+#f9QAA?`w5`SB2$LWSKF6Io_RW^o`r_I*YHya#FN>>e zs+m#qXS0v9$!zcr2-qKz8ne60&Th>~hkMRU{iO4SE@9DshZOpR_>8r$GsPIT)vleik1jgB(mfjZ6iE#F^4-Vb=-+Z$%{GS@H8m#j~lG);aDA68zd zN~k$g8&hA~{EVaBJYSWq`6zH~yws->BTsV&7NQ2gOa+KidCo z_(XTEQeL&HbVFrq-Ke@>nrp1DSjM~8DfM1j?-hZs`;AwR@txsyPV%a&-O;JFTK{>= z`*r!XuhrY?+L~Tzdf(d9wp(1IiBc~JI})Mov^aiY=P}9u#GUFiIA%atwDyd8mFkdv zsKcfIv}snYvUXPGy()X{;#x`5*0yxhINNKIMY5HOFMZ0@D}1azKX{#zZxejPV0*3U zP2a9dj)JTP=`=;xuOA?d-* z0q^=f=i^p{OIM52?9W@&ruW)58hi~YdPhsVp{X^-7;iROGaP$da>+u$PZ}X>l|Ce}bp>8f(g5ZlEsajxMj!gA^JvflDC`D(>|g-M}Q+7ufUHS!7av9jl+&j~{%Z@PDg zHrEJOuJdQ-YUd8;yUsG_K-a4-y=$R(RIC^Mfp(_3FNkY^M*iU%>e4yyIiGP3b&hwA z!1dM6ms~1Q6u)*amShTP(xcKIvM*(R@=s-b72%3c#8~;ik}2Sfo@q#PP zy~=e5r?TkXL4r+!Q%Z$0p|iA2_*|GHtVVogqB}zz1B~ywcY7zRNz+ z(FgSQ62~JO@=Dy1Av+>d%g4$cvV2(|+3(V7oXIf~=QmyxmEs=sDB2a{+Ti-nwNsn{ zFKw;xpYWx0jO?;ZBkv)1%Knk1$v%*t7jD5j;E;IHRpyj9=Q&!yY2VxL*(ZR9)`Ekk zi=&Y1evr^Ad?k&R^^`3D%4(Bt2acR3e2BIVa(^cd7O%N><8jSpam^R);t}@}Nf+S} zxbC4eMmAbDANXvn?2vSrbgkee%#!Q|V*QQS9a!uit}CuPt|)Oe5a;!$(4Id-~Z+&SV#Aj4C|DdIk$#aehBG~%R6vt*?3KyV3NrTwIt zQY~7xU+5x~!{U|=q&dd@K>Qik?-tLBHgP_X|31Ljy9j>@8tF>uY3X0mzL#0OH z6V&txtS6gs#?38pvp7*4B(4JLut!@Z%Y;in-qWOWq*JBcq*k=`d7#GoVIjzebs)*z z3EwFwsT)9Q~Lika5LwH^2B^V@^VC5bUyVoVy5qQ#1COkGig_nf^J|?qp z(o8dInk_6A-W3iAvoLc*VHwyCE3H4yGMI;}9iZg&l0O4*1{+|PTLJMZxMA$ZNAeZfG%<@`^3}?SY3f*u{%{O?=fJL$r zsQyBn^OK5`Uu|M6P9s_bOGS%&407l{kfaOigx$gojMNp3*Gr&D9rEi>$9WZdahgVm zJ6F6b-oz-K6l-89nE*eSN}LAzE>5RumG}s~gz|IJ36i?SX5GjG6q<{E6AIE5N_d<*-{2-RKrFlVxLmZL~|L*XkG z?HjGvoTD*%-36Tc=+ry@c3qdGOGgR6%DXE@D>c$SuF=kKT>+xR@xbb1A1=NmpXxPA zaYpO{$$iazT=s@^nQNZyqNA61**(@}b>_J4O9pyB_VM+aDOHO*#Lm*kvc2wW_SLqR z9or=T$fVMK&P&#pZTT*hutre1Pq_Yd+l4W*UnP57!<@5RmqlcW5spe?-A3`4`w?dK zHX&3tTe(S@BHw^-*GY!UcFO#Pd*UqDMcn%p&MN&?%yxa_8Ylh@E8frG=jE6=X*ls{ zBu);y4y(^R(CkI{W30nWd{=x6=iO?BsqUw)r7pXef-zHp3oG3F#Vip%5`t3pp6qYo zn){fTB>7f4L*7q*OjznZiIb?;%Uk8ivV6&D_bY-)dRX>~?6Pnd^Y)@R6=y0vb`N(w z=Xl$`+&0brjQwTXQtL|d67vYlKwBsKU-km~7Dt7%r+CGELGpp1lD;C7tM++!Q~PL^ zYce$|-(9{3d_Pq;c#l!F%A14{I19Ye*~2--`K(h z=X3UJ=5FazOCpwRlk5nHGI33a!F(B$pX{AvxR=0JrOtQ~)YNSaBXLoxo^qQcQ3)dv4 zaANZ_uCA_wjyJ7C%s(3^HUC_{wr)f1&YGpV!}U8GdbeoX;w%^J8|8BC$6?FkUP=6@ zOQ%lDtnuSkTk8USJp1739Z?r`?dCQ{WmR#j90Cd?!JESg#^dQ z6O+2E==?_9vAFJ0{@D9`rv6d>tm{i#ur0v+qB+#|u63$4(7N8f*FMp{#x)10YaNj9 zP^Kye%2r72!b$fC$%{Az+Tm=leQ&94O=`YWUs3a6bzAii-Rj!=^@^4&tuo6aSCa40 zkgd_v6E}5Uo>(5EjJX++8T>HdPv7^HAG!0OEk0u{x4i2}a16FzvOZ@UVvD!FW1lE4 zmpqZ072he3$ydns%6dvSNPZE%ll3#JI3!Nd26e4VCvQvMT?so?6?~xUO}P zWw%5gxH;n2gqM^0C6#r0EBfcC{b9YdYy56||0Fdy&RehAdfCp{e-+ck&CUeqhb!%0 z+oB!YT??J(q<*T!Ug_RymA5iUvQOOV*0}DwezK1=|IqTG?uW`NC3{QOl&&xPrQ*37 zb#o8Xec@#Ipu`<1K4}}ePE1%Gek?pH?DK$mYNz77Yrl1Y^^E8xeMwp)e_^)! zw|ZH2*nVx->#rMzx9cVDz{IEn5sx*qWdGTd%r7{UqSJB92rj4|R`zwNq9UyHNa2D! zWwDRW*Cnne8v@Q0sd0 zo2F1>ucnzbCmK6BcBtn>IAgm-F7x#j21ss*zd7Eq-ZDPXk8OTgpV=DNu&3-muKUR^ zSuurkb=_KPEjt7Dr2m`#ZTEMRUW(rt+Se~$+ZOP%GFe*cb=J2c;Mu?zf}(u3I4)cK zt$(&ZYKd*?-Dqz}ZT5Bes(gd4#UGB{6Ea$P+Uf1AF-4iDn|2#lno5jg+RK}B%U9p67ZdDiQ}I4-B4rHj*#P;50$m{ zy|!}aRLh*Y%!-Waar%67r2BK#N4`%(wncA`+Uh^wHQh46wB0nw_Rv1qvECv#?r%F< zzpccWHU3e{<9~BaWn-J-tzDy^9T1!PMdxp#o8!NWwP?5c{tiA+D4#@iiaQWy_ZGd@ zdG!`vaolQ~P~D|Orn9ylwUwJ+b7TQo-O@R#^8^1ajx+6Ru!g>GU23W{UUw`Lg2k%V z`oa@W9%n6kdN(^I=Sq>TAxipvpKXKp#Ow>x#gwM*iJ$0m41OR5@;ebJUC)L6=ru!C z5j-m3MZ3O!f3>0FaoyckMcYh+qWzreOz_B%J&_kfs#MFciuRR$Z@Q^pXP+QFD!=UX zH4bhVT6`)0Z1(*7srOdoUaR}8{V(s=`wd8cD{Nt0&u->!zxl?yx+%K*5A&N8=@WG| zU}C`Qp_QRtuFZ8L8rt-q=whnZ*2T4!*d7QCzGdoH!vBnz>Q}5B;*6Eda=q5R-F8Au zR&174n+F+Y)=Vflo8^CR!GAyHOfT77_m*{g!h(S>h1G;5B)4|YkE+5>N$LModnzzC za#dhJ@E4IQ!_3mXP19SN+rO;qS@d$vLc{O&8_o*p9I@ zxt;RKifYHXwoxr(t0Rj>KT_VUesZ@cpmbdQWJgBorOc0gK8}p-wX?_RfZO&>UTG13 z1g7}OBGw1BM12?4UGtiyutj58)oLtUTlBxSI-x3z_3`aj6}ri5X{M$3 z=MnqGvzj|`owP5>E=Fh*c7@*#KkXAIf6cbf{CDHY;twi+H(hR7)X?e}>uvM8rTiiM zxPPu{vPLdlCQh|GTq~uMoHBX3aM%>sdZ21Y(a%qOABN}rk^Oe@7qzpEwZT#Sjf$ku zej_x=Z)kQ17ow&_j#Pc?^H$=tm^0xEgL|t=<&VspTL)D-Duy*L(pTv^n^wqliag27 z>N%Z;E7r>Q`TNNW#KYzq*&u0+E70q@<2&mjLumQ`it8Vb%JR>y%664U)Qo5!>it#U zI=_vYA4fh)`qb}Z#oFjQA-lW=`43CH7rQ9zo#0EVAC$@MKep_sc~m>MaZtnZ#?2N) z@@GguD=P+UuNmfc2ARd-L9UbwiSF ze#@_>b+!p&imaEaN64qjIm+e1zRI6)dgK`Ii|(DyT4jm2+4fue>?UoktY~0TmhyM1Gd8dBNoPOvi~FmhMIHR;D;Uxby1=4i*LZ>qod>DK;z zd$RRN^JjIz^)=?ZP4601z$Y%a$9jJiG(TvaGCCkQ@L6fAdxkh$vdA{THq-gCrB~~u zT8Hkn^2D46xv3>b3O*?6{KPnVn)H7j$~hH_5kmD<81p(_nOvM8vEC0wl}mauG{3C=+1S1Dtj)}qB)|B4(sdJN1>O`5S|rBI`sA{ z)^m=2?OhGOv>eiDN`Ed}Umz4qinmqFt{>Ah-Fh(jWB=ajag)L$zK@$5J1IU>yH7PN z%A~oe{Ybsc=S{x_;(610X`S)Irmcni;l1HsN$E3FD`hu35>5RG@{fEJ4qvu;UjqH>%S(}>T zh@BMih4fh5=78nC=>e;KdiiGyL##dJ<86KQ>kS6u)wU0+Bdo(+pSK&Gm8uN&OX|-R zQ-W^?{3d?tt&^wOTP=s&=WI8OgIsHkeyyR+%W4%h2P+avkC*P%%_@DnuGCoR^Fc(i z?cAv2@eM(jQV&L!M4XbPCmztuP~QmJ=2fT}iCG$=eAn8^xD}pApBrA#HCmRM_q5$~ zeIT<6o8=|pJDrI^;{yZSLsY9J1ukQIciEek$8Z7dum8n-sQE_C0^N*~vhqI)f2ufC z)lz#&za{FBDo3?#?0_I&I8eqX?)6(Akl*>5a!=@nfUD}kely&|WoIPEP5q5i^y$Xm zYL)fBTaFu6w}0&1C40{8RNc`0sfgDu^=k84t(qdy!dI@Rq{L>D$ekawPj6q_l&h<( z98kKfB($`9Nl=w|%xZnX#7o)~(z?X(x+#OpL+MA$WHqyOpfGm2@x=e-Y0^Xw;-;m&mH z=h9nka^p08Q*CQSd*$ll^g^Nhozh<`0va{Oh=5-HBYnq@I2As=^Y1BtbowH!D0F!8 zbIK#(4T0wr|9X#xubQ{TVVq{DuhX|YuM4g>w!P3=VY=g-BJV8ZDy3mveXpv2h>75rri$j$=-6~ff+YjbLmguGy zAUJiPzo5UJ9Q=?;aZXxp-&EvsE>& z?_Imyw_TU)^If&JKvQaauD)->`}Ny&3#z796<3|D&e08ReW|rt)g$PL@@VhF;TfHN zO?WXu744hAYE}{JuM^^KariHB)_5RJh3~}avT3>b`Be|oGtVlJ`ce;FG&?e1yiZhy6 z)nH+gVu*Z~y+SB)J!!vgFEPhAzuYRc9IN@EE~PHFa$Ify`pNY}3@?~|7yI~EsUCIy zC1O=vabk3Aa;MScK`88-hS6x+>c-h=Hh4sQh>utN)DsP+H`cm6>wapDnYX?_f zuR5f=rOT|1GdyXXXs^(ym3QKo##})%xsPK@I&Y3_Ou8MkB4TTZpa}Cl?*38CYS&pm z)NiT#&ah6`t?~25myE|+mRl2C2ko)4FjWt~lgbyvztc?h9jq<(dRy_5&l%ZYj>mGB zEu#Ir-KXtn<4dhu>*iIb*2PuFRcPzC)VxxERj)GsX4~yIOZg-=BF-B5N!L-aPZR%% zKA$urxGrLKShVbduS%Hade78iQ|e3VcD3Eo^==&0QfV|bFSgxrPOxp29#Zb`nW6eB zv_Ku{=NmZQd#mafp9bkv_eOcO?S0D%M^amWUfp)4evK}w{!C?`>i)V|oxW~Q^N_aH zCW%Vs^ISk<=aHdrCw-oEJ#tAp%ud%Ze)kM*A8`qA3gGQfPe=5>Ryp{H(M zQ<~v9{XD~T*O%sdVuft7SB1C6|8kH)U7*eIU+pzTJ<8`l_bK4o-nlI4l~xaF+OEHBd`;Zod&B!`!pl)_#2@RrE-s`?cBe;)>q1t<%?qqk z6l?ww2ie=rzgqsNz1+B@`F@q5VOz^neXKssvC+2MA;Vh!#Alzce^3|ymjljfU-LQX zlj}20E|biXZnFPj8fUF&eXDtgesP1cc6{xmntPSc=$dtNbzd50=#7@gvW@CD{f2b@ zHtbR2s-(=={+-8lz83pka9Dh(&tFQNdXnS1Wv#{5{z}bv`tywkYlb!-GsyJ^TZ3Jf zE&q?BtALW?Xu{*`cJ8ilz~L^z9RdV*m*B3!-Gc;|pohB!cXyX_+q?B0x4-Ux_Y(4Q z%x+IlcTZJ)Qk|3=R7-2!T%#K*b`7vqh?ASl&1L&~@?GW5(e@6- zi%XIVo)i=nt}Z%J9N}E%p3Tf6`sz!~FA~MzF)4SGHpl**ax1BE?5hwmevVeBA8NQM z%-}w;FT9q*Lf7pQtT3Z|q;rPjjoU1KWR}R)2`@ET_u7(e+hLs*kZ&`a8X7J7O!5jk z0{JY&vybQ^PgBSH^7K-)=yiUtg1Eddc?*iF7S}3|^p560?`=73y%upPsY$}sq;4tM zm2%_SCAwp$hgxkl43{atFqn_LI?s`qm}^mCZGDFEuVgt2`DKvN~^yb9h3v#o)q%+&N!yY;M9i?d%;jVd&$1J}^-BCj*+tWHd*<~nc~jh^ zY^rx6U7ssaci~esFKotuV?p-t8ligwRt253^w7oVBFXX6D;{Ggr_Y{U;?KXB=g9p% zN6azhA1K&RJfiH8E14c4_CU)_^MekDPfNU+x+>*v`q(NTQoberOp1@JWiyzgsd4;6 z`i-Yk$-=@NMQih-@-`HkN{j5TJa?IQTr_eWc&=`<68J2b3syo5!6$4h%$*G5sePzk z?!aC48l3_5u%h|-*K$whRLhOaJDeX~6jFMk{ETNEdrEqZpEKtKt&BLI=t(`5TEEiW zjLg*5NfAlSBfs0;nG&fD{2Tvx_lROw{>p+?xtTc$Me9q7OM^U*nZCkUq@#Ac@ptRj z;Pat*AumH32G_JLHI2}(B3bphxP#f}u327Q{51bi?*5!+IWu#|7P=#1Z~2h$nJp;Ono$)rCoHc+gv)fASwS%u04Bt zK3N=4I>^cSU-9pix|&?W4U0eMpU^=epF$o7huJ=xcIdm3(AQ9kXX?AH<-ZrN&ffz3 z(ownZ^7X~v?EPGMK8&j)ibiiB~6mMDm~Rd5G$&~o?}h$ z9J~YZkf=mvk@cv_R2GE;)8q@)kup)c$hzcFz$jC31sjLW0DR>%__+O{{!lWNopN<~ zyyO)*@u2vdIA81r@3l!{O)){NEmjg)AzG|2_7o|pl~gG025e!gG9Iv+@kl5jTtCq^ z*hxSlcVh3b-GK0)z`9|-!%q$PsSYX-J$4-10{C7y9)vdr+;T1+3x9qEw67Yd7~Xy3*jK>V3IRiDs>XrRhlHPLfc9job&vzddt@qTNj&IaYyx%w`xomA z41q7`BtV(gfCh33XoIFGZ{>b6C9jj_NWoHwR147MF4B1^Mm{b#0$tB=(4(J6dZ14L zd-hMLg_p!8G$O;nU^N&`iZFUZ^FEcgeIWI$LZC?TL%@~ZO@ z7cva}1^Dc6&;%u8-_eU`C-fDdEPA9aAiC*F8DQ-Vq0t^D$HVCN$-&A@iF z02fO|-y;g7F60s|?8}Q`ga##5aX5vp#FZdYv zCx}+^5aNNlorF>0qp14w9cn5H&iUGOr2+X(QHgS8ff`2r!=2T5ghVs|c_Ep|e(WXE zCO?oGW%Mh(Cbu%AKG$aNVUUyg}THw3AA}Y;Yvn z6}yk;laI)?##@??+8cqt3_jCe*4BZN@wM@sZJ;h$m!)|^GUy0E`bP;W*MeQZtY>P| zIgEv6_!)e636~E7#=9JGf-0>ob`=Z2KZ6#0ArhiKmvqW2vAZ}y+$9_q&I-?gMRP;q zWVbX6*aFP~6IRhNSOVy^{Mash82$q9Nh~Ke5;Q?keMo`)ol2%?;L}v00!S-4h1i6@ zz-|Cue?%3PdvcjHP_l~`M4!+dKDWAf6*x1;V1IoARtBd$f;m|S*!X+EtyhB5@)F?Q zigHXDr)ZR$u!lFmxv)=uA#?IF1%*n01bl~2NPl!c+8$1md@LEig8#yc@gYPkQIqIT zR3=P>74&KC@is7uVC)+D4lv(80ptD+PV<#=s9Xz9nG)%!^iv|_-{n*CXL%)P@M6IO zA{TfbF`(tIa7#r%rS}$m8D;^BUtQ%u4X6Q)VJxtC=E8Zx!A!0IWd0(IyfGRMEPxs4 zI&=@Z54{iEh&;3aO~5eBjphQAV;-;y65)(m1c>-tP(uC!bziiCfLd;|{4a1ucEO49 z1Ku~?l>LDGw}bQK4R9@n08Tv^RFE@4w>}Dx`wY;eeg%E=CeT6-fL&kVIB^p6ogDn# zKH#-D8Mz1Z@)Ti_ZfHYbrgTD6fywX=5Z$H7a8TBYz`hv^7(N9E>?&oLG9I`cGnG-w zV%Wtm;qEfQJK`3oV7mY|e+tm@AIMK&Zj{0~GY8b*QOIS$)jI;;K&$2hN8uN+H6ANo z#in)vMd}eyfrfxLKwp@3I`@6Z?6 z3o`+){{(yhE2!kh0wdrI;)C&j14c#;AohEKKlK}u16TC|{!}(7Ew=%;U-;q$`}!E7aQ+9!dc)+N!`c zsc9_-w0z|!aq2#^hUYz8$FSUuGN6K@Uou@Ds5 z6%M=Upb#AeYv(vHBklsfW*V{)7!$+bSylo5%U4)4M?vwr59aaU|CucJfn`ylO0MXq zlmXw~5T0CHP|;R{H6ntJxWa|{1pLkApdsB1%$HR#Z`7o>3Yt>ok6W}f06=xxH zF--o5UB;HFyKw<^s5P)|NMkizoq|kJ3X!wuP`RqCq0XUqrMcvv;$XCzzErwM77-KW zJ>*Vwlehv;Q<@4@h#taAc>yw0Y$AJ=!BP+9A9V&+L+OTPAvKhm*nZ`rv>geQ&B#t&xhk#YI2APZg ztro%wdI;U2w86H^n+f0<33>{bGSL3$QZ*hJM}DOPvL5v88)OW7D;dz$P~CQ6QPO&> zSXr$wSeBHAHGmkd0M6hOYJ!@L8Wa(BM}?2p5m-wkatqzB#G!k@?WX}2pgaLxc^~Bq zHbUL4yu@fFQng^$<(FzJ^pi9Pc?ufo_Ue4~FJ!+G0XyuS@&O{WTxBx6fxp1+Z=*hi zJ+TsYT_dz3GDqEreo>C2zu>8)p_QQf?lN>eH~}4oST|p(180ORXP~>4WiSd}d4&3v zBH-@GYFBhFoW0q{F zDchBD1h_})5cC+Fr3CsMy^RdVPN7GTJ6L6`46Lp~v6T@0|3I6fP9zs;fL>EgFs@dx z!Y8Qxu%)2McVmAkvbq;vB(Ij^iG6%Hd-Qt6hs1aGGqgYVLP(0e_qGn9xEQA0x4m>Zk^5%pN9*XR0NHof#{ z@tyoe&Q`^dUeFi&r{J5BIhw6{i)op$yE)ywPB&b4fGAgMi8q-6-sX--`?``#g>CZ( z7JtukmMkx09d|r|{3dmUtu~*TwkddZXyeTNQDdrIh}xeqH1B#iyD=5C?DiK;VV{q+U9xNRecEHi?dqO@Ut~9hkeRy7~3p7Gp?aw zL6A?7u&4Z*k`mv{+=Jzg@2yHd7i@y>%<<0Sj_^lyCUUzmJ79y24>%rhF(^l0XlzgQ zL@7|E-gk8?8&%SeNoHE&bGV~hu1j)dIi~nPp+>)}LKR4!oEsDm}Vh612U~Il8rIZ>BnL_RYp^^(FYT*2b~SAu8AYQ5Di@kbarWjvJN>@^Vbv! zzgiZ5DsJW-<*Y5#z&j#~jTx4;LCvg8_<-Qgwx2c?>hWDr6uCktd4iqmOJ^3`$-h+4 zKPRlPNpXNZ&hgkUpsMguvoEZ`d@{00{I!(UF+Ee3q}PaA3(TL6LEnvgu=(T!W~=v4 zM{)VZ!n-+vr6US1<)1A5>YCvDK!ioTV0J6eoPOpT5m8ay!Y zM6jqoEhS>zp>c3X*>&fRvSxWH#q;cMO0!DeyUz2k7_D-ET&SCF*k(Q+xW{@d;F9%= z$*I4f`46+oU4?xAHg^X{<+A0aL`jR%4keoM$&SySdH#HMp0b;gv{A;KfQDgt;oBoO zM0=yW5gQ_oh0L|BF^1{$h)U`xp*yqNTh-m))zq2l80^e-ZSiFJdNOIeD6Us5Xh(c8 zITf;5hpvU;y8f{4uy&AU9QhfS&~xfYd54%L4MqEFE4nWn6PtHd7?&WWw$ z$I2{V4KBj>6MHF!x}yD4XV)d^f9Re1Ci)iop}K3@htw^y96yS7LDnkIrJ-UoVJhE> zd&wSPhq1lcKyDLPogWS=pifc^eM3APQ1Y5@H})sM9=q? zYw~@mfz(DU5cUaug=xU3N5vSanbb{=gWARmH6M8f6`>NW2fiI&hfl&s;fJwVm<`(v z*%S|X$8dOy^?=yCD`W;&kxR%1bQ$^-svuRc$DkMZ8{G&@Gv8hZ+Al^f`K;N&;` ze;w$j(o0ED+>o2PWL}=8{H5e8dSD4x^h3OXpiuLf4b`6uXiKyMjPemgp%p$y7FCA2 zTxBIp`61ty&&gM0qf!rY6LjH) za7t+S&RlsEIJ6km=8%cCgh)IFuDOO{7>ZGt3CjmA{1TKvKSI=70-aeZ1JAap5)U<> zP4a!nkW1tk;OgfnX2^TqLuZ9a$QI-#%-b!fT%G!VUKRzW??->L`E5rTO2ab9=+8%OS8a`t;3;bGkkxZ1P8g{~8fq6hc^je$t44`j1LfzMvyNjD$zmZk8S zEx~=PqVvR0@M63GvHMWSmMW$rI0x+aJIH?coZlh; z&_euv6LYBK5=6xwb!?!L*_o8RfALtFJM|45!p%l6qoRlQUe5 zxc+eUGT0fSQU`MBFRBr$sI}2Q(Ku`*HXe%y-=4})gMJTgM~TQIc$PiX&k6zi;fwrE zUI0oV1GxAM0^a!s(0TNQs_0j^awb%(XF(l%2~6A=GX9$lv6P>Iw8u{5>(6tVjMuIPlA$0osT^!9JoKaseXkCTfW4ROZ8O zZYqb%jpQEkVyGlNm!HbA{GW169gX~pj>K-k$ZH}tHCH+zX7gG67;&r&odc<(y4Lz- zy5ZCgVgRTc`XV$`Rfj1V2#NlNM`rUtX*|*i1g8b_GquHmJKC zQ`acV6#67{Uo zPcD~AJQqc)BOTneBz=}R7e33U`ov3h4Aaxfz ztE5UJ#cXk#bXP8cQzRboq0R7WL@f9*ja52JA3(o1Uzv#12Ye#{&c1KR5!3}INJn+L zY?5b6&p~fi1bVIxXdJRsSp=(js5%)rid04iA{{^h^dA<3x5jfC`5LEkz6D z8r0-Uz#IMt_`W?uveEw7J-}IZp~FEXvl1%pGoey1K^ArjPKS$ffSf5#63Vy$eg%J5 zhzFe<0qd~0+>&ge-DntWGHE~K@1=10qIgqTMN}uRP=`qmo{F`Dvu>p_PdX(M{22bR zP$JhxuVd-NH?*S~AAgvH`4=t9oP zX;PtZULrutmVtPcS@Lr6k|6TOge0+^6d~;rmy5EHDBR$Wh;{VAhF1a3ka*)n-7M*j z+@9?w7UH|Gp4u0bjfy0S5CgtP{SNioB)%qx^M}Qa$Zbre-jf2>3^@x5#pb)pKzDEO&?=FlZTB|@WjY10apwm$}Vv} zyF$26_SD`tu7e1!91ns_e-o%l+9--}lRE`y)Owcti^`?*-YGVkRkaxKs&rbX6s5g$TE zTVIkbr9_Ej^VK6{oc>?qW!+g_FTBF#{D3@4+`?zEUD-R#5^)Ub#rtVZfMU!!gS+9KqcFdo6D5=F<&%YRVgsH3T+nM zF*?#FkbdqB%dzL=U)l$zp z9Ux$86kb;ouKh&yMKwwj*$7qhE0SKGEfljP*N=^34=~@DSf-kPkAJ*B#DB{-j2Zbat!wH*V23)y|+2@TZC>mP^e++d56!CJf{r)3fP%%mgNy?&hE7pWyR( ztNGsg#?kr0T>XehJ}xw2eOPznN%@2CGkae8Qxjme1a=Cf4T0JTcwN9#ns6uSGEcT^ zo-aZegKf}e={M2>yc>NEZ*Sje?wcqwY5#u$;1;S zLF&%;@qhF5as#DJ+Q-C45zR5}=N8 zN}6<>cLPEd@AbKdy9C!B59ia+0q~69uv_JK20Z#$;`5~5!GvC?)a1gTg4Ni%C2(tC zf9oDyH>ew=$&dNXKHvnEH*#KKYa<@rbK_zCRNTi6^gZ$}nFKf;sf#2xFL)jhR+O?{)hrM@iwCK7L(6<06iMEoi1GIE1h zM=V#bX_f}m4T=lcZ|tRw*L=X%%D=IM`$5^R(ihHQLQk@{i8gf9bWu047k$nALnRH_ z(jb^xnx5;^$tuV&DPFWgu5e5oBu`e_Nsrmuz8Wslv8L=rc@wwIhx^958+v}Qndtq1 z`SAs*_v2lbk2ocMmNW6ox(J&GI5KAqm33qEA=)dbgBe#IUs75e>)I%EqTZQ)>Q@o9 zq%f{No5lwz%kgCzNxMt;TDM2*CmyMd!~ni3KSfw6O^|Ph{n$F*+s+jZog)L7+KkKY zUg|#PrTI$a{gAPVqf^dD*EONIM+!!Rse1<2^0#G|InS`pFxwcfBhf{EtNnISx6+MX zMbc3l^&2#`Fj<@du}d>4Qt5`=#q+3V`Y>ZnLj!83T1n7xcX@|cAiJdQLS1H{7j^G* z)^zT3+;^OHwsV!b8vBf54zWJ?Zv5nwMKPDnD~M)l7owr&ynd1Kmhp+{U*l$DwlP*e z4jW55N>>$y+Xwq@i=(iH)L=3Q@1r!A+qf+5%D(sfVthc*skk*MMC<_Ta&kYQyPv6U`eeg$ zLkClcX_rZFO4IMgdNY^pb&C3w-tyKJ+W|&;3crT!R?jGX0bM&L*M&EHC#;R`kZGGa zQ&$I@B0c6C3qOSa#NP#!Z_Xh8Ik2OayHlKhmscr25BF_zkE8F%=gl)?u+;SlLjxyj zz+)VDlU~hc?MUr+eV(D2si*0wA%pbIW;+Sj#1^-oHpx8ke!B1ol(Hs3ed`rFMu5`!RvWbp*?p>Zro;3eN zDb_qEHax9q;`zY$nw>~@yf^umMz5`-U8$d}k2Yo)Ul;~a^F_t^wdhIlYS(-|3@OJj z{2VqN-46B8L69Bng*lHyc9Am-!!5IougOTImSE?X3Blq8{t$P8SwYA9cltcuS)RMD zp3ZV-bvFx+FhR6UnPQz6Kc>=~L?lS2Rv;Jg!DJ`RX-d{?($6=nH6ApC8a9zz#W+_% z(Vb$Gdy6m_eS=TM-(u&W_A4phAg=$a#Hf|fp;R4XzC~w>p=v61gq=Jq{0rImH$H=l zW*5_0{w&{Q?>4vIHO^)8IJ`z*41JpKs;M4+HRWzvVAKs$3#>BQ9p6gU&@|S((FN;Q z>No0q+98@i)Xa`5Pbg_#exFWNJ-A9_5T~(*=oIi6-K~})k-*K^PFi$djf0GzH8OHf zbny~jEVKe;R8y`7yNYh%@9lfw4fDQt&vP3**j;^&8$0en63H5?oX;-6p z*d*d4)sU*GDbPmfhU#i--)hQXpnk&?A_%h|Z7z$a-ZT>Sig>A<4r~CNxe0|{z-RG_6ZR?Ey zzWq0PEdNR!X(FOpq{JpQ4y$5#f+?66&mbogy@4e!JU#<2!S7;q@xuf`j-&!KFEuU5 zYD!ajgtL)zv2U$#Tpb16qqC?AUKWS2z4&|r>U6|4ya7I&_>1%si?QF-`m!AuOtbmR z>~lKbKi%Kof7aiE_R#BT8FV7u=+?{)`X*h#7ODSOF2)Q`eV8yhgwuZq*VB%88a@^< zhA!9{tTk!Y=ygpsy^(or8@I*1$Nye<1PrM8fX#kGreF{79X|V8xT|m1*uN&w$(Rp-R<`X>-D&;-tcl04z&m8CU$V~IisL9Ftghe6W z4TDJ*m|C@oAT&VjjQoayz8CJV)2B$RJtLK2Mnz-7Dq%;x2f@( zdsH4_#P32@(H&4Ck9B3;Od;zub;c)-@; zmWyW*1`nq`QT;VHHDfdk!g8^h@(Z=#G^k_;tNo<8 z!VR%2xcB}PTX1g}iA|Q8AUCmlL=`GlH$@+%57RsWoG?`0A9>I)a+jIGBZ8n5C&a~kp6b}_*y%qW-VpNzZIMEhs?O`5Zh}3AX7OFvx zgzWIEut!V-U*ap$L@5Yjdkk>47s@QCe2h_ggB$P(brQN8zehNU`}hEiLf-%qIZJs3 zZ_=jHA`um@32TM=LLr~WvwV)Q12T|)QnDlfdoLccAw_y7e^TnfzP(K(!D&J0m*~&w zEruC}9|jF5GlC3{bk(&(!KY^gHX5m;@Zw|s0$U5>&RhQX{zddQCY*Ef1)^E`4e5(z z60gZm)DF!ZO&?7o>JV`j>xoz(^Gy^ka6{N|#^F!%ulFtXCHs5QdN!SJE>4qIsprr{ z$R^@+%?uZeS*8wVi={dI%s1~dS&V)3jkMp%QFsh`1U_dBZ)MZyH@;TB44(wi{b?qh zE9UdWWaS7FjsHWg(Bx?+=$hzGY9DFFQfG*DSTORBTtzhS{a7CK=s$ebeJ0-!Uq}B# z`d{`IpCm0&N|Ac_b+V~;nSO%tqUo%8hQ(nKEUPU4nU9+K7+33?YB!NNSRGJ+UlH1K zjTk4~!xNv+ch>)zwli}$PuyppG?m-EK@_tF#CZM<1J2dMP{LJyup-%YnHW!9rMr>)pF&vwL`Wf^Q9YCNsG zOzpzkA)=JWS7k$JjX%!!#oGjS(=z`W+RBFV`^7OzcQk}JObyY_*8R|Z(ACj3(>|kc z@-6lUa$H8l-?=yRe&1`)3wM?~(Bt-m`PTYtFg3Z=LMM4P(w4~73I?}1)3!UHN8tKE zJTNlAW_xIfHWwH~Z3wjn`=tbkCs`w1-&fcB$fNh}_WlNEsDVDo1oDr?e88$Zk%8J5 zI=jBTp+s-hf7kYbihMf$4{~3=BNVW$>1?m$E_SVRQEso>>fP-dP0wWW_(#$pWDaph zd&%gt+zi+hv^sc7@QI*tfiG>0WtHi%{;6gfaSk~nWpk%#)YsKB#NF1d^Dv%5Z=in% zeU#<-UDAEE1-_oDt4lHTFm5vbZftER()9;_fMUEp;P#cp2(Bu<-aFBq=GyGM>YVF( zXr}Q(-S8XkVsF3a+JLG5&lyh8rtH%9W5fJc0U0drzNWTx=X}oM7mu-=N(~%_mIQPW3Ig zTlZmq`7e3}w-)Yyp?i$yKW`tuhItSCx?pLZdKOE8>QQaLj9SQ?csKf6GmE&ZLR~o$DaBrqb+v8v8w@sMJ>wk1 zZ~EifA(WZef;yBKDV<-;eD>}3_*|sxzSHC~x?6d|eQoGhEG_(})WZ^}t-5KZ`PTY@ z(ZQ}@DL65BUSLn#COCmu4Ucz5R!EWjOS+0L#`E5l>Kf%j-P1gSeaqI8hYv5=s3-4DxN%tQ&@lGKP6qhAWjel@LAkY zZZLP1>&~YM5n^8{Ti&R4g!g_gq9++l&7w9^p8$Uui62IfsY~S~@gui}+2;T0-Rybq z-UVyV4_RX?<^o?!E<%nF)3mjWbu7+-r6>yN$icHsbQR0^TQdkj}_!Mi(*Igcn&d$ znx?6%Jq?lJFzs9oc+`@6a31Y|JW;yKF;a+_D2(LqbH8yI7s9pYj&Y;;g~EREy`%v* zsTxQ)nvebk-ufswj90E_wtPEo7jzW)M`hh9+gd<*={I{0S%EWR4=hgZe#WA(tP zDiz%Y-YHGN*JPDa9}uU?N{GVB7C@ff0t(a)5Vy+k=G!iu;a_kf+k^eaTw~ra0qi|C zn;Ruuks7EU(9^^-&0_sSqhwxZt!W!$Yia9lU1^?V%+sBxTH-2rZ`|Z*=7wMNF84fg zpK!PEH1*!{6@bR(kWf>;r#8a+5q+sX+H1O*`Y-y=`gnbb_HWHI@(4Z+9jw-qp9|l) z1hx@GK8kmP_YdzEZ;r1u{hhhV-4b@dTW1bZ1C#I$R9o#$9cdV3d}V}^hv}4YvthA* zC7j=TsZg>no`L2oB~oSBM~Pfp_B^wnp_!}fO)gU?747n8VEo?2JCZY~Dw?sHBuxjZ zh~Th`2nB4~8QceYx^IW4oqMt?!}Y`!Go24u$D@5fu<*TjLtvGs)6fcLW#Ge zw;gp%bZh)FyG%+!f1{=ts#*^P9SZ9l**JP$%%qs3QHvwQ(4xQ|7R-=L^+RflPng=? z5=Ymv3#A=P=;CpubIJtAch6_0rMO?6Lwwdo8)frm+uVTEfEl(OmY&9)+Dn9AeFu&v zb-ZsJ$LzC9&K4CGt|abIH(MbC{a z4lNGgO`~-S@g`97JLOyK++p8e5>{MLc&{k1^mbWgSCaoQaEN|jm=-sVGvl^^z>fhP zZIrd4>4J6%F&HTmhST#ra~!FquZmt3J}Nj=@U5tO>Bq7L?t^p~t6D}O{@X2Gc9nf8ay2>QFw zSv^WD)xRj3E3L_AkYbsFY+Ly(k!wf_cpa7z`(I+`l;dgM^lNEvlYb?IgRAOk z>k)kt9wO%ZlfW@qQ*blak)8c(an7FwbxU%~Px)pG!_^w(B13y-hlZ^ru41#{$9v-v?a_c^uR*Ai^?6cOM(8Jmn_1Bkbixc>bba{15ua z^`D_RvkID*u5g}X5|ve&T>;6V{@9_ZW2+`qnNj6b=Fmz%6IaAO4qtCArgr0nd}H@h zM^ z{=THJ;9B1Axk=en?vuP<1(%A890q7}{9L`NyAk}@);9iLdQ$3#)Jav&RlOTKB;j^^ z^T3{_)w*xElU?VD@*OWmijNnJC^}lSx9E0xV-G_=XBuOViN6Z1W>s zAKeY=6|zqF%D3?LbJQ!<7nur{=KP*}J13>^ZT_9oHm)$=4dJyi)UrR|Za`9Mos@4W zuTy>1i1d)?+!QKuqV>LMs3rxS?%Iz z=)@KYKjlZZKZB{j1*vn>t!e40XQ9npo2Y{c|Ab#LRoB(RAIrSwv^&#rwP;+)(SrG< z^~%c17I+VFhm|j4EA3XZLz`tD8_3&+>LM&L#_w1ytb^j?IZug;w$CoAlRx#>?mT_= z@a#=_Vo8JYovuZKOC7As2wM|)I58sQZTf}ucNtOD-O(dscE|LyOwxGJUCLvh)2={U z_n(E&3)dA5DsNX_;61~(MMh$eF^$z`i8G_tpr9hjoE4fG-#K$~)%?mUDw%5JCiaamMh03RP`LV$ z`|3Mse_duS#0tihCKb=IKXaDQ$-*tUE^v;Qn6_D3Saw>kSj#MWeWpH|+JWqq$FpwV zFGpW{w}Q~z9@!;7jKAzZJvmE?PM6p8nZ=pdG1KDMsu8~@HO#zIy-5{adgE%x!rMuEMMP3eB74$>b1f#^O{%?N95$WkuzOig2@Kj&XqnX3p7jO>jLewIP(fZU8 zO{zXuyI)(I8Us4xUic1WrFe>&>UX%-m#;0VoWCrmB)dairM%jO@9p2bBc&jGlED+P zCFX0=rb_eE?x(*>K9)2#{8K=vr9FwGK4}@V!Pmgk#CO~C%HyPW`M0sRAYT{(Jb|0Y zNo+FKgQUn`WNmGTHcC^I>_pVYaP_6smtEld%XO^mddb3qjJ$2x4{}=-oGY@HPxShP zr}#B}aoF0}2l16EZB7}QnvgUab_4L6iN?_1-={F3)I+my9&EyRC? zwc;%~UG0D!#%dCN;sw!J^PF0)DJMJNU(q7DtF)90^iObqDO*?iqww#1eO_Mf&itE2 z`Sw4&>-afXW!;RRM=_J)4yVse9h34f@l|Z=$mM}^ER^P^y$C)KKanZ33hr2K*5p;q$5O#5V#b?~zx@Iz$1!UnvyxxVnCg?}~FfwAd>uRPq|+ zohXPYx@R}LzB1!w9W~MPE<7tHAh~b)@5!B$`PlnW<3jwlV}?UGraa^eeOvrfyq$fD z?|^?QvySx%jMPD?4J?70pjcUlttF39I;~Fgm>flD@Ol`IrmB;qXl|arq5GjD$G*Sx zQPJvxO9i%q>c!LTh3>!Eao`Ge&NMmVX4H=45ot%0bt$H}k&$zQQ>>Z#jd+<-hwtON z;>&dH_tf;Y^&e!f@oC~d(44*mE>JzJ1bu^bA@Ye>Y7kYIs!wjk8(|s9MI~H%%BQe% ze23jb9Sh40rOk_X6m>7kFAlZWcRuyC5>m0_+SGv9h(pomQ|2cvNq(7dIC^#XfOB^rSq0GHUWL}%hIxq>Po7L#r9FK7X> z6PP`7L@&RI8SQW3`P(@bSeKJalS`(SOoWEAQLY*OB%wdrU9-*>5$cYPOJ1AMF6H0& z@aVt7PX<^_W3(sGi}FRb1^v-I#f^LJy6@5nY-?cpa$W_ zgzt%K6F(#^jcyisIQX8qL?1}bRDGh8*7@7GOWf7nt$ll#8C(ZB1bA3mumMOL=ogm- zo}B~1ld}``H~3B^;zK|^+(~_^9FQ<+1y{g!^`G{fbAK)8${X7c+QZ5gmko3Fa_?k# z;V3p#mlg0U^mOcogarw^6K_QyjYthXYi9J}WPJpY8?#U8Q63ZEZTozU7@7MZtpml! ze^@Hu`yx2vHbZKnKJ+%RkQhjgCI{dSY$&k*o2&PvSK>ncJ2Tw>&Qss@(lMp{fjy%9 zygk*?#Tnu0&mI)L_&ojfz|zo;ab&y@zb*c8}t})j!(%eU>B{11ushgxUWsJ~R&KIr7RxFpOs=u!l z4PABZHFc=#_T}Z@>^I8~IsbF+q&>_}>vqnkGkJ4*;S2EY}mi z$)Ck^497lb@^xQzLre*pI=UQe55g(K_~*h+nxs#AOI;6~)f~;r)5n7 zo-z~pA7~EV-aIB~X{Z)l0-ecp^pNnn;qwidruk%<@)29W)Rn#hx@m&$YQf;?(TaZq z9GMl^0nkS^Qpbshm2hz?@JY{7hjjV6jV7J8mkz`0AgcT?cZhFBx2CK4T6$>LP3K9+ zJI5R6Ip-f~v;#jh>v)J1#G5VE75s6hoLMN{zzi@E?T+ zT#WAnlj%84uVQo@4vNRipdT@UvM^F|%3k4tG6TuRJL%f%e5U_&3w0d9f}W=t$8)dg zru0Ssa<9qT#hv1^xZXKexL$d_cs|i%=qMplf}WgYO~V=M#L)LqYILvo%&5?aSwUIG z%KCX&V`Q@8BbBZ7xfnD3w?E1k=6U0;=8|0qyi2G1|DlJlal(D^jrtMG(w#7ehpdWv z9{nj{ZPbOx(4eJ8PTK?dqU;y%v$KR2{)ucJREkG3i|FG*fz(c2gC9W0jpn3jfMrEk{m`pXl_JHEkWk!MtjF;h@+=u;4E#Js z@NeM5{L_Tb>;%wx#mK9Gue}4^ha=z-d>*)reew2WJh@gAKvX6lBG(l{{)d~(3v@$f zAx-#>`bT?4`8s*W`AB*R{X16=SdM$Z4S0kagiXN$i;D#SPSr#>7o^?#DnDX zpgDIF$*|fclFg_@Y$I|;nIz7W{}4vX*}z|GFU{bV^Dh4ix{H6VpJI!cx4>1ICI6IP zz!}*~{SMt(9q1D5KYSLc)6CP4F}AgSvb6~;3w&*TVi9ycYAM!EvB>}NnF7fx+&}zF z?mmByuPwBbhRJ=<%FtONMUzI|Cam@3|ewzb95IyqIkFC_3jW;~NXo0&<> zSdIpsUoYrGs#o7Ce}EQqjhcWqLq20iFqPb?i8stOkG0+k6avl%F0i&Wb<*D;P`sB? z3z&~D`E`6-t`(QgePBQH4k1JJBk80_euaAC0gOPLQjk<4l!#lTQ2CIYDdmWD_^R9t z<}lrz`J0)?_2(r)5O+(T0KZj%-JA+c(MVJTu3a{9om!wfV<4^J)>5d6@HV$~x*^N( z7qOW@kz^%H%H;?1CG30VJ3Evs6W+-Y$TQ%f48%U8%jG@FKjJQFvlJ`MlCOZn$N+H* zw~p6x&7nHn6gs316sk$vrH1lQB}=}pPFD$F{8zt72cXi< z>!0h|=&S2`X*+A?kn8cCSTEqu6G{tZA+RAWVllX9)Z*WXeo$((l^ctPlzO69o-3@E zdVz8S)Em-6p^NO3@}&mKZ}Mqyo|vG1Qd)vX$4W%N68}fiS%6tpv;p{>b89=;U6y5+ zSYTmkq(r(DkdRU&6$KFxPzec1Nhv`-)}Q20tcy&!tfgm4imj}4-#k_cR{|*Vt;#DoM+%T->LAZ} zF?pn=v5Fh&GO}2os8!`i?PpGIgV>l)qgv8usY`uyOh#2Q}KN*KfS71}(xnyM-J z+9hfWe6GKzoX}=-zKAUSr!3JvH-D_3HeEMz$UK-}v{Wu?b(9;LS5{fuU)4X7a*Zj{ zVdEgVj#cGMsl42sT#Clz#wN?Nsa5`%t?)@QiRW{|LO7B3QATA>i>Rwb5(n2`iqS`q zJuh+<#mUO|$T#@OXvl24ko?*uMgdu#yUBW=Y@C$SjN0-I-H=-A7o_Rrnka zqJh(-fkuYRnE>)dV+f~&w2`}zsWC?SM_xjX<~4mDr#oEMTVadlOm3~T)QQ^YJ#dncG`BRVPT!BtRL-n9G!beozzhU%deC?>w&|k`ww;HqMcQ`L+A7@6-mKqt6vW2=9 zVVv4Cd}jHQhXUj&oo-dkNABmJaR?94qsMd ztUv3sfVrpiQeQ%b#Vl5Olck4xt~61PmZOZiJk>z{8@%Ql+oWm6F3AZ;o!0M4TlKS& zjgcSMZz03ahSk zP&`^*s-2K_Ye(ekS~0n{o-W_f$|x1JY~?fUJ*A^|%T!EVWce~s+&aLoTO0X5vYrj} zFrA|Ej9I@fpVZb#CZi--u|BCP@#9U6sqDd8qGQC#?bGECbyW`P%g6_N1{UsW&z0KR zDCJMBjeJY1B7dw!aB_)5UklDNbidq1?Vs+uuW`cirTx1{Su(idbmJVmb!0<)bt3umzWEg5>%^+(1wdAN}%|Dr_` z%fC+giYy)vnMCcVc(F})>k(9c(4<_YirfOJT8adBFv@8S)G27O3TUjToUJOH#_<>pp211s`NmNB zvYtdOjQwQDM^LZhnp~GWscdw-1*s}+d`AU_9OFH5O|DZXWdpv^=4hX_)Yqs<*56w4 z;|HTX(#VFdEMJh?Q}JpZS!#b6b&M6{j9enOZ3i_FPU)ZNRnc`v$;dlKm6IxD72c&b zNnPrd>@jLc!x?j;bcC8t)1*0a8QE?qWYyWpbeqjiE=%u3^^ePBt92#c?X_XnD^lB} zl$3xj8!0WMa#b(sdnBs6VdM0MM)JSXZYbUi-T9CnyHiEqQWdspVBd*aM~7#t+&l?L1YsPUsV`^PG^5 z7=Mw$IA5SNfLD{he%_Mr&3T}AF6+lEKgI$ z84IP}+!N2~TWOr>GgMk?e5OCsw^2Q1G`V*1x|a$j8Su_DGBYa~SM?^+m--VUPXCG7 zpshR)KYYAC#E|uHD#EmpdzgNgXUk2oJaz>S?;8C~t%+MqmHj}+*(S`VFQjdjkIe5Y znZ^ig0)FF9d8iU#c9^7mk2gM6ZNRx(Z?pwcEp1h>z1otjr7@gr-y`^e_7T~Gn*u!p zKL)A>r)YE4ae9Q_NOqFNG*a1a?3I_BZz`S4UrWDRmWRiOj}3d@Lcyx2sOYs(1-A2H zy}~C%%n6%r{)v3BeCG1Yw@=$>zFG$Fxmeo=n1?RtVor#ZpPbzjhrx4vEHaTWg#8K%(brv4_(!P7{4_!{*$UsSBthUylG?PJ~lckKMD@ z^SNukT3KUK)aryXnR7A+XU3G-QS545 zy~sLIe}**jx<;VkR?#W~e=(%I5CkO=d7mbKPYWL<*LAw`n&eh0YUrJ-)zeE6 z9bOc6EG*J8NER+cGXOwZev!$+g?ZzgKcr*eoeF;&**Q%==;1 z=vJ}8u(NT4%}#5)H^MVJdqDoCyb;c#z_-CQWC+Dr&)EFdCt;15D|UPS@~ra@H&$BG z!-E#d)G|=o8?;9`E)+To4^ma}MQ*#i)p-^29~b`M?CS5PXl85ti}Ih87+mjBLerF2 z5s}{B;b#ebdmK|gJS_R1`K{RhEVE4(W2x7juM`}4{aax}&&0rZ%O$MRrNT6QO5`SK zoVB|Aw*RQs-;-q=H5Icwide~P=6CNXnqto=SY_W+G$Q{}e!=Ui+2^zOSo`rL4v6#V>lp!+!THG*(8hR^Cm05FX$R=N?82%RioJ9+UHG?ykaVg@c?` zwOFaArB-+g%Wp)kjWAudwAGHw`}{qFee@1mv~?nRg`?yH-nE{@{GSVw@<$YmES!_S zBPTq2<;y|&vG%(16Z5pRs8Vw>3M%I%d{*jPA{vLwk33DI67=lYZP7Qw+b6wmeieCN zTH|l&{~~`xp_+fP;7895|A$nwo2k6CRR}9(QKN!V=de^NDRv9g^rlN5gPyx%&G1H|8AGo~3rQ%qX3hI)b;>kn=5 z`t$hrE$gE@M!U_qQD&*6d@f*eIP87$Hs=57yy5;#FTr`Y8^Z=!Ut2FmwJ|@4UTu8A z$By_aExfFi)5-T z_TKfZ^-fm5F-meO&m?)5uc!O-yk5C;-lXS6b4KtEBFy)B7JC17p7d4p_OpN#{11Kr5pKc{D?6+CvwvHWHEsReh7ES}=NchrR7 zG|q?W=qvBdLl(~1%#lB)c*>-wf08+?WaG3M(S~)kGR5Co%k#zr#|A6=UBN7GuRt~b z0(F;qOI~EGH)T*&bA&d@Ut2E|EN41onq=D@KFzYq8fTo>#|M5w-mGKPSlpzVkwo=dX^3^Q$1yTQa3ng zgE7N@(^uqf=DX*e=HEl!TU_9czkP6R@CI@IHpEz=0o9r+7Z+)a&rocfnW#n4ew zGV9Z^YGmLiUxa5Fc@=}*A9yBsoBAIIT*2q+Cbg%QuR66C+EZF-B<+@~nbOU!usjNR zwJE-(_~4SQlMW?BMdesJNseHJz#iWfpV_y|cixxkxA>R(ItIRFo+^?mQY~YJWs+qJ zC%zrk#;Uu>>TS)swuZ4-ucmGf4D=oMjPm^FQGDHfS^g7&LBTV@M76&*h03Fx8E6FX z=fo?;U8YvxS4T%Vt)2Vnu4Zbj^!@s7 z)_dPmaj>r3oi)}Nxe0ri^PJsSPtLPaMbIv=(ds$#RquNmbbzN+BoYm0(A7o(cfnSsmA9eOg^lqTa(UeF6K98PvLK z%3f)tiG??AcSn82okvdav;vKm&wJolo6YlB@IV*HH)fUd_zv?>G8n#pE z&P^q}d01ECW>-Pw;?t!E(`xRecxo-v<(JyAy0pWvr91 zV4Y`QQ-c-#pU`V5Cx(6pw>XV1SW&{M66vFc-vjD|tN?-!v0w~h_cWQkQVP6i#a^C^0)GIPK=z)lTYZyN39i3g{A^W7Uy7QQDO2jyRC-wn9Pp;XWGbw8sn%S z@{EcM7WNcertEkhFCYO+OD!i1Tmf!-$kxX5YTR^>ws(@pu1agzzZB44RG?Tud zLgY5E^(#Cxj7<9>*ql`0{gz4WP5BK^7dHg!EF z(n~$YY+;YPhke^c=y`^Eie|8|8NRCt9-f1_XwHV6i`}9M7B2+~mw{4^d3roge?mQ! z_SiKF*r6s%n>elTYj#E5k&4maxFIpbB9!yGIxM*;MvnE!c62x`aE7SG@*XMK#apNxegMM~o_sJ@=pV(h)wK z!I*|(IS7--Q%9sPRX^)kEtnmEUED3-`8jPZrh0a#mM_4*h~%X#+8N3lF`Dl3&)ZB(bReJ#HnDTHFnM*GBt-v4Y^ditO#U}sD;xO`rU=Y2Etzkwm2sc z{K$UyC%7zMUSjGiFVa88(r|z(J(5<5or_)SM|Hm(eVVjaDNEL2F}Pq(;w^V5@f%)k%RwbksL1PQn|37d<7~^FdAbCEDz6?ptj*qr132K<$2Je zF5I{YzAcZeEJ8c^v5J(y&NdGIsBSc&>dQ%O7d1>$$>^=GuVsDG68ljDDy=3^ouVRj zUz?GYx7r+KS#5n{8yMarVr9gz@Wx?>Y`v_V%zrC(W|7*)POY-qAvg=K(+=Na?_N)l zyT7Z9%g6g)XKQzsYk+5hXSU~OU!UL{^@PTJtN7(@)=F{3<61`Di0_@aBH^9*Ezu*w z8b=g`Nzx*H74@^NY6khl)q}~@cP#Y9s;zV*&^u^T7icH+O4TUg@uk=?7jHEJC z3H>QGDppwMMmz~~S_Xu@XYGr%sG}AYtQ$-WO!UnStoGmaob#HfGT+ga?E2KP-?f^& zJ=rtdU)?t{n5n!dc0OWq^bck7(|VMsmv}05dDN)r2G&odBy&G~wV%8I`LOqmr=NZz z;PWpEl+;)G=j)Y%JN?;sKPv?qYL!fX=}S!Gqb|!&@c53gb~O2{Z|QBdae9AWUSPhu z!h1PzK3I=79{O{g_1t^hEuEvB``n7-xpR}dseiM#oHi!vO57LL?@Qe((=J&}_%^Lf ze7^NasfnJh^w)#3B~V>|U%KpWr^cx5 zIdx#GenlPSt3&-CJR|xds-Sl>KQuR1ezD#r@57J+rf1SK?MwV3lhjYuo_bI9^Wal$ zyjnN-YoKNz-#gBG!@U>}VS7)ud%Lf+_p*0YAkN<)kQsH+GF$GSwlr~kY_(#qQ#abW zhE0#DD7Ums#)4B_cFWYBQClms-DUiB^>Kj@-MMN|AK!#i@1>;(I zYmnSlFY=4H>|%wH>-FggUj{R*yG(X{2K5B~F^s_b%1Q4}zG2cP&-lO({^9yJp7yL{ z)73wjmzODbl##Mm`OSL9a4QWhn~ZZrfPA6{f-j9DRQ2Ai#RPv3ObVXxedQhH>*XHl z9`9-4@w%^icX}`Q?)ne=kE;RWlD<6reAIqhz2u7V)#6shUWq*zmSJ;5P`}Q0*K|(a ztoZdq@)X6hEg8f5X}273EIUP)?AlGZU{d&Qf1(HWe0zQzNCL?~H#Ar^4p=I|Ob1 znwly2uR2!mP8G1PY4y1L#HL&8h8M(Fjyge=fk1c%Ym7~^3{jfeE-Uwx`D8@S=gfq| zYW+a9V8`HSf4jgwc08y2ebu|_1N}GM&q||?d7ABsJ~3vCGF2XJE+<{^7qaF!H_0{vgQafXnET&wr+=`kSzAx@@f<5M3+?$wF zk-Du*WWJ@gCExa%>USd~N$<#66h8#^d29M({k{ELeZD}f`h~g+t7mg6_MVqdaU%B% zsT{u1vsgKoaP~9$hI(Zm>m6C|tYH1MK>40Z=}D$irsq^L`i=TsJLCuQ4LoB<^qTr$ zHCY`N+#2{eFffo5XdCECwTOZA;Z@hE7xgAaBRqm1u!gqg!B*Uo5IrfX8K-b~ z!dFwVU`$w&DbJc_eah(r)s^$ca4pyPR_hl$8H^7e7xgxRgYm|f!3XljIK&>UnCTPc zh_Zllc{A`b2AE|}ax%m~eXZ6v*degl-`ZD(eQ+i|^CEu+ad4}Go7AqVS1%!3q=|A_ z^A085awcMJ#MJ0fu|-j*B2yxJgwn^F?62aV z>3=6UQ1z%osNdF<8r0jUKHiPWO4yI&ozy|wCf8TooLK)zE+?nTby;~&2>D8y<0}qh zy*5UFp=Idf*pZFV617j&U)6T1nX@ZutDC6^wt|{ZZM1dF*>j2Zuwd)|o>Svh`J(cH z=`FM0dNAy4#5a*8qe?`c3hxtMK74?vn_@k0ZlzqOio`r}%`@3$9`rZ!Kl1JO4fAgc z)T1s|W9p+cqng-b*~~e{9XQpai?V=I$*Xkf_;vrx zfE4^C*jxQjjn~5TlbjFHpK;ER9de{;v*`!ZEAwE>8?)KkAZ%M$OnB#r-r=fkn5~WN zpk=0IJ~jQfDJ_%&ynj155#^A2I@lo?9vncmsdv;oHI{7quG(v@ID4$=c&xi~mi-C+ zIyKiEoXb5e_-?Q`Hthky)xp!jzUnc~xoE}CZH0b}+RpFE6*y7kkuuukG2JtznY)<@ zk23va9%?RSu4TT2O()9K-Smm+lBtW?Fx@tlLO=H)Tks_n<1ADoZjN_L_*Q=8q_D}F zS1nY3Qr}Y#A(wT6YT#v{TyP#I4rB!@sfR;ndT8vCn6J4Rx5+VWU@DLuotycgE1L-YoYHlk5wW5rK?ETCcUjbQaeMfx@1;vE%nFRTrky;DwQWSkM>+k(c7_?ovr^!ZI-_J z0KE;>`J#*#oD#5u74{iC>FZeKe$V+Ki{({vP3lbalWt1&kkE&68>&y&@B0&0|$tiE4IpsEaTeD8i_eHrwdUFPEtw zc%B;l%kUa!^4k`)ToU`7Z}76tVg9Y5_^<;Ul-p5fueJQHTvpyozh->wV*ekcrr;)O zC!Qo8)57lKh+c&?`yqCnhoMI|c4+@n=~0#L$iMSC!p?eu^bvK}Z!@}z_^B3ien2y$ z50;_g*uXUGG7Z=<9%tXxfi?XIR?=bY9qu#YlhSE+$oKHU=Wr_NDXK{7>_orE!#c)j zP9^r&)Ox?jZfclOo*nuk_P;K6>BZP%j|PGd*cI%hHkfGR0XwNl)WXbTpR}LXGfoPq z!H&2QyN8z4mirX1UORS8OW5gLguAw}=c_F>z!zr*FFknneReE~`1kKpXZ~BxG3be} za4(*$#q4ZP;W15RZ)IVp;$cUhD#vr$%XDyFhwFLNy?8=ZesK;&A1cPbV5gj~*J7t| zn;ls_DrsiIfntBYoobn9fp;V`+I4p1m)PGl2%W~z4QNC){3`6pb)yHn(wU6yH2r;# z9#54V?13)RM;1FvJN=ztpVXV(@VjWc+0gnpyfvEr$hVvc@Ca*42Sz)Vz2r;0kRIyk zo7w#(V7)j-W%X=iEC4;n^3BRsjh)*GKHp(J3a6rFOCU;QZ{sYwe&p3?6o`5-aM+kE}*TE zR85_PS9%mX`Q6-i3@&;~+j+oq6~4}ZGI7*>Z4RY`l_U)AsKO3BAF7^)qt?T}Q<0bv zcw?u6feT=K1~B)92A}flM#er0EDwTX=0L}}@NE{5SHwzD84gUK^^bUUg?l3D!;K8& z0mT8}`5Wxd0poLcjR8gxgY*Oa`~YVRqmMz1ESD23^1((H){xhHGEqa%fG2|B(2ot} zHm|Gv`T)pIVVSzjI}9vEV3l~p(}$thHMrpzznq6gXBgFfuIvQM=ed@PwJa=T>4~E5 zV-~iQGT@;yve*}#q#->!7}Y|cJx?nSuG=qZJozx`8s6KC*$_;M|I6^g%562#32PxhsRdT2ZH_J$kJLc9P0iv1FbUCv({8 z=WIwWX2Rt^LA@`b|-i51}DFx>;8cT*Fv=Oz+=y`M+wYF zFwR7t@Pp$7&NF!fOwj zZ-wN-41UA7md3SoGJQAGc!Cz5mlqjSmm0x9k2?DhVXw7g_7=7z# zavL023p;aX@YXAYy~;q|322)zhX{*jdwy%m=cded-LSe2VBI_@bY4pxM)^MREq%G8 zEx(tbO)q?d@gImdcO5A%0&foRcpb{;Aw5~(Ejxt6ThQ$elz7d!pMv!OySs3nie*e< zhRk5Zb>Z<2NNK+iWZn4u5wmI+=H8C*Ol>eE(`PIg^&%@-^yP(KS!fF}8(c<`UomEZ z;}YE6nrHg45*f}c_YMEYvm*Eg3+{)Ep($8RK|_@0e=ImH4&8F#EfaA+*+|D5xZo=M zcbrzw!3UT5{vSHwELR_MhmU)#z}*;`90-njQ9brcY|TT!*tc98K&9)>NLCZ*pUema zw}jE7o$=cl|5aMr4rd>Q!yX}tDtIbH?lq%0Jktry+LJc=1MN_3#1mMFOvVN}jWy9E z{*TAX*^&`ff|ezCi}tY_fzJe}P>d19!7s)5EtPvpaAHm!sGJhIw>*(p?;wd);Dz{* zRxAe|DuVlWxn4blm1uQjx-#(6}AHiU_&ki^$ubnT##kkbxetvtO{ z;vRASQ&q-X4lD>>F`+%4!uMIo>rHg{pUfRg(7UUcMK&{soMl$OgM{6qM?dQ~(L#Nw zJOsY~0w2P+RPvw9=WpTvk;v*tNL`f>E=|mI&uDXBXm&h68~^h8H1c$bQDyNGGA!m) ze~4E#?EDd6-31PcvzpE4dm>jV)2EP%62M)7^>_<-t~s*N4u454K39ha>NCE&%qkVQ zJBhbATgnTDt>8NW4vOPy4)k||cNZ-SkAawJpEEmok-!IF`6*XkLf<#|CuUM>J00Ie z5*jHA|3!QHk3*iDvrDLeW^NDXD8N-GM0c^i$maPRMk7`v4%&GFK0SQTqc?HF)eAmZ zLvhMNg9&|}1n*ekhEhnP@Ny8IM~g}DHMTEWx8T1iD_vj)yTLxC30%DwIMd+$B332O z8BG+=iEhRruxwuN^(C08_r9t1byh+7}^zmh*22)*BGg0l;Bq} z(g?;Bj^^_~=R#VKp~VPBlLMWDA*u2Jk(p5yhWI@TIyljZN{B|{PHNi#5yi1-KS+OZ zA>6|Z;Em(}QvTIr1CKCK*KHn|yEJ&ASHdSvcTq-{6<*RUr!&8%=HwD$CcxU@R_ zkj@z1g0Jf`=F+^=fia#j#6#`k$g#{j3hD}tpunRs@J|ZABmB(D>+C)VxP&;VlPeHDH_8`3(r_$2yy7@A$h{HlTR zXV68AECsqIFoq~b6@(f#a9t73i$b1?c*4$;PVOy)+r_#^&{&)u=Y$vY!MKo%Y-ZH;E>!*{#>5q6xH_^NlYGl<6;F-rQ8y-^}- ziuUZbH_?j7#n{Ta`v|S=XI(r4>}A6jXTe_~d=Z6i5Idv{Mj>>!1Qi4)#xVv#IdQgK zB`6urI|+V{hJO`)$!5)cn>Nm}51bd;mz-u@yN_>wv&uaNmpo>?DIqS8g1VJ}LxMiB zaIKhg65yBSTooF!9^6tIZPksDH9=p#!+q)W<6<>jkvm&q)i@0n6d>FW-ky?45RJ7) zp&c1d?iJv+1Nk|Ad5jzm11cda51?atG;%BC%F1dhjyB(**(#tn+>E^ud{O}C6bC*# z6xPZ1s0%D{+#zOY;YF_u4kD49RA7pSN5z>fQV3ICbXWw}O0a5o8YRJ79+*r3UWMzz z4k2cKTp-{XcUjM?=QFq**Uvfv;tq%YEd{XATCnLWq~ zBAtKZo0vt9!>ebQ3m+qa_uxUX5>OeB!U#qGf@7b8vvlwfgpW&svxQjok;yiU`y13h?^IVl`_ zj*s|~XXwih&h9<3&>O?@d|jm zMe9O_4$$TmG^IFY(gc^4gjXt~Thrm;IjlZrp%2AwQN!Z!L1tB&`u zvysn;6ck|B`I|Q9^W0W&KLg9gX6QU0Z7`l)>lyl7hAzLuC^qsp5v_lXHN`h*j2^6* z+C#<0tRbqPX@;?CGQmgrw0H>4vSV#{4Uhbe4t)*(xxi-{+|ZV>XMv3h&_p9=qBwtr zg)RxrbHW%1WzI0>%Zzm|S}~j0l?t4c@f^J6A`K>FE{=Syqu}EOef$ITt(b3bp`Tnp zS-`pEL^8n<_`jgvM{vVPAZ*8Krz-tBhy{5DM2*PhNCZcxz}Fp~QlMB9Rw?(47T})R z2XN_!$YclLOF*{7p7w3%(h7(IjLv{}#Ofv;epjGp6eGLBT$+Gn-{zCB1=Zl10c2$0 z5S64FA8_x#jNv4sy9fN@bk!vI#srVu1$qtrTNQ1*h~3f0j8bruu-jJW^J#v)OdG2i zbDZ=K{BRR)HKEV`fUo~UJ}*L-+CW#A$SuLU2H%^pW9*359K)WjE@SwDF{Hr(xMpZ4 zgLc+o-%7@Ee;z30}L7=S74(%u$Ta8__7&Ea3V5|nK2oGF12u*hu&QF3~ ze}lzq*qVAlt2OYu8{P9Hq~$&Xmm07)M^EnqDzPu$1b>x-lg?uQy95Mhi0F5A9KOc4_Gk2W<@WN0oexIUM+0wpJSQ(hx2XsVsTuL z=J)`s;u!dDAU5^6p$M`}u=FE6{fAX|5mwk1So5}%W!8(kCo?0B!;0D!d)@`UEya$w z5eNs<_7F7Q735$BvN0WRK`(wig}rS)F?{o|0e*+{t>Bl%VDUKG^&6f#Lz|;%{RrA@ zA|9SqSZXJNp`U2U&Hat&>1SfI+G2s-0j~Z4cNfu?QDiPU(V3C(=wqz-^}yF^`i&;m z=q9}KjP_HYOEKoBQp`XP!9fPAq%786qVMxaiV1q{!ZP`QUd2xT88r9}JL^jDd;;#g ziX2JIWP%E+fpHN-b`%VV72{HHQIA~g zSfsfPn$Lt)?GCgZf!)5bbcm>?AK^4%9jnPM>RaOS=Ft8r^i314^}~lS4Gw=7sS=hi zu?G|Wh-GNLOt`!qobooFi_-XAHefRt#+_vuaR;F60pAXxt)V>I2c0$w-^O&b=0dKv z;h8mDleqr?`?kh#dRw^Mgngtkd{-Ggx`CeGhI>2ES3~>+ZSYPkM*GXiTQg=239UE- zI4d(p%^*5(3O#?!-*)i+dz?ev4=YF=WU2=^uZfjlH<;>)onRU(6Cd-*6wcvp4<3HN z;t`EJjb&Y41q@VYPF(~>8lx42U1BY5_r>#-$tVWUc60Q_c-k4r_^RN!8o_8JK2HFa z=^>i*lp#q<0dMJQS_|LFlaMK8zrM=2Vg7XtZlzpl!gl=g7|*pf5tF zjRQXoc%})M`UX7T#sc1*v7`g{M?B?Ymi++ToeC~YP^X?av7D$*VSE3GF^Kb>ukhqx zpgzpnaV1`{-=W+XRt=M(Ln$O**hQ1!2pcm_H}v>cbh=pMw?)s5AltDHV{ORDYC@Mj z&~hA@{?(2XEm+tl+RSW-hYRk=>7ij&F&?B)}PS$paf7;)kz*VibKQq9JFX5pScDZ?TRQwv?UN z9E3C;VFumH3Z^|ec@3?KwUw|l=X0V;W&DPvfaE*yD=eA`aQQ`iKm%9-JjMr;i1rLe zPu>THNXB@Sd2$N)yMg9O0DdQZ?Pfl?hTixqv_80mK8}ToJJAc*@mI`6ht&m>2~aZt zbPLc-H$t*+W^7%+U{_@LHU2nZfw{wMn+(UdqK7}h)fq5#4+w3HaUr8mWv=rvmz}4L zr(`jYMK@dztFl@^~M>3L|$XY}G^{rC^`ufklqhxta> z#tNAo2BGQG(c8j%X9}&zvlw+DE0^K$?L54nbKtUfkc9-OU5QV{!Oa>$_np996VG8>^Qjp3BO(dGsVHnGw!_vCd3T?7`e`dLdT$0C1^U6 z^@o?4q&#~;aoYF>ye)q-XWk0My9SsK`w{QFjr(t+k^e+y^BDgoc1mmSs@&RXP$FqB0UsvO=qsq;K1sPW;nlj!S^4~^BwHVO+s_HUy< zgokf0BWQ>ooXWL3VA09nE_m{;LZ?MsThC~wFc;0o$8{YVSA&~`?WrNSO#sHp$m2Wc zv|@1XIJm)y21;VJ9>bdGA66Jwm>F*~#|xi&C#c_qHNqQOpMkXch?W)BCb8BQoL>tG zxWU+7u}*R_GO<%T3%oDTZ_%s{14Oa+hnCM-(bk4fR)DXKA*jA%W}gTS_Q8E?;f9hx zwwL>bhb$awHG;z$qrXyk+QhfFfHx8Dod*Vv!jD(!e;@iM8+hBHT~g@Z&dNaSA}TOa z1G;<&&7Q+?B3fBkvU1_ypLzBVc0EEm;?d(n(TLfsqiQi)F(bDG_fGJ4A|&m(@a#0^ z-_79h3@z^Fy67vN7Sq9Lc`97IfCdu#=|8}Ou&fk9$!GMul`G%ERR!djCo)GK05W0U zy$98OtX=x?^h(yWFL`goKb;Hprh?-M^zj>%@S;hwXz?jLk`IR`&_*&CFA3hm;Fx-F zw(wnKLI1y@!X0L?CTPocz#?qc1zed3e#-;rRaSLNfbJZcD&Qao$(e|TpcWl+ec$+;xzmJJnhcKrW1hOos3TaVTwq?W0N#ZE zZak~bRs7Z!-ZlgG3v4Pv(+-Dw>tcHmc0&VATn8R)#9ePQzq~-lR0X?&R#lOYMC7an znxQK4BdTJgv1&4qrqW1T0C?_zMRIsU8qNt9Z3wNybCK8Qz@Ecg^a2=mao1f&7!Ovv zA}5DKc$1-n2Yw&Tn1zik-{=eNPr|{%pA?|CMPNP*ZSWecB{HARfb(DBUnf`BAl-FX z&BZ|To!r*|9G8M?KW7H*$cPHSZgti(b)e#1V7~~SZh?^vXk?8M{EgNfghYG|4tp{Z zVQF$hv&ZP}bM*HBs*GkH?EqGL(WV5H<5*|)WreUF{o9x9ng>{-geB|>&-7vpkCE(+ z@Ut7(H!?=ynLLZ6?gayoaF9exiD{*fzsPz^Uf5Vt{=F`$}$4O|P z1LiK!s_?nk&_ef-ejg)#0p{xqYk_o3Meq*Yj(e}MLHhGAqhRwP<9o@Z zIv9 zH1}x#1v*!(=JVm7J3RA@-h_2TSg(EXdm1k>KL~rf4_XP&j)>Q}&z*&|C%l^hU>5dc z5iuhoej>nX3Nx(mR0>@h4SvJ;FFe)7;Spg4uL>WffIs1-O#_R?8KcBEVdWKm1#4)v zYU7*CYC^=+M6;V09+=mBb3x@G{OMzMP7bvqECVUDBw7>R@-p;OiMNQZ5vvN}7go4m zc+Uk+MN7ikc!$@0_$v>soP*T8gif!SPi(ZC#M2FU3D0yz=qxUaw*uBi? zGb@m}!D&H=ZdbtV8*nWmYi!IdVs;VU2oYZsKp#ATw!+^lG7-+QO2S3|56dP1vlT(SneHH}KLcKHZ_G)2t2-BR#K? z7~!)Nes1B}G4ZU}3naihnT$-t8JcNJM5KuL9O0D^TqL~U&w&0kZ3w)JaX6s8ut7V4 z{AuXdcrYMAHxb{Fj${eHb7SVfsz_8t;8(aVEWYu;Dm*y^ys{n;^QW*qiU<@WjMJ5uuH$ z0hjQH*F_&!W3S&4$q{zS=IAF81<`_cbzrT}J!yui zfUERSTf%c#8VVGHCc?j%N;{SLEuJf}@QdKJeE2<1Dj@m7uAj;E zMEVspOh)Pg^dw~UAs8y)|0}R9qD3DgJwhvr7RteC8MG@jn22CXr6u9x6+RZ>uMl>S z^Kg>LGkk!Sx&zLI_xlYk33(L$n}#9%Qy+?pyv8#0UXwOU@wYsB*oI8MVdO%h4QNkt zH*#A<`@$P<;XaXJCv4rqds%~L$^%C^Fe{*m1dHwve>{gHga*BaMm`Mp?P2A(2Wr7H~;mE1PHU zpr0>6okPsVH@WfviV2->2YxXI3nO%}$EZ!qrRhU>R76yV;EQPf3qEn6OI|{?7ibmn zz79MJ(q#prk~~p~QHpq!nzYg!X?YvIsY+Y%Xh0F`CG6b7UjGb9cmckjL$Rkwgb(P1 z1Pfp08(?+;jqtWbF%t2d&>fM$AR@~|ELaq8q4k7iC=QH@9nSw_eoAwf&||_ICb-E5 zyxAd%3-X`B^zcnKy!ViC-=OE`A&A5b5Ejz3;XGl1s(Emfi2D$96yHRgh0v(se0#+& zFM(6k@OwaOB390V{0qOC(Cu#e5W6-J4=8k}7YWbiuh=DtNHd`?gx(bKQV$rjN~=QW zHb!1+gk-D)*ffwY1=*6Z_lmhk*zNBFuZZjuerYj-iAWj|Qy}z)h!!wdb)~@pV(lcn zVIoTL9cEH7d)8&QBCd%zsBmzX0#^zzg!uLbNJV>MPIdyTm@luukHSADA_PQCS{9>y z1?}v-gdU9r({<>nKCg20lF0~~!;$qv+$~mK#i5JXlZYr@fngEhAmSBcL(-8N;wuqt zC*oV&V9^Rh95n%UO~Cj62tyGMQ59O2WK9CRg3wJbvN6NsLO~7*_zE^`g#SB`7HX}otK}Qojg05#7weaeTh}?_p zx&CF9B&-!Txqdbzr-C4L68Yisb4h{O_et>7k!xxxY6h4y;P zh|fSJK_juUx);apPNu$ zM2U%b12GTf0f|_Rh%t+Gj)>I}^5JCV6@zvW{_YsstpEmMz zurr?L^?MfLt_yE7JK} zgSUt)%s`6?pIRE+Ct`ub3PVV$9eM|W_%3tD72tfzmHWUbx`h1O*msD1YH?O^ zX1K@7_42ecf$CsaWSU^i7f+&2TybrU`nK977(->)2I?)fg1R&Kd+nL6nH=I9RBWxy zNy-iNAM{VywbsLD_Onr>e`PEJ%a!m>+#>rsQn@bMrP0cF$|$*&5-)!)-;|qEedMwH zowA=3#a7CrsGL8a%$L8EWcgF2h542|NXal&rP|{>=>=8d)|;BhVm2;A#!+>4a!bil zFU9!@$K>Zqb?V_%0SEV_&*hGa-T0lIG}#VDM>Ue{)HE3nhw`D+UaN`aqNMzUTCPvo zIsPMc(d<;;Xl^7Zv#1pwI*6LbraL&hsHKN(fHNW zNl8zQ({cGw+)}=1yV$&_Dl~$7+xUp1lepkDty{G#*_idyRA&<8$ zGu;So^tRCYGAI9FG*RC%#dD%qL*q;^F1Sg~B!6`fkZd8F?=vYTu+b=Ieczmdq~NrG9H`W$<%~a(aTN8jMmyQbtxwbeyNNxK2vx57E(=MrKc@TIR*FFs-d1iSw`8s-cy1Kf2?m6y;&h7S}?URb$a^7;iaqhL}IjzC(t+#7- ztX;lX!1ld$al}>AB(;K`TdZyR&D3Qqc7C=^HhwL7Kli0mH(r?y^HE!KTYY&xX30NX zW!z^xRRYzGJ#vzCL|x;*<3B+?u@ju9ImP`Kb?Q6YkJ;aLd{mTFblLSfILrUY6&|<0 zg}dx*!_Zb)`^LU6X9m35>C$y8eUx@RaJ@@}A3_KlY>-JgU%iOPs*Vl^yV^xp0h z`S%Jw_9@C3C0q8HKQN`KOFWakvxB3xi~cV?cUj@ibBd1I4>&ft7Z-g}u)V0Q zr@&p>u~$`_q}HhC`NH(RUZ&{ZD0AXn98J`Xj&$%I}6j@@&((O?3}zoflI}v zCME{LyyJpfrP}_k_Qx*#{*h@Wmu557iH!?02eSOtsqX!oufFex;00xoUeB>J|3%T@ z!nbqX*~@d!IhwgjxIgh&i+6qha@5n@((|eBCKWLo2Q~zsN^$19 z{>^zq^Rn!9i^}KeIW-G6J14mpInR1JmpakrWAn+}Z)C;hOdh7TF&~OsTKng!cT8`B zbNnk}_GvTnJl+ZBiV5@8358#HJDa1etvr&eUZ9Nmuv{*)ct5<{LSGireme=y>QV@s`r0nEjmVr$DXvlf?#Tmn=^c z#y0%8)BvTsdzoR6KkjK||It$|VruN?Zp~ia-#AP*m3P;43<~^UIU()Q#w&Tzfwnmi$xpOm}bB9&d-rubbVlr?|(fXJZ-_ z+n}8ae-dBN;NMbBO=kag{b8|xy1@$HM-x?#AFU<1n!C)3*;dv+)RpQyDsM2| z&?f8K!pbD%gzX3>dQND+%O&-b>SkS+s`_72d#})OuIS^O$1mmF0_SDVQ)hL1qiVYv zkF(eJr~B(Ce-&|7T47xqx2#F+l<5)0-LoyG*wv0?=NS9GnCG_f-lvY*!It5t)NS56 z_D0%cOBEwmy<+vomkXb-o%WYeS5afEYjA^FNy-b9E3BXQUE$+`RXL_NW#1gI4{>$! zK6jj|{XyM)uYm3e{z1k{D%d-^GfF~eSPp% zs{ISMlx;1 zls`J}>%3A0V{<+&EMBzMx5(u$V}9%V@P90e5~r0Mq4=qbwyM~`vfrmxPk0(PHu0u4 z%A*&J^FCG=`y2YL#%SwT^08nkPOyC%oa1wN4y#SXN%zF2Ir}>wyN7ue zxD3u%A7pRkxM{EE_|vh|?R5{<-m>0^h>mu|&PtFIF2`+)o*nCtEfJp+n;Y9YE+Q^6 z(q`>!swzhq6F9ScQQ&T%OJH^2dEgUYX22SV@PFG;n}bVfEnLKx_X~svuPI zuMW%(PF0_(CatU5hm%!@QAP1jW0PE@+%{b`{b{aZIcRBU9$*f${>@48pITel&e~+o z4cKI^WvOfa%#=$_p5yWXSaIU~O&Y86t z&G5xnkSE|RABvSfmGg1h$s1Xx=SXJxy0J>1NVRL@vy7d1Yej@@fT)=pcqjTx zPucr;h-ul)p4Cgu@L^b3X5bZ@W4uR2iYjDxuG4Gc_fhcSKh`(n=NFaVwy-w8g{P*P z(GhRbE%I0Y#={v!74$Y(QPvQVHibP_eWINHqn=s;wHubQ(*KNAe~{|l=ZPX($P?>X zL0!>1(xZl_;&b+M%dw3e$0sD>AB68tW^X z`tC(V<4Ah?7T?k&B4373@BKHuGWE{NQb8$&JlYF*D{JDN8w7q{=s)5|JW7nv6)BIJ z_sgl)R)z?el{~o$3)K{Co#l-FdXn)>FGR_Dw2X!O+H6tQBz`!y0VfM z`5VviCd?G|^r+R7AII#c6J(+mlD^O?N zOAU#-#4!9tUk~sFcW0;foDBZc)GP21kJlew{E;1TE36%Y7ISzuoZ68UshwGzx`SKc zy<+TjD{#*syq7iUuQ$~K>aj-`HbEVW#AWin9EO zY6Oxz9+=02*TF;^v?e;}4p3d9$2j#rhN<`~lN2YQ) z;h_X$UO=wHenxYcDhnIX9PgtE#(-5}At>S*5k2z<*3b*cA7^6_=UBkLu{FEuAl_t= zr8t7#CPDRFxOyu*wS(4sAdN@xYwf|(l#V~`Di)Bp;J)EJu}eBgb-Q19M&w+zg1%Nf zt_R`mkJ)Kof*VBTfeiM_S@H>Gk#%VFyYjx^N_9LrT5;6#J`@a-o9nHE7de?`l9s7v z`Jbo({clZI>uFbr$K7sx%o#+pI5BI2TwN}vG~)d3@k&kQAeCZrsi9a=er$Ze->c}p z9AfIIu7O^(p^N%UU+ZIxjbwq8mQ7ebWbW8SG|nk$J&}V$kc3ny{ymagmFkW+jOF@P zaBsrDeh8m!Pjt%|!$Z_hKHmB`cGh#{El{hpJeF#i3Gy+{4Y664m}|+)jZwOjcHh;K z)sk8T{gif`3M@UfTzw$*ie!DEmaPua^0j&TRK2qvL&b~;&PQ=jHRK~ST07&gsh%lH ziB~N0N7Q1uZ0f9}b3*$c$~MzjDufPE-laO|A^BJN0d@K_q?SN&B^3KP8cEE7LK;%A z4m-_CbVOh396Z%auotdK9|Mrex0xR*Aw8K?_OVe#tQK0m2G^=1>20XNF&(Zugf&Na zJ4A*_TR6eMhUkYEpP*ZWU!f%Z_^>5yW;PK1dYSJPu==z_Dk@>U`2@{SDr9YaAM1@1 zSkA&d!pHCoTT=|2>BM#uhdwC=&)4GJ6|U}!?2N$2FXD1raIHP|sQ-KUEWl7e^w(Yb z6#m0naOiO636cBK20h-HzD5!aJ0A_(5?-wc9ShJR|M#)JpkLwZ685@x&?0rQW;JAF zof)5qVtEZmuP4gn0I>-hnT`I0TNe@6JT2s@eu$+^#v1h&av(-7yk5dzDzg1V+{g=b z>s98i{j?#nyv`$s7TPsoLlb$eiTo9Lw$+gY;dK#_VSmuaPe{a8eEGkC*T0B=m`(qu zu>Xk+>=GfHTP2oL%*;#;gYnMC zpwpdB()Tw1FaFuFb<%2Kc6MfV_Ps)k4vWtTN=gBAstehD4&?Tv;5{T4y9D}9hczJp zA1;i~^Kow;bj};>F2D{#8`3d`mGE3c{9g>?TNiDwjQ7;SGgUG7D&Vt{$mAufn+rK? zLA2b0HPVFqjtY2JP3*+>hHOlLM0UV9jlj(A2`S0MJ_N}*>w>s?CrI`TNJ~?!3Vk8x zogmwNVd1sLOzMr_J0bF03t2L)@J;wADk3YWKJqte0Ku^x)}hLfpMJQv6*NId@EHAu z?7a+R2K|CFCiP%@_CYpmX=Gcq#sAH5trx!AB13H&&VGzX9%WBNF&81HvkmxQnjyES z0nnv?qsAaRbU1Pg8{t|<+@Fa|;-28m=?@IQe$qaie>e$-3Kum(3Q;Yj6uPMdG+Lfm3RRhOVS(&L__TbBSPYuFqEraBn1|FFu>ew_gG6V-?#h9_e+~Sq zuTqwnEu9z7Lldy_1;S2h^PWJ8w|{p`cC~Yt^}WOv=Ol50yhYT@ z7)`>}#E$XDQ2=U;^tD~oZX{4I60&`z{z`qPF;a;%}dmvDX-3NB&YJ7RH zZ@9$uz^|-~{f3Wnv*K_0C|NR{1XiW4VtH{zWFRm{|Kmn;e+9#AC$<`JM|b#t36y64 zWS#8o-~+Va2k#aJ%VIRVeu|loGDJ_0W}??whFTt*R~kp?z+NifNKF&|3$NzxvHb$g z{APby{{??*_FM2CVk^_dWz=MbmamoX1CCs4Ssv4uSx#H%QSbpSic^KS2*tk$rH7Vs z8g72DPp}d=>eGTvgYAPZ^k0YYp~w`fseGeyk-CC*q26t97&n-T9b zYMa~#j;;BTGT}~~I`}%k`v>|v`mg#=2I>UUL*4mNLNc`JNHEgQl8uwcD`qP;DcUIx z%4f^cneo&qvA)oXUm2>&6|gMuGh+glz<@wFaG(8!s}epIIU>zriYeZ!)@ontCm0u) zewd1yN0=*`tC-dry6IM^XDFI6{iS1(%y46FJ3ApT&Y$Po=?nQD`)jaioFV+0KO)SN z%F}O|k@C5U^Wc$etnw>8ifMB28&ZBS!&c|}haLoXu~Pz9{p z;yikaJVUi#^HkT-(A#*&*u`|mG}d(0Sl=*N7pG~W>?>PMIfa${nvg$uj6EI*`ZxGb z_(ue$ux#)~Xb*o-m;n~fdrV1rLxo=1Oxa2q1hep4SxIIfH656rCVpF}8gO05ve^Mg zAenv7UJPb)@53F10%;_pPz+X`)C|{c)Ef-j4ReeujDHwM807j)ZJfHRVm}j09TAT3 z*`bkK?chN6Wng{49=OfE3^ojXM9=jS6R6SjE5<8(Cm)Om?eB^?@}V*vGlF^|HW!xj z+VFkuW{_uxu@%8X>0@^UpK;Ck3F23(qHKqvhPuDDmA;}O)$q6BfbpAgjIo?yhOUX` zx$?EFB)vzh3q;rbTxPH_yCaYsC>3CVW4wfm3!mfH3vIzISD#rT+afQen5ihMI4i#{ z8w%~&QaT_gBXz^~xI@7`h^TiCR1b^~B(fcXHNu<3txQuzl&ZHTO+U;y#gu6J-Ka6P zGmbO9&?joUsA|eP)0@T4k$K^pT=(E~R?F(ya;%;0#T5@LA{~UiVl`?meT~^H8!69F zq$#$_|B-bC>#AQYD)i)EhZ=CZ*@l67{=a?Ez8vpt-%@|YV0uKsDAlX=drS(;#b{HE zDSAWHRdc+#&@e^YNZFgo5$o_Kt{qDO7y2%XeURYCVEa%ne!TdEt}m~sP|1fff77)Q z4_U~>$#|v|Y8W3eg*S3}Y}r7Zud*k_z1~&Xb;eZ$pd_7xY~-uFilJi6f%tt1^AgMn z+vCQ^{1FAI(ydjVrmFKFgVR_I8^e|ll8C)RkO`-R!%`HOxbMq3`4IV6<}os$<%m=W zuq`%$W$G~c^Lc1h@S?x3XM&@fRiD2xf2#FHq0F_&Zwv2}53-y}rArJircE;>Zi)LV z=AikI<_+_2qz2c5jSF(&S7M=b6cJIJ(vYPo=PP#6cOyY=31p!Q|3hjET`@_nRhQST z(%w?krf&!v`Havowr{}bf9Gyu=ku9-ML}&_eBp8XTeqFtPG2%?N?B2SWQkVE-J>U2 ze#DlIjp*h{+d{j-lw@M;beR5~DlRU<+I~mgQn6l4W&NJcfr79+qTuiISE(HJ5M#hB z8uw}j%BBIWyJ6%;_!IlD$M3G^o#|cb8eVWDdsp`4f=wPk;}rhELsJpOfXgYN+Ap^h2S zEe9-R@V%cdrmGm;TyQPZg4m=a?tEcKKYL3a1AnVDB`>G!DG=8wNbD`V2Iy58r+--7K zc$(XY0@hii-dm^ChE)7J^#Pv#u8ZgvO4 zHPm&Bv@E-$*qgXr#+C6jxLXeMPyFD5(0nuvjw&$R)(+RaRU5Szr01T$^TP!jyk-D5 zeD>|&ipy&0CYmor#c7W-e^B{A2c8%%5!CSy<(<_f=wRrG?~5zJ-Yb7|&i1dqZx4RF z%Ae|KEVPzCN&c(C*ivqFtsks175YiOsH? zKg0JY*EW0;oR=&;v*{USd$f|Ssd6S}c!jVd~N_=N4UbIcyQ9nsnjkX1@1?opUii?VE;9BdgD6YQB)Z%J8``D5k|2f9l zALVZSk(>X$aBpFImoM;@9;+@IPvun1t5z^MXjY7oZla28XklM*+nB4&TFeb4Y%D682Pr8ZXkI*F97W12w1;rYf z`l`#Q<0(g|q0O52t>B@9V!AVb$!ahU6u%ihsVC44f?rv;7%#u2oDGKDIm%phDOp9X zgU9JU;MwTXSx4uu%-vUb%kD1F=3ciy2$iGXi#=k#|FWu>Cn-_)!ZOR`R#;R)?y91T z`DA+2w10J1bamDB=}fMc^@X)bep}xJDPKS?6&+VB{K-*8nkc6!Pg=6{OeB)K&^F68*5?R00}0#$ahgtJn9DpAOA0OJPN|_# zhfk)ephssaKfx{t^MgY}d`BJMU6nj`PcK)2v#u+}kzLpjK;Z^oEv`-IIG?84RBdya zhcSnB?NiE>5)3UBHzHFE&n%k^9kd;!jru)?(~1!Roo7{~1)t0=a>ueQ#RK$C^&hqW{%=9+%)bt*7KXJ}>b$2iFI()G} z*zch&tI6`8iT$iBXD_jgg zP#+-75Qat$MSNikaFb6&riVX;W&?eF5v;q~TzgIoz6rkPx`vXu@4*o4ytmv{u12^d zu$vW;A(0Q_Jn*_!q_)r}X$QR+^R1SAq5QebC(Dt&meKMaiu0-ss#sOBda`D^y1sIh z;;CYjd^e+FRx-e)mwpHp#0J7$zBm7lPl{{=&b~f!5ZOHr{t_>S3&TvLRitZVf-n|2 zT=%6Th#h}N{GmMj%3@%T@rxUAa%deqWr7wo0THvY;zjYT*b(R0agqXzl%0@a5}?ll zo!Sa~ToI>$1jM)9h@jj+w4*ls;0xG=As82r5rexAuf00_e4x4j-`Y#Bp`YW6r=Ngr zbQ10=1`l#3BDJRxsTz!SFDIDjLRry?J&`Hcd-)wD7J+X@n0h%XBC^ax~j{qKy- zc0~SLOG)Ur(uipl!iTSmnA|t2D!7OCAP()u9!e>&6D>qPJp~{8DP-+@#Hk9x5L8+6 zfgkh_M9GIE;(i`6BrrK+pJ*NGkcZPteG$#C3QnNnbR94pndk+G#ib$s@dQzy4T$B` zL>;@M*L{dC*GEjGCt}qN5F3r9E2DM)qJO{A%Ydpr6enZ){5+LQqBn~W%Q=I$mct&x zY5YAKk@~fWQ-%;nd4br=Se#b>Kxt_m`sOYbpj7l2#7+D-l}yg^uSTC&qKnaipF0Pw z5q+!%&wns__9hUXKVg@uGa@$M5Pu|5s(pwR84;1mMih)kB$Q<5ku13O*iCwh-I2AZ z*&x)fF(PUm@HGL^^tXuZPQ{+aI*jr%oHxG*?wj(of&Le}3!AEhIAS6_6vxC zPDJF7;IEMLPWKQ`AsB8g;Ze6kY>Gn3CiM1v$joVQ&y=Mdz!{hbS&E?Ts}V(;kKL&w zh@S1mZq7O6`BldAn}I0s5j~Jd+tHrw*y)&wpI6W?n@~p!YOn>fqBFiXBZ@~(h?GJr z2tITaVoW0tIq!ycEdnqaXJJC3`D&A-_{5#N0QaEkzJJ>W|&2{&;2~;(P=n*n|@QhX6(Jhz0O^pTNH3 z9ZG|pnZ0QHZ-}+Yahj80OA^c-2l{6lqM(N{{yT7gcZ}v5^vQY1^(yo`$;X|D-MZz7 z;w(ZRe8&7`5UW~?XyO{FnQREtDRPb9E*+yQOV@=aVm#iLiPkit@-Y%UP@0PxPai^j zEi7$8ly8sJ2fH4(BwFT?`U^Gr7EDulzUUSyw7k7|9c9{qd%pnZ%CAv^Ov%ib<_cr* z!BC-*(vGkwR z52`D@0EwU2(Eu%1kE5&9w-7M1iV32)F-)0y^mMjci zvkw~TUZin&Yv>X;Cb+^M9)w|szczm8Io}u0~z86ACgH_*E^Sf?uQj?;`;#(PV z4RmZ=6pd_*R?>3%9oFJI!9&3HzY_NG-K6GXFR3|nb7QKEa7-MJwYeCzoav(IEAK9Q zC2OO2&HyC?n)ObkO=w>5SYU$hrMs1Lr6bKz$+_I#+L`Z-33U{f>&u$=SvHv4C+tbL zC5h(4x)R3UO~1)YN~XvTX&bEVWuXDQSpYMqa0QIpW05%!1_HedY<}r{h`+{rLyyEZ z%53E?s#WSO##^ujhtO^5z0#Qw7fj}Ea3k4y{ty0V-VdJ9&JbCi1&`!Re? zUEQ$8INUfswsm@g)Xy=$n_{E#qmOCVGrNQ+slQl*a|AxI8KF+$ccJBiSNtr_K^#{A zxA$v4KJu$@Ch{m$Cfr8q&15Qi%Xg{kYZvL3s@}@h(4{0=co7N&8wDx0EZA|U`*wjN zwTE*R*f_JCS*~S)lfh)!C&LF*bF(h$MoQZvo0HZ>?J^#YZfzc@=qirlw}=x$+x$Cy zUjrAp1Dra1ReUA_QD5Si*~}9}A+`!rMT1bt#YHYlYMGtMQ)>0sbq&-?#VduxY!r%x zR&bioKkOcVmT!x1o432Wrz_2Q*frca&9%|ZvdYj~nPk{!o*%U@>Oo44A`g@2S{574 z(T&Vc6vah(_zz(=*W5qPn;dA#rGqkENWwR4tJ>00GXb(QvOxLwRzeHCM- zc~Vrnl%g41lkY@p&4Z&yMtxDOqiXUA;$v8wb$o;T7lSs=6!r;I#7Xov>NnXVrXD2< zJ%st-u^1U17&$7omAPea72`FVv~x87DBj60F!`c_ug>*^RW{v!%hz>X0(=>LiHApfLEtZ=oNd^*U!7wJ;}MS@LpjDyUH=e5%#7AKS_hMZk^XWJnCAq zKkZt|=eV)a6XIfHpXgdC3dJ$ZqsR>Qt9zGcPvE(q_IB{s;S7=}l)$d>Rry8bSH&3R zOjQN-WYu}aXvN>M#>`zrqh|=3h$eg+(Xd5?O*7x<@x5$@>dIwj`Rr^ zA{)Divb?gHs*kFSdWxq+3i~d5b>~y} zQvbTZuheFxOxsPLZG4<`ETwtMmAHxVcayKi-!)xUosn-=eiZ5jpSl^}SASE_TW59m zi$GHNe(+*wMdY}wzw&@$g>sJSjkbm+MfFjBMK%a}`;D+Yd^OZRm>5X&74t-6M9r?= zt|V7~x5E35ZOqM)j?2#}cj=z!w#U|subMD6c1;YQAdjCL)j(HA)lriv+ZMUVE)Bd7 zuJes_zjD3w_6IxF5O#lPxKtCXQ#r)}MbWRnr&Y-E@lJvdq)(>9>>abzA`i{!3QZv(%MqmJYKll%OJCGJU8G0LT9zMyRpgSWs>|aF>^)W;Q(WrAsGC|Jn;3?JrYqE$)%t)(n_t2ow*w86XfjsXwp$Fh|SG;`FSRgaWT zc_E{r7h~Nmh>YR8BSZKln4vo1t?xsd!cF)*{#N9ka2?*yUgQ~+#s0Gw)*>Y}6VHS3 zXDi<20Gm-7G`CMEhP}*V^eWkDMIBWQwOxHjvqAea`aL-&Eb=>o&s2;qBV zG|sZT;5YJT`9i)NSb6-Bh0yLBU}=oUK5+oKe;ts4GzGaA^N~L>897jWfBGN`;jP_- z=a!7~G}~~lMx^U71HcJ8o0-N;Wm+;B%zN;>)sV6|3;$Fv-oLieawV5Ifps}QV?-{F;ffEB)$ z`Wv6uhkr-T`pe-hhtby>>{4f7k2>?`8Q*yLKLWg;tJv>f`ZHUKU949FKkUM~E=&0fycLc%y6K5B&rG z;21n5f?Y>WJCZY6ZQ;ERftNT4Jy8w)5eJDWgm>`@-)Au|8X_*y7@ofg89z1QCCxz_ zZX-LOCA`W7@WMY*+3-!TAQx{RdbvD$_#%AMrm&>L;I|dwU)YgzSqYxmLS&+SMa$|y zD*uERcnV(5D)duNjCl&Yu3Ko`OkfR0M5W}!Z1@6yCIx6OYw#2+jfSUp0a=-acvB3m zLUbb+TsSLnl}Ap^MR;EIk%?3W+@LM7|Gtg>2Uf8Rt#l%fuPgkf@5o%sg!i70oqmFD zmW}L)E$Ee&Kj$Oi8M+F)Re@G^M-QDtgrGDK=`LU{Rfm=QC!!oJ=-&{H(bLnAk7h@X z#2WNvWsF2L_A1JPLrZ}SLK+z^_2AWALw-RIjGX{)GmV~%T&!L2SYIKp;S?;AX|T^< zK*s;X7%qbh&w<|C0#C9tJcB_Pjnl~E(9*~xg{QIv8F(jwZZ?Nnh_N1oIVOqc5D)2r zclSW<>1ZhpQksr2nT_*u3&3@D9l39kR2eNTMdQ3N9fSTlC7r<=c2arbLh2;;3x_C;rzaw6Wl&dw?{Z$e3M?iSq;(pJfFNqpAGvii zrE3_?a?&64cBwP{3$<2ik9-Y@ZYk=Sfx;vvPAttljI@=tg}rh&(ouFaa)_BFwqv4j zzV0NlqBhf8#G^DTZbD{VF5)8J#QD@Su>###+)35KeC>w3m8sGrWD+07*xe8d&@Y>$ z#`F(yBGXJ9Mwbyw(GO9F1gf2sj~tnK&=rlvkW?ZG`Ake&2R%%t}t{xnVUiz;TAxPmr{Ls9S7n2CMG>68y+d{8_^ zl||%h1M;R4p+R%R#&m}Gnm&qm8ATO+TpUYx6{D$hVtaa;*b|a?k}56LpcjbE=pB&A z_fo9%JJUlr#QY(=qnC>%nQ7u#YL~bW=&A4XHiF}f@+ zk(8J#e?wcTfr3V|Tn~f4ZV%eu6Wr`QutrUT4#O%bo@a^+OJrq*Mlyq##3evLr$a-9lt!5p-24 zDoZR)zs2-_9PhD~YQOXDOeT-{e%;QBU zGatQF9J|WwC85Td$?4e5vCeQJTYg-S-| zm6oalT{8tSJR7pPWY^{`@fq$VI| zj6!T^6;>oGp4$k$`zv*W-i=-5Vd7s*C2>D}OZ*OLxh0loE(z)MTFk3+^h}KJWuYxi zFnh9L_w}a#KyGw1#O(aY&e9|AEgzb`Ct`hfDU~#dt|G0YE90(Tr2eoMPD6{npt?#= zs9Dk{s)A@?aKeWMUpcf#RXT`KUx>AEH?qP%V8-->ey@U++$nCMrwac9yRQ-A@j%cJ z+hIJ$Kw~dP#Pbrg#58&ZP9jW$9{Yo8MJGac&BRHD5?J^01V}Mj+7~BG45?aRhRZaOP_!6H&%v8a})QxOs zT8qb^NlHQ!bf;H{{pmMCPiCZ0g^7l}&=NA3Ep?+Sh&DO}GGrFd)7QloNqV=U2qsH z>+i^s>V%x7sp!)M4VgdfU_yzkO6rZ zS%?;TK6KV@@dmXOvynnncqMdMnsgB}ybtW7Q`8-t^0u=L}@sc zjHqa5;X3lTj|mZRyRaE{(|APbFHre7)xDm1O5bNv!LwS2$)al@+i)YYB%R1IJS>9k z7bnN(3ZKD187m3cRl1Kch6aSZw8f5y2a%A4;JB<#Ux6*IfyVDE$)(TY3Gq6#q*hl#{TSi$MBFFE+tEB2Is!=Rg{!BRbqXKo-Pmf)xoECC)C4Z*J>%nmfPKrGfU!b&5c)Ewlq-i7Yik0-KV z=aTGMf{i3%B_M1ugwumys1WWGH`a23e{csoF_-a<^RTgRV4OanhHroF&X5drHEK>G z^#oNV4mNrI&lcQ7*#y0M0qVFAZ<+~RvmCz@yX`70X#uvo8oG|yE0yt85@TB)dlrOk zi|~Qb`0N9AGP0pl?*1(6Fj~4FyHJ;5vk^W5fTQRhppq&wv1%gbaL~Bft9FkE^xGab-g?Wlqq$WHL!hDi|CkY#2 z6z(J${UlF66Zh0YX%*rBw8ya{ah`b{SH6WS%A2F&oAjzAs1G5|wG#@7p zHlV)SU`lMYy4YT>?OsEZD( zaxQv+jM;5?LN_pShp<1g8d_p5*6Mk%-KRtI68xpzKWlIUV*;L=}1?`*a|DmtL^)y20-4hAV?nLKZ&Xi(R-| z=nsNZM)1~hAQ4~Dve$S!*|j>0*|-TM5st&T_>G{CUPE8r#QrSdeYu0*2!r7!l(h{d z5`4^)@R4t$_X*Yr!J>&q9}|3}c*qqwi$Uazpqdlpt`Oel{5k*LqvVtL+K1W`hE2l% zbRKi#C1xSv+anl5MIl8bcYYX7Wpu;n_kg`r3HpX0*j0g)rQuD4Ymb2sXNTN}VTGC? zI|M0;ASMzys(_Jh1exrC`|DxHt|dw!+;#+=r9A3M@CV8HhO&@S!VX9{&g!s}^vFFwqaz}XKI-#US@Yo5O7xB*t8c+I9$s~Lq6*Kl@XBY-tZOwfShMyUJQg!-VyI>hWe9}U#(C| zE3~}?{)T6Q_x=wnur6xT4mE3lyW7K4BOd3UD0ewzdO!9?C&Lz*f|D@)A>m^YmFb3i z+oL`N7r6>**#f(&P0_cV@cuTqO7MGH;#v!oGYGcCc+7`Rs7FV9-Uqenhmv~WOwDA} ze&|p8c@lPl2cqPGxPLr88HL^>3>+oV7lcQq7Jk;nPx60F%-Ux7i|ikh_L8VWU-a<^ z^f8HBjKI%6__Q^8t1{Zu7WWgxzhXaSiy-q6{;nbzqhIjV7+>{KCgHsN1GOg%dt@hm z5X$a`@6JCZryuIv1Ap~I9s6T`_r}#W_^csX)dr(k0i_dED00@~e<;#6pTiFc==$B5=pAy3}Av3s6h!h9f7`WhF0eN~1M3OdDbK_DOt2yeu8|xyt%!aiWfSBif`dwMlC@YjB;4=C zT4smNA~-FFOEwm{3B!KZ{lguIjJ6B+7H*2J=?RU6E~w#WtPgkG+L zpS2)&U2vs6=4?MmL2JlHQ}j+{)V?HYPR><*gT}m%o+l@{9zn|ycBb?A{S@AJ7ky8d zBnTQ5VSoD{N+Am^N>KRz#|cP~$;kRaPPY+E$wWw11=NNhLM5TMGawISMpQ&A2|KC< zwo5*qAQ-#^vyUJ$5ro*+s0rykf&yj5xCBu!&lp*9u8K(JcC0Gfutu%G`Zoz{);vU5M`L}+!WjJzsr?>$jBo=I zo*NOTL=I1;j9CQTnRE4#c%z+SoC;0XR4J!v03}G+34Jjb(F6Xg+ zZO8XMtZVz>ne4|3cNUBp3?o7qB?v3x zL-hO^^xz)M&fVxmB2xr!Iv+a3gT5e~f&as_Q=k+R$|N2E!7?N4s03Rt1Ubz`Z35aD&ZD?~1={&OM*e@?$SnGooJJ)!I5`zd>>Gj%O88gf@E2h{BP?s+okP#~(Hn(7 z$AZ+G@YWIbID$w?ux~lEI0x;1jT#e7dGZ%2-HN*8qy7Xll_1y>RNg$aI2WHkz&MbT zj06LeNL>!D6PBt+c# zCpN$SER|ToBx8-RH&w=*BK#8NvEo(6tRfhj1dTKr+JZ1CxzQGa8~Pr-LwK?uLDGmv z<3>Aq)awmC`-l-C<3SjI2_L2r_8{?%MD)TB)P|ty5%f*6+wlS=5p3;Gci5GD@@q!I>o}>SWa|{&S@l(MD1x!C&=ZG&uNL1dEx}FaU3g@GXXZdQ}R@ z4vC}?#z8m!FT}gQV9be6@)^2{a0`$zC+NoC@f*RV{QgsRKBEu(kO^YTkhc-vhH&E$ zCS4=GiI$*%`kjZn-=n{up*KF`cQWTLK(4N#%!l~&=}%c87>IsJ`bhj`OTXoBnL-8=Xu_^=mH2cjjPK-YZ1ZUc=G)59`Jg|3f+ z4WNOg83Ws|7_3wy{*HkS=*DSMFHWrzB!PQ~9___W;5NK}D*o>zO`#N$1Ccx{^*2!5 z`p8aFqhy)%E4mC2`;Q>Lk(h)Q`sYESTqkcZQBZ`gBuBoxm#=ZA_-oO#XH<}%if?c&Hl{Z(*DHd@>UDg2<;F{7^j-D zwP{7BCLd4uoSKdhL5cHIa}ojxeWUuBZs=r+L~XOk1#yyeG&qWV zAAHN&y|&;H-)Qbqa4=h3=!Bev*0K-UFG`nopLT-!iTVW7kUmTK`7zwk&{p5|)?(=E}-Ls@|$~ z;RjNM$Of)!;5BFS6=i#}H@ts_Hn2%txyVKOvD90!T$`s}t7Ft_HNBNnktcRj3WSq5 zI(RzJ-aE*1+CItoueD?0bz9i>$mVs;^K1!Ki;SaNDa9nMB`xkmaW=Vq>fJ0Op`~Jh)K38=oRgi;?UXIWKG&XAc;3~*_azuFb_0;s-q<72 zqvB%I%&GfQt|vW?jkDy($aGUwnJR(yNe3g_gT;cSLQQ;LuZ*4VpUzHUmjx&A^J!M7 zr8uhQRW)^;)jd@_GMHlEuTP8Y1p-ua|G(Z;pV`^kHQG_ee!)@QIn*)4{l?o2IF1vg zBC_V%BbL`u<>G~e63Le2tVBm#(dfD{-wm0%H3~1Iq6+x|T$w=kfY*D>*T>t;x6?nB zUB}%BE5%CGTp-MyRt-{XHD}Z>RcjPMSrg`@q!(U=DJ~co?wjMO?>g$}XgAvbDijLS z9P#d;?{=_g1X<(ie+;+H&Eh&Ij!3?kvLua8K9bZmv0SXfv`JT1HIbev{@?}#ntB_# zGo4Kx?HmgoGu=zPtJ(IUQDS4}gJQe-Uu`?xZT;{1tJ+4IGO8i+s&t}IF*G-D&C|o# ztng_;L4LFRCiyiBhJ&!-v!^Tjk^fCmSr=oTo6sU9A#HP!^x{=BW@P+Go0Hf*rnEUl zvxvzR&jfq>TDdItSJn*cp@JdS9`-YifY;Be_*|-&vOCUOEj4{JZ8onoy)rb>)ltVQ zc2aNoF~Kk1EN6$ph6P`8E9L5QTjk30pIFV#Ti#zePF$-#Xo!m8lgFg>%ve`^e{nuz zLJ?!yoOr(_+ptlQLDlEG_*=Mp+2>jL{N#eX{OUH9W0T9~zZBXijF7F=?AG-)os60m zXxuZ%Zq~9oeIv!;YP{-UVgzzUM~gjm|R{&ORbocY4n_PZsvFo&)|{yZp8JjSHUG?mEYN zf8nZ$WmU-rSJZ;UkttlNKch;qN9l9ZTcov2a9RE}-c_Ba+6bT6RPSx)^TK)7QPySF zakg8Iudbla!F`KVqMN9iY8x9==0@gZ^Fq@t1EnjcW)wB(*OAdc>}%!z)lp!x7HEKS zSF}KG_1h*n-0t>lHNG=5TldYF6}vI{Q%b3{c153Nlum1yu1Q`RbJ*Nj7bR;Wl@I^x zd+I*qSZP}UV`{K6yf8_%>o+c@a$woy$1T+{J7%YfRnsA2r{VV`SB(7^K7cJ3+zUkEX7qMNd3Cbp zrf!=;uktCU(!WYJ@e5ElJBRCV1tAMpI&j6m+!n;)lXlZwVyjT#oUU-bcauN~=m`cJZ*^aA8ry$H9EKC|8Y-T4kc-0RQUgH73K z$P&q7eCkok652vdjNC6DErV4p^c5>bG~$QwtgwwquSB(HS#BlE7TjI8t~(ygopfkWd8lb<@#%}r#&g2 zR_=37r`zUO;qLBv<=yJL$tPgfoiV&j&r}agTb&+=(Z>cYGfY;E+&oO0W0<7L;AtgC z9}K+@<_PmWm4ki!GdxqdsKDL8>_{uRk@QYpLDNsI)Ld1yRE<>9(%KgY&jC&$f6NW1{#-E5Drax2aY3y$?V`Aq< zd-bDr`?c@oi;edqujviSaiO-{`pA(`(EXST`m)%zfiHmq{-iKRe8N0a-&W?Rv^tgg zI?iTZl%1nm0>2|s1iWr&KzJ5+C;$oeK5-|zr@LtHWM@6E*VE0n!&j0|6NXEIx>{Tt z^H|H7658mj__Fb{qMI5-y;_%`oT6DA`6k;;U1H~i_wW}3<$X^>tp6r3bmKw`!s)z* znt_woW@Qy^lBT}ukZP%-yxay`_lr0h=jvXD=Wwmq$AJiJjJIBwE9{=-Yweted|b}^ z%KsbpBGN+2Qk=C^wHQr(ON3%8#%Cp;izzVaj4ETSoKuezpHXe4sqD;fR_IW`?w=CM zWZSaWf|WyC!?pQK$ZhQ=Kdxw}-L2lE{;IC1IwiltnCW+7^~f~d$(;)J57h8)@gDT- zasLDK%RR2_5FaHk`ik%N>hzoGa~)k1wz^N;$I>ay~VESnie zZ53wXy!nmbzQ8U2W6upw15bf#qNlxkp65^RQnxzr-J1>@y+>rctgfkz?s(LxVk4p^ zWpqqgmN+f0WX$MjN*&O>LF};;pUP^36}+Q;ojm{gXZq#`p0Z!L%uv(FZc#yXlY8Y? z)uS|%wJF+f+AiuYN{zBOV*}cCkFY-2F!0D%-fecr&qU{CuhW<9S;d_V zzvtI6VN+FAk9b$gs2Eexb%}iH-?66?G|@wK#|)e4-2v>(yGCpS0OFh=yvfls-M zGjcyXSKXgoPJ1=adzTzI1V^|jp&1beEl@$_CiNCgS**p=^~->@utnKYnaVsD+la42 zlLNm6?&959jy_JS?T&q*E9iLaiuaH9Wd?2m4YP~1PZ@7|sIHpSI9{1hJ^fh1k~C$^ z?BvzvJH~H@Ec&|aIMh?DGmI*%!OUIM;Zp`ilhm1&j0R#iimfO*LIW zJ1l9SWpYZzL__lSq!BTnlZqL}Sr%(%%UQTu$tnjq0jkA=~;JWL% z;~(Vj&V?dtgmd)Y+DiH+1}1q&bc2+rq_kvhQuEmS#CC@HQTgiIvSV}`ZUZ;l_0)6H zu5>t^-JLF|;@6^&`~FR5HZ~L7Edx~QufdK;96mxk5);hM>+ zBxP&*q8KfF;M9Q_U@ZLO80Y}jLE%yR0@rTW6!%|#MPLj2PpGD76nn_VXx{7P`cDZ1 zVz0+}QrpGPPi`N#Jiddan(>)FC<`)!!*{to-tF#xo#X8noNXP2?(*IN>|QQK057h* zo7$yLG_rb8pJ5!Po1wm_8Y3S}4HRGSJ%YS{n)i^ar=x`9s6EM^?^xk_16dv9PhpR8 zP5Df*99>y1seML`p;YXkgcY%sk}f4ZN=S`c9AC-O(%42nNzt8I9x2W(@xSt{c2;(r zaCUKgbnfxo^xtKdh7D3}W~5@e`l9ZLzMkQb;g$Zp_L#b*a+BtfQ~vuJf~NhUXVwl|Z#%n^23$M6nCqL_S27t6gu{Z!R0tB5rd0frQ10V-t$T zKabsO`D`q$6O?P|p+fu64gU^L7gtw@t+0(he?vyLf6k>)A)!&RNa2UA89n;?5K9PQE``U3j8U3!%PRntO(0 z<~cE=65c0PNd6_Iaf&B#d%~1Bt>sr^b#1nMy)=#A%=$coU2pAuZRf4yZBK1`>|NdK zeSLy!A~k7IzDkp=e`Z`^o*K2;T+&qEa7)7}Ovv{#ha`V-PuS6>@SHWfz+dpeno!u- zan3c&dnHgg#7ACG7v;;;PW^Iox9B?Y?GyVX6;ED~{7X`WgtKum(TS$Ex--fFbdvCt z%k#Z)H*g*=tZZ9qJ8ZjLc*A+y(;?spEfQ-m*~&k(+w~ib3Fhmj=f)|9aoSR8__A_?shQ^@-#69LN2&eH1hI2?PT+~Bk87^|p)Jey-qxWo-|?S2*O$RPi9AOfMWuPA zOENw&)drH#C}WzQRc9%t(CvlfP<&v%XS`EuZ)^LrJkDF)tVyv#~ue?Mb7F3~${(n7(oNwU?J8kD| z@%C@d5gsP6CFBxJ%r<2U?L&QK(^&H&^EcBt<0IWibrnTr+84ROz4TY})OFUipR`5W z%GoT1W9?O)S?(^rO6-}?FyRfgUA{qmSAWYiG&&GBAiKGU5 z`l|QHCs0iz#W<^Pm3xn4abbdOr}dTfjjgu*cjrm>0Us0G6kaUOXTB>7bW?yswJ!cd z;+v!vDK%5qBsWP?C2C?@M{P3nQ0ryq#l4}U{Y8+KyYHTQ`?W}CX92A;`=s;&|Vf<4Fcnxb~YdKs0!ch*j`7iygyd*lOMf z&hqxTw$9c}Yo0Zu@TI-6OXn5+xsaQ7)O`6+%^AaUb5`uTgx`|#k}au|Q(h%G6EDTR zw~RN9)M^yq59h10;~>En`vO~O+dJz%o5u0dC3x=!H%4AlTLBgMLI0O&YLwd2EvmaY z&+u8>N7YaEKpYY_v5!4i*$NL@hZpoMkXc*XWcInv8o(fL#Py0Sp(w>DZJv>fY98Mp z>1cBI)PK^3q#jAWp7b&9rlo@EfaZm)tdtz?>W}vbj@7ni)-u*`K_&RVZ(Y-TS=?x3 z2m6&(b#cax=2eyvmU~fS%nuBcw4aqH8Mn|o^w7V?UBuDbHooA`{K5I<3YJ)x6xMXs z@qG5nLem5tw#n`K+vdbrOH#3vN2$N2pG?1#IxnST(&E@9QC9sGrHO73na1|>OmHR? zPAhnjuP#_vu)`MPZ04~BD)X za)oyb>gFHIi^)$ZxNKF~V_oyTSJ^baD3z%=uDfoU8dEQ+VM?{M-!hVlG)YfL8<0{q zp0|uO-cl{5&qijmE_Vu$#s}x;KN!Q9XJ%m{-pexW|(22Srh#&dVTa_ z%RqB4gHy9uVWX-=OLFsa&*#-I*k*g`SnRO{E`-6Zs}OZY^R?Ip z$wN|4rr#_wvS@{j2I*YNwD_*k&5h+%VM-pE707W}?bWRf^2~Xi@^0t-WnJyK=6)Nv z!ylp^Dx!6JjQykLMc0YB7~R71)igtYL7glgB-ISJ3QTtowx2C%m3J=ZQ+D5+6S@8J zQ*9-joxSCPmm^hV8m-+pId)$1+O*z9o)vpr{8iDaMYpG?CtZr|Z2qG5&}Sl>0xet_ z_UMAWIoh0+IWKdT<$DXq!Mjc4H&e?Ldvudbrz{O(PAAlk3s`PjiW+9BmdL({w}TE( zQD>&LXs+o;-1qU{PJA8oBP+L(HO0Bs-!ME#IZIp3)HtJIT7@Epay`pzF7|h+K_xcE z?@r2$+NpdaZxLSWTj}a;TbMm6zh3sIAH@nwSr@o~!XD}-4N^AM$V~Mub)!qgdMqoW za*bCtJ5`yCLMRcQ=5OU1V%J;m<)mki&8htT-H-ZtPx9^+o^y9(J4JTub}A+&8Pc~T zbf{=9cE04>QfG^q(#IqQ;|FPYO$nh+__n9Ny^3Q?cCg@7-tmHyw#x1WzIlOPrLuHg zWtO&G)OBMIONW@|re6%L4ZT(Sn444wAvUnr*VsMKdNw~cf5!J}Im&ED_N3fzHpYJ6 zcRsjTSzl4be7%S&Mpy1-i6O<)$|e>|Em1AuWJ)*Ff9i&cbUr&!%=yuEG3UR6@A=2_ z^|lv|T;C^88R0FplTOusHC})=xD@@!v`wF6e5yVKwx9aqRCaoxz`fYkv!F)aoF7Mi zH2+>BXIFNXwWIxxrzS_M7fQ<$&m_)>e^hB~+LQ`)N*pWoPqF?99WpLxCK`4!hrS(3E!Y5yab@6dx{S0`S;Kh4aNg7`x}0Ud{;A=zHjY`y zY!#Zb8+|ujjCFnPUpf80&HMW5`={^Yaz9yzxtDmVC>+uy!=LE`%d0I#BI z!tn0ip57A@5+L;6dk0ZLP`V&pIwD|0suUFwP*HkEKsriSkR~D^ReEpfz1?1R_kU0R z=RP;Nx!FBs&di+IIWzNx)d+78xhN(fHX$M^JTmO8@pq-Geh#Z(aPiIT9qFyp-hXa; zVtDn%Q&+~etSZI(%5E9F`m?AtNwwn=8Yfm>)nsRFe_dCdsHBZG+6Fg?oMwC=>b>Qz zDUhGP$~gDp;fwQ`r8x(Sj+Wij>PW$sUn6csOpIBR@IicR^v&q+!s=R<8k_6?Img?d z7HrD=?$w+Z*B-Wb^4jAA&(^=3m2<0Lm}iXASQ(tMFyf=yS8HX|deppst+*C5D}Pvf zK~n9o6;T1oHQ-I zaol&I=Ad76Y&?CNX!lVjABQJ&)1y_^n1`M8#MICasXJkEV@i_7EFOL$Q6uexM@n7*- z*Ju7iQN66bDt9Yisa~~_RJXVpwWAuXt9&uOa$>Quw`rnlplfvYfy|`L!;jm&lwMX& z|0r{P(FfFx`^enJdOYN5^hXJ2Vxki4@m;87R~GzKYN{UbTq)|Gt7NTx{{54jC%vAG zc{(+{X4V|X@KVKk&{`apQZ+d7c)f3H_HBH-PGs#<^}EIYSE*NcBWn-oD^H?*T;{y| z+~>7l#J!sOYI*wJ?6fj>Nr8ITaM-#r^igc}I4$;8VxQQc$bk_LtewcYnCCJUUC+Ch zKJIzh)5yoCp7eM&?N$9ex#X0ywzZvcd0fM!kV+G3Ew5#4w4}za25YNXE4EE83TbK! zs0)2limvB|gRZRYYqNZilwL5Z&b!h0{aoS65!$e6=e*GVeuxh<%o?tG3mAGPq^LPcaqa zzDoExwoB}(h!-LG=E+KPe>2y|#kKO2vIe9jzN+`4?#mXLW3yKlL{Rm$wQ*_i{Rl_= z<%++jeo^II%@)ukB*^>gd;_v*`1q$O+*mLgLLGyefI^ia+t( z^^7wfvG~HyM_oy{QSpt6<5M3eKS~~uG$C$ApvP|>&WtXvZUg08sDC1xgk^<3uq`nzArC6omFv(-A_}VKZ_oWP zdqm!@{Og6;WqVz2e-(MQd3sGLxCE8i%xa$g=wy`^7>sr!%I3W1xj zo6O6DWDv)ZVfchP&qIg^{h7>)Q@o~h zm4V9vd!QHfX>!#5+6{6zKO!z-IN5_?@<{LiR?2DQB%hTJ%ZucRV9V8@`p+Y>Tz@2z z_gx}Z1lnK$Q6>KnO}K<8?ds%Z+@O}%3T?9Xi8e-?q`j|!q6E^)3o==!5ZjTjwtW4xu9sFGhL~YoK z^bpY{Uy`RchSvz9*}o)kNvd zAxeA&tMw#Gtm}jq09o}(Falwt1C6RT9H3IiKzJ_ z#GEuErg=7)90CjFl60F~+y98k-%V`sKw>ULWZ4|%GKTtJ^=V-^Yx51<{(?x9V5mQV z?7h#)Fc&enouNwzaU`#p^D5#y=MdYu1UgP`M5{aF9Mh)rq)4=qGe&$HT> zsRwWt4KasV+sKn!jLt~V-N^d`-o>D0)B{QAC!&!=4*yOh+(M57&{F;7VR9GxmF0O* z)^Ne&?~Ws(eb&A34n^jGk(lN{go(F1d-o7aaNu^{hNzwn)R%?s2 zRoZ;*2>lL1lFpF3X1DeYs_zY$Yv@6SL|;$+8|6p!iuT;&B*XTiyTrfUm!h5tl=(aR zr%D&(tpNorQJ3tKsv3yAGmkL#015Ay`ISE2)E8PMn-aAH+W5eAa+n`_Ez5d0Zvt^AvkYtfdGawO#?acZH4tU6nAVc_d@fMeyb}-qSAH`!Hx?0B@+mP| zSE$@DThEkLEnOa?*E9IZ`8z;e!jnoXIPZ1lJ5Wl~h_RDD(T{4?(cwe&D*9@zE%8*f z$;e*@YLURbm_>cRS7Z}BApbH>ZbDwe3y@AfmzI!W^rF{IC}#eJ{rDl zkF4e+<5$q6Um-yY(RTC6kolJHOk@+^r&_qi!5J8YIecn zJGf&mtq5#h4_x*>5#zmiEl2-MByN2@Qd<)lx4_l=(FZ>vfkV(>GtnqNF~ajcBAlFq2-a>o)SO9c>&o|^<4F7+ zxIiGZ)Gm)it;q_6Ag^Li%%$a%{Qnr&UgQ4LXzPp2T*Ow#VHworEpjbl;F<{b#}M`{ zk>MsHMo+^lzY-(99eQlxn|(wrW}wwdiGi(8bfCyis}E&5m*)bsKnn_Vb`hUlf%s0H zy()t})rDpec+zJW#Y6b*E^`qv^mofYWwC>Z>?a@BiFj2L`;kgyWfeG9MAcScR3ax) zL|O{u5g+}#;3AQkmP2b-8K;QyE~6KbFDd3M;_PFXm&l|Lk*s;>;sPuyv2$8k(MaZ+ z#Hv)Kmr!DhE5fVs#56YKa}b<-6~B0@6N=|dWZh%LM@%yW^(;* zG|d`hasv`_oL%l8*40Zcg2?C@iXAe7*KBr*&)BOCd1N_(mdW&i+iHt6Z z9lZfIj*#D0^w5F-R3z8a2L*1TnU0YIu^jtlJ=uJR(FX>3xLl0wvIr|;h}>Bojtr6) zPBl&slBBV(Jk_T0={);VA~uhUS+8e?xkRSUMv|%^ku#}Ea|?|lkdXw=*i`8Df|b*u zi4M(AFuQB4NEvgijDFceoy!GeyI(?wrn9SUKrXlP-DF047wJF7Uf6=lCs)Cod(1xi znCd46EVTj1_(?b=00!0uEW2COhS|YBet`NQThK$D(O!e0R|TTTFCYOsSdkO()qS`& z6e@`fsnl|tLe%^mfaNs>zUhOER$&FtA%nZIf3~1Cwv^LgCbr%dG{7TforJC#iQVu4 zb3TlHvKp)7D@HK~xlDl*Ww`D-ZR|!5>_e-rM7!>Q_llA2qqGo$%m{rN4Q~l-Gy_@8 zaom^9dY^_{_A}1gj5L#Y`zbkmd?pBckEm z@Y_M=eS`iIs4kGqxbCoby$R1hAus+lv91 z)A(JBnksqvAox56-j0BKYNCN-=`o*Z>^JFS8yx9kf1=U?I1)zSY>S}?$$CCq*V zvb`9Y*}xi(CZ>HN5_FH2MYhZD^k{-&>(Jo4xU&H>+{^v7=}|}WMV__Dargi_g@_sn z{PhGWdCX2Pa+LP6ONsoS8m!bQcAF~f)ty-B0%j(%J)4%V-D$lJt5eGJ=UVK%k=UkD zR6Z)=DQqJZrP5m5TaKcmZ=e%3QyP_D*8`pTS9Ov3x5+ zgX2*11Gu~ZT%@AGCK(W_67f6Pb4x$S;VM)}T8-qB4bwH8F)&jL7?RM*Tas zwU=3x@Tm%wccS3Q@ytHFe9cm@g0MNLQd^(V&4=C=bjDyRIrOHtMmzzwM}q|+9rdA; zi*H}iN-5upT%Ou!QGrU9fGoU)<`-Q31OAC)XxfXch{#jfN8b;Tgd03`T0qTz*$vvj z-<4UR>(KBWs+x#AjTP`v3)aBIoTre{QUG7Z!^^^!=tj+tFW|jSXxe^oMOW6pDxddI zBPM{{j%P(QJ&a8AgRI*ecEm1ds06a*n?c7G zF7l*XopCN>J@WJcwB4D?86%OZ5m*sH&?5jc&JpDJ7E)4%epiuTH@oH)B>gpd>IbFT zp`(`4R$nw*2ktnA4t9~v@jaCM44IjPoK9h_{-KSzaJiKVL;bNYJ5!UR3%r(swe}s= zd_?ssk*%g62g{M9nzRPW4BF!{7Izo)NPDCQPbA#DnYJ1uHRF(*^;FWS2w(q#?rF=a zHo|IeMLz*3pQAU0^UtxyBF7_`)enV|o2e>u9XsoLMyk+WnLdFUAakkZAu#O{=yw)U ze4Mpifu^X8oXx;y-Nlo`DD3Sy=#w?ry)jhRc!PC#kNxW>t~`irPRGMh#=QrqP_z)u zRh1D0$Zq+ZdeUKN-&L$s4c1@;oY9tQDThHsJxg`A?|4dolR77TvE@BlJz5*j(`F~W zU4Vxz9*+5qT$71B|BEWsn`Q>ymSgO%L-?zz z{x&`Cfa`_cT?OYY;Xel$aR&S5Om^QJ(Az{MD`8uuA=`7QI=Y^3m+(yA2}&FRQ8gA1 z&WG@EXZ$~3(%U+G5-XW|2c9{efxy{|d!B-$W!JhvonPQUMShbift!`FhKGi?jm?as zjnj;?jlsqm)Fn(b%vCnYU$CNmwXW)P|445w_rI<#&U<#re!MKNY=J$&@xt-B>uc{h z-%zz!E0a1XeJtlAjKN{y7UDw%rDG~K>INmelv`ghpTt}L)90adal!D$tCuJK6(FS-N~+z-6{8G z!AGU1ohj;$Aa}&NsGEr`D;rbatMoy|Z{w=PyCZG3W){CGL&=jas7rm-!1BE8G`l-` zHo6D9j=TPG=J~#%URZ*(%3K<9G4!+Gw!sM&ujMy+lYb&LEBDy{wEtSXuIOe#Sx$q@ z)SOG%TXN%zUf3n?Kxt{%{m3EF6)P@E$w=v+^lycFF{$zHa4G0!aH_4Rsm#z=`YA9# zi}wz;cO`N+*zu`7$@Pu%??7c=KV_wLr)gg3ps=H%r6Hp%Ck@?5V;5>BB0vl)S`GDkw3V;ywy?+Mb47 zwp=z$RvPP9{aWCay|<&Cd!XG|HrP?@bh+*RExtRZkf1J>1EDEVb3;B4zG{jzG*q_u zo4K!o4z$6!(veZRxA=0w+RVQ*v$OhV?#sGbc%p2nS25(q91Opol$)};iZyw1QvX;z zdS1+Nn=Pbr=m+3wELLjijRG^&p{0sD%rU&IQ|V_8+2Qu4_}>r2nJ!U}G=qqiwV|H| zKQm2M4#-skjl5@l>%0p*m0a&T{w@8sC?w}zMndMJ^!L-HoM(mMu3Ek(w#y0Kq7J3} zTlrj-g-LxYjE%C!?2bBa`6je1q_3r~`E}~B^;ggNRu%UnO1?$Oi(-d;g5y(vsQ(+S zmBkj6XPp53E-`;!7v&-4iQN3(r!Sbvb87720Cx?y=o|oRd;BQ9<-%Dvo1#i4N{(iNeQtXxE;(m&)6W%vY z4oa{!i)d!MXP##KPmfn81|F2nE$QYOTiC1Qa>)bd*Pi;?vA|2yU%_Ff*`d2avO|J` zN{qi5N|aiGQ&jg3_F261-3y#|oynySa!=>{mhn#d=!}fCpK_bo2XpW1QR6EPi9TMf ze#+=72?=>IUxZbR`7m^gX=wO~pfvLu^C`)u-%xkB>lA0ZR~FYUSy7VXnBzX6ehiM* zuhN&r;QI`|fSM{glC$5Ui4?hytEOv*n#O90`Y#Cy?XgaSy(q3xeB@WJmt`vSy z;wme2g!w#b1OIgEgrH4Iwcz;?Ypffse;V7M1%LC&o~_y#|5u(V-ly*M?rUYHg1nrI zIVUpur+3J#nrF3d_O|jjjGa^AK#Z$Ol}aU*YQ`Ul2?-e$`+mqG)1>gUprh6i=AO!U z?OWO8jwrqFZc{qF>=*7Kn?#PJt<_gv77By=q7VcXt8Or(%GQN%e^nP)xNd< zJO1xIwO#*sIv2MozMb7Sr(?F7@hD?a(T~m#e5a(V6}CrDPqwBkt@M5J{kVIP`$I28 zZ?zWLQbV>|XW8}}CrAyn1Cqt@hog_<_tGt;#UM)L#rB)&YvLW-DMrsqdyaEb*)aQerE^PLxk>`heGjy^ zY||`%1}_P@8PqFOwceF22K@E@Q~oX9F1}@cH##}PX(^jgbRchMc6jdU?6}NJg`YUu z_%7?4;))}Gt(cW!NI96Cm2f<2RM_#TR@Te5b2iPm*K!nmrLR=7fSvESdpft5t#h;} zlkNT8^#V7%J&c`<8_mCl{u2C4@T=g~)_KMehT_0=f3Sb7`zuc?&nD+a=Lco46;CgW z&Rvu}IVUXZa_$eM-CfhXjl%y7KO4IwxkbwSl%k5K;*Lb#h+PqK#ugFW#LL)!c>s)`Ca%uDgPvO2UxvXHH+e7UzU{lPRzdORy{6?<5uT$q@GSKt zcpp2Clg}}vII5&LZ%9u2yw9o9Jv1!do_MCBntV60L&B5To3WXp zABQfpWg0__{q@<@+@9ZxmE1WMOnpThz3UWG=n^`qoa7~C{eviJwP*SlJkrIt-9*;TTyw4eQi{jM|AJKcYhYMhl! znbvVZUj?@h=^s2S=!x~3X}00Gyjhza=<0poTH-hcn6rv=>(|^SxnJcR$h`rc+|05n z?lt7N9=AOY|AUy{yGbik?xj4a^lhb|lPgvj65Ar;f~|wGkG9Ku$WgiULSfzfjk$|+ z$K>_NUs&|8G|H9X-KgC*6j^hEcZ7czxjOPuMCWi%@OIm1FxpONnZ7oz8>O=fw&$d0 zWTv%$HThLm+MdkzxjBV*%NF>5RUX>WW`E>@u;IZw zEk5NfE!BI}KC@_b?x&f})1JSKe|hBP(6oV>FLMqQR=5A=-)(pvln~=iTw5u%+SQsn zYZlhLRbyM~-^ptdhDYwTy;M^DKRW&^x{@25rKT(CSJO{t=4V$g_^f1*)9(9E3bPCj znG(@3W_9eO*e_$kqYA^)g58!Th5=d~?@#tNMbmO`WFAYa`fC5nRZh3 z9^zkY=nyns3#(k?KvJn@}ezE~t^=fxp=CUh#muJ6Ve}4yFfX zyqPs5r%l1sl7Qp6?@y_k`C@RBh>WNMF(+cyM;Ar53-2DX*ZK~8*xUE7<7DxK{FB)& zGQUm_O&^%vF(WRkG-pr2$ECTh``S+P_|TrQlata@rl-DLy+`$oYUx!ADm_Zv9(y~i zuVtNd&U?zfuITf;nc2@WYi5RKRnA$R*Q;n|Sq1lnK%%mO*~Ud221W7f=y_3-BA$o- z86;bNQ(h2-yu*H@=y6t^hfC*WqhA`45wle_xE8<}MmWtIY_pZ9F zTJvhxtD36(Qt?uJqo}yxX2#2EKX-a*bm5-d`Psd*`ehk&qVs|aAC=s5H1h4zJD614 z(6EZcFPw_18g)KmTG-*>Rn`kehaT;J)3vm8Tw(J(YtEr8e`d!lOZHbepXNO+EG#|m zx*M2ltQLGcvPr_2ihU~mRApA`@hYn-pHJRU;ZBSczRDV*qy~Dq#+8mK+@1GVPG0uR zoQS-p1<#7smfdmL{mF8&`JbSXVZDjmo)tMeVtd%Ekh`{{=Kac8EyLT~d99>c;oiKH zIrFkxWdD)9Dkn4d?SkFKzuQ0Ze5npHz7~8kVqRR=q~D#eS+ynM!P@LoS4cM?^+k32PQQH~5P6 z2UBxpxEA8u=zLjvzQ|S(nfF$%A-7I$P~N2cw+f?6HrwyGKMstMms;jiyeKCATH@7; zi;|;KK1{BX)FmM(c3(vE;0va`QXhYw^KPlNcw)ivy!XNQ-C6K$(ZSLo&aK{5;*}d) z_6OYv=@3>JW(`{x(k<9(yJbo=+}6MLPj+Y9`;}}h%+HU=Uy@glcRRmw;gzDdOKUiG zxF7ki>8B0fT3?3Fj(iw%J)t1+NunXCdeVl37O~Bv4~IK#-)GQWKEy;JoD#kn%v#g*jgp{ov^%!-=o&W{2Kd1Y+USy7=P5Fh?QYE zm_lQX@5uAjZr)BVpS?k8pW>)uUs0Q4skEEpvg?-DMg`qM!$xzl^`)&t(1oBgwoR6e zrX<5?T?tI_dR+OAPaSVL((P79f5#wpli@C-C&_13Pl4Cj0|b+k<`tH|EqRvV*7t3V zf=Yv)vyVoG>RV`xBJA2R0-wmMqOR~XdQ{s( z?fDbhDD9ATSgXWSYdC&XP5N4{uIy4;8kQLf4bKcQ#+Qbzh7`kNWq|T8*@NHml>Uak zS8J=CQ5UIo)jsN*^tx0HBiqS>H#v#ju^AP`56PMGOL-kAYEiNm&%sO1;PSLTv}#%w zh)L7b?rH;d0XP8}>KmN>rs6wmPHp*m@*3GA_oRCMH%fD*k#ZIcwtW2it?*q8*I!Zd zp(Qmz|5P`rkJU7FpmtW9f#+hK)DfJccx91tg%jM{N{+Ho=|qG~IG7S8JmX)Y!v9P4 zL$x7j3$FzBL7;=WM%C0a+E6@2o22^kb~#1q4F=vUWunqSiBxt|XY@Y4dQo-U1k&nj zV3Gf!u2+|++lZ)X$a!)-yadC*uo@>{liMommEV;=l!M9&>iuVcR2>AJjAU-+6U$@N z4yset_tdWH8&K?DwX*iF)&+0HKG%ath@~Lzf3tnDFLDIJbW?=YMsIZ7Qk0FT2I1Pau^JW zT_7(!(9-dl%*G$uoyej%c?QUI@k(krra~iky^~K{DLtMo@u;<HY*eG=q`(Vp zy8g-^!Q8)43-Mr0$LsjJzDTPeua&$YOdrQbCQB{xfyHaBsU+`KA`O$(;l?24zHg7E zvA#v!Y_6nL(iF2QZI+Ww`=x+3%kVlCVQ%sa8mo;rRgiaTsY*lX!$281iuVFB@;~ZC ztv%)R+DHpDS-Qk$pSB%O<4n%_Ch2Fi_oc1cTln$Xa3U8Xjnf)|asP#9r!>*xcg!+2 zH1+eoVVGdp;9qSRZG2|Bp;j>dV7R51D9g>04IinWm_9K|{wQ-z=?{OJ;TyfNdO=>M z|EBJeKhri-QT?*|gI1)s;uPcsSZ`PGU|v;k2oJv+i5KpbJKkt9Eb|{QTvLVzS{oM2 zZ-7wTOW&pbp@5K}%{82sqVxvJdVQsqMpf%zeDKfp8d^V26@t+aB_JZyr;_+w`7S3! z3#Enf3+)_L&C{gA>Pb$Y+G+9fRJ`Q#p^b5zEG)zf3K&36I0HrdTDz= z26$WVM$At(l}D149rEYoz~4WBb{6V&l#kIi3zX*4LA9|wg=n6) z^e0rvrk0`>X8TZ&l~$Z<03^uf{6W!ctGl?@>dbEux$1Wp>)=%=W`enzn~kE-~iAF0vOaro=GUSdd;Z)=O;`i0sCJkcu+ z@4&++4b)yB^6jLm_Z#3od?YWH{#5&DX>cqx zg*f5*MN5$fNvYZ){TQdqW2H&T1EO)hLvLJCYeI**%5eEFxgVbO&-kw%_*&|tAJ(3O zJ&_0MRk7ZfI`l>QLI2yt>^us{?CSr5JXn=l)no9qYs4&727UGyYLI+^FItu7>dV!t zx}?<)^wRcAQ$b<4&sl;bzptJPd>~ozI9E`fDT}3>GCYJ2yO;in@`rp{Azqbw)&rFW zoZw_i^EHo>WQ^9S8*b>q3_q4X)&9^w2Ssq3p{mqbYh`#-pXgsGHGm5q;%Bd=9}WEK z+ZEUz_|)~YFC#G0)xt9>u#bH22i|FcU-6;6tqoRY>ppe85+v`}L$x6Uay2x4XvqoP z8WkM&d*truKO+nwRl+I;->@z+-!oM(T~v(dm(SDxQq5viyUZuRc>P{?XoI?{)8Z_X}r<^DF0J`+j?v^O@tRy@kWzOn3M6^zi=% zKGEUu_=@L3$3_jQwj`l-#JI>cVaF^d&AUMzc->r2udk+SN;TVZU0jB7T%)jz7p?2_ZY`H%FZn) zd#`L-=?7(=viF@{kK()MKdlUk?No8Gxm9xSD$eM%knQ2Uf-V})8kYGUC<)fi0hct< zR?`%z&R5!M@A`lAK5-s#9QW8=KRZ_Vzt_8Hl4+UzruAJ@wz*6`Z3U+IiFd#Lo!Zp%DqvBodG~qhy3f0> zxD1X&$6uZT=Pbu@Z&P<4cNbrWKvi>#q|sp`%yX+BPcVdR2%ZyKRar@X_M6T}mNyi? zySnM0Ae(Yr`^8d4+owMbtZ?-soBlo5Fo#pWsLKB1a-Q=io4Kx)iu=9)!o|jm%A!RcwIafeRsSE zP05KN!O_+V)%V382+a@sE^NFZ-DuSsJBzJ3y34iD^p)*LA|-2B8*25HJ8HVKqc6kX z*PdI}OgrkW>-&-V`rjLxneHngN-;HwW^%q6WO%5KA&&ekC#Sh+o_Tt(HkNaOfBg@< z6+Mf*UETk<209;8VQj8vgfGJFRHu8IdFuHF;nm8JosoaUBpdox-kZ20dQn)7upezl zjiXCHZjp{LU!tui(?-U;NIhj6lZLR#y&@4M^&#bdVL@c$Jk^Sr4)k;WU=7@ioK zDKiYMOpOEW!Cv`V-50oS_`xtx%`tx@f6YmHSG|X?lkV_d_TC8W^}p{P6?n(H*!`2| z4Nr*og=ecT($~uOk^ea-Sx3wM(&vOf3OS>%O1hbn9(pRGab*ACKBlv>;%%o~G;FiK zkfvJRl80$cES-%M~cVW2isR*ULFywSz3uUS43>rxY6d%WufjI8n3_ z`+h>(KxAeoeS&3#vRWQ3w*-@6kT%&r!~e`b!?)ElHL%;;$9>nE;G67T=zG^+&sA0L z?zMRi`8K;wx=*?eBrY}o?z>WbaNIjlM?>ya=!nO_7H72H~Vv+NV;p}9ifH&3gO zA!@qZU5ZnuV|CZ^%y;ycN4lRl{>CaCt;T9U8w;hOww}@zdA{|Iyj%Ok6epcj+k#?o zT%9ZZ?hgemq=zrytD)cW{^(iapYOTsy6pYgb<(rkd%^Q9o`CA!ZSG2Xru&X*j4?gt z>yQ;TL$zN+X2kp()Gq3Ru~gn{D)W429_U@|Hyeg<2AdhkwfcQ&@~>JSEm`gFEA~zG zObM)YHS_(do%a`OH}pZ)%i0dpbJI2BLF1>!-=u?vNO@A=BhF8~zO(8k{g1%Qz+SbI z-{_C?j&*MSeI2=4L*osPp7>VCmxh6Zh6hEAjihRI@D_4DKMH#3NYXATem}Jw zq~DZ5j-hfF?Kk|(#h|_Q4xCrVd8#Vwi0SDiS2MS_?2_KIi~y2< zypO#uX_sbp?KE7}hiJz@SlS?eqyDDbx3dm}aOZS2XCB2F7F3So2216|kAB z$lv&n`@Z(C_IL1Z^H%V0@D6o~eZ4=nTNxb}Fz@U3uPMbn)2{OmpG zZR*MO9`cTN`8-v9Yu%-uAAEClr#~)eu5puXT+He)PgF$o+p!5D56N$OY^Z5z#OeM@ zf1Gc<`%m|LPbbHhzIxspzW@9#?UKG#T>~oCC8?&S%Qk(7e47}Jb%y19Dw3%jop zPIb!LfxiPIy*b_h2$Zeep`IVX5nkw??V0H5=xyPd>!}OUMa3V*zddQsS!Bioun1(v&aUH4LTY-H6%DHEUsKG>)vyH@C;@kL54OSm%*}e$Q#?N_%xSG0myZSo6cb;+nh4Cb$v^He>iVCTb5m>s*9&=kzNsqdzuduadusv3KFpzIO6-*bHF{v-P+j!tEs2Ga@p{* zr)BLO0edHBZ&#VSk1JT~ zuk;kS-*B~b4so0*eXZ;(`^J(JrF)#oj^*|ao(S&(-*w-1Q;(pA%HXJGaX&}j4~wg~ zI(ALasHmx72d&$capwQD&wW)qZ5`tsb&6Y*XvIgJHOf+5tA*UOqaesH|ye9beSon?mJ zF65l)khNol;S~&#Uni`sd@|A=Q9th2@J*H|t7e+01^n;2D>!P{r<8nK=qX+6j4E5{ z-UcSuS@!hE;4tg1pszzm1dp@1thFuYjh`wX>UXtPYEADX_bvBA&SR_EE89OVeXq>x zd_irpY)|LFX#d-R<%VIwMHW-Y+Qe!JJz{=K{2}Gt7)R95xcU)Of`79up%zIS?S<#4 zGuid5)KXl-UfH$L{)0OQU(0YQ)pU)jV(;0e*uJtYur;>)Y1(MMZEupxHgi35<%2$+?V04??x#$Y_B&6(Ta;qsernK#hFlN58{Rc)VbuAkplBspihM8p zm(T^l)2+iyB}#Qr*#7cg_f_zDy+3$c`>OgI2V8h-B0-M3EA5walzN6%hQ)?6N;g9l zWf4e5J$a7a8F2ZF)JB1kfw{hBoYY?MTQsM-nVgg1;3a9wQ)7v-2Q|U|v$V5auw4oI z*7j9McF;S)XKmp@W?LgP&3@xJ!$G zwIN7bpX$4anT(R#knu8IuBI;`p16*FSDG03TzM-nL~lk$;xass)yYxZrd`lysQ>7z zKDvRNyZhT}1xDjCQ$pRWBC_(U2Tm?uqE z)8JySwn;v&y(M4AE2n|x_#=_L4Yl#|6YZ*AN1Mp=_hoIT`by2z`>G?@-CpX81H<+I z)W6jyQjuCH8MLGLAKT*>--_>LpS+(cNMrR*U>}C+x3paSB3}4LTC$$3zS4IDR_jaD z1$aW|P$Rhuh+R9#2e8PWQD^y(7RuOvB%W^()Gh@JuY&5+I%plWH?>ph9lWk-T6gUu zEgk+(kS^l67)_MpB2Y4o@;`DD{XcvxGeCADYel~%h3Y54`d+Ee(|T$T)v4rm9@X~Y z(lDFe6ouRiDsDDxqRwNfR?8l(}W`eq`lGC}D zsKUA03L?wbgLXDo-lM%M@5YZgh<#|g91d>haH7%kh*qu%*5+aGz}T_1+WHsTIWl#@ z(M7i6;VP9l#|iQ&-9j$yS?NugNLSD(4-uO>QTq`8k5ApHdsMToXe0Df>Pl!mTHgRA z^R)#c+EDrc9LW*-FVaBh_cl?GZHWxGky-Xq`&)Wft1pe$h@@2S=|8K(^o`njyv#r2 zr!SRSsW0T+>JH^T$c7?9(?j&<1Tv;BX?wv*RHUkSdDm*CMBVkov+biCdv|=>qqPz| zWG{&o{}d1RHsU|8lHUkM16Y%fWiWik+0MYDTh(JLrFKit$V{gC+U4KAqlY zkSBH!YP=xc@fMMjGxceB@&6zi|2)z4(L{cKqP5UJ)Lz3M(^MKu|2MTLkYEGaI{f@K zKjVFY63kKR0HiV`Cgz*-y2Ah2dTrPx~dI1{D%{U5AfHO z;CK5%ex+RIB`0aGPq2`g_ zR#(Vt$S`k7WNbFEyzk5N@#I&<*FIc70(N9SX7~_H%4kjjw&}BomffQ*;q+q?vDmYb zpa${~xwf<)-7tcaxijE_J|v^=UvkEetN%cYC-SVo&yp5Mre=pze_dTAcT~a2WxYQ` zf@@Rj_#gQkIHt++P;IMnkmziM49|{4)mGy)VXZbmdH^168@07Gort8rL4W30wa3zS*`wZ&_p2A>4LtuoWdwet@1;6YuBWb%=AuupVHJOYo{T4Md%d<= z`UV8aU-3H6Lq>Fc1M=Ee${||)Av?-A@V)JSr?)KB(nAA^wC3s2@$Fg5ED z|NIg4;}3)S{X(j&UsoywMj0xDR=AWb&~)~MUz8!*A|jG!g0Xi_3g;xFj($mwRQo7x zv;*>wY6~>!F)}7jYR!q#waAt5tR!oNWa1pqG|rZekqx3JUK2_1&+6ho658%tMrv@n*+7>BUpCi9VoVdV+ zE(R5L6TbU6ZIqI)ost~^3B=(P`AzUsbJ4>``2S(KgGT)-sk-tOF~IL4`3Cv2^b6ll z*Q+RtHFCG)c)gW!B5=}hTpfcZ|B6$T=E|R1XJ|H5v8$&HtJI&VIdDPyf^&s9BKy1H zu}xFk7|!@d%YERpt@3Pji(!v{nsJ@#lZWW_OO~H8yJ)4Q+RN~-dP&}>9#vjw_u-c# zpyO`mlu@7so<^FQ%I%0CZ$@3}k7b8;oh;S$Ae2@`w|h8Geu`gz8Cf@Lz#nZ0M^0o_ zKr+>C$;;sR!TK_^+j=mQS4nF)%LDC6sRnQNM6(^0p3BS0FbRjldPoV1l`Q1Fob$X+ zhVoQ6Z6Y}XEkz!P+(%0xHvU7o8{^u`xq>WBkXta$*T`Ua1FXv5!4;iB4TUmtxavu7 zV3BM`5BHWkadx-~PJT>w_E>5%M3Wl!5<jCQxI}qePbNJYw(#dXt$kO)fuwy?}l+F;<-j|0nFvWpKeY_FXqQ0ZC}r zTuwVLlT}lN5eV$5Ta1yt4_XMEsmpw9<$Ds`XQ6&5s`K;CHx&$GMVJElbuL$msLL%~^rNHtOc%65Uhs((2Rn}ObvWUE! zI993wBaCA`1qzeM>#Idu0;?wnJ@FK7E96Rn@vgH{H^@rbLze3yTKXCO5cpVIc>T#9 z{14m`4P`1ZB7yW(k&)D)%{Z(Sf#50dQi9-yFeFc45p_ihx{+(sAL{-;+g0EsX;4X^ zNL^*b+c_cK!R2H5FcNK_8vzdjvevkzQ-@KMx#XfZhT>^JhkW1MA}?JSR|<1a_dPuu=f`#L-rB zR#vQ!=;s-0a0sVpN-HznK@Lawc3n9py1ibO%h0Q0*5dPt!6?l z9ndz8nO5YRRJd74bOJpKltGGf@lN92XzmL_w*2t48!i(RRI#@W=m3HLqeBsqrB0by z?hxpM|6dI;vO-=@$bY>7F9{S?fp+winLnW=fib6}SxcdVpE>HxBZBc)qSZLQ@$t9H zbpq>4Vh#hd~vAQ)PtG0;5sPMR0&Xj+6OI<;f+Q)zlcDsJSAck#V^~FE2ck z3)cy3Kw&`(4B}_yI!vsJs7@fH%+J^bO0Pg|6B%`)f_L9-(GJYPNpqN0OD`HGyC(dQW zWn3YsYC#SZR$HLI>2PKu{n!|Tg6$xx9)z+s0(np%AVxBxNWKy1lLD7HkDr2vA497g zW}nF#2xL96n&OHAMkO*Q1!kD2%@9l5B5z$_s|j>0ohvfA!$j*2TDnxuHv-!)oxcRy zmji866maoOywuau#*gFMUYjt|CKm!*e6=QkAOVqqLjJCYQ znu`iV|3@6nV|+w|z&ip@%ulwg&{yK8$SaM2%PKSTIOv#4UuNduq`fR;S@2mJcM4hc z(b`>lc*LlMrhfuWp1@B6$xa|;3;a}3JD>x*-dosM{n$l%bAB|MJxSoi_F^Y)51+)a zRx0Zts$S$H)z^vcI>OGh6We${d*21DpYv$2E70J2xqf-f=nLV31h}&e?RTLqQHiM! zR%1^rjF#x}y3C;>`$`CFngk~Z^vf)0Do{D^LyxD7{0zTu^G!M{CJ?9d`7LUU$Z)3- zDulqZ6`4UBxVR&;XvIrt@%HQ))uBxayh6GkS4r@R-~fU3{fc%As_#gYz*>Y`} z1Kk8VsK}Zwh2{qO5E!iOd8g89Ge#K&)de4?Kzkh-5vbx~zjkv^89XSk0EM+7@ZH3E zl<*eFX<~N}(v!ngepX4?B-PmeD>J@Ya7ZIQRY3xq(6&H>H<8(#SI%p9poqYtEapyu z7@I>&Hr6AavBYz?sIHL8Pl19e>bfNIJDRsZe73Ud3v5JzruTnbO;IU9)O{&q^#$g1 zCYswt>tat7D2YzK17-+H2~8usl`1oG(X+sw6aOz^{C@5e8Q!tXLg05hxI>_(i)R+W zuL1?pfOZl4m%y$2e_a-V%_nNLL^C^;Im9s2nzWIMU6cxyg$?(A6ywTJIu$Ora*e1t zAwCN|BJ`?_aTd{M2E69g-zhQ z+1#~+pR@QpkGSL+_=E7-@GQ3jJ8c`!5n95Ld*)Z>{0e|J&KE;o-LYEh^5mLBq9Uy=wBgCEtk(FV$I5fl6JQ zyM(+~E!QUkUA!89i6nX z#SD7V*GOJ{xPK@u4x-)hyx!+M3%{a3C!fgw2hhV{`Wnu4qv&rW;~2;tefaq$4625fxn;LXQS~ev9_ImA?d@_AvSo z2K5gr7c*!}yTYQXLn}>bRmf3O{@<4WiRadK=*D*#!60TN z#xC&82lL%qjB!Xg-CC88rWrqlE*2P)7C1y8J^PViQH3IzH4(a1)N<&|7<uXBVi~gMPZuUkm8a7(J7~+-krp;weEOh)2Qi;%Q$z0f>4~4Y~Gp z=Guulb%zqdimJz}0dtAv?yB^zVe?qnX9SwD!rg*?F1{0Xw283_Pe4WP5x$)I<@6LD z2=VkJthR1^?o9g~;GSmaK4B}m%56yv2^P=J0$o@}%U5E4DU2|jev{Gk-f}JP!-rOZ zZv~=iW&W3pL<^KqiT@X&55#9t{Yao#YdoilU7{}ZZ%3a(PE(j^Dl`yS=1uuu5-t17 zHOXUii?CP<(4W7v?~AGh`_W87R~_Q>Hf*31K_y|!%JlYs)aDev7tg1;SOZVkS46+!x#$$Oz~%Bj#Ph&adOw9; zKhDogH2Vd9Ut%P8*}q<3IsAvd6T4a-J>;@$!Ze zP)p$HK7;yB<|FKQv5yOTOyDLzq9rlILhe`bjwQlFwc)2)tZy;*WOLPR^!xqttDn%~ zRp=_TzVL&H=iV^rE1t%M?;-)75?n8y{{^|78I?;1A)N_G%tz&;%w_cA3BEEME^Hrx zrJKWiZ!@YINY+gB!Bk{z06Rr{q{Tob5HGYoL|uy&_%nXx{h+=*52GWPYX zWEk~<)=^7kJiVTw9Z|dU7&Pg?s%B#KJ%R$Y&{yrtWk@`a)q+3$j6>MsMmW|7@1-LJ z0@L~$RL_HMDdoB$nT(=??AzCAaWyk}$#_;^E39RuA2FZBaBGe7-B9R~CPNLW355D00ym*y7W5HF(M{N2BxygReg;onMUq|AZ|TUX@&{zlIIB~uIZFFcFyVr~7O$Ah8LNJjpM9$u1{5=D#G#Az8-Zob4;T8(Wq2%G3U z)LO+U`;Uwu6N^Q(_Zs(^nRyR<)_vg8#^}6vXs;PB3mV+RE1NrCls|jPw0Hzw%|&xQ z!;boz=c9Pe2Y;ZyI(TYMFmmD7JqzuBXDt)pa1-sdL$e7FM+DkE5pC80ZT%B|?I65S zuc7~kvFgH7mDppNNUIs)39diQ$Ui4e{Uj^60p2ihEcE+(t#a_5M4PN^L3ZLio19s$YzFAK$(pYG%{EwxpfNwH++ONdhR8n`L zw0J2L=a4&`ayW;(yW1g$!vTlg;T(Qgad&qsP@$!6X`3`{lEz>8p6&npvU8B1RCr52L9dWoTLLs(6n3ctI5h{SKpfUBkk}9OLMAxoDdapIbNB$?!FTM- zVQ5MUNJIqtW)Ar5JD#S+-lxKnT?^X1!hGIBmSP;DU7QERTG_dH7pCcxfAq+Kd2%BKLuk~UO{To z@NBX6+qPQ)CniAK!s3OMc+KKTKwT#XwViK%tp3y9}uL2}4Wv;|My2Cw+wY3D!% zBR*dYx}U+m5iHi*n8DAOHR%jb>_ZhaZ9j}3f^~F*EJfpgNLTrCj8la9siB3=fCFb> zClaCQJ7Z5!ErzG6ah4E!oJ6o5W27QzS>h-4z&Tm<}Pj4{0DEO}C zgU-Rw4z0l(Lont7tTO?eLQwJ2@FmAeUV_(D7@NeO?}L8c*pJK5)FGIs2lmPh&qYQH zp6!jlbcXgJNVUX!@f`dRi#2t`X-00fU0@*vVYC@QFkA`!*Avp`z&NFN@^Z|G_`xrM zZvvpV%veDRxQTedo8svukbMJe7~<{u4*qG|~q6i-lM_lSml1r6{8d&GecE10@oIfz&f#Xjd^^<++aF+X1H177)pU1*Ip&q2-Z z3sBYxtt3T6H3_sIgcCd;G!UVoWZ2)4$eo*tb%jB4c~D0HvSlC8{268yf_2tKq<$q% z#z#02yum{$SZ_yg{ti5q+&qve1x*zRc_4AEI^fA~pcDiCV!)NR@I+tGdm$?9lcDoJ zLBd8rwn&V#0#?c{%*-2B=QHrbc-(6z;tY$zC?oLHd64x9uy^7heG2HIo6rp+xPrmS zl?Bb2gzT`5K(GBB@9c(p;=R z80)JKiu8cpPPzfCfZUYeJps6z6SP4FyqJTz{|bv~D9-hC*nGc${*lPd`4e*V8Ryd* zZlrU|?B8=ig#8G7gl0!?g(l{Xu^wFtW{ z0UqIdj6M;ZM$Uw8uq_h6C*M%rzXm+_1iM%OPP+`W!7svgPe z`t&JipevB#ugHI6VTl%kA9`ZXk#&QrzEG^KJGg8dGG~w0S`Epdx+kdi2lR_4s2&5_ z4S>$f#^<8JFF#|)eQWi;JM_;IjJ^k&k@(^-LhB%_8M=?)JDvcxG=jNQ3?%p2Dxz;um@q#YYxc$0qh_J9u0$pJi-nQhn&5_4(>uHwC*+UEryRh+zkqW-5@+F6?C{Uv z_Q}WuI{=(jl67=@%+3ut7j-}lAIRGYNNz*upI4v~=@1i$Szf^RQJ{qZxvtl7{w>1n9oUs%NXb%g zauevcKHwgbKlB;2d~_6l3Cc>H;{}7@Z4tHM5Wm69>@Ya3Vh$@ znDc&QafQ_0sD@xhtFT*{&~*fDcQ|%~WDKN%=5t{=kvQ&MP%;7X`3>{_1(pp5Z9^im zF6hNf>}o3RnE8-|Ues#QCF}z|J&{3r8hd>T^1c)NuYyeHK$oT9Ub7nZ#xv{?$@dC@ zrTh{n+-EgK}z}=19R7o_{2lJI-uRenIuOKUxSZ4{& zbAM>38t~-5;H*gOEDd>Hj(tsoO&oyd5Nn2Do6o{C9zq&Xi4P4)JgVe$%LO+O-@(3G z{#^hXw88ym4D7jZoUW&!dnUlr>y6bn#(S24|I)$LFJUQW;0f=bxhB-!-)o=;>p*In zVP%a#F@n$A9MW9`nVSs_oB>J@KaL*K+8JZem`gJDb~jeh4%&1pPJ$|&P*VJT8=hE$ zH3#5qjK-?3K%#p>#teA>C-7w~-unr(CpumYozeq69(LfVh0uJ-kjWj`uLjUqy`kl= zW5rH9*MxbKJd{?@SWR&jHH7vG2G5d=n*aIc^mv{hxQt|gkmzm<_?bk=i$O6GK{SC@ zMCKnu4z6I`XK{`l#U5(G?LVy11;4xlKXRC72S_5x66k}oltfdAhcXI0*#rC6 z9A^RXvgX0E`T=?ozcKOIreO!kt;!5NU4ZX)JV}5Qrh*bLa2jbqe;f8pkDvQNr*?s? zb_Er?U{-_h?1q@}59}c68+8q~@blW+|400M19J2nt0!J39o9^Nj)B;FIXJsBcyBs1 zZyP+{8yYtox{grD3oj+Oie%Acfc8OHH;D?h2EB;io~zBeYXw|)c?21H4{kYyJI+1)MEVBg;ycOBBfg~XSfv5Fmca=@a(3k4Zqj>!M87=nOycK> z#otIT2@+i(akesO

    }nKk#>ae~2eP$2cTf`4mrgVr|3^O=7Vew0JAbwkPLca0$NlT0dq=!T|PH_6IK02QL~ z8_5}osJ*{>;jbjx5rG*JkG(gfGYG$v?h7Pusu|?9Ddm|nOX3$KGpZPSOgyB-x9y2l5}&;r)<~>jk_|wzi+%!^lGxiX z_?esu4DM&PY%Lo!)hrQ zUTfp%A<+UP&4|yED1Q~!{1q?q_YC}A4j!@M$rijrk5yW*Hlj_*o!^O{Nj?I}UaF60 z6E7;s9`eIa#H&H_e7vw;DMpn;>yr2l$!V#ooiT~Ae?9r8}{ca+cyB-bnpGb5QFIhfB!{A|SPNybbDb}m$Z{0R8a_DU$U|8UOPy{v}?GLpUGS<6PYgTXHX~)dLuP8-6+jd3%7lKZZWK zi+A3^DlXJY-b4KLCZz8LB=H?~Ck>|n;euSyGYx!IfG=z9o{`KmlG~#N{Ym`WfZZeh zPzL<21AQIPs2<>d;^}Mvy-T*<#H&bTjYtUb1_}5Iu9fuvWuFFOH%L5) zc;XUqvJ-DvBj_ZOLrEg2MD~f7HWtq!`Bb6cJ)+<1;}dNlJAw`2}~CU-8p8*uNuT>9xaaAYOy@DB1XiO7@AQ3Uh82kfnZuzcp?-Z>lg%6eEw%kbM~+=5oX zYFP}MU=cjG^I*9Q#wa6Uhs?qpR^T2p9_Q3({5}Ko>RtPP<8YF-#~7_JBFPFM`2caC zD2d0kz+ak!kDFm;z456jcm{d;AF$C5<8=b||6dq)Eh@9-*4|%9&Tax;gzw{OHINy) zP6i#R#@fO#2I=cF2tKf3m??>(je~u<4o_H&8{*%1^6#M8YW(#9Z2WXKTsoeaMp=aq zklXjDR5>jeU`Z{2xBk0ONBEoT#Sa%Q;rBeTtJp#);n$FI^6g;Vs^d8jI zEkj*bOKL3eD^|jWm<;RNhn`ATf_GfvPU;nK*D`_87K;iBIE9C1>MR^ox543$z;c_eb1zrh|)GfXaViJ-e{V)3}*r zqAQLGbbAE6BMs2w?_)pL;$M!6pr2v?60zpfpyPPZ$%H3K!A+#w&0a_UXFeTptm1Xnz;+7?=!GWY2B5>;M?D;R9>CM`4Z3F}X7m_OZI7OIztZ#Q+4LFu zHhqeoK|i7A(=&nEwi?wj`+-F`lD-0*yGiJLw-Y;APb((w^{vEfBi{=Vl=Ug{j`AEv@$Q|X1 zxvu<6K2F$zo_}qiyNLZ_ti2b6L(a&lPtLMnu!^PlB36SH~pkmNZe2Kc;e}GH*m#{*(gx42z5Y+%tavDyWz0kyY zIN>tzFUb`od6ClEbDZQ)hC-*2j5%V-5E<5Nb)C0f2Tssz>eQZ^poVq2EYbY zV&x>;m~>Dfc`qb$mH3ix;XJ&E72gLBzJrbU0%z?dtobr#_8F_ns67jfcqYl9Aa_9{ zUchj}NGY|p{sYJ+p)iTLlP+!~|JDH;h4k?u8A&9sn`Cm6?Csm2(S3|}8fW)9&~zWH zjGg%HFwXPq7^@VYBp!c1=oAudCw)@-;npz%+CB!9^9M(mpm|9Q@CQc9!|OAiOjdmb zPbYhG4$mg>=-N z=32XwSdk>Zi1eW%**_F^F#?n!ndl?~#|L{72CgKQH0iPxfuBfxptANEBoE*No)3IG z{Cf*4eNt<49mmcQ?j!jj4%mI*XxPIe+0#OD}^8yE-avE%)j;F45)g7}NIu$zonn+ESB5p5Eg zB6~;fZ!NG_;TW4_%`3rcdYN(i<#00-@Ds_bF9z?C zJ0`LA$-RNljI4!FB>-B1rBh?#oPQ*B7+y|t12Z?Txe4+x3Me0+?7~iocgiAVIIUoo`RL9gGFY+us*! zBYhIdcapM-XDP=r{IRT!Pzs);4)gmxxU{T6aYPAPI9B6qGz(6AEk zO$QI$ue}3Y!0sre4c%7AAF;1&%W4`}zi?`4j^rfk&;99GZQttjL7(JV%zNQ9H`C?A zbrcuSsZ1FCTI|Dj17_z5QN@HXH<);;B`WyO3Gws4}$hr zV5uwwU65r2l(aDVKD1^hv7gXhSSxH6x5KiS44UJ3XnH*mR6B~h`2l>Y@JSp-qwbiUEQtjssmcDgb&O++OD<6Qv*=)v{rhl9Rr3>79xg|;T9B(~nd*zA{e=z0D z33x%Sz_U%_qLYB3yNFluONA7%gt|cw1(Lvbt`(mmjDdgroH&EO=DNkL7pJkI(gQ3{ zE#sXoKj9I>Nf$_0GULU4K$|P1nlP{F-)R$d5By$$Tg-FF$$i8sreN*JAwVBD8R89B zsQEZ=M~Y4$11tqrZt(1RKR8)1qd2roR?I}8ly2r% z^UcNXbR8y!{*5vL2fGVy3p?P=Z3blJ0jP98i~jGeU_~|o8mu2UIS3ugR|A)HBP@&I z^dlfzX4G~jUoQ-zqM1AC3?1B@u>gK*KH-zX2np1uZgC zU_IUw^uU4Z&7t=+LopkX;gZJx%gy4C3e$l`@D@JO-mr{@Q4{HJ^mh6wHCUW3Tth{( zk?sQudI9UC2XElZ#BoeAQ%x-uX7as-zk!Hwklu>A;}g&>YpH!0KN>aHn_=%Xf+u-4 zFs_qnbbSP>DEReJcMF_fk$%NQv0a%i^e)tvPX{{rd?p_~=7$6OTSNOnT7ASSAf>bf zN|lWDXK&Lw@jf2`%vcuq-|P8EKAYRh9e2%lnC*KV+t8)tgljQS9`m`U+zbANxSl>O zS)nL)>!Z$5pHjC_e{g>fys-7^!|sW0ca(h;-m>-V2kH_(+d0k_Z#iqOHa4jKVz{S2 zQn9XVSXo}#`tmlq?v-?vSM`_bcBV-+-R+IJbUs=>E^JlorAAxokBSKN^;i9ng}HU| zO7b1xUE&_37(&CUfj;Uf`f?v^Dcc(-m)=p3Kp>Ng&Gza~NLgVlZqJXa{2 zvb~uYW}JB2nQ1Msw6y+br>RBk1$Gl1EnIXhbVNE2aJPX?ddTc&(3D>(Ni40eO)C3V zdc5?Dc7UPOa!R<*9P=-U3yAI>dnCAn?_PB`k3gTjK_z~3{Tq56aSu^sN>57u;>TD6 zjm6dO=54OGlIJS3Jd8~j5}lLn?Ob(uS~v}ip(FOhn%t_F7mE9_5Q-^2-W zMa-ADV^OoBkGSoV4VE?6inbT;0ZBKNxz}=CevMsyI0`k1lmuC#f^(eZblNlS?;f0Z|54{(!4Lu)` zs6I)bl@Iki8FD8y*Y8)qU%ijIS$r#%h!a#bDNQULV~BP3Q}kAhS2P29SsQ5=boO~^ zO)?F#3$9(#BH1A-$)+wpRJ3}gMtnR)(!dU`ObHaa+*+Sno)MDd`_jVrh|A`k}uorK2v#9v6f13b+ZgIarT$o zE@p;Q1%#6=CUxbQ;=h0Voe})iJ!?VXD`N*?i2S`=8#cZE9sj(DUNT@!$tCX70uO}z z9Z(rG+3$&FyiWrr-f={$Mvo2;^FOXKdK_>D7r6i8zEv*rti7f>+A8N>Qp;u2m_O(n zj=m;d*D<#!V{FRaZ&z|FwTX^kYP#}o^~-vF>ooQE44Uj5BA=m31St5^z_Y%cLgM|K z2I$@5UG)r4i+-)#R@Kb01L&P6*=`;>ua+Lu=r6Wo<`TC$j#-B<*IAm(eW7(qECu%fxWe7qWYHRn*TJPb^$-4yNAyU?k8X1 zxT))@OEGUX46+_JJ+$4E25I*Bq^SA}a;w>vz#r#F^S`+636XM7<$uf$YqN48XLi=y zv`wjdGIUwv^;fME<*hwD18z4Os!0mdyUFNR8oj(%Kx_aTq>C6D85nxXOQhR70?M11 z-{@VH7p!rn&0?Wsf>*KUO?EJoZXGX7<|lF|g-2YKWU1nSJXvUMZm3h_HObSY89%qr z*p;ExAF#BigWcTxOPc=T8yTIX?93Q_3lz%(Z}=Yf|1Dxxoy_p=-Ury99o=-(Y{?Z% z^}ic;8ODmInQm?wUZqS=xq;6?c1U}tmN#+X^4Id&@@Z7Rnn&hOrJ6$e`+*N(soOIb z7eB0uwY*~GZWkI&uWR;e6uyiP58UI`!|Sm|@3}nWYxLTfq5fIYjgnS1xmG{RqQa!g z$@;q1-BdHtpq!{`rSx@wCuUI3oCAe)p-_yHw4)D74~yB3Gv;o^ukutGiMXPj%5WB} zD|=_J&+635#vW0J0xv`ylZ^~=dUaK2s-J4ILY)z7qYr6H70p$%?3tEs#=wFY{UpP@ zns&}e?wPcMN11zqnqrUA-4V+R7m8gC=q5~k*;MwC^R4w?T}p9rc8_mMzqCxhnANUW z1HJM|GA~3AVkXyJ;62v2IK-;j>v2#$H@H<;Lgci7rE1>&5BWFqB3ngiVfjJBpsEeV z$JQ&ZWL1FLsPcAO#=ceDVXul;(C4C<{Xn}(&Ix}x)poP4eo1=fK*zuPhj) zTV{=84Zf=y#i`xuHwfGmYL7gp8son~tqFY+)HKk`N9(oR-7Mc@edgGpXN>=9XP z&Xc^`MY75>=1fP5o0~Gm=Z^?o(ChjqqF2PMh%?4?j4q9+@oTR6tlq&K<=faAnP*k6 zt=g#TSlP@_-(ar}GM%Ye;bl=#ngPn2|b zJuz?5$CfQAn43Q#_eEZ-f^H?PDtc7gZ7Q*yJi;T+cTK?Sz$SqYed~KCxj&K>QUT6h zroSs@6m`t`nBkkIOzofc>ANncuvk~!&Z(89Y0ia?iJQ_ynONB3K&$J`7scO-O^ry zgUm*?b{3kZ>*(T6Ik_48(^67rr~j6OlYyPg>Pa> zlazYHqK5_6cy^E(Ik%bxI%)B~+`O#p%#^InxpRy6RopRtb?B%B#Ygo;O@IGN|7-s5 zeeZa)9^Djs>1tSi0Zo0Rq?0xMnSHqzTI zAS7g8*!YMI5s48m!=8mK4)XACsX3`0t4Ly#`J?uQH6N;X86N7J>96VID)$;3Re`4E zHC5J3$760X@J#QqeWZ`2MrluJM@bX*U%EcES4ihtx)PmL_Az$BX0Xk$w|9(jrn}DY zX<{m!%)XVjQfyJ3aGR)}>rvrx!SlU`Oa0hAU$soxO5R%94L0{QAmx2@Nt|Epw{738 zKU=FU1Fd=1@3u9-23_s^(=~>R2F_qzbT!z5jDykCb6^g=ML&zB)O_4^eiJ;=N9Q*G z6Q9b*0zYmLJZuu!q+QwOl3?i~Su6QQ#e8Lfa;qv*6|K6esFn|tosiUHhtpTY3O=6G zI>$PW*caGxtevg>tt+iVY`yG1IUYM5u8ruJ(}c28r*QM&;LY7ZC(%og?MMU5rv+|K z@6h9BJ^HFlMpyVb$cAI+NZfyCvQ=y^$ri~JNjQ)V*P(;!X-32Jr?2BqRRFX&H-0nM zmQ!$zxb2)L|AU_`{DRy65O~?kfH3!tx2E$G}ckhgQ6xldd**A#twS_vYw4lP40NMe z!gyeYec|hF3FN3D;w|Af@P-}$7-}G3zXLkrOvE4u;*Q)0`}zwbWonq6w5K$g{S}Dx zGT{aj1Fzs=aRjHM7P-QJM|hOmLM3y9krAUnM%aBSmCiuVr4i`%K_Vc(h%)90FQ;Y! zP4BW0Nj(J;Vi5J7ABLVED}-6p0U&_2r5()QR6H|>T`OctB*GSkWVoEA*7JAJm7|XE z0A9z*{1|!>aP79jD|C{*!(Wkn5^1IUKBl+bA-xM<$QFLE zOzjAy3*^Z)Qgy0*qHGVyU7k)&=4R3(naA87CYIXCtw*lXHNG9q1@h78xZ@B`)0db}mM6-t!d%-0$zQb5-ioiIyj25iOIeo1UG|W2y57;p*+SPs z^tjrYI0=qh1(aj$TS`T(v#Od8Rw7w{gQXOFmo z*d5e5Ap_W@lfXaon6t1U?g$Ognd-c-oBQDkW&*gmd>YkKV1y&+QnHuVQK2F$yn%11 zJ3P~Jcpm$5|I&+S6JIR8VmDI{m{CB|cCam_@NP=BNv1M3`X}}a^#_{{Z$5rk%w-=a;_0el-i26UT1G0v` zp5Ar+WE$RMwC8{5#XO2>B%2_qffr^J_Y#qxpTy5xOYs?fM34cAeG~R`ygkP9+Ss}} zSl72APy1h4sdk&Tam9v;wI*B5NyiKRFtcCLB{1B7ozIHUxX|4pef&rGeD<`fx2SUI z2zENXN?64&cU|F!2^YoI;#_8-@(+1kwy|`HG@rS`SD;sOYgd|mUQMT(^X7F`|CZG+ z8>m}Rnp?WNxRu`56k-`@o9%j`TpPU7$KC&1Xt(I-sJ4Os`5pH1@$RTJpyIBj5F~iG zhCAj0|I-B@TMj!=bx4&Yy~_qljsVNg&3V+Wa9#oau+nO=`^qt&6Zm{uh35{J zN2vT1Z6#Xz64gOC=ac}=Tk4qUR69P{J!}`PLFUhuVdVffF5g_nmbcZr89P{gox|LY z1{C|O3hofLxlU>%7n&H5>v2u}k0PEq&zC#WfaqJ`%;Sy;jp-YV8n@e_igz+CbDLTs zOy>?d66_aj$L&GR!_Iv4Bxq-kvz|7-tXxuYLswsSvqGj%t(sCZ&E8HJ?D?PXH^0Y0 zdqdYoJ`5WaI?GSxx!nDse5Aw*KL+nw>PT?9xtemm{6Zm>?kj04tuF~>2Ea3Vp4;kt z>iE^s71;3)Tx(p>u1Ai=cBPdw-!__!FHMt7<4w=Z4=rPCGCX02Fj09+eZ^~<=9ceM z|E~Vs0w(!h@j9R$rHWU6lHOpq(yf3oe$6R&Y8+kcI&|ZUb7i=4UDsWa+z0M&eym^- z?umzSzB`c*fD9$^EPsU?Zs?KU_S~(@*(!cc29@hp>cU~%lP*~Q}(rNogzjx z&duc3z`eeDi~73zO}CAz(aJbQifoZIn$4#w1UvW5wZiG{tZ^)HBsq#4@0^LQq3E#{ zDcFPszyy7O$oB)B@7u)B=#6!T|G@RciMz?w$F;;Y%(d2a(ba;>=Gp*(_?7S!-q{ay z4KrKPQ~FvuR`yh8l{Jv>mv@lo$u`J}V23T0q#&L=0w-h^PRK6ezd|P8jDH2x=U`6n zDt86rEJvpYuAHmO&qM!~%X}qY&YSoK=#DlR=*I7a6d@5YFf)99s}RF|26}`5CvqAh z;}6l3Z4kQP9YROD{me7wF3$47OmoJJu4zYrB-sg`L>(gbPw`rSJPQT#8Fq{9#HYdn zWHP+x5A#R)dwez@ikR|8p)T@$?jwHF2r-$xh!@{QzQTKCA#hX|c=@A%OPr6~g$}TL zq{tTTB_<-@rvbhXL-dM5yyXb|-2(87P3Xe54RII>ecmEOTFe#hqO07$f)d$6eZ^IX zz>=y`Bcfvj;cF%=tMgPTuy`#Lk8B1Lbs4d{nfSk#h|{h|^mHL2!lw~&B-NMjPa}@s z9bRc)RH{sZUs)->MK-{Ccx#WqYM{h!sGGY0jY+Che?tV2CQdA(mn4suM2Np5W<}zc=*58uq(35RBy)&VagG3YkbLAQj3`Ci z>IwGd8bbKDk>U~UhU2vxak)`=);MHFkVs=u zZ6?ZNM950;MbJ2DpAxZARRAa7I3&hTd3BTYL?L{n-$?J0!Dg8}iy> zk+I^B6E^|b&Aq{^&%i0snD=_>9CShoP#!KbIJtf{3@D^S7*Spov$lV3s83y6O20N3|KjH5lW@s@(tKT!2F9yGmz+?>O(bO(cK zm5{Ha$eLJzY`vj)|L=%ytpP1wgAbgDy%IzXf-^;OW(h7-eNduFZPc2_^B#f&_rkV5 zi+NrG^+|;qiQ%up2+5$sW$fih&^ZJVnpd@P^!ccanTvI-$EWt7a^XKbgK#UUg(nyZ zUBROS>8dA2NdS-Wh@(D2-oQcZ%rGFbCm~;A8h*Qtn^pz#gv0(ng1-Ta$X45YCnwL9iv7=`w@(T zFSRlLW4Jw>K*T>8yYv-&r^c8`p!r+o)UctUSL{yo`2dS%li|8+@j3@YY z1UHLdv=N-W6ugV%KI{P}9H7~>iK_6|=X*o`D6Pq0anps_n*K0$~o z{V(&BAYi#Lb{6K44n0D0FyDg<33}3H(E2mtnrYxCf?4E;_&3Q~B{6@3rFR|gxQO>Z zz(~1RuO0Dh750wA!AZtYF+TYU>%ETGJ@DIU@XR4_1Q3J4bEhy*lG{NLOl9EEmdG3G z4juO^c9Y;6MS^>yp;;V=e&t|xpRk(ySnCt)?i zzXRu7g>E>BPh7)nzk)U-ciS7g-5ONrgfV*I-^Lgv29zLZht}Fzzrb?|a@;9!&Jk#o z-Por~*e8C_#s zUf>#nEEJ7VWr!JDu{$-$Mj$yF8Cc~HJcDG_1VLgsJe}Z9Wn--bWAX!LMJjyq!Btkw zf?$dHfV;f$tPp(F#TUsnkH#vQ+6C!iC-z<3Udf50lfgC|H0gA`eP zb@18d&`KKo6pQa6SRKJ4BN;Fv=4XV?vS6kpkA%kxt(YOnp4MZwIiNYg$|N{f|3fV# zbut8%s}leJ67;dw&X?qJ1>jwzPM|Gvt&%X?XwZn@qmbO@OzhkX>?C5(&@XeK0T1FV zOvcwG@Np)jLj?bkb5V_Xh2p#*Io<)N)QLuw4}}#IoOuhhqyjHba8VHU){N6*5~%V! zWPS-wrX7gOzDnmiR68JAJL2F!qwN!~aHis2Y_kH` z>Vt(*{B-^&?g$sc-*N5W&T;Q~Z}`Y20aw~ZpJg)PbqQDOP>y#S=Vo?0@7~`%PxXhg zrJ@2cnTyOn)L`KldSdmowXV^ahE>N`jWUcfoY!aRy(+sK!m0*Wzcp&i7wk{eZ&`U8oJ-{TqUF3mvQSHX|CT*yBz(j%WaFSW&B@)l0VI^0J8b- zjD(Kjm-CBUZ!Fhr6~=>lrQw}!uy%b(V%Z`Xkc`ev%x05qdo;9fN%)-L>oEZ_e}y{Z z+xS-pe)U=B9VS!Ro6x#yfAk}IP(9m}VH@UZYd(#Miv$kP2Tl%gkml4*Cv z%!-Fv|H3)>hN6P}=#pNg?L{kd-~1-Ei5(X?94fu=bzOy ze{F7{Gg2H@{xKvbxK~)$0IzmC6EcGzcCbWGi)DhY1Zfr5_&+2+7iSuGR$MG@SiG`& ziSd&@oLww*Ml9us+wbxe)nloz@Qlu|)G=(R5=*D#G|D}hvoxc9Zgo~4r^?c>^h4BH z%?01yq3gTUiFSl9>`@ctR;PP(tC;?5H};Yur}%>DY4QA$RRv)cKeU^xl;{k2N#c?x z$#1CUdTf%tk>pB#bzHDerXOWP3)Kaue@x3fl+);YBhvues2^J+UaO_bospkAT0%R8 zruA+YJR!1Wi_(bWtf$8&&4-+B&hxsbIp>R?mGmuYr0-nwxT=QTPoJX`yzeNZWHz<0 zY?}kUS8BW}PU`O#oyppoXa7JF;KoCjmJ-mL0c zURL&d_Mu$ukES{IvXX?4-!HrJgT|XDgs!L`9MjS-rt97M%l+zf8yZ&OyFF-2&`=}A z;e^jTTcIrOTX-h(Wp!0WhVCAsV?cmY{p<5ep>|)QnIZcwERZN24Rt+?t;(+dNGVvE z7o624yNh{CWxL$h(F)sC)#--)qp6@X3F|w3QSWb0H5uSl6`}EeDd}J?m#5{|(>^In z$ladH6wlN-wI!x0sJ?DWf7NvIxGJ9$Sl4qCZS@$yPB6W9Db0m>w{#;5|M(u8zrAp6 z`Y>x>U*I<=4!Q&I0Rw`*hi3uXBpY-umF->bD-N{OU^PGo9$+wt>3;j6I5W=MB&6k=H3> zSy4z{vBOr>hl`GQUfH5aam2-_F)?jAQn9+Q^IaRMvm@UI*HQk2EbF!Q!teg3ubE_EEVw=L*CX|5Zj~0%s4|>V*4c?ox%_K@0IzBDfUs0c|Y!% zva_xicFvksmYuhxc%1dHLFIg_Y$1QGbcDNWbbfoI#`~=Gjtg9__=jC2J7~RWykWGK zj4fzbWX+nF)h4&(hcmZ(#a7)eM`+DS&0ik)@sI*Gk{72{f54lCf1M<=Z)vsf-Qe|_Ly^tH5BSaq_Vk-9 zpRKB(rdon6cPitHx0f8qU!R?vdm(RO_TrLZMP>Q{<`ec-RJdZH=B9W3$X8J#qoz0L z8cWA*iT)?1SKxO4N8X2|Q<*Q$dX|y;(Umf7?;@%8O7Zy8@bZpTzgAzjCi4gAc@lTe z=AJQLqk`7?Z1#EQKgx5O+cvi)>{V_GKgztZYNH`vTUETKv`JBE{`b=EMH1~L-DcxZ z`&!!^rJpia{d4H_kXDgHWAYnpjw*~>9V-dB8v5E-qu#T>Opp^cdn1=G{N=Y2aL++@Q|BN8G!6G*R^B6U5&3eTL^%K9#eI z{Is*RmI8H2b@}t+HTok}GmOuO9RQhQ{Ww1%V72cL zk1|gWrGj2S#W{nFe;Xg`&y^0=E-Q^J>Q(wn>BO?9<;m3-t4DJagrWR;zb&!>{@uea z1rCphi8>ZDF5r8tDyYWidq7jS(F(PQUf;%vCZoZx?3MOr>7DYWg|5mv`f-Lh%NFNU zS4(EKa+bpEF<;~7Q&+Ruf4XM5XOib9H$TaJ_CH~(ZH;A~`MA!aH&k@g_9&C<{wUp9 zvCFWwGS`^Ng;;~BJ?`6>$C{UZ>-~BM^@`jQJ})RQre9!0&|v?5-U`(w$#HfdqJxu- zYxJIFJu1#=D~np`SC((nyQU@(gq#(QrIiuvLJsSe8Di2jViR%(A_oM$f8`&R8R4AR@H zI#p}TQ)-quR=ARcLiVOKN8#0_hU90_teEIlqaNq^!pGD9 zy;tL)j+%FxOs_c}<5gZVi*z@CmTzZ2VEf7R+>~d`H%u_Ps!y6^X1U$V?(3R|{$AJE z#|N)AN|i%syr(yrmQ~AD&T%cuL6P)3|(Bnsb}81bxHn zIVU;YT@rX=ZeBxUR(YUcSh7GHshtMAMQd&;mhR;p~Bn_pQk9wLo!OnLO zeBisx6Z+sjHWyvJrqP|5^^Ak@V_UKB0mslV}yM&UIdf}pQUU&pQsSj@G z8NlMYPDwGp1@s$afL_2XJy1tB7FK!$s@+&&Jg?)9aih4pTuW{Qep2%v`0hdk?s1>d z%V-GGmOaV-Bv~R!mh6|TMMV7o8_)J(j=~45Lq+Ij;W+QhZ|53vH(iHZM-Vkoa0wjC zEBW{QEL2U+!+qxvJieRhqqIBYg|&8NJh9$mhz#3N_0|~PvM2DXxzK-YGvdPg;eDMc zSdqD$fE%O&_qGfwfNqXTv6u8?WC7eoZB-2INzcdq@d><2HdLXFL#A_pKp{ro5R}eB z4C??YLHeP`Ut_HLEu!q5nO^XjhoV;RJe`0j?sVL7Pasa4C2YkWB?xllga_hwu~N7$ zc%!B#3^%AOsyn@e-bZJlo9zeM3{U(*G2|QbU;Z6I2n{p#y9bJcK znbgd+rzg|nk#FCY4x(SyR%v?GB983ByQhF!M&y(01g-EM9LS?<;UxICFW_EJ5aXV-cY@dSIPO;G;4^)Qn!?L?&H?zm2s*-W(6trrSEOp?13Y?1;qBUruM6<#e8g>> zV9EXuRdO|+a{*7giJXYNxF-_ixpa7SW{I7}df>1c;VTe#r0|t*g15&9RUR+lTklR! zq~{{9VL2$+8Mno3__6!Kzwi}a>%LgEQ}`g1;*({03Az_VB`{#p7 zw@O4di0_<-|KcrHHU)mYsqn1MglA|vd^}~KS1@Qb8FbkN&+ip@exJd|ybshGio1Lq zZlndc_20o~58*bx9DBD5xBr9q+f{f|?&5Zz4lg*V6!E~VmEdW$0tJY#H3^>|gc_ya z;9WuYYIp>Q7lh!$aFDF0@N6DMz0(TJWg`5yOOU5e{OJwx&XMp8uLYN#2F>=Pu5~uN zl)d1u_yjM`R=oRHykfvTZLpF)@U5Q34rar9F%UJer>Jk>+f;CV3hFwKq0W=^9FhWE z;yFfK0*Q~nj#)uD4)ulp&=#u^ef|nx$aMJYzXE|Qk}g0__)Tf?JBlewRs8n=4roElTiW{b(s{6LasNGq@Uqc`3t?W?8LKef;6<@f{vDf*w{A^|x{lnQwl8XM5 zZP-vC90f9g^e1??rbvoiQZ@o!j1+hQW8g>W0N)2okA=KWLNCEo8XX6A#mX~)O!W$~ zmyOTvMI@jT{LNmV<}G+%H=y=n2Q}= z5OBgu&}kv6oc=___)lmT^pV69+QXAN75mhaeohY)mNSj1i?mY=q~nm|HkX{jdVHT_L$)0paHL%3mr!5en?S<^%74A&AN z1UKcaUTwV3`(6(mAL18wJ*3pXx9>Nfh8|ax7bR8j&pzgYY+q_dThh&1vtP}knrSu} zIy^5I>oR90J>?nlCh{Y)?Xr8)Ws+Z+5NeC?lC#U8bY6Hy`2Fzo&^H0Weilup$0DVJT`UH=mfDkQHXEl@ zMOWRf(pRS%&)0-FHoIb|rmP^5%bTOR;hyrLf<^|!Gs$dbvbe<6(f+ljqB_x#s@q+@ ztlY1>XPIwBv`(cjt9o5iX>TQ5lQ>mde7XdPp_ZtXb%w-fW2G_eBUXoh4qT#{s7{xM ziSu0JEcL4O`sw9OwO_O+%63$&stz|L+3NBKsS@^qVv5RBJ;6ioQK4?>c3IIvI*4-P zbk^R+5tSdy`<6B;`K`F9@Iw(_oLc(0Jl_y+(L3FlB*kT)H9^lqm&M+T)6`3DU~TXs z`e@X*P_5q@&rz!3^b_Ys%X`CH{XK1i(lI4RN*|$VRLklT^Pf(qc!r&%c<$CsJ=P<} zQ|}qCZscZ{vuso0yW_5Tm*Hi_x6+8>2Sv>boduGj2E{SjRu!pLHp?8>eP*DlyMIp5 z$;dnPzQ?81@6f1cgLQReb2E@1)FOhBp;GN{5&9EUql>RT`xCs5)o9 z=RlN_EmPcff2uy}!FZkWT%*o$d#ljmMET*|WVu(>N~hJ1F4h&^FWgq}x?pEfXz9YT ze7&@0u^q?~^6|cH12=}J#1+J))T?ZyY_v8eFUA@EEnum4Klggfb=Pi-dsUY1PHFFw zc}3rgQi_Yp_vuy{uiNrnvzVR=gKCI}*|Uk)O|M{-9e-3km33#^3T+*K*VM0?R&h#u zqj+o4prX*iRz)j|@01KIzhPKz-r#7;yj1?7Z)182VS-FFjqnqUd#DX`!V^RpO=ft;jIkF#qEGN_)At_W2xG78M+G zFt$a5c@3w>wTL@VCnfYwK(se6pF#C@jx)s?Jj&;mbS~OeIJhXdbYs~TeSxW-ErU;G zA1QuzZ|$|x`@AN{+sk`{$7Z*#ikXtBqTPAX^0d0AzO>9M!qs0kW_wk$m)py6U=oyA|9>oyvajJ-?_>wOn$KG`_gEjh26;r8C`gvv)TQ`T9!j7E1i`1u`{ z4W?|=$z3aJRra}jbNSYaHM-v`)#k=FHRmY`vP7>=e*HuHgmsI&67@9tS@_AIXuky> zZ`4O+K}+4o-)|vH(4YSP)?J9n+cw08fr;o2b^gzf$gc^-u z*+H9-JGeX|gkndq;NpID*=dyhEebXaW2iihX!_9#gyql{RDW0)aiblxjn!?98r;C;RW#?L_fuHXDP0VvvTD!RN z?O~LfRtg{KO>7_e7sXfUJ35M0(qE`k+#_4Qb*HtZWxv_2YG7s0%6fWJ=BnMj}%KV##YeTmOBFg0Ukv%J^mX30*nrp z)w1%Y;j(dtqb`+**Xu7*oaYyeW-`#+fpC+SDnDU!u#VgSl)7mALN~oFoE~#Ez z@6bZ)Wy)>rOqG#RBwOGHdyd=2R|!7hJi%{LAL0eP$mQ@MU(;pj0c10^FTCEF1g!?- z@!~=uhNswH{l4PIMTPFHVx4C^s!1KbU4ak5y6gsiws1iiOitA`aKyx1h#r~TCE;Dd z`qaM??QxwWp4wX)x0t_^OO#>aj6jdzhTyKi%;4AHIM$-dXtzc_ynP)CG@O7z0u(V21{}8!U zT_8g@fqzv%4t{?+h8juFAe+&X$u4wDGKG4K%7ZtAN}d2RFb(zJ^)XvkJ}Vyp22xV3 zuKYx7l3OEN|0i`2$;%bVr_hz{N_V9cvez#lj@({Z21~IGUZK@7yi}$EAFBe3m<31a zbYv7fQ73^Fb`+xgHPH+H4fvBzAlmDP=eig6{z=F*8OYcm^)f2R(Fa_aMz|Fj^#)<; zVp2r+^*>RY?t?Ad6dueKcr&G7rT2x^T!}~n%eMtyhYNS;to{yryb<9*{Jbi7Dciy4 zngjfx8~l{b@MXHg%5IEIJv+SOhsYRQjcmvv;4_#H#04Ca@OSURLf6WCXaNh9VPbiprqJyaTrDT=38e@Jd|ph1S9c9f-LdMgGHmcrjbyYq)@? zpqDC8iY`hItf8ciRA!?8cu$}UbK%QnMeMflNrCK=^7#bxkAqS2KX_G00w*F;4X1Q~x1) zs_T)#@etlmCaEXd0D%|<6e$B)n&|yUTtLQ0MfB2H3C&!mG*m7tO_erEoO)bojrjF}k0BorY z{LHH0BPfS`?NTd3<7Wb)I{0u zH?cmu@s4JA$0q3cc3^X-kcFe+0~4^@>f>(RfMC{whrJc%hSu@Rk1VA3z(E$OJmz)_ znVtXs$V#jVogRRd91iRy6WE7VmGlu=jm7Zpow%Epx4RJD@obEB8T6nR5XC{z!%09T za**v)7M^(~Mz#={mapKSj|C<<7Jl~>=%)^tj*OhqjW`{)0hic=^Fixk5)WjvBoL4N zc+V7Q&%YS!dYnbzYy&3P1lgw-kbyNHQkenm>w$gJ8|YnotnnCJVH@&_WbCIJm{l8K zDH@YqLrAwDu*34eXcM4|BHnuhc}B;8Fh7OF)@#Ljt)aU=mb z%>c%vu`RX)YBCkL#YL=6mmk@>gMk*!ft=prby<+d1jyreXzw!Y+p)OoHavG;1FyOb zUD4PGH4Z|plVEF{`C7(cHl9L9f$nVswwnPPr;j=SYw|C~v<-7)uvfoA@?qF(J)o%z zff#MV)2S~oF^vb*fqQCQhHgSHf_T>kjQB0?CxFA7K?c(<$fgoB@i7>=e?>)MCU#CY zoT{bJF$DEgK*K6S7aFVOaW-|wiGK#;-isWr%hI@Dp;|fD6C-|G(pP=ABZQwXPl7@foI`7hP;UaL zTJQ2qjI|@AS`jPr7)ahC?7Xx1%K{*4PGmFx0wnPi&L}h3y}zLHOglx}VxC`dE@|0g z6|v_I;B>eI{CgU%KN#z=7V;g0=hIij8Ong;?^k64>HkN4;Y!x&fU>eSn7)OT8k`kbj|Kvo=|Yw2?Ha^?PUy>2Jq*^Bgr5Z{>9P zC#k+@6WXALHJd%d9%Hw&d)ZiS5yx;xc@IdxZ%Qv@kAm(XgrDAMTxvGkXM{S#(jx{& zZj3O7hlK48SqwB|y=kg0l{^NUJCaXhcLlcxs|23~TQEBrjyccn#kEAfzc7#A&wXPf z+3Uf2!8rjsaLxb5-`&68KNykKR_r%ET&8swj4N!-BhExuh-;H{H90d$P0CLEEpAct z-0<19OhXhIFaE?f^vx?CQ?#LQXi?@vMRLUh4+|7SdP|Mi_o?;UZCG@9DSxSfBjk}$klYYIdB_pepzl1M&bmIG{ zJ)w7u?Z_l?A-l$RwQ!@$P%xnIi>Fe+&RpYqil|>8`%~@cnN$s3mf@oADE&a?#i_g@ zc(%A?;qLFd@;c`(%XQ_s3jQp7<9#Q*w>EYZ#JUqZr8O@7y-clA!Gyc#;N&(wmC zIa9x?+5NsA`I`AH%_Vv4LN(=cWXq)KNmI+lrQ9slB`rC5k)w^>ZQ5ciAHJA+Xu3|H zps$cV^{&5?=R}}GQ4BlSSJppVjipBz_n8g)t;P?g(sUkhFj5$&>_ObS3RBM4)9Wfc z@@@K;sINP+7vvr(C@LDtRFTIT(@Twv?wXpG`cJG}a(L{3(DT&5kn)DC$R{DgD1BJC z*fhb3UH@68?$Go}E{#s2A^*ZT9-*uSZlZJuY5|{w<|K_y*H<^?GPmeWS!@p~H-2 zVh367mMWq!N5SNVw2&ZrC;be6K&pQT44B0mJ6n`9fUThMMCcx#E+sR zgRgU5tIv)98~pLZ$MBDl-zm4B4oY7#Y( z7%H($e`my3>*qc1%Y0n$rR0}hu9^Y6GL_gK{kYmfyS}2$`d`Gu*l6P@@}86z{?(ja z`d!2&E1UdIKh01t5Sl+JyOKAtuzK+wsU(+cT^7>ITt4!+x{3m~G`CQog<)a|U2Stk z{eHs>c?TQt_0G%ta`NM{_jNwk&Hgp#X3++wI?j`8QNybZw5Mmp+bTQUapw&Ks1H(= zsK?g6Wwym6nO7wp)c;8y50=gqzm4`pc#YmoL=~~NwZG$_{<7`6ah2GZa&i5|IpjTM z0yWe0O82Y2zPd2@yY~;*)12cuExwlgx-@5X?$G>w!BhTiluOA>yIJezdq}hoK1H-=U5=yRim$-mf%}6zBF_d8(NX{1IERW?=SVtf zv@nAPYZfr4JXGUfkXtYr-d06R3LM|>Z% z{ic1Tsds`^mqR5e(?c(Z#Ff|@pJR%OyI`E8)|Vo3m*%%}zw}KC&XR|TiTb_PHB@tS zPH8T*Cmj+i_A>RM-#AF)e8XK`0r8jIiG37!?XBnk*FzWXcISV4lgs3c$(@}a;jso& zsS?J|Rot=5a59$Gl}$d5I=;iQWU-?8TWDG}`_c$q=puNEbzR$Ympd!EfAw6VB-t@dR=Q}t~iD15cuGa z@ox(J;u+}sxkxC?&bwVODDS;v*ioa}%h(<1Hxq~1UdMj1MCd-sH4JW3 zukdBD!!30j+wB#V3?kBVHb15?)IHU=h&v<>B^DanSnlWt(6{6W;;uMF+9{S37LrM3 z&b$~5g(vWId@ns^N(Soq#`(8$F|0FS4P&1)|epPwY2Unt+ zl9R+=2)ndg9HG3Fy6K)-cG>IOZT3c{1@uI6AlEC{(=YkY1b48rn1+Gaz)1I}f)V-8 za%Sdj$crs#?E~APX=7B$vPkXDSe3Fi`by*|+gsgAvY~FOzNa-JtgiKmZG&YT;g=8l z{e_)eXI(MwG5%AmT^U7{G7UEf`a4t#l|wa9_NvR#@Hft6wA{6%o2#1)bUe9FSRWYg zzu-II7lP}8`N0Okq0BOOQql7K#^1jb{NY+uWMd|)J8bzO56hlPTb25!Ov5>Q$R=Ms1$_D*rvD5+eKo2D5l(kd zMj_WFUu~(sVi;qxT5cOY>gy0WQeSpha6+J&|5Y#$l$Ze9IQZG$!9BNVlyio2u5(t= zUC&K!yWyevYSgvzQ{$pDvf|c636XzpUEX=@68;#R^?-{Ino z?vtLqfn$sTvHZQpaC0S7U1JFv-Ghlf>i^{GpyH@XOxDr*bB3C_Q@U&-Tz<|k4!#fE z2~-c>WqPrL`50DUe+rECjq!}}GK3VO~Vk zRyLsK{jvVI?UTNR?Sgr`p^Wa1RDvlNyzJc=?}CWTz6Ywhiy~> z;vo3rE~*|ipMI>%*EQ68iI?&r;T$)JtH|78+62cj5Ad}pu)%-Vv)FsD@Ra+CJIr@G zxD_?MZ{l)ON5@ww>51wSJ3b=KJ`1P$M5zSXoPJ<_OuLL5jFKTkAE!QJ_6D|lX9b@4 zHu&ELM{#$QNw5-s)}>OHsNvKf$V!@~^p%Iov5HL4;BDMYwb9qojiGXsmeOot1V5L} z3cd{t3H}+FA1oc%?oac#3f%I1_uh9m@aFoWr6T38r~}FCV-A++7MqqZJi1)SG~G!# zQXB$b_n3Y=^;rMXs2DlJadH6Piy7wA`33J4&ryF~aG=zmtgG9vf2bd(f2S{^C)3l2 zVlX$%k*}#c;dgeVzt98q?{y1_T5<(};*K(H0>%Cef9K$vU~|~0{|25jCxV56l|ieY z3~USRS2j|~Q6G|C#H>l`7E8wsj!Jj*(G8KS3s00P>O|@`v5Xq4Yhth%p3@QX8KH>n z#ks&ba2hD6N0^JMku7v3-C{ak|DQfqpGkL7pG)hcJ#ts&xx7Zn1j|AdT_}~MZjtT? zQ~3gBLcs5@5%?`wku72ua4#7PyOur3+zEy=AzYNWpXg&;ANx9Pbeuc(L)7EQ-C<>I z7j^m4zrtpD74X6d#0)Z)s;k>&Sg$`r^pGWfs?eOTg_CF^6U`+`?^HLXQf6Hn!!^Ud z#*#W6@mS6m-$@JPqsTe>Nu2>E@^j=|ymO`So^8bb#Vli%Fq;F@0tTi7Z1~OW%V1XE zpCHfuD|e%28~VpgkLn&fCw6euyT~D-|JtsZ7LbafbwgWDwkH;V8Fe+$iK1zEABs!3 zEIi{fxh>$+`IQ~c8>D6G22!N5bc6IAjeCu!O}SvFUkT>X^Wa0N25hn!m}L?XEvYVF z5l{1e=4^0Ra5WI=rNJr8e6|+%L1-)<5H<>z_$aAJZcMK+hR1w}UK719$`a8dd~L`D zjAs|&5`Ex)`HXH3H&j)wBWnyMI=V8Y!29Veb&=Z3XC)_pg+I^#CJj?+llAob^lc5# z3=<7s^}DG^^1fUk-WLBSo|F!X@5I@tU!Nxtk|@;VQ&Vst^o)Ufmr(OOMcQ&}p07KTfY<=g82l#|jdc^OfTa?z#e z3*>yciKqy_iyeh}LL@(jXTg0?lANZiYp87MXPRbgpwFlGknPo5a&M_v@bcw_x?*o} zi|7&`iKm5l!Nco>0`3Vnh#$kqMo&|mR8_dcZ;-kum*fbEmkOnFib5=*H__FI!}4wMZ@x2sTbLtO5N8Ux(nWO_ zb;nTI5^C9HtfGHUCzD=OYUXs!#F z!T!P-_^skPb-M9X*vhB{aVz2?Vpm1Z3b%$zwzGy!R8@Hbe;W)-PdR~a1u1=$7Aw1n zjr34mF|CxgKb3a~TlkxN3vL59iT{OP%h%^y@FIJIk=OxTf}BF$w-ko|9DOe?DXvsZMr5h* z388~+E`x=xE%)LVFak4^^|RIakzzA(r#wP!O4X;A(4FY%WQwv!$`g(WtAqr}s$5de z5WiDx=-0Yu`nQGy`or{Yvaa%4tSijs6>c7PjWcsw+1lJWZWRB3&lL6vi-ik9XYet+ z;8XaQ{08XoelW{yw7(5s8jXfcEg9E{Yth568xzq`Kq+^v5#2Ru0)dSo{XQ?D))2;>P9Ift_o(e3tj+@Qx z#4cRHHQ+w71ot=B0r|gAgsx&xSSZ{BtHcl?TYReQq?#Fb+Lf?FQ7fXeqSr*84T}${ zVB2E)OaFw-RK^P}aW+|*Ovc4Ff6^QI4A46s5udx{N~#;(R(FaXNEd@^ss=d^Xl66u$@^u!^t%w?Ca@Iq zF*qzZIcUc?4k9|bkbTNNb7{gR0N3Bn}bg`Caj^p9aqyCAR9Q`ihZP*yc zG)sF^b;EvYvpP$D$cHet;GjTwU_)>xS4}u7#vu%`vj(QvKi0p`f8XCWur+961~V#ih2>Z)*v>5A{pg|&BYV)F^ry^! zI97!Y(rV6&Ld89q_B)NzVWB*FD^Js9wh4bW^IE=qVSF9K?qN{Q5Z zDw8hOHNb8jrDLhu~`c;$}|n1gXlG+UpW0?xJ$V!G5+ zu8!>MKZ)g(MW1b4Xno)~5cVNrOJq9i<+-7^?ai!bOmz%z5!3T2oupPmbM83Poau#= z`9JQ7a6r1OTqbO=P+rl=x=Zv6?BAPI73z1g8F5i*BmW{U;a#wnCk0)Bvw@d^#z8Z4 zk2%QZbBFjV0wIN=n(`pxA)(M@k$$U7Fl;imGnciNvLAI!2w4=uItJROSl5{680RC0 zYXG%@NL7!>-K8?(UhvYq6()&qrI%m?D^dm{E4Uo;qz8c8VkcM%?jlRNnVg1K3Vayf zlDohzX1lYq*w^fEF2KRm7GH^p@~`N^(wq2+43OKYVYFT6)2-5vGlUyw82cH6#yO@J zrl5I;WtL^2<(#>!sg|)CvM0vtuF>uM%As-_shYS`00P4^+#7BePJyl1`TMzj zoX9oh@A91lLYxC0nlx!HK2Avvd6^uIob!+1BRh>~c2%;NETDM$xNemGhMqDsGr0Bf z__|O3O8;IzLqAu)SU*%>RN(Yn{(~Mt-=0imsCsW)O!g z>#2y#B_J{|91*+wVEa2kz9Gv{t*L#~11gpNlm3rhNVlUuQ6EvsP??@cOJIEaNDd%1 zKKKS?6-2};AiCNFEPYXkpPfdYeN&}|(g$oe3&5z|Qb|YN{Sb6;d8NES7Wivr2L3OB zlF5w^O8G8}vJnh=Hl>L&3%TBkG70C)N5m~!BWA^bi~bE{vyGaHyLO`*;lz!_X?KZS zMII)X0n0s!zB0qffn*8PI)sDw?Iv*h9*Fyxkx@DWvulPZw2IhaQx&Y~Sc4qYXT;#? zo`IMQrEbF*Cn}3!jjaanOa$V#anjnz)K8PPwM!ox0#Dj`~6b(T(_yOeCZboFFIi49EkV(23IjH@Bu{S}K z;2TaZ2GOKfh)uje{7qwL*oKJ6azs=XBf9YBN2UKyK;5+-@^28Cjt3UL77?Hth#-7K zRO$j&C<`P0AF^H-B4RWU60HZ_ZjRW-X<+@gz$2km@wY+NX+Ok_dg9K_Af+*oR%Jvg zBGI{y#+7a%st|*iR8?HNCn67Jpi3Ui`z@lAZxMNV2buhV=u$VtriP#@pcSI+QK${* z52q1xYMqmALd(JsU(LX0Rs25$Gp&ZK@?N-KBSd5(a90P` zs1Ed}J7UFy5M|NwlC?gVkyx4Ph!|>pJ|*Z)9#&W5gLsSec?d1Mf-z~`rC(t#S~t&J zL{~MI5)m3Jf<;2>)1md=Bys0%i0m!Eej14H^PyEMv5Tf6COIB|>k3`fdbj@!JxIi8 zc&zO+=s_9GiAHShF6N+Rh8PjIvLZ{QDt4L&XNA@YMe8$Pi2uJt2KIB@lm0Q&ez@jP z?7m*m#U9YbA-I#)H*_>|xSL^C3D|8a*d^-zxUa^1^5O?)h8A;nLdsdVo)dFylb%mx>hreDH zKMlfMJ3z}?;moLvo!SZ4(CSHonBhb0NpL1${~v_jZ9-Q3YFM7Tf5h|NL&9G%4kOl2 zhus{Hm8PLrTF;R$&>;n%F39a0bTNRP+W>cr#VCuAU8D7})H>6ZhMoj*>TCVzv|isN z{_BPms$mw9h^k4@6s`NE4Y9&En7!6h8JQLy*vT4a zO9rm2b#r|R9ovDuatOO^9e9v5uCM*r;h!-k0%O;hUTQ#+UGbiw&|a;7nH9RC^_6{! zjPmD@f)Q(yh!ItQ%vxgYryNO|Bg9nye`l1-Hn;u#2MtmXAx#j;(Cp+ zO06KpB+N(a7-+%ytZ8#L@)Ew{J-47G8vD$3{FH;8;DNUMKU0hu((i$2^k0}^bI7JL z)8<16|91`m%}h42~QVo zr(S|wPh$6cMV<`@J+fhz8qbc5+Jq#me;G(n4^G#; zI0dzyhEl~@z)B1>p;2ElMO8tkOa}n>ohTV4pGC2Zme~JGX zA*(1zxisXeJ>#_=M>d>@0?xnl82LZY)Af+zVZ`@O;W_gF5@2CLl)_WD3eLUW$aESG zEguM3{DKpwJl41wv^NEsWx{#-7TWU+BiCwDw0XV3^Wi^?Un4c6lr)>o^*(K_LN!3p&Ovq<=H7KTD{$aF&;&10;GA7iuN+S*ep2r25Y z3Tcp37d(p^WA$s{RM5H$Hp6?W}qB-3v|%jd4)3f@rKt1B|vkWR(bA(|8brc)b(S@jzm4u-{(%82uyYz%z{UJMM<; zL!5|OhwXdNkB88YPdG(9klJ&+R(0kX`;SM5~zfLUvuZsYK&*@N1OCkL|Dc-rDII!)IDIJuH=PHG*xHG4|y!)M0Xqj8?a zVD+`$dkMIY*0C=X??kdRRzqW<)41p~rZTOk+(&3aF;+t3rpx^?2d$4fjd$2_C#{R6 zW|`S=J&mU?3h&N_#58Z?JH8iVuW6lIefYWH$Ee?9oDw9jhdx*^TCJp3_M%nC# z6t%gVFsek{BO1D(b%Gagm2bF)W`Ss(%3nj{K0_8-7sij!`1knw3c8Ymzr27JYCLut zuh44A=uac7yhGci`E?VpLkk?P6SCdTVT05(DQLX~t$0;DB&GFF z*H%>zy-_fq0?bb90;xUUzGFUC8ZDtNJL7@STvti5LM(s&o(21rKxi}rLb!nogK z4v(=@pJN73v3gogwbtcY>o2MGNz_5MNm#LJIMwPyZyQ2$OG7r{(6l&=J@{j{Y1*mf zmEDK7-uiKNYMmQT{n#1WjyVrKJ_ZSBoP19pmtu@aJEc`vty)LsT0b;S>j>EyyQCAI zqHXc>0Gv9Vah7()UeumhB{6p`%gv9O`7k3VMw*2u@@wpm!+6e}#>WH5{VhJUj)&UW zulX5ixP#VpQu7ghfezNjF0Y8|B|+z^V7;RuT{mR+8spRKJ*_vj*8f`DiO->DIan7C z^AvGC8QQ0PryzYz>&(y)&F0n^X|=r18u-03^rr^S|5nhVI*?onK1x8_ZMYMORr-uk zzrh%<;SO4N#JBhjDNIT<}{F9Ccc6&Z?c;VJh;#;lf^xfZK)1Nvse zRhq(ISpihx3M%JcgQ1l{mhV&Kvmd}YujLL#L#O_MS6l~~%omg?N?S#*6v$WPd2(Ah z89n%t<#@TBJVxFx=gJ96e_$?`6cS^&gnIrf#AI|=UH~k01ak6v(VgjvbRl(}`U5Ny z+rd>l4q36a(Ptq7?BZs5ztlnsg132wI8dx7b^*e7SbQpa#4`B%Z{U5ZBp;PC(B+oG z+}1Ysxzd16WBz5NVA^W2okP~?+#>3`;~XfUEoZg@$ms@*-m7)rveWX(JP^iGE=#! z5I~^D!Q(rCdvzvyk`72^t}a8rMqj}YX$UtA1=<~EXkbV(EYlnHWprV*hrCEEQvXnn z%Zc(bDNH&6An9`CV#E&qBX5v@kfErBxDAGZ$%;!J zEyu}{^bTy@FVO3ug#0J4xqZq$^*$k!L+Q!76Z%bthQ>X{aFgCt!elZ%1{>RX!zcYo z-9ow+bshQSO%)dR{#iUD)DjYa%0>yl0R`PH&XtD9bg9^=rXF_jjmYt--5 zdqbAKJe@*3kPKjkFD1<7Yw}Hz^*ERB!JkD2WMlCs$s-$xGt^xDUeieH5qry!{E+h@ z%N$>9do8O?Ee&ZpmL!Q+a<2H9Z_ia`A20^C8Fz~>FO^Y}(2Jl4H3Qw53&>p3LkI-H0yIdu12baOEVy`pHnLcc5j^rzd%f+su zEZs!Rr!R4vI;rn%o@#Fwej-eY>Jm{sEHmVi?O)Rk!xwrqF-cx77GmbKFkOff??{Ky z_whJ#+|M9`HWC~;eyTSep__^9h3;7GV>pw+aRBy|U*!Q}C9whj4{avEW6&F4rcGQ)BfnER5rS(I=u8#;uEuh?o<8#!=gP)cBRoRzk$T zxjOtp?vU_G>?f9##v>kJ1X}t5wcg8MJ>Ep!asg$fZ=;^%De5*BlaGiE>PEST_)zGE z>hBze39R&=^bPP&33viVrdx0tbDZ7D9u*b{n}M7+Q~sc;=;vDIguIU~6L%`+QPTJ* zK5BHtBYP)Pl5Q$0y>D{8!TEoPyUNc*rQBI%E9yh0AYT^@Ip|Olqy{64vj*_724HAu zPL=>;`x|AOd>2(^Pq_kSbzoxP9P%^_{t>?R{w)7dW+iy{Z?Wb0_xugvp&X;WB9Bw$ z3?D2v!y3hr37Zn%#MX~(9{nsraJ(|ckZYt_g3O2W!`b!FyjDVIc{(u052)ukg*?;> z1~cUcGAhZ-)m-ebdQx-Asr-cuiQmN4d?D3+W4VQ+=8()X^rabYk!DZV8W~`$YGQ>Jrk@8m=Ei6{<1d;`uvxfGZ`e z4~~#}aA&2JWEbL?ZUQZ9u?@_69_sgV1Vx-JdWG@gWg%5qA=Krsb9)#a^E>3u`KJZ` z4!rX>VH21fcA6PhrQVt4V5*h1c;9F+A$Ixuyc5|m!y6gVeDN?n97VJTZEbl_SD zMO-ibBVSq^B)8%lsSecSH_vtfnA5yiP-w>%d3G1UXI7e=vD&w3o0Nq-9 zpt9|rI$a4t#Oo`3>bArd@UNVQ1#}0NqhDBtmjqms1=lF2n-KY%E?5{4!?w^lQbcV&Y8}^Tekbb}&W+1ll6qSQMWXl|Y zWpV_b%XToYJivMKFKnKMWGs3NGzN>vEnF>(7@}Fps1BS6%j_Lcepo&@Wkq-Z`v5y~Ic%u5809I9_8f43J5d2v zE7TffsXlmUXCddYuokD`dIUO4d__%1AKd%1Vg-}#Kd5$ChgI4FOIzy!Tm}|t zQ{ti87dq1&*5D3Ut-qtb3YIx+$}D)!^`KSXzOyKt55uunDA zNb_`3U^!|MD2Gp8?Ep)E4o24svdF-d3Q*bf79);=)mjL<_!asAR|1Bld3hso_o1-n zr=Uus8oc;q#9FQZnOcU*p((Ixw&A`fQ313aKCf0~a~O8E=A#-Bw@L*=%TM6;CBZ!6 zhTrfU|7GF-1R)cTx(ZiJfj_5JrF@6P?!zV|vDRgKf}ogegOGEm}u7{Mw0|0y)I5T7jcoxx7=Lu;=A19*o!_<)I2 zgV)sY2cD!M3>vRW7Epszxaw_;QNtJ0VEcDLh2RVzxTBE)(hno42Z?)9_1>eeok#|H~syC399+-oMGHO1}LtHrv8e0fEApw@NrflkU`+PLctS*q51?zSVXTTrOjTxxGnhreT5Ke>ZxZg9}^)tTa!{5^o z`qP-I~I`gRu5%=zIb$6*K6ho{v5drHGtwYsPj$W5yr)DX`j*i}dI z^&IxqUflZ@q+5vlrojKx&@rvEe0S_s&3|eD|EVj!H-{vDhWTPv7I+ z=W((f#o2HM`hE@L(wOfx7W`MxuS?i7g+i zokEpXSB$(qPWApk_-X(P&^+2)oEmYs`)90tIPwuJcffFNCCd^6$RlbxnXAqNk5L2U2fT+*QyFL4JdCy;IDkTt z)o}y6U&V6?=nzKx7jm;sqs#WsijDXx|ATCaOl6=NqAXD-DQ!?^TM>v$bv$#bp<25p z*$`D=m5}q$maeUf*HzRRb?w1|I24&R4oW1W$-Q`8`Fy>YvS9f>9B6_3@bAI%xXN+rG-b5l{!Wi=?)sd8Mj)F zo90>{8JC&5=^xY4R8YPs4-iIk#f&*<3$*nqzOUYDzHoo%z**mE_E9hsH4VGe^XTc@ z&9*djvo$m3SfoGdY2<;Z_Yq4SbjVrLC}RdWNvbGa4?Opk@FjU`7ysfF{QZKh*%jh) zWe_o$YH7?djW+n~)2+#-RrZ>u!}>gZIXVQLdumImY%8uX;Pu`0mG`XjEGQmb+^2Y) zm+{;VCbIANa8s1v4-JMqv~ux(MHR$9iO?mbM|KIl6|v5^&YVQNkvTG@BOLyXGyW1jQt*>n6B-YS-mEwojwqb~}rsS6ADhW!$n;iwa_I<&~xI>cve ztZPF5rZksB*othw;9h^F!1}-gb|afAT!r`4op6(9bsy;e8Mo*bnsW_r^><8Nb?bH2 z==RiYWs5RN{+Wvu9t8b<(pSkF;!bks6^(b#M1R?a{Catv9BOH4L#NY-#j!P`gOSza zLn1GRri6C4&d|Gw<;qkpCMf#<_LlS3@kaWW2PQBL`ITZVWfv^wINf1gmOj%k%#f_F ztly~{i$3!E$tP+B^^!74xhyS|m&^0e+ikA2LwW^P=N(|?Z>+2XcgPw!RJkCVV6)~b z-M}t@ZVP02vNmxEJOnnvMmIu!Q#SQCH48O*FLVXeL!cSQ=|S}G`j6Bepc|v8UFa&< zjx0pqgJhz)atPUbr^MRABK`^^2TKOi1DE{Y0viK*?j1ixxur(wH<@c%#@a_aK05xi zO|mtywle-@D6f;rQ$Qgi1(6& z<$7?mQm9ei2HdKl5~>K&-@vJ^5|Xr>Tui?ppU@L^K7Cj67hN71hZFq}vZONwN$AQ) z0oxeBKb2YoX^4WYo`*`-*CYWZ&Mk6bYyZ-@LJ00|J4uD-PVnvGpSU{i|5Q& zqA8hy-U=Srfz8n!bRJ&4oGL&C>t0#m|KyGbn+2Bm+W98=@_oe|Db!PgRH|XK`K37w zH50U@lIhsq^!q@+yES{^{DscX8n2cck&Cxs;OinJkj#xKk=+; zfpdQ_u)^`+n@Co6%Xg)VQjxSB{Xn}b=~(UQ^-jYh+C<1u=c?iXES+N$eC|4gCdEv(C<$_e?X^hpc_FYR&htCS_} zmY*q8fc#B^M^zHfY!lcSCINq$rtuNt>0W_qX;@1p>j#7N|1H%UxKu3qp_1|`>;v>r zRGtfa1&)8k?hPLDT}2Z!i+ECr(w8vTx8ztCSO?gwX0Kr)w4*z!S6|bqsYG9Iy4j8QdAqq4&W54ywapr;H+I zsRpp#B?6gwgiOImV1($AMKlJZY7^3r>hkq?%9Y2n^BXKO7ZCBL_$?aG?ox>D?tmN{ z!6uer#cjpYb1FQk%V6a=LoT5njdVZJbx^-IiQ@3I z{tFho#vxEz9xFM87@>h!C^nI&D>vW~#G{J64)vJYM=z(|kW1B$$}h@4ax-L%%~$u~ zewj=h0<& zwr)QCg-V1Unn4_wepO<`bLjoof*s3m0RGk+z1woAsq{B$ExnwcfsFr9ss-40<|%`f zDnBRhTgG-s+%v)}^ zv|GQ@IxTWJC!XU5^N+zg_J!ZWt!3K! zFL*W;T`9ch`m69_(E?Acz%@QZnQCcc7ov*d%Eot(w?&Il*^Zi_M=ee5KI2Q%Iem4? zu6`ERur_w4KO|V_CxTO%E6nf6UA`cy;y>zTvcGE3WOI*v> zMdp1+&dnAv*5Ef^2hUILXN7gZLx027sCc69Cw`l9z|z~%Ii^zl&V+ICOJko!RSZuE z`((2_T*jK_VPJ0BAXOF~2U`Wl`M&vI__hWTf=`(N?B9HIF-Hm|>(dtFL(67cH%EWF ziZ1k>bU|{n+*ce9J~p1oVvYx{`!l>h7k4g-D!k+@a#nZBMcqArvCZYyX4-K&dR)St z#PCEuetpcW$Q9v}91TOZnL1fc(Osy;l3yU1VZjl;B45DE`+EAz1pf&h=I#l_(sA+* z{lWOcGR=0)o@Hxb%{J}O9YCegcqvS5#}~29*kOT-{xP1B?!JZdoT1JY1s3O;q6BX? zn=M~8PqZJ4ei}bNF*~6!pMQPK8Zhzx#r|X7=Dyax zkNysUBkU*MD0|6{y0fNv)+BqpGBYhXS(MpD;p}jcjO#G>Yv5BJ-J#n6xmQnifqoGzyAIl#45jjViCU#>c zFi(AUf2enux1TrGzsTR2oyj+m2LrdyH!rdNZclZrwQaOaGud^G=pm|AStVrwH~k(A z^>_4+FN!UkSzswBpT9Og!?n`gJzx}u)Aen4LxORO;$J3aB)&>)5}O`3Fd{s%jAN7a zfT=uPlgL7!)sDd-!71LQz5~ULyz@M1{(k;7z(RWvRj7T&GS=a?=8li{RI9-f05kn~ zvYYZr?kim3W->2)HM|dszB_*}$ok&n`_}LNe1m(MuOx4x&e#S!R>$v-pPN*i*ekh4 z{OtH`QL`iSLZ(~ln)Ap{>J4E5zar2*X!dUNZ7r_nedqbff5JbEd&rMcDf(B#4eJ=& zHAfZ4MQa&Lb3=3bCOHWlco{+(x0zvlqrJA`_pSox!TcKe)$_OI*DadrHF2jDv+aL& zZ_J+wD-(w%HAyN+2#;G4b1Zyz_z3eKmQ?B~Q6TIPdZ6mS>O1ax>0!~uAlug=FrMu# z5K3n{sHiEDu`FgqV(G+XNj;L(gkEvWVqS#DgjX^*H0vmIiW4ddQ-d3WJ$)m6<-K1# zb$zG&WrLfz9^zfaq?2@IY+J1N?RV{A)}iKF1~*j>wcY{gF+Z4z2v+ePFMe2b$o1Vh z#95}`zk;R(pNryrv)KCTaO+pcxai7B2?-mLt0k^Yl4BdjWkh5~tTIPiY}9-8l(3(# z7yJWrzwqfUb>R)t7Vn_hW(l4j(M435M7@BihlGfg|^K7 z;6YC(&$gnCuB*M)Q80S2@8{+B`!|tAJ;U#L&Uep zo8}D`D^-m+!Y|?n1u6xad2>B$JVJ4zZ-hS(jO7MP-{h{kpLNr%h1PoZ8jkhWO!HCW z8G0sdQCG;B;xlGUaJ)CB_+^pBHPAWLc`1LEvy$_EQM|7Sw^EKat_!8Zz9zWinPX9f*u^ziyyh$6}p^q;X2~VFZkp<=UnKdiW~XzxV3TvQ}57fq4g5a#cfV}m#{VYXq+M8N@Talw>H+) zTu%}sq~Tl%cCNRtubi9m3~&$fKJhLL#xuVO25FVLT36Q4&brd}yM3sAzvaGZt09fr zPYqDE!mfJA)Cw;4T`tZl-cb0(^}DmKb9;eUu*Ox!Lj~RoU(_|W@Q~?|d5L%8(h{d7 z&PmLR(Z}r#zYuoZoM1Xd^;Z88!uY>~_q|2l!|s#Cjf=l{yZV|lvFudQApeipqAzVc zWPM^^VXtXlXNfnx(!VC1bO;=Zs6wr%N z#AW*>$CxN*!tnUB@tKL85_ZNkh&>TrDU3H~n&wl-h%8h=<^<3948E7ezZAbKF2wAc zF!!1b zlSY56Rz*v_mzf*F9xBRV41E;aI&l)Z{d`Yo9P5nEj#?kSEabFht??whuOZ^!@ah`{ zdibV$`V_zOIK8j^9oWA7e#xbDpsO3pTaMZ@LVmWdvNkuR>PMny7)R7l{n8R~JJ*Go z5-9Mxu%E`bwmWY)UpYS)HgsqB=CdoMF*-G5M8ufbu8F_JFNzx$-#<1Xs$s+tN3t!= zG~2MA?nzM6172oU28IV~`j`5a`Of;s2lBXV;fb8BUZ4w%`R1nfxAu{?5KDJdD%PZ{ zlKs@1aw#c8y31c_NlJ_TZfyuTbyti^$6fzwPQ!6J@Qd(f8+0n-61 zV~w_NwtO<)F-)QQk*S0rdn8fJjDZ?h5X6`A1!STw4mV z3cD0l4OC%o2sgPf`EZ$dFFIA=)T;(p%QX9Pw`` z{>dFy*v6Sv@X%S9f6mpeXn?0?@Ef~UeMWA!R}DX4|CG+hE=-!1-Y9u$qBVYD{A&By zkPhZ@KqsHG;r?NP828J<0(Xhxn(hm}SHT{^InrmPF1gFt0bEZ1vyQd3vbD9On2#8q z=yxHGTSflB8Ck+t!DA_^;p|jUrC>Nx)kZt3xY~MT-~ZT~%D+Te$EJ|EVGl|?i_I<3 zq(r|GrIQ;caf#JJ&xRkj970Y?f3{ZeesQ0oYOcBk^9pA>4aMiYY#>^gE*t1EhUu1P zw$~2EanbIyPqOSY^)Ym%C#V*=BmYaFoNubTj%#v3|9tLyx4ioWDFr#spFMfrGnl>Dt^e5uE&CsW3!T#ck7ciInvdn1&;5v=bHEpikr$orhX^?Qoz zV$ni>GW$*JL8lw4TWdRphGm3y4qFu3&la%wjIZhGsw6FA%lPYhW)wcmAO3y8_er@o z^Z5MU1%q4}9@3xAWXmRc4p+SVU3LQ>Cxh^ z?7ZS>h3QuteL-P~Kbf8-in^IiA+pV%dmPPf#!6Wmsd!=;eN zVNXNH+n%CxQZurxG?t&{U*TR^xHf-t9-TKnFEVdq{(fgnVGqyGfl&6kgo;jGKl^{- z-NLFTH%iJ*PAyrkWX-feNkrOTQN90OkO*w~^XC#tZAu=ASjsU3<3nIe+1%!VX1UE9zBcMLT%cSgC<`Qp1^>v&!=Z)M{I2 zSiK?jZ>?Xyu2FYhUaJ~6XO*RN2-PvB#%on(mYupV`}}ujXP)bO=97ZgO3=b18Fs|E zXk{c89BO;o_&crx!I%X}O$Vx5DHk}f2fDfN@4r4C9tm)tz1RmyY8 z&693OiUg|%@AY563Xx=Gn)euQdJnk|I`y%KeHPDkHpS1{>*9T!CGm#Nlg?DTz{zya z+poAK_Q&okL{^P*?u(A`GGc$)rSZ>gms)J6V-LCQ>@07kz0|xwca#^!1N1Ljiy zTfPCoX}->ZTY{y&hx|4C?fkC!xG%}rZ7M3V!2Q_U>b&5-?e_LsxINs@jRo#!?nhMn z-hd6Lrf;}0(`sYXw7$Uevcv611>TNMJ156k;!cP@<{gVxIiq4Nobyf{qP`w?A2J5S zrueBA;h*4sYsM^YEA%tk?>}m!_`15I{a-tOSbgHH%>s8qyn(Sc{wWrL3}dHF)}njD z`QCaP56)@xH}fukg?Z6j;g6V(^^!T=T5B4{i{>zQK7CxW-3s?Pd#dwQ{BF0gljdYQ z_qd;VjqDx91@}5MtzYOG@w&Omde|tmwpjD1beeDat#`eH?uU52hVq@Yc0aGV)6#LA zr`>*3-d*j^HNG^T_Ci)|v#tLhbA~n9x4^o|=bB@!cg-zUF%cafn*r)m4x)x%8*i0e z>P&a1IN!S~oNMu8U1{ubuQsnY-yte)pxMvYfXI`%=F?Uia~A%URANB}8lSjloa?-) z?%S;Pf6hj47qNhQjrQJhBW8Z&^|1m}WNvK!PF2CR)-~q$)@U+iiF-AZysym^FBx0j z?PS9`&YRAQ#ON*c>Ns~pkL7qh-=w-pN28DRkhQ@`^6fVFS{;od9}yGQPA|(;C6Sk$ zKfJx}7fzx3yL+wk6%jSJPaQdNuoU_V$V%zXbkqmS=<>Sx!*5^Uk)8%=EG z-R@52{ndHfEwXdG6!(3%wb#e3i)FXB_kv0FMROy5r)zvI%s;IebOiZ}Sj#N)DdM-z z5c3(up5Kco%}3pd?t4yC!@>*ImOR?46$fMH_!=5N;)818Z)w~P&h8^G`gN-JQZo_n z?q=t#+lBhM4LqMc)|l>$^*Xx`c%#jx?r@@WKC`aGLO#~qXbrXAH)~r9%}HiH7U9Q; z|M|h{nk3~d`%?6 z%`O$3oCmPzwxnM1=gwlUi}M%pnD^jwu4UBsE;ny8MiLcNX&g3RqQltya3cfnT$kssIb?QFNB z`6#ljqxV1NDR-U#W(~2WFY>0i-SB5Nr;cgZn@QZnG4Ee`s?0X8Gn*RknEkLfZ=<_O zhVdg26A$qHF5YyY+`;{m?CnR4mChr0QR|yssdtR7L`{c|)&lRO*^9i$JIrUj3})|U zoO8b<#%8QL6<=s0JOk^!#qKh^(r==TOoE?CnaBRG-p^z~Q8gpWY(jidYvP77%o4W@ zDzd1KyWKs`vpi!8d1KFeQ}7@UHJVd#t+q9XihX~3{fVeu$GpltM!oL?L=9~B zIuLU(5zqSuVz7@9f$%vMp!Z{sz8YVzyw6wRo4yqv^Z>lur|DzUmbi@1snhxa9`s2@ z9jYjQ>-}rofkybfx6Ej5K8l2@phMwNA}1PCmAWZ@p@u}%e#*Bhy%p}gz~{k4yvdDZ z+5c>$5?#=qS?hW=%;v1;BPhEC^-=xAJMD2N8ut^2GQ+5ek3D330W{ts-k~0mS(Av6 zdXSogi_MPSb>`3b9$uh#`5LnWt3QXIJ?<@H-JcSBa}a<1Aj1MTU%Ial0g^=>WpUBl zR8e0~tkEoEySo;CA=Vs-+)td(e(IH9hW}xt_b~Axn}}CRXXf6^ z%q(Tj1w=lW#9E9+A0G)c_5!mXsDyhTQS@8f`OJSO(G_12+mMMIdf%Aoenhq&nJ!@R zL*VlYeVe+2H}#6kG`bVXzTOz(o;TLGhsfJMNvuT{GboF*9)6Mci86~oDea;8IYu5m zV{3USW_AAhmH41Ph}-XAT!Xjb4k*kfDr%Y6$@|ObgXB*)`V;X*zj~q{8nXM(iDei` z)Y+emRYg3S4aUdrI;w4SC9=Zj`KgyrzB=FjlL)^Ld47^u zw{~>1dXNg%SJQ!vK6dUmaM3$%Cu_M~MZJIv@bUm77k>H{noA`c;7KI@-&E$h2Ati4 zzsVzV?pjv=srQh1(zzE|@;uQ+bJ#^Ob^m|$+L-msmfpMOG5?X?c?KB#%5K!<%YYw!#H)+}|JM=K@|ID}+(TZ%OuSLQP`PG=`8{zOg+_a` z13tMEU~dLh9zKJcY({(@8ac~p{T^{vJ2?qvGT)EH_;tolHJd2F;hckeoPX`T_E6Go+<27xbH&q3kQqJO0pwg#9I^X zAJ1xA`z2?K&lAO9oNT(~FD_ z4~@2UR)vNHS0%Mi{V_N`)Q2i+YvXSG)7XQ~Y^S~RkoTD#h}>2=fnHJJf~vD`p1$>L z-}5=eSH^F&yQiLN{8`P8bt-CPXCBOWDx-mAMcm+-pq2Au{`~Z}GoQ~`o76B~RyE`7 z($k-py-oL*+D@kNWbmJ~xyiX+F!-Ta={;@)iDeia+#Rq2zxV^t&TwZ!*(b#_E?!PY z+TrIXo&L7q)P=&*b+J}Xf$?3v=jt5E8Cd@kOCpIq&6mZ&Z=BHR*Ip zk@Y}$d-4AY#-AA*U2LC^UqK{&XaBC?Fk@KxfvQ?$LR=sE!0HuzJH2Omhrp+9%h-VU z7xqI{Gs}imHp6RjuKeP~YtQ#T|75{}^YP**tG+kv;O$M{s?{uKWzMak6KU5b9k5Db z)iR8{*Q>krS|!)T(qHM`SMqhC@8Y(iPrQloig>B7tv?)C>*dDIlvvJo|5d)s;7s4p z)KJznNu9h4@fB2Sx`WQY)xt|+sX*tEk_Lsx&fjou=(#p$+ZIg>H}tRb^{w-4!z~%X z+^xZpN$rx-LL-dEsdj$58m~1toi&*_kFm~eW#OiXH~tkhUq<%TKZgn2;9rOy^aCA{5Sa~sag+1H1FR(KyIb&V&e*fy^ zJhPU)Ira$Nk*@BKu_exj&JEF-;pxSnT-biTdcoSW%`UV*cUkGG_&-#W9+y9`&Wou= z^+rjHQ}0jyC*_HxL)9Ly(jBs{58$H&7o8Z zTwC#teNT9-8%Qeff1g&Fd^+$%@NDpcGu%s#CE52GUC@Eo8nff;>}^%^OKvH8wAed$ z5DUe$q9uhBivEgj@NKuI*B@W4PsR(?%*^HKvr_L*J03b$Yh3j{*`HLO82~&AGU*{CLrt(n+!BDh|=1?V5VK^E&69&3-kbX~t7&@2345I++vCxVc)djDdkh!A)MT z=*i+~rDKb;D;h-mMlPr4$NRpa+>hRh9UVc6-Dh zjy-O_PqtNm=S=+R*kzF)D~Ff;T{^sIT}gh)h|(h^gT*?*?iPN|Xfb@IfVRVjaF&PXXE!YJKs9Vw;1*5=|(l_}vJF`FBgXPrlf*kvE0 z&idHcBUZ=Y0{MZdBhCA-V4_^jwqbGSL#x5~8LU_3weS-fj3g1KgGG|H`t&7fA>cU5c3W|n_O-O!&Zr-bK}zgiY8sj4_vwUHjJjq~oQ_eW+` zjU_3wbM8y=rP#)jq^ok`spYxb{U0QsNt#N9;fmt>D|{uN*q>JRan6|Qd`J9K-H+ox zM0VJ}P*-n~)5a-Jdo?&c^qtiRyTEMY>+sIVH1`VcL2Ln|-5-3TjH~R+!!s%xS9T2F zUV43Ht;$u=TCwk{{H5QNHZL0=4pdF!zV%$aryF<4{0f=-LAB442c{%B_a&9*-kmWq z@4WG4uqrs#XjbLFIHWAA#4w);H*_X>Db`|tiQPV8RlH;OiNEG#lfzb=@qOw&Nu|UT zw>Ca7ABxtAE_O4l!J(^tKRDg7l%9+&uN+tM6yD#uRVCq@!_%X=_VP$cS-AA&l83{y z!?zhf`kt%)TC2S|eR3NHk7Ycb`drc!<2T36dOa;xvs-AWnH~Iz{HS{_E-X&I(7^u8 zxytQhO?ICQEwn!Oa;oy9XJW5<_xaWu+mkz{UYQaKO!Y3F`cF!^`#m?%O~G zs*oLuwxUvV|FQ=wtA*Fc=epbCY0kz-mq`7psa5Byu8w{Z>17_uIL@iCHZvt{YaltT zR_Hi^5fv$I9kbT^p_M)DBFl^E!=!tu)g(MRr1 z?_ls?_4^w3fjW|`>RUd_~i9h5mu{ODfqHk5rtZEW{nEvE@-0|^xPV4A3866sZm)A7=KV!GO z$*q>rICXL83M18Ro^e-tcC{%cV_LQG{&KrUd}DBT%I~S8gTI;ip?Gj= zW=`58#ZjZs$~V2} z*{b^C*W*9CC%D=4q*B{DZzi^l2~->X(7D?^=)Fo0_F`^G4wdj;j2W{%f71nf5d8N%K{oKVyDQqwE*6YNjp;HV>Rj{wBFk`ikVclK%+) zLk`>R=B@7h$P-m>RhU%|#9pyexaE}5No|SU$tiU{B>M6}FNH2*zmmxn@bx!e_B{J? z`(*qpC&m5Q&7^nFG;aWXKXfDc6zg1T>piP0_0m6~XGaUGkXKf5PE94txZED?JZO)M zSH)_@9;OE0Q1=?I%FV%Q_J&(XJ{8#|zIMLP{Wbl6T0MMknYmVxc{!cnMwlavq1I$9 zh}HaGTcfO-%oMD7d#xO5JKo^iWu2qu+beWBTSvz3Y5P_Cf%u=X5wTmMvB>O5`^c)u z&G7a-yS~#Bd)aIDRAOXHogv&!+j_rR3sS5!GrJ=5rIeWeTeGqEB6eIebY~LH%L6~d zt5-V>$zoj{OOLIO%#ZeoePCDPW~)2eMEYC*>`ZrjCgeyJj{B=Wn?~1CpX1#ezsS}?~lD7-x9mqPIY$LGo5>##?EA? zweuQv_pW!QvY!Ri-CJio;=3udKIMj#Yf~E~eH0i-1lT;^t$``QtWcNWwf?cbmgWL4 z;^aEzaVwq_ZxFwSs*0zn`g{Wsac#ihEO(1n3oGPkVq3GQto12X`py%fdb3r6J?nbc zPt@=MDo_4tKW7h&k3|B$NI%KPBDEsV5CwRDY;o*dyf*Rf*;Y7tU1~66a^`(0)018f z)D4{Q-x~ZX6iEJ^{OA3?O~xDU!ni;7Rya9aJG?m3H@3^}Lykx;ecP^b-*PTEzq!MW zVdfC9ILX{XFPn0=72U*Il9z5fJDrivAm?Lemva;Gz%BS*J{b~I$Z6kh1gI|imUXA^ zG2%i}vF#tF+FTRr^qqHxxc!}8PO9^+{Q`M|Gvbl>$@rIcGv^WaeQX1T-mT`H-wK;Ot!J%Uv0_cd&T5m7RYU~pG%{em0D~VyGtU@TnX5g^Y(j=b zGPd7Oj3VO|Gsk+{EVb^o=Ac)7Z@uHo@r@^o;Yq8JH65$*95S(P@oKxHh@34Xig8b@ zNz9797X2vtbhLGJe)LGRAlAwL&i)@6{C(Zq+?(7{K<+Uwg~-PI^!wAC)a2wVf){)z zd;^G;dd+{G?H;BYm|EMw8JI7-IxrJQG z&e(Hq^N$Z)pLA!^_n~`(Py6rn&m`NU%Ku$poj(+42)oIW0%}C$8-sO!%@%}~(upc|kN@8iJ6Txj#88PB|?gZADWG=_He+~Wk zI^n^2%>04~;ORV@K;@qs=!V!A`{yBSgsId#_z~(GhD~S~w(*;YgwHqklMghIeuWE= zr~~PUghiF!+K(G`&875m`;t%oN0!eEM0P(5wNK&MRAQ=MG48}hb{TfCOzgNNWMsXH z{cSY8=~R{F8~WNW^KK!_aDp)a&%-41GxG-X3iEN!z7MgCuOj+C4f*>WHtv&*oQE&r z19FtQQggzOHMAerXM?r-v3dOhw6UKM&wbq8?q1^#aYwixIOpK#SDja!@0?CRa8 z)+wRB_-j-F_|5)9b!y!b=X0m7ljl6|Jm=ivthf8yx5p1rv%7DscdTdZlh~{Ao$+g( z@y_SaaH%_zoT&@en$+2;OVe9te3Rl!svkTZye@QIa9i+;K)Th3y48cdmz`O5vfVFs zKUJ&$io~Or#rN15%-)sQ>1N~)M$oRmfJcTC18z}ubdcGe8p}JenvUm2`Y@g0t0DW} zCxU*CcR6`seZBqkpsa^qYa&wWGy7h9j6KeN-j3MsI~|x4V9Pe*3WPK4Y#m zHy~Ye;kLN1WuQjzso?J5bHTTQI|AbZw*?OSNBbN5TlxOBD$Rc8KC11v@IH4v=NDj} z?{r0~yy4vJ-0jSCZgj49Iy)-k3NGEWH}TJa#bjrg^C&dY2c797XNI!}-(YRmaHH5s z=DI=T#YXI#c%O*Uj~EA8Lv8b3bEjF0^JOcwkGIhGmPkIUx;5BZLKM{*{E)NEn&5da zXVPM-&ptwy-Vfw1Tu+tNJHd2KvOafGL*y^KL?LRn+|D}AMs9fB4h4V#~>EI6IT6?jFsk5cDEG%eb(%1eM_wjACh8-b-?_Q z{<2q_7s+f^rOVs#%ZxzQopo0*>y_}~O=uzY$S9S)ye*!Weq;&Sehzz6Wz zJ%!%bZCVys{{_NfknO_HsjiO1#+>bALiUt&Ao@oDOi9Pr!MF43eMRH_>(pv-;}>= z;Dh>GPr}|gS_#e82DuAu#e`TD0jeh%6q~!MS~cLu1=>gX{(N+VpMm96W-SI+C&_aCja`(I_0WXu z%r4MoIhnJ2@FUkjPPXJnqg^Bu)@C$S6)Rz$BWN0`ai(f{DOANg%^1q1U6sgyU4r!g zn;BGbP_?h>F>Y6^{B6lq&!JjKee})d{J)vcy-dFC9K1B|@oZwEQt%93{gZu9MjHRY zJXQD<)cY@;4AB1gYU=};Jyc<$4g?vUoq@fwW|uK{gi|7nt^We++t0d`gPX}bJ|Y!b zfc-8|gldZAk%=D#ucCn*wBg!NiSnZt;vG5w1sw%4#rUdKx38R?En#F22&pn-Bd}S; zs}ZQa51H7bprWo&=~A$Cklmi=rx?%EN;1ONKs_rNYcFH&V}+~vdk2u&#u_VGK>?pV z&Ht+W8t1mylU3xhKJ_V9ohelr3*bXjj?OQ}dTXiSCqrc?+;fF@AAaOP+&?;zDLlv< zh3B&)Ir90ySPXtI1e%ut zi6;17N};h;;N%B>Z-bHy;B}S}PJ#I}a-US8&Idlq;L^L$80xbAbbK!(fX9{0uYX7J zVm2q^It4G-Fu3b(XsIu+R|l7M!CN2r(StHd8C@CHS*+0p^5?*J8h;%ELc4h{hBn)j zak5xr2>7S)4OJFT!}IC@ohtlBDNsZu&^iJ%ixc;oy5LpS?rQQ=7c8nuSxfTblc3+z zi9LOde`zid`48GI2Wv<1lO5r6E%0RH$wKqEo@YJTO-ndHbyHgaqwC4&b@|z~-{XWcCvVnBE@11h;$7svon+oqymt~jdC))u zU{ez>-d-r?96VUbN>4#E8`0s9C2CME!Q=W5@1JM>LwqKQofWd0vIOJ05<`?L#bJ72%@%$y8%|#;o$}Uzxal4?u zd3sp=QQQ_+-SS|r-rM$9}y+y%iHshy(?;NW!*~ovOke2R5pK z@Fm>wOrj3J3ykwNKKGZA`XBKB6y(##+_0ANSi(*=^Ekv91z=P4Y74=oI%%sit*YyZ z5>#cd8hL`5ye}w6ScPa!xK@?M2UQ!897Et;AFiwe zz2`8V>L29ulf+-DZ4pH>s&=mG3}^Dn2`Fk+@6Pd_r+3y}@^Puy{E?O&LRV zS5x7}^L(d}8IL6BauIsPYIeDdQ+FkJTF6d!@R@zU%x3K#^-h{H&XxF5@1k{c;H z2{jutfEs+cFbc7Y33WuO_)#NlmNO%wK#545uRP8NH1;0%NRi;-F< znC%oia{^d}p)3oy_*qp3vcDl*-2{7cTjY~!SGHva?vlt$Rf-;i+q>cq*@ zj(xXbR#hy{g8o&PLe)KK>;}Kf|E_v974Yp@sGOgm9Ej@XqJv(f~ z_%(p2;#*XEFv>m;B@fek(4( zjR|VfBr2fD2xpgz{;rz(DbPVXAl@8E^Z3v_arRaIks@V4q87s4N;3nD9| z%QbNSR^-4Q=DNVlCBQTp?s9pinwYBQ8esLc!HzmG4}^-kGgE!$ z>j@rI_gIymrH7UPl~TqigKm%TEP(8fAg^{Izlxdp0xOOXN0!Q}8nc>OK&B~>7Vm2h zEfa8(Tu|kH3(0$&(GK!ZMfW90lYOju4IICZNUF_n;%VTP$#|-unh7L5{7iTFlWBjyeM+sCN5CM*f#^RXb@Fr`rPb)h{{S=5ez9!Cb4EqW~GX zm)YWAGz^B5*=s)7%;3=wSk-3S7T~g0g3DFKSsM0HFn5w~sz%O!sC^?NtmpSO#*>zl zg%r?DAcs{p2A1uh?`Diwm(jDCCjzt%CDx~^=;|q;v*S{qi#@>fBA@U>OKFVI5-8^L zqbl&~8_|;2R6$v~XCdRL^7(dl^Dp}8??~t6>~aCW*FtBi5q+3X=xi=xZ?%A3FGf%m z?`Cjbw;Kzpys}FXo zGkzvNS^U+IpO!#Rnnw*@^@GC*pB7)K7VAMcc@NOr0JabC*v(@LXVwbNukC0PJHd`t zu8OlotX{V7wv5??hbn+K=cKv=nRO?+YcJ%AB>zoFr#|dWHImi;K(bvmQdQ~dD5Gyi zzxWy5V->pNCa|{;3~Xd?XLx5XGufV1$u4SSr>NI2wb&*g0tDV2YhvZD`V}y z^H|Ls>zL_MXO=zCfw=!7>)p$aFCt?kqg7+c<;)BMA!&a>_NN{bRO16f{W!ZWko4Fi%)c4#+YLm|Ld`nC)t{vTstG1& zKvKRIn5YR{>n9{l2RJ0e3POBJ(3RGk#kUH1m^||sX)ltig4aFZV)0rA<4P_zXMGW% zW&o8`AdTRpecpBfi04`OxzJ%SJWNcMHSLEC= z;Bzr?o=DRR@wvTFrEDc3D5^TJ5>JHrTlXE^?$TLX72JFX=nEdIkG=)yEK2CgTlxQY zIAk+1yi4Gf^{ly^btEyL^qXubOO>`WSyc$!s`|RPCka|opO5{lOgHWzlD>pnp>8X+ z*rSu6!6a{X>0DlF<0$z*f*xUF$|X8Z$~huuv`eLwr6AL{xEG z+QTY%?J#SU)k(FvF96L0&`$+4Qot@6K$)GH-A$}8%=*soj_$&`C+Y-rfmb6|+8!vW zzFsppqZeA$03ejkD}9;02KbI7B==v;w49$GxQ{JC*Zzt7n0lM6V)g^TOTAU9fyaJ~ z(gG>hDWL`2PQ?1XXlYlW&2#`BwZMjMHLY1$6)RD{f!$F54)zj(t8~t8119^R`RPcf ze~_~$z=fz^^{lmj=^xcux2o0MhR%BO>5c~sSH3s^tJz7|7=s`D*tkTgTpaPI>*J@s!;=k6-V}wAZNol_@ZcHDlFP2e$46MFPReRv{SI0e3Hvo7`eQCFdp;Qj;Soufj~uBzXkXPkpTUcGw`aq`XOyj#m& zWS=QZ$P-!C&OvPv?z*}cHG#VFz=kA`dRo;4Ivs#X3eWd~#ofTPG9j&P^9Ht3yN5P+Ne3Zp@)OukM4g zl}qRJ^KCsBZB;-in~@>v6r;Ws8yIOf>tDiJ)m1=xt1Q<#;dM_snxJ`g7EnK_B7Pr$ zj~X&#A0*)A;95F%J+RUbO1li%cscWF#j%7fp$@C5o`9LUmZ&>X4m%cXgRES-lx~TB z)_y%BHeeS9)YFH1Ok-9)l!rPc)n$|c?4>h*je?4+G2<2Bt_44;7ARYIChx1uS}tcv zC48!LtvPd)GpkMx**|5Y$OO0D7;OMhZv-ZK@vJ4Y%Yt(Tx{D-mwgJfe&S|=m{r`)c zJc(>;4VFU8b%eG1;S~}#d963ME@81AJMV>Dxf#pM7%*`?oS?iEM?=Khs6Gn z`-^OJA7VY8&M7gIIsS%5|ASI@GPb1FQY7O>Xi7TNQeIUzi3M2JW+lG)E+c%174C5~ z;h(U_-Gj&IdHhl@VwZat-^7!6OYXzg{0yI%h*$UnxIq0y)`IcVQ0NKxSyrH5v8>JJ z=M}!AZhXV>M~xwi=M~0$iFf~D=kxg1udGb8GK)|D#mV*$I_xw?n9uLO6H;j>tGozh zZGx6|v({bw$l|Kb5L;Qjy4>wxBx#CEdA1(T-vh;MVXP(CE@k=J#EPVys-Mh0DDenC z@^ECs=K(0cfbsT1eX<{fpqomhp=>zvF*w{+)fc4(6d^l-x}!vy^)TO*^+7jw>1KNP z;K2yI=`zYWB!=u;vcAi@(TPV##?a{-g&(Cg`oV5H#ta~X#D}T8X5cH!hVJV?0lGC+ z=YO4iiXu?g2`ay!mxxYfbGnRmDG#DH(xM%-7i9jLP>B2kxAPc>MW8NJ^gmAP;ZTvf zG-a@-^V~wyk)LtS!q!x%JWaUwkcXo=lp68KQ&~h>e+V-?`L9VdzJOciYGlMfYec~;FEAmTlnH~pgDkZvOlxs z!qh3Y67v%I!RkgNEJLca+L|5L153BFwn5y!o#bc1wQW#AoV) z3E8SI-M}Wf&7c`>>a#*FDrb6yp@M| z_5|N)1uVNWPc`)5O7u6;qqOfcQ20jVfCVj7XRMw;ts&0_0jsOnS#M@|Akl&HdSK9s zJ>AKw?*@BqksuXNgDmgatWAAFny~weXb%U#aWRrcS&`jX&Eu@E20vG_5_RFb3(RFA zQGC2xgUZgQ(1==swHmDbPB7D&`EMhBV*(JH!20h720elJFz{EO6<#_E!ccy7B)fFU z704CY*q6X}(jC;BCJ5|w|5x{v(Tw~M^InbSs7^_Bm|y-8KeNilot@Cm)M-f8ksADc z61n*md@O#K2T^{5)$qEsrE~DGde&uAx40NR=mfNRsaM`)k90CXASVLu20F(Ml;~8u9p8M zR&fGJC|{vVg=|$q7Eg8u)3xE58-d|<{JsJx_hXDo)}{`RIee}`LVr8Te0AXU3TQyL z#%(+n0MEaGqx4<%NYt!N_>BCgvcaXXws!2K1LsU#Ff2=>i+{BqYplokH^G1T>@6R- zZsXRrkrhhcpO0ju)+h7FoI41Hanv(gY|@ zXIl_Cm%;w)LSv_)JoQ|XC&rh6P7HS8s&JMgmRs^y$Sc^7wQH%ZJ&; zMrQe&5mc@JDD&xFwt>H9Bu>xYISc;;nGM zgXbnz7UB60R{1Y0I|Ky?Z)yCNzf=AuSrBA>kX})pyMsCyp5@g4oU>Qw)pqu?hu2O3 z$%VXQ0c-U?RiCH}oO(LZ_OXBEUakY?$I*;rXH)j3?sj@tnw2mp&*p#3cZMCt&~S7& z{4ent-ND6Gq8{N+KFo#8s2oC3ru@U|@T4Am?Gxvv{84#GGC$Ci??{rSHInWkBgsxK zyN&EbTGMi9d?_6MD>uT$XaqlTdaFwIav=H_uYb-wyMXK#=I8|lG-V$30M_YnGg4T6 z5e6bpu3$#_7vtc_;mlEn=huv>K8f?d&=RzrndE?f%~-p@FV@gTCr9lloPS;_T@QE#3;}_F|@onDs_}h9U!7gR2&-r8WE2y;@yR_oH)6u9BSfC|aq%2M9g_h1ZZTVj|IpJ#+tB~)x z46U|0pDY7Ty3@+*uD+ZVKuw;TBhbz^)|$##vfLcuJCeH6{?#F^7-;DZU7eBD(^2<) zakhH6sl(hBFuDLdpJm6g>+NDR`5t8VtYr16j3FyzG0&yB%NL-og}Qh7kX;wqjr_fb znCCRG+Qo`xn_q~=r#`#t@TdErYURt5uB>Er5kAg)#n{To2WPfpymF~qT2thZ>`{3M zEkYd=dVt#|ysFb)cHs@s#Zquau6u${_HfqBNmwJ*X=^h(`yM))!_M~ed?|84HrFaR zOSg`?$dGZICi0lbGuIT^tjhe-`cASs_3k{*T4lYmk=pV;WhAajZzOh9`*5c?hq zm2cvAey@dAk1+RHR+NHd)x9enNu|EsZTOyiRBbrV)qhoIk9zt^7Am$y@RL1Dx9|Ue z)?xPb1GKr8U5TrfFlQ0)5!F}mzIq5`12rEQl?ByhoK$FBw|Z$eec^|0P-bgrl$g`R z`|=m*uB)hv9l&`X>y~_1ca8PX=qgq&YrE)N9o%*!U(z{2&hecb;GfHhqwc}=64GB9 zwK}6^p_RyMm;&9YkDs*a9zeD}xNFAz=|DEj%<8(B%#IE6i&wFaebB|hgj{L@^%p?X z1@PczuvMJEgiiSeaFe_k7IWE&Q@t5*ly|^l&%K}rMG@&dJO+Qb>`BoKYuVjJX!sxY zk&4VrW0dB|wo8#ISE2!53(PJ@Y6ur~d0jpZS>437ibL9uq~8J-4t}=)V=LL z*0+jL7V~Ta@Rub-omgZoR1ZKSalT6D>Bby+;GsHLs13YjlTZiYI?Q|}P*pG4Gth;s zqVlQf99PeZLSUf|*wv6sC*eAiG0UOsG+@y?adOF`eG;yghe}qqI6p<;L3DN&+^ZjB z17IW1ro7&=ZK<<^d|654rjx}F#uUq7Gm8mj?c#fi`ZxoO)S{?;ez zuzq=iz4IdI@gH=y_N9nAbVBRSUPnC z%HUdApJW#e<3Gp%HkbS-g+N)fB@Od9`#i^as7N$L*~OT<8GEY3dYg0KcpRDTKvTKE zyMh^x5TB&(#S1v&7Qy543mt?$POu(D?(9H*)c~UT{HVW*EK&08$co++KJ3K17C6WP z{&~!r$>;|E`=JMMu)J>S2cMCk6Lo5i@~ULKES9?Q9tEQ=FbcEM=4jiJn?>wEUFhp1 zaMYRG$AAPC*M<9})usKv{b4^eEpP1seu|J}IziU4KHV*w0dIBtYz5u4XT3>4K89?U zKT0=ot++OPFUaaHm=EvQ=W{(+MNQt3Jy>xjikcAzA4O{E#6ASxv!U26%v}MD)Qh_s zD{9F1q!}odA`e+ukDV8Q6Lkcw$Lvu?5}(&$rULdG0kQ`;jTZxH`5Y9@QU$fI2a}Q> zm;5M_9;d*gAI!=>mx0u&5A`2s74mP$o~qlN?xd-_ex4cS0jS_R1nw?JJL-az>Vr1@0My=( zJ?Sdl8){Jwc(T67nLI@91vO zja4@SD!rh7*^9e?f&TEqcsS%%R??T*bpQ9DF~wym3hobXkMoeQ3mIEB^b5?VIvYB- z6fvY*P9_k#9LNiooshm)Fs^Q=ota6IPi3q~azi$~!>n1c4I7c&|A7x#gmgR9KO4NO zpNZma$8hhzmha0lF$6i@ABc2?mxnQv>?~nULfsd9@PYiz+n~rr*x}y88uu+4z?

  • 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

    D|Ye}7? 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

    s~b>MtUf+_(; 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 z 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 z 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�!I=qsQ86JXGvhSvsyegWT#n8nA=vV?FV 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�*+ccv*Oi+n15i@ne`dB>(Hr)~EKhK#(PHUOU~mh= z22^MSjXnKT7_4r65J1LN-+@wau!048P1QKr(0&gA27VUC6Qt_3N<4Y=^$e5RBe!U zU#N~i4^5pj%@KU2ayW+`=7A(W+|P1d2v=jK9kMIb3O*>L8x;PT7`}TMmlYd}^Bj^E zRXkL;{Kv=@(2>dDRV)ZQy4q2r@MX;)ItdH`>VNzGV|q{_3Y49qh|X~! z#bjl?5>;0RJOSM40t?Utai1xywO8%zfi8-UlFN-UB#9B^>Pa~B-X{y!vJio@mx1h~ zybsIY0aTVZ>i*9h@?MYoWQ2xi0dZMjxV3put5!%R_6;dsRvC?{U~kF7CRp5ziB4(@eOAJo7PE062#LWJ(4_v`+bR zl}hy!U^?_2CNgwWR)PYc9%~8N=>#)&%&+}B@U%u{_;0k}fwzVU<_~InanG(&4U&3x zakd6zN!dvRul#QZ_#Y8xf0u&Jps#7$k_N^=t z%UZCK-~|Pjnr~NJGP=ckbd!9suYLLb5U)w6$+y7N=v{9iy>D1+^oy))QfDgSMNa3D zb(>SK9aY*wmuVgsF)K-ElT!y=>9q`BtO1=9p%;#WF~@{{-%wXxS@>A(n^i(%^}58T zAZr|8LiSyjC$>SxpGdCdRzjrVnGsIy_V1u+iJ-okf_9m0-rLk}W^>?K(=Vl(-(;Y> z0Gt(Nb0sAkeZ){dXhrF}cMi*XZDV~2{;I>kXhOhM$&5(aAgp9Mgie7Ijgu0bkW);z zFE&BKAOk2CwurlQRs#ZBYlAnyAeBdeSjg%4HzU$y3j9l6kFr7FOr7G%kvX-xY=A3m zkX)@X25PxvYb=_%R#WU5^l*U)+>qt(BtgJ+9^xz9_O03K+N{1m!$Qgbx#*+rdfrM0gJK3Hn7s(?m2n!>QU>*Pf z6H)=J2g`o|w4y?Ct>y~eTm%(Ia-~WF7UGG(02P@+<-&b3=s86!Ver$`U_|k7RyzOy z2kiWxXdEOyoD(+SM#{;?FZm7XM15OMJsa|N=z)ATc(c)A5Y0jw^u!Z{b-)S_Zz=I|>@h%4 zx8c4qFirrNwAsA&jY5I;vY$5GXkptK0&mcSfHl+Gb+Q@K!{O(-PySIoL!$!PfJ;>Na@g)`I(^Y0J zcUio-YEG!waHHdJPzX7h&D>LMpla-1hCozhEuX-cFJ*4H5d2iQp<5xs9Q!PWh=i zW4X>EGh6#RY!f6)cWsr?BA2zX_}8opa|3{iVnEO$``fVF;lJ@llRg{VKandY~Klp)2w!pfPO(k59qHgXdTOwV*d1xSSF6aNmsJ^w=Q}-S8 z1-W-6g=R&C95t_29K*-;!jG2vJ^}L+KolJ%y^6D@bFCKZ^BQ;neS6z$I3?+>&>|r- zpghxcq-->zEa!LPK%3nigo+dkM+%q!X90Ml`gVia4d`+c#>&eGy|=kP8Qh`&|3VJ= ztuLn>*;3e4lG05g%(tv*++Xt!mk%Y}HlSyS#~LJ~rp^NUdYW_P5?(wufC{UK2Qku~ z@#~wOHsCq<8#$f-Y5}~Du3rJ8XUoN%!%Qtns4>~T3K3g5n?AwT=zshxt~>~eL0s-} z&vvU$ZS}0nb1zi{{#w&bxoeoANS0S_Gk8l(zXAd4@j7i5hLDd}t1%FX0LVG}i?$!U z_p8C^2LA*781K=#1c{h`*|#w<`V3$(uTYTuZHV>lIBeXCw1uW;UI8*%@j&wIu8PrQ z)aV1AQ9D-6X|2P>LGawn)}t+WD7QWV%HRC(ZcC?zBVZ;kEPn&wA>EI6uhzNmJkACA zBzS^L!&$%lgu<)iI^FY`Fi3%rOV+5biFu?q2C?&Q3-H6GDged61EfEY`XXt~p2Be# zqFq}!<$k>bEaIw*J#e#99l8%#boAuA^@|uYEhvec5lAU`TKd=*Lr+53 zxk&9s2_g@myjFo+V?oX+(ts2_;n(p}XWT1e_FUXi0=i@Bfr)&;0}X?nHm(J${Y43O zyP66wb`iL+^=Pl`adhY94l|fG)0RjkZJkb}GItB+nyH`A)qT(a$X|W$FcqUB{=%Sv z<+*purUl8T8>7LLj_eI-#9&Zb!w)j@sGs|_Xvwk>Ep;c9qtljZGl1oQ*0rQY2gj<9}6J-Eooso<5%>!yojSh%37{Z7*(0X zkuJ+$Ge;2Ssz_OOT}CHE{bzSAV(o45>o!Zv3AtRo1lFI5dVOtYJO&~|R)0=vog?JW znCiwzICc2!ahwjY6952G=gXXY$`T7H&{h}mJ(}{snMP3IsJAJ4LZnZK#3*pSQ31z8 zG6O9}a4R`v0O(m@PsPGV*Lg6|^fTN(Gp_pKyf8kDzB6_gQeVK6gL?hIAuC>h%Apr$ ztD5SpTgNTE#!m^C?x!>d4kl-^=I{#J?x5RV*4*iOCtGyACWA&!w{G)e?dW)>7>)JdyezsX~X+J zJoC0U^j4H0CqB42*$qEuafLVFzDaf)U7kBdCkv29%{B-FA<%==RP`TB_fB8kaVTHQ z0&3bIXjjA&`9-RJp?nOH&hdc7xvt`ywY_f9n$zmMgc-u z1@M=yP;c8ypvWpe{%e19${dS*htn!?uacI_ffU*^ff2FH@Ay_>5TLTnl75d)sM2LT znlC!15)zp}PN7%QIoDP=fC5Ggt{7`l90IW!$gDABCw=vFf>OyM0M+k2KLJ;9(uP2(&mY4*HPwWc(fDRL(BJ(ZAZkg>V3Z5Vdh9*> z78*SC2d6{AARSLNU#f=B*qaVHb83JSTDN>G02(5YzX+M zvc<@y4A3%&?T8N`b7n6hkI-?D!hO1WVxXTp7vu6OJ&lBI3EcqWqbLL-{nQ1i5PLNO z1)NCFLXRJt&WbBBiLGRu!|(7Ao7~_HWJaT&#k6K2Ze|vaq{Hihog($h**dCD$u8{! zR95-KWNMD=qSy9}3i@fR{Mh3J+n^07>=RXS1~zCZUx zA#aykV#&CwW{pN2l=|!tA3RApG%Lh+Y=-cUKfcpd;6(V_vl_GE0t{^Z>FuMIhC(Rc`I4wRlhpKhs^#+peJC zeQ(vuAI-2AFxHr^DJr+^xC!p)K*^cH*j`G5GygLMkeL^y8`q7HwunUU`AfhKi$tJ1 zZGb#KfkOGNfCO;8y-oqy03vmQytBl&Sn{?;ygbTJN$wsgn(D0@<|YPvVmyi#Z{=9q zwo=A%e~cOa?$`<|ByjQKfS3MHJEN6=1z<5hPAP)u?!k|1gjYxjp zn;m9}S_rAI+6vpkA$QBoTYh-LGp8%P57dZtVic%IZV}CK%jCjj%&piFlg*}xNU7ff zCPIt(SG3z#tl2d_kDALYYwZ$*`{1uwL?%rV_1JRD*$a4xCxNNz5GAZxgS?*jzW*E#DNC}*R zpd9Nc^16?us>H}7)4?v`Lpdm$l8+pC$C2rp`k$&N4+aMqpPWfZzb?rJ+Cp?NUJrKO znKG7piTo!^K;@cIH6c$_n%2N%DxRm37xdF`{N@C!VwfyLr+8a%*GTV6pt4jeal0Lb zF3Aqi(A|W4-L!>BwQZ;>Gh(RcX9gvm5Ir;RngwCF0Tke_2#hhZ{(8pX=3DFfxhfzq zoxMM79?em8P(UVm>l=1~R+f>rA^;R;4D)bM@}psYIDD#cT%ENwo_3zYgcn$AFGnx& zisHY>+HMQy1;GFQkJk*7Y<>kuf9IHa-Kq9-Y5E#@bm!EP3jTNq6)ZZ|#V3^&0)7m4 zC>I4Y4D7ENPjA4VCqXM95AgTYa;#eXO~plwbjPC?-f{uM>_>;2KcbTxSjdYH6B&3& z;jI?2q=$xjRAY7%D%W+n0Y>td;kx~Umid)nV}^ZeL*Q^Sgfn;^jMD<0kUa|Y(Pq1e zL+8)7+w<{Xf$*PHGSk`6F=;ZWKH=uqcUBwjW{WZQV(#(yHK(h}?36RKLPMQU!R3L- z@$pIf8;m|ZF{|}+OG0l^%_R`Ymb&ZCH1;8KkbcnPUPpEiyo4v1qc@G9x^F^lyrN4X zj)c(j)^f+O$;z&_7Kq2s9%#vMS2JDFlOFFYkf%CRiAbyG8q{AWH7kAiF;#EgK=VNO z4-k@iyP`!vdLBESLS&#?jxfoI_AkY_w@D`gFpc?b`vk)Az&nE5g=|YJ!D(@HItCJ^ zf&aI$p6p6vAJ>>9OZTQq@y&FKAgM4t#jgv=%tozh=Yo2&cUM9hz}{lQ<5!>T4X5_*LwtZYz9{ews7YRLVQn?hl@bC4MnY` zA?T^PIpvOu%)#5h+`Z86|EqY(UT+hnMt?OBh5}lFis|2R3sQht3{K7?WQm2V{mE7W z)e@&IpaEqFAqtdrmXO3msEA^-JFQOi!HPp%ty!&GHMa>A8Ao^9w~Ce4m_w@lIp4&xxHQj9AUj*jJ4H_NRWO*V9)*1U1EQ>oYR z-n!ms#$sC{PB7UF>f00$o##M>ux!DekxolYNhzc(w3cxg#3n(RwFO!cMGh_-yU+kg z*6gIK`7!|laV_~r@VBR@oR`WIVRV9PrHs`$1@WS0a6nO>9qS_b1|^shTq=9ef{qMe zmIbb_Adm_LddN)N2AYZx+^Z&(1vo9L&TvX=2+1YzM$ivteX3>z0CUeEvH$>rF^Cf> zFwfD$7dx;eDH!5kc`#fx!j(iqtPTZd^Wb=QC^3n8;A$r`)om)rV}1TH_GV&%>v8=Lwb3t;yUfmD)^y* ze|zTEx)&EIR`LPrTk(?k8hB`cHd5T3SstqTwyl{!vK{&%cT833A#`jto!8 zMG83$sdcQ0z9*c;IB)Jd^)OPW9v+ovoYYxp3SzDo70NON;7HZTNt4tRH;a()@USae z$N$E%A^AU#{Sc}^n3NTY$SK$W02V0$tP9J30L?zwCdG<&lL_8w2W>D`h^Xf|Lhh}Z z^^xiFxy^ZJh9TDTuN#3AxuxFSzS^`ln}%asi)g<~;jdI($T#$OzguN_R3a{37cW2~ z_@*x}N?vwl!yg-AWcO*xM=W)91CWSb=Eo@kJ9hX8{2b7_wv_v5`DPUB?K zarc4bE{YMtAdP76FMGv&$zv$=y2?W~60{MdGPPq5oJZZ{UUVaFg9FHT9;V50b+(0+%u=tF_=s`maEG4BMvBg=sIxPBG=K! zUo1W=M1HevSmJfyvXfdddTT%hp@k1HWoR-SX;K3 z#j;#0m4yuq%1k@(!BXS$4cD3pqvtyoI;t^=2O--JlgloiZNZ%d0@lbg;n*MfFVi$> zpZs?ol&F0>JW8MjD(=-G1$a?$^6`xo(~{6URw`%?EI$C zV%i@GK(aBW=-=dRvI&-GwL>QHYOC{uvKXseKU4_N-T)wbJ|7)32uAg4$4vPoKmRG> zg5WGjb^6vd8UeU58NRBdj@#;^>Pi+}*A~c^-TxXU#)9C7W?@EDAKQ+0U?(gnh02=3 z?#0~V%+{UcjWd>Mpyx!d6K;(nMNlq69?oz1NH5??og`xw=W9W4=6E4&hwS{{Oi7bEquC z{X&^xh!{38rvP4{J=`^_&;HR_yUt%K@3)L0y5$focKU4uY{wavmN0+xr*8l4v+vuF zx(|P|mZHR^EJvMgl^GxatMDG+CcgtXCOGZy4H08^nvN^UZXFy|v?8rXc!t~|mEZ3m zQNy_i9}{(Ed;rR2JIhi0o>OrG9m1TJhCCPT*hbyQQ6HM$`jIQ$wic&!_I`ykvyuX^ z1!98tGSRsao%;6w6hX)S-@$_-;3^yPVvk*;# z-N1vIh0F#|H_z_P<)14UbK@N$^v1f}O0h&b?DTe9*;o~xLdSsY?GGuLI?rY2q>c(P z);;kGQ+n3%3jlL9@c~)IlSapdrkUk(^}#6Dt%wJBV~MQ?r&h}V1+Ef$T&9{I2a@`% zL(=&<%T@FS=+Be@23G-_Eqn=+w%l-lECMAV=Eu`^$nBGn?bS%hE^)t(vhJ5sSDSu&8#XvcAyW{6V;IDvp} zT_^xhK(D{JCI8qVmnax3PA&(suK}c9Vn*zT%c%UGBd2zCq&%riI{i4>P+1OF*Zz8>}v!Q8?6Q+~A{a#|^Jj+R)%3Q$7I-`4B!25_n3Ysfp;?P@n~r&$ek(eo~G z`y!Fqd7_Eao}Aa!&q+{=ud$bJzEV93@#kUw@1CjuaT?w~I8v`=xErBSZrX27J2ndl zOOP~c{u5fGH7}h36WE1UI{{tbr!__i=b>}*$fC7xf}T$B=~x|_%$;zTXy1Eqn1kLQEo^R{p zmB01jV*5cvCN}+DP!YBA#H>#nTc9cxW7*iK5gFo8q}lmv-yt3GvH4rko*qiAp&gV- z)oh!OjzKE~4_1sq*>7lGLv6kPq`G;@0tXmQ(<59h>BdO~fBhppasD!cBq^8hBIk`x9;q{)fHuDfQ3?f-@!f zZ-%499Sd#e5e9SRlG*`JSfO&$6s_2QUXs^h0#(Ad1X3@xH01isvE>ADZ!#L8zzx~Ft|PBKJK*S5e2LV;K;b$ab#vNsZ=@P3jkLEkW!GAjyINia=8TF zw%)K$gQ#NV{|PiyF608-bsU^C3JE3PE=JmDQ*u+=l2R$Xn~E0VlFRwD3;KSLvg6|! zknVB9sy&XBC94~jg%}>TD)t9RypBq;P)SmSe(sG^$i}7jLc1T~4Phg!c9SEX#v7TQ09~osrlJ zmARYWqFBFs_N~Z6Az>SmsJN81rfHBJuIu1Q;VRbptE^Ih4{01JCyai`!tw2oOvd8D z<}zE$5Uz!Vocb6!VN(Xy*)Ed)hpNRWf>;YN*^$Z9k#>O*WKdy7SUtT^{$XRZt85d{ zV?E!oDC}+n)o`0$bbWr&9T|SmOn>PLo%!^d4*9lQc(blmw8!^~ag{Qq|_c2I=E}86rS}`F}xvP?_uE zM);nmio!bt^iufH=;z$gmJa3ZM!~ykyV@)s&f<9UWUk3NEdiMEtigjTiyzkC{qn=O z!uxQq4Au~b{;w01ym682OKc(YluNaOm z+CD*-a%@$x0a?{9iDXK#=Np>n8eYVIFkdPh)eKeFi^m@9XvizmMt^01zwN)XqxTNK zzRnkoP6r+E-H)NL3II~>cvbx^j5b!q{d7<$!F=XPq3gtI&RC+3;2uxr)@0C$FSff7 zd}qfKMJP-}PboiSW|u>y`Hvo2DR{b`CzIp<-GL!@B;fub!o^WF%)HF_I>^awPx~Ir zqh`RaC{y8(3Bj9}ikYfptoubM^pN0rwD;><_I~>v_5Jz(s6VFI4&P(%iH;f5VIU)E zbIBXSCuL>Fi$;KeiGW)#->s7@ZQRHdV`JtJJxXbM63)|B-+d<_22N!cjdw;gZZ{t{ z4*Z(~WdW0gM$=LII6M6LhcV*vf$k2&fG2=xEm=~)cwt}elS`f_v)NBMYfYZ*Q@+m$ zC;`3^k0faR6(0dYaqEj2ong~FMiC#?-J)%kqaZRYYFw=KPygT!QXKavk;()H&sF;B zs^lG%apOq+0JekYZ=+JT{DZi88BLlwV}@qRrqd>d<;&cU4w|db>Jo{nG4S*sSpj)> zjApBK?}-HRZN+|23fefF>Tc)lL?}%WDM^C`HY1d)62!vT{u-S$T{RX;g9i?)jf$X1LL?4 z<3)@sQY4bpabRKVWA^5ViU+uVN`KVSu?1@SHl#8?3wD15j?j5yrSOtyl#J5dAvfc3DIN|kpktBr|wKQxhKt768vDF8TL~m zT7F>vNc7eq|e-Q=L+C|~6+ZLsq zdazkAF2<|)M&1R`UWmFA42D6tEa|CZ;H(e~AR|f+uri3++U;wp`+j3{|KA1x@Y?iQ zar?v(gF0>mOLYXmnqyyEcR96I*|4Bjs(xY%`KPVS-3@zs#u+S##*ME7`Zy7QqD*xA z0`@g*2Orj12H52|o#1QFAxw`Ko6@#F?gO)3!E&e$C`e9s9H+O!y}bJM$5bR8TBBi! z`E(zadeuQhTb1MhcP)8%F#1-C6a#zfc;)4YVjrdQPiG*l^0Kj0P;MFF+=hyXN*W!= z^nk_YmoJBm$aDA>lG-q=(*Nft0b1sy&J}NqEr?SzBo}|3s=_uZKDw$e0PmbqKrUx+ z%x4w!{P!L4VcG;`)!25IFcpkaPODf|E9_aq_b~yuHU7qbcYS}zi+$*pW{{w(tPii?lMFE6__*wKGajF8990zhnJOi4E5;*7 z!!ljPl#Z#UXLRJ=LK%QAccL^7Wg)Xw}QT?7wpWCa`yZw-nJ1RpYi6S}eWKG0H-XkC}<=?~w z_mb-)1+DMJ3!WI@jNaAw{hC-7*9fk1tIgVRH(v>LXaKSByTODV z1|ht+sP-qy>Z|AB$c^LP;xHgmWw#cHuY6ag4C^n!mo^#9Bs5@nm&Ic0or5e4JGA@P zqBhpHv+loY^EB)T|C{%H$_@j}wGV%g3&Q^8F1J{cTX5}e-&d62GT_-dS26aQ z83Ip*EjG1>n|%Wru<(^eb#+7&%~);w!9nC4L6B0PYqLnrBMqs{IOzybH3)mcX{=lP zMoX_ljUa#sw8L;a-I~pXs4wjhn%hhAf|Nt0OUpC#2^lURBHC!x@q6kl`r#%w(Fr%j zA8`wRfI+HV)hHGEZgG4wAGRuUM*&q9royDS2AA?z@t+i8@OhkDH#YjIT?sg~GKY0J zfAp=-u5a#^2!F#778NvkBXTwp*?Lz*rtC=c%6K)WF|qcm1d`tj_4h5IMFqa&pepG0 zWZ7dgb4zzvJ8B}*oE`+2lF${7XO`|!*f_N1VV=;C4w_)ZoHYd@HP6|0S@R}fq(bHq z!IRa2R(^N%4iC+2UJ*FjO7Cg+&|A6id2K0pymj0kJ@uds0{VGg&&?SYAIVmuGqe*% zVD=kcd?Zlc^+`v@QpB|tdyWhuMeTn@mJ&Y6iSmMWmg#o}ifxbd%To@@)DsOf7BWN? zN!L78W5Vsg29?wZ}T znnnWcY}A%uK#$$)0ail(+O@nCuVRR>#@_o3e8wlK_HCYU!dS2^^x!zWsf6-&jVG!e zyb~UPw|kOVh6mTTlQsT-+LVOabRxjSPA1=y*!aco={uB|)zd6K$JQqRrurQ_fnVfa zp<)l^(^2h6)SvhDiX|jV;}!^g&3;0KBBu>5AAQgu&+$BZy-h1m+3YIYb8Ww;6|7@d z*5lQME30@U)#BO5t*OOp-4SY}Elgxmh>W8VfQoy+ADLBRi?b@&)z~yx70n#s)%*LR z?zF34z- zS!@9H#%rA9C%4qE_n;QN6SiE(fAQ+lD5XywD4_)woF0|)4+IcNs?d;za`BOnkNO8i!tLTBXakyg+Z+QU?M<}Uq)e6Dx=Pu`gMGDCgdx-62uxoXd_-pN0X_Lfd8AJl6xV_QzMN|P&l zCuAZ?c2c*|bH*G>q%CY@O9YC86P`1mW&<=z$vM4UwTW^7QYclh?@IxcWd0?+9Lz2? zKNg|pZj8X_kS38AYN#~byzSkHeCMK~rwi<9#jR?tJ34wQzceP4t_6&ss9RY72(ikY z00BU4j^cN|H?b7$faW7X-_Znsl7b#aVjo43fig96wNjiP1a7$wg$psDmM9mSLf0U{ z{WU<9RXo<%wOi%%2Zy1O1BW=rtHD7(J$jM$2@XY!@IfAO0O?jxAHq0-9ynjhquH+%(57gb>^G%??G30KZ-SV-+xeV zB`ye5Eqv@ZSDJI7>sj{E#lfk$VJ^|h5PAnH*g$-{w)b@Ng{Y$fca3n6C%JUb*xikN zvO#P9939{X=%R06=~vqCY;EROZFfV_@0J`-h|M(61ps+iWDDBj#m&?1tuIIJdJg%S zDIU?gj60(Zy`@G>aH&cos%CZe7x4{tZ+1AYfniNJa5H=F?%1X)% zRVGV3)KKkmd#>uVKk!Z=Y4SR2Bi2(=Jg@>=@O_#U4)srCLhZz%!fzU^Hb}jV zx{ZCrW{Ilk9;5dDrF%I3otvunwm!?v47$3_tgUHHS|82%&PnkWnh}ro>;4@-$MjHY zbr6g-1*-LhbpgSm1rhq%E3a70+?lJ(L&WQw(85{4+>tI-5VpaFRPxy|XVjU7;4#vU zlXu4vj&*#i=BiMqjyM(Mqre>SUT_dDF^3Ej2F9J#%}G$??gO_p}R8+`dOK9EDg0b=$8hoh>U6V&eFx z(zsKZaETj@e_EjtxBrQQ&ETVoF9+Oi4*fytkK}Br?~v?5fAKZX0yH;nJ=@$w888!; z&?ya{>zEPwG60``= z(NSO>)zW20$F8YW|7aKUO_Nl2n;QQ~NivdURG>GBUoDy2FW>?bW;3@iPIyqentp-e z$)XRso$SJ|Zr$N<$)-#^0>#8QnZ)P# zVs0)>n7xaeVVSo!YTp$Mj?X}^vlTS^c!>N7))XLCRP%1%7Gc7c?Q(FmatoPEDJJf- z!jkRAn~4*(8#!>KZxVZ5y;-Kkux?e)xtV@(?eKy(4eV|X`|bhb;s6b#94s;S2*}tu z)^HQ1x*ZyqsNb$}Aj=LdR##!nbmlFq{uYs}y$^4z9~8n~{Pd1eF9iUbXaj6rOyhg- zVV0juI%U`rja%bFOHC#Aq6^}y*HWMSXgs_G4sBNepMh@Be~!}M&jt6cuPHtlFqW9U zE`v8S5r(~kSrRt^Vj&^iJAmvMjh>tMj(^i27}mD2^I+&YXg_Zg}{N zKUJ)@fnty-4d#F`8My%j9W;`@C8(+bvbReJdbxlP7Kl83GmVrsejXgQZf#FrJ}MII zJ}Y_{G^Oj8u6gpu=H15IxE=$&V4+-dIvzI|MC#B0+pzyLn+lN{u*2W-xf$ zAe-PW^VUddEx?UrVv6{{x~cK7K1v(=;^RUuL>AWmmSU&c>6b)rcC%ltC)y^us^3fS z&Vv7DsgDi@)k=ovJIXJll7U%Fl63i-^bKqlWu65zKypf+$_%1QfG@R_M}cgj@G{Ff z)gVdEpC?9|vJ8N=IX(Blihd4G#g5l^2gKx2;I*U(!r<`a`^w4r@#Ns}(n%9+vnl(( zI5YjGD3GOiS|Iu(`&s`ta}8aMiK(ZcG6*5nA1%J9a?ltJF`7+L!O<$-)InY?maoz4 z3n%h&+eYNBg#p;q7jBYesNmXMxt4cmGjZjjmIJ%Q#!w=d4|P)0ufllvgu5XXa~{g$ zbbXZ;$QbvOK4~%}(=siZGs`H}bn%QVye)FV`AMccb4SULlP|d^ht!_asFYWHqHsGP z>5x%{KR}X{-@?9F9m_btn8dwkJMNHWQ)NT@RgZZdfBX&qn%Y6UO>1+KI*wf03DuZA ziW^)I=`%YR?fs<>{tiQN$M9;8zGyVlfAP_0Y!eF>l3KFJEF-tX^7Pgm_(JxF(8jWE zEwb8pbN@AD&{}jK1DY!>i2dZ9QwXfZ|Ha77cHn6P9%D6&S}KumX4rR1Uuy_Ask~Lk zV?MJW^l_7qb2TC6SW0*jax=JHIR0(d(LhIa1e4TAkm!}PcSh9t@Brf= z0eKYt#2Dox^jLf!VbezEA(>6%EnAtqMB8N@z^yV&{V(l%4Bx zdYcg#JF*>!`Njvy5g^T+cUUD>i@8g=nzuUniKonrJ|wazZaCUYTn3fOS`mHwMTrY9 z8v3NsGYAJ-+IA@{lFvidnfSMyey4Fv0&%oeCaSXO^#DI7sMNytPWydH-k1}ukh1oJ z=^DVE7AzC{EjNf#{1MeYt5GCNjgtpx_fh4m)vekQ0za%74R8T%Bq0iveYK8)V%Sio zL)&|VRe_a^?)}B6v^u67p9byPDgyn4*Iq-iwQZ&C2H{DrgA>A zm?Fr6dOxpfIS>|^c}aY+D8`I9!>QLr^PZAki)Gbh8oYHM1!yUi#n!c+k#XoDeH3Q`e} z2!{BgouC>~Dwm{e=ooGviZ|dnY>F_GI;02Nm0rW?`?w9o`Mr2-t^LaJ;NQe${>)_0 z249g8!tw4ILDen8aTE4Pgeg8ytr1v)SeC6w*ULjraYc&ogm#3?fRSX>;5C$-9Gr$G z+2D{y%B^uyZ#&FMXp#m@V|U4@S|;rkMO19fB3yS(EryXLwJ1#iAi5ldNbr@D`iI~C zJR`ZF03sEnJs}E|b*6}pRS{G$ZLz1llrMMci?mUC(B*i2Q`)Gbx1 zf=Zj-InbJBW~gTPMyOYv>o*Z3jk}~lfFJ_6vYVI(qVA@#++UChj~+;Cz%X>79t%*B zv_g>zAPE%$CqrcwiV~I%YueyTXa*p%d9C#Br-&0TK|_YD!BR{b8?NnfVFMTaEgt8oHo>HQX7?3*EVAn{+q>rlJWc z$c6lW=cX?Kx%R-YdI8@Nt|gmLQhNQ6rldr5D|ld9!7+UZumr7(Z}VTju7zPeG0HX`JXxJy&5NFWWW%a!e3__?>_VjmxnV*401S zAh9+}$L>Kw11K2nEFW~zAcFZHr&XP3dG;RAB3qJTgJU|k2?#TCX^bx25-D~A^%>0B zvgUP(^>uXoYc!nVY&4C!{U&W>_ezF_?BJ$>dDh~{3=c@6e?3o}*l5NjN^0Hs1ByT` zU*7k;;4atgS`_&N4!UWV4Ei3L^fM^axX zT^v_R$ocZyIH-r>HDi-FQF>R%I4RTt(hv4ZnG4l)xH8TZWjM3aTJ>`J9o|#RVWm{OtpgbOJ$Dh~%Pvk1fI3dg!qIrnR=X>l(%O5dhh zn*<2Bz!qhrl5Ti%v%0~SN3iW*8B5F^HM*OSN%zD8wvj}|EO`546t%HCUj?ZwhufO) z00J}2k?#}65In;)Q>QS^T$_KOLk_~S5Q6An-$%lNzgMr=R#P4Eo&ZQ1I1vO+rJ88! zjtF;~Snu#F^I6E$OkMisfzn2e2Tpy{ZBcFzsH2701y)+ChoPq6 z@itm69+Z~8t?hiIDp0lJA0Qal^r@nOzQl6cQqb1sO-aEMh2HE`g^nTw=7%lcitwwt z@UdHmi|h@O@A$6xV)?U9c3|8AVYZQI25ScKq?(o&tV^YYtK)jQtYJ)+WyIY2USe zhjs_Ahd8>k^Fjt%Ds$Q57{l~@r@_YO@)d8OTo~xlPU-*WnR_GOrh#Nt4vpt5{RbN9 zCci2fRH=0Urwf(23Y3~vKJt$QD!kZgKIDG8wDUFimQ0L+(WfgUcn_jIzeUBm4vB}% z@na<^QVX{weu=jmH}@(F#by99`+nses_D_MprQGIV`B=4g1d^X^M=;wcE!iWTL4;} z>YrE?B@xOjBv~nG-%)f7a(F>w=Q^W01i;|G^=MJObMkyY=H8HmWY)Ke7B$U`sub9I zjuwF+XA`(j!PbBj@Ynjq?%JVv?5r38J^GJL>&0MumWTRl9JP2_vh=441;b7GLimNZB_`BZ=3x1L2u4*HEw?L zv~1fv!(e%aa2eP{t!jnqkeDP{FYKeAy0LC~^ILdgjnCSnvIH^VRnH!yg218Qew&>w zUW$+>VZ3ROqUxcRaU8dDWKbPDNZhF09?6 zigb>~(r}r8s!%khK~mb{*h>|!Bv9IQlUjZv5MVr9ECv!xOh*|7Ab(@bR~<1T)6Av> zTn0HetgXfdk)pP1n6!CbEO0gkiLK{odqwTgUb&L50!|LouQR~vPA3fl=nu#?< z$Tk3~B{>o38>?=^VU?S-u6PNg@A8KJD+v1`?H`AtX`l7ARB4MOCr}+0AfpEBCe&6x^o#YhMMDT4nkH3Cx_yEQARYclYm)CczJ}7&nRu6?Nw$`VT zQB#9c0^Yxrg|_kcaei^&5X**#=cw z@89dE-@|m-!kuK*lo4c|KD&vH110UMc(TVA3h`$_y9!cr^uk;@3Z`;3RDv>Fc;TS> z3G$*?m?DR?eG&RAEZ9rg83OG*ufn*`Vpu*1ac;jUCldNn;^02sAckDnw&HZ}ra5N2 zbl4oiiCXeUST(}BmJSzb}x9`pV~1)c&TziCP2|~NNpk>$i!$Qm#5gD z^;x@tyH*2hhZ&gTbk|J*W5(XQ=VABOpqiPCt=!45{^bnH!tl@g<7StPaSpzdEr@A3 z@Y-V(g1GExb0@{Uvv~`P#^+Ec67C^;HjQ4}r6TKV!4xz6%!G?SQS9-p;wR`ApMRU0 z-FrpeaZC#myq|8Dy(&8JEOA)F~*{sNi|r; zUc|;feSs;8-1koZ{?wZ<33}AVlTA0e?Liv{zo6*g>X+Wf3-Z1HcJhRC55(OU!@);{`!KPkcB7GYGIf1u#D z*hi?B8iNa8!t>X{7qGL>LbGFVwtN7lv{a^OYGYe~+P(cC0(h1MNl3df!S!Mrc7uVa zo)4bm0yqOAw(;9{tS_8A$nWB#yxW-iHl5|)2T32oLwEoASccSZ#T7;Ii~Rnz`O~h5 zI4i8p?>Wz(q&qG)RWf(eywy-myw#dF_HeqxRO$NZniw=#fRK|~+y?->UTL9&c*dWu z;00<6PHW8KgK==lf0JRyoJ5ki&G9*ahyf>&+w9;aQ1*` zX;uaHi%d`3yN{1aWV!3m)I>xEwc3{S`S@ zf%2rSJ2m9=h`!~eOL6?*|9u1S?E8)kQeF`V!(=*2IL}{v8NP9_v0PYQi|G;)J6}^o zQ+yE|F&yRaOyTACY|LzFT!t%Cqu5{VQRLAtK8^Vd9xZ%$#XF-~5r6)@84#p^ayp;8 z9MT1U{awX=@*5K>Nt>%Bw;oEB{hfZ+4HcU4|f7h#)Cz(7El7{;9mJI;b$8jWwwD~pmlID>m~~ZeaI|e44WkmT8Qp(omL^$D zo!TEog(5$($Ex7l7AxWmK3v0eL|$hfO3i#>bsox}ae8;?dqKabfWL~iJjxXMAJ#A2 zG)6WDWg07+mkwD!w)}i^B4qL$ycc1uW(KTN^2*tul!zUUc7Uvo z4OA@zJS&Tn@0@WZ-AR23Ar3Z@IFZ($szamw?>Hn`AEGq1-74wdy5_kMAr%gJqrAlp zx!d>;C2W;rL_?Qo@ufCD)+er}-_-#AmnkfUlQ9jHc&Ik;uj&<~xdKQ@88s48_W;6^ zRjPU9kV^f+yj`LhZPt~T>NhU1n+j10&Eqx}kt)x-qGC;K7{v77QDoo*wCm&B>N0LK zoA4o&wHSBz^DOaivcxU1x?S;?LjUzLg4usYq5QT(>QNWCcel#16IQ z0qGE=$gZ^eTGQ;46q&KXLg5Kb%6fTl*GLbb5rO}j4a#zxw<3ObQmf)*sfb^u`O&`4 z_K(8+S?UI_h||Ig{;s|r@SHrB{MK53hTv)c4?{(%mm#U^S`GO6_F-p??i|h`%PvLQ zV4g(8B9OVF`<;gWUd&rdnjm~m10ZnjaQ}~h)utGQK9=5;ciWx%g~a)GFZ9%8`XpI5 z+-8p`g$W7cW|86L8|l*tub3j?$Y{;gWX(83VCZTPj0MeZzL0b^Oz;lWzRTc-2gtRM z{52!0@Y2Q7c4{}Rs_gpeW!l%|7Gzj;0wv;z&!e#os}GnFpY9VbFkW)&Rl7^?4neza zA20~g(mQKF*tVQWBeP+sPeIB_31C+y*DD!6naW~M$^x@9Ikq3(=qK7LoVE2{rp_>_ z)cY>aqyj{38lYrf{^wE-1^Da{M^#vEvX&-)q*MnKt#bj13d|e$jCbWf-3t!F6_W$I zc*zIX=*fFZ2558+!CK{@BlO@u@wbn!qiMBJRs2Il2g`=(rA$tis+fCv#yy^(f@X?7 z6voOusm%6iiSc3~W@3mFT;tDpGJW{VClx7L)k!{gTpWwIF%g~V(wrx+!R7FzIi?5G zDUPX#Bg`ql0_XiE3_*y4kpScOSLuR2$aglo{w`yzvzFOh_xUKitdcArA)s!rw@0YF z!d_l|mYZxL9fI)o2U_g);h?2S6T&WPna>0*xFuNw+*=4DdKv%Ct1>yk7ZuH( zD^3pANVfA1#tn(b?NMj43%tbIC?wl*8cquH;m*LKj^N35%S}1x)qx9wNXW4 zLH?5grKKk`V`najxc~q9r(gc6=nTS@Dz4$=rxx>*)nfT&RlhjZPi5r)D*{9u4A$wM zETCUKv}*UE(N*&G{3-Zbr>0(7%fyS?CkunrKBxmYM98l865W`CmfhfzhAcgy-?(_x zzNoqqfk?TQUCiLadMkb0+ry$|g_22h{VD?;EQ)JMELLGXAgaysA^(MwbuKMvqgT`j zzK>GvOz$kgV&C9U(oH%Bs{a*nFRB7LNAr_WWujcGu`r2zxqOUlx?D@=%v9>c#uTxe zdWo;E@o7v+VOSmla@Z^IX>V?C*qR>P{Vu<-2VUUdBOk(NVPQpx z^-w@!%1OC;BU6wAXgNq7&P1IZvE>+}^1bAnm;LmcmKC*$6L{s|RXTJ+y!^06 zQvx>qlO6qUrXFceG>PuNrhz@hl?GKHm^7u44SvHezd|BikBVU$Qv+;_AqH`V11O93 zJgPXP_sgk97n|z)7+srWG2d*&Qp>46wrSNd> zn>yhS4`>zK+=Z6hy9{L*IS~8b*Dh$j)zkUy`h9uAYzK`>ag?DAC>K5vYxMjak-GtQ zBneduu+$Rg)pnv zsfJ}fa~`2@XvM<8Debxxei9l}15NDw<>;3q4rrklfa_-JR04qfrUeW(GgE|9^ z9R1m(G679%3%OF?xFSjzZkRI$np{GC46FKLOXRYy4>JR5Pu3Werjt6=*& z>8ba&AlMH{F!c_Shf1DIJ)jQq0OqBEb3bwn z)3fJlm$mca24w(9OTh`1W&|Cs$-oT0UfVJ%xzsyW=pJ{E1Tg{D21b<*qW<2)$^j60 znhHio{`6%FlR@()U-qgXvwbt3BsFqgDVK%!K4$t3`1yf{hXIccJhP1cm;w%)vGOnN zE*xdYyeUWB!&PeEWajmg9IjgdB`!WzU-=yz%ItD%Pek>ah5%B>9*HW6S-C*S9+tR8 z3T{}DW{LMay~%(S%ksNJPJ3iJHG!y)X{YyEar67@KBDW$Sqr?O+RIUl-13GvBV6)v zbnwL=_Cgr}e+O0h9~a9Tr~Z?>V{Zx`=%g`M!r`VJAI2U})>Wc}v+rih|9 z!}zRHc13)Qt_|N|(!g(~lbku7FxqwiQ5vWM$VWMFHm_KA!z5%OfaGx@sQm1U2Nm9h z`Sq;S5ZiL@;@%Dx3rQO`3o4rqd$%KQR5|wxn+agTzcd!|e)|EgAHdhw?#o)AQJdcy ze@NM-oa4r!v;8$7mm!YLGj~_t1FO=MFplG?MN!!B(5FY*fQQhap8;{|y`TU90{{R6 z01LVxAqtd@t_F>eq6Eo=bEffSp0NU2EaR(xKquyjAS+WWfMdbnZb`L|NO?XA zOF9)Q4&Yd|r619;4Xr7o<%(4FR=YGt2~3^QUktHlD-U`F-}5psTMBu)x^%Q&j#!z& zv(Xz8uaiDkIPFXUaM#Sx7Ql8}ssk`v?{!bNxn2Pxg44~t zMG0*Qe56x85IOEYvv$W2&50;umoaCF1SMBC;tG}d`qV>8I-+5pX9a*d_(rwi0>hy% z8zf)59Od2LLT~yz87%7>NfZpCM~j`Y^7QkCQB*nx;#uU^uBB;YR+V=pgV)&z17#N2 z=kTQiL+%-dbH9L+6_bS@IF8aba2LA)v6>B{Coq0C473Jtup>P12RQ!TEcb9c)zQ|? zqYO;xW&Eqn%W=*fdqgZ*dMDTF8iN&7Iw~x-?VNl6%HQ8FxdRPBeVmm~PGB7w+>jMB z_TinBa+s}#F<;M{t z*&2mt7{*Mq)-(uy7%qM1iS%HM1#`)w+2I%D5OG%Ur|5rIcAv1 zsCm{fNPiVd5!0TzrBTP;ME1m&0%OPmdOAFi%HB&?^10Cf8;A&Gx)1h(G9EmN-sESz z2z0SAC(@_>J-pOBl1pX`1BdLOZDBq0d8jV>&HM%p&TD=earMXJaERKD}2$ zyriL~6>e-$sXbgTx0kOdgOBo7jBFLk$C^LH`wV5a30Uq><>D_UGQr}r&9$(M?(+JV zOgF3XfA8UkZPpQLnRDQ_E}%1e^m*~5!ojp${b7RXT0jlD=-E#{>vU>=%AwY6d~!VKld&hBfnCi?OuAf`Aq(^K~NMq9V? zLju}Z&L0aWOs`4gh?0T+XkYWkW@U0TL1kRc z_94dG2Rnklacb8)fMx#W6ZJYDQl0S%UQls=KipTrbL! zEbLu0quc4yOib{lqh2kd_2jSrh7)&Mt$vW%fj zd(zxsjHTQ(@yn&E(zb240gi2rQ*8~0&AYu^2+{MlD0XG^^nBD$MH$goL+$-S1TyTl zvSCDr$XSeAwJ_Qhhn#DMB!U=j1RsE{cJ(JhtrFh+s9=ZAv!x$~TOjCQCx^G#NM+x{ zK5gkp93WVuWf9hn6Ik?OWN)u+bxz#YrVmTGwg4%RftVR+mgoX01lpMTQMucx?C|?z z-5(gV10RMXgw4m)25Sx$0-GceCOFmJ96cuOSpR`9vEMFgFH#1#T^E6?6wu4n;2jhg zA$%%A$Cnz)uKJ#czP|61eyFLrUa=K=<79`o7PW6_NyIj2FbnB^R(O-c=bf%1XX@2R zc9h5U@DH!0EnRi0)egnjmQ&{I-YvLyOa4{khknI|`~?S69IkM7Nq5GV?s@z|*+Yeq z8wuM=l9Mfok5pGSeP5=i=>80}9$AB>oc!-^M1?CuA5!h4SoA?0fHX$0rPT&bUTHtF zif&^AKBeEOl`MQ1t{cPnOjkitwc&c>h9*&b7*oowozju|iKQOxKk#bt5{Nt^j4!Y1 zco~nD*<>idNaP_}6%wlPug@I3H9Vl<09g}qV+dk|;4i?1G^4N`GYEy9{@W2Pc5@Z? z#*H#2A+%5oR(YAwaO0~6hue+I^wab1`?@@F*$#UwVa_Vyuy7-tj8G2Iyz$|h48XC1J8{$W6pZ6&xX^aV$_D8oyFY}`P2pxEQ<+$&`@ zMb-exAh;I19TM8_C&=nlq3cs^NwU=fi5jFWZa;`(IHv52klFA_O% zY1qN>2>{kPlue9fRzvjvN6VhOCq{YI{bQsyAt^47`J=8Atf%ZWrh5`cpz#PAHARNp z!rPcu7CR>U&bjI^yC`BqM2a`cTJOX0ypx5o)aT9|ks8fi_Lk&_dtNu0r`wg_07mcJ zkW}yf{?klZLJt`pNE44aG@+)}Bbl6$qymWeevnE&&(_y>RX6xaJo1XJn$k({`;7C7 z*kH$7`!@NDU;l^1rQR1kjmb~iY{L&M_AY^94006gpi~m3Xn(Tu9w6}NdLeC`!wj|K zclG<VH`@P zz-p3a5{r!dohGeyKa0w+j`+})1|sTxIV|aWFW@>`+%)KWv00m}AuPmJZjT0bVlPTZrgqtx{b8Xh4_09^hGMIk~Tr zIqh22(~C%}Jo?MVYmKt^dQM_=D@>(2poj@aZIl`)(%%C?Eg#|fXF){<38A_h?S}m8 zV)C_dzzeb5(_sf{BZUKtT@D4)*saAO4=d$~3$N+HCpW~gUns1B9RGWF6^VQn4Wa5J z`0b5W&%Lin0$UYEKrvaG;FULBa-mL`P|+cFrOK@}$ct#J2yyYZSUEt?qpty>CO5q~X^OZ$nQ~x*5tII50swaH8sx!PoXv*DjB=FFiR;#aYE5xnCubrf`HBYe<|o z(qi0b^A+)V?QrNQ6Lm(;O0sgFEwtDy31%*My~5-xvWBD@7KBL3s}Kt>(5D`rd|T5O zi|h2nW<+`1ZCQzYHF>4f9_7aTExQhS2j>^#((^Z6j4v4d`G9XHYQ$qVoW93~H)U1R6%s7*s+Uf&{3PEQywt#NdhecCWvSxrP zrZg&`IM9z#=GwO;?dxFAtv;I#TM8~uj1F(`cg=G|#8oEqkcJG$kb2b-5_G{-+%k}U zeG-&hP+W0`Q;d(dIN}riAf}*9^E2Rso$ZC7*KWHXMa3iPvpblfiMmh`AB17G`0M+B zgj3N#OUE`wVNDn4Z4vm3qhN(fgHdTNRJX{>+=lxUS!6`)Y)lX?W*h#_K2s-+F^1kt z^j8#ca6U@Dy2tG$O>yLB@>MTYJ8u-#)NdCLLl!6>VGVX0mT-4$!*h56)lA!?yx|5I zl2g**thqfNE-+^bYfk=#3d}#KyNY$Q7GGwv2J5uD12ao7*T&`I2~pD37i^x=T8tqi17W|zmJ+}y+fIf7 zUSm!xYMg}s%XWXYaUtpH;y>_-wjP52CH<5qLy(j$E4TEG&V$sS8G`1w2x_Da#)OQH zN$A79=Aqv|byNZAY9vk)u7lXTA3Jh5%@I~O^P1b|U&Gq_@p-4Uv#_#M5^&3BdJI$r zJ9Nb#9$i*k5F>17$&Q=F!ko@Z@I(w}hWrSJeUUntt4Pbpa9`<(+~szVf6mCo1Q@@V zDl(B`?QVjK>Nl*in+aVO`$?<}Uj6n|n;V^~8J95i4@^ryDyWn!_}>5-eo_#adz31i zJlgeggTOX~pHQ%Dfh%CHt*Z#vBmD2BdSZZ@VH0Pe0H!s0+BNwVlzjg20TWNckOQJ; zuraNxl_T^TbRSBGaNk#fF6&_x4phoRs$uC05xfYm?K2SCqtSqTIt)vvhcfv$%G3tB zSWHsH#ZEj3QXd>?{3khHIMUmx=sjHZWKk>5BHfT_w28O@K;lDcp>x8qa(ch_c!^7R znb(9RJC5FbjWq9@07)1)&zLSc)gR1A%vDc=GP50bi}a}u@Fpr3*0AzV$oz|h4GA9s?Iv3UCjzD#yDAVq9^k2;F7zLj zA92Az4bl-f-4>OD zlcl)!;%fMo0Q3|zG98A#V`M61AWz8bSKv+)`XHkBM3drKfT8d>V zpWp#*5Z}}ADPW!C%YUZ<&{fagjCdPd`4WW=(;k<<>C>^+$w{$FG$7>^FjRgDKO&K( zKDb7*u8M@rdStJ6E3Vpi{W&y)l@j)vTHgf;*jdpIe`)>O+9R8q;k&cFc>i=4V9u;T zsiV71`-H}?G0#C27g>)n1TD9^WRf$7Qtkq8XHSIr6U^ddH9UcBRJ_|MPOa?W_h}tn z{;v>TUi}ylA~(gORpIBM&>@s;CwFGB?@1mZSahpE?t2D!{uTV$YJR`DF9>?dm zpB-*l$OeTHB=1mIq?8%F;5iVGC+(O@IJMiaRwrAA*F4x1sqIcVCz=qP0WH#@XC?0m z(pD=$oz~=n!_zP?94=eT(P_Dx=kpkk5kLhK{hQJb(nea*qSIuk4&5&UWf&%b2oJe> zZX2D(lh^92n;`pwQ2A`Q)^SYdq_25ffW55P*kNw-t#!B2T|ir?+a$S`C1q;1F>l#x z4c@(0Iab3yOmrU(bEqw8Fi<`to#Un2Sw^clmWFo~5XQ=eY4MVZg6Z6xwGA%-nix>o; zE9v!JHr>$5H;@~CLyX`LHKH^(@N-%-glhgK%0x4>5*V3o)6J4~OJ%dt9K5GwR3kKn z4yp8BM!dN!$lcS9tbh%0iC} zZw9207P1A&Yg-u-!Xp|NRP&pP=B&0WiYlEJylAiiu@tKY?P5TcGDSZnNG*ffvVRs_ zhbp@qs`UG*F^!>pJl84a5IR!TmWq;IK1_csqRxH_?6RN~Gf5Vk|46`|AL<8KL(13f zt~r_m3Z^p z+&*jU4<#nN=_dWc6CL55sWz`{QI9WrTsM2Oesw|KijmBIyLni>H*QV9D~yIbRK_23 znPQoXiPgNw&+})3Rzbd-c7>y+2S>?}v6FauP1oLh$nSPg%WJB$x8q?a$7_+rOw;e~ zrFr_2o#)zY@cB+NM)qRU=;=%gxBPji+60}VjE*rOMB>U-QCr34peb!2)BtKYWgi|= z$ce$m;5I4jH!Rou(P;+9A8c`iZ#C)To@X5XrU~kLXpp5NL4tdT#B-{4MlOhT$9go- z419A3q&RNwlkp(Cdhkj1YSDd}32aGy2jdhGU^DX=rwM%ua9YtuZ)w*e5Me^>y7fYq z8DZD8yC0I$9MxR2yJ9OGO_n`Fff{@H1Uq^wa@zP_#B%0apWqXUlI#FRVPpi)000Y) zA@+JCe*go2MKXTmSNrRKE%31{Z{KPlJm{~6igxn=dW_7BcX+{627Wem#vwli4}30%6TnDmAW_P|v5zc8=(};@RGNL}n z;W9!HJAi8OSj_#UMZus0b*;-kL*O~T3fS(wvGXrs;c)<_ zA}>I(P>sN5mjwrE#~vyok*4jBkNSJ53?7o|*Ulo)g*~Uqc^dN3ivwTvc>6@1gNKUc zNQPf<3}LeZ0?(b51dH`VUoq5IG)`vWxi+3B;Qnx*l6ClGcQoYw;#BQ}9}>%cZYA`Wfe_l7!j zfCDHzC2#7ZW~P`vaK@A(^U;Mc;5ta`s}0P2E;_fhhLG8kXrWnhbG;!v41XQ_V8s38 z`FqncvJV+T+MMj!bjEs;z31`seu2P$iME5pm&N z;~V!dZz6{C&}dFtb-|nID77pJgl9)8J&F7`Ycl>zgZ$iG z%Y(c@?58cXDG5u?yU*hLTkOzt(Sna{IixCdXFtfbU7&sB)KJ&<9$|bNXA@y7{VIS* z@}1i?cCTobxo#(X+&_n+6c`Cu)BO_TX_z^nf92gV5N>|);#f==l26`+MTAN-;<(F; z2Rqo4toLEA3>SoiO`_~R4|67>+16?uaF=s67FKa_6R7v5W&|Q>KNqp4hpp5aw)e`> z98oc>nuZH_WPL^xC)8Aq^EHuC+Y+6S{`2NXcU9eQ=D_9c&X~2>c53E+w9ff@ggb-xO)A>dEC+bp=1UdVil5RnJ zfCl>CMnQQ#$?yC$jmcBnh!g>{$^^l=#kT*Zn%Su$g0S;rI2abiY`)m}!X^Qrma+WdPC@;Z z1gVCrF_kJQd6SvttF3^=NgD{^KgJG7qS?cd<@vaL4j2iI@;Vgw|+8~eCOLK-EhX|_KY*z zQ4XyoQG@fu*^aA{dH)>ic|?QCh!old6WG#|3^7+sF!w@}joh<}&(0SEw|nKRaMdDe zoWqm|rqzk^{YJ-z|6!_2YYTPVPO-e#3Ah=EiWO7uWa=$|@tkL&#b20j!c&e_4icd8 zTlLYJhU5Il^A*|bvf^5!`QU~@ctb(X%5^{&Et~;QnFw%}YX7B-@mOCiZCgwi^+rt$ zZ(Tfgm*UfT*XfPupW={akbHqGasxd@egyH!s@0U5`Bo_td`My z&i`azEHOSUhRIve!$apVW55fcpNuVb34eT^Idtlj%owWy8Z|M*g}hturVL-l9ymj+ z75&sh!g&9U>V9LsR2b)t4LtI_rFTH5OG(htgN#%e=V_Nhc%6gQ8bfL{$*%F}qZGb{ z3tpU&zc9vQ?dliF@mGc7fqs^+-kG}u$A2bXgVY-=H;hYWBpgQS6HEc-Ca`Nm(g_;W zrRlewX4)3NgGWL|QK`LxBTy#E=_SeG-QG?z4%MF%$ZFQxrOU0Yro}P7INb-xCYFOg3ol5nNk}k zHiv@jyJaWtrkKkg&SK^k8dJ?{%0r`*uwCJTuPnHF)d75Yx$030_}Vl82ptgRytY5Z z;SBjY{8Q#Jxk+_1+UcCP?YqI-a7SanCDD=|d8Cp& zVal*DiW(|~_G3W67b<9TB24SgHY9UL74s*mHk}Ya<(A4N=iR$OZ;5pwwu{*w)v$DT!{qC3%m#|+(>`N2EM!G~B;04`lk(}D14FiX_VA{4|W6{y6I z>F@uiSZMxlOaLhYKDcb9!kE@j$X_aP50{5V`RG9fI%1bOz>iy4PZi z>F)64=j$fTb9jrBbY82QM^&KO$xu#}{~2qX(ydP-OUkHfS=g_D0$pr)CTXEZyn96M zW+s<5W8M#e%dci7b40ae$4ZiJri}p}6Zk9$|63k#_6#ea24NNDa|lI)_+n49pkVao zvqi;4>t+Z;1f;*ZVh@eQ$@<4eU;=1-wg)i~$?Xw{*zgkQ^jIn$(MGjt%BpuRTiOvs z&0Fm;_ZXZSk09#wVez6Qii)U7YW4V(QsDrVC9Sj0fz5#)%;uaXdyoESRmI>8f+?c? zOYDjN21U8pyXfd*Asf^imkIQ$LaGq z(hwJcuq}uc1P)Sn9WXrYtr_$95~{TKkruM9CD(#sHl`@U_ZACisVnuZAu;S(})uWviOyLgmm9STT{nMTaN60!V-){f!Vrlc2%m z(2u>2WG6;p!1q2@+r|GPyZ|g{JP%Hj6D!j~{-BR9fO)m0CPDc?RjKXOMvzdR&&};) z72Y<;nkqdDsY01ztB&#@2jy=u2{=lD(k)K@WC7Fa(w4u}gMx-7f>!B;@M(4m%Du;) z75hF>f&aXr(_VvXCKHa0Oaso3?HM~n*3W8V6HBtRZhF+{|6Kn4Y`wd17~uc9)JDEl z@uur9!>eGO>6gh-S|~8A-gSV{>)zmk9wyMl57OEg`6BDzE7M+->SZG&iz0 zf+cucj}prd>CAl8gX*c-eg8iAdPmYs3ZrqkIg~!;>KJ{x@SFJ;(V;&6b&0Itv;!UH zx8mci4YsFCv$>d)x2u=WR}U#VuL{4?`-z&>Jv>kUW#t|Fo&@;&Y;@9@5Hz$7;iNDZ zj*gvDhmxx#(TT%C=ZJT6oPR~tyqlTJG8@!2t8#ZRjs*lh03S!AROy9zgJ6}rLw)0> z5z>;cez3gehK6wEyY)fgM7Mo!qR!VhN^-E`3mISmk$?aJasU7W00094A5b9*l%=hb zhH(+h;~i5K-uM+@HohzkNC-@tO_hmvMkv~-S=z31X{S}kJ{KU43pc?cGu)2owkI6; zJg3I~=yI-0`lOh#D?-tDsF0bUV!TLPVf|Kys{Kq3fat*#OSG$bgglWg6ZNxujMJZo zlw8Xw&p-AOSnzy+P;7bSZRX^Nz{9@AZBfcqiw+c)Njo=!tmMHPSf@Wbc)y$ACPN%l zy4tw&rJ(Dv+pP*$p9xf&$??inwdU1bIcS2TR77J#*qnAs$7R?JcGp#9Z_F$J6EIE1 z&G$`z?anyH3hRkgNq9hDsY2<37tvDK*dW>Busy zCTW}A3pgq+FI5iH?6L;498{KF(xmnG4)LFwu29hA92Cf>eAkcKcAd$5$1E*fYXuXw zihQZ;?doRe&1#$uHX$gcwCa>?rk=F1k!m6_q4-F8w)1+UMvdDXTrY1VumEjQ(o2%d zB12f%FVOsbg%jH-`XqKsQg6?@@i5p|a}nXB1ZTJgohpPE^UH@kG>YV8iHt=fR}*Ra zT56rR0{-Lzwh0z0p^5s(f@4(pf8T7%5sh}v+EC!c5pW`Ez^n`fzQhI!#iXpbfxEVD z3=;y@pu;1@SxeE3~4pO35AU0_=mVN(_7vuQm&9H#Al{pA};EvtMg>4C6iTC7G z&qy_;aevGgrQ>JQc1GH-TyxRnBzp^}5dz7VwnPV{xZK`EZ8QR-=c+?DCRP=u;o<|| z%(*tlcbR=o1{()3&^a3B7;``ar<#;Y7ZNX$gjRKCsTghE0>?^gwvt0gJ5OaWM$V5XA))}uJvh< zcDc`X1@F9fyQE<%cD^8wIiH$Ro_cSz$>CE3EWSVB5UoUn(KAx8JeNVS^@x4REx7?_ zL#fxdp(3D;_<#Ta0|433>Hn^p`e=GlST<`pIoMOnZz65NlBy!8`5_2m^V@dKS~FQ@ z0RG25EA|Na8c162-pq$vI}O~-VpZ%wsE*0reG?uC-{iVo7X(|l{SLLs)K3~d1ze=v za%R2E9Zt#&a_?goZLz4SG{MHX^N@Oc!813?Q;tmgdB23dTOgq`nzMj4bp!Bzv-768 zs8)HnBA~%2N`&_NQbf|yl`D`gk{&+YP<4a?cYu<>TXZ&}0Qo(ha@J^F85#-{aW z;fe)moNY6!ZkB|vf9j=vo}8D13gQ}xJ4FLy;qqvK)#@LjCUihVQ^_yBu&HDg#99mU z-_}c6gc3}0VIh#M`>5VC!x3gp7QE?<6>@gR*}nX1TQK@)$lASc&^ec|IQ4rM(uFcjUSiULahQ@XQfNfE)u2@Fodd!vbe{D8wC3~;>94bbBsfs2^&k;AbvIh(L zUvid3@^Udn9kG&8(GQ@MZtNG<* zaS_>!&N>^-c2v`OQo0k4Ab5)q4sH)bS zdhO-EY_g!xp|b1$frs}n_@EATRBbXF%)3MS*_Ha;^qU;2+4Lw#-U#|=%+rCAYvc!d zWtgfy>f3_WSpdE&PmtHD1B~@qTRMlAvLZ^It?SYED=K3XxBPf40{qN~<6sg8`iagS z`MZqNYuR5n)A|32x^eA+!%p|aLeoxcmc^l-=~zK8pL9-)UAJqny}~itq`q2;C$rK` zs5ZWWyx8vsLY|0QHB*G?<<8~^kGbr+#cgS@H73Z$^K(0iF#>lVopc;5etE`&aoQ(P zo>$uH5YCI}kOE}*5u1~8I3?$`T_%j4AT;S$;Ks@J*ZEljfm;%#AaDIF7+$s@b%CIu zi9BNNQPG{cK#c-LI5ab4H7O1pAuGl5T-TULthf$K49B(!ce@Dt6lo&_E7yLI_- z^W#^}f~{5nV#9E@K7s+t6L>qOJ;*zmfzsfV{Q>kJ#ycbJMG3(p%v`by6H0;e2R0g} z`V;};qcvGDEQp_>Jg)jj7pNiv_ny?meQ5^QPFo@n4 zH;LMaxB7`{QY@KkM|xe3{a)%@fPRoXN}5?xa`uR=xWj$79r+-fwGzRPhJV151R{I8 zt@L^1xz<@JB&DnB>bm?yStET4xH#2i)LlyUamh(`Q>0UR;Pv=w*^j8__G#)$LzTcR z##wd3SLvYk(;O=n>p8iJbVDF?&zY3p&MY|+G`*ZZ8XYjGi%ak8%ekv~wmXst7Nhzi zHvFWNUnR8kjnE(S26Hcv=MF#F4ur(b*py0RYK{n&jpt`h@o**;oU_g+v;5OSU&O@t z5G*XE*h1h)lHmoPa?Sh-Zs19Fn3B9?;5nEwA4`ka>K|J}m0v}SnMw!xH-7`g>T`cL zvqlc~4ljF;fF?V0jx;TfYq2sQ>|SW;yWk5~7#$HTB=MjVph zceO|jK`Cf)f>sM4s5}NXelYgw|LO5rm_%6S)Lj z3^9ue23TX>q~Hy}t;DLYfdiD-$nak%sgZJ)lE2N|sUq;;nt+Ku=NbG4?+hNkaN|3K$R4`=MS zhak)8+kUi$wvewwjajp=eZ7D)=ZmGNsV-{eUN^XX34e{n9r;?#v8h8foi(?L#i<1yLvMk(O4KyZ{OGwiG7S|3hQyJatV#rD&c+rBRw4d0JT|jqd8yt>h}ANU%s(4*R{sQ+hJ@Yp4H0 z&=~sBB?d7{&#U3fd4+niW}jv<^RgqeR;Gg0@GcxP}LWB$d( zX96SQH}2vx&Y<#WOI8E*=3jtK?X6(d>Wi)6TGbf>2+cG_FDmq8H&m{qQVo9ScbdXt z=);Dpw1PpkjnKvD*;KvAU6InfeX~9zw2Bd9o0|Lwr-M(T;^#x3!dCC#5!IEOFK2j5 z8x2`4Snv6@J+6&c3O;}VIKBRyR6ne=0Iy8~t)N5Sfg|s4D?u#8ehNLZYYpoDi?Q%* zb+Rd9?ztu$lK7HA@fU5PvLq3?Bu>DItTcAi|0_xe0SiSt5c&ba@2%;x+r}^{91)rT z68f($mFR;o9MfSt_1rdn;E&U$>@Yo9U&@rgvN;<}K)~5ZoKgD^Pzns@r7zMio`PDDZqVTa^^w;>uf$6@|nWq1ib8D3Q-Mk?WG^2F+`oe;syVyzj`HjL^xBf0os7w7W z%-bP1gxpEz_&s7;j~SvF1^Br8!$#pN2M7A{JM(Cv0kn9BY|bK8z0nn#c$+YX3@{Jh z1DCb%3AEv^X0g}<7Uv?kH4;kN+=8Jx?Wd6TVNA8JJuB&tw__fV*APWQS;Byb~ zb*A*=@No1Yk~iR>!CTMNY_84NfYYi~G>8BLf7YiM_~`8VKAnWAe%`h#_pz+RK1LS= z5Y4HZCKcX}n3G9aw8A!rlObd%bROuS-VJ!u6Dpe0N7pLZ{;2Mr$TF>%z>z9{-DsgB zMI`*#FlG|m4WZ|h$@{>q&1q=I&ng&idoF+09kf6`%^*E^a)*H;!A0x0@#vGOyfM}h zVWCoX>cR^iALQKVb);A)(rm8EI*N(|L;Z9kV-Crm_W;~59TCeHa<0URo6O?;j%DHUu@pb_sn>VyLADa|P!X?<4#lT^f-?{%l7SKZD-M3n0VD=>6C|+>e zLyw3!h^iNy1J;R7n!Xf&k91|QO z0}Gg>q}arhi6R1Ie#9XtA<;8-G{T8@B;efuWLaHbZ z0}bAQ-6Qn^;j44Nc@d;1Ga>%7@5ypO_Qav)spX=!9jBqQXWfu3-=ZS*{4!=#Er@sU z8f-{VDT7I21oLEeA%xZPdBO{F?#J%n8adMQ?V4)}hE?Qj=8oN9%krQS3Y0ymb3$bj z5a*c2TS@i8GCuWTwSjC{01~e%tIy=7;hgEXhe|{6B`nZ2MRwx9MwOqfh&>H z*B@r=7=TT@uVTIda)Cf58Y@7M)uR9Y?{yKW>}>DSgfj&QJ;Zv&{`i1}gq^wj1WRF_ z{QwbbX7Tr8qKwfgz#?TGhuEtgX4M50(+vBDEL6gQ6$+HzdBHcki6{c0I)@Rgtbnz=pz zQq6*|J@e6xlrFwTg%%}JC~B*|z{x1W=)Xf<(i(blHyfy`N17Nng-1E!|I0%87~Oyj z$cZzwKu6sAc)`2;s6g{k2584fug^fUmp%m{z2w4_ZhFW!r?7 zs$kEOls1YWuEADv@=B@mlXicPTkEW(x6tM?PM+axCj6vXl20ROlEK1 z+63Am)lHQx}5pRq=+LeHzZ8u}7lUuytHce9tH9Ngc!R=%FoLuF7@=8)**R^?lWbe~y|i(AmS z2TAQiE1qLOv9St$xNB>v2>J)?_>^ymo~}+E;E?P!_4VnZMb$WRb4^lv3t1Lx~;uJxV<*j3PK;&}&0;eGn>;Rd8wbF#%Y4va*f__X(%l~(XPq&SUA z-AdfV%o1MTn)N;Os@4NzY=M130RUJv_?h!kL*Ni) zFC&kKXjD58`-i^ddv6E6*XX^HQ|)V`m#kE!nHA^>0Vf_g=A{-rUUy&3M)AR|&5m9L zG&}9~e)$X>PTLjW5&N5w*u81;3$t39Or^?1N?e>33ZulFthgQ2s@KMYE34u4X4LgbPzrKy{1ST$H`y&lVNXEeL%A=sQK&in%W5RKGI&uy5HL zzQk!ip0wrE`irzrw>FYZpEJ*W4lu*8ki*pQC**oTP|amz)l8|T@V~@Eg12IEzJ4-9 z=ig&4#0cR`D0ByxecqxE;0c8l!#KIe&CuqfzKR|gHeq9@k$>v!<^XNkZJl$v+gwB#K|qPwqIKxe3gmJ2A#5Xr6S zN-p)G-;3racMZf{2z_{4-p-0aPl3V?uFrkBiBmv)Z)Sd8OpQ{%6jmNYJhK+42;n-o zp|J@Hj79~jGjn4uK?X`z@I2@vimz+PU@bUf*D1WTH=?s2aQQtIVmWtmC}v+OH8MdD z&3+LQ&~9kPC-C>jE^ta_p#jVehqr(TFKo;-b5na0hsQ&F1u`Aq_TyC3f8X_g_A_R& z_xdMt5{$7U%w0r_VHK7*gV4l9fG9q<`4k+*GeAp$^g>g!vdjW=I`sko2#xy@!kKUm z#|Sv0-69Tb%Qcxcp&n?3j)y`C^@~&00PwowgjO_uVlgljdxbKA)sJ01eZG?f2i2*C z9SE!upM{9cA+QqwTPsw&jAm5{>iqf*UL&y>df_4fZc@~MIgB=;;({}~ZM{cGc;G7F zQ$dLow~bBjI1IRaJVQiNi5%<^2Y?LL1)|`YCrR>VklyzikUR~TT6e$L6Ihs7mjop= zEV@0gXl*$?W#ZGo8YsM*v4T$%$%aS6k34*TMf?GOcN7XY{Km=k*Bvdy=h(Zv@C0tD zpZSUJ+Ba$IdA3o*@%C3eH0a=r?rZU(2Bn@6a=e{~s+I+avsn!4LIla(?Di=mSG{kUHv{USOoI2FanMk40Vy#2+<;8zHLk$vB;AV+YK`3Ac>1n6LpAn16RR)sDv=oCAb8M#E+r zfu3$DdFO~ietsJUS}r-B2VIFUKm|mPKFyE!AS)2r<^4 z5LhbGm|V8hlUklCNH|RHDg1fY$U+|5OY;O#-sBjeA{ovDp^$UJJfcZ=o(-d!RHZb$ zTSPhY&hh2nOc&gKoGD3>D!5M}u`FlhO^qY%YM@j^v`AkGsw;)&Dx0^lk3`bC7Ep{C zePKQPBb@4sK=2-P2FD*lDUw*IYz^}O2H+XX-;avK5|VC+#>A~K36&>^U?J-Yqyds* z=mGAi<>wd(;OxQ!81^25bM9K-d|lCM%JVq>Md$VvpkVp09z?5!y00}v_QlXGLs++% zKsUn2b08$aV?Ih7_CxcP4D-H;pkiB6EM0dgyQLB#FuzHc7MgW_n6@K5a_#GECGVG< z146~~CnUaj=o+DBXBR}YX`TQ=R{#J501(~EeD89k3;Q8H%5LMje0BMAVx!TKcH(Ln zMnlL_!^A-#N#U!yk&RX6N&*z#0Syx68kHNcFYz@UNZ~=j9<2h((`LRz)INo=Ke@x_Nj2Hd_TP z;p>i&aG$#Nv0`61N|sf4piH^tE62ixSg=V%{BLUXffmJlVH&eU=i4A_S2fu$Sg~C$ zpfY6B2>FZp2y%w800B)F(fGRmW$s$bazW?L9C0m6`Q}k4@ zlaV8EW$8$HG%|suYKju#Pym8;N z{5gU{f(OY%5Q1l(NH>wGXSpGLiF;Ao+sRtCnLtIi#7B(u^?qn--B_H*h6MCX*8g|1 z$dUH826Q0YASB;Q2IUhOV<;0v#4B8D>AWTd4FAuWm&PYRwBKrvssKnb#fPK_Yh%bn zMhcmF2kUJ~>6D-Xeg%7~m5im2Pq4fw00093n8}b4umAu90F)#EALxJ~ z3Y3+tkce=g$Yz5g)IL{$g|Om5PAmb<-%vwCjw9@pNCf$v-LcSIlLsws{{^JmbIdit zU)e3wcSH14mrg7PCBZ!BCDYeLw4>la`AnBDc-s$gX0VTZDC+S#^On>8&evG$@q9XqnXA>kUjGRcd)msWnLyuXC<%lVznU!|L-?7eh17T9T2eXk0 zxKM%_wxuQjVW7aAu}XXaHEU!e2xf9hiMHL+Ju zFt1MVS4~?OSufVq(g}SrJyXkF2;|aSaONdxJ(W{G4z31Wue@5caS zftnR+QQe{Mv~_CvewaD!r~5yKtnp<@GH1Is7i@ae=i>Ov`5CcJ{ne_dtxqx1q`#7q ztWM*HV6#x4(|=y**a6jYI~A>HxYV>sDOH!6?Xe9o06hQz57r_2nk0V!0F5(_t=%e= zR{lT}BD>0!X{^JOkmWr$4ZV)HI_nS=i=%)`3nmh}rb=~BX&XL)>~OSdVEj0P`1(q# zzAcc2k)3a`kuo2=4`g_t(6S+m%xXTUpYJQzh17aT<&}sz`ns5O469=6QMqY!W>Z7|>9Ae%+#w%$y0Ft_ z!E-&5U3ctH4WJjd!)W@4E5-XY2SXtk7?jJ2-I!Au+(HYuKo(vQyOPg%s1yRS%2|~Q zeot?~|=ii;H-EYm6J0xesaF zV0NU>I88p*)RljB4wPX(*Xbb8=h+TlGwKPZK5DX9cDzAqXqw@Jp;?dtrX~>sE#ZvE z;KxHqL_&FGoBm_&Hhx>RuKH%6Ah|!jn=jp>c0Z^x9KAcMpjL+PPTDZu)@mIHD|r`F z&yK+D4gk5!3cSf7YAQg}vF=DJbJ#<$wS8I<@R3x;o#dh4(`;f8A_;11LiRChl-DG( z3%f3z-(T(iu&^u`d@T@Z0Igd5r%2w`TOoJBfUCMn&%^PGW}(eHsp-+sF*8_Lgde>)RMwxAgo?tWxbsS;^1e(4EhHH-`<2qxwcQ2%pGm*(+L9F8j z03JO&-p70fS^3C}g%colcBM)oPrc@Ax$)rk~_f}zl7htjEpWRirZC^BtH>Zhy+8nhne`1lk`4v`3I_gMr#Q}|43 zsQRbcvn17bQEsu(5!t~Bs9m|r2^*SQnx9p2n{$k^nyBMljoAwv>NsF~TrsDPwbBr3 zD`NCZY;oGdudtDOOJfZJ6;k&Q+?N$>D)I_3Q+`p|=)J1mP?>xcW1U@;#@DEa&&=;s zmF}mf+Xv^fjuX1^pd<#RP^^+`*yB-hcG4pD96~xN0Db8w^#7E8<<Z#(ZidZf=*ulc=8Hdy>Y z2+wWS>y$Wuc7Yb?8e0cF^Qck-RGNq^lGV4J<3JAV^iLpDzCd^STS~W3_PPt%xoh7Y zb*IUN@_W_EWqWBi2Z2xLt-;upnc`2B3=_$LF}|SQX;*bHc!t(l_Rq4v+Im{u6}l%N zW&#WsW7T%Mp=|}NV9^_t{z4}>DS9-v)3mB{AJ60;<`RwOMi_RdM^tVN%#PElFPRP+ zTFDB`{lX zW0=GaJHBB&R*(>GKlFUh|~l7)JVS2uEi>& zYPnscA4>C|npkHx&+-z6MnzsJ?4x+$a6;f^2N7GU5)tDL(1|o974n!0CqP&X7PrFB z8@NSn=GrUynsjB=`!p2qL zVzNow9pipNAoz*~RYa`Ex+p3@6{5F0;%1rR!#2apf!Ts27L*wW#%O>E8G_v+C&Jjbh7 zY9xs2zLcr~ZF<@)PrG09Y~udL;K)rc6^dy)SjyF{F}sW7g1iY6r%|EvZKx`!-O<p5Y9Gu( zx0PEYCFg!B+gXRh+=$&hX^R?%2k=yfbKVv4$*JJB#iE?(ACNV!pEF#KGy{AvIxwXZ z6G!pR9LF1{UQk~;L&G-yF>BLL`cKfoxvEv5&~f4hxwb(a`7{o0jeAu*>(+8b?P4^$ z%sm^Uc?psA^iQa*L6##riJ>_7Nxs25-Wvq*;n01IfWC2_gvwMmpb-L8KEoD0{&K??ToIYSl`dh) zG49V*e{oh6=jvDeGdK_Vxa9x+#Yz!ml0)1JM=efgjLZ9$XdPXc3?h;1zSGFc07^i$ zzs=Mm7pb?57*``6MKjW`q(sHEze{=8Zvv>Hb{pZ1qnqgCNJbUYIF3Jt(kp$aVx@cI zE+($xT}Gik^NKsDd~lnl0da{q@eq-EP23?b7NRUf-({#u zEYFfiyNeCe{n@oYl4p8~(6}B7R%e%zPvO8IYmN|r-$^eKr4O{WO2*2Z{c=9-eA{K+Kjvw5f)T%1|&yYh@mzCOKoXs^tT{})Xp zQL*iN^=;tf*jU>Y97*ntIXYgrLILiyoHFriAdZY6 z@d-vra(*0z-SSul*k*VedY6Ey zp^^&I={5hwi5&N-Fc0j`TI@qZK+mJQCXn~D@>>(b|Gm`tRyy0qP19>?1U1w=g4-+dr*?T}di zRpZjDPu$^@it4aE01?Gi*J~JQRk^tz_5FWV4u~+mse!q;8A$bt&jOkgD~Cj<;3US& zX{}E`@PNf5QBfOVqL8_Vi=J*Y8EQi<>CDNrs(KmQXQw$w={`13dVk|6ql^t2^O3mN zSZH8u2xd}R^HuQ$(BAX}Mr50H!z{?+aGpG;CB7>h1qAYnr!u#7n)cp!LX4Rr=u#Pa z2Ome`;t3j>q#{?i61WO3KKepNocv{QAU6S;G#Q!v_1k?iwok6CLeKS}?A1QfXK&>P zT0_?wjCbLtDLE7L{jQL8`GTr{vcDR}tBpg4s@H45@f|8Bayqvt;d<7{qR9+wuGOLK zLlIyE`U~r+_B`@|F%n>{XnolT9keMjP)=x;0$krzs$0$shDn&5UoKn{ue3SsVg)OI zw+U1*0J0!Lg{vZ$b-ktQ>-J^+WexQT0tZ-L)kKJN&l!Q%Og#lkO{^PDhA(rrPaiAW zasn{OR{?3?Ovki`?CW^{285>lmS*Wq+0zv>`#139UwQJgGWuIqpzpcjV-BE=)8jTS zjZg{^Z$Ik_&=3ccK0L8N)r3L`G!R-Ws=54Jzv*(?zobZbDe@crbBh}<`Nlq0{=M*h z^V{w4R#6wI$bP`Q6laU4U0&Xj-q(tJ&f0-)!&LqSh-f^6x9HnrE#Q!xSElJAa%DfH z=OQ0s@Lq=CL%UbCrWg&Bb@CsdhKS?N3$))J}PDv=E*92z@A^=dSM~n1FG$10ji!y_C zEQ`2Wg1?nI+6p3-NPRu6q*ThNsc|PS7@@*B!%uR#G(Ie($RJLg@q6D_H<-O^rS)ft z{D5gqPmLWn$Wzo8J8P3glIvF=&hrzwzNQ&`0_<|u7z1Z)tutGfOyZDT8a3v+_qzu5 zKv2fNRjD*IVY1W5hX55T5v}S9J&iu^643nywNGyL3JD&}^b43-%e*bj#XV9DEn5T@PqHrS)Y9J%k`cvO z&!>i7V^+KDDk>dRFta;FZ{dzY;sP%Tg_buvdEBy_r_#s_YRH6kq4C%_k=DPCXZG~# z<~`sWA&pF?(77o+5)eEpq`C-2Fuc^6>EDnuS+rjxxX0;Prlc+qi(WYZzv1+0Fsh*d zuBlXTC=D$s`Dr!rrfADaI-z%FwD66=z4~B(o1VWaB;JI;Es(RsiPEh%ON*HK zp11&HKmY&(05QJcDB6w}j9AmC_! zA5eTu^IhMMi}&NCD+`!*EvS8soWEuyqY%RSMUkA%g~CwcKtPkhf0zl;;JIPM_#e@g zA$0m=PiQqKrJ9}i3RiIfAQ479?+!N?c5mgBY6rA#gj9U-O9HCn4So!&@I@anz}!!H zSlL~5fH5!8)pji1rNs4~;}2cMk)SmKddGn=cn3!iEz|0vex3iH47t9Dr);o=pRDqxJ~A39w5X!d)xV;Rirl$eM~plwF&jmgePys)z1<3!*!>zrBvg0j?6&OZJ+J|_NRr3|WeK)b zoN2Le3CF>39HT=7=}op-!|m%K9Zwfes`QTFwIUi1fg6as)t}>FGR{ z#3lf3s$(IeF{riiF`5~(jV}7^16LgIlOSjpUV3&aKH;KnilGYYcjx)tdKR`-yFr;s zWy6Y4jm^9^D>gNqT{1*Dj89_CDYxh_w(iEpT}uM8peFNH?)qu;q|0JNqLGmc8vqlQ zv~rAA1540mWh%nNOlskM^VPFfE^2Y1?|E4|wV~41i$wGK{(GF^71B(v6v9K`n83(NtPtS?@E7EMQl_deSbk~t zA0}4NN-El$AY@q&`ADjnL{SD^u8&928%Vo5d%rYZf6o%f70U>kfqJWlP2G2A);%Gh zTsk-s;EU%0N-m5Amby}4&C4I?51WC~BSpx-~8TKYq z%(lfqF>e-3vuOLKhaNhrcjLd%^Bykfiyr&F6XPryE#r)IiPJv$M((GTjI$(Cx&g@R z@+xq6Sf+^%QER;UWe3YT{4K&4#9MO|0f}Oa2%DZ*X=BBz2_ZqqUsj>(v)-NJn4rBX z#8fgcu#A}rH|c*k&mzvO;5xx{T(`edn=`Yy8b>{Sp%Xz;u9&Y1$p0b+>z3c6|7UqM&m zC89Cq`DRKU%4X5Ayn6uDC*QY~?S5>lIH%hs8zB#LXg1nr1V5Ph_aj8G!JOOpjnQVUx7nG}D^*ahgvmzXy z`^z%)J-!^M2~N9mTpoOhXS9f zp7Xmt+S6sIYBJIEAJunyQG)Z2HP9ZoMH#+YEvDqf+WrPw_Jz`+)?+?yLit~jtGB-t#y_u%wh%R^V}h?-omSmwhd zg!=!tRe92T+d9*kIJw!$;EtGjTGR&Wn5P|+rB6r^LFlOsr*j+ZdH=K?gsl-LH9(ms zjS}M%$jaw{$8G~)f>mGMo#&@o$l*4S7oAzEv~m2sdintT5}R%PVictJ^sKu4FN?visR}JCaw_|H7f~BP13{O74K`G$>xy5do53DM zt(0U7Dj$D_=AUieaRv=C<9z5a-S=bs@OsySpE6K3!AOiqqxA5sZjw?hg5-2-aq3+| z0GGkyzrX#yu|o44P5T8gA@ zdE%ZwLeA%@;VyacoWYuFR8s>{yEOR5r9YS;EeS`0%8#x~iJ z<)laf~l#IE7>{aqOq4AgP*yZ|><0|;pgK@cH zTQON?pzncL>lws&Y~yDG=SU8lIP)hm7s8!oZ;EtL#5L4>R7gI>_gedf6S|}H+CFi% zOKXSBjB>2kE{_KK8pBR!@8&)sxg%%_tc=A4z{kC9yqW_|2TN*7Y?t|=iwVb&$#L5{ z!sBM2W)TT~oafuXRaS5mi6~88Dpv7w0Nja|B$OvtD;p1mRQ7FsMNKa_l5mo>YPqpd zgmyXM@bm?jEg%PUIb#u{C6WqiGtk_kjeA-97-es9H+$Y|)3*L4UAYh9iIR_k zxtM*_xl{Gu2|MTi36HEm6!`uy{~y7!TL{WCVr~5N&}q8JSOqf0ojPqx({ZnIpAD_? zN;ZsTDI6tJfK4*c(}`Z;W>ihAb?U}m5TgQEFF~DGqB4M`+raZz!F`#kD^fR-WZ~v`tb$&)`PY zG!+pO5>gtEqm7Upxm4S7Dw#18>EY6T;6HD>=?M#T$yVEfiCy$9uh)w`*nJXSj~AU{?Y+EkzaxrQ+6Tb2JpuME{joKKi1GB7X&!tgWv!)b@m z8#J}|KZ>~$!r68{S=pEOTI%i{_v1ML1_Bx1%hw10(!26qVIrxCJk)~b3iOC>6po&0 zUr)j&G);zk>ssN_?9S%y-fsHjn5QosL@Qa8E$w9q#`*Hc4sHN?qCBf{n8jhM z4qsp|+JJNPa<5YDU-=^U>=4x~CWdpx*seB*)|(s|5_w6?3-^JUJ8xhkvyl@fyvgy; zekFXu;!!Na7G87D?An$?7x8lDgZ(-5*V+t>lz~NUCOu;=;M%Z|9|WvmSQYz#WR(JI z<1U;J>-la>#ytPsxM>5+6b5HyC_x%l-hi%ZD+<=NQdGV`ZC!~*;GG4i&51#WI+!mG zK&r>i#g1mnO(o2fI53l9Q1jvrtXi@Hbj|dg7swfyy58SYO6udE;ju5CaT%`zrf$LB zBPy#MGFJ%lgpqRRYY=SyO;MmaLW2vD-ekiGuPz?G)F4razbQVyC5NoZB#a1n&Na2w zBtot9?}{=zP$M;eol|Ce8bhbAro-(GW4UVrHXapDFM)!?eaeVeX#e965iCI*l?>gq zq03kZk=g1}KK?irf9tAV4)`(>BbnwT8Y$b!<28L>$D&15uLDv+%xY0c-~vx-=U{*$ z?c+Uf@dj75gmdM9aD|kMv*>_+D_CnsB`Zy>ERo1Eb#O8NGXfM~CL!bIvbd1J1ABG| z>$g(`sY4KzFYT#$tWADf)BkxspEz#W^t|&=7yfMguwi>JJ7-KO`4=vwW&iR;jZR3E zVlF4=0qf2yFIcCNeum=NQ6W>7f_X~hU7^9Nfx&5+9@!-24y1hfNVO}8c6w@hbGB!i zhu;~&&C)g_#@XRca6@<<8Y*l)VIm4B`e(P#YDY#*0qEF)c9wRU#XCv~w2$nPC8|UL z$3aBW8~JQY9Nr3XR*By2Jf3t#J{)}smt|J55*mP5XaBNhiY>+9?d~viOnX&i91Z7d zSvN)~u+5NhUo@X6+N-Uje9|NFAGW9YO{esDwme|)(l-73LdR8zOw*0M?o&EmM#Bz~ z{l57m^gL)TojoVu$iuuOyjz?d>a2T7W#D&(u`RFqxS-qj{d< z^W_fVtQVZy3Q6ACWbP9Qj{R5?9ps8wAd-4Nx-(?KmT+1hrY%WLAi+fi?}eqOjSfrN z21E@t+nHy!jOjq1zrqXYJP>l~)9{zw*OO#)gb~6p>F;M}r@o=i^y%fdoP`|SKTn9` zR+F0;PWaXK(vJp6(=Dxx0K!Oj&##oiYfa;srYf9lAO){R?wMRAihGv}r5Gp~nVNX* zirNOlVl_`c`A|8{TIk#4Q&-Bs2;rgZYxMYl`T4VPChrKK!=e zdZ6`TR|z%4eafO#KNdrWS`hT7r!{+$Hc&sXG@ZsyRcgtzulaqy_6!BJZ^?o>HAoL% zVPE$|uZ$quy& z7FY5#=G!raDgDp;{n0PF1v=Rhe2X7#W!4+{8I<}&1RlYveiyXOKPLbLdV(*@{=cT% z27=DOiig&s-_s8IPOe8L#$cbYRsxmwTF7G-!rWiisG56vp_Pkz*f5lmde8-StYROF z&#Op9X~&A2>$&m`2*!gGb#El!^_!bYjG-E+SlcmH&4cVRdwViYve!TOFbBsKdzp|* z=aaPGbmYv1X^ML0IOg&`$1OOm137w~I`d(D1Puq({vlJaFYGh=+-vi}(GlmCspMa45IZmZv)Z9A<1sPh1;yY6u z9rL`JOWBTdbll~Hnk4dcplX`Pwk-gEdI!Cx48rm~ z;_lI501A+2b(Umie3A{Bec$p~sgiL>KQpuLDL89v{|9p$z|W2eRHYSC{HfdUQWA4; z)QBRaj|9H{rXLSk71}Y@;SLJ1*BcZt9FL@c;TWEH@gkF&EqfL}**fe?#+tINHgb%J zsgkWAV$09PwrnK1bLIWpH0H^tEV{R2vA&5yssAHyiA_Qo;lH>Z8SzA_ z94u2kOX|yx$pr~Pn@?mpq!KZclS*(2_vbcD;B-^{hQpDoV)(6|xMy^I-Wk?E>~|e?ynB1I-_OqFpFf6x`9iqMs9q)Mj^LyJHp1P(x} zkf-38)wsS?ZEL2dXp(ng+o^*OB%=_>uLF>w7X|@-lFmxCglm9U^bpq(YV|>wH_knZ zX-;nsD=cnEwK@NHphRs624U=M2q6cd@yi_Eyro#0qj63UuJ>ZCb^bkEHfv(m#iPXm-;oK_yKn^f*}$7g{X0prI@z4R~cK`DPF3_@^8J;zC@V+Y zK?77{U|kL4xy)?ie8xIX&@*tEut1{-=bIxG9xPou%J2S&&E+7rc^|_@?!oA{c4tLA2^*V#jFBlH2Y@>2WE#i_O!XQ1O18pJj7}MIPQ>ZT+H{<^Uh7QDr3V|-5F4t&HFV|4$Qghy|(+AkLVq^6z@0QVZ)_v3g-P)gQ9eh4Hp8jScEqm)*?|sK&b9 z>4mT{HueWx5WDr0f`-mqSF7N7;!UKOnFY>KtY;ca)U(f@+vd(^saHN_5v(B)(?CHe z(BmPv(!X_~Sv$rurq%zpwOHdcNJ@iJWPJw$5NLL2adM=2iou!M*xaQUm1ghHS)1fp zVcjputBB*MLsKuKCn$k-_EAy7|Nh;Dfx8UET@~FqIe*!gDTK}P0Irb|LLPTT@}{62 zc21cOh#kc51K81RrmxriF!}Mho*mCqdtiU4xakjCq|@l1iX8iv0wb&(AP4K&Ks=k3JsoS!&KY9g6mk8c%i0U;+><$Fw z(BFka!bZS*Cc3@@9EcC$t(5P_inqAZ(mInslK%C@)G2Sa$h?GFAwBQ-~7snD2Lpi;UQjv{>X-By$P{hxO=u&EfW6YW=YQIK6T#9g<>Fzv7CQBpumWM;@tp7V- zYChiMc$&xm1F0F!z74*i5<{uGMiqghs05>5V$ZR;2S5#9$C%4If`F|pD8JPH9(ff*?SvIR|5 zWk5!vzur}0IN7bdXX^Wekt-$A7QzK`V=2Lt4O%idZHtPu zSkOezSP1|jHlDW$&@}(_FW2X1S*_@%DV?L1lJO@q;=tTeJz)FkJT{1y zAAvmDtKKuhYIo-p$5>N6HN4g_`sVXYJ_-TBCN6s!!31;7EGqe9tZr9un*9fc%_vk5 z8ce1oHG#~XZz#Uqv|A{w13B@o?*4P;hmUg#(e-rQ^aRw6r)bw+0hlN7c4nQEAvMhM~wx~ZUX8Lv3@R_rOW4CX@X6< zF_XsroBbl`CnB#VkazWMg5kRq8Mc+YAbi;L0IX8unbty12^`cS zzC_?gNN~y+hs2CTp$LfD%t$gG(z7NUrBP*@<8B*qDl67Jjw>vR;L=dz%+J}Z7iIYs zlRJ3M%6<+&d=k}geN;$c8Tm0AfMLSYHh!uCSqyc5zhnUHCA4@Vrir7*H+A3xGy4IG z36{rJ7#o<@6}2QOkX=%v1uBLoZLtZ_x>(!1_j-;`=%x^bLm)zE<(`#nbGvgT=P|Z| zWm>LiHRi8Hzvg8t@hwJ!)`H}!8-A-pcP{~1A&CH-P@9KbF40mZcM1L?o;Fycf|mWz zl?-X_+E;r<$o?u?)2$rZv3zjAKo(}{yHqVST78U$%Zx>;n$ajWMm34&CglJ0gDz$h zyz%=my0cHP3@RLRyv$$${>b&+hftZoO=ou6-NY^xKl2PTrEY@$P99Gy`E}8s{6Y^G z0{t|1FTn_Wx&Cr|*)2}rj3KR_qEV>MLRJLkl_%IZc?)&$&bfbm_f-h)qvS$ZN`FcVx+}E;Is^ijde;qk% z!b=fLB|^X2{Qa}DH6<8$&y~Srl;CMP;^RC00sUTS_bK9|Q^>Gn=!}Pl9VdPoU|4DA zHjkV=x-Zz?{wMA-;2!VtM#lw*Z(GV4^F<;4$CJKbodMY-8i~Ok_g>|U$lD;oOX*49 zkq@2R-ilsXrC7Fu=yG7$2+0}lS*^&A2OaqVW$DB;;{zE}1I@S7if}M z2x7F3q5ZKXnk^Gi3vRe9YQ}WJIoFGKy9#YUVfJ<`!EtnCSb3FNhewmYV3q}0)RW9T zDqw}v{ZtyV!e#dciNV+h0HHddOevn3R=w2*@8mX#7E(>^v8Ecy zVp}AYN6jEqMl=e&Wtz?a&#SLKx_fZ*X6?VawF5%uy`D;5M6*W1A}zbPa9A5h{Up0|x*(aq8jN|h9u7L#R9 z2-Ee|$C`tgusft+m&`BIiH3m;dkjxK3L)`Rx)pD?z&=uh9`%QB5eDB-?NaSOIpWWc zJ}XoUQ&#Ox;w>XSb~Chjy#8WKn;Ip}RR(ep#kp0OPPN`QfmOF=#gNS>2v>yb8y`9c zv~HJo%XCO!qkemMB(mP*@`#w)DLqosxQTy+1=&mZjM_UsBv~{Cd;{|$@}!3uWfbG( zRKFSET}Z5ICF_Wc5RgdydJ6EM+l%xd3;#yJlI+Oi6Lrt&;}D(lZn}qW0fcS`A?C%L|8nkm^T;WyUu6^Dxh} zRW;?Kcs!eo(WJRSM2DNEemOSDx@PJ_owKuSV1JmaV$+$9YS!R&PPKkD3?d=;AN6%8 z@VbtjmIne+LVO7I%szr{vDcZpEMY5<#3DpQk%v7myq|ia?;)LtiM;!4b+LR~iA|Uq zZO18s#yjBT#x*Yp7_N#0MOpvtik>a&WsSEu!{?U#+X-iqgNqUjD6|-^{E%>AYcCJi zlsxizA;N?E*B~7MaQ%^#DF`1cgaP959tw!ryJJhem61u{p|FRT2%`a0;B5)no%spJ zdu+t37RkQ~4KvkyWO*p#mM}ygLw;_6VpFE{V*amdmH!$z>Uf%njPW~~e78fpPdSaM zUI%wwMbM-@&urK4Rkpd7L^D<8MH`PpTU0_l0xpTBAo)w-=M*slPMWrqIyCMgEv(ka z^vm^ljC}2+hj}UBmkfxSi$R|Lv3fod0~_eon&^Kr2ku3Ir%4QrlJ*uyixgagNpEdOG!$hy6lnDfeY_`6Co8X2 zu!!-#WI;1LMR%GPWs+d>av!*W73FKt|HKe&@`S&DdTK&(m33kiX(g~+WTupckn-LuI3&LoO*UiHRoj0u4qDF5+`5K?s(mho zp$s?c*NthU8}X+5zu48b0i@X664Rl91}bL=>!c@l{brHxroditvXPKR2+>PK($NP= z_$LpU4Y60#6$oViqtsc$BjF+oM6^?SB&cjx;MFb2ez;d_x3xjeBNcb+!JL+lKjatp5u&)W$j)g>AOT0j5)95Hm$nPUCa?1__sfprOi~*enoqz%mP;G64d#lPLV( zjZBR8{SD^T)7CI2B0DMq$1ICl?W?Vqq3+LM$QnrShK%&=rqm43#8t$1>|rr4hfsIP zj2|N$du7#+ET#GFW3I0f%TdEgZB0k-Z=+4MFUQPB#!)rW;d-+XZ?|dsn6-0$n#G2f z?+pl-hXshN@Z0A!4~=7Zc5+?USiOp~Bc82#el)LN^nZcaxp#iQ7(z|##%!Wzq!69G z@hZYD!$)pch9lC;HuDb90xe4EtU?0X+TMk=SJw*-y&g>p9uvn2UQF z;D9&*x4fm?Y^68&j=E2Ctf>n3CaP{*L0QZ>ZllusIo$-k%>z+-jfu4%R;SYH(w+Lg z1lRs_QEC3?>?Q?t;?ybo2;;TR9PW?loP3Kk4Pqe>s5}9{fH7=yQSIM5p>2gCEvttP z)|l`;`hnF}V#&bG5D3RPoBid4m)(hXnXz|%bU?6+gQ zR@j#A{RJsk!yKF^$8G4S1b2FzzyZfCURHqO${ysFHPVAcHwwzoNIXmuaq>(`MGcC> zqk2J?Y^hiETb`d{`2oQ#7^O0oK*6mQhr zDLdSRyq=eN9JYuX0smX9I&o-nrX#B2nyqIOO?DfIH~3>bwoUor%n>BRK4--jKeblZ zPt8y0m3}yN?s_6m;uX3~q7FYz)Mg9ON5SB#fC)W)JRPkJR{`0;!$>{uDRf z@6YD`PUxVchM6otvX_}*#5As17K!i^zJ_VN;?OX1k6q4m+c;v(8>+2`1&EO~x zcta^s`$ay~`@*@)0cS*B&rW{yXav?3$&sc!xc%Yg4^a{S9#!M)O)pnMKn`l@o$cUZ zFmmJUr(?o;*av&RDBecCqKXIYfB+;jQC!h-6Rd=57XJK%{xlaT6oKc-H5|VW{F7x+kKRezjA7N0T>C2>|5c`7rt_M1b9JL8#d*%XTzl z-VYcuPs|xVAz&uK3Y`|P8qr!195KRFy)fu5!W4;=dJ9|Tn^X%h(Dl)I)u@J?14Y6U zIKQ`@LI7<6CGxfIl4Prz0gUgt_E4XYI`q^PA!CIsDTF&TkXkSKhNK_sF5fEVyke3f zd3^c=y4(-!osfvYzF(4lt3N|?B zXrYBrz=E^DLG^6cuwVv6SBj=8xfGKQPSlQnCfej0eo3Xu_m0DkW);#jI}onU%?F@D z_;WFbD&|_edZ=U(96CuuSvEsK17IZSA?_sl$V!!)Hj5amc>Km$LoD<0{VQvrIazBX zeCvIDIWnCCxch_8^y2ZRbyqov%nT!2P3nxFob2zA+nz6P{tMkub;C;)PTf~d!C7c; zdKDlGC3XKKVO=ZdE88L3;PWN3q)*|6x8r3 zQm>sF+cz?nclb`96YlFQet%$y6MApa4Mm8aD)n4~sF??6qxeC(b592%^m$XzB$r z1qH;S;vi?s#-(OA5$t6qo3RZO`0{y7$ls02XT`Mlu;U)67k!=S&LsvS`Lar$i zAO92^qpL!zA5RrZce07d%HpyN6JsadPR=`A!(lqh_p>b5CIli_DkKTvh&7tkbzi95 z?dOPO(F77)-3$acEeY0+Zes6kWe`qUyO{)%QrW=5FN#y~QkYV_-%O*3sM73SOa$Hp z1xz{`rf5)eXeR^!&)-_MG(}0>MQ9rbS4X$tS2OfJ_z9Z=`4|apkv*zp|BP=GMiAT0 z(4x-hWZQf|X3sPQ*#$RZ&b~!!Lx{Bn)MJ8{EFgX5HTqcD@`Z*%`!F-rbsvwW1%b%6 z$`i6gAbM|GC1o}8h|Yt=1fioDr{oLZ$cXILMZ+bu^Vwv!IoC_{^a>ZIJrrTabj>Ne zUa}&;T~{^dC^RksMHOFa+DixS4NLr=(Gb*a;E;kolvaW%I;_>nz$|c9fQR~M`gtlh zW|tuY0# zU&%~qV2u&`cr6~l-X$ppb*}%Che5!=gYF~Yixol39iXB4J}X_Du^}-q+B4_8lQ{}N zUKhM=NcHN?uhRIZC;H(@l3=M(X%-uSjF_DLPyQbAaSNGl#smw^hf3h@FN&6TD4ivt zUwn-JUj_k)3#)3VtrJZ1gPwd!&RT-;SoK0Cf|D2X_RP}!lqe}=epqTYL7wQex9>J_ z|NT+G)xDYmI>%mvrhw%;qK)+w2Br8MxmvR@DYeS+SQdtx_lmg1>=-(f!5TtDHc|v( zm0|BD*f&~M192e_9hOKdKL4$o>I=ZaMzYnj6RtO=&rPNP?RU|PSXfxP>suj^Ox^7* z?83io=ca5S2si+1HeE&g?C2eG7&T^nHZPZbMNQA3t-Ag_m@81)wd)ZxOv`_ZL6DXx zBg$m3Ry!1XDodo~hd#kRCN}#BbM=VH;R=FwSl;(G%Wmt$jfBGV8hBK4!ldJ#Re{^t z=An1(WUeM{`Z?*gW_c!GZ}iB5I7^K5c)zhaQ>LaQ`#8aj%`96229qd;&L=29Fb9f(O63-jKIet~3Al1eXp}wAW>g+?uS+op0`f zl?Q-~=Sh@MKdDX$-o8=}W=QP~16O>vWb7D*848+NpH_&mlV$v+26Vox-Hi~Y_eJq` z0z>${4(-H;DK?4oHnI<2QhV#Unjl97wx~-l`5|z1kC#tw{#m(BwK_0q8f*NAswE~{ zhuUS2tr2xxySqL>MI@xD_to2@41Q-yKpi_KeFP&=15Z|Qs_IZ7$>oHe1y zb%fO^c^9aPs98cY$negg&BP8mY9&vZ;Z6H&bopj~OVB*EpIdpxQQ}u~~!`|qk zT4}u8&4>y9@OO?RSx%msxXP5cVdo(3&>ZD~@>;r*>C;Iu;RXH-W#F79!ch;^Y4x*X zJh&|6{%<~1|7Hy`4rFFq@`U_Y3A*MiygB8Jnv7k8STC$}+mjX!_~ zDUv}dco+wdeB4H@@ zNwJ>uZ4$AYfRFT zyV`AOB&werM!b^}v&2RnTXDmQCEF$fR#Yi^l)leiOH~4PBL4R%QE{AO9oX#XS3UlK zG<4Ky01nrJVz89r{2Zw6(K$Hwu0nH+5!Luey(syz5yWHueQ|OP$fIV_a2d%LierRu z*^@nl(CB8-Pu|mVnToo?HY1)%=JxeVKxfmZR1p6mH09b1hPS3Y<|7M8JajOqK{W3b zksU|KKrtC}@1NFgv_}1mgBR>=jC`9I^Bew&2DHQ3!4!gn4H&K|I-B^{cdXa#<$WwF zqPBrH^DYvQkR8CvcCU~HM9cL6R#^A67ceg;dalaH3e_KqNyUWCnl?f!^E#V#ihHfI zfol_`+#;L%xDVBD^WpVy%h%k_4-Q}(%&2{kzQxC9<*ZQ8Bhl}?eey0zqXsk-{?C+ZZj8hF$~ zg3fbb=x@&Asv2_aAuNe0pG0Zbzpwx9zD$$n>srT&N_*Gjlsaa^xE^%FtiB}^A2jI; zDtHq5FCozm{Ap%f(uLkmZ}>ORUZ z5Q@s)R4N1^?J%_wxn)Q7WImc^Nw=HIbxcc&J>F-(^Ju>{#-c{AV;uz;Q@s?7=y8qg z{)=>IxWT620Tggv8iL>NP*u)1T-LPc%dj#^5|$8-=LX!H;}*58_|t-|Sj(hONeMeD zUN+h2H7;T0Fj*52wQ-9>@3KrsyIxHKWh6D5_1AK;pyfHRJKP^H9{TSLLD!Z z;F_m21_*f#ZAr+AAlmb0w9!CWndB%&sWe7lqboiabs3%uxmXV;*LS^%g>;cEHY71z z-l~H+keDo78VZ#E?Bg=#873d>#c1RysY1(!S2d%@3!b*m1*F*b!)tvb1m9Y816e5~ z`RVWUlGVfAj={N6I>VdZ0Yd;FLrGdkgSBknVQo62#TwiKD+nqA6coMJ)qOr@IWxH6 zkeBSyJubU)rQ}b8!i{3a5e^bIRDZhE2-NZGpOxQJ;hXNWZ93L+XoMX3vH!);9715v zX97uO?+$YfKJ)Nv^ZjBj{g3NWMe|h_EXp()4+}T&j5T9tM1oS)kY?J(3p0uV*(e`O zOoU+xIsHmvOqR)j^T2kD7$0Pla0EUAiRfV$MVjXu%$O^dr0brX2!CCp-b><3uRrt zwi71%x>QkMAIm%v=MiE#<5~ym>QFd;BOI!a5E0_bq{^(b(pc!3gaNYkOVJB7;cPyVM9@(l`WW9gt^|qxk)u3&WAkvq{FR(fLh~OCgCGHkAy2CDC z3eaDo|ISAFpcG(#v|vxFK3D<|$Jdy%=DZcgyu4uetoqgvxB@~L4p`W_Wwed}_YRF; zV&PEwqyDr1@CN8pX#FK$u0>H=>J^yTND3=`9htCuc7So{_&B%7#(>QqxJ?(6@kQ+D(Cmc_K(%4rCF8ZW=heZnb7i~~O6z)>5%SxJ zT*995-O4k;`GN6ZiKY;;x9~Z?7H`tMDW=N-*_**Tc|&jk!ORM#IN%nJwUL!n*Z+N+ z#cVBP;xC^b=g<@EC!;}T#eUj+U3Ct&s)>f8eki02@6{3y!sC`BED8n0tJ|n@Bskgl zNZ%LOLU*_pO}rvTZ#6TEof3BnYHv*Q50a(of$Wi7MFbw5@?B|NIt;L6wjlH%98*AZ z*qTXecZxQ$D$SmQ;QJ{9g_%_=hE#H2P0;heoDfn*H*{J9-r<}TGU)nTeY6tc1&gT1 zEYc9cpoPzf2v7#{jEY^ZL;ARmZ6VwG2z2>%*XDOLg6~}$C*;TTmPp^U@_jU#=3&_0 zZ5MNCrY7r`Q0t&B>b054Jq>|GwZ}nF;lLhRuIl@P822zi4J`_2GWd}U&Je?n&y6`R zPR_>k4IE)labpk65R@Dr3Zr~`<0*V6{qtNX{Bzh1vU`q!UGbDhXtqtZk`0VyhXG%u z&=YLIHt8V!7Ci$r3mp>?jr*5y1lvzkc63wtb#uN@3`PWe22}K-VBVh=JtoMf*8Rck zDWZzG&T1_-WJ|4e$2ocmqSH0gU`KXso3IM!Y}+5)@zAcu&|<^OL)2aTsE^tLJ7M!2 z-N(C;OSf@lD5U>PHj&aQsMM|BI<6o0PKA9OS%|Gc9uy$h)F*J~84A$4@Cp(KdtJZE z*OuuyBdEhq6d5ONJu7Kbfm67u>t}p9bZ>2H+33Z$LLPr6xBKqxbvU$ATkz7xpQY>3 zqpgL!ecU!Jr>|II?jl_#(7V$4WYByC2(O4vJo}OLa6|Yh)X~HGY<3;FM z(J<;kqGd8Quq1UP3g9Y6h4KQEg(4rm#-9D|IGYy_gCQgAHQc9XA9X7jyaieF@Pk--_1=HU{dReHSSsYW*H zxOS^OrSzP%^(lm>cQ{})TPY{@S4-jx1fEnDb9%5!&k|%l-&)x&|4qpxNq0W7+ zlZt1N)<}m4x#!at!~aP_ae^pyF`S7B1Ch5K^Q~}@5G|R0aEoAA1G1^X*hat_`S-3<=)*$8_3`*~b55)*_nVB*w0GhVvP^$C>VD8y(BSdVx9j^WkIh{a zVWHYY>vyW3DI*Y(qCPKs&=7|`w`PDid;rzqUewRF{aHbC5JyuK0qOj!_N~DV^tL2) zJlyj1Ej~^lEV?8jrZnAkB?TJ^7VAN!#K+=mqj-bBZBo!SdZjfV>iX9>` zs!@r1)^ED=M}wg2n`606MZ(zM$eXquQ#NlcZ{vXxu|(b*Y?1=1@dVp>kk{aBNY>EO zZ;kJf`rHHzl{l!Uy1bqDeiP`&Re>m%X#}VBnj|G#3Wi`?^k z?asmh1i|v0e(Jk(Ov0XV^p1Ft5lJS*;NUP_@6}jL`7)G+`BE`dPaK=jdOvDkn>W&v zhq3B7m&sPcBZI||4hAmEIh@XI_I&yLzOfv!(Up64mTKZ76S|}?$DdXWeN7EZqL#SF zNha5n#@e^>d!wOa%rB=3<=w%&E{cLT|7;^pw?r=A8*q?fa@Sp^9UQ1fR`*YxEjXVM zyJ|W6aZDiT{cMZt-f-yLx*~4(+7( zQ`A7`0RjKPZq2UgE))H>59Y3_*N84eVOVwW45H+fo+-KHo+Mi>1c(7Low+e~6k|0k zsY(fJ+g}cp3*zMaCd^@r$bHa0TerqT%JAvG)i+V9RorkV^6r@{5 z5l6Za%@LkEBS34*FLWVN+lYXYn~+R`evgKH(x`5`;c|Q&m+A!~gxeNyqFeiCn-B8@ z`mRcn5-Z##8E1_H~l5 z1z&GA9DGhS*wjxV8ZMy@Qq**Cg#02msf7w#$3+8+QwFy%?y50Yui&0T*OEY~6&;YC zJ#>aBOqj@0MF3*i5tIPq%*vv3K?r))o_Kb)F5>T0#m!Xf-5mgP$9=nx_UYmJKaP5* z4Mo=G07rV=SUe%KLRX1EOJD`7LbnD?Sa7o|(yni7>~MS6a99>gdv#gu$=TRbG!Z%2 zSyOh7rh&x=jUyCVRxw$InZ)CyMq`R%Z4RAtq;%hnAZD=OwftbyGW9U}4lQ&1mbhsR zsg^R(ry*(>cpGU)y2#x=;x3*gj~bkTuUC;+cW!3(w%V4-YWusaZm9+}I6Xx-(cj}z z`eFp>rq#ncxW2$;DpBrns=V1ilZtIwQ<3Cbk>*<>_?-RvliPSd-WEZ{g5K=??wrxY z1le+_3%fqRxPh(HwFHdXX*ZiPUh)dNhQc~$Mg$(hn(9L592tDQQM=>WVVMUlw$ zP4HobkV4Uxwg0FODUZP9uQP_?RbOe7Unz#ieOrbMx3vcydMDrB@(O~RR=;?H)r8Et zX7$l3%+{(Jtk-5IHvIf|R&ubBQ^kFWzSpMrvinm7D5V7JbQWEhZL@!~33m&XXgbt? z1x{+x@VlnGJ>79bw~o5CiH|R58p&lbiaGu01Exl=fXN9p*FKu^pNzQXCr?@7W!IJk zp0j>74KpCVqxdSM)A(UON*NjKI8V;%2swB#)E$8Z(2`u|?TUqX$=I;?MucjD{K+5XszHI1KyfM&4$b;$fuS_%UQ$Tngft4ix6S)9f~-gMdwUtzNd zIyt55aV{9^?8-7wi=}x#J0#~3M-%vuw@h`8YZ;&Q94-6xRLiP=0t9L5N!T7=g;TPh z&C_%YNeGN9-pyoolH)w(%1>z~ptDc?;p`7$-W6?K#4~qULzTR=g#VV_6+lW5fT0szP1`Kbww4iRW;h-jg0-cQHM-n*T5{t?{ z4so^J{e#fqh@?ptov8sjyGp!u&L;O)!d&Af4IPla2Wnb@n>y4>g&)u#dV}?Qd{^7( zPM;c!T}g}`eE(&0%8oDI>+%?Ts?;y$Sa9DmZuzD`FXsP5+mESwAXs z(l)Id%$8so=BKd7ZrDU$u;BVVIxJ_*R7ly3{&Y&W!^V`nIThRnsgZ6AeDmh5fG#&M ze(2g3KD&FW(^v&|EXV;;o>)vgD(H^Jjr=PVV_lx-2-4^cCEpG4wIa~Seg|qxL3h2? zIw#>PTl!PCjd*F2SPvJB`llBpOcoa>?)|jN;D4Z-mGdOWJ%UGsno0omHp=U*_QCD* zhL&g&7mAwjqf9d&cNi9^O%U)heV*jM4tnbx#~Lc;-TFMk%sqE-Llq`>Ub(Yltj5EX zAW_-=u0xA?-AF_F-PMx#{|ndRcgZ{{{B~ohIvg7j1zB6-iTPh82yZok3WwNCWFp)X z0Mtv{eHE0xBQf>1#d^AiZuNQRc(u(M4R--;rC#dg9KTiP?-t?+RjZ!>mS^SVv)J0Y zTKat!hvSy>8(eck3;?1PBG3kDP+`i9CV+<8kICu_oH+z>UfTKqxaJNaiSJ^27?FYtxg$|0F;u#nKC0fMty zpn58n=;vH`eZAwo{z2RtAsIA`sUscTZpmTA^0e=3H21jcZUl7;)@tFhnjRy4R*;2x zTYGxPS>vCEg+@OY=5l4gjY?us`gE}J>z_!P9|{C>TyiM(zpiT~5_8)a%0sdOUd@Tr z;#)KM>I+9v(Bt4nrE8GSJbASkQ(U|>YCV*T>A>=>ra&whG;Y(ZK3fikR4$)6iFg^z z`qO?XHuC7WNNc;bje9zocG@kPqH&;OUoHmx)2Ip~;i}=^+(Dub0!AJhh(%Fw^q`vS zw&HS(w{$lHlEe!^@=&$_DVEnD#Z1pt9>Q^$lHaPg*|-NcODXSTG`kC0EYN|oLfa8A zf=V97rs2{&= zD^ewKUo->|^4tN*7@>6P?{Iz`Kap!4Rqom-VG|J^_buU z;~}|J{S(@2m;4%>C0Jbv{ud@xd}rz>F1M~snUaQOMOw*1>N%tQO?#{bLp)1z_^JWm zw8pp-Uz7OB#8U)nBdUh&Z;PN~OL`mj#(JRPLL;WA=N3Vce=nCDqK`(&=A6GI@fVL- zEN2L4umFIu&i7I|a#O2F=#HWuZchp2(y4=SbqklBU^bV8#velw_vyA*fvt$2XyNcC53jajqK9|o9y%#gO30Km26h4B*m18S z-=%710#nmPeF4l5sL-=qOvekTaR6uUxjT{15}Taq6wq_JfMZ=!@gmdYp_ML?mGc-z zjY_6%vVCY$=6(QTFc3#McSEcHk-?6CsgNPquk1^_DRLswHi~3aimKT(3r3W0Lx39M zOPwGAc2U_{)ssypiGAk`RI49~LGUt-9V>u2@|=B68AF_Qy=R)uPaZp6o<@_8}=He-lf2%F(79Ky8X2m%Ms6k+fP7bp^vdU=ukc}wWqZM{%FemI zRun;t^5Ub#{B)7%dxMNcKsDj>ET)QWiz2> zL^?Ag9{TzSe#G4M5FpwzA|u+czR|M#(!9N&^bkTOY*8TzN!La;D>3G|+iRght+xJ4 zm8}6t9gM+RRyGRvBqvc()8K@jkl9XR0e$P?5zdhhjshZ}^GXX)ary*mzfXcL6x_nJ zy=`AEana^#_R9l&>YrY<)Uo9fcXJS>)|28Uy-=P-^OOeEP+y{CxASckrrVlY`e$_( zP99s#vqA#?WCmkGfu&kHlVBKE#k9NP&_8aedLLDRdEL$bz1cii4yY6)`4%8$&`@a> z2pdlXT#3G_QS9&)nr%IB=RJfX?C7107*~bL866K0ZKfJ9jKQ(yPYx#J^ToGCgXH$C0s_=_Z`&n@;hzkY{vowo)hD!LA>?2n{|WiIsaJrg$lXw*vc(y!VVFy0WfyfA(M zSCNCjCC=d_!!wEvKc~-=!5k*dZ@?SKrwzPl+JMO2z>61J8&%YIC%(1*W(et1+^n!J zUcc(GP`XN$(I_R8h?SAeMV9y&%E>2Rg#+968*{S>-VJ5fa3I~Q3P*C;_@Ohk@WT@o za0u4YwvuCpd42GG#Ltw+<=<1SRHc==px8+ht8fN091o*wuF#8HtFKBRRDrJ_M_kcQ zcQbpfN)ACA62G_9fGA}iB`c6W+c7oX#buXYwd~e6a&L2Di|1%ykAm@uH;SPQ2zay4 zn_EKO7kqKuQ!}E7SJWHXiU(UA4<~O5oPRpAk(9GWC$=lQT9JfUI3d{_$j5X_c&7q2L5$!C`Wp77>Rn_lucvmGQIykMrc5WuK$01j7|Xr65IYi30rCobWHOUiPOtW#y~0NMB@BGEur) z+%K~{R0AG$7YUZM5K^E-KV4Z79m9}W*0VUVoYjT|^>TkjcTqMK;PfI!fa@WLL+Y^< zMzKtgKD%?XJpgiY~lODg*(;>Yec1d_4r#+nq)T`vRC|-D3 zLNvX10v#iyQG~x(2JUmwm~+>l*j5V7JNSU@0=gZ1a8tbAfCzUI^B-HN7H9!T4JU*p zEs>!=?7<*xQ&JnuaC5@Lk-Q8}(DiS7;>07^>$F`PI01!P>*N=xXO!J12g-P&7R{EG zV5@~;R^Z>V_i#Muf1MmOg!4fY>B_F#=LuN83d-U5-MV1R{3?CCa7|l;6KWXBXxAbR^O;=;_T+M^`SdiP z1`)avQ%V?}mlw`+@Rd%I|IZ5a)^yZ<7}VG12`knL=T+!=h^lc#KP(h$l{{cHVxgaSFJ=b_&nhsF|Ezq*z1FY{~UUS(7Mn+;JoRL+G@p703GYx9UPWJ zLpSZ3(Bi#X8;s&BlRxLVXj;YlnwJ>g0QzwoyS}2Cq^mtxg;BA@vIAtqrayfG7S*RF z20wgxF$u0L6nUIkjc4O5raYtIra#64Z;Q`5W!irS-ph37C&$W9Dq?22oz{u=keb36 z7VM+neT$EX4Op6$LXI+pjXBIq62XM2skG>2^m`jRR=$(a_t`g5(-@;?f*XgxVXg0g z0zC8zNpU#RCq;?!SG^=ZZSHG*UngcvN)3xTGtv+V>VfP@=q$fNE1F!tJ;R>1uX&SZPw?DMD|qoc|SUC zH}4;fxOMlra3v*RIp@D%Fbk&12kqW%e@i#Kv+fTfL{V4gb}V`gp;Rqm3fNMtaVA9Q zTE$u9d?|d&UB3)a%PCpxjt+!G0F`C9jv7aN;H=BZzKTWw@b@CztBp+cw_>2RO^B6I zjt&_Zm46!J!398Z2HZbTDF`m_ctv7YOZSku&e_M7ct+wF^gtWUi7N#lLIoiEzm^cC zCX)H?UvU$|kPb&*Fne#tplI+&44Scrs3<(doC#-?jswv=Qz9t<2;42AUzO&(^f_1z z+dCNoptQUC{jJZ`?{&XuJAk^|Lk3?++Oqm(lTWK^HV-inXb6Cdx@E3MS1#TvrxVtD zgA!cRiJ~)ZaPIgI(MoCz+-+iEkM!H)V6@3ifPhmw(uZ=F#7A3__IBbqMC-;lO;~8t zS|&Sd!cRWLEjZOmH{)0SBE|-F1>^r)|(e74bNP zwi%X&bU{>aqzoW5S`YTRh+7gw0cqW(_5;D8^c=uuo-D@IC zyC)DMu0}G((~{>7*{S*@baS~1JgfFj3-F`gKxD$gjwSLVDxP)5T+Oiww=@6?DCtF| z_|?1~B~jB)QJQ*_@x^MM3>Xm~41hDTS5Eyyc1_dkU$}DD zGrH#_vr-W40JP*%L|ft+$AU}39}_{TV8Le9BQ+KelCm2~B(d(avq%|3$fm2-Mxvtb zhUg$UnQ4(`YkrrhYcrwcpFKXjj$F`kRm@!^^I{OP`59BHVsTr%|I3nF7T(6QKE14v z1O|3{LWU7FCU^n3Y4L4Oy_mo~-}X5sU!Yb@rWcai2uj;Y0hq0IWQJqwKE;4)yiN3H zx67L?Yw(NpqRlAKF#VSb3AcfrMQ=dZY6K{s=P9T#m;uuOIEtLe<5G(5N%!?>>DN&W zDzPrA`gvL9-mua${qU(hT;1nH2am07Mw$cmmeDV7xZyyVWn9U0Qh337QI*~;W+FeY%E2u+RVQ2sr ztgQBr7Gm_PE&y{DaQ!7;Y3nV%2Lv_Jl=IgJmkf&aSnt=g4Gm0<-X%xWhpxMJJo?6_ zc}4ucotz0SSw(G1-Gpd>9o3NL#s{0?rr=BJm_H5mQ#q@FZ`cLXSq}^OCrBKVIM5qF z%jMpMr|E0uelvR2rJ>PYP3PwrBN-|1+tA7U3)^5#Xn`V5W+2^8+i&DVNzmd>nYu>* zbXq5SrI>s(nhp7TAC7$TsE{Szl! zTb>8707WE)Mk)6llew$zsvW!FK3raX5gk~aq@MZcBx%lSGc=M}eE?PR7@6sod8f- zEh0`T9rLIsz*igH_v=FEGCWal*jK1CPw`=3LWoU5Wy0KO&`qhA1mgtY))!&0a$q8J zhz(^uS>|opJhVO-LXYmH63y>hfEB9|}XGM=)Pu7wTg!~xHl}H=ZVdRl2E4eLj z|9pO#Q-iTI!Mxm2j|HfCL~>I8EuqXW!L$q`V_rlyZyz#jW%q~rKWaZ;pqizY%oa?# zX1dO|3eEo($!EgF$S4#vl@S8qK_ZJedrL7>Ft( zc(s#^4&k6BeWmS9C^O|w8FT1zyyV8e9zq6S*J)teU8>`WIstpxsAI``^4w2rhcVCvre;twRIvE4CH(K@0wx-h`-UIFm;N zMrR4vE&0-?RXOm`8zQE>j(1-A_1V!nsfVx9M6{B1pj!2qLBb`v)+TLdAb>bp$C}qG zhv7OOFp5W>(`oZ>ep$XwItBcMvqG9*zfeU;Q#@@CF_SYzJ|D- zC8Ff?&Wqk88M#Ksjw5dLXAuz0I-r~LBl6%rgq5DZH6}&{+GJModCc-Sflz6}= zb}d1(1d#G;)S*{FC8mmv^~yst*~Z{!QS58tt|~0r#xqaQK~~)~F4MRia7NXuLT~+2 zf%2(jbCD`NV#I=^%)$_RqiK~Y9uw#iu&|S_LL|F<|X%G&0IDM$&f}@R_y!4Pkusb|+0ZHFG zv8{5x%UM0Fz+@`BM?!M>Ted*v|}NxOq*!5dG6{=7UUaPQDC5==(X+w>0-PLlV0tN6F%L5_xj1Y?F0{yDW0NSZF47C>I4m4*!*2gIbCBzAg`h^c(a{Ucb;UM#oi zw0gROnf~D*kvD%@Xm3DjH9t$!G5?C7$Tdhb(XmP}h5G0*+7a0;4orZgf|~RiHU-o% z)*p;$T?glM6E%1SctKc|bbF{peGiIFBlzR{F`0CS zA;@cYiTo|?j!pqS!Ni(Iv>|x&N;%XYkPX*e`cvAW4fX>qwJ+6$Tu=$}m5kk4f39iG zRV5>s{lf!K4X?gE=V~6fMCzc)E?L}&*5(p~#42?YpbO0WD%}VF$b<_w&HVP$>KW+w zErU%#4gJ4%vM49R!hiJ7Mj$AMSJoVLdu)UpcdvkIgx9myEAc|1k4Uwk$$`?=LFFw} zpB4uj>VHw${K(M_Da%ze+%xf(p~Aq;0iSN>KfbpB#+RhQ88HA~EHQ>&*Fc3BCP@H6 z?YX3$M>l51e*U?ZTnjXZ)=FS(XaBRz#Wz}O-?J4Wb_%b6|aj;&_So*=a zJ4@yeN*?O)GPPaF;hd!UDj-cBLsvgG<+Gu8Y40B4_ZUvV|6-u_aVT_U0R(ADz4bhv zG^hZY&dsn&p9IX{L$^IbpNW{M%J+%rP-Nn>8thU{-m6i@Hy2L^_&P#SF15dq)d12* zekv_x`X(L1ygc~whaGN3KJNhqBaXEemlz5zzkf@ccV%iJ#NmTM8!uJ*0j*1Tm_Yzd zDms2lY+xSU;ZidDhMsLt9aTXRalsfU#m&k_#qDs|b@1}eajtpvB708!&BP^Q3I}Zr zq%0t`hZhU)v+iY2wQ&nF4#3HcIZk@UI{$+Y*coPG2#Jo{Dhp9S7|R*n?!Z!n;XYV_ zqNZB#%%O=86j{=t8?x@m05qNwpqw4UdQA@c~z}GFX zL>VdpTgMfp5IT3QNIU-AdL#0P;$E_h_y(p*2J#Yh_&r^~bqD@AM<0?0YPw zxi^+!jt&fk7h1Ua@NO^P4~S_utb#1*nwCY!g@l7HgQ7(4V-B+wu7Hi80qO*YHiy0i zrFzHn7(>@8p}8j2SD%G^^{^O}ZX6Ahgvw_>l5?mC*xA{5Y9tdsxw&1d?a+W>g(6LP z)Y5T22*x|42Qt`p$Hhq6JJ zhI1{KtqV-+SEch)0$Wm0@D0J{bIs)pQ#U!>`Rx$FP4t8YjcsXnqR10*2DYE9 zuM+Tkt`&7=G>6Gkw7^mVSRBCinf7@FRtN$y>JN+4{y8ChNftd=4~>uDKfUQTgV39N zu|*6Q54*sTsu2Kv86$lGs(@3nG{L1`rL1lAg9A%q3`APgeO6(fFDCB4J! zu1Na+3_=&az`Q?ib+jk`G;H*|frr}15b%4gv()z>*IG`epLlX5Y8-DjI$d~o-zE0$ zYA|4;H#kqvm6~}@fTWpfWj4Q>3u&Wwqms;GDQ~*`u9U`^a0^X)sB>@%<^zS3+@==N zK204ut2aTWbp1Fuq7)ZEERg*zhrYzVVG}x5- z$s6hbeT3mMuA$)!l3dYP3#HH{$OW<@OQy{A)#W6t<-<4`apYKelERuq;kZ62zv!ORAG07RTHX&f zBQ(mz8Xj&lcX$dKJd#5&^reC_o}~tRtvz>B)cWNXCK5f-(9B|iLdTUSCrD|dJ_NsK z9LVB1LKgv@wJM&Q(MvZK{xbi}pN0J{f-EmA?Yzp$r~ML15X5l|{f<60^pg~@4=YhJ zK0=i7fMOZDIwa?hq&ii9>+{|H8u-8fM!}}u2Ph>6&|SEGKd?!PEy1S_duh^+WCx+H zKo2G9Znv;V^s!~1FICgg%a1|BNBogkju904BlH0FKAjP2=b6OP)RT2K?MzGKPH-MSx9!`g?0fkhi&s$H zbv#zW;p_Esx})1nzs_6h)X!$+^ZOHL0ioWi8^jFeaJ0m61AJUVL9NOMCpFu+wV)Q~ zUvtZ%*Pfs_qPs*y4LYUIP;3N?`> zt8dc0=MN%tKe56gun zO^ncbPNv&UW&GtgwEo7MG=$?S7{OOH&$?8qq?8KgOv#BU3Rb7VZe@s`6k@7rI(`e? zi?uZv3T7@gv;Ln9tt#sr%utWxsMRHwYdccZ($zT z%&Tyz!Tn}=2ZO7O0gEnezu8gBZiT!dq&C~W@~t~UYqCsfu^8ShG6KIEzlnYhtQ=(S z3Q4X5Ey{FivM)>p$d}d}&u8Q?h$aizt9SDF|6=&KRkxBMgPCp?I_Gh> z7rc|+p*@E}t)b}=&uB9bdK~g@#m0WqfM_ufD2x%>utE~~OEY09hUy@v z6Mo)YtWYJvzr1Wi8^RD)o6WOQE2&B9i1qdvC|kWODCfNe-f%bpxRc?lAQ7XmGA@P( z+loOy=C}zy8j2cnew+j+{_i5i@Y$P~Jz8leZW?OuU)JdR+kI4{9-rfPF6gHjv7Jl& zjPs0=Q{+VY{I8DXmCAq~HhpR!vlt*#Xz)|PY8S(=s3jE9>4jB#O#cOm^X-_iv}qxiI-3?n{=ZD7d=Ymuh@df2xbb79p-PWCNzCqh(xkrr&I z(hMeaK=oWF79F?00Cxen)XRHCvz1$eg?Slx}sB z{L(e&K3VMM5UdDl17udp&YJx#=-)#3#gUrCJa-sRFEt*yH6 z)YozGll-@N7YFkTfhr_eio(E)o4q%4XGVTDzJZw<%Bf9xOwc#Vie+`i{=Hzxcrgk! zA*}*!17rKIWB4^7xG~0BhgT1U5V&1ZuE_P&dclz^&#DH$FCzgkFlEAw;R0!xBt4}0 z@Klbmr>g(EB6?OquNw2Bb%dFSmQJ4Cq<6e;yos9|m~kV%N=v}q!zNY}18kzdj0Z2f67uwl$+2Q8S#&M>dT&?SXBJlkEnZ;kQOrO{!|O%&-=;|6 z6z}IBw?!TSq-)^(XxQHfGX6I77Z()<@R8>tx_|@PfyUfkBx1uXGs~q(5 z`kWf|@s-tdpa4)MfCBSmAslD!HN&5Ms?gX=`RN%_TPeTYdzzhEma6~KJb}fWr z>%vDRTRy-;_75-l%)Eybr#G1!&?6GlxK1k(8I8%_gW@!|-532q_tik)@Vy5a56m#j zko9Fb;G)ZZ-Hl|q29SeIJn-Xlg7o0@7nyA%PH+sT=DQdHmg|kQY@ZBC={hA`Kmz*n z=U;M9YX0IqLeuJb_BW~tK2h2cxs>%!=i8b*VI$0mJU>Zm5^kC$92OgnKDON)aEQ`!COd z3BeVnL**Z6gswSD>+|LN1TUt(ZdqL!uBwpXY+1{|ttV+#1z}fun8GbaNB)ef8Zorj zzclU!BpN``iD;Q!rOSM2pEwST+M^=`rUe*X%(Jy46z@rzDIn;pkaG{heSe_!E@l@Q zHy95kEqBtaoeO~1Q-9RK>wa;J@_rPGkvtO(b6C!6y3s%l8A2C~>yGM`OSxOWx(bdj55W{rz;b-gt_IuvszdPW*CX;mhA%Se5K`4PZf|A^%I#(<%-^!{mnlVR# z**w8GeBx|248#aNb4boH!S6dKA+2<-Z_DS`Jk_tCz<>CiORH&9!Ml0#&&U*VNvelR zBDG7|NdZWc+0!#Re=llW_9`5Ol<{@12y(*|4^D3N8_7lm-5nBt6=5PG_&vFF|X#ZR2 zq7pID7@~F2G$B%(=Lu)3KXap)(RFIR4x#xjPsMPTzyQ$BUBs4&5*jD5+r6wV`1zXR z;07)BJ%*}be2O)bW{Wd9ttlwf(sEFOUm+70_k2!)NPsi0aq)JP&Y)_$#&Y?_5?;fs zx(U3fkwL6ct3rYA#{e(3L)ZAI1zES8^>j603f0 z1-$q4>HuqWLvON-6^3Cv(98JS8Ej+mo>yfSqW0`3=QHmRUxKx$sl>L|lNrqev0tSC zy=#^mXzx<8bx31)`;)T^fOYX98rz4LgIlqNs+Hgq^23#VEdT2R#X=6OZ?MwR)hL$f z`6r;GaN~@bx%9K&$-dL=%h`mTPm9|nWpEFsH4~Y{;iWbrKV-8g`_Yt>;2=8pua`)z z(SvYnW$U~cw|ZdJ(Q!8fZ0KGj@6&Tm`AyEz2<<4hBP*NQq8%))DfjGa1e40Mp$=?h zwpu0-Dx8>XoDPAJdd=QGUhJbV))5zwgjo3nhjudLfiZ4<;#eS93y>{PnnduV@f}K) zDO=4t$~4e3W~2N2$Oa5ZvMgSUpALh*#XqtO#^PcXuug)uJu1JB>=J=GAWWEFl1~C$ zV~M$`Apb2^mI)7)U1H)V7{3LYa8YK{f9dNa;Lxmb8MOw$fO7 zf*APr9EvG@!V@{t#id3Z97U?tJb#-i%yo3TwKN?eJ`5(<@;s$Jr8ie$_uE9n8hu>y zBeWu?7!Px%m&H!v4yW7jh<{&#!)P8QW!Q66+xXG`e5`}9?JrgpO|N=1jOoE1iEij7 z&lh(QE+7gOxQOmJDN+T>b06t@3uX6RzJfU^kUW>6;htly= z=H(HL!$?q5bq=VaFY0dJx~~yhgoPv>j6! zG9%h~pw1aYL|-(Ze!uJX2&HJkNBGJ}4)r$1SGSr56dJMu1882A%a0o6P8b>>6{^nz zCAJz-Y>@KW%y5am33OZ*sehS>DpdJ|uNg$ca-Kxkz)DsZz=d3GIUV?u-i?y}5;tr=q}s(6$soWf z3}UTV#j=I&)-!W1)b0kH!`v!yewYypk9vEqU&@0%!!oM8(a#fRC0y3$EA2|Kkf3J& zcMsWQ&l_zQyyr?+kF0%}OQ*)G{Objj+8+bDYA@^yES0+)h`{L@qT>D|wcp4P)X_~j z2AP+hziy?%1VU%I6E~bKm01S*4@LU-w@hf@VnWN9U;Y^eD>f zPUF~fZu<2Zc$QP?_{4CCMU(KF_R$*d4Rfql;9Xp<*9x z;=9MWXH=J;kfS>y}()zo!2e!QPqHp4O1nrt|$k-At zgkm8jbmZ?xDrsD0@J67r(-WBw%N+UuQIvkR5bPds!dr@PqeseehKw`r1^W3gG z{O<+`I4T0q`K13?t-(jLGuQq^@$8{OItNw)91uV9Gfp*mhc%!AD5QQTCs(2|NEkX6 zH3OQ0r=$Evgk~pX>@$4CM@lEBy0H~se6tm}&kb+!o2|{ThJi;Uno~o;nUMMCfduC1 zJ6%jZFBG{NP~8o;+rd0Xlz~i(qdekK*+;kDgw27v!D|NOx-Le!Ynpeh8FV=G9Vaf8 zkHWY`_t7wUM8_>aL0;cV&C}bdto$&enpnjq6Dw#ucf-goKEpbr_KI3y{!rGHErq2nFh-5yaBO~htN^K!wX6g! zgIK5cdiDQLq09L{*EAO`ggJ$+61zv=NAu}MMK8gA1K{}HO`jq6ee*Kc^sOVldx9dt z=Dky~INO-Amw1I?mg0kbUA4Cv18*R4z9Z?4&)gZX8J13^$5l?+^9xK(wR5EBUD)>U z%!D{y=yGxK$#tiTAM>FY==s~3+~DV-wk>udgqt?l!;!_7Z{y2_nm3pBLscf~%Mp_M zWF2pVp|V_}+sn?TX)~!MRo(-Z+rrT<^ILQwK_AIhO3Vx7SB- zsJq%vwUqLsQv&viBk#FsH654=E_in`tpYMii&true%t1BI3Si_lP zm0wO9dVWC+IssDiu((D(s1?fp3PO`{c#pe8{6Q}=pDBU}lF-}nxV^Bc-K>rtf5s5R zHp{-fZYvmHSnM@C>6LdS1^VX^J3wl>z##?TD+fhik`?fD4ybnb z&6a=hT#1fQXU#vsl2xM+_lSs@oh6Xri3Sxyoqt1g#Dy<$NPf4z=uOedVg>RixQ#NQE)Uo$jCC>Fu$JuZA1JNeP$~a;6@m{eB}-*FQ7W> zbi~6^#+?JJNTN;*2WSzFURzsqde|FDLY3_QcEc#`Nw62;f+CTZSV0J)8=RJ@cOFf_ z*6Ux8#<0{|#(h@Mj|0JzeK?<&fuGJI(%BUt=B@rxWWx?u;%ASayFO8g5En9uUP9ZS z{86$k{2^eCni5(7cDrE?iRV_dYPx^opXx|fNf@kCELOc5lNF| zeseq&s5skUM*$1|q%`9p{s%|WqhV&8;*@jRRgSBg5c^7%EG>K6n*Xj;&gUK|$JveklZZi)`JGDS_M68G!o*}u!*+o4vtpeyV2TcvBlF)%h$XNr){Qs$y2m&7=3U83oeG!&c8+pteIYaV7=aJbqSK{z)#-tc|0{%-e z6TmZgoXMml9b9q-6zV3zF-{R8;+*#r5{IRu5joa!6nwh4^6rl& zhwst@o1;ZPqeSll)0tl80@Vlw(J_aI4jh}qZ zJwq&6lHs?jHmKC8X_y2ZIwmNoqx)B^DdS8Qp1phj2SC%yW|+8*&~Xp&YZWLa0||&( z33(1T#+Fh?07w8}dTU+c$v_R|&c=#)Z@_#F1Q}0f&{lbr$v+78;(xm>FNq~U#@AqE z-*QEZ*Y)z1@!+Z$hwdWk?1zGB?AkA!@Z6^ojcN?5j98eVB)}wV%@))2ODuB;;}~9x zQbloZ)F3#v9ONG3t^_X1_%1FR+(<6~(#tonz^X;O+6Q4)kp^K4f1!Q>pUglt_88e$ zLM3u;{`aqLe+$AC=hLVO`NZg*zX3Fd-5 zd8m75UsjbI0e;1|(TUysj8$pRfu((p<^>18KAeW%U#J#TK&;Z*m6A`kHrA?S2iqo$ zMR7EoXRrL?sMqjrsiwjVuL9yFoz);9PnI*1PKcZ-!DGeg4df3YZmgjI-L=>CuIbeI zB1VeF?H%Hdx|f0>O{Nh8)?(8gvR|nqq3vy2zl8gK)mL zFI6LzJ2s>ntH%jVdZUR@$T?IXr3{{P| z!*?4IH+*tOzK;EAgW>GRId}9J_q!_1)20&b*5}d`M(~s}1BuX2&eI96o4T5IZz8c* z?`x!TN+?a@ix5+Jmud|y<-AN#3LRBC&Cgp4k1ly~}wi|POtGS*ke8}Sl z=s3_ap9|Lq;yHdG9)LMrBqCzBFa)Hqhs;?JGdyW_T&<#`%D~aulW88|=WiXly8ML= zqspP3hHW+K0%Od*61Dn~CHa3}PPxfmWjTqw!+1oZe5?mLcw$%phA%Bd@Job1_gHr; zHlvLIuYTS)rPp{Xynct7A^1i6@2oCtBeAUi6^rxMGYP3b#kl#vp+ki8pdsFOUF*}N zF;C#^8O?5yBQ9n8(J2Lu$1oUnVCHRa!=(6*X3dW?QYsjDpwtJKe40O1yMX(dbqQU~ zwI&0$KDS(x=8W&*mR`)&JB%kqfcZ1es+u}@b!|OOUnNiVGe~D2jzrXF-bLZSXqcW% z;10|X`XH^tJ~X6LfxW{CloX#wO1XzJ_qSLpE|vT1!UqxKWXn*WipDJy;aC+oabKtv z5P6qswPG(gzuMWvlmY{XgVE6BJhQKr9)0mBT=HkKMTkGPjL zo5i2w;`y&cQLeMdrw0hRn4Ep*2zoz{y0@2w1A6Atl z&DE8|jIKmVryzZI4wZh&FzRIPcksnJX=a3;$JPos1Jkc()Q050lP_ho0t;kj-*^kq3EMRb)#b+>GdjnTF(*P{`z?UP+N)Ige5P}FXR^~2F(gb);9Ik) zN#_kv3^?>alO=d-Y@tac9wTD`DFC&0sE;2{)W+g}#8g11W2#G@71{#QW zkZNkUawt)=upd7jYDSdmBf>O}hi3$mrOm@hz=5U*PiOSGD65YM=%z_Zp1tYSk$MCWP{P)3dmg*f@vveAXf#=TR2 zJd@i~UhlTKPIFGt#TRd+{;Xm)wgD%TRO{HT!~47N`4czbuVL50V--V=a=slvF)CzV zlP0R7WC#U3(iJ5SkcJC4tkqrkBV*3gaQc#nLMJj2>%M4?^+I~U-F(+$jz$>VU^S-j z0A>E{sRC7phByH1p!edqh}42F@ya(7OJ(FD0M2}6*I*~?5I`!Uh5;|}ffZRe2nb#a z`_F^G;p@#dHQGo7Rg&p}65aNjFO*c;(|FyT54KkIrR7SwPg`DJ7umIb7Gkb819^dG zSfO&TTX_V%`q2W>3gtG6baipqpx`AOZ}hysd$R;7uv~maGr-k^1ejp(&7Id3HbU92 z({SoiJTi)j$vA$dJyc*&%XI4WD-3>O?hTWHIV_0URw+Ed_O|e6C@i1xsnU)hf>Fp6 zbVt#(4?cvOre+`Ec_NWxaXS0u^@+oF-2oP+vp+*1->Z^+!Xml2W9T+vCG@wOcc0V? z_ELxvCXJxWrP6%d^(9Vw2S|tvor;ghVYgetE;h@q#GXP&2+bK=l=-B64LbS0M#Le= z<|PMVS=DHH5!Mw4eFm_-Y0=J0Wv(+Jv*G=05<`{pl{zpxW@*TaxUN=POo&xef!uyD zIt4*``oX@s3jP zzhvOK0ytm%WvZC-$nw{zW%eo&k0r^kFwL~X*Dg04$X@-ZZA%t~?kr0X-1>#r+Pnew z#f=H`()-Q9c&N<;=3q#=^R?10g9+|LmkbD_eK!#UxI1W!R$x#0GFe-U$9&{QeM#WI z*zbj%Xt`HV_t+vaZKa{cN;XOWRD<2v!gg2cDjwWJWl-Ou#=J zS?7Xk!!Vs9nZ$*SrJJ8|(LCQY_e=RZ=c-=cj;V1y4<`6jqU))*EZOradS%1cvoNt^ zps%X1g1-`aW#C@sB2n>LQOF>1JSSL8oXv!e`_T_gVVi`m37BR5V{)@QW&&sXc*R*o z5&8Q580`X9Is}uYBrZrGZ%%N_#NAPql2&grWN!b!%SvJ0=U6~KqE{frTfmMXpyf)t z4JYv7gYo?g=p0U(7u0Z+x5Z~tOivE)*Bs%`PwJspqM{+PBz9*c2s0y1-OWvD?SvP6 zOneK!EJl{mIA5J;>q{9fvD2(+7VVWj4+oSDphttZ6j0jNCNLVNHl4|MGf5g#pbz8B zhAj$R?`lb3tO=F=B3|$0NHbq8*A`uhuNYH9l>fx5&w5sLjAhgKJ`oCO7-oyA)|RgJ zUrizdxp-%NQ&q9>vYCt#Ifk%3CcxscF8@DQr~_hM{x__95+cBjU53!!=F|UMC>@u# z>Q=$mJsRb942GgQ;rd!JttQUPlqaJu8pc}XrpbpA#p${H9IKEQAHHrqxmky3t&-%m z_1?h;4?>`!W=wDECG#HWmcJpiZ0_jC`h_usH|zI}20g-9tjW%R@4d)`5R+i0idPl& zj;m#HVW*0JPjA$oqIw?i_&3eH+1gU%sU(A9-1|$bW*h`QU_T+avB@>bKo{R#tNjF) zlc-)z-yp|yV^L`nY^w>&|X02HuJVLPbF8V0&nZ{M!Zq5Hmytju?6v8x{MHsM)2TH?27 z;_LK8W-4h%1G8|hA>92mhrG$5ohB}%4UB;P);r>;$0gQ<x$L> zoCu+RtljF(>zn>g1Kay{n!HeT+p31Chi?4uXCPc;`t*%Gjmz9B;4WHHW2L+c9`7*m z)OOBjNe*MPv7k{^GBd!A7$vx%F}Fk~#dNm1v|Ca^4a3I&}l_g*yI`UXN@=31KFL961F^>egcB;?39ht%)2Xu9lxP&*f>{JDIXQI~u;mLw{5R zi8C${Y@B;N&H+<^imt_b)L=bLr|$HHT?ZiQ$h==B$J2VbatoB-VFjMB;mLG9NUaT< zCDN*I$22(LgxN-&^;v#ox4UT<>ZN(73(?jzMidms=|_zXSz4lKl%Gsl(@c(VjXJ*k z89Zi0^dE=9-K+d##$>b)35m+PugQwcM~@c10?zX_S+JDPCI`7V>yv2bR$#C7spKw~q|q-uQD0w)wS2d%T~!Wq=QE$~uh%)BD{>$mWsmWtbnf3SNI^X%aJiZJv95Pa?SJUy`C$B4btSnP624JV?yqk3guP@oSzy`7;Zz1}r=oWo&osn*j{ zKP-;^P}+6CMbM?Am;EYRqH#OBk{M_yQss?&Ku;;3p2fR41mnEpGPkJ_3EPtmx;TMx zG1u_K?X{~zZN@f`<+6s|YaeNfr)G!f3+T-et2-~=H_xIPX2*^xP|QZzeuF85w_+5j z!OdTx*8%m%a#bb0?Tf;(Q1p_$aLPrse_}fu)T#PTA3f1bSMcK{A}MGGTvvePzE7~1 zY=wjqiW~60HCIB>t&Aa@v0=Kz%;GxO0<};BLssI_Xtt8Z!i7IjSzQ1B9(_j+t?W)@ zV%-B#i;Hk^j!8q%1F7vaJNyY1ZJiDm=*4k8az4x)dR1c{CK;#NWzz&Y9{GT5a`LyA ziW`{NASfcCaZmwI(9>Nacd2HjA%Fuk-r=hu{M~K8qf;5G={Bp2MSZtaL%ZYOMk!5)5c(Rup>Fx(@5uTVJ5x zo)kH3L+3Ldj~}WB2mT#--9ZX1TzuH2+kY=_M3{(LW$(UBo?h02b3juR0lazgA=rRbCL63@m(QQS5pWQlt5=bi+2gKe*`+ z^QJ>Dkw{|OP|Y{Z5UnuyAy;4xr;P$E8F&{m2NwEjoWtDHY_B6^T*hQ|K3Oi5&BV;8 zmmqJc68yIFPkB(sowRT$?;ZliJgLdVHpU?<`L|TdF{<}Lk<>s64C#f}yu{R_07ZNA zKO1i&j=itN<{?J|4c-b=YeKO;*Wz*kNDQ(0_~5^Wv^+TGlVUUxITxmUl#WXU55+zg zfJxw10&q=7jE#Bf{_*tyADXE5UPRZ)(fx9!|3!tW77Jsko>15*_%LNNpa?)0flS`N*&*1$s_}n*jK@-Fx1w+l5Si>>g;lYn6 zSNUN(f%FoiVubQf%?2LUj}63@sZ|73r$wPNO>FZJ!u0c~{Z3dR)QlLye>@|blk<%b zF;C=5k5RcXYSthMiU}gztYl6(k#c5BP}_Pl3KB#@0EW{ z?+m(5o{tinhc4LMkQ4P62ouW;`fuk1l*qK3zxyo<*A`S@b<#Civ=BT#_pRy}m_wmDukds(h&@T+jsY`E+_6(XJ?z7b%yTEydXfrW z79!5120ghvG4Wo@pU|x6WKY?n(+#=oXD2-&c_o5cM2*`DPNh3QvOyIhZ}|TwCMQUF zy*~~$j!Gb=BU^t`$xqd2-STkB4zDUW?#|hQYIitNeAZ0w^iA({!%+)|V6k|%KBTvS z3}%~m(l;$T>O_aeJ~$O8stU4J%y(JABgr$(IwPF~{1n+>_4zRY00x;OQq2_$3g0HY zN3PR@&X2gb$ya{G)pcOw80r=t`ed3)vb^ z`ErunUC1Z4pcZ(5AWuTC_Q9?Y=*_T5F&i$_Z~($)jp;~^uB&z-XnJ{AA1&-h-ni8<}@qLt}k_$t>k=Q zjC~()I3z9bCoY`|7ux}om_S7&ON1-X-;Keb=f_MgH@DM)<>>88h|-Ro>2%%oAjpv! zy^xCvXE|GRqulx_HU=n@-W9FGCa;S_jrBURc;6LP?CbjdL&n0b#9k{5lX2F=ZVxIy z31uhShmM{2V2SoTZ-K5d%!0i@Uqu7@la=Wum%w8k0HHvrzjO4OVM~c6Sqwyj$Tphi z8eX2lQ45LKKkQZMf#buUHmV;OOa=;Ng8KE;V>eiR!NVQidAj7@jZp>dyFwdPamSbfA~rs!UL#M|W{ z>HrY3{4WGKtWkLr=C1W(be{O2?gYB(h;^th7w1v@$b@*LAccC!qBD}`4ZG7{v&X=0 zX{9s+@z-iJH~$Wvpw1X?9fG2J%PLs~a^{l}Mroh&sIgx0Jt-PvrXl2?q7dm&1bF)y z-LJo#TNQrjv0QL{v$ipC*II7+j=y%~{*)UDCkTq-W5uRD*MTyME{8%5#!u$UhWK0_ zXBYsFLgqiS{>izx)RN!CReB(;A~#SrN-zOKgjN>?fac(=SqiREBUbs_{?7$&Scd+C z(DPv7IW(gR(aB~*qjo`Gn;%kx*6m=cUaNh7tTVL>?2^psIf@uxW8vb6UfkX9gkAT} z6u_;hJ5G|pp9k3f!hossflS#z`qRO>NM_gwTM5tEbC?-yBdV|Lv1<=}<_FUmERB9r z$@MO(j5nMFVCFOJ4u+!308GVVnv%W5ahR_Er^;SjJ`jWyV9gd=`RdJCtBKZ<{Af6t zIfRr|1C%(G={rV-qzX>wWct$Su2|&&({;F(nKBml!}X>%{cy$X95{9TDF&O{*czAM zXu|s{E30X6S?GFxscXulWQFHH7GVWP|4@|>0r!w6g@My%3a(CKoutj+h>gQVA>fq{6uy3efDULGS;ooJ1u;*QOph9yeUj+*v2_q-CIygiyuP04Yo)I~ z^?MS7hERWfqW$~aez_ga!w9ygcO=s)mLA0akrv=75}y_4J$Z3MTVyXys3L<0mzXeJ>`;Fu`CK zm01s)^W)uT_}z^`GZNY&B{LH;g4cfDm&nykpiz4pn+YR7lV^p6}a+uYSCCMuBCQtcPP@%+;6W zxCtb0X?PRyP^S*XVU`sxWSH7(3@VNo7a2;$6CM)qQ@@Oj)U57~R%d9bXx_g+RL$j8 zi(&F9#=~sYl^TSLTEq1_r~4~4I1T~wZ%no&*jGAEDH-Vb=)B*=e=9|5ZQM0_F$D(A z^z&4BFt%c?o+0V&l3J|IbUGy(Yf9A`7I{Cd(QZHZ=((1BTAZhmYlqz&C;o<}s2rc} zn#ivJF#z6Zg`m82zxWhPM{?%ftXnCVY}lGp#*ci-@O1dM=K0Z1z}UDt8VynB)!pCz zBR)V%v7~LuCd>3LTtu3NBo#K#6xspC-A`PoZ!f3(np&G)&E>V{>QcfaWpn|DxBtZO=$;} zH#NTPxN6YNBUGb=XoV(c}SuXs_# zwxq$F|4PNdl2h(bvBQf%Li#6hwZb>OcWgcJ{yN1+9(rY@jmYkf__;aDXv6WPsaV_VBw_x{I9*Dc8R zkkEf`#bOllS#+ui9Yvr7+N4FBa24b*K&|H3E*Wf7TIUzuaFi)#rY5rg>VQw5I!ocL z8?83COxC$#wvw=q5IVO#UH|QIkv6upUK3T@dl)n4)W0OB0R9uUX~7nbP|xh#HMPFo zYgQ)BJ5H>Vb8uQrfvqaEyrRDqJ!LTq=+BmL=Sq!jrgM=n18TJ|T%Vm-*YJiaP&F(n zx$Vm=65PDMg`}ZQ9aUXgS$KhgN*ss|-pIA6PCfj29>vZ!)o)($s`P`FcK3rw@l`Aa z`xoRa9%yW9Mg}au)3=?XnNs?LMiAXH7yWF45+f^1blJG zicIb{K_b}?P2)3py!jS|rP^`q1<#dl)?`;MGuHW&#_NCLZb!O4=-1K)y^P)y6+8=| zF>gla7QRw3%gJf`fC&ht$xJg$JzaUlfG|R1viWH34cK89Blj}!J4InJ*_v2jTJTRJi67*%|QS^obo z;n=!J=;U{)bv0OSNxNR}t??I_xTqq!1K9HZ=%=t5uqROM`>I~)97Nhp!|G{%%1toO zQEdVUP1C%p3KNzVv$7_s+_p*ZmsaSj@Yn4@ZhiMd0EhKjK<18LwaHH zk-o1Ime>UmY_fq=i*9;;*BZDofwRhOXRQ(-(P zy==xIR?rr25WnI`p~W=JSojDy@XcT~ zBD`mwPtST~TzON!JNS?6pIl5IJFst$wYeZhPmu90M3EnFUGS_SW(mnSp=YVgaT^(c zxbc&c8$)$mvMm&6Fv?@Bb6X^yi@+Ooy_SZrIkAjx3v4u8Vl)+BWQTVHZ-9f{V!fYP zb49~;Ma(@bv8jsY6B;Ho#nAtYz;XNgYky?R1}NSh6tz;QBS3tV7e1c>#++SvPbHuS zDzTS=;!|@T6(uSz;l)bj zZpmWn+D_Y(G#LwId)`x>cP#jN$YhqGH?hUCk>ekBU%9Jdh`89W@1= zY_ss%sQT7zTwdJn><^i8?@?hCa7o~$Vn2(zuNi?w$wb7;T3WwTL6-Jj%dj_M$vEv= zwNKxUv8>4_8cPM`Lu#N&v%MGG+=)3H=Q10w>{bg=vX}G|wwqrW9bc6~1dNmwWK2Gq zcH3!sUOyH6hh0uJJXPZ{Bf%z#$^9l^R{K<&{a~OvsYe0;ww3Cc#*C&+93Ek2%^ci# zVm7kvV-swcYa72s$w~Lma>9!J&nkOjK3~t;PUIpCg_u9??TZr)*2|3`y(=WzJ-Y=v zcpdNp7{IJ>PA>>rF!cIWt~p`_AHP+#d+?S;B1b^K$kBe$rTn|lT`uZDF&#F@+g|ip*b%NGS3>`i@Hda&0Lp3tV5t%k(TTT9Wkx_+})3LSG@Hyue0_1cO~U$C6Lrffj#wGveqF$DZ2#I4_?Z++ww^9KKVa%PX1oE5 z_@M^$*zA_qkcaZ?@qO;S*$5gqL-H7OMfZ6OgrV88{;P9tE!;TF-Qb3!Jk7HGG{%q9 z@(;O8!vu}0;>?jJXWJ1LX0_X_A9^t4M0{_qec@gOk-t`z0uI|(x#wyL_a&&|?aZ<0R--~>7!0iEYqiD~c=^%FCn6KRXEzz}wK-qUZ;|3JcZaL}JO|uz z)gfYf$kH$Wl}C^a|G+F;Td@L^bC0b0lz;WG!(Rnl0Ee^qwrGHxaUf4JF$?2D0skY zG;@i+>dvUp4puZocCQzs%X96)jjq@SJg`-VF6Feu>)Z7ZIT}^u8T4O- z@(2={3q31P-?F(f9UOuwfBBvtb<5r;ISLVvlY24khNG0tlk2u@GqD=BD;-Wsz!MLe zID|QzJc>tZvZbE-du?AdwW}NtY?s zxvruG_Txj$?okyCr_>$8hqA4bC;0^TG88hO^@>IkzB@5UF!{6&MO8f@n$aG3-~$^c7O3};WNlc#`FydP-y7%-en-k=Vohx zvl~)UREToOua)m>t@bRhQ8H!d+iEuxC90<4$<^2+RR@2U}A0YW_IJm`GsdZCDtW`{p4@2krYpJk|@PzV~X)DA-xT-0f%2acpO zT3CzT1ryZC#n(F^^Nv7PM(XzqaUDAR9>F$ zvF@_|w4Zd3=DJbN_&bew$smMrb}opis@dQ#pG^fV+2eR~J^77dE8Gb&_L!LWP@EIq z2($v+0U}}ylAm_vn)|57HC_<0W1KwY&?R(%9&AAjy)i`2DT?PK!}fxP_Zv}xUtgb^ zd6W*y-yfG!DDizy{!Lp=4`Jpuj77UD?jV0IeTH1+SC;P(fd-$~B2-B8dlkZ2cGP1A z*TVn5Ga_RXzibn!6~#%U+Z@sRwuV_;Q=N|fwqJepgWoEmyoKN2$PJ<>8c$#D;Ipb zwwwkbP+!?b=1Ets_gN$8`j)=ET%j0L);zQ|b74*GCt>tM6*@CZ!FyYMX&AD!UFUc5JG+h4P3`dhDe{RDZf9rfPO&J~Ig7ZfiJ{A+j@^U1u)6&rgpF7;@!Gb?R7rJr3#4PPX!^K8ha#Twd+)FhQ z_Z@cytM%m65W1PA>>};lcMsKVjmEpT)PA43rdYDo6S_9dZk#=4qcHpq_&4}2!}Ax! zg#v8>gN>Gw=8kcOD3UVlY9G~)`Ccy5WKQ$f4A&6xf9V+#=OxZRMiT-~Y6kSB)cDA2 zm~_M=u%2X02)7)}pPEaQbLpk73F%yIk>O;(Rhs4oAwce+fGN<{gH!32y2 zBHaemugm%dKz)Nh6G7p*Q<8$3<=Y;#ffrG>0ej%O`4Yfp>s56MmuTBF9Khky^CSl8 zfuW%bWlya$H~R*SXk zUHYyN+xbfx%A;)sna)QxbJ(iNZ8wzd{++09S5eJ1hRL?P_bNjOe31sES+;G+Y8O6g zG0GP_<$aJ&(OJ@lbf+0wm2JEQ@kH)O{M-|!-9)&hd+xqw4q)%R?O7uCT zn7Yv_Z{ZgwluU?6eEomYR6_6!JL*I1*f))nvBNd2CYVcu2Y9~W`>doPEW9)+=&{B1 zNcLYrPm=d@mk0CVMEm^2@vw+l%Nd+z3}k=NzYP<9W|PpqISxAv{^8+??%|!Z-R1cQ z_K7-g6b}!kJJ{^I(bctAL3g$E5;jn%ywhw3`u#{RQ^Hj2j#b1eL<@z_U~%B8fV%N>LYA5OFuUcb!0#%S7^_`7huCEuMWW zZE3)HWL-0RylUb3SmTXi3C_LoDl&Sf38miz-guo(BcHPeC9Adurt{A6D1g;L4;IyC z2qg7wYxXs+q}WJz_qOb&{TdYl>jD8P)*y!M5&%=ag+c6*UE>QVvR8^pVQ0A0+enRrOmiSK5px zxHS_Ra)LEeb9uAK*oT7%)4j3{5^Ux@M5If;VthJ9$L%?I+mkqobCDWbBt`ki>_|zd zfY0|=V=sXYg8u1NOp;6N!%=aW<`Mifi`DvA7gvvNRbk5~)7WKy88e^54MSwex$Jx(v zvK;|F{bTxCnwqmVhL`WYUmQT0n7Nm&YHJ1fPQCY-EGUbhh_>BVF%9?3%6CK~4ZHRO zHt0vy-9;%|+rSw$k6Ke8x{dfpVCD3W#;@_n-vJ4A_FnKrzqTW77)4Eb!ul#~snS011 z9Pq=ZivKJsxOP?y?nFfWNN(VsVHs5-lzyT5ivG;>P3*>8y>(60>(QJTJFu=Byk+zK zG>Z4y2dDUBo{HHlll%w-)IqwS>`qRTW8W-ka{5koY^ z8w#wbc*ck{yWKjW8cA^qHfog(3sSLYwn6bVw~5t^KJ9#+7A&go!YBWjC>}udn-)B&dXb7d-jv0%d5%P1w(a~gB5oB-w*=(+zZebEEr&<7}d^Duo z`Xkk6|6Ti5KRv!XqV}>!HN=25Nf9IVu3Lt%ff^iTEqEC?nYdL1*ehYbS*nGwEzqS_@(cHBqAe5B$S$0hkygh?%F$li9% zX=35cMF$pm{`FOE>)WQh-eF#C!m?gCgYCk6dhLw@zED(}VS~gSVj>qii3^C>0<}Eo zqw;DB7pCPjAoU}220H#YuzdJSt}Z>VS?H!@u-+2{h&I$eV7$qqq=UY~Vvr_DzEn3f6LS#H+NWsV>}`(_>*_J zE7$}QT7NLg8DrmQ@U55+_13ycfHwVO99^;;A|cdH4DuqnZ4w@%%sx!SNZ*TuMUWy?g|*{WqEb?R5qq-3{ z-nu}M>T)tCjH?+r;SSbn-H@-|8j8VN{F;BfE=j6g41C|x?l`5IRv=b!_bM9u!3OB< zl0)n%+q#YcWCikd6rPVXD)BFb{1yyX2R@+#LA$Th$}mh9ul)rpZ>ne6oRC(=dD{?I z5&jv(de5G|Q56sV>SBEOx{M)2YrOx$swHopvx=pgpKH~>Dkqt5Wtt{WJt*Fcpi|8P zIuL)IS@hdv2g+jve13dw3bi-T4I zhnSLX5voc~4n5=j`e>5Adhwrz`Ys&!jT>;3e&1>=qDRZFlrK+m2aR^WyRH*&G6q|K zjH#J=l-(gA7(OMBo?LUWiL~3|IQvB2IOiA>pny?~o2tcz>tS1Kyx5zAQMgq3GKxb< z>r6`E2xKDz*96lH10k(%J^uGJKrFlHtd)$D zhy?ZZg|C7LKihZ!FF?@0sxSD|+`#%E$WKedi*lx1Z(LRMszO_jIWmfguNB7dj3;_+ zi`27GDSKQPcWH`(Pmi-JJ3oMc*R@>T| zl=A4K?9;SU(bG)*DD^DF^$ymmeGj?(>%_5{%O9e&{qYI>H zsTnCKh;yoUkz^B&JHMVslD~axYCnKg8|k#1BWN?AG7Z(I>~@=7h?rR& zic}d%q#D@#NPjMwW)Sjf9_bVc8-)!J*05SklroBR6#k0|Wu_m?FX@{ZRFde8v15wZP({b!|>1M^snc7fa`_`4;1;4CLuTcDSQx{n#> z2l~Gld!^@4=Y5ggF#4}G@OQHD254x@J|W~`!=r2h{}SQ4IQ6bcYycI$3gm0=lksv1 zF@VrKGUC03@-*@nbUj1EUVxeC3aHu^A8piC+Qu>GNfbi(zs&T*z*7=ya4L>pac_pL zEuAn}W=|Ac8s)X6-7GM+qrY8)WUFX?UHcZpr^``J;~Tyms^o)4Q%+p`JC_s-?A4@z z!P9ybRD?l&?GH!#sdz#Gh}vkTaCgS+hVt5Co`et5IvY8Yko9s~k`*ZKbLZU5*viF| zOYYK774wED_znmpr+vXx)hyAeufsO%st?m27#*_R*dnJSbNuvJkZdPHs<9u#B~J<3 zSScL$Bo0xHe{Q*^R#`l4)XrJl`O5&bg#(U5Ftpg>6-)cR^`rzpt%1+sgWmIdmYy@E z94aWS7H+KABvL(=6a+CWSOHu#EEYfX3rOL%^{F|lU$wM!UZl}^y;86;*h-4=reY3g z6x$}^!Hi)?DIp?7qWqUO30C2GnsX4z-m3PxCe!7hh76>d1P(cUr)i7351w~rreB4~i#kkZl$ln*l^xFJH$Injzn8BTaR+2iFF7{49{gC4Rzu5;+E{zW(ABSL z{bd^U3&i(s_277(5jw%qfc=e4K`lC7f}D$|Cla1*W9gpE>YTb?TL0K)Mkx5L=~9y& zM6^br@-2qTD5H#%t6y#c>y3_eO+yQv?XjyXodk>ItMU$Ls1{H_j{)$~3lO-D*ZW$E z8f}CO@%xjw82yyjjsyO%aB>vks+-zV7RJ^b@JU<3@8`ZhHK9t@&?#HOI>MH%Jj)v0 ztv*o;qCK$nwp;BqIIT%IL}A=OwDUl0$Gy>A-(ER10$Ic*AOT%2_Ggj5_(qsCgkz>; z#4roTlKCi}jG64+C68@}=58!*V_1e?<2$JByBXu8z>lX$sN?zh6#ZT;H|1~|7#!4{ zJdR}z0yBL{X~9JB8mVN1o4Mn{P(ux5<7}lA6)WHAsBgQ3jP@iDsf(b~etsqRW7c%u zfeS4al0fLJpgpkn`pAD}5Q@N!MB?H^9KwFEn0S)x_Qbz&efU@Wq~~xvKjx%RugJyU zZwf|~ahz|yE%n{>&)kusz<6ts)rd(VYWb5}QMWAWTr~Gi!-|Ph05DZ^y9=uIj!Az2 zQk-aK5*5CyW2&9o#dd^@0;jl6i z`BqZ>R+uDo>77$5UbE$uKoic`vh_&NWAD0jg0*;Xw897-Qa`!+vCZ|xLjwslUI&P@ ziJTZHfpNF~-6V{JXQsPhei${}dP!5;IjR$!&Nv+8unPoG(%t;%Lx}t2O4K!B-6A6t z%VEg+;9YhxF&9uWgfOBGBgS`Jny(cDxxHMJjSvo0mM+_h;T-DmVg6o$ASnHM{LR3G zgmwWV^5^hXlg$fIqe%inaD?fw;c1o`&x}?R4eXB$C_1krxQ|QBrMn}@>Ln0 zVsJNb3h}V4|9I9TA4aig(@p7{2$aRV)LmN*51vH~P}exsY4@_b?)OMO<9T`#l4PeQ zHg6-=3f81|3w2r%2!Z{f(x1WQ5@eD4{u6$gBnP&oKB|5a<8Q=B;HQ_qdTXh+JMf_A zb?GM-<|5sEDLRd^5)H|#na1J#5gk$4b}V>YeC6T%MuT5n11~X!Jep82J-hi%?F|ap zdd=Ge)PEuB8PNUmKY>&wpYW~n3NWujtbdJODC8S(%Z1>>qOz*){ZUMH){i87vz$#C%#fHD=xoc%wqb=(gRcxs>nY4+(rj*S7!{c3b;Ot#t%)DI|?kamZ^%(!!Tpq*Iu=hp&A zIwOr4Yrb1-1Z#^L!}o$h_h%Uj9Y!%b;4UWUFNLewQoW@oQZuWdXKhvDE|6z#D@7a% zB5M;8Rd%MNYPb0jaA!Omy&k$sKoY&fbwH_*5C?8A&=4-f*(v$rMd-dYuFyxmH}S!T zT~dyuXTqyfqDxW^Bf!5hvbxEGr7-{w%I07RGSnnHBEdIK&HZO?A>OyHHOIcF_4HL{ znTpljWFJYsIrc3`vpZC~M~{YO#f3{;_077xcyr6n&{XsWFGuVh#f46zGPDt-$48Fb zUy=1VzOxxx-NK(tZ?akg{^sH%u{OPKz)oUWW$@et*bq1At6jU{hhzNU5A(N+y)-S* zuOvDqH!8|U9)cU1pzB;6Vo6h@^e6Y5S1 zn0W@!uyRR^5W5m|0Hh#>jkH~1I=sbiog(oUDdEp`NJGbOi8I>^&aN!K41=)~T0l%g z>l6s#mj|&&5GxDPhKRSRij5M3o}zzbVNf4CD9vSlSnPCp?vkAuK&XvhNXwKcmiza^ zE*it=QI5*UD81%R-yR~u{}KgaCr;;$#L{)Gt%dz2rh8N`< zwiGG-3BM82h!kBOcL77%kCGdU{5~O*8-j<%%O3>awUfw^v3=lig!n$BY9w9RD8EDWK>Q#I}qn z6y9q<+DVMLLf^QXN?Hs(2TijY%NbNwreCQkM=vpbMn2;JxcwUc-@%48jmDf@aH8Eo zD^n_BO{^DT&7-$Fc+i@i(hO;&0Ryu2PU?L&YAkVKv*; z=)cEAx?44-qaiLP&4e6FjOW&%fDo~DlLIfmpmazW+P{8p#g`ghHw?GQhd^ zQrW}+&@a&Jb;yS6zS()4*b|?g4|==JfLs$lI2VAx7TzX9h{7h3tl+$LY^(O{fy9A( zMsqTu#?`#wZblq7_R}Tq1Q!85B^fH=!WC+y8mC51k?b1cBX#P#2ENROVKTD~*SK2L z+Ih%J=0xzCL=7l6G2z=k=ZV_jaFyY0YA;MBGbT5%FE+GRTtH!9)JoG><+bci<6zAR z3zNM=G+leW>&=D66X-E-YR(xL0{Hk)d&_;fWIL0O=(8Jql`&P=VP(Nq(EZ6rq_)ch zEo$BmDeVjS1f~+sd;M5fy1vxMFx>rZZ+B^{IAMXux|2D|JdnF78hFQi>LEz@c#uQt z2K%+;0e1_b`z<5A3~|(1Mrm+aeSj2-NSY;U|MCPR6i;CFIF<7^f1gVcdGP2#X*s5b zSl)O_(+uHx{TW%9QeP?9HENCMp1;DxUt0%Y0{MH|I|2mBy?|mD(c;rGXs$&6G{wzG z9i*}cHxp=}6?qXOm{j(WY9b0E%4M6nM9!y44Wd?}+xoI!V>OIzY$QsOf~hCCowLDC$`fdU^Rh_`@+8pe@F}8~8M#_yHmU@X1;6%oh3UFSdLg?KfmfBnxyY4k6 zhkhtKsYG(h%^Ya%%#kI>AjyWJ3^5lNOa3uPd{j!c3~$1p3_Hf@jdVZ>JQ3_snAUus$&FZidv3%_|iZUT()zl z@_==4&u_a{fLK*gQhmm)hiH4do#6P@>&egI@`MaFYEGGi~BK3HyUIpUp-u z!8}C)FD%u<{*2Rrp_rj4^#KfRx1FH61vdKpjq(_x>-&GVzg^Z5=Z&7p6fL~4Z891d z@s`#D{urbs(^p4V>otv*YDlo2)BN?OQAkn8vn^jHx8g6(0@=vURF^1ZP~~zWip)3$ z(EDNd4eJBdooqb><@#n!+!W=$28`6A=NRWHEco}Z&rXIe@;ikdzeF0fDN$m&l>%i} z>DvWs&e|Ke|44A0%?yW_E&AoRBDIX7e6Eakz^GQVUA%b}NP+Oq5?}_zQ;(oNK2GvC z2adw>3kerHw;gUa5%VcZ`p{FNRypg%y|b=I?Psi$H|B;95|6jhA_&x8fY;7YC$m7( z=d?mOD0~KA91K8OL5u7>KWKFNB&WRuv+HbGeXd%0r_XFSCpqQgEQKr*v7Ce;U`)dMsN!)YCkI zkgbH}VHJ-ocI!W4Nh9^B@w;|8`yd%b7IC*v^u+VYjPeNKw%s!XK)gy@Oru$ zq`9rTxsbW3r$J>(=YQS;+hLigIkMSqMi(71O>wV8tpL>CD$+3T{B0s(h31N5%EYc;S5+q8liyEcf*#+Q z;(ZrC7xPdSmfgY_fZnRrx->aqgRY7-;~v;=ThT%paHmggWPX_dmEDb+qsU#iu$NW2 z?X_jp=`*2wZiT`%Yk}6xMa9E7S8(6o9R}}tX+l^Br%jer*)!Tz@@77$mStL-boe%n zeDET!?j?n<>&TShEIABQkx?OeRFP|>(pvw0+@7~+|KEqmqGJAr-TmN+y7P)x$~hf| z27fnykk;eLBo0zR(NXY#2hIeJJ|$8*+}xx$6M5|J#BI{Sw0`WEv7&+QBgHsZJuB+F zY$d|U!$ZK_ggEp0a#I{BqWjqp$@vG3S45g^#E83MPJB@Ncz+K#=+?`5dJOj=yFX_J zdKmM8yE_W5r&~r~Slp@>La{U83prc1{1JaEonV8l;a-)m&@Aa@yar$8bXhJY@cC_h z=`7oW5(CUr^|JYj*57+qm?b*1XD9)FbeeJR*+4C=Y!41CR3CJ=O=qPOhf3@k@!V3J zu)px-g)g0yv+F=$Cn7Y)e>kgs#R~`n^l^Y0X=MUQ3I>T29ps9H zX5zU~n2j&4r`0*4viEmS?rF0F=c3W2`j-q(<`8L7)@G%kHm^Q zf#IRx5!pHI3UX2b`wvlAGplXOXiR;LHm&*29`hfJN+|B;c@mpM3XsAIM=Pl%_BdM_ zCi|7_uA;E94aOHe7G!^{@B<6uS6e9LA9;j>2#|0z50}c^K=9xruJh98><5eJG2|E{=a+;A@W1qE>z;`MZgeS0<}vm0*J1|*;t9sy+&iw>;I zf_t~0uG^Wd{TwyoscY%iFWUkT4j5Y>EElORQL^Njd3bkH*3l|kiIowkl^M`T9E8y0 z(7qh2q$CPifEZik-&)nMlHh7E;z;Y&H>w9LO+yo}OJDxoA~E$7ent|!Mf2#>Rs6-F zKLY|ftS<~dE@b;baq;++3*AUHPqclhyG1G!yK&~|Jw4X*Fm!q4T)V!lMb0znnCe*# zS#y=x9YgJxE%kI67IOWl6+OY!xiQp6u$q^sgxf0yCnlMC9*O%4D-l(5ZlaveQV;0_ zxz?HI)$fgvrMmk%_%iQ_)~BBdx<{{kTmF+X)j%t>ZDQlUEuCS$DkG0&wzq0)9`tFR zST;1N0Gxvz>GlM@6NM%sk|}*xwX?}P@9w~m zBO}VF5Qa}SO3K02M=mSWo#^Tf`W+m4wB$QHX8dk~=qI)enwyK9>;~UdQ~)pulUtty zUL-77{*Di<;ahALUT9lF*|1oZ_0^3!3`C=loU1unuq8a)d{IYK&A@cmJXhF9rTl$|ZX-1ckvWSqf@&x9ck8kKK zT3!DsgulIpT-FTZn4YtlEC)sm=1dd=qhs0*>mD;(PMEthl5lYQ8(}Xi&&d;k)5SCn z8egFEZ(+}TJHJej_l?_esL6?CpC@9Rqbpaqt4PkOA6#;6QUk|r?!u4&4S}WFfe2n* zf{s$M&|5m2*}di~biRE?#d+eQUXiirYbztWZuTq=Btig6>~HC0XS)p1I2FqLs6ZDL zWboyj)^^94iu%AS|C-thP)iLm&YzH=99YT7NRR2SBFKm>{?F&HvRk=vVjI%3AA+ya zS9cab?n1j0PyJnq-{uLk=1XZ-qN}J8zJmt@SKpWkHl1~v&jp;%#}g!^Yk~@DUr9z& zBcNb?uK)&Gq7pTF3+>TtUd9DV1?*)*uCY#qHcPz2cRS#xkTgej z1_w+;Codq^N)YETcOpj(l36T*&G_p{Qw_ak4>2gXE8*UWPF%jMxk^7L;S0mSD40MH zn@nMTmp=A!gn2qjmJ;L?N@;--pXK*8i@>KEZ0BNCQ(`zjEam9ei=`W_I>~@mk;LPA zfQW-~HXInnLL;Y74JtDhqO?%(^^p}Q;vjcdT21dj34wdPAaOY9GGv+M=#Y;jWuiA) z29N0e9}?}NIe5@*yeShOE_lmq(hSHH5I0cIW+rq>purqZaX9B|!mc-m!n>Kz;9CP@ zNrP3c+>*`VtBh)nTM(|?fgbvD)bq=td^9qGOPkJlY1YQneFOP-UN1~TlE{%ybAkn+ za$C~(H_&J+hz>~2Y+*|^8#LIvdfe95Z6H6+Wkm|_LM~02I>qdgRD5~Ybv;Ua5d)7y zOL<~)3zf~$YDnOg8YqC(8A0svOmuard8asD>g&XdRC`eMZ@!GUo%5;WmT17`4%M*U z+1OH#Mcj7LzPZ;v(V^Od4JMLB(5{+^tjT{_fhi^x5n-gXB-SQNJ&~uLZd$g|13#E( zd*-fM(J&ykZ{qq@S-7A#G+iT?6xxC;YNk0eok(B`PIQOiZiFG$0sW68pRb8+BklTC z&y+F#!voTq8uXuS97I7C_e`r6TDlHXbZTYW z-V)QM4~P8H0ol@#Evy$AL_$Y?iSy+K#PHvOz7*x85zcFUK6ot)<5p%5po z+7S)iR3Q3koK`q$>s)kf{VESO9ZE}v5l=H?DRUfY!4o30O(10wlNC~K6jtGSM3}o; z1g^UB$K<;l^FF_yMqf-8*q6>Fr-^U-ULn^n+dBbq;(>|a%?tm!!;~kTrdjq7&3SlL zgz^5ACCBV74De~Ei+X!UuK2VWB8$!Gc*BZ*bxA7SnZ3rkwe!0OGD^C?e>bUM14%P; z+An72f#3d86b$V^Z=D3w6?aGVP;m_aIj@5mF`-{7hkHE)G|0SjUw(6eLiww4b*5+L z#>{h<3=AngQE}lsnu~RU6Vt3AZq>K0n^^vG%dLI zZy$suVsc8d9?f;UMVH_=k9xi{6eK&ub$Mo#c&ygibBo45k{0C{Bee1q;#HIS-nkrd zA&1BAnWtqZuFxC8Md@U>a!Oo=M@EsRA3FGt5toXQtd5<%pfYaIT#Uj6^-P7Snlkv6 zcTtSd)UdwR1#6AnckIk*P3r-;W1W227tlB7xi}-|%s$%(}^b0`m@!+p_i`D+)|G@aN6%zD4X zD&3>N*BB7XL0Bin7(1q-0336cavVR)W;utGGdDFCB7g4x4r@;PW0~`PS>?v#!u?eg zg(}#=+y_T6?KX+X>VPIj(lWDtjs#K@eq7r3|L=Ab7|t+<3d`TD){q z-)|lJrX`hAg%crUXvQvUhUkFvrClRE>qOy@mP)s|?Q%0M*ET4z1N%v#qEnVc21)bm z`=zCvF;OuCQOdviHw(}Bh33>wu-?Nl0Z08AzniD?ij7E|-MiMb$FG3a19#!MbSwUO zhBnj(1(+&E!6!pK+F!>57^O!6A0dC4l_kL$wnpG1u;fZAXzaTmG2pEcjMFmyN#PBb zg-%-y^AUenP`4s9Ma&5d9XMV=9XWdpN6tLrUdh@Q1)^64i*#~@|kh=ehRjE6B#7<~1b*hiGsF_%0+`nfe-c?@3Av&!B_ zI7MewJ*-KMfG=&6Q}qLw#Ydu+x6pg*uzT@{XZ>b_^DEKgcTR(&YuT#AIvSP+r)QpW za}C-1ADIQSr<+HIv0Z0om5U4NsOTP+N?UDF}T{61;xZ=EH0cVCy8CW^VXQ1ru&3lVI%^L8_e~NYqhA)B`LU^k0QOVLN zpvVPw4qq0{Xv4?w-VzFKEJ3i+&!9(nc;P*K7NG8_I+5WEBF(=$boUtP_aoMU7#q-A zeH@p<5rb~3IV2$2RbuU-t2s4rx4iXwu%8G%6?C=8R~+&4z0GGT#|sYVBvqQpO@a8q zgV#=6f~Al_PFL&a{84#ix_Skf>OAo{_12MejO~7N{MATKwTKsokJa}Wq6j1>Ou;X0 z$})Dr!OR^WM6#l$T0;sJv0ZvIMdh@+nr>d`!gXnRq20i-c>bu|DzU5b6M z*LSvTh{KSyhmrZyNeJQFZtx%gH-oByHvlPNu?uL0RxSh)L>}o?V`EwV2x;GVthz>Y z?i9N2=ug)^bl_1Ko&*k8Bf*Oa1hg1<@E=S%outyJJ!dQT%N>x*7jRP5k<{bUi;ay0 z;$uIQMi^yy(AYd5v^}b#@qVoYjz)P&8yYqotLbF&M{twVHSkyMWi7Lq;y-skunv!0 zoGVX3=^pqL9;Te=y+s$D4Uupa9+MUql;Z+Nag>@aQUeP1l`6kS#?n|%#D+OnP5MJL zI)Y*UO#`e-p%IrS+^#&jcv_IvhglCs;M%ITh8En7iBd?~F)L7G`LVBH} zh9AESwgLAG|5$YrcD4DnB0*T@nCl0jS9(K_H~Wb&_70rbV{*rY9iW*` z)>imK$brfMxo8|QKfdf{<&;M}<8J|VO!YEJL9_KGBenWLzJ81ssKHr_qU}WD2FD9{ zEcj=E9X16zbHwmI>6$+C;V%ru6VVSPTvKFep) z!}}H)CQC&qDOg8KU>1^*e2V0;D$}wXc+BXH=?3+Y^=JA=39 z2!O6B8}zaz)_5TRzK--mwk?i|CwawByj{O@VO!V=MvgHZ&7+u*Q)`+o^&D{3F$EGg z84K4sH%vl(^^sthJ&nu^0*dr?5n%5W)Ti>`;n`kI(=&!qKg=^L zOg8A4r=Vx{!=*RwP?D$Lx_VNm9cZx^i-TyS_lTcDk-&Y^uKK!(>_q8YguUgZ^diie z-k{11m`z@bWNNaaGDXK$x`N53c`v(tV!*+I)gv>ffap+_VE4|4%~+Ya1^=r}{YckB z2Tj#x4ed9;Y2@CvG48)|wS)a!=EPQo#x6aUteo9X68aB#8jZ1V)i9X~nZG4dor{1l z_s)rIwvyqw_d)pAk}Er?1GBWEMcMN(?V>b0{PA&oLU$XbBT;~GCweBmc^KkS7rYCJ zB}bNJN}_QbE`(Qa+;f{<8k8^r>u$xlS3qYi<07}#TuMywTzJ7b2dYq=<4`ed4GgKQ~a77q7#97~I3b~G69&b|&>4EYN z)b9YT^q4^mmm)CYtW~??85$fCj~hPXrX%kVvfwJ^Ww$vsC>D59YHZMj7dVNdEtQO)7FEA{LJ>urRMY5`=(Yd?q8foNzeIq^tHTxIAlyhQUWsa+vrkwkRH(34=Y~AdZhq=|t zZ7~C_G`DluhYes+Y5IPyH4Swcam)on7kyum2Rm#2?gEGU9R*A<@@(J#I?Ee*@qB)p zkIwX60-C?3)ohGw19Q_SXb~9KUe6aDH4v2t z1vej12p3JJEfti*B-_-$(ubBU82lGL|HDyEwl;~3u_z_nc!Q?xHj7~2ztQ? zB3!_0DgMmt)@lK}JWD$;FBp*rU&Wg*q{Jmf9@!JE6&nwMhBT-|1yQcK6@H+h?w(kQ zvD}Wr=xfNmGO!PPbcr{%fI4v#zj1lt|&-dYM5u za>-%&Zih_RxpL+~U))bdz@^zTmo_-tStik4{%;e_@tQSx1JKU)LiMt5Qqsz#;M$^5 zRX4GExqD_cH+4F{W%UFR&{$z4iE5f(E-Qf*QV4~QnJI|3N zK7&6EA-f@{;);@jI~shN6g3F3VlAH(Rmg*LPkn8=JDMjp)J3EueOtlb-qzVZ&x{7w zLfO=wdjhntNu98*!d@tJ_^iV3-A#@@laByhf+3Tq)f|;jEBg0Mf4o~005WFpRyQ9a zYxce=-(0i=U8*%B9)+9z0~51*Bl~NUqcrW?QN}te?BX)SQjja>?m5Sz6j-P#%|vk_ z;^O#ER-vT1ZgD&9PaT-7WeG6d?}d>8L6Z3ijr$NhQY#j4M;JCL9S(r=o_oJNE>F~u z<@f{**S=~;kV!-ocZa(1^rduz;grgsN9nt;T+UJ07va4{Z(nKhc#?AoWHsga%rX%$ z>0xS;;ehoOw9d_6!KaGm75ERuGkEP##q6WgXDxAFUq4a%6zp$~J6+Y-O6J;3va=0m zEWHI!R;nm*BZ*MwMgSfAxI(7b(&JvuC1cIjETT5tr-g3A|Gq~t>b6h8_D9=i8hwS- z#qwI~vWV#bE?ABA9YMu^@{=l)3kfRQkRQG&HrsSWqYLD|7K8pGrk{`QuVv0h~Ebh$iSfCPRl-Swbk zFeG9&Ewh^$t75^^ev5BAK6U3DbUt{3cOJML3E1_PUnre33YYMIn;5qoxz^8ohh64> zau{d|@UErP;KZW<`42vJ0yIH>v75WO#18EPLhcHX#;4nG*LoSmw*YlXmspV{R&Nmt zMCnA^`XflYD2`?A=WOrPv}KW@L}6waxYHI2T07Wi#V?TADO{-ceem(e- z_>$>-Vrd$$L6PCsDRx;s66^XRg~a%wyn3id^pJ1m#nH`jY!m!pMxb(VMIzFmGJq{a zCqq^)W8-0r2mFJq!X}qoPaty{^!VP4TEs$j!NSZWS%J2|d%;-xFqBkM1GvN5PwEkH z<{HdOv)-*skE(hD6Y#S#I0wc){>Gp>^GrBooe7HPai^1M(6`u+wDhF{P-lKh`_(p} zd_(mN%On9Z4gf)RmfB)n?x*iYR=zpuA^!AXOm)Ww^f#wz2V*rR9s1j2Oz$n{G%+kI zO*iGeEx}`&?t35YIVsanwZ`Lw_zJryWTlv^=N74*uYlsc;5Z!a>Ckj;%v%i;MT%b+ z#T+;)-+%FL4gKJlzPg5>n|2+#&~sq?{ZssmFS8VPgE~0b|E2R5ds)q6h*e%Nq z&xaT9Tfz>zf2ZAww&9qKQ2nYPTkU~b3r$7w1cE+SgDl3C(81ccC>69dITstuJ?SVt z$b1q4EM{3sUTrsSsh7g8II1xQ0?|GG_WJgtXr*^IWtfi@|EUE^C3bm1u~S$3+qKdX z@xN{j%-5*I+sS&(3es7xLo2JL%rBuT&X@0ZKLk(r3PV%`boe@a z+uursbj#@j*W8Tr{!VAdBr#`on8Cc7cV^e%;NZSFFJfWcH_0uHsCyre$`T2Dx?7fO z?dH8eJ{4EwVC#b-m5)brR#@Q)@l8C*>D}glS?f_swF?ozT4$6r1O!TJg1k2Smj!)I zwCJo|q9LbIPH8(xpego)CkS&&4wYV=856ayS*2nHLzxygaPi;q8tP1awf;_ zaLCJO3uMY0GMO+!XtRyJZr4$aOUjvVK(hKeQ~0sP+o;^|!Lp2!jkqmE^V#+^ptL@} z^RguOR(j&FQl_TyKLre6EC5r}r^BlC?I0=JcIB`PL%NDCokPkq< z)so=)D=wrl(N75`8hgecIO7)_1e zyYA3<7?G0|5A-03AAkp4Bl zIEJu&i{uy%&w(sNlx;{%S-tw%72>qY04G19^Q(bw|F%}?`;UjS#dBDubs#l9+Oaqg zY7VT>OZPR&hv^w+{sphl<^DJI9Z(AvX(z+V;&;Ak(5AMl2EC&#ZWDd1xX!#dC-md9 zL~kak_81{d=ei{|93dk^x)_`cI-V4-w=4^&ivH0&7flpEgWCzm_CX%Pg$pLAOC=wy z2dz8uC%liwm^#O!d8WUJ;}Q=~22d|EJmuKf|L^4lhFwCR&p`BZ^^A(Y*3V`bgfXV?yP zT-H4YzP9VepiI6vq4*~jGKYhpR7Xex9sLhKp>k-TtEw$i4ErH(guWTffIn!fIhS^o zCl&v2CnxtxE9F=aIGn2@CDyB7%wrvm-#SKqasDfSbL1gx{zydmKw`V$SIF7P>*)79 z9b%v4F=)Nf7>rMwpuhl_dzmINr^rv>8^gCtbZo7ZsWBGB7{jku?PTz;J6+^3M35=+ zlPM`ISYZ#!nu`hAAgwv6VDj65^e}l}%Kf%>|I;tOs@5(zi;q*-R}7Hnys%mv@zY3a zQ_3gw0^!W5YtrnGsb`)g-DOA>xwh_dd-hsSb?~te5&W2J-6UWlbhgB{KRv`j>qwVWk>-xF1gT7Lrf^k@p{naM( zdIYX^pPTU))suuN&M{A%?nFlkTnFo*g$tNoR%8FVrzb-jD%8RsG|c|jJ~gh(eaA$v zXx_;r5gy`au1A5vk1zsm#Q7Y3t>W1k)imSlePr_S3yK#UsR9l25bQeYGPBA3vNwm} zr~;dn;h_2w(?Sg{5^Myo?#zmJg88;{+AkA>T2BCE3a9plLx4q$IcdHuJyyU?lLE#~ z-pW1*sJY-NZWY*t0>-}IOi|KTfSu&ByO7qac9(F1I5wSmF`uL5^SE%n=)VN$nS>>O zHmW}O<{b^c=Brqqu)jYqE+m(W5e&c?cb(07DNpUiGJ31)j?Cf`CX~Kn?rb4*8tp12 zWb<+7gYX}b)UT4M(J~L%8?NtLqHR0?<}d|+Sh^EJW94Q7otZ5MLb=j#5Z4uH(s|Ox z(c?VRFTTrw$i^@#2tJ?1khK@ej>C2+;(T-zd%1&O49krTBEVH;fpX-i$K3z304UIi z-YtC1v@4`W;{wz9WZjwhFQHhQQedMf)`tg))8-J?biH$88kLwOX`*8s5eBOGk)3)F zl;u$QK)HJ8nOUlnz5_#X4cU#hMcZ2so!ggZ@^iG8>Mjf}e)dAX;?karK$^FGYjf+$ zxC6sZnR`Ee>`mLbYnKpSZ|F@;z6l=p0}^RuL@AOhFjS$d1AIg(~mXnlu*!htwP z+Nm}nRQ_(c+HI*t4Q2u{Cm5@^a~7P0=psEuW>4`k*nkC53%1#26eUG0FF-eV=Kno0##CiamlDt3ma5wattTaWp zDUemr;597s_X3eeN5wy1&3)lY`jl3XYyYhMN8^ViqH3l>xOySO8(H+S7GpgRkBNqF zhJ>fTIOPp6wJ`>>EsivR5m|4?kHJ1V#3!+R|6RsxZ zDI;n9N?LUCZ4k9u4naZ*9kUCq2@Z3?ASQAD!Fs75_(n}M!^LI{5)Vs!{Z&T ze}%HL%&?F2agDyv#r+gh(?PGO-xyJKB#*-d*4+)9fl$i;&^M1aevBu<<|;&l-V`99 z?6Sh&t(uXyib`EK=^ZH~I)z8khnfXl3fBG&M~+|reiUyVGR4h+Ctv<*)iDUIn)OpzD@_8^ zjr%^Am+C=KGiWIFm#ckNi6*kq(nra`1XRN-qUxwe@7nG$PWkR_j-_>%tbZWjueZ*V zGj&J$`s_PsUw@Ki)-Ijn%gl!@NgBsu1$@JL{u2PMhW}r^DhMVpNxx}~ZY*)*lxts{ z!&Q3E{M7>`0VVRX%Lgwc`(W_-R8?i<(cbFj)lJgVkvtfgK)`wmlDRCL0nb-hKn3!I zm26A3fi;1ksb9VR3@W9~v|M?bgzCTP=is7{&wtl3b75%XK42ZOJhkGlh?;V4m2W!@ zZ%0r%4uwlhRiS@IZS$qsiaMT<{#D!Fo{l(j^g!mR`DTIo!T0z(bX*e^rCg|48c0ve z;_)I5rV7AVJ~OH^DD2$h5A+x-)i+k;e+XlbMF1f+O(3v(Pk3|AR;wyK$S2gh6t6b% zGx|;B78ldT5^NAOjc}SJhk!+KaoHHjT1W~f@+vqRaxeu)gK7v7p@Xb&tA_$p|6^;O zQZgx;QAs@ZF;sfvqcE4)wHkD{)d*CV11p0$4|bu`)DgD>#AXX%|52NHxPC&cruz~ik6RC2 zV$8NQ6b3_J)iLidDgM7X$4A?$zdxZa-n}m<$=V#oO|eWT9rUEHE(ugC5+|yRhc6+1 z(ImqvOW^$Az9}zkTRUm%o2@C`U+24}b<&0=cfgXl_#*I+79W1$q?GMZj{^O69q8uo zpnollr4Z|7y2zI0X@o=As9~*GqH9spn>auO^q_U^l6W3AXW{tZEzB^V0`RyV-hQ(e z1@SW+4srbbFH66eNKqltJBs_@ZN-1mG8p$#e#fk&e zM4==f4>E{8c8aeT0Sqy%eZgP%p`}TKxW>O_^FpxEI^A>F$Qu}{(-&6`oR;VGcO#Cn zG{=9Sw02{arrZoa6J{}5ThKJ4bEVzm!nK3{cloyaOen16Gn_82h1~sFD|aLsmVrZ= z`|w~=(cC?RwvKw)L1sSr@Cn_QnL_5L4H9g@6M~L&&oRlK4*ohy@PV$d}+}4#qi)pT+;0ed;$}? zFQl0o70|U_31ji;@skV;GP{mh8TtUZRfHcdm6x3{oJys-6BjQsG#3n?1!Z%`h-tdP z?R-Aix5kR!Y5&+LwblB0Y2fQAbyrh1a7H!Bh0IzCu?bvhptW%WhxTC|f4Z@7i=LgW zEq|^vN#e~6q81yZ1ZAs>eE4>=Dha)X6Yr9w5jP%c!z%Vqcg<>MZW)zr4CFC3*?|Ai z&ND)4m&5|BT9P!lWB{QkQ`5`jcqz?=X(p3JV& zvpHCfEG-dfDBD^w=O6!|mfUQ-wv#su!3qDX*gv&QX@2U6xz2Y!ewq~s+mT0h{*T2E zo)%@)~dwREvoPE0!hp+eUj1mem_-L)x(iuPO}D~55|AymeP$G{u6=DvbQ9s5N~-|u<}eo7pdVs!}@-)VgN< z%0;azFZpP2x?ktEN=}Wxp*NRn2&hQG_4p==0P7vfv7F*0p_LgB6ICnwNRhgw#0eO$ zqEk}M(=``eb_@|^nclJG8NP*qHCJj$&SF{~9A&rZvYg8Y;tP4q z_wNPQx=y0FjCoU(&*1R&d#70ibOr|)f&H!xmSW4pe<rYh+c(^Z zFi%f0TEU?b6(N3fwGmr}I%vEM<#tMi=JXvoA%SG%(ZdJ{nR`IcA#6q=T$OnaL&#ScA&k(k;l6x zpkLU0D;AM zP&AsQB2p!h4M?Zoj}{nJ30Ytt%gx=4>mhJ$Qvw{oHly2el4>!ddf`&nFvwiY$ZkGZ zf2ocaPlH(a>B=``yKyIlCWJIJum#SIbT=qN%s6@Y$(wc-O3217I^$`(wSeq-1+Tb3 z{7=3HiNuD)c2Od}#9|;=-|_NLzl0ofaM+^eyOORe9jC4y5KKG79?su6K{O-e9eK{_ zc={G}m9CP2z49aiRiR>l!@1R+=FWL(4zXQ)=F>Imi9=k{TR?w~B}eqP^@Q$*)8()l zq&rDADNUB>=nG~GQ&GW5Yn!P!@gN9%siMwj&vVP0g*e`wX1mWo`ullRCksf6eZdvW z3!$XiCNBMwCX`oIrmj=FXIucquLY-G>=Cit{zT)sK_rJ`(up?h(;?JT2X$+ zUfcJ*7U~c23D|e)`>+mu#ILXnq8$qrJEoFR+1CRcdd+mj{x+1T^*O~A@HS_bU2B@) zOJBOH#Oe0UqB$5y{k0{Dpq%)zi2jr+wd&$eGT_YnJ26?6JBlge{@NX~jAMViKFrO% zqDZ7R1SiTVEn(-WN&zk$(HQ;ACGXzJz>!Q(C4+X_ae@pZxgf;?t(&0&SrUZ+p4RwF z;02jdvMxAz1%K2#BF>7$Fnuo-e9vvWC7ipCbC!i1@(0Vi{fs?oMcU z-!QH?iqlh}N^1g(R$QD{yM`u2E49+smbg(8^BAFW=tK-9*q{Nq;Y49X>>M5&)3SZr z7Rws#2`Oti{B_fgpky$E+0imrM|>r#|DM|4^!ieAv{65SQQGOrwwdLgBsRWd(ABV2 zJw|&6aZXSG?Mo#6?rKVlq#QzSQB>>4Tok_C;NjDK&NJqFM0Q-52Z}sbgLE;<_ueqS zARmfG2d)fR34&SIi)EW0Q9c}`)^0%i*+G7C*)44VcW1T3fJeLE{e8Xe&zAzfs71&= zy%rdoA;O?WYlDZ#nLLv0u^s)P9&FYY(Fj?(D{Q-rtZGyh$DgqBz%WWUBTnI)6M&5f zijioM;tu@iA!s-#rw$Bxh{C~*MB^OKpG}vvVEKhsuJLF|7b6m<6n2FCznzLY>Npd) zxEKOe79{Ua2onhDJ&iH;#9Ze0f*X)$)=Kp3c%eS?T4kwV>F-37I*{ex7RTC$PKqOc zbwDPq{0>}6uhutVq+Evgw9*WqAsh%OG%l6=W#cIw8PRGOdXjgb=)^3Jik-NxJ8?z_ zvhd66UENaHNle^GNCUA1zMX|Ogn|mSqdFa|>oO8T!H5h>4#5YRzD6XduZVYdVMqbT zmIT`nK1hy#uHN_p$q@|TV$#XYw+F zsh7Y-%#P&SOcZO{xF&Kp+NgE)nV#%F!`9wmHst@D-;UxBOoDDi-#<%p?Qe8>1-YXx zTyKxUIrLThvB_ut5K&pwQlWtXwTJMNw!BdKdul`JX1PkY=2+#H&do898tBs=7r!k# zYm^7%`9q!zCc;JQj*x+HG_SRc`Irru<8jTcR!$<0{TS33Rtc?Kie;knm!#k$0Od0< zz2*eT=a2Xvzq=VTsE9ERAmt$8KiWn83@U&ONb^%cjR?qD!MOG=9+~q7&*tvROIXr4 z4qF5{M9PU#fE2q<5()2cBpmi-9@K_j*A#D2^jdu5u25X~`=)i%`eB#MeR>d@qQaOg zVHPK|)pR^?Gyoj?Ux-chD^6KN);1Q(r$pX(3_z3|CPr9fdKRNowMlN1Y-}?!B!C{z z8g+EIlPpU7CfU?LSP;1Ze&ZM_JHFsD_Yvr=c`7ruNS)Wgn#bE;5Octy(;t`#NPbWW zwYj~~j%L==Dls@Z0UIAm&;eipc3LUVwDM!B9#3(ldP(uj3WOaa2;!`hi8W<3GTJj<5 zvkH8$v4;A{cM2Oj^&+xaipyv8=Y*bloStJ;mGeLYajisa!7Aj^W~9-PBDhwKc$Kb= z@3;`3whq}?zVGlBt|@`38`X(?JEht3QO}^2{es7jZ0{>Uzz?OcZRsjbo~{Mm4G8pi zKXR-ti#a@2G*+uiLxc3s*vrin9Db@=6N|-j{jZtD;v88*RyAeKS007g>vEzz^DskY z)Tr7yw54K`;$;23IE(+ly=_9DA_#-Kefrnjtv5{w`~);L!Be}?63hkPV1en`oEbaF zHKa4_v8#9gtAAsseE9gg9*bfjs?k&oc^7Ns>q)e_D-o7SG$1qGF$XF~ve^!03sVzg zF9Xc(U!K2UalI?Zr@Fu%<&PRyx*IVjqK?7cpWK>dn{H%*~L+M;+9f1HXBBnu$N|?BB;J7GNAn2_YWCmZlmu%9FedhT+|d? zH4hORJ3u+1sTp%N?wB-xf$~KxLHCpr9Q>s6%TvoAjySGq-=t~2MtNvzByyGLnNRPL zEzRe1Nl4L)x;QSWe{S<3&%~1qQ$OFAV~-cv!0eVO^JkPpv7K19vr%n_Oz5BR1N>vX zujNz`oX(O-LAdj6cLhSZO)UCu&O5Mb)J)+oKG2u4zJky+Zp$e%KAGwCiSke+hR zYnz*i`X5ku!36AXrYe<@Tbfc-0p&xkPepxAqD?b^g_=pxgBw0oh0g>nXD2tIG&|U= zPX$wB_vlaKfukR6`4w@aEkBhx z>=+0-e_KBuLA)gim`jx;#O}NC2@$q`$vdEqJ2z*58bz~lgL8smPf_#^afR(xm-LVY zP|+(FQTJ@~8+Bbfgnsdin7bq`bSS=37OXxz@9RC#AbD@HZh^6=K`ZIJMyLr(C#!g- zb~K>6IyrZnj8^9J{QWuuvDbK zPb=C6Kzx>Yx+wV=3y&%y&gS|Pt(%&V{k|=RBJ1H`2q%B-*`*a-Dj^kah|h@QBIXPR z-}6v*@0G|T)!Aqkjy9fMW2b&KYCz40Tv4eH-T77;rIz$mu9hz$LMQta71dEw3x=Rf zJ0Q5{n^Te#B#+J!HpRrg>U#=|9PVY#!5Fvawx^w_X_I;kH`}9g^NwPL?gt|g40VU_cgQj!?SU3*c(B|+Ypk+Z;zB!BA zKuM+ais~z{r~nZ$3jA8;o$9psz6ISR70i9c^ihWkM-;(bP+bCPGH{7Y9e`8=~*k zQT!7v0mNR^&=TRcJV6@BhYmM=jBG)QPX{}ZpGYdwQ=CB4(M3*&)x2I$oss-M!jz@M zGn$=>JU1+dv?wO1M*}6|UC^`4^a#1K$AmiZ8E>@G5*&lEJC$IE{yO!E)6?|Jl zTPbZXxd=CRp(!A*QIpYKF|-5(6Xw9@AcN;zD5})wCmESt=RO>|_KSH0dk+YCNe}{h zBXz_I`qh@@!oLDNHwPe_hSeao^-OwLG*%i@inYRb0uAYu9XS!@pKg5d zEHM47)vvD%a(*y85oY^!KY6Z)J%op3++^L8GJCu? z56DEi^W3bG8fA`r7h%L~9Kl9AK*y0rpRiT8#aR`_QrqE!2L^ z0fPS6d`e(phX?oo&b)Qmi1s|Id94LYMK_H$Tgv(KDPD;Axtyu*d+h`+tvLt_R^r#Y zxgVIbDqb)=%WcPvdQZl?_e4wV6&F57al^`JhxX3yd0l|p8G#+eX$rQcobCeSXbq0r z{f>Cj9OVkFbcf#mzK8S0?txgs6G2gy?e^dp;n<5qe_D4mS%RqyzdValp(@hYNoJ*( z?#$_yTOIau)Q4>=3=C%oKj0|-YHDlTcJk^L2&(L+ zDY_D6R#=z9c)7Slqt(w7S@Clbbsx<8j?n(V$JnXA1uaD}x!8+xEC48`M z#tP~i1LCvIA=0`7X#_$4>?jwOn+QtGc|%d>gt^<@PpeyF#Kz+i4keqI{kG<_&0zF| zICXSM|DbbX#4THZr`zY9n**8yvaC*MP zGJSS{UBy9CHT4;ir)$Py5;`8rQ5j-jUh5*Blvn;=a5(Hn+5nLi22O!Qh)l}FfRW8- zIahXDmLzb~!b#&&icY(?rjRdGspZ<80@$+2i+#XHA(_s;%*p zMW$Cm>O2~jjGnsib|>|pU!Afjmq@UvclR-zJ9E${MxlM>TupA2Ek~qL15Pzvh^9OG z>orK+swP}U-w8+tk_3Lmx*unqkXLD_e7{RPuU`dmv}3~;F~)ixsHJuEBmi`1p7bTs z@QJoy*|A$FLIDOvp(4=S?2TbyA=lbqcI?qKA)qiqX?q%}`yXqUO#Ftv;S! z_^ZST4tuYfZD&GN!KD+a6(rZ~SyAv2Gq|=G>z*VKXa{$zZ;+#|otq7yqz!T*0^9h~ zSDNoKozl+oW`VI#vv}I=`QlNmH>VbNN=%5yKu1H_^Wu+0ktYwiaYD(|RS2LaP|)qW z_I814q9gW`nhBB#*r_eiLfzPc7Ldk!o^IO>yW-GZ-6wo7g9l#X29(q{bVvYeHKY%R z{W63?zLim7aQ%K{V9ouS=G-Q20Vhuo!4^TrVSg9X#=OVzHk61RkE_jB4xVGuXrnR8T16w?N zIfTP9EoZQ{k^krD?{tHt+iQR?@(yw4cJE4?#ewKvKfNo|(zp_bth6rhe%2&Tx3|p~OD_bqe4-!Cxh( zakLy#yQqe~X{q*+XAniWs%r?!IaI0T&qO#W$3joGdi>B=2Z0|y&-~2|-1l?Vlz3wW z|3VszccLU_T*5erdf`W0Cx22_Ml&ZIF%zpNH8MU3c8-j8j9?W^HvLkZ1=V}hO^Q)1 zTe%6jzaqqw^w{-Arfr*SjOUlIgkcJ701CTl^N)4U$fzVmp$cE{#V;Serjws*ViR;G z8(7l}R4V>!m>D6Xs7mez8>XfkH@EJdiAXqPgCTV*I5J~HriCxAtyNMK?AkJU2w{TI zrTn!{wj2fV2Cmey&$;{|W13`1=+zds?2nq4njT2BHXa_l3n@k=x}2uMtNuXRKGw95 z2}jo3L^vAeckBgtcf3Xg9g)U2pI0e$@cIbyK`$l+c0AB|XuST!T7a&Zd{Ss+=cPC8 z?E28X3>_gIBpQ0&>MmBvF!MZM+jaAsDM9cqJU(v?3q#dcq$@OBPcD(pEeR~bJStN0 zv&oH35=v#02L(x=s-hdW1;(Sm`Ikvy>ZM7~+60D51Qq*7TeyZuwtO&2-dQ$Yu5HWu1B z>%d5Gdg&yb?kl08X0$3{vRyS2vl=EGB?(AkL&$p)S+dK={c_|ss_?D~G|Q&$X9N_4 zH~JR^1_QCPnH`&`$e3>Tlz-eO@gzI&Bz+Vw_RYCZWbJ2;*HKod6P?G%08lP52^%bz z7`j%;`Y>#b*w}8czLF1fP>zvfkinolKtAR0l72B$j`Mxn8rt8#*jmbwVhDZE$Z_dM zMkTteHev2Z3D=-#ZmmRJvngk--D+-*e-6Qnni`4S*-+6j*at$G*nWs1Wf83i#jFA{ zrcb^;J#!t08pCRnAf8C;G&cCTKv-!8CjP5py+NY~u^wA~)c(>~+B3sO<2I++iER0C zyR{eR^V67+Iy!m zP4_&45bj*%1!roy>Z{jsznRbN&BK~fLrMZo-mE>OK7v|^6R7Dd!j^b}*vU zQIINSMChd{g4z9TYvoIzMvy!kI-Alj;5N8{X%YUPNWA&r7^{k zx`74}<4JF5w)C7i1;5mX!$gzG!MzW19uIv4O2MP5R4LQIuSzPv0f=0yqj#5D0%Uu>E0^K#Y?+v!pg3eTj460umo`-20Th>6Uh`)Vkz|%XX`g;0ZSj zkD|lN@t=Qs3gwbPzV~_>I=xV99l?_oj&0v84C1O)gOX2AC)p%|oQ10jS|%}tKP1sS zGONWzx4XRv7rm`$Pt`|M@f@(MZR}-sE)e|VMcEM{ju~ipFIL*$QO_Rj(F5u;@y9Qq ztw?8Cr1*)mZQ&>r9w<&Ku!Q&5ZQwyV7H2QW(%i!mc>9Hn9JdyTH}E0$4nt3c7t}3} zzi5=u(SA{+o@$@Ohp@82;%@>$)wW{>DPP6*NOJn>{WC3`{JY#5HaIJ%)~A3lD^)?u z0r4l6&z`({DQObR~8cApXb!4(J0@dIo!G92WW;d}jqvKy4#r{qiRx6N`qdw?gD6c}bpk z0cCTf7iEsWa?utK6xq4{IZOPx5CZ1}3Ol5bCl;Xi3Fgc(c6%$WIjEI}M};qJR7t2Q0l%z1($`8@mLC#~l^RLKlsJ=xU{QON+bXs&_u zZ#wpUlEZ>f#pw*+7BUOCok0pj8~6Eu9yvHx6%>B*A@OA8if*Z8{dH|2SmS6GTcqHa z=GVP~DFkl~uNw3Ej$@BPfk*zv2)JzQo(opQ+AXbG>q9hXFn&$m@_ zc(Q@L@OMuz`1}GcsSn5%%?1>n}#Gv1lZbux0uw{ld|Vo#vGt1@cWx>hF%(6hW6IgcX;Z z{oL5Y6(DNYX2~AqX6@K^$nBQA^ofDqZg*2|CT`{BQzwtX4J4!A(CNZF zX(m1-Vq@ab3tm8xJ~q@b!b-i-5(DgpTO- z?rGCZUyCW~l#s@_xNoN|Y$3zSoc{_%?Eg1XWM!}*v^YG-n}kv{vK2G)jg}h0iQS-` zOmh~JTK8>w*pDMmEH-fHfG{N0YrQyeF#xHmkbQ?8SXRU>g+2Y{Rtsnr??@8&?y}oE z_9Rh^I}}MKb!tqXja(S?l0SP&+2Cn>h>dw-oipJG+xkR&7rc#A*Pu~nFsy@2JR4Jb za1Hbb|ND!<`kin4U7j+PevQOW616hby}^DJrTXf_Z{Wf7>Rk%>(4yAq2ggF3V6|9G zMukU~x|AvdRLR{T0GiK}CL90(wx+QE-$xylFc)+t&;t|(%dvgXqw)5$?UP?Sg^Wnq zY=T`M0rXBI6KlK1Rg11y7Xz59ccy`AwsTCn0^73h7B+lGW&CP~?0WlQ1_-OXbVhs# zdz{2Yl6@ktZHG;ywg!DN(r))y$wR#i?3HVx==%s5d)=Rm9{Pt-c9Ug;&|SVA?sH~? z2{5y30+g_2R)Kaw2Li0`Y(&C$zLFM~T+pKq_=QcHu)f#enD=1;$X%lZtpBN@ZsI505 zv*k_Ib$Oj{SZR>*rE1d4=RMXmuKjIyvx(H2>PAi?=9}1in3&Ji!uJ^pJw-t1MvC~! z9u{}j*hp~=z0ZdQ#81r_9!}$-XDU*>i0-k=8bIYtduZ-!dbKBM5EeJ?{NVSNpJ!Jm zeDilAXVk)v8|w2P329dgZZ>jRrQ*{x2oNrJ8P&o433riaBhNgX^mTMm3k@Hv}c5tZdx_cB&n!OwoG5U8ym#<~nyD^qGP&%mb0i~Qwth2fzC{GkpO2{;#_S1o^k6#TF_KPBb#4Rf{| zi0xec?ug^}&EUeKMOV07*MR4ucBQ7z&DS8)FcE7`aLrK8D;uza74XV~Yr;fsA~e0Y zCu^;#0UgkG;w}gn0k2bnFbxs8$Fw{%|de zzQ@SyyZ;TmEJS&LZ3eZwV82BpLZ&tiZR%bkTARvjtjD+2^D=h@>2^j4`z^Bg*f3W! z9Pi+WWzRp?cDi9^C@!++xIxT_PRiQMuHjx-*wYp#mA$U+1JF_1>lhpuxgdebrDMn6 z8nB>7P*W%e=LleECVqYO29tqNFD|f!w!S@-Ww=}gNvA%&+15`9&pJIXbQ_Q6I3{-& zTd+|(UP-~9iJw`O(2!3{LzeCOCTl{L@CUZD<;F8E^M)BrzI8^nYy|~Z4zI%As@1mL)bj!ri-~&K_nqYR@X$v9 zWGvYoajI~D+N*V3$Fh;+edliGd2P+Fzcp4TpX-QG1FW->(AFET^abeDU?c#)B@YT% z84@gEKgbu+?@?rz&@@*>Ox4ZUE@9ZjElt5 z30PhV_HAzqfl`Fiy~3Fxq-YHwwS*)~6ps1y9N{QwdME=U|A57+tx7hr#n1R4&9)O@ z*V%K_uSwiq>0p?qtCmF1#=}A|j;hC17U=Mib5eyS$WBMCL+gvuPD=cg?6PKhBQX<4 z$IVy{lU3Byd;r!k(BCY>;lj9v1nG)wtnbN_NO}Zt@I!l&)f7E0#9^h_Zbxc#X)Cax z=HIoXq8K`tV4nb%B#rc|OR`(<5R1Wo%H}3Ims`s^?h5U+>j?1}V7tQtpeWb zH@Uxo46WiaZIml-uJh4rxvN|-@U*{Q>Pi9;bcI>#%l#t zquA>I3OgX>KA;5SFT<#P+-H}t$!(+#FeF@{jGIA4)^@)w zTC#lScZA>0i$*mmOc`}ak$s!ra{E{DrIpkP4=2+c$ZKMhl()4jXEn!sE^5bI`F)Jl zci&~so9if|?r>chdX}G6)8m|*pLpe;VAJxvRdX_G8v#9(7ved)+`$4Mn5WvAR;Rs$lD&m-j*5`U-$lF|MY-`$hVD z?nDMe^s`g_#P#LW3=!u3ly;5tF^3+4T-xpqT~1+7(nWIvfNP^^FQ6}Br-lxpv*>*$ z*{+yNm&OrISDalkmntl2b>!*EOKL zW}wJCP)0>T(dr9ZbS)c~pKkYB7<3?&cuB_2de*bsyW1K_H#@ zY^QYCV~k(U=@z96C67~b|6foCb%FHkMV~nWaOr3X5u_H*%*b#hwqEuR`NKh)eQKh6 zc&`_{7mGcw?~=Z)P${t4-QMMlOLzruLw6mLWfzTc_6PnD_h07EbMEt4+VgiVFx@zX z(v&B$ky*$6bQ}$6qF%Zv(P>~S*`_)itkF5@dGBy21#Odk65FBK@q%`}G*1I>YP5hk z?H1`^k`|B~XbB%FHQ9lG-7V3|(n|zBq`Y)*61eiHJH|qhIcWwkRjX-~aMRE^2kG|_ zYO%w}a{zYRX~D?4)_}Nb)rUPqx)~C|9^m6vCL76!CX>5=$OcVRLc;Z;z7Vs z`~=PWd|gM3&jFu@65nWLPBQ`rSnG(Yh5Fgj;K2`^)7Ymy-wnOrGc!%uB)HjWj1D@e zo<1=SoTtmup;utP<;6Mh;-mX94Qv4)en#(*lJ)VM=Yq`iS_bN0tdC@aQyf(P$Cj&y ztTuHwbFj5Dr(7vWIzIAZp@k{fJS1KgAaOB#vN|mXhQy+6yyPNYRk!@F-Ld}A8zLoyXh(e z@X}m5;nIg6U4N_c*$tG81Qlhr3=>1tpH`xuZ=03m&-F=gxdDw8V*LO)`J| z@ssWGbNH88NzY9cybfv#wy2peHOm+!n{|8MOBp3xAL(zc(r%Vg6sxo81zJY)sz1%7 zAN5kc;hT)?N`VBMP~Odjb4P{TDaeNHlEFj;C;5$HK6C{`)-zXu?tcv)(@@U##a2Oz zVrt}DWL}hNx^54^viYFDDGdiLl=kC#B_|+}U{4`b}KDU71eC?<4WK+(9kMR%5 zN_kD4BAV+IiTS~_Xj+A}(szf|bVNKN$BjV@A6p;u*Ql5r)Bpj8^IVi6tV+&wghn(0!c~Zt33v1& zG-H0nU#{T87_`qlt>S;HPX-hC+bxHPfvo|C@|?ZQr2aN}6X)5`@`3_(Jn%WVk+#*m znD6Op9%k)wq$9kSU}7+3%GopO{xHej-+B{#1i9)wn68VwVFk?}M1Y+JtcnC`eVSSU^H z=H^IlwU9l=xL(taJvpgR_^{Fc>o>+f6ypXVv}{xO0cxK0QhHRZP*B(Lryo zo&d8nNsrlaCscb>CM5NOAC5Ip{adT_s}8>D+gJzVRpn!`?+axeo2L<^HWj@)k@iA( z@ub*IzLAmIFycd}eh_4w(x?!NFITK>xj`q#wLNllkcGoOccZgHl?;6iUf0wBccwz$A6e|a*nsc{#mVPXu;-K2X;7zuL0!&p#}+BT1Rft7xw~Un?mP5I1{#pK^;s(H5Q(7 zs;dD}Wu4x*fV6-FEei~cZdRppx3dk((lG1o*dv8@Ji-^XB$Ze*weGStywdCiBW&zH<7 zDFV|8?N^m`pM;~?#`!P7Sy~%$ycT}nPQ`9exxpwPxk`c{t^nXvCf1-JZ~y?3|0TFE z4gdbnggNjjk^z_Qec4*|pzv7uAf73zvxyj8`4nW64QWA79TxY@(nb|Xd<7K(1=L)vEC13^R}!COdWTc8=z@p?CaKX zVV=*~Cp5ec!*P5#M}(0Px}^!GLZ1b4s%v1MhHXjpJDo09HD42bZ1nkc*ouula4@j+ z9LHP$00RIJatpQ~Fb~_X3!ZitRyIwsTkV`zc#PKXAe&+DGACdNYfv&^&>($mnz>>b4rM zPO7kQbI0>v7g%_g)O;41Y?Bk@)4VB^yvFKyk~XCPuf6EB^&BD4GALfccjSnO{eY-;TO!sdvKrH~ z&gR$dc>IK$RgKg*+n#%6{hmUshko+L6R!t044U^8)>CZxUq@rX%yYq?W!_zDY}B(b z+UnnpH)>dzA=kv}#(Ap7*1Pd_ z*kWlT(f%B5oAfY@PF;Yc!|}{EW2qz(;CCE@#9*W1U*1VF{Z7&%g5n36p8+dN34f9#30qHzG`fSAL2)2%Gq3F@1p+5^&?xb9Jly76vs=hoQVg@t~ z01eVYC)_1x_)KGsX;jy z$)<&&@Lj!4<#AT1`Y-n`JGQcsy8~vTF5kq!la0aWVMpz8Wk#G4WZ={pm}mT=$om91 z$0d*Xk6bK^CC7$s6QV|g-k=XPBv&X04>jy2phWm+o&QjDW}k|T$|N0CMdK@t9;nnX z3MWl!9x# z23W4>J)8{{EE#44hjj>XAuj|5N5e`v<+BX@G1O1YT_ofVfO~fVm*`-H(V4r>q+3F3 zCZtcO2YnHyR^xegBgmS$4>`#fY*+9`<#L#8MT@iUYR%;p#hbx#pO24TA%9eEs zJMT1}QvL7;-bNWJHret?a$PWGLRjS%^1tx+c?|R^8$e%psiyNFkR6a;t2E7eDu%a! z5MO(Xb+!xMZ=V;7Gpm#(JPlm_{aOva;9GNoY%$I^?;#MioS{&vASTwYK6gx6cl)GA zj}?l;3rhxKQ5JMGaw>2Shv0*BiIl5%^3Zy4d8_VjW)*;ZH29`8onKCmfPgQz}Xov>tKvO=DWexDhq>sdrfK0PM+;DFYb7o!t(vyqp zK1W2i)<9mb1odnpK06}MZkZkmTFng$39vu#4@dTAT`xH^jFx!!2Q9{}%QxsEf1d|x zd)LZ|IVo0eDgMwHv16W~*Db@D{M3i9ZGk>d`_!YO&frEfyOexUGBPCs63yllN9jTW zX<#=1HC1L0U%C6_e{&kq3fuMh=Tzo0;UAS!c>@Ih_s`j~$w0N#2&f(Hj4YVbDw zKL`RF4uOCF)vQ%eAdV;!B^4*Q)(h6vCT;gj9g}2DAF1^k@p;u*eTWFN3f#Ff+L0`3 zTZH__t_no9^2gE$L^0`7Prdo`Q-#Xj_qw9$MQ_hIcdtRKC{w7E68IbTvPLW+2l5F+q2Ou{{KJ zM833F;kpwl>!&7tdy2hRNPU8nQJmz>=e|0~zUD*7#3Wt?OT*SeQenx8E@+uYZ*|pivo1R;TKs#%%l8V*{;{=A z#HT$Dpf;Og(Q=r(I1MFPVk2l$ynNJBG)iTlVT11iHpWeICr-mWL1`CaVr>davs zS^^cJ@)#epmmra_(0)GyShC!gsay=PY^_whH8P|787T@?+cyZe%I4A;HB&o3Kjc-)K-Z!=m(iDs$Vw zcVu%Oo}Xa+W<_3=QhhTEEN!vl-n)DefFX!7EZ^`}jMO}(v)|8%3huJgNN8Ei!_;T& z#%pl~%XfGAxj#VLmyuRdny%8fMdI^WAbVYYsd+pA&6GoxDD1Tbbb=)=Ole?~NZ4@t zb1E#UhgV7cKb>`Z_#c3r{tR^Z_@oY*vO5g!?D_VUlAovq)k&}fTa6iRY3lSQCXXQ} zF;%ui6~6Cf%R}8gR(E12Ilv0E32vvgV({H=NN+a6d&GV%o3?H#5YcM@84U@grh4ZE zpZ8@@fmFwzd@`5Xp-we#ANtMfV+a^C!K`LE$RDPq_808(a}B*s;tt&s8$U*e0rYjU z7|4jL=^AY-qv zx*cYW(2aBdjTr~@CZ|(n&M6=xUyS~RL=Na$ZB%josgH|EH|w>D#ibjs8b~0KFjx2( z`rFS?cN@Ih8_3Wyi^^1~tN5ZA%(9bITvKgK+Mo0GCe?M1(ku<3B46h9hV4$YG{E0@ z+_6TV5B8E}FG~g>7~~dBoTN%2)O*|@!TQPWgxfdDi)$-pZqPg438m&RjODn4GljZ+ z&-Gl_MO<}>x(f4`HK2#q{&j<>+AzCo{2XF`f?cXe%=b=8#3=?+IgUfG^V&`d1kVsZ zt^rcPmC#+)F?p5FW`{E32)bdOa&eSKv`)y^T8U}}NhNQLdV2C>vi7xx=6Wh6(ZX+D zaj~Tv2Y+;XFE5XG$f85Ab5UZ6_ET>qgHrInrZunV`~k!k9WR&7Sp0qyu?pRH{B$Gy zgOV(ZIVGbAa#fWU78?aH@!J{!o1=AinIleIttkVeu7nFVRxfyh+dij*r!W z4Q&m0vDUSCUHi4sqy;F(MD~9?m7F80PYTXXYTKW0{?CPCmY^zhXr1HC+^A#dKvxg-32aG0k@hY7I>W}+4Y@BlwRz`yf1u!Ojc{zBSj zL#?;T|7iHui?t}_t~3Nj$&I?@Qa2{AV7}(U`ofNhU6;-|Qhs&Eah_V{R*HF^#9JwO zRh-4PF|&+)2nBCTaTI+?y{@z)+gJMWQ(P_c1K>xOPyI|9RL&cj8b0e}5!zH30ID#7 z=c0fCw2{A8J;Y6BD3x3+V#2?Un~cp6AWGQOw)zTVA31$+&e*rLzr9x(_#hquZdEwt zi1p?DCME+Q#*$`w9QhjD`s&JnWqrZS&G8el`iG%|^>kr`L=0kf&XTulT)NbxZ8NFP zHPoW=8ETnjFKKTII0%Q7OTTC&zMWkGc%`Z68*{aTqAppfj)kKX1d4wogADyI;49M9*~$+txBwYh+;T#Y9V_|rlm~yWH8sjc#f^>Ij~3CnxlI_0QHmvym)7htJo47M-pqEkJc=z=M zoG<}a0g70gmos}3Czq1TsNj6PY+;UuYPR&8mlc>>P(s-Cva|$UNBlnRVpFn68b7`_ zjTZuBV$0b~x(q{*oSD?AsG*|1Jx9S@!dQBhhe$&TlFhQmT4xy#R(L}?XC7#&uC*W& zIwXP#Zt0tw9AFor25k4mgPLvO!lNp1LouAW%d3dsX?PGjl(8EdWI0cHaZnfPZ^Ho7 z*{W@21gC#@G-NXLtL=A64s_9^Ar}{OqYms*Oe1Z-nFyoQ=w&=!0j@WXmI$RV?oca` zpBUV2s&Jz%E>>%s;rsURIIyr*@kyHvK(Px=`>_*`FkxunF_ogKF+~6UdoQb=hNVct zocwiSSxyU546OAE?E7g-qULmh$;wM&_}}hVP?-4wMLq3W-)odCnG5 zDizjf?j}$Z$PYbGt=Tp*N>}^s|0X`%`ouavT8mU=wq6i<93F+#!fbSYraTvPiBY^x zaaafCHS?e?apZDgr83Sug|EH@XPbBHEBu(CVNYNZi3Um_>o*!{|DHDRHc~(|W<=3_ zDo+l%D$iLw&hx}_Jq)sMHVY-%ODgjUr<-YLp5Fu~2R$mcg0ogEY#G&kqg+y2^qnXV z`UH~o6oi^FX9gR!>doX67V$$l;M;zsVBt1e9>vvhQf5HMOSAnjy@#>6e@l>k*?^@x zQ0#i+*JuU98;DIsw4F*j`Apqy{;2T*)57abSMW_uz34|520Z+;Fo9 z;O1SQKb6S8UV5Z~K@h4Pzi+kqo5{tffXQnM zamvGI>Kl`C175w&#-*Ce{WNv8^rI+w<|%qQvt{Vhyu@*$Yr`;t_*4W?NeNZn4&|x_ zq!9oLj*P(JtXDgb7&@(T*K0>^spsq#v27a#G3>ISiWlnpROuI|+5pwBwy%y6eE(oq zqN>KUmxWEIzL@bqr(Yk=(?KxCsTrG`jQd&`XuFg0XufVv4%F!Q;+2}b7*ob`o zVjceSuMd~dh9ei2GXd|}_z#C&M)UzB&6zbfk5)HTX4|ln7YmU&sDvSYreB>-=&?E6 z?lPDHEPn={bEsfAWPU5^OgFco&#Ek}NM2#jUApkW zoMB=+@yG=EZ^+USeEgNspvY%6jp%DgBu8{RE5q+xKwSRJfl$z}k_YS`b)~I2a?=#L zg2_uC>aQ3e92z~_FNM~rgh($qp!c&;yOH9xKYyw_e1NJPBcm+iht>&B5xS2*oXAcDyWVoEOJhP-M8eHJg? zQYU71N#>hWDBbAnYy8ebFb)5tyDI3hf9kg20cl!S4H8OW+hPV-PoW4rSQWud;+*!@ z{p2%xQ|0g|ldY?_NaNQtkS3JrEnk=Xq=4=)*)5rE&f}6-A_~pDNZRybnDcIQ9~$Q`nTlCzBp!~XiGhyhS_B$yqpO?-RcPw zRW>*bIQ1}|+OvytKSk_NO1bE`w4fgWWbT2DUyTgxQfyUyL9<9i0-AhF+rt9uUl>@f zA&Q;S5`T|B6Cg`chCMj5)~m@Z8&fISA2k*B-!h8$k3gur>R{bOBZG1xjJ9saj1-dS zwFHo@=*TQh1W)gqIb4h=+hLK+4Q1krNF>H6`+Hue$Fa-_Q%wa}!I6!;wiL_=1kWM? z`H73G!@!?RoHWypto>X{EDsJ?b2!!2M^edY9SZK137G4KZ3dw|Ct>YbOVr$44wsrk zMQK1%kF20&ixzg({AjwMrVe4fg1s3f*DVW)-qu>Y;Sn= z3j3_8wcm7EHKp=d?crs2jSkw^$NyIFpCx_cXB-%uw~t>bgJ4abamwS)BptrwXU_PO z)=W(Lo#mH@W>wAUX%oJr!sQ*a2`(PGhoyX0eGiZQS(bTSqz;m1}iIU@1 zkBrHhhnYHN=h-7`RQo&^|MD2P;J4`c$FgV}X@GG(Vg)og_y)K5ZW_BxlNV=fV*xl= zEcYl#FhIRzyf?M#T=7p0T zuFpW}iHVh5wG&a(0LX@V{EMZ`o=xN&w@sw(&bcy1uYKOSzIoJM>w1n2s!Ph({hdmq zU24%9QJyoVjN1r(rY_Ri296;5ET8q8OKZ&ZR$>{Ffe?g(aL9=*t z#3sIy#ZBUiAwCg82rd;yJ4qnq7#v>1J5fQg=w!z_!mz6RVzs`bQhyrVNMY!U=J67@ z*PoO#fr|(v$V^*!)u~jlQ+cLmjZS%VuuoIYW5g&`{!!LotHSTj){Ywmn zJh6nO$6&`a1SM(dso>i+S?PT3?$+M*q~Wl&+dp=&BI$-6KlgldVw93Hh(SNPo>J$j zyi;NvFI-%4#BzXblN1lgt0IzWJvi(IQo3Ud9N^ikgQE?j_ zklaB1MYV~iGw3exmXKJT#^3!oz@4s4I{_J-F&m$<_Vf(YIh>P;qJJZ(d(uA*fOk94 zB(znwWE86WicnQ*YAY$N*~q>tbzq|`$uv80ZvHM7Ia&By!%b4z7QlibNTWZlr%0Vb zWo;mri^T7?A+yy%s1)=H^3mT3hqNaJvwYmLLHGPQwY-?J1F|A~2Q9$1;H?=~==1hk zn9x|TKTv%}lTjRXfcZlD;_mn}=O`^gx@5m{&~00kNMJBSt2uI6P;{U{T#5wO=##k) ziTmpYIUHSotg@8Q%VI$fii5?G%+ETRJh)gjVfFMFiX94igRvkCqJlgKdHibgd?He;4$Y5DPA`Mnfwzoh(YP@Q25|Uy|RJ7&s zsZIsk5sRu)9#qRb_o8ZAG519e0nYNbA*TN|o`@4qnl?HDk-vfoMKg?@)Liqs!xLAW zK#pq{hvi)vq&rnNP(efW0*ZAD;)%gc3OixcH)W-cuD7&Acut-m8~-i)pwYle<6s-1Wcf`@{ZQ!2WczJ9Kj&j)%NIOt4A5}yzjF{y zmD;`vBLCOQ*BmM}ymZl!z6T&dQ^$C5n58J^%bp*UWt_)jRTkO}_|0yx3vA0E))A;1 zMjJVs^4)2c+*-Konw=4yw{|Y$T5L$r;gO|q)3Nly4kc=s^-&_sXRY%i=^WbQ~)_b3KtV_FoT9P94#=#m>qWO)n+P0c1J0FOX4U)4F)^09#Dj z!mSOnQbjcS%^wz^J%Zh-c=je1)Q>yxjBa@|8^<8aB$JMD!F-IA&J#VNgVCi|V4PBr z7X(%3?&?+7FoXPzr}B3q158vMU{;8y4Yn{DAt(i+b!Vv-C6UU1;y@_-u2H5p3!0N_ z0z~?780K_AiaJ^etZ>qKeWL9N3MbLK)jHCC`ZzP=2g_-V7dnSC)rQ*uD}(VOvEKO} z2%NkQrJ)FO8qmOf&`hp5GVzp0p=@9}SxQtOb_v+XjsC)~#{FfH-9?thJQQ)E(b^D; z#S*1kVp@#vpEG$4ilesPPy>=;ko|0*t&{yWrzS({#MsMNfk3@o!rNpP3V(nX+*#xe zT{W<+vEJ@+nkM9H*(P^S>8;WH`X+A@z%?Twuu_7z6KAm0>DR#TXA9K}3zZ?N?-4() zND8y`(ZWUap6`rmt=rN6rLW`)a0z!;QY-OiE8WmL>hpltU9=$U86>(-_KOqyW43I2 zIR3rG##K%6QkB(}!LHD}mLv-a;(poVa+a$a8mTadW=w5U)GOgfkzC0RbvYq?+b$Oc z=cNt}o$5mP|AV={qTXRn^sqsYZE+fKz6>HPD^{mtVYfIzY?{rBC3YUB1;ayImB~^dN&JppN#WL)i(`U{9|AkeEZk^=@Owj*Xs%Ggfl&{?;<6etNi&QHkV zVOp?|=xN+p0ols}+ z-cqjxGibDMdOeU4I!woK8lk2x!A+x|Pf4SRby4LD6?Y~Ov%M9U(d0?UJvK8uENH~X z(&_Hq!B8iD`1VoCOzxw6+_*DWxJf2n&vshPkbIbjNw$G`nRs)ap`xhTyE0m^ss(>T zx|@rJa7ksJWV2M56|-c_-aDYL5-`>G?h6P(icApGWiWrcFHo3eRc1JPR3T%`%p^so zp;5>6|2(2@ZusZVKO;{pSuLQ?^!?L)KE%nfpYApxEQRM1MnhiT}y>0j{7vHhbs$k=DD}|dx z;^1=lTV*UmkWeWOUgdLU9#oU{US5$8)O&HKg!V--!|uJSUP7xnHDdxiA4nw{Laak( z+xt~$m~F|Ua33^|W+ZYnwSP{{V`dRbQ$(ndrb9Y^`-AB)I_xTz${w&$U2Djpk|`_d z%>sj&HSv~S>Ssvp1-ud_ap8X8xRw~lEZ81S9Z~OXoG=bij+FbX_qixVO2}$DnV(~_ zSCgd=4&oWH3Lp_`KEFyRm1&aQS>HM@Ak!zhH<;O50IxZ`3Pet^W!o=M#;?bE!8mVq zqyj#zq#WBf`|T0pGYwT+9dlAe;S3r>QgUX-FX@3CsuzH43(w>MNuo3^4FYEQfXp&=+!=S}s8{Qbo*0F3~a= zETQpF$v=AqW6xNrh4-|9K1hHQWwi;gYK@*@EDI(z6D|(dyqHInc!iFmO_}pON~zDk zCX&841Rk@-QV4p^k5$lnQ(Zh{DPiW7*r+3Sw*s~tb1lvzAA@2*MDOE}9mbHTr7k>; zbrb4yLM2A(m52sZ@{9#lxQjTW6mY^NBvuGQ5DLr(h;&PaEt*TwkSchp2+542?|MkC zAW~bx(vnYxnwM=2-$fr!3ek#QW13Q=KZ{J*hEMmF(u5DJ$QzWQlBfB{QNobRM^|0e zt&A?TPrJSFsmBC5*p1_eRyMJ~;aXH>(SsK~k}Fner8FK*zzvWluNyqF?q=H(;ITDt zatFD7|K=1#iWaOihQqgOnwYf;`$>=AK`BmT#KEoM@V6$lr!)v4)&{#Q^z&)$rjE4J zvKJNwJf`RieQv9m-mZcSv;#~0l5Hr~TMC={5mO*CSYKo4_^yt;%p+gLT&9~VG0(Jj zF0$-WbG6U7J+;R3KKL@+bbB|Tf0xO-GG=*lj z6<#(yuSU%z-0ZlQSk*0oE_F<@|7CZEP{~`IBJdgyh3{vHlhC4;BPT0cEU4(sjo=18 zHDpbM942i(eS?_J=w*qOoXi zd{vHm7X6bDe)u;mjS;Xi@&=itDvL*?D$#WgQ?W-ZZaoB+`5cIn;?UfhcI%EtnphF) z&?D7arb<*NC?p+JpjGh@O{`B-dH3F@qCYZ|Qwrf;w-M;qt`EnOsUs!u!a2HHfJdNZ z;BgJnGH-PCyk zXU>rFw=0=qDLJbzcslCVwy<$+77oBzN=e=OPMP!lk6*WZszUGHJ@Vy;bGnFb_-ERR zY}(lHhc{ixjU^4bKgqW$0HS4i4#>=dkXFr6mzZ$2(>hl>?l4S8Y_@jWW^putO%)3~ zB@ppHBj`NEoYRcY7Xyp1BQKuSdFNScFNb4KiBTGG$0H~3^UI55-@!vg-udF5vlEQ- zBG-bH6=mzo(i-SNE}bCLVdKUptDhMy?wdoGc@$zNt&_J#R2>pZUG*@lEA|*SQ_@Eh z&%9V2Im@ySI2|J(f$p{x+JBOoFeF@dBU9OB`z(eaibi9``Ez@z4&Ox_GjvG7_j;B_sX@!aognePGj`?QO_vO`#xAwn1 zZduqkyo1*`iDu6#jh4LWxK%6en;RH*1n7%%qx+OXQLy>eQ(c5j98lb~;MCir*+%I7 z1GTZuM=Wfr$`Q&L^S>qO8*K8kHUjbfk#o4J@#bpBw?u|J&$|vdY=DsHbCQ#6C`&M5 z;V+Vv!;7I1ATH3!J?D{0u;;2-VmQ3t=IeV7IfxkLxbfbm-KJE9;9e@5rKC{#jc!Mm za)EWxhyRHyN(0soM&aG1TBZ2slo4~Zb6G&eo_kRJ=Bmfsry&ze9o$9=SDv2$@ss6Q z4uGEXAR$$laTRp>BE*M?zB8syXPOhPM^t&ZP03igfn8>4T!L1WM*C&C!bROng(OOl6Nq0k$)Ueyl zRv6mg;fs**tGoR-s;qi;z0hQ#ec6_vBfGRL+UBxFO2gISx%hQRNL90KBc1fuBVxtU zEB<8?*8zi49%@Wi_aw<+xrvwat~e_n@89}(jP5Rhk-C`J27co9V28SQJ-( z_e$JlFfNz_@|U7GAn1pVQP^bri9$FKZXV7klJNZJiHyj*vrjaN;Ea#j8IINfFQ9kn4F)L4<26=dsH8+_IK+wnYyA_d3LC%`l6C zy1p7VatYlq{u!nF!&2o)!B4#z=`?)89Jfs-G(6zw}Jn&|ELa+H$5f#Tnwf<)`ibY>)qE9G_ z6Lmci0pE21&A!icwn{{%@IYCOR9KHW-?9Da6h&j^FKN|S6IK7qs=ic6Zm1=jeh zA+2FEKh;IEhK1mT9g;r)dE|R?X$t`}8fnYk8>~>=2fZ_|gIjYiPGwmFR;j)5r(S;? z0g?azw9y!Pl0XuShwYIEKBE*uTrK116T(xqs*?1`Lv_jpmSQASXJq&0ozp zuk+pw7r~L~|K?s#f3gSflt6qd_)gr$DNZ1c+fc|_CX*ljV zr&Dw-C8JR{zq7e6;CeYK)S107$itY5hU6HLw~?FROW|L&$1O*;f+kt1GV?iua8tZbm&BJ<^ER=^sdB?46J zs5tLVnYI_bD?jcUmwTt6Tr5m*WM+LKK1FI!i(0wj-k=@czzeLmk?JbH4)^mP7vD+3 zC(!uoWJ-ld@OhP#4{;Ecn~5*Ks8g^afNVdbWVdKjN>b4C!z z|Az%AMxaf2s37YPsuzoLfCHB^jAVIt3=&7xQW-P=4~ZZYb&z}f$c^uhn7TOlVrDIP9?mTuZ z8SBjzw?)Lxuu~Lj#nB(6)|2S}13@9!rDHt5o$ZsJru5-p;wMD zT3IiQXFPy~Z^oJY{R{7LC)}haDM+88&JPtiq%WWBD&q(FN_3eA$E!HKGxw?gPt?;% zA2{Z3btqFl9)4L~7;hm0S|YpQ7ik)1b+a5CrV1)H84*Vq|45Zoik69_?Ar+E&r5Gp z$Nj~WfDfGAU;h5uZ^|hgH$mcLn?=@Qjgw#ROM;E-?#POOu-tl2qagWc!c z!g94u)_ZfQK+S0O9=fTLPF>jaj{p=fZ?Z;rkf%MgaIPx&>o+)1I$2zBf`U? z=AH^TKLT%p?306SM|Q{c_SyPql&zf+C8yVb-a?)Xq}Xn9r~Uyd3)BrNL<@ZAIY5jh zJ|4{<+4}K_vP!#7vJh{X5>u4zwm($XqQ9frss1s&oU|#w987j0{(U{lM{7+%bhmCUC76)MJ??nzq(O=^x8bMGt9X~JU4mg;C?a)% zK-M}R>Y%HY9!f2nX4jr;OR8mZjJY3^VmOqok8JA6D~pY#X}XMPB``M=+kr#V3_v_s9KURyTJxD#3L@71u> zwosb^9X2*!UT;v4R&EJAAL+9DvwZ9}&Orx2U}BG&)+=~IN3%aTZhle0Y|%!fbjU=N z5~(llQsE?f|GtirwjXfr!nC4l_%P*2G{^2jz<6nVpq&+^qc{J5$2wU_4TRBHR_tK| z1PFr0&!PN7)SC&VXouV78))7TzmPQx&}^39?Y2)co;%u1E)z3vY_(%}4h_)>6)AA|9-&tpSukB3f zE~wY;yF}vOOms+aNuInKUf-Ky`t1R&0uy;QDWlzXwHlP=Glo|ERuNf3>lPjo@V2gsdPoUb>XSZ>Kj4brmPA?3BB-p_1XsL2 z`+U4(`0t#H&@LG^TTY$JbU*F#fJm7GbpEzOh(@qqVx%euf_yBZTu+$&QHrWe4FrK-YX2E9mXT3-mLcwb0M$ z(k--|cJZ|R5k)Hn$|X@Kg1Tn>v&pi#We`wtg3N|Fqu=lD*Gv6ge&bgA&={XmdqrBXIoY4y7+W26aj86Q32=ed5R%BCc5{B(pR7 ztS&V;Ievzy>_P${(Uh?wXyTd#^5k2>?I%R+G}w>f#XUD-1OARnA6IzjhS={tL*@m1 z2zY*;zg$y9(*V1Q#&LLk^6XLc?24ShsR#Moo5Kwj3k9`jj<7WK^5@sYg?OHQWmVyn z{=jYO#NoJULb(;>OoS(jKPGdJY7nJb$I_=XW@Cs5Qf>a*(67?hv7|*AFu82{`*McD zFY(p}F}OL!Jb6p#j@qPIrON)WMEm+~rRFey&55MwC>3N1O!K6zzt1y~gd{JdCo~GB z;to|EH3h=kh<5iV^qL0EQIjc6CV&#_=J)qp@>=u0CO!w?XyM#_qfus}fDzYOrokMD zjLw;kQ4HskeMjD!!O|`wphtQl?~8Dm3>@9K9TkmqPv~4wKw#ekSsjL>Cr&VMKs|lm zTO_ESwv|&3(#@^M3LPT}7}h*9DzC-ONGu(|QtNt&;5^m+r`x#mh$-HlR;2Ir`7>d) z{3nUGz9tBE=^r8B^Az{u=P!N-a``3GS23>bOSLJ0ha4=##&Nll0i)!iZ{6p?(~k2NF~yvg#nO-Y#<(f-b5r?cyWUkTo0h?8;#Dhkf~td)&HIT zVihfMm}iP%$_m|{f^hi7BDYrz{mKW>`t^hfKkS~5=g09pngC0?9vV4~(U(t?;3io! z;t5n9?CzfoJw|FH5_A$#SyP8Ey=H05-B#X8WZ?~sIH48eIgci2gQH=I{CI%n2zM&= zNjoL8$-^O9VEimyb(jnp`Q&s9MX-gKN9m159 zAC_Sr?6KH^b-`E`pH!2ySvK5`x6%hemDIE#)}ppEbiy!BO!9I0xPmtMQjejb$8o!v zwZ1mOz;)^BxtArT;dMK{29A?5lJ_aCZsZVCZjo1YWu)k1l%4_23}|oj<_W*l<+k~jr$^yghb6& z8J7V?P8{Co;FSHt6`p=}34s6X*99A4$~m3@C?)t1tm1G1;8eak{UUm^x?w)qla1bLNc~ zl#)lW?(ZHar}(y&jR0f&HRT_5Mh?hVle!qK=&1 zSa#KsH(<#Df{9OXKXB-tvWlP(CV^J+HGlHAXVe5MHtv<xaAWEAlW(T>%UdJ2=Di>wXAdOc&u9sM#ZID&&cD zLhJf2b1jGe``%-F6!se)8RmkhNvIfi;$d~xM8jMQDEAOm zkHIAUky9t|E1vb;33W_piX0Udz_UHT?h6t^XZ?JdXHWg=^P5PY=Q|h~ZT`Ady7I)^ zpvF3ixf$T4c*8gN=-eB0KsgqKxSCy{gqL?^ZNEM!KU&`+iIbpw94fmA;6OYI)iO>v zL+P`YFk8FHSU&f&cv$;f7IBL2Df(@cwf@}yq@phBaK+n&>!oFP{;%Rc-=rHzUE*$c z+O2-wPD^;aI4%f2ufMYL)_e!#Rj+Wybx>HQ0^V6{L3 zG3Y~4r4sG6D7dadG*DeoWvf*gP{eyHNv5<#fKg{(Z0V#tJy3*ychX1K**P=KZrg|{ zOug6Ecmr9RSEK3n@Z2BNytVuOE68V{V9KC>-rUfsj+WrD*p|8e5;6<=6j}TLO^!e< z>eyk?MiFc{{tm#{EhBWj0hLSDk~ z%Xe39?ISS;7r88k^vRhh5MY!6GpMz{91z!q?37VNYTkS6*ZNmxq?+yLRPe+FZn>IJ9qV608NkuFb#Vcd{; z_eoP9v6q^Ozpov00iw@WCeo!4UZ@I-GIFM(qgMysSDAaoV|C3q1i-y0&g~6aU{hW{ zwtfjr+uJH;dc=m{NA;|RIg1bge=EE)0%S1aiAyZYL+0#O1ug@?LILIrp5(u1wr0nI zSukiWykhfn@vi!V$9o@W+yzc_S{;CTJpdd@O4;3H8EU|eY~xLuK&6A6Z7NjsJ7n1hRv|AmlEb+u|VFdGQuUL z7FaO;o{}KJ%^n_0jL}$IRHtojjJ&L^I=V&$CrmrAHg<8)Y&Q!o$FG!UyAb`(!3fgAKk}3EyZ0>$Fh;VJ(HU2*lDaAJ z-cimd>wPMth}u-xBOm1&==ef&0t{1 z2%53o>szSp?3Z&nd5b-yjOKXG8OD}!+{^=VXN5NTy(|W@!gMDkjaM$O_(r=+T0=fj z=f5bCsM7X@L(+$H+Fce~L$JadM4IQxsMp@?+HPzuS3x4lku+d_V#-DMlmM~u2p!|e z_8ge7Hq(UDds&0k=3_MS^0Pkly6>po8~xd-x(QWied;e!y_kp*WvEM{!6sXR-_bJwhpvw%u14nsYHJ6=PCs z0C2dij#^(?H@np=<_AJa*zKwh-Hg)*{wF~cRlqO*YGrPEGYl$}vdhW*wcn~%*C)2K zP(_F8Tp~qhgUg{3!0@9q=P8L)Q-9E7C%}&`7`ZwrG2d?{H>ovWd_xj zH+&jS`C=kI@-=dUP7|F$AFo`-a4TeAcw1yw5q5yoU(s+0J}QxU?@puN_Np`yg^~vc zV3xap)Z_%HH7mIeh3GXLkDD?{w* zS2Oy-9t~yP@I5KGT9*^_krC+lz_6Dz|3 z1~k{A-h!M1u+YE^)U{VFY&rnD6(hK!I-*O%&T9NLYb62aVZ0e`@aIbktsMsBW#(O1 zRdp_2C;RD{#8oT7TKIPPA%|!i19x5IQ5Qv`pZGo3ecEF`R>FQ0mZWjpETpedG>7;+ z@KR!`%a!v*7-o|uIx9^{f84f|2{b<|PUv^ME|f>w*1&&t5t6lUhAWm?79BIZOIB86 zlJ9QjLRye$8sAcFpyMEH5Jo3?j)1VgpTQmO_^~;&*toXA-g_oQ?@xzdwp?40juk%Q z`)s-t{<~UAGLdF`SB|d4?oLLNpm)7K`_NL2GU<+v6Ez!+A3scBg0XKlM0(IC2<{-R zT2|zaKkiR8wl(d*l_S%T7l;eH`gy>tSEJfZ%@jw)+evlFXX3u3$tdE$ zxuIg$%Qw(;8^($3PANh^-xA$DyKj^rsUNE01^fjJ>LX_&Z^CR&N5Qrie@S{d(2DD+ zx=2P&$GJx{UgG*W$S&S`@xZhE#bz*h>sVFp9K*eBEYw9^5#ze>2Od$~L%k9|X9NNcZ_u@IYVzV4Q;$T1}pEp#c-9G7NePChQEw z{lIf!u&FI`ya#kJ0-k{3bv3XVYdn}LEU*hRC)s?5#x=Z3jiO80oGt;k>KY7t{738F z;Ki=J^>M=5wpYK^D5|5kiNpxe6UV#pKcgfL@V}b<+32aFw4XVP!Y@s__vi|M zqj!;e0~cC5{wKZ4uEU=E`e`kPL&p^_mPc$J@(cZs1EZ?*N6R!lJ}%Yi)COi~1FHcT zuGawhoBvC7f->YONJ639dCfu;ND0Yvt%{}vs_IjeG?am6MA^s;f)hJfB;dxiS?OYR zxCLOr>hZWd4JVXIpp8y;BpMZe9coB;@c6WM;_ZdG+{3LU4S-70rm;j&Owh5_cicrb z#`+u-Kp;`=*X}Xw7Bk_POu-qx*SuNw@QAz|^|WKGod2{t7!ZLHtF&ZO`w+kMtn-8? zM|JwtaO|9LyC>*>0RT{-B0O!HSsGrfdJS7x^MT!zKmgxS0?$2jO^!Oe1)w+H^;1T%DC>D*O_K!SaS zg&i?0=I70N@AMl(_@z!pY!`r*Wpwed`P9g^$M4g#)xx2AN?UuC0u3#QF|PE~a?1fhiXi_~ZU6Z2j3 z0qfB1sKrh4b0-WdcGaQc0X~ix(N&ai1>H$948ra7@>OO)0@T3EYP=+c6y)>{v7KUu zoE-sU31mGd9fViz@plrz*cXK7R5&gNXf|$53zA?_(6@+|S8kyNE1#=C#bRLTnG^NR zxH$}+eOlQ>+-5>=7J)s?C&#LbXNi>n3?^y^C+7_*SDZ25%~@qS@DkSIZS&NOA4_S> zA@Z7no)=ddE6=H-1_nym6ULeLWT42Fzg6 zokKTAKppz-{>Tbcp#!jDuk*#y(yfv1o>q$?2ky#R2>F>jFIcVkqmu+^0?EEkPdeB{ z=OuCkk9+#dN70{{N4T~ov!36BCb5=q_4rgIOxwHeS}xxGi&ADYtr5OsaN-EGmS64I zsgUI`>4tZ!ujm=fro7>?$9lC&uM~ml$*`oQ?ylwH@|5Gl$DO5&ko9ZaJ^ote+!XL1 zGx=A$XXlDc5P*_LH4<(Hg3ROC9{^+q4+5jhUG)0nT?NLeiReGMc`YRJTRFb3p22vC zA-LK6CU8mC+iXU2(-)Jd0_iV~^}fxEBp7lgo|as;BBrWTx=aI%y}DfYRW?6 zuvGAisHKftS-K=sycluxthB|%%HEOr8_kmXylQSIKk%ni*3(I@mK%(74at+fZLk+B z4$h0)9$mjG?qRA>0Z-|PB8qB(Q3d#Vv-P%7RM}>txRW}I7jEW3i=xz}!n-9KeWKhA z6~_CJEYi&hZN7JKn4Mqz;-QMXL#SBA<*SKK6VD&tt;1VPP&W#!XRrnZ1#UvvJJjes zg5YMou^k!7f2^zKnpp04-}>B=MGu;WZp=7|YY^PE4~^? zK7b;Roz?A5J&^qHTrmd&Vbzru8y5TPr|KTzSv)iH9LW%JbkrFEydG;CA09H%$GXrLGuAKX1qy>k5a=Y1=}T^ z;WnOx%NpV&MK8~3%+d{~`^|}fQ8X^4wVYOz6S_kz=PD?gsLM(+WVIVfQ7hsj+|fy- z+bA|BI5pt^h~#N zo-%0wJSurXwu?CS)wSXY7oAQGMjhs_w&OsW9kJ-_&LIH%NUt#b?P<)+p1b>tAQz=~ zH)2qjb8y{6T_d^$nJIH_klnmm>h5Q;5Vs)uD#NIQ^qtht0Nl-DAaSx1OBecsIk<<>I`NpSUm`YKh;;0j_w9%4H zn*;W-xbiruM2L@fb5eI`WthjA)t(6I(EtMx2>QX`j1by&A3fnDXhQ#k`V(hmY^klZ z+W+Se>Ub1GTpFZR737vZ`VSQMAA)diGY=Y>iQ2_yNXi#GPp^+WVsh{#oZRP$jI%so zGDb3Phs`ZU`@Zrkds>9TWGZ}F=;3?G+V%t6SB1d`LEi7ut@&Pc{_B+lHVCWvp79-J z3$6z-?HW=hue(K&7MImh^pcnjFEVgUH6>Gv{%T1=o4K8cV)eX+^PSl%ogJBCov?G` zP%V)Am2^w6{%}1v(U`Qm^w@Nrim$G{L!lajC$F?Kc6d-vCt%^_KMzuWuBG`j5&?9+?bSqjKs*YjzC6LAut0c>1Cx_e`hl^>BCxAx~ThCSA*Z*FcFxH zn|0~Cy~bOc-mktAKYAP4RaTrmysN{AF=7_N2_W_)UYA0BpV`Z?X%gpYx(i$1AO*O6 z{#uk3CD{6%gn?1WWgYx#EhQzf4p_*91)O$_e`g}7Zrn_quMA_V(Wy+-Pk08xfrKu^ z=huF`yrE>%-Tiu6);;*n(*}eapSB|`YOTI7RZByf$cOs`|Eg8J-hWVODktf~v34?9 zUG^+W6p1@Y&zNRZC4vWfTqhHK?QVXgH%JIfC@iAyPu#lYodYvt!*NC`GH~{y>HL=? z9Fb_eXi8F3(B&`JD?c|<>u!c87a;eYqg6+$^?89Jn*rSu>v8eBsx#Y1b5 zEA+enyr-s@u`UU*a@-JVu{oY??Gk6OZhS7;32574s%Gigy)i&ya?(Do{EE(KE*vQ3 zR`7t#_~##T#4^=h185OEm-9``lVsl1!2bjpz%EPm^3;8;Ru;oKRqy$DW3|iN7i2Kt ziynx@1rf~G2i-a+p5(@v7y~)>BucU*kb{ZSJ#UdQ^~)P&DrP-J%a8r>3_@_n!d1oz zQ2|~1^QWd#iSQo1m7<{fF~NU{Kgh11k@u7i+5-fyaTIXH#%tw$rTXm$=hg8?2&2y9 zU*qdNP0plATNenb1o;7?0H&+iIS3s8d^4+|9F@kNe>wj6Uk@9wDyO<>|z!@$;35^(WVXgT$e;mTJ zIE;ebfG+sD>BNg=CWdTnC4>`N8Vc#7?E;q>M0--PXZEK#cy|RK5=$63CBDbKsExCe zuj6$J!Zt<^PE^176-*WO?5buM8qG!T;tM^f=~=Gz0Xz{JaZ{A~eX${z+cTaEOo!vj z_QM}4QJ%}mvvWH&O-Iuo5BxYc$>!S(Qn~aj{OHVJf{ay;4wtM16R3KM{!B&8=n$}! z(c7{e%>?O^drOBj05)eBDcx-8TLlFBOn6dP(@z&fV>Q;RG1|HYxm<|(OTp^xos_>> zJ@({|^3xK9DJtBwU}qsB1n>~cqZhXcH+dlo2SPL7q8o~`7Uk3Jm~s`c2@Xa`m4`3Y zk=9YHqdF-(#wy}_rt6tsb6G}XV}eu~bU{TMUjk9WxaMN!e3OG(%Jv&NJktSlC}89D zGGGY2Y`>CtfrRJ)q~eNK%`#~?{O+2y5yZ`%PIM7RMzn5L)FHvli`=y8zMMH7u1j(k zxIkDN7xkc3%6&6G9l~_>75&G~tGd)e6vu;N_G1J*HIA}xaHIdtf@)2yj&5kee5Mib zZ5`^3M%wji3~ax(m*0Bw1!16F{3owVH!5Gi(IM!IL|>9tns%l;peEClXs%68!@{f$ ze&$t*Dm!{SJ_7e~!HA>h`q<=q<=8-|dNs&6%I9<;39j{*x>CQu zVzhMhw*h@@feDtm5;}46Vpa+F`IX(aT1v{2t*3$OMHAeiV=Wa|v>bMTi!75FY<$R% zR&t7YR%MP;TPgJhvBbZC>CqcH4!8d@(QZf~)p?=@mAplQN%0pn7U*aI2 zd8hvH9rjE8cgNA@gagP8eUkBDMy%Fkz~W%X8ll)B!fTu*kH-&IZ=?#6oItuXT$j!WqLtA($nDEi(TT(&P7v^)9J3 zg8N@Y$<@}?pjvJmTkqP)m3T@sgb5NLc5XPvT}< zuHLsdb1X3n4`YR%1H4r=o3QNxpA?4)3}o8YbbyPsnnkGTfUbQiboeopNc2tC;X?5J zYOyT&CItdKPsE+hw^NB??d#VHbd8I&N~<&3FJO-fblK_3brnz9d)-dnxOm(VnwxIM z(y3VV47!3TK#<^;2Bf?-$geQ>5Zc}|l7n5pRJhlPpu-Xv^a`EXnBJ0{WIt)zBByuV z`F7@pp2K13WE_BBw~G(hY`=LNF7AwHmD9rKhau_K`>{~N@*L{Tx7^KWC&{}ccIU(^ zM6#T5Rxz^hJmT=wzwaUAv` zeoQfts6dR;E;dJf_Vy+Diyeewp9rA-_rdqZ@hT}t*=@8;kN&Oho!`P$2h=_kAtpg| z)52wr(bZUdw{PtIl96e~YJJPh`veU8FtK{|;-r;OEKSzBcQdw`e>JSh2N3cPXCl74GjTEPA46Q5w?p_q?` zvrinkE?9~6au6N(;0>1i6v2SunF<9m!CYq;L?&lp_Sp7k;3serxH85;ClI`y$E;(|8#v&w~ z$Kg*MF(x=SUtXb700N^)48R~&heR5k+0*SyYxolHHD22KN*10g@mGOaejO60*R zHhgcR5-gTzXTYCzGc72$2{ns$k5@e4H5UXajMs4hEbjaKm*hs-oxOA=C4vTvR{MC9 z0YU8B(vRibQRZ1{%&e0+XW+^HUekspW_7jIugIaZZ-u$INJBH`TZwt9FS)=jZ(hHS zs~<}*alb6v3~cIL{N${fz>i#Jv~t|9@R&Fh`*5_@JbuenGw`++z^|TeMNk7$(+N!K zlUpzjpUmL^#$Gp~_%iuE%(Wh;I*D^BFvjQ1@n{h;i>KU}VC5;w0|IXX%TA3KH@h(- ze5WvDeHhb6>bP?&4Ek63e|m6W>V4ld3!5Goxw5I_`iDEey7`Cg?bObpt@Gg%yi934 zJ+tp&*IHz*;xW9m;#ZV}&3_{1-2nc1P$NN+qDsoPaj)$PI*bMr;1H;ThN+v;x8aeO zOmfQ7*9roM0}J^Qb35XCW#gp2I3pNRz;df)py*uJ`9$U8Mo*X^Zt0uv0qmqC_3Mt=5^ut!TY>m)b| zHbes-EFMFjE)uWD-$ObB0bJ+iVRIP0(~RcKf%Kv_-QFxKm8IapmZJ|tVoVh%g+tbK z34i((?CH0tBn($1t+q$ch;XNSSVPQj(B3jo zAG@V^S}hn4b;19JD7F`lX-z?)+XRO!d;K2m!-WgPi#6fg;{qO>l(^RIXEYR3+&(uJ zkrO;^SHg_@cgc7GQ`rf)bEl>HFOUB6_ubkzvr`#Tb7`c3=*ddZZ~@DAg>;%3)RuAV z#xbwOT*q|1v1!7}RE7A&te42ox*KBPlV(=#x_-(ISAKdkWX&rpr4!f~NBCK@8zpz_ zz?P$8++Ta-1RgR?scCUZ)NNA$z)bwl@t>kV{yt>mOBx;e#CBTsOxkj`xEL!{wo3t{5fLPlsturGj1 zftaq6702}KvE=TL<}SW30UtiQWH^6SRKw9l-$T&E6|B!{Jh^bS6?3=Z$BP%L7e#Qj#_vl=^}@5 z>KaaMA!aFSZsT*9nplhy4+DBMvL&vFQi}7DXIhpur)r>qpX^BNND(XAL--q{LGPQF&Q zfM9FJDwie}_x)=|8A2D?A9VHez3-oYEOI`16=C_CBj}oZb%GYQ*G6HIgK>|l5~>*v zLX>A}q6m=^^~JW*71DuKHTp%;h7v?YlAg@)Qz9JF!7Meler9Pc-|h-tW}Cv{!Oh2H zYxNRxUeojK*pFu@E0DZ(1)k6|oeRRaSpP!Lz7oxjNoyZ&!yDlDje?-C6V~3)t3+6^ z+7X|S08dG-Z$c0_LC@)eb#lI;lq;YsLY|lF;=drE?>IKvQJvAH^NtIei8LcWo2vQP zhxS;C4SMK-Nqgyqj~wKYPqgc`(OALSAfW~xp@mzi~k z7b2nR7Y6Enr+Az>i!0D0ZFkKv@%N7F`$B>r(L2CG1_idhIhXIMq7k_Z7ce3gs0oq_g#XKm}0ya+*9UjM^q-S)DPhKSYF;u^I7DN6ygU-}kzqlvBFy z67h{N`l>@18s(KFnAWj+ELS)K`be7@sJ8|=Vd3Ta2OypElPZMqp?umUor;UffLC+> z6*e&2-g(=nq&{F$huJSVQ|xl#!{}}g`Zkw+`=vvHGeqZe;L-8bT30liOioMbt8?5jU5&{J*$u=YbrNAR8mC669-MeIvK|vy}Hl!%2+8Q zitZ1vdnjcBGs2=L);>hBtZVUGO~Gs}PVAOH`w@q?cUZJrJ+P&M4yePqxtqR2a^RO~ zVD3W<4w$*8FOo6lys!VbDH5(4O0S>=8IK*r_%UEmb|nd3T+-5di->2l6ryqAuwOH5$6 zg8M6l+;73uGY`N#PqObZ#H3b2 z6$*o?uw}=~jWxvZEZqz`#S5Hi@*~jhQ`}w6NnJ#;ilou~HKF{z!K!U;1;cC^RxX4y zmP@PdS`MGq{AqwRS>s~!^&9jR6Jxz<1dGGSW-Q~S1t(ajjuU*1cyAq$PPNaQv^AK9 zUvuA`e%M!XAemt=md>6gudhJlYIC2Lnvg1{%1A?bM2f&zoP&bGt6kAvsIPbCaVG7i z?OY9_06Mh1Xg>rrT_`N9cnp_0+AGDJyuBn+mr)>aOLW6PEPP<|m=%Y-JA!0~kb*e6R_w^UpJDqNQ!a?-J z>^^0(?1e!~ic5*fIM5hx#M@_g_2Gy%oYa|9hcer)@Bb&ceTbW%vFaQV1I75VW|ZDl zgvbWW9|iOF!Tnpf;btXN*$0EJ62SS#Tb}|SP9=S8MpqkV6g-niB>nvAQN z=h<|Wa`UDciqAaQaP?F$g@lF?8LO)`w^nFY6O-~U}*>un5G08Q_WPB&}_$by^WiS#+l~ z(c-Oqf|78}2kA8sc95)21JFC5 zmXpc|a1*M5A#KL|==+eCWHJ)cu;60ipjf7Tqgz72QFM$=jbG_X7=wX>r6IzD&&E$L zqKbk95Uz<+?QsiIJ&7c7ll~VlgQ~McsRG&P0v8LnG>d=oQc9Ou3G4_Y43jqsUR?Fln|elv*i zp1El7`j$(am9w!9b0=l>Z+uItLKdI`J6_`HVugjMnEr7+IT&D>l_xaQjUL992DL* zQs8FI=)G<(-SuV$HH-*;*`SAPPxd*gk@Sp_?-Vj7~AhOgOe-}E<$b(NRP;Q4&)=EIGV){cgPJKQ1 z4j6SxL9LB@m z?1sh7_M$AlamF!qX-8Ovg9kp}QSFQ>6VyNbkh4){^0MRBUOBv@0ws|VY`{&mqS)qe z)d>O}!11CAZC0955?$8R^e#t5y2-mDa3&?h1yN7igM?Oyz?5gz{fbE}d*dWX1~{$8Qw?bH6pRYnkRos|BASs*aJ|rTz{0hlREx zSxLzo8yBWY=ef=D_~hn<&0+I=FP*;@L5yZ1OaXuY9EL=)miBH|^ZX&SPI`DIPn6Ov z?7YedgrtKbB0<$(b{b;H;8oNI;VNS9^Ile`>#_x^73nXpT-MSp&j=dM@GqWH4193> z_NMEM4|9r5UIf|6XLukDD+aT){72q{r}WrR35h6&IElCWZdn94=&(6Y`wX>oq zBm6A1FH*+2udK!+w7ebbBJDYap=J&p<^?z;&iItHM#X&#(re=klLWBaS4;|#+TffPVJqHeJ=$J*a@nP%Cd!zW9w~ znlr{&1tj-uKh@3~<>_9Sz%2Ct7L&MoRD=(349F-IhJq&?g(>;dXEw>{zPL_NeUDmlrGwObPCd(ambx~k821)Aa8VW z^a|1!(D|927N$UzUcBm2RVmhGjxn#+ye!Zy;D|rk@1f&6c3~7K#;6&7-Bv!dFl8Jj zBhUB~=b(0?4W6^?6{JEOtAw;j@_4jw%*LQPVvjv{BOK!y2>*@6YXfdc2|z0AaoN`z z=v%CQT}4&7F#N>$>Wi{`_r6PJW9A1S?S*`wlWK|5iAL7k<4vVesG6T_;NYWwO>XG^VAVvpH?e*#sh9%&(7UOr?jZB|X(xY)^668`dkF^Gh4(*9wrCPwCApg$& z`_WcXUU3TpxWN5+Jlf@wf+E9_s43e1 z^2zoQ#HH}sX20!^d&q1vLlgoizbX9>uke9hsrH%kj*G!rL%vJ35ep`icGyu9@@g$00MnQZ%5 z(KfAViPqDR7vciMVsYibGFSJ%g%Q9DtvUVp9cvJK}cZE5=BBYW3Mn&0ReEH2opm4rC3p3%rGYWsqJc4r-Kx6VcQ!$t^*@LMl|{8h3w5+b*nB47x+j zB;yE;N>T41p^oRuS%{U)%Aliy_t)&=QpAssC9~RY_p7eT{aGW_X^#nYz1o;*6vIQ^ zbQBV|yu}5#EDIU#{I7$7RGMcLAOwER@m*6|&nL7O-~!h2c;Y}K45hmOL{#I9uv{G! zyz4*B__$VX%Q7lVWUCxljkZ?vR_S{4)!jL6BwICfkZgKc9rjb~Nx8FBgp=#Vj2KyY z8z@HJ3-t|uszS{@t(7d9_pDfOF`kTKvTOf40uc}ZO!buFo7 zQq@ANr?dFlILKc__*;1oL0Fbr;!v5(Z^si-UkGfga(t3SAc5-Jx7sC`Bi~gGe%`GvW|F(CQ zBsA3GzqyX{(wado;Nzi}L#$wrJ>F2lb06Nv@!A&E(SckCjd@ZFk0db)EHEPCgi4~& zyu~P%El4f8N+b*7URyv%j$P-rU2wsj>aXA)NMcs@uS)!%JT({dV@ay;PK|lN)6({!x`zA5is7-lw zK0wKDC(v-`rpadbFj_ZR<-mP@%)CV9hY@&(prM^1=yLy6`C{Wb{d|E5< z#lC+{5>{?dt+%n36Lyg;#xU*-a_WnRB;%blCk>sI4-%{b;h(B@ne)2Uai2B(mMQE7;V7FV z@IEC0ei>c8tdVq6bEU(a7I_0*$k(jH3M6r#DY-=oTfJpjI)uO3%au3kCW{z@+)qZ( zE>2}zIwx=I2i79;KZFu7$My+ba(TyL~oyxa=r+AbYEir9H9I@@0zQR6#cNJG;gU@pMDs8lxQ_ScfBB#ZU z7+g=fOzf~QLr9Bwrn$EGQ4lgpJkSe~P@dATSjPLhswS8drkvyW5W1C=(U~^RF79gi zjFx9n!@9T1k$`gFnk1{eNjx3}@31Rg8n<~@xiM42QmB^Fa1ii4*;&}u5Q2+x1+FYC zdqENtHOJfe=t`Ps!Tq#XqvKi8Vk#Qk|JChD_FSyt@FHVD(R$bSdBtM)NvYoC}J>t7`m`@}ySGJJ`CY+m-@)rXq-sFX8^rMFL1G{j-B7(ZG zF}R@H@6F;S9P#>~VnHOur1Jz(Vw%)Y?7BJPwCfO;gXLb*q6_w9-?ANR^Jwxa@Sf31 zD1z&OU%qILCx}dPWc8Wom~p%JPx*X$GlASP$Fz7+W#0qE`M>~9Ll)HO5AIibLNoM-V}IdqGI(4<2mfx zOs3-u$4ojAv_-(L->2i))A;gpfB|82dl zn^ZHF_Z`ndBZ@^LS1jkaOhBasb=+G)!m*`2m}hL4n!uohE8kVf(xfK*Rx^(t0)vVf zI}EP2gn6khJsA35X^g!yBC*dHs}o(7Z$qU3(#{NK z;)zOOdM$l%uh!_(-9*1?BGWf8eQmdeT{Octi)~no*t8f|GEI+rD=)nPo_C=b!3ccH zI;L~@f*T!2Ai*nl5arTvpTyw48G;*;Eu#)+BBMEAN3_#s0zHh&99<^Lx&OTt`vB}} zU+?Z)lzGH69SAbGa&x4UB!r}3AZP=HajewsB~Yu8F%4~7E~GDI+Az#{@_A|AH_Eyt%Din|QOY_NTBFl219fmdV-!Wu^^g<3Li-ZbF;8adTK z@|O3ZaU(H2tA<=R9Qe7pimGl4NbCYPD z{vhX=4F{3H^@MjI?O{tahmLXM2xa7#L~|*ey87$l{j>wlTRU*9yGn_bb~d}I)mna8 zCNkn8`b-(Be%D%2E^qQHMG(=cygUYVt^HMvLAuLsriTDx=l@)8D3Wqk^NS^L4$z7w3?)^%&iMcxAxlaHYn_|W%@4*?2$ z)s-|^oD~JF>iZRMZ@n+esVZA~MNJC2tw&ok7CeR=D!4Yq8yP{^&#gHV!s+w~QyLPl z;KY5EwXUWr!;5Q8Y&iH!aw4Gt60=WIV-7o;woR%*My6GoQ1aIB{5A#&*0ZFnim_9I zduepr*BDrbl8e=8pxt;J`Nc-2{ovuRdo1gYzBjEM#qTwn(W#2tUll*#Sjv?@<<~!t zkV09#2v6>$L43m@KvC(Z(=x02b}Zt*sqIOHsLdx24~lU*RC2L@2-=`In^0e(fA3(X zP?OkT3>=yg=^pt#xT%ms%Hxly*dw0I+N%vV=7^|`Na;GOL?h)%tE9$|r{XPo){r9J z{R#j}PY{?uCHD9^et9SK)I^(&ZZutK^$>YSkdE0{j|zHfRa~Y0=d25oWp>mV6(JJ( z+};ket$Pc}w|MdUoQTO|52ohedn-FIB;?)4#6FM1?Q=R^_v9cW73-W(>xUXJ&p<9YY(Dvwbolt2ZRct zljroNirCI|zOp3cgsSQ`68A}-Fk)-QyPQB=n^pitl;YeTG!0NTMTSuJiig3MGO{8He#${f*lxpDmY(yo@Fk;U!nVUUrG(P2 zUJN*1wg*W16m|pNYX-4l(!B^x>doCM;z@&7MbC$0RlQk||BKRCZ!aho!_&|+uo%qs z+-B|T!#o1eM}h9Bor+QRVEjrl?hzm=cr_?fUO*@KU0IgJ8OB) zlVyc_$2_)}?*g8`j0MUII$K=77*bcA9Ze}UjHb8Jc@5C@plU^p@JXp1R41NsZjs9! z21HuYyfCGV*DEK?COVnLUw4Wy zu1UzYHdlLd-Vx_r9Wsk8w3eghiT4i8*_!5yVctY6as&_(%HsjqCY7zLg{D9|vh(8; z8j`DhOf^hht-H@*xO?!|@JS$^PL$mrJrzVCil6%wvROf}g7K*gnY{E{6g!1?O!l-z zczq@mop`824AnGeeuGpGswtEg5MogYjXugEg^aunUHK!c(Q)AszI`pY0qanc?*O7G zor{Z^aY-Wvok`f2zI$qarwD*H=oQqbJX+?88qkKw6WcY_;EyLqc6*_-p?oHfS5;v? z!I77B-9xQHIEi6q@nI|%0d`Izv5dI7WDp#<$@E569NS;sJ?VcZk7`aJ7OVxX~^1h7y52>rQ*H44ZV8ZW7lwXK1^=TfyTWa;0VrvJXs<4i_(ATII@(=R|>r#FXvYBn# zncu?9Azy#$j*>>N(UGQYiJLWHs)>`hi&E5&@(o0pnrj~rl^!YALS|5L+@XK1!D6FA zKs%QqVo1K^USANjZYxbyb8=dQ;)9eW^{ss9`dTM>6%uNk2t;_D9iQl`?cYqM1D4+p zDXd}tFA0h1R8P{=s<66Trr=oLf#efjCM$dSPltNBc*h#b8ejq>QNIaD6zAkL*Yn>P zJs3lq0X|Rrf6P;7)n41Agt7-Y=;ePwn4Uu_zpakv#lgbWv{P`K7Yw22*6O(jzNBdd zVM_g=cxbSp_F3f)N11#gW6W>N_YuQ2;vT(U6La@3P1e_s^N^bw2)kPYkvMWc$vpA; z;zw_MZGj^GHAPm(o~16rzx!63*quAXc%zQ_czR(T8qGP9lM@iD<2PW$z1g{l>aHvT zZsMD9lZDY@_xi~u(!_Lolrd}ON(O5h6%X<+U6`BHGi#8WjECS#I~_gOe}uU^fX<-C z3*MtWl3qIbRCf@SG8L8?sC8rS4WRcu!>CXzQ1=PG!#eaUoD!AY zVu!p?(;!^XUc$)j(A8{f?u|5V`4pr$0N*L;0Q|b3yx$>PG(za4am7V>nlB}JnxW)e zbio~4^!r&{q<0iTTYQ^NOlw~Vz#$*Ft?B&jZ%UmP@FnqxzA(%bXNbKFi!P>Et>aP*O4$d3;M~AQe82&e zZm`nDnH6SZMGacT{sQaaPRx?xwLFG01ug1~CSecp4HfxknOhpmqYhAAP7&^c7pp7k z8XcDX!sDM~Le}f`@h%_rZDYO$m(YD4ykg7z-GSWp>Trgu(e9+fec& zMlgRZqyO*Pv5~&e(_~UX)-u~WWMs2)uu$7N7mW&u!wH+Ygn$2MMT?N3|GEZYIe@nF z=IC9}1aKJ`BWP3ppi;9KH{ky&kJ$Z0{G$Z+2fxg0WXrq%aXGtrGQqizdD<$P-u@nV zOsLj~{Q@e%#0$Uz3r4XhJDJ@+kh_i3GQ8(?M1R4#;ocfVBgkuv$22?cK+-i_Ck?Sa zQ|Am|Ds&nTkji6v!tkivMeSb~-DZ?Avp#Ofcdxj`;dTS1#@zKo!s$?o2Y&fxJgkgz zHDb^=yV%Sp@9r~C4o5OQZej{UeM)ow1}}MTr#@(B{2sBfmK0`eJum#5I37){xZ>!R zR_3+`1Tu2HpUkw}v4+Sw25BXiNR9^SX8h?r!;bL%eO}CV(4stOt^+npO6Thn@ZiwDZu_BOZ6=e@ZC1x7D;I-o7HdCHNt4YEkw+%&w&s^_U z;k2Fliq&PsE9?O<87OJ}pkMqcT@}i5W8yV5ve%gsXv^Jh61uQo-*6Exi4;F6U)p1YK}Yk%RmvR?`lQp3+438cH5(6liCS0r~*q&`4{we=OFp#!p_= zgM7@#T0MY(b$yufY$}Vn|3OY7!>H=H-GF}5bpTK8qz?nZ8?hx}HOJie%C|4teRF!h z?>XOP5lz%Ekl0|P`@&Y3#`#RY;d`hOQb_gy#ok*a-o)t&2ta4F<*y%+CRQp95gSg1 z4aquB&$C*x=nQq+<;GH%RZ)HLlJBsm`2mOta|x=Z z&3IhDaHT5ptdol7T+@GF=yNLnn>%Wpf`^U7&25I6_-MeMh683118$#LL=l9D%#0=q z)64(yxDs#`_lic(H3=q5OcrT_=;?O*^56#A`BnoLq=HhB34~L?wU@7({zS72nNaA| zR{IwghfVH28dPg=$KRHpHYA+!7^+hGVd8hC3ZhhMPeSU+OL<0YscPL4I8%D>+>fU2 zQv9EHzZGulpPAp1Sx-RsHIqI9$Ik@yp(qt@S?fU9tSe8e+=dO()#z!_x+PDlk_YCU zgR;V*zB2;7*QNQ&OUutIaZ7ko8hw^*hPdXEYG(1B7`7wKXywQl#Fb0WcXR}Rf7<8F ziMnh1{QV1cd)K3;@iliJ&a*YmWJ4&EIti{+K;bSE0g0xs@~bXF~=w{_ThTcG_rpz zlZc9^oJx`AVp$wlNdXgv>ULNun*Cx-ExSbcAy|_OT&(1slbwg3haDfAdwB}LdMtN{=HwK@bN z{O3-LWeMrd2Ow>@)N!CQ@BYR2WfB$a4zi6DQhTUUf{vvjxI6S&5LG$Uo|Q$eDPVVu zT2~fTB9xT6Ed@-YBrD#YE@XNC_mY%~s)qwE2kNh%BSD9d)1C0OX;k%Es-}p*(unL{ zx6%HQdXbpeIrK!hdtYBuCN5L*8ItN0#HwuzUbif64csban!&hi(5N$)DW_s$POdFzS{4I<2B+=nHp}Kg`hZo8Fi@X{%H^lpJwm7+Kl#(z=)DBvyFHvFEju zWrOp&;}RzB{8_D+oTq2AFvmJ{fzBvImsX>nzn5#4zll6yZclJfq3!)ro4836t?f^}Y z+(JOPwuhtX=%k3l2gO6rwNv4WyjcAXG7MkUNX9$=6m+-*$`C}~UF_xoC9X99Io`OR zh@UUEv2duK)QTz}W9-L!7z~Weo?OGDU-Jjf%^_=mtegs%wyum{2JurEAXpu+?Oef{ z3i@xYV$LM&J{Zh-AL<~O4seSN7=lZkFK_WwlNUW(__=Q?8L}RjFD_8s)kxLAB-zpl z{EseRSWpvhbq;~nofX7Q4jen7$ys&WqOV#88KT%&DSF;_=WeTYhuE*22A9XX!i|2W zVCBTjUeqa78NC%9K$PKj>)Ow^4I71_eGX)I>p+^eviu=Dog zA9r`ZlVD}i@O{KH$XVb?)9aE!YLcT~5u8Ml3_{3|EF<+xl0?5ZIH_qG)D zmJ+P~`kg+-`O3|E>#xTV^WUfCEf?9LYK{$?N1?Z} zPT9KMGN@3y+@m0Vmaf{_>heZxonwqBQJ1dUwr$(CZQHhO+qP}nw(UM`cb|6mobTrT zn9NL4*{ST>sq9**RBGW}kAUQCaIRjH!RC8pWfe;OktT+aq{W+m`tN~weMNk4&{1yQ z)Yr*XH?DD|5}i)&uWpi5Mk{Vow{S>7Mxs3Cryix_A-Dfr7^6X4Hzv&~<9RCi7L*T? zbX_H848W0y?rtM-2sH-Uo_usA5|hOw1&#ZS`@xgpCV|sV(AM+04g0>j@=dh_Y}Y|G z_NxdAI2JxGTCxa2$pv_tTB+S5;xIocil!glMDRK42D@d587Ze(SV`_SJ@3=L(lMLT zAZ%r}0gxUN)T-tx2t5xNMj1{kG7DeJ?D+tF!}BN0uuAE(a>m#LekE8e-4}W^v(j{yuwtFKjgOt~>KmYPZM9=AQ1nk*yWD__vJKaEWJ14uB z>@2Q}-7RoiR3Hr=xlz5S)6iAr*p%1OjU_M%9QFAZTvPwrrPZ5j-Tk{Aq9j4c+pZfWP9jIp_U=Q(+3;HQFxcHV@dox}wX|0J{-nq*$BzKN zV2O|_)+tu?ClGSAwiDbfLJi1W<7Uh@bm?ayTBG|La&(wgCkDqLrid4|c&N+~T_G9S zJ6EK^3VoIAk9yAawZJ3%Sp#d5#}?SLZt&8foH>u?V?TL@x;;vc$$;`fSN$A!5^jQ; zE(@@?Q)$$Dp{G6!APR;UkPh-wn-% zRLR>e6iP5U{i;C~gZjq@1E-I1OKvi<-R%mRp~WK(=b=3GMFbfUA{;) zkpnLenX<0+OORf8ynZaHlA8mpA#|e>&NyOD*lj3jt>9L7Gtn`IhlreBGHUQj~^q-1|3@NgppRmu<)0m1eLSrY91LGIYhbXw7tWgFU3Cwn>2kBbF% zF-V!trodbAXmYnIb- z9-#jk0oXqAaq{VQ*#S>Ulg!07Tjeb)NGBNu{=z(dU9JDj-^I57-L|)Wzg&`^M~yeu zLBb)v|KzG`BcGmI*wH6xx%?KeKKCV|2b?cY^0tLym-tA1Z8)?}qLi^3oV~BZHf`s{U*Tq|uReXZ zvfK5L(&Jbj>?-&YS({^%w>j4Nyn!sJXk5@j6Abg{bf}sbl`v;W!%4KI#7R05kZ5W+ zc9+8?D)%+5ykM06p%x*OxKgtv02P?bI1;1mZ1j~tcEH;*sX!0fxj@S8YEvW^GdN_Q zr~6)nsNEdDdOE>Pc`-}&*~Je?YEN=UWIy&!eI5ysiAC`qxehGg{5A=ikZ#cfnN35A zR4AA+5f%Uyx6uSk+qx5U1AupfMh(Z~_5*h3w;R^k&23Fxog<5;t#0Ho16q2`!w_eT z1@v?FBEYWa7kQx-2q%6B<=uJ2(?k)Hd4Ahh6thA^TxTfG2Cw&isZBhs{;I%H%OWe~ z`ml|LtSX$COenRg7*fz!NyLdEXlYCIq=t)K?&IgJzF1h&8TLFlR%uZUr3Xp`ts{o8 z4B!F)K)WJ5!in);WR1_5-r^KCx+g}6#pTH9M!mXGxn@LQ5ik>+pn(_Y8~jKC%SN!8 zSL*z#ZPWR?f#+SKA4)3W{AaMe66Mo2GR9B`t0LM30;4Go5cFt2rPE>6mjPnQ3nOGz8E*L3cmG(pxKS~p_ak%f4 zG$a=|UlPJoAJK2U8*{fZ|&Co7LyK1%6 zTsR?=k@)oD+YnhN(#L(=XQk5$E=YlD*eKH#vs#FdYn`xXq3vCAB}46q=o2g;^QELnR z-Gh{xZ5;>{b9a1}3hl;kUzj{rX7C}{MdxGZrjd>1*iK2Z11==z8~h11(9l!vXYy{DP9JcG%`C;QvaA=MQ7 zsq#i7^&k}>V!N+??`z_>1cb^|6QPIU0{{$5#|S59qK#C%Q8H<4UVA7#TwU)q7|Qn)=a!GnbfM~0!k=5 zOqo6TaGZ3r8&f9}dAE89*urTSc?Je>heClV&1al8GG^!=izEz_&PW{oUAv z**yj5M}4i;uZ^G59|A-eQli^?-L1Q!+!A#pi$ozKf!duFK)(&vP*=p^xCbyuSJe{A zR!*!RG~BMbzB=33oWVyD!c%&7`L(ck15HcnmIy{l@w4gmST~-dp$&U$c6Pct!pMZ& zVutOsK})%_b5@TkO94w1_nbMoedsE5DO{(rNd^ZnlUaW)xh^Vnfg8Lu^!E+04;(mr z#C(Rgaf{nShtQ8$DE2=F$Bx@=mZZ`*7TjB&ei)~Jefj)L^X3Tzm_7B?6%M3Rd=MqU zELgvE>p3M_bc92h(dfo(sXz?6yqrFxHf%U_^&XG-b{TCz0}=4E`n-^fQT{k_zT>4V}v-=!W+X{NTtK)y%*lg&OZt z@vvGUyGbyK+O$_dq*op=(luQF#tF%L3b#gs%R0#%{a)J41z``P-q9Gu=-wF!9Kie? zGcM(4UP1cq6Qg-r1~w({!ZUMde^_c*RO8LWl|c`3Fx=WFpc|!il(aMAPXntD2u$4#+)*C6uX->sH8If| zXz?SBIP^{I4~H7BfXmN_$q6i3-cw2p?2zEzYpu4G#77NlELpBXY$VZdsQ7m%_=UFC zB6muOsOtD<3m)y-MzvnF%(pNE!q1fYG2Kah%0mQSp>tQqsJbe@$mUQjQ#TBv1f;`# z-mz(w4*aEA3Lrb-N)zNo&Rm_ytcqN+oTnq#r(xyP)V<~?Qgpp- zcezy2L8z1_OIzg*#g}d(ehxL8Mr1q4R!9w8 z#AFTqk4|hYO1{j3-s~nn{H1K|lU@ca^vu1hbU9(Rpe=yR>R}DIN){IzLLwjQo zlFcp|SH?Wx@wml=v>N_mT}_$eh|DnBg1$DS7p2c{^;$8#X9 zECT4>nKrwr1`2T&XqRIKSr1hMRRiFHpEt#^{oPkN62;E^4!0q{SX%GC;7COjWz?L3 zE&RrjVgWJG`_t6e9wWLSFz`8R;KF@QmI%TAH_=K#N<%wZ%F*`}&}3b|Cw?Pd3E zQNqVA(+|_hycpuE@Lu-QW}xA|QA+sQj3kvAb_(;E!jX z-`T1kZ?BZ~Y_`;{!~^X`|)u>M>p!t3Fx~69kPP?Kye)A&m1iTKq-Rb zH^c3zyLj3584h<0UU(T>zl@=NF+$cIbW)F2#?QSMOdBhQEqr1o^O_V!o7f{g!4VFp z9`d8aJtDjVl(wq-?^XV&>($ksg!ebx!GMBMxK$S}IFNh}(aU28ntI~n$uOL9J5LpN z@~hLA^a8o_#7ZcP?&U`&0K?R3c=X0(g zKY7%P9NZVeoKai#3pi4*S!AV(8jW}_5$5LdUOZhckTUo+9Gl{6?)J8L)?g#@c^Y*% zyS5GH_JtY@Dl=D};nEh3BbHfLEPxf-*$?HTCk`S@dTPZ|VwmI+Qg5W7hDr^EHWn_W zhDL6?27#3`U{pjlf&VWqtMtd8mn>&L7=o0LcHwyZZTOPcR7_t@0~y}+OsVb=Up%ez?rz+ z3nP>U(6~bHp}J8uNR$T20-;RI%SwElqArgOx5qywPK*T(>hC4;5A^T*EV4iVyO&j> z$GkBrA{q&U+|3dS$Sj%W$U-gx~|gpU4C4e zNjWXEX0(FGK{zsIx16#{i4r(@;O_riO>!N@1j607byz=91Qvd*$iizCUe} zo*G1-b$JDJRJcL~L(F{m{nJvN-W*ArJAy!wNf%MR*qDm~3)=FkAK4Qw9n zk-xtOX3BpJ>(gWjzq^RmE>E6^lREu){9tpeHj8?laimDalH8D_?o^HO?agoWcDO#n zUB#M%=>e`p*mQ%>6I9qy4oC^z(^(lLPY>eWll*p!556~ljMiOdfQ${Cf%F`^B_a&t zMPF@c;k$aSWt8Y5w;)4;X1_$IZ6Rf|$+XR?)Bh0!tHEC5m1jU(N?|>r%X+S>N3!EA*DeJdXxu-m}1gu-yMMwe?Cn@M^|9t zkf_$@ePmL{EuLLM(R53Vm`CE_%OFvVpW)COSIlaji;RG;|uHmOL;EO<eYw?m zEpWIw-X6N#zM-rkUR^JR7mtdOOG?tHBSkjPtmSdXa$%A0&y!fhxsaNN6rjOzLWPHu zy+Ts3;M=L%e?kP*v1};M`DMsAo&+)NW>9?`0_C?d^Oh>L>j{e=*;UAG#rj8KoWq`x zNRvZZD=xt6G;V6x*cuGV2(B&l^jlgedLrJlrSG;}Uw(>(F+e1VyDQo?{E2O#yRwMZ zrqSs6nx%u%TKIxO?QW`a&3_rP0y=8z9b^C!(_1#(iPR9VUfkt3V#&U+4 z8k@PJPqCrl6m7fPZ+}HJDDg$RjWWCxVNRclIVhgY6wgp}aZZ%uSwcC0Eu^=30wb%# z2+qZT#+D>@XVP2xcb(wq$GK_yGbovf)qMpfs2cRhD!8EVBXgsIJWY5y0530RHpjAU z7^78p4Jsr|RLm0PjtnxH=|kyTAUm3P9)mFE9!Zp# zqm8y@3C${tk4v*_3&pR=`#&RVz_w0&YQVb`B-1!nv6XiC2`z0;VU#$rVW7}tupBfC zI&7YZ5oy>*++Tm@gXES3=yw+}h7f&x>9u@gN}TaTVOTf$LiGQ#VB^p+TIeMvGg1M;xk0ctb0=$Y|usRSuYCDwuF=sL`JPyyt~U-IB{qnaba+$8^9zYCn=Y<>}* z!ah&lw)yqnVy#KeDvCW0h|)p>|2bU%z=1D19fm3?<#CNq%m55AkDvqcio@@7O7&I% z8y2@v8_r07!LtToeJ?qqQK~iq6I7Ylghk=-;FQG#{7yqjNMN16(5y}C*d^Gay8qH! zd8t+;1nP7B*>mzneV#+O9%_4JXd#bzE|xDLdevI7SHb=(Wv2pg4VL?4skS?X$iU(1 zXwY(jTisp)%?9*SV3CNWv)_#0D{iyJM|r{i#n22%c3Da#%)X!2hj|#ja{WilK5v&^ zbOcR4O6=87ipOMzpF{Q?iH3ROxG^iPq&va^0z$&KD0>K}@j5Alb-q#eCBji}QluKk zf`Jwidst>MKh?0#PowhoHybp+D3!K$uCIPRI;u?VtGY}m4#D0$xJMvo@qN`%_<7`A zDebHceJx)S{~L)UK+BgRykfrz^xY;Xj^q7u8Dh911hpdVn<*PGR&Kzh*E@me-1z!w z&xWd@W2}eyjMAG)=7EYwL!*Q7LZ6&T0H$^^o%q)=kr{0a6w*^hMVX|$XUc+ZV_>+3 zpvg>cqnV=gC`<66h&6re8@JwF{@vR<)4QsI4;Jz$`NCzA`uIuE*OL@97O{qHHCSNV zqN~i+1wT}1l~lWE6=836?^gxy=RDYtwg0!*2N1*bV($je4vj95w@Oo|wPy?e(mpwv zeKiVKKszbq-Rt-G1j96*lrnx?Y%!_4(FVJK(e-tO*u1ibMQkF|Emiyp zOBjQQ2sn)HM}|6fFTtA#6_uN^s=^u=q(l-%ChL;+np7Qf1F&#jpZ(C%#I;r%2%!w` za!6hjA8p!PO&pH-Mj(U8%_)v?4LZU^8VMr#Spm#qk#slLQX*}##&F+8M?oFY`L-^~ zs9@D~I&^h7AS;n?3P26N^i!PDN-J%IVp4s~WxO`uI@$EmiCAIrYt6OOfc|Lr6QSBx z{S^z+<2xJjWn~vPGr)AP7#3tFlch_(J56i9M14>U)H8NP3;aC+ES|sYzVSt!W5}rfeb%W7d)^I-6_|3DMl zZM|opd|N<;b{Zg)19Kk&f|RA&|J-L^vn^q&+LrPAjVcRe&_>D zgo_6=`)wr;_@gNbIQe8xBA{BEc@_dhLY$>))#g8Y`TG`lxN@2{3%j?kc4)kBZ0NgD z`%HH`lGq&hBrDHnOJ9*rI35e-9smRxOI4=*|2D6;FF2P5E2@;$Y#hfAjg5$I=~)t> zveVtKDWYcn0ncH+joF3TU>Lsma^m@&jZOACLN3bu{~!I?)Isu4^{d6b;x~ZCBntyu z+-DfW>yTQrck+K&7ja48U$&vPHYH45D!TIzaLmGD+brc^sj7E{k>-Gmk%jc?3>;cAYBQ&%tOF)t z@ak~#US z0iw|okP%*r#k(5-@E?MS+L#D-22hT@31PrEU8LvK5jlhsf~-S(gsa`1*D8N}?C75Z zgN`mNPs9L%$;ebQ$g9^gQlM$7yX1wfL=$C++>eSg)Cmv{?a_CZuv7zpPgQ0tGj~mb z@##A8D2rl6JvrcFYNXSH(9$(6d_Mv+#zRuO)yPJ~F`gAyCxC-GnFmH28hw_y+!V}` zSbCiGr6Jl)^ODPyip`SM7KvIBhTHJ! zmNUJ8i*P<19e86>b3z=p+d>dw*SZ1(?N3OkOH~5y7|%BoNxW{qJeNSG1X7$q$O-4~ zFgOSfO)h8)`BC=91MLhYmz3@I@a?PN)<9eg2vRY}qrPR3r}Jnk7ylTXURK-;Km|JV zr+4%XndxktCMlE~ngqPLb*haeQkz!zjt4L-84fu6$dntP9bj2tsa8lp68OPZC&*+& z{lj+nADfa%MTjaS1EhNn^San$JfCEX8!1iJDWn5B2YRut$P(H^!DVv89pI3Eyj@bt zy|o=u4~|2v#H5ExPodjznCVjLq-Y`Ku~PIFEmtCz9rg}XG67kJ1p|>(q^1HH2LOPz zgYblkD1YZ)r$XTW97x*bXkV-H2VVrs<;+(_HMT|7Df+J~U$t9kg8g@V)#Y=jR_(`= z+U#WMRENy4nj!-oX_i z9YveFAj~oE<5h5%PJpBgaV1{cO)96)PppcmwPD8ood`WD24v^)K+(}-P>4iMwki|ArV#jygWLs$kC z6wGujsDnW)sVxHp$hauzT%>O{4T8o$W=WTe7V~i4>9D>U&@2{AimUvkNhgQC9|X!t z?)Vvk;JF8Yo$siz&fYyuvfx|M8a?Dtxm2O9j*Utu=apGmF_B`a>P}W|49OU{y$`K# z*bXw!X5(r2kYQYr*)`H(H&5IxtBf5+i&gzwe;wRG2aBKOlc4nv=;;%Bvo`Og=>E`* zTqls`uOY^T}v%i2WI!64>OoI^!E1XIVbp)WJI?yQ!U}0E8gg%4CgrQlgU}G*hY!$#4?ED0y&$Im3XK_8%dmgA)`nVQT#6fpXo|Z9Np>3w{cbbLSYYU!cXgF0V0fSB)=}Ak&Riw)`RB2Hc3u=uVkS=ZWeE{Jthj@zX;9sp)*&NtQ0p~P>{c)~nK+wGU= zpzw}~R7nKhjX?%b;_e)_At6Pc<aOM%(lh;yn1ilgu0#6w+$S2pd(UIH?Qyr z3MgL*50b~%#~ghtv3I#Mv*)j;r|uDAI<~W4&$GHHS$U#T@JSkl@R2uLZuPsuBT4R08mA0E!qV3co0ZknHa{ZWUFu5B(0su3r zQcn82-T#?_w^bCN=1A9l(7CgEaN%#BPoj3XN%Q$tvAEYOcd;S?@nC;etL_0-oAbi& zJS$by2(UIS=jjjrRB|O1wT*&Vx<|u)Y#J52dJ2@=FliS5r49(08@A@R95@d8KL*)YS@^o0qJE(6FUTkmVDP+d9=y* zhIXm?UVt@|ip-{2`ONFQyomcG?tYQvW;t#(ZmLIr|EMV+qqm%6Ecc^+EkA~vRj~=Q zyt_;dC-cfm9u1|7YvJl?kQJVFB=}5s|k))DfoouLw5EnJ_zylM^y4OI|?A}=(6QT1Sh8S4gq zm!5s1iMBu17ej<}=*8Z{d*I&D)lkQ7A!eiLq_;9`Nq89m+IdP=XJOJjjAp3(wF;-O z#2~2a-#6Bp=#3$nT#?bR#@WKtHtP?{X>lCu#>gDUPTIamu5W1$4%Al(do`!8nUL3> zwiR8YmUEMizH~rDLPS#pi{&YFgzAYs0t5T0Ps6NB zLimL4xiHO&4DAZT6f4C-J}QPfLEjacN`XV%z(!A`m%R@fU(;|?vln+EI27?VF0$gB zP+oSBLHU;KnlTL}1Y^y;py>r{%rbh~EbO~Ta^Wng+Dt1xPm<C-p&JQ zrNSt3;#%nD-8CBrinK(K8SHF0SkLawfkD}@bBl$lwyjAL+#o4+vy_88Kd+bvT2w0p zhpv42nxu+X@smgnwzpL(gX)Ke-?e%67gA|8FwSXCqpX0W0QIqjF>X+?3h~bqstUfz zZ2R0&>Erx5OKORbh1SLse2(9a#Bn|3_1S%6Jyq}#^)-T1qJFl}z;CuHrMSPE*&dBj zm`{_^xO48ATEZN`>Lq1`pZu#XEDq=6%08z!#EexYQkrLSoslbLvvfbSb32crKQit} z2bfKaV0Z^_6o%-2ya}*jNKLkq8M?JNJ1@)OxrIh{GmEFrImf}r(`Qal;lsGysp|Qp zsJ$=!*t-W}9J+8*W6Amx-0N$-KvG2aGXdBd%J^z!0hPUX5h1Iw9I@%5ym zdWn;42p6dHT>?di-U!oG$8B;I1qg%T*Pc(OzRsF#tLcp=QW%uP5^E85;_VIDWj0=R z_B3{wZs+?8i|T)9J68pCr1pFkvKOHED_j=|!Se-B0DBS3PxWi^npPfHHUe0lB;;T9H92nW(DaZBe zieh)-dMI&PRidx$LR|PW^c(}Bz>{RZ*i&Z@j&-$qXz(au=(~(W3EMizBBeSI|B-4- z_hm$`3x~s6|qbl1f#g&i7BEi?M0uTJ%nf|0c0DC)?$3RMJ z(j2St4L$PWxgFk&dB$RW%vwTbH}C>!xPIJ7Ot}PHn>Y(9 z!Wv2bpI(*Akif%5nUZP#g3Eg3Z6vf#>a9IIq32!F7$*z{G}3Q<_AYFv)C~7Cq%G^++LzMt>L2?AH{%k7hV4)0}5B z@T6z2px}>)=);+F^#u5m`V~1Cna9pjK^GDdD8%mU3`g5Ijdm{#XF09IkzH0l&-?9UbJqtcTgm|H zH}fFRg1NIyZZKLJ{_pWxTZP>JcoR%O- zgg<18hix=)rDq;9p+u;{;SpH(o;laY)%J68GAiivfG@NC2BUR*Zoa-XlaqYnTWM_U zzYooxPSZI@+@QVX{op6%CSo;k;p)Jf(ed&yCXk2f;R_|ZGA`-ouv7;CCeHY8EuhwE zzPUiz9)gJd zu+!=($8)hxdWRq3NqsTuR~R9aylwFKqBC@4$MY zV`5Q^*@MJ%-9$a0VvZR8A&OX_#|lM@`t>(xVUWyT%QV*=515{a9gWUdjQ0cs)C0q@^IYd*f`SZzIQ@-J59dNx*ZCMQJDFB%Y*!~?J`JO<3aN`d|l!Q}m2t))#iU`2Uh1-nJCc^YH zp=IRTxgGd${3dwZ^WLaa<#2G@qRpg9UKc4+vkL&ce%T)*I(LGfm{|U4GfhgEV=ChI z$ZsOq^-@Jbj{CGtElmw8VE_=|QF`v~$*#CE}&-t`NLNE!PfkdkX$TJeUWQuvC=-2Ij@8m+-$*wdE z?iWZ9CK`S}eo^9A`>I?I9W2=Y-Zc8hv4fT6Hn6RNLVVvce4xEhK&UDO|9T+Q>l-b`fnIl7VVUT(ziv!__NjM%1bQweooEuXn%^(*;va> zuP~!pcL@0=ZK@yq0USZDP?ikjF~kw}W)AZ8G2$GQ0~Pc4`KQ(22IPqcc$OO4ohmg8 z*JA(7q2upD4kvsBfY;gCg3Y=&B-rf0!?@Ix$EWl4yV=JOc9v|3+TFMH-;Gw9=6gSUP$V{`GgT4 z?$;P7@pMS`CYo6G;6h1rYtImzGBm-Q*#sMfk=EK9vS^w zeG!B0UX!pj%$jcu$7FdUc>XZzPW9B(*H@6&Z{ZuwGVF*6r(36hcjS&^1`v&hE0beL zco(Mvs!iMC-)2X|J06;xK;9nP;&XAzmasn zS#g4Y53#=Eq`8Vt2hZnV?vzvJ2h+JQB9MRGDDdINuI(!2{Nx1WuJt~ec!beff)qn) zu5@mYeP$_Lr1-JVFzTC@E|*ae}MGx$r@A= z>uy8DD>hvu7gy?-TpB`IT6MK^+`*$Yr()Lugb>c6q~t8L@dOro{|wm3HD}Ht>WWVB z=il(a?0^hY%Hx20hwcUXhwl-TyvCFs5G`|{M{c@7?3ENO<1RP~>H@;|3bzUUBgSox zI1_7#e;OGb%5Sb>lo(FnkyYTPHX|sdd&w`iYlJ6Y$cWP;4b}SyUMre{yOAEhpHvBh zmqsu=e+I|%-4*v9VASl{svNM;p$4OcYaIV81mRs4+1CVmlZ{&RxQlM(bpw|`lS~J9 zA4heThBFKKk$Q0W=0be@XZ7Zf-NE zDk9VkV>)e<)g?Xjz64v{dQ!)H42|@}4;RS5QqG6*hSsPI$+d z2b?27r}#WFR3)D44-0HIJnS-mPLb2nL=hm*B|H>BL(c5hpg65Mr-|H#4ANa3|87*H z0LQV5mcnt-wt#f zGA+YS>H*^s_@3x7lB1>cREaR z9q~=goHN`|J?UKw{PL!7AX!8(WFBAWX1Qmr>QmC(EKmF(O%cjDtB4DqGCjXXa*DFf z%Lv?ZpLM&p7UO3%4#M|N7+WcIGvfP(*_VYdf6HLLo z^y5bDBN{fw(1*A|4%XUzlhYhd>@6rQh64>YtxDMer>j>Nd*z@ zbnPaGIh4Y~end}PU>z^iS7jihz9T_1Gl(KMZ~cU1Ul}`biA#b-g8{LYLkFPV6ezH< zJmOYtGu(*o)*fiWj?RMA`NAey3H*CHFmU%rt{yJe?Z-w9D7AemEHBnPhVtkbqKb{E z6q*Q($LRJ5vXEA!m{O^1R!5XVKTIRfW@-5_+#~9l+oVdZG(&67^Ftcpl`dE07F3wkxp@D5cQ(5(2$@ z6k#YB?dp{ec~irHnVo!{ny3ZUFE8&eZCLldM*cP!%sj&}wwDyq_Y3Q;D-*k{i59LB zQ|q_VCtpCa(GjcpU8>wV^i*0;HYv*N$Ylv9onox}Mz-@CQlGDqGW5gx!=lt(w6%}` zne(SpoA$JcOVT*uJCC@BcQflbe!yQ~gH(SM(8k-02~1xe)tUsr)fT}8>L7YCu4_-G z7kbtrt9E!3cKUu->e&Hp{bS^8*Nx&zih3Lo%dgQsG>XDuQ*AJas^Z&Bf@*kY5XxAI zOByZ|Q-fv>-^O{u1=od0;tQ$mFXsf;4`&sTq=28RZ3aK?`29|-uLw7g|&-DeE zf|uLYDQ;;GGm1?gtO`dT%PCm;hT)xt9nPNLnj|phw6Y|~q&9)`EbzEtKn-auuGY4hz)D~09UxpK#zPt)$Zf!e}a{Bmt5IzHkc-Tt*UJyIK$%{+9ZxjPY` z5lh-(2i15Eq)aZep1!bPcdSh4#S-j&a$0OV3rNYlCfZaKy=qQ(&zSXuQmcEd4tS6T zmAW_ebpU-s?a9rlk{OESJydhzd+OVnlw|{OZVvn5#u%;<Pp+NUw?oiSJ%6q zyz=@HFSVwOO1Y>tq(}Se(hu7vhCO6oL!_A`L$+tQGV+NbFif(FOF}1Y360XJ?`uGK z0TX8Wlow|+64WrX2V~8v@OVLSF|2Np`=0d^fIa&uN+6t*ymDBb z{IWFoRs)FU@L8t=8Wf(Jly-Ah`KagG#r`SJe@x8KHnq`w07a*fb_XUq2#i+ z9X-JbqGp%`eYV&qxL))7*cs8Z0 ziP^opzU4$`qfRFGX&K|Jf3dsq0*fV}d4Ozhe7$d%+#TLHsorn**L5hJMFlt(UrD|{ zj~|QYUK2!W?8|i)EJA*bG_y}5*wjhRO<2$pz%uu@Yl<6(n_r(!b<{?crX0e~G6U zN+geHg64&$`fiOia$y2b(g)O&fpM7z8@8Z`iB0=34EcSG^O_T+X3b<_9UTu2Y~Gs~ z>NQM5o(())^#?4EK2>Z$Bpk$>$rVkR$vG8+&CvtV;8*6NMn7ajC*L!IZ`SW?qCT=D zA6cLZ)u%zb+fPQsS=#6h;rq!2wT~Pp$&pdRHueN8ViZY$EgRS3y+6>GlFCq^20fLd z*I+$6*B}g>OY`^kjQry&eN41)`zR!ecu7AwjADi0TJAVAX3m?fpHVrAwW~iJO|h+& zCAqMV?2Q7LQt>Fv>3kE!H)By8C*rzK1sK8_y`F@4Wwx-(Cw(;Uwtp~A2WM*Vh_-|6 zM8PI^&i|rn_E#z12~n@q=H50V&bxPj;wyL^IS>qck>yj!YI6%!{pG+!b;)7~KUXQt zYR~RepVW)8DbsogmAbh8|K_pnptn!%AthbVH}fOa8OyoW$0}1DHNw{@PZ;4m$-*Po zVsQ@p{iUGs{50EL__vYK%yvm`52h?NWJvkkj>2*^w1hvSP3GMPCyjjQ z9Yi6fMcJgSVRv!?8c3Ed2gH4Q{AOK$2AFKSNxi(0O+@(GvGaI43IrpoNv&6c>(=lEaD1`|`-5yxI1dTZy*R5!%1ry9sm1McIJ89m{ha^DnrwrC+$ZXYKG%ri0l~LPt#J zQe_2UmMGsWC^y2M&h2}{pTz%EeF>W6WMR81{5_6rZH@j75B)?_5CXMQR|KCmKV;qx zZ37`4oc;tQ854mEKmY&(0-v`+o8(Wo>;`;B=PG)5HLG9HjT{0^b=Y7T_4<;1B{N+P zX4A>%+vUcL{TyOLMK-rdT=c3+2`&T{2WA{gk2E7GpPJmo?{?$%5hh^J_*MI5>??c{ zf*aU{^QBoL>Pa?fkA9x+tA{;SLIX|o2|cMlwZv2HXc1l|4X5iZ%vyjL6K`}jJVM_{ zXGNQ45=$0;yIVGwzzg&wc?~9p-Q(lLR)r) z+E+jZ1@JnHBYr8gWimlOuAiQD!dY8Nd@R?tb4;VUaEVQR4Z&P!t3xDhmk^jbp&#Cf zf=!?wirD)fsW3UCWm!$}E-$T%#u7KyPh=KxYYP-o;W<9f|K3`z?uH;(70J$XX&s)< zMjU`4>9!3BjTczxhZea~Mn?U*Jq+4hW;Ln=t8`0@oH*xOW$YecVA&0nq2LS^PY*%* z>z%TUsjpf>BO>KwmYx^gKl@LmB5*{a{8=asnETm)W`DcZp__ z+9G}PvfDO=VSO?HMVeMBGhT!M00RI5c?QB-4r!X121x<&c$&xCp*Ja$TauD| zXfyD4k@kZ9#9Nc72Q=?74!m^|^arR{%27@bZ2Zj?kEs0)Wx6i-Lu|yWgJw>;gg^qu z5XG=%m2We)c!6_n$dY7sF(SPq@bZSpU$GL(Mc6#EWJQ4Jkn`^p+n?6bTM7z#ODK`A zVdu5FRm1vpiwh-Pykb4somv7d% z|KWgR+wn16UGpWl!atZ{;P#9gOGQ`1kUdsf@MPsIkB9mL)raIxF zs(&M8dQ);5{~a6T9MeaM&F!<*KNoE}wYALNh zio3Dv7qclq376^@0YR8_xP1g(f z0pelXb&?^zjvz%AmM~&kj;;fcDXMF7X%(8yq6PH;!C^`)jEa^pocU| z+-5W({_WMCFaeyEg3E3t7Sv7Q{8=7X_i>bXJ?`8MgLuZIpZrU#z z&!3Xbs>de+K&bYvM%cP$uqf?Yaard9G3vHm3XJ)u*M=^%FtjfcW+;tQ4+gpXy?rE= zp(!nLD>j*H)>@Dq*6dYyC-^Q*_&9r4=k_cZjlquW$z0e4+j^R^tJn)5r((+#W4y~Z zj<7@gLmKGA`f0$Wo^;T)vVj!vX;_M=&fxmmMg3Du%;@pM#KWlK?scE|?qW@x z^+C>A1tjjdz0e3_pEH?VP~T7is~&?`=mOTdMo@`s{FjT({&5&*s5~szaX=FR{fCEW zRQU>JAXgrm#7K&AS?=~YHF5duk%Q>~p`?ktcK@)D(k&Z|b!g(084#N#C4PN?&(Y?d zM4tsn5G;ix&Nb^NtO<3uh4T^1zC4ZJ!@A}xo%~K2X!~+Rk0nIi6KXXV z9d`J9Yv3YDA*(~VVumAzt&^nQa zt5{;u!vi!2&nj6z%_Ms;5JgA)mNr9n{r1i=X>mg7O@>bfzN$zbL_R9*uJU9odAzi) z-&eMgffZAhir9+o&bEV3tXD(x(^tl7S1c4^LSXP9v5})6?bMykijSie1ijnMR)hU8 zlyo=l-H>_u0SDQzDpn-e5}_Q%0*{FDFa1H`A%B+Kq9Kmh@(x=4&tbke007^$LK&3f z`xS(|)#c7se%Y6c=OLm$Gnt@E#Q%^FPN)`p2#$kVzb4Ph$yO&d|7PwblRt2@jOZHS{c%dc6TDX*=1N zPu-&jw8B+-p(fPlLdS@3<;E%kiq@=G_umaTC98+2rK8Q_MQkJh3*yw~N>=fsNcJe( z;mm|-joY9EVs(q8nio)mU*ZX{2nFSzdNyOTEN~q#rBlRpaVZFz^L}MV6DXIba0}wk1Z;`xuSOfXz|IK3Ug1FiJ)k$lGODv)sZ>0>6 z@D)d2Zy-5uqXqe;`j~6d-V)xU;b}n!^4mO5+cVMqMh&{pGc62Pe7)>!KztT7_8TYH zah0s_J_PG3jNo?9_SF9xgKroY1=Vng{_Sj`>UM8M$OJ3!{jM1CEz)G-p{ z2M=1n;Gx*s@lM5)p?{UiYBN|*ZxXOSz!&%BiNQISq%?i354Q&yjbvCBiQ*9dI4G3_ zX;(!Q6pFj=q%J4Lk`9;OMhY&ejo#mwRa<)4wB+)sf((qmfAoJNw8m%n-lJq|=p582 zy}rC*$r&&nqy=&I-Sv?-OaAl=+A}oZ13vh5r*nRCKzj_Ms6_~^C-EkI!J;@)Z|YX2 z45avRZYQ7i9W0R%DQct~@^4(A<)Q-|*YxJn~X{SC8GxU4h8(IBrNaIS1 zUNVp3i8Nr8?_CHpfj1F>`VX4j;e-65Z^jfO{}#y%(A9i@-=A;>mr~J%j-~JbsDJwrSBxrO)urpD1n|<=p2JcoouJzeCEu7L89-;mG#`= zEiV6hzNU&hiipChtf;_t5!bX?AS^(AEYl;?`7mK=`mt3d8Yi=e?FLq(Nelag4+(yQx_!FCNh`_}9%tx&2!PQoq4+EhfEffoQh26K>r@x_D6T_A)~he=1r z1K*jEXs+*6K&=e7!pboO{L`n)bhCy5HDW^^fI5hLUlzW&$FxV^ebi#LoEYff^vT=O z00buON}7`CG~J2I<%6qa{8VqZrq!U$Uw6B-IFi`XNfhjXQ@NF1E>?vYmOWM9fxfr=FAo=VgG6RHf%B&zPGuZDezT~}SP05OW%>wfqoyeEAYRg-k}z{-)Z2ZzQop$Q+Ej#If@9jp+Z(_af31{n z%J3+@Z$E`s0(>*4U==6`9WV)ajb)n6V^sYM%J7}63>jnN*roFYOn?C4$=l_Fz1M>= z?b^rqn9oOPAF-89YVndaXL>xwtz7dr^L3wp%eVhSAg=PTIoKYcjeYI2RigjS))*|H z7lPbniH@KGWI?Pa_AOmY-{5oEoIQW6A#MWbqt7jR$H%!FZyF> zJ693kk|x>tDZTG)!1#m}9Z{FGVyHi={;`jxOH#SbIX*)?7}Y0vQuz+HuXvttB6Zk( zq@DZC0*ya=rNc8eA1KY-K31hb(ZP{zQl2}+Lko%<`3MVLv2YF8O_EiC<$iP#s%tg8 z_cC+qwq1vxzL07gf0OTVk?1?oiNy6d@?7)XQa*_NOVa~i$`ELj;2tD-O5I*FwxG2} zbO=1>XdI>6Epo#M)Pu)|KbPR}0~PUD4xZ`qmtgHYs;I&a{}cRUEr(g*>8AQvl}|dV z3=_>@Am*M#OscdSXHV3DPHT-nEnEfTs9 zBd={QKFW`Jp>9$1LLCqoRBPkf{vNYCod_cs7Bdev{<;QBtDHup_uUW{eH7%RVgJle zIzGf%3%{etbKe2GFkfnY+Tkl-HO^4Z))H(Z(W@`ycG@XtSgGBL)Q=I?;ir#h6%_qI zh3J2S{s0G9sc7jPX!QZg)@Mf4@7tgl%mSSH!t(3Hy0|XX7=1>sf|UXMPRZ>uKu+|}o)^6f_3-I-8!LK3okr2AjT(E&L86;)j=E+( zxz2eozl$|;*QzQ(D`%pKp(hF}nC7f(H+gK^Jnb4BF?JOjp)FRjDo09R_@JKIbZ25} zQS^4LK^XT|zmNTJ`Zt6p1%q9^*RB@ozaPU>ZRoV1IhN z6i6s)D7M0|_QF%wx^`>~lJoRp@=6{{L&tg6*u~&Dz-~pRn8dVYc1^L0Hd1TUtg^aP zn&%nUnJO^iuNNWR*+i9`TBAqtf3mW<6quu(v1T&la^33{z7 zfi5DzsK@uaG7d)TPu%B=OddLqkltJO`Q|*vO`VFOJMK?!&jIk`vc{JxsTyeSnR8g< zH8u{Lz4{9-x}z<$R7DovHY(LXPBD6!+R=6TofSxFBu8K!DMg*{2XQeo^5y}4Y7l1* zFQrH@C-0&`Jr#dC(8X}q(Q~%G%|%UK5iHt*U4GC~ zz?+E>1egF|sNOvR#UR zN6o-R0Oi>ZRg?q;#K|g$>`b{NW`#(^m;(m@0Nh_CxDW;Z{>8*J=2-+f)7JJ0-{;|~ z_iP$c0009300RI30{{W+=BVe-uh4B=Nlh!qo?OroYK0R+y&n_AA(wAf@b~T+WxS=G zO5+T}beURJ4=eAx$!-I)C70-*w62}API^P;K9xG>Oo{Q+DsIeEl$4Nk=O}w%BV2#u zI?WyOcl&w@1+72U491+vEZWLB|qFw$MFmrHyARa1zJ+j5H2Wf`fd54&_A>^`r)h=fWW zQj|y;mV@70<@&pmsG~mcSfk+}viK&s6(T z1G<4GT%$%L?aBk_DCKLvLa!vSg?1;K?`!Di@@Hd7RCD5Y#@`yULzXQPh&Ww&y#0iJtLj%(4g6e#h8H_5di zB(JL$#f(;$D3 zUraJx;PZ0^$@6SiHbPFaI(8jNHRY{jnRU9-Mj)yFJ^}lhjhQ*h=%uo$isgMb6$@gf zA3y~d3u@+C^)F@+)aw6DdEZL>aJIFO8(hcQnNPW6NMueHS^Q|ak)60cZ3URQbNfk} zhxi*O`*~ET7V7dpLkr6&n^=Q*K=&lv>0oHpGi|6PW7eg8jb81&gIp!SBdFM>YcWy z@|spB?cFFmxc3@lx*7`z^!H`Uo8ZB03nVaJMgNKCJznJh^xa} zyu|+bA?gcB-F-d&3t|^7#*tcPdrw#0h(ZC6`t8JGv^?lV>eR?x~R;1n5iINr7) zp^MSfC!PLIX7w`E6irC%lV(u_{}U|2{p7epbqT4ahZ$O1aHs8L=Gu~*Eg$!%Ne*Ok zIbRZFE=M#^Wy<4=hlb5xWe~eHIi`J0^@bS}cna1WW*JHQKG$=sNWGFVBJX9Ku46&o z2@4SQaNVo75Rwk8ho+9G;Q~viy0f^KS0Od_n?$#B?* zJq>1h(C^9RNj#wM_pTsG(BMA_9}Y>lL{!Ca#}?{lUw z$ohhaco{I#n>yW**O+4-EK-m(G7EtwQF0p%hgKf=5%W+^YAm7^f;u1)OcLs`@pm4W zYwt2eXf410__`f|oXIemQ&K@zDW?M*yAvEovy@oM%Co|fUj8&12LOF7rB@n3N|N*N zX_gz#zSe0_VP*N$xvdF&wV{W+iS%1Yw~v-lC*HS8K>pI1-DlxudPI z%*glaf+$h}5b3yBuu~IuANk9Q*q^}JZ9s&(n%hKvb8noFlXgn74~#3~2^#51cuaTj zI@J8RWJ-H=;2b;SegoWYN74lM_l}*U^sd{@QHX_V#!^DW%Q#7F+~mg^vJye6#c@Ga zDGVX}&Glg3r3yvk8)0paN6VdqA7PlFtB+1ji}qmn_`S871Q}7KoE5?D#+i`L2iCET zZYJ;+Qs|gwmVh-*mO?fiJL>2)$I_Awe!Hj5&?qB&|I&+1h!;)U1&ey7Hx6n*z3-*I z;>~3%YUnhi14Q-EYY!^PRv9O|jNg4Nq)wo!*1K~IUjNSJze92wLOb6mpC)9(ul+O!_H#7tGx9f3~qf2 zV03Q8_SSppbQ_6c?O zp#vQR^S)u*AfA5fjhd5=D3t7mvG}Xh2PRp_O_wU%TI)W0N*TU4_5$gbv9tVXrd0Xx z4Yh)p0{F`{Z~xE11<4?I_)esxAk4kpv z9piV$Atu=bCcmI3NRQBaxBV;QN4ckkXRko};CX+wQULbm57zhC;!f!6(D@TTi^ZGE z@#^_U!pkF2YYBj{CEiT3f{{kR^wq>yQ|4nXwP(a6r1D474F9$>m@5}!67UWs{5b+9 zPnXf6`5@lPDeRm&y>Ed3%@m82ZR+zl7PCrcW7VhsKSKpC7Mt%giPu`l!WQgO55U;2(+1PHoQS*1rKB5tqdz1eiQWykc8kRp>-3H(lk1BDm!eWaSdBQ<9 z2&Ac5-K5tmuJHt&9HmdZsz90p3b>`{TmI`OVOV4eZ1zWv>^3oh-cZiaCom|X;avsJ+^L16844unIWHe zOOM-*IER`S5y48Qejg;v@++Fb#hW(ZxSS@@IZY?2RCPy}^^@K7+wh+JbC80pVC@fH zsCn!*COz$u0kGjtoe@SD;I9J)S7T{}LAy+?>W>7V1F^ctsdtLD&3bLYK;Y0fzK56Q zj4vvf(Me6P8iPCTgZNtAyPo;uJnQyu>v%lRrSd7NESDE0RD>&qm21`@fG7Vod^aR( zvHf1aa95;eHlRGC>q=_{TwjP^{I|>s7-4r(FR8|r_}$Agh8M1*2JTAvw0FXBYe(_- z4b+I{{-Mtw?p2Y?l{*U1L91HYz>sV#W!gNpMyzs8WpmyezMD&2vz@qeQK;3d78zcK0QvXp z!e^D?XmnXwG?{0hi#6oFFFcLABwArZt$86!BaX{!Vt;=AOb zN4v`Fc5NC_L&iA%&wYu@0;(fkq$3s&*>|#=0wm4`Tf(OHyS0)Kde3e3^9KFiLTM6M zak3ZUa6w6SLtbY!gFhRksH@JFtVAvADp?N^*Kj3VeL3jTc!Z$~KC`Cb; zncC!t_5l;)sFXm78X`I7H4F}Hub{M*9-9TwEJ8DX*5h!xAqWEkWi_Z0ccK>1yF`p#Kt13L2sK>two7IRM8`f{a$lk z(Rn;jn`Lb;uu}^=X7x;3Do~Oj=b`7TpQZ*SwqUyA;%SK7~_-hh~i};tKQ!-L1$-37bzr=%^R_P@9}Ux5*vp3AsQ2&mc8Vf}x&*7E&hV zXBE6<8J8{u1A6Y&a>_`5#&29(C zwbn6;C!9d#)U=$r$Qfveydkd*W?*Xir$pu4mk1M2#<{zyEd!HE3I`1&d*eUl1h zqF5+H9K3iYGnDUrFpkpz1^2;E$$hJcsCK%(Kd};joL}eSDrmiOmfYK5>)KW!dnRa|P`z?mO<>=6? z3>>YYsvKAdTIxx?fHLr5r1*A10*6c>7n=d&h=k$?HO=CF=4A{{4?6C86x%8I)8!a^ zTs6`@$sqmj-;){2SqE(^-I6WVl9b$_YkJh(ZltSpE-;ZYAu1eqCA%N!Phi`S0HWt} z59uW4S6cSd!h8U#nZ5lM2Y^ZBT=BPWB^J0|er3{8NMcw*_#V6wD-4KW$ZL!%6KJXt z3zGtP!5@W1lrEepdkduAn$vgvp5Jv&%hl_~zdWX{Ob)8~eiDduWW6(@C9^Ru9w?0vj0iyU<-M zi$VW|IbgN&o^U3^X~sfk8n=uAf2`cM9@h+s8DZlY{8~pd{BY(;V7+AX6j4;|ZY}x) zoJ-{0y`8O5ekEawGJ<|zx>YdP`A1Q_u>q)cIo1J&=$~KX&wNog#0y6MPuBsJ7W%W^ zWQ-dlmYO7M%F6DL1ztD#pN}d*2kn-+QG7gZf}PVasd6)B@v+SX7QyxXPwp*F?$097 zt|Vs)#f?=J@xPtClXb`ZzkN9R4~3>%^74x~(mF*2lLbey=gYB*z>2x2ry|C)>rGd} z_UVz00}Ez5_N2{0ecSA%G)r{E_cx4+FPjFVq5E}KGnx3w%WwIcTasT zUWLwoHrOu(RPC^~ibOy%jMW1*Ut>Fhu9bGiK2+!#=1)1Ru@-<^m2cf`dOu`%aoNuL z7>cWu5fK6p!>!yo)!-0B{_W*?2=Lcb->1LFf;x3-oA?uy!~0v9RUI64g*=19NfgY2 z5fBIT%(NV~E_SLTRV%H+WRR=`>^X%c_d@S!_Mt^VwIDw54`Guo3hr+Jusvrvj^iRL z3%i+eWx)AFMZb^qMcl67Ff1QVoS?^3l*5-$_}RbGVV#0gHl_-)-_m6mF~q~T6w+gl zkdTu{R7#NiEa=*LEX17cqt`$D8Kx;hl&qx{ukzvn`{)1Q%;DY#@OQH1CX;e7-6Sp( zhY{E)A$Q2|r{8u6^-SwxklSu$Rze7UQ0<6yS(0V2|AmUK)TGDXRC=6r_q+KFn->(ChSnJgEHiC4qbnx>P4`jTjyy2XOLfSxwQ5oYk+WLxG?ZwoI{WjibHVW^ zveP69rBl2Mk*P~XVL?SbQp6LbJPosB9(;wFh#>&;-cPkr{_B`LC_chhMoG@c-Js;mF)odk7 z2zX2r*^Skvh=8}j66a%M;gXW;F8cmOh?g+h%@7YJsl65)aw>#^`QG0GGLH=<*{Q>P z3iDTlruX(C3io*(p*!z;b^5)x(6<|Q>Z!9!Gigg)6QDx)bR!qVxKB@DeP5`Fx1|P! zTJtL$UPC`LhV;c26f6fbAoqq#CR7Btbm7YR&Zxn;%Zvy>))7h=n>G6rc>o`ubIvy| zufr>gNNoGl_Vvp@h?WH_%&nse5d5&xX=DV9O480*|FyZQ##OO2JYTHCLLsLtv4*VOm!Z3>uX2Hs)#+aGpVHtn8--zm zqH~H`Bjv>e(HM{eQ$&n?DpH4}7(^lUXZ^u}f>nfs?%DIX$G0%4@ zzQu`q9km`xLHaPYkbkld0kq9i)tzCR1?s$k_}x&$M&$`G*#QSd8O*s6!ZH)gYsq(H z^ZvF6!f7;Ojjx7{9R<2cYbp4AmwoO@W6W@MV5nuh|9SzM8d^-EKHB!wDOfYkEL;Gq zn64aUhgC`OBpFHU2^PMC^OaJs6DnMAuzq^TsErOEQf5%e>ts_9I>NzZc*R&>phSJj zN4Zg_U2$sKDfqh)g7O457zrfz*rDUIgZIH588}kJmE9sJdRXNkF$efk{;q0)Mt7kP zSqxNIBjIafstOK1ncfu~QNet?qrO^UBMzRJLPJ^f{dZQ|vq&UT10|E`zLiCdLax)s zhT?XAZdNX8ABm!&dIIK}gA&Vei~B7FB~x53R!b%WCXb1+*ZR=ScE=Q~d+K8A9Grx; znYlwjw2N4luW=(+1p@(vBEE!LfJQd2sSN;ICy`{5^}wCP--*OxmPu}8q&M~6J9n(Q zOXsNdc(Cmi-7qd8`;m{9bq9~IEnjvJ5Pb9;e=;}sR+hBR$nJdcU3tr}N9!r)Rz^}% zhWc9ws{*C^dWu*~2ouW5^xoXrhI5rUwzroBiz2&uC%WZ2_hj{T4g}7j0VC;S_*hb+w{2!5_qj5AG~}9FA{92Poo& z-V0LE-;yOwg*8yZ*_RaBDUw){%P#=xV^s_AN%uq^7B1JPa0H;UTUs_PD zq)JT}APGEKt;LR6f?jC`r7U@r6CjPevbpyZEYG6x1RobJl7*{^G~yHVUdCo;7Er&bRRdtIbdpgkMH}j z-*$@?vo%kEFe>)3fIMYmwYYrle1i*-|9lhAv@;7?au2_tbY71jUSi@>+w`P}X(S=i zMoa%hHivi1Q+jYuK|NZd#;qI%ERfoK8e{@PNj@^Bg1@Y7pymT34Y z?581w>U4^6qad8OguVCpU#d=S;`PL`V8vO-d`t5>ov?Rl1$yh}YfMHS_vw^{m#+KBh zir;lSp$!xwO*_ZQCfR+H7FXqek#L%7)kBCA<(q}E+r5=tLga7^=6BZ%)kG)16n&Kb zbhcbomMiPsk~tBU$Xd^Jb!h$R){JY&1!D+A>PA|tO0*un?=@Vr4H-im@-FH16u06t zGgn|uUGM5Hr}b=)J<~@;tL=9_v>DRcSHJR%}Q;0ss^%t z{g#(*=IhM4hwIehOfb;9hr@Wk8dB4s@OwV z{3g!?Q9VSzo(J89y`Qzywn4LybjK`!wTPKyIDZ0bm%8-^L9Rndkl^#ery=OWc$osBvD*B zH>`h@FO>01w*z7GR%a6jEIRCVym)4Q>#$V7UHpxyEsZ%<@|5;R5I8?;GkabAau7T{ z<1&3c7oiiuMKEgxyWllIPHMv>+MQ-+k5XqGG8^mXdz^0=e7g){mn|Va_a(c+Z45?c z=Po;TEPcY$flND9gcP6+=W|gqm!qcvwcdX(`}r9#5uW3D>qXlOtv>Z(SlE77kxt{C z)r$}OS~EG2RS5k+{0=jzT5w}4T_zG-${;mu9;m=VqPSZs4e`Lav{uH5g-E>OpMCdb zClT*Ir_mx#?&dn%dIGBZ$Haa7>8=-LY*@f#jW#Y$OY0*k8G1yIK`$1#H^O>JS(^T} zJ?0jNZ7IrDb!AlALErscAjT!tbD^Ew^}MxkUtRJ9AA^F${(WE)ZXL7OT@SFG|d3qjuT6a)1CYXb730=!3<=p{rmiIwvolQX{7e7zn4bX!*=P zbL!&o3Pk1gK&~a<&dz!}tV_*48A@rSpVIA)S?}DG$RSX;$JdEaf@~m~w0bih=38+C z5(|wA0Jm5JTN5C&C#7A=;2rof8#Yksk{Gvqd6#DX=KP<#o3kdg1a@k_7$LC$D^^N@ zb;uw{U^!H)7F?r?DA@|jLr=NR6;#*~v4J0OcFUF}&14TzE6L zU`2~_ctpNamYh@XGpv4cd%MnaPSLe7FxGOOZLGSu>L)th^5iUAY5>}No#hc0hTyDl z5P011(vcSZXX=MD>)gUnC3ZrGX|fzgAL(ZqG8yY=z5R~0yw=5Ac}~i`6~p-*Gc92h zJwm;^zF zN_dGeF4f<;vVkw)Hsc3iPE`*w0b{6%0q9z`%~}DPBh{_A- zg2CIsGU57h0F`dVSj^pUD`6jyYokar+d=*IpuJ?b5qxOAK-ND-&5djDUtuN*G`Q?8 zIQB2;t#LNaz9y9 zEaQ6HV=az(H(Ro@zj_2!HCF~BBC(IHeP!JbWDv$9h1d+5Ru^d-J?NPE1U1<812JSE=FTXuzr z)LQ48IX^ylX??gdowZ|Lj^p6oZ&UWTXazE_x&O|_v7>`-K(vEvT>0de))VwMzo7j( zMDo)-qvAF(e+HPIrV{%w%GkrXom7>c*L$V7i3&pS?IJv-Y;3s&_yB-b;0a+Y$rQWd zU0(_7zKtyiMuBO%N1b;@YUIf4eSZ~p>mG^A9g-g?mKI*(>1}P|agJM`CUH{tQ*1BX zL6xM+?H^Z~Iq5bj!k)?&m|7KtF&TL~8GPmEBoU@l|NX{!+dTxjAPXOvoU_6F11UY= zeoh#@BS`;7y{qp;FQO!UZ;1YYx|F3NBXoD5+g(a-m%wy)-zIg?<$bKq6U)rSXjp{| zM1U{7sk2+=H3~sjX9phG%EPq~O^T^VM7ajMhOTV_A1TdxcBZvxuNm7hi~J!HMOfKfj#f+obubG?m5f5E zE6Lm+bmlmHWhyc^5<_jX>bK@o?-q;vZ-%#p`KGc0KgUficLR@|w(12V3=2~k51!Y> z+eBw0am2P2Zn&ni>dmJV8Y`bIVyHOkGuIfp`bfpR}%;c{4XB8WGNhwrU%tdO( z8l2PjsEPrIf`YXj!#$;KPB(KxPyZMx@jW|fD0t3%kd&WqVq#9}_LJcR7c+vMm00vd z<`Wt1MKn%!9JW!88A+%buDJPtRp^3HxJli+*Byhs5GDmcV}do)BVz!JC=-_c4!l+Z1c$I;U#>#GwCR(Hyr``WV#EIQ=0cq+`-cE(p|58($ASH z>bvtMWcpmipNEhW{urIh!R}TtS^Jv)?`hN|pV+YX|KY(XCeAuWDgO5OIog9-#TXv1 z^^pS%=v@9z#XE-v<+OKwf8mn{V$;7tnV~|WpAI(^*UWK(>A5AOZ*;=8D!Abq@~9ly zAAI)ex!)7L>OCcL&vO!9X9&gXx_c>(8)|F*sH1DHGZ#l6CsHNi{Zh%e`FG~c`6)_i zgc?6WU?{?sBNK2a{!>{fR4_Yk;R9l7Y&!nh15aF3M!v9ceE9!rQ0yVc!LvU`7;Nnh zc(D%a7qk1hE~$s;kb9iy8)$!Bu)^)%86t}1>?gPlAmGTB!*?D1zqLYw(u&)onr)4B2^8(X7`XVT+5s42gCF;V2@2oRI3w7>HRyG`#9t?vj4I<)M5I( zR@uN3aVk>0o%v2M;+4{uqj31|-iyXn|dGOEI4 z22=MN$xoD}H=Fx)uWxUk&L9BXE5@LzK^@oNCQvlk^$}1HVH0@NKGY#!`8uvi9|dX z@uJVokR8_Dnl)f36?BHEfPD)w|7XShA$1gBSqP~FOX5n?oh{7A zCKQXuIYlY#X!weKM!ReC5tm7bw#$ist9Id^Zk${7q8=%}Cghx_BZG>Zqhh6+%~&1? z#0XFLY+R+-0%O}3pV`rKp(p3TfH+sj6H8Z|w0u*kCuSx4GFmw!gv@^8hCu3NNDG9_ zN)a)WJ6H%#j)B2ef(f68VlbyG{;dlnYDZBLdiy1$U1#<&GjzeqbSInW#c1JZSYnp- zC{9vI;cL}O*q>PuhD|mpUT6nd*hH;o-ON;wnCTk}v>O%r3buty173mqp|eRxJI+#J z43yl6!L3yS>Bf=oA|BiTRY0o0m1P3_vhn^MTmajN@OuC*&Zb-2)RIN1?+xp04n|M{ z@FM>5DyFW3{HtkKHN;e-`gQ3eZc>J6=6p)h05j*lrE*u|O6UPWn=YVV+biNA>1S+O zbXfpMBmZtjEms02;CW1Yt}KJ~E110H`kPy1GRbDe1&>uj)37@vmtRA`z~Wr#l4H=_5ook0`$E!M^;qC>43G>gG%v&Rq;v-(^fzY`vYBd8|jw*S&_&Qs2DBxSNDP@TF|;|w=xVm^P3 zw9dS@sf=!tV3!ievAP0fe@Lgn9JV!PGUg~h#^XW&_Uv5LoIup_3++VVOpX;?od(&$g+ z^WK@|)gc}AZ5s;FvO$u#7zPj8H#z_g^9$x^>Z!#ab=t-RC6vp8G}UgF=D7xoWgAoa zswV)%$oi%{`07JVf{ZmikeIS)a{Rco}hjQ3{q?CTa%9WYf(IEAK`I&4MY3l@PY zTN_%#6yfGHa%-VwTY9!SE+Dc~uHI!2UuxO7Ka4ckpNSo+8YsPXN)PANfu?C9gYcBO z0|&5nyYK+u5cdw3)L9vqW0gg?u&SVkT#D|YZWzjXiHyY&x{*Tpy?8UU1&##XVuainc=P!Lw8)fy0licXX(L`d0C2zw8- ztf`Wk&uBHHS7uDG5+IwMZ@jqyco#w?o{h}(W$FxbR)d4kje@MuEhOV zjmElE4v8+(9x*$8xlv$N8$q*@i28f^%sQAKUu6V8yFefWLYI7~ z@}k>C1)C{YJxWkl7T`eGc~A1YzwlaJpPMPmtfzs>EB94FLr(S)$q)VyOCihwlC3Er z$WIM19zyZ$BbZPlC*)r`jh3Uc`l|ye8vS7fU{N{RPV&oo!&#rR^t5Sk%j-iUptrpx zGFezva`k~vA*pG%=6^{C-GJmhBuuk|O|5=&;CAXw2Hl+_5C2O`r~DCiD}ZTJa7J8Y20LB38`0)0-Us{9e? zVIdzM%QiW045<64@rqmBy?(NUJ{%aJpo}D??H1Na0DQV6^C;|srCR+!YT#ovYmZL{ z{fsx6wkyQ#N!2`}ZMYbT$z6lN8`Bo{Q=YVVHM`$4?9L8zbTcFrqKHIR7#BD(&Vo$8 zq``Hr=Z8a6lWeD+)AEP)^~sua^2ioN=YaXEo$Pshlm%*`9w_v(o`_kN-5%WScur?4 zGcPCy!Of7vJRIxxv{6!UdYoDSDT!;~ys;g7VFa_X+e%KMgb@kmh`j623e>8kvfM3@ zI3VwmjW6qW@5JsEM}oh8{ZVTgp$)yz&f}E?u?XQMCGax5GqWw-mad*dY`*u9Wt={F zpr$e-;Y065FY7rhGP+KSAEI6E?Dj$L84+r6*W(?s-Kj3k%0#&^z9k-uE#tICKo=i( z7ILQ0iU{JQzYaK5imPE$`Wp2`e3Ck;4=fc*cSo%4Q;q<{4Aw;=%`aK2x=w% zY;Db_pz{KAITY^6*hjp2GzRaTc_UZkc^h%tDVFNDdI!yE$?J{;El@-PW-$&o=1CvR z-$X*jr&MeP$f^vVC#s}?k4CQ&?+kSSj)M866kAe|m`{8K%>~g2P;QlbjnuW!nq%tT z-04B-li;2{K>u3NdV!xgBlZswB=+B?{H2auJA3uQrlddrEqwPnqX*hRG6n7Ie1>mPseJ0WhO0i|CtFsH`w^mLpjIKysP_C5G62&gNb#UC*}rW}I;7 zd351@++sWQgf5*8cDGCX{3{Ev&7wT_Ga#%2&MRS9VTN_J7N*BA z6%0MY#s-9l(CsRPQkS{)VDh&7zq%Sb=fu%%m0M#e@C?tr1lZ;7Iy{_YMpBZ0!Cn^q zU*WlfLi|%|tp+Rq5-!vPI+aKkX_Aw?b)gw`r!m^_N&MUoSaX;bcd+Z8@L-r1L3H3F z0!+pu%{%vP(K1&gySlBfSA`yEZh8PD^QPezc#L;+j#gF?Lc`f}awpZO9H2P7!6_#^ zVvfVTNXy@hZD0mt-nbaN$`o)9)vyq;Aen&av9Q%2Rqj^f4s zU4Wq<*y-YGu;s#Am=W8Yfr~-0`d&&u6SxAlef(i$1q@xu{0ior31O(84dMef1evfF z64yOnb{6m;EZ+eojGN_B9e?v7aHD66ilQQ~f=WIqqSLGiAGpt$@s zAkrcS4-g{8YIZ6Q;$B*Ty#kWM2N^%z)JX?ETjFVq7UUQ_V`~e!pb%Xka1fJPVUr@% zB|~qv(*eo*2}dDmXMyuFk8520k61!JFLLw>vQcSs1mWg9gevPE=9OIoci_wM=51O` zYUP_?y7GePBjm1RouU~1YL0CKV#`d&mnnu(y5Bb*I z2QQ{txLNa&^%N5K2S@{Cqs%lAn!Ju;Nv#qx0~n7>b*LS*dGufOvi4BVr_l5IWwo8@ z;fd@zO!bJk0an$MEALpm(iJg_1u9^xe^DfhenOqp^6Jdv)usy**Ds`~i$ZRDF@3ld zB$nqfotZB&7mJ>haR8qW$K2MZ2F`)WrIZ39RESJgp_OvNO#OMe zeD%+6=vfj=W98+D@o%|$Q(m{V_8E>;8eHf2^XxbQ@Fo7r2(qg+lDRZy6@BX9X2UU$ zIO@)s;`G{1L@scZ9o6$tiytPY{)Zok{Fl@Dhc&MY|m91MKs0?&}zfT6m|Ex*-W zCyQe)p%k0Ks{Z{PdZ9QH=H&8Ll_a$9Dvrivm~O^evv-#+9;1w$K1SCLur59RPbQ!} z|C_GsUr*qW{nfMkXa^Q{EoEz5D5RdW>;Q$DQnA}Y&vg1WlIB!R8r%Pa*2bL3cnJcl zBCyh&dE5l|XhM<}0AN9%RF!WAQGN!;QwH#3-TlwD=Y!{@!4Xbope7P>bJq}&KRmdJ z#4meTW|*+sXeVUzNuYlIN0y1d(ipZ||CsvtsU0*_l8J80xmfD8XDFOlWRzskhc?`G zJi$Q3crZ>=k-CB+o>{MzkhqY+e;Nj$MrcBWxKoLwK}=n`U?R!JUhbk zn76|bup1ANJmA=|B}6m-#0C7~c-9&*{!$LX@STOgV7MoMLn^mU$fzY#8^2q=8{Ovu z&Ob<^F!-M2he$CT<*BJbh$xsgOA%Uak62vp={7o71zs7<5#YUJ97Hpiw2IPM=1BVY z#el%R47BUGlR#sYRsqw7k&sDwv{%};W>XwU3JBq!^xa-O)j!UI=bJ?4Vruv101s7d zg>qR9qaLV=Ni8@FAVR?OSdM?ltED$L)V1H}<__NIuJmC%YaR`=$~glC7E;*gv6EMf z72T5H#-ddz`<>()q^Xw7Nc^PJI1^x&PCXD5I6l;t#PDLUYebcSa?jLwJla-ltc_*M z=c`ysyn}r>w^&NN0O!0HgH)5KBUpN7^*-ZNI4iwjCCkgg%U2l?sXBMGn#1;ipIerK z>J|>yM}FCQ0<;ZKoe^&D8PcEFd&67;i!vhZxUoP;1tpx^U`5^5r^zZF^Dn+LVm$uG z!Ajz9tCtc36K|;vk7}{|s99T;YPK4FV7!6TD>bh%Ow{%Y>dD=sxJ}CVzuLy(i}es` z=NH0Afe6OMDKtiJzS!BxL2x4D8YngcgER_JiJYFyy=n8-arEv*MQQS4?l13@z5Y;a zCa)d@I2qN)L^us0KUY!C9Z-F4zn{e5S~I1MPMsZxwUJcucG?O~ro>e+Fp=)pvAw*p0JZ z?!!i<$(}VH2d6S+Bu7uuEHcwir#6PkHd0#I@*Fu;;M0ughB0|wTpR-`6F&&KI@?&W2q*;0_V0Xh zJ5B+5ih^0mQjVw!PICzn-DuU{dfMTX-wjnCNqEIgBAg>)k_oPWMSXV*VZi}MuPmi5>J}?Z(W?mg?ePs%4u!b9qr+)h@i!HB z+epr&Xi%$$k>n1B8|Q<6=Kb#Z+z(`1!ThxeM>H%lZe};=(sV@uKP8+??!UA9t853- zafW`XVXBa}ERe$EqZ<--<;PJc?*c^O$WZVIP)xz;bt~?~R5mT>_G$UBP-flR6I~H4 zWdcy>D)JMd$Ly6Iw`)PW;^dcr!NH`GhyuY?GQE9)4&qwGfQERJhcr^nB1ZtQx9x9o z&~b_%c~Gno!z%-mDB+Vw*Y9SsD358#T=7Y~j9@4$IAgRjU-DcsW)5?_X-GZSRoqG~n%UI9C>E zP?n@;p~$66wZ{YVc{YoxEY|f}65Pxrsz!MsWyWI;q>zu)P;uMImR`DnHDFLKVsD0R zbG0BsvJ5!D6IClSd$pf%=Q)vrN507s2RJA`;y^ID!PbNS(n}F3@xPtlwLPqxE=vg! z=(gotUxe^vOpZv)mB8W*Z+(+3m`bpUxO4hka`n-{f=Ca{CehM;bY{;*ENfz)co(6~ zf9BLhVjZ(5f84Oks>;O!XqQlnXB9CZtvf0C*Ef_EWpxS-qLiD(%Fin$e-ji3_MKT_ z(eggS;RMCHd|K4rQ&!_e7pbUAPCQa?2>A2tj(% zbCc76A6z4v{pk%Icovdo4Oyo;J7FULF%`1^$7h?iUdXpg=z5;e|Fd-`jvCG)35S0@ zH=w+U+;3=yV}4o9H^sL0^FL@t3#(Hry-)kn16pfXs)M`-v;380{U3Kev9T&&!gW4< zc5`n`lWM7>aU^gSIkRXaA>wBW(CX^ySRT-&$UnI}Ip24Iw>aND_gBW4_b)g@6AB1; z&;(5(0Y*`m0-dlMtqvA4{9SCAJryqGYY?W$GsTKWj>6t*bJ#AwNvdgmG19lI;jo@k zG1M>iCA?vRQnZ0$XkHvL2TU2Quk+4^?H!)uO)Z5Q+CJMh>KWNH!JLu*?=uxqkoP48 z#fWdj=JM^niRuPP2-F2mTKZ{BxCo{>YywqI-7-xR(XNS?7=Kf&`p#`fiJqkSIGacL zXWzp-^`*mQ6^AT2r_;mP+BL+Rp<+;A9*4AVgskKR)HUdr=f|%&<7_xWs6=GhPPBTP zTlM4w2}1Pp%yj0_3LcZ#VC$SPfqp{g@*^WLbi{zhtPwhLJ`*d*YFFxQwkHO5%x?`% z{&H1!_QmOY=g1$hPDR{^B6}UQTg`Q=7;R_p=z^28*Xpm7+zqra6&Sf!SqwE zQETr~Kn}|M!TrbGBs9qa{r(ZcW~A08%L%mg$?49Z?5YoCjlYT27qZ}chPsvb($Lrs zk*e5X5yk)I!RRM+8bwR(wfS(Uw~sQ^bB8*L;cB7L#nToo%z@g-!@Y}5j$VkTpR6O} z&cIMpROQmT>ezcGswJ)PfO6Tt4{kMOB!{gGMK5COH|QiDH9Ya_FL?KB;!uDvU@MnfG9@&P{xDb%Wn_V)-#BSfm#i1*}!G^Kjz5bIIqV%A3+sBG`ph<3rMBM&^-IZ~+V z0NcHkau&5f;2b-_Ks=O@{g?92G^stCfQ(4m1nH>9AK-M>#Q}31fDvTU4hc1|z%Clw zVTeSTuhopR64-mYJ0zx>T{C8(8MAgtJ|-?{Iy=w(()?3DdzwVZ3~fF^m$RmLN`)Uk zyd+*@#BAdfvIj{5WiU9RRq06xIVGYGwc3RN)VsbVlpk}F+M3~rp&X*_q2sZo; zOAkHXahBP7^Ydf)Cm=X|JM@9ZcFRH=9iTbI)C4)PIj-->%F60vQFLjKw~M74VPmEvQ~G-IVZ zZiQ)RZ-(ZG)y(DNK-hca9^1``GH3X8xt5JIm5(C3XS#m`9cg=n;4H6hyo{kJqG!u-F4$En-bXxZ|R}>R!1VmYOfL)74WXhZO>u!oMp-Zc|3Q>n6c-Bxg`y zIbOj^kC%Se&1vh~G}e#wlwyyh<|HapK#(6TLU&{g1Yg>e>}X=TenvdnzF4>8gemq2 z`eu&fD_ya)J?1G9v+46k+PpxRnjie z4Ut&&G7okDCtYb&{(FN%{R^nwRw~~mWAD)o#9@yy2sH=ZD?tAB^M4;#m>edZ!MoB> zj&4|wP*}c4@Pfe0Mumt(LCCw*4rN@km=0Gi9W>HaFpz*AYg9DwBC$Zz6|MA1f~GR% zL8}WTMwR_+#yWApC4h{LH@6fgnch_-A)u99H4W@%g@h6_oHtL9#Uwv5Z1A7H;j5Z` zAA?U4y-*LP(O%>0n2qM};^EM4WI%-G(()x21i&{2x$EarHsgGGy@Fa)-?aV?SJI5F zTi=2zWlkfIe7qEVc@+*I=H!~PIhT#KPvvxS(xeRDOWkEgKBK83>HmwV_oM~HRF*ho zzNeB02@fYYlm%@r5@mQX8Vb2KFdAGFZap41gEp{DnDxfNwnSe-H*aQK znXr7iYa|Na9u@(D}Xs3h>6WnjIm&`1lHAVjG$0`@`WorL{SSKv1A_pDe-)QB*!UQyHm zzaCLy9F3@Zay~{i+3|SbyJWs_3R22an1yo)ZcoJ+r%a@IQixa(z%lRxi#qcVxlct+#(&N)~Zl zcFnr54Hx2O@8UGak(OK>B*s3i40Dj>HPvQ7nnw8A;%1hy`N7%BYno$&&5;B%MjEu9 z`R2LcM0-Oa0vb?laDxFUC;p-Nv4IXifVQc46sFi04|(Q8Qq`mO`4IL%JgT!eRSOO~ z(-;Uu=@CdRo*IL4?t{1l{TGEUu;4g%0R5!_cslp!=Ay071l|(DpJ6zG?S=!r%XK&G z9%_77M-N;4{tdh~rU>ri-!(lI#qm09L zTFp5i`VztpQo2xK?-=u_#r&ru)AcNx7RXMg zTX`O*%r5n=Kzsz(+?mLMvVo`X4?;{fi@4s>ocli?FTX@twJ`S13<+Y24&B4oUk!?R zPg&u9%-|CKf_+5TC9CzanLuK^epb8mm%?ho9pGoqRQTZt_SN=Xk~}p_lT4KixpS)Cs|R zSL4UYrOsqqJI@OHtMVG#Vtb{IE%vD;I(sCoT`(<3H~E|xN3HuT=%_&k@x`&zuLM`r zqkExL@@q*&vt7Q0_YTV`GIz78WHnKL;aWwy+|A#)z%gwo>-LvdiDnB$mWDBlm>X}Cc^4nBFdG3GEesC40v4BfuVU!;5O9Vzf zSVrA)=iB0QAfxHiIOMclGtc-nnMWay|7Kmx;FKn-Yx8atp7AudDBs}DekW4 ziTHYNWKx%UliO9-F{LzZAc@LtLVIFNaV+ARH9wC-4!<>rW3>A6bLMyBh7bN{AM!#d z+UVxc4X$&OlXqX5l99!d+{GPwr&;ouO$X#w-etZUM@3{;qPq^jDna(p<_rzMwF?IL zgdX~F0UQjR5?XP-mfS*$M~*ke3l)YNwKXP@PfwTy&;$|l_(f}yyNm~l} z=3O8ko@XWF z5;wYd3n*BNRN<%^Yrl2@uyK_>Ith{i>I|LfN;jT<7UBX}evf$vLnf{zLGZ$_R`V6h zlx%i)si;pu>(A#J7XxDUsJx(B_*+D?S3_%J2O;s%8L&8gn>vfm|HgQ7wBx>B7F6Rk zeUao-W9mFyvFfYT(p-(LwTAYm;WwW!H!x+FviBO_7G^)>T@a_b*(JxZZcY>9025;b zPK=pI`I?~Wozw8kkSJo4V|NA`g-Z8}a3>D>8kWlDIjhuS?s*we{F}?BhR&DpLCp*p zcIpOC-aerEN@`g|#H)_lssPm5si5-zM6T6XA`R@%`#NW4{yoVI=sm&n_n+K7@7iQZ z8G_)z7urA*!+=Q64tdD{6&6oaWZAQO*Ka0?(zkpUArK&n&|eLH@O0!zc2XnwM2mU0 zmYbBE3JHE5mVBi__59NL=vSH%j~x7e@8UK28h_op6AXT8)Pn%#q9yfvyiVR= z$t_Uq-f;6&-KKanBUDIg`ob-l+fa{9MPr4UT!uZj!;S>$T@DO(WclLsk%k5e226k$ z1$o;&hiu8|D=JJYi~sF ziR8hrK6WhmA&>){1Y`>ruJGL5@X0OKefI=2r5>N9H;#F>;2WjK-#$>|sPc28)Tq!dB$=Fvw>pnXL zzwdVR;PnL3bWF6V5!o2G~gZoXMztQ=I>!bZdo7=n9pAe}%JcKz}c~x5F z9~QubeTI{~{Rg4s11Cw^$LJrBbBLbM4DqG(B((I;mwi3~ve6Sv&%8awmD{1YYX8x= zX#MM@@@AAX|Mu{NQb;N^0?Y+B)P#B7iP1u>cSZyT(yUiZV{fHcm}HyC)eB-oVh9kV zed=!>Dl0(OnhWJ51%6m)^N?g&KT4Eslo3WEM`(Hl=o=DyK|U3kW7G9m#Y!WMv5G#eGJB2dlP8Zu7#I}u*&3}jL-_&iisn@hUvpt&WSA@R$7z?Pbl8dTP7uhee0O}76-6`d(XZ;Ole zMfX2Bg>S%DzNLAW1AloemDo(L!L^)WMN=Ak#0;s8bmu56s(DIKMkXmTNKmO|be6g> z4vP6yg2ep$^|1~CEAYcHt)y%34rZ(M#j&&E2cdbLwhCHlS_2M6XVyzDT2>0J?we%^ zQMMOmP0TtTs>sr?3BKP9tpM=&A1++j4XcK-eDUy*78}LUu2; ze7-6~A`n%zgSJ5kYRpF&ZpLE>El-CDjANkfO2LibQ0!;vhyOBMqiDgYj8ns@^J5y z8rF%{6X4CD?>+9)vlI^pP=VryYq-30$54X zOqn~1A1x=ZTliSu&Yrevhg;B0oxnU5gvsFQVFO&s9!|~7Q8iUBAd)TTTUe&%!3hE3A|}%sj+iE}F}!3?J))!Fx*=)+sbi1?v}ZFF>VMC+B~M2^I2_E*#D5 z9X|_xx&dpyzy~*~p>rJR4r7}nc(tw89SKCeM`T|*X{jJ9sZfud*v;Q$={DT3v(3jSUTH^ z@itga?gNv}uWcyBqPc-3vAQB>&8*2qjg!%dV+%mZL~YwjYGVW1P=b8gu2TsulS8T* zUc{GQpkmMdlyk`$Mf}j8bnJ$E!!sULE8YG;zM4yoR5w=RM!^_{7qL=T zYb%sbL=f$smPRW22cu+Zz7@t=~(; zBcUdeSIw1vAmjQ`(@_=z(EXww*>IEy;b=kIiKa4gSUL<@FnFK{6|PxGpMl zk=07!-3FRzLDlhpLy1&{X37k{g6)8WS z93JEPMXpnEQ`un$-!u44(I=v4fbY#E;SPOC%+={4qyE2xVW(AF3y7nP(0FlmaWADPjjy&@MY9af5wsnNNmM;6Tj@BUV?o*A|a6 zub$t>z*+s$?wFqOEnHY!&i4gBmTre;$KZTujbZ+HBVxcoiR&_)r>NL*8OjmbHvR}y zDTzV|WxFL&B4j)u7Aim+f9NyTT;YPsLlH{)=4k-#VwVUYzI13wGAs(_CI3S0!9D@% zD!J67jiXA4w=!VX^*g^rnLd>x{scXe_U4w_K-~ztFL(ui5k zuBcMP`w)?R5MLE^5!7WJYuxSp>Y~Z7@X+mJmL;tlLINOn-sDj&3Fsn;ta2h|r06W* z7RGeAT|QwehpChd8D~i^(xkIV;@ss`#>ciY`Y6nEhybAP>xChoyS8*P-vxHQiJO}$ zt~rQDfp#>Z-_}td>6C1#4(~cC4^u_opv_teLT92W)AnX2I(I?c$tBpu&Q%EbRAqp7aC9ZfL4eFNd z?Po`3QC`|t)$quv2rW_DqTt}c(!ma+4!wt)(Y>{9-%99~R#oIZkilf?r1jBe?Lh1;;E6NaFq!JnSD!>lA~7OzIHklAl(Mxb zk%;M;7O%*ii_LM`mq(Z+gO8z9oRZcr0sLmdQW0Ml^n`f$9>^ed-@{AyG#QxKHsHqP(P6PXyfW^0;Y($B_4+3(>EFne4}*@ zd)8$Q5TT@LZgRAKtc(nRaEK*9Fr-T&u?^3)v3&J7M>MrR;UM%ZZz6VB%maB7V67iw z%<=3Ucl4WgFwflhp}ZN*mwRmdMT?t{UxbHcResx}341uw4nW9|^u1GUzWgS(%Yo(h zZ~_sl@7awY-)W4OBPP-uXFX4Wk^m#PL%Q_7l+}QcjR}IWgMZEP;FPzBb@&m(T+Gju zW3n;Nb)AjPhBes`!w_O(IPbJ7N_fi=u0>kt6TAyXW7H2a6>p~EF1d#nJ}*c`|CzMF zlIc)q(1iTtkcK6H2mzf@0e`mwO3XegHxjE%b?#=jt-GbU*?Ql(tReQVg{A%1Y*7Jk zvE!S;16I{r@Zb4@Q|t*we<6*!%+=gf_ni|DgDDCH1?wD!a6wd;fYw6>PJWDsnJ;G< zshRV0)9x_}8|qoPXD!ivwQvo}P5r)kLS0Y&XwNcv;D#NaGyL&vA8{CPm&?s-p z=F}@SDSuCAodGgC@~#M-->|nSmsK5$>iI|07PodFyQF9w^g4;^Pfh06{O^yu)P$<% zFCBT6*VlwC-n{--SO8XFhj*H(Pvg~w?7A86qZaHlL&J{>@T;41mO*3*Q zeakZxv8jTIe2Olu)$8A~s$7;4nzx}Ens39Toxjl}pA# zX0%|0J^vjoNzLfgF7M)bozrEE?ifmo&?+9oiOQ+PZ2qs$HJahF19buKH;(R1W%v+R z!lMaIX!3LV#VL<1QLfa!wi}Zz85k(}5h3NRJQZg+BVm@!T0+$6!y@*U$%)o08Yh%N z)9p@wMOQ!J%%~#Ol|vb`BP%ib$5&H|RRtCvzN)=uM6K6tlFgEV(9h?6Vq3eM?7=Ol z5ryLl+qc^dL4DdlT~#JE%-!3j5ShQK;wWK@M#ex$Guu|CD7Y4|wetb{h&Eo|>Atni zE3D@>0|7A6PyC>f#W~>7_Bp8p8AQc@_4FCP;SunwjhOn326V(icUdHpci@_zw?FT6 zEh{l>(R^getI40(qzlu9P5?Q$AUg2Dh!3}|Lpx*pGr>sln}MH^kYE4LxE{2kt-`DQ zmmo{2b2j!uUtQ4~T1Fv$WN@z{I~@B=BK_!#XBh98s5vc$mI00_6+X{X^g#{U_k}ek z6K>|Lj}`j@j0ZJ9E8&pIKzg^O(FBhPdTl3#0@n3oWQapM7(~k^PTiG)D`*jJ<#GgxZgEffE^rN8N#G~vw8|2d$TsLvweLA&^gzQ?QyeMr@l)_OmrOWBb zMKCAKsUaiYktfvjlQ_A>v4&EK85Xeu;96Bm5|RFH04JeN+f0d7#?Oynjv*11Jd1gT zD9}l8tb^r?=&YybTLx|$1v1J+EREiMe3kLsjJau7;|<8=bV~;XMzUjIw=A7dFX?Dc z`6K-mNPP_z)o=}Qg5)7&v~I%b+t8W|r}8hiARz|vn42ixqbjxuch4|&aJo>yOGxVu z&b4{@tPHrc(UO$=VIKa|Z5(dxCD*W4%`FhCf^HwUVR5mwDQ-rt4vTn3jcAD*COkZK z!SIIbE75p9meV)#kx=)wN{kiId!7;7qMl;DKGcNb%a=Ba<=On$lUE2}_f-P7Vy}pm z=p*zewfnNlRP746i~{H=^j5V-#C4Ez%jQ2JLm=E7zOIgH7s8lr#XH>G9wk}8rBxjk zKO1i>34a&_%`7rctaM4^zBcHtoZt(`;-}*6YBUMRoIOaD1BA0$mgzc2s3P1TUpy(K z%TN@~^9s&JE(7da7nr0aB_>h`rfsN+cWToKpG+G9_z6hAu`ge@maIy%l@HUPWr{y0 zQDS!W0@cs+#+AtCXY_WBn$_w&n@irVMi|@zmjE=Uzaf4tjQS0mFVyZe0u0OpBFI0j zPG$D*S@!Si*82Clk`=Oyu$lH1W9i?Lfu;eWZ?0^oyKkMNJOk*F)023UjlG}t>yL2f z(*phpR(C|Ch(U*WeWcCL;AHhH+!WdqS4G8$D{|!&lY@6uax54cM9s-j47%XFk^uITmgH2?j#;GOO*Z{nLTKPu*pw0$y%)wpx7iV*@>eA||Fk7D!rZU1f*D zy^0U9D~%v4!y7L}Vo4k0yUO2^FzEz9|c;5Wy3 z0fp?b*eOkg(f&NiG%)xnkoJ$?z zVU`sQ(e$uze44bKYIKcH{tJ&|<9@xlbE(9vBnJjzkH3I241L-oW>MUV-xsl~6L7sa znu25k8uNbwDopA>6v|H@9A2+arK2lEG7z#M1JF9_Z<^`(yR41~IeIAXewFFZ%r1}- z>27ohFcV;RW59ySnKJZ!o+(}^e5)(1EV2PL@9%6@a%hB!?}|o#r&wh~jLT*}a_Pap zrD;wx?j_MP^0}_T@>-$QLz#uDmkUDK&U-)QFs$v*cNIzte^7BiBGLhm{kcO z^=Hv+1HE5bVX8^W>qnQ~unB@p43J4kxtxdPv z>SD>dpq4s=c3y!c9B1zRkxsv-Jn%lMmS7h+nQK{?%hl@`o0BG zR zAhOUUNL{8pEx>KMd_EA=_3;^COr2xcOIhyt;GFPQEPq~l$>>6 zcaIhc4B^v3l|6?0vm?XM!N$O}LPkhs-`)g~G8hgU_SS{yK~Z zx4>qdmoB|y&`w!!R&*9SFI zr5h6mX42>TLjm8%n>uCM)a!5WF#V5}oTa~e#I*G9&kj-LFq|@GkJ*=x?Z)gQEu_Na zfwI;NlaGH0CP#8zw$7qGSH;#MMaPQv_jQ)B~Y;{O=;vQt?q zxz<(W<`Ny-M?0`klK~NC2GVt|1iXvn*w!HpbNzvz&!}7p;Y+L-Kem`$A}#=vGjR)e zaixZ+QYFS={N%c`P8RuHBBRPUEs!ijwP(b)4k^Gk)Z)gT;vBS=OQX4jHpbZr`U=8N znY{5(P+%Kv6A_GGa-b;jw4Q09)=gT&Q^)mB(mMjO$PWs3g zyCZg6)6@mv?aDgAK#`zh≠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

    ok-IJJ7TenPF{ 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

    jRyto@mi#MM8- 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

    67*^ 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%0DX+>wB!Xu_Jl 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%0DTY*Ju{XMC(}@z03oIdq9{e*aJLp%h0U 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

    |Z%`9+GY^OxaRTXjyxWz9M-4Zux2hoSK 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

    3qYIvYk|5jzjm}8q%};M4ZCZMX;>Hm-dK(iG` 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 z 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 _Vhggz0ZBN(EG=I>i?SlP+lp$oJH8E~4vLH)w zG_4TghWG8MvdBz`p5KAM7FponD8l6(*G8FliWX+ zzS^0!F6ra|55%Kk-5uFxo4Jp4C1BS*Rovq41A`O&3I}UtKN~D2qkc+J?bYCl%C@Wy z0+Tba@ev_o8cQUs^*@-p17Z!Nr-`}&H^_dbn=p3?{&Krcs6RR6RYku2VwMOJpp+mf zq`%(U@mXhevGDs^bV)gR3rR;Rq_lJNN5G>!&@Hr8`~`kNYeZ4zix`7mgT>Rk8IM9Q zS~!yY^&k_jm0t8}C%t+#;=c0%P%q}^0adMzBhmQO2fIYe;UpAef}JE1Bs>P-$FO|3 z$FQ<@^LSB$!vu#uJ_Ov8{|}l^SLsDTFbgdt(SzlkJ^GpH4+Taj7#(IQ&vdVmhL@2U zoK7=ehWvz;b{8KR>%pohoQ&5G?i-B4`Cl!xa%#NsF~FURtY9VwSI>dq4-Us0gDtN_ zmhepVz}{{ejCQLSvlXWOseI6VifU!$j2a0Y9#@Y=V)fiytq2esqdLu&Ll&&2oi?vCl2XDvOQAVrCgW1Ufc53 z_e8E1KO0!vZhQSKuQqDON~l3{j}?xwFyVjj{Aj#+dx%E0O00-ho4Ue!x5WHDPH!@M zeMP~#9KN88_rt(_AtWkJz$g-A9v=h$WQ1hL%PyacBinrK-emJ?(I|CZ<+$#IZK$f# zl~MGq4>_dsOl4}M zIbPZukq^85ihL2Qk+m!j9?frDMUD!Rk?w)##_g!D5A;5vSP=`Cf~qlXvd%9335Ln& zecrz+K}^n&!37BGWG&^28jYQ=7N8Ey|7PO}Btm()>qh)zX{7hFwi*@|n)1Oe(>Sc} z1j-L(4j#N6Wu!C96Bs)6PF zMz%oG4^5RspMQU{@aRGz?%h1leJ4ojV)XR7*B^iSh;KZ!oc_=8sHCj+<(7Dc?jKdS zLN+;!NLaw&I}tRg(n<${CU*WSdOTOpJqIbjh04eYeu8Gt zKD#LOpc^RvIIwl5W@h162zb_&$ZE^6D729q)eHZ5oBOVvr7NUo!|WbU{HTV5KCv=49GPHve_ey^TtrTAsd(bb&MexK zMQ3A!`O=t;t@cuX7Y;Xu@Bi;}$tcoS&5*xLfpRJ?sWCapz;`4CExEd=!z0(Q=^3}Lw zYiB8IG;Z;KBaac4Sqk~Fu$nchfxq6L#N!TtmKMS$W+z+c{;|xZ6q}}0Js6@H!PbJW zGefx(JOdy)b=C+jbHf6MM}sdWXbK(?C)s$vChN%>c3nF2Y}^UqmE%$p;i5EJO8`&2 zZ041{7McaagFteSvU+8!AP+u>SG#UD z(+cNDDR8{CIwZ#C7pdblCvObxK01AbOSlIEjk_?WozJ*yrpK{>&5G=I=?C<+=cQv$ zgU5$X|CXfK3*zS4{EKs&>+xd`M6t=!v|QtvFy3sHBCgkYfOx*j050{Vf$-gl{<8;| z2BB1qmAhgic2;aq1bki-o+aK1(rf8+V}@OY4ZNJOazYYT$He8FKLm{?aEc{%e@u-J zXsa|hI_ChO!>K4s(7rv#Kf#$R$UqulXIB_s)|hk!8|&BBlw^#JvJlh!kPAh^8E{+i z0Q_-NJs4mj3bAa6xImw;u2{2LG6Po$xy(P1XWc`0@Pcf}JeFecd zjVPcCI6SsupOt=)0;TrCR^mVSYo#V`KZmZ722We+Wo&zyk@Q{Cgnwsjkw=O<$_kQS zx-SULk#2?co9gE-gQow$CgZSr0j9)df~aoQ|;)hTi0%a5ZE*|l~m zFN%K|dKZR1M;4N#B@@{$IbQJ{jvyIE)pM_A z;ld3$h^0DI$P(>8RIs<4yZrfmkhMPgX}Ip@s~yHmHvvs_viS17>kNlJtGq&9qkgXf z2fT?%w@wSN#HTKAqAkVL@>5aF7K(4u(F9xBjb@`|IRx0XY-Ljx$4juP#%vkQBEaRP zzGReeh_|#;B)>?Z^FzYIU#?-&U5O`@(@(h=sUtIz_8o)6T1eVfQLex=L z63k34u1#Ml^pheDyV^XVg>ls8l!iw%P%NVsLr%FZCC84;8Bq*8Csc)uDRZDVD2~P( zjb#A1-%KRDq5odth~(5Ra^RXsMCq1?N7deL-IaoNrqcjHG&+rE7WOgdQ@E=knak4# zJcFgDVV2dt5-EOA{{%cAf>bBCw-qmeQDd;ELUk~4duPxUh$prxnr}`GrOgBOF~B|d z@X@%aMBy1Y^ID0Ygq)eG839YdM3U?G$Yf3UR7aWu3gC@~`pi3W8v9lPP{UsX0w zl%lTYmHEMq(Jd&5d=?qo*Mm0iYBrt`b*KvmJM%l+`Q|@KA`G)kQkq-d{M2x?UH{Zgv&AM6I;{X8q4Hcg#kVtowwKaU++s_t)*jf)|g`B za@t1LXM~qhw(fk2WhCI>G(6UKf*V9iPhP`WKZ<+xi>UgVoP;rSv*CO;E++8k2Pkw} zcEF%2StP;W2s{<^+8}84Ri4wZHWF>FKyxw<`ujj&^kFX2<0V??0*V0`KAo}1$HbJ9 zbmkDub|mPZ9|TMrX6Lri&bci=`W93jZz09cdzC=dn4DE00@#;z~<|Sjbx4 zhvwY~6cQwW;oPom|76h=8q$l7Wx18z;iH5stl2l2-Zw1A4WPHuD6=TAfY<;uSA0EGuE$ z(TV{|a8J*gNoaA1!S|h9T~o|ry4xfky5-X^-Jyki4thkc2-F!I$dJrH>LP4o%r;c{ z?Ju#e;MLzM1L%KH)BQ%uxTj5lK78y0X$%+qgAN5fMLr5AW>!Y6MHqx0{_y!DvFujZ3)aqD6+J<{Kvb6|BNO#jw+C!3> zeIsaSwDEu?90**vU9D0)a>k$kFsT_kY`H|sv4n(kW(t?U4ka~qS6gZ30C4V1?Pi(T zy1#4-JFZ5D2EuGbhfGjUy>-EjsT*{{$9qNwPIns`q+8!=CcY9)+W%$7B+ufSGPlyIVXJdPdRtAuYv=#}(XT|an7mN?z8#rgA8)b~?x!5-kXrvt zz{L&0-WGjNkCAjo$d+0-fJquioysH$rQHo^%-^uTj%m^#J-S5u-#VLsR; zeMDpyI&&t1mX?L*|E<*xK7dOmuuhEdT`C4OyQU~z){@&So72_Hauq|AWt7gEK%*xN zJ4tWVEND?|Sl>%l$hsf--P(o;7ytfv{Gx|_AS-k)`}zI;N`VSf8>{rW2amn8zcYj- zsQ@fcD5jw+010icSlc8Q@&Opkb@yh{J@JBj_fBaK}L(GdMisb??AX9b|3We-B3?OcCfdfqN=2o{5Tc&U$!{!tZz2I0@o&o1z05^o!B8E z4g4JKRo@X?W0@wp#Qn$~8|kc(!AxIb88?9CY#dszusrg%IZ+WwbBLF6ky zcVb1idtW7729g(5&y|Mi>^$R%bQC6qRTw`=C;2cp1~8|f8cS8;J>?P2NZ-U#d-%{!$J7_np}CtJ(Be~(qdtD=Lm3hlRaz=={A|j11c7K z-RL_NF&n9f|Ehav#ovy3RT%W5e$CsdfPXT7cexg*RWEp{A-BhQL7k33vJY+t6a zAuu};2&rhZPYB9n&SJnCj}XQ*Dth7Fnsw7AW^-#~@~r+}66-N+Cx5A&hfEjnV zf`+o&F4XUHwfrxE6r-Tbu67y46Mu6ASul$eH~1>uIQv%Id&24JQ6Eq z4_DE*FGdn**oRtOKA(&e7@}()-Gnze|j06V1qDVbbJo<{&&M$>tLq!adiW8_g&@qdsQ5OzHM~*>qnM9CmA$ZIk1D73M-)LJngyem=s!`3wyGsiSF_e zcDt`&cl7zGi!HH7k0|kSUnD+BhXk`5s$e^Jcf4BwG_GHNoGpu@sVO_*hGhP<6<}$$ zF1lW_K!}!@o|4_8B}1?RQ$Cx?UG3)*9l~{BHz_=}?prY|~A4A=H38 zY|FZc8#hTjV#;;`vLquLWq+XDaLyA;fO~f#H7zYhvmce!ODMCtYeTu9Id~>F=ttrN@r_cc@ zUhSz@jc<`weRW}gf*W`922JNzvw*v2L8;C-t$ zqeL1Uh&X*bAH1*YcE>+=Au1?}5<-Gk><#zgho6}iJ#9wf--z!by{&pZjiDjvzBvkE7C>`-N=LSj6@WU8r(&-+ucjbh zX)98i9($Tb{-!&BE>UcjUo+|waA;6$FrD|Kxwsp`Ub>`SjqqX0X`~fp&aZsC4Gm&{9OoR4FfnJC}S+uI|6)3>;Eo*g`tLzBD{O zbx_onUX%=JUF-Cgzxy0x_-3-X@C4n3_?W4MBb-P~{7sTbJ~mi`4;tNTvML@aOQ#NDi0A_NWq84Yae7Jw zrron!RkNlRy3wS0TkW^U=x)~?xB<=9S38LT(gg@*?SFGQO&V2u4c)aMyGsrd#|jY9 z#5r_2-9oVZeoSh3!Atd$>iWd3N;A55`aNy8zuMvt&ogUIz>p(P7bGYrY}En+yyf+_ z{JNQv&KZ>?iiX@1Dp=38SC)@WMUP^pV)(e}z1J$uEJkvJ5uYMfc7eY-IAs$lQ#ad_ zwalLsN%-+QZ|Mmoa(q0LiD8M71!g^utLYRg<`F(_4&L1=;_j?>$43!LryEwQeZ4;@ zKS^4wUBK$&rLs0$B!nsU3HIG3m_=-2HgyXnx*%1wKH2OA21JZxs~Dr`&5noz_x#Hk z=48>1{2+hFOsPyA=`9^u)MJS}he~cwptVB(UoDk!Q?x$tBAxYhH_h^?fT!hgAoaow zhOakIj{1{*;;)O)&dS{6#P(}{$AmNP7r@!M`EW5Co<_B_LE?xZ8=l?j~98glXNV)A{b2jMjXc75ge zZQUa%w%J|K(f$^uZ?9bXL&^@mx$%bxQWQRA%tJq&%(WFp_pYp%5=l;lem1uz5YCB? zv;^c~bpln=VC2v-;t2ZR%MANgmp#k)vb+=o2S&6(*+@XGG+6=AAO8~#oq1j@_l6zU zxB9T==q$ND`gvtBMc=w0uvycLVvno^h!}_OS989$sVR@prI+~xC!`h*M*nDC0y$i8 z8RAGHp0hTcVEIhM$ADtH^_*kj;55HI3A1+F7j{F`NU9``s?4Xod+ONwT6X!0Kug3O zYDaayOj@FuJ|x~LhLBY2%&}2mP@eN<%I|z+;Fr5zW*9_@utUs7bfJ#uLZMA>npRQ` z%zL~{D|uALcEl#epT+UGIA`5Ml7_ZO$5UGsD=D~9{0_+~5Xd0U*(@uQ=*?tV&%FG9 z3N`6VD}=vqs!Rl<)tji44;c2^$<^rt+-r7^)K=Zs{go;xhS6Q#I4#8IN!x)J;Ga)v z*M$E%_Jpk}T{)DWgHq-EQ_u3Q9K-iLD3B>B5i&<^TAtd(Dfx=ASwfr5A@;>8<3>$D z8FE6*UTMIX;gchD6i0q8slsd`!cX*=(13ad3Gf~N<$ILM@bw6Y7k6`_f@|5ANif&R zMOpIXbQ;;sz&#if|Nk=2&`k}Du7P09-@Hoe&L|J%stc!)=0c%|~mK1j!2jg#to+UACHr zBT6B>Tj*7#=K)B6@d#;P364*XQ^BX?kqqyYuA2lDEctAqpneZJuZuj17k4^{8gpr{ zn@97gb^LeZ#Lh`WGUg-_f7+7SH@iF1L<#2DsE3v7TasXz#drgX;u4RO0R2TQ9((fc z$6DA3@-|gecUj{kvj$t z?yU3=W=}l2gTVky!f_U<%5E&-Eb~2=suHMCns-+i*lRgy3$!b%)t&%1k!3&|cTy^_>ix~TB z4K7bz5gxTF$f#Uw`W+N9vfL5{_7Lv!?oT2O0vgDR197fv!?c{rd*_wsH8q@T$dj_>BN8f7vG=N z)vwz-7}#a7NLHqRkH*2j8xROQ`cH@oafVg#J(VKdN*=D7N0vm>Wt3I`+td}j?>njsN(OQm@y{MM z3X+kITm3_y0k39hz#F369ag7icdQvXB&lgtN~`yH^%TqHiVie6L<@R15->b+$AtJQ zmz{_O?n3DMa=1gxTL9?1?jKnr%do~&wNQ!4$5~O77RW?XjTe*e{C?u64!%)>s`c7M zxCMss;}7JThSjuKdH~kQkjR=|8Ii377gSElad-VB3Mm&n_Xsl+qqctu0G`V-%f zj(vT*Cfo50IekvysH;f^8&4L;%{?2UbepQ}^6YDUmtAzG7<#9RJhsLhL?Wwl-oW;# z0{>Np)o1sYhV#|qS6N{^p>moDt9Z1wSEXScDPk(IH}wr9U3c;k z0c*1lWi0K_)M$CH;od4%qLK!jQ2d%~wjY^2H{##as{BP{)>l1?jsJ?pJ*@{_+#Yf}#g=?ou`0;{$ub2fLu5}gea+h>_lYs(bsn$y z_zCIENy|uycTfFYa_T1!@TETDghF^efzi(acWK)yJHrJts5C9lW~5SvGk6~fK}P1 zUdMswrQ)Fu=kiL9JekiB;SCD4orGKGFlRt8nAi5vU4fW~q@m>XNHlv0gNJbLpU{y3b=rkoX5L<_Xg!_N zMOLy%fryN0X*%?ti?WFA#v{D;`;KhIUJ3)agulo@8;PP|Jq=`eQuNckkQ@%CGz=xeGmHPb(C$J< zt#C+l0$OOM(Usbk%u!35sF0gw!_|rc0t!x%$W_r7_5HuRy45_^h`IgwvKb8@pHfXU zfwE2HU|c-#^Xq2;$exnsj|p!-b0W>#Z`U1I4BA7`8}IoFmX`4$)`kC9@!=!z_V#cR zP-YIQgUuKC8OAFPKmOO>w;-01x%gJNHdu>Qc(~xcQ^43rqXNIOtb!{-DL)E>gqq_I2hn8Hc#rPZ0AZAS6Frl z0QQwn^{p9PsSLB}8arir*W0=#(i1csjEv9p{64cF8@?o0LW(B+Snq{e&asleMZP5~`^U5pYGKiDr7DfLAUhF}YwM>YeknL? zal$zvIycBzXF zW*UU>XqZn%sG40YQPGhtH+%ZsA#1N-`c5{-ry7?%*j5eAiX=&+a1yl$U(3fD6Kf@D z?TYS{ZXbOZpM(6cSCnpL?(h%}+W!oqJ6|TT5#F}mY+ZRkozBr2>3ftJCu22YSb0uG zAVstjT>Xtcb`%an7Up3$L5XMY6@Fd;BJ~#e{LtGib^gGiO6jWTCi zTuqAm#QP;S(@l;5#b*rqB=mDpkFKgXAOHX71NqF&g9EkJ<{b3VeD+&_mQ-un6>8W9 z+9vM2R00{a4D9xd+J^&Jb{22*>BjO-K`>8sTtm$w3RgNrSzm%c+U!rv%-I&F=5RbJ zhd%UccaYfN8Y}Ec9!X*3vlL-W9YP;WKhAtbzPy1dtY&q{a}mwW*ShWi)AJUO^Bul1 zZGr4Cnc$v9)%Ej`S?$|`uv+oMo=t>hMr1cy?W6$=#G`Of&q%NT9RQe$pKZdatD9Pr zy;b5&djV@wFSBJmYJ&svNs;;pOO4*qV_67=lU93$Mh)Tx-RO*If2cRwiZd2$=@<5? zAnT`k{hRp})dHNPfemMKZ+zrjS)49mXSo#F24_HJO63A);8C3aY8lQieSNn>^sSp! zYnqXy`7?Kx|v~`q#iS?kGbJD>)g_Bj!{Q_m>lT zMEx|9nSdYT6th*3%S;&Q-b||Y_CxDv>Ymt%nQf!KbRG!!InRwZ!3yo(S%l{Cj1L=r5jG$C`LPI6e$;CIqXL;74 zbKnBG+arsUq`GDB1%=&j)Rdv;#D#kZTW`*6p!9_h6BKrd;Eld*tC(=0Vvk)+Z4D>g zgWR!$L-{kZUaEGd+BB;4!+QLL>ptf7L30dn5k;O}Gs|%oeKvB3MImN#5I9C92fxs| zFLQcWDmhrQco27UT7OlxhGXX292;mxId$^9*Ip3y($BIb0>^Y?L4i`B`jmUt;}Zp~ zHCt*a)fri79_ybhvx?=F`rWNL%rc4~AoiDA=ylbon^dq|?*FeACJbzSK+`dj2awQu znTxQvDwho82Fy^UhU%{TWdXAHM!)V|Vz*zgpX~*7yF6~tXE-#Uh zC{I;u40;j$$O@LC4bhX)zthS!Py$99<$_od%tjUDwcp8ZVqZ;P#pR#zp4BvmoB#a+>Ye2(;D@eoZwxCANgb|IK~q7|gi=!dXb z&KNN1L@Gd(-NPR<2X8(uL;7i2PFawb2CxXe{|2Gv1;#^5z#=8aeq^_SU(CuvLX-PihW`JMws3_Bh>Jyz(V6O@T@q$vl8DmzacK;cNG%j_ z)YZ>xSv)(}IX+>_2ix`T?DxV<&wadcgaDWMg1NboY%2_qX@G;q=v07-eyJ%xq2@s9 zWOKOI3pz2HtS_*OoOx2seRkxGNp3=U^}nzQORWhW8#dj@Sy=8TvVduku~X**7g?Qg zEk7IVjuf!jaSYkU$}x}Vk?z8N{ee7qS0^FNQn_O9BBjr=nlB)AJUYL&gSb`0aKw-` zPe5s0q696;wQ_*BCnarU|6Sm5D0nctq#%0XeP(iSybr+eP0k|e$!9;#%PahRkq|8G zt&sch%Gdx44+S=0Obknp7PT0dEt{2^BJAgOi?%?`Nw#a95s$1T3b+78A8cu6qhgX_-j=qpVRB%9pYh%G&_J+!)ivZM!fL8uWT7<1P0i? z?+j;Q0~3V^x6UA%EzC#ZMBau}HhYkv?tFZEn4Hd!k>~Mm?tBI++Eo?2c-HNIH*(Yn z;;;jj$%@0UBSv8yva)hrUzmU}QTK?+B!1L{5tOI}}c~^ix0{~$c}!%nRGRaBR2qmg-l8>;Jz(Zc1_$L{pgaU`X+pB;33hLsqK|5A}fZjGf2@IwTc?XFTa)0MKfMeD@)2_bLEm#xDjzmCL6{3~@b={pq`i(c~^h4{`}q)HsJ6GAG{3%&-8 ze3U2DV%jB>ktoi5c@n0ugLz|zumV#agIngM8J%>w2_}mx)WU>_vC5CwJ@b02A?n2A zuP(}eEAC_~KAxg%-CIqznClqj*xxb=`52}8$FsW!4_q4b+|BJf{{;czWFIXp;wmOw$UL*%j_*f`%KRi_zN?w~r#mMsY zTMDOc=z|kf1;jjUg56>Z$l0^RQhoBu*fQXVF~!9pquWFyJp) zuiA#Hj5`ru36GU}4w#3ZOpz&BTn|j`Z{U}hVuimt6ld)civWc38*(qA9wL)#ff#Uy zlK}Hf`y(5)!eH^ssGC)HNx1!YuXKr0gqtc_|1$8_B|FH020ZWRU zRyw!-b@=Hj`hB-5gTlRuBl+fn&fbf1(L3`5XK=_sn}>Z^Y--C<%u9HFeB`A% zlVy9GgQB^Rm7MSujCxdg4uq45H)1rd6nKOn?pb(gZQ9TicDAXF-sUmd*g@J8s`Xgy zK`p&|+Auu$?`7O47yrA2&wlJu*FiOTN4&2pIBgBt5Jp4`6rvhU8tgZqgsT-L=s1@o zo^{(;<*keRxU`@X*Z;Y5vn2FM0rV5$yriK=>kb>G>(S#VH0qK*}GcM~Jxy z0&<#B>q^1HYi~$Er7Guqr~OWUdDi_jtPc{qKdeM+zrEk)QTz%ag~x=p+Qn#`QHTrP?j4YpGUY zGQ~{di3n;aFyvJs<}PA?BF4PK$E3zMI*F#l@<|jhExoR&<;0!$&^guw(V@JI;;uB8ZIs)YSWNULLvM}Y*(iNA_9Ha) zi5oK?((W8Ckppd#Wv>3TrX_nJQRM3?_>;H-7 z2S@vy9(5c+-5sjUImZ$yOf#eTtb>7mLj?`s%7^y?_Ipf+Jol?F*huUu67{b$Syy#~ z(ei9-eH5+dQrzhPE% zi!5h!Wzt(6z9Qup?0)Ob7v`@rTCBhev+?>x+bU}*WeeJOd40DU4peUYH>QV&<4;|A zb`|e7{z(2{dXi>=;cVB3zoyBNp#WMZG{o4xor0%P+EjLINkXJoOCu;dSJd*i=C+pr zqNSWNjYVRNppI(cGm}D6xQDZZw?d4jEZ8za?ZP@>Li-fTFLsA_}X{>Bul^K8WU3q|Q z^{45;q|!L_^MMtkPaShW;@JouefxLU>=2JSeY;8PSr6^5R6cQZE_Tj*Q1!E?u{By+ zP=^eM=lN(!hxpghHw+sd5@MQ3`jdlcE(_d|6~Tdo~sV_O$glrNIOpxk8V<%qZq zA(>sc67~E7OwX*9sUUk$)<sP ztCE2U-zn{)H62yu;x`Y+)5x+1`89k|HBHEnu6327iG9AxehK~iRyq6?;| zsQu=B;?R8vSt;jhO-`)N2cNf>!vV?%NlJxH)`|)7zGJ(fvN;p?3-t>^a7-%DO5&w;%Nydpa$9sG*tJ{{X`*?Yf%Y9_YQ9{5k3|t1@&AqKEd-O*Bb_M80x$cBP_*Oc|%_+ z-t26m_4`vA2qiCyJC>b*CTT3SDi{m*oggk=+Es1FF_7>P3-gd3gYg+k2#r}V_Um@O z;EQFn)VDbHw@<|e4motrSrz*mgH(D4dbeT_XUSpERB2{(-pP?cP_OXcr{u{F-N}z? z%jFb)kxxWE$zSv#nX>~~xF1jCw!EMv41hEYW$!+-x!rD=zcW}3?+YYOP80*3J4xSF z0P;ND#)VV7(wbC89_`x;WGDNdlm;RzAJzl@<5##$z9BUAkBbof94yYqCk{7ptQG?J z=XyF;WT+P9k16Lmshn~%`l{IaAOk{iQHX$xNy@QTls8lzaL7iLPxtM;w9*^@@5Ve;Nu_lWnZ3xoer=nw zOcdIo+zI&^G_VHG<6xoxp2ZfPx$$r#Ozg^1kH~kJOm3{qO@oe;-N8wG+OD*p*rU~9 zgntLT$v;1zBrTEOR2Ac&GK04+tTO15&gKA`e+>Qn+X@SYV-baXxcZU}sCSJ}PyW=# z_*5B+s#1t|5`_l!a0k(dnGTR1vx%bam|#OsgV6ZF(?aTR<+U8q69Lf5s_F0mdI)Rd z=MeQDalTpp^Vc$c0i4k?1=Q!_s#w;V9vN@ra-K%BH@G8?rn(~ua)5D(P&iTo(S`z5v4ysQm&*3 zDsdVT zlR~;mJUqw8)FG|Bh1ek)pxI>a$Lo;fYFr3Nv^sNAb~J+po!r5DGne^BQvpSiHpuNg z1LZN_1Fe40Q+dl3lwQs#Gp*X>4_KZjB2>#oL(ApZ!MY|0W$N0CK*qjUXJy#n)a@(u zP(`X-H#c*FPoTojefn8PX*cg{w&n+dQJSgl@-A7jY3JOrl@d|$j(OhmBdm{wm4CWr z;;sJv4F9x_Na4KiF>-GJ^U*QJjkFcpK?<4VY+EJ=5VtrPv^3SJOX?cw)|kmK{-ZMk z*rwLt*{!g5g>e^UKX5-rP}I*2#{!;^TTVHhHSg!^gFp1cvykB@Ds_iDC8)50F8Xdw zm1BS_JM{F6O!O}U_a*!;ZS?7v)|-9QLH^>M|5^JAbqm*d_&MQh`XEbPUAO z9i>wEQOYdS4a5xmpg8oIjI!(xN5Pj^dEm3#PB5hl?cNrmmOHU30BMVDVEAO6|8N&z zI_=`CO}U0fV;xj7d3NYBV(^#e@~X8vmyIpq;7w}QrgDJi63$`D=JMsBep0i&PwytG ztmDJ&1)ZQu4g=^zgAJ+KX)(I21LkA*FoHb?Sf9HeDd|3kXQ&|jz7u7hulcu_-?#Qw zFp!}V9l20*;mq}ykkil3iP9Jfw_uq1Kz`{lj+NLxTu>0rYNeVeN83og|RE zP2xc%M%riMV#ST=WZ=%tl5Oe)LilrFjT#{vO)b8-7o+y4T z6&ZhxEcOomH`jiF-+k2E>^f6xRwYb|q;Hln+lYyC<;+T?CovKiL3>Yql6TH4eF6o< z4gWpc3-R#NrwCL%_WT@0g>JGl1;#HT5!GPhW(TeohE(nSmxlO^k@qDBd(*2!uLI<_zon{SBS-)L$WMD!58Oi1wA*Cw77b?O z=?+2Ef?i9MxE9n+62x%D60ajatonAM&NaHYX?R7CPR#ZWU9MV}PM_DR!9-dgjh-ca zyJ{nOobTMO*y$JR+Jvv1?w_mgYxBPD;gGyIEnm4mUQLDSDk@$Lie|8yTC!T z?b+F{JPK=&S_W+5Hxw-7NKXPb#2dDIYa^IthOl#;%QgoFOpVz)d-O^?joNJ@^8w3A zNKHfx!cYk_FRykoDC_plS-hGrKk(di?$GA==fp?B+CETK?4!Qo<`%^hydE~(oOrM% zRb*<~9l41sgAd*_nQq=;#*g*B2an$C|JsimpjYNvhI&MIw$Qh68S^LeT*WI@ABEWVIz!f-HfsXBvKk+GIJx(8sv8ZLctn5{QB6~S(7aB;b@vj z!N!T$K{{ucd07Hj6bk=K2H|6|9arfvumP84C*28>5zwuhB}rZqmmS5GKBvrW5z7y1 zZU61llgxK5*y(YqzB|CKS1+`?q^?IB5>}bn zVze?{S}M)Y&)1NQz;(LLFRj7X>XhMSnsCe4kbWAVB~M{<<2iayRH|(JpBGEV?)XzW zc3iSoNARdiH^n+xO<0#-xiHlQI0n0}C)1bqAR4YvO&@>znh0l}Ld88Wz4A73POV&$ zhH)KqoLB`EuzFW(O#=q;@MIGK!(Kdt3%lckl|3d95_R<^t zAr@;7-?58vSi*?jkgelXHgVVXOF~rIpl3$&m6BBFd#Gs8jo#Z#w;bZ~{O#08y7!eD z8nn#32ar?kI0|WBw*c4`$ana>4Ky4lYM(d;(PFhpB!5ujzWEGHcgWH!pj5EMCV~}N zl4p3nQqw}$l>TkEsIau$Z<70~mH@zyNs56=OqO1 zVJ03cO_#&v5Bt3a9@1dM45;+?@G{)hZ)nn#1(TpK!$~EiEkRg6;m2m)GE6bJrdlQ_ z1IZ!DnW<_NeEd*s^(G}Ynl>6AFDJ!I9C4aJY)5b>L(nz8ajk6N`|R~He=MT!+z}N= zI_Y>?3pBJJVP36rEu9=$&q}VaV4)%g^Sb%8f3mLKBU*{PKXZT|l;mpdxEyqSTEa46 zwZk^`JYL)%9ukW%Y4&M_ygclBl{)p{afb||LaZ1y^CA+=6^7#lLFBCaN@Fp@w&TDE zb|WBzx=nm4p`QJ7EjSjNXJAJ-1>4&I`3JCGz2dp+n?Tr7{2*vJrP#PyPbOZ9B-iqnGsNu-2uyg;u?P?Ott`WBXcd_qcoU<*ceA;eFbmh&d z&uB8*luY)gAE6^d=xE*DT4GTG;O_y(@wMk}-yV_W+ks&!$Oo%_Nay!^#0sVXR?|tmZpGKAx~pqDV4J7)-D!!e$It zL||sUG0S`B|M7{-dQ5bQ;hEg_td-{!&0^PMe(6e@@8{R;TR6KSkUuTGBS z+Dks!op>0!!zU=gfd&>cmHQZ!S{_v1wOr|FuOYz=+Xdc~;;=H71mXT0SDKkyF(#FX zq6tWCg+lzFDVEkEyT)uFqnOUa@jw{A8syi0UkQs0wuslkF{vyk&0KQ?;0BE4XUk0s zPgie`I=Q|NK0}`TRvLT%FqdT=A~2+MCwd?Q9f&noHN37pQO9b*OUyI#Qt+=uon?7f zlI1dK;1wD^6o!YZ#PD!ohOKNThZ8z-GJku3PYHoZqdC`*O6Ls4mQ zr|4a+2r3ck5O+dFzz1rg{ZVS#hzLP)FUnM}h|iSia;>yXsh(GwPg{VU!;Ix(t4V7Z zeTrb=$Q}cK+?}=IKcyIt>t|k&N3sSuw9?>@OYkMq9s;OJaJ@MUN2brYC@y*ChACsC z1o%{T!8rM2J6qbf74bB^Y;$;!PL&qnJcJ!BO!3g=~ccUJJgN!>cec z6h2|^y06TKVZ+_xVH+cVu-wA1 z0$%IvT>rLka}G>Pa-4`IUE1)ATvr|=^8|A5e3Mv3MII;OYHA{_Sh|-aPqo;suoP~m zE2diz{vETN8+&q^y~Oghle!tZz1>rndThOcNX!^VYwdk`4oNJ^q35RIX-4D?@Y|lj z_|8rKpNC?RZ}#*(C>*vEKBU%@NnAI`RAVUevdK2mJ4)o5B&0jU3gK6Y5l0oqR51B# zV%TeG{gcAQG$eCv<1#wqo}B@3=T1)fRl+>fiWc0!F~$eQ5#8Vbrj``DWE>efHWQ@R zx=kBrDt2SIplJ5WE=(AAVij8Upg=+&t1)^UHKIGTXbfKzpCkW|o8aGG!iblpCCko3 zv@^{1A9k;{_+?=XaEFn8)Tg<|F|3mRA?5%iT32hei2;0PEVj=?(z=pRp7gX=YaE?! z!iR+~8%JC-EN9DG1kpcT0kV4?gA-Z8&vZf7M23c9XZ#sO@JI*oVK_j{*x?_Vt&l)I zGO1|ve8UAtgeH2uGJwUxE-DBL(RR zoT_Dy-zIP7SQ*@N0|0SrB|;6j=*-sbFvlYz2&pys`N?)pbJ97Fw}1bD*^v-mP{L6d z@#N;#-&eurPW<2zu`?vr8zlAc&*qC(P)oH#KH;eo1!9%O@ZAY=hGd`uk&7$^4Z_;(W=AS|jyyjZ#a9gUA-P`#=C%HD#xUV%&F zsrN4nXm_x?#8@Y_OS_V2;(}UayDLon^v)C!_+H~28n+B<(=*4C)$bw&;v}SF9+Jp# zTzTrx)`yNg6fV6k4D6-JqpfQir<$ItvfnxHZTG4iOCszqz3*zv%BWUln#FLBf%w=Q zje@E9yltt6>YmNx6|<(^v@lYC4EwJyuJ(_at?xxNf=&tCVl`dIg>3B7WuKH=7FQ(H zL3asZz8(u~gi9?T)ey!{L!5fImOSDO@D(bWg*%91Eu)X8C(3ZCadKpdB;H+5Z_~m? zv>lnn$+9Tji>|afc~`TPk2q80!4ANFq_Ztut$J6P0oUW>d{(~p@O{$wS}4km%sHT; zW#aupKq%{V^kDiA&R~gv?gG2(KmS3`foC3&Lnho0?H#aa10 z&a2?2-aO%U9jfbIs_d*D6((hqApJ@{M+E$Q_6QeLZnLpZw${69IW4=hV9F7PlAA*u z;c#PL{8FrUb<0-5lbF%Dabvi1Kpmf&Vs!UI`nSxL>`SASQIy2M`IETyW0F`uEUpRk$eJ=@CONkJ)DwJ^5xHPR{-rF3x|hulV4 z{wI{s$LOy6a;~@}lNJ2HBHRypKzBzF%4d@E(<{cpx|`}Q$4D;Nx-&B?LO7~bU+~P? zW<16sGINcJ)odPJe9T+9X>V|;iA1Qoaw@Wo2TyW@nhjieqSH_8pnC5;N~{*!#TUX! zf~CFz!$#nwuj@9RCg@JbCGcviqOWR9=+g4=Jo$;VUtLF zO3N+N0X90Ek$C|VbHU?}&nVB~dQhfe1{+4WLaWHC`z~jAGFuQGI6J@c4dh;@7y*3+#xv=_6ou3K@PIo(J#>TG%J;26!|8gUI$pz-Bx^bk(ekW+)?m4X2Wg zG($;cO7xKPqJn|!h37MV6Rb=06ZBM`IWY9}iH+ZrPjii0)K6n?ff7e5Re_@OwP?#$ z1K}_>@ng1JU#w1+1j3BdR@ithh~w%!hy}9{l|P#wukj+zi2CPz^*`+xT;PIgS``}m za=KGNkIgcjPZehT@DH+S<4LQtJQKoqd)TvA#4^&oQE+A$vD-k zpAU2bg=Trb+HEaQ@exXgT5V^-G7wpB!K3V-!GL00R>WXtfRsH(VewH#qL}yhHD78++ExJsB)4_MHcQQ}zBT(J=8g>;EQ}4~dk0r6_Do4u^1&)+8R!F#f>Q9y zbk4-d2ob+4a}$T)fX!YS_XvQpYiap|>Gb_%>%MS(;{2%7D{2>^fIEmrk}kZBbs$-v z+om!pe8}6PgI_Tg3o9UMq&7YLEt-%@tMC#P&myWPhQcWpjt|q5i^TGrxL%>KsXT=_ z_sq7~B|um_D0R}96FxSh1KOlD$)>Qv-Xliz63ncHz-KmHD&3JlyK7h+9;Os~O8W+y z4`cB)amwsYTXi>*y&)%3+uV7Sc#rQHAYJ06v?gPaWB+m>WT^sgC2HK&Pd{`^7V!0e zo4~NFb!|mi`qq-nia)uw<`IHH7=_ApB8oW`bT1qMgRBcn9!OeX`w@M8k7CbPE_NoR zuWU_qu0!4Bb$ArAnd^!BVtBH=FtwOHd4F5o_;1M0uN|INyeE@R++7x4r$)-A#hAW(hMi2+evM7ea%lm|9rtG^gXDk5~qxx za%)8!++AcfY~jScS$GKbjF`N7$`^!`sE);18|8woOy|>DG}bl-Wc>tGQDp+zq(|x0 zu?mU9j@7C`!O0ksK`cWbDH?ALzxX)~IiVgykDuUrjJa0QIulxpc1nNyZ9;j|8{1nkQ}0@=+59hA zoA79fb~ z(s-CE35_qv%amuTYrVpJjGnkmIk&H{kl&4c5viEzoie2p0?*IUSp0jcq%@5blf6oX zsXxs&fBAM-?LBj>gIlFgL8ytAUqZ1mEW$lYa$h$tt{b zZ-n^de>N>$%@mr^QW*t`gvSxZSvp;ehPp{r3kD%Qn)hFNJS{2#vf;}}g@(SrN?`Vs zLINS(k1qcb@YXXaE!_P2)q#}n`Fp2@)1`$g=Hhcl+RKsLvJjXT1eb9 zw*wwN8v~`VDD{9M!Lcqn>c?6BZqfJ3GsyQPi=*A0bYrJV6BJtQ|?* zELj*HPKN*Zdc4#tf%!8-!A^cA(v)A5w3X={Plli?l~DZ{;`y$~0sxE7g?B%k&Rdb2 zd9qU2aEqi^F*0CYoTGXT#_wR?;t2V|lr|^YYe;@wCCY7#Q$b`dzLH&E2dsd~D}Kx3 zIr@1=K;L9aqq-sYW@xkKk=n=zM0N5vA8%r1-n8d2R}Z%1nKuRam6bi|0aZ&m&@bEZ z)A;q6_D2Her>hwR*nf-!-yozL=0-9{n6xB`dmQ}sMy@Z1{uHEJij`Yx{;CU^(^^X! zsc{SfpvvMzB7MeKp)dUW%0pD>2aU)_{KdKDQbhfp(oL`DjpP0CWo` zTaeOT`N5h3&ugifR{X+9Mal}S_8>uLP!Mmmqlg%0mq)V$O_zhykOblp1a>xVJ6-e* zPW3xMyCc-Heie6v8Z7?%*SRc!P8+})kqfB}nZPug>IMjtAY#0sv)hh&okWcUC}9A0 zbnir12fK0{bff@){UoNH7yB2!iA<@Ch z&=k5e0gzBA43%LKI?92_qk)GTyp;fw46&ZbG8y!`*@g#V^H>L9i`qimS<$JFtMwqT zBM4!U?_4cEWleyYD?G9k5WnOd#8nZ+$)pBRP9U3la2|?o7s}>g74r@@C6kg?> z90%CVFd$Qq6x=o#k=WZDQ@7mG{c8^95@>AAk@Ts36m3-Cd;uQ6?8wytJs*0x&s9)pF-A=e^eRe^=f zyBFT-sbHrBkH^Fo$;vT1(|k#atoMT8c2YylRL0_Y?Rb{`-`i8rT+1CeB(t>?y9Ymg zdysM_#lJn^4iFTs6o8=oTOv|Hap^W4D>s#ONhXD{N<=#em@H$VkNIh8((_m2=)5XX z34*+7=ed~WL4-4_43Cy)XF#&K#scx!=pe`y zn_v;_;NE9@ThVZsuMxH2!zCNA?hzW@r}q>yE}%r2S8}z7-BueYo5{|Xb^ov0rLlv% zO9JKuk9S1_Ytbh?!ZHckuJjsd!{DUeL3+LUAb27_!xbVzeEwwl_vB17y514SG#=5|nulaX|Sa&SHkNf}aM(QB+t;=koYw{I>8Gf*O_MCBX zY~kdcT02;+uZ0NvjOpY%E5#2zBH_Zz_J`Jbcbk`$2M(dk@I3~B@cP;OpBJkMpY=K? zsJ;L12TL~~2$ox}bO$xI@t47}CIkI}y^QmtI?0=Ysn21y1)Yr&D1ND@J2VIfTcU?Q2 zxjLoR3c7=9A@?Ehh_iGMKpzL{OIZO{X`Wi%$dde~kbQ}xTqZDAfeI;0)2uZlD;%}+ zb=s2jzCl_WC;lZa0RRhA_25foEARscFoYBC7;m02^IrEum8J7UoCJaATy-e*(6qXo>+7GMg06^b21jfF@OL6o(ZAh573NnRV@k%0xL#}il^4HUNKxpfAqGJ z9wf6q+y4l#Ac%Z$zaphP?$h-Se}V%DE*GxuPVE*mR2K;g?I22@$!7|w`ErL2J;Jpu ztfILOKJ0|oojL`AESSH)-s}loeXBNI@12;exvwsU{k0)g$m~J&adu4!E5XRiF+abk zhsqVLvrV1&^{;o=<6hStgY;_v$fb-5_4lqS3J0EHPw!Z$@nU42=-2;DDV}b2_h;?l zN&8y_We4oOV!H@9=3t@?)k7-&hXI8f z5P}2a-R|0il!Q)N?_UXud;Ej|Xa&Gz6(=Dt7)SJ$KPcyX6#X9H?1jLvfc&biD?oGw z!Sv(Xh9V#sN1Pax8SGj4*7{om&lcDb*fi_KWjqeLZzdwJd1L@7xWLw*wXg~MXO2Qt zZV4x7Rev%&4mLV^e}C@Rd1aX^(wKbFt8l#jAK`x~?tt3Wg-(Q#caV{dPP6Noay z40Jajuy*SMg?!`@QTMTq`xjR?j7BZ835sxx>r~C!VMb#>1ojrRuEwv@(}lSj1V6wa zkIFer3Gyj;q#fksHmcAafGp88{8r<8mm%pJbb+7dtp|h->|joh9YmQ1RS3OoTd&B{EHpp5k7zvDz(T82GDpnhOk?FkBfH;@ zg2PHm)3TIeUmD)-dOP?Mn+|xdVuyV#3X>|;(Vpi_ z>J%Y2`KlGMP{!`WIlf2#>%q|V!)0NTZY_O{ce}|OyDXD_>960FR2`K> zD%TbVnib3uXqTUi*cu-mDRkNnhN5dVcGJ+p6e`K;K~7#ZlzEbxMsSo`9TPH;gPoA! zF&3m=^DkeEh$>l@5>yo%P4J6mPSpv$S!%Hx|Ji6HQfoQYr^NG%eE7+EcV z=EHnY@T9s0vuSCSb8knxfovjj;()2Xi(Y<^*t&=fz3_l+%|eb~B&%^AI%-Q}DD)N_ zKjytXuA0$&Q1mUQ(Yg&t(~>O+(P=bsH%TG8Hy?b+M!DopBqxXf*xu0z*7 zVS$aNqEX*-`{z`~9g3R?(I7b3O4ZIhF=kNnn-?`xR-S4hGpJSn(j_6o-(%3+;dF|K zvnj#2-{v1JR*WxHkGSyIYwQ*B+`EUHH>K`@B`3pXy1lIHAYfml|1v@);#%_RR;Z8b z0cG29@kx0b1Yfq8e0kd+g_1cAcQNG|y@S5lSu%S1LO4j1Uo+!hJnvjo+8z3IROsa8 zRGI@Z-vzI&LqzEZyxZ}Jk@DP z*X`T+2iXej_#7`%q1nz>AJy;X72r7YNJV`9u{~gS+~O0f$Hte>-=eXR%(wenA^m}Z zIzz#<$wlSiFrJUAuK^MTdpugx)zCenjb=` zNLu5s&VL%{NAKO5L0aX2cAqv}aIChfSKcTh|4;9y(fETaUuEF#qZvD}ytzq^ z*8q=e7Bg95tR}0BcP`d1X=h*lvRF|KgWXYr>A!{;&v?(oiZ?y7S?_@*R#ktgf$%<3 z!oX}xpAM7c;C6zbJV74Y^~yWa3g*c^<2K z?|MXHMSX#XyqtT%#w#wXS$UWJ5?Q|KF)+i2!8Eo^TFP-7RYom@^Mvz+^Mvz+^Mvz+ z^Mvz+^Mv~ziYO~eJIV}_S*?JBB;Xs}&VM~`NowagH&n8YdK`C3&vnzllRjptlzu$N z&&NH)oyF0Z^9{);Uc>pQGQ#cRI{eqw=0pwqH71u4UmMESkr4tB65%wc9lOcFxgzck zvUG2ftyGIOxr{9yXaPua4{3v1KXb61-eRynEFH}855zkUIimy`jtB-7*<^Z{uj)$i zA-fI?I-;z3q#}e4($3bwJ(i!*W7UO#%DE2jHG^b@+%#_d&8{U03Yotd9h-CE?VxZ{ zXp@6>Oo3T)JP3j8iGg!;wEIlq>nO}qvqHa8P(%q)bJuP5^0bc0n;^#FHGM6A2Xr># z)hB1APUP0j$y*;I0vQppk-5Jd>%;%2@6RxBFIy85PH?SrHL81rtN~%AwUCB4u#6qy z^Bb?EGX9;VT{q~xyw9ti>?0B>ie<-za@@X8YvojdUC4F(4k+7N=qK4f`%GG8!)(^0 zvpw+2ZkdV+`%7x|r|)wQyN?H!VC0n^b?~?WRHxm9FjTg*uHT2mpFIx)+%0G6_7EHv z%xzUXg=`_ILpcP~A1FIjNHOzB7`xs`R0x?_S*H;9Hul+|-4`UPmQ{6JK+9OS!gj}t zbD(&GN091fb%X(RHbKErx6)xbB$MBREB~50r5q?crG#GF>-X$-V5EQA94UO& zJCv&v@H!Mn_aeY_OOU|Ma^v)@Q1a`b-~uLR#G83qlvTjpMsdScqeCT0asM1D!&^To z1W%%dy4)qYB*Q3UKwWkT)DqH>C4&()AwZPxSd9Zz5qOd@cV;T${=Qa>0dgV>)qBk)?xESdW1^f1^mAnk-3 zrAMRn`Hv5Dpk6&0iU@=3>^EGYQF5aa&HuPCu|{uIKTdC3l}C@4nab6HCtsi@ycUg) z#6a@gM>vH}4YAh%w=_TJBesU(jV@k6Nx>}{jkxG=;LQD3(hAK-8?_f%C!2%up|?3x zsizVq)b#7-IQ54iH`uWE12Vw>friA#O6gq0s=!G00lFTB2Ey&|q-F&( zn}%nJdJ-jM+{hXO-0={%?FuED0mMp<0jx7uIs7Dqr`JL*E{y2Fo%6&dbsX9x24ScX zF~hEN8_k+C8gLQ{hHD;MF;agXprn(3>!7a`S-7tyCt!0D?C7|_G4&6Q_(5lk&-6*L zYD(@MtY?UW@QlqbThTEGg$3Iw+=|@(v zP$(e3O$=VVl6;cu`0N+yuW#w~z~DJz*)3+@;TBCY9jI*7OU3tTC_DqR#uiDEe~*ZW zGu*B_wA>U3!#!6i=y)ux-*JjQWKPz{PgcMIFf5dWpDRlW=>C3d@iC2wW9r@@^IT5g znnvsLvipZ!Gdrrysopi+md`HSnuNgg2ZgRCKRUhS7N|Okkgd`2lMIzyOFH)y#BDPG zXM>Dbsjc4rjuGfQK>cljjInKB7?RkVqqBu6w2+Q0pDmEDL@>K(E>g3=z14)BiBP7W zhX@{6#Ww2|{Ot`s*#KdqiBz9M!8lI>Sb?V}-Ep4@vyPR6p#w-*))pOEep9rp^+;%4 z9pVf?trI@5_|OibJC6uUjR7e^q!#|I?$-c6=_SApNbt`nHU1|VzE#cx6<%g8wSkrR zS76GZqC?YXX=wqj>~pl$qzhUtB3g<_{YA>qQCt`Y?w?=?YKM-J#@Qy}gXDq9(mXl4 zW2Gi$4`@^Qg45v?e)qT4Ncx&+A8BZ^}U#j#Mc{Yi35$JAfnMMnM3iF+J zHN_ZNw*Hh7t;uGD6Eb6$<@)i>4GeN5d_X?D%R_(osj3GrHja{G#9kB`n&GW!JOP5w zGP^Y-kng2J;HeoB4ubP>Y%ljg0vOPu?tc>#5lL9gmbb!!n@!dP7&=-eA5)9_={2P&r}ucDHMqieG%m@NpZHH+T7-la&W-TMYB4ZL$;t1t ztI~_R_WMzqr#u#nTRE`Ju8>s{I-A$;kR5}h)u#v4*SiIJ{;>;`?oiw(nNx9Jut8c0 zbN=GpRH>0%0?3tcVw=0$q{zZx8#xRKl?#Up-jx|#FDKluXcgg&(2UnoI{2xk z)VFZ>Y3*d>-PsD$3?Hun4N>NBCV@>5)}l{}+)gFCZg(omE|1!6?h$Rro+Cgs+!Y|q=ZR>1sz;W!G#p5}mT*|e7%X<`)lHgAqXVCVYs%U-CX@(0(+cO$;%U%0i= z5=uS@@+P9xFHHN`c(H4O=6iQAlw0Swyz!XnYJHOp>BRRE;hd0jx6+dP~mCEF5V8@!!SOWVgdczU<=fAdWJjsL> zTFee$8|h9V3}{$tTBhy1g>{$vI&C^+miN;<1Iwaz>HnfPY^-G|MvZTvbD(L=)j-} z91g;ZW*vu-xGp!h$JC64NC(f36dC$Ja;#YW?pe1GKgZ9%HYD0tj4$sNJD|u`gInu1j)P>NzC6M zZe`HJK~$Ye(cJA_Oh!3Q9JzJyw`%PFAj$ofx}YIaaLIIU3mhu3>zxmgy$w9SSr2VA z4Hy1ijx?D!rFs7iTVUDw+8Z68n6~=mm`I5OL2)O@cV$yJ)i7`i22#i{{agM9a)cHal_aUdR@l?b;9@^Z zH2QB*FVG8%eBpDM7fyZ6mRywOuYXDFF=mTBES_bDDdSN9<5qaz~RZu<9HShl(*{y_w03Q`x7s;0gA*Fqrr2*u%yAPF?*9SUFwp@ zGdX%%sWSRwHhNZ56r>lp`PUNk_hl`n-_N9-Rw<|efqi6YHU@kT$;l%(?kb-E{F^CSS`yrh>i*9%gwtp*v+S_gDQVL5ghpa5u`2RS?(PJR zW16*^-G2-7URXS*JOs$%E8kzKvC$?Hie+ll@YMqFIScA_w{NVd@^jU4ZRrGTGg*Dq zdML3o&~S}7=DN-~Ddg2wG zO~EBeY04=T-9Bc%@w$-^8k0ehEvXQN4{D) z2HrQ^sBs?^qvT=X(l)GKnm4^=1`_LAOUgN4k(E(3cFQp?JnJEFc|Q=<`pNZsq}BM9 zxNNcR{6A~oYj*!i*h5kM5jXp614Ggxd~#`ozAlDroYIn81S1wWVCTuNrFawQ1;Tj8 zhLQWYlIyZ*?)ir?JmgFT@9iUrdnvqsl-l*#wnMX@KRK-uJiDVy;ekywCO-uxPmaRH zeBx_kS30;(lsy&MyldgF*;JNPWT4_u_$gn@r{`Wus5-kPJL%~Azh^_T zzd%87L=nmD9sj#ZPltd2C&~3u>2tYQIG)U{5|bbPU;F(o#)XkB4U-aa$Uq ziRH7h;@7S~bhLvc5$i^qr%e#WtghF)5C4+Q0e?irL)JHhBQjW2yF8caFr3x&dEk@0 zx@Dr$wPpa)tpa-PilfKd7xd2A8#KQLa~|Ijnf&F3lvr3K`9 z60R8-rdOGm_mGcg@!$83g6vJJ>FSNS_lDRjg16Dxy5RJCuZCNT?&4j^-8AML@R34; zbq=^z-p}j~KCKa|MV`p$ya#L*PRLH(es9hL%7v&ro_kli{_zE0M)AFN;tll>HLfp- z_uP^e_>4TTtZC{%75##i_}pf^(o-6JB4p0eGUl%3L<)8VNr~9dEvb6bMgH zJ9%Eww2NtBZkD?u`zk*S`X!bn;4}W&2%&@HXFC|zkmtA zFIA`=*6wK^9l~J4XBWY%U`GM9|H%#(qQJYpas>>iPgqMQgT3Url1y>V5#Z|Rf_aY|a^t=Oz*jyXWv=?oG*`UuzDeEK0EZ8Fje+y*EUoN3og1S#I|Vo$jX2foqHg z07K^lW>UgHD&c4mXrg^*-Q0Pe*2Mo=k$a#fmEZ%00yU$0+iH0==rK<<*HpvD{DTaL#y6yiwJT_LAn@3(*={~7{79*$T z{cwOrWR~EmWb?Oa8c~m$l7r_|K*LoaSYrda?&|rD^)Nxl&gyG%#}%#|gQk!0dFEj zm(moNj5wC??;%GJxC@ai+XFj^rK1PN?dkxLBnt) z#;+6zh>eYIV2_2HW?WK z+IMv;aLfx~>9aNgulPku_Zlx@EmcN5j$u|~nDR}p2z_*1D6!?!2$A=2gQg6#VyL8! z6dGpLhW5?&@uLATh|m}$tflMfB}7tQlpcAbQ`mPG#r<_+ES#f+U}b0*NXt>4(TZQHh!j%`~V+qOHlZQHhOJL%~3zPnD<{dlU@FPL+U zr8(DlGJZuA|J@DmWM=HWbH!8~KZuXMrcT6Z^iC?pupXOKr5(YZY{yZi^8Ee&q2Tb( z$ZKvmG=;Wttg84A8g)tYh`n7`@McfJLzh!#!37Z{a(E^qf+DqW2i){jm_DE0)KVib zpl1NE1au&ICQ}Ljmcf+D~y z?T3YV%N9$7+1UlUF@w=(BI(QE^mj!l?WzA;Bx3CN%zH)N2zND<2O6k|vk!eQER5as zwK_i!#NhdXD-#}kMN0VV#3?`?Yig(N}+zxw9S zErAJH>mGxjem1SJ%17VG1$;N%>0DaPZ9%pQ)D4~#g^uf*=y`m)uowPp3>)S`Qr~H6 z1H^dHIS{Xc0?IY(ovSW#CMd|fKxVyihm2Gwli^cXCRBR0%;SX%tU zBZWhOvm-vvW(SLE@SgDsc7a(enzQU1#=J)+2xY{1-?~1+oO}iskDTf5QJT5%OZZ6W zC7X0gc%Cw-q>e~()?qlN^XaU)1oQqmOMvt#>*bK=I-^im+_(K|hPZ7hDe73}(!|v5 zp18(sp&REIC{@bO-BZzzE05)~{2>oWy-F<&tt?bGrhS$YwEzsbKDr z13vIITc-Q>)dQo{G}l%l8+)^bqVu?@1nZt`s~UixYtPV#=b8k5Zpgupce}^1`t@&# z0!0sDLarr5CTbJ@V%}q;a+efp^bEP>hpTzN8N`*~MOXG>7&XD2CHt)Wk%lfOraw~C z7i;jjOf!)@&Gn*>CH()0Obc5ASgXlP%Pr+PFFL^#LRTJ@QSdi2)6jM1SXbOiQ#Jx;2P=B%Xt!k`xLiX<7k98qz z*qwEU-Me7_kV7@Uq6}h?Q=sMIl3eb_VRqW?@3t>qQHq^dshdypMWTadUa$C669gp| zaXYmU#Y{C>BH`cwh>NcVy-@|zPy%Bgo6E+by8VYtBM`m2V}wP#)Xz}FQ+#nH>v4ze zlS1>+L8Q8uc=1YSepQL19wuF2r!zs%8L{uj&SC=l91ojyl#`It`$BRxzqhuoeqqP_ z@sBN2tF-gu|KVCx8CE>)g8BAuhbOue-olbD?|SjqEscqag!wK-J3>p$Q?|xvxsW~xCM3r3wD)&`A5N0&;|ZK2!E7F*3U|7`7(NGzvYM29;@Dk{R8?#G6uu;ATr| zVq@3Xo5R_+IQT$mivGfONYiCFJvdc1GPWYVY zWt)_p$5GxpYu3U@zNNjSV60*>?wum|#8m-aalFNo2QRh1Srj6%cDt0v85!lYdF;pOkAFTO zA!);V$gDpD+ng)!fgU-E-fOMS9;BQ;Vn**;E<|dNx;ZXazutA4jh z9I7*CBrO!N&3`J$F&oTFK*&EZZSZ?>$?b7qPg>x_OXm=io(Nlqe61ErX3gk5q4R?# zs`$CZS~jCA_|?$jT}s!@iM0#BmhK&05zP%2)irgn|J}X=s zVn#dutu7W#^y;am6K?w-<0L1J!B6btl> z7~z2^j4Ol)&qu_Pv~M;@h*c?fQ0N6)z2u<|a-dQq1E2ys?PdWNR-Z%XZmzW4DFu8N^U$?N&x^rQmMJuhw26lkIH|i19iq`{Br2#B->{Co4iY+A* z4WewWbW@Qzy5wIJT{Y1$@yGi)ywD%rxPu8ZLRR;}wlE`$1&c7Yc^GcC?Z!2@xPbb3 zrT|7V2K|SFP2=L@$t{*F-$NWJq?qsx=?-4)&!HC=yp*p?k3C#MC+UA}N<2mW@eIQo z_r<2IDa`xLplp+VYqX5pYr!+UJzL3uMfU<;-GKdd5u2-VZHS} zJfe_p;pG-Mr6ytXg=KDP0RQn@Cx??z%Z!Byew0b>ptP#c;a^^pE{d z$D@&XaqJeGa*nW)S0G9}?Q}~D89x0>RoKE4h(RRp)gTRc4nQPTkcc zV8q;vbojLHap0IuQrco#PS)J<;smzM7tP-LoCvw(2;)q|Q+xt6)n<#EMsP3s<(6Q> zWqckgJ3$TYAr!-r9Js&vKjNM{_5MvSqG~daurCB9Ltp!s;5VNsI{4Ni9qt%rx(3M` z3J@e8(Mm;Wja0O{nYAmXu(D>SvTZ>)M$#Jyq60WGi~W?u_E8SG*i8bbaEo&~>NVqq z(KOCI=`I~of`ng>FKKXuDel+62@#6I9jpv^+=<|PeV6gun$I6Vbb-fFe}Gs#^$#zu z+)g z$%eHCnoPVr`UAZVn!F%-C6m27IiM|d&?l4jTiWHFGnn~6ob-;S&ui87lBSa+j3~hZ zrhkcnR!zTb@di?O_UiQPoU!?-&*+Zx$nI6o`NJdDh8NTx%cwQ36IkXTOehl^a zXGefhIVpOMK7TnGh*D;i@A4>|ujz;*6FR77ZwMMKbXQHV_Q`UXQUz)8_QqKnFp(@rnxl+9A+$*xtB{cSdaJC#7bGsHeYAS5))e1QF|vVfJ_iy zwI<$Y6`q>nwW;;&z^Ndu(vF*czpIGeJkH_?xh$~_+-e7Y*CqtBs?n-p1kPD!*0Uz8 zj2*^NNC1KGD>)K6Nj`uYzcR%IiHNRy1r z6SBP)#%hja@kNHQk0ylaoKQbW@<}6(__Wa&P<#y@Q-)~IXr7_TdriFa2i%*9CvfPR zMX+*yCEmr&{q5{3`sWe}!TxSMp`>o(vX-Z2|CNhv4_4j3xc&5s!IQ&ceA3I0{{Y_4 z4zexA2@Nu-qY809sg?aYzoZWFc*USMIRwNfAuGXH70MAd{*B={0s$MHiNJ>kOB1)Q zq}MVUKFfn0{sP38WVgMGjaZvyd#gEpcGM@;^Nei`(DI}jWZA<@q?Q|M;!i3gKI|3@FVFFaS(IBCw`u(aZgs|#rAc3B;(1Zl0`q6Q z5c742iRmt48=(}wXjA$=;L^0~SZqx?&A~j?xTI9aPI*xztAP}YVBcz>^W8UDI7+WD zO3%%tXtBykl!$UEiw@c0HXpY~X9?9n_D&$*kADY}t;0ci3YUh09oJ)x;B#z^V=-vt zvK5$!NIh5m(p!E^mE7-kdG9+sSCFa*G4FCfmw?Zy{90nVMQ2Kj>{k~9;kOp1@NWN4 zumEXWNI3SSOh__q?W;`{Xy0!vAuK*f*ESBPyRVH0;wS1C;^6^JP{enQ$YyVq7rn}x z(jhmwFp8filt0~UkVxlOwQ4AGm?w5a@{)s4xpaK!}@8v;`<`K2(li|1!Nn z>EfKuoCv72h?Lw#NFzi+Z`+VEV7RBCmUrhIsnPb=g5=wede4F8@c6&WyD3=hC|dCF zsnwW5^13EufdbTpQR)tGdpRj1Y9vD&lMg99E1CSs9e=gWn~Py9_WKaD9arpS71I(p z5BEZSR0s|sT3s|o z-e2=G#C|fEC|EJy*l-4Y=48DBoKK&rS^rc%NH%7K7e*DUlVbKi;y0ZC$d2Y4hElbz zS6|~49!S$24mw{{;OpP8vQ|wD_}11-3EFA8K2Pum%v@e7CGRt7MkvE$RD{kL2|<8N zcQ9t7nDEfDKVV)32GDL&+6n~xt2)Ih@6*$_KjpMw1Wj8H?a5mXCU>VGIM+k2jA|(; z2J2CBOEXc`k0aFAf+~otfYOD~mH*~@Ivhz>Cp#vP`v+(pQExXyeA@35JbZRP6^*yp zH(M`3k1wg+Fw67<#|kB8FOx zm6x1}x^zRKgW|+2AXZmZIxX}P{Ak>8ankpTInlWzU_m7Mb9*)R*x`1y1nG@H&!dwh zSzq_+ZE;YkzblgFq|jXr%VE!`Cx7yBQRHrgE|oSdC~q-q+UG-www(HDb5m zK9=~g9OB0F%;+N0RS3N$d?&yhw2(L?#Gj9a!56*D&OaFS8%NT4ciwa1m`bAHITc%ro=sePd{oyRA987`4rob z1f3&+mx0)+Qj8bWyO^48EWzkSikLG$898GaF=z0BZM$gmOg3CjW~#P~%|-o@eKOeG z5^agmCuRmGI&?#naIjHT#1P>4e>!>E;Zxn*jQU^@tkZ0x>!Gr0R>$VoR?q`NMt~}V zJSt5Y1V<1$m20rY!R1BV_+i#y)%^$fwcqsm_kQzB3j}67rNOH~46@LpxYu43E=USu zA&9uM{b6aDK__r~lYGy$FBAQ!K!w0+{X{KsrX}8mCgx1zIDz$M{^9p$sNO8dl;2;i zAGh!)f=+=e2^|(nL^Khlf&`LXgKIWw5~~KNO*G;P=D&SO9cqc_7;Y)_ax+_x#Nx}B zx(iA%4(Wv&@hPhQsU}J{b2#XaCB1>}d16C|>d9 zY92cK3~V~Ocz*S$pypX3MRpV@U!H&@6a$-lSvW4M;KpWGyR@jgwq-5OxNyOT=oxoH z>f%aV5#bWqghIQB*`!rvKw%xql)3~Js+Dn=u7<85gG;cG_Um%C$u$Y}7lT#^9$9o4 zHR!}-RwOEriKPW0*RAr`v9l1HN%0fU#CY`0mNZsy>`*|8hLWN6cu|{eiWv_fbXiir z&vRx;A`5V6Vfv#85<5WB8Kn6TS-}M#$h^QEWeq-vSjy6n2@-&WQj!=Hb*BDw-YxTq zPK8|GKi|q)qRe&4&MQ*07peLTApQsbMlOFLX%+~sfrp_DhLW@7qjdTWNyjG>f2)>P zvcmT-)MTl#BeI0boK@v5mYJYYVtpFou2DBjk95PiyO_O1{~jcqa@dnJD$Apr!_-Su zaI_*U-p_h24At5UrsnC{9r88B8W3qU!JAJGa7yh?1@Rcdg=plkZqP3hO@0ZvYY^XA z5_ug5XE?FRrmMMRVkC)BDnr)%nFY&%31~`%8&ox|w1-1%d8oLSwHaeQs5N3vYg^(qbulu6gz7uT|#N9S9J!81QnGiqm) z5guFo3V7DOxPz8Y%fKhgGOb-93U&3gt>ew_nBM9hlH8s8aHyxKW5}2>1sAhI!-_S? zR7d>4kAbr4>~>mlAFZLN_YL`tdp!tS8(XgWUTsz1h^lPtrnZiPqo-%}P#S9i>@}W# zsEH{QkT`~dv~TQqKQw<3qE%CdtlqPtz#66eazAbjC@CQxv6h*nPFDudHZ>ta<@~ca zFI&HCUBwHA{P^mQV@O)9+n_L#4J?B;6f|pzdOB!I^1(P;8{L3q9v>Vx*9h+cd?m+)uIdD>D0{Cc##{656Um)%Y$7^jj^=FHMB>@x0HY zM~8q?&D%VujX#F}>R~+osR{QJ>rr3DZ8Dm;t5k<_Gj4@+>tC$V65~fikrhn@p@-+} zA+=WM=>SsYB=C5^I?ELw#F^Ld1lJeqfiH&&cDf>w8mBo;L?BvzrZ*F^utI z_k+pwlB7j`PBY=CtWw6mjlPdU9wIu-<;<#zlbQYwo8~MWeGR;pRxB{uDtVe?888>9 zo)2KHC9N+=qxF;oTbRm{uUFQqiE7?ae~TtcN`6~C{_+f4uh!;*SAihe9b>CdmNg9V z-424cyGeo-fjU;$r@LNq&89(JN)^T|As!YQ7sNJ8jR1guUi;yw5f_vDcqAR#=70Hr z3>unxSzJx>V~rGf;ciie1pw!eD(aG}^3w&^XYXYJA09^M){%wOUV?yEIt>APACbXB zf4DXPiUIz}byCJXU03m0f>OMuPqc?%(EBG&9AUWZVE#j3Q1s{;z?<5j-$UO;kZ9qc zt&v(NJ3*2QeNA_4WzM9(I=n91!U9MCO@C^ja){|4peo2UkRGHh9v;p7J^=If)Eg}! z0ObFl_Xw7PM9|64nbCtXNP?%Xu0B)KMw94`LV2+1!kAD+hA`Y9@Sp#%s=n3tkYW@v zy-*SKH5+q3Zs1l@8I2rQ9ija4Y}1ZGFN>BmlC~sHas+bDcjG=1#WA3+frID*HIok< z#-bSGb|bOoBCNss`5W>F^(qWf=CYYn+~sx}zhq-`9)98bdiKb->CpnVHTGFikuk}d z6gM=&fAz6ChcW`9Li5u6K`(M2-@t3GB-yzlEWJtKTfVk_AOwIkp9Xf5znoJQmF<4k z^VC-W?B}6~@!d}<(R28e2&+Oqm@e5|b6`OFO+;;X?0s9mp+)$TFBY2vSn}=xNyC5} zchlaCx;OFY`g}LYiJU9FfNY>JiQhCcbrQKl9V)lAJHJ8aTviNVd-Eg2Au#acz|hGz zdeQV+ef^hd@8bTm%tWRRiX$r)Q0J|W(dS!2S<~NPa|TQ1;<$iJB;5<3?D3#$Ke4XM zz2j#Bi^YgMP!35i6G)#Q2lfB9ftK~Iw(K*kFkB(M zX4=0u7liYYzHpmY+;#{UpcIPd#}!;Vs5(Dtz;;702g`2rh&e1HJ=8|MNB=Wkw+! zKcg8K@e#N&bs;lFZ#`9I4c1+6|ZffST_`lc4TOA}kuG$br@4;hCbuz{e8 zd!YQZ8;%MXVg7o9`Je6lLZhtBfmIF#V$q_m{19ycX)4cAGCLt#Ns46d)&1Hzcm`nE z8K|D(7q7HpqYst+_aENS`U*_F7vp58P*` zSpcIVV9vyUeLl**cuh*wbXFA;jjl8Ao5m~M_R|=8{aP&UZeCLVu(Wj`^--0Qftl*l z$-N@_^Az1gbFOsy^2^xaQpG57RKl1zd<>ZwG&oRlGSbw95qO2X+#0au{O)Ts%Vh?_ z62O`rvfJI<#2KVir1L_{z8<@hZGww*)+(s#Kt@EO6tAl$npjawL7*o|j^VnQeZ|Q7I_+#f(TM>*>E4L-;>u zEcv+rI+G~KRY_tdB%G|8jp0jA1KzRuzrY%8} z9@p*;(SU(*@W-A^pd_>9cWrr4Lp<2H!XvHZ;4b2SO>(&!w*ljOAOS3M#UbPr^?`|Q z5Sd2Ytd{+uZ4OFMIN|)osIjW>iSDGsA>D&}@YJHB%BhlMP|QM!W(Om~7u!F;XvitG z;OxO9)F|6rwdNnWrOZ;(|5k<+Z=55>IwWkx5G5e8?ZcgXtH$s2gZ zKzav5({lU`qblSjOv=<{)8$!~g$?u4jVK~+vm?U$jmaq6rN0eVZ|bhxZ1)z%>xnVS zw?)*5_XAaFC^TaOT%l=I3Q|Y>;>o|TcyqWpxT%;*{dvZ1tNQZFCR;+!VH5u zr!x)PSoCTnKt!b|M&xeCdmcOG;)uX{@g&+JrDr4p(*M|fF8JV(?IUQs%o44dO6u{i@h+-lCX*jWRQlHsT*Vo@P=KkU~9|4uZ3r*<`Fi^ z`f(qg@Y{QkxV$cSo*W;tfWaETt3NOkW!kEFY_b{iXUR#lhMA&kunKII82RRZBTIRX$ZVkyV zgf?n4QK#kG^K;WN0=~+XVqVn596uxqg#;|gscKWnLJ0!{Q`ZJY#i`CAa#%{r!^&Q6 zs=MTBNxLaO_Mwj2OI!MPR###PPR*GK6-E$qD}bhuHKW#l>JAUzaHXb%{6;yeCVtl= zE7Ccm)W zXXi2w$R#vx&Qq$Jb zFW^-M{;)WNBz_Nu4dRZtVLBKbWDJe;kG7c<$6;iGblLgkhQR&ZT3A_q?GdK0*$>h` z3pstz&?Fo~qx;93dEBxT)aaV7sP1Yj0<(LY3esTuAqQbMdKXqRqwaCrfen}OD9j1k z`=-n^$Hr;Afxp^$4c$%dG}oBKgY5H6K6w5HF0^`XK^oc%T1v&j7t|S=ME;OX!E^@L zE*S3ItULbiJ+Z<%TLgjut;U71aYWsQ-7AY*+Lb_%RY)z5fE%46X+4j1w=S!CgL*eq zPeqmIFN`SxW@Npr{w76?@H0k(mLwNG%bCTT92s+bN^*U4CDR&?;Si_GNDo zwtE>1J|8!Lw#dxlf^Rvj)k#{#l6pCK;u*Dth*wmcF@8}BOYMef3U~#MunuXfN5sO9 zy-;15pm?0j64+#cSpkj=3d?kb&qJ!88jUsEzz$5&VbY(2U_MSMM=JIsOE!54Gi7`R zwj|7y69rD)SO!Rl-Gef?7^w=-IPcZ=OvPrDsK23x8DUD~#AV6Y%@Zr~;mqqV`2urC zJ%!REP*IqbR+goOz8bTG8lrYEC$6dE&{Nuyd4%vU%Bq?119H4;)90$PGjE^{lEg!K zXT1k}-bc_pJwEoUzs(lfs=K~COCH5|9;#(QU^Cp$#XKdMgRLfP8j0C#Q`47uJ*RIY zN)kcGxM;yvACJrIdH+b{JAAXFTeBxqUKTzL;u_( zQ8Dor=Ejm@{rmVN7O^*Q{~~#suPJ_UAb!S6E;?xLGu#(g3bX?xb*W*-2-EWHBTFV>s)%*96FCY)RVD@A&J1lI56TK63@kIX zu-C23cbtKq`J1K_<64Mc99MT+C$T=1c(PQ?hBH`nm5-&IPhec+GxHI@dX{x3j>R!WvH|q08rCTM8 zCuhI2Xf*_9j2|sZY#RKCkVx+l=%Rk199SoBBnf|`6(0nPJ8GaTJVviff^Do=%JwLN z`%)#CpG?3_%{Jc}csl;|+phjKkr%i`ft$K$gK?D!nFmvz#1u#vp(W~T3mOFGLq)H3 z&=A#o!xXT=hJ<+fO>9)rJ8_PtA*7^Px{G>(5y>*Qc)?p-HO2oB8>DGtG3;fE;@DL`0G+Nb*`8Wv+%-;isLkiWZt?J9WQPNXaHpY75|5x=>>z-~2#AAGy+ z@8gCnd};<1cZVV)Xm5CN&=(-kJ~~l@#-0=`%8Sq_(&wU0S2rls1^w9Po3&lpV9x|l z1BfE^zXma@AP+{nq34hyf)~Yo+GE_r70;9z2PwD#OKBQ|qF}#4D+FLOCvWw6*>}-~ zs9?Wv#;oJY8+C)LG1B`Keg)mInq!W53{|~v9|poh+!m~;Re(r-j5i}UI(9I&VIYB# zg-DQ*yf@`kgAFHAY+e^kfM$PFHVnnY(@2kUjY-ElLf-!sMs$K08Q8si;KI>V_TYp{ zLD_=)t+P=m2hUJ!e(v6r_h&7+?k!<#-BH~@Zl*1CYnR&$Ny~Jc z7#-36{Yb)?j0D!ox!XCtk0f_~cs`y&EE7?aQVmZW|I&mvGIornODnnLOZWQQSJ@A| zmzyO0vjDsjN^Efy54&F&#vk%Q2S&R0ZrL=*d)XQdI$lwNj z&%-)h-d|5Y!O&?Y-I&K=-6C9=g8=Bz-_$ZVVwD|w zY2B$;uI@fdPJ8$XTUL0~F3pMYEv(OUdi%AkDnAwaP!r$Uo^VmkDp>B~v<3VoicMw) zvKZ4XT_cI*B*%4sl{}{jpo3MU5L5*O^By}RJK%n9-R!BDm9f2y>^~^SWCah ziEGE)9&h=%ua(Q+D){q-Jl_{#9A<7!M%rxn%b45~d`6h!CLsKV<;58IWU+276L(04 zj83Er_a*JspC7a-GgV}gk%)Ob19_Yu*Vy}t%z;2gwTxrC6$ft0AhQXpaAgo5ZOmwz z*~R%HG!>||FZo`u&aCJ#H~6Aki(wY@(|3M}4cc#6RY}7M4 zRMz5e1X;!crw`gSUYfAy%v;Sh`moq6CZ!*{6-hkAC9~4_s_Uh!yT29D0>4X1#%*Q< zpF48V`xKQS^gK-H8tBI? z>)>%mb`GRjjr1t0cC)Ey5(s)qi2vroyuT{H6!*+m63qG$uLChgQgq0hYOd$Of7N=F z+)FA{HhJ|}HE(cY6**Z9%SbITaXOvSAe$#c`yz9DA7DHIm$O2a@_Q_H2G@^q-;v1q z>11he0ee${VOIRE0S-)XmjWNSwdN@AmJajtK7A8Qsdfn1#)@d0ZprG9Tm-V8-#y0m zl+(kmW`}f7_HOQ#bU2BKH9RGVtN-nw#N5HK8;mm_MMAbXh||O8*L!r_MwRM0SG>Sj zD4dtEHh3mu=tyrmo?>I@2izqf){;sa+XXpG$;qKB*yOXo!)fo}biGKbd7_7sZeuOJF(G{}D zXnF{4EutUI?rM)cb;O?gFfJ8AS-+rX&~~uP&U}+zH2x{B>|v%XleP+fn^LIWkgWJJ ze~UV-_LU9*Ajj`BG}qaN#k7}VWf}$mVpDDH%vch7ViDnBIAP8S-p~rP(W(IetZa6? zh80&|S1p5|K>+yu3z!{WVMm^{Z6Ec>Xy9TKV#{Wp0A-+>gV5~Bkn2MHc+l*!i%t#2 zteMIF7W2s+vaq!rOStg-?i7q)q@OnmkC!oUq$0b|5E^veyc=!kepSNJEIT2s-}I~m z=7&Ub)csBQVd;QBUhOo8#Mi3QK;ekn)d7QMjE%OfSSXr799OJvIi~@Pg_8&QXw4f5 zM+quPrEmE+7pUJeBE^Aw`<^RcalMexwPBE6q!{vmm}(xoyeZrLk5yWt+n_ZwS78$S z6=%lR=R9{`Y4B0{lsFluWktez-KHV}hspLxfBn}cwZWeWbVqvtfU-(AzlNqPAPT=g zJ{@?2oV!_Qhyjk+sTTmiTRJ|5IMtlXX$Dg55z-_ke?^$Cr{P*TXB9F<5bXGz1^$z! zxIb&iV;M#^)bdz%p;PvDtIdJ~AMuzW;e`tF*QS2N z#r{rpY6xY$yl}s-Ud$BJCKKF5s!X46UD-H&1&hqUz5mK7F(yVWnLA}{h~pB=HaGZq zNQd%Ii&oe*zVz6(<#_kQ*w143-;X9zD4lZdy5o+2=;=_EcsjII>dNN^kZ79Qo#WGZ zZ38&KmzTfQ?NHXQbp5djn>`S4uxKP<2*T;Jt{HCpsy{(xu=k@$eaOa|15nUg>-irl z?hx7ZoYMDzU;S$+j&@V%7~1e&~1I!yi|<*OBS`>|egvwzYy0%I%0m{&<@ z=Id$CV@h3#Jh>>6_i>>zHnsyhoEIfZQG-BB2uGcP@uFxwm*oD=g{BX_mFV2g%31x@ zY1hpxUD?9mvVYG_(qqk>1@;g^9SfjPl2n^KI(eRa&Lzj_flswP&IL4&E_~Hz8p^7AxX{XK7)3zdhRVYF zLrf+obu`Gy`BmR@N&|ak5jl=Zan2$(%o(r#ebdW~;b@<}qAt6b`hC(@hTWN3?S_%1 zvVNyd78z)Hp}-B3Yz&j*04pIZ7Lcb=*ZQb)=n@0|ILWT9L-SzWY^JVp`q>?W;%??6 z5bZUhuB!&a@l?|2bQ_&qHBvBb5<#RQK28M%+>5BaZp~hiodDDB=d)U|svfD}PHlZ_ z!I{m~Oafj(xwJ^NZ@6o6W}i}*{;z#dW}Gg8;*etfyCo0MvJ(1jy5~JD1*B$iOcXwM>WM}xJz zLtw#yvj}Wu+}2o>Pwnj&K70&LF`IeQpFvpn=SdLjz7=s?C*m?vC@m}Qj5MSs z-KO#1aNwTJ`~EeA<5q*yn08{}0by(dbSux19+d7qhNAws70XIOm(`KlhEn_YFAt0j zIUuSDr#Xz{w>#i9HvhdBslVFE#MRxs=8O$BU-i%v?a$YKZxe^SL9sDX zBCX!nFN93aboR7(3K$t_8Pn_cJxXU&N54kCP4HMzQSC#{*NqmE*+rJT6b)~oC85SG ztNcY4_PNEn=nbUIw8i=65%G^dnX^zYY?V*y#-LTkx>hjy_Eq7j4S|)OT9ulK~G*J1H0Zm9N>gOi45CmuO{Lss3(uNxC0ZgmlG^TR{JTM9=B8ygW)gt?kA;}y_-SEUCmH;_i+{4VVJ`kJ}uk@#C{c^wA+sbY4&uEZw5ao zx40+fd@s*9;+p0>@x)9yenhjTsSb1=(iTI+0Nl7E3NpS1jw~Iv7hB-`Ug&7eSS4%c zFcrdRu*u_eA+^++t|{vnU4d*k?FpG)prhG0>h5%k$f%J}bO26YEk8&9WDySbNsiRp z9w(YDaKrm;aMK1KVwDT+3EHP#3#o#(*|MGjL(?w3j4}^=Ckb@H=ixZF9Em!UeIIC= zZ>Fl))OxB)b5;1--c-4SgcR$H6@+~%ni`!+S@1z~x)Hb`HtxmwuBSX_+nwIb+i_WO z?JiZBpU*b(3(_Uep-CzO*jKgUu%SwV7sn}%nR*y73I(n;EyOQRo@MA*kc+&EuCNC6 zF5c!1JfhX@QkVri4OScMt=VBvSjCE(Ctnm4SGbw)#gDO7PO>DjIEku@!6OwD2 z;achPYS7iUg*0qoza25zn59LBh*q(%BO)HWCKI|Q98Lr2o1uLN36C6Y1x|9;zAY#u zm0j`^buf30F7>Ll6zSf+>4V{awaT{rtDp3I^^y<8sJ_FXVzLG6+6yL*u8+3YQgH8X zT(#R%ZzHX=Sf&v_CM6X#=t%1qz1uA#gy~X_l~B}75pnbT%FdAq``Bgt)!6vo7PCrXg>KH{YKR0p%Jb@sD4A5aqZTK&A z5C0$?$-K0J@@gJBSCkNhkBJuPpFd40SD_!-U21XbV)Gdr2T95PMvm-9F8akX%Tmiu z&$)lC@>kX$zg!0s^T)&GJ~HvJfIP22FnSPkOgBPWk(9wE>^*&IF%FD&FwMIJJJ@PA zcRx~p5_E75YriNZ;{PE=X6r|Pql6hz%@-9z@;)X>K*fRAUoE;f4h8c6weexN!nf!h z#K&K!72xDnP^xkl%pe?JDL?87FBEsKEyb9s{W6R}YaCzlkQE3s=$-ph?g}_#{8GjN zUD9g-4TjT`BXwz~%8>F&G9`>OP6?QM)vLNQZOB>2b zG1o^y-~~0Dp(%k^!t(gOzj6Uej_3LruU;7=AXF@pbJI;je)XjOiBwI!9ko0(F7Gt6 zj()0meh0%r@pZw^Dn!JO3#n3tq2+ZTXk#Eg?BRo;uw5Vpf$;-rd%h9W+pY~vPgLx^ z1C_w`Dmcev0RHLGS;p}1c(%z=1jAPrN>(t8Hu~d8xx-KeKB7K>&i?AO%pypK#o?S8 zT7>Y{Bf1jWB|~TR_!;r1bdhm|5}sg2)tlf!rv8|pPAP3#4VZ_+k+Vtuu*D&>>ME({ zTa=8rFUgrJ%8yeb&Oxxj)5CCUpR&2gzjb=9rltWx$;&B(N3xdhPrtQvOyBK;gBjhp zNPbWr61LXUjdv%`Elx24w7jR@8r@|niBg+xEN3tKre8q2Hj3EiQZokSOvWsBdW8xl z|Dv8--|ujZ2%#d7L5%6x<|4Zv_s3G>no~4872Y5CwO5xRJ^8eK$M^y5?~k5*y*n|s zgh@E=M30+i_Qr+)qQ6!lOD|y;xc$eWUo%PK?Bj0ch1fivAVzgr0__S-A9B)v3PK2D z>^&48nNWm4p;UcL#_}tJkqQ46$u=p9yrxmB#K@wKThUyzcu(K0K*6N~pT8J!C~tM7 zFbO|mFmuEa#*N2>m9Snz{I270-}2_VpT;u%z>^b@y+--oRZ}vCD{6SaD&05oWPSRX zTA0O$X47~DI=hqU09w!X@P0xP$-qK2`$Fni6S4_4Kmvp@V)Z1V%btI9_$!!l^6^m`Y8D9_tJ4dnK1+A3u zj*K=_bV;-nB6vg+Gqd11l#^U_^(+&k1v(@}3O(aMhHkuD0~s0?ZsPdJztaCcfB37E z$HZ_}ZlXKDxkH?iI$uC}bIxjt@G>RWMTf1f*+qP}ncE`5Sv2EM7ZQHi3j%_C= z`}}wC-NLF>V`9AXDQSroWZP^^>Eax(Qs=FNq6HzmPH|Zf{RXJP1%f)RnXjJ|)T5L! zxR*lQomZxlqus2NEQuqs4mhoe6`XLa^hxm90rp*h_XF!sqgaEVKhlVO zFML(`7MtDQnVL)(re{5n`_Te4C7 zbRYph_8;-dJXxW0B6WOgn|DecBkd6*PgzKQA5;1`Sst*#P45yBAHR9hyw?$4)G!I@ zP!4LJ+6p?TzmnYvms~DL3cY-{to2g9f_Rw*<<5+K8Xxo!Tmw11n zs7~XABeD1SzOV6@Op?*r7sn_IdUMyMTm`3mZ(q5I)9|i0hW9qKPr}y8w7cj)$FmtS z>RVz)#b&n3A*hO`wPd#Jl^s@^heIUX>VV_p`HKZ~1et;;SX)3?#?w@-vy5vNR z;XlQH5NL%v(;2Wx?gkd#(1vWMw7;lKLVHxrfbVZEWWvBPvTf=)csD~+(&jsrAR+tf z+0tY0$a!N5@V`eL-m~Q_;kll$IBxQ0WP>RoL2OHXb$Hd<&NR8oMlXZc*3z!J!krJN zM8k~>k6;(Zy&|%3Y`sybXA){Yb>rsgYvft6fop^1%tyr7cE`6ev^5Mejoo*@ru_k* zdt+AHJ296k6<;2J8a&Hwp+h|dFl!EwNLz;K*g47SBRZjK$YvFB_$m{wSn~m@>Wb_} zdSpGNt8^fgzqWduSdWo*ecCzU7XEiyIzxmC=6BQ70K$67v53 z3CGB7uz;qdg)|uaT6VOq)AA@eW7L3s&acpp z{e*5S8RyBtiuS1y zua?UBXIIOddZM{R2uWmtrJt*bkBYy7LsWfs)o#iZ!M>k54fYAl`T>xg-RmT1P_Nj<(Y7QjPYGF^&g7)u#O5I zP05Q?|5SQqY#mz&>VPD^)npwa14!I?U)xn%cWh3wUuC#(0HF2@P5fR3#EjIygs0`n z&2pGEdiN*V=BsYr$D(of@OrYo@re^{C6a{pz+dATCX<@tV2!$dyKnkyLCz=lIU^Lb&A%tM--D zM0{TLU8{I!e8^+NlNn9M2j!ohX($23AHV2r;{W!!rKLXYhCPXMjBzfxEOTNix6)AW z3nPiFs#7iKoV`qC)w#;iDW&Zt7ynpR1W4y+PDEFTU> zMKkG^SbjR0^VDj=m!6#y#{CfO1?)$XdXA*&R;>C}U};gn%@nBDT}>0GqxjJk1tAZTqyz}V zM{P6?(Ef>mWa~?#4JeeU$ueO~N#lE>6fN6iM3|pWk2J`izEiYv;zD65uuN%;{>n%h z^*?XZ_MCPW+8j|0;UANDcqHD_=|&y3R$Ve0lzGhQbCPMI_98odd7=PPI?SV%sR@pt zT1tkNO-oTH!ML~G%qZzqaK$l>yqHXWwxr6m?Q$O&^K<@@Ym5}bOSx?;Z|W#(WzS11 zKhFT9!%?4Ls7&uu8bitz@vU{}BeQ3Tc>$w*Nn3nPu5C)S1WV#Re$zlAbt2P0# zWmq^uf8C$^92@`U#G*)ELT=fr{nFuothZ}iM}~)yo{&>;uw3M90w=VXMkdqDOnKQF z7cyxu^A2Z`o;L$YA<^!7TD!k*z6^cosOhw*;=0v&Lp8QM!c&Fc5yB)oK(r%!I9B98 zmSOO><1A1wDN7?zHU=m&1pU@)pz;>fU;c>l&&`Eme8?YW;@d+~54FEX9fCUo*Hq)&7|;oYhV`2k6L{>}P_IMt#B3M)=x4u^*sf zL4BZNfnP0WCFzpYo-U(MI$3R_LY=*BN(>@bNygtRd^Hu1cHtlFBcwC46x6q6G2!?j0{lq21Lt88#zsLcR zT2qg^-((Eum%w&_2YO8NnO(`&%}fW8uHE1V3U78Bkxr8L2n0u*x$)u%V72@*^)@D9$!JGAIt{(EUk7pUpa%5m)t5NsL&GZUDix=$%| zJ0uyS^NO(NeRoDU{B(NZ6G$rnIalA)1OGyLs2q?+C~j`OMgb5faXAM;F%lux=(nv8 zats)2b9aNVWy!+Z_YhzuWtg06CXPI-k$q|cC^QE4gjh5j3|E;oehqkJkZ(oC76be2 zpBl%GyP)**+-UM202C6;A;d~T{zNsNqz}y$wp%k;-gmrEXn;UjJ@3lg!8^d&pAOnt zU(ng|Mvgp{q*{SgM8kBL{Ab{SZsM4wCwOdGU_u=d7pB*{{)idO(SXKuiReSVsdMmyvp zw6g~#ZDpl<`)5uHPSL2MvEz2?UVD8FegjvM7IO_glQfhu{A;`iri#sq14x<>>?ADR z=5jRX`yMIlE~o(5a#M9RFLS2I#!q2{QiollG+V*-!3R86!rh-^(Ul3DC=%cHV$OqR z%A$k!m3HXipcY9rg%{cDltEVV^aFS**y-47B0Slhn&I*CK4ccIMHT4-vFAR8gQL?& zL{;j6jv35z%{FN5!&ozkz8#Ktuy679bCt|i++sjcXDxVAx%6XM0 z!y6Y*7DKSr1t{v)rw3uuo}nxM)X%bOPEV$9sOmBaLtGc8tJ$Adafz-8MEBCqIIhyt zno%@SKl;Tg4kZ58D=^J^7*;6TzXp|jkHI?-rd3{RBOB~&1RsZ-^Rq99O@FmrFhN8* zgoZs!x6Wd@qs4eiK`~sda$RL_GTT za1_$An^~egXAxEZkni*j2ZV4~=lJcM7~r6=`$QvR@V$C})^NX>nOWhc1^%4j7q04S z-6lPCNW9eV6?D&WCpEE?1RmffFTB>>C_;K!Fmv^;6}Tf+buaB^WpeMjRY5^#tN^PH z+(&5#V3To$02z70z{ClwOK*tvn`4*U@f>3wrU;kYU%7Mw4v%KWkWzFct!1Hq))O1o2OwFTZ=~#R~wx%hO@s-)KptMnBNj8!a9K4D+C%`j|T9*e`=8 zXXzYFz7@z&=`uy5-p8Ip5f=h3jI;yi_-RNHm%0XZl7ye+g-By*6j5b#a}CJ9*Q`NA zI}(QB-jGT;jE1o5^k0#X4-yAaTnCzL7pq`r*^%w?kN-^B12DlNd}fUNyah1?rDMbX zEE_U_i-x64g3X&BNb{O$ap)8i*FvZQ(ul~wO+4!~ZP+~s*eu7=eli&zVozFSN9Q}?qf+%kc>&TTws!XECdf`EI`t6tef2 zkqQb2iZntT8Br8W@J;%BK1}o>P4WY8Pb-MxU2%21n9sLU_=mixctABU4y}1m&cAnE z(D&1IsY*$7&&>d-H(ZBiMwo^_hFejm)SeF$flx07BE4evA~L>zqV*&hvCiMRccMp$ zS4|>U~&@v9Z!cJ zu59SG!>=p|fVYY06JyLt_O{J|tyElkVLoE@NGup8h}r`N2`WF2A8UM56^{Kks%h*E z={{)SX(W^9uw71%9!fht%>bNmoyZ*c;2kjZbX*pf?a)?1TI17>o_xDW};|iWL-#=hlk(B#Jigr%$DE3cNHg!~P83t9aTaLv85i z?#qeDR%<~MyD;*zoEyK!A|Bw3`0FfSIe2RyWD=vq5a`(#UA}azd`U!Vh#MIipqh#Wb-5} zn4-!=s5YJ**#IFFPrF$?4P;WeKu0QTi@?Ifi4K%vs z+M)TOV=32XT4uT*Qv$E_XN<;&$db_tTunTUqrRgfc64-C@%v{U-ltW9Z2!NBZ$*ni zT2w(ei7Xbk-<@$Agb8aZU;Cj|GM=k!T9`;;;^?^>RJ1Z2A;gN1&b_(5t}7q{ESMc8 zC_#!fMzpXN0?@Vd70f-|rV!%YYX2MFk8fh@B{v02BM-F*1qsdyyzLYk0equw1yK=O z-T0Tkyo%!UJhSNU%>~MWX8 z^6Pg67arrZ9k&snuT%Lf6*0!!97>`ki}acK!jemlBK-?uj=R!&??n?YeE~BB25`E> zm`os_I&)f`&ksSF7RLR8Asc@#Gf!zFbrm8rw79QL3mYQbUiDJOq-5gfPT^*YtYOQJ z05gsx(p{`^hi1yLVruxK-^?Mc2RE=YH6MW%#%8DCUPAeR#;DjhBEDJd@wlN?G|=Rd9FZ{yWIE=lzA_c@in{Vt?(6wgl9A2!tnV6T~{#E z>(JCMpte#>viqaRtU)3bhjoCl+*~|r4YHMKq78A4?5Yn8+75sOZ)n=<;w&H?BWvIl zPfiVl#<}c=_pX1U28G>*|B}y*G34)7pNxi?`jc<_yr+zjw(=3pjG3I24i*1y1ULUzZ5^wm@=owhQ_tr4I zb_58sU;LpivtX`8C+*+Dhbw% zi5a%T(dND9K^nm3Dg8Ph#5o^tF#pW+aQ1kC6eENM(FXV1T*fxK8{&-K^3v8qw%TCe zU$Bj>;#ZQJT-j=AygW4W#$hmz2G5E;+;fcx_%f$CLz{L>S}D`YS=rc11U|*q8>x}y zl;YlUl2{j=Y+m(WBi%1hy~FvZ7I~ACw-&Rnzblxjiiy86>S* zr449l)B8@$Z=du0b-|86&3=Z|<#uCZ;037l644*wDD_3oah7jlMl;K2yN`;dr19+_ z?X4EWak&*eE+7RxwQhw>1kL@({(ZIUl7+=nAU9SrRX{~R~Lsk!37bs1=y3MgS+>9EoCWoeqXD`L}=|qRF)mZUJVOHx=Zy<6X-$PpCYwHoxb3K8#$}+QWNndI|e_oS`xJc zHyhAeI1vP0GLI{|-sMOZe@t?dyljf);;|w9Dov z>8kJ7SlM8jo*#P(96FNDp8JFvqg={(K^5p&@LW$u4W>wxkXw__Dm9CzmVt2LVrH%$ zz^l}MW1AUT%aHfqa3fCcQ(&yqBs6TU>t@5I+T``;GhCLA+qOU@5O9Wr`eu=6U z)x5rMXH`MOR$1NS0&;YOLh~K1@PjYaY*Pk&@4X(aG%BooOfBKUr+ublFuxCVrGDt+ z}{K9l21ItwK_!EWNdaBKY{&+}-Jtyra7% zYJ@O6Ig5~>e=sg60x2f4F!0T11tzYufd_ZDw#6Uo^a}zD!xh@QT#rq-qK&*I8;@ev zNTBZiYsvdTwQhHaB!n z2T05u7+}pugyNOc0IUZ2C=iNa^+)s?U~!4;56-BLY{`A`T;ctq8GtzFtMAomnR4|= z`yM6gl;iE|UfIo$C5RL_IieKPt4HwYCl7x1yZv6HMN{}LNNCw$#qkf4Twakg$yz+s zQPyGUqEuBqmp;t&uy#H5hZdpuEa~bT z$I5r{VUYC1DQEb?Zswp)KLB=?4zP4_-FxpImro-G^FwpF7vIK#NjV%7QxQzF7BOD6MXPSFUx;V=m#>DRRV3pkNdihEhfN zowTkRSg%7zh&;o$8VyU0_pP5pJ{HHT_TYnL=)1aNFJ0JV_S`sfgN9fC*7kiVwun+%9ik_!Ob$p|G1w^ITG zt|Xvw3RsjEv3k#Q*fG%h4jDxAyU{|#7-M(vdK5KTQY3%Y8@0r_1vWLjJQFRP(8tP| zz)rn$&qSPRrbXUXzUgr<3G+20ck&??bUo0nZh-or+=S|V03~<(Ui*%RFSG^JC@yh= z(^UCy4%ar4QCjpt8x)u${O>#Ql-dzs00gkY6eC?L(oYd}G`f zu{)$Y98-P$kp+}W@|7v{RVCDSsJ5nny6taN8CLtbGghPk9fYPaB@LLfKQC%27)_;G zLM_siKZZ(zcAEA@OP;T5`<`pMDV%~(t&t4_H3uyc*u{<;g%`EfEE}*8{-Ss{Rms>( zv0c5F{DG@cA`$iu$q9nui*Mef=(+S%7p2{->Da_41(C*v50rkTf}=GeW(YW*w~<(_ z@0w@Up%3b0F!;mGA?Vj;)@NXWCNNzxE3su6Wr zfut?L|W`Ujk4s5L7tb9URHYApI;(beZ$cmK<0c(Xy~Wj?VfG* z^0=ZS0KynTntZ^ywk3#n({o!ToU zbHn805I_9n8Ma&w81{)&@Dc~be4R)OL6yXhEG?~l_pe0g<}sOZH#0i-4HB)s9e+uz z`hW%yg4F_O=nt50Tu!}y2U~fJ$>fKdwJrJ`iG(W|Bn)b3-C;(-Ann29ork*?aJ$Nq z$KF&&Gx(%sYp+0}s#)wx-j@NTVC%l)B9=BES56(+Y6*u9#bMs~kkn8zufKKhuAr%U zU%lNzr~`4PvE2t;Dufz_ncNLJIN?PFe;j*^hB3bSgMZC&Ae^q1$Jy99 zu-0|RnG{rQ#JTZ+yU7*oWJsoCvG7dSB3^|;=qD3*qVktPkiuJ2KbuFnxzzQb$= zzG(NfJ1@!cre6f@5%EmA8tn0Y{FJouekq$s7!=>Jjt7i~M>SK97<|#S5u(M?&^TF- z?G7Qw^eMtssH7b!wz#bpIHErRqddQRwkkh*jQcJZ(4dfUg3`V?eKrU76QB5F+pV}T z>cHng&%%S)<>C_MB_5hNQRM#b&B}n@?Qdyyl*Y&Hx;cb&NTnJD{g;BWqer}T&o0=g zrgXvVbgnvU(|?qef+NQGXx1n!o%XO5$hYQ9AW%t zfwMS#-D7Z|VOFX%r}s{m{(kdeGq5|S$e_fWC&zeR)=JzL;3GCew1BW@$G3U3ksq{c zm!erDZl}+-#lKRD6jN0xq3uJojb>YKdjI-%H(krp|fpNe2N-URDL^o=SPeLZ|(N=c&4R%}l_WRBQ*Cv8U8n@`8HB zc#tJX0v(2!dj|>-VQFX@wdzTf9eYBf(p!z>guyFule;$m{DiHL;E6a_FOD53TlUl4 zd|G7pOo04Fg=*%vdJi{_61VzuC&xQIR|o1CHtKcY%-E)M?6%8pO-1e3hUH}eu~K4r zknSxw6r*>2=NXh&ZGHORZ}nyJYFOp0`vJy?J$p%hTW-o9MbMU5*Wgy4R}39Xv;hY; z4+{o1))ay(_~eTNVdwgL6E2#9mSI<}5E1g%AA%+>;g;k4nWO_8EFH;hEap;yfqDBU zwUD^}W?Ai2bJ&ckScs%OO^_oCTnKH2U`j37pyJCClv@NEaaEc;qmipi^AHT2f-8Th zX#TYSFVB)l(=;i1#JOsflE zs`e_CN6!s4SmQZBiz?4!QVJ7FiUBc!gyAAQ$|43pU0{GN@XX*3tgU$&^@)p*Px~Xi zyGRt4Gi#V=*u+iMalN%GM@VS*iU36o5l5LK9Bz5XD#iJCCOttyn+2ErFZGOV_g&AyV~4()q0s%HCES4Gasx7dkCkVayGx zb47x+bhj(+quz#LYcWY18A?XRI43zgfxK}}j?`j4-e&0+}IX*t6nPRVXQGX#juPLyXd)k$Lo z`ToXW_MGMrHm*+omV&E4oJyK`)ZF`ld1;@0O8DtNuS1ApncaJ(8QzpnDQdW5x;-Iz z8adO&OoU#1CpyN5$}Rii{CS3Fp(P2<04RH*shSl{&LPqX6S2gt2_&d8`hihb18yhk`9tKs1$2owO2 zaywdE|6fs`T!YOkw^>z!uNppF)l7Or`Jn^0u846QLKSac7Vfsgm)OAKB{;twT*fhn z3)@;3yG(1-O{uhe!AOQ7cQL4NU&}vt{+h?q?MBIksXX9ep51w%a`WSeQ*cq`qQgQ& zUx645WAMFV7{v%`sF0jK(RfHTozS3+)l?qg)eJ z64*o_>QaI3KySq2?$c|BLZqxNk&Fx|=N(kV&>k5;2MRrC{`6&G>qKo|Orb5ms73ipsi%xB zdDzL4>UdhkkC`*TF zsBzyu#`Mpf&_jgH&;Lh|rB- z3kvU4erIf^-Ya_ChTAp_Kmo%7w5-)vyg`bcvZ!=*`o9)OuBx~!nBZflhYnHF5sP^r zkuL(II3@z4Fq^ybfK)PCbt0C>w~{(|jA@a4(RLS6{=hY2=)1OOLIJR+CaGJ`{XxN2 z(_lg|xH=uhWlRY!*ES3wvc*^QwcC0KLBadzvXr~D)}O#j zBnpwIwAPP~LJ_r;V78b{$KdB29to`$-~dZu9@*a+~1N6MraTq(dDZ>;KGCC(C2 zhq-Zyf9ZF#Z6K)jWuO_2gHF*MvSQOdjmLp8h`uLZoa&*R=1`(%*Iy(f|MWx5*)&& z6l{OyPv~9 zzV7nOXa8~D-wxHhZNS4doL;i}#o2^&X)C|M2}xwuRZ&@UwL7AtxN#?#a+g{I(NJi& z+0>C<)xO-hXvqDYMmk^`&zA>qLeJgpi!@K&pH|G?w2qmU2b5=9v^tSCry{gHV8`DX z(`V1{zfG#^Q$)>uW6CMoT9rOMOh<_1Ee8%UA$3<`_uHlR9eJ|T)J-3!?OU)zh|`6n zc&RZkS3XKXb(yGPhq4^$+v42FiAfr!fP@%8>fg#9!GJ)BR@S7DebH07^tqejfD4b@ zTmEP%ABi@Ty>PUQx_gWi>6`+LN-vA>m^nFbH88xrfVGKQCONpwjB4~hEo7{@FYp^N zECprV2ZT}0VDxbL3ow&H{ivjs24}u~A#5QjY=FwjuIS|IkXdlIu27~4XQVqnRXAXZ zNs?Gk022;+nxZZ?e(UT;a1aUcOm_JT&j}zr&mi>$06jB+YBfEe5$}__Y!<7r2Eh~~ zgL>@%1BF3C;BsUMM`S;0`q(^kO94zlHsxm+%eKRMIJ@yjY)HxMues=tS6&C=x8>{0 z%<`q;(i$Mcyaz&mV?Oi?#Lmg?H-;Y{!0Qksg#IYx{wnkao5Ho8Pkd*WRA<^P&wH|4 z_?4S9BW6H0tjCBdN(a0*XL)%u;ED}L(!f{f!&DUWm{x5}Z# z7^d`cl}7vD!LO!|rl+*4FJAL3ejgILMb>k14l`Ne$7JXoLsCVeD}XSVs;t|Kw?7_} zYaxi7Xn$C&QrQ|CAE5X|J6_e=D!OejDJkr36eVSjA>z4%&Jo4>=R()<4MArrCl?20=R9j{O|9|453ShVPv zG%OB~TgnVI+6aw7slF)U5)$-Zg_Wg+m<73`Pc7E!=LH!(f_7)aFz*JzMz&Z^P{9|A zcteWEB`hZT_4W7~$8pItLh{k|-vuk^5CcW8GluMJG)IZkdgap!o7N2HnnzCSaMu_! zG5$7{QBb07?y7Mx4H{n1tgi7Q&`~JHP+z?0^;Mu`kYpN=x#0gbY1I+oLvwc9sw0N@kbMMIJx+?r2b~+#~VI7FnaW)*Ab`cQvChnpr0d-c8|va%TFn@>V-@fZEBzj2unO(IntbXfi`#&!cQhc@=c7*=x%4;FBEaOPB%>qEac=H*Ff&T4&dh4?~v-6SbH_8Tu5}nM88$ zeu9%w=4H17@ea-j1Ie=X%bQ9)5HhG0bt9YRO{jd99vxaZb@OhWC*p=_ppk_75c9R| z8>i|ucIz04)V6Fk^7k+g#n zlv^Si1d5~+^F~-8xC*-E7n~dz+gI#m^T3;M!`uciRAu&3PZ_{*yGHYFhPr})0-c0T zeaRyxzvA%yH~4vDY>ZBUP#qUY^tb001C_ zf1g3nRINb7!LRZIX9=r>n35jo{?e-e^N89c82jSzc=}#JAvIS~w9CQI#udyfiZuZs zEZ>9V83mF*!=foUk~|XFw&8m<%Le{+^5y+E;uOGT0&Z7&P6DWF7{>!@73lRP_{+_J zy_{U{UysuJthv>a`tq=Kp!t$|Y;4(l9z*&cC23a}(xelU6C?Tk>R;)vWxKIyWtN2I7YF>jHsO(=G)2B*m z*2T?6IV%xx&)s+q$xI4nHw^j_C2Am9gFAvF@(*WcxUH%`9f($ckAV_)DJJf~n1LKJx_vKyyqNC*hZU_^{O6 z`!A~RO|`xb8R!_zu!hlaf@el3>Eba2GSI)K{gF-M? zT5Z+SkSzkOQU9~Qb8|%V!uz*1OTop`pgN`2eacYY{;zp-3J@Ym$|P#dmyU$t1XzRw zD-zCw$fJDTEa0lHUv)h~SpQ}Q-%ZW@X+LMt;M}nB?#f%)6Vtk6?3tgi(F%8eDBj8< z#==4-EweKIBQQoixKSv`Tg8Ol)YjQ(652NZ_m8`1i7rHL6c`lre)9Dy0+BLVQGTt1 z^FXr``GYmp_06PEl*RF^UB41Z4&hGDwop>k?w}xxJ>;+rzAzZkLB_QZBCN@-q3Clf z()_=kr_Sj=5S`3E)5Caq0c%v{!-MOkrBIw}z{){7>T?hVcgk9=N9IXdY$5Xnz)DNT zdOOQ?{-Iz+kO7GzQNRrl{LP=`^))jJ!(7z|tA<=o^$c3duq1zGrjV@_K_BLuA6E)- z&)%~xQzi&aC>0k*7J3R*jn>=94577*V*#v5| z&jAov(%+^eV+i49=t`5YA=x#rBb|!*oFbXvU_zl*Pj>sf z4<0+QHdv7}n_UQfCh+F{i)THr8*eJlfz2S{#WfN>ct|^1liuQ52TE)^fkiw4O=!v? z-}^Z4pQSQpxd~?Hq6-I#I9_CF=E!a@T8PESIO1q1v`#QF3%%k+`r6X-=B+zEOTLG- z`i9fjj|Tz`E>9VfpiM_>`GanpIBx~A7+~N*NNI@l>FCAw^nIQIb6jXAda!)s=c!0*u|%pI$4e;UIMU zFqwIc_WmMerN6Y6U2u4qA*5fDx1bV;RFe=!(z#Gtp1v)~R3iLug{N&slMoT3xmqY@RKgf_xT1iEOn%*khSqHkBzynWi;rck z`Q;mEtf6F0H}yOr|1V==6*881Q<|?R_f%n7v!(S%;mEts0 zp}0ZK1ta+c!_fAF6ilA&6^+&uv-gP%VN6FX`sxNiCEWYC`LSa^mCy~||Cyuqe>2Cg zSQTKI3eXxCVygY_6%9n7+9_yhcb7fh6^}7VLocB5n4>;x)fLVv5yu!b+)6@F_rx+w z*QPU;tzZ7#_$kj^t8{Pp@3vYSMuML{RrTCrF>HvodL=A54ezAPKRSo^l;0+ygg86# zQtN)qzA=%Rv9s>52IQ}^=`Tt#=eqUwKsN*?h8OiMv62(D(jS4GDFM_;7BhNlp2%2+Pf?JK2|j`ho`LkQgdEQUv6z6|Q80G`Z}eUc5ls z=GMLI?;QYz9a!TqZ@!0CS}rVSTQffexUF>_%IH)nrWXiG8xS+$X6uv0KE{SLC4#Vw z=jeV%#QF#Pric+L<#^Hc6df8;2JrQV8dQ!Uq~|=U?ELjzioC|BAHM{1;AEQ3!FDWm zRMp|hahu%<%I9(=MnEmNN_w=(yOWJ2G(NaEf`GQOcS+(hW=0SkrK<9PK^lEOHW9vO1Of z35J9V{{Sb_4f0IOd&1RgAsp3-7G$RQ#^Dk@P{YbO9K5vbo& zgR(1+u5mMyuAuFF%HP>T|7NsCm&%<|KjD}4 z<&!(52_AP~u0ZN$;cp}2PRf>WO)#>sTOlx@zUnY!_0CK;?P3xKc*-d&>06yY3|CwM zNJ;Nc9w9TP0>aMZ+26kW+pAlO(y}OpWXmYjmJft*UAIzTlv;&pTO;{^i2t=^zZItO ze=`wOGHU@;FiAdyrGF*owD@17d}@Da?EMOON|GR_z`~uuC$sR&H5TGbT<>;}hQ?Fs z#twoMQjMt=$MJRl)BZX zie{f2!5DjQ@Q^JtsWPzPnn8KJ=OAOAk0DeWHE5`}fa%T&_HKbhXy#f=uEDOH#{nQ6 zL2Ic5XmXF^3Zr?KX=+hN51SF|>=^|CK!Em6NyhQyie!xwQrz~rBZUf~WS}70?fsub zt^cb;yqpMf^6^SiR2XXja~f{Ds-UHlzN~N8vxyU}ndfV$`K;ct@5O`s3miFgU;w3Z zqIS>RZBe0z)6ZzH&u^2JXsZH1CY_Li+x3eBR>fPh-XzRGQLl}3(|&!(U01n|0aE)e zW6Ehjn68P2I1#qmq4NX6G@wDHLS=Hm!PMD`ZVR@gglcUfaai#HES{3c61(}(N>VOlxO zIWc#&aZP>BmprCtj#H4{vS;eznKs1z+c01QNfO-qoUGNiHh*Kg2iB|=+-H1+5urKM zOvi97?+XfneMt{)Hf(`@X5A>-vuIju5pAg8Q%N7r=!RQ9?*D zQ930Ax(%5D(dZmpWg$5u8=~)6(_mfiYM6v6*Fb>`*QyK?7ReFr8^xQm0vKp&>rdw zLG%D&>p+TCzzbCieWN$frojeI-curdBzouA@ z@cNzocakJ%#?j-jL89@DfJ23b_9P1hrjGCf0FV?lSm#->1puGA0U&Q>9fT~Uo$8RzWyCvoc-i|2rGisQ=2!A_zMOTg8YFFg*Yo0jNMPGlw|#A1)U`6Z)_WxROS6U z8UUcMg<<}LAwg&;dzGU;=muys8;o|1fWV>6Q4T}vQG8MTs>;))FkIbo4jtBaVk+0? zw87)VWd?ZWeTWmL^t%y!Gg3(~>0F+^@vZLKlu>DT=?DtGEPBftGey0?HgP<>c|YiMX7o zL|#p=NoEtep3c8vrYv<46~Sqez8H(GxPCHcpt6mK_+Ip0r*JssQxLTASZrf4{wz1z z?xYUr#`}?CoOjt{X2$mmo17~#=ko&c{;`SA21%?<6Y6|hZ|k}PcmorSQQ8^uJ_2j@ zhET|E6sV%A0jg_D*q4F4Hy5Kk1m~iU^h>&8<){i>oHcThYg7?84=M_xK%^peSA*Rb z(1b8Am_r!(HlWCrKPrvJJ3K@>R3-oDZK-^E&RVkV#Xwc`h%Z!G38tKsM3H;5mt#}b zBE4{ZQk&$5+rd1~1RO&74o#!7f(`1fxi)2-b=$&o6- zfNt!}5GvoDOF8PMz81!|#cJdIqXPYh`hQg(joPmN=Bq>XQn|TB+Q9rNT`k z6GQWe32)lle*g0ZzV$9z`#+0F6W&4nZx+D=MBx>~E#@L$T^FLH>M#w`1Wi)%Y7t2EBP`Lrbh`9tQ=hYqm)4uD)*`kXMzR-Y+17iye4fPe>q~&?^-y>^nxWu)UTh)Iq#1jCui&w z^kVs!&(iW4c937h2Q|M%)_?A|+(b)swdVvc1}s*f9rYlE&>)V7yKEWi5mokk0IWyL z&(_Q)fE7Vsj7v>KCYnq&+Vbm{+Z^k-DljLOl$nw_cyJ4oLdh{A0-YXHT~I&^L4(ks zaN+&_z!WUo7@TKail{2BE=FJ;i?OWN3%b==13nzKofTF&sw)2Z(d&}Yg=(l+nCGYe zHi#4no_3Pgr0mE1v{a7XK^QIb*6h+AI}pRVvtH>R=8CJ%+M#d;$kv$!QZR@|{>o1S zeo7G&U{XT=6<7{$H#h{C#t#!$)VA9a%~&z4@E1pan8CTmcOFknsTh_x8J`PV8~!g# zhcqT-P#8%*govQ6A_>Q@-jGFYb5^>K5C|!N-1)+T@9JW+V<6WNZ}s`>TPl@hdRYI# zlqo;)F<*<9UucljiiWOC2_~95UwLk--8q;#Rr4-UlvnG(1G%#&WsN)c&i`R}EF6={ z({ze1x>f6$(N)BI*`Y&GD60Ko?90{7rTo*>TIaH?aM;c64{&xj&+U@6#11LN%0QhO zf%De285F<}c!^sUH42Z({Huv77Dg#DCgb^z@DaYE!U3fZM^-F{{H_|yIH=^LvbrLRR1QQ5; z^0>Y=F|4Wnhvn}?Lru{P*>h=X^1nnVpaJ`rf|x4*fZ8p^9qCU0yke`(a{NC4JV3+0 z0!5uwiXbP2?1P|u006#UCAc65fBxI-G4Lsl7sdB5cthCWXRxw5_t8$uP_cKfuhgU7 z2oLZ&5jthiwjv=^zbl{A@qe@U72c?~Ek+d#Df&YtBg$XAwjrP;f~J-I@Tc!wR};M#bk>|dFg8&KCWn#>6|bt`$e3t z{?c67PP&I^TO}72YXB%v+V-hdrPM<$Q>+W?6^})1X00d9atHd;HO|PRJ?c0eC{wwo zpJ~~R0>mQUw6LsDXR^-wZ~y=U04Z7LSMZiRtMs<=1;aY0gI6>QQ=6v+&j~G2*2IR^ zV_;>2gsvmK(D_ZM%)PaC&1YuwKOUB}?;%Buo?Rx0^j{r#%6`N{oVAP;7uo%_;b)8o zYPgo2P{{~xXs{a@B^A(J*gj0)a)5Nh2HNEqMWv96H*tlaLNlug^QJOKM);9)KPV$L z%0Hf8gfV)aj#T65zssOkMnJR)l-8fruLf#2>}8YP9lY(BL3WM{mD-IwZL91%9$$MK zcZZ(#M5cLxmPde;Y5hqLf;Gs?edplFZ$f_OBa&ct!y6iLCA&r^%~&dn?IME(C!Vk& z7t7Vwe>>GGJ}8c#2B?6dcmF)O=7UN~R;}mio>fv1I*_XUX9=8#mncI_XMmU}^Ji+H zpe-44Ge!Uf4K#)C9?VPH+DEzvW?#97Um6Rn3rG5s6=|2KJVqb>ZAl|udNZ;N&!Y?DC0 zU&Ped>J=dMd=SP?Q0fh`mV_9;u`WTA1+cL|o=>O<0#YbbdzpmnnAEX*l9A>F99|R) z!^$F9`zEN$cLjmn?_g|D?jhPxO_e%Hw1EZTL472pWvV2lg90zALJM`b_gV=Emy|nzfu(>HUf@NdJX)M8eY7Yn|X|V{SOll^(cK&`-%7Ni;Vj z3zw5D>c80*z^IgZNXzGq>xUGp857_w zd?PW8C4f)|3;IbDg1zYlVT9KSKs@;)%{0Md%o)PMJ7yL1?f8Csb z8feih2S7Smjk(08EUVyB@n>z&xYPEZXY72HR9KgCjc=7gDrFrrF;lBW2sL$$rufuP3ebBEP=5hP~+)wV}Ys?F2bl zJ1%S;hwGQr1FrwEkT#DykjYFB$g4Y7Zq7bUZ2CC%~0h+AskTt?!|8?C}X!hl<2tPZ9 zuz;A%ydoBu*}tQ60lIkd*Sfw0!pI3a!E)!<|NGe&Cc%H_7^7xb+Pu632lM<$4@Nz<%aP#V$P5uluK)l8 z003#Q$`tGFHkApA=!sk{BmH%H^7;201|}D{kuOYHHdsgBf43M1t$d8%W;Q^qEqmTb zaEu#ET_aGiqeh9k0V63HA^^6gObvJ3l09A>7qHT+AdVz)&??Vsp8q8t=5CHOKFCrt z`2uq&6Xy=IJBn4l2TBixAgPn;*az(T`q2qb8sWdXj1jrPiWD}E$oXT^N4s>K{v+)y zk5qF5$!1wS&h<(Dt@HtiQz&Xc&u-fjo<$TNuG~J_P~?>d$-7ohRUL~FJLnD{^I-S2 z0ZsF(#1;X;+|4_Xo3!t>F1_`KX7TyaG|V$+umV29Sk!jVprsY0F5+_Z9ot{J?9261 zIY-gLIlWOYK9e0ZT5}+MB6K51nsstbV%9}}kcLH^`V~6U*@)eJ29WOjD}~8fJ~P%$ zLW1s~Klo1uwh3g8bDTT*)rq!8#9U-c7gZdH<7N6nxM!o>TF^tl@kD>MJ^5E?Jy^$X zxk5aL=$d=tCNz&@%K8nELgb5tS@mJ0Oin_?kT`-~e+?n|l;k1=UG)wa$nMij zRUr2w4q*y86=CKL< zJB_5@gAwHA!iL$}tbS>WE*Q%_D@?{#HM#md{N@`BE(BxQ|IQc_BKRW#HC`CDRnZ#y zSX7^D)d^Ly^$69KeLwqsY(q(n?!c?&eY!t#*-~)+#Bk0THRP<)KS?E()Ic03iVf)% z|Nji=+gHX6pvjq668~+&2*AVk z?o?Aw^}qoi2;rF5jR=^FXcBPhB-{dtBNp4i{69va!>NXC>h0_e|7H4#UNv`V8I&yM*vyOpn=x?Nzyae_R(UN0@%v>rM z-2xephlZP!TlP01ef;Ip_xCj!XuT?$8MiDAeB78poCmQgzG+K8RG9W6wN(|6gJncB z1HnPZ$((EdFAuh6K!?uz51WlgPT{ulh_M`f(<04BRG{M8osok!yE&g#i=yxk0ky;= z{n@p>49(Ul&bBL{8Yd&7?~QzCEDZWax50iblb2j((Q;%F&lauNJLqRpNkq#Z1Nf9d z4oLE0U!{|ACw#EfR8F*Eag%^`?#+LqWt81fPNA~Nf&Uwcg{lu67BV-Z8oaFOIL{Pp zgds&3x@|$umAffkzzvs?I7RW&o?q2nH2d$;7-?vZ9<^%aa}3hrMlICH`*oD}_Hinj zae`-}#Yv-;ke5#rp%Zt(`Ci$u;}HB+g%K1waAtI1000(Qwx7`JG|s4UatI`@U4E+;=HoG%7!$`;glq<4ofshb5PXY<4+Z=<}c?tErn9* z2jL&9ys-9s^$o6~u^D*SfF(R%cVi6A9xdY4LDX9IWSdQ_CVWN/Ie*xK0jTt&|i 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 ( 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

    _*0FJ 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�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%0D3~tqn2y+UF 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

    1;Aw0E11sMZ3!LbrJ25x0|C7VjP{D>! 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

    4c2wHbbz0d(Ve`i|2D354>&J+K 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

    ng4F_)5#puH=7A)Q)B1$tiTHEwOXb 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 hV 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 y<+{Jsv4X#V=v`!oAX+RAwt*94 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 z

    Z`Wl}-@^Q9t#1(I$3*PZ;p@M;ZK=m^qmS<&rRR|Si8nThV5hd1Bom82RA2rkp4 z^aW8WW(+7Aw?K9!2>>00n)T>2B}zjuimer`3m+%?j~1EUvW^eC8@MFByQCHZnv`Kz zy>y4@9%)H-hDq6^#(bu4Y0!=uUA<6y44uzt&f4=X*gw^4FVM^7m!eiT%$9qCLMRxm zkBVjCiciOR90#i3@;g^9R7z;48paBeCv$W4*R0vJnrj3@1oD1x;CCy4~+6BAYEgX0(|x(aGG$wL|0|B zbn@2I*$!ekIIQ!;iOO+V%kUHx6zM3YQcaYCAsF9ZwMR-Ab{I^ zMl5K9lODn{U5O<#dw9`H+D@vpEo+yi> zK~)YzN9M0al;K^n@M!@y=&~6R5}vwu)fJNWShcE7`^J7hBor@j)+vUE)rk}ce`E~# z-=|*(kTEh}bd>j-{`uFcfBVQRe5OhN6hH6*kj#D{%14TN-hSE}26YhBpb=}9z3{N3 z(yS<42pybOwP4ksKhy(Zuf_f~1U#F^Tp8py*4puRk$Vjh*Bso-{r+cxeva86hTC!> zZj9N4=tk>Niu;E=?eOuLtw-H!u5K_+W8K4veq7RFGDZCm>tCExu91a?KmD*_Q1pVU zl$X(e;sxRNEB!{=Pc?%ZLMf$mFq|e|vP$q{+q6)y|Aybo7XzIch~kjk|6D&f;*PdwS= z&_=G#Nr59Nsf}VZ;x$u$ibqJtAQ7<|;DnY$ljG|zZeE8Qe{;nHZF;_-q6?Revt+B*EL_>! zOETmoy9M#5-VI7a*|MY=;W+Z#wUycb8!9>fB~%i-h6V#v09w@C=;2VLKmh57m$OAD z-(m+8%WAm443=^|ua`)Fm>zw3u!X*GomPRXd`dV0`q?FlE-&iB{VXgn3jTo$BQbBp z9LXcHZUDCLf)V$P>2M7rci{^$XN+uCMjbU$XMoF_0hxh`3B zY|qX@4jT;Q$*M8ViyZZZAKb?kQM^%R{rm-?mwQPFxAEG;B*-jQL3LuqNWDg3 z&D+OXWscU|l#jr3s(bwE#&TI;h^4=}{!i0mhovx`Wm~uya+KfHZD5=yRwZe6-gq$B{$m*%HMS?G3~@C!o+HI*i#q#Bfnsj_R)@+ z4ic~mO&-2ZV}BSW!1|E=s~Dq}vkXEeR3RvjW*GkS186jfL*jEp*etr+Vv;IfL~B?c z`|co#Zl)-3FxZ>$`_nShIRRI)*K-G?!40MHmlQae^n5BWg&En^ik5trv(sO1_s0|S z_DBm_lVs5-$H+UY+-~>?ggZ8Ww<6NvxgiKUU%X#2o1(xw08?8{xtGPsjI_>|EFrm) zqq$Ma13-GSjFOofT+}2qzy-eIV{4@zZ;I(kkjF>)X5-o8B0_DQcU3EH1g4glf4MNVG=3}y0$3N{gQua8R{5*Oza>n zXH(Lk6GpG~QhN)JLIeXwrKUWvCgP1GvC*f{Ji|J#UR734FC50^igp4?ao-p*10*>v zY=QCHQ}3V7f6M?L+S0yqQYiO(P<>(=bJh?)agK6u#S)7y;JJ$oe}^?oZxlG^0zXD# zBZ@gp1uju7VINW~4pe`Wa!ORqDflvRw8{S?!$_s%3+zOUTSKBeqkHFT6q9_dE*PEj zo-S50AC(83i!M6tX`3q=bo9w2F|DicUom&fL>uno-KloePJIOgdW$HYM0I6w#VC)tHLQrd0Q%nf7$NYxDEQzXNEm zN&LVp<<=^KEJWafE5!)ZU-&KWl{%|_aT>S>!MC^3dPWzasqe#?B|VmOaoP6FtpV6< z-uLXai<*zm{5Mug{!6TcjP$(kve-MtE*M~)O5XWg|=;u6R!p^$7cYMUB` zqNWT!`r^oB3yCQ*Qq@B2PKr}h$SE4OK1}Ah5Ak$EQJ@^q+MJdua`?Hc|h#dc9*g1>$8UeDB7Y{fX8-McuN zKZtX*I6lwHRALl{i_k^xKVstr=f@(cr$~m^s^rp{kKOW~r1cGRM;4NS_J~cr;X_v@ z#>|{9k3j(-nlmlbOyxvO>xgbhtP)*l`y`LzZXwQP+54wqrI*l)X^e%Tc-ckX{(}>8V+o?Gp-7Gx932P-|<9Ihekg!yo-!VAT%EBu zOB`)(lQcGhz9Gf=EHFtfkQO}@YO9v7g}s!45Ezu{ZPTCb^hrLu0g?aLO$?2d`&t|q zgbynOu6>3@I;p}h5iG5lJikZ|Pt!Ja0>Vi+Yt7Y4o(*HQ&(ZllZ4*FfKUbBmXF|Gl zcYaR|P1%ImaLh%|T?O;_i^g;m)!f9nXF6Kq3%sP64yh8eLwbn~-Rm5fw-?Qo<+9Ca zB}mCfJwdA|nGN`v5;J^no2L8%q>7eh&YZz3*OezLsIF!NQ4XHoTuc-0v0UgNEV#hJ z(sEOqNh^)?H$QqM?qI;Bci&g;`@I=bk@R3E>$o17>%B#8nb80mmgw{i4|=(ra^?601Eo;1kI*dF%$snD2>4w`&L=m z##8I%0ADn{ia6B9e7O_XQw_tjPCVN1y$AoRg#vh!ds+@!(VO7jkp1}sF`T4t|8Yy~ zzq^$o0fckHq& zw%;Ic%CkDHeE3)Lm{Q~LGT`okmjYCgpc-BQ-d>Q^&xN#u$h~Mh5^PI60JCtzzSjxs zawJ7dk#9b^zdKLOV{)duVsy>nuR#OAx$UmjAdm-r+0jy9hWKxBOvKlznQHPD29PK` zwqDX=42IiH>1eSPG=S_OWM>rSi=EqKn63hom^}U>^?-G>giRzRz@RDhQ}YA$OPY2^ z*Aom8yWkf{j@L!1eBg9z^NaBiNubEyr9^D&40YlAh3q-dYg)0 z>Wzi06ca0sh>C{fLc$-LM|`gZ~$?sPh>x9oK1*R;EW$G;Bt0{q_JIb8CYV~xm3G7BaY zun1Lj+q8v&Lxn7`tLl%B?&utMpr&{VKL+q#f(mD4M?ze!R_5V6rsoZ@uS0Oz2r%dSLVnr;(=51(DIs=pGj0yE$ymNuhKL`5t=B_yb$SCe-aE) z``1GCPn=CZ=t>Lu?pIeeE&FTno5p97x5v`2bRtkN1T_MD|4DwOO#h4I_wO6N(22qy zufzv$^nIsrE?`y?-9czi4z4S%BDL=Cg%Tn0|7Nw8Y=Vm7UeFDoJp=s`isQBt@QRRkmDy#z*{!mfp~W4+Gt%x<77CcnP}o zOTDL#LAq~OsbDl~n{yY^SIK3Jag)5vs|YRq2a8Z9_4Zn9qHqBD7AE%TC zFLH|N8%dN#W)H(-a~ecsBB4LM3{wf)#d?nd^4Tzf11#}ctf z_a*3rn9?hV@cLq;b6KNUD$G zqLDlbQZ@-z+iU?9kc~YQ^XCR6&DiM>7;+VY&$Mp%VB?q?#+hBQ9Ji90J~z$P660JVZU07QpaASYUss0FD| zUeIu=lvzZ3xW~ZSkVul&(QCqtg$AWi~ps@=@{vI7qAxy`yJMawK)eRhjTi^ zNnSF$@VWw=Qtx4@Z75f^eWs==A3cP-_Bw;lIlDp z=4eA2S7*TI2GP!H;XuMw2$2MNseYTDy0KTKKeA-xYY9v^+6k;cBTHdb_p+&UX?^*YJZ5|xC03mnNu z&c+L*BjQ(wg71JQB?_EM4(D7J(>&LN8RZ>oHE6TR!fV8#47V!ox=bfc5?26>u2g88 z)Phm2z^@Xxx28tF$EJ6_SUvg;yEo;7srzknR13a&7m4HfCODBHlTehfL!w1B6N2N{ zC#w#YPrXm9X0OVuNNLQDaBtBx560Hu(K1j3O1GVx_r z{YHzD*HFs)D5+3QQv-%^%qICiKUW+wwd4p{-PEuw>=ab_ko2C@H8CS8Q0Er5ybzwU`xkP-sP(Wdskz z9~v{{zbo)kuKx~hF~^i2aHFsjzHhpVXnL1ju%aPz2ft|vO^<97O&8W6-1(SX>FLS7L~X@nfp=`C?sdV zP28@GE9$ePQjoo$N=1=7G_+NEe)wRX!pk(nxRU&zfS(nez3^J%Y6y!kyU+h5I;!_~ zChI~GB{4vR!{)^0H>kz6H90zt4r<0QP1UeXsAkcEPqhgJ&}S2w@}HyRd@Ax(80dhU z;WTbi9}dA!e4TmEF5{mdz0XNW^Zl{u4-ybNEgayvS& z$=7Wl)auv0l2s%f&M;E;l^uKAFAjKyrxNwF_90I36w9r;m37EUgCAfX#L$O=i|sxu z*GEI64wN5dL_vX*tvFIDES5(Hh_E>p)P@@UbP@4<5=egJ)&%y}($)K_zTjQ5yISV6 zv;N^Hh(C)ahsBulk6Kc+JRzxy%$##BS<7?mRuZ5}ebqSh$;T02FAjt1PwekyO8xUE zB4E+3yUxq%-KIJqiGwgIjMnokt<`)SQNwU!{wxb7dnHTAl^4?pEjtQC#3!^~AV%a^9oDuKWl zvgRolG0|Sqta6G|*d(zbCuwZ_=3Dw*ky)>BZWILUK=$0@>ad(p2KceDE+Vcyf7QUn zzO zGSw!|;_1iTwV`QHAa+Q6qk0Ns3NM2-wJ?y@kq`j@8MDde${pj-G-+qH1RY z9f}ZgZsb;P-rO&)MpWH>@B%m?p5B5qfXr>U5A`h7ssFW@W!g8&R7ej7ZE-e{5s~a%<81jsz90dgtD9 zLR^VYe)j=MF*kup-F22Gc#k%3^ChrV#sy&KGM1S?4$c#y?>Up zS~Kd_s;8j4s-HRwm4d%F%77f|?7&&gn0 zxUOwQ#$7B~db!+~+h3)p00;t-^i8BllPbDHxJ~SlX?f}-mS;J~E=B9~mY)aDlCn#; zrVBAZyR4QDn6kU90C;PP9)z*NDaj6{qXxvIHV)J445Fvu^6xaQvVoG(E@*v5Vvujr zJgtxthVA=vGGeZ{I@2%DmaV)ucttuteBWt(vl)g)rqfAqul$zY)vfdi)c-~pvInG67UnL`A9 zUlVfyf&AeJ(j3c_bYh1wJ`rkK+qkjf;heF*^f2ixz@^8`6FseuAwN$bWtYKia8huI4}eRD;8t{m~n z8i7+)=1_%L6%k7$-gx*Q{wJ0!>(3t+XW_L3axq+-%I1YI4LtHyL?#(6IT(m>r^GQu zv9<{=^@MtvrzUr5>Rg82dJeoO7%Yx4(PV10+u7K$<7W9OBgOGwshY!J0i7AN#RVO! zb1CasMsV9(^QXtb9Dg!0dKG?Npq!ERo1|2Wp8G#Ec;F)=M9F`GbR19!kVoIcUp=4= zsVb4uPVV<&Ho|k1UEx_sYFzQQCq!mm+Z@>=$$qrqBW#Toizn`5^lVgQRfwufR zlD)?A6TYx<^PIYhlzKuwxAM5ETF!AgMRmO%9pc!a2>K|QmYw@%oZuUwd#~A|I@lTy zN+2$1>H(4bT4$pf(>m0dDZyE1!x{es+Y2L;-YF;kh%J$Hl9(s((+(e4Gl1jmwa#Dt zLJMxPMtf1+Qc&omZ$^-*C~Hi$cQ$Yh#A3u8A=_E5fr9MF%B3MNw;xSa|I;~k5HaUM zPJG9zJk?+L&l1$TtM~>T$?T>*e2aey7|&~1@D0+*s*^i4uVxZmKT;>mHbVO5@j$`w zFsWqhEQDp!AQlpBzf4@bxT@jN4!$UAy-T)N4|{oL_bJQHVorqX_w-KCp30P1iE6Vr0nkibCPHmyA_ zL2s(O4+PYq7-wXp6sHicn;PY>V}e^T$&iETq1S)QGf7KKov9uQqVCn`yCh)Q3zNZ2 zd&_qfQzBL!P+XNZMG&^ds%6df%+@PsCvNUTSB@~9wA9Y%Z$DFTQKV$bGl{g+iuhxP z(<$+VbY0vw03F|J_$re7{)4uFEGF0&TiEcjD1p+jxR_Zd8gX1)B-BS}!3=;tqKA*U z8r1x&0^wP_~JLPeOW)SVM$s>%Zz^1a26Xr*v3uqHsL{2 ziG(4GVD8s$a9QUbo0Q$~69Z0W~W{#58s?UHCwVnq3xQY7LFS+*g(a~K17gd!;^Y+wc{kQJTG zaRQW!1fM8(%<0@LnVL7Mvk#!u#$qsw!&S$GGr#p+GK=H(NlZ(`Iz|nyn}Qmbz_v8H zI#nj_6SfwL7)(b)GX304O#@wSqQx7m%&lUI_-U&!A`XgIGi}Jq+L(lmXgHSuzK?xq z0inufFuNcg5vyI$u>!K&cq>&RnL{;WfQoNV;BSPl=JQ8#JFU^d)16Uzlsnl*Hnky^ zgd2^{<6z(}AEloVKNvJ4FF-gp(=@4j_Hx#!+>#5~QAO0`(vo}>5EnGL9}z=$PkfLw zN(e|#c@cAfGPMjP7!DyQm@JIYBS4pyZ(+G2V)ay9^9uhcLXsB#=1MlYX=5ZrIUj*bh?D_P!nx!fxX<%se2#XydP|iJA8LfB{ls+pW}O@X$pVqqlNX~E$0K&5 ze3I!SS0TWrnLA&gy`kkevk?Nh$|U!_hs;lxC`L=W93a2B8!e6lqYvHRjaGQ(W3?P^ zRj(J+M7&}?pNe{hl5jbBAlbIses4P+Wzhl8>NKd==za|D2WDMExW2ZIqd zLHQ)VI4jAE208ex@qu)sNZwdhqI<*o^kjXG`Qbr4-_}N-_TY_L5*?Y6H^boI{q;?H z8Vw_oj5qa~W?@^-P23v`#u}6%DAf$z1EnFoizRDjM9Qa!UlxTFtY_FfeSqJ$heSOq zUf(W>NwbuGZv-}`4|&ujTgY6X^#S{m57;Ncfh5E6Dq9j$L5(0;D63qIU^sowNK6}q z9Q=@LoW#Y+J`rPa%|eDYj$IEQ73D7XKQKflxxn`lK-V({?I%E#)~{LxNoDV^NfySd z@9&~dwy;C)TQ5KHm&IKsEGX`#^t`y~A;2z5B6Fq7XZ)}eU zx2be_Z!TU!YaO(o^5%{$6+)7%qb4k&%qvYk9oMH98(P7dx*CO0!s@3m^!?y2!{iXM z=@x3~(WB1_A;Oam&Is!M30RA#XU>akCw6Kw1h}fMV$(6S2T?qf96^7$Y22#Q=nKM1cjFH1 zEPbp4i5|9M2O>mC)yOC2FD%+`gdpidO4N~B>w<}J-~2oe8Ec%_xq`}>Nru*)=(D%! z0gG*q@f4SJiNS)SbmGv>ZMWPbCa~Jku4Ja!UL(R5whV+>vc1F%hU()R-lqgWL^;JW_~R6Nz%HnAvYYAIw_z-+uo(? z)KrX1#gFIuog(oyq!F|qcIxCvIDVP5>>WmcJ|=+S@9n1H z#`ux=qCQ$}SS^ORmI4?c#YX|*l4$2wg!C!(q5wtJS#3Ig-e< zCcQ%HW-vzERwy|mveseG+%DT!quR9P>I>Lb81v($P#SzLf&oeQ)BNC|tNq^^cX>a% zOf(j0S)=`2aX0yBA!s&qDWdxN*mig%{Z5w8F>Bai>ighF26k5-#d-h)N_F|K^%)}0 z4Bfi^3uKoNKPga!IQdlIC_1`nds_jUL)4Cayx2y3owSVm9j-(P`!TjmtcKx8u%5Pu zjAC1zqv$jEzUsbG25VC3xrDk~wY4R=o(s)0z{SsmL7yXUfx4f+$L&aQ@v?m-z4jxUbXvKlQDB(__B@(9(4+~cE zT{qS5ld_N%n4BF3^vXStlCtMaJo9v;(Mb1qq$NoCjLNL(+@qg*0_fC=C}JNiZ4TVy zo&9)>yC`JNa6WD8!=LvrzS*d57!$#YB|H~wh1k;!oNau8)#JeLj4iu;*-74qZ3-mJ z^(&`jZ??Lja`pa=QEUi-1;h|zuwD33n_^Xu&Ghw4U1o0gD?D3glp22HYvWhlikbWM z5kWXT#uSz3&AJLf`qfm#rTbtbPtrx6WN9!!q7Z&6yEquOVSy-aWIGbrU9gqi^gz2YwgLsrj8J4K4^R)nGD zUpTW(E2|NP@(PP0-%(H7{(RcN2OAjuTx(7tKy#%rfjyj;L@GX3$vukK*bp6gme(qX zVhp@GgeLXYiy7l3JsM|an=MgOy;DFDMa9tX^;;Dpm*$@*@csU^VK`9%7L4+hVs|L^ zwgms!Xw2E;1=~?xTH7e28Ks(<8xB#G2@U|c7#bf%VuCe+G6LZ)n%Ak>cO9%I@1T_= z957S}AFV`uCtZ^D;#c&L_H4|;t=_x9fIA^L;Wy@Eai2$~wkApqZ(v%#suh46 zq7s6%68T>Sze4Mu8vNAgG06nw{HYbF;S;#MBFS(DqmIvUG@Iv3&Pf)kup~|cvPjeU zP%uH<{p$lQsnd>|c3-DnC=w^=!AW*vqHA;n<}r7axiNK8h5QvB-&Dyn)t}yE{e0=U zWRxvg`^+3Gq$?!+xxkSZ)C@2xk$Sy(IX4+{Ml0xOO9OWMqhF(boWOXVqUbJP*i;V> zJV*!8Rb>W>c+&bX)8TwQi2B`Vr#mp@g<2nnCF_Av4`;%UjmQOsSY?vV4VBO)+CaN3 zT8UC3Wr56MZb~BqP3i@uz6fvY%Oq|C>uw~lK%|@{v7AWBsT4vN5_ud*1V4_7(B-CC z%B-*8{3gt5Jm&qql48>ZE@3Nuk=zNyiR&0%Oh-fd1h>Ql1Tyj}_m#L?qC%dRVa7sG z8R=u7s_Jve8s!A4l)=lasTQt58l&x3f;|2$0=<7If~|)5P!-gtGX>>E-4AwIR-0tdD2Ed zRoOnSZpkaY-$rSw<=ahQaTvXd=e!gIe2G4|*IotBpdF%g(n7I0X

    13&g3EU&~S zMDSPL+}ZlEx?!-5`Xef*B$6ShsZr^4r}l-^k5hAU=bMcx*9&C2aH7}9nl z=MK#t6=ximX~$6Yx(G+Y8g-||%8A({5hn8>GAN_4d@yUDZ~n_p){LMr)0Zs>dM?Rj z+~`PVHbE**mkT*?BBz8HSvL;9VO4vG3^dn>ut)-rdgK-La^!JCaApaY1j@!hT92TZ`xljJjfDR|-!P+yP%nW###ZPYx_dw^Jm-i+NIl zu6||%2V@RPKgX%+>qzuZZ0l1u4uX}BzDTfSjNRi9QDEezj8S=Q1_UtJniPzfA|BGv z!Yr@tV}ypoORRxWgHHmS)&;(cO8Sp9{_t^vaYwx`X~Kk+dJ-O{HL+@y)4}MemNu=h z9V_mx3u&91JHv)`(_p12iLg%Hde^*{;v2auN;~h*-y%wVXW9* zGXTj;@16pd5myCiB}P|_BN3NYU-Qgb{>V2i-_|qTzxY{R??2gFvrRll5kRbDUu2p# zttm%T+7BShZ6WzM@>LhU{QBTI)Z$aMSHm{2)pX=2=2RWdA&%gizK~mpjB7TNO;`h5 zn3U=~)N&uz%QFEmtn2EtI2T!ND&6LN9($pSww;VhOrJ@HWwquVW`}L4BNR3kB<2|Na8 zO$^AiOI#hSgkn8^Ch=Wu$rTT(+%x30!Coasj`Aa0*6>vx)DndVMF?xhv~Td<-=@*% zql9MD=#G!LhT&?!>|}RR<=GjNQ$grD*KD%9nH1p*2{_9sCa@~N$hTAWX`*P^tEmP3 z#q^Jc@I-P*f#^~X$hPp^Hf(sA3#9iGf%TWNb zYHmsGGe{50v6`-w)VDi!9XoW8F(4#&43HCxUuM)mm>%IU>{RpnCH1(Ph55easte6V z)Gg?mj!x!w=DU}>KEykTpvGhXd=MWn*#Aq;?g(z=E*JvU<(xZ-S(I-6A*xTClSG0O zWU+Vtey8X-C#gYJJ_wTCe<25UvZiH4wEU1)mAb5uiLe*ynIw1GH}Z+Am7j&b-|i8^ z0FjClot_1?A*bKQ2%=zJcB&^IC5uTW5Tl(MAJ%+r&6u*0;~WMY)6@`?QJ@F{CJldG z6UzcH;;0&{L_QGD2vwo}>;sldBBU7oJ>9~2VN%{aMcxz~4RHH!tegHrtZ$`8kBVhP znAw+TZUWqzqyY24Lx|8oXwK2E_EVo}Lv=C4hg`Q49Cm6wc()SdxJkh3h`{Wo7Ux-) zbV7PmWMd^F9J_yWl8j9~&*_6dW}+pki{k*1*NSN5n{9HCJxU@IAk4ZCvOZ=Mo&$pCC(2Zi8jbGf>~P5j36fm?AhcE+LJ`H(O-nm){L;*&}5&? zFqbq=hTWY(eyIq*r}UPZV{;5!1fRSb`jOZpc>}^GGFM>`gH5O4t1KSGg2IVe14QAe zEHlDhn)dIHHv`2`%&WBld>; zU??R*^*%YetL)ocCRI}ovpShSp6GY8-*WTx0%8a3k4u@ApK?^!c9(sHc6ncZV{cv- z75*|pl7yv7Y)3uOb*L40H3t96wEO^q(z6HQs86g{nzZp}nzDsW-=N$c)1Uy}k0_^k z?afXjuYz*fyiCOr1_vlVd*@x=hn)87Ym=m^t~XO&#);7z0qBJ(oVJCQL%<#^7S;~dvXa~N!m-;2 z>4c{~Epi6x5;DfU5}@wB4-z>LL>p5$><8G9;?tCKP(0u>_b}J85*#tbE+v)ksg6xd zh+wEq*=*X4w-CTlffcSMYmx`IyVmr@P=_u`c{`gt&dFf^9u_r z>_w4a#E@d_L1JroMFZWtAqUoRXiH358gkY8`f+~BKw|m@R`xi#?4@5s zZESa|ZchEPg13wWzxxHWi;c+x#6)tx5}*m&(CCRIlDT|@j=fujnRJ_|l+ZaDGB+tA z0`K9AC$}>s;FGyW=q^#_`K?z`9+f!Wl=)@oM@p&&S^$?uGH_sH&IU57A12*(qM$b8 z6jU>(ywmio_iFoO;y+b@T=`{Jbx*Sx*6@haN**71b3H@+Jol;vX+AeZXx{OSgx;B) z)x?%FgPOYHQG4vCc+G1@h&*6DWo#_aGJ*`?v+CJ@- znuJ&e%(&7pNX0mgLjJ?Tz`^4%+dU~5X=-2A;q@Z2%t>))vOzXS$$zK#$p7t|TxK9V z1iuS<7LOGXz=(Wedy~rn%bL562ucu4vh5|Y0t%)${We!kX`dM?;@-`UkRH1LdtFE4 zGV^?e$sd|D%5Nzckw&FvT`16oG+J`~BOQzI`+G;fJz~L{i@}s$~8}I1#-T z#QNiBfkN6m+-3Q~@PdVJt5&OozL;tG0_(oGEc=<;q8a8IC4>p5ld{?o#+quF5Y~-^ za)-m{rBJbMvHVc--A3g5y(&KyAI28;3 za>#fAD=z-GXNAI}h6c^N^4JUiF1dIxTEh$NuMlzvx@G7aCUE6)M#9N(blVs1!DEV1 z+y7(<`jOfC^^f=`^td8TVScaHR~o6zE_BTEeyb+ELC`lZ>}K_3dSU?TC)&BVL)eDx zrQrHJWzfGe{1wF?myh3CSjAxsB|Z1|@Dvz~%k}9QTNbd)bZ$N?-{y1%#fBJC7%9P5 zM^Q>GjTyTl;m>Pn0<5D66pm(LrMfGceg1qK!kJ&?-}>r#g4g?y@6I!FQZ?AE`>7!A zp62WZnq|k7A@@0O#qgL7t1BpKgT8S%Hr6DEVmZV2nh~u{hY7$NjSEU89kdx3-qOAY zCVt0{D~krQ9TJ5nC36=+p>M~av7)LVu=XQFtqGAJ$D6x`_D%AvtD3dG>bHGXDGqgI z1UDA*D4%~}v5o0zmrzKFmB-}{!>VZQ)6=KdJ+rL>ENmUnvs%vI4T{a1~V>vqmsYHfmzAi%UesO7d6AG=mt}I7bU&F{@Cm|5Y+j zw{fdLWkO1iN%!1=)hwf(_MV6iUZ&<35f>}KT&WT{2XOfiB{#6*`u`!LG=T8fjHfI@uny>%*{6e2SmRbAI`u>Un3~7!8FNLBod|Dzt-UMZTqV)7LBS(xM zHnvw=3yoc|IP(q4Ptik&-CD}S4ZvZ*``0!%5C1mPSgF@7!YMavd4k|yUapLfIz5fO~`ysl4+mFk}KT&WDhx=5r#N|Y657AZm`9V@>Ll={aG z$L1{ti-QZw1YB3tgL?xSqH9beFinO`2Y3Q1{2KRZn0&kmzP zkB8A!YxeBJYBoxb@YTyD6@Dt44pnI5rc&*DhYeQDRZf~4#_c&S=1YgH`|F=pEAR6@ zikY9$91IR!>!hIMy&2UEzh^0H+3Ci>@d(ZQ50Z-H#}SAzF*J#2y|o%i+X&AB+h7oU zc0d_wdj+ZaZhk6sf^=l{EX~-ZGof{jq_De(tT810h+lViW+IbwInT8hy7XYcDUzXm zGVE&HZ>jY#UC@$?i{X>(Yb1 z@}0*)@tpX+f8b$1!#@|F$|Cj6^g7KDj?|ayujX%y)CdC_1vyz)D1>no*R#vH;mK2} zz+JeTt!>kMqT(AN1F-aiddOK{4x{Wg<~2|orIajjGDh96CQl~?AXcGz>H_$(s=FF< zwN4lax<~=zXUTm-zmnr2eiDdNN-s@WK!{({1y;4z&jWU#&S&xl%leie0}~=2tPO}i zY6)J0jcH(EO!75J2RBZQnQ;(zsKYZuf9K)8OoD;;n1bcX}SCc`A~K z4JB?z9F+d8F8BXXT|RnwV1-bohl>g%IaCaWc=+ACD70iVBL;lT?KDNQU)w zXUc%fC)PWqh`|@KUDO&5@O{LZQs<_H+wKvk8Y@YbrRvwTc!<;#L+}`bNX)mOZG}p( z?_p^iD_f`H(7r_UCEmK`N_sYlc9uH*`g1PvD~qyIP^z-KpeuSmbAy@f`t;49s6u%h zqAbJS^nP#udM|;a?vH~GpB)I}_+fI;yqx!-hV7DD7z9c^+UWvh7HwEo&gXOy3<~T0 zMqX2Q4;-g{IE(`#E|y}PNGBRQQJ2MvYR5@4N!EcZE0$@rbzlt+ zT1x(O5Qn`4vbUtHC?4}SuW<$Q6Wg(q6xy?#PLY~<_DAU!in@n~#P6*N92uF~E#+Wn=E$}5*90XkuksO6c<;PJHUhMRzUHB>q8!O^; zs|HwD)5t~5S*}WFycu*~*O6yEI-81EAdUP`UIGcsrlX+MSa5co%hxqD2-MZh?`KSi zx~9E9-g|pyJ}c%i?BLN?9g%KH^gGSCcwHRTFH~yP400j8;b{k6B6BH(2zsB1S}V3s zWcC;=U6*cqO1|*Euw)3sWZK!Ne9<*;{c{8JR)YbNPf|52y`GV>JRMp7{g}xkys?TT zf6jrr@iBPr!UmGgkL7qZ=1BeUoom2%P9bUI(=SFTP~G~o&?UvY_g6Wr<@Uh3`MRtj~le4lN`jg;XT}em@A}wN*p{`&q>p5EogkHV7^FC$64OL z>@)~HI}U|=K8G_3mddFlbLmKHfB-w}F3d=YZB;+1x6QKyUN@-ZuEixsmz3Lz3oF-W znMaBrcm7tgf4H@u|4>ikW{L6vWD-_^?DJ;DT-I!}@Z|^g-ulwv7s-2e^?-K_z#kxr z1w`y3KvFC(A@tGd((18gRsE5{>xqW6H$&@lk%$W8tpr6?YyT}w{LzjjeqFs~)8vvG z2h*&xlvy_zJD-fjg$q>I_E#o#{=#PRtC{8DR*o}9$pSJE`4BoH=BCDznm`~1j4_5h zXqR!1A%>vYR?@Ti=1@@__6zMeN=u-sbBZWZU{872{_{y$+RvSM4!Qni zp(cU^qoz!>fCZ>o_nw*EZ*zV>bOv+KKKafP4~IDT;&{q>6H)IAU(Qh#a_YGujBuy& z|1jxmcb8%3;zVtF>WY`q)e=11@H+9K6C*%V#Z+Bl#QTPwq*ZcCJlE1#7%u)5BpwIJ zMb1~GE3vu$K#g2%l}j8G0d>DRv{^I*MwJ(59+!N6HgLI%2a&EY*V*iY+AMPqC`JJ) zgT)X7+%f^a1Z&g-N)YsCXWc0v)OA_Sb}quC(g5;H?4#&_<`ewI$hZ&|v7HyN-i*F1o*m)FvJ3WP7_J;1@ALF%Azm*6RM zIiaDif`iSq7*c=(YjKQ%)WnnZfoDiH(Qu@%MuoxF%8l0K8a_y*5uuZdq|9!nVI!WJ zK##}SFGNKz#-SeHD?)rotEopqTl~#$tmux^Rg+-r}2uXUcl*C(6 z!ak?8(Nf7Mkgi|^Rl|41es`Lzxg0#lh(tSBXDS<<8j)Ye;wvrd0!k+|wMoF%!m#T= z)uv@6S(uA;aAz_Y5`R45e^px?xopPlz`V|ropvRoAZ;P{S6hxK4f{|s5|U%y|47aL zXDbch`(Jj|okQ2&KRmXDEb+nf#H1a>85{=e-MY=%;aKB3fA+l)y&3!cb*E7?1)Ad41_Kb4yFszS4Y4c=Mso5Fq7mrM-I-uWmh&y3$^?xQgH_7~ zwc#OJnIcVKwa#vIxj`qw&~`YG8U=TXhQKu-C&6wG9P#BY@3~bqT(~H<8}FDndB=pH zsOlKQ1e7+s2{7?YXw=*xFB6B5m)MC5GhLNL+ZLa|DaJ6HO03Q3t;OF-0w*+1O zS$W?TL||D1qRu^Z1DAF{0I-(YUVMp?`ChmISRvc&U70$UKR_(t#y{wX?m4sg4YuG3xm`qKuIx zP3(TH0>c?k*U{K5cWNJGp+{i!qGPBNfIN#rj{x^zPR zWO-S#`TAi`rjE&2z4ISAx%{{s2VBxq%?y6Csjnogu2CaLC$x|YTP?bN^1qhtVzR5Q zwN;;1Q8jhPT?*rer9}zf9T_$Ydd=M8D`M=$SR0AW^WF<6C2k; z!)I!!DR6Zsw=*S7^EBW;$;}KMI{o>!zSvyzH9@!NU#uj=z{;=x+mrk!!avA}&pvwK zB|jD-4T4Jg$eoz{6>P&`*&}t(uqMD1fH$|OH)z7^NzwZd{1czfImgE*!?Xyw(}JGf zYfa}(`V8;XFYGgT>=)Pubh^A3yTau(T5o&Lcj(`# ziRR-lze~MMsT#F+g-H*v8TZa+nD}rIMjpc!h~{uw857E*jt&D|iBiVYxN4LvxLApb zXGGij=_@I3Q|l-W`AeFhd!L^^VdR|@j2 zwlUOjAsx+iMY6?k&e!c*%^t8q*&(r*0hF;pN~VPy7z^l7%g0lx^ArsV>%7p)jQSB7 z@_A8kGxp1(i98`zqWwV$lqr+%NLqrOrwbXgeHX(VF07c62%PvCq3O6>`P7V?7+dYv zxC#^cJ<#5tP-JEL7tQdfINFJ29zA9m9x|6Az|F3mG^EM4y)m-+)@=m|u>9Tf=#RLl z47%?df9lw`s966klKl`4`2QrFqf(R+l4u}K+6wy&?Q@!~juk0DJVR9ZcBn8Kq{Jwg z>#w()AzZ0FR^TNA2;(8w7Z>rd))o_AHrJdtoAGxj!#S(ArYQW%`-L>EC<<}d{chGy z|8`R?XK7;+i-JY0tz@}BBdK6NFMrjW2M!rCHN|_Nsp1qvkY?fg-U?EgSEjVAbXr|m zc8jQqQ%Mo^XlARXlKi}4#CYi8oT^J%YV(p&auo)jaJIhtvBHKiwMsgmt#PJyL!vr= z4$~Y#zm|9Id-6Ve`a0`KU@fYZ1f#8~;jz4U?_7jKVmXPmA`EuWIl3)ebf%fG4yG;F z14G8%x-%X2WbOUUy7MTgWW3iY_WD}_t}X+H#yq_4(41~pQbc`M0?nr|6oUfi^5Sg9 zfYLt9ddP$<-U-IQ$ry2ak>Y}x4^N6&iZCpWGDj|si&&64>5De-#cj_@l(@cGi|rsH zQ4#Jlfi(yPXpJ6-XY(aC((r*64PsZ=EZEIhHj`0#9zW-k4kaS`Ie&2-ur#3%WU(jQ zirt7>{G35K{|OYPUd1>SE$b*(=h6l)-?v5Oh(}=J3p#6xg`Som|qO6$|_Zw%5Im%B`c@> z|5P>6mHt^R#4_zM)!FjT$mg@q(IU#T*QrI`40i5jPIzm+a#6yc{Epu1tzL6O(Wtm3 zBTO#8RpMUZiAm;Ukx$_Bi~g37DciD z=P!P`RrWVhLtH5BP#R9&O{3%FlU%x46Zh^qSbJ0lyn2CN=~ukrJ-`mnT1I1 zq{&wdyx+r#Spin)5eKBXKeQ02Lo6Lj`}J^%cfNeC6dCu*>$1Q)b4dbGq3nNrT#ib( zVbKI-a&a1%b3A0yYz{w5UD-~o`T(lhWhKk^9}Qr}@7awUr;;q6;)B)Bo%`l%Wj#2A zs~CAJV%X)$5^^+z9eM}AiIkh4VSv*Z!{d_g<(CM~+Zh5#^Qa6nk@GsIJM1R{YS$HI z4|Y;hg<(esQWLL_gd|gfGGVmhJ*-t(w=n@kZ_`|Odje|IdBjrZ$C`sx!RDiuH(z1D z2<)9B=cVcr*)~Gi``sKsKOK*esyrg#WMGFGu2oI0eAE0QWYQMxZ?;sGTp(nwg(@km zL34an`dr7vnA%{n8_)|Aj>7v*l+4lGidp<+)9}wLisb~8cl4@h?%Gc84C7_`-Zze) z{qUQOLv^(EAYuf!A!XC7OqY+&N@&8~L|8I!nr9jpq zjZzm0do#90?>nu8hC_jJY!Vt!QpA(At&GdXEjP5ImtFRB9wY^0R^hB51q(W;lRZYX zORKRMWxGm`9-~Ac2vBKpHL*P^I?`^prxP@U{NRz&J}Meh%JeaGtqWw$_?8s|*wpa8 zgE5IYy~FP&S`Jyez}0_I0>*+OxNL?PgQZ94C4C(W{r$#G+Ip}9ME$GdhxgczUrzU# zFH-wf{4L)qe%E^>F!t#-&6|^Mjd06pMBOPiB$8s}hx7@;g55-6XFitkl@U3bM$H2o2!zPi+Vdqms4JYzP zB4!*TiE}V`%{JQ(X|XP5ojErXbUZk3eNeUXk{IRmqH**@;GuTk?RLD3e1=XNg~&p( z0vIC~su}&hFtB`P&wLLlw^7t2)V3D4feOvunFS~R{N$PRV?N9f&c19dJCq%*q^|u7 zO$qF%0YBv4Lf1~S^epRLwj1^B7EEskd+K;^AX{XnDNX>kF=@RyBK~a^D}axXV7JuX z>=(fJqo)k>VUREr>-|-7H+K2LDi9t_*|!4C1AECb?ef-*2viyIFj;aliaOv4j(xR+ zO~u`2{u#K#wsVgj#oCsAJ5s6c-!QT-dcu&YQlwmMO@48BA{6_g_2o$|bTC_BpmDXM zBA=Elz6L_gDjJ#7=LDyjl85d0S?#Ihi=@s_m7|6#Y-M&j3QeL=?pbYhT?f7-3=c@? zUwfR>$p2xF^AZ1*Mwyx>2Mp#S7wB;B?iE`FK<FBf=FdZJC z@`B=b)NpP-t3en@@F0e_bl{4cmBD_r;f)^AOpP9r$OB-t@d*?g$LGsxmf>jby8S5p zMety0nlroTO}P%xS=u>;oS*6)%YJ8gy&A@3Ci%WnT*?Kr1_muE#4XHlN`jRFQNlbR zObiq-4`B%pLLny{Xx?+cS|Ei1s!$exoF)(1KXN`~8=}|*G7FEkyAcN)HSSn&cr(C4 zXGeTT(UM{oCpJu7mM!$_t3F&tC=Gy_=bsO|2#R~lO`Zrjbe|`4N#fVcDGxH2rNP)& zkCB`1QVrFZkgX~TDj|+tf3YpD$p-0UJPJdwgM``pp zS-y<$H$k}`=EUDlEd}}EK-BM)K=qD&%ryE;$w}OeoHeYzkTTo!&KY&^Vv8|&sVr_R z;~BM0b#i}vD` zP9t)+G-C-1=LOJX-)*(k#^jxptMg;A5i8y6XWk?jC)7GPIyVp+I`#T06H|jPpT&dL zFlZ&ja>bSoDLG+y-LhC_d@{otE*(LFLCUI&{7kBj(A>t~rKS35NM%^R;)0B+BW9jT zNwl{)S*BrW_@ZV}8`WtOt;^(^qE>{pqc45t<>F}F(cqPfHAFk?jgu+L07cTh4^V=-=;sd!mYKUt&U9*}ZI{Xn zq&%{eWDu?IVrgQ_vLHWg-kLqB9b<{%UAMR7sD-w?<~Nb4Lf8C`+jeC0ohG8PrJ*hP zIkAalPPg|1IQQuLMQkJeuosV#P8HzFEv$zCah%=Mb{Z2wqVlZ4L(P8eBX z4m$K|^C{dn7A$705C|3~YUN>qDQyBve|(n=!rE9x4_$QZbXWzs-=aM z2J<|&`7l>H~Z$SduHbB17HC9p(5)|9(xFk*%f_xtq!+T!{RNXlatw^2gH;gxk zfxPrXjZo@gH#r>JDx!gw* zRyllO#QGeo;EW3Q>gUFL1&t&rt_Z@`p$-) ztMY;1?6`-_Zt!SldVfidyQ|b_i{lZp>yB#P`6-|_09o76LMP3~kBYpW9k!$f#ue*( z0UZtqu4UEr$p$^7K4x%Ksam93UzqD_fY0}45c#LK(Ya~@j7GvD|_LU@( zPg&)uLu^QxllqS`Z7e;>U{LJ8_0_r3ity$Gdx8 zG2f3FQUi}AhkhQ8lagb{ba!|N2&i$EZ;I^_)q4CYyl(UGU=whGQVFJaih*$$)+QniBI4F2yyJT;GE?{xXt>kBWvzbv%hB6@LkE8ZlQSHt54AVMom#AFgkn5c|IQBzmpnH#q`6W_niDLsx z#z%SM&V~m)E2n$aS_S*t{$(HSu6e-vu>nNqjk4dE726g;Dr~tlM>Kidw%)YvzVCb` z@4Fx{Me+#9_tAwwdrSoczS~TuU|mp*0!YG_27f#|iGjjuws66XCxJ1H=uI7{oij_z zt3jxBUOgS7EqCKk6fW%dyBh*qvwVpFCrjOs2jbj`L+@vrmz_gwC%%EK&8L;y3`T1b zGm4d*{WUzOa2~3e@S%zH2{#Sni{W;wc?O0L=QrIQk&AQFlZx@M0#*Boe2rs??p#H1 zSFjfBk<<2`A zp;ke97_;OXxipOOk54EiyU#Vamg4c7p6V2Q^o>7S&L!K6ORQEidxLj;f8^^^78UkY z+@AtoqFn#VxnF2-TkNE7*_5 z)c5@hoI3BQ^|@vS9cD&lj}(m<98gGd1UewrCwONC5LTY~1wFTviPKcM_-aL6cdivK zW~!u^5d?c77m+G~9c~kS{)ounGdB+-0_Mw~&b0SOL;oNMihqn^DiQ*9wwM9iHvAfb z+?~+>BwLH(&0C-aCDIRxT3U`e^TXsZCK#ZM456~a!GNo+w7PJi(h9^Kkk!C=``r?j zC;#LfUopr}K?%SSVJJD%|3otFN>$<2Igm?EZ@1^$`Ac$Dwzp)wvFN2`VTwzOOb1st zi(`<>g1eMLf5TxfR*U!Fd#Swt3H%?HXh=L^ZWp|G;;Cc@(Hh&Xao|QBMMk4kPAHB9 zOurQxIYDl|WP(E$bIQt9{wjP)d@>kJ1fRv^!Ze4V8|e~GbfUaiL7P6i}rmqbXgd#uV0cDjfWdNou_$d%@myrgebm1b%zz=ix|Fg zu__Qv&_J~g^E@w~D>s6Fb3lgwdJ)us!Wd-O$kI4wddlXvnqnmF`bx1XPdNeJ~fSNuo+1Q+#0HRG8TJl?=%_HVRch?dhAN zs#REFY(Kqq%kaxD15Ck=Fuy0Q=4_v=wL((9)g+4Un zEja`_zG2)dA=RR-mO!QC{5yvUaTM4$RJx`{H!vtHbcnVaFa8dXroCN$9CUBh=GF^0 zBo&&Nn@O!l0oD$TCr9i(w)woI5{KBmu2{&eTTUo79(d7Cs$ZJcwgsQX_gvXdMrSMs zc%x6Qd}vR~%2V z%nymyD}_A5z(e3V_mcR#wWQTcL=kdaH67A0ky_62tcGHSZJ0DMy1w9*Ylbwvp+vo- zpwonT*Nm`i*?i}PL1viLm1Wa8vtjQwS1MHGnx|-jy)Y8MWR^M%N}w?=*LW8W=?72{jd&PVs-Zc)QP{cpm&hfUjK_A(4+!R#=n9CxhaJ)(0<9R|W+ z@Q|c6RsQexim3tGdT>}|?*F>9%gujtX{i`BaT(At7nxFqnj%H#ubilCxB6@XdP_|ziMI~Qabpmu4L8CHF-YpsMQS7onO z&aPeN)bIP<C(Y9lB*8MVkAYuX9nRt&-3&T+KTd2~}4`B0g8CXQ}TR}OE z%G9ALq;n1fb5<{vh@!PX^>%tcdQ_KYg9iL2(cI&w1r|QrF_z*K5f; z`$oG;pgod9_Va;N^n^K_e{13Wz|`+@oreaT?Dl<-UXg@@rHHk^wpOLAl*EFW6i5S% z0U(Q-%9>01^o_sWJ(!HLn1`KtQ8}!3WJv4vKA3?eTe#0z957OyIt|bU89E|u8&7Ad zBQUNM$pJ8Uu*jjy7?sqa;BT4vBIzB%2}uo^Adt?=?a$e~tolH9WFW3U7#UkIcN62g zBTn6JuK6MCBYK7h1xAdSJ=B7}6S%1_!}%=@=)+AgS}E91-vZnv_;dr*;4;IyS4IlTK856~aFqjQndhsW7AcydtNi;utt`V0 zUey%86*ZH-HHi3>NzUx{8SML{zu*7$QVDdhfp!V~8M9=Th~VA-4IV`JnsRu8f5at( z487FJIcT=!#r$bC-jCOhnk9PXvAhMG|2}B6-~2|&D!m5r?_kq2`{lu zpS5rQhcc+=^?!w=it68lWTY29jG|o12)vj{?MNP%Sce#5qPCD~x%)1+LXWJoiVlz> z&?^UFvt|bC8-3IJ^mL@61vlokJ48Rq^!Y%sz9#I)h zV}<}ppVX60k)l$drEtzy3~>f&5+&nOA_Ufs3xL{>k{xte84gT$Rj-MLlSha)a7amc zkfb5((6y%7U{uZay)aEu&WbWG2Cp-g=PW7nQDp(-zx`55n^K5L@^ST{$@j@_Yx= z?-+D4vlpW9WBip9UlW-C0ktTtM#4kZ?h3WFD5c`Sth$B_%jRh~)-=a6*Fhn~7K(;$^- zWV735<`Dv*)8lwF39rfmzNlFF_IufbGo@|y*ydc~8~Wu*V|aUBW)l)!t!nCZaMqTu zK=zGGfjLu&uR@e()cxu;1i>#}8mWag4q~1kb|ZlYEkkf*Do#7FRS!*o5yF(6!VQ9)-yF`*cm6Jw z>=Q8nCzB04tM*yyParIdp-XecoRIazX}uA{z`gWOYK>&J>at$CdO z)fTdZ(&WT*%zH~~iI6l;SU=sZT*V+|aFWViWE)IO<@o0cHSJ8S>pQPf4okA0nhL(1 zB*b^cH-MjoSFf+*^~#y666!?$k;VJNojQ8U>CDs1I~!)QMID5m>a2H=?Q1AJjrj^y zOZ7=}t)N`QE3UmAS9COFFpss^FLG8A9_ye9r6OWoUqbo1BH6|9hB&Nx<3H<3;MTDv z1)7~)lZB5GB%z;3W|a{nPCvUzid%>fs5Mxrh_cUVB(ArbJ?!VqJY!k$kCa!9%6?Pm z*DL$R1FMcM3l;cTb+%z;80gw(P>|sgQA@V$!h-(ZfWj#AL4*to%jOK<+^bx4f85B> z&_-#%1|a=&)&ECk^Z)rM0Go0$5*1EH0x-76wV}06{Mmzv3jm4XF^djqGX3e_$o)#H zdROcT;@VhOeYJRbhNy}}?yU7Q3$d_xcthGpOlMd12j7x!2CK*@M_ZD5do2zpkvs&f z**iNrnAp4Ut)w07e*Ggc6uKQh-#Gy|^^4mD|75M4*7FTbv9EtE?F3<;4Ggum$9$`& zO$7{WuXWo7<;EZjd{O2FY8#T9?tz6o!BN-J9OedLRYT6t)@eX<>`ru%J}5X!s$v6+ zpyOq6E_xc&zCH&5By^rZh?6r`f>w4*{ZD!^9Be&QbIk!v{TyB_032wV+psHLAXpZT z-m(-Sq?uI`Q>{?6jBjJomZ2uyac(XN_KE>qGdC?NexDr;Wg5$*6A=7JG4)ioZph;H z&J^|JujUDxBKf&6ECpurrmXA)YRpSim6dRNY}soD17=6VMvr#Q1@vW%*mYsl?TBa9 z>?auw-pD5nneRIys#D~`=6$LyG16BPW2YA|3`9{93&7=NpexddmBLIlg1ES?hfkSc z{V8;uM@I8{Uyq>RX-WQh2=RE zzIenZ*oKlARrv-44+7cN8R8_db7YlZDV@L!Ev!gXJjm4ps4i zohub;3rl5F3Tcyx;g(tl)L9}ALmx`&WbeLUPktE%Twm`A+teo5?T9zr7YdjM4hUc* zpmqiOg_80NDmoNLRvjvG*+LzwnV@l=4{^-ZtS^p&@8GI%s1D%iYj>8M?cboFtx(6H zxAaE`)}sK=Zlkqfc^an0-E6p%^|QaEmY67h3?0Ys)Y>u7jn`L3JK7W$WTgl_+|$M= z*D>B3e)m{s5YJOx4g|Kn|2O9q) z^~`CZuGI6n3QVETC+q^jHB^V5 zKeE&9Ue56np9VKRGJpk`qdc*9B5LKFOsF9pIdDV54U(U>O2RiDHw4B zT@JkE{PYEWgo(}YWMs#_pDsO8Xc`%8=us>n3{~a(YharI;RU-?OU9u_5I^|n)QzQY z#0{!+LkhLjN1D4G{=9*4aQsp?+F@{Dp;8K9@9uzpVpZjoCh)SK`Cz8LZ3$%^!-ge! zavQ%*%zMuI%y9hv*u*#4lBlt(J#9c%hA1;C$hEfc&{S(w3A?JoH!PvTv}>gHn(j%< zaKkcq>c;ut97pFfB;u@u!37Zhr*!Rw4<#j*iXf$S^4&u+X{VBHiV(IUMjPwt2eyUTlYPheN-?PTj<(+N`PcaJKkMS zZ9-RGc;kJ9O-_D~lD7L9&9nSUv-;e4b@>k%v<$iMrM4e*;-^9n=<_;~$5llR(P|H$ zovU#tdbwY*jjD1R-jQ|O^ED+*4?1=Wb`jcYJ1epc67iC{$M!|Z1*rKvWCz)U=NsW> z3|*MEtfFYCEJxSMZj2>zz^z*YR0yNq{;b>)oOkyM=sdz#94;vVHs4wLR!)w<999x@ z+X+}!gHhB+7$lrG{IKXi|OezdwQ-OA6dD+uGKwm zjcQ+7FPl086T8Q8uo$>K_XfSnz930yTH#>jfR;5^I$oep{f1aar_|tq^3?-)(eilj zE*}X17LCATv}~JIn|gNa!QFk0Y!~0*Yz;eVN_?a{bu^MKX7E+N;ce)c4Y5r_jYcBC zK(rWWO`JSf9`3-~Arxb%W_V!VrL6Fv&&oZbH*^tHx=uv<_bLDUI)p@jDSitzaHsa7 zqCv+aH^Or9&38{TU-T(xkW6L>8B-<&W=a<^Xjmjse7}o;cs8yEQw!M7>$pQ_viV~`^rRF!jHFP?o}Jn`|1y_xaXv&C_ADhi8#zxI;!?5` zG^^f~- z(A+NVXcX3 zfGaRd=%{+)9KGfWo|9ePL4}QeZ({Zm@HiX>bES(oI0}RZZWg}j(4WtD1po*9rYIj= zHz*EHhYFBin2WS+>9K|4s;wn5PVYbW37dBvOQH^T+wXfz(RGC`+i;<_t6V`q%Blf? zct0^qZjHemHG~Bc!oRK*wOcIH)80)@< zusexYRWze-vHRX;!XCiIQCbWggoB;h>l?(FB4}@Z@HAbz<2vSk>+w_4ZUU|j$6Tc~ zoImqRD#h4qk~OSeeOm0V`##UJ6U8jS5G$o{#_I4Quw$)37gY!5X@GisawS;wom3#K z$FXJNKf0loUXMNfje85SV$nsu-6}ua589q{uRjZ&%N*amwTT|&da$CfEk-_poaweQ!M|< znWTI6Xp)zk5+?QJ>{Jm-LCysKgVuhvlxnobQf5G?%(T=EZk-b@3hR-0I44yqKdsD& z(iga+^P9X@RLO?$w&kZ(Ot;ZdSY!pDY8ULxSRCX4Ji(Je36;|HqE(^k4PZunn+bli za0mHX_WpW$UBsN4qj|AEYDc(tAA8S-Gj`O*(6=z71=aqBv|Kd8hFsO41`=JK`Ptkg zb|H375Y29Z_KEEs@{t&BZp^(d;~ZccT##eZ*%Zwl4c5N6zMMd4}k)?TjLtOjEpea+Ju8M*5}ITd~lo&8QBAYr!gmXZWl zp>1IMCmgp>6hVj80VOUtdaSR{$$AT43Wbr9jy5YgcfT7nZX+)~6GJ(m8B7k-<$4y+ zUnY*fARq)}S;r3y>sO)@#csE=*{qja_#HmclP=v>3e_Lx_fHfMS#%H~Z4_|CHMW1)j}Fi; z&XlD~OEdkD3SdOxZQUnrPh=t-!!--3)aP;g|1(Tr5(>lv_2m)}aGWMHBA^y-ENi=CW zFm&ZlcO8~UhF_ay!YE;E?1*#+6(-e3i}7ib<*oU*2a<2h(;>VViFyK%J&t}HQC-v9 zzerUAmsDJzjQ~Qp!aJ)i4;3_)DtF1F>f{8nIP>L@ccGD8dL*cnBrpN^_}2MLVvS$n z4{i#S9QO=a06&5wJWcLt>6R9rkrYC{wJA^pJ0(!_fCx_?Q2bJK zUgea1=)SU4{%6_E@N9cG%aROK&8^hm!PBp=#JbS~bvX4S9AH6k0&S=^T#kwZZuHg%vV?tM?S~IeJ~Q`Jd0QVn1`-c}r{(ErYN``04>2 z|51Wk)KJoVsdH3p4&zhY8rK^3=2)Zv4UN)A#a!@5kGN}os4HC0cwiAxTQgHpcN<^b&3XlHy|)tE~hN|;}7kZ)v9pWQ0O zIn^PDR#T2giSpjNmj|Lia=lH)-CLjv(M?l%4^tXSU8{Kzi+zU4P$(2(QCL2)Foz?S zjViirVsLv!9YpDC_h8&)I#jyDdGgxyA3Y!{4dqh{wt%t=K4(+WslOFbJ`b#FP%tKy z{n!4YVSFCz$LJcf+E`pIATrfBW>&XC2*S_h?gUVJN~@U0%=+B|r)jc-g)_kriZYSs zCDmf23Vv!3VTBy25Qb4`BXIhu)hDwi!sI{tlqUC0J!XqZa0#0`Jk_$F9c8)(PrvEz z%0@6{^hzOuhp}wNk7TcgWHuw4o_<_lPfNf&w^dto1 zUupDQYQZb89qW`@wOZ@TSblS}yuErAqOMK8t(4vzPNyO^2SQ9%mwq5$AuLWukaeT} zv57qbxlLWetc`~ND~g47$Fserqh-B}>zJ<mSRSelJr;h658v`(#boC(bH=IRCy4?lgHY5vakSv-(Jb& z8*Xw`AS-xbiT!*}H_ z0g6+(RK=*r!-Z4(H`kKgzYYcKU4#G8LsVee}oK+i6OdKe_@2zM`=S8E;t6FOE_I9E9kRWiuQ z>n{SYwFzQ)-e;e8YJscki{8fgoTcn^#2`N+0QuDSm>IuCgMQySe;6}c*}_n3R`9rO z%Bz06nbdN+T0NA`VTUSIFMfKTr)z3HZL~2V5_3s>zV~94jOu30=oZzZFxe%Nk!~c9 zz|(w0?U?4~$H6YFbY00o4?~(ZkWTZzH4+KQt@pp$w3%MmP*QB^0Cw&wYs_BE)(Z6c zb{Hdea?-UXZW!(*Ku*o;ag5Aw-wdzNBGK_zLH092I3Yi#P`Ss2ov&b^MmqxtxSu(gAn09 zFAWOuKeNDiap^3XD>%J$rG$6e*}Mu$N>ujDp(OZv2!;ZL&Ur=$mHTNr30g!yyi-Lj zQRp&<0>TXOCW14<&{(nL@mW^8h|y9IfR1or~8J^rk$byY4F4b@6s60?MRz9Y2AM{yIS$zG`pu1Gnh1A zIv*OwG|v6o;HDM?Cd@%Q3;akBz9G4I+KJ0+vQ)$E?thr0SA&M9lI~?OcLEf^p3S6d*9C>DEi5|q>+79ua*_H)fM4ohPK09rD z6!U8vk>-Qf&Ye29NGahj?mTJO5i1FEa5uR|WPU;&2y#ZI*?>-f2`IlZhV@cHi%O{XG&V`4iz8Tk%9p3qg(rj7w#RQ6`n$9W!(7fds%WIEM4~WD;#Hl8ilTBi*FnR? zqfpQKQF{@d7NuqEE$GP!>{Ol^H21XWw#QMBV!Aw#Ltnn78mkW~kcEXTKIH$ZTR&390-@g2g=Y_(_m20={iDOSZx9NlTtt}M>TPGZ057%g-j3>$nz0B9X{Iol_2gc zuELs+-Pme5Hbt8T<06>Y_!kH#enQc<)4j}JE%b@E4#Z;Xg*ltI(**tlEj}-|qw*GK z=xB^+O_ATT07#kbV^~3LfhEE`8sDz#x`MFA+i2VUhc*#$K_=0Y^0;n2Lwu&5K$52n z)XL1M3H^6OmQic7LeCA-k!O!IVFC;qds2_!R!`3EEcgo1cej5V&K!kFvD!gn)-8{U zcR!_wn;7%T^w--^=1Es^x5lt*!JtX{HT5sDx9Cn602m+SL3G+Z!?_-oN9azGQqVADpIR(`DSuru(zQMw1u}%( zI!%NnEL;9WMGB1tzq9lxg6v6<6#yMEh8{GCe$}aQ_to4?k!Do9p*}H!W~b+&8aXeJ zSS9s(qu!+C6H;vh0vU8TyId~O2lgq7R+EVga!)*kV&TlAmGf6V*5fwL>5m__3=A_B zf_MlJ1-*a0lefQ@G&4jGuG;_7$lGHz{A~u>8;(N{`9&GZIF)-}#E8XKb1@UpKJGCldv5gSO@fM(*j?Mx zti1g0=cmu!FiGM^j`*7K!yKTkoKq1&=3CKypNOA?9fwma?bBEo&XmID{gH+o=3~xd zi$%!taVnDl!cRyaz4WCA58p@RN?=#kcEv8 z_*xqG$?-LYXyianLjxuO6|ZO5OnUj^#NLQZ51|eS>l1LB{1I+}^pVP1aL!V!z>6)G zwXy8v4v8Wrh9xN3`<+oEz4?|c_C8dGIj!EdW&>Y3Hng$jtEw$6f%VCYCvt+YtvgIS`k^40wjtE*kA{W+ZwNDSOJ;y z!$@gzo#E1tox)*z=!xf{HG8I*n2yU{%e*m3Ea7|2GZ$a7!)5fm`hG1H(8cub?Pg;i zk$%ek0UZSrP`7~haiUv99Z)#WjQ&!9WwAY+CM?!9K)n~znUjO%Xq#$SZKIenssIZ% zmeG+H8KifxdCEhzAgD2c`93b?Wd-~gFPreoz6!{_ar_9H!@93O~BAQlk0qtx3-7|1Q5JQi+r3o;qS4Jl+dc7rAcrA?jrz_h|-KGID?fTRKAXiX9nFE z58T?rh^_VAWVFAyCL=Bz)fv4C1_H*|MZU&Rb!oEjUh-{@bZ@jrZuh%`FCl2ISzP!N zj*PC%y4@(W0k9f-p95^&nZtWdE}ggD@u!JKDZYD(6Iezbk%}|^bF1BV?iaO zkvh|@AnQT0X%&b1++DobOgdJOF3C*wdMxxl2*U(4;^V_BR9a?&k-dxoq7Re_o$0E& z@b6Ufi{2pJ;;>iimq%WA%8R%D4W<$c104O%Uuc;5>I$o&%>#*IEj)*1Gill@gf5ek~%NZ(D>vbFsD{j|pZ0AXpJfy5!@OjVg5Sf$iY7idKM zKOZweG}uXV9o>Xx5u*GRctNUkkA-}eXnt7MR5bCETy$@T2t`${e}2e#(Nx{AE@~ee z`sc6XRGV%3y`2jA8FSK?{q?M{Pe>oW)_=w|i%FxhC?>E>lroe>U*{I@_uMHN$|5FT z!Wu3jC*Hjl2{4&~udR<|-}{Q7Bd2mv(?C|)8%OQQ{lWqX$*;+O^>aO?=#f;QIqlA; zt$k)SRxSBKm^gbu$fw=qi7dSoZ>M$BDU5F>pbGG3i}hEp#Q_#2Cufn9U(ZexkrXF1 z9tHjx77)E5%=LGFV&43x} z({AFffY^|ABJv8a$xyAE!( z+jDG0WcSkCC;13;NlA^?5ck%ENOnh(3M-jG4R|Vh7Yi0{8GPL~s|8K& zg8*Plv0!R#H%h^A(fws>6`rk!Qv&b0v)G(H&zc#i-6A2N9s)+$KzCoA0@Ab+a@dJ@ z!}bF_4vdo-WF-rvylWwu@>&ikjbHN zFCJW|DS=ct(>$_MCie2!>-}POeQeR+12N_f?s?a5K5aveVrCwyW1XrRmwY?ojwP3J zCyT=MBPt#Ij&=JNjWrXFk>b8*Y#4NmXeIQ#h)h!dKr@o4JKeAOp4n|!EmJNAAyX@8 zX>1nz5p>T0J{FX#t(T%4Z;jIOy4P%2;Ui$1GWxd!Jn?-gHliAZAql)%esg_Xg}I%P zZw>R(?jmbhswE9m2BR6SmkKgYxtnPWUxVjj3;w{Go9oG*RUdZ25#VOdDP)i6{hb0Cd#RjKD>anHv|3Swt?cksYyXuK zxY24(B{5)a;E-&dS{dfW?B{GEdT{_0V_Rj~SmEI;%KKwm%V&8p)pE&2rp6ee^sTgW zv#sMl?+_m~5oHvl@$@)#CigqIHk<6?t5)@9YVW*zQ6*KbNLu4GB^4?QKl+pe{F6-y>TY04x^D4MjYfuPB(K0dDx49ip={}FQ>xQa zFX2jbPM-E45~FiWqxif(Y_ksyGbE{x^~Z@vwORu*pi;uV$C z5148gC@R6!#QpR*r=1*w>UH^;^)L~~P2ja~%rpWM9-Srm=oylrZ=KO#LjW|v%=6<^ zLx)#Lf1f}@s0!DyxqI*!>va2W4wP*mZ3(ERO!2h=E`0gQl`P-zcvQ(`-4tk4*I};E z4{LlZnN}TRbNMaVa*;|?zd5JSOBc>aP8zcuy}Y=eDP22PU>axM<5Ukb^5Lq-l?SHx zKOSxTBmZjW3F(`X*Fg`2>R7p0?3?h`Dw|sG|1WEI_HUqAX$6b`lLrPIAn!`k3+eTU z!RB|9ot)UT`{%~AuGHPURvVP8ACCBiFeTYtX2^PKs7UWDLR_chu-+quVGFWb157C> z5w;iTNFRRfBFl>V*MLa{k%^tzlz@o?qI)@p8+A>!21k2UDd6Lu+jTVw)iGwLdEt^U}8lBxvc7WM-P%upLGp z^%WWc0EKGX0z8NDfa`RThi{{%m9CfLA3t8_lZ3Vw#-Ki4K2?pox~~1d4^d_S*eLcp z*;T`n3n`|KrkCQwaxb#_hW%TMG#&l!em}MnCuI&Z$Six=YV8KYZlFn)ye`E-{Fbk<{a)s;NnxPzTgmW0%88Y7krXpxU^s3~a;!IU>-F~lJTA^TV%WU%T# z{GFlwL`OvwT(-rDBe>+QTlCsH|9B3F^K)dUXfbMBAZVLyFz~uy1cc}5qopO>G03#E zV9`!oPrjW~WZ2ZZ(j(Qjhcc&ZLUvhc4PrE$Tjf9@>N%pZ*Dm>PmI%xnq6-nqlU$aO zk7%FHq(-(f(XFdQLcJoBabmX7Kcsq1Y56^GP&Tmkc$ekbOaki%m4=mR019CG?fQ&c z4+SL&kb#^|MIN&KHo`w=htfy=Emvy>k6KhPzNVAb0*|U=f2DILV0KlM5X?Gpb$?9G z*k5!j=I3tS^sn8*S3>beFaeOu$m;1BZ!=wO#eB~hF(?Rwh{S2nB9}0g#Bp_GMM)wj zQI;T!c$57QNaJ8gRT&}tJx<(Zm3_h@by#&QC?GD#2LiOZE&khsB?hhj-{N=wZ;?b_ z3o}Y%#zasP#7sbz!meFzRvU-4A|MKEBRQc=#;$vQ%|VbLVVRP;6g#~;yT=m>2C=(( zd-NRkT;je$$Lp{qilOUL)fVBKBL(Q$Ya{@-FyW|5J^``T;Ky&q^owS{0DjEK+PI#zHQ) zhG9YKi;JLbHP1cRKPprm%N{E&N<5mGUq!+|OI?79*&b%dyMLJT4IeRiFcCkQ^+WW5 zfqEZPw>LTF3Q_cpuD+@9&G8x* z8Yx&^P;wmz*YsBleF+LsEhFwUa`&83;>!sKjGG$FppF=PWrqe)<&$jrJ8_Mr7DRzj+VxACU>?ccy=A$Ck0E)-kT*amBL$y)#f*e0)`K;+$$lZ+UB$1! ztfVHKLJS6QC=BXA$D}+kh^Z5;zVAGMreqq;%W(pibk`i4+XJ?tz zEkaP6l@uf?0D%@Rv0U)k(v96yy6Sv-(gf<*)jHear;L}{CdP&F{1CCY>{c>X34xy~ zhrA)uq=rrK0TnC9=#Z@AYCoVhvEfVbgmvpI+1Cq+TyZNieuAtR_@?g?6g*5Lu|5%m z0DkpTs1yL##&Am&v(1rrvH^BnWv-CD7Tz{cdpPxEr!Bc{bH1MYCPGMS&Z}3Y~8w1OmA|^;Biz(=`a*TsSx=V8jy#%Uu~#Z%3l3 zNt22-cG#oNa}v+che?fSJFjO-6Kl=2^25Bs62ZKwdf5)X>|3UCTOd%HR;6*HafZp? z?AY@-BW_pJ^dsPJr&k&Pe;MY{cy5|Zl=q;l;`Yhwxqi8-Kg4JxTZNR0jc(c3OFp_jv zL<5j1DTikErMK%MUgDo+M{65o*3%i009xN5`8aEq_My<7XfWQn1uCT|XEQ(vN7WvD z+zj&&xtStbXhCAna_}Zt0+?+Y{(s%uJ?_7_H`tWins7=W8Zx;O{!Wg1p&?4KHbBJK zU5M`dszPPh+7pkedi_3546>9UrF&G=pjnbyuWWgiOPj7SpAo})1Ji*B zKnhJ1OYl!6G6sRV{6aL1cKpbgP;_Fcq0EK8Ds6Y$8hLhzMp7^wJmMcwsZ-Laf%FMY z`Kny}!gocKykY#5B&RjRDAFAmWXK$O8~Y?`2x%Lj2vZs+09&);C?n|lap4h~P<`rI zEzG=b_BzN+_NYt)0KgdBUA`&2#pysUT_~-@hll)aRlmkylBbRko9^78d{gfO|CJ)X zwi=0Osta^v`}Y+d7IIcMzqW|(z&9{Fm zS6h0bLMXm^;`{>16YiB>GxUpKxZqn6GCbH1-$}_I_`rE>nW^}+V)=Wbi4x@&=i*Gi zjbzE;ucgVmhM`*y3s1|7uuwNXEUAKV5;Y1VQ_&89hmcP8i#iVQN$L38I6E4z{zUx| zfrRh*O8AEv5d zp>Va;+Nc#A-kk|_abGFX))z7xW;vB*i5EXZo|sCEWVonFGyxa74~iv7K^Wb6J46|x zZi8RKfw`E^1iUYD$5V5YOS8a zgW3;=n)D;rMibB6`8@`D_Vwrzm=56=EtsSn!F%T877|811+wcWp?Au&yQ8}N_iyUA z31Mp9FHRb%g&!70O^{$_!h9yT9+qW?3=K$06qX3|p9yJShhaQ12F2-@@S+64(}Itc zBL=>XQIzF?Jqd*h3>qtUdqHq3FhBe>V}n9UFINIMJ*>~mef-9k`-PrLQT(pqGO;BD z427Al{7K^A-HYz%Y?nFjze{zecpd$B#ZqSO{9fWI8tvEqREkCSptLA3*>+jU!`9bq z>AnV8G&5@2$qS1wN;0l#xUryox2ITSB^B;Y#J>N#NDD(qiMVl$3WvMTUj*`*l4ud* zf+z*hNx^8#9Jl$Fe#`)nu0U{2E^=fBMb?^zpX|f@Bsp%Z%aftZ$m3rzsP2sqoG8FMkg*bbg3xanJ+zS8 zU23f%!R+Ci#&k4dyVW(AB$43%%+u8P{0kuBQ0hKEZ`o{3`sd9_kRcA}!Vz#5e_Fu_ zBTcw#q0^X+D>l8ucdCwH15}ejkXW5c#B?CGrKS_kTPy!0KzR5TOR|*hFB<^Du>2En zMA7)PEIghv5)ZYDet8#b1n9o}=-UvDXXPuJaC2pduMwtEb&%&%YJRH%K~1R#3p33w zIPhFRwzhTJFEwUPA-Bjx3*bAPy-G2Shn75j6;Jaj-lmY8lvRhcyj_=iONAcbnWZ-D zs!X9|V76A~03(CL)YU$LtEJBZg64y099|HVwgtul!h0b;z913XD^&u7ks4&i2V1b!S%pjh zO|4F>@|ez~;ra`47By3R=}ZspCRH9GcMMVNFAv&2tuperq--u z-i$#lZ!B(g5$rVJ5jKMOo*~q<0xX)~-@4(@BoBUbO9zh8l}pds`>c+WFu+dV zjJ2Gy@>-X{a74##cU{FxZ|ic64ZAuMtD(&vyD;1WTOfi}1+^-CD_Tr>nSkC2A;<1) z%d12&L}#J|a$xfbO-S_$lzjYGG6<(xKvOYp4%?ChgE2N4=MqMs=0D=_FWItR8?|e~ zjlW_+q?}QSBd7yUG*&CVnWqsq7{3+j;9md+ZgYd0$P%KWreh%^+$p=JacLgeHqGoi z@rhPclouRNI9H7nFwhw81aXc$XEtSywtc{{>syZGe#tlTAROXSTW2}0!7 zss)oq3uCHpY1oWpAxD5z>Jr0h1Wv~~g8?e0M}G*j{Nj1tQZ2UQmJK4p1*`_1Q9lKFdVczUs+^Xj$8(Y?1B6Y_TRH@zhZGyx&()J<8A_UTN zv)@G9npnPnP7|*Ijqlo5)qo&&!SLJ_ay=Sd7oPBAVH2wcaO~2u{O}knu$9&0(d}W= zL5EUvCV)CaH)rq0<_hxqU$KZN7E6YZsT$2Tk5hJsTitVl$hp z@+s~$chy`6dE1V0U-`&mR(Dm{dztG7lqT#-5Yo9=r$`}$aEp`Hy+o`uhj>2FWdaSt z@`r2?6V)RwSG`Lj`+aGF8ZRWAv<rR4Mm@}(5j9IW?#sij-SdTjTnu3Q2JD#s;kI@b^%6)V54j_w zwDN)Y6I%auMc}JS2}M2WowM8PZBRaZbD^&0CCdOvcs=Oaq1Al{S$PT%0}K}o_2fl0 zU6A6lm_C#`c{k9Mt)btmORE6PMl!?FJV*9!1|(TbFs>R?e75?CWnL#eUVH-oSQ zEe5bhvZx}Jq2xf^vg`<4jyigH?A6oN`&CYV+Izk(fH`4B9|9E- z##e7Gp0*o&2IadSZI3gS`>`rj$#xv2>b38ZysdwrJ*S6YtgbH z&O;tt?C4Z}&u;nu7<V_O~Dwv&!++g8W6ZQHhO+fMh%zW4L_-RCE) zRddv=syW6eXF2JC+%mVlUGp(GN`WP5zzz@;IV|5)gn40UjU=j%FSn|TLeKim_D1;8 zu@D}qC96_;gO1~DPSbjxIYdLQ-q43!D@7Ed9d((N)LgFbHz1~l1_y{?5;hRa=6cB? zHDM5ew6TpLuGpO)s{USC_BX^qh;w-WEpAV>q|bBR_0wtoAtfmv-No4>5B0>c!k#xQ zr=UXtES)c)qi`vtq%3%pHPL2`_R3yhNHS#@5NLg^(^f$66Fa$O%m^+aP2~TjL3_O) z4Tv6-B16^4m9*!6lff==I{r+WNXPxUhRkeTMo^zQ@#-LLw%dO!7pWOkUw*!qW!vFIp0S$#6I04Lk1+P#MsA}OIx*WYj+9?Qt9M>>S$ zjW*U~>50J)2ycbL*@dOP2QWJwAyqZ|=!eX=Noyg=JNR%>*K0d8i3`2k*U%MUgc72x`-sl=9DfsrQ9aT3f2?lzek82+DL}WwpXjTC+bC zB5b(sOP+v1DkBYv*`gW=3v7di2~E984rGE%IFMl3mL=9~A(4Plz=SHsfkn`XL_Qb{ zGR28TUJHW-5VlQd+(5d79XG?6+K%U^FMEd$7VD|a^y?PwNbI`YFkM8eIKdLQKGqB2`1yH`)7 zL!VDIf$zPlBpv2IJ}r}s9rRaW4p>R>MF!1OgT6_kljVaG^$0BeqZA{pxB0(cMY?+@ zWd3sYtvAgZQT2kak6g67w=+;8cYrc z$h!C^Cl#Xpl``XL6s^EQB6wDe_$;uOHY|G-K8$+Dn zV6z-$H%pvrzmDor`M~?mQAJhYM6Pa4*p7OrlZN5S^*PaW534ZOmADvoVV zY%rA=tp1)j#Y5V&yPES!G7H2)JbJ^*5`N%-xR4kvIsP(rOZycMBcKzhB!{rQJw7h= zt8U*NhZlTH1fM4Nn^26NwlqZ~r&Af`vNltEa8p)**c7wSuoPJ!bhPngwFohPO1b{f z>6Z}urLgfsASriKoni=izJETpB~J_z9AqQ_=xk?tga4w+M)D$r9P!rNfFD7Fp;HDz z2VB0#-#_!C^-)0fa+h@?H$B_?iKs~zn%KV`QC}S zSF5BZPe-!JM)c9TIL$b%SdNcLx+Q8Y2JRePkLzDR{QfUMOm)Re@yA8G-79zS1ZUA2 z)vD`4%#&tPqC)*m!Cqvl!^|*&SEh`ZM;a?!R6wtZko_aSOBq7O1Ir&SgZc_5MZk{0 zVIJm4R>s zh$-;BVxCIzlu?!=560gfK?<($hoz91xqT?6@Zkwet@(pUaCCh2=X$-;+*BZW4J!B$ zx(S{lUTH>C_EZkW!Iz;=!9oal*gGrK8VUAsWcMcr}4giF_KDS~IDw-GO ztU>vVvQ;3FgQP6HXj<$XACUZ4&3icY;?H>r%gOecWAkb9ozE}S*x)s@ej-J;G-hlI zF2B?Z_3KIkjX(9Ro7h(q{;_YQ%cjm|!2Fl35%Le>vVuChz(bwzqy5N`lq8+54|$WL z;xf6|NX{==0DEM%PGAs1i@O<8$6R>?`$SuCgU7g3n)D$;#RhfUe-QCK{B|T9qd>+4 zWy)WvY-(p0Ne88=z|t(^K{q9AF*gsL^0aNqS^&P4t9HuluOF<|*tB&vWnjkRR3hY0 z^8fYNWl2=CGF$;OV|wy|d}mni7}0iMzJdOmXrBDsx`}um;zoQOwx3kA@_sNz3Jonb zg2}Y(Hf0V#f$bVl6rECvRZPm7Pf5Eu7N@7#2_cwLq4&nqqq{oma5vI^WU3MTi_S}T zt2|~fLSaesFge2&K<3zzsx5A&&mL56txbAmCB`T%+<=Q-n>_-Iu1*608k@TY!!wek zQyk>d1hu4nlLk%E3ajb3s{yS$i`+`3Y$kH5Dh#z%iLD7kn!Q*b>HGmrWI1|9$5touD2 zuaXzxk3-6(`fa5qn@O8zNrNj-`zWv8Z{<75IqpFq;XbM)pYLY)v@%Z^%}_+MmtDHd zn)9HQ$@oO3ud#KMVR+UCPnLOli^#_`jNU0ZB378%p%+EweC+X-HXw!&A9-hDAoO`*wI+n?XQRH=cEqVbP4CTHh zJstxu5#~}QlvE)gek4lTi#0yO4-HmzH*^f5-L;_D?oJ8}kPHp|W}P%$g=->7V)PWsg=%0mAm;1x>S&dfKFK zr<`Mvng2Mq4pl`084!krAuB8c&3S)~ci6RwmI@-$BFAoKLMs82 zMy85yr7qp;z75#Ld|}T3B*h}d3XA)_!IRm+_HQShEvvYci$5Wm zFsEbD`EOhk=r0MJKQz+YM`|=?Ip)c3XXR6-hb2zAQ6vgVo)Hrmo|n;Z7>STE>`4gl z4XY%9?e~$K<2uDO2C%ItBYK({3JgTpR2a_Xw}DaC5oEaD!ILSD%V@`w5@=J^8@H?K zi0hZ*|FxH{`Y-?D-=GKIq+|MTvm$jf10vK2K-;CO($t-0q=1P|5K2DeNT5NFSXHg# z7~@5!7-lfiTR*U!{vZFT)ifzX#g=&5MEalRK?&56?}H%27Uxr`FBvG71C2TadQ1ue zox~cNF)?dhOj{5k?D;BVSM+)*)Pk8&zaX+%b=e122{)wUjAL43>J`yaRtV3yueXAV9e1y19( zM6GAuWf;&D+1P~I5BzB@od_awVH#P^^39PDzsIuoJo0U0(#ZTh1PAQuC+gyT*kg-C ztxDQVd9O(97oF*>A(UIEf8{uvHSg|O^WxwCh)M{(CAfMjo=DQ4E4;VW;!NMQuS|vZK@&Ux$T()-h8)5C|T?7MRwNQ^g|E z;aZhaoDuVIs^F6sQjmDy2@45{vr~wV+^%m8>i2(d=!%p2{{Q5b0hF^r%2;rM!hoMO zR;)|d4g7URl0Q5;UW|$=HaVeh=Z*9&%sP9l#BD+r9?rikgZeR-qPWxJtFW?2gMj2) zcY#a~4=qb>c7|kLUO)Gp6>_##6&Y3f7dF1pu+X07O0`_d>Lghlc-PWaWbt{e|3W#3 zvS@icT5$57U6cQDRJOn!T&BLYjws0)^1gaDFG3J?g-|*Y$yFAMTh}Gzt#_G+K$q10 zSGNX2+gVITnKWI5EW}B>+(O)5$TS%oxl7r|I zm82%(h7y33x!G}x(Kud}tA)wc#n>1bd(Fmz<2Yxe7s8}~x#`#V1sFSfx;EehG4Z6N zXH^mkLL4PDPpjm$G&X{RRm@Ut<+Gs9_^=nQO!(L$EPKXug)dC(sp$x(e1DrH$hkkA zJ!hwslDU`O<-3|6ROGH2!y)=nKCveVZVc3<#gvmN*&~%S|AN9NmPa@~5e%67(?*Mr zd-bMGirn0$h&U(*&^Zq*YMh<*GXuagrk3SdT8F7pt^Y6vv+Qxf_>Vam!Mw9d;%KWRj|Nxw!1#NZ(c^rHs$^K zWhHS19KWKe;%6uYW09E3SX4%?NiETBD6ap3q+Mnp4sI8_$A8QfY8|DCATogBr_Zpi zM{uLprL%V_pF3~A+S^;1hz0@5{lAK~`p5sfqQy?^N&+(olt2s`gu=v-Zb=(f@lw*9 z1bo#@Q9wvATNlW|uBUSi4Q*CxEQ`V~x0Y&Qdo) zL;pkW8dF6q8I3CL@kPlit@|>sXx>YfB-Ya1LeNh}ESegjqRR<;5QG%``_=hb*iQ4E zKmfTU5as-JNSvdur@}n{l88h8QA9z2vu<*oyYl+Z*=v22h9S2Uuyx1GdUDGce(YCSoo%bl2v)Zs<1P zLO61gA_00y+{;EJsCc>W6#-Seb@p~;`H`Lv%>3~NecPfQ;yqF?ltzM{tvZD03Yes~ih^xP^XTpq9auLOz2fx$a$G^#`dLhNX$?`NXFl(r7Jqo;yI zpdk$K=?%VM)3JWxs=!XM(oGivb~@)HlY>=Ll@2)k02MhHmmj&<%4GRn9k;`z$Elek z)J?-tc6fBeWp2<+`<8bG3 z?adl3BfZyQb9{wy%3PmlEL{=PiyelVq35|ep$J+_U?wn`Aku�Re$}4Z)?CstQo6| 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
  • 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 B91Q>f literal 0 HcmV?d00001 diff --git a/tests/unit/artifacts/test_generic_artifact.py b/tests/unit/artifacts/test_generic_artifact.py new file mode 100644 index 000000000..60121d22d --- /dev/null +++ b/tests/unit/artifacts/test_generic_artifact.py @@ -0,0 +1,27 @@ +import pytest + +from griptape.artifacts import BaseArtifact, GenericArtifact + + +class TestGenericArtifact: + @pytest.fixture() + def generic_artifact(self): + return GenericArtifact( + value="some generic data", + ) + + def test_to_text(self, generic_artifact: GenericArtifact): + assert generic_artifact.to_text() == "some generic data" + + def test_to_dict(self, generic_artifact: GenericArtifact): + generic_dict = generic_artifact.to_dict() + + assert generic_dict["value"] == "some generic data" + + def test_deserialization(self, generic_artifact): + artifact_dict = generic_artifact.to_dict() + deserialized_artifact = BaseArtifact.from_dict(artifact_dict) + + assert isinstance(deserialized_artifact, GenericArtifact) + + assert deserialized_artifact.value == "some generic data" diff --git a/tests/unit/common/test_prompt_stack.py b/tests/unit/common/test_prompt_stack.py index e69fe710d..8aba023bc 100644 --- a/tests/unit/common/test_prompt_stack.py +++ b/tests/unit/common/test_prompt_stack.py @@ -1,9 +1,10 @@ import pytest -from griptape.artifacts import ActionArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.artifacts import ActionArtifact, GenericArtifact, ImageArtifact, ListArtifact, TextArtifact from griptape.common import ( ActionCallMessageContent, ActionResultMessageContent, + GenericMessageContent, ImageMessageContent, PromptStack, TextMessageContent, @@ -39,6 +40,10 @@ def test_add_message(self, prompt_stack): ), "role", ) + prompt_stack.add_message( + GenericArtifact("foo"), + "role", + ) assert prompt_stack.messages[0].role == "role" assert isinstance(prompt_stack.messages[0].content[0], TextMessageContent) @@ -76,6 +81,10 @@ def test_add_message(self, prompt_stack): assert isinstance(prompt_stack.messages[5].content[1], ActionResultMessageContent) assert prompt_stack.messages[5].content[1].artifact.value == "qux" + assert prompt_stack.messages[6].role == "role" + assert isinstance(prompt_stack.messages[6].content[0], GenericMessageContent) + assert prompt_stack.messages[6].content[0].artifact.value == "foo" + def test_add_system_message(self, prompt_stack): prompt_stack.add_system_message("foo") diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index 478ef8fb9..0dc797a74 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -5,7 +5,7 @@ from google.generativeai.types import ContentDict, GenerationConfig from google.protobuf.json_format import MessageToDict -from griptape.artifacts import ActionArtifact, ImageArtifact, TextArtifact +from griptape.artifacts import ActionArtifact, GenericArtifact, ImageArtifact, TextArtifact from griptape.artifacts.list_artifact import ListArtifact from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import GooglePromptDriver @@ -114,6 +114,7 @@ def prompt_stack(self, request): ] ) ) + prompt_stack.add_user_message(GenericArtifact("video-file")) return prompt_stack @@ -139,6 +140,7 @@ def messages(self): ], "role": "user", }, + {"parts": ["video-file"], "role": "user"}, ] def test_init(self): From 728ade31d44e39f0dbe35274df34814b54b3c4e3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 18 Jul 2024 11:06:54 -0700 Subject: [PATCH 175/238] Add More Ruff (#996) --- .../contents/action_call_message_content.py | 6 ++--- .../amazon_s3_file_manager_driver.py | 4 +-- .../anthropic_image_query_driver.py | 4 +-- ...bedrock_claude_image_query_model_driver.py | 4 +-- ...loud_knowledge_base_vector_store_driver.py | 2 +- griptape/tasks/base_multi_text_input_task.py | 6 +++-- griptape/tasks/image_query_task.py | 6 +++-- pyproject.toml | 27 ++++++++++--------- ...mazon_sagemaker_jumpstart_prompt_driver.py | 4 +-- tests/unit/mixins/test_activity_mixin.py | 8 +++--- .../tasks/test_audio_transcription_task.py | 4 +-- tests/unit/tasks/test_image_query_task.py | 16 +++++------ .../test_inpainting_image_generation_task.py | 16 +++++------ .../test_outpainting_image_generation_task.py | 16 +++++------ .../test_prompt_image_generation_task.py | 4 +-- tests/unit/tasks/test_text_to_speech_task.py | 4 +-- .../test_variation_image_generation_task.py | 16 +++++------ 17 files changed, 77 insertions(+), 70 deletions(-) diff --git a/griptape/common/prompt_stack/contents/action_call_message_content.py b/griptape/common/prompt_stack/contents/action_call_message_content.py index e658af23d..94cc1cd14 100644 --- a/griptape/common/prompt_stack/contents/action_call_message_content.py +++ b/griptape/common/prompt_stack/contents/action_call_message_content.py @@ -23,7 +23,7 @@ def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> ActionCallMes tag = None name = None path = None - input = "" + json_input = "" for delta in action_call_deltas: if delta.tag is not None: @@ -33,11 +33,11 @@ def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> ActionCallMes if delta.path is not None: path = delta.path if delta.partial_input is not None: - input += delta.partial_input + json_input += delta.partial_input if tag is not None and name is not None and path is not None: try: - parsed_input = json.loads(input) + parsed_input = json.loads(json_input) except json.JSONDecodeError as exc: raise ValueError("Invalid JSON input for ToolAction") from exc action = ToolAction(tag=tag, name=name, path=path, input=parsed_input) diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index 01eb1e21f..e58e46d37 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -103,8 +103,8 @@ def _list_files_and_dirs(self, full_key: str, **kwargs) -> list[str]: for page in pages: for obj in page.get("CommonPrefixes", []): prefix = obj.get("Prefix") - dir = prefix[len(full_key) :].rstrip("/") - files_and_dirs.append(dir) + directory = prefix[len(full_key) :].rstrip("/") + files_and_dirs.append(directory) for obj in page.get("Contents", []): key = obj.get("Key") diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index 4d91b6ea5..bd19862ec 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -53,9 +53,9 @@ def _base_params(self, text_query: str, images: list[ImageArtifact]) -> dict: def _construct_image_message(self, image_data: ImageArtifact) -> dict: data = image_data.base64 - type = image_data.mime_type + media_type = image_data.mime_type - return {"source": {"data": data, "media_type": type, "type": "base64"}, "type": "image"} + return {"source": {"data": data, "media_type": media_type, "type": "base64"}, "type": "image"} def _construct_text_message(self, query: str) -> dict: return {"text": query, "type": "text"} diff --git a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py index ccb902a81..8260ce3d5 100644 --- a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py @@ -29,9 +29,9 @@ def process_output(self, output: dict) -> TextArtifact: def _construct_image_message(self, image_data: ImageArtifact) -> dict: data = image_data.base64 - type = image_data.mime_type + media_type = image_data.mime_type - return {"source": {"data": data, "media_type": type, "type": "base64"}, "type": "image"} + return {"source": {"data": data, "media_type": media_type, "type": "base64"}, "type": "image"} def _construct_text_message(self, query: str) -> dict: return {"text": query, "type": "text"} diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index e3bda9d4e..34b646846 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -85,7 +85,7 @@ def query( include_vectors: Optional[bool] = None, distance_metric: Optional[str] = None, # GriptapeCloudKnowledgeBaseVectorStoreDriver-specific params: - filter: Optional[dict] = None, + filter: Optional[dict] = None, # noqa: A002 **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: """Performs a query on the Knowledge Base. diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 2891e52d7..010ffa10c 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -25,7 +25,9 @@ def input(self) -> ListArtifact: if all(isinstance(elem, TextArtifact) for elem in self._input): return ListArtifact([artifact for artifact in self._input if isinstance(artifact, TextArtifact)]) elif all(isinstance(elem, Callable) for elem in self._input): - return ListArtifact([callable(self) for callable in self._input if isinstance(callable, Callable)]) + return ListArtifact( + [callable_input(self) for callable_input in self._input if isinstance(callable_input, Callable)] + ) else: return ListArtifact( [ @@ -45,7 +47,7 @@ def input( def before_run(self) -> None: super().before_run() - joined_input = "\n".join([input.to_text() for input in self.input]) + joined_input = "\n".join([i.to_text() for i in self.input]) self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {joined_input}") def after_run(self) -> None: diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 60a1c89c8..ea1b53739 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -78,8 +78,10 @@ def image_query_engine(self, value: ImageQueryEngine) -> None: def run(self) -> TextArtifact: query = self.input.value[0] - if all(isinstance(input, ImageArtifact) for input in self.input.value[1:]): - image_artifacts = [input for input in self.input.value[1:] if isinstance(input, ImageArtifact)] + if all(isinstance(artifact, ImageArtifact) for artifact in self.input.value[1:]): + image_artifacts = [ + image_artifact for image_artifact in self.input.value[1:] if isinstance(image_artifact, ImageArtifact) + ] else: raise ValueError("All inputs after the query must be ImageArtifacts.") diff --git a/pyproject.toml b/pyproject.toml index 1e7a7cf33..08b6ab618 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -222,26 +222,29 @@ line-length = 120 [tool.ruff.lint] select = [ + "F", # pyflakes "E", # pycodestyle-errors "W", # pycodestyle-warnings - "F", # Pyflakes + "C90", # mccabe + "I", # isort + "N", # pep8-naming + "D", # pydocstyle "UP", # pyupgrade + "YTT", # flake8-2020 + "ASYNC", # flake8-async + "ANN", # flake8-annotations + "FBT", # flake8-boolean-trap + "A", # flake8-builtins "B", # flake8-bugbear + "COM", # flake8-commas + "C4", # flake8-comprehensions + "FA", # flake8-future-annotations + "T20", # flake8-print + "PT", # flake8-pytest-style "SIM", # flake8-simplify "TID", # flake8-tidy-imports - "T20", # flake8-print - "C90", # mccabe "TCH", # flake8-type-checking - "D", # pydocstyle "PGH", # pygrep-hooks - "I", # isort - "FA", # flake8-future-annotations - "COM", # flake8-commas - "C4", # flake8-comprehensions - "ANN", # flake8-annotations - "FBT", # flake8-boolean-trap - "PT", # flake8-pytest-style - "N" # pep8-naming ] ignore = [ "UP007", # non-pep604-annotation diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py index e74797e42..c894524f5 100644 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py @@ -11,9 +11,9 @@ def to_streaming_body(data: Any) -> StreamingBody: - bytes = json.dumps(data).encode("utf-8") + encoded_body = json.dumps(data).encode("utf-8") - return StreamingBody(BytesIO(bytes), len(bytes)) + return StreamingBody(BytesIO(encoded_body), len(encoded_body)) class TestAmazonSageMakerJumpstartPromptDriver: diff --git a/tests/unit/mixins/test_activity_mixin.py b/tests/unit/mixins/test_activity_mixin.py index 91e0c3a67..f31f9f0e8 100644 --- a/tests/unit/mixins/test_activity_mixin.py +++ b/tests/unit/mixins/test_activity_mixin.py @@ -74,10 +74,10 @@ def test_enable_activities(self, tool): assert len(tool.activities()) > 0 def test_activity_to_input(self, tool): - input = tool.activity_to_input(tool.test) - assert str(input) == str( + activity_input = tool.activity_to_input(tool.test) + assert str(activity_input) == str( {Literal("input", description=""): {"values": Schema({Literal("test"): str}, description="Test input")}} ) - input = tool.activity_to_input(tool.test_no_schema) - assert input == {Optional("input"): {}} + activity_input = tool.activity_to_input(tool.test_no_schema) + assert activity_input == {Optional("input"): {}} diff --git a/tests/unit/tasks/test_audio_transcription_task.py b/tests/unit/tasks/test_audio_transcription_task.py index f4bc0e8b8..734e111cf 100644 --- a/tests/unit/tasks/test_audio_transcription_task.py +++ b/tests/unit/tasks/test_audio_transcription_task.py @@ -25,10 +25,10 @@ def test_audio_input(self, audio_artifact, audio_transcription_engine): assert task.input.value == audio_artifact.value def test_callable_input(self, audio_artifact, audio_transcription_engine): - def callable(task: BaseTask) -> AudioArtifact: + def callable_input(task: BaseTask) -> AudioArtifact: return audio_artifact - task = AudioTranscriptionTask(callable, audio_transcription_engine=audio_transcription_engine) + task = AudioTranscriptionTask(callable_input, audio_transcription_engine=audio_transcription_engine) assert task.input == audio_artifact diff --git a/tests/unit/tasks/test_image_query_task.py b/tests/unit/tasks/test_image_query_task.py index 549009fc1..447faa01c 100644 --- a/tests/unit/tasks/test_image_query_task.py +++ b/tests/unit/tasks/test_image_query_task.py @@ -43,21 +43,21 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag assert task.input.value[2] == image_artifact def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact, image_artifact] + artifacts = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> ListArtifact: - return ListArtifact(value=input) + def callable_input(task: BaseTask) -> ListArtifact: + return ListArtifact(value=artifacts) - task = ImageQueryTask(callable) + task = ImageQueryTask(callable_input) - assert task.input.value == input + assert task.input.value == artifacts def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact, image_artifact] + artifacts = [text_artifact, image_artifact, image_artifact] - task = ImageQueryTask(ListArtifact(value=input)) + task = ImageQueryTask(ListArtifact(value=artifacts)) - assert task.input.value == input + assert task.input.value == artifacts def test_config_image_generation_engine(self, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) diff --git a/tests/unit/tasks/test_inpainting_image_generation_task.py b/tests/unit/tasks/test_inpainting_image_generation_task.py index ff287d79a..61c437bb7 100644 --- a/tests/unit/tasks/test_inpainting_image_generation_task.py +++ b/tests/unit/tasks/test_inpainting_image_generation_task.py @@ -27,20 +27,20 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact, image_artifact] + artifacts = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> ListArtifact: - return ListArtifact(value=list(input)) + def callable_input(task: BaseTask) -> ListArtifact: + return ListArtifact(value=list(artifacts)) - task = InpaintingImageGenerationTask(callable, image_generation_engine=Mock()) + task = InpaintingImageGenerationTask(callable_input, image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifacts def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact] - task = InpaintingImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + artifacts = [text_artifact, image_artifact] + task = InpaintingImageGenerationTask(ListArtifact(artifacts), image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifacts def test_bad_input(self, image_artifact): with pytest.raises(ValueError): diff --git a/tests/unit/tasks/test_outpainting_image_generation_task.py b/tests/unit/tasks/test_outpainting_image_generation_task.py index 7de530330..593451120 100644 --- a/tests/unit/tasks/test_outpainting_image_generation_task.py +++ b/tests/unit/tasks/test_outpainting_image_generation_task.py @@ -27,20 +27,20 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact, image_artifact] + artifacts = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> ListArtifact: - return ListArtifact(input) + def callable_input(task: BaseTask) -> ListArtifact: + return ListArtifact(artifacts) - task = OutpaintingImageGenerationTask(callable, image_generation_engine=Mock()) + task = OutpaintingImageGenerationTask(callable_input, image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifacts def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact] - task = OutpaintingImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + artifacts = [text_artifact, image_artifact] + task = OutpaintingImageGenerationTask(ListArtifact(artifacts), image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifacts def test_bad_input(self, image_artifact): with pytest.raises(ValueError): diff --git a/tests/unit/tasks/test_prompt_image_generation_task.py b/tests/unit/tasks/test_prompt_image_generation_task.py index c3add5720..1c4b639fb 100644 --- a/tests/unit/tasks/test_prompt_image_generation_task.py +++ b/tests/unit/tasks/test_prompt_image_generation_task.py @@ -19,10 +19,10 @@ def test_string_input(self): def test_callable_input(self): input_artifact = TextArtifact("some text input") - def callable(task: BaseTask) -> TextArtifact: + def callable_input(task: BaseTask) -> TextArtifact: return input_artifact - task = PromptImageGenerationTask(callable, image_generation_engine=Mock()) + task = PromptImageGenerationTask(callable_input, image_generation_engine=Mock()) assert task.input == input_artifact diff --git a/tests/unit/tasks/test_text_to_speech_task.py b/tests/unit/tasks/test_text_to_speech_task.py index 86bc1d2ce..bf1f19d5a 100644 --- a/tests/unit/tasks/test_text_to_speech_task.py +++ b/tests/unit/tasks/test_text_to_speech_task.py @@ -17,10 +17,10 @@ def test_string_input(self): def test_callable_input(self): input_artifact = TextArtifact("some text input") - def callable(task: BaseTask) -> TextArtifact: + def callable_input(task: BaseTask) -> TextArtifact: return input_artifact - task = TextToSpeechTask(callable, text_to_speech_engine=Mock()) + task = TextToSpeechTask(callable_input, text_to_speech_engine=Mock()) assert task.input == input_artifact diff --git a/tests/unit/tasks/test_variation_image_generation_task.py b/tests/unit/tasks/test_variation_image_generation_task.py index 3f865931f..a910fb8e0 100644 --- a/tests/unit/tasks/test_variation_image_generation_task.py +++ b/tests/unit/tasks/test_variation_image_generation_task.py @@ -27,20 +27,20 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact] + artifacts = [text_artifact, image_artifact] - def callable(task: BaseTask) -> ListArtifact: - return ListArtifact(input) + def callable_input(task: BaseTask) -> ListArtifact: + return ListArtifact(artifacts) - task = VariationImageGenerationTask(callable, image_generation_engine=Mock()) + task = VariationImageGenerationTask(callable_input, image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifacts def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input = [text_artifact, image_artifact] - task = VariationImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + artifact_input = [text_artifact, image_artifact] + task = VariationImageGenerationTask(ListArtifact(artifact_input), image_generation_engine=Mock()) - assert task.input.value == input + assert task.input.value == artifact_input def test_bad_input(self, image_artifact): with pytest.raises(ValueError): From 331a36b0a4f7cbfc2b954d243b1a5ade9d081df9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 18 Jul 2024 11:42:49 -0700 Subject: [PATCH 176/238] Fix cohere link (#994) --- .../drivers/prompt-drivers.md | 30 +++++-------------- docs/griptape-framework/misc/events.md | 2 +- docs/griptape-framework/tools/index.md | 5 +++- 3 files changed, 12 insertions(+), 25 deletions(-) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index bc6142d3d..a438e985e 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -56,15 +56,10 @@ print(result.value) Griptape offers the following Prompt Drivers for interacting with LLMs. -!!! warning - When overriding a default Prompt Driver, take care to ensure you've updated the Structure's configured Embedding Driver as well. If Task Memory isn't needed, you can avoid compatibility issues by setting `task_memory=None` to disable Task Memory in your Structure. - ### OpenAI Chat -!!! info - This driver uses [OpenAi function calling](https://platform.openai.com/docs/guides/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - The [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat_prompt_driver.md) connects to the [OpenAI Chat](https://platform.openai.com/docs/guides/chat) API. +This driver uses [OpenAi function calling](https://platform.openai.com/docs/guides/function-calling) when using [Tools](../tools/index.md). ```python import os @@ -126,10 +121,8 @@ agent.run("How do I init and update a git submodule?") ### Azure OpenAI Chat -!!! info - This driver uses [Azure OpenAi function calling](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - The [AzureOpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/azure_openai_chat_prompt_driver.md) connects to Azure OpenAI [Chat Completion](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference) APIs. +This driver uses [Azure OpenAi function calling](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling) when using [Tools](../tools/index.md). ```python import os @@ -160,14 +153,12 @@ agent.run("Artificial intelligence is a technology with great promise.") ### Cohere -The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_driver.md) connects to the Cohere [Generate](https://docs.cohere.ai/reference/generate) API. +The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_driver.md) connects to the Cohere [Chat](https://docs.cohere.com/docs/chat-api) API. +This driver uses [Cohere tool use](https://docs.cohere.com/docs/tools) when using [Tools](../tools/index.md). !!! info This driver requires the `drivers-prompt-cohere` [extra](../index.md#extras). -!!! info - This driver uses [Cohere tool use](https://docs.cohere.com/docs/tools) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - ```python import os from griptape.structures import Agent @@ -191,10 +182,8 @@ agent.run('What is the sentiment of this review? Review: "I really enjoyed this !!! info This driver requires the `drivers-prompt-anthropic` [extra](../index.md#extras). -!!! info - This driver uses [Anthropic tool use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - The [AnthropicPromptDriver](../../reference/griptape/drivers/prompt/anthropic_prompt_driver.md) connects to the Anthropic [Messages](https://docs.anthropic.com/claude/reference/messages_post) API. +This driver uses [Anthropic tool use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) when using [Tools](../tools/index.md). ```python import os @@ -219,10 +208,8 @@ agent.run('Where is the best place to see cherry blossums in Japan?') !!! info This driver requires the `drivers-prompt-google` [extra](../index.md#extras). -!!! info - This driver uses [Gemini function calling](https://ai.google.dev/gemini-api/docs/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - The [GooglePromptDriver](../../reference/griptape/drivers/prompt/google_prompt_driver.md) connects to the [Google Generative AI](https://ai.google.dev/tutorials/python_quickstart#generate_text_from_text_inputs) API. +This driver uses [Gemini function calling](https://ai.google.dev/gemini-api/docs/function-calling) when using [Tools](../tools/index.md). ```python import os @@ -247,10 +234,8 @@ agent.run('Briefly explain how a computer works to a young child.') !!! info This driver requires the `drivers-prompt-amazon-bedrock` [extra](../index.md#extras). -!!! info - This drivers uses [Bedrock tool use](https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. - The [AmazonBedrockPromptDriver](../../reference/griptape/drivers/prompt/amazon_bedrock_prompt_driver.md) uses [Amazon Bedrock](https://aws.amazon.com/bedrock/)'s [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). +This driver uses [Bedrock tool use](https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html) when using [Tools](../tools/index.md). All models supported by the Converse API are available for use with this driver. @@ -316,7 +301,6 @@ agent.run("What color is the sky at different times of the day?") The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_hub_prompt_driver.md) connects to the [Hugging Face Hub API](https://huggingface.co/docs/hub/api). - !!! warning Not all models featured on the Hugging Face Hub are supported by this driver. Models that are not supported by [Hugging Face serverless inference](https://huggingface.co/docs/api-inference/en/index) will not work with this driver. diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index 851b5f382..dff54ec4e 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -171,7 +171,7 @@ pipeline.config.prompt_driver.stream = True pipeline.add_tasks(ToolkitTask("Based on https://griptape.ai, tell me what griptape is.", tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)])) for artifact in Stream(pipeline).run(): - print(artifact.value, end="", flush=True), + print(artifact.value, end="", flush=True) ``` diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 05fc94501..fecfd6cd7 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -1,7 +1,10 @@ ## Overview One of the most powerful features of Griptape is the ability to use tools that can interact with the outside world. -Many of our [Prompt Drivers](../drivers/prompt-drivers.md) leverage the native function calling built into the LLMs. For LLMs that don't support this, Griptape provides its own implementation using the [ReAct](https://arxiv.org/abs/2210.03629) technique. +Many of our [Prompt Drivers](../drivers/prompt-drivers.md) leverage the native function calling built into the LLMs. +For LLMs that don't support this, Griptape provides its own implementation using the [ReAct](https://arxiv.org/abs/2210.03629) technique. + +You can switch between the two strategies by setting `use_native_tools` to `True` (LLM-native tool calling) or `False` (Griptape tool calling) on your [Prompt Driver][../drivers/prompt-drivers.md]. ## Tools Here is an example of a Pipeline using Tools: From 4dc5ae06a3db74b4be7ee24b273be228a12812c8 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 18 Jul 2024 16:29:22 -0700 Subject: [PATCH 177/238] Migrate to sqlalchemy 2, make sqlalchemy an optional dependency (#1000) --- CHANGELOG.md | 4 + griptape/drivers/sql/sql_driver.py | 17 +- .../vector/pgvector_vector_store_driver.py | 9 +- poetry.lock | 167 +++++++++--------- pyproject.toml | 16 +- 5 files changed, 105 insertions(+), 108 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79e3dd5db..b4b813a2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `EventListener.publish_event`'s `flush` argument is now a keyword-only argument. - **BREAKING**: `BaseEventListenerDriver.publish_event`'s `flush` argument is now a keyword-only argument. - **BREAKING**: Renamed `DummyException` to `DummyError` for pep8 naming compliance. +- **BREAKING**: Migrate to `sqlalchemy` 2.0. +- **BREAKING**: Make `sqlalchemy` an optional dependency. +- **BREAKING**: Rename `drivers-sql-redshift` to `drivers-sql-amazon-redshift` +- Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. diff --git a/griptape/drivers/sql/sql_driver.py b/griptape/drivers/sql/sql_driver.py index 5a3a4f5b2..0e3d1d4b7 100644 --- a/griptape/drivers/sql/sql_driver.py +++ b/griptape/drivers/sql/sql_driver.py @@ -33,28 +33,23 @@ def execute_query(self, query: str) -> Optional[list[BaseSqlDriver.RowResult]]: def execute_query_raw(self, query: str) -> Optional[list[dict[str, Optional[Any]]]]: sqlalchemy = import_optional_dependency("sqlalchemy") - with self.engine.begin() as con: + with self.engine.connect() as con: results = con.execute(sqlalchemy.text(query)) if results is not None: if results.returns_rows: - return [dict(result.items()) for result in results] + return [dict(result._mapping) for result in results] else: - return None + con.commit() else: raise ValueError("No result found") def get_table_schema(self, table_name: str, schema: Optional[str] = None) -> Optional[str]: sqlalchemy = import_optional_dependency("sqlalchemy") + sqlalchemy_exc = import_optional_dependency("sqlalchemy.exc") try: - table = sqlalchemy.Table( - table_name, - sqlalchemy.MetaData(bind=self.engine), - schema=schema, - autoload=True, - autoload_with=self.engine, - ) + table = sqlalchemy.Table(table_name, sqlalchemy.MetaData(), schema=schema, autoload_with=self.engine) return str([(c.name, c.type) for c in table.columns]) - except sqlalchemy.exc.NoSuchTableError: + except sqlalchemy_exc.NoSuchTableError: return None diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index ec266030a..0dbf96d9c 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -11,6 +11,7 @@ from sqlalchemy.engine import Engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session +from sqlalchemy.sql import text from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency @@ -58,6 +59,8 @@ def validate_engine(self, _: Attribute, engine: Optional[Engine]) -> None: def __attrs_post_init__(self) -> None: if self.engine is None: + if self.connection_string is None: + raise ValueError("An engine or connection string is required") self.engine = cast(Engine, create_engine(self.connection_string, **self.create_engine_params)) def setup( @@ -69,10 +72,12 @@ def setup( ) -> None: """Provides a mechanism to initialize the database schema and extensions.""" if install_uuid_extension: - self.engine.execute('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";') + with self.engine.begin() as conn: + conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";')) if install_vector_extension: - self.engine.execute('CREATE EXTENSION IF NOT EXISTS "vector";') + with self.engine.begin() as conn: + conn.execute(text('CREATE EXTENSION IF NOT EXISTS "vector";')) if create_schema: self._model.metadata.create_all(self.engine) diff --git a/poetry.lock b/poetry.lock index 3ae72743c..322b71d92 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1736,7 +1736,7 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "greenlet" version = "3.0.3" description = "Lightweight in-process concurrent programming" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, @@ -4868,7 +4868,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -5575,18 +5574,18 @@ secure-local-storage = ["keyring (>=23.1.0,<25.0.0)"] [[package]] name = "snowflake-sqlalchemy" -version = "1.5.3" +version = "1.6.1" description = "Snowflake SQLAlchemy Dialect" optional = true python-versions = ">=3.8" files = [ - {file = "snowflake_sqlalchemy-1.5.3-py3-none-any.whl", hash = "sha256:0a4aa3f391797b22dd7658892f906191fd1d44870503ae7ca9278cddce6e5b89"}, - {file = "snowflake_sqlalchemy-1.5.3.tar.gz", hash = "sha256:79191ec3febfb32bcffecd66f2a7dd561bd571345ea4bccbf41cc1fb5c0682ff"}, + {file = "snowflake_sqlalchemy-1.6.1-py3-none-any.whl", hash = "sha256:06f5eac0f864f5634e7bcec4b87cdb77044723b9135c02bab426ba15382effee"}, + {file = "snowflake_sqlalchemy-1.6.1.tar.gz", hash = "sha256:792cde928c0d1d30714b88b0404de81ed297a7745cbcc253dcda973f65759382"}, ] [package.dependencies] snowflake-connector-python = "<4.0.0" -sqlalchemy = ">=1.4.19,<2.0.0" +sqlalchemy = ">=1.4.19" [package.extras] development = ["mock", "numpy", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytz"] @@ -5616,98 +5615,91 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.52" +version = "2.0.31" description = "Database Abstraction Library" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +optional = true +python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-1.4.52-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win32.whl", hash = "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win_amd64.whl", hash = "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win32.whl", hash = "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win_amd64.whl", hash = "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win32.whl", hash = "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win_amd64.whl", hash = "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win32.whl", hash = "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win_amd64.whl", hash = "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win32.whl", hash = "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win_amd64.whl", hash = "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win32.whl", hash = "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win_amd64.whl", hash = "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win32.whl", hash = "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win_amd64.whl", hash = "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680"}, - {file = "SQLAlchemy-1.4.52.tar.gz", hash = "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] -[[package]] -name = "sqlalchemy-redshift" -version = "0.8.14" -description = "Amazon Redshift Dialect for sqlalchemy" -optional = true -python-versions = ">=3.4" -files = [ - {file = "sqlalchemy-redshift-0.8.14.tar.gz", hash = "sha256:1f1f78d8ef7febaf0553d64fe247fc08acbfec84d8e1d2dc8264c656cc623622"}, - {file = "sqlalchemy_redshift-0.8.14-py2.py3-none-any.whl", hash = "sha256:cfdfae2c8fb3043c181e2baedd4ee425c1ca7efed20f3c5ae274838d1015f919"}, -] - -[package.dependencies] -packaging = "*" -SQLAlchemy = ">=0.9.2,<2.0.0" - [[package]] name = "stack-data" version = "0.6.3" @@ -6751,7 +6743,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6775,15 +6767,15 @@ drivers-prompt-huggingface = ["huggingface-hub"] drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-ollama = ["ollama"] drivers-rerank-cohere = ["cohere"] -drivers-sql-postgres = ["pgvector", "psycopg2-binary"] -drivers-sql-redshift = ["boto3", "sqlalchemy-redshift"] -drivers-sql-snowflake = ["snowflake-sqlalchemy"] +drivers-sql-amazon-redshift = ["boto3"] +drivers-sql-postgres = ["pgvector", "psycopg2-binary", "sqlalchemy"] +drivers-sql-snowflake = ["snowflake-sqlalchemy", "sqlalchemy"] drivers-vector-amazon-opensearch = ["boto3", "opensearch-py"] drivers-vector-marqo = ["marqo"] drivers-vector-mongodb = ["pymongo"] drivers-vector-opensearch = ["opensearch-py"] drivers-vector-pinecone = ["pinecone-client"] -drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] +drivers-vector-postgresql = ["pgvector", "psycopg2-binary", "sqlalchemy"] drivers-vector-qdrant = ["qdrant-client"] drivers-vector-redis = ["redis"] drivers-web-scraper-markdownify = ["beautifulsoup4", "markdownify", "playwright"] @@ -6794,8 +6786,9 @@ loaders-dataframe = ["pandas"] loaders-email = ["mail-parser"] loaders-image = ["pillow"] loaders-pdf = ["pypdf"] +loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "9bd25bfc6e645b80acebb1266659832642799443b5f7314dc42487f4e67f1e42" +content-hash = "d3833e71fdc700bf0f2f6303c09a9ebccc55fe14ce712ee84e7b97a60f2da625" diff --git a/pyproject.toml b/pyproject.toml index 08b6ab618..68b99a716 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,6 @@ tenacity = ">=8.0" numpy = ">=1" stringcase = "^1.2.0" docker = "^7.1.0" -sqlalchemy = "~=1.0" requests = "^2.32.0" # drivers @@ -35,8 +34,7 @@ anthropic = { version = "^0.29.0", optional = true } transformers = { version = "^4.39.3", optional = true, extras=["torch"] } huggingface-hub = { version = ">=0.13", optional = true } boto3 = { version = "^1.34.119", optional = true } -sqlalchemy-redshift = { version = "*", optional = true } -snowflake-sqlalchemy = { version = "^1.4.7", optional = true } +snowflake-sqlalchemy = { version = "^1.6.1", optional = true } pinecone-client = { version = "^3", optional = true } pymongo = { version = "*", optional = true } marqo = { version = ">=1.1.0", optional = true } @@ -55,6 +53,7 @@ qdrant-client = { version = ">=1.9.1", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} +sqlalchemy = {version = "^2.0.31", optional = true} opentelemetry-sdk = {version = "^1.25.0", optional = true} opentelemetry-api = {version = "^1.25.0", optional = true} opentelemetry-instrumentation = {version = "^0.46b0", optional = true} @@ -78,9 +77,9 @@ drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-google = ["google-generativeai"] drivers-prompt-ollama = ["ollama"] -drivers-sql-redshift = ["sqlalchemy-redshift", "boto3"] -drivers-sql-snowflake = ["snowflake-sqlalchemy", "snowflake", "snowflake-connector-python"] -drivers-sql-postgres = ["pgvector", "psycopg2-binary"] +drivers-sql-amazon-redshift = ["boto3"] +drivers-sql-snowflake = ["sqlalchemy", "snowflake-sqlalchemy", "snowflake"] +drivers-sql-postgres = ["sqlalchemy", "pgvector", "psycopg2-binary"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] @@ -91,7 +90,7 @@ drivers-vector-mongodb = ["pymongo"] drivers-vector-redis = ["redis"] drivers-vector-opensearch = ["opensearch-py"] drivers-vector-amazon-opensearch = ["opensearch-py", "boto3"] -drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] +drivers-vector-postgresql = ["sqlalchemy", "pgvector", "psycopg2-binary"] drivers-vector-qdrant = ["qdrant-client"] drivers-embedding-amazon-bedrock = ["boto3"] @@ -133,6 +132,7 @@ loaders-pdf = ["pypdf"] loaders-image = ["pillow"] loaders-email = ["mail-parser"] loaders-audio = ["filetype"] +loaders-sql = ["sqlalchemy"] all = [ # drivers @@ -140,7 +140,7 @@ all = [ "anthropic", "hugginface-hub", "transformers", - "sqlalchemy-redshift", + "sqlalchemy", "boto3", "snowflake-sqlalchemy", "snowflake", From 40959cd362ff6bb9676e2c2461a96370035d35b5 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Thu, 18 Jul 2024 18:06:51 -0700 Subject: [PATCH 178/238] Datadog observability driver (#998) --- CHANGELOG.md | 1 + griptape/drivers/__init__.py | 2 ++ .../datadog_observability_driver.py | 22 +++++++++++++++ .../griptape_cloud_observability_driver.py | 3 -- .../open_telemetry_observability_driver.py | 14 ++++++++-- poetry.lock | 4 ++- pyproject.toml | 7 +++++ .../test_datadog_observability_driver.py | 28 +++++++++++++++++++ ...est_open_telemetry_observability_driver.py | 19 +++++++++++-- 9 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 griptape/drivers/observability/datadog_observability_driver.py create mode 100644 tests/unit/drivers/observability/test_datadog_observability_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b4b813a2b..bc364e035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `DummyObservabilityDriver` as a no-op Observability Driver. - `OpenTelemetryObservabilityDriver` for sending observability data to an open telemetry collector or vendor. - `GriptapeCloudObservabilityDriver` for sending observability data to Griptape Cloud. +- `DatadogObservabilityDriver` for sending observability data to a Datadog Agent. - `Observability` context manager for enabling observability and configuring which Observability Driver to use. - `@observable` decorator for selecting which functions/methods to provide observability for. - `GenericArtifact` for storing any data. diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 8d84b68cf..4a516caf9 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -113,6 +113,7 @@ from .observability.no_op_observability_driver import NoOpObservabilityDriver from .observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver from .observability.griptape_cloud_observability_driver import GriptapeCloudObservabilityDriver +from .observability.datadog_observability_driver import DatadogObservabilityDriver __all__ = [ "BasePromptDriver", @@ -211,4 +212,5 @@ "NoOpObservabilityDriver", "OpenTelemetryObservabilityDriver", "GriptapeCloudObservabilityDriver", + "DatadogObservabilityDriver", ] diff --git a/griptape/drivers/observability/datadog_observability_driver.py b/griptape/drivers/observability/datadog_observability_driver.py new file mode 100644 index 000000000..019fd76b6 --- /dev/null +++ b/griptape/drivers/observability/datadog_observability_driver.py @@ -0,0 +1,22 @@ +import os + +from attrs import Factory, define, field +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter +from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from griptape.drivers.observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver + + +@define +class DatadogObservabilityDriver(OpenTelemetryObservabilityDriver): + datadog_agent_endpoint: str = field( + default=Factory(lambda: os.getenv("DD_AGENT_ENDPOINT", "http://localhost:4318")), kw_only=True + ) + span_processor: SpanProcessor = field( + default=Factory( + lambda self: BatchSpanProcessor(OTLPSpanExporter(endpoint=f"{self.datadog_agent_endpoint}/v1/traces")), + takes_self=True, + ), + kw_only=True, + ) diff --git a/griptape/drivers/observability/griptape_cloud_observability_driver.py b/griptape/drivers/observability/griptape_cloud_observability_driver.py index e520def50..eec5f5f90 100644 --- a/griptape/drivers/observability/griptape_cloud_observability_driver.py +++ b/griptape/drivers/observability/griptape_cloud_observability_driver.py @@ -7,7 +7,6 @@ import requests from attrs import Attribute, Factory, define, field -from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter, SpanExportResult from opentelemetry.sdk.util import ns_to_iso_str from opentelemetry.trace import INVALID_SPAN, get_current_span @@ -57,7 +56,6 @@ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: response = requests.post(url=url, json=payload, headers=self.headers) return SpanExportResult.SUCCESS if response.status_code == 200 else SpanExportResult.FAILURE - service_name: str = field(default="griptape-cloud", kw_only=True) base_url: str = field( default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True ) @@ -80,7 +78,6 @@ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: ), kw_only=True, ) - trace_provider: TracerProvider = field(default=Factory(lambda: TracerProvider()), kw_only=True) @structure_run_id.validator # pyright: ignore[reportAttributeAccessIssue] def validate_run_id(self, _: Attribute, structure_run_id: str) -> None: diff --git a/griptape/drivers/observability/open_telemetry_observability_driver.py b/griptape/drivers/observability/open_telemetry_observability_driver.py index fec067a4b..97a5633fb 100644 --- a/griptape/drivers/observability/open_telemetry_observability_driver.py +++ b/griptape/drivers/observability/open_telemetry_observability_driver.py @@ -18,11 +18,13 @@ @define class OpenTelemetryObservabilityDriver(BaseObservabilityDriver): - service_name: str = field(kw_only=True) + service_name: str = field(default="griptape", kw_only=True) span_processor: SpanProcessor = field(kw_only=True) + service_version: Optional[str] = field(default=None, kw_only=True) + deployment_env: Optional[str] = field(default=None, kw_only=True) trace_provider: TracerProvider = field( default=Factory( - lambda self: TracerProvider(resource=Resource(attributes={"service.name": self.service_name})), + lambda self: self._trace_provider_factory(), takes_self=True, ), kw_only=True, @@ -30,6 +32,14 @@ class OpenTelemetryObservabilityDriver(BaseObservabilityDriver): _tracer: Optional[Tracer] = None _root_span_context_manager: Any = None + def _trace_provider_factory(self) -> TracerProvider: + attributes = {"service.name": self.service_name} + if self.service_version is not None: + attributes["service.version"] = self.service_version + if self.deployment_env is not None: + attributes["deployment.environment"] = self.deployment_env + return TracerProvider(resource=Resource(attributes=attributes)) # pyright: ignore[reportArgumentType] + def __attrs_post_init__(self) -> None: self.trace_provider.add_span_processor(self.span_processor) self._tracer = get_tracer(self.service_name, tracer_provider=self.trace_provider) diff --git a/poetry.lock b/poetry.lock index 322b71d92..ca7b11bf2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4868,6 +4868,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -6756,6 +6757,7 @@ drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-pusher = ["pusher"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] +drivers-observability-datadog = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] drivers-observability-griptape-cloud = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] drivers-observability-opentelemetry = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] drivers-prompt-amazon-bedrock = ["anthropic", "boto3"] @@ -6791,4 +6793,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d3833e71fdc700bf0f2f6303c09a9ebccc55fe14ce712ee84e7b97a60f2da625" +content-hash = "a06adf2d65a6b68a9c4bdcbb7320a804f6bc78b4698e5ccffff8dd2620ee9678" diff --git a/pyproject.toml b/pyproject.toml index 68b99a716..04c1cdda6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,6 +126,13 @@ drivers-observability-griptape-cloud = [ "opentelemetry-instrumentation-threading", "opentelemetry-exporter-otlp-proto-http", ] +drivers-observability-datadog = [ + "opentelemetry-sdk", + "opentelemetry-api", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-threading", + "opentelemetry-exporter-otlp-proto-http", +] loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] diff --git a/tests/unit/drivers/observability/test_datadog_observability_driver.py b/tests/unit/drivers/observability/test_datadog_observability_driver.py new file mode 100644 index 000000000..022c87248 --- /dev/null +++ b/tests/unit/drivers/observability/test_datadog_observability_driver.py @@ -0,0 +1,28 @@ +import os +from unittest import mock + +from griptape.drivers import DatadogObservabilityDriver + + +class TestDatadogTelemetryObservabilityDriver: + def test_init(self): + driver = DatadogObservabilityDriver() + + assert driver.service_name == "griptape" + assert driver.datadog_agent_endpoint == "http://localhost:4318" + + @mock.patch.dict(os.environ, {"DD_AGENT_ENDPOINT": "http://griptape.ai:1234"}) + def test_init_env_var_dd_agent(self): + driver = DatadogObservabilityDriver() + + assert driver.datadog_agent_endpoint == "http://griptape.ai:1234" + + def test_init_set_dd_agent(self): + driver = DatadogObservabilityDriver(datadog_agent_endpoint="http://griptape.ai:4321") + + assert driver.datadog_agent_endpoint == "http://griptape.ai:4321" + + def test_init_set_service_name(self): + driver = DatadogObservabilityDriver(service_name="test") + + assert driver.service_name == "test" diff --git a/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py index b903fb1c9..4f7ce50f0 100644 --- a/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py +++ b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py @@ -23,10 +23,23 @@ def span_processor(self, mock_span_exporter): @pytest.fixture() def driver(self, span_processor): - return OpenTelemetryObservabilityDriver(service_name="test", span_processor=span_processor) + return OpenTelemetryObservabilityDriver(span_processor=span_processor) - def test_init(self, span_processor): - OpenTelemetryObservabilityDriver(service_name="test", span_processor=span_processor) + def test_init_no_optional(self, span_processor): + driver = OpenTelemetryObservabilityDriver(span_processor=span_processor) + + assert driver.service_name == "griptape" + assert driver.service_version is None + assert driver.deployment_env is None + + def test_init_all_optional(self, span_processor): + driver = OpenTelemetryObservabilityDriver( + service_name="griptape", service_version="1.0", deployment_env="test", span_processor=span_processor + ) + + assert driver.service_name == "griptape" + assert driver.service_version == "1.0" + assert driver.deployment_env == "test" def test_context_manager_pass(self, driver, mock_span_exporter): expected_spans = ExpectedSpans(spans=[ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK)]) From 384c78f5641b32754e62fc7bc2775fc36bfa4de0 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 19 Jul 2024 06:20:40 -0700 Subject: [PATCH 179/238] Update marqo dependency (#1001) --- CHANGELOG.md | 1 + poetry.lock | 189 +++++++++++++++++++++++++++++++++++-------------- pyproject.toml | 2 +- 3 files changed, 137 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc364e035..e7d2f757a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Make `sqlalchemy` an optional dependency. - **BREAKING**: Rename `drivers-sql-redshift` to `drivers-sql-amazon-redshift` - Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. +- **BREAKING**: Update `marqo` dependency to `^3.7.0`. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. diff --git a/poetry.lock b/poetry.lock index ca7b11bf2..0cd52214d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -152,6 +152,17 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "anthropic" version = "0.29.0" @@ -2707,18 +2718,18 @@ files = [ [[package]] name = "marqo" -version = "3.4.0" +version = "3.7.0" description = "Tensor search for humans" optional = true python-versions = ">=3" files = [ - {file = "marqo-3.4.0-py3-none-any.whl", hash = "sha256:4b1b70f841596f6ae13bab61646286b0a1b5792e0e31815f757c15286fef0570"}, - {file = "marqo-3.4.0.tar.gz", hash = "sha256:d1a0ccc8b938c456e8ed56c2326bcff2b7a4d039496a24394b29d67dafb61b64"}, + {file = "marqo-3.7.0-py3-none-any.whl", hash = "sha256:6f1ff86c3faadb31415bd1adf3e805b2927588c1a5756eeea8fb63097bf94c8a"}, + {file = "marqo-3.7.0.tar.gz", hash = "sha256:d144cf69a41932fc664f04fc994b8c050998bd730b988e1d3fbe6bd20d9c820e"}, ] [package.dependencies] packaging = "*" -pydantic = "<2.0.0" +pydantic = ">=2.0.0" requests = "*" typing-extensions = ">=4.5.0" urllib3 = ">=1.26.0,<2.0.0" @@ -4320,55 +4331,126 @@ files = [ [[package]] name = "pydantic" -version = "1.10.16" -description = "Data validation and settings management using python type hints" +version = "2.8.2" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-1.10.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1a539ac40551b01a85e899829aa43ca8036707474af8d74b48be288d4d2d2846"}, - {file = "pydantic-1.10.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a4fcc7b0b8038dbda2dda642cff024032dfae24a7960cc58e57a39eb1949b9b"}, - {file = "pydantic-1.10.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4660dd697de1ae2d4305a85161312611f64d5360663a9ba026cd6ad9e3fe14c3"}, - {file = "pydantic-1.10.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:900a787c574f903a97d0bf52a43ff3b6cf4fa0119674bcfc0e5fd1056d388ad9"}, - {file = "pydantic-1.10.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d30192a63e6d3334c3f0c0506dd6ae9f1dce7b2f8845518915291393a5707a22"}, - {file = "pydantic-1.10.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:16cf23ed599ca5ca937e37ba50ab114e6b5c387eb43a6cc533701605ad1be611"}, - {file = "pydantic-1.10.16-cp310-cp310-win_amd64.whl", hash = "sha256:8d23111f41d1e19334edd51438fd57933f3eee7d9d2fa8cc3f5eda515a272055"}, - {file = "pydantic-1.10.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef287b8d7fc0e86a8bd1f902c61aff6ba9479c50563242fe88ba39692e98e1e0"}, - {file = "pydantic-1.10.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b9ded699bfd3b3912d796ff388b0c607e6d35d41053d37aaf8fd6082c660de9a"}, - {file = "pydantic-1.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daeb199814333e4426c5e86d7fb610f4e230289f28cab90eb4de27330bef93cf"}, - {file = "pydantic-1.10.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5973843f1fa99ec6c3ac8d1a8698ac9340b35e45cca6c3e5beb5c3bd1ef15de6"}, - {file = "pydantic-1.10.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6b8a7788a8528a558828fe4a48783cafdcf2612d13c491594a8161dc721629c"}, - {file = "pydantic-1.10.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8abaecf54dacc9d991dda93c3b880d41092a8924cde94eeb811d7d9ab55df7d8"}, - {file = "pydantic-1.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:ddc7b682fbd23f051edc419dc6977e11dd2dbdd0cef9d05f0e15d1387862d230"}, - {file = "pydantic-1.10.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:067c2b5539f7839653ad8c3d1fc2f1343338da8677b7b2172abf3cd3fdc8f719"}, - {file = "pydantic-1.10.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d1fc943583c046ecad0ff5d6281ee571b64e11b5503d9595febdce54f38b290"}, - {file = "pydantic-1.10.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18548b30ccebe71d380b0886cc44ea5d80afbcc155e3518792f13677ad06097d"}, - {file = "pydantic-1.10.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4e92292f9580fc5ea517618580fac24e9f6dc5657196e977c194a8e50e14f5a9"}, - {file = "pydantic-1.10.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5da8bc4bb4f85b8c97cc7f11141fddbbd29eb25e843672e5807e19cc3d7c1b7f"}, - {file = "pydantic-1.10.16-cp37-cp37m-win_amd64.whl", hash = "sha256:a04ee1ea34172b87707a6ecfcdb120d7656892206b7c4dbdb771a73e90179fcb"}, - {file = "pydantic-1.10.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4fa86469fd46e732242c7acb83282d33f83591a7e06f840481327d5bf6d96112"}, - {file = "pydantic-1.10.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89c2783dc261726fe7a5ce1121bce29a2f7eb9b1e704c68df2b117604e3b346f"}, - {file = "pydantic-1.10.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78e59fa919fa7a192f423d190d8660c35dd444efa9216662273f36826765424b"}, - {file = "pydantic-1.10.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7e82a80068c77f4b074032e031e642530b6d45cb8121fc7c99faa31fb6c6b72"}, - {file = "pydantic-1.10.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d82d5956cee27a30e26a5b88d00a6a2a15a4855e13c9baf50175976de0dc282c"}, - {file = "pydantic-1.10.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b7b99424cc0970ff08deccb549b5a6ec1040c0b449eab91723e64df2bd8fdca"}, - {file = "pydantic-1.10.16-cp38-cp38-win_amd64.whl", hash = "sha256:d97a35e1ba59442775201657171f601a2879e63517a55862a51f8d67cdfc0017"}, - {file = "pydantic-1.10.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9d91f6866fd3e303c632207813ef6bc4d86055e21c5e5a0a311983a9ac5f0192"}, - {file = "pydantic-1.10.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8d3c71d14c8bd26d2350c081908dbf59d5a6a8f9596d9ef2b09cc1e61c8662b"}, - {file = "pydantic-1.10.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b73e6386b439b4881d79244e9fc1e32d1e31e8d784673f5d58a000550c94a6c0"}, - {file = "pydantic-1.10.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f039881fb2ef86f6de6eacce6e71701b47500355738367413ccc1550b2a69cf"}, - {file = "pydantic-1.10.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3895ddb26f22bdddee7e49741486aa7b389258c6f6771943e87fc00eabd79134"}, - {file = "pydantic-1.10.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55b945da2756b5cef93d792521ad0d457fdf2f69fd5a2d10a27513f5281717dd"}, - {file = "pydantic-1.10.16-cp39-cp39-win_amd64.whl", hash = "sha256:22dd265c77c3976a34be78409b128cb84629284dfd1b69d2fa1507a36f84dc8b"}, - {file = "pydantic-1.10.16-py3-none-any.whl", hash = "sha256:aa2774ba5412fd1c5cb890d08e8b0a3bb5765898913ba1f61a65a4810f03cf29"}, - {file = "pydantic-1.10.16.tar.gz", hash = "sha256:8bb388f6244809af69ee384900b10b677a69f1980fdc655ea419710cffcb5610"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyee" @@ -4868,7 +4950,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -6264,13 +6345,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -6793,4 +6874,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a06adf2d65a6b68a9c4bdcbb7320a804f6bc78b4698e5ccffff8dd2620ee9678" +content-hash = "c3078839442b9b1546e2d90b6bbf5a70cdcb3ba92f6384685c17615171fd4cc0" diff --git a/pyproject.toml b/pyproject.toml index 04c1cdda6..12fc49199 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ boto3 = { version = "^1.34.119", optional = true } snowflake-sqlalchemy = { version = "^1.6.1", optional = true } pinecone-client = { version = "^3", optional = true } pymongo = { version = "*", optional = true } -marqo = { version = ">=1.1.0", optional = true } +marqo = { version = "^3.7.0", optional = true } redis = { version = "^4.6.0", optional = true } opensearch-py = { version = "^2.3.1", optional = true } pgvector = { version = "^0.2.3", optional = true } From 3767c86d11503c777402917f3cd27bcea902eddb Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 22 Jul 2024 10:49:31 -0400 Subject: [PATCH 180/238] Add flake8-logging and flake8-logging-format ruff rules (#999) --- .../event_listener/base_event_listener_driver.py | 4 ++-- .../vector/opensearch_vector_store_driver.py | 2 +- .../drivers/vector/qdrant_vector_store_driver.py | 2 +- griptape/engines/rag/stages/query_rag_stage.py | 2 +- griptape/engines/rag/stages/response_rag_stage.py | 4 ++-- griptape/engines/rag/stages/retrieval_rag_stage.py | 10 ++++++---- .../structure/summary_conversation_memory.py | 2 +- griptape/tasks/actions_subtask.py | 12 ++++++------ griptape/tasks/base_audio_generation_task.py | 4 ++-- griptape/tasks/base_audio_input_task.py | 4 ++-- griptape/tasks/base_image_generation_task.py | 2 +- griptape/tasks/base_multi_text_input_task.py | 4 ++-- griptape/tasks/base_task.py | 2 +- griptape/tasks/base_text_input_task.py | 4 ++-- griptape/tasks/prompt_task.py | 4 ++-- griptape/tokenizers/base_tokenizer.py | 8 ++++++-- griptape/tools/computer/tool.py | 4 ++-- griptape/tools/google_drive/tool.py | 2 +- griptape/tools/openweather_client/tool.py | 14 ++++++++++---- pyproject.toml | 4 +++- 20 files changed, 54 insertions(+), 40 deletions(-) diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 97d7e5cfa..9f7cb79fb 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -1,8 +1,8 @@ from __future__ import annotations +import logging from abc import ABC, abstractmethod from concurrent import futures -from logging import Logger from typing import TYPE_CHECKING, Callable from attrs import Factory, define, field @@ -10,7 +10,7 @@ if TYPE_CHECKING: from griptape.events import BaseEvent -logger = Logger(__name__) +logger = logging.getLogger(__name__) @define diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 403ee18a4..e701e4084 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -93,7 +93,7 @@ def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Opti else: return None except Exception as e: - logging.error(f"Error while loading entry: {e}") + logging.exception("Error while loading entry: %s", e) return None def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index 4b88b9d5c..c33b7eb2e 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -84,7 +84,7 @@ def delete_vector(self, vector_id: str) -> None: points_selector=import_optional_dependency("qdrant_client.http.models").PointIdsList(points=[vector_id]), ) if deletion_response.status == import_optional_dependency("qdrant_client.http.models").UpdateStatus.COMPLETED: - logging.info(f"ID {vector_id} is successfully deleted") + logging.info("ID %s is successfully deleted", vector_id) def query( self, diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 5f9ccd019..7340e4aed 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -24,7 +24,7 @@ def modules(self) -> Sequence[BaseRagModule]: return self.query_modules def run(self, context: RagContext) -> RagContext: - logging.info(f"QueryStage: running {len(self.query_modules)} query generation modules in parallel") + logging.info("QueryStage: running %s query generation modules in parallel", len(self.query_modules)) with self.futures_executor_fn() as executor: utils.execute_futures_list([executor.submit(r.run, context) for r in self.query_modules]) diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py index ac4451a34..b63b5bc21 100644 --- a/griptape/engines/rag/stages/response_rag_stage.py +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -36,7 +36,7 @@ def modules(self) -> list[BaseRagModule]: return ms def run(self, context: RagContext) -> RagContext: - logging.info(f"GenerationStage: running {len(self.before_response_modules)} before modules sequentially") + logging.info("GenerationStage: running %s before modules sequentially", len(self.before_response_modules)) for generator in self.before_response_modules: context = generator.run(context) @@ -45,7 +45,7 @@ def run(self, context: RagContext) -> RagContext: context = self.response_module.run(context) - logging.info(f"GenerationStage: running {len(self.after_response_modules)} after modules sequentially") + logging.info("GenerationStage: running %s after modules sequentially", len(self.after_response_modules)) for generator in self.after_response_modules: context = generator.run(context) diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index d0a92031e..50b84abfc 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -33,7 +33,7 @@ def modules(self) -> list[BaseRagModule]: return ms def run(self, context: RagContext) -> RagContext: - logging.info(f"RetrievalStage: running {len(self.retrieval_modules)} retrieval modules in parallel") + logging.info("RetrievalStage: running %s retrieval modules in parallel", len(self.retrieval_modules)) with self.futures_executor_fn() as executor: results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.retrieval_modules]) @@ -47,14 +47,16 @@ def run(self, context: RagContext) -> RagContext: chunks_after_dedup = len(results) logging.info( - f"RetrievalStage: deduplicated {chunks_before_dedup - chunks_after_dedup} " - f"chunks ({chunks_before_dedup} - {chunks_after_dedup})", + "RetrievalStage: deduplicated %s " "chunks (%s - %s)", + chunks_before_dedup - chunks_after_dedup, + chunks_before_dedup, + chunks_after_dedup, ) context.text_chunks = [a for a in results if isinstance(a, TextArtifact)] if self.rerank_module: - logging.info(f"RetrievalStage: running rerank module on {chunks_after_dedup} chunks") + logging.info("RetrievalStage: running rerank module on %s chunks", chunks_after_dedup) context.text_chunks = [a for a in self.rerank_module.run(context) if isinstance(a, TextArtifact)] diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index 17c3601c5..f29bbb767 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -84,6 +84,6 @@ def summarize_runs(self, previous_summary: str | None, runs: list[Run]) -> str | else: return previous_summary except Exception as e: - logging.error(f"Error summarizing memory: {type(e).__name__}({e})") + logging.exception("Error summarizing memory: %s(%s)", type(e).__name__, e) return previous_summary diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 0a00fba42..d691906c9 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -74,7 +74,7 @@ def attach_to(self, parent_task: BaseTask) -> None: else: self.__init_from_artifacts(self.input) except Exception as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nError parsing tool action: {e}") + self.structure.logger.error("Subtask %s\nError parsing tool action: %s", self.origin_task.id, e) self.output = ErrorArtifact(f"ToolAction input parsing error: {e}", exception=e) @@ -116,7 +116,7 @@ def run(self) -> BaseArtifact: actions_output.append(output) self.output = ListArtifact(actions_output) except Exception as e: - self.structure.logger.error(f"Subtask {self.id}\n{e}", exc_info=True) + self.structure.logger.exception("Subtask %s\n%s", self.id, e) self.output = ErrorArtifact(str(e), exception=e) if self.output is not None: @@ -157,7 +157,7 @@ def after_run(self) -> None: subtask_actions=self.actions_to_dicts(), ), ) - self.structure.logger.info(f"Subtask {self.id}\nResponse: {response}") + self.structure.logger.info("Subtask %s\nResponse: %s", self.id, response) def actions_to_dicts(self) -> list[dict]: json_list = [] @@ -245,7 +245,7 @@ def __parse_actions(self, actions_matches: list[str]) -> None: self.actions = [self.__process_action_object(action_object) for action_object in actions_list] except json.JSONDecodeError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid actions JSON: {e}") + self.structure.logger.exception("Subtask %s\nInvalid actions JSON: %s", self.origin_task.id, e) self.output = ErrorArtifact(f"Actions JSON decoding error: {e}", exception=e) @@ -302,10 +302,10 @@ def __validate_action(self, action: ToolAction) -> None: if activity_schema: activity_schema.validate(action.input) except schema.SchemaError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") + self.structure.logger.exception("Subtask %s\nInvalid action JSON: %s", self.origin_task.id, e) action.output = ErrorArtifact(f"Activity input JSON validation error: {e}", exception=e) except SyntaxError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") + self.structure.logger.exception("Subtask %s\nSyntax error: %s", self.origin_task.id, e) action.output = ErrorArtifact(f"Syntax error: {e}", exception=e) diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index 0a730e3b2..d2657561d 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -13,9 +13,9 @@ class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, def before_run(self) -> None: super().before_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_audio_input_task.py b/griptape/tasks/base_audio_input_task.py index 0991a6014..517c03a15 100644 --- a/griptape/tasks/base_audio_input_task.py +++ b/griptape/tasks/base_audio_input_task.py @@ -30,9 +30,9 @@ def input(self, value: AudioArtifact | Callable[[BaseTask], AudioArtifact]) -> N def before_run(self) -> None: super().before_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 2f5d46475..73b3cd42b 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -59,6 +59,6 @@ def all_negative_rulesets(self) -> list[Ruleset]: return task_rulesets def _read_from_file(self, path: str) -> MediaArtifact: - self.structure.logger.info(f"Reading image from {os.path.abspath(path)}") + self.structure.logger.info("Reading image from %s", os.path.abspath(path)) with open(path, "rb") as file: return ImageLoader().load(file.read()) diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 010ffa10c..a0d8cb9ac 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -48,9 +48,9 @@ def before_run(self) -> None: super().before_run() joined_input = "\n".join([i.to_text() for i in self.input]) - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {joined_input}") + self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, joined_input) def after_run(self) -> None: super().after_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 9efe37002..3b9f937a1 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -139,7 +139,7 @@ def execute(self) -> Optional[BaseArtifact]: self.after_run() except Exception as e: - self.structure.logger.error(f"{self.__class__.__name__} {self.id}\n{e}", exc_info=True) + self.structure.logger.exception("%s %s\n%s", self.__class__.__name__, self.id, e) self.output = ErrorArtifact(str(e), exception=e) finally: diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index d94cdf734..90f60efcd 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -36,9 +36,9 @@ def input(self, value: str | TextArtifact | Callable[[BaseTask], TextArtifact]) def before_run(self) -> None: super().before_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 350ca4ce0..e5319a803 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -81,12 +81,12 @@ def default_system_template_generator(self, _: PromptTask) -> str: def before_run(self) -> None: super().before_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) def run(self) -> BaseArtifact: message = self.prompt_driver.run(self.prompt_stack) diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 7bdfe523a..0d2277caf 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -50,7 +50,9 @@ def _default_max_input_tokens(self) -> int: if tokens is None: logging.warning( - f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_INPUT_TOKENS, using default value of {self.DEFAULT_MAX_INPUT_TOKENS}.", + "Model %s not found in MODEL_PREFIXES_TO_MAX_INPUT_TOKENS, using default value of %s.", + self.model, + self.DEFAULT_MAX_INPUT_TOKENS, ) return self.DEFAULT_MAX_INPUT_TOKENS else: @@ -64,7 +66,9 @@ def _default_max_output_tokens(self) -> int: if tokens is None: logging.warning( - f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS, using default value of {self.DEFAULT_MAX_OUTPUT_TOKENS}.", + "Model %s not found in MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS, using default value of %s.", + self.model, + self.DEFAULT_MAX_OUTPUT_TOKENS, ) return self.DEFAULT_MAX_OUTPUT_TOKENS else: diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 4416cf5fa..f1ed992a5 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -172,7 +172,7 @@ def remove_existing_container(self, name: str) -> None: if isinstance(existing_container, Container): existing_container.remove(force=True) - logging.info(f"Removed existing container: {name}") + logging.info("Removed existing container %s", name) except NotFound: pass @@ -184,7 +184,7 @@ def build_image(self, tool: BaseTool) -> None: image = self.docker_client.images.build(path=temp_dir, tag=self.image_name(tool), rm=True, forcerm=True) if isinstance(image, tuple): - logging.info(f"Built image: {image[0].short_id}") + logging.info("Built image: %s", image[0].short_id) def dependencies(self) -> list[str]: with open(self.requirements_txt_path) as file: diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index d3e84f83a..37122a56b 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -205,7 +205,7 @@ def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: downloaded_files.append(BlobArtifact(request.execute())) else: - logging.error(f"Could not find file: {path}") + logging.error("Could not find file: %s", path) return ListArtifact(downloaded_files) except HttpError as e: diff --git a/griptape/tools/openweather_client/tool.py b/griptape/tools/openweather_client/tool.py index d15bbc87a..4a7edb0f6 100644 --- a/griptape/tools/openweather_client/tool.py +++ b/griptape/tools/openweather_client/tool.py @@ -109,10 +109,12 @@ def _fetch_coordinates(self, location: str) -> Optional[tuple[float, Optional[fl return data[0]["lat"], data[0]["lon"] else: logging.error( - f"Error fetching coordinates. HTTP Status Code: {response.status_code}. Response: {response.text}", + "Error fetching coordinates. HTTP Status Code: %s. Response: %s", + response.status_code, + response.text, ) except Exception as e: - logging.error(f"Error fetching coordinates: {e}") + logging.error("Error fetching coordinates: %s", e) return None @activity( @@ -195,8 +197,12 @@ def _fetch_weather_data(self, request_params: dict) -> ListArtifact | TextArtifa else: return TextArtifact(str(data)) else: - logging.error(f"Error fetching weather data. HTTP Status Code: {response.status_code}") + logging.error( + "Error fetching weather data. HTTP Status Code: %s. Response: %s", + response.status_code, + response.text, + ) return ErrorArtifact("Error fetching weather data from OpenWeather API") except Exception as e: - logging.error(f"Error fetching weather data: {e}") + logging.error("Error fetching weather data: %s", e) return ErrorArtifact(f"Error fetching weather data: {e}") diff --git a/pyproject.toml b/pyproject.toml index 12fc49199..40afd561e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -238,14 +238,16 @@ select = [ "D", # pydocstyle "UP", # pyupgrade "YTT", # flake8-2020 - "ASYNC", # flake8-async "ANN", # flake8-annotations + "ASYNC", # flake8-async "FBT", # flake8-boolean-trap "A", # flake8-builtins "B", # flake8-bugbear "COM", # flake8-commas "C4", # flake8-comprehensions "FA", # flake8-future-annotations + "LOG", # flake8-logging + "G", # flake8-logging-format "T20", # flake8-print "PT", # flake8-pytest-style "SIM", # flake8-simplify From d451653ceb2d9a157a257df8a63c1991a6382650 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 22 Jul 2024 14:10:27 -0400 Subject: [PATCH 181/238] Add era ruff rule (#1002) --- griptape/schemas/polymorphic_schema.py | 1 - pyproject.toml | 1 + tests/mocks/invalid_mock_tool/tool.py | 5 +++-- .../file_manager/test_amazon_s3_file_manager_driver.py | 2 +- .../drivers/file_manager/test_local_file_manager_driver.py | 2 +- tests/unit/drivers/vector/test_marqo_vector_store_driver.py | 5 ----- 6 files changed, 6 insertions(+), 10 deletions(-) diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index f31f7a922..2e556b2c7 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -84,7 +84,6 @@ def load(self, data: Any, *, many: Any = None, partial: Any = None, unknown: Any if not many: try: result = result_data = self._load(data, partial=partial, unknown=unknown, **kwargs) - # result_data.append(result) except ValidationError as error: result_errors = error.normalized_messages() result_data.append(error.valid_data) diff --git a/pyproject.toml b/pyproject.toml index 40afd561e..232f8491d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -253,6 +253,7 @@ select = [ "SIM", # flake8-simplify "TID", # flake8-tidy-imports "TCH", # flake8-type-checking + "ERA", # eradicate "PGH", # pygrep-hooks ] ignore = [ diff --git a/tests/mocks/invalid_mock_tool/tool.py b/tests/mocks/invalid_mock_tool/tool.py index fc761cae5..7ffa4fd0b 100644 --- a/tests/mocks/invalid_mock_tool/tool.py +++ b/tests/mocks/invalid_mock_tool/tool.py @@ -1,3 +1,5 @@ +from typing import Any + from attrs import define, field from schema import Literal, Schema @@ -10,7 +12,6 @@ class InvalidMockTool(BaseTool): configs = { "test": { # no description should make this tool invalid - # "description": "test description", "schema": Schema({Literal("input", description="Test input"): str}), "foo": "bar", } @@ -19,5 +20,5 @@ class InvalidMockTool(BaseTool): test_field: str = field(default="test", kw_only=True, metadata={"env": "TEST_FIELD"}) @activity(config=configs["test"]) - def test(self, value: any) -> str: + def test(self, value: Any) -> str: return f"ack {value}" diff --git a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py index 3af9eb4cc..e3ec78eeb 100644 --- a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py @@ -169,7 +169,7 @@ def test_load_file(self, driver): # existing files with trailing slash ("/", "resources/bitcoin.pdf/", "Path is a directory"), ("/resources", "bitcoin.pdf/", "Path is a directory"), - # directories (not files) + # directories -- not files ("/", "", "Path is a directory"), ("/", "/", "Path is a directory"), ("/", "resources", "Path is a directory"), diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index 23f9ef535..0d2827683 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -144,7 +144,7 @@ def test_load_file(self, driver: LocalFileManagerDriver): # existing files with trailing slash ("/", "resources/bitcoin.pdf/", "Path is a directory"), ("/resources", "bitcoin.pdf/", "Path is a directory"), - # directories (not files) + # directories -- not files ("/", "", "Path is a directory"), ("/", "/", "Path is a directory"), ("/", "resources", "Path is a directory"), diff --git a/tests/unit/drivers/vector/test_marqo_vector_store_driver.py b/tests/unit/drivers/vector/test_marqo_vector_store_driver.py index 5c2399bc5..254a2b3a1 100644 --- a/tests/unit/drivers/vector/test_marqo_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_marqo_vector_store_driver.py @@ -41,7 +41,6 @@ def mock_marqo(self, mocker): fake_get_document_response = { "Blurb": "Test description", "Title": "Test Title", - # '_id': 'article_152', "_id": "5aed93eb-3878-4f12-bc92-0fda01c7d23d", "_tensor_facets": [ {"Title": "Test Title", "_embedding": [-0.10393160581588745, 0.0465407557785511, -0.01760256476700306]}, @@ -122,16 +121,12 @@ def test_search(self, driver, mock_marqo): results = driver.query("Test query") mock_marqo.index().search.assert_called() assert len(results) == 1 - # assert results[0]._id == "5aed93eb-3878-4f12-bc92-0fda01c7d23d" assert results[0].score == 0.6047464 assert results[0].meta["Title"] == "Test Title" assert results[0].meta["Description"] == "Test description" assert results[0].id == "5aed93eb-3878-4f12-bc92-0fda01c7d23d" def test_search_with_include_vectors(self, driver, mock_marqo): - # mock_marqo.index().search.return_value = fake_search_response - # mock_marqo.index().get_document.return_value = fake_get_document_response - # Act results = driver.query("Test query", include_vectors=True) From 16742ca713d94a533126943b9393f86eea133fb7 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 22 Jul 2024 14:26:01 -0400 Subject: [PATCH 182/238] Docs Search Improvements (#1004) --- docs/gen_ref_pages.py | 2 +- docs/griptape-framework/data/artifacts.md | 5 +++++ docs/griptape-framework/data/chunkers.md | 5 +++++ docs/griptape-framework/data/loaders.md | 5 +++++ .../drivers/audio-transcription-drivers.md | 5 +++++ .../drivers/conversation-memory-drivers.md | 5 +++++ .../drivers/embedding-drivers.md | 5 +++++ .../drivers/event-listener-drivers.md | 5 +++++ .../drivers/image-generation-drivers.md | 5 +++++ .../drivers/image-query-drivers.md | 5 +++++ .../drivers/observability-drivers.md | 16 +++++++++++----- .../griptape-framework/drivers/prompt-drivers.md | 5 +++++ docs/griptape-framework/drivers/sql-drivers.md | 5 +++++ .../drivers/structure-run-drivers.md | 5 +++++ .../drivers/text-to-speech-drivers.md | 5 +++++ .../drivers/vector-store-drivers.md | 5 +++++ .../drivers/web-scraper-drivers.md | 5 +++++ .../drivers/web-search-drivers.md | 5 +++++ docs/griptape-framework/engines/audio-engines.md | 5 +++++ .../engines/extraction-engines.md | 5 +++++ .../engines/image-generation-engines.md | 5 +++++ .../engines/image-query-engines.md | 5 +++++ docs/griptape-framework/engines/rag-engines.md | 7 ++++++- .../engines/summary-engines.md | 5 +++++ docs/griptape-framework/misc/events.md | 5 +++++ docs/griptape-framework/misc/tokenizers.md | 5 +++++ docs/griptape-framework/structures/agents.md | 5 +++++ docs/griptape-framework/structures/config.md | 5 +++++ .../structures/conversation-memory.md | 5 +++++ .../structures/observability.md | 7 ++++++- docs/griptape-framework/structures/pipelines.md | 5 +++++ docs/griptape-framework/structures/rulesets.md | 5 +++++ .../griptape-framework/structures/task-memory.md | 5 +++++ docs/griptape-framework/structures/tasks.md | 5 +++++ docs/griptape-framework/structures/workflows.md | 5 +++++ docs/griptape-framework/tools/index.md | 5 +++++ mkdocs.yml | 2 ++ 37 files changed, 186 insertions(+), 8 deletions(-) diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py index 85a3f3127..520eafbdf 100644 --- a/docs/gen_ref_pages.py +++ b/docs/gen_ref_pages.py @@ -32,7 +32,7 @@ def build_reference_docs() -> None: mkdocs_gen_files.set_edit_path(full_doc_path, Path("..") / path) with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: - nav_file.writelines(["---", "search:", "\texclude: true", "---\n"]) + nav_file.writelines(["---\n", "search:\n", "\x20\x20exclude: true\n", "---\n"]) nav_file.writelines(nav.build_literate_nav()) with mkdocs_gen_files.open("reference/griptape/index.md", "w") as index_file: index_file.write( diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index 6fe77574b..c7aa55bd0 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview **[Artifacts](../../reference/griptape/artifacts/base_artifact.md)** are used for passing different types of data between Griptape components. All tools return artifacts that are later consumed by tasks and task memory. diff --git a/docs/griptape-framework/data/chunkers.md b/docs/griptape-framework/data/chunkers.md index b67951b2a..ecaee5eb4 100644 --- a/docs/griptape-framework/data/chunkers.md +++ b/docs/griptape-framework/data/chunkers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Chunkers are used to split arbitrarily long text into chunks of certain token length. diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index dbc578ccd..73116c064 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Loaders are used to load textual data from different sources and chunk it into [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. diff --git a/docs/griptape-framework/drivers/audio-transcription-drivers.md b/docs/griptape-framework/drivers/audio-transcription-drivers.md index c89ef9699..0fba57438 100644 --- a/docs/griptape-framework/drivers/audio-transcription-drivers.md +++ b/docs/griptape-framework/drivers/audio-transcription-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md) extract text from spoken audio. diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index 88063292f..acdb7c202 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 5bbad3e1e..567aa13e4 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Embeddings in Griptape are multidimensional representations of text data. Embeddings carry semantic information, which makes them useful for extracting relevant chunks from large bodies of text for search and querying. diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index 5e73f1a09..73453afb6 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Event Listener Drivers are used to send Griptape [Events](../misc/events.md) to external services. diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md index 95a8bf49b..75316134a 100644 --- a/docs/griptape-framework/drivers/image-generation-drivers.md +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview [Image Generation Drivers](../../reference/griptape/drivers/image_generation/index.md) are used by [image generation Engines](../engines/image-generation-engines.md) to build and execute API calls to image generation models. diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index 6fde89b80..04e3ebaee 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Image Query Drivers are used by [Image Query Engines](../engines/image-query-engines.md) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. diff --git a/docs/griptape-framework/drivers/observability-drivers.md b/docs/griptape-framework/drivers/observability-drivers.md index 8c2c5d2a5..fbe1a1319 100644 --- a/docs/griptape-framework/drivers/observability-drivers.md +++ b/docs/griptape-framework/drivers/observability-drivers.md @@ -1,4 +1,9 @@ -# Observability Drivers +--- +search: + boost: 2 +--- + +## Overview Observability Drivers are used by [Observability](../structures/observability.md) to send telemetry (metrics and traces) related to the execution of an LLM application. The telemetry can be used to monitor the application and to diagnose and troubleshoot issues. All Observability Drivers implement the following methods: @@ -6,7 +11,10 @@ Observability Drivers are used by [Observability](../structures/observability.md * `__exit__()` tears down the Driver. * `observe()` wraps all functions and methods marked with the `@observable` decorator. At a bare minimum, implementations call the wrapped function and return its result (a no-op). This enables the Driver to generate telemetry related to the invocation's call arguments, return values, exceptions, latency, etc. -## Griptape Cloud + +## Observability Drivers + +### Griptape Cloud !!! info This driver requires the `drivers-observability-griptape-cloud` [extra](../index.md#extras). @@ -34,7 +42,7 @@ with Observability(observability_driver=observability_driver): ``` -## OpenTelemetry +### OpenTelemetry !!! info This driver requires the `drivers-observability-opentelemetry` [extra](../index.md#extras). @@ -188,5 +196,3 @@ Output (only relevant because of use of `ConsoleSpanExporter`): } } ``` - - diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index a438e985e..8be1a7c3d 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Prompt Drivers are used by Griptape Structures to make API calls to the underlying LLMs. [OpenAi Chat](#openai-chat) is the default prompt driver used in all structures. diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md index c0f8e9f99..2ca249fec 100644 --- a/docs/griptape-framework/drivers/sql-drivers.md +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview SQL drivers can be used to make SQL queries and load table schemas. They are used by the [SqlLoader](../../reference/griptape/loaders/sql_loader.md) to process data. All loaders implement the following methods: diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index bba3de524..5916d6e20 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Structure Run Drivers can be used to run Griptape Structures in a variety of runtime environments. When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Client](../../griptape-tools/official-tools/structure-run-client.md) you can create complex, multi-agent pipelines that span multiple runtime environments. diff --git a/docs/griptape-framework/drivers/text-to-speech-drivers.md b/docs/griptape-framework/drivers/text-to-speech-drivers.md index 5f1823fdc..0b27647ac 100644 --- a/docs/griptape-framework/drivers/text-to-speech-drivers.md +++ b/docs/griptape-framework/drivers/text-to-speech-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md) are used by [Text To Speech Engines](../engines/audio-engines.md) to build and execute API calls to audio generation models. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index c1f54ab2e..d88e5fc33 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Griptape provides a way to build drivers for vector DBs where embeddings can be stored and queried. Every Vector Store Driver implements the following methods: diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index 8c05a3df2..afebe6622 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Web Scraper Drivers can be used to scrape text from the web. They are used by [WebLoader](../../reference/griptape/loaders/web_loader.md) to provide its functionality. All Web Scraper Drivers implement the following methods: diff --git a/docs/griptape-framework/drivers/web-search-drivers.md b/docs/griptape-framework/drivers/web-search-drivers.md index b06c8d0a5..4b8692214 100644 --- a/docs/griptape-framework/drivers/web-search-drivers.md +++ b/docs/griptape-framework/drivers/web-search-drivers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Web Search Drivers can be used to search for links from a search query. They are used by [WebSearch](../../reference/griptape/tools/web_search/tool.md) to provide its functionality. All Web Search Drivers implement the following methods: diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md index 6494d5365..e857bf77b 100644 --- a/docs/griptape-framework/engines/audio-engines.md +++ b/docs/griptape-framework/engines/audio-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview [Audio Generation Engines](../../reference/griptape/engines/audio/index.md) facilitate audio generation. Audio Generation Engines provides a `run` method that accepts the necessary inputs for its particular mode and provides the request to the configured [Driver](../drivers/text-to-speech-drivers.md). diff --git a/docs/griptape-framework/engines/extraction-engines.md b/docs/griptape-framework/engines/extraction-engines.md index 101f81ba8..496560968 100644 --- a/docs/griptape-framework/engines/extraction-engines.md +++ b/docs/griptape-framework/engines/extraction-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Extraction Engines in Griptape facilitate the extraction of data from text formats such as CSV and JSON. These engines play a crucial role in the functionality of [Extraction Tasks](../../griptape-framework/structures/tasks.md). diff --git a/docs/griptape-framework/engines/image-generation-engines.md b/docs/griptape-framework/engines/image-generation-engines.md index 9d38fd197..600600060 100644 --- a/docs/griptape-framework/engines/image-generation-engines.md +++ b/docs/griptape-framework/engines/image-generation-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview [Image Generation Engines](../../reference/griptape/engines/image/index.md) facilitate text-to-image and image-to-image generation. Each Engine provides a `run` method that accepts the necessary inputs for its particular mode and provides the request to the configured [Driver](../drivers/image-generation-drivers.md). diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md index def6cbd5d..1db247cb7 100644 --- a/docs/griptape-framework/engines/image-query-engines.md +++ b/docs/griptape-framework/engines/image-query-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Image Query Engines The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) allows you to perform natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md index 9d71aaa80..dc09d6de9 100644 --- a/docs/griptape-framework/engines/rag-engines.md +++ b/docs/griptape-framework/engines/rag-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## RAG Engines !!! note @@ -69,4 +74,4 @@ engine = RagEngine( print( engine.process_query("what are Griptape agents?").output.to_text() ) -``` \ No newline at end of file +``` diff --git a/docs/griptape-framework/engines/summary-engines.md b/docs/griptape-framework/engines/summary-engines.md index e6960c0fb..d699a2283 100644 --- a/docs/griptape-framework/engines/summary-engines.md +++ b/docs/griptape-framework/engines/summary-engines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Summary engines are used to summarize text and collections of [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index dff54ec4e..1f50fd6d0 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview You can use [EventListener](../../reference/griptape/events/event_listener.md)s to listen for events during a Structure's execution. diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index a6df1c388..1211987a9 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Tokenizers are used throughout Griptape to calculate the number of [tokens](https://learn.microsoft.com/en-us/semantic-kernel/prompt-engineering/tokens) in a piece of text. diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 581e72082..33363198f 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview An [Agent](../../reference/griptape/structures/agent.md) is the quickest way to get started with Griptape. diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index ef4bc4864..3f510eb86 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview The [StructureConfig](../../reference/griptape/config/structure_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. diff --git a/docs/griptape-framework/structures/conversation-memory.md b/docs/griptape-framework/structures/conversation-memory.md index 1707a2ad9..19d79c702 100644 --- a/docs/griptape-framework/structures/conversation-memory.md +++ b/docs/griptape-framework/structures/conversation-memory.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview You can use Conversation Memory to give Griptape Structures the ability to keep track of the conversation across runs. All structures are created with [ConversationMemory](../../reference/griptape/memory/structure/conversation_memory.md) by default. diff --git a/docs/griptape-framework/structures/observability.md b/docs/griptape-framework/structures/observability.md index 5a9e9c51c..69af849e6 100644 --- a/docs/griptape-framework/structures/observability.md +++ b/docs/griptape-framework/structures/observability.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview The [Observability](../../reference/griptape/observability/observability.md) context manager sends telemetry (metrics and traces) for all functions and methods annotated with the `@observable` decorator to a destination of your choice. This is useful for monitoring and debugging your application. @@ -54,4 +59,4 @@ observability_driver = GriptapeCloudObservabilityDriver() with Observability(observability_driver=observability_driver): my_function() MyClass().my_method() -``` \ No newline at end of file +``` diff --git a/docs/griptape-framework/structures/pipelines.md b/docs/griptape-framework/structures/pipelines.md index dcf549995..4753ad52d 100644 --- a/docs/griptape-framework/structures/pipelines.md +++ b/docs/griptape-framework/structures/pipelines.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview A [Pipeline](../../reference/griptape/structures/pipeline.md) is very similar to an [Agent](../../reference/griptape/structures/agent.md), but allows for multiple tasks. diff --git a/docs/griptape-framework/structures/rulesets.md b/docs/griptape-framework/structures/rulesets.md index f245579b7..324973b71 100644 --- a/docs/griptape-framework/structures/rulesets.md +++ b/docs/griptape-framework/structures/rulesets.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview A [Ruleset](../../reference/griptape/rules/ruleset.md) can be used to define rules for [Structures](../structures/agents.md) and [Tasks](../structures/tasks.md). diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 24f0c6363..ea4a787f6 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview Task Memory is a powerful feature of Griptape that allows you to control where the data returned by [Tools](../tools/index.md) is stored. This is useful in the following scenarios: diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index ff5f7e5e4..6d479578b 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview A [Task](../../reference/griptape/tasks/index.md) is a purpose-built abstraction for the Large Language Model (LLM). Griptape offers various types of Tasks, each suitable for specific use cases. diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 9490ca1c4..55014796e 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview A [Workflow](../../reference/griptape/structures/workflow.md) is a non-sequential DAG that can be used for complex concurrent scenarios with tasks having multiple inputs. diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index fecfd6cd7..15be7be3c 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -1,3 +1,8 @@ +--- +search: + boost: 2 +--- + ## Overview One of the most powerful features of Griptape is the ability to use tools that can interact with the outside world. diff --git a/mkdocs.yml b/mkdocs.yml index 5c603e4d6..911301f4e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -89,6 +89,7 @@ nav: - Conversation Memory: "griptape-framework/structures/conversation-memory.md" - Rulesets: "griptape-framework/structures/rulesets.md" - Config: "griptape-framework/structures/config.md" + - Observability: "griptape-framework/structures/observability.md" - Tools: - Overview: "griptape-framework/tools/index.md" - Building Custom Tools: "griptape-tools/custom-tools/index.md" @@ -113,6 +114,7 @@ nav: - Text to Speech Drivers: "griptape-framework/drivers/text-to-speech-drivers.md" - Audio Transcription Drivers: "griptape-framework/drivers/audio-transcription-drivers.md" - Web Search Drivers: "griptape-framework/drivers/web-search-drivers.md" + - Observability Drivers: "griptape-framework/drivers/observability-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" From 929e51e10d707d05eace879a78f0af8c018ecd4c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 10:45:24 -0700 Subject: [PATCH 183/238] Pin all dependencies using to minor version (#1007) --- ...mazon_sagemaker_jumpstart_prompt_driver.py | 2 +- .../prompt/huggingface_hub_prompt_driver.py | 2 +- .../huggingface_pipeline_prompt_driver.py | 2 +- griptape/tools/computer/tool.py | 6 +- poetry.lock | 2213 ++++++++--------- pyproject.toml | 38 +- 6 files changed, 1063 insertions(+), 1200 deletions(-) diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index c31e66abc..d7a2f5b0b 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -113,6 +113,6 @@ def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) if isinstance(tokens, list): - return tokens + return tokens # pyright: ignore[reportReturnType] According to the [docs](https://huggingface.co/docs/transformers/main/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.apply_chat_template), the return type is List[int]. else: raise ValueError("Invalid output type.") diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 71244ddf0..657b5747c 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -109,6 +109,6 @@ def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) if isinstance(tokens, list): - return tokens + return tokens # pyright: ignore[reportReturnType] According to the [docs](https://huggingface.co/docs/transformers/main/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.apply_chat_template), the return type is List[int]. else: raise ValueError("Invalid output type.") diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index fb475bdd7..128167f52 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -96,6 +96,6 @@ def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) if isinstance(tokens, list): - return tokens + return tokens # pyright: ignore[reportReturnType] According to the [docs](https://huggingface.co/docs/transformers/main/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.apply_chat_template), the return type is List[int]. else: raise ValueError("Invalid output type.") diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index f1ed992a5..9ab290137 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -98,14 +98,14 @@ def execute_command(self, params: dict) -> BaseArtifact: def execute_command_in_container(self, command: str) -> BaseArtifact: try: - binds = {self.local_workdir: {"bind": self.container_workdir, "mode": "rw"}} + binds = {self.local_workdir: {"bind": self.container_workdir, "mode": "rw"}} if self.local_workdir else None - container = self.docker_client.containers.run( + container = self.docker_client.containers.run( # pyright: ignore[reportCallIssue] self.image_name(self), environment=self.env_vars, command=command, name=self.container_name(self), - volumes=binds, + volumes=binds, # pyright: ignore[reportArgumentType] According to the [docs](https://docker-py.readthedocs.io/en/stable/containers.html), the type of `volumes` is dict[str, dict[str, str]]. stdout=True, stderr=True, detach=True, diff --git a/poetry.lock b/poetry.lock index 0cd52214d..bff19148e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -165,13 +165,13 @@ files = [ [[package]] name = "anthropic" -version = "0.29.0" +version = "0.29.2" description = "The official Python library for the anthropic API" optional = true python-versions = ">=3.7" files = [ - {file = "anthropic-0.29.0-py3-none-any.whl", hash = "sha256:d16010715129c8bc3295b74fbf4da73cfb156618bf0abb2d007255983266b76a"}, - {file = "anthropic-0.29.0.tar.gz", hash = "sha256:3eb558a232d83bdf7cdedb75663bf7ff7a8b50cc10acaa9ce6494ff295b8506a"}, + {file = "anthropic-0.29.2-py3-none-any.whl", hash = "sha256:b49804cfe614859a38fe947797cdc59e1ebdf25cc7dfe6c5d9ae0301b9637217"}, + {file = "anthropic-0.29.2.tar.gz", hash = "sha256:466494014471b13ab4004152145ac5b796519b02771a1881ddb6a842f1917110"}, ] [package.dependencies] @@ -190,13 +190,13 @@ vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.3.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -221,24 +221,6 @@ files = [ {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, ] -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = true -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - [[package]] name = "async-timeout" version = "4.0.3" @@ -283,20 +265,31 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "backports-strenum" +version = "1.3.1" +description = "Base class for creating enumerated constants that are also subclasses of str" +optional = false +python-versions = ">=3.8.6,<3.11" +files = [ + {file = "backports_strenum-1.3.1-py3-none-any.whl", hash = "sha256:cdcfe36dc897e2615dc793b7d3097f54d359918fc448754a517e6f23044ccf83"}, + {file = "backports_strenum-1.3.1.tar.gz", hash = "sha256:77c52407342898497714f0596e86188bb7084f89063226f4ba66863482f42414"}, +] + [[package]] name = "backports-tarfile" -version = "1.1.1" +version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" files = [ - {file = "backports.tarfile-1.1.1-py3-none-any.whl", hash = "sha256:73e0179647803d3726d82e76089d01d8549ceca9bace469953fcb4d97cf2d417"}, - {file = "backports_tarfile-1.1.1.tar.gz", hash = "sha256:9c2ef9696cb73374f7164e17fc761389393ca76777036f5aad42e8b93fcd8009"}, + {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, + {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] +testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] [[package]] name = "beautifulsoup4" @@ -321,17 +314,17 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.34.119" +version = "1.34.146" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.119-py3-none-any.whl", hash = "sha256:8f9c43c54b3dfaa36c4a0d7b42c417227a515bc7a2e163e62802780000a5a3e2"}, - {file = "boto3-1.34.119.tar.gz", hash = "sha256:cea2365a25b2b83a97e77f24ac6f922ef62e20636b42f9f6ee9f97188f9c1c03"}, + {file = "boto3-1.34.146-py3-none-any.whl", hash = "sha256:7ec568fb19bce82a70be51f08fddac1ef927ca3fb0896cbb34303a012ba228d8"}, + {file = "boto3-1.34.146.tar.gz", hash = "sha256:5686fe2a6d1aa1de8a88e9589cdcc33361640d3d7a13da718a30717248886124"}, ] [package.dependencies] -botocore = ">=1.34.119,<1.35.0" +botocore = ">=1.34.146,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -340,13 +333,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.34.105" -description = "Type annotations for boto3 1.34.105 generated with mypy-boto3-builder 7.24.0" +version = "1.34.146" +description = "Type annotations for boto3 1.34.146 generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.34.105-py3-none-any.whl", hash = "sha256:ba03524668d5edb5e177d11df7937e769bd52e7d7adbee20762353f72b775eb5"}, - {file = "boto3_stubs-1.34.105.tar.gz", hash = "sha256:6aec0131447885a24db82279609a08130c5d0b0f738dfc70a59ff3f453c04a68"}, + {file = "boto3_stubs-1.34.146-py3-none-any.whl", hash = "sha256:904918cb9d20f0d3744a7ed0863090fef8c1bd82d3bdcafbc94310e5cb36daf7"}, + {file = "boto3_stubs-1.34.146.tar.gz", hash = "sha256:5e4ccbedb7534fca303d5b8c2f1534a9bcd097c686f1f5a9ed82ae7f259bb8d1"}, ] [package.dependencies] @@ -364,8 +357,7 @@ accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)"] account = ["mypy-boto3-account (>=1.34.0,<1.35.0)"] acm = ["mypy-boto3-acm (>=1.34.0,<1.35.0)"] acm-pca = ["mypy-boto3-acm-pca (>=1.34.0,<1.35.0)"] -alexaforbusiness = ["mypy-boto3-alexaforbusiness (>=1.34.0,<1.35.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-alexaforbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-artifact (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-backupstorage (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chatbot (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codeconnections (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-deadline (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-honeycode (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mobile (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53profiles (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-application-signals (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-apptest (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-artifact (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chatbot (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codeconnections (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-deadline (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-mailmanager (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-scep (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qapps (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53profiles (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-taxsettings (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] amp = ["mypy-boto3-amp (>=1.34.0,<1.35.0)"] amplify = ["mypy-boto3-amplify (>=1.34.0,<1.35.0)"] amplifybackend = ["mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)"] @@ -380,11 +372,13 @@ appflow = ["mypy-boto3-appflow (>=1.34.0,<1.35.0)"] appintegrations = ["mypy-boto3-appintegrations (>=1.34.0,<1.35.0)"] application-autoscaling = ["mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)"] application-insights = ["mypy-boto3-application-insights (>=1.34.0,<1.35.0)"] +application-signals = ["mypy-boto3-application-signals (>=1.34.0,<1.35.0)"] applicationcostprofiler = ["mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)"] appmesh = ["mypy-boto3-appmesh (>=1.34.0,<1.35.0)"] apprunner = ["mypy-boto3-apprunner (>=1.34.0,<1.35.0)"] appstream = ["mypy-boto3-appstream (>=1.34.0,<1.35.0)"] appsync = ["mypy-boto3-appsync (>=1.34.0,<1.35.0)"] +apptest = ["mypy-boto3-apptest (>=1.34.0,<1.35.0)"] arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)"] artifact = ["mypy-boto3-artifact (>=1.34.0,<1.35.0)"] athena = ["mypy-boto3-athena (>=1.34.0,<1.35.0)"] @@ -394,7 +388,6 @@ autoscaling-plans = ["mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)"] b2bi = ["mypy-boto3-b2bi (>=1.34.0,<1.35.0)"] backup = ["mypy-boto3-backup (>=1.34.0,<1.35.0)"] backup-gateway = ["mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)"] -backupstorage = ["mypy-boto3-backupstorage (>=1.34.0,<1.35.0)"] batch = ["mypy-boto3-batch (>=1.34.0,<1.35.0)"] bcm-data-exports = ["mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)"] bedrock = ["mypy-boto3-bedrock (>=1.34.0,<1.35.0)"] @@ -402,7 +395,7 @@ bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)"] bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)"] bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.34.0,<1.35.0)"] -boto3 = ["boto3 (==1.34.105)", "botocore (==1.34.105)"] +boto3 = ["boto3 (==1.34.146)", "botocore (==1.34.146)"] braket = ["mypy-boto3-braket (>=1.34.0,<1.35.0)"] budgets = ["mypy-boto3-budgets (>=1.34.0,<1.35.0)"] ce = ["mypy-boto3-ce (>=1.34.0,<1.35.0)"] @@ -522,7 +515,6 @@ groundstation = ["mypy-boto3-groundstation (>=1.34.0,<1.35.0)"] guardduty = ["mypy-boto3-guardduty (>=1.34.0,<1.35.0)"] health = ["mypy-boto3-health (>=1.34.0,<1.35.0)"] healthlake = ["mypy-boto3-healthlake (>=1.34.0,<1.35.0)"] -honeycode = ["mypy-boto3-honeycode (>=1.34.0,<1.35.0)"] iam = ["mypy-boto3-iam (>=1.34.0,<1.35.0)"] identitystore = ["mypy-boto3-identitystore (>=1.34.0,<1.35.0)"] imagebuilder = ["mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)"] @@ -583,6 +575,7 @@ lookoutvision = ["mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)"] m2 = ["mypy-boto3-m2 (>=1.34.0,<1.35.0)"] machinelearning = ["mypy-boto3-machinelearning (>=1.34.0,<1.35.0)"] macie2 = ["mypy-boto3-macie2 (>=1.34.0,<1.35.0)"] +mailmanager = ["mypy-boto3-mailmanager (>=1.34.0,<1.35.0)"] managedblockchain = ["mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)"] managedblockchain-query = ["mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)"] marketplace-agreement = ["mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)"] @@ -608,7 +601,6 @@ migration-hub-refactor-spaces = ["mypy-boto3-migration-hub-refactor-spaces (>=1. migrationhub-config = ["mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)"] migrationhuborchestrator = ["mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)"] migrationhubstrategy = ["mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)"] -mobile = ["mypy-boto3-mobile (>=1.34.0,<1.35.0)"] mq = ["mypy-boto3-mq (>=1.34.0,<1.35.0)"] mturk = ["mypy-boto3-mturk (>=1.34.0,<1.35.0)"] mwaa = ["mypy-boto3-mwaa (>=1.34.0,<1.35.0)"] @@ -632,6 +624,7 @@ panorama = ["mypy-boto3-panorama (>=1.34.0,<1.35.0)"] payment-cryptography = ["mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)"] payment-cryptography-data = ["mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)"] pca-connector-ad = ["mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)"] +pca-connector-scep = ["mypy-boto3-pca-connector-scep (>=1.34.0,<1.35.0)"] personalize = ["mypy-boto3-personalize (>=1.34.0,<1.35.0)"] personalize-events = ["mypy-boto3-personalize-events (>=1.34.0,<1.35.0)"] personalize-runtime = ["mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)"] @@ -645,6 +638,7 @@ polly = ["mypy-boto3-polly (>=1.34.0,<1.35.0)"] pricing = ["mypy-boto3-pricing (>=1.34.0,<1.35.0)"] privatenetworks = ["mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)"] proton = ["mypy-boto3-proton (>=1.34.0,<1.35.0)"] +qapps = ["mypy-boto3-qapps (>=1.34.0,<1.35.0)"] qbusiness = ["mypy-boto3-qbusiness (>=1.34.0,<1.35.0)"] qconnect = ["mypy-boto3-qconnect (>=1.34.0,<1.35.0)"] qldb = ["mypy-boto3-qldb (>=1.34.0,<1.35.0)"] @@ -721,6 +715,7 @@ support = ["mypy-boto3-support (>=1.34.0,<1.35.0)"] support-app = ["mypy-boto3-support-app (>=1.34.0,<1.35.0)"] swf = ["mypy-boto3-swf (>=1.34.0,<1.35.0)"] synthetics = ["mypy-boto3-synthetics (>=1.34.0,<1.35.0)"] +taxsettings = ["mypy-boto3-taxsettings (>=1.34.0,<1.35.0)"] textract = ["mypy-boto3-textract (>=1.34.0,<1.35.0)"] timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)"] timestream-query = ["mypy-boto3-timestream-query (>=1.34.0,<1.35.0)"] @@ -749,13 +744,13 @@ xray = ["mypy-boto3-xray (>=1.34.0,<1.35.0)"] [[package]] name = "botocore" -version = "1.34.119" +version = "1.34.146" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.119-py3-none-any.whl", hash = "sha256:4bdf7926a1290b2650d62899ceba65073dd2693e61c35f5cdeb3a286a0aaa27b"}, - {file = "botocore-1.34.119.tar.gz", hash = "sha256:b253f15b24b87b070e176af48e8ef146516090429d30a7d8b136a4c079b28008"}, + {file = "botocore-1.34.146-py3-none-any.whl", hash = "sha256:3fd4782362bd29c192704ebf859c5c8c5189ad05719e391eefe23088434427ae"}, + {file = "botocore-1.34.146.tar.gz", hash = "sha256:849cb8e54e042443aeabcd7822b5f2b76cb5cfe33fe3a71f91c7c069748a869c"}, ] [package.dependencies] @@ -767,17 +762,17 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.20.9)"] +crt = ["awscrt (==0.20.11)"] [[package]] name = "botocore-stubs" -version = "1.34.94" +version = "1.34.146" description = "Type annotations and code completion for botocore" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "botocore_stubs-1.34.94-py3-none-any.whl", hash = "sha256:b0345f55babd8b901c53804fc5c326a4a0bd2e23e3b71f9ea5d9f7663466e6ba"}, - {file = "botocore_stubs-1.34.94.tar.gz", hash = "sha256:64d80a3467e3b19939e9c2750af33328b3087f8f524998dbdf7ed168227f507d"}, + {file = "botocore_stubs-1.34.146-py3-none-any.whl", hash = "sha256:f77385f2b6af64b04e00dffc0f684879f308c48ce05deefabbec46b290841fc1"}, + {file = "botocore_stubs-1.34.146.tar.gz", hash = "sha256:a7d990c165e3151180a8c1c754183c2f687520117c918bdd6057f26baad4e1d2"}, ] [package.dependencies] @@ -788,13 +783,13 @@ botocore = ["botocore"] [[package]] name = "cachetools" -version = "5.3.3" +version = "5.4.0" description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] [[package]] @@ -998,13 +993,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cohere" -version = "5.5.4" +version = "5.6.2" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-5.5.4-py3-none-any.whl", hash = "sha256:8b692dcb5e86b554e5884168a7d2454951ce102fbd983e9053ec933e06bf02fa"}, - {file = "cohere-5.5.4.tar.gz", hash = "sha256:14acb2ccf272e958f79f9241ae972fd82e96b9b8ee9e6922a5687370761203ec"}, + {file = "cohere-5.6.2-py3-none-any.whl", hash = "sha256:cfecf1343bcaa4091266c5a231fbcb3ccbd80cad05ea093ef80024a117aa3a2f"}, + {file = "cohere-5.6.2.tar.gz", hash = "sha256:6bb901afdfb02f62ad8ed2d82f12d8ea87a6869710f5f880cb89190c4e994805"}, ] [package.dependencies] @@ -1012,9 +1007,10 @@ boto3 = ">=1.34.0,<2.0.0" fastavro = ">=1.9.4,<2.0.0" httpx = ">=0.21.2" httpx-sse = ">=0.4.0,<0.5.0" +parameterized = ">=0.9.0,<0.10.0" pydantic = ">=1.9.2" requests = ">=2.0.0,<3.0.0" -tokenizers = ">=0.15,<0.16" +tokenizers = ">=0.15,<1" types-requests = ">=2.0.0,<3.0.0" typing_extensions = ">=4.0.0" @@ -1031,13 +1027,13 @@ files = [ [[package]] name = "courlan" -version = "1.1.0" +version = "1.2.0" description = "Clean, filter and sample URLs to optimize data collection – includes spam, content type and language filters." optional = true python-versions = ">=3.6" files = [ - {file = "courlan-1.1.0-py3-none-any.whl", hash = "sha256:88354c1e50fde84890c13f58924a5ecc5c0527dcf3eb36e80564fe68e330bb03"}, - {file = "courlan-1.1.0.tar.gz", hash = "sha256:d706684334f18be4ada1fbd57f2680adf0036648f6d840852f7a4822d3adfd8d"}, + {file = "courlan-1.2.0-py3-none-any.whl", hash = "sha256:df9d3735b611e717c52a813a49d17a8b4d3a9d8b87bbace9065171fc5d084397"}, + {file = "courlan-1.2.0.tar.gz", hash = "sha256:0cbc9cac83970c651b937a7823a5d92cbebb6b601454ea0fb6cb4d0ee5d1845d"}, ] [package.dependencies] @@ -1047,63 +1043,63 @@ urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} [[package]] name = "coverage" -version = "7.5.1" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, - {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, - {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, - {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, - {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, - {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, - {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, - {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, - {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, - {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, - {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, - {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, - {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, - {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, - {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, - {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, - {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, - {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, - {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, - {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, - {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, - {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, - {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, - {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, - {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, - {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, - {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, - {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -1114,43 +1110,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -1188,17 +1184,6 @@ calendars = ["convertdate", "hijri-converter"] fasttext = ["fasttext"] langdetect = ["langdetect"] -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = true -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "deprecated" version = "1.2.14" @@ -1293,51 +1278,60 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.1.12" +version = "6.2.1" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = true python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.1.12-py3-none-any.whl", hash = "sha256:1a3c674de4a9307fe7a05b76726c2bf00d8a97c408ff443d07d7c7a8ac264ed2"}, - {file = "duckduckgo_search-6.1.12.tar.gz", hash = "sha256:6e16ddd54ebfa6567702bd371a95d396e54ad7ace2edd1cb7f4f565547eb065c"}, + {file = "duckduckgo_search-6.2.1-py3-none-any.whl", hash = "sha256:1a03f799b85fdfa08d5e6478624683f373b9dc35e6f145544b9cab72a4f575fa"}, + {file = "duckduckgo_search-6.2.1.tar.gz", hash = "sha256:d664ec096193e3fb43bdfae4b0ad9c04e44094b58f41998adcdd20a86ee1ed74"}, ] [package.dependencies] click = ">=8.1.7" -pyreqwest-impersonate = ">=0.4.9" +pyreqwest-impersonate = ">=0.5.0" [package.extras] -dev = ["mypy (>=1.10.1)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.5.0)"] +dev = ["mypy (>=1.10.1)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.5.2)"] lxml = ["lxml (>=5.2.2)"] [[package]] name = "elevenlabs" -version = "1.1.2" +version = "1.5.0" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.1.2-py3-none-any.whl", hash = "sha256:c10742b7175c8b9cd089c7d8c515637449a22e069e4b963993ef2f1bb2fe61db"}, - {file = "elevenlabs-1.1.2.tar.gz", hash = "sha256:9df81038b3586ed68a74df9d2e5848283f6d770d0207df7cd0434a8675f3023c"}, + {file = "elevenlabs-1.5.0-py3-none-any.whl", hash = "sha256:cc28257ad535adf57fdc70c9a3b8ddd6c34166f310bbc11a733523894e73ceca"}, + {file = "elevenlabs-1.5.0.tar.gz", hash = "sha256:d56a282f933e2eb991dac2b09cf7e928f1899f1cb5a9e9fa1d500be6edd7ee1d"}, ] [package.dependencies] httpx = ">=0.21.2" -ipython = ">=7.0" pydantic = ">=1.9.2" requests = ">=2.20" typing_extensions = ">=4.0.0" websockets = ">=11.0" +[[package]] +name = "events" +version = "0.5" +description = "Bringing the elegance of C# EventHandler to Python" +optional = true +python-versions = "*" +files = [ + {file = "Events-0.5-py3-none-any.whl", hash = "sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd"}, +] + [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1357,58 +1351,44 @@ files = [ [package.extras] testing = ["hatch", "pre-commit", "pytest", "tox"] -[[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" -optional = true -python-versions = ">=3.5" -files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - [[package]] name = "fastavro" -version = "1.9.4" +version = "1.9.5" description = "Fast read/write of AVRO files" optional = true python-versions = ">=3.8" files = [ - {file = "fastavro-1.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60cb38f07462a7fb4e4440ed0de67d3d400ae6b3d780f81327bebde9aa55faef"}, - {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063d01d197fc929c20adc09ca9f0ca86d33ac25ee0963ce0b438244eee8315ae"}, - {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a9053fcfbc895f2a16a4303af22077e3a8fdcf1cd5d6ed47ff2ef22cbba2f0"}, - {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:02bf1276b7326397314adf41b34a4890f6ffa59cf7e0eb20b9e4ab0a143a1598"}, - {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56bed9eca435389a8861e6e2d631ec7f8f5dda5b23f93517ac710665bd34ca29"}, - {file = "fastavro-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:0cd2099c8c672b853e0b20c13e9b62a69d3fbf67ee7c59c7271ba5df1680310d"}, - {file = "fastavro-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af8c6d8c43a02b5569c093fc5467469541ac408c79c36a5b0900d3dd0b3ba838"}, - {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a138710bd61580324d23bc5e3df01f0b82aee0a76404d5dddae73d9e4c723f"}, - {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:903d97418120ca6b6a7f38a731166c1ccc2c4344ee5e0470d09eb1dc3687540a"}, - {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c443eeb99899d062dbf78c525e4614dd77e041a7688fa2710c224f4033f193ae"}, - {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac26ab0774d1b2b7af6d8f4300ad20bbc4b5469e658a02931ad13ce23635152f"}, - {file = "fastavro-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:cf7247874c22be856ba7d1f46a0f6e0379a6025f1a48a7da640444cbac6f570b"}, - {file = "fastavro-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68912f2020e1b3d70557260b27dd85fb49a4fc6bfab18d384926127452c1da4c"}, - {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6925ce137cdd78e109abdb0bc33aad55de6c9f2d2d3036b65453128f2f5f5b92"}, - {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b928cd294e36e35516d0deb9e104b45be922ba06940794260a4e5dbed6c192a"}, - {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:90c9838bc4c991ffff5dd9d88a0cc0030f938b3fdf038cdf6babde144b920246"}, - {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca6e54da571b06a3c5a72dbb7212073f56c92a6fbfbf847b91c347510f8a426"}, - {file = "fastavro-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4b02839ac261100cefca2e2ad04cdfedc556cb66b5ec735e0db428e74b399de"}, - {file = "fastavro-1.9.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4451ee9a305a73313a1558d471299f3130e4ecc10a88bf5742aa03fb37e042e6"}, - {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8524fccfb379565568c045d29b2ebf71e1f2c0dd484aeda9fe784ef5febe1a8"}, - {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d0a00a6e09baa20f6f038d7a2ddcb7eef0e7a9980e947a018300cb047091b8"}, - {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23d7e5b29c9bf6f26e8be754b2c8b919838e506f78ef724de7d22881696712fc"}, - {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e6ab3ee53944326460edf1125b2ad5be2fadd80f7211b13c45fa0c503b4cf8d"}, - {file = "fastavro-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:64d335ec2004204c501f8697c385d0a8f6b521ac82d5b30696f789ff5bc85f3c"}, - {file = "fastavro-1.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7e05f44c493e89e73833bd3ff3790538726906d2856f59adc8103539f4a1b232"}, - {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:253c63993250bff4ee7b11fb46cf3a4622180a783bedc82a24c6fdcd1b10ca2a"}, - {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d6942eb1db14640c2581e0ecd1bbe0afc8a83731fcd3064ae7f429d7880cb7"}, - {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d47bb66be6091cd48cfe026adcad11c8b11d7d815a2949a1e4ccf03df981ca65"}, - {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c293897f12f910e58a1024f9c77f565aa8e23b36aafda6ad8e7041accc57a57f"}, - {file = "fastavro-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:f05d2afcb10a92e2a9e580a3891f090589b3e567fdc5641f8a46a0b084f120c3"}, - {file = "fastavro-1.9.4.tar.gz", hash = "sha256:56b8363e360a1256c94562393dc7f8611f3baf2b3159f64fb2b9c6b87b14e876"}, + {file = "fastavro-1.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:61253148e95dd2b6457247b441b7555074a55de17aef85f5165bfd5facf600fc"}, + {file = "fastavro-1.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b604935d671ad47d888efc92a106f98e9440874108b444ac10e28d643109c937"}, + {file = "fastavro-1.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0adbf4956fd53bd74c41e7855bb45ccce953e0eb0e44f5836d8d54ad843f9944"}, + {file = "fastavro-1.9.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:53d838e31457db8bf44460c244543f75ed307935d5fc1d93bc631cc7caef2082"}, + {file = "fastavro-1.9.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:07b6288e8681eede16ff077632c47395d4925c2f51545cd7a60f194454db2211"}, + {file = "fastavro-1.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:ef08cf247fdfd61286ac0c41854f7194f2ad05088066a756423d7299b688d975"}, + {file = "fastavro-1.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c52d7bb69f617c90935a3e56feb2c34d4276819a5c477c466c6c08c224a10409"}, + {file = "fastavro-1.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e05969956003df8fa4491614bc62fe40cec59e94d06e8aaa8d8256ee3aab82"}, + {file = "fastavro-1.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06e6df8527493a9f0d9a8778df82bab8b1aa6d80d1b004e5aec0a31dc4dc501c"}, + {file = "fastavro-1.9.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27820da3b17bc01cebb6d1687c9d7254b16d149ef458871aaa207ed8950f3ae6"}, + {file = "fastavro-1.9.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:195a5b8e33eb89a1a9b63fa9dce7a77d41b3b0cd785bac6044df619f120361a2"}, + {file = "fastavro-1.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:be612c109efb727bfd36d4d7ed28eb8e0506617b7dbe746463ebbf81e85eaa6b"}, + {file = "fastavro-1.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b133456c8975ec7d2a99e16a7e68e896e45c821b852675eac4ee25364b999c14"}, + {file = "fastavro-1.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf586373c3d1748cac849395aad70c198ee39295f92e7c22c75757b5c0300fbe"}, + {file = "fastavro-1.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:724ef192bc9c55d5b4c7df007f56a46a21809463499856349d4580a55e2b914c"}, + {file = "fastavro-1.9.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bfd11fe355a8f9c0416803afac298960eb4c603a23b1c74ff9c1d3e673ea7185"}, + {file = "fastavro-1.9.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9827d1654d7bcb118ef5efd3e5b2c9ab2a48d44dac5e8c6a2327bc3ac3caa828"}, + {file = "fastavro-1.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:d84b69dca296667e6137ae7c9a96d060123adbc0c00532cc47012b64d38b47e9"}, + {file = "fastavro-1.9.5-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:fb744e9de40fb1dc75354098c8db7da7636cba50a40f7bef3b3fb20f8d189d88"}, + {file = "fastavro-1.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:240df8bacd13ff5487f2465604c007d686a566df5cbc01d0550684eaf8ff014a"}, + {file = "fastavro-1.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3bb35c25bbc3904e1c02333bc1ae0173e0a44aa37a8e95d07e681601246e1f1"}, + {file = "fastavro-1.9.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b47a54a9700de3eabefd36dabfb237808acae47bc873cada6be6990ef6b165aa"}, + {file = "fastavro-1.9.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:48c7b5e6d2f3bf7917af301c275b05c5be3dd40bb04e80979c9e7a2ab31a00d1"}, + {file = "fastavro-1.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:05d13f98d4e325be40387e27da9bd60239968862fe12769258225c62ec906f04"}, + {file = "fastavro-1.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5b47948eb196263f6111bf34e1cd08d55529d4ed46eb50c1bc8c7c30a8d18868"}, + {file = "fastavro-1.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85b7a66ad521298ad9373dfe1897a6ccfc38feab54a47b97922e213ae5ad8870"}, + {file = "fastavro-1.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44cb154f863ad80e41aea72a709b12e1533b8728c89b9b1348af91a6154ab2f5"}, + {file = "fastavro-1.9.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7f2b1fe21231fd01f1a2a90e714ae267fe633cd7ce930c0aea33d1c9f4901"}, + {file = "fastavro-1.9.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88fbbe16c61d90a89d78baeb5a34dc1c63a27b115adccdbd6b1fb6f787deacf2"}, + {file = "fastavro-1.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:753f5eedeb5ca86004e23a9ce9b41c5f25eb64a876f95edcc33558090a7f3e4b"}, + {file = "fastavro-1.9.5.tar.gz", hash = "sha256:6419ebf45f88132a9945c51fe555d4f10bb97c236288ed01894f957c6f914553"}, ] [package.extras] @@ -1419,18 +1399,18 @@ zstandard = ["zstandard"] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -1532,13 +1512,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.5.0" +version = "2024.6.1" description = "File-system specification" optional = true python-versions = ">=3.8" files = [ - {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, - {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.extras] @@ -1547,6 +1527,7 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -1618,13 +1599,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-api-core" -version = "2.19.0" +version = "2.19.1" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, ] [package.dependencies] @@ -1639,7 +1620,7 @@ grpcio-status = [ {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -1649,13 +1630,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.134.0" +version = "2.137.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.134.0.tar.gz", hash = "sha256:4a8f0bea651a212997cc83c0f271fc86f80ef93d1cee9d84de7dfaeef2a858b6"}, - {file = "google_api_python_client-2.134.0-py2.py3-none-any.whl", hash = "sha256:ba05d60f6239990b7994f6328f17bb154c602d31860fb553016dc9f8ce886945"}, + {file = "google_api_python_client-2.137.0-py2.py3-none-any.whl", hash = "sha256:a8b5c5724885e5be9f5368739aa0ccf416627da4ebd914b410a090c18f84d692"}, + {file = "google_api_python_client-2.137.0.tar.gz", hash = "sha256:e739cb74aac8258b1886cb853b0722d47c81fe07ad649d7f2206f06530513c04"}, ] [package.dependencies] @@ -1667,13 +1648,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.29.0" +version = "2.32.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, + {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, ] [package.dependencies] @@ -1728,17 +1709,17 @@ dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "py [[package]] name = "googleapis-common-protos" -version = "1.63.0" +version = "1.63.2" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, - {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] @@ -1816,75 +1797,76 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.45.0" +version = "0.48.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.45.0-py3-none-any.whl", hash = "sha256:90fe5c90e1b0ca7dd6fee78f9009f4e01b37dbc9ab484a9b2c1578915db1e571"}, - {file = "griffe-0.45.0.tar.gz", hash = "sha256:85cb2868d026ea51c89bdd589ad3ccc94abc5bd8d5d948e3d4450778a2a05b4a"}, + {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"}, + {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"}, ] [package.dependencies] +backports-strenum = {version = ">=1.3", markers = "python_version < \"3.11\""} colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.63.0" +version = "1.65.1" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.8" files = [ - {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, - {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, - {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, - {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, - {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, - {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, - {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, - {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, - {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, - {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, - {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, - {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, - {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, - {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, - {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, - {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, - {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, - {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, - {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, - {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, - {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, + {file = "grpcio-1.65.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062"}, + {file = "grpcio-1.65.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364"}, + {file = "grpcio-1.65.1-cp310-cp310-win32.whl", hash = "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875"}, + {file = "grpcio-1.65.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad"}, + {file = "grpcio-1.65.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037"}, + {file = "grpcio-1.65.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2"}, + {file = "grpcio-1.65.1-cp311-cp311-win32.whl", hash = "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8"}, + {file = "grpcio-1.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2"}, + {file = "grpcio-1.65.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f"}, + {file = "grpcio-1.65.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff"}, + {file = "grpcio-1.65.1-cp312-cp312-win32.whl", hash = "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177"}, + {file = "grpcio-1.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59"}, + {file = "grpcio-1.65.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83"}, + {file = "grpcio-1.65.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f"}, + {file = "grpcio-1.65.1-cp38-cp38-win32.whl", hash = "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0"}, + {file = "grpcio-1.65.1-cp38-cp38-win_amd64.whl", hash = "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153"}, + {file = "grpcio-1.65.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3"}, + {file = "grpcio-1.65.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e"}, + {file = "grpcio-1.65.1-cp39-cp39-win32.whl", hash = "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57"}, + {file = "grpcio-1.65.1-cp39-cp39-win_amd64.whl", hash = "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c"}, + {file = "grpcio-1.65.1.tar.gz", hash = "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.63.0)"] +protobuf = ["grpcio-tools (>=1.65.1)"] [[package]] name = "grpcio-status" @@ -2102,13 +2084,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.23.0" +version = "0.24.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, - {file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, + {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"}, + {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"}, ] [package.dependencies] @@ -2121,17 +2103,17 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] inference = ["aiohttp", "minijinja (>=1.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["safetensors", "torch"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] @@ -2147,13 +2129,13 @@ files = [ [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -2214,43 +2196,6 @@ files = [ {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, ] -[[package]] -name = "ipython" -version = "8.18.1" -description = "IPython: Productive Interactive Computing" -optional = true -python-versions = ">=3.9" -files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] - [[package]] name = "jaraco-classes" version = "3.4.0" @@ -2305,25 +2250,6 @@ more-itertools = "*" docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -optional = true -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - [[package]] name = "jeepney" version = "0.8.0" @@ -2358,72 +2284,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.2" +version = "0.5.0" description = "Fast iterable JSON parser." optional = true python-versions = ">=3.8" files = [ - {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, - {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, - {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, - {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, - {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, - {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, - {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, - {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, - {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, - {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, - {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, - {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, - {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, ] [[package]] @@ -2439,15 +2365,21 @@ files = [ [[package]] name = "jsondiff" -version = "2.0.0" +version = "2.2.0" description = "Diff JSON and JSON-like structures in Python" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "jsondiff-2.0.0-py3-none-any.whl", hash = "sha256:689841d66273fc88fc79f7d33f4c074774f4f214b6466e3aff0e5adaf889d1e0"}, - {file = "jsondiff-2.0.0.tar.gz", hash = "sha256:2795844ef075ec8a2b8d385c4d59f5ea48b08e7180fce3cb2787be0db00b1fb4"}, + {file = "jsondiff-2.2.0-py3-none-any.whl", hash = "sha256:afff7c0067d934e3f2730935dc3abd520ab7d09021c88d3a9f4272e7d2229a1e"}, + {file = "jsondiff-2.2.0.tar.gz", hash = "sha256:060e9a10fe136c643e9d2bf264ea1fbe966ed17d2fd37348dd65b1c650c2df4f"}, ] +[package.dependencies] +pyyaml = "*" + +[package.extras] +dev = ["build", "hypothesis", "pytest", "setuptools-scm"] + [[package]] name = "justext" version = "3.0.1" @@ -2489,91 +2421,178 @@ testing = ["pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "py [[package]] name = "lxml" -version = "5.1.1" +version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true python-versions = ">=3.6" files = [ - {file = "lxml-5.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9cc30dc3c49ea914fa62ea73b57198b541cf2cd522fcf2b9559f99a24df769bb"}, - {file = "lxml-5.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d0824e3ddb969fe1337b1bc45cf0bec8095b342f36903f41a74b7769cc8c73"}, - {file = "lxml-5.1.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4958c378d9387c45ef8c4859495cf6be76f863e4e3b31494f6ec7f2c48d3b8e3"}, - {file = "lxml-5.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aff34295a6c87638a1f1905355cf3a97e4026c45c0cf3bb6ed6bc35b885b4a33"}, - {file = "lxml-5.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b174885fd2cabd1ad48585296f495e25d607f02db99668c08b2afaceb668e21b"}, - {file = "lxml-5.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1b0611bba10d6f5467b86673e8f6bba4de0d00f7d111eea843bc872abfe11b5c"}, - {file = "lxml-5.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:adff469b7dbfe9f3babc9e4479449ee97085ba70ac492fbe5f0f7217940c6731"}, - {file = "lxml-5.1.1-cp310-cp310-win32.whl", hash = "sha256:99bcdf665576a26b44c7ce767d76b769a4418b0a13cda8300b26fb7b2647bd5b"}, - {file = "lxml-5.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3da8db291568c27b2bb248dcfc8838ca3149f373a24e204bcd1c2c89e2813d14"}, - {file = "lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283"}, - {file = "lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536"}, - {file = "lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b"}, - {file = "lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee"}, - {file = "lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a"}, - {file = "lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4"}, - {file = "lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c"}, - {file = "lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c"}, - {file = "lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14"}, - {file = "lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8"}, - {file = "lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20"}, - {file = "lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20"}, - {file = "lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d"}, - {file = "lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6"}, - {file = "lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2"}, - {file = "lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d"}, - {file = "lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9"}, - {file = "lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9"}, - {file = "lxml-5.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:48dd28b9f410329de709a4bb6169c58f2cd8bff25f5a48d647678ec9b8a40c65"}, - {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf7e57dbe7b3c605e63849d9c8dae246a6ab9002223c57cd3f3dec7c3a0a8e6d"}, - {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5020b3081030b5cfc8149eee231167aea4ff68df73a610e1d542809e1f11fde7"}, - {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77842b79b63c83c04dcfe2f045c78e15e4d97c86838eabd2e6518c1ed97e3900"}, - {file = "lxml-5.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:666432274881cb2535e71dbe745e08ef10fe25c81fbb1a6b1e3c973177823b0c"}, - {file = "lxml-5.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a103426e809640a2d985062d2f4b28db2f0fe4469ff72a67cb31fa70613158f1"}, - {file = "lxml-5.1.1-cp36-cp36m-win32.whl", hash = "sha256:95a51324a55000c55f4ab79e1f7f1e0bc42b7a24e39633f79542753023a9d4b7"}, - {file = "lxml-5.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:bd46b5b19ac969de8e87fb3d04414641d12ee489e2ea6cc75344087829b31c63"}, - {file = "lxml-5.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59ca75cfcf646ff64aa19ca4e7fd2a0fde77268d5a87856525d9e0b69b77d0c4"}, - {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55ddc73dec971277b181a6d1a6abdd34f50e4511e1e60f6b4ebe22cbaad05bb"}, - {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56f1e813ff660d031c77edba90a068d57e47ae93a9e811330fc88946fa68af9a"}, - {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43f21b5929185fa4560836942020bb00a0fcdec9f67be98cac1a4b99501757c1"}, - {file = "lxml-5.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1528b37e83c3aeecb438e76e5be6279b353275560125a9c3f4d74642c5f110f9"}, - {file = "lxml-5.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2992480a25434d2df31413136ef87effab14d43b07f1f54c5012c4f6c7530144"}, - {file = "lxml-5.1.1-cp37-cp37m-win32.whl", hash = "sha256:1d0270d33fbde6e1c6758ff58e2e284144f5331aa05dfe7f44ceafdf4e9d31aa"}, - {file = "lxml-5.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dec3491aa69a91ed07f5e6bc033e2b1a9424447ad5312ee69ac973e94d79083a"}, - {file = "lxml-5.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bd2595ebe95214446e00a1ab94571f778b126e17736ea222c07505c4e092289"}, - {file = "lxml-5.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfbdadc3cfe552331ecb0bbdcabf148d1697c73aa4321151e0e6c1704eeb76a7"}, - {file = "lxml-5.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52358249292bc155af681a9240ec3d944c1195f0124aa10ec4e3635adc1e10a1"}, - {file = "lxml-5.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036b36c48cd775e4fd2084b34ae62ffeefa7a01f955f5a5b816f9257c308cfc0"}, - {file = "lxml-5.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f05ab8cea65363d0cc7ce818f42407504b6d94ca885b4cde0270f021e2f4ef61"}, - {file = "lxml-5.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d94a28c16cc430b68c374b37b8bb536ba5f0a4a080be0e1daa8310c44a00a75c"}, - {file = "lxml-5.1.1-cp38-cp38-win32.whl", hash = "sha256:9113fe65a62f834b8e994c8f48e7b2179bf81878c0ec80ad7feba51ab9417663"}, - {file = "lxml-5.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:acff17e0cd5344677757a152631d8411efac6a84e4476d60123a9b33f5d6c511"}, - {file = "lxml-5.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a94a97380ad689d751eb0a1e1ccd2a0622c5141771a31abe9a16075f80027e95"}, - {file = "lxml-5.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f4d37b3f8d2d44493edce3d65ac987127bababd8ae208a6f0d7d260852346e"}, - {file = "lxml-5.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5940f188189956ccb3d1adb413001ada79f2d2b81087d2612a0cc4a1197eed"}, - {file = "lxml-5.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50007f4e94dc4e38030487a8b6c4af87a2d51ed059c7b74b29e3dd937cb1dfe1"}, - {file = "lxml-5.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305d0469177fd78a0a9aa2231c60218266bb85d4b7955f9b67dab628c9267fd"}, - {file = "lxml-5.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:13b73d78a8023203722cf98e9ea0b222da83110d1d5ef437ef8782a7755b4586"}, - {file = "lxml-5.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc6904519dd1f92eb82f7d49814a33bbc444d0b66b1438e76daf3f79ef4aa38f"}, - {file = "lxml-5.1.1-cp39-cp39-win32.whl", hash = "sha256:04ef231dde88294a5499f61a74cdc42af97d8d5ecec1b0a645d1c7d436942789"}, - {file = "lxml-5.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:071e5123d1eca861708c4be5b54e4d88923fa33fab3aa02722e907518b07071c"}, - {file = "lxml-5.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:19c6bc7476eeac4598ff925ae98597610109e21af4cd7ab1e060efcfc4b1c6e2"}, - {file = "lxml-5.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20cd17eb21f5ae54da96791c49e1fbd3327bf66b2c00556cdf8d0552c2270f92"}, - {file = "lxml-5.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a02ed1ebc469734dbfed5b688f709334de19e7a333cba7ae187b17d2b2c1d4ff"}, - {file = "lxml-5.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:161838cb95c97e8d76d01e544a3570b52ab6b863f4897a90e1f073bb110a75ba"}, - {file = "lxml-5.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1abbf2249467a37da45fb2d7ff37e578dfc9813f142800e58db9da761cb7899"}, - {file = "lxml-5.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6c49eb5deaed1990fde5b5d80d6800aec1b5fd6113346b5f11068d988f68f2c4"}, - {file = "lxml-5.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:60ceffdca5d637fe8ee95c7f06733a6c9646e07da80997efe3af2d4b4f366e36"}, - {file = "lxml-5.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a76a7b35e7660c74eb3f943c19f5f78c882dceab890cf8017027b6100b79ad8e"}, - {file = "lxml-5.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5dcb373720b70aa05419e508265dd86f06886ca0388967f6f024fbc4d551379f"}, - {file = "lxml-5.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3641bc124b037921de4220538a5ebb52354fd2799fc2bbfb335d28096063c7d6"}, - {file = "lxml-5.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a6e9b34f59c9755aa279c652e1c48c333c665d05a88afcd8e5ff0bde86f3b14"}, - {file = "lxml-5.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:318847c165063549c8fda6b162a0d068689b10deb825cb3859caef69fddaaaff"}, - {file = "lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9"}, -] + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.dependencies] +lxml-html-clean = {version = "*", optional = true, markers = "extra == \"html-clean\""} [package.extras] cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.9)"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "lxml-html-clean" +version = "0.1.1" +description = "HTML cleaner from lxml project" +optional = true +python-versions = "*" +files = [ + {file = "lxml_html_clean-0.1.1-py3-none-any.whl", hash = "sha256:58c04176593c9caf72ec92e033d2f38859e918b3eff0cc0f8051ad27dc2ab8ef"}, + {file = "lxml_html_clean-0.1.1.tar.gz", hash = "sha256:8a644ed01dbbe132fabddb9467f077f6dad12a1d4f3a6a553e280f3815fa46df"}, +] + +[package.dependencies] +lxml = "*" [[package]] name = "mail-parser" @@ -2736,13 +2755,13 @@ urllib3 = ">=1.26.0,<2.0.0" [[package]] name = "marshmallow" -version = "3.21.2" +version = "3.21.3" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, - {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, ] [package.dependencies] @@ -2767,20 +2786,6 @@ files = [ [package.dependencies] marshmallow = ">=2.0.0" -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = true -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - [[package]] name = "mdurl" version = "0.1.2" @@ -2908,13 +2913,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.23" +version = "9.5.29" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.23-py3-none-any.whl", hash = "sha256:ffd08a5beaef3cd135aceb58ded8b98bbbbf2b70e5b656f6a14a63c917d9b001"}, - {file = "mkdocs_material-9.5.23.tar.gz", hash = "sha256:4627fc3f15de2cba2bde9debc2fd59b9888ef494beabfe67eb352e23d14bf288"}, + {file = "mkdocs_material-9.5.29-py3-none-any.whl", hash = "sha256:afc1f508e2662ded95f0a35a329e8a5acd73ee88ca07ba73836eb6fcdae5d8b4"}, + {file = "mkdocs_material-9.5.29.tar.gz", hash = "sha256:3e977598ec15a4ddad5c4dfc9e08edab6023edb51e88f0729bd27be77e3d322a"}, ] [package.dependencies] @@ -3037,13 +3042,13 @@ sentinels = "*" [[package]] name = "more-itertools" -version = "10.2.0" +version = "10.3.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" files = [ - {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, - {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, ] [[package]] @@ -3211,13 +3216,13 @@ files = [ [[package]] name = "mypy-boto3-bedrock" -version = "1.34.90" -description = "Type annotations for boto3.Bedrock 1.34.90 service generated with mypy-boto3-builder 7.23.2" +version = "1.34.143" +description = "Type annotations for boto3.Bedrock 1.34.143 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_bedrock-1.34.90-py3-none-any.whl", hash = "sha256:36fbd11b6db51284891b6aa87d16653afa1f57a58e1181cdafcd99e67079d3ca"}, - {file = "mypy_boto3_bedrock-1.34.90.tar.gz", hash = "sha256:a8a71505c6aa268bd182259f79d26d9daa5ae3a27ff471394a424eef2afa78bb"}, + {file = "mypy_boto3_bedrock-1.34.143-py3-none-any.whl", hash = "sha256:5cab5de36736aa8a452f9aeb02ef51548814f1b1e3dfd46d4479d7dc94755c43"}, + {file = "mypy_boto3_bedrock-1.34.143.tar.gz", hash = "sha256:df2e02860c64f8b8df90daed08d4f36817f36e830878cb69c1ec3dbc6ed35cf6"}, ] [package.dependencies] @@ -3239,13 +3244,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-opensearch" -version = "1.34.95" -description = "Type annotations for boto3.OpenSearchService 1.34.95 service generated with mypy-boto3-builder 7.24.0" +version = "1.34.142" +description = "Type annotations for boto3.OpenSearchService 1.34.142 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_opensearch-1.34.95-py3-none-any.whl", hash = "sha256:ddec083f059886f8b3fc2c68bdf3cd810bbf75492a8fc19fef91f974963344e0"}, - {file = "mypy_boto3_opensearch-1.34.95.tar.gz", hash = "sha256:108c6aeb9cf557a6b3aa2346d2bd5842fb0032bdcb6cb8c0f23cda6ed349462f"}, + {file = "mypy_boto3_opensearch-1.34.142-py3-none-any.whl", hash = "sha256:3da8974acecee397691aa786b624f4167bc7e7243c4316c6c64bf7a1676f65a1"}, + {file = "mypy_boto3_opensearch-1.34.142.tar.gz", hash = "sha256:0064f620dd2acb76f3f3dc3e59c081edc760df4bc32b1796ff713233fd404bb0"}, ] [package.dependencies] @@ -3253,13 +3258,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-s3" -version = "1.34.105" -description = "Type annotations for boto3.S3 1.34.105 service generated with mypy-boto3-builder 7.24.0" +version = "1.34.138" +description = "Type annotations for boto3.S3 1.34.138 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_s3-1.34.105-py3-none-any.whl", hash = "sha256:95fbc6bcba2bb03c20a97cc5cf60ff66c6842c8c4fc4183c49bfa35905d5a1ee"}, - {file = "mypy_boto3_s3-1.34.105.tar.gz", hash = "sha256:a137bca9bbe86c0fe35bbf36a2d44ab62526f41bb683550dd6cfbb5a10ede832"}, + {file = "mypy_boto3_s3-1.34.138-py3-none-any.whl", hash = "sha256:47ded5f06accc10ff9db9d55c85cca88e4f028ec360d7cfcea90377e525cba56"}, + {file = "mypy_boto3_s3-1.34.138.tar.gz", hash = "sha256:7f9770d1f0e9f6fc2ced96daf5c0792b2dbbb4a4f874f28200ff3c940d0815c3"}, ] [package.dependencies] @@ -3267,13 +3272,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-sagemaker" -version = "1.34.103" -description = "Type annotations for boto3.SageMaker 1.34.103 service generated with mypy-boto3-builder 7.24.0" +version = "1.34.145" +description = "Type annotations for boto3.SageMaker 1.34.145 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_sagemaker-1.34.103-py3-none-any.whl", hash = "sha256:f00deadbcaf89c9f1af62a23a697e5d5590453fc8211faf9ed84871499d51dad"}, - {file = "mypy_boto3_sagemaker-1.34.103.tar.gz", hash = "sha256:7e2c9dd16866314080c8aa1cbc561301599a87e3dce4759e293090e93ed8b5ef"}, + {file = "mypy_boto3_sagemaker-1.34.145-py3-none-any.whl", hash = "sha256:af9be506bc8788870878f4b332cfd8c2ec27cc2e133977fb7df1df9ac00ae78d"}, + {file = "mypy_boto3_sagemaker-1.34.145.tar.gz", hash = "sha256:ee2317d9297d1c28479a7c7362421a784c1aabf61c6aad3488140db20254ba85"}, ] [package.dependencies] @@ -3315,43 +3320,40 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nh3" -version = "0.2.17" +version = "0.2.18" description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9"}, - {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f"}, - {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71"}, - {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10"}, - {file = "nh3-0.2.17-cp37-abi3-win32.whl", hash = "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911"}, - {file = "nh3-0.2.17-cp37-abi3-win_amd64.whl", hash = "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb"}, - {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, + {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86"}, + {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307"}, + {file = "nh3-0.2.18-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50"}, + {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204"}, + {file = "nh3-0.2.18-cp37-abi3-win32.whl", hash = "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be"}, + {file = "nh3-0.2.18-cp37-abi3-win_amd64.whl", hash = "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844"}, + {file = "nh3-0.2.18.tar.gz", hash = "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4"}, ] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "numpy" version = "1.26.4" @@ -3555,13 +3557,13 @@ httpx = ">=0.27.0,<0.28.0" [[package]] name = "openai" -version = "1.30.1" +version = "1.37.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.30.1-py3-none-any.whl", hash = "sha256:c9fb3c3545c118bbce8deb824397b9433a66d0d0ede6a96f7009c95b76de4a46"}, - {file = "openai-1.30.1.tar.gz", hash = "sha256:4f85190e577cba0b066e1950b8eb9b11d25bc7ebcc43a86b326ce1bfa564ec74"}, + {file = "openai-1.37.0-py3-none-any.whl", hash = "sha256:a903245c0ecf622f2830024acdaa78683c70abb8e9d37a497b851670864c9f73"}, + {file = "openai-1.37.0.tar.gz", hash = "sha256:dc8197fc40ab9d431777b6620d962cc49f4544ffc3011f03ce0a805e6eb54adb"}, ] [package.dependencies] @@ -3578,26 +3580,30 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opensearch-py" -version = "2.5.0" +version = "2.6.0" description = "Python client for OpenSearch" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,<4,>=2.7" +python-versions = "<4,>=3.8" files = [ - {file = "opensearch-py-2.5.0.tar.gz", hash = "sha256:0dde4ac7158a717d92a8cd81964cb99705a4b80bcf9258ba195b9a9f23f5226d"}, - {file = "opensearch_py-2.5.0-py2.py3-none-any.whl", hash = "sha256:cf093a40e272b60663f20417fc1264ac724dcf1e03c1a4542a6b44835b1e6c49"}, + {file = "opensearch_py-2.6.0-py2.py3-none-any.whl", hash = "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"}, + {file = "opensearch_py-2.6.0.tar.gz", hash = "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96"}, ] [package.dependencies] certifi = ">=2022.12.07" +Events = "*" python-dateutil = "*" requests = ">=2.4.0,<3.0.0" six = "*" -urllib3 = ">=1.26.18,<2" +urllib3 = [ + {version = ">=1.26.18,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.26.18,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, +] [package.extras] -async = ["aiohttp (>=3,<4)"] -develop = ["black", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] -docs = ["aiohttp (>=3,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] +async = ["aiohttp (>=3.9.4,<4)"] +develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] +docs = ["aiohttp (>=3.9.4,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] kerberos = ["requests-kerberos"] [[package]] @@ -3727,13 +3733,13 @@ opentelemetry-api = "1.25.0" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -3795,19 +3801,18 @@ pytz = ">=2020.1" test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] [[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" +name = "parameterized" +version = "0.9.0" +description = "Parameterized testing with any Python test framework" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, + {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, + {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, ] [package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] +dev = ["jinja2"] [[package]] name = "pathspec" @@ -3820,20 +3825,6 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = true -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] name = "pgvector" version = "0.2.5" @@ -3849,84 +3840,95 @@ numpy = "*" [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = true python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -3988,18 +3990,18 @@ type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.43.0" +version = "1.45.0" description = "A high-level API to automate web browsers" optional = true python-versions = ">=3.8" files = [ - {file = "playwright-1.43.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b03b12bd4da9c2cfb78dff820deac8b52892fe3c2f89a4d95d6f08c59e41deb9"}, - {file = "playwright-1.43.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e9ec21b141727392f630761c7f4dec46d80c98243614257cc501b64ff636d337"}, - {file = "playwright-1.43.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:e05a8d8fb2040c630429cca07e843c8fa33059717837c8f50c01b7d1fc651ce1"}, - {file = "playwright-1.43.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:50d9a5c07c76456945a2296d63f78fdf6eb11aed3e8d39bb5ccbda760a8d6d41"}, - {file = "playwright-1.43.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87191272c40b4c282cf2c9449ca3acaf705f38ac6e2372270f1617ce16b661b8"}, - {file = "playwright-1.43.0-py3-none-win32.whl", hash = "sha256:bd8b818904b17e2914be23e7bc2a340b203f57fe81678520b10f908485b056ea"}, - {file = "playwright-1.43.0-py3-none-win_amd64.whl", hash = "sha256:9b7bd707eeeaebee47f656b2de90aa9bd85e9ca2c6af7a08efd73896299e4d50"}, + {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"}, + {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"}, + {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"}, + {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"}, + {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"}, + {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"}, ] [package.dependencies] @@ -4023,13 +4025,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.1" description = "Wraps the portalocker recipe for easy usage" optional = true python-versions = ">=3.8" files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, ] [package.dependencies] @@ -4069,36 +4071,22 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" -[[package]] -name = "prompt-toolkit" -version = "3.0.43" -description = "Library for building powerful interactive command lines in Python" -optional = true -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "proto-plus" -version = "1.23.0" +version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, ] [package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" @@ -4230,31 +4218,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = true -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -optional = true -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - [[package]] name = "pusher" version = "3.3.2" @@ -4520,71 +4483,61 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pymongo" -version = "4.7.2" +version = "4.8.0" description = "Python driver for MongoDB " optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pymongo-4.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca"}, - {file = "pymongo-4.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0"}, - {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155"}, - {file = "pymongo-4.7.2-cp310-cp310-win32.whl", hash = "sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95"}, - {file = "pymongo-4.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e"}, - {file = "pymongo-4.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9"}, - {file = "pymongo-4.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802"}, - {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a"}, - {file = "pymongo-4.7.2-cp311-cp311-win32.whl", hash = "sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f"}, - {file = "pymongo-4.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a"}, - {file = "pymongo-4.7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6"}, - {file = "pymongo-4.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861"}, - {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95"}, - {file = "pymongo-4.7.2-cp312-cp312-win32.whl", hash = "sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29"}, - {file = "pymongo-4.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4"}, - {file = "pymongo-4.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de"}, - {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd"}, - {file = "pymongo-4.7.2-cp37-cp37m-win32.whl", hash = "sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e"}, - {file = "pymongo-4.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062"}, - {file = "pymongo-4.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71"}, - {file = "pymongo-4.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed"}, - {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054"}, - {file = "pymongo-4.7.2-cp38-cp38-win32.whl", hash = "sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb"}, - {file = "pymongo-4.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f"}, - {file = "pymongo-4.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621"}, - {file = "pymongo-4.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028"}, - {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002"}, - {file = "pymongo-4.7.2-cp39-cp39-win32.whl", hash = "sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803"}, - {file = "pymongo-4.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86"}, - {file = "pymongo-4.7.2.tar.gz", hash = "sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7"}, + {file = "pymongo-4.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2b7bec27e047e84947fbd41c782f07c54c30c76d14f3b8bf0c89f7413fac67a"}, + {file = "pymongo-4.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c68fe128a171493018ca5c8020fc08675be130d012b7ab3efe9e22698c612a1"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920d4f8f157a71b3cb3f39bc09ce070693d6e9648fb0e30d00e2657d1dca4e49"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b4108ac9469febba18cea50db972605cc43978bedaa9fea413378877560ef8"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180d5eb1dc28b62853e2f88017775c4500b07548ed28c0bd9c005c3d7bc52526"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec2b9088cdbceb87e6ca9c639d0ff9b9d083594dda5ca5d3c4f6774f4c81b33"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0cf61450feadca81deb1a1489cb1a3ae1e4266efd51adafecec0e503a8dcd84"}, + {file = "pymongo-4.8.0-cp310-cp310-win32.whl", hash = "sha256:8b18c8324809539c79bd6544d00e0607e98ff833ca21953df001510ca25915d1"}, + {file = "pymongo-4.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e5df28f74002e37bcbdfdc5109799f670e4dfef0fb527c391ff84f078050e7b5"}, + {file = "pymongo-4.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b50040d9767197b77ed420ada29b3bf18a638f9552d80f2da817b7c4a4c9c68"}, + {file = "pymongo-4.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:417369ce39af2b7c2a9c7152c1ed2393edfd1cbaf2a356ba31eb8bcbd5c98dd7"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf821bd3befb993a6db17229a2c60c1550e957de02a6ff4dd0af9476637b2e4d"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9365166aa801c63dff1a3cb96e650be270da06e3464ab106727223123405510f"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8b8582f4209c2459b04b049ac03c72c618e011d3caa5391ff86d1bda0cc486"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e5019f75f6827bb5354b6fef8dfc9d6c7446894a27346e03134d290eb9e758"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5802151fc2b51cd45492c80ed22b441d20090fb76d1fd53cd7760b340ff554"}, + {file = "pymongo-4.8.0-cp311-cp311-win32.whl", hash = "sha256:4bf58e6825b93da63e499d1a58de7de563c31e575908d4e24876234ccb910eba"}, + {file = "pymongo-4.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b747c0e257b9d3e6495a018309b9e0c93b7f0d65271d1d62e572747f4ffafc88"}, + {file = "pymongo-4.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6a720a3d22b54183352dc65f08cd1547204d263e0651b213a0a2e577e838526"}, + {file = "pymongo-4.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31e4d21201bdf15064cf47ce7b74722d3e1aea2597c6785882244a3bb58c7eab"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b804bb4f2d9dc389cc9e827d579fa327272cdb0629a99bfe5b83cb3e269ebf"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fbdb87fe5075c8beb17a5c16348a1ea3c8b282a5cb72d173330be2fecf22f5"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd39455b7ee70aabee46f7399b32ab38b86b236c069ae559e22be6b46b2bbfc4"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940d456774b17814bac5ea7fc28188c7a1338d4a233efbb6ba01de957bded2e8"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:236bbd7d0aef62e64caf4b24ca200f8c8670d1a6f5ea828c39eccdae423bc2b2"}, + {file = "pymongo-4.8.0-cp312-cp312-win32.whl", hash = "sha256:47ec8c3f0a7b2212dbc9be08d3bf17bc89abd211901093e3ef3f2adea7de7a69"}, + {file = "pymongo-4.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84bc7707492f06fbc37a9f215374d2977d21b72e10a67f1b31893ec5a140ad8"}, + {file = "pymongo-4.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:519d1bab2b5e5218c64340b57d555d89c3f6c9d717cecbf826fb9d42415e7750"}, + {file = "pymongo-4.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87075a1feb1e602e539bdb1ef8f4324a3427eb0d64208c3182e677d2c0718b6f"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f53429515d2b3e86dcc83dadecf7ff881e538c168d575f3688698a8707b80a"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdc20cd1e1141b04696ffcdb7c71e8a4a665db31fe72e51ec706b3bdd2d09f36"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:284d0717d1a7707744018b0b6ee7801b1b1ff044c42f7be7a01bb013de639470"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5bf0eb8b6ef40fa22479f09375468c33bebb7fe49d14d9c96c8fd50355188b0"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecd71b9226bd1d49416dc9f999772038e56f415a713be51bf18d8676a0841c8"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0061af6e8c5e68b13f1ec9ad5251247726653c5af3c0bbdfbca6cf931e99216"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:658d0170f27984e0d89c09fe5c42296613b711a3ffd847eb373b0dbb5b648d5f"}, + {file = "pymongo-4.8.0-cp38-cp38-win32.whl", hash = "sha256:3ed1c316718a2836f7efc3d75b4b0ffdd47894090bc697de8385acd13c513a70"}, + {file = "pymongo-4.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7148419eedfea9ecb940961cfe465efaba90595568a1fb97585fb535ea63fe2b"}, + {file = "pymongo-4.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8400587d594761e5136a3423111f499574be5fd53cf0aefa0d0f05b180710b0"}, + {file = "pymongo-4.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af3e98dd9702b73e4e6fd780f6925352237f5dce8d99405ff1543f3771201704"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3a860f037bb51f968de320baef85090ff0bbb42ec4f28ec6a5ddf88be61871"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fc18b3a093f3db008c5fea0e980dbd3b743449eee29b5718bc2dc15ab5088bb"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c9d8f975dd7194c37193583fd7d1eb9aea0c21ee58955ecf35362239ff31ac"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:408b2f8fdbeca3c19e4156f28fff1ab11c3efb0407b60687162d49f68075e63c"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6564780cafd6abeea49759fe661792bd5a67e4f51bca62b88faab497ab5fe89"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d18d86bc9e103f4d3d4f18b85a0471c0e13ce5b79194e4a0389a224bb70edd53"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9097c331577cecf8034422956daaba7ec74c26f7b255d718c584faddd7fa2e3c"}, + {file = "pymongo-4.8.0-cp39-cp39-win32.whl", hash = "sha256:d5428dbcd43d02f6306e1c3c95f692f68b284e6ee5390292242f509004c9e3a8"}, + {file = "pymongo-4.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:ef7225755ed27bfdb18730c68f6cb023d06c28f2b734597480fb4c0e500feb6f"}, + {file = "pymongo-4.8.0.tar.gz", hash = "sha256:454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde"}, ] [package.dependencies] @@ -4592,6 +4545,7 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] @@ -4627,17 +4581,17 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyopenssl" -version = "24.1.0" +version = "24.2.1" description = "Python wrapper module around the OpenSSL library" optional = true python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, - {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, + {file = "pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d"}, + {file = "pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95"}, ] [package.dependencies] -cryptography = ">=41.0.5,<43" +cryptography = ">=41.0.5,<44" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] @@ -4680,59 +4634,19 @@ image = ["Pillow (>=8.0.0)"] [[package]] name = "pyreqwest-impersonate" -version = "0.4.9" +version = "0.5.2" description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" optional = true python-versions = ">=3.8" files = [ - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a229f56575d992df0c520d93408b4b6b660b304387af06208e7b97d739cce2ff"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c00dbfd0ed878bed231384cd0c823d71a42220ae73c6d982b6fe77d2870338ca"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d4e6ce0e48b73740f08b1aa69cdbded5d66f4eec327d5eaf2ac42a4fce1a008"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690a5c5615b33cbab340e3a4247256ede157ebf39a02f563cff5356bf61c0c51"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7231511ee14faee27b90a84ec74e15515b7e2d1c389710698660765eaed6e2fd"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2fdbe8e146e595c02fa0afb776d70f9e3b351122e2de9af15934b83f3a548ecd"}, - {file = "pyreqwest_impersonate-0.4.9-cp310-none-win_amd64.whl", hash = "sha256:982b0e53db24c084675a056944dd769aa07cd1378abf972927f3f1afb23e08b0"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:60b1102b8aec7bbf91e0f7b8bbc3507776731a9acc6844de764911e8d64f7dd2"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37150478157e683374517d4c0eae0f991b8f5280067a8ee042b6a72fec088843"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc77cd1cdae22dad7549a4e9a1a4630619c2ff443add1b28c7d607accda81eb"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e99e627d13f1f60d71ce2c2a2b03e1c7f57e8f6a73bde2827ff97cb96f1683"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72d1adb73264db8c5e24d073d558a895d6690d13a5e38fd857b8b01c33fcbabf"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6253bd8a104316bbece0e6c658d28292f0bf37a99cccfaf476470b98252d185b"}, - {file = "pyreqwest_impersonate-0.4.9-cp311-none-win_amd64.whl", hash = "sha256:7e25628a900236fc76320e790fce90e5502371994523c476af2b1c938382f5fa"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:57e1e7f3bfc175c3229947cdd2b26564bcea2923135b8dec8ab157609e201a7c"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3aeb1c834f54fe685d3c7c0bec65dd981bd988fa3725ee3c7b5656eb7c44a1f7"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27bc384f18099573817d7ed68d12eb67d33dfc5d2b30ab2ac5a69cdf19c22b6f"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd604444ddf86ed222b49dd5e3f050c4c0e980dd7be0b3ea0f208fb70544c4b6"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5206dc7311081accf5b7d021c9e0e68219fd7bb35b0cd755b2d72c3ebfa41842"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76802f0738c2d00bb4e057938ec048c4c7c4efc5c44f04b9d877ad4419b21ee8"}, - {file = "pyreqwest_impersonate-0.4.9-cp312-none-win_amd64.whl", hash = "sha256:7cf94f6365bc144f787658e844f94dad38107fb9ff61d65079fb6510447777fe"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:66e92bd868146028dac1ef9cd2b4aac57e7e6cbd8806fa8a4c77ac5becf396e1"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc3ff7ac332879e40301d737b3ec1f3691b1de7492728bea26e75e26d05f89ec"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9e9eba83620852d4253023e50e3436726aee16e2de94afbd468da4373830dc"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d6b47d403c63b461a97efa2aed668f0f06ed26cf61c23d7d6dab4f5a0c81ffc"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:88f695a01e8699ec3a1547d793617b9fd00f810c05c2b4dc0d1472c7f12eed97"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:abb4fbfaa1a3c3adeb7f46baa1d67663af85ab24f2b4cdd15a668ddc6be3a375"}, - {file = "pyreqwest_impersonate-0.4.9-cp38-none-win_amd64.whl", hash = "sha256:884c1399fe0157dcd0a5a71e3600910df50faa0108c64602d47c15e75b32e60b"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bf5cd99276207510d64b48eff5602e12f049754d3b0f1194a024e1a080a61d3d"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:029eea1d386d12856da767d685169835f0b0c025ae312c1ee7bc0d8cb47a7d3d"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1bfb8795fe0a46aee883abcf510a9ecdb4e9acf75c3a5a23571276f555f5e88"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe35ce48e7e6b570304ee15915da0e6fab82dcae2b7a1d1a92593b522ebe852"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dfa377a842bd2e73d1f201bfc33194dd98c148372409d376f6d57efe338ff0eb"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d46880e68eb779cd071648e94a7ec50b3b77a28210f218be407eda1b0c8df343"}, - {file = "pyreqwest_impersonate-0.4.9-cp39-none-win_amd64.whl", hash = "sha256:ac431e4a94f8529a19a396750d78c66cc4fa11a8cc61d4bed7f0e0295a9394a9"}, - {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd04d8da4d23ab5720402fd9f3b6944fb388c19952f2ec9121b46ac1f74616"}, - {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b52df560d78681cde2fbc39bee547a42a79c8fd33655b79618835ecc412e6933"}, - {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e1a2828942f9d589ee6161496444a380d3305e78bda25ff63e4f993b0545b193"}, - {file = "pyreqwest_impersonate-0.4.9-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:beebedf6d8c0d5fdee9ae15bc64a74e51b35f98eb0d049bf2db067702fbf4e53"}, - {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3d47dea1f46410b58ab60795b5818c8c99d901f6c93fbb6a9d23fa55adb2b1"}, - {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb871adc5d12b2bcbb5af167384d49fc4e7e5e07d12cf912b931149163df724"}, - {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1b0b5556d2bd14a4ffa32654291fe2a9ef1eaac35b5514d9220e7e333a6c727"}, - {file = "pyreqwest_impersonate-0.4.9-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d50feaec78c06d51e1dd65cdbe80a1fc62ff93c8114555482f8a8cc5fe14895"}, - {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2a9cfc41917200d8eee61b87a5668abe7d1f924a55b7437065540edf613beed"}, - {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8106e3df0c1dca4df99e0f998f0e085ea3e1facfaa5afc268160a496ddf7256f"}, - {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ff66bb7dc6b1f52cf950b5e9cb0e53baffd1a15da595fd1ef933cd9e36396403"}, - {file = "pyreqwest_impersonate-0.4.9-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39f2a3ed17cf08098dc637459e88fb86d3fa7bdf9502659c82218be75651649c"}, - {file = "pyreqwest_impersonate-0.4.9.tar.gz", hash = "sha256:4ec8df7fe813e89f61e814c5ef75f6fd71164c8e26299c1a42dcd0d42f0bc96c"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ec8c9318190020bad3f12a62aedc5faaa92078c38cf48189e98cd692b82e7c28"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca7fc399a672558de1d50b5beb5a153c7002adbe332edd7a752f1d19c35d7f7f"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b453ab0a7f30a279151e88bd52449a01931307986d7c2a6a92a699d3ba58b66"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9c78ab908cc10a195ddbfc60c18b205237233f76b4f56c28ebc1afe80210335"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31db4e6e491868c227a252ef3a8fa8b7accc306e741934f74ad3e6fb096e334c"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3ce34743e3ce2656ba262a325103b96e1d4f301be5f3dd8cb21ee4eec4c6e1b7"}, + {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:e72b39a64c12a35a1689af558d62c67f94d14310043e404a90550e39ddd4af7c"}, + {file = "pyreqwest_impersonate-0.5.2.tar.gz", hash = "sha256:50a57c4b139788606b311757ddf36efd82ea1c952decea808b4196220bd43803"}, ] [package.extras] @@ -4740,13 +4654,13 @@ dev = ["pytest (>=8.1.1)"] [[package]] name = "pyright" -version = "1.1.370" +version = "1.1.372" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.370-py3-none-any.whl", hash = "sha256:fc721601e480a69989775bfc210534a6ca0110ebd0c065244a8d3a151294fc61"}, - {file = "pyright-1.1.370.tar.gz", hash = "sha256:d0d559d506fc41e3297f721aaa05a1b9f06beda5acc9ac64ca371ce94c28f960"}, + {file = "pyright-1.1.372-py3-none-any.whl", hash = "sha256:25b15fb8967740f0949fd35b963777187f0a0404c0bd753cc966ec139f3eaa0b"}, + {file = "pyright-1.1.372.tar.gz", hash = "sha256:a9f5e0daa955daaa17e3d1ef76d3623e75f8afd5e37b437d3ff84d5b38c15420"}, ] [package.dependencies] @@ -4758,13 +4672,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.3.1" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [package.dependencies] @@ -4772,11 +4686,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-clarity" @@ -5000,13 +4914,13 @@ pyyaml = "*" [[package]] name = "qdrant-client" -version = "1.9.1" +version = "1.10.1" description = "Client library for the Qdrant vector search engine" optional = true python-versions = ">=3.8" files = [ - {file = "qdrant_client-1.9.1-py3-none-any.whl", hash = "sha256:b9b7e0e5c1a51410d8bb5106a869a51e12f92ab45a99030f27aba790553bd2c8"}, - {file = "qdrant_client-1.9.1.tar.gz", hash = "sha256:186b9c31d95aefe8f2db84b7746402d7365bd63b305550e530e31bde2002ce79"}, + {file = "qdrant_client-1.10.1-py3-none-any.whl", hash = "sha256:b9fb8fe50dd168d92b2998be7c6135d5a229b3a3258ad158cc69c8adf9ff1810"}, + {file = "qdrant_client-1.10.1.tar.gz", hash = "sha256:2284c8c5bb1defb0d9dbacb07d16f344972f395f4f2ed062318476a7951fd84c"}, ] [package.dependencies] @@ -5022,21 +4936,22 @@ pydantic = ">=1.10.8" urllib3 = ">=1.26.14,<3" [package.extras] -fastembed = ["fastembed (==0.2.6)"] +fastembed = ["fastembed (==0.2.7)"] +fastembed-gpu = ["fastembed-gpu (==0.2.7)"] [[package]] name = "readme-renderer" -version = "43.0" +version = "44.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "readme_renderer-43.0-py3-none-any.whl", hash = "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9"}, - {file = "readme_renderer-43.0.tar.gz", hash = "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311"}, + {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, + {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, ] [package.dependencies] -docutils = ">=0.13.1" +docutils = ">=0.21.2" nh3 = ">=0.2.14" Pygments = ">=2.5.1" @@ -5186,13 +5101,13 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "responses" -version = "0.25.0" +version = "0.25.3" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, - {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, + {file = "responses-0.25.3-py3-none-any.whl", hash = "sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb"}, + {file = "responses-0.25.3.tar.gz", hash = "sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba"}, ] [package.dependencies] @@ -5251,39 +5166,39 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.6" +version = "0.4.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ef995583a038cd4a7edf1422c9e19118e2511b8ba0b015861b4abd26ec5367c5"}, - {file = "ruff-0.4.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:602ebd7ad909eab6e7da65d3c091547781bb06f5f826974a53dbe563d357e53c"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f9ced5cbb7510fd7525448eeb204e0a22cabb6e99a3cb160272262817d49786"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04a80acfc862e0e1630c8b738e70dcca03f350bad9e106968a8108379e12b31f"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be47700ecb004dfa3fd4dcdddf7322d4e632de3c06cd05329d69c45c0280e618"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1ff930d6e05f444090a0139e4e13e1e2e1f02bd51bb4547734823c760c621e79"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13410aabd3b5776f9c5699f42b37a3a348d65498c4310589bc6e5c548dc8a2f"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cf5cc02d3ae52dfb0c8a946eb7a1d6ffe4d91846ffc8ce388baa8f627e3bd50"}, - {file = "ruff-0.4.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea3424793c29906407e3cf417f28fc33f689dacbbadfb52b7e9a809dd535dcef"}, - {file = "ruff-0.4.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1fa8561489fadf483ffbb091ea94b9c39a00ed63efacd426aae2f197a45e67fc"}, - {file = "ruff-0.4.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d5b914818d8047270308fe3e85d9d7f4a31ec86c6475c9f418fbd1624d198e0"}, - {file = "ruff-0.4.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4f02284335c766678778475e7698b7ab83abaf2f9ff0554a07b6f28df3b5c259"}, - {file = "ruff-0.4.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3a6a0a4f4b5f54fff7c860010ab3dd81425445e37d35701a965c0248819dde7a"}, - {file = "ruff-0.4.6-py3-none-win32.whl", hash = "sha256:9018bf59b3aa8ad4fba2b1dc0299a6e4e60a4c3bc62bbeaea222679865453062"}, - {file = "ruff-0.4.6-py3-none-win_amd64.whl", hash = "sha256:a769ae07ac74ff1a019d6bd529426427c3e30d75bdf1e08bb3d46ac8f417326a"}, - {file = "ruff-0.4.6-py3-none-win_arm64.whl", hash = "sha256:735a16407a1a8f58e4c5b913ad6102722e80b562dd17acb88887685ff6f20cf6"}, - {file = "ruff-0.4.6.tar.gz", hash = "sha256:a797a87da50603f71e6d0765282098245aca6e3b94b7c17473115167d8dfb0b7"}, + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, ] [[package]] name = "s3transfer" -version = "0.10.1" +version = "0.10.2" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, - {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, + {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, + {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, ] [package.dependencies] @@ -5452,19 +5367,19 @@ files = [ [[package]] name = "setuptools" -version = "69.5.1" +version = "71.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, + {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "simplejson" @@ -5597,37 +5512,37 @@ files = [ [[package]] name = "snowflake-connector-python" -version = "3.10.0" +version = "3.11.0" description = "Snowflake Connector for Python" optional = true python-versions = ">=3.8" files = [ - {file = "snowflake_connector_python-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e2afca4bca70016519d1a7317c498f1d9c56140bf3e40ea40bddcc95fe827ca"}, - {file = "snowflake_connector_python-3.10.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:d19bde29f89b226eb22af4c83134ecb5c229da1d5e960a01b8f495df78dcdc36"}, - {file = "snowflake_connector_python-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfe013ed97b4dd2e191fd6770a14030d29dd0108817d6ce76b9773250dd2d560"}, - {file = "snowflake_connector_python-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0917c9f9382d830907e1a18ee1208537b203618700a9c671c2a20167b30f574"}, - {file = "snowflake_connector_python-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:7e828bc99240433e6552ac4cc4e37f223ae5c51c7880458ddb281668503c7491"}, - {file = "snowflake_connector_python-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a0d3d06d758455c50b998eabc1fd972a1f67faa5c85ef250fd5986f5a41aab0b"}, - {file = "snowflake_connector_python-3.10.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4602cb19b204bb03e03d65c6d5328467c9efc0fec53ca56768c3747c8dc8a70f"}, - {file = "snowflake_connector_python-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb1a04b496bbd3e1e2e926df82b2369887b2eea958f535fb934c240bfbabf6c5"}, - {file = "snowflake_connector_python-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c889f9f60f915d657e0a0ad2e6cc52cdcafd9bcbfa95a095aadfd8bcae62b819"}, - {file = "snowflake_connector_python-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e441484216ed416a6ed338133e23bd991ac4ba2e46531f4d330f61568c49314"}, - {file = "snowflake_connector_python-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bb4aced19053c67513cecc92311fa9d3b507b2277698c8e987d404f6f3a49fb2"}, - {file = "snowflake_connector_python-3.10.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:858315a2feff86213b079c6293ad8d850a778044c664686802ead8bb1337e1bc"}, - {file = "snowflake_connector_python-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adf16e1ca9f46d3bdf68e955ffa42075ebdb251e3b13b59003d04e4fea7d579a"}, - {file = "snowflake_connector_python-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4c5c2a08b39086a5348502652ad4fdf24871d7ab30fd59f6b7b57249158468c"}, - {file = "snowflake_connector_python-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:05011286f42c52eb3e5a6db59ee3eaf79f3039f3a19d7ffac6f4ee143779c637"}, - {file = "snowflake_connector_python-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:569301289ada5b0d72d0bd8432b7ca180220335faa6d9a0f7185f60891db6f2c"}, - {file = "snowflake_connector_python-3.10.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4e5641c70a12da9804b74f350b8cbbdffdc7aca5069b096755abd2a1fdcf5d1b"}, - {file = "snowflake_connector_python-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ff767a1b8c48431549ac28884f8bd9647e63a23f470b05f6ab8d143c4b1475"}, - {file = "snowflake_connector_python-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52bbc1e2e7bda956525b4229d7f87579f8cabd7d5506b12aa754c4bcdc8c8d7"}, - {file = "snowflake_connector_python-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:280a8dcca0249e864419564e38764c08f8841900d9872fec2f2855fda494b29f"}, - {file = "snowflake_connector_python-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:67bf570230b0cf818e6766c17245c7355a1f5ea27778e54ab8d09e5bb3536ad9"}, - {file = "snowflake_connector_python-3.10.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:aa1e26f9c571d2c4206da5c978c1b345ffd798d3db1f9ae91985e6243c6bf94b"}, - {file = "snowflake_connector_python-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73e9baa531d5156a03bfe5af462cf6193ec2a01cbb575edf7a2dd3b2a35254c7"}, - {file = "snowflake_connector_python-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e03361c4749e4d65bf0d223fdea1c2d7a33af53b74e873929a6085d150aff17e"}, - {file = "snowflake_connector_python-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:e8cddd4357e70ab55d7aeeed144cbbeb1ff658b563d7d8d307afc06178a367ec"}, - {file = "snowflake_connector_python-3.10.0.tar.gz", hash = "sha256:7c7438e958753bd1174b73581d77c92b0b47a86c38d8ea0ba1ea23c442eb8e75"}, + {file = "snowflake_connector_python-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0be9e2e35c7cf98df4ee454f1a00b7d1ff541ce46582d9b9ec51928e1583683c"}, + {file = "snowflake_connector_python-3.11.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e01aa2f65bd7374a11a7d74c30d4a78938bbf60db512fc170bd25fc1b385566b"}, + {file = "snowflake_connector_python-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a284c275929f81c5b53160c0d0ee447ee20b63af0493c87f3dd39faf3178f59"}, + {file = "snowflake_connector_python-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:686a50bf1e7d2cf89db7319a29d08816ea57039fcf05ca3f3bf3f92dc25bed40"}, + {file = "snowflake_connector_python-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:eae346b87906db2095f1c830ba105b529a211ecd0c0b1e43d8775fc49e7e476c"}, + {file = "snowflake_connector_python-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:415992f074b51712770c3dbd7a6b5a95b5dd04ffe02fc51ac8446e193771436d"}, + {file = "snowflake_connector_python-3.11.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:e55eca3ff74fb33ea21455369e171ad61ef31eb916cbbbdab7ccb90cb98ad8d0"}, + {file = "snowflake_connector_python-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa48b1f2a124098745a33ee93e34d85a3dfb60fa3d2d7ec5efee4aa17bb05053"}, + {file = "snowflake_connector_python-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96b21a062fc7aacb49202c8502239c0728319a96834a9fca1b6666a51e515dcc"}, + {file = "snowflake_connector_python-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ae890352e9e09e2084fd13647a664a31343bfa58d9aa41770e9ec3b810f9bc2c"}, + {file = "snowflake_connector_python-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e8f5c376b2368082819126f566551e451d51c95cc2febac45377026d44a401b0"}, + {file = "snowflake_connector_python-3.11.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:56c29839cbdf4778b997a96dacb849c3b374b7818c60eefe87b67debc9672f59"}, + {file = "snowflake_connector_python-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c203a035e417a386d7b09e977a198588471a768336f781b0561d09ed0f495edc"}, + {file = "snowflake_connector_python-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e906f517d2e79cd19c04dddf3bba13a072755503516f6bcd55ae1122b6df7fdb"}, + {file = "snowflake_connector_python-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:3e5489b814f311425e3966c0434f686131e48886eb7e0a8606631695f3c4bd48"}, + {file = "snowflake_connector_python-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:507c70ccd87c37a813c6aab27fe97007fb96c5372a5a33cc4b9137acb0d921e1"}, + {file = "snowflake_connector_python-3.11.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f238a3cb4522d2943861f38cb0c9650c08c02e45a38d4eefa27f22ad95748fb4"}, + {file = "snowflake_connector_python-3.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f797eb2552950cf04fe07304da714f1d473f7a0c1548cfbce5614c4b0a66e441"}, + {file = "snowflake_connector_python-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a525c60fd5922098eab2425bc3f63bb3df0f07dd54e02580505a6208f908d32"}, + {file = "snowflake_connector_python-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b61dbd3581c043b338c99caff900a9cce187c83333bafdf1d57c8c126366b4a"}, + {file = "snowflake_connector_python-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13170b419a6c2b98e23c89a459e2576955e0bae4fd267e9f44fffad642aa3ecc"}, + {file = "snowflake_connector_python-3.11.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:18bc6fd9fd544d540b06d9e97e754d0053b5cb7e5d9266586b3df8f243ef97bc"}, + {file = "snowflake_connector_python-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd4120451e33a32fb8fa018c9cd3e56c370ab0702ffe93b4e68acdae92524c3c"}, + {file = "snowflake_connector_python-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26ed3b5537864ee9d72f313b18b80b76136b7838774ea5bc2b4f5e1df8e9b90"}, + {file = "snowflake_connector_python-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc6afb35826e958949edb2d464e0d35ec46ef41b65546a311a333f4d0a7d07a6"}, + {file = "snowflake_connector_python-3.11.0.tar.gz", hash = "sha256:3169c014a03e5f5855112605e393897a552e558953c69f25a02e33b1998864d0"}, ] [package.dependencies] @@ -5782,25 +5697,6 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = true -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - [[package]] name = "stringcase" version = "1.2.0" @@ -5813,13 +5709,13 @@ files = [ [[package]] name = "sympy" -version = "1.13.0" +version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = true python-versions = ">=3.8" files = [ - {file = "sympy-1.13.0-py3-none-any.whl", hash = "sha256:6b0b32a4673fb91bd3cac3b55406c8e01d53ae22780be467301cc452f6680c92"}, - {file = "sympy-1.13.0.tar.gz", hash = "sha256:3b6af8f4d008b9a1a6a4268b335b984b23835f26d1d60b0526ebc71d48a25f57"}, + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, ] [package.dependencies] @@ -5843,13 +5739,13 @@ files = [ [[package]] name = "tenacity" -version = "8.3.0" +version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, ] [package.extras] @@ -5921,130 +5817,120 @@ files = [ [[package]] name = "tokenizers" -version = "0.15.2" +version = "0.19.1" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52f6130c9cbf70544287575a985bf44ae1bda2da7e8c24e97716080593638012"}, - {file = "tokenizers-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:054c1cc9c6d68f7ffa4e810b3d5131e0ba511b6e4be34157aa08ee54c2f8d9ee"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9b9b070fdad06e347563b88c278995735292ded1132f8657084989a4c84a6d5"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea621a7eef4b70e1f7a4e84dd989ae3f0eeb50fc8690254eacc08acb623e82f1"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf7fd9a5141634fa3aa8d6b7be362e6ae1b4cda60da81388fa533e0b552c98fd"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44f2a832cd0825295f7179eaf173381dc45230f9227ec4b44378322d900447c9"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b9ec69247a23747669ec4b0ca10f8e3dfb3545d550258129bd62291aabe8605"}, - {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b6a4c78da863ff26dbd5ad9a8ecc33d8a8d97b535172601cf00aee9d7ce9ce"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5ab2a4d21dcf76af60e05af8063138849eb1d6553a0d059f6534357bce8ba364"}, - {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a47acfac7e511f6bbfcf2d3fb8c26979c780a91e06fb5b9a43831b2c0153d024"}, - {file = "tokenizers-0.15.2-cp310-none-win32.whl", hash = "sha256:064ff87bb6acdbd693666de9a4b692add41308a2c0ec0770d6385737117215f2"}, - {file = "tokenizers-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3b919afe4df7eb6ac7cafd2bd14fb507d3f408db7a68c43117f579c984a73843"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:89cd1cb93e4b12ff39bb2d626ad77e35209de9309a71e4d3d4672667b4b256e7"}, - {file = "tokenizers-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfed5c64e5be23d7ee0f0e98081a25c2a46b0b77ce99a4f0605b1ec43dd481fa"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a907d76dcfda37023ba203ab4ceeb21bc5683436ebefbd895a0841fd52f6f6f2"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ea60479de6fc7b8ae756b4b097572372d7e4032e2521c1bbf3d90c90a99ff0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48e2b9335be2bc0171df9281385c2ed06a15f5cf121c44094338306ab7b33f2c"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:112a1dd436d2cc06e6ffdc0b06d55ac019a35a63afd26475205cb4b1bf0bfbff"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4620cca5c2817177ee8706f860364cc3a8845bc1e291aaf661fb899e5d1c45b0"}, - {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd73a82751c523b3fc31ff8194702e4af4db21dc20e55b30ecc2079c5d43cb7"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:107089f135b4ae7817affe6264f8c7a5c5b4fd9a90f9439ed495f54fcea56fb4"}, - {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0ff110ecc57b7aa4a594396525a3451ad70988e517237fe91c540997c4e50e29"}, - {file = "tokenizers-0.15.2-cp311-none-win32.whl", hash = "sha256:6d76f00f5c32da36c61f41c58346a4fa7f0a61be02f4301fd30ad59834977cc3"}, - {file = "tokenizers-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:cc90102ed17271cf0a1262babe5939e0134b3890345d11a19c3145184b706055"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f86593c18d2e6248e72fb91c77d413a815153b8ea4e31f7cd443bdf28e467670"}, - {file = "tokenizers-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0774bccc6608eca23eb9d620196687c8b2360624619623cf4ba9dc9bd53e8b51"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0222c5b7c9b26c0b4822a82f6a7011de0a9d3060e1da176f66274b70f846b98"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3835738be1de66624fff2f4f6f6684775da4e9c00bde053be7564cbf3545cc66"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0143e7d9dcd811855c1ce1ab9bf5d96d29bf5e528fd6c7824d0465741e8c10fd"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db35825f6d54215f6b6009a7ff3eedee0848c99a6271c870d2826fbbedf31a38"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f5e64b0389a2be47091d8cc53c87859783b837ea1a06edd9d8e04004df55a5c"}, - {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e0480c452217edd35eca56fafe2029fb4d368b7c0475f8dfa3c5c9c400a7456"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a33ab881c8fe70474980577e033d0bc9a27b7ab8272896e500708b212995d834"}, - {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d"}, - {file = "tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b"}, - {file = "tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0"}, - {file = "tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728"}, - {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab"}, - {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d44ba80988ff9424e33e0a49445072ac7029d8c0e1601ad25a0ca5f41ed0c1d6"}, - {file = "tokenizers-0.15.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:dce74266919b892f82b1b86025a613956ea0ea62a4843d4c4237be2c5498ed3a"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0ef06b9707baeb98b316577acb04f4852239d856b93e9ec3a299622f6084e4be"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73e2e74bbb07910da0d37c326869f34113137b23eadad3fc00856e6b3d9930c"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eeb12daf02a59e29f578a865f55d87cd103ce62bd8a3a5874f8fdeaa82e336b"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ba9f6895af58487ca4f54e8a664a322f16c26bbb442effd01087eba391a719e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccec77aa7150e38eec6878a493bf8c263ff1fa8a62404e16c6203c64c1f16a26"}, - {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f40604f5042ff210ba82743dda2b6aa3e55aa12df4e9f2378ee01a17e2855e"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5645938a42d78c4885086767c70923abad047163d809c16da75d6b290cb30bbe"}, - {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05a77cbfebe28a61ab5c3891f9939cc24798b63fa236d84e5f29f3a85a200c00"}, - {file = "tokenizers-0.15.2-cp37-none-win32.whl", hash = "sha256:361abdc068e8afe9c5b818769a48624687fb6aaed49636ee39bec4e95e1a215b"}, - {file = "tokenizers-0.15.2-cp37-none-win_amd64.whl", hash = "sha256:7ef789f83eb0f9baeb4d09a86cd639c0a5518528f9992f38b28e819df397eb06"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4fe1f74a902bee74a3b25aff180fbfbf4f8b444ab37c4d496af7afd13a784ed2"}, - {file = "tokenizers-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4b89038a684f40a6b15d6b09f49650ac64d951ad0f2a3ea9169687bbf2a8ba"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d05a1b06f986d41aed5f2de464c003004b2df8aaf66f2b7628254bcbfb72a438"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508711a108684111ec8af89d3a9e9e08755247eda27d0ba5e3c50e9da1600f6d"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:daa348f02d15160cb35439098ac96e3a53bacf35885072611cd9e5be7d333daa"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:494fdbe5932d3416de2a85fc2470b797e6f3226c12845cadf054dd906afd0442"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2d60f5246f4da9373f75ff18d64c69cbf60c3bca597290cea01059c336d2470"}, - {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93268e788825f52de4c7bdcb6ebc1fcd4a5442c02e730faa9b6b08f23ead0e24"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6fc7083ab404019fc9acafe78662c192673c1e696bd598d16dc005bd663a5cf9"}, - {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e39b41e5531d6b2122a77532dbea60e171ef87a3820b5a3888daa847df4153"}, - {file = "tokenizers-0.15.2-cp38-none-win32.whl", hash = "sha256:06cd0487b1cbfabefb2cc52fbd6b1f8d4c37799bd6c6e1641281adaa6b2504a7"}, - {file = "tokenizers-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:5179c271aa5de9c71712e31cb5a79e436ecd0d7532a408fa42a8dbfa4bc23fd9"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82f8652a74cc107052328b87ea8b34291c0f55b96d8fb261b3880216a9f9e48e"}, - {file = "tokenizers-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02458bee6f5f3139f1ebbb6d042b283af712c0981f5bc50edf771d6b762d5e4f"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9a09cd26cca2e1c349f91aa665309ddb48d71636370749414fbf67bc83c5343"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:158be8ea8554e5ed69acc1ce3fbb23a06060bd4bbb09029431ad6b9a466a7121"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ddba9a2b0c8c81633eca0bb2e1aa5b3a15362b1277f1ae64176d0f6eba78ab1"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ef5dd1d39797044642dbe53eb2bc56435308432e9c7907728da74c69ee2adca"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:454c203164e07a860dbeb3b1f4a733be52b0edbb4dd2e5bd75023ffa8b49403a"}, - {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf6b7f1d4dc59af960e6ffdc4faffe6460bbfa8dce27a58bf75755ffdb2526d"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2ef09bbc16519f6c25d0c7fc0c6a33a6f62923e263c9d7cca4e58b8c61572afb"}, - {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9a2ebdd2ad4ec7a68e7615086e633857c85e2f18025bd05d2a4399e6c5f7169"}, - {file = "tokenizers-0.15.2-cp39-none-win32.whl", hash = "sha256:918fbb0eab96fe08e72a8c2b5461e9cce95585d82a58688e7f01c2bd546c79d0"}, - {file = "tokenizers-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:524e60da0135e106b254bd71f0659be9f89d83f006ea9093ce4d1fab498c6d0d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237d1bf3361cf2e6463e6c140628e6406766e8b27274f5fcc62c747ae3c6f094"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a0fe1e49e60c664915e9fb6b0cb19bac082ab1f309188230e4b2920230edb3"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e022fe65e99230b8fd89ebdfea138c24421f91c1a4f4781a8f5016fd5cdfb4d"}, - {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d857be2df69763362ac699f8b251a8cd3fac9d21893de129bc788f8baaef2693"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:708bb3e4283177236309e698da5fcd0879ce8fd37457d7c266d16b550bcbbd18"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c35e09e9899b72a76e762f9854e8750213f67567787d45f37ce06daf57ca78"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1257f4394be0d3b00de8c9e840ca5601d0a4a8438361ce9c2b05c7d25f6057b"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02272fe48280e0293a04245ca5d919b2c94a48b408b55e858feae9618138aeda"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dc3ad9ebc76eabe8b1d7c04d38be884b8f9d60c0cdc09b0aa4e3bcf746de0388"}, - {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:32e16bdeffa7c4f46bf2152172ca511808b952701d13e7c18833c0b73cb5c23f"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fb16ba563d59003028b678d2361a27f7e4ae0ab29c7a80690efa20d829c81fdb"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2277c36d2d6cdb7876c274547921a42425b6810d38354327dd65a8009acf870c"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cf75d32e8d250781940d07f7eece253f2fe9ecdb1dc7ba6e3833fa17b82fcbc"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b3b31884dc8e9b21508bb76da80ebf7308fdb947a17affce815665d5c4d028"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10122d8d8e30afb43bb1fe21a3619f62c3e2574bff2699cf8af8b0b6c5dc4a3"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d88b96ff0fe8e91f6ef01ba50b0d71db5017fa4e3b1d99681cec89a85faf7bf7"}, - {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:37aaec5a52e959892870a7c47cef80c53797c0db9149d458460f4f31e2fb250e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2ea752f2b0fe96eb6e2f3adbbf4d72aaa1272079b0dfa1145507bd6a5d537e6"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b19a808d8799fda23504a5cd31d2f58e6f52f140380082b352f877017d6342b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c86e5e068ac8b19204419ed8ca90f9d25db20578f5881e337d203b314f4104"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de19c4dc503c612847edf833c82e9f73cd79926a384af9d801dcf93f110cea4e"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea09acd2fe3324174063d61ad620dec3bcf042b495515f27f638270a7d466e8b"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cf27fd43472e07b57cf420eee1e814549203d56de00b5af8659cb99885472f1f"}, - {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7ca22bd897537a0080521445d91a58886c8c04084a6a19e6c78c586e0cfa92a5"}, - {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, -] - -[package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" @@ -6059,13 +5945,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.0" description = "Style preserving TOML library" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, + {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] [[package]] @@ -6144,13 +6030,13 @@ telegram = ["requests"] [[package]] name = "trafilatura" -version = "1.9.0" +version = "1.11.0" description = "Python package and command-line tool designed to gather text on the Web, includes all necessary discovery and text processing components to perform web crawling, downloads, scraping, and extraction of main texts, metadata and comments." optional = true python-versions = ">=3.6" files = [ - {file = "trafilatura-1.9.0-py3-none-any.whl", hash = "sha256:8ea09de226c4eae25685f65b2cf56de47260d5c858ed3a8a0bc9c3ddd0841344"}, - {file = "trafilatura-1.9.0.tar.gz", hash = "sha256:e6833d29ab8a13ed853937d7c91e6868bc62efbe10214ac2b106436dd23d1412"}, + {file = "trafilatura-1.11.0-py3-none-any.whl", hash = "sha256:20f016be873a2cf3e02b9798f9537d09808559fcc667d42e1c019560ca45dce7"}, + {file = "trafilatura-1.11.0.tar.gz", hash = "sha256:9334ca101c40b2904af5afcee790f0374fabca3ac388811720be65cc768787a2"}, ] [package.dependencies] @@ -6158,68 +6044,52 @@ certifi = "*" charset-normalizer = {version = ">=3.2.0", markers = "python_version >= \"3.7\""} courlan = ">=1.1.0" htmldate = ">=1.8.1" -justext = ">=3.0.0" -lxml = {version = ">=4.9.4,<5.2.0", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} +justext = ">=3.0.1" +lxml = {version = ">=5.2.2", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} [package.extras] -all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.19)", "htmldate[speed] (>=1.8.1)", "py3langid (>=0.2.2)", "pycurl (>=7.45.3)"] +all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.19)", "htmldate[speed] (>=1.8.1)", "py3langid (>=0.2.2)", "pycurl (>=7.45.3)", "zstandard (>=0.20.0)"] gui = ["Gooey (>=1.0.1)"] -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = true -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - [[package]] name = "transformers" -version = "4.39.3" +version = "4.42.4" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.39.3-py3-none-any.whl", hash = "sha256:7838034a12cca3168247f9d2d1dba6724c9de3ae0f73a108258c6b8fc5912601"}, - {file = "transformers-4.39.3.tar.gz", hash = "sha256:2586e5ff4150f122716fc40f5530e92871befc051848fbe82600969c535b762d"}, + {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, + {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, ] [package.dependencies] accelerate = {version = ">=0.21.0", optional = true, markers = "extra == \"torch\""} filelock = "*" -huggingface-hub = ">=0.19.3,<1.0" -numpy = ">=1.17" +huggingface-hub = ">=0.23.2,<1.0" +numpy = ">=1.17,<2.0" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" -tokenizers = ">=0.14,<0.19" +tokenizers = ">=0.19,<0.20" torch = {version = "*", optional = true, markers = "extra == \"torch\""} tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] -docs-specific = ["hf-doc-builder"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] @@ -6229,25 +6099,26 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.4.4)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm"] -tokenizers = ["tokenizers (>=0.14,<0.19)"] +timm = ["timm (<=0.9.16)"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17,<2.0)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -6276,19 +6147,19 @@ tutorials = ["matplotlib", "pandas", "tabulate", "torch"] [[package]] name = "twine" -version = "5.0.0" +version = "5.1.1" description = "Collection of utilities for publishing packages on PyPI" optional = false python-versions = ">=3.8" files = [ - {file = "twine-5.0.0-py3-none-any.whl", hash = "sha256:a262933de0b484c53408f9edae2e7821c1c45a3314ff2df9bdd343aa7ab8edc0"}, - {file = "twine-5.0.0.tar.gz", hash = "sha256:89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4"}, + {file = "twine-5.1.1-py3-none-any.whl", hash = "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997"}, + {file = "twine-5.1.1.tar.gz", hash = "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db"}, ] [package.dependencies] importlib-metadata = ">=3.6" keyring = ">=15.1" -pkginfo = ">=1.8.1" +pkginfo = ">=1.8.1,<1.11" readme-renderer = ">=35.0" requests = ">=2.20" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" @@ -6298,13 +6169,13 @@ urllib3 = ">=1.26.0" [[package]] name = "types-awscrt" -version = "0.20.9" +version = "0.21.2" description = "Type annotations and code completion for awscrt" optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "types_awscrt-0.20.9-py3-none-any.whl", hash = "sha256:3ae374b553e7228ba41a528cf42bd0b2ad7303d806c73eff4aaaac1515e3ea4e"}, - {file = "types_awscrt-0.20.9.tar.gz", hash = "sha256:64898a2f4a2468f66233cb8c29c5f66de907cf80ba1ef5bb1359aef2f81bb521"}, + {file = "types_awscrt-0.21.2-py3-none-any.whl", hash = "sha256:0839fe12f0f914d8f7d63ed777c728cb4eccc2d5d79a26e377d12b0604e7bf0e"}, + {file = "types_awscrt-0.21.2.tar.gz", hash = "sha256:84a9f4f422ec525c314fdf54c23a1e73edfbcec968560943ca2d41cfae623b38"}, ] [[package]] @@ -6356,21 +6227,21 @@ files = [ [[package]] name = "typos" -version = "1.22.9" +version = "1.23.3" description = "Source Code Spelling Correction" optional = false python-versions = ">=3.7" files = [ - {file = "typos-1.22.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6221400b82554f853e1d1a0f26bcfddf9f36008114d3441c566e1b5edf20d27d"}, - {file = "typos-1.22.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a57b5f0acd1596034fdc333f94d4713adbc181c545fb526cf2119d2af4c007ec"}, - {file = "typos-1.22.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77e2d9dfee24cccf177b09d8ace6d6012fa8c453aa092d869426bfef3dd8c67e"}, - {file = "typos-1.22.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38886031f4570d546b63ec112aed6b323762022ca5cc64d52537724a1529257"}, - {file = "typos-1.22.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8577b482256538822f76c9825d36f76b7b1e7cbccf2842279a7b46f0494796a5"}, - {file = "typos-1.22.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:63f7ae86eb7dccc43845bf0ef72a3746b1022889a178809c028f809081c6f20d"}, - {file = "typos-1.22.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5f290b85f1dddc875d4efa0b22802413f86532b99fa0ac2cb8d2e70eda68acfd"}, - {file = "typos-1.22.9-py3-none-win32.whl", hash = "sha256:76a58b1d54ee00ef8d90c3166b149e70d84b0414617a34abf5ded1db76feecef"}, - {file = "typos-1.22.9-py3-none-win_amd64.whl", hash = "sha256:53f31a9c0d321132f680ab92d80f7c520e163c53c9042fb009feaa91d9b4a7c4"}, - {file = "typos-1.22.9.tar.gz", hash = "sha256:c7b5feada41ce26e34eea1145141887257e59384d0ceea00f0f03349335ff688"}, + {file = "typos-1.23.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:64eb857fd5d9fbceddf84f14dcb102355e95f79e61639c96b76a81f6526fe589"}, + {file = "typos-1.23.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3413933c235362f3a9dc99ea02acfbe096ac451f0828cf8e0617e9ea859add31"}, + {file = "typos-1.23.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5633d7baccc9ee5f3c0a2675c3eed6369983845994d6582f70bb2dd30b55bd64"}, + {file = "typos-1.23.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07cb89e916ed3114ac5980e4df4cca936d4305f13944fa4821afdf319b24b1e2"}, + {file = "typos-1.23.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f3887869fe4a16f203a749b97d32dac763d3b8bf2a71728d20726e8f1aee33e"}, + {file = "typos-1.23.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eb2bf8c347e82687fa97f5208ded28377fcf4c0cdd685f5323b22cb756bd70d3"}, + {file = "typos-1.23.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4286ca8b7cda18e83e7e8be6aa2b37306b75138a7b0cbf3384f983a5772c0cdb"}, + {file = "typos-1.23.3-py3-none-win32.whl", hash = "sha256:a0bd7a04f476126cb7a2e4d5c11c1083d1d68657e3349817cdb757ce110cf265"}, + {file = "typos-1.23.3-py3-none-win_amd64.whl", hash = "sha256:372139f46e57f18943e2b83d12dc9f4533a93618f0aac8d59684479628e5e576"}, + {file = "typos-1.23.3.tar.gz", hash = "sha256:2bcbfc32660170b2b4797a5613c4ce269fba2eef30d47d0a08ea0be57ddd3b99"}, ] [[package]] @@ -6430,13 +6301,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.26.2" +version = "20.26.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, - {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, ] [package.dependencies] @@ -6450,13 +6321,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "voyageai" -version = "0.2.2" +version = "0.2.3" description = "" optional = true python-versions = "<4.0.0,>=3.7.1" files = [ - {file = "voyageai-0.2.2-py3-none-any.whl", hash = "sha256:caba84fa448bb82eeb39a4c4479978dc08bff9e2473773fea9cdcdd737560e4d"}, - {file = "voyageai-0.2.2.tar.gz", hash = "sha256:e477ea2aa6d54580426c7a4a67ad45cfba5480db2bad4da3eb74007b3984f3a5"}, + {file = "voyageai-0.2.3-py3-none-any.whl", hash = "sha256:59c4958bd991e83cedb5a82d5e14ac698ce67e42713ea10467631a48ee272b15"}, + {file = "voyageai-0.2.3.tar.gz", hash = "sha256:28322aa7a64cdaa774be6fcf3e4fd6a08694ea25acd5fadd1eff1b8ef8dab68a"}, ] [package.dependencies] @@ -6468,56 +6339,48 @@ tenacity = ">=8.0.1" [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.1" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [package.extras] watchmedo = ["PyYAML (>=3.10)"] -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = true -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - [[package]] name = "websockets" version = "12.0" @@ -6811,18 +6674,18 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.18.1" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy", "trafilatura", "transformers", "voyageai"] @@ -6846,7 +6709,7 @@ drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-anthropic = ["anthropic"] drivers-prompt-cohere = ["cohere"] drivers-prompt-google = ["google-generativeai"] -drivers-prompt-huggingface = ["huggingface-hub"] +drivers-prompt-huggingface = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-ollama = ["ollama"] drivers-rerank-cohere = ["cohere"] @@ -6874,4 +6737,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "c3078839442b9b1546e2d90b6bbf5a70cdcb3ba92f6384685c17615171fd4cc0" +content-hash = "2709e2b4622507351d69ed483b96910b001046759c1f02d70c24e014a617bce9" diff --git a/pyproject.toml b/pyproject.toml index 232f8491d..1c66d4095 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,16 +14,16 @@ packages = [ [tool.poetry.dependencies] python = "^3.9" openai = "^1.1.1" -attrs = ">=22" -jinja2 = ">=3.1.3" -marshmallow = ">=3" -marshmallow-enum = ">=1.5" -tiktoken = ">=0.7" -rich = ">=13" -schema = ">=0.7" -pyyaml = ">=6" -tenacity = ">=8.0" -numpy = ">=1" +attrs = "^23.2.0" +jinja2 = "^3.1.4" +marshmallow = "^3.21.3" +marshmallow-enum = "^1.5.1" +tiktoken = "^0.7" +rich = "^13.7.1" +schema = "^0.7.7" +pyyaml = "^6.0.1" +tenacity = "^8.5.0" +numpy = "^1.26.4" stringcase = "^1.2.0" docker = "^7.1.0" requests = "^2.32.0" @@ -31,12 +31,12 @@ requests = "^2.32.0" # drivers cohere = { version = "^5.5.4", optional = true } anthropic = { version = "^0.29.0", optional = true } -transformers = { version = "^4.39.3", optional = true, extras=["torch"] } -huggingface-hub = { version = ">=0.13", optional = true } +transformers = { version = "^4.41.1", optional = true, extras=["torch"] } +huggingface-hub = { version = "^0.24.0", optional = true } boto3 = { version = "^1.34.119", optional = true } snowflake-sqlalchemy = { version = "^1.6.1", optional = true } pinecone-client = { version = "^3", optional = true } -pymongo = { version = "*", optional = true } +pymongo = { version = "^4.8.0", optional = true } marqo = { version = "^3.7.0", optional = true } redis = { version = "^4.6.0", optional = true } opensearch-py = { version = "^2.3.1", optional = true } @@ -49,7 +49,7 @@ beautifulsoup4 = {version = "^4.12.3", optional = true} markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} -qdrant-client = { version = ">=1.9.1", optional = true } +qdrant-client = { version = "^1.10.1", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} @@ -70,7 +70,7 @@ filetype = {version = "^1.2", optional = true} [tool.poetry.extras] drivers-prompt-cohere = ["cohere"] drivers-prompt-anthropic = ["anthropic"] -drivers-prompt-huggingface = ["huggingface-hub"] +drivers-prompt-huggingface = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-amazon-bedrock = ["boto3", "anthropic"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] @@ -187,11 +187,11 @@ all = [ optional = true [tool.poetry.group.test.dependencies] -pytest = "~=7.1" -pytest-mock = "*" -mongomock = "*" +pytest = "^8.3.1" +pytest-mock = "^3.1.4" +mongomock = "^4.1.2" -twine = ">=4" +twine = "^5.1.1" moto = {extras = ["dynamodb", "iotdata", "sqs"], version = "^4.2.13"} pytest-xdist = "^3.3.1" pytest-cov = "^5.0.0" From 1f690c645477b07007592c8782df9a2e35accdbd Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 11:17:23 -0700 Subject: [PATCH 184/238] Add EventsMixin (#984) --- griptape/config/base_structure_config.py | 40 +++++++ .../base_audio_transcription_driver.py | 12 +- .../embedding/base_embedding_driver.py | 4 +- .../base_image_generation_driver.py | 12 +- .../image_query/base_image_query_driver.py | 18 ++- .../base_conversation_memory_driver.py | 4 +- griptape/drivers/prompt/base_prompt_driver.py | 33 +++--- .../base_text_to_speech_driver.py | 14 +-- .../vector/base_vector_store_driver.py | 4 +- griptape/mixins/__init__.py | 2 + griptape/mixins/event_publisher_mixin.py | 34 ++++++ griptape/schemas/base_schema.py | 8 +- griptape/structures/structure.py | 34 ++---- griptape/tasks/base_task.py | 4 +- griptape/tasks/prompt_task.py | 8 -- griptape/utils/stream.py | 2 +- .../mocks/mock_audio_transcription_driver.py | 17 +++ tests/mocks/mock_image_generation_driver.py | 8 +- tests/mocks/mock_prompt_driver.py | 76 +++++++++++-- tests/mocks/mock_text_to_speech_driver.py | 15 +++ tests/unit/config/test_structure_config.py | 35 ++++++ .../drivers/audio_transcription/__init__.py | 0 .../test_base_audio_transcription_driver.py | 33 ++++++ .../test_base_image_generation_driver.py | 107 ++++++++++++++++++ tests/unit/drivers/image_query/__init__.py | 0 .../test_base_image_query_driver.py | 26 +++++ .../drivers/prompt/test_base_prompt_driver.py | 35 ++++-- .../test_base_audio_transcription_driver.py | 28 +++++ tests/unit/events/test_event_listener.py | 1 + tests/unit/mixins/test_events_mixin.py | 59 ++++++++++ tests/unit/tasks/test_base_task.py | 15 ++- tests/unit/utils/test_stream.py | 2 +- 32 files changed, 567 insertions(+), 123 deletions(-) create mode 100644 griptape/mixins/event_publisher_mixin.py create mode 100644 tests/mocks/mock_audio_transcription_driver.py create mode 100644 tests/mocks/mock_text_to_speech_driver.py create mode 100644 tests/unit/drivers/audio_transcription/__init__.py create mode 100644 tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py create mode 100644 tests/unit/drivers/image_generation/test_base_image_generation_driver.py create mode 100644 tests/unit/drivers/image_query/__init__.py create mode 100644 tests/unit/drivers/image_query/test_base_image_query_driver.py create mode 100644 tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py create mode 100644 tests/unit/mixins/test_events_mixin.py diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index c2aa82d7e..31949cd2f 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -6,6 +6,8 @@ from attrs import define, field from griptape.config import BaseConfig +from griptape.events import EventListener +from griptape.mixins.event_publisher_mixin import EventPublisherMixin from griptape.utils import dict_merge if TYPE_CHECKING: @@ -19,6 +21,7 @@ BaseTextToSpeechDriver, BaseVectorStoreDriver, ) + from griptape.structures import Structure @define @@ -36,6 +39,43 @@ class BaseStructureConfig(BaseConfig, ABC): text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) + _structure: Structure = field(default=None, kw_only=True, alias="structure") + _event_listener: Optional[EventListener] = field(default=None, kw_only=True, alias="event_listener") + + @property + def drivers(self) -> list: + return [ + self.prompt_driver, + self.image_generation_driver, + self.image_query_driver, + self.embedding_driver, + self.vector_store_driver, + self.conversation_memory_driver, + self.text_to_speech_driver, + self.audio_transcription_driver, + ] + + @property + def structure(self) -> Optional[Structure]: + return self._structure + + @structure.setter + def structure(self, structure: Structure) -> None: + if structure != self.structure: + event_publisher_drivers = [ + driver for driver in self.drivers if driver is not None and isinstance(driver, EventPublisherMixin) + ] + + for driver in event_publisher_drivers: + if self._event_listener is not None: + driver.remove_event_listener(self._event_listener) + + self._event_listener = EventListener(structure.publish_event) + for driver in event_publisher_drivers: + driver.add_event_listener(self._event_listener) + + self._structure = structure + def merge_config(self, config: dict) -> BaseStructureConfig: base_config = self.to_dict() merged_config = dict_merge(base_config, config) diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py index 5a0c96648..c81ea1d5b 100644 --- a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -6,25 +6,21 @@ from attrs import define, field from griptape.events import FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import AudioArtifact, TextArtifact - from griptape.structures import Structure @define -class BaseAudioTranscriptionDriver(SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseAudioTranscriptionDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) - structure: Optional[Structure] = field(default=None, kw_only=True) def before_run(self) -> None: - if self.structure: - self.structure.publish_event(StartAudioTranscriptionEvent()) + self.publish_event(StartAudioTranscriptionEvent()) def after_run(self) -> None: - if self.structure: - self.structure.publish_event(FinishAudioTranscriptionEvent()) + self.publish_event(FinishAudioTranscriptionEvent()) def run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index 8998f00e5..690726060 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -7,7 +7,7 @@ from attrs import define, field from griptape.chunkers import BaseChunker, TextChunker -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import TextArtifact @@ -15,7 +15,7 @@ @define -class BaseEmbeddingDriver(SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseEmbeddingDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): """Base Embedding Driver. Attributes: diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index 93666a513..f500d6d09 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -6,25 +6,21 @@ from attrs import define, field from griptape.events import FinishImageGenerationEvent, StartImageGenerationEvent -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import ImageArtifact - from griptape.structures import Structure @define -class BaseImageGenerationDriver(SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseImageGenerationDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) - structure: Optional[Structure] = field(default=None, kw_only=True) def before_run(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> None: - if self.structure: - self.structure.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) + self.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) def after_run(self) -> None: - if self.structure: - self.structure.publish_event(FinishImageGenerationEvent()) + self.publish_event(FinishImageGenerationEvent()) def run_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 88fbb5160..b39f198d4 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -1,32 +1,28 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define, field from griptape.events import FinishImageQueryEvent, StartImageQueryEvent -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import ImageArtifact, TextArtifact - from griptape.structures import Structure @define -class BaseImageQueryDriver(SerializableMixin, ExponentialBackoffMixin, ABC): - structure: Optional[Structure] = field(default=None, kw_only=True) +class BaseImageQueryDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): max_tokens: int = field(default=256, kw_only=True, metadata={"serializable": True}) def before_run(self, query: str, images: list[ImageArtifact]) -> None: - if self.structure: - self.structure.publish_event( - StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]), - ) + self.publish_event( + StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]), + ) def after_run(self, result: str) -> None: - if self.structure: - self.structure.publish_event(FinishImageQueryEvent(result=result)) + self.publish_event(FinishImageQueryEvent(result=result)) def query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py index 1caeb902f..f13b82c29 100644 --- a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py @@ -3,13 +3,13 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from griptape.mixins import SerializableMixin +from griptape.mixins import EventPublisherMixin, SerializableMixin if TYPE_CHECKING: from griptape.memory.structure import BaseConversationMemory -class BaseConversationMemoryDriver(SerializableMixin, ABC): +class BaseConversationMemoryDriver(EventPublisherMixin, SerializableMixin, ABC): @abstractmethod def store(self, memory: BaseConversationMemory) -> None: ... diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 0a67b4f4e..e5fd0408d 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -17,23 +17,21 @@ observable, ) from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from collections.abc import Iterator - from griptape.structures import Structure from griptape.tokenizers import BaseTokenizer @define(kw_only=True) -class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): +class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, EventPublisherMixin, ABC): """Base class for the Prompt Drivers. Attributes: temperature: The temperature to use for the completion. max_tokens: The maximum number of tokens to generate. If not specified, the value will be automatically generated based by the tokenizer. - structure: An optional `Structure` to publish events to. prompt_stack_to_string: A function that converts a `PromptStack` to a string. ignored_exception_types: A tuple of exception types to ignore. model: The model name. @@ -44,7 +42,6 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): temperature: float = field(default=0.1, metadata={"serializable": True}) max_tokens: Optional[int] = field(default=None, metadata={"serializable": True}) - structure: Optional[Structure] = field(default=None) ignored_exception_types: tuple[type[Exception], ...] = field(default=Factory(lambda: (ImportError, ValueError))) model: str = field(metadata={"serializable": True}) tokenizer: BaseTokenizer @@ -52,19 +49,17 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): use_native_tools: bool = field(default=False, kw_only=True, metadata={"serializable": True}) def before_run(self, prompt_stack: PromptStack) -> None: - if self.structure: - self.structure.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) + self.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) def after_run(self, result: Message) -> None: - if self.structure: - self.structure.publish_event( - FinishPromptEvent( - model=self.model, - result=result.value, - input_token_count=result.usage.input_tokens, - output_token_count=result.usage.output_tokens, - ), - ) + self.publish_event( + FinishPromptEvent( + model=self.model, + result=result.value, + input_token_count=result.usage.input_tokens, + output_token_count=result.usage.output_tokens, + ), + ) @observable(tags=["PromptDriver.run()"]) def run(self, prompt_stack: PromptStack) -> Message: @@ -133,12 +128,12 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: else: delta_contents[content.index] = [content] if isinstance(content, TextDeltaMessageContent): - self.structure.publish_event(CompletionChunkEvent(token=content.text)) + self.publish_event(CompletionChunkEvent(token=content.text)) elif isinstance(content, ActionCallDeltaMessageContent): if content.tag is not None and content.name is not None and content.path is not None: - self.structure.publish_event(CompletionChunkEvent(token=str(content))) + self.publish_event(CompletionChunkEvent(token=str(content))) elif content.partial_input is not None: - self.structure.publish_event(CompletionChunkEvent(token=content.partial_input)) + self.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas result = self.__build_message(list(delta_contents.values()), usage) diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index d91347c19..788d92974 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -1,31 +1,27 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define, field from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent from griptape.events.start_text_to_speech_event import StartTextToSpeechEvent -from griptape.mixins import ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts.audio_artifact import AudioArtifact - from griptape.structures import Structure @define -class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, EventPublisherMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) - structure: Optional[Structure] = field(default=None, kw_only=True) def before_run(self, prompts: list[str]) -> None: - if self.structure: - self.structure.publish_event(StartTextToSpeechEvent(prompts=prompts)) + self.publish_event(StartTextToSpeechEvent(prompts=prompts)) def after_run(self) -> None: - if self.structure: - self.structure.publish_event(FinishTextToSpeechEvent()) + self.publish_event(FinishTextToSpeechEvent()) def run_text_to_audio(self, prompts: list[str]) -> AudioArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index c22285be6..2b00266a8 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -10,14 +10,14 @@ from griptape import utils from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact -from griptape.mixins import SerializableMixin +from griptape.mixins import EventPublisherMixin, SerializableMixin if TYPE_CHECKING: from griptape.drivers import BaseEmbeddingDriver @define -class BaseVectorStoreDriver(SerializableMixin, ABC): +class BaseVectorStoreDriver(EventPublisherMixin, SerializableMixin, ABC): DEFAULT_QUERY_COUNT = 5 @dataclass diff --git a/griptape/mixins/__init__.py b/griptape/mixins/__init__.py index d9eea53c2..944027c59 100644 --- a/griptape/mixins/__init__.py +++ b/griptape/mixins/__init__.py @@ -4,6 +4,7 @@ from .rule_mixin import RuleMixin from .serializable_mixin import SerializableMixin from .media_artifact_file_output_mixin import BlobArtifactFileOutputMixin +from .event_publisher_mixin import EventPublisherMixin __all__ = [ "ActivityMixin", @@ -12,4 +13,5 @@ "RuleMixin", "BlobArtifactFileOutputMixin", "SerializableMixin", + "EventPublisherMixin", ] diff --git a/griptape/mixins/event_publisher_mixin.py b/griptape/mixins/event_publisher_mixin.py new file mode 100644 index 000000000..67a302ed6 --- /dev/null +++ b/griptape/mixins/event_publisher_mixin.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from attrs import define, field + +if TYPE_CHECKING: + from griptape.events import BaseEvent, EventListener + + +@define +class EventPublisherMixin: + event_listeners: list[EventListener] = field(factory=list, kw_only=True) + + def add_event_listeners(self, event_listeners: list[EventListener]) -> list[EventListener]: + return [self.add_event_listener(event_listener) for event_listener in event_listeners] + + def remove_event_listeners(self, event_listeners: list[EventListener]) -> None: + for event_listener in event_listeners: + self.remove_event_listener(event_listener) + + def add_event_listener(self, event_listener: EventListener) -> EventListener: + if event_listener not in self.event_listeners: + self.event_listeners.append(event_listener) + + return event_listener + + def remove_event_listener(self, event_listener: EventListener) -> None: + if event_listener in self.event_listeners: + self.event_listeners.remove(event_listener) + + def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None: + for event_listener in self.event_listeners: + event_listener.publish_event(event, flush=flush) diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 728fdb34f..f2172b119 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -113,8 +113,6 @@ def _resolve_types(cls, attrs_cls: type) -> None: Reference, ToolAction, ) - - # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import ( BaseAudioTranscriptionDriver, BaseConversationMemoryDriver, @@ -125,11 +123,12 @@ def _resolve_types(cls, attrs_cls: type) -> None: BaseTextToSpeechDriver, BaseVectorStoreDriver, ) + from griptape.events import EventListener from griptape.memory.structure import Run from griptape.structures import Structure - from griptape.tokenizers.base_tokenizer import BaseTokenizer + from griptape.tokenizers import BaseTokenizer from griptape.tools import BaseTool - from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed + from griptape.utils import import_optional_dependency, is_dependency_installed attrs.resolve_types( attrs_cls, @@ -145,6 +144,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: "BaseImageGenerationDriver": BaseImageGenerationDriver, "BaseArtifact": BaseArtifact, "PromptStack": PromptStack, + "EventListener": EventListener, "BaseMessageContent": BaseMessageContent, "BaseDeltaMessageContent": BaseDeltaMessageContent, "BaseTool": BaseTool, diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 0a296f980..765910f5c 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -12,8 +12,13 @@ from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact from griptape.common import observable from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig -from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver -from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver +from griptape.drivers import ( + BaseEmbeddingDriver, + BasePromptDriver, + LocalVectorStoreDriver, + OpenAiChatPromptDriver, + OpenAiEmbeddingDriver, +) from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( @@ -29,17 +34,17 @@ from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage +from griptape.mixins import EventPublisherMixin from griptape.utils import deprecation_warn if TYPE_CHECKING: - from griptape.events import BaseEvent, EventListener from griptape.memory.structure import BaseConversationMemory from griptape.rules import Rule, Ruleset from griptape.tasks import BaseTask @define -class Structure(ABC): +class Structure(ABC, EventPublisherMixin): LOGGER_NAME = "griptape" id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True) @@ -55,7 +60,6 @@ class Structure(ABC): tasks: list[BaseTask] = field(factory=list, kw_only=True) custom_logger: Optional[Logger] = field(default=None, kw_only=True) logger_level: int = field(default=logging.INFO, kw_only=True) - event_listeners: list[EventListener] = field(factory=list, kw_only=True) conversation_memory: Optional[BaseConversationMemory] = field( default=Factory( lambda self: ConversationMemory(driver=self.config.conversation_memory_driver), @@ -90,9 +94,11 @@ def validate_rules(self, _: Attribute, rules: list[Rule]) -> None: raise ValueError("can't have both rules and rulesets specified") def __attrs_post_init__(self) -> None: - if self.conversation_memory: + if self.conversation_memory is not None: self.conversation_memory.structure = self + self.config.structure = self + tasks = self.tasks.copy() self.tasks.clear() self.add_tasks(*tasks) @@ -217,22 +223,6 @@ def find_task(self, task_id: str) -> BaseTask: def add_tasks(self, *tasks: BaseTask) -> list[BaseTask]: return [self.add_task(s) for s in tasks] - def add_event_listener(self, event_listener: EventListener) -> EventListener: - if event_listener not in self.event_listeners: - self.event_listeners.append(event_listener) - - return event_listener - - def remove_event_listener(self, event_listener: EventListener) -> None: - if event_listener in self.event_listeners: - self.event_listeners.remove(event_listener) - else: - raise ValueError("Event Listener not found.") - - def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None: - for event_listener in self.event_listeners: - event_listener.publish_event(event, flush=True) - def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 3b9f937a1..299fe5dfe 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -106,7 +106,7 @@ def is_executing(self) -> bool: return self.state == BaseTask.State.EXECUTING def before_run(self) -> None: - if self.structure: + if self.structure is not None: self.structure.publish_event( StartTaskEvent( task_id=self.id, @@ -118,7 +118,7 @@ def before_run(self) -> None: ) def after_run(self) -> None: - if self.structure: + if self.structure is not None: self.structure.publish_event( FinishTaskEvent( task_id=self.id, diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index e5319a803..386ebe239 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -12,7 +12,6 @@ if TYPE_CHECKING: from griptape.drivers import BasePromptDriver - from griptape.structures import Structure @define @@ -66,13 +65,6 @@ def prompt_driver(self) -> BasePromptDriver: raise ValueError("Prompt Driver is not set") return self._prompt_driver - def preprocess(self, structure: Structure) -> PromptTask: - super().preprocess(structure) - if self.prompt_driver is not None: - self.prompt_driver.structure = structure - - return self - def default_system_template_generator(self, _: PromptTask) -> str: return J2("tasks/prompt_task/system.j2").render( rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 372004423..bf33e5df8 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -37,7 +37,7 @@ class Stream: @structure.validator # pyright: ignore[reportAttributeAccessIssue] def validate_structure(self, _: Attribute, structure: Structure) -> None: - if structure and not structure.config.prompt_driver.stream: + if not structure.config.prompt_driver.stream: raise ValueError("prompt driver does not have streaming enabled, enable with stream=True") _event_queue: Queue[BaseEvent] = field(default=Factory(lambda: Queue())) diff --git a/tests/mocks/mock_audio_transcription_driver.py b/tests/mocks/mock_audio_transcription_driver.py new file mode 100644 index 000000000..cbf0a4d55 --- /dev/null +++ b/tests/mocks/mock_audio_transcription_driver.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from typing import Optional + +from attrs import define, field + +from griptape.artifacts import AudioArtifact, TextArtifact +from griptape.drivers.audio_transcription.base_audio_transcription_driver import BaseAudioTranscriptionDriver + + +@define +class MockAudioTranscriptionDriver(BaseAudioTranscriptionDriver): + model: str = field(default="test-model", kw_only=True) + mock_output: str = field(default="mock output", kw_only=True) + + def try_run(self, audio: AudioArtifact, prompts: Optional[list] = None) -> TextArtifact: + return TextArtifact(value=self.mock_output) diff --git a/tests/mocks/mock_image_generation_driver.py b/tests/mocks/mock_image_generation_driver.py index 10de11071..573eb0fc4 100644 --- a/tests/mocks/mock_image_generation_driver.py +++ b/tests/mocks/mock_image_generation_driver.py @@ -11,12 +11,12 @@ @define class MockImageGenerationDriver(BaseImageGenerationDriver): def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: - return ImageArtifact(value="mock image", width=512, height=512) + return ImageArtifact(value="mock image", width=512, height=512, format="png") def try_image_variation( self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None ) -> ImageArtifact: - return ImageArtifact(value="mock image", width=512, height=512) + return ImageArtifact(value="mock image", width=512, height=512, format="png") def try_image_inpainting( self, @@ -25,7 +25,7 @@ def try_image_inpainting( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: - return ImageArtifact(value="mock image", width=512, height=512) + return ImageArtifact(value="mock image", width=512, height=512, format="png") def try_image_outpainting( self, @@ -34,4 +34,4 @@ def try_image_outpainting( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: - return ImageArtifact(value="mock image", width=512, height=512) + return ImageArtifact(value="mock image", width=512, height=512, format="png") diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index 5a23dd8a2..70089430d 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -5,7 +5,17 @@ from attrs import define, field from griptape.artifacts import TextArtifact -from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent, TextMessageContent +from griptape.artifacts.action_artifact import ActionArtifact +from griptape.common import ( + ActionCallDeltaMessageContent, + ActionCallMessageContent, + DeltaMessage, + Message, + PromptStack, + TextDeltaMessageContent, + TextMessageContent, + ToolAction, +) from griptape.drivers import BasePromptDriver from tests.mocks.mock_tokenizer import MockTokenizer @@ -24,16 +34,62 @@ class MockPromptDriver(BasePromptDriver): def try_run(self, prompt_stack: PromptStack) -> Message: output = self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output - - return Message( - content=[TextMessageContent(TextArtifact(output))], - role=Message.ASSISTANT_ROLE, - usage=Message.Usage(input_tokens=100, output_tokens=100), - ) + if self.use_native_tools and prompt_stack.tools: + # Hack to simulate CoT. If there are any action messages in the prompt stack, give the answer. + action_messages = [ + message for message in prompt_stack.messages if message.has_any_content_type(ActionCallMessageContent) + ] + if any(action_messages): + return Message( + content=[TextMessageContent(TextArtifact(f"Answer: {output}"))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), + ) + else: + return Message( + content=[ + ActionCallMessageContent( + ActionArtifact( + ToolAction( + tag="mock-tag", + name="MockTool", + path="test", + input={"values": {"test": "test-value"}}, + ) + ) + ) + ], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), + ) + else: + return Message( + content=[TextMessageContent(TextArtifact(output))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), + ) def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: output = self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output - yield DeltaMessage(content=TextDeltaMessageContent(output)) - - yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=100, output_tokens=100)) + if self.use_native_tools and prompt_stack.tools: + # Hack to simulate CoT. If there are any action messages in the prompt stack, give the answer. + action_messages = [ + message for message in prompt_stack.messages if message.has_any_content_type(ActionCallMessageContent) + ] + if any(action_messages): + yield DeltaMessage(content=TextDeltaMessageContent(f"Answer: {output}")) + yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=100, output_tokens=100)) + else: + yield DeltaMessage( + content=ActionCallDeltaMessageContent( + tag="mock-tag", + name="MockTool", + path="test", + ) + ) + yield DeltaMessage( + content=ActionCallDeltaMessageContent(partial_input='{ "values": { "test": "test-value" } }') + ) + else: + yield DeltaMessage(content=TextDeltaMessageContent(output)) diff --git a/tests/mocks/mock_text_to_speech_driver.py b/tests/mocks/mock_text_to_speech_driver.py new file mode 100644 index 000000000..14be84b51 --- /dev/null +++ b/tests/mocks/mock_text_to_speech_driver.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from attrs import define, field + +from griptape.artifacts import AudioArtifact +from griptape.drivers.text_to_speech.base_text_to_speech_driver import BaseTextToSpeechDriver + + +@define +class MockTextToSpeechDriver(BaseTextToSpeechDriver): + model: str = field(default="test-model", kw_only=True) + mock_output: str = field(default="mock output", kw_only=True) + + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + return AudioArtifact(value=self.mock_output, format="mp3") diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index 96a68628f..b9e3477e4 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -1,6 +1,7 @@ import pytest from griptape.config import StructureConfig +from griptape.structures import Agent class TestStructureConfig: @@ -60,3 +61,37 @@ def test_dot_update(self, config): config.prompt_driver.max_tokens = 10 assert config.prompt_driver.max_tokens == 10 + + def test_drivers(self, config): + assert config.drivers == [ + config.prompt_driver, + config.image_generation_driver, + config.image_query_driver, + config.embedding_driver, + config.vector_store_driver, + config.conversation_memory_driver, + config.text_to_speech_driver, + config.audio_transcription_driver, + ] + + def test_structure(self, config): + structure_1 = Agent( + config=config, + ) + + assert config.structure == structure_1 + assert config._event_listener is not None + for driver in config.drivers: + if driver is not None: + assert config._event_listener in driver.event_listeners + assert len(driver.event_listeners) == 1 + + structure_2 = Agent( + config=config, + ) + assert config.structure == structure_2 + assert config._event_listener is not None + for driver in config.drivers: + if driver is not None: + assert config._event_listener in driver.event_listeners + assert len(driver.event_listeners) == 1 diff --git a/tests/unit/drivers/audio_transcription/__init__.py b/tests/unit/drivers/audio_transcription/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py new file mode 100644 index 000000000..519e40f57 --- /dev/null +++ b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py @@ -0,0 +1,33 @@ +from unittest.mock import Mock + +import pytest + +from griptape.artifacts import AudioArtifact +from griptape.events.event_listener import EventListener +from tests.mocks.mock_audio_transcription_driver import MockAudioTranscriptionDriver + + +class TestBaseAudioTranscriptionDriver: + @pytest.fixture() + def driver(self): + return MockAudioTranscriptionDriver() + + def test_run_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run( + AudioArtifact( + value="audio", + format="audio/wav", + ), + ["foo", "bar"], + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartAudioTranscriptionEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishAudioTranscriptionEvent" diff --git a/tests/unit/drivers/image_generation/test_base_image_generation_driver.py b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py new file mode 100644 index 000000000..7447b2c08 --- /dev/null +++ b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py @@ -0,0 +1,107 @@ +from unittest.mock import Mock + +import pytest + +from griptape.artifacts.image_artifact import ImageArtifact +from griptape.events.event_listener import EventListener +from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver + + +class TestBaseImageGenerationDriver: + @pytest.fixture() + def driver(self): + return MockImageGenerationDriver(model="foo") + + def test_run_text_to_image_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run_text_to_image( + ["foo", "bar"], + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartImageGenerationEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishImageGenerationEvent" + + def test_run_image_variation_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run_image_variation( + ["foo", "bar"], + ImageArtifact( + value="mock image", + width=512, + height=512, + format="png", + ), + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartImageGenerationEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishImageGenerationEvent" + + def test_run_image_image_inpainting_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run_image_inpainting( + ["foo", "bar"], + ImageArtifact( + value="mock image", + width=512, + height=512, + format="png", + ), + ImageArtifact( + value="mock image", + width=512, + height=512, + format="png", + ), + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartImageGenerationEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishImageGenerationEvent" + + def test_run_image_image_outpainting_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run_image_outpainting( + ["foo", "bar"], + ImageArtifact( + value="mock image", + width=512, + height=512, + format="png", + ), + ImageArtifact( + value="mock image", + width=512, + height=512, + format="png", + ), + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartImageGenerationEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishImageGenerationEvent" diff --git a/tests/unit/drivers/image_query/__init__.py b/tests/unit/drivers/image_query/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/image_query/test_base_image_query_driver.py b/tests/unit/drivers/image_query/test_base_image_query_driver.py new file mode 100644 index 000000000..14de15f2d --- /dev/null +++ b/tests/unit/drivers/image_query/test_base_image_query_driver.py @@ -0,0 +1,26 @@ +from unittest.mock import Mock + +import pytest + +from griptape.events.event_listener import EventListener +from tests.mocks.mock_image_query_driver import MockImageQueryDriver + + +class TestBaseImageQueryDriver: + @pytest.fixture() + def driver(self): + return MockImageQueryDriver(model="foo") + + def test_query_publishes_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.query("foo", []) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartImageQueryEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishImageQueryEvent" diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 3c2bb333e..2708b0a88 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -1,11 +1,12 @@ from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.common import PromptStack -from griptape.common.prompt_stack.messages.message import Message +from griptape.common import Message, PromptStack from griptape.events import FinishPromptEvent, StartPromptEvent +from griptape.mixins import EventPublisherMixin from griptape.structures import Pipeline -from griptape.tasks import PromptTask +from griptape.tasks import PromptTask, ToolkitTask from tests.mocks.mock_failing_prompt_driver import MockFailingPromptDriver from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_tool.tool import MockTool class TestBasePromptDriver: @@ -26,7 +27,7 @@ def test_run_via_pipeline_retries_failure(self): assert isinstance(pipeline.run().output_task.output, ErrorArtifact) def test_run_via_pipeline_publishes_events(self, mocker): - mock_publish_event = mocker.patch.object(Pipeline, "publish_event") + mock_publish_event = mocker.patch.object(EventPublisherMixin, "publish_event") driver = MockPromptDriver() pipeline = Pipeline(prompt_driver=driver) pipeline.add_task(PromptTask("test")) @@ -34,18 +35,34 @@ def test_run_via_pipeline_publishes_events(self, mocker): pipeline.run() events = [call_args[0][0] for call_args in mock_publish_event.call_args_list] - assert instance_count(events, StartPromptEvent) == 1 - assert instance_count(events, FinishPromptEvent) == 1 + assert len([instance for instance in events if isinstance(instance, StartPromptEvent)]) == 1 + assert len([instance for instance in events if isinstance(instance, FinishPromptEvent)]) == 1 def test_run(self): assert isinstance(MockPromptDriver().run(PromptStack(messages=[])), Message) def test_run_with_stream(self): pipeline = Pipeline() - result = MockPromptDriver(stream=True, structure=pipeline).run(PromptStack(messages=[])) + result = MockPromptDriver(stream=True, event_listeners=pipeline.event_listeners).run(PromptStack(messages=[])) assert isinstance(result, Message) assert result.value == "mock output" + def test_run_with_tools(self): + driver = MockPromptDriver(max_attempts=1, use_native_tools=True) + pipeline = Pipeline(prompt_driver=driver) + + pipeline.add_task(ToolkitTask(tools=[MockTool()])) + + output = pipeline.run().output_task.output + assert isinstance(output, TextArtifact) + assert output.value == "mock output" + + def test_run_with_tools_and_stream(self): + driver = MockPromptDriver(max_attempts=1, stream=True, use_native_tools=True) + pipeline = Pipeline(prompt_driver=driver) + + pipeline.add_task(ToolkitTask(tools=[MockTool()])) -def instance_count(instances, clazz): - return len([instance for instance in instances if isinstance(instance, clazz)]) + output = pipeline.run().output_task.output + assert isinstance(output, TextArtifact) + assert output.value == "mock output" diff --git a/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py new file mode 100644 index 000000000..8af5dc827 --- /dev/null +++ b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py @@ -0,0 +1,28 @@ +from unittest.mock import Mock + +import pytest + +from griptape.events.event_listener import EventListener +from tests.mocks.mock_text_to_speech_driver import MockTextToSpeechDriver + + +class TestBaseTextToSpeechDriver: + @pytest.fixture() + def driver(self): + return MockTextToSpeechDriver() + + def test_text_to_audio_publish_events(self, driver): + mock_handler = Mock() + driver.add_event_listener(EventListener(handler=mock_handler)) + + driver.run_text_to_audio( + ["foo", "bar"], + ) + + call_args = mock_handler.call_args_list + + args, _kwargs = call_args[0] + assert args[0].type == "StartTextToSpeechEvent" + + args, _kwargs = call_args[1] + assert args[0].type == "FinishTextToSpeechEvent" diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index a79d2b6ea..b245c2be9 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -38,6 +38,7 @@ def test_untyped_listeners(self, pipeline): event_handler_2 = Mock() pipeline.event_listeners = [EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)] + # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() pipeline.tasks[0].subtasks[0].after_run() diff --git a/tests/unit/mixins/test_events_mixin.py b/tests/unit/mixins/test_events_mixin.py new file mode 100644 index 000000000..99f5541ba --- /dev/null +++ b/tests/unit/mixins/test_events_mixin.py @@ -0,0 +1,59 @@ +from unittest.mock import Mock + +from griptape.events import EventListener +from griptape.mixins import EventPublisherMixin +from tests.mocks.mock_event import MockEvent + + +class TestEventsMixin: + def test_init(self): + assert EventPublisherMixin() + + def test_add_event_listeners(self): + mixin = EventPublisherMixin() + + mixin.add_event_listeners([EventListener(), EventListener()]) + assert len(mixin.event_listeners) == 2 + + def test_remove_event_listeners(self): + mixin = EventPublisherMixin() + + listeners = [EventListener(), EventListener()] + mixin.add_event_listeners(listeners) + mixin.remove_event_listeners(listeners) + assert len(mixin.event_listeners) == 0 + + def test_add_event_listener(self): + mixin = EventPublisherMixin() + + mixin.add_event_listener(EventListener()) + mixin.add_event_listener(EventListener()) + + assert len(mixin.event_listeners) == 2 + + def test_remove_event_listener(self): + mixin = EventPublisherMixin() + + listener = EventListener() + mixin.add_event_listener(listener) + mixin.remove_event_listener(listener) + + assert len(mixin.event_listeners) == 0 + + def test_remove_unknown_event_listener(self): + mixin = EventPublisherMixin() + + mixin.remove_event_listener(EventListener()) + + def test_publish_event(self): + # Given + mock_handler = Mock() + mock_handler.return_value = None + mixin = EventPublisherMixin(event_listeners=[EventListener(handler=mock_handler)]) + mock_event = MockEvent() + + # When + mixin.publish_event(mock_event) + + # Then + mock_handler.assert_called_once_with(mock_event) diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 7a1afcf07..87602dbbb 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -1,6 +1,9 @@ +from unittest.mock import Mock + import pytest from griptape.artifacts import TextArtifact +from griptape.events.event_listener import EventListener from griptape.structures import Agent, Workflow from griptape.tasks import ActionsSubtask from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -12,7 +15,12 @@ class TestBaseTask: @pytest.fixture() def task(self): - agent = Agent(prompt_driver=MockPromptDriver(), embedding_driver=MockEmbeddingDriver(), tools=[MockTool()]) + agent = Agent( + prompt_driver=MockPromptDriver(), + embedding_driver=MockEmbeddingDriver(), + tools=[MockTool()], + event_listeners=[EventListener(handler=Mock())], + ) agent.add_task(MockTask("foobar", max_meta_memory_entries=2)) @@ -67,3 +75,8 @@ def test_parents_output(self, task): parent_2.output = None assert child.parents_output_text == "foobar1\nfoobar3" + + def test_execute_publish_events(self, task): + task.execute() + + assert task.structure.event_listeners[0].handler.call_count == 2 diff --git a/tests/unit/utils/test_stream.py b/tests/unit/utils/test_stream.py index 767d31ba0..da6695139 100644 --- a/tests/unit/utils/test_stream.py +++ b/tests/unit/utils/test_stream.py @@ -10,7 +10,7 @@ class TestStream: @pytest.fixture(params=[True, False]) def agent(self, request): - return Agent(prompt_driver=MockPromptDriver(stream=request.param)) + return Agent(prompt_driver=MockPromptDriver(stream=request.param, max_attempts=0)) def test_init(self, agent): if agent.prompt_driver.stream: From e0581f8576ce22be865fe04e7704757e0a038e87 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 11:43:04 -0700 Subject: [PATCH 185/238] Document accessing Structure output (#1010) --- docs/griptape-framework/index.md | 29 +++++++---- docs/griptape-framework/structures/agents.md | 49 +++++++++---------- .../structures/pipelines.md | 2 + .../structures/workflows.md | 1 + 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index c31b8942c..b5613b184 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -111,23 +111,32 @@ agent = Agent( agent.run( "what is 7^12" ) +print("Answer:", agent.output) ``` Here is the chain of thought from the Agent. Notice where it realizes it can use the tool you just injected to do the calculation.[^1] [^1]: In some cases a model might be capable of basic arithmetic. For example, gpt-3.5 returns the correct numeric answer but in an odd format. ``` -[09/08/23 09:53:42] INFO ToolkitTask c87320c5ab1b4988acf25c107b46dffa +[07/23/24 10:47:38] INFO ToolkitTask 6a51060d1fb74e57840a91aa319f26dc Input: what is 7^12 -[09/08/23 09:53:49] INFO Subtask f3f41104a2234a69832c7eacb64e7324 - Thought: The user is asking for the value of 7 raised to the power of 12. I can use the Calculator tool to - perform this calculation. - - Action: {"name": "Calculator", "path": "calculate", "input": {"values": {"expression": - "7**12"}}} - INFO Subtask f3f41104a2234a69832c7eacb64e7324 +[07/23/24 10:47:39] INFO Subtask 0c984616fd2345a7b48a0b0d692daa3c + Actions: [ + { + "tag": "call_RTRm7JLFV0F73dCVPmoWVJqO", + "name": "Calculator", + "path": "calculate", + "input": { + "values": { + "expression": "7**12" + } + } + } + ] + INFO Subtask 0c984616fd2345a7b48a0b0d692daa3c Response: 13841287201 -[09/08/23 09:53:51] INFO ToolkitTask c87320c5ab1b4988acf25c107b46dffa - Output: The value of 7 raised to the power of 12 is 13841287201. +[07/23/24 10:47:40] INFO ToolkitTask 6a51060d1fb74e57840a91aa319f26dc + Output: 13,841,287,201 +Answer: 13,841,287,201 ``` ## Build a Simple Pipeline diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 33363198f..8f6a6edb0 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -12,6 +12,8 @@ directly, which the agent uses to dynamically determine whether to use a [Prompt If [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) are passed provided to the Agent, a [Toolkit Task](./tasks.md#toolkit-task) will be used. If no [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) are provided, a [Prompt Task](./tasks.md#prompt-task) will be used. +You can access the final output of the Agent by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. + ## Toolkit Task Agent ```python @@ -24,34 +26,31 @@ agent = Agent( tools=[Calculator()] ) -agent.run("what's 123^312?") +agent.run("what's 13^7?") +print("Answer:", agent.output) ``` ``` -[09/08/23 10:11:31] INFO ToolkitTask 319f53af2e564c15a3b97992fc039ec9 - Input: Calculate the following: what's 123^312? -[09/08/23 10:11:55] INFO Subtask cbd5bb8684ad4fc59958201efbf14743 - Thought: The user wants to calculate the value of 123 raised to the power of 312. I can use the Calculator tool - to perform this calculation. - - Action: {"name": "Calculator", "path": "calculate", "input": {"values": {"expression": - "123**312"}}} - INFO Subtask cbd5bb8684ad4fc59958201efbf14743 - Response: - 11230388208945295722090491952733133124202871121067044284403441616854053130045246777417573635449877716182202751456 - 62903768337745814236262209544548389555407097435988334710646912635818793342584092805141253230302226219003560706069 - 42457739968799225811781682901969575983855664495472037997890318771511185547708335412624757899597237206373758262442 - 72269858013479598852506666010704868797813623903160430655651532132073996589276408598241791795573009265505912300559 - 47848517605515539611362917584666826953065776743002119105282582194109888263281423789852046556346579319777145449509 - 5671672325351081760983520684046903739998382099007883142337182654942065184263509761170721 -[09/08/23 10:12:22] INFO ToolkitTask 319f53af2e564c15a3b97992fc039ec9 - Output: The result of 123 raised to the power of 312 is - 11230388208945295722090491952733133124202871121067044284403441616854053130045246777417573635449877716182202751456 - 62903768337745814236262209544548389555407097435988334710646912635818793342584092805141253230302226219003560706069 - 42457739968799225811781682901969575983855664495472037997890318771511185547708335412624757899597237206373758262442 - 72269858013479598852506666010704868797813623903160430655651532132073996589276408598241791795573009265505912300559 - 47848517605515539611362917584666826953065776743002119105282582194109888263281423789852046556346579319777145449509 - 5671672325351081760983520684046903739998382099007883142337182654942065184263509761170721. +[07/23/24 10:53:41] INFO ToolkitTask 487db777bc014193ba90b061451b69a6 + Input: Calculate the following: what's 13^7? +[07/23/24 10:53:42] INFO Subtask 126cefa3ac5347b88495e25af52f3268 + Actions: [ + { + "tag": "call_ZSCH6vNoycOgtPJH2DL2U9ji", + "name": "Calculator", + "path": "calculate", + "input": { + "values": { + "expression": "13**7" + } + } + } + ] + INFO Subtask 126cefa3ac5347b88495e25af52f3268 + Response: 62748517 +[07/23/24 10:53:43] INFO ToolkitTask 487db777bc014193ba90b061451b69a6 + Output: 62,748,517 +Answer: 62,748,517 ``` ## Prompt Task Agent diff --git a/docs/griptape-framework/structures/pipelines.md b/docs/griptape-framework/structures/pipelines.md index 4753ad52d..ad652f6c0 100644 --- a/docs/griptape-framework/structures/pipelines.md +++ b/docs/griptape-framework/structures/pipelines.md @@ -6,6 +6,8 @@ search: ## Overview A [Pipeline](../../reference/griptape/structures/pipeline.md) is very similar to an [Agent](../../reference/griptape/structures/agent.md), but allows for multiple tasks. +You can access the final output of the Pipeline by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. + ## Context Pipelines have access to the following [context](../../reference/griptape/structures/pipeline.md#griptape.structures.pipeline.Pipeline.context) variables in addition to the [base context](./tasks.md#context). diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 55014796e..75511171f 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -7,6 +7,7 @@ search: A [Workflow](../../reference/griptape/structures/workflow.md) is a non-sequential DAG that can be used for complex concurrent scenarios with tasks having multiple inputs. +You can access the final output of the Workflow by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. ## Context From c45d3edadf89a740cfd0ebbee648db300dd7ce34 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 14:12:51 -0700 Subject: [PATCH 186/238] Fix Integration Tests (#1011) --- docs/griptape-framework/engines/audio-engines.md | 2 +- griptape/drivers/sql/snowflake_sql_driver.py | 2 +- tests/unit/drivers/sql/test_snowflake_sql_driver.py | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md index e857bf77b..8f637dca0 100644 --- a/docs/griptape-framework/engines/audio-engines.md +++ b/docs/griptape-framework/engines/audio-engines.md @@ -21,7 +21,7 @@ from griptape.engines import TextToSpeechEngine driver = ElevenLabsTextToSpeechDriver( api_key=os.getenv("ELEVEN_LABS_API_KEY"), model="eleven_multilingual_v2", - voice="Rachel", + voice="Laura", ) engine = TextToSpeechEngine( diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index 43d147663..656bc4b99 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -59,7 +59,7 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Any]]]: if results is not None: if results.returns_rows: - return [dict(result.items()) for result in results] + return [dict(result._mapping) for result in results] else: return None else: diff --git a/tests/unit/drivers/sql/test_snowflake_sql_driver.py b/tests/unit/drivers/sql/test_snowflake_sql_driver.py index 055b1e744..a2887cb12 100644 --- a/tests/unit/drivers/sql/test_snowflake_sql_driver.py +++ b/tests/unit/drivers/sql/test_snowflake_sql_driver.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from typing import Any from unittest import mock import pytest @@ -36,8 +37,8 @@ def mock_snowflake_engine(self, mocker): items_mock = mocker.MagicMock(name="items") items_mock_2 = mocker.MagicMock(name="items2") - items_mock.items.return_value = [("first_name", "Tony"), ("last_name", "Hawk")] - items_mock_2.items.return_value = [("first_name", "Bob"), ("last_name", "Ross")] + items_mock._mapping = [("first_name", "Tony"), ("last_name", "Hawk")] + items_mock_2._mapping = [("first_name", "Bob"), ("last_name", "Ross")] result_mock.return_value.returns_rows = True result_mock.__iter__.return_value = iter([items_mock, items_mock_2]) @@ -71,7 +72,7 @@ def get_connection(): return new_driver def test_connection_function_wrong_return_type(self): - def get_connection(): + def get_connection() -> Any: return object with pytest.raises(ValueError): From 19a1ec48b8555db2a6fe838a398ee31f212d37c0 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 14:26:00 -0700 Subject: [PATCH 187/238] Fix/base install (#1009) --- .../actions/init-bare-environment/action.yml | 37 +++++++ .github/workflows/unit-tests.yml | 13 +++ Makefile | 16 +++ .../datadog_observability_driver.py | 16 ++- .../griptape_cloud_observability_driver.py | 102 ++++++++++-------- .../open_telemetry_observability_driver.py | 45 +++++--- .../vector/pgvector_vector_store_driver.py | 57 ++++++---- poetry.lock | 40 ++++--- ...est_griptape_cloud_observability_driver.py | 4 +- .../test_pgvector_vector_store_driver.py | 2 +- 10 files changed, 225 insertions(+), 107 deletions(-) create mode 100644 .github/actions/init-bare-environment/action.yml diff --git a/.github/actions/init-bare-environment/action.yml b/.github/actions/init-bare-environment/action.yml new file mode 100644 index 000000000..8cdee6027 --- /dev/null +++ b/.github/actions/init-bare-environment/action.yml @@ -0,0 +1,37 @@ +name: "Init Environment" +description: "Initialize bare environment for tests" +runs: + using: "composite" + steps: + - name: Checkout actions + uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-bare-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root --with test --with dev + shell: bash + + - name: Activate venv + run: | + source $VENV + echo PATH=$PATH >> $GITHUB_ENV + shell: bash diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 946af9a51..dd819fbb3 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -24,6 +24,19 @@ jobs: uses: ./.github/actions/init-environment - name: Run unit tests run: make test/unit + test-bare: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.9"] + steps: + - name: Checkout actions + uses: actions/checkout@v3 + - name: Init environment + uses: ./.github/actions/init-bare-environment + - name: Run unit tests + run: poetry run pytest -n auto tests/unit/structures test-windows: runs-on: windows-latest strategy: diff --git a/Makefile b/Makefile index d14c7184d..837a4b155 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,24 @@ publish: ## Push git tag and publish version to PyPI. .PHONY: install install: ## Install all dependencies. + @make install/all + +.PHONY: install/core +install/core: ## Install core dependencies. + @poetry install + +.PHONY: install/all +install/all: ## Install all dependencies. @poetry install --with dev --with test --with docs --all-extras +.PHONY: install/dev +install/dev: ## Install dev dependencies. + @poetry install --with dev + +.PHONY: install/test +install/test: ## Install test dependencies. + @poetry install --with test + .PHONY: test ## Run all tests. test: test/unit test/integration diff --git a/griptape/drivers/observability/datadog_observability_driver.py b/griptape/drivers/observability/datadog_observability_driver.py index 019fd76b6..a3041a98d 100644 --- a/griptape/drivers/observability/datadog_observability_driver.py +++ b/griptape/drivers/observability/datadog_observability_driver.py @@ -1,11 +1,15 @@ +from __future__ import annotations + import os +from typing import TYPE_CHECKING from attrs import Factory, define, field -from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter -from opentelemetry.sdk.trace import SpanProcessor -from opentelemetry.sdk.trace.export import BatchSpanProcessor from griptape.drivers.observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from opentelemetry.sdk.trace import SpanProcessor @define @@ -15,7 +19,11 @@ class DatadogObservabilityDriver(OpenTelemetryObservabilityDriver): ) span_processor: SpanProcessor = field( default=Factory( - lambda self: BatchSpanProcessor(OTLPSpanExporter(endpoint=f"{self.datadog_agent_endpoint}/v1/traces")), + lambda self: import_optional_dependency("opentelemetry.sdk.trace.export").BatchSpanProcessor( + import_optional_dependency("opentelemetry.exporter.otlp.proto.http.trace_exporter").OTLPSpanExporter( + endpoint=f"{self.datadog_agent_endpoint}/v1/traces" + ) + ), takes_self=True, ), kw_only=True, diff --git a/griptape/drivers/observability/griptape_cloud_observability_driver.py b/griptape/drivers/observability/griptape_cloud_observability_driver.py index eec5f5f90..6c99bd231 100644 --- a/griptape/drivers/observability/griptape_cloud_observability_driver.py +++ b/griptape/drivers/observability/griptape_cloud_observability_driver.py @@ -7,55 +7,19 @@ import requests from attrs import Attribute, Factory, define, field -from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter, SpanExportResult -from opentelemetry.sdk.util import ns_to_iso_str -from opentelemetry.trace import INVALID_SPAN, get_current_span from griptape.drivers.observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver +from griptape.utils.import_utils import import_optional_dependency if TYPE_CHECKING: from collections.abc import Sequence from opentelemetry.sdk.trace import ReadableSpan, SpanProcessor + from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult @define class GriptapeCloudObservabilityDriver(OpenTelemetryObservabilityDriver): - @define - class SpanExporter(SpanExporter): - base_url: str = field(kw_only=True) - api_key: str = field(kw_only=True) - headers: dict = field(kw_only=True) - structure_run_id: str = field(kw_only=True) - - def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: - url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/spans") - payload = [ - { - "trace_id": GriptapeCloudObservabilityDriver.format_trace_id(span.context.trace_id), - "span_id": GriptapeCloudObservabilityDriver.format_span_id(span.context.span_id), - "parent_id": GriptapeCloudObservabilityDriver.format_span_id(span.parent.span_id) - if span.parent - else None, - "name": span.name, - "start_time": ns_to_iso_str(span.start_time) if span.start_time else None, - "end_time": ns_to_iso_str(span.end_time) if span.end_time else None, - "status": span.status.status_code.name, - "attributes": {**span.attributes} if span.attributes else {}, - "events": [ - { - "name": event.name, - "timestamp": ns_to_iso_str(event.timestamp) if event.timestamp else None, - "attributes": {**event.attributes} if event.attributes else {}, - } - for event in span.events - ], - } - for span in spans - ] - response = requests.post(url=url, json=payload, headers=self.headers) - return SpanExportResult.SUCCESS if response.status_code == 200 else SpanExportResult.FAILURE - base_url: str = field( default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True ) @@ -66,8 +30,8 @@ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) span_processor: SpanProcessor = field( default=Factory( - lambda self: BatchSpanProcessor( - GriptapeCloudObservabilityDriver.SpanExporter( + lambda self: import_optional_dependency("opentelemetry.sdk.trace.export").BatchSpanProcessor( + GriptapeCloudObservabilityDriver.build_span_exporter( base_url=self.base_url, api_key=self.api_key, headers=self.headers, @@ -94,8 +58,62 @@ def format_trace_id(trace_id: int) -> str: def format_span_id(span_id: int) -> str: return str(UUID(int=span_id)) + @staticmethod + def build_span_exporter(base_url: str, api_key: str, headers: dict, structure_run_id: str) -> SpanExporter: + @define + class SpanExporter(import_optional_dependency("opentelemetry.sdk.trace.export").SpanExporter): + base_url: str = field(kw_only=True) + api_key: str = field(kw_only=True) + headers: dict = field(kw_only=True) + structure_run_id: str = field(kw_only=True) + + def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: + opentelemetry_util = import_optional_dependency("opentelemetry.sdk.util") + opentelemetry_trace_export = import_optional_dependency("opentelemetry.sdk.trace.export") + + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/spans") + payload = [ + { + "trace_id": GriptapeCloudObservabilityDriver.format_trace_id(span.context.trace_id), + "span_id": GriptapeCloudObservabilityDriver.format_span_id(span.context.span_id), + "parent_id": GriptapeCloudObservabilityDriver.format_span_id(span.parent.span_id) + if span.parent + else None, + "name": span.name, + "start_time": opentelemetry_util.ns_to_iso_str(span.start_time) if span.start_time else None, + "end_time": opentelemetry_util.ns_to_iso_str(span.end_time) if span.end_time else None, + "status": span.status.status_code.name, + "attributes": {**span.attributes} if span.attributes else {}, + "events": [ + { + "name": event.name, + "timestamp": opentelemetry_util.ns_to_iso_str(event.timestamp) + if event.timestamp + else None, + "attributes": {**event.attributes} if event.attributes else {}, + } + for event in span.events + ], + } + for span in spans + ] + response = requests.post(url=url, json=payload, headers=self.headers) + return ( + opentelemetry_trace_export.SpanExportResult.SUCCESS + if response.status_code == 200 + else opentelemetry_trace_export.SpanExportResult.FAILURE + ) + + return SpanExporter( + base_url=base_url, + api_key=api_key, + headers=headers, + structure_run_id=structure_run_id, + ) + def get_span_id(self) -> Optional[str]: - span = get_current_span() - if span is INVALID_SPAN: + opentelemetry_trace = import_optional_dependency("opentelemetry.trace") + span = opentelemetry_trace.get_current_span() + if span is opentelemetry_trace.INVALID_SPAN: return None return GriptapeCloudObservabilityDriver.format_span_id(span.get_span_context().span_id) diff --git a/griptape/drivers/observability/open_telemetry_observability_driver.py b/griptape/drivers/observability/open_telemetry_observability_driver.py index 97a5633fb..7e07b0bef 100644 --- a/griptape/drivers/observability/open_telemetry_observability_driver.py +++ b/griptape/drivers/observability/open_telemetry_observability_driver.py @@ -3,16 +3,16 @@ from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field -from opentelemetry.instrumentation.threading import ThreadingInstrumentor -from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk.trace import SpanProcessor, TracerProvider -from opentelemetry.trace import INVALID_SPAN, Status, StatusCode, Tracer, format_span_id, get_current_span, get_tracer from griptape.drivers import BaseObservabilityDriver +from griptape.utils.import_utils import import_optional_dependency if TYPE_CHECKING: from types import TracebackType + from opentelemetry.sdk.trace import SpanProcessor, TracerProvider + from opentelemetry.trace import Tracer + from griptape.common import Observable @@ -33,19 +33,26 @@ class OpenTelemetryObservabilityDriver(BaseObservabilityDriver): _root_span_context_manager: Any = None def _trace_provider_factory(self) -> TracerProvider: + opentelemetry_trace = import_optional_dependency("opentelemetry.sdk.trace") + attributes = {"service.name": self.service_name} if self.service_version is not None: attributes["service.version"] = self.service_version if self.deployment_env is not None: attributes["deployment.environment"] = self.deployment_env - return TracerProvider(resource=Resource(attributes=attributes)) # pyright: ignore[reportArgumentType] + return opentelemetry_trace.TracerProvider( + resource=import_optional_dependency("opentelemetry.sdk.resources").Resource(attributes=attributes) + ) # pyright: ignore[reportArgumentType] def __attrs_post_init__(self) -> None: + opentelemetry_trace = import_optional_dependency("opentelemetry.trace") self.trace_provider.add_span_processor(self.span_processor) - self._tracer = get_tracer(self.service_name, tracer_provider=self.trace_provider) + self._tracer = opentelemetry_trace.get_tracer(self.service_name, tracer_provider=self.trace_provider) def __enter__(self) -> None: - ThreadingInstrumentor().instrument() + opentelemetry_instrumentation_threading = import_optional_dependency("opentelemetry.instrumentation.threading") + + opentelemetry_instrumentation_threading.ThreadingInstrumentor().instrument() self._root_span_context_manager = self._tracer.start_as_current_span("main") # pyright: ignore[reportCallIssue] self._root_span_context_manager.__enter__() @@ -55,21 +62,24 @@ def __exit__( exc_value: Optional[BaseException], exc_traceback: Optional[TracebackType], ) -> bool: - root_span = get_current_span() + opentelemetry_trace = import_optional_dependency("opentelemetry.trace") + opentelemetry_instrumentation_threading = import_optional_dependency("opentelemetry.instrumentation.threading") + root_span = opentelemetry_trace.get_current_span() if exc_value: - root_span = get_current_span() - root_span.set_status(Status(StatusCode.ERROR)) + root_span = opentelemetry_trace.get_current_span() + root_span.set_status(opentelemetry_trace.Status(opentelemetry_trace.StatusCode.ERROR)) root_span.record_exception(exc_value) else: - root_span.set_status(Status(StatusCode.OK)) + root_span.set_status(opentelemetry_trace.Status(opentelemetry_trace.StatusCode.OK)) if self._root_span_context_manager: self._root_span_context_manager.__exit__(exc_type, exc_value, exc_traceback) self._root_span_context_manager = None self.trace_provider.force_flush() - ThreadingInstrumentor().uninstrument() + opentelemetry_instrumentation_threading.ThreadingInstrumentor().uninstrument() return False def observe(self, call: Observable.Call) -> Any: + open_telemetry_trace = import_optional_dependency("opentelemetry.trace") func = call.func instance = call.instance tags = call.tags @@ -82,15 +92,16 @@ def observe(self, call: Observable.Call) -> Any: try: result = call() - span.set_status(Status(StatusCode.OK)) + span.set_status(open_telemetry_trace.Status(open_telemetry_trace.StatusCode.OK)) return result except Exception as e: - span.set_status(Status(StatusCode.ERROR)) + span.set_status(open_telemetry_trace.Status(open_telemetry_trace.StatusCode.ERROR)) span.record_exception(e) raise e def get_span_id(self) -> Optional[str]: - span = get_current_span() - if span is INVALID_SPAN: + opentelemetry_trace = import_optional_dependency("opentelemetry.trace") + span = opentelemetry_trace.get_current_span() + if span is opentelemetry_trace.INVALID_SPAN: return None - return format_span_id(span.get_span_context().span_id) + return opentelemetry_trace.format_span_id(span.get_span_context().span_id) diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 0dbf96d9c..30f437c7e 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -3,19 +3,16 @@ import uuid from collections import OrderedDict from dataclasses import dataclass -from typing import Any, NoReturn, Optional, cast +from typing import TYPE_CHECKING, Any, NoReturn, Optional from attrs import Attribute, Factory, define, field -from sqlalchemy import JSON, Column, String, create_engine -from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy.engine import Engine -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import Session -from sqlalchemy.sql import text from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency +if TYPE_CHECKING: + from sqlalchemy.engine import Engine + @define class PgVectorVectorStoreDriver(BaseVectorStoreDriver): @@ -61,7 +58,8 @@ def __attrs_post_init__(self) -> None: if self.engine is None: if self.connection_string is None: raise ValueError("An engine or connection string is required") - self.engine = cast(Engine, create_engine(self.connection_string, **self.create_engine_params)) + sqlalchemy = import_optional_dependency("sqlalchemy") + self.engine = sqlalchemy.create_engine(self.connection_string, **self.create_engine_params) def setup( self, @@ -71,13 +69,15 @@ def setup( install_vector_extension: bool = True, ) -> None: """Provides a mechanism to initialize the database schema and extensions.""" + sqlalchemy_sql = import_optional_dependency("sqlalchemy.sql") + if install_uuid_extension: with self.engine.begin() as conn: - conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";')) + conn.execute(sqlalchemy_sql.text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";')) if install_vector_extension: with self.engine.begin() as conn: - conn.execute(text('CREATE EXTENSION IF NOT EXISTS "vector";')) + conn.execute(sqlalchemy_sql.text('CREATE EXTENSION IF NOT EXISTS "vector";')) if create_schema: self._model.metadata.create_all(self.engine) @@ -92,7 +92,9 @@ def upsert_vector( **kwargs, ) -> str: """Inserts or updates a vector in the collection.""" - with Session(self.engine) as session: + sqlalchemy_orm = import_optional_dependency("sqlalchemy.orm") + + with sqlalchemy_orm.Session(self.engine) as session: obj = self._model(id=vector_id, vector=vector, namespace=namespace, meta=meta, **kwargs) obj = session.merge(obj) @@ -102,7 +104,9 @@ def upsert_vector( def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: """Retrieves a specific vector entry from the collection based on its identifier and optional namespace.""" - with Session(self.engine) as session: + sqlalchemy_orm = import_optional_dependency("sqlalchemy.orm") + + with sqlalchemy_orm.Session(self.engine) as session: result = session.get(self._model, vector_id) return BaseVectorStoreDriver.Entry( @@ -114,7 +118,9 @@ def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Base def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Retrieves all vector entries from the collection, optionally filtering to only those that match the provided namespace.""" - with Session(self.engine) as session: + sqlalchemy_orm = import_optional_dependency("sqlalchemy.orm") + + with sqlalchemy_orm.Session(self.engine) as session: query = session.query(self._model) if namespace: query = query.filter_by(namespace=namespace) @@ -142,6 +148,8 @@ def query( **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: """Performs a search on the collection to find vectors similar to the provided input vector, optionally filtering to only those that match the provided namespace.""" + sqlalchemy_orm = import_optional_dependency("sqlalchemy.orm") + distance_metrics = { "cosine_distance": self._model.vector.cosine_distance, "l2_distance": self._model.vector.l2_distance, @@ -153,7 +161,7 @@ def query( op = distance_metrics[distance_metric] - with Session(self.engine) as session: + with sqlalchemy_orm.Session(self.engine) as session: vector = self.embedding_driver.embed_string(query) # The query should return both the vector and the distance metric score. @@ -185,16 +193,25 @@ def query( ] def default_vector_model(self) -> Any: - sqlalchemy = import_optional_dependency("pgvector.sqlalchemy") + pgvector_sqlalchemy = import_optional_dependency("pgvector.sqlalchemy") + sqlalchemy = import_optional_dependency("sqlalchemy") + sqlalchemy_dialects_postgresql = import_optional_dependency("sqlalchemy.dialects.postgresql") + sqlalchemy_orm = import_optional_dependency("sqlalchemy.orm") @dataclass - class VectorModel(declarative_base()): + class VectorModel(sqlalchemy_orm.declarative_base()): __tablename__ = self.table_name - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) - vector = Column(sqlalchemy.Vector()) - namespace = Column(String) - meta = Column(JSON) + id = sqlalchemy.Column( + sqlalchemy_dialects_postgresql.UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid4, + unique=True, + nullable=False, + ) + vector = sqlalchemy.Column(pgvector_sqlalchemy.Vector()) + namespace = sqlalchemy.Column(sqlalchemy.String) + meta = sqlalchemy.Column(sqlalchemy.JSON) return VectorModel diff --git a/poetry.lock b/poetry.lock index bff19148e..29a00ee32 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,18 +2,18 @@ [[package]] name = "accelerate" -version = "0.32.1" +version = "0.31.0" description = "Accelerate" optional = true python-versions = ">=3.8.0" files = [ - {file = "accelerate-0.32.1-py3-none-any.whl", hash = "sha256:71fcf4be00872194071de561634268b71417d7f5b16b178e2fa76b6f117c52b0"}, - {file = "accelerate-0.32.1.tar.gz", hash = "sha256:3999acff0237cd0d4f9fd98b42d5a3163544777b53fc4f1eec886b77e992d177"}, + {file = "accelerate-0.31.0-py3-none-any.whl", hash = "sha256:0fc608dc49584f64d04711a39711d73cb0ad4ef3d21cddee7ef2216e29471144"}, + {file = "accelerate-0.31.0.tar.gz", hash = "sha256:b5199865b26106ccf9205acacbe8e4b3b428ad585e7c472d6a46f6fb75b6c176"}, ] [package.dependencies] huggingface-hub = "*" -numpy = ">=1.17,<2.0.0" +numpy = ">=1.17" packaging = ">=20.0" psutil = "*" pyyaml = "*" @@ -6054,20 +6054,20 @@ gui = ["Gooey (>=1.0.1)"] [[package]] name = "transformers" -version = "4.42.4" +version = "4.41.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, - {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, + {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, + {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, ] [package.dependencies] accelerate = {version = ">=0.21.0", optional = true, markers = "extra == \"torch\""} filelock = "*" -huggingface-hub = ">=0.23.2,<1.0" -numpy = ">=1.17,<2.0" +huggingface-hub = ">=0.23.0,<1.0" +numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" @@ -6080,15 +6080,14 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -6099,26 +6098,25 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] -ruff = ["ruff (==0.4.4)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm (<=0.9.16)"] +timm = ["timm"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17,<2.0)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] diff --git a/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py b/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py index f559a9077..ba72bd9af 100644 --- a/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py +++ b/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py @@ -34,7 +34,7 @@ def driver(self): @pytest.fixture(autouse=True) def mock_span_exporter_class(self, mocker): return mocker.patch( - "griptape.drivers.observability.griptape_cloud_observability_driver.GriptapeCloudObservabilityDriver.SpanExporter" + "griptape.drivers.observability.griptape_cloud_observability_driver.GriptapeCloudObservabilityDriver.build_span_exporter" ) @pytest.fixture() @@ -186,7 +186,7 @@ def mock_post(self, mocker): return mocker.patch("requests.post") def test_span_exporter_export(self, mock_post): - exporter = GriptapeCloudObservabilityDriver.SpanExporter( + exporter = GriptapeCloudObservabilityDriver.build_span_exporter( base_url="http://base-url:1234", api_key="api-key", headers={"Authorization": "Bearer api-key"}, diff --git a/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py b/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py index 29b5ad82e..72833f5a3 100644 --- a/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py @@ -26,7 +26,7 @@ def mock_session(self, mocker): session = MagicMock() mock_session_manager = MagicMock() mock_session_manager.__enter__.return_value = session - mocker.patch("griptape.drivers.vector.pgvector_vector_store_driver.Session", return_value=mock_session_manager) + mocker.patch("sqlalchemy.orm.Session", return_value=mock_session_manager) return session From bd486f8903a0dd9926b11a789d8a37ee264d5c16 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Jul 2024 14:58:58 -0700 Subject: [PATCH 188/238] Fix/extras naming (#1008) --- CHANGELOG.md | 7 +++++-- docs/griptape-framework/drivers/sql-drivers.md | 13 ++++++++----- .../drivers/vector-store-drivers.md | 2 +- poetry.lock | 8 ++++---- pyproject.toml | 6 +++--- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d2f757a..a9f150036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,9 +32,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Renamed `DummyException` to `DummyError` for pep8 naming compliance. - **BREAKING**: Migrate to `sqlalchemy` 2.0. - **BREAKING**: Make `sqlalchemy` an optional dependency. -- **BREAKING**: Rename `drivers-sql-redshift` to `drivers-sql-amazon-redshift` -- Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. +- **BREAKING**: Renamed `drivers-sql-redshift` to `drivers-sql-amazon-redshift` +- **BREAKING**: Renamed `drivers-prompt-huggingface` extra to `drivers-prompt-huggingface-hub`. +- **BREAKING**: Renamed `drivers-vector-postgresql` extra to `drivers-vector-pgvector`. - **BREAKING**: Update `marqo` dependency to `^3.7.0`. +- **BREAKING**: Removed `drivers-sql-postgresql` extra. Use `drivers-sql` extra and install necessary drivers (i.e. `psycopg2`) separately. +- Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md index 2ca249fec..814112a12 100644 --- a/docs/griptape-framework/drivers/sql-drivers.md +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -10,14 +10,17 @@ SQL drivers can be used to make SQL queries and load table schemas. They are use * `execute_query_row()` executes a query and returns a raw result from SQL. * `get_table_schema()` returns a table schema. -!!! info - More database-specific SQL drivers are coming soon. - ## SQL Drivers ### SQL -This is a basic SQL loader based on [SQLAlchemy 1.x](https://docs.sqlalchemy.org/en/14/). Here is an example of how to use it: +!!! info + This driver requires the `drivers-sql` [extra](../index.md#extras). + +Note that you may need to install the appropriate database driver for your SQL database. +For example, to use the `psycopg2` driver for PostgreSQL, you can install it with `pip install psycopg2-binary`. + +This is a basic SQL loader based on [SQLAlchemy 2.0](https://docs.sqlalchemy.org/en/20/). Here is an example of how to use it: ```python from griptape.drivers import SqlDriver @@ -32,7 +35,7 @@ driver.execute_query("select 'foo', 'bar';") ### Amazon Redshift !!! info - This driver requires the `drivers-sql-redshift` [extra](../index.md#extras). + This driver requires the `drivers-sql-amazon-redshift` [extra](../index.md#extras). This is a SQL driver for interacting with the [Amazon Redshift Data API](https://docs.aws.amazon.com/redshift-data/latest/APIReference/Welcome.html) to execute statements. Here is an example of how to use it for Redshift Serverless: diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index d88e5fc33..2b76119b3 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -386,7 +386,7 @@ The body mappings for creating a vector index should look similar to the followi ### PGVector !!! info - This Driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). + This Driver requires the `drivers-vector-pgvector` [extra](../index.md#extras). The [PGVectorVectorStoreDriver](../../reference/griptape/drivers/vector/pgvector_vector_store_driver.md) integrates with PGVector, a vector storage and search extension for Postgres. While Griptape will handle enabling the extension, PGVector must be installed and ready for use in your Postgres instance before using this Vector Store Driver. diff --git a/poetry.lock b/poetry.lock index 29a00ee32..2738d6c97 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6707,19 +6707,19 @@ drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-anthropic = ["anthropic"] drivers-prompt-cohere = ["cohere"] drivers-prompt-google = ["google-generativeai"] -drivers-prompt-huggingface = ["huggingface-hub", "transformers"] +drivers-prompt-huggingface-hub = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-ollama = ["ollama"] drivers-rerank-cohere = ["cohere"] +drivers-sql = ["sqlalchemy"] drivers-sql-amazon-redshift = ["boto3"] -drivers-sql-postgres = ["pgvector", "psycopg2-binary", "sqlalchemy"] drivers-sql-snowflake = ["snowflake-sqlalchemy", "sqlalchemy"] drivers-vector-amazon-opensearch = ["boto3", "opensearch-py"] drivers-vector-marqo = ["marqo"] drivers-vector-mongodb = ["pymongo"] drivers-vector-opensearch = ["opensearch-py"] +drivers-vector-pgvector = ["pgvector", "psycopg2-binary", "sqlalchemy"] drivers-vector-pinecone = ["pinecone-client"] -drivers-vector-postgresql = ["pgvector", "psycopg2-binary", "sqlalchemy"] drivers-vector-qdrant = ["qdrant-client"] drivers-vector-redis = ["redis"] drivers-web-scraper-markdownify = ["beautifulsoup4", "markdownify", "playwright"] @@ -6735,4 +6735,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "2709e2b4622507351d69ed483b96910b001046759c1f02d70c24e014a617bce9" +content-hash = "214d3ce5365f5ce4d852e44019dbbea4659422bdc0231f7cf745a47eeb90ae18" diff --git a/pyproject.toml b/pyproject.toml index 1c66d4095..2b11746d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,16 +70,16 @@ filetype = {version = "^1.2", optional = true} [tool.poetry.extras] drivers-prompt-cohere = ["cohere"] drivers-prompt-anthropic = ["anthropic"] -drivers-prompt-huggingface = ["huggingface-hub", "transformers"] +drivers-prompt-huggingface-hub = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-amazon-bedrock = ["boto3", "anthropic"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-google = ["google-generativeai"] drivers-prompt-ollama = ["ollama"] +drivers-sql = ["sqlalchemy"] drivers-sql-amazon-redshift = ["boto3"] drivers-sql-snowflake = ["sqlalchemy", "snowflake-sqlalchemy", "snowflake"] -drivers-sql-postgres = ["sqlalchemy", "pgvector", "psycopg2-binary"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] @@ -90,7 +90,7 @@ drivers-vector-mongodb = ["pymongo"] drivers-vector-redis = ["redis"] drivers-vector-opensearch = ["opensearch-py"] drivers-vector-amazon-opensearch = ["opensearch-py", "boto3"] -drivers-vector-postgresql = ["sqlalchemy", "pgvector", "psycopg2-binary"] +drivers-vector-pgvector = ["sqlalchemy", "pgvector", "psycopg2-binary"] drivers-vector-qdrant = ["qdrant-client"] drivers-embedding-amazon-bedrock = ["boto3"] From dc3d1355d80d78e7e97c567b038b069f2cae1b9b Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 24 Jul 2024 13:19:55 -0700 Subject: [PATCH 189/238] Add furb ruff rule (#1014) --- griptape/artifacts/boolean_artifact.py | 2 +- .../drivers/file_manager/local_file_manager_driver.py | 6 ++---- .../conversation/local_conversation_memory_driver.py | 11 +++++------ .../vector/amazon_opensearch_vector_store_driver.py | 2 +- .../vector/azure_mongodb_vector_store_driver.py | 4 ++-- griptape/drivers/vector/base_vector_store_driver.py | 4 ++-- griptape/drivers/vector/local_vector_store_driver.py | 5 +++-- griptape/drivers/vector/marqo_vector_store_driver.py | 4 ++-- .../vector/mongodb_atlas_vector_store_driver.py | 4 ++-- .../drivers/vector/opensearch_vector_store_driver.py | 4 ++-- .../drivers/vector/pinecone_vector_store_driver.py | 4 ++-- griptape/drivers/vector/redis_vector_store_driver.py | 2 +- griptape/loaders/email_loader.py | 2 +- griptape/mixins/media_artifact_file_output_mixin.py | 4 ++-- griptape/tasks/base_image_generation_task.py | 4 ++-- griptape/tokenizers/openai_tokenizer.py | 4 ++-- griptape/tools/audio_transcription_client/tool.py | 4 ++-- griptape/tools/base_tool.py | 2 +- griptape/tools/computer/tool.py | 5 ++--- griptape/tools/image_query_client/tool.py | 4 ++-- griptape/utils/conversation.py | 3 +-- griptape/utils/file_utils.py | 4 ++-- pyproject.toml | 2 ++ .../file_manager/test_local_file_manager_driver.py | 6 ++---- .../test_trafilatura_web_scraper_driver.py | 2 +- .../engines/summary/test_prompt_summary_engine.py | 4 ++-- tests/unit/loaders/conftest.py | 6 ++---- tests/unit/tools/test_transcription_client.py | 8 ++++++++ 28 files changed, 59 insertions(+), 57 deletions(-) diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py index ac45a1967..5bcdfac9b 100644 --- a/griptape/artifacts/boolean_artifact.py +++ b/griptape/artifacts/boolean_artifact.py @@ -12,7 +12,7 @@ class BooleanArtifact(BaseArtifact): value: bool = field(converter=bool, metadata={"serializable": True}) @classmethod - def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: + def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: # noqa: FBT001 """Convert a string literal or bool to a BooleanArtifact. The string must be either "true" or "false" with any casing.""" if value is not None: if isinstance(value, str): diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index 4c2fcf5e6..a6f1f0726 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -31,16 +31,14 @@ def try_load_file(self, path: str) -> bytes: full_path = self._full_path(path) if self._is_dir(full_path): raise IsADirectoryError - with open(full_path, "rb") as file: - return file.read() + return Path(full_path).read_bytes() def try_save_file(self, path: str, value: bytes) -> None: full_path = self._full_path(path) if self._is_dir(full_path): raise IsADirectoryError os.makedirs(os.path.dirname(full_path), exist_ok=True) - with open(full_path, "wb") as file: - file.write(value) + Path(full_path).write_bytes(value) def _full_path(self, path: str) -> str: path = path.lstrip("/") diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index d8c7e992e..8d6399e13 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -1,6 +1,7 @@ from __future__ import annotations import os +from pathlib import Path from typing import Optional from attrs import define, field @@ -14,15 +15,13 @@ class LocalConversationMemoryDriver(BaseConversationMemoryDriver): file_path: str = field(default="griptape_memory.json", kw_only=True, metadata={"serializable": True}) def store(self, memory: BaseConversationMemory) -> None: - with open(self.file_path, "w") as file: - file.write(memory.to_json()) + Path(self.file_path).write_text(memory.to_json()) def load(self) -> Optional[BaseConversationMemory]: if not os.path.exists(self.file_path): return None - with open(self.file_path) as file: - memory = BaseConversationMemory.from_json(file.read()) + memory = BaseConversationMemory.from_json(Path(self.file_path).read_text()) - memory.driver = self + memory.driver = self - return memory + return memory diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index d54b98ec2..b1d881958 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -63,7 +63,7 @@ def upsert_vector( If a vector with the given vector ID already exists, it is updated; otherwise, a new vector is inserted. Metadata associated with the vector can also be provided. """ - vector_id = vector_id if vector_id else str_to_hash(str(vector)) + vector_id = vector_id or str_to_hash(str(vector)) doc = {"vector": vector, "namespace": namespace, "metadata": meta} doc.update(kwargs) if self.service == "aoss": diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index 60e9df097..993f7a300 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -30,8 +30,8 @@ def query( # Using the embedding driver to convert the query string into a vector vector = self.embedding_driver.embed_string(query) - count = count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT - offset = offset if offset else 0 + count = count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT + offset = offset or 0 pipeline = [] diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 2b00266a8..d1da78188 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -87,7 +87,7 @@ def upsert_text_artifact( else: meta["artifact"] = artifact.to_json() - vector = artifact.embedding if artifact.embedding else artifact.generate_embedding(self.embedding_driver) + vector = artifact.embedding or artifact.generate_embedding(self.embedding_driver) if isinstance(vector, list): return self.upsert_vector(vector, vector_id=vector_id, namespace=namespace, meta=meta, **kwargs) @@ -112,7 +112,7 @@ def upsert_text( self.embedding_driver.embed_string(string), vector_id=vector_id, namespace=namespace, - meta=meta if meta else {}, + meta=meta or {}, **kwargs, ) diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index ab59f332c..2b42b19f5 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import operator import os import threading from dataclasses import asdict @@ -58,7 +59,7 @@ def upsert_vector( meta: Optional[dict] = None, **kwargs, ) -> str: - vector_id = vector_id if vector_id else utils.str_to_hash(str(vector)) + vector_id = vector_id or utils.str_to_hash(str(vector)) with self.thread_lock: self.entries[self._namespaced_vector_id(vector_id, namespace=namespace)] = self.Entry( @@ -101,7 +102,7 @@ def query( entries_and_relatednesses = [ (entry, self.relatedness_fn(query_embedding, entry.vector)) for entry in entries.values() ] - entries_and_relatednesses.sort(key=lambda x: x[1], reverse=True) + entries_and_relatednesses.sort(key=operator.itemgetter(1), reverse=True) result = [ BaseVectorStoreDriver.Entry(id=er[0].id, vector=er[0].vector, score=er[1], meta=er[0].meta) diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 7f6b52103..caab118b8 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -123,7 +123,7 @@ def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Opti if result and "_tensor_facets" in result and len(result["_tensor_facets"]) > 0: return BaseVectorStoreDriver.Entry( id=result["_id"], - meta={k: v for k, v in result.items() if k not in ["_id"]}, + meta={k: v for k, v in result.items() if k != "_id"}, vector=result["_tensor_facets"][0]["_embedding"], ) else: @@ -190,7 +190,7 @@ def query( The list of query results. """ params = { - "limit": count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, + "limit": count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, "attributes_to_retrieve": ["*"] if include_metadata else ["_id"], "filter_string": f"namespace:{namespace}" if namespace else None, } | kwargs diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index b17aaf4e7..34b1d3a5e 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -133,8 +133,8 @@ def query( # Using the embedding driver to convert the query string into a vector vector = self.embedding_driver.embed_string(query) - count = count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT - offset = offset if offset else 0 + count = count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT + offset = offset or 0 pipeline = [ { diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index e701e4084..267b549b7 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -60,7 +60,7 @@ def upsert_vector( If a vector with the given vector ID already exists, it is updated; otherwise, a new vector is inserted. Metadata associated with the vector can also be provided. """ - vector_id = vector_id if vector_id else utils.str_to_hash(str(vector)) + vector_id = vector_id or utils.str_to_hash(str(vector)) doc = {"vector": vector, "namespace": namespace, "metadata": meta} doc.update(kwargs) response = self.client.index(index=self.index_name, id=vector_id, body=doc) @@ -138,7 +138,7 @@ def query( Returns: A list of BaseVectorStoreDriver.Entry objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. """ - count = count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT + count = count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT vector = self.embedding_driver.embed_string(query) # Base k-NN query query_body = {"size": count, "query": {"knn": {field_name: {"vector": vector, "k": count}}}} diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 028ddebd6..a3a132ab3 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -36,7 +36,7 @@ def upsert_vector( meta: Optional[dict] = None, **kwargs, ) -> str: - vector_id = vector_id if vector_id else str_to_hash(str(vector)) + vector_id = vector_id or str_to_hash(str(vector)) params: dict[str, Any] = {"namespace": namespace} | kwargs @@ -95,7 +95,7 @@ def query( vector = self.embedding_driver.embed_string(query) params = { - "top_k": count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, + "top_k": count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, "namespace": namespace, "include_values": include_vectors, "include_metadata": include_metadata, diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 06aa853c6..0abf2c985 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -60,7 +60,7 @@ def upsert_vector( If a vector with the given vector ID already exists, it is updated; otherwise, a new vector is inserted. Metadata associated with the vector can also be provided. """ - vector_id = vector_id if vector_id else str_to_hash(str(vector)) + vector_id = vector_id or str_to_hash(str(vector)) key = self._generate_key(vector_id, namespace) bytes_vector = json.dumps(vector).encode("utf-8") diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index a54d5a063..82f34bd8a 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -56,7 +56,7 @@ def load(self, source: EmailQuery, *args, **kwargs) -> ListArtifact | ErrorArtif top_n = max(0, messages_count - max_count) if max_count else 0 for i in range(messages_count, top_n, -1): - result, data = client.fetch(str(i), "(RFC822)") + _result, data = client.fetch(str(i), "(RFC822)") if data is None or not data or data[0] is None: continue diff --git a/griptape/mixins/media_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py index 4097960bd..9b9f34911 100644 --- a/griptape/mixins/media_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -1,6 +1,7 @@ from __future__ import annotations import os +from pathlib import Path from typing import TYPE_CHECKING, Optional from attrs import Attribute, define, field @@ -41,5 +42,4 @@ def _write_to_file(self, artifact: BlobArtifact) -> None: if os.path.dirname(outfile): os.makedirs(os.path.dirname(outfile), exist_ok=True) - with open(outfile, "wb") as f: - f.write(artifact.value) + Path(outfile).write_bytes(artifact.value) diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 73b3cd42b..d32e8f142 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -2,6 +2,7 @@ import os from abc import ABC +from pathlib import Path from typing import TYPE_CHECKING from attrs import Attribute, define, field @@ -60,5 +61,4 @@ def all_negative_rulesets(self) -> list[Ruleset]: def _read_from_file(self, path: str) -> MediaArtifact: self.structure.logger.info("Reading image from %s", os.path.abspath(path)) - with open(path, "rb") as file: - return ImageLoader().load(file.read()) + return ImageLoader().load(Path(path).read_bytes()) diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index b839109fa..15220b4bd 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -64,7 +64,7 @@ def _default_max_input_tokens(self) -> int: tokens = next((v for k, v in self.MODEL_PREFIXES_TO_MAX_INPUT_TOKENS.items() if self.model.startswith(k)), None) offset = 0 if self.model in self.EMBEDDING_MODELS else self.TOKEN_OFFSET - return (tokens if tokens else self.DEFAULT_MAX_TOKENS) - offset + return (tokens or self.DEFAULT_MAX_TOKENS) - offset def _default_max_output_tokens(self) -> int: tokens = next( @@ -84,7 +84,7 @@ def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> i https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb. """ if isinstance(text, list): - model = model if model else self.model + model = model or self.model try: encoding = tiktoken.encoding_for_model(model) diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription_client/tool.py index bf2dfc67f..62cd9e7a5 100644 --- a/griptape/tools/audio_transcription_client/tool.py +++ b/griptape/tools/audio_transcription_client/tool.py @@ -1,5 +1,6 @@ from __future__ import annotations +from pathlib import Path from typing import TYPE_CHECKING, Any, cast from attrs import Factory, define, field @@ -31,8 +32,7 @@ class AudioTranscriptionClient(BaseTool): def transcribe_audio_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: audio_path = params["values"]["path"] - with open(audio_path, "rb") as f: - audio_artifact = self.audio_loader.load(f.read()) + audio_artifact = self.audio_loader.load(Path(audio_path).read_bytes()) return self.engine.run(audio_artifact) diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 3fb6af26b..bfb754bc0 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -183,7 +183,7 @@ def tool_dir(self) -> str: return os.path.dirname(os.path.abspath(class_file)) def install_dependencies(self, env: Optional[dict[str, str]] = None) -> None: - env = env if env else {} + env = env or {} command = [sys.executable, "-m", "pip", "install", "-r", "requirements.txt"] diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 9ab290137..4e996c63c 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -142,8 +142,7 @@ def execute_code_in_container(self, filename: str, code: str) -> BaseArtifact: local_file_path = os.path.join(local_workdir, filename) try: - with open(local_file_path, "w") as f: - f.write(code) + Path(local_file_path).write_text(code) return self.execute_command_in_container(f"python {container_file_path}") except Exception as e: @@ -188,7 +187,7 @@ def build_image(self, tool: BaseTool) -> None: def dependencies(self) -> list[str]: with open(self.requirements_txt_path) as file: - return [line.strip() for line in file.readlines()] + return [line.strip() for line in file] def __del__(self) -> None: if self._tempdir: diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query_client/tool.py index 1b8cea534..a10929b13 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query_client/tool.py @@ -1,5 +1,6 @@ from __future__ import annotations +from pathlib import Path from typing import TYPE_CHECKING, Any, cast from attrs import Factory, define, field @@ -40,8 +41,7 @@ def query_image_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: image_artifacts = [] for image_path in image_paths: - with open(image_path, "rb") as f: - image_artifacts.append(self.image_loader.load(f.read())) + image_artifacts.append(self.image_loader.load(Path(image_path).read_bytes())) return self.image_query_engine.run(query, image_artifacts) diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index 25dd310e1..97318c426 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -16,8 +16,7 @@ def lines(self) -> list[str]: lines = [] for run in self.memory.runs: - lines.append(f"Q: {run.input}") - lines.append(f"A: {run.output}") + lines.extend((f"Q: {run.input}", f"A: {run.output}")) return lines diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index f730034d3..19c9f699c 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -1,6 +1,7 @@ from __future__ import annotations from concurrent import futures +from pathlib import Path from typing import Optional import griptape.utils as utils @@ -15,8 +16,7 @@ def load_file(path: str) -> bytes: Returns: The content of the file. """ - with open(path, "rb") as f: - return f.read() + return Path(path).read_bytes() def load_files(paths: list[str], futures_executor: Optional[futures.ThreadPoolExecutor] = None) -> dict[str, bytes]: diff --git a/pyproject.toml b/pyproject.toml index 2b11746d8..98bbe4a03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -255,6 +255,7 @@ select = [ "TCH", # flake8-type-checking "ERA", # eradicate "PGH", # pygrep-hooks + "FURB", # refurb ] ignore = [ "UP007", # non-pep604-annotation @@ -278,6 +279,7 @@ ignore = [ "ANN401", # any-type "PT011", # pytest-raises-too-broad ] +preview = true [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index 0d2827683..a7c244f09 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -17,8 +17,7 @@ def temp_dir(self): def write_file(path: str, content: bytes) -> None: full_path = os.path.join(temp_dir, path) os.makedirs(os.path.dirname(full_path), exist_ok=True) - with open(full_path, "wb") as f: - f.write(content) + Path(full_path).write_bytes(content) def mkdir(path: str) -> None: full_path = os.path.join(temp_dir, path) @@ -28,8 +27,7 @@ def copy_test_resources(resource_path: str) -> None: file_dir = os.path.dirname(__file__) full_path = os.path.join(file_dir, "../../../resources", resource_path) full_path = os.path.normpath(full_path) - with open(full_path, "rb") as source: - content = source.read() + content = Path(full_path).read_bytes() dest_path = os.path.join(temp_dir, "resources", resource_path) write_file(dest_path, content) diff --git a/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py index 53ddf4500..31d3016e9 100644 --- a/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py +++ b/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py @@ -11,7 +11,7 @@ def _mock_fetch_url(self, mocker): # characters to the body. mocker.patch( "trafilatura.fetch_url" - ).return_value = f'{"x"*243}foobar' + ).return_value = f'{"x" * 243}foobar' @pytest.fixture() def web_scraper(self): diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index e826a2b4d..4d9c65e03 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -1,4 +1,5 @@ import os +from pathlib import Path import pytest @@ -38,7 +39,6 @@ def copy_test_resource(resource_path: str): file_dir = os.path.dirname(__file__) full_path = os.path.join(file_dir, "../../../resources", resource_path) full_path = os.path.normpath(full_path) - with open(full_path) as f: - return f.read() + return Path(full_path).read_text() assert engine.summarize_text(copy_test_resource("test.txt") * 50) diff --git a/tests/unit/loaders/conftest.py b/tests/unit/loaders/conftest.py index 494916be6..1f698738a 100644 --- a/tests/unit/loaders/conftest.py +++ b/tests/unit/loaders/conftest.py @@ -15,8 +15,7 @@ def create_source(resource_path: str) -> Path: @pytest.fixture() def bytes_from_resource_path(path_from_resource_path): def create_source(resource_path: str) -> bytes: - with open(path_from_resource_path(resource_path), "rb") as f: - return f.read() + return Path(path_from_resource_path(resource_path)).read_bytes() return create_source @@ -24,7 +23,6 @@ def create_source(resource_path: str) -> bytes: @pytest.fixture() def str_from_resource_path(path_from_resource_path): def test_csv_str(resource_path: str) -> str: - with open(path_from_resource_path(resource_path)) as f: - return f.read() + return Path(path_from_resource_path(resource_path)).read_text() return test_csv_str diff --git a/tests/unit/tools/test_transcription_client.py b/tests/unit/tools/test_transcription_client.py index 7768792d0..8b54e891b 100644 --- a/tests/unit/tools/test_transcription_client.py +++ b/tests/unit/tools/test_transcription_client.py @@ -18,6 +18,14 @@ def audio_loader(self) -> Mock: return loader + @pytest.fixture( + autouse=True, + ) + def mock_path(self, mocker) -> Mock: + mocker.patch("pathlib.Path.read_bytes", return_value=b"transcription") + + return mocker + def test_init_transcription_client(self, transcription_engine, audio_loader) -> None: assert AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) From 535316cfa65d4831f70e0989cc26f14f2bc95992 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 24 Jul 2024 14:25:06 -0700 Subject: [PATCH 190/238] Refactor CsvRowArtifact to inherit from BaseTextArtifact (#1013) --- CHANGELOG.md | 3 ++ griptape/artifacts/__init__.py | 2 ++ griptape/artifacts/base_text_artifact.py | 34 ++++++++++++++++++ griptape/artifacts/csv_row_artifact.py | 10 +++--- griptape/artifacts/text_artifact.py | 28 +++------------ .../unit/artifacts/test_base_text_artifact.py | 35 +++++++++++++++++++ tests/unit/artifacts/test_csv_row_artifact.py | 4 --- tests/unit/artifacts/test_list_artifact.py | 4 +-- tests/unit/artifacts/test_text_artifact.py | 35 ------------------- 9 files changed, 85 insertions(+), 70 deletions(-) create mode 100644 griptape/artifacts/base_text_artifact.py create mode 100644 tests/unit/artifacts/test_base_text_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a9f150036..0a06a20d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Observability` context manager for enabling observability and configuring which Observability Driver to use. - `@observable` decorator for selecting which functions/methods to provide observability for. - `GenericArtifact` for storing any data. +- `BaseTextArtifact` for text-based Artifacts to subclass. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. @@ -40,6 +41,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. +- `CsvRowArtifact` now inherits from `BaseTextArtifact`. +- `TextArtifact` now inherits from `BaseTextArtifact`. ### Fixed - Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index e9fc6daba..d3c77141c 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -1,4 +1,5 @@ from .base_artifact import BaseArtifact +from .base_text_artifact import BaseTextArtifact from .error_artifact import ErrorArtifact from .info_artifact import InfoArtifact from .text_artifact import TextArtifact @@ -15,6 +16,7 @@ __all__ = [ "BaseArtifact", + "BaseTextArtifact", "ErrorArtifact", "InfoArtifact", "TextArtifact", diff --git a/griptape/artifacts/base_text_artifact.py b/griptape/artifacts/base_text_artifact.py new file mode 100644 index 000000000..775bcf05f --- /dev/null +++ b/griptape/artifacts/base_text_artifact.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +from attrs import define, field + +from griptape.artifacts import BaseArtifact + +if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver + from griptape.tokenizers import BaseTokenizer + + +@define +class BaseTextArtifact(BaseArtifact): + encoding: str = field(default="utf-8", kw_only=True) + encoding_error_handler: str = field(default="strict", kw_only=True) + _embedding: list[float] = field(factory=list, kw_only=True) + + @property + def embedding(self) -> Optional[list[float]]: + return None if len(self._embedding) == 0 else self._embedding + + def generate_embedding(self, driver: BaseEmbeddingDriver) -> Optional[list[float]]: + self._embedding.clear() + self._embedding.extend(driver.embed_string(str(self.value))) + + return self.embedding + + def token_count(self, tokenizer: BaseTokenizer) -> int: + return tokenizer.count_tokens(str(self.value)) + + def to_bytes(self) -> bytes: + return str(self.value).encode(encoding=self.encoding, errors=self.encoding_error_handler) diff --git a/griptape/artifacts/csv_row_artifact.py b/griptape/artifacts/csv_row_artifact.py index ce752e685..0d26a1a80 100644 --- a/griptape/artifacts/csv_row_artifact.py +++ b/griptape/artifacts/csv_row_artifact.py @@ -5,17 +5,20 @@ from attrs import define, field -from griptape.artifacts import BaseArtifact, TextArtifact +from griptape.artifacts import BaseArtifact, BaseTextArtifact @define -class CsvRowArtifact(TextArtifact): +class CsvRowArtifact(BaseTextArtifact): value: dict[str, str] = field(converter=BaseArtifact.value_to_dict, metadata={"serializable": True}) delimiter: str = field(default=",", kw_only=True, metadata={"serializable": True}) def __add__(self, other: BaseArtifact) -> CsvRowArtifact: return CsvRowArtifact(self.value | other.value) + def __bool__(self) -> bool: + return len(self) > 0 + def to_text(self) -> str: with io.StringIO() as csvfile: writer = csv.DictWriter( @@ -28,6 +31,3 @@ def to_text(self) -> str: writer.writerow(self.value) return csvfile.getvalue().strip() - - def __bool__(self) -> bool: - return len(self) > 0 diff --git a/griptape/artifacts/text_artifact.py b/griptape/artifacts/text_artifact.py index 1e44a8df5..f2f6844b0 100644 --- a/griptape/artifacts/text_artifact.py +++ b/griptape/artifacts/text_artifact.py @@ -1,41 +1,21 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define, field -from griptape.artifacts import BaseArtifact +from griptape.artifacts import BaseTextArtifact if TYPE_CHECKING: - from griptape.drivers import BaseEmbeddingDriver - from griptape.tokenizers import BaseTokenizer + from griptape.artifacts import BaseArtifact @define -class TextArtifact(BaseArtifact): +class TextArtifact(BaseTextArtifact): value: str = field(converter=str, metadata={"serializable": True}) - encoding: str = field(default="utf-8", kw_only=True) - encoding_error_handler: str = field(default="strict", kw_only=True) - _embedding: list[float] = field(factory=list, kw_only=True) - - @property - def embedding(self) -> Optional[list[float]]: - return None if len(self._embedding) == 0 else self._embedding def __add__(self, other: BaseArtifact) -> TextArtifact: return TextArtifact(self.value + other.value) def __bool__(self) -> bool: return bool(self.value.strip()) - - def generate_embedding(self, driver: BaseEmbeddingDriver) -> Optional[list[float]]: - self._embedding.clear() - self._embedding.extend(driver.embed_string(str(self.value))) - - return self.embedding - - def token_count(self, tokenizer: BaseTokenizer) -> int: - return tokenizer.count_tokens(str(self.value)) - - def to_bytes(self) -> bytes: - return self.value.encode(encoding=self.encoding, errors=self.encoding_error_handler) diff --git a/tests/unit/artifacts/test_base_text_artifact.py b/tests/unit/artifacts/test_base_text_artifact.py new file mode 100644 index 000000000..6701ec56d --- /dev/null +++ b/tests/unit/artifacts/test_base_text_artifact.py @@ -0,0 +1,35 @@ +import pytest + +from griptape.artifacts import TextArtifact +from griptape.tokenizers import OpenAiTokenizer +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + + +class TestBaseTextArtifact: + def test_generate_embedding(self): + assert TextArtifact("foobar").generate_embedding(MockEmbeddingDriver()) == [0, 1] + + def test_embedding(self): + artifact = TextArtifact("foobar") + + assert artifact.embedding is None + assert artifact.generate_embedding(MockEmbeddingDriver()) == [0, 1] + assert artifact.embedding == [0, 1] + + def test_to_bytes_encoding(self): + assert ( + TextArtifact("ß", name="foobar.txt", encoding="ascii", encoding_error_handler="backslashreplace").to_bytes() + == b"\\xdf" + ) + + def test_to_bytes_encoding_error(self): + with pytest.raises(ValueError): + assert TextArtifact("ß", encoding="ascii").to_bytes() + + def test_token_count(self): + assert ( + TextArtifact("foobarbaz").token_count( + OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) + ) + == 2 + ) diff --git a/tests/unit/artifacts/test_csv_row_artifact.py b/tests/unit/artifacts/test_csv_row_artifact.py index de4281ffb..986ece409 100644 --- a/tests/unit/artifacts/test_csv_row_artifact.py +++ b/tests/unit/artifacts/test_csv_row_artifact.py @@ -1,5 +1,4 @@ from griptape.artifacts import CsvRowArtifact -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestCsvRowArtifact: @@ -14,9 +13,6 @@ def test___add__(self): "test2": "bar", } - def test_generate_embedding(self): - assert CsvRowArtifact({"test1": "foo"}).generate_embedding(MockEmbeddingDriver()) == [0, 1] - def test_to_text(self): assert CsvRowArtifact({"test1": "foo|bar", "test2": 1}, delimiter="|").to_text() == '"foo|bar"|1' diff --git a/tests/unit/artifacts/test_list_artifact.py b/tests/unit/artifacts/test_list_artifact.py index 06d234645..00d410086 100644 --- a/tests/unit/artifacts/test_list_artifact.py +++ b/tests/unit/artifacts/test_list_artifact.py @@ -1,6 +1,6 @@ import pytest -from griptape.artifacts import BlobArtifact, CsvRowArtifact, ListArtifact, TextArtifact +from griptape.artifacts import BaseTextArtifact, BlobArtifact, CsvRowArtifact, ListArtifact, TextArtifact class TestListArtifact: @@ -32,7 +32,7 @@ def test_child_type(self): def test_is_type(self): assert ListArtifact([TextArtifact("foo")]).is_type(TextArtifact) - assert ListArtifact([CsvRowArtifact({"foo": "bar"})]).is_type(TextArtifact) + assert ListArtifact([CsvRowArtifact({"foo": "bar"})]).is_type(BaseTextArtifact) assert ListArtifact([CsvRowArtifact({"foo": "bar"})]).is_type(CsvRowArtifact) def test_has_items(self): diff --git a/tests/unit/artifacts/test_text_artifact.py b/tests/unit/artifacts/test_text_artifact.py index 067da0912..47f0daa2e 100644 --- a/tests/unit/artifacts/test_text_artifact.py +++ b/tests/unit/artifacts/test_text_artifact.py @@ -1,10 +1,6 @@ import json -import pytest - from griptape.artifacts import BaseArtifact, TextArtifact -from griptape.tokenizers import OpenAiTokenizer -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestTextArtifact: @@ -15,37 +11,6 @@ def test_value_type_conversion(self): def test___add__(self): assert (TextArtifact("foo") + TextArtifact("bar")).value == "foobar" - def test_generate_embedding(self): - assert TextArtifact("foobar").generate_embedding(MockEmbeddingDriver()) == [0, 1] - - def test_embedding(self): - artifact = TextArtifact("foobar") - - assert artifact.embedding is None - assert artifact.generate_embedding(MockEmbeddingDriver()) == [0, 1] - assert artifact.embedding == [0, 1] - - def test_to_text(self): - assert TextArtifact("foobar").to_text() == "foobar" - - def test_to_bytes_encoding(self): - assert ( - TextArtifact("ß", name="foobar.txt", encoding="ascii", encoding_error_handler="backslashreplace").to_bytes() - == b"\\xdf" - ) - - def test_to_bytes_encoding_error(self): - with pytest.raises(ValueError): - assert TextArtifact("ß", encoding="ascii").to_bytes() - - def test_token_count(self): - assert ( - TextArtifact("foobarbaz").token_count( - OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - ) - == 2 - ) - def test_to_dict(self): assert TextArtifact("foobar").to_dict()["value"] == "foobar" From e1977ce2f42665221482a1d365cc92931c5c6179 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Thu, 25 Jul 2024 16:38:27 -0700 Subject: [PATCH 191/238] Improve performance of image generation tools (#1019) --- griptape/tools/__init__.py | 2 + .../tools/base_image_generation_client.py | 16 ++++ .../tool.py | 76 ++++++------------- .../tool.py | 68 ++++++----------- .../prompt_image_generation_client/tool.py | 22 +++--- .../variation_image_generation_client/tool.py | 57 ++++++-------- tests/unit/tools/conftest.py | 12 +++ ...test_inpainting_image_generation_client.py | 52 ++++++++++--- ...test_outpainting_image_variation_client.py | 56 +++++++++++--- .../test_prompt_image_generation_client.py | 4 +- .../test_variation_image_generation_client.py | 44 +++++++++-- 11 files changed, 233 insertions(+), 176 deletions(-) create mode 100644 griptape/tools/base_image_generation_client.py create mode 100644 tests/unit/tools/conftest.py diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 0bacdb303..d99b63b6c 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -1,4 +1,5 @@ from .base_tool import BaseTool +from .base_image_generation_client import BaseImageGenerationClient from .calculator.tool import Calculator from .web_search.tool import WebSearch from .web_scraper.tool import WebScraper @@ -32,6 +33,7 @@ __all__ = [ "BaseTool", + "BaseImageGenerationClient", "BaseAwsClient", "AwsIamClient", "AwsS3Client", diff --git a/griptape/tools/base_image_generation_client.py b/griptape/tools/base_image_generation_client.py new file mode 100644 index 000000000..e85336d23 --- /dev/null +++ b/griptape/tools/base_image_generation_client.py @@ -0,0 +1,16 @@ +from attrs import define + +from griptape.mixins import BlobArtifactFileOutputMixin +from griptape.tools import BaseTool + + +@define +class BaseImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): + """A base class for tools that generate images from text prompts.""" + + PROMPT_DESCRIPTION = "Features and qualities to include in the generated image, descriptive and succinct." + NEGATIVE_PROMPT_DESCRIPTION = ( + "Features and qualities to avoid in the generated image. Affirmatively describe " + "what to avoid, for example: to avoid the color red, include 'red' " + "rather than 'no red'." + ) diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation_client/tool.py index ff60dd975..e8979efb0 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation_client/tool.py @@ -1,14 +1,14 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, cast +from pathlib import Path +from typing import TYPE_CHECKING, cast from attrs import define, field from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.mixins import BlobArtifactFileOutputMixin -from griptape.tools import BaseTool +from griptape.tools.base_image_generation_client import BaseImageGenerationClient from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): +class InpaintingImageGenerationClient(BaseImageGenerationClient): """A tool that can be used to generate prompted inpaintings of an image. Attributes: @@ -31,17 +31,11 @@ class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): @activity( config={ - "description": "Can be used to modify an image within a specified mask area using image and mask files.", + "description": "Modifies an image within a specified mask area using image and mask files.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -51,40 +45,26 @@ class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): ), }, ) - def image_inpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_inpainting_from_file(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] image_file = params["values"]["image_file"] mask_file = params["values"]["mask_file"] - input_artifact = self.image_loader.load(image_file) - mask_artifact = self.image_loader.load(mask_file) + input_artifact = self.image_loader.load(Path(image_file).read_bytes()) + mask_artifact = self.image_loader.load(Path(mask_file).read_bytes()) - output_artifact = self.engine.run( - prompts=prompts, - negative_prompts=negative_prompts, - image=input_artifact, - mask=mask_artifact, + return self._generate_inpainting( + prompt, negative_prompt, cast(ImageArtifact, input_artifact), cast(ImageArtifact, mask_artifact) ) - if self.output_dir or self.output_file: - self._write_to_file(output_artifact) - - return output_artifact - @activity( config={ - "description": "Can be used to modify an image within a specified mask area using image and mask artifacts in memory.", + "description": "Modifies an image within a specified mask area using image and mask artifacts in memory.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "image_artifact_namespace": str, "image_artifact_name": str, @@ -94,9 +74,9 @@ def image_inpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ), }, ) - def image_inpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_inpainting_from_memory(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] image_artifact_namespace = params["values"]["image_artifact_namespace"] image_artifact_name = params["values"]["image_artifact_name"] mask_artifact_namespace = params["values"]["mask_artifact_namespace"] @@ -123,24 +103,14 @@ def image_inpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact return ErrorArtifact(str(e)) return self._generate_inpainting( - prompts, - negative_prompts, - cast(ImageArtifact, image_artifact), - cast(ImageArtifact, mask_artifact), + prompt, negative_prompt, cast(ImageArtifact, image_artifact), cast(ImageArtifact, mask_artifact) ) def _generate_inpainting( - self, - prompts: list[str], - negative_prompts: list[str], - image_artifact: ImageArtifact, - mask_artifact: ImageArtifact, + self, prompt: str, negative_prompt: str, image_artifact: ImageArtifact, mask_artifact: ImageArtifact ) -> ImageArtifact: output_artifact = self.engine.run( - prompts=prompts, - negative_prompts=negative_prompts, - image=image_artifact, - mask=mask_artifact, + prompts=[prompt], negative_prompts=[negative_prompt], image=image_artifact, mask=mask_artifact ) if self.output_dir or self.output_file: diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index 22f47b866..800d88e70 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -1,14 +1,14 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, cast +from pathlib import Path +from typing import TYPE_CHECKING, cast from attrs import define, field from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.mixins import BlobArtifactFileOutputMixin -from griptape.tools import BaseTool +from griptape.tools import BaseImageGenerationClient from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): +class OutpaintingImageGenerationClient(BaseImageGenerationClient): """A tool that can be used to generate prompted outpaintings of an image. Attributes: @@ -31,17 +31,11 @@ class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): @activity( config={ - "description": "Can be used to modify an image outside a specified mask area using image and mask files.", + "description": "Modifies an image outside a specified mask area using image and mask files.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -51,30 +45,24 @@ class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): ), }, ) - def image_outpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_outpainting_from_file(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] image_file = params["values"]["image_file"] mask_file = params["values"]["mask_file"] - input_artifact = self.image_loader.load(image_file) - mask_artifact = self.image_loader.load(mask_file) + input_artifact = self.image_loader.load(Path(image_file).read_bytes()) + mask_artifact = self.image_loader.load(Path(mask_file).read_bytes()) - return self._generate_outpainting(prompts, negative_prompts, input_artifact, mask_artifact) + return self._generate_outpainting(prompt, negative_prompt, input_artifact, mask_artifact) @activity( config={ - "description": "Can be used to modify an image outside a specified mask area using image and mask artifacts in memory.", + "description": "Modifies an image outside a specified mask area using image and mask artifacts in memory.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "image_artifact_namespace": str, "mask_artifact_namespace": str, @@ -82,9 +70,9 @@ def image_outpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ), }, ) - def image_outpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_outpainting_from_memory(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] image_artifact_namespace = params["values"]["image_artifact_namespace"] image_artifact_name = params["values"]["image_artifact_name"] mask_artifact_namespace = params["values"]["mask_artifact_namespace"] @@ -111,24 +99,14 @@ def image_outpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact return ErrorArtifact(str(e)) return self._generate_outpainting( - prompts, - negative_prompts, - cast(ImageArtifact, image_artifact), - cast(ImageArtifact, mask_artifact), + prompt, negative_prompt, cast(ImageArtifact, image_artifact), cast(ImageArtifact, mask_artifact) ) def _generate_outpainting( - self, - prompts: list[str], - negative_prompts: list[str], - image_artifact: ImageArtifact, - mask_artifact: ImageArtifact, - ) -> ImageArtifact: + self, prompt: str, negative_prompt: str, image_artifact: ImageArtifact, mask_artifact: ImageArtifact + ) -> ImageArtifact | ErrorArtifact: output_artifact = self.engine.run( - prompts=prompts, - negative_prompts=negative_prompts, - image=image_artifact, - mask=mask_artifact, + prompts=[prompt], negative_prompts=[negative_prompt], image=image_artifact, mask=mask_artifact ) if self.output_dir or self.output_file: diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index 1373d5523..771b4e41d 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -5,8 +5,7 @@ from attrs import define, field from schema import Literal, Schema -from griptape.mixins import BlobArtifactFileOutputMixin -from griptape.tools import BaseTool +from griptape.tools import BaseImageGenerationClient from griptape.utils.decorators import activity if TYPE_CHECKING: @@ -15,7 +14,7 @@ @define -class PromptImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): +class PromptImageGenerationClient(BaseImageGenerationClient): """A tool that can be used to generate an image from a text prompt. Attributes: @@ -28,21 +27,20 @@ class PromptImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): @activity( config={ - "description": "Can be used to generate an image from text prompts.", + "description": "Generates an image from text prompts.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - }, + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + } ), }, ) - def generate_image(self, params: dict[str, dict[str, list[str]]]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] + def generate_image(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] - output_artifact = self.engine.run(prompts=prompts) + output_artifact = self.engine.run(prompts=[prompt], negative_prompts=[negative_prompt]) if self.output_dir or self.output_file: self._write_to_file(output_artifact) diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index deab543a1..5f836c5b1 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -1,14 +1,14 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, cast +from pathlib import Path +from typing import TYPE_CHECKING, cast from attrs import define, field from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.mixins import BlobArtifactFileOutputMixin -from griptape.tools import BaseTool +from griptape.tools.base_image_generation_client import BaseImageGenerationClient from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): +class VariationImageGenerationClient(BaseImageGenerationClient): """A tool that can be used to generate prompted variations of an image. Attributes: @@ -31,17 +31,11 @@ class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): @activity( config={ - "description": "Can be used to generate a variation of a given input image file.", + "description": "Generates a variation of a given input image file.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -50,30 +44,25 @@ class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): ), }, ) - def image_variation_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_variation_from_file(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] image_file = params["values"]["image_file"] - image_artifact = self.image_loader.load(image_file) + image_artifact = self.image_loader.load(Path(image_file).read_bytes()) + if isinstance(image_artifact, ErrorArtifact): return image_artifact - return self._generate_variation(prompts, negative_prompts, image_artifact) + return self._generate_variation(prompt, negative_prompt, image_artifact) @activity( config={ - "description": "Can be used to generate a variation of a given input image artifact in memory.", + "description": "Generates a variation of a given input image artifact in memory.", "schema": Schema( { - Literal( - "prompts", - description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "artifact_namespace": str, "artifact_name": str, @@ -81,9 +70,9 @@ def image_variation_from_file(self, params: dict[str, Any]) -> ImageArtifact | E ), }, ) - def image_variation_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: - prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] + def image_variation_from_memory(self, params: dict[str, dict[str, str]]) -> ImageArtifact | ErrorArtifact: + prompt = params["values"]["prompt"] + negative_prompt = params["values"]["negative_prompt"] artifact_namespace = params["values"]["artifact_namespace"] artifact_name = params["values"]["artifact_name"] memory = self.find_input_memory(params["values"]["memory_name"]) @@ -96,12 +85,12 @@ def image_variation_from_memory(self, params: dict[str, Any]) -> ImageArtifact | except ValueError as e: return ErrorArtifact(str(e)) - return self._generate_variation(prompts, negative_prompts, cast(ImageArtifact, image_artifact)) + return self._generate_variation(prompt, negative_prompt, cast(ImageArtifact, image_artifact)) def _generate_variation( - self, prompts: list[str], negative_prompts: list[str], image_artifact: ImageArtifact - ) -> ImageArtifact: - output_artifact = self.engine.run(prompts=prompts, negative_prompts=negative_prompts, image=image_artifact) + self, prompt: str, negative_prompt: str, image_artifact: ImageArtifact + ) -> ImageArtifact | ErrorArtifact: + output_artifact = self.engine.run(prompts=[prompt], negative_prompts=[negative_prompt], image=image_artifact) if self.output_dir or self.output_file: self._write_to_file(output_artifact) diff --git a/tests/unit/tools/conftest.py b/tests/unit/tools/conftest.py new file mode 100644 index 000000000..f4a7ce3f4 --- /dev/null +++ b/tests/unit/tools/conftest.py @@ -0,0 +1,12 @@ +import os +from pathlib import Path + +import pytest + + +@pytest.fixture() +def path_from_resource_path(): + def create_source(resource_path: str) -> Path: + return Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources", resource_path)) + + return create_source diff --git a/tests/unit/tools/test_inpainting_image_generation_client.py b/tests/unit/tools/test_inpainting_image_generation_client.py index 14ddcb5b6..0c5e49f9a 100644 --- a/tests/unit/tools/test_inpainting_image_generation_client.py +++ b/tests/unit/tools/test_inpainting_image_generation_client.py @@ -10,6 +10,10 @@ class TestInpaintingImageGenerationClient: + @pytest.fixture() + def image_artifact(self) -> ImageArtifact: + return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() @@ -29,7 +33,7 @@ def test_validate_output_configs(self, image_generation_engine) -> None: with pytest.raises(ValueError): InpaintingImageGenerationClient(engine=image_generation_engine, output_dir="test", output_file="test") - def test_image_inpainting(self, image_generator) -> None: + def test_image_inpainting(self, image_generator, path_from_resource_path) -> None: image_generator.engine.run.return_value = Mock( value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) @@ -37,17 +41,19 @@ def test_image_inpainting(self, image_generator) -> None: image_artifact = image_generator.image_inpainting_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", - "mask_file": "mask.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), + "mask_file": path_from_resource_path("small.png"), } } ) assert image_artifact - def test_image_inpainting_with_outfile(self, image_generation_engine, image_loader) -> None: + def test_image_inpainting_with_outfile( + self, image_generation_engine, image_loader, path_from_resource_path + ) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" image_generator = InpaintingImageGenerationClient( engine=image_generation_engine, output_file=outfile, image_loader=image_loader @@ -60,13 +66,39 @@ def test_image_inpainting_with_outfile(self, image_generation_engine, image_load image_artifact = image_generator.image_inpainting_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", - "mask_file": "mask.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), + "mask_file": path_from_resource_path("small.png"), } } ) assert image_artifact assert os.path.exists(outfile) + + def test_image_inpainting_from_memory(self, image_generation_engine, image_artifact): + image_generator = InpaintingImageGenerationClient(engine=image_generation_engine) + memory = Mock() + memory.load_artifacts = Mock(return_value=[image_artifact]) + image_generator.find_input_memory = Mock(return_value=memory) + + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" + ) + + image_artifact = image_generator.image_inpainting_from_memory( + params={ + "values": { + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_artifact_namespace": "namespace", + "image_artifact_name": "name", + "mask_artifact_namespace": "namespace", + "mask_artifact_name": "name", + "memory_name": "memory", + } + } + ) + + assert image_artifact diff --git a/tests/unit/tools/test_outpainting_image_variation_client.py b/tests/unit/tools/test_outpainting_image_variation_client.py index d604574cb..13d8df082 100644 --- a/tests/unit/tools/test_outpainting_image_variation_client.py +++ b/tests/unit/tools/test_outpainting_image_variation_client.py @@ -10,14 +10,18 @@ class TestOutpaintingImageGenerationClient: + @pytest.fixture() + def image_artifact(self) -> ImageArtifact: + return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() @pytest.fixture() - def image_loader(self) -> Mock: + def image_loader(self, image_artifact) -> Mock: loader = Mock() - loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) + loader.load.return_value = image_artifact return loader @@ -29,7 +33,7 @@ def test_validate_output_configs(self, image_generation_engine) -> None: with pytest.raises(ValueError): OutpaintingImageGenerationClient(engine=image_generation_engine, output_dir="test", output_file="test") - def test_image_outpainting(self, image_generator) -> None: + def test_image_outpainting(self, image_generator, path_from_resource_path) -> None: image_generator.engine.run.return_value = Mock( value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) @@ -37,17 +41,19 @@ def test_image_outpainting(self, image_generator) -> None: image_artifact = image_generator.image_outpainting_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", - "mask_file": "mask.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), + "mask_file": path_from_resource_path("small.png"), } } ) assert image_artifact - def test_image_outpainting_with_outfile(self, image_generation_engine, image_loader) -> None: + def test_image_outpainting_with_outfile( + self, image_generation_engine, image_loader, path_from_resource_path + ) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" image_generator = OutpaintingImageGenerationClient( engine=image_generation_engine, output_file=outfile, image_loader=image_loader @@ -60,13 +66,39 @@ def test_image_outpainting_with_outfile(self, image_generation_engine, image_loa image_artifact = image_generator.image_outpainting_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", - "mask_file": "mask.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), + "mask_file": path_from_resource_path("small.png"), } } ) assert image_artifact assert os.path.exists(outfile) + + def test_image_outpainting_from_memory(self, image_generation_engine, image_artifact): + image_generator = OutpaintingImageGenerationClient(engine=image_generation_engine) + memory = Mock() + memory.load_artifacts = Mock(return_value=[image_artifact]) + image_generator.find_input_memory = Mock(return_value=memory) + + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" + ) + + image_artifact = image_generator.image_outpainting_from_memory( + params={ + "values": { + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_artifact_namespace": "namespace", + "image_artifact_name": "name", + "mask_artifact_namespace": "namespace", + "mask_artifact_name": "name", + "memory_name": "memory", + } + } + ) + + assert image_artifact diff --git a/tests/unit/tools/test_prompt_image_generation_client.py b/tests/unit/tools/test_prompt_image_generation_client.py index 7393d1eff..276e33473 100644 --- a/tests/unit/tools/test_prompt_image_generation_client.py +++ b/tests/unit/tools/test_prompt_image_generation_client.py @@ -27,7 +27,7 @@ def test_generate_image(self, image_generator) -> None: ) image_artifact = image_generator.generate_image( - params={"values": {"prompts": ["test prompt"], "negative_prompts": ["test negative prompt"]}} + params={"values": {"prompt": "test prompt", "negative_prompt": "test negative prompt"}} ) assert image_artifact @@ -41,7 +41,7 @@ def test_generate_image_with_outfile(self, image_generation_engine) -> None: ) image_artifact = image_generator.generate_image( - params={"values": {"prompts": ["test prompt"], "negative_prompts": ["test negative prompt"]}} + params={"values": {"prompt": "test prompt", "negative_prompt": "test negative prompt"}} ) assert image_artifact diff --git a/tests/unit/tools/test_variation_image_generation_client.py b/tests/unit/tools/test_variation_image_generation_client.py index ba707e5bb..0db454f92 100644 --- a/tests/unit/tools/test_variation_image_generation_client.py +++ b/tests/unit/tools/test_variation_image_generation_client.py @@ -10,6 +10,10 @@ class TestVariationImageGenerationClient: + @pytest.fixture() + def image_artifact(self) -> ImageArtifact: + return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() @@ -31,7 +35,7 @@ def test_validate_output_configs(self, image_generation_engine, image_loader) -> engine=image_generation_engine, output_dir="test", output_file="test", image_loader=image_loader ) - def test_image_variation(self, image_generator) -> None: + def test_image_variation(self, image_generator, path_from_resource_path) -> None: image_generator.engine.run.return_value = Mock( value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) @@ -39,16 +43,16 @@ def test_image_variation(self, image_generator) -> None: image_artifact = image_generator.image_variation_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), } } ) assert image_artifact - def test_image_variation_with_outfile(self, image_generation_engine, image_loader) -> None: + def test_image_variation_with_outfile(self, image_generation_engine, image_loader, path_from_resource_path) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" image_generator = VariationImageGenerationClient( engine=image_generation_engine, output_file=outfile, image_loader=image_loader @@ -61,12 +65,36 @@ def test_image_variation_with_outfile(self, image_generation_engine, image_loade image_artifact = image_generator.image_variation_from_file( params={ "values": { - "prompts": ["test prompt"], - "negative_prompts": ["test negative prompt"], - "image_file": "image.png", + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "image_file": path_from_resource_path("small.png"), } } ) assert image_artifact assert os.path.exists(outfile) + + def test_image_variation_from_memory(self, image_generation_engine, image_artifact): + image_generator = VariationImageGenerationClient(engine=image_generation_engine) + memory = Mock() + memory.load_artifacts = Mock(return_value=[image_artifact]) + image_generator.find_input_memory = Mock(return_value=memory) + + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] + value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" + ) + + image_artifact = image_generator.image_variation_from_memory( + params={ + "values": { + "prompt": "test prompt", + "negative_prompt": "test negative prompt", + "artifact_namespace": "namespace", + "artifact_name": "name", + "memory_name": "memory", + } + } + ) + + assert image_artifact From 9f9ac917973171af4d525ed364059716f424c138 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Mon, 29 Jul 2024 12:29:58 -0700 Subject: [PATCH 192/238] Stable Diffusion 3 local support (#1018) --- .../drivers/image-generation-drivers.md | 127 ++++++++++++++++++ griptape/drivers/__init__.py | 21 +++ ...ngface_pipeline_image_generation_driver.py | 98 ++++++++++++++ .../image_generation_pipeline/__init__.py | 0 .../base_image_generation_pipeline_driver.py | 25 ++++ ...rolnet_image_generation_pipeline_driver.py | 87 ++++++++++++ ...sion_3_image_generation_pipeline_driver.py | 105 +++++++++++++++ ..._2_img_image_generation_pipeline_driver.py | 78 +++++++++++ poetry.lock | 113 ++++++++++++++-- pyproject.toml | 18 ++- ...ngface_pipeline_image_generation_driver.py | 72 ++++++++++ .../image_generation_pipeline/__init__.py | 0 ..._pipeline_image_generation_model_driver.py | 126 +++++++++++++++++ ..._pipeline_image_generation_model_driver.py | 105 +++++++++++++++ ..._pipeline_image_generation_model_driver.py | 94 +++++++++++++ 15 files changed, 1058 insertions(+), 11 deletions(-) create mode 100644 griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.py create mode 100644 griptape/drivers/image_generation_pipeline/__init__.py create mode 100644 griptape/drivers/image_generation_pipeline/base_image_generation_pipeline_driver.py create mode 100644 griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.py create mode 100644 griptape/drivers/image_generation_pipeline/stable_diffusion_3_image_generation_pipeline_driver.py create mode 100644 griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.py create mode 100644 tests/unit/drivers/image_generation/test_huggingface_pipeline_image_generation_driver.py create mode 100644 tests/unit/drivers/image_generation_pipeline/__init__.py create mode 100644 tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_controlnet_pipeline_image_generation_model_driver.py create mode 100644 tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_img_2_img_pipeline_image_generation_model_driver.py create mode 100644 tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_pipeline_image_generation_model_driver.py diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md index 75316134a..aae25c64d 100644 --- a/docs/griptape-framework/drivers/image-generation-drivers.md +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -179,3 +179,130 @@ agent = Agent(tools=[ agent.run("Generate a watercolor painting of a dog riding a skateboard") ``` + +### HuggingFace Pipelines + +!!! info + This driver requires the `drivers-image-generation-huggingface` [extra](../index.md#extras). + +The [HuggingFace Pipelines Image Generation Driver](../../reference/griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.md) enables image generation through locally-hosted models using the HuggingFace [Diffusers](https://huggingface.co/docs/diffusers/en/index) library. This Driver requires a [Pipeline Driver](../../reference/griptape/drivers/image_generation_pipeline/index.md) to prepare the appropriate Pipeline. + +This Driver requires a `model` configuration, specifying the model to use for image generation. The value of the `model` configuration must be one of the following: + + - A model name from the HuggingFace Model Hub, like `stabilityai/stable-diffusion-3-medium-diffusers` + - A path to the directory containing a model on the filesystem, like `./models/stable-diffusion-3/` + - A path to a file containing a model on the filesystem, like `./models/sd3_medium_incl_clips.safetensors` + +The `device` configuration specifies the hardware device used to run inference. Common values include `cuda` (supporting CUDA-enabled GPUs), `cpu` (supported by a device's CPU), and `mps` (supported by Apple silicon GPUs). For more information, see [HuggingFace's documentation](https://huggingface.co/docs/transformers/en/perf_infer_gpu_one) on GPU inference. + +#### Stable Diffusion 3 Image Generation Pipeline Driver + +!!! info + The `Stable Diffusion 3 Image Generation Pipeline Driver` requires the `drivers-image-generation-huggingface` extra. + +The [Stable Diffusion 3 Image Generation Pipeline Driver](../../reference/griptape/drivers/image_generation_pipeline/stable_diffusion_3_image_generation_pipeline_driver.md) provides a Stable `Diffusion3DiffusionPipeline` for text-to-image generations via the [HuggingFace Pipelines Image Generation Driver's](../../reference/griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.md) `.try_text_to_image()` method. This Driver accepts a text prompt and configurations including Stable Diffusion 3 model, output image size, generation seed, and inference steps. + +Image generation consumes substantial memory. On devices with limited VRAM, it may be necessary to enable the `enable_model_cpu_offload` or `drop_t5_encoder` configurations. For more information, see [HuggingFace's documentation](https://huggingface.co/docs/diffusers/en/optimization/memory) on reduced memory usage. + +```python title="PYTEST_IGNORE" +from griptape.structures import Pipeline +from griptape.tasks import PromptImageGenerationTask +from griptape.engines import PromptImageGenerationEngine +from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ + StableDiffusion3ImageGenerationPipelineDriver +from griptape.artifacts import TextArtifact + +image_generation_task = PromptImageGenerationTask( + input=TextArtifact("landscape photograph, verdant, countryside, 8k"), + image_generation_engine=PromptImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3ImageGenerationPipelineDriver( + height=512, + width=512, + ) + ) + ) +) + +output_artifact = Pipeline(tasks=[image_generation_task]).run().output +``` + +#### Stable Diffusion 3 Img2Img Image Generation Pipeline Driver + +!!! info + The `Stable Diffusion 3 Image Generation Pipeline Driver` requires the `drivers-image-generation-huggingface` extra. + +The [Stable Diffusion 3 Img2Img Image Generation Pipeline Driver](../../reference/griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.md) provides a `StableDiffusion3Img2ImgPipeline` for image-to-image generations, accepting a text prompt and input image. This Driver accepts a text prompt, an input image, and configurations including Stable Diffusion 3 model, output image size, inference steps, generation seed, and strength of generation over the input image. + +```python title="PYTEST_IGNORE" +from pathlib import Path + +from griptape.structures import Pipeline +from griptape.tasks import VariationImageGenerationTask +from griptape.engines import VariationImageGenerationEngine +from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ + StableDiffusion3Img2ImgImageGenerationPipelineDriver +from griptape.artifacts import TextArtifact, ImageArtifact +from griptape.loaders import ImageLoader + +prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") +input_image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +image_variation_task = VariationImageGenerationTask( + input=(prompt_artifact, input_image_artifact), + image_generation_engine=PromptImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3Img2ImgImageGenerationPipelineDriver( + height=1024, + width=1024, + ) + ) + ) +) + +output_artifact = Pipeline(tasks=[image_variation_task]).run().output +``` + +#### StableDiffusion3ControlNetImageGenerationPipelineDriver + +!!! note + The `Stable Diffusion 3 Image Generation Pipeline Driver` requires the `drivers-image-generation-huggingface` extra. + +The [StableDiffusion3ControlNetImageGenerationPipelineDriver](../../reference/griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.md) provides a `StableDiffusion3ControlNetPipeline` for image-to-image generations, accepting a text prompt and a control image. This Driver accepts a text prompt, a control image, and configurations including Stable Diffusion 3 model, ControlNet model, output image size, generation seed, inference steps, and the degree to which the model adheres to the control image. + +```python title="PYTEST_IGNORE" +from pathlib import Path + +from griptape.structures import Pipeline +from griptape.tasks import VariationImageGenerationTask +from griptape.engines import VariationImageGenerationEngine +from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ + StableDiffusion3ControlNetImageGenerationPipelineDriver +from griptape.artifacts import TextArtifact, ImageArtifact +from griptape.loaders import ImageLoader + +prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") +control_image_artifact = ImageLoader().load(Path("canny_control_image.png").read_bytes()) + +controlnet_task = VariationImageGenerationTask( + input=(prompt_artifact, control_image_artifact), + image_generation_engine=PromptImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3ControlNetImageGenerationPipelineDriver( + controlnet_model="InstantX/SD3-Controlnet-Canny", + control_strength=0.8, + height=768, + width=1024, + ) + ) + ) +) + +output_artifact = Pipeline(tasks=[controlnet_task]).run().output +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 4a516caf9..f948f1be1 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -54,6 +54,19 @@ ) from .image_generation_model.bedrock_titan_image_generation_model_driver import BedrockTitanImageGenerationModelDriver +from .image_generation_pipeline.base_image_generation_pipeline_driver import ( + BaseDiffusionImageGenerationPipelineDriver, +) +from .image_generation_pipeline.stable_diffusion_3_image_generation_pipeline_driver import ( + StableDiffusion3ImageGenerationPipelineDriver, +) +from .image_generation_pipeline.stable_diffusion_3_img_2_img_image_generation_pipeline_driver import ( + StableDiffusion3Img2ImgImageGenerationPipelineDriver, +) +from .image_generation_pipeline.stable_diffusion_3_controlnet_image_generation_pipeline_driver import ( + StableDiffusion3ControlNetImageGenerationPipelineDriver, +) + from .image_generation.base_image_generation_driver import BaseImageGenerationDriver from .image_generation.base_multi_model_image_generation_driver import BaseMultiModelImageGenerationDriver from .image_generation.openai_image_generation_driver import OpenAiImageGenerationDriver @@ -61,6 +74,9 @@ from .image_generation.amazon_bedrock_image_generation_driver import AmazonBedrockImageGenerationDriver from .image_generation.azure_openai_image_generation_driver import AzureOpenAiImageGenerationDriver from .image_generation.dummy_image_generation_driver import DummyImageGenerationDriver +from .image_generation.huggingface_pipeline_image_generation_driver import ( + HuggingFacePipelineImageGenerationDriver, +) from .image_query_model.base_image_query_model_driver import BaseImageQueryModelDriver from .image_query_model.bedrock_claude_image_query_model_driver import BedrockClaudeImageQueryModelDriver @@ -164,6 +180,10 @@ "BaseImageGenerationModelDriver", "BedrockStableDiffusionImageGenerationModelDriver", "BedrockTitanImageGenerationModelDriver", + "BaseDiffusionImageGenerationPipelineDriver", + "StableDiffusion3ImageGenerationPipelineDriver", + "StableDiffusion3Img2ImgImageGenerationPipelineDriver", + "StableDiffusion3ControlNetImageGenerationPipelineDriver", "BaseImageGenerationDriver", "BaseMultiModelImageGenerationDriver", "OpenAiImageGenerationDriver", @@ -171,6 +191,7 @@ "AmazonBedrockImageGenerationDriver", "AzureOpenAiImageGenerationDriver", "DummyImageGenerationDriver", + "HuggingFacePipelineImageGenerationDriver", "BaseImageQueryModelDriver", "BedrockClaudeImageQueryModelDriver", "BaseImageQueryDriver", diff --git a/griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.py b/griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.py new file mode 100644 index 000000000..46dbcd331 --- /dev/null +++ b/griptape/drivers/image_generation/huggingface_pipeline_image_generation_driver.py @@ -0,0 +1,98 @@ +from __future__ import annotations + +import io +from abc import ABC +from typing import Optional + +from attrs import define, field + +from griptape.artifacts import ImageArtifact +from griptape.drivers import BaseDiffusionImageGenerationPipelineDriver, BaseImageGenerationDriver +from griptape.utils import import_optional_dependency + + +@define +class HuggingFacePipelineImageGenerationDriver(BaseImageGenerationDriver, ABC): + """Image generation driver for models hosted by Hugging Face's Diffusion Pipeline. + + For more information, see the HuggingFace documentation for Diffusers: + https://huggingface.co/docs/diffusers/en/index + + Attributes: + pipeline_driver: A pipeline image generation model driver typed for the specific pipeline required by the model. + device: The hardware device used for inference. For example, "cpu", "cuda", or "mps". + output_format: The format the generated image is returned in. Defaults to "png". + """ + + pipeline_driver: BaseDiffusionImageGenerationPipelineDriver = field(kw_only=True, metadata={"serializable": True}) + device: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + output_format: str = field(default="png", kw_only=True, metadata={"serializable": True}) + + def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: + pipeline = self.pipeline_driver.prepare_pipeline(self.model, self.device) + + prompt = ", ".join(prompts) + output_image = pipeline( + prompt, **self.pipeline_driver.make_additional_params(negative_prompts, self.device) + ).images[0] + + buffer = io.BytesIO() + output_image.save(buffer, format=self.output_format.upper()) + + return ImageArtifact( + value=buffer.getvalue(), + format=self.output_format.lower(), + height=output_image.height, + width=output_image.width, + prompt=prompt, + ) + + def try_image_variation( + self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + ) -> ImageArtifact: + pil_image = import_optional_dependency("PIL.Image") + + pipeline = self.pipeline_driver.prepare_pipeline(self.model, self.device) + + prompt = ", ".join(prompts) + input_image = pil_image.open(io.BytesIO(image.value)) + # The size of the input image drives the size of the output image. + # Resize the input image to the configured dimensions. + output_width, output_height = self.pipeline_driver.output_image_dimensions + if input_image.height != output_height or input_image.width != output_width: + input_image = input_image.resize((output_width, output_height)) + + output_image = pipeline( + prompt, + **self.pipeline_driver.make_image_param(input_image), + **self.pipeline_driver.make_additional_params(negative_prompts, self.device), + ).images[0] + + buffer = io.BytesIO() + output_image.save(buffer, format=self.output_format.upper()) + + return ImageArtifact( + value=buffer.getvalue(), + format=self.output_format.lower(), + height=output_image.height, + width=output_image.width, + prompt=prompt, + ) + + def try_image_inpainting( + self, + prompts: list[str], + image: ImageArtifact, + mask: ImageArtifact, + negative_prompts: Optional[list[str]] = None, + ) -> ImageArtifact: + raise NotImplementedError("Inpainting is not supported by this driver.") + + def try_image_outpainting( + self, + prompts: list[str], + image: ImageArtifact, + mask: ImageArtifact, + negative_prompts: Optional[list[str]] = None, + ) -> ImageArtifact: + raise NotImplementedError("Outpainting is not supported by this driver.") diff --git a/griptape/drivers/image_generation_pipeline/__init__.py b/griptape/drivers/image_generation_pipeline/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/image_generation_pipeline/base_image_generation_pipeline_driver.py b/griptape/drivers/image_generation_pipeline/base_image_generation_pipeline_driver.py new file mode 100644 index 000000000..418034e7c --- /dev/null +++ b/griptape/drivers/image_generation_pipeline/base_image_generation_pipeline_driver.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define + +if TYPE_CHECKING: + from PIL.Image import Image + + +@define +class BaseDiffusionImageGenerationPipelineDriver(ABC): + @abstractmethod + def prepare_pipeline(self, model: str, device: Optional[str]) -> Any: ... + + @abstractmethod + def make_image_param(self, image: Optional[Image]) -> Optional[dict[str, Image]]: ... + + @abstractmethod + def make_additional_params(self, negative_prompts: Optional[list[str]], device: Optional[str]) -> dict: ... + + @property + @abstractmethod + def output_image_dimensions(self) -> tuple[int, int]: ... diff --git a/griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.py b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.py new file mode 100644 index 000000000..063735fb0 --- /dev/null +++ b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + +from griptape.drivers import StableDiffusion3ImageGenerationPipelineDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from PIL.Image import Image + + +@define +class StableDiffusion3ControlNetImageGenerationPipelineDriver(StableDiffusion3ImageGenerationPipelineDriver): + """Image generation model driver for Stable Diffusion 3 models with ControlNet. + + For more information, see the HuggingFace documentation for the StableDiffusion3ControlNetPipeline: + https://huggingface.co/docs/diffusers/en/api/pipelines/controlnet_sd3 + + Attributes: + controlnet_model: The ControlNet model to use for image generation. + controlnet_conditioning_scale: The conditioning scale for the ControlNet model. Defaults to None. + """ + + controlnet_model: str = field(kw_only=True) + controlnet_conditioning_scale: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) + + def prepare_pipeline(self, model: str, device: Optional[str]) -> Any: + sd3_controlnet_model = import_optional_dependency("diffusers.models.controlnet_sd3").SD3ControlNetModel + sd3_controlnet_pipeline = import_optional_dependency( + "diffusers.pipelines.controlnet_sd3.pipeline_stable_diffusion_3_controlnet" + ).StableDiffusion3ControlNetPipeline + + pipeline_params = {} + controlnet_pipeline_params = {} + if self.torch_dtype is not None: + pipeline_params["torch_dtype"] = self.torch_dtype + controlnet_pipeline_params["torch_dtype"] = self.torch_dtype + + if self.drop_t5_encoder: + pipeline_params["text_encoder_3"] = None + pipeline_params["tokenizer_3"] = None + + # For both Stable Diffusion and ControlNet, models can be provided either + # as a path to a local file or as a HuggingFace model repo name. + # We use the from_single_file method if the model is a local file and the + # from_pretrained method if the model is a local directory or hosted on HuggingFace. + if os.path.isfile(self.controlnet_model): + pipeline_params["controlnet"] = sd3_controlnet_model.from_single_file( + self.controlnet_model, **controlnet_pipeline_params + ) + else: + pipeline_params["controlnet"] = sd3_controlnet_model.from_pretrained( + self.controlnet_model, **controlnet_pipeline_params + ) + + if os.path.isfile(model): + pipeline = sd3_controlnet_pipeline.from_single_file(model, **pipeline_params) + else: + pipeline = sd3_controlnet_pipeline.from_pretrained(model, **pipeline_params) + + if self.enable_model_cpu_offload: + pipeline.enable_model_cpu_offload() + + if device is not None: + pipeline.to(device) + + return pipeline + + def make_image_param(self, image: Optional[Image]) -> Optional[dict[str, Image]]: + if image is None: + raise ValueError("Input image is required for ControlNet pipelines.") + + return {"control_image": image} + + def make_additional_params(self, negative_prompts: Optional[list[str]], device: Optional[str]) -> dict[str, Any]: + additional_params = super().make_additional_params(negative_prompts, device) + + del additional_params["height"] + del additional_params["width"] + + if self.controlnet_conditioning_scale is not None: + additional_params["controlnet_conditioning_scale"] = self.controlnet_conditioning_scale + + return additional_params diff --git a/griptape/drivers/image_generation_pipeline/stable_diffusion_3_image_generation_pipeline_driver.py b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_image_generation_pipeline_driver.py new file mode 100644 index 000000000..53e90c3e2 --- /dev/null +++ b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_image_generation_pipeline_driver.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + +from griptape.drivers.image_generation_pipeline.base_image_generation_pipeline_driver import ( + BaseDiffusionImageGenerationPipelineDriver, +) +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + import torch + from PIL.Image import Image + + +@define +class StableDiffusion3ImageGenerationPipelineDriver(BaseDiffusionImageGenerationPipelineDriver): + """Image generation model driver for Stable Diffusion 3 models. + + For more information, see the HuggingFace documentation for the StableDiffusion3Pipeline: + https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/stable_diffusion_3 + + Attributes: + width: The width of the generated image. Defaults to 1024. Must be a multiple of 64. + height: The height of the generated image. Defaults to 1024. Must be a multiple of 64. + seed: The random seed to use for image generation. If not provided, a random seed will be used. + guidance_scale: The strength of the guidance loss. If not provided, the default value will be used. + steps: The number of inference steps to use in image generation. If not provided, the default value will be used. + torch_dtype: The torch data type to use for image generation. If not provided, the default value will be used. + """ + + width: int = field(default=1024, kw_only=True, metadata={"serializable": True}) + height: int = field(default=1024, kw_only=True, metadata={"serializable": True}) + seed: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) + guidance_scale: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) + steps: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) + torch_dtype: Optional[torch.dtype] = field(default=None, kw_only=True, metadata={"serializable": True}) + enable_model_cpu_offload: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + drop_t5_encoder: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + + def prepare_pipeline(self, model: str, device: Optional[str]) -> Any: + sd3_pipeline = import_optional_dependency( + "diffusers.pipelines.stable_diffusion_3.pipeline_stable_diffusion_3" + ).StableDiffusion3Pipeline + + pipeline_params = {} + if self.torch_dtype is not None: + pipeline_params["torch_dtype"] = self.torch_dtype + + if self.drop_t5_encoder: + pipeline_params["text_encoder_3"] = None + pipeline_params["tokenizer_3"] = None + + # A model can be provided either as a path to a local file + # or as a HuggingFace model repo name. + if os.path.isfile(model): + # If the model provided is a local file (not a directory), + # we load it using the from_single_file method. + pipeline = sd3_pipeline.from_single_file(model, **pipeline_params) + else: + # If the model is a local directory or hosted on HuggingFace, + # we load it using the from_pretrained method. + pipeline = sd3_pipeline.from_pretrained(model, **pipeline_params) + + if self.enable_model_cpu_offload: + pipeline.enable_model_cpu_offload() + + # Move inference to particular device if requested. + if device is not None: + pipeline.to(device) + + return pipeline + + def make_image_param(self, image: Optional[Image]) -> Optional[dict[str, Image]]: + return None + + def make_additional_params(self, negative_prompts: Optional[list[str]], device: Optional[str]) -> dict[str, Any]: + torch_generator = import_optional_dependency("torch").Generator + + additional_params = {} + if negative_prompts: + additional_params["negative_prompt"] = ", ".join(negative_prompts) + + if self.width is not None: + additional_params["width"] = self.width + + if self.height is not None: + additional_params["height"] = self.height + + if self.seed is not None: + additional_params["generator"] = [torch_generator(device=device).manual_seed(self.seed)] + + if self.guidance_scale is not None: + additional_params["guidance_scale"] = self.guidance_scale + + if self.steps is not None: + additional_params["num_inference_steps"] = self.steps + + return additional_params + + @property + def output_image_dimensions(self) -> tuple[int, int]: + return self.width, self.height diff --git a/griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.py b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.py new file mode 100644 index 000000000..8276b110b --- /dev/null +++ b/griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + +from griptape.drivers import StableDiffusion3ImageGenerationPipelineDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from PIL.Image import Image + + +@define +class StableDiffusion3Img2ImgImageGenerationPipelineDriver(StableDiffusion3ImageGenerationPipelineDriver): + """Image generation model driver for Stable Diffusion 3 model image to image pipelines. + + For more information, see the HuggingFace documentation for the StableDiffusion3Img2ImgPipeline: + https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion_3/pipeline_stable_diffusion_3_img2img.py + + Attributes: + strength: A value [0.0, 1.0] that determines the strength of the initial image in the output. + """ + + strength: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) + + def prepare_pipeline(self, model: str, device: Optional[str]) -> Any: + sd3_img2img_pipeline = import_optional_dependency( + "diffusers.pipelines.stable_diffusion_3.pipeline_stable_diffusion_3_img2img" + ).StableDiffusion3Img2ImgPipeline + + pipeline_params = {} + if self.torch_dtype is not None: + pipeline_params["torch_dtype"] = self.torch_dtype + + if self.drop_t5_encoder: + pipeline_params["text_encoder_3"] = None + pipeline_params["tokenizer_3"] = None + + # A model can be provided either as a path to a local file + # or as a HuggingFace model repo name. + if os.path.isfile(model): + # If the model provided is a local file (not a directory), + # we load it using the from_single_file method. + pipeline = sd3_img2img_pipeline.from_single_file(model, **pipeline_params) + else: + # If the model is a local directory or hosted on HuggingFace, + # we load it using the from_pretrained method. + pipeline = sd3_img2img_pipeline.from_pretrained(model, **pipeline_params) + + if self.enable_model_cpu_offload: + pipeline.enable_model_cpu_offload() + + # Move inference to particular device if requested. + if device is not None: + pipeline.to(device) + + return pipeline + + def make_image_param(self, image: Optional[Image]) -> Optional[dict[str, Image]]: + if image is None: + raise ValueError("Input image is required for image to image pipelines.") + + return {"image": image} + + def make_additional_params(self, negative_prompts: Optional[list[str]], device: Optional[str]) -> dict[str, Any]: + additional_params = super().make_additional_params(negative_prompts, device) + + # Explicit height and width params are not supported, but + # are instead inferred from input image. + del additional_params["height"] + del additional_params["width"] + + if self.strength is not None: + additional_params["strength"] = self.strength + + return additional_params diff --git a/poetry.lock b/poetry.lock index 2738d6c97..58fff8c4e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,18 +2,18 @@ [[package]] name = "accelerate" -version = "0.31.0" +version = "0.32.1" description = "Accelerate" optional = true python-versions = ">=3.8.0" files = [ - {file = "accelerate-0.31.0-py3-none-any.whl", hash = "sha256:0fc608dc49584f64d04711a39711d73cb0ad4ef3d21cddee7ef2216e29471144"}, - {file = "accelerate-0.31.0.tar.gz", hash = "sha256:b5199865b26106ccf9205acacbe8e4b3b428ad585e7c472d6a46f6fb75b6c176"}, + {file = "accelerate-0.32.1-py3-none-any.whl", hash = "sha256:71fcf4be00872194071de561634268b71417d7f5b16b178e2fa76b6f117c52b0"}, + {file = "accelerate-0.32.1.tar.gz", hash = "sha256:3999acff0237cd0d4f9fd98b42d5a3163544777b53fc4f1eec886b77e992d177"}, ] [package.dependencies] huggingface-hub = "*" -numpy = ">=1.17" +numpy = ">=1.17,<2.0.0" packaging = ">=20.0" psutil = "*" pyyaml = "*" @@ -1201,6 +1201,40 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] +[[package]] +name = "diffusers" +version = "0.30.0.dev0" +description = "State-of-the-art diffusion in PyTorch and JAX." +optional = true +python-versions = ">=3.8.0" +files = [] +develop = false + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.23.2" +importlib_metadata = "*" +numpy = "*" +Pillow = "*" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.3.1" + +[package.extras] +dev = ["GitPython (<3.1.19)", "Jinja2", "Jinja2", "accelerate (>=0.31.0)", "accelerate (>=0.31.0)", "compel (==0.1.8)", "datasets", "datasets", "flax (>=0.4.1)", "hf-doc-builder (>=0.3.0)", "hf-doc-builder (>=0.3.0)", "invisible-watermark (>=0.2.0)", "isort (>=5.5.4)", "jax (>=0.4.1)", "jaxlib (>=0.4.1)", "k-diffusion (>=0.0.12)", "librosa", "parameterized", "peft (>=0.6.0)", "protobuf (>=3.20.3,<4)", "pytest", "pytest-timeout", "pytest-xdist", "requests-mock (==1.10.0)", "ruff (==0.1.5)", "safetensors (>=0.3.1)", "scipy", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "torch (>=1.4)", "torchvision", "transformers (>=4.41.2)", "urllib3 (<=2.0.0)"] +docs = ["hf-doc-builder (>=0.3.0)"] +flax = ["flax (>=0.4.1)", "jax (>=0.4.1)", "jaxlib (>=0.4.1)"] +quality = ["hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<=2.0.0)"] +test = ["GitPython (<3.1.19)", "Jinja2", "compel (==0.1.8)", "datasets", "invisible-watermark (>=0.2.0)", "k-diffusion (>=0.0.12)", "librosa", "parameterized", "pytest", "pytest-timeout", "pytest-xdist", "requests-mock (==1.10.0)", "safetensors (>=0.3.1)", "scipy", "sentencepiece (>=0.1.91,!=0.1.92)", "torchvision", "transformers (>=4.41.2)"] +torch = ["accelerate (>=0.31.0)", "torch (>=1.4)"] +training = ["Jinja2", "accelerate (>=0.31.0)", "datasets", "peft (>=0.6.0)", "protobuf (>=3.20.3,<4)", "tensorboard"] + +[package.source] +type = "git" +url = "https://github.com/griptape-ai/diffusers.git" +reference = "main" +resolved_reference = "90c1f182683a9bb51e370816d063b2e3aba53fc4" + [[package]] name = "distlib" version = "0.3.8" @@ -2500,13 +2534,9 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -5355,6 +5385,68 @@ files = [ cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "sentencepiece" +version = "0.2.0" +description = "SentencePiece python wrapper" +optional = true +python-versions = "*" +files = [ + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:188779e1298a1c8b8253c7d3ad729cb0a9891e5cef5e5d07ce4592c54869e227"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9cf85b296fa2b76fc2547b9cbb691a523864cebaee86304c43a7b4cb1b452"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7b67e724bead13f18db6e1d10b6bbdc454af574d70efbb36f27d90387be1ca3"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fde4b08cfe237be4484c6c7c2e2c75fb862cfeab6bd5449ce4caeafd97b767a"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c378492056202d1c48a4979650981635fd97875a00eabb1f00c6a236b013b5e"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1380ce6540a368de2ef6d7e6ba14ba8f3258df650d39ba7d833b79ee68a52040"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win32.whl", hash = "sha256:a1151d6a6dd4b43e552394aed0edfe9292820272f0194bd56c7c1660a0c06c3d"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:d490142b0521ef22bc1085f061d922a2a6666175bb6b42e588ff95c0db6819b2"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4547683f330289ec4f093027bfeb87f9ef023b2eb6f879fdc4a8187c7e0ffb90"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd6175f7eaec7142d2bf6f6597ce7db4c9ac89acf93fcdb17410c3a8b781eeb"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:859ba1acde782609a0910a26a60e16c191a82bf39b5621107552c0cd79fad00f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbbef6cc277f8f18f36959e305f10b1c620442d75addc79c21d7073ae581b50"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win32.whl", hash = "sha256:536b934e244829e3fe6c4f198652cd82da48adb9aa145c9f00889542726dee3d"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0a91aaa3c769b52440df56fafda683b3aa48e3f2169cf7ee5b8c8454a7f3ae9b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:787e480ca4c1d08c9985a7eb1eae4345c107729c99e9b5a9a00f2575fc7d4b4b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4d158189eb2ecffea3a51edf6d25e110b3678ec47f1a40f2d541eafbd8f6250"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e5ca43013e8935f25457a4fca47e315780172c3e821b4b13a890668911c792"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7140d9e5a74a0908493bb4a13f1f16a401297bd755ada4c707e842fbf6f0f5bf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win32.whl", hash = "sha256:6cf333625234f247ab357b0bd9836638405ea9082e1543d5b8408f014979dcbf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff88712338b01031910e8e61e7239aff3ce8869ee31a47df63cb38aadd591bea"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20813a68d4c221b1849c62c30e1281ea81687894d894b8d4a0f4677d9311e0f5"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:926ef920ae2e8182db31d3f5d081ada57804e3e1d3a8c4ef8b117f9d9fb5a945"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89f65f69636b7e9c015b79dff9c9985a9bc7d19ded6f79ef9f1ec920fdd73ecf"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f67eae0dbe6f2d7d6ba50a354623d787c99965f068b81e145d53240198021b0"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98501e075f35dd1a1d5a20f65be26839fcb1938752ec61539af008a5aa6f510b"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d1d2cc4882e8d6a1adf9d5927d7716f80617fc693385661caff21888972269"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win32.whl", hash = "sha256:b99a308a2e5e569031ab164b74e6fab0b6f37dfb493c32f7816225f4d411a6dd"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cdb701eec783d3ec86b7cd4c763adad8eaf6b46db37ee1c36e5e6c44b3fe1b5f"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1e0f9c4d0a6b0af59b613175f019916e28ade076e21242fd5be24340d8a2f64a"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:298f21cc1366eb60311aedba3169d30f885c363ddbf44214b0a587d2908141ad"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f1ec95aa1e5dab11f37ac7eff190493fd87770f7a8b81ebc9dd768d1a3c8704"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b06b70af54daa4b4904cbb90b4eb6d35c9f3252fdc86c9c32d5afd4d30118d8"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e37bac44dd6603388cb598c64ff7a76e41ca774646f21c23aadfbf5a2228ab"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0461324897735512a32d222e3d886e24ad6a499761952b6bda2a9ee6e4313ea5"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win32.whl", hash = "sha256:38aed822fb76435fa1f12185f10465a94ab9e51d5e8a9159e9a540ce926f0ffd"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d8cf876516548b5a1d6ac4745d8b554f5c07891d55da557925e5c13ff0b4e6ad"}, + {file = "sentencepiece-0.2.0.tar.gz", hash = "sha256:a52c19171daaf2e697dc6cbe67684e0fa341b1248966f6aebb541de654d15843"}, +] + [[package]] name = "sentinels" version = "1.0.0" @@ -6686,7 +6778,7 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy", "trafilatura", "transformers", "voyageai"] +all = ["accelerate", "anthropic", "beautifulsoup4", "boto3", "cohere", "diffusers", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "sentencepiece", "snowflake-sqlalchemy", "sqlalchemy", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6697,6 +6789,7 @@ drivers-embedding-voyageai = ["voyageai"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-pusher = ["pusher"] +drivers-image-generation-huggingface = ["accelerate", "diffusers", "pillow", "sentencepiece", "torch"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] drivers-observability-datadog = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] @@ -6735,4 +6828,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "214d3ce5365f5ce4d852e44019dbbea4659422bdc0231f7cf745a47eeb90ae18" +content-hash = "20511683fde939102f4d9e331fd9ecd064ad6cc490a5bf2f6c3f4366b4e43447" diff --git a/pyproject.toml b/pyproject.toml index 98bbe4a03..8bb0ca5d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,10 @@ opentelemetry-api = {version = "^1.25.0", optional = true} opentelemetry-instrumentation = {version = "^0.46b0", optional = true} opentelemetry-instrumentation-threading = {version = "^0.46b0", optional = true} opentelemetry-exporter-otlp-proto-http = {version = "^1.25.0", optional = true} +diffusers = {git = "https://github.com/griptape-ai/diffusers.git", branch = "main", optional = true} +accelerate = {version = "^0.32.1", optional = true} +sentencepiece = {version = "^0.2.0", optional = true} +torch = {version = "^2.3.1", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -134,6 +138,14 @@ drivers-observability-datadog = [ "opentelemetry-exporter-otlp-proto-http", ] +drivers-image-generation-huggingface = [ + "diffusers", + "accelerate", + "sentencepiece", + "torch", + "pillow", +] + loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] loaders-image = ["pillow"] @@ -174,11 +186,15 @@ all = [ "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-exporter-otlp-proto-http", + "diffusers", + "accelerate", + "sentencepiece", + "torch", + "pillow", # loaders "pandas", "pypdf", - "pillow", "mail-parser", "filetype", ] diff --git a/tests/unit/drivers/image_generation/test_huggingface_pipeline_image_generation_driver.py b/tests/unit/drivers/image_generation/test_huggingface_pipeline_image_generation_driver.py new file mode 100644 index 000000000..d47e6a107 --- /dev/null +++ b/tests/unit/drivers/image_generation/test_huggingface_pipeline_image_generation_driver.py @@ -0,0 +1,72 @@ +import io +from unittest.mock import Mock + +import pytest +from PIL import Image + +from griptape.artifacts import ImageArtifact +from griptape.drivers import ( + BaseDiffusionImageGenerationPipelineDriver, + HuggingFacePipelineImageGenerationDriver, +) + + +class TestHuggingFacePipelineImageGenerationDriver: + @pytest.fixture() + def image_artifact(self): + buffer = io.BytesIO() + Image.new("RGB", (256, 256)).save(buffer, "PNG") + return ImageArtifact(buffer.getvalue(), format="png", width=256, height=256) + + @pytest.fixture() + def model_driver(self): + model_driver = Mock(spec=BaseDiffusionImageGenerationPipelineDriver) + mock_pipeline = Mock() + mock_pipeline.return_value = Mock() + mock_pipeline.return_value.images = [Image.new("RGB", (256, 256))] + model_driver.prepare_pipeline.return_value = mock_pipeline + model_driver.make_image_param.return_value = {"image": Image.new("RGB", (256, 256))} + model_driver.make_additional_params.return_value = {"negative_prompt": ["sample negative prompt"]} + model_driver.output_image_dimensions = (256, 256) + + return model_driver + + @pytest.fixture() + def driver(self, model_driver): + return HuggingFacePipelineImageGenerationDriver(model="repo/model", pipeline_driver=model_driver) + + def test_init(self, driver): + assert driver + + def test_try_text_to_image(self, driver): + image_artifact = driver.try_text_to_image(prompts=["test prompt"]) + + assert image_artifact + assert image_artifact.mime_type == "image/png" + assert image_artifact.width == 256 + assert image_artifact.height == 256 + + def test_try_image_variation(self, driver, image_artifact): + image_artifact = driver.try_image_variation(prompts=["test prompt"], image=image_artifact) + + assert image_artifact + assert image_artifact.mime_type == "image/png" + assert image_artifact.width == 256 + assert image_artifact.height == 256 + + def test_try_image_inpainting(self, driver): + with pytest.raises(NotImplementedError): + driver.try_image_inpainting(prompts=["test prompt"], image=Mock(), mask=Mock()) + + def test_try_image_outpainting(self, driver): + with pytest.raises(NotImplementedError): + driver.try_image_outpainting(prompts=["test prompt"], image=Mock(), mask=Mock()) + + def test_configurable_output_format(self, driver): + driver.output_format = "jpeg" + image_artifact = driver.try_text_to_image(prompts=["test prompt"]) + + assert image_artifact + assert image_artifact.mime_type == "image/jpeg" + assert image_artifact.width == 256 + assert image_artifact.height == 256 diff --git a/tests/unit/drivers/image_generation_pipeline/__init__.py b/tests/unit/drivers/image_generation_pipeline/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_controlnet_pipeline_image_generation_model_driver.py b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_controlnet_pipeline_image_generation_model_driver.py new file mode 100644 index 000000000..986eb553d --- /dev/null +++ b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_controlnet_pipeline_image_generation_model_driver.py @@ -0,0 +1,126 @@ +from unittest.mock import Mock, patch + +import pytest +import torch +from PIL import Image + +from griptape.drivers import StableDiffusion3ControlNetImageGenerationPipelineDriver + + +class TestStableDiffusion3ControlNetPipelineImageGenerationModelDriver: + @pytest.fixture() + def model_driver(self): + return StableDiffusion3ControlNetImageGenerationPipelineDriver(controlnet_model="controlnet_model") + + @pytest.fixture() + def mock_import(self, monkeypatch): + mock = Mock() + monkeypatch.setattr( + "griptape.drivers.image_generation_pipeline.stable_diffusion_3_controlnet_image_generation_pipeline_driver.import_optional_dependency", + mock, + ) + + return mock + + def test_prepare_pipeline_local_file(self, model_driver, mock_import): + mock_sd3_controlnet_model = Mock() + mock_sd3_controlnet_pipeline = Mock() + mock_import.side_effect = [ + Mock(SD3ControlNetModel=mock_sd3_controlnet_model), + Mock(StableDiffusion3ControlNetPipeline=mock_sd3_controlnet_pipeline), + ] + + with patch("os.path.isfile", return_value=True): + result = model_driver.prepare_pipeline("local_model", "cuda") + + mock_sd3_controlnet_model.from_single_file.assert_called_once_with("controlnet_model") + mock_sd3_controlnet_pipeline.from_single_file.assert_called_once_with( + "local_model", controlnet=mock_sd3_controlnet_model.from_single_file.return_value + ) + + assert result == mock_sd3_controlnet_pipeline.from_single_file.return_value + result.to.assert_called_once_with("cuda") + + def test_prepare_pipeline_huggingface_model(self, model_driver, mock_import): + mock_sd3_controlnet_model = Mock() + mock_sd3_controlnet_pipeline = Mock() + mock_import.side_effect = [ + Mock(SD3ControlNetModel=mock_sd3_controlnet_model), + Mock(StableDiffusion3ControlNetPipeline=mock_sd3_controlnet_pipeline), + ] + + with patch("os.path.isfile", return_value=False): + result = model_driver.prepare_pipeline("huggingface/model", "cuda") + + mock_sd3_controlnet_model.from_pretrained.assert_called_once_with("controlnet_model") + mock_sd3_controlnet_pipeline.from_pretrained.assert_called_once_with( + "huggingface/model", controlnet=mock_sd3_controlnet_model.from_pretrained.return_value + ) + + assert result == mock_sd3_controlnet_pipeline.from_pretrained.return_value + result.to.assert_called_once_with("cuda") + + def test_prepare_pipeline_with_options(self, model_driver, mock_import): + mock_sd3_controlnet_model = Mock() + mock_sd3_controlnet_pipeline = Mock() + mock_import.side_effect = [ + Mock(SD3ControlNetModel=mock_sd3_controlnet_model), + Mock(StableDiffusion3ControlNetPipeline=mock_sd3_controlnet_pipeline), + ] + + model_driver.torch_dtype = torch.float16 + model_driver.drop_t5_encoder = True + model_driver.enable_model_cpu_offload = True + + result = model_driver.prepare_pipeline("huggingface/model", "cpu") + + mock_sd3_controlnet_pipeline.from_pretrained.assert_called_once_with( + "huggingface/model", + controlnet=mock_sd3_controlnet_model.from_pretrained.return_value, + torch_dtype=torch.float16, + text_encoder_3=None, + tokenizer_3=None, + ) + + assert result == mock_sd3_controlnet_pipeline.from_pretrained.return_value + result.to.assert_called_once_with("cpu") + result.enable_model_cpu_offload.assert_called_once() + + def test_make_image_param(self, model_driver): + mock_image = Mock(spec=Image.Image) + result = model_driver.make_image_param(mock_image) + + assert result == {"control_image": mock_image} + + def test_make_image_param_without_image(self, model_driver): + with pytest.raises(ValueError): + model_driver.make_image_param(None) + + def test_make_additional_params(self, model_driver, mock_import): + mock_torch = Mock() + mock_import.return_value = mock_torch + + model_driver.guidance_scale = 7.5 + model_driver.steps = 50 + model_driver.controlnet_conditioning_scale = 0.8 + + result = model_driver.make_additional_params(["no cats", "no dogs"], "cuda") + + expected = { + "negative_prompt": "no cats, no dogs", + "guidance_scale": 7.5, + "num_inference_steps": 50, + "controlnet_conditioning_scale": 0.8, + } + + assert result == expected + assert "height" not in result + assert "width" not in result + + def test_output_image_dimensions(self, model_driver): + model_driver.width = 512 + model_driver.height = 768 + + dimensions = model_driver.output_image_dimensions + + assert dimensions == (512, 768) diff --git a/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_img_2_img_pipeline_image_generation_model_driver.py b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_img_2_img_pipeline_image_generation_model_driver.py new file mode 100644 index 000000000..2ad28bec5 --- /dev/null +++ b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_img_2_img_pipeline_image_generation_model_driver.py @@ -0,0 +1,105 @@ +from unittest.mock import Mock, patch + +import pytest +import torch +from PIL import Image + +from griptape.drivers import StableDiffusion3Img2ImgImageGenerationPipelineDriver + + +class TestStableDiffusion3Img2ImgPipelineImageGenerationModelDriver: + @pytest.fixture() + def model_driver(self): + return StableDiffusion3Img2ImgImageGenerationPipelineDriver() + + @pytest.fixture() + def mock_import(self, monkeypatch): + mock = Mock() + monkeypatch.setattr( + "griptape.drivers.image_generation_pipeline.stable_diffusion_3_img_2_img_image_generation_pipeline_driver.import_optional_dependency", + mock, + ) + + return mock + + def test_prepare_pipeline_local_file(self, model_driver, mock_import): + mock_sd3_img2img_pipeline = Mock() + mock_import.return_value.StableDiffusion3Img2ImgPipeline = mock_sd3_img2img_pipeline + + with patch("os.path.isfile", return_value=True): + result = model_driver.prepare_pipeline("local_model", "cuda") + + mock_sd3_img2img_pipeline.from_single_file.assert_called_once_with("local_model") + + assert result == mock_sd3_img2img_pipeline.from_single_file.return_value + result.to.assert_called_once_with("cuda") + + def test_prepare_pipeline_huggingface_model(self, model_driver, mock_import): + mock_sd3_img2img_pipeline = Mock() + mock_import.return_value.StableDiffusion3Img2ImgPipeline = mock_sd3_img2img_pipeline + + with patch("os.path.isfile", return_value=False): + result = model_driver.prepare_pipeline("huggingface/model", "cuda") + + mock_sd3_img2img_pipeline.from_pretrained.assert_called_once_with("huggingface/model") + + assert result == mock_sd3_img2img_pipeline.from_pretrained.return_value + result.to.assert_called_once_with("cuda") + + def test_prepare_pipeline_with_options(self, model_driver, mock_import): + mock_sd3_img2img_pipeline = Mock() + mock_import.return_value.StableDiffusion3Img2ImgPipeline = mock_sd3_img2img_pipeline + + model_driver.torch_dtype = torch.float16 + model_driver.drop_t5_encoder = True + model_driver.enable_model_cpu_offload = True + + result = model_driver.prepare_pipeline("huggingface/model", "cpu") + + mock_sd3_img2img_pipeline.from_pretrained.assert_called_once_with( + "huggingface/model", + torch_dtype=torch.float16, + text_encoder_3=None, + tokenizer_3=None, + ) + assert result == mock_sd3_img2img_pipeline.from_pretrained.return_value + result.to.assert_called_once_with("cpu") + result.enable_model_cpu_offload.assert_called_once() + + def test_make_image_param(self, model_driver): + mock_image = Mock(spec=Image.Image) + result = model_driver.make_image_param(mock_image) + assert result == {"image": mock_image} + + def test_make_image_param_without_image(self, model_driver): + with pytest.raises(ValueError): + model_driver.make_image_param(None) + + def test_make_additional_params(self, model_driver, mock_import): + mock_torch = Mock() + mock_import.return_value = mock_torch + + model_driver.guidance_scale = 7.5 + model_driver.steps = 50 + model_driver.strength = 0.75 + + result = model_driver.make_additional_params(["no cats", "no dogs"], "cuda") + + expected = { + "negative_prompt": "no cats, no dogs", + "guidance_scale": 7.5, + "num_inference_steps": 50, + "strength": 0.75, + } + + assert result == expected + assert "height" not in result + assert "width" not in result + + def test_output_image_dimensions(self, model_driver): + model_driver.width = 512 + model_driver.height = 768 + + dimensions = model_driver.output_image_dimensions + + assert dimensions == (512, 768) diff --git a/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_pipeline_image_generation_model_driver.py b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_pipeline_image_generation_model_driver.py new file mode 100644 index 000000000..36077f43a --- /dev/null +++ b/tests/unit/drivers/image_generation_pipeline/test_stable_diffusion_3_pipeline_image_generation_model_driver.py @@ -0,0 +1,94 @@ +from unittest.mock import Mock, patch + +import pytest +import torch +from PIL import Image + +from griptape.drivers import StableDiffusion3ImageGenerationPipelineDriver + + +class TestStableDiffusion3PipelineImageGenerationModelDriver: + @pytest.fixture() + def model_driver(self): + return StableDiffusion3ImageGenerationPipelineDriver() + + @pytest.fixture() + def mock_import(self, monkeypatch): + mock = Mock() + monkeypatch.setattr( + "griptape.drivers.image_generation_pipeline.stable_diffusion_3_image_generation_pipeline_driver.import_optional_dependency", + mock, + ) + + return mock + + def test_prepare_pipeline_local_file(self, model_driver, mock_import): + mock_sd3_pipeline = Mock() + mock_import.return_value.StableDiffusion3Pipeline = mock_sd3_pipeline + + with patch("os.path.isfile", return_value=True): + result = model_driver.prepare_pipeline("local_model", "cuda") + + mock_sd3_pipeline.from_single_file.assert_called_once_with("local_model") + + assert result == mock_sd3_pipeline.from_single_file.return_value + result.to.assert_called_once_with("cuda") + + def test_prepare_pipeline_huggingface_model(self, model_driver, mock_import): + mock_sd3_pipeline = Mock() + mock_import.return_value.StableDiffusion3Pipeline = mock_sd3_pipeline + + with patch("os.path.isfile", return_value=False): + result = model_driver.prepare_pipeline("huggingface/model", None) + + mock_sd3_pipeline.from_pretrained.assert_called_once_with("huggingface/model") + assert result == mock_sd3_pipeline.from_pretrained.return_value + result.to.assert_not_called() + + def test_prepare_pipeline_with_options(self, model_driver, mock_import): + mock_sd3_pipeline = Mock() + mock_import.return_value.StableDiffusion3Pipeline = mock_sd3_pipeline + + model_driver.torch_dtype = torch.float16 + model_driver.drop_t5_encoder = True + model_driver.enable_model_cpu_offload = True + + result = model_driver.prepare_pipeline("huggingface/model", "cpu") + + mock_sd3_pipeline.from_pretrained.assert_called_once_with( + "huggingface/model", + torch_dtype=torch.float16, + text_encoder_3=None, + tokenizer_3=None, + ) + assert result == mock_sd3_pipeline.from_pretrained.return_value + result.to.assert_called_once_with("cpu") + result.enable_model_cpu_offload.assert_called_once() + + def test_make_image_param(self, model_driver): + assert model_driver.make_image_param(Mock(spec=Image.Image)) is None + + def test_make_additional_params(self, model_driver, mock_import): + mock_torch = Mock() + mock_import.return_value = mock_torch + + model_driver.guidance_scale = 7.5 + model_driver.steps = 50 + + result = model_driver.make_additional_params(["no cats", "no dogs"], "cuda") + + expected = { + "negative_prompt": "no cats, no dogs", + "width": 1024, + "height": 1024, + "guidance_scale": 7.5, + "num_inference_steps": 50, + } + + assert result == expected + + def test_output_image_dimensions(self, model_driver): + model_driver.width = 512 + model_driver.height = 768 + + assert model_driver.output_image_dimensions == (512, 768) From a8b98a41b88658058e5d7ebdda12d08bc25a06b0 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 29 Jul 2024 14:41:39 -0700 Subject: [PATCH 193/238] Fix openai function calling messages (#1026) --- .../prompt/openai_chat_prompt_driver.py | 73 +++++++++---------- .../prompt/test_openai_chat_prompt_driver.py | 1 + 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index c845aa6c5..13e3a6e2a 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -159,58 +159,53 @@ def __to_openai_messages(self, messages: list[Message]) -> list[dict]: openai_messages = [] for message in messages: + # If the message only contains textual content we can send it as a single content. if message.is_text(): - openai_messages.append({"role": message.role, "content": message.to_text()}) + openai_messages.append({"role": self.__to_openai_role(message), "content": message.to_text()}) + # Action results must be sent as separate messages. elif message.has_any_content_type(ActionResultMessageContent): - # ToolAction results need to be expanded into separate messages. openai_messages.extend( - [ - { - "role": self.__to_openai_role(message), - "content": self.__to_openai_message_content(action_result), - "tool_call_id": action_result.action.tag, - } - for action_result in message.get_content_type(ActionResultMessageContent) - ], - ) - else: - # ToolAction calls are attached to the assistant message that originally generated them. - action_call_content = [] - non_action_call_content = [] - for content in message.content: - if isinstance(content, ActionCallMessageContent): - action_call_content.append(content) - else: - non_action_call_content.append(content) - - openai_messages.append( { - "role": self.__to_openai_role(message), - "content": [ - self.__to_openai_message_content(content) - for content in non_action_call_content # ToolAction calls do not belong in the content - ], - **( - { - "tool_calls": [ - self.__to_openai_message_content(action_call) for action_call in action_call_content - ], - } - if action_call_content - else {} - ), - }, + "role": self.__to_openai_role(message, action_result), + "content": self.__to_openai_message_content(action_result), + "tool_call_id": action_result.action.tag, + } + for action_result in message.get_content_type(ActionResultMessageContent) ) + if message.has_any_content_type(TextMessageContent): + openai_messages.append({"role": self.__to_openai_role(message), "content": message.to_text()}) + else: + openai_message = { + "role": self.__to_openai_role(message), + "content": [ + self.__to_openai_message_content(content) + for content in [ + content for content in message.content if not isinstance(content, ActionCallMessageContent) + ] + ], + } + + # Action calls must be attached to the message, not sent as content. + action_call_content = [ + content for content in message.content if isinstance(content, ActionCallMessageContent) + ] + if action_call_content: + openai_message["tool_calls"] = [ + self.__to_openai_message_content(action_call) for action_call in action_call_content + ] + + openai_messages.append(openai_message) + return openai_messages - def __to_openai_role(self, message: Message) -> str: + def __to_openai_role(self, message: Message, message_content: Optional[BaseMessageContent] = None) -> str: if message.is_system(): return "system" elif message.is_assistant(): return "assistant" else: - if message.has_any_content_type(ActionResultMessageContent): + if isinstance(message_content, ActionResultMessageContent): return "tool" else: return "user" diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 23a40e20c..73073a0f0 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -270,6 +270,7 @@ def messages(self): ], }, {"content": "tool-output", "role": "tool", "tool_call_id": "MockTool_test"}, + {"content": "keep-going", "role": "user"}, ] From 231275d7310892c65f9944944d2d989e3248b7f9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 29 Jul 2024 16:16:03 -0700 Subject: [PATCH 194/238] Add native function calling support to Ollama Prompt Driver (#1027) --- CHANGELOG.md | 2 +- .../drivers/prompt-drivers.md | 7 +- .../drivers/prompt/ollama_prompt_driver.py | 158 +++++++++++++-- poetry.lock | 12 +- pyproject.toml | 2 +- .../prompt/test_ollama_prompt_driver.py | 187 ++++++++++++++++-- 6 files changed, 322 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a06a20d5..74ad21294 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added -- Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, and `CoherePromptDriver`. +- Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, `OllamaPromptDriver`, and `CoherePromptDriver`. - `OllamaEmbeddingDriver` for generating embeddings with Ollama. - `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. - `GriptapeCloudEventListenerDriver.api_key` defaults to the value in the `GT_CLOUD_API_KEY` environment variable. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 8be1a7c3d..ab749bf7c 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -282,21 +282,24 @@ agent.run( This driver requires the `drivers-prompt-ollama` [extra](../index.md#extras). The [OllamaPromptDriver](../../reference/griptape/drivers/prompt/ollama_prompt_driver.md) connects to the [Ollama Chat Completion API](https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion). +This driver uses [Ollama tool calling](https://ollama.com/blog/tool-support) when using [Tools](../tools/index.md). ```python from griptape.config import StructureConfig from griptape.drivers import OllamaPromptDriver +from griptape.tools import Calculator from griptape.structures import Agent agent = Agent( config=StructureConfig( prompt_driver=OllamaPromptDriver( - model="llama3", + model="llama3.1", ), ), + tools=[Calculator()], ) -agent.run("What color is the sky at different times of the day?") +agent.run("What is (192 + 12) ^ 4") ``` ### Hugging Face Hub diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index ea4f8b344..70d4ce89a 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -1,18 +1,22 @@ from __future__ import annotations from collections.abc import Iterator -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field -from griptape.artifacts import TextArtifact +from griptape.artifacts import ActionArtifact, TextArtifact from griptape.common import ( + ActionCallMessageContent, + ActionResultMessageContent, + BaseMessageContent, DeltaMessage, ImageMessageContent, Message, PromptStack, TextDeltaMessageContent, TextMessageContent, + ToolAction, observable, ) from griptape.drivers import BasePromptDriver @@ -23,6 +27,7 @@ from ollama import Client from griptape.tokenizers.base_tokenizer import BaseTokenizer + from griptape.tools import BaseTool @define @@ -61,6 +66,7 @@ class OllamaPromptDriver(BasePromptDriver): ), kw_only=True, ) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) @observable def try_run(self, prompt_stack: PromptStack) -> Message: @@ -68,7 +74,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: if isinstance(response, dict): return Message( - content=[TextMessageContent(TextArtifact(value=response["message"]["content"]))], + content=self.__to_prompt_stack_message_content(response), role=Message.ASSISTANT_ROLE, ) else: @@ -87,24 +93,134 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: def _base_params(self, prompt_stack: PromptStack) -> dict: messages = self._prompt_stack_to_messages(prompt_stack) - return {"messages": messages, "model": self.model, "options": self.options} + return { + "messages": messages, + "model": self.model, + "options": self.options, + **( + {"tools": self.__to_ollama_tools(prompt_stack.tools)} + if prompt_stack.tools + and self.use_native_tools + and not self.stream # Tool calling is only supported when not streaming + else {} + ), + } def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: - return [ - { - "role": message.role, - "content": message.to_text(), - **( - { - "images": [ - content.artifact.base64 - for content in message.content - if isinstance(content, ImageMessageContent) - ], - } - if any(isinstance(content, ImageMessageContent) for content in message.content) - else {} - ), + ollama_messages = [] + for message in prompt_stack.messages: + action_result_contents = message.get_content_type(ActionResultMessageContent) + + # Function calls need to be handled separately from the rest of the message content + if action_result_contents: + ollama_messages.extend( + [ + { + "role": self.__to_ollama_role(message, action_result_content), + "content": self.__to_ollama_message_content(action_result_content), + } + for action_result_content in action_result_contents + ], + ) + + text_contents = message.get_content_type(TextMessageContent) + if text_contents: + ollama_messages.append({"role": self.__to_ollama_role(message), "content": message.to_text()}) + else: + ollama_message: dict[str, Any] = { + "role": self.__to_ollama_role(message), + "content": message.to_text(), + } + + action_call_contents = message.get_content_type(ActionCallMessageContent) + if action_call_contents: + ollama_message["tool_calls"] = [ + self.__to_ollama_message_content(action_call_content) + for action_call_content in action_call_contents + ] + + image_contents = message.get_content_type(ImageMessageContent) + if image_contents: + ollama_message["images"] = [ + self.__to_ollama_message_content(image_content) for image_content in image_contents + ] + + ollama_messages.append(ollama_message) + + return ollama_messages + + def __to_ollama_message_content(self, content: BaseMessageContent) -> str | dict: + if isinstance(content, TextMessageContent): + return content.artifact.to_text() + elif isinstance(content, ImageMessageContent): + return content.artifact.base64 + elif isinstance(content, ActionCallMessageContent): + action = content.artifact.value + + return { + "type": "function", + "id": action.tag, + "function": {"name": action.to_native_tool_name(), "arguments": action.input}, } - for message in prompt_stack.messages - ] + elif isinstance(content, ActionResultMessageContent): + return content.artifact.to_text() + else: + raise ValueError(f"Unsupported content type: {type(content)}") + + def __to_ollama_tools(self, tools: list[BaseTool]) -> list[dict]: + ollama_tools = [] + + for tool in tools: + for activity in tool.activities(): + ollama_tool = { + "function": { + "name": tool.to_native_tool_name(activity), + "description": tool.activity_description(activity), + }, + "type": "function", + } + + activity_schema = tool.activity_schema(activity) + if activity_schema is not None: + ollama_tool["function"]["parameters"] = activity_schema.json_schema("Parameters Schema")[ + "properties" + ]["values"] + + ollama_tools.append(ollama_tool) + return ollama_tools + + def __to_ollama_role(self, message: Message, message_content: Optional[BaseMessageContent] = None) -> str: + if message.is_system(): + return "system" + elif message.is_assistant(): + return "assistant" + else: + if isinstance(message_content, ActionResultMessageContent): + return "tool" + else: + return "user" + + def __to_prompt_stack_message_content(self, response: dict) -> list[BaseMessageContent]: + content = [] + message = response["message"] + + if "content" in message and message["content"]: + content.append(TextMessageContent(TextArtifact(response["message"]["content"]))) + if "tool_calls" in message: + content.extend( + [ + ActionCallMessageContent( + ActionArtifact( + ToolAction( + tag=tool_call["function"]["name"], + name=ToolAction.from_native_tool_name(tool_call["function"]["name"])[0], + path=ToolAction.from_native_tool_name(tool_call["function"]["name"])[1], + input=tool_call["function"]["arguments"], + ), + ), + ) + for tool_call in message["tool_calls"] + ], + ) + + return content diff --git a/poetry.lock b/poetry.lock index 58fff8c4e..02c878fd5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2534,9 +2534,13 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -3573,13 +3577,13 @@ files = [ [[package]] name = "ollama" -version = "0.2.1" +version = "0.3.0" description = "The official Python client for Ollama." optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "ollama-0.2.1-py3-none-any.whl", hash = "sha256:b6e2414921c94f573a903d1069d682ba2fb2607070ea9e19ca4a7872f2a460ec"}, - {file = "ollama-0.2.1.tar.gz", hash = "sha256:fa316baa9a81eac3beb4affb0a17deb3008fdd6ed05b123c26306cfbe4c349b6"}, + {file = "ollama-0.3.0-py3-none-any.whl", hash = "sha256:cd7010c4e2a37d7f08f36cd35c4592b14f1ec0d1bf3df10342cd47963d81ad7a"}, + {file = "ollama-0.3.0.tar.gz", hash = "sha256:6ff493a2945ba76cdd6b7912a1cd79a45cfd9ba9120d14adeb63b2b5a7f353da"}, ] [package.dependencies] @@ -6828,4 +6832,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "20511683fde939102f4d9e331fd9ecd064ad6cc490a5bf2f6c3f4366b4e43447" +content-hash = "2b4b54981fadfbeb7fb06d2b481cdaa7b5b7c9238efd811419cda21340897ce6" diff --git a/pyproject.toml b/pyproject.toml index 8bb0ca5d4..1fb379829 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} qdrant-client = { version = "^1.10.1", optional = true } pusher = {version = "^3.3.2", optional = true} -ollama = {version = "^0.2.1", optional = true} +ollama = {version = "^0.3.0", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} sqlalchemy = {version = "^2.0.31", optional = true} opentelemetry-sdk = {version = "^1.25.0", optional = true} diff --git a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py index e51da368a..797880fdc 100644 --- a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py @@ -1,17 +1,111 @@ import pytest -from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact -from griptape.common import PromptStack -from griptape.common.prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent +from griptape.artifacts import ActionArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.common import PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import OllamaPromptDriver +from tests.mocks.mock_tool.tool import MockTool class TestOllamaPromptDriver: + OLLAMA_TOOLS = [ + { + "function": { + "description": "test description: foo", + "name": "MockTool_test", + "parameters": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_error", + "parameters": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_exception", + "parameters": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_list_output", + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_no_schema", + }, + "type": "function", + }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_str_output", + "parameters": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_without_default_memory", + "parameters": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + }, + }, + "type": "function", + }, + ] + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("ollama.Client") - mock_client.return_value.chat.return_value = {"message": {"content": "model-output"}} + mock_client.return_value.chat.return_value = { + "message": { + "content": "model-output", + "tool_calls": [ + { + "function": { + "name": "MockTool_test", + "arguments": {"foo": "bar"}, + } + } + ], + }, + } return mock_client @@ -22,12 +116,10 @@ def mock_stream_client(self, mocker): return mock_stream_client - def test_init(self): - assert OllamaPromptDriver(model="llama") - - def test_try_run(self, mock_client): - # Given + @pytest.fixture() + def prompt_stack(self): prompt_stack = PromptStack() + prompt_stack.tools = [MockTool()] prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") prompt_stack.add_user_message( @@ -36,26 +128,87 @@ def test_try_run(self, mock_client): ) ) prompt_stack.add_assistant_message("assistant-input") - driver = OllamaPromptDriver(model="llama") - expected_messages = [ + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact(""), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + TextArtifact("keep-going"), + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + ] + ) + ) + return prompt_stack + + @pytest.fixture() + def messages(self): + return [ {"role": "system", "content": "system-input"}, {"role": "user", "content": "user-input"}, - {"role": "user", "content": "user-input", "images": ["aW1hZ2UtZGF0YQ=="]}, + { + "role": "user", + "content": "user-input", + "images": ["aW1hZ2UtZGF0YQ=="], + }, {"role": "assistant", "content": "assistant-input"}, + { + "content": "", + "role": "assistant", + "tool_calls": [ + { + "function": {"arguments": {"foo": "bar"}, "name": "MockTool_test"}, + "id": "MockTool_test", + "type": "function", + } + ], + }, + {"content": "tool-output", "role": "tool"}, + {"content": "keep-going", "role": "user"}, ] + def test_init(self): + assert OllamaPromptDriver(model="llama") + + @pytest.mark.parametrize("use_native_tools", [True]) + def test_try_run(self, mock_client, prompt_stack, messages, use_native_tools): + # Given + driver = OllamaPromptDriver(model="llama") + # When message = driver.try_run(prompt_stack) # Then mock_client.return_value.chat.assert_called_once_with( - messages=expected_messages, + messages=messages, model=driver.model, - options={"temperature": driver.temperature, "stop": [], "num_predict": driver.max_tokens}, + options={ + "temperature": driver.temperature, + "stop": [], + "num_predict": driver.max_tokens, + }, + **{"tools": self.OLLAMA_TOOLS} if use_native_tools else {}, ) - assert message.value == "model-output" - assert message.usage.input_tokens is None - assert message.usage.output_tokens is None + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "MockTool_test" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} def test_try_run_bad_response(self, mock_client): # Given From c1e7f8d16fa48b5e2e6a2253abe6a7ac2f202b10 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 30 Jul 2024 08:49:18 -0700 Subject: [PATCH 195/238] Update issue template (#1029) --- .github/ISSUE_TEMPLATE/bug_report.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 1e185a5a0..9813b6aba 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -13,11 +13,7 @@ assignees: '' A clear and concise description of what the bug is. **To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error +A minimal, reproducible code example. **Expected behavior** A clear and concise description of what you expected to happen. From 47212cf289b2c93d4fd291064a1d6128318b6ced Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 30 Jul 2024 12:38:21 -0700 Subject: [PATCH 196/238] Clean Up Changelog (#1032) Co-authored-by: Andrew French --- CHANGELOG.md | 47 +++++------------------------------------------ 1 file changed, 5 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8109972ce..c591ec7f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,48 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased -### Added -- Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, `OllamaPromptDriver`, and `CoherePromptDriver`. -- `OllamaEmbeddingDriver` for generating embeddings with Ollama. -- `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. -- `GriptapeCloudEventListenerDriver.api_key` defaults to the value in the `GT_CLOUD_API_KEY` environment variable. -- `BaseObservabilityDriver` as the base class for all Observability Drivers. -- `DummyObservabilityDriver` as a no-op Observability Driver. -- `OpenTelemetryObservabilityDriver` for sending observability data to an open telemetry collector or vendor. -- `GriptapeCloudObservabilityDriver` for sending observability data to Griptape Cloud. -- `DatadogObservabilityDriver` for sending observability data to a Datadog Agent. -- `Observability` context manager for enabling observability and configuring which Observability Driver to use. -- `@observable` decorator for selecting which functions/methods to provide observability for. -- `GenericArtifact` for storing any data. -- `BaseTextArtifact` for text-based Artifacts to subclass. - -### Changed -- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.upsert_text` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.does_entry_exist` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.load_artifacts` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.upsert_vector` optional arguments are now keyword-only arguments. -- **BREAKING**: `BaseVectorStoreDriver.query` optional arguments are now keyword-only arguments. -- **BREAKING**: `EventListener.publish_event`'s `flush` argument is now a keyword-only argument. -- **BREAKING**: `BaseEventListenerDriver.publish_event`'s `flush` argument is now a keyword-only argument. -- **BREAKING**: Renamed `DummyException` to `DummyError` for pep8 naming compliance. -- **BREAKING**: Migrate to `sqlalchemy` 2.0. -- **BREAKING**: Make `sqlalchemy` an optional dependency. -- **BREAKING**: Renamed `drivers-sql-redshift` to `drivers-sql-amazon-redshift` -- **BREAKING**: Renamed `drivers-prompt-huggingface` extra to `drivers-prompt-huggingface-hub`. -- **BREAKING**: Renamed `drivers-vector-postgresql` extra to `drivers-vector-pgvector`. -- **BREAKING**: Update `marqo` dependency to `^3.7.0`. -- **BREAKING**: Removed `drivers-sql-postgresql` extra. Use `drivers-sql` extra and install necessary drivers (i.e. `psycopg2`) separately. -- Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. -- Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. -- Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. -- `CsvRowArtifact` now inherits from `BaseTextArtifact`. -- `TextArtifact` now inherits from `BaseTextArtifact`. - -### Fixed -- Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. -- Path issues on Windows with `LocalFileManagerDriver` and `AmazonS3FileManagerDriver`. ## [0.29.0] - 2024-07-30 @@ -64,6 +22,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `@observable` decorator for selecting which functions/methods to provide observability for. - `GenericArtifact` for storing any data. - `BaseTextArtifact` for text-based Artifacts to subclass. +- `HuggingFacePipelineImageGenerationDriver` for generating images locally with HuggingFace pipelines. +- `BaseImageGenerationPipelineDriver` as the base class for drivers interfacing with HuggingFace image generation pipelines. +- `StableDiffusion3ImageGenerationPipelineDriver` for local text-to-image generation using a Stable Diffusion 3 pipeline. +- `StableDiffusion3Img2ImgImageGenerationPipelineDriver` for local image-to-image generation using a Stable Diffusion 3 pipeline. +- `StableDiffusion3ControlNetImageGenerationPipelineDriver` for local ControlNet image generation using a Stable Diffusion 3 pipeline. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. From 3cb1fe74d974f9f9274a6e08061ed1db99c6ad77 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 31 Jul 2024 10:34:03 -0700 Subject: [PATCH 197/238] Add DataStax Astra DB vector store driver (#1034) Co-authored-by: Stefano Lottini --- .github/workflows/docs-integration-tests.yml | 2 + CHANGELOG.md | 3 + docs/examples/query-webpage-astra-db.md | 78 ++ .../drivers/vector-store-drivers.md | 46 + griptape/drivers/__init__.py | 2 + .../vector/astradb_vector_store_driver.py | 184 +++ mkdocs.yml | 1 + poetry.lock | 1000 ++++++++++------- pyproject.toml | 3 + .../test_astra_db_vector_store_driver.py | 149 +++ tests/mocks/mock_embedding_driver.py | 5 +- .../test_astra_db_vector_store_driver.py | 139 +++ 12 files changed, 1175 insertions(+), 437 deletions(-) create mode 100644 docs/examples/query-webpage-astra-db.md create mode 100644 griptape/drivers/vector/astradb_vector_store_driver.py create mode 100644 tests/integration/drivers/vector/test_astra_db_vector_store_driver.py create mode 100644 tests/unit/drivers/vector/test_astra_db_vector_store_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index ce30f83bb..4418f0b12 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -124,6 +124,8 @@ jobs: ZENROWS_API_KEY: ${{ secrets.INTEG_ZENROWS_API_KEY }} QDRANT_CLUSTER_ENDPOINT: ${{ secrets.INTEG_QDRANT_CLUSTER_ENDPOINT }} QDRANT_CLUSTER_API_KEY: ${{ secrets.INTEG_QDRANT_CLUSTER_API_KEY }} + ASTRA_DB_API_ENDPOINT: ${{ secrets.INTEG_ASTRA_DB_API_ENDPOINT }} + ASTRA_DB_APPLICATION_TOKEN: ${{ secrets.INTEG_ASTRA_DB_APPLICATION_TOKEN }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index c591ec7f3..efe70904d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `AstraDbVectorStoreDriver` to support DataStax Astra DB as a vector store. + ## [0.29.0] - 2024-07-30 ### Added diff --git a/docs/examples/query-webpage-astra-db.md b/docs/examples/query-webpage-astra-db.md new file mode 100644 index 000000000..46989c2ba --- /dev/null +++ b/docs/examples/query-webpage-astra-db.md @@ -0,0 +1,78 @@ +The following example script ingests a Web page (a blog post), +stores its chunked contents on Astra DB through the Astra DB vector store driver, +and finally runs a RAG process to answer a question specific to the topic of the +Web page. + +This script requires that a vector collection has been created in the Astra database +(with name `"griptape_test_collection"` and vector dimension matching the embedding being used, i.e. 1536 in this case). + +_Note:_ Besides the [Astra DB](../griptape-framework/drivers/vector-store-drivers.md#astra-db) extra, +this example requires the `drivers-web-scraper-trafilatura` +Griptape extra to be installed as well. + + +```python +import os + +from griptape.drivers import ( + AstraDbVectorStoreDriver, + OpenAiChatPromptDriver, + OpenAiEmbeddingDriver, +) +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import ( + PromptResponseRagModule, + VectorStoreRetrievalRagModule, +) +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import RagClient, TaskMemoryClient + + +namespace = "datastax_blog" +input_blogpost = ( + "www.datastax.com/blog/indexing-all-of-wikipedia-on-a-laptop" +) + +vector_store_driver = AstraDbVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), + api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + collection_name="griptape_test_collection", + astra_db_namespace=os.environ.get("ASTRA_DB_KEYSPACE"), +) + +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, + query_params={ + "count": 2, + "namespace": namespace, + }, + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + ) + ) +) + +vector_store_driver.upsert_text_artifacts( + {namespace: WebLoader(max_tokens=256).load(input_blogpost)} +) + +vector_store_tool = RagClient( + description="A DataStax blog post", + rag_engine=engine, +) +agent = Agent(tools=[vector_store_tool, TaskMemoryClient(off_prompt=False)]) +agent.run( + "What engine made possible to index such an amount of data, " + "and what kind of tuning was required?" +) +``` diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index 2b76119b3..ad826d0aa 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -482,3 +482,49 @@ values = [r.to_artifact().value for r in results] print("\n\n".join(values)) ``` + +### Astra DB + +!!! info + This Driver requires the `drivers-vector-astra-db` [extra](../index.md#extras). + +The AstraDbVectorStoreDriver supports [DataStax Astra DB](https://www.datastax.com/products/datastax-astra). + +The following example shows how to store vector entries and query the information using the driver: + +```python +import os +from griptape.drivers import AstraDbVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Astra DB secrets and connection parameters +api_endpoint = os.environ["ASTRA_DB_API_ENDPOINT"] +token = os.environ["ASTRA_DB_APPLICATION_TOKEN"] +astra_db_namespace = os.environ.get("ASTRA_DB_KEYSPACE") # optional + +# Initialize an Embedding Driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = AstraDbVectorStoreDriver( + embedding_driver=embedding_driver, + api_endpoint=api_endpoint, + token=token, + collection_name="griptape_test_collection", + astra_db_namespace=astra_db_namespace, # optional +) + +# Load Artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +# Upsert Artifacts into the Vector Store Driver +[ + vector_store_driver.upsert_text_artifact(a, namespace="griptape") + for a in artifacts +] + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index f948f1be1..9e1790b01 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -41,6 +41,7 @@ from .vector.azure_mongodb_vector_store_driver import AzureMongoDbVectorStoreDriver from .vector.dummy_vector_store_driver import DummyVectorStoreDriver from .vector.qdrant_vector_store_driver import QdrantVectorStoreDriver +from .vector.astradb_vector_store_driver import AstraDbVectorStoreDriver from .vector.griptape_cloud_knowledge_base_vector_store_driver import GriptapeCloudKnowledgeBaseVectorStoreDriver from .sql.base_sql_driver import BaseSqlDriver @@ -171,6 +172,7 @@ "AmazonOpenSearchVectorStoreDriver", "PgVectorVectorStoreDriver", "QdrantVectorStoreDriver", + "AstraDbVectorStoreDriver", "DummyVectorStoreDriver", "GriptapeCloudKnowledgeBaseVectorStoreDriver", "BaseSqlDriver", diff --git a/griptape/drivers/vector/astradb_vector_store_driver.py b/griptape/drivers/vector/astradb_vector_store_driver.py new file mode 100644 index 000000000..029fa382d --- /dev/null +++ b/griptape/drivers/vector/astradb_vector_store_driver.py @@ -0,0 +1,184 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + +from griptape.drivers import BaseVectorStoreDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from astrapy import Collection + from astrapy.authentication import TokenProvider + + +@define +class AstraDbVectorStoreDriver(BaseVectorStoreDriver): + """A Vector Store Driver for Astra DB. + + Attributes: + embedding_driver: a `griptape.drivers.BaseEmbeddingDriver` for embedding computations within the store + api_endpoint: the "API Endpoint" for the Astra DB instance. + token: a Database Token ("AstraCS:...") secret to access Astra DB. An instance of `astrapy.authentication.TokenProvider` is also accepted. + collection_name: the name of the collection on Astra DB. The collection must have been created beforehand, + and support vectors with a vector dimension matching the embeddings being used by this driver. + environment: the environment ("prod", "hcd", ...) hosting the target Data API. + It can be omitted for production Astra DB targets. See `astrapy.constants.Environment` for allowed values. + astra_db_namespace: optional specification of the namespace (in the Astra database) for the data. + *Note*: not to be confused with the "namespace" mentioned elsewhere, which is a grouping within this vector store. + """ + + api_endpoint: str = field(kw_only=True, metadata={"serializable": True}) + token: Optional[str | TokenProvider] = field(kw_only=True, default=None, metadata={"serializable": False}) + collection_name: str = field(kw_only=True, metadata={"serializable": True}) + environment: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + astra_db_namespace: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + + collection: Collection = field(init=False) + + def __attrs_post_init__(self) -> None: + astrapy = import_optional_dependency("astrapy") + self.collection = ( + astrapy.DataAPIClient( + caller_name="griptape", + environment=self.environment, + ) + .get_database( + self.api_endpoint, + token=self.token, + namespace=self.astra_db_namespace, + ) + .get_collection( + name=self.collection_name, + ) + ) + + def delete_vector(self, vector_id: str) -> None: + """Delete a vector from Astra DB store. + + The method succeeds regardless of whether a vector with the provided ID + was actually stored or not in the first place. + + Args: + vector_id: ID of the vector to delete. + """ + self.collection.delete_one({"_id": vector_id}) + + def upsert_vector( + self, + vector: list[float], + *, + vector_id: Optional[str] = None, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + **kwargs: Any, + ) -> str: + """Write a vector to the Astra DB store. + + In case the provided ID exists already, an overwrite will take place. + + Args: + vector: the vector to be upserted. + vector_id: the ID for the vector to store. If omitted, a server-provided new ID will be employed. + namespace: a namespace (a grouping within the vector store) to assign the vector to. + meta: a metadata dictionary associated to the vector. + kwargs: additional keyword arguments. Currently none is used: if they are passed, they will be ignored with a warning. + + Returns: + the ID of the written vector (str). + """ + document = { + k: v + for k, v in {"$vector": vector, "_id": vector_id, "namespace": namespace, "meta": meta}.items() + if v is not None + } + if vector_id is not None: + self.collection.find_one_and_replace({"_id": vector_id}, document, upsert=True) + return vector_id + else: + insert_result = self.collection.insert_one(document) + return insert_result.inserted_id + + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + """Load a single vector entry from the Astra DB store given its ID. + + Args: + vector_id: the ID of the required vector. + namespace: a namespace, within the vector store, to constrain the search. + + Returns: + The vector entry (a `BaseVectorStoreDriver.Entry`) if found, otherwise None. + """ + find_filter = {k: v for k, v in {"_id": vector_id, "namespace": namespace}.items() if v is not None} + match = self.collection.find_one(filter=find_filter, projection={"*": 1}) + if match is not None: + return BaseVectorStoreDriver.Entry( + id=match["_id"], vector=match.get("$vector"), meta=match.get("meta"), namespace=match.get("namespace") + ) + else: + return None + + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + """Load entries from the Astra DB store. + + Args: + namespace: a namespace, within the vector store, to constrain the search. + + Returns: + A list of vector (`BaseVectorStoreDriver.Entry`) entries. + """ + find_filter: dict[str, str] = {} if namespace is None else {"namespace": namespace} + return [ + BaseVectorStoreDriver.Entry( + id=match["_id"], vector=match.get("$vector"), meta=match.get("meta"), namespace=match.get("namespace") + ) + for match in self.collection.find(filter=find_filter, projection={"*": 1}) + ] + + def query( + self, + query: str, + *, + count: Optional[int] = None, + namespace: Optional[str] = None, + include_vectors: bool = False, + **kwargs: Any, + ) -> list[BaseVectorStoreDriver.Entry]: + """Run a similarity search on the Astra DB store, based on a query string. + + Args: + query: the query string. + count: the maximum number of results to return. If omitted, defaults will apply. + namespace: the namespace to filter results by. + include_vectors: whether to include vector data in the results. + kwargs: additional keyword arguments. Currently only the free-form dict `filter` + is recognized (and goes straight to the Data API query); + others will generate a warning and be ignored. + + Returns: + A list of vector (`BaseVectorStoreDriver.Entry`) entries, + with their `score` attribute set to the vector similarity to the query. + """ + query_filter: Optional[dict[str, Any]] = kwargs.get("filter") + find_filter_ns: dict[str, Any] = {} if namespace is None else {"namespace": namespace} + find_filter = {**(query_filter or {}), **find_filter_ns} + find_projection: Optional[dict[str, int]] = {"*": 1} if include_vectors else None + vector = self.embedding_driver.embed_string(query) + ann_limit = count or BaseVectorStoreDriver.DEFAULT_QUERY_COUNT + matches = self.collection.find( + filter=find_filter, + sort={"$vector": vector}, + limit=ann_limit, + projection=find_projection, + include_similarity=True, + ) + return [ + BaseVectorStoreDriver.Entry( + id=match["_id"], + vector=match.get("$vector"), + score=match["$similarity"], + meta=match.get("meta"), + namespace=match.get("namespace"), + ) + for match in matches + ] diff --git a/mkdocs.yml b/mkdocs.yml index 911301f4e..6c9bffa13 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -170,5 +170,6 @@ nav: - Load and Query Pinecone: "examples/load-and-query-pinecone.md" - Load and Query Marqo: "examples/load-query-and-chat-marqo.md" - Query a Webpage: "examples/query-webpage.md" + - RAG with Astra DB vector store: "examples/query-webpage-astra-db.md" - Reference Guide: "reference/" - Trade School: "https://learn.griptape.ai" diff --git a/poetry.lock b/poetry.lock index 6d34873c6..26cc36f06 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,92 +31,104 @@ test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "py test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +[[package]] +name = "aiohappyeyeballs" +version = "2.3.2" +description = "Happy Eyeballs" +optional = true +python-versions = ">=3.8,<4.0" +files = [ + {file = "aiohappyeyeballs-2.3.2-py3-none-any.whl", hash = "sha256:903282fb08c8cfb3de356fd546b263248a477c99cb147e20a115e14ab942a4ae"}, + {file = "aiohappyeyeballs-2.3.2.tar.gz", hash = "sha256:77e15a733090547a1f5369a1287ddfc944bd30df0eb8993f585259c34b405f4e"}, +] + [[package]] name = "aiohttp" -version = "3.9.5" +version = "3.10.0" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, - {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, - {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, - {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, - {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, - {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, - {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, - {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, - {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, - {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, -] - -[package.dependencies] + {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:68ab608118e212f56feef44d4785aa90b713042da301f26338f36497b481cd79"}, + {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:64a117c16273ca9f18670f33fc7fd9604b9f46ddb453ce948262889a6be72868"}, + {file = "aiohttp-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54076a25f32305e585a3abae1f0ad10646bec539e0e5ebcc62b54ee4982ec29f"}, + {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c76685773444d90ae83874433505ed800e1706c391fdf9e57cc7857611e2f4"}, + {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdda86ab376f9b3095a1079a16fbe44acb9ddde349634f1c9909d13631ff3bcf"}, + {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6dcd1d21da5ae1416f69aa03e883a51e84b6c803b8618cbab341ac89a85b9e"}, + {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ef0135d7ab7fb0284342fbbf8e8ddf73b7fee8ecc55f5c3a3d0a6b765e6d8b"}, + {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccab9381f38c669bb9254d848f3b41a3284193b3e274a34687822f98412097e9"}, + {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:947da3aee057010bc750b7b4bb65cbd01b0bdb7c4e1cf278489a1d4a1e9596b3"}, + {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5268b35fee7eb754fb5b3d0f16a84a2e9ed21306f5377f3818596214ad2d7714"}, + {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff25d988fd6ce433b5c393094a5ca50df568bdccf90a8b340900e24e0d5fb45c"}, + {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:594b4b4f1dfe8378b4a0342576dc87a930c960641159f5ae83843834016dbd59"}, + {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c8820dad615cd2f296ed3fdea8402b12663ac9e5ea2aafc90ef5141eb10b50b8"}, + {file = "aiohttp-3.10.0-cp310-cp310-win32.whl", hash = "sha256:ab1d870403817c9a0486ca56ccbc0ebaf85d992277d48777faa5a95e40e5bcca"}, + {file = "aiohttp-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:563705a94ea3af43467167f3a21c665f3b847b2a0ae5544fa9e18df686a660da"}, + {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13679e11937d3f37600860de1f848e2e062e2b396d3aa79b38c89f9c8ab7e791"}, + {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c66a1aadafbc0bd7d648cb7fcb3860ec9beb1b436ce3357036a4d9284fcef9a"}, + {file = "aiohttp-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7e3545b06aae925f90f06402e05cfb9c62c6409ce57041932163b09c48daad6"}, + {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:effafe5144aa32f0388e8f99b1b2692cf094ea2f6b7ceca384b54338b77b1f50"}, + {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a04f2c8d41821a2507b49b2694c40495a295b013afb0cc7355b337980b47c546"}, + {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6dbfac556219d884d50edc6e1952a93545c2786193f00f5521ec0d9d464040ab"}, + {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a65472256c5232681968deeea3cd5453aa091c44e8db09f22f1a1491d422c2d9"}, + {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941366a554e566efdd3f042e17a9e461a36202469e5fd2aee66fe3efe6412aef"}, + {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:927b4aca6340301e7d8bb05278d0b6585b8633ea852b7022d604a5df920486bf"}, + {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:34adb8412e736a5d0df6d1fccdf71599dfb07a63add241a94a189b6364e997f1"}, + {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:43c60d9b332a01ee985f080f639f3e56abcfb95ec1320013c94083c3b6a2e143"}, + {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3f49edf7c5cd2987634116e1b6a0ee2438fca17f7c4ee480ff41decb76cf6158"}, + {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9784246431eaf9d651b3cc06f9c64f9a9f57299f4971c5ea778fa0b81074ef13"}, + {file = "aiohttp-3.10.0-cp311-cp311-win32.whl", hash = "sha256:bec91402df78b897a47b66b9c071f48051cea68d853d8bc1d4404896c6de41ae"}, + {file = "aiohttp-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:25a9924343bf91b0c5082cae32cfc5a1f8787ac0433966319ec07b0ed4570722"}, + {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:21dab4a704c68dc7bc2a1219a4027158e8968e2079f1444eda2ba88bc9f2895f"}, + {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:872c0dcaccebd5733d535868fe2356aa6939f5827dcea7a8b9355bb2eff6f56e"}, + {file = "aiohttp-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f381424dbce313bb5a666a215e7a9dcebbc533e9a2c467a1f0c95279d24d1fa7"}, + {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ca48e9f092a417c6669ee8d3a19d40b3c66dde1a2ae0d57e66c34812819b671"}, + {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe2f6d0466f5c59c7258e0745c20d74806a1385fbb7963e5bbe2309a11cc69b"}, + {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03799a95402a7ed62671c4465e1eae51d749d5439dbc49edb6eee52ea165c50b"}, + {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5549c71c35b5f057a4eebcc538c41299826f7813f28880722b60e41c861a57ec"}, + {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6fa7a42b78d8698491dc4ad388169de54cca551aa9900f750547372de396277"}, + {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:77bbf0a2f6fefac6c0db1792c234f577d80299a33ce7125467439097cf869198"}, + {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:34eaf5cfcc979846d73571b1a4be22cad5e029d55cdbe77cdc7545caa4dcb925"}, + {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4f1de31a585344a106db43a9c3af2e15bb82e053618ff759f1fdd31d82da38eb"}, + {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3a1ea61d96146e9b9e5597069466e2e4d9e01e09381c5dd51659f890d5e29e7"}, + {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:73c01201219eb039a828bb58dcc13112eec2fed6eea718356316cd552df26e04"}, + {file = "aiohttp-3.10.0-cp312-cp312-win32.whl", hash = "sha256:33e915971eee6d2056d15470a1214e4e0f72b6aad10225548a7ab4c4f54e2db7"}, + {file = "aiohttp-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2dc75da06c35a7b47a88ceadbf993a53d77d66423c2a78de8c6f9fb41ec35687"}, + {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f1bc4d68b83966012813598fe39b35b4e6019b69d29385cf7ec1cb08e1ff829b"}, + {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9b8b31c057a0b7bb822a159c490af05cb11b8069097f3236746a78315998afa"}, + {file = "aiohttp-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10f0d7894ddc6ff8f369e3fdc082ef1f940dc1f5b9003cd40945d24845477220"}, + {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72de8ffba4a27e3c6e83e58a379fc4fe5548f69f9b541fde895afb9be8c31658"}, + {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd36d0f0afc2bd84f007cedd2d9a449c3cf04af471853a25eb71f28bc2e1a119"}, + {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f64d503c661864866c09806ac360b95457f872d639ca61719115a9f389b2ec90"}, + {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31616121369bc823791056c632f544c6c8f8d1ceecffd8bf3f72ef621eaabf49"}, + {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f76c12abb88b7ee64b3f9ae72f0644af49ff139067b5add142836dab405d60d4"}, + {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6c99eef30a7e98144bcf44d615bc0f445b3a3730495fcc16124cb61117e1f81e"}, + {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:39e7ec718e7a1971a5d98357e3e8c0529477d45c711d32cd91999dc8d8404e1e"}, + {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1cef548ee4e84264b78879de0c754bbe223193c6313beb242ce862f82eab184"}, + {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f98f036eab11d2f90cdd01b9d1410de9d7eb520d070debeb2edadf158b758431"}, + {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc4376ff537f7d2c1e98f97f6d548e99e5d96078b0333c1d3177c11467b972de"}, + {file = "aiohttp-3.10.0-cp38-cp38-win32.whl", hash = "sha256:ebedc51ee6d39f9ea5e26e255fd56a7f4e79a56e77d960f9bae75ef4f95ed57f"}, + {file = "aiohttp-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:aad87626f31a85fd4af02ba7fd6cc424b39d4bff5c8677e612882649da572e47"}, + {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1dc95c5e2a5e60095f1bb51822e3b504e6a7430c9b44bff2120c29bb876c5202"}, + {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c83977f7b6f4f4a96fab500f5a76d355f19f42675224a3002d375b3fb309174"}, + {file = "aiohttp-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8cedc48d36652dd3ac40e5c7c139d528202393e341a5e3475acedb5e8d5c4c75"}, + {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b099fbb823efed3c1d736f343ac60d66531b13680ee9b2669e368280f41c2b8"}, + {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d583755ddb9c97a2da1322f17fc7d26792f4e035f472d675e2761c766f94c2ff"}, + {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a03a4407bdb9ae815f0d5a19df482b17df530cf7bf9c78771aa1c713c37ff1f"}, + {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb6e65f6ea7caa0188e36bebe9e72b259d3d525634758c91209afb5a6cbcba7"}, + {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6612c6ed3147a4a2d6463454b94b877566b38215665be4c729cd8b7bdce15b4"}, + {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b0c0148d2a69b82ffe650c2ce235b431d49a90bde7dd2629bcb40314957acf6"}, + {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0d85a173b4dbbaaad1900e197181ea0fafa617ca6656663f629a8a372fdc7d06"}, + {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:12c43dace645023583f3dd2337dfc3aa92c99fb943b64dcf2bc15c7aa0fb4a95"}, + {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:33acb0d9bf12cdc80ceec6f5fda83ea7990ce0321c54234d629529ca2c54e33d"}, + {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:91e0b76502205484a4d1d6f25f461fa60fe81a7987b90e57f7b941b0753c3ec8"}, + {file = "aiohttp-3.10.0-cp39-cp39-win32.whl", hash = "sha256:1ebd8ed91428ffbe8b33a5bd6f50174e11882d5b8e2fe28670406ab5ee045ede"}, + {file = "aiohttp-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:0433795c4a8bafc03deb3e662192250ba5db347c41231b0273380d2f53c9ea0b"}, + {file = "aiohttp-3.10.0.tar.gz", hash = "sha256:e8dd7da2609303e3574c95b0ec9f1fd49647ef29b94701a2862cceae76382e1d"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" @@ -125,7 +137,7 @@ multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiolimiter" @@ -221,6 +233,25 @@ files = [ {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, ] +[[package]] +name = "astrapy" +version = "1.4.0" +description = "AstraPy is a Pythonic SDK for DataStax Astra and its Data API" +optional = true +python-versions = "<4.0.0,>=3.8.0" +files = [ + {file = "astrapy-1.4.0-py3-none-any.whl", hash = "sha256:6decf0619daf3fe1daca61a18b897fe51d8a64d52dd4a9d1261aa8dd31c4667e"}, + {file = "astrapy-1.4.0.tar.gz", hash = "sha256:336292bc43bacb356877639e456a056165f3240a0caf861630daa73587819db8"}, +] + +[package.dependencies] +bson = ">=0.5.10,<0.6.0" +cassio = ">=0.1.4,<0.2.0" +deprecation = ">=2.1.0,<2.2.0" +httpx = {version = ">=0.25.2,<1", extras = ["http2"]} +toml = ">=0.10.2,<0.11.0" +uuid6 = ">=2024.1.12,<2024.2.0" + [[package]] name = "async-timeout" version = "4.0.3" @@ -314,17 +345,17 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.34.146" +version = "1.34.151" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.146-py3-none-any.whl", hash = "sha256:7ec568fb19bce82a70be51f08fddac1ef927ca3fb0896cbb34303a012ba228d8"}, - {file = "boto3-1.34.146.tar.gz", hash = "sha256:5686fe2a6d1aa1de8a88e9589cdcc33361640d3d7a13da718a30717248886124"}, + {file = "boto3-1.34.151-py3-none-any.whl", hash = "sha256:35bc76faacf1667d3fbb66c1966acf2230ef26206557efc26d9d9d79337bef43"}, + {file = "boto3-1.34.151.tar.gz", hash = "sha256:30498a76b6f651ee2af7ae8edc1704379279ab8b91f1a8dd1f4ddf51259b0bc2"}, ] [package.dependencies] -botocore = ">=1.34.146,<1.35.0" +botocore = ">=1.34.151,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -333,13 +364,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.34.146" -description = "Type annotations for boto3 1.34.146 generated with mypy-boto3-builder 7.25.0" +version = "1.34.151" +description = "Type annotations for boto3 1.34.151 generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.34.146-py3-none-any.whl", hash = "sha256:904918cb9d20f0d3744a7ed0863090fef8c1bd82d3bdcafbc94310e5cb36daf7"}, - {file = "boto3_stubs-1.34.146.tar.gz", hash = "sha256:5e4ccbedb7534fca303d5b8c2f1534a9bcd097c686f1f5a9ed82ae7f259bb8d1"}, + {file = "boto3_stubs-1.34.151-py3-none-any.whl", hash = "sha256:7c74775d5bca4693c9695526b95c80a572d6e1bf8059249698abff9596268671"}, + {file = "boto3_stubs-1.34.151.tar.gz", hash = "sha256:8422368138fb74afb7c11965677726000c4d24b7b3b872d414f5c706372bf94f"}, ] [package.dependencies] @@ -395,7 +426,7 @@ bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)"] bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)"] bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.34.0,<1.35.0)"] -boto3 = ["boto3 (==1.34.146)", "botocore (==1.34.146)"] +boto3 = ["boto3 (==1.34.151)", "botocore (==1.34.151)"] braket = ["mypy-boto3-braket (>=1.34.0,<1.35.0)"] budgets = ["mypy-boto3-budgets (>=1.34.0,<1.35.0)"] ce = ["mypy-boto3-ce (>=1.34.0,<1.35.0)"] @@ -744,13 +775,13 @@ xray = ["mypy-boto3-xray (>=1.34.0,<1.35.0)"] [[package]] name = "botocore" -version = "1.34.146" +version = "1.34.151" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.146-py3-none-any.whl", hash = "sha256:3fd4782362bd29c192704ebf859c5c8c5189ad05719e391eefe23088434427ae"}, - {file = "botocore-1.34.146.tar.gz", hash = "sha256:849cb8e54e042443aeabcd7822b5f2b76cb5cfe33fe3a71f91c7c069748a869c"}, + {file = "botocore-1.34.151-py3-none-any.whl", hash = "sha256:9018680d7d4a8060c26d127ceec5ab5b270879f423ea39b863d8a46f3e34c404"}, + {file = "botocore-1.34.151.tar.gz", hash = "sha256:0d0968e427a94378f295b49d59170dad539938487ec948de3d030f06092ec6dc"}, ] [package.dependencies] @@ -766,13 +797,13 @@ crt = ["awscrt (==0.20.11)"] [[package]] name = "botocore-stubs" -version = "1.34.146" +version = "1.34.151" description = "Type annotations and code completion for botocore" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "botocore_stubs-1.34.146-py3-none-any.whl", hash = "sha256:f77385f2b6af64b04e00dffc0f684879f308c48ce05deefabbec46b290841fc1"}, - {file = "botocore_stubs-1.34.146.tar.gz", hash = "sha256:a7d990c165e3151180a8c1c754183c2f687520117c918bdd6057f26baad4e1d2"}, + {file = "botocore_stubs-1.34.151-py3-none-any.whl", hash = "sha256:89a50f631d74cd7ddd5ab02cf0d0c718d2fc36c1a7e54b84bd4be738d5a239da"}, + {file = "botocore_stubs-1.34.151.tar.gz", hash = "sha256:675f21efef0d8c533701e7449f765fd120b627e80a8ced41bafc43c34e021be5"}, ] [package.dependencies] @@ -781,6 +812,20 @@ types-awscrt = "*" [package.extras] botocore = ["botocore"] +[[package]] +name = "bson" +version = "0.5.10" +description = "BSON codec for Python" +optional = true +python-versions = "*" +files = [ + {file = "bson-0.5.10.tar.gz", hash = "sha256:d6511b2ab051139a9123c184de1a04227262173ad593429d21e443d6462d6590"}, +] + +[package.dependencies] +python-dateutil = ">=2.4.0" +six = ">=1.9.0" + [[package]] name = "cachetools" version = "5.4.0" @@ -792,6 +837,69 @@ files = [ {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] +[[package]] +name = "cassandra-driver" +version = "3.29.1" +description = "DataStax Driver for Apache Cassandra" +optional = true +python-versions = "*" +files = [ + {file = "cassandra-driver-3.29.1.tar.gz", hash = "sha256:38e9c2a2f2a9664bb03f1f852d5fccaeff2163942b5db35dffcf8bf32a51cfe5"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8f175c7616a63ca48cb8bd4acc443e2a3d889964d5157cead761f23cc8db7bd"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d66398952b9cd21c40edff56e22b6d3bce765edc94b207ddb5896e7bc9aa088"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbc6f575ef109ce5d4abfa2033bf36c394032abd83e32ab671159ce68e7e17b"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78f241af75696adb3e470209e2fbb498804c99e2b197d24d74774eee6784f283"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-win32.whl", hash = "sha256:54d9e651a742d6ca3d874ef8d06a40fa032d2dba97142da2d36f60c5675e39f8"}, + {file = "cassandra_driver-3.29.1-cp310-cp310-win_amd64.whl", hash = "sha256:630dc5423cd40eba0ee9db31065e2238098ff1a25a6b1bd36360f85738f26e4b"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b841d38c96bb878d31df393954863652d6d3a85f47bcc00fd1d70a5ea73023f"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19cc7375f673e215bd4cbbefae2de9f07830be7dabef55284a2d2ff8d8691efe"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b74b355be3dcafe652fffda8f14f385ccc1a8dae9df28e6080cc660da39b45f"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e6dac7eddd3f4581859f180383574068a3f113907811b4dad755a8ace4c3fbd"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-win32.whl", hash = "sha256:293a79dba417112b56320ed0013d71fd7520f5fc4a5fd2ac8000c762c6dd5b07"}, + {file = "cassandra_driver-3.29.1-cp311-cp311-win_amd64.whl", hash = "sha256:7c2374fdf1099047a6c9c8329c79d71ad11e61d9cca7de92a0f49655da4bdd8a"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4431a0c836f33a33c733c84997fbdb6398be005c4d18a8c8525c469fdc29393c"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23b08381b171a9e42ace483a82457edcddada9e8367e31677b97538cde2dc34"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4beb29a0139e63a10a5b9a3c7b72c30a4e6e20c9f0574f9d22c0d4144fe3d348"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b206423cc454a78f16b411e7cb641dddc26168ac2e18f2c13665f5f3c89868c"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-win32.whl", hash = "sha256:ac898cca7303a3a2a3070513eee12ef0f1be1a0796935c5b8aa13dae8c0a7f7e"}, + {file = "cassandra_driver-3.29.1-cp312-cp312-win_amd64.whl", hash = "sha256:4ad0c9fb2229048ad6ff8c6ddbf1fdc78b111f2b061c66237c2257fcc4a31b14"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4282c5deac462e4bb0f6fd0553a33d514dbd5ee99d0812594210080330ddd1a2"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:41ca7eea069754002418d3bdfbd3dfd150ea12cb9db474ab1a01fa4679a05bcb"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6639ccb268c4dc754bc45e03551711780d0e02cb298ab26cde1f42b7bcc74f8"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9d7d3b1be24a7f113b5404186ccccc977520401303a8fe78ba34134cad2482"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-win32.whl", hash = "sha256:81c8fd556c6e1bb93577e69c1f10a3fadf7ddb93958d226ccbb72389396e9a92"}, + {file = "cassandra_driver-3.29.1-cp38-cp38-win_amd64.whl", hash = "sha256:cfe70ed0f27af949de2767ea9cef4092584e8748759374a55bf23c30746c7b23"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2c03c1d834ac1a0ae39f9af297a8cd38829003ce910b08b324fb3abe488ce2b"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a3e1e2b01f3b7a5cf75c97401bce830071d99c42464352087d7475e0161af93"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90c42006665a4e490b0766b70f3d637f36a30accbef2da35d6d4081c0e0bafc3"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c1aca41f45772f9759e8246030907d92bc35fbbdc91525a3cb9b49939b80ad7"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-win32.whl", hash = "sha256:ce4a66245d4a0c8b07fdcb6398698c2c42eb71245fb49cff39435bb702ff7be6"}, + {file = "cassandra_driver-3.29.1-cp39-cp39-win_amd64.whl", hash = "sha256:4cae69ceb1b1d9383e988a1b790115253eacf7867ceb15ed2adb736e3ce981be"}, +] + +[package.dependencies] +geomet = ">=0.1,<0.3" + +[package.extras] +cle = ["cryptography (>=35.0)"] +graph = ["gremlinpython (==3.4.6)"] + +[[package]] +name = "cassio" +version = "0.1.8" +description = "A framework-agnostic Python library to seamlessly integrate Apache Cassandra(R) with ML/LLM/genAI workloads." +optional = true +python-versions = "<4.0,>=3.8" +files = [ + {file = "cassio-0.1.8-py3-none-any.whl", hash = "sha256:c09e7c884ba7227ff5277c86f3b0f31c523672ea407f56d093c7227e69c54d94"}, + {file = "cassio-0.1.8.tar.gz", hash = "sha256:4e09929506cb3dd6fad217e89846d0a1a59069afd24b82c72526ef6f2e9271af"}, +] + +[package.dependencies] +cassandra-driver = ">=3.28.0,<4.0.0" +numpy = ">=1.0" +requests = ">=2.31.0,<3.0.0" + [[package]] name = "certifi" version = "2024.7.4" @@ -1027,19 +1135,22 @@ files = [ [[package]] name = "courlan" -version = "1.2.0" +version = "1.3.0" description = "Clean, filter and sample URLs to optimize data collection – includes spam, content type and language filters." optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "courlan-1.2.0-py3-none-any.whl", hash = "sha256:df9d3735b611e717c52a813a49d17a8b4d3a9d8b87bbace9065171fc5d084397"}, - {file = "courlan-1.2.0.tar.gz", hash = "sha256:0cbc9cac83970c651b937a7823a5d92cbebb6b601454ea0fb6cb4d0ee5d1845d"}, + {file = "courlan-1.3.0-py3-none-any.whl", hash = "sha256:bb30982108ef987731b127f1ecf5dfd5b7e46c825630e3c9313c80b4a454954c"}, + {file = "courlan-1.3.0.tar.gz", hash = "sha256:3868f388122f2b09d154802043fe92dfd62c3ea7a700eaae8abc05198cf8bc25"}, ] [package.dependencies] -babel = ">=2.11.0" -tld = {version = ">=0.13", markers = "python_version >= \"3.7\""} -urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} +babel = ">=2.15.0" +tld = ">=0.13" +urllib3 = ">=1.26,<3" + +[package.extras] +dev = ["black", "mypy", "pytest", "pytest-cov"] [[package]] name = "coverage" @@ -1201,6 +1312,20 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +optional = true +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + [[package]] name = "diffusers" version = "0.29.2" @@ -1308,37 +1433,38 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.2.1" +version = "6.2.5" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = true python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.2.1-py3-none-any.whl", hash = "sha256:1a03f799b85fdfa08d5e6478624683f373b9dc35e6f145544b9cab72a4f575fa"}, - {file = "duckduckgo_search-6.2.1.tar.gz", hash = "sha256:d664ec096193e3fb43bdfae4b0ad9c04e44094b58f41998adcdd20a86ee1ed74"}, + {file = "duckduckgo_search-6.2.5-py3-none-any.whl", hash = "sha256:a2ae433f812899adf1e4922d3aa306489039ffdbd83b82da3e828625757877bd"}, + {file = "duckduckgo_search-6.2.5.tar.gz", hash = "sha256:177c7993cdd136698884605883984feee39939b2c2d0ac9037fd5bb801f72c3e"}, ] [package.dependencies] click = ">=8.1.7" -pyreqwest-impersonate = ">=0.5.0" +primp = ">=0.5.5" [package.extras] -dev = ["mypy (>=1.10.1)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.5.2)"] +dev = ["mypy (>=1.11.0)", "pytest (>=8.3.1)", "pytest-asyncio (>=0.23.8)", "ruff (>=0.5.5)"] lxml = ["lxml (>=5.2.2)"] [[package]] name = "elevenlabs" -version = "1.5.0" +version = "1.6.1" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.5.0-py3-none-any.whl", hash = "sha256:cc28257ad535adf57fdc70c9a3b8ddd6c34166f310bbc11a733523894e73ceca"}, - {file = "elevenlabs-1.5.0.tar.gz", hash = "sha256:d56a282f933e2eb991dac2b09cf7e928f1899f1cb5a9e9fa1d500be6edd7ee1d"}, + {file = "elevenlabs-1.6.1-py3-none-any.whl", hash = "sha256:1017f3c85b31995fab0ca02958b980bbc09590f0a29bf76db4c043ac93850d5e"}, + {file = "elevenlabs-1.6.1.tar.gz", hash = "sha256:59128170ee710bb6248de34e6a48d707e8044dc48a0229774efc29faae4a86d3"}, ] [package.dependencies] httpx = ">=0.21.2" pydantic = ">=1.9.2" +pydantic-core = ">=2.18.2,<3.0.0" requests = ">=2.20" typing_extensions = ">=4.0.0" websockets = ">=11.0" @@ -1593,6 +1719,21 @@ files = [ [package.extras] speedup = ["python-levenshtein (>=0.12)"] +[[package]] +name = "geomet" +version = "0.2.1.post1" +description = "GeoJSON <-> WKT/WKB conversion utilities" +optional = true +python-versions = ">2.6, !=3.3.*, <4" +files = [ + {file = "geomet-0.2.1.post1-py3-none-any.whl", hash = "sha256:a41a1e336b381416d6cbed7f1745c848e91defaa4d4c1bdc1312732e46ffad2b"}, + {file = "geomet-0.2.1.post1.tar.gz", hash = "sha256:91d754f7c298cbfcabd3befdb69c641c27fe75e808b27aa55028605761d17e95"}, +] + +[package.dependencies] +click = "*" +six = "*" + [[package]] name = "ghp-import" version = "2.1.0" @@ -1660,13 +1801,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.137.0" +version = "2.139.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.137.0-py2.py3-none-any.whl", hash = "sha256:a8b5c5724885e5be9f5368739aa0ccf416627da4ebd914b410a090c18f84d692"}, - {file = "google_api_python_client-2.137.0.tar.gz", hash = "sha256:e739cb74aac8258b1886cb853b0722d47c81fe07ad649d7f2206f06530513c04"}, + {file = "google_api_python_client-2.139.0-py2.py3-none-any.whl", hash = "sha256:1850a92505d91a82e2ca1635ab2b8dff179f4b67082c2651e1db332e8039840c"}, + {file = "google_api_python_client-2.139.0.tar.gz", hash = "sha256:ed4bc3abe2c060a87412465b4e8254620bbbc548eefc5388e2c5ff912d36a68b"}, ] [package.dependencies] @@ -2114,13 +2255,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.24.0" +version = "0.24.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"}, - {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"}, + {file = "huggingface_hub-0.24.3-py3-none-any.whl", hash = "sha256:69ecce486dd6cdad69937ba76779e893c224a670a9d947636c1d5cbd049e44d8"}, + {file = "huggingface_hub-0.24.3.tar.gz", hash = "sha256:bfdc05cc9b64a0e24e8614a44222698799183268f6b68be209aa2df70cff2cde"}, ] [package.dependencies] @@ -2184,22 +2325,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -2212,20 +2353,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "intel-openmp" -version = "2021.4.0" -description = "Intel OpenMP* Runtime Library" -optional = true -python-versions = "*" -files = [ - {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, -] - [[package]] name = "jaraco-classes" version = "3.4.0" @@ -2612,13 +2739,13 @@ source = ["Cython (>=3.0.10)"] [[package]] name = "lxml-html-clean" -version = "0.1.1" +version = "0.2.0" description = "HTML cleaner from lxml project" optional = true python-versions = "*" files = [ - {file = "lxml_html_clean-0.1.1-py3-none-any.whl", hash = "sha256:58c04176593c9caf72ec92e033d2f38859e918b3eff0cc0f8051ad27dc2ab8ef"}, - {file = "lxml_html_clean-0.1.1.tar.gz", hash = "sha256:8a644ed01dbbe132fabddb9467f077f6dad12a1d4f3a6a553e280f3815fa46df"}, + {file = "lxml_html_clean-0.2.0-py3-none-any.whl", hash = "sha256:80bdc730b288b8e68f0bf86b99f4bbef129c5ec59b694c6681422be4c1eeb3c5"}, + {file = "lxml_html_clean-0.2.0.tar.gz", hash = "sha256:47c323f39d95d4cbf4956da62929c89a79313074467efaa4821013c97bf95628"}, ] [package.dependencies] @@ -2943,13 +3070,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.29" +version = "9.5.30" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.29-py3-none-any.whl", hash = "sha256:afc1f508e2662ded95f0a35a329e8a5acd73ee88ca07ba73836eb6fcdae5d8b4"}, - {file = "mkdocs_material-9.5.29.tar.gz", hash = "sha256:3e977598ec15a4ddad5c4dfc9e08edab6023edb51e88f0729bd27be77e3d322a"}, + {file = "mkdocs_material-9.5.30-py3-none-any.whl", hash = "sha256:fc070689c5250a180e9b9d79d8491ef9a3a7acb240db0728728d6c31eeb131d4"}, + {file = "mkdocs_material-9.5.30.tar.gz", hash = "sha256:3fd417dd42d679e3ba08b9e2d72cd8b8af142cc4a3969676ad6b00993dd182ec"}, ] [package.dependencies] @@ -3037,24 +3164,6 @@ files = [ griffe = ">=0.37" mkdocstrings = ">=0.20" -[[package]] -name = "mkl" -version = "2021.4.0" -description = "Intel® oneAPI Math Kernel Library" -optional = true -python-versions = "*" -files = [ - {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, - {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, - {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, -] - -[package.dependencies] -intel-openmp = "==2021.*" -tbb = "==2021.*" - [[package]] name = "mongomock" version = "4.1.2" @@ -3475,12 +3584,13 @@ files = [ [[package]] name = "nvidia-cudnn-cu12" -version = "8.9.2.26" +version = "9.1.0.70" description = "cuDNN runtime libraries" optional = true python-versions = ">=3" files = [ - {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, ] [package.dependencies] @@ -3556,6 +3666,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_aarch64.whl", hash = "sha256:98103729cc5226e13ca319a10bbf9433bbbd44ef64fe72f45f067cacc14b8d27"}, {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, ] @@ -3573,13 +3684,13 @@ files = [ [[package]] name = "ollama" -version = "0.3.0" +version = "0.3.1" description = "The official Python client for Ollama." optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "ollama-0.3.0-py3-none-any.whl", hash = "sha256:cd7010c4e2a37d7f08f36cd35c4592b14f1ec0d1bf3df10342cd47963d81ad7a"}, - {file = "ollama-0.3.0.tar.gz", hash = "sha256:6ff493a2945ba76cdd6b7912a1cd79a45cfd9ba9120d14adeb63b2b5a7f353da"}, + {file = "ollama-0.3.1-py3-none-any.whl", hash = "sha256:db50034c73d6350349bdfba19c3f0d54a3cea73eb97b35f9d7419b2fc7206454"}, + {file = "ollama-0.3.1.tar.gz", hash = "sha256:032572fb494a4fba200c65013fe937a65382c846b5f358d9e8918ecbc9ac44b5"}, ] [package.dependencies] @@ -3587,13 +3698,13 @@ httpx = ">=0.27.0,<0.28.0" [[package]] name = "openai" -version = "1.37.0" +version = "1.37.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.37.0-py3-none-any.whl", hash = "sha256:a903245c0ecf622f2830024acdaa78683c70abb8e9d37a497b851670864c9f73"}, - {file = "openai-1.37.0.tar.gz", hash = "sha256:dc8197fc40ab9d431777b6620d962cc49f4544ffc3011f03ce0a805e6eb54adb"}, + {file = "openai-1.37.1-py3-none-any.whl", hash = "sha256:9a6adda0d6ae8fce02d235c5671c399cfa40d6a281b3628914c7ebf244888ee3"}, + {file = "openai-1.37.1.tar.gz", hash = "sha256:faf87206785a6b5d9e34555d6a3242482a6852bc802e453e2a891f68ee04ce55"}, ] [package.dependencies] @@ -3638,51 +3749,51 @@ kerberos = ["requests-kerberos"] [[package]] name = "opentelemetry-api" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Python API" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, - {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, + {file = "opentelemetry_api-1.26.0-py3-none-any.whl", hash = "sha256:7d7ea33adf2ceda2dd680b18b1677e4152000b37ca76e679da71ff103b943064"}, + {file = "opentelemetry_api-1.26.0.tar.gz", hash = "sha256:2bd639e4bed5b18486fef0b5a520aaffde5a18fc225e808a1ac4df363f43a1ce"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.1" +importlib-metadata = ">=6.0,<=8.0.0" [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Protobuf encoding" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.25.0-py3-none-any.whl", hash = "sha256:15637b7d580c2675f70246563363775b4e6de947871e01d0f4e3881d1848d693"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.25.0.tar.gz", hash = "sha256:c93f4e30da4eee02bacd1e004eb82ce4da143a2f8e15b987a9f603e0a85407d3"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.26.0-py3-none-any.whl", hash = "sha256:ee4d8f8891a1b9c372abf8d109409e5b81947cf66423fd998e56880057afbc71"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.26.0.tar.gz", hash = "sha256:bdbe50e2e22a1c71acaa0c8ba6efaadd58882e5a5978737a44a4c4b10d304c92"}, ] [package.dependencies] -opentelemetry-proto = "1.25.0" +opentelemetry-proto = "1.26.0" [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.25.0-py3-none-any.whl", hash = "sha256:2eca686ee11b27acd28198b3ea5e5863a53d1266b91cda47c839d95d5e0541a6"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.25.0.tar.gz", hash = "sha256:9f8723859e37c75183ea7afa73a3542f01d0fd274a5b97487ea24cb683d7d684"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.26.0-py3-none-any.whl", hash = "sha256:ee72a87c48ec977421b02f16c52ea8d884122470e0be573905237b540f4ee562"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.26.0.tar.gz", hash = "sha256:5801ebbcf7b527377883e6cbbdda35ee712dc55114fff1e93dfee210be56c908"}, ] [package.dependencies] deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.25.0" -opentelemetry-proto = "1.25.0" -opentelemetry-sdk = ">=1.25.0,<1.26.0" +opentelemetry-exporter-otlp-proto-common = "1.26.0" +opentelemetry-proto = "1.26.0" +opentelemetry-sdk = ">=1.26.0,<1.27.0" requests = ">=2.7,<3.0" [[package]] @@ -3719,13 +3830,13 @@ wrapt = ">=1.0.0,<2.0.0" [[package]] name = "opentelemetry-proto" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Python Proto" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_proto-1.25.0-py3-none-any.whl", hash = "sha256:f07e3341c78d835d9b86665903b199893befa5e98866f63d22b00d0b7ca4972f"}, - {file = "opentelemetry_proto-1.25.0.tar.gz", hash = "sha256:35b6ef9dc4a9f7853ecc5006738ad40443701e52c26099e197895cbda8b815a3"}, + {file = "opentelemetry_proto-1.26.0-py3-none-any.whl", hash = "sha256:6c4d7b4d4d9c88543bcf8c28ae3f8f0448a753dc291c18c5390444c90b76a725"}, + {file = "opentelemetry_proto-1.26.0.tar.gz", hash = "sha256:c5c18796c0cab3751fc3b98dee53855835e90c0422924b484432ac852d93dc1e"}, ] [package.dependencies] @@ -3733,33 +3844,34 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Python SDK" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, - {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, + {file = "opentelemetry_sdk-1.26.0-py3-none-any.whl", hash = "sha256:feb5056a84a88670c041ea0ded9921fca559efec03905dddeb3885525e0af897"}, + {file = "opentelemetry_sdk-1.26.0.tar.gz", hash = "sha256:c90d2868f8805619535c05562d699e2f4fb1f00dbd55a86dcefca4da6fa02f85"}, ] [package.dependencies] -opentelemetry-api = "1.25.0" -opentelemetry-semantic-conventions = "0.46b0" +opentelemetry-api = "1.26.0" +opentelemetry-semantic-conventions = "0.47b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.46b0" +version = "0.47b0" description = "OpenTelemetry Semantic Conventions" optional = true python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, - {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, + {file = "opentelemetry_semantic_conventions-0.47b0-py3-none-any.whl", hash = "sha256:4ff9d595b85a59c1c1413f02bba320ce7ea6bf9e2ead2b0913c4395c7bbc1063"}, + {file = "opentelemetry_semantic_conventions-0.47b0.tar.gz", hash = "sha256:a8d57999bbe3495ffd4d510de26a97dadc1dace53e0275001b2c1b2f67992a7e"}, ] [package.dependencies] -opentelemetry-api = "1.25.0" +deprecated = ">=1.2.6" +opentelemetry-api = "1.26.0" [[package]] name = "packaging" @@ -4020,18 +4132,18 @@ type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.45.0" +version = "1.45.1" description = "A high-level API to automate web browsers" optional = true python-versions = ">=3.8" files = [ - {file = "playwright-1.45.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:7d49aee5907d8e72060f04bc299cb6851c2dc44cb227540ade89d7aa529e907a"}, - {file = "playwright-1.45.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:210c9f848820f58b5b5ed48047748620b780ca3acc3e2b7560dafb2bfdd6d90a"}, - {file = "playwright-1.45.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:13b5398831f5499580e819ddc996633446a93bf88029e89451e51da188e16ae3"}, - {file = "playwright-1.45.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:0ba5a39f25fb9b9cf1bd48678f44536a29f6d83376329de2dee1567dac220afe"}, - {file = "playwright-1.45.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b09fa76614ba2926d45a4c0581f710c13652d5e32290ba6a1490fbafff7f0be8"}, - {file = "playwright-1.45.0-py3-none-win32.whl", hash = "sha256:97a7d53af89af54208b69c051046b462675fcf5b93f7fbfb7c0fa7f813424ee2"}, - {file = "playwright-1.45.0-py3-none-win_amd64.whl", hash = "sha256:701db496928429aec103739e48e3110806bd5cf49456cc95b89f28e1abda71da"}, + {file = "playwright-1.45.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:360607e37c00cdf97c74317f010e106ac4671aeaec6a192431dd71a30941da9d"}, + {file = "playwright-1.45.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20adc2abf164c5e8969f9066011b152e12c210549edec78cd05bd0e9cf4135b7"}, + {file = "playwright-1.45.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:5f047cdc6accf4c7084dfc7587a2a5ef790cddc44cbb111e471293c5a91119db"}, + {file = "playwright-1.45.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:f06f6659abe0abf263e5f6661d379fbf85c112745dd31d82332ceae914f58df7"}, + {file = "playwright-1.45.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87dc3b3d17e12c68830c29b7fdf5e93315221bbb4c6090e83e967e154e2c1828"}, + {file = "playwright-1.45.1-py3-none-win32.whl", hash = "sha256:2b8f517886ef1e2151982f6e7be84be3ef7d8135bdcf8ee705b4e4e99566e866"}, + {file = "playwright-1.45.1-py3-none-win_amd64.whl", hash = "sha256:0d236cf427784e77de352ba1b7d700693c5fe455b8e5f627f6d84ad5b84b5bf5"}, ] [package.dependencies] @@ -4085,13 +4197,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.7.1" +version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, - {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [package.dependencies] @@ -4101,6 +4213,26 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "primp" +version = "0.5.5" +description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" +optional = true +python-versions = ">=3.8" +files = [ + {file = "primp-0.5.5-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:cff9792e8422424528c23574b5364882d68134ee2743f4a2ae6a765746fb3028"}, + {file = "primp-0.5.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:78e13fc5d4d90d44a005dbd5dda116981828c803c86cf85816b3bb5363b045c8"}, + {file = "primp-0.5.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3714abfda79d3f5c90a5363db58994afbdbacc4b94fe14e9e5f8ab97e7b82577"}, + {file = "primp-0.5.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e54765900ee40eceb6bde43676d7e0b2e16ca1f77c0753981fe5e40afc0c2010"}, + {file = "primp-0.5.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:66c7eecc5a55225c42cfb99af857df04f994f3dd0d327c016d3af5414c1a2242"}, + {file = "primp-0.5.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df262271cc1a41f4bf80d68396e967a27d7d3d3de355a3d016f953130e7a20be"}, + {file = "primp-0.5.5-cp38-abi3-win_amd64.whl", hash = "sha256:8b424118d6bab6f9d4980d0f35d5ccc1213ab9f1042497c6ee11730f2f94a876"}, + {file = "primp-0.5.5.tar.gz", hash = "sha256:8623e8a25fd686785296b12175f4173250a08db1de9ee4063282e262b94bf3f2"}, +] + +[package.extras] +dev = ["pytest (>=8.1.1)"] + [[package]] name = "proto-plus" version = "1.24.0" @@ -4120,22 +4252,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.4" description = "" optional = true python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, + {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, + {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, + {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, + {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, + {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, + {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, + {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, + {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] [[package]] @@ -4495,13 +4627,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "10.8.1" +version = "10.9" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, - {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, + {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, + {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, ] [package.dependencies] @@ -4662,35 +4794,15 @@ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] image = ["Pillow (>=8.0.0)"] -[[package]] -name = "pyreqwest-impersonate" -version = "0.5.2" -description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" -optional = true -python-versions = ">=3.8" -files = [ - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ec8c9318190020bad3f12a62aedc5faaa92078c38cf48189e98cd692b82e7c28"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca7fc399a672558de1d50b5beb5a153c7002adbe332edd7a752f1d19c35d7f7f"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b453ab0a7f30a279151e88bd52449a01931307986d7c2a6a92a699d3ba58b66"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9c78ab908cc10a195ddbfc60c18b205237233f76b4f56c28ebc1afe80210335"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31db4e6e491868c227a252ef3a8fa8b7accc306e741934f74ad3e6fb096e334c"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3ce34743e3ce2656ba262a325103b96e1d4f301be5f3dd8cb21ee4eec4c6e1b7"}, - {file = "pyreqwest_impersonate-0.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:e72b39a64c12a35a1689af558d62c67f94d14310043e404a90550e39ddd4af7c"}, - {file = "pyreqwest_impersonate-0.5.2.tar.gz", hash = "sha256:50a57c4b139788606b311757ddf36efd82ea1c952decea808b4196220bd43803"}, -] - -[package.extras] -dev = ["pytest (>=8.1.1)"] - [[package]] name = "pyright" -version = "1.1.372" +version = "1.1.373" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.372-py3-none-any.whl", hash = "sha256:25b15fb8967740f0949fd35b963777187f0a0404c0bd753cc966ec139f3eaa0b"}, - {file = "pyright-1.1.372.tar.gz", hash = "sha256:a9f5e0daa955daaa17e3d1ef76d3623e75f8afd5e37b437d3ff84d5b38c15420"}, + {file = "pyright-1.1.373-py3-none-any.whl", hash = "sha256:b805413227f2c209f27b14b55da27fe5e9fb84129c9f1eb27708a5d12f6f000e"}, + {file = "pyright-1.1.373.tar.gz", hash = "sha256:f41bcfc8b9d1802b09921a394d6ae1ce19694957b628bc657629688daf8a83ff"}, ] [package.dependencies] @@ -4702,13 +4814,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "8.3.1" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, - {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -4894,6 +5006,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -5008,90 +5121,90 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -5459,13 +5572,13 @@ files = [ [[package]] name = "setuptools" -version = "71.1.0" +version = "72.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, - {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, ] [package.extras] @@ -5604,37 +5717,37 @@ files = [ [[package]] name = "snowflake-connector-python" -version = "3.11.0" +version = "3.12.0" description = "Snowflake Connector for Python" optional = true python-versions = ">=3.8" files = [ - {file = "snowflake_connector_python-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0be9e2e35c7cf98df4ee454f1a00b7d1ff541ce46582d9b9ec51928e1583683c"}, - {file = "snowflake_connector_python-3.11.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e01aa2f65bd7374a11a7d74c30d4a78938bbf60db512fc170bd25fc1b385566b"}, - {file = "snowflake_connector_python-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a284c275929f81c5b53160c0d0ee447ee20b63af0493c87f3dd39faf3178f59"}, - {file = "snowflake_connector_python-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:686a50bf1e7d2cf89db7319a29d08816ea57039fcf05ca3f3bf3f92dc25bed40"}, - {file = "snowflake_connector_python-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:eae346b87906db2095f1c830ba105b529a211ecd0c0b1e43d8775fc49e7e476c"}, - {file = "snowflake_connector_python-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:415992f074b51712770c3dbd7a6b5a95b5dd04ffe02fc51ac8446e193771436d"}, - {file = "snowflake_connector_python-3.11.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:e55eca3ff74fb33ea21455369e171ad61ef31eb916cbbbdab7ccb90cb98ad8d0"}, - {file = "snowflake_connector_python-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa48b1f2a124098745a33ee93e34d85a3dfb60fa3d2d7ec5efee4aa17bb05053"}, - {file = "snowflake_connector_python-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96b21a062fc7aacb49202c8502239c0728319a96834a9fca1b6666a51e515dcc"}, - {file = "snowflake_connector_python-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ae890352e9e09e2084fd13647a664a31343bfa58d9aa41770e9ec3b810f9bc2c"}, - {file = "snowflake_connector_python-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e8f5c376b2368082819126f566551e451d51c95cc2febac45377026d44a401b0"}, - {file = "snowflake_connector_python-3.11.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:56c29839cbdf4778b997a96dacb849c3b374b7818c60eefe87b67debc9672f59"}, - {file = "snowflake_connector_python-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c203a035e417a386d7b09e977a198588471a768336f781b0561d09ed0f495edc"}, - {file = "snowflake_connector_python-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e906f517d2e79cd19c04dddf3bba13a072755503516f6bcd55ae1122b6df7fdb"}, - {file = "snowflake_connector_python-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:3e5489b814f311425e3966c0434f686131e48886eb7e0a8606631695f3c4bd48"}, - {file = "snowflake_connector_python-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:507c70ccd87c37a813c6aab27fe97007fb96c5372a5a33cc4b9137acb0d921e1"}, - {file = "snowflake_connector_python-3.11.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f238a3cb4522d2943861f38cb0c9650c08c02e45a38d4eefa27f22ad95748fb4"}, - {file = "snowflake_connector_python-3.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f797eb2552950cf04fe07304da714f1d473f7a0c1548cfbce5614c4b0a66e441"}, - {file = "snowflake_connector_python-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a525c60fd5922098eab2425bc3f63bb3df0f07dd54e02580505a6208f908d32"}, - {file = "snowflake_connector_python-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b61dbd3581c043b338c99caff900a9cce187c83333bafdf1d57c8c126366b4a"}, - {file = "snowflake_connector_python-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13170b419a6c2b98e23c89a459e2576955e0bae4fd267e9f44fffad642aa3ecc"}, - {file = "snowflake_connector_python-3.11.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:18bc6fd9fd544d540b06d9e97e754d0053b5cb7e5d9266586b3df8f243ef97bc"}, - {file = "snowflake_connector_python-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd4120451e33a32fb8fa018c9cd3e56c370ab0702ffe93b4e68acdae92524c3c"}, - {file = "snowflake_connector_python-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26ed3b5537864ee9d72f313b18b80b76136b7838774ea5bc2b4f5e1df8e9b90"}, - {file = "snowflake_connector_python-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc6afb35826e958949edb2d464e0d35ec46ef41b65546a311a333f4d0a7d07a6"}, - {file = "snowflake_connector_python-3.11.0.tar.gz", hash = "sha256:3169c014a03e5f5855112605e393897a552e558953c69f25a02e33b1998864d0"}, + {file = "snowflake_connector_python-3.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:edf28df8be24845cfcec653b160d2b8c048d5cb0c85b051f4957f0b0aae1e493"}, + {file = "snowflake_connector_python-3.12.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:c2bbdbbb028d7d542815ed68b28200728aa6707b9354e3a447fdc8c7a34bcdce"}, + {file = "snowflake_connector_python-3.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92c9a19a23033df709e63baa6ccdf6eff65210143a8c9c67a0a24bba862034b"}, + {file = "snowflake_connector_python-3.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d33d845e4c68d33e73a9f64100b53342c18607ac25c4f2a27dbed2078078d12"}, + {file = "snowflake_connector_python-3.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c1d43bfaa885aab712f14f9ced232abe5023adfca7fbf7a7a0768a162523e9d6"}, + {file = "snowflake_connector_python-3.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6a0cc03fb44808f3ddc464ee272f141564c8daea14475e1df5c2a54c7acb2ddf"}, + {file = "snowflake_connector_python-3.12.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:564752d22accc43351b50f676b03aa9f2b441be2641e3cf9a7790faf54eff210"}, + {file = "snowflake_connector_python-3.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27d6a1a180832c7b551d38df1094a70fb79917f90c57893b9ce7e219362f6c1"}, + {file = "snowflake_connector_python-3.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60675fd83022daef40541d717d006695149c512b283e35741b61a4f48ba537e9"}, + {file = "snowflake_connector_python-3.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a567b937b0179d1e95a8ad7200943d286f38d0e76df90af10f747ed9149dd681"}, + {file = "snowflake_connector_python-3.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc333fcfc383a8cab8bd7e890a7c76703e26598925a05954c75d2c50bff06071"}, + {file = "snowflake_connector_python-3.12.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:3c06bfba4a329fd4ec3feba0ada7b31f86ed4e156a9766bced52c2814d001fd2"}, + {file = "snowflake_connector_python-3.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acf84b07dd2f22adfaa7d52ccd6be1722bd5a0e2b1a9b08681c3851bea05768f"}, + {file = "snowflake_connector_python-3.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:019b8a61e5af689451d502df2af8793fc6f20b5b0a3548fd8ad03aa8b62e7f2d"}, + {file = "snowflake_connector_python-3.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:45f9b9678694f10571c1f7ec7d0d741663ad0ff61a71ae53aa71be47faa19978"}, + {file = "snowflake_connector_python-3.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:21cbaef51fbed719de01155079df3d004cee963d3723c1ebdb8980923f893e04"}, + {file = "snowflake_connector_python-3.12.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:c86d4a7d49f42ea0bb34218cb49c401ba995892abcfb509ea749cd0a74a8b28a"}, + {file = "snowflake_connector_python-3.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aa34aec0f96d7fc7271e38c68ee0d58529875d05e084afb4fc8f09b694643c4"}, + {file = "snowflake_connector_python-3.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2f621030b26a220711c64518e00059736b79c1da53afa6a8ce68b31c1941014"}, + {file = "snowflake_connector_python-3.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:368e46f1d079056e028bfe8f7171fabef62eb00bcf590df294220b7a5be5d56c"}, + {file = "snowflake_connector_python-3.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2735e16fffded0900f7484030613b79699afc1ed4e5cff086bd139a0ce965594"}, + {file = "snowflake_connector_python-3.12.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:c06a8e2e12284b4a4d462d0073fb4983e90ad2d6a2382926f9e3409f06c81d0b"}, + {file = "snowflake_connector_python-3.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:880e6e95171cd7374a86da14132fdfc4b622665f134561f4d43e3f35bdacf67d"}, + {file = "snowflake_connector_python-3.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e245b84c164433454ce49d78e6bcf5c2e62e25657358bf34ab533166e588f80"}, + {file = "snowflake_connector_python-3.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:85a5565b8813d164f33f32a825a70443008fe009aae050307f128a1ca892f9ed"}, + {file = "snowflake_connector_python-3.12.0.tar.gz", hash = "sha256:320e0b6f8cd8556e19c8b87249c931700238b2958313afc7a33108d67da87d82"}, ] [package.dependencies] @@ -5659,7 +5772,7 @@ urllib3 = {version = ">=1.21.1,<2.0.0", markers = "python_version < \"3.10\""} [package.extras] development = ["Cython", "coverage", "more-itertools", "numpy (<1.27.0)", "pendulum (!=2.1.1)", "pexpect", "pytest (<7.5.0)", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist", "pytzdata"] pandas = ["pandas (>=1.0.0,<3.0.0)", "pyarrow"] -secure-local-storage = ["keyring (>=23.1.0,<25.0.0)"] +secure-local-storage = ["keyring (>=23.1.0,<26.0.0)"] [[package]] name = "snowflake-sqlalchemy" @@ -5816,19 +5929,6 @@ mpmath = ">=1.1.0,<1.4" [package.extras] dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] -[[package]] -name = "tbb" -version = "2021.13.0" -description = "Intel® oneAPI Threading Building Blocks (oneTBB)" -optional = true -python-versions = "*" -files = [ - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, - {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, - {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, -] - [[package]] name = "tenacity" version = "8.5.0" @@ -6024,6 +6124,17 @@ dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = true +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -6048,44 +6159,43 @@ files = [ [[package]] name = "torch" -version = "2.3.1" +version = "2.4.0" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, - {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, - {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, - {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, - {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, - {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, - {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, - {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, - {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, - {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, - {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, - {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, - {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, - {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, - {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, - {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, - {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, - {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, - {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, - {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, + {file = "torch-2.4.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:4ed94583e244af51d6a8d28701ca5a9e02d1219e782f5a01dd401f90af17d8ac"}, + {file = "torch-2.4.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c4ca297b7bd58b506bfd6e78ffd14eb97c0e7797dcd7965df62f50bb575d8954"}, + {file = "torch-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2497cbc7b3c951d69b276ca51fe01c2865db67040ac67f5fc20b03e41d16ea4a"}, + {file = "torch-2.4.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:685418ab93730efbee71528821ff54005596970dd497bf03c89204fb7e3f71de"}, + {file = "torch-2.4.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e743adadd8c8152bb8373543964551a7cb7cc20ba898dc8f9c0cdbe47c283de0"}, + {file = "torch-2.4.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:7334325c0292cbd5c2eac085f449bf57d3690932eac37027e193ba775703c9e6"}, + {file = "torch-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:97730014da4c57ffacb3c09298c6ce05400606e890bd7a05008d13dd086e46b1"}, + {file = "torch-2.4.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:f169b4ea6dc93b3a33319611fcc47dc1406e4dd539844dcbd2dec4c1b96e166d"}, + {file = "torch-2.4.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:997084a0f9784d2a89095a6dc67c7925e21bf25dea0b3d069b41195016ccfcbb"}, + {file = "torch-2.4.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bc3988e8b36d1e8b998d143255d9408d8c75da4ab6dd0dcfd23b623dfb0f0f57"}, + {file = "torch-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3374128bbf7e62cdaed6c237bfd39809fbcfaa576bee91e904706840c3f2195c"}, + {file = "torch-2.4.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:91aaf00bfe1ffa44dc5b52809d9a95129fca10212eca3ac26420eb11727c6288"}, + {file = "torch-2.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cc30457ea5489c62747d3306438af00c606b509d78822a88f804202ba63111ed"}, + {file = "torch-2.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a046491aaf96d1215e65e1fa85911ef2ded6d49ea34c8df4d0638879f2402eef"}, + {file = "torch-2.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:688eec9240f3ce775f22e1e1a5ab9894f3d5fe60f3f586deb7dbd23a46a83916"}, + {file = "torch-2.4.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:3af4de2a618fb065e78404c4ba27a818a7b7957eaeff28c6c66ce7fb504b68b8"}, + {file = "torch-2.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:618808d3f610d5f180e47a697d4ec90b810953bb1e020f424b2ac7fb0884b545"}, + {file = "torch-2.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ed765d232d23566052ba83632ec73a4fccde00b4c94ad45d63b471b09d63b7a7"}, + {file = "torch-2.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2feb98ac470109472fb10dfef38622a7ee08482a16c357863ebc7bc7db7c8f7"}, + {file = "torch-2.4.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8940fc8b97a4c61fdb5d46a368f21f4a3a562a17879e932eb51a5ec62310cb31"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" -mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} @@ -6093,12 +6203,12 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "3.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} typing-extensions = ">=4.8.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] -optree = ["optree (>=0.9.1)"] +optree = ["optree (>=0.11.0)"] [[package]] name = "tqdm" @@ -6122,19 +6232,19 @@ telegram = ["requests"] [[package]] name = "trafilatura" -version = "1.11.0" +version = "1.12.0" description = "Python package and command-line tool designed to gather text on the Web, includes all necessary discovery and text processing components to perform web crawling, downloads, scraping, and extraction of main texts, metadata and comments." optional = true python-versions = ">=3.6" files = [ - {file = "trafilatura-1.11.0-py3-none-any.whl", hash = "sha256:20f016be873a2cf3e02b9798f9537d09808559fcc667d42e1c019560ca45dce7"}, - {file = "trafilatura-1.11.0.tar.gz", hash = "sha256:9334ca101c40b2904af5afcee790f0374fabca3ac388811720be65cc768787a2"}, + {file = "trafilatura-1.12.0-py3-none-any.whl", hash = "sha256:544c442184db4e0a85c4dcede8b20f0d6d9202477a12faeddeb8c7c5fc5e13ca"}, + {file = "trafilatura-1.12.0.tar.gz", hash = "sha256:17d2074ecfe2c562bf0863de7e839fad14cc66d5f98090741eaa918eabfbf9d5"}, ] [package.dependencies] certifi = "*" charset-normalizer = {version = ">=3.2.0", markers = "python_version >= \"3.7\""} -courlan = ">=1.1.0" +courlan = ">=1.2.0" htmldate = ">=1.8.1" justext = ">=3.0.1" lxml = {version = ">=5.2.2", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} @@ -6146,19 +6256,19 @@ gui = ["Gooey (>=1.0.1)"] [[package]] name = "transformers" -version = "4.41.2" +version = "4.43.3" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, - {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, + {file = "transformers-4.43.3-py3-none-any.whl", hash = "sha256:6552beada5d826c25ff9b79139d237ab9050c6ea96b73d7fd2f8a8ba23ee76a4"}, + {file = "transformers-4.43.3.tar.gz", hash = "sha256:820c5b192bb1bf47250802901a8f0bf581e06b8fded89179d4ef08a1e903ee1c"}, ] [package.dependencies] accelerate = {version = ">=0.21.0", optional = true, markers = "extra == \"torch\""} filelock = "*" -huggingface-hub = ">=0.23.0,<1.0" +huggingface-hub = ">=0.23.2,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" @@ -6172,14 +6282,15 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -6190,41 +6301,46 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.4.4)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -timm = ["timm"] +timm = ["timm (<=0.9.16)"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.3.1" +version = "3.0.0" description = "A language and compiler for custom Deep Learning operations" optional = true python-versions = "*" files = [ - {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, - {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, - {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, - {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, - {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, - {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, + {file = "triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a"}, + {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, + {file = "triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb"}, + {file = "triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9"}, + {file = "triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609"}, + {file = "triton-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b052da883351fdf6be3d93cedae6db3b8e3988d3b09ed221bccecfa9612230"}, + {file = "triton-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd34f19a8582af96e6291d4afce25dac08cb2a5d218c599163761e8e0827208e"}, + {file = "triton-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d5e10de8c011adeb7c878c6ce0dd6073b14367749e34467f1cff2bde1b78253"}, + {file = "triton-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8903767951bf86ec960b4fe4e21bc970055afc65e9d57e916d79ae3c93665e3"}, + {file = "triton-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41004fb1ae9a53fcb3e970745feb87f0e3c94c6ce1ba86e95fa3b8537894bef7"}, ] [package.dependencies] @@ -6232,8 +6348,8 @@ filelock = "*" [package.extras] build = ["cmake (>=3.20)", "lit"] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] -tutorials = ["matplotlib", "pandas", "tabulate", "torch"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "twine" @@ -6317,21 +6433,21 @@ files = [ [[package]] name = "typos" -version = "1.23.3" +version = "1.23.5" description = "Source Code Spelling Correction" optional = false python-versions = ">=3.7" files = [ - {file = "typos-1.23.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:64eb857fd5d9fbceddf84f14dcb102355e95f79e61639c96b76a81f6526fe589"}, - {file = "typos-1.23.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3413933c235362f3a9dc99ea02acfbe096ac451f0828cf8e0617e9ea859add31"}, - {file = "typos-1.23.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5633d7baccc9ee5f3c0a2675c3eed6369983845994d6582f70bb2dd30b55bd64"}, - {file = "typos-1.23.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07cb89e916ed3114ac5980e4df4cca936d4305f13944fa4821afdf319b24b1e2"}, - {file = "typos-1.23.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f3887869fe4a16f203a749b97d32dac763d3b8bf2a71728d20726e8f1aee33e"}, - {file = "typos-1.23.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eb2bf8c347e82687fa97f5208ded28377fcf4c0cdd685f5323b22cb756bd70d3"}, - {file = "typos-1.23.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4286ca8b7cda18e83e7e8be6aa2b37306b75138a7b0cbf3384f983a5772c0cdb"}, - {file = "typos-1.23.3-py3-none-win32.whl", hash = "sha256:a0bd7a04f476126cb7a2e4d5c11c1083d1d68657e3349817cdb757ce110cf265"}, - {file = "typos-1.23.3-py3-none-win_amd64.whl", hash = "sha256:372139f46e57f18943e2b83d12dc9f4533a93618f0aac8d59684479628e5e576"}, - {file = "typos-1.23.3.tar.gz", hash = "sha256:2bcbfc32660170b2b4797a5613c4ce269fba2eef30d47d0a08ea0be57ddd3b99"}, + {file = "typos-1.23.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f605a44e94b1ddf68b9fc3988e82bbc5f795de51a9928f3d9aa43f02e64cb123"}, + {file = "typos-1.23.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:03355aca30babaedfa2ebaf8b79da0b911f015e4449b184777a9d70ee6c754ad"}, + {file = "typos-1.23.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485ffaa9a910bf01a3a6502e1668f945255f314dd7eb6cd66a26df82e0d66d8b"}, + {file = "typos-1.23.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70e3abe5af98707a4ea307d98d1b09b20664c00acb5fb78761349700d8581ee8"}, + {file = "typos-1.23.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064ece60188de95e71a5420cfc2e1fde3ea650186ddf214145befcbe7bfd0086"}, + {file = "typos-1.23.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0cfcf37df9ecce20277a360e56fe39b1e847298cb6aaafaaed10e842c815e43d"}, + {file = "typos-1.23.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6aa53d4e5cbc77fb052e806f79d485f0b468d3054754163feb65ad4893d6e2ac"}, + {file = "typos-1.23.5-py3-none-win32.whl", hash = "sha256:ea7892fb35e9dee45716ca12df68453c1d6dc3b0d42ec1d4a7859b1d2f3a252e"}, + {file = "typos-1.23.5-py3-none-win_amd64.whl", hash = "sha256:221bd0e1945fc0ade5eaf713e8dcbbd6c2331e79a68074c4b991f054fa5024f4"}, + {file = "typos-1.23.5.tar.gz", hash = "sha256:afc455cf5d90f4f350af3c73b3ccbcf22f1c4aa10308b89eb3ce263d350e4ad9"}, ] [[package]] @@ -6389,6 +6505,17 @@ brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotl secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "uuid6" +version = "2024.1.12" +description = "New time-based UUID formats which are suited for use as a database key" +optional = true +python-versions = ">=3.8" +files = [ + {file = "uuid6-2024.1.12-py3-none-any.whl", hash = "sha256:8150093c8d05a331bc0535bc5ef6cf57ac6eceb2404fd319bc10caee2e02c065"}, + {file = "uuid6-2024.1.12.tar.gz", hash = "sha256:ed0afb3a973057575f9883201baefe402787ca5e11e1d24e377190f0c43f1993"}, +] + [[package]] name = "virtualenv" version = "20.26.3" @@ -6778,7 +6905,7 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["accelerate", "anthropic", "beautifulsoup4", "boto3", "cohere", "diffusers", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "sentencepiece", "snowflake-sqlalchemy", "sqlalchemy", "torch", "trafilatura", "transformers", "voyageai"] +all = ["accelerate", "anthropic", "astrapy", "beautifulsoup4", "boto3", "cohere", "diffusers", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "sentencepiece", "snowflake-sqlalchemy", "sqlalchemy", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6808,6 +6935,7 @@ drivers-sql = ["sqlalchemy"] drivers-sql-amazon-redshift = ["boto3"] drivers-sql-snowflake = ["snowflake-sqlalchemy", "sqlalchemy"] drivers-vector-amazon-opensearch = ["boto3", "opensearch-py"] +drivers-vector-astra-db = ["astrapy"] drivers-vector-marqo = ["marqo"] drivers-vector-mongodb = ["pymongo"] drivers-vector-opensearch = ["opensearch-py"] @@ -6828,4 +6956,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "0f9ce9192af9125e85a27ba269786ee49254e2f139965d37aa2599e8ae8e2dca" +content-hash = "7ce0070dd09732677f5647c616acfd7de130dfda269c9fdd47f375883dda60c9" diff --git a/pyproject.toml b/pyproject.toml index 764ba4f25..74c16fdc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,7 @@ markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} qdrant-client = { version = "^1.10.1", optional = true } +astrapy = { version = "^1.3", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.3.0", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} @@ -96,6 +97,7 @@ drivers-vector-opensearch = ["opensearch-py"] drivers-vector-amazon-opensearch = ["opensearch-py", "boto3"] drivers-vector-pgvector = ["sqlalchemy", "pgvector", "psycopg2-binary"] drivers-vector-qdrant = ["qdrant-client"] +drivers-vector-astra-db = ["astrapy"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] @@ -166,6 +168,7 @@ all = [ "marqo", "pinecone-client", "qdrant-client", + "astrapy", "pymongo", "redis", "opensearch-py", diff --git a/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py b/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py new file mode 100644 index 000000000..94dbb8570 --- /dev/null +++ b/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py @@ -0,0 +1,149 @@ +from __future__ import annotations + +import json +import math +import os + +import pytest + +from griptape.drivers import AstraDbVectorStoreDriver, BaseVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + +TEST_COLLECTION_NAME = "gt_int_test" +TEST_COLLECTION_NAME_METRIC = "gt_int_test_dot" + + +class TestAstraDbVectorStoreDriver: + @pytest.fixture() + def embedding_driver(self): + def circle_fraction_string_to_vector(chunk: str) -> list[float]: + try: + fraction = float(json.loads(chunk)) + angle = fraction * math.pi * 2 + return [math.cos(angle), math.sin(angle)] + except Exception: + return [0.0, 0.0] + + return MockEmbeddingDriver(mock_output=circle_fraction_string_to_vector) + + @pytest.fixture() + def vector_store_collection(self): + import astrapy + + database = astrapy.DataAPIClient().get_database( + api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + namespace=os.environ.get("ASTRA_DB_KEYSPACE"), + ) + collection = database.create_collection( + name=TEST_COLLECTION_NAME, + dimension=2, + metric="cosine", + ) + yield collection + collection.drop() + + @pytest.fixture() + def vector_store_driver(self, embedding_driver, vector_store_collection): + driver = AstraDbVectorStoreDriver( + api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + collection_name=vector_store_collection.name, + astra_db_namespace=os.environ.get("ASTRA_DB_KEYSPACE"), + embedding_driver=embedding_driver, + ) + return driver + + def test_vector_crud(self, vector_store_driver, vector_store_collection, embedding_driver): + """Test basic vector CRUD, various call patterns.""" + vector_store_collection.delete_many({}) + + vec1 = embedding_driver.embed_string("0.012") + id1 = vector_store_driver.upsert_vector(vec1, vector_id="v1") + + vec2 = embedding_driver.embed_string("0.024") + id2 = vector_store_driver.upsert_vector(vec2, vector_id="v2", namespace="ns") + + vec3 = embedding_driver.embed_string("0.036") + id3 = vector_store_driver.upsert_vector(vec3) + + vec4 = embedding_driver.embed_string("0.048") + id4 = vector_store_driver.upsert_vector(vec4, vector_id="v4", meta={"i": 4}, namespace="ns") + + assert id1 == "v1" + assert id2 == "v2" + assert isinstance(id3, str) + assert id4 == "v4" + + # retrieve by id + e1 = vector_store_driver.load_entry(id1) + e1_n = vector_store_driver.load_entry(id1, namespace="false_ns") + e2 = vector_store_driver.load_entry(id2, namespace="ns") + e3 = vector_store_driver.load_entry(id3) + e4 = vector_store_driver.load_entry(id4) + assert e1 == BaseVectorStoreDriver.Entry( + id=id1, + vector=vec1, + ) + assert e1_n is None + assert e2 == BaseVectorStoreDriver.Entry( + id=id2, + vector=vec2, + namespace="ns", + ) + assert e3 == BaseVectorStoreDriver.Entry( + id=id3, + vector=vec3, + ) + assert e4 == BaseVectorStoreDriver.Entry( + id=id4, + vector=vec4, + meta={"i": 4}, + namespace="ns", + ) + + # retrieve multiple entries + es_ns = vector_store_driver.load_entries(namespace="ns") + es_all = vector_store_driver.load_entries() + assert len(es_ns) == 2 + assert any(e == e2 for e in es_ns) + assert any(e == e4 for e in es_ns) + assert len(es_all) == 4 + assert any(e == e1 for e in es_all) + assert any(e == e2 for e in es_all) + assert any(e == e3 for e in es_all) + assert any(e == e4 for e in es_all) + + # delete and recheck + vector_store_driver.delete_vector("fake_id") + vector_store_driver.delete_vector(id4) + es_ns_postdel = vector_store_driver.load_entries(namespace="ns") + assert len(es_ns_postdel) == 1 + assert es_ns_postdel[0] == e2 + + # queries + query_2 = vector_store_driver.query("0.060", count=2, include_vectors=True) + query_all = vector_store_driver.query("0.060", include_vectors=True) + query_2_novectors = vector_store_driver.query("0.060", count=2) + query_all_ns = vector_store_driver.query("0.060", include_vectors=True, namespace="ns") + # + d_query_2 = [self._descore_entry(ent) for ent in query_2] + assert d_query_2 == [e3, e2] + + d_query_all = [self._descore_entry(ent) for ent in query_all] + assert d_query_all == [e3, e2, e1] + d_query_2_novectors = [self._descore_entry(ent) for ent in query_2_novectors] + assert d_query_2_novectors == [ + BaseVectorStoreDriver.Entry( + id=id3, + ), + BaseVectorStoreDriver.Entry( + id=id2, + namespace="ns", + ), + ] + d_query_all_ns = [self._descore_entry(ent) for ent in query_all_ns] + assert d_query_all_ns == [e2] + + def _descore_entry(self, entry: BaseVectorStoreDriver.Entry) -> BaseVectorStoreDriver.Entry: + return BaseVectorStoreDriver.Entry.from_dict({k: v for k, v in entry.__dict__.items() if k != "score"}) diff --git a/tests/mocks/mock_embedding_driver.py b/tests/mocks/mock_embedding_driver.py index 46d9bf515..6fe415195 100644 --- a/tests/mocks/mock_embedding_driver.py +++ b/tests/mocks/mock_embedding_driver.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import Callable + from attrs import define, field from griptape.drivers import BaseEmbeddingDriver @@ -12,6 +14,7 @@ class MockEmbeddingDriver(BaseEmbeddingDriver): dimensions: int = field(default=42, kw_only=True) max_attempts: int = field(default=1, kw_only=True) tokenizer: MockTokenizer = field(factory=lambda: MockTokenizer(model="foo bar"), kw_only=True) + mock_output: Callable[[str], list[float]] = field(default=lambda chunk: [0, 1], kw_only=True) def try_embed_chunk(self, chunk: str) -> list[float]: - return [0, 1] + return self.mock_output(chunk) diff --git a/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py b/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py new file mode 100644 index 000000000..16e6530b3 --- /dev/null +++ b/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py @@ -0,0 +1,139 @@ +from unittest.mock import MagicMock + +import pytest + +from griptape.drivers import AstraDbVectorStoreDriver, BaseVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + + +class TestAstraDbVectorStoreDriver: + @pytest.fixture(autouse=True) + def base_mock_collection(self, mocker): + mock_get_collection = mocker.patch( + "astrapy.DataAPIClient" + ).return_value.get_database.return_value.get_collection + return mock_get_collection + + @pytest.fixture() + def mock_collection(self, base_mock_collection, one_document): + """Augmented with specific response to certain method calls.""" + # insert_one with server-side provided ID + mock_insert_one_return_value = MagicMock() + mock_insert_one_return_value.inserted_id = "insert_one_server_side_id" + base_mock_collection.return_value.insert_one.return_value = mock_insert_one_return_value + # find_one + base_mock_collection.return_value.find_one.return_value = one_document + # find + base_mock_collection.return_value.find.return_value = [one_document] + # + return base_mock_collection + + @pytest.fixture() + def mock_collection_findnothing(self, base_mock_collection): + """`find` and `find_one` return nothing.""" + base_mock_collection.return_value.find_one.return_value = None + base_mock_collection.return_value.find.return_value = [] + return base_mock_collection + + @pytest.fixture() + def driver(self, mock_collection): + return AstraDbVectorStoreDriver( + api_endpoint="ep", + token="to", + collection_name="co", + astra_db_namespace="ns", + embedding_driver=MockEmbeddingDriver(dimensions=3), + ) + + @pytest.fixture() + def one_document( + self, + ): + return { + "_id": "doc_id", + "$vector": [3.0, 2.0, 1.0], + "meta": "doc_meta", + "namespace": "doc_namespace", + "$similarity": 10, + } + + @pytest.fixture() + def one_entry(self, one_document): + return BaseVectorStoreDriver.Entry( + id=one_document["_id"], + vector=one_document["$vector"], + meta=one_document["meta"], + namespace=one_document["namespace"], + ) + + @pytest.fixture() + def one_query_entry(self, one_document): + return BaseVectorStoreDriver.Entry( + id=one_document["_id"], + vector=one_document["$vector"], + meta=one_document["meta"], + namespace=one_document["namespace"], + score=one_document["$similarity"], + ) + + def test_delete_vector(self, driver, mock_collection): + driver.delete_vector("deletee_id") + mock_collection.return_value.delete_one.assert_called_once() + + def test_upsert_vector_with_id(self, driver, mock_collection): + upserted_id = driver.upsert_vector([1.0, 2.0, 3.0], vector_id="some_vector_id", namespace="some_namespace") + assert upserted_id == "some_vector_id" + mock_collection.return_value.find_one_and_replace.assert_called_once() + + def test_upsert_vector_no_id(self, driver, mock_collection): + upserted_id = driver.upsert_vector([1.0, 2.0, 3.0], namespace="some_namespace") + assert upserted_id == "insert_one_server_side_id" + mock_collection.return_value.insert_one.assert_called_once() + + def test_load_entry(self, driver, mock_collection, one_entry): + entry = driver.load_entry("vector_id", namespace="some_namespace") + assert entry == one_entry + mock_collection.return_value.find_one.assert_called_once_with( + filter={"_id": "vector_id", "namespace": "some_namespace"}, + projection={"*": 1}, + ) + + def test_load_entry_empty(self, driver, mock_collection_findnothing): + entry = driver.load_entry("vector_id", namespace="some_namespace") + assert entry is None + mock_collection_findnothing.return_value.find_one.assert_called_once_with( + filter={"_id": "vector_id", "namespace": "some_namespace"}, + projection={"*": 1}, + ) + + def test_load_entries(self, driver, mock_collection, one_entry): + entries = driver.load_entries(namespace="some_namespace") + assert entries == [one_entry] + mock_collection.return_value.find.assert_called_once_with( + filter={"namespace": "some_namespace"}, + projection={"*": 1}, + ) + + def test_query_allparams(self, driver, mock_collection, one_query_entry): + entries1 = driver.query("some query", count=999, namespace="some_namespace", include_vectors=True) + assert entries1 == [one_query_entry] + query_vector = driver.embedding_driver.embed_string("some query") + mock_collection.return_value.find.assert_called_once_with( + filter={"namespace": "some_namespace"}, + sort={"$vector": query_vector}, + limit=999, + projection={"*": 1}, + include_similarity=True, + ) + + def test_query_minparams(self, driver, mock_collection, one_query_entry): + entries0 = driver.query("some query") + assert entries0 == [one_query_entry] + query_vector = driver.embedding_driver.embed_string("some query") + mock_collection.return_value.find.assert_called_once_with( + filter={}, + sort={"$vector": query_vector}, + limit=BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, + projection=None, + include_similarity=True, + ) From 0fde00155cfaf607c99126120bd096e3b64a9da0 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 2 Aug 2024 08:31:05 -0700 Subject: [PATCH 198/238] Add additional param support to WebSearch (#1015) --- CHANGELOG.md | 5 +++ .../official-tools/web-search.md | 33 ++++++++++++++++++ .../duck_duck_go_web_search_driver.py | 4 ++- .../web_search/google_web_search_driver.py | 26 +++++++------- griptape/mixins/activity_mixin.py | 32 ++++++++++------- griptape/tools/base_tool.py | 34 ++++++++++++------- griptape/tools/web_search/tool.py | 10 +++--- .../test_amazon_bedrock_prompt_driver.py | 5 +++ .../prompt/test_anthropic_prompt_driver.py | 5 +++ .../prompt/test_ollama_prompt_driver.py | 5 +++ .../prompt/test_openai_chat_prompt_driver.py | 5 +++ tests/unit/mixins/test_activity_mixin.py | 34 +++++++++++++++---- tests/unit/tools/test_web_search.py | 8 +++++ 13 files changed, 155 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efe70904d..94fcf0abd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `AstraDbVectorStoreDriver` to support DataStax Astra DB as a vector store. +- Ability to set custom schema properties on Tool Activities via `extra_schema_properties`. ## [0.29.0] - 2024-07-30 @@ -30,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `StableDiffusion3ImageGenerationPipelineDriver` for local text-to-image generation using a Stable Diffusion 3 pipeline. - `StableDiffusion3Img2ImgImageGenerationPipelineDriver` for local image-to-image generation using a Stable Diffusion 3 pipeline. - `StableDiffusion3ControlNetImageGenerationPipelineDriver` for local ControlNet image generation using a Stable Diffusion 3 pipeline. +- Optional `params` field to `WebSearch`'s `search` schema that the LLM can be steered into using. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. @@ -49,6 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Renamed `drivers-vector-postgresql` extra to `drivers-vector-pgvector`. - **BREAKING**: Update `marqo` dependency to `^3.7.0`. - **BREAKING**: Removed `drivers-sql-postgresql` extra. Use `drivers-sql` extra and install necessary drivers (i.e. `psycopg2`) separately. +- **BREAKING**: `api_key` and `search_id` are now required fields in `GoogleWebSearchDriver`. +- **BREAKING**: `web_search_driver` is now required fields in the `WebSearch` Tool. +- `GoogleWebSearchDriver` and `DuckDuckGoWebSearchDriver` now use `kwargs` passed to the `run` method. - Removed unnecessary `sqlalchemy-redshift` dependency in `drivers-sql-amazon-redshift` extra. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search.md index b30c76038..2e7299dd5 100644 --- a/docs/griptape-tools/official-tools/web-search.md +++ b/docs/griptape-tools/official-tools/web-search.md @@ -110,3 +110,36 @@ agent.run("Tell me how photosynthesis works") in the atmosphere and forms the basis of the food chain. ``` + +Extra schema properties can be added to the Tool to allow for more customization if the Driver supports it. +In this example, we add a `sort` property to the `search` Activity which will be added as a [Google custom search query parameter](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list). + +```python +import os +import schema +from griptape.structures import Agent +from griptape.drivers import GoogleWebSearchDriver +from griptape.tools import WebSearch + + +agent = Agent( + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + extra_schema_properties={ + "search": { + schema.Literal( + "sort", + description="Date range to search within. Format: date:r:YYYYMMDD:YYYYMMDD", + ): str + } + }, + ) + ], +) + +agent.run("Search for articles about the history of the internet from 1990 to 2000") +``` diff --git a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py index e701e8e0c..b67e81f35 100644 --- a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py +++ b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py @@ -19,7 +19,9 @@ class DuckDuckGoWebSearchDriver(BaseWebSearchDriver): def search(self, query: str, **kwargs) -> ListArtifact: try: - results = self.client.text(query, region=f"{self.language}-{self.country}", max_results=self.results_count) + results = self.client.text( + query, region=f"{self.language}-{self.country}", max_results=self.results_count, **kwargs + ) return ListArtifact( [ TextArtifact( diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py index 26ac57342..b5ba01cb6 100644 --- a/griptape/drivers/web_search/google_web_search_driver.py +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -11,24 +11,24 @@ @define class GoogleWebSearchDriver(BaseWebSearchDriver): - api_key: str = field(default=None, kw_only=True) - search_id: str = field(default=None, kw_only=True) + api_key: str = field(kw_only=True) + search_id: str = field(kw_only=True) def search(self, query: str, **kwargs) -> ListArtifact: return ListArtifact([TextArtifact(json.dumps(result)) for result in self._search_google(query, **kwargs)]) def _search_google(self, query: str, **kwargs) -> list[dict]: - url = ( - f"https://www.googleapis.com/customsearch/v1?" - f"key={self.api_key}&" - f"cx={self.search_id}&" - f"q={query}&" - f"start=0&" - f"lr=lang_{self.language}&" - f"num={self.results_count}&" - f"gl={self.country}" - ) - response = requests.get(url) + query_params = { + "key": self.api_key, + "cx": self.search_id, + "q": query, + "start": 0, + "lr": f"lang_{self.language}", + "num": self.results_count, + "gl": self.country, + **kwargs, + } + response = requests.get("https://www.googleapis.com/customsearch/v1", params=query_params) if response.status_code == 200: data = response.json() diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 2caee49e4..b137fe44e 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -1,18 +1,27 @@ from __future__ import annotations import inspect +from copy import deepcopy from typing import Callable, Optional -import schema from attrs import Attribute, define, field from jinja2 import Template -from schema import Literal, Schema +from schema import Schema @define(slots=False) class ActivityMixin: + """Provides Tool Activity management functionality to Tools. + + Attributes: + allowlist: List of Tool Activities to include in the Tool schema. + denylist: List of Tool Activities to remove from the Tool schema. + extra_schema_properties: Mapping of Activity name and extra properties to include in the activity's schema. + """ + allowlist: Optional[list[str]] = field(default=None, kw_only=True) denylist: Optional[list[str]] = field(default=None, kw_only=True) + extra_schema_properties: Optional[dict[str, dict]] = field(default=None, kw_only=True) @allowlist.validator # pyright: ignore[reportAttributeAccessIssue] def validate_allowlist(self, _: Attribute, allowlist: Optional[list[str]]) -> None: @@ -80,20 +89,17 @@ def activity_description(self, activity: Callable) -> str: def activity_schema(self, activity: Callable) -> Optional[Schema]: if activity is None or not getattr(activity, "is_activity", False): raise Exception("This method is not an activity.") - elif getattr(activity, "config")["schema"]: - full_schema = { - "values": getattr(activity, "config")["schema"].schema if getattr(activity, "config")["schema"] else {}, - } + elif getattr(activity, "config")["schema"] is not None: + # Need to deepcopy to avoid modifying the original schema + config_schema = deepcopy(getattr(activity, "config")["schema"]) + activity_name = self.activity_name(activity) - return Schema(full_schema) - else: - return None + if self.extra_schema_properties is not None and activity_name in self.extra_schema_properties: + config_schema.schema.update(self.extra_schema_properties[activity_name]) - def activity_to_input(self, activity: Callable) -> dict: - if self.activity_schema(activity): - return {Literal("input"): {"values": getattr(activity, "config")["schema"]}} + return Schema({"values": config_schema}) else: - return {schema.Optional("input"): {}} + return None def _validate_tool_activity(self, activity_name: str) -> None: tool = self.__class__ diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index bfb754bc0..7c6785649 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -7,8 +7,9 @@ import subprocess import sys from abc import ABC -from typing import TYPE_CHECKING, Callable, Optional +from typing import TYPE_CHECKING, Any, Callable, Optional +import schema import yaml from attrs import Attribute, Factory, define, field from schema import Literal, Or, Schema @@ -95,18 +96,25 @@ def schema(self) -> dict: return full_schema.json_schema(f"{self.name} ToolAction Schema") def activity_schemas(self) -> list[Schema]: - return [ - Schema( - { - Literal("name"): self.name, - Literal("path", description=self.activity_description(activity)): self.activity_name(activity), - **self.activity_to_input( - activity, - ), # Unpack the dictionary in order to only add the key-values if there are any - }, - ) - for activity in self.activities() - ] + schemas = [] + + for activity in self.activities(): + schema_dict: dict[Literal | schema.Optional, Any] = { + Literal("name"): self.name, + Literal("path", description=self.activity_description(activity)): self.activity_name(activity), + } + + activity_schema = self.activity_schema(activity) + # If no schema is defined, we just make `input` optional instead of omitting it. + # This works better with lower-end models that may accidentally pass in an empty dict. + if activity_schema is None: + schema_dict[schema.Optional("input")] = {} + else: + schema_dict[Literal("input")] = activity_schema.schema + + schemas.append(Schema(schema_dict)) + + return schemas def execute(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> BaseArtifact: try: diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index 8a1821a13..43f975acd 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -15,11 +15,11 @@ @define class WebSearch(BaseTool): - web_search_driver: BaseWebSearchDriver = field(default=None, kw_only=True) + web_search_driver: BaseWebSearchDriver = field(kw_only=True) @activity( config={ - "description": "Can be used for searching the web", + "description": "Can be used for searching the web via the {{ _self.web_search_driver.__class__.__name__}}.", "schema": Schema( { Literal( @@ -31,9 +31,11 @@ class WebSearch(BaseTool): }, ) def search(self, props: dict) -> ListArtifact | ErrorArtifact: - query = props["values"]["query"] + values = props["values"] + query = values["query"] + extra_keys = {k: values[k] for k in values.keys() - {"query"}} try: - return self.web_search_driver.search(query) + return self.web_search_driver.search(query, **extra_keys) except Exception as e: return ErrorArtifact(f"Error searching '{query}' with {self.web_search_driver.__class__.__name__}: {e}") diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 6a58b09dc..ebe25bb28 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -19,6 +19,7 @@ class TestAmazonBedrockPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -42,6 +43,7 @@ class TestAmazonBedrockPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -65,6 +67,7 @@ class TestAmazonBedrockPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -120,6 +123,7 @@ class TestAmazonBedrockPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -143,6 +147,7 @@ class TestAmazonBedrockPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index 3b1343336..88c1e75ff 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -20,6 +20,7 @@ class TestAnthropicPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -39,6 +40,7 @@ class TestAnthropicPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -58,6 +60,7 @@ class TestAnthropicPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -101,6 +104,7 @@ class TestAnthropicPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -120,6 +124,7 @@ class TestAnthropicPromptDriver: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", diff --git a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py index 797880fdc..0fc9e0f09 100644 --- a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py @@ -14,6 +14,7 @@ class TestOllamaPromptDriver: "name": "MockTool_test", "parameters": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -27,6 +28,7 @@ class TestOllamaPromptDriver: "name": "MockTool_test_error", "parameters": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -40,6 +42,7 @@ class TestOllamaPromptDriver: "name": "MockTool_test_exception", "parameters": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -67,6 +70,7 @@ class TestOllamaPromptDriver: "name": "MockTool_test_str_output", "parameters": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -80,6 +84,7 @@ class TestOllamaPromptDriver: "name": "MockTool_test_without_default_memory", "parameters": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 73073a0f0..ae42aa3a1 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -23,6 +23,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -45,6 +46,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -67,6 +69,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -119,6 +122,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", @@ -141,6 +145,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: "properties": { "values": { "additionalProperties": False, + "description": "Test input", "properties": {"test": {"type": "string"}}, "required": ["test"], "type": "object", diff --git a/tests/unit/mixins/test_activity_mixin.py b/tests/unit/mixins/test_activity_mixin.py index f31f9f0e8..1d684e2a5 100644 --- a/tests/unit/mixins/test_activity_mixin.py +++ b/tests/unit/mixins/test_activity_mixin.py @@ -20,7 +20,7 @@ def test_activity_description(self, tool): def test_activity_schema(self, tool): schema = tool.activity_schema(tool.test).json_schema("InputSchema") - assert schema == Schema({"values": tool.test.config["schema"].schema}).json_schema("InputSchema") + assert schema == Schema({"values": getattr(tool.test, "config")["schema"]}).json_schema("InputSchema") assert schema["properties"].get("artifact") is None def test_activity_with_no_schema(self, tool): @@ -73,11 +73,31 @@ def test_enable_activities(self, tool): assert len(tool.activities()) > 0 - def test_activity_to_input(self, tool): - activity_input = tool.activity_to_input(tool.test) - assert str(activity_input) == str( - {Literal("input", description=""): {"values": Schema({Literal("test"): str}, description="Test input")}} + def test_extra_schema_properties(self): + tool = MockTool( + test_field="hello", + test_int=5, + extra_schema_properties={"test": {Literal("new_property"): str, Optional("optional_property"): int}}, ) + schema = tool.activity_schema(tool.test).json_schema("InputSchema") - activity_input = tool.activity_to_input(tool.test_no_schema) - assert activity_input == {Optional("input"): {}} + assert schema == { + "$id": "InputSchema", + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "values": { + "description": "Test input", + "properties": { + "test": {"type": "string"}, + "new_property": {"type": "string"}, + "optional_property": {"type": "integer"}, + }, + "required": ["test", "new_property"], + "additionalProperties": False, + "type": "object", + } + }, + "required": ["values"], + "additionalProperties": False, + "type": "object", + } diff --git a/tests/unit/tools/test_web_search.py b/tests/unit/tools/test_web_search.py index dd447de5d..17ff610e0 100644 --- a/tests/unit/tools/test_web_search.py +++ b/tests/unit/tools/test_web_search.py @@ -25,6 +25,14 @@ def test_search(self, websearch_tool): assert isinstance(websearch_tool.search({"values": {"query": "foo bar"}}), BaseArtifact) assert websearch_tool.search({"values": {"query": "foo bar"}}).value == "test_response" + def test_search_with_params(self, websearch_tool): + assert isinstance( + websearch_tool.search({"values": {"query": "foo bar", "params": {"key": "value"}}}), BaseArtifact + ) + assert ( + websearch_tool.search({"values": {"query": "foo bar", "params": {"key": "value"}}}).value == "test_response" + ) + def test_search_with_error(self, websearch_tool_with_error): assert isinstance(websearch_tool_with_error.search({"values": {"query": "foo bar"}}), ErrorArtifact) assert ( From fe53c41f23ae9d64d27ad2ca4aea51cfb6d7e9a4 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 2 Aug 2024 13:28:18 -0700 Subject: [PATCH 199/238] Add docs for Generic Artifact (#1042) --- docs/griptape-framework/data/artifacts.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index c7aa55bd0..065e36123 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -8,7 +8,7 @@ search: **[Artifacts](../../reference/griptape/artifacts/base_artifact.md)** are used for passing different types of data between Griptape components. All tools return artifacts that are later consumed by tasks and task memory. Artifacts make sure framework components enforce contracts when passing and consuming data. -## TextArtifact +## Text A [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) for passing text data of arbitrary size around the framework. It can be used to count tokens with [token_count()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.token_count) with a tokenizer. It can also be used to generate a text embedding with [generate_embedding()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.generate_embedding) @@ -16,20 +16,20 @@ and access it with [embedding](../../reference/griptape/artifacts/text_artifact. [TaskMemory](../../reference/griptape/memory/task/task_memory.md) automatically stores [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s returned by tool activities and returns artifact IDs back to the LLM. -## CsvRowArtifact +## Csv Row A [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md) for passing structured row data around the framework. It inherits from [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) and overrides the [to_text()](../../reference/griptape/artifacts/csv_row_artifact.md#griptape.artifacts.csv_row_artifact.CsvRowArtifact.to_text) method, which always returns a valid CSV row. -## InfoArtifact +## Info An [InfoArtifact](../../reference/griptape/artifacts/info_artifact.md) for passing short notifications back to the LLM without task memory storing them. -## ErrorArtifact +## Error An [ErrorArtifact](../../reference/griptape/artifacts/error_artifact.md) is used for passing errors back to the LLM without task memory storing them. -## BlobArtifact +## Blob A [BlobArtifact](../../reference/griptape/artifacts/blob_artifact.md) for passing binary large objects (blobs) back to the LLM. Treat it as a way to return unstructured data, such as images, videos, audio, and other files back from tools. @@ -38,17 +38,23 @@ Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#gript [TaskMemory](../../reference/griptape/memory/task/task_memory.md) automatically stores [BlobArtifact](../../reference/griptape/artifacts/blob_artifact.md)s returned by tool activities that can be reused by other tools. -## ImageArtifact +## Image An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an Image Artifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blobartifact). -## AudioArtifact +## Audio An [AudioArtifact](../../reference/griptape/artifacts/audio_artifact.md) allows the Framework to interact with audio content. An Audio Artifact includes binary audio content as well as metadata like format, duration, and prompt and model information for audio returned generative models. It inherits from [BlobArtifact](#blobartifact). -## BooleanArtifact +## Boolean A [BooleanArtifact](../../reference/griptape/artifacts/boolean_artifact.md) is used for passing boolean values around the framework. !!! info Any object passed on init to `BooleanArtifact` will be coerced into a `bool` type. This might lead to unintended behavior: `BooleanArtifact("False").value is True`. Use [BooleanArtifact.parse_bool](../../reference/griptape/artifacts/boolean_artifact.md#griptape.artifacts.boolean_artifact.BooleanArtifact.parse_bool) to convert case-insensitive string literal values `"True"` and `"False"` into a `BooleanArtifact`: `BooleanArtifact.parse_bool("False").value is False`. + +## Generic + +A [GenericArtifact](../../reference/griptape/artifacts/generic_artifact.md) can be used as an escape hatch for passing any type of data around the framework. +It is generally not recommended to use this Artifact type, but it can be used in a handful of situations where no other Artifact type fits the data being passed. +See [talking to a video](../../examples/talk-to-a-video.md) for an example of using a `GenericArtifact` to pass a Gemini-specific video file. From 7ed58ccfddb5f31962c8ce7dc7ed13cd3e591f89 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 5 Aug 2024 14:11:43 -0500 Subject: [PATCH 200/238] Add structure to Task init (#1035) --- CHANGELOG.md | 5 +++ .../structures/workflows.md | 15 +++---- griptape/structures/pipeline.py | 3 ++ griptape/structures/structure.py | 13 +++++- griptape/structures/workflow.py | 7 +++ griptape/tasks/actions_subtask.py | 12 +++++ griptape/tasks/base_task.py | 26 +++++++++-- griptape/tasks/toolkit_task.py | 1 + tests/unit/structures/test_pipeline.py | 19 ++++++++ tests/unit/structures/test_workflow.py | 45 +++++++++++++++---- tests/unit/tasks/test_base_task.py | 38 ++++++++++++++++ 11 files changed, 162 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94fcf0abd..3582ec02c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `AstraDbVectorStoreDriver` to support DataStax Astra DB as a vector store. - Ability to set custom schema properties on Tool Activities via `extra_schema_properties`. +- Parameter `structure` to `BaseTask`. +- Method `try_find_task` to `Structure`. + +### Changed +- `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. ## [0.29.0] - 2024-07-30 diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 75511171f..141bb3160 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -269,18 +269,17 @@ from griptape.tasks import PromptTask from griptape.structures import Workflow from griptape.rules import Rule -animal_task = PromptTask("Name an animal", id="animal") -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") -new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") - -adjective_task.add_parent(animal_task) -adjective_task.add_child(new_animal_task) - workflow = Workflow( - tasks=[animal_task, adjective_task, new_animal_task], rules=[Rule("output a single lowercase word")], ) +animal_task = PromptTask("Name an animal", id="animal", structure=workflow) +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", structure=workflow) +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", structure=workflow) + +adjective_task.add_parent(animal_task) +adjective_task.add_child(new_animal_task) + workflow.run() ``` diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 0aed369bb..e89d83818 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -16,6 +16,9 @@ @define class Pipeline(Structure): def add_task(self, task: BaseTask) -> BaseTask: + if (existing_task := self.try_find_task(task.id)) is not None: + return existing_task + task.preprocess(self) if self.output_task: diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 765910f5c..079e0b741 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -215,10 +215,15 @@ def is_executing(self) -> bool: return any(s for s in self.tasks if s.is_executing()) def find_task(self, task_id: str) -> BaseTask: + if (task := self.try_find_task(task_id)) is not None: + return task + raise ValueError(f"Task with id {task_id} doesn't exist.") + + def try_find_task(self, task_id: str) -> Optional[BaseTask]: for task in self.tasks: if task.id == task_id: return task - raise ValueError(f"Task with id {task_id} doesn't exist.") + return None def add_tasks(self, *tasks: BaseTask) -> list[BaseTask]: return [self.add_task(s) for s in tasks] @@ -227,7 +232,11 @@ def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} def resolve_relationships(self) -> None: - task_by_id = {task.id: task for task in self.tasks} + task_by_id = {} + for task in self.tasks: + if task.id in task_by_id: + raise ValueError(f"Duplicate task with id {task.id} found.") + task_by_id[task.id] = task for task in self.tasks: # Ensure parents include this task as a child diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 2ecfb8676..53e59e751 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -22,11 +22,18 @@ class Workflow(Structure): kw_only=True, ) + @property + def input_task(self) -> Optional[BaseTask]: + return self.order_tasks()[0] if self.tasks else None + @property def output_task(self) -> Optional[BaseTask]: return self.order_tasks()[-1] if self.tasks else None def add_task(self, task: BaseTask) -> BaseTask: + if (existing_task := self.try_find_task(task.id)) is not None: + return existing_task + task.preprocess(self) self.tasks.append(task) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index d691906c9..cde59d0ef 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -64,6 +64,18 @@ def children(self) -> list[BaseTask]: else: raise Exception("ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin.") + def add_child(self, child: str | BaseTask) -> None: + child_id = child if isinstance(child, str) else child.id + + if child_id not in self.child_ids: + self.child_ids.append(child_id) + + def add_parent(self, parent: str | BaseTask) -> None: + parent_id = parent if isinstance(parent, str) else parent.id + + if parent_id not in self.parent_ids: + self.parent_ids.append(parent_id) + def attach_to(self, parent_task: BaseTask) -> None: self.parent_task_id = parent_task.id self.structure = parent_task.structure diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 299fe5dfe..8c50e4df9 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -29,26 +29,34 @@ class State(Enum): parent_ids: list[str] = field(factory=list, kw_only=True) child_ids: list[str] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) + structure: Optional[Structure] = field(default=None, kw_only=True) output: Optional[BaseArtifact] = field(default=None, init=False) - structure: Optional[Structure] = field(default=None, init=False) context: dict[str, Any] = field(factory=dict, kw_only=True) futures_executor_fn: Callable[[], futures.Executor] = field( default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True, ) + def __attrs_post_init__(self) -> None: + if self.structure is not None: + self.structure.add_task(self) + @property @abstractmethod def input(self) -> BaseArtifact: ... @property def parents(self) -> list[BaseTask]: - return [self.structure.find_task(parent_id) for parent_id in self.parent_ids] + if self.structure is not None: + return [self.structure.find_task(parent_id) for parent_id in self.parent_ids] + raise ValueError("Structure must be set to access parents") @property def children(self) -> list[BaseTask]: - return [self.structure.find_task(child_id) for child_id in self.child_ids] + if self.structure is not None: + return [self.structure.find_task(child_id) for child_id in self.child_ids] + raise ValueError("Structure must be set to access children") @property def parent_outputs(self) -> dict[str, str]: @@ -81,6 +89,12 @@ def add_parent(self, parent: str | BaseTask) -> None: if parent_id not in self.parent_ids: self.parent_ids.append(parent_id) + if isinstance(parent, BaseTask): + parent.add_child(self.id) + + if self.structure is not None: + self.structure.add_task(parent) + def add_children(self, children: list[str | BaseTask]) -> None: for child in children: self.add_child(child) @@ -91,6 +105,12 @@ def add_child(self, child: str | BaseTask) -> None: if child_id not in self.child_ids: self.child_ids.append(child_id) + if isinstance(child, BaseTask): + child.add_parent(self.id) + + if self.structure is not None: + self.structure.add_task(child) + def preprocess(self, structure: Structure) -> BaseTask: self.structure = structure diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 59d8f9f90..567e3cd1d 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -199,6 +199,7 @@ def find_subtask(self, subtask_id: str) -> ActionsSubtask: def add_subtask(self, subtask: ActionsSubtask) -> ActionsSubtask: subtask.attach_to(self) + subtask.structure = self.structure if len(self.subtasks) > 0: self.subtasks[-1].add_child(subtask) diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index 38f8abfb3..306fd7bd2 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -390,3 +390,22 @@ def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting pipeline.run() assert pipeline.output is not None + + def test_add_duplicate_task(self): + task = PromptTask("test") + pipeline = Pipeline(prompt_driver=MockPromptDriver()) + + pipeline + task + pipeline + task + + assert len(pipeline.tasks) == 1 + + def test_add_duplicate_task_directly(self): + task = PromptTask("test") + pipeline = Pipeline(prompt_driver=MockPromptDriver()) + + pipeline + task + pipeline.tasks.append(task) + + with pytest.raises(ValueError, match=f"Duplicate task with id {task.id} found."): + pipeline.run() diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 2be164ea7..242de29c5 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -321,6 +321,34 @@ def test_run_topology_1_imperative_children(self): self._validate_topology_1(workflow) + def test_run_topology_1_imperative_parents_structure_init(self): + workflow = Workflow(prompt_driver=MockPromptDriver()) + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2", structure=workflow) + task3 = PromptTask("test3", id="task3", structure=workflow) + task4 = PromptTask("test4", id="task4", structure=workflow) + task2.add_parent(task1) + task3.add_parent("task1") + task4.add_parents([task2, "task3"]) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_imperative_children_structure_init(self): + workflow = Workflow(prompt_driver=MockPromptDriver()) + task1 = PromptTask("test1", id="task1", structure=workflow) + task2 = PromptTask("test2", id="task2", structure=workflow) + task3 = PromptTask("test3", id="task3", structure=workflow) + task4 = PromptTask("test4", id="task4") + task1.add_children([task2, task3]) + task2.add_child(task4) + task3.add_child(task4) + + workflow.run() + + self._validate_topology_1(workflow) + def test_run_topology_1_imperative_mixed(self): task1 = PromptTask("test1", id="task1") task2 = PromptTask("test2", id="task2") @@ -781,8 +809,8 @@ def _validate_topology_1(workflow) -> None: assert len(workflow.tasks) == 4 assert workflow.input_task.id == "task1" assert workflow.output_task.id == "task4" - assert workflow.input_task.id == workflow.tasks[0].id - assert workflow.output_task.id == workflow.tasks[-1].id + assert workflow.input_task.id == workflow.order_tasks()[0].id + assert workflow.output_task.id == workflow.order_tasks()[-1].id task1 = workflow.find_task("task1") assert task1.state == BaseTask.State.FINISHED @@ -810,8 +838,6 @@ def _validate_topology_2(workflow) -> None: assert len(workflow.tasks) == 5 assert workflow.input_task.id == "taska" assert workflow.output_task.id == "taske" - assert workflow.input_task.id == workflow.tasks[0].id - assert workflow.output_task.id == workflow.tasks[-1].id taska = workflow.find_task("taska") assert taska.state == BaseTask.State.FINISHED @@ -832,6 +858,8 @@ def _validate_topology_2(workflow) -> None: assert taskd.state == BaseTask.State.FINISHED assert sorted(taskd.parent_ids) == ["taska", "taskb", "taskc"] assert taskd.child_ids == ["taske"] + assert workflow.input_task.id == workflow.order_tasks()[0].id + assert workflow.output_task.id == workflow.order_tasks()[-1].id taske = workflow.find_task("taske") assert taske.state == BaseTask.State.FINISHED @@ -843,9 +871,6 @@ def _validate_topology_3(workflow) -> None: assert len(workflow.tasks) == 4 assert workflow.input_task.id == "task1" assert workflow.output_task.id == "task3" - assert workflow.input_task.id == workflow.tasks[0].id - assert workflow.output_task.id == workflow.tasks[-1].id - task1 = workflow.find_task("task1") assert task1.state == BaseTask.State.FINISHED assert task1.parent_ids == [] @@ -855,6 +880,8 @@ def _validate_topology_3(workflow) -> None: assert task2.state == BaseTask.State.FINISHED assert task2.parent_ids == ["task4"] assert task2.child_ids == ["task3"] + assert workflow.input_task.id == workflow.order_tasks()[0].id + assert workflow.output_task.id == workflow.order_tasks()[-1].id task3 = workflow.find_task("task3") assert task3.state == BaseTask.State.FINISHED @@ -871,8 +898,8 @@ def _validate_topology_4(workflow) -> None: assert len(workflow.tasks) == 9 assert workflow.input_task.id == "collect_movie_info" assert workflow.output_task.id == "summarize_to_slack" - assert workflow.input_task.id == workflow.tasks[0].id - assert workflow.output_task.id == workflow.tasks[-1].id + assert workflow.input_task.id == workflow.order_tasks()[0].id + assert workflow.output_task.id == workflow.order_tasks()[-1].id collect_movie_info = workflow.find_task("collect_movie_info") assert collect_movie_info.parent_ids == [] diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 87602dbbb..4f4b43d40 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -76,6 +76,44 @@ def test_parents_output(self, task): assert child.parents_output_text == "foobar1\nfoobar3" + def test_parents_property_no_structure(self, task): + workflow = Workflow() + task1 = MockTask("foobar1", id="foobar1") + task2 = MockTask("foobar2", id="foobar2") + task3 = MockTask("foobar3", id="foobar3") + child = MockTask("foobar", id="foobar") + + child.add_parent(task1) + child.add_parent(task2) + child.add_parent(task3) + + with pytest.raises(ValueError, match="Structure must be set to access parents"): + child.parents # noqa: B018 + + workflow.add_tasks(task1, task2, task3, child) + child.structure = workflow + + assert len(child.parents) == 3 + + def test_children_property_no_structure(self, task): + workflow = Workflow() + task1 = MockTask("foobar1", id="foobar1") + task2 = MockTask("foobar2", id="foobar2") + task3 = MockTask("foobar3", id="foobar3") + parent = MockTask("foobar", id="foobar") + + parent.add_child(task1) + parent.add_child(task2) + parent.add_child(task3) + + with pytest.raises(ValueError, match="Structure must be set to access children"): + parent.children # noqa: B018 + + workflow.add_tasks(task1, task2, task3, parent) + parent.structure = workflow + + assert len(parent.children) == 3 + def test_execute_publish_events(self, task): task.execute() From 5d12f956dd36fb30c6ede4a3b6e56dabdf93f3b9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 7 Aug 2024 10:47:27 -0700 Subject: [PATCH 201/238] Fix Adding To Structure For Tool(kit)Task (#1047) --- griptape/tasks/tool_task.py | 1 + griptape/tasks/toolkit_task.py | 1 + 2 files changed, 2 insertions(+) diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index ca548b34d..6dd5000b3 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -37,6 +37,7 @@ def prompt_stack(self) -> PromptStack: return stack def __attrs_post_init__(self) -> None: + super().__attrs_post_init__() if self.task_memory is not None: self.set_default_tools_memory(self.task_memory) diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 567e3cd1d..b28c76575 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -42,6 +42,7 @@ class ToolkitTask(PromptTask, ActionsSubtaskOriginMixin): response_stop_sequence: str = field(default=RESPONSE_STOP_SEQUENCE, kw_only=True) def __attrs_post_init__(self) -> None: + super().__attrs_post_init__() if self.task_memory: self.set_default_tools_memory(self.task_memory) From dc742348f331788821e714ac2b0f573b42ff2bbe Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:01:40 -0500 Subject: [PATCH 202/238] updating structure run result to return BaseArtifact (#1050) --- CHANGELOG.md | 1 + .../structure_run/griptape_cloud_structure_run_driver.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3582ec02c..1d8bf2e72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -382,6 +382,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Default model of `AmazonBedrockStructureConfig` to `anthropic.claude-3-sonnet-20240229-v1:0`. - `AnthropicPromptDriver` and `BedrockClaudePromptModelDriver` to use Anthropic's Messages API. - `OpenAiVisionImageQueryDriver` now has a required field `max_tokens` that defaults to 256 +- `GriptapeCloudStructureRunDriver` now outputs a `BaseArtifact` instead of a `TextArtifact` ## [0.23.2] - 2024-03-15 diff --git a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py index 00b90a819..305d14995 100644 --- a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py +++ b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py @@ -6,7 +6,7 @@ from attrs import Factory, define, field -from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver @@ -44,7 +44,7 @@ def try_run(self, *args: BaseArtifact) -> BaseArtifact: except (exceptions.RequestException, HTTPError) as err: return ErrorArtifact(str(err)) - def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | TextArtifact | ErrorArtifact: + def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | BaseArtifact | ErrorArtifact: url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{structure_run_id}") result = self._get_structure_run_result_attempt(url) @@ -67,7 +67,7 @@ def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | Tex return ErrorArtifact(result) if "output" in result: - return TextArtifact.from_dict(result["output"]) + return BaseArtifact.from_dict(result["output"]) else: return InfoArtifact("No output found in response") From 105f4d0357217406d35c2df68c74196186877684 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Thu, 8 Aug 2024 13:04:01 -0600 Subject: [PATCH 203/238] Added `TranslateQueryRagModule` and updated RAG docs (#1046) Co-authored-by: Collin Dutter --- CHANGELOG.md | 1 + .../griptape-framework/engines/rag-engines.md | 82 +++++++++++++------ griptape/engines/rag/modules/__init__.py | 2 + .../engines/rag/modules/base_rag_module.py | 13 ++- .../query/translate_query_rag_module.py | 32 ++++++++ .../response/prompt_response_rag_module.py | 4 +- griptape/engines/rag/rag_context.py | 8 +- .../engines/rag/stages/query_rag_stage.py | 6 +- .../rag/modules/query/translate/user.j2 | 3 + tests/unit/engines/query/__init__.py | 0 .../query/test_translate_query_rag_module.py | 10 +++ .../rag/modules/test_base_rag_nodule.py | 10 ++- 12 files changed, 130 insertions(+), 41 deletions(-) create mode 100644 griptape/engines/rag/modules/query/translate_query_rag_module.py create mode 100644 griptape/templates/engines/rag/modules/query/translate/user.j2 create mode 100644 tests/unit/engines/query/__init__.py create mode 100644 tests/unit/engines/query/test_translate_query_rag_module.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d8bf2e72..f9b2e72e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Ability to set custom schema properties on Tool Activities via `extra_schema_properties`. - Parameter `structure` to `BaseTask`. - Method `try_find_task` to `Structure`. +- `TranslateQueryRagModule` `RagEngine` module for translating input queries. ### Changed - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md index dc09d6de9..c557c4087 100644 --- a/docs/griptape-framework/engines/rag-engines.md +++ b/docs/griptape-framework/engines/rag-engines.md @@ -8,57 +8,78 @@ search: !!! note This section is a work in progress. -`RagEngine` is an abstraction for implementing modular RAG pipelines. - -`RagContext` is a container object for passing around RAG context. +[Rag Engine](../../reference/griptape/engines/rag/index.md) is an abstraction for implementing modular retrieval augmented generation (RAG) pipelines. ### RAG Stages -- `QueryRagStage` is for parsing and expanding queries. -- `RetrievalRagStage` is for retrieving content. -- `ResponseRagStage` is for augmenting and generating outputs. + +`RagEngine`s consist of three _stages_: `QueryRagStage`, `RetrievalRagStage`, and `ResponseRagStage`. These stages are always executed sequentially. Each stage comprises multiple _modules_, which are executed in a customized manner. Due to this unique structure, `RagEngines` are not intended to replace [Workflows](../structures/workflows.md) or [Pipelines](../structures/pipelines.md). + + +- `QueryRagStage` is used for modifying user queries. +- `RetrievalRagStage` is used for retrieving and re-ranking text chunks. +- `ResponseRagStage` is used for generating responses. ### RAG Modules -#### Query +RAG modules are used to implement concrete actions in the RAG pipeline. `RagEngine` enables developers to easily add new modules to experiment with novel RAG strategies. -No modules implemented yet. +#### Query Modules -#### Retrieval +- `TranslateQueryRagModule` is for translating the query into another language. + +#### Retrieval Modules - `TextRetrievalRagModule` is for retrieving text chunks. - `TextLoaderRetrievalRagModule` is for retrieving data with text loaders in real time. - `TextChunksRerankRagModule` is for re-ranking retrieved results. -#### Response +#### Response Modules - `MetadataBeforeResponseRagModule` is for appending metadata. - `RulesetsBeforeResponseRagModule` is for appending rulesets. - `PromptResponseRagModule` is for generating responses based on retrieved text chunks. - `TextChunksResponseRagModule` is for responding with retrieved text chunks. - `FootnotePromptResponseRagModule` is for responding with automatic footnotes from text chunk references. +### RAG Context + +`RagContext` is a container object for passing around queries, text chunks, module configs, and other metadata. `RagContext` is modified by modules when appropriate. Some modules support runtime config overrides through `RagContext.module_configs`. + ### Example +The following example shows a simple RAG pipeline that translates incoming queries into English, retrieves data from a local vector store, and generates a response: + ```python -from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage +from griptape.engines.rag import RagEngine, RagContext +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule, TranslateQueryRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage, QueryRagStage +from griptape.loaders import WebLoader -vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) +prompt_driver = OpenAiChatPromptDriver(model="gpt-4o", temperature=0) -artifacts = [ - TextArtifact("Griptape builds AI-powered applications that connect securely to your enterprise data and APIs."), - TextArtifact("Griptape Agents provide incredible power and flexibility when working with large language models.") -] -vector_store.upsert_text_artifacts({"griptape": artifacts}) +vector_store = LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver() +) + +vector_store.upsert_text_artifacts({ + "griptape": WebLoader(max_tokens=500).load("https://www.griptape.ai"), +}) -engine = RagEngine( +rag_engine = RagEngine( + query_stage=QueryRagStage( + query_modules=[ + TranslateQueryRagModule( + prompt_driver=prompt_driver, + language="English" + ) + ] + ), retrieval_stage=RetrievalRagStage( + max_chunks=5, retrieval_modules=[ VectorStoreRetrievalRagModule( + name="MyAwesomeRetriever", vector_store_driver=vector_store, query_params={ - "namespace": "griptape", "top_n": 20 } ) @@ -66,12 +87,23 @@ engine = RagEngine( ), response_stage=ResponseRagStage( response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + prompt_driver=prompt_driver ) ) ) +rag_context = RagContext( + query="¿Qué ofrecen los servicios en la nube de Griptape?", + module_configs={ + "MyAwesomeRetriever": { + "query_params": { + "namespace": "griptape" + } + } + } +) + print( - engine.process_query("what are Griptape agents?").output.to_text() + rag_engine.process(rag_context).output.to_text() ) -``` +``` \ No newline at end of file diff --git a/griptape/engines/rag/modules/__init__.py b/griptape/engines/rag/modules/__init__.py index 4a180490d..be66082f0 100644 --- a/griptape/engines/rag/modules/__init__.py +++ b/griptape/engines/rag/modules/__init__.py @@ -1,5 +1,6 @@ from .base_rag_module import BaseRagModule from .query.base_query_rag_module import BaseQueryRagModule +from .query.translate_query_rag_module import TranslateQueryRagModule from .retrieval.base_retrieval_rag_module import BaseRetrievalRagModule from .retrieval.base_rerank_rag_module import BaseRerankRagModule from .retrieval.text_chunks_rerank_rag_module import TextChunksRerankRagModule @@ -17,6 +18,7 @@ __all__ = [ "BaseRagModule", "BaseQueryRagModule", + "TranslateQueryRagModule", "BaseRetrievalRagModule", "BaseRerankRagModule", "TextChunksRerankRagModule", diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index f2c8316a8..829a24565 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -19,10 +19,15 @@ class BaseRagModule(ABC): default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), ) - def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptStack: - return PromptStack( - messages=[Message(system_prompt, role=Message.SYSTEM_ROLE), Message(query, role=Message.USER_ROLE)], - ) + def generate_prompt_stack(self, system_prompt: Optional[str], query: str) -> PromptStack: + messages = [] + + if system_prompt is not None: + messages.append(Message(system_prompt, role=Message.SYSTEM_ROLE)) + + messages.append(Message(query, role=Message.USER_ROLE)) + + return PromptStack(messages=messages) def get_context_param(self, context: RagContext, key: str) -> Optional[Any]: return context.module_configs.get(self.name, {}).get(key) diff --git a/griptape/engines/rag/modules/query/translate_query_rag_module.py b/griptape/engines/rag/modules/query/translate_query_rag_module.py new file mode 100644 index 000000000..f1f9ca0ec --- /dev/null +++ b/griptape/engines/rag/modules/query/translate_query_rag_module.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Callable + +from attrs import Factory, define, field + +from griptape.engines.rag.modules import BaseQueryRagModule +from griptape.utils import J2 + +if TYPE_CHECKING: + from griptape.drivers import BasePromptDriver + from griptape.engines.rag import RagContext + + +@define(kw_only=True) +class TranslateQueryRagModule(BaseQueryRagModule): + prompt_driver: BasePromptDriver = field() + language: str = field() + generate_user_template: Callable[[str, str], str] = field( + default=Factory(lambda self: self.default_user_template_generator, takes_self=True), + ) + + def run(self, context: RagContext) -> RagContext: + user_prompt = self.generate_user_template(context.query, self.language) + output = self.prompt_driver.run(self.generate_prompt_stack(None, user_prompt)).to_artifact() + + context.query = output.to_text() + + return context + + def default_user_template_generator(self, query: str, language: str) -> str: + return J2("engines/rag/modules/query/translate/user.j2").render(query=query, language=language) diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 0b7cbd953..1cdb9a6f0 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -32,7 +32,7 @@ def run(self, context: RagContext) -> RagContext: system_prompt = self.generate_system_template(context, included_chunks) message_token_count = self.prompt_driver.tokenizer.count_tokens( - self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)), + self.prompt_driver.prompt_stack_to_string(self.generate_prompt_stack(system_prompt, query)), ) if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: @@ -42,7 +42,7 @@ def run(self, context: RagContext) -> RagContext: break - output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)).to_artifact() + output = self.prompt_driver.run(self.generate_prompt_stack(system_prompt, query)).to_artifact() if isinstance(output, TextArtifact): context.output = output diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index 1b0496d72..3146070c2 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -19,10 +19,10 @@ class RagContext(SerializableMixin): Attributes: query: Query provided by the user. module_configs: Dictionary of module configs. First key should be a module name and the second a dictionary of config parameters. - before_query: An optional list of strings to add before the query in generation modules. - after_query: An optional list of strings to add after the query in generation modules. - text_chunks: A list of text chunks to pass around from the retrieval stage to the generation stage. - output: Final output from the generation stage. + before_query: An optional list of strings to add before the query in response modules. + after_query: An optional list of strings to add after the query in response modules. + text_chunks: A list of text chunks to pass around from the retrieval stage to the response stage. + output: Final output from the response stage. """ query: str = field(metadata={"serializable": True}) diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 7340e4aed..97a6c2e2d 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -5,7 +5,6 @@ from attrs import define, field -from griptape import utils from griptape.engines.rag.stages import BaseRagStage if TYPE_CHECKING: @@ -24,9 +23,8 @@ def modules(self) -> Sequence[BaseRagModule]: return self.query_modules def run(self, context: RagContext) -> RagContext: - logging.info("QueryStage: running %s query generation modules in parallel", len(self.query_modules)) + logging.info("QueryStage: running %s query generation modules sequentially", len(self.query_modules)) - with self.futures_executor_fn() as executor: - utils.execute_futures_list([executor.submit(r.run, context) for r in self.query_modules]) + [qm.run(context) for qm in self.query_modules] return context diff --git a/griptape/templates/engines/rag/modules/query/translate/user.j2 b/griptape/templates/engines/rag/modules/query/translate/user.j2 new file mode 100644 index 000000000..d18252c1f --- /dev/null +++ b/griptape/templates/engines/rag/modules/query/translate/user.j2 @@ -0,0 +1,3 @@ +Translate the following text into {{ language }}. Only output translated text. + +Text: {{ query }} \ No newline at end of file diff --git a/tests/unit/engines/query/__init__.py b/tests/unit/engines/query/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/query/test_translate_query_rag_module.py b/tests/unit/engines/query/test_translate_query_rag_module.py new file mode 100644 index 000000000..a04a5b619 --- /dev/null +++ b/tests/unit/engines/query/test_translate_query_rag_module.py @@ -0,0 +1,10 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import TranslateQueryRagModule +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestTranslateQueryRagModule: + def test_run(self): + module = TranslateQueryRagModule(prompt_driver=MockPromptDriver(), language="english") + + assert module.run(RagContext(query="foo")).query == "mock output" diff --git a/tests/unit/engines/rag/modules/test_base_rag_nodule.py b/tests/unit/engines/rag/modules/test_base_rag_nodule.py index be1fda861..b5db2502d 100644 --- a/tests/unit/engines/rag/modules/test_base_rag_nodule.py +++ b/tests/unit/engines/rag/modules/test_base_rag_nodule.py @@ -3,13 +3,19 @@ class TestBaseRagModule: - def test_generate_query_prompt_stack(self): - prompt_stack = MockRagModule().generate_query_prompt_stack("test system", "test query") + def test_generate_prompt_stack(self): + prompt_stack = MockRagModule().generate_prompt_stack("test system", "test query") assert len(prompt_stack.messages) == 2 assert prompt_stack.messages[0].is_system() assert prompt_stack.messages[1].is_user() + def test_generate_prompt_stack_with_empty_system_message(self): + prompt_stack = MockRagModule().generate_prompt_stack(None, "test query") + + assert len(prompt_stack.messages) == 1 + assert prompt_stack.messages[0].is_user() + def test_get_context_param(self): module = MockRagModule(name="boo") context = RagContext(query="test") From 443cf296aa75980573a54025313210c2d6eea9f3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 8 Aug 2024 12:18:24 -0700 Subject: [PATCH 204/238] Add global event bus (#1051) --- CHANGELOG.md | 3 + .../drivers/event-listener-drivers.md | 89 +++++++++++-------- docs/griptape-framework/misc/events.md | 62 ++++++------- griptape/config/base_structure_config.py | 40 --------- .../base_audio_transcription_driver.py | 10 +-- .../embedding/base_embedding_driver.py | 4 +- .../base_image_generation_driver.py | 10 +-- .../image_query/base_image_query_driver.py | 10 +-- .../base_conversation_memory_driver.py | 4 +- griptape/drivers/prompt/base_prompt_driver.py | 16 ++-- .../base_text_to_speech_driver.py | 9 +- .../vector/base_vector_store_driver.py | 4 +- griptape/events/__init__.py | 2 + .../event_bus.py} | 24 +++-- griptape/mixins/__init__.py | 2 - griptape/structures/structure.py | 12 +-- griptape/tasks/actions_subtask.py | 6 +- griptape/tasks/base_task.py | 6 +- griptape/utils/stream.py | 9 +- tests/unit/config/test_structure_config.py | 35 -------- tests/unit/conftest.py | 12 +++ .../test_base_audio_transcription_driver.py | 4 +- .../test_base_image_generation_driver.py | 9 +- .../test_base_image_query_driver.py | 4 +- .../drivers/prompt/test_base_prompt_driver.py | 7 +- .../test_base_audio_transcription_driver.py | 4 +- tests/unit/events/test_event_bus.py | 45 ++++++++++ tests/unit/events/test_event_listener.py | 51 ++++++----- tests/unit/mixins/test_events_mixin.py | 59 ------------ tests/unit/tasks/test_base_task.py | 5 +- 30 files changed, 254 insertions(+), 303 deletions(-) rename griptape/{mixins/event_publisher_mixin.py => events/event_bus.py} (59%) create mode 100644 tests/unit/conftest.py create mode 100644 tests/unit/events/test_event_bus.py delete mode 100644 tests/unit/mixins/test_events_mixin.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b2e72e8..9e016228c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parameter `structure` to `BaseTask`. - Method `try_find_task` to `Structure`. - `TranslateQueryRagModule` `RagEngine` module for translating input queries. +- Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. ### Changed +- **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. +- **BREAKING**: Removed `EventPublisherMixin`. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. ## [0.29.0] - 2024-07-30 diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index 73453afb6..c3c92cfe1 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -14,26 +14,27 @@ import os from griptape.drivers import AmazonSqsEventListenerDriver from griptape.events import ( - EventListener, + EventListener, event_bus ) from griptape.rules import Rule from griptape.structures import Agent -agent = Agent( - rules=[ - Rule( - value="You will be provided with a block of text, and your task is to extract a list of keywords from it." - ) - ], - event_listeners=[ +event_bus.add_event_listeners( + [ EventListener( - handler=lambda event: { # You can optionally use the handler to transform the event payload before sending it to the Driver - "event": event.to_dict(), - }, driver=AmazonSqsEventListenerDriver( queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], ), ), + ] +) + + +agent = Agent( + rules=[ + Rule( + value="You will be provided with a block of text, and your task is to extract a list of keywords from it." + ) ], ) @@ -83,23 +84,26 @@ import os from griptape.drivers import AmazonSqsEventListenerDriver from griptape.events import ( - EventListener, + EventListener, event_bus ) from griptape.rules import Rule from griptape.structures import Agent -agent = Agent( - rules=[ - Rule( - value="You will be provided with a block of text, and your task is to extract a list of keywords from it." - ) - ], - event_listeners=[ +event_bus.add_event_listeners( + [ EventListener( driver=AmazonSqsEventListenerDriver( queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], ), ), + ] +) + +agent = Agent( + rules=[ + Rule( + value="You will be provided with a block of text, and your task is to extract a list of keywords from it." + ) ], ) @@ -128,10 +132,23 @@ from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriv from griptape.events import ( EventListener, FinishStructureRunEvent, + event_bus ) from griptape.rules import Rule from griptape.structures import Agent +event_bus.add_event_listeners( + [ + EventListener( + event_types=[FinishStructureRunEvent], + driver=AwsIotCoreEventListenerDriver( + topic=os.environ["AWS_IOT_CORE_TOPIC"], + iot_endpoint=os.environ["AWS_IOT_CORE_ENDPOINT"], + ), + ), + ] +) + agent = Agent( rules=[ Rule( @@ -143,15 +160,6 @@ agent = Agent( model="gpt-3.5-turbo", temperature=0.7 ) ), - event_listeners=[ - EventListener( - event_types=[FinishStructureRunEvent], - driver=AwsIotCoreEventListenerDriver( - topic=os.environ["AWS_IOT_CORE_TOPIC"], - iot_endpoint=os.environ["AWS_IOT_CORE_ENDPOINT"], - ), - ), - ], ) agent.run("I want to fly from Orlando to Boston") @@ -171,18 +179,19 @@ from griptape.drivers import GriptapeCloudEventListenerDriver from griptape.events import ( EventListener, FinishStructureRunEvent, + event_bus ) from griptape.structures import Agent -agent = Agent( - event_listeners=[ +event_bus.add_event_listeners( + [ EventListener( event_types=[FinishStructureRunEvent], # By default, GriptapeCloudEventListenerDriver uses the api key provided # in the GT_CLOUD_API_KEY environment variable. driver=GriptapeCloudEventListenerDriver(), ), - ], + ] ) agent.run( @@ -201,20 +210,23 @@ from griptape.drivers import WebhookEventListenerDriver from griptape.events import ( EventListener, FinishStructureRunEvent, + event_bus ) from griptape.structures import Agent -agent = Agent( - event_listeners=[ +event_bus.add_event_listeners( + [ EventListener( event_types=[FinishStructureRunEvent], driver=WebhookEventListenerDriver( webhook_url=os.environ["WEBHOOK_URL"], ), ), - ], + ] ) +agent = Agent() + agent.run("Analyze the pros and cons of remote work vs. office work") ``` ### Pusher @@ -229,12 +241,13 @@ import os from griptape.drivers import PusherEventListenerDriver from griptape.events import ( EventListener, - FinishStructureRunEvent + FinishStructureRunEvent, + event_bus ) from griptape.structures import Agent -agent = Agent( - event_listeners=[ +event_bus.add_event_listeners( + [ EventListener( event_types=[FinishStructureRunEvent], driver=PusherEventListenerDriver( @@ -250,6 +263,8 @@ agent = Agent( ], ) +agent = Agent() + agent.run("Analyze the pros and cons of remote work vs. office work") ``` diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index 1f50fd6d0..ebab3c460 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -5,7 +5,7 @@ search: ## Overview -You can use [EventListener](../../reference/griptape/events/event_listener.md)s to listen for events during a Structure's execution. +You can configure the global [event_bus](../../reference/griptape/events/event_bus.md) with [EventListener](../../reference/griptape/events/event_listener.md)s to listen for various framework events. See [Event Listener Drivers](../drivers/event-listener-drivers.md) for examples on forwarding events to external services. ## Specific Event Types @@ -23,15 +23,14 @@ from griptape.events import ( StartPromptEvent, FinishPromptEvent, EventListener, + event_bus ) def handler(event: BaseEvent): print(event.__class__) - -agent = Agent( - event_listeners=[ +event_bus.add_event_listeners([ EventListener( handler, event_types=[ @@ -43,8 +42,9 @@ agent = Agent( FinishPromptEvent, ], ) - ] -) + ]) + +agent = Agent() agent.run("tell me about griptape") ``` @@ -69,7 +69,8 @@ Or listen to all events: ```python from griptape.structures import Agent -from griptape.events import BaseEvent, EventListener +from griptape.events import BaseEvent, EventListener, event_bus + def handler1(event: BaseEvent): @@ -79,14 +80,14 @@ def handler1(event: BaseEvent): def handler2(event: BaseEvent): print("Handler 2", event.__class__) - -agent = Agent( - event_listeners=[ +event_bus.add_event_listeners([ EventListener(handler1), EventListener(handler2), ] ) +agent = Agent() + agent.run("tell me about griptape") ``` @@ -131,7 +132,7 @@ Handler 2 list: - return [ - self.prompt_driver, - self.image_generation_driver, - self.image_query_driver, - self.embedding_driver, - self.vector_store_driver, - self.conversation_memory_driver, - self.text_to_speech_driver, - self.audio_transcription_driver, - ] - - @property - def structure(self) -> Optional[Structure]: - return self._structure - - @structure.setter - def structure(self, structure: Structure) -> None: - if structure != self.structure: - event_publisher_drivers = [ - driver for driver in self.drivers if driver is not None and isinstance(driver, EventPublisherMixin) - ] - - for driver in event_publisher_drivers: - if self._event_listener is not None: - driver.remove_event_listener(self._event_listener) - - self._event_listener = EventListener(structure.publish_event) - for driver in event_publisher_drivers: - driver.add_event_listener(self._event_listener) - - self._structure = structure - def merge_config(self, config: dict) -> BaseStructureConfig: base_config = self.to_dict() merged_config = dict_merge(base_config, config) diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py index c81ea1d5b..91e7f4909 100644 --- a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -5,22 +5,22 @@ from attrs import define, field -from griptape.events import FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.events import FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent, event_bus +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import AudioArtifact, TextArtifact @define -class BaseAudioTranscriptionDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseAudioTranscriptionDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self) -> None: - self.publish_event(StartAudioTranscriptionEvent()) + event_bus.publish_event(StartAudioTranscriptionEvent()) def after_run(self) -> None: - self.publish_event(FinishAudioTranscriptionEvent()) + event_bus.publish_event(FinishAudioTranscriptionEvent()) def run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index 690726060..8998f00e5 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -7,7 +7,7 @@ from attrs import define, field from griptape.chunkers import BaseChunker, TextChunker -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import TextArtifact @@ -15,7 +15,7 @@ @define -class BaseEmbeddingDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseEmbeddingDriver(SerializableMixin, ExponentialBackoffMixin, ABC): """Base Embedding Driver. Attributes: diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index f500d6d09..360fba8c9 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -5,22 +5,22 @@ from attrs import define, field -from griptape.events import FinishImageGenerationEvent, StartImageGenerationEvent -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.events import FinishImageGenerationEvent, StartImageGenerationEvent, event_bus +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import ImageArtifact @define -class BaseImageGenerationDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseImageGenerationDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> None: - self.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) + event_bus.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) def after_run(self) -> None: - self.publish_event(FinishImageGenerationEvent()) + event_bus.publish_event(FinishImageGenerationEvent()) def run_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index b39f198d4..b1050b85c 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -5,24 +5,24 @@ from attrs import define, field -from griptape.events import FinishImageQueryEvent, StartImageQueryEvent -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.events import FinishImageQueryEvent, StartImageQueryEvent, event_bus +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import ImageArtifact, TextArtifact @define -class BaseImageQueryDriver(EventPublisherMixin, SerializableMixin, ExponentialBackoffMixin, ABC): +class BaseImageQueryDriver(SerializableMixin, ExponentialBackoffMixin, ABC): max_tokens: int = field(default=256, kw_only=True, metadata={"serializable": True}) def before_run(self, query: str, images: list[ImageArtifact]) -> None: - self.publish_event( + event_bus.publish_event( StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]), ) def after_run(self, result: str) -> None: - self.publish_event(FinishImageQueryEvent(result=result)) + event_bus.publish_event(FinishImageQueryEvent(result=result)) def query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py index f13b82c29..1caeb902f 100644 --- a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py @@ -3,13 +3,13 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from griptape.mixins import EventPublisherMixin, SerializableMixin +from griptape.mixins import SerializableMixin if TYPE_CHECKING: from griptape.memory.structure import BaseConversationMemory -class BaseConversationMemoryDriver(EventPublisherMixin, SerializableMixin, ABC): +class BaseConversationMemoryDriver(SerializableMixin, ABC): @abstractmethod def store(self, memory: BaseConversationMemory) -> None: ... diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index e5fd0408d..8044469b5 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -16,8 +16,8 @@ TextMessageContent, observable, ) -from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent, event_bus +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from collections.abc import Iterator @@ -26,7 +26,7 @@ @define(kw_only=True) -class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, EventPublisherMixin, ABC): +class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): """Base class for the Prompt Drivers. Attributes: @@ -49,10 +49,10 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, EventPublishe use_native_tools: bool = field(default=False, kw_only=True, metadata={"serializable": True}) def before_run(self, prompt_stack: PromptStack) -> None: - self.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) + event_bus.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) def after_run(self, result: Message) -> None: - self.publish_event( + event_bus.publish_event( FinishPromptEvent( model=self.model, result=result.value, @@ -128,12 +128,12 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: else: delta_contents[content.index] = [content] if isinstance(content, TextDeltaMessageContent): - self.publish_event(CompletionChunkEvent(token=content.text)) + event_bus.publish_event(CompletionChunkEvent(token=content.text)) elif isinstance(content, ActionCallDeltaMessageContent): if content.tag is not None and content.name is not None and content.path is not None: - self.publish_event(CompletionChunkEvent(token=str(content))) + event_bus.publish_event(CompletionChunkEvent(token=str(content))) elif content.partial_input is not None: - self.publish_event(CompletionChunkEvent(token=content.partial_input)) + event_bus.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas result = self.__build_message(list(delta_contents.values()), usage) diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index 788d92974..c74264dc1 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -5,23 +5,24 @@ from attrs import define, field +from griptape.events import event_bus from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent from griptape.events.start_text_to_speech_event import StartTextToSpeechEvent -from griptape.mixins import EventPublisherMixin, ExponentialBackoffMixin, SerializableMixin +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts.audio_artifact import AudioArtifact @define -class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, EventPublisherMixin, ABC): +class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self, prompts: list[str]) -> None: - self.publish_event(StartTextToSpeechEvent(prompts=prompts)) + event_bus.publish_event(StartTextToSpeechEvent(prompts=prompts)) def after_run(self) -> None: - self.publish_event(FinishTextToSpeechEvent()) + event_bus.publish_event(FinishTextToSpeechEvent()) def run_text_to_audio(self, prompts: list[str]) -> AudioArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index d1da78188..ed1f2d589 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -10,14 +10,14 @@ from griptape import utils from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact -from griptape.mixins import EventPublisherMixin, SerializableMixin +from griptape.mixins import SerializableMixin if TYPE_CHECKING: from griptape.drivers import BaseEmbeddingDriver @define -class BaseVectorStoreDriver(EventPublisherMixin, SerializableMixin, ABC): +class BaseVectorStoreDriver(SerializableMixin, ABC): DEFAULT_QUERY_COUNT = 5 @dataclass diff --git a/griptape/events/__init__.py b/griptape/events/__init__.py index 944a309eb..431927663 100644 --- a/griptape/events/__init__.py +++ b/griptape/events/__init__.py @@ -22,6 +22,7 @@ from .base_audio_transcription_event import BaseAudioTranscriptionEvent from .start_audio_transcription_event import StartAudioTranscriptionEvent from .finish_audio_transcription_event import FinishAudioTranscriptionEvent +from .event_bus import event_bus __all__ = [ "BaseEvent", @@ -48,4 +49,5 @@ "BaseAudioTranscriptionEvent", "StartAudioTranscriptionEvent", "FinishAudioTranscriptionEvent", + "event_bus", ] diff --git a/griptape/mixins/event_publisher_mixin.py b/griptape/events/event_bus.py similarity index 59% rename from griptape/mixins/event_publisher_mixin.py rename to griptape/events/event_bus.py index 67a302ed6..a956f7deb 100644 --- a/griptape/mixins/event_publisher_mixin.py +++ b/griptape/events/event_bus.py @@ -9,8 +9,12 @@ @define -class EventPublisherMixin: - event_listeners: list[EventListener] = field(factory=list, kw_only=True) +class _EventBus: + _event_listeners: list[EventListener] = field(factory=list, kw_only=True, alias="_event_listeners") + + @property + def event_listeners(self) -> list[EventListener]: + return self._event_listeners def add_event_listeners(self, event_listeners: list[EventListener]) -> list[EventListener]: return [self.add_event_listener(event_listener) for event_listener in event_listeners] @@ -20,15 +24,21 @@ def remove_event_listeners(self, event_listeners: list[EventListener]) -> None: self.remove_event_listener(event_listener) def add_event_listener(self, event_listener: EventListener) -> EventListener: - if event_listener not in self.event_listeners: - self.event_listeners.append(event_listener) + if event_listener not in self._event_listeners: + self._event_listeners.append(event_listener) return event_listener def remove_event_listener(self, event_listener: EventListener) -> None: - if event_listener in self.event_listeners: - self.event_listeners.remove(event_listener) + if event_listener in self._event_listeners: + self._event_listeners.remove(event_listener) def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None: - for event_listener in self.event_listeners: + for event_listener in self._event_listeners: event_listener.publish_event(event, flush=flush) + + def clear_event_listeners(self) -> None: + self._event_listeners.clear() + + +event_bus = _EventBus() diff --git a/griptape/mixins/__init__.py b/griptape/mixins/__init__.py index 944027c59..d9eea53c2 100644 --- a/griptape/mixins/__init__.py +++ b/griptape/mixins/__init__.py @@ -4,7 +4,6 @@ from .rule_mixin import RuleMixin from .serializable_mixin import SerializableMixin from .media_artifact_file_output_mixin import BlobArtifactFileOutputMixin -from .event_publisher_mixin import EventPublisherMixin __all__ = [ "ActivityMixin", @@ -13,5 +12,4 @@ "RuleMixin", "BlobArtifactFileOutputMixin", "SerializableMixin", - "EventPublisherMixin", ] diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 079e0b741..d68457ebc 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -28,13 +28,11 @@ VectorStoreRetrievalRagModule, ) from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage -from griptape.events.finish_structure_run_event import FinishStructureRunEvent -from griptape.events.start_structure_run_event import StartStructureRunEvent +from griptape.events import FinishStructureRunEvent, StartStructureRunEvent, event_bus from griptape.memory import TaskMemory from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage -from griptape.mixins import EventPublisherMixin from griptape.utils import deprecation_warn if TYPE_CHECKING: @@ -44,7 +42,7 @@ @define -class Structure(ABC, EventPublisherMixin): +class Structure(ABC): LOGGER_NAME = "griptape" id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True) @@ -97,8 +95,6 @@ def __attrs_post_init__(self) -> None: if self.conversation_memory is not None: self.conversation_memory.structure = self - self.config.structure = self - tasks = self.tasks.copy() self.tasks.clear() self.add_tasks(*tasks) @@ -261,7 +257,7 @@ def before_run(self, args: Any) -> None: [task.reset() for task in self.tasks] - self.publish_event( + event_bus.publish_event( StartStructureRunEvent( structure_id=self.id, input_task_input=self.input_task.input, @@ -273,7 +269,7 @@ def before_run(self, args: Any) -> None: @observable def after_run(self) -> None: - self.publish_event( + event_bus.publish_event( FinishStructureRunEvent( structure_id=self.id, output_task_input=self.output_task.input, diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index cde59d0ef..d600c80a5 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -10,7 +10,7 @@ from griptape import utils from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.common import ToolAction -from griptape.events import FinishActionsSubtaskEvent, StartActionsSubtaskEvent +from griptape.events import FinishActionsSubtaskEvent, StartActionsSubtaskEvent, event_bus from griptape.mixins import ActionsSubtaskOriginMixin from griptape.tasks import BaseTask from griptape.utils import remove_null_values_in_dict_recursively @@ -91,7 +91,7 @@ def attach_to(self, parent_task: BaseTask) -> None: self.output = ErrorArtifact(f"ToolAction input parsing error: {e}", exception=e) def before_run(self) -> None: - self.structure.publish_event( + event_bus.publish_event( StartActionsSubtaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, @@ -157,7 +157,7 @@ def execute_action(self, action: ToolAction) -> tuple[str, BaseArtifact]: def after_run(self) -> None: response = self.output.to_text() if isinstance(self.output, BaseArtifact) else str(self.output) - self.structure.publish_event( + event_bus.publish_event( FinishActionsSubtaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 8c50e4df9..ade656f87 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -9,7 +9,7 @@ from attrs import Factory, define, field from griptape.artifacts import ErrorArtifact -from griptape.events import FinishTaskEvent, StartTaskEvent +from griptape.events import FinishTaskEvent, StartTaskEvent, event_bus if TYPE_CHECKING: from griptape.artifacts import BaseArtifact @@ -127,7 +127,7 @@ def is_executing(self) -> bool: def before_run(self) -> None: if self.structure is not None: - self.structure.publish_event( + event_bus.publish_event( StartTaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, @@ -139,7 +139,7 @@ def before_run(self) -> None: def after_run(self) -> None: if self.structure is not None: - self.structure.publish_event( + event_bus.publish_event( FinishTaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index bf33e5df8..fd64a0f52 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -7,10 +7,7 @@ from attrs import Attribute, Factory, define, field from griptape.artifacts.text_artifact import TextArtifact -from griptape.events.completion_chunk_event import CompletionChunkEvent -from griptape.events.event_listener import EventListener -from griptape.events.finish_prompt_event import FinishPromptEvent -from griptape.events.finish_structure_run_event import FinishStructureRunEvent +from griptape.events import CompletionChunkEvent, EventListener, FinishPromptEvent, FinishStructureRunEvent, event_bus if TYPE_CHECKING: from collections.abc import Iterator @@ -64,8 +61,8 @@ def event_handler(event: BaseEvent) -> None: handler=event_handler, event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent], ) - self.structure.add_event_listener(stream_event_listener) + event_bus.add_event_listener(stream_event_listener) self.structure.run(*args) - self.structure.remove_event_listener(stream_event_listener) + event_bus.remove_event_listener(stream_event_listener) diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index b9e3477e4..96a68628f 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -1,7 +1,6 @@ import pytest from griptape.config import StructureConfig -from griptape.structures import Agent class TestStructureConfig: @@ -61,37 +60,3 @@ def test_dot_update(self, config): config.prompt_driver.max_tokens = 10 assert config.prompt_driver.max_tokens == 10 - - def test_drivers(self, config): - assert config.drivers == [ - config.prompt_driver, - config.image_generation_driver, - config.image_query_driver, - config.embedding_driver, - config.vector_store_driver, - config.conversation_memory_driver, - config.text_to_speech_driver, - config.audio_transcription_driver, - ] - - def test_structure(self, config): - structure_1 = Agent( - config=config, - ) - - assert config.structure == structure_1 - assert config._event_listener is not None - for driver in config.drivers: - if driver is not None: - assert config._event_listener in driver.event_listeners - assert len(driver.event_listeners) == 1 - - structure_2 = Agent( - config=config, - ) - assert config.structure == structure_2 - assert config._event_listener is not None - for driver in config.drivers: - if driver is not None: - assert config._event_listener in driver.event_listeners - assert len(driver.event_listeners) == 1 diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py new file mode 100644 index 000000000..e462ede90 --- /dev/null +++ b/tests/unit/conftest.py @@ -0,0 +1,12 @@ +import pytest + +from griptape.events import event_bus + + +@pytest.fixture(autouse=True) +def mock_event_bus(): + event_bus.clear_event_listeners() + + yield event_bus + + event_bus.clear_event_listeners() diff --git a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py index 519e40f57..6fcab26e5 100644 --- a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py +++ b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py @@ -3,7 +3,7 @@ import pytest from griptape.artifacts import AudioArtifact -from griptape.events.event_listener import EventListener +from griptape.events import EventListener, event_bus from tests.mocks.mock_audio_transcription_driver import MockAudioTranscriptionDriver @@ -14,7 +14,7 @@ def driver(self): def test_run_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run( AudioArtifact( diff --git a/tests/unit/drivers/image_generation/test_base_image_generation_driver.py b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py index 7447b2c08..ab7b33ae8 100644 --- a/tests/unit/drivers/image_generation/test_base_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py @@ -3,6 +3,7 @@ import pytest from griptape.artifacts.image_artifact import ImageArtifact +from griptape.events import event_bus from griptape.events.event_listener import EventListener from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver @@ -14,7 +15,7 @@ def driver(self): def test_run_text_to_image_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run_text_to_image( ["foo", "bar"], @@ -30,7 +31,7 @@ def test_run_text_to_image_publish_events(self, driver): def test_run_image_variation_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_variation( ["foo", "bar"], @@ -52,7 +53,7 @@ def test_run_image_variation_publish_events(self, driver): def test_run_image_image_inpainting_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_inpainting( ["foo", "bar"], @@ -80,7 +81,7 @@ def test_run_image_image_inpainting_publish_events(self, driver): def test_run_image_image_outpainting_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_outpainting( ["foo", "bar"], diff --git a/tests/unit/drivers/image_query/test_base_image_query_driver.py b/tests/unit/drivers/image_query/test_base_image_query_driver.py index 14de15f2d..d8ba6b60f 100644 --- a/tests/unit/drivers/image_query/test_base_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_base_image_query_driver.py @@ -2,7 +2,7 @@ import pytest -from griptape.events.event_listener import EventListener +from griptape.events import EventListener, event_bus from tests.mocks.mock_image_query_driver import MockImageQueryDriver @@ -13,7 +13,7 @@ def driver(self): def test_query_publishes_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.query("foo", []) diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 2708b0a88..5b6b0c600 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -1,7 +1,7 @@ from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.common import Message, PromptStack from griptape.events import FinishPromptEvent, StartPromptEvent -from griptape.mixins import EventPublisherMixin +from griptape.events.event_bus import _EventBus from griptape.structures import Pipeline from griptape.tasks import PromptTask, ToolkitTask from tests.mocks.mock_failing_prompt_driver import MockFailingPromptDriver @@ -27,7 +27,7 @@ def test_run_via_pipeline_retries_failure(self): assert isinstance(pipeline.run().output_task.output, ErrorArtifact) def test_run_via_pipeline_publishes_events(self, mocker): - mock_publish_event = mocker.patch.object(EventPublisherMixin, "publish_event") + mock_publish_event = mocker.patch.object(_EventBus, "publish_event") driver = MockPromptDriver() pipeline = Pipeline(prompt_driver=driver) pipeline.add_task(PromptTask("test")) @@ -42,8 +42,7 @@ def test_run(self): assert isinstance(MockPromptDriver().run(PromptStack(messages=[])), Message) def test_run_with_stream(self): - pipeline = Pipeline() - result = MockPromptDriver(stream=True, event_listeners=pipeline.event_listeners).run(PromptStack(messages=[])) + result = MockPromptDriver(stream=True).run(PromptStack(messages=[])) assert isinstance(result, Message) assert result.value == "mock output" diff --git a/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py index 8af5dc827..19493aa0f 100644 --- a/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py +++ b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py @@ -2,7 +2,7 @@ import pytest -from griptape.events.event_listener import EventListener +from griptape.events import EventListener, event_bus from tests.mocks.mock_text_to_speech_driver import MockTextToSpeechDriver @@ -13,7 +13,7 @@ def driver(self): def test_text_to_audio_publish_events(self, driver): mock_handler = Mock() - driver.add_event_listener(EventListener(handler=mock_handler)) + event_bus.add_event_listener(EventListener(handler=mock_handler)) driver.run_text_to_audio( ["foo", "bar"], diff --git a/tests/unit/events/test_event_bus.py b/tests/unit/events/test_event_bus.py new file mode 100644 index 000000000..7eb87036a --- /dev/null +++ b/tests/unit/events/test_event_bus.py @@ -0,0 +1,45 @@ +from unittest.mock import Mock + +from griptape.events import EventListener, event_bus +from tests.mocks.mock_event import MockEvent + + +class TestEventBus: + def test_add_event_listeners(self): + event_bus.add_event_listeners([EventListener(), EventListener()]) + assert len(event_bus.event_listeners) == 2 + + def test_remove_event_listeners(self): + listeners = [EventListener(), EventListener()] + event_bus.add_event_listeners(listeners) + event_bus.remove_event_listeners(listeners) + assert len(event_bus.event_listeners) == 0 + + def test_add_event_listener(self): + event_bus.add_event_listener(EventListener()) + event_bus.add_event_listener(EventListener()) + + assert len(event_bus.event_listeners) == 2 + + def test_remove_event_listener(self): + listener = EventListener() + event_bus.add_event_listener(listener) + event_bus.remove_event_listener(listener) + + assert len(event_bus.event_listeners) == 0 + + def test_remove_unknown_event_listener(self): + event_bus.remove_event_listener(EventListener()) + + def test_publish_event(self): + # Given + mock_handler = Mock() + mock_handler.return_value = None + event_bus.add_event_listeners([EventListener(handler=mock_handler)]) + mock_event = MockEvent() + + # When + event_bus.publish_event(mock_event) + + # Then + mock_handler.assert_called_once_with(mock_event) diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index b245c2be9..50763e0c3 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -13,6 +13,7 @@ StartPromptEvent, StartStructureRunEvent, StartTaskEvent, + event_bus, ) from griptape.events.base_event import BaseEvent from griptape.structures import Pipeline @@ -37,7 +38,7 @@ def test_untyped_listeners(self, pipeline): event_handler_1 = Mock() event_handler_2 = Mock() - pipeline.event_listeners = [EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)] + event_bus.add_event_listeners([EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)]) # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() @@ -58,17 +59,19 @@ def test_typed_listeners(self, pipeline): finish_structure_run_event_handler = Mock() completion_chunk_handler = Mock() - pipeline.event_listeners = [ - EventListener(start_prompt_event_handler, event_types=[StartPromptEvent]), - EventListener(finish_prompt_event_handler, event_types=[FinishPromptEvent]), - EventListener(start_task_event_handler, event_types=[StartTaskEvent]), - EventListener(finish_task_event_handler, event_types=[FinishTaskEvent]), - EventListener(start_subtask_event_handler, event_types=[StartActionsSubtaskEvent]), - EventListener(finish_subtask_event_handler, event_types=[FinishActionsSubtaskEvent]), - EventListener(start_structure_run_event_handler, event_types=[StartStructureRunEvent]), - EventListener(finish_structure_run_event_handler, event_types=[FinishStructureRunEvent]), - EventListener(completion_chunk_handler, event_types=[CompletionChunkEvent]), - ] + event_bus.add_event_listeners( + [ + EventListener(start_prompt_event_handler, event_types=[StartPromptEvent]), + EventListener(finish_prompt_event_handler, event_types=[FinishPromptEvent]), + EventListener(start_task_event_handler, event_types=[StartTaskEvent]), + EventListener(finish_task_event_handler, event_types=[FinishTaskEvent]), + EventListener(start_subtask_event_handler, event_types=[StartActionsSubtaskEvent]), + EventListener(finish_subtask_event_handler, event_types=[FinishActionsSubtaskEvent]), + EventListener(start_structure_run_event_handler, event_types=[StartStructureRunEvent]), + EventListener(finish_structure_run_event_handler, event_types=[FinishStructureRunEvent]), + EventListener(completion_chunk_handler, event_types=[CompletionChunkEvent]), + ] + ) # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() @@ -86,25 +89,25 @@ def test_typed_listeners(self, pipeline): completion_chunk_handler.assert_called_once() def test_add_remove_event_listener(self, pipeline): - pipeline.event_listeners = [] + event_bus.clear_event_listeners() mock1 = Mock() mock2 = Mock() # duplicate event listeners will only get added once - event_listener_1 = pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + event_listener_1 = event_bus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + event_bus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - event_listener_3 = pipeline.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) - event_listener_4 = pipeline.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) + event_listener_3 = event_bus.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) + event_listener_4 = event_bus.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) - event_listener_5 = pipeline.add_event_listener(EventListener(mock2)) + event_listener_5 = event_bus.add_event_listener(EventListener(mock2)) - assert len(pipeline.event_listeners) == 4 + assert len(event_bus.event_listeners) == 4 - pipeline.remove_event_listener(event_listener_1) - pipeline.remove_event_listener(event_listener_3) - pipeline.remove_event_listener(event_listener_4) - pipeline.remove_event_listener(event_listener_5) - assert len(pipeline.event_listeners) == 0 + event_bus.remove_event_listener(event_listener_1) + event_bus.remove_event_listener(event_listener_3) + event_bus.remove_event_listener(event_listener_4) + event_bus.remove_event_listener(event_listener_5) + assert len(event_bus.event_listeners) == 0 def test_publish_event(self): mock_event_listener_driver = Mock() diff --git a/tests/unit/mixins/test_events_mixin.py b/tests/unit/mixins/test_events_mixin.py deleted file mode 100644 index 99f5541ba..000000000 --- a/tests/unit/mixins/test_events_mixin.py +++ /dev/null @@ -1,59 +0,0 @@ -from unittest.mock import Mock - -from griptape.events import EventListener -from griptape.mixins import EventPublisherMixin -from tests.mocks.mock_event import MockEvent - - -class TestEventsMixin: - def test_init(self): - assert EventPublisherMixin() - - def test_add_event_listeners(self): - mixin = EventPublisherMixin() - - mixin.add_event_listeners([EventListener(), EventListener()]) - assert len(mixin.event_listeners) == 2 - - def test_remove_event_listeners(self): - mixin = EventPublisherMixin() - - listeners = [EventListener(), EventListener()] - mixin.add_event_listeners(listeners) - mixin.remove_event_listeners(listeners) - assert len(mixin.event_listeners) == 0 - - def test_add_event_listener(self): - mixin = EventPublisherMixin() - - mixin.add_event_listener(EventListener()) - mixin.add_event_listener(EventListener()) - - assert len(mixin.event_listeners) == 2 - - def test_remove_event_listener(self): - mixin = EventPublisherMixin() - - listener = EventListener() - mixin.add_event_listener(listener) - mixin.remove_event_listener(listener) - - assert len(mixin.event_listeners) == 0 - - def test_remove_unknown_event_listener(self): - mixin = EventPublisherMixin() - - mixin.remove_event_listener(EventListener()) - - def test_publish_event(self): - # Given - mock_handler = Mock() - mock_handler.return_value = None - mixin = EventPublisherMixin(event_listeners=[EventListener(handler=mock_handler)]) - mock_event = MockEvent() - - # When - mixin.publish_event(mock_event) - - # Then - mock_handler.assert_called_once_with(mock_event) diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 4f4b43d40..aa402bb48 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -3,6 +3,7 @@ import pytest from griptape.artifacts import TextArtifact +from griptape.events import event_bus from griptape.events.event_listener import EventListener from griptape.structures import Agent, Workflow from griptape.tasks import ActionsSubtask @@ -15,11 +16,11 @@ class TestBaseTask: @pytest.fixture() def task(self): + event_bus.add_event_listeners([EventListener(handler=Mock())]) agent = Agent( prompt_driver=MockPromptDriver(), embedding_driver=MockEmbeddingDriver(), tools=[MockTool()], - event_listeners=[EventListener(handler=Mock())], ) agent.add_task(MockTask("foobar", max_meta_memory_entries=2)) @@ -117,4 +118,4 @@ def test_children_property_no_structure(self, task): def test_execute_publish_events(self, task): task.execute() - assert task.structure.event_listeners[0].handler.call_count == 2 + assert event_bus.event_listeners[0].handler.call_count == 2 From 8648aebf9d5ce3a1b47d98b6853cc956feb8e917 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 8 Aug 2024 14:57:34 -0700 Subject: [PATCH 205/238] Fix integration test (#1053) --- docs/griptape-framework/drivers/event-listener-drivers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index c3c92cfe1..773bed693 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -194,6 +194,7 @@ event_bus.add_event_listeners( ] ) +agent = Agent() agent.run( "Create a list of 8 questions for an interview with a science fiction author." ) From 4d71d3aafdd020af638e27247ef1bc2143a56271 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 9 Aug 2024 08:59:45 -0700 Subject: [PATCH 206/238] Refactor/doc snippets (#1054) --- .../actions/init-bare-environment/action.yml | 2 +- .github/actions/init-environment/action.yml | 2 +- .github/workflows/docs-integration-tests.yml | 22 +- Makefile | 2 +- docs/assets/css/extra.css | 5 - docs/examples/amazon-dynamodb-sessions.md | 35 +- docs/examples/load-and-query-pinecone.md | 43 +- docs/examples/load-query-and-chat-marqo.md | 44 +- docs/examples/multi-agent-workflow.md | 183 +----- docs/examples/multiple-agent-shared-memory.md | 60 +- docs/examples/query-webpage-astra-db.md | 64 +- docs/examples/query-webpage.md | 29 +- .../src/amazon_dynamodb_sessions_1.py | 34 + .../examples/src/load_and_query_pinecone_1.py | 44 ++ .../src/load_query_and_chat_marqo_1.py | 44 ++ docs/examples/src/multi_agent_workflow_1.py | 175 ++++++ .../src/multiple_agent_shared_memory_1.py | 61 ++ docs/examples/src/query_webpage_1.py | 20 + docs/examples/src/query_webpage_astra_db_1.py | 57 ++ docs/examples/src/talk_to_a_pdf_1.py | 42 ++ docs/examples/src/talk_to_a_video_1.py | 26 + docs/examples/src/talk_to_a_webpage_1.py | 51 ++ docs/examples/src/talk_to_redshift_1.py | 43 ++ docs/examples/talk-to-a-pdf.md | 53 +- docs/examples/talk-to-a-video.md | 26 +- docs/examples/talk-to-a-webpage.md | 67 +- docs/examples/talk-to-redshift.md | 42 +- docs/griptape-framework/data/chunkers.md | 9 +- docs/griptape-framework/data/loaders.md | 134 +--- docs/griptape-framework/data/src/__init__.py | 0 .../griptape-framework/data/src/chunkers_1.py | 9 + docs/griptape-framework/data/src/loaders_1.py | 19 + .../griptape-framework/data/src/loaders_10.py | 10 + docs/griptape-framework/data/src/loaders_2.py | 8 + docs/griptape-framework/data/src/loaders_3.py | 16 + docs/griptape-framework/data/src/loaders_4.py | 13 + docs/griptape-framework/data/src/loaders_5.py | 12 + docs/griptape-framework/data/src/loaders_6.py | 5 + docs/griptape-framework/data/src/loaders_7.py | 9 + docs/griptape-framework/data/src/loaders_8.py | 16 + docs/griptape-framework/data/src/loaders_9.py | 7 + .../drivers/audio-transcription-drivers.md | 19 +- .../drivers/conversation-memory-drivers.md | 49 +- .../drivers/embedding-drivers.md | 125 +--- .../drivers/event-listener-drivers.md | 210 +------ .../drivers/image-generation-drivers.md | 212 +------ .../drivers/image-query-drivers.md | 108 +--- .../drivers/observability-drivers.md | 30 +- .../drivers/prompt-drivers.md | 302 +-------- .../griptape-framework/drivers/sql-drivers.md | 41 +- .../src/audio_transcription_drivers_1.py | 15 + .../src/conversation_memory_drivers_1.py | 9 + .../src/conversation_memory_drivers_2.py | 19 + .../src/conversation_memory_drivers_3.py | 20 + .../drivers/src/embedding_drivers_1.py | 6 + .../drivers/src/embedding_drivers_10.py | 17 + .../drivers/src/embedding_drivers_2.py | 11 + .../drivers/src/embedding_drivers_3.py | 6 + .../drivers/src/embedding_drivers_4.py | 6 + .../drivers/src/embedding_drivers_5.py | 18 + .../drivers/src/embedding_drivers_6.py | 10 + .../drivers/src/embedding_drivers_7.py | 13 + .../drivers/src/embedding_drivers_8.py | 10 + .../drivers/src/embedding_drivers_9.py | 14 + .../drivers/src/event_listener_drivers_1.py | 32 + .../drivers/src/event_listener_drivers_2.py | 14 + .../drivers/src/event_listener_drivers_3.py | 31 + .../drivers/src/event_listener_drivers_4.py | 26 + .../drivers/src/event_listener_drivers_5.py | 17 + .../drivers/src/event_listener_drivers_6.py | 20 + .../drivers/src/event_listener_drivers_7.py | 26 + .../drivers/src/image_generation_drivers_1.py | 18 + .../drivers/src/image_generation_drivers_2.py | 23 + .../drivers/src/image_generation_drivers_3.py | 21 + .../drivers/src/image_generation_drivers_4.py | 23 + .../drivers/src/image_generation_drivers_5.py | 23 + .../drivers/src/image_generation_drivers_6.py | 19 + .../drivers/src/image_generation_drivers_7.py | 21 + .../drivers/src/image_generation_drivers_8.py | 30 + .../drivers/src/image_generation_drivers_9.py | 31 + .../drivers/src/image_query_drivers_1.py | 18 + .../drivers/src/image_query_drivers_2.py | 22 + .../drivers/src/image_query_drivers_3.py | 18 + .../drivers/src/image_query_drivers_4.py | 22 + .../drivers/src/image_query_drivers_5.py | 24 + .../drivers/src/observability_drivers_1.py | 10 + .../drivers/src/observability_drivers_2.py | 14 + .../drivers/src/prompt_drivers_1.py | 14 + .../drivers/src/prompt_drivers_10.py | 14 + .../drivers/src/prompt_drivers_11.py | 29 + .../drivers/src/prompt_drivers_12.py | 16 + .../drivers/src/prompt_drivers_13.py | 20 + .../drivers/src/prompt_drivers_14.py | 18 + .../drivers/src/prompt_drivers_2.py | 20 + .../drivers/src/prompt_drivers_3.py | 22 + .../drivers/src/prompt_drivers_4.py | 15 + .../drivers/src/prompt_drivers_5.py | 25 + .../drivers/src/prompt_drivers_6.py | 16 + .../drivers/src/prompt_drivers_7.py | 16 + .../drivers/src/prompt_drivers_8.py | 16 + .../drivers/src/prompt_drivers_9.py | 29 + .../drivers/src/sql_drivers_1.py | 5 + .../drivers/src/sql_drivers_2.py | 15 + .../drivers/src/sql_drivers_3.py | 22 + .../drivers/src/structure_run_drivers_1.py | 47 ++ .../drivers/src/structure_run_drivers_2.py | 41 ++ .../drivers/src/text_to_speech_drivers_1.py | 20 + .../drivers/src/text_to_speech_drivers_2.py | 14 + .../drivers/src/vector_store_drivers_1.py | 24 + .../drivers/src/vector_store_drivers_10.py | 41 ++ .../drivers/src/vector_store_drivers_11.py | 36 ++ .../drivers/src/vector_store_drivers_2.py | 17 + .../drivers/src/vector_store_drivers_3.py | 30 + .../drivers/src/vector_store_drivers_4.py | 39 ++ .../drivers/src/vector_store_drivers_5.py | 45 ++ .../drivers/src/vector_store_drivers_6.py | 45 ++ .../drivers/src/vector_store_drivers_7.py | 35 ++ .../drivers/src/vector_store_drivers_8.py | 36 ++ .../drivers/src/vector_store_drivers_9.py | 42 ++ .../drivers/src/web_scraper_drivers_1.py | 20 + .../drivers/src/web_scraper_drivers_2.py | 5 + .../drivers/src/web_scraper_drivers_3.py | 15 + .../drivers/src/web_scraper_drivers_4.py | 5 + .../drivers/src/web_search_drivers_1.py | 10 + .../drivers/src/web_search_drivers_2.py | 18 + .../drivers/src/web_search_drivers_3.py | 5 + .../drivers/structure-run-drivers.md | 87 +-- .../drivers/text-to-speech-drivers.md | 37 +- .../drivers/vector-store-drivers.md | 358 +---------- .../drivers/web-scraper-drivers.md | 52 +- .../drivers/web-search-drivers.md | 34 +- .../engines/audio-engines.md | 37 +- .../engines/extraction-engines.md | 47 +- .../engines/image-generation-engines.md | 127 +--- .../engines/image-query-engines.md | 18 +- .../griptape-framework/engines/rag-engines.md | 61 +- .../engines/src/__init__.py | 0 .../engines/src/audio_engines_1.py | 18 + .../engines/src/audio_engines_2.py | 13 + .../engines/src/extraction_engines_1.py | 24 + .../engines/src/extraction_engines_2.py | 27 + .../engines/src/image_generation_engines_1.py | 23 + .../engines/src/image_generation_engines_2.py | 17 + .../engines/src/image_generation_engines_3.py | 23 + .../engines/src/image_generation_engines_4.py | 26 + .../engines/src/image_generation_engines_5.py | 26 + .../engines/src/image_query_engines_1.py | 13 + .../engines/src/rag_engines_1.py | 36 ++ .../engines/src/summary_engines_1.py | 20 + .../engines/summary-engines.md | 18 +- docs/griptape-framework/index.md | 54 +- docs/griptape-framework/misc/events.md | 145 +---- docs/griptape-framework/misc/src/__init__.py | 0 docs/griptape-framework/misc/src/events_1.py | 37 ++ docs/griptape-framework/misc/src/events_2.py | 22 + docs/griptape-framework/misc/src/events_3.py | 30 + docs/griptape-framework/misc/src/events_4.py | 16 + docs/griptape-framework/misc/src/events_5.py | 27 + docs/griptape-framework/misc/src/events_6.py | 16 + .../misc/src/tokenizers_1.py | 7 + .../misc/src/tokenizers_2.py | 11 + .../misc/src/tokenizers_3.py | 7 + .../misc/src/tokenizers_4.py | 9 + .../misc/src/tokenizers_5.py | 10 + .../misc/src/tokenizers_6.py | 7 + .../misc/src/tokenizers_7.py | 7 + docs/griptape-framework/misc/tokenizers.md | 70 +-- docs/griptape-framework/src/__init__.py | 0 docs/griptape-framework/src/index_1.py | 5 + docs/griptape-framework/src/index_2.py | 4 + docs/griptape-framework/src/index_3.py | 9 + docs/griptape-framework/src/index_4.py | 20 + docs/griptape-framework/structures/agents.md | 28 +- docs/griptape-framework/structures/config.md | 100 +-- .../structures/conversation-memory.md | 51 +- .../structures/observability.md | 43 +- .../structures/pipelines.md | 15 +- .../griptape-framework/structures/rulesets.md | 103 +--- .../structures/src/__init__.py | 0 .../structures/src/agents_1.py | 7 + .../structures/src/agents_2.py | 11 + .../structures/src/config_1.py | 6 + .../structures/src/config_2.py | 16 + .../structures/src/config_3.py | 16 + .../structures/src/config_4.py | 4 + .../structures/src/config_5.py | 4 + .../structures/src/config_6.py | 6 + .../structures/src/config_7.py | 14 + .../structures/src/config_8.py | 28 + .../structures/src/conversation_memory_1.py | 6 + .../structures/src/conversation_memory_2.py | 3 + .../structures/src/conversation_memory_3.py | 8 + .../structures/src/conversation_memory_4.py | 13 + .../structures/src/conversation_memory_5.py | 11 + .../structures/src/observability_1.py | 10 + .../structures/src/observability_2.py | 29 + .../structures/src/pipelines_1.py | 13 + .../structures/src/rulesets_1.py | 30 + .../structures/src/rulesets_2.py | 16 + .../structures/src/rulesets_3.py | 32 + .../structures/src/rulesets_4.py | 16 + .../structures/src/task_memory_1.py | 7 + .../structures/src/task_memory_2.py | 7 + .../structures/src/task_memory_3.py | 7 + .../structures/src/task_memory_4.py | 9 + .../structures/src/task_memory_5.py | 13 + .../structures/src/task_memory_6.py | 54 ++ .../structures/src/task_memory_7.py | 12 + .../structures/src/task_memory_8.py | 14 + .../structures/src/task_memory_9.py | 9 + .../structures/src/tasks_1.py | 12 + .../structures/src/tasks_10.py | 22 + .../structures/src/tasks_11.py | 30 + .../structures/src/tasks_12.py | 35 ++ .../structures/src/tasks_13.py | 35 ++ .../structures/src/tasks_14.py | 37 ++ .../structures/src/tasks_15.py | 34 + .../structures/src/tasks_16.py | 134 ++++ .../structures/src/tasks_17.py | 20 + .../structures/src/tasks_18.py | 17 + .../structures/src/tasks_2.py | 10 + .../structures/src/tasks_3.py | 10 + .../structures/src/tasks_4.py | 13 + .../structures/src/tasks_5.py | 10 + .../structures/src/tasks_6.py | 29 + .../structures/src/tasks_7.py | 29 + .../structures/src/tasks_8.py | 24 + .../structures/src/tasks_9.py | 39 ++ .../structures/src/workflows_1.py | 34 + .../structures/src/workflows_2.py | 14 + .../structures/src/workflows_3.py | 16 + .../structures/src/workflows_4.py | 19 + .../structures/src/workflows_5.py | 17 + .../structures/src/workflows_6.py | 17 + .../structures/src/workflows_7.py | 18 + .../structures/src/workflows_8.py | 19 + .../structures/src/workflows_9.py | 23 + .../structures/task-memory.md | 144 +---- docs/griptape-framework/structures/tasks.md | 580 +----------------- .../structures/workflows.md | 178 +----- docs/griptape-framework/tools/index.md | 16 +- docs/griptape-framework/tools/src/__init__.py | 0 docs/griptape-framework/tools/src/index_1.py | 14 + docs/griptape-tools/custom-tools/index.md | 40 +- .../custom-tools/src/index_1.py | 20 + .../custom-tools/src/index_2.py | 28 + docs/griptape-tools/index.md | 28 +- .../audio-transcription-client.md | 21 +- .../official-tools/aws-iam-client.md | 15 +- .../official-tools/aws-s3-client.md | 18 +- .../official-tools/calculator.md | 11 +- .../griptape-tools/official-tools/computer.md | 24 +- .../official-tools/date-time.md | 13 +- .../official-tools/email-client.md | 11 +- .../official-tools/file-manager.md | 21 +- .../official-tools/google-cal-client.md | 32 +- .../official-tools/google-docs-client.md | 31 +- .../official-tools/google-drive-client.md | 31 +- .../official-tools/google-gmail-client.md | 32 +- .../griptape-cloud-knowledge-base-client.md | 18 +- .../official-tools/image-query-client.md | 23 +- .../inpainting-image-generation-client.md | 27 +- .../official-tools/openweather-client.md | 14 +- .../outpainting-image-generation-client.md | 27 +- .../prompt-image-generation-client.md | 26 +- .../official-tools/rag-client.md | 48 +- .../official-tools/rest-api-client.md | 146 +---- .../official-tools/sql-client.md | 30 +- .../src/audio_transcription_client_1.py | 17 + .../official-tools/src/aws_iam_client_1.py | 13 + .../official-tools/src/aws_s3_client_1.py | 13 + .../official-tools/src/calculator_1.py | 8 + .../official-tools/src/computer_1.py | 19 + .../official-tools/src/date_time_1.py | 8 + .../official-tools/src/email_client_1.py | 11 + .../official-tools/src/file_manager_1.py | 19 + .../official-tools/src/google_cal_client_1.py | 29 + .../src/google_docs_client_1.py | 29 + .../src/google_drive_client_1.py | 29 + .../src/google_gmail_client_1.py | 30 + .../griptape_cloud_knowledge_base_client_1.py | 18 + .../src/image_query_client_1.py | 20 + .../inpainting_image_generation_client_1.py | 26 + .../src/openweather_client_1.py | 14 + .../outpainting_image_generation_client_1.py | 26 + .../src/prompt_image_generation_client_1.py | 23 + .../official-tools/src/rag_client_1.py | 37 ++ .../official-tools/src/rest_api_client_1.py | 143 +++++ .../official-tools/src/sql_client_1.py | 28 + .../src/structure_run_client_1.py | 24 + .../src/task_memory_client_1.py | 4 + .../src/text_to_speech_client_1.py | 20 + .../variation_image_generation_client_1.py | 27 + .../variation_image_generation_client_2.py | 42 ++ .../src/vector_store_client_1.py | 25 + .../official-tools/src/web_scraper_1.py | 6 + .../official-tools/src/web_search_1.py | 22 + .../official-tools/src/web_search_2.py | 28 + .../official-tools/structure-run-client.md | 25 +- .../official-tools/task-memory-client.md | 6 +- .../official-tools/text-to-speech-client.md | 24 +- .../variation-image-generation-client.md | 72 +-- .../official-tools/vector-store-client.md | 30 +- .../official-tools/web-scraper.md | 11 +- .../official-tools/web-search.md | 52 +- docs/griptape-tools/src/index_1.py | 23 + .../extraction/json_extraction_engine.py | 2 +- .../tasks/inpainting_image_generation_task.py | 2 +- .../outpainting_image_generation_task.py | 2 +- .../tasks/prompt_image_generation_task.py | 4 +- .../tasks/variation_image_generation_task.py | 2 +- griptape/utils/conversation.py | 23 +- griptape/utils/token_counter.py | 6 +- pyproject.toml | 3 + tests/integration/test_code_blocks.py | 51 +- tests/utils/code_blocks.py | 83 --- 316 files changed, 5118 insertions(+), 5089 deletions(-) create mode 100644 docs/examples/src/amazon_dynamodb_sessions_1.py create mode 100644 docs/examples/src/load_and_query_pinecone_1.py create mode 100644 docs/examples/src/load_query_and_chat_marqo_1.py create mode 100644 docs/examples/src/multi_agent_workflow_1.py create mode 100644 docs/examples/src/multiple_agent_shared_memory_1.py create mode 100644 docs/examples/src/query_webpage_1.py create mode 100644 docs/examples/src/query_webpage_astra_db_1.py create mode 100644 docs/examples/src/talk_to_a_pdf_1.py create mode 100644 docs/examples/src/talk_to_a_video_1.py create mode 100644 docs/examples/src/talk_to_a_webpage_1.py create mode 100644 docs/examples/src/talk_to_redshift_1.py create mode 100644 docs/griptape-framework/data/src/__init__.py create mode 100644 docs/griptape-framework/data/src/chunkers_1.py create mode 100644 docs/griptape-framework/data/src/loaders_1.py create mode 100644 docs/griptape-framework/data/src/loaders_10.py create mode 100644 docs/griptape-framework/data/src/loaders_2.py create mode 100644 docs/griptape-framework/data/src/loaders_3.py create mode 100644 docs/griptape-framework/data/src/loaders_4.py create mode 100644 docs/griptape-framework/data/src/loaders_5.py create mode 100644 docs/griptape-framework/data/src/loaders_6.py create mode 100644 docs/griptape-framework/data/src/loaders_7.py create mode 100644 docs/griptape-framework/data/src/loaders_8.py create mode 100644 docs/griptape-framework/data/src/loaders_9.py create mode 100644 docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/conversation_memory_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/conversation_memory_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_10.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_6.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_7.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_8.py create mode 100644 docs/griptape-framework/drivers/src/embedding_drivers_9.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_6.py create mode 100644 docs/griptape-framework/drivers/src/event_listener_drivers_7.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_6.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_7.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_8.py create mode 100644 docs/griptape-framework/drivers/src/image_generation_drivers_9.py create mode 100644 docs/griptape-framework/drivers/src/image_query_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/image_query_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/image_query_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/image_query_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/image_query_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/observability_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/observability_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_10.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_11.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_12.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_13.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_14.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_6.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_7.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_8.py create mode 100644 docs/griptape-framework/drivers/src/prompt_drivers_9.py create mode 100644 docs/griptape-framework/drivers/src/sql_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/sql_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/sql_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/structure_run_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/structure_run_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_10.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_11.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_5.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_6.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_7.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_8.py create mode 100644 docs/griptape-framework/drivers/src/vector_store_drivers_9.py create mode 100644 docs/griptape-framework/drivers/src/web_scraper_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/web_scraper_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/web_scraper_drivers_3.py create mode 100644 docs/griptape-framework/drivers/src/web_scraper_drivers_4.py create mode 100644 docs/griptape-framework/drivers/src/web_search_drivers_1.py create mode 100644 docs/griptape-framework/drivers/src/web_search_drivers_2.py create mode 100644 docs/griptape-framework/drivers/src/web_search_drivers_3.py create mode 100644 docs/griptape-framework/engines/src/__init__.py create mode 100644 docs/griptape-framework/engines/src/audio_engines_1.py create mode 100644 docs/griptape-framework/engines/src/audio_engines_2.py create mode 100644 docs/griptape-framework/engines/src/extraction_engines_1.py create mode 100644 docs/griptape-framework/engines/src/extraction_engines_2.py create mode 100644 docs/griptape-framework/engines/src/image_generation_engines_1.py create mode 100644 docs/griptape-framework/engines/src/image_generation_engines_2.py create mode 100644 docs/griptape-framework/engines/src/image_generation_engines_3.py create mode 100644 docs/griptape-framework/engines/src/image_generation_engines_4.py create mode 100644 docs/griptape-framework/engines/src/image_generation_engines_5.py create mode 100644 docs/griptape-framework/engines/src/image_query_engines_1.py create mode 100644 docs/griptape-framework/engines/src/rag_engines_1.py create mode 100644 docs/griptape-framework/engines/src/summary_engines_1.py create mode 100644 docs/griptape-framework/misc/src/__init__.py create mode 100644 docs/griptape-framework/misc/src/events_1.py create mode 100644 docs/griptape-framework/misc/src/events_2.py create mode 100644 docs/griptape-framework/misc/src/events_3.py create mode 100644 docs/griptape-framework/misc/src/events_4.py create mode 100644 docs/griptape-framework/misc/src/events_5.py create mode 100644 docs/griptape-framework/misc/src/events_6.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_1.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_2.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_3.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_4.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_5.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_6.py create mode 100644 docs/griptape-framework/misc/src/tokenizers_7.py create mode 100644 docs/griptape-framework/src/__init__.py create mode 100644 docs/griptape-framework/src/index_1.py create mode 100644 docs/griptape-framework/src/index_2.py create mode 100644 docs/griptape-framework/src/index_3.py create mode 100644 docs/griptape-framework/src/index_4.py create mode 100644 docs/griptape-framework/structures/src/__init__.py create mode 100644 docs/griptape-framework/structures/src/agents_1.py create mode 100644 docs/griptape-framework/structures/src/agents_2.py create mode 100644 docs/griptape-framework/structures/src/config_1.py create mode 100644 docs/griptape-framework/structures/src/config_2.py create mode 100644 docs/griptape-framework/structures/src/config_3.py create mode 100644 docs/griptape-framework/structures/src/config_4.py create mode 100644 docs/griptape-framework/structures/src/config_5.py create mode 100644 docs/griptape-framework/structures/src/config_6.py create mode 100644 docs/griptape-framework/structures/src/config_7.py create mode 100644 docs/griptape-framework/structures/src/config_8.py create mode 100644 docs/griptape-framework/structures/src/conversation_memory_1.py create mode 100644 docs/griptape-framework/structures/src/conversation_memory_2.py create mode 100644 docs/griptape-framework/structures/src/conversation_memory_3.py create mode 100644 docs/griptape-framework/structures/src/conversation_memory_4.py create mode 100644 docs/griptape-framework/structures/src/conversation_memory_5.py create mode 100644 docs/griptape-framework/structures/src/observability_1.py create mode 100644 docs/griptape-framework/structures/src/observability_2.py create mode 100644 docs/griptape-framework/structures/src/pipelines_1.py create mode 100644 docs/griptape-framework/structures/src/rulesets_1.py create mode 100644 docs/griptape-framework/structures/src/rulesets_2.py create mode 100644 docs/griptape-framework/structures/src/rulesets_3.py create mode 100644 docs/griptape-framework/structures/src/rulesets_4.py create mode 100644 docs/griptape-framework/structures/src/task_memory_1.py create mode 100644 docs/griptape-framework/structures/src/task_memory_2.py create mode 100644 docs/griptape-framework/structures/src/task_memory_3.py create mode 100644 docs/griptape-framework/structures/src/task_memory_4.py create mode 100644 docs/griptape-framework/structures/src/task_memory_5.py create mode 100644 docs/griptape-framework/structures/src/task_memory_6.py create mode 100644 docs/griptape-framework/structures/src/task_memory_7.py create mode 100644 docs/griptape-framework/structures/src/task_memory_8.py create mode 100644 docs/griptape-framework/structures/src/task_memory_9.py create mode 100644 docs/griptape-framework/structures/src/tasks_1.py create mode 100644 docs/griptape-framework/structures/src/tasks_10.py create mode 100644 docs/griptape-framework/structures/src/tasks_11.py create mode 100644 docs/griptape-framework/structures/src/tasks_12.py create mode 100644 docs/griptape-framework/structures/src/tasks_13.py create mode 100644 docs/griptape-framework/structures/src/tasks_14.py create mode 100644 docs/griptape-framework/structures/src/tasks_15.py create mode 100644 docs/griptape-framework/structures/src/tasks_16.py create mode 100644 docs/griptape-framework/structures/src/tasks_17.py create mode 100644 docs/griptape-framework/structures/src/tasks_18.py create mode 100644 docs/griptape-framework/structures/src/tasks_2.py create mode 100644 docs/griptape-framework/structures/src/tasks_3.py create mode 100644 docs/griptape-framework/structures/src/tasks_4.py create mode 100644 docs/griptape-framework/structures/src/tasks_5.py create mode 100644 docs/griptape-framework/structures/src/tasks_6.py create mode 100644 docs/griptape-framework/structures/src/tasks_7.py create mode 100644 docs/griptape-framework/structures/src/tasks_8.py create mode 100644 docs/griptape-framework/structures/src/tasks_9.py create mode 100644 docs/griptape-framework/structures/src/workflows_1.py create mode 100644 docs/griptape-framework/structures/src/workflows_2.py create mode 100644 docs/griptape-framework/structures/src/workflows_3.py create mode 100644 docs/griptape-framework/structures/src/workflows_4.py create mode 100644 docs/griptape-framework/structures/src/workflows_5.py create mode 100644 docs/griptape-framework/structures/src/workflows_6.py create mode 100644 docs/griptape-framework/structures/src/workflows_7.py create mode 100644 docs/griptape-framework/structures/src/workflows_8.py create mode 100644 docs/griptape-framework/structures/src/workflows_9.py create mode 100644 docs/griptape-framework/tools/src/__init__.py create mode 100644 docs/griptape-framework/tools/src/index_1.py create mode 100644 docs/griptape-tools/custom-tools/src/index_1.py create mode 100644 docs/griptape-tools/custom-tools/src/index_2.py create mode 100644 docs/griptape-tools/official-tools/src/audio_transcription_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/aws_iam_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/aws_s3_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/calculator_1.py create mode 100644 docs/griptape-tools/official-tools/src/computer_1.py create mode 100644 docs/griptape-tools/official-tools/src/date_time_1.py create mode 100644 docs/griptape-tools/official-tools/src/email_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/file_manager_1.py create mode 100644 docs/griptape-tools/official-tools/src/google_cal_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/google_docs_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/google_drive_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/google_gmail_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/image_query_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/openweather_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/rag_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/rest_api_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/sql_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/structure_run_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/task_memory_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/text_to_speech_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py create mode 100644 docs/griptape-tools/official-tools/src/vector_store_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/web_scraper_1.py create mode 100644 docs/griptape-tools/official-tools/src/web_search_1.py create mode 100644 docs/griptape-tools/official-tools/src/web_search_2.py create mode 100644 docs/griptape-tools/src/index_1.py delete mode 100644 tests/utils/code_blocks.py diff --git a/.github/actions/init-bare-environment/action.yml b/.github/actions/init-bare-environment/action.yml index 8cdee6027..01c4f2eae 100644 --- a/.github/actions/init-bare-environment/action.yml +++ b/.github/actions/init-bare-environment/action.yml @@ -27,7 +27,7 @@ runs: - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root --with test --with dev + run: poetry install --no-interaction --with test --with dev shell: bash - name: Activate venv diff --git a/.github/actions/init-environment/action.yml b/.github/actions/init-environment/action.yml index 0d9ad94fc..4b849dfe6 100644 --- a/.github/actions/init-environment/action.yml +++ b/.github/actions/init-environment/action.yml @@ -27,7 +27,7 @@ runs: - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root --with test --with dev --all-extras + run: poetry install --no-interaction --with test --with dev --with docs --all-extras shell: bash - name: Activate venv diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 4418f0b12..33ebdd562 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -1,12 +1,8 @@ name: Docs Integration Tests on: - pull_request_review: - types: [submitted] push: - branches: - - main - - dev + branches: [ "main", "dev" ] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -14,7 +10,6 @@ concurrency: jobs: test: - if: github.event.review.state == 'APPROVED' || github.event_name == 'push' runs-on: ubuntu-latest strategy: fail-fast: false @@ -145,22 +140,7 @@ jobs: uses: actions/checkout@v3 - name: Init environment uses: ./.github/actions/init-environment - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v44 - if: github.event_name == 'pull_request_review' - with: - files: | - **.md - - name: List all changed files - env: - ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} - run: | - for file in ${ALL_CHANGED_FILES}; do - echo "$file was changed" - done - name: Run integration tests - if: steps.changed-files.outputs.any_changed == 'true' || github.event_name == 'push' run: make test/integration env: DOCS_ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files || '' }} diff --git a/Makefile b/Makefile index 837a4b155..f1db966f0 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ check/lint: .PHONY: check/types check/types: - @poetry run pyright griptape/ + @poetry run pyright griptape/ docs/**/src/** .PHONY: check/spell check/spell: diff --git a/docs/assets/css/extra.css b/docs/assets/css/extra.css index 17c7b4335..cbc902c49 100644 --- a/docs/assets/css/extra.css +++ b/docs/assets/css/extra.css @@ -5,8 +5,3 @@ .md-typeset table:not([class]) { display: table; } - -/* Hide the code block title since we're using it for other purposes.*/ -.filename { - display: none !important -} diff --git a/docs/examples/amazon-dynamodb-sessions.md b/docs/examples/amazon-dynamodb-sessions.md index aa4050ab9..d9a6e4bdd 100644 --- a/docs/examples/amazon-dynamodb-sessions.md +++ b/docs/examples/amazon-dynamodb-sessions.md @@ -7,40 +7,7 @@ In this example, we will show you how to use the [AmazonDynamoDbConversationMemo This code implements the idea of a generic "Session" that represents a Conversation Memory entry. For example, a "Session" could be used to represent an individual user's conversation, or a group conversation thread. ```python -import sys -import os -import argparse - -import boto3 -from griptape.drivers import ( - AmazonDynamoDbConversationMemoryDriver, -) -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -if len(sys.argv) > 2: - input = sys.argv[1] - session_id = sys.argv[2] -else: - input = "Hello!" # Default input - session_id = "session-id-123" # Default session ID - -structure = Agent( - conversation_memory=ConversationMemory( - driver=AmazonDynamoDbConversationMemoryDriver( - session=boto3.Session( - aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], - aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], - ), - table_name=os.environ["DYNAMODB_TABLE_NAME"], # The name of the DynamoDB table - partition_key="id", # The name of the partition key - partition_key_value=session_id, # The value of the partition key - value_attribute_key="value", # The key in the DynamoDB item that stores the memory value - ) - ) -) - -print(structure.run(input).output_task.output.value) +--8<-- "docs/examples/src/amazon_dynamodb_sessions_1.py" ``` Conversation Memory for an individual user: diff --git a/docs/examples/load-and-query-pinecone.md b/docs/examples/load-and-query-pinecone.md index dbe163f8e..549268ea0 100644 --- a/docs/examples/load-and-query-pinecone.md +++ b/docs/examples/load-and-query-pinecone.md @@ -1,44 +1,3 @@ ```python -import hashlib -import os -import json -from urllib.request import urlopen -from griptape.drivers import PineconeVectorStoreDriver, OpenAiEmbeddingDriver - -def load_data(driver: PineconeVectorStoreDriver) -> None: - response = urlopen( - "https://raw.githubusercontent.com/wedeploy-examples/" - "supermarket-web-example/master/products.json" - ) - - for product in json.loads(response.read()): - driver.upsert_text( - product["description"], - vector_id=hashlib.md5(product["title"].encode()).hexdigest(), - meta={ - "title": product["title"], - "description": product["description"], - "type": product["type"], - "price": product["price"], - "rating": product["rating"], - }, - namespace="supermarket-products", - ) - -vector_driver = PineconeVectorStoreDriver( - api_key=os.environ["PINECONE_API_KEY"], - environment=os.environ["PINECONE_ENVIRONMENT"], - index_name=os.environ["PINECONE_INDEX_NAME"], - embedding_driver=OpenAiEmbeddingDriver() -) - -load_data(vector_driver) - -result = vector_driver.query( - "fruit", - count=3, - filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, - namespace="supermarket-products", -) -print(result) +--8<-- "docs/examples/src/load_and_query_pinecone_1.py" ``` diff --git a/docs/examples/load-query-and-chat-marqo.md b/docs/examples/load-query-and-chat-marqo.md index fb5906e9e..882bc6228 100644 --- a/docs/examples/load-query-and-chat-marqo.md +++ b/docs/examples/load-query-and-chat-marqo.md @@ -1,43 +1,3 @@ -```python title="PYTEST_IGNORE" -import os -from griptape import utils -from griptape.drivers import MarqoVectorStoreDriver -from griptape.loaders import WebLoader -from griptape.structures import Agent -from griptape.tools import VectorStoreClient -from griptape.drivers import OpenAiEmbeddingDriver - -# Define the namespace -namespace = "griptape-ai" - -# # Initialize the vector store driver -vector_store = MarqoVectorStoreDriver( - api_key=os.environ["MARQO_API_KEY"], - url=os.environ["MARQO_URL"], - index=os.environ["MARQO_INDEX_NAME"], - embedding_driver=OpenAiEmbeddingDriver() -) - -# Initialize the knowledge base tool -vector_store_tool = VectorStoreClient( - description="Contains information about the Griptape Framework from www.griptape.ai", - namespace=namespace, - vector_store_driver=vector_store -) - -# Load artifacts from the web -artifacts = WebLoader().load("https://www.griptape.ai") - -# Upsert the artifacts into the vector store -vector_store.upsert_text_artifacts( - { - namespace: artifacts, - } -) - -# Initialize the agent -agent = Agent(tools=[vector_store_tool]) - -# Start the chat -utils.Chat(agent).start() +```python +--8<-- "docs/examples/src/load_query_and_chat_marqo_1.py" ``` diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md index 4a26625b3..8763a0a3a 100644 --- a/docs/examples/multi-agent-workflow.md +++ b/docs/examples/multi-agent-workflow.md @@ -5,186 +5,5 @@ Additionally, this architecture opens us up to using services such as [Griptape ```python -import os - -from griptape.drivers import WebhookEventListenerDriver, LocalStructureRunDriver, GoogleWebSearchDriver -from griptape.events import EventListener, FinishStructureRunEvent -from griptape.rules import Rule, Ruleset -from griptape.structures import Agent, Workflow -from griptape.tasks import PromptTask, StructureRunTask -from griptape.tools import ( - TaskMemoryClient, - WebScraper, - WebSearch, -) - -WRITERS = [ - { - "role": "Travel Adventure Blogger", - "goal": "Inspire wanderlust with stories of hidden gems and exotic locales", - "backstory": "With a passport full of stamps, you bring distant cultures and breathtaking scenes to life through vivid storytelling and personal anecdotes.", - }, - { - "role": "Lifestyle Freelance Writer", - "goal": "Share practical advice on living a balanced and stylish life", - "backstory": "From the latest trends in home decor to tips for wellness, your articles help readers create a life that feels both aspirational and attainable.", - }, -] - - -def build_researcher(): - """Builds a Researcher Structure.""" - researcher = Agent( - id="researcher", - tools=[ - WebSearch( - web_search_driver=GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], - ), - ), - WebScraper( - off_prompt=True, - ), - TaskMemoryClient(off_prompt=False), - ], - rulesets=[ - Ruleset( - name="Position", - rules=[ - Rule( - value="Lead Research Analyst", - ) - ], - ), - Ruleset( - name="Objective", - rules=[ - Rule( - value="Discover innovative advancements in artificial intelligence and data analytics", - ) - ], - ), - Ruleset( - name="Background", - rules=[ - Rule( - value="""You are part of a prominent technology research institute. - Your speciality is spotting new trends. - You excel at analyzing intricate data and delivering practical insights.""" - ) - ], - ), - Ruleset( - name="Desired Outcome", - rules=[ - Rule( - value="Comprehensive analysis report in list format", - ) - ], - ), - ], - ) - - return researcher - - -def build_writer(role: str, goal: str, backstory: str): - """Builds a Writer Structure. - - Args: - role: The role of the writer. - goal: The goal of the writer. - backstory: The backstory of the writer. - """ - writer = Agent( - id=role.lower().replace(" ", "_"), - event_listeners=[ - EventListener( - event_types=[FinishStructureRunEvent], - driver=WebhookEventListenerDriver( - webhook_url=os.environ["WEBHOOK_URL"], - ), - ) - ], - rulesets=[ - Ruleset( - name="Position", - rules=[ - Rule( - value=role, - ) - ], - ), - Ruleset( - name="Objective", - rules=[ - Rule( - value=goal, - ) - ], - ), - Ruleset( - name="Backstory", - rules=[Rule(value=backstory)], - ), - Ruleset( - name="Desired Outcome", - rules=[ - Rule( - value="Full blog post of at least 4 paragraphs", - ) - ], - ), - ], - ) - - return writer - - -if __name__ == "__main__": - # Build the team - team = Workflow() - research_task = team.add_task( - StructureRunTask( - ( - """Perform a detailed examination of the newest developments in AI as of 2024. - Pinpoint major trends, breakthroughs, and their implications for various industries.""", - ), - id="research", - driver=LocalStructureRunDriver( - structure_factory_fn=build_researcher, - ), - ), - ) - writer_tasks = team.add_tasks(*[ - StructureRunTask( - ( - """Using insights provided, develop an engaging blog - post that highlights the most significant AI advancements. - Your post should be informative yet accessible, catering to a tech-savvy audience. - Make it sound cool, avoid complex words so it doesn't sound like AI. - - Insights: - {{ parent_outputs["research"] }}""", - ), - driver=LocalStructureRunDriver( - structure_factory_fn=lambda: build_writer( - role=writer["role"], - goal=writer["goal"], - backstory=writer["backstory"], - ) - ), - parent_ids=[research_task.id], - ) - for writer in WRITERS - ]) - end_task = team.add_task( - PromptTask( - 'State "All Done!"', - parent_ids=[writer_task.id for writer_task in writer_tasks], - ) - ) - - team.run() +--8<-- "docs/examples/src/multi_agent_workflow_1.py" ``` diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index 109394d49..e73ffe5d6 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -7,63 +7,5 @@ The `MongoDbAtlasVectorStoreDriver` assumes that you have a vector index configu `asker` uses the same instance of `TaskMemory` as `loader` so that `asker` has access to the `namespace_storages` that `loader` has set. ```python -import os -from griptape.tools import WebScraper, TaskMemoryClient -from griptape.structures import Agent -from griptape.drivers import AzureOpenAiEmbeddingDriver, AzureMongoDbVectorStoreDriver -from griptape.config import AzureOpenAiStructureConfig - - -AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] -AZURE_OPENAI_API_KEY_1 = os.environ["AZURE_OPENAI_API_KEY_1"] - -MONGODB_HOST = os.environ["MONGODB_HOST"] -MONGODB_USERNAME = os.environ["MONGODB_USERNAME"] -MONGODB_PASSWORD = os.environ["MONGODB_PASSWORD"] -MONGODB_DATABASE_NAME = os.environ["MONGODB_DATABASE_NAME"] -MONGODB_COLLECTION_NAME = os.environ["MONGODB_COLLECTION_NAME"] -MONGODB_INDEX_NAME = os.environ["MONGODB_INDEX_NAME"] -MONGODB_VECTOR_PATH = os.environ["MONGODB_VECTOR_PATH"] -MONGODB_CONNECTION_STRING = f"mongodb+srv://{MONGODB_USERNAME}:{MONGODB_PASSWORD}@{MONGODB_HOST}/{MONGODB_DATABASE_NAME}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000" - - -embedding_driver = AzureOpenAiEmbeddingDriver( - model='text-embedding-ada-002', - azure_endpoint=AZURE_OPENAI_ENDPOINT_1, - api_key=AZURE_OPENAI_API_KEY_1, -) - -mongo_driver = AzureMongoDbVectorStoreDriver( - connection_string=MONGODB_CONNECTION_STRING, - database_name=MONGODB_DATABASE_NAME, - collection_name=MONGODB_COLLECTION_NAME, - embedding_driver=embedding_driver, - index_name=MONGODB_INDEX_NAME, - vector_path=MONGODB_VECTOR_PATH, -) - -config = AzureOpenAiStructureConfig( - azure_endpoint=AZURE_OPENAI_ENDPOINT_1, - vector_store_driver=mongo_driver, - embedding_driver=embedding_driver, -) - -loader = Agent( - tools=[ - WebScraper(off_prompt=True), - ], - config=config, -) -asker = Agent( - tools=[ - TaskMemoryClient(off_prompt=False), - ], - meta_memory=loader.meta_memory, - task_memory=loader.task_memory, - config=config, -) - -if __name__ == "__main__": - loader.run("Load https://medium.com/enterprise-rag/a-first-intro-to-complex-rag-retrieval-augmented-generation-a8624d70090f") - asker.run("why is retrieval augmented generation useful?") +--8<-- "docs/examples/src/multiple_agent_shared_memory_1.py" ``` diff --git a/docs/examples/query-webpage-astra-db.md b/docs/examples/query-webpage-astra-db.md index 46989c2ba..7e98b63ac 100644 --- a/docs/examples/query-webpage-astra-db.md +++ b/docs/examples/query-webpage-astra-db.md @@ -12,67 +12,5 @@ Griptape extra to be installed as well. ```python -import os - -from griptape.drivers import ( - AstraDbVectorStoreDriver, - OpenAiChatPromptDriver, - OpenAiEmbeddingDriver, -) -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import ( - PromptResponseRagModule, - VectorStoreRetrievalRagModule, -) -from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage -from griptape.loaders import WebLoader -from griptape.structures import Agent -from griptape.tools import RagClient, TaskMemoryClient - - -namespace = "datastax_blog" -input_blogpost = ( - "www.datastax.com/blog/indexing-all-of-wikipedia-on-a-laptop" -) - -vector_store_driver = AstraDbVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver(), - api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], - token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], - collection_name="griptape_test_collection", - astra_db_namespace=os.environ.get("ASTRA_DB_KEYSPACE"), -) - -engine = RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, - query_params={ - "count": 2, - "namespace": namespace, - }, - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) -) - -vector_store_driver.upsert_text_artifacts( - {namespace: WebLoader(max_tokens=256).load(input_blogpost)} -) - -vector_store_tool = RagClient( - description="A DataStax blog post", - rag_engine=engine, -) -agent = Agent(tools=[vector_store_tool, TaskMemoryClient(off_prompt=False)]) -agent.run( - "What engine made possible to index such an amount of data, " - "and what kind of tuning was required?" -) +--8<-- "docs/examples/src/query_webpage_astra_db_1.py" ``` diff --git a/docs/examples/query-webpage.md b/docs/examples/query-webpage.md index 07801b32c..b8cc23e5f 100644 --- a/docs/examples/query-webpage.md +++ b/docs/examples/query-webpage.md @@ -1,28 +1,3 @@ ```python -import os -from griptape.artifacts import BaseArtifact -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - - -vector_store = LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver( - api_key=os.environ["OPENAI_API_KEY"] - ) -) - -[ - vector_store.upsert_text_artifact(a, namespace="griptape") - for a in WebLoader(max_tokens=100).load("https://www.griptape.ai") -] - -results = vector_store.query( - "creativity", - count=3, - namespace="griptape" -) - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) -``` \ No newline at end of file +--8<-- "docs/examples/src/query_webpage_1.py" +``` diff --git a/docs/examples/src/amazon_dynamodb_sessions_1.py b/docs/examples/src/amazon_dynamodb_sessions_1.py new file mode 100644 index 000000000..f7a6d0cd6 --- /dev/null +++ b/docs/examples/src/amazon_dynamodb_sessions_1.py @@ -0,0 +1,34 @@ +import os +import sys + +import boto3 + +from griptape.drivers import ( + AmazonDynamoDbConversationMemoryDriver, +) +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +if len(sys.argv) > 2: + user_input = sys.argv[1] + session_id = sys.argv[2] +else: + user_input = "Hello!" # Default input + session_id = "session-id-123" # Default session ID + +structure = Agent( + conversation_memory=ConversationMemory( + driver=AmazonDynamoDbConversationMemoryDriver( + session=boto3.Session( + aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], + aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], + ), + table_name=os.environ["DYNAMODB_TABLE_NAME"], # The name of the DynamoDB table + partition_key="id", # The name of the partition key + partition_key_value=session_id, # The value of the partition key + value_attribute_key="value", # The key in the DynamoDB item that stores the memory value + ) + ) +) + +print(structure.run(user_input).output_task.output.value) diff --git a/docs/examples/src/load_and_query_pinecone_1.py b/docs/examples/src/load_and_query_pinecone_1.py new file mode 100644 index 000000000..6aad6655e --- /dev/null +++ b/docs/examples/src/load_and_query_pinecone_1.py @@ -0,0 +1,44 @@ +import hashlib +import json +import os +from urllib.request import urlopen + +from griptape.drivers import OpenAiEmbeddingDriver, PineconeVectorStoreDriver + + +def load_data(driver: PineconeVectorStoreDriver) -> None: + response = urlopen( + "https://raw.githubusercontent.com/wedeploy-examples/" "supermarket-web-example/master/products.json" + ) + + for product in json.loads(response.read()): + driver.upsert_text( + product["description"], + vector_id=hashlib.md5(product["title"].encode()).hexdigest(), + meta={ + "title": product["title"], + "description": product["description"], + "type": product["type"], + "price": product["price"], + "rating": product["rating"], + }, + namespace="supermarket-products", + ) + + +vector_driver = PineconeVectorStoreDriver( + api_key=os.environ["PINECONE_API_KEY"], + environment=os.environ["PINECONE_ENVIRONMENT"], + index_name=os.environ["PINECONE_INDEX_NAME"], + embedding_driver=OpenAiEmbeddingDriver(), +) + +load_data(vector_driver) + +result = vector_driver.query( + "fruit", + count=3, + filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, + namespace="supermarket-products", +) +print(result) diff --git a/docs/examples/src/load_query_and_chat_marqo_1.py b/docs/examples/src/load_query_and_chat_marqo_1.py new file mode 100644 index 000000000..ac3ffca0d --- /dev/null +++ b/docs/examples/src/load_query_and_chat_marqo_1.py @@ -0,0 +1,44 @@ +import os + +from griptape import utils +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import VectorStoreClient + +# Define the namespace +namespace = "griptape-ai" + +# # Initialize the vector store driver +vector_store = MarqoVectorStoreDriver( + api_key=os.environ["MARQO_API_KEY"], + url=os.environ["MARQO_URL"], + index=os.environ["MARQO_INDEX_NAME"], + embedding_driver=OpenAiEmbeddingDriver(), +) + +# Initialize the knowledge base tool +vector_store_tool = VectorStoreClient( + description="Contains information about the Griptape Framework from www.griptape.ai", + vector_store_driver=vector_store, +) + +# Load artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert the artifacts into the vector store +vector_store.upsert_text_artifacts( + { + namespace: artifacts, + } +) + +# Initialize the agent +agent = Agent(tools=[vector_store_tool]) + +# Start the chat +utils.Chat(agent).start() diff --git a/docs/examples/src/multi_agent_workflow_1.py b/docs/examples/src/multi_agent_workflow_1.py new file mode 100644 index 000000000..311fa22a2 --- /dev/null +++ b/docs/examples/src/multi_agent_workflow_1.py @@ -0,0 +1,175 @@ +import os + +from griptape.drivers import GoogleWebSearchDriver, LocalStructureRunDriver +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent, Workflow +from griptape.tasks import PromptTask, StructureRunTask +from griptape.tools import ( + TaskMemoryClient, + WebScraper, + WebSearch, +) + +WRITERS = [ + { + "role": "Travel Adventure Blogger", + "goal": "Inspire wanderlust with stories of hidden gems and exotic locales", + "backstory": "With a passport full of stamps, you bring distant cultures and breathtaking scenes to life through vivid storytelling and personal anecdotes.", + }, + { + "role": "Lifestyle Freelance Writer", + "goal": "Share practical advice on living a balanced and stylish life", + "backstory": "From the latest trends in home decor to tips for wellness, your articles help readers create a life that feels both aspirational and attainable.", + }, +] + + +def build_researcher() -> Agent: + """Builds a Researcher Structure.""" + researcher = Agent( + id="researcher", + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + ), + WebScraper( + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Lead Research Analyst", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Discover innovative advancements in artificial intelligence and data analytics", + ) + ], + ), + Ruleset( + name="Background", + rules=[ + Rule( + value="""You are part of a prominent technology research institute. + Your speciality is spotting new trends. + You excel at analyzing intricate data and delivering practical insights.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Comprehensive analysis report in list format", + ) + ], + ), + ], + ) + + return researcher + + +def build_writer(role: str, goal: str, backstory: str) -> Agent: + """Builds a Writer Structure. + + Args: + role: The role of the writer. + goal: The goal of the writer. + backstory: The backstory of the writer. + """ + writer = Agent( + id=role.lower().replace(" ", "_"), + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value=role, + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value=goal, + ) + ], + ), + Ruleset( + name="Backstory", + rules=[Rule(value=backstory)], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full blog post of at least 4 paragraphs", + ) + ], + ), + ], + ) + + return writer + + +if __name__ == "__main__": + # Build the team + team = Workflow() + research_task = team.add_task( + StructureRunTask( + ( + """Perform a detailed examination of the newest developments in AI as of 2024. + Pinpoint major trends, breakthroughs, and their implications for various industries.""", + ), + id="research", + driver=LocalStructureRunDriver( + structure_factory_fn=build_researcher, + ), + ), + ) + writer_tasks = team.add_tasks( + *[ + StructureRunTask( + ( + """Using insights provided, develop an engaging blog + post that highlights the most significant AI advancements. + Your post should be informative yet accessible, catering to a tech-savvy audience. + Make it sound cool, avoid complex words so it doesn't sound like AI. + + Insights: + {{ parent_outputs["research"] }}""", + ), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda writer=writer: build_writer( + role=writer["role"], + goal=writer["goal"], + backstory=writer["backstory"], + ) + ), + parent_ids=[research_task.id], + ) + for writer in WRITERS + ] + ) + end_task = team.add_task( + PromptTask( + 'State "All Done!"', + parent_ids=[writer_task.id for writer_task in writer_tasks], + ) + ) + + team.run() diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py new file mode 100644 index 000000000..dd2bb3076 --- /dev/null +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -0,0 +1,61 @@ +import os + +from griptape.config import AzureOpenAiStructureConfig +from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] +AZURE_OPENAI_API_KEY_1 = os.environ["AZURE_OPENAI_API_KEY_1"] + +MONGODB_HOST = os.environ["MONGODB_HOST"] +MONGODB_USERNAME = os.environ["MONGODB_USERNAME"] +MONGODB_PASSWORD = os.environ["MONGODB_PASSWORD"] +MONGODB_DATABASE_NAME = os.environ["MONGODB_DATABASE_NAME"] +MONGODB_COLLECTION_NAME = os.environ["MONGODB_COLLECTION_NAME"] +MONGODB_INDEX_NAME = os.environ["MONGODB_INDEX_NAME"] +MONGODB_VECTOR_PATH = os.environ["MONGODB_VECTOR_PATH"] +MONGODB_CONNECTION_STRING = f"mongodb+srv://{MONGODB_USERNAME}:{MONGODB_PASSWORD}@{MONGODB_HOST}/{MONGODB_DATABASE_NAME}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000" + + +embedding_driver = AzureOpenAiEmbeddingDriver( + model="text-embedding-ada-002", + azure_endpoint=AZURE_OPENAI_ENDPOINT_1, + api_key=AZURE_OPENAI_API_KEY_1, +) + +mongo_driver = AzureMongoDbVectorStoreDriver( + connection_string=MONGODB_CONNECTION_STRING, + database_name=MONGODB_DATABASE_NAME, + collection_name=MONGODB_COLLECTION_NAME, + embedding_driver=embedding_driver, + index_name=MONGODB_INDEX_NAME, + vector_path=MONGODB_VECTOR_PATH, +) + +config = AzureOpenAiStructureConfig( + azure_endpoint=AZURE_OPENAI_ENDPOINT_1, + vector_store_driver=mongo_driver, + embedding_driver=embedding_driver, +) + +loader = Agent( + tools=[ + WebScraper(off_prompt=True), + ], + config=config, +) +asker = Agent( + tools=[ + TaskMemoryClient(off_prompt=False), + ], + meta_memory=loader.meta_memory, + task_memory=loader.task_memory, + config=config, +) + +if __name__ == "__main__": + loader.run( + "Load https://medium.com/enterprise-rag/a-first-intro-to-complex-rag-retrieval-augmented-generation-a8624d70090f" + ) + asker.run("why is retrieval augmented generation useful?") diff --git a/docs/examples/src/query_webpage_1.py b/docs/examples/src/query_webpage_1.py new file mode 100644 index 000000000..2ea32b718 --- /dev/null +++ b/docs/examples/src/query_webpage_1.py @@ -0,0 +1,20 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"])) + +artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +for a in artifacts: + vector_store.upsert_text_artifact(a, namespace="griptape") + +results = vector_store.query("creativity", count=3, namespace="griptape") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/examples/src/query_webpage_astra_db_1.py b/docs/examples/src/query_webpage_astra_db_1.py new file mode 100644 index 000000000..8b0adfb9a --- /dev/null +++ b/docs/examples/src/query_webpage_astra_db_1.py @@ -0,0 +1,57 @@ +import os + +from griptape.artifacts import ErrorArtifact +from griptape.drivers import ( + AstraDbVectorStoreDriver, + OpenAiChatPromptDriver, + OpenAiEmbeddingDriver, +) +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import ( + PromptResponseRagModule, + VectorStoreRetrievalRagModule, +) +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import RagClient, TaskMemoryClient + +namespace = "datastax_blog" +input_blogpost = "www.datastax.com/blog/indexing-all-of-wikipedia-on-a-laptop" + +vector_store_driver = AstraDbVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), + api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], + token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], + collection_name="griptape_test_collection", + astra_db_namespace=os.environ.get("ASTRA_DB_KEYSPACE"), +) + +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, + query_params={ + "count": 2, + "namespace": namespace, + }, + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), +) + +artifacts = WebLoader(max_tokens=256).load(input_blogpost) +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) +vector_store_driver.upsert_text_artifacts({namespace: artifacts}) + +vector_store_tool = RagClient( + description="A DataStax blog post", + rag_engine=engine, +) +agent = Agent(tools=[vector_store_tool, TaskMemoryClient(off_prompt=False)]) +agent.run("What engine made possible to index such an amount of data, " "and what kind of tuning was required?") diff --git a/docs/examples/src/talk_to_a_pdf_1.py b/docs/examples/src/talk_to_a_pdf_1.py new file mode 100644 index 000000000..ee309cba2 --- /dev/null +++ b/docs/examples/src/talk_to_a_pdf_1.py @@ -0,0 +1,42 @@ +import requests + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.loaders import PdfLoader +from griptape.structures import Agent +from griptape.tools import RagClient +from griptape.utils import Chat + +namespace = "attention" +response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") +vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store, query_params={"namespace": namespace, "top_n": 20} + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), +) +vector_store_tool = RagClient( + description="Contains information about the Attention Is All You Need paper. " + "Use it to answer any related questions.", + rag_engine=engine, +) + +artifacts = PdfLoader().load(response.content) +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +vector_store.upsert_text_artifacts({namespace: artifacts}) + +agent = Agent(tools=[vector_store_tool]) + +Chat(agent).start() diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py new file mode 100644 index 000000000..d237b5191 --- /dev/null +++ b/docs/examples/src/talk_to_a_video_1.py @@ -0,0 +1,26 @@ +import time + +import google.generativeai as genai + +from griptape.artifacts import GenericArtifact, TextArtifact +from griptape.config import GoogleStructureConfig +from griptape.structures import Agent + +video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") +while video_file.state.name == "PROCESSING": + time.sleep(2) + video_file = genai.get_file(video_file.name) + +if video_file.state.name == "FAILED": + raise ValueError(video_file.state.name) + +agent = Agent( + config=GoogleStructureConfig(), + input=[ + GenericArtifact(video_file), + TextArtifact("Answer this question regarding the video: {{ args[0] }}"), + ], +) + +agent.run("Are there any scenes that show a character with earings?") +agent.run("What happens in the scene starting at 19 seconds?") diff --git a/docs/examples/src/talk_to_a_webpage_1.py b/docs/examples/src/talk_to_a_webpage_1.py new file mode 100644 index 000000000..76638113f --- /dev/null +++ b/docs/examples/src/talk_to_a_webpage_1.py @@ -0,0 +1,51 @@ +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.loaders import WebLoader +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent +from griptape.tools import RagClient +from griptape.utils import Chat + +namespace = "physics-wiki" + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, query_params={"namespace": namespace, "top_n": 20} + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), +) + +artifacts = WebLoader().load("https://en.wikipedia.org/wiki/Physics") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +vector_store_driver.upsert_text_artifacts({namespace: artifacts}) + +vector_store_tool = RagClient( + description="Contains information about physics. " "Use it to answer any physics-related questions.", + rag_engine=engine, +) + +agent = Agent( + rulesets=[ + Ruleset( + name="Physics Tutor", + rules=[Rule("Always introduce yourself as a physics tutor"), Rule("Be truthful. Only discuss physics.")], + ) + ], + tools=[vector_store_tool], +) + +Chat(agent).start() diff --git a/docs/examples/src/talk_to_redshift_1.py b/docs/examples/src/talk_to_redshift_1.py new file mode 100644 index 000000000..7354a77cc --- /dev/null +++ b/docs/examples/src/talk_to_redshift_1.py @@ -0,0 +1,43 @@ +import os + +import boto3 + +from griptape.drivers import AmazonRedshiftSqlDriver +from griptape.loaders import SqlLoader +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent +from griptape.tools import FileManager, SqlClient +from griptape.utils import Chat + +session = boto3.Session() + +sql_loader = SqlLoader( + sql_driver=AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ["REDSHIFT_CLUSTER_IDENTIFIER"], + ) +) + +sql_tool = SqlClient( + sql_loader=sql_loader, + table_name="people", + table_description="contains information about tech industry professionals", + engine_name="redshift", +) + +agent = Agent( + tools=[sql_tool, FileManager()], + rulesets=[ + Ruleset( + name="HumansOrg Agent", + rules=[ + Rule("Act and introduce yourself as a HumansOrg, Inc. support agent"), + Rule("Your main objective is to help with finding information about people"), + Rule("Only use information about people from the sources available to you"), + ], + ) + ], +) + +Chat(agent).start() diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md index a3f47f0c6..2e0743ae4 100644 --- a/docs/examples/talk-to-a-pdf.md +++ b/docs/examples/talk-to-a-pdf.md @@ -1,56 +1,5 @@ This example demonstrates how to vectorize a PDF of the [Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf) paper and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. ```python -import requests -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage -from griptape.loaders import PdfLoader -from griptape.structures import Agent -from griptape.tools import RagClient -from griptape.utils import Chat - -namespace = "attention" -response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") -vector_store = LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver() -) -engine = RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store, - query_params={ - "namespace": namespace, - "top_n": 20 - - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) -) -vector_store_tool = RagClient( - description="Contains information about the Attention Is All You Need paper. " - "Use it to answer any related questions.", - rag_engine=engine -) - -vector_store.upsert_text_artifacts( - { - namespace: PdfLoader().load(response.content) - } -) - -agent = Agent( - tools=[vector_store_tool] -) - -Chat(agent).start() - +--8<-- "docs/examples/src/talk_to_a_pdf_1.py" ``` diff --git a/docs/examples/talk-to-a-video.md b/docs/examples/talk-to-a-video.md index 9673bd1c3..1f0a243c0 100644 --- a/docs/examples/talk-to-a-video.md +++ b/docs/examples/talk-to-a-video.md @@ -3,31 +3,7 @@ In this example, we upload a video file using Gemini's file API, and then pass t Note that because we are using Gemini-specific features, this will not work with other [Prompt Drivers](../griptape-framework/drivers/prompt-drivers.md). ```python -import time -from griptape.structures import Agent -from griptape.tasks import PromptTask -from griptape.artifacts import GenericArtifact, TextArtifact -from griptape.config import GoogleStructureConfig -import google.generativeai as genai - -video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") -while video_file.state.name == "PROCESSING": - time.sleep(2) - video_file = genai.get_file(video_file.name) - -if video_file.state.name == "FAILED": - raise ValueError(video_file.state.name) - -agent = Agent( - config=GoogleStructureConfig(), - input=[ - GenericArtifact(video_file), - TextArtifact("Answer this question regarding the video: {{ args[0] }}"), - ] -) - -agent.run("Are there any scenes that show a character with earings?") -agent.run("What happens in the scene starting at 19 seconds?") +--8<-- "docs/examples/src/talk_to_a_video_1.py" ``` ``` diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md index d1d0da5fa..2bee2c9ba 100644 --- a/docs/examples/talk-to-a-webpage.md +++ b/docs/examples/talk-to-a-webpage.md @@ -1,70 +1,5 @@ This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [RagClient](../reference/griptape/tools/rag_client/tool.md) tool to use it during conversations. ```python -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage -from griptape.loaders import WebLoader -from griptape.rules import Ruleset, Rule -from griptape.structures import Agent -from griptape.tools import RagClient -from griptape.utils import Chat - -namespace = "physics-wiki" - -vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - -engine = RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, - query_params={ - "namespace": namespace, - "top_n": 20 - - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) -) - -artifacts = WebLoader().load( - "https://en.wikipedia.org/wiki/Physics" -) - -vector_store_driver.upsert_text_artifacts( - {namespace: artifacts} -) - -vector_store_tool = RagClient( - description="Contains information about physics. " - "Use it to answer any physics-related questions.", - rag_engine=engine -) - -agent = Agent( - rulesets=[ - Ruleset( - name="Physics Tutor", - rules=[ - Rule( - "Always introduce yourself as a physics tutor" - ), - Rule( - "Be truthful. Only discuss physics." - ) - ] - ) - ], - tools=[vector_store_tool] -) - -Chat(agent).start() +--8<-- "docs/examples/src/talk_to_a_webpage_1.py" ``` diff --git a/docs/examples/talk-to-redshift.md b/docs/examples/talk-to-redshift.md index efaf45594..8fdd5bc7f 100644 --- a/docs/examples/talk-to-redshift.md +++ b/docs/examples/talk-to-redshift.md @@ -3,45 +3,5 @@ This example demonstrates how to build an agent that can dynamically query Amazo Let's build a support agent that uses GPT-4: ```python -import os -import boto3 -from griptape.drivers import AmazonRedshiftSqlDriver -from griptape.loaders import SqlLoader -from griptape.rules import Ruleset, Rule -from griptape.structures import Agent -from griptape.tools import SqlClient, FileManager -from griptape.utils import Chat - -session = boto3.Session() - -sql_loader = SqlLoader( - sql_driver=AmazonRedshiftSqlDriver( - database=os.environ["REDSHIFT_DATABASE"], - session=session, - cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], - ) -) - -sql_tool = SqlClient( - sql_loader=sql_loader, - table_name="people", - table_description="contains information about tech industry professionals", - engine_name="redshift" -) - -agent = Agent( - tools=[sql_tool, FileManager()], - rulesets=[ - Ruleset( - name="HumansOrg Agent", - rules=[ - Rule("Act and introduce yourself as a HumansOrg, Inc. support agent"), - Rule("Your main objective is to help with finding information about people"), - Rule("Only use information about people from the sources available to you") - ] - ) - ] -) - -Chat(agent).start() +--8<-- "docs/examples/src/talk_to_redshift_1.py" ``` diff --git a/docs/griptape-framework/data/chunkers.md b/docs/griptape-framework/data/chunkers.md index ecaee5eb4..507645923 100644 --- a/docs/griptape-framework/data/chunkers.md +++ b/docs/griptape-framework/data/chunkers.md @@ -16,12 +16,5 @@ Different types of chunkers provide lists of separators for specific text shapes Here is how to use a chunker: ```python -from griptape.chunkers import TextChunker -from griptape.tokenizers import OpenAiTokenizer -TextChunker( - # set an optional custom tokenizer - tokenizer=OpenAiTokenizer(model="gpt-4o"), - # optionally modify default number of tokens - max_tokens=100 -).chunk("long text") +--8<-- "docs/griptape-framework/data/src/chunkers_1.py" ``` diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index 73116c064..82d97f494 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -17,25 +17,7 @@ multiple documents with [load_collection()](../../reference/griptape/loaders/bas Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) and can be used to load PDFs from a path or from an IO stream: ```python -from griptape.loaders import PdfLoader -from griptape.utils import load_files, load_file -import urllib.request - -urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "attention.pdf") - -# Load a single PDF file -with open("attention.pdf", "rb") as f: - PdfLoader().load(f.read()) -# You can also use the load_file utility function -PdfLoader().load(load_file("attention.pdf")) - -urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "CoT.pdf") - -# Load multiple PDF files -with open("attention.pdf", "rb") as attention, open("CoT.pdf", "rb") as cot: - PdfLoader().load_collection([attention.read(), cot.read()]) -# You can also use the load_files utility function -PdfLoader().load_collection(list(load_files(["attention.pdf", "CoT.pdf"]).values())) +--8<-- "docs/griptape-framework/data/src/loaders_1.py" ``` ## SQL @@ -43,20 +25,7 @@ PdfLoader().load_collection(list(load_files(["attention.pdf", "CoT.pdf"]).values Can be used to load data from a SQL database into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: ```python -from griptape.loaders import SqlLoader -from griptape.drivers import SqlDriver - -SqlLoader( - sql_driver = SqlDriver( - engine_url="sqlite:///:memory:" - ) -).load("SELECT 'foo', 'bar'") - -SqlLoader( - sql_driver = SqlDriver( - engine_url="sqlite:///:memory:" - ) -).load_collection(["SELECT 'foo', 'bar';", "SELECT 'fizz', 'buzz';"]) +--8<-- "docs/griptape-framework/data/src/loaders_2.py" ``` ## CSV @@ -64,20 +33,7 @@ SqlLoader( Can be used to load CSV files into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: ```python -from griptape.loaders import CsvLoader -from griptape.utils import load_file, load_files - -# Load a single CSV file -with open("tests/resources/cities.csv", "r") as f: - CsvLoader().load(f.read()) -# You can also use the load_file utility function -CsvLoader().load(load_file("tests/resources/cities.csv")) - -# Load multiple CSV files -with open("tests/resources/cities.csv", "r") as cities, open("tests/resources/addresses.csv", "r") as addresses: - CsvLoader().load_collection([cities.read(), addresses.read()]) -# You can also use the load_files utility function -CsvLoader().load_collection(list(load_files(["tests/resources/cities.csv", "tests/resources/addresses.csv"]).values())) +--8<-- "docs/griptape-framework/data/src/loaders_3.py" ``` @@ -89,19 +45,7 @@ CsvLoader().load_collection(list(load_files(["tests/resources/cities.csv", "test Can be used to load [pandas](https://pandas.pydata.org/) [DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)s into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: ```python -import urllib -import pandas as pd -from griptape.loaders import DataFrameLoader - -urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/cities.csv", "cities.csv") - -DataFrameLoader().load(pd.read_csv("cities.csv")) - -urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv", "addresses.csv") - -DataFrameLoader().load_collection( - [pd.read_csv('cities.csv'), pd.read_csv('addresses.csv')] -) +--8<-- "docs/griptape-framework/data/src/loaders_4.py" ``` @@ -110,23 +54,7 @@ DataFrameLoader().load_collection( Used to load arbitrary text and text files: ```python -from pathlib import Path -import urllib -from griptape.loaders import TextLoader - -TextLoader().load( - "my text" -) - -urllib.request.urlretrieve("https://example-files.online-convert.com/document/txt/example.txt", "example.txt") - -with open("example.txt", "r") as f: - TextLoader().load(f.read()) - -with open("example.txt", "r") as f: - TextLoader().load_collection( - ["my text", "my other text", f.read()] - ) +--8<-- "docs/griptape-framework/data/src/loaders_5.py" ``` You can set a custom [tokenizer](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.tokenizer), [max_tokens](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.max_tokens) parameter, and [chunker](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.chunker). @@ -139,15 +67,7 @@ You can set a custom [tokenizer](../../reference/griptape/loaders/text_loader.md Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) and can be used to load web pages: ```python -from griptape.loaders import WebLoader - -WebLoader().load( - "https://www.griptape.ai" -) - -WebLoader().load_collection( - ["https://www.griptape.ai", "https://docs.griptape.ai"] -) +--8<-- "docs/griptape-framework/data/src/loaders_6.py" ``` ## Image @@ -158,33 +78,13 @@ WebLoader().load_collection( The Image Loader is used to load an image as an [ImageArtifact](./artifacts.md#imageartifact). The Loader operates on image bytes that can be sourced from files on disk, downloaded images, or images in memory. ```python -from griptape.loaders import ImageLoader -from griptape.utils import load_file - -# Load an image from disk -with open("tests/resources/mountain.png", "rb") as f: - disk_image_artifact = ImageLoader().load(f.read()) -# You can also use the load_file utility function -ImageLoader().load(load_file("tests/resources/mountain.png")) +--8<-- "docs/griptape-framework/data/src/loaders_7.py" ``` By default, the Image Loader will load images in their native format, but not all models work on all formats. To normalize the format of Artifacts returned by the Loader, set the `format` field. ```python -from griptape.loaders import ImageLoader -from griptape.utils import load_files, load_file - -# Load a single image in BMP format -with open("tests/resources/mountain.png", "rb") as f: - image_artifact_jpeg = ImageLoader(format="bmp").load(f.read()) -# You can also use the load_file utility function -ImageLoader(format="bmp").load(load_file("tests/resources/mountain.png")) - -# Load multiple images in BMP format -with open("tests/resources/mountain.png", "rb") as mountain, open("tests/resources/cow.png", "rb") as cow: - ImageLoader().load_collection([mountain.read(), cow.read()]) -# You can also use the load_files utility function -ImageLoader().load_collection(list(load_files(["tests/resources/mountain.png", "tests/resources/cow.png"]).values())) +--8<-- "docs/griptape-framework/data/src/loaders_8.py" ``` @@ -196,13 +96,7 @@ ImageLoader().load_collection(list(load_files(["tests/resources/mountain.png", " Can be used to load email from an imap server: ```python -from griptape.loaders import EmailLoader - -loader = EmailLoader(imap_url="an.email.server.hostname", username="username", password="password") - -loader.load(EmailLoader.EmailQuery(label="INBOX")) - -loader.load_collection([EmailLoader.EmailQuery(label="INBOX"), EmailLoader.EmailQuery(label="SENT")]) +--8<-- "docs/griptape-framework/data/src/loaders_9.py" ``` ## Audio @@ -215,13 +109,5 @@ The [Audio Loader](../../reference/griptape/loaders/audio_loader.md) is used to The Loader will load audio in its native format and populates the resulting Artifact's `format` field by making a best-effort guess of the underlying audio format using the `filetype` package. ```python -from griptape.loaders import AudioLoader -from griptape.utils import load_file - -# Load an image from disk -with open("tests/resources/sentences.wav", "rb") as f: - audio_artifact = AudioLoader().load(f.read()) - -# You can also use the load_file utility function -AudioLoader().load(load_file("tests/resources/sentences.wav")) +--8<-- "docs/griptape-framework/data/src/loaders_10.py" ``` diff --git a/docs/griptape-framework/data/src/__init__.py b/docs/griptape-framework/data/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/griptape-framework/data/src/chunkers_1.py b/docs/griptape-framework/data/src/chunkers_1.py new file mode 100644 index 000000000..28ca92ceb --- /dev/null +++ b/docs/griptape-framework/data/src/chunkers_1.py @@ -0,0 +1,9 @@ +from griptape.chunkers import TextChunker +from griptape.tokenizers import OpenAiTokenizer + +TextChunker( + # set an optional custom tokenizer + tokenizer=OpenAiTokenizer(model="gpt-4o"), + # optionally modify default number of tokens + max_tokens=100, +).chunk("long text") diff --git a/docs/griptape-framework/data/src/loaders_1.py b/docs/griptape-framework/data/src/loaders_1.py new file mode 100644 index 000000000..2b7f31613 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_1.py @@ -0,0 +1,19 @@ +import urllib.request +from pathlib import Path + +from griptape.loaders import PdfLoader +from griptape.utils import load_file, load_files + +urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "attention.pdf") + +# Load a single PDF file +PdfLoader().load(Path("attention.pdf").read_bytes()) +# You can also use the load_file utility function +PdfLoader().load(load_file("attention.pdf")) + +urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "CoT.pdf") + +# Load multiple PDF files +PdfLoader().load_collection([Path("attention.pdf").read_bytes(), Path("CoT.pdf").read_bytes()]) +# You can also use the load_files utility function +PdfLoader().load_collection(list(load_files(["attention.pdf", "CoT.pdf"]).values())) diff --git a/docs/griptape-framework/data/src/loaders_10.py b/docs/griptape-framework/data/src/loaders_10.py new file mode 100644 index 000000000..42a64c40e --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_10.py @@ -0,0 +1,10 @@ +from pathlib import Path + +from griptape.loaders import AudioLoader +from griptape.utils import load_file + +# Load an image from disk +audio_artifact = AudioLoader().load(Path("tests/resources/sentences.wav").read_bytes()) + +# You can also use the load_file utility function +AudioLoader().load(load_file("tests/resources/sentences.wav")) diff --git a/docs/griptape-framework/data/src/loaders_2.py b/docs/griptape-framework/data/src/loaders_2.py new file mode 100644 index 000000000..b4359e5e5 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_2.py @@ -0,0 +1,8 @@ +from griptape.drivers import SqlDriver +from griptape.loaders import SqlLoader + +SqlLoader(sql_driver=SqlDriver(engine_url="sqlite:///:memory:")).load("SELECT 'foo', 'bar'") + +SqlLoader(sql_driver=SqlDriver(engine_url="sqlite:///:memory:")).load_collection( + ["SELECT 'foo', 'bar';", "SELECT 'fizz', 'buzz';"] +) diff --git a/docs/griptape-framework/data/src/loaders_3.py b/docs/griptape-framework/data/src/loaders_3.py new file mode 100644 index 000000000..35af0fdfc --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_3.py @@ -0,0 +1,16 @@ +from pathlib import Path + +from griptape.loaders import CsvLoader +from griptape.utils import load_file, load_files + +# Load a single CSV file +CsvLoader().load(Path("tests/resources/cities.csv").read_text()) +# You can also use the load_file utility function +CsvLoader().load(load_file("tests/resources/cities.csv")) + +# Load multiple CSV files +CsvLoader().load_collection( + [Path("tests/resources/cities.csv").read_text(), Path("tests/resources/addresses.csv").read_text()] +) +# You can also use the load_files utility function +CsvLoader().load_collection(list(load_files(["tests/resources/cities.csv", "tests/resources/addresses.csv"]).values())) diff --git a/docs/griptape-framework/data/src/loaders_4.py b/docs/griptape-framework/data/src/loaders_4.py new file mode 100644 index 000000000..8d5883adf --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_4.py @@ -0,0 +1,13 @@ +import urllib.request + +import pandas as pd + +from griptape.loaders import DataFrameLoader + +urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/cities.csv", "cities.csv") + +DataFrameLoader().load(pd.read_csv("cities.csv")) + +urllib.request.urlretrieve("https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv", "addresses.csv") + +DataFrameLoader().load_collection([pd.read_csv("cities.csv"), pd.read_csv("addresses.csv")]) diff --git a/docs/griptape-framework/data/src/loaders_5.py b/docs/griptape-framework/data/src/loaders_5.py new file mode 100644 index 000000000..0eefda776 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_5.py @@ -0,0 +1,12 @@ +import urllib.request +from pathlib import Path + +from griptape.loaders import TextLoader + +TextLoader().load("my text") + +urllib.request.urlretrieve("https://example-files.online-convert.com/document/txt/example.txt", "example.txt") + +TextLoader().load(Path("example.txt").read_text()) + +TextLoader().load_collection(["my text", "my other text", Path("example.txt").read_text()]) diff --git a/docs/griptape-framework/data/src/loaders_6.py b/docs/griptape-framework/data/src/loaders_6.py new file mode 100644 index 000000000..b3e68173e --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_6.py @@ -0,0 +1,5 @@ +from griptape.loaders import WebLoader + +WebLoader().load("https://www.griptape.ai") + +WebLoader().load_collection(["https://www.griptape.ai", "https://docs.griptape.ai"]) diff --git a/docs/griptape-framework/data/src/loaders_7.py b/docs/griptape-framework/data/src/loaders_7.py new file mode 100644 index 000000000..6857886e8 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_7.py @@ -0,0 +1,9 @@ +from pathlib import Path + +from griptape.loaders import ImageLoader +from griptape.utils import load_file + +# Load an image from disk +disk_image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) +# You can also use the load_file utility function +ImageLoader().load(load_file("tests/resources/mountain.png")) diff --git a/docs/griptape-framework/data/src/loaders_8.py b/docs/griptape-framework/data/src/loaders_8.py new file mode 100644 index 000000000..e85992d45 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_8.py @@ -0,0 +1,16 @@ +from pathlib import Path + +from griptape.loaders import ImageLoader +from griptape.utils import load_file, load_files + +# Load a single image in BMP format +image_artifact_jpeg = ImageLoader(format="bmp").load(Path("tests/resources/mountain.png").read_bytes()) +# You can also use the load_file utility function +ImageLoader(format="bmp").load(load_file("tests/resources/mountain.png")) + +# Load multiple images in BMP format +ImageLoader().load_collection( + [Path("tests/resources/mountain.png").read_bytes(), Path("tests/resources/cow.png").read_bytes()] +) +# You can also use the load_files utility function +ImageLoader().load_collection(list(load_files(["tests/resources/mountain.png", "tests/resources/cow.png"]).values())) diff --git a/docs/griptape-framework/data/src/loaders_9.py b/docs/griptape-framework/data/src/loaders_9.py new file mode 100644 index 000000000..d131910d3 --- /dev/null +++ b/docs/griptape-framework/data/src/loaders_9.py @@ -0,0 +1,7 @@ +from griptape.loaders import EmailLoader + +loader = EmailLoader(imap_url="an.email.server.hostname", username="username", password="password") + +loader.load(EmailLoader.EmailQuery(label="INBOX")) + +loader.load_collection([EmailLoader.EmailQuery(label="INBOX"), EmailLoader.EmailQuery(label="SENT")]) diff --git a/docs/griptape-framework/drivers/audio-transcription-drivers.md b/docs/griptape-framework/drivers/audio-transcription-drivers.md index 0fba57438..10630cf22 100644 --- a/docs/griptape-framework/drivers/audio-transcription-drivers.md +++ b/docs/griptape-framework/drivers/audio-transcription-drivers.md @@ -18,22 +18,5 @@ This capability is essential for enhancing accessibility, improving content disc The [OpenAI Audio Transcription Driver](../../reference/griptape/drivers/audio_transcription/openai_audio_transcription_driver.md) utilizes OpenAI's sophisticated `whisper` model to accurately transcribe spoken audio into text. This model supports multiple languages, ensuring precise transcription across a wide range of dialects. ```python -from griptape.drivers import OpenAiAudioTranscriptionDriver -from griptape.engines import AudioTranscriptionEngine -from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient -from griptape.structures import Agent - - -driver = OpenAiAudioTranscriptionDriver( - model="whisper-1" -) - -tool = AudioTranscriptionClient( - off_prompt=False, - engine=AudioTranscriptionEngine( - audio_transcription_driver=driver, - ), -) - -Agent(tools=[tool]).run("Transcribe the following audio file: tests/resources/sentences.wav") +--8<-- "docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py" ``` diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index acdb7c202..29ab328fd 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -14,15 +14,7 @@ You can persist and load memory by using Conversation Memory Drivers. You can bu The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. ```python -from griptape.structures import Agent -from griptape.drivers import LocalConversationMemoryDriver -from griptape.memory.structure import ConversationMemory - -local_driver = LocalConversationMemoryDriver(file_path="memory.json") -agent = Agent(conversation_memory=ConversationMemory(driver=local_driver)) - -agent.run("Surfing is my favorite sport.") -agent.run("What is my favorite sport?") +--8<-- "docs/griptape-framework/drivers/src/conversation_memory_drivers_1.py" ``` ### Amazon DynamoDb @@ -33,24 +25,7 @@ agent.run("What is my favorite sport?") The [AmazonDynamoDbConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.md) allows you to persist Conversation Memory in [Amazon DynamoDb](https://aws.amazon.com/dynamodb/). ```python -import os -import uuid -from griptape.drivers import AmazonDynamoDbConversationMemoryDriver -from griptape.memory.structure import ConversationMemory -from griptape.structures import Agent - -conversation_id = uuid.uuid4().hex -dynamodb_driver = AmazonDynamoDbConversationMemoryDriver( - table_name=os.environ["DYNAMODB_TABLE_NAME"], - partition_key="id", - value_attribute_key="memory", - partition_key_value=conversation_id, -) - -agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) - -agent.run("My name is Jeff.") -agent.run("What is my name?") +--8<-- "docs/griptape-framework/drivers/src/conversation_memory_drivers_2.py" ``` Optional parameters `sort_key` and `sort_key_value` can be supplied for tables with a composite primary key. @@ -63,23 +38,5 @@ Optional parameters `sort_key` and `sort_key_value` can be supplied for tables w The [RedisConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/redis_conversation_memory_driver.md) allows you to persist Conversation Memory in [Redis](https://redis.io/). ```python -import os -import uuid -from griptape.drivers import RedisConversationMemoryDriver -from griptape.memory.structure import ConversationMemory -from griptape.structures import Agent - -conversation_id = uuid.uuid4().hex -redis_conversation_driver = RedisConversationMemoryDriver( - host=os.environ["REDIS_HOST"], - port=os.environ["REDIS_PORT"], - password=os.environ["REDIS_PASSWORD"], - index=os.environ["REDIS_INDEX"], - conversation_id = conversation_id -) - -agent = Agent(conversation_memory=ConversationMemory(driver=redis_conversation_driver)) - -agent.run("My name is Jeff.") -agent.run("What is my name?") +--8<-- "docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py" ``` diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 567aa13e4..4209c2821 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -21,12 +21,7 @@ The [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_em ```python -from griptape.drivers import OpenAiEmbeddingDriver - -embeddings = OpenAiEmbeddingDriver().embed_string("Hello Griptape!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_1.py" ``` ``` [0.0017853748286142945, 0.006118456833064556, -0.005811543669551611] @@ -37,18 +32,8 @@ print(embeddings[:3]) Many services such as [LMStudio](https://lmstudio.ai/) and [OhMyGPT](https://www.ohmygpt.com/) provide OpenAI-compatible APIs. You can use the [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) to interact with these services. Simply set the `base_url` to the service's API endpoint and the `model` to the model name. If the service requires an API key, you can set it in the `api_key` field. -```python title="PYTEST_IGNORE" -from griptape.drivers import OpenAiEmbeddingDriver - -embedding_driver = OpenAiEmbeddingDriver( - base_url="http://127.0.0.1:1234/v1", - model="nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q2_K", -) - -embeddings = embedding_driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +```python +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_2.py" ``` !!! tip @@ -67,12 +52,7 @@ with updated defaults. The [AmazonBedrockTitanEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.md) uses the [Amazon Bedrock Embeddings API](https://docs.aws.amazon.com/bedrock/latest/userguide/embeddings.html). ```python -from griptape.drivers import AmazonBedrockTitanEmbeddingDriver - -embeddings = AmazonBedrockTitanEmbeddingDriver().embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_3.py" ``` ``` [-0.234375, -0.024902344, -0.14941406] @@ -85,12 +65,7 @@ print(embeddings[:3]) The [GoogleEmbeddingDriver](../../reference/griptape/drivers/embedding/google_embedding_driver.md) uses the [Google Embeddings API](https://ai.google.dev/tutorials/python_quickstart#use_embeddings). ```python -from griptape.drivers import GoogleEmbeddingDriver - -embeddings = GoogleEmbeddingDriver().embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_4.py" ``` ``` [0.0588633, 0.0033929371, -0.072810836] @@ -106,24 +81,7 @@ The [HuggingFaceHubEmbeddingDriver](../../reference/griptape/drivers/embedding/h - feature-extraction ```python -import os -from griptape.drivers import HuggingFaceHubEmbeddingDriver -from griptape.tokenizers import HuggingFaceTokenizer -from transformers import AutoTokenizer - -driver = HuggingFaceHubEmbeddingDriver( - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - model="sentence-transformers/all-MiniLM-L6-v2", - tokenizer=HuggingFaceTokenizer( - model="sentence-transformers/all-MiniLM-L6-v2", - max_output_tokens=512, - ), -) - -embeddings = driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_5.py" ``` ### Ollama @@ -133,17 +91,8 @@ print(embeddings[:3]) The [OllamaEmbeddingDriver](../../reference/griptape/drivers/embedding/ollama_embedding_driver.md) uses the [Ollama Embeddings API](https://ollama.com/blog/embedding-models). -```python title="PYTEST_IGNORE" -from griptape.drivers import OllamaEmbeddingDriver - -driver = OllamaEmbeddingDriver( - model="all-minilm", -) - -results = driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(results[:3]) +```python +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_6.py" ``` ### Amazon SageMaker Jumpstart @@ -153,18 +102,8 @@ The [AmazonSageMakerJumpstartEmbeddingDriver](../../reference/griptape/drivers/e !!! info This driver requires the `drivers-embedding-amazon-sagemaker` [extra](../index.md#extras). -```python title="PYTEST_IGNORE" -import os -from griptape.drivers import AmazonSageMakerJumpstartEmbeddingDriver, SageMakerTensorFlowHubEmbeddingModelDriver - -driver = AmazonSageMakerJumpstartEmbeddingDriver( - model=os.environ["SAGEMAKER_TENSORFLOW_HUB_MODEL"], -) - -embeddings = driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +```python +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_7.py" ``` ### VoyageAI @@ -174,17 +113,7 @@ The [VoyageAiEmbeddingDriver](../../reference/griptape/drivers/embedding/voyagea This driver requires the `drivers-embedding-voyageai` [extra](../index.md#extras). ```python -import os -from griptape.drivers import VoyageAiEmbeddingDriver - -driver = VoyageAiEmbeddingDriver( - api_key=os.environ["VOYAGE_API_KEY"] -) - -embeddings = driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_8.py" ``` ### Cohere @@ -195,40 +124,12 @@ The [CohereEmbeddingDriver](../../reference/griptape/drivers/embedding/cohere_em This driver requires the `drivers-embedding-cohere` [extra](../index.md#extras). ```python -import os -from griptape.drivers import CohereEmbeddingDriver - -embedding_driver=CohereEmbeddingDriver( - model="embed-english-v3.0", - api_key=os.environ["COHERE_API_KEY"], - input_type="search_document", -) - -embeddings = embedding_driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_9.py" ``` ### Override Default Structure Embedding Driver Here is how you can override the Embedding Driver that is used by default in Structures. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper, TaskMemoryClient -from griptape.drivers import ( - OpenAiChatPromptDriver, - VoyageAiEmbeddingDriver, -) -from griptape.config import StructureConfig - -agent = Agent( - tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), - embedding_driver=VoyageAiEmbeddingDriver(), - ), -) - -agent.run("based on https://www.griptape.ai/, tell me what Griptape is") +--8<-- "docs/griptape-framework/drivers/src/embedding_drivers_10.py" ``` diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index 773bed693..ab0609c51 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -10,62 +10,13 @@ Event Listener Drivers are used to send Griptape [Events](../misc/events.md) to You can instantiate Drivers and pass them to Event Listeners in your Structure: ```python -import os - -from griptape.drivers import AmazonSqsEventListenerDriver -from griptape.events import ( - EventListener, event_bus -) -from griptape.rules import Rule -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - driver=AmazonSqsEventListenerDriver( - queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], - ), - ), - ] -) - - -agent = Agent( - rules=[ - Rule( - value="You will be provided with a block of text, and your task is to extract a list of keywords from it." - ) - ], -) - -agent.run( - """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. - Traditional reduction-fired blackware has been made for centuries by pueblo artists. - Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. - Another style involves carving or incising designs and selectively polishing the raised areas. - For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. - Several contemporary artists have created works honoring the pottery of their ancestors.""" -) +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_1.py" ``` Or use them independently: ```python -import os -from griptape.drivers import GriptapeCloudEventListenerDriver -from griptape.events import FinishStructureRunEvent -from griptape.artifacts import TextArtifact - -# By default, GriptapeCloudEventListenerDriver uses the api key provided -# in the GT_CLOUD_API_KEY environment variable. -event_driver = GriptapeCloudEventListenerDriver() - -done_event = FinishStructureRunEvent( - output_task_input=TextArtifact("Just started!"), - output_task_output=TextArtifact("All done!"), -) - -event_driver.publish_event(done_event) +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_2.py" ``` ## Event Listener Drivers @@ -80,41 +31,7 @@ Griptape offers the following Event Listener Drivers for forwarding Griptape Eve The [AmazonSqsEventListenerDriver](../../reference/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.md) sends Events to an [Amazon SQS](https://aws.amazon.com/sqs/) queue. ```python -import os - -from griptape.drivers import AmazonSqsEventListenerDriver -from griptape.events import ( - EventListener, event_bus -) -from griptape.rules import Rule -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - driver=AmazonSqsEventListenerDriver( - queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], - ), - ), - ] -) - -agent = Agent( - rules=[ - Rule( - value="You will be provided with a block of text, and your task is to extract a list of keywords from it." - ) - ], -) - -agent.run( - """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. - Traditional reduction-fired blackware has been made for centuries by pueblo artists. - Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. - Another style involves carving or incising designs and selectively polishing the raised areas. - For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. - Several contemporary artists have created works honoring the pottery of their ancestors.""" -) +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_3.py" ``` ### AWS IoT @@ -125,44 +42,7 @@ agent.run( The [AwsIotCoreEventListenerDriver](../../reference/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.md) sends Events to the [AWS IoT Message Broker](https://aws.amazon.com/iot-core/). ```python -import os - -from griptape.config import StructureConfig -from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver -from griptape.events import ( - EventListener, - FinishStructureRunEvent, - event_bus -) -from griptape.rules import Rule -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - event_types=[FinishStructureRunEvent], - driver=AwsIotCoreEventListenerDriver( - topic=os.environ["AWS_IOT_CORE_TOPIC"], - iot_endpoint=os.environ["AWS_IOT_CORE_ENDPOINT"], - ), - ), - ] -) - -agent = Agent( - rules=[ - Rule( - value="You will be provided with a text, and your task is to extract the airport codes from it." - ) - ], - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-3.5-turbo", temperature=0.7 - ) - ), -) - -agent.run("I want to fly from Orlando to Boston") +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_4.py" ``` ### Griptape Cloud @@ -173,31 +53,7 @@ The [GriptapeCloudEventListenerDriver](../../reference/griptape/drivers/event_li This Driver is required when using the Griptape Cloud Managed Structures feature. For local development, you can use the [Skatepark Emulator](https://github.com/griptape-ai/griptape-cli?tab=readme-ov-file#skatepark-emulator). ```python -import os - -from griptape.drivers import GriptapeCloudEventListenerDriver -from griptape.events import ( - EventListener, - FinishStructureRunEvent, - event_bus -) -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - event_types=[FinishStructureRunEvent], - # By default, GriptapeCloudEventListenerDriver uses the api key provided - # in the GT_CLOUD_API_KEY environment variable. - driver=GriptapeCloudEventListenerDriver(), - ), - ] -) - -agent = Agent() -agent.run( - "Create a list of 8 questions for an interview with a science fiction author." -) +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_5.py" ``` ### Webhook Event Listener Driver @@ -205,30 +61,7 @@ agent.run( The [WebhookEventListenerDriver](../../reference/griptape/drivers/event_listener/webhook_event_listener_driver.md) sends Events to any [Webhook](https://en.wikipedia.org/wiki/Webhook) URL. ```python -import os - -from griptape.drivers import WebhookEventListenerDriver -from griptape.events import ( - EventListener, - FinishStructureRunEvent, - event_bus -) -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - event_types=[FinishStructureRunEvent], - driver=WebhookEventListenerDriver( - webhook_url=os.environ["WEBHOOK_URL"], - ), - ), - ] -) - -agent = Agent() - -agent.run("Analyze the pros and cons of remote work vs. office work") +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_6.py" ``` ### Pusher @@ -238,34 +71,5 @@ agent.run("Analyze the pros and cons of remote work vs. office work") The [PusherEventListenerDriver](../../reference/griptape/drivers/event_listener/pusher_event_listener_driver.md) sends Events to [Pusher](https://pusher.com). ```python -import os -from griptape.drivers import PusherEventListenerDriver -from griptape.events import ( - EventListener, - FinishStructureRunEvent, - event_bus -) -from griptape.structures import Agent - -event_bus.add_event_listeners( - [ - EventListener( - event_types=[FinishStructureRunEvent], - driver=PusherEventListenerDriver( - batched=False, - app_id=os.environ["PUSHER_APP_ID"], - key=os.environ["PUSHER_KEY"], - secret=os.environ["PUSHER_SECRET"], - cluster=os.environ["PUSHER_CLUSTER"], - channel='my-channel', - event_name='my-event' - ), - ), - ], -) - -agent = Agent() - -agent.run("Analyze the pros and cons of remote work vs. office work") - +--8<-- "docs/griptape-framework/drivers/src/event_listener_drivers_7.py" ``` diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md index aae25c64d..bcc91aca6 100644 --- a/docs/griptape-framework/drivers/image-generation-drivers.md +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -10,22 +10,7 @@ search: Provide a Driver when building an [Engine](../engines/image-generation-engines.md), then pass it to a [Tool](../tools/index.md) for use by an [Agent](../structures/agents.md): ```python -from griptape.structures import Agent -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import OpenAiImageGenerationDriver -from griptape.tools import PromptImageGenerationClient - -driver = OpenAiImageGenerationDriver( - model="dall-e-2", -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate a watercolor painting of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_1.py" ``` ## Image Generation Drivers @@ -41,28 +26,7 @@ The [Bedrock Stable Diffusion Model Driver](../../reference/griptape/drivers/ima This Model Driver supports negative prompts. When provided (for example, when used with an [image generation Engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. ```python -from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver - -model_driver = BedrockStableDiffusionImageGenerationModelDriver( - style_preset="pixel-art", -) - -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=model_driver, - model="stability.stable-diffusion-xl-v0", -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate an image of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_2.py" ``` #### Titan @@ -72,26 +36,7 @@ The [Bedrock Titan Image Generator Model Driver](../../reference/griptape/driver This Model Driver supports negative prompts. When provided (for example, when used with an [image generation engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. ```python -from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockTitanImageGenerationModelDriver - -model_driver = BedrockTitanImageGenerationModelDriver() - -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=model_driver, - model="amazon.titan-image-generator-v1", -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate a watercolor painting of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_3.py" ``` ### Azure OpenAI @@ -99,27 +44,7 @@ agent.run("Generate a watercolor painting of a dog riding a skateboard") The [Azure OpenAI Image Generation Driver](../../reference/griptape/drivers/image_generation/azure_openai_image_generation_driver.md) provides access to OpenAI models hosted by Azure. In addition to the configurations provided by the underlying OpenAI Driver, the Azure OpenAI Driver allows configuration of Azure-specific deployment values. ```python -import os - -from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AzureOpenAiImageGenerationDriver - -driver = AzureOpenAiImageGenerationDriver( - model="dall-e-3", - azure_deployment=os.environ["AZURE_OPENAI_DALL_E_3_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], - api_key=os.environ["AZURE_OPENAI_API_KEY_2"], -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate a watercolor painting of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_4.py" ``` ### Leonardo.Ai @@ -131,27 +56,7 @@ This Driver supports configurations like model selection, image size, specifying This Driver supports negative prompts. When provided (for example, when used with an [image generation engine](../engines/image-generation-engines.md) configured with [Negative Rulesets](../engines/image-generation-engines.md#image-generation-engine-rulesets)), the image generation request will include negatively-weighted prompts describing features or characteristics to avoid in the resulting generation. ```python -import os - -from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import LeonardoImageGenerationDriver - -driver = LeonardoImageGenerationDriver( - model=os.environ["LEONARDO_MODEL_ID"], - api_key=os.environ["LEONARDO_API_KEY"], - image_width=512, - image_height=1024, -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate a watercolor painting of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_5.py" ``` ### OpenAI @@ -161,23 +66,7 @@ The [OpenAI Image Generation Driver](../../reference/griptape/drivers/image_gene This Driver supports image generation configurations like style presets, image quality preference, and image size. For details on supported configuration values, see the [OpenAI documentation](https://platform.openai.com/docs/guides/images/introduction). ```python -from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import OpenAiImageGenerationDriver - -driver = OpenAiImageGenerationDriver( - model="dall-e-2", - image_size="512x512", -) - -engine = PromptImageGenerationEngine(image_generation_driver=driver) - -agent = Agent(tools=[ - PromptImageGenerationClient(engine=engine), -]) - -agent.run("Generate a watercolor painting of a dog riding a skateboard") +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_6.py" ``` ### HuggingFace Pipelines @@ -204,29 +93,8 @@ The [Stable Diffusion 3 Image Generation Pipeline Driver](../../reference/gripta Image generation consumes substantial memory. On devices with limited VRAM, it may be necessary to enable the `enable_model_cpu_offload` or `drop_t5_encoder` configurations. For more information, see [HuggingFace's documentation](https://huggingface.co/docs/diffusers/en/optimization/memory) on reduced memory usage. -```python title="PYTEST_IGNORE" -from griptape.structures import Pipeline -from griptape.tasks import PromptImageGenerationTask -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ - StableDiffusion3ImageGenerationPipelineDriver -from griptape.artifacts import TextArtifact - -image_generation_task = PromptImageGenerationTask( - input=TextArtifact("landscape photograph, verdant, countryside, 8k"), - image_generation_engine=PromptImageGenerationEngine( - image_generation_driver=HuggingFacePipelineImageGenerationDriver( - model="stabilityai/stable-diffusion-3-medium-diffusers", - device="cuda", - pipeline_driver=StableDiffusion3ImageGenerationPipelineDriver( - height=512, - width=512, - ) - ) - ) -) - -output_artifact = Pipeline(tasks=[image_generation_task]).run().output +```python +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_7.py" ``` #### Stable Diffusion 3 Img2Img Image Generation Pipeline Driver @@ -236,35 +104,8 @@ output_artifact = Pipeline(tasks=[image_generation_task]).run().output The [Stable Diffusion 3 Img2Img Image Generation Pipeline Driver](../../reference/griptape/drivers/image_generation_pipeline/stable_diffusion_3_img_2_img_image_generation_pipeline_driver.md) provides a `StableDiffusion3Img2ImgPipeline` for image-to-image generations, accepting a text prompt and input image. This Driver accepts a text prompt, an input image, and configurations including Stable Diffusion 3 model, output image size, inference steps, generation seed, and strength of generation over the input image. -```python title="PYTEST_IGNORE" -from pathlib import Path - -from griptape.structures import Pipeline -from griptape.tasks import VariationImageGenerationTask -from griptape.engines import VariationImageGenerationEngine -from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ - StableDiffusion3Img2ImgImageGenerationPipelineDriver -from griptape.artifacts import TextArtifact, ImageArtifact -from griptape.loaders import ImageLoader - -prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") -input_image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) - -image_variation_task = VariationImageGenerationTask( - input=(prompt_artifact, input_image_artifact), - image_generation_engine=PromptImageGenerationEngine( - image_generation_driver=HuggingFacePipelineImageGenerationDriver( - model="stabilityai/stable-diffusion-3-medium-diffusers", - device="cuda", - pipeline_driver=StableDiffusion3Img2ImgImageGenerationPipelineDriver( - height=1024, - width=1024, - ) - ) - ) -) - -output_artifact = Pipeline(tasks=[image_variation_task]).run().output +```python +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_8.py" ``` #### StableDiffusion3ControlNetImageGenerationPipelineDriver @@ -274,35 +115,6 @@ output_artifact = Pipeline(tasks=[image_variation_task]).run().output The [StableDiffusion3ControlNetImageGenerationPipelineDriver](../../reference/griptape/drivers/image_generation_pipeline/stable_diffusion_3_controlnet_image_generation_pipeline_driver.md) provides a `StableDiffusion3ControlNetPipeline` for image-to-image generations, accepting a text prompt and a control image. This Driver accepts a text prompt, a control image, and configurations including Stable Diffusion 3 model, ControlNet model, output image size, generation seed, inference steps, and the degree to which the model adheres to the control image. -```python title="PYTEST_IGNORE" -from pathlib import Path - -from griptape.structures import Pipeline -from griptape.tasks import VariationImageGenerationTask -from griptape.engines import VariationImageGenerationEngine -from griptape.drivers import HuggingFacePipelineImageGenerationDriver, \ - StableDiffusion3ControlNetImageGenerationPipelineDriver -from griptape.artifacts import TextArtifact, ImageArtifact -from griptape.loaders import ImageLoader - -prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") -control_image_artifact = ImageLoader().load(Path("canny_control_image.png").read_bytes()) - -controlnet_task = VariationImageGenerationTask( - input=(prompt_artifact, control_image_artifact), - image_generation_engine=PromptImageGenerationEngine( - image_generation_driver=HuggingFacePipelineImageGenerationDriver( - model="stabilityai/stable-diffusion-3-medium-diffusers", - device="cuda", - pipeline_driver=StableDiffusion3ControlNetImageGenerationPipelineDriver( - controlnet_model="InstantX/SD3-Controlnet-Canny", - control_strength=0.8, - height=768, - width=1024, - ) - ) - ) -) - -output_artifact = Pipeline(tasks=[controlnet_task]).run().output +```python +--8<-- "docs/griptape-framework/drivers/src/image_generation_drivers_9.py" ``` diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index 04e3ebaee..b0c598572 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -20,50 +20,13 @@ Image Query Drivers are used by [Image Query Engines](../engines/image-query-eng The [AnthropicImageQueryDriver](../../reference/griptape/drivers/image_query/anthropic_image_query_driver.md) is used to query images using Anthropic's Claude 3 multi-modal model. Here is an example of how to use it: ```python -from griptape.drivers import AnthropicImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = AnthropicImageQueryDriver( - model="claude-3-sonnet-20240229", - max_tokens=1024, -) - -engine = ImageQueryEngine( - image_query_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) +--8<-- "docs/griptape-framework/drivers/src/image_query_drivers_1.py" ``` You can also specify multiple images with a single text prompt. This applies the same text prompt to all images specified, up to a max of 20. However, you will still receive one text response from the model currently. ```python -from griptape.drivers import AnthropicImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = AnthropicImageQueryDriver( - model="claude-3-sonnet-20240229", - max_tokens=1024, -) - -engine = ImageQueryEngine( - image_query_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact1 = ImageLoader().load(f.read()) - -with open("tests/resources/cow.png", "rb") as f: - image_artifact2 = ImageLoader().load(f.read()) - -result = engine.run("Describe the weather in the image", [image_artifact1, image_artifact2]) - -print(result) +--8<-- "docs/griptape-framework/drivers/src/image_query_drivers_2.py" ``` ### OpenAI @@ -74,23 +37,7 @@ print(result) The [OpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/openai_image_query_driver.md) is used to query images using the OpenAI Vision API. Here is an example of how to use it: ```python -from griptape.drivers import OpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = OpenAiImageQueryDriver( - model="gpt-4o", - max_tokens=256, -) - -engine = ImageQueryEngine( - image_query_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) +--8<-- "docs/griptape-framework/drivers/src/image_query_drivers_3.py" ``` ### Azure OpenAI @@ -101,27 +48,7 @@ engine.run("Describe the weather in the image", [image_artifact]) The [AzureOpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/azure_openai_image_query_driver.md) is used to query images using the Azure OpenAI Vision API. Here is an example of how to use it: ```python -import os -from griptape.drivers import AzureOpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = AzureOpenAiImageQueryDriver( - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], - api_key=os.environ["AZURE_OPENAI_API_KEY_2"], - model="gpt-4o", - azure_deployment="gpt-4o", - max_tokens=256, -) - -engine = ImageQueryEngine( - image_query_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) +--8<-- "docs/griptape-framework/drivers/src/image_query_drivers_4.py" ``` ### Amazon Bedrock @@ -133,30 +60,5 @@ The [Amazon Bedrock Image Query Driver](../../reference/griptape/drivers/image_q The [BedrockClaudeImageQueryModelDriver](../../reference/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.md) provides support for Claude models hosted by Bedrock. ```python -from griptape.drivers import AmazonBedrockImageQueryDriver, BedrockClaudeImageQueryModelDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader -import boto3 - -session = boto3.Session( - region_name="us-west-2" -) - -driver = AmazonBedrockImageQueryDriver( - image_query_model_driver=BedrockClaudeImageQueryModelDriver(), - model="anthropic.claude-3-sonnet-20240229-v1:0", - session=session -) - -engine = ImageQueryEngine( - image_query_driver=driver -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - - -result = engine.run("Describe the weather in the image", [image_artifact]) - -print(result) +--8<-- "docs/griptape-framework/drivers/src/image_query_drivers_5.py" ``` diff --git a/docs/griptape-framework/drivers/observability-drivers.md b/docs/griptape-framework/drivers/observability-drivers.md index fbe1a1319..701aca504 100644 --- a/docs/griptape-framework/drivers/observability-drivers.md +++ b/docs/griptape-framework/drivers/observability-drivers.md @@ -28,17 +28,8 @@ The Griptape Cloud Observability Driver instruments `@observable` functions and Here is an example of how to use the `GriptapeCloudObservabilityDriver` with the `Observability` context manager to send the telemetry to Griptape Cloud: -```python title="PYTEST_IGNORE" -from griptape.drivers import GriptapeCloudObservabilityDriver -from griptape.rules import Rule -from griptape.structures import Agent -from griptape.observability import Observability - -observability_driver = GriptapeCloudObservabilityDriver() - -with Observability(observability_driver=observability_driver): - agent = Agent(rules=[Rule("Output one word")]) - agent.run("Name an animal") +```python +--8<-- "docs/griptape-framework/drivers/src/observability_drivers_1.py" ``` @@ -52,21 +43,8 @@ The [OpenTelemetry](https://opentelemetry.io/) Observability Driver instruments Here is an example of how to use the `OpenTelemetryObservabilityDriver` with the `Observability` context manager to output the telemetry directly to the console: -```python title="PYTEST_IGNORE" -from griptape.drivers import OpenTelemetryObservabilityDriver -from griptape.rules import Rule -from griptape.structures import Agent -from griptape.observability import Observability -from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor - -observability_driver = OpenTelemetryObservabilityDriver( - service_name="name-an-animal", - span_processor=BatchSpanProcessor(ConsoleSpanExporter()) -) - -with Observability(observability_driver=observability_driver): - agent = Agent(rules=[Rule("Output one word")]) - agent.run("Name an animal") +```python +--8<-- "docs/griptape-framework/drivers/src/observability_drivers_2.py" ``` Output (only relevant because of use of `ConsoleSpanExporter`): diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index ab749bf7c..ab5be55f3 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -10,51 +10,13 @@ Prompt Drivers are used by Griptape Structures to make API calls to the underlyi You can instantiate drivers and pass them to structures: ```python -from griptape.structures import Agent -from griptape.drivers import OpenAiChatPromptDriver -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), - ), - input="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", - rules=[ - Rule( - value="Output only the sentiment." - ) - ], -) - -agent.run("I loved the new Batman movie!") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_1.py" ``` Or use them independently: ```python -from griptape.common import PromptStack -from griptape.drivers import OpenAiChatPromptDriver - -stack = PromptStack() - -stack.add_system_message( - "You will be provided with Python code, and your task is to calculate its time complexity." -) -stack.add_user_message( - """ - def foo(n, k): - accum = 0 - for i in range(n): - for l in range(k): - accum += i - return accum - """ -) - -result = OpenAiChatPromptDriver(model="gpt-3.5-turbo-16k", temperature=0).run(stack) - -print(result.value) +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_2.py" ``` ## Prompt Drivers @@ -67,31 +29,7 @@ The [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat This driver uses [OpenAi function calling](https://platform.openai.com/docs/guides/function-calling) when using [Tools](../tools/index.md). ```python -import os -from griptape.structures import Agent -from griptape.drivers import OpenAiChatPromptDriver -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - api_key=os.environ["OPENAI_API_KEY"], - temperature=0.1, - model="gpt-4o", - response_format="json_object", - seed=42, - ) - ), - input="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", - rules=[ - Rule( - value='Write your output in json with a single key called "css_code".' - ) - ], -) - -agent.run("Blue sky at dusk.") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_3.py" ``` !!! info @@ -102,23 +40,8 @@ agent.run("Blue sky at dusk.") Many services such as [LMStudio](https://lmstudio.ai/) and [OhMyGPT](https://www.ohmygpt.com/) provide OpenAI-compatible APIs. You can use the [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat_prompt_driver.md) to interact with these services. Simply set the `base_url` to the service's API endpoint and the `model` to the model name. If the service requires an API key, you can set it in the `api_key` field. -```python title="PYTEST_IGNORE" -from griptape.structures import Agent -from griptape.drivers import OpenAiChatPromptDriver -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - base_url="http://127.0.0.1:1234/v1", - model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", stream=True - ) - ), - rules=[Rule(value="You are a helpful coding assistant.")], -) - -agent.run("How do I init and update a git submodule?") +```python +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_4.py" ``` !!! tip @@ -130,30 +53,7 @@ The [AzureOpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/azure_ This driver uses [Azure OpenAi function calling](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling) when using [Tools](../tools/index.md). ```python -import os -from griptape.structures import Agent -from griptape.rules import Rule -from griptape.drivers import AzureOpenAiChatPromptDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-3.5-turbo", - azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - ) - ), - rules=[ - Rule( - value="You will be provided with text, and your task is to translate it into emojis. " - "Do not use any regular text. Do your best with emojis only." - ) - ], -) - -agent.run("Artificial intelligence is a technology with great promise.") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_5.py" ``` ### Cohere @@ -165,21 +65,7 @@ This driver uses [Cohere tool use](https://docs.cohere.com/docs/tools) when usin This driver requires the `drivers-prompt-cohere` [extra](../index.md#extras). ```python -import os -from griptape.structures import Agent -from griptape.drivers import CoherePromptDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=CoherePromptDriver( - model="command-r", - api_key=os.environ['COHERE_API_KEY'], - ) - ) -) - -agent.run('What is the sentiment of this review? Review: "I really enjoyed this movie!"') +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_6.py" ``` ### Anthropic @@ -191,21 +77,7 @@ The [AnthropicPromptDriver](../../reference/griptape/drivers/prompt/anthropic_pr This driver uses [Anthropic tool use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) when using [Tools](../tools/index.md). ```python -import os -from griptape.structures import Agent -from griptape.drivers import AnthropicPromptDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-opus-20240229", - api_key=os.environ['ANTHROPIC_API_KEY'], - ) - ) -) - -agent.run('Where is the best place to see cherry blossums in Japan?') +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_7.py" ``` ### Google @@ -217,21 +89,7 @@ The [GooglePromptDriver](../../reference/griptape/drivers/prompt/google_prompt_d This driver uses [Gemini function calling](https://ai.google.dev/gemini-api/docs/function-calling) when using [Tools](../tools/index.md). ```python -import os -from griptape.structures import Agent -from griptape.drivers import GooglePromptDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=GooglePromptDriver( - model="gemini-pro", - api_key=os.environ['GOOGLE_API_KEY'], - ) - ) -) - -agent.run('Briefly explain how a computer works to a young child.') +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_8.py" ``` ### Amazon Bedrock @@ -245,35 +103,7 @@ This driver uses [Bedrock tool use](https://docs.aws.amazon.com/bedrock/latest/u All models supported by the Converse API are available for use with this driver. ```python -from griptape.structures import Agent -from griptape.drivers import AmazonBedrockPromptDriver -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - ) - ), - rules=[ - Rule( - value="You are a customer service agent that is classifying emails by type. I want you to give your answer and then explain it." - ) - ], -) -agent.run( - """How would you categorize this email? - - Can I use my Mixmaster 4000 to mix paint, or is it only meant for mixing food? - - - Categories are: - (A) Pre-sale question - (B) Broken or defective item - (C) Billing question - (D) Other (please explain)""" -) +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_9.py" ``` ### Ollama @@ -285,21 +115,7 @@ The [OllamaPromptDriver](../../reference/griptape/drivers/prompt/ollama_prompt_d This driver uses [Ollama tool calling](https://ollama.com/blog/tool-support) when using [Tools](../tools/index.md). ```python -from griptape.config import StructureConfig -from griptape.drivers import OllamaPromptDriver -from griptape.tools import Calculator -from griptape.structures import Agent - - -agent = Agent( - config=StructureConfig( - prompt_driver=OllamaPromptDriver( - model="llama3.1", - ), - ), - tools=[Calculator()], -) -agent.run("What is (192 + 12) ^ 4") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_10.py" ``` ### Hugging Face Hub @@ -315,58 +131,15 @@ The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/hugging Due to the limitations of Hugging Face serverless inference, only models that are than 10GB are supported. ```python -import os -from griptape.structures import Agent -from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.rules import Rule, Ruleset -from griptape.config import StructureConfig - - -agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="HuggingFaceH4/zephyr-7b-beta", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - ) - ), - rulesets=[ - Ruleset( - name="Girafatron", - rules=[ - Rule( - value="You are Girafatron, a giraffe-obsessed robot. You are talking to a human. " - "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " - "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." - ) - ], - ) - ], -) - -agent.run("Hello Girafatron, what is your favorite animal?") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_11.py" ``` #### Text Generation Interface The [HuggingFaceHubPromptDriver](#hugging-face-hub) also supports [Text Generation Interface](https://huggingface.co/docs/text-generation-inference/basic_tutorials/consuming_tgi#inference-client) for running models locally. To use Text Generation Interface, just set `model` to a TGI endpoint. -```python title="PYTEST_IGNORE" -import os -from griptape.structures import Agent -from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.config import StructureConfig - - -agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="http://127.0.0.1:8080", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - ), - ), -) - -agent.run("Write the code for a snake game.") +```python +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_12.py" ``` ### Hugging Face Pipeline @@ -380,31 +153,7 @@ The [HuggingFacePipelinePromptDriver](../../reference/griptape/drivers/prompt/hu Running a model locally can be a computationally expensive process. ```python -from griptape.structures import Agent -from griptape.drivers import HuggingFacePipelinePromptDriver -from griptape.rules import Rule, Ruleset -from griptape.config import StructureConfig - - -agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFacePipelinePromptDriver( - model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", - ) - ), - rulesets=[ - Ruleset( - name="Pirate", - rules=[ - Rule( - value="You are a pirate chatbot who always responds in pirate speak!" - ) - ], - ) - ], -) - -agent.run("How many helicopters can a human eat in one sitting?") +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_13.py" ``` ### Amazon SageMaker Jumpstart @@ -419,23 +168,6 @@ This Driver has been primarily _chat-optimized_ models that have a [Huggingface If your model does not fit this use-case, we suggest sub-classing [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) and overriding the `_to_model_input` and `_to_model_params` methods. -```python title="PYTEST_IGNORE" -import os -from griptape.structures import Agent -from griptape.drivers import ( - AmazonSageMakerJumpstartPromptDriver, - SageMakerFalconPromptModelDriver, -) -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonSageMakerJumpstartPromptDriver( - endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], - model="meta-llama/Meta-Llama-3-8B-Instruct", - ) - ) -) - -agent.run("What is a good lasagna recipe?") +```python +--8<-- "docs/griptape-framework/drivers/src/prompt_drivers_14.py" ``` diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md index 814112a12..c5c15e258 100644 --- a/docs/griptape-framework/drivers/sql-drivers.md +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -23,13 +23,7 @@ For example, to use the `psycopg2` driver for PostgreSQL, you can install it wit This is a basic SQL loader based on [SQLAlchemy 2.0](https://docs.sqlalchemy.org/en/20/). Here is an example of how to use it: ```python -from griptape.drivers import SqlDriver - -driver = SqlDriver( - engine_url="sqlite:///:memory:" -) - -driver.execute_query("select 'foo', 'bar';") +--8<-- "docs/griptape-framework/drivers/src/sql_drivers_1.py" ``` ### Amazon Redshift @@ -41,19 +35,7 @@ This is a SQL driver for interacting with the [Amazon Redshift Data API](https:/ to execute statements. Here is an example of how to use it for Redshift Serverless: ```python -import boto3 -import os -from griptape.drivers import AmazonRedshiftSqlDriver - -session = boto3.Session() - -driver = AmazonRedshiftSqlDriver( - database=os.environ["REDSHIFT_DATABASE"], - session=session, - cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], -) - -driver.execute_query("select * from people;") +--8<-- "docs/griptape-framework/drivers/src/sql_drivers_2.py" ``` ### Snowflake @@ -64,22 +46,5 @@ driver.execute_query("select * from people;") This is a SQL driver based on the [Snowflake SQLAlchemy Toolkit](https://docs.snowflake.com/en/developer-guide/python-connector/sqlalchemy) which runs on top of the Snowflake Connector for Python. Here is an example of how to use it: ```python -import os -import snowflake.connector -from snowflake.connector import SnowflakeConnection -from griptape.drivers import SnowflakeSqlDriver - -def get_snowflake_connection() -> SnowflakeConnection: - return snowflake.connector.connect( - account=os.environ['SNOWFLAKE_ACCOUNT'], - user=os.environ['SNOWFLAKE_USER'], - password=os.environ['SNOWFLAKE_PASSWORD'], - database=os.environ['SNOWFLAKE_DATABASE'], - schema=os.environ['SNOWFLAKE_SCHEMA'], - warehouse=os.environ['SNOWFLAKE_WAREHOUSE'] - ) - -driver = SnowflakeSqlDriver(connection_func=get_snowflake_connection) - -driver.execute_query("select * from people;") +--8<-- "docs/griptape-framework/drivers/src/sql_drivers_3.py" ``` diff --git a/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py b/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py new file mode 100644 index 000000000..e4415e1d4 --- /dev/null +++ b/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py @@ -0,0 +1,15 @@ +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.structures import Agent +from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient + +driver = OpenAiAudioTranscriptionDriver(model="whisper-1") + +tool = AudioTranscriptionClient( + off_prompt=False, + engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Agent(tools=[tool]).run("Transcribe the following audio file: tests/resources/sentences.wav") diff --git a/docs/griptape-framework/drivers/src/conversation_memory_drivers_1.py b/docs/griptape-framework/drivers/src/conversation_memory_drivers_1.py new file mode 100644 index 000000000..27829d8d2 --- /dev/null +++ b/docs/griptape-framework/drivers/src/conversation_memory_drivers_1.py @@ -0,0 +1,9 @@ +from griptape.drivers import LocalConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +local_driver = LocalConversationMemoryDriver(file_path="memory.json") +agent = Agent(conversation_memory=ConversationMemory(driver=local_driver)) + +agent.run("Surfing is my favorite sport.") +agent.run("What is my favorite sport?") diff --git a/docs/griptape-framework/drivers/src/conversation_memory_drivers_2.py b/docs/griptape-framework/drivers/src/conversation_memory_drivers_2.py new file mode 100644 index 000000000..9db525b42 --- /dev/null +++ b/docs/griptape-framework/drivers/src/conversation_memory_drivers_2.py @@ -0,0 +1,19 @@ +import os +import uuid + +from griptape.drivers import AmazonDynamoDbConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +dynamodb_driver = AmazonDynamoDbConversationMemoryDriver( + table_name=os.environ["DYNAMODB_TABLE_NAME"], + partition_key="id", + value_attribute_key="memory", + partition_key_value=conversation_id, +) + +agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") diff --git a/docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py b/docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py new file mode 100644 index 000000000..0f80d1393 --- /dev/null +++ b/docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py @@ -0,0 +1,20 @@ +import os +import uuid + +from griptape.drivers import RedisConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +redis_conversation_driver = RedisConversationMemoryDriver( + host=os.environ["REDIS_HOST"], + port=int(os.environ["REDIS_PORT"]), + password=os.environ["REDIS_PASSWORD"], + index=os.environ["REDIS_INDEX"], + conversation_id=conversation_id, +) + +agent = Agent(conversation_memory=ConversationMemory(driver=redis_conversation_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_1.py b/docs/griptape-framework/drivers/src/embedding_drivers_1.py new file mode 100644 index 000000000..e0663f490 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_1.py @@ -0,0 +1,6 @@ +from griptape.drivers import OpenAiEmbeddingDriver + +embeddings = OpenAiEmbeddingDriver().embed_string("Hello Griptape!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py new file mode 100644 index 000000000..40d08349f --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -0,0 +1,17 @@ +from griptape.config import StructureConfig +from griptape.drivers import ( + OpenAiChatPromptDriver, + VoyageAiEmbeddingDriver, +) +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +agent = Agent( + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), + embedding_driver=VoyageAiEmbeddingDriver(), + ), +) + +agent.run("based on https://www.griptape.ai/, tell me what Griptape is") diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_2.py b/docs/griptape-framework/drivers/src/embedding_drivers_2.py new file mode 100644 index 000000000..e9f58a7f2 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_2.py @@ -0,0 +1,11 @@ +from griptape.drivers import OpenAiEmbeddingDriver + +embedding_driver = OpenAiEmbeddingDriver( + base_url="http://127.0.0.1:1234/v1", + model="nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q2_K", +) + +embeddings = embedding_driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_3.py b/docs/griptape-framework/drivers/src/embedding_drivers_3.py new file mode 100644 index 000000000..0bf54311c --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_3.py @@ -0,0 +1,6 @@ +from griptape.drivers import AmazonBedrockTitanEmbeddingDriver + +embeddings = AmazonBedrockTitanEmbeddingDriver().embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_4.py b/docs/griptape-framework/drivers/src/embedding_drivers_4.py new file mode 100644 index 000000000..35e1f4303 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_4.py @@ -0,0 +1,6 @@ +from griptape.drivers import GoogleEmbeddingDriver + +embeddings = GoogleEmbeddingDriver().embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_5.py b/docs/griptape-framework/drivers/src/embedding_drivers_5.py new file mode 100644 index 000000000..e9d403f59 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_5.py @@ -0,0 +1,18 @@ +import os + +from griptape.drivers import HuggingFaceHubEmbeddingDriver +from griptape.tokenizers import HuggingFaceTokenizer + +driver = HuggingFaceHubEmbeddingDriver( + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + model="sentence-transformers/all-MiniLM-L6-v2", + tokenizer=HuggingFaceTokenizer( + model="sentence-transformers/all-MiniLM-L6-v2", + max_output_tokens=512, + ), +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_6.py b/docs/griptape-framework/drivers/src/embedding_drivers_6.py new file mode 100644 index 000000000..93ec06bb3 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_6.py @@ -0,0 +1,10 @@ +from griptape.drivers import OllamaEmbeddingDriver + +driver = OllamaEmbeddingDriver( + model="all-minilm", +) + +results = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(results[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_7.py b/docs/griptape-framework/drivers/src/embedding_drivers_7.py new file mode 100644 index 000000000..9c5b2adbd --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_7.py @@ -0,0 +1,13 @@ +import os + +from griptape.drivers import AmazonSageMakerJumpstartEmbeddingDriver + +driver = AmazonSageMakerJumpstartEmbeddingDriver( + endpoint=os.environ["SAGEMAKER_ENDPOINT"], + model=os.environ["SAGEMAKER_TENSORFLOW_HUB_MODEL"], +) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_8.py b/docs/griptape-framework/drivers/src/embedding_drivers_8.py new file mode 100644 index 000000000..312aa60bf --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_8.py @@ -0,0 +1,10 @@ +import os + +from griptape.drivers import VoyageAiEmbeddingDriver + +driver = VoyageAiEmbeddingDriver(api_key=os.environ["VOYAGE_API_KEY"]) + +embeddings = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_9.py b/docs/griptape-framework/drivers/src/embedding_drivers_9.py new file mode 100644 index 000000000..1b7677577 --- /dev/null +++ b/docs/griptape-framework/drivers/src/embedding_drivers_9.py @@ -0,0 +1,14 @@ +import os + +from griptape.drivers import CohereEmbeddingDriver + +embedding_driver = CohereEmbeddingDriver( + model="embed-english-v3.0", + api_key=os.environ["COHERE_API_KEY"], + input_type="search_document", +) + +embeddings = embedding_driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_1.py b/docs/griptape-framework/drivers/src/event_listener_drivers_1.py new file mode 100644 index 000000000..01b02cf76 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_1.py @@ -0,0 +1,32 @@ +import os + +from griptape.drivers import AmazonSqsEventListenerDriver +from griptape.events import EventListener, event_bus +from griptape.rules import Rule +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + driver=AmazonSqsEventListenerDriver( + queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], + ), + ), + ] +) + + +agent = Agent( + rules=[ + Rule(value="You will be provided with a block of text, and your task is to extract a list of keywords from it.") + ], +) + +agent.run( + """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. + Traditional reduction-fired blackware has been made for centuries by pueblo artists. + Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. + Another style involves carving or incising designs and selectively polishing the raised areas. + For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. + Several contemporary artists have created works honoring the pottery of their ancestors.""" +) diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_2.py b/docs/griptape-framework/drivers/src/event_listener_drivers_2.py new file mode 100644 index 000000000..8fd2e48c9 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_2.py @@ -0,0 +1,14 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import GriptapeCloudEventListenerDriver +from griptape.events import FinishStructureRunEvent + +# By default, GriptapeCloudEventListenerDriver uses the api key provided +# in the GT_CLOUD_API_KEY environment variable. +event_driver = GriptapeCloudEventListenerDriver() + +done_event = FinishStructureRunEvent( + output_task_input=TextArtifact("Just started!"), + output_task_output=TextArtifact("All done!"), +) + +event_driver.publish_event(done_event) diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_3.py b/docs/griptape-framework/drivers/src/event_listener_drivers_3.py new file mode 100644 index 000000000..3a2ba8560 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_3.py @@ -0,0 +1,31 @@ +import os + +from griptape.drivers import AmazonSqsEventListenerDriver +from griptape.events import EventListener, event_bus +from griptape.rules import Rule +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + driver=AmazonSqsEventListenerDriver( + queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], + ), + ), + ] +) + +agent = Agent( + rules=[ + Rule(value="You will be provided with a block of text, and your task is to extract a list of keywords from it.") + ], +) + +agent.run( + """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. + Traditional reduction-fired blackware has been made for centuries by pueblo artists. + Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. + Another style involves carving or incising designs and selectively polishing the raised areas. + For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. + Several contemporary artists have created works honoring the pottery of their ancestors.""" +) diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py new file mode 100644 index 000000000..dfac295b7 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py @@ -0,0 +1,26 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver +from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.rules import Rule +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + event_types=[FinishStructureRunEvent], + driver=AwsIotCoreEventListenerDriver( + topic=os.environ["AWS_IOT_CORE_TOPIC"], + iot_endpoint=os.environ["AWS_IOT_CORE_ENDPOINT"], + ), + ), + ] +) + +agent = Agent( + rules=[Rule(value="You will be provided with a text, and your task is to extract the airport codes from it.")], + config=StructureConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)), +) + +agent.run("I want to fly from Orlando to Boston") diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_5.py b/docs/griptape-framework/drivers/src/event_listener_drivers_5.py new file mode 100644 index 000000000..b72ca19d4 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_5.py @@ -0,0 +1,17 @@ +from griptape.drivers import GriptapeCloudEventListenerDriver +from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + event_types=[FinishStructureRunEvent], + # By default, GriptapeCloudEventListenerDriver uses the api key provided + # in the GT_CLOUD_API_KEY environment variable. + driver=GriptapeCloudEventListenerDriver(), + ), + ] +) + +agent = Agent() +agent.run("Create a list of 8 questions for an interview with a science fiction author.") diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_6.py b/docs/griptape-framework/drivers/src/event_listener_drivers_6.py new file mode 100644 index 000000000..0c594bf12 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_6.py @@ -0,0 +1,20 @@ +import os + +from griptape.drivers import WebhookEventListenerDriver +from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + event_types=[FinishStructureRunEvent], + driver=WebhookEventListenerDriver( + webhook_url=os.environ["WEBHOOK_URL"], + ), + ), + ] +) + +agent = Agent() + +agent.run("Analyze the pros and cons of remote work vs. office work") diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_7.py b/docs/griptape-framework/drivers/src/event_listener_drivers_7.py new file mode 100644 index 000000000..0d4f6abf5 --- /dev/null +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_7.py @@ -0,0 +1,26 @@ +import os + +from griptape.drivers import PusherEventListenerDriver +from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.structures import Agent + +event_bus.add_event_listeners( + [ + EventListener( + event_types=[FinishStructureRunEvent], + driver=PusherEventListenerDriver( + batched=False, + app_id=os.environ["PUSHER_APP_ID"], + key=os.environ["PUSHER_KEY"], + secret=os.environ["PUSHER_SECRET"], + cluster=os.environ["PUSHER_CLUSTER"], + channel="my-channel", + event_name="my-event", + ), + ), + ], +) + +agent = Agent() + +agent.run("Analyze the pros and cons of remote work vs. office work") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_1.py b/docs/griptape-framework/drivers/src/image_generation_drivers_1.py new file mode 100644 index 000000000..637b6ec7a --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_1.py @@ -0,0 +1,18 @@ +from griptape.drivers import OpenAiImageGenerationDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +driver = OpenAiImageGenerationDriver( + model="dall-e-2", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_2.py b/docs/griptape-framework/drivers/src/image_generation_drivers_2.py new file mode 100644 index 000000000..63663ae79 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_2.py @@ -0,0 +1,23 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +model_driver = BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", +) + +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=model_driver, + model="stability.stable-diffusion-xl-v0", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate an image of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_3.py b/docs/griptape-framework/drivers/src/image_generation_drivers_3.py new file mode 100644 index 000000000..630d80f20 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_3.py @@ -0,0 +1,21 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockTitanImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +model_driver = BedrockTitanImageGenerationModelDriver() + +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=model_driver, + model="amazon.titan-image-generator-v1", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_4.py b/docs/griptape-framework/drivers/src/image_generation_drivers_4.py new file mode 100644 index 000000000..428f470cf --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_4.py @@ -0,0 +1,23 @@ +import os + +from griptape.drivers import AzureOpenAiImageGenerationDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +driver = AzureOpenAiImageGenerationDriver( + model="dall-e-3", + azure_deployment=os.environ["AZURE_OPENAI_DALL_E_3_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], + api_key=os.environ["AZURE_OPENAI_API_KEY_2"], +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_5.py b/docs/griptape-framework/drivers/src/image_generation_drivers_5.py new file mode 100644 index 000000000..06157107f --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_5.py @@ -0,0 +1,23 @@ +import os + +from griptape.drivers import LeonardoImageGenerationDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +driver = LeonardoImageGenerationDriver( + model=os.environ["LEONARDO_MODEL_ID"], + api_key=os.environ["LEONARDO_API_KEY"], + image_width=512, + image_height=1024, +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_6.py b/docs/griptape-framework/drivers/src/image_generation_drivers_6.py new file mode 100644 index 000000000..feb8a54d7 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_6.py @@ -0,0 +1,19 @@ +from griptape.drivers import OpenAiImageGenerationDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +driver = OpenAiImageGenerationDriver( + model="dall-e-2", + image_size="512x512", +) + +engine = PromptImageGenerationEngine(image_generation_driver=driver) + +agent = Agent( + tools=[ + PromptImageGenerationClient(engine=engine), + ] +) + +agent.run("Generate a watercolor painting of a dog riding a skateboard") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_7.py b/docs/griptape-framework/drivers/src/image_generation_drivers_7.py new file mode 100644 index 000000000..041f2360d --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_7.py @@ -0,0 +1,21 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import HuggingFacePipelineImageGenerationDriver, StableDiffusion3ImageGenerationPipelineDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Pipeline +from griptape.tasks import PromptImageGenerationTask + +image_generation_task = PromptImageGenerationTask( + input=TextArtifact("landscape photograph, verdant, countryside, 8k"), + image_generation_engine=PromptImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3ImageGenerationPipelineDriver( + height=512, + width=512, + ), + ) + ), +) + +output_artifact = Pipeline(tasks=[image_generation_task]).run().output diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_8.py b/docs/griptape-framework/drivers/src/image_generation_drivers_8.py new file mode 100644 index 000000000..69437a3a5 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_8.py @@ -0,0 +1,30 @@ +from pathlib import Path + +from griptape.artifacts import TextArtifact +from griptape.drivers import ( + HuggingFacePipelineImageGenerationDriver, + StableDiffusion3Img2ImgImageGenerationPipelineDriver, +) +from griptape.engines import VariationImageGenerationEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import VariationImageGenerationTask + +prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") +input_image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +image_variation_task = VariationImageGenerationTask( + input=(prompt_artifact, input_image_artifact), + image_generation_engine=VariationImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3Img2ImgImageGenerationPipelineDriver( + height=1024, + width=1024, + ), + ) + ), +) + +output_artifact = Pipeline(tasks=[image_variation_task]).run().output diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_9.py b/docs/griptape-framework/drivers/src/image_generation_drivers_9.py new file mode 100644 index 000000000..2054588d9 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_9.py @@ -0,0 +1,31 @@ +from pathlib import Path + +from griptape.artifacts import TextArtifact +from griptape.drivers import ( + HuggingFacePipelineImageGenerationDriver, + StableDiffusion3ControlNetImageGenerationPipelineDriver, +) +from griptape.engines import VariationImageGenerationEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import VariationImageGenerationTask + +prompt_artifact = TextArtifact("landscape photograph, verdant, countryside, 8k") +control_image_artifact = ImageLoader().load(Path("canny_control_image.png").read_bytes()) + +controlnet_task = VariationImageGenerationTask( + input=(prompt_artifact, control_image_artifact), + image_generation_engine=VariationImageGenerationEngine( + image_generation_driver=HuggingFacePipelineImageGenerationDriver( + model="stabilityai/stable-diffusion-3-medium-diffusers", + device="cuda", + pipeline_driver=StableDiffusion3ControlNetImageGenerationPipelineDriver( + controlnet_model="InstantX/SD3-Controlnet-Canny", + height=768, + width=1024, + ), + ) + ), +) + +output_artifact = Pipeline(tasks=[controlnet_task]).run().output diff --git a/docs/griptape-framework/drivers/src/image_query_drivers_1.py b/docs/griptape-framework/drivers/src/image_query_drivers_1.py new file mode 100644 index 000000000..0c9db5be7 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_query_drivers_1.py @@ -0,0 +1,18 @@ +from pathlib import Path + +from griptape.drivers import AnthropicImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AnthropicImageQueryDriver( + model="claude-3-sonnet-20240229", + max_tokens=1024, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +engine.run("Describe the weather in the image", [image_artifact]) diff --git a/docs/griptape-framework/drivers/src/image_query_drivers_2.py b/docs/griptape-framework/drivers/src/image_query_drivers_2.py new file mode 100644 index 000000000..8d605c0d9 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_query_drivers_2.py @@ -0,0 +1,22 @@ +from pathlib import Path + +from griptape.drivers import AnthropicImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AnthropicImageQueryDriver( + model="claude-3-sonnet-20240229", + max_tokens=1024, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +image_artifact1 = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +image_artifact2 = ImageLoader().load(Path("tests/resources/cow.png").read_bytes()) + +result = engine.run("Describe the weather in the image", [image_artifact1, image_artifact2]) + +print(result) diff --git a/docs/griptape-framework/drivers/src/image_query_drivers_3.py b/docs/griptape-framework/drivers/src/image_query_drivers_3.py new file mode 100644 index 000000000..14070312b --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_query_drivers_3.py @@ -0,0 +1,18 @@ +from pathlib import Path + +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiImageQueryDriver( + model="gpt-4o", + max_tokens=256, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +engine.run("Describe the weather in the image", [image_artifact]) diff --git a/docs/griptape-framework/drivers/src/image_query_drivers_4.py b/docs/griptape-framework/drivers/src/image_query_drivers_4.py new file mode 100644 index 000000000..9ebf5ef59 --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_query_drivers_4.py @@ -0,0 +1,22 @@ +import os +from pathlib import Path + +from griptape.drivers import AzureOpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AzureOpenAiImageQueryDriver( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], + api_key=os.environ["AZURE_OPENAI_API_KEY_2"], + model="gpt-4o", + azure_deployment="gpt-4o", + max_tokens=256, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +engine.run("Describe the weather in the image", [image_artifact]) diff --git a/docs/griptape-framework/drivers/src/image_query_drivers_5.py b/docs/griptape-framework/drivers/src/image_query_drivers_5.py new file mode 100644 index 000000000..2bab9a7fd --- /dev/null +++ b/docs/griptape-framework/drivers/src/image_query_drivers_5.py @@ -0,0 +1,24 @@ +from pathlib import Path + +import boto3 + +from griptape.drivers import AmazonBedrockImageQueryDriver, BedrockClaudeImageQueryModelDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +session = boto3.Session(region_name="us-west-2") + +driver = AmazonBedrockImageQueryDriver( + image_query_model_driver=BedrockClaudeImageQueryModelDriver(), + model="anthropic.claude-3-sonnet-20240229-v1:0", + session=session, +) + +engine = ImageQueryEngine(image_query_driver=driver) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + + +result = engine.run("Describe the weather in the image", [image_artifact]) + +print(result) diff --git a/docs/griptape-framework/drivers/src/observability_drivers_1.py b/docs/griptape-framework/drivers/src/observability_drivers_1.py new file mode 100644 index 000000000..ac8a43800 --- /dev/null +++ b/docs/griptape-framework/drivers/src/observability_drivers_1.py @@ -0,0 +1,10 @@ +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.observability import Observability +from griptape.rules import Rule +from griptape.structures import Agent + +observability_driver = GriptapeCloudObservabilityDriver() + +with Observability(observability_driver=observability_driver): + agent = Agent(rules=[Rule("Output one word")]) + agent.run("Name an animal") diff --git a/docs/griptape-framework/drivers/src/observability_drivers_2.py b/docs/griptape-framework/drivers/src/observability_drivers_2.py new file mode 100644 index 000000000..f4c3d5663 --- /dev/null +++ b/docs/griptape-framework/drivers/src/observability_drivers_2.py @@ -0,0 +1,14 @@ +from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter + +from griptape.drivers import OpenTelemetryObservabilityDriver +from griptape.observability import Observability +from griptape.rules import Rule +from griptape.structures import Agent + +observability_driver = OpenTelemetryObservabilityDriver( + service_name="name-an-animal", span_processor=BatchSpanProcessor(ConsoleSpanExporter()) +) + +with Observability(observability_driver=observability_driver): + agent = Agent(rules=[Rule("Output one word")]) + agent.run("Name an animal") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_1.py b/docs/griptape-framework/drivers/src/prompt_drivers_1.py new file mode 100644 index 000000000..978435f2d --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_1.py @@ -0,0 +1,14 @@ +from griptape.config import StructureConfig +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), + ), + input="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", + rules=[Rule(value="Output only the sentiment.")], +) + +agent.run("I loved the new Batman movie!") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_10.py b/docs/griptape-framework/drivers/src/prompt_drivers_10.py new file mode 100644 index 000000000..02f083570 --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_10.py @@ -0,0 +1,14 @@ +from griptape.config import StructureConfig +from griptape.drivers import OllamaPromptDriver +from griptape.structures import Agent +from griptape.tools import Calculator + +agent = Agent( + config=StructureConfig( + prompt_driver=OllamaPromptDriver( + model="llama3.1", + ), + ), + tools=[Calculator()], +) +agent.run("What is (192 + 12) ^ 4") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_11.py b/docs/griptape-framework/drivers/src/prompt_drivers_11.py new file mode 100644 index 000000000..1c81c4785 --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_11.py @@ -0,0 +1,29 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=HuggingFaceHubPromptDriver( + model="HuggingFaceH4/zephyr-7b-beta", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + ) + ), + rulesets=[ + Ruleset( + name="Girafatron", + rules=[ + Rule( + value="You are Girafatron, a giraffe-obsessed robot. You are talking to a human. " + "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " + "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." + ) + ], + ) + ], +) + +agent.run("Hello Girafatron, what is your favorite animal?") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_12.py b/docs/griptape-framework/drivers/src/prompt_drivers_12.py new file mode 100644 index 000000000..d6f59f96e --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_12.py @@ -0,0 +1,16 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=HuggingFaceHubPromptDriver( + model="http://127.0.0.1:8080", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + ), + ), +) + +agent.run("Write the code for a snake game.") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_13.py b/docs/griptape-framework/drivers/src/prompt_drivers_13.py new file mode 100644 index 000000000..e4fe5208c --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_13.py @@ -0,0 +1,20 @@ +from griptape.config import StructureConfig +from griptape.drivers import HuggingFacePipelinePromptDriver +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=HuggingFacePipelinePromptDriver( + model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", + ) + ), + rulesets=[ + Ruleset( + name="Pirate", + rules=[Rule(value="You are a pirate chatbot who always responds in pirate speak!")], + ) + ], +) + +agent.run("How many helicopters can a human eat in one sitting?") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_14.py b/docs/griptape-framework/drivers/src/prompt_drivers_14.py new file mode 100644 index 000000000..85bd5216e --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_14.py @@ -0,0 +1,18 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import ( + AmazonSageMakerJumpstartPromptDriver, +) +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=AmazonSageMakerJumpstartPromptDriver( + endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], + model="meta-llama/Meta-Llama-3-8B-Instruct", + ) + ) +) + +agent.run("What is a good lasagna recipe?") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_2.py b/docs/griptape-framework/drivers/src/prompt_drivers_2.py new file mode 100644 index 000000000..af516f877 --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_2.py @@ -0,0 +1,20 @@ +from griptape.common import PromptStack +from griptape.drivers import OpenAiChatPromptDriver + +stack = PromptStack() + +stack.add_system_message("You will be provided with Python code, and your task is to calculate its time complexity.") +stack.add_user_message( + """ + def foo(n, k): + accum = 0 + for i in range(n): + for l in range(k): + accum += i + return accum + """ +) + +result = OpenAiChatPromptDriver(model="gpt-3.5-turbo-16k", temperature=0).run(stack) + +print(result.value) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_3.py b/docs/griptape-framework/drivers/src/prompt_drivers_3.py new file mode 100644 index 000000000..b92596aca --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_3.py @@ -0,0 +1,22 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver( + api_key=os.environ["OPENAI_API_KEY"], + temperature=0.1, + model="gpt-4o", + response_format="json_object", + seed=42, + ) + ), + input="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", + rules=[Rule(value='Write your output in json with a single key called "css_code".')], +) + +agent.run("Blue sky at dusk.") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_4.py b/docs/griptape-framework/drivers/src/prompt_drivers_4.py new file mode 100644 index 000000000..b024638b7 --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_4.py @@ -0,0 +1,15 @@ +from griptape.config import StructureConfig +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver( + base_url="http://127.0.0.1:1234/v1", model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", stream=True + ) + ), + rules=[Rule(value="You are a helpful coding assistant.")], +) + +agent.run("How do I init and update a git submodule?") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_5.py b/docs/griptape-framework/drivers/src/prompt_drivers_5.py new file mode 100644 index 000000000..ffe9a4e0a --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_5.py @@ -0,0 +1,25 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import AzureOpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=AzureOpenAiChatPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="gpt-3.5-turbo", + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + ) + ), + rules=[ + Rule( + value="You will be provided with text, and your task is to translate it into emojis. " + "Do not use any regular text. Do your best with emojis only." + ) + ], +) + +agent.run("Artificial intelligence is a technology with great promise.") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_6.py b/docs/griptape-framework/drivers/src/prompt_drivers_6.py new file mode 100644 index 000000000..2bd1b00fb --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_6.py @@ -0,0 +1,16 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import CoherePromptDriver +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=CoherePromptDriver( + model="command-r", + api_key=os.environ["COHERE_API_KEY"], + ) + ) +) + +agent.run('What is the sentiment of this review? Review: "I really enjoyed this movie!"') diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_7.py b/docs/griptape-framework/drivers/src/prompt_drivers_7.py new file mode 100644 index 000000000..dd1c15370 --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_7.py @@ -0,0 +1,16 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import AnthropicPromptDriver +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=AnthropicPromptDriver( + model="claude-3-opus-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], + ) + ) +) + +agent.run("Where is the best place to see cherry blossums in Japan?") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_8.py b/docs/griptape-framework/drivers/src/prompt_drivers_8.py new file mode 100644 index 000000000..1bbf2848c --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_8.py @@ -0,0 +1,16 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import GooglePromptDriver +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=GooglePromptDriver( + model="gemini-pro", + api_key=os.environ["GOOGLE_API_KEY"], + ) + ) +) + +agent.run("Briefly explain how a computer works to a young child.") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_9.py b/docs/griptape-framework/drivers/src/prompt_drivers_9.py new file mode 100644 index 000000000..cdd0db82d --- /dev/null +++ b/docs/griptape-framework/drivers/src/prompt_drivers_9.py @@ -0,0 +1,29 @@ +from griptape.config import StructureConfig +from griptape.drivers import AmazonBedrockPromptDriver +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + ) + ), + rules=[ + Rule( + value="You are a customer service agent that is classifying emails by type. I want you to give your answer and then explain it." + ) + ], +) +agent.run( + """How would you categorize this email? + + Can I use my Mixmaster 4000 to mix paint, or is it only meant for mixing food? + + + Categories are: + (A) Pre-sale question + (B) Broken or defective item + (C) Billing question + (D) Other (please explain)""" +) diff --git a/docs/griptape-framework/drivers/src/sql_drivers_1.py b/docs/griptape-framework/drivers/src/sql_drivers_1.py new file mode 100644 index 000000000..7b03799a9 --- /dev/null +++ b/docs/griptape-framework/drivers/src/sql_drivers_1.py @@ -0,0 +1,5 @@ +from griptape.drivers import SqlDriver + +driver = SqlDriver(engine_url="sqlite:///:memory:") + +driver.execute_query("select 'foo', 'bar';") diff --git a/docs/griptape-framework/drivers/src/sql_drivers_2.py b/docs/griptape-framework/drivers/src/sql_drivers_2.py new file mode 100644 index 000000000..37087bc16 --- /dev/null +++ b/docs/griptape-framework/drivers/src/sql_drivers_2.py @@ -0,0 +1,15 @@ +import os + +import boto3 + +from griptape.drivers import AmazonRedshiftSqlDriver + +session = boto3.Session() + +driver = AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ["REDSHIFT_CLUSTER_IDENTIFIER"], +) + +driver.execute_query("select * from people;") diff --git a/docs/griptape-framework/drivers/src/sql_drivers_3.py b/docs/griptape-framework/drivers/src/sql_drivers_3.py new file mode 100644 index 000000000..29ee4a818 --- /dev/null +++ b/docs/griptape-framework/drivers/src/sql_drivers_3.py @@ -0,0 +1,22 @@ +import os + +import snowflake.connector +from snowflake.connector import SnowflakeConnection + +from griptape.drivers import SnowflakeSqlDriver + + +def get_snowflake_connection() -> SnowflakeConnection: + return snowflake.connector.connect( + account=os.environ["SNOWFLAKE_ACCOUNT"], + user=os.environ["SNOWFLAKE_USER"], + password=os.environ["SNOWFLAKE_PASSWORD"], + database=os.environ["SNOWFLAKE_DATABASE"], + schema=os.environ["SNOWFLAKE_SCHEMA"], + warehouse=os.environ["SNOWFLAKE_WAREHOUSE"], + ) + + +driver = SnowflakeSqlDriver(connection_func=get_snowflake_connection) + +driver.execute_query("select * from people;") diff --git a/docs/griptape-framework/drivers/src/structure_run_drivers_1.py b/docs/griptape-framework/drivers/src/structure_run_drivers_1.py new file mode 100644 index 000000000..00ab6d60f --- /dev/null +++ b/docs/griptape-framework/drivers/src/structure_run_drivers_1.py @@ -0,0 +1,47 @@ +from griptape.drivers import LocalStructureRunDriver +from griptape.rules import Rule +from griptape.structures import Agent, Pipeline +from griptape.tasks import StructureRunTask + + +def build_joke_teller() -> Agent: + joke_teller = Agent( + rules=[ + Rule( + value="You are very funny.", + ) + ], + ) + + return joke_teller + + +def build_joke_rewriter() -> Agent: + joke_rewriter = Agent( + rules=[ + Rule( + value="You are the editor of a joke book. But you only speak in riddles", + ) + ], + ) + + return joke_rewriter + + +joke_coordinator = Pipeline( + tasks=[ + StructureRunTask( + driver=LocalStructureRunDriver( + structure_factory_fn=build_joke_teller, + ), + ), + StructureRunTask( + ("Rewrite this joke: {{ parent_output }}",), + driver=LocalStructureRunDriver( + structure_factory_fn=build_joke_rewriter, + ), + ), + ] +) + +joke_coordinator.run("Tell me a joke") diff --git a/docs/griptape-framework/drivers/src/structure_run_drivers_2.py b/docs/griptape-framework/drivers/src/structure_run_drivers_2.py new file mode 100644 index 000000000..6103a6507 --- /dev/null +++ b/docs/griptape-framework/drivers/src/structure_run_drivers_2.py @@ -0,0 +1,41 @@ +import os + +from griptape.drivers import GriptapeCloudStructureRunDriver, LocalStructureRunDriver +from griptape.rules import Rule +from griptape.structures import Agent, Pipeline +from griptape.tasks import StructureRunTask + +base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] +api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] + + +pipeline = Pipeline( + tasks=[ + StructureRunTask( + ("Think of a question related to Retrieval Augmented Generation.",), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: Agent( + rules=[ + Rule( + value="You are an expert in Retrieval Augmented Generation.", + ), + Rule( + value="Only output your answer, no other information.", + ), + ] + ) + ), + ), + StructureRunTask( + ("{{ parent_output }}",), + driver=GriptapeCloudStructureRunDriver( + base_url=base_url, + api_key=api_key, + structure_id=structure_id, + ), + ), + ] +) + +pipeline.run() diff --git a/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py b/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py new file mode 100644 index 000000000..c6a03b80d --- /dev/null +++ b/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py @@ -0,0 +1,20 @@ +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.structures import Agent +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.environ["ELEVEN_LABS_API_KEY"], + model="eleven_multilingual_v2", + voice="Matilda", +) + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") diff --git a/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py b/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py new file mode 100644 index 000000000..99927a390 --- /dev/null +++ b/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py @@ -0,0 +1,14 @@ +from griptape.drivers import OpenAiTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.structures import Agent +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient + +driver = OpenAiTextToSpeechDriver() + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_1.py b/docs/griptape-framework/drivers/src/vector_store_drivers_1.py new file mode 100644 index 000000000..a4e54da3a --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_1.py @@ -0,0 +1,24 @@ +import os + +from griptape.artifacts import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_10.py b/docs/griptape-framework/drivers/src/vector_store_drivers_10.py new file mode 100644 index 000000000..b7645bd82 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_10.py @@ -0,0 +1,41 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import OpenAiEmbeddingDriver, QdrantVectorStoreDriver +from griptape.loaders import WebLoader + +# Set up environment variables +host = os.environ["QDRANT_CLUSTER_ENDPOINT"] +api_key = os.environ["QDRANT_CLUSTER_API_KEY"] + +# Initialize an Embedding Driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = QdrantVectorStoreDriver( + url=host, + collection_name="griptape", + content_payload_key="content", + embedding_driver=embedding_driver, + api_key=api_key, +) + +# Load Artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Recreate Qdrant collection +vector_store_driver.client.recreate_collection( + collection_name=vector_store_driver.collection_name, + vectors_config={"size": 1536, "distance": vector_store_driver.distance}, +) + +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_11.py b/docs/griptape-framework/drivers/src/vector_store_drivers_11.py new file mode 100644 index 000000000..965f97715 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_11.py @@ -0,0 +1,36 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import AstraDbVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Astra DB secrets and connection parameters +api_endpoint = os.environ["ASTRA_DB_API_ENDPOINT"] +token = os.environ["ASTRA_DB_APPLICATION_TOKEN"] +astra_db_namespace = os.environ.get("ASTRA_DB_KEYSPACE") # optional + +# Initialize an Embedding Driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = AstraDbVectorStoreDriver( + embedding_driver=embedding_driver, + api_endpoint=api_endpoint, + token=token, + collection_name="griptape_test_collection", + astra_db_namespace=astra_db_namespace, # optional +) + +# Load Artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_2.py b/docs/griptape-framework/drivers/src/vector_store_drivers_2.py new file mode 100644 index 000000000..f8b500924 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_2.py @@ -0,0 +1,17 @@ +import os + +from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver + +# Initialize environment variables +gt_cloud_api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +gt_cloud_knowledge_base_id = os.environ["GRIPTAPE_CLOUD_KB_ID"] + +vector_store_driver = GriptapeCloudKnowledgeBaseVectorStoreDriver( + api_key=gt_cloud_api_key, knowledge_base_id=gt_cloud_knowledge_base_id +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_3.py b/docs/griptape-framework/drivers/src/vector_store_drivers_3.py new file mode 100644 index 000000000..d2cfc8142 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_3.py @@ -0,0 +1,30 @@ +import os + +from griptape.artifacts import ErrorArtifact +from griptape.drivers import OpenAiEmbeddingDriver, PineconeVectorStoreDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = PineconeVectorStoreDriver( + api_key=os.environ["PINECONE_API_KEY"], + environment=os.environ["PINECONE_ENVIRONMENT"], + index_name=os.environ["PINECONE_INDEX_NAME"], + embedding_driver=embedding_driver, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_4.py b/docs/griptape-framework/drivers/src/vector_store_drivers_4.py new file mode 100644 index 000000000..fe35f1ff5 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_4.py @@ -0,0 +1,39 @@ +import os + +from griptape.artifacts import ErrorArtifact +from griptape.drivers import MarqoVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) +prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") + +# Define the namespace +namespace = "griptape-ai" + +# Initialize the Vector Store Driver +vector_store_driver = MarqoVectorStoreDriver( + api_key=os.environ["MARQO_API_KEY"], + url=os.environ["MARQO_URL"], + index=os.environ["MARQO_INDEX_NAME"], + embedding_driver=embedding_driver, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_5.py b/docs/griptape-framework/drivers/src/vector_store_drivers_5.py new file mode 100644 index 000000000..867195a48 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_5.py @@ -0,0 +1,45 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import MongoDbAtlasVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +host = os.environ["MONGODB_HOST"] +username = os.environ["MONGODB_USERNAME"] +password = os.environ["MONGODB_PASSWORD"] +database_name = os.environ["MONGODB_DATABASE_NAME"] +collection_name = os.environ["MONGODB_COLLECTION_NAME"] +index_name = os.environ["MONGODB_INDEX_NAME"] +vector_path = os.environ["MONGODB_VECTOR_PATH"] + +# Initialize the Vector Store Driver +vector_store_driver = MongoDbAtlasVectorStoreDriver( + connection_string=f"mongodb+srv://{username}:{password}@{host}/{database_name}", + database_name=database_name, + collection_name=collection_name, + embedding_driver=embedding_driver, + index_name=index_name, + vector_path=vector_path, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_6.py b/docs/griptape-framework/drivers/src/vector_store_drivers_6.py new file mode 100644 index 000000000..9c5c9cab6 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_6.py @@ -0,0 +1,45 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import AzureMongoDbVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +azure_host = os.environ["AZURE_MONGODB_HOST"] +username = os.environ["AZURE_MONGODB_USERNAME"] +password = os.environ["AZURE_MONGODB_PASSWORD"] +database_name = os.environ["AZURE_MONGODB_DATABASE_NAME"] +collection_name = os.environ["AZURE_MONGODB_COLLECTION_NAME"] +index_name = os.environ["AZURE_MONGODB_INDEX_NAME"] +vector_path = os.environ["AZURE_MONGODB_VECTOR_PATH"] + +# Initialize the Vector Store Driver +vector_store_driver = AzureMongoDbVectorStoreDriver( + connection_string=f"mongodb+srv://{username}:{password}@{azure_host}/{database_name}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000", + database_name=database_name, + collection_name=collection_name, + embedding_driver=embedding_driver, + index_name=index_name, + vector_path=vector_path, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_7.py b/docs/griptape-framework/drivers/src/vector_store_drivers_7.py new file mode 100644 index 000000000..c08d9ff3b --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_7.py @@ -0,0 +1,35 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import OpenAiEmbeddingDriver, RedisVectorStoreDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = RedisVectorStoreDriver( + host=os.environ["REDIS_HOST"], + port=int(os.environ["REDIS_PORT"]), + password=os.environ["REDIS_PASSWORD"], + index=os.environ["REDIS_INDEX"], + embedding_driver=embedding_driver, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_8.py b/docs/griptape-framework/drivers/src/vector_store_drivers_8.py new file mode 100644 index 000000000..a57363eb3 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_8.py @@ -0,0 +1,36 @@ +import os + +import boto3 + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import AmazonOpenSearchVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +vector_store_driver = AmazonOpenSearchVectorStoreDriver( + host=os.environ["AMAZON_OPENSEARCH_HOST"], + index_name=os.environ["AMAZON_OPENSEARCH_INDEX_NAME"], + session=boto3.Session(), + embedding_driver=embedding_driver, +) + +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/vector_store_drivers_9.py b/docs/griptape-framework/drivers/src/vector_store_drivers_9.py new file mode 100644 index 000000000..c5aface63 --- /dev/null +++ b/docs/griptape-framework/drivers/src/vector_store_drivers_9.py @@ -0,0 +1,42 @@ +import os + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import OpenAiEmbeddingDriver, PgVectorVectorStoreDriver +from griptape.loaders import WebLoader + +# Initialize an Embedding Driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) + +db_user = os.environ["POSTGRES_USER"] +db_pass = os.environ["POSTGRES_PASSWORD"] +db_host = os.environ["POSTGRES_HOST"] +db_port = os.environ["POSTGRES_PORT"] +db_name = os.environ["POSTGRES_DB"] +db_connection_string = f"postgresql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}" +vector_store_driver = PgVectorVectorStoreDriver( + connection_string=db_connection_string, + embedding_driver=embedding_driver, + table_name="griptape_vectors", +) + +# Install required Postgres extensions and create database schema. +vector_store_driver.setup() + +# Load Artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( + { + "griptape": artifacts, + } +) + +results = vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_1.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_1.py new file mode 100644 index 000000000..8b9e9dbd1 --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_1.py @@ -0,0 +1,20 @@ +import os + +from griptape.drivers import ProxyWebScraperDriver + +query_params = [ + "markdown_response=true", + "js_render=false", + "premium_proxy=false", +] +proxy_url = f'http://{os.environ["ZENROWS_API_KEY"]}:{"&".join(query_params)}@proxy.zenrows.com:8001' + +driver = ProxyWebScraperDriver( + proxies={ + "http": proxy_url, + "https": proxy_url, + }, + params={"verify": False}, +) + +driver.scrape_url("https://griptape.ai") diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_2.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_2.py new file mode 100644 index 000000000..db7c1db5a --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_2.py @@ -0,0 +1,5 @@ +from griptape.drivers import MarkdownifyWebScraperDriver + +driver = MarkdownifyWebScraperDriver() + +driver.scrape_url("https://griptape.ai") diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py new file mode 100644 index 000000000..d9fe11e85 --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py @@ -0,0 +1,15 @@ +from griptape.drivers import MarkdownifyWebScraperDriver +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +agent = Agent( + tools=[ + WebScraper( + web_loader=WebLoader(web_scraper_driver=MarkdownifyWebScraperDriver(timeout=1000)), + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], +) +agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_4.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_4.py new file mode 100644 index 000000000..50d0a73a4 --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_4.py @@ -0,0 +1,5 @@ +from griptape.drivers import TrafilaturaWebScraperDriver + +driver = TrafilaturaWebScraperDriver() + +driver.scrape_url("https://griptape.ai") diff --git a/docs/griptape-framework/drivers/src/web_search_drivers_1.py b/docs/griptape-framework/drivers/src/web_search_drivers_1.py new file mode 100644 index 000000000..1affc64df --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_search_drivers_1.py @@ -0,0 +1,10 @@ +import os + +from griptape.drivers import GoogleWebSearchDriver + +driver = GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], +) + +driver.search("griptape ai") diff --git a/docs/griptape-framework/drivers/src/web_search_drivers_2.py b/docs/griptape-framework/drivers/src/web_search_drivers_2.py new file mode 100644 index 000000000..5cde1a9a8 --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_search_drivers_2.py @@ -0,0 +1,18 @@ +import os + +from griptape.drivers import GoogleWebSearchDriver +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebSearch + +agent = Agent( + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + ), + TaskMemoryClient(off_prompt=False), + ], +) +agent.run("Give me some websites with information about AI frameworks.") diff --git a/docs/griptape-framework/drivers/src/web_search_drivers_3.py b/docs/griptape-framework/drivers/src/web_search_drivers_3.py new file mode 100644 index 000000000..3ce932649 --- /dev/null +++ b/docs/griptape-framework/drivers/src/web_search_drivers_3.py @@ -0,0 +1,5 @@ +from griptape.drivers import DuckDuckGoWebSearchDriver + +driver = DuckDuckGoWebSearchDriver() + +driver.search("griptape ai") diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index 5916d6e20..00890cb4a 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -14,50 +14,7 @@ When combined with the [Structure Run Task](../../griptape-framework/structures/ The [LocalStructureRunDriver](../../reference/griptape/drivers/structure_run/local_structure_run_driver.md) is used to run Griptape Structures in the same runtime environment as the code that is running the Structure. ```python -from griptape.drivers import LocalStructureRunDriver -from griptape.rules import Rule -from griptape.structures import Agent, Pipeline -from griptape.tasks import StructureRunTask - -def build_joke_teller(): - joke_teller = Agent( - rules=[ - Rule( - value="You are very funny.", - ) - ], - ) - - return joke_teller - -def build_joke_rewriter(): - joke_rewriter = Agent( - rules=[ - Rule( - value="You are the editor of a joke book. But you only speak in riddles", - ) - ], - ) - - return joke_rewriter - -joke_coordinator = Pipeline( - tasks=[ - StructureRunTask( - driver=LocalStructureRunDriver( - structure_factory_fn=build_joke_teller, - ), - ), - StructureRunTask( - ("Rewrite this joke: {{ parent_output }}",), - driver=LocalStructureRunDriver( - structure_factory_fn=build_joke_rewriter, - ), - ), - ] -) - -joke_coordinator.run("Tell me a joke") +--8<-- "docs/griptape-framework/drivers/src/structure_run_drivers_1.py" ``` ### Griptape Cloud @@ -66,45 +23,5 @@ The [GriptapeCloudStructureRunDriver](../../reference/griptape/drivers/structure ```python -import os - -from griptape.drivers import GriptapeCloudStructureRunDriver, LocalStructureRunDriver -from griptape.structures import Pipeline, Agent -from griptape.rules import Rule -from griptape.tasks import StructureRunTask - -base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] -api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] -structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] - - -pipeline = Pipeline( - tasks=[ - StructureRunTask( - ("Think of a question related to Retrieval Augmented Generation.",), - driver=LocalStructureRunDriver( - structure_factory_fn=lambda: Agent( - rules=[ - Rule( - value="You are an expert in Retrieval Augmented Generation.", - ), - Rule( - value="Only output your answer, no other information.", - ), - ] - ) - ), - ), - StructureRunTask( - ("{{ parent_output }}",), - driver=GriptapeCloudStructureRunDriver( - base_url=base_url, - api_key=api_key, - structure_id=structure_id, - ), - ), - ] -) - -pipeline.run() +--8<-- "docs/griptape-framework/drivers/src/structure_run_drivers_2.py" ``` diff --git a/docs/griptape-framework/drivers/text-to-speech-drivers.md b/docs/griptape-framework/drivers/text-to-speech-drivers.md index 0b27647ac..19d58504e 100644 --- a/docs/griptape-framework/drivers/text-to-speech-drivers.md +++ b/docs/griptape-framework/drivers/text-to-speech-drivers.md @@ -16,27 +16,7 @@ Provide a Driver when building an [Engine](../engines/audio-engines.md), then pa The [Eleven Labs Text to Speech Driver](../../reference/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.md) provides support for text-to-speech models hosted by Eleven Labs. This Driver supports configurations specific to Eleven Labs, like voice selection and output format. ```python -import os - -from griptape.drivers import ElevenLabsTextToSpeechDriver -from griptape.engines import TextToSpeechEngine -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient -from griptape.structures import Agent - - -driver = ElevenLabsTextToSpeechDriver( - api_key=os.getenv("ELEVEN_LABS_API_KEY"), - model="eleven_multilingual_v2", - voice="Matilda", -) - -tool = TextToSpeechClient( - engine=TextToSpeechEngine( - text_to_speech_driver=driver, - ), -) - -Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") +--8<-- "docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py" ``` ## OpenAI @@ -44,18 +24,5 @@ Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") The [OpenAI Text to Speech Driver](../../reference/griptape/drivers/text_to_speech/openai_text_to_speech_driver.md) provides support for text-to-speech models hosted by OpenAI. This Driver supports configurations specific to OpenAI, like voice selection and output format. ```python -from griptape.drivers import OpenAiTextToSpeechDriver -from griptape.engines import TextToSpeechEngine -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient -from griptape.structures import Agent - -driver = OpenAiTextToSpeechDriver() - -tool = TextToSpeechClient( - engine=TextToSpeechEngine( - text_to_speech_driver=driver, - ), -) - -Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") +--8<-- "docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py" ``` diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index ad826d0aa..7cca64a46 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -28,27 +28,7 @@ Each Vector Store Driver takes a [BaseEmbeddingDriver](../../reference/griptape/ The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the Driver can be used to load a webpage into the Driver and query it later: ```python -import os -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_1.py" ``` ### Griptape Cloud Knowledge Base @@ -56,21 +36,7 @@ print("\n\n".join(values)) The [GriptapeCloudKnowledgeBaseVectorStoreDriver](../../reference/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.md) can be used to query data from a Griptape Cloud Knowledge Base. Loading into Knowledge Bases is not supported at this time, only querying. Here is a complete example of how the Driver can be used to query an existing Knowledge Base: ```python -import os -from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver - - -# Initialize environment variables -gt_cloud_api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] -gt_cloud_knowledge_base_id = os.environ["GRIPTAPE_CLOUD_KB_ID"] - -vector_store_driver = GriptapeCloudKnowledgeBaseVectorStoreDriver(api_key=gt_cloud_api_key, knowledge_base_id=gt_cloud_knowledge_base_id) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_2.py" ``` ### Pinecone @@ -83,32 +49,7 @@ The [PineconeVectorStoreDriver](../../reference/griptape/drivers/vector/pinecone Here is an example of how the Driver can be used to load and query information in a Pinecone cluster: ```python -import os -from griptape.drivers import PineconeVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = PineconeVectorStoreDriver( - api_key=os.environ["PINECONE_API_KEY"], - environment=os.environ["PINECONE_ENVIRONMENT"], - index_name=os.environ["PINECONE_INDEX_NAME"], - embedding_driver=embedding_driver, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_3.py" ``` ### Marqo @@ -121,40 +62,7 @@ The [MarqoVectorStoreDriver](../../reference/griptape/drivers/vector/marqo_vecto Here is an example of how the Driver can be used to load and query information in a Marqo cluster: ```python -import os -from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.loaders import WebLoader - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) -prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") - -# Define the namespace -namespace = 'griptape-ai' - -# Initialize the Vector Store Driver -vector_store_driver = MarqoVectorStoreDriver( - api_key=os.environ["MARQO_API_KEY"], - url=os.environ["MARQO_URL"], - index=os.environ["MARQO_INDEX_NAME"], - embedding_driver=embedding_driver, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_4.py" ``` ### Mongodb Atlas @@ -167,46 +75,7 @@ The [MongodbAtlasVectorStoreDriver](../../reference/griptape/drivers/vector/mong Here is an example of how the Driver can be used to load and query information in a MongoDb Atlas Cluster: ```python -from griptape.drivers import MongoDbAtlasVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader -import os - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -host = os.environ["MONGODB_HOST"] -username = os.environ["MONGODB_USERNAME"] -password = os.environ["MONGODB_PASSWORD"] -database_name = os.environ["MONGODB_DATABASE_NAME"] -collection_name = os.environ[ "MONGODB_COLLECTION_NAME"] -index_name = os.environ["MONGODB_INDEX_NAME"] -vector_path = os.environ["MONGODB_VECTOR_PATH"] - -# Initialize the Vector Store Driver -vector_store_driver = MongoDbAtlasVectorStoreDriver( - connection_string=f"mongodb+srv://{username}:{password}@{host}/{database_name}", - database_name=database_name, - collection_name=collection_name, - embedding_driver=embedding_driver, - index_name=index_name, - vector_path=vector_path, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_5.py" ``` The format for creating a vector index should look similar to the following: @@ -238,46 +107,7 @@ The [AzureMongoDbVectorStoreDriver](../../reference/griptape/drivers/vector/azur Here is an example of how the Driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is very similar to the Driver for [MongoDb Atlas](#mongodb-atlas): ```python -from griptape.drivers import AzureMongoDbVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader -import os - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -azure_host = os.environ["AZURE_MONGODB_HOST"] -username = os.environ["AZURE_MONGODB_USERNAME"] -password = os.environ["AZURE_MONGODB_PASSWORD"] -database_name = os.environ["AZURE_MONGODB_DATABASE_NAME"] -collection_name = os.environ["AZURE_MONGODB_COLLECTION_NAME"] -index_name = os.environ["AZURE_MONGODB_INDEX_NAME"] -vector_path = os.environ["AZURE_MONGODB_VECTOR_PATH"] - -# Initialize the Vector Store Driver -vector_store_driver = AzureMongoDbVectorStoreDriver( - connection_string=f"mongodb+srv://{username}:{password}@{azure_host}/{database_name}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000", - database_name=database_name, - collection_name=collection_name, - embedding_driver=embedding_driver, - index_name=index_name, - vector_path=vector_path, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_6.py" ``` ### Redis @@ -290,37 +120,7 @@ The [RedisVectorStoreDriver](../../reference/griptape/drivers/vector/redis_vecto Here is an example of how the Driver can be used to load and query information in a Redis Cluster: ```python -import os -from griptape.drivers import RedisVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader -import numpy as np # Assuming you'd use numpy to create a dummy vector for the sake of example. - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = RedisVectorStoreDriver( - host=os.environ["REDIS_HOST"], - port=os.environ["REDIS_PORT"], - password=os.environ["REDIS_PASSWORD"], - index=os.environ["REDIS_INDEX"], - embedding_driver=embedding_driver, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_7.py" ``` The format for creating a vector index should be similar to the following: @@ -338,36 +138,7 @@ The [OpenSearchVectorStoreDriver](../../reference/griptape/drivers/vector/opense Here is an example of how the Driver can be used to load and query information in an OpenSearch Cluster: ```python -import os -import boto3 -from griptape.drivers import AmazonOpenSearchVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - -# Initialize an Embedding Driver -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = AmazonOpenSearchVectorStoreDriver( - host=os.environ["AMAZON_OPENSEARCH_HOST"], - index_name=os.environ["AMAZON_OPENSEARCH_INDEX_NAME"], - session=boto3.Session(), - embedding_driver=embedding_driver, -) - -# Load Artifacts from the web -artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_8.py" ``` The body mappings for creating a vector index should look similar to the following: @@ -393,43 +164,7 @@ The [PGVectorVectorStoreDriver](../../reference/griptape/drivers/vector/pgvector Here is an example of how the Driver can be used to load and query information in a Postgres database: ```python -import os -from griptape.drivers import PgVectorVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - -# Initialize an Embedding Driver. -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -db_user = os.environ["POSTGRES_USER"] -db_pass = os.environ["POSTGRES_PASSWORD"] -db_host = os.environ["POSTGRES_HOST"] -db_port = os.environ["POSTGRES_PORT"] -db_name = os.environ["POSTGRES_DB"] -db_connection_string = f"postgresql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}" -vector_store_driver = PgVectorVectorStoreDriver( - connection_string=db_connection_string, - embedding_driver=embedding_driver, - table_name="griptape_vectors", -) - -# Install required Postgres extensions and create database schema. -vector_store_driver.setup() - -# Load Artifacts from the web -artifacts = WebLoader().load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -vector_store_driver.upsert_text_artifacts( - { - "griptape": artifacts, - } -) - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_9.py" ``` ### Qdrant @@ -442,45 +177,7 @@ The QdrantVectorStoreDriver supports the [Qdrant vector database](https://qdrant Here is an example of how the Driver can be used to query information in a Qdrant collection: ```python -import os -from griptape.drivers import QdrantVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - -# Set up environment variables -host = os.environ["QDRANT_CLUSTER_ENDPOINT"] -api_key = os.environ["QDRANT_CLUSTER_API_KEY"] - -# Initialize an Embedding Driver. -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = QdrantVectorStoreDriver( - url=host, - collection_name="griptape", - content_payload_key="content", - embedding_driver=embedding_driver, - api_key=api_key, -) - -# Load Artifacts from the web -artifacts = WebLoader().load("https://www.griptape.ai") - -# Recreate Qdrant collection -vector_store_driver.client.recreate_collection( - collection_name=vector_store_driver.collection_name, - vectors_config={ - "size": 1536, - "distance": vector_store_driver.distance - }, -) - -# Upsert Artifacts into the Vector Store Driver -[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_10.py" ``` ### Astra DB @@ -493,38 +190,5 @@ The AstraDbVectorStoreDriver supports [DataStax Astra DB](https://www.datastax.c The following example shows how to store vector entries and query the information using the driver: ```python -import os -from griptape.drivers import AstraDbVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.loaders import WebLoader - -# Astra DB secrets and connection parameters -api_endpoint = os.environ["ASTRA_DB_API_ENDPOINT"] -token = os.environ["ASTRA_DB_APPLICATION_TOKEN"] -astra_db_namespace = os.environ.get("ASTRA_DB_KEYSPACE") # optional - -# Initialize an Embedding Driver. -embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) - -vector_store_driver = AstraDbVectorStoreDriver( - embedding_driver=embedding_driver, - api_endpoint=api_endpoint, - token=token, - collection_name="griptape_test_collection", - astra_db_namespace=astra_db_namespace, # optional -) - -# Load Artifacts from the web -artifacts = WebLoader().load("https://www.griptape.ai") - -# Upsert Artifacts into the Vector Store Driver -[ - vector_store_driver.upsert_text_artifact(a, namespace="griptape") - for a in artifacts -] - -results = vector_store_driver.query(query="What is griptape?") - -values = [r.to_artifact().value for r in results] - -print("\n\n".join(values)) +--8<-- "docs/griptape-framework/drivers/src/vector_store_drivers_11.py" ``` diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index afebe6622..7bfb7be99 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -18,27 +18,7 @@ The [ProxyWebScraperDriver](../../reference/griptape/drivers/web_scraper/proxy_w Example using `ProxyWebScraperDriver` directly: ```python -import os -from griptape.drivers import ProxyWebScraperDriver - -query_params = [ - "markdown_response=true", - "js_render=false", - "premium_proxy=false", -] -proxy_url = f'http://{os.environ["ZENROWS_API_KEY"]}:{"&".join(query_params)}@proxy.zenrows.com:8001' - -driver = ProxyWebScraperDriver( - proxies={ - "http": proxy_url, - "https": proxy_url, - }, - params={ - "verify": False - } -) - -driver.scrape_url("https://griptape.ai") +--8<-- "docs/griptape-framework/drivers/src/web_scraper_drivers_1.py" ``` ### Markdownify @@ -72,33 +52,13 @@ The [MarkdownifyWebScraperDriver](../../reference/griptape/drivers/web_scraper/m Example using `MarkdownifyWebScraperDriver` directly: ```python -from griptape.drivers import MarkdownifyWebScraperDriver - -driver = MarkdownifyWebScraperDriver() - -driver.scrape_url("https://griptape.ai") +--8<-- "docs/griptape-framework/drivers/src/web_scraper_drivers_2.py" ``` Example of using `MarkdownifyWebScraperDriver` with an agent: ```python -from griptape.drivers import MarkdownifyWebScraperDriver -from griptape.loaders import WebLoader -from griptape.tools import TaskMemoryClient, WebScraper -from griptape.structures import Agent - -agent = Agent( - tools=[ - WebScraper( - web_loader=WebLoader( - web_scraper_driver=MarkdownifyWebScraperDriver(timeout=1000) - ), - off_prompt=True, - ), - TaskMemoryClient(off_prompt=False), - ], -) -agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") +--8<-- "docs/griptape-framework/drivers/src/web_scraper_drivers_3.py" ``` ### Trafilatura @@ -111,9 +71,5 @@ The [TrafilaturaWebScraperDriver](../../reference/griptape/drivers/web_scraper/t Example of using `TrafilaturaWebScraperDriver` directly: ```python -from griptape.drivers import TrafilaturaWebScraperDriver - -driver = TrafilaturaWebScraperDriver() - -driver.scrape_url("https://griptape.ai") +--8<-- "docs/griptape-framework/drivers/src/web_scraper_drivers_4.py" ``` diff --git a/docs/griptape-framework/drivers/web-search-drivers.md b/docs/griptape-framework/drivers/web-search-drivers.md index 4b8692214..b2400fe28 100644 --- a/docs/griptape-framework/drivers/web-search-drivers.md +++ b/docs/griptape-framework/drivers/web-search-drivers.md @@ -18,37 +18,13 @@ The [GoogleWebSearchDriver](../../reference/griptape/drivers/web_search/google_w Example using `GoogleWebSearchDriver` directly: ```python -import os -from griptape.drivers import GoogleWebSearchDriver - -driver = GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], -) - -driver.search("griptape ai") +--8<-- "docs/griptape-framework/drivers/src/web_search_drivers_1.py" ``` Example of using `GoogleWebSearchDriver` with an agent: ```python -import os -from griptape.drivers import GoogleWebSearchDriver -from griptape.tools import TaskMemoryClient, WebSearch -from griptape.structures import Agent - -agent = Agent( - tools=[ - WebSearch( - web_search_driver=GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], - ), - ), - TaskMemoryClient(off_prompt=False), - ], -) -agent.run("Give me some websites with information about AI frameworks.") +--8<-- "docs/griptape-framework/drivers/src/web_search_drivers_2.py" ``` ### DuckDuckGo @@ -61,9 +37,5 @@ The [DuckDuckGoWebSearchDriver](../../reference/griptape/drivers/web_search/duck Example of using `DuckDuckGoWebSearchDriver` directly: ```python -from griptape.drivers import DuckDuckGoWebSearchDriver - -driver = DuckDuckGoWebSearchDriver() - -driver.search("griptape ai") +--8<-- "docs/griptape-framework/drivers/src/web_search_drivers_3.py" ``` diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md index 8f637dca0..b5b0b24a6 100644 --- a/docs/griptape-framework/engines/audio-engines.md +++ b/docs/griptape-framework/engines/audio-engines.md @@ -12,25 +12,7 @@ search: This Engine facilitates synthesizing speech from text inputs. ```python -import os - -from griptape.drivers import ElevenLabsTextToSpeechDriver -from griptape.engines import TextToSpeechEngine - - -driver = ElevenLabsTextToSpeechDriver( - api_key=os.getenv("ELEVEN_LABS_API_KEY"), - model="eleven_multilingual_v2", - voice="Laura", -) - -engine = TextToSpeechEngine( - text_to_speech_driver=driver, -) - -engine.run( - prompts=["Hello, world!"], -) +--8<-- "docs/griptape-framework/engines/src/audio_engines_1.py" ``` ### Audio Transcription @@ -38,20 +20,5 @@ engine.run( The [Audio Transcription Engine](../../reference/griptape/engines/audio/audio_transcription_engine.md) facilitates transcribing speech from audio inputs. ```python -from griptape.drivers import OpenAiAudioTranscriptionDriver -from griptape.engines import AudioTranscriptionEngine -from griptape.loaders import AudioLoader -from griptape.utils import load_file - - -driver = OpenAiAudioTranscriptionDriver( - model="whisper-1" -) - -engine = AudioTranscriptionEngine( - audio_transcription_driver=driver, -) - -audio_artifact = AudioLoader().load(load_file("tests/resources/sentences.wav")) -engine.run(audio_artifact) +--8<-- "docs/griptape-framework/engines/src/audio_engines_2.py" ``` diff --git a/docs/griptape-framework/engines/extraction-engines.md b/docs/griptape-framework/engines/extraction-engines.md index 496560968..b971e63cc 100644 --- a/docs/griptape-framework/engines/extraction-engines.md +++ b/docs/griptape-framework/engines/extraction-engines.md @@ -16,26 +16,7 @@ The CSV Extraction Engine is designed specifically for extracting data from CSV- The CSV Extraction Engine requires the `column_names` parameter for specifying the columns to be extracted. ```python -from griptape.drivers import OpenAiChatPromptDriver -from griptape.engines import CsvExtractionEngine - -# Initialize the CsvExtractionEngine instance -csv_engine = CsvExtractionEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), -) - -# Define some unstructured data -sample_text = """ -Alice, 28, lives in New York. -Bob, 35 lives in California. -Charlie is 40 and lives in Texas. -""" - -# Extract CSV rows using the engine -result = csv_engine.extract(sample_text, column_names=["name", "age", "location"]) - -for row in result.value: - print(row.to_text()) +--8<-- "docs/griptape-framework/engines/src/extraction_engines_1.py" ``` ``` name,age,location @@ -52,31 +33,7 @@ The JSON Extraction Engine is tailored for extracting data from JSON-formatted c The JSON Extraction Engine requires the `template_schema` parameter for specifying the structure to be extracted. ```python -from schema import Schema - -from griptape.drivers import OpenAiChatPromptDriver -from griptape.engines import JsonExtractionEngine - -json_engine = JsonExtractionEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), -) - -# Define some unstructured data -sample_json_text = """ -Alice (Age 28) lives in New York. -Bob (Age 35) lives in California. -""" - -# Define a schema for extraction -user_schema = Schema( - {"users": [{"name": str, "age": int, "location": str}]} -).json_schema("UserSchema") - -# Extract data using the engine -result = json_engine.extract(sample_json_text, template_schema=user_schema) - -for artifact in result.value: - print(artifact.value) +--8<-- "docs/griptape-framework/engines/src/extraction_engines_2.py" ``` ``` {'name': 'Alice', 'age': 28, 'location': 'New York'} diff --git a/docs/griptape-framework/engines/image-generation-engines.md b/docs/griptape-framework/engines/image-generation-engines.md index 600600060..6a8f039aa 100644 --- a/docs/griptape-framework/engines/image-generation-engines.md +++ b/docs/griptape-framework/engines/image-generation-engines.md @@ -17,31 +17,7 @@ In the following example, rulesets are provided to the Engine's `run()` method c See the [documentation for your Driver](../drivers/image-generation-drivers.md) to determine if it supports Negative Rulesets. ```python -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.rules import Ruleset, Rule - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v1", -) - -# Create an engine configured to use the driver. -engine = PromptImageGenerationEngine( - image_generation_driver=driver, -) - -positive_ruleset = Ruleset(name="positive rules", rules=[Rule("artistic"), Rule("watercolor")]) -negative_ruleset = Ruleset(name="negative rules", rules=[Rule("blurry"), Rule("photograph")]) - -engine.run( - prompts=["A dog riding a skateboard"], - rulesets=[positive_ruleset], - negative_rulesets=[negative_ruleset], -) +--8<-- "docs/griptape-framework/engines/src/image_generation_engines_1.py" ``` ### Prompt Image @@ -49,25 +25,7 @@ engine.run( This Engine facilitates generating images from text prompts. ```python -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v1", -) - -# Create an engine configured to use the driver. -engine = PromptImageGenerationEngine( - image_generation_driver=driver, -) - -engine.run( - prompts=["A watercolor painting of a dog riding a skateboard"], -) +--8<-- "docs/griptape-framework/engines/src/image_generation_engines_2.py" ``` ### Variation @@ -75,29 +33,7 @@ engine.run( This Engine facilitates generating variations of an input image according to a text prompt. The input image is used as a reference for the model's generation. ```python -from griptape.engines import VariationImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.loaders import ImageLoader - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v1", -) - -# Create an engine configured to use the driver. -engine = VariationImageGenerationEngine( - image_generation_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run( - prompts=["A photo of a mountain landscape in winter"], - image=image_artifact, -) +--8<-- "docs/griptape-framework/engines/src/image_generation_engines_3.py" ``` ### Inpainting @@ -105,34 +41,7 @@ engine.run( This Engine facilitates inpainting, or modifying an input image according to a text prompt within the bounds of a mask defined by mask image. After inpainting, the area specified by the mask is replaced with the model's generation, while the rest of the input image remains the same. ```python -from griptape.engines import InpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.loaders import ImageLoader - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v1", -) - -# Create an engine configured to use the driver. -engine = InpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -with open("tests/resources/mountain-mask.png", "rb") as f: - mask_artifact = ImageLoader().load(f.read()) - -engine.run( - prompts=["A photo of a castle built into the side of a mountain"], - image=image_artifact, - mask=mask_artifact, -) +--8<-- "docs/griptape-framework/engines/src/image_generation_engines_4.py" ``` ### Outpainting @@ -140,31 +49,5 @@ engine.run( This Engine facilitates outpainting, or modifying an input image according to a text prompt outside the bounds of a mask defined by a mask image. After outpainting, the area of the input image specified by the mask remains the same, while the rest is replaced with the model's generation. ```python -from griptape.engines import OutpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.loaders import ImageLoader - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v1", -) - -# Create an engine configured to use the driver. -engine = OutpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -with open("tests/resources/mountain-mask.png", "rb") as f: - mask_artifact = ImageLoader().load(f.read()) - -engine.run( - prompts=["A photo of a mountain shrouded in clouds"], - image=image_artifact, - mask=mask_artifact, -) +--8<-- "docs/griptape-framework/engines/src/image_generation_engines_5.py" ``` diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md index 1db247cb7..3290a20f1 100644 --- a/docs/griptape-framework/engines/image-query-engines.md +++ b/docs/griptape-framework/engines/image-query-engines.md @@ -10,21 +10,5 @@ The [Image Query Engine](../../reference/griptape/engines/image_query/image_quer All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. ```python -from griptape.drivers import OpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = OpenAiImageQueryDriver( - model="gpt-4o", - max_tokens=256 -) - -engine = ImageQueryEngine( - image_query_driver=driver -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) +--8<-- "docs/griptape-framework/engines/src/image_query_engines_1.py" ``` diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md index c557c4087..ed71b69c0 100644 --- a/docs/griptape-framework/engines/rag-engines.md +++ b/docs/griptape-framework/engines/rag-engines.md @@ -48,62 +48,5 @@ RAG modules are used to implement concrete actions in the RAG pipeline. `RagEngi The following example shows a simple RAG pipeline that translates incoming queries into English, retrieves data from a local vector store, and generates a response: ```python -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines.rag import RagEngine, RagContext -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule, TranslateQueryRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage, QueryRagStage -from griptape.loaders import WebLoader - -prompt_driver = OpenAiChatPromptDriver(model="gpt-4o", temperature=0) - -vector_store = LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver() -) - -vector_store.upsert_text_artifacts({ - "griptape": WebLoader(max_tokens=500).load("https://www.griptape.ai"), -}) - -rag_engine = RagEngine( - query_stage=QueryRagStage( - query_modules=[ - TranslateQueryRagModule( - prompt_driver=prompt_driver, - language="English" - ) - ] - ), - retrieval_stage=RetrievalRagStage( - max_chunks=5, - retrieval_modules=[ - VectorStoreRetrievalRagModule( - name="MyAwesomeRetriever", - vector_store_driver=vector_store, - query_params={ - "top_n": 20 - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=prompt_driver - ) - ) -) - -rag_context = RagContext( - query="¿Qué ofrecen los servicios en la nube de Griptape?", - module_configs={ - "MyAwesomeRetriever": { - "query_params": { - "namespace": "griptape" - } - } - } -) - -print( - rag_engine.process(rag_context).output.to_text() -) -``` \ No newline at end of file +--8<-- "docs/griptape-framework/engines/src/rag_engines_1.py" +``` diff --git a/docs/griptape-framework/engines/src/__init__.py b/docs/griptape-framework/engines/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/griptape-framework/engines/src/audio_engines_1.py b/docs/griptape-framework/engines/src/audio_engines_1.py new file mode 100644 index 000000000..527300c09 --- /dev/null +++ b/docs/griptape-framework/engines/src/audio_engines_1.py @@ -0,0 +1,18 @@ +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.environ["ELEVEN_LABS_API_KEY"], + model="eleven_multilingual_v2", + voice="Laura", +) + +engine = TextToSpeechEngine( + text_to_speech_driver=driver, +) + +engine.run( + prompts=["Hello, world!"], +) diff --git a/docs/griptape-framework/engines/src/audio_engines_2.py b/docs/griptape-framework/engines/src/audio_engines_2.py new file mode 100644 index 000000000..c04b466f8 --- /dev/null +++ b/docs/griptape-framework/engines/src/audio_engines_2.py @@ -0,0 +1,13 @@ +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.loaders import AudioLoader +from griptape.utils import load_file + +driver = OpenAiAudioTranscriptionDriver(model="whisper-1") + +engine = AudioTranscriptionEngine( + audio_transcription_driver=driver, +) + +audio_artifact = AudioLoader().load(load_file("tests/resources/sentences.wav")) +engine.run(audio_artifact) diff --git a/docs/griptape-framework/engines/src/extraction_engines_1.py b/docs/griptape-framework/engines/src/extraction_engines_1.py new file mode 100644 index 000000000..c681980f2 --- /dev/null +++ b/docs/griptape-framework/engines/src/extraction_engines_1.py @@ -0,0 +1,24 @@ +from griptape.artifacts import ListArtifact +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import CsvExtractionEngine + +# Initialize the CsvExtractionEngine instance +csv_engine = CsvExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data +sample_text = """ +Alice, 28, lives in New York. +Bob, 35 lives in California. +Charlie is 40 and lives in Texas. +""" + +# Extract CSV rows using the engine +result = csv_engine.extract(sample_text, column_names=["name", "age", "location"]) + +if isinstance(result, ListArtifact): + for row in result.value: + print(row.to_text()) +else: + print(result.to_text()) diff --git a/docs/griptape-framework/engines/src/extraction_engines_2.py b/docs/griptape-framework/engines/src/extraction_engines_2.py new file mode 100644 index 000000000..d47bb48e5 --- /dev/null +++ b/docs/griptape-framework/engines/src/extraction_engines_2.py @@ -0,0 +1,27 @@ +from schema import Schema + +from griptape.artifacts.list_artifact import ListArtifact +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import JsonExtractionEngine + +json_engine = JsonExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data +sample_json_text = """ +Alice (Age 28) lives in New York. +Bob (Age 35) lives in California. +""" + +# Define a schema for extraction +user_schema = Schema({"users": [{"name": str, "age": int, "location": str}]}).json_schema("UserSchema") + +# Extract data using the engine +result = json_engine.extract(sample_json_text, template_schema=user_schema) + +if isinstance(result, ListArtifact): + for artifact in result.value: + print(artifact.value) +else: + print(result.to_text()) diff --git a/docs/griptape-framework/engines/src/image_generation_engines_1.py b/docs/griptape-framework/engines/src/image_generation_engines_1.py new file mode 100644 index 000000000..5bc3d5fb5 --- /dev/null +++ b/docs/griptape-framework/engines/src/image_generation_engines_1.py @@ -0,0 +1,23 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.rules import Rule, Ruleset + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v1", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +positive_ruleset = Ruleset(name="positive rules", rules=[Rule("artistic"), Rule("watercolor")]) +negative_ruleset = Ruleset(name="negative rules", rules=[Rule("blurry"), Rule("photograph")]) + +engine.run( + prompts=["A dog riding a skateboard"], + rulesets=[positive_ruleset], + negative_rulesets=[negative_ruleset], +) diff --git a/docs/griptape-framework/engines/src/image_generation_engines_2.py b/docs/griptape-framework/engines/src/image_generation_engines_2.py new file mode 100644 index 000000000..7a7daf6dc --- /dev/null +++ b/docs/griptape-framework/engines/src/image_generation_engines_2.py @@ -0,0 +1,17 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v1", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +engine.run( + prompts=["A watercolor painting of a dog riding a skateboard"], +) diff --git a/docs/griptape-framework/engines/src/image_generation_engines_3.py b/docs/griptape-framework/engines/src/image_generation_engines_3.py new file mode 100644 index 000000000..83822b1bc --- /dev/null +++ b/docs/griptape-framework/engines/src/image_generation_engines_3.py @@ -0,0 +1,23 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import VariationImageGenerationEngine +from griptape.loaders import ImageLoader + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v1", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +engine.run( + prompts=["A photo of a mountain landscape in winter"], + image=image_artifact, +) diff --git a/docs/griptape-framework/engines/src/image_generation_engines_4.py b/docs/griptape-framework/engines/src/image_generation_engines_4.py new file mode 100644 index 000000000..c258e1cce --- /dev/null +++ b/docs/griptape-framework/engines/src/image_generation_engines_4.py @@ -0,0 +1,26 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import InpaintingImageGenerationEngine +from griptape.loaders import ImageLoader + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v1", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +mask_artifact = ImageLoader().load(Path("tests/resources/mountain-mask.png").read_bytes()) + +engine.run( + prompts=["A photo of a castle built into the side of a mountain"], + image=image_artifact, + mask=mask_artifact, +) diff --git a/docs/griptape-framework/engines/src/image_generation_engines_5.py b/docs/griptape-framework/engines/src/image_generation_engines_5.py new file mode 100644 index 000000000..f91a48ec0 --- /dev/null +++ b/docs/griptape-framework/engines/src/image_generation_engines_5.py @@ -0,0 +1,26 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.loaders import ImageLoader + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v1", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +mask_artifact = ImageLoader().load(Path("tests/resources/mountain-mask.png").read_bytes()) + +engine.run( + prompts=["A photo of a mountain shrouded in clouds"], + image=image_artifact, + mask=mask_artifact, +) diff --git a/docs/griptape-framework/engines/src/image_query_engines_1.py b/docs/griptape-framework/engines/src/image_query_engines_1.py new file mode 100644 index 000000000..b0920392a --- /dev/null +++ b/docs/griptape-framework/engines/src/image_query_engines_1.py @@ -0,0 +1,13 @@ +from pathlib import Path + +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiImageQueryDriver(model="gpt-4o", max_tokens=256) + +engine = ImageQueryEngine(image_query_driver=driver) + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +engine.run("Describe the weather in the image", [image_artifact]) diff --git a/docs/griptape-framework/engines/src/rag_engines_1.py b/docs/griptape-framework/engines/src/rag_engines_1.py new file mode 100644 index 000000000..435a5d470 --- /dev/null +++ b/docs/griptape-framework/engines/src/rag_engines_1.py @@ -0,0 +1,36 @@ +from griptape.artifacts import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.engines.rag import RagContext, RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, TranslateQueryRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage +from griptape.loaders import WebLoader + +prompt_driver = OpenAiChatPromptDriver(model="gpt-4o", temperature=0) + +vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifacts = WebLoader(max_tokens=500).load("https://www.griptape.ai") +if isinstance(artifacts, ErrorArtifact): + raise ValueError(artifacts.value) + +vector_store.upsert_text_artifacts({"griptape": artifacts}) + +rag_engine = RagEngine( + query_stage=QueryRagStage(query_modules=[TranslateQueryRagModule(prompt_driver=prompt_driver, language="English")]), + retrieval_stage=RetrievalRagStage( + max_chunks=5, + retrieval_modules=[ + VectorStoreRetrievalRagModule( + name="MyAwesomeRetriever", vector_store_driver=vector_store, query_params={"top_n": 20} + ) + ], + ), + response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=prompt_driver)), +) + +rag_context = RagContext( + query="¿Qué ofrecen los servicios en la nube de Griptape?", + module_configs={"MyAwesomeRetriever": {"query_params": {"namespace": "griptape"}}}, +) + +print(rag_engine.process(rag_context).output.to_text()) diff --git a/docs/griptape-framework/engines/src/summary_engines_1.py b/docs/griptape-framework/engines/src/summary_engines_1.py new file mode 100644 index 000000000..092665b37 --- /dev/null +++ b/docs/griptape-framework/engines/src/summary_engines_1.py @@ -0,0 +1,20 @@ +import requests + +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import PromptSummaryEngine +from griptape.loaders import PdfLoader + +response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") +engine = PromptSummaryEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +artifacts = PdfLoader().load(response.content) + +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +text = "\n\n".join([a.value for a in artifacts]) + +engine.summarize_text(text) diff --git a/docs/griptape-framework/engines/summary-engines.md b/docs/griptape-framework/engines/summary-engines.md index d699a2283..90c72e4dd 100644 --- a/docs/griptape-framework/engines/summary-engines.md +++ b/docs/griptape-framework/engines/summary-engines.md @@ -14,21 +14,5 @@ Used to summarize texts with LLMs. You can set a custom [prompt_driver](../../re Use the [summarize_artifacts](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_artifacts) method to summarize a list of artifacts or [summarize_text](../../reference/griptape/engines/summary/base_summary_engine.md#griptape.engines.summary.base_summary_engine.BaseSummaryEngine.summarize_text) to summarize an arbitrary string. ```python -import io -import requests - -from griptape.drivers import OpenAiChatPromptDriver -from griptape.engines import PromptSummaryEngine -from griptape.loaders import PdfLoader - -response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") -engine = PromptSummaryEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), -) - -artifacts = PdfLoader().load(response.content) - -text = "\n\n".join([a.value for a in artifacts]) - -engine.summarize_text(text) +--8<-- "docs/griptape-framework/engines/src/summary_engines_1.py" ``` diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index b5613b184..52805897d 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -65,11 +65,7 @@ For a comprehensive list of extras, please refer to the `[tool.poetry.extras]` s With Griptape, you can create *structures*, such as [Agents](./structures/agents.md), [Pipelines](./structures/pipelines.md), and [Workflows](./structures/workflows.md), that are composed of different types of tasks. First, let's build a simple Agent that we can interact with through a chat based interface. ```python -from griptape.structures import Agent -from griptape.utils import Chat - -agent = Agent() -Chat(agent).start() +--8<-- "docs/griptape-framework/src/index_1.py" ``` Run this script in your IDE and you'll be presented with a `Q:` prompt where you can interact with your model. ``` @@ -89,29 +85,13 @@ Q: If you want to skip the chat interface and load an initial prompt, you can do so using the `.run()` method: ```python -from griptape.structures import Agent -from griptape.utils import Chat - -agent = Agent() -agent.run("write me a haiku about griptape") +--8<-- "docs/griptape-framework/src/index_2.py" ``` Agents on their own are fun, but let's add some capabilities to them using Griptape Tools. ### Build a Simple Agent with Tools ```python -from griptape.structures import Agent -from griptape.tools import Calculator - -calculator = Calculator() - -agent = Agent( - tools=[calculator] -) - -agent.run( - "what is 7^12" -) -print("Answer:", agent.output) +--8<-- "docs/griptape-framework/src/index_3.py" ``` Here is the chain of thought from the Agent. Notice where it realizes it can use the tool you just injected to do the calculation.[^1] [^1]: In some cases a model might be capable of basic arithmetic. For example, gpt-3.5 returns the correct numeric answer but in an odd format. @@ -144,33 +124,7 @@ Answer: 13,841,287,201 Agents are great for getting started, but they are intentionally limited to a single task. Pipelines, however, allow us to define any number of tasks to run in sequence. Let's define a simple two-task Pipeline that uses tools and memory: ```python -from griptape.memory.structure import ConversationMemory -from griptape.structures import Pipeline -from griptape.tasks import ToolkitTask, PromptTask -from griptape.tools import WebScraper, FileManager, TaskMemoryClient - - -# Pipelines represent sequences of tasks. -pipeline = Pipeline( - conversation_memory=ConversationMemory() -) - -pipeline.add_tasks( - # Load up the first argument from `pipeline.run`. - ToolkitTask( - "{{ args[0] }}", - # Add tools for web scraping, and file management - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)] - ), - # Augment `input` from the previous task. - PromptTask( - "Say the following in spanish: {{ parent_output }}" - ) -) - -pipeline.run( - "Load https://www.griptape.ai, summarize it, and store it in griptape.txt" -) +--8<-- "docs/griptape-framework/src/index_4.py" ``` ``` diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index ebab3c460..a94746f99 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -13,40 +13,7 @@ See [Event Listener Drivers](../drivers/event-listener-drivers.md) for examples You can listen to specific event types: ```python -from griptape.structures import Agent -from griptape.events import ( - BaseEvent, - StartTaskEvent, - FinishTaskEvent, - StartActionsSubtaskEvent, - FinishActionsSubtaskEvent, - StartPromptEvent, - FinishPromptEvent, - EventListener, - event_bus -) - - -def handler(event: BaseEvent): - print(event.__class__) - -event_bus.add_event_listeners([ - EventListener( - handler, - event_types=[ - StartTaskEvent, - FinishTaskEvent, - StartActionsSubtaskEvent, - FinishActionsSubtaskEvent, - StartPromptEvent, - FinishPromptEvent, - ], - ) - ]) - -agent = Agent() - -agent.run("tell me about griptape") +--8<-- "docs/griptape-framework/misc/src/events_1.py" ``` ``` @@ -68,27 +35,7 @@ agent.run("tell me about griptape") Or listen to all events: ```python -from griptape.structures import Agent -from griptape.events import BaseEvent, EventListener, event_bus - - - -def handler1(event: BaseEvent): - print("Handler 1", event.__class__) - - -def handler2(event: BaseEvent): - print("Handler 2", event.__class__) - -event_bus.add_event_listeners([ - EventListener(handler1), - EventListener(handler2), - ] -) - -agent = Agent() - -agent.run("tell me about griptape") +--8<-- "docs/griptape-framework/misc/src/events_2.py" ``` ``` @@ -132,54 +79,14 @@ Handler 2 None: + print(event.__class__) + + +event_bus.add_event_listeners( + [ + EventListener( + handler, + event_types=[ + StartTaskEvent, + FinishTaskEvent, + StartActionsSubtaskEvent, + FinishActionsSubtaskEvent, + StartPromptEvent, + FinishPromptEvent, + ], + ) + ] +) + +agent = Agent() + +agent.run("tell me about griptape") diff --git a/docs/griptape-framework/misc/src/events_2.py b/docs/griptape-framework/misc/src/events_2.py new file mode 100644 index 000000000..be92bfb37 --- /dev/null +++ b/docs/griptape-framework/misc/src/events_2.py @@ -0,0 +1,22 @@ +from griptape.events import BaseEvent, EventListener, event_bus +from griptape.structures import Agent + + +def handler1(event: BaseEvent) -> None: + print("Handler 1", event.__class__) + + +def handler2(event: BaseEvent) -> None: + print("Handler 2", event.__class__) + + +event_bus.add_event_listeners( + [ + EventListener(handler1), + EventListener(handler2), + ] +) + +agent = Agent() + +agent.run("tell me about griptape") diff --git a/docs/griptape-framework/misc/src/events_3.py b/docs/griptape-framework/misc/src/events_3.py new file mode 100644 index 000000000..31790b494 --- /dev/null +++ b/docs/griptape-framework/misc/src/events_3.py @@ -0,0 +1,30 @@ +from typing import cast + +from griptape.config import OpenAiStructureConfig +from griptape.drivers import OpenAiChatPromptDriver +from griptape.events import CompletionChunkEvent, EventListener, event_bus +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask +from griptape.tools import TaskMemoryClient, WebScraper + +event_bus.add_event_listeners( + [ + EventListener( + lambda e: print(cast(CompletionChunkEvent, e).token, end="", flush=True), + event_types=[CompletionChunkEvent], + ) + ] +) + +pipeline = Pipeline( + config=OpenAiStructureConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True)), +) + +pipeline.add_tasks( + ToolkitTask( + "Based on https://griptape.ai, tell me what griptape is.", + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + ) +) + +pipeline.run() diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py new file mode 100644 index 000000000..3816b110e --- /dev/null +++ b/docs/griptape-framework/misc/src/events_4.py @@ -0,0 +1,16 @@ +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask +from griptape.tools import TaskMemoryClient, WebScraper +from griptape.utils import Stream + +pipeline = Pipeline() +pipeline.config.prompt_driver.stream = True +pipeline.add_tasks( + ToolkitTask( + "Based on https://griptape.ai, tell me what griptape is.", + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + ) +) + +for artifact in Stream(pipeline).run(): + print(artifact.value, end="", flush=True) diff --git a/docs/griptape-framework/misc/src/events_5.py b/docs/griptape-framework/misc/src/events_5.py new file mode 100644 index 000000000..14b3f531e --- /dev/null +++ b/docs/griptape-framework/misc/src/events_5.py @@ -0,0 +1,27 @@ +from griptape import utils +from griptape.events import BaseEvent, EventListener, FinishPromptEvent, event_bus +from griptape.structures import Agent + +token_counter = utils.TokenCounter() + + +def count_tokens(e: BaseEvent) -> None: + if isinstance(e, FinishPromptEvent) and e.output_token_count is not None: + token_counter.add_tokens(e.output_token_count) + + +event_bus.add_event_listeners( + [ + EventListener( + count_tokens, + event_types=[FinishPromptEvent], + ) + ] +) + + +agent = Agent() + +agent.run("tell me about large language models") + +print(f"total tokens: {token_counter.tokens}") diff --git a/docs/griptape-framework/misc/src/events_6.py b/docs/griptape-framework/misc/src/events_6.py new file mode 100644 index 000000000..aae9c2078 --- /dev/null +++ b/docs/griptape-framework/misc/src/events_6.py @@ -0,0 +1,16 @@ +from griptape.events import BaseEvent, EventListener, StartPromptEvent, event_bus +from griptape.structures import Agent + +event_bus.add_event_listeners([EventListener(handler=lambda e: print(e), event_types=[StartPromptEvent])]) + + +def handler(event: BaseEvent) -> None: + if isinstance(event, StartPromptEvent): + print("Prompt Stack Messages:") + for message in event.prompt_stack.messages: + print(f"{message.role}: {message.content}") + + +agent = Agent() + +agent.run("Write me a poem.") diff --git a/docs/griptape-framework/misc/src/tokenizers_1.py b/docs/griptape-framework/misc/src/tokenizers_1.py new file mode 100644 index 000000000..c3351c4b9 --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_1.py @@ -0,0 +1,7 @@ +from griptape.tokenizers import OpenAiTokenizer + +tokenizer = OpenAiTokenizer(model="gpt-4o") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_2.py b/docs/griptape-framework/misc/src/tokenizers_2.py new file mode 100644 index 000000000..037548b1b --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_2.py @@ -0,0 +1,11 @@ +import os + +from cohere import Client + +from griptape.tokenizers import CohereTokenizer + +tokenizer = CohereTokenizer(model="command", client=Client(os.environ["COHERE_API_KEY"])) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_3.py b/docs/griptape-framework/misc/src/tokenizers_3.py new file mode 100644 index 000000000..636d5c08f --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_3.py @@ -0,0 +1,7 @@ +from griptape.tokenizers import AnthropicTokenizer + +tokenizer = AnthropicTokenizer(model="claude-3-opus-20240229") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_4.py b/docs/griptape-framework/misc/src/tokenizers_4.py new file mode 100644 index 000000000..04347fe93 --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_4.py @@ -0,0 +1,9 @@ +import os + +from griptape.tokenizers import GoogleTokenizer + +tokenizer = GoogleTokenizer(model="gemini-pro", api_key=os.environ["GOOGLE_API_KEY"]) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_5.py b/docs/griptape-framework/misc/src/tokenizers_5.py new file mode 100644 index 000000000..3a10e8dc5 --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_5.py @@ -0,0 +1,10 @@ +from griptape.tokenizers import HuggingFaceTokenizer + +tokenizer = HuggingFaceTokenizer( + model="sentence-transformers/all-MiniLM-L6-v2", + max_output_tokens=512, +) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_6.py b/docs/griptape-framework/misc/src/tokenizers_6.py new file mode 100644 index 000000000..12e9137dc --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_6.py @@ -0,0 +1,7 @@ +from griptape.tokenizers import AmazonBedrockTokenizer + +tokenizer = AmazonBedrockTokenizer(model="amazon.titan-text-express-v1") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/src/tokenizers_7.py b/docs/griptape-framework/misc/src/tokenizers_7.py new file mode 100644 index 000000000..faac73c9e --- /dev/null +++ b/docs/griptape-framework/misc/src/tokenizers_7.py @@ -0,0 +1,7 @@ +from griptape.tokenizers import SimpleTokenizer + +tokenizer = SimpleTokenizer(max_input_tokens=1024, max_output_tokens=1024, characters_per_token=6) + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index 1211987a9..f820d55a9 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -15,95 +15,39 @@ Tokenizers are a low level abstraction that you will rarely interact with direct ### OpenAI ```python -from griptape.tokenizers import OpenAiTokenizer - - -tokenizer = OpenAiTokenizer(model="gpt-4o") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_1.py" ``` ### Cohere ```python -import os -from cohere import Client -from griptape.tokenizers import CohereTokenizer - - -tokenizer = CohereTokenizer( - model="command", client=Client(os.environ["COHERE_API_KEY"]) -) - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_2.py" ``` ### Anthropic ```python -from griptape.tokenizers import AnthropicTokenizer - - -tokenizer = AnthropicTokenizer(model="claude-3-opus-20240229") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_3.py" ``` ### Google ```python -import os -from griptape.tokenizers import GoogleTokenizer - -tokenizer = GoogleTokenizer(model="gemini-pro", api_key=os.environ["GOOGLE_API_KEY"]) - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_4.py" ``` ### Hugging Face ```python -from transformers import AutoTokenizer -from griptape.tokenizers import HuggingFaceTokenizer - - -tokenizer = HuggingFaceTokenizer( - model="sentence-transformers/all-MiniLM-L6-v2", - max_output_tokens=512, -) - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_5.py" ``` ### Amazon Bedrock ```python -from griptape.tokenizers import AmazonBedrockTokenizer - - -tokenizer = AmazonBedrockTokenizer(model="amazon.titan-text-express-v1") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_6.py" ``` ### Simple Not all LLM providers have a public tokenizer API. In this case, you can use the `SimpleTokenizer` to count tokens based on a simple heuristic. ```python -from griptape.tokenizers import SimpleTokenizer - -tokenizer = SimpleTokenizer(max_input_tokens=1024, max_output_tokens=1024, characters_per_token=6) - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) +--8<-- "docs/griptape-framework/misc/src/tokenizers_7.py" ``` diff --git a/docs/griptape-framework/src/__init__.py b/docs/griptape-framework/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/griptape-framework/src/index_1.py b/docs/griptape-framework/src/index_1.py new file mode 100644 index 000000000..1255b0b5b --- /dev/null +++ b/docs/griptape-framework/src/index_1.py @@ -0,0 +1,5 @@ +from griptape.structures import Agent +from griptape.utils import Chat + +agent = Agent() +Chat(agent).start() diff --git a/docs/griptape-framework/src/index_2.py b/docs/griptape-framework/src/index_2.py new file mode 100644 index 000000000..70172f598 --- /dev/null +++ b/docs/griptape-framework/src/index_2.py @@ -0,0 +1,4 @@ +from griptape.structures import Agent + +agent = Agent() +agent.run("write me a haiku about griptape") diff --git a/docs/griptape-framework/src/index_3.py b/docs/griptape-framework/src/index_3.py new file mode 100644 index 000000000..043fc75f7 --- /dev/null +++ b/docs/griptape-framework/src/index_3.py @@ -0,0 +1,9 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +calculator = Calculator() + +agent = Agent(tools=[calculator]) + +agent.run("what is 7^12") +print("Answer:", agent.output) diff --git a/docs/griptape-framework/src/index_4.py b/docs/griptape-framework/src/index_4.py new file mode 100644 index 000000000..0bb345438 --- /dev/null +++ b/docs/griptape-framework/src/index_4.py @@ -0,0 +1,20 @@ +from griptape.memory.structure import ConversationMemory +from griptape.structures import Pipeline +from griptape.tasks import PromptTask, ToolkitTask +from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +# Pipelines represent sequences of tasks. +pipeline = Pipeline(conversation_memory=ConversationMemory()) + +pipeline.add_tasks( + # Load up the first argument from `pipeline.run`. + ToolkitTask( + "{{ args[0] }}", + # Add tools for web scraping, and file management + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)], + ), + # Augment `input` from the previous task. + PromptTask("Say the following in spanish: {{ parent_output }}"), +) + +pipeline.run("Load https://www.griptape.ai, summarize it, and store it in griptape.txt") diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 8f6a6edb0..2f28b336c 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -17,17 +17,7 @@ You can access the final output of the Agent by using the [output](../../referen ## Toolkit Task Agent ```python -from griptape.tools import Calculator -from griptape.structures import Agent - - -agent = Agent( - input="Calculate the following: {{ args[0] }}", - tools=[Calculator()] -) - -agent.run("what's 13^7?") -print("Answer:", agent.output) +--8<-- "docs/griptape-framework/structures/src/agents_1.py" ``` ``` @@ -56,21 +46,7 @@ Answer: 62,748,517 ## Prompt Task Agent ```python -from griptape.structures import Agent -from griptape.tasks import PromptTask - - -agent = Agent() -agent.add_task( - PromptTask( - "Write me a {{ creative_medium }} about {{ args[0] }} and {{ args[1] }}", - context={ - 'creative_medium': 'haiku' - } - ) -) - -agent.run("Skateboards", "Programming") +--8<-- "docs/griptape-framework/structures/src/agents_2.py" ``` ``` diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 3f510eb86..e10b6cc73 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -17,14 +17,7 @@ The [OpenAI Structure Config](../../reference/griptape/config/openai_structure_c ```python -from griptape.structures import Agent -from griptape.config import OpenAiStructureConfig - -agent = Agent( - config=OpenAiStructureConfig() -) - -agent = Agent() # This is equivalent to the above +--8<-- "docs/griptape-framework/structures/src/config_1.py" ``` #### Azure OpenAI @@ -33,52 +26,21 @@ The [Azure OpenAI Structure Config](../../reference/griptape/config/azure_openai ```python -import os -from griptape.structures import Agent -from griptape.config import AzureOpenAiStructureConfig - -agent = Agent( - config=AzureOpenAiStructureConfig( - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], - api_key=os.environ["AZURE_OPENAI_API_KEY_3"] - ).merge_config({ - "image_query_driver": { - "azure_deployment": "gpt-4o", - }, - }), -) +--8<-- "docs/griptape-framework/structures/src/config_2.py" ``` #### Amazon Bedrock The [Amazon Bedrock Structure Config](../../reference/griptape/config/amazon_bedrock_structure_config.md) provides default Drivers for Amazon Bedrock's APIs. ```python -import os -import boto3 -from griptape.structures import Agent -from griptape.config import AmazonBedrockStructureConfig - -agent = Agent( - config=AmazonBedrockStructureConfig( - session=boto3.Session( - region_name=os.environ["AWS_DEFAULT_REGION"], - aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], - aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], - ) - ) -) +--8<-- "docs/griptape-framework/structures/src/config_3.py" ``` #### Google The [Google Structure Config](../../reference/griptape/config/google_structure_config.md) provides default Drivers for Google's Gemini APIs. ```python -from griptape.structures import Agent -from griptape.config import GoogleStructureConfig - -agent = Agent( - config=GoogleStructureConfig() -) +--8<-- "docs/griptape-framework/structures/src/config_4.py" ``` #### Anthropic @@ -92,12 +54,7 @@ The [Anthropic Structure Config](../../reference/griptape/config/anthropic_struc ```python -from griptape.structures import Agent -from griptape.config import AnthropicStructureConfig - -agent = Agent( - config=AnthropicStructureConfig() -) +--8<-- "docs/griptape-framework/structures/src/config_5.py" ``` #### Cohere @@ -106,11 +63,7 @@ The [Cohere Structure Config](../../reference/griptape/config/cohere_structure_c ```python -import os -from griptape.config import CohereStructureConfig -from griptape.structures import Agent - -agent = Agent(config=CohereStructureConfig(api_key=os.environ["COHERE_API_KEY"])) +--8<-- "docs/griptape-framework/structures/src/config_6.py" ``` ### Custom Configs @@ -120,19 +73,7 @@ The [StructureConfig](../../reference/griptape/config/structure_config.md) class This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. ```python -import os -from griptape.structures import Agent -from griptape.config import StructureConfig -from griptape.drivers import AnthropicPromptDriver - -agent = Agent( - config=StructureConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-sonnet-20240229", - api_key=os.environ["ANTHROPIC_API_KEY"], - ) - ), -) +--8<-- "docs/griptape-framework/structures/src/config_7.py" ``` ### Loading/Saving Configs @@ -140,31 +81,6 @@ agent = Agent( Configuration classes in Griptape offer utility methods for loading, saving, and merging configurations, streamlining the management of complex setups. ```python -from griptape.structures import Agent -from griptape.config import AmazonBedrockStructureConfig -from griptape.drivers import AmazonBedrockCohereEmbeddingDriver - -custom_config = AmazonBedrockStructureConfig() -custom_config.embedding_driver = AmazonBedrockCohereEmbeddingDriver() -custom_config.merge_config( - { - "embedding_driver": { - "base_url": None, - "model": "text-embedding-3-small", - "organization": None, - "type": "OpenAiEmbeddingDriver", - }, - } -) -serialized_config = custom_config.to_json() -deserialized_config = AmazonBedrockStructureConfig.from_json(serialized_config) - -agent = Agent( - config=deserialized_config.merge_config({ - "prompt_driver" : { - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - }, - }), -) +--8<-- "docs/griptape-framework/structures/src/config_8.py" ``` diff --git a/docs/griptape-framework/structures/conversation-memory.md b/docs/griptape-framework/structures/conversation-memory.md index 19d79c702..503a00b14 100644 --- a/docs/griptape-framework/structures/conversation-memory.md +++ b/docs/griptape-framework/structures/conversation-memory.md @@ -10,13 +10,7 @@ You can use Conversation Memory to give Griptape Structures the ability to keep ### Example ```python -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -agent = Agent() - -agent.run("My favorite animal is a Liger.") -agent.run("What is my favorite animal?") +--8<-- "docs/griptape-framework/structures/src/conversation_memory_1.py" ``` ``` @@ -35,10 +29,7 @@ agent.run("What is my favorite animal?") You can disable conversation memory in any structure by setting it to `None`: ```python -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -Agent(conversation_memory=None) +--8<-- "docs/griptape-framework/structures/src/conversation_memory_2.py" ``` ## Types of Memory @@ -50,36 +41,13 @@ Griptape provides several types of Conversation Memory to fit various use-cases. [ConversationMemory](../../reference/griptape/memory/structure/conversation_memory.md) will keep track of the full task input and output for all runs. ```python -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -agent = Agent( - conversation_memory=ConversationMemory() -) - -agent.run("Hello!") - -print(agent.conversation_memory) +--8<-- "docs/griptape-framework/structures/src/conversation_memory_3.py" ``` You can set the [max_runs](../../reference/griptape/memory/structure/base_conversation_memory.md#griptape.memory.structure.base_conversation_memory.BaseConversationMemory.max_runs) parameter to limit how many runs are kept in memory. ```python -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -agent = Agent( - conversation_memory=ConversationMemory(max_runs=2) -) - -agent.run("Run 1") -agent.run("Run 2") -agent.run("Run 3") -agent.run("Run 4") -agent.run("Run 5") - -print(agent.conversation_memory.runs[0].input == 'run4') -print(agent.conversation_memory.runs[1].input == 'run5') +--8<-- "docs/griptape-framework/structures/src/conversation_memory_4.py" ``` ### Summary Conversation Memory @@ -90,15 +58,6 @@ You can choose to offset which runs are summarized with the [offset](../../reference/griptape/memory/structure/summary_conversation_memory.md#griptape.memory.structure.summary_conversation_memory.SummaryConversationMemory.offset) parameter. ```python -from griptape.structures import Agent -from griptape.memory.structure import SummaryConversationMemory - -agent = Agent( - conversation_memory=SummaryConversationMemory(offset=2) -) - -agent.run("Hello!") - -print(agent.conversation_memory.summary) +--8<-- "docs/griptape-framework/structures/src/conversation_memory_5.py" ``` diff --git a/docs/griptape-framework/structures/observability.md b/docs/griptape-framework/structures/observability.md index 69af849e6..01e1af336 100644 --- a/docs/griptape-framework/structures/observability.md +++ b/docs/griptape-framework/structures/observability.md @@ -9,17 +9,8 @@ The [Observability](../../reference/griptape/observability/observability.md) con Observability is completely optional. To opt in, wrap your application code with the [Observability](../../reference/griptape/observability/observability.md) context manager, for example: -```python title="PYTEST_IGNORE" -from griptape.drivers import GriptapeCloudObservabilityDriver -from griptape.structures import Agent -from griptape.observability import Observability - -observability_driver = GriptapeCloudObservabilityDriver() - -with Observability(observability_driver=observability_driver): - # Important! Only code within this block is subject to observability - agent = Agent() - agent.run("Name the five greatest rappers of all time") +```python +--8<-- "docs/griptape-framework/structures/src/observability_1.py" ``` !!! info @@ -31,32 +22,6 @@ All functions and methods annotated with the `@observable` decorator will be tra For example: -```python title="PYTEST_IGNORE" -import time -from griptape.drivers import GriptapeCloudObservabilityDriver -from griptape.rules import Rule -from griptape.structures import Agent -from griptape.observability import Observability -from griptape.common import observable - -# Decorate a function -@observable -def my_function(): - time.sleep(3) - -class MyClass: - # Decorate a method - @observable - def my_method(self): - time.sleep(1) - my_function() - time.sleep(2) - -observability_driver = GriptapeCloudObservabilityDriver() - -# When invoking the instrumented code from within the Observability context manager, the -# telemetry for the custom code will be sent to the destination specified by the driver. -with Observability(observability_driver=observability_driver): - my_function() - MyClass().my_method() +```python +--8<-- "docs/griptape-framework/structures/src/observability_2.py" ``` diff --git a/docs/griptape-framework/structures/pipelines.md b/docs/griptape-framework/structures/pipelines.md index ad652f6c0..fc5046196 100644 --- a/docs/griptape-framework/structures/pipelines.md +++ b/docs/griptape-framework/structures/pipelines.md @@ -20,20 +20,7 @@ Pipelines have access to the following [context](../../reference/griptape/struct ## Pipeline ```python -from griptape.tasks import PromptTask -from griptape.structures import Pipeline - - -pipeline = Pipeline() - -pipeline.add_tasks( - # take the first argument from the pipeline `run` method - PromptTask("{{ args[0] }}"), - # take the output from the previous task and insert it into the prompt - PromptTask("Say the following like a pirate: {{ parent_output }}") -) - -pipeline.run("Write me a haiku about sailing.") +--8<-- "docs/griptape-framework/structures/src/pipelines_1.py" ``` ``` diff --git a/docs/griptape-framework/structures/rulesets.md b/docs/griptape-framework/structures/rulesets.md index 324973b71..d69b085ac 100644 --- a/docs/griptape-framework/structures/rulesets.md +++ b/docs/griptape-framework/structures/rulesets.md @@ -15,38 +15,7 @@ Rulesets can be used to shape personality, format output, restrict topics, and m You can define a Ruleset at the Structure level if you need to have certain behaviors across all Tasks. ```python -from griptape.structures import Pipeline -from griptape.tasks import PromptTask -from griptape.rules import Rule, Ruleset - -pipeline = Pipeline( - rulesets=[ - Ruleset( - name="Employment", - rules=[ - Rule("Behave like a polite customer support agent"), - Rule("Act like you work for company SkaterWorld, Inc."), - Rule("Discuss only topics related to skateboarding"), - Rule("Limit your response to fewer than 5 sentences."), - ], - ), - Ruleset( - name="Background", - rules=[ - Rule("Your name is Todd"), - ], - ), - ] -) - -pipeline.add_tasks( - PromptTask(input="Respond to this user's question: {{ args[0] }}"), - PromptTask( - input="Extract keywords from this response: {{ parent_output }}" - ), -) - -pipeline.run("How do I do a kickflip?") +--8<-- "docs/griptape-framework/structures/src/rulesets_1.py" ``` ``` @@ -73,24 +42,7 @@ pipeline.run("How do I do a kickflip?") You can pass [rules](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.rules) directly to the Structure to have a Ruleset created for you. ```python -from griptape.structures import Pipeline -from griptape.tasks import PromptTask -from griptape.rules import Rule - -pipeline = Pipeline( - rules=[ - Rule("Respond only using emojis"), - ], -) - -pipeline.add_tasks( - PromptTask("Respond to this question from the user: '{{ args[0] }}'"), - PromptTask( - "How would you rate your response (1-5)? 1 being bad, 5 being good. Response: '{{parent_output}}'" - ), -), - -pipeline.run("How do I bake a cake?") +--8<-- "docs/griptape-framework/structures/src/rulesets_2.py" ``` ``` [09/29/23 13:31:41] INFO PromptTask 51c0030b7a854ae5a9bef4595014915c @@ -111,38 +63,7 @@ pipeline.run("How do I bake a cake?") You can define a Ruleset at the Task level if you need to have different behaviors per Task. ```python -from griptape.structures import Pipeline -from griptape.tasks import PromptTask -from griptape.rules import Rule, Ruleset - -pipeline = Pipeline() - -pipeline.add_tasks( - PromptTask( - input="Respond to the following prompt: {{ args[0] }}", - rulesets=[ - Ruleset( - name="Emojis", - rules=[ - Rule("Respond using uppercase characters only."), - ], - ) - ] - ), - PromptTask( - input="Determine the sentiment of the following text: {{ parent_output }}", - rulesets=[ - Ruleset( - name="Diacritic", - rules=[ - Rule("Respond using diacritic characters only."), - ], - ) - ], - ), -) - -pipeline.run("I love skateboarding!") +--8<-- "docs/griptape-framework/structures/src/rulesets_3.py" ``` ``` @@ -162,23 +83,7 @@ pipeline.run("I love skateboarding!") You can pass [rules](../../reference/griptape/mixins/rule_mixin.md#griptape.mixins.rule_mixin.RuleMixin.rules) directly to the Task to have a Ruleset created for you. ```python -from griptape.structures import Pipeline -from griptape.tasks import PromptTask -from griptape.rules import Rule - -pipeline = Pipeline() - -pipeline.add_tasks( - PromptTask( - rules=[ - Rule("Write your answer in json with a single key 'emoji_response'"), - Rule("Respond only using emojis"), - ], - ), -) - -pipeline.run("How are you?") - +--8<-- "docs/griptape-framework/structures/src/rulesets_4.py" ``` ``` [09/25/23 16:29:05] INFO PromptTask d1cc2c0b780d4b32b6309ceab11173f4 diff --git a/docs/griptape-framework/structures/src/__init__.py b/docs/griptape-framework/structures/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/griptape-framework/structures/src/agents_1.py b/docs/griptape-framework/structures/src/agents_1.py new file mode 100644 index 000000000..20d04004d --- /dev/null +++ b/docs/griptape-framework/structures/src/agents_1.py @@ -0,0 +1,7 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +agent = Agent(input="Calculate the following: {{ args[0] }}", tools=[Calculator()]) + +agent.run("what's 13^7?") +print("Answer:", agent.output) diff --git a/docs/griptape-framework/structures/src/agents_2.py b/docs/griptape-framework/structures/src/agents_2.py new file mode 100644 index 000000000..84d431c1e --- /dev/null +++ b/docs/griptape-framework/structures/src/agents_2.py @@ -0,0 +1,11 @@ +from griptape.structures import Agent +from griptape.tasks import PromptTask + +agent = Agent() +agent.add_task( + PromptTask( + "Write me a {{ creative_medium }} about {{ args[0] }} and {{ args[1] }}", context={"creative_medium": "haiku"} + ) +) + +agent.run("Skateboards", "Programming") diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py new file mode 100644 index 000000000..613852193 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_1.py @@ -0,0 +1,6 @@ +from griptape.config import OpenAiStructureConfig +from griptape.structures import Agent + +agent = Agent(config=OpenAiStructureConfig()) + +agent = Agent() # This is equivalent to the above diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/config_2.py new file mode 100644 index 000000000..bf6b6223b --- /dev/null +++ b/docs/griptape-framework/structures/src/config_2.py @@ -0,0 +1,16 @@ +import os + +from griptape.config import AzureOpenAiStructureConfig +from griptape.structures import Agent + +agent = Agent( + config=AzureOpenAiStructureConfig( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], api_key=os.environ["AZURE_OPENAI_API_KEY_3"] + ).merge_config( + { + "image_query_driver": { + "azure_deployment": "gpt-4o", + }, + } + ), +) diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/config_3.py new file mode 100644 index 000000000..acb55c007 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_3.py @@ -0,0 +1,16 @@ +import os + +import boto3 + +from griptape.config import AmazonBedrockStructureConfig +from griptape.structures import Agent + +agent = Agent( + config=AmazonBedrockStructureConfig( + session=boto3.Session( + region_name=os.environ["AWS_DEFAULT_REGION"], + aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], + aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], + ) + ) +) diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py new file mode 100644 index 000000000..88d388161 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_4.py @@ -0,0 +1,4 @@ +from griptape.config import GoogleStructureConfig +from griptape.structures import Agent + +agent = Agent(config=GoogleStructureConfig()) diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py new file mode 100644 index 000000000..f0da565a7 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_5.py @@ -0,0 +1,4 @@ +from griptape.config import AnthropicStructureConfig +from griptape.structures import Agent + +agent = Agent(config=AnthropicStructureConfig()) diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py new file mode 100644 index 000000000..4e733e9d4 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_6.py @@ -0,0 +1,6 @@ +import os + +from griptape.config import CohereStructureConfig +from griptape.structures import Agent + +agent = Agent(config=CohereStructureConfig(api_key=os.environ["COHERE_API_KEY"])) diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/config_7.py new file mode 100644 index 000000000..79a81d878 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_7.py @@ -0,0 +1,14 @@ +import os + +from griptape.config import StructureConfig +from griptape.drivers import AnthropicPromptDriver +from griptape.structures import Agent + +agent = Agent( + config=StructureConfig( + prompt_driver=AnthropicPromptDriver( + model="claude-3-sonnet-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], + ) + ), +) diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py new file mode 100644 index 000000000..9bb1d01c9 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_8.py @@ -0,0 +1,28 @@ +from griptape.config import AmazonBedrockStructureConfig +from griptape.drivers import AmazonBedrockCohereEmbeddingDriver +from griptape.structures import Agent + +custom_config = AmazonBedrockStructureConfig() +custom_config.embedding_driver = AmazonBedrockCohereEmbeddingDriver() +custom_config.merge_config( + { + "embedding_driver": { + "base_url": None, + "model": "text-embedding-3-small", + "organization": None, + "type": "OpenAiEmbeddingDriver", + }, + } +) +serialized_config = custom_config.to_json() +deserialized_config = AmazonBedrockStructureConfig.from_json(serialized_config) + +agent = Agent( + config=deserialized_config.merge_config( + { + "prompt_driver": { + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + }, + } + ), +) diff --git a/docs/griptape-framework/structures/src/conversation_memory_1.py b/docs/griptape-framework/structures/src/conversation_memory_1.py new file mode 100644 index 000000000..e44697832 --- /dev/null +++ b/docs/griptape-framework/structures/src/conversation_memory_1.py @@ -0,0 +1,6 @@ +from griptape.structures import Agent + +agent = Agent() + +agent.run("My favorite animal is a Liger.") +agent.run("What is my favorite animal?") diff --git a/docs/griptape-framework/structures/src/conversation_memory_2.py b/docs/griptape-framework/structures/src/conversation_memory_2.py new file mode 100644 index 000000000..490c10866 --- /dev/null +++ b/docs/griptape-framework/structures/src/conversation_memory_2.py @@ -0,0 +1,3 @@ +from griptape.structures import Agent + +Agent(conversation_memory=None) diff --git a/docs/griptape-framework/structures/src/conversation_memory_3.py b/docs/griptape-framework/structures/src/conversation_memory_3.py new file mode 100644 index 000000000..425230eb2 --- /dev/null +++ b/docs/griptape-framework/structures/src/conversation_memory_3.py @@ -0,0 +1,8 @@ +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +agent = Agent(conversation_memory=ConversationMemory()) + +agent.run("Hello!") + +print(agent.conversation_memory) diff --git a/docs/griptape-framework/structures/src/conversation_memory_4.py b/docs/griptape-framework/structures/src/conversation_memory_4.py new file mode 100644 index 000000000..e8a3b9861 --- /dev/null +++ b/docs/griptape-framework/structures/src/conversation_memory_4.py @@ -0,0 +1,13 @@ +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +agent = Agent(conversation_memory=ConversationMemory(max_runs=2)) + +agent.run("Run 1") +agent.run("Run 2") +agent.run("Run 3") +agent.run("Run 4") +agent.run("Run 5") + +print(agent.conversation_memory.runs[0].input == "run4") +print(agent.conversation_memory.runs[1].input == "run5") diff --git a/docs/griptape-framework/structures/src/conversation_memory_5.py b/docs/griptape-framework/structures/src/conversation_memory_5.py new file mode 100644 index 000000000..8c7807c58 --- /dev/null +++ b/docs/griptape-framework/structures/src/conversation_memory_5.py @@ -0,0 +1,11 @@ +from griptape.memory.structure import SummaryConversationMemory +from griptape.structures import Agent +from griptape.utils import Conversation + +agent = Agent(conversation_memory=SummaryConversationMemory(offset=2)) + +agent.run("Hello my name is John?") +agent.run("What is my name?") +agent.run("My favorite color is blue.") + +print(Conversation(agent.conversation_memory)) diff --git a/docs/griptape-framework/structures/src/observability_1.py b/docs/griptape-framework/structures/src/observability_1.py new file mode 100644 index 000000000..e0680e04c --- /dev/null +++ b/docs/griptape-framework/structures/src/observability_1.py @@ -0,0 +1,10 @@ +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.observability import Observability +from griptape.structures import Agent + +observability_driver = GriptapeCloudObservabilityDriver() + +with Observability(observability_driver=observability_driver): + # Important! Only code within this block is subject to observability + agent = Agent() + agent.run("Name the five greatest rappers of all time") diff --git a/docs/griptape-framework/structures/src/observability_2.py b/docs/griptape-framework/structures/src/observability_2.py new file mode 100644 index 000000000..1cc6c1244 --- /dev/null +++ b/docs/griptape-framework/structures/src/observability_2.py @@ -0,0 +1,29 @@ +import time + +from griptape.common import observable +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.observability import Observability + + +# Decorate a function +@observable +def my_function() -> None: + time.sleep(3) + + +class MyClass: + # Decorate a method + @observable + def my_method(self) -> None: + time.sleep(1) + my_function() + time.sleep(2) + + +observability_driver = GriptapeCloudObservabilityDriver() + +# When invoking the instrumented code from within the Observability context manager, the +# telemetry for the custom code will be sent to the destination specified by the driver. +with Observability(observability_driver=observability_driver): + my_function() + MyClass().my_method() diff --git a/docs/griptape-framework/structures/src/pipelines_1.py b/docs/griptape-framework/structures/src/pipelines_1.py new file mode 100644 index 000000000..f2b8c6f6f --- /dev/null +++ b/docs/griptape-framework/structures/src/pipelines_1.py @@ -0,0 +1,13 @@ +from griptape.structures import Pipeline +from griptape.tasks import PromptTask + +pipeline = Pipeline() + +pipeline.add_tasks( + # take the first argument from the pipeline `run` method + PromptTask("{{ args[0] }}"), + # take the output from the previous task and insert it into the prompt + PromptTask("Say the following like a pirate: {{ parent_output }}"), +) + +pipeline.run("Write me a haiku about sailing.") diff --git a/docs/griptape-framework/structures/src/rulesets_1.py b/docs/griptape-framework/structures/src/rulesets_1.py new file mode 100644 index 000000000..173e3f029 --- /dev/null +++ b/docs/griptape-framework/structures/src/rulesets_1.py @@ -0,0 +1,30 @@ +from griptape.rules import Rule, Ruleset +from griptape.structures import Pipeline +from griptape.tasks import PromptTask + +pipeline = Pipeline( + rulesets=[ + Ruleset( + name="Employment", + rules=[ + Rule("Behave like a polite customer support agent"), + Rule("Act like you work for company SkaterWorld, Inc."), + Rule("Discuss only topics related to skateboarding"), + Rule("Limit your response to fewer than 5 sentences."), + ], + ), + Ruleset( + name="Background", + rules=[ + Rule("Your name is Todd"), + ], + ), + ] +) + +pipeline.add_tasks( + PromptTask(input="Respond to this user's question: {{ args[0] }}"), + PromptTask(input="Extract keywords from this response: {{ parent_output }}"), +) + +pipeline.run("How do I do a kickflip?") diff --git a/docs/griptape-framework/structures/src/rulesets_2.py b/docs/griptape-framework/structures/src/rulesets_2.py new file mode 100644 index 000000000..dc1b98d31 --- /dev/null +++ b/docs/griptape-framework/structures/src/rulesets_2.py @@ -0,0 +1,16 @@ +from griptape.rules import Rule +from griptape.structures import Pipeline +from griptape.tasks import PromptTask + +pipeline = Pipeline( + rules=[ + Rule("Respond only using emojis"), + ], +) + +pipeline.add_tasks( + PromptTask("Respond to this question from the user: '{{ args[0] }}'"), + PromptTask("How would you rate your response (1-5)? 1 being bad, 5 being good. Response: '{{parent_output}}'"), +) + +pipeline.run("How do I bake a cake?") diff --git a/docs/griptape-framework/structures/src/rulesets_3.py b/docs/griptape-framework/structures/src/rulesets_3.py new file mode 100644 index 000000000..04769dac9 --- /dev/null +++ b/docs/griptape-framework/structures/src/rulesets_3.py @@ -0,0 +1,32 @@ +from griptape.rules import Rule, Ruleset +from griptape.structures import Pipeline +from griptape.tasks import PromptTask + +pipeline = Pipeline() + +pipeline.add_tasks( + PromptTask( + input="Respond to the following prompt: {{ args[0] }}", + rulesets=[ + Ruleset( + name="Emojis", + rules=[ + Rule("Respond using uppercase characters only."), + ], + ) + ], + ), + PromptTask( + input="Determine the sentiment of the following text: {{ parent_output }}", + rulesets=[ + Ruleset( + name="Diacritic", + rules=[ + Rule("Respond using diacritic characters only."), + ], + ) + ], + ), +) + +pipeline.run("I love skateboarding!") diff --git a/docs/griptape-framework/structures/src/rulesets_4.py b/docs/griptape-framework/structures/src/rulesets_4.py new file mode 100644 index 000000000..2bcce73a1 --- /dev/null +++ b/docs/griptape-framework/structures/src/rulesets_4.py @@ -0,0 +1,16 @@ +from griptape.rules import Rule +from griptape.structures import Pipeline +from griptape.tasks import PromptTask + +pipeline = Pipeline() + +pipeline.add_tasks( + PromptTask( + rules=[ + Rule("Write your answer in json with a single key 'emoji_response'"), + Rule("Respond only using emojis"), + ], + ), +) + +pipeline.run("How are you?") diff --git a/docs/griptape-framework/structures/src/task_memory_1.py b/docs/griptape-framework/structures/src/task_memory_1.py new file mode 100644 index 000000000..90940a611 --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_1.py @@ -0,0 +1,7 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +# Create an agent with the Calculator tool +agent = Agent(tools=[Calculator(off_prompt=False)]) + +agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-framework/structures/src/task_memory_2.py b/docs/griptape-framework/structures/src/task_memory_2.py new file mode 100644 index 000000000..dcc5b4d5c --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_2.py @@ -0,0 +1,7 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +# Create an agent with the Calculator tool +agent = Agent(tools=[Calculator(off_prompt=True)]) + +agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-framework/structures/src/task_memory_3.py b/docs/griptape-framework/structures/src/task_memory_3.py new file mode 100644 index 000000000..cab4f4e3e --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_3.py @@ -0,0 +1,7 @@ +from griptape.structures import Agent +from griptape.tools import Calculator, TaskMemoryClient + +# Create an agent with the Calculator tool +agent = Agent(tools=[Calculator(off_prompt=True), TaskMemoryClient(off_prompt=False)]) + +agent.run("What is the square root of 12345?") diff --git a/docs/griptape-framework/structures/src/task_memory_4.py b/docs/griptape-framework/structures/src/task_memory_4.py new file mode 100644 index 000000000..d192bebb7 --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_4.py @@ -0,0 +1,9 @@ +from griptape.structures import Agent +from griptape.tools import WebScraper + +# Create an agent with the WebScraper tool +agent = Agent(tools=[WebScraper()]) + +agent.run( + "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" +) diff --git a/docs/griptape-framework/structures/src/task_memory_5.py b/docs/griptape-framework/structures/src/task_memory_5.py new file mode 100644 index 000000000..a5d3995a9 --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_5.py @@ -0,0 +1,13 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +agent = Agent( + tools=[ + WebScraper(off_prompt=True), + TaskMemoryClient(off_prompt=False), + ] +) + +agent.run( + "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" +) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py new file mode 100644 index 000000000..70c3bde55 --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -0,0 +1,54 @@ +from griptape.artifacts import TextArtifact +from griptape.config import ( + OpenAiStructureConfig, +) +from griptape.drivers import ( + LocalVectorStoreDriver, + OpenAiChatPromptDriver, + OpenAiEmbeddingDriver, +) +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.memory import TaskMemory +from griptape.memory.task.storage import TextArtifactStorage +from griptape.structures import Agent +from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +agent = Agent( + config=OpenAiStructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), + ), + task_memory=TaskMemory( + artifact_storages={ + TextArtifact: TextArtifactStorage( + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, + query_params={"namespace": "griptape", "count": 20}, + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), + ), + retrieval_rag_module_name="VectorStoreRetrievalRagModule", + vector_store_driver=vector_store_driver, + ) + } + ), + tools=[ + WebScraper(off_prompt=True), + TaskMemoryClient(off_prompt=True, allowlist=["query"]), + FileManager(off_prompt=True), + ], +) + +agent.run( + "Use this page https://en.wikipedia.org/wiki/Elden_Ring to find how many copies of Elden Ring have been sold, and then save the result to a file." +) diff --git a/docs/griptape-framework/structures/src/task_memory_7.py b/docs/griptape-framework/structures/src/task_memory_7.py new file mode 100644 index 000000000..1ffec43e8 --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_7.py @@ -0,0 +1,12 @@ +from griptape.structures import Agent +from griptape.tools import WebScraper + +agent = Agent( + tools=[ + WebScraper(off_prompt=True) # `off_prompt=True` will store the data in Task Memory + # Missing a Tool that can read from Task Memory + ] +) +agent.run( + "According to this page https://en.wikipedia.org/wiki/San_Francisco, what is the population of San Francisco?" +) diff --git a/docs/griptape-framework/structures/src/task_memory_8.py b/docs/griptape-framework/structures/src/task_memory_8.py new file mode 100644 index 000000000..9aba9516f --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_8.py @@ -0,0 +1,14 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +agent = Agent( + tools=[ + WebScraper(off_prompt=True), # This tool will store the data in Task Memory + TaskMemoryClient( + off_prompt=True + ), # This tool will store the data back in Task Memory with no way to get it out + ] +) +agent.run( + "According to this page https://en.wikipedia.org/wiki/Dark_forest_hypothesis, what is the Dark Forest Hypothesis?" +) diff --git a/docs/griptape-framework/structures/src/task_memory_9.py b/docs/griptape-framework/structures/src/task_memory_9.py new file mode 100644 index 000000000..c6d93ba5e --- /dev/null +++ b/docs/griptape-framework/structures/src/task_memory_9.py @@ -0,0 +1,9 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +agent = Agent( + tools=[ + Calculator() # Default value of `off_prompt=False` will return the data directly to the LLM + ] +) +agent.run("What is 10 ^ 3, 55 / 23, and 12345 * 0.5?") diff --git a/docs/griptape-framework/structures/src/tasks_1.py b/docs/griptape-framework/structures/src/tasks_1.py new file mode 100644 index 000000000..6382fe027 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_1.py @@ -0,0 +1,12 @@ +from griptape.structures import Agent +from griptape.tasks import PromptTask + +agent = Agent() +agent.add_task( + PromptTask( + "Respond to the user's following question '{{ args[0] }}' in the language '{{preferred_language}}' and tone '{{tone}}'.", + context={"preferred_language": "ENGLISH", "tone": "PLAYFUL"}, + ) +) + +agent.run("How do I bake a cake?") diff --git a/docs/griptape-framework/structures/src/tasks_10.py b/docs/griptape-framework/structures/src/tasks_10.py new file mode 100644 index 000000000..c94fa7919 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_10.py @@ -0,0 +1,22 @@ +from griptape.artifacts import BaseArtifact, TextArtifact +from griptape.structures import Pipeline +from griptape.tasks import CodeExecutionTask, PromptTask + + +def character_counter(task: CodeExecutionTask) -> BaseArtifact: + result = len(task.input) + # For functions that don't need to return anything, we recommend returning task.input + return TextArtifact(str(result)) + + +# Instantiate the pipeline +pipeline = Pipeline() + +pipeline.add_tasks( + # take the first argument from the pipeline `run` method + CodeExecutionTask(run_fn=character_counter), + # # take the output from the previous task and insert it into the prompt + PromptTask("{{args[0]}} using {{ parent_output }} characters"), +) + +pipeline.run("Write me a line in a poem") diff --git a/docs/griptape-framework/structures/src/tasks_11.py b/docs/griptape-framework/structures/src/tasks_11.py new file mode 100644 index 000000000..9a1f622db --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_11.py @@ -0,0 +1,30 @@ +from griptape.drivers import OpenAiImageGenerationDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Pipeline +from griptape.tasks import PromptImageGenerationTask + +# Create a driver configured to use OpenAI's DALL-E 3 model. +driver = OpenAiImageGenerationDriver( + model="dall-e-3", + quality="hd", + style="natural", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add a PromptImageGenerationTask to the pipeline. +pipeline.add_tasks( + PromptImageGenerationTask( + input="{{ args[0] }}", + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain on a summer day") diff --git a/docs/griptape-framework/structures/src/tasks_12.py b/docs/griptape-framework/structures/src/tasks_12.py new file mode 100644 index 000000000..917b50607 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_12.py @@ -0,0 +1,35 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import VariationImageGenerationEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import VariationImageGenerationTask + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifact. +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add a VariationImageGenerationTask to the pipeline. +pipeline.add_task( + VariationImageGenerationTask( + input=("{{ args[0] }}", image_artifact), + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain landscape on a snowy winter day") diff --git a/docs/griptape-framework/structures/src/tasks_13.py b/docs/griptape-framework/structures/src/tasks_13.py new file mode 100644 index 000000000..d2aa45983 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_13.py @@ -0,0 +1,35 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import InpaintingImageGenerationEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import InpaintingImageGenerationTask + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifacts. +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +mask_artifact = ImageLoader().load(Path("tests/resources/mountain-mask.png").read_bytes()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an InpaintingImageGenerationTask to the pipeline. +pipeline.add_task( + InpaintingImageGenerationTask( + input=("{{ args[0] }}", image_artifact, mask_artifact), image_generation_engine=engine, output_dir="images/" + ) +) + +pipeline.run("An image of a castle built into the side of a mountain") diff --git a/docs/griptape-framework/structures/src/tasks_14.py b/docs/griptape-framework/structures/src/tasks_14.py new file mode 100644 index 000000000..ec489096d --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_14.py @@ -0,0 +1,37 @@ +from pathlib import Path + +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import OutpaintingImageGenerationTask + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Load input image artifacts. +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +mask_artifact = ImageLoader().load(Path("tests/resources/mountain-mask.png").read_bytes()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an OutpaintingImageGenerationTask to the pipeline. +pipeline.add_task( + OutpaintingImageGenerationTask( + input=("{{ args[0] }}", image_artifact, mask_artifact), + image_generation_engine=engine, + output_dir="images/", + ) +) + +pipeline.run("An image of a mountain shrouded by clouds") diff --git a/docs/griptape-framework/structures/src/tasks_15.py b/docs/griptape-framework/structures/src/tasks_15.py new file mode 100644 index 000000000..0c60864f7 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_15.py @@ -0,0 +1,34 @@ +from pathlib import Path + +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader +from griptape.structures import Pipeline +from griptape.tasks import ImageQueryTask + +# Create a driver configured to use OpenAI's GPT-4 Vision model. +driver = OpenAiImageQueryDriver( + model="gpt-4o", + max_tokens=100, +) + +# Create an engine configured to use the driver. +engine = ImageQueryEngine( + image_query_driver=driver, +) + +# Load the input image artifact. +image_artifact = ImageLoader().load(Path("tests/resources/mountain.png").read_bytes()) + +# Instantiate a pipeline. +pipeline = Pipeline() + +# Add an ImageQueryTask to the pipeline. +pipeline.add_task( + ImageQueryTask( + input=("{{ args[0] }}", [image_artifact]), + image_query_engine=engine, + ) +) + +pipeline.run("Describe the weather in the image") diff --git a/docs/griptape-framework/structures/src/tasks_16.py b/docs/griptape-framework/structures/src/tasks_16.py new file mode 100644 index 000000000..796b836da --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_16.py @@ -0,0 +1,134 @@ +import os + +from griptape.drivers import GoogleWebSearchDriver, LocalStructureRunDriver +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent, Pipeline +from griptape.tasks import StructureRunTask +from griptape.tools import ( + TaskMemoryClient, + WebScraper, + WebSearch, +) + + +def build_researcher() -> Agent: + researcher = Agent( + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + ), + WebScraper( + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Senior Research Analyst", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Uncover cutting-edge developments in AI and data science", + ) + ], + ), + Ruleset( + name="Background", + rules=[ + Rule( + value="""You work at a leading tech think tank., + Your expertise lies in identifying emerging trends. + You have a knack for dissecting complex data and presenting actionable insights.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full analysis report in bullet points", + ) + ], + ), + ], + ) + + return researcher + + +def build_writer() -> Agent: + writer = Agent( + input="Instructions: {{args[0]}}\nContext: {{args[1]}}", + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Tech Content Strategist", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Craft compelling content on tech advancements", + ) + ], + ), + Ruleset( + name="Backstory", + rules=[ + Rule( + value="""You are a renowned Content Strategist, known for your insightful and engaging articles. + You transform complex concepts into compelling narratives.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full blog post of at least 4 paragraphs", + ) + ], + ), + ], + ) + + return writer + + +team = Pipeline( + tasks=[ + StructureRunTask( + ( + """Perform a detailed examination of the newest developments in AI as of 2024. + Pinpoint major trends, breakthroughs, and their implications for various industries.""", + ), + driver=LocalStructureRunDriver(structure_factory_fn=build_researcher), + ), + StructureRunTask( + ( + """Utilize the gathered insights to craft a captivating blog + article showcasing the key AI innovations. + Ensure the content is engaging yet straightforward, appealing to a tech-aware readership. + Keep the tone appealing and use simple language to make it less technical.""", + "{{parent_output}}", + ), + driver=LocalStructureRunDriver(structure_factory_fn=build_writer), + ), + ], +) + +team.run() diff --git a/docs/griptape-framework/structures/src/tasks_17.py b/docs/griptape-framework/structures/src/tasks_17.py new file mode 100644 index 000000000..e0bcae7fb --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_17.py @@ -0,0 +1,20 @@ +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.structures import Pipeline +from griptape.tasks import TextToSpeechTask + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.environ["ELEVEN_LABS_API_KEY"], + model="eleven_multilingual_v2", + voice="Matilda", +) + +task = TextToSpeechTask( + text_to_speech_engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Pipeline(tasks=[task]).run("Generate audio from this text: 'Hello, world!'") diff --git a/docs/griptape-framework/structures/src/tasks_18.py b/docs/griptape-framework/structures/src/tasks_18.py new file mode 100644 index 000000000..08ece5a92 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_18.py @@ -0,0 +1,17 @@ +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.loaders import AudioLoader +from griptape.structures import Pipeline +from griptape.tasks import AudioTranscriptionTask +from griptape.utils import load_file + +driver = OpenAiAudioTranscriptionDriver(model="whisper-1") + +task = AudioTranscriptionTask( + input=lambda _: AudioLoader().load(load_file("tests/resources/sentences2.wav")), + audio_transcription_engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Pipeline(tasks=[task]).run() diff --git a/docs/griptape-framework/structures/src/tasks_2.py b/docs/griptape-framework/structures/src/tasks_2.py new file mode 100644 index 000000000..0f5f152f6 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_2.py @@ -0,0 +1,10 @@ +from griptape.structures import Agent +from griptape.tasks import PromptTask + +agent = Agent() +agent.add_task( + # take the first argument from the agent `run` method + PromptTask("Respond to the following request: {{ args[0] }}"), +) + +agent.run("Write me a haiku") diff --git a/docs/griptape-framework/structures/src/tasks_3.py b/docs/griptape-framework/structures/src/tasks_3.py new file mode 100644 index 000000000..6584049d0 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_3.py @@ -0,0 +1,10 @@ +from pathlib import Path + +from griptape.loaders import ImageLoader +from griptape.structures import Agent + +agent = Agent() + +image_artifact = ImageLoader().load(Path("tests/resources/mountain.jpg").read_bytes()) + +agent.run([image_artifact, "What's in this image?"]) diff --git a/docs/griptape-framework/structures/src/tasks_4.py b/docs/griptape-framework/structures/src/tasks_4.py new file mode 100644 index 000000000..43737980b --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_4.py @@ -0,0 +1,13 @@ +from griptape.structures import Agent +from griptape.tasks import ToolkitTask +from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +agent = Agent() +agent.add_task( + ToolkitTask( + "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=True)], + ), +) + +agent.run() diff --git a/docs/griptape-framework/structures/src/tasks_5.py b/docs/griptape-framework/structures/src/tasks_5.py new file mode 100644 index 000000000..543543303 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_5.py @@ -0,0 +1,10 @@ +from griptape.structures import Agent +from griptape.tasks import ToolTask +from griptape.tools import Calculator + +# Initialize the agent and add a task +agent = Agent() +agent.add_task(ToolTask(tool=Calculator())) + +# Run the agent with a prompt +agent.run("Give me the answer for 5*4.") diff --git a/docs/griptape-framework/structures/src/tasks_6.py b/docs/griptape-framework/structures/src/tasks_6.py new file mode 100644 index 000000000..a1b84e44d --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_6.py @@ -0,0 +1,29 @@ +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import CsvExtractionEngine +from griptape.structures import Agent +from griptape.tasks import ExtractionTask + +# Instantiate the CSV extraction engine +csv_extraction_engine = CsvExtractionEngine(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo")) + +# Define some unstructured data and columns +csv_data = """ +Alice, 28, lives in New York. +Bob, 35 lives in California. +Charlie is 40 and lives in Texas. +""" + +columns = ["Name", "Age", "Address"] + + +# Create an agent and add the ExtractionTask to it +agent = Agent() +agent.add_task( + ExtractionTask( + extraction_engine=csv_extraction_engine, + args={"column_names": columns}, + ) +) + +# Run the agent +agent.run(csv_data) diff --git a/docs/griptape-framework/structures/src/tasks_7.py b/docs/griptape-framework/structures/src/tasks_7.py new file mode 100644 index 000000000..909d00084 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_7.py @@ -0,0 +1,29 @@ +from schema import Schema + +from griptape.drivers import OpenAiChatPromptDriver +from griptape.engines import JsonExtractionEngine +from griptape.structures import Agent +from griptape.tasks import ExtractionTask + +# Instantiate the json extraction engine +json_extraction_engine = JsonExtractionEngine( + prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), +) + +# Define some unstructured data and a schema +json_data = """ +Alice (Age 28) lives in New York. +Bob (Age 35) lives in California. +""" +user_schema = Schema({"users": [{"name": str, "age": int, "location": str}]}).json_schema("UserSchema") + +agent = Agent() +agent.add_task( + ExtractionTask( + extraction_engine=json_extraction_engine, + args={"template_schema": user_schema}, + ) +) + +# Run the agent +agent.run(json_data) diff --git a/docs/griptape-framework/structures/src/tasks_8.py b/docs/griptape-framework/structures/src/tasks_8.py new file mode 100644 index 000000000..cad73adf0 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_8.py @@ -0,0 +1,24 @@ +from griptape.structures import Agent +from griptape.tasks import TextSummaryTask + +# Create a new agent +agent = Agent() + +# Add the TextSummaryTask to the agent +agent.add_task(TextSummaryTask()) + + +# Run the agent +agent.run( + "Artificial Intelligence (AI) is a branch of computer science that deals with " + "creating machines capable of thinking and learning. It encompasses various fields " + "such as machine learning, neural networks, and deep learning. AI has the potential " + "to revolutionize many sectors, including healthcare, finance, and transportation. " + "Our life in this modern age depends largely on computers. It is almost impossible " + "to think about life without computers. We need computers in everything that we use " + "in our daily lives. So it becomes very important to make computers intelligent so " + "that our lives become easy. Artificial Intelligence is the theory and development " + "of computers, which imitates the human intelligence and senses, such as visual " + "perception, speech recognition, decision-making, and translation between languages." + " Artificial Intelligence has brought a revolution in the world of technology. " +) diff --git a/docs/griptape-framework/structures/src/tasks_9.py b/docs/griptape-framework/structures/src/tasks_9.py new file mode 100644 index 000000000..6fca66cc5 --- /dev/null +++ b/docs/griptape-framework/structures/src/tasks_9.py @@ -0,0 +1,39 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.structures import Agent +from griptape.tasks import RagTask + +# Initialize Embedding Driver and Vector Store Driver +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifacts = [ + TextArtifact("Griptape builds AI-powered applications that connect securely to your enterprise data and APIs."), + TextArtifact("Griptape Agents provide incredible power and flexibility when working with large language models."), +] +vector_store_driver.upsert_text_artifacts({"griptape": artifacts}) + +# Instantiate the agent and add RagTask with the RagEngine +agent = Agent() +agent.add_task( + RagTask( + "Respond to the following query: {{ args[0] }}", + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, query_params={"namespace": "griptape", "top_n": 20} + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), + ), + ) +) + +# Run the agent with a query string +agent.run("Give me information about Griptape") diff --git a/docs/griptape-framework/structures/src/workflows_1.py b/docs/griptape-framework/structures/src/workflows_1.py new file mode 100644 index 000000000..e6e57bafb --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_1.py @@ -0,0 +1,34 @@ +from griptape.structures import Workflow +from griptape.tasks import PromptTask +from griptape.utils import StructureVisualizer + +world_task = PromptTask( + "Create a fictional world based on the following key words {{ keywords|join(', ') }}", + context={"keywords": ["fantasy", "ocean", "tidal lock"]}, + id="world", +) + + +def character_task(task_id: str, character_name: str) -> PromptTask: + return PromptTask( + "Based on the following world description create a character named {{ name }}:\n{{ parent_outputs['world'] }}", + context={"name": character_name}, + id=task_id, + parent_ids=["world"], + ) + + +scotty_task = character_task("scotty", "Scotty") +annie_task = character_task("annie", "Annie") + +story_task = PromptTask( + "Based on the following description of the world and characters, write a short story:\n{{ parent_outputs['world'] }}\n{{ parent_outputs['scotty'] }}\n{{ parent_outputs['annie'] }}", + id="story", + parent_ids=["world", "scotty", "annie"], +) + +workflow = Workflow(tasks=[world_task, story_task, scotty_task, annie_task, story_task]) + +print(StructureVisualizer(workflow).to_url()) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_2.py b/docs/griptape-framework/structures/src/workflows_2.py new file mode 100644 index 000000000..2811166ca --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_2.py @@ -0,0 +1,14 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal"), + PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"]), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", parent_ids=["adjective"]), + ], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_3.py b/docs/griptape-framework/structures/src/workflows_3.py new file mode 100644 index 000000000..d65e7fc53 --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_3.py @@ -0,0 +1,16 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal", child_ids=["adjective"]), + PromptTask( + "Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", child_ids=["new-animal"] + ), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), + ], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_4.py b/docs/griptape-framework/structures/src/workflows_4.py new file mode 100644 index 000000000..c6fcb077f --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_4.py @@ -0,0 +1,19 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal"), + PromptTask( + "Describe {{ parent_outputs['animal'] }} with an adjective", + id="adjective", + parent_ids=["animal"], + child_ids=["new-animal"], + ), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), + ], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_5.py b/docs/griptape-framework/structures/src/workflows_5.py new file mode 100644 index 000000000..53c30e76a --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_5.py @@ -0,0 +1,17 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") + +adjective_task.add_parent(animal_task) +new_animal_task.add_parent(adjective_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_6.py b/docs/griptape-framework/structures/src/workflows_6.py new file mode 100644 index 000000000..2f3467d83 --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_6.py @@ -0,0 +1,17 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") + +animal_task.add_child(adjective_task) +adjective_task.add_child(new_animal_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_7.py b/docs/griptape-framework/structures/src/workflows_7.py new file mode 100644 index 000000000..9ef291290 --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_7.py @@ -0,0 +1,18 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +workflow = Workflow( + rules=[Rule("output a single lowercase word")], +) + +animal_task = PromptTask("Name an animal", id="animal", structure=workflow) +adjective_task = PromptTask( + "Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", structure=workflow +) +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", structure=workflow) + +adjective_task.add_parent(animal_task) +adjective_task.add_child(new_animal_task) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_8.py b/docs/griptape-framework/structures/src/workflows_8.py new file mode 100644 index 000000000..f8b8326ca --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_8.py @@ -0,0 +1,19 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask( + "Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"] +) + + +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") +new_animal_task.add_parent(adjective_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() diff --git a/docs/griptape-framework/structures/src/workflows_9.py b/docs/griptape-framework/structures/src/workflows_9.py new file mode 100644 index 000000000..7ecd9233e --- /dev/null +++ b/docs/griptape-framework/structures/src/workflows_9.py @@ -0,0 +1,23 @@ +from griptape.rules import Rule +from griptape.structures import Workflow +from griptape.tasks import PromptTask + +workflow = Workflow( + rules=[Rule("output a single lowercase word")], +) + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +color_task = PromptTask("Describe {{ parent_outputs['animal'] }} with a color", id="color") +new_animal_task = PromptTask("Name an animal described as: \n{{ parents_output_text }}", id="new-animal") + +# The following workflow runs animal_task, then (adjective_task, and color_task) +# in parallel, then finally new_animal_task. +# +# In other words, the output of animal_task is passed to both adjective_task and color_task +# and the outputs of adjective_task and color_task are then passed to new_animal_task. +workflow.add_task(animal_task) +workflow.add_task(new_animal_task) +workflow.insert_tasks(animal_task, [adjective_task, color_task], new_animal_task) + +workflow.run() diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index ea4a787f6..6b858ff5b 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -22,15 +22,7 @@ When `off_prompt` is set to `True`, the Tool will store its output in Task Memor Lets look at a simple example where `off_prompt` is set to `False`: ```python -from griptape.structures import Agent -from griptape.tools import Calculator - -# Create an agent with the Calculator tool -agent = Agent( - tools=[Calculator(off_prompt=False)] -) - -agent.run("What is 10 raised to the power of 5?") +--8<-- "docs/griptape-framework/structures/src/task_memory_1.py" ``` ``` @@ -50,15 +42,7 @@ Since the result of the Calculator Tool is neither sensitive nor too large, we c Let's explore what happens when `off_prompt` is set to `True`: ```python -from griptape.structures import Agent -from griptape.tools import Calculator - -# Create an agent with the Calculator tool -agent = Agent( - tools=[Calculator(off_prompt=True)] -) - -agent.run("What is 10 raised to the power of 5?") +--8<-- "docs/griptape-framework/structures/src/task_memory_2.py" ``` ``` @@ -100,13 +84,7 @@ Note that on the `TaskMemoryClient` we've set `off_prompt` to `False` so that th If we had kept it as `True`, the results would have been stored back Task Memory which would've put us back to square one. See [Task Memory Looping](#task-memory-looping) for more information on this scenario. ```python -from griptape.structures import Agent -from griptape.tools import Calculator, TaskMemoryClient - -# Create an agent with the Calculator tool -agent = Agent(tools=[Calculator(off_prompt=True), TaskMemoryClient(off_prompt=False)]) - -agent.run("What is the square root of 12345?") +--8<-- "docs/griptape-framework/structures/src/task_memory_3.py" ``` ``` @@ -137,15 +115,7 @@ Let's look at a more complex example where Task Memory shines. Let's say we want to query the contents of a very large webpage. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper - -# Create an agent with the WebScraper tool -agent = Agent(tools=[WebScraper()]) - -agent.run( - "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" -) +--8<-- "docs/griptape-framework/structures/src/task_memory_4.py" ``` When running this example, we get the following error: @@ -159,19 +129,7 @@ This is because the content of the webpage is too large to fit in the LLM's inpu Note that we're setting `off_prompt` to `False` on the `TaskMemoryClient` so that the _queried_ content can be returned directly to the LLM. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper, TaskMemoryClient - -agent = Agent( - tools=[ - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=False), - ] -) - -agent.run( - "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" -) +--8<-- "docs/griptape-framework/structures/src/task_memory_5.py" ``` And now we get the expected output: @@ -204,65 +162,7 @@ Here is an example where we use GPT-4 to orchestrate the Tools and store the dat In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManager` can save the results to disk without GPT-4 ever seeing them. ```python -from griptape.artifacts import TextArtifact -from griptape.config import ( - OpenAiStructureConfig, -) -from griptape.drivers import ( - LocalVectorStoreDriver, - OpenAiChatPromptDriver, OpenAiEmbeddingDriver, -) -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage -from griptape.memory import TaskMemory -from griptape.memory.task.storage import TextArtifactStorage -from griptape.structures import Agent -from griptape.tools import FileManager, TaskMemoryClient, WebScraper - -vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - -agent = Agent( - config=OpenAiStructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), - ), - task_memory=TaskMemory( - artifact_storages={ - TextArtifact: TextArtifactStorage( - rag_engine=RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - - vector_store_driver=vector_store_driver, - query_params={ - "namespace": "griptape", - "count": 20 - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) - ), - retrieval_rag_module_name="VectorStoreRetrievalRagModule", - vector_store_driver=vector_store_driver - ) - } - ), - tools=[ - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=True, allowlist=["query"]), - FileManager(off_prompt=True), - ], -) - -agent.run( - "Use this page https://en.wikipedia.org/wiki/Elden_Ring to find how many copies of Elden Ring have been sold, and then save the result to a file." -) +--8<-- "docs/griptape-framework/structures/src/task_memory_6.py" ``` ``` @@ -348,16 +248,7 @@ By default, Griptape will store `TextArtifact`'s, `BlobArtifact`'s in Task Memor When using Task Memory, make sure that you have at least one Tool that can read from Task Memory. If you don't, the data stored in Task Memory will be inaccessible to the Agent and it may hallucinate Tool Activities. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper - -agent = Agent( - tools=[ - WebScraper(off_prompt=True) # `off_prompt=True` will store the data in Task Memory - # Missing a Tool that can read from Task Memory - ] -) -agent.run("According to this page https://en.wikipedia.org/wiki/San_Francisco, what is the population of San Francisco?") +--8<-- "docs/griptape-framework/structures/src/task_memory_7.py" ``` ### Task Memory Looping @@ -365,30 +256,13 @@ An improper configuration of Tools can lead to the LLM using the Tools in a loop This can create a loop where the same data is stored and queried over and over again. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper, TaskMemoryClient - -agent = Agent( - tools=[ - WebScraper(off_prompt=True), # This tool will store the data in Task Memory - TaskMemoryClient(off_prompt=True) # This tool will store the data back in Task Memory with no way to get it out - ] -) -agent.run("According to this page https://en.wikipedia.org/wiki/Dark_forest_hypothesis, what is the Dark Forest Hypothesis?") +--8<-- "docs/griptape-framework/structures/src/task_memory_8.py" ``` ### Task Memory May Not Be Necessary Task Memory may not be necessary for all use cases. If the data returned by a Tool is not sensitive, not too large, and does not need to be acted upon by another Tool, you can leave the default of `off_prompt` to `False` and return the data directly to the LLM. ```python -from griptape.structures import Agent -from griptape.tools import Calculator - -agent = Agent( - tools=[ - Calculator() # Default value of `off_prompt=False` will return the data directly to the LLM - ] -) -agent.run("What is 10 ^ 3, 55 / 23, and 12345 * 0.5?") +--8<-- "docs/griptape-framework/structures/src/task_memory_9.py" ``` diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 6d479578b..a57c1e604 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -18,19 +18,7 @@ Within the [input](../../reference/griptape/tasks/base_text_input_task.md#gripta Additional [context](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.context) variables may be added based on the Structure running the task. ```python -from griptape.structures import Agent -from griptape.tasks import PromptTask - - -agent = Agent() -agent.add_task( - PromptTask( - "Respond to the user's following question '{{ args[0] }}' in the language '{{preferred_language}}' and tone '{{tone}}'.", - context={"preferred_language": "ENGLISH", "tone": "PLAYFUL"}, - ) -) - -agent.run("How do I bake a cake?") +--8<-- "docs/griptape-framework/structures/src/tasks_1.py" ``` ``` @@ -70,17 +58,7 @@ agent.run("How do I bake a cake?") For general purpose prompting, use the [PromptTask](../../reference/griptape/tasks/prompt_task.md): ```python -from griptape.tasks import PromptTask -from griptape.structures import Agent - - -agent = Agent() -agent.add_task( - # take the first argument from the agent `run` method - PromptTask("Respond to the following request: {{ args[0] }}"), -) - -agent.run("Write me a haiku") +--8<-- "docs/griptape-framework/structures/src/tasks_2.py" ``` ``` @@ -96,14 +74,7 @@ agent.run("Write me a haiku") If the model supports it, you can also pass image inputs: ```python -from griptape.structures import Agent -from griptape.loaders import ImageLoader - -agent = Agent() -with open("tests/resources/mountain.jpg", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -agent.run([image_artifact, "What's in this image?"]) +--8<-- "docs/griptape-framework/structures/src/tasks_3.py" ``` ``` @@ -124,20 +95,7 @@ To use [Griptape Tools](../../griptape-framework/tools/index.md), use a [Toolkit This Task takes in one or more Tools which the LLM will decide to use through Chain of Thought (CoT) reasoning. Because this Task uses CoT, it is recommended to only use with very capable models. ```python -from griptape.tasks import ToolkitTask -from griptape.structures import Agent -from griptape.tools import WebScraper, FileManager, TaskMemoryClient - - -agent = Agent() -agent.add_task( - ToolkitTask( - "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=True)] - ), -) - -agent.run() +--8<-- "docs/griptape-framework/structures/src/tasks_4.py" ``` ``` @@ -182,16 +140,7 @@ Another way to use [Griptape Tools](../../griptape-framework/tools/index.md), is This Task takes in a single Tool which the LLM will use without Chain of Thought (CoT) reasoning. Because this Task does not use CoT, it is better suited for less capable models. ```python -from griptape.structures import Agent -from griptape.tasks import ToolTask -from griptape.tools import Calculator - -# Initialize the agent and add a task -agent = Agent() -agent.add_task(ToolTask(tool=Calculator())) - -# Run the agent with a prompt -agent.run("Give me the answer for 5*4.") +--8<-- "docs/griptape-framework/structures/src/tasks_5.py" ``` ``` @@ -223,37 +172,7 @@ This Task takes an [Extraction Engine](../../griptape-framework/engines/extracti ### CSV Extraction ```python -from griptape.drivers import OpenAiChatPromptDriver -from griptape.tasks import ExtractionTask -from griptape.structures import Agent -from griptape.engines import CsvExtractionEngine - -# Instantiate the CSV extraction engine -csv_extraction_engine = CsvExtractionEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo") -) - -# Define some unstructured data and columns -csv_data = """ -Alice, 28, lives in New York. -Bob, 35 lives in California. -Charlie is 40 and lives in Texas. -""" - -columns = ["Name", "Age", "Address"] - - -# Create an agent and add the ExtractionTask to it -agent = Agent() -agent.add_task( - ExtractionTask( - extraction_engine=csv_extraction_engine, - args={"column_names": columns}, - ) -) - -# Run the agent -agent.run(csv_data) +--8<-- "docs/griptape-framework/structures/src/tasks_6.py" ``` ``` [12/19/23 10:33:11] INFO ExtractionTask e87fb457edf8423ab8a78583badd7a11 @@ -272,37 +191,7 @@ agent.run(csv_data) ### JSON Extraction ```python -from schema import Schema - -from griptape.drivers import OpenAiChatPromptDriver -from griptape.tasks import ExtractionTask -from griptape.structures import Agent -from griptape.engines import JsonExtractionEngine - -# Instantiate the json extraction engine -json_extraction_engine = JsonExtractionEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), -) - -# Define some unstructured data and a schema -json_data = """ -Alice (Age 28) lives in New York. -Bob (Age 35) lives in California. -""" -user_schema = Schema( - {"users": [{"name": str, "age": int, "location": str}]} -).json_schema("UserSchema") - -agent = Agent() -agent.add_task( - ExtractionTask( - extraction_engine=json_extraction_engine, - args={"template_schema": user_schema}, - ) -) - -# Run the agent -agent.run(json_data) +--8<-- "docs/griptape-framework/structures/src/tasks_7.py" ``` ``` [12/19/23 10:37:41] INFO ExtractionTask 3315cc77f94943a2a2dceccfe44f6a67 @@ -321,30 +210,7 @@ To summarize a text, use the [TextSummaryTask](../../reference/griptape/tasks/te This Task takes an [Summarization Engine](../../griptape-framework/engines/summary-engines.md), and a set of arguments to the engine. ```python -from griptape.structures import Agent -from griptape.tasks import TextSummaryTask - -# Create a new agent -agent = Agent() - -# Add the TextSummaryTask to the agent -agent.add_task(TextSummaryTask()) - - -# Run the agent -agent.run( - "Artificial Intelligence (AI) is a branch of computer science that deals with " - "creating machines capable of thinking and learning. It encompasses various fields " - "such as machine learning, neural networks, and deep learning. AI has the potential " - "to revolutionize many sectors, including healthcare, finance, and transportation. " - "Our life in this modern age depends largely on computers. It is almost impossible " - "to think about life without computers. We need computers in everything that we use " - "in our daily lives. So it becomes very important to make computers intelligent so " - "that our lives become easy. Artificial Intelligence is the theory and development " - "of computers, which imitates the human intelligence and senses, such as visual " - "perception, speech recognition, decision-making, and translation between languages." - " Artificial Intelligence has brought a revolution in the world of technology. " -) +--8<-- "docs/griptape-framework/structures/src/tasks_8.py" ``` ``` @@ -386,51 +252,7 @@ To query text, use the [RagTask](../../reference/griptape/tasks/rag_task.md). This task takes a [RAG Engine](../../griptape-framework/engines/rag-engines.md), and a set of arguments specific to the engine. ```python -from griptape.structures import Agent -from griptape.tasks import RagTask -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.artifacts import TextArtifact -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage - -# Initialize Embedding Driver and Vector Store Driver -vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - -artifacts = [ - TextArtifact("Griptape builds AI-powered applications that connect securely to your enterprise data and APIs."), - TextArtifact("Griptape Agents provide incredible power and flexibility when working with large language models.") -] -vector_store_driver.upsert_text_artifacts({"griptape": artifacts}) - -# Instantiate the agent and add RagTask with the RagEngine -agent = Agent() -agent.add_task( - RagTask( - "Respond to the following query: {{ args[0] }}", - rag_engine=RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, - query_params={ - "namespace": "griptape", - "top_n": 20 - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) - ), - ) -) - -# Run the agent with a query string -agent.run("Give me information about Griptape") +--8<-- "docs/griptape-framework/structures/src/tasks_9.py" ``` ## Code Execution Task @@ -439,29 +261,7 @@ To execute an arbitrary Python function, use the [CodeExecutionTask](../../refer This task takes a python function, and authors can elect to return a custom artifact. ```python -from griptape.structures import Pipeline -from griptape.tasks import CodeExecutionTask, PromptTask -from griptape.artifacts import BaseArtifact, TextArtifact - - -def character_counter(task: CodeExecutionTask) -> BaseArtifact: - result = len(task.input) - # For functions that don't need to return anything, we recommend returning task.input - return TextArtifact(str(result)) - - -# Instantiate the pipeline -pipeline = Pipeline() - -pipeline.add_tasks( - - # take the first argument from the pipeline `run` method - CodeExecutionTask(run_fn=character_counter), - # # take the output from the previous task and insert it into the prompt - PromptTask("{{args[0]}} using {{ parent_output }} characters") -) - -pipeline.run("Write me a line in a poem") +--8<-- "docs/griptape-framework/structures/src/tasks_10.py" ``` ``` @@ -487,37 +287,7 @@ All successful Image Generation Tasks will always output an [Image Artifact](../ The [Prompt Image Generation Task](../../reference/griptape/tasks/prompt_image_generation_task.md) generates an image from a text prompt. ```python -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import OpenAiImageGenerationDriver -from griptape.tasks import PromptImageGenerationTask -from griptape.structures import Pipeline - - -# Create a driver configured to use OpenAI's DALL-E 3 model. -driver = OpenAiImageGenerationDriver( - model="dall-e-3", - quality="hd", - style="natural", -) - -# Create an engine configured to use the driver. -engine = PromptImageGenerationEngine( - image_generation_driver=driver, -) - -# Instantiate a pipeline. -pipeline = Pipeline() - -# Add a PromptImageGenerationTask to the pipeline. -pipeline.add_tasks( - PromptImageGenerationTask( - input="{{ args[0] }}", - image_generation_engine=engine, - output_dir="images/", - ) -) - -pipeline.run("An image of a mountain on a summer day") +--8<-- "docs/griptape-framework/structures/src/tasks_11.py" ``` ### Variation Image Generation Task @@ -525,42 +295,7 @@ pipeline.run("An image of a mountain on a summer day") The [Variation Image Generation Task](../../reference/griptape/tasks/variation_image_generation_task.md) generates an image using an input image and a text prompt. The input image is used as a basis for generating a new image as requested by the text prompt. ```python -from griptape.engines import VariationImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tasks import VariationImageGenerationTask -from griptape.loaders import ImageLoader -from griptape.structures import Pipeline - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = VariationImageGenerationEngine( - image_generation_driver=driver, -) - -# Load input image artifact. -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -# Instantiate a pipeline. -pipeline = Pipeline() - -# Add a VariationImageGenerationTask to the pipeline. -pipeline.add_task( - VariationImageGenerationTask( - input=("{{ args[0] }}", image_artifact), - image_generation_engine=engine, - output_dir="images/", - ) -) - -pipeline.run("An image of a mountain landscape on a snowy winter day") +--8<-- "docs/griptape-framework/structures/src/tasks_12.py" ``` ### Inpainting Image Generation Task @@ -568,45 +303,7 @@ pipeline.run("An image of a mountain landscape on a snowy winter day") The [Inpainting Image Generation Task](../../reference/griptape/tasks/inpainting_image_generation_task.md) generates an image using an input image, a mask image, and a text prompt. The input image will be modified within the bounds of the mask image as requested by the text prompt. ```python -from griptape.engines import InpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tasks import InpaintingImageGenerationTask -from griptape.loaders import ImageLoader -from griptape.structures import Pipeline - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = InpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -# Load input image artifacts. -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -with open("tests/resources/mountain-mask.png", "rb") as f: - mask_artifact = ImageLoader().load(f.read()) - -# Instantiate a pipeline. -pipeline = Pipeline() - -# Add an InpaintingImageGenerationTask to the pipeline. -pipeline.add_task( - InpaintingImageGenerationTask( - input=("{{ args[0] }}", image_artifact, mask_artifact), - image_generation_engine=engine, - output_dir="images/" - ) -) - -pipeline.run("An image of a castle built into the side of a mountain") +--8<-- "docs/griptape-framework/structures/src/tasks_13.py" ``` ### Outpainting Image Generation Task @@ -614,45 +311,7 @@ pipeline.run("An image of a castle built into the side of a mountain") The [Outpainting Image Generation Task](../../reference/griptape/tasks/outpainting_image_generation_task.md) generates an image using an input image, a mask image, and a text prompt. The input image will be modified outside the bounds of a mask image as requested by the text prompt. ```python -from griptape.engines import OutpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tasks import OutpaintingImageGenerationTask -from griptape.loaders import ImageLoader -from griptape.structures import Pipeline - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = OutpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -# Load input image artifacts. -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -with open("tests/resources/mountain-mask.png", "rb") as f: - mask_artifact = ImageLoader().load(f.read()) - -# Instantiate a pipeline. -pipeline = Pipeline() - -# Add an OutpaintingImageGenerationTask to the pipeline. -pipeline.add_task( - OutpaintingImageGenerationTask( - input=("{{ args[0] }}", image_artifact, mask_artifact), - image_generation_engine=engine, - output_dir="images/", - ) -) - -pipeline.run("An image of a mountain shrouded by clouds") +--8<-- "docs/griptape-framework/structures/src/tasks_14.py" ``` ## Image Query Task @@ -662,39 +321,7 @@ The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) perfo This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#textartifact)) and a list of [Image Artifacts](../data/artifacts.md#imageartifact) or a Callable returning these two values. ```python -from griptape.engines import ImageQueryEngine -from griptape.drivers import OpenAiImageQueryDriver -from griptape.tasks import ImageQueryTask -from griptape.loaders import ImageLoader -from griptape.structures import Pipeline - -# Create a driver configured to use OpenAI's GPT-4 Vision model. -driver = OpenAiImageQueryDriver( - model="gpt-4o", - max_tokens=100, -) - -# Create an engine configured to use the driver. -engine = ImageQueryEngine( - image_query_driver=driver, -) - -# Load the input image artifact. -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -# Instantiate a pipeline. -pipeline = Pipeline() - -# Add an ImageQueryTask to the pipeline. -pipeline.add_task( - ImageQueryTask( - input=("{{ args[0] }}", [image_artifact]), - image_query_engine=engine, - ) -) - -pipeline.run("Describe the weather in the image") +--8<-- "docs/griptape-framework/structures/src/tasks_15.py" ``` ## Structure Run Task @@ -702,140 +329,7 @@ The [Structure Run Task](../../reference/griptape/tasks/structure_run_task.md) r This Task is useful for orchestrating multiple specialized Structures in a single run. Note that the input to the Task is a tuple of arguments that will be passed to the Structure. ```python -import os - -from griptape.rules import Rule, Ruleset -from griptape.structures import Agent, Pipeline -from griptape.tasks import StructureRunTask -from griptape.drivers import LocalStructureRunDriver, GoogleWebSearchDriver -from griptape.tools import ( - TaskMemoryClient, - WebScraper, - WebSearch, -) - - -def build_researcher(): - researcher = Agent( - tools=[ - WebSearch( - web_search_driver=GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], - ), - ), - WebScraper( - off_prompt=True, - ), - TaskMemoryClient(off_prompt=False), - ], - rulesets=[ - Ruleset( - name="Position", - rules=[ - Rule( - value="Senior Research Analyst", - ) - ], - ), - Ruleset( - name="Objective", - rules=[ - Rule( - value="Uncover cutting-edge developments in AI and data science", - ) - ], - ), - Ruleset( - name="Background", - rules=[ - Rule( - value="""You work at a leading tech think tank., - Your expertise lies in identifying emerging trends. - You have a knack for dissecting complex data and presenting actionable insights.""" - ) - ], - ), - Ruleset( - name="Desired Outcome", - rules=[ - Rule( - value="Full analysis report in bullet points", - ) - ], - ), - ], - ) - - return researcher - - -def build_writer(): - writer = Agent( - input="Instructions: {{args[0]}}\nContext: {{args[1]}}", - rulesets=[ - Ruleset( - name="Position", - rules=[ - Rule( - value="Tech Content Strategist", - ) - ], - ), - Ruleset( - name="Objective", - rules=[ - Rule( - value="Craft compelling content on tech advancements", - ) - ], - ), - Ruleset( - name="Backstory", - rules=[ - Rule( - value="""You are a renowned Content Strategist, known for your insightful and engaging articles. - You transform complex concepts into compelling narratives.""" - ) - ], - ), - Ruleset( - name="Desired Outcome", - rules=[ - Rule( - value="Full blog post of at least 4 paragraphs", - ) - ], - ), - ], - ) - - return writer - - -team = Pipeline( - tasks=[ - StructureRunTask( - ( - """Perform a detailed examination of the newest developments in AI as of 2024. - Pinpoint major trends, breakthroughs, and their implications for various industries.""", - ), - driver=LocalStructureRunDriver(structure_factory_fn=build_researcher), - ), - StructureRunTask( - ( - """Utilize the gathered insights to craft a captivating blog - article showcasing the key AI innovations. - Ensure the content is engaging yet straightforward, appealing to a tech-aware readership. - Keep the tone appealing and use simple language to make it less technical.""", - "{{parent_output}}", - ), - driver=LocalStructureRunDriver(structure_factory_fn=build_writer), - ), - ], -) - -team.run() +--8<-- "docs/griptape-framework/structures/src/tasks_16.py" ``` ## Text to Speech Task @@ -843,27 +337,7 @@ team.run() This Task enables Structures to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). ```python -import os - -from griptape.drivers import ElevenLabsTextToSpeechDriver -from griptape.engines import TextToSpeechEngine -from griptape.tasks import TextToSpeechTask -from griptape.structures import Pipeline - - -driver = ElevenLabsTextToSpeechDriver( - api_key=os.getenv("ELEVEN_LABS_API_KEY"), - model="eleven_multilingual_v2", - voice="Matilda", -) - -task = TextToSpeechTask( - text_to_speech_engine=TextToSpeechEngine( - text_to_speech_driver=driver, - ), -) - -Pipeline(tasks=[task]).run("Generate audio from this text: 'Hello, world!'") +--8<-- "docs/griptape-framework/structures/src/tasks_17.py" ``` ## Audio Transcription Task @@ -871,23 +345,5 @@ Pipeline(tasks=[task]).run("Generate audio from this text: 'Hello, world!'") This Task enables Structures to transcribe speech from text using [Audio Transcription Engines](../../reference/griptape/engines/audio/audio_transcription_engine.md) and [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md). ```python -from griptape.drivers import OpenAiAudioTranscriptionDriver -from griptape.engines import AudioTranscriptionEngine -from griptape.loaders import AudioLoader -from griptape.tasks import AudioTranscriptionTask -from griptape.structures import Pipeline -from griptape.utils import load_file - -driver = OpenAiAudioTranscriptionDriver( - model="whisper-1" -) - -task = AudioTranscriptionTask( - input=lambda _: AudioLoader().load(load_file("tests/resources/sentences2.wav")), - audio_transcription_engine=AudioTranscriptionEngine( - audio_transcription_driver=driver, - ), -) - -Pipeline(tasks=[task]).run() +--8<-- "docs/griptape-framework/structures/src/tasks_18.py" ``` diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 141bb3160..5f7c271fc 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -22,43 +22,7 @@ Workflows have access to the following [context](../../reference/griptape/struct Let's build a simple workflow. Let's say, we want to write a story in a fantasy world with some unique characters. We could setup a workflow that generates a world based on some keywords. Then we pass the world description to any number of child tasks that create characters. Finally, the last task pulls in information from all parent tasks and writes up a short story. ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.utils import StructureVisualizer - - -world_task = PromptTask( - "Create a fictional world based on the following key words {{ keywords|join(', ') }}", - context={ - "keywords": ["fantasy", "ocean", "tidal lock"] - }, - id="world" -) - -def character_task(task_id, character_name) -> PromptTask: - return PromptTask( - "Based on the following world description create a character named {{ name }}:\n{{ parent_outputs['world'] }}", - context={ - "name": character_name - }, - id=task_id, - parent_ids=["world"] - ) - -scotty_task = character_task("scotty", "Scotty") -annie_task = character_task("annie", "Annie") - -story_task = PromptTask( - "Based on the following description of the world and characters, write a short story:\n{{ parent_outputs['world'] }}\n{{ parent_outputs['scotty'] }}\n{{ parent_outputs['annie'] }}", - id="story", - parent_ids=["world", "scotty", "annie"] -) - -workflow = Workflow(tasks=[world_task, story_task, scotty_task, annie_task, story_task]) - -print(StructureVisualizer(workflow).to_url()) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_1.py" ``` Note that we use the `StructureVisualizer` to get a visual representation of the workflow. If we visit the printed url, it should look like this: @@ -164,145 +128,43 @@ The above example showed how to create a workflow using the declarative syntax v Declaratively specify parents (same as above example): ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -workflow = Workflow( - tasks=[ - PromptTask("Name an animal", id="animal"), - PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"]), - PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", parent_ids=["adjective"]), - ], - rules=[Rule("output a single lowercase word")] -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_2.py" ``` Declaratively specify children: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -workflow = Workflow( - tasks=[ - PromptTask("Name an animal", id="animal", child_ids=["adjective"]), - PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", child_ids=["new-animal"]), - PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), - ], - rules=[Rule("output a single lowercase word")], -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_3.py" ``` Declaratively specifying a mix of parents and children: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -workflow = Workflow( - tasks=[ - PromptTask("Name an animal", id="animal"), - PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"], child_ids=["new-animal"]), - PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), - ], - rules=[Rule("output a single lowercase word")], -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_4.py" ``` Imperatively specify parents: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -animal_task = PromptTask("Name an animal", id="animal") -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") -new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") - -adjective_task.add_parent(animal_task) -new_animal_task.add_parent(adjective_task) - -workflow = Workflow( - tasks=[animal_task, adjective_task, new_animal_task], - rules=[Rule("output a single lowercase word")], -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_5.py" ``` Imperatively specify children: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -animal_task = PromptTask("Name an animal", id="animal") -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") -new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") - -animal_task.add_child(adjective_task) -adjective_task.add_child(new_animal_task) - -workflow = Workflow( - tasks=[animal_task, adjective_task, new_animal_task], - rules=[Rule("output a single lowercase word")], -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_6.py" ``` Imperatively specify a mix of parents and children: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -workflow = Workflow( - rules=[Rule("output a single lowercase word")], -) - -animal_task = PromptTask("Name an animal", id="animal", structure=workflow) -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", structure=workflow) -new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", structure=workflow) - -adjective_task.add_parent(animal_task) -adjective_task.add_child(new_animal_task) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_7.py" ``` Or even mix imperative and declarative: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -animal_task = PromptTask("Name an animal", id="animal") -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"]) - - -new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") -new_animal_task.add_parent(adjective_task) - -workflow = Workflow( - tasks=[animal_task, adjective_task, new_animal_task], - rules=[Rule("output a single lowercase word")], -) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_8.py" ``` ### Insert Parallel Tasks @@ -315,29 +177,7 @@ workflow.run() Imperatively insert parallel tasks between a parent and child: ```python -from griptape.tasks import PromptTask -from griptape.structures import Workflow -from griptape.rules import Rule - -workflow = Workflow( - rules=[Rule("output a single lowercase word")], -) - -animal_task = PromptTask("Name an animal", id="animal") -adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") -color_task = PromptTask("Describe {{ parent_outputs['animal'] }} with a color", id="color") -new_animal_task = PromptTask("Name an animal described as: \n{{ parents_output_text }}", id="new-animal") - -# The following workflow runs animal_task, then (adjective_task, and color_task) -# in parallel, then finally new_animal_task. -# -# In other words, the output of animal_task is passed to both adjective_task and color_task -# and the outputs of adjective_task and color_task are then passed to new_animal_task. -workflow.add_task(animal_task) -workflow.add_task(new_animal_task) -workflow.insert_tasks(animal_task, [adjective_task, color_task], new_animal_task) - -workflow.run() +--8<-- "docs/griptape-framework/structures/src/workflows_9.py" ``` output: diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 15be7be3c..c974b9658 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -15,21 +15,7 @@ You can switch between the two strategies by setting `use_native_tools` to `True Here is an example of a Pipeline using Tools: ```python -from griptape.tasks import ToolkitTask -from griptape.structures import Pipeline -from griptape.tools import WebScraper, FileManager, TaskMemoryClient - - -pipeline = Pipeline() - -pipeline.add_tasks( - ToolkitTask( - "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)] - ), -) - -pipeline.run() +--8<-- "docs/griptape-framework/tools/src/index_1.py" ``` ``` diff --git a/docs/griptape-framework/tools/src/__init__.py b/docs/griptape-framework/tools/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/griptape-framework/tools/src/index_1.py b/docs/griptape-framework/tools/src/index_1.py new file mode 100644 index 000000000..52d8ac8e7 --- /dev/null +++ b/docs/griptape-framework/tools/src/index_1.py @@ -0,0 +1,14 @@ +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask +from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +pipeline = Pipeline() + +pipeline.add_tasks( + ToolkitTask( + "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)], + ), +) + +pipeline.run() diff --git a/docs/griptape-tools/custom-tools/index.md b/docs/griptape-tools/custom-tools/index.md index 5b0fe7ad1..0cb248cf4 100644 --- a/docs/griptape-tools/custom-tools/index.md +++ b/docs/griptape-tools/custom-tools/index.md @@ -30,48 +30,16 @@ To add Python dependencies for your tool, add a `requirements.txt` file. The too Next, create a `tool.py` file with the following code: -```python title="PYTEST_IGNORE" -import random -from griptape.artifacts import TextArtifact -from griptape.tools import BaseTool -from griptape.utils.decorators import activity -from schema import Schema, Literal, Optional - - -class RandomNumberGenerator(BaseTool): - @activity(config={ - "description": "Can be used to generate random numbers", - "schema": Schema({ - Optional(Literal( - "decimals", - description="Number of decimals to round the random number to" - )): int - }) - }) - def generate(self, params: dict) -> TextArtifact: - return TextArtifact( - str(round(random.random(), params["values"].get("decimals"))) - ) +```python +--8<-- "docs/griptape-tools/custom-tools/src/index_1.py" ``` ## Testing Custom Tools Finally, let's test our tool: -```python title="PYTEST_IGNORE" -from griptape.structures import Agent -from rng_tool.tool import RandomNumberGenerator - -rng_tool = RandomNumberGenerator() - -agent = Agent( - tools=[rng_tool] -) - -agent.run( - "generate a random number rounded to 5 decimal places" -) - +```python +--8<-- "docs/griptape-tools/custom-tools/src/index_2.py" ``` That's it! You can start using this tool with any converter or directly via Griptape. diff --git a/docs/griptape-tools/custom-tools/src/index_1.py b/docs/griptape-tools/custom-tools/src/index_1.py new file mode 100644 index 000000000..2ffe2895c --- /dev/null +++ b/docs/griptape-tools/custom-tools/src/index_1.py @@ -0,0 +1,20 @@ +import random + +from schema import Literal, Optional, Schema + +from griptape.artifacts import TextArtifact +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + + +class RandomNumberGenerator(BaseTool): + @activity( + config={ + "description": "Can be used to generate random numbers", + "schema": Schema( + {Optional(Literal("decimals", description="Number of decimals to round the random number to")): int} + ), + } + ) + def generate(self, params: dict) -> TextArtifact: + return TextArtifact(str(round(random.random(), params["values"].get("decimals")))) diff --git a/docs/griptape-tools/custom-tools/src/index_2.py b/docs/griptape-tools/custom-tools/src/index_2.py new file mode 100644 index 000000000..727b649dd --- /dev/null +++ b/docs/griptape-tools/custom-tools/src/index_2.py @@ -0,0 +1,28 @@ +import random + +from schema import Literal, Optional, Schema + +from griptape.artifacts import TextArtifact +from griptape.structures import Agent +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + + +class RandomNumberGenerator(BaseTool): + @activity( + config={ + "description": "Can be used to generate random numbers", + "schema": Schema( + {Optional(Literal("decimals", description="Number of decimals to round the random number to")): int} + ), + } + ) + def generate(self, params: dict) -> TextArtifact: + return TextArtifact(str(round(random.random(), params["values"].get("decimals")))) + + +rng_tool = RandomNumberGenerator() + +agent = Agent(tools=[rng_tool]) + +agent.run("generate a random number rounded to 5 decimal places") diff --git a/docs/griptape-tools/index.md b/docs/griptape-tools/index.md index 869cde41e..f483d493f 100644 --- a/docs/griptape-tools/index.md +++ b/docs/griptape-tools/index.md @@ -2,36 +2,12 @@ Tools give the LLM abilities to invoke outside APIs, reference data sets, and ge Griptape tools are special Python classes that LLMs can use to accomplish specific goals. Here is an example custom tool for generating a random number: -```python title="PYTEST_IGNORE" -import random -from griptape.artifacts import TextArtifact -from griptape.tools import BaseTool -from griptape.utils.decorators import activity -from schema import Schema, Literal, Optional - - -class RandomNumberGenerator(BaseTool): - @activity(config={ - "description": "Can be used to generate random numbers", - "schema": Schema({ - Optional(Literal( - "decimals", - description="Number of decimals to round the random number to" - )): int - }) - }) - def generate(self, params: dict) -> TextArtifact: - return TextArtifact( - str(round(random.random(), params["values"].get("decimals"))) - ) +```python +--8<-- "docs/griptape-tools/src/index_1.py" ``` A tool can have many "activities" as denoted by the `@activity` decorator. Each activity has a description (used to provide context to the LLM), and the input schema that the LLM must follow in order to use the tool. Output artifacts from all tool activities (except for `InfoArtifact` and `ErrorArtifact`) go to short-term `TaskMemory`. To disable that behavior set the `off_prompt` tool parameter to `False`: -```python title="PYTEST_IGNORE" -RandomNumberGenerator() -``` - We provide a set of official Griptape Tools for accessing and processing data. You can also [build your own tools](./custom-tools/index.md). diff --git a/docs/griptape-tools/official-tools/audio-transcription-client.md b/docs/griptape-tools/official-tools/audio-transcription-client.md index 5cb458d76..271144d5b 100644 --- a/docs/griptape-tools/official-tools/audio-transcription-client.md +++ b/docs/griptape-tools/official-tools/audio-transcription-client.md @@ -3,22 +3,5 @@ This Tool enables [Agents](../../griptape-framework/structures/agents.md) to transcribe speech from text using [Audio Transcription Engines](../../reference/griptape/engines/audio/audio_transcription_engine.md) and [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md). ```python -from griptape.drivers import OpenAiAudioTranscriptionDriver -from griptape.engines import AudioTranscriptionEngine -from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient -from griptape.structures import Agent - - -driver = OpenAiAudioTranscriptionDriver( - model="whisper-1" -) - -tool = AudioTranscriptionClient( - off_prompt=False, - engine=AudioTranscriptionEngine( - audio_transcription_driver=driver, - ), -) - -Agent(tools=[tool]).run("Transcribe the following audio file: /Users/andrew/code/griptape/tests/resources/sentences2.wav") -``` \ No newline at end of file +--8<-- "docs/griptape-tools/official-tools/src/audio_transcription_client_1.py" +``` diff --git a/docs/griptape-tools/official-tools/aws-iam-client.md b/docs/griptape-tools/official-tools/aws-iam-client.md index ac831d492..22b4115a3 100644 --- a/docs/griptape-tools/official-tools/aws-iam-client.md +++ b/docs/griptape-tools/official-tools/aws-iam-client.md @@ -3,20 +3,7 @@ This tool enables LLMs to make AWS IAM API requests. ```python -import boto3 -from griptape.structures import Agent -from griptape.tools import AwsIamClient - -# Initialize the AWS IAM client -aws_iam_client = AwsIamClient(session=boto3.Session()) - -# Create an agent with the AWS IAM client tool -agent = Agent( - tools=[aws_iam_client] -) - -# Run the agent with a high-level task -agent.run("List all my IAM users") +--8<-- "docs/griptape-tools/official-tools/src/aws_iam_client_1.py" ``` ``` [09/11/23 16:45:45] INFO Task 890fcf77fb074c9490d5c91563e0c995 diff --git a/docs/griptape-tools/official-tools/aws-s3-client.md b/docs/griptape-tools/official-tools/aws-s3-client.md index d7406a987..70ca79a20 100644 --- a/docs/griptape-tools/official-tools/aws-s3-client.md +++ b/docs/griptape-tools/official-tools/aws-s3-client.md @@ -3,23 +3,7 @@ This tool enables LLMs to make AWS S3 API requests. ```python -import boto3 -from griptape.structures import Agent -from griptape.tools import AwsS3Client, TaskMemoryClient - -# Initialize the AWS S3 client -aws_s3_client = AwsS3Client( - session=boto3.Session(), - off_prompt=True -) - -# Create an agent with the AWS S3 client tool -agent = Agent( - tools=[aws_s3_client, TaskMemoryClient(off_prompt=False)] -) - -# Task to list all the AWS S3 buckets -agent.run("List all my S3 buckets.") +--8<-- "docs/griptape-tools/official-tools/src/aws_s3_client_1.py" ``` ``` [09/11/23 16:49:35] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 diff --git a/docs/griptape-tools/official-tools/calculator.md b/docs/griptape-tools/official-tools/calculator.md index 648eee7f3..55ac039db 100644 --- a/docs/griptape-tools/official-tools/calculator.md +++ b/docs/griptape-tools/official-tools/calculator.md @@ -3,16 +3,7 @@ This tool enables LLMs to make simple calculations. ```python -from griptape.structures import Agent -from griptape.tools import Calculator - -# Create an agent with the Calculator tool -agent = Agent( - tools=[Calculator()] -) - -# Run the agent with a task to perform the arithmetic calculation of \(10^5\) -agent.run("What is 10 raised to the power of 5?") +--8<-- "docs/griptape-tools/official-tools/src/calculator_1.py" ``` ``` [09/08/23 14:23:51] INFO Task bbc6002a5e5b4655bb52b6a550a1b2a5 diff --git a/docs/griptape-tools/official-tools/computer.md b/docs/griptape-tools/official-tools/computer.md index 6496e6fff..121224b20 100644 --- a/docs/griptape-tools/official-tools/computer.md +++ b/docs/griptape-tools/official-tools/computer.md @@ -4,28 +4,8 @@ This tool enables LLMs to execute Python code and run shell commands inside a Do You can specify a local working directory and environment variables during tool initialization: -```python title="PYTEST_IGNORE" -from griptape.structures import Agent -from griptape.tools import Computer - -# Initialize the Computer tool -computer = Computer() - -# Create an agent with the Computer tool -agent = Agent( - tools=[computer] -) - -# Create a file using the shell command -filename = "my_new_file.txt" -agent.run(f"Run this shell command for me: touch {filename}") - -# Add content to the file using the shell command -content = "This is the content of the file." -agent.run(f"Run this shell command for me: echo '{content}' > {filename}") - -# Output the contents of the file using the shell command -agent.run(f"Run this shell command for me: cat {filename}") +```python +--8<-- "docs/griptape-tools/official-tools/src/computer_1.py" ``` ``` [09/11/23 16:24:15] INFO Task d08009ee983c4286ba10f83bcf3080e6 diff --git a/docs/griptape-tools/official-tools/date-time.md b/docs/griptape-tools/official-tools/date-time.md index aa0c0cc55..76e453f39 100644 --- a/docs/griptape-tools/official-tools/date-time.md +++ b/docs/griptape-tools/official-tools/date-time.md @@ -3,16 +3,7 @@ This tool enables LLMs to get current date and time. ```python -from griptape.structures import Agent -from griptape.tools import DateTime - -# Create an agent with the DateTime tool -agent = Agent( - tools=[DateTime()] -) - -# Fetch the current date and time -agent.run("What is the current date and time?") +--8<-- "docs/griptape-tools/official-tools/src/date_time_1.py" ``` ``` [09/11/23 15:26:02] INFO Task d0bf49dacd8849e695494578a333f6cc @@ -31,4 +22,4 @@ agent.run("What is the current date and time?") [09/11/23 15:26:08] INFO Task d0bf49dacd8849e695494578a333f6cc Output: The current date and time is September 11, 2023, 15:26:06. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/email-client.md b/docs/griptape-tools/official-tools/email-client.md index ec8af7bb6..66decf820 100644 --- a/docs/griptape-tools/official-tools/email-client.md +++ b/docs/griptape-tools/official-tools/email-client.md @@ -3,16 +3,7 @@ The [EmailClient](../../reference/griptape/tools/email_client/tool.md) enables LLMs to send emails. ```python -import os -from griptape.tools import EmailClient - -email_client = EmailClient( - smtp_host=os.environ.get("SMTP_HOST"), - smtp_port=int(os.environ.get("SMTP_PORT", 465)), - smtp_password=os.environ.get("SMTP_PASSWORD"), - smtp_user=os.environ.get("FROM_EMAIL"), - smtp_use_ssl=bool(os.environ.get("SMTP_USE_SSL")), -) +--8<-- "docs/griptape-tools/official-tools/src/email_client_1.py" ``` For debugging purposes, you can run a local SMTP server that the LLM can send emails to: diff --git a/docs/griptape-tools/official-tools/file-manager.md b/docs/griptape-tools/official-tools/file-manager.md index 491711ba0..539c4fff4 100644 --- a/docs/griptape-tools/official-tools/file-manager.md +++ b/docs/griptape-tools/official-tools/file-manager.md @@ -3,26 +3,7 @@ This tool enables LLMs to save and load files. ```python -from griptape.structures import Agent -from griptape.tools import FileManager - -# Initialize the FileManager tool with the current directory as its base -file_manager_tool = FileManager() - -# Add the tool to the Agent -agent = Agent( - tools=[file_manager_tool] -) - -# Directly create a file named 'sample1.txt' with some content -filename = "sample1.txt" -content = "This is the content of sample1.txt" - -with open(filename, "w") as f: - f.write(content) - -# Now, read content from the file 'sample1.txt' using the agent's command -agent.run("Can you get me the sample1.txt file?") +--8<-- "docs/griptape-tools/official-tools/src/file_manager_1.py" ``` ``` [09/12/23 12:07:56] INFO Task 16a1ce1847284ae3805485bad7d99116 diff --git a/docs/griptape-tools/official-tools/google-cal-client.md b/docs/griptape-tools/official-tools/google-cal-client.md index 4069d0246..9757bdcbf 100644 --- a/docs/griptape-tools/official-tools/google-cal-client.md +++ b/docs/griptape-tools/official-tools/google-cal-client.md @@ -4,35 +4,5 @@ The GoogleCalendarClient tool allows you to interact with Google Calendar. ```python -import os -from griptape.tools import GoogleCalendarClient -from griptape.structures import Agent - -# Create the GoogleCalendarClient tool -google_calendar_tool = GoogleCalendarClient( - service_account_credentials={ - "type": os.environ["GOOGLE_ACCOUNT_TYPE"], - "project_id": os.environ["GOOGLE_PROJECT_ID"], - "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], - "private_key": os.environ["GOOGLE_PRIVATE_KEY"], - "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], - "client_id": os.environ["GOOGLE_CLIENT_ID"], - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] - }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"], - -) - -# Set up an agent using the GoogleCalendarClient tool -agent = Agent( - tools=[google_calendar_tool] -) - -# Task: Get upcoming events from a Google calendar -agent.run( - "Get me the details of the next upcoming event from my primary calendar.", -) +--8<-- "docs/griptape-tools/official-tools/src/google_cal_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/google-docs-client.md b/docs/griptape-tools/official-tools/google-docs-client.md index db2f3c75b..ff23d8e89 100644 --- a/docs/griptape-tools/official-tools/google-docs-client.md +++ b/docs/griptape-tools/official-tools/google-docs-client.md @@ -3,36 +3,7 @@ The GoogleDocsClient tool provides a way to interact with the Google Docs API. It can be used to create new documents, save content to existing documents, and more. ```python -import os -from griptape.structures import Agent -from griptape.tools import GoogleDocsClient - -# Create the GoogleDocsClient tool -google_docs_tool = GoogleDocsClient( - service_account_credentials={ - "type": os.environ["GOOGLE_ACCOUNT_TYPE"], - "project_id": os.environ["GOOGLE_PROJECT_ID"], - "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], - "private_key": os.environ["GOOGLE_PRIVATE_KEY"], - "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], - "client_id": os.environ["GOOGLE_CLIENT_ID"], - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] - }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"], -) - -# Set up an agent using the GoogleDocsClient tool -agent = Agent( - tools=[google_docs_tool] -) - -# Task: Create a new Google Doc and save content to it -agent.run( - "Create doc with name 'test_creation' in test folder with content 'Hey, Tony.", -) +--8<-- "docs/griptape-tools/official-tools/src/google_docs_client_1.py" ``` ``` [10/05/23 12:56:19] INFO ToolkitTask 90721b7478a74618a63d852d35be3b18 diff --git a/docs/griptape-tools/official-tools/google-drive-client.md b/docs/griptape-tools/official-tools/google-drive-client.md index 069b9a6f9..9ad3daccc 100644 --- a/docs/griptape-tools/official-tools/google-drive-client.md +++ b/docs/griptape-tools/official-tools/google-drive-client.md @@ -3,36 +3,7 @@ The GoogleDriveClient tool provides a way to interact with the Google Drive API. It can be used to save content on Drive, list files, and more. ```python -import os -from griptape.structures import Agent -from griptape.tools import GoogleDriveClient - -# Create the GoogleDriveClient tool -google_drive_tool = GoogleDriveClient( - service_account_credentials={ - "type": os.environ["GOOGLE_ACCOUNT_TYPE"], - "project_id": os.environ["GOOGLE_PROJECT_ID"], - "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], - "private_key": os.environ["GOOGLE_PRIVATE_KEY"], - "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], - "client_id": os.environ["GOOGLE_CLIENT_ID"], - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] - }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"], -) - -# Set up an agent using the GoogleDriveClient tool -agent = Agent( - tools=[google_drive_tool] -) - -# Task: Save content to my Google Drive (default directory is root) -agent.run( - "Save the content 'Hi this is Tony' in a filed named 'hello.txt' to my Drive.", -) +--8<-- "docs/griptape-tools/official-tools/src/google_drive_client_1.py" ``` ``` [10/05/23 10:49:14] INFO ToolkitTask 2ae3bb7e828744f3a2631c29c6fce001 diff --git a/docs/griptape-tools/official-tools/google-gmail-client.md b/docs/griptape-tools/official-tools/google-gmail-client.md index d012939a2..fe6952dc3 100644 --- a/docs/griptape-tools/official-tools/google-gmail-client.md +++ b/docs/griptape-tools/official-tools/google-gmail-client.md @@ -3,37 +3,7 @@ The GoogleGmailClient tool provides a way to interact with the Gmail API. It can be used to create draft emails, send emails, and more. ```python -from griptape.tools import GoogleGmailClient -from griptape.structures import Agent -import os - -# Create the GoogleGmailClient tool -gmail_tool = GoogleGmailClient( - service_account_credentials={ - "type": os.environ["GOOGLE_ACCOUNT_TYPE"], - "project_id": os.environ["GOOGLE_PROJECT_ID"], - "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], - "private_key": os.environ["GOOGLE_PRIVATE_KEY"], - "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], - "client_id": os.environ["GOOGLE_CLIENT_ID"], - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] - }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"], -) - -# Set up an agent using the GoogleGmailClient tool -agent = Agent( - tools=[gmail_tool] -) - -# Task: Create a draft email in GMail -agent.run( - "Create a draft email in Gmail to example@email.com with the subject 'Test Draft', the body " - "'This is a test draft email.'", -) +--8<-- "docs/griptape-tools/official-tools/src/google_gmail_client_1.py" ``` ``` [10/05/23 13:24:05] INFO ToolkitTask 1f190f823d584053bfe9942f41b6cb2d diff --git a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md index cd6e33ac9..e905b1596 100644 --- a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md +++ b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md @@ -5,21 +5,5 @@ The `GriptapeCloudKnowledgeBaseClient` is a lightweight Tool to retrieve data fr **Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/keys) for access. ```python -import os -from griptape.structures import Agent -from griptape.tools import GriptapeCloudKnowledgeBaseClient - -knowledge_base_client = GriptapeCloudKnowledgeBaseClient( - description="Contains information about the company and its operations", - api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], - knowledge_base_id=os.environ["GRIPTAPE_CLOUD_KB_ID"], -) - -agent = Agent( - tools=[ - knowledge_base_client, - ] -) - -agent.run("What is the company's corporate travel policy?") +--8<-- "docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/image-query-client.md b/docs/griptape-tools/official-tools/image-query-client.md index a1044fb91..ae02d127c 100644 --- a/docs/griptape-tools/official-tools/image-query-client.md +++ b/docs/griptape-tools/official-tools/image-query-client.md @@ -3,26 +3,5 @@ This tool allows Agents to execute natural language queries on the contents of images using multimodal models. ```python -from griptape.structures import Agent -from griptape.tools import ImageQueryClient -from griptape.drivers import OpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine - -# Create an Image Query Driver. -driver = OpenAiImageQueryDriver( - model="gpt-4o" -) - -# Create an Image Query Engine configured to use the driver. -engine = ImageQueryEngine( - image_query_driver=driver, -) - -# Create an Image Query Client configured to use the engine. -tool = ImageQueryClient( - image_query_engine=engine, -) - -# Create an agent and provide the tool to it. -Agent(tools=[tool]).run("Describe the weather in the image tests/resources/mountain.png in one word.") +--8<-- "docs/griptape-tools/official-tools/src/image_query_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/inpainting-image-generation-client.md b/docs/griptape-tools/official-tools/inpainting-image-generation-client.md index 82c99adb7..65de566ad 100644 --- a/docs/griptape-tools/official-tools/inpainting-image-generation-client.md +++ b/docs/griptape-tools/official-tools/inpainting-image-generation-client.md @@ -3,30 +3,5 @@ This tool allows LLMs to generate images using inpainting, where an input image is altered within the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. ```python -from griptape.structures import Agent -from griptape.engines import InpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tools import InpaintingImageGenerationClient - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = InpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a tool configured to use the engine. -tool = InpaintingImageGenerationClient( - engine=engine, -) - -# Create an agent and provide the tool to it. -Agent(tools=[tool]).run("Generate an image of a castle built into the side of a mountain by inpainting the " - "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png.") +--8<-- "docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/openweather-client.md b/docs/griptape-tools/official-tools/openweather-client.md index 65d0975d4..3521733c5 100644 --- a/docs/griptape-tools/official-tools/openweather-client.md +++ b/docs/griptape-tools/official-tools/openweather-client.md @@ -3,17 +3,5 @@ The [OpenWeatherClient](../../reference/griptape/tools/openweather_client/tool.md) enables LLMs to use [OpenWeatherMap](https://openweathermap.org/). ```python -import os -from griptape.structures import Agent -from griptape.tools import OpenWeatherClient - -agent = Agent( - tools=[ - OpenWeatherClient( - api_key=os.environ["OPENWEATHER_API_KEY"], - ), - ] -) - -agent.run("What's the weather currently like in San Francisco?") +--8<-- "docs/griptape-tools/official-tools/src/openweather_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/outpainting-image-generation-client.md b/docs/griptape-tools/official-tools/outpainting-image-generation-client.md index 8e8940332..e62a40a73 100644 --- a/docs/griptape-tools/official-tools/outpainting-image-generation-client.md +++ b/docs/griptape-tools/official-tools/outpainting-image-generation-client.md @@ -3,30 +3,5 @@ This tool allows LLMs to generate images using outpainting, where an input image is altered outside of the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. ```python -from griptape.structures import Agent -from griptape.engines import OutpaintingImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tools import OutpaintingImageGenerationClient - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = OutpaintingImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a tool configured to use the engine. -tool = OutpaintingImageGenerationClient( - engine=engine, -) - -# Create an agent and provide the tool to it. -Agent(tools=[tool]).run("Generate an image of a mountain shrouded by clouds by outpainting the " - "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png.") +--8<-- "docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/prompt-image-generation-client.md b/docs/griptape-tools/official-tools/prompt-image-generation-client.md index b2045bdd5..d91b154be 100644 --- a/docs/griptape-tools/official-tools/prompt-image-generation-client.md +++ b/docs/griptape-tools/official-tools/prompt-image-generation-client.md @@ -3,29 +3,5 @@ This tool allows LLMs to generate images from a text prompt. ```python -from griptape.structures import Agent -from griptape.engines import PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tools import PromptImageGenerationClient - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = PromptImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a tool configured to use the engine. -tool = PromptImageGenerationClient( - engine=engine, -) - -# Create an agent and provide the tool to it. -Agent(tools=[tool]).run("Generate an image of a mountain on a summer day.") +--8<-- "docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/rag-client.md b/docs/griptape-tools/official-tools/rag-client.md index 8b1447768..c90762946 100644 --- a/docs/griptape-tools/official-tools/rag-client.md +++ b/docs/griptape-tools/official-tools/rag-client.md @@ -3,53 +3,7 @@ The [RagClient](../../reference/griptape/tools/rag_client/tool.md) enables LLMs Here is an example of how it can be used with a local vector store driver: ```python -from griptape.artifacts import TextArtifact -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage -from griptape.structures import Agent -from griptape.tools import RagClient - - -vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - -artifact = TextArtifact( - "Griptape builds AI-powered applications that connect securely to your enterprise data and APIs." - "Griptape Agents provide incredible power and flexibility when working with large language models." -) - -vector_store_driver.upsert_text_artifact(artifact=artifact, namespace="griptape") - -rag_client = RagClient( - description="Contains information about Griptape", - off_prompt=False, - rag_engine=RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, - query_params={ - "namespace": "griptape", - "top_n": 20 - } - ) - ] - ), - response_stage=ResponseRagStage( - response_module=PromptResponseRagModule( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") - ) - ) - ) -) - -agent = Agent( - tools=[rag_client] -) - -agent.run("what is Griptape?") - +--8<-- "docs/griptape-tools/official-tools/src/rag_client_1.py" ``` ``` [07/11/24 13:30:43] INFO ToolkitTask a6d057d5c71d4e9cb6863a2adb64b76c diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-client.md index 07ddccf86..447f656d5 100644 --- a/docs/griptape-tools/official-tools/rest-api-client.md +++ b/docs/griptape-tools/official-tools/rest-api-client.md @@ -8,149 +8,5 @@ The [RestApiClient](../../reference/griptape/tools/rest_api_client/tool.md) tool The following example is built using [https://jsonplaceholder.typicode.com/guide/](https://jsonplaceholder.typicode.com/guide/). ```python -from json import dumps -from griptape.drivers import OpenAiChatPromptDriver -from griptape.memory.structure import ConversationMemory -from griptape.structures import Pipeline -from griptape.tasks import ToolkitTask -from griptape.tools import RestApiClient -from griptape.config import StructureConfig - -posts_client = RestApiClient( - base_url="https://jsonplaceholder.typicode.com", - path="posts", - description="Allows for creating, updating, deleting, patching, and getting posts.", - request_body_schema=dumps( - { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "http://example.com/example.json", - "type": "object", - "default": {}, - "title": "Root Schema", - "required": ["title", "body", "userId"], - "properties": { - "title": { - "type": "string", - "default": "", - "title": "The title Schema", - }, - "body": { - "type": "string", - "default": "", - "title": "The body Schema", - }, - "userId": { - "type": "integer", - "default": 0, - "title": "The userId Schema", - }, - }, - } - ), - request_query_params_schema=dumps( - { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "http://example.com/example.json", - "type": "object", - "default": {}, - "title": "Root Schema", - "required": ["userId"], - "properties": { - "userId": { - "type": "string", - "default": "", - "title": "The userId Schema", - }, - }, - } - ), - request_path_params_schema=dumps( - { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "http://example.com/example.json", - "type": "array", - "default": [], - "title": "Root Schema", - "items": { - "anyOf": [ - { - "type": "string", - "title": "Post id", - }, - ] - }, - } - ), - response_body_schema=dumps( - { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "http://example.com/example.json", - "type": "object", - "default": {}, - "title": "Root Schema", - "required": ["id", "title", "body", "userId"], - "properties": { - "id": { - "type": "integer", - "default": 0, - "title": "The id Schema", - }, - "title": { - "type": "string", - "default": "", - "title": "The title Schema", - }, - "body": { - "type": "string", - "default": "", - "title": "The body Schema", - }, - "userId": { - "type": "integer", - "default": 0, - "title": "The userId Schema", - }, - }, - } - ), -) - -pipeline = Pipeline( - conversation_memory=ConversationMemory(), - config = StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-4o", - temperature=0.1 - ), - ), -) - -pipeline.add_tasks( - ToolkitTask( - "Output the title of post 1.", - tools=[posts_client], - ), - ToolkitTask( - "Create a post for user 1 with title 'My First Post' and body 'Hello world!'.", - tools=[posts_client], - ), - ToolkitTask( - "Update post 1 with a new body: 'Hello universe!'.", - tools=[posts_client], - ), - ToolkitTask( - "Patch post 1 with a new title: 'My First Post, A Journey'.", - tools=[posts_client], - ), - ToolkitTask( - "Delete post 1.", - tools=[posts_client], - ), - ToolkitTask( - "Output the body of all the comments for post 1.", - tools=[posts_client], - ), -) - -pipeline.run() +--8<-- "docs/griptape-tools/official-tools/src/rest_api_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/sql-client.md b/docs/griptape-tools/official-tools/sql-client.md index 7e5bf35e6..1d0d7abb0 100644 --- a/docs/griptape-tools/official-tools/sql-client.md +++ b/docs/griptape-tools/official-tools/sql-client.md @@ -3,35 +3,7 @@ This tool enables LLMs to execute SQL statements via [SQLAlchemy](https://www.sqlalchemy.org/). Depending on your underlying SQL engine, [configure](https://docs.sqlalchemy.org/en/20/core/engines.html) your `engine_url` and give the LLM a hint about what engine you are using via `engine_name`, so that it can create engine-specific statements. ```python -import os -import boto3 -from griptape.drivers import AmazonRedshiftSqlDriver -from griptape.loaders import SqlLoader -from griptape.structures import Agent -from griptape.tools import SqlClient - - -session = boto3.Session() - -sql_loader = SqlLoader( - sql_driver=AmazonRedshiftSqlDriver( - database=os.environ["REDSHIFT_DATABASE"], - session=session, - cluster_identifier=os.environ['REDSHIFT_CLUSTER_IDENTIFIER'], - ) -) - -sql_tool = SqlClient( - sql_loader=sql_loader, - table_name="people", - table_description="contains information about tech industry professionals", - engine_name="redshift" -) - -agent = Agent( - tools=[sql_tool] -) -agent.run("SELECT * FROM people;") +--8<-- "docs/griptape-tools/official-tools/src/sql_client_1.py" ``` ``` [09/11/23 17:02:55] INFO Task d8331f8705b64b4b9d9a88137ed73f3f diff --git a/docs/griptape-tools/official-tools/src/audio_transcription_client_1.py b/docs/griptape-tools/official-tools/src/audio_transcription_client_1.py new file mode 100644 index 000000000..d2c54e0c9 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/audio_transcription_client_1.py @@ -0,0 +1,17 @@ +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.structures import Agent +from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient + +driver = OpenAiAudioTranscriptionDriver(model="whisper-1") + +tool = AudioTranscriptionClient( + off_prompt=False, + engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Agent(tools=[tool]).run( + "Transcribe the following audio file: /Users/andrew/code/griptape/tests/resources/sentences2.wav" +) diff --git a/docs/griptape-tools/official-tools/src/aws_iam_client_1.py b/docs/griptape-tools/official-tools/src/aws_iam_client_1.py new file mode 100644 index 000000000..8fda31553 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/aws_iam_client_1.py @@ -0,0 +1,13 @@ +import boto3 + +from griptape.structures import Agent +from griptape.tools import AwsIamClient + +# Initialize the AWS IAM client +aws_iam_client = AwsIamClient(session=boto3.Session()) + +# Create an agent with the AWS IAM client tool +agent = Agent(tools=[aws_iam_client]) + +# Run the agent with a high-level task +agent.run("List all my IAM users") diff --git a/docs/griptape-tools/official-tools/src/aws_s3_client_1.py b/docs/griptape-tools/official-tools/src/aws_s3_client_1.py new file mode 100644 index 000000000..e1ba42525 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/aws_s3_client_1.py @@ -0,0 +1,13 @@ +import boto3 + +from griptape.structures import Agent +from griptape.tools import AwsS3Client, TaskMemoryClient + +# Initialize the AWS S3 client +aws_s3_client = AwsS3Client(session=boto3.Session(), off_prompt=True) + +# Create an agent with the AWS S3 client tool +agent = Agent(tools=[aws_s3_client, TaskMemoryClient(off_prompt=False)]) + +# Task to list all the AWS S3 buckets +agent.run("List all my S3 buckets.") diff --git a/docs/griptape-tools/official-tools/src/calculator_1.py b/docs/griptape-tools/official-tools/src/calculator_1.py new file mode 100644 index 000000000..b28bb92b2 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/calculator_1.py @@ -0,0 +1,8 @@ +from griptape.structures import Agent +from griptape.tools import Calculator + +# Create an agent with the Calculator tool +agent = Agent(tools=[Calculator()]) + +# Run the agent with a task to perform the arithmetic calculation of \(10^5\) +agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-tools/official-tools/src/computer_1.py b/docs/griptape-tools/official-tools/src/computer_1.py new file mode 100644 index 000000000..7fa22a46b --- /dev/null +++ b/docs/griptape-tools/official-tools/src/computer_1.py @@ -0,0 +1,19 @@ +from griptape.structures import Agent +from griptape.tools import Computer + +# Initialize the Computer tool +computer = Computer() + +# Create an agent with the Computer tool +agent = Agent(tools=[computer]) + +# Create a file using the shell command +filename = "my_new_file.txt" +agent.run(f"Run this shell command for me: touch {filename}") + +# Add content to the file using the shell command +content = "This is the content of the file." +agent.run(f"Run this shell command for me: echo '{content}' > {filename}") + +# Output the contents of the file using the shell command +agent.run(f"Run this shell command for me: cat {filename}") diff --git a/docs/griptape-tools/official-tools/src/date_time_1.py b/docs/griptape-tools/official-tools/src/date_time_1.py new file mode 100644 index 000000000..735b77307 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/date_time_1.py @@ -0,0 +1,8 @@ +from griptape.structures import Agent +from griptape.tools import DateTime + +# Create an agent with the DateTime tool +agent = Agent(tools=[DateTime()]) + +# Fetch the current date and time +agent.run("What is the current date and time?") diff --git a/docs/griptape-tools/official-tools/src/email_client_1.py b/docs/griptape-tools/official-tools/src/email_client_1.py new file mode 100644 index 000000000..e93a74f34 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/email_client_1.py @@ -0,0 +1,11 @@ +import os + +from griptape.tools import EmailClient + +email_client = EmailClient( + smtp_host=os.environ.get("SMTP_HOST"), + smtp_port=int(os.environ.get("SMTP_PORT", 465)), + smtp_password=os.environ.get("SMTP_PASSWORD"), + smtp_user=os.environ.get("FROM_EMAIL"), + smtp_use_ssl=bool(os.environ.get("SMTP_USE_SSL")), +) diff --git a/docs/griptape-tools/official-tools/src/file_manager_1.py b/docs/griptape-tools/official-tools/src/file_manager_1.py new file mode 100644 index 000000000..16adf669c --- /dev/null +++ b/docs/griptape-tools/official-tools/src/file_manager_1.py @@ -0,0 +1,19 @@ +from pathlib import Path + +from griptape.structures import Agent +from griptape.tools import FileManager + +# Initialize the FileManager tool with the current directory as its base +file_manager_tool = FileManager() + +# Add the tool to the Agent +agent = Agent(tools=[file_manager_tool]) + +# Directly create a file named 'sample1.txt' with some content +filename = "sample1.txt" +content = "This is the content of sample1.txt" + +Path(filename).write_text(filename) + +# Now, read content from the file 'sample1.txt' using the agent's command +agent.run("Can you get me the sample1.txt file?") diff --git a/docs/griptape-tools/official-tools/src/google_cal_client_1.py b/docs/griptape-tools/official-tools/src/google_cal_client_1.py new file mode 100644 index 000000000..1b99d9ec4 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/google_cal_client_1.py @@ -0,0 +1,29 @@ +import os + +from griptape.structures import Agent +from griptape.tools import GoogleCalendarClient + +# Create the GoogleCalendarClient tool +google_calendar_tool = GoogleCalendarClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"], + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], +) + +# Set up an agent using the GoogleCalendarClient tool +agent = Agent(tools=[google_calendar_tool]) + +# Task: Get upcoming events from a Google calendar +agent.run( + "Get me the details of the next upcoming event from my primary calendar.", +) diff --git a/docs/griptape-tools/official-tools/src/google_docs_client_1.py b/docs/griptape-tools/official-tools/src/google_docs_client_1.py new file mode 100644 index 000000000..473bfbfd8 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/google_docs_client_1.py @@ -0,0 +1,29 @@ +import os + +from griptape.structures import Agent +from griptape.tools import GoogleDocsClient + +# Create the GoogleDocsClient tool +google_docs_tool = GoogleDocsClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"], + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], +) + +# Set up an agent using the GoogleDocsClient tool +agent = Agent(tools=[google_docs_tool]) + +# Task: Create a new Google Doc and save content to it +agent.run( + "Create doc with name 'test_creation' in test folder with content 'Hey, Tony.", +) diff --git a/docs/griptape-tools/official-tools/src/google_drive_client_1.py b/docs/griptape-tools/official-tools/src/google_drive_client_1.py new file mode 100644 index 000000000..a020b1a96 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/google_drive_client_1.py @@ -0,0 +1,29 @@ +import os + +from griptape.structures import Agent +from griptape.tools import GoogleDriveClient + +# Create the GoogleDriveClient tool +google_drive_tool = GoogleDriveClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"], + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], +) + +# Set up an agent using the GoogleDriveClient tool +agent = Agent(tools=[google_drive_tool]) + +# Task: Save content to my Google Drive (default directory is root) +agent.run( + "Save the content 'Hi this is Tony' in a filed named 'hello.txt' to my Drive.", +) diff --git a/docs/griptape-tools/official-tools/src/google_gmail_client_1.py b/docs/griptape-tools/official-tools/src/google_gmail_client_1.py new file mode 100644 index 000000000..e9a075fa8 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/google_gmail_client_1.py @@ -0,0 +1,30 @@ +import os + +from griptape.structures import Agent +from griptape.tools import GoogleGmailClient + +# Create the GoogleGmailClient tool +gmail_tool = GoogleGmailClient( + service_account_credentials={ + "type": os.environ["GOOGLE_ACCOUNT_TYPE"], + "project_id": os.environ["GOOGLE_PROJECT_ID"], + "private_key_id": os.environ["GOOGLE_PRIVATE_KEY_ID"], + "private_key": os.environ["GOOGLE_PRIVATE_KEY"], + "client_email": os.environ["GOOGLE_CLIENT_EMAIL"], + "client_id": os.environ["GOOGLE_CLIENT_ID"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"], + }, + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], +) + +# Set up an agent using the GoogleGmailClient tool +agent = Agent(tools=[gmail_tool]) + +# Task: Create a draft email in GMail +agent.run( + "Create a draft email in Gmail to example@email.com with the subject 'Test Draft', the body " + "'This is a test draft email.'", +) diff --git a/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py b/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py new file mode 100644 index 000000000..9cfd09a22 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py @@ -0,0 +1,18 @@ +import os + +from griptape.structures import Agent +from griptape.tools import GriptapeCloudKnowledgeBaseClient + +knowledge_base_client = GriptapeCloudKnowledgeBaseClient( + description="Contains information about the company and its operations", + api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], + knowledge_base_id=os.environ["GRIPTAPE_CLOUD_KB_ID"], +) + +agent = Agent( + tools=[ + knowledge_base_client, + ] +) + +agent.run("What is the company's corporate travel policy?") diff --git a/docs/griptape-tools/official-tools/src/image_query_client_1.py b/docs/griptape-tools/official-tools/src/image_query_client_1.py new file mode 100644 index 000000000..177154d2d --- /dev/null +++ b/docs/griptape-tools/official-tools/src/image_query_client_1.py @@ -0,0 +1,20 @@ +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.structures import Agent +from griptape.tools import ImageQueryClient + +# Create an Image Query Driver. +driver = OpenAiImageQueryDriver(model="gpt-4o") + +# Create an Image Query Engine configured to use the driver. +engine = ImageQueryEngine( + image_query_driver=driver, +) + +# Create an Image Query Client configured to use the engine. +tool = ImageQueryClient( + image_query_engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Describe the weather in the image tests/resources/mountain.png in one word.") diff --git a/docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py new file mode 100644 index 000000000..1042a4567 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py @@ -0,0 +1,26 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import InpaintingImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import InpaintingImageGenerationClient + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = InpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = InpaintingImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run( + "Generate an image of a castle built into the side of a mountain by inpainting the " + "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png." +) diff --git a/docs/griptape-tools/official-tools/src/openweather_client_1.py b/docs/griptape-tools/official-tools/src/openweather_client_1.py new file mode 100644 index 000000000..2156e24da --- /dev/null +++ b/docs/griptape-tools/official-tools/src/openweather_client_1.py @@ -0,0 +1,14 @@ +import os + +from griptape.structures import Agent +from griptape.tools import OpenWeatherClient + +agent = Agent( + tools=[ + OpenWeatherClient( + api_key=os.environ["OPENWEATHER_API_KEY"], + ), + ] +) + +agent.run("What's the weather currently like in San Francisco?") diff --git a/docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py new file mode 100644 index 000000000..bc7eb8585 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py @@ -0,0 +1,26 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import OutpaintingImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import OutpaintingImageGenerationClient + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = OutpaintingImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = OutpaintingImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run( + "Generate an image of a mountain shrouded by clouds by outpainting the " + "image at tests/resources/mountain.png using the mask at tests/resources/mountain-mask.png." +) diff --git a/docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py new file mode 100644 index 000000000..f75f904b6 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py @@ -0,0 +1,23 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver(), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = PromptImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run("Generate an image of a mountain on a summer day.") diff --git a/docs/griptape-tools/official-tools/src/rag_client_1.py b/docs/griptape-tools/official-tools/src/rag_client_1.py new file mode 100644 index 000000000..8751e80b1 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/rag_client_1.py @@ -0,0 +1,37 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage +from griptape.structures import Agent +from griptape.tools import RagClient + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifact = TextArtifact( + "Griptape builds AI-powered applications that connect securely to your enterprise data and APIs." + "Griptape Agents provide incredible power and flexibility when working with large language models." +) + +vector_store_driver.upsert_text_artifact(artifact=artifact, namespace="griptape") + +rag_client = RagClient( + description="Contains information about Griptape", + off_prompt=False, + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, query_params={"namespace": "griptape", "top_n": 20} + ) + ] + ), + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + ), + ), +) + +agent = Agent(tools=[rag_client]) + +agent.run("what is Griptape?") diff --git a/docs/griptape-tools/official-tools/src/rest_api_client_1.py b/docs/griptape-tools/official-tools/src/rest_api_client_1.py new file mode 100644 index 000000000..01373de00 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/rest_api_client_1.py @@ -0,0 +1,143 @@ +from json import dumps + +from griptape.config import StructureConfig +from griptape.drivers import OpenAiChatPromptDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Pipeline +from griptape.tasks import ToolkitTask +from griptape.tools import RestApiClient + +posts_client = RestApiClient( + base_url="https://jsonplaceholder.typicode.com", + path="posts", + description="Allows for creating, updating, deleting, patching, and getting posts.", + request_body_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["title", "body", "userId"], + "properties": { + "title": { + "type": "string", + "default": "", + "title": "The title Schema", + }, + "body": { + "type": "string", + "default": "", + "title": "The body Schema", + }, + "userId": { + "type": "integer", + "default": 0, + "title": "The userId Schema", + }, + }, + } + ), + request_query_params_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["userId"], + "properties": { + "userId": { + "type": "string", + "default": "", + "title": "The userId Schema", + }, + }, + } + ), + request_path_params_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "array", + "default": [], + "title": "Root Schema", + "items": { + "anyOf": [ + { + "type": "string", + "title": "Post id", + }, + ] + }, + } + ), + response_body_schema=dumps( + { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": ["id", "title", "body", "userId"], + "properties": { + "id": { + "type": "integer", + "default": 0, + "title": "The id Schema", + }, + "title": { + "type": "string", + "default": "", + "title": "The title Schema", + }, + "body": { + "type": "string", + "default": "", + "title": "The body Schema", + }, + "userId": { + "type": "integer", + "default": 0, + "title": "The userId Schema", + }, + }, + } + ), +) + +pipeline = Pipeline( + conversation_memory=ConversationMemory(), + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), + ), +) + +pipeline.add_tasks( + ToolkitTask( + "Output the title of post 1.", + tools=[posts_client], + ), + ToolkitTask( + "Create a post for user 1 with title 'My First Post' and body 'Hello world!'.", + tools=[posts_client], + ), + ToolkitTask( + "Update post 1 with a new body: 'Hello universe!'.", + tools=[posts_client], + ), + ToolkitTask( + "Patch post 1 with a new title: 'My First Post, A Journey'.", + tools=[posts_client], + ), + ToolkitTask( + "Delete post 1.", + tools=[posts_client], + ), + ToolkitTask( + "Output the body of all the comments for post 1.", + tools=[posts_client], + ), +) + +pipeline.run() diff --git a/docs/griptape-tools/official-tools/src/sql_client_1.py b/docs/griptape-tools/official-tools/src/sql_client_1.py new file mode 100644 index 000000000..3e89d6096 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/sql_client_1.py @@ -0,0 +1,28 @@ +import os + +import boto3 + +from griptape.drivers import AmazonRedshiftSqlDriver +from griptape.loaders import SqlLoader +from griptape.structures import Agent +from griptape.tools import SqlClient + +session = boto3.Session() + +sql_loader = SqlLoader( + sql_driver=AmazonRedshiftSqlDriver( + database=os.environ["REDSHIFT_DATABASE"], + session=session, + cluster_identifier=os.environ["REDSHIFT_CLUSTER_IDENTIFIER"], + ) +) + +sql_tool = SqlClient( + sql_loader=sql_loader, + table_name="people", + table_description="contains information about tech industry professionals", + engine_name="redshift", +) + +agent = Agent(tools=[sql_tool]) +agent.run("SELECT * FROM people;") diff --git a/docs/griptape-tools/official-tools/src/structure_run_client_1.py b/docs/griptape-tools/official-tools/src/structure_run_client_1.py new file mode 100644 index 000000000..10f48b80d --- /dev/null +++ b/docs/griptape-tools/official-tools/src/structure_run_client_1.py @@ -0,0 +1,24 @@ +import os + +from griptape.drivers import GriptapeCloudStructureRunDriver +from griptape.structures import Agent +from griptape.tools import StructureRunClient + +base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] +api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] + +structure_run_tool = StructureRunClient( + description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", + driver=GriptapeCloudStructureRunDriver( + base_url=base_url, + api_key=api_key, + structure_id=structure_id, + ), +) + +# Set up an agent using the StructureRunClient tool +agent = Agent(tools=[structure_run_tool]) + +# Task: Ask the Griptape Cloud Hosted Structure about modular RAG +agent.run("what is modular RAG?") diff --git a/docs/griptape-tools/official-tools/src/task_memory_client_1.py b/docs/griptape-tools/official-tools/src/task_memory_client_1.py new file mode 100644 index 000000000..e9c2562a1 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/task_memory_client_1.py @@ -0,0 +1,4 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) diff --git a/docs/griptape-tools/official-tools/src/text_to_speech_client_1.py b/docs/griptape-tools/official-tools/src/text_to_speech_client_1.py new file mode 100644 index 000000000..c6a03b80d --- /dev/null +++ b/docs/griptape-tools/official-tools/src/text_to_speech_client_1.py @@ -0,0 +1,20 @@ +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.structures import Agent +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.environ["ELEVEN_LABS_API_KEY"], + model="eleven_multilingual_v2", + voice="Matilda", +) + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") diff --git a/docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py new file mode 100644 index 000000000..6c4432d52 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py @@ -0,0 +1,27 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import VariationImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import VariationImageGenerationClient + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", + ), + model="stability.stable-diffusion-xl-v0", +) + +# Create an engine configured to use the driver. +engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a tool configured to use the engine. +tool = VariationImageGenerationClient( + engine=engine, +) + +# Create an agent and provide the tool to it. +Agent(tools=[tool]).run( + "Generate a variation of the image located at tests/resources/mountain.png " "depicting a mountain on a winter day" +) diff --git a/docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py b/docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py new file mode 100644 index 000000000..d98aec199 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py @@ -0,0 +1,42 @@ +from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver +from griptape.engines import PromptImageGenerationEngine, VariationImageGenerationEngine +from griptape.structures import Agent +from griptape.tools import PromptImageGenerationClient, VariationImageGenerationClient + +# Create a driver configured to use Stable Diffusion via Bedrock. +driver = AmazonBedrockImageGenerationDriver( + image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( + style_preset="pixel-art", + ), + model="stability.stable-diffusion-xl-v0", +) + +# Create an prompt image generation engine configured to use the driver. +prompt_engine = PromptImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a prompt image generation client configured to use the engine. +prompt_tool = PromptImageGenerationClient( + engine=prompt_engine, +) + +# Create an variation image generation engine configured to use the driver. +variation_engine = VariationImageGenerationEngine( + image_generation_driver=driver, +) + +# Create a variation image generation client configured to use the engine. +variation_tool = VariationImageGenerationClient( + engine=variation_engine, +) + +# Create an agent and provide the tools to it. +agent = Agent(tools=[prompt_tool, variation_tool]) + +# Run the agent using a prompt motivating it to generate an image, then +# create a variation of the image present in task memory. +agent.run( + "Generate an image of a mountain on a summer day. Then, generate a " + "variation of this image depicting the same mountain scene on a winter day." +) diff --git a/docs/griptape-tools/official-tools/src/vector_store_client_1.py b/docs/griptape-tools/official-tools/src/vector_store_client_1.py new file mode 100644 index 000000000..df9117960 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/vector_store_client_1.py @@ -0,0 +1,25 @@ +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, VectorStoreClient + +vector_store_driver = LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), +) + +artifacts = WebLoader().load("https://www.griptape.ai") +if isinstance(artifacts, ErrorArtifact): + raise Exception(artifacts.value) + +vector_store_driver.upsert_text_artifacts({"griptape": artifacts}) +vector_db = VectorStoreClient( + description="This DB has information about the Griptape Python framework", + vector_store_driver=vector_store_driver, + query_params={"namespace": "griptape"}, + off_prompt=True, +) + +agent = Agent(tools=[vector_db, TaskMemoryClient(off_prompt=False)]) + +agent.run("what is Griptape?") diff --git a/docs/griptape-tools/official-tools/src/web_scraper_1.py b/docs/griptape-tools/official-tools/src/web_scraper_1.py new file mode 100644 index 000000000..138e8600f --- /dev/null +++ b/docs/griptape-tools/official-tools/src/web_scraper_1.py @@ -0,0 +1,6 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryClient, WebScraper + +agent = Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) + +agent.run("Based on https://www.griptape.ai/, tell me what griptape is") diff --git a/docs/griptape-tools/official-tools/src/web_search_1.py b/docs/griptape-tools/official-tools/src/web_search_1.py new file mode 100644 index 000000000..70603a693 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/web_search_1.py @@ -0,0 +1,22 @@ +import os + +from griptape.drivers import GoogleWebSearchDriver +from griptape.structures import Agent +from griptape.tools import WebSearch + +# Initialize the WebSearch tool with necessary parameters +web_search_tool = WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + results_count=5, + language="en", + country="us", + ), +) + +# Set up an agent using the WebSearch tool +agent = Agent(tools=[web_search_tool]) + +# Task: Search the web for a specific query +agent.run("Tell me how photosynthesis works") diff --git a/docs/griptape-tools/official-tools/src/web_search_2.py b/docs/griptape-tools/official-tools/src/web_search_2.py new file mode 100644 index 000000000..b40eac094 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/web_search_2.py @@ -0,0 +1,28 @@ +import os + +import schema + +from griptape.drivers import GoogleWebSearchDriver +from griptape.structures import Agent +from griptape.tools import WebSearch + +agent = Agent( + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + extra_schema_properties={ + "search": { + schema.Literal( + "sort", + description="Date range to search within. Format: date:r:YYYYMMDD:YYYYMMDD", + ): str + } + }, + ) + ], +) + +agent.run("Search for articles about the history of the internet from 1990 to 2000") diff --git a/docs/griptape-tools/official-tools/structure-run-client.md b/docs/griptape-tools/official-tools/structure-run-client.md index 0907fa06a..139633059 100644 --- a/docs/griptape-tools/official-tools/structure-run-client.md +++ b/docs/griptape-tools/official-tools/structure-run-client.md @@ -4,30 +4,7 @@ The StructureRunClient Tool provides a way to run Structures via a Tool. It requires you to provide a [Structure Run Driver](../../griptape-framework/drivers/structure-run-drivers.md) to run the Structure in the desired environment. ```python -import os - -from griptape.drivers import GriptapeCloudStructureRunDriver -from griptape.structures import Agent -from griptape.tools import StructureRunClient - -base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] -api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] -structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] - -structure_run_tool = StructureRunClient( - description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", - driver=GriptapeCloudStructureRunDriver( - base_url=base_url, - api_key=api_key, - structure_id=structure_id, - ), -) - -# Set up an agent using the StructureRunClient tool -agent = Agent(tools=[structure_run_tool]) - -# Task: Ask the Griptape Cloud Hosted Structure about modular RAG -agent.run("what is modular RAG?") +--8<-- "docs/griptape-tools/official-tools/src/structure_run_client_1.py" ``` ``` [05/02/24 13:50:03] INFO ToolkitTask 4e9458375bda4fbcadb77a94624ed64c diff --git a/docs/griptape-tools/official-tools/task-memory-client.md b/docs/griptape-tools/official-tools/task-memory-client.md index f91bee39a..fa88c85b9 100644 --- a/docs/griptape-tools/official-tools/task-memory-client.md +++ b/docs/griptape-tools/official-tools/task-memory-client.md @@ -3,9 +3,5 @@ This tool enables LLMs to query and summarize task outputs that are stored in short-term tool memory. This tool uniquely requires the user to set the `off_prompt` property explicitly for usability reasons (Griptape doesn't provide the default `True` value). ```python -from griptape.structures import Agent -from griptape.tools import WebScraper, TaskMemoryClient - - -Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) +--8<-- "docs/griptape-tools/official-tools/src/task_memory_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/text-to-speech-client.md b/docs/griptape-tools/official-tools/text-to-speech-client.md index 622b5bf3a..d7fa043a7 100644 --- a/docs/griptape-tools/official-tools/text-to-speech-client.md +++ b/docs/griptape-tools/official-tools/text-to-speech-client.md @@ -3,25 +3,5 @@ This Tool enables LLMs to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). ```python -import os - -from griptape.drivers import ElevenLabsTextToSpeechDriver -from griptape.engines import TextToSpeechEngine -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient -from griptape.structures import Agent - - -driver = ElevenLabsTextToSpeechDriver( - api_key=os.getenv("ELEVEN_LABS_API_KEY"), - model="eleven_multilingual_v2", - voice="Matilda", -) - -tool = TextToSpeechClient( - engine=TextToSpeechEngine( - text_to_speech_driver=driver, - ), -) - -Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") -``` \ No newline at end of file +--8<-- "docs/griptape-tools/official-tools/src/text_to_speech_client_1.py" +``` diff --git a/docs/griptape-tools/official-tools/variation-image-generation-client.md b/docs/griptape-tools/official-tools/variation-image-generation-client.md index a9f703b57..4b5880ef8 100644 --- a/docs/griptape-tools/official-tools/variation-image-generation-client.md +++ b/docs/griptape-tools/official-tools/variation-image-generation-client.md @@ -5,79 +5,11 @@ This Tool allows LLMs to generate variations of an input image from a text promp ## Referencing an Image by File Path ```python -from griptape.structures import Agent -from griptape.engines import VariationImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tools import VariationImageGenerationClient - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( - style_preset="pixel-art", - ), - model="stability.stable-diffusion-xl-v0", -) - -# Create an engine configured to use the driver. -engine = VariationImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a tool configured to use the engine. -tool = VariationImageGenerationClient( - engine=engine, -) - -# Create an agent and provide the tool to it. -Agent(tools=[tool]).run("Generate a variation of the image located at tests/resources/mountain.png " - "depicting a mountain on a winter day") +--8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py" ``` ## Referencing an Image in Task Memory ```python -from griptape.structures import Agent -from griptape.engines import VariationImageGenerationEngine, PromptImageGenerationEngine -from griptape.drivers import AmazonBedrockImageGenerationDriver, \ - BedrockStableDiffusionImageGenerationModelDriver -from griptape.tools import VariationImageGenerationClient, PromptImageGenerationClient - - -# Create a driver configured to use Stable Diffusion via Bedrock. -driver = AmazonBedrockImageGenerationDriver( - image_generation_model_driver=BedrockStableDiffusionImageGenerationModelDriver( - style_preset="pixel-art", - ), - model="stability.stable-diffusion-xl-v0", -) - -# Create an prompt image generation engine configured to use the driver. -prompt_engine = PromptImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a prompt image generation client configured to use the engine. -prompt_tool = PromptImageGenerationClient( - engine=prompt_engine, -) - -# Create an variation image generation engine configured to use the driver. -variation_engine = VariationImageGenerationEngine( - image_generation_driver=driver, -) - -# Create a variation image generation client configured to use the engine. -variation_tool = VariationImageGenerationClient( - engine=variation_engine, -) - -# Create an agent and provide the tools to it. -agent = Agent(tools=[prompt_tool, variation_tool]) - -# Run the agent using a prompt motivating it to generate an image, then -# create a variation of the image present in task memory. -agent.run("Generate an image of a mountain on a summer day. Then, generate a " - "variation of this image depicting the same mountain scene on a winter day.") +--8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py" ``` diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md index f3cab2065..8fd280ec9 100644 --- a/docs/griptape-tools/official-tools/vector-store-client.md +++ b/docs/griptape-tools/official-tools/vector-store-client.md @@ -3,33 +3,5 @@ The [VectorStoreClient](../../reference/griptape/tools/vector_store_client/tool. Here is an example of how it can be used with a local vector store driver: ```python -from griptape.structures import Agent -from griptape.tools import VectorStoreClient, TaskMemoryClient -from griptape.loaders import WebLoader -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver - -vector_store_driver = LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver(), -) - -vector_store_driver.upsert_text_artifacts( - { - "griptape": WebLoader().load("https://www.griptape.ai") - } -) - -vector_db = VectorStoreClient( - description="This DB has information about the Griptape Python framework", - vector_store_driver=vector_store_driver, - query_params={"namespace": "griptape"}, - off_prompt=True -) - -agent = Agent( - tools=[vector_db, TaskMemoryClient(off_prompt=False)] -) - -agent.run( - "what is Griptape?" -) +--8<-- "docs/griptape-tools/official-tools/src/vector_store_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/web-scraper.md b/docs/griptape-tools/official-tools/web-scraper.md index dcd767b35..5d8e1fe27 100644 --- a/docs/griptape-tools/official-tools/web-scraper.md +++ b/docs/griptape-tools/official-tools/web-scraper.md @@ -3,16 +3,7 @@ This tool enables LLMs to scrape web pages for full text, summaries, authors, titles, and keywords. It can also execute search queries to answer specific questions about the page. This tool uses OpenAI APIs for some of its activities, so in order to use it provide a valid API key in `openai_api_key`. ```python -from griptape.structures import Agent -from griptape.tools import WebScraper, TaskMemoryClient - -agent = Agent( - tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)] -) - -agent.run( - "Based on https://www.griptape.ai/, tell me what griptape is" -) +--8<-- "docs/griptape-tools/official-tools/src/web_scraper_1.py" ``` ``` [09/11/23 15:27:39] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search.md index 2e7299dd5..3d0495229 100644 --- a/docs/griptape-tools/official-tools/web-search.md +++ b/docs/griptape-tools/official-tools/web-search.md @@ -3,29 +3,7 @@ This tool enables LLMs to search the web. ```python -import os -from griptape.tools import WebSearch -from griptape.structures import Agent -from griptape.drivers import GoogleWebSearchDriver - -# Initialize the WebSearch tool with necessary parameters -web_search_tool = WebSearch( - web_search_driver=GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], - results_count=5, - language="en", - country="us", - ), -) - -# Set up an agent using the WebSearch tool -agent = Agent( - tools=[web_search_tool] -) - -# Task: Search the web for a specific query -agent.run("Tell me how photosynthesis works") +--8<-- "docs/griptape-tools/official-tools/src/web_search_1.py" ``` ``` [09/08/23 15:37:25] INFO Task 2cf557f7f7cd4a20a7fa2f0c46af2f71 @@ -115,31 +93,5 @@ Extra schema properties can be added to the Tool to allow for more customization In this example, we add a `sort` property to the `search` Activity which will be added as a [Google custom search query parameter](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list). ```python -import os -import schema -from griptape.structures import Agent -from griptape.drivers import GoogleWebSearchDriver -from griptape.tools import WebSearch - - -agent = Agent( - tools=[ - WebSearch( - web_search_driver=GoogleWebSearchDriver( - api_key=os.environ["GOOGLE_API_KEY"], - search_id=os.environ["GOOGLE_API_SEARCH_ID"], - ), - extra_schema_properties={ - "search": { - schema.Literal( - "sort", - description="Date range to search within. Format: date:r:YYYYMMDD:YYYYMMDD", - ): str - } - }, - ) - ], -) - -agent.run("Search for articles about the history of the internet from 1990 to 2000") +--8<-- "docs/griptape-tools/official-tools/src/web_search_2.py" ``` diff --git a/docs/griptape-tools/src/index_1.py b/docs/griptape-tools/src/index_1.py new file mode 100644 index 000000000..7929574d4 --- /dev/null +++ b/docs/griptape-tools/src/index_1.py @@ -0,0 +1,23 @@ +import random + +from schema import Literal, Optional, Schema + +from griptape.artifacts import TextArtifact +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + + +class RandomNumberGenerator(BaseTool): + @activity( + config={ + "description": "Can be used to generate random numbers", + "schema": Schema( + {Optional(Literal("decimals", description="Number of decimals to round the random number to")): int} + ), + } + ) + def generate(self, params: dict) -> TextArtifact: + return TextArtifact(str(round(random.random(), params["values"].get("decimals")))) + + +RandomNumberGenerator() diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index 436fc093f..d9c7cd4aa 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -24,7 +24,7 @@ def extract( text: str | ListArtifact, *, rulesets: Optional[list[Ruleset]] = None, - template_schema: Optional[list[dict]] = None, + template_schema: Optional[dict | list[dict]] = None, **kwargs, ) -> ListArtifact | ErrorArtifact: if template_schema is None: diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 2096c60e4..07872d2dd 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -35,7 +35,7 @@ class InpaintingImageGenerationTask(BaseImageGenerationTask): ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact - ) = field(default=None) + ) = field(default=None, alias="input") @property def input(self) -> ListArtifact: diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index a23fafd0f..3fc85a084 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -35,7 +35,7 @@ class OutpaintingImageGenerationTask(BaseImageGenerationTask): ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact - ) = field(default=None) + ) = field(default=None, alias="input") @property def input(self) -> ListArtifact: diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 66cffab3e..0e06448bc 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -29,7 +29,9 @@ class PromptImageGenerationTask(BaseImageGenerationTask): DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" - _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field(default=DEFAULT_INPUT_TEMPLATE) + _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field( + default=DEFAULT_INPUT_TEMPLATE, alias="input" + ) _image_generation_engine: PromptImageGenerationEngine = field( default=None, kw_only=True, diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index df4579efa..c162a7192 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -34,7 +34,7 @@ class VariationImageGenerationTask(BaseImageGenerationTask): alias="image_generation_engine", ) _input: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact = field( - default=None, + default=None, alias="input" ) @property diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index 97318c426..dcc7ae717 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -1,31 +1,46 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Attribute, define, field if TYPE_CHECKING: - from griptape.memory.structure import ConversationMemory + from griptape.memory.structure import BaseConversationMemory @define(frozen=True) class Conversation: - memory: ConversationMemory = field() + memory: Optional[BaseConversationMemory] = field() + + @memory.validator # pyright: ignore[reportAttributeAccessIssue] + def validate_memory(self, attribute: Attribute, value: Optional[BaseConversationMemory]) -> None: + if value is None: + raise ValueError("Conversation memory must not be None.") def lines(self) -> list[str]: + from griptape.memory.structure import SummaryConversationMemory + lines = [] for run in self.memory.runs: lines.extend((f"Q: {run.input}", f"A: {run.output}")) + if isinstance(self.memory, SummaryConversationMemory): + lines.append(f"Summary: {self.memory.summary}") + return lines def prompt_stack(self) -> list[str]: + from griptape.memory.structure import SummaryConversationMemory + lines = [] for stack in self.memory.to_prompt_stack().messages: lines.append(f"{stack.role}: {stack.to_text()}") + if isinstance(self.memory, SummaryConversationMemory): + lines.append(f"Summary: {self.memory.summary}") + return lines def __str__(self) -> str: diff --git a/griptape/utils/token_counter.py b/griptape/utils/token_counter.py index 2732d95f1..64c1be492 100644 --- a/griptape/utils/token_counter.py +++ b/griptape/utils/token_counter.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from attrs import define, field @@ -5,7 +7,7 @@ class TokenCounter: tokens: int = field(default=0, kw_only=True) - def add_tokens(self, new_tokens: int) -> int: - self.tokens += new_tokens + def add_tokens(self, new_tokens: int | float) -> int: + self.tokens += int(new_tokens) return self.tokens diff --git a/pyproject.toml b/pyproject.toml index 74c16fdc4..09947f467 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -311,6 +311,9 @@ convention = "google" "ANN201", # missing-return-type-undocumented-public-function "ANN202", # missing-return-type-private-function ] +"docs/*" = [ + "T20" # flake8-print +] [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." diff --git a/tests/integration/test_code_blocks.py b/tests/integration/test_code_blocks.py index 2da683a2a..2e9aac01f 100644 --- a/tests/integration/test_code_blocks.py +++ b/tests/integration/test_code_blocks.py @@ -1,22 +1,47 @@ -import io import os +import subprocess import pytest -from tests.utils.code_blocks import check_py_string, get_all_code_blocks +SKIP_FILES = [ + "docs/griptape-tools/official-tools/src/computer_1.py", + "docs/examples/src/load_query_and_chat_marqo_1.py", + "docs/griptape-framework/drivers/src/embedding_drivers_2.py", + "docs/griptape-framework/drivers/src/embedding_drivers_6.py", + "docs/griptape-framework/drivers/src/embedding_drivers_7.py", + "docs/griptape-framework/drivers/src/image_generation_drivers_7.py", + "docs/griptape-framework/drivers/src/image_generation_drivers_8.py", + "docs/griptape-framework/drivers/src/image_generation_drivers_9.py", + "docs/griptape-framework/drivers/src/prompt_drivers_4.py", + "docs/griptape-framework/drivers/src/prompt_drivers_12.py", + "docs/griptape-framework/drivers/src/prompt_drivers_14.py", + "docs/griptape-framework/drivers/src/observability_drivers_1.py", + "docs/griptape-framework/drivers/src/observability_drivers_2.py", + "docs/griptape-framework/structures/src/observability_1.py", + "docs/griptape-framework/structures/src/observability_2.py", +] -if "DOCS_ALL_CHANGED_FILES" in os.environ and os.environ["DOCS_ALL_CHANGED_FILES"] != "": - docs_all_changed_files = os.environ["DOCS_ALL_CHANGED_FILES"].split() - all_code_blocks = [get_all_code_blocks(changed_file) for changed_file in docs_all_changed_files] - all_code_blocks = [block for sublist in all_code_blocks for block in sublist] -else: - all_code_blocks = get_all_code_blocks("docs/**/*.md") +def discover_python_files(directory): + python_files = [] + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(".py"): + path = os.path.join(root, file) + python_files.append( + pytest.param(path, marks=pytest.mark.skipif(path in SKIP_FILES, reason="Skip file")) + ) + return python_files -@pytest.mark.parametrize("block", all_code_blocks, ids=[f["id"] for f in all_code_blocks]) -def test_code_block(block, monkeypatch): - # Send some stdin for tests that use the Chat util - monkeypatch.setattr("sys.stdin", io.StringIO("Hi\nexit\n")) +@pytest.mark.parametrize("python_file", discover_python_files("docs")) +def test_python_file_execution(python_file): + """Test that the Python file executes successfully.""" + result = subprocess.run( + ["poetry", "run", "python", python_file], + capture_output=True, + text=True, + input="Hi\nexit\n", + ) - check_py_string(block["code"]) + assert result.returncode == 0, f"Execution failed for {python_file} with error: {result.stderr}" diff --git a/tests/utils/code_blocks.py b/tests/utils/code_blocks.py deleted file mode 100644 index ca5b193d1..000000000 --- a/tests/utils/code_blocks.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -import logging -import pathlib -import textwrap - -# Adapted from https://github.com/koaning/mktestdocs - - -def check_py_string(source: str) -> None: - """Exec the python source given in a new module namespace. - - Does not return anything, but exceptions raised by the source - will propagate out unmodified - """ - try: - exec(source, {"__MODULE__": "__main__"}) - except Exception: - logging.info(source) - raise - - -def check_code_block(block: str, lang: str = "python") -> str: - """Cleans the found codeblock and checks if the proglang is correct. - - Returns an empty string if the codeblock is deemed invalid. - - Args: - block: the code block to analyse - lang: if not None, the language that is assigned to the codeblock - """ - first_line = block.split("\n")[0] - if lang: - line_elements = first_line[3:].split(" ", 2) - if len(line_elements) == 1: - block_lang = line_elements[0] - title_value = None - elif len(line_elements) == 2: - block_lang, title = line_elements - title_elements = title.replace(" ", "").split("=", 2) - if len(title_elements) == 2: - _, title_value = title_elements - else: - title_value = None - else: - block_lang = None - title_value = None - - if block_lang != lang: - return "" - if title_value == '"PYTEST_IGNORE"': - return "" - return "\n".join(block.split("\n")[1:]) - - -def get_code_blocks(docstring: str, lang: str = "python") -> list[str]: - """Given a docstring, grab all the markdown codeblocks found in docstring. - - Args: - docstring: the docstring to analyse - lang: if not None, the language that is assigned to the codeblock - """ - docstring = textwrap.dedent(docstring) - in_block = False - block = "" - codeblocks = [] - for line in docstring.split("\n"): - if line.startswith("```"): - if in_block: - codeblocks.append(check_code_block(block, lang=lang)) - block = "" - in_block = not in_block - if in_block: - block += line + "\n" - return [c for c in codeblocks if c != ""] - - -def get_all_code_blocks(path: str) -> list[dict]: - return [ - {"id": f"{str(fpath)}-{block_num + 1}", "code": code_block} - for fpath in pathlib.Path().glob(path) - for block_num, code_block in enumerate(get_code_blocks(fpath.read_text())) - ] From e42cb9145b0691b4578e88a6acf33ce3c97cf612 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 9 Aug 2024 13:20:43 -0700 Subject: [PATCH 207/238] Fix docs type check in make file (#1057) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f1db966f0..73175b7c5 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ check/lint: .PHONY: check/types check/types: - @poetry run pyright griptape/ docs/**/src/** + @poetry run pyright griptape $(shell find docs -type f -path "*/src/*") .PHONY: check/spell check/spell: From f77d8e83cb7b54d3e9f7a29441b6b1155eda53f0 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Mon, 12 Aug 2024 11:44:52 -0600 Subject: [PATCH 208/238] `ResponseRagStage` and `PromptResponseRagModule` updates (#1056) Co-authored-by: Collin Dutter --- CHANGELOG.md | 4 +++ docs/examples/src/query_webpage_astra_db_1.py | 2 +- docs/examples/src/talk_to_a_pdf_1.py | 2 +- docs/examples/src/talk_to_a_webpage_1.py | 2 +- .../engines/src/rag_engines_1.py | 23 +++++++++++---- .../structures/src/task_memory_6.py | 2 +- .../structures/src/tasks_9.py | 2 +- .../official-tools/src/rag_client_1.py | 2 +- griptape/engines/rag/modules/__init__.py | 4 --- .../engines/rag/modules/base_rag_module.py | 5 +++- .../response/base_response_rag_module.py | 3 +- .../metadata_before_response_rag_module.py | 25 ---------------- .../response/prompt_response_rag_module.py | 29 +++++++++++-------- .../rulesets_before_response_rag_module.py | 22 -------------- .../text_chunks_response_rag_module.py | 8 ++--- griptape/engines/rag/rag_context.py | 6 ++-- .../engines/rag/stages/query_rag_stage.py | 2 +- .../engines/rag/stages/response_rag_stage.py | 28 +++++------------- .../engines/rag/stages/retrieval_rag_stage.py | 6 ++-- .../task/storage/text_artifact_storage.py | 10 +++---- griptape/structures/structure.py | 8 ++--- griptape/tasks/rag_task.py | 10 +++---- .../rag/modules/response/prompt/system.j2 | 8 +++-- griptape/tools/rag_client/tool.py | 11 +++---- ...est_footnote_prompt_response_rag_module.py | 2 +- ...est_metadata_before_response_rag_module.py | 21 -------------- .../test_prompt_response_rag_module.py | 11 +++++-- ...est_rulesets_before_response_rag_module.py | 10 ------- .../test_text_chunks_response_rag_module.py | 2 +- .../test_vector_store_retrieval_rag_module.py | 10 ++----- tests/unit/engines/rag/test_rag_engine.py | 8 +++-- tests/unit/structures/test_agent.py | 2 +- tests/unit/tasks/test_rag_task.py | 2 +- tests/unit/tools/test_rag_client.py | 2 +- tests/utils/defaults.py | 2 +- 35 files changed, 113 insertions(+), 183 deletions(-) delete mode 100644 griptape/engines/rag/modules/response/metadata_before_response_rag_module.py delete mode 100644 griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py delete mode 100644 tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py delete mode 100644 tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e016228c..e7c2f70be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Method `try_find_task` to `Structure`. - `TranslateQueryRagModule` `RagEngine` module for translating input queries. - Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. +- Unique name generation for all `RagEngine` modules. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. - **BREAKING**: Removed `EventPublisherMixin`. +- **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly. +- **BREAKING**: Removed before and after response modules from `ResponseRagStage`. +- **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. ## [0.29.0] - 2024-07-30 diff --git a/docs/examples/src/query_webpage_astra_db_1.py b/docs/examples/src/query_webpage_astra_db_1.py index 8b0adfb9a..b5d2b0a01 100644 --- a/docs/examples/src/query_webpage_astra_db_1.py +++ b/docs/examples/src/query_webpage_astra_db_1.py @@ -40,7 +40,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ) diff --git a/docs/examples/src/talk_to_a_pdf_1.py b/docs/examples/src/talk_to_a_pdf_1.py index ee309cba2..2ac184a22 100644 --- a/docs/examples/src/talk_to_a_pdf_1.py +++ b/docs/examples/src/talk_to_a_pdf_1.py @@ -22,7 +22,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ) vector_store_tool = RagClient( diff --git a/docs/examples/src/talk_to_a_webpage_1.py b/docs/examples/src/talk_to_a_webpage_1.py index 76638113f..d24eb9427 100644 --- a/docs/examples/src/talk_to_a_webpage_1.py +++ b/docs/examples/src/talk_to_a_webpage_1.py @@ -22,7 +22,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ) diff --git a/docs/griptape-framework/engines/src/rag_engines_1.py b/docs/griptape-framework/engines/src/rag_engines_1.py index 435a5d470..c257cd4df 100644 --- a/docs/griptape-framework/engines/src/rag_engines_1.py +++ b/docs/griptape-framework/engines/src/rag_engines_1.py @@ -4,19 +4,24 @@ from griptape.engines.rag.modules import PromptResponseRagModule, TranslateQueryRagModule, VectorStoreRetrievalRagModule from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage from griptape.loaders import WebLoader +from griptape.rules import Rule, Ruleset prompt_driver = OpenAiChatPromptDriver(model="gpt-4o", temperature=0) vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - artifacts = WebLoader(max_tokens=500).load("https://www.griptape.ai") + if isinstance(artifacts, ErrorArtifact): - raise ValueError(artifacts.value) + raise Exception(artifacts.value) -vector_store.upsert_text_artifacts({"griptape": artifacts}) +vector_store.upsert_text_artifacts( + { + "griptape": artifacts, + } +) rag_engine = RagEngine( - query_stage=QueryRagStage(query_modules=[TranslateQueryRagModule(prompt_driver=prompt_driver, language="English")]), + query_stage=QueryRagStage(query_modules=[TranslateQueryRagModule(prompt_driver=prompt_driver, language="english")]), retrieval_stage=RetrievalRagStage( max_chunks=5, retrieval_modules=[ @@ -25,7 +30,13 @@ ) ], ), - response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=prompt_driver)), + response_stage=ResponseRagStage( + response_modules=[ + PromptResponseRagModule( + prompt_driver=prompt_driver, rulesets=[Ruleset(name="persona", rules=[Rule("Talk like a pirate")])] + ) + ] + ), ) rag_context = RagContext( @@ -33,4 +44,4 @@ module_configs={"MyAwesomeRetriever": {"query_params": {"namespace": "griptape"}}}, ) -print(rag_engine.process(rag_context).output.to_text()) +print(rag_engine.process(rag_context).outputs[0].to_text()) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 70c3bde55..7bbc5614a 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -34,7 +34,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ), retrieval_rag_module_name="VectorStoreRetrievalRagModule", diff --git a/docs/griptape-framework/structures/src/tasks_9.py b/docs/griptape-framework/structures/src/tasks_9.py index 6fca66cc5..1033f1b2f 100644 --- a/docs/griptape-framework/structures/src/tasks_9.py +++ b/docs/griptape-framework/structures/src/tasks_9.py @@ -29,7 +29,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ), ) diff --git a/docs/griptape-tools/official-tools/src/rag_client_1.py b/docs/griptape-tools/official-tools/src/rag_client_1.py index 8751e80b1..01e71e253 100644 --- a/docs/griptape-tools/official-tools/src/rag_client_1.py +++ b/docs/griptape-tools/official-tools/src/rag_client_1.py @@ -27,7 +27,7 @@ ] ), response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o")) + response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ), ) diff --git a/griptape/engines/rag/modules/__init__.py b/griptape/engines/rag/modules/__init__.py index be66082f0..ace9f4a3b 100644 --- a/griptape/engines/rag/modules/__init__.py +++ b/griptape/engines/rag/modules/__init__.py @@ -10,8 +10,6 @@ from .response.base_after_response_rag_module import BaseAfterResponseRagModule from .response.base_response_rag_module import BaseResponseRagModule from .response.prompt_response_rag_module import PromptResponseRagModule -from .response.rulesets_before_response_rag_module import RulesetsBeforeResponseRagModule -from .response.metadata_before_response_rag_module import MetadataBeforeResponseRagModule from .response.text_chunks_response_rag_module import TextChunksResponseRagModule from .response.footnote_prompt_response_rag_module import FootnotePromptResponseRagModule @@ -28,8 +26,6 @@ "BaseAfterResponseRagModule", "BaseResponseRagModule", "PromptResponseRagModule", - "RulesetsBeforeResponseRagModule", - "MetadataBeforeResponseRagModule", "TextChunksResponseRagModule", "FootnotePromptResponseRagModule", ] diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 829a24565..01d6d1b1d 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -1,5 +1,6 @@ from __future__ import annotations +import uuid from abc import ABC from concurrent import futures from typing import TYPE_CHECKING, Any, Callable, Optional @@ -14,7 +15,9 @@ @define(kw_only=True) class BaseRagModule(ABC): - name: str = field(default=Factory(lambda self: self.__class__.__name__, takes_self=True), kw_only=True) + name: str = field( + default=Factory(lambda self: f"{self.__class__.__name__}-{uuid.uuid4().hex}", takes_self=True), kw_only=True + ) futures_executor_fn: Callable[[], futures.Executor] = field( default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), ) diff --git a/griptape/engines/rag/modules/response/base_response_rag_module.py b/griptape/engines/rag/modules/response/base_response_rag_module.py index 30ab82201..1bd3ddeb7 100644 --- a/griptape/engines/rag/modules/response/base_response_rag_module.py +++ b/griptape/engines/rag/modules/response/base_response_rag_module.py @@ -2,6 +2,7 @@ from attrs import define +from griptape.artifacts import BaseArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule @@ -9,4 +10,4 @@ @define(kw_only=True) class BaseResponseRagModule(BaseRagModule, ABC): @abstractmethod - def run(self, context: RagContext) -> RagContext: ... + def run(self, context: RagContext) -> BaseArtifact: ... diff --git a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py deleted file mode 100644 index d2d546213..000000000 --- a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Optional - -from attrs import define, field - -from griptape.engines.rag.modules import BaseBeforeResponseRagModule -from griptape.utils import J2 - -if TYPE_CHECKING: - from griptape.engines.rag import RagContext - - -@define(kw_only=True) -class MetadataBeforeResponseRagModule(BaseBeforeResponseRagModule): - metadata: Optional[str] = field(default=None) - - def run(self, context: RagContext) -> RagContext: - context_metadata = self.get_context_param(context, "metadata") - metadata = self.metadata if context_metadata is None else context_metadata - - if metadata is not None: - context.before_query.append(J2("engines/rag/modules/response/metadata/system.j2").render(metadata=metadata)) - - return context diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 1cdb9a6f0..99bdf5f5e 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -1,27 +1,30 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Callable +from typing import TYPE_CHECKING, Any, Callable, Optional from attrs import Factory, define, field from griptape.artifacts.text_artifact import TextArtifact from griptape.engines.rag.modules import BaseResponseRagModule +from griptape.mixins import RuleMixin from griptape.utils import J2 if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact from griptape.drivers import BasePromptDriver from griptape.engines.rag import RagContext @define(kw_only=True) -class PromptResponseRagModule(BaseResponseRagModule): - answer_token_offset: int = field(default=400) +class PromptResponseRagModule(BaseResponseRagModule, RuleMixin): prompt_driver: BasePromptDriver = field() + answer_token_offset: int = field(default=400) + metadata: Optional[str] = field(default=None) generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True), ) - def run(self, context: RagContext) -> RagContext: + def run(self, context: RagContext) -> BaseArtifact: query = context.query tokenizer = self.prompt_driver.tokenizer included_chunks = [] @@ -45,15 +48,17 @@ def run(self, context: RagContext) -> RagContext: output = self.prompt_driver.run(self.generate_prompt_stack(system_prompt, query)).to_artifact() if isinstance(output, TextArtifact): - context.output = output + return output else: raise ValueError("Prompt driver did not return a TextArtifact") - return context - def default_system_template_generator(self, context: RagContext, artifacts: list[TextArtifact]) -> str: - return J2("engines/rag/modules/response/prompt/system.j2").render( - text_chunks=[c.to_text() for c in artifacts], - before_system_prompt="\n\n".join(context.before_query), - after_system_prompt="\n\n".join(context.after_query), - ) + params: dict[str, Any] = {"text_chunks": [c.to_text() for c in artifacts]} + + if len(self.all_rulesets) > 0: + params["rulesets"] = J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets) + + if self.metadata is not None: + params["metadata"] = J2("engines/rag/modules/response/metadata/system.j2").render(metadata=self.metadata) + + return J2("engines/rag/modules/response/prompt/system.j2").render(**params) diff --git a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py deleted file mode 100644 index 81b8410ce..000000000 --- a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from attrs import define, field - -from griptape.engines.rag.modules import BaseBeforeResponseRagModule -from griptape.utils import J2 - -if TYPE_CHECKING: - from griptape.engines.rag import RagContext - from griptape.rules import Ruleset - - -@define -class RulesetsBeforeResponseRagModule(BaseBeforeResponseRagModule): - rulesets: list[Ruleset] = field(kw_only=True) - - def run(self, context: RagContext) -> RagContext: - context.before_query.append(J2("rulesets/rulesets.j2").render(rulesets=self.rulesets)) - - return context diff --git a/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py index fd57b3905..35da0592b 100644 --- a/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py +++ b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py @@ -1,13 +1,11 @@ from attrs import define -from griptape.artifacts import ListArtifact +from griptape.artifacts import BaseArtifact, ListArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseResponseRagModule @define(kw_only=True) class TextChunksResponseRagModule(BaseResponseRagModule): - def run(self, context: RagContext) -> RagContext: - context.output = ListArtifact(context.text_chunks) - - return context + def run(self, context: RagContext) -> BaseArtifact: + return ListArtifact(context.text_chunks) diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index 3146070c2..1ddfbb1b0 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define, field @@ -22,7 +22,7 @@ class RagContext(SerializableMixin): before_query: An optional list of strings to add before the query in response modules. after_query: An optional list of strings to add after the query in response modules. text_chunks: A list of text chunks to pass around from the retrieval stage to the response stage. - output: Final output from the response stage. + outputs: List of outputs from the response stage. """ query: str = field(metadata={"serializable": True}) @@ -30,7 +30,7 @@ class RagContext(SerializableMixin): before_query: list[str] = field(factory=list, metadata={"serializable": True}) after_query: list[str] = field(factory=list, metadata={"serializable": True}) text_chunks: list[TextArtifact] = field(factory=list, metadata={"serializable": True}) - output: Optional[BaseArtifact] = field(default=None, metadata={"serializable": True}) + outputs: list[BaseArtifact] = field(factory=list, metadata={"serializable": True}) def get_references(self) -> list[Reference]: return utils.references_from_artifacts(self.text_chunks) diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 97a6c2e2d..ebde3170c 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -23,7 +23,7 @@ def modules(self) -> Sequence[BaseRagModule]: return self.query_modules def run(self, context: RagContext) -> RagContext: - logging.info("QueryStage: running %s query generation modules sequentially", len(self.query_modules)) + logging.info("QueryRagStage: running %s query generation modules sequentially", len(self.query_modules)) [qm.run(context) for qm in self.query_modules] diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py index b63b5bc21..4bc0b2be5 100644 --- a/griptape/engines/rag/stages/response_rag_stage.py +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -5,13 +5,12 @@ from attrs import define, field +from griptape import utils from griptape.engines.rag.stages import BaseRagStage if TYPE_CHECKING: from griptape.engines.rag import RagContext from griptape.engines.rag.modules import ( - BaseAfterResponseRagModule, - BaseBeforeResponseRagModule, BaseRagModule, BaseResponseRagModule, ) @@ -19,35 +18,22 @@ @define(kw_only=True) class ResponseRagStage(BaseRagStage): - before_response_modules: list[BaseBeforeResponseRagModule] = field(factory=list) - response_module: BaseResponseRagModule = field() - after_response_modules: list[BaseAfterResponseRagModule] = field(factory=list) + response_modules: list[BaseResponseRagModule] = field() @property def modules(self) -> list[BaseRagModule]: ms = [] - ms.extend(self.before_response_modules) - ms.extend(self.after_response_modules) - - if self.response_module is not None: - ms.append(self.response_module) + ms.extend(self.response_modules) return ms def run(self, context: RagContext) -> RagContext: - logging.info("GenerationStage: running %s before modules sequentially", len(self.before_response_modules)) - - for generator in self.before_response_modules: - context = generator.run(context) - - logging.info("GenerationStage: running generation module") - - context = self.response_module.run(context) + logging.info("ResponseRagStage: running %s retrieval modules in parallel", len(self.response_modules)) - logging.info("GenerationStage: running %s after modules sequentially", len(self.after_response_modules)) + with self.futures_executor_fn() as executor: + results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.response_modules]) - for generator in self.after_response_modules: - context = generator.run(context) + context.outputs = results return context diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index 50b84abfc..fa618a7ff 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -33,7 +33,7 @@ def modules(self) -> list[BaseRagModule]: return ms def run(self, context: RagContext) -> RagContext: - logging.info("RetrievalStage: running %s retrieval modules in parallel", len(self.retrieval_modules)) + logging.info("RetrievalRagStage: running %s retrieval modules in parallel", len(self.retrieval_modules)) with self.futures_executor_fn() as executor: results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.retrieval_modules]) @@ -47,7 +47,7 @@ def run(self, context: RagContext) -> RagContext: chunks_after_dedup = len(results) logging.info( - "RetrievalStage: deduplicated %s " "chunks (%s - %s)", + "RetrievalRagStage: deduplicated %s " "chunks (%s - %s)", chunks_before_dedup - chunks_after_dedup, chunks_before_dedup, chunks_after_dedup, @@ -56,7 +56,7 @@ def run(self, context: RagContext) -> RagContext: context.text_chunks = [a for a in results if isinstance(a, TextArtifact)] if self.rerank_module: - logging.info("RetrievalStage: running rerank module on %s chunks", chunks_after_dedup) + logging.info("RetrievalRagStage: running rerank module on %s chunks", chunks_after_dedup) context.text_chunks = [a for a in self.rerank_module.run(context) if isinstance(a, TextArtifact)] diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 8e66c5aba..62a517bc9 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -52,7 +52,7 @@ def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifac if self.retrieval_rag_module_name is None: raise ValueError("retrieval_rag_module_name is not set") - result = self.rag_engine.process( + outputs = self.rag_engine.process( RagContext( query=query, module_configs={ @@ -64,9 +64,9 @@ def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifac }, }, ), - ).output + ).outputs - if result is None: - return InfoArtifact("Empty output") + if len(outputs) > 0: + return outputs[0] else: - return result + return InfoArtifact("Empty output") diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index d68457ebc..8f095dfeb 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -22,9 +22,7 @@ from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( - MetadataBeforeResponseRagModule, PromptResponseRagModule, - RulesetsBeforeResponseRagModule, VectorStoreRetrievalRagModule, ) from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage @@ -180,11 +178,9 @@ def default_rag_engine(self) -> RagEngine: retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)], ), response_stage=ResponseRagStage( - before_response_modules=[ - RulesetsBeforeResponseRagModule(rulesets=self.rulesets), - MetadataBeforeResponseRagModule(), + response_modules=[ + PromptResponseRagModule(prompt_driver=self.config.prompt_driver, rulesets=self.rulesets) ], - response_module=PromptResponseRagModule(prompt_driver=self.config.prompt_driver), ), ) diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py index 3f88f34d1..2f44fdfa4 100644 --- a/griptape/tasks/rag_task.py +++ b/griptape/tasks/rag_task.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.artifacts import BaseArtifact, ErrorArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact from griptape.tasks import BaseTextInputTask if TYPE_CHECKING: @@ -29,9 +29,9 @@ def rag_engine(self, value: RagEngine) -> None: self._rag_engine = value def run(self) -> BaseArtifact: - result = self.rag_engine.process_query(self.input.to_text()).output + outputs = self.rag_engine.process_query(self.input.to_text()).outputs - if result is None: - return ErrorArtifact("empty output") + if len(outputs) > 0: + return ListArtifact(outputs) else: - return result + return ErrorArtifact("empty output") diff --git a/griptape/templates/engines/rag/modules/response/prompt/system.j2 b/griptape/templates/engines/rag/modules/response/prompt/system.j2 index 1fa9d8c12..38b0297d5 100644 --- a/griptape/templates/engines/rag/modules/response/prompt/system.j2 +++ b/griptape/templates/engines/rag/modules/response/prompt/system.j2 @@ -1,6 +1,10 @@ You are an expert Q&A system. Always answer the question using the provided context information, and not prior knowledge. Always be truthful. Don't make up facts. You can answer questions by searching through text chunks. -{% if before_system_prompt %} -{{ before_system_prompt }} +{% if rulesets %} +{{ rulesets }} + +{% endif %} +{% if metadata %} +{{ metadata }} {% endif %} Use the following list of text chunks to respond. If there are no text chunks available or text chunks don't have relevant information respond with "I could not find an answer." diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index bbdef8159..613e254af 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -5,7 +5,7 @@ from attrs import define, field from schema import Literal, Schema -from griptape.artifacts import BaseArtifact, ErrorArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -35,11 +35,12 @@ def search(self, params: dict) -> BaseArtifact: query = params["values"]["query"] try: - result = self.rag_engine.process_query(query) + outputs = self.rag_engine.process_query(query).outputs - if result.output is None: - return ErrorArtifact("query output is empty") + if len(outputs) > 0: + return ListArtifact(outputs) else: - return result.output + return ErrorArtifact("query output is empty") + except Exception as e: return ErrorArtifact(f"error querying: {e}") diff --git a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py index 385cf0c04..4d0aad139 100644 --- a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py @@ -13,7 +13,7 @@ def module(self): return FootnotePromptResponseRagModule(prompt_driver=MockPromptDriver()) def test_run(self, module): - assert module.run(RagContext(query="test")).output.value == "mock output" + assert module.run(RagContext(query="test")).value == "mock output" def test_prompt(self, module): system_message = module.default_system_template_generator( diff --git a/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py deleted file mode 100644 index 9519c8017..000000000 --- a/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py +++ /dev/null @@ -1,21 +0,0 @@ -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import MetadataBeforeResponseRagModule - - -class TestMetadataBeforeResponseRagModule: - def test_run(self): - module = MetadataBeforeResponseRagModule(name="foo") - - assert ( - "foo" in module.run(RagContext(module_configs={"foo": {"metadata": "foo"}}, query="test")).before_query[0] - ) - - def test_run_with_override(self): - module = MetadataBeforeResponseRagModule(name="foo", metadata="bar") - - assert ( - "bar" - in module.run( - RagContext(module_configs={"foo": {"query_params": {"metadata": "foo"}}}, query="test") - ).before_query[0] - ) diff --git a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py index 2f8a912e2..cc8d35f0e 100644 --- a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py @@ -3,20 +3,25 @@ from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import PromptResponseRagModule +from griptape.rules import Rule, Ruleset from tests.mocks.mock_prompt_driver import MockPromptDriver class TestPromptResponseRagModule: @pytest.fixture() def module(self): - return PromptResponseRagModule(prompt_driver=MockPromptDriver()) + return PromptResponseRagModule( + prompt_driver=MockPromptDriver(), + rulesets=[Ruleset(name="test", rules=[Rule("*RULESET*")])], + metadata="*META*", + ) def test_run(self, module): - assert module.run(RagContext(query="test")).output.value == "mock output" + assert module.run(RagContext(query="test")).value == "mock output" def test_prompt(self, module): system_message = module.default_system_template_generator( - RagContext(query="test", before_query=["*RULESET*", "*META*"], after_query=[]), + RagContext(query="test"), artifacts=[TextArtifact("*TEXT SEGMENT 1*"), TextArtifact("*TEXT SEGMENT 2*")], ) diff --git a/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py deleted file mode 100644 index bc85cf266..000000000 --- a/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py +++ /dev/null @@ -1,10 +0,0 @@ -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import RulesetsBeforeResponseRagModule -from griptape.rules import Rule, Ruleset - - -class TestRulesetsBeforeResponseRagModule: - def test_run(self): - module = RulesetsBeforeResponseRagModule(rulesets=[Ruleset(name="test ruleset", rules=[Rule("test rule")])]) - - assert "test rule" in module.run(RagContext(query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py index ae4410b2c..05b8042e6 100644 --- a/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py @@ -13,4 +13,4 @@ def module(self): def test_run(self, module): text_chunks = [TextArtifact("foo"), TextArtifact("bar")] - assert module.run(RagContext(query="test", text_chunks=text_chunks)).output.value == text_chunks + assert module.run(RagContext(query="test", text_chunks=text_chunks)).value == text_chunks diff --git a/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py index 9fecc3c0e..96a91280e 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py @@ -40,22 +40,18 @@ def test_run_with_namespace(self): def test_run_with_namespace_overrides(self): vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) module = VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, query_params={"namespace": "test"} + name="TestModule", vector_store_driver=vector_store_driver, query_params={"namespace": "test"} ) vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") result1 = module.run( - RagContext( - query="test", module_configs={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "empty"}}} - ) + RagContext(query="test", module_configs={"TestModule": {"query_params": {"namespace": "empty"}}}) ) result2 = module.run( - RagContext( - query="test", module_configs={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "test"}}} - ) + RagContext(query="test", module_configs={"TestModule": {"query_params": {"namespace": "test"}}}) ) assert len(result1) == 0 diff --git a/tests/unit/engines/rag/test_rag_engine.py b/tests/unit/engines/rag/test_rag_engine.py index c3d728bb3..964a52650 100644 --- a/tests/unit/engines/rag/test_rag_engine.py +++ b/tests/unit/engines/rag/test_rag_engine.py @@ -19,7 +19,9 @@ def engine(self): ) ] ), - response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=MockPromptDriver())), + response_stage=ResponseRagStage( + response_modules=[PromptResponseRagModule(prompt_driver=MockPromptDriver())] + ), ) def test_module_name_uniqueness(self): @@ -45,7 +47,7 @@ def test_module_name_uniqueness(self): ) def test_process_query(self, engine): - assert engine.process_query("test").output.value == "mock output" + assert engine.process_query("test").outputs[0].value == "mock output" def test_process(self, engine): - assert engine.process(RagContext(query="test")).output.value == "mock output" + assert engine.process(RagContext(query="test")).outputs[0].value == "mock output" diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index a09ad0f9a..e3d9034c4 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -238,7 +238,7 @@ def test_task_memory_defaults(self): storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.rag_engine.response_stage.response_module.prompt_driver == prompt_driver + assert storage.rag_engine.response_stage.response_modules[0].prompt_driver == prompt_driver assert ( storage.rag_engine.retrieval_stage.retrieval_modules[0].vector_store_driver.embedding_driver == embedding_driver diff --git a/tests/unit/tasks/test_rag_task.py b/tests/unit/tasks/test_rag_task.py index b205d385a..dc8603a2a 100644 --- a/tests/unit/tasks/test_rag_task.py +++ b/tests/unit/tasks/test_rag_task.py @@ -15,7 +15,7 @@ def task(self): input="test", rag_engine=RagEngine( response_stage=ResponseRagStage( - response_module=PromptResponseRagModule(prompt_driver=MockPromptDriver()) + response_modules=[PromptResponseRagModule(prompt_driver=MockPromptDriver())] ) ), ) diff --git a/tests/unit/tools/test_rag_client.py b/tests/unit/tools/test_rag_client.py index 9c6497b02..60a0df722 100644 --- a/tests/unit/tools/test_rag_client.py +++ b/tests/unit/tools/test_rag_client.py @@ -10,4 +10,4 @@ def test_search(self): vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) tool = RagClient(description="Test", rag_engine=rag_engine(MockPromptDriver(), vector_store_driver)) - assert tool.search({"values": {"query": "test"}}).value == "mock output" + assert tool.search({"values": {"query": "test"}}).value[0].value == "mock output" diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index bad7f0d79..154f63ac4 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -34,5 +34,5 @@ def rag_engine(prompt_driver, vector_store_driver): retrieval_stage=RetrievalRagStage( retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=vector_store_driver)] ), - response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=prompt_driver)), + response_stage=ResponseRagStage(response_modules=[PromptResponseRagModule(prompt_driver=prompt_driver)]), ) From e60033498b1f49518c0883887a1ab0749abad239 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 13 Aug 2024 11:04:42 -0700 Subject: [PATCH 209/238] Global Config (#1045) --- CHANGELOG.md | 8 ++ .../src/multiple_agent_shared_memory_1.py | 10 +- docs/examples/src/talk_to_a_video_1.py | 7 +- .../drivers/embedding-drivers.md | 2 +- .../drivers/prompt-drivers.md | 1 - .../drivers/src/embedding_drivers_10.py | 11 +- .../drivers/src/event_listener_drivers_4.py | 4 +- .../drivers/src/prompt_drivers_1.py | 5 +- .../drivers/src/prompt_drivers_10.py | 7 +- .../drivers/src/prompt_drivers_11.py | 9 +- .../drivers/src/prompt_drivers_12.py | 9 +- .../drivers/src/prompt_drivers_13.py | 7 +- .../drivers/src/prompt_drivers_14.py | 9 +- .../drivers/src/prompt_drivers_3.py | 15 +-- .../drivers/src/prompt_drivers_4.py | 7 +- .../drivers/src/prompt_drivers_5.py | 13 +-- .../drivers/src/prompt_drivers_6.py | 9 +- .../drivers/src/prompt_drivers_7.py | 9 +- .../drivers/src/prompt_drivers_8.py | 9 +- .../drivers/src/prompt_drivers_9.py | 7 +- docs/griptape-framework/misc/src/events_3.py | 7 +- docs/griptape-framework/misc/src/events_4.py | 1 - docs/griptape-framework/structures/config.md | 29 ++--- .../structures/src/config_1.py | 6 +- .../structures/src/config_2.py | 16 +-- .../structures/src/config_3.py | 16 +-- .../structures/src/config_4.py | 6 +- .../structures/src/config_5.py | 6 +- .../structures/src/config_6.py | 6 +- .../structures/src/config_7.py | 17 +-- .../structures/src/config_8.py | 39 +++---- .../structures/src/task_memory_6.py | 10 +- .../official-tools/rest-api-client.md | 2 +- .../official-tools/src/rest_api_client_1.py | 9 +- griptape/config/__init__.py | 34 +++--- ...fig.py => amazon_bedrock_driver_config.py} | 16 +-- ...e_config.py => anthropic_driver_config.py} | 12 +- ...onfig.py => azure_openai_driver_config.py} | 18 +-- griptape/config/base_config.py | 9 +- griptape/config/base_driver_config.py | 36 ++++++ griptape/config/base_structure_config.py | 43 -------- ...ture_config.py => cohere_driver_config.py} | 12 +- griptape/config/config.py | 15 +++ .../{structure_config.py => driver_config.py} | 42 +++---- ...ture_config.py => google_driver_config.py} | 10 +- griptape/config/logging_config.py | 24 ++++ ...ture_config.py => openai_driver_config.py} | 18 +-- ...zon_dynamodb_conversation_memory_driver.py | 5 +- .../local_conversation_memory_driver.py | 8 +- .../redis_conversation_memory_driver.py | 5 +- .../audio/audio_transcription_engine.py | 7 +- .../engines/audio/text_to_speech_engine.py | 8 +- .../extraction/base_extraction_engine.py | 3 +- .../image/base_image_generation_engine.py | 8 +- .../engines/image_query/image_query_engine.py | 6 +- .../response/prompt_response_rag_module.py | 3 +- .../vector_store_retrieval_rag_module.py | 3 +- .../engines/summary/prompt_summary_engine.py | 6 +- griptape/exceptions/dummy_exception.py | 2 +- .../structure/base_conversation_memory.py | 9 +- .../structure/summary_conversation_memory.py | 19 +--- .../task/storage/text_artifact_storage.py | 5 +- griptape/structures/agent.py | 19 +++- griptape/structures/structure.py | 95 ++-------------- griptape/tasks/actions_subtask.py | 18 +-- griptape/tasks/audio_transcription_task.py | 22 +--- griptape/tasks/base_audio_generation_task.py | 8 +- griptape/tasks/base_audio_input_task.py | 8 +- griptape/tasks/base_image_generation_task.py | 7 +- griptape/tasks/base_multi_text_input_task.py | 8 +- griptape/tasks/base_task.py | 6 +- griptape/tasks/base_text_input_task.py | 8 +- griptape/tasks/csv_extraction_task.py | 17 +-- griptape/tasks/extraction_task.py | 6 +- griptape/tasks/image_query_task.py | 17 +-- .../tasks/inpainting_image_generation_task.py | 22 +--- griptape/tasks/json_extraction_task.py | 17 +-- .../outpainting_image_generation_task.py | 23 +--- .../tasks/prompt_image_generation_task.py | 22 +--- griptape/tasks/prompt_task.py | 19 ++-- griptape/tasks/rag_task.py | 23 +--- griptape/tasks/text_summary_task.py | 19 +--- griptape/tasks/text_to_speech_task.py | 19 +--- .../tasks/variation_image_generation_task.py | 22 +--- griptape/utils/chat.py | 11 +- griptape/utils/stream.py | 9 +- tests/mocks/docker/fake_api.py | 8 +- tests/mocks/mock_driver_config.py | 27 +++++ tests/mocks/mock_image_generation_driver.py | 2 + tests/mocks/mock_structure_config.py | 23 ---- ...y => test_amazon_bedrock_driver_config.py} | 49 ++++----- ...fig.py => test_anthropic_driver_config.py} | 26 ++--- ....py => test_azure_openai_driver_config.py} | 37 ++----- ...config.py => test_cohere_driver_config.py} | 24 ++-- tests/unit/config/test_driver_config.py | 39 +++++++ ...config.py => test_google_driver_config.py} | 26 ++--- ...config.py => test_openai_driver_config.py} | 26 ++--- tests/unit/config/test_structure_config.py | 62 ----------- tests/unit/conftest.py | 9 ++ .../test_base_audio_transcription_driver.py | 2 +- ...est_dynamodb_conversation_memory_driver.py | 13 +-- .../test_local_conversation_memory_driver.py | 10 +- ...est_open_telemetry_observability_driver.py | 3 +- .../drivers/prompt/test_base_prompt_driver.py | 27 +++-- .../test_local_structure_run_driver.py | 7 +- .../extraction/test_csv_extraction_engine.py | 3 +- ...est_footnote_prompt_response_rag_module.py | 3 +- tests/unit/engines/rag/test_rag_engine.py | 10 +- .../summary/test_prompt_summary_engine.py | 6 +- tests/unit/events/test_event_listener.py | 9 +- .../test_finish_actions_subtask_event.py | 3 +- tests/unit/events/test_finish_task_event.py | 3 +- .../test_start_actions_subtask_event.py | 3 +- tests/unit/events/test_start_task_event.py | 3 +- .../structure/test_conversation_memory.py | 16 ++- .../test_summary_conversation_memory.py | 11 +- tests/unit/structures/test_agent.py | 24 +--- tests/unit/structures/test_pipeline.py | 63 +++-------- tests/unit/structures/test_workflow.py | 104 ++++++------------ .../tasks/test_audio_transcription_task.py | 6 +- .../tasks/test_base_multi_text_input_task.py | 3 +- tests/unit/tasks/test_base_task.py | 5 +- tests/unit/tasks/test_base_text_input_task.py | 3 +- tests/unit/tasks/test_code_execution_task.py | 3 +- tests/unit/tasks/test_csv_extraction_task.py | 9 +- tests/unit/tasks/test_extraction_task.py | 5 +- tests/unit/tasks/test_image_query_task.py | 9 +- .../test_inpainting_image_generation_task.py | 9 +- tests/unit/tasks/test_json_extraction_task.py | 15 +-- .../test_outpainting_image_generation_task.py | 9 +- .../test_prompt_image_generation_task.py | 11 +- tests/unit/tasks/test_prompt_task.py | 13 +-- tests/unit/tasks/test_structure_run_task.py | 8 +- tests/unit/tasks/test_text_summary_task.py | 13 +-- tests/unit/tasks/test_text_to_speech_task.py | 6 +- tests/unit/tasks/test_tool_task.py | 10 +- tests/unit/tasks/test_toolkit_task.py | 16 +-- .../test_variation_image_generation_task.py | 9 +- tests/unit/tools/test_structure_run_client.py | 4 +- tests/unit/utils/test_chat.py | 3 +- tests/unit/utils/test_conversation.py | 10 +- tests/unit/utils/test_file_utils.py | 5 +- tests/unit/utils/test_stream.py | 13 ++- tests/unit/utils/test_structure_visualizer.py | 5 +- tests/utils/defaults.py | 6 +- tests/utils/structure_tester.py | 20 ++-- tests/utils/test_reference_utils.py | 3 +- 147 files changed, 834 insertions(+), 1237 deletions(-) rename griptape/config/{amazon_bedrock_structure_config.py => amazon_bedrock_driver_config.py} (84%) rename griptape/config/{anthropic_structure_config.py => anthropic_driver_config.py} (76%) rename griptape/config/{azure_openai_structure_config.py => azure_openai_driver_config.py} (88%) create mode 100644 griptape/config/base_driver_config.py delete mode 100644 griptape/config/base_structure_config.py rename griptape/config/{cohere_structure_config.py => cohere_driver_config.py} (76%) create mode 100644 griptape/config/config.py rename griptape/config/{structure_config.py => driver_config.py} (60%) rename griptape/config/{google_structure_config.py => google_driver_config.py} (75%) create mode 100644 griptape/config/logging_config.py rename griptape/config/{openai_structure_config.py => openai_driver_config.py} (76%) create mode 100644 tests/mocks/mock_driver_config.py delete mode 100644 tests/mocks/mock_structure_config.py rename tests/unit/config/{test_amazon_bedrock_structure_config.py => test_amazon_bedrock_driver_config.py} (71%) rename tests/unit/config/{test_anthropic_structure_config.py => test_anthropic_driver_config.py} (64%) rename tests/unit/config/{test_azure_openai_structure_config.py => test_azure_openai_driver_config.py} (70%) rename tests/unit/config/{test_cohere_structure_config.py => test_cohere_driver_config.py} (57%) create mode 100644 tests/unit/config/test_driver_config.py rename tests/unit/config/{test_google_structure_config.py => test_google_driver_config.py} (62%) rename tests/unit/config/{test_openai_structure_config.py => test_openai_driver_config.py} (80%) delete mode 100644 tests/unit/config/test_structure_config.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c5ad46f7..1b7b08f36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,14 +13,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Method `try_find_task` to `Structure`. - `TranslateQueryRagModule` `RagEngine` module for translating input queries. - Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. +- Global config, `griptape.config.config`, for setting global configuration defaults. - Unique name generation for all `RagEngine` modules. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. - **BREAKING**: Removed `EventPublisherMixin`. +- **BREAKING**: Removed `Pipeline.prompt_driver` and `Workflow.prompt_driver`. `Agent.prompt_driver` has not been removed. +- **BREAKING**: Removed `Pipeline.stream` and `Workflow.stream`. `Agent.stream` has not been removed. +- **BREAKING**: Removed `Structure.embedding_driver`, set this via `griptape.config.config.drivers.embedding` instead. +- **BREAKING**: Removed `Structure.custom_logger` and `Structure.logger_level`, set these via `griptape.config.config.logger` instead. +- **BREAKING**: Removed `BaseStructureConfig.merge_config`. +- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, and renamed fields accordingly. - **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly. - **BREAKING**: Removed before and after response modules from `ResponseRagStage`. - **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`. +- Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. ## [0.29.1] - 2024-08-02 diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index dd2bb3076..118684d37 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -1,6 +1,6 @@ import os -from griptape.config import AzureOpenAiStructureConfig +from griptape.config import AzureOpenAiDriverConfig, config from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver from griptape.structures import Agent from griptape.tools import TaskMemoryClient, WebScraper @@ -33,17 +33,16 @@ vector_path=MONGODB_VECTOR_PATH, ) -config = AzureOpenAiStructureConfig( +config.drivers = AzureOpenAiDriverConfig( azure_endpoint=AZURE_OPENAI_ENDPOINT_1, - vector_store_driver=mongo_driver, - embedding_driver=embedding_driver, + vector_store=mongo_driver, + embedding=embedding_driver, ) loader = Agent( tools=[ WebScraper(off_prompt=True), ], - config=config, ) asker = Agent( tools=[ @@ -51,7 +50,6 @@ ], meta_memory=loader.meta_memory, task_memory=loader.task_memory, - config=config, ) if __name__ == "__main__": diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py index d237b5191..3538c9071 100644 --- a/docs/examples/src/talk_to_a_video_1.py +++ b/docs/examples/src/talk_to_a_video_1.py @@ -3,9 +3,11 @@ import google.generativeai as genai from griptape.artifacts import GenericArtifact, TextArtifact -from griptape.config import GoogleStructureConfig +from griptape.config import GoogleDriverConfig, config from griptape.structures import Agent +config.drivers = GoogleDriverConfig() + video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") while video_file.state.name == "PROCESSING": time.sleep(2) @@ -15,11 +17,10 @@ raise ValueError(video_file.state.name) agent = Agent( - config=GoogleStructureConfig(), input=[ GenericArtifact(video_file), TextArtifact("Answer this question regarding the video: {{ args[0] }}"), - ], + ] ) agent.run("Are there any scenes that show a character with earings?") diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 4209c2821..68f40f09e 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -128,7 +128,7 @@ The [CohereEmbeddingDriver](../../reference/griptape/drivers/embedding/cohere_em ``` ### Override Default Structure Embedding Driver -Here is how you can override the Embedding Driver that is used by default in Structures. +Here is how you can override the Embedding Driver that is used by default in Structures. ```python --8<-- "docs/griptape-framework/drivers/src/embedding_drivers_10.py" diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index ab5be55f3..54230b999 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -166,7 +166,6 @@ The [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prom Amazon Sagemaker Jumpstart provides a wide range of models with varying capabilities. This Driver has been primarily _chat-optimized_ models that have a [Huggingface Chat Template](https://huggingface.co/docs/transformers/en/chat_templating) available. If your model does not fit this use-case, we suggest sub-classing [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) and overriding the `_to_model_input` and `_to_model_params` methods. - ```python --8<-- "docs/griptape-framework/drivers/src/prompt_drivers_14.py" diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index 40d08349f..3ef816b29 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -1,4 +1,4 @@ -from griptape.config import StructureConfig +from griptape.config import DriverConfig, config from griptape.drivers import ( OpenAiChatPromptDriver, VoyageAiEmbeddingDriver, @@ -6,12 +6,13 @@ from griptape.structures import Agent from griptape.tools import TaskMemoryClient, WebScraper +config.drivers = DriverConfig( + prompt=OpenAiChatPromptDriver(model="gpt-4o"), + embedding=VoyageAiEmbeddingDriver(), +) + agent = Agent( tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), - embedding_driver=VoyageAiEmbeddingDriver(), - ), ) agent.run("based on https://www.griptape.ai/, tell me what Griptape is") diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py index dfac295b7..a70e05d79 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py @@ -1,11 +1,12 @@ import os -from griptape.config import StructureConfig +from griptape.config import DriverConfig, config from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver from griptape.events import EventListener, FinishStructureRunEvent, event_bus from griptape.rules import Rule from griptape.structures import Agent +config.drivers = DriverConfig(prompt=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)) event_bus.add_event_listeners( [ EventListener( @@ -20,7 +21,6 @@ agent = Agent( rules=[Rule(value="You will be provided with a text, and your task is to extract the airport codes from it.")], - config=StructureConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)), ) agent.run("I want to fly from Orlando to Boston") diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_1.py b/docs/griptape-framework/drivers/src/prompt_drivers_1.py index 978435f2d..ab5273228 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_1.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_1.py @@ -1,12 +1,9 @@ -from griptape.config import StructureConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.rules import Rule from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), - ), + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), input="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", rules=[Rule(value="Output only the sentiment.")], ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_10.py b/docs/griptape-framework/drivers/src/prompt_drivers_10.py index 02f083570..04e2acb35 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_10.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_10.py @@ -1,13 +1,10 @@ -from griptape.config import StructureConfig from griptape.drivers import OllamaPromptDriver from griptape.structures import Agent from griptape.tools import Calculator agent = Agent( - config=StructureConfig( - prompt_driver=OllamaPromptDriver( - model="llama3.1", - ), + prompt_driver=OllamaPromptDriver( + model="llama3.1", ), tools=[Calculator()], ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_11.py b/docs/griptape-framework/drivers/src/prompt_drivers_11.py index 1c81c4785..9e838473c 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_11.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_11.py @@ -1,16 +1,13 @@ import os -from griptape.config import StructureConfig from griptape.drivers import HuggingFaceHubPromptDriver from griptape.rules import Rule, Ruleset from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="HuggingFaceH4/zephyr-7b-beta", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - ) + prompt_driver=HuggingFaceHubPromptDriver( + model="HuggingFaceH4/zephyr-7b-beta", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], ), rulesets=[ Ruleset( diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_12.py b/docs/griptape-framework/drivers/src/prompt_drivers_12.py index d6f59f96e..d555c32c9 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_12.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_12.py @@ -1,15 +1,12 @@ import os -from griptape.config import StructureConfig from griptape.drivers import HuggingFaceHubPromptDriver from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="http://127.0.0.1:8080", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - ), + prompt_driver=HuggingFaceHubPromptDriver( + model="http://127.0.0.1:8080", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], ), ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_13.py b/docs/griptape-framework/drivers/src/prompt_drivers_13.py index e4fe5208c..d3ddd9093 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_13.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_13.py @@ -1,13 +1,10 @@ -from griptape.config import StructureConfig from griptape.drivers import HuggingFacePipelinePromptDriver from griptape.rules import Rule, Ruleset from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=HuggingFacePipelinePromptDriver( - model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", - ) + prompt_driver=HuggingFacePipelinePromptDriver( + model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", ), rulesets=[ Ruleset( diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_14.py b/docs/griptape-framework/drivers/src/prompt_drivers_14.py index 85bd5216e..228a5f9b2 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_14.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_14.py @@ -1,17 +1,14 @@ import os -from griptape.config import StructureConfig from griptape.drivers import ( AmazonSageMakerJumpstartPromptDriver, ) from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=AmazonSageMakerJumpstartPromptDriver( - endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], - model="meta-llama/Meta-Llama-3-8B-Instruct", - ) + prompt_driver=AmazonSageMakerJumpstartPromptDriver( + endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], + model="meta-llama/Meta-Llama-3-8B-Instruct", ) ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_3.py b/docs/griptape-framework/drivers/src/prompt_drivers_3.py index b92596aca..8e85ce887 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_3.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_3.py @@ -1,19 +1,16 @@ import os -from griptape.config import StructureConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.rules import Rule from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - api_key=os.environ["OPENAI_API_KEY"], - temperature=0.1, - model="gpt-4o", - response_format="json_object", - seed=42, - ) + prompt_driver=OpenAiChatPromptDriver( + api_key=os.environ["OPENAI_API_KEY"], + temperature=0.1, + model="gpt-4o", + response_format="json_object", + seed=42, ), input="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", rules=[Rule(value='Write your output in json with a single key called "css_code".')], diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_4.py b/docs/griptape-framework/drivers/src/prompt_drivers_4.py index b024638b7..bcafb40de 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_4.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_4.py @@ -1,13 +1,10 @@ -from griptape.config import StructureConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.rules import Rule from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver( - base_url="http://127.0.0.1:1234/v1", model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", stream=True - ) + prompt_driver=OpenAiChatPromptDriver( + base_url="http://127.0.0.1:1234/v1", model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", stream=True ), rules=[Rule(value="You are a helpful coding assistant.")], ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_5.py b/docs/griptape-framework/drivers/src/prompt_drivers_5.py index ffe9a4e0a..76301d8d9 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_5.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_5.py @@ -1,18 +1,15 @@ import os -from griptape.config import StructureConfig from griptape.drivers import AzureOpenAiChatPromptDriver from griptape.rules import Rule from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-3.5-turbo", - azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - ) + prompt_driver=AzureOpenAiChatPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="gpt-3.5-turbo", + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ), rules=[ Rule( diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_6.py b/docs/griptape-framework/drivers/src/prompt_drivers_6.py index 2bd1b00fb..5e4d226a6 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_6.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_6.py @@ -1,15 +1,12 @@ import os -from griptape.config import StructureConfig from griptape.drivers import CoherePromptDriver from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=CoherePromptDriver( - model="command-r", - api_key=os.environ["COHERE_API_KEY"], - ) + prompt_driver=CoherePromptDriver( + model="command-r", + api_key=os.environ["COHERE_API_KEY"], ) ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_7.py b/docs/griptape-framework/drivers/src/prompt_drivers_7.py index dd1c15370..23f3d0c35 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_7.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_7.py @@ -1,15 +1,12 @@ import os -from griptape.config import StructureConfig from griptape.drivers import AnthropicPromptDriver from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-opus-20240229", - api_key=os.environ["ANTHROPIC_API_KEY"], - ) + prompt_driver=AnthropicPromptDriver( + model="claude-3-opus-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], ) ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_8.py b/docs/griptape-framework/drivers/src/prompt_drivers_8.py index 1bbf2848c..b6a1c109e 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_8.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_8.py @@ -1,15 +1,12 @@ import os -from griptape.config import StructureConfig from griptape.drivers import GooglePromptDriver from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=GooglePromptDriver( - model="gemini-pro", - api_key=os.environ["GOOGLE_API_KEY"], - ) + prompt_driver=GooglePromptDriver( + model="gemini-pro", + api_key=os.environ["GOOGLE_API_KEY"], ) ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_9.py b/docs/griptape-framework/drivers/src/prompt_drivers_9.py index cdd0db82d..992dbecd2 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_9.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_9.py @@ -1,13 +1,10 @@ -from griptape.config import StructureConfig from griptape.drivers import AmazonBedrockPromptDriver from griptape.rules import Rule from griptape.structures import Agent agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - ) + prompt_driver=AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", ), rules=[ Rule( diff --git a/docs/griptape-framework/misc/src/events_3.py b/docs/griptape-framework/misc/src/events_3.py index 31790b494..bae8b8224 100644 --- a/docs/griptape-framework/misc/src/events_3.py +++ b/docs/griptape-framework/misc/src/events_3.py @@ -1,6 +1,5 @@ from typing import cast -from griptape.config import OpenAiStructureConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.events import CompletionChunkEvent, EventListener, event_bus from griptape.structures import Pipeline @@ -16,13 +15,11 @@ ] ) -pipeline = Pipeline( - config=OpenAiStructureConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True)), -) - +pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True), tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], ) ) diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py index 3816b110e..f5523cb11 100644 --- a/docs/griptape-framework/misc/src/events_4.py +++ b/docs/griptape-framework/misc/src/events_4.py @@ -4,7 +4,6 @@ from griptape.utils import Stream pipeline = Pipeline() -pipeline.config.prompt_driver.stream = True pipeline.add_tasks( ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index e10b6cc73..89399f60c 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -5,16 +5,15 @@ search: ## Overview -The [StructureConfig](../../reference/griptape/config/structure_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. +The [DriverConfig](../../reference/griptape/config/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. ### Premade Configs -Griptape provides predefined [StructureConfig](../../reference/griptape/config/structure_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. +Griptape provides predefined [DriverConfig](../../reference/griptape/config/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. #### OpenAI -The [OpenAI Structure Config](../../reference/griptape/config/openai_structure_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. - +The [OpenAI Driver config](../../reference/griptape/config/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. ```python --8<-- "docs/griptape-framework/structures/src/config_1.py" @@ -22,22 +21,21 @@ The [OpenAI Structure Config](../../reference/griptape/config/openai_structure_c #### Azure OpenAI -The [Azure OpenAI Structure Config](../../reference/griptape/config/azure_openai_structure_config.md) provides default Drivers for Azure's OpenAI APIs. - +The [Azure OpenAI Driver config](../../reference/griptape/config/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_2.py" ``` #### Amazon Bedrock -The [Amazon Bedrock Structure Config](../../reference/griptape/config/amazon_bedrock_structure_config.md) provides default Drivers for Amazon Bedrock's APIs. +The [Amazon Bedrock Driver config](../../reference/griptape/config/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_3.py" ``` #### Google -The [Google Structure Config](../../reference/griptape/config/google_structure_config.md) provides default Drivers for Google's Gemini APIs. +The [Google Driver config](../../reference/griptape/config/google_driver_config.md) provides default Drivers for Google's Gemini APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_4.py" @@ -45,22 +43,20 @@ The [Google Structure Config](../../reference/griptape/config/google_structure_c #### Anthropic -The [Anthropic Structure Config](../../reference/griptape/config/anthropic_structure_config.md) provides default Drivers for Anthropic's APIs. +The [Anthropic Driver config](../../reference/griptape/config/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs. !!! info Anthropic does not provide an embeddings API which means you will need to use another service for embeddings. - The `AnthropicStructureConfig` defaults to using `VoyageAiEmbeddingDriver` which integrates with [VoyageAI](https://www.voyageai.com/), the service used in Anthropic's [embeddings documentation](https://docs.anthropic.com/claude/docs/embeddings). + The `AnthropicDriverConfig` defaults to using `VoyageAiEmbeddingDriver` which integrates with [VoyageAI](https://www.voyageai.com/), the service used in Anthropic's [embeddings documentation](https://docs.anthropic.com/claude/docs/embeddings). To override the default embedding driver, see: [Override Default Structure Embedding Driver](../drivers/embedding-drivers.md#override-default-structure-embedding-driver). - ```python --8<-- "docs/griptape-framework/structures/src/config_5.py" ``` #### Cohere -The [Cohere Structure Config](../../reference/griptape/config/cohere_structure_config.md) provides default Drivers for Cohere's APIs. - +The [Cohere Driver config](../../reference/griptape/config/cohere_driver_config.md) provides default Drivers for Cohere's APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_6.py" @@ -68,8 +64,8 @@ The [Cohere Structure Config](../../reference/griptape/config/cohere_structure_c ### Custom Configs -You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding relevant Drivers. -The [StructureConfig](../../reference/griptape/config/structure_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. +You can create your own [DriverConfig](../../reference/griptape/config/driver_config.md) by overriding relevant Drivers. +The [DriverConfig](../../reference/griptape/config/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. ```python @@ -78,9 +74,6 @@ This approach ensures that you are informed through clear error messages if you ### Loading/Saving Configs -Configuration classes in Griptape offer utility methods for loading, saving, and merging configurations, streamlining the management of complex setups. - ```python --8<-- "docs/griptape-framework/structures/src/config_8.py" ``` - diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py index 613852193..0c7a5ed9e 100644 --- a/docs/griptape-framework/structures/src/config_1.py +++ b/docs/griptape-framework/structures/src/config_1.py @@ -1,6 +1,6 @@ -from griptape.config import OpenAiStructureConfig +from griptape.config import OpenAiDriverConfig, config from griptape.structures import Agent -agent = Agent(config=OpenAiStructureConfig()) +config.drivers = OpenAiDriverConfig() -agent = Agent() # This is equivalent to the above +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/config_2.py index bf6b6223b..a5f8efbbe 100644 --- a/docs/griptape-framework/structures/src/config_2.py +++ b/docs/griptape-framework/structures/src/config_2.py @@ -1,16 +1,10 @@ import os -from griptape.config import AzureOpenAiStructureConfig +from griptape.config import AzureOpenAiDriverConfig, config from griptape.structures import Agent -agent = Agent( - config=AzureOpenAiStructureConfig( - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], api_key=os.environ["AZURE_OPENAI_API_KEY_3"] - ).merge_config( - { - "image_query_driver": { - "azure_deployment": "gpt-4o", - }, - } - ), +config.drivers = AzureOpenAiDriverConfig( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], api_key=os.environ["AZURE_OPENAI_API_KEY_3"] ) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/config_3.py index acb55c007..6b3f51a76 100644 --- a/docs/griptape-framework/structures/src/config_3.py +++ b/docs/griptape-framework/structures/src/config_3.py @@ -2,15 +2,15 @@ import boto3 -from griptape.config import AmazonBedrockStructureConfig +from griptape.config import AmazonBedrockDriverConfig, config from griptape.structures import Agent -agent = Agent( - config=AmazonBedrockStructureConfig( - session=boto3.Session( - region_name=os.environ["AWS_DEFAULT_REGION"], - aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], - aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], - ) +config.drivers = AmazonBedrockDriverConfig( + session=boto3.Session( + region_name=os.environ["AWS_DEFAULT_REGION"], + aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], + aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], ) ) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py index 88d388161..5362b8c6b 100644 --- a/docs/griptape-framework/structures/src/config_4.py +++ b/docs/griptape-framework/structures/src/config_4.py @@ -1,4 +1,6 @@ -from griptape.config import GoogleStructureConfig +from griptape.config import GoogleDriverConfig, config from griptape.structures import Agent -agent = Agent(config=GoogleStructureConfig()) +config.drivers = GoogleDriverConfig() + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py index f0da565a7..4f787a922 100644 --- a/docs/griptape-framework/structures/src/config_5.py +++ b/docs/griptape-framework/structures/src/config_5.py @@ -1,4 +1,6 @@ -from griptape.config import AnthropicStructureConfig +from griptape.config import AnthropicDriverConfig, config from griptape.structures import Agent -agent = Agent(config=AnthropicStructureConfig()) +config.drivers = AnthropicDriverConfig() + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py index 4e733e9d4..c26502401 100644 --- a/docs/griptape-framework/structures/src/config_6.py +++ b/docs/griptape-framework/structures/src/config_6.py @@ -1,6 +1,8 @@ import os -from griptape.config import CohereStructureConfig +from griptape.config import CohereDriverConfig, config from griptape.structures import Agent -agent = Agent(config=CohereStructureConfig(api_key=os.environ["COHERE_API_KEY"])) +config.drivers = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"]) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/config_7.py index 79a81d878..6b285f0e5 100644 --- a/docs/griptape-framework/structures/src/config_7.py +++ b/docs/griptape-framework/structures/src/config_7.py @@ -1,14 +1,15 @@ import os -from griptape.config import StructureConfig +from griptape.config import DriverConfig, config from griptape.drivers import AnthropicPromptDriver from griptape.structures import Agent -agent = Agent( - config=StructureConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-sonnet-20240229", - api_key=os.environ["ANTHROPIC_API_KEY"], - ) - ), +config.drivers = DriverConfig( + prompt=AnthropicPromptDriver( + model="claude-3-sonnet-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], + ) ) + + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py index 9bb1d01c9..4f23e3eaa 100644 --- a/docs/griptape-framework/structures/src/config_8.py +++ b/docs/griptape-framework/structures/src/config_8.py @@ -1,28 +1,17 @@ -from griptape.config import AmazonBedrockStructureConfig -from griptape.drivers import AmazonBedrockCohereEmbeddingDriver +from griptape.config import AmazonBedrockDriverConfig, config from griptape.structures import Agent -custom_config = AmazonBedrockStructureConfig() -custom_config.embedding_driver = AmazonBedrockCohereEmbeddingDriver() -custom_config.merge_config( - { - "embedding_driver": { - "base_url": None, - "model": "text-embedding-3-small", - "organization": None, - "type": "OpenAiEmbeddingDriver", - }, - } -) -serialized_config = custom_config.to_json() -deserialized_config = AmazonBedrockStructureConfig.from_json(serialized_config) +custom_config = AmazonBedrockDriverConfig() +dict_config = custom_config.to_dict() +# Use OpenAi for embeddings +dict_config["embedding"] = { + "base_url": None, + "model": "text-embedding-3-small", + "organization": None, + "type": "OpenAiEmbeddingDriver", +} +custom_config = AmazonBedrockDriverConfig.from_dict(dict_config) -agent = Agent( - config=deserialized_config.merge_config( - { - "prompt_driver": { - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - }, - } - ), -) +config.drivers = custom_config + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 7bbc5614a..fb5c3eabb 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -1,6 +1,7 @@ from griptape.artifacts import TextArtifact from griptape.config import ( - OpenAiStructureConfig, + OpenAiDriverConfig, + config, ) from griptape.drivers import ( LocalVectorStoreDriver, @@ -15,12 +16,13 @@ from griptape.structures import Agent from griptape.tools import FileManager, TaskMemoryClient, WebScraper +config.drivers = OpenAiDriverConfig( + prompt=OpenAiChatPromptDriver(model="gpt-4"), +) + vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) agent = Agent( - config=OpenAiStructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), - ), task_memory=TaskMemory( artifact_storages={ TextArtifact: TextArtifactStorage( diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-client.md index 447f656d5..8ec4804c2 100644 --- a/docs/griptape-tools/official-tools/rest-api-client.md +++ b/docs/griptape-tools/official-tools/rest-api-client.md @@ -6,7 +6,7 @@ The [RestApiClient](../../reference/griptape/tools/rest_api_client/tool.md) tool ### Example The following example is built using [https://jsonplaceholder.typicode.com/guide/](https://jsonplaceholder.typicode.com/guide/). - + ```python --8<-- "docs/griptape-tools/official-tools/src/rest_api_client_1.py" ``` diff --git a/docs/griptape-tools/official-tools/src/rest_api_client_1.py b/docs/griptape-tools/official-tools/src/rest_api_client_1.py index 01373de00..026874283 100644 --- a/docs/griptape-tools/official-tools/src/rest_api_client_1.py +++ b/docs/griptape-tools/official-tools/src/rest_api_client_1.py @@ -1,12 +1,16 @@ from json import dumps -from griptape.config import StructureConfig +from griptape.config import DriverConfig, config from griptape.drivers import OpenAiChatPromptDriver from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import ToolkitTask from griptape.tools import RestApiClient +config.drivers = DriverConfig( + prompt=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), +) + posts_client = RestApiClient( base_url="https://jsonplaceholder.typicode.com", path="posts", @@ -108,9 +112,6 @@ pipeline = Pipeline( conversation_memory=ConversationMemory(), - config=StructureConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), - ), ) pipeline.add_tasks( diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index 541eb0db0..b242d80a7 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -1,24 +1,26 @@ from .base_config import BaseConfig -from .base_structure_config import BaseStructureConfig +from .base_driver_config import BaseDriverConfig -from .structure_config import StructureConfig -from .openai_structure_config import OpenAiStructureConfig -from .azure_openai_structure_config import AzureOpenAiStructureConfig -from .amazon_bedrock_structure_config import AmazonBedrockStructureConfig -from .anthropic_structure_config import AnthropicStructureConfig -from .google_structure_config import GoogleStructureConfig -from .cohere_structure_config import CohereStructureConfig +from .driver_config import DriverConfig +from .openai_driver_config import OpenAiDriverConfig +from .azure_openai_driver_config import AzureOpenAiDriverConfig +from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig +from .anthropic_driver_config import AnthropicDriverConfig +from .google_driver_config import GoogleDriverConfig +from .cohere_driver_config import CohereDriverConfig +from .config import config __all__ = [ "BaseConfig", - "BaseStructureConfig", - "StructureConfig", - "OpenAiStructureConfig", - "AzureOpenAiStructureConfig", - "AmazonBedrockStructureConfig", - "AnthropicStructureConfig", - "GoogleStructureConfig", - "CohereStructureConfig", + "BaseDriverConfig", + "DriverConfig", + "OpenAiDriverConfig", + "AzureOpenAiDriverConfig", + "AmazonBedrockDriverConfig", + "AnthropicDriverConfig", + "GoogleDriverConfig", + "CohereDriverConfig", + "config", ] diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_driver_config.py similarity index 84% rename from griptape/config/amazon_bedrock_structure_config.py rename to griptape/config/amazon_bedrock_driver_config.py index 3ad7f8f48..a07300638 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_driver_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, AmazonBedrockImageQueryDriver, @@ -25,14 +25,14 @@ @define -class AmazonBedrockStructureConfig(StructureConfig): +class AmazonBedrockDriverConfig(DriverConfig): session: boto3.Session = field( default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True, metadata={"serializable": False}, ) - prompt_driver: BasePromptDriver = field( + prompt: BasePromptDriver = field( default=Factory( lambda self: AmazonBedrockPromptDriver( session=self.session, @@ -43,7 +43,7 @@ class AmazonBedrockStructureConfig(StructureConfig): kw_only=True, metadata={"serializable": True}, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory( lambda self: AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1"), takes_self=True, @@ -51,7 +51,7 @@ class AmazonBedrockStructureConfig(StructureConfig): kw_only=True, metadata={"serializable": True}, ) - image_generation_driver: BaseImageGenerationDriver = field( + image_generation: BaseImageGenerationDriver = field( default=Factory( lambda self: AmazonBedrockImageGenerationDriver( session=self.session, @@ -63,7 +63,7 @@ class AmazonBedrockStructureConfig(StructureConfig): kw_only=True, metadata={"serializable": True}, ) - image_query_driver: BaseImageGenerationDriver = field( + image_query: BaseImageGenerationDriver = field( default=Factory( lambda self: AmazonBedrockImageQueryDriver( session=self.session, @@ -75,8 +75,8 @@ class AmazonBedrockStructureConfig(StructureConfig): kw_only=True, metadata={"serializable": True}, ) - vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + vector_store: BaseVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), kw_only=True, metadata={"serializable": True}, ) diff --git a/griptape/config/anthropic_structure_config.py b/griptape/config/anthropic_driver_config.py similarity index 76% rename from griptape/config/anthropic_structure_config.py rename to griptape/config/anthropic_driver_config.py index 1bb5bf49b..642a3fced 100644 --- a/griptape/config/anthropic_structure_config.py +++ b/griptape/config/anthropic_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( AnthropicImageQueryDriver, AnthropicPromptDriver, @@ -14,25 +14,25 @@ @define -class AnthropicStructureConfig(StructureConfig): - prompt_driver: BasePromptDriver = field( +class AnthropicDriverConfig(DriverConfig): + prompt: BasePromptDriver = field( default=Factory(lambda: AnthropicPromptDriver(model="claude-3-5-sonnet-20240620")), metadata={"serializable": True}, kw_only=True, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory(lambda: VoyageAiEmbeddingDriver(model="voyage-large-2")), metadata={"serializable": True}, kw_only=True, ) - vector_store_driver: BaseVectorStoreDriver = field( + vector_store: BaseVectorStoreDriver = field( default=Factory( lambda: LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")), ), kw_only=True, metadata={"serializable": True}, ) - image_query_driver: BaseImageQueryDriver = field( + image_query: BaseImageQueryDriver = field( default=Factory(lambda: AnthropicImageQueryDriver(model="claude-3-5-sonnet-20240620")), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_driver_config.py similarity index 88% rename from griptape/config/azure_openai_structure_config.py rename to griptape/config/azure_openai_driver_config.py index ce0303e34..c987a31b5 100644 --- a/griptape/config/azure_openai_structure_config.py +++ b/griptape/config/azure_openai_driver_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, @@ -20,8 +20,8 @@ @define -class AzureOpenAiStructureConfig(StructureConfig): - """Azure OpenAI Structure Configuration. +class AzureOpenAiDriverConfig(DriverConfig): + """Azure OpenAI Driver Configuration. Attributes: azure_endpoint: The endpoint for the Azure OpenAI instance. @@ -43,7 +43,7 @@ class AzureOpenAiStructureConfig(StructureConfig): metadata={"serializable": False}, ) api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) - prompt_driver: BasePromptDriver = field( + prompt: BasePromptDriver = field( default=Factory( lambda self: AzureOpenAiChatPromptDriver( model="gpt-4o", @@ -57,7 +57,7 @@ class AzureOpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, kw_only=True, ) - image_generation_driver: BaseImageGenerationDriver = field( + image_generation: BaseImageGenerationDriver = field( default=Factory( lambda self: AzureOpenAiImageGenerationDriver( model="dall-e-2", @@ -72,7 +72,7 @@ class AzureOpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, kw_only=True, ) - image_query_driver: BaseImageQueryDriver = field( + image_query: BaseImageQueryDriver = field( default=Factory( lambda self: AzureOpenAiImageQueryDriver( model="gpt-4o", @@ -86,7 +86,7 @@ class AzureOpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, kw_only=True, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory( lambda self: AzureOpenAiEmbeddingDriver( model="text-embedding-3-small", @@ -100,8 +100,8 @@ class AzureOpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, kw_only=True, ) - vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + vector_store: BaseVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), metadata={"serializable": True}, kw_only=True, ) diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index 241efadcd..9209aa4a4 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -4,6 +4,11 @@ from griptape.mixins.serializable_mixin import SerializableMixin +from .base_driver_config import BaseDriverConfig +from .logging_config import LoggingConfig -@define -class BaseConfig(SerializableMixin, ABC): ... + +@define(kw_only=True) +class BaseConfig(SerializableMixin, ABC): + drivers: BaseDriverConfig + logging: LoggingConfig diff --git a/griptape/config/base_driver_config.py b/griptape/config/base_driver_config.py new file mode 100644 index 000000000..df32d382e --- /dev/null +++ b/griptape/config/base_driver_config.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from abc import ABC +from typing import TYPE_CHECKING, Optional + +from attrs import define, field + +from griptape.mixins import SerializableMixin + +if TYPE_CHECKING: + from griptape.drivers import ( + BaseAudioTranscriptionDriver, + BaseConversationMemoryDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseTextToSpeechDriver, + BaseVectorStoreDriver, + ) + + +@define +class BaseDriverConfig(ABC, SerializableMixin): + prompt: BasePromptDriver = field(kw_only=True, metadata={"serializable": True}) + image_generation: BaseImageGenerationDriver = field(kw_only=True, metadata={"serializable": True}) + image_query: BaseImageQueryDriver = field(kw_only=True, metadata={"serializable": True}) + embedding: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) + vector_store: BaseVectorStoreDriver = field(kw_only=True, metadata={"serializable": True}) + conversation_memory: Optional[BaseConversationMemoryDriver] = field( + default=None, + kw_only=True, + metadata={"serializable": True}, + ) + text_to_speech: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) + audio_transcription: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py deleted file mode 100644 index c2aa82d7e..000000000 --- a/griptape/config/base_structure_config.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from abc import ABC -from typing import TYPE_CHECKING, Optional - -from attrs import define, field - -from griptape.config import BaseConfig -from griptape.utils import dict_merge - -if TYPE_CHECKING: - from griptape.drivers import ( - BaseAudioTranscriptionDriver, - BaseConversationMemoryDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseTextToSpeechDriver, - BaseVectorStoreDriver, - ) - - -@define -class BaseStructureConfig(BaseConfig, ABC): - prompt_driver: BasePromptDriver = field(kw_only=True, metadata={"serializable": True}) - image_generation_driver: BaseImageGenerationDriver = field(kw_only=True, metadata={"serializable": True}) - image_query_driver: BaseImageQueryDriver = field(kw_only=True, metadata={"serializable": True}) - embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) - vector_store_driver: BaseVectorStoreDriver = field(kw_only=True, metadata={"serializable": True}) - conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( - default=None, - kw_only=True, - metadata={"serializable": True}, - ) - text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) - audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) - - def merge_config(self, config: dict) -> BaseStructureConfig: - base_config = self.to_dict() - merged_config = dict_merge(base_config, config) - - return BaseStructureConfig.from_dict(merged_config) diff --git a/griptape/config/cohere_structure_config.py b/griptape/config/cohere_driver_config.py similarity index 76% rename from griptape/config/cohere_structure_config.py rename to griptape/config/cohere_driver_config.py index 2e896b9b0..7195f550f 100644 --- a/griptape/config/cohere_structure_config.py +++ b/griptape/config/cohere_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( BaseEmbeddingDriver, BasePromptDriver, @@ -12,15 +12,15 @@ @define -class CohereStructureConfig(StructureConfig): +class CohereDriverConfig(DriverConfig): api_key: str = field(metadata={"serializable": False}, kw_only=True) - prompt_driver: BasePromptDriver = field( + prompt: BasePromptDriver = field( default=Factory(lambda self: CoherePromptDriver(model="command-r", api_key=self.api_key), takes_self=True), metadata={"serializable": True}, kw_only=True, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory( lambda self: CohereEmbeddingDriver( model="embed-english-v3.0", @@ -32,8 +32,8 @@ class CohereStructureConfig(StructureConfig): metadata={"serializable": True}, kw_only=True, ) - vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + vector_store: BaseVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), kw_only=True, metadata={"serializable": True}, ) diff --git a/griptape/config/config.py b/griptape/config/config.py new file mode 100644 index 000000000..97d501abb --- /dev/null +++ b/griptape/config/config.py @@ -0,0 +1,15 @@ +from attrs import Factory, define, field + +from .base_config import BaseConfig +from .base_driver_config import BaseDriverConfig +from .logging_config import LoggingConfig +from .openai_driver_config import OpenAiDriverConfig + + +@define +class _Config(BaseConfig): + drivers: BaseDriverConfig = field(default=Factory(lambda: OpenAiDriverConfig()), kw_only=True) + logging: LoggingConfig = field(default=Factory(lambda: LoggingConfig()), kw_only=True) + + +config = _Config() diff --git a/griptape/config/structure_config.py b/griptape/config/driver_config.py similarity index 60% rename from griptape/config/structure_config.py rename to griptape/config/driver_config.py index ef95012ce..325591258 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/driver_config.py @@ -1,19 +1,11 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field -from griptape.config import BaseStructureConfig +from griptape.config import BaseDriverConfig from griptape.drivers import ( - BaseAudioTranscriptionDriver, - BaseConversationMemoryDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseTextToSpeechDriver, - BaseVectorStoreDriver, DummyAudioTranscriptionDriver, DummyEmbeddingDriver, DummyImageGenerationDriver, @@ -23,45 +15,57 @@ DummyVectorStoreDriver, ) +if TYPE_CHECKING: + from griptape.drivers import ( + BaseAudioTranscriptionDriver, + BaseConversationMemoryDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseTextToSpeechDriver, + BaseVectorStoreDriver, + ) + @define -class StructureConfig(BaseStructureConfig): - prompt_driver: BasePromptDriver = field( +class DriverConfig(BaseDriverConfig): + prompt: BasePromptDriver = field( kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True}, ) - image_generation_driver: BaseImageGenerationDriver = field( + image_generation: BaseImageGenerationDriver = field( kw_only=True, default=Factory(lambda: DummyImageGenerationDriver()), metadata={"serializable": True}, ) - image_query_driver: BaseImageQueryDriver = field( + image_query: BaseImageQueryDriver = field( kw_only=True, default=Factory(lambda: DummyImageQueryDriver()), metadata={"serializable": True}, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( kw_only=True, default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True}, ) - vector_store_driver: BaseVectorStoreDriver = field( + vector_store: BaseVectorStoreDriver = field( default=Factory(lambda: DummyVectorStoreDriver()), kw_only=True, metadata={"serializable": True}, ) - conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( + conversation_memory: Optional[BaseConversationMemoryDriver] = field( default=None, kw_only=True, metadata={"serializable": True}, ) - text_to_speech_driver: BaseTextToSpeechDriver = field( + text_to_speech: BaseTextToSpeechDriver = field( default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True}, ) - audio_transcription_driver: BaseAudioTranscriptionDriver = field( + audio_transcription: BaseAudioTranscriptionDriver = field( default=Factory(lambda: DummyAudioTranscriptionDriver()), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/google_structure_config.py b/griptape/config/google_driver_config.py similarity index 75% rename from griptape/config/google_structure_config.py rename to griptape/config/google_driver_config.py index 66ed90b4b..a1089f0ee 100644 --- a/griptape/config/google_structure_config.py +++ b/griptape/config/google_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( BaseEmbeddingDriver, BasePromptDriver, @@ -12,18 +12,18 @@ @define -class GoogleStructureConfig(StructureConfig): - prompt_driver: BasePromptDriver = field( +class GoogleDriverConfig(DriverConfig): + prompt: BasePromptDriver = field( default=Factory(lambda: GooglePromptDriver(model="gemini-1.5-pro")), kw_only=True, metadata={"serializable": True}, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory(lambda: GoogleEmbeddingDriver(model="models/embedding-001")), kw_only=True, metadata={"serializable": True}, ) - vector_store_driver: BaseVectorStoreDriver = field( + vector_store: BaseVectorStoreDriver = field( default=Factory( lambda: LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")), ), diff --git a/griptape/config/logging_config.py b/griptape/config/logging_config.py new file mode 100644 index 000000000..0c0fcc020 --- /dev/null +++ b/griptape/config/logging_config.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +import logging + +from attrs import define, field +from rich.logging import RichHandler + + +@define +class LoggingConfig: + logger_name: str = field(default="griptape", kw_only=True) + logger_level: int = field( + default=logging.INFO, + kw_only=True, + on_setattr=lambda self, _, value: logging.getLogger(self.logger_name).setLevel(value), + ) + + def __attrs_post_init__(self) -> None: + logger = logging.getLogger(self.logger_name) + + logger.propagate = False + logger.setLevel(self.logger_level) + + logger.handlers = [RichHandler(show_time=True, show_path=False)] diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_driver_config.py similarity index 76% rename from griptape/config/openai_structure_config.py rename to griptape/config/openai_driver_config.py index 63806dfc9..35ccde43d 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import StructureConfig +from griptape.config import DriverConfig from griptape.drivers import ( BaseAudioTranscriptionDriver, BaseEmbeddingDriver, @@ -20,40 +20,40 @@ @define -class OpenAiStructureConfig(StructureConfig): - prompt_driver: BasePromptDriver = field( +class OpenAiDriverConfig(DriverConfig): + prompt: BasePromptDriver = field( default=Factory(lambda: OpenAiChatPromptDriver(model="gpt-4o")), metadata={"serializable": True}, kw_only=True, ) - image_generation_driver: BaseImageGenerationDriver = field( + image_generation: BaseImageGenerationDriver = field( default=Factory(lambda: OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512")), kw_only=True, metadata={"serializable": True}, ) - image_query_driver: BaseImageQueryDriver = field( + image_query: BaseImageQueryDriver = field( default=Factory(lambda: OpenAiImageQueryDriver(model="gpt-4o")), kw_only=True, metadata={"serializable": True}, ) - embedding_driver: BaseEmbeddingDriver = field( + embedding: BaseEmbeddingDriver = field( default=Factory(lambda: OpenAiEmbeddingDriver(model="text-embedding-3-small")), metadata={"serializable": True}, kw_only=True, ) - vector_store_driver: BaseVectorStoreDriver = field( + vector_store: BaseVectorStoreDriver = field( default=Factory( lambda: LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")), ), kw_only=True, metadata={"serializable": True}, ) - text_to_speech_driver: BaseTextToSpeechDriver = field( + text_to_speech: BaseTextToSpeechDriver = field( default=Factory(lambda: OpenAiTextToSpeechDriver(model="tts")), kw_only=True, metadata={"serializable": True}, ) - audio_transcription_driver: BaseAudioTranscriptionDriver = field( + audio_transcription: BaseAudioTranscriptionDriver = field( default=Factory(lambda: OpenAiAudioTranscriptionDriver(model="whisper-1")), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py index e52174c28..44f214d7c 100644 --- a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py @@ -5,12 +5,13 @@ from attrs import Factory, define, field from griptape.drivers import BaseConversationMemoryDriver -from griptape.memory.structure import BaseConversationMemory from griptape.utils import import_optional_dependency if TYPE_CHECKING: import boto3 + from griptape.memory.structure import BaseConversationMemory + @define class AmazonDynamoDbConversationMemoryDriver(BaseConversationMemoryDriver): @@ -38,6 +39,8 @@ def store(self, memory: BaseConversationMemory) -> None: ) def load(self) -> Optional[BaseConversationMemory]: + from griptape.memory.structure import BaseConversationMemory + response = self.table.get_item(Key=self._get_key()) if "Item" in response and self.value_attribute_key in response["Item"]: diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index 8d6399e13..f7b6e7d6e 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -2,12 +2,14 @@ import os from pathlib import Path -from typing import Optional +from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.drivers import BaseConversationMemoryDriver -from griptape.memory.structure import BaseConversationMemory + +if TYPE_CHECKING: + from griptape.memory.structure import BaseConversationMemory @define @@ -18,6 +20,8 @@ def store(self, memory: BaseConversationMemory) -> None: Path(self.file_path).write_text(memory.to_json()) def load(self) -> Optional[BaseConversationMemory]: + from griptape.memory.structure import BaseConversationMemory + if not os.path.exists(self.file_path): return None memory = BaseConversationMemory.from_json(Path(self.file_path).read_text()) diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py index 2ba3737e8..9afc2f204 100644 --- a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -6,12 +6,13 @@ from attrs import Factory, define, field from griptape.drivers import BaseConversationMemoryDriver -from griptape.memory.structure import BaseConversationMemory from griptape.utils.import_utils import import_optional_dependency if TYPE_CHECKING: from redis import Redis + from griptape.memory.structure import BaseConversationMemory + @define class RedisConversationMemoryDriver(BaseConversationMemoryDriver): @@ -54,6 +55,8 @@ def store(self, memory: BaseConversationMemory) -> None: self.client.hset(self.index, self.conversation_id, memory.to_json()) def load(self) -> Optional[BaseConversationMemory]: + from griptape.memory.structure import BaseConversationMemory + key = self.index memory_json = self.client.hget(key, self.conversation_id) if memory_json: diff --git a/griptape/engines/audio/audio_transcription_engine.py b/griptape/engines/audio/audio_transcription_engine.py index 3631b2d17..cad8287d5 100644 --- a/griptape/engines/audio/audio_transcription_engine.py +++ b/griptape/engines/audio/audio_transcription_engine.py @@ -1,12 +1,15 @@ -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import AudioArtifact, TextArtifact +from griptape.config import config from griptape.drivers import BaseAudioTranscriptionDriver @define class AudioTranscriptionEngine: - audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True) + audio_transcription_driver: BaseAudioTranscriptionDriver = field( + default=Factory(lambda: config.drivers.audio_transcription), kw_only=True + ) def run(self, audio: AudioArtifact, *args, **kwargs) -> TextArtifact: return self.audio_transcription_driver.try_run(audio) diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index af5d5a494..aad45a10a 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -2,7 +2,9 @@ from typing import TYPE_CHECKING -from attrs import define, field +from attrs import Factory, define, field + +from griptape.config import config if TYPE_CHECKING: from griptape.artifacts.audio_artifact import AudioArtifact @@ -11,7 +13,9 @@ @define class TextToSpeechEngine: - text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True) + text_to_speech_driver: BaseTextToSpeechDriver = field( + default=Factory(lambda: config.drivers.text_to_speech), kw_only=True + ) def run(self, prompts: list[str], *args, **kwargs) -> AudioArtifact: return self.text_to_speech_driver.try_text_to_audio(prompts=prompts) diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index f263ee0aa..4b1184e5e 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -6,6 +6,7 @@ from attrs import Attribute, Factory, define, field from griptape.chunkers import BaseChunker, TextChunker +from griptape.config import config if TYPE_CHECKING: from griptape.artifacts import ErrorArtifact, ListArtifact @@ -17,7 +18,7 @@ class BaseExtractionEngine(ABC): max_token_multiplier: float = field(default=0.5, kw_only=True) chunk_joiner: str = field(default="\n\n", kw_only=True) - prompt_driver: BasePromptDriver = field(kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 47a853871..9bec68b91 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -3,7 +3,9 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Factory, define, field + +from griptape.config import config if TYPE_CHECKING: from griptape.artifacts import ImageArtifact @@ -13,7 +15,9 @@ @define class BaseImageGenerationEngine(ABC): - image_generation_driver: BaseImageGenerationDriver = field(kw_only=True) + image_generation_driver: BaseImageGenerationDriver = field( + kw_only=True, default=Factory(lambda: config.drivers.image_generation) + ) @abstractmethod def run(self, prompts: list[str], *args, rulesets: Optional[list[Ruleset]], **kwargs) -> ImageArtifact: ... diff --git a/griptape/engines/image_query/image_query_engine.py b/griptape/engines/image_query/image_query_engine.py index d0a1e99d4..f2bd99544 100644 --- a/griptape/engines/image_query/image_query_engine.py +++ b/griptape/engines/image_query/image_query_engine.py @@ -2,7 +2,9 @@ from typing import TYPE_CHECKING -from attrs import define, field +from attrs import Factory, define, field + +from griptape.config import config if TYPE_CHECKING: from griptape.artifacts import ImageArtifact, TextArtifact @@ -11,7 +13,7 @@ @define class ImageQueryEngine: - image_query_driver: BaseImageQueryDriver = field(kw_only=True) + image_query_driver: BaseImageQueryDriver = field(default=Factory(lambda: config.drivers.image_query), kw_only=True) def run(self, query: str, images: list[ImageArtifact]) -> TextArtifact: return self.image_query_driver.query(query, images) diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 99bdf5f5e..92e611223 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -5,6 +5,7 @@ from attrs import Factory, define, field from griptape.artifacts.text_artifact import TextArtifact +from griptape.config import config from griptape.engines.rag.modules import BaseResponseRagModule from griptape.mixins import RuleMixin from griptape.utils import J2 @@ -17,7 +18,7 @@ @define(kw_only=True) class PromptResponseRagModule(BaseResponseRagModule, RuleMixin): - prompt_driver: BasePromptDriver = field() + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt)) answer_token_offset: int = field(default=400) metadata: Optional[str] = field(default=None) generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index 0a07b4c50..6ce235fa5 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -5,6 +5,7 @@ from attrs import Factory, define, field from griptape import utils +from griptape.config import config from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: @@ -17,7 +18,7 @@ @define(kw_only=True) class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): - vector_store_driver: BaseVectorStoreDriver = field() + vector_store_driver: BaseVectorStoreDriver = field(default=Factory(lambda: config.drivers.vector_store)) query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( default=Factory(lambda: lambda es: [e.to_artifact() for e in es]), diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index c5d8e695d..82c33a0ad 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -6,8 +6,8 @@ from griptape.artifacts import ListArtifact, TextArtifact from griptape.chunkers import BaseChunker, TextChunker -from griptape.common import PromptStack -from griptape.common.prompt_stack.messages.message import Message +from griptape.common import Message, PromptStack +from griptape.config import config from griptape.engines import BaseSummaryEngine from griptape.utils import J2 @@ -22,7 +22,7 @@ class PromptSummaryEngine(BaseSummaryEngine): max_token_multiplier: float = field(default=0.5, kw_only=True) system_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/system.j2")), kw_only=True) user_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/user.j2")), kw_only=True) - prompt_driver: BasePromptDriver = field(kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/exceptions/dummy_exception.py b/griptape/exceptions/dummy_exception.py index 815cb245f..172aeadc6 100644 --- a/griptape/exceptions/dummy_exception.py +++ b/griptape/exceptions/dummy_exception.py @@ -2,7 +2,7 @@ class DummyError(Exception): def __init__(self, dummy_class_name: str, dummy_method_name: str) -> None: message = ( f"You have attempted to use a {dummy_class_name}'s {dummy_method_name} method. " - "This likely originated from using a `StructureConfig` without providing a Driver required for this feature." + "This likely originated from using a `DriverConfig` without providing a Driver required for this feature." ) super().__init__(message) diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index c3d3c501e..d6e3549af 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -3,9 +3,10 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Factory, define, field from griptape.common import PromptStack +from griptape.config import config from griptape.mixins import SerializableMixin if TYPE_CHECKING: @@ -16,7 +17,9 @@ @define class BaseConversationMemory(SerializableMixin, ABC): - driver: Optional[BaseConversationMemoryDriver] = field(default=None, kw_only=True) + driver: Optional[BaseConversationMemoryDriver] = field( + default=Factory(lambda: config.drivers.conversation_memory), kw_only=True + ) runs: list[Run] = field(factory=list, kw_only=True, metadata={"serializable": True}) structure: Structure = field(init=False) autoload: bool = field(default=True, kw_only=True) @@ -64,7 +67,7 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = if self.autoprune and hasattr(self, "structure"): should_prune = True - prompt_driver = self.structure.config.prompt_driver + prompt_driver = config.drivers.prompt temp_stack = PromptStack() # Try to determine how many Conversation Memory runs we can diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index f29bbb767..4263e61c8 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -5,8 +5,8 @@ from attrs import Factory, define, field -from griptape.common import PromptStack -from griptape.common.prompt_stack.messages.message import Message +from griptape.common import Message, PromptStack +from griptape.config import config from griptape.memory.structure import ConversationMemory from griptape.utils import J2 @@ -18,7 +18,7 @@ @define class SummaryConversationMemory(ConversationMemory): offset: int = field(default=1, kw_only=True, metadata={"serializable": True}) - _prompt_driver: BasePromptDriver = field(kw_only=True, default=None, alias="prompt_driver") + prompt_driver: BasePromptDriver = field(kw_only=True, default=Factory(lambda: config.drivers.prompt)) summary: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) summary_index: int = field(default=0, kw_only=True, metadata={"serializable": True}) summary_template_generator: J2 = field(default=Factory(lambda: J2("memory/conversation/summary.j2")), kw_only=True) @@ -27,19 +27,6 @@ class SummaryConversationMemory(ConversationMemory): kw_only=True, ) - @property - def prompt_driver(self) -> BasePromptDriver: - if self._prompt_driver is None: - if self.structure is not None: - self._prompt_driver = self.structure.config.prompt_driver - else: - raise ValueError("Prompt Driver is not set.") - return self._prompt_driver - - @prompt_driver.setter - def prompt_driver(self, value: BasePromptDriver) -> None: - self._prompt_driver = value - def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: stack = PromptStack() if self.summary: diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 62a517bc9..18f2cff80 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -2,9 +2,10 @@ from typing import TYPE_CHECKING, Any, Optional -from attrs import Attribute, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.config import config from griptape.engines.rag import RagContext, RagEngine from griptape.memory.task.storage import BaseArtifactStorage @@ -15,7 +16,7 @@ @define(kw_only=True) class TextArtifactStorage(BaseArtifactStorage): - vector_store_driver: BaseVectorStoreDriver = field() + vector_store_driver: BaseVectorStoreDriver = field(default=Factory(lambda: config.drivers.vector_store)) rag_engine: Optional[RagEngine] = field(default=None) retrieval_rag_module_name: Optional[str] = field(default=None) summary_engine: Optional[BaseSummaryEngine] = field(default=None) diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index b133a7b6b..a046da6a9 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -2,16 +2,18 @@ from typing import TYPE_CHECKING, Callable, Optional -from attrs import Attribute, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts.text_artifact import TextArtifact from griptape.common import observable +from griptape.config import config from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask if TYPE_CHECKING: from griptape.artifacts import BaseArtifact + from griptape.drivers import BasePromptDriver from griptape.tasks import BaseTask from griptape.tools import BaseTool @@ -21,6 +23,8 @@ class Agent(Structure): input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), ) + stream: bool = field(default=Factory(lambda: config.drivers.prompt.stream), kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) fail_fast: bool = field(default=False, kw_only=True) @@ -32,11 +36,20 @@ def validate_fail_fast(self, _: Attribute, fail_fast: bool) -> None: # noqa: FB def __attrs_post_init__(self) -> None: super().__attrs_post_init__() + + self.prompt_driver.stream = self.stream if len(self.tasks) == 0: if self.tools: - task = ToolkitTask(self.input, tools=self.tools, max_meta_memory_entries=self.max_meta_memory_entries) + task = ToolkitTask( + self.input, + prompt_driver=self.prompt_driver, + tools=self.tools, + max_meta_memory_entries=self.max_meta_memory_entries, + ) else: - task = PromptTask(self.input, max_meta_memory_entries=self.max_meta_memory_entries) + task = PromptTask( + self.input, prompt_driver=self.prompt_driver, max_meta_memory_entries=self.max_meta_memory_entries + ) self.add_task(task) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 8f095dfeb..eb56c2cf1 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -1,24 +1,14 @@ from __future__ import annotations -import logging import uuid from abc import ABC, abstractmethod -from logging import Logger from typing import TYPE_CHECKING, Any, Optional from attrs import Attribute, Factory, define, field -from rich.logging import RichHandler from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact from griptape.common import observable -from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig -from griptape.drivers import ( - BaseEmbeddingDriver, - BasePromptDriver, - LocalVectorStoreDriver, - OpenAiChatPromptDriver, - OpenAiEmbeddingDriver, -) +from griptape.config import config from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( @@ -31,7 +21,6 @@ from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage -from griptape.utils import deprecation_warn if TYPE_CHECKING: from griptape.memory.structure import BaseConversationMemory @@ -41,26 +30,12 @@ @define class Structure(ABC): - LOGGER_NAME = "griptape" - id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True) - stream: Optional[bool] = field(default=None, kw_only=True) - prompt_driver: Optional[BasePromptDriver] = field(default=None) - embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) - config: BaseStructureConfig = field( - default=Factory(lambda self: self.default_config, takes_self=True), - kw_only=True, - ) rulesets: list[Ruleset] = field(factory=list, kw_only=True) rules: list[Rule] = field(factory=list, kw_only=True) tasks: list[BaseTask] = field(factory=list, kw_only=True) - custom_logger: Optional[Logger] = field(default=None, kw_only=True) - logger_level: int = field(default=logging.INFO, kw_only=True) conversation_memory: Optional[BaseConversationMemory] = field( - default=Factory( - lambda self: ConversationMemory(driver=self.config.conversation_memory_driver), - takes_self=True, - ), + default=Factory(lambda: ConversationMemory()), kw_only=True, ) rag_engine: RagEngine = field(default=Factory(lambda self: self.default_rag_engine, takes_self=True), kw_only=True) @@ -71,7 +46,6 @@ class Structure(ABC): meta_memory: MetaMemory = field(default=Factory(lambda: MetaMemory()), kw_only=True) fail_fast: bool = field(default=True, kw_only=True) _execution_args: tuple = () - _logger: Optional[Logger] = None @rulesets.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rulesets(self, _: Attribute, rulesets: list[Ruleset]) -> None: @@ -100,39 +74,10 @@ def __attrs_post_init__(self) -> None: def __add__(self, other: BaseTask | list[BaseTask]) -> list[BaseTask]: return self.add_tasks(*other) if isinstance(other, list) else self + [other] - @prompt_driver.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_prompt_driver(self, attribute: Attribute, value: BasePromptDriver) -> None: - if value is not None: - deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver` instead.") - - @embedding_driver.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_embedding_driver(self, attribute: Attribute, value: BaseEmbeddingDriver) -> None: - if value is not None: - deprecation_warn(f"`{attribute.name}` is deprecated, use `config.embedding_driver` instead.") - - @stream.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_stream(self, attribute: Attribute, value: bool) -> None: # noqa: FBT001 - if value is not None: - deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver.stream` instead.") - @property def execution_args(self) -> tuple: return self._execution_args - @property - def logger(self) -> Logger: - if self.custom_logger: - return self.custom_logger - else: - if self._logger is None: - self._logger = logging.getLogger(self.LOGGER_NAME) - - self._logger.propagate = False - self._logger.level = self.logger_level - - self._logger.handlers = [RichHandler(show_time=True, show_path=False)] - return self._logger - @property def input_task(self) -> Optional[BaseTask]: return self.tasks[0] if self.tasks else None @@ -149,38 +94,14 @@ def output(self) -> Optional[BaseArtifact]: def finished_tasks(self) -> list[BaseTask]: return [s for s in self.tasks if s.is_finished()] - @property - def default_config(self) -> BaseStructureConfig: - if self.prompt_driver is not None or self.embedding_driver is not None or self.stream is not None: - config = StructureConfig() - - prompt_driver = OpenAiChatPromptDriver(model="gpt-4o") if self.prompt_driver is None else self.prompt_driver - - embedding_driver = OpenAiEmbeddingDriver() if self.embedding_driver is None else self.embedding_driver - - if self.stream is not None: - prompt_driver.stream = self.stream - - vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) - - config.prompt_driver = prompt_driver - config.vector_store_driver = vector_store_driver - config.embedding_driver = embedding_driver - else: - config = OpenAiStructureConfig() - - return config - @property def default_rag_engine(self) -> RagEngine: return RagEngine( retrieval_stage=RetrievalRagStage( - retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)], + retrieval_modules=[VectorStoreRetrievalRagModule()], ), response_stage=ResponseRagStage( - response_modules=[ - PromptResponseRagModule(prompt_driver=self.config.prompt_driver, rulesets=self.rulesets) - ], + response_modules=[PromptResponseRagModule(prompt_driver=config.drivers.prompt, rulesets=self.rulesets)], ), ) @@ -191,10 +112,10 @@ def default_task_memory(self) -> TaskMemory: TextArtifact: TextArtifactStorage( rag_engine=self.rag_engine, retrieval_rag_module_name="VectorStoreRetrievalRagModule", - vector_store_driver=self.config.vector_store_driver, - summary_engine=PromptSummaryEngine(prompt_driver=self.config.prompt_driver), - csv_extraction_engine=CsvExtractionEngine(prompt_driver=self.config.prompt_driver), - json_extraction_engine=JsonExtractionEngine(prompt_driver=self.config.prompt_driver), + vector_store_driver=config.drivers.vector_store, + summary_engine=PromptSummaryEngine(prompt_driver=config.drivers.prompt), + csv_extraction_engine=CsvExtractionEngine(prompt_driver=config.drivers.prompt), + json_extraction_engine=JsonExtractionEngine(prompt_driver=config.drivers.prompt), ), BlobArtifact: BlobArtifactStorage(), }, diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index d600c80a5..0f885d260 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import logging import re from typing import TYPE_CHECKING, Callable, Optional @@ -10,6 +11,7 @@ from griptape import utils from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.common import ToolAction +from griptape.config import config from griptape.events import FinishActionsSubtaskEvent, StartActionsSubtaskEvent, event_bus from griptape.mixins import ActionsSubtaskOriginMixin from griptape.tasks import BaseTask @@ -18,6 +20,8 @@ if TYPE_CHECKING: from griptape.memory import TaskMemory +logger = logging.getLogger(config.logging.logger_name) + @define class ActionsSubtask(BaseTask): @@ -86,7 +90,7 @@ def attach_to(self, parent_task: BaseTask) -> None: else: self.__init_from_artifacts(self.input) except Exception as e: - self.structure.logger.error("Subtask %s\nError parsing tool action: %s", self.origin_task.id, e) + logger.error("Subtask %s\nError parsing tool action: %s", self.origin_task.id, e) self.output = ErrorArtifact(f"ToolAction input parsing error: {e}", exception=e) @@ -109,7 +113,7 @@ def before_run(self) -> None: *([f"\nThought: {self.thought}"] if self.thought is not None else []), f"\nActions: {self.actions_to_json()}", ] - self.structure.logger.info("".join(parts)) + logger.info("".join(parts)) def run(self) -> BaseArtifact: try: @@ -128,7 +132,7 @@ def run(self) -> BaseArtifact: actions_output.append(output) self.output = ListArtifact(actions_output) except Exception as e: - self.structure.logger.exception("Subtask %s\n%s", self.id, e) + logger.exception("Subtask %s\n%s", self.id, e) self.output = ErrorArtifact(str(e), exception=e) if self.output is not None: @@ -169,7 +173,7 @@ def after_run(self) -> None: subtask_actions=self.actions_to_dicts(), ), ) - self.structure.logger.info("Subtask %s\nResponse: %s", self.id, response) + logger.info("Subtask %s\nResponse: %s", self.id, response) def actions_to_dicts(self) -> list[dict]: json_list = [] @@ -257,7 +261,7 @@ def __parse_actions(self, actions_matches: list[str]) -> None: self.actions = [self.__process_action_object(action_object) for action_object in actions_list] except json.JSONDecodeError as e: - self.structure.logger.exception("Subtask %s\nInvalid actions JSON: %s", self.origin_task.id, e) + logger.exception("Subtask %s\nInvalid actions JSON: %s", self.origin_task.id, e) self.output = ErrorArtifact(f"Actions JSON decoding error: {e}", exception=e) @@ -314,10 +318,10 @@ def __validate_action(self, action: ToolAction) -> None: if activity_schema: activity_schema.validate(action.input) except schema.SchemaError as e: - self.structure.logger.exception("Subtask %s\nInvalid action JSON: %s", self.origin_task.id, e) + logger.exception("Subtask %s\nInvalid action JSON: %s", self.origin_task.id, e) action.output = ErrorArtifact(f"Activity input JSON validation error: {e}", exception=e) except SyntaxError as e: - self.structure.logger.exception("Subtask %s\nSyntax error: %s", self.origin_task.id, e) + logger.exception("Subtask %s\nSyntax error: %s", self.origin_task.id, e) action.output = ErrorArtifact(f"Syntax error: {e}", exception=e) diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py index 3a4b17b9e..3d83cf7e7 100644 --- a/griptape/tasks/audio_transcription_task.py +++ b/griptape/tasks/audio_transcription_task.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from attrs import define, field +from attrs import Factory, define, field from griptape.engines import AudioTranscriptionEngine from griptape.tasks.base_audio_input_task import BaseAudioInputTask @@ -13,26 +13,10 @@ @define class AudioTranscriptionTask(BaseAudioInputTask): - _audio_transcription_engine: AudioTranscriptionEngine = field( - default=None, + audio_transcription_engine: AudioTranscriptionEngine = field( + default=Factory(lambda: AudioTranscriptionEngine()), kw_only=True, - alias="audio_transcription_engine", ) - @property - def audio_transcription_engine(self) -> AudioTranscriptionEngine: - if self._audio_transcription_engine is None: - if self.structure is not None: - self._audio_transcription_engine = AudioTranscriptionEngine( - audio_transcription_driver=self.structure.config.audio_transcription_driver, - ) - else: - raise ValueError("Audio Generation Engine is not set.") - return self._audio_transcription_engine - - @audio_transcription_engine.setter - def audio_transcription_engine(self, value: AudioTranscriptionEngine) -> None: - self._audio_transcription_engine = value - def run(self) -> TextArtifact: return self.audio_transcription_engine.run(self.input) diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index d2657561d..00774e0a2 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -1,21 +1,25 @@ from __future__ import annotations +import logging from abc import ABC from attrs import define +from griptape.config import config from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.tasks import BaseTask +logger = logging.getLogger(config.logging.logger_name) + @define class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): def before_run(self) -> None: super().before_run() - self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) + logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) + logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_audio_input_task.py b/griptape/tasks/base_audio_input_task.py index 517c03a15..8a470bb85 100644 --- a/griptape/tasks/base_audio_input_task.py +++ b/griptape/tasks/base_audio_input_task.py @@ -1,14 +1,18 @@ from __future__ import annotations +import logging from abc import ABC from typing import Callable from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.config.config import config from griptape.mixins import RuleMixin from griptape.tasks import BaseTask +logger = logging.getLogger(config.logging.logger_name) + @define class BaseAudioInputTask(RuleMixin, BaseTask, ABC): @@ -30,9 +34,9 @@ def input(self, value: AudioArtifact | Callable[[BaseTask], AudioArtifact]) -> N def before_run(self) -> None: super().before_run() - self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) + logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) + logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index d32e8f142..f94ff8de2 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging import os from abc import ABC from pathlib import Path @@ -7,6 +8,7 @@ from attrs import Attribute, define, field +from griptape.config import config from griptape.loaders import ImageLoader from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.rules import Rule, Ruleset @@ -16,6 +18,9 @@ from griptape.artifacts import MediaArtifact +logger = logging.getLogger(config.logging.logger_name) + + @define class BaseImageGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): """Provides a base class for image generation-related tasks. @@ -60,5 +65,5 @@ def all_negative_rulesets(self) -> list[Ruleset]: return task_rulesets def _read_from_file(self, path: str) -> MediaArtifact: - self.structure.logger.info("Reading image from %s", os.path.abspath(path)) + logger.info("Reading image from %s", os.path.abspath(path)) return ImageLoader().load(Path(path).read_bytes()) diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index a0d8cb9ac..c688a1129 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -1,15 +1,19 @@ from __future__ import annotations +import logging from abc import ABC from typing import Callable from attrs import Factory, define, field from griptape.artifacts import ListArtifact, TextArtifact +from griptape.config import config from griptape.mixins.rule_mixin import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 +logger = logging.getLogger(config.logging.logger_name) + @define class BaseMultiTextInputTask(RuleMixin, BaseTask, ABC): @@ -48,9 +52,9 @@ def before_run(self) -> None: super().before_run() joined_input = "\n".join([i.to_text() for i in self.input]) - self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, joined_input) + logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, joined_input) def after_run(self) -> None: super().after_run() - self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) + logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index ade656f87..b3086bebb 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging import uuid from abc import ABC, abstractmethod from concurrent import futures @@ -9,6 +10,7 @@ from attrs import Factory, define, field from griptape.artifacts import ErrorArtifact +from griptape.config import config from griptape.events import FinishTaskEvent, StartTaskEvent, event_bus if TYPE_CHECKING: @@ -16,6 +18,8 @@ from griptape.memory.meta import BaseMetaEntry from griptape.structures import Structure +logger = logging.getLogger(config.logging.logger_name) + @define class BaseTask(ABC): @@ -159,7 +163,7 @@ def execute(self) -> Optional[BaseArtifact]: self.after_run() except Exception as e: - self.structure.logger.exception("%s %s\n%s", self.__class__.__name__, self.id, e) + logger.exception("%s %s\n%s", self.__class__.__name__, self.id, e) self.output = ErrorArtifact(str(e), exception=e) finally: diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index 90f60efcd..1c9dfc023 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -1,15 +1,19 @@ from __future__ import annotations +import logging from abc import ABC from typing import Callable from attrs import define, field from griptape.artifacts import TextArtifact +from griptape.config import config from griptape.mixins.rule_mixin import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 +logger = logging.getLogger(config.logging.logger_name) + @define class BaseTextInputTask(RuleMixin, BaseTask, ABC): @@ -36,9 +40,9 @@ def input(self, value: str | TextArtifact | Callable[[BaseTask], TextArtifact]) def before_run(self) -> None: super().before_run() - self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) + logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) + logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) diff --git a/griptape/tasks/csv_extraction_task.py b/griptape/tasks/csv_extraction_task.py index 538596dfe..c252893de 100644 --- a/griptape/tasks/csv_extraction_task.py +++ b/griptape/tasks/csv_extraction_task.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attrs import define, field +from attrs import Factory, define, field from griptape.engines import CsvExtractionEngine from griptape.tasks import ExtractionTask @@ -8,17 +8,4 @@ @define class CsvExtractionTask(ExtractionTask): - _extraction_engine: CsvExtractionEngine = field(default=None, kw_only=True, alias="extraction_engine") - - @property - def extraction_engine(self) -> CsvExtractionEngine: - if self._extraction_engine is None: - if self.structure is not None: - self._extraction_engine = CsvExtractionEngine(prompt_driver=self.structure.config.prompt_driver) - else: - raise ValueError("Extraction Engine is not set.") - return self._extraction_engine - - @extraction_engine.setter - def extraction_engine(self, value: CsvExtractionEngine) -> None: - self._extraction_engine = value + extraction_engine: CsvExtractionEngine = field(default=Factory(lambda: CsvExtractionEngine()), kw_only=True) diff --git a/griptape/tasks/extraction_task.py b/griptape/tasks/extraction_task.py index d8f492693..a1c18eff0 100644 --- a/griptape/tasks/extraction_task.py +++ b/griptape/tasks/extraction_task.py @@ -13,12 +13,8 @@ @define class ExtractionTask(BaseTextInputTask): - _extraction_engine: BaseExtractionEngine = field(kw_only=True, default=None, alias="extraction_engine") + extraction_engine: BaseExtractionEngine = field(kw_only=True) args: dict = field(kw_only=True) - @property - def extraction_engine(self) -> BaseExtractionEngine: - return self._extraction_engine - def run(self) -> ListArtifact | ErrorArtifact: return self.extraction_engine.extract(self.input.to_text(), rulesets=self.all_rulesets, **self.args) diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index ea1b53739..1c77bbc0a 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import ImageQueryEngine @@ -24,7 +24,7 @@ class ImageQueryTask(BaseTask): image_query_engine: The engine used to execute the query. """ - _image_query_engine: ImageQueryEngine = field(default=None, kw_only=True, alias="image_query_engine") + image_query_engine: ImageQueryEngine = field(default=Factory(lambda: ImageQueryEngine()), kw_only=True) _input: ( tuple[str, list[ImageArtifact]] | tuple[TextArtifact, list[ImageArtifact]] @@ -62,19 +62,6 @@ def input( ) -> None: self._input = value - @property - def image_query_engine(self) -> ImageQueryEngine: - if self._image_query_engine is None: - if self.structure is not None: - self._image_query_engine = ImageQueryEngine(image_query_driver=self.structure.config.image_query_driver) - else: - raise ValueError("Image Query Engine is not set.") - return self._image_query_engine - - @image_query_engine.setter - def image_query_engine(self, value: ImageQueryEngine) -> None: - self._image_query_engine = value - def run(self) -> TextArtifact: query = self.input.value[0] diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 07872d2dd..0ed28a11b 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import InpaintingImageGenerationEngine @@ -28,10 +28,9 @@ class InpaintingImageGenerationTask(BaseImageGenerationTask): output_file: If provided, the generated image will be written to disk as output_file. """ - _image_generation_engine: InpaintingImageGenerationEngine = field( - default=None, + image_generation_engine: InpaintingImageGenerationEngine = field( + default=Factory(lambda: InpaintingImageGenerationEngine()), kw_only=True, - alias="image_generation_engine", ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact @@ -60,21 +59,6 @@ def input( ) -> None: self._input = value - @property - def image_generation_engine(self) -> InpaintingImageGenerationEngine: - if self._image_generation_engine is None: - if self.structure is not None: - self._image_generation_engine = InpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver, - ) - else: - raise ValueError("Image Generation Engine is not set.") - return self._image_generation_engine - - @image_generation_engine.setter - def image_generation_engine(self, value: InpaintingImageGenerationEngine) -> None: - self._image_generation_engine = value - def run(self) -> ImageArtifact: prompt_artifact = self.input[0] diff --git a/griptape/tasks/json_extraction_task.py b/griptape/tasks/json_extraction_task.py index ce51b316f..94db187da 100644 --- a/griptape/tasks/json_extraction_task.py +++ b/griptape/tasks/json_extraction_task.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attrs import define, field +from attrs import Factory, define, field from griptape.engines import JsonExtractionEngine from griptape.tasks import ExtractionTask @@ -8,17 +8,4 @@ @define class JsonExtractionTask(ExtractionTask): - _extraction_engine: JsonExtractionEngine = field(default=None, kw_only=True, alias="extraction_engine") - - @property - def extraction_engine(self) -> JsonExtractionEngine: - if self._extraction_engine is None: - if self.structure is not None: - self._extraction_engine = JsonExtractionEngine(prompt_driver=self.structure.config.prompt_driver) - else: - raise ValueError("Extraction Engine is not set.") - return self._extraction_engine - - @extraction_engine.setter - def extraction_engine(self, value: JsonExtractionEngine) -> None: - self._extraction_engine = value + extraction_engine: JsonExtractionEngine = field(default=Factory(lambda: JsonExtractionEngine()), kw_only=True) diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 3fc85a084..6b63709db 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import OutpaintingImageGenerationEngine @@ -28,10 +28,9 @@ class OutpaintingImageGenerationTask(BaseImageGenerationTask): output_file: If provided, the generated image will be written to disk as output_file. """ - _image_generation_engine: OutpaintingImageGenerationEngine = field( - default=None, + image_generation_engine: OutpaintingImageGenerationEngine = field( + default=Factory(lambda: OutpaintingImageGenerationEngine()), kw_only=True, - alias="image_generation_engine", ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact @@ -60,22 +59,6 @@ def input( ) -> None: self._input = value - @property - def image_generation_engine(self) -> OutpaintingImageGenerationEngine: - if self._image_generation_engine is None: - if self.structure is not None: - self._image_generation_engine = OutpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver, - ) - else: - raise ValueError("Image Generation Engine is not set.") - - return self._image_generation_engine - - @image_generation_engine.setter - def image_generation_engine(self, value: OutpaintingImageGenerationEngine) -> None: - self._image_generation_engine = value - def run(self) -> ImageArtifact: prompt_artifact = self.input[0] diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 0e06448bc..4d3356392 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact, TextArtifact from griptape.engines import PromptImageGenerationEngine @@ -32,10 +32,9 @@ class PromptImageGenerationTask(BaseImageGenerationTask): _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field( default=DEFAULT_INPUT_TEMPLATE, alias="input" ) - _image_generation_engine: PromptImageGenerationEngine = field( - default=None, + image_generation_engine: PromptImageGenerationEngine = field( + default=Factory(lambda: PromptImageGenerationEngine()), kw_only=True, - alias="image_generation_engine", ) @property @@ -51,21 +50,6 @@ def input(self) -> TextArtifact: def input(self, value: TextArtifact) -> None: self._input = value - @property - def image_generation_engine(self) -> PromptImageGenerationEngine: - if self._image_generation_engine is None: - if self.structure is not None: - self._image_generation_engine = PromptImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver, - ) - else: - raise ValueError("Image Generation Engine is not set.") - return self._image_generation_engine - - @image_generation_engine.setter - def image_generation_engine(self, value: PromptImageGenerationEngine) -> None: - self._image_generation_engine = value - def run(self) -> ImageArtifact: image_artifact = self.image_generation_engine.run( prompts=[self.input.to_text()], diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 386ebe239..a8038832d 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -1,11 +1,13 @@ from __future__ import annotations +import logging from typing import TYPE_CHECKING, Callable, Optional from attrs import Factory, define, field from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.common import PromptStack +from griptape.config import config from griptape.mixins import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 @@ -13,10 +15,12 @@ if TYPE_CHECKING: from griptape.drivers import BasePromptDriver +logger = logging.getLogger(config.logging.logger_name) + @define class PromptTask(RuleMixin, BaseTask): - _prompt_driver: Optional[BasePromptDriver] = field(default=None, kw_only=True, alias="prompt_driver") + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) generate_system_template: Callable[[PromptTask], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True, @@ -56,15 +60,6 @@ def prompt_stack(self) -> PromptStack: return stack - @property - def prompt_driver(self) -> BasePromptDriver: - if self._prompt_driver is None: - if self.structure is not None: - self._prompt_driver = self.structure.config.prompt_driver - else: - raise ValueError("Prompt Driver is not set") - return self._prompt_driver - def default_system_template_generator(self, _: PromptTask) -> str: return J2("tasks/prompt_task/system.j2").render( rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), @@ -73,12 +68,12 @@ def default_system_template_generator(self, _: PromptTask) -> str: def before_run(self) -> None: super().before_run() - self.structure.logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) + logger.info("%s %s\nInput: %s", self.__class__.__name__, self.id, self.input.to_text()) def after_run(self) -> None: super().after_run() - self.structure.logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) + logger.info("%s %s\nOutput: %s", self.__class__.__name__, self.id, self.output.to_text()) def run(self) -> BaseArtifact: message = self.prompt_driver.run(self.prompt_stack) diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py index 2f44fdfa4..b7ea8d7c7 100644 --- a/griptape/tasks/rag_task.py +++ b/griptape/tasks/rag_task.py @@ -1,32 +1,15 @@ from __future__ import annotations -from typing import TYPE_CHECKING - -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact +from griptape.engines.rag import RagEngine from griptape.tasks import BaseTextInputTask -if TYPE_CHECKING: - from griptape.engines.rag import RagEngine - @define class RagTask(BaseTextInputTask): - _rag_engine: RagEngine = field(kw_only=True, default=None, alias="rag_engine") - - @property - def rag_engine(self) -> RagEngine: - if self._rag_engine is None: - if self.structure is not None: - self._rag_engine = self.structure.rag_engine - else: - raise ValueError("rag_engine is not set.") - return self._rag_engine - - @rag_engine.setter - def rag_engine(self, value: RagEngine) -> None: - self._rag_engine = value + rag_engine: RagEngine = field(kw_only=True, default=Factory(lambda: RagEngine())) def run(self) -> BaseArtifact: outputs = self.rag_engine.process_query(self.input.to_text()).outputs diff --git a/griptape/tasks/text_summary_task.py b/griptape/tasks/text_summary_task.py index 5bd1b547e..dc1a7b8be 100644 --- a/griptape/tasks/text_summary_task.py +++ b/griptape/tasks/text_summary_task.py @@ -1,8 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.engines import PromptSummaryEngine @@ -14,20 +14,7 @@ @define class TextSummaryTask(BaseTextInputTask): - _summary_engine: Optional[BaseSummaryEngine] = field(default=None, alias="summary_engine") - - @property - def summary_engine(self) -> Optional[BaseSummaryEngine]: - if self._summary_engine is None: - if self.structure is not None: - self._summary_engine = PromptSummaryEngine(prompt_driver=self.structure.config.prompt_driver) - else: - raise ValueError("Summary Engine is not set.") - return self._summary_engine - - @summary_engine.setter - def summary_engine(self, value: BaseSummaryEngine) -> None: - self._summary_engine = value + summary_engine: BaseSummaryEngine = field(default=Factory(lambda: PromptSummaryEngine()), kw_only=True) def run(self) -> TextArtifact: return TextArtifact(self.summary_engine.summarize_text(self.input.to_text(), rulesets=self.all_rulesets)) diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index 3ca503dfe..680a67603 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.engines import TextToSpeechEngine @@ -19,7 +19,7 @@ class TextToSpeechTask(BaseAudioGenerationTask): DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field(default=DEFAULT_INPUT_TEMPLATE) - _text_to_speech_engine: TextToSpeechEngine = field(default=None, kw_only=True, alias="text_to_speech_engine") + text_to_speech_engine: TextToSpeechEngine = field(default=Factory(lambda: TextToSpeechEngine()), kw_only=True) @property def input(self) -> TextArtifact: @@ -34,21 +34,6 @@ def input(self) -> TextArtifact: def input(self, value: TextArtifact) -> None: self._input = value - @property - def text_to_speech_engine(self) -> TextToSpeechEngine: - if self._text_to_speech_engine is None: - if self.structure is not None: - self._text_to_speech_engine = TextToSpeechEngine( - text_to_speech_driver=self.structure.config.text_to_speech_driver, - ) - else: - raise ValueError("Audio Generation Engine is not set.") - return self._text_to_speech_engine - - @text_to_speech_engine.setter - def text_to_speech_engine(self, value: TextToSpeechEngine) -> None: - self._text_to_speech_engine = value - def run(self) -> AudioArtifact: audio_artifact = self.text_to_speech_engine.run(prompts=[self.input.to_text()], rulesets=self.all_rulesets) diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index c162a7192..e3feaeac5 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attrs import define, field +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import VariationImageGenerationEngine @@ -28,10 +28,9 @@ class VariationImageGenerationTask(BaseImageGenerationTask): output_file: If provided, the generated image will be written to disk as output_file. """ - _image_generation_engine: VariationImageGenerationEngine = field( - default=None, + image_generation_engine: VariationImageGenerationEngine = field( + default=Factory(lambda: VariationImageGenerationEngine()), kw_only=True, - alias="image_generation_engine", ) _input: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact = field( default=None, alias="input" @@ -57,21 +56,6 @@ def input(self) -> ListArtifact: def input(self, value: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact]) -> None: self._input = value - @property - def image_generation_engine(self) -> VariationImageGenerationEngine: - if self._image_generation_engine is None: - if self.structure is not None: - self._image_generation_engine = VariationImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver, - ) - else: - raise ValueError("Image Generation Engine is not set.") - return self._image_generation_engine - - @image_generation_engine.setter - def image_generation_engine(self, value: VariationImageGenerationEngine) -> None: - self._image_generation_engine = value - def run(self) -> ImageArtifact: prompt_artifact = self.input[0] diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index e98eeaa4d..07fea92d8 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -25,12 +25,19 @@ class Chat: ) def default_output_fn(self, text: str) -> None: - if self.structure.config.prompt_driver.stream: + from griptape.tasks.prompt_task import PromptTask + + streaming_tasks = [ + task for task in self.structure.tasks if isinstance(task, PromptTask) and task.prompt_driver.stream + ] + if streaming_tasks: print(text, end="", flush=True) # noqa: T201 else: print(text) # noqa: T201 def start(self) -> None: + from griptape.config import config + if self.intro_text: self.output_fn(self.intro_text) while True: @@ -40,7 +47,7 @@ def start(self) -> None: self.output_fn(self.exiting_text) break - if self.structure.config.prompt_driver.stream: + if config.drivers.prompt.stream: self.output_fn(self.processing_text + "\n") stream = Stream(self.structure).run(question) first_chunk = next(stream) diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index fd64a0f52..6da58b9e6 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -34,8 +34,13 @@ class Stream: @structure.validator # pyright: ignore[reportAttributeAccessIssue] def validate_structure(self, _: Attribute, structure: Structure) -> None: - if not structure.config.prompt_driver.stream: - raise ValueError("prompt driver does not have streaming enabled, enable with stream=True") + from griptape.tasks import PromptTask + + streaming_tasks = [ + task for task in structure.tasks if isinstance(task, PromptTask) and task.prompt_driver.stream + ] + if not streaming_tasks: + raise ValueError("Structure does not have any streaming tasks, enable with stream=True") _event_queue: Queue[BaseEvent] = field(default=Factory(lambda: Queue())) diff --git a/tests/mocks/docker/fake_api.py b/tests/mocks/docker/fake_api.py index 881093057..00e750232 100644 --- a/tests/mocks/docker/fake_api.py +++ b/tests/mocks/docker/fake_api.py @@ -154,7 +154,7 @@ def get_fake_inspect_container(*, tty=False): status_code = 200 response = { "Id": FAKE_CONTAINER_ID, - "Config": {"Labels": {"foo": "bar"}, "Privileged": True, "Tty": tty}, + "config": {"Labels": {"foo": "bar"}, "Privileged": True, "Tty": tty}, "ID": FAKE_CONTAINER_ID, "Image": "busybox:latest", "Name": "foobar", @@ -166,7 +166,7 @@ def get_fake_inspect_container(*, tty=False): "StartedAt": "2013-09-25T14:01:18.869545111+02:00", "Ghost": False, }, - "HostConfig": {"LogConfig": {"Type": "json-file", "Config": {}}}, + "HostConfig": {"LogConfig": {"Type": "json-file", "config": {}}}, "MacAddress": "02:42:ac:11:00:0a", } return status_code, response @@ -179,7 +179,7 @@ def get_fake_inspect_image(): "Parent": "27cf784147099545", "Created": "2013-03-23T22:24:18.818426-07:00", "Container": FAKE_CONTAINER_ID, - "Config": {"Labels": {"bar": "foo"}}, + "config": {"Labels": {"bar": "foo"}}, "ContainerConfig": { "Hostname": "", "User": "", @@ -446,7 +446,7 @@ def get_fake_network_list(): "Driver": "bridge", "EnableIPv6": False, "Internal": False, - "IPAM": {"Driver": "default", "Config": [{"Subnet": "172.17.0.0/16"}]}, + "IPAM": {"Driver": "default", "config": [{"Subnet": "172.17.0.0/16"}]}, "Containers": { FAKE_CONTAINER_ID: { "EndpointID": "ed2419a97c1d99", diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_driver_config.py new file mode 100644 index 000000000..6b152721d --- /dev/null +++ b/tests/mocks/mock_driver_config.py @@ -0,0 +1,27 @@ +from attrs import Factory, define, field + +from griptape.config import DriverConfig +from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver +from tests.mocks.mock_image_query_driver import MockImageQueryDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +@define +class MockDriverConfig(DriverConfig): + prompt: MockPromptDriver = field(default=Factory(lambda: MockPromptDriver()), metadata={"serializable": True}) + image_generation: MockImageGenerationDriver = field( + default=Factory(lambda: MockImageGenerationDriver()), + metadata={"serializable": True}, + ) + image_query: MockImageQueryDriver = field( + default=Factory(lambda: MockImageQueryDriver()), metadata={"serializable": True} + ) + embedding: MockEmbeddingDriver = field( + default=Factory(lambda: MockEmbeddingDriver()), metadata={"serializable": True} + ) + vector_store: LocalVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), + metadata={"serializable": True}, + ) diff --git a/tests/mocks/mock_image_generation_driver.py b/tests/mocks/mock_image_generation_driver.py index 573eb0fc4..f8d6d89ce 100644 --- a/tests/mocks/mock_image_generation_driver.py +++ b/tests/mocks/mock_image_generation_driver.py @@ -10,6 +10,8 @@ @define class MockImageGenerationDriver(BaseImageGenerationDriver): + model: str = "test-model" + def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: return ImageArtifact(value="mock image", width=512, height=512, format="png") diff --git a/tests/mocks/mock_structure_config.py b/tests/mocks/mock_structure_config.py deleted file mode 100644 index 3f95288f4..000000000 --- a/tests/mocks/mock_structure_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from attrs import Factory, define, field - -from griptape.config import StructureConfig -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_image_query_driver import MockImageQueryDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver - - -@define -class MockStructureConfig(StructureConfig): - prompt_driver: MockPromptDriver = field( - default=Factory(lambda: MockPromptDriver()), metadata={"serializable": True} - ) - image_generation_driver: MockImageGenerationDriver = field( - default=Factory(lambda: MockImageGenerationDriver(model="dall-e-2")), metadata={"serializable": True} - ) - image_query_driver: MockImageQueryDriver = field( - default=Factory(lambda: MockImageQueryDriver(model="gpt-4-vision-preview")), metadata={"serializable": True} - ) - embedding_driver: MockEmbeddingDriver = field( - default=Factory(lambda: MockEmbeddingDriver(model="text-embedding-3-small")), metadata={"serializable": True} - ) diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_driver_config.py similarity index 71% rename from tests/unit/config/test_amazon_bedrock_structure_config.py rename to tests/unit/config/test_amazon_bedrock_driver_config.py index afe9b3720..57a80809e 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_driver_config.py @@ -1,11 +1,11 @@ import boto3 import pytest -from griptape.config import AmazonBedrockStructureConfig +from griptape.config import AmazonBedrockDriverConfig from tests.utils.aws import mock_aws_credentials -class TestAmazonBedrockStructureConfig: +class TestAmazonBedrockDriverConfig: @pytest.fixture(autouse=True) def _run_before_and_after_tests(self): mock_aws_credentials() @@ -13,11 +13,11 @@ def _run_before_and_after_tests(self): @pytest.fixture() def config(self): mock_aws_credentials() - return AmazonBedrockStructureConfig() + return AmazonBedrockDriverConfig() @pytest.fixture() def config_with_values(self): - return AmazonBedrockStructureConfig( + return AmazonBedrockDriverConfig( session=boto3.Session( aws_access_key_id="testing", aws_secret_access_key="testing", region_name="region-value" ) @@ -25,9 +25,9 @@ def config_with_values(self): def test_to_dict(self, config): assert config.to_dict() == { - "conversation_memory_driver": None, - "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, - "image_generation_driver": { + "conversation_memory": None, + "embedding": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation": { "image_generation_model_driver": { "cfg_scale": 7, "outpainting_mode": "PRECISE", @@ -40,13 +40,13 @@ def test_to_dict(self, config): "seed": None, "type": "AmazonBedrockImageGenerationDriver", }, - "image_query_driver": { + "image_query": { "type": "AmazonBedrockImageQueryDriver", "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "max_tokens": 256, "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, }, - "prompt_driver": { + "prompt": { "max_tokens": None, "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "stream": False, @@ -55,32 +55,31 @@ def test_to_dict(self, config): "tool_choice": {"auto": {}}, "use_native_tools": True, }, - "vector_store_driver": { + "vector_store": { "embedding_driver": { "model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver", }, "type": "LocalVectorStoreDriver", }, - "type": "AmazonBedrockStructureConfig", - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "type": "AmazonBedrockDriverConfig", + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): - assert AmazonBedrockStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert AmazonBedrockDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() def test_from_dict_with_values(self, config_with_values): assert ( - AmazonBedrockStructureConfig.from_dict(config_with_values.to_dict()).to_dict() - == config_with_values.to_dict() + AmazonBedrockDriverConfig.from_dict(config_with_values.to_dict()).to_dict() == config_with_values.to_dict() ) def test_to_dict_with_values(self, config_with_values): assert config_with_values.to_dict() == { - "conversation_memory_driver": None, - "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, - "image_generation_driver": { + "conversation_memory": None, + "embedding": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation": { "image_generation_model_driver": { "cfg_scale": 7, "outpainting_mode": "PRECISE", @@ -93,13 +92,13 @@ def test_to_dict_with_values(self, config_with_values): "seed": None, "type": "AmazonBedrockImageGenerationDriver", }, - "image_query_driver": { + "image_query": { "type": "AmazonBedrockImageQueryDriver", "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "max_tokens": 256, "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, }, - "prompt_driver": { + "prompt": { "max_tokens": None, "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "stream": False, @@ -108,15 +107,15 @@ def test_to_dict_with_values(self, config_with_values): "tool_choice": {"auto": {}}, "use_native_tools": True, }, - "vector_store_driver": { + "vector_store": { "embedding_driver": { "model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver", }, "type": "LocalVectorStoreDriver", }, - "type": "AmazonBedrockStructureConfig", - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "type": "AmazonBedrockDriverConfig", + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, } assert config_with_values.session.region_name == "region-value" diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_driver_config.py similarity index 64% rename from tests/unit/config/test_anthropic_structure_config.py rename to tests/unit/config/test_anthropic_driver_config.py index 05519fa5e..a2ccbd25b 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_driver_config.py @@ -1,9 +1,9 @@ import pytest -from griptape.config import AnthropicStructureConfig +from griptape.config import AnthropicDriverConfig -class TestAnthropicStructureConfig: +class TestAnthropicDriverConfig: @pytest.fixture(autouse=True) def _mock_anthropic(self, mocker): mocker.patch("anthropic.Anthropic") @@ -11,12 +11,12 @@ def _mock_anthropic(self, mocker): @pytest.fixture() def config(self): - return AnthropicStructureConfig() + return AnthropicDriverConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "AnthropicStructureConfig", - "prompt_driver": { + "type": "AnthropicDriverConfig", + "prompt": { "type": "AnthropicPromptDriver", "temperature": 0.1, "max_tokens": 1000, @@ -26,18 +26,18 @@ def test_to_dict(self, config): "top_k": 250, "use_native_tools": True, }, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "image_query_driver": { + "image_generation": {"type": "DummyImageGenerationDriver"}, + "image_query": { "type": "AnthropicImageQueryDriver", "model": "claude-3-5-sonnet-20240620", "max_tokens": 256, }, - "embedding_driver": { + "embedding": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", "input_type": "document", }, - "vector_store_driver": { + "vector_store": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "VoyageAiEmbeddingDriver", @@ -45,10 +45,10 @@ def test_to_dict(self, config): "input_type": "document", }, }, - "conversation_memory_driver": None, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "conversation_memory": None, + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): - assert AnthropicStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert AnthropicDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/test_azure_openai_structure_config.py b/tests/unit/config/test_azure_openai_driver_config.py similarity index 70% rename from tests/unit/config/test_azure_openai_structure_config.py rename to tests/unit/config/test_azure_openai_driver_config.py index dcdc3a1dc..3c88b859d 100644 --- a/tests/unit/config/test_azure_openai_structure_config.py +++ b/tests/unit/config/test_azure_openai_driver_config.py @@ -1,16 +1,16 @@ import pytest -from griptape.config import AzureOpenAiStructureConfig +from griptape.config import AzureOpenAiDriverConfig -class TestAzureOpenAiStructureConfig: +class TestAzureOpenAiDriverConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.AzureOpenAI") @pytest.fixture() def config(self): - return AzureOpenAiStructureConfig( + return AzureOpenAiDriverConfig( azure_endpoint="http://localhost:8080", azure_ad_token="test-token", azure_ad_token_provider=lambda: "test-provider", @@ -18,9 +18,9 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { - "type": "AzureOpenAiStructureConfig", + "type": "AzureOpenAiDriverConfig", "azure_endpoint": "http://localhost:8080", - "prompt_driver": { + "prompt": { "type": "AzureOpenAiChatPromptDriver", "base_url": None, "model": "gpt-4o", @@ -36,8 +36,8 @@ def test_to_dict(self, config): "user": "", "use_native_tools": True, }, - "conversation_memory_driver": None, - "embedding_driver": { + "conversation_memory": None, + "embedding": { "base_url": None, "model": "text-embedding-3-small", "api_version": "2023-05-15", @@ -46,7 +46,7 @@ def test_to_dict(self, config): "organization": None, "type": "AzureOpenAiEmbeddingDriver", }, - "image_generation_driver": { + "image_generation": { "api_version": "2024-02-01", "base_url": None, "image_size": "512x512", @@ -59,7 +59,7 @@ def test_to_dict(self, config): "style": None, "type": "AzureOpenAiImageGenerationDriver", }, - "image_query_driver": { + "image_query": { "base_url": None, "image_quality": "auto", "max_tokens": 256, @@ -70,7 +70,7 @@ def test_to_dict(self, config): "organization": None, "type": "AzureOpenAiImageQueryDriver", }, - "vector_store_driver": { + "vector_store": { "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", @@ -82,19 +82,6 @@ def test_to_dict(self, config): }, "type": "LocalVectorStoreDriver", }, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, } - - def test_from_dict(self, config: AzureOpenAiStructureConfig): - assert AzureOpenAiStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() - - # override values in the dict config - # serialize and deserialize the config - new_config = config.merge_config( - { - "prompt_driver": {"azure_deployment": "new-test-gpt-4"}, - "embedding_driver": {"model": "new-text-embedding-3-small"}, - } - ).to_dict() - assert AzureOpenAiStructureConfig.from_dict(new_config).to_dict() == new_config diff --git a/tests/unit/config/test_cohere_structure_config.py b/tests/unit/config/test_cohere_driver_config.py similarity index 57% rename from tests/unit/config/test_cohere_structure_config.py rename to tests/unit/config/test_cohere_driver_config.py index 113a589ec..9e8407d84 100644 --- a/tests/unit/config/test_cohere_structure_config.py +++ b/tests/unit/config/test_cohere_driver_config.py @@ -1,22 +1,22 @@ import pytest -from griptape.config import CohereStructureConfig +from griptape.config import CohereDriverConfig -class TestCohereStructureConfig: +class TestCohereDriverConfig: @pytest.fixture() def config(self): - return CohereStructureConfig(api_key="api_key") + return CohereDriverConfig(api_key="api_key") def test_to_dict(self, config): assert config.to_dict() == { - "type": "CohereStructureConfig", - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, - "conversation_memory_driver": None, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, - "prompt_driver": { + "type": "CohereDriverConfig", + "image_generation": {"type": "DummyImageGenerationDriver"}, + "image_query": {"type": "DummyImageQueryDriver"}, + "conversation_memory": None, + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "prompt": { "type": "CoherePromptDriver", "temperature": 0.1, "max_tokens": None, @@ -25,12 +25,12 @@ def test_to_dict(self, config): "force_single_step": False, "use_native_tools": True, }, - "embedding_driver": { + "embedding": { "type": "CohereEmbeddingDriver", "model": "embed-english-v3.0", "input_type": "search_document", }, - "vector_store_driver": { + "vector_store": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "CohereEmbeddingDriver", diff --git a/tests/unit/config/test_driver_config.py b/tests/unit/config/test_driver_config.py new file mode 100644 index 000000000..dd3fd1a47 --- /dev/null +++ b/tests/unit/config/test_driver_config.py @@ -0,0 +1,39 @@ +import pytest + +from griptape.config import DriverConfig + + +class TestDriverConfig: + @pytest.fixture() + def config(self): + return DriverConfig() + + def test_to_dict(self, config): + assert config.to_dict() == { + "type": "DriverConfig", + "prompt": { + "type": "DummyPromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "use_native_tools": False, + }, + "conversation_memory": None, + "embedding": {"type": "DummyEmbeddingDriver"}, + "image_generation": {"type": "DummyImageGenerationDriver"}, + "image_query": {"type": "DummyImageQueryDriver"}, + "vector_store": { + "embedding_driver": {"type": "DummyEmbeddingDriver"}, + "type": "DummyVectorStoreDriver", + }, + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + } + + def test_from_dict(self, config): + assert DriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + + def test_dot_update(self, config): + config.prompt.max_tokens = 10 + + assert config.prompt.max_tokens == 10 diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_driver_config.py similarity index 62% rename from tests/unit/config/test_google_structure_config.py rename to tests/unit/config/test_google_driver_config.py index e193cc983..fb6cd23b5 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_driver_config.py @@ -1,21 +1,21 @@ import pytest -from griptape.config import GoogleStructureConfig +from griptape.config import GoogleDriverConfig -class TestGoogleStructureConfig: +class TestGoogleDriverConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("google.generativeai.GenerativeModel") @pytest.fixture() def config(self): - return GoogleStructureConfig() + return GoogleDriverConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "GoogleStructureConfig", - "prompt_driver": { + "type": "GoogleDriverConfig", + "prompt": { "type": "GooglePromptDriver", "temperature": 0.1, "max_tokens": None, @@ -26,15 +26,15 @@ def test_to_dict(self, config): "tool_choice": "auto", "use_native_tools": True, }, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, - "embedding_driver": { + "image_generation": {"type": "DummyImageGenerationDriver"}, + "image_query": {"type": "DummyImageQueryDriver"}, + "embedding": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", "task_type": "retrieval_document", "title": None, }, - "vector_store_driver": { + "vector_store": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "GoogleEmbeddingDriver", @@ -43,10 +43,10 @@ def test_to_dict(self, config): "title": None, }, }, - "conversation_memory_driver": None, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "conversation_memory": None, + "text_to_speech": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): - assert GoogleStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert GoogleDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_driver_config.py similarity index 80% rename from tests/unit/config/test_openai_structure_config.py rename to tests/unit/config/test_openai_driver_config.py index 8969e0ad0..55156730c 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_driver_config.py @@ -1,21 +1,21 @@ import pytest -from griptape.config import OpenAiStructureConfig +from griptape.config import OpenAiDriverConfig -class TestOpenAiStructureConfig: +class TestOpenAiDriverConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.OpenAI") @pytest.fixture() def config(self): - return OpenAiStructureConfig() + return OpenAiDriverConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "OpenAiStructureConfig", - "prompt_driver": { + "type": "OpenAiDriverConfig", + "prompt": { "type": "OpenAiChatPromptDriver", "base_url": None, "model": "gpt-4o", @@ -28,14 +28,14 @@ def test_to_dict(self, config): "user": "", "use_native_tools": True, }, - "conversation_memory_driver": None, - "embedding_driver": { + "conversation_memory": None, + "embedding": { "base_url": None, "model": "text-embedding-3-small", "organization": None, "type": "OpenAiEmbeddingDriver", }, - "image_generation_driver": { + "image_generation": { "api_version": None, "base_url": None, "image_size": "512x512", @@ -46,7 +46,7 @@ def test_to_dict(self, config): "style": None, "type": "OpenAiImageGenerationDriver", }, - "image_query_driver": { + "image_query": { "api_version": None, "base_url": None, "image_quality": "auto", @@ -55,7 +55,7 @@ def test_to_dict(self, config): "organization": None, "type": "OpenAiImageQueryDriver", }, - "vector_store_driver": { + "vector_store": { "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", @@ -64,7 +64,7 @@ def test_to_dict(self, config): }, "type": "LocalVectorStoreDriver", }, - "text_to_speech_driver": { + "text_to_speech": { "type": "OpenAiTextToSpeechDriver", "api_version": None, "base_url": None, @@ -73,7 +73,7 @@ def test_to_dict(self, config): "organization": None, "voice": "alloy", }, - "audio_transcription_driver": { + "audio_transcription": { "type": "OpenAiAudioTranscriptionDriver", "api_version": None, "base_url": None, @@ -83,4 +83,4 @@ def test_to_dict(self, config): } def test_from_dict(self, config): - assert OpenAiStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert OpenAiDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py deleted file mode 100644 index 96a68628f..000000000 --- a/tests/unit/config/test_structure_config.py +++ /dev/null @@ -1,62 +0,0 @@ -import pytest - -from griptape.config import StructureConfig - - -class TestStructureConfig: - @pytest.fixture() - def config(self): - return StructureConfig() - - def test_to_dict(self, config): - assert config.to_dict() == { - "type": "StructureConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "use_native_tools": False, - }, - "conversation_memory_driver": None, - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, - "vector_store_driver": { - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "type": "DummyVectorStoreDriver", - }, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, - } - - def test_from_dict(self, config): - assert StructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() - - def test_unchanged_merge_config(self, config): - assert ( - config.merge_config( - { - "type": "StructureConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - }, - } - ).to_dict() - == config.to_dict() - ) - - def test_changed_merge_config(self, config): - config = config.merge_config( - {"prompt_driver": {"type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False}} - ) - - assert config.prompt_driver.temperature == 0.1 - - def test_dot_update(self, config): - config.prompt_driver.max_tokens = 10 - - assert config.prompt_driver.max_tokens == 10 diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index e462ede90..8a37f6d28 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,6 +1,8 @@ import pytest +from griptape.config import config from griptape.events import event_bus +from tests.mocks.mock_driver_config import MockDriverConfig @pytest.fixture(autouse=True) @@ -10,3 +12,10 @@ def mock_event_bus(): yield event_bus event_bus.clear_event_listeners() + + +@pytest.fixture(autouse=True) +def mock_config(): + config.drivers = MockDriverConfig() + + return config diff --git a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py index 6fcab26e5..61ef3aa53 100644 --- a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py +++ b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py @@ -12,7 +12,7 @@ class TestBaseAudioTranscriptionDriver: def driver(self): return MockAudioTranscriptionDriver() - def test_run_publish_events(self, driver): + def test_run_publish_events(self, driver, mock_config): mock_handler = Mock() event_bus.add_event_listener(EventListener(handler=mock_handler)) diff --git a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py index 8e700d0a5..f1a5df1be 100644 --- a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py @@ -6,7 +6,6 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import PromptTask -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils.aws import mock_aws_credentials @@ -40,7 +39,6 @@ def test_store(self): session = boto3.Session(region_name=self.AWS_REGION) dynamodb = session.resource("dynamodb") table = dynamodb.Table(self.DYNAMODB_TABLE_NAME) - prompt_driver = MockPromptDriver() memory_driver = AmazonDynamoDbConversationMemoryDriver( session=session, table_name=self.DYNAMODB_TABLE_NAME, @@ -49,7 +47,7 @@ def test_store(self): partition_key_value=self.PARTITION_KEY_VALUE, ) memory = ConversationMemory(driver=memory_driver) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) @@ -65,7 +63,6 @@ def test_store_with_sort_key(self): session = boto3.Session(region_name=self.AWS_REGION) dynamodb = session.resource("dynamodb") table = dynamodb.Table(self.DYNAMODB_TABLE_NAME) - prompt_driver = MockPromptDriver() memory_driver = AmazonDynamoDbConversationMemoryDriver( session=session, table_name=self.DYNAMODB_TABLE_NAME, @@ -76,7 +73,7 @@ def test_store_with_sort_key(self): sort_key_value="foo", ) memory = ConversationMemory(driver=memory_driver) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) @@ -89,7 +86,6 @@ def test_store_with_sort_key(self): assert "Item" in response def test_load(self): - prompt_driver = MockPromptDriver() memory_driver = AmazonDynamoDbConversationMemoryDriver( session=boto3.Session(region_name=self.AWS_REGION), table_name=self.DYNAMODB_TABLE_NAME, @@ -98,7 +94,7 @@ def test_load(self): partition_key_value=self.PARTITION_KEY_VALUE, ) memory = ConversationMemory(driver=memory_driver) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) @@ -113,7 +109,6 @@ def test_load(self): assert new_memory.runs[0].output.value == "mock output" def test_load_with_sort_key(self): - prompt_driver = MockPromptDriver() memory_driver = AmazonDynamoDbConversationMemoryDriver( session=boto3.Session(region_name=self.AWS_REGION), table_name=self.DYNAMODB_TABLE_NAME, @@ -124,7 +119,7 @@ def test_load_with_sort_key(self): sort_key_value="foo", ) memory = ConversationMemory(driver=memory_driver) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) diff --git a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py index e1a383ab9..dff66d0fc 100644 --- a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py @@ -7,7 +7,6 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import PromptTask -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestLocalConversationMemoryDriver: @@ -22,10 +21,9 @@ def _run_before_and_after_tests(self): self.__delete_file(self.MEMORY_FILE_PATH) def test_store(self): - prompt_driver = MockPromptDriver() memory_driver = LocalConversationMemoryDriver(file_path=self.MEMORY_FILE_PATH) memory = ConversationMemory(driver=memory_driver, autoload=False) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) @@ -41,10 +39,9 @@ def test_store(self): assert True def test_load(self): - prompt_driver = MockPromptDriver() memory_driver = LocalConversationMemoryDriver(file_path=self.MEMORY_FILE_PATH) memory = ConversationMemory(driver=memory_driver, autoload=False, max_runs=5) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) @@ -60,10 +57,9 @@ def test_load(self): assert new_memory.max_runs == 5 def test_autoload(self): - prompt_driver = MockPromptDriver() memory_driver = LocalConversationMemoryDriver(file_path=self.MEMORY_FILE_PATH) memory = ConversationMemory(driver=memory_driver) - pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_task(PromptTask("test")) diff --git a/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py index 4f7ce50f0..758505b26 100644 --- a/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py +++ b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py @@ -8,7 +8,6 @@ from griptape.drivers import OpenTelemetryObservabilityDriver from griptape.observability.observability import Observability from griptape.structures.agent import Agent -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils.expected_spans import ExpectedSpan, ExpectedSpans @@ -170,7 +169,7 @@ def test_observability_agent(self, driver, mock_span_exporter): ) with Observability(observability_driver=driver): - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() agent.run("Hi") assert mock_span_exporter.export.call_count == 1 diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 5b6b0c600..c30acdec4 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -10,17 +10,17 @@ class TestBasePromptDriver: - def test_run_via_pipeline_retries_success(self): - driver = MockPromptDriver(max_attempts=1) - pipeline = Pipeline(prompt_driver=driver) + def test_run_via_pipeline_retries_success(self, mock_config): + mock_config.drivers.prompt = MockPromptDriver(max_attempts=2) + pipeline = Pipeline() pipeline.add_task(PromptTask("test")) assert isinstance(pipeline.run().output_task.output, TextArtifact) - def test_run_via_pipeline_retries_failure(self): - driver = MockFailingPromptDriver(max_failures=2, max_attempts=1) - pipeline = Pipeline(prompt_driver=driver) + def test_run_via_pipeline_retries_failure(self, mock_config): + mock_config.drivers.prompt = MockFailingPromptDriver(max_failures=2, max_attempts=1) + pipeline = Pipeline() pipeline.add_task(PromptTask("test")) @@ -28,8 +28,7 @@ def test_run_via_pipeline_retries_failure(self): def test_run_via_pipeline_publishes_events(self, mocker): mock_publish_event = mocker.patch.object(_EventBus, "publish_event") - driver = MockPromptDriver() - pipeline = Pipeline(prompt_driver=driver) + pipeline = Pipeline() pipeline.add_task(PromptTask("test")) pipeline.run() @@ -46,9 +45,9 @@ def test_run_with_stream(self): assert isinstance(result, Message) assert result.value == "mock output" - def test_run_with_tools(self): - driver = MockPromptDriver(max_attempts=1, use_native_tools=True) - pipeline = Pipeline(prompt_driver=driver) + def test_run_with_tools(self, mock_config): + mock_config.drivers.prompt = MockPromptDriver(max_attempts=1, use_native_tools=True) + pipeline = Pipeline() pipeline.add_task(ToolkitTask(tools=[MockTool()])) @@ -56,9 +55,9 @@ def test_run_with_tools(self): assert isinstance(output, TextArtifact) assert output.value == "mock output" - def test_run_with_tools_and_stream(self): - driver = MockPromptDriver(max_attempts=1, stream=True, use_native_tools=True) - pipeline = Pipeline(prompt_driver=driver) + def test_run_with_tools_and_stream(self, mock_config): + mock_config.driver = MockPromptDriver(max_attempts=1, stream=True, use_native_tools=True) + pipeline = Pipeline() pipeline.add_task(ToolkitTask(tools=[MockTool()])) diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index 316f7bf71..c2bb45208 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -9,7 +9,7 @@ class TestLocalStructureRunDriver: def test_run(self): pipeline = Pipeline() - driver = LocalStructureRunDriver(structure_factory_fn=lambda: Agent(prompt_driver=MockPromptDriver())) + driver = LocalStructureRunDriver(structure_factory_fn=lambda: Agent()) task = StructureRunTask(driver=driver) @@ -17,10 +17,11 @@ def test_run(self): assert task.run().to_text() == "mock output" - def test_run_with_env(self): + def test_run_with_env(self, mock_config): pipeline = Pipeline() - agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda _: os.environ["KEY"])) + mock_config.drivers.prompt = MockPromptDriver(mock_output=lambda _: os.environ["KEY"]) + agent = Agent() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"KEY": "value"}) task = StructureRunTask(driver=driver) diff --git a/tests/unit/engines/extraction/test_csv_extraction_engine.py b/tests/unit/engines/extraction/test_csv_extraction_engine.py index f69d8a0ba..d84fc7cdd 100644 --- a/tests/unit/engines/extraction/test_csv_extraction_engine.py +++ b/tests/unit/engines/extraction/test_csv_extraction_engine.py @@ -1,13 +1,12 @@ import pytest from griptape.engines import CsvExtractionEngine -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestCsvExtractionEngine: @pytest.fixture() def engine(self): - return CsvExtractionEngine(prompt_driver=MockPromptDriver()) + return CsvExtractionEngine() def test_extract(self, engine): result = engine.extract("foo", column_names=["test1"]) diff --git a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py index 4d0aad139..430f67ef9 100644 --- a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py @@ -4,13 +4,12 @@ from griptape.common import Reference from griptape.engines.rag import RagContext from griptape.engines.rag.modules import FootnotePromptResponseRagModule -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestFootnotePromptResponseRagModule: @pytest.fixture() def module(self): - return FootnotePromptResponseRagModule(prompt_driver=MockPromptDriver()) + return FootnotePromptResponseRagModule() def test_run(self, module): assert module.run(RagContext(query="test")).value == "mock output" diff --git a/tests/unit/engines/rag/test_rag_engine.py b/tests/unit/engines/rag/test_rag_engine.py index 964a52650..71db4e01f 100644 --- a/tests/unit/engines/rag/test_rag_engine.py +++ b/tests/unit/engines/rag/test_rag_engine.py @@ -25,14 +25,12 @@ def engine(self): ) def test_module_name_uniqueness(self): - vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - with pytest.raises(ValueError): RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - VectorStoreRetrievalRagModule(name="test", vector_store_driver=vector_store_driver), - VectorStoreRetrievalRagModule(name="test", vector_store_driver=vector_store_driver), + VectorStoreRetrievalRagModule(name="test"), + VectorStoreRetrievalRagModule(name="test"), ] ) ) @@ -40,8 +38,8 @@ def test_module_name_uniqueness(self): assert RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - VectorStoreRetrievalRagModule(name="test1", vector_store_driver=vector_store_driver), - VectorStoreRetrievalRagModule(name="test2", vector_store_driver=vector_store_driver), + VectorStoreRetrievalRagModule(name="test1"), + VectorStoreRetrievalRagModule(name="test2"), ] ) ) diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index 4d9c65e03..138444ae3 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -12,7 +12,7 @@ class TestPromptSummaryEngine: @pytest.fixture() def engine(self): - return PromptSummaryEngine(prompt_driver=MockPromptDriver()) + return PromptSummaryEngine() def test_summarize_text(self, engine): assert engine.summarize_text("foobar") == "mock output" @@ -24,10 +24,10 @@ def test_summarize_artifacts(self, engine): def test_max_token_multiplier_invalid(self, engine): with pytest.raises(ValueError): - PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=0) + PromptSummaryEngine(max_token_multiplier=0) with pytest.raises(ValueError): - PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=10000) + PromptSummaryEngine(max_token_multiplier=10000) def test_chunked_summary(self, engine): def smaller_input(prompt_stack: PromptStack): diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 50763e0c3..4e21fa392 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -25,16 +25,17 @@ class TestEventListener: @pytest.fixture() - def pipeline(self): + def pipeline(self, mock_config): + mock_config.drivers.prompt = MockPromptDriver(stream=True) task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) - pipeline = Pipeline(prompt_driver=MockPromptDriver(stream=True)) + pipeline = Pipeline() pipeline.add_task(task) task.add_subtask(ActionsSubtask("foo")) return pipeline - def test_untyped_listeners(self, pipeline): + def test_untyped_listeners(self, pipeline, mock_config): event_handler_1 = Mock() event_handler_2 = Mock() @@ -48,7 +49,7 @@ def test_untyped_listeners(self, pipeline): assert event_handler_1.call_count == 9 assert event_handler_2.call_count == 9 - def test_typed_listeners(self, pipeline): + def test_typed_listeners(self, pipeline, mock_config): start_prompt_event_handler = Mock() finish_prompt_event_handler = Mock() start_task_event_handler = Mock() diff --git a/tests/unit/events/test_finish_actions_subtask_event.py b/tests/unit/events/test_finish_actions_subtask_event.py index 5e2a0807a..5fc35755b 100644 --- a/tests/unit/events/test_finish_actions_subtask_event.py +++ b/tests/unit/events/test_finish_actions_subtask_event.py @@ -3,7 +3,6 @@ from griptape.events import FinishActionsSubtaskEvent from griptape.structures import Agent from griptape.tasks import ActionsSubtask, ToolkitTask -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -17,7 +16,7 @@ def finish_subtask_event(self): "Answer: test output" ) task = ToolkitTask(tools=[MockTool()]) - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() agent.add_task(task) subtask = ActionsSubtask(valid_input) task.add_subtask(subtask) diff --git a/tests/unit/events/test_finish_task_event.py b/tests/unit/events/test_finish_task_event.py index df1d6d42a..2568752bb 100644 --- a/tests/unit/events/test_finish_task_event.py +++ b/tests/unit/events/test_finish_task_event.py @@ -3,14 +3,13 @@ from griptape.events import FinishTaskEvent from griptape.structures import Agent from griptape.tasks import PromptTask -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestFinishTaskEvent: @pytest.fixture() def finish_task_event(self): task = PromptTask() - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() agent.add_task(task) agent.run() diff --git a/tests/unit/events/test_start_actions_subtask_event.py b/tests/unit/events/test_start_actions_subtask_event.py index 8b628057c..b7236911f 100644 --- a/tests/unit/events/test_start_actions_subtask_event.py +++ b/tests/unit/events/test_start_actions_subtask_event.py @@ -3,7 +3,6 @@ from griptape.events import StartActionsSubtaskEvent from griptape.structures import Agent from griptape.tasks import ActionsSubtask, ToolkitTask -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -17,7 +16,7 @@ def start_subtask_event(self): "Answer: test output" ) task = ToolkitTask(tools=[MockTool()]) - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() agent.add_task(task) subtask = ActionsSubtask(valid_input) task.add_subtask(subtask) diff --git a/tests/unit/events/test_start_task_event.py b/tests/unit/events/test_start_task_event.py index ea027f147..111d35934 100644 --- a/tests/unit/events/test_start_task_event.py +++ b/tests/unit/events/test_start_task_event.py @@ -3,14 +3,13 @@ from griptape.events import StartTaskEvent from griptape.structures import Agent from griptape.tasks import PromptTask -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStartTaskEvent: @pytest.fixture() def start_task_event(self): task = PromptTask() - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() agent.add_task(task) agent.run() diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index 2ffd7b8cb..f0e4b0af3 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -60,7 +60,7 @@ def test_from_json(self): def test_buffering(self): memory = ConversationMemory(max_runs=2) - pipeline = Pipeline(conversation_memory=memory, prompt_driver=MockPromptDriver()) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_tasks(PromptTask()) @@ -75,7 +75,7 @@ def test_buffering(self): assert pipeline.conversation_memory.runs[1].input.value == "run5" def test_add_to_prompt_stack_autopruing_disabled(self): - agent = Agent(prompt_driver=MockPromptDriver()) + agent = Agent() memory = ConversationMemory( autoprune=False, runs=[ @@ -94,9 +94,11 @@ def test_add_to_prompt_stack_autopruing_disabled(self): assert len(prompt_stack.messages) == 12 - def test_add_to_prompt_stack_autopruning_enabled(self): + def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): # All memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0))) + + mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0)) + agent = Agent() memory = ConversationMemory( autoprune=True, runs=[ @@ -117,7 +119,8 @@ def test_add_to_prompt_stack_autopruning_enabled(self): assert len(prompt_stack.messages) == 3 # No memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000))) + mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000)) + agent = Agent() memory = ConversationMemory( autoprune=True, runs=[ @@ -140,7 +143,8 @@ def test_add_to_prompt_stack_autopruning_enabled(self): # One memory is pruned. # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens # so that a single memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=160))) + mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=160)) + agent = Agent() memory = ConversationMemory( autoprune=True, runs=[ diff --git a/tests/unit/memory/structure/test_summary_conversation_memory.py b/tests/unit/memory/structure/test_summary_conversation_memory.py index 4396c7b23..42246e349 100644 --- a/tests/unit/memory/structure/test_summary_conversation_memory.py +++ b/tests/unit/memory/structure/test_summary_conversation_memory.py @@ -5,14 +5,13 @@ from griptape.structures import Pipeline from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestSummaryConversationMemory: def test_unsummarized_subtasks(self): - memory = SummaryConversationMemory(offset=1, prompt_driver=MockPromptDriver()) + memory = SummaryConversationMemory(offset=1) - pipeline = Pipeline(conversation_memory=memory, prompt_driver=MockPromptDriver()) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_tasks(PromptTask("test")) @@ -24,9 +23,9 @@ def test_unsummarized_subtasks(self): assert len(memory.unsummarized_runs()) == 1 def test_after_run(self): - memory = SummaryConversationMemory(offset=1, prompt_driver=MockPromptDriver()) + memory = SummaryConversationMemory(offset=1) - pipeline = Pipeline(conversation_memory=memory, prompt_driver=MockPromptDriver()) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_tasks(PromptTask("test")) @@ -85,7 +84,7 @@ def test_from_json(self): def test_config_prompt_driver(self): memory = SummaryConversationMemory() - pipeline = Pipeline(conversation_memory=memory, config=MockStructureConfig()) + pipeline = Pipeline(conversation_memory=memory) pipeline.add_tasks(PromptTask("test")) diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index e3d9034c4..33bfdc5ee 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -76,18 +76,6 @@ def test_with_no_task_memory_and_empty_tool_output_memory(self): assert agent.tools[0].input_memory[0] == agent.task_memory assert agent.tools[0].output_memory == {} - def test_embedding_driver(self): - embedding_driver = MockEmbeddingDriver() - agent = Agent(tools=[MockTool()], embedding_driver=embedding_driver) - - storage = list(agent.task_memory.artifact_storages.values())[0] - assert isinstance(storage, TextArtifactStorage) - memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ - 0 - ].vector_store_driver.embedding_driver - - assert memory_embedding_driver == embedding_driver - def test_without_default_task_memory(self): agent = Agent(task_memory=None, tools=[MockTool()]) @@ -233,7 +221,7 @@ def test_context(self): def test_task_memory_defaults(self): prompt_driver = MockPromptDriver() embedding_driver = MockEmbeddingDriver() - agent = Agent(prompt_driver=prompt_driver, embedding_driver=embedding_driver) + agent = Agent(prompt_driver=prompt_driver) storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) @@ -248,16 +236,6 @@ def test_task_memory_defaults(self): assert storage.csv_extraction_engine.prompt_driver == prompt_driver assert storage.json_extraction_engine.prompt_driver == prompt_driver - def test_deprecation(self): - with pytest.deprecated_call(): - Agent(prompt_driver=MockPromptDriver()) - - with pytest.deprecated_call(): - Agent(embedding_driver=MockEmbeddingDriver()) - - with pytest.deprecated_call(): - Agent(stream=True) - def finished_tasks(self): task = PromptTask("test prompt") agent = Agent(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index 306fd7bd2..a7f7f40c1 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -4,14 +4,11 @@ from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.memory.structure import ConversationMemory -from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset from griptape.structures import Pipeline from griptape.tasks import BaseTask, CodeExecutionTask, PromptTask, ToolkitTask from griptape.tokenizers import OpenAiTokenizer -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool -from tests.unit.structures.test_agent import MockEmbeddingDriver class TestPipeline: @@ -31,10 +28,8 @@ def fn(task): return CodeExecutionTask(run_fn=fn) def test_init(self): - driver = MockPromptDriver() - pipeline = Pipeline(prompt_driver=driver, rulesets=[Ruleset("TestRuleset", [Rule("test")])]) + pipeline = Pipeline(rulesets=[Ruleset("TestRuleset", [Rule("test")])]) - assert pipeline.prompt_driver is driver assert pipeline.input_task is None assert pipeline.output_task is None assert pipeline.rulesets[0].name == "TestRuleset" @@ -103,20 +98,6 @@ def test_with_task_memory(self): assert pipeline.tasks[0].tools[0].output_memory is not None assert pipeline.tasks[0].tools[0].output_memory["test"][0] == pipeline.task_memory - def test_embedding_driver(self): - embedding_driver = MockEmbeddingDriver() - pipeline = Pipeline(embedding_driver=embedding_driver) - - pipeline.add_task(ToolkitTask(tools=[MockTool()])) - - storage = list(pipeline.task_memory.artifact_storages.values())[0] - assert isinstance(storage, TextArtifactStorage) - memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ - 0 - ].vector_store_driver.embedding_driver - - assert memory_embedding_driver == embedding_driver - def test_with_task_memory_and_empty_tool_output_memory(self): pipeline = Pipeline() @@ -139,7 +120,7 @@ def test_with_memory(self): second_task = PromptTask("test2") third_task = PromptTask("test3") - pipeline = Pipeline(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + pipeline = Pipeline(conversation_memory=ConversationMemory()) pipeline + [first_task, second_task, third_task] @@ -174,7 +155,7 @@ def test_tasks_order(self): second_task = PromptTask("test2") third_task = PromptTask("test3") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + first_task pipeline + second_task @@ -189,7 +170,7 @@ def test_add_task(self): first_task = PromptTask("test1") second_task = PromptTask("test2") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + first_task pipeline + second_task @@ -208,7 +189,7 @@ def test_add_tasks(self): first_task = PromptTask("test1") second_task = PromptTask("test2") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + [first_task, second_task] @@ -227,7 +208,7 @@ def test_insert_task_in_middle(self): second_task = PromptTask("test2", id="test2") third_task = PromptTask("test3", id="test3") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + [first_task, second_task] pipeline.insert_task(first_task, third_task) @@ -251,7 +232,7 @@ def test_insert_task_at_end(self): second_task = PromptTask("test2", id="test2") third_task = PromptTask("test3", id="test3") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + [first_task, second_task] pipeline.insert_task(second_task, third_task) @@ -271,7 +252,7 @@ def test_insert_task_at_end(self): assert [child.id for child in third_task.children] == [] def test_prompt_stack_without_memory(self): - pipeline = Pipeline(conversation_memory=None, prompt_driver=MockPromptDriver(), rules=[Rule("test")]) + pipeline = Pipeline(conversation_memory=None, rules=[Rule("test")]) task1 = PromptTask("test") task2 = PromptTask("test") @@ -292,7 +273,7 @@ def test_prompt_stack_without_memory(self): assert len(task2.prompt_stack.messages) == 3 def test_prompt_stack_with_memory(self): - pipeline = Pipeline(prompt_driver=MockPromptDriver(), rules=[Rule("test")]) + pipeline = Pipeline(rules=[Rule("test")]) task1 = PromptTask("test") task2 = PromptTask("test") @@ -321,7 +302,7 @@ def test_text_artifact_token_count(self): def test_run(self): task = PromptTask("test") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + task assert task.state == BaseTask.State.PENDING @@ -333,7 +314,7 @@ def test_run(self): def test_run_with_args(self): task = PromptTask("{{ args[0] }}-{{ args[1] }}") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + [task] pipeline._execution_args = ("test1", "test2") @@ -348,7 +329,7 @@ def test_context(self): parent = PromptTask("parent") task = PromptTask("test") child = PromptTask("child") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + [parent, task, child] @@ -365,35 +346,23 @@ def test_context(self): assert context["parent"] == parent assert context["child"] == child - def test_deprecation(self): - with pytest.deprecated_call(): - Pipeline(prompt_driver=MockPromptDriver()) - - with pytest.deprecated_call(): - Pipeline(embedding_driver=MockEmbeddingDriver()) - - with pytest.deprecated_call(): - Pipeline(stream=True) - def test_run_with_error_artifact(self, error_artifact_task, waiting_task): end_task = PromptTask("end") - pipeline = Pipeline(prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task]) + pipeline = Pipeline(tasks=[waiting_task, error_artifact_task, end_task]) pipeline.run() assert pipeline.output is None def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting_task): end_task = PromptTask("end") - pipeline = Pipeline( - prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False - ) + pipeline = Pipeline(tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False) pipeline.run() assert pipeline.output is not None def test_add_duplicate_task(self): task = PromptTask("test") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + task pipeline + task @@ -402,7 +371,7 @@ def test_add_duplicate_task(self): def test_add_duplicate_task_directly(self): task = PromptTask("test") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline + task pipeline.tasks.append(task) diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 242de29c5..79c9868e1 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -4,12 +4,9 @@ from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.memory.structure import ConversationMemory -from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset from griptape.structures import Workflow from griptape.tasks import BaseTask, CodeExecutionTask, PromptTask, ToolkitTask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -30,10 +27,8 @@ def fn(task): return CodeExecutionTask(run_fn=fn) def test_init(self): - driver = MockPromptDriver() - workflow = Workflow(prompt_driver=driver, rulesets=[Ruleset("TestRuleset", [Rule("test")])]) + workflow = Workflow(rulesets=[Ruleset("TestRuleset", [Rule("test")])]) - assert workflow.prompt_driver is driver assert len(workflow.tasks) == 0 assert workflow.rulesets[0].name == "TestRuleset" assert workflow.rulesets[0].rules[0].value == "test" @@ -100,20 +95,6 @@ def test_with_task_memory(self): assert workflow.tasks[0].tools[0].output_memory is not None assert workflow.tasks[0].tools[0].output_memory["test"][0] == workflow.task_memory - def test_embedding_driver(self): - embedding_driver = MockEmbeddingDriver() - workflow = Workflow(embedding_driver=embedding_driver) - - workflow.add_task(ToolkitTask(tools=[MockTool()])) - - storage = list(workflow.task_memory.artifact_storages.values())[0] - assert isinstance(storage, TextArtifactStorage) - memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ - 0 - ].vector_store_driver.embedding_driver - - assert memory_embedding_driver == embedding_driver - def test_with_task_memory_and_empty_tool_output_memory(self): workflow = Workflow() @@ -136,7 +117,7 @@ def test_with_memory(self): second_task = PromptTask("test2") third_task = PromptTask("test3") - workflow = Workflow(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + workflow = Workflow(conversation_memory=ConversationMemory()) workflow + [first_task, second_task, third_task] @@ -170,7 +151,7 @@ def test_add_task(self): first_task = PromptTask("test1") second_task = PromptTask("test2") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + first_task workflow.add_task(second_task) @@ -189,7 +170,7 @@ def test_add_tasks(self): first_task = PromptTask("test1") second_task = PromptTask("test2") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + [first_task, second_task] @@ -206,7 +187,7 @@ def test_add_tasks(self): def test_run(self): task1 = PromptTask("test") task2 = PromptTask("test") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + [task1, task2] assert task1.state == BaseTask.State.PENDING @@ -219,7 +200,7 @@ def test_run(self): def test_run_with_args(self): task = PromptTask("{{ args[0] }}-{{ args[1] }}") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task workflow._execution_args = ("test1", "test2") @@ -241,7 +222,7 @@ def test_run_with_args(self): ], ) def test_run_raises_on_missing_parent_or_child_id(self, tasks): - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=tasks) + workflow = Workflow(tasks=tasks) with pytest.raises(ValueError) as e: workflow.run() @@ -250,7 +231,6 @@ def test_run_raises_on_missing_parent_or_child_id(self, tasks): def test_run_topology_1_declarative_parents(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1"), PromptTask("test2", id="task2", parent_ids=["task1"]), @@ -265,7 +245,6 @@ def test_run_topology_1_declarative_parents(self): def test_run_topology_1_declarative_children(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1", child_ids=["task2", "task3"]), PromptTask("test2", id="task2", child_ids=["task4"]), @@ -280,7 +259,6 @@ def test_run_topology_1_declarative_children(self): def test_run_topology_1_declarative_mixed(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1", child_ids=["task3"]), PromptTask("test2", id="task2", parent_ids=["task1"], child_ids=["task4"]), @@ -301,7 +279,7 @@ def test_run_topology_1_imperative_parents(self): task2.add_parent(task1) task3.add_parent("task1") task4.add_parents([task2, "task3"]) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + workflow = Workflow(tasks=[task1, task2, task3, task4]) workflow.run() @@ -315,14 +293,14 @@ def test_run_topology_1_imperative_children(self): task1.add_children([task2, task3]) task2.add_child(task4) task3.add_child(task4) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + workflow = Workflow(tasks=[task1, task2, task3, task4]) workflow.run() self._validate_topology_1(workflow) def test_run_topology_1_imperative_parents_structure_init(self): - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() task1 = PromptTask("test1", id="task1") task2 = PromptTask("test2", id="task2", structure=workflow) task3 = PromptTask("test3", id="task3", structure=workflow) @@ -336,7 +314,7 @@ def test_run_topology_1_imperative_parents_structure_init(self): self._validate_topology_1(workflow) def test_run_topology_1_imperative_children_structure_init(self): - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() task1 = PromptTask("test1", id="task1", structure=workflow) task2 = PromptTask("test2", id="task2", structure=workflow) task3 = PromptTask("test3", id="task3", structure=workflow) @@ -356,7 +334,7 @@ def test_run_topology_1_imperative_mixed(self): task4 = PromptTask("test4", id="task4") task1.add_children([task2, task3]) task4.add_parents([task2, task3]) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + workflow = Workflow(tasks=[task1, task2, task3, task4]) workflow.run() @@ -367,7 +345,7 @@ def test_run_topology_1_imperative_insert(self): task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() # task1 splits into task2 and task3 # task2 and task3 converge into task4 @@ -384,7 +362,7 @@ def test_run_topology_1_missing_parent(self): task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() # task1 never added to workflow workflow + task4 @@ -396,7 +374,7 @@ def test_run_topology_1_id_equality(self): task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() # task4 never added to workflow workflow + task1 @@ -410,7 +388,7 @@ def test_run_topology_1_object_equality(self): task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task4 @@ -419,7 +397,6 @@ def test_run_topology_1_object_equality(self): def test_run_topology_2_declarative_parents(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("testa", id="taska"), PromptTask("testb", id="taskb", parent_ids=["taska"]), @@ -435,7 +412,6 @@ def test_run_topology_2_declarative_parents(self): def test_run_topology_2_declarative_children(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("testa", id="taska", child_ids=["taskb", "taskc", "taskd", "taske"]), PromptTask("testb", id="taskb", child_ids=["taskd"]), @@ -459,7 +435,7 @@ def test_run_topology_2_imperative_parents(self): taskc.add_parent("taska") taskd.add_parents([taska, taskb, taskc]) taske.add_parents(["taska", taskd, "taskc"]) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + workflow = Workflow(tasks=[taska, taskb, taskc, taskd, taske]) workflow.run() @@ -475,7 +451,7 @@ def test_run_topology_2_imperative_children(self): taskb.add_child(taskd) taskc.add_children([taskd, taske]) taskd.add_child(taske) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + workflow = Workflow(tasks=[taska, taskb, taskc, taskd, taske]) workflow.run() @@ -491,7 +467,7 @@ def test_run_topology_2_imperative_mixed(self): taskb.add_child(taskd) taskd.add_parent(taskc) taske.add_parents(["taska", taskd, "taskc"]) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + workflow = Workflow(tasks=[taska, taskb, taskc, taskd, taske]) workflow.run() @@ -503,7 +479,7 @@ def test_run_topology_2_imperative_insert(self): taskc = PromptTask("testc", id="taskc") taskd = PromptTask("testd", id="taskd") taske = PromptTask("teste", id="taske") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow.add_task(taska) workflow.add_task(taske) taske.add_parent(taska) @@ -517,7 +493,6 @@ def test_run_topology_2_imperative_insert(self): def test_run_topology_3_declarative_parents(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1"), PromptTask("test2", id="task2", parent_ids=["task4"]), @@ -532,7 +507,6 @@ def test_run_topology_3_declarative_parents(self): def test_run_topology_3_declarative_children(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1", child_ids=["task4"]), PromptTask("test2", id="task2", child_ids=["task3"]), @@ -547,7 +521,6 @@ def test_run_topology_3_declarative_children(self): def test_run_topology_3_declarative_mixed(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1"), PromptTask("test2", id="task2", parent_ids=["task4"], child_ids=["task3"]), @@ -565,7 +538,7 @@ def test_run_topology_3_imperative_insert(self): task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task2 @@ -580,7 +553,6 @@ def test_run_topology_3_imperative_insert(self): def test_run_topology_4_declarative_parents(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask(id="collect_movie_info"), PromptTask(id="movie_info_1", parent_ids=["collect_movie_info"]), @@ -600,7 +572,6 @@ def test_run_topology_4_declarative_parents(self): def test_run_topology_4_declarative_children(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask(id="collect_movie_info", child_ids=["movie_info_1", "movie_info_2", "movie_info_3"]), PromptTask(id="movie_info_1", child_ids=["compare_movies"]), @@ -620,7 +591,6 @@ def test_run_topology_4_declarative_children(self): def test_run_topology_4_declarative_mixed(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask(id="collect_movie_info"), PromptTask(id="movie_info_1", parent_ids=["collect_movie_info"], child_ids=["compare_movies"]), @@ -650,7 +620,7 @@ def test_run_topology_4_imperative_insert(self): publish_website = PromptTask(id="publish_website") movie_info_3 = PromptTask(id="movie_info_3") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow.add_tasks(collect_movie_info, summarize_to_slack) workflow.insert_tasks(collect_movie_info, [movie_info_1, movie_info_2, movie_info_3], summarize_to_slack) workflow.insert_tasks([movie_info_1, movie_info_2, movie_info_3], compare_movies, summarize_to_slack) @@ -672,7 +642,7 @@ def test_run_topology_4_imperative_insert(self): ], ) def test_run_raises_on_cycle(self, tasks): - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=tasks) + workflow = Workflow(tasks=tasks) with pytest.raises(ValueError) as e: workflow.run() @@ -684,7 +654,7 @@ def test_input_task(self): task2 = PromptTask("prompt2") task3 = PromptTask("prompt3") task4 = PromptTask("prompt4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task4 @@ -697,7 +667,7 @@ def test_output_task(self): task2 = PromptTask("prompt2") task3 = PromptTask("prompt3") task4 = PromptTask("prompt4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task4 @@ -709,7 +679,7 @@ def test_output_task(self): task1.add_children([task2, task3]) # task4 is the final task, but its defined at index 0 - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task4, task1, task2, task3]) + workflow = Workflow(tasks=[task4, task1, task2, task3]) # output_task topologically should be task4 assert task4 == workflow.output_task @@ -719,7 +689,7 @@ def test_to_graph(self): task2 = PromptTask("prompt2", id="task2") task3 = PromptTask("prompt3", id="task3") task4 = PromptTask("prompt4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task4 @@ -736,7 +706,7 @@ def test_order_tasks(self): task2 = PromptTask("prompt2", id="task2") task3 = PromptTask("prompt3", id="task3") task4 = PromptTask("prompt4", id="task4") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + task1 workflow + task4 @@ -753,7 +723,7 @@ def test_context(self): parent = PromptTask("parent") task = PromptTask("test") child = PromptTask("child") - workflow = Workflow(prompt_driver=MockPromptDriver()) + workflow = Workflow() workflow + parent workflow + task @@ -776,20 +746,10 @@ def test_context(self): assert context["parents"] == {parent.id: parent} assert context["children"] == {child.id: child} - def test_deprecation(self): - with pytest.deprecated_call(): - Workflow(prompt_driver=MockPromptDriver()) - - with pytest.deprecated_call(): - Workflow(embedding_driver=MockEmbeddingDriver()) - - with pytest.deprecated_call(): - Workflow(stream=True) - def test_run_with_error_artifact(self, error_artifact_task, waiting_task): end_task = PromptTask("end") end_task.add_parents([error_artifact_task, waiting_task]) - workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task]) + workflow = Workflow(tasks=[waiting_task, error_artifact_task, end_task]) workflow.run() assert workflow.output is None @@ -797,9 +757,7 @@ def test_run_with_error_artifact(self, error_artifact_task, waiting_task): def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting_task): end_task = PromptTask("end") end_task.add_parents([error_artifact_task, waiting_task]) - workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False - ) + workflow = Workflow(tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False) workflow.run() assert workflow.output is not None diff --git a/tests/unit/tasks/test_audio_transcription_task.py b/tests/unit/tasks/test_audio_transcription_task.py index 734e111cf..33405ad10 100644 --- a/tests/unit/tasks/test_audio_transcription_task.py +++ b/tests/unit/tasks/test_audio_transcription_task.py @@ -6,8 +6,6 @@ from griptape.engines import AudioTranscriptionEngine from griptape.structures import Agent, Pipeline from griptape.tasks import AudioTranscriptionTask, BaseTask -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestAudioTranscriptionTask: @@ -34,7 +32,7 @@ def callable_input(task: BaseTask) -> AudioArtifact: def test_config_audio_transcription_engine(self, audio_artifact): task = AudioTranscriptionTask(audio_artifact) - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.audio_transcription_engine, AudioTranscriptionEngine) @@ -42,7 +40,7 @@ def test_run(self, audio_artifact, audio_transcription_engine): audio_transcription_engine.run.return_value = TextArtifact("mock transcription") task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline.add_task(task) assert pipeline.run().output.to_text() == "mock transcription" diff --git a/tests/unit/tasks/test_base_multi_text_input_task.py b/tests/unit/tasks/test_base_multi_text_input_task.py index 3d8d67a55..8eaa832ae 100644 --- a/tests/unit/tasks/test_base_multi_text_input_task.py +++ b/tests/unit/tasks/test_base_multi_text_input_task.py @@ -1,7 +1,6 @@ from griptape.artifacts import TextArtifact from griptape.structures import Pipeline from tests.mocks.mock_multi_text_input_task import MockMultiTextInputTask -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestBaseMultiTextInputTask: @@ -42,7 +41,7 @@ def test_full_context(self): parent = MockMultiTextInputTask(("parent1", "parent2")) subtask = MockMultiTextInputTask(("test1", "test2"), context={"foo": "bar"}) child = MockMultiTextInputTask(("child2", "child2")) - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline.add_tasks(parent, subtask, child) diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index aa402bb48..1b45b4e98 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -7,8 +7,6 @@ from griptape.events.event_listener import EventListener from griptape.structures import Agent, Workflow from griptape.tasks import ActionsSubtask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_task import MockTask from tests.mocks.mock_tool.tool import MockTool @@ -18,10 +16,9 @@ class TestBaseTask: def task(self): event_bus.add_event_listeners([EventListener(handler=Mock())]) agent = Agent( - prompt_driver=MockPromptDriver(), - embedding_driver=MockEmbeddingDriver(), tools=[MockTool()], ) + event_bus.add_event_listeners([EventListener(handler=Mock())]) agent.add_task(MockTask("foobar", max_meta_memory_entries=2)) diff --git a/tests/unit/tasks/test_base_text_input_task.py b/tests/unit/tasks/test_base_text_input_task.py index 86dc98805..ff6afe42b 100644 --- a/tests/unit/tasks/test_base_text_input_task.py +++ b/tests/unit/tasks/test_base_text_input_task.py @@ -1,7 +1,6 @@ from griptape.artifacts import TextArtifact from griptape.rules import Rule, Ruleset from griptape.structures import Pipeline -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_text_input_task import MockTextInputTask @@ -31,7 +30,7 @@ def test_full_context(self): parent = MockTextInputTask("parent") subtask = MockTextInputTask("test", context={"foo": "bar"}) child = MockTextInputTask("child") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline.add_tasks(parent, subtask, child) diff --git a/tests/unit/tasks/test_code_execution_task.py b/tests/unit/tasks/test_code_execution_task.py index 3178e29db..e2c492fad 100644 --- a/tests/unit/tasks/test_code_execution_task.py +++ b/tests/unit/tasks/test_code_execution_task.py @@ -1,7 +1,6 @@ from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.structures import Pipeline from griptape.tasks import CodeExecutionTask -from tests.mocks.mock_prompt_driver import MockPromptDriver def hello_world(task: CodeExecutionTask) -> BaseArtifact: @@ -27,7 +26,7 @@ def test_hello_world_fn(self): # Using a Pipeline # Overriding the input because we are implementing the task not the Pipeline def test_noop_fn(self): - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() task = CodeExecutionTask("No Op", run_fn=non_outputting) pipeline.add_task(task) temp = task.run() diff --git a/tests/unit/tasks/test_csv_extraction_task.py b/tests/unit/tasks/test_csv_extraction_task.py index 7d37c3897..ec8f70b23 100644 --- a/tests/unit/tasks/test_csv_extraction_task.py +++ b/tests/unit/tasks/test_csv_extraction_task.py @@ -4,7 +4,6 @@ from griptape.structures import Agent from griptape.tasks import CsvExtractionTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestCsvExtractionTask: @@ -13,7 +12,7 @@ def task(self): return CsvExtractionTask(args={"column_names": ["test1"]}) def test_run(self, task): - agent = Agent(config=MockStructureConfig()) + agent = Agent() agent.add_task(task) @@ -23,11 +22,7 @@ def test_run(self, task): assert result.value[0].value == {"test1": "mock output"} def test_config_extraction_engine(self, task): - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.extraction_engine, CsvExtractionEngine) assert isinstance(task.extraction_engine.prompt_driver, MockPromptDriver) - - def test_missing_extraction_engine(self, task): - with pytest.raises(ValueError): - task.extraction_engine # noqa: B018 diff --git a/tests/unit/tasks/test_extraction_task.py b/tests/unit/tasks/test_extraction_task.py index afa73a506..76a4c3bd2 100644 --- a/tests/unit/tasks/test_extraction_task.py +++ b/tests/unit/tasks/test_extraction_task.py @@ -3,15 +3,12 @@ from griptape.engines import CsvExtractionEngine from griptape.structures import Agent from griptape.tasks import ExtractionTask -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestExtractionTask: @pytest.fixture() def task(self): - return ExtractionTask( - extraction_engine=CsvExtractionEngine(prompt_driver=MockPromptDriver()), args={"column_names": ["test1"]} - ) + return ExtractionTask(extraction_engine=CsvExtractionEngine(), args={"column_names": ["test1"]}) def test_run(self, task): agent = Agent() diff --git a/tests/unit/tasks/test_image_query_task.py b/tests/unit/tasks/test_image_query_task.py index 447faa01c..01c116772 100644 --- a/tests/unit/tasks/test_image_query_task.py +++ b/tests/unit/tasks/test_image_query_task.py @@ -8,7 +8,6 @@ from griptape.structures import Agent from griptape.tasks import BaseTask, ImageQueryTask from tests.mocks.mock_image_query_driver import MockImageQueryDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestImageQueryTask: @@ -61,17 +60,11 @@ def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArti def test_config_image_generation_engine(self, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.image_query_engine, ImageQueryEngine) assert isinstance(task.image_query_engine.image_query_driver, MockImageQueryDriver) - def test_missing_image_generation_engine(self, text_artifact, image_artifact): - task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) - - with pytest.raises(ValueError, match="Image Query Engine"): - task.image_query_engine # noqa: B018 - def test_run(self, image_query_engine, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact]), image_query_engine=image_query_engine) task.run() diff --git a/tests/unit/tasks/test_inpainting_image_generation_task.py b/tests/unit/tasks/test_inpainting_image_generation_task.py index 61c437bb7..5c4507d49 100644 --- a/tests/unit/tasks/test_inpainting_image_generation_task.py +++ b/tests/unit/tasks/test_inpainting_image_generation_task.py @@ -8,7 +8,6 @@ from griptape.structures import Agent from griptape.tasks import BaseTask, InpaintingImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestInpaintingImageGenerationTask: @@ -51,13 +50,7 @@ def test_bad_input(self, image_artifact): def test_config_image_generation_engine(self, text_artifact, image_artifact): task = InpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.image_generation_engine, InpaintingImageGenerationEngine) assert isinstance(task.image_generation_engine.image_generation_driver, MockImageGenerationDriver) - - def test_missing_image_generation_engine(self, text_artifact, image_artifact): - task = InpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) - - with pytest.raises(ValueError): - task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_json_extraction_task.py b/tests/unit/tasks/test_json_extraction_task.py index ba7d1ce30..8f9278c3c 100644 --- a/tests/unit/tasks/test_json_extraction_task.py +++ b/tests/unit/tasks/test_json_extraction_task.py @@ -5,7 +5,6 @@ from griptape.structures import Agent from griptape.tasks import JsonExtractionTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestJsonExtractionTask: @@ -13,11 +12,9 @@ class TestJsonExtractionTask: def task(self): return JsonExtractionTask("foo", args={"template_schema": Schema({"foo": "bar"}).json_schema("TemplateSchema")}) - def test_run(self, task): - mock_config = MockStructureConfig() - assert isinstance(mock_config.prompt_driver, MockPromptDriver) - mock_config.prompt_driver.mock_output = '[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' - agent = Agent(config=mock_config) + def test_run(self, task, mock_config): + mock_config.drivers.prompt.mock_output = '[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' + agent = Agent() agent.add_task(task) @@ -28,11 +25,7 @@ def test_run(self, task): assert result.value[1].value == '{"test_key_2": "test_value_2"}' def test_config_extraction_engine(self, task): - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.extraction_engine, JsonExtractionEngine) assert isinstance(task.extraction_engine.prompt_driver, MockPromptDriver) - - def test_missing_extraction_engine(self, task): - with pytest.raises(ValueError): - task.extraction_engine # noqa: B018 diff --git a/tests/unit/tasks/test_outpainting_image_generation_task.py b/tests/unit/tasks/test_outpainting_image_generation_task.py index 593451120..ba5e52a82 100644 --- a/tests/unit/tasks/test_outpainting_image_generation_task.py +++ b/tests/unit/tasks/test_outpainting_image_generation_task.py @@ -8,7 +8,6 @@ from griptape.structures import Agent from griptape.tasks import BaseTask, OutpaintingImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestOutpaintingImageGenerationTask: @@ -51,13 +50,7 @@ def test_bad_input(self, image_artifact): def test_config_image_generation_engine(self, text_artifact, image_artifact): task = OutpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.image_generation_engine, OutpaintingImageGenerationEngine) assert isinstance(task.image_generation_engine.image_generation_driver, MockImageGenerationDriver) - - def test_missing_image_generation_engine(self, text_artifact, image_artifact): - task = OutpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) - - with pytest.raises(ValueError): - task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_prompt_image_generation_task.py b/tests/unit/tasks/test_prompt_image_generation_task.py index 1c4b639fb..3ad0302f2 100644 --- a/tests/unit/tasks/test_prompt_image_generation_task.py +++ b/tests/unit/tasks/test_prompt_image_generation_task.py @@ -1,13 +1,10 @@ from unittest.mock import Mock -import pytest - from griptape.artifacts import TextArtifact from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent from griptape.tasks import BaseTask, PromptImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestPromptImageGenerationTask: @@ -28,13 +25,7 @@ def callable_input(task: BaseTask) -> TextArtifact: def test_config_image_generation_engine_engine(self): task = PromptImageGenerationTask("foo bar") - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.image_generation_engine, PromptImageGenerationEngine) assert isinstance(task.image_generation_engine.image_generation_driver, MockImageGenerationDriver) - - def test_missing_summary_engine(self): - task = PromptImageGenerationTask("foo bar") - - with pytest.raises(ValueError): - task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_prompt_task.py b/tests/unit/tasks/test_prompt_task.py index 083ea6da5..cfe853226 100644 --- a/tests/unit/tasks/test_prompt_task.py +++ b/tests/unit/tasks/test_prompt_task.py @@ -1,5 +1,3 @@ -import pytest - from griptape.artifacts.image_artifact import ImageArtifact from griptape.artifacts.list_artifact import ListArtifact from griptape.artifacts.text_artifact import TextArtifact @@ -9,13 +7,12 @@ from griptape.structures import Pipeline from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestPromptTask: def test_run(self): task = PromptTask("test") - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline.add_task(task) @@ -30,16 +27,10 @@ def test_to_text(self): def test_config_prompt_driver(self): task = PromptTask("test") - Pipeline(config=MockStructureConfig()).add_task(task) + Pipeline().add_task(task) assert isinstance(task.prompt_driver, MockPromptDriver) - def test_missing_prompt_driver(self): - task = PromptTask("test") - - with pytest.raises(ValueError): - task.prompt_driver # noqa: B018 - def test_input(self): # Str task = PromptTask("test") diff --git a/tests/unit/tasks/test_structure_run_task.py b/tests/unit/tasks/test_structure_run_task.py index 1053ade9e..d18d75d75 100644 --- a/tests/unit/tasks/test_structure_run_task.py +++ b/tests/unit/tasks/test_structure_run_task.py @@ -5,9 +5,11 @@ class TestStructureRunTask: - def test_run(self): - agent = Agent(prompt_driver=MockPromptDriver(mock_output="agent mock output")) - pipeline = Pipeline(prompt_driver=MockPromptDriver(mock_output="pipeline mock output")) + def test_run(self, mock_config): + mock_config.drivers.prompt = MockPromptDriver(mock_output="agent mock output") + agent = Agent() + mock_config.drivers.prompt = MockPromptDriver(mock_output="pipeline mock output") + pipeline = Pipeline() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) task = StructureRunTask(driver=driver) diff --git a/tests/unit/tasks/test_text_summary_task.py b/tests/unit/tasks/test_text_summary_task.py index bb08f9d31..f83075f2a 100644 --- a/tests/unit/tasks/test_text_summary_task.py +++ b/tests/unit/tasks/test_text_summary_task.py @@ -1,15 +1,12 @@ -import pytest - from griptape.engines import PromptSummaryEngine from griptape.structures import Agent from griptape.tasks import TextSummaryTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestTextSummaryTask: def test_run(self): - task = TextSummaryTask("test", summary_engine=PromptSummaryEngine(prompt_driver=MockPromptDriver())) + task = TextSummaryTask("test", summary_engine=PromptSummaryEngine()) agent = Agent() agent.add_task(task) @@ -26,13 +23,7 @@ def test_context_propagation(self): def test_config_summary_engine(self): task = TextSummaryTask("test") - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.summary_engine, PromptSummaryEngine) assert isinstance(task.summary_engine.prompt_driver, MockPromptDriver) - - def test_missing_summary_engine(self): - task = TextSummaryTask("test") - - with pytest.raises(ValueError): - task.summary_engine # noqa: B018 diff --git a/tests/unit/tasks/test_text_to_speech_task.py b/tests/unit/tasks/test_text_to_speech_task.py index bf1f19d5a..44348fef0 100644 --- a/tests/unit/tasks/test_text_to_speech_task.py +++ b/tests/unit/tasks/test_text_to_speech_task.py @@ -4,8 +4,6 @@ from griptape.engines import TextToSpeechEngine from griptape.structures import Agent, Pipeline from griptape.tasks import BaseTask, TextToSpeechTask -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestTextToSpeechTask: @@ -26,7 +24,7 @@ def callable_input(task: BaseTask) -> TextArtifact: def test_config_text_to_speech_engine(self): task = TextToSpeechTask("foo bar") - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.text_to_speech_engine, TextToSpeechEngine) @@ -41,7 +39,7 @@ def test_run(self): text_to_speech_engine.run.return_value = AudioArtifact(b"audio content", format="mp3") task = TextToSpeechTask("some text", text_to_speech_engine=text_to_speech_engine) - pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline = Pipeline() pipeline.add_task(task) assert isinstance(pipeline.run().output, AudioArtifact) diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index dfc679919..18521632e 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -5,7 +5,6 @@ from griptape.artifacts import TextArtifact from griptape.structures import Agent from griptape.tasks import ActionsSubtask, ToolTask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool from tests.utils import defaults @@ -166,13 +165,12 @@ class TestToolTask: } @pytest.fixture() - def agent(self): + def agent(self, mock_config): output_dict = {"tag": "foo", "name": "MockTool", "path": "test", "input": {"values": {"test": "foobar"}}} - return Agent( - prompt_driver=MockPromptDriver(mock_output=f"```python foo bar\n{json.dumps(output_dict)}"), - embedding_driver=MockEmbeddingDriver(), - ) + mock_config.drivers.prompt = MockPromptDriver(mock_output=f"```python foo bar\n{json.dumps(output_dict)}") + + return Agent() def test_run_without_memory(self, agent): task = ToolTask(tool=MockTool()) diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index cd5dd21f8..c1b91b1ed 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -2,7 +2,6 @@ from griptape.common import ToolAction from griptape.structures import Agent from griptape.tasks import ActionsSubtask, PromptTask, ToolkitTask -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool from tests.utils import defaults @@ -170,11 +169,12 @@ def test_init(self): except ValueError: assert True - def test_run(self): + def test_run(self, mock_config): output = """Answer: done""" + mock_config.drivers.prompt.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1"), MockTool(name="Tool2")]) - agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) + agent = Agent() agent.add_task(task) @@ -184,11 +184,12 @@ def test_run(self): assert len(task.subtasks) == 1 assert result.output_task.output.to_text() == "done" - def test_run_max_subtasks(self): + def test_run_max_subtasks(self, mock_config): output = 'Actions: [{"tag": "foo", "name": "Tool1", "path": "test", "input": {"values": {"test": "value"}}}]' + mock_config.drivers.prompt.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) - agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) + agent = Agent() agent.add_task(task) @@ -197,11 +198,12 @@ def test_run_max_subtasks(self): assert len(task.subtasks) == 3 assert isinstance(task.output, ErrorArtifact) - def test_run_invalid_react_prompt(self): + def test_run_invalid_react_prompt(self, mock_config): output = """foo bar""" + mock_config.drivers.prompt.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) - agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) + agent = Agent() agent.add_task(task) diff --git a/tests/unit/tasks/test_variation_image_generation_task.py b/tests/unit/tasks/test_variation_image_generation_task.py index a910fb8e0..f6afbf03e 100644 --- a/tests/unit/tasks/test_variation_image_generation_task.py +++ b/tests/unit/tasks/test_variation_image_generation_task.py @@ -8,7 +8,6 @@ from griptape.structures import Agent from griptape.tasks import BaseTask, VariationImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_structure_config import MockStructureConfig class TestVariationImageGenerationTask: @@ -48,13 +47,7 @@ def test_bad_input(self, image_artifact): def test_config_image_generation_engine(self, text_artifact, image_artifact): task = VariationImageGenerationTask((text_artifact, image_artifact)) - Agent(config=MockStructureConfig()).add_task(task) + Agent().add_task(task) assert isinstance(task.image_generation_engine, VariationImageGenerationEngine) assert isinstance(task.image_generation_engine.image_generation_driver, MockImageGenerationDriver) - - def test_missing_summary_engine(self, text_artifact, image_artifact): - task = VariationImageGenerationTask((text_artifact, image_artifact)) - - with pytest.raises(ValueError): - task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tools/test_structure_run_client.py b/tests/unit/tools/test_structure_run_client.py index d498b7c56..ee76d4da1 100644 --- a/tests/unit/tools/test_structure_run_client.py +++ b/tests/unit/tools/test_structure_run_client.py @@ -3,14 +3,12 @@ from griptape.drivers.structure_run.local_structure_run_driver import LocalStructureRunDriver from griptape.structures import Agent from griptape.tools import StructureRunClient -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStructureRunClient: @pytest.fixture() def client(self): - driver = MockPromptDriver() - agent = Agent(prompt_driver=driver) + agent = Agent() return StructureRunClient( description="foo bar", driver=LocalStructureRunDriver(structure_factory_fn=lambda: agent) diff --git a/tests/unit/utils/test_chat.py b/tests/unit/utils/test_chat.py index 42ecc59c3..5f97d1baf 100644 --- a/tests/unit/utils/test_chat.py +++ b/tests/unit/utils/test_chat.py @@ -1,14 +1,13 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Agent from griptape.utils import Chat -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestConversation: def test_init(self): import logging - agent = Agent(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + agent = Agent(conversation_memory=ConversationMemory()) chat = Chat( agent, diff --git a/tests/unit/utils/test_conversation.py b/tests/unit/utils/test_conversation.py index 28ee72409..a07d15cdb 100644 --- a/tests/unit/utils/test_conversation.py +++ b/tests/unit/utils/test_conversation.py @@ -2,12 +2,11 @@ from griptape.structures import Pipeline from griptape.tasks import PromptTask from griptape.utils import Conversation -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestConversation: def test_lines(self): - pipeline = Pipeline(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + pipeline = Pipeline(conversation_memory=ConversationMemory()) pipeline.add_tasks(PromptTask("question 1")) @@ -22,7 +21,7 @@ def test_lines(self): assert lines[3] == "A: mock output" def test_prompt_stack_conversation_memory(self): - pipeline = Pipeline(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + pipeline = Pipeline(conversation_memory=ConversationMemory()) pipeline.add_tasks(PromptTask("question 1")) @@ -36,8 +35,7 @@ def test_prompt_stack_conversation_memory(self): def test_prompt_stack_summary_conversation_memory(self): pipeline = Pipeline( - prompt_driver=MockPromptDriver(), - conversation_memory=SummaryConversationMemory(summary="foobar", prompt_driver=MockPromptDriver()), + conversation_memory=SummaryConversationMemory(summary="foobar"), ) pipeline.add_tasks(PromptTask("question 1")) @@ -52,7 +50,7 @@ def test_prompt_stack_summary_conversation_memory(self): assert lines[2] == "assistant: mock output" def test___str__(self): - pipeline = Pipeline(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) + pipeline = Pipeline(conversation_memory=ConversationMemory()) pipeline.add_tasks(PromptTask("question 1")) diff --git a/tests/unit/utils/test_file_utils.py b/tests/unit/utils/test_file_utils.py index a9c122126..00df6958d 100644 --- a/tests/unit/utils/test_file_utils.py +++ b/tests/unit/utils/test_file_utils.py @@ -3,7 +3,6 @@ from griptape import utils from griptape.loaders import TextLoader -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver MAX_TOKENS = 50 @@ -32,7 +31,7 @@ def test_load_files(self): def test_load_file_with_loader(self): dirname = os.path.dirname(__file__) file = utils.load_file(os.path.join(dirname, "../../", "resources/foobar-many.txt")) - artifacts = TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()).load(file) + artifacts = TextLoader(max_tokens=MAX_TOKENS).load(file) assert len(artifacts) == 39 assert isinstance(artifacts, list) @@ -43,7 +42,7 @@ def test_load_files_with_loader(self): sources = ["resources/foobar-many.txt"] sources = [os.path.join(dirname, "../../", source) for source in sources] files = utils.load_files(sources) - loader = TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) + loader = TextLoader(max_tokens=MAX_TOKENS) collection = loader.load_collection(list(files.values())) test_file_artifacts = collection[loader.to_key(files[utils.str_to_hash(sources[0])])] diff --git a/tests/unit/utils/test_stream.py b/tests/unit/utils/test_stream.py index da6695139..caddbb1a3 100644 --- a/tests/unit/utils/test_stream.py +++ b/tests/unit/utils/test_stream.py @@ -2,18 +2,17 @@ import pytest -from griptape.structures import Agent +from griptape.structures import Agent, Pipeline from griptape.utils import Stream -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStream: @pytest.fixture(params=[True, False]) def agent(self, request): - return Agent(prompt_driver=MockPromptDriver(stream=request.param, max_attempts=0)) + return Agent(stream=request.param) def test_init(self, agent): - if agent.prompt_driver.stream: + if agent.stream: chat_stream = Stream(agent) assert chat_stream.structure == agent @@ -28,3 +27,9 @@ def test_init(self, agent): else: with pytest.raises(ValueError): Stream(agent) + + def test_validate_structure_invalid(self): + pipeline = Pipeline(tasks=[]) + + with pytest.raises(ValueError): + Stream(pipeline) diff --git a/tests/unit/utils/test_structure_visualizer.py b/tests/unit/utils/test_structure_visualizer.py index f6e621b91..8a055cb21 100644 --- a/tests/unit/utils/test_structure_visualizer.py +++ b/tests/unit/utils/test_structure_visualizer.py @@ -1,12 +1,11 @@ from griptape.structures import Agent, Pipeline, Workflow from griptape.tasks import PromptTask from griptape.utils import StructureVisualizer -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStructureVisualizer: def test_agent(self): - agent = Agent(prompt_driver=MockPromptDriver(), tasks=[PromptTask("test1", id="task1")]) + agent = Agent(tasks=[PromptTask("test1", id="task1")]) visualizer = StructureVisualizer(agent) result = visualizer.to_url() @@ -15,7 +14,6 @@ def test_agent(self): def test_pipeline(self): pipeline = Pipeline( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1"), PromptTask("test2", id="task2"), @@ -34,7 +32,6 @@ def test_pipeline(self): def test_workflow(self): workflow = Workflow( - prompt_driver=MockPromptDriver(), tasks=[ PromptTask("test1", id="task1"), PromptTask("test2", id="task2", parent_ids=["task1"]), diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index 154f63ac4..8e9d45fb7 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -17,9 +17,9 @@ def text_tool_artifact_storage(): rag_engine=rag_engine(MockPromptDriver(), vector_store_driver), vector_store_driver=vector_store_driver, retrieval_rag_module_name="VectorStoreRetrievalRagModule", - summary_engine=PromptSummaryEngine(prompt_driver=MockPromptDriver()), - csv_extraction_engine=CsvExtractionEngine(prompt_driver=MockPromptDriver()), - json_extraction_engine=JsonExtractionEngine(prompt_driver=MockPromptDriver()), + summary_engine=PromptSummaryEngine(), + csv_extraction_engine=CsvExtractionEngine(), + json_extraction_engine=JsonExtractionEngine(), ) diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 5b908065b..d87fc095e 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -25,9 +25,7 @@ def get_enabled_prompt_drivers(prompt_drivers_options) -> list[BasePromptDriver]: return [ - prompt_driver_option.prompt_driver - for prompt_driver_option in prompt_drivers_options - if prompt_driver_option.enabled + prompt_driver_option.prompt for prompt_driver_option in prompt_drivers_options if prompt_driver_option.enabled ] @@ -228,6 +226,15 @@ def prompt_driver_id_fn(cls, prompt_driver) -> str: return f"{prompt_driver.__class__.__name__}-{prompt_driver.model}" def verify_structure_output(self, structure) -> dict: + from griptape.config import config + + config.drivers.prompt = AzureOpenAiChatPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="gpt-4o", + azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + response_format="json_object", + ) output_schema = Schema( { Literal("correct", description="Whether the output was correct or not."): bool, @@ -265,13 +272,6 @@ def verify_structure_output(self, structure) -> dict: ], ), ], - prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-4o", - azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - response_format="json_object", - ), tasks=[ PromptTask( "\nTasks: {{ task_names }}" diff --git a/tests/utils/test_reference_utils.py b/tests/utils/test_reference_utils.py index c3491f5d0..47da18713 100644 --- a/tests/utils/test_reference_utils.py +++ b/tests/utils/test_reference_utils.py @@ -1,12 +1,11 @@ from griptape.artifacts import TextArtifact from griptape.common import Reference from griptape.engines.rag.modules import PromptResponseRagModule -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestReferenceUtils: def test_references_from_artifacts(self): - module = PromptResponseRagModule(prompt_driver=MockPromptDriver()) + module = PromptResponseRagModule() reference1 = Reference(title="foo") reference2 = Reference(title="bar") artifacts = [ From 5fac21571560709a540886613efd007c094fdf74 Mon Sep 17 00:00:00 2001 From: James Clarendon Date: Tue, 13 Aug 2024 11:24:28 -0700 Subject: [PATCH 210/238] Update griptape-cloud-knowledge-base-client.md --- .../official-tools/griptape-cloud-knowledge-base-client.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md index e905b1596..28e89b4bb 100644 --- a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md +++ b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md @@ -2,7 +2,7 @@ The `GriptapeCloudKnowledgeBaseClient` is a lightweight Tool to retrieve data from a RAG pipeline and vector store hosted in [Griptape Cloud](https://cloud.griptape.ai). It enables searching across a centralized [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) that can consist of various data sources such as Confluence, Google Docs, and web pages. -**Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/keys) for access. +**Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/account/api-keys) for access. ```python --8<-- "docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py" From aea51bba280cadf8af3c3fcf0ff1693a36e2052e Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 13 Aug 2024 15:40:15 -0700 Subject: [PATCH 211/238] Rename all Tools for better naming consistency (#1060) --- CHANGELOG.md | 3 + README.md | 8 +- .../src/load_query_and_chat_marqo_1.py | 4 +- docs/examples/src/multi_agent_workflow_1.py | 12 +- .../src/multiple_agent_shared_memory_1.py | 6 +- docs/examples/src/query_webpage_astra_db_1.py | 6 +- docs/examples/src/talk_to_a_pdf_1.py | 6 +- docs/examples/src/talk_to_a_webpage_1.py | 6 +- docs/examples/src/talk_to_redshift_1.py | 6 +- docs/examples/talk-to-a-pdf.md | 2 +- docs/examples/talk-to-a-webpage.md | 2 +- .../src/audio_transcription_drivers_1.py | 4 +- .../drivers/src/embedding_drivers_10.py | 4 +- .../drivers/src/image_generation_drivers_1.py | 4 +- .../drivers/src/image_generation_drivers_2.py | 4 +- .../drivers/src/image_generation_drivers_3.py | 4 +- .../drivers/src/image_generation_drivers_4.py | 4 +- .../drivers/src/image_generation_drivers_5.py | 4 +- .../drivers/src/image_generation_drivers_6.py | 4 +- .../drivers/src/prompt_drivers_10.py | 4 +- .../drivers/src/text_to_speech_drivers_1.py | 4 +- .../drivers/src/text_to_speech_drivers_2.py | 4 +- .../drivers/src/web_scraper_drivers_3.py | 6 +- .../drivers/src/web_search_drivers_2.py | 6 +- .../drivers/structure-run-drivers.md | 2 +- docs/griptape-framework/index.md | 4 +- docs/griptape-framework/misc/src/events_3.py | 4 +- docs/griptape-framework/misc/src/events_4.py | 4 +- docs/griptape-framework/src/index_3.py | 4 +- docs/griptape-framework/src/index_4.py | 4 +- docs/griptape-framework/structures/agents.md | 2 +- .../structures/src/agents_1.py | 4 +- .../structures/src/task_memory_1.py | 6 +- .../structures/src/task_memory_2.py | 6 +- .../structures/src/task_memory_3.py | 6 +- .../structures/src/task_memory_4.py | 6 +- .../structures/src/task_memory_5.py | 6 +- .../structures/src/task_memory_6.py | 8 +- .../structures/src/task_memory_7.py | 4 +- .../structures/src/task_memory_8.py | 8 +- .../structures/src/task_memory_9.py | 4 +- .../structures/src/tasks_16.py | 12 +- .../structures/src/tasks_4.py | 4 +- .../structures/src/tasks_5.py | 4 +- .../structures/task-memory.md | 60 ++++----- docs/griptape-framework/structures/tasks.md | 4 +- docs/griptape-framework/tools/index.md | 2 +- docs/griptape-framework/tools/src/index_1.py | 4 +- ...-client.md => audio-transcription-tool.md} | 4 +- .../{aws-iam-client.md => aws-iam-tool.md} | 12 +- .../{aws-s3-client.md => aws-s3-tool.md} | 12 +- .../{calculator.md => calculator-tool.md} | 8 +- .../{computer.md => computer-tool.md} | 6 +- .../{date-time.md => date-time-tool.md} | 4 +- .../official-tools/email-client.md | 13 -- .../official-tools/email-tool.md | 13 ++ .../{file-manager.md => file-manager-tool.md} | 4 +- .../official-tools/google-cal-client.md | 8 -- .../official-tools/google-calendar-tool.md | 8 ++ ...gle-docs-client.md => google-docs-tool.md} | 10 +- ...e-drive-client.md => google-drive-tool.md} | 10 +- ...e-gmail-client.md => google-gmail-tool.md} | 10 +- .../griptape-cloud-knowledge-base-client.md | 9 -- .../griptape-cloud-knowledge-base-tool.md | 9 ++ ...ge-query-client.md => image-query-tool.md} | 4 +- ...md => inpainting-image-generation-tool.md} | 4 +- .../official-tools/openweather-client.md | 7 - .../official-tools/openweather-tool.md | 7 + ...d => outpainting-image-generation-tool.md} | 4 +- ...ent.md => prompt-image-generation-tool.md} | 4 +- .../{rag-client.md => rag-tool.md} | 8 +- .../{rest-api-client.md => rest-api-tool.md} | 6 +- .../{sql-client.md => sql-tool.md} | 12 +- ...ent_1.py => audio_transcription_tool_1.py} | 4 +- ...{aws_iam_client_1.py => aws_iam_tool_1.py} | 4 +- .../{aws_s3_client_1.py => aws_s3_tool_1.py} | 6 +- .../{calculator_1.py => calculator_tool_1.py} | 6 +- .../src/{computer_1.py => computer_tool_1.py} | 8 +- .../official-tools/src/date_time_1.py | 8 -- .../official-tools/src/date_time_tool_1.py | 8 ++ .../{email_client_1.py => email_tool_1.py} | 4 +- ...le_manager_1.py => file_manager_tool_1.py} | 6 +- ..._client_1.py => google_calendar_tool_1.py} | 10 +- ...docs_client_1.py => google_docs_tool_1.py} | 8 +- ...ive_client_1.py => google_drive_tool_1.py} | 8 +- ...ail_client_1.py => google_gmail_tool_1.py} | 8 +- ...> griptape_cloud_knowledge_base_tool_1.py} | 4 +- ...uery_client_1.py => image_query_tool_1.py} | 6 +- ... => inpainting_image_generation_tool_1.py} | 4 +- ...ther_client_1.py => openweather_tool_1.py} | 4 +- ...=> outpainting_image_generation_tool_1.py} | 4 +- ...1.py => prompt_image_generation_tool_1.py} | 4 +- .../src/{rag_client_1.py => rag_tool_1.py} | 6 +- ...est_api_client_1.py => rest_api_tool_1.py} | 4 +- .../src/{sql_client_1.py => sql_tool_1.py} | 4 +- ...un_client_1.py => structure_run_tool_1.py} | 6 +- .../src/task_memory_client_1.py | 4 - .../official-tools/src/task_memory_tool_1.py | 4 + ...h_client_1.py => text_to_speech_tool_1.py} | 4 +- ...y => variation_image_generation_tool_1.py} | 4 +- ...y => variation_image_generation_tool_2.py} | 6 +- ...ore_client_1.py => vector_store_tool_1.py} | 6 +- .../official-tools/src/web_scraper_1.py | 6 - .../official-tools/src/web_scraper_tool_1.py | 6 + .../{web_search_1.py => web_search_tool_1.py} | 8 +- .../{web_search_2.py => web_search_tool_2.py} | 4 +- ...re-run-client.md => structure-run-tool.md} | 10 +- ...k-memory-client.md => task-memory-tool.md} | 4 +- ...peech-client.md => text-to-speech-tool.md} | 4 +- ....md => variation-image-generation-tool.md} | 6 +- .../official-tools/vector-store-client.md | 7 - .../official-tools/vector-store-tool.md | 9 ++ .../{web-scraper.md => web-scraper-tool.md} | 6 +- .../{web-search.md => web-search-tool.md} | 6 +- griptape/tools/__init__.py | 124 +++++++++--------- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../{aws_iam_client => aws_iam}/__init__.py | 0 .../{aws_iam_client => aws_iam}/manifest.yml | 2 +- .../tools/{aws_iam_client => aws_iam}/tool.py | 4 +- .../{aws_s3_client => aws_s3}/__init__.py | 0 .../{aws_s3_client => aws_s3}/manifest.yml | 2 +- .../tools/{aws_s3_client => aws_s3}/tool.py | 4 +- .../{base_aws_client.py => base_aws_tool.py} | 2 +- ...e_google_client.py => base_google_tool.py} | 2 +- ..._client.py => base_griptape_cloud_tool.py} | 2 +- ...lient.py => base_image_generation_tool.py} | 2 +- griptape/tools/calculator/manifest.yml | 4 +- griptape/tools/calculator/tool.py | 2 +- griptape/tools/computer/manifest.yml | 4 +- griptape/tools/computer/tool.py | 2 +- griptape/tools/date_time/manifest.yml | 4 +- griptape/tools/date_time/tool.py | 2 +- .../tools/{email_client => email}/__init__.py | 0 .../{email_client => email}/manifest.yml | 2 +- .../tools/{email_client => email}/tool.py | 2 +- griptape/tools/file_manager/manifest.yml | 4 +- griptape/tools/file_manager/tool.py | 4 +- .../__init__.py | 0 .../manifest.yml | 0 .../requirements.txt | 0 .../{google_cal => google_calendar}/tool.py | 4 +- griptape/tools/google_docs/tool.py | 4 +- griptape/tools/google_drive/tool.py | 4 +- griptape/tools/google_gmail/manifest.yml | 2 +- griptape/tools/google_gmail/tool.py | 4 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 6 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../requirements.txt | 0 .../tool.py | 12 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../requirements.txt | 0 .../tool.py | 12 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../requirements.txt | 0 .../tool.py | 8 +- .../tools/{rag_client => rag}/__init__.py | 0 .../tools/{rag_client => rag}/manifest.yml | 2 +- .../{rag_client => rag}/requirements.txt | 0 griptape/tools/{rag_client => rag}/tool.py | 2 +- .../{rest_api_client => rest_api}/__init__.py | 0 .../manifest.yml | 2 +- .../{rest_api_client => rest_api}/tool.py | 2 +- .../tools/{sql_client => sql}/__init__.py | 0 .../tools/{sql_client => sql}/manifest.yml | 2 +- griptape/tools/{sql_client => sql}/tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../tool.py | 2 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../requirements.txt | 0 .../tool.py | 12 +- .../__init__.py | 0 .../manifest.yml | 2 +- .../requirements.txt | 0 .../tool.py | 2 +- griptape/tools/web_scraper/manifest.yml | 4 +- griptape/tools/web_scraper/tool.py | 2 +- griptape/tools/web_search/manifest.yml | 6 +- griptape/tools/web_search/tool.py | 2 +- mkdocs.yml | 56 ++++---- tests/integration/tasks/test_tool_task.py | 4 +- tests/integration/tasks/test_toolkit_task.py | 8 +- tests/integration/test_code_blocks.py | 2 +- ..._calculator.py => test_calculator_tool.py} | 4 +- ...e_manager.py => test_file_manager_tool.py} | 4 +- ...ocs_client.py => test_google_docs_tool.py} | 6 +- ...ve_client.py => test_google_drive_tool.py} | 6 +- .../{test_aws_iam.py => test_aws_iam_tool.py} | 12 +- .../{test_aws_s3.py => test_aws_s3_tool.py} | 25 ++-- tests/unit/tools/test_calculator.py | 4 +- tests/unit/tools/test_computer.py | 4 +- tests/unit/tools/test_date_time.py | 12 +- ...est_email_client.py => test_email_tool.py} | 12 +- tests/unit/tools/test_file_manager.py | 22 ++-- ...ocs_client.py => test_google_docs_tool.py} | 6 +- ...ve_client.py => test_google_drive_tool.py} | 18 +-- ...il_client.py => test_google_gmail_tool.py} | 6 +- ...est_griptape_cloud_knowledge_base_tool.py} | 20 +-- ... test_inpainting_image_generation_tool.py} | 14 +- ...her_client.py => test_openweather_tool.py} | 8 +- ... test_outpainting_image_variation_tool.py} | 14 +- ...y => test_prompt_image_generation_tool.py} | 12 +- .../{test_rag_client.py => test_rag_tool.py} | 6 +- ...st_api_client.py => test_rest_api_tool.py} | 4 +- .../{test_sql_client.py => test_sql_tool.py} | 8 +- ...n_client.py => test_structure_run_tool.py} | 6 +- ...ory_client.py => test_task_memory_tool.py} | 6 +- ..._client.py => test_text_to_speech_tool.py} | 12 +- ...n_client.py => test_transcription_tool.py} | 10 +- ...> test_variation_image_generation_tool.py} | 14 +- ...re_client.py => test_vector_store_tool.py} | 12 +- tests/unit/tools/test_web_scraper.py | 4 +- tests/unit/tools/test_web_search.py | 6 +- 233 files changed, 700 insertions(+), 696 deletions(-) rename docs/griptape-tools/official-tools/{audio-transcription-client.md => audio-transcription-tool.md} (90%) rename docs/griptape-tools/official-tools/{aws-iam-client.md => aws-iam-tool.md} (89%) rename docs/griptape-tools/official-tools/{aws-s3-client.md => aws-s3-tool.md} (90%) rename docs/griptape-tools/official-tools/{calculator.md => calculator-tool.md} (82%) rename docs/griptape-tools/official-tools/{computer.md => computer-tool.md} (97%) rename docs/griptape-tools/official-tools/{date-time.md => date-time-tool.md} (93%) delete mode 100644 docs/griptape-tools/official-tools/email-client.md create mode 100644 docs/griptape-tools/official-tools/email-tool.md rename docs/griptape-tools/official-tools/{file-manager.md => file-manager-tool.md} (94%) delete mode 100644 docs/griptape-tools/official-tools/google-cal-client.md create mode 100644 docs/griptape-tools/official-tools/google-calendar-tool.md rename docs/griptape-tools/official-tools/{google-docs-client.md => google-docs-tool.md} (79%) rename docs/griptape-tools/official-tools/{google-drive-client.md => google-drive-tool.md} (77%) rename docs/griptape-tools/official-tools/{google-gmail-client.md => google-gmail-tool.md} (78%) delete mode 100644 docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md create mode 100644 docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md rename docs/griptape-tools/official-tools/{image-query-client.md => image-query-tool.md} (58%) rename docs/griptape-tools/official-tools/{inpainting-image-generation-client.md => inpainting-image-generation-tool.md} (87%) delete mode 100644 docs/griptape-tools/official-tools/openweather-client.md create mode 100644 docs/griptape-tools/official-tools/openweather-tool.md rename docs/griptape-tools/official-tools/{outpainting-image-generation-client.md => outpainting-image-generation-tool.md} (86%) rename docs/griptape-tools/official-tools/{prompt-image-generation-client.md => prompt-image-generation-tool.md} (73%) rename docs/griptape-tools/official-tools/{rag-client.md => rag-tool.md} (86%) rename docs/griptape-tools/official-tools/{rest-api-client.md => rest-api-tool.md} (50%) rename docs/griptape-tools/official-tools/{sql-client.md => sql-tool.md} (90%) rename docs/griptape-tools/official-tools/src/{audio_transcription_client_1.py => audio_transcription_tool_1.py} (79%) rename docs/griptape-tools/official-tools/src/{aws_iam_client_1.py => aws_iam_tool_1.py} (72%) rename docs/griptape-tools/official-tools/src/{aws_s3_client_1.py => aws_s3_tool_1.py} (50%) rename docs/griptape-tools/official-tools/src/{calculator_1.py => calculator_tool_1.py} (56%) rename docs/griptape-tools/official-tools/src/{computer_1.py => computer_tool_1.py} (77%) delete mode 100644 docs/griptape-tools/official-tools/src/date_time_1.py create mode 100644 docs/griptape-tools/official-tools/src/date_time_tool_1.py rename docs/griptape-tools/official-tools/src/{email_client_1.py => email_tool_1.py} (79%) rename docs/griptape-tools/official-tools/src/{file_manager_1.py => file_manager_tool_1.py} (73%) rename docs/griptape-tools/official-tools/src/{google_cal_client_1.py => google_calendar_tool_1.py} (79%) rename docs/griptape-tools/official-tools/src/{google_docs_client_1.py => google_docs_tool_1.py} (85%) rename docs/griptape-tools/official-tools/src/{google_drive_client_1.py => google_drive_tool_1.py} (84%) rename docs/griptape-tools/official-tools/src/{google_gmail_client_1.py => google_gmail_tool_1.py} (85%) rename docs/griptape-tools/official-tools/src/{griptape_cloud_knowledge_base_client_1.py => griptape_cloud_knowledge_base_tool_1.py} (75%) rename docs/griptape-tools/official-tools/src/{image_query_client_1.py => image_query_tool_1.py} (80%) rename docs/griptape-tools/official-tools/src/{inpainting_image_generation_client_1.py => inpainting_image_generation_tool_1.py} (90%) rename docs/griptape-tools/official-tools/src/{openweather_client_1.py => openweather_tool_1.py} (75%) rename docs/griptape-tools/official-tools/src/{outpainting_image_generation_client_1.py => outpainting_image_generation_tool_1.py} (89%) rename docs/griptape-tools/official-tools/src/{prompt_image_generation_client_1.py => prompt_image_generation_tool_1.py} (89%) rename docs/griptape-tools/official-tools/src/{rag_client_1.py => rag_tool_1.py} (93%) rename docs/griptape-tools/official-tools/src/{rest_api_client_1.py => rest_api_tool_1.py} (98%) rename docs/griptape-tools/official-tools/src/{sql_client_1.py => sql_tool_1.py} (91%) rename docs/griptape-tools/official-tools/src/{structure_run_client_1.py => structure_run_tool_1.py} (83%) delete mode 100644 docs/griptape-tools/official-tools/src/task_memory_client_1.py create mode 100644 docs/griptape-tools/official-tools/src/task_memory_tool_1.py rename docs/griptape-tools/official-tools/src/{text_to_speech_client_1.py => text_to_speech_tool_1.py} (81%) rename docs/griptape-tools/official-tools/src/{variation_image_generation_client_1.py => variation_image_generation_tool_1.py} (90%) rename docs/griptape-tools/official-tools/src/{variation_image_generation_client_2.py => variation_image_generation_tool_2.py} (89%) rename docs/griptape-tools/official-tools/src/{vector_store_client_1.py => vector_store_tool_1.py} (81%) delete mode 100644 docs/griptape-tools/official-tools/src/web_scraper_1.py create mode 100644 docs/griptape-tools/official-tools/src/web_scraper_tool_1.py rename docs/griptape-tools/official-tools/src/{web_search_1.py => web_search_tool_1.py} (71%) rename docs/griptape-tools/official-tools/src/{web_search_2.py => web_search_tool_2.py} (91%) rename docs/griptape-tools/official-tools/{structure-run-client.md => structure-run-tool.md} (90%) rename docs/griptape-tools/official-tools/{task-memory-client.md => task-memory-tool.md} (74%) rename docs/griptape-tools/official-tools/{text-to-speech-client.md => text-to-speech-tool.md} (72%) rename docs/griptape-tools/official-tools/{variation-image-generation-client.md => variation-image-generation-tool.md} (83%) delete mode 100644 docs/griptape-tools/official-tools/vector-store-client.md create mode 100644 docs/griptape-tools/official-tools/vector-store-tool.md rename docs/griptape-tools/official-tools/{web-scraper.md => web-scraper-tool.md} (96%) rename docs/griptape-tools/official-tools/{web-search.md => web-search-tool.md} (97%) rename griptape/tools/{audio_transcription_client => audio_transcription}/__init__.py (100%) rename griptape/tools/{audio_transcription_client => audio_transcription}/manifest.yml (84%) rename griptape/tools/{audio_transcription_client => audio_transcription}/tool.py (98%) rename griptape/tools/{aws_iam_client => aws_iam}/__init__.py (100%) rename griptape/tools/{aws_iam_client => aws_iam}/manifest.yml (86%) rename griptape/tools/{aws_iam_client => aws_iam}/tool.py (97%) rename griptape/tools/{aws_s3_client => aws_s3}/__init__.py (100%) rename griptape/tools/{aws_s3_client => aws_s3}/manifest.yml (86%) rename griptape/tools/{aws_s3_client => aws_s3}/tool.py (99%) rename griptape/tools/{base_aws_client.py => base_aws_tool.py} (95%) rename griptape/tools/{base_google_client.py => base_google_tool.py} (98%) rename griptape/tools/{base_griptape_cloud_client.py => base_griptape_cloud_tool.py} (93%) rename griptape/tools/{base_image_generation_client.py => base_image_generation_tool.py} (88%) rename griptape/tools/{email_client => email}/__init__.py (100%) rename griptape/tools/{email_client => email}/manifest.yml (87%) rename griptape/tools/{email_client => email}/tool.py (99%) rename griptape/tools/{google_cal => google_calendar}/__init__.py (100%) rename griptape/tools/{google_cal => google_calendar}/manifest.yml (100%) rename griptape/tools/{google_cal => google_calendar}/requirements.txt (100%) rename griptape/tools/{google_cal => google_calendar}/tool.py (98%) rename griptape/tools/{griptape_cloud_knowledge_base_client => griptape_cloud_knowledge_base}/__init__.py (100%) rename griptape/tools/{griptape_cloud_knowledge_base_client => griptape_cloud_knowledge_base}/manifest.yml (78%) rename griptape/tools/{griptape_cloud_knowledge_base_client => griptape_cloud_knowledge_base}/tool.py (91%) rename griptape/tools/{image_query_client => image_query}/__init__.py (100%) rename griptape/tools/{image_query_client => image_query}/manifest.yml (86%) rename griptape/tools/{image_query_client => image_query}/tool.py (99%) rename griptape/tools/{inpainting_image_generation_client => inpainting_image_generation}/__init__.py (100%) rename griptape/tools/{inpainting_image_generation_client => inpainting_image_generation}/manifest.yml (79%) rename griptape/tools/{inpainting_image_generation_client => inpainting_image_generation}/requirements.txt (100%) rename griptape/tools/{inpainting_image_generation_client => inpainting_image_generation}/tool.py (93%) rename griptape/tools/{openweather_client => openweather}/__init__.py (100%) rename griptape/tools/{openweather_client => openweather}/manifest.yml (86%) rename griptape/tools/{openweather_client => openweather}/tool.py (99%) rename griptape/tools/{outpainting_image_generation_client => outpainting_image_generation}/__init__.py (100%) rename griptape/tools/{outpainting_image_generation_client => outpainting_image_generation}/manifest.yml (79%) rename griptape/tools/{outpainting_image_generation_client => outpainting_image_generation}/requirements.txt (100%) rename griptape/tools/{outpainting_image_generation_client => outpainting_image_generation}/tool.py (93%) rename griptape/tools/{prompt_image_generation_client => prompt_image_generation}/__init__.py (100%) rename griptape/tools/{prompt_image_generation_client => prompt_image_generation}/manifest.yml (80%) rename griptape/tools/{prompt_image_generation_client => prompt_image_generation}/requirements.txt (100%) rename griptape/tools/{prompt_image_generation_client => prompt_image_generation}/tool.py (87%) rename griptape/tools/{rag_client => rag}/__init__.py (100%) rename griptape/tools/{rag_client => rag}/manifest.yml (88%) rename griptape/tools/{rag_client => rag}/requirements.txt (100%) rename griptape/tools/{rag_client => rag}/tool.py (97%) rename griptape/tools/{rest_api_client => rest_api}/__init__.py (100%) rename griptape/tools/{rest_api_client => rest_api}/manifest.yml (87%) rename griptape/tools/{rest_api_client => rest_api}/tool.py (99%) rename griptape/tools/{sql_client => sql}/__init__.py (100%) rename griptape/tools/{sql_client => sql}/manifest.yml (88%) rename griptape/tools/{sql_client => sql}/tool.py (98%) rename griptape/tools/{structure_run_client => structure_run}/__init__.py (100%) rename griptape/tools/{structure_run_client => structure_run}/manifest.yml (83%) rename griptape/tools/{structure_run_client => structure_run}/tool.py (97%) rename griptape/tools/{task_memory_client => task_memory}/__init__.py (100%) rename griptape/tools/{task_memory_client => task_memory}/manifest.yml (85%) rename griptape/tools/{task_memory_client => task_memory}/tool.py (98%) rename griptape/tools/{text_to_speech_client => text_to_speech}/__init__.py (100%) rename griptape/tools/{text_to_speech_client => text_to_speech}/manifest.yml (83%) rename griptape/tools/{text_to_speech_client => text_to_speech}/tool.py (95%) rename griptape/tools/{variation_image_generation_client => variation_image_generation}/__init__.py (100%) rename griptape/tools/{variation_image_generation_client => variation_image_generation}/manifest.yml (79%) rename griptape/tools/{variation_image_generation_client => variation_image_generation}/requirements.txt (100%) rename griptape/tools/{variation_image_generation_client => variation_image_generation}/tool.py (91%) rename griptape/tools/{vector_store_client => vector_store}/__init__.py (100%) rename griptape/tools/{vector_store_client => vector_store}/manifest.yml (85%) rename griptape/tools/{vector_store_client => vector_store}/requirements.txt (100%) rename griptape/tools/{vector_store_client => vector_store}/tool.py (98%) rename tests/integration/tools/{test_calculator.py => test_calculator_tool.py} (73%) rename tests/integration/tools/{test_file_manager.py => test_file_manager_tool.py} (79%) rename tests/integration/tools/{test_google_docs_client.py => test_google_docs_tool.py} (95%) rename tests/integration/tools/{test_google_drive_client.py => test_google_drive_tool.py} (94%) rename tests/unit/tools/{test_aws_iam.py => test_aws_iam_tool.py} (56%) rename tests/unit/tools/{test_aws_s3.py => test_aws_s3_tool.py} (58%) rename tests/unit/tools/{test_email_client.py => test_email_tool.py} (93%) rename tests/unit/tools/{test_google_docs_client.py => test_google_docs_tool.py} (84%) rename tests/unit/tools/{test_google_drive_client.py => test_google_drive_tool.py} (68%) rename tests/unit/tools/{test_google_gmail_client.py => test_google_gmail_tool.py} (61%) rename tests/unit/tools/{test_griptape_cloud_knowledge_base_client.py => test_griptape_cloud_knowledge_base_tool.py} (83%) rename tests/unit/tools/{test_inpainting_image_generation_client.py => test_inpainting_image_generation_tool.py} (87%) rename tests/unit/tools/{test_openweather_client.py => test_openweather_tool.py} (92%) rename tests/unit/tools/{test_outpainting_image_variation_client.py => test_outpainting_image_variation_tool.py} (87%) rename tests/unit/tools/{test_prompt_image_generation_client.py => test_prompt_image_generation_tool.py} (77%) rename tests/unit/tools/{test_rag_client.py => test_rag_tool.py} (72%) rename tests/unit/tools/{test_rest_api_client.py => test_rest_api_tool.py} (92%) rename tests/unit/tools/{test_sql_client.py => test_sql_tool.py} (87%) rename tests/unit/tools/{test_structure_run_client.py => test_structure_run_tool.py} (82%) rename tests/unit/tools/{test_task_memory_client.py => test_task_memory_tool.py} (80%) rename tests/unit/tools/{test_text_to_speech_client.py => test_text_to_speech_tool.py} (74%) rename tests/unit/tools/{test_transcription_client.py => test_transcription_tool.py} (83%) rename tests/unit/tools/{test_variation_image_generation_client.py => test_variation_image_generation_tool.py} (88%) rename tests/unit/tools/{test_vector_store_client.py => test_vector_store_tool.py} (78%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b7b08f36..ef91010ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly. - **BREAKING**: Removed before and after response modules from `ResponseRagStage`. - **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`. +- **BREAKING**: Dropped `Client` from all Tool names for better naming consistency. +- **BREAKING**: Dropped `_client` suffix from all Tool packages. +- **BREAKING**: Added `Tool` suffix to all Tool names for better naming consistency. - Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. diff --git a/README.md b/README.md index 42df8fbd6..1f6d6d883 100644 --- a/README.md +++ b/README.md @@ -89,14 +89,14 @@ With Griptape, you can create Structures, such as Agents, Pipelines, and Workflo ```python from griptape.structures import Agent -from griptape.tools import WebScraper, FileManager, TaskMemoryClient +from griptape.tools import WebScraperTool, FileManagerTool, TaskMemoryTool agent = Agent( input="Load {{ args[0] }}, summarize it, and store it in a file called {{ args[1] }}.", tools=[ - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=True), - FileManager() + WebScraperTool(off_prompt=True), + TaskMemoryTool(off_prompt=True), + FileManagerTool() ] ) agent.run("https://griptape.ai", "griptape.txt") diff --git a/docs/examples/src/load_query_and_chat_marqo_1.py b/docs/examples/src/load_query_and_chat_marqo_1.py index ac3ffca0d..013a0264f 100644 --- a/docs/examples/src/load_query_and_chat_marqo_1.py +++ b/docs/examples/src/load_query_and_chat_marqo_1.py @@ -5,7 +5,7 @@ from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import VectorStoreClient +from griptape.tools import VectorStoreTool # Define the namespace namespace = "griptape-ai" @@ -19,7 +19,7 @@ ) # Initialize the knowledge base tool -vector_store_tool = VectorStoreClient( +vector_store_tool = VectorStoreTool( description="Contains information about the Griptape Framework from www.griptape.ai", vector_store_driver=vector_store, ) diff --git a/docs/examples/src/multi_agent_workflow_1.py b/docs/examples/src/multi_agent_workflow_1.py index 311fa22a2..137a5075f 100644 --- a/docs/examples/src/multi_agent_workflow_1.py +++ b/docs/examples/src/multi_agent_workflow_1.py @@ -5,9 +5,9 @@ from griptape.structures import Agent, Workflow from griptape.tasks import PromptTask, StructureRunTask from griptape.tools import ( - TaskMemoryClient, - WebScraper, - WebSearch, + TaskMemoryTool, + WebScraperTool, + WebSearchTool, ) WRITERS = [ @@ -29,16 +29,16 @@ def build_researcher() -> Agent: researcher = Agent( id="researcher", tools=[ - WebSearch( + WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"], ), ), - WebScraper( + WebScraperTool( off_prompt=True, ), - TaskMemoryClient(off_prompt=False), + TaskMemoryTool(off_prompt=False), ], rulesets=[ Ruleset( diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index 118684d37..e156e531a 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -3,7 +3,7 @@ from griptape.config import AzureOpenAiDriverConfig, config from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] AZURE_OPENAI_API_KEY_1 = os.environ["AZURE_OPENAI_API_KEY_1"] @@ -41,12 +41,12 @@ loader = Agent( tools=[ - WebScraper(off_prompt=True), + WebScraperTool(off_prompt=True), ], ) asker = Agent( tools=[ - TaskMemoryClient(off_prompt=False), + TaskMemoryTool(off_prompt=False), ], meta_memory=loader.meta_memory, task_memory=loader.task_memory, diff --git a/docs/examples/src/query_webpage_astra_db_1.py b/docs/examples/src/query_webpage_astra_db_1.py index b5d2b0a01..6a96a813e 100644 --- a/docs/examples/src/query_webpage_astra_db_1.py +++ b/docs/examples/src/query_webpage_astra_db_1.py @@ -14,7 +14,7 @@ from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import RagClient, TaskMemoryClient +from griptape.tools import RagTool, TaskMemoryTool namespace = "datastax_blog" input_blogpost = "www.datastax.com/blog/indexing-all-of-wikipedia-on-a-laptop" @@ -49,9 +49,9 @@ raise Exception(artifacts.value) vector_store_driver.upsert_text_artifacts({namespace: artifacts}) -vector_store_tool = RagClient( +rag_tool = RagTool( description="A DataStax blog post", rag_engine=engine, ) -agent = Agent(tools=[vector_store_tool, TaskMemoryClient(off_prompt=False)]) +agent = Agent(tools=[rag_tool, TaskMemoryTool(off_prompt=False)]) agent.run("What engine made possible to index such an amount of data, " "and what kind of tuning was required?") diff --git a/docs/examples/src/talk_to_a_pdf_1.py b/docs/examples/src/talk_to_a_pdf_1.py index 2ac184a22..b4ab72029 100644 --- a/docs/examples/src/talk_to_a_pdf_1.py +++ b/docs/examples/src/talk_to_a_pdf_1.py @@ -7,7 +7,7 @@ from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.loaders import PdfLoader from griptape.structures import Agent -from griptape.tools import RagClient +from griptape.tools import RagTool from griptape.utils import Chat namespace = "attention" @@ -25,7 +25,7 @@ response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] ), ) -vector_store_tool = RagClient( +rag_tool = RagTool( description="Contains information about the Attention Is All You Need paper. " "Use it to answer any related questions.", rag_engine=engine, @@ -37,6 +37,6 @@ vector_store.upsert_text_artifacts({namespace: artifacts}) -agent = Agent(tools=[vector_store_tool]) +agent = Agent(tools=[rag_tool]) Chat(agent).start() diff --git a/docs/examples/src/talk_to_a_webpage_1.py b/docs/examples/src/talk_to_a_webpage_1.py index d24eb9427..0412ed977 100644 --- a/docs/examples/src/talk_to_a_webpage_1.py +++ b/docs/examples/src/talk_to_a_webpage_1.py @@ -6,7 +6,7 @@ from griptape.loaders import WebLoader from griptape.rules import Rule, Ruleset from griptape.structures import Agent -from griptape.tools import RagClient +from griptape.tools import RagTool from griptape.utils import Chat namespace = "physics-wiki" @@ -33,7 +33,7 @@ vector_store_driver.upsert_text_artifacts({namespace: artifacts}) -vector_store_tool = RagClient( +rag_tool = RagTool( description="Contains information about physics. " "Use it to answer any physics-related questions.", rag_engine=engine, ) @@ -45,7 +45,7 @@ rules=[Rule("Always introduce yourself as a physics tutor"), Rule("Be truthful. Only discuss physics.")], ) ], - tools=[vector_store_tool], + tools=[rag_tool], ) Chat(agent).start() diff --git a/docs/examples/src/talk_to_redshift_1.py b/docs/examples/src/talk_to_redshift_1.py index 7354a77cc..bd4b57f4f 100644 --- a/docs/examples/src/talk_to_redshift_1.py +++ b/docs/examples/src/talk_to_redshift_1.py @@ -6,7 +6,7 @@ from griptape.loaders import SqlLoader from griptape.rules import Rule, Ruleset from griptape.structures import Agent -from griptape.tools import FileManager, SqlClient +from griptape.tools import FileManagerTool, SqlTool from griptape.utils import Chat session = boto3.Session() @@ -19,7 +19,7 @@ ) ) -sql_tool = SqlClient( +sql_tool = SqlTool( sql_loader=sql_loader, table_name="people", table_description="contains information about tech industry professionals", @@ -27,7 +27,7 @@ ) agent = Agent( - tools=[sql_tool, FileManager()], + tools=[sql_tool, FileManagerTool()], rulesets=[ Ruleset( name="HumansOrg Agent", diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md index 2e0743ae4..0524359d5 100644 --- a/docs/examples/talk-to-a-pdf.md +++ b/docs/examples/talk-to-a-pdf.md @@ -1,4 +1,4 @@ -This example demonstrates how to vectorize a PDF of the [Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf) paper and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. +This example demonstrates how to vectorize a PDF of the [Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf) paper and setup a Griptape agent with rules and the [VectorStoreTool](../reference/griptape/tools/vector_store/tool.md) tool to use it during conversations. ```python --8<-- "docs/examples/src/talk_to_a_pdf_1.py" diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md index 2bee2c9ba..e4632d401 100644 --- a/docs/examples/talk-to-a-webpage.md +++ b/docs/examples/talk-to-a-webpage.md @@ -1,4 +1,4 @@ -This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [RagClient](../reference/griptape/tools/rag_client/tool.md) tool to use it during conversations. +This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [RagClient](../reference/griptape/tools/rag/tool.md) tool to use it during conversations. ```python --8<-- "docs/examples/src/talk_to_a_webpage_1.py" diff --git a/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py b/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py index e4415e1d4..16013638e 100644 --- a/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py +++ b/docs/griptape-framework/drivers/src/audio_transcription_drivers_1.py @@ -1,11 +1,11 @@ from griptape.drivers import OpenAiAudioTranscriptionDriver from griptape.engines import AudioTranscriptionEngine from griptape.structures import Agent -from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient +from griptape.tools.audio_transcription.tool import AudioTranscriptionTool driver = OpenAiAudioTranscriptionDriver(model="whisper-1") -tool = AudioTranscriptionClient( +tool = AudioTranscriptionTool( off_prompt=False, engine=AudioTranscriptionEngine( audio_transcription_driver=driver, diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index 3ef816b29..4f7560c99 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -4,7 +4,7 @@ VoyageAiEmbeddingDriver, ) from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool config.drivers = DriverConfig( prompt=OpenAiChatPromptDriver(model="gpt-4o"), @@ -12,7 +12,7 @@ ) agent = Agent( - tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], ) agent.run("based on https://www.griptape.ai/, tell me what Griptape is") diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_1.py b/docs/griptape-framework/drivers/src/image_generation_drivers_1.py index 637b6ec7a..b20a42265 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_1.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_1.py @@ -1,7 +1,7 @@ from griptape.drivers import OpenAiImageGenerationDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool driver = OpenAiImageGenerationDriver( model="dall-e-2", @@ -11,7 +11,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_2.py b/docs/griptape-framework/drivers/src/image_generation_drivers_2.py index 63663ae79..ab07fcb27 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_2.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_2.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool model_driver = BedrockStableDiffusionImageGenerationModelDriver( style_preset="pixel-art", @@ -16,7 +16,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_3.py b/docs/griptape-framework/drivers/src/image_generation_drivers_3.py index 630d80f20..b8c63589d 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_3.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_3.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockTitanImageGenerationModelDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool model_driver = BedrockTitanImageGenerationModelDriver() @@ -14,7 +14,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_4.py b/docs/griptape-framework/drivers/src/image_generation_drivers_4.py index 428f470cf..f1bc06200 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_4.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_4.py @@ -3,7 +3,7 @@ from griptape.drivers import AzureOpenAiImageGenerationDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool driver = AzureOpenAiImageGenerationDriver( model="dall-e-3", @@ -16,7 +16,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_5.py b/docs/griptape-framework/drivers/src/image_generation_drivers_5.py index 06157107f..46173a232 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_5.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_5.py @@ -3,7 +3,7 @@ from griptape.drivers import LeonardoImageGenerationDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool driver = LeonardoImageGenerationDriver( model=os.environ["LEONARDO_MODEL_ID"], @@ -16,7 +16,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/image_generation_drivers_6.py b/docs/griptape-framework/drivers/src/image_generation_drivers_6.py index feb8a54d7..d295da4ff 100644 --- a/docs/griptape-framework/drivers/src/image_generation_drivers_6.py +++ b/docs/griptape-framework/drivers/src/image_generation_drivers_6.py @@ -1,7 +1,7 @@ from griptape.drivers import OpenAiImageGenerationDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool driver = OpenAiImageGenerationDriver( model="dall-e-2", @@ -12,7 +12,7 @@ agent = Agent( tools=[ - PromptImageGenerationClient(engine=engine), + PromptImageGenerationTool(engine=engine), ] ) diff --git a/docs/griptape-framework/drivers/src/prompt_drivers_10.py b/docs/griptape-framework/drivers/src/prompt_drivers_10.py index 04e2acb35..1d757668c 100644 --- a/docs/griptape-framework/drivers/src/prompt_drivers_10.py +++ b/docs/griptape-framework/drivers/src/prompt_drivers_10.py @@ -1,11 +1,11 @@ from griptape.drivers import OllamaPromptDriver from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool agent = Agent( prompt_driver=OllamaPromptDriver( model="llama3.1", ), - tools=[Calculator()], + tools=[CalculatorTool()], ) agent.run("What is (192 + 12) ^ 4") diff --git a/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py b/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py index c6a03b80d..376113d63 100644 --- a/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py +++ b/docs/griptape-framework/drivers/src/text_to_speech_drivers_1.py @@ -3,7 +3,7 @@ from griptape.drivers import ElevenLabsTextToSpeechDriver from griptape.engines import TextToSpeechEngine from griptape.structures import Agent -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.tools.text_to_speech.tool import TextToSpeechTool driver = ElevenLabsTextToSpeechDriver( api_key=os.environ["ELEVEN_LABS_API_KEY"], @@ -11,7 +11,7 @@ voice="Matilda", ) -tool = TextToSpeechClient( +tool = TextToSpeechTool( engine=TextToSpeechEngine( text_to_speech_driver=driver, ), diff --git a/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py b/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py index 99927a390..4a6323b1b 100644 --- a/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py +++ b/docs/griptape-framework/drivers/src/text_to_speech_drivers_2.py @@ -1,11 +1,11 @@ from griptape.drivers import OpenAiTextToSpeechDriver from griptape.engines import TextToSpeechEngine from griptape.structures import Agent -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.tools.text_to_speech.tool import TextToSpeechTool driver = OpenAiTextToSpeechDriver() -tool = TextToSpeechClient( +tool = TextToSpeechTool( engine=TextToSpeechEngine( text_to_speech_driver=driver, ), diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py index d9fe11e85..d4c77c2ae 100644 --- a/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py @@ -1,15 +1,15 @@ from griptape.drivers import MarkdownifyWebScraperDriver from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool agent = Agent( tools=[ - WebScraper( + WebScraperTool( web_loader=WebLoader(web_scraper_driver=MarkdownifyWebScraperDriver(timeout=1000)), off_prompt=True, ), - TaskMemoryClient(off_prompt=False), + TaskMemoryTool(off_prompt=False), ], ) agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") diff --git a/docs/griptape-framework/drivers/src/web_search_drivers_2.py b/docs/griptape-framework/drivers/src/web_search_drivers_2.py index 5cde1a9a8..a33b8c00c 100644 --- a/docs/griptape-framework/drivers/src/web_search_drivers_2.py +++ b/docs/griptape-framework/drivers/src/web_search_drivers_2.py @@ -2,17 +2,17 @@ from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebSearch +from griptape.tools import TaskMemoryTool, WebSearchTool agent = Agent( tools=[ - WebSearch( + WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"], ), ), - TaskMemoryClient(off_prompt=False), + TaskMemoryTool(off_prompt=False), ], ) agent.run("Give me some websites with information about AI frameworks.") diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index 00890cb4a..1f57ff57e 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -5,7 +5,7 @@ search: ## Overview Structure Run Drivers can be used to run Griptape Structures in a variety of runtime environments. -When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Client](../../griptape-tools/official-tools/structure-run-client.md) you can create complex, multi-agent pipelines that span multiple runtime environments. +When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Tool](../../griptape-tools/official-tools/structure-run-tool.md) you can create complex, multi-agent pipelines that span multiple runtime environments. ## Structure Run Drivers diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index 52805897d..ff3670e6e 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -103,7 +103,7 @@ Here is the chain of thought from the Agent. Notice where it realizes it can use Actions: [ { "tag": "call_RTRm7JLFV0F73dCVPmoWVJqO", - "name": "Calculator", + "name": "CalculatorTool", "path": "calculate", "input": { "values": { @@ -144,7 +144,7 @@ Agents are great for getting started, but they are intentionally limited to a si [09/08/23 10:02:53] INFO Subtask 8023e3d257274df29065b22e736faca8 Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity to summarize the content. - Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d"}}} + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d"}}} [09/08/23 10:02:57] INFO Subtask 8023e3d257274df29065b22e736faca8 Response: Griptape is an open source framework that allows developers to build and deploy AI applications using large language models (LLMs). It provides the ability to create conversational and event-driven apps that diff --git a/docs/griptape-framework/misc/src/events_3.py b/docs/griptape-framework/misc/src/events_3.py index bae8b8224..2a567debe 100644 --- a/docs/griptape-framework/misc/src/events_3.py +++ b/docs/griptape-framework/misc/src/events_3.py @@ -4,7 +4,7 @@ from griptape.events import CompletionChunkEvent, EventListener, event_bus from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool event_bus.add_event_listeners( [ @@ -20,7 +20,7 @@ ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True), - tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], ) ) diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py index f5523cb11..a66e77b1d 100644 --- a/docs/griptape-framework/misc/src/events_4.py +++ b/docs/griptape-framework/misc/src/events_4.py @@ -1,13 +1,13 @@ from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool from griptape.utils import Stream pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", - tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], ) ) diff --git a/docs/griptape-framework/src/index_3.py b/docs/griptape-framework/src/index_3.py index 043fc75f7..ac153b15f 100644 --- a/docs/griptape-framework/src/index_3.py +++ b/docs/griptape-framework/src/index_3.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool -calculator = Calculator() +calculator = CalculatorTool() agent = Agent(tools=[calculator]) diff --git a/docs/griptape-framework/src/index_4.py b/docs/griptape-framework/src/index_4.py index 0bb345438..dd07280ce 100644 --- a/docs/griptape-framework/src/index_4.py +++ b/docs/griptape-framework/src/index_4.py @@ -1,7 +1,7 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import PromptTask, ToolkitTask -from griptape.tools import FileManager, TaskMemoryClient, WebScraper +from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool # Pipelines represent sequences of tasks. pipeline = Pipeline(conversation_memory=ConversationMemory()) @@ -11,7 +11,7 @@ ToolkitTask( "{{ args[0] }}", # Add tools for web scraping, and file management - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], ), # Augment `input` from the previous task. PromptTask("Say the following in spanish: {{ parent_output }}"), diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 2f28b336c..376e7288a 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -27,7 +27,7 @@ You can access the final output of the Agent by using the [output](../../referen Actions: [ { "tag": "call_ZSCH6vNoycOgtPJH2DL2U9ji", - "name": "Calculator", + "name": "CalculatorTool", "path": "calculate", "input": { "values": { diff --git a/docs/griptape-framework/structures/src/agents_1.py b/docs/griptape-framework/structures/src/agents_1.py index 20d04004d..9ce4aec22 100644 --- a/docs/griptape-framework/structures/src/agents_1.py +++ b/docs/griptape-framework/structures/src/agents_1.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool -agent = Agent(input="Calculate the following: {{ args[0] }}", tools=[Calculator()]) +agent = Agent(input="Calculate the following: {{ args[0] }}", tools=[CalculatorTool()]) agent.run("what's 13^7?") print("Answer:", agent.output) diff --git a/docs/griptape-framework/structures/src/task_memory_1.py b/docs/griptape-framework/structures/src/task_memory_1.py index 90940a611..e8cfbd8ac 100644 --- a/docs/griptape-framework/structures/src/task_memory_1.py +++ b/docs/griptape-framework/structures/src/task_memory_1.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool -# Create an agent with the Calculator tool -agent = Agent(tools=[Calculator(off_prompt=False)]) +# Create an agent with the CalculatorTool tool +agent = Agent(tools=[CalculatorTool(off_prompt=False)]) agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-framework/structures/src/task_memory_2.py b/docs/griptape-framework/structures/src/task_memory_2.py index dcc5b4d5c..9ff24e1ff 100644 --- a/docs/griptape-framework/structures/src/task_memory_2.py +++ b/docs/griptape-framework/structures/src/task_memory_2.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool -# Create an agent with the Calculator tool -agent = Agent(tools=[Calculator(off_prompt=True)]) +# Create an agent with the CalculatorTool tool +agent = Agent(tools=[CalculatorTool(off_prompt=True)]) agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-framework/structures/src/task_memory_3.py b/docs/griptape-framework/structures/src/task_memory_3.py index cab4f4e3e..926a21cd3 100644 --- a/docs/griptape-framework/structures/src/task_memory_3.py +++ b/docs/griptape-framework/structures/src/task_memory_3.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import Calculator, TaskMemoryClient +from griptape.tools import CalculatorTool, TaskMemoryTool -# Create an agent with the Calculator tool -agent = Agent(tools=[Calculator(off_prompt=True), TaskMemoryClient(off_prompt=False)]) +# Create an agent with the CalculatorTool tool +agent = Agent(tools=[CalculatorTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) agent.run("What is the square root of 12345?") diff --git a/docs/griptape-framework/structures/src/task_memory_4.py b/docs/griptape-framework/structures/src/task_memory_4.py index d192bebb7..cfd6d5711 100644 --- a/docs/griptape-framework/structures/src/task_memory_4.py +++ b/docs/griptape-framework/structures/src/task_memory_4.py @@ -1,8 +1,8 @@ from griptape.structures import Agent -from griptape.tools import WebScraper +from griptape.tools import WebScraperTool -# Create an agent with the WebScraper tool -agent = Agent(tools=[WebScraper()]) +# Create an agent with the WebScraperTool tool +agent = Agent(tools=[WebScraperTool()]) agent.run( "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" diff --git a/docs/griptape-framework/structures/src/task_memory_5.py b/docs/griptape-framework/structures/src/task_memory_5.py index a5d3995a9..a53d106b4 100644 --- a/docs/griptape-framework/structures/src/task_memory_5.py +++ b/docs/griptape-framework/structures/src/task_memory_5.py @@ -1,10 +1,10 @@ from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool agent = Agent( tools=[ - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=False), + WebScraperTool(off_prompt=True), + TaskMemoryTool(off_prompt=False), ] ) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index fb5c3eabb..3f4d14b0a 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -14,7 +14,7 @@ from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.structures import Agent -from griptape.tools import FileManager, TaskMemoryClient, WebScraper +from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool config.drivers = OpenAiDriverConfig( prompt=OpenAiChatPromptDriver(model="gpt-4"), @@ -45,9 +45,9 @@ } ), tools=[ - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=True, allowlist=["query"]), - FileManager(off_prompt=True), + WebScraperTool(off_prompt=True), + TaskMemoryTool(off_prompt=True, allowlist=["query"]), + FileManagerTool(off_prompt=True), ], ) diff --git a/docs/griptape-framework/structures/src/task_memory_7.py b/docs/griptape-framework/structures/src/task_memory_7.py index 1ffec43e8..d2f07466f 100644 --- a/docs/griptape-framework/structures/src/task_memory_7.py +++ b/docs/griptape-framework/structures/src/task_memory_7.py @@ -1,9 +1,9 @@ from griptape.structures import Agent -from griptape.tools import WebScraper +from griptape.tools import WebScraperTool agent = Agent( tools=[ - WebScraper(off_prompt=True) # `off_prompt=True` will store the data in Task Memory + WebScraperTool(off_prompt=True) # `off_prompt=True` will store the data in Task Memory # Missing a Tool that can read from Task Memory ] ) diff --git a/docs/griptape-framework/structures/src/task_memory_8.py b/docs/griptape-framework/structures/src/task_memory_8.py index 9aba9516f..846119228 100644 --- a/docs/griptape-framework/structures/src/task_memory_8.py +++ b/docs/griptape-framework/structures/src/task_memory_8.py @@ -1,12 +1,10 @@ from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper +from griptape.tools import TaskMemoryTool, WebScraperTool agent = Agent( tools=[ - WebScraper(off_prompt=True), # This tool will store the data in Task Memory - TaskMemoryClient( - off_prompt=True - ), # This tool will store the data back in Task Memory with no way to get it out + WebScraperTool(off_prompt=True), # This tool will store the data in Task Memory + TaskMemoryTool(off_prompt=True), # This tool will store the data back in Task Memory with no way to get it out ] ) agent.run( diff --git a/docs/griptape-framework/structures/src/task_memory_9.py b/docs/griptape-framework/structures/src/task_memory_9.py index c6d93ba5e..66bb562f0 100644 --- a/docs/griptape-framework/structures/src/task_memory_9.py +++ b/docs/griptape-framework/structures/src/task_memory_9.py @@ -1,9 +1,9 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool agent = Agent( tools=[ - Calculator() # Default value of `off_prompt=False` will return the data directly to the LLM + CalculatorTool() # Default value of `off_prompt=False` will return the data directly to the LLM ] ) agent.run("What is 10 ^ 3, 55 / 23, and 12345 * 0.5?") diff --git a/docs/griptape-framework/structures/src/tasks_16.py b/docs/griptape-framework/structures/src/tasks_16.py index 796b836da..5f2e6b718 100644 --- a/docs/griptape-framework/structures/src/tasks_16.py +++ b/docs/griptape-framework/structures/src/tasks_16.py @@ -5,25 +5,25 @@ from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask from griptape.tools import ( - TaskMemoryClient, - WebScraper, - WebSearch, + TaskMemoryTool, + WebScraperTool, + WebSearchTool, ) def build_researcher() -> Agent: researcher = Agent( tools=[ - WebSearch( + WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"], ), ), - WebScraper( + WebScraperTool( off_prompt=True, ), - TaskMemoryClient(off_prompt=False), + TaskMemoryTool(off_prompt=False), ], rulesets=[ Ruleset( diff --git a/docs/griptape-framework/structures/src/tasks_4.py b/docs/griptape-framework/structures/src/tasks_4.py index 43737980b..936b59f99 100644 --- a/docs/griptape-framework/structures/src/tasks_4.py +++ b/docs/griptape-framework/structures/src/tasks_4.py @@ -1,12 +1,12 @@ from griptape.structures import Agent from griptape.tasks import ToolkitTask -from griptape.tools import FileManager, TaskMemoryClient, WebScraper +from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool agent = Agent() agent.add_task( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=True)], + tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=True)], ), ) diff --git a/docs/griptape-framework/structures/src/tasks_5.py b/docs/griptape-framework/structures/src/tasks_5.py index 543543303..a0d537aa7 100644 --- a/docs/griptape-framework/structures/src/tasks_5.py +++ b/docs/griptape-framework/structures/src/tasks_5.py @@ -1,10 +1,10 @@ from griptape.structures import Agent from griptape.tasks import ToolTask -from griptape.tools import Calculator +from griptape.tools import CalculatorTool # Initialize the agent and add a task agent = Agent() -agent.add_task(ToolTask(tool=Calculator())) +agent.add_task(ToolTask(tool=CalculatorTool())) # Run the agent with a prompt agent.run("Give me the answer for 5*4.") diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 6b858ff5b..ccc4dd1e7 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -29,15 +29,15 @@ Lets look at a simple example where `off_prompt` is set to `False`: [04/26/24 13:06:42] INFO ToolkitTask 36b9dea13b9d479fb752014f41dca54c Input: What is the square root of 12345? [04/26/24 13:06:48] INFO Subtask a88c0feeaef6493796a9148ed68c9caf - Thought: To find the square root of 12345, I can use the Calculator action with the expression "12345 ** 0.5". - Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] + Thought: To find the square root of 12345, I can use the CalculatorTool action with the expression "12345 ** 0.5". + Actions: [{"name": "CalculatorTool", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] INFO Subtask a88c0feeaef6493796a9148ed68c9caf Response: 111.1080555135405 [04/26/24 13:06:49] INFO ToolkitTask 36b9dea13b9d479fb752014f41dca54c Output: The square root of 12345 is approximately 111.108. ``` -Since the result of the Calculator Tool is neither sensitive nor too large, we can set `off_prompt` to `False` and not use Task Memory. +Since the result of the CalculatorTool Tool is neither sensitive nor too large, we can set `off_prompt` to `False` and not use Task Memory. Let's explore what happens when `off_prompt` is set to `True`: @@ -49,38 +49,38 @@ Let's explore what happens when `off_prompt` is set to `True`: [04/26/24 13:07:02] INFO ToolkitTask ecbb788d9830491ab72a8a2bbef5fb0a Input: What is the square root of 12345? [04/26/24 13:07:10] INFO Subtask 4700dc0c2e934d1a9af60a28bd770bc6 - Thought: To find the square root of a number, we can use the Calculator action with the expression "sqrt(12345)". However, the Calculator + Thought: To find the square root of a number, we can use the CalculatorTool action with the expression "sqrt(12345)". However, the CalculatorTool action only supports basic arithmetic operations and does not support the sqrt function. Therefore, we need to use the equivalent expression for square root which is raising the number to the power of 0.5. - Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345**0.5"}}, "tag": "sqrt_calculation"}] + Actions: [{"name": "CalculatorTool", "path": "calculate", "input": {"values": {"expression": "12345**0.5"}}, "tag": "sqrt_calculation"}] INFO Subtask 4700dc0c2e934d1a9af60a28bd770bc6 - Response: Output of "Calculator.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace + Response: Output of "CalculatorTool.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace "6be74c5128024c0588eb9bee1fdb9aa5" [04/26/24 13:07:16] ERROR Subtask ecbb788d9830491ab72a8a2bbef5fb0a - Invalid action JSON: Or({Literal("name", description=""): 'Calculator', Literal("path", description="Can be used for computing simple + Invalid action JSON: Or({Literal("name", description=""): 'CalculatorTool', Literal("path", description="Can be used for computing simple numerical or algebraic calculations in Python"): 'calculate', Literal("input", description=""): {'values': Schema({Literal("expression", description="Arithmetic expression parsable in pure Python. Single line only. Don't use variables. Don't use any imports or external libraries"): })}, Literal("tag", description="Unique tag name for action execution."): }) did not validate {'name': 'Memory', 'path': 'get', 'input': {'memory_name': 'TaskMemory', 'artifact_namespace': '6be74c5128024c0588eb9bee1fdb9aa5'}, 'tag': 'get_sqrt_result'} Key 'name' error: - 'Calculator' does not match 'Memory' + 'CalculatorTool' does not match 'Memory' ...Output truncated for brevity... ``` -When we set `off_prompt` to `True`, the Agent does not function as expected, even generating an error. This is because the Calculator output is being stored in Task Memory but the Agent has no way to access it. -To fix this, we need a [Tool that can read from Task Memory](#tools-that-can-read-from-task-memory) such as the `TaskMemoryClient`. +When we set `off_prompt` to `True`, the Agent does not function as expected, even generating an error. This is because the CalculatorTool output is being stored in Task Memory but the Agent has no way to access it. +To fix this, we need a [Tool that can read from Task Memory](#tools-that-can-read-from-task-memory) such as the `TaskMemoryTool`. This is an example of [not providing a Task Memory compatible Tool](#not-providing-a-task-memory-compatible-tool). -## Task Memory Client +## Task Memory Tool -The [TaskMemoryClient](../../griptape-tools/official-tools/task-memory-client.md) is a Tool that allows an Agent to interact with Task Memory. It has the following methods: +The [TaskMemoryTool](../../griptape-tools/official-tools/task-memory-tool.md) is a Tool that allows an Agent to interact with Task Memory. It has the following methods: - `query`: Retrieve the content of an Artifact stored in Task Memory. - `summarize`: Summarize the content of an Artifact stored in Task Memory. -Let's add `TaskMemoryClient` to the Agent and run the same task. -Note that on the `TaskMemoryClient` we've set `off_prompt` to `False` so that the results of the query can be returned directly to the LLM. +Let's add `TaskMemoryTool` to the Agent and run the same task. +Note that on the `TaskMemoryTool` we've set `off_prompt` to `False` so that the results of the query can be returned directly to the LLM. If we had kept it as `True`, the results would have been stored back Task Memory which would've put us back to square one. See [Task Memory Looping](#task-memory-looping) for more information on this scenario. ```python @@ -91,15 +91,15 @@ If we had kept it as `True`, the results would have been stored back Task Memory [04/26/24 13:13:01] INFO ToolkitTask 5b46f9ef677c4b31906b48aba3f45e2c Input: What is the square root of 12345? [04/26/24 13:13:07] INFO Subtask 611d98ea5576430fbc63259420577ab2 - Thought: To find the square root of 12345, I can use the Calculator action with the expression "12345 ** 0.5". - Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] + Thought: To find the square root of 12345, I can use the CalculatorTool action with the expression "12345 ** 0.5". + Actions: [{"name": "CalculatorTool", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] [04/26/24 13:13:08] INFO Subtask 611d98ea5576430fbc63259420577ab2 - Response: Output of "Calculator.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace + Response: Output of "CalculatorTool.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace "7554b69e1d414a469b8882e2266dcea1" [04/26/24 13:13:15] INFO Subtask 32b9163a15644212be60b8fba07bd23b - Thought: The square root of 12345 has been calculated and stored in memory. I can retrieve this value using the TaskMemoryClient action with + Thought: The square root of 12345 has been calculated and stored in memory. I can retrieve this value using the TaskMemoryTool action with the query path, providing the memory_name and artifact_namespace as input. - Actions: [{"tag": "retrieve_sqrt", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", + Actions: [{"tag": "retrieve_sqrt", "name": "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "7554b69e1d414a469b8882e2266dcea1", "query": "What is the result of the calculation?"}}}] [04/26/24 13:13:16] INFO Subtask 32b9163a15644212be60b8fba07bd23b Response: The result of the calculation is 111.1080555135405. @@ -107,7 +107,7 @@ If we had kept it as `True`, the results would have been stored back Task Memory Output: The square root of 12345 is approximately 111.108. ``` -While this fixed the problem, it took a handful more steps than when we just had `Calculator()`. Something like a basic calculation is an instance of where [Task Memory may not be necessary](#task-memory-may-not-be-necessary). +While this fixed the problem, it took a handful more steps than when we just had `CalculatorTool()`. Something like a basic calculation is an instance of where [Task Memory may not be necessary](#task-memory-may-not-be-necessary). Let's look at a more complex example where Task Memory shines. ## Large Data @@ -125,8 +125,8 @@ When running this example, we get the following error: Please reduce the length of the messages.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}} ``` -This is because the content of the webpage is too large to fit in the LLM's input token limit. We can fix this by storing the content in Task Memory, and then querying it with the `TaskMemoryClient`. -Note that we're setting `off_prompt` to `False` on the `TaskMemoryClient` so that the _queried_ content can be returned directly to the LLM. +This is because the content of the webpage is too large to fit in the LLM's input token limit. We can fix this by storing the content in Task Memory, and then querying it with the `TaskMemoryTool`. +Note that we're setting `off_prompt` to `False` on the `TaskMemoryTool` so that the _queried_ content can be returned directly to the LLM. ```python --8<-- "docs/griptape-framework/structures/src/task_memory_5.py" @@ -146,7 +146,7 @@ And now we get the expected output: [04/26/24 13:52:11] INFO Subtask f12eb3d3b4924e4085808236b460b43d Thought: Now that the webpage content is stored in memory, I need to query this memory to find the information about how many copies of Elden Ring have been sold. - Actions: [{"tag": "query_sales", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", + Actions: [{"tag": "query_sales", "name": "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "2d4ebc7211074bb7be26613eb25d8fc1", "query": "How many copies of Elden Ring have been sold?"}}}] [04/26/24 13:52:14] INFO Subtask f12eb3d3b4924e4085808236b460b43d Response: Elden Ring sold 23 million copies by February 2024. @@ -192,13 +192,13 @@ In this example, GPT-4 _never_ sees the contents of the page, only that it was s information about how many copies of Elden Ring have been sold. Actions: [{"tag": "query_sales", "name": - "TaskMemoryClient", "path": "query", "input": + "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "7e48bcff0da94ad3b06aa4e173f8f37b", "query": "How many copies of Elden Ring have been sold?"}}}] [06/21/24 16:00:19] INFO Subtask 56102d42475d413299ce52a0230506b7 - Response: Output of "TaskMemoryClient.query" was + Response: Output of "TaskMemoryTool.query" was stored in memory with memory_name "TaskMemory" and artifact_namespace "9ecf4d7b7d0c46149dfc46ba236f178e" @@ -229,11 +229,11 @@ As seen in the previous example, certain Tools are designed to read directly fro Today, these include: -- [TaskMemoryClient](../../griptape-tools/official-tools/task-memory-client.md) -- [FileManager](../../griptape-tools/official-tools/file-manager.md) -- [AwsS3Client](../../griptape-tools/official-tools/aws-s3-client.md) -- [GoogleDriveClient](../../griptape-tools/official-tools/google-drive-client.md) -- [GoogleDocsClient](../../griptape-tools/official-tools/google-docs-client.md) +- [TaskMemoryTool](../../griptape-tools/official-tools/task-memory-tool.md) +- [FileManager](../../griptape-tools/official-tools/file-manager-tool.md) +- [AwsS3Tool](../../griptape-tools/official-tools/aws-s3-tool.md) +- [GoogleDriveTool](../../griptape-tools/official-tools/google-drive-tool.md) +- [GoogleDocsTool](../../griptape-tools/official-tools/google-docs-tool.md) ## Task Memory Considerations diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index a57c1e604..477ce7b64 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -112,7 +112,7 @@ This Task takes in one or more Tools which the LLM will decide to use through Ch [09/08/23 11:15:11] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity to summarize it. - Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee"}}} + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee"}}} [09/08/23 11:15:15] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 Response: Griptape is an open source framework that allows developers to build and deploy AI applications using large language models (LLMs). It provides the ability to create conversational and event-driven apps that @@ -149,7 +149,7 @@ This Task takes in a single Tool which the LLM will use without Chain of Thought [10/20/23 14:20:29] INFO Subtask a9a9ad7be2bf465fa82bd350116fabe4 Action: { - "name": "Calculator", + "name": "CalculatorTool", "path": "calculate", "input": { "values": { diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index c974b9658..808849dae 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -33,7 +33,7 @@ Here is an example of a Pipeline using Tools: [09/08/23 10:54:09] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool with the summarize activity to summarize the content. - Action: {"name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e"}}} + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e"}}} [09/08/23 10:54:12] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba Response: Griptape is an open source framework that allows developers to build and deploy AI applications using large language models (LLMs). It provides the ability to create conversational and event-driven apps that diff --git a/docs/griptape-framework/tools/src/index_1.py b/docs/griptape-framework/tools/src/index_1.py index 52d8ac8e7..488dcfbc8 100644 --- a/docs/griptape-framework/tools/src/index_1.py +++ b/docs/griptape-framework/tools/src/index_1.py @@ -1,13 +1,13 @@ from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import FileManager, TaskMemoryClient, WebScraper +from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], ), ) diff --git a/docs/griptape-tools/official-tools/audio-transcription-client.md b/docs/griptape-tools/official-tools/audio-transcription-tool.md similarity index 90% rename from docs/griptape-tools/official-tools/audio-transcription-client.md rename to docs/griptape-tools/official-tools/audio-transcription-tool.md index 271144d5b..ad8eeaa9b 100644 --- a/docs/griptape-tools/official-tools/audio-transcription-client.md +++ b/docs/griptape-tools/official-tools/audio-transcription-tool.md @@ -1,7 +1,7 @@ -# AudioTranscriptionClient +# Audio Transcription Tool This Tool enables [Agents](../../griptape-framework/structures/agents.md) to transcribe speech from text using [Audio Transcription Engines](../../reference/griptape/engines/audio/audio_transcription_engine.md) and [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md). ```python ---8<-- "docs/griptape-tools/official-tools/src/audio_transcription_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/audio_transcription_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/aws-iam-client.md b/docs/griptape-tools/official-tools/aws-iam-tool.md similarity index 89% rename from docs/griptape-tools/official-tools/aws-iam-client.md rename to docs/griptape-tools/official-tools/aws-iam-tool.md index 22b4115a3..1f594cff0 100644 --- a/docs/griptape-tools/official-tools/aws-iam-client.md +++ b/docs/griptape-tools/official-tools/aws-iam-tool.md @@ -1,22 +1,22 @@ -# AwsIamClient +# Aws Iam Tool This tool enables LLMs to make AWS IAM API requests. ```python ---8<-- "docs/griptape-tools/official-tools/src/aws_iam_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/aws_iam_tool_1.py" ``` ``` [09/11/23 16:45:45] INFO Task 890fcf77fb074c9490d5c91563e0c995 Input: List all my IAM users [09/11/23 16:45:51] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 Thought: To list all IAM users, I can use the - AwsIamClient tool with the list_users activity. + AwsIamTool tool with the list_users activity. This activity does not require any input. - Action: {"name": "AwsIamClient", + Action: {"name": "AwsIamTool", "path": "list_users"} [09/11/23 16:45:52] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 - Response: Output of "AwsIamClient.list_users" + Response: Output of "AwsIamTool.list_users" was stored in memory with memory_name "TaskMemory" and artifact_namespace "51d22a018a434904a5da3bb8d4f763f7" @@ -25,7 +25,7 @@ This tool enables LLMs to make AWS IAM API requests. stored in memory. I can retrieve this information using the TaskMemory tool with the summarize activity. - Action: {"name": "TaskMemoryClient", "path": + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "51d22a018a434904a5da3bb8d4f763f7"}}} diff --git a/docs/griptape-tools/official-tools/aws-s3-client.md b/docs/griptape-tools/official-tools/aws-s3-tool.md similarity index 90% rename from docs/griptape-tools/official-tools/aws-s3-client.md rename to docs/griptape-tools/official-tools/aws-s3-tool.md index 70ca79a20..9594861a9 100644 --- a/docs/griptape-tools/official-tools/aws-s3-client.md +++ b/docs/griptape-tools/official-tools/aws-s3-tool.md @@ -1,23 +1,23 @@ -# AwsS3Client +# Aws S3 Tool This tool enables LLMs to make AWS S3 API requests. ```python ---8<-- "docs/griptape-tools/official-tools/src/aws_s3_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/aws_s3_tool_1.py" ``` ``` [09/11/23 16:49:35] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 Input: List all my S3 buckets. [09/11/23 16:49:41] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d Thought: To list all S3 buckets, I can use the - "list_s3_buckets" activity of the "AwsS3Client" + "list_s3_buckets" activity of the "AwsS3Tool" tool. This activity doesn't require any input. - Action: {"name": "AwsS3Client", + Action: {"name": "AwsS3Tool", "path": "list_s3_buckets"} [09/11/23 16:49:42] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d Response: Output of - "AwsS3Client.list_s3_buckets" was stored in memory + "AwsS3Tool.list_s3_buckets" was stored in memory with memory_name "TaskMemory" and artifact_namespace "f2592085fd4a430286a46770ea508cc9" @@ -26,7 +26,7 @@ This tool enables LLMs to make AWS S3 API requests. activity is stored in memory. I can retrieve this information using the "summarize" activity of the "TaskMemory" tool. - Action: {"name": "TaskMemoryClient", "path": + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "f2592085fd4a430286a46770ea508cc9"}}} diff --git a/docs/griptape-tools/official-tools/calculator.md b/docs/griptape-tools/official-tools/calculator-tool.md similarity index 82% rename from docs/griptape-tools/official-tools/calculator.md rename to docs/griptape-tools/official-tools/calculator-tool.md index 55ac039db..afe17a364 100644 --- a/docs/griptape-tools/official-tools/calculator.md +++ b/docs/griptape-tools/official-tools/calculator-tool.md @@ -1,9 +1,9 @@ -# Calculator +# Calculator Tool This tool enables LLMs to make simple calculations. ```python ---8<-- "docs/griptape-tools/official-tools/src/calculator_1.py" +--8<-- "docs/griptape-tools/official-tools/src/calculator_tool_1.py" ``` ``` [09/08/23 14:23:51] INFO Task bbc6002a5e5b4655bb52b6a550a1b2a5 @@ -12,9 +12,9 @@ This tool enables LLMs to make simple calculations. Thought: The question is asking for the result of 10 raised to the power of 5. This is a mathematical operation that can be performed using the - Calculator tool. + CalculatorTool tool. - Action: {"name": "Calculator", + Action: {"name": "CalculatorTool", "path": "calculate", "input": {"values": {"expression": "10**5"}}} INFO Subtask 3e9211a0f44c4277812ae410c43adbc9 diff --git a/docs/griptape-tools/official-tools/computer.md b/docs/griptape-tools/official-tools/computer-tool.md similarity index 97% rename from docs/griptape-tools/official-tools/computer.md rename to docs/griptape-tools/official-tools/computer-tool.md index 121224b20..758dd8714 100644 --- a/docs/griptape-tools/official-tools/computer.md +++ b/docs/griptape-tools/official-tools/computer-tool.md @@ -1,11 +1,11 @@ -# Computer +# Computer Tool This tool enables LLMs to execute Python code and run shell commands inside a Docker container. You have to have the Docker daemon running in order for this tool to work. You can specify a local working directory and environment variables during tool initialization: ```python ---8<-- "docs/griptape-tools/official-tools/src/computer_1.py" +--8<-- "docs/griptape-tools/official-tools/src/computer_tool_1.py" ``` ``` [09/11/23 16:24:15] INFO Task d08009ee983c4286ba10f83bcf3080e6 @@ -46,7 +46,7 @@ You can specify a local working directory and environment variables during tool in memory. I need to retrieve this output to check if "my_new_file.txt" is listed, which would confirm that the file was created successfully. - Action: {"name": "TaskMemoryClient", "path": + Action: {"name": "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "82bc4937564e4901b7fc51fced45b643", "query": "Is diff --git a/docs/griptape-tools/official-tools/date-time.md b/docs/griptape-tools/official-tools/date-time-tool.md similarity index 93% rename from docs/griptape-tools/official-tools/date-time.md rename to docs/griptape-tools/official-tools/date-time-tool.md index 76e453f39..bdc5ccbf4 100644 --- a/docs/griptape-tools/official-tools/date-time.md +++ b/docs/griptape-tools/official-tools/date-time-tool.md @@ -1,9 +1,9 @@ -# DateTime +# Date Time Tool This tool enables LLMs to get current date and time. ```python ---8<-- "docs/griptape-tools/official-tools/src/date_time_1.py" +--8<-- "docs/griptape-tools/official-tools/src/date_time_tool_1.py" ``` ``` [09/11/23 15:26:02] INFO Task d0bf49dacd8849e695494578a333f6cc diff --git a/docs/griptape-tools/official-tools/email-client.md b/docs/griptape-tools/official-tools/email-client.md deleted file mode 100644 index 66decf820..000000000 --- a/docs/griptape-tools/official-tools/email-client.md +++ /dev/null @@ -1,13 +0,0 @@ -# EmailClient - -The [EmailClient](../../reference/griptape/tools/email_client/tool.md) enables LLMs to send emails. - -```python ---8<-- "docs/griptape-tools/official-tools/src/email_client_1.py" -``` - -For debugging purposes, you can run a local SMTP server that the LLM can send emails to: - -```shell -python -m smtpd -c DebuggingServer -n localhost:1025 -``` diff --git a/docs/griptape-tools/official-tools/email-tool.md b/docs/griptape-tools/official-tools/email-tool.md new file mode 100644 index 000000000..91ba6f19b --- /dev/null +++ b/docs/griptape-tools/official-tools/email-tool.md @@ -0,0 +1,13 @@ +# Email Tool + +The [EmailTool](../../reference/griptape/tools/email/tool.md) enables LLMs to send emails. + +```python +--8<-- "docs/griptape-tools/official-tools/src/email_tool_1.py" +``` + +For debugging purposes, you can run a local SMTP server that the LLM can send emails to: + +```shell +python -m smtpd -c DebuggingServer -n localhost:1025 +``` diff --git a/docs/griptape-tools/official-tools/file-manager.md b/docs/griptape-tools/official-tools/file-manager-tool.md similarity index 94% rename from docs/griptape-tools/official-tools/file-manager.md rename to docs/griptape-tools/official-tools/file-manager-tool.md index 539c4fff4..5f27b8da5 100644 --- a/docs/griptape-tools/official-tools/file-manager.md +++ b/docs/griptape-tools/official-tools/file-manager-tool.md @@ -1,9 +1,9 @@ -# FileManager +# File Manager Tool This tool enables LLMs to save and load files. ```python ---8<-- "docs/griptape-tools/official-tools/src/file_manager_1.py" +--8<-- "docs/griptape-tools/official-tools/src/file_manager_tool_1.py" ``` ``` [09/12/23 12:07:56] INFO Task 16a1ce1847284ae3805485bad7d99116 diff --git a/docs/griptape-tools/official-tools/google-cal-client.md b/docs/griptape-tools/official-tools/google-cal-client.md deleted file mode 100644 index 9757bdcbf..000000000 --- a/docs/griptape-tools/official-tools/google-cal-client.md +++ /dev/null @@ -1,8 +0,0 @@ -# GoogleCalendarClient - -The GoogleCalendarClient tool allows you to interact with Google Calendar. - - -```python ---8<-- "docs/griptape-tools/official-tools/src/google_cal_client_1.py" -``` diff --git a/docs/griptape-tools/official-tools/google-calendar-tool.md b/docs/griptape-tools/official-tools/google-calendar-tool.md new file mode 100644 index 000000000..e0b5d9cdc --- /dev/null +++ b/docs/griptape-tools/official-tools/google-calendar-tool.md @@ -0,0 +1,8 @@ +# Google Calendar Tool + +The [GoogleCalendarTool](../../reference/griptape/tools/google_calendar/tool.md) tool allows you to interact with Google Calendar. + + +```python +--8<-- "docs/griptape-tools/official-tools/src/google_calendar_tool_1.py" +``` diff --git a/docs/griptape-tools/official-tools/google-docs-client.md b/docs/griptape-tools/official-tools/google-docs-tool.md similarity index 79% rename from docs/griptape-tools/official-tools/google-docs-client.md rename to docs/griptape-tools/official-tools/google-docs-tool.md index ff23d8e89..1f02196b9 100644 --- a/docs/griptape-tools/official-tools/google-docs-client.md +++ b/docs/griptape-tools/official-tools/google-docs-tool.md @@ -1,9 +1,9 @@ -# GoogleDocsClient +# Google Docs Tool -The GoogleDocsClient tool provides a way to interact with the Google Docs API. It can be used to create new documents, save content to existing documents, and more. +The [GoogleDocsTool](../../reference/griptape/tools/google_docs/tool.md) tool provides a way to interact with the Google Docs API. It can be used to create new documents, save content to existing documents, and more. ```python ---8<-- "docs/griptape-tools/official-tools/src/google_docs_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/google_docs_tool_1.py" ``` ``` [10/05/23 12:56:19] INFO ToolkitTask 90721b7478a74618a63d852d35be3b18 @@ -14,10 +14,10 @@ The GoogleDocsClient tool provides a way to interact with the Google Docs API. I named 'test_creation' in a folder named 'test' with the content 'Hey, Tony.'. I can use the 'save_content_to_google_doc' activity of the - GoogleDocsClient tool to achieve this. + GoogleDocsTool tool to achieve this. Action: {"name": - "GoogleDocsClient", "path": + "GoogleDocsTool", "path": "save_content_to_google_doc", "input": {"values": {"file_path": "test_creation", "content": "Hey, Tony.", "folder_path": "test"}}} diff --git a/docs/griptape-tools/official-tools/google-drive-client.md b/docs/griptape-tools/official-tools/google-drive-tool.md similarity index 77% rename from docs/griptape-tools/official-tools/google-drive-client.md rename to docs/griptape-tools/official-tools/google-drive-tool.md index 9ad3daccc..18e10ec08 100644 --- a/docs/griptape-tools/official-tools/google-drive-client.md +++ b/docs/griptape-tools/official-tools/google-drive-tool.md @@ -1,9 +1,9 @@ -# GoogleDriveClient +# Google Drive Tool -The GoogleDriveClient tool provides a way to interact with the Google Drive API. It can be used to save content on Drive, list files, and more. +The [GoogleDriveTool](../../reference/griptape/tools/google_drive/tool.md) tool provides a way to interact with the Google Drive API. It can be used to save content on Drive, list files, and more. ```python ---8<-- "docs/griptape-tools/official-tools/src/google_drive_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/google_drive_tool_1.py" ``` ``` [10/05/23 10:49:14] INFO ToolkitTask 2ae3bb7e828744f3a2631c29c6fce001 @@ -13,11 +13,11 @@ The GoogleDriveClient tool provides a way to interact with the Google Drive API. Thought: The user wants to save the content 'Hi this is Tony' in a file named 'hello.txt' to Google Drive. I can use the 'save_content_to_drive' - activity of the GoogleDriveClient tool to + activity of the GoogleDriveTool tool to accomplish this. Action: {"name": - "GoogleDriveClient", "path": + "GoogleDriveTool", "path": "save_content_to_drive", "input": {"values": {"path": "hello.txt", "content": "Hi this is Tony"}}} diff --git a/docs/griptape-tools/official-tools/google-gmail-client.md b/docs/griptape-tools/official-tools/google-gmail-tool.md similarity index 78% rename from docs/griptape-tools/official-tools/google-gmail-client.md rename to docs/griptape-tools/official-tools/google-gmail-tool.md index fe6952dc3..1a9e6ea47 100644 --- a/docs/griptape-tools/official-tools/google-gmail-client.md +++ b/docs/griptape-tools/official-tools/google-gmail-tool.md @@ -1,9 +1,9 @@ -# GoogleGmailClient +# Google Gmail Tool -The GoogleGmailClient tool provides a way to interact with the Gmail API. It can be used to create draft emails, send emails, and more. +The [GoogleGmailTool](../../reference/griptape/tools/google_gmail/tool.md) tool provides a way to interact with the Gmail API. It can be used to create draft emails, send emails, and more. ```python ---8<-- "docs/griptape-tools/official-tools/src/google_gmail_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/google_gmail_tool_1.py" ``` ``` [10/05/23 13:24:05] INFO ToolkitTask 1f190f823d584053bfe9942f41b6cb2d @@ -12,13 +12,13 @@ The GoogleGmailClient tool provides a way to interact with the Gmail API. It can the body 'This is a test draft email.' [10/05/23 13:24:15] INFO Subtask 7f2cce7e5b0e425ba696531561697b96 Thought: The user wants to create a draft email in - Gmail. I can use the GoogleGmailClient tool with + Gmail. I can use the GoogleGmailTool tool with the create_draft_email activity to accomplish this. I will need to provide the 'to', 'subject', and 'body' values as input. Action: {"name": - "GoogleGmailClient", "path": + "GoogleGmailTool", "path": "create_draft_email", "input": {"values": {"to": "example@email.com", "subject": "Test Draft", "body": "This is a test draft email."}}} diff --git a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md deleted file mode 100644 index 28e89b4bb..000000000 --- a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md +++ /dev/null @@ -1,9 +0,0 @@ -## Overview - -The `GriptapeCloudKnowledgeBaseClient` is a lightweight Tool to retrieve data from a RAG pipeline and vector store hosted in [Griptape Cloud](https://cloud.griptape.ai). It enables searching across a centralized [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) that can consist of various data sources such as Confluence, Google Docs, and web pages. - -**Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/account/api-keys) for access. - -```python ---8<-- "docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py" -``` diff --git a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md new file mode 100644 index 000000000..96af51782 --- /dev/null +++ b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md @@ -0,0 +1,9 @@ +# Griptape Cloud Knowledge Base Tool + +The [GriptapeCloudKnowledgeBaseTool](../../reference/griptape/tools/griptape_cloud_knowledge_base/tool.md) is a lightweight Tool to retrieve data from a RAG pipeline and vector store hosted in [Griptape Cloud](https://cloud.griptape.ai). It enables searching across a centralized [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) that can consist of various data sources such as Confluence, Google Docs, and web pages. + +**Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/account/api-keys) for access. + +```python +--8<-- "docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_tool_1.py" +``` diff --git a/docs/griptape-tools/official-tools/image-query-client.md b/docs/griptape-tools/official-tools/image-query-tool.md similarity index 58% rename from docs/griptape-tools/official-tools/image-query-client.md rename to docs/griptape-tools/official-tools/image-query-tool.md index ae02d127c..781a279a8 100644 --- a/docs/griptape-tools/official-tools/image-query-client.md +++ b/docs/griptape-tools/official-tools/image-query-tool.md @@ -1,7 +1,7 @@ -# ImageQueryClient +# Image Query Tool This tool allows Agents to execute natural language queries on the contents of images using multimodal models. ```python ---8<-- "docs/griptape-tools/official-tools/src/image_query_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/image_query_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/inpainting-image-generation-client.md b/docs/griptape-tools/official-tools/inpainting-image-generation-tool.md similarity index 87% rename from docs/griptape-tools/official-tools/inpainting-image-generation-client.md rename to docs/griptape-tools/official-tools/inpainting-image-generation-tool.md index 65de566ad..7abdc6238 100644 --- a/docs/griptape-tools/official-tools/inpainting-image-generation-client.md +++ b/docs/griptape-tools/official-tools/inpainting-image-generation-tool.md @@ -1,7 +1,7 @@ -# InpaintingImageGenerationClient +# Inpainting Image Generation Tool This tool allows LLMs to generate images using inpainting, where an input image is altered within the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. ```python ---8<-- "docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/inpainting_image_generation_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/openweather-client.md b/docs/griptape-tools/official-tools/openweather-client.md deleted file mode 100644 index 3521733c5..000000000 --- a/docs/griptape-tools/official-tools/openweather-client.md +++ /dev/null @@ -1,7 +0,0 @@ -# OpenWeatherClient - -The [OpenWeatherClient](../../reference/griptape/tools/openweather_client/tool.md) enables LLMs to use [OpenWeatherMap](https://openweathermap.org/). - -```python ---8<-- "docs/griptape-tools/official-tools/src/openweather_client_1.py" -``` diff --git a/docs/griptape-tools/official-tools/openweather-tool.md b/docs/griptape-tools/official-tools/openweather-tool.md new file mode 100644 index 000000000..be1ed3972 --- /dev/null +++ b/docs/griptape-tools/official-tools/openweather-tool.md @@ -0,0 +1,7 @@ +# Open Weather Tool + +The [OpenWeatherTool](../../reference/griptape/tools/openweather/tool.md) enables LLMs to use [OpenWeatherMap](https://openweathermap.org/). + +```python +--8<-- "docs/griptape-tools/official-tools/src/openweather_tool_1.py" +``` diff --git a/docs/griptape-tools/official-tools/outpainting-image-generation-client.md b/docs/griptape-tools/official-tools/outpainting-image-generation-tool.md similarity index 86% rename from docs/griptape-tools/official-tools/outpainting-image-generation-client.md rename to docs/griptape-tools/official-tools/outpainting-image-generation-tool.md index e62a40a73..ce97798bc 100644 --- a/docs/griptape-tools/official-tools/outpainting-image-generation-client.md +++ b/docs/griptape-tools/official-tools/outpainting-image-generation-tool.md @@ -1,7 +1,7 @@ -# OutpaintingImageGenerationClient +# Outpainting Image Generation Tool This tool allows LLMs to generate images using outpainting, where an input image is altered outside of the area specified by a mask image according to a prompt. The input and mask images can be provided either by their file path or by their [Task Memory](../../griptape-framework/structures/task-memory.md) references. ```python ---8<-- "docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/outpainting_image_generation_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/prompt-image-generation-client.md b/docs/griptape-tools/official-tools/prompt-image-generation-tool.md similarity index 73% rename from docs/griptape-tools/official-tools/prompt-image-generation-client.md rename to docs/griptape-tools/official-tools/prompt-image-generation-tool.md index d91b154be..c764791dc 100644 --- a/docs/griptape-tools/official-tools/prompt-image-generation-client.md +++ b/docs/griptape-tools/official-tools/prompt-image-generation-tool.md @@ -1,7 +1,7 @@ -# PromptImageGenerationClient +# Prompt Image Generation Tool This tool allows LLMs to generate images from a text prompt. ```python ---8<-- "docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/prompt_image_generation_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/rag-client.md b/docs/griptape-tools/official-tools/rag-tool.md similarity index 86% rename from docs/griptape-tools/official-tools/rag-client.md rename to docs/griptape-tools/official-tools/rag-tool.md index c90762946..71613beab 100644 --- a/docs/griptape-tools/official-tools/rag-client.md +++ b/docs/griptape-tools/official-tools/rag-tool.md @@ -1,9 +1,11 @@ -The [RagClient](../../reference/griptape/tools/rag_client/tool.md) enables LLMs to query modular RAG engines. +# Rag Tool + +The [RagTool](../../reference/griptape/tools/rag/tool.md) enables LLMs to query modular RAG engines. Here is an example of how it can be used with a local vector store driver: ```python ---8<-- "docs/griptape-tools/official-tools/src/rag_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/rag_tool_1.py" ``` ``` [07/11/24 13:30:43] INFO ToolkitTask a6d057d5c71d4e9cb6863a2adb64b76c @@ -12,7 +14,7 @@ Here is an example of how it can be used with a local vector store driver: Actions: [ { "tag": "call_4MaDzOuKnWAs2gmhK3KJhtjI", - "name": "RagClient", + "name": "RagTool", "path": "search", "input": { "values": { diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-tool.md similarity index 50% rename from docs/griptape-tools/official-tools/rest-api-client.md rename to docs/griptape-tools/official-tools/rest-api-tool.md index 8ec4804c2..345f0589b 100644 --- a/docs/griptape-tools/official-tools/rest-api-client.md +++ b/docs/griptape-tools/official-tools/rest-api-tool.md @@ -1,12 +1,12 @@ -# RestApiClient +# Rest Api Tool This tool enables LLMs to call REST APIs. -The [RestApiClient](../../reference/griptape/tools/rest_api_client/tool.md) tool uses the following parameters: +The [RestApiTool](../../reference/griptape/tools/rest_api/tool.md) tool uses the following parameters: ### Example The following example is built using [https://jsonplaceholder.typicode.com/guide/](https://jsonplaceholder.typicode.com/guide/). ```python ---8<-- "docs/griptape-tools/official-tools/src/rest_api_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/rest_api_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/sql-client.md b/docs/griptape-tools/official-tools/sql-tool.md similarity index 90% rename from docs/griptape-tools/official-tools/sql-client.md rename to docs/griptape-tools/official-tools/sql-tool.md index 1d0d7abb0..b20327013 100644 --- a/docs/griptape-tools/official-tools/sql-client.md +++ b/docs/griptape-tools/official-tools/sql-tool.md @@ -1,23 +1,23 @@ -# SqlClient +# Sql Tool This tool enables LLMs to execute SQL statements via [SQLAlchemy](https://www.sqlalchemy.org/). Depending on your underlying SQL engine, [configure](https://docs.sqlalchemy.org/en/20/core/engines.html) your `engine_url` and give the LLM a hint about what engine you are using via `engine_name`, so that it can create engine-specific statements. ```python ---8<-- "docs/griptape-tools/official-tools/src/sql_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/sql_tool_1.py" ``` ``` [09/11/23 17:02:55] INFO Task d8331f8705b64b4b9d9a88137ed73f3f Input: SELECT * FROM people; [09/11/23 17:03:02] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 Thought: The user wants to retrieve all records - from the 'people' table. I can use the SqlClient + from the 'people' table. I can use the SqlTool tool to execute this query. - Action: {"name": "SqlClient", + Action: {"name": "SqlTool", "path": "execute_query", "input": {"values": {"sql_query": "SELECT * FROM people;"}}} [09/11/23 17:03:03] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 - Response: Output of "SqlClient.execute_query" + Response: Output of "SqlTool.execute_query" was stored in memory with memory_name "TaskMemory" and artifact_namespace "217715ba3e444e4985bee223df5716a8" @@ -25,7 +25,7 @@ This tool enables LLMs to execute SQL statements via [SQLAlchemy](https://www.sq Thought: The output of the SQL query has been stored in memory. I can retrieve this data using the TaskMemory's 'summarize' activity. - Action: {"name": "TaskMemoryClient", "path": + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "217715ba3e444e4985bee223df5716a8"}}} diff --git a/docs/griptape-tools/official-tools/src/audio_transcription_client_1.py b/docs/griptape-tools/official-tools/src/audio_transcription_tool_1.py similarity index 79% rename from docs/griptape-tools/official-tools/src/audio_transcription_client_1.py rename to docs/griptape-tools/official-tools/src/audio_transcription_tool_1.py index d2c54e0c9..bc25fd1fa 100644 --- a/docs/griptape-tools/official-tools/src/audio_transcription_client_1.py +++ b/docs/griptape-tools/official-tools/src/audio_transcription_tool_1.py @@ -1,11 +1,11 @@ from griptape.drivers import OpenAiAudioTranscriptionDriver from griptape.engines import AudioTranscriptionEngine from griptape.structures import Agent -from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient +from griptape.tools.audio_transcription.tool import AudioTranscriptionTool driver = OpenAiAudioTranscriptionDriver(model="whisper-1") -tool = AudioTranscriptionClient( +tool = AudioTranscriptionTool( off_prompt=False, engine=AudioTranscriptionEngine( audio_transcription_driver=driver, diff --git a/docs/griptape-tools/official-tools/src/aws_iam_client_1.py b/docs/griptape-tools/official-tools/src/aws_iam_tool_1.py similarity index 72% rename from docs/griptape-tools/official-tools/src/aws_iam_client_1.py rename to docs/griptape-tools/official-tools/src/aws_iam_tool_1.py index 8fda31553..89718010f 100644 --- a/docs/griptape-tools/official-tools/src/aws_iam_client_1.py +++ b/docs/griptape-tools/official-tools/src/aws_iam_tool_1.py @@ -1,10 +1,10 @@ import boto3 from griptape.structures import Agent -from griptape.tools import AwsIamClient +from griptape.tools import AwsIamTool # Initialize the AWS IAM client -aws_iam_client = AwsIamClient(session=boto3.Session()) +aws_iam_client = AwsIamTool(session=boto3.Session()) # Create an agent with the AWS IAM client tool agent = Agent(tools=[aws_iam_client]) diff --git a/docs/griptape-tools/official-tools/src/aws_s3_client_1.py b/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py similarity index 50% rename from docs/griptape-tools/official-tools/src/aws_s3_client_1.py rename to docs/griptape-tools/official-tools/src/aws_s3_tool_1.py index e1ba42525..973a0b881 100644 --- a/docs/griptape-tools/official-tools/src/aws_s3_client_1.py +++ b/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py @@ -1,13 +1,13 @@ import boto3 from griptape.structures import Agent -from griptape.tools import AwsS3Client, TaskMemoryClient +from griptape.tools import AwsS3Tool, TaskMemoryTool # Initialize the AWS S3 client -aws_s3_client = AwsS3Client(session=boto3.Session(), off_prompt=True) +aws_s3_client = AwsS3Tool(session=boto3.Session(), off_prompt=True) # Create an agent with the AWS S3 client tool -agent = Agent(tools=[aws_s3_client, TaskMemoryClient(off_prompt=False)]) +agent = Agent(tools=[aws_s3_client, TaskMemoryTool(off_prompt=False)]) # Task to list all the AWS S3 buckets agent.run("List all my S3 buckets.") diff --git a/docs/griptape-tools/official-tools/src/calculator_1.py b/docs/griptape-tools/official-tools/src/calculator_tool_1.py similarity index 56% rename from docs/griptape-tools/official-tools/src/calculator_1.py rename to docs/griptape-tools/official-tools/src/calculator_tool_1.py index b28bb92b2..1263cad45 100644 --- a/docs/griptape-tools/official-tools/src/calculator_1.py +++ b/docs/griptape-tools/official-tools/src/calculator_tool_1.py @@ -1,8 +1,8 @@ from griptape.structures import Agent -from griptape.tools import Calculator +from griptape.tools import CalculatorTool -# Create an agent with the Calculator tool -agent = Agent(tools=[Calculator()]) +# Create an agent with the CalculatorTool tool +agent = Agent(tools=[CalculatorTool()]) # Run the agent with a task to perform the arithmetic calculation of \(10^5\) agent.run("What is 10 raised to the power of 5?") diff --git a/docs/griptape-tools/official-tools/src/computer_1.py b/docs/griptape-tools/official-tools/src/computer_tool_1.py similarity index 77% rename from docs/griptape-tools/official-tools/src/computer_1.py rename to docs/griptape-tools/official-tools/src/computer_tool_1.py index 7fa22a46b..b0892d425 100644 --- a/docs/griptape-tools/official-tools/src/computer_1.py +++ b/docs/griptape-tools/official-tools/src/computer_tool_1.py @@ -1,10 +1,10 @@ from griptape.structures import Agent -from griptape.tools import Computer +from griptape.tools import ComputerTool -# Initialize the Computer tool -computer = Computer() +# Initialize the ComputerTool tool +computer = ComputerTool() -# Create an agent with the Computer tool +# Create an agent with the ComputerTool tool agent = Agent(tools=[computer]) # Create a file using the shell command diff --git a/docs/griptape-tools/official-tools/src/date_time_1.py b/docs/griptape-tools/official-tools/src/date_time_1.py deleted file mode 100644 index 735b77307..000000000 --- a/docs/griptape-tools/official-tools/src/date_time_1.py +++ /dev/null @@ -1,8 +0,0 @@ -from griptape.structures import Agent -from griptape.tools import DateTime - -# Create an agent with the DateTime tool -agent = Agent(tools=[DateTime()]) - -# Fetch the current date and time -agent.run("What is the current date and time?") diff --git a/docs/griptape-tools/official-tools/src/date_time_tool_1.py b/docs/griptape-tools/official-tools/src/date_time_tool_1.py new file mode 100644 index 000000000..f806e5091 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/date_time_tool_1.py @@ -0,0 +1,8 @@ +from griptape.structures import Agent +from griptape.tools import DateTimeTool + +# Create an agent with the DateTimeTool tool +agent = Agent(tools=[DateTimeTool()]) + +# Fetch the current date and time +agent.run("What is the current date and time?") diff --git a/docs/griptape-tools/official-tools/src/email_client_1.py b/docs/griptape-tools/official-tools/src/email_tool_1.py similarity index 79% rename from docs/griptape-tools/official-tools/src/email_client_1.py rename to docs/griptape-tools/official-tools/src/email_tool_1.py index e93a74f34..e9d3b3cee 100644 --- a/docs/griptape-tools/official-tools/src/email_client_1.py +++ b/docs/griptape-tools/official-tools/src/email_tool_1.py @@ -1,8 +1,8 @@ import os -from griptape.tools import EmailClient +from griptape.tools import EmailTool -email_client = EmailClient( +email_tool = EmailTool( smtp_host=os.environ.get("SMTP_HOST"), smtp_port=int(os.environ.get("SMTP_PORT", 465)), smtp_password=os.environ.get("SMTP_PASSWORD"), diff --git a/docs/griptape-tools/official-tools/src/file_manager_1.py b/docs/griptape-tools/official-tools/src/file_manager_tool_1.py similarity index 73% rename from docs/griptape-tools/official-tools/src/file_manager_1.py rename to docs/griptape-tools/official-tools/src/file_manager_tool_1.py index 16adf669c..0b5596d2b 100644 --- a/docs/griptape-tools/official-tools/src/file_manager_1.py +++ b/docs/griptape-tools/official-tools/src/file_manager_tool_1.py @@ -1,10 +1,10 @@ from pathlib import Path from griptape.structures import Agent -from griptape.tools import FileManager +from griptape.tools import FileManagerTool -# Initialize the FileManager tool with the current directory as its base -file_manager_tool = FileManager() +# Initialize the FileManagerTool tool with the current directory as its base +file_manager_tool = FileManagerTool() # Add the tool to the Agent agent = Agent(tools=[file_manager_tool]) diff --git a/docs/griptape-tools/official-tools/src/google_cal_client_1.py b/docs/griptape-tools/official-tools/src/google_calendar_tool_1.py similarity index 79% rename from docs/griptape-tools/official-tools/src/google_cal_client_1.py rename to docs/griptape-tools/official-tools/src/google_calendar_tool_1.py index 1b99d9ec4..afbb20c9f 100644 --- a/docs/griptape-tools/official-tools/src/google_cal_client_1.py +++ b/docs/griptape-tools/official-tools/src/google_calendar_tool_1.py @@ -1,10 +1,10 @@ import os from griptape.structures import Agent -from griptape.tools import GoogleCalendarClient +from griptape.tools import GoogleCalendarTool -# Create the GoogleCalendarClient tool -google_calendar_tool = GoogleCalendarClient( +# Create the GoogleCalendarTool tool +google_calendarendar_tool = GoogleCalendarTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], @@ -20,8 +20,8 @@ owner_email=os.environ["GOOGLE_OWNER_EMAIL"], ) -# Set up an agent using the GoogleCalendarClient tool -agent = Agent(tools=[google_calendar_tool]) +# Set up an agent using the GoogleCalendarTool tool +agent = Agent(tools=[google_calendarendar_tool]) # Task: Get upcoming events from a Google calendar agent.run( diff --git a/docs/griptape-tools/official-tools/src/google_docs_client_1.py b/docs/griptape-tools/official-tools/src/google_docs_tool_1.py similarity index 85% rename from docs/griptape-tools/official-tools/src/google_docs_client_1.py rename to docs/griptape-tools/official-tools/src/google_docs_tool_1.py index 473bfbfd8..0d8e8a3cb 100644 --- a/docs/griptape-tools/official-tools/src/google_docs_client_1.py +++ b/docs/griptape-tools/official-tools/src/google_docs_tool_1.py @@ -1,10 +1,10 @@ import os from griptape.structures import Agent -from griptape.tools import GoogleDocsClient +from griptape.tools import GoogleDocsTool -# Create the GoogleDocsClient tool -google_docs_tool = GoogleDocsClient( +# Create the GoogleDocsTool tool +google_docs_tool = GoogleDocsTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], @@ -20,7 +20,7 @@ owner_email=os.environ["GOOGLE_OWNER_EMAIL"], ) -# Set up an agent using the GoogleDocsClient tool +# Set up an agent using the GoogleDocsTool tool agent = Agent(tools=[google_docs_tool]) # Task: Create a new Google Doc and save content to it diff --git a/docs/griptape-tools/official-tools/src/google_drive_client_1.py b/docs/griptape-tools/official-tools/src/google_drive_tool_1.py similarity index 84% rename from docs/griptape-tools/official-tools/src/google_drive_client_1.py rename to docs/griptape-tools/official-tools/src/google_drive_tool_1.py index a020b1a96..d8e43a6db 100644 --- a/docs/griptape-tools/official-tools/src/google_drive_client_1.py +++ b/docs/griptape-tools/official-tools/src/google_drive_tool_1.py @@ -1,10 +1,10 @@ import os from griptape.structures import Agent -from griptape.tools import GoogleDriveClient +from griptape.tools import GoogleDriveTool -# Create the GoogleDriveClient tool -google_drive_tool = GoogleDriveClient( +# Create the GoogleDriveTool tool +google_drive_tool = GoogleDriveTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], @@ -20,7 +20,7 @@ owner_email=os.environ["GOOGLE_OWNER_EMAIL"], ) -# Set up an agent using the GoogleDriveClient tool +# Set up an agent using the GoogleDriveTool tool agent = Agent(tools=[google_drive_tool]) # Task: Save content to my Google Drive (default directory is root) diff --git a/docs/griptape-tools/official-tools/src/google_gmail_client_1.py b/docs/griptape-tools/official-tools/src/google_gmail_tool_1.py similarity index 85% rename from docs/griptape-tools/official-tools/src/google_gmail_client_1.py rename to docs/griptape-tools/official-tools/src/google_gmail_tool_1.py index e9a075fa8..44e0ceb39 100644 --- a/docs/griptape-tools/official-tools/src/google_gmail_client_1.py +++ b/docs/griptape-tools/official-tools/src/google_gmail_tool_1.py @@ -1,10 +1,10 @@ import os from griptape.structures import Agent -from griptape.tools import GoogleGmailClient +from griptape.tools import GoogleGmailTool -# Create the GoogleGmailClient tool -gmail_tool = GoogleGmailClient( +# Create the GoogleGmailTool tool +gmail_tool = GoogleGmailTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], @@ -20,7 +20,7 @@ owner_email=os.environ["GOOGLE_OWNER_EMAIL"], ) -# Set up an agent using the GoogleGmailClient tool +# Set up an agent using the GoogleGmailTool tool agent = Agent(tools=[gmail_tool]) # Task: Create a draft email in GMail diff --git a/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py b/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_tool_1.py similarity index 75% rename from docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py rename to docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_tool_1.py index 9cfd09a22..b8c294f6b 100644 --- a/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_client_1.py +++ b/docs/griptape-tools/official-tools/src/griptape_cloud_knowledge_base_tool_1.py @@ -1,9 +1,9 @@ import os from griptape.structures import Agent -from griptape.tools import GriptapeCloudKnowledgeBaseClient +from griptape.tools import GriptapeCloudKnowledgeBaseTool -knowledge_base_client = GriptapeCloudKnowledgeBaseClient( +knowledge_base_client = GriptapeCloudKnowledgeBaseTool( description="Contains information about the company and its operations", api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], knowledge_base_id=os.environ["GRIPTAPE_CLOUD_KB_ID"], diff --git a/docs/griptape-tools/official-tools/src/image_query_client_1.py b/docs/griptape-tools/official-tools/src/image_query_tool_1.py similarity index 80% rename from docs/griptape-tools/official-tools/src/image_query_client_1.py rename to docs/griptape-tools/official-tools/src/image_query_tool_1.py index 177154d2d..a4d69eafb 100644 --- a/docs/griptape-tools/official-tools/src/image_query_client_1.py +++ b/docs/griptape-tools/official-tools/src/image_query_tool_1.py @@ -1,7 +1,7 @@ from griptape.drivers import OpenAiImageQueryDriver from griptape.engines import ImageQueryEngine from griptape.structures import Agent -from griptape.tools import ImageQueryClient +from griptape.tools import ImageQueryTool # Create an Image Query Driver. driver = OpenAiImageQueryDriver(model="gpt-4o") @@ -11,8 +11,8 @@ image_query_driver=driver, ) -# Create an Image Query Client configured to use the engine. -tool = ImageQueryClient( +# Create an Image Query Tool configured to use the engine. +tool = ImageQueryTool( image_query_engine=engine, ) diff --git a/docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/inpainting_image_generation_tool_1.py similarity index 90% rename from docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py rename to docs/griptape-tools/official-tools/src/inpainting_image_generation_tool_1.py index 1042a4567..5821e1b40 100644 --- a/docs/griptape-tools/official-tools/src/inpainting_image_generation_client_1.py +++ b/docs/griptape-tools/official-tools/src/inpainting_image_generation_tool_1.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import InpaintingImageGenerationEngine from griptape.structures import Agent -from griptape.tools import InpaintingImageGenerationClient +from griptape.tools import InpaintingImageGenerationTool # Create a driver configured to use Stable Diffusion via Bedrock. driver = AmazonBedrockImageGenerationDriver( @@ -15,7 +15,7 @@ ) # Create a tool configured to use the engine. -tool = InpaintingImageGenerationClient( +tool = InpaintingImageGenerationTool( engine=engine, ) diff --git a/docs/griptape-tools/official-tools/src/openweather_client_1.py b/docs/griptape-tools/official-tools/src/openweather_tool_1.py similarity index 75% rename from docs/griptape-tools/official-tools/src/openweather_client_1.py rename to docs/griptape-tools/official-tools/src/openweather_tool_1.py index 2156e24da..b592620fa 100644 --- a/docs/griptape-tools/official-tools/src/openweather_client_1.py +++ b/docs/griptape-tools/official-tools/src/openweather_tool_1.py @@ -1,11 +1,11 @@ import os from griptape.structures import Agent -from griptape.tools import OpenWeatherClient +from griptape.tools import OpenWeatherTool agent = Agent( tools=[ - OpenWeatherClient( + OpenWeatherTool( api_key=os.environ["OPENWEATHER_API_KEY"], ), ] diff --git a/docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/outpainting_image_generation_tool_1.py similarity index 89% rename from docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py rename to docs/griptape-tools/official-tools/src/outpainting_image_generation_tool_1.py index bc7eb8585..79606a965 100644 --- a/docs/griptape-tools/official-tools/src/outpainting_image_generation_client_1.py +++ b/docs/griptape-tools/official-tools/src/outpainting_image_generation_tool_1.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import OutpaintingImageGenerationEngine from griptape.structures import Agent -from griptape.tools import OutpaintingImageGenerationClient +from griptape.tools import OutpaintingImageGenerationTool # Create a driver configured to use Stable Diffusion via Bedrock. driver = AmazonBedrockImageGenerationDriver( @@ -15,7 +15,7 @@ ) # Create a tool configured to use the engine. -tool = OutpaintingImageGenerationClient( +tool = OutpaintingImageGenerationTool( engine=engine, ) diff --git a/docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/prompt_image_generation_tool_1.py similarity index 89% rename from docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py rename to docs/griptape-tools/official-tools/src/prompt_image_generation_tool_1.py index f75f904b6..0173cc185 100644 --- a/docs/griptape-tools/official-tools/src/prompt_image_generation_client_1.py +++ b/docs/griptape-tools/official-tools/src/prompt_image_generation_tool_1.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool # Create a driver configured to use Stable Diffusion via Bedrock. driver = AmazonBedrockImageGenerationDriver( @@ -15,7 +15,7 @@ ) # Create a tool configured to use the engine. -tool = PromptImageGenerationClient( +tool = PromptImageGenerationTool( engine=engine, ) diff --git a/docs/griptape-tools/official-tools/src/rag_client_1.py b/docs/griptape-tools/official-tools/src/rag_tool_1.py similarity index 93% rename from docs/griptape-tools/official-tools/src/rag_client_1.py rename to docs/griptape-tools/official-tools/src/rag_tool_1.py index 01e71e253..7cefd065b 100644 --- a/docs/griptape-tools/official-tools/src/rag_client_1.py +++ b/docs/griptape-tools/official-tools/src/rag_tool_1.py @@ -4,7 +4,7 @@ from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.structures import Agent -from griptape.tools import RagClient +from griptape.tools import RagTool vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) @@ -15,7 +15,7 @@ vector_store_driver.upsert_text_artifact(artifact=artifact, namespace="griptape") -rag_client = RagClient( +rag_tool = RagTool( description="Contains information about Griptape", off_prompt=False, rag_engine=RagEngine( @@ -32,6 +32,6 @@ ), ) -agent = Agent(tools=[rag_client]) +agent = Agent(tools=[rag_tool]) agent.run("what is Griptape?") diff --git a/docs/griptape-tools/official-tools/src/rest_api_client_1.py b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py similarity index 98% rename from docs/griptape-tools/official-tools/src/rest_api_client_1.py rename to docs/griptape-tools/official-tools/src/rest_api_tool_1.py index 026874283..2093163b7 100644 --- a/docs/griptape-tools/official-tools/src/rest_api_client_1.py +++ b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py @@ -5,13 +5,13 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import RestApiClient +from griptape.tools import RestApiTool config.drivers = DriverConfig( prompt=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), ) -posts_client = RestApiClient( +posts_client = RestApiTool( base_url="https://jsonplaceholder.typicode.com", path="posts", description="Allows for creating, updating, deleting, patching, and getting posts.", diff --git a/docs/griptape-tools/official-tools/src/sql_client_1.py b/docs/griptape-tools/official-tools/src/sql_tool_1.py similarity index 91% rename from docs/griptape-tools/official-tools/src/sql_client_1.py rename to docs/griptape-tools/official-tools/src/sql_tool_1.py index 3e89d6096..f7630891f 100644 --- a/docs/griptape-tools/official-tools/src/sql_client_1.py +++ b/docs/griptape-tools/official-tools/src/sql_tool_1.py @@ -5,7 +5,7 @@ from griptape.drivers import AmazonRedshiftSqlDriver from griptape.loaders import SqlLoader from griptape.structures import Agent -from griptape.tools import SqlClient +from griptape.tools import SqlTool session = boto3.Session() @@ -17,7 +17,7 @@ ) ) -sql_tool = SqlClient( +sql_tool = SqlTool( sql_loader=sql_loader, table_name="people", table_description="contains information about tech industry professionals", diff --git a/docs/griptape-tools/official-tools/src/structure_run_client_1.py b/docs/griptape-tools/official-tools/src/structure_run_tool_1.py similarity index 83% rename from docs/griptape-tools/official-tools/src/structure_run_client_1.py rename to docs/griptape-tools/official-tools/src/structure_run_tool_1.py index 10f48b80d..575092ce6 100644 --- a/docs/griptape-tools/official-tools/src/structure_run_client_1.py +++ b/docs/griptape-tools/official-tools/src/structure_run_tool_1.py @@ -2,13 +2,13 @@ from griptape.drivers import GriptapeCloudStructureRunDriver from griptape.structures import Agent -from griptape.tools import StructureRunClient +from griptape.tools import StructureRunTool base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] -structure_run_tool = StructureRunClient( +structure_run_tool = StructureRunTool( description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", driver=GriptapeCloudStructureRunDriver( base_url=base_url, @@ -17,7 +17,7 @@ ), ) -# Set up an agent using the StructureRunClient tool +# Set up an agent using the StructureRunTool tool agent = Agent(tools=[structure_run_tool]) # Task: Ask the Griptape Cloud Hosted Structure about modular RAG diff --git a/docs/griptape-tools/official-tools/src/task_memory_client_1.py b/docs/griptape-tools/official-tools/src/task_memory_client_1.py deleted file mode 100644 index e9c2562a1..000000000 --- a/docs/griptape-tools/official-tools/src/task_memory_client_1.py +++ /dev/null @@ -1,4 +0,0 @@ -from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper - -Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) diff --git a/docs/griptape-tools/official-tools/src/task_memory_tool_1.py b/docs/griptape-tools/official-tools/src/task_memory_tool_1.py new file mode 100644 index 000000000..f5c2c487f --- /dev/null +++ b/docs/griptape-tools/official-tools/src/task_memory_tool_1.py @@ -0,0 +1,4 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryTool, WebScraperTool + +Agent(tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) diff --git a/docs/griptape-tools/official-tools/src/text_to_speech_client_1.py b/docs/griptape-tools/official-tools/src/text_to_speech_tool_1.py similarity index 81% rename from docs/griptape-tools/official-tools/src/text_to_speech_client_1.py rename to docs/griptape-tools/official-tools/src/text_to_speech_tool_1.py index c6a03b80d..376113d63 100644 --- a/docs/griptape-tools/official-tools/src/text_to_speech_client_1.py +++ b/docs/griptape-tools/official-tools/src/text_to_speech_tool_1.py @@ -3,7 +3,7 @@ from griptape.drivers import ElevenLabsTextToSpeechDriver from griptape.engines import TextToSpeechEngine from griptape.structures import Agent -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.tools.text_to_speech.tool import TextToSpeechTool driver = ElevenLabsTextToSpeechDriver( api_key=os.environ["ELEVEN_LABS_API_KEY"], @@ -11,7 +11,7 @@ voice="Matilda", ) -tool = TextToSpeechClient( +tool = TextToSpeechTool( engine=TextToSpeechEngine( text_to_speech_driver=driver, ), diff --git a/docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py b/docs/griptape-tools/official-tools/src/variation_image_generation_tool_1.py similarity index 90% rename from docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py rename to docs/griptape-tools/official-tools/src/variation_image_generation_tool_1.py index 6c4432d52..209d97a7b 100644 --- a/docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py +++ b/docs/griptape-tools/official-tools/src/variation_image_generation_tool_1.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import VariationImageGenerationEngine from griptape.structures import Agent -from griptape.tools import VariationImageGenerationClient +from griptape.tools import VariationImageGenerationTool # Create a driver configured to use Stable Diffusion via Bedrock. driver = AmazonBedrockImageGenerationDriver( @@ -17,7 +17,7 @@ ) # Create a tool configured to use the engine. -tool = VariationImageGenerationClient( +tool = VariationImageGenerationTool( engine=engine, ) diff --git a/docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py b/docs/griptape-tools/official-tools/src/variation_image_generation_tool_2.py similarity index 89% rename from docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py rename to docs/griptape-tools/official-tools/src/variation_image_generation_tool_2.py index d98aec199..036b75d48 100644 --- a/docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py +++ b/docs/griptape-tools/official-tools/src/variation_image_generation_tool_2.py @@ -1,7 +1,7 @@ from griptape.drivers import AmazonBedrockImageGenerationDriver, BedrockStableDiffusionImageGenerationModelDriver from griptape.engines import PromptImageGenerationEngine, VariationImageGenerationEngine from griptape.structures import Agent -from griptape.tools import PromptImageGenerationClient, VariationImageGenerationClient +from griptape.tools import PromptImageGenerationTool, VariationImageGenerationTool # Create a driver configured to use Stable Diffusion via Bedrock. driver = AmazonBedrockImageGenerationDriver( @@ -17,7 +17,7 @@ ) # Create a prompt image generation client configured to use the engine. -prompt_tool = PromptImageGenerationClient( +prompt_tool = PromptImageGenerationTool( engine=prompt_engine, ) @@ -27,7 +27,7 @@ ) # Create a variation image generation client configured to use the engine. -variation_tool = VariationImageGenerationClient( +variation_tool = VariationImageGenerationTool( engine=variation_engine, ) diff --git a/docs/griptape-tools/official-tools/src/vector_store_client_1.py b/docs/griptape-tools/official-tools/src/vector_store_tool_1.py similarity index 81% rename from docs/griptape-tools/official-tools/src/vector_store_client_1.py rename to docs/griptape-tools/official-tools/src/vector_store_tool_1.py index df9117960..57ca7b25b 100644 --- a/docs/griptape-tools/official-tools/src/vector_store_client_1.py +++ b/docs/griptape-tools/official-tools/src/vector_store_tool_1.py @@ -2,7 +2,7 @@ from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, VectorStoreClient +from griptape.tools import TaskMemoryTool, VectorStoreTool vector_store_driver = LocalVectorStoreDriver( embedding_driver=OpenAiEmbeddingDriver(), @@ -13,13 +13,13 @@ raise Exception(artifacts.value) vector_store_driver.upsert_text_artifacts({"griptape": artifacts}) -vector_db = VectorStoreClient( +vector_db = VectorStoreTool( description="This DB has information about the Griptape Python framework", vector_store_driver=vector_store_driver, query_params={"namespace": "griptape"}, off_prompt=True, ) -agent = Agent(tools=[vector_db, TaskMemoryClient(off_prompt=False)]) +agent = Agent(tools=[vector_db, TaskMemoryTool(off_prompt=False)]) agent.run("what is Griptape?") diff --git a/docs/griptape-tools/official-tools/src/web_scraper_1.py b/docs/griptape-tools/official-tools/src/web_scraper_1.py deleted file mode 100644 index 138e8600f..000000000 --- a/docs/griptape-tools/official-tools/src/web_scraper_1.py +++ /dev/null @@ -1,6 +0,0 @@ -from griptape.structures import Agent -from griptape.tools import TaskMemoryClient, WebScraper - -agent = Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) - -agent.run("Based on https://www.griptape.ai/, tell me what griptape is") diff --git a/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py b/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py new file mode 100644 index 000000000..7716acde4 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py @@ -0,0 +1,6 @@ +from griptape.structures import Agent +from griptape.tools import TaskMemoryTool, WebScraperTool + +agent = Agent(tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) + +agent.run("Based on https://www.griptape.ai/, tell me what griptape is") diff --git a/docs/griptape-tools/official-tools/src/web_search_1.py b/docs/griptape-tools/official-tools/src/web_search_tool_1.py similarity index 71% rename from docs/griptape-tools/official-tools/src/web_search_1.py rename to docs/griptape-tools/official-tools/src/web_search_tool_1.py index 70603a693..3469ad7f9 100644 --- a/docs/griptape-tools/official-tools/src/web_search_1.py +++ b/docs/griptape-tools/official-tools/src/web_search_tool_1.py @@ -2,10 +2,10 @@ from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent -from griptape.tools import WebSearch +from griptape.tools import WebSearchTool -# Initialize the WebSearch tool with necessary parameters -web_search_tool = WebSearch( +# Initialize the WebSearchTool tool with necessary parameters +web_search_tool = WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"], @@ -15,7 +15,7 @@ ), ) -# Set up an agent using the WebSearch tool +# Set up an agent using the WebSearchTool tool agent = Agent(tools=[web_search_tool]) # Task: Search the web for a specific query diff --git a/docs/griptape-tools/official-tools/src/web_search_2.py b/docs/griptape-tools/official-tools/src/web_search_tool_2.py similarity index 91% rename from docs/griptape-tools/official-tools/src/web_search_2.py rename to docs/griptape-tools/official-tools/src/web_search_tool_2.py index b40eac094..dd9c32655 100644 --- a/docs/griptape-tools/official-tools/src/web_search_2.py +++ b/docs/griptape-tools/official-tools/src/web_search_tool_2.py @@ -4,11 +4,11 @@ from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent -from griptape.tools import WebSearch +from griptape.tools import WebSearchTool agent = Agent( tools=[ - WebSearch( + WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"], diff --git a/docs/griptape-tools/official-tools/structure-run-client.md b/docs/griptape-tools/official-tools/structure-run-tool.md similarity index 90% rename from docs/griptape-tools/official-tools/structure-run-client.md rename to docs/griptape-tools/official-tools/structure-run-tool.md index 139633059..7b73e5b52 100644 --- a/docs/griptape-tools/official-tools/structure-run-client.md +++ b/docs/griptape-tools/official-tools/structure-run-tool.md @@ -1,20 +1,20 @@ -# StructureRunClient +# Structure Run Tool -The StructureRunClient Tool provides a way to run Structures via a Tool. +The [StructureRunTool](../../reference/griptape/tools/structure_run/tool.md) Tool provides a way to run Structures via a Tool. It requires you to provide a [Structure Run Driver](../../griptape-framework/drivers/structure-run-drivers.md) to run the Structure in the desired environment. ```python ---8<-- "docs/griptape-tools/official-tools/src/structure_run_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/structure_run_tool_1.py" ``` ``` [05/02/24 13:50:03] INFO ToolkitTask 4e9458375bda4fbcadb77a94624ed64c Input: what is modular RAG? [05/02/24 13:50:10] INFO Subtask 5ef2d72028fc495aa7faf6f46825b004 - Thought: To answer this question, I need to run a search for the term "modular RAG". I will use the StructureRunClient action to execute a + Thought: To answer this question, I need to run a search for the term "modular RAG". I will use the StructureRunTool action to execute a search structure. Actions: [ { - "name": "StructureRunClient", + "name": "StructureRunTool", "path": "run_structure", "input": { "values": { diff --git a/docs/griptape-tools/official-tools/task-memory-client.md b/docs/griptape-tools/official-tools/task-memory-tool.md similarity index 74% rename from docs/griptape-tools/official-tools/task-memory-client.md rename to docs/griptape-tools/official-tools/task-memory-tool.md index fa88c85b9..a988c3a64 100644 --- a/docs/griptape-tools/official-tools/task-memory-client.md +++ b/docs/griptape-tools/official-tools/task-memory-tool.md @@ -1,7 +1,7 @@ -# TaskMemoryClient +# Task Memory Tool Tool This tool enables LLMs to query and summarize task outputs that are stored in short-term tool memory. This tool uniquely requires the user to set the `off_prompt` property explicitly for usability reasons (Griptape doesn't provide the default `True` value). ```python ---8<-- "docs/griptape-tools/official-tools/src/task_memory_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/task_memory_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/text-to-speech-client.md b/docs/griptape-tools/official-tools/text-to-speech-tool.md similarity index 72% rename from docs/griptape-tools/official-tools/text-to-speech-client.md rename to docs/griptape-tools/official-tools/text-to-speech-tool.md index d7fa043a7..ac3f54f8e 100644 --- a/docs/griptape-tools/official-tools/text-to-speech-client.md +++ b/docs/griptape-tools/official-tools/text-to-speech-tool.md @@ -1,7 +1,7 @@ -# TextToSpeechClient +# Text To Speech Tool This Tool enables LLMs to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). ```python ---8<-- "docs/griptape-tools/official-tools/src/text_to_speech_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/text_to_speech_tool_1.py" ``` diff --git a/docs/griptape-tools/official-tools/variation-image-generation-client.md b/docs/griptape-tools/official-tools/variation-image-generation-tool.md similarity index 83% rename from docs/griptape-tools/official-tools/variation-image-generation-client.md rename to docs/griptape-tools/official-tools/variation-image-generation-tool.md index 4b5880ef8..bcc8c3f61 100644 --- a/docs/griptape-tools/official-tools/variation-image-generation-client.md +++ b/docs/griptape-tools/official-tools/variation-image-generation-tool.md @@ -1,15 +1,15 @@ -# VariationImageGenerationEngine +# Variation Image Generation Engine Tool This Tool allows LLMs to generate variations of an input image from a text prompt. The input image can be provided either by its file path or by its [Task Memory](../../griptape-framework/structures/task-memory.md) reference. ## Referencing an Image by File Path ```python ---8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_client_1.py" +--8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_tool_1.py" ``` ## Referencing an Image in Task Memory ```python ---8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_client_2.py" +--8<-- "docs/griptape-tools/official-tools/src/variation_image_generation_client_tool_2.py" ``` diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md deleted file mode 100644 index 8fd280ec9..000000000 --- a/docs/griptape-tools/official-tools/vector-store-client.md +++ /dev/null @@ -1,7 +0,0 @@ -The [VectorStoreClient](../../reference/griptape/tools/vector_store_client/tool.md) enables LLMs to query vector stores. - -Here is an example of how it can be used with a local vector store driver: - -```python ---8<-- "docs/griptape-tools/official-tools/src/vector_store_client_1.py" -``` diff --git a/docs/griptape-tools/official-tools/vector-store-tool.md b/docs/griptape-tools/official-tools/vector-store-tool.md new file mode 100644 index 000000000..7317c25db --- /dev/null +++ b/docs/griptape-tools/official-tools/vector-store-tool.md @@ -0,0 +1,9 @@ +# Vector Store Tool + +The [VectorStoreTool](../../reference/griptape/tools/vector_store/tool.md) enables LLMs to query vector stores. + +Here is an example of how it can be used with a local vector store driver: + +```python +--8<-- "docs/griptape-tools/official-tools/src/vector_store_tool_1.py" +``` diff --git a/docs/griptape-tools/official-tools/web-scraper.md b/docs/griptape-tools/official-tools/web-scraper-tool.md similarity index 96% rename from docs/griptape-tools/official-tools/web-scraper.md rename to docs/griptape-tools/official-tools/web-scraper-tool.md index 5d8e1fe27..1261d955d 100644 --- a/docs/griptape-tools/official-tools/web-scraper.md +++ b/docs/griptape-tools/official-tools/web-scraper-tool.md @@ -1,9 +1,9 @@ -# WebScraper +# Web Scraper Tool This tool enables LLMs to scrape web pages for full text, summaries, authors, titles, and keywords. It can also execute search queries to answer specific questions about the page. This tool uses OpenAI APIs for some of its activities, so in order to use it provide a valid API key in `openai_api_key`. ```python ---8<-- "docs/griptape-tools/official-tools/src/web_scraper_1.py" +--8<-- "docs/griptape-tools/official-tools/src/web_scraper_tool_1.py" ``` ``` [09/11/23 15:27:39] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed @@ -29,7 +29,7 @@ This tool enables LLMs to scrape web pages for full text, summaries, authors, ti in memory. I can use the TaskMemory tool with the summarize activity to get a summary of the content. - Action: {"name": "TaskMemoryClient", "path": + Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "02da5930b8d74f7ca30aecc3760a3318"}}} diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search-tool.md similarity index 97% rename from docs/griptape-tools/official-tools/web-search.md rename to docs/griptape-tools/official-tools/web-search-tool.md index 3d0495229..3f31fd4fd 100644 --- a/docs/griptape-tools/official-tools/web-search.md +++ b/docs/griptape-tools/official-tools/web-search-tool.md @@ -1,9 +1,9 @@ -# WebSearch +# Web Search Tool This tool enables LLMs to search the web. ```python ---8<-- "docs/griptape-tools/official-tools/src/web_search_1.py" +--8<-- "docs/griptape-tools/official-tools/src/web_search_tool_1.py" ``` ``` [09/08/23 15:37:25] INFO Task 2cf557f7f7cd4a20a7fa2f0c46af2f71 @@ -93,5 +93,5 @@ Extra schema properties can be added to the Tool to allow for more customization In this example, we add a `sort` property to the `search` Activity which will be added as a [Google custom search query parameter](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list). ```python ---8<-- "docs/griptape-tools/official-tools/src/web_search_2.py" +--8<-- "docs/griptape-tools/official-tools/src/web_search_tool_2.py" ``` diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index d99b63b6c..c33b9f0b0 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -1,67 +1,67 @@ from .base_tool import BaseTool -from .base_image_generation_client import BaseImageGenerationClient -from .calculator.tool import Calculator -from .web_search.tool import WebSearch -from .web_scraper.tool import WebScraper -from .sql_client.tool import SqlClient -from .email_client.tool import EmailClient -from .rest_api_client.tool import RestApiClient -from .file_manager.tool import FileManager -from .vector_store_client.tool import VectorStoreClient -from .date_time.tool import DateTime -from .task_memory_client.tool import TaskMemoryClient -from .base_aws_client import BaseAwsClient -from .aws_iam_client.tool import AwsIamClient -from .aws_s3_client.tool import AwsS3Client -from .computer.tool import Computer -from .base_google_client import BaseGoogleClient -from .google_gmail.tool import GoogleGmailClient -from .google_cal.tool import GoogleCalendarClient -from .google_docs.tool import GoogleDocsClient -from .google_drive.tool import GoogleDriveClient -from .openweather_client.tool import OpenWeatherClient -from .prompt_image_generation_client.tool import PromptImageGenerationClient -from .variation_image_generation_client.tool import VariationImageGenerationClient -from .inpainting_image_generation_client.tool import InpaintingImageGenerationClient -from .outpainting_image_generation_client.tool import OutpaintingImageGenerationClient -from .griptape_cloud_knowledge_base_client.tool import GriptapeCloudKnowledgeBaseClient -from .structure_run_client.tool import StructureRunClient -from .image_query_client.tool import ImageQueryClient -from .rag_client.tool import RagClient -from .text_to_speech_client.tool import TextToSpeechClient -from .audio_transcription_client.tool import AudioTranscriptionClient +from .base_image_generation_tool import BaseImageGenerationTool +from .calculator.tool import CalculatorTool +from .web_search.tool import WebSearchTool +from .web_scraper.tool import WebScraperTool +from .sql.tool import SqlTool +from .email.tool import EmailTool +from .rest_api.tool import RestApiTool +from .file_manager.tool import FileManagerTool +from .vector_store.tool import VectorStoreTool +from .date_time.tool import DateTimeTool +from .task_memory.tool import TaskMemoryTool +from .base_aws_tool import BaseAwsTool +from .aws_iam.tool import AwsIamTool +from .aws_s3.tool import AwsS3Tool +from .computer.tool import ComputerTool +from .base_google_tool import BaseGoogleTool +from .google_gmail.tool import GoogleGmailTool +from .google_calendar.tool import GoogleCalendarTool +from .google_docs.tool import GoogleDocsTool +from .google_drive.tool import GoogleDriveTool +from .openweather.tool import OpenWeatherTool +from .prompt_image_generation.tool import PromptImageGenerationTool +from .variation_image_generation.tool import VariationImageGenerationTool +from .inpainting_image_generation.tool import InpaintingImageGenerationTool +from .outpainting_image_generation.tool import OutpaintingImageGenerationTool +from .griptape_cloud_knowledge_base.tool import GriptapeCloudKnowledgeBaseTool +from .structure_run.tool import StructureRunTool +from .image_query.tool import ImageQueryTool +from .rag.tool import RagTool +from .text_to_speech.tool import TextToSpeechTool +from .audio_transcription.tool import AudioTranscriptionTool __all__ = [ "BaseTool", - "BaseImageGenerationClient", - "BaseAwsClient", - "AwsIamClient", - "AwsS3Client", - "BaseGoogleClient", - "GoogleGmailClient", - "GoogleDocsClient", - "GoogleCalendarClient", - "GoogleDriveClient", - "Calculator", - "WebSearch", - "WebScraper", - "SqlClient", - "EmailClient", - "RestApiClient", - "FileManager", - "VectorStoreClient", - "DateTime", - "TaskMemoryClient", - "Computer", - "OpenWeatherClient", - "PromptImageGenerationClient", - "VariationImageGenerationClient", - "InpaintingImageGenerationClient", - "OutpaintingImageGenerationClient", - "GriptapeCloudKnowledgeBaseClient", - "StructureRunClient", - "ImageQueryClient", - "RagClient", - "TextToSpeechClient", - "AudioTranscriptionClient", + "BaseImageGenerationTool", + "BaseAwsTool", + "AwsIamTool", + "AwsS3Tool", + "BaseGoogleTool", + "GoogleGmailTool", + "GoogleDocsTool", + "GoogleCalendarTool", + "GoogleDriveTool", + "CalculatorTool", + "WebSearchTool", + "WebScraperTool", + "SqlTool", + "EmailTool", + "RestApiTool", + "FileManagerTool", + "VectorStoreTool", + "DateTimeTool", + "TaskMemoryTool", + "ComputerTool", + "OpenWeatherTool", + "PromptImageGenerationTool", + "VariationImageGenerationTool", + "InpaintingImageGenerationTool", + "OutpaintingImageGenerationTool", + "GriptapeCloudKnowledgeBaseTool", + "StructureRunTool", + "ImageQueryTool", + "RagTool", + "TextToSpeechTool", + "AudioTranscriptionTool", ] diff --git a/griptape/tools/audio_transcription_client/__init__.py b/griptape/tools/audio_transcription/__init__.py similarity index 100% rename from griptape/tools/audio_transcription_client/__init__.py rename to griptape/tools/audio_transcription/__init__.py diff --git a/griptape/tools/audio_transcription_client/manifest.yml b/griptape/tools/audio_transcription/manifest.yml similarity index 84% rename from griptape/tools/audio_transcription_client/manifest.yml rename to griptape/tools/audio_transcription/manifest.yml index 6bbe4a21a..32b017c55 100644 --- a/griptape/tools/audio_transcription_client/manifest.yml +++ b/griptape/tools/audio_transcription/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Transcription Client +name: Transcription Tool description: A tool for generating transcription of audio. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription/tool.py similarity index 98% rename from griptape/tools/audio_transcription_client/tool.py rename to griptape/tools/audio_transcription/tool.py index 62cd9e7a5..4174db209 100644 --- a/griptape/tools/audio_transcription_client/tool.py +++ b/griptape/tools/audio_transcription/tool.py @@ -17,7 +17,7 @@ @define -class AudioTranscriptionClient(BaseTool): +class AudioTranscriptionTool(BaseTool): """A tool that can be used to generate transcriptions from input audio.""" engine: AudioTranscriptionEngine = field(kw_only=True) diff --git a/griptape/tools/aws_iam_client/__init__.py b/griptape/tools/aws_iam/__init__.py similarity index 100% rename from griptape/tools/aws_iam_client/__init__.py rename to griptape/tools/aws_iam/__init__.py diff --git a/griptape/tools/aws_iam_client/manifest.yml b/griptape/tools/aws_iam/manifest.yml similarity index 86% rename from griptape/tools/aws_iam_client/manifest.yml rename to griptape/tools/aws_iam/manifest.yml index ea825527f..072d4f92e 100644 --- a/griptape/tools/aws_iam_client/manifest.yml +++ b/griptape/tools/aws_iam/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: AWS IAM Client +name: AWS IAM Tool description: Tool for the IAM boto3 API. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam/tool.py similarity index 97% rename from griptape/tools/aws_iam_client/tool.py rename to griptape/tools/aws_iam/tool.py index 1be0251f0..8d22dd3c9 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam/tool.py @@ -6,7 +6,7 @@ from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact -from griptape.tools import BaseAwsClient +from griptape.tools import BaseAwsTool from griptape.utils.decorators import activity if TYPE_CHECKING: @@ -14,7 +14,7 @@ @define -class AwsIamClient(BaseAwsClient): +class AwsIamTool(BaseAwsTool): iam_client: Client = field(default=Factory(lambda self: self.session.client("iam"), takes_self=True), kw_only=True) @activity( diff --git a/griptape/tools/aws_s3_client/__init__.py b/griptape/tools/aws_s3/__init__.py similarity index 100% rename from griptape/tools/aws_s3_client/__init__.py rename to griptape/tools/aws_s3/__init__.py diff --git a/griptape/tools/aws_s3_client/manifest.yml b/griptape/tools/aws_s3/manifest.yml similarity index 86% rename from griptape/tools/aws_s3_client/manifest.yml rename to griptape/tools/aws_s3/manifest.yml index 642b6c588..a48169f0c 100644 --- a/griptape/tools/aws_s3_client/manifest.yml +++ b/griptape/tools/aws_s3/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: AWS S3 Client +name: AWS S3 Tool description: Tool for the S3 boto3 API. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3/tool.py similarity index 99% rename from griptape/tools/aws_s3_client/tool.py rename to griptape/tools/aws_s3/tool.py index 8f67195a1..24d091d71 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3/tool.py @@ -7,7 +7,7 @@ from schema import Literal, Schema from griptape.artifacts import BlobArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact -from griptape.tools import BaseAwsClient +from griptape.tools import BaseAwsTool from griptape.utils.decorators import activity if TYPE_CHECKING: @@ -15,7 +15,7 @@ @define -class AwsS3Client(BaseAwsClient): +class AwsS3Tool(BaseAwsTool): s3_client: Client = field(default=Factory(lambda self: self.session.client("s3"), takes_self=True), kw_only=True) @activity( diff --git a/griptape/tools/base_aws_client.py b/griptape/tools/base_aws_tool.py similarity index 95% rename from griptape/tools/base_aws_client.py rename to griptape/tools/base_aws_tool.py index 8c6d02e2b..72fc54583 100644 --- a/griptape/tools/base_aws_client.py +++ b/griptape/tools/base_aws_tool.py @@ -14,7 +14,7 @@ @define -class BaseAwsClient(BaseTool, ABC): +class BaseAwsTool(BaseTool, ABC): session: boto3.Session = field(kw_only=True) @activity(config={"description": "Can be used to get current AWS account and IAM principal."}) diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_tool.py similarity index 98% rename from griptape/tools/base_google_client.py rename to griptape/tools/base_google_tool.py index 2a38d8ffe..c40a583cf 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_tool.py @@ -9,7 +9,7 @@ @define -class BaseGoogleClient(BaseTool, ABC): +class BaseGoogleTool(BaseTool, ABC): DRIVE_FILE_SCOPES = ["https://www.googleapis.com/auth/drive.file"] DRIVE_AUTH_SCOPES = ["https://www.googleapis.com/auth/drive"] diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_tool.py similarity index 93% rename from griptape/tools/base_griptape_cloud_client.py rename to griptape/tools/base_griptape_cloud_tool.py index 4f5692957..7ee8f2dfc 100644 --- a/griptape/tools/base_griptape_cloud_client.py +++ b/griptape/tools/base_griptape_cloud_tool.py @@ -8,7 +8,7 @@ @define -class BaseGriptapeCloudClient(BaseTool, ABC): +class BaseGriptapeCloudTool(BaseTool, ABC): """Base class for Griptape Cloud clients. Attributes: diff --git a/griptape/tools/base_image_generation_client.py b/griptape/tools/base_image_generation_tool.py similarity index 88% rename from griptape/tools/base_image_generation_client.py rename to griptape/tools/base_image_generation_tool.py index e85336d23..487c6d1ba 100644 --- a/griptape/tools/base_image_generation_client.py +++ b/griptape/tools/base_image_generation_tool.py @@ -5,7 +5,7 @@ @define -class BaseImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): +class BaseImageGenerationTool(BlobArtifactFileOutputMixin, BaseTool): """A base class for tools that generate images from text prompts.""" PROMPT_DESCRIPTION = "Features and qualities to include in the generated image, descriptive and succinct." diff --git a/griptape/tools/calculator/manifest.yml b/griptape/tools/calculator/manifest.yml index 717313495..dd902c616 100644 --- a/griptape/tools/calculator/manifest.yml +++ b/griptape/tools/calculator/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Calculator +name: Calculator Tool description: Tool for making simple calculations in Python. contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/calculator/tool.py b/griptape/tools/calculator/tool.py index e8fcb1ed4..ed128987f 100644 --- a/griptape/tools/calculator/tool.py +++ b/griptape/tools/calculator/tool.py @@ -5,7 +5,7 @@ from griptape.utils.decorators import activity -class Calculator(BaseTool): +class CalculatorTool(BaseTool): @activity( config={ "description": "Can be used for computing simple numerical or algebraic calculations in Python", diff --git a/griptape/tools/computer/manifest.yml b/griptape/tools/computer/manifest.yml index 706c32b5b..4c5d30495 100644 --- a/griptape/tools/computer/manifest.yml +++ b/griptape/tools/computer/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Computer +name: Computer Tool description: Tool that allows LLMs to run Python code and access the shell contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 4e996c63c..e2da2d9f8 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -23,7 +23,7 @@ @define -class Computer(BaseTool): +class ComputerTool(BaseTool): local_workdir: Optional[str] = field(default=None, kw_only=True) container_workdir: str = field(default="/griptape", kw_only=True) env_vars: dict = field(factory=dict, kw_only=True) diff --git a/griptape/tools/date_time/manifest.yml b/griptape/tools/date_time/manifest.yml index c50b46ed8..da8e553a5 100644 --- a/griptape/tools/date_time/manifest.yml +++ b/griptape/tools/date_time/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Date Time +name: Date Time Tool description: Tool that allows LLMs to retrieve the current date & time contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/date_time/tool.py b/griptape/tools/date_time/tool.py index 728a3449a..5181dbe3e 100644 --- a/griptape/tools/date_time/tool.py +++ b/griptape/tools/date_time/tool.py @@ -7,7 +7,7 @@ from griptape.utils.decorators import activity -class DateTime(BaseTool): +class DateTimeTool(BaseTool): @activity(config={"description": "Can be used to return current date and time."}) def get_current_datetime(self, _: dict) -> BaseArtifact: try: diff --git a/griptape/tools/email_client/__init__.py b/griptape/tools/email/__init__.py similarity index 100% rename from griptape/tools/email_client/__init__.py rename to griptape/tools/email/__init__.py diff --git a/griptape/tools/email_client/manifest.yml b/griptape/tools/email/manifest.yml similarity index 87% rename from griptape/tools/email_client/manifest.yml rename to griptape/tools/email/manifest.yml index c1e04b226..08009292d 100644 --- a/griptape/tools/email_client/manifest.yml +++ b/griptape/tools/email/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Email Client +name: Email Tool description: Tool for working with email. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/email_client/tool.py b/griptape/tools/email/tool.py similarity index 99% rename from griptape/tools/email_client/tool.py rename to griptape/tools/email/tool.py index 26c13bb9f..f5e7f0247 100644 --- a/griptape/tools/email_client/tool.py +++ b/griptape/tools/email/tool.py @@ -16,7 +16,7 @@ @define -class EmailClient(BaseTool): +class EmailTool(BaseTool): """Tool for working with email. Attributes: diff --git a/griptape/tools/file_manager/manifest.yml b/griptape/tools/file_manager/manifest.yml index 8778098fb..132a03327 100644 --- a/griptape/tools/file_manager/manifest.yml +++ b/griptape/tools/file_manager/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: File Manager +name: File Manager Tool description: Tool for managing files in the local environment. contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index c0cb691ea..a3e17a8c4 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -12,8 +12,8 @@ @define -class FileManager(BaseTool): - """FileManager is a tool that can be used to list, load, and save files. +class FileManagerTool(BaseTool): + """FileManagerTool is a tool that can be used to list, load, and save files. Attributes: file_manager_driver: File Manager Driver to use to list, load, and save files. diff --git a/griptape/tools/google_cal/__init__.py b/griptape/tools/google_calendar/__init__.py similarity index 100% rename from griptape/tools/google_cal/__init__.py rename to griptape/tools/google_calendar/__init__.py diff --git a/griptape/tools/google_cal/manifest.yml b/griptape/tools/google_calendar/manifest.yml similarity index 100% rename from griptape/tools/google_cal/manifest.yml rename to griptape/tools/google_calendar/manifest.yml diff --git a/griptape/tools/google_cal/requirements.txt b/griptape/tools/google_calendar/requirements.txt similarity index 100% rename from griptape/tools/google_cal/requirements.txt rename to griptape/tools/google_calendar/requirements.txt diff --git a/griptape/tools/google_cal/tool.py b/griptape/tools/google_calendar/tool.py similarity index 98% rename from griptape/tools/google_cal/tool.py rename to griptape/tools/google_calendar/tool.py index 70f685605..de9c4e8e1 100644 --- a/griptape/tools/google_cal/tool.py +++ b/griptape/tools/google_calendar/tool.py @@ -7,12 +7,12 @@ from schema import Literal, Optional, Schema from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact -from griptape.tools import BaseGoogleClient +from griptape.tools import BaseGoogleTool from griptape.utils.decorators import activity @define -class GoogleCalendarClient(BaseGoogleClient): +class GoogleCalendarTool(BaseGoogleTool): CREATE_EVENT_SCOPES = ["https://www.googleapis.com/auth/calendar"] GET_UPCOMING_EVENTS_SCOPES = ["https://www.googleapis.com/auth/calendar"] diff --git a/griptape/tools/google_docs/tool.py b/griptape/tools/google_docs/tool.py index b3564b9b2..be40b09da 100644 --- a/griptape/tools/google_docs/tool.py +++ b/griptape/tools/google_docs/tool.py @@ -6,12 +6,12 @@ from schema import Literal, Optional, Schema from griptape.artifacts import ErrorArtifact, InfoArtifact -from griptape.tools import BaseGoogleClient +from griptape.tools import BaseGoogleTool from griptape.utils.decorators import activity @define -class GoogleDocsClient(BaseGoogleClient): +class GoogleDocsTool(BaseGoogleTool): DOCS_SCOPES = ["https://www.googleapis.com/auth/documents"] DEFAULT_FOLDER_PATH = "root" diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index 37122a56b..1642ebaf7 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -9,12 +9,12 @@ from schema import Literal, Or, Schema from griptape.artifacts import BlobArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact -from griptape.tools import BaseGoogleClient +from griptape.tools import BaseGoogleTool from griptape.utils.decorators import activity @define -class GoogleDriveClient(BaseGoogleClient): +class GoogleDriveTool(BaseGoogleTool): LIST_FILES_SCOPES = ["https://www.googleapis.com/auth/drive.readonly"] GOOGLE_EXPORT_MIME_MAPPING = { diff --git a/griptape/tools/google_gmail/manifest.yml b/griptape/tools/google_gmail/manifest.yml index 262e3a6f8..869575166 100644 --- a/griptape/tools/google_gmail/manifest.yml +++ b/griptape/tools/google_gmail/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Google Gmail Client +name: Google Gmail Tool description: Tool for working with Google Gmail. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/google_gmail/tool.py b/griptape/tools/google_gmail/tool.py index 853b8850f..2cc959168 100644 --- a/griptape/tools/google_gmail/tool.py +++ b/griptape/tools/google_gmail/tool.py @@ -8,12 +8,12 @@ from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, InfoArtifact -from griptape.tools import BaseGoogleClient +from griptape.tools import BaseGoogleTool from griptape.utils.decorators import activity @define -class GoogleGmailClient(BaseGoogleClient): +class GoogleGmailTool(BaseGoogleTool): CREATE_DRAFT_EMAIL_SCOPES = ["https://www.googleapis.com/auth/gmail.compose"] owner_email: str = field(kw_only=True) diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/__init__.py b/griptape/tools/griptape_cloud_knowledge_base/__init__.py similarity index 100% rename from griptape/tools/griptape_cloud_knowledge_base_client/__init__.py rename to griptape/tools/griptape_cloud_knowledge_base/__init__.py diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/manifest.yml b/griptape/tools/griptape_cloud_knowledge_base/manifest.yml similarity index 78% rename from griptape/tools/griptape_cloud_knowledge_base_client/manifest.yml rename to griptape/tools/griptape_cloud_knowledge_base/manifest.yml index 89b7d2fe3..7262964c3 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/manifest.yml +++ b/griptape/tools/griptape_cloud_knowledge_base/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Griptape Cloud Knowledge Base Client +name: Griptape Cloud Knowledge Base Tool description: Tool for using the Griptape Cloud Knowledge Base API. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base/tool.py similarity index 91% rename from griptape/tools/griptape_cloud_knowledge_base_client/tool.py rename to griptape/tools/griptape_cloud_knowledge_base/tool.py index 0c544524d..13ff76baa 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base/tool.py @@ -7,12 +7,12 @@ from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient +from griptape.tools.base_griptape_cloud_tool import BaseGriptapeCloudTool from griptape.utils.decorators import activity @define -class GriptapeCloudKnowledgeBaseClient(BaseGriptapeCloudClient): +class GriptapeCloudKnowledgeBaseTool(BaseGriptapeCloudTool): """Tool for querying a Griptape Cloud Knowledge Base. Attributes: @@ -64,7 +64,7 @@ def _get_knowledge_base_description(self) -> str: return response_body["description"] else: raise ValueError( - f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute.", + f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseTool.description` attribute.", ) else: raise ValueError(f"Error accessing Knowledge Base {self.knowledge_base_id}.") diff --git a/griptape/tools/image_query_client/__init__.py b/griptape/tools/image_query/__init__.py similarity index 100% rename from griptape/tools/image_query_client/__init__.py rename to griptape/tools/image_query/__init__.py diff --git a/griptape/tools/image_query_client/manifest.yml b/griptape/tools/image_query/manifest.yml similarity index 86% rename from griptape/tools/image_query_client/manifest.yml rename to griptape/tools/image_query/manifest.yml index b73027f6a..504543fca 100644 --- a/griptape/tools/image_query_client/manifest.yml +++ b/griptape/tools/image_query/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Image Query Client +name: Image Query Tool description: Tool for executing a natural language query on images. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query/tool.py similarity index 99% rename from griptape/tools/image_query_client/tool.py rename to griptape/tools/image_query/tool.py index a10929b13..97772d546 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query/tool.py @@ -17,7 +17,7 @@ @define -class ImageQueryClient(BaseTool): +class ImageQueryTool(BaseTool): image_query_engine: ImageQueryEngine = field(kw_only=True) image_loader: ImageLoader = field(default=Factory(lambda: ImageLoader()), kw_only=True) diff --git a/griptape/tools/inpainting_image_generation_client/__init__.py b/griptape/tools/inpainting_image_generation/__init__.py similarity index 100% rename from griptape/tools/inpainting_image_generation_client/__init__.py rename to griptape/tools/inpainting_image_generation/__init__.py diff --git a/griptape/tools/inpainting_image_generation_client/manifest.yml b/griptape/tools/inpainting_image_generation/manifest.yml similarity index 79% rename from griptape/tools/inpainting_image_generation_client/manifest.yml rename to griptape/tools/inpainting_image_generation/manifest.yml index 575c0630d..d6592b741 100644 --- a/griptape/tools/inpainting_image_generation_client/manifest.yml +++ b/griptape/tools/inpainting_image_generation/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Inpainting Image Generation Client +name: Inpainting Image Generation Tool description: Tool for generating images through image inpainting. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/inpainting_image_generation_client/requirements.txt b/griptape/tools/inpainting_image_generation/requirements.txt similarity index 100% rename from griptape/tools/inpainting_image_generation_client/requirements.txt rename to griptape/tools/inpainting_image_generation/requirements.txt diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation/tool.py similarity index 93% rename from griptape/tools/inpainting_image_generation_client/tool.py rename to griptape/tools/inpainting_image_generation/tool.py index e8979efb0..d32f481d9 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation/tool.py @@ -8,7 +8,7 @@ from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.tools.base_image_generation_client import BaseImageGenerationClient +from griptape.tools.base_image_generation_tool import BaseImageGenerationTool from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class InpaintingImageGenerationClient(BaseImageGenerationClient): +class InpaintingImageGenerationTool(BaseImageGenerationTool): """A tool that can be used to generate prompted inpaintings of an image. Attributes: @@ -34,8 +34,8 @@ class InpaintingImageGenerationClient(BaseImageGenerationClient): "description": "Modifies an image within a specified mask area using image and mask files.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -63,8 +63,8 @@ def image_inpainting_from_file(self, params: dict[str, dict[str, str]]) -> Image "description": "Modifies an image within a specified mask area using image and mask artifacts in memory.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "image_artifact_namespace": str, "image_artifact_name": str, diff --git a/griptape/tools/openweather_client/__init__.py b/griptape/tools/openweather/__init__.py similarity index 100% rename from griptape/tools/openweather_client/__init__.py rename to griptape/tools/openweather/__init__.py diff --git a/griptape/tools/openweather_client/manifest.yml b/griptape/tools/openweather/manifest.yml similarity index 86% rename from griptape/tools/openweather_client/manifest.yml rename to griptape/tools/openweather/manifest.yml index 66efae262..315143ea2 100644 --- a/griptape/tools/openweather_client/manifest.yml +++ b/griptape/tools/openweather/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: OpenWeather Client +name: OpenWeather Tool description: Tool for using OpenWeather to retrieve weather information contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/openweather_client/tool.py b/griptape/tools/openweather/tool.py similarity index 99% rename from griptape/tools/openweather_client/tool.py rename to griptape/tools/openweather/tool.py index 4a7edb0f6..311db733b 100644 --- a/griptape/tools/openweather_client/tool.py +++ b/griptape/tools/openweather/tool.py @@ -13,7 +13,7 @@ @define -class OpenWeatherClient(BaseTool): +class OpenWeatherTool(BaseTool): BASE_URL = "https://api.openweathermap.org/data/3.0/onecall" GEOCODING_URL = "https://api.openweathermap.org/geo/1.0/direct" US_STATE_CODES = [ diff --git a/griptape/tools/outpainting_image_generation_client/__init__.py b/griptape/tools/outpainting_image_generation/__init__.py similarity index 100% rename from griptape/tools/outpainting_image_generation_client/__init__.py rename to griptape/tools/outpainting_image_generation/__init__.py diff --git a/griptape/tools/outpainting_image_generation_client/manifest.yml b/griptape/tools/outpainting_image_generation/manifest.yml similarity index 79% rename from griptape/tools/outpainting_image_generation_client/manifest.yml rename to griptape/tools/outpainting_image_generation/manifest.yml index 54c84668e..8b7ca14a1 100644 --- a/griptape/tools/outpainting_image_generation_client/manifest.yml +++ b/griptape/tools/outpainting_image_generation/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Outpainting Image Generation Client +name: Outpainting Image Generation Tool description: Tool for generating images through image outpainting. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/outpainting_image_generation_client/requirements.txt b/griptape/tools/outpainting_image_generation/requirements.txt similarity index 100% rename from griptape/tools/outpainting_image_generation_client/requirements.txt rename to griptape/tools/outpainting_image_generation/requirements.txt diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation/tool.py similarity index 93% rename from griptape/tools/outpainting_image_generation_client/tool.py rename to griptape/tools/outpainting_image_generation/tool.py index 800d88e70..afa39e178 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation/tool.py @@ -8,7 +8,7 @@ from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.tools import BaseImageGenerationClient +from griptape.tools import BaseImageGenerationTool from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class OutpaintingImageGenerationClient(BaseImageGenerationClient): +class OutpaintingImageGenerationTool(BaseImageGenerationTool): """A tool that can be used to generate prompted outpaintings of an image. Attributes: @@ -34,8 +34,8 @@ class OutpaintingImageGenerationClient(BaseImageGenerationClient): "description": "Modifies an image outside a specified mask area using image and mask files.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -61,8 +61,8 @@ def image_outpainting_from_file(self, params: dict[str, dict[str, str]]) -> Imag "description": "Modifies an image outside a specified mask area using image and mask artifacts in memory.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "image_artifact_namespace": str, "mask_artifact_namespace": str, diff --git a/griptape/tools/prompt_image_generation_client/__init__.py b/griptape/tools/prompt_image_generation/__init__.py similarity index 100% rename from griptape/tools/prompt_image_generation_client/__init__.py rename to griptape/tools/prompt_image_generation/__init__.py diff --git a/griptape/tools/prompt_image_generation_client/manifest.yml b/griptape/tools/prompt_image_generation/manifest.yml similarity index 80% rename from griptape/tools/prompt_image_generation_client/manifest.yml rename to griptape/tools/prompt_image_generation/manifest.yml index 665a24444..091cc14d7 100644 --- a/griptape/tools/prompt_image_generation_client/manifest.yml +++ b/griptape/tools/prompt_image_generation/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Prompt Image Generation Client +name: Prompt Image Generation Tool description: Tool for generating images from text prompts. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/prompt_image_generation_client/requirements.txt b/griptape/tools/prompt_image_generation/requirements.txt similarity index 100% rename from griptape/tools/prompt_image_generation_client/requirements.txt rename to griptape/tools/prompt_image_generation/requirements.txt diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation/tool.py similarity index 87% rename from griptape/tools/prompt_image_generation_client/tool.py rename to griptape/tools/prompt_image_generation/tool.py index 771b4e41d..6cd6ac560 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation/tool.py @@ -5,7 +5,7 @@ from attrs import define, field from schema import Literal, Schema -from griptape.tools import BaseImageGenerationClient +from griptape.tools import BaseImageGenerationTool from griptape.utils.decorators import activity if TYPE_CHECKING: @@ -14,7 +14,7 @@ @define -class PromptImageGenerationClient(BaseImageGenerationClient): +class PromptImageGenerationTool(BaseImageGenerationTool): """A tool that can be used to generate an image from a text prompt. Attributes: @@ -30,8 +30,8 @@ class PromptImageGenerationClient(BaseImageGenerationClient): "description": "Generates an image from text prompts.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, } ), }, diff --git a/griptape/tools/rag_client/__init__.py b/griptape/tools/rag/__init__.py similarity index 100% rename from griptape/tools/rag_client/__init__.py rename to griptape/tools/rag/__init__.py diff --git a/griptape/tools/rag_client/manifest.yml b/griptape/tools/rag/manifest.yml similarity index 88% rename from griptape/tools/rag_client/manifest.yml rename to griptape/tools/rag/manifest.yml index 86998feb4..7a3d49c65 100644 --- a/griptape/tools/rag_client/manifest.yml +++ b/griptape/tools/rag/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: RAG Client +name: RAG Tool description: Tool for querying RAG engines contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/rag_client/requirements.txt b/griptape/tools/rag/requirements.txt similarity index 100% rename from griptape/tools/rag_client/requirements.txt rename to griptape/tools/rag/requirements.txt diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag/tool.py similarity index 97% rename from griptape/tools/rag_client/tool.py rename to griptape/tools/rag/tool.py index 613e254af..8608493d1 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag/tool.py @@ -14,7 +14,7 @@ @define(kw_only=True) -class RagClient(BaseTool): +class RagTool(BaseTool): """Tool for querying a RAG engine. Attributes: diff --git a/griptape/tools/rest_api_client/__init__.py b/griptape/tools/rest_api/__init__.py similarity index 100% rename from griptape/tools/rest_api_client/__init__.py rename to griptape/tools/rest_api/__init__.py diff --git a/griptape/tools/rest_api_client/manifest.yml b/griptape/tools/rest_api/manifest.yml similarity index 87% rename from griptape/tools/rest_api_client/manifest.yml rename to griptape/tools/rest_api/manifest.yml index 7a881d037..01816e483 100644 --- a/griptape/tools/rest_api_client/manifest.yml +++ b/griptape/tools/rest_api/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Rest Api +name: Rest Api Tool description: Tool for calling rest apis. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api/tool.py similarity index 99% rename from griptape/tools/rest_api_client/tool.py rename to griptape/tools/rest_api/tool.py index b27beda0e..24ab4c93e 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api/tool.py @@ -14,7 +14,7 @@ @define -class RestApiClient(BaseTool): +class RestApiTool(BaseTool): """A tool for making REST API requests. Attributes: diff --git a/griptape/tools/sql_client/__init__.py b/griptape/tools/sql/__init__.py similarity index 100% rename from griptape/tools/sql_client/__init__.py rename to griptape/tools/sql/__init__.py diff --git a/griptape/tools/sql_client/manifest.yml b/griptape/tools/sql/manifest.yml similarity index 88% rename from griptape/tools/sql_client/manifest.yml rename to griptape/tools/sql/manifest.yml index 22d0f4be2..2e1459a0d 100644 --- a/griptape/tools/sql_client/manifest.yml +++ b/griptape/tools/sql/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: SQL Client +name: SQL Tool description: Tool for executing SQL queries. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/sql_client/tool.py b/griptape/tools/sql/tool.py similarity index 98% rename from griptape/tools/sql_client/tool.py rename to griptape/tools/sql/tool.py index 2de598c6b..a84bb87be 100644 --- a/griptape/tools/sql_client/tool.py +++ b/griptape/tools/sql/tool.py @@ -14,7 +14,7 @@ @define -class SqlClient(BaseTool): +class SqlTool(BaseTool): sql_loader: SqlLoader = field(kw_only=True) schema_name: Optional[str] = field(default=None, kw_only=True) table_name: str = field(kw_only=True) diff --git a/griptape/tools/structure_run_client/__init__.py b/griptape/tools/structure_run/__init__.py similarity index 100% rename from griptape/tools/structure_run_client/__init__.py rename to griptape/tools/structure_run/__init__.py diff --git a/griptape/tools/structure_run_client/manifest.yml b/griptape/tools/structure_run/manifest.yml similarity index 83% rename from griptape/tools/structure_run_client/manifest.yml rename to griptape/tools/structure_run/manifest.yml index 5f53158d8..b5feb835a 100644 --- a/griptape/tools/structure_run_client/manifest.yml +++ b/griptape/tools/structure_run/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Structure Run Client +name: Structure Run Tool description: Tool for running a Structure. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run/tool.py similarity index 97% rename from griptape/tools/structure_run_client/tool.py rename to griptape/tools/structure_run/tool.py index f4f6c3786..cda4f0b35 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run/tool.py @@ -14,7 +14,7 @@ @define -class StructureRunClient(BaseTool): +class StructureRunTool(BaseTool): """Tool for running a Structure. Attributes: diff --git a/griptape/tools/task_memory_client/__init__.py b/griptape/tools/task_memory/__init__.py similarity index 100% rename from griptape/tools/task_memory_client/__init__.py rename to griptape/tools/task_memory/__init__.py diff --git a/griptape/tools/task_memory_client/manifest.yml b/griptape/tools/task_memory/manifest.yml similarity index 85% rename from griptape/tools/task_memory_client/manifest.yml rename to griptape/tools/task_memory/manifest.yml index 0bff1af3d..5d40a1e68 100644 --- a/griptape/tools/task_memory_client/manifest.yml +++ b/griptape/tools/task_memory/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Task Memory Client +name: Task Memory Tool description: Tool for summarizing and querying TaskMemory. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory/tool.py similarity index 98% rename from griptape/tools/task_memory_client/tool.py rename to griptape/tools/task_memory/tool.py index 160a54d85..dfd6c7c4b 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory/tool.py @@ -9,7 +9,7 @@ @define -class TaskMemoryClient(BaseTool): +class TaskMemoryTool(BaseTool): @activity( config={ "description": "Can be used to summarize memory content", diff --git a/griptape/tools/text_to_speech_client/__init__.py b/griptape/tools/text_to_speech/__init__.py similarity index 100% rename from griptape/tools/text_to_speech_client/__init__.py rename to griptape/tools/text_to_speech/__init__.py diff --git a/griptape/tools/text_to_speech_client/manifest.yml b/griptape/tools/text_to_speech/manifest.yml similarity index 83% rename from griptape/tools/text_to_speech_client/manifest.yml rename to griptape/tools/text_to_speech/manifest.yml index 73062bb13..875e04576 100644 --- a/griptape/tools/text_to_speech_client/manifest.yml +++ b/griptape/tools/text_to_speech/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Text to Speech Client +name: Text to Speech Tool description: A tool for generating speech from text. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/text_to_speech_client/tool.py b/griptape/tools/text_to_speech/tool.py similarity index 95% rename from griptape/tools/text_to_speech_client/tool.py rename to griptape/tools/text_to_speech/tool.py index 295641fd3..95a42d0ae 100644 --- a/griptape/tools/text_to_speech_client/tool.py +++ b/griptape/tools/text_to_speech/tool.py @@ -15,7 +15,7 @@ @define -class TextToSpeechClient(BlobArtifactFileOutputMixin, BaseTool): +class TextToSpeechTool(BlobArtifactFileOutputMixin, BaseTool): """A tool that can be used to generate speech from input text. Attributes: diff --git a/griptape/tools/variation_image_generation_client/__init__.py b/griptape/tools/variation_image_generation/__init__.py similarity index 100% rename from griptape/tools/variation_image_generation_client/__init__.py rename to griptape/tools/variation_image_generation/__init__.py diff --git a/griptape/tools/variation_image_generation_client/manifest.yml b/griptape/tools/variation_image_generation/manifest.yml similarity index 79% rename from griptape/tools/variation_image_generation_client/manifest.yml rename to griptape/tools/variation_image_generation/manifest.yml index eb9371016..1f3eb28e8 100644 --- a/griptape/tools/variation_image_generation_client/manifest.yml +++ b/griptape/tools/variation_image_generation/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Variation Image Generation Client +name: Variation Image Generation Tool description: Tool for generating variations of existing images. contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/variation_image_generation_client/requirements.txt b/griptape/tools/variation_image_generation/requirements.txt similarity index 100% rename from griptape/tools/variation_image_generation_client/requirements.txt rename to griptape/tools/variation_image_generation/requirements.txt diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation/tool.py similarity index 91% rename from griptape/tools/variation_image_generation_client/tool.py rename to griptape/tools/variation_image_generation/tool.py index 5f836c5b1..9691f6206 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation/tool.py @@ -8,7 +8,7 @@ from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader -from griptape.tools.base_image_generation_client import BaseImageGenerationClient +from griptape.tools.base_image_generation_tool import BaseImageGenerationTool from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @@ -17,7 +17,7 @@ @define -class VariationImageGenerationClient(BaseImageGenerationClient): +class VariationImageGenerationTool(BaseImageGenerationTool): """A tool that can be used to generate prompted variations of an image. Attributes: @@ -34,8 +34,8 @@ class VariationImageGenerationClient(BaseImageGenerationClient): "description": "Generates a variation of a given input image file.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, Literal( "image_file", description="The path to an image file to be used as a base to generate variations from.", @@ -61,8 +61,8 @@ def image_variation_from_file(self, params: dict[str, dict[str, str]]) -> ImageA "description": "Generates a variation of a given input image artifact in memory.", "schema": Schema( { - Literal("prompt", description=BaseImageGenerationClient.PROMPT_DESCRIPTION): str, - Literal("negative_prompt", description=BaseImageGenerationClient.NEGATIVE_PROMPT_DESCRIPTION): str, + Literal("prompt", description=BaseImageGenerationTool.PROMPT_DESCRIPTION): str, + Literal("negative_prompt", description=BaseImageGenerationTool.NEGATIVE_PROMPT_DESCRIPTION): str, "memory_name": str, "artifact_namespace": str, "artifact_name": str, diff --git a/griptape/tools/vector_store_client/__init__.py b/griptape/tools/vector_store/__init__.py similarity index 100% rename from griptape/tools/vector_store_client/__init__.py rename to griptape/tools/vector_store/__init__.py diff --git a/griptape/tools/vector_store_client/manifest.yml b/griptape/tools/vector_store/manifest.yml similarity index 85% rename from griptape/tools/vector_store_client/manifest.yml rename to griptape/tools/vector_store/manifest.yml index a1a1d1d0c..d1fab7ce5 100644 --- a/griptape/tools/vector_store_client/manifest.yml +++ b/griptape/tools/vector_store/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Vector Store Client +name: Vector Store Tool description: Tool for storing and accessing data in vector stores contact_email: hello@griptape.ai legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/vector_store_client/requirements.txt b/griptape/tools/vector_store/requirements.txt similarity index 100% rename from griptape/tools/vector_store_client/requirements.txt rename to griptape/tools/vector_store/requirements.txt diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store/tool.py similarity index 98% rename from griptape/tools/vector_store_client/tool.py rename to griptape/tools/vector_store/tool.py index a0c638eef..71902b1c7 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store/tool.py @@ -14,7 +14,7 @@ @define(kw_only=True) -class VectorStoreClient(BaseTool): +class VectorStoreTool(BaseTool): """A tool for querying a vector database. Attributes: diff --git a/griptape/tools/web_scraper/manifest.yml b/griptape/tools/web_scraper/manifest.yml index e2d0597ec..ec9d3db25 100644 --- a/griptape/tools/web_scraper/manifest.yml +++ b/griptape/tools/web_scraper/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Web Scraper +name: Web Scraper Tool description: Tool for scraping web pages for content, titles, authors, and keywords. contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/web_scraper/tool.py b/griptape/tools/web_scraper/tool.py index 782e85d37..c27aaa066 100644 --- a/griptape/tools/web_scraper/tool.py +++ b/griptape/tools/web_scraper/tool.py @@ -10,7 +10,7 @@ @define -class WebScraper(BaseTool): +class WebScraperTool(BaseTool): web_loader: WebLoader = field(default=Factory(lambda: WebLoader()), kw_only=True) @activity( diff --git a/griptape/tools/web_search/manifest.yml b/griptape/tools/web_search/manifest.yml index 4bb2a82c8..c06db4f20 100644 --- a/griptape/tools/web_search/manifest.yml +++ b/griptape/tools/web_search/manifest.yml @@ -1,5 +1,5 @@ version: "v1" -name: Google Search -description: Tool for making making web searches on Google. +name: Web Search Tool +description: Tool for making making web searches. contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index 43f975acd..557c26a52 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -14,7 +14,7 @@ @define -class WebSearch(BaseTool): +class WebSearchTool(BaseTool): web_search_driver: BaseWebSearchDriver = field(kw_only=True) @activity( diff --git a/mkdocs.yml b/mkdocs.yml index 175918e87..ce1772754 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -129,34 +129,34 @@ nav: - Tools: - Overview: "griptape-tools/index.md" - Official Tools: - - AwsIamClient: "griptape-tools/official-tools/aws-iam-client.md" - - AwsS3Client: "griptape-tools/official-tools/aws-s3-client.md" - - Calculator: "griptape-tools/official-tools/calculator.md" - - Computer: "griptape-tools/official-tools/computer.md" - - DateTime: "griptape-tools/official-tools/date-time.md" - - EmailClient: "griptape-tools/official-tools/email-client.md" - - FileManager: "griptape-tools/official-tools/file-manager.md" - - GoogleCalendarClient: "griptape-tools/official-tools/google-cal-client.md" - - GoogleGmailClient: "griptape-tools/official-tools/google-gmail-client.md" - - GoogleDriveClient: "griptape-tools/official-tools/google-drive-client.md" - - GoogleDocsClient: "griptape-tools/official-tools/google-docs-client.md" - - StructureRunClient: "griptape-tools/official-tools/structure-run-client.md" - - OpenWeatherClient: "griptape-tools/official-tools/openweather-client.md" - - RestApiClient: "griptape-tools/official-tools/rest-api-client.md" - - SqlClient: "griptape-tools/official-tools/sql-client.md" - - TaskMemoryClient: "griptape-tools/official-tools/task-memory-client.md" - - VectorStoreClient: "griptape-tools/official-tools/vector-store-client.md" - - WebScraper: "griptape-tools/official-tools/web-scraper.md" - - WebSearch: "griptape-tools/official-tools/web-search.md" - - PromptImageGenerationClient: "griptape-tools/official-tools/prompt-image-generation-client.md" - - VariationImageGenerationClient: "griptape-tools/official-tools/variation-image-generation-client.md" - - InpaintingImageGenerationClient: "griptape-tools/official-tools/inpainting-image-generation-client.md" - - OutpaintingImageGenerationClient: "griptape-tools/official-tools/outpainting-image-generation-client.md" - - ImageQueryClient: "griptape-tools/official-tools/image-query-client.md" - - TextToSpeechClient: "griptape-tools/official-tools/text-to-speech-client.md" - - AudioTranscriptionClient: "griptape-tools/official-tools/audio-transcription-client.md" - - GriptapeCloudKnowledgeBaseClient: "griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md" - - RagClient: "griptape-tools/official-tools/rag-client.md" + - Aws Iam: "griptape-tools/official-tools/aws-iam-tool.md" + - Aws S3: "griptape-tools/official-tools/aws-s3-tool.md" + - Calculator: "griptape-tools/official-tools/calculator-tool.md" + - Computer: "griptape-tools/official-tools/computer-tool.md" + - Date Time: "griptape-tools/official-tools/date-time-tool.md" + - Email: "griptape-tools/official-tools/email-tool.md" + - File Manager: "griptape-tools/official-tools/file-manager-tool.md" + - Google Calendar: "griptape-tools/official-tools/google-calendar-tool.md" + - Google Gmail: "griptape-tools/official-tools/google-gmail-tool.md" + - Google Drive: "griptape-tools/official-tools/google-drive-tool.md" + - Google Docs: "griptape-tools/official-tools/google-docs-tool.md" + - Structure Run Client: "griptape-tools/official-tools/structure-run-tool.md" + - Open Weather: "griptape-tools/official-tools/openweather-tool.md" + - Rest Api Client: "griptape-tools/official-tools/rest-api-tool.md" + - Sql: "griptape-tools/official-tools/sql-tool.md" + - Task Memory: "griptape-tools/official-tools/task-memory-tool.md" + - Vector Store Tool: "griptape-tools/official-tools/vector-store-tool.md" + - Web Scraper: "griptape-tools/official-tools/web-scraper-tool.md" + - Web Search: "griptape-tools/official-tools/web-search-tool.md" + - Prompt Image Generation: "griptape-tools/official-tools/prompt-image-generation-tool.md" + - Variation ImageGeneration: "griptape-tools/official-tools/variation-image-generation-tool.md" + - Inpainting ImageGeneration: "griptape-tools/official-tools/inpainting-image-generation-tool.md" + - Outpainting ImageGeneration: "griptape-tools/official-tools/outpainting-image-generation-tool.md" + - Image Query: "griptape-tools/official-tools/image-query-tool.md" + - Text To Speech: "griptape-tools/official-tools/text-to-speech-tool.md" + - Audio Transcription: "griptape-tools/official-tools/audio-transcription-tool.md" + - Griptape Cloud Knowledge Base: "griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md" + - Rag: "griptape-tools/official-tools/rag-tool.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: diff --git a/tests/integration/tasks/test_tool_task.py b/tests/integration/tasks/test_tool_task.py index aee0af110..426dde995 100644 --- a/tests/integration/tasks/test_tool_task.py +++ b/tests/integration/tasks/test_tool_task.py @@ -10,10 +10,10 @@ class TestToolTask: def structure_tester(self, request): from griptape.structures import Agent from griptape.tasks import ToolTask - from griptape.tools import Calculator + from griptape.tools import CalculatorTool return StructureTester( - Agent(tasks=[ToolTask(tool=Calculator())], conversation_memory=None, prompt_driver=request.param) + Agent(tasks=[ToolTask(tool=CalculatorTool())], conversation_memory=None, prompt_driver=request.param) ) def test_tool_task(self, structure_tester): diff --git a/tests/integration/tasks/test_toolkit_task.py b/tests/integration/tasks/test_toolkit_task.py index 8dfcfdc73..5cb1aa0dc 100644 --- a/tests/integration/tasks/test_toolkit_task.py +++ b/tests/integration/tasks/test_toolkit_task.py @@ -14,18 +14,18 @@ def structure_tester(self, request): from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent - from griptape.tools import TaskMemoryClient, WebScraper, WebSearch + from griptape.tools import TaskMemoryTool, WebScraperTool, WebSearchTool return StructureTester( Agent( tools=[ - WebSearch( + WebSearchTool( web_search_driver=GoogleWebSearchDriver( api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"] ) ), - WebScraper(off_prompt=True), - TaskMemoryClient(off_prompt=False), + WebScraperTool(off_prompt=True), + TaskMemoryTool(off_prompt=False), ], conversation_memory=None, prompt_driver=request.param, diff --git a/tests/integration/test_code_blocks.py b/tests/integration/test_code_blocks.py index 2e9aac01f..c9c666b0e 100644 --- a/tests/integration/test_code_blocks.py +++ b/tests/integration/test_code_blocks.py @@ -4,7 +4,7 @@ import pytest SKIP_FILES = [ - "docs/griptape-tools/official-tools/src/computer_1.py", + "docs/griptape-tools/official-tools/src/computer_tool_1.py", "docs/examples/src/load_query_and_chat_marqo_1.py", "docs/griptape-framework/drivers/src/embedding_drivers_2.py", "docs/griptape-framework/drivers/src/embedding_drivers_6.py", diff --git a/tests/integration/tools/test_calculator.py b/tests/integration/tools/test_calculator_tool.py similarity index 73% rename from tests/integration/tools/test_calculator.py rename to tests/integration/tools/test_calculator_tool.py index 2547b947d..c209a9a2c 100644 --- a/tests/integration/tools/test_calculator.py +++ b/tests/integration/tools/test_calculator_tool.py @@ -11,9 +11,9 @@ class TestCalculator: ) def structure_tester(self, request): from griptape.structures import Agent - from griptape.tools import Calculator + from griptape.tools import CalculatorTool - return StructureTester(Agent(tools=[Calculator()], conversation_memory=None, prompt_driver=request.param)) + return StructureTester(Agent(tools=[CalculatorTool()], conversation_memory=None, prompt_driver=request.param)) def test_calculate(self, structure_tester): structure_tester.run("What is 7 times 3 divided by 5 plus 10.") diff --git a/tests/integration/tools/test_file_manager.py b/tests/integration/tools/test_file_manager_tool.py similarity index 79% rename from tests/integration/tools/test_file_manager.py rename to tests/integration/tools/test_file_manager_tool.py index 8a283c6e8..4b5299175 100644 --- a/tests/integration/tools/test_file_manager.py +++ b/tests/integration/tools/test_file_manager_tool.py @@ -11,9 +11,9 @@ class TestFileManager: ) def structure_tester(self, request): from griptape.structures import Agent - from griptape.tools import FileManager + from griptape.tools import FileManagerTool - return StructureTester(Agent(tools=[FileManager()], conversation_memory=None, prompt_driver=request.param)) + return StructureTester(Agent(tools=[FileManagerTool()], conversation_memory=None, prompt_driver=request.param)) def test_save_content_to_disk(self, structure_tester): structure_tester.run('Write the content "Hello World!" to a file called "poem.txt".') diff --git a/tests/integration/tools/test_google_docs_client.py b/tests/integration/tools/test_google_docs_tool.py similarity index 95% rename from tests/integration/tools/test_google_docs_client.py rename to tests/integration/tools/test_google_docs_tool.py index 4d70aac17..7c8828dd3 100644 --- a/tests/integration/tools/test_google_docs_client.py +++ b/tests/integration/tools/test_google_docs_tool.py @@ -5,7 +5,7 @@ from tests.utils.structure_tester import StructureTester -class TestGoogleDocsClient: +class TestGoogleDocsTool: @pytest.fixture( autouse=True, params=StructureTester.TOOLKIT_TASK_CAPABLE_PROMPT_DRIVERS, @@ -13,12 +13,12 @@ class TestGoogleDocsClient: ) def structure_tester(self, request): from griptape.structures import Agent - from griptape.tools import GoogleDocsClient + from griptape.tools import GoogleDocsTool return StructureTester( Agent( tools=[ - GoogleDocsClient( + GoogleDocsTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], diff --git a/tests/integration/tools/test_google_drive_client.py b/tests/integration/tools/test_google_drive_tool.py similarity index 94% rename from tests/integration/tools/test_google_drive_client.py rename to tests/integration/tools/test_google_drive_tool.py index 23ebb1b32..7fd8b9047 100644 --- a/tests/integration/tools/test_google_drive_client.py +++ b/tests/integration/tools/test_google_drive_tool.py @@ -5,7 +5,7 @@ from tests.utils.structure_tester import StructureTester -class TestGoogleDriveClient: +class TestGoogleDriveTool: @pytest.fixture( autouse=True, params=StructureTester.TOOLKIT_TASK_CAPABLE_PROMPT_DRIVERS, @@ -13,12 +13,12 @@ class TestGoogleDriveClient: ) def structure_tester(self, request): from griptape.structures import Agent - from griptape.tools import GoogleDriveClient + from griptape.tools import GoogleDriveTool return StructureTester( Agent( tools=[ - GoogleDriveClient( + GoogleDriveTool( service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], diff --git a/tests/unit/tools/test_aws_iam.py b/tests/unit/tools/test_aws_iam_tool.py similarity index 56% rename from tests/unit/tools/test_aws_iam.py rename to tests/unit/tools/test_aws_iam_tool.py index 54dbaa5fb..fb2b1e381 100644 --- a/tests/unit/tools/test_aws_iam.py +++ b/tests/unit/tools/test_aws_iam_tool.py @@ -1,11 +1,11 @@ import boto3 import pytest -from griptape.tools import AwsIamClient +from griptape.tools import AwsIamTool from tests.utils.aws import mock_aws_credentials -class TestAwsIamClient: +class TestAwsIamTool: @pytest.fixture(autouse=True) def _run_before_and_after_tests(self): mock_aws_credentials() @@ -14,18 +14,18 @@ def test_get_user_policy(self): value = {"user_name": "test_user", "policy_name": "test_policy"} assert ( "error returning policy document" - in AwsIamClient(session=boto3.Session()).get_user_policy({"values": value}).value + in AwsIamTool(session=boto3.Session()).get_user_policy({"values": value}).value ) def test_list_mfa_devices(self): - assert "error listing mfa devices" in AwsIamClient(session=boto3.Session()).list_mfa_devices({}).value + assert "error listing mfa devices" in AwsIamTool(session=boto3.Session()).list_mfa_devices({}).value def test_list_user_policies(self): value = {"user_name": "test_user"} assert ( "error listing iam user policies" - in AwsIamClient(session=boto3.Session()).list_user_policies({"values": value}).value + in AwsIamTool(session=boto3.Session()).list_user_policies({"values": value}).value ) def test_list_users(self): - assert "error listing s3 users" in AwsIamClient(session=boto3.Session()).list_users({}).value + assert "error listing s3 users" in AwsIamTool(session=boto3.Session()).list_users({}).value diff --git a/tests/unit/tools/test_aws_s3.py b/tests/unit/tools/test_aws_s3_tool.py similarity index 58% rename from tests/unit/tools/test_aws_s3.py rename to tests/unit/tools/test_aws_s3_tool.py index 5c6a4c151..9c4c34e0b 100644 --- a/tests/unit/tools/test_aws_s3.py +++ b/tests/unit/tools/test_aws_s3_tool.py @@ -1,42 +1,38 @@ import boto3 import pytest -from griptape.tools import AwsS3Client +from griptape.tools import AwsS3Tool from tests.utils.aws import mock_aws_credentials -class TestAwsS3Client: +class TestAwsS3Tool: @pytest.fixture(autouse=True) def _run_before_and_after_tests(self): mock_aws_credentials() def test_get_bucket_acl(self): value = {"bucket_name": "bucket_test"} - assert ( - "error getting bucket acl" in AwsS3Client(session=boto3.Session()).get_bucket_acl({"values": value}).value - ) + assert "error getting bucket acl" in AwsS3Tool(session=boto3.Session()).get_bucket_acl({"values": value}).value def test_get_bucket_policy(self): value = {"bucket_name": "bucket_test"} assert ( "error getting bucket policy" - in AwsS3Client(session=boto3.Session()).get_bucket_policy({"values": value}).value + in AwsS3Tool(session=boto3.Session()).get_bucket_policy({"values": value}).value ) def test_get_object_acl(self): value = {"bucket_name": "bucket_test", "object_key": "key_test"} - assert ( - "error getting object acl" in AwsS3Client(session=boto3.Session()).get_object_acl({"values": value}).value - ) + assert "error getting object acl" in AwsS3Tool(session=boto3.Session()).get_object_acl({"values": value}).value def test_list_s3_buckets(self): - assert "error listing s3 buckets" in AwsS3Client(session=boto3.Session()).list_s3_buckets({}).value + assert "error listing s3 buckets" in AwsS3Tool(session=boto3.Session()).list_s3_buckets({}).value def test_list_objects(self): value = {"bucket_name": "bucket_test"} assert ( "error listing objects in bucket" - in AwsS3Client(session=boto3.Session()).list_objects({"values": value}).value + in AwsS3Tool(session=boto3.Session()).list_objects({"values": value}).value ) def test_upload_memory_artifacts_to_s3(self): @@ -48,7 +44,7 @@ def test_upload_memory_artifacts_to_s3(self): } assert ( "memory not found" - in AwsS3Client(session=boto3.Session()).upload_memory_artifacts_to_s3({"values": value}).value + in AwsS3Tool(session=boto3.Session()).upload_memory_artifacts_to_s3({"values": value}).value ) def test_upload_content_to_s3(self): @@ -56,13 +52,12 @@ def test_upload_content_to_s3(self): assert ( "error uploading objects" - in AwsS3Client(session=boto3.Session()).upload_content_to_s3({"values": value}).value + in AwsS3Tool(session=boto3.Session()).upload_content_to_s3({"values": value}).value ) def test_download_objects(self): value = {"objects": {"bucket_name": "bucket_test", "object_key": "test.txt"}} assert ( - "error downloading objects" - in AwsS3Client(session=boto3.Session()).download_objects({"values": value}).value + "error downloading objects" in AwsS3Tool(session=boto3.Session()).download_objects({"values": value}).value ) diff --git a/tests/unit/tools/test_calculator.py b/tests/unit/tools/test_calculator.py index 72a525210..e598867f9 100644 --- a/tests/unit/tools/test_calculator.py +++ b/tests/unit/tools/test_calculator.py @@ -1,6 +1,6 @@ -from griptape.tools import Calculator +from griptape.tools import CalculatorTool class TestCalculator: def test_calculate(self): - assert Calculator().calculate({"values": {"expression": "5 * 5"}}).value == "25" + assert CalculatorTool().calculate({"values": {"expression": "5 * 5"}}).value == "25" diff --git a/tests/unit/tools/test_computer.py b/tests/unit/tools/test_computer.py index 95de18ae3..1f6e5c7a6 100644 --- a/tests/unit/tools/test_computer.py +++ b/tests/unit/tools/test_computer.py @@ -1,13 +1,13 @@ import pytest -from griptape.tools import Computer +from griptape.tools import ComputerTool from tests.mocks.docker.fake_api_client import make_fake_client class TestComputer: @pytest.fixture() def computer(self): - return Computer(docker_client=make_fake_client(), install_dependencies_on_init=False) + return ComputerTool(docker_client=make_fake_client(), install_dependencies_on_init=False) def test_execute_code(self, computer): assert computer.execute_code({"values": {"code": "print(1)", "filename": "foo.py"}}).value == "hello world" diff --git a/tests/unit/tools/test_date_time.py b/tests/unit/tools/test_date_time.py index c534ae69b..9fa2ce4bb 100644 --- a/tests/unit/tools/test_date_time.py +++ b/tests/unit/tools/test_date_time.py @@ -1,28 +1,28 @@ from datetime import datetime -from griptape.tools import DateTime +from griptape.tools import DateTimeTool class TestDateTime: def test_get_current_datetime(self): - result = DateTime().get_current_datetime({}) + result = DateTimeTool().get_current_datetime({}) time_delta = datetime.strptime(result.value, "%Y-%m-%d %H:%M:%S.%f") - datetime.now() assert abs(time_delta.total_seconds()) <= 1000 def test_get_past_relative_datetime(self): - result = DateTime().get_relative_datetime({"values": {"relative_date_string": "5 min ago"}}) + result = DateTimeTool().get_relative_datetime({"values": {"relative_date_string": "5 min ago"}}) time_delta = datetime.strptime(result.value, "%Y-%m-%d %H:%M:%S.%f") - datetime.now() assert abs(time_delta.total_seconds()) <= 1000 - result = DateTime().get_relative_datetime({"values": {"relative_date_string": "2 min ago, 12 seconds"}}) + result = DateTimeTool().get_relative_datetime({"values": {"relative_date_string": "2 min ago, 12 seconds"}}) time_delta = datetime.strptime(result.value, "%Y-%m-%d %H:%M:%S.%f") - datetime.now() assert abs(time_delta.total_seconds()) <= 1000 def test_get_future_relative_datetime(self): - result = DateTime().get_relative_datetime({"values": {"relative_date_string": "in 1 min, 36 seconds"}}) + result = DateTimeTool().get_relative_datetime({"values": {"relative_date_string": "in 1 min, 36 seconds"}}) time_delta = datetime.strptime(result.value, "%Y-%m-%d %H:%M:%S.%f") - datetime.now() assert abs(time_delta.total_seconds()) <= 1000 def test_get_invalid_relative_datetime(self): - result = DateTime().get_relative_datetime({"values": {"relative_date_string": "3 days from now"}}) + result = DateTimeTool().get_relative_datetime({"values": {"relative_date_string": "3 days from now"}}) assert result.type == "ErrorArtifact" diff --git a/tests/unit/tools/test_email_client.py b/tests/unit/tools/test_email_tool.py similarity index 93% rename from tests/unit/tools/test_email_client.py rename to tests/unit/tools/test_email_tool.py index cf99009b8..6c0f7cbd7 100644 --- a/tests/unit/tools/test_email_client.py +++ b/tests/unit/tools/test_email_tool.py @@ -2,14 +2,14 @@ from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.loaders.email_loader import EmailLoader -from griptape.tools import EmailClient +from griptape.tools import EmailTool -class TestEmailClient: +class TestEmailTool: @pytest.fixture(autouse=True) def mock_email_loader(self, mocker): mock_email_loader = mocker.patch( - "griptape.tools.email_client.tool.EmailLoader", + "griptape.tools.email.tool.EmailLoader", EmailQuery=EmailLoader.EmailQuery, # Prevents mocking the nested EmailQuery class ).return_value mock_email_loader.load.return_value = ListArtifact([TextArtifact("fake-email-content")]) @@ -29,7 +29,7 @@ def mock_smtp_ssl(self, mocker): @pytest.fixture() def client(self): - return EmailClient( + return EmailTool( username="fake-username", password="fake-password", smtp_host="foobar.com", @@ -63,7 +63,7 @@ def test_retrieve(self, client, mock_email_loader, values, query): def test_retrieve_when_email_max_retrieve_count_set(self, mock_email_loader): # Given - client = EmailClient(email_max_retrieve_count=84, mailboxes={"INBOX": "default mailbox for incoming email"}) + client = EmailTool(email_max_retrieve_count=84, mailboxes={"INBOX": "default mailbox for incoming email"}) # When client.retrieve({"values": {"label": "fake-label"}}) @@ -91,7 +91,7 @@ def test_send(self, client, send_params): def test_send_when_smtp_overrides_set(self, send_params): # Given - client = EmailClient( + client = EmailTool( smtp_host="smtp-host", smtp_port=86, smtp_use_ssl=False, diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index 57dd2c83e..dccf2f1a2 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -9,14 +9,14 @@ from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers.file_manager.local_file_manager_driver import LocalFileManagerDriver from griptape.loaders.text_loader import TextLoader -from griptape.tools import FileManager +from griptape.tools import FileManagerTool from tests.utils import defaults class TestFileManager: @pytest.fixture() def file_manager(self): - return FileManager( + return FileManagerTool( input_memory=[defaults.text_task_memory("Memory1")], file_manager_driver=LocalFileManagerDriver(workdir=os.path.abspath(os.path.dirname(__file__))), ) @@ -47,7 +47,7 @@ def test_load_files_from_disk_with_encoding(self, file_manager): assert isinstance(result.value[0], TextArtifact) def test_load_files_from_disk_with_encoding_failure(self): - file_manager = FileManager( + file_manager = FileManagerTool( file_manager_driver=LocalFileManagerDriver( default_loader=TextLoader(encoding="utf-8"), loaders={}, @@ -65,7 +65,9 @@ def test_save_memory_artifacts_to_disk_for_one_artifact(self, temp_dir): memory.store_artifact("foobar", artifact) - file_manager = FileManager(input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + file_manager = FileManagerTool( + input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir) + ) result = file_manager.save_memory_artifacts_to_disk( { "values": { @@ -88,7 +90,9 @@ def test_save_memory_artifacts_to_disk_for_multiple_artifacts(self, temp_dir): for a in artifacts: memory.store_artifact("foobar", a) - file_manager = FileManager(input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + file_manager = FileManagerTool( + input_memory=[memory], file_manager_driver=LocalFileManagerDriver(workdir=temp_dir) + ) result = file_manager.save_memory_artifacts_to_disk( { "values": { @@ -105,7 +109,7 @@ def test_save_memory_artifacts_to_disk_for_multiple_artifacts(self, temp_dir): assert result.value == "Successfully saved memory artifacts to disk" def test_save_content_to_file(self, temp_dir): - file_manager = FileManager(file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + file_manager = FileManagerTool(file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) result = file_manager.save_content_to_file( {"values": {"path": os.path.join("test", "foobar.txt"), "content": "foobar"}} ) @@ -114,7 +118,7 @@ def test_save_content_to_file(self, temp_dir): assert result.value == "Successfully saved file" def test_save_content_to_file_with_encoding(self, temp_dir): - file_manager = FileManager( + file_manager = FileManagerTool( file_manager_driver=LocalFileManagerDriver(default_loader=TextLoader(encoding="utf-8"), workdir=temp_dir) ) result = file_manager.save_content_to_file( @@ -125,7 +129,7 @@ def test_save_content_to_file_with_encoding(self, temp_dir): assert result.value == "Successfully saved file" def test_save_and_load_content_to_file_with_encoding(self, temp_dir): - file_manager = FileManager( + file_manager = FileManagerTool( file_manager_driver=LocalFileManagerDriver(loaders={"txt": TextLoader(encoding="ascii")}, workdir=temp_dir) ) result = file_manager.save_content_to_file( @@ -135,7 +139,7 @@ def test_save_and_load_content_to_file_with_encoding(self, temp_dir): assert Path(os.path.join(temp_dir, "test", "foobar.txt")).read_text() == "foobar" assert result.value == "Successfully saved file" - file_manager = FileManager( + file_manager = FileManagerTool( file_manager_driver=LocalFileManagerDriver( default_loader=TextLoader(encoding="ascii"), loaders={}, workdir=temp_dir ) diff --git a/tests/unit/tools/test_google_docs_client.py b/tests/unit/tools/test_google_docs_tool.py similarity index 84% rename from tests/unit/tools/test_google_docs_client.py rename to tests/unit/tools/test_google_docs_tool.py index a42fddda3..516961c61 100644 --- a/tests/unit/tools/test_google_docs_client.py +++ b/tests/unit/tools/test_google_docs_tool.py @@ -1,12 +1,12 @@ import pytest -class TestGoogleDocsClient: +class TestGoogleDocsTool: @pytest.fixture() def mock_docs_client(self): - from griptape.tools import GoogleDocsClient + from griptape.tools import GoogleDocsTool - return GoogleDocsClient(owner_email="tony@griptape.ai", service_account_credentials={}) + return GoogleDocsTool(owner_email="tony@griptape.ai", service_account_credentials={}) def test_append_text(self, mock_docs_client): params = {"file_path": "test_folder/test_document", "text": "Appending this text"} diff --git a/tests/unit/tools/test_google_drive_client.py b/tests/unit/tools/test_google_drive_tool.py similarity index 68% rename from tests/unit/tools/test_google_drive_client.py rename to tests/unit/tools/test_google_drive_tool.py index 55f3c168f..55eae2267 100644 --- a/tests/unit/tools/test_google_drive_client.py +++ b/tests/unit/tools/test_google_drive_tool.py @@ -1,11 +1,11 @@ from griptape.artifacts import ErrorArtifact -from griptape.tools import GoogleDriveClient +from griptape.tools import GoogleDriveTool -class TestGoogleDriveClient: +class TestGoogleDriveTool: def test_list_files(self): value = {"folder_path": "root"} # This can be any folder path you want to test - result = GoogleDriveClient(owner_email="tony@griptape.ai", service_account_credentials={}).list_files( + result = GoogleDriveTool(owner_email="tony@griptape.ai", service_account_credentials={}).list_files( {"values": value} ) @@ -14,16 +14,16 @@ def test_list_files(self): def test_save_content_to_drive(self): value = {"path": "/path/to/your/file.txt", "content": "Sample content for the file."} - result = GoogleDriveClient( - owner_email="tony@griptape.ai", service_account_credentials={} - ).save_content_to_drive({"values": value}) + result = GoogleDriveTool(owner_email="tony@griptape.ai", service_account_credentials={}).save_content_to_drive( + {"values": value} + ) assert isinstance(result, ErrorArtifact) assert "error saving file to Google Drive" in result.value def test_download_files(self): value = {"file_paths": ["example_folder/example_file.txt"]} - result = GoogleDriveClient(owner_email="tony@griptape.ai", service_account_credentials={}).download_files( + result = GoogleDriveTool(owner_email="tony@griptape.ai", service_account_credentials={}).download_files( {"values": value} ) @@ -33,7 +33,7 @@ def test_download_files(self): def test_search_files(self): value = {"search_mode": "name", "file_name": "search_file_name.txt"} - result = GoogleDriveClient(owner_email="tony@griptape.ai", service_account_credentials={}).search_files( + result = GoogleDriveTool(owner_email="tony@griptape.ai", service_account_credentials={}).search_files( {"values": value} ) @@ -43,7 +43,7 @@ def test_search_files(self): def test_share_file(self): value = {"file_path": "/path/to/your/file.txt", "email_address": "sample_email@example.com", "role": "reader"} - result = GoogleDriveClient(owner_email="tony@griptape.ai", service_account_credentials={}).share_file( + result = GoogleDriveTool(owner_email="tony@griptape.ai", service_account_credentials={}).share_file( {"values": value} ) diff --git a/tests/unit/tools/test_google_gmail_client.py b/tests/unit/tools/test_google_gmail_tool.py similarity index 61% rename from tests/unit/tools/test_google_gmail_client.py rename to tests/unit/tools/test_google_gmail_tool.py index 7dcf1de38..ace7ef0ba 100644 --- a/tests/unit/tools/test_google_gmail_client.py +++ b/tests/unit/tools/test_google_gmail_tool.py @@ -1,12 +1,12 @@ -from griptape.tools import GoogleGmailClient +from griptape.tools import GoogleGmailTool -class TestGoogleGmailClient: +class TestGoogleGmailTool: def test_create_draft_email(self): value = {"subject": "stacey's mom", "from": "test@test.com", "body": "got it going on"} assert ( "error creating draft email" - in GoogleGmailClient(service_account_credentials={}, owner_email="tony@griptape.ai") + in GoogleGmailTool(service_account_credentials={}, owner_email="tony@griptape.ai") .create_draft_email({"values": value}) .value ) diff --git a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py b/tests/unit/tools/test_griptape_cloud_knowledge_base_tool.py similarity index 83% rename from tests/unit/tools/test_griptape_cloud_knowledge_base_client.py rename to tests/unit/tools/test_griptape_cloud_knowledge_base_tool.py index 7d75d8670..b98713273 100644 --- a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py +++ b/tests/unit/tools/test_griptape_cloud_knowledge_base_tool.py @@ -4,10 +4,10 @@ from griptape.artifacts import ErrorArtifact, TextArtifact -class TestGriptapeCloudKnowledgeBaseClient: +class TestGriptapeCloudKnowledgeBaseTool: @pytest.fixture() def client(self, mocker): - from griptape.tools import GriptapeCloudKnowledgeBaseClient + from griptape.tools import GriptapeCloudKnowledgeBaseTool mock_response = mocker.Mock() mock_response.status_code = 201 @@ -19,45 +19,45 @@ def client(self, mocker): mock_response.json.return_value = {"description": "fizz buzz"} mocker.patch("requests.get", return_value=mock_response) - return GriptapeCloudKnowledgeBaseClient( + return GriptapeCloudKnowledgeBaseTool( base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) @pytest.fixture() def client_no_description(self, mocker): - from griptape.tools import GriptapeCloudKnowledgeBaseClient + from griptape.tools import GriptapeCloudKnowledgeBaseTool mock_response = mocker.Mock() mock_response.json.return_value = {} mock_response.status_code = 200 mocker.patch("requests.get", return_value=mock_response) - return GriptapeCloudKnowledgeBaseClient( + return GriptapeCloudKnowledgeBaseTool( base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) @pytest.fixture() def client_kb_not_found(self, mocker): - from griptape.tools import GriptapeCloudKnowledgeBaseClient + from griptape.tools import GriptapeCloudKnowledgeBaseTool mock_response = mocker.Mock() mock_response.json.return_value = {} mock_response.status_code = 404 mocker.patch("requests.get", return_value=mock_response) - return GriptapeCloudKnowledgeBaseClient( + return GriptapeCloudKnowledgeBaseTool( base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) @pytest.fixture() def client_kb_error(self, mocker): - from griptape.tools import GriptapeCloudKnowledgeBaseClient + from griptape.tools import GriptapeCloudKnowledgeBaseTool mock_response = mocker.Mock() mock_response.status_code = 500 mocker.patch("requests.post", return_value=mock_response, side_effect=exceptions.RequestException("error")) - return GriptapeCloudKnowledgeBaseClient( + return GriptapeCloudKnowledgeBaseTool( base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) @@ -75,7 +75,7 @@ def test_get_knowledge_base_description(self, client): assert client._get_knowledge_base_description() == "foo bar" def test_get_knowledge_base_description_error(self, client_no_description): - exception_match_text = f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + exception_match_text = f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseTool.description` attribute." with pytest.raises(ValueError, match=exception_match_text): client_no_description._get_knowledge_base_description() diff --git a/tests/unit/tools/test_inpainting_image_generation_client.py b/tests/unit/tools/test_inpainting_image_generation_tool.py similarity index 87% rename from tests/unit/tools/test_inpainting_image_generation_client.py rename to tests/unit/tools/test_inpainting_image_generation_tool.py index 0c5e49f9a..45afcbc63 100644 --- a/tests/unit/tools/test_inpainting_image_generation_client.py +++ b/tests/unit/tools/test_inpainting_image_generation_tool.py @@ -6,10 +6,10 @@ import pytest from griptape.artifacts import ImageArtifact -from griptape.tools import InpaintingImageGenerationClient +from griptape.tools import InpaintingImageGenerationTool -class TestInpaintingImageGenerationClient: +class TestInpaintingImageGenerationTool: @pytest.fixture() def image_artifact(self) -> ImageArtifact: return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") @@ -26,12 +26,12 @@ def image_loader(self) -> Mock: return loader @pytest.fixture() - def image_generator(self, image_generation_engine, image_loader) -> InpaintingImageGenerationClient: - return InpaintingImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) + def image_generator(self, image_generation_engine, image_loader) -> InpaintingImageGenerationTool: + return InpaintingImageGenerationTool(engine=image_generation_engine, image_loader=image_loader) def test_validate_output_configs(self, image_generation_engine) -> None: with pytest.raises(ValueError): - InpaintingImageGenerationClient(engine=image_generation_engine, output_dir="test", output_file="test") + InpaintingImageGenerationTool(engine=image_generation_engine, output_dir="test", output_file="test") def test_image_inpainting(self, image_generator, path_from_resource_path) -> None: image_generator.engine.run.return_value = Mock( @@ -55,7 +55,7 @@ def test_image_inpainting_with_outfile( self, image_generation_engine, image_loader, path_from_resource_path ) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" - image_generator = InpaintingImageGenerationClient( + image_generator = InpaintingImageGenerationTool( engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) @@ -78,7 +78,7 @@ def test_image_inpainting_with_outfile( assert os.path.exists(outfile) def test_image_inpainting_from_memory(self, image_generation_engine, image_artifact): - image_generator = InpaintingImageGenerationClient(engine=image_generation_engine) + image_generator = InpaintingImageGenerationTool(engine=image_generation_engine) memory = Mock() memory.load_artifacts = Mock(return_value=[image_artifact]) image_generator.find_input_memory = Mock(return_value=memory) diff --git a/tests/unit/tools/test_openweather_client.py b/tests/unit/tools/test_openweather_tool.py similarity index 92% rename from tests/unit/tools/test_openweather_client.py rename to tests/unit/tools/test_openweather_tool.py index 89b80e164..44acaf571 100644 --- a/tests/unit/tools/test_openweather_client.py +++ b/tests/unit/tools/test_openweather_tool.py @@ -3,12 +3,12 @@ import pytest from griptape.artifacts import ErrorArtifact -from griptape.tools import OpenWeatherClient +from griptape.tools import OpenWeatherTool @pytest.fixture() def client(): - return OpenWeatherClient(api_key="YOUR_API_KEY") + return OpenWeatherTool(api_key="YOUR_API_KEY") class MockResponse: @@ -21,9 +21,9 @@ def json(self): def mock_requests_get(*args, **kwargs): - if args[0] == OpenWeatherClient.GEOCODING_URL: + if args[0] == OpenWeatherTool.GEOCODING_URL: return MockResponse([{"lat": 40.7128, "lon": -74.0061}], 200) - elif args[0] == OpenWeatherClient.BASE_URL: + elif args[0] == OpenWeatherTool.BASE_URL: return MockResponse({"weather": "sunny"}, 200) return MockResponse(None, 404) diff --git a/tests/unit/tools/test_outpainting_image_variation_client.py b/tests/unit/tools/test_outpainting_image_variation_tool.py similarity index 87% rename from tests/unit/tools/test_outpainting_image_variation_client.py rename to tests/unit/tools/test_outpainting_image_variation_tool.py index 13d8df082..4fbcbe8d4 100644 --- a/tests/unit/tools/test_outpainting_image_variation_client.py +++ b/tests/unit/tools/test_outpainting_image_variation_tool.py @@ -6,10 +6,10 @@ import pytest from griptape.artifacts import ImageArtifact -from griptape.tools import OutpaintingImageGenerationClient +from griptape.tools import OutpaintingImageGenerationTool -class TestOutpaintingImageGenerationClient: +class TestOutpaintingImageGenerationTool: @pytest.fixture() def image_artifact(self) -> ImageArtifact: return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") @@ -26,12 +26,12 @@ def image_loader(self, image_artifact) -> Mock: return loader @pytest.fixture() - def image_generator(self, image_generation_engine, image_loader) -> OutpaintingImageGenerationClient: - return OutpaintingImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) + def image_generator(self, image_generation_engine, image_loader) -> OutpaintingImageGenerationTool: + return OutpaintingImageGenerationTool(engine=image_generation_engine, image_loader=image_loader) def test_validate_output_configs(self, image_generation_engine) -> None: with pytest.raises(ValueError): - OutpaintingImageGenerationClient(engine=image_generation_engine, output_dir="test", output_file="test") + OutpaintingImageGenerationTool(engine=image_generation_engine, output_dir="test", output_file="test") def test_image_outpainting(self, image_generator, path_from_resource_path) -> None: image_generator.engine.run.return_value = Mock( @@ -55,7 +55,7 @@ def test_image_outpainting_with_outfile( self, image_generation_engine, image_loader, path_from_resource_path ) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" - image_generator = OutpaintingImageGenerationClient( + image_generator = OutpaintingImageGenerationTool( engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) @@ -78,7 +78,7 @@ def test_image_outpainting_with_outfile( assert os.path.exists(outfile) def test_image_outpainting_from_memory(self, image_generation_engine, image_artifact): - image_generator = OutpaintingImageGenerationClient(engine=image_generation_engine) + image_generator = OutpaintingImageGenerationTool(engine=image_generation_engine) memory = Mock() memory.load_artifacts = Mock(return_value=[image_artifact]) image_generator.find_input_memory = Mock(return_value=memory) diff --git a/tests/unit/tools/test_prompt_image_generation_client.py b/tests/unit/tools/test_prompt_image_generation_tool.py similarity index 77% rename from tests/unit/tools/test_prompt_image_generation_client.py rename to tests/unit/tools/test_prompt_image_generation_tool.py index 276e33473..a0c5c7037 100644 --- a/tests/unit/tools/test_prompt_image_generation_client.py +++ b/tests/unit/tools/test_prompt_image_generation_tool.py @@ -5,21 +5,21 @@ import pytest -from griptape.tools import PromptImageGenerationClient +from griptape.tools import PromptImageGenerationTool -class TestPromptImageGenerationClient: +class TestPromptImageGenerationTool: @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() @pytest.fixture() - def image_generator(self, image_generation_engine) -> PromptImageGenerationClient: - return PromptImageGenerationClient(engine=image_generation_engine) + def image_generator(self, image_generation_engine) -> PromptImageGenerationTool: + return PromptImageGenerationTool(engine=image_generation_engine) def test_validate_output_configs(self, image_generation_engine) -> None: with pytest.raises(ValueError): - PromptImageGenerationClient(engine=image_generation_engine, output_dir="test", output_file="test") + PromptImageGenerationTool(engine=image_generation_engine, output_dir="test", output_file="test") def test_generate_image(self, image_generator) -> None: image_generator.engine.run.return_value = Mock( @@ -34,7 +34,7 @@ def test_generate_image(self, image_generator) -> None: def test_generate_image_with_outfile(self, image_generation_engine) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" - image_generator = PromptImageGenerationClient(engine=image_generation_engine, output_file=outfile) + image_generator = PromptImageGenerationTool(engine=image_generation_engine, output_file=outfile) image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" diff --git a/tests/unit/tools/test_rag_client.py b/tests/unit/tools/test_rag_tool.py similarity index 72% rename from tests/unit/tools/test_rag_client.py rename to tests/unit/tools/test_rag_tool.py index 60a0df722..eb1c00e4c 100644 --- a/tests/unit/tools/test_rag_client.py +++ b/tests/unit/tools/test_rag_tool.py @@ -1,13 +1,13 @@ from griptape.drivers import LocalVectorStoreDriver -from griptape.tools import RagClient +from griptape.tools import RagTool from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils.defaults import rag_engine -class TestRagClient: +class TestRagTool: def test_search(self): vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - tool = RagClient(description="Test", rag_engine=rag_engine(MockPromptDriver(), vector_store_driver)) + tool = RagTool(description="Test", rag_engine=rag_engine(MockPromptDriver(), vector_store_driver)) assert tool.search({"values": {"query": "test"}}).value[0].value == "mock output" diff --git a/tests/unit/tools/test_rest_api_client.py b/tests/unit/tools/test_rest_api_tool.py similarity index 92% rename from tests/unit/tools/test_rest_api_client.py rename to tests/unit/tools/test_rest_api_tool.py index 58f21d1f1..70d63478e 100644 --- a/tests/unit/tools/test_rest_api_client.py +++ b/tests/unit/tools/test_rest_api_tool.py @@ -6,9 +6,9 @@ class TestRestApi: @pytest.fixture() def client(self): - from griptape.tools import RestApiClient + from griptape.tools import RestApiTool - return RestApiClient(base_url="http://www.griptape.ai", description="Griptape website.") + return RestApiTool(base_url="http://www.griptape.ai", description="Griptape website.") def test_put(self, client): assert isinstance(client.post({"values": {"body": {}}}), BaseArtifact) diff --git a/tests/unit/tools/test_sql_client.py b/tests/unit/tools/test_sql_tool.py similarity index 87% rename from tests/unit/tools/test_sql_client.py rename to tests/unit/tools/test_sql_tool.py index 8ab61fc8f..2ef50ff54 100644 --- a/tests/unit/tools/test_sql_client.py +++ b/tests/unit/tools/test_sql_tool.py @@ -4,10 +4,10 @@ from griptape.drivers import SqlDriver from griptape.loaders import SqlLoader -from griptape.tools import SqlClient +from griptape.tools import SqlTool -class TestSqlClient: +class TestSqlTool: @pytest.fixture() def driver(self): new_driver = SqlDriver(engine_url="sqlite:///:memory:") @@ -22,14 +22,14 @@ def driver(self): def test_execute_query(self, driver): with sqlite3.connect(":memory:"): - client = SqlClient(sql_loader=SqlLoader(sql_driver=driver), table_name="test_table", engine_name="sqlite") + client = SqlTool(sql_loader=SqlLoader(sql_driver=driver), table_name="test_table", engine_name="sqlite") result = client.execute_query({"values": {"sql_query": "SELECT * from test_table;"}}) assert len(result.value) == 1 assert result.value[0].value == {"id": 1, "name": "Alice", "age": 25, "city": "New York"} def test_execute_query_description(self, driver): - client = SqlClient( + client = SqlTool( sql_loader=SqlLoader(sql_driver=driver), table_name="test_table", table_description="foobar", diff --git a/tests/unit/tools/test_structure_run_client.py b/tests/unit/tools/test_structure_run_tool.py similarity index 82% rename from tests/unit/tools/test_structure_run_client.py rename to tests/unit/tools/test_structure_run_tool.py index ee76d4da1..f62cdeea7 100644 --- a/tests/unit/tools/test_structure_run_client.py +++ b/tests/unit/tools/test_structure_run_tool.py @@ -2,15 +2,15 @@ from griptape.drivers.structure_run.local_structure_run_driver import LocalStructureRunDriver from griptape.structures import Agent -from griptape.tools import StructureRunClient +from griptape.tools import StructureRunTool -class TestStructureRunClient: +class TestStructureRunTool: @pytest.fixture() def client(self): agent = Agent() - return StructureRunClient( + return StructureRunTool( description="foo bar", driver=LocalStructureRunDriver(structure_factory_fn=lambda: agent) ) diff --git a/tests/unit/tools/test_task_memory_client.py b/tests/unit/tools/test_task_memory_tool.py similarity index 80% rename from tests/unit/tools/test_task_memory_client.py rename to tests/unit/tools/test_task_memory_tool.py index 4276b89ec..238001d55 100644 --- a/tests/unit/tools/test_task_memory_client.py +++ b/tests/unit/tools/test_task_memory_tool.py @@ -1,14 +1,14 @@ import pytest from griptape.artifacts import TextArtifact -from griptape.tools import TaskMemoryClient +from griptape.tools import TaskMemoryTool from tests.utils import defaults -class TestTaskMemoryClient: +class TestTaskMemoryTool: @pytest.fixture() def tool(self): - return TaskMemoryClient(off_prompt=True, input_memory=[defaults.text_task_memory("TestMemory")]) + return TaskMemoryTool(off_prompt=True, input_memory=[defaults.text_task_memory("TestMemory")]) def test_summarize(self, tool): tool.input_memory[0].store_artifact("foo", TextArtifact("test")) diff --git a/tests/unit/tools/test_text_to_speech_client.py b/tests/unit/tools/test_text_to_speech_tool.py similarity index 74% rename from tests/unit/tools/test_text_to_speech_client.py rename to tests/unit/tools/test_text_to_speech_tool.py index 0b9061aa6..8821d48fc 100644 --- a/tests/unit/tools/test_text_to_speech_client.py +++ b/tests/unit/tools/test_text_to_speech_tool.py @@ -5,21 +5,21 @@ import pytest -from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.tools.text_to_speech.tool import TextToSpeechTool -class TestTextToSpeechClient: +class TestTextToSpeechTool: @pytest.fixture() def text_to_speech_engine(self) -> Mock: return Mock() @pytest.fixture() - def text_to_speech_client(self, text_to_speech_engine) -> TextToSpeechClient: - return TextToSpeechClient(engine=text_to_speech_engine) + def text_to_speech_client(self, text_to_speech_engine) -> TextToSpeechTool: + return TextToSpeechTool(engine=text_to_speech_engine) def test_validate_output_configs(self, text_to_speech_engine) -> None: with pytest.raises(ValueError): - TextToSpeechClient(engine=text_to_speech_engine, output_dir="test", output_file="test") + TextToSpeechTool(engine=text_to_speech_engine, output_dir="test", output_file="test") def test_text_to_speech(self, text_to_speech_client) -> None: text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") @@ -30,7 +30,7 @@ def test_text_to_speech(self, text_to_speech_client) -> None: def test_text_to_speech_with_outfile(self, text_to_speech_engine) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.mp3" - text_to_speech_client = TextToSpeechClient(engine=text_to_speech_engine, output_file=outfile) + text_to_speech_client = TextToSpeechTool(engine=text_to_speech_engine, output_file=outfile) text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") # pyright: ignore[reportFunctionMemberAccess] diff --git a/tests/unit/tools/test_transcription_client.py b/tests/unit/tools/test_transcription_tool.py similarity index 83% rename from tests/unit/tools/test_transcription_client.py rename to tests/unit/tools/test_transcription_tool.py index 8b54e891b..07368495f 100644 --- a/tests/unit/tools/test_transcription_client.py +++ b/tests/unit/tools/test_transcription_tool.py @@ -3,10 +3,10 @@ import pytest from griptape.artifacts import AudioArtifact -from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient +from griptape.tools.audio_transcription.tool import AudioTranscriptionTool -class TestTranscriptionClient: +class TestTranscriptionTool: @pytest.fixture() def transcription_engine(self) -> Mock: return Mock() @@ -27,11 +27,11 @@ def mock_path(self, mocker) -> Mock: return mocker def test_init_transcription_client(self, transcription_engine, audio_loader) -> None: - assert AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + assert AudioTranscriptionTool(engine=transcription_engine, audio_loader=audio_loader) @patch("builtins.open", mock_open(read_data=b"audio data")) def test_transcribe_audio_from_disk(self, transcription_engine, audio_loader) -> None: - client = AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + client = AudioTranscriptionTool(engine=transcription_engine, audio_loader=audio_loader) client.engine.run.return_value = Mock(value="transcription") # pyright: ignore[reportFunctionMemberAccess] text_artifact = client.transcribe_audio_from_disk(params={"values": {"path": "audio.wav"}}) @@ -40,7 +40,7 @@ def test_transcribe_audio_from_disk(self, transcription_engine, audio_loader) -> assert text_artifact.value == "transcription" def test_transcribe_audio_from_memory(self, transcription_engine, audio_loader) -> None: - client = AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + client = AudioTranscriptionTool(engine=transcription_engine, audio_loader=audio_loader) memory = Mock() memory.load_artifacts = Mock(return_value=[AudioArtifact(value=b"audio data", format="wav", name="name")]) client.find_input_memory = Mock(return_value=memory) diff --git a/tests/unit/tools/test_variation_image_generation_client.py b/tests/unit/tools/test_variation_image_generation_tool.py similarity index 88% rename from tests/unit/tools/test_variation_image_generation_client.py rename to tests/unit/tools/test_variation_image_generation_tool.py index 0db454f92..c4528a044 100644 --- a/tests/unit/tools/test_variation_image_generation_client.py +++ b/tests/unit/tools/test_variation_image_generation_tool.py @@ -6,10 +6,10 @@ import pytest from griptape.artifacts import ImageArtifact -from griptape.tools import VariationImageGenerationClient +from griptape.tools import VariationImageGenerationTool -class TestVariationImageGenerationClient: +class TestVariationImageGenerationTool: @pytest.fixture() def image_artifact(self) -> ImageArtifact: return ImageArtifact(value=b"image_data", format="png", width=512, height=512, name="name") @@ -26,12 +26,12 @@ def image_loader(self) -> Mock: return loader @pytest.fixture() - def image_generator(self, image_generation_engine, image_loader) -> VariationImageGenerationClient: - return VariationImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) + def image_generator(self, image_generation_engine, image_loader) -> VariationImageGenerationTool: + return VariationImageGenerationTool(engine=image_generation_engine, image_loader=image_loader) def test_validate_output_configs(self, image_generation_engine, image_loader) -> None: with pytest.raises(ValueError): - VariationImageGenerationClient( + VariationImageGenerationTool( engine=image_generation_engine, output_dir="test", output_file="test", image_loader=image_loader ) @@ -54,7 +54,7 @@ def test_image_variation(self, image_generator, path_from_resource_path) -> None def test_image_variation_with_outfile(self, image_generation_engine, image_loader, path_from_resource_path) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" - image_generator = VariationImageGenerationClient( + image_generator = VariationImageGenerationTool( engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) @@ -76,7 +76,7 @@ def test_image_variation_with_outfile(self, image_generation_engine, image_loade assert os.path.exists(outfile) def test_image_variation_from_memory(self, image_generation_engine, image_artifact): - image_generator = VariationImageGenerationClient(engine=image_generation_engine) + image_generator = VariationImageGenerationTool(engine=image_generation_engine) memory = Mock() memory.load_artifacts = Mock(return_value=[image_artifact]) image_generator.find_input_memory = Mock(return_value=memory) diff --git a/tests/unit/tools/test_vector_store_client.py b/tests/unit/tools/test_vector_store_tool.py similarity index 78% rename from tests/unit/tools/test_vector_store_client.py rename to tests/unit/tools/test_vector_store_tool.py index b02dda226..ea52a13ea 100644 --- a/tests/unit/tools/test_vector_store_client.py +++ b/tests/unit/tools/test_vector_store_tool.py @@ -2,18 +2,18 @@ from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import LocalVectorStoreDriver -from griptape.tools import VectorStoreClient +from griptape.tools import VectorStoreTool from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -class TestVectorStoreClient: +class TestVectorStoreTool: @pytest.fixture(autouse=True) def _mock_try_run(self, mocker): mocker.patch("griptape.drivers.OpenAiEmbeddingDriver.try_embed_chunk", return_value=[0, 1]) def test_search(self): driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - tool = VectorStoreClient(description="Test", vector_store_driver=driver) + tool = VectorStoreTool(description="Test", vector_store_driver=driver) driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) @@ -21,8 +21,8 @@ def test_search(self): def test_search_with_namespace(self): driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - tool1 = VectorStoreClient(description="Test", vector_store_driver=driver, query_params={"namespace": "test"}) - tool2 = VectorStoreClient(description="Test", vector_store_driver=driver, query_params={"namespace": "test2"}) + tool1 = VectorStoreTool(description="Test", vector_store_driver=driver, query_params={"namespace": "test"}) + tool2 = VectorStoreTool(description="Test", vector_store_driver=driver, query_params={"namespace": "test2"}) driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) @@ -31,7 +31,7 @@ def test_search_with_namespace(self): def test_custom_process_query_output_fn(self): driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - tool1 = VectorStoreClient( + tool1 = VectorStoreTool( description="Test", vector_store_driver=driver, process_query_output_fn=lambda es: ListArtifact([e.vector for e in es]), diff --git a/tests/unit/tools/test_web_scraper.py b/tests/unit/tools/test_web_scraper.py index 30362ce65..0fdc761b4 100644 --- a/tests/unit/tools/test_web_scraper.py +++ b/tests/unit/tools/test_web_scraper.py @@ -6,9 +6,9 @@ class TestWebScraper: @pytest.fixture() def scraper(self): - from griptape.tools import WebScraper + from griptape.tools import WebScraperTool - return WebScraper() + return WebScraperTool() def test_get_content(self, scraper): assert isinstance( diff --git a/tests/unit/tools/test_web_search.py b/tests/unit/tools/test_web_search.py index 17ff610e0..c1f9555ea 100644 --- a/tests/unit/tools/test_web_search.py +++ b/tests/unit/tools/test_web_search.py @@ -1,7 +1,7 @@ import pytest from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact -from griptape.tools import WebSearch +from griptape.tools import WebSearchTool class TestWebSearch: @@ -11,7 +11,7 @@ def websearch_tool(self, mocker): driver = mocker.Mock() mocker.patch.object(driver, "search", return_value=mock_response) - return WebSearch(web_search_driver=driver) + return WebSearchTool(web_search_driver=driver) @pytest.fixture() def websearch_tool_with_error(self, mocker): @@ -19,7 +19,7 @@ def websearch_tool_with_error(self, mocker): driver = mocker.Mock() mocker.patch.object(driver, "search", side_effect=mock_response) - return WebSearch(web_search_driver=driver) + return WebSearchTool(web_search_driver=driver) def test_search(self, websearch_tool): assert isinstance(websearch_tool.search({"values": {"query": "foo bar"}}), BaseArtifact) From bf000887799429869b0a0e254f1ed3d553b2f098 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 14 Aug 2024 09:02:31 -0700 Subject: [PATCH 212/238] Modify arguments/return type of add_parent and add_child (#1048) --- CHANGELOG.md | 3 ++ .../structures/workflows.md | 28 +++++++++++ griptape/tasks/actions_subtask.py | 20 ++++---- griptape/tasks/base_task.py | 46 +++++++++++-------- tests/unit/structures/test_workflow.py | 14 +++--- tests/unit/tasks/test_base_task.py | 36 +++++++++++++++ 6 files changed, 111 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef91010ae..8b69e7f32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. - Global config, `griptape.config.config`, for setting global configuration defaults. - Unique name generation for all `RagEngine` modules. +- Support for bitshift composition in `BaseTask` for adding parent/child tasks. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. @@ -31,8 +32,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Dropped `Client` from all Tool names for better naming consistency. - **BREAKING**: Dropped `_client` suffix from all Tool packages. - **BREAKING**: Added `Tool` suffix to all Tool names for better naming consistency. +- **BREAKING**: `BaseTask.add_parent/child` now take a `BaseTask` instead of `str | BaseTask`. - Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. +- `BaseTask.add_parent/child` now returns `self`, allowing for chaining. ## [0.29.1] - 2024-08-02 diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 5f7c271fc..87bb2ae89 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -201,3 +201,31 @@ output: [06/18/24 09:52:23] INFO PromptTask new-animal Output: elephant ``` + +### Bitshift Composition + +Task relationships can also be set up with the Python bitshift operators `>>` and `<<`. The following four statements are all functionally equivalent: + +```python +task1 >> task2 +task1.add_child(task2) + +task2 << task1 +task2.add_parent(task1) +``` + +When using the bitshift to compose operators, the relationship is set in the direction that the bitshift operator points. +For example, `task1 >> task2` means that `task1` runs first and `task2` runs second. +Multiple operators can be composed – keep in mind the chain is executed left-to-right and the rightmost object is always returned. For example: + +```python +task1 >> task2 >> task3 << task4 +``` + +is equivalent to: + +```python +task1.add_child(task2) +task2.add_child(task3) +task3.add_parent(task4) +``` diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 0f885d260..7d2fb5efd 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -68,17 +68,15 @@ def children(self) -> list[BaseTask]: else: raise Exception("ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin.") - def add_child(self, child: str | BaseTask) -> None: - child_id = child if isinstance(child, str) else child.id - - if child_id not in self.child_ids: - self.child_ids.append(child_id) - - def add_parent(self, parent: str | BaseTask) -> None: - parent_id = parent if isinstance(parent, str) else parent.id - - if parent_id not in self.parent_ids: - self.parent_ids.append(parent_id) + def add_child(self, child: BaseTask) -> BaseTask: + if child.id not in self.child_ids: + self.child_ids.append(child.id) + return child + + def add_parent(self, parent: BaseTask) -> BaseTask: + if parent.id not in self.parent_ids: + self.parent_ids.append(parent.id) + return parent def attach_to(self, parent_task: BaseTask) -> None: self.parent_task_id = parent_task.id diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index b3086bebb..1899eccd6 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -42,6 +42,16 @@ class State(Enum): kw_only=True, ) + def __rshift__(self, other: BaseTask) -> BaseTask: + self.add_child(other) + + return other + + def __lshift__(self, other: BaseTask) -> BaseTask: + self.add_parent(other) + + return other + def __attrs_post_init__(self) -> None: if self.structure is not None: self.structure.add_task(self) @@ -83,37 +93,37 @@ def meta_memories(self) -> list[BaseMetaEntry]: def __str__(self) -> str: return str(self.output.value) - def add_parents(self, parents: list[str | BaseTask]) -> None: + def add_parents(self, parents: list[BaseTask]) -> None: for parent in parents: self.add_parent(parent) - def add_parent(self, parent: str | BaseTask) -> None: - parent_id = parent if isinstance(parent, str) else parent.id + def add_parent(self, parent: BaseTask) -> BaseTask: + if parent.id not in self.parent_ids: + self.parent_ids.append(parent.id) - if parent_id not in self.parent_ids: - self.parent_ids.append(parent_id) + if self.id not in parent.child_ids: + parent.child_ids.append(self.id) - if isinstance(parent, BaseTask): - parent.add_child(self.id) + if self.structure is not None: + self.structure.add_task(parent) - if self.structure is not None: - self.structure.add_task(parent) + return self - def add_children(self, children: list[str | BaseTask]) -> None: + def add_children(self, children: list[BaseTask]) -> None: for child in children: self.add_child(child) - def add_child(self, child: str | BaseTask) -> None: - child_id = child if isinstance(child, str) else child.id + def add_child(self, child: BaseTask) -> BaseTask: + if child.id not in self.child_ids: + self.child_ids.append(child.id) - if child_id not in self.child_ids: - self.child_ids.append(child_id) + if self.id not in child.parent_ids: + child.parent_ids.append(self.id) - if isinstance(child, BaseTask): - child.add_parent(self.id) + if self.structure is not None: + self.structure.add_task(child) - if self.structure is not None: - self.structure.add_task(child) + return self def preprocess(self, structure: Structure) -> BaseTask: self.structure = structure diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 79c9868e1..45610bf20 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -277,8 +277,8 @@ def test_run_topology_1_imperative_parents(self): task3 = PromptTask("test3", id="task3") task4 = PromptTask("test4", id="task4") task2.add_parent(task1) - task3.add_parent("task1") - task4.add_parents([task2, "task3"]) + task3.add_parent(task1) + task4.add_parents([task2, task3]) workflow = Workflow(tasks=[task1, task2, task3, task4]) workflow.run() @@ -306,8 +306,8 @@ def test_run_topology_1_imperative_parents_structure_init(self): task3 = PromptTask("test3", id="task3", structure=workflow) task4 = PromptTask("test4", id="task4", structure=workflow) task2.add_parent(task1) - task3.add_parent("task1") - task4.add_parents([task2, "task3"]) + task3.add_parent(task1) + task4.add_parents([task2, task3]) workflow.run() @@ -432,9 +432,9 @@ def test_run_topology_2_imperative_parents(self): taskd = PromptTask("testd", id="taskd") taske = PromptTask("teste", id="taske") taskb.add_parent(taska) - taskc.add_parent("taska") + taskc.add_parent(taska) taskd.add_parents([taska, taskb, taskc]) - taske.add_parents(["taska", taskd, "taskc"]) + taske.add_parents([taska, taskd, taskc]) workflow = Workflow(tasks=[taska, taskb, taskc, taskd, taske]) workflow.run() @@ -466,7 +466,7 @@ def test_run_topology_2_imperative_mixed(self): taska.add_children([taskb, taskc, taskd, taske]) taskb.add_child(taskd) taskd.add_parent(taskc) - taske.add_parents(["taska", taskd, "taskc"]) + taske.add_parents([taska, taskd, taskc]) workflow = Workflow(tasks=[taska, taskb, taskc, taskd, taske]) workflow.run() diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 1b45b4e98..e87a99ccb 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -116,3 +116,39 @@ def test_execute_publish_events(self, task): task.execute() assert event_bus.event_listeners[0].handler.call_count == 2 + + def test_add_parent(self, task): + parent = MockTask("parent foobar", id="parent_foobar") + + result = task.add_parent(parent) + + assert parent.id in task.parent_ids + assert task.id in parent.child_ids + assert result == task + + def test_add_child(self, task): + child = MockTask("child foobar", id="child_foobar") + + result = task.add_child(child) + + assert child.id in task.child_ids + assert task.id in child.parent_ids + assert result == task + + def test_add_parent_bitshift(self, task): + parent = MockTask("parent foobar", id="parent_foobar") + + added_task = task << parent + + assert parent.id in task.parent_ids + assert task.id in parent.child_ids + assert added_task == parent + + def test_add_child_bitshift(self, task): + child = MockTask("child foobar", id="child_foobar") + + added_task = task >> child + + assert child.id in task.child_ids + assert task.id in child.parent_ids + assert added_task == child From c76b45342551be253f465fe8aabcaf606a24f1b4 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 15 Aug 2024 09:11:25 -0700 Subject: [PATCH 213/238] Lazily initialize config drivers field (#1062) --- griptape/config/__init__.py | 2 ++ griptape/config/base_config.py | 18 +++++++++++----- griptape/config/config.py | 37 +++++++++++++++++++++++++++----- tests/unit/config/test_config.py | 25 +++++++++++++++++++++ tests/unit/conftest.py | 20 +++++++++++++---- 5 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 tests/unit/config/test_config.py diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index b242d80a7..4a87c2d01 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -9,6 +9,7 @@ from .anthropic_driver_config import AnthropicDriverConfig from .google_driver_config import GoogleDriverConfig from .cohere_driver_config import CohereDriverConfig +from .logging_config import LoggingConfig from .config import config @@ -22,5 +23,6 @@ "AnthropicDriverConfig", "GoogleDriverConfig", "CohereDriverConfig", + "LoggingConfig", "config", ] diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index 9209aa4a4..ef62a4e9b 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -1,14 +1,22 @@ +from __future__ import annotations + from abc import ABC +from typing import TYPE_CHECKING, Optional -from attrs import define +from attrs import define, field from griptape.mixins.serializable_mixin import SerializableMixin -from .base_driver_config import BaseDriverConfig -from .logging_config import LoggingConfig +if TYPE_CHECKING: + from .base_driver_config import BaseDriverConfig + from .logging_config import LoggingConfig @define(kw_only=True) class BaseConfig(SerializableMixin, ABC): - drivers: BaseDriverConfig - logging: LoggingConfig + _logging: Optional[LoggingConfig] = field(alias="logging") + _drivers: Optional[BaseDriverConfig] = field(alias="drivers") + + def reset(self) -> None: + self._logging = None + self._drivers = None diff --git a/griptape/config/config.py b/griptape/config/config.py index 97d501abb..7b70df409 100644 --- a/griptape/config/config.py +++ b/griptape/config/config.py @@ -1,15 +1,42 @@ -from attrs import Factory, define, field +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +from attrs import define, field from .base_config import BaseConfig -from .base_driver_config import BaseDriverConfig from .logging_config import LoggingConfig from .openai_driver_config import OpenAiDriverConfig +if TYPE_CHECKING: + from .base_driver_config import BaseDriverConfig -@define + +@define(kw_only=True) class _Config(BaseConfig): - drivers: BaseDriverConfig = field(default=Factory(lambda: OpenAiDriverConfig()), kw_only=True) - logging: LoggingConfig = field(default=Factory(lambda: LoggingConfig()), kw_only=True) + _logging: Optional[LoggingConfig] = field(default=None, alias="logging") + _drivers: Optional[BaseDriverConfig] = field(default=None, alias="drivers") + + @property + def drivers(self) -> BaseDriverConfig: + """Lazily instantiates the drivers configuration to avoid client errors like missing API key.""" + if self._drivers is None: + self._drivers = OpenAiDriverConfig() + return self._drivers + + @drivers.setter + def drivers(self, drivers: BaseDriverConfig) -> None: + self._drivers = drivers + + @property + def logging(self) -> LoggingConfig: + if self._logging is None: + self._logging = LoggingConfig() + return self._logging + + @logging.setter + def logging(self, logging: LoggingConfig) -> None: + self._logging = logging config = _Config() diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py new file mode 100644 index 000000000..ecd02e1a1 --- /dev/null +++ b/tests/unit/config/test_config.py @@ -0,0 +1,25 @@ +import pytest + +from griptape.config.openai_driver_config import OpenAiDriverConfig + + +class TestConfig: + @pytest.mark.skip_mock_config() + def test_init(self): + from griptape.config import LoggingConfig, config + + assert isinstance(config.drivers, OpenAiDriverConfig) + assert isinstance(config.logging, LoggingConfig) + + @pytest.mark.skip_mock_config() + def test_lazy_init(self): + from griptape.config import config + + assert config._drivers is None + assert config._logging is None + + assert config.drivers is not None + assert config.logging is not None + + assert config._drivers is not None + assert config._logging is not None diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 8a37f6d28..db881bc20 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,12 +1,12 @@ import pytest -from griptape.config import config -from griptape.events import event_bus from tests.mocks.mock_driver_config import MockDriverConfig @pytest.fixture(autouse=True) def mock_event_bus(): + from griptape.events import event_bus + event_bus.clear_event_listeners() yield event_bus @@ -15,7 +15,19 @@ def mock_event_bus(): @pytest.fixture(autouse=True) -def mock_config(): +def mock_config(request): + from griptape.config import config + + config.reset() + + # Some tests we don't want to use the autouse fixture's MockDriverConfig + if "skip_mock_config" in request.keywords: + yield + + return + config.drivers = MockDriverConfig() - return config + yield config + + config.reset() From babc56a5b4415b8358c7cbcdda7abc137aebed37 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 15 Aug 2024 11:31:05 -0500 Subject: [PATCH 214/238] Add logging filters, update config namespaces (#1059) --- CHANGELOG.md | 2 +- .../src/multiple_agent_shared_memory_1.py | 3 +- docs/examples/src/talk_to_a_video_1.py | 3 +- .../drivers/src/embedding_drivers_10.py | 3 +- .../drivers/src/event_listener_drivers_4.py | 3 +- docs/griptape-framework/structures/config.md | 34 ++++++++++++------- .../structures/src/config_1.py | 3 +- .../structures/src/config_2.py | 3 +- .../structures/src/config_3.py | 3 +- .../structures/src/config_4.py | 3 +- .../structures/src/config_5.py | 3 +- .../structures/src/config_6.py | 3 +- .../structures/src/config_7.py | 3 +- .../structures/src/config_8.py | 3 +- .../structures/src/config_logging.py | 14 ++++++++ .../structures/src/task_memory_6.py | 6 ++-- .../official-tools/src/rest_api_tool_1.py | 3 +- griptape/config/__init__.py | 20 ----------- griptape/config/base_config.py | 4 +-- griptape/config/config.py | 6 ++-- griptape/config/drivers/__init__.py | 20 +++++++++++ .../amazon_bedrock_driver_config.py | 2 +- .../{ => drivers}/anthropic_driver_config.py | 2 +- .../azure_openai_driver_config.py | 2 +- .../{ => drivers}/base_driver_config.py | 0 .../{ => drivers}/cohere_driver_config.py | 2 +- .../config/{ => drivers}/driver_config.py | 2 +- .../{ => drivers}/google_driver_config.py | 2 +- .../{ => drivers}/openai_driver_config.py | 2 +- griptape/config/logging/__init__.py | 5 +++ .../config/{ => logging}/logging_config.py | 11 ++---- .../config/logging/newline_logging_filter.py | 13 +++++++ .../config/logging/truncate_logging_filter.py | 17 ++++++++++ tests/mocks/mock_driver_config.py | 2 +- tests/unit/config/drivers/__init__.py | 0 .../test_amazon_bedrock_driver_config.py | 2 +- .../test_anthropic_driver_config.py | 2 +- .../test_azure_openai_driver_config.py | 2 +- .../test_cohere_driver_config.py | 2 +- .../{ => drivers}/test_driver_config.py | 2 +- .../test_google_driver_config.py | 2 +- .../test_openai_driver_config.py | 2 +- tests/unit/config/logging/__init__.py | 0 .../logging/test_newline_logging_filter.py | 20 +++++++++++ .../logging/test_truncate_logging_filter.py | 20 +++++++++++ tests/unit/config/test_config.py | 5 +-- 46 files changed, 185 insertions(+), 81 deletions(-) create mode 100644 docs/griptape-framework/structures/src/config_logging.py create mode 100644 griptape/config/drivers/__init__.py rename griptape/config/{ => drivers}/amazon_bedrock_driver_config.py (98%) rename griptape/config/{ => drivers}/anthropic_driver_config.py (96%) rename griptape/config/{ => drivers}/azure_openai_driver_config.py (98%) rename griptape/config/{ => drivers}/base_driver_config.py (100%) rename griptape/config/{ => drivers}/cohere_driver_config.py (95%) rename griptape/config/{ => drivers}/driver_config.py (97%) rename griptape/config/{ => drivers}/google_driver_config.py (94%) rename griptape/config/{ => drivers}/openai_driver_config.py (97%) create mode 100644 griptape/config/logging/__init__.py rename griptape/config/{ => logging}/logging_config.py (53%) create mode 100644 griptape/config/logging/newline_logging_filter.py create mode 100644 griptape/config/logging/truncate_logging_filter.py create mode 100644 tests/unit/config/drivers/__init__.py rename tests/unit/config/{ => drivers}/test_amazon_bedrock_driver_config.py (98%) rename tests/unit/config/{ => drivers}/test_anthropic_driver_config.py (96%) rename tests/unit/config/{ => drivers}/test_azure_openai_driver_config.py (98%) rename tests/unit/config/{ => drivers}/test_cohere_driver_config.py (96%) rename tests/unit/config/{ => drivers}/test_driver_config.py (96%) rename tests/unit/config/{ => drivers}/test_google_driver_config.py (97%) rename tests/unit/config/{ => drivers}/test_openai_driver_config.py (98%) create mode 100644 tests/unit/config/logging/__init__.py create mode 100644 tests/unit/config/logging/test_newline_logging_filter.py create mode 100644 tests/unit/config/logging/test_truncate_logging_filter.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b69e7f32..ca7c663ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `Structure.embedding_driver`, set this via `griptape.config.config.drivers.embedding` instead. - **BREAKING**: Removed `Structure.custom_logger` and `Structure.logger_level`, set these via `griptape.config.config.logger` instead. - **BREAKING**: Removed `BaseStructureConfig.merge_config`. -- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, and renamed fields accordingly. +- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, moved to `griptape.config.drivers` and renamed fields accordingly. - **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly. - **BREAKING**: Removed before and after response modules from `ResponseRagStage`. - **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`. diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index e156e531a..11590df39 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -1,6 +1,7 @@ import os -from griptape.config import AzureOpenAiDriverConfig, config +from griptape.config import config +from griptape.config.drivers import AzureOpenAiDriverConfig from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver from griptape.structures import Agent from griptape.tools import TaskMemoryTool, WebScraperTool diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py index 3538c9071..377e177a6 100644 --- a/docs/examples/src/talk_to_a_video_1.py +++ b/docs/examples/src/talk_to_a_video_1.py @@ -3,7 +3,8 @@ import google.generativeai as genai from griptape.artifacts import GenericArtifact, TextArtifact -from griptape.config import GoogleDriverConfig, config +from griptape.config import config +from griptape.config.drivers import GoogleDriverConfig from griptape.structures import Agent config.drivers = GoogleDriverConfig() diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index 4f7560c99..a27e60298 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -1,4 +1,5 @@ -from griptape.config import DriverConfig, config +from griptape.config import config +from griptape.config.drivers import DriverConfig from griptape.drivers import ( OpenAiChatPromptDriver, VoyageAiEmbeddingDriver, diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py index a70e05d79..7a0957e63 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py @@ -1,6 +1,7 @@ import os -from griptape.config import DriverConfig, config +from griptape.config import config +from griptape.config.drivers import DriverConfig from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver from griptape.events import EventListener, FinishStructureRunEvent, event_bus from griptape.rules import Rule diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 89399f60c..67721ebb1 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -5,15 +5,17 @@ search: ## Overview -The [DriverConfig](../../reference/griptape/config/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. +Griptape exposes global configuration options to easily customize different parts of the framework. -### Premade Configs +### Driver Configs -Griptape provides predefined [DriverConfig](../../reference/griptape/config/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. +The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. + +Griptape provides predefined [DriverConfig](../../reference/griptape/config/drivers/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. #### OpenAI -The [OpenAI Driver config](../../reference/griptape/config/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. +The [OpenAI Driver config](../../reference/griptape/config/drivers/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. ```python --8<-- "docs/griptape-framework/structures/src/config_1.py" @@ -21,21 +23,21 @@ The [OpenAI Driver config](../../reference/griptape/config/openai_driver_config. #### Azure OpenAI -The [Azure OpenAI Driver config](../../reference/griptape/config/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs. +The [Azure OpenAI Driver config](../../reference/griptape/config/drivers/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_2.py" ``` #### Amazon Bedrock -The [Amazon Bedrock Driver config](../../reference/griptape/config/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs. +The [Amazon Bedrock Driver config](../../reference/griptape/config/drivers/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_3.py" ``` #### Google -The [Google Driver config](../../reference/griptape/config/google_driver_config.md) provides default Drivers for Google's Gemini APIs. +The [Google Driver config](../../reference/griptape/config/drivers/google_driver_config.md) provides default Drivers for Google's Gemini APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_4.py" @@ -43,7 +45,7 @@ The [Google Driver config](../../reference/griptape/config/google_driver_config. #### Anthropic -The [Anthropic Driver config](../../reference/griptape/config/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs. +The [Anthropic Driver config](../../reference/griptape/config/drivers/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs. !!! info Anthropic does not provide an embeddings API which means you will need to use another service for embeddings. @@ -56,22 +58,30 @@ The [Anthropic Driver config](../../reference/griptape/config/anthropic_driver_c #### Cohere -The [Cohere Driver config](../../reference/griptape/config/cohere_driver_config.md) provides default Drivers for Cohere's APIs. +The [Cohere Driver config](../../reference/griptape/config/drivers/cohere_driver_config.md) provides default Drivers for Cohere's APIs. ```python --8<-- "docs/griptape-framework/structures/src/config_6.py" ``` -### Custom Configs +#### Custom -You can create your own [DriverConfig](../../reference/griptape/config/driver_config.md) by overriding relevant Drivers. -The [DriverConfig](../../reference/griptape/config/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. +You can create your own [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) by overriding relevant Drivers. +The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. ```python --8<-- "docs/griptape-framework/structures/src/config_7.py" ``` +### Logging Config + +Griptape provides a predefined [LoggingConfig](../../reference/griptape/config/logging/logging_config.md)'s for easily customizing the logging events that the framework emits. In order to customize the logger, the logger can be fetched by using the `config.logging.logger_name`. + +```python +--8<-- "docs/griptape-framework/structures/src/config_logging.py" +``` + ### Loading/Saving Configs ```python diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py index 0c7a5ed9e..df75488dc 100644 --- a/docs/griptape-framework/structures/src/config_1.py +++ b/docs/griptape-framework/structures/src/config_1.py @@ -1,4 +1,5 @@ -from griptape.config import OpenAiDriverConfig, config +from griptape.config import config +from griptape.config.drivers import OpenAiDriverConfig from griptape.structures import Agent config.drivers = OpenAiDriverConfig() diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/config_2.py index a5f8efbbe..6fcdedbc8 100644 --- a/docs/griptape-framework/structures/src/config_2.py +++ b/docs/griptape-framework/structures/src/config_2.py @@ -1,6 +1,7 @@ import os -from griptape.config import AzureOpenAiDriverConfig, config +from griptape.config import config +from griptape.config.drivers import AzureOpenAiDriverConfig from griptape.structures import Agent config.drivers = AzureOpenAiDriverConfig( diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/config_3.py index 6b3f51a76..e4e33e379 100644 --- a/docs/griptape-framework/structures/src/config_3.py +++ b/docs/griptape-framework/structures/src/config_3.py @@ -2,7 +2,8 @@ import boto3 -from griptape.config import AmazonBedrockDriverConfig, config +from griptape.config import config +from griptape.config.drivers import AmazonBedrockDriverConfig from griptape.structures import Agent config.drivers = AmazonBedrockDriverConfig( diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py index 5362b8c6b..7ab5eee70 100644 --- a/docs/griptape-framework/structures/src/config_4.py +++ b/docs/griptape-framework/structures/src/config_4.py @@ -1,4 +1,5 @@ -from griptape.config import GoogleDriverConfig, config +from griptape.config import config +from griptape.config.drivers import GoogleDriverConfig from griptape.structures import Agent config.drivers = GoogleDriverConfig() diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py index 4f787a922..bee5050c2 100644 --- a/docs/griptape-framework/structures/src/config_5.py +++ b/docs/griptape-framework/structures/src/config_5.py @@ -1,4 +1,5 @@ -from griptape.config import AnthropicDriverConfig, config +from griptape.config import config +from griptape.config.drivers import AnthropicDriverConfig from griptape.structures import Agent config.drivers = AnthropicDriverConfig() diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py index c26502401..569000180 100644 --- a/docs/griptape-framework/structures/src/config_6.py +++ b/docs/griptape-framework/structures/src/config_6.py @@ -1,6 +1,7 @@ import os -from griptape.config import CohereDriverConfig, config +from griptape.config import config +from griptape.config.drivers import CohereDriverConfig from griptape.structures import Agent config.drivers = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"]) diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/config_7.py index 6b285f0e5..9f464b167 100644 --- a/docs/griptape-framework/structures/src/config_7.py +++ b/docs/griptape-framework/structures/src/config_7.py @@ -1,6 +1,7 @@ import os -from griptape.config import DriverConfig, config +from griptape.config import config +from griptape.config.drivers import DriverConfig from griptape.drivers import AnthropicPromptDriver from griptape.structures import Agent diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py index 4f23e3eaa..6bc87998c 100644 --- a/docs/griptape-framework/structures/src/config_8.py +++ b/docs/griptape-framework/structures/src/config_8.py @@ -1,4 +1,5 @@ -from griptape.config import AmazonBedrockDriverConfig, config +from griptape.config import config +from griptape.config.drivers import AmazonBedrockDriverConfig from griptape.structures import Agent custom_config = AmazonBedrockDriverConfig() diff --git a/docs/griptape-framework/structures/src/config_logging.py b/docs/griptape-framework/structures/src/config_logging.py new file mode 100644 index 000000000..81645d5e2 --- /dev/null +++ b/docs/griptape-framework/structures/src/config_logging.py @@ -0,0 +1,14 @@ +import logging + +from griptape.config import config +from griptape.config.drivers import OpenAiDriverConfig +from griptape.config.logging import TruncateLoggingFilter +from griptape.structures import Agent + +config.drivers = OpenAiDriverConfig() + +logger = logging.getLogger(config.logging.logger_name) +logger.setLevel(logging.ERROR) +logger.addFilter(TruncateLoggingFilter(max_log_length=100)) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 3f4d14b0a..8d39f0286 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -1,8 +1,6 @@ from griptape.artifacts import TextArtifact -from griptape.config import ( - OpenAiDriverConfig, - config, -) +from griptape.config import config +from griptape.config.drivers import OpenAiDriverConfig from griptape.drivers import ( LocalVectorStoreDriver, OpenAiChatPromptDriver, diff --git a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py index 2093163b7..4ef73dd9d 100644 --- a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py +++ b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py @@ -1,6 +1,7 @@ from json import dumps -from griptape.config import DriverConfig, config +from griptape.config import config +from griptape.config.drivers import DriverConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index 4a87c2d01..043d152ba 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -1,28 +1,8 @@ from .base_config import BaseConfig - -from .base_driver_config import BaseDriverConfig - -from .driver_config import DriverConfig -from .openai_driver_config import OpenAiDriverConfig -from .azure_openai_driver_config import AzureOpenAiDriverConfig -from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig -from .anthropic_driver_config import AnthropicDriverConfig -from .google_driver_config import GoogleDriverConfig -from .cohere_driver_config import CohereDriverConfig -from .logging_config import LoggingConfig from .config import config __all__ = [ "BaseConfig", - "BaseDriverConfig", - "DriverConfig", - "OpenAiDriverConfig", - "AzureOpenAiDriverConfig", - "AmazonBedrockDriverConfig", - "AnthropicDriverConfig", - "GoogleDriverConfig", - "CohereDriverConfig", - "LoggingConfig", "config", ] diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index ef62a4e9b..7ed00e445 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -8,8 +8,8 @@ from griptape.mixins.serializable_mixin import SerializableMixin if TYPE_CHECKING: - from .base_driver_config import BaseDriverConfig - from .logging_config import LoggingConfig + from .drivers.base_driver_config import BaseDriverConfig + from .logging.logging_config import LoggingConfig @define(kw_only=True) diff --git a/griptape/config/config.py b/griptape/config/config.py index 7b70df409..11c2f9585 100644 --- a/griptape/config/config.py +++ b/griptape/config/config.py @@ -5,11 +5,11 @@ from attrs import define, field from .base_config import BaseConfig -from .logging_config import LoggingConfig -from .openai_driver_config import OpenAiDriverConfig +from .drivers.openai_driver_config import OpenAiDriverConfig +from .logging.logging_config import LoggingConfig if TYPE_CHECKING: - from .base_driver_config import BaseDriverConfig + from .drivers.base_driver_config import BaseDriverConfig @define(kw_only=True) diff --git a/griptape/config/drivers/__init__.py b/griptape/config/drivers/__init__.py new file mode 100644 index 000000000..9d5f2f510 --- /dev/null +++ b/griptape/config/drivers/__init__.py @@ -0,0 +1,20 @@ +from .base_driver_config import BaseDriverConfig +from .driver_config import DriverConfig + +from .openai_driver_config import OpenAiDriverConfig +from .azure_openai_driver_config import AzureOpenAiDriverConfig +from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig +from .anthropic_driver_config import AnthropicDriverConfig +from .google_driver_config import GoogleDriverConfig +from .cohere_driver_config import CohereDriverConfig + +__all__ = [ + "BaseDriverConfig", + "DriverConfig", + "OpenAiDriverConfig", + "AzureOpenAiDriverConfig", + "AmazonBedrockDriverConfig", + "AnthropicDriverConfig", + "GoogleDriverConfig", + "CohereDriverConfig", +] diff --git a/griptape/config/amazon_bedrock_driver_config.py b/griptape/config/drivers/amazon_bedrock_driver_config.py similarity index 98% rename from griptape/config/amazon_bedrock_driver_config.py rename to griptape/config/drivers/amazon_bedrock_driver_config.py index a07300638..ea540b391 100644 --- a/griptape/config/amazon_bedrock_driver_config.py +++ b/griptape/config/drivers/amazon_bedrock_driver_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, AmazonBedrockImageQueryDriver, diff --git a/griptape/config/anthropic_driver_config.py b/griptape/config/drivers/anthropic_driver_config.py similarity index 96% rename from griptape/config/anthropic_driver_config.py rename to griptape/config/drivers/anthropic_driver_config.py index 642a3fced..0c4524159 100644 --- a/griptape/config/anthropic_driver_config.py +++ b/griptape/config/drivers/anthropic_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( AnthropicImageQueryDriver, AnthropicPromptDriver, diff --git a/griptape/config/azure_openai_driver_config.py b/griptape/config/drivers/azure_openai_driver_config.py similarity index 98% rename from griptape/config/azure_openai_driver_config.py rename to griptape/config/drivers/azure_openai_driver_config.py index c987a31b5..bcb173fbd 100644 --- a/griptape/config/azure_openai_driver_config.py +++ b/griptape/config/drivers/azure_openai_driver_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, diff --git a/griptape/config/base_driver_config.py b/griptape/config/drivers/base_driver_config.py similarity index 100% rename from griptape/config/base_driver_config.py rename to griptape/config/drivers/base_driver_config.py diff --git a/griptape/config/cohere_driver_config.py b/griptape/config/drivers/cohere_driver_config.py similarity index 95% rename from griptape/config/cohere_driver_config.py rename to griptape/config/drivers/cohere_driver_config.py index 7195f550f..eb8a55ce4 100644 --- a/griptape/config/cohere_driver_config.py +++ b/griptape/config/drivers/cohere_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( BaseEmbeddingDriver, BasePromptDriver, diff --git a/griptape/config/driver_config.py b/griptape/config/drivers/driver_config.py similarity index 97% rename from griptape/config/driver_config.py rename to griptape/config/drivers/driver_config.py index 325591258..d342ecb0a 100644 --- a/griptape/config/driver_config.py +++ b/griptape/config/drivers/driver_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import BaseDriverConfig +from griptape.config.drivers import BaseDriverConfig from griptape.drivers import ( DummyAudioTranscriptionDriver, DummyEmbeddingDriver, diff --git a/griptape/config/google_driver_config.py b/griptape/config/drivers/google_driver_config.py similarity index 94% rename from griptape/config/google_driver_config.py rename to griptape/config/drivers/google_driver_config.py index a1089f0ee..6f4243f01 100644 --- a/griptape/config/google_driver_config.py +++ b/griptape/config/drivers/google_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( BaseEmbeddingDriver, BasePromptDriver, diff --git a/griptape/config/openai_driver_config.py b/griptape/config/drivers/openai_driver_config.py similarity index 97% rename from griptape/config/openai_driver_config.py rename to griptape/config/drivers/openai_driver_config.py index 35ccde43d..0b05d1636 100644 --- a/griptape/config/openai_driver_config.py +++ b/griptape/config/drivers/openai_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers import ( BaseAudioTranscriptionDriver, BaseEmbeddingDriver, diff --git a/griptape/config/logging/__init__.py b/griptape/config/logging/__init__.py new file mode 100644 index 000000000..de7726060 --- /dev/null +++ b/griptape/config/logging/__init__.py @@ -0,0 +1,5 @@ +from .logging_config import LoggingConfig +from .truncate_logging_filter import TruncateLoggingFilter +from .newline_logging_filter import NewlineLoggingFilter + +__all__ = ["LoggingConfig", "TruncateLoggingFilter", "NewlineLoggingFilter"] diff --git a/griptape/config/logging_config.py b/griptape/config/logging/logging_config.py similarity index 53% rename from griptape/config/logging_config.py rename to griptape/config/logging/logging_config.py index 0c0fcc020..80497d7c8 100644 --- a/griptape/config/logging_config.py +++ b/griptape/config/logging/logging_config.py @@ -9,16 +9,9 @@ @define class LoggingConfig: logger_name: str = field(default="griptape", kw_only=True) - logger_level: int = field( - default=logging.INFO, - kw_only=True, - on_setattr=lambda self, _, value: logging.getLogger(self.logger_name).setLevel(value), - ) def __attrs_post_init__(self) -> None: logger = logging.getLogger(self.logger_name) - + logger.setLevel(logging.INFO) logger.propagate = False - logger.setLevel(self.logger_level) - - logger.handlers = [RichHandler(show_time=True, show_path=False)] + logger.addHandler(RichHandler(show_time=True, show_path=False)) diff --git a/griptape/config/logging/newline_logging_filter.py b/griptape/config/logging/newline_logging_filter.py new file mode 100644 index 000000000..bae08265f --- /dev/null +++ b/griptape/config/logging/newline_logging_filter.py @@ -0,0 +1,13 @@ +import logging +from typing import Any + +from attrs import define, field + + +@define +class NewlineLoggingFilter(logging.Filter): + replace_str: str = field(default=" ", kw_only=True) + + def filter(self, record: Any) -> bool: + record.msg = record.msg.replace("\n", self.replace_str) + return True diff --git a/griptape/config/logging/truncate_logging_filter.py b/griptape/config/logging/truncate_logging_filter.py new file mode 100644 index 000000000..9888fc169 --- /dev/null +++ b/griptape/config/logging/truncate_logging_filter.py @@ -0,0 +1,17 @@ +import logging +from typing import Any + +from attrs import define, field + + +@define +class TruncateLoggingFilter(logging.Filter): + max_log_length: int = field(default=1000, kw_only=True) + + def filter(self, record: Any) -> bool: + message = record.getMessage() + + if len(message) > self.max_log_length: + record.msg = f"{message[:self.max_log_length]}... [{len(message) - self.max_log_length} more characters]" + record.args = () + return True diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_driver_config.py index 6b152721d..20f2ac684 100644 --- a/tests/mocks/mock_driver_config.py +++ b/tests/mocks/mock_driver_config.py @@ -1,6 +1,6 @@ from attrs import Factory, define, field -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver diff --git a/tests/unit/config/drivers/__init__.py b/tests/unit/config/drivers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/config/test_amazon_bedrock_driver_config.py b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py similarity index 98% rename from tests/unit/config/test_amazon_bedrock_driver_config.py rename to tests/unit/config/drivers/test_amazon_bedrock_driver_config.py index 57a80809e..a76eeb278 100644 --- a/tests/unit/config/test_amazon_bedrock_driver_config.py +++ b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py @@ -1,7 +1,7 @@ import boto3 import pytest -from griptape.config import AmazonBedrockDriverConfig +from griptape.config.drivers import AmazonBedrockDriverConfig from tests.utils.aws import mock_aws_credentials diff --git a/tests/unit/config/test_anthropic_driver_config.py b/tests/unit/config/drivers/test_anthropic_driver_config.py similarity index 96% rename from tests/unit/config/test_anthropic_driver_config.py rename to tests/unit/config/drivers/test_anthropic_driver_config.py index a2ccbd25b..a496c47b7 100644 --- a/tests/unit/config/test_anthropic_driver_config.py +++ b/tests/unit/config/drivers/test_anthropic_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import AnthropicDriverConfig +from griptape.config.drivers import AnthropicDriverConfig class TestAnthropicDriverConfig: diff --git a/tests/unit/config/test_azure_openai_driver_config.py b/tests/unit/config/drivers/test_azure_openai_driver_config.py similarity index 98% rename from tests/unit/config/test_azure_openai_driver_config.py rename to tests/unit/config/drivers/test_azure_openai_driver_config.py index 3c88b859d..ef418e097 100644 --- a/tests/unit/config/test_azure_openai_driver_config.py +++ b/tests/unit/config/drivers/test_azure_openai_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import AzureOpenAiDriverConfig +from griptape.config.drivers import AzureOpenAiDriverConfig class TestAzureOpenAiDriverConfig: diff --git a/tests/unit/config/test_cohere_driver_config.py b/tests/unit/config/drivers/test_cohere_driver_config.py similarity index 96% rename from tests/unit/config/test_cohere_driver_config.py rename to tests/unit/config/drivers/test_cohere_driver_config.py index 9e8407d84..5a75c98cd 100644 --- a/tests/unit/config/test_cohere_driver_config.py +++ b/tests/unit/config/drivers/test_cohere_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import CohereDriverConfig +from griptape.config.drivers import CohereDriverConfig class TestCohereDriverConfig: diff --git a/tests/unit/config/test_driver_config.py b/tests/unit/config/drivers/test_driver_config.py similarity index 96% rename from tests/unit/config/test_driver_config.py rename to tests/unit/config/drivers/test_driver_config.py index dd3fd1a47..71220646f 100644 --- a/tests/unit/config/test_driver_config.py +++ b/tests/unit/config/drivers/test_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import DriverConfig +from griptape.config.drivers import DriverConfig class TestDriverConfig: diff --git a/tests/unit/config/test_google_driver_config.py b/tests/unit/config/drivers/test_google_driver_config.py similarity index 97% rename from tests/unit/config/test_google_driver_config.py rename to tests/unit/config/drivers/test_google_driver_config.py index fb6cd23b5..3a16173b5 100644 --- a/tests/unit/config/test_google_driver_config.py +++ b/tests/unit/config/drivers/test_google_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import GoogleDriverConfig +from griptape.config.drivers import GoogleDriverConfig class TestGoogleDriverConfig: diff --git a/tests/unit/config/test_openai_driver_config.py b/tests/unit/config/drivers/test_openai_driver_config.py similarity index 98% rename from tests/unit/config/test_openai_driver_config.py rename to tests/unit/config/drivers/test_openai_driver_config.py index 55156730c..860f70518 100644 --- a/tests/unit/config/test_openai_driver_config.py +++ b/tests/unit/config/drivers/test_openai_driver_config.py @@ -1,6 +1,6 @@ import pytest -from griptape.config import OpenAiDriverConfig +from griptape.config.drivers import OpenAiDriverConfig class TestOpenAiDriverConfig: diff --git a/tests/unit/config/logging/__init__.py b/tests/unit/config/logging/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/config/logging/test_newline_logging_filter.py b/tests/unit/config/logging/test_newline_logging_filter.py new file mode 100644 index 000000000..d5b05e323 --- /dev/null +++ b/tests/unit/config/logging/test_newline_logging_filter.py @@ -0,0 +1,20 @@ +import io +import logging +from contextlib import redirect_stdout + +from griptape.config import config +from griptape.config.logging import NewlineLoggingFilter +from griptape.structures import Agent + + +class TestNewlineLoggingFilter: + def test_filter(self): + # use the filter in an Agent + logger = logging.getLogger(config.logging.logger_name) + logger.addFilter(NewlineLoggingFilter(replace_str="$$$")) + agent = Agent() + # use a context manager to capture the stdout + with io.StringIO() as buf, redirect_stdout(buf): + agent.run() + output = buf.getvalue() + assert "$$$" in output diff --git a/tests/unit/config/logging/test_truncate_logging_filter.py b/tests/unit/config/logging/test_truncate_logging_filter.py new file mode 100644 index 000000000..fc0aa1c47 --- /dev/null +++ b/tests/unit/config/logging/test_truncate_logging_filter.py @@ -0,0 +1,20 @@ +import io +import logging +from contextlib import redirect_stdout + +from griptape.config import config +from griptape.config.logging import TruncateLoggingFilter +from griptape.structures import Agent + + +class TestTruncateLoggingFilter: + def test_filter(self): + # use the filter in an Agent + logger = logging.getLogger(config.logging.logger_name) + logger.addFilter(TruncateLoggingFilter(max_log_length=0)) + agent = Agent() + # use a context manager to capture the stdout + with io.StringIO() as buf, redirect_stdout(buf): + agent.run("test") + output = buf.getvalue() + assert "more characters]" in output diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index ecd02e1a1..04d5586d2 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -1,12 +1,13 @@ import pytest -from griptape.config.openai_driver_config import OpenAiDriverConfig +from griptape.config.drivers import OpenAiDriverConfig class TestConfig: @pytest.mark.skip_mock_config() def test_init(self): - from griptape.config import LoggingConfig, config + from griptape.config import config + from griptape.config.logging import LoggingConfig assert isinstance(config.drivers, OpenAiDriverConfig) assert isinstance(config.logging, LoggingConfig) From adb660e6dc2e810491d157042bd57467fa0a50ca Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 15 Aug 2024 09:54:41 -0700 Subject: [PATCH 215/238] Update dependencies, fix emergent issues (#1061) --- .../drivers/amazon_bedrock_driver_config.py | 3 +- .../openai_audio_transcription_driver.py | 2 +- .../griptape_cloud_event_listener_driver.py | 7 +- .../openai_image_generation_driver.py | 2 +- .../image_query/openai_image_query_driver.py | 2 +- .../griptape_cloud_observability_driver.py | 6 +- .../openai_text_to_speech_driver.py | 2 +- poetry.lock | 2003 +++++++++-------- pyproject.toml | 10 +- 9 files changed, 1038 insertions(+), 999 deletions(-) diff --git a/griptape/config/drivers/amazon_bedrock_driver_config.py b/griptape/config/drivers/amazon_bedrock_driver_config.py index ea540b391..0eca4877b 100644 --- a/griptape/config/drivers/amazon_bedrock_driver_config.py +++ b/griptape/config/drivers/amazon_bedrock_driver_config.py @@ -12,6 +12,7 @@ AmazonBedrockTitanEmbeddingDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, + BaseImageQueryDriver, BasePromptDriver, BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, @@ -63,7 +64,7 @@ class AmazonBedrockDriverConfig(DriverConfig): kw_only=True, metadata={"serializable": True}, ) - image_query: BaseImageGenerationDriver = field( + image_query: BaseImageQueryDriver = field( default=Factory( lambda self: AmazonBedrockImageQueryDriver( session=self.session, diff --git a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py index 9240c3a4f..312fa8318 100644 --- a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py @@ -12,7 +12,7 @@ @define class OpenAiAudioTranscriptionDriver(BaseAudioTranscriptionDriver): - api_type: str = field(default=openai.api_type, kw_only=True) + api_type: Optional[str] = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 733f0baa2..98f52b914 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -1,6 +1,7 @@ from __future__ import annotations import os +from typing import Optional from urllib.parse import urljoin import requests @@ -25,12 +26,14 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True, ) - api_key: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) + api_key: Optional[str] = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) headers: dict = field( default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True, ) - structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) + structure_run_id: Optional[str] = field( + default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True + ) @structure_run_id.validator # pyright: ignore[reportAttributeAccessIssue] def validate_run_id(self, _: Attribute, structure_run_id: str) -> None: diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index 54eab48ec..0ee50a1e2 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -33,7 +33,7 @@ class OpenAiImageGenerationDriver(BaseImageGenerationDriver): a base64 encoded image in a JSON object. """ - api_type: str = field(default=openai.api_type, kw_only=True) + api_type: Optional[str] = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) diff --git a/griptape/drivers/image_query/openai_image_query_driver.py b/griptape/drivers/image_query/openai_image_query_driver.py index b607c97f5..6399efa95 100644 --- a/griptape/drivers/image_query/openai_image_query_driver.py +++ b/griptape/drivers/image_query/openai_image_query_driver.py @@ -18,7 +18,7 @@ @define class OpenAiImageQueryDriver(BaseImageQueryDriver): model: str = field(kw_only=True, metadata={"serializable": True}) - api_type: str = field(default=openai.api_type, kw_only=True) + api_type: Optional[str] = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) api_key: Optional[str] = field(default=None, kw_only=True) diff --git a/griptape/drivers/observability/griptape_cloud_observability_driver.py b/griptape/drivers/observability/griptape_cloud_observability_driver.py index 6c99bd231..b2f13ba27 100644 --- a/griptape/drivers/observability/griptape_cloud_observability_driver.py +++ b/griptape/drivers/observability/griptape_cloud_observability_driver.py @@ -23,11 +23,13 @@ class GriptapeCloudObservabilityDriver(OpenTelemetryObservabilityDriver): base_url: str = field( default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True ) - api_key: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) + api_key: Optional[str] = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) headers: dict = field( default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True ) - structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) + structure_run_id: Optional[str] = field( + default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True + ) span_processor: SpanProcessor = field( default=Factory( lambda self: import_optional_dependency("opentelemetry.sdk.trace.export").BatchSpanProcessor( diff --git a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py index cb0c5340d..543ef1ec7 100644 --- a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py @@ -18,7 +18,7 @@ class OpenAiTextToSpeechDriver(BaseTextToSpeechDriver): metadata={"serializable": True}, ) format: Literal["mp3", "opus", "aac", "flac"] = field(default="mp3", kw_only=True, metadata={"serializable": True}) - api_type: str = field(default=openai.api_type, kw_only=True) + api_type: Optional[str] = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) api_key: Optional[str] = field(default=None, kw_only=True) diff --git a/poetry.lock b/poetry.lock index d3ac878c7..ad2653f13 100644 --- a/poetry.lock +++ b/poetry.lock @@ -33,98 +33,98 @@ testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", [[package]] name = "aiohappyeyeballs" -version = "2.3.2" -description = "Happy Eyeballs" +version = "2.3.5" +description = "Happy Eyeballs for asyncio" optional = true -python-versions = ">=3.8,<4.0" +python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.3.2-py3-none-any.whl", hash = "sha256:903282fb08c8cfb3de356fd546b263248a477c99cb147e20a115e14ab942a4ae"}, - {file = "aiohappyeyeballs-2.3.2.tar.gz", hash = "sha256:77e15a733090547a1f5369a1287ddfc944bd30df0eb8993f585259c34b405f4e"}, + {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, + {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, ] [[package]] name = "aiohttp" -version = "3.10.0" +version = "3.10.3" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:68ab608118e212f56feef44d4785aa90b713042da301f26338f36497b481cd79"}, - {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:64a117c16273ca9f18670f33fc7fd9604b9f46ddb453ce948262889a6be72868"}, - {file = "aiohttp-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54076a25f32305e585a3abae1f0ad10646bec539e0e5ebcc62b54ee4982ec29f"}, - {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c76685773444d90ae83874433505ed800e1706c391fdf9e57cc7857611e2f4"}, - {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdda86ab376f9b3095a1079a16fbe44acb9ddde349634f1c9909d13631ff3bcf"}, - {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6dcd1d21da5ae1416f69aa03e883a51e84b6c803b8618cbab341ac89a85b9e"}, - {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ef0135d7ab7fb0284342fbbf8e8ddf73b7fee8ecc55f5c3a3d0a6b765e6d8b"}, - {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccab9381f38c669bb9254d848f3b41a3284193b3e274a34687822f98412097e9"}, - {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:947da3aee057010bc750b7b4bb65cbd01b0bdb7c4e1cf278489a1d4a1e9596b3"}, - {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5268b35fee7eb754fb5b3d0f16a84a2e9ed21306f5377f3818596214ad2d7714"}, - {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff25d988fd6ce433b5c393094a5ca50df568bdccf90a8b340900e24e0d5fb45c"}, - {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:594b4b4f1dfe8378b4a0342576dc87a930c960641159f5ae83843834016dbd59"}, - {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c8820dad615cd2f296ed3fdea8402b12663ac9e5ea2aafc90ef5141eb10b50b8"}, - {file = "aiohttp-3.10.0-cp310-cp310-win32.whl", hash = "sha256:ab1d870403817c9a0486ca56ccbc0ebaf85d992277d48777faa5a95e40e5bcca"}, - {file = "aiohttp-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:563705a94ea3af43467167f3a21c665f3b847b2a0ae5544fa9e18df686a660da"}, - {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13679e11937d3f37600860de1f848e2e062e2b396d3aa79b38c89f9c8ab7e791"}, - {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c66a1aadafbc0bd7d648cb7fcb3860ec9beb1b436ce3357036a4d9284fcef9a"}, - {file = "aiohttp-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7e3545b06aae925f90f06402e05cfb9c62c6409ce57041932163b09c48daad6"}, - {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:effafe5144aa32f0388e8f99b1b2692cf094ea2f6b7ceca384b54338b77b1f50"}, - {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a04f2c8d41821a2507b49b2694c40495a295b013afb0cc7355b337980b47c546"}, - {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6dbfac556219d884d50edc6e1952a93545c2786193f00f5521ec0d9d464040ab"}, - {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a65472256c5232681968deeea3cd5453aa091c44e8db09f22f1a1491d422c2d9"}, - {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941366a554e566efdd3f042e17a9e461a36202469e5fd2aee66fe3efe6412aef"}, - {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:927b4aca6340301e7d8bb05278d0b6585b8633ea852b7022d604a5df920486bf"}, - {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:34adb8412e736a5d0df6d1fccdf71599dfb07a63add241a94a189b6364e997f1"}, - {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:43c60d9b332a01ee985f080f639f3e56abcfb95ec1320013c94083c3b6a2e143"}, - {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3f49edf7c5cd2987634116e1b6a0ee2438fca17f7c4ee480ff41decb76cf6158"}, - {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9784246431eaf9d651b3cc06f9c64f9a9f57299f4971c5ea778fa0b81074ef13"}, - {file = "aiohttp-3.10.0-cp311-cp311-win32.whl", hash = "sha256:bec91402df78b897a47b66b9c071f48051cea68d853d8bc1d4404896c6de41ae"}, - {file = "aiohttp-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:25a9924343bf91b0c5082cae32cfc5a1f8787ac0433966319ec07b0ed4570722"}, - {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:21dab4a704c68dc7bc2a1219a4027158e8968e2079f1444eda2ba88bc9f2895f"}, - {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:872c0dcaccebd5733d535868fe2356aa6939f5827dcea7a8b9355bb2eff6f56e"}, - {file = "aiohttp-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f381424dbce313bb5a666a215e7a9dcebbc533e9a2c467a1f0c95279d24d1fa7"}, - {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ca48e9f092a417c6669ee8d3a19d40b3c66dde1a2ae0d57e66c34812819b671"}, - {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe2f6d0466f5c59c7258e0745c20d74806a1385fbb7963e5bbe2309a11cc69b"}, - {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03799a95402a7ed62671c4465e1eae51d749d5439dbc49edb6eee52ea165c50b"}, - {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5549c71c35b5f057a4eebcc538c41299826f7813f28880722b60e41c861a57ec"}, - {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6fa7a42b78d8698491dc4ad388169de54cca551aa9900f750547372de396277"}, - {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:77bbf0a2f6fefac6c0db1792c234f577d80299a33ce7125467439097cf869198"}, - {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:34eaf5cfcc979846d73571b1a4be22cad5e029d55cdbe77cdc7545caa4dcb925"}, - {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4f1de31a585344a106db43a9c3af2e15bb82e053618ff759f1fdd31d82da38eb"}, - {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3a1ea61d96146e9b9e5597069466e2e4d9e01e09381c5dd51659f890d5e29e7"}, - {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:73c01201219eb039a828bb58dcc13112eec2fed6eea718356316cd552df26e04"}, - {file = "aiohttp-3.10.0-cp312-cp312-win32.whl", hash = "sha256:33e915971eee6d2056d15470a1214e4e0f72b6aad10225548a7ab4c4f54e2db7"}, - {file = "aiohttp-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2dc75da06c35a7b47a88ceadbf993a53d77d66423c2a78de8c6f9fb41ec35687"}, - {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f1bc4d68b83966012813598fe39b35b4e6019b69d29385cf7ec1cb08e1ff829b"}, - {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9b8b31c057a0b7bb822a159c490af05cb11b8069097f3236746a78315998afa"}, - {file = "aiohttp-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10f0d7894ddc6ff8f369e3fdc082ef1f940dc1f5b9003cd40945d24845477220"}, - {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72de8ffba4a27e3c6e83e58a379fc4fe5548f69f9b541fde895afb9be8c31658"}, - {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd36d0f0afc2bd84f007cedd2d9a449c3cf04af471853a25eb71f28bc2e1a119"}, - {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f64d503c661864866c09806ac360b95457f872d639ca61719115a9f389b2ec90"}, - {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31616121369bc823791056c632f544c6c8f8d1ceecffd8bf3f72ef621eaabf49"}, - {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f76c12abb88b7ee64b3f9ae72f0644af49ff139067b5add142836dab405d60d4"}, - {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6c99eef30a7e98144bcf44d615bc0f445b3a3730495fcc16124cb61117e1f81e"}, - {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:39e7ec718e7a1971a5d98357e3e8c0529477d45c711d32cd91999dc8d8404e1e"}, - {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1cef548ee4e84264b78879de0c754bbe223193c6313beb242ce862f82eab184"}, - {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f98f036eab11d2f90cdd01b9d1410de9d7eb520d070debeb2edadf158b758431"}, - {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc4376ff537f7d2c1e98f97f6d548e99e5d96078b0333c1d3177c11467b972de"}, - {file = "aiohttp-3.10.0-cp38-cp38-win32.whl", hash = "sha256:ebedc51ee6d39f9ea5e26e255fd56a7f4e79a56e77d960f9bae75ef4f95ed57f"}, - {file = "aiohttp-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:aad87626f31a85fd4af02ba7fd6cc424b39d4bff5c8677e612882649da572e47"}, - {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1dc95c5e2a5e60095f1bb51822e3b504e6a7430c9b44bff2120c29bb876c5202"}, - {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c83977f7b6f4f4a96fab500f5a76d355f19f42675224a3002d375b3fb309174"}, - {file = "aiohttp-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8cedc48d36652dd3ac40e5c7c139d528202393e341a5e3475acedb5e8d5c4c75"}, - {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b099fbb823efed3c1d736f343ac60d66531b13680ee9b2669e368280f41c2b8"}, - {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d583755ddb9c97a2da1322f17fc7d26792f4e035f472d675e2761c766f94c2ff"}, - {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a03a4407bdb9ae815f0d5a19df482b17df530cf7bf9c78771aa1c713c37ff1f"}, - {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb6e65f6ea7caa0188e36bebe9e72b259d3d525634758c91209afb5a6cbcba7"}, - {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6612c6ed3147a4a2d6463454b94b877566b38215665be4c729cd8b7bdce15b4"}, - {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b0c0148d2a69b82ffe650c2ce235b431d49a90bde7dd2629bcb40314957acf6"}, - {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0d85a173b4dbbaaad1900e197181ea0fafa617ca6656663f629a8a372fdc7d06"}, - {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:12c43dace645023583f3dd2337dfc3aa92c99fb943b64dcf2bc15c7aa0fb4a95"}, - {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:33acb0d9bf12cdc80ceec6f5fda83ea7990ce0321c54234d629529ca2c54e33d"}, - {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:91e0b76502205484a4d1d6f25f461fa60fe81a7987b90e57f7b941b0753c3ec8"}, - {file = "aiohttp-3.10.0-cp39-cp39-win32.whl", hash = "sha256:1ebd8ed91428ffbe8b33a5bd6f50174e11882d5b8e2fe28670406ab5ee045ede"}, - {file = "aiohttp-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:0433795c4a8bafc03deb3e662192250ba5db347c41231b0273380d2f53c9ea0b"}, - {file = "aiohttp-3.10.0.tar.gz", hash = "sha256:e8dd7da2609303e3574c95b0ec9f1fd49647ef29b94701a2862cceae76382e1d"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc36cbdedf6f259371dbbbcaae5bb0e95b879bc501668ab6306af867577eb5db"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85466b5a695c2a7db13eb2c200af552d13e6a9313d7fa92e4ffe04a2c0ea74c1"}, + {file = "aiohttp-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:71bb1d97bfe7e6726267cea169fdf5df7658831bb68ec02c9c6b9f3511e108bb"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baec1eb274f78b2de54471fc4c69ecbea4275965eab4b556ef7a7698dee18bf2"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13031e7ec1188274bad243255c328cc3019e36a5a907978501256000d57a7201"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bbc55a964b8eecb341e492ae91c3bd0848324d313e1e71a27e3d96e6ee7e8e8"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8cc0564b286b625e673a2615ede60a1704d0cbbf1b24604e28c31ed37dc62aa"}, + {file = "aiohttp-3.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f817a54059a4cfbc385a7f51696359c642088710e731e8df80d0607193ed2b73"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8542c9e5bcb2bd3115acdf5adc41cda394e7360916197805e7e32b93d821ef93"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:671efce3a4a0281060edf9a07a2f7e6230dca3a1cbc61d110eee7753d28405f7"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0974f3b5b0132edcec92c3306f858ad4356a63d26b18021d859c9927616ebf27"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:44bb159b55926b57812dca1b21c34528e800963ffe130d08b049b2d6b994ada7"}, + {file = "aiohttp-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6ae9ae382d1c9617a91647575255ad55a48bfdde34cc2185dd558ce476bf16e9"}, + {file = "aiohttp-3.10.3-cp310-cp310-win32.whl", hash = "sha256:aed12a54d4e1ee647376fa541e1b7621505001f9f939debf51397b9329fd88b9"}, + {file = "aiohttp-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b51aef59370baf7444de1572f7830f59ddbabd04e5292fa4218d02f085f8d299"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e021c4c778644e8cdc09487d65564265e6b149896a17d7c0f52e9a088cc44e1b"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:24fade6dae446b183e2410a8628b80df9b7a42205c6bfc2eff783cbeedc224a2"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bc8e9f15939dacb0e1f2d15f9c41b786051c10472c7a926f5771e99b49a5957f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5a9ec959b5381271c8ec9310aae1713b2aec29efa32e232e5ef7dcca0df0279"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a5d0ea8a6467b15d53b00c4e8ea8811e47c3cc1bdbc62b1aceb3076403d551f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9ed607dbbdd0d4d39b597e5bf6b0d40d844dfb0ac6a123ed79042ef08c1f87e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e66d5b506832e56add66af88c288c1d5ba0c38b535a1a59e436b300b57b23e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fda91ad797e4914cca0afa8b6cccd5d2b3569ccc88731be202f6adce39503189"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:61ccb867b2f2f53df6598eb2a93329b5eee0b00646ee79ea67d68844747a418e"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d881353264e6156f215b3cb778c9ac3184f5465c2ece5e6fce82e68946868ef"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b031ce229114825f49cec4434fa844ccb5225e266c3e146cb4bdd025a6da52f1"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5337cc742a03f9e3213b097abff8781f79de7190bbfaa987bd2b7ceb5bb0bdec"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab3361159fd3dcd0e48bbe804006d5cfb074b382666e6c064112056eb234f1a9"}, + {file = "aiohttp-3.10.3-cp311-cp311-win32.whl", hash = "sha256:05d66203a530209cbe40f102ebaac0b2214aba2a33c075d0bf825987c36f1f0b"}, + {file = "aiohttp-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:70b4a4984a70a2322b70e088d654528129783ac1ebbf7dd76627b3bd22db2f17"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:166de65e2e4e63357cfa8417cf952a519ac42f1654cb2d43ed76899e2319b1ee"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7084876352ba3833d5d214e02b32d794e3fd9cf21fdba99cff5acabeb90d9806"}, + {file = "aiohttp-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d98c604c93403288591d7d6d7d6cc8a63459168f8846aeffd5b3a7f3b3e5e09"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d73b073a25a0bb8bf014345374fe2d0f63681ab5da4c22f9d2025ca3e3ea54fc"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8da6b48c20ce78f5721068f383e0e113dde034e868f1b2f5ee7cb1e95f91db57"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a9dcdccf50284b1b0dc72bc57e5bbd3cc9bf019060dfa0668f63241ccc16aa7"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56fb94bae2be58f68d000d046172d8b8e6b1b571eb02ceee5535e9633dcd559c"}, + {file = "aiohttp-3.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf75716377aad2c718cdf66451c5cf02042085d84522aec1f9246d3e4b8641a6"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6c51ed03e19c885c8e91f574e4bbe7381793f56f93229731597e4a499ffef2a5"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b84857b66fa6510a163bb083c1199d1ee091a40163cfcbbd0642495fed096204"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c124b9206b1befe0491f48185fd30a0dd51b0f4e0e7e43ac1236066215aff272"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3461d9294941937f07bbbaa6227ba799bc71cc3b22c40222568dc1cca5118f68"}, + {file = "aiohttp-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:08bd0754d257b2db27d6bab208c74601df6f21bfe4cb2ec7b258ba691aac64b3"}, + {file = "aiohttp-3.10.3-cp312-cp312-win32.whl", hash = "sha256:7f9159ae530297f61a00116771e57516f89a3de6ba33f314402e41560872b50a"}, + {file = "aiohttp-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:e1128c5d3a466279cb23c4aa32a0f6cb0e7d2961e74e9e421f90e74f75ec1edf"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d1100e68e70eb72eadba2b932b185ebf0f28fd2f0dbfe576cfa9d9894ef49752"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a541414578ff47c0a9b0b8b77381ea86b0c8531ab37fc587572cb662ccd80b88"}, + {file = "aiohttp-3.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d5548444ef60bf4c7b19ace21f032fa42d822e516a6940d36579f7bfa8513f9c"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba2e838b5e6a8755ac8297275c9460e729dc1522b6454aee1766c6de6d56e5e"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48665433bb59144aaf502c324694bec25867eb6630fcd831f7a893ca473fcde4"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bac352fceed158620ce2d701ad39d4c1c76d114255a7c530e057e2b9f55bdf9f"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0f670502100cdc567188c49415bebba947eb3edaa2028e1a50dd81bd13363f"}, + {file = "aiohttp-3.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b09f38a67679e32d380fe512189ccb0b25e15afc79b23fbd5b5e48e4fc8fd9"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:cd788602e239ace64f257d1c9d39898ca65525583f0fbf0988bcba19418fe93f"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:214277dcb07ab3875f17ee1c777d446dcce75bea85846849cc9d139ab8f5081f"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:32007fdcaab789689c2ecaaf4b71f8e37bf012a15cd02c0a9db8c4d0e7989fa8"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:123e5819bfe1b87204575515cf448ab3bf1489cdeb3b61012bde716cda5853e7"}, + {file = "aiohttp-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:812121a201f0c02491a5db335a737b4113151926a79ae9ed1a9f41ea225c0e3f"}, + {file = "aiohttp-3.10.3-cp38-cp38-win32.whl", hash = "sha256:b97dc9a17a59f350c0caa453a3cb35671a2ffa3a29a6ef3568b523b9113d84e5"}, + {file = "aiohttp-3.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:3731a73ddc26969d65f90471c635abd4e1546a25299b687e654ea6d2fc052394"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38d91b98b4320ffe66efa56cb0f614a05af53b675ce1b8607cdb2ac826a8d58e"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9743fa34a10a36ddd448bba8a3adc2a66a1c575c3c2940301bacd6cc896c6bf1"}, + {file = "aiohttp-3.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7c126f532caf238031c19d169cfae3c6a59129452c990a6e84d6e7b198a001dc"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:926e68438f05703e500b06fe7148ef3013dd6f276de65c68558fa9974eeb59ad"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:434b3ab75833accd0b931d11874e206e816f6e6626fd69f643d6a8269cd9166a"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d35235a44ec38109b811c3600d15d8383297a8fab8e3dec6147477ec8636712a"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59c489661edbd863edb30a8bd69ecb044bd381d1818022bc698ba1b6f80e5dd1"}, + {file = "aiohttp-3.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50544fe498c81cb98912afabfc4e4d9d85e89f86238348e3712f7ca6a2f01dab"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09bc79275737d4dc066e0ae2951866bb36d9c6b460cb7564f111cc0427f14844"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:af4dbec58e37f5afff4f91cdf235e8e4b0bd0127a2a4fd1040e2cad3369d2f06"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b22cae3c9dd55a6b4c48c63081d31c00fc11fa9db1a20c8a50ee38c1a29539d2"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ba562736d3fbfe9241dad46c1a8994478d4a0e50796d80e29d50cabe8fbfcc3f"}, + {file = "aiohttp-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f25d6c4e82d7489be84f2b1c8212fafc021b3731abdb61a563c90e37cced3a21"}, + {file = "aiohttp-3.10.3-cp39-cp39-win32.whl", hash = "sha256:b69d832e5f5fa15b1b6b2c8eb6a9fd2c0ec1fd7729cb4322ed27771afc9fc2ac"}, + {file = "aiohttp-3.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:673bb6e3249dc8825df1105f6ef74e2eab779b7ff78e96c15cadb78b04a83752"}, + {file = "aiohttp-3.10.3.tar.gz", hash = "sha256:21650e7032cc2d31fc23d353d7123e771354f2a3d5b05a5647fc30fea214e696"}, ] [package.dependencies] @@ -235,20 +235,20 @@ files = [ [[package]] name = "astrapy" -version = "1.4.0" +version = "1.4.1" description = "AstraPy is a Pythonic SDK for DataStax Astra and its Data API" optional = true python-versions = "<4.0.0,>=3.8.0" files = [ - {file = "astrapy-1.4.0-py3-none-any.whl", hash = "sha256:6decf0619daf3fe1daca61a18b897fe51d8a64d52dd4a9d1261aa8dd31c4667e"}, - {file = "astrapy-1.4.0.tar.gz", hash = "sha256:336292bc43bacb356877639e456a056165f3240a0caf861630daa73587819db8"}, + {file = "astrapy-1.4.1-py3-none-any.whl", hash = "sha256:f2f6ca3a19cfab9422f306b3941401079fb940e286f3d17c776b71ff76eb9f73"}, + {file = "astrapy-1.4.1.tar.gz", hash = "sha256:ea4ed0ec44f9d7281d034c9bd829b0db844438424d492c9c27136456d1a82719"}, ] [package.dependencies] -bson = ">=0.5.10,<0.6.0" cassio = ">=0.1.4,<0.2.0" deprecation = ">=2.1.0,<2.2.0" httpx = {version = ">=0.25.2,<1", extras = ["http2"]} +pymongo = ">=3" toml = ">=0.10.2,<0.11.0" uuid6 = ">=2024.1.12,<2024.2.0" @@ -284,29 +284,18 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "babel" -version = "2.15.0" +version = "2.16.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "backports-strenum" -version = "1.3.1" -description = "Base class for creating enumerated constants that are also subclasses of str" -optional = false -python-versions = ">=3.8.6,<3.11" -files = [ - {file = "backports_strenum-1.3.1-py3-none-any.whl", hash = "sha256:cdcfe36dc897e2615dc793b7d3097f54d359918fc448754a517e6f23044ccf83"}, - {file = "backports_strenum-1.3.1.tar.gz", hash = "sha256:77c52407342898497714f0596e86188bb7084f89063226f4ba66863482f42414"}, -] - [[package]] name = "backports-tarfile" version = "1.2.0" @@ -345,17 +334,17 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.34.151" +version = "1.34.161" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.151-py3-none-any.whl", hash = "sha256:35bc76faacf1667d3fbb66c1966acf2230ef26206557efc26d9d9d79337bef43"}, - {file = "boto3-1.34.151.tar.gz", hash = "sha256:30498a76b6f651ee2af7ae8edc1704379279ab8b91f1a8dd1f4ddf51259b0bc2"}, + {file = "boto3-1.34.161-py3-none-any.whl", hash = "sha256:4ef285334a0edc3047e27a04caf00f7742e32c0f03a361101e768014ac5709dd"}, + {file = "boto3-1.34.161.tar.gz", hash = "sha256:a872d8fdb3203c1eb0b12fa9e9d879e6f7fd02983a485f02189e6d5914ccd834"}, ] [package.dependencies] -botocore = ">=1.34.151,<1.35.0" +botocore = ">=1.34.161,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -364,13 +353,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.34.151" -description = "Type annotations for boto3 1.34.151 generated with mypy-boto3-builder 7.25.0" +version = "1.34.161" +description = "Type annotations for boto3 1.34.161 generated with mypy-boto3-builder 7.26.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3_stubs-1.34.151-py3-none-any.whl", hash = "sha256:7c74775d5bca4693c9695526b95c80a572d6e1bf8059249698abff9596268671"}, - {file = "boto3_stubs-1.34.151.tar.gz", hash = "sha256:8422368138fb74afb7c11965677726000c4d24b7b3b872d414f5c706372bf94f"}, + {file = "boto3_stubs-1.34.161-py3-none-any.whl", hash = "sha256:aff48426ed2dc03be038a1b8d0864f8ff1d6d7e0e024f9bd69ec8d0c78b4cf4c"}, + {file = "boto3_stubs-1.34.161.tar.gz", hash = "sha256:58291c105030ab589cf30c02dfb48df1e23cbabdc6e9e0fc3446982a83280edc"}, ] [package.dependencies] @@ -388,7 +377,7 @@ accessanalyzer = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)"] account = ["mypy-boto3-account (>=1.34.0,<1.35.0)"] acm = ["mypy-boto3-acm (>=1.34.0,<1.35.0)"] acm-pca = ["mypy-boto3-acm-pca (>=1.34.0,<1.35.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-application-signals (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-apptest (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-artifact (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chatbot (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codeconnections (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-deadline (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-mailmanager (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-scep (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qapps (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53profiles (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-taxsettings (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-application-signals (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-apptest (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-artifact (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chatbot (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codeconnections (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-deadline (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-mailmanager (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-scep (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qapps (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53profiles (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-quicksetup (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-taxsettings (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] amp = ["mypy-boto3-amp (>=1.34.0,<1.35.0)"] amplify = ["mypy-boto3-amplify (>=1.34.0,<1.35.0)"] amplifybackend = ["mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)"] @@ -426,7 +415,7 @@ bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)"] bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)"] bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.34.0,<1.35.0)"] -boto3 = ["boto3 (==1.34.151)", "botocore (==1.34.151)"] +boto3 = ["boto3 (==1.34.161)", "botocore (==1.34.161)"] braket = ["mypy-boto3-braket (>=1.34.0,<1.35.0)"] budgets = ["mypy-boto3-budgets (>=1.34.0,<1.35.0)"] ce = ["mypy-boto3-ce (>=1.34.0,<1.35.0)"] @@ -734,6 +723,7 @@ sqs = ["mypy-boto3-sqs (>=1.34.0,<1.35.0)"] ssm = ["mypy-boto3-ssm (>=1.34.0,<1.35.0)"] ssm-contacts = ["mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)"] ssm-incidents = ["mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)"] +ssm-quicksetup = ["mypy-boto3-ssm-quicksetup (>=1.34.0,<1.35.0)"] ssm-sap = ["mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)"] sso = ["mypy-boto3-sso (>=1.34.0,<1.35.0)"] sso-admin = ["mypy-boto3-sso-admin (>=1.34.0,<1.35.0)"] @@ -775,13 +765,13 @@ xray = ["mypy-boto3-xray (>=1.34.0,<1.35.0)"] [[package]] name = "botocore" -version = "1.34.151" +version = "1.34.161" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.151-py3-none-any.whl", hash = "sha256:9018680d7d4a8060c26d127ceec5ab5b270879f423ea39b863d8a46f3e34c404"}, - {file = "botocore-1.34.151.tar.gz", hash = "sha256:0d0968e427a94378f295b49d59170dad539938487ec948de3d030f06092ec6dc"}, + {file = "botocore-1.34.161-py3-none-any.whl", hash = "sha256:6c606d2da6f62fde06880aff1190566af208875c29938b6b68741e607817975a"}, + {file = "botocore-1.34.161.tar.gz", hash = "sha256:16381bfb786142099abf170ce734b95a402a3a7f8e4016358712ac333c5568b2"}, ] [package.dependencies] @@ -793,17 +783,17 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.20.11)"] +crt = ["awscrt (==0.21.2)"] [[package]] name = "botocore-stubs" -version = "1.34.151" +version = "1.34.161" description = "Type annotations and code completion for botocore" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "botocore_stubs-1.34.151-py3-none-any.whl", hash = "sha256:89a50f631d74cd7ddd5ab02cf0d0c718d2fc36c1a7e54b84bd4be738d5a239da"}, - {file = "botocore_stubs-1.34.151.tar.gz", hash = "sha256:675f21efef0d8c533701e7449f765fd120b627e80a8ced41bafc43c34e021be5"}, + {file = "botocore_stubs-1.34.161-py3-none-any.whl", hash = "sha256:fff186b749b60814e01abbeca447d7c2d38d363c726bc23ee2f52da2dbcda868"}, + {file = "botocore_stubs-1.34.161.tar.gz", hash = "sha256:59d9493c9724dff1a76004dc3ec1eca9290ccb46ddc057acf3ac44071d02d3cb"}, ] [package.dependencies] @@ -812,20 +802,6 @@ types-awscrt = "*" [package.extras] botocore = ["botocore"] -[[package]] -name = "bson" -version = "0.5.10" -description = "BSON codec for Python" -optional = true -python-versions = "*" -files = [ - {file = "bson-0.5.10.tar.gz", hash = "sha256:d6511b2ab051139a9123c184de1a04227262173ad593429d21e443d6462d6590"}, -] - -[package.dependencies] -python-dateutil = ">=2.4.0" -six = ">=1.9.0" - [[package]] name = "cachetools" version = "5.4.0" @@ -913,63 +889,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -1101,22 +1092,23 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cohere" -version = "5.6.2" +version = "5.8.1" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-5.6.2-py3-none-any.whl", hash = "sha256:cfecf1343bcaa4091266c5a231fbcb3ccbd80cad05ea093ef80024a117aa3a2f"}, - {file = "cohere-5.6.2.tar.gz", hash = "sha256:6bb901afdfb02f62ad8ed2d82f12d8ea87a6869710f5f880cb89190c4e994805"}, + {file = "cohere-5.8.1-py3-none-any.whl", hash = "sha256:92362c651dfbfef8c5d34e95de394578d7197ed7875c6fcbf101e84b60db7fbd"}, + {file = "cohere-5.8.1.tar.gz", hash = "sha256:4c0c4468f15f9ad7fb7af15cc9f7305cd6df51243d69e203682be87e9efa5071"}, ] [package.dependencies] boto3 = ">=1.34.0,<2.0.0" fastavro = ">=1.9.4,<2.0.0" httpx = ">=0.21.2" -httpx-sse = ">=0.4.0,<0.5.0" +httpx-sse = "0.4.0" parameterized = ">=0.9.0,<0.10.0" pydantic = ">=1.9.2" +pydantic-core = ">=2.18.2,<3.0.0" requests = ">=2.0.0,<3.0.0" tokenizers = ">=0.15,<1" types-requests = ">=2.0.0,<3.0.0" @@ -1154,63 +1146,83 @@ dev = ["black", "mypy", "pytest", "pytest-cov"] [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, - {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, - {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, - {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, - {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, - {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, - {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, - {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, - {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, - {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -1433,13 +1445,13 @@ files = [ [[package]] name = "duckduckgo-search" -version = "6.2.5" +version = "6.2.7" description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." optional = true python-versions = ">=3.8" files = [ - {file = "duckduckgo_search-6.2.5-py3-none-any.whl", hash = "sha256:a2ae433f812899adf1e4922d3aa306489039ffdbd83b82da3e828625757877bd"}, - {file = "duckduckgo_search-6.2.5.tar.gz", hash = "sha256:177c7993cdd136698884605883984feee39939b2c2d0ac9037fd5bb801f72c3e"}, + {file = "duckduckgo_search-6.2.7-py3-none-any.whl", hash = "sha256:cf3027786aea64e21fbd822b804a17e5d894e989c9e8e724be37031910312932"}, + {file = "duckduckgo_search-6.2.7.tar.gz", hash = "sha256:dd8ed40daf5a6d1f992d0155e586a9355b97d9e0f4d909bae23e3d00266148c7"}, ] [package.dependencies] @@ -1452,13 +1464,13 @@ lxml = ["lxml (>=5.2.2)"] [[package]] name = "elevenlabs" -version = "1.6.1" +version = "1.7.0" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.6.1-py3-none-any.whl", hash = "sha256:1017f3c85b31995fab0ca02958b980bbc09590f0a29bf76db4c043ac93850d5e"}, - {file = "elevenlabs-1.6.1.tar.gz", hash = "sha256:59128170ee710bb6248de34e6a48d707e8044dc48a0229774efc29faae4a86d3"}, + {file = "elevenlabs-1.7.0-py3-none-any.whl", hash = "sha256:fbdde75ba0a9d904427f7c14297dd6a2c4f64ae1d34ea3a08c022cdac5be6688"}, + {file = "elevenlabs-1.7.0.tar.gz", hash = "sha256:42ca044778d7f0bfd23da82c9a32d539877118e6ba2e4f89343b6f41bbc3516a"}, ] [package.dependencies] @@ -1801,13 +1813,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.139.0" +version = "2.141.0" description = "Google API Client Library for Python" optional = true python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.139.0-py2.py3-none-any.whl", hash = "sha256:1850a92505d91a82e2ca1635ab2b8dff179f4b67082c2651e1db332e8039840c"}, - {file = "google_api_python_client-2.139.0.tar.gz", hash = "sha256:ed4bc3abe2c060a87412465b4e8254620bbbc548eefc5388e2c5ff912d36a68b"}, + {file = "google_api_python_client-2.141.0-py2.py3-none-any.whl", hash = "sha256:43c05322b91791204465291b3852718fae38d4f84b411d8be847c4f86882652a"}, + {file = "google_api_python_client-2.141.0.tar.gz", hash = "sha256:0f225b1f45d5a6f8c2a400f48729f5d6da9a81138e81e0478d61fdd8edf6563a"}, ] [package.dependencies] @@ -1819,13 +1831,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.32.0" +version = "2.33.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, - {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, + {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, + {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, ] [package.dependencies] @@ -1968,158 +1980,151 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.48.0" +version = "0.49.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"}, - {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"}, + {file = "griffe-0.49.0-py3-none-any.whl", hash = "sha256:c0d505f2a444ac342b22f4647d6444c8db64964b6a379c14f401fc467c0741a3"}, + {file = "griffe-0.49.0.tar.gz", hash = "sha256:a7e1235c27d8139e0fd24a5258deef6061bc876a9fda8117a5cf7b53ee940a91"}, ] [package.dependencies] -backports-strenum = {version = ">=1.3", markers = "python_version < \"3.11\""} colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.65.1" +version = "1.65.4" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.8" files = [ - {file = "grpcio-1.65.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062"}, - {file = "grpcio-1.65.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8"}, - {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719"}, - {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c"}, - {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77"}, - {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857"}, - {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364"}, - {file = "grpcio-1.65.1-cp310-cp310-win32.whl", hash = "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875"}, - {file = "grpcio-1.65.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad"}, - {file = "grpcio-1.65.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037"}, - {file = "grpcio-1.65.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5"}, - {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719"}, - {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462"}, - {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a"}, - {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8"}, - {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2"}, - {file = "grpcio-1.65.1-cp311-cp311-win32.whl", hash = "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8"}, - {file = "grpcio-1.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2"}, - {file = "grpcio-1.65.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f"}, - {file = "grpcio-1.65.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119"}, - {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9"}, - {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11"}, - {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90"}, - {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d"}, - {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff"}, - {file = "grpcio-1.65.1-cp312-cp312-win32.whl", hash = "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177"}, - {file = "grpcio-1.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59"}, - {file = "grpcio-1.65.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83"}, - {file = "grpcio-1.65.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0"}, - {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba"}, - {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2"}, - {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3"}, - {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9"}, - {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f"}, - {file = "grpcio-1.65.1-cp38-cp38-win32.whl", hash = "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0"}, - {file = "grpcio-1.65.1-cp38-cp38-win_amd64.whl", hash = "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153"}, - {file = "grpcio-1.65.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3"}, - {file = "grpcio-1.65.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df"}, - {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3"}, - {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8"}, - {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57"}, - {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68"}, - {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e"}, - {file = "grpcio-1.65.1-cp39-cp39-win32.whl", hash = "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57"}, - {file = "grpcio-1.65.1-cp39-cp39-win_amd64.whl", hash = "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c"}, - {file = "grpcio-1.65.1.tar.gz", hash = "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b"}, + {file = "grpcio-1.65.4-cp310-cp310-linux_armv7l.whl", hash = "sha256:0e85c8766cf7f004ab01aff6a0393935a30d84388fa3c58d77849fcf27f3e98c"}, + {file = "grpcio-1.65.4-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e4a795c02405c7dfa8affd98c14d980f4acea16ea3b539e7404c645329460e5a"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d7b984a8dd975d949c2042b9b5ebcf297d6d5af57dcd47f946849ee15d3c2fb8"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644a783ce604a7d7c91412bd51cf9418b942cf71896344b6dc8d55713c71ce82"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5764237d751d3031a36fafd57eb7d36fd2c10c658d2b4057c516ccf114849a3e"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee40d058cf20e1dd4cacec9c39e9bce13fedd38ce32f9ba00f639464fcb757de"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4482a44ce7cf577a1f8082e807a5b909236bce35b3e3897f839f2fbd9ae6982d"}, + {file = "grpcio-1.65.4-cp310-cp310-win32.whl", hash = "sha256:66bb051881c84aa82e4f22d8ebc9d1704b2e35d7867757f0740c6ef7b902f9b1"}, + {file = "grpcio-1.65.4-cp310-cp310-win_amd64.whl", hash = "sha256:870370524eff3144304da4d1bbe901d39bdd24f858ce849b7197e530c8c8f2ec"}, + {file = "grpcio-1.65.4-cp311-cp311-linux_armv7l.whl", hash = "sha256:85e9c69378af02e483bc626fc19a218451b24a402bdf44c7531e4c9253fb49ef"}, + {file = "grpcio-1.65.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2bd672e005afab8bf0d6aad5ad659e72a06dd713020554182a66d7c0c8f47e18"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:abccc5d73f5988e8f512eb29341ed9ced923b586bb72e785f265131c160231d8"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:886b45b29f3793b0c2576201947258782d7e54a218fe15d4a0468d9a6e00ce17"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be952436571dacc93ccc7796db06b7daf37b3b56bb97e3420e6503dccfe2f1b4"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8dc9ddc4603ec43f6238a5c95400c9a901b6d079feb824e890623da7194ff11e"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ade1256c98cba5a333ef54636095f2c09e6882c35f76acb04412f3b1aa3c29a5"}, + {file = "grpcio-1.65.4-cp311-cp311-win32.whl", hash = "sha256:280e93356fba6058cbbfc6f91a18e958062ef1bdaf5b1caf46c615ba1ae71b5b"}, + {file = "grpcio-1.65.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2b819f9ee27ed4e3e737a4f3920e337e00bc53f9e254377dd26fc7027c4d558"}, + {file = "grpcio-1.65.4-cp312-cp312-linux_armv7l.whl", hash = "sha256:926a0750a5e6fb002542e80f7fa6cab8b1a2ce5513a1c24641da33e088ca4c56"}, + {file = "grpcio-1.65.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a1d4c84d9e657f72bfbab8bedf31bdfc6bfc4a1efb10b8f2d28241efabfaaf2"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:17de4fda50967679677712eec0a5c13e8904b76ec90ac845d83386b65da0ae1e"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dee50c1b69754a4228e933696408ea87f7e896e8d9797a3ed2aeed8dbd04b74"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c34fc7562bdd169b77966068434a93040bfca990e235f7a67cdf26e1bd5c63"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:24a2246e80a059b9eb981e4c2a6d8111b1b5e03a44421adbf2736cc1d4988a8a"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18c10f0d054d2dce34dd15855fcca7cc44ec3b811139437543226776730c0f28"}, + {file = "grpcio-1.65.4-cp312-cp312-win32.whl", hash = "sha256:d72962788b6c22ddbcdb70b10c11fbb37d60ae598c51eb47ec019db66ccfdff0"}, + {file = "grpcio-1.65.4-cp312-cp312-win_amd64.whl", hash = "sha256:7656376821fed8c89e68206a522522317787a3d9ed66fb5110b1dff736a5e416"}, + {file = "grpcio-1.65.4-cp38-cp38-linux_armv7l.whl", hash = "sha256:4934077b33aa6fe0b451de8b71dabde96bf2d9b4cb2b3187be86e5adebcba021"}, + {file = "grpcio-1.65.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0cef8c919a3359847c357cb4314e50ed1f0cca070f828ee8f878d362fd744d52"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a925446e6aa12ca37114840d8550f308e29026cdc423a73da3043fd1603a6385"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf53e6247f1e2af93657e62e240e4f12e11ee0b9cef4ddcb37eab03d501ca864"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb34278e4ceb224c89704cd23db0d902e5e3c1c9687ec9d7c5bb4c150f86816"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e6cbdd107e56bde55c565da5fd16f08e1b4e9b0674851d7749e7f32d8645f524"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:626319a156b1f19513156a3b0dbfe977f5f93db63ca673a0703238ebd40670d7"}, + {file = "grpcio-1.65.4-cp38-cp38-win32.whl", hash = "sha256:3d1bbf7e1dd1096378bd83c83f554d3b93819b91161deaf63e03b7022a85224a"}, + {file = "grpcio-1.65.4-cp38-cp38-win_amd64.whl", hash = "sha256:a99e6dffefd3027b438116f33ed1261c8d360f0dd4f943cb44541a2782eba72f"}, + {file = "grpcio-1.65.4-cp39-cp39-linux_armv7l.whl", hash = "sha256:874acd010e60a2ec1e30d5e505b0651ab12eb968157cd244f852b27c6dbed733"}, + {file = "grpcio-1.65.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b07f36faf01fca5427d4aa23645e2d492157d56c91fab7e06fe5697d7e171ad4"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b81711bf4ec08a3710b534e8054c7dcf90f2edc22bebe11c1775a23f145595fe"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88fcabc332a4aef8bcefadc34a02e9ab9407ab975d2c7d981a8e12c1aed92aa1"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ba3e63108a8749994f02c7c0e156afb39ba5bdf755337de8e75eb685be244b"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8eb485801957a486bf5de15f2c792d9f9c897a86f2f18db8f3f6795a094b4bb2"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075f3903bc1749ace93f2b0664f72964ee5f2da5c15d4b47e0ab68e4f442c257"}, + {file = "grpcio-1.65.4-cp39-cp39-win32.whl", hash = "sha256:0a0720299bdb2cc7306737295d56e41ce8827d5669d4a3cd870af832e3b17c4d"}, + {file = "grpcio-1.65.4-cp39-cp39-win_amd64.whl", hash = "sha256:a146bc40fa78769f22e1e9ff4f110ef36ad271b79707577bf2a31e3e931141b9"}, + {file = "grpcio-1.65.4.tar.gz", hash = "sha256:2a4f476209acffec056360d3e647ae0e14ae13dcf3dfb130c227ae1c594cbe39"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.65.1)"] +protobuf = ["grpcio-tools (>=1.65.4)"] [[package]] name = "grpcio-status" -version = "1.62.2" +version = "1.62.3" description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, - {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, + {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, + {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.2" +grpcio = ">=1.62.3" protobuf = ">=4.21.6" [[package]] name = "grpcio-tools" -version = "1.62.2" +version = "1.62.3" description = "Protobuf code generator for gRPC" optional = true python-versions = ">=3.7" files = [ - {file = "grpcio-tools-1.62.2.tar.gz", hash = "sha256:5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:1679b4903aed2dc5bd8cb22a452225b05dc8470a076f14fd703581efc0740cdb"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:9d41e0e47dd075c075bb8f103422968a65dd0d8dc8613288f573ae91eb1053ba"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:987e774f74296842bbffd55ea8826370f70c499e5b5f71a8cf3103838b6ee9c3"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd4eeea4b25bcb6903b82930d579027d034ba944393c4751cdefd9c49e6989"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6746bc823958499a3cf8963cc1de00072962fb5e629f26d658882d3f4c35095"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2ed775e844566ce9ce089be9a81a8b928623b8ee5820f5e4d58c1a9d33dfc5ae"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdc5dd3f57b5368d5d661d5d3703bcaa38bceca59d25955dff66244dbc987271"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-win32.whl", hash = "sha256:3a8d6f07e64c0c7756f4e0c4781d9d5a2b9cc9cbd28f7032a6fb8d4f847d0445"}, - {file = "grpcio_tools-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:e33b59fb3efdddeb97ded988a871710033e8638534c826567738d3edce528752"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:472505d030135d73afe4143b0873efe0dcb385bd6d847553b4f3afe07679af00"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec674b4440ef4311ac1245a709e87b36aca493ddc6850eebe0b278d1f2b6e7d1"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:184b4174d4bd82089d706e8223e46c42390a6ebac191073b9772abc77308f9fa"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c195d74fe98541178ece7a50dad2197d43991e0f77372b9a88da438be2486f12"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d97c62e61bfe9e6cff0410fe144ac8cca2fc979ad0be46b7edf026339d161"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb8453ae83a1db2452b7fe0f4b78e4a8dd32be0f2b2b73591ae620d4d784d3d"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f989e5cebead3ae92c6abf6bf7b19949e1563a776aea896ac5933f143f0c45d"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-win32.whl", hash = "sha256:c48fabe40b9170f4e3d7dd2c252e4f1ff395dc24e49ac15fc724b1b6f11724da"}, - {file = "grpcio_tools-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c616d0ad872e3780693fce6a3ac8ef00fc0963e6d7815ce9dcfae68ba0fc287"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:10cc3321704ecd17c93cf68c99c35467a8a97ffaaed53207e9b2da6ae0308ee1"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:9be84ff6d47fd61462be7523b49d7ba01adf67ce4e1447eae37721ab32464dd8"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d82f681c9a9d933a9d8068e8e382977768e7779ddb8870fa0cf918d8250d1532"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04c607029ae3660fb1624ed273811ffe09d57d84287d37e63b5b802a35897329"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72b61332f1b439c14cbd3815174a8f1d35067a02047c32decd406b3a09bb9890"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8214820990d01b52845f9fbcb92d2b7384a0c321b303e3ac614c219dc7d1d3af"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:462e0ab8dd7c7b70bfd6e3195eebc177549ede5cf3189814850c76f9a340d7ce"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-win32.whl", hash = "sha256:fa107460c842e4c1a6266150881694fefd4f33baa544ea9489601810c2210ef8"}, - {file = "grpcio_tools-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:759c60f24c33a181bbbc1232a6752f9b49fbb1583312a4917e2b389fea0fb0f2"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:45db5da2bcfa88f2b86b57ef35daaae85c60bd6754a051d35d9449c959925b57"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ab84bae88597133f6ea7a2bdc57b2fda98a266fe8d8d4763652cbefd20e73ad7"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7a49bccae1c7d154b78e991885c3111c9ad8c8fa98e91233de425718f47c6139"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e439476b29d6dac363b321781a113794397afceeb97dad85349db5f1cb5e9a"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea369c4d1567d1acdf69c8ea74144f4ccad9e545df7f9a4fc64c94fa7684ba3"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f955702dc4b530696375251319d05223b729ed24e8673c2129f7a75d2caefbb"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3708a747aa4b6b505727282ca887041174e146ae030ebcadaf4c1d346858df62"}, - {file = "grpcio_tools-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce149ea55eadb486a7fb75a20f63ef3ac065ee6a0240ed25f3549ce7954c653"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:58cbb24b3fa6ae35aa9c210fcea3a51aa5fef0cd25618eb4fd94f746d5a9b703"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:6413581e14a80e0b4532577766cf0586de4dd33766a31b3eb5374a746771c07d"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:47117c8a7e861382470d0e22d336e5a91fdc5f851d1db44fa784b9acea190d87"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f1ba79a253df9e553d20319c615fa2b429684580fa042dba618d7f6649ac7e4"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a394cf5e51ba9be412eb9f6c482b6270bd81016e033e8eb7d21b8cc28fe8b5"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3c53b221378b035ae2f1881cbc3aca42a6075a8e90e1a342c2f205eb1d1aa6a1"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c384c838b34d1b67068e51b5bbe49caa6aa3633acd158f1ab16b5da8d226bc53"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-win32.whl", hash = "sha256:19ea69e41c3565932aa28a202d1875ec56786aea46a2eab54a3b28e8a27f9517"}, - {file = "grpcio_tools-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:1d768a5c07279a4c461ebf52d0cec1c6ca85c6291c71ec2703fe3c3e7e28e8c4"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:5b07b5874187e170edfbd7aa2ca3a54ebf3b2952487653e8c0b0d83601c33035"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d58389fe8be206ddfb4fa703db1e24c956856fcb9a81da62b13577b3a8f7fda7"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7d8b4e00c3d7237b92260fc18a561cd81f1da82e8be100db1b7d816250defc66"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe08d2038f2b7c53259b5c49e0ad08c8e0ce2b548d8185993e7ef67e8592cca"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19216e1fb26dbe23d12a810517e1b3fbb8d4f98b1a3fbebeec9d93a79f092de4"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b8574469ecc4ff41d6bb95f44e0297cdb0d95bade388552a9a444db9cd7485cd"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f6f32d39283ea834a493fccf0ebe9cfddee7577bdcc27736ad4be1732a36399"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-win32.whl", hash = "sha256:76eb459bdf3fb666e01883270beee18f3f11ed44488486b61cd210b4e0e17cc1"}, - {file = "grpcio_tools-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:217c2ee6a7ce519a55958b8622e21804f6fdb774db08c322f4c9536c35fdce7c"}, -] - -[package.dependencies] -grpcio = ">=1.62.2" + {file = "grpcio-tools-1.62.3.tar.gz", hash = "sha256:7c7136015c3d62c3eef493efabaf9e3380e3e66d24ee8e94c01cb71377f57833"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f968b049c2849540751ec2100ab05e8086c24bead769ca734fdab58698408c1"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0a8c0c4724ae9c2181b7dbc9b186df46e4f62cb18dc184e46d06c0ebeccf569e"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5782883a27d3fae8c425b29a9d3dcf5f47d992848a1b76970da3b5a28d424b26"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d812daffd0c2d2794756bd45a353f89e55dc8f91eb2fc840c51b9f6be62667"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b47d0dda1bdb0a0ba7a9a6de88e5a1ed61f07fad613964879954961e36d49193"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca246dffeca0498be9b4e1ee169b62e64694b0f92e6d0be2573e65522f39eea9"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-win32.whl", hash = "sha256:6a56d344b0bab30bf342a67e33d386b0b3c4e65868ffe93c341c51e1a8853ca5"}, + {file = "grpcio_tools-1.62.3-cp310-cp310-win_amd64.whl", hash = "sha256:710fecf6a171dcbfa263a0a3e7070e0df65ba73158d4c539cec50978f11dad5d"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:703f46e0012af83a36082b5f30341113474ed0d91e36640da713355cd0ea5d23"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:7cc83023acd8bc72cf74c2edbe85b52098501d5b74d8377bfa06f3e929803492"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ff7d58a45b75df67d25f8f144936a3e44aabd91afec833ee06826bd02b7fbe7"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f2483ea232bd72d98a6dc6d7aefd97e5bc80b15cd909b9e356d6f3e326b6e43"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:962c84b4da0f3b14b3cdb10bc3837ebc5f136b67d919aea8d7bb3fd3df39528a"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8ad0473af5544f89fc5a1ece8676dd03bdf160fb3230f967e05d0f4bf89620e3"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-win32.whl", hash = "sha256:db3bc9fa39afc5e4e2767da4459df82b095ef0cab2f257707be06c44a1c2c3e5"}, + {file = "grpcio_tools-1.62.3-cp311-cp311-win_amd64.whl", hash = "sha256:e0898d412a434e768a0c7e365acabe13ff1558b767e400936e26b5b6ed1ee51f"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d102b9b21c4e1e40af9a2ab3c6d41afba6bd29c0aa50ca013bf85c99cdc44ac5"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:0a52cc9444df978438b8d2332c0ca99000521895229934a59f94f37ed896b133"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141d028bf5762d4a97f981c501da873589df3f7e02f4c1260e1921e565b376fa"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47a5c093ab256dec5714a7a345f8cc89315cb57c298b276fa244f37a0ba507f0"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f6831fdec2b853c9daa3358535c55eed3694325889aa714070528cf8f92d7d6d"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e02d7c1a02e3814c94ba0cfe43d93e872c758bd8fd5c2797f894d0c49b4a1dfc"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-win32.whl", hash = "sha256:b881fd9505a84457e9f7e99362eeedd86497b659030cf57c6f0070df6d9c2b9b"}, + {file = "grpcio_tools-1.62.3-cp312-cp312-win_amd64.whl", hash = "sha256:11c625eebefd1fd40a228fc8bae385e448c7e32a6ae134e43cf13bbc23f902b7"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ec6fbded0c61afe6f84e3c2a43e6d656791d95747d6d28b73eff1af64108c434"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:bfda6ee8990997a9df95c5606f3096dae65f09af7ca03a1e9ca28f088caca5cf"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b77f9f9cee87cd798f0fe26b7024344d1b03a7cd2d2cba7035f8433b13986325"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e02d3b96f2d0e4bab9ceaa30f37d4f75571e40c6272e95364bff3125a64d184"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1da38070738da53556a4b35ab67c1b9884a5dd48fa2f243db35dc14079ea3d0c"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ace43b26d88a58dcff16c20d23ff72b04d0a415f64d2820f4ff06b1166f50557"}, + {file = "grpcio_tools-1.62.3-cp37-cp37m-win_amd64.whl", hash = "sha256:350a80485e302daaa95d335a931f97b693e170e02d43767ab06552c708808950"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c3a1ac9d394f8e229eb28eec2e04b9a6f5433fa19c9d32f1cb6066e3c5114a1d"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:11f363570dea661dde99e04a51bd108a5807b5df32a6f8bdf4860e34e94a4dbf"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9ad9950119d8ae27634e68b7663cc8d340ae535a0f80d85a55e56a6973ab1f"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5d22b252dcef11dd1e0fbbe5bbfb9b4ae048e8880d33338215e8ccbdb03edc"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:27cd9ef5c5d68d5ed104b6dcb96fe9c66b82050e546c9e255716903c3d8f0373"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f4b1615adf67bd8bb71f3464146a6f9949972d06d21a4f5e87e73f6464d97f57"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-win32.whl", hash = "sha256:e18e15287c31baf574fcdf8251fb7f997d64e96c6ecf467906e576da0a079af6"}, + {file = "grpcio_tools-1.62.3-cp38-cp38-win_amd64.whl", hash = "sha256:6c3064610826f50bd69410c63101954676edc703e03f9e8f978a135f1aaf97c1"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:8e62cc7164b0b7c5128e637e394eb2ef3db0e61fc798e80c301de3b2379203ed"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c8ad5cce554e2fcaf8842dee5d9462583b601a3a78f8b76a153c38c963f58c10"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec279dcf3518201fc592c65002754f58a6b542798cd7f3ecd4af086422f33f29"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c989246c2aebc13253f08be32538a4039a64e12d9c18f6d662d7aee641dc8b5"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ca4f5eeadbb57cf03317d6a2857823239a63a59cc935f5bd6cf6e8b7af7a7ecc"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0cb3a3436ac119cbd37a7d3331d9bdf85dad21a6ac233a3411dff716dcbf401e"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-win32.whl", hash = "sha256:3eae6ea76d62fcac091e1f15c2dcedf1dc3f114f8df1a972a8a0745e89f4cf61"}, + {file = "grpcio_tools-1.62.3-cp39-cp39-win_amd64.whl", hash = "sha256:eec73a005443061f4759b71a056f745e3b000dc0dc125c9f20560232dfbcbd14"}, +] + +[package.dependencies] +grpcio = ">=1.62.3" protobuf = ">=4.21.6,<5.0dev" setuptools = "*" @@ -2255,13 +2260,13 @@ files = [ [[package]] name = "huggingface-hub" -version = "0.24.3" +version = "0.24.5" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.3-py3-none-any.whl", hash = "sha256:69ecce486dd6cdad69937ba76779e893c224a670a9d947636c1d5cbd049e44d8"}, - {file = "huggingface_hub-0.24.3.tar.gz", hash = "sha256:bfdc05cc9b64a0e24e8614a44222698799183268f6b68be209aa2df70cff2cde"}, + {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, + {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, ] [package.dependencies] @@ -2391,21 +2396,21 @@ testing = ["portend", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytes [[package]] name = "jaraco-functools" -version = "4.0.1" +version = "4.0.2" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.functools-4.0.1-py3-none-any.whl", hash = "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664"}, - {file = "jaraco_functools-4.0.1.tar.gz", hash = "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"}, + {file = "jaraco.functools-4.0.2-py3-none-any.whl", hash = "sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3"}, + {file = "jaraco_functools-4.0.2.tar.gz", hash = "sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5"}, ] [package.dependencies] more-itertools = "*" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["jaraco.classes", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jeepney" @@ -2443,7 +2448,7 @@ i18n = ["Babel (>=2.7)"] name = "jiter" version = "0.5.0" description = "Fast iterable JSON parser." -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, @@ -2553,13 +2558,13 @@ lxml = {version = ">=4.4.2", extras = ["html-clean"]} [[package]] name = "keyring" -version = "25.2.1" +version = "25.3.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.8" files = [ - {file = "keyring-25.2.1-py3-none-any.whl", hash = "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50"}, - {file = "keyring-25.2.1.tar.gz", hash = "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b"}, + {file = "keyring-25.3.0-py3-none-any.whl", hash = "sha256:8d963da00ccdf06e356acd9bf3b743208878751032d8599c6cc89eb51310ffae"}, + {file = "keyring-25.3.0.tar.gz", hash = "sha256:8d85a1ea5d6db8515b59e1c5d1d1678b03cf7fc8b8dcfb1651e8c4a524eb42ef"}, ] [package.dependencies] @@ -2573,158 +2578,154 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "lxml" -version = "5.2.2" +version = "5.3.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true python-versions = ">=3.6" files = [ - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, - {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, - {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, - {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, - {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, - {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, - {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, - {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, - {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, - {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, - {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, - {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, - {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, - {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, - {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, - {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, - {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, - {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, - {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, ] [package.dependencies] @@ -2735,7 +2736,7 @@ cssselect = ["cssselect (>=0.7)"] html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.10)"] +source = ["Cython (>=3.0.11)"] [[package]] name = "lxml-html-clean" @@ -3070,13 +3071,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.30" +version = "9.5.31" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.30-py3-none-any.whl", hash = "sha256:fc070689c5250a180e9b9d79d8491ef9a3a7acb240db0728728d6c31eeb131d4"}, - {file = "mkdocs_material-9.5.30.tar.gz", hash = "sha256:3fd417dd42d679e3ba08b9e2d72cd8b8af142cc4a3969676ad6b00993dd182ec"}, + {file = "mkdocs_material-9.5.31-py3-none-any.whl", hash = "sha256:1b1f49066fdb3824c1e96d6bacd2d4375de4ac74580b47e79ff44c4d835c5fcb"}, + {file = "mkdocs_material-9.5.31.tar.gz", hash = "sha256:31833ec664772669f5856f4f276bf3fdf0e642a445e64491eda459249c3a1ca8"}, ] [package.dependencies] @@ -3181,13 +3182,13 @@ sentinels = "*" [[package]] name = "more-itertools" -version = "10.3.0" +version = "10.4.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.8" files = [ - {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, - {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, + {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, + {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, ] [[package]] @@ -3355,13 +3356,13 @@ files = [ [[package]] name = "mypy-boto3-bedrock" -version = "1.34.143" -description = "Type annotations for boto3.Bedrock 1.34.143 service generated with mypy-boto3-builder 7.25.0" +version = "1.34.152" +description = "Type annotations for boto3.Bedrock 1.34.152 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_bedrock-1.34.143-py3-none-any.whl", hash = "sha256:5cab5de36736aa8a452f9aeb02ef51548814f1b1e3dfd46d4479d7dc94755c43"}, - {file = "mypy_boto3_bedrock-1.34.143.tar.gz", hash = "sha256:df2e02860c64f8b8df90daed08d4f36817f36e830878cb69c1ec3dbc6ed35cf6"}, + {file = "mypy_boto3_bedrock-1.34.152-py3-none-any.whl", hash = "sha256:487959d0b9e753d7c62edbad5b62fb43f426724cd42b8353c98e35536b2c34d2"}, + {file = "mypy_boto3_bedrock-1.34.152.tar.gz", hash = "sha256:dd69fdec631887c68cd4066dfe2e175894ff93ee267ce9ac1fbe85790370bc3e"}, ] [package.dependencies] @@ -3369,13 +3370,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-iam" -version = "1.34.83" -description = "Type annotations for boto3.IAM 1.34.83 service generated with mypy-boto3-builder 7.23.2" +version = "1.34.152" +description = "Type annotations for boto3.IAM 1.34.152 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-boto3-iam-1.34.83.tar.gz", hash = "sha256:7261315616757ebf7509df0e9b091d5942e470eb51c4b23c662a06873a9a8eca"}, - {file = "mypy_boto3_iam-1.34.83-py3-none-any.whl", hash = "sha256:dec66a98e29ec1e36178c24b8ff57aab6b91230df97557363bbd90ec06874768"}, + {file = "mypy_boto3_iam-1.34.152-py3-none-any.whl", hash = "sha256:2c97e2b05f8e2839921d57114b6a2fc6a990b84462fba3c72a04ab1e382cb0f9"}, + {file = "mypy_boto3_iam-1.34.152.tar.gz", hash = "sha256:e2a6094b53f5043b972765d24d86fce228ae224780b3e3b2a441f5ad8967e279"}, ] [package.dependencies] @@ -3397,13 +3398,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-s3" -version = "1.34.138" -description = "Type annotations for boto3.S3 1.34.138 service generated with mypy-boto3-builder 7.25.0" +version = "1.34.160" +description = "Type annotations for boto3.S3 1.34.160 service generated with mypy-boto3-builder 7.26.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_s3-1.34.138-py3-none-any.whl", hash = "sha256:47ded5f06accc10ff9db9d55c85cca88e4f028ec360d7cfcea90377e525cba56"}, - {file = "mypy_boto3_s3-1.34.138.tar.gz", hash = "sha256:7f9770d1f0e9f6fc2ced96daf5c0792b2dbbb4a4f874f28200ff3c940d0815c3"}, + {file = "mypy_boto3_s3-1.34.160-py3-none-any.whl", hash = "sha256:ef6513c39cb97462b1f335dc112b48f612f3d9cfa474b5ce1be8941f28116082"}, + {file = "mypy_boto3_s3-1.34.160.tar.gz", hash = "sha256:19a6c09a634af79feb2f4aeb55b1bdefc41f7e8905572a035c9b5722cbc3f9f2"}, ] [package.dependencies] @@ -3411,13 +3412,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-sagemaker" -version = "1.34.145" -description = "Type annotations for boto3.SageMaker 1.34.145 service generated with mypy-boto3-builder 7.25.0" +version = "1.34.159" +description = "Type annotations for boto3.SageMaker 1.34.159 service generated with mypy-boto3-builder 7.25.3" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_sagemaker-1.34.145-py3-none-any.whl", hash = "sha256:af9be506bc8788870878f4b332cfd8c2ec27cc2e133977fb7df1df9ac00ae78d"}, - {file = "mypy_boto3_sagemaker-1.34.145.tar.gz", hash = "sha256:ee2317d9297d1c28479a7c7362421a784c1aabf61c6aad3488140db20254ba85"}, + {file = "mypy_boto3_sagemaker-1.34.159-py3-none-any.whl", hash = "sha256:3a2f0582507d9f98d16d1ac411348833e063341b87204e94e7e89ec2ffbab1ba"}, + {file = "mypy_boto3_sagemaker-1.34.159.tar.gz", hash = "sha256:3c93353239170594947b8e912a4a7461a52f0bbba01432c308173cb3bff11c8b"}, ] [package.dependencies] @@ -3661,13 +3662,13 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.82" +version = "12.6.20" description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, ] [[package]] @@ -3697,23 +3698,24 @@ httpx = ">=0.27.0,<0.28.0" [[package]] name = "openai" -version = "1.37.1" +version = "1.40.6" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.37.1-py3-none-any.whl", hash = "sha256:9a6adda0d6ae8fce02d235c5671c399cfa40d6a281b3628914c7ebf244888ee3"}, - {file = "openai-1.37.1.tar.gz", hash = "sha256:faf87206785a6b5d9e34555d6a3242482a6852bc802e453e2a891f68ee04ce55"}, + {file = "openai-1.40.6-py3-none-any.whl", hash = "sha256:b36372124a779381a420a34dd96f762baa748b6bdfaf83a6b9f2745f72ccc1c5"}, + {file = "openai-1.40.6.tar.gz", hash = "sha256:2239232bcb7f4bd4ce8e02544b5769618582411cf399816d96686d1b6c1e5c8d"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] @@ -4131,18 +4133,18 @@ type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.45.1" +version = "1.46.0" description = "A high-level API to automate web browsers" optional = true python-versions = ">=3.8" files = [ - {file = "playwright-1.45.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:360607e37c00cdf97c74317f010e106ac4671aeaec6a192431dd71a30941da9d"}, - {file = "playwright-1.45.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20adc2abf164c5e8969f9066011b152e12c210549edec78cd05bd0e9cf4135b7"}, - {file = "playwright-1.45.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:5f047cdc6accf4c7084dfc7587a2a5ef790cddc44cbb111e471293c5a91119db"}, - {file = "playwright-1.45.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:f06f6659abe0abf263e5f6661d379fbf85c112745dd31d82332ceae914f58df7"}, - {file = "playwright-1.45.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87dc3b3d17e12c68830c29b7fdf5e93315221bbb4c6090e83e967e154e2c1828"}, - {file = "playwright-1.45.1-py3-none-win32.whl", hash = "sha256:2b8f517886ef1e2151982f6e7be84be3ef7d8135bdcf8ee705b4e4e99566e866"}, - {file = "playwright-1.45.1-py3-none-win_amd64.whl", hash = "sha256:0d236cf427784e77de352ba1b7d700693c5fe455b8e5f627f6d84ad5b84b5bf5"}, + {file = "playwright-1.46.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:fa60b95c16f6ce954636229a6c9dd885485326bca52d5ba20d02c0bc731a2bbb"}, + {file = "playwright-1.46.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:73dcfc24834f4d004bc862ed0d74b4c1406793a8164734238ad035356fddc8ac"}, + {file = "playwright-1.46.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f5acfec1dbdc84d02dc696a17a344227e66c91413eab2036428dab405f195b82"}, + {file = "playwright-1.46.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:3b418509f45879f1403d070858657a39bd0b333b23d92c37355682b671726df9"}, + {file = "playwright-1.46.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23580f6a3f99757bb9779d29be37144cb9328cd9bafa178e6db5b3ab4b7faf4c"}, + {file = "playwright-1.46.0-py3-none-win32.whl", hash = "sha256:85f44dd32a23d02850f0ff4dafe51580e5199531fff5121a62489d9838707782"}, + {file = "playwright-1.46.0-py3-none-win_amd64.whl", hash = "sha256:f14a7fd7e24e954eec6ce61d787d499e41937ade811a0818e9a088aabe28ebb6"}, ] [package.dependencies] @@ -4214,23 +4216,23 @@ virtualenv = ">=20.10.0" [[package]] name = "primp" -version = "0.5.5" +version = "0.6.0" description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" optional = true python-versions = ">=3.8" files = [ - {file = "primp-0.5.5-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:cff9792e8422424528c23574b5364882d68134ee2743f4a2ae6a765746fb3028"}, - {file = "primp-0.5.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:78e13fc5d4d90d44a005dbd5dda116981828c803c86cf85816b3bb5363b045c8"}, - {file = "primp-0.5.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3714abfda79d3f5c90a5363db58994afbdbacc4b94fe14e9e5f8ab97e7b82577"}, - {file = "primp-0.5.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e54765900ee40eceb6bde43676d7e0b2e16ca1f77c0753981fe5e40afc0c2010"}, - {file = "primp-0.5.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:66c7eecc5a55225c42cfb99af857df04f994f3dd0d327c016d3af5414c1a2242"}, - {file = "primp-0.5.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df262271cc1a41f4bf80d68396e967a27d7d3d3de355a3d016f953130e7a20be"}, - {file = "primp-0.5.5-cp38-abi3-win_amd64.whl", hash = "sha256:8b424118d6bab6f9d4980d0f35d5ccc1213ab9f1042497c6ee11730f2f94a876"}, - {file = "primp-0.5.5.tar.gz", hash = "sha256:8623e8a25fd686785296b12175f4173250a08db1de9ee4063282e262b94bf3f2"}, + {file = "primp-0.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e74173d87b232d276b0a64ce21717b993e2460677cb81d3289965a80f6675abd"}, + {file = "primp-0.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:e7c2f0443afd3064efbe267e0515657173531bc89ee36ea21794edf08d931be9"}, + {file = "primp-0.6.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6e16aaab98bddea6fef90337e170fd2c232d399fb75d36dda53dd9f956cd9eeb"}, + {file = "primp-0.6.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:f36ff625e1531f051bdad68d4cd8832ba8c7f1dec7b430af8206562b37656a28"}, + {file = "primp-0.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e941355ca729eb277613f9c5ee0b0f4273d3df9440a177dccc1780ad0c752858"}, + {file = "primp-0.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:74585b3fb460dd13379b36d6c7ebc1efb24e92d21696476b93c4b97a2638f4ac"}, + {file = "primp-0.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:cf391210e28397ddbbbea7216c8fe72caa61a3a407e7faba351825ecf6ff3bec"}, + {file = "primp-0.6.0.tar.gz", hash = "sha256:25ef0a1be619a621f197ed9d9768cedde2b4f1e8cd0764b609b06aa5773b4de9"}, ] [package.extras] -dev = ["pytest (>=8.1.1)"] +dev = ["certifi", "pytest (>=8.1.1)"] [[package]] name = "proto-plus" @@ -4609,19 +4611,19 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] @@ -4795,13 +4797,13 @@ image = ["Pillow (>=8.0.0)"] [[package]] name = "pyright" -version = "1.1.373" +version = "1.1.376" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.373-py3-none-any.whl", hash = "sha256:b805413227f2c209f27b14b55da27fe5e9fb84129c9f1eb27708a5d12f6f000e"}, - {file = "pyright-1.1.373.tar.gz", hash = "sha256:f41bcfc8b9d1802b09921a394d6ae1ce19694957b628bc657629688daf8a83ff"}, + {file = "pyright-1.1.376-py3-none-any.whl", hash = "sha256:0f2473b12c15c46b3207f0eec224c3cea2bdc07cd45dd4a037687cbbca0fbeff"}, + {file = "pyright-1.1.376.tar.gz", hash = "sha256:bffd63b197cd0810395bb3245c06b01f95a85ddf6bfa0e5644ed69c841e954dd"}, ] [package.dependencies] @@ -4971,72 +4973,75 @@ files = [ [[package]] name = "pywin32-ctypes" -version = "0.2.2" +version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" files = [ - {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, - {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, + {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, + {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -5055,13 +5060,13 @@ pyyaml = "*" [[package]] name = "qdrant-client" -version = "1.10.1" +version = "1.11.0" description = "Client library for the Qdrant vector search engine" optional = true python-versions = ">=3.8" files = [ - {file = "qdrant_client-1.10.1-py3-none-any.whl", hash = "sha256:b9fb8fe50dd168d92b2998be7c6135d5a229b3a3258ad158cc69c8adf9ff1810"}, - {file = "qdrant_client-1.10.1.tar.gz", hash = "sha256:2284c8c5bb1defb0d9dbacb07d16f344972f395f4f2ed062318476a7951fd84c"}, + {file = "qdrant_client-1.11.0-py3-none-any.whl", hash = "sha256:1f574ccebb91c0bc8a620c9a41a5a010084fbc4d8c6f1cd0ab7b2eeb97336fc0"}, + {file = "qdrant_client-1.11.0.tar.gz", hash = "sha256:7c1d4d7a96cfd1ee0cde2a21c607e9df86bcca795ad8d1fd274d295ab64b8458"}, ] [package.dependencies] @@ -5077,8 +5082,8 @@ pydantic = ">=1.10.8" urllib3 = ">=1.26.14,<3" [package.extras] -fastembed = ["fastembed (==0.2.7)"] -fastembed-gpu = ["fastembed-gpu (==0.2.7)"] +fastembed = ["fastembed (==0.3.4)"] +fastembed-gpu = ["fastembed-gpu (==0.3.4)"] [[package]] name = "readme-renderer" @@ -5307,28 +5312,29 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.10" +version = "0.6.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, - {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, - {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, - {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, - {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, - {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, - {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, - {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, - {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, - {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, - {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, + {file = "ruff-0.6.0-py3-none-linux_armv6l.whl", hash = "sha256:92dcce923e5df265781e5fc76f9a1edad52201a7aafe56e586b90988d5239013"}, + {file = "ruff-0.6.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:31b90ff9dc79ed476c04e957ba7e2b95c3fceb76148f2079d0d68a908d2cfae7"}, + {file = "ruff-0.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d834a9ec9f8287dd6c3297058b3a265ed6b59233db22593379ee38ebc4b9768"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2089267692696aba342179471831a085043f218706e642564812145df8b8d0d"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa62b423ee4bbd8765f2c1dbe8f6aac203e0583993a91453dc0a449d465c84da"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7344e1a964b16b1137ea361d6516ce4ee61a0403fa94252a1913ecc1311adcae"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:487f3a35c3f33bf82be212ce15dc6278ea854e35573a3f809442f73bec8b2760"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75db409984077a793cf344d499165298a6f65449e905747ac65983b12e3e64b1"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84908bd603533ecf1db456d8fc2665d1f4335d722e84bc871d3bbd2d1116c272"}, + {file = "ruff-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f1749a0aef3ec41ed91a0e2127a6ae97d2e2853af16dbd4f3c00d7a3af726c5"}, + {file = "ruff-0.6.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:016fea751e2bcfbbd2f8cb19b97b37b3fd33148e4df45b526e87096f4e17354f"}, + {file = "ruff-0.6.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6ae80f141b53b2e36e230017e64f5ea2def18fac14334ffceaae1b780d70c4f7"}, + {file = "ruff-0.6.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eaaaf33ea4b3f63fd264d6a6f4a73fa224bbfda4b438ffea59a5340f4afa2bb5"}, + {file = "ruff-0.6.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7667ddd1fc688150a7ca4137140867584c63309695a30016880caf20831503a0"}, + {file = "ruff-0.6.0-py3-none-win32.whl", hash = "sha256:ae48365aae60d40865a412356f8c6f2c0be1c928591168111eaf07eaefa6bea3"}, + {file = "ruff-0.6.0-py3-none-win_amd64.whl", hash = "sha256:774032b507c96f0c803c8237ce7d2ef3934df208a09c40fa809c2931f957fe5e"}, + {file = "ruff-0.6.0-py3-none-win_arm64.whl", hash = "sha256:a5366e8c3ae6b2dc32821749b532606c42e609a99b0ae1472cf601da931a048c"}, + {file = "ruff-0.6.0.tar.gz", hash = "sha256:272a81830f68f9bd19d49eaf7fa01a5545c5a2e86f32a9935bb0e4bb9a1db5b8"}, ] [[package]] @@ -5350,111 +5356,121 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "safetensors" -version = "0.4.3" +version = "0.4.4" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, - {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, - {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, - {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, - {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, - {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, - {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, - {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, - {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, - {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, - {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, - {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, - {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, - {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, - {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, - {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, - {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, - {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, - {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, - {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, - {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, - {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, - {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, - {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, - {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, - {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, - {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, - {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, - {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, - {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, - {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, - {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, - {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, - {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, - {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, - {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, + {file = "safetensors-0.4.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2adb497ada13097f30e386e88c959c0fda855a5f6f98845710f5bb2c57e14f12"}, + {file = "safetensors-0.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7db7fdc2d71fd1444d85ca3f3d682ba2df7d61a637dfc6d80793f439eae264ab"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4f0eed76b430f009fbefca1a0028ddb112891b03cb556d7440d5cd68eb89a9"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57d216fab0b5c432aabf7170883d7c11671622bde8bd1436c46d633163a703f6"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d9b76322e49c056bcc819f8bdca37a2daa5a6d42c07f30927b501088db03309"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32f0d1f6243e90ee43bc6ee3e8c30ac5b09ca63f5dd35dbc985a1fc5208c451a"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d464bdc384874601a177375028012a5f177f1505279f9456fea84bbc575c7f"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63144e36209ad8e4e65384dbf2d52dd5b1866986079c00a72335402a38aacdc5"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:051d5ecd490af7245258000304b812825974d5e56f14a3ff7e1b8b2ba6dc2ed4"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51bc8429d9376224cd3cf7e8ce4f208b4c930cd10e515b6ac6a72cbc3370f0d9"}, + {file = "safetensors-0.4.4-cp310-none-win32.whl", hash = "sha256:fb7b54830cee8cf9923d969e2df87ce20e625b1af2fd194222ab902d3adcc29c"}, + {file = "safetensors-0.4.4-cp310-none-win_amd64.whl", hash = "sha256:4b3e8aa8226d6560de8c2b9d5ff8555ea482599c670610758afdc97f3e021e9c"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bbaa31f2cb49013818bde319232ccd72da62ee40f7d2aa532083eda5664e85ff"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fdcb80f4e9fbb33b58e9bf95e7dbbedff505d1bcd1c05f7c7ce883632710006"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c14c20be247b8a1aeaf3ab4476265e3ca83096bb8e09bb1a7aa806088def4f"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:949aaa1118660f992dbf0968487b3e3cfdad67f948658ab08c6b5762e90cc8b6"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c11a4ab7debc456326a2bac67f35ee0ac792bcf812c7562a4a28559a5c795e27"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cea44bba5c5601b297bc8307e4075535b95163402e4906b2e9b82788a2a6df"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9d752c97f6bbe327352f76e5b86442d776abc789249fc5e72eacb49e6916482"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03f2bb92e61b055ef6cc22883ad1ae898010a95730fa988c60a23800eb742c2c"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf3f91a9328a941acc44eceffd4e1f5f89b030985b2966637e582157173b98"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:20d218ec2b6899d29d6895419a58b6e44cc5ff8f0cc29fac8d236a8978ab702e"}, + {file = "safetensors-0.4.4-cp311-none-win32.whl", hash = "sha256:8079486118919f600c603536e2490ca37b3dbd3280e3ad6eaacfe6264605ac8a"}, + {file = "safetensors-0.4.4-cp311-none-win_amd64.whl", hash = "sha256:2f8c2eb0615e2e64ee27d478c7c13f51e5329d7972d9e15528d3e4cfc4a08f0d"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:baec5675944b4a47749c93c01c73d826ef7d42d36ba8d0dba36336fa80c76426"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f15117b96866401825f3e94543145028a2947d19974429246ce59403f49e77c6"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a13a9caea485df164c51be4eb0c87f97f790b7c3213d635eba2314d959fe929"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b54bc4ca5f9b9bba8cd4fb91c24b2446a86b5ae7f8975cf3b7a277353c3127c"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08332c22e03b651c8eb7bf5fc2de90044f3672f43403b3d9ac7e7e0f4f76495e"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb62841e839ee992c37bb75e75891c7f4904e772db3691c59daaca5b4ab960e1"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5b927acc5f2f59547270b0309a46d983edc44be64e1ca27a7fcb0474d6cd67"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a69c71b1ae98a8021a09a0b43363b0143b0ce74e7c0e83cacba691b62655fb8"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23654ad162c02a5636f0cd520a0310902c4421aab1d91a0b667722a4937cc445"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0677c109d949cf53756859160b955b2e75b0eefe952189c184d7be30ecf7e858"}, + {file = "safetensors-0.4.4-cp312-none-win32.whl", hash = "sha256:a51d0ddd4deb8871c6de15a772ef40b3dbd26a3c0451bb9e66bc76fc5a784e5b"}, + {file = "safetensors-0.4.4-cp312-none-win_amd64.whl", hash = "sha256:2d065059e75a798bc1933c293b68d04d79b586bb7f8c921e0ca1e82759d0dbb1"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9d625692578dd40a112df30c02a1adf068027566abd8e6a74893bb13d441c150"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7cabcf39c81e5b988d0adefdaea2eb9b4fd9bd62d5ed6559988c62f36bfa9a89"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8359bef65f49d51476e9811d59c015f0ddae618ee0e44144f5595278c9f8268c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a32c662e7df9226fd850f054a3ead0e4213a96a70b5ce37b2d26ba27004e013"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c329a4dcc395364a1c0d2d1574d725fe81a840783dda64c31c5a60fc7d41472c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239ee093b1db877c9f8fe2d71331a97f3b9c7c0d3ab9f09c4851004a11f44b65"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd574145d930cf9405a64f9923600879a5ce51d9f315443a5f706374841327b6"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6784eed29f9e036acb0b7769d9e78a0dc2c72c2d8ba7903005350d817e287a4"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:65a4a6072436bf0a4825b1c295d248cc17e5f4651e60ee62427a5bcaa8622a7a"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:df81e3407630de060ae8313da49509c3caa33b1a9415562284eaf3d0c7705f9f"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:e4a0f374200e8443d9746e947ebb346c40f83a3970e75a685ade0adbba5c48d9"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:181fb5f3dee78dae7fd7ec57d02e58f7936498d587c6b7c1c8049ef448c8d285"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb4ac1d8f6b65ec84ddfacd275079e89d9df7c92f95675ba96c4f790a64df6e"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76897944cd9239e8a70955679b531b9a0619f76e25476e57ed373322d9c2075d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a9e9d1a27e51a0f69e761a3d581c3af46729ec1c988fa1f839e04743026ae35"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:005ef9fc0f47cb9821c40793eb029f712e97278dae84de91cb2b4809b856685d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26987dac3752688c696c77c3576f951dbbdb8c57f0957a41fb6f933cf84c0b62"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c05270b290acd8d249739f40d272a64dd597d5a4b90f27d830e538bc2549303c"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:068d3a33711fc4d93659c825a04480ff5a3854e1d78632cdc8f37fee917e8a60"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:063421ef08ca1021feea8b46951251b90ae91f899234dd78297cbe7c1db73b99"}, + {file = "safetensors-0.4.4-cp37-none-win32.whl", hash = "sha256:d52f5d0615ea83fd853d4e1d8acf93cc2e0223ad4568ba1e1f6ca72e94ea7b9d"}, + {file = "safetensors-0.4.4-cp37-none-win_amd64.whl", hash = "sha256:88a5ac3280232d4ed8e994cbc03b46a1807ce0aa123867b40c4a41f226c61f94"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3467ab511bfe3360967d7dc53b49f272d59309e57a067dd2405b4d35e7dcf9dc"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ab4c96d922e53670ce25fbb9b63d5ea972e244de4fa1dd97b590d9fd66aacef"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87df18fce4440477c3ef1fd7ae17c704a69a74a77e705a12be135ee0651a0c2d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e5fe345b2bc7d88587149ac11def1f629d2671c4c34f5df38aed0ba59dc37f8"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f1a3e01dce3cd54060791e7e24588417c98b941baa5974700eeb0b8eb65b0a0"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6bf35e9a8998d8339fd9a05ac4ce465a4d2a2956cc0d837b67c4642ed9e947"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:166c0c52f6488b8538b2a9f3fbc6aad61a7261e170698779b371e81b45f0440d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87e9903b8668a16ef02c08ba4ebc91e57a49c481e9b5866e31d798632805014b"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9c421153aa23c323bd8483d4155b4eee82c9a50ac11cccd83539104a8279c64"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a4b8617499b2371c7353302c5116a7e0a3a12da66389ce53140e607d3bf7b3d3"}, + {file = "safetensors-0.4.4-cp38-none-win32.whl", hash = "sha256:c6280f5aeafa1731f0a3709463ab33d8e0624321593951aefada5472f0b313fd"}, + {file = "safetensors-0.4.4-cp38-none-win_amd64.whl", hash = "sha256:6ceed6247fc2d33b2a7b7d25d8a0fe645b68798856e0bc7a9800c5fd945eb80f"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5cf6c6f6193797372adf50c91d0171743d16299491c75acad8650107dffa9269"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419010156b914a3e5da4e4adf992bee050924d0fe423c4b329e523e2c14c3547"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88f6fd5a5c1302ce79993cc5feeadcc795a70f953c762544d01fb02b2db4ea33"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d468cffb82d90789696d5b4d8b6ab8843052cba58a15296691a7a3df55143cd2"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9353c2af2dd467333d4850a16edb66855e795561cd170685178f706c80d2c71e"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83c155b4a33368d9b9c2543e78f2452090fb030c52401ca608ef16fa58c98353"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9850754c434e636ce3dc586f534bb23bcbd78940c304775bee9005bf610e98f1"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:275f500b4d26f67b6ec05629a4600645231bd75e4ed42087a7c1801bff04f4b3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5c2308de665b7130cd0e40a2329278226e4cf083f7400c51ca7e19ccfb3886f3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e06a9ebc8656e030ccfe44634f2a541b4b1801cd52e390a53ad8bacbd65f8518"}, + {file = "safetensors-0.4.4-cp39-none-win32.whl", hash = "sha256:ef73df487b7c14b477016947c92708c2d929e1dee2bacdd6fff5a82ed4539537"}, + {file = "safetensors-0.4.4-cp39-none-win_amd64.whl", hash = "sha256:83d054818a8d1198d8bd8bc3ea2aac112a2c19def2bf73758321976788706398"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1d1f34c71371f0e034004a0b583284b45d233dd0b5f64a9125e16b8a01d15067"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a8043a33d58bc9b30dfac90f75712134ca34733ec3d8267b1bd682afe7194f5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db8f0c59c84792c12661f8efa85de160f80efe16b87a9d5de91b93f9e0bce3c"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfc1fc38e37630dd12d519bdec9dcd4b345aec9930bb9ce0ed04461f49e58b52"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c9d86d9b13b18aafa88303e2cd21e677f5da2a14c828d2c460fe513af2e9a5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:43251d7f29a59120a26f5a0d9583b9e112999e500afabcfdcb91606d3c5c89e3"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2c42e9b277513b81cf507e6121c7b432b3235f980cac04f39f435b7902857f91"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3daacc9a4e3f428a84dd56bf31f20b768eb0b204af891ed68e1f06db9edf546f"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218bbb9b883596715fc9997bb42470bf9f21bb832c3b34c2bf744d6fa8f2bbba"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bd5efc26b39f7fc82d4ab1d86a7f0644c8e34f3699c33f85bfa9a717a030e1b"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56ad9776b65d8743f86698a1973292c966cf3abff627efc44ed60e66cc538ddd"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:30f23e6253c5f43a809dea02dc28a9f5fa747735dc819f10c073fe1b605e97d4"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5512078d00263de6cb04e9d26c9ae17611098f52357fea856213e38dc462f81f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b96c3d9266439d17f35fc2173111d93afc1162f168e95aed122c1ca517b1f8f1"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:08d464aa72a9a13826946b4fb9094bb4b16554bbea2e069e20bd903289b6ced9"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:210160816d5a36cf41f48f38473b6f70d7bcb4b0527bedf0889cc0b4c3bb07db"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb276a53717f2bcfb6df0bcf284d8a12069002508d4c1ca715799226024ccd45"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2c28c6487f17d8db0089e8b2cdc13de859366b94cc6cdc50e1b0a4147b56551"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7915f0c60e4e6e65d90f136d85dd3b429ae9191c36b380e626064694563dbd9f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:00eea99ae422fbfa0b46065acbc58b46bfafadfcec179d4b4a32d5c45006af6c"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb1ed4fcb0b3c2f3ea2c5767434622fe5d660e5752f21ac2e8d737b1e5e480bb"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:73fc9a0a4343188bdb421783e600bfaf81d0793cd4cce6bafb3c2ed567a74cd5"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c37e6b714200824c73ca6eaf007382de76f39466a46e97558b8dc4cf643cfbf"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75698c5c5c542417ac4956acfc420f7d4a2396adca63a015fd66641ea751759"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca1a209157f242eb183e209040097118472e169f2e069bfbd40c303e24866543"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:177f2b60a058f92a3cec7a1786c9106c29eca8987ecdfb79ee88126e5f47fa31"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ee9622e84fe6e4cd4f020e5fda70d6206feff3157731df7151d457fdae18e541"}, + {file = "safetensors-0.4.4.tar.gz", hash = "sha256:5fe3e9b705250d0172ed4e100a811543108653fb2b66b9e702a088ad03772a07"}, ] [package.extras] @@ -5570,125 +5586,137 @@ files = [ [[package]] name = "setuptools" -version = "72.1.0" +version = "72.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, + {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, + {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, ] [package.extras] core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "simplejson" -version = "3.19.2" +version = "3.19.3" description = "Simple, fast, extensible JSON encoder/decoder for Python" optional = true -python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "simplejson-3.19.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672"}, - {file = "simplejson-3.19.2-cp310-cp310-win32.whl", hash = "sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7"}, - {file = "simplejson-3.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f"}, - {file = "simplejson-3.19.2-cp311-cp311-win32.whl", hash = "sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b"}, - {file = "simplejson-3.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb"}, - {file = "simplejson-3.19.2-cp312-cp312-win32.whl", hash = "sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917"}, - {file = "simplejson-3.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f"}, - {file = "simplejson-3.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc"}, - {file = "simplejson-3.19.2-cp36-cp36m-win32.whl", hash = "sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50"}, - {file = "simplejson-3.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f"}, - {file = "simplejson-3.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b"}, - {file = "simplejson-3.19.2-cp37-cp37m-win32.whl", hash = "sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693"}, - {file = "simplejson-3.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f"}, - {file = "simplejson-3.19.2-cp38-cp38-win32.whl", hash = "sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637"}, - {file = "simplejson-3.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff"}, - {file = "simplejson-3.19.2-cp39-cp39-win32.whl", hash = "sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23"}, - {file = "simplejson-3.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4"}, - {file = "simplejson-3.19.2-py3-none-any.whl", hash = "sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb"}, - {file = "simplejson-3.19.2.tar.gz", hash = "sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" +files = [ + {file = "simplejson-3.19.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f39caec26007a2d0efab6b8b1d74873ede9351962707afab622cc2285dd26ed0"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:83c87706265ae3028e8460d08b05f30254c569772e859e5ba61fe8af2c883468"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0b5ddd2c7d1d3f4d23224bc8a04bbf1430ae9a8149c05b90f8fc610f7f857a23"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ad0e0b1ce9bd3edb5cf64b5b5b76eacbfdac8c5367153aeeec8a8b1407f68342"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:93be280fc69a952c76e261036312c20b910e7fa9e234f1d89bdfe3fa34f8a023"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6d43e24b88c80f997081503f693be832fc90854f278df277dd54f8a4c847ab61"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2876027ebdd599d730d36464debe84619b0368e9a642ca6e7c601be55aed439e"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:0766ca6222b410e08e0053a0dda3606cafb3973d5d00538307f631bb59743396"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:50d8b742d74c449c4dcac570d08ce0f21f6a149d2d9cf7652dbf2ba9a1bc729a"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd011fc3c1d88b779645495fdb8189fb318a26981eebcce14109460e062f209b"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:637c4d4b81825c1f4d651e56210bd35b5604034b192b02d2d8f17f7ce8c18f42"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f56eb03bc9e432bb81adc8ecff2486d39feb371abb442964ffb44f6db23b332"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef59a53be400c1fad2c914b8d74c9d42384fed5174f9321dd021b7017fd40270"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72e8abbc86fcac83629a030888b45fed3a404d54161118be52cb491cd6975d3e"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8efb03ca77bd7725dfacc9254df00d73e6f43013cf39bd37ef1a8ed0ebb5165"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:add8850db04b98507a8b62d248a326ecc8561e6d24336d1ca5c605bbfaab4cad"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fc3dc9fb413fc34c396f52f4c87de18d0bd5023804afa8ab5cc224deeb6a9900"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4dfa420bb9225dd33b6efdabde7c6a671b51150b9b1d9c4e5cd74d3b420b3fe1"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7b5c472099b39b274dcde27f1113db8d818c9aa3ba8f78cbb8ad04a4c1ac2118"}, + {file = "simplejson-3.19.3-cp310-cp310-win32.whl", hash = "sha256:817abad79241ed4a507b3caf4d3f2be5079f39d35d4c550a061988986bffd2ec"}, + {file = "simplejson-3.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:dd5b9b1783e14803e362a558680d88939e830db2466f3fa22df5c9319f8eea94"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e88abff510dcff903a18d11c2a75f9964e768d99c8d147839913886144b2065e"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:212fce86a22188b0c7f53533b0f693ea9605c1a0f02c84c475a30616f55a744d"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23228037dc5d41c36666384062904d74409a62f52283d9858fa12f4c22cffad1"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0791f64fed7d4abad639491f8a6b1ba56d3c604eb94b50f8697359b92d983f36"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1df0aaf1cb787fdf34484ed4a1f0c545efd8811f6028623290fef1a53694e597"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:951095be8d4451a7182403354c22ec2de3e513e0cc40408b689af08d02611588"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a954b30810988feeabde843e3263bf187697e0eb5037396276db3612434049b"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c40df31a75de98db2cdfead6074d4449cd009e79f54c1ebe5e5f1f153c68ad20"}, + {file = "simplejson-3.19.3-cp311-cp311-win32.whl", hash = "sha256:7e2a098c21ad8924076a12b6c178965d88a0ad75d1de67e1afa0a66878f277a5"}, + {file = "simplejson-3.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:c9bedebdc5fdad48af8783022bae307746d54006b783007d1d3c38e10872a2c6"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:66a0399e21c2112acacfebf3d832ebe2884f823b1c7e6d1363f2944f1db31a99"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6ef9383c5e05f445be60f1735c1816163c874c0b1ede8bb4390aff2ced34f333"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42e5acf80d4d971238d4df97811286a044d720693092b20a56d5e56b7dcc5d09"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0b0efc7279d768db7c74d3d07f0b5c81280d16ae3fb14e9081dc903e8360771"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0552eb06e7234da892e1d02365cd2b7b2b1f8233aa5aabdb2981587b7cc92ea0"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf6a3b9a7d7191471b464fe38f684df10eb491ec9ea454003edb45a011ab187"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7017329ca8d4dca94ad5e59f496e5fc77630aecfc39df381ffc1d37fb6b25832"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67a20641afebf4cfbcff50061f07daad1eace6e7b31d7622b6fa2c40d43900ba"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd6a7dabcc4c32daf601bc45e01b79175dde4b52548becea4f9545b0a4428169"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:08f9b443a94e72dd02c87098c96886d35790e79e46b24e67accafbf13b73d43b"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa97278ae6614346b5ca41a45a911f37a3261b57dbe4a00602048652c862c28b"}, + {file = "simplejson-3.19.3-cp312-cp312-win32.whl", hash = "sha256:ef28c3b328d29b5e2756903aed888960bc5df39b4c2eab157ae212f70ed5bf74"}, + {file = "simplejson-3.19.3-cp312-cp312-win_amd64.whl", hash = "sha256:1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0959e6cb62e3994b5a40e31047ff97ef5c4138875fae31659bead691bed55896"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a7bfad839c624e139a4863007233a3f194e7c51551081f9789cba52e4da5167"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afab2f7f2486a866ff04d6d905e9386ca6a231379181a3838abce1f32fbdcc37"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00313681015ac498e1736b304446ee6d1c72c5b287cd196996dad84369998f7"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d936ae682d5b878af9d9eb4d8bb1fdd5e41275c8eb59ceddb0aeed857bb264a2"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c6657485393f2e9b8177c77a7634f13ebe70d5e6de150aae1677d91516ce6b"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a6a750d3c7461b1c47cfc6bba8d9e57a455e7c5f80057d2a82f738040dd1129"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ea7a4a998c87c5674a27089e022110a1a08a7753f21af3baf09efe9915c23c3c"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6300680d83a399be2b8f3b0ef7ef90b35d2a29fe6e9c21438097e0938bbc1564"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ab69f811a660c362651ae395eba8ce84f84c944cea0df5718ea0ba9d1e4e7252"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:256e09d0f94d9c3d177d9e95fd27a68c875a4baa2046633df387b86b652f5747"}, + {file = "simplejson-3.19.3-cp313-cp313-win32.whl", hash = "sha256:2c78293470313aefa9cfc5e3f75ca0635721fb016fb1121c1c5b0cb8cc74712a"}, + {file = "simplejson-3.19.3-cp313-cp313-win_amd64.whl", hash = "sha256:3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c"}, + {file = "simplejson-3.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:89b35433186e977fa86ff1fd179c1fadff39cfa3afa1648dab0b6ca53153acd9"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d43c2d7504eda566c50203cdc9dc043aff6f55f1b7dae0dcd79dfefef9159d1c"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6890ff9cf0bd2e1d487e2a8869ebd620a44684c0a9667fa5ee751d099d5d84c8"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1069143a8fb3905e1bc0696c62be7e3adf812e9f1976ac9ae15b05112ff57cc9"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb324bb903330cbb35d87cce367a12631cd5720afa06e5b9c906483970946da6"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:0a32859d45d7b85fb803bb68f6bee14526991a1190269116c33399fa0daf9bbf"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:23833ee7e791ec968b744dfee2a2d39df7152050051096caf4296506d75608d8"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:d73efb03c5b39249c82488a994f0998f9e4399e3d085209d2120503305ba77a8"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7923878b7a0142d39763ec2dbecff3053c1bedd3653585a8474666e420fe83f5"}, + {file = "simplejson-3.19.3-cp36-cp36m-win32.whl", hash = "sha256:7355c7203353c36d46c4e7b6055293b3d2be097bbc5e2874a2b8a7259f0325dd"}, + {file = "simplejson-3.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:d1b8b4d6379fe55f471914345fe6171d81a18649dacf3248abfc9c349b4442eb"}, + {file = "simplejson-3.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d36608557b4dcd7a62c29ad4cd7c5a1720bbf7dc942eff9dc42d2c542a5f042d"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7137e69c6781ecf23afab064be94a277236c9cba31aa48ff1a0ec3995c69171e"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76f8c28fe2d426182405b18ddf3001fce47835a557dc15c3d8bdea01c03361da"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff7bc1bbdaa3e487c9469128bf39408e91f5573901cb852e03af378d3582c52d"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0782cb9bf827f0c488b6aa0f2819f618308a3caf2973cfd792e45d631bec4db"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:6fea0716c593dabb4392c4996d4e902a83b2428e6da82938cf28a523a11eb277"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:8f41bb5370b34f63171e65fdb00e12be1d83675cecb23e627df26f4c88dfc021"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:37105d1d708365b91165e1a6e505bdecc88637091348cf4b6adcdcb4f5a5fb8b"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:b9198c1f1f8910a3b86b60f4fe2556d9d28d3fefe35bffe6be509a27402e694d"}, + {file = "simplejson-3.19.3-cp37-cp37m-win32.whl", hash = "sha256:bc164f32dd9691e7082ce5df24b4cf8c6c394bbf9bdeeb5d843127cd07ab8ad2"}, + {file = "simplejson-3.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1bd41f2cb1a2c57656ceff67b12d005cb255c728265e222027ad73193a04005a"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0733ecd95ae03ae718ec74aad818f5af5f3155d596f7b242acbc1621e765e5fb"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a0710d1a5e41c4f829caa1572793dd3130c8d65c2b194c24ff29c4c305c26e0"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a53a07320c5ff574d8b1a89c937ce33608832f166f39dff0581ac43dc979abd"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1773cabfba66a6337b547e45dafbd471b09487370bcab75bd28f626520410d29"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c0104b4b7d2c75ccedbf1d9d5a3bd2daa75e51053935a44ba012e2fd4c43752"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c49eeb94b8f09dc8a5843c156a22b8bde6aa1ddc65ca8ddc62dddcc001e6a2d"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dc5c1a85ff388e98ea877042daec3d157b6db0d85bac6ba5498034689793e7e"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49549e3d81ab4a58424405aa545602674d8c35c20e986b42bb8668e782a94bac"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e1a1452ad5723ff129b081e3c8aa4ba56b8734fee4223355ed7b815a7ece69bc"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:d0d5a63f1768fed7e78cf55712dee81f5a345e34d34224f3507ebf71df2b754d"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7e062767ac165df9a46963f5735aa4eee0089ec1e48b3f2ec46182754b96f55e"}, + {file = "simplejson-3.19.3-cp38-cp38-win32.whl", hash = "sha256:56134bbafe458a7b21f6fddbf889d36bec6d903718f4430768e3af822f8e27c2"}, + {file = "simplejson-3.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:bcde83a553a96dc7533736c547bddaa35414a2566ab0ecf7d3964fc4bdb84c11"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b5587feda2b65a79da985ae6d116daf6428bf7489992badc29fc96d16cd27b05"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0d2b00ecbcd1a3c5ea1abc8bb99a26508f758c1759fd01c3be482a3655a176f"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:32a3ada8f3ea41db35e6d37b86dade03760f804628ec22e4fe775b703d567426"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f455672f4738b0f47183c5896e3606cd65c9ddee3805a4d18e8c96aa3f47c84"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b737a5fefedb8333fa50b8db3dcc9b1d18fd6c598f89fa7debff8b46bf4e511"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb47ee773ce67476a960e2db4a0a906680c54f662521550828c0cc57d0099426"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eed8cd98a7b24861da9d3d937f5fbfb6657350c547528a117297fe49e3960667"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:619756f1dd634b5bdf57d9a3914300526c3b348188a765e45b8b08eabef0c94e"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dd7230d061e755d60a4d5445bae854afe33444cdb182f3815cff26ac9fb29a15"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:101a3c8392028cd704a93c7cba8926594e775ca3c91e0bee82144e34190903f1"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e557712fc79f251673aeb3fad3501d7d4da3a27eff0857af2e1d1afbbcf6685"}, + {file = "simplejson-3.19.3-cp39-cp39-win32.whl", hash = "sha256:0bc5544e3128891bf613b9f71813ee2ec9c11574806f74dd8bb84e5e95bf64a2"}, + {file = "simplejson-3.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:06662392e4913dc8846d6a71a6d5de86db5fba244831abe1dd741d62a4136764"}, + {file = "simplejson-3.19.3-py3-none-any.whl", hash = "sha256:49cc4c7b940d43bd12bf87ec63f28cbc4964fc4e12c031cc8cd01650f43eb94e"}, + {file = "simplejson-3.19.3.tar.gz", hash = "sha256:8e086896c36210ab6050f2f9f095a5f1e03c83fa0e7f296d6cba425411364680"}, ] [[package]] @@ -5804,71 +5832,71 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = true python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sqlalchemy" -version = "2.0.31" +version = "2.0.32" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, - {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, - {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, ] [package.dependencies] @@ -5912,13 +5940,13 @@ files = [ [[package]] name = "sympy" -version = "1.13.1" +version = "1.13.2" description = "Computer algebra system (CAS) in Python" optional = true python-versions = ">=3.8" files = [ - {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, - {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, ] [package.dependencies] @@ -6146,13 +6174,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.13.0" +version = "0.13.2" description = "Style preserving TOML library" optional = true python-versions = ">=3.8" files = [ - {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, - {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] @@ -6210,13 +6238,13 @@ optree = ["optree (>=0.11.0)"] [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -6254,13 +6282,13 @@ gui = ["Gooey (>=1.0.1)"] [[package]] name = "transformers" -version = "4.43.3" +version = "4.44.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.43.3-py3-none-any.whl", hash = "sha256:6552beada5d826c25ff9b79139d237ab9050c6ea96b73d7fd2f8a8ba23ee76a4"}, - {file = "transformers-4.43.3.tar.gz", hash = "sha256:820c5b192bb1bf47250802901a8f0bf581e06b8fded89179d4ef08a1e903ee1c"}, + {file = "transformers-4.44.0-py3-none-any.whl", hash = "sha256:ea0ff72def71e9f4812d9414d4803b22681b1617aa6f511bd51cfff2b44a6fca"}, + {file = "transformers-4.44.0.tar.gz", hash = "sha256:75699495e30b7635ca444d8d372e138c687ab51a875b387e33f1fb759c37f196"}, ] [package.dependencies] @@ -6285,10 +6313,10 @@ audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -6299,17 +6327,17 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] -ruff = ["ruff (==0.4.4)"] +ruff = ["ruff (==0.5.1)"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] @@ -6431,21 +6459,21 @@ files = [ [[package]] name = "typos" -version = "1.23.5" +version = "1.23.6" description = "Source Code Spelling Correction" optional = false python-versions = ">=3.7" files = [ - {file = "typos-1.23.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f605a44e94b1ddf68b9fc3988e82bbc5f795de51a9928f3d9aa43f02e64cb123"}, - {file = "typos-1.23.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:03355aca30babaedfa2ebaf8b79da0b911f015e4449b184777a9d70ee6c754ad"}, - {file = "typos-1.23.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485ffaa9a910bf01a3a6502e1668f945255f314dd7eb6cd66a26df82e0d66d8b"}, - {file = "typos-1.23.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70e3abe5af98707a4ea307d98d1b09b20664c00acb5fb78761349700d8581ee8"}, - {file = "typos-1.23.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064ece60188de95e71a5420cfc2e1fde3ea650186ddf214145befcbe7bfd0086"}, - {file = "typos-1.23.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0cfcf37df9ecce20277a360e56fe39b1e847298cb6aaafaaed10e842c815e43d"}, - {file = "typos-1.23.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6aa53d4e5cbc77fb052e806f79d485f0b468d3054754163feb65ad4893d6e2ac"}, - {file = "typos-1.23.5-py3-none-win32.whl", hash = "sha256:ea7892fb35e9dee45716ca12df68453c1d6dc3b0d42ec1d4a7859b1d2f3a252e"}, - {file = "typos-1.23.5-py3-none-win_amd64.whl", hash = "sha256:221bd0e1945fc0ade5eaf713e8dcbbd6c2331e79a68074c4b991f054fa5024f4"}, - {file = "typos-1.23.5.tar.gz", hash = "sha256:afc455cf5d90f4f350af3c73b3ccbcf22f1c4aa10308b89eb3ce263d350e4ad9"}, + {file = "typos-1.23.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9209947ab1e815bcb8cb781fc73fd6ad88eacdea7b1c15e73ca49217fa7c44e7"}, + {file = "typos-1.23.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b049bfce407d7d61c5be4955d2fae6db644dc5d56ca236224cae0c3978024a75"}, + {file = "typos-1.23.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0b17e19c5e6b4f46acf0f60d053e0c188d31c09748f487f171465623f5f3380"}, + {file = "typos-1.23.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b609d525078b222cf8e25bd8e5cd60a56a542129d7bccb4f6cc992f686410331"}, + {file = "typos-1.23.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fbf955dc4a09a95d3358f8edb10c1418e45bf07a6c9c414432320009a74dd5f"}, + {file = "typos-1.23.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c686b06039b7fd95eed661cd2093fa7f048c76cb40b6bad55827a68aa707240a"}, + {file = "typos-1.23.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fda8c8502bce101277eb0a4b4d04847fc7018e2f9cff6d2fc86b3fdec239755"}, + {file = "typos-1.23.6-py3-none-win32.whl", hash = "sha256:8edaba24813be7ef678868e8ed49c48eb70cf128afc41ae86cc2127fb32e326b"}, + {file = "typos-1.23.6-py3-none-win_amd64.whl", hash = "sha256:d47b7d0e08975adf67873a8e43dc09fc1b6ff655a4241497348808ee54442668"}, + {file = "typos-1.23.6.tar.gz", hash = "sha256:2691988d2a15cde2cdd4f2fa5fd32880765b2a68ed6ccd48d6dc693c44447bcf"}, ] [[package]] @@ -6554,43 +6582,46 @@ tenacity = ">=8.0.1" [[package]] name = "watchdog" -version = "4.0.1" +version = "4.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, - {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, - {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, - {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, - {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, - {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, - {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, - {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, - {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, - {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, - {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, - {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, - {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, - {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, + {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, + {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, + {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, + {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, ] [package.extras] @@ -6889,13 +6920,13 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, ] [package.extras] @@ -6955,4 +6986,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "107e2bcaa620a1134fb649254bc6157304754eb7f617334c544ac5db70286fdd" +content-hash = "62e3ac71e745d060bddc2c1f853068e7083cf7fc2b8fb5474baa188477507607" diff --git a/pyproject.toml b/pyproject.toml index 8ca015c41..a9992e1b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} qdrant-client = { version = "^1.10.1", optional = true } -astrapy = { version = "^1.3", optional = true } +astrapy = { version = "^1.4", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.3.0", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} @@ -225,8 +225,8 @@ pytest-clarity = "^1.0.1" optional = true [tool.poetry.group.dev.dependencies] -ruff = "^0.4.6" -pyright = "^1.1.363" +ruff = "^0.6.0" +pyright = "^1.1.376" pre-commit = "^3.7.1" boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.105"} typos = "^1.22.9" @@ -300,10 +300,12 @@ ignore = [ "ANN401", # any-type "PT011", # pytest-raises-too-broad ] -preview = true [tool.ruff.lint.pydocstyle] convention = "google" +[tool.ruff.lint.flake8-pytest-style] +fixture-parentheses = true + [tool.ruff.lint.per-file-ignores] "__init__.py" = [ "I" # isort From 714109bcf84218d06fe947598baa70fefc5fa1f6 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 15 Aug 2024 13:07:16 -0500 Subject: [PATCH 216/238] Add `JsonArtifact` (#937) Co-authored-by: Collin Dutter --- CHANGELOG.md | 1 + Makefile | 1 + docs/griptape-framework/data/artifacts.md | 4 +++ griptape/artifacts/__init__.py | 2 ++ griptape/artifacts/json_artifact.py | 21 ++++++++++++++++ tests/unit/artifacts/test_json_artifact.py | 29 ++++++++++++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 griptape/artifacts/json_artifact.py create mode 100644 tests/unit/artifacts/test_json_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ca7c663ec..6d6e9bffc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Global config, `griptape.config.config`, for setting global configuration defaults. - Unique name generation for all `RagEngine` modules. - Support for bitshift composition in `BaseTask` for adding parent/child tasks. +- `JsonArtifact` for handling de/seralization of values. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. diff --git a/Makefile b/Makefile index 73175b7c5..1db428b2c 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,7 @@ install/core: ## Install core dependencies. .PHONY: install/all install/all: ## Install all dependencies. @poetry install --with dev --with test --with docs --all-extras + @poetry run pre-commit install .PHONY: install/dev install/dev: ## Install dev dependencies. diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index 065e36123..1a33a991b 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -58,3 +58,7 @@ A [BooleanArtifact](../../reference/griptape/artifacts/boolean_artifact.md) is u A [GenericArtifact](../../reference/griptape/artifacts/generic_artifact.md) can be used as an escape hatch for passing any type of data around the framework. It is generally not recommended to use this Artifact type, but it can be used in a handful of situations where no other Artifact type fits the data being passed. See [talking to a video](../../examples/talk-to-a-video.md) for an example of using a `GenericArtifact` to pass a Gemini-specific video file. + +## Json + +A [JsonArtifact](../../reference/griptape/artifacts/json_artifact.md) is used for passing JSON-serliazable data around the framework. Anything passed to `value` will be converted using `json.dumps(json.loads(value))`. diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index e9fc6daba..f39bfea8d 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -2,6 +2,7 @@ from .error_artifact import ErrorArtifact from .info_artifact import InfoArtifact from .text_artifact import TextArtifact +from .json_artifact import JsonArtifact from .blob_artifact import BlobArtifact from .boolean_artifact import BooleanArtifact from .csv_row_artifact import CsvRowArtifact @@ -18,6 +19,7 @@ "ErrorArtifact", "InfoArtifact", "TextArtifact", + "JsonArtifact", "BlobArtifact", "BooleanArtifact", "CsvRowArtifact", diff --git a/griptape/artifacts/json_artifact.py b/griptape/artifacts/json_artifact.py new file mode 100644 index 000000000..b292879a9 --- /dev/null +++ b/griptape/artifacts/json_artifact.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +import json +from typing import Union + +from attrs import define, field + +from griptape.artifacts import BaseArtifact + +Json = Union[dict[str, "Json"], list["Json"], str, int, float, bool, None] + + +@define +class JsonArtifact(BaseArtifact): + value: Json = field(converter=lambda v: json.loads(json.dumps(v)), metadata={"serializable": True}) + + def to_text(self) -> str: + return json.dumps(self.value) + + def __add__(self, other: BaseArtifact) -> JsonArtifact: + raise NotImplementedError diff --git a/tests/unit/artifacts/test_json_artifact.py b/tests/unit/artifacts/test_json_artifact.py new file mode 100644 index 000000000..06f5d6297 --- /dev/null +++ b/tests/unit/artifacts/test_json_artifact.py @@ -0,0 +1,29 @@ +import json + +import pytest + +from griptape.artifacts import JsonArtifact, TextArtifact + + +class TestJsonArtifact: + def test_value_type_conversion(self): + assert JsonArtifact({"foo": "bar"}).value == json.loads(json.dumps({"foo": "bar"})) + assert JsonArtifact({"foo": 1}).value == json.loads(json.dumps({"foo": 1})) + assert JsonArtifact({"foo": 1.0}).value == json.loads(json.dumps({"foo": 1.0})) + assert JsonArtifact({"foo": True}).value == json.loads(json.dumps({"foo": True})) + assert JsonArtifact({"foo": None}).value == json.loads(json.dumps({"foo": None})) + assert JsonArtifact([{"foo": {"bar": "baz"}}]).value == json.loads(json.dumps([{"foo": {"bar": "baz"}}])) + assert JsonArtifact(None).value == json.loads(json.dumps(None)) + assert JsonArtifact("foo").value == json.loads(json.dumps("foo")) + + def test___add__(self): + with pytest.raises(NotImplementedError): + JsonArtifact({"foo": "bar"}) + TextArtifact("invalid json") + + def test_to_text(self): + assert JsonArtifact({"foo": "bar"}).to_text() == json.dumps({"foo": "bar"}) + assert JsonArtifact({"foo": 1}).to_text() == json.dumps({"foo": 1}) + assert JsonArtifact({"foo": 1.0}).to_text() == json.dumps({"foo": 1.0}) + assert JsonArtifact({"foo": True}).to_text() == json.dumps({"foo": True}) + assert JsonArtifact({"foo": None}).to_text() == json.dumps({"foo": None}) + assert JsonArtifact([{"foo": {"bar": "baz"}}]).to_text() == json.dumps([{"foo": {"bar": "baz"}}]) From 60037e9ec9c3e332e7d1fd8894fcfa55ce00b60d Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 15 Aug 2024 12:52:27 -0700 Subject: [PATCH 217/238] Refactor/task memory cleanup (#1055) --- CHANGELOG.md | 19 +- README.md | 77 ++++-- _typos.toml | 3 + docs/examples/multiple-agent-shared-memory.md | 4 +- docs/examples/src/multi_agent_workflow_1.py | 4 +- .../src/multiple_agent_shared_memory_1.py | 4 +- docs/examples/src/query_webpage_astra_db_1.py | 4 +- docs/griptape-framework/data/artifacts.md | 4 +- docs/griptape-framework/data/loaders.md | 4 +- .../drivers/src/embedding_drivers_10.py | 9 +- .../drivers/src/web_scraper_drivers_3.py | 5 +- .../drivers/src/web_search_drivers_2.py | 4 +- docs/griptape-framework/index.md | 109 +++++--- docs/griptape-framework/misc/src/events_3.py | 4 +- docs/griptape-framework/misc/src/events_4.py | 4 +- docs/griptape-framework/src/index_4.py | 4 +- docs/griptape-framework/structures/agents.md | 2 +- .../structures/pipelines.md | 2 +- .../structures/src/task_memory_3.py | 6 +- .../structures/src/task_memory_5.py | 4 +- .../structures/src/task_memory_6.py | 25 +- .../structures/src/task_memory_8.py | 6 +- .../structures/src/tasks_16.py | 4 +- .../structures/src/tasks_4.py | 4 +- .../structures/task-memory.md | 251 ++++++++++-------- docs/griptape-framework/structures/tasks.md | 92 ++++--- .../structures/workflows.md | 2 +- docs/griptape-framework/tools/index.md | 101 ++++--- docs/griptape-framework/tools/src/index_1.py | 8 +- .../official-tools/aws-iam-tool.md | 99 +++---- .../official-tools/aws-s3-tool.md | 73 +++-- .../official-tools/computer-tool.md | 112 +++----- .../official-tools/extraction-tool.md | 53 ++++ .../official-tools/file-manager-tool.md | 4 +- .../official-tools/prompt-summary-tool.md | 105 ++++++++ .../official-tools/query-tool.md | 85 ++++++ .../griptape-tools/official-tools/sql-tool.md | 81 +++--- .../official-tools/src/aws_s3_tool_1.py | 4 +- .../official-tools/src/computer_tool_1.py | 11 +- .../official-tools/src/extraction_tool_1.py | 28 ++ .../src/prompt_summary_tool_1.py | 8 + .../official-tools/src/query_tool_1.py | 6 + .../official-tools/src/task_memory_tool_1.py | 4 - .../official-tools/src/vector_store_tool_1.py | 4 +- .../official-tools/src/web_scraper_1.py | 6 + .../official-tools/src/web_scraper_tool_1.py | 4 +- .../official-tools/task-memory-tool.md | 7 - .../official-tools/web-scraper-tool.md | 146 ++++++---- .../extraction/csv_extraction_engine.py | 55 ++-- .../extraction/json_extraction_engine.py | 61 +++-- .../task/storage/base_artifact_storage.py | 10 +- .../task/storage/blob_artifact_storage.py | 10 +- .../task/storage/text_artifact_storage.py | 50 +--- griptape/memory/task/task_memory.py | 29 +- griptape/structures/structure.py | 41 +-- griptape/tasks/__init__.py | 4 - griptape/tasks/csv_extraction_task.py | 11 - griptape/tasks/extraction_task.py | 2 +- griptape/tasks/json_extraction_task.py | 11 - .../engines/extraction/csv/system.j2 | 7 + .../templates/engines/extraction/csv/user.j2 | 4 + .../engines/extraction/csv_extraction.j2 | 11 - .../engines/extraction/json/system.j2 | 6 + .../{json_extraction.j2 => json/user.j2} | 9 +- griptape/tools/__init__.py | 8 +- .../{task_memory => extraction}/__init__.py | 0 griptape/tools/extraction/manifest.yml | 5 + griptape/tools/extraction/requirements.txt | 0 griptape/tools/extraction/tool.py | 60 +++++ griptape/tools/prompt_summary/__init__.py | 0 griptape/tools/prompt_summary/manifest.yml | 5 + .../tools/prompt_summary/requirements.txt | 0 griptape/tools/prompt_summary/tool.py | 55 ++++ griptape/tools/query/__init__.py | 0 griptape/tools/query/manifest.yml | 5 + griptape/tools/query/requirements.txt | 0 griptape/tools/query/tool.py | 78 ++++++ griptape/tools/task_memory/manifest.yml | 5 - griptape/tools/task_memory/tool.py | 52 ---- griptape/utils/load_artifact_from_memory.py | 11 +- mkdocs.yml | 4 +- poetry.lock | 12 +- pyproject.toml | 2 +- tests/integration/tasks/test_toolkit_task.py | 4 +- ...st_griptape_cloud_event_listener_driver.py | 4 - .../extraction/test_csv_extraction_engine.py | 4 +- .../extraction/test_json_extraction_engine.py | 12 +- .../storage/test_blob_artifact_storage.py | 10 - .../storage/test_text_artifact_storage.py | 10 - tests/unit/memory/tool/test_task_memory.py | 10 - tests/unit/structures/test_agent.py | 18 +- tests/unit/tasks/test_csv_extraction_task.py | 28 -- tests/unit/tasks/test_extraction_task.py | 2 +- tests/unit/tasks/test_json_extraction_task.py | 31 --- tests/unit/tools/test_extraction_tool.py | 67 +++++ tests/unit/tools/test_prompt_summary_tool.py | 29 ++ tests/unit/tools/test_query_tool.py | 31 +++ tests/unit/tools/test_task_memory_tool.py | 29 -- tests/utils/defaults.py | 7 - 99 files changed, 1517 insertions(+), 1011 deletions(-) create mode 100644 docs/griptape-tools/official-tools/extraction-tool.md create mode 100644 docs/griptape-tools/official-tools/prompt-summary-tool.md create mode 100644 docs/griptape-tools/official-tools/query-tool.md create mode 100644 docs/griptape-tools/official-tools/src/extraction_tool_1.py create mode 100644 docs/griptape-tools/official-tools/src/prompt_summary_tool_1.py create mode 100644 docs/griptape-tools/official-tools/src/query_tool_1.py delete mode 100644 docs/griptape-tools/official-tools/src/task_memory_tool_1.py create mode 100644 docs/griptape-tools/official-tools/src/web_scraper_1.py delete mode 100644 docs/griptape-tools/official-tools/task-memory-tool.md delete mode 100644 griptape/tasks/csv_extraction_task.py delete mode 100644 griptape/tasks/json_extraction_task.py create mode 100644 griptape/templates/engines/extraction/csv/system.j2 create mode 100644 griptape/templates/engines/extraction/csv/user.j2 delete mode 100644 griptape/templates/engines/extraction/csv_extraction.j2 create mode 100644 griptape/templates/engines/extraction/json/system.j2 rename griptape/templates/engines/extraction/{json_extraction.j2 => json/user.j2} (56%) rename griptape/tools/{task_memory => extraction}/__init__.py (100%) create mode 100644 griptape/tools/extraction/manifest.yml create mode 100644 griptape/tools/extraction/requirements.txt create mode 100644 griptape/tools/extraction/tool.py create mode 100644 griptape/tools/prompt_summary/__init__.py create mode 100644 griptape/tools/prompt_summary/manifest.yml create mode 100644 griptape/tools/prompt_summary/requirements.txt create mode 100644 griptape/tools/prompt_summary/tool.py create mode 100644 griptape/tools/query/__init__.py create mode 100644 griptape/tools/query/manifest.yml create mode 100644 griptape/tools/query/requirements.txt create mode 100644 griptape/tools/query/tool.py delete mode 100644 griptape/tools/task_memory/manifest.yml delete mode 100644 griptape/tools/task_memory/tool.py delete mode 100644 tests/unit/tasks/test_csv_extraction_task.py delete mode 100644 tests/unit/tasks/test_json_extraction_task.py create mode 100644 tests/unit/tools/test_extraction_tool.py create mode 100644 tests/unit/tools/test_prompt_summary_tool.py create mode 100644 tests/unit/tools/test_query_tool.py delete mode 100644 tests/unit/tools/test_task_memory_tool.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d6e9bffc..138a9c896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. - Global config, `griptape.config.config`, for setting global configuration defaults. - Unique name generation for all `RagEngine` modules. +- `ExtractionTool` for having the LLM extract structured data from text. +- `PromptSummaryTool` for having the LLM summarize text. +- `QueryTool` for having the LLM query text. - Support for bitshift composition in `BaseTask` for adding parent/child tasks. - `JsonArtifact` for handling de/seralization of values. @@ -33,11 +36,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Dropped `Client` from all Tool names for better naming consistency. - **BREAKING**: Dropped `_client` suffix from all Tool packages. - **BREAKING**: Added `Tool` suffix to all Tool names for better naming consistency. +- **BREAKING**: Removed `TextArtifactStorage.query` and `TextArtifactStorage.summarize`. +- **BREAKING**: Removed `TextArtifactStorage.rag_engine`, and `TextArtifactStorage.retrieval_rag_module_name`. +- **BREAKING**: Removed `TextArtifactStorage.summary_engine`, `TextArtifactStorage.csv_extraction_engine`, and `TextArtifactStorage.json_extraction_engine`. +- **BREAKING**: Removed `TaskMemory.summarize_namespace` and `TaskMemory.query_namespace`. +- **BREAKING**: Removed `Structure.rag_engine`. +- **BREAKING**: Split `JsonExtractionEngine.template_generator` into `JsonExtractionEngine.system_template_generator` and `JsonExtractionEngine.user_template_generator`. +- **BREAKING**: Split `CsvExtractionEngine.template_generator` into `CsvExtractionEngine.system_template_generator` and `CsvExtractionEngine.user_template_generator`. +- **BREAKING**: Changed `JsonExtractionEngine.template_schema` from a `run` argument to a class attribute. +- **BREAKING**: Changed `CsvExtractionEngine.column_names` from a `run` argument to a class attribute. +- **BREAKING**: Removed `JsonExtractionTask`, and `CsvExtractionTask` use `ExtractionTask` instead. +- **BREAKING**: Removed `TaskMemoryClient`, use `RagClient`, `ExtractionTool`, or `PromptSummaryTool` instead. - **BREAKING**: `BaseTask.add_parent/child` now take a `BaseTask` instead of `str | BaseTask`. - Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. - `BaseTask.add_parent/child` now returns `self`, allowing for chaining. +### Fixed +- `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. + ## [0.29.1] - 2024-08-02 ### Changed @@ -443,7 +460,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `JsonExtractionTask` for convenience over using `ExtractionTask` with a `JsonExtractionEngine`. - `CsvExtractionTask` for convenience over using `ExtractionTask` with a `CsvExtractionEngine`. - `OpenAiVisionImageQueryDriver` to support queries on images using OpenAI's Vision model. -- `ImageQueryClient` allowing an Agent to make queries on images on disk or in Task Memory. +- `ImageQueryTool` allowing an Agent to make queries on images on disk or in Task Memory. - `ImageQueryTask` and `ImageQueryEngine`. ### Fixed diff --git a/README.md b/README.md index 1f6d6d883..d9f21c2d8 100644 --- a/README.md +++ b/README.md @@ -89,13 +89,13 @@ With Griptape, you can create Structures, such as Agents, Pipelines, and Workflo ```python from griptape.structures import Agent -from griptape.tools import WebScraperTool, FileManagerTool, TaskMemoryTool +from griptape.tools import WebScraperTool, FileManagerTool, PromptSummaryTool agent = Agent( input="Load {{ args[0] }}, summarize it, and store it in a file called {{ args[1] }}.", tools=[ WebScraperTool(off_prompt=True), - TaskMemoryTool(off_prompt=True), + PromptSummaryTool(off_prompt=True), FileManagerTool() ] ) @@ -104,42 +104,63 @@ agent.run("https://griptape.ai", "griptape.txt") And here is the output: ``` -[04/02/24 13:51:09] INFO ToolkitTask 85700ec1b0594e1a9502c0efe7da6ef4 +[08/12/24 14:48:15] INFO ToolkitTask c90d263ec69046e8b30323c131ae4ba0 Input: Load https://griptape.ai, summarize it, and store it in a file called griptape.txt. -[04/02/24 13:51:15] INFO Subtask db6a3e7cb2f549128c358149d340f91c - Thought: First, I need to load the content of the website using the WebScraper action. Then, I will use the TaskMemoryClient action to - summarize the content. Finally, I will save the summarized content to a file using the FileManager action. +[08/12/24 14:48:16] INFO Subtask ebe23832cbe2464fb9ecde9fcee7c30f Actions: [ { - "name": "WebScraper", + "tag": "call_62kBnkswnk9Y6GH6kn1GIKk6", + "name": "WebScraperTool", "path": "get_content", "input": { "values": { "url": "https://griptape.ai" } - }, - "tag": "load_website_content" + } } ] -[04/02/24 13:51:16] INFO Subtask db6a3e7cb2f549128c358149d340f91c - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace - "752b38bb86da4baabdbd9f444eb4a0d1" -[04/02/24 13:51:19] INFO Subtask c3edba87ebf845d4b85e3a791f8fde8d - Thought: Now that the website content is loaded into memory, I need to summarize it using the TaskMemoryClient action. - Actions: [{"tag": "summarize_content", "name": "TaskMemoryClient", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", - "artifact_namespace": "752b38bb86da4baabdbd9f444eb4a0d1"}}}] -[04/02/24 13:51:25] INFO Subtask c3edba87ebf845d4b85e3a791f8fde8d - Response: Output of "TaskMemoryClient.summarize" was stored in memory with memory_name "TaskMemory" and artifact_namespace - "c4f131c201f147dcab07be3925b46294" -[04/02/24 13:51:33] INFO Subtask 06fe01ca64a744b38a8c08eb152aaacb - Thought: Now that the content has been summarized and stored in memory, I need to save this summarized content to a file named 'griptape.txt' - using the FileManager action. - Actions: [{"tag": "save_summarized_content", "name": "FileManager", "path": "save_memory_artifacts_to_disk", "input": {"values": {"dir_name": - ".", "file_name": "griptape.txt", "memory_name": "TaskMemory", "artifact_namespace": "c4f131c201f147dcab07be3925b46294"}}}] - INFO Subtask 06fe01ca64a744b38a8c08eb152aaacb - Response: saved successfully -[04/02/24 13:51:35] INFO ToolkitTask 85700ec1b0594e1a9502c0efe7da6ef4 - Output: The summarized content of the website https://griptape.ai has been successfully saved to a file named 'griptape.txt'. +[08/12/24 14:48:17] INFO Subtask ebe23832cbe2464fb9ecde9fcee7c30f + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "cecca28eb0c74bcd8c7119ed7f790c95" +[08/12/24 14:48:18] INFO Subtask dca04901436d49d2ade86cd6b4e1038a + Actions: [ + { + "tag": "call_o9F1taIxHty0mDlWLcAjTAAu", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "cecca28eb0c74bcd8c7119ed7f790c95" + } + } + } + } + ] +[08/12/24 14:48:21] INFO Subtask dca04901436d49d2ade86cd6b4e1038a + Response: Output of "PromptSummaryTool.summarize" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "73765e32b8404e32927822250dc2ae8b" +[08/12/24 14:48:22] INFO Subtask c233853450fb4fd6a3e9c04c52b33bf6 + Actions: [ + { + "tag": "call_eKvIUIw45aRYKDBpT1gGKc9b", + "name": "FileManagerTool", + "path": "save_memory_artifacts_to_disk", + "input": { + "values": { + "dir_name": ".", + "file_name": "griptape.txt", + "memory_name": "TaskMemory", + "artifact_namespace": "73765e32b8404e32927822250dc2ae8b" + } + } + } + ] + INFO Subtask c233853450fb4fd6a3e9c04c52b33bf6 + Response: Successfully saved memory artifacts to disk +[08/12/24 14:48:23] INFO ToolkitTask c90d263ec69046e8b30323c131ae4ba0 + Output: The content from https://griptape.ai has been summarized and stored in a file called `griptape.txt`. ``` During the run, the Griptape Agent loaded a webpage with a [Tool](https://docs.griptape.ai/stable/griptape-tools/), stored its full content in [Task Memory](https://docs.griptape.ai/stable/griptape-framework/structures/task-memory.md), queried it to answer the original question, and finally saved the answer to a file. diff --git a/_typos.toml b/_typos.toml index 1819b51ef..659cc6823 100644 --- a/_typos.toml +++ b/_typos.toml @@ -1,3 +1,6 @@ +[default] +extend-ignore-re = ["call_[[:alnum:]]+"] + [default.extend-words] # Don't correct the state ND ND = "ND" diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index e73ffe5d6..bd91f977d 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -1,6 +1,6 @@ -This example shows how to use one `Agent` to load content into `TaskMemory` and get that content from another `Agent` using `TaskMemoryClient`. +This example shows how to use one `Agent` to load content into `TaskMemory` and get that content from another `Agent` using `QueryTool`. -The first `Agent` uses a remote vector store (`MongoDbAtlasVectorStoreDriver` in this example) to handle memory operations. The second `Agent` uses the same instance of `TaskMemory` and the `TaskMemoryClient` with the same `MongoDbAtlasVectorStoreDriver` to get the data. +The first `Agent` uses a remote vector store (`MongoDbAtlasVectorStoreDriver` in this example) to handle memory operations. The second `Agent` uses the same instance of `TaskMemory` and the `QueryTool` with the same `MongoDbAtlasVectorStoreDriver` to get the data. The `MongoDbAtlasVectorStoreDriver` assumes that you have a vector index configured where the path to the content is called `vector`, and the number of dimensions set on the index is `1536` (this is a commonly used number of dimensions for embedding models). diff --git a/docs/examples/src/multi_agent_workflow_1.py b/docs/examples/src/multi_agent_workflow_1.py index 137a5075f..e1f00a9bd 100644 --- a/docs/examples/src/multi_agent_workflow_1.py +++ b/docs/examples/src/multi_agent_workflow_1.py @@ -5,7 +5,7 @@ from griptape.structures import Agent, Workflow from griptape.tasks import PromptTask, StructureRunTask from griptape.tools import ( - TaskMemoryTool, + PromptSummaryTool, WebScraperTool, WebSearchTool, ) @@ -38,7 +38,7 @@ def build_researcher() -> Agent: WebScraperTool( off_prompt=True, ), - TaskMemoryTool(off_prompt=False), + PromptSummaryTool(off_prompt=False), ], rulesets=[ Ruleset( diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index 11590df39..946a21190 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -4,7 +4,7 @@ from griptape.config.drivers import AzureOpenAiDriverConfig from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import QueryTool, WebScraperTool AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] AZURE_OPENAI_API_KEY_1 = os.environ["AZURE_OPENAI_API_KEY_1"] @@ -47,7 +47,7 @@ ) asker = Agent( tools=[ - TaskMemoryTool(off_prompt=False), + QueryTool(off_prompt=False), ], meta_memory=loader.meta_memory, task_memory=loader.task_memory, diff --git a/docs/examples/src/query_webpage_astra_db_1.py b/docs/examples/src/query_webpage_astra_db_1.py index 6a96a813e..3309e1dcd 100644 --- a/docs/examples/src/query_webpage_astra_db_1.py +++ b/docs/examples/src/query_webpage_astra_db_1.py @@ -14,7 +14,7 @@ from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import RagTool, TaskMemoryTool +from griptape.tools import RagTool namespace = "datastax_blog" input_blogpost = "www.datastax.com/blog/indexing-all-of-wikipedia-on-a-laptop" @@ -53,5 +53,5 @@ description="A DataStax blog post", rag_engine=engine, ) -agent = Agent(tools=[rag_tool, TaskMemoryTool(off_prompt=False)]) +agent = Agent(tools=[rag_tool]) agent.run("What engine made possible to index such an amount of data, " "and what kind of tuning was required?") diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index 1a33a991b..8c4da02b3 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -40,11 +40,11 @@ Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#gript ## Image -An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an Image Artifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blobartifact). +An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an Image Artifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blob). ## Audio -An [AudioArtifact](../../reference/griptape/artifacts/audio_artifact.md) allows the Framework to interact with audio content. An Audio Artifact includes binary audio content as well as metadata like format, duration, and prompt and model information for audio returned generative models. It inherits from [BlobArtifact](#blobartifact). +An [AudioArtifact](../../reference/griptape/artifacts/audio_artifact.md) allows the Framework to interact with audio content. An Audio Artifact includes binary audio content as well as metadata like format, duration, and prompt and model information for audio returned generative models. It inherits from [BlobArtifact](#blob). ## Boolean diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index 82d97f494..914fdee2a 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -75,7 +75,7 @@ Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) !!! info This driver requires the `loaders-image` [extra](../index.md#extras). -The Image Loader is used to load an image as an [ImageArtifact](./artifacts.md#imageartifact). The Loader operates on image bytes that can be sourced from files on disk, downloaded images, or images in memory. +The Image Loader is used to load an image as an [ImageArtifact](./artifacts.md#image). The Loader operates on image bytes that can be sourced from files on disk, downloaded images, or images in memory. ```python --8<-- "docs/griptape-framework/data/src/loaders_7.py" @@ -104,7 +104,7 @@ Can be used to load email from an imap server: !!! info This driver requires the `loaders-audio` [extra](../index.md#extras). -The [Audio Loader](../../reference/griptape/loaders/audio_loader.md) is used to load audio content as an [AudioArtifact](./artifacts.md#audioartifact). The Loader operates on audio bytes that can be sourced from files on disk, downloaded audio, or audio in memory. +The [Audio Loader](../../reference/griptape/loaders/audio_loader.md) is used to load audio content as an [AudioArtifact](./artifacts.md#audio). The Loader operates on audio bytes that can be sourced from files on disk, downloaded audio, or audio in memory. The Loader will load audio in its native format and populates the resulting Artifact's `format` field by making a best-effort guess of the underlying audio format using the `filetype` package. diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index a27e60298..dbbc659fb 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -5,7 +5,12 @@ VoyageAiEmbeddingDriver, ) from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import PromptSummaryTool, WebScraperTool + +config.drivers = DriverConfig( + prompt=OpenAiChatPromptDriver(model="gpt-4o"), + embedding=VoyageAiEmbeddingDriver(), +) config.drivers = DriverConfig( prompt=OpenAiChatPromptDriver(model="gpt-4o"), @@ -13,7 +18,7 @@ ) agent = Agent( - tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)], ) agent.run("based on https://www.griptape.ai/, tell me what Griptape is") diff --git a/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py index d4c77c2ae..aafa465f8 100644 --- a/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py +++ b/docs/griptape-framework/drivers/src/web_scraper_drivers_3.py @@ -1,15 +1,14 @@ from griptape.drivers import MarkdownifyWebScraperDriver from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import WebScraperTool agent = Agent( tools=[ WebScraperTool( web_loader=WebLoader(web_scraper_driver=MarkdownifyWebScraperDriver(timeout=1000)), - off_prompt=True, + off_prompt=False, ), - TaskMemoryTool(off_prompt=False), ], ) agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") diff --git a/docs/griptape-framework/drivers/src/web_search_drivers_2.py b/docs/griptape-framework/drivers/src/web_search_drivers_2.py index a33b8c00c..abe80a2e0 100644 --- a/docs/griptape-framework/drivers/src/web_search_drivers_2.py +++ b/docs/griptape-framework/drivers/src/web_search_drivers_2.py @@ -2,7 +2,7 @@ from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebSearchTool +from griptape.tools import PromptSummaryTool, WebSearchTool agent = Agent( tools=[ @@ -12,7 +12,7 @@ search_id=os.environ["GOOGLE_API_SEARCH_ID"], ), ), - TaskMemoryTool(off_prompt=False), + PromptSummaryTool(off_prompt=False), ], ) agent.run("Give me some websites with information about AI frameworks.") diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index ff3670e6e..3dd294f0b 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -128,44 +128,75 @@ Agents are great for getting started, but they are intentionally limited to a si ``` ``` -[09/08/23 10:02:34] INFO ToolkitTask 3c1d2f4a49384873820a9a8cd8acc983 +[08/12/24 14:50:28] INFO ToolkitTask 19dcf6020968468a91aa8a93c2a3f645 Input: Load https://www.griptape.ai, summarize it, and store it in griptape.txt -[09/08/23 10:02:44] INFO Subtask 42fd56ba100e45688401c5ce32b79a33 - Thought: To complete this task, I need to first load the webpage using the WebScraper tool's get_content - activity. Then, I will summarize the content using the TaskMemory tool's summarize activity. Finally, I will - store the summarized content in a file named griptape.txt using the FileManager tool's save_file_to_disk - activity. - - Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": - "https://www.griptape.ai"}}} -[09/08/23 10:02:45] INFO Subtask 42fd56ba100e45688401c5ce32b79a33 - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and - artifact_namespace "39ca67bbe26b4e1584193b87ed82170d" -[09/08/23 10:02:53] INFO Subtask 8023e3d257274df29065b22e736faca8 - Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity - to summarize the content. - Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d"}}} -[09/08/23 10:02:57] INFO Subtask 8023e3d257274df29065b22e736faca8 - Response: Griptape is an open source framework that allows developers to build and deploy AI applications - using large language models (LLMs). It provides the ability to create conversational and event-driven apps that - can securely access and manipulate data. The framework enforces structures for predictability and creativity, - allowing developers to easily transition between the two. Griptape Cloud is a managed platform for deploying and - managing AI apps. -[09/08/23 10:03:06] INFO Subtask 7baae700239943c18b5b6b21873f0e13 - Thought: Now that I have the summarized content, I can store it in a file named griptape.txt using the - FileManager tool's save_file_to_disk activity. - Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": - {"memory_name": "TaskMemory", "artifact_namespace": "39ca67bbe26b4e1584193b87ed82170d", "path": - "griptape.txt"}}} - INFO Subtask 7baae700239943c18b5b6b21873f0e13 - Response: saved successfully -[09/08/23 10:03:14] INFO ToolkitTask 3c1d2f4a49384873820a9a8cd8acc983 - Output: The summarized content of the webpage https://www.griptape.ai has been successfully stored in the file - named griptape.txt. - INFO PromptTask 8635925ff23b46f28a740105bd11ca8f - Input: Say the following in spanish: The summarized content of the webpage https://www.griptape.ai has been - successfully stored in the file named griptape.txt. -[09/08/23 10:03:18] INFO PromptTask 8635925ff23b46f28a740105bd11ca8f - Output: El contenido resumido de la página web https://www.griptape.ai se ha almacenado con éxito en el archivo - llamado griptape.txt. +[08/12/24 14:50:30] INFO Subtask a685799379c5421b91768353fc219939 + Actions: [ + { + "tag": "call_YL5Ozd9WUtag4ykR5Agm12Ce", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://www.griptape.ai" + } + } + } + ] +[08/12/24 14:50:31] INFO Subtask a685799379c5421b91768353fc219939 + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "6be3a2e0494841fda966b98bec9ffccb" +[08/12/24 14:50:33] INFO Subtask 1cf0c19843aa4fada5745c4a82eb4237 + Actions: [ + { + "tag": "call_ElTYTPeocOU62I0VjzRqmfoF", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "6be3a2e0494841fda966b98bec9ffccb" + } + } + } + } + ] +[08/12/24 14:50:35] INFO Subtask 1cf0c19843aa4fada5745c4a82eb4237 + Response: Griptape offers a comprehensive solution for building, deploying, and scaling AI applications in the cloud. It provides developers + with a framework and cloud services to create retrieval-driven AI-powered applications. The Griptape Framework allows developers to build + business logic using Python, ensuring better security, performance, and cost-efficiency. It simplifies the creation of Gen AI Agents, Systems of + Agents, Pipelines, Workflows, and RAG implementations without needing extensive knowledge of Gen AI or Prompt Engineering. + + Griptape Cloud handles infrastructure management, offering services like ETL pipelines for data preparation, Retrieval as a Service (RAG) for + generating answers and summaries, and a Structure Runtime (RUN) for building AI agents and workflows. This enables seamless scaling and + integration with client applications, catering to custom projects, turnkey SaaS offerings, and finished apps. +[08/12/24 14:50:38] INFO Subtask aaaeca1a089844d4915d065deb3c00cf + Actions: [ + { + "tag": "call_eKvIUIw45aRYKDBpT1gGKc9b", + "name": "FileManagerTool", + "path": "save_content_to_file", + "input": { + "values": { + "path": "griptape.txt", + "content": "Griptape offers a comprehensive solution for building, deploying, and scaling AI applications in the cloud. It provides + developers with a framework and cloud services to create retrieval-driven AI-powered applications. The Griptape Framework allows developers to + build business logic using Python, ensuring better security, performance, and cost-efficiency. It simplifies the creation of Gen AI Agents, + Systems of Agents, Pipelines, Workflows, and RAG implementations without needing extensive knowledge of Gen AI or Prompt + Engineering.\n\nGriptape Cloud handles infrastructure management, offering services like ETL pipelines for data preparation, Retrieval as a + Service (RAG) for generating answers and summaries, and a Structure Runtime (RUN) for building AI agents and workflows. This enables seamless + scaling and integration with client applications, catering to custom projects, turnkey SaaS offerings, and finished apps." + } + } + } + ] + INFO Subtask aaaeca1a089844d4915d065deb3c00cf + Response: Successfully saved file +[08/12/24 14:50:39] INFO ToolkitTask 19dcf6020968468a91aa8a93c2a3f645 + Output: The content from https://www.griptape.ai has been summarized and stored in griptape.txt. + INFO PromptTask dbbb38f144f445db896dc12854f17ad3 + Input: Say the following in spanish: The content from https://www.griptape.ai has been summarized and stored in griptape.txt. +[08/12/24 14:50:42] INFO PromptTask dbbb38f144f445db896dc12854f17ad3 + Output: El contenido de https://www.griptape.ai ha sido resumido y almacenado en griptape.txt. ``` diff --git a/docs/griptape-framework/misc/src/events_3.py b/docs/griptape-framework/misc/src/events_3.py index 2a567debe..721cf3511 100644 --- a/docs/griptape-framework/misc/src/events_3.py +++ b/docs/griptape-framework/misc/src/events_3.py @@ -4,7 +4,7 @@ from griptape.events import CompletionChunkEvent, EventListener, event_bus from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import PromptSummaryTool, WebScraperTool event_bus.add_event_listeners( [ @@ -20,7 +20,7 @@ ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True), - tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)], ) ) diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py index a66e77b1d..6dc2d3a6c 100644 --- a/docs/griptape-framework/misc/src/events_4.py +++ b/docs/griptape-framework/misc/src/events_4.py @@ -1,13 +1,13 @@ from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import PromptSummaryTool, WebScraperTool from griptape.utils import Stream pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", - tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)], ) ) diff --git a/docs/griptape-framework/src/index_4.py b/docs/griptape-framework/src/index_4.py index dd07280ce..50465f99e 100644 --- a/docs/griptape-framework/src/index_4.py +++ b/docs/griptape-framework/src/index_4.py @@ -1,7 +1,7 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import PromptTask, ToolkitTask -from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool +from griptape.tools import FileManagerTool, PromptSummaryTool, WebScraperTool # Pipelines represent sequences of tasks. pipeline = Pipeline(conversation_memory=ConversationMemory()) @@ -11,7 +11,7 @@ ToolkitTask( "{{ args[0] }}", # Add tools for web scraping, and file management - tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], + tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), PromptSummaryTool(off_prompt=False)], ), # Augment `input` from the previous task. PromptTask("Say the following in spanish: {{ parent_output }}"), diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 376e7288a..1b40fad2b 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -12,7 +12,7 @@ directly, which the agent uses to dynamically determine whether to use a [Prompt If [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) are passed provided to the Agent, a [Toolkit Task](./tasks.md#toolkit-task) will be used. If no [tools](../../reference/griptape/structures/agent.md#griptape.structures.agent.Agent.tools) are provided, a [Prompt Task](./tasks.md#prompt-task) will be used. -You can access the final output of the Agent by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. +You can access the final output of the Agent by using the [output](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.output) attribute. ## Toolkit Task Agent diff --git a/docs/griptape-framework/structures/pipelines.md b/docs/griptape-framework/structures/pipelines.md index fc5046196..7bcfc1348 100644 --- a/docs/griptape-framework/structures/pipelines.md +++ b/docs/griptape-framework/structures/pipelines.md @@ -6,7 +6,7 @@ search: ## Overview A [Pipeline](../../reference/griptape/structures/pipeline.md) is very similar to an [Agent](../../reference/griptape/structures/agent.md), but allows for multiple tasks. -You can access the final output of the Pipeline by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. +You can access the final output of the Pipeline by using the [output](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.output) attribute. ## Context diff --git a/docs/griptape-framework/structures/src/task_memory_3.py b/docs/griptape-framework/structures/src/task_memory_3.py index 926a21cd3..8a0e53d8c 100644 --- a/docs/griptape-framework/structures/src/task_memory_3.py +++ b/docs/griptape-framework/structures/src/task_memory_3.py @@ -1,7 +1,7 @@ from griptape.structures import Agent -from griptape.tools import CalculatorTool, TaskMemoryTool +from griptape.tools import CalculatorTool, PromptSummaryTool -# Create an agent with the CalculatorTool tool -agent = Agent(tools=[CalculatorTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) +# Create an agent with the Calculator tool +agent = Agent(tools=[CalculatorTool(off_prompt=True), PromptSummaryTool(off_prompt=False)]) agent.run("What is the square root of 12345?") diff --git a/docs/griptape-framework/structures/src/task_memory_5.py b/docs/griptape-framework/structures/src/task_memory_5.py index a53d106b4..a061118e8 100644 --- a/docs/griptape-framework/structures/src/task_memory_5.py +++ b/docs/griptape-framework/structures/src/task_memory_5.py @@ -1,10 +1,10 @@ from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import QueryTool, WebScraperTool agent = Agent( tools=[ WebScraperTool(off_prompt=True), - TaskMemoryTool(off_prompt=False), + QueryTool(off_prompt=False), ] ) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 8d39f0286..3ce87f72d 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -6,13 +6,14 @@ OpenAiChatPromptDriver, OpenAiEmbeddingDriver, ) -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule -from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.structures import Agent -from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool +from griptape.tools import FileManagerTool, QueryTool, WebScraperTool + +config.drivers = OpenAiDriverConfig( + prompt=OpenAiChatPromptDriver(model="gpt-4"), +) config.drivers = OpenAiDriverConfig( prompt=OpenAiChatPromptDriver(model="gpt-4"), @@ -24,27 +25,13 @@ task_memory=TaskMemory( artifact_storages={ TextArtifact: TextArtifactStorage( - rag_engine=RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - vector_store_driver=vector_store_driver, - query_params={"namespace": "griptape", "count": 20}, - ) - ] - ), - response_stage=ResponseRagStage( - response_modules=[PromptResponseRagModule(prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"))] - ), - ), - retrieval_rag_module_name="VectorStoreRetrievalRagModule", vector_store_driver=vector_store_driver, ) } ), tools=[ WebScraperTool(off_prompt=True), - TaskMemoryTool(off_prompt=True, allowlist=["query"]), + QueryTool(off_prompt=True), FileManagerTool(off_prompt=True), ], ) diff --git a/docs/griptape-framework/structures/src/task_memory_8.py b/docs/griptape-framework/structures/src/task_memory_8.py index 846119228..ee106caec 100644 --- a/docs/griptape-framework/structures/src/task_memory_8.py +++ b/docs/griptape-framework/structures/src/task_memory_8.py @@ -1,10 +1,12 @@ from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import PromptSummaryTool, WebScraperTool agent = Agent( tools=[ WebScraperTool(off_prompt=True), # This tool will store the data in Task Memory - TaskMemoryTool(off_prompt=True), # This tool will store the data back in Task Memory with no way to get it out + PromptSummaryTool( + off_prompt=True + ), # This tool will store the data back in Task Memory with no way to get it out ] ) agent.run( diff --git a/docs/griptape-framework/structures/src/tasks_16.py b/docs/griptape-framework/structures/src/tasks_16.py index 5f2e6b718..a6da835a6 100644 --- a/docs/griptape-framework/structures/src/tasks_16.py +++ b/docs/griptape-framework/structures/src/tasks_16.py @@ -5,7 +5,7 @@ from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask from griptape.tools import ( - TaskMemoryTool, + PromptSummaryTool, WebScraperTool, WebSearchTool, ) @@ -23,7 +23,7 @@ def build_researcher() -> Agent: WebScraperTool( off_prompt=True, ), - TaskMemoryTool(off_prompt=False), + PromptSummaryTool(off_prompt=False), ], rulesets=[ Ruleset( diff --git a/docs/griptape-framework/structures/src/tasks_4.py b/docs/griptape-framework/structures/src/tasks_4.py index 936b59f99..cd73b3ada 100644 --- a/docs/griptape-framework/structures/src/tasks_4.py +++ b/docs/griptape-framework/structures/src/tasks_4.py @@ -1,12 +1,12 @@ from griptape.structures import Agent from griptape.tasks import ToolkitTask -from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool +from griptape.tools import FileManagerTool, PromptSummaryTool, WebScraperTool agent = Agent() agent.add_task( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=True)], + tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), PromptSummaryTool(off_prompt=True)], ), ) diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index ccc4dd1e7..81334b1cb 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -68,19 +68,16 @@ Let's explore what happens when `off_prompt` is set to `True`: ...Output truncated for brevity... ``` -When we set `off_prompt` to `True`, the Agent does not function as expected, even generating an error. This is because the CalculatorTool output is being stored in Task Memory but the Agent has no way to access it. -To fix this, we need a [Tool that can read from Task Memory](#tools-that-can-read-from-task-memory) such as the `TaskMemoryTool`. +When we set `off_prompt` to `True`, the Agent does not function as expected, even generating an error. This is because the Calculator output is being stored in Task Memory but the Agent has no way to access it. +To fix this, we need a [Tool that can read from Task Memory](#tools-that-can-read-from-task-memory) such as the `PromptSummaryTool`. This is an example of [not providing a Task Memory compatible Tool](#not-providing-a-task-memory-compatible-tool). -## Task Memory Tool +## Prompt Summary Tool -The [TaskMemoryTool](../../griptape-tools/official-tools/task-memory-tool.md) is a Tool that allows an Agent to interact with Task Memory. It has the following methods: +The [PromptSummaryTool](../../griptape-tools/official-tools/prompt-summary-tool.md) is a Tool that allows an Agent to summarize the Artifacts in Task Memory. It has the following methods: -- `query`: Retrieve the content of an Artifact stored in Task Memory. -- `summarize`: Summarize the content of an Artifact stored in Task Memory. - -Let's add `TaskMemoryTool` to the Agent and run the same task. -Note that on the `TaskMemoryTool` we've set `off_prompt` to `False` so that the results of the query can be returned directly to the LLM. +Let's add `PromptSummaryTool` to the Agent and run the same task. +Note that on the `PromptSummaryTool` we've set `off_prompt` to `False` so that the results of the query can be returned directly to the LLM. If we had kept it as `True`, the results would have been stored back Task Memory which would've put us back to square one. See [Task Memory Looping](#task-memory-looping) for more information on this scenario. ```python @@ -88,22 +85,43 @@ If we had kept it as `True`, the results would have been stored back Task Memory ``` ``` -[04/26/24 13:13:01] INFO ToolkitTask 5b46f9ef677c4b31906b48aba3f45e2c +[08/12/24 14:54:04] INFO ToolkitTask f7ebd8acc3d64e3ca9db82ef9ec4e65f Input: What is the square root of 12345? -[04/26/24 13:13:07] INFO Subtask 611d98ea5576430fbc63259420577ab2 - Thought: To find the square root of 12345, I can use the CalculatorTool action with the expression "12345 ** 0.5". - Actions: [{"name": "CalculatorTool", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] -[04/26/24 13:13:08] INFO Subtask 611d98ea5576430fbc63259420577ab2 - Response: Output of "CalculatorTool.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace - "7554b69e1d414a469b8882e2266dcea1" -[04/26/24 13:13:15] INFO Subtask 32b9163a15644212be60b8fba07bd23b - Thought: The square root of 12345 has been calculated and stored in memory. I can retrieve this value using the TaskMemoryTool action with - the query path, providing the memory_name and artifact_namespace as input. - Actions: [{"tag": "retrieve_sqrt", "name": "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", - "artifact_namespace": "7554b69e1d414a469b8882e2266dcea1", "query": "What is the result of the calculation?"}}}] -[04/26/24 13:13:16] INFO Subtask 32b9163a15644212be60b8fba07bd23b - Response: The result of the calculation is 111.1080555135405. -[04/26/24 13:13:17] INFO ToolkitTask 5b46f9ef677c4b31906b48aba3f45e2c +[08/12/24 14:54:05] INFO Subtask 777693d039e74ed288f663742fdde2ea + Actions: [ + { + "tag": "call_DXSs19G27VOV7EmP3PoRwGZI", + "name": "Calculator", + "path": "calculate", + "input": { + "values": { + "expression": "12345 ** 0.5" + } + } + } + ] + INFO Subtask 777693d039e74ed288f663742fdde2ea + Response: Output of "Calculator.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "370853a8937f4dd7a9e923254459cff2" +[08/12/24 14:54:06] INFO Subtask c8394ca51f1f4ae1b715618a2c5c8120 + Actions: [ + { + "tag": "call_qqpsWEvAUGIcPLrwAHGuH6o3", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "370853a8937f4dd7a9e923254459cff2" + } + } + } + } + ] +[08/12/24 14:54:07] INFO Subtask c8394ca51f1f4ae1b715618a2c5c8120 + Response: The text contains a single numerical value: 111.1080555135405. +[08/12/24 14:54:08] INFO ToolkitTask f7ebd8acc3d64e3ca9db82ef9ec4e65f Output: The square root of 12345 is approximately 111.108. ``` @@ -125,8 +143,8 @@ When running this example, we get the following error: Please reduce the length of the messages.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}} ``` -This is because the content of the webpage is too large to fit in the LLM's input token limit. We can fix this by storing the content in Task Memory, and then querying it with the `TaskMemoryTool`. -Note that we're setting `off_prompt` to `False` on the `TaskMemoryTool` so that the _queried_ content can be returned directly to the LLM. +This is because the content of the webpage is too large to fit in the LLM's input token limit. We can fix this by storing the content in Task Memory, and then querying it with the `QueryTool`. +Note that we're setting `off_prompt` to `False` on the `QueryTool` so that the _queried_ content can be returned directly to the LLM. ```python --8<-- "docs/griptape-framework/structures/src/task_memory_5.py" @@ -134,24 +152,46 @@ Note that we're setting `off_prompt` to `False` on the `TaskMemoryTool` so that And now we get the expected output: ``` -[04/26/24 13:51:51] INFO ToolkitTask 7aca20f202df47a2b9848ed7025f9c21 +[08/12/24 14:56:18] INFO ToolkitTask d3ce58587dc944b0a30a205631b82944 Input: According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold? -[04/26/24 13:51:58] INFO Subtask 5b21d8ead32b4644abcd1e852bb5f512 - Thought: I need to scrape the content of the provided URL to find the information about how many copies of Elden Ring have been sold. - Actions: [{"name": "WebScraper", "path": "get_content", "input": {"values": {"url": "https://en.wikipedia.org/wiki/Elden_Ring"}}, "tag": - "scrape_elden_ring"}] -[04/26/24 13:52:04] INFO Subtask 5b21d8ead32b4644abcd1e852bb5f512 - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace - "2d4ebc7211074bb7be26613eb25d8fc1" -[04/26/24 13:52:11] INFO Subtask f12eb3d3b4924e4085808236b460b43d - Thought: Now that the webpage content is stored in memory, I need to query this memory to find the information about how many copies of Elden - Ring have been sold. - Actions: [{"tag": "query_sales", "name": "TaskMemoryTool", "path": "query", "input": {"values": {"memory_name": "TaskMemory", - "artifact_namespace": "2d4ebc7211074bb7be26613eb25d8fc1", "query": "How many copies of Elden Ring have been sold?"}}}] -[04/26/24 13:52:14] INFO Subtask f12eb3d3b4924e4085808236b460b43d - Response: Elden Ring sold 23 million copies by February 2024. -[04/26/24 13:52:15] INFO ToolkitTask 7aca20f202df47a2b9848ed7025f9c21 - Output: Elden Ring sold 23 million copies by February 2024. +[08/12/24 14:56:20] INFO Subtask 494850ec40fe474c83d48b5620c5dcbb + Actions: [ + { + "tag": "call_DGsOHC4AVxhV7RPVA7q3rATX", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://en.wikipedia.org/wiki/Elden_Ring" + } + } + } + ] +[08/12/24 14:56:25] INFO Subtask 494850ec40fe474c83d48b5620c5dcbb + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "b9f53d6d9b35455aaf4d99719c1bfffa" +[08/12/24 14:56:26] INFO Subtask 8669ee523bb64550850566011bcd14e2 + Actions: [ + { + "tag": "call_DGsOHC4AVxhV7RPVA7q3rATX", + "name": "QueryTool", + "path": "search", + "input": { + "values": { + "query": "number of copies sold", + "content": { + "memory_name": "TaskMemory", + "artifact_namespace": "b9f53d6d9b35455aaf4d99719c1bfffa" + } + } + } + } + ] +[08/12/24 14:56:29] INFO Subtask 8669ee523bb64550850566011bcd14e2 + Response: "Elden Ring" sold 13.4 million copies worldwide by the end of March 2022 and 25 million by June 2024. The downloadable content (DLC) + "Shadow of the Erdtree" sold five million copies within three days of its release. +[08/12/24 14:56:30] INFO ToolkitTask d3ce58587dc944b0a30a205631b82944 + Output: Elden Ring sold 13.4 million copies worldwide by the end of March 2022 and 25 million by June 2024. ``` ## Sensitive Data @@ -159,68 +199,72 @@ And now we get the expected output: Because Task Memory splits up the storage and retrieval of data, you can use different models for each step. Here is an example where we use GPT-4 to orchestrate the Tools and store the data in Task Memory, and Amazon Bedrock's Titan model to query the raw content. -In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManager` can save the results to disk without GPT-4 ever seeing them. +In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManagerTool` can save the results to disk without GPT-4 ever seeing them. ```python --8<-- "docs/griptape-framework/structures/src/task_memory_6.py" ``` ``` -[06/21/24 16:00:01] INFO ToolkitTask 17f30ac14701490c8ef71508f420ea9f - Input: Use this page - https://en.wikipedia.org/wiki/Elden_Ring to find - how many copies of Elden Ring have been sold, and - then save the result to a file. -[06/21/24 16:00:05] INFO Subtask cb06889205334ec9afd7e97f7f231ab5 - Thought: First, I need to scrape the content of the - provided URL to find the information about how many - copies of Elden Ring have been sold. Then, I will - save this information to a file. - - Actions: [{"name": "WebScraper", "path": - "get_content", "input": {"values": {"url": - "https://en.wikipedia.org/wiki/Elden_Ring"}}, - "tag": "scrape_elden_ring"}] -[06/21/24 16:00:12] INFO Subtask cb06889205334ec9afd7e97f7f231ab5 - Response: Output of "WebScraper.get_content" was - stored in memory with memory_name "TaskMemory" and - artifact_namespace - "7e48bcff0da94ad3b06aa4e173f8f37b" -[06/21/24 16:00:17] INFO Subtask 56102d42475d413299ce52a0230506b7 - Thought: Now that the webpage content is stored in - memory, I need to query this memory to find the - information about how many copies of Elden Ring - have been sold. - Actions: [{"tag": "query_sales", "name": - "TaskMemoryTool", "path": "query", "input": - {"values": {"memory_name": "TaskMemory", - "artifact_namespace": - "7e48bcff0da94ad3b06aa4e173f8f37b", "query": "How - many copies of Elden Ring have been sold?"}}}] -[06/21/24 16:00:19] INFO Subtask 56102d42475d413299ce52a0230506b7 - Response: Output of "TaskMemoryTool.query" was - stored in memory with memory_name "TaskMemory" and - artifact_namespace - "9ecf4d7b7d0c46149dfc46ba236f178e" -[06/21/24 16:00:25] INFO Subtask ed2921791dcf46b68c9d8d2f8dbeddbd - Thought: Now that I have the sales information - stored in memory, I need to save this information - to a file. - Actions: [{"tag": "save_sales_info", "name": - "FileManager", "path": - "save_memory_artifacts_to_disk", "input": - {"values": {"dir_name": "sales_info", "file_name": - "elden_ring_sales.txt", "memory_name": - "TaskMemory", "artifact_namespace": - "9ecf4d7b7d0c46149dfc46ba236f178e"}}}] - INFO Subtask ed2921791dcf46b68c9d8d2f8dbeddbd - Response: Successfully saved memory artifacts to - disk -[06/21/24 16:00:27] INFO ToolkitTask 17f30ac14701490c8ef71508f420ea9f - Output: The information about how many copies of - Elden Ring have been sold has been successfully - saved to the file "elden_ring_sales.txt" in the - "sales_info" directory. +[08/12/24 14:55:21] INFO ToolkitTask 329b1abc760e4d30bbf23e349451d930 + Input: Use this page https://en.wikipedia.org/wiki/Elden_Ring to find how many copies of Elden Ring have been sold, and then save the result to + a file. +[08/12/24 14:55:23] INFO Subtask 26205b5623174424b618abafd886c4d8 + Actions: [ + { + "tag": "call_xMK0IyFZFbjlTapK7AA6kbNq", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://en.wikipedia.org/wiki/Elden_Ring" + } + } + } + ] +[08/12/24 14:55:28] INFO Subtask 26205b5623174424b618abafd886c4d8 + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "44b8f230645148d0b8d44354c0f2df5b" +[08/12/24 14:55:31] INFO Subtask d8b4cf297a0d4d9db04e4f8e63b746c8 + Actions: [ + { + "tag": "call_Oiqq6oI20yqmdNrH9Mawb2fS", + "name": "QueryTool", + "path": "search", + "input": { + "values": { + "query": "copies sold", + "content": { + "memory_name": "TaskMemory", + "artifact_namespace": "44b8f230645148d0b8d44354c0f2df5b" + } + } + } + } + ] +[08/12/24 14:55:34] INFO Subtask d8b4cf297a0d4d9db04e4f8e63b746c8 + Response: Output of "QueryTool.search" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "fd828ddd629e4974a7837f9dfde65954" +[08/12/24 14:55:38] INFO Subtask 7aafcb3fb0d845858e2fcf9b8dc8a7ec + Actions: [ + { + "tag": "call_nV1DIPAEhUEAVMCjXND0pKoS", + "name": "FileManagerTool", + "path": "save_memory_artifacts_to_disk", + "input": { + "values": { + "dir_name": "results", + "file_name": "elden_ring_sales.txt", + "memory_name": "TaskMemory", + "artifact_namespace": "fd828ddd629e4974a7837f9dfde65954" + } + } + } + ] + INFO Subtask 7aafcb3fb0d845858e2fcf9b8dc8a7ec + Response: Successfully saved memory artifacts to disk +[08/12/24 14:55:40] INFO ToolkitTask 329b1abc760e4d30bbf23e349451d930 + Output: Successfully saved the number of copies sold of Elden Ring to a file named "elden_ring_sales.txt" in the "results" directory. ``` ## Tools That Can Read From Task Memory @@ -229,11 +273,10 @@ As seen in the previous example, certain Tools are designed to read directly fro Today, these include: -- [TaskMemoryTool](../../griptape-tools/official-tools/task-memory-tool.md) -- [FileManager](../../griptape-tools/official-tools/file-manager-tool.md) -- [AwsS3Tool](../../griptape-tools/official-tools/aws-s3-tool.md) -- [GoogleDriveTool](../../griptape-tools/official-tools/google-drive-tool.md) -- [GoogleDocsTool](../../griptape-tools/official-tools/google-docs-tool.md) +- [PromptSummaryTool](../../griptape-tools/official-tools/prompt-summary-tool.md) +- [ExtractionTool](../../griptape-tools/official-tools/extraction-tool.md) +- [RagClient](../../griptape-tools/official-tools/rag-tool.md) +- [FileManagerTool](../../griptape-tools/official-tools/file-manager-tool.md) ## Task Memory Considerations diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 477ce7b64..f91937ec0 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -99,39 +99,63 @@ This Task takes in one or more Tools which the LLM will decide to use through Ch ``` ``` -[09/08/23 11:14:55] INFO ToolkitTask 22af656c6ad643e188fe80f9378dfff9 +[08/12/24 15:16:30] INFO ToolkitTask f5b44fe1dadc4e6688053df71d97e0de Input: Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt -[09/08/23 11:15:02] INFO Subtask 7a6356470e6a4b08b61edc5591b37f0c - Thought: The first step is to load the webpage using the WebScraper tool's get_content activity. - - Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": - "https://www.griptape.ai"}}} -[09/08/23 11:15:03] INFO Subtask 7a6356470e6a4b08b61edc5591b37f0c - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and - artifact_namespace "2b50373849d140f698ba8071066437ee" -[09/08/23 11:15:11] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 - Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool's summarize activity - to summarize it. - Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee"}}} -[09/08/23 11:15:15] INFO Subtask a22a7e4ebf594b4b895fcbe8a95c1dd3 - Response: Griptape is an open source framework that allows developers to build and deploy AI applications - using large language models (LLMs). It provides the ability to create conversational and event-driven apps that - can access and manipulate data securely. Griptape enforces structures like sequential pipelines and DAG-based - workflows for predictability, while also allowing for creativity by safely prompting LLMs with external APIs and - data stores. The framework can be used to create AI systems that operate across both dimensions. Griptape Cloud - is a managed platform for deploying and managing AI apps, and it offers features like scheduling and connecting - to data stores and APIs. -[09/08/23 11:15:27] INFO Subtask 7afb3d44d0114b7f8ef2dac4314a8e90 - Thought: Now that I have the summary, I can use the FileManager tool's save_file_to_disk activity to store the - summary in a file named griptape.txt. - Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": - {"memory_name": "TaskMemory", "artifact_namespace": "2b50373849d140f698ba8071066437ee", "path": - "griptape.txt"}}} - INFO Subtask 7afb3d44d0114b7f8ef2dac4314a8e90 - Response: saved successfully -[09/08/23 11:15:31] INFO ToolkitTask 22af656c6ad643e188fe80f9378dfff9 - Output: The summary of the webpage https://www.griptape.ai has been successfully stored in a file named - griptape.txt. +[08/12/24 15:16:32] INFO Subtask a4483eddfbe84129b0f4c04ef0f5d695 + Actions: [ + { + "tag": "call_AFeOL9MGhZ4mPFCULcBEm4NQ", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://www.griptape.ai" + } + } + } + ] + INFO Subtask a4483eddfbe84129b0f4c04ef0f5d695 + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "c6a6bcfc16f34481a068108aeaa6838e" +[08/12/24 15:16:33] INFO Subtask ee5f11666ded4dc39b94e4c59d18fbc7 + Actions: [ + { + "tag": "call_aT7DX0YSQPmOcnumWXrGoMNt", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "c6a6bcfc16f34481a068108aeaa6838e" + } + } + } + } + ] +[08/12/24 15:16:37] INFO Subtask ee5f11666ded4dc39b94e4c59d18fbc7 + Response: Output of "PromptSummaryTool.summarize" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "669d29a704444176be93d09d014298df" +[08/12/24 15:16:38] INFO Subtask d9b2dd9f96d841f49f5d460e33905183 + Actions: [ + { + "tag": "call_QgMk1M1UuD6DAnxjfQz1MH6X", + "name": "FileManagerTool", + "path": "save_memory_artifacts_to_disk", + "input": { + "values": { + "dir_name": ".", + "file_name": "griptape.txt", + "memory_name": "TaskMemory", + "artifact_namespace": "669d29a704444176be93d09d014298df" + } + } + } + ] + INFO Subtask d9b2dd9f96d841f49f5d460e33905183 + Response: Successfully saved memory artifacts to disk +[08/12/24 15:16:39] INFO ToolkitTask f5b44fe1dadc4e6688053df71d97e0de + Output: The content from https://www.griptape.ai has been summarized and stored in a file called `griptape.txt`. ``` ## Tool Task @@ -280,7 +304,7 @@ This task takes a python function, and authors can elect to return a custom arti To generate an image, use one of the following [Image Generation Tasks](../../reference/griptape/tasks/index.md). All Image Generation Tasks accept an [Image Generation Engine](../engines/image-generation-engines.md) configured to use an [Image Generation Driver](../drivers/image-generation-drivers.md). -All successful Image Generation Tasks will always output an [Image Artifact](../data/artifacts.md#imageartifact). Each task can be configured to additionally write the generated image to disk by providing either the `output_file` or `output_dir` field. The `output_file` field supports file names in the current directory (`my_image.png`), relative directory prefixes (`images/my_image.png`), or absolute paths (`/usr/var/my_image.png`). By setting `output_dir`, the task will generate a file name and place the image in the requested directory. +All successful Image Generation Tasks will always output an [Image Artifact](../data/artifacts.md#image). Each task can be configured to additionally write the generated image to disk by providing either the `output_file` or `output_dir` field. The `output_file` field supports file names in the current directory (`my_image.png`), relative directory prefixes (`images/my_image.png`), or absolute paths (`/usr/var/my_image.png`). By setting `output_dir`, the task will generate a file name and place the image in the requested directory. ### Prompt Image Generation Task @@ -318,7 +342,7 @@ The [Outpainting Image Generation Task](../../reference/griptape/tasks/outpainti The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) performs a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/image-query-engines.md) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. -This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#textartifact)) and a list of [Image Artifacts](../data/artifacts.md#imageartifact) or a Callable returning these two values. +This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#text)) and a list of [Image Artifacts](../data/artifacts.md#image) or a Callable returning these two values. ```python --8<-- "docs/griptape-framework/structures/src/tasks_15.py" diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 87bb2ae89..9161268ae 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -7,7 +7,7 @@ search: A [Workflow](../../reference/griptape/structures/workflow.md) is a non-sequential DAG that can be used for complex concurrent scenarios with tasks having multiple inputs. -You can access the final output of the Workflow by using the [output](../../reference/griptape/structures/agent.md#griptape.structures.structure.Structure.output) attribute. +You can access the final output of the Workflow by using the [output](../../reference/griptape/structures/structure.md#griptape.structures.structure.Structure.output) attribute. ## Context diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 808849dae..d97a9347c 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -19,37 +19,72 @@ Here is an example of a Pipeline using Tools: ``` ``` -[09/08/23 10:53:56] INFO ToolkitTask 979d99f68766423ea05b367e951281bc - Input: Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt -[09/08/23 10:54:02] INFO Subtask 97bd154a71e14a1699f8152e50490a71 - Thought: The first step is to load the content of the webpage. I can use the WebScraper tool with the get_content - activity for this. - - Action: {"name": "WebScraper", "path": "get_content", "input": {"values": {"url": - "https://www.griptape.ai"}}} -[09/08/23 10:54:03] INFO Subtask 97bd154a71e14a1699f8152e50490a71 - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and - artifact_namespace "9eb6f5828cf64356bf323f11d28be27e" -[09/08/23 10:54:09] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba - Thought: Now that the webpage content is stored in memory, I can use the TaskMemory tool with the summarize - activity to summarize the content. - Action: {"name": "TaskMemoryTool", "path": "summarize", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e"}}} -[09/08/23 10:54:12] INFO Subtask 7ee08458ce154e3d970711b7d3ed79ba - Response: Griptape is an open source framework that allows developers to build and deploy AI applications - using large language models (LLMs). It provides the ability to create conversational and event-driven apps that - can access and manipulate data securely. Griptape enforces structures like sequential pipelines and workflows for - predictability, while also allowing for creativity by safely prompting LLMs with external APIs and data stores. - The framework can be used to create AI systems that operate across both predictability and creativity dimensions. - Griptape Cloud is a managed platform for deploying and managing AI apps. -[09/08/23 10:54:24] INFO Subtask a024949a9a134f058f2e6b7c379c8713 - Thought: Now that I have the summary, I can store it in a file called griptape.txt. I can use the FileManager - tool with the save_file_to_disk activity for this. - Action: {"name": "FileManager", "path": "save_file_to_disk", "input": {"values": - {"memory_name": "TaskMemory", "artifact_namespace": "9eb6f5828cf64356bf323f11d28be27e", "path": - "griptape.txt"}}} - INFO Subtask a024949a9a134f058f2e6b7c379c8713 - Response: saved successfully -[09/08/23 10:54:27] INFO ToolkitTask 979d99f68766423ea05b367e951281bc - Output: The summary of the webpage https://www.griptape.ai has been successfully stored in a file called - griptape.txt. +[08/12/24 15:18:19] INFO ToolkitTask 48ac0486e5374e1ea53e8d2b955e511f + Input: Load https://www.griptape.ai, summarize it, and store it in griptape.txt +[08/12/24 15:18:20] INFO Subtask 3b8365c077ae4a7e94087bfeff7a858c + Actions: [ + { + "tag": "call_P6vaURTXfiYBJZolTkUSRHRc", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://www.griptape.ai" + } + } + } + ] + INFO Subtask 3b8365c077ae4a7e94087bfeff7a858c + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "301e546f4450489ea4680645297092a2" +[08/12/24 15:18:21] INFO Subtask 930e9ca52e4140a48cce1e47368d45be + Actions: [ + { + "tag": "call_0VOTEvinRer7rG4oEirBYcow", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "301e546f4450489ea4680645297092a2" + } + } + } + } + ] +[08/12/24 15:18:24] INFO Subtask 930e9ca52e4140a48cce1e47368d45be + Response: Griptape offers a comprehensive solution for building, deploying, and scaling AI applications in the cloud. It provides developers + with a framework and cloud services to create retrieval-driven AI-powered applications without needing extensive knowledge of AI or prompt + engineering. The Griptape Framework allows developers to build business logic using Python, ensuring better security, performance, and + cost-efficiency. Griptape Cloud handles infrastructure management, enabling seamless deployment and scaling of applications. Key features + include automated data preparation (ETL), retrieval as a service (RAG), and a structure runtime (RUN) for building AI agents, pipelines, and + workflows. Griptape also offers solutions for custom projects, turnkey SaaS offerings, and finished applications. +[08/12/24 15:18:27] INFO Subtask d0f22504f576401f8d7e8ea78270a376 + Actions: [ + { + "tag": "call_zdUe2vdR0DCfR6LKcxjI6ayb", + "name": "FileManagerTool", + "path": "save_content_to_file", + "input": { + "values": { + "path": "griptape.txt", + "content": "Griptape offers a comprehensive solution for building, deploying, and scaling AI applications in the cloud. It provides + developers with a framework and cloud services to create retrieval-driven AI-powered applications without needing extensive knowledge of AI or + prompt engineering. The Griptape Framework allows developers to build business logic using Python, ensuring better security, performance, and + cost-efficiency. Griptape Cloud handles infrastructure management, enabling seamless deployment and scaling of applications. Key features + include automated data preparation (ETL), retrieval as a service (RAG), and a structure runtime (RUN) for building AI agents, pipelines, and + workflows. Griptape also offers solutions for custom projects, turnkey SaaS offerings, and finished applications." + } + } + } + ] + INFO Subtask d0f22504f576401f8d7e8ea78270a376 + Response: Successfully saved file +[08/12/24 15:18:28] INFO ToolkitTask 48ac0486e5374e1ea53e8d2b955e511f + Output: The content from https://www.griptape.ai has been summarized and stored in griptape.txt. + INFO PromptTask 4a9c59b1c06d4c549373d243a12f1285 + Input: Say the following in spanish: The content from https://www.griptape.ai has been summarized and stored in griptape.txt. + INFO PromptTask 4a9c59b1c06d4c549373d243a12f1285 + Output: El contenido de https://www.griptape.ai ha sido resumido y almacenado en griptape.txt. ``` diff --git a/docs/griptape-framework/tools/src/index_1.py b/docs/griptape-framework/tools/src/index_1.py index 488dcfbc8..a894e2037 100644 --- a/docs/griptape-framework/tools/src/index_1.py +++ b/docs/griptape-framework/tools/src/index_1.py @@ -1,13 +1,17 @@ from griptape.structures import Pipeline from griptape.tasks import ToolkitTask -from griptape.tools import FileManagerTool, TaskMemoryTool, WebScraperTool +from griptape.tools import FileManagerTool, PromptSummaryTool, WebScraperTool pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraperTool(off_prompt=True), FileManagerTool(off_prompt=True), TaskMemoryTool(off_prompt=False)], + tools=[ + WebScraperTool(off_prompt=True), + FileManagerTool(off_prompt=True), + PromptSummaryTool(off_prompt=False), + ], ), ) diff --git a/docs/griptape-tools/official-tools/aws-iam-tool.md b/docs/griptape-tools/official-tools/aws-iam-tool.md index 1f594cff0..8be54afb5 100644 --- a/docs/griptape-tools/official-tools/aws-iam-tool.md +++ b/docs/griptape-tools/official-tools/aws-iam-tool.md @@ -6,50 +6,59 @@ This tool enables LLMs to make AWS IAM API requests. --8<-- "docs/griptape-tools/official-tools/src/aws_iam_tool_1.py" ``` ``` -[09/11/23 16:45:45] INFO Task 890fcf77fb074c9490d5c91563e0c995 - Input: List all my IAM users -[09/11/23 16:45:51] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 - Thought: To list all IAM users, I can use the - AwsIamTool tool with the list_users activity. - This activity does not require any input. - - Action: {"name": "AwsIamTool", - "path": "list_users"} -[09/11/23 16:45:52] INFO Subtask f2f0809ee10d4538972ed01fdd6a2fb8 - Response: Output of "AwsIamTool.list_users" - was stored in memory with memory_name - "TaskMemory" and artifact_namespace - "51d22a018a434904a5da3bb8d4f763f7" -[09/11/23 16:45:59] INFO Subtask 8e0e918571544eeebf46de898466c48c - Thought: The output of the list_users activity is - stored in memory. I can retrieve this information - using the TaskMemory tool with the summarize - activity. - Action: {"name": "TaskMemoryTool", "path": - "summarize", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "51d22a018a434904a5da3bb8d4f763f7"}}} -[09/11/23 16:46:03] INFO Subtask 8e0e918571544eeebf46de898466c48c - Response: The text provides information about - two different users in an AWS IAM system. The first - user is named "example-user-1" and has a - user ID of "AIDASHBEHWJLQV2IOYDHM". The second user - is named "example-user-2" and - has a user ID of "AIDASHBEHWJLWHVS76C6X". Both - users have a path of "/", and their ARNs (Amazon - Resource Names) indicate their location in the IAM - system. The first user was created on July 18, - 2023, at 20:29:27 UTC, while the second user was - created on August 29, 2023, at 20:56:37 UTC. -[09/11/23 16:46:13] INFO Task 890fcf77fb074c9490d5c91563e0c995 - Output: There are two IAM users in your AWS - account: - - 1. User "example-user-1" with user ID - "AIDASHBEHWJLQV2IOYDHM", created on July 18, 2023, - at 20:29:27 UTC. - 2. User "example-user-2" with - user ID "AIDASHBEHWJLWHVS76C6X", created on August - 29, 2023, at 20:56:37 UTC. +[08/12/24 14:56:59] INFO ToolkitTask 12345abcd67890efghijk1112131415 + Input: List all my IAM users +[08/12/24 14:57:00] INFO Subtask 54321dcba09876fedcba1234567890ab + Actions: [ + { + "tag": "call_OxhQ9ITNIFq0WjkSnOCYAx8h", + "name": "AwsIamClient", + "path": "list_users", + "input": { + "values": {} + } + } + ] + INFO Subtask 54321dcba09876fedcba1234567890ab + Response: {'Path': '/', 'UserName': 'dummy-user-1', 'UserId': 'AIDAAAAAA1111AAAAAA1111', 'Arn': + 'arn:aws:iam::123456789012:user/dummy-user-1', 'CreateDate': datetime.datetime(2024, 8, 7, 15, 8, 7, tzinfo=tzutc())} + {'Path': '/', 'UserName': 'dummy-user-2', 'UserId': 'AIDBBBBBB2222BBBBBB2222', 'Arn': + 'arn:aws:iam::123456789012:user/dummy-user-2', 'CreateDate': datetime.datetime(2023, 7, 18, 20, 29, 27, tzinfo=tzutc())} + + {'Path': '/', 'UserName': 'dummy-user-3', 'UserId': 'AIDCCCCCC3333CCCCCC3333', 'Arn': + 'arn:aws:iam::123456789012:user/dummy-user-3', 'CreateDate': datetime.datetime(2024, 7, 15, 19, 39, 41, tzinfo=tzutc())} + + {'Path': '/', 'UserName': 'dummy-user-4', 'UserId': 'AIDDDDDDD4444DDDDDD4444', 'Arn': + 'arn:aws:iam::123456789012:user/dummy-user-4', 'CreateDate': datetime.datetime(2024, 8, 2, 19, 28, 31, tzinfo=tzutc())} + + {'Path': '/', 'UserName': 'dummy-user-5', 'UserId': 'AIDEEEEE5555EEEEE5555', 'Arn': + 'arn:aws:iam::123456789012:user/dummy-user-5', 'CreateDate': datetime.datetime(2023, 8, 29, 20, 56, 37, tzinfo=tzutc())} +[08/12/24 14:57:08] INFO ToolkitTask 12345abcd67890efghijk1112131415 + Output: Here are all your IAM users: + + 1. **Username:** dummy-user-1 + - **UserId:** AIDAAAAAA1111AAAAAA1111 + - **Arn:** arn:aws:iam::123456789012:user/dummy-user-1 + - **CreateDate:** 2024-08-07 + + 2. **Username:** dummy-user-2 + - **UserId:** AIDBBBBBB2222BBBBBB2222 + - **Arn:** arn:aws:iam::123456789012:user/dummy-user-2 + - **CreateDate:** 2023-07-18 + + 3. **Username:** dummy-user-3 + - **UserId:** AIDCCCCCC3333CCCCCC3333 + - **Arn:** arn:aws:iam::123456789012:user/dummy-user-3 + - **CreateDate:** 2024-07-15 + + 4. **Username:** dummy-user-4 + - **UserId:** AIDDDDDDD4444DDDDDD4444 + - **Arn:** arn:aws:iam::123456789012:user/dummy-user-4 + - **CreateDate:** 2024-08-02 + + 5. **Username:** dummy-user-5 + - **UserId:** AIDEEEEE5555EEEEE5555 + - **Arn:** arn:aws:iam::123456789012:user/dummy-user-5 + - **CreateDate:** 2023-08-29 ``` diff --git a/docs/griptape-tools/official-tools/aws-s3-tool.md b/docs/griptape-tools/official-tools/aws-s3-tool.md index 9594861a9..c6a972d76 100644 --- a/docs/griptape-tools/official-tools/aws-s3-tool.md +++ b/docs/griptape-tools/official-tools/aws-s3-tool.md @@ -6,45 +6,36 @@ This tool enables LLMs to make AWS S3 API requests. --8<-- "docs/griptape-tools/official-tools/src/aws_s3_tool_1.py" ``` ``` -[09/11/23 16:49:35] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 - Input: List all my S3 buckets. -[09/11/23 16:49:41] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d - Thought: To list all S3 buckets, I can use the - "list_s3_buckets" activity of the "AwsS3Tool" - tool. This activity doesn't require any input. - - Action: {"name": "AwsS3Tool", - "path": "list_s3_buckets"} -[09/11/23 16:49:42] INFO Subtask 9fc44f5c8e73447ba737283cb2ef7f5d - Response: Output of - "AwsS3Tool.list_s3_buckets" was stored in memory - with memory_name "TaskMemory" and - artifact_namespace - "f2592085fd4a430286a46770ea508cc9" -[09/11/23 16:49:50] INFO Subtask 0e9bb639a432431a92ef40a8c085ca0f - Thought: The output of the "list_s3_buckets" - activity is stored in memory. I can retrieve this - information using the "summarize" activity of the - "TaskMemory" tool. - Action: {"name": "TaskMemoryTool", "path": - "summarize", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "f2592085fd4a430286a46770ea508cc9"}}} -[09/11/23 16:49:52] INFO Subtask 0e9bb639a432431a92ef40a8c085ca0f - Response: The text consists of multiple - dictionaries, each containing a 'Name' and - 'CreationDate' key-value pair. The 'Name' - represents the name of a resource or bucket, while - the 'CreationDate' represents the date and time - when the resource or bucket was created. -[09/11/23 16:50:03] INFO Task 8bf7538e217a4b5a8472829f5eee75b9 - Output: The names of your S3 buckets are as - follows: - 1. Bucket Name: 'example-bucket-1', Creation Date: - '2022-01-01T00:00:00Z' - 2. Bucket Name: 'example-bucket-2', Creation Date: - '2022-01-02T00:00:00Z' - 3. Bucket Name: 'example-bucket-3', Creation Date: - '2022-01-03T00:00:00Z' - Please note that the creation dates are in UTC. +[08/12/24 14:51:36] INFO ToolkitTask bfc329ebc7d34497b429ab0d18ff7e7b + Input: List all my S3 buckets. +[08/12/24 14:51:37] INFO Subtask dfd07f9e204c4a3d8f55ca3eb9d37ec5 + Actions: [ + { + "tag": "call_pZQ05Zmm6lSbEcvPWt4XEDj6", + "name": "AwsS3Client", + "path": "list_s3_buckets", + "input": { + "values": {} + } + } + ] + INFO Subtask dfd07f9e204c4a3d8f55ca3eb9d37ec5 + Response: {'Name': 'dummy-bucket-1', 'CreationDate': datetime.datetime(2023, 9, 14, 15, 41, 46, + tzinfo=tzutc())} + + {'Name': 'dummy-bucket-2', 'CreationDate': datetime.datetime(2023, 9, 14, 15, 40, 33, tzinfo=tzutc())} + + {'Name': 'dummy-bucket-3', 'CreationDate': datetime.datetime(2023, 6, 23, 20, 19, 53, tzinfo=tzutc())} + + {'Name': 'dummy-bucket-4', 'CreationDate': datetime.datetime(2023, 8, 19, 17, 17, 13, tzinfo=tzutc())} + + {'Name': 'dummy-bucket-5', 'CreationDate': datetime.datetime(2024, 2, 15, 23, 17, 21, tzinfo=tzutc())} +[08/12/24 14:51:43] INFO ToolkitTask bfc329ebc7d34497b429ab0d18ff7e7b + Output: Here are all your S3 buckets: + + 1. dummy-bucket-1 (Created on 2023-09-14) + 2. dummy-bucket-2 (Created on 2023-09-14) + 3. dummy-bucket-3 (Created on 2023-06-23) + 4. dummy-bucket-4 (Created on 2023-08-19) + 5. dummy-bucket-5 (Created on 2024-02-15) ``` diff --git a/docs/griptape-tools/official-tools/computer-tool.md b/docs/griptape-tools/official-tools/computer-tool.md index 758dd8714..f21d4bda9 100644 --- a/docs/griptape-tools/official-tools/computer-tool.md +++ b/docs/griptape-tools/official-tools/computer-tool.md @@ -8,80 +8,40 @@ You can specify a local working directory and environment variables during tool --8<-- "docs/griptape-tools/official-tools/src/computer_tool_1.py" ``` ``` -[09/11/23 16:24:15] INFO Task d08009ee983c4286ba10f83bcf3080e6 - Input: Run this shell command for me: touch - my_new_file.txt -[09/11/23 16:24:21] INFO Subtask 1ec0f9ea528e44b89eb9d41da0e00856 - Thought: The user wants to create a new file named - "my_new_file.txt". I can do this by executing the - shell command "touch my_new_file.txt" using the - Computer tool with the execute_command activity. - - Action: {"name": "Computer", - "path": "execute_command", "input": {"values": - {"command": "touch my_new_file.txt"}}} -[09/11/23 16:24:22] INFO Subtask 1ec0f9ea528e44b89eb9d41da0e00856 - Response: Output of "Computer.execute_command" - was stored in memory with memory_name - "TaskMemory" and artifact_namespace - "54ffbc84a37a497480cab6ab4f904e7e" -[09/11/23 16:24:28] INFO Subtask f3e1b1d09b4c46babda27342680aa770 - Thought: The command has been executed and the - output is stored in memory. However, the "touch" - command does not produce any output when it - successfully creates a file. To confirm that the - file was created, I can list the files in the - current directory using the "ls" command. - - Action: {"name": "Computer", - "path": "execute_command", "input": {"values": - {"command": "ls"}}} -[09/11/23 16:24:29] INFO Subtask f3e1b1d09b4c46babda27342680aa770 - Response: Output of "Computer.execute_command" - was stored in memory with memory_name - "TaskMemory" and artifact_namespace - "82bc4937564e4901b7fc51fced45b643" -[09/11/23 16:24:40] INFO Subtask 36f0bbfdd7974e6cb52766ba21dc64e0 - Thought: The output of the "ls" command is stored - in memory. I need to retrieve this output to check - if "my_new_file.txt" is listed, which would confirm - that the file was created successfully. - Action: {"name": "TaskMemoryTool", "path": - "query", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "82bc4937564e4901b7fc51fced45b643", "query": "Is - my_new_file.txt in the list of files?"}}} -[09/11/23 16:24:41] INFO Subtask 36f0bbfdd7974e6cb52766ba21dc64e0 - Response: Yes. -[09/11/23 16:24:42] INFO Task d08009ee983c4286ba10f83bcf3080e6 - Output: The file "my_new_file.txt" has been - successfully created. - INFO Task d08009ee983c4286ba10f83bcf3080e6 - Input: Run this shell command for me: echo 'This is - the content of the file.' > my_new_file.txt -[09/11/23 16:24:53] INFO Subtask a0a3fb162d6d4f3398a98c6d3604a491 - Thought: The user wants to write the text 'This is - the content of the file.' into the file - 'my_new_file.txt'. I can achieve this by using the - 'execute_command' activity of the 'Computer' tool. - - Action: {"name": "Computer", - "path": "execute_command", "input": {"values": - {"command": "echo 'This is the content of the - file.' > my_new_file.txt"}}} - INFO Subtask a0a3fb162d6d4f3398a98c6d3604a491 - Response: Output of "Computer.execute_command" - was stored in memory with memory_name - "TaskMemory" and artifact_namespace - "ec20f2e7ec674e0286c8d1f05d528957" -[09/11/23 16:25:00] INFO Task d08009ee983c4286ba10f83bcf3080e6 - Output: The text 'This is the content of the file.' - has been successfully written into - 'my_new_file.txt'. - INFO Task d08009ee983c4286ba10f83bcf3080e6 - Input: Run this shell command for me: cat - my_new_file.txt -[09/11/23 16:25:10] INFO Task d08009ee983c4286ba10f83bcf3080e6 - Output: The content of the file 'my_new_file.txt' - is: 'This is the content of the file.' +❮ poetry run python src/docs/task-memory.py +[08/12/24 15:13:56] INFO ToolkitTask 203ee958d1934811afe0bb86fb246e86 + Input: Make 2 files and then list the files in the current directory +[08/12/24 15:13:58] INFO Subtask eb4e843b6f37498f9f0e85ada68114ac + Actions: [ + { + "tag": "call_S17vPQsMCqWY1Lt5x8NtDnTK", + "name": "Computer", + "path": "execute_command", + "input": { + "values": { + "command": "touch file1.txt file2.txt" + } + } + } + ] + INFO Subtask eb4e843b6f37498f9f0e85ada68114ac + Response: Tool returned an empty value +[08/12/24 15:13:59] INFO Subtask 032770e7697d44f6a0c8559bfea60420 + Actions: [ + { + "tag": "call_n61SVDYUGWTt681BaDSaHgt1", + "name": "Computer", + "path": "execute_command", + "input": { + "values": { + "command": "ls" + } + } + } + ] + INFO Subtask 032770e7697d44f6a0c8559bfea60420 + Response: file1.txt + file2.txt +[08/12/24 15:14:00] INFO ToolkitTask 203ee958d1934811afe0bb86fb246e86 + Output: file1.txt, file2.txt ``` diff --git a/docs/griptape-tools/official-tools/extraction-tool.md b/docs/griptape-tools/official-tools/extraction-tool.md new file mode 100644 index 000000000..5b0486ffd --- /dev/null +++ b/docs/griptape-tools/official-tools/extraction-tool.md @@ -0,0 +1,53 @@ +The [ExractionTool](../../reference/griptape/tools/extraction/tool.md) enables LLMs to extract structured text from unstructured data. + +```python +--8<-- "docs/griptape-tools/official-tools/src/extraction_tool_1.py" +``` +``` +[08/12/24 15:58:03] INFO ToolkitTask 43b3d209a83c470d8371b7ef4af175b4 + Input: Load https://griptape.ai and extract key info +[08/12/24 15:58:05] INFO Subtask 6a9a63802faf4717bab24bbbea2cb49b + Actions: [ + { + "tag": "call_SgrmWdXaYTQ1Cz9iB0iIZSYD", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://griptape.ai" + } + } + } + ] +[08/12/24 15:58:06] INFO Subtask 6a9a63802faf4717bab24bbbea2cb49b + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "bf1c865b82554c9e896cb514bb86844c" +[08/12/24 15:58:07] INFO Subtask c06388d6079541d5aaff25c30e322c51 + Actions: [ + { + "tag": "call_o3MrpM01OnhCfpxsMe85tpDF", + "name": "ExtractionTool", + "path": "extract_json", + "input": { + "values": { + "data": { + "memory_name": "TaskMemory", + "artifact_namespace": "bf1c865b82554c9e896cb514bb86844c" + } + } + } + } + ] +[08/12/24 15:58:11] INFO Subtask c06388d6079541d5aaff25c30e322c51 + Response: {"company_name": "Griptape", "industry": "AI Applications", "product_features": ["Turn any developer into an AI developer.", "Build + your business logic using predictable, programmable python.", "Off-Prompt\u2122 for better security, performance, and lower costs.", "Deploy and + run the ETL, RAG, and structures you developed.", "Simple API abstractions.", "Skip the infrastructure management.", "Scale seamlessly with + workload requirements.", "Clean and clear abstractions for building Gen AI Agents, Systems of Agents, Pipelines, Workflows, and RAG + implementations.", "Build ETL pipelines to prep data for secure LLM access.", "Compose retrieval patterns for fast, accurate, detailed + information.", "Write agents, pipelines, and workflows to integrate business logic.", "Automated Data Prep (ETL): Connect any data source, + extract, prep/transform, and load into a vector database index.", "Retrieval as a Service (RAG): Generate answers, summaries, and details from + your own data with ready-made or custom retrieval patterns.", "Structure Runtime (RUN): Build AI agents, pipelines, and workflows for real-time + interfaces, transactional processes, and batch workloads."]} +[08/12/24 15:58:14] INFO ToolkitTask 43b3d209a83c470d8371b7ef4af175b4 + Output: Extracted key information from Griptape's website. +``` diff --git a/docs/griptape-tools/official-tools/file-manager-tool.md b/docs/griptape-tools/official-tools/file-manager-tool.md index 5f27b8da5..2c27c86ea 100644 --- a/docs/griptape-tools/official-tools/file-manager-tool.md +++ b/docs/griptape-tools/official-tools/file-manager-tool.md @@ -10,11 +10,11 @@ This tool enables LLMs to save and load files. Input: Can you get me the sample1.txt file? [09/12/23 12:08:04] INFO Subtask ddcf48d970ce4edbbc22a46b2f83ec4f Thought: The user wants the content of the file - named "sample1.txt". I can use the FileManager tool + named "sample1.txt". I can use the FileManagerTool tool with the activity "load_files_from_disk" to load the file from the disk. - Action: {"name": "FileManager", + Action: {"name": "FileManagerTool", "path": "load_files_from_disk", "input": {"values": {"paths": ["sample1.txt"]}}} INFO Subtask ddcf48d970ce4edbbc22a46b2f83ec4f diff --git a/docs/griptape-tools/official-tools/prompt-summary-tool.md b/docs/griptape-tools/official-tools/prompt-summary-tool.md new file mode 100644 index 000000000..7afecf57b --- /dev/null +++ b/docs/griptape-tools/official-tools/prompt-summary-tool.md @@ -0,0 +1,105 @@ +The [PromptSummaryTool](../../reference/griptape/tools/prompt_summary/tool.md) enables LLMs summarize text data. + +```python +--8<-- "docs/griptape-tools/official-tools/src/prompt_summary_tool_1.py" +``` +``` +[08/12/24 15:54:46] INFO ToolkitTask 8be73eb542c44418ba880399044c017a + Input: How can I build Neovim from source for MacOS according to this https://github.com/neovim/neovim/blob/master/BUILD.md +[08/12/24 15:54:47] INFO Subtask cd362a149e1d400997be93c1342d1663 + Actions: [ + { + "tag": "call_DGsOHC4AVxhV7RPVA7q3rATX", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://github.com/neovim/neovim/blob/master/BUILD.md" + } + } + } + ] +[08/12/24 15:54:49] INFO Subtask cd362a149e1d400997be93c1342d1663 + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "990b689c57de4581b8715963c0aecfe3" +[08/12/24 15:54:50] INFO Subtask 919a4a9eb900439ab9bfbf6e921feba3 + Actions: [ + { + "tag": "call_DK3a4MYoElJbaCrUJekBReIc", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "990b689c57de4581b8715963c0aecfe3" + } + } + } + } + ] +[08/12/24 15:54:56] INFO Subtask 919a4a9eb900439ab9bfbf6e921feba3 + Response: The text provides detailed instructions for building and installing Neovim from source on various operating systems, including Linux, + BSD, Windows, and macOS. Key points include: + + 1. **Pre-requisites**: Ensure all build dependencies are installed. + 2. **Cloning and Building**: + - Clone the Neovim repository. + - Use `make` with appropriate `CMAKE_BUILD_TYPE` (Release, Debug, RelWithDebInfo). + - For stable releases, checkout the stable branch. + - Use `gmake` on BSD and follow specific instructions for Windows using MSVC. + 3. **Installation**: + - Default install location is `/usr/local`. + - On Debian/Ubuntu, build a DEB package for clean installation. + - Custom install locations can be set using `CMAKE_INSTALL_PREFIX`. + 4. **Dependencies**: + - Third-party dependencies are automatically downloaded. + - Use `Ninja` and `ccache` for faster builds. + 5. **Platform-Specific Instructions**: + - Detailed steps for building on Windows using Visual Studio. + - Instructions for building on macOS using Homebrew or MacPorts. + - Specific commands for building on NixOS, Cygwin, and MSYS2. + 6. **Debugging and Development**: + - Use `RelWithDebInfo` for optimized builds with debug info. + - Instructions for using debuggers and handling build cache. + 7. **Localization**: + - Commands for checking and updating translations. + + The text also includes troubleshooting tips and links to additional resources for further guidance. +[08/12/24 15:55:01] INFO ToolkitTask 8be73eb542c44418ba880399044c017a + Output: To build Neovim from source on macOS, follow these steps: + + 1. **Install Dependencies**: + Ensure you have the necessary build dependencies installed. You can use Homebrew to install them: + ```sh + brew install ninja libtool automake cmake pkg-config gettext curl + ``` + + 2. **Clone the Neovim Repository**: + Clone the Neovim repository from GitHub: + ```sh + git clone https://github.com/neovim/neovim.git + cd neovim + ``` + + 3. **Checkout the Stable Branch (Optional)**: + If you want to build the stable release, checkout the stable branch: + ```sh + git checkout stable + ``` + + 4. **Build Neovim**: + Use `make` to build Neovim. You can specify the build type (Release, Debug, RelWithDebInfo): + ```sh + make CMAKE_BUILD_TYPE=Release + ``` + + 5. **Install Neovim**: + After building, install Neovim. The default install location is `/usr/local`: + ```sh + sudo make install + ``` + + By following these steps, you should be able to build and install Neovim from source on macOS. For more detailed instructions and + troubleshooting tips, refer to the [BUILD.md](https://github.com/neovim/neovim/blob/master/BUILD.md) file in the Neovim repository. +``` diff --git a/docs/griptape-tools/official-tools/query-tool.md b/docs/griptape-tools/official-tools/query-tool.md new file mode 100644 index 000000000..4a4f2bf33 --- /dev/null +++ b/docs/griptape-tools/official-tools/query-tool.md @@ -0,0 +1,85 @@ +The [QueryTool](../../reference/griptape/tools/query/tool.md) enables Agents to query unstructured data for specific information. + +```python +--8<-- "docs/griptape-tools/official-tools/src/query_tool_1.py" +``` +``` +[08/12/24 15:49:23] INFO ToolkitTask a88abda2e5324bdf81a3e2b99c26b9df + Input: Tell me about the architecture as described here: https://neovim.io/doc/user/vim_diff.html +[08/12/24 15:49:24] INFO Subtask 3dc9910bcac44c718b3aedd6222e372a + Actions: [ + { + "tag": "call_VY4r5YRc2QDjtBvn89z5PH8E", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://neovim.io/doc/user/vim_diff.html" + } + } + } + ] +[08/12/24 15:49:25] INFO Subtask 3dc9910bcac44c718b3aedd6222e372a + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "bec6deeac5f84e369c41210e67905415" +[08/12/24 15:49:26] INFO Subtask f41d2189ecff4458acb8e6dadb5b13aa + Actions: [ + { + "tag": "call_GtBICZi6oIeL85Aj7q5szul9", + "name": "QueryTool", + "path": "query", + "input": { + "values": { + "query": "architecture", + "content": { + "memory_name": "TaskMemory", + "artifact_namespace": "bec6deeac5f84e369c41210e67905415" + } + } + } + } + ] +[08/12/24 15:49:33] INFO Subtask f41d2189ecff4458acb8e6dadb5b13aa + Response: The architecture of Neovim (Nvim) is designed to improve stability, performance, and extensibility. Here are some key points about + Nvim's architecture: + + 1. **Decoupled UI**: The Nvim UI is decoupled from the core editor. All UIs, including the built-in TUI (terminal user interface), are plugins + that connect to a Nvim server. Multiple Nvim UI clients can connect to the same Nvim editor server. + + 2. **External Plugins**: External plugins run in separate processes, which improves stability and allows those plugins to work without blocking + the editor. Even "legacy" Python and Ruby plugins, which use the old Vim interfaces, run out-of-process, so they cannot crash Nvim. + + 3. **Libuv**: Platform and I/O facilities are built upon libuv. Nvim benefits from libuv features and bug fixes, and other projects benefit from + improvements to libuv by Nvim developers. + + 4. **Robust API**: Nvim has a robust API, which is used instead of exposing internal test functions like Vim's `test_autochdir()`, + `test_settime()`, etc. + + 5. **Feature Inclusion**: Nvim always includes all features, in contrast to Vim, which ships various combinations of 100+ optional features. + This reduces the surface area for bugs and removes a common source of confusion and friction for users. + + 6. **External Plugins and Extensions**: Nvim avoids features that cannot be provided on all platforms, delegating those to external + plugins/extensions. + + These architectural decisions make Nvim more stable, extensible, and user-friendly compared to traditional Vim. +[08/12/24 15:49:37] INFO ToolkitTask a88abda2e5324bdf81a3e2b99c26b9df + Output: The architecture of Neovim (Nvim) is designed to enhance stability, performance, and extensibility. Here are the key points: + + 1. **Decoupled UI**: The user interface (UI) is separated from the core editor. All UIs, including the built-in terminal user interface (TUI), + are plugins that connect to a Nvim server. This allows multiple UI clients to connect to the same Nvim editor server. + + 2. **External Plugins**: Plugins run in separate processes, which improves stability and prevents them from blocking the editor. Even older + Python and Ruby plugins run out-of-process, ensuring they cannot crash Nvim. + + 3. **Libuv**: Nvim's platform and I/O facilities are built on libuv, benefiting from its features and bug fixes. Improvements made by Nvim + developers to libuv also benefit other projects. + + 4. **Robust API**: Nvim provides a robust API, avoiding the need to expose internal test functions like Vim does. + + 5. **Feature Inclusion**: Unlike Vim, which ships with various combinations of optional features, Nvim includes all features by default. This + reduces bugs and user confusion. + + 6. **External Plugins and Extensions**: Nvim delegates features that cannot be provided on all platforms to external plugins/extensions. + + These architectural choices make Nvim more stable, extensible, and user-friendly compared to traditional Vim. +``` diff --git a/docs/griptape-tools/official-tools/sql-tool.md b/docs/griptape-tools/official-tools/sql-tool.md index b20327013..ed8aae2a0 100644 --- a/docs/griptape-tools/official-tools/sql-tool.md +++ b/docs/griptape-tools/official-tools/sql-tool.md @@ -6,38 +6,51 @@ This tool enables LLMs to execute SQL statements via [SQLAlchemy](https://www.sq --8<-- "docs/griptape-tools/official-tools/src/sql_tool_1.py" ``` ``` -[09/11/23 17:02:55] INFO Task d8331f8705b64b4b9d9a88137ed73f3f - Input: SELECT * FROM people; -[09/11/23 17:03:02] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 - Thought: The user wants to retrieve all records - from the 'people' table. I can use the SqlTool - tool to execute this query. - - Action: {"name": "SqlTool", - "path": "execute_query", "input": {"values": - {"sql_query": "SELECT * FROM people;"}}} -[09/11/23 17:03:03] INFO Subtask 46c2f8926ce9469e9ca6b1b3364e3e41 - Response: Output of "SqlTool.execute_query" - was stored in memory with memory_name - "TaskMemory" and artifact_namespace - "217715ba3e444e4985bee223df5716a8" -[09/11/23 17:03:11] INFO Subtask e51f05449647482caa3051378ab5cb8c - Thought: The output of the SQL query has been - stored in memory. I can retrieve this data using - the TaskMemory's 'summarize' activity. - Action: {"name": "TaskMemoryTool", "path": - "summarize", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "217715ba3e444e4985bee223df5716a8"}}} -[09/11/23 17:03:12] INFO Subtask e51f05449647482caa3051378ab5cb8c - Response: The text includes a list of employees - with their respective IDs, names, positions. There - are two employees named Tanya Cooley who are both - managers, and two employees named John Doe who are - both coders. -[09/11/23 17:03:17] INFO Task d8331f8705b64b4b9d9a88137ed73f3f - Output: The 'people' table contains records of - several employees. Notably, there are two employees - named Tanya Cooley who are both managers, and two - employees named John Doe who are both coders. +[08/12/24 14:59:31] INFO ToolkitTask e302f7315d1a4f939e0125103ff4f09f + Input: SELECT * FROM people; +[08/12/24 14:59:34] INFO Subtask 809d1a281b85447f90706d431b77b845 + Actions: [ + { + "tag": "call_dCxHWwPwgmDvDKVd3QeOzyuT", + "name": "SqlClient", + "path": "execute_query", + "input": { + "values": { + "sql_query": "SELECT * FROM people" + } + } + } + ] +[08/12/24 14:59:35] INFO Subtask 809d1a281b85447f90706d431b77b845 + Response: 1,Lee,Andrews,"Engineer, electrical" + + 2,Michael,Woods,"Therapist, art" + + 3,Joshua,Allen,"Therapist, sports" + + 4,Eric,Foster,English as a second language teacher + + 5,John,Daniels,Printmaker + + 6,Matthew,Barton,Podiatrist + + 7,Audrey,Wilson,IT technical support officer + + 8,Leah,Knox,"Social research officer, government" + + 9,David,Macdonald,Public relations account executive + + 10,Erica,Ramos,"Accountant, chartered public finance" +[08/12/24 14:59:43] INFO ToolkitTask e302f7315d1a4f939e0125103ff4f09f + Output: + 1. Lee Andrews - Engineer, electrical + 2. Michael Woods - Therapist, art + 3. Joshua Allen - Therapist, sports + 4. Eric Foster - English as a second language teacher + 5. John Daniels - Printmaker + 6. Matthew Barton - Podiatrist + 7. Audrey Wilson - IT technical support officer + 8. Leah Knox - Social research officer, government + 9. David Macdonald - Public relations account executive + 10. Erica Ramos - Accountant, chartered public finance ``` diff --git a/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py b/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py index 973a0b881..3d9425534 100644 --- a/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py +++ b/docs/griptape-tools/official-tools/src/aws_s3_tool_1.py @@ -1,13 +1,13 @@ import boto3 from griptape.structures import Agent -from griptape.tools import AwsS3Tool, TaskMemoryTool +from griptape.tools import AwsS3Tool # Initialize the AWS S3 client aws_s3_client = AwsS3Tool(session=boto3.Session(), off_prompt=True) # Create an agent with the AWS S3 client tool -agent = Agent(tools=[aws_s3_client, TaskMemoryTool(off_prompt=False)]) +agent = Agent(tools=[aws_s3_client]) # Task to list all the AWS S3 buckets agent.run("List all my S3 buckets.") diff --git a/docs/griptape-tools/official-tools/src/computer_tool_1.py b/docs/griptape-tools/official-tools/src/computer_tool_1.py index b0892d425..725210020 100644 --- a/docs/griptape-tools/official-tools/src/computer_tool_1.py +++ b/docs/griptape-tools/official-tools/src/computer_tool_1.py @@ -7,13 +7,4 @@ # Create an agent with the ComputerTool tool agent = Agent(tools=[computer]) -# Create a file using the shell command -filename = "my_new_file.txt" -agent.run(f"Run this shell command for me: touch {filename}") - -# Add content to the file using the shell command -content = "This is the content of the file." -agent.run(f"Run this shell command for me: echo '{content}' > {filename}") - -# Output the contents of the file using the shell command -agent.run(f"Run this shell command for me: cat {filename}") +agent.run("Make 2 files and then list the files in the current directory") diff --git a/docs/griptape-tools/official-tools/src/extraction_tool_1.py b/docs/griptape-tools/official-tools/src/extraction_tool_1.py new file mode 100644 index 000000000..80e211f03 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/extraction_tool_1.py @@ -0,0 +1,28 @@ +import schema + +from griptape.engines import JsonExtractionEngine +from griptape.structures import Agent +from griptape.tools import ExtractionTool, WebScraperTool + +agent = Agent( + input="Load {{ args[0] }} and extract key info", + tools=[ + WebScraperTool(off_prompt=True), + ExtractionTool( + off_prompt=False, + extraction_engine=JsonExtractionEngine( + template_schema=schema.Schema( + { + "company_name": str, + "industry": str, + schema.Literal( + "product_features", + description="List of key product features.", + ): list[str], + } + ).json_schema("Company Info"), + ), + ), + ], +) +agent.run("https://griptape.ai") diff --git a/docs/griptape-tools/official-tools/src/prompt_summary_tool_1.py b/docs/griptape-tools/official-tools/src/prompt_summary_tool_1.py new file mode 100644 index 000000000..3b4846439 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/prompt_summary_tool_1.py @@ -0,0 +1,8 @@ +from griptape.structures import Agent +from griptape.tools import PromptSummaryTool, WebScraperTool + +agent = Agent(tools=[WebScraperTool(off_prompt=True), PromptSummaryTool()]) + +agent.run( + "How can I build Neovim from source for MacOS according to this https://github.com/neovim/neovim/blob/master/BUILD.md" +) diff --git a/docs/griptape-tools/official-tools/src/query_tool_1.py b/docs/griptape-tools/official-tools/src/query_tool_1.py new file mode 100644 index 000000000..0c612eee9 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/query_tool_1.py @@ -0,0 +1,6 @@ +from griptape.structures import Agent +from griptape.tools import QueryTool, WebScraperTool + +agent = Agent(tools=[WebScraperTool(off_prompt=True), QueryTool()]) + +agent.run("Tell me about the architecture as described here: https://neovim.io/doc/user/vim_diff.html") diff --git a/docs/griptape-tools/official-tools/src/task_memory_tool_1.py b/docs/griptape-tools/official-tools/src/task_memory_tool_1.py deleted file mode 100644 index f5c2c487f..000000000 --- a/docs/griptape-tools/official-tools/src/task_memory_tool_1.py +++ /dev/null @@ -1,4 +0,0 @@ -from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool - -Agent(tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) diff --git a/docs/griptape-tools/official-tools/src/vector_store_tool_1.py b/docs/griptape-tools/official-tools/src/vector_store_tool_1.py index 57ca7b25b..266398d5e 100644 --- a/docs/griptape-tools/official-tools/src/vector_store_tool_1.py +++ b/docs/griptape-tools/official-tools/src/vector_store_tool_1.py @@ -2,7 +2,7 @@ from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, VectorStoreTool +from griptape.tools import PromptSummaryTool, VectorStoreTool vector_store_driver = LocalVectorStoreDriver( embedding_driver=OpenAiEmbeddingDriver(), @@ -20,6 +20,6 @@ off_prompt=True, ) -agent = Agent(tools=[vector_db, TaskMemoryTool(off_prompt=False)]) +agent = Agent(tools=[vector_db, PromptSummaryTool()]) agent.run("what is Griptape?") diff --git a/docs/griptape-tools/official-tools/src/web_scraper_1.py b/docs/griptape-tools/official-tools/src/web_scraper_1.py new file mode 100644 index 000000000..0e6f55011 --- /dev/null +++ b/docs/griptape-tools/official-tools/src/web_scraper_1.py @@ -0,0 +1,6 @@ +from griptape.structures import Agent +from griptape.tools import PromptSummaryTool, WebScraperTool + +agent = Agent(tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)]) + +agent.run("Based on https://www.griptape.ai/, tell me what griptape is") diff --git a/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py b/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py index 7716acde4..0e6f55011 100644 --- a/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py +++ b/docs/griptape-tools/official-tools/src/web_scraper_tool_1.py @@ -1,6 +1,6 @@ from griptape.structures import Agent -from griptape.tools import TaskMemoryTool, WebScraperTool +from griptape.tools import PromptSummaryTool, WebScraperTool -agent = Agent(tools=[WebScraperTool(off_prompt=True), TaskMemoryTool(off_prompt=False)]) +agent = Agent(tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)]) agent.run("Based on https://www.griptape.ai/, tell me what griptape is") diff --git a/docs/griptape-tools/official-tools/task-memory-tool.md b/docs/griptape-tools/official-tools/task-memory-tool.md deleted file mode 100644 index a988c3a64..000000000 --- a/docs/griptape-tools/official-tools/task-memory-tool.md +++ /dev/null @@ -1,7 +0,0 @@ -# Task Memory Tool Tool - -This tool enables LLMs to query and summarize task outputs that are stored in short-term tool memory. This tool uniquely requires the user to set the `off_prompt` property explicitly for usability reasons (Griptape doesn't provide the default `True` value). - -```python ---8<-- "docs/griptape-tools/official-tools/src/task_memory_tool_1.py" -``` diff --git a/docs/griptape-tools/official-tools/web-scraper-tool.md b/docs/griptape-tools/official-tools/web-scraper-tool.md index 1261d955d..26b83f6e3 100644 --- a/docs/griptape-tools/official-tools/web-scraper-tool.md +++ b/docs/griptape-tools/official-tools/web-scraper-tool.md @@ -6,62 +6,92 @@ This tool enables LLMs to scrape web pages for full text, summaries, authors, ti --8<-- "docs/griptape-tools/official-tools/src/web_scraper_tool_1.py" ``` ``` -[09/11/23 15:27:39] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed - Input: Based on https://www.griptape.ai/, tell me - what griptape is -[09/11/23 15:27:47] INFO Subtask 4b34be74b06a47ba9cb3a4b62aa35907 - Thought: I need to find out what griptape is based - on the information provided on the website - https://www.griptape.ai/. I can use the WebScraper - tool with the get_content activity to load the - content of the website. - - Action: {"name": "WebScraper", - "path": "get_content", "input": {"values": - {"url": "https://www.griptape.ai/"}}} -[09/11/23 15:27:48] INFO Subtask 4b34be74b06a47ba9cb3a4b62aa35907 - Response: Output of "WebScraper.get_content" was - stored in memory with memory_name "TaskMemory" - and artifact_namespace - "02da5930b8d74f7ca30aecc3760a3318" -[09/11/23 15:27:59] INFO Subtask 5b255e3e98aa401295f77532bc779390 - Thought: The content of the website has been stored - in memory. I can use the TaskMemory tool with - the summarize activity to get a summary of the - content. - Action: {"name": "TaskMemoryTool", "path": - "summarize", "input": {"values": {"memory_name": - "TaskMemory", "artifact_namespace": - "02da5930b8d74f7ca30aecc3760a3318"}}} -[09/11/23 15:28:03] INFO Subtask 5b255e3e98aa401295f77532bc779390 - Response: Griptape is an open source framework - that allows developers to build and deploy AI - applications using large language models (LLMs). It - provides the ability to create conversational and - event-driven apps that can access and manipulate - data securely. Griptape enforces structures like - sequential pipelines and DAG-based workflows for - predictability, while also allowing for creativity - by safely prompting LLMs with external APIs and - data stores. The framework can be used to create AI - systems that operate across both dimensions. - Griptape Cloud is a managed platform for deploying - and managing AI apps, and it offers features like - scheduling and connecting to data stores and APIs. -[09/11/23 15:28:12] INFO Task dd9ad12c5c1e4280a6e20d7c116303ed - Output: Griptape is an open source framework that - enables developers to build and deploy AI - applications using large language models (LLMs). It - allows the creation of conversational and - event-driven apps that can securely access and - manipulate data. Griptape enforces structures like - sequential pipelines and DAG-based workflows for - predictability, while also allowing for creativity - by safely prompting LLMs with external APIs and - data stores. The framework can be used to create AI - systems that operate across both dimensions. - Additionally, Griptape Cloud is a managed platform - for deploying and managing AI apps, offering - features like scheduling and connecting to data - stores and APIs. +[08/12/24 15:32:08] INFO ToolkitTask b14a4305365f4b17a4dcf235f84397e2 + Input: Based on https://www.griptape.ai/, tell me what griptape is +[08/12/24 15:32:10] INFO Subtask bf396977ea634eb28f55388d3f828f5d + Actions: [ + { + "tag": "call_ExEzJDZuBfnsa9pZMSr6mtsS", + "name": "WebScraperTool", + "path": "get_content", + "input": { + "values": { + "url": "https://www.griptape.ai/" + } + } + } + ] + INFO Subtask bf396977ea634eb28f55388d3f828f5d + Response: Output of "WebScraperTool.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "a55c85bf1aa944d5b69bbe8d61382179" +[08/12/24 15:32:11] INFO Subtask 31852039bd274b71bf46feaf22b68112 + Actions: [ + { + "tag": "call_6Dovx2GKE2GLjaYIuwXvBxVn", + "name": "PromptSummaryTool", + "path": "summarize", + "input": { + "values": { + "summary": { + "memory_name": "TaskMemory", + "artifact_namespace": "a55c85bf1aa944d5b69bbe8d61382179" + } + } + } + } + ] +[08/12/24 15:32:15] INFO Subtask 31852039bd274b71bf46feaf22b68112 + Response: Griptape offers a comprehensive solution for building, deploying, and scaling AI applications in the cloud. It provides developers + with a framework and cloud services to create retrieval-driven AI-powered applications without needing extensive knowledge in AI or prompt + engineering. + + **Griptape Framework:** + - Enables developers to build AI applications using Python. + - Offers better security, performance, and cost-efficiency with Off-Prompt™ technology. + - Facilitates the creation of Gen AI Agents, Systems of Agents, Pipelines, Workflows, and RAG implementations. + + **Griptape Cloud:** + - Simplifies deployment and execution of ETL, RAG, and other structures. + - Provides API abstractions and eliminates the need for infrastructure management. + - Supports seamless scaling to accommodate growing workloads. + + **Solutions & Applications:** + - Custom project development. + - Turnkey SaaS offerings for non-tech businesses. + - Ready-made apps and options to offer apps to customers. + + **Key Features:** + - Automated Data Prep (ETL): Connect, extract, transform, and load data into a vector database index. + - Retrieval as a Service (RAG): Generate answers, summaries, and details from your data using customizable retrieval patterns. + - Structure Runtime (RUN): Build and integrate AI agents, pipelines, and workflows into client applications. +[08/12/24 15:32:21] INFO ToolkitTask b14a4305365f4b17a4dcf235f84397e2 + Output: Griptape is a comprehensive solution designed to facilitate the building, deploying, and scaling of AI applications in the cloud. It + provides developers with a framework and cloud services that simplify the creation of retrieval-driven AI-powered applications, even for those + without extensive AI or prompt engineering expertise. + + ### Key Components of Griptape: + + 1. **Griptape Framework:** + - **Development:** Allows developers to build AI applications using Python. + - **Technology:** Utilizes Off-Prompt™ technology for enhanced security, performance, and cost-efficiency. + - **Capabilities:** Supports the creation of Gen AI Agents, Systems of Agents, Pipelines, Workflows, and Retrieval-Augmented Generation (RAG) + implementations. + + 2. **Griptape Cloud:** + - **Deployment:** Simplifies the deployment and execution of ETL (Extract, Transform, Load), RAG, and other structures. + - **API Abstractions:** Provides API abstractions to eliminate the need for infrastructure management. + - **Scalability:** Supports seamless scaling to accommodate growing workloads. + + ### Solutions & Applications: + - **Custom Projects:** Development of tailored AI solutions. + - **Turnkey SaaS:** Ready-to-use SaaS offerings for non-technical businesses. + - **Ready-made Apps:** Pre-built applications and options to offer apps to customers. + + ### Key Features: + - **Automated Data Prep (ETL):** Connects, extracts, transforms, and loads data into a vector database index. + - **Retrieval as a Service (RAG):** Generates answers, summaries, and details from data using customizable retrieval patterns. + - **Structure Runtime (RUN):** Facilitates the building and integration of AI agents, pipelines, and workflows into client applications. + + In summary, Griptape provides a robust platform for developing and managing AI applications, making it accessible for developers and businesses + to leverage AI technology effectively. ``` diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index 3184654b1..c9c040f65 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -7,8 +7,7 @@ from attrs import Factory, define, field from griptape.artifacts import CsvRowArtifact, ErrorArtifact, ListArtifact, TextArtifact -from griptape.common import PromptStack -from griptape.common.prompt_stack.messages.message import Message +from griptape.common import Message, PromptStack from griptape.engines import BaseExtractionEngine from griptape.utils import J2 @@ -18,25 +17,22 @@ @define class CsvExtractionEngine(BaseExtractionEngine): - template_generator: J2 = field(default=Factory(lambda: J2("engines/extraction/csv_extraction.j2")), kw_only=True) + column_names: list[str] = field(default=Factory(list), kw_only=True) + system_template_generator: J2 = field(default=Factory(lambda: J2("engines/extraction/csv/system.j2")), kw_only=True) + user_template_generator: J2 = field(default=Factory(lambda: J2("engines/extraction/csv/user.j2")), kw_only=True) def extract( self, text: str | ListArtifact, *, rulesets: Optional[list[Ruleset]] = None, - column_names: Optional[list[str]] = None, **kwargs, ) -> ListArtifact | ErrorArtifact: - if column_names is None: - column_names = [] try: return ListArtifact( self._extract_rec( cast(list[TextArtifact], text.value) if isinstance(text, ListArtifact) else [TextArtifact(text)], - column_names, [], - rulesets=rulesets, ), item_separator="\n", ) @@ -55,39 +51,56 @@ def text_to_csv_rows(self, text: str, column_names: list[str]) -> list[CsvRowArt def _extract_rec( self, artifacts: list[TextArtifact], - column_names: list[str], rows: list[CsvRowArtifact], + *, rulesets: Optional[list[Ruleset]] = None, ) -> list[CsvRowArtifact]: artifacts_text = self.chunk_joiner.join([a.value for a in artifacts]) - full_text = self.template_generator.render( - column_names=column_names, - text=artifacts_text, + system_prompt = self.system_template_generator.render( + column_names=self.column_names, rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) + user_prompt = self.user_template_generator.render( + text=artifacts_text, + ) - if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: + if ( + self.prompt_driver.tokenizer.count_input_tokens_left(system_prompt + user_prompt) + >= self.min_response_tokens + ): rows.extend( self.text_to_csv_rows( - self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value, - column_names, + self.prompt_driver.run( + PromptStack( + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(user_prompt, role=Message.USER_ROLE), + ] + ) + ).value, + self.column_names, ), ) return rows else: chunks = self.chunker.chunk(artifacts_text) - partial_text = self.template_generator.render( - column_names=column_names, + partial_text = self.user_template_generator.render( text=chunks[0].value, - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) rows.extend( self.text_to_csv_rows( - self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value, - column_names, + self.prompt_driver.run( + PromptStack( + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(partial_text, role=Message.USER_ROLE), + ] + ) + ).value, + self.column_names, ), ) - return self._extract_rec(chunks[1:], column_names, rows, rulesets=rulesets) + return self._extract_rec(chunks[1:], rows, rulesets=rulesets) diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index d9c7cd4aa..8f2f4a3fe 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import re from typing import TYPE_CHECKING, Optional, cast from attrs import Factory, define, field @@ -17,25 +18,25 @@ @define class JsonExtractionEngine(BaseExtractionEngine): - template_generator: J2 = field(default=Factory(lambda: J2("engines/extraction/json_extraction.j2")), kw_only=True) + JSON_PATTERN = r"(?s)[^\[]*(\[.*\])" + + template_schema: dict = field(default=Factory(dict), kw_only=True) + system_template_generator: J2 = field( + default=Factory(lambda: J2("engines/extraction/json/system.j2")), kw_only=True + ) + user_template_generator: J2 = field(default=Factory(lambda: J2("engines/extraction/json/user.j2")), kw_only=True) def extract( self, text: str | ListArtifact, *, rulesets: Optional[list[Ruleset]] = None, - template_schema: Optional[dict | list[dict]] = None, **kwargs, ) -> ListArtifact | ErrorArtifact: - if template_schema is None: - template_schema = [] try: - json_schema = json.dumps(template_schema) - return ListArtifact( self._extract_rec( cast(list[TextArtifact], text.value) if isinstance(text, ListArtifact) else [TextArtifact(text)], - json_schema, [], rulesets=rulesets, ), @@ -45,42 +46,64 @@ def extract( return ErrorArtifact(f"error extracting JSON: {e}") def json_to_text_artifacts(self, json_input: str) -> list[TextArtifact]: - return [TextArtifact(json.dumps(e)) for e in json.loads(json_input)] + json_matches = re.findall(self.JSON_PATTERN, json_input, re.DOTALL) + + if json_matches: + return [TextArtifact(json.dumps(e)) for e in json.loads(json_matches[-1])] + else: + return [] def _extract_rec( self, artifacts: list[TextArtifact], - json_template_schema: str, extractions: list[TextArtifact], + *, rulesets: Optional[list[Ruleset]] = None, ) -> list[TextArtifact]: artifacts_text = self.chunk_joiner.join([a.value for a in artifacts]) - full_text = self.template_generator.render( - json_template_schema=json_template_schema, - text=artifacts_text, + system_prompt = self.system_template_generator.render( + json_template_schema=json.dumps(self.template_schema), rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) + user_prompt = self.user_template_generator.render( + text=artifacts_text, + ) - if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: + if ( + self.prompt_driver.tokenizer.count_input_tokens_left(user_prompt + system_prompt) + >= self.min_response_tokens + ): extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value, + self.prompt_driver.run( + PromptStack( + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(user_prompt, role=Message.USER_ROLE), + ] + ) + ).value ), ) return extractions else: chunks = self.chunker.chunk(artifacts_text) - partial_text = self.template_generator.render( - template_schema=json_template_schema, + partial_text = self.user_template_generator.render( text=chunks[0].value, - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value, + self.prompt_driver.run( + PromptStack( + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(partial_text, role=Message.USER_ROLE), + ] + ) + ).value, ), ) - return self._extract_rec(chunks[1:], json_template_schema, extractions, rulesets=rulesets) + return self._extract_rec(chunks[1:], extractions, rulesets=rulesets) diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index 866df19da..792f479bc 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -1,12 +1,12 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from attrs import define if TYPE_CHECKING: - from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact + from griptape.artifacts import BaseArtifact, ListArtifact @define @@ -19,9 +19,3 @@ def load_artifacts(self, namespace: str) -> ListArtifact: ... @abstractmethod def can_store(self, artifact: BaseArtifact) -> bool: ... - - @abstractmethod - def summarize(self, namespace: str) -> TextArtifact | InfoArtifact: ... - - @abstractmethod - def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: ... diff --git a/griptape/memory/task/storage/blob_artifact_storage.py b/griptape/memory/task/storage/blob_artifact_storage.py index 6199dc3a3..3f4309481 100644 --- a/griptape/memory/task/storage/blob_artifact_storage.py +++ b/griptape/memory/task/storage/blob_artifact_storage.py @@ -1,10 +1,8 @@ from __future__ import annotations -from typing import Any - from attrs import define, field -from griptape.artifacts import BaseArtifact, BlobArtifact, InfoArtifact, ListArtifact +from griptape.artifacts import BaseArtifact, BlobArtifact, ListArtifact from griptape.memory.task.storage import BaseArtifactStorage @@ -26,9 +24,3 @@ def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: def load_artifacts(self, namespace: str) -> ListArtifact: return ListArtifact(next((blobs for key, blobs in self.blobs.items() if key == namespace), [])) - - def summarize(self, namespace: str) -> InfoArtifact: - return InfoArtifact("can't summarize artifacts") - - def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: - return InfoArtifact("can't query artifacts") diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 18f2cff80..623c176ea 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,32 +1,20 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING -from attrs import Attribute, Factory, define, field +from attrs import Factory, define, field -from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.config import config -from griptape.engines.rag import RagContext, RagEngine from griptape.memory.task.storage import BaseArtifactStorage if TYPE_CHECKING: from griptape.drivers import BaseVectorStoreDriver - from griptape.engines import BaseSummaryEngine, CsvExtractionEngine, JsonExtractionEngine @define(kw_only=True) class TextArtifactStorage(BaseArtifactStorage): vector_store_driver: BaseVectorStoreDriver = field(default=Factory(lambda: config.drivers.vector_store)) - rag_engine: Optional[RagEngine] = field(default=None) - retrieval_rag_module_name: Optional[str] = field(default=None) - summary_engine: Optional[BaseSummaryEngine] = field(default=None) - csv_extraction_engine: Optional[CsvExtractionEngine] = field(default=None) - json_extraction_engine: Optional[JsonExtractionEngine] = field(default=None) - - @rag_engine.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rag_engine(self, _: Attribute, rag_engine: str) -> None: - if rag_engine is not None and self.retrieval_rag_module_name is None: - raise ValueError("You have to set retrieval_rag_module_name if rag_engine is provided") def can_store(self, artifact: BaseArtifact) -> bool: return isinstance(artifact, TextArtifact) @@ -39,35 +27,3 @@ def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: def load_artifacts(self, namespace: str) -> ListArtifact: return self.vector_store_driver.load_artifacts(namespace=namespace) - - def summarize(self, namespace: str) -> TextArtifact: - if self.summary_engine is None: - raise ValueError("Summary engine is not set.") - - return self.summary_engine.summarize_artifacts(self.load_artifacts(namespace)) - - def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: - if self.rag_engine is None: - raise ValueError("rag_engine is not set") - - if self.retrieval_rag_module_name is None: - raise ValueError("retrieval_rag_module_name is not set") - - outputs = self.rag_engine.process( - RagContext( - query=query, - module_configs={ - self.retrieval_rag_module_name: { - "query_params": { - "namespace": namespace, - "metadata": None if metadata is None else str(metadata), - }, - }, - }, - ), - ).outputs - - if len(outputs) > 0: - return outputs[0] - else: - return InfoArtifact("Empty output") diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index e2131d1f0..c7f12b233 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -4,8 +4,9 @@ from attrs import Attribute, Factory, define, field -from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.artifacts import BaseArtifact, BlobArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.memory.meta import ActionSubtaskMetaEntry +from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage from griptape.mixins import ActivityMixin if TYPE_CHECKING: @@ -16,7 +17,15 @@ @define class TaskMemory(ActivityMixin): name: str = field(default=Factory(lambda self: self.__class__.__name__, takes_self=True), kw_only=True) - artifact_storages: dict[type, BaseArtifactStorage] = field(factory=dict, kw_only=True) + artifact_storages: dict[type, BaseArtifactStorage] = field( + default=Factory( + lambda: { + TextArtifact: TextArtifactStorage(), + BlobArtifact: BlobArtifactStorage(), + } + ), + kw_only=True, + ) namespace_storage: dict[str, BaseArtifactStorage] = field(factory=dict, kw_only=True) namespace_metadata: dict[str, Any] = field(factory=dict, kw_only=True) @@ -123,19 +132,3 @@ def find_input_memory(self, memory_name: str) -> Optional[TaskMemory]: return self else: return None - - def summarize_namespace(self, namespace: str) -> TextArtifact | InfoArtifact: - storage = self.namespace_storage.get(namespace) - - if storage: - return storage.summarize(namespace) - else: - return InfoArtifact("Can't find memory content") - - def query_namespace(self, namespace: str, query: str) -> BaseArtifact: - storage = self.namespace_storage.get(namespace) - - if storage: - return storage.query(namespace=namespace, query=query, metadata=self.namespace_metadata.get(namespace)) - else: - return InfoArtifact("Can't find memory content") diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index eb56c2cf1..a18e9d578 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -6,23 +6,14 @@ from attrs import Attribute, Factory, define, field -from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact from griptape.common import observable -from griptape.config import config -from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import ( - PromptResponseRagModule, - VectorStoreRetrievalRagModule, -) -from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.events import FinishStructureRunEvent, StartStructureRunEvent, event_bus from griptape.memory import TaskMemory from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory -from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact from griptape.memory.structure import BaseConversationMemory from griptape.rules import Rule, Ruleset from griptape.tasks import BaseTask @@ -38,9 +29,8 @@ class Structure(ABC): default=Factory(lambda: ConversationMemory()), kw_only=True, ) - rag_engine: RagEngine = field(default=Factory(lambda self: self.default_rag_engine, takes_self=True), kw_only=True) task_memory: TaskMemory = field( - default=Factory(lambda self: self.default_task_memory, takes_self=True), + default=Factory(lambda self: TaskMemory(), takes_self=True), kw_only=True, ) meta_memory: MetaMemory = field(default=Factory(lambda: MetaMemory()), kw_only=True) @@ -94,33 +84,6 @@ def output(self) -> Optional[BaseArtifact]: def finished_tasks(self) -> list[BaseTask]: return [s for s in self.tasks if s.is_finished()] - @property - def default_rag_engine(self) -> RagEngine: - return RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[VectorStoreRetrievalRagModule()], - ), - response_stage=ResponseRagStage( - response_modules=[PromptResponseRagModule(prompt_driver=config.drivers.prompt, rulesets=self.rulesets)], - ), - ) - - @property - def default_task_memory(self) -> TaskMemory: - return TaskMemory( - artifact_storages={ - TextArtifact: TextArtifactStorage( - rag_engine=self.rag_engine, - retrieval_rag_module_name="VectorStoreRetrievalRagModule", - vector_store_driver=config.drivers.vector_store, - summary_engine=PromptSummaryEngine(prompt_driver=config.drivers.prompt), - csv_extraction_engine=CsvExtractionEngine(prompt_driver=config.drivers.prompt), - json_extraction_engine=JsonExtractionEngine(prompt_driver=config.drivers.prompt), - ), - BlobArtifact: BlobArtifactStorage(), - }, - ) - def is_finished(self) -> bool: return all(s.is_finished() for s in self.tasks) diff --git a/griptape/tasks/__init__.py b/griptape/tasks/__init__.py index 764d1669a..7d08cf858 100644 --- a/griptape/tasks/__init__.py +++ b/griptape/tasks/__init__.py @@ -8,8 +8,6 @@ from .tool_task import ToolTask from .rag_task import RagTask from .extraction_task import ExtractionTask -from .csv_extraction_task import CsvExtractionTask -from .json_extraction_task import JsonExtractionTask from .base_image_generation_task import BaseImageGenerationTask from .code_execution_task import CodeExecutionTask from .prompt_image_generation_task import PromptImageGenerationTask @@ -33,8 +31,6 @@ "ToolTask", "RagTask", "ExtractionTask", - "CsvExtractionTask", - "JsonExtractionTask", "BaseImageGenerationTask", "CodeExecutionTask", "PromptImageGenerationTask", diff --git a/griptape/tasks/csv_extraction_task.py b/griptape/tasks/csv_extraction_task.py deleted file mode 100644 index c252893de..000000000 --- a/griptape/tasks/csv_extraction_task.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from attrs import Factory, define, field - -from griptape.engines import CsvExtractionEngine -from griptape.tasks import ExtractionTask - - -@define -class CsvExtractionTask(ExtractionTask): - extraction_engine: CsvExtractionEngine = field(default=Factory(lambda: CsvExtractionEngine()), kw_only=True) diff --git a/griptape/tasks/extraction_task.py b/griptape/tasks/extraction_task.py index a1c18eff0..c74c3ac49 100644 --- a/griptape/tasks/extraction_task.py +++ b/griptape/tasks/extraction_task.py @@ -14,7 +14,7 @@ @define class ExtractionTask(BaseTextInputTask): extraction_engine: BaseExtractionEngine = field(kw_only=True) - args: dict = field(kw_only=True) + args: dict = field(kw_only=True, factory=dict) def run(self) -> ListArtifact | ErrorArtifact: return self.extraction_engine.extract(self.input.to_text(), rulesets=self.all_rulesets, **self.args) diff --git a/griptape/tasks/json_extraction_task.py b/griptape/tasks/json_extraction_task.py deleted file mode 100644 index 94db187da..000000000 --- a/griptape/tasks/json_extraction_task.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from attrs import Factory, define, field - -from griptape.engines import JsonExtractionEngine -from griptape.tasks import ExtractionTask - - -@define -class JsonExtractionTask(ExtractionTask): - extraction_engine: JsonExtractionEngine = field(default=Factory(lambda: JsonExtractionEngine()), kw_only=True) diff --git a/griptape/templates/engines/extraction/csv/system.j2 b/griptape/templates/engines/extraction/csv/system.j2 new file mode 100644 index 000000000..7c5776257 --- /dev/null +++ b/griptape/templates/engines/extraction/csv/system.j2 @@ -0,0 +1,7 @@ +Don't add the header row. Don't use markdown formatting for output. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. +Column Names: """{{ column_names }}""" + +{% if rulesets %} + +{{ rulesets }} +{% endif %} diff --git a/griptape/templates/engines/extraction/csv/user.j2 b/griptape/templates/engines/extraction/csv/user.j2 new file mode 100644 index 000000000..0f33dadc3 --- /dev/null +++ b/griptape/templates/engines/extraction/csv/user.j2 @@ -0,0 +1,4 @@ +Extract information from the Text based on the Column Names and output it as a CSV file. +Text: """{{ text }}""" + +Answer: diff --git a/griptape/templates/engines/extraction/csv_extraction.j2 b/griptape/templates/engines/extraction/csv_extraction.j2 deleted file mode 100644 index 6f9da346b..000000000 --- a/griptape/templates/engines/extraction/csv_extraction.j2 +++ /dev/null @@ -1,11 +0,0 @@ -Text: """{{ text }}""" - -Column Names: """{{ column_names }}""" - -Extract information from the Text based on the Column Names and output it as a CSV file. Don't add the header row. Don't use markdown formatting for output. Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes. -{% if rulesets %} - -{{ rulesets }} -{% endif %} - -Answer: diff --git a/griptape/templates/engines/extraction/json/system.j2 b/griptape/templates/engines/extraction/json/system.j2 new file mode 100644 index 000000000..987ff19a9 --- /dev/null +++ b/griptape/templates/engines/extraction/json/system.j2 @@ -0,0 +1,6 @@ +Extraction Template JSON Schema: """{{ json_template_schema }}""" + +{% if rulesets %} + +{{ rulesets }} +{% endif %} diff --git a/griptape/templates/engines/extraction/json_extraction.j2 b/griptape/templates/engines/extraction/json/user.j2 similarity index 56% rename from griptape/templates/engines/extraction/json_extraction.j2 rename to griptape/templates/engines/extraction/json/user.j2 index 85d95bef9..984977d9a 100644 --- a/griptape/templates/engines/extraction/json_extraction.j2 +++ b/griptape/templates/engines/extraction/json/user.j2 @@ -1,11 +1,4 @@ -Text: """{{ text }}""" - -Extraction Template JSON Schema: """{{ json_template_schema }}""" - Extract information from the Text based on the Extraction Template JSON Schema into an array of JSON objects. -{% if rulesets %} - -{{ rulesets }} -{% endif %} +Text: """{{ text }}""" JSON array: diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index c33b9f0b0..ce59088f3 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -9,7 +9,6 @@ from .file_manager.tool import FileManagerTool from .vector_store.tool import VectorStoreTool from .date_time.tool import DateTimeTool -from .task_memory.tool import TaskMemoryTool from .base_aws_tool import BaseAwsTool from .aws_iam.tool import AwsIamTool from .aws_s3.tool import AwsS3Tool @@ -30,6 +29,9 @@ from .rag.tool import RagTool from .text_to_speech.tool import TextToSpeechTool from .audio_transcription.tool import AudioTranscriptionTool +from .extraction.tool import ExtractionTool +from .prompt_summary.tool import PromptSummaryTool +from .query.tool import QueryTool __all__ = [ "BaseTool", @@ -51,7 +53,6 @@ "FileManagerTool", "VectorStoreTool", "DateTimeTool", - "TaskMemoryTool", "ComputerTool", "OpenWeatherTool", "PromptImageGenerationTool", @@ -64,4 +65,7 @@ "RagTool", "TextToSpeechTool", "AudioTranscriptionTool", + "ExtractionTool", + "PromptSummaryTool", + "QueryTool", ] diff --git a/griptape/tools/task_memory/__init__.py b/griptape/tools/extraction/__init__.py similarity index 100% rename from griptape/tools/task_memory/__init__.py rename to griptape/tools/extraction/__init__.py diff --git a/griptape/tools/extraction/manifest.yml b/griptape/tools/extraction/manifest.yml new file mode 100644 index 000000000..9c489d9f6 --- /dev/null +++ b/griptape/tools/extraction/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Extraction Client +description: Tool for performing structured extractions on unstructured data. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/extraction/requirements.txt b/griptape/tools/extraction/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/extraction/tool.py b/griptape/tools/extraction/tool.py new file mode 100644 index 000000000..1f6d06b80 --- /dev/null +++ b/griptape/tools/extraction/tool.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from attrs import define, field +from schema import Literal, Or, Schema + +from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact +from griptape.mixins import RuleMixin +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + +if TYPE_CHECKING: + from griptape.artifacts import InfoArtifact + from griptape.engines import BaseExtractionEngine + + +@define(kw_only=True) +class ExtractionTool(BaseTool, RuleMixin): + """Tool for using an Extraction Engine. + + Attributes: + extraction_engine: `ExtractionEngine`. + """ + + extraction_engine: BaseExtractionEngine = field() + + @activity( + config={ + "description": "Can be used extract structured text from data.", + "schema": Schema( + { + Literal("data"): Or( + str, + Schema( + { + "memory_name": str, + "artifact_namespace": str, + } + ), + ), + } + ), + }, + ) + def extract(self, params: dict) -> ListArtifact | InfoArtifact | ErrorArtifact: + data = params["values"]["data"] + + if isinstance(data, str): + artifacts = ListArtifact([TextArtifact(data)]) + else: + memory = self.find_input_memory(data["memory_name"]) + artifact_namespace = data["artifact_namespace"] + + if memory is not None: + artifacts = memory.load_artifacts(artifact_namespace) + else: + return ErrorArtifact("memory not found") + + return self.extraction_engine.extract(artifacts) diff --git a/griptape/tools/prompt_summary/__init__.py b/griptape/tools/prompt_summary/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/prompt_summary/manifest.yml b/griptape/tools/prompt_summary/manifest.yml new file mode 100644 index 000000000..a83ea4021 --- /dev/null +++ b/griptape/tools/prompt_summary/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Prompt Summary Client +description: Tool for using a Prompt Summary Engine +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/prompt_summary/requirements.txt b/griptape/tools/prompt_summary/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/prompt_summary/tool.py b/griptape/tools/prompt_summary/tool.py new file mode 100644 index 000000000..88ec9d855 --- /dev/null +++ b/griptape/tools/prompt_summary/tool.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from attrs import define, field +from schema import Literal, Or, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact +from griptape.engines import PromptSummaryEngine +from griptape.mixins.rule_mixin import RuleMixin +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + + +@define(kw_only=True) +class PromptSummaryTool(BaseTool, RuleMixin): + """Tool for using a Prompt Summary Engine. + + Attributes: + prompt_summary_engine: `PromptSummaryEngine`. + """ + + prompt_summary_engine: PromptSummaryEngine = field(kw_only=True, default=PromptSummaryEngine()) + + @activity( + config={ + "description": "Can be used to summarize text content.", + "schema": Schema( + { + Literal("summary"): Or( + str, + Schema( + { + "memory_name": str, + "artifact_namespace": str, + } + ), + ), + } + ), + }, + ) + def summarize(self, params: dict) -> BaseArtifact: + summary = params["values"]["summary"] + + if isinstance(summary, str): + artifacts = ListArtifact([TextArtifact(summary)]) + else: + memory = self.find_input_memory(summary["memory_name"]) + artifact_namespace = summary["artifact_namespace"] + + if memory is not None: + artifacts = memory.load_artifacts(artifact_namespace) + else: + return ErrorArtifact("memory not found") + + return self.prompt_summary_engine.summarize_artifacts(artifacts, rulesets=self.all_rulesets) diff --git a/griptape/tools/query/__init__.py b/griptape/tools/query/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/query/manifest.yml b/griptape/tools/query/manifest.yml new file mode 100644 index 000000000..086a86d5a --- /dev/null +++ b/griptape/tools/query/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Query Client +description: Tool for performing a query against data. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/query/requirements.txt b/griptape/tools/query/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/query/tool.py b/griptape/tools/query/tool.py new file mode 100644 index 000000000..3ecc63bca --- /dev/null +++ b/griptape/tools/query/tool.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +from attrs import Factory, define, field +from schema import Literal, Or, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact +from griptape.config import config +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import ( + PromptResponseRagModule, +) +from griptape.engines.rag.rag_context import RagContext +from griptape.engines.rag.stages import ResponseRagStage +from griptape.mixins.rule_mixin import RuleMixin +from griptape.tools.base_tool import BaseTool +from griptape.utils.decorators import activity + + +@define(kw_only=True) +class QueryTool(BaseTool, RuleMixin): + """Tool for performing a query against data.""" + + _rag_engine: RagEngine = field( + default=Factory( + lambda self: RagEngine( + response_stage=ResponseRagStage( + response_modules=[ + PromptResponseRagModule(prompt_driver=config.drivers.prompt, rulesets=self.rulesets) + ], + ), + ), + takes_self=True, + ), + alias="_rag_engine", + ) + + @activity( + config={ + "description": "Can be used to search through textual content.", + "schema": Schema( + { + Literal("query", description="A natural language search query"): str, + Literal("content"): Or( + str, + Schema( + { + "memory_name": str, + "artifact_namespace": str, + } + ), + ), + } + ), + }, + ) + def query(self, params: dict) -> BaseArtifact: + query = params["values"]["query"] + content = params["values"]["content"] + + if isinstance(content, str): + text_artifacts = [TextArtifact(content)] + else: + memory = self.find_input_memory(content["memory_name"]) + artifact_namespace = content["artifact_namespace"] + + if memory is not None: + artifacts = memory.load_artifacts(artifact_namespace) + else: + return ErrorArtifact("memory not found") + + text_artifacts = [artifact for artifact in artifacts if isinstance(artifact, TextArtifact)] + + outputs = self._rag_engine.process(RagContext(query=query, text_chunks=text_artifacts)).outputs + + if len(outputs) > 0: + return ListArtifact(outputs) + else: + return ErrorArtifact("query output is empty") diff --git a/griptape/tools/task_memory/manifest.yml b/griptape/tools/task_memory/manifest.yml deleted file mode 100644 index 5d40a1e68..000000000 --- a/griptape/tools/task_memory/manifest.yml +++ /dev/null @@ -1,5 +0,0 @@ -version: "v1" -name: Task Memory Tool -description: Tool for summarizing and querying TaskMemory. -contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/task_memory/tool.py b/griptape/tools/task_memory/tool.py deleted file mode 100644 index dfd6c7c4b..000000000 --- a/griptape/tools/task_memory/tool.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from attrs import define -from schema import Literal, Schema - -from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact -from griptape.tools import BaseTool -from griptape.utils.decorators import activity - - -@define -class TaskMemoryTool(BaseTool): - @activity( - config={ - "description": "Can be used to summarize memory content", - "schema": Schema({"memory_name": str, "artifact_namespace": str}), - }, - ) - def summarize(self, params: dict) -> TextArtifact | InfoArtifact | ErrorArtifact: - memory = self.find_input_memory(params["values"]["memory_name"]) - artifact_namespace = params["values"]["artifact_namespace"] - - if memory: - return memory.summarize_namespace(artifact_namespace) - else: - return ErrorArtifact("memory not found") - - @activity( - config={ - "description": "Can be used to search and query memory content", - "schema": Schema( - { - "memory_name": str, - "artifact_namespace": str, - Literal( - "query", - description="A natural language search query in the form of a question with enough " - "contextual information for another person to understand what the query is about", - ): str, - }, - ), - }, - ) - def query(self, params: dict) -> BaseArtifact: - memory = self.find_input_memory(params["values"]["memory_name"]) - artifact_namespace = params["values"]["artifact_namespace"] - query = params["values"]["query"] - - if memory: - return memory.query_namespace(namespace=artifact_namespace, query=query) - else: - return ErrorArtifact("memory not found") diff --git a/griptape/utils/load_artifact_from_memory.py b/griptape/utils/load_artifact_from_memory.py index a45a41dbd..2d3f8bc86 100644 --- a/griptape/utils/load_artifact_from_memory.py +++ b/griptape/utils/load_artifact_from_memory.py @@ -1,9 +1,14 @@ -from griptape.artifacts import BaseArtifact -from griptape.memory import TaskMemory +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact + from griptape.memory import TaskMemory def load_artifact_from_memory( - memory: TaskMemory, + memory: Optional[TaskMemory], artifact_namespace: str, artifact_name: str, artifact_type: type, diff --git a/mkdocs.yml b/mkdocs.yml index ce1772754..7e3806264 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -144,7 +144,6 @@ nav: - Open Weather: "griptape-tools/official-tools/openweather-tool.md" - Rest Api Client: "griptape-tools/official-tools/rest-api-tool.md" - Sql: "griptape-tools/official-tools/sql-tool.md" - - Task Memory: "griptape-tools/official-tools/task-memory-tool.md" - Vector Store Tool: "griptape-tools/official-tools/vector-store-tool.md" - Web Scraper: "griptape-tools/official-tools/web-scraper-tool.md" - Web Search: "griptape-tools/official-tools/web-search-tool.md" @@ -157,6 +156,9 @@ nav: - Audio Transcription: "griptape-tools/official-tools/audio-transcription-tool.md" - Griptape Cloud Knowledge Base: "griptape-tools/official-tools/griptape-cloud-knowledge-base-tool.md" - Rag: "griptape-tools/official-tools/rag-tool.md" + - Extraction: "griptape-tools/official-tools/extraction-tool.md" + - Query: "griptape-tools/official-tools/query-tool.md" + - Prompt Summary: "griptape-tools/official-tools/prompt-summary-tool.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: diff --git a/poetry.lock b/poetry.lock index ad2653f13..32c3964ef 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3125,23 +3125,25 @@ mkdocs = ">=1.2" [[package]] name = "mkdocstrings" -version = "0.23.0" +version = "0.25.2" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, - {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, + {file = "mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc"}, + {file = "mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc"}, ] [package.dependencies] +click = ">=7.0" importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} Jinja2 = ">=2.11.1" Markdown = ">=3.3" MarkupSafe = ">=1.1" -mkdocs = ">=1.2" +mkdocs = ">=1.4" mkdocs-autorefs = ">=0.3.1" mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +platformdirs = ">=2.2.0" pymdown-extensions = ">=6.3" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} @@ -6986,4 +6988,4 @@ loaders-sql = ["sqlalchemy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "62e3ac71e745d060bddc2c1f853068e7083cf7fc2b8fb5474baa188477507607" +content-hash = "ee23a885217a5285e3a33cac221c55f011cd4ce428b33cd8abfbdac38a27a638" diff --git a/pyproject.toml b/pyproject.toml index a9992e1b4..54b984261 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -239,7 +239,7 @@ optional = true mkdocs = "^1.5.2" mkdocs-material = "^9.2.8" mkdocs-glightbox = "^0.3.4" -mkdocstrings = {extras = ["python"], version = "^0.23.0"} +mkdocstrings = {extras = ["python"], version = "^0.25.2"} mkdocs-gen-files = "^0.5.0" mkdocs-literate-nav = "^0.6.0" mkdocs-section-index = "^0.3.6" diff --git a/tests/integration/tasks/test_toolkit_task.py b/tests/integration/tasks/test_toolkit_task.py index 5cb1aa0dc..50b4f2a97 100644 --- a/tests/integration/tasks/test_toolkit_task.py +++ b/tests/integration/tasks/test_toolkit_task.py @@ -14,7 +14,7 @@ def structure_tester(self, request): from griptape.drivers import GoogleWebSearchDriver from griptape.structures import Agent - from griptape.tools import TaskMemoryTool, WebScraperTool, WebSearchTool + from griptape.tools import PromptSummaryTool, WebScraperTool, WebSearchTool return StructureTester( Agent( @@ -25,7 +25,7 @@ def structure_tester(self, request): ) ), WebScraperTool(off_prompt=True), - TaskMemoryTool(off_prompt=False), + PromptSummaryTool(off_prompt=False), ], conversation_memory=None, prompt_driver=request.param, diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index 1cd198756..0bf298870 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -87,7 +87,3 @@ def try_publish_event_payload_batch(self, mock_post, driver): json=event.to_dict(), headers={"Authorization": "Bearer foo bar"}, ) - - def test_no_structure_run_id(self): - with pytest.raises(ValueError): - GriptapeCloudEventListenerDriver(api_key="foo bar") diff --git a/tests/unit/engines/extraction/test_csv_extraction_engine.py b/tests/unit/engines/extraction/test_csv_extraction_engine.py index d84fc7cdd..893c21d60 100644 --- a/tests/unit/engines/extraction/test_csv_extraction_engine.py +++ b/tests/unit/engines/extraction/test_csv_extraction_engine.py @@ -6,10 +6,10 @@ class TestCsvExtractionEngine: @pytest.fixture() def engine(self): - return CsvExtractionEngine() + return CsvExtractionEngine(column_names=["test1"]) def test_extract(self, engine): - result = engine.extract("foo", column_names=["test1"]) + result = engine.extract("foo") assert len(result.value) == 1 assert result.value[0].value == {"test1": "mock output"} diff --git a/tests/unit/engines/extraction/test_json_extraction_engine.py b/tests/unit/engines/extraction/test_json_extraction_engine.py index d95adbb43..48430f1e5 100644 --- a/tests/unit/engines/extraction/test_json_extraction_engine.py +++ b/tests/unit/engines/extraction/test_json_extraction_engine.py @@ -12,22 +12,26 @@ def engine(self): return JsonExtractionEngine( prompt_driver=MockPromptDriver( mock_output='[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' - ) + ), + template_schema=Schema({"foo": "bar"}).json_schema("TemplateSchema"), ) def test_extract(self, engine): - json_schema = Schema({"foo": "bar"}).json_schema("TemplateSchema") - result = engine.extract("foo", template_schema=json_schema) + result = engine.extract("foo") assert len(result.value) == 2 assert result.value[0].value == '{"test_key_1": "test_value_1"}' assert result.value[1].value == '{"test_key_2": "test_value_2"}' def test_extract_error(self, engine): - assert isinstance(engine.extract("foo", template_schema=lambda: "non serializable"), ErrorArtifact) + engine.template_schema = lambda: "non serializable" + assert isinstance(engine.extract("foo"), ErrorArtifact) def test_json_to_text_artifacts(self, engine): assert [ a.value for a in engine.json_to_text_artifacts('[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]') ] == ['{"test_key_1": "test_value_1"}', '{"test_key_2": "test_value_2"}'] + + def test_json_to_text_artifacts_no_matches(self, engine): + assert engine.json_to_text_artifacts("asdfasdfasdf") == [] diff --git a/tests/unit/memory/tool/storage/test_blob_artifact_storage.py b/tests/unit/memory/tool/storage/test_blob_artifact_storage.py index c7f2cfcbd..78d1c662d 100644 --- a/tests/unit/memory/tool/storage/test_blob_artifact_storage.py +++ b/tests/unit/memory/tool/storage/test_blob_artifact_storage.py @@ -25,13 +25,3 @@ def test_load_artifacts(self, storage): def test_can_store(self, storage): assert not storage.can_store(TextArtifact("foo")) assert storage.can_store(BlobArtifact(b"foo")) - - def test_summarize(self, storage): - storage.store_artifact("foo", BlobArtifact(b"test")) - - assert storage.summarize("foo").value == "can't summarize artifacts" - - def test_query(self, storage): - storage.store_artifact("foo", BlobArtifact(b"test")) - - assert storage.query("foo", "query").value == "can't query artifacts" diff --git a/tests/unit/memory/tool/storage/test_text_artifact_storage.py b/tests/unit/memory/tool/storage/test_text_artifact_storage.py index 64f44c581..2f49421d4 100644 --- a/tests/unit/memory/tool/storage/test_text_artifact_storage.py +++ b/tests/unit/memory/tool/storage/test_text_artifact_storage.py @@ -25,13 +25,3 @@ def test_load_artifacts(self, storage): def test_can_store(self, storage): assert storage.can_store(TextArtifact("foo")) assert not storage.can_store(BlobArtifact(b"foo")) - - def test_summarize(self, storage): - storage.store_artifact("foo", TextArtifact("test")) - - assert storage.summarize("foo").value == "mock output" - - def test_query(self, storage): - storage.store_artifact("foo", TextArtifact("test")) - - assert storage.query("foo", "query").value == "mock output" diff --git a/tests/unit/memory/tool/test_task_memory.py b/tests/unit/memory/tool/test_task_memory.py index 53e4703a6..2f6ffe1c9 100644 --- a/tests/unit/memory/tool/test_task_memory.py +++ b/tests/unit/memory/tool/test_task_memory.py @@ -96,13 +96,3 @@ def test_load_artifacts_for_blob_list_artifact(self, memory): ) assert len(memory.load_artifacts("test")) == 2 - - def test_summarize_namespace(self, memory): - memory.store_artifact("foo", TextArtifact("test")) - - assert memory.summarize_namespace("foo").value == "mock output" - - def test_query_namespace(self, memory): - memory.store_artifact("foo", TextArtifact("test")) - - assert memory.query_namespace("foo", "query").value == "mock output" diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index 33bfdc5ee..ef5faeff1 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -1,13 +1,11 @@ import pytest -from griptape.engines import PromptSummaryEngine from griptape.memory import TaskMemory from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset from griptape.structures import Agent from griptape.tasks import BaseTask, PromptTask, ToolkitTask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -218,23 +216,13 @@ def test_context(self): assert context["structure"] == agent - def test_task_memory_defaults(self): - prompt_driver = MockPromptDriver() - embedding_driver = MockEmbeddingDriver() - agent = Agent(prompt_driver=prompt_driver) + def test_task_memory_defaults(self, mock_config): + agent = Agent() storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.rag_engine.response_stage.response_modules[0].prompt_driver == prompt_driver - assert ( - storage.rag_engine.retrieval_stage.retrieval_modules[0].vector_store_driver.embedding_driver - == embedding_driver - ) - assert isinstance(storage.summary_engine, PromptSummaryEngine) - assert storage.summary_engine.prompt_driver == prompt_driver - assert storage.csv_extraction_engine.prompt_driver == prompt_driver - assert storage.json_extraction_engine.prompt_driver == prompt_driver + assert storage.vector_store_driver.embedding_driver == mock_config.drivers.embedding def finished_tasks(self): task = PromptTask("test prompt") diff --git a/tests/unit/tasks/test_csv_extraction_task.py b/tests/unit/tasks/test_csv_extraction_task.py deleted file mode 100644 index ec8f70b23..000000000 --- a/tests/unit/tasks/test_csv_extraction_task.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest - -from griptape.engines import CsvExtractionEngine -from griptape.structures import Agent -from griptape.tasks import CsvExtractionTask -from tests.mocks.mock_prompt_driver import MockPromptDriver - - -class TestCsvExtractionTask: - @pytest.fixture() - def task(self): - return CsvExtractionTask(args={"column_names": ["test1"]}) - - def test_run(self, task): - agent = Agent() - - agent.add_task(task) - - result = task.run() - - assert len(result.value) == 1 - assert result.value[0].value == {"test1": "mock output"} - - def test_config_extraction_engine(self, task): - Agent().add_task(task) - - assert isinstance(task.extraction_engine, CsvExtractionEngine) - assert isinstance(task.extraction_engine.prompt_driver, MockPromptDriver) diff --git a/tests/unit/tasks/test_extraction_task.py b/tests/unit/tasks/test_extraction_task.py index 76a4c3bd2..2d7ab442c 100644 --- a/tests/unit/tasks/test_extraction_task.py +++ b/tests/unit/tasks/test_extraction_task.py @@ -8,7 +8,7 @@ class TestExtractionTask: @pytest.fixture() def task(self): - return ExtractionTask(extraction_engine=CsvExtractionEngine(), args={"column_names": ["test1"]}) + return ExtractionTask(extraction_engine=CsvExtractionEngine(column_names=["test1"])) def test_run(self, task): agent = Agent() diff --git a/tests/unit/tasks/test_json_extraction_task.py b/tests/unit/tasks/test_json_extraction_task.py deleted file mode 100644 index 8f9278c3c..000000000 --- a/tests/unit/tasks/test_json_extraction_task.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from schema import Schema - -from griptape.engines import JsonExtractionEngine -from griptape.structures import Agent -from griptape.tasks import JsonExtractionTask -from tests.mocks.mock_prompt_driver import MockPromptDriver - - -class TestJsonExtractionTask: - @pytest.fixture() - def task(self): - return JsonExtractionTask("foo", args={"template_schema": Schema({"foo": "bar"}).json_schema("TemplateSchema")}) - - def test_run(self, task, mock_config): - mock_config.drivers.prompt.mock_output = '[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' - agent = Agent() - - agent.add_task(task) - - result = task.run() - - assert len(result.value) == 2 - assert result.value[0].value == '{"test_key_1": "test_value_1"}' - assert result.value[1].value == '{"test_key_2": "test_value_2"}' - - def test_config_extraction_engine(self, task): - Agent().add_task(task) - - assert isinstance(task.extraction_engine, JsonExtractionEngine) - assert isinstance(task.extraction_engine.prompt_driver, MockPromptDriver) diff --git a/tests/unit/tools/test_extraction_tool.py b/tests/unit/tools/test_extraction_tool.py new file mode 100644 index 000000000..1219da373 --- /dev/null +++ b/tests/unit/tools/test_extraction_tool.py @@ -0,0 +1,67 @@ +import json + +import pytest + +from griptape.artifacts import TextArtifact +from griptape.engines import CsvExtractionEngine, JsonExtractionEngine +from griptape.tools import ExtractionTool +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils import defaults + + +class TestExtractionTool: + @pytest.fixture() + def json_tool(self): + return ExtractionTool( + input_memory=[defaults.text_task_memory("TestMemory")], + extraction_engine=JsonExtractionEngine( + prompt_driver=MockPromptDriver( + mock_output='[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' + ), + template_schema={}, + ), + ) + + @pytest.fixture() + def csv_tool(self): + return ExtractionTool( + input_memory=[defaults.text_task_memory("TestMemory")], + extraction_engine=CsvExtractionEngine( + prompt_driver=MockPromptDriver(), + column_names=["test1"], + ), + ) + + def test_json_extract_artifacts(self, json_tool): + json_tool.input_memory[0].store_artifact("foo", TextArtifact(json.dumps({}))) + + result = json_tool.extract( + {"values": {"data": {"memory_name": json_tool.input_memory[0].name, "artifact_namespace": "foo"}}} + ) + + assert len(result.value) == 2 + assert result.value[0].value == '{"test_key_1": "test_value_1"}' + assert result.value[1].value == '{"test_key_2": "test_value_2"}' + + def test_json_extract_content(self, json_tool): + result = json_tool.extract({"values": {"data": "foo"}}) + + assert len(result.value) == 2 + assert result.value[0].value == '{"test_key_1": "test_value_1"}' + assert result.value[1].value == '{"test_key_2": "test_value_2"}' + + def test_csv_extract_artifacts(self, csv_tool): + csv_tool.input_memory[0].store_artifact("foo", TextArtifact("foo,bar\nbaz,maz")) + + result = csv_tool.extract( + {"values": {"data": {"memory_name": csv_tool.input_memory[0].name, "artifact_namespace": "foo"}}} + ) + + assert len(result.value) == 1 + assert result.value[0].value == {"test1": "mock output"} + + def test_csv_extract_content(self, csv_tool): + result = csv_tool.extract({"values": {"data": "foo"}}) + + assert len(result.value) == 1 + assert result.value[0].value == {"test1": "mock output"} diff --git a/tests/unit/tools/test_prompt_summary_tool.py b/tests/unit/tools/test_prompt_summary_tool.py new file mode 100644 index 000000000..81a03acf5 --- /dev/null +++ b/tests/unit/tools/test_prompt_summary_tool.py @@ -0,0 +1,29 @@ +import pytest + +from griptape.artifacts import TextArtifact +from griptape.engines import PromptSummaryEngine +from griptape.tools import PromptSummaryTool +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils import defaults + + +class TestPromptSummaryTool: + @pytest.fixture() + def tool(self): + return PromptSummaryTool( + input_memory=[defaults.text_task_memory("TestMemory")], + prompt_summary_engine=PromptSummaryEngine(prompt_driver=MockPromptDriver()), + ) + + def test_summarize_artifacts(self, tool): + tool.input_memory[0].store_artifact("foo", TextArtifact("test")) + + assert ( + tool.summarize( + {"values": {"summary": {"memory_name": tool.input_memory[0].name, "artifact_namespace": "foo"}}} + ).value + == "mock output" + ) + + def test_summarize_content(self, tool): + assert tool.summarize({"values": {"summary": "test"}}).value == "mock output" diff --git a/tests/unit/tools/test_query_tool.py b/tests/unit/tools/test_query_tool.py new file mode 100644 index 000000000..dcbee16cf --- /dev/null +++ b/tests/unit/tools/test_query_tool.py @@ -0,0 +1,31 @@ +import pytest + +from griptape.tools.query.tool import QueryTool +from tests.utils import defaults + + +class TestQueryTool: + @pytest.fixture() + def tool(self): + return QueryTool(input_memory=[defaults.text_task_memory("TestMemory")]) + + def test_query_str(self, tool): + assert tool.query({"values": {"query": "test", "content": "foo"}}).value[0].value == "mock output" + + def test_query_artifacts(self, tool): + assert ( + tool.query( + { + "values": { + "query": "test", + "content": { + "memory_name": tool.input_memory[0].name, + "artifact_namespace": "test", + }, + } + } + ) + .value[0] + .value + == "mock output" + ) diff --git a/tests/unit/tools/test_task_memory_tool.py b/tests/unit/tools/test_task_memory_tool.py deleted file mode 100644 index 238001d55..000000000 --- a/tests/unit/tools/test_task_memory_tool.py +++ /dev/null @@ -1,29 +0,0 @@ -import pytest - -from griptape.artifacts import TextArtifact -from griptape.tools import TaskMemoryTool -from tests.utils import defaults - - -class TestTaskMemoryTool: - @pytest.fixture() - def tool(self): - return TaskMemoryTool(off_prompt=True, input_memory=[defaults.text_task_memory("TestMemory")]) - - def test_summarize(self, tool): - tool.input_memory[0].store_artifact("foo", TextArtifact("test")) - - assert ( - tool.summarize({"values": {"memory_name": tool.input_memory[0].name, "artifact_namespace": "foo"}}).value - == "mock output" - ) - - def test_query(self, tool): - tool.input_memory[0].store_artifact("foo", TextArtifact("test")) - - assert ( - tool.query( - {"values": {"query": "foobar", "memory_name": tool.input_memory[0].name, "artifact_namespace": "foo"}} - ).value - == "mock output" - ) diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index 8e9d45fb7..0e26225a9 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -1,25 +1,18 @@ from griptape.artifacts import BlobArtifact, TextArtifact from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver def text_tool_artifact_storage(): vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) return TextArtifactStorage( - rag_engine=rag_engine(MockPromptDriver(), vector_store_driver), vector_store_driver=vector_store_driver, - retrieval_rag_module_name="VectorStoreRetrievalRagModule", - summary_engine=PromptSummaryEngine(), - csv_extraction_engine=CsvExtractionEngine(), - json_extraction_engine=JsonExtractionEngine(), ) From 9111570f7e54da04ada0b5916586f8b01a9a24f5 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 15 Aug 2024 15:13:17 -0700 Subject: [PATCH 218/238] Set logger level in Chat (#1064) --- CHANGELOG.md | 4 +++- griptape/utils/chat.py | 9 +++++++++ tests/unit/utils/test_chat.py | 24 ++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 138a9c896..967738f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `QueryTool` for having the LLM query text. - Support for bitshift composition in `BaseTask` for adding parent/child tasks. - `JsonArtifact` for handling de/seralization of values. +- `Chat.logger_level` for setting what the `Chat` utility sets the logger level to. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. @@ -46,11 +47,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Changed `JsonExtractionEngine.template_schema` from a `run` argument to a class attribute. - **BREAKING**: Changed `CsvExtractionEngine.column_names` from a `run` argument to a class attribute. - **BREAKING**: Removed `JsonExtractionTask`, and `CsvExtractionTask` use `ExtractionTask` instead. -- **BREAKING**: Removed `TaskMemoryClient`, use `RagClient`, `ExtractionTool`, or `PromptSummaryTool` instead. +- **BREAKING**: Removed `TaskMemoryClient`, use `QueryClient`, `ExtractionTool`, or `PromptSummaryTool` instead. - **BREAKING**: `BaseTask.add_parent/child` now take a `BaseTask` instead of `str | BaseTask`. - Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. - `BaseTask.add_parent/child` now returns `self`, allowing for chaining. +- `Chat` now sets the `griptape` logger level to `logging.ERROR`, suppressing all logs except for errors. ### Fixed - `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index 07fea92d8..a5cbce13d 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging from typing import TYPE_CHECKING, Callable, Optional from attrs import Factory, define, field @@ -23,6 +24,7 @@ class Chat: default=Factory(lambda self: self.default_output_fn, takes_self=True), kw_only=True, ) + logger_level: int = field(default=logging.ERROR, kw_only=True) def default_output_fn(self, text: str) -> None: from griptape.tasks.prompt_task import PromptTask @@ -38,6 +40,10 @@ def default_output_fn(self, text: str) -> None: def start(self) -> None: from griptape.config import config + # Hide Griptape's logging output except for errors + old_logger_level = logging.getLogger(config.logging.logger_name).getEffectiveLevel() + logging.getLogger(config.logging.logger_name).setLevel(self.logger_level) + if self.intro_text: self.output_fn(self.intro_text) while True: @@ -57,3 +63,6 @@ def start(self) -> None: else: self.output_fn(self.processing_text) self.output_fn(f"{self.response_prefix}{self.structure.run(question).output_task.output.to_text()}") + + # Restore the original logger level + logging.getLogger(config.logging.logger_name).setLevel(old_logger_level) diff --git a/tests/unit/utils/test_chat.py b/tests/unit/utils/test_chat.py index 5f97d1baf..5c73a6845 100644 --- a/tests/unit/utils/test_chat.py +++ b/tests/unit/utils/test_chat.py @@ -1,3 +1,7 @@ +import logging +from unittest.mock import patch + +from griptape.config import config from griptape.memory.structure import ConversationMemory from griptape.structures import Agent from griptape.utils import Chat @@ -5,8 +9,6 @@ class TestConversation: def test_init(self): - import logging - agent = Agent(conversation_memory=ConversationMemory()) chat = Chat( @@ -18,6 +20,7 @@ def test_init(self): prompt_prefix="Question: ", response_prefix="Answer: ", output_fn=logging.info, + logger_level=logging.INFO, ) assert chat.structure == agent assert chat.exiting_text == "foo..." @@ -26,3 +29,20 @@ def test_init(self): assert chat.prompt_prefix == "Question: " assert chat.response_prefix == "Answer: " assert callable(chat.output_fn) + assert chat.logger_level == logging.INFO + + @patch("builtins.input", side_effect=["exit"]) + def test_chat_logger_level(self, mock_input): + agent = Agent(conversation_memory=ConversationMemory()) + + chat = Chat(agent) + + logger = logging.getLogger(config.logging.logger_name) + logger.setLevel(logging.DEBUG) + + assert logger.getEffectiveLevel() == logging.DEBUG + + chat.start() + + assert logger.getEffectiveLevel() == logging.DEBUG + assert mock_input.call_count == 1 From 4d71eaf5052b827da27294e575f13e6617c6f891 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 15 Aug 2024 16:19:44 -0700 Subject: [PATCH 219/238] Add RET ruff rule (#1065) --- docs/examples/src/multi_agent_workflow_1.py | 8 ++------ .../drivers/src/structure_run_drivers_1.py | 8 ++------ .../structures/src/tasks_16.py | 8 ++------ docs/plugins/swagger_ui_plugin.py | 7 +++---- griptape/common/prompt_stack/prompt_stack.py | 5 +---- .../amazon_s3_file_manager_driver.py | 9 +++------ ...le_diffusion_image_generation_model_driver.py | 6 ++---- .../image_query/anthropic_image_query_driver.py | 4 +--- .../bedrock_claude_image_query_model_driver.py | 4 +--- griptape/drivers/prompt/base_prompt_driver.py | 12 +++--------- griptape/drivers/prompt/google_prompt_driver.py | 4 +--- .../drivers/sql/amazon_redshift_sql_driver.py | 3 ++- griptape/drivers/sql/sql_driver.py | 1 + ...e_cloud_knowledge_base_vector_store_driver.py | 3 +-- .../vector/mongodb_atlas_vector_store_driver.py | 4 +--- .../vector/opensearch_vector_store_driver.py | 6 ++---- .../drivers/vector/qdrant_vector_store_driver.py | 3 +-- .../markdownify_web_scraper_driver.py | 1 + .../trafilatura_web_scraper_driver.py | 13 ++++++------- .../web_search/google_web_search_driver.py | 3 +-- .../engines/extraction/base_extraction_engine.py | 2 +- .../text_loader_retrieval_rag_module.py | 5 ++--- .../engines/summary/prompt_summary_engine.py | 2 +- griptape/loaders/audio_loader.py | 4 +--- griptape/loaders/image_loader.py | 4 +--- griptape/mixins/activity_mixin.py | 8 +++----- griptape/tokenizers/amazon_bedrock_tokenizer.py | 4 +--- griptape/tokenizers/simple_tokenizer.py | 4 +--- griptape/utils/j2.py | 3 +-- griptape/utils/structure_visualizer.py | 3 +-- pyproject.toml | 2 ++ .../vector/test_astra_db_vector_store_driver.py | 3 +-- tests/mocks/mock_failing_prompt_driver.py | 11 +++++------ tests/unit/common/test_observable.py | 3 +++ .../test_hugging_face_pipeline_prompt_driver.py | 3 +-- .../drivers/sql/test_snowflake_sql_driver.py | 16 +++++----------- .../vector/test_astra_db_vector_store_driver.py | 5 +---- .../vector/test_qdrant_vector_store_driver.py | 3 +-- 38 files changed, 69 insertions(+), 128 deletions(-) diff --git a/docs/examples/src/multi_agent_workflow_1.py b/docs/examples/src/multi_agent_workflow_1.py index e1f00a9bd..ad9436a55 100644 --- a/docs/examples/src/multi_agent_workflow_1.py +++ b/docs/examples/src/multi_agent_workflow_1.py @@ -26,7 +26,7 @@ def build_researcher() -> Agent: """Builds a Researcher Structure.""" - researcher = Agent( + return Agent( id="researcher", tools=[ WebSearchTool( @@ -78,8 +78,6 @@ def build_researcher() -> Agent: ], ) - return researcher - def build_writer(role: str, goal: str, backstory: str) -> Agent: """Builds a Writer Structure. @@ -89,7 +87,7 @@ def build_writer(role: str, goal: str, backstory: str) -> Agent: goal: The goal of the writer. backstory: The backstory of the writer. """ - writer = Agent( + return Agent( id=role.lower().replace(" ", "_"), rulesets=[ Ruleset( @@ -123,8 +121,6 @@ def build_writer(role: str, goal: str, backstory: str) -> Agent: ], ) - return writer - if __name__ == "__main__": # Build the team diff --git a/docs/griptape-framework/drivers/src/structure_run_drivers_1.py b/docs/griptape-framework/drivers/src/structure_run_drivers_1.py index 00ab6d60f..a29bfbedf 100644 --- a/docs/griptape-framework/drivers/src/structure_run_drivers_1.py +++ b/docs/griptape-framework/drivers/src/structure_run_drivers_1.py @@ -5,7 +5,7 @@ def build_joke_teller() -> Agent: - joke_teller = Agent( + return Agent( rules=[ Rule( value="You are very funny.", @@ -13,11 +13,9 @@ def build_joke_teller() -> Agent: ], ) - return joke_teller - def build_joke_rewriter() -> Agent: - joke_rewriter = Agent( + return Agent( rules=[ Rule( value="You are the editor of a joke book. But you only speak in riddles", @@ -25,8 +23,6 @@ def build_joke_rewriter() -> Agent: ], ) - return joke_rewriter - joke_coordinator = Pipeline( tasks=[ diff --git a/docs/griptape-framework/structures/src/tasks_16.py b/docs/griptape-framework/structures/src/tasks_16.py index a6da835a6..7496d2d9c 100644 --- a/docs/griptape-framework/structures/src/tasks_16.py +++ b/docs/griptape-framework/structures/src/tasks_16.py @@ -12,7 +12,7 @@ def build_researcher() -> Agent: - researcher = Agent( + return Agent( tools=[ WebSearchTool( web_search_driver=GoogleWebSearchDriver( @@ -63,11 +63,9 @@ def build_researcher() -> Agent: ], ) - return researcher - def build_writer() -> Agent: - writer = Agent( + return Agent( input="Instructions: {{args[0]}}\nContext: {{args[1]}}", rulesets=[ Ruleset( @@ -106,8 +104,6 @@ def build_writer() -> Agent: ], ) - return writer - team = Pipeline( tasks=[ diff --git a/docs/plugins/swagger_ui_plugin.py b/docs/plugins/swagger_ui_plugin.py index 499d74cf5..2f2ca2c4e 100644 --- a/docs/plugins/swagger_ui_plugin.py +++ b/docs/plugins/swagger_ui_plugin.py @@ -20,8 +20,7 @@ def generate_page_contents(page: Any) -> str: env.filters["markdown"] = lambda text: Markup(md.convert(text)) template = env.get_template(tmpl_url) - tmpl_out = template.render(spec_url=spec_url) - return tmpl_out + return template.render(spec_url=spec_url) def on_config(config: Any) -> None: @@ -32,5 +31,5 @@ def on_page_read_source(page: Any, config: Any) -> Any: index_path = os.path.join(config["docs_dir"], config_scheme["outfile"]) page_path = os.path.join(config["docs_dir"], page.file.src_path) if index_path == page_path: - contents = generate_page_contents(page) - return contents + return generate_page_contents(page) + return None diff --git a/griptape/common/prompt_stack/prompt_stack.py b/griptape/common/prompt_stack/prompt_stack.py index 3186dac89..cf6b67040 100644 --- a/griptape/common/prompt_stack/prompt_stack.py +++ b/griptape/common/prompt_stack/prompt_stack.py @@ -71,10 +71,7 @@ def __to_message_content(self, artifact: str | BaseArtifact) -> list[BaseMessage return [ActionResultMessageContent(output, action=action)] elif isinstance(artifact, ListArtifact): processed_contents = [self.__to_message_content(artifact) for artifact in artifact.value] - flattened_content = [ - sub_content for processed_content in processed_contents for sub_content in processed_content - ] + return [sub_content for processed_content in processed_contents for sub_content in processed_content] - return flattened_content else: raise ValueError(f"Unsupported artifact type: {type(artifact)}") diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index e58e46d37..20e432c0b 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -40,8 +40,7 @@ def try_list_files(self, path: str) -> list[str]: if len(files_and_dirs) == 0: if len(self._list_files_and_dirs(full_key.rstrip("/"), max_items=1)) > 0: raise NotADirectoryError - else: - raise FileNotFoundError + raise FileNotFoundError return files_and_dirs def try_load_file(self, path: str) -> bytes: @@ -57,8 +56,7 @@ def try_load_file(self, path: str) -> bytes: except botocore.exceptions.ClientError as e: if e.response["Error"]["Code"] in {"NoSuchKey", "404"}: raise FileNotFoundError from e - else: - raise e + raise e def try_save_file(self, path: str, value: bytes) -> None: full_key = self._to_full_key(path) @@ -141,5 +139,4 @@ def _normpath(self, path: str) -> str: else: stack.append(part) - normalized_path = "/".join(stack) - return normalized_path + return "/".join(stack) diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 92428e157..0ec7d03d2 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -139,9 +139,7 @@ def _request_parameters( request["mask_source"] = mask_source request["mask_image"] = mask.base64 - request = {k: v for k, v in request.items() if v is not None} - - return request + return {k: v for k, v in request.items() if v is not None} def get_generated_image(self, response: dict) -> bytes: image_response = response["artifacts"][0] @@ -149,7 +147,7 @@ def get_generated_image(self, response: dict) -> bytes: # finishReason may be SUCCESS, CONTENT_FILTERED, or ERROR. if image_response.get("finishReason") == "ERROR": raise Exception(f"Image generation failed: {image_response.get('finishReason')}") - elif image_response.get("finishReason") == "CONTENT_FILTERED": + if image_response.get("finishReason") == "CONTENT_FILTERED": logging.warning("Image generation triggered content filter and may be blurred") return base64.decodebytes(bytes(image_response.get("base64"), "utf-8")) diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index bd19862ec..a50685724 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -47,9 +47,7 @@ def _base_params(self, text_query: str, images: list[ImageArtifact]) -> dict: content = [self._construct_image_message(image) for image in images] content.append(self._construct_text_message(text_query)) messages = self._construct_messages(content) - params = {"model": self.model, "messages": messages, "max_tokens": self.max_tokens} - - return params + return {"model": self.model, "messages": messages, "max_tokens": self.max_tokens} def _construct_image_message(self, image_data: ImageArtifact) -> dict: data = image_data.base64 diff --git a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py index 8260ce3d5..1785550a0 100644 --- a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py @@ -14,9 +14,7 @@ def image_query_request_parameters(self, query: str, images: list[ImageArtifact] content = [self._construct_image_message(image) for image in images] content.append(self._construct_text_message(query)) messages = self._construct_messages(content) - input_params = {"messages": messages, "anthropic_version": self.ANTHROPIC_VERSION, "max_tokens": max_tokens} - - return input_params + return {"messages": messages, "anthropic_version": self.ANTHROPIC_VERSION, "max_tokens": max_tokens} def process_output(self, output: dict) -> TextArtifact: content_blocks = output["content"] diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 8044469b5..43b31306c 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -108,9 +108,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: ... def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: ... def __process_run(self, prompt_stack: PromptStack) -> Message: - result = self.try_run(prompt_stack) - - return result + return self.try_run(prompt_stack) def __process_stream(self, prompt_stack: PromptStack) -> Message: delta_contents: dict[int, list[BaseDeltaMessageContent]] = {} @@ -136,9 +134,7 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: event_bus.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas - result = self.__build_message(list(delta_contents.values()), usage) - - return result + return self.__build_message(list(delta_contents.values()), usage) def __build_message( self, delta_contents: list[list[BaseDeltaMessageContent]], usage: DeltaMessage.Usage @@ -153,10 +149,8 @@ def __build_message( if action_deltas: content.append(ActionCallMessageContent.from_deltas(action_deltas)) - result = Message( + return Message( content=content, role=Message.ASSISTANT_ROLE, usage=Message.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), ) - - return result diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 06f9dfbe6..57ebbd338 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -155,7 +155,7 @@ def _default_model_client(self) -> GenerativeModel: def __to_google_messages(self, prompt_stack: PromptStack) -> ContentsType: types = import_optional_dependency("google.generativeai.types") - inputs = [ + return [ types.ContentDict( { "role": self.__to_google_role(message), @@ -166,8 +166,6 @@ def __to_google_messages(self, prompt_stack: PromptStack) -> ContentsType: if not message.is_system() ] - return inputs - def __to_google_role(self, message: Message) -> str: if message.is_assistant(): return "model" diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index 5ae85c495..837405e83 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -29,7 +29,7 @@ class AmazonRedshiftSqlDriver(BaseSqlDriver): def validate_params(self, _: Attribute, workgroup_name: Optional[str]) -> None: if not self.cluster_identifier and not self.workgroup_name: raise ValueError("Provide a value for one of `cluster_identifier` or `workgroup_name`") - elif self.cluster_identifier and self.workgroup_name: + if self.cluster_identifier and self.workgroup_name: raise ValueError("Provide a value for either `cluster_identifier` or `workgroup_name`, but not both") @classmethod @@ -92,6 +92,7 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Optional[Any] elif statement["Status"] in ["FAILED", "ABORTED"]: return None + return None def get_table_schema(self, table_name: str, schema: Optional[str] = None) -> Optional[str]: function_kwargs = {"Database": self.database, "Table": table_name} diff --git a/griptape/drivers/sql/sql_driver.py b/griptape/drivers/sql/sql_driver.py index 0e3d1d4b7..d2293f94d 100644 --- a/griptape/drivers/sql/sql_driver.py +++ b/griptape/drivers/sql/sql_driver.py @@ -41,6 +41,7 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Optional[Any] return [dict(result._mapping) for result in results] else: con.commit() + return None else: raise ValueError("No result found") diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index 34b646846..a3bd6a011 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -105,8 +105,7 @@ def query( response = requests.post(url, json=request, headers=self.headers).json() entries = response.get("entries", []) - entry_list = [BaseVectorStoreDriver.Entry.from_dict(entry) for entry in entries] - return entry_list + return [BaseVectorStoreDriver.Entry.from_dict(entry) for entry in entries] def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index 34b1d3a5e..bc3f1e22f 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -160,7 +160,7 @@ def query( if namespace: pipeline[0]["$vectorSearch"]["filter"] = {"namespace": namespace} - results = [ + return [ BaseVectorStoreDriver.Entry( id=str(doc["_id"]), vector=doc[self.vector_path] if include_vectors else [], @@ -171,8 +171,6 @@ def query( for doc in collection.aggregate(pipeline) ] - return results - def delete_vector(self, vector_id: str) -> None: """Deletes the vector from the collection.""" collection = self.get_collection() diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 267b549b7..cf944116a 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -83,13 +83,12 @@ def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Opti if response["hits"]["total"]["value"] > 0: vector_data = response["hits"]["hits"][0]["_source"] - entry = BaseVectorStoreDriver.Entry( + return BaseVectorStoreDriver.Entry( id=vector_id, meta=vector_data.get("metadata"), vector=vector_data.get("vector"), namespace=vector_data.get("namespace"), ) - return entry else: return None except Exception as e: @@ -109,7 +108,7 @@ def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorSto response = self.client.search(index=self.index_name, body=query_body) - entries = [ + return [ BaseVectorStoreDriver.Entry( id=hit["_id"], vector=hit["_source"].get("vector"), @@ -118,7 +117,6 @@ def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorSto ) for hit in response["hits"]["hits"] ] - return entries def query( self, diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index c33b7eb2e..154e54af7 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -114,7 +114,7 @@ def query( results = self.client.search(**request) # Convert results to QueryResult objects - query_results = [ + return [ BaseVectorStoreDriver.Entry( id=result.id, vector=result.vector if include_vectors else [], @@ -123,7 +123,6 @@ def query( ) for result in results ] - return query_results def upsert_vector( self, diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 556d5e06e..b54ff072f 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -60,6 +60,7 @@ def skip_loading_images(route: Any) -> Any: if route.request.resource_type == "image": return route.abort() route.continue_() + return None page.route("**/*", skip_loading_images) diff --git a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py index 0763155d5..06f5573a4 100644 --- a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py @@ -29,13 +29,12 @@ def scrape_url(self, url: str) -> TextArtifact: if page is None: raise Exception("can't access URL") - else: - extracted_page = trafilatura.extract( - page, - include_links=self.include_links, - output_format="json", - config=config, - ) + extracted_page = trafilatura.extract( + page, + include_links=self.include_links, + output_format="json", + config=config, + ) if not extracted_page: raise Exception("can't extract page") diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py index b5ba01cb6..012c52307 100644 --- a/griptape/drivers/web_search/google_web_search_driver.py +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -33,9 +33,8 @@ def _search_google(self, query: str, **kwargs) -> list[dict]: if response.status_code == 200: data = response.json() - links = [{"url": r["link"], "title": r["title"], "description": r["snippet"]} for r in data["items"]] + return [{"url": r["link"], "title": r["title"], "description": r["snippet"]} for r in data["items"]] - return links else: raise Exception( f"Google Search API returned an error with status code " diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index 4b1184e5e..8f61bb764 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -31,7 +31,7 @@ class BaseExtractionEngine(ABC): def validate_max_token_multiplier(self, _: Attribute, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") - elif max_token_multiplier <= 0: + if max_token_multiplier <= 0: raise ValueError("has to be greater than 0") @property diff --git a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py index b79668583..4f53cc5f9 100644 --- a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py @@ -40,7 +40,6 @@ def run(self, context: RagContext) -> Sequence[TextArtifact]: if isinstance(loader_output, ErrorArtifact): raise Exception(loader_output.to_text() if loader_output.exception is None else loader_output.exception) - else: - self.vector_store_driver.upsert_text_artifacts({namespace: loader_output}) + self.vector_store_driver.upsert_text_artifacts({namespace: loader_output}) - return self.process_query_output_fn(self.vector_store_driver.query(context.query, **query_params)) + return self.process_query_output_fn(self.vector_store_driver.query(context.query, **query_params)) diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 82c33a0ad..065677e1b 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -35,7 +35,7 @@ class PromptSummaryEngine(BaseSummaryEngine): def validate_allowlist(self, _: Attribute, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") - elif max_token_multiplier <= 0: + if max_token_multiplier <= 0: raise ValueError("has to be greater than 0") @property diff --git a/griptape/loaders/audio_loader.py b/griptape/loaders/audio_loader.py index 532662e79..84d6b767a 100644 --- a/griptape/loaders/audio_loader.py +++ b/griptape/loaders/audio_loader.py @@ -14,9 +14,7 @@ class AudioLoader(BaseLoader): """Loads audio content into audio artifacts.""" def load(self, source: bytes, *args, **kwargs) -> AudioArtifact: - audio_artifact = AudioArtifact(source, format=import_optional_dependency("filetype").guess(source).extension) - - return audio_artifact + return AudioArtifact(source, format=import_optional_dependency("filetype").guess(source).extension) def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, AudioArtifact]: return cast(dict[str, AudioArtifact], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index b7a277edb..83060dfa8 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -42,9 +42,7 @@ def load(self, source: bytes, *args, **kwargs) -> ImageArtifact: image = pil_image.open(byte_stream) source = byte_stream.getvalue() - image_artifact = ImageArtifact(source, format=image.format.lower(), width=image.width, height=image.height) - - return image_artifact + return ImageArtifact(source, format=image.format.lower(), width=image.width, height=image.height) def _get_mime_type(self, image_format: str | None) -> str: if image_format is None: diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index b137fe44e..61e8076b1 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -77,19 +77,17 @@ def find_activity(self, name: str) -> Optional[Callable]: def activity_name(self, activity: Callable) -> str: if activity is None or not getattr(activity, "is_activity", False): raise Exception("This method is not an activity.") - else: - return getattr(activity, "name") + return getattr(activity, "name") def activity_description(self, activity: Callable) -> str: if activity is None or not getattr(activity, "is_activity", False): raise Exception("This method is not an activity.") - else: - return Template(getattr(activity, "config")["description"]).render({"_self": self}) + return Template(getattr(activity, "config")["description"]).render({"_self": self}) def activity_schema(self, activity: Callable) -> Optional[Schema]: if activity is None or not getattr(activity, "is_activity", False): raise Exception("This method is not an activity.") - elif getattr(activity, "config")["schema"] is not None: + if getattr(activity, "config")["schema"] is not None: # Need to deepcopy to avoid modifying the original schema config_schema = deepcopy(getattr(activity, "config")["schema"]) activity_name = self.activity_name(activity) diff --git a/griptape/tokenizers/amazon_bedrock_tokenizer.py b/griptape/tokenizers/amazon_bedrock_tokenizer.py index 292dcde17..bd758c554 100644 --- a/griptape/tokenizers/amazon_bedrock_tokenizer.py +++ b/griptape/tokenizers/amazon_bedrock_tokenizer.py @@ -37,6 +37,4 @@ class AmazonBedrockTokenizer(BaseTokenizer): characters_per_token: int = field(default=4, kw_only=True) def count_tokens(self, text: str) -> int: - num_tokens = (len(text) + self.characters_per_token - 1) // self.characters_per_token - - return num_tokens + return (len(text) + self.characters_per_token - 1) // self.characters_per_token diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index 214e5be2d..97053acb2 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -11,6 +11,4 @@ class SimpleTokenizer(BaseTokenizer): characters_per_token: int = field(kw_only=True) def count_tokens(self, text: str) -> int: - num_tokens = (len(text) + self.characters_per_token - 1) // self.characters_per_token - - return num_tokens + return (len(text) + self.characters_per_token - 1) // self.characters_per_token diff --git a/griptape/utils/j2.py b/griptape/utils/j2.py index 70cf936db..3aecd8e3c 100644 --- a/griptape/utils/j2.py +++ b/griptape/utils/j2.py @@ -23,8 +23,7 @@ class J2: def render(self, **kwargs) -> str: if self.template_name is None: raise ValueError("template_name is required.") - else: - return self.environment.get_template(self.template_name).render(kwargs).rstrip() + return self.environment.get_template(self.template_name).render(kwargs).rstrip() def render_from_string(self, value: str, **kwargs) -> str: return self.environment.from_string(value).render(kwargs) diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py index f24443cd6..260f6efb8 100644 --- a/griptape/utils/structure_visualizer.py +++ b/griptape/utils/structure_visualizer.py @@ -34,8 +34,7 @@ def to_url(self) -> str: graph_bytes = graph.encode("utf-8") base64_string = base64.b64encode(graph_bytes).decode("utf-8") - url = f"https://mermaid.ink/svg/{base64_string}" - return url + return f"https://mermaid.ink/svg/{base64_string}" def __render_task(self, task: BaseTask) -> str: if task.children: diff --git a/pyproject.toml b/pyproject.toml index 54b984261..147d59a9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -271,6 +271,7 @@ select = [ "G", # flake8-logging-format "T20", # flake8-print "PT", # flake8-pytest-style + "RET", # flake8-return "SIM", # flake8-simplify "TID", # flake8-tidy-imports "TCH", # flake8-type-checking @@ -299,6 +300,7 @@ ignore = [ "ANN102", # missing-type-cls "ANN401", # any-type "PT011", # pytest-raises-too-broad + "RET505" # superfluous-else-return ] [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py b/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py index 94dbb8570..caa89144c 100644 --- a/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py +++ b/tests/integration/drivers/vector/test_astra_db_vector_store_driver.py @@ -45,14 +45,13 @@ def vector_store_collection(self): @pytest.fixture() def vector_store_driver(self, embedding_driver, vector_store_collection): - driver = AstraDbVectorStoreDriver( + return AstraDbVectorStoreDriver( api_endpoint=os.environ["ASTRA_DB_API_ENDPOINT"], token=os.environ["ASTRA_DB_APPLICATION_TOKEN"], collection_name=vector_store_collection.name, astra_db_namespace=os.environ.get("ASTRA_DB_KEYSPACE"), embedding_driver=embedding_driver, ) - return driver def test_vector_crud(self, vector_store_driver, vector_store_collection, embedding_driver): """Test basic vector CRUD, various call patterns.""" diff --git a/tests/mocks/mock_failing_prompt_driver.py b/tests/mocks/mock_failing_prompt_driver.py index 18895fdc9..9c760aab6 100644 --- a/tests/mocks/mock_failing_prompt_driver.py +++ b/tests/mocks/mock_failing_prompt_driver.py @@ -25,12 +25,11 @@ def try_run(self, prompt_stack: PromptStack) -> Message: self.current_attempt += 1 raise Exception("failed attempt") - else: - return Message( - content=[TextMessageContent(TextArtifact("success"))], - role=Message.ASSISTANT_ROLE, - usage=Message.Usage(input_tokens=100, output_tokens=100), - ) + return Message( + content=[TextMessageContent(TextArtifact("success"))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), + ) def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: if self.current_attempt < self.max_failures: diff --git a/tests/unit/common/test_observable.py b/tests/unit/common/test_observable.py index f48c3086c..c06be5bb1 100644 --- a/tests/unit/common/test_observable.py +++ b/tests/unit/common/test_observable.py @@ -19,6 +19,7 @@ def bar(*args, **kwargs): """Bar's docstring.""" if args: return args[0] + return None assert bar() is None assert bar("a") == "a" @@ -48,6 +49,7 @@ def test_observable_function_empty_parenthesis(self, observe_spy): def bar(*args, **kwargs): if args: return args[0] + return None assert bar() is None assert bar("a") == "a" @@ -73,6 +75,7 @@ def test_observable_function_args(self, observe_spy): def bar(*args, **kwargs): if args: return args[0] + return None assert bar() is None assert bar("a") == "a" diff --git a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py index 5323f5d2d..0ece6c976 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py @@ -7,8 +7,7 @@ class TestHuggingFacePipelinePromptDriver: @pytest.fixture(autouse=True) def mock_pipeline(self, mocker): - mock_pipeline = mocker.patch("transformers.pipeline") - return mock_pipeline + return mocker.patch("transformers.pipeline") @pytest.fixture(autouse=True) def mock_generator(self, mock_pipeline): diff --git a/tests/unit/drivers/sql/test_snowflake_sql_driver.py b/tests/unit/drivers/sql/test_snowflake_sql_driver.py index a2887cb12..a758bb3a2 100644 --- a/tests/unit/drivers/sql/test_snowflake_sql_driver.py +++ b/tests/unit/drivers/sql/test_snowflake_sql_driver.py @@ -21,8 +21,7 @@ class Column: name: str type: str = "VARCHAR" - mock_table = mocker.MagicMock(name="table", columns=[Column("first_name"), Column("last_name")]) - return mock_table + return mocker.MagicMock(name="table", columns=[Column("first_name"), Column("last_name")]) @pytest.fixture() def mock_metadata(self, mocker): @@ -49,27 +48,22 @@ def mock_snowflake_engine(self, mocker): @pytest.fixture() def mock_snowflake_connection(self, mocker): - mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection") - return mock_connection + return mocker.MagicMock(spec=SnowflakeConnection, name="connection") @pytest.fixture() def mock_snowflake_connection_no_schema(self, mocker): - mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_schema", schema=None) - return mock_connection + return mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_schema", schema=None) @pytest.fixture() def mock_snowflake_connection_no_database(self, mocker): - mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_database", database=None) - return mock_connection + return mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_database", database=None) @pytest.fixture() def driver(self, mock_snowflake_engine, mock_snowflake_connection): def get_connection(): return mock_snowflake_connection - new_driver = SnowflakeSqlDriver(connection_func=get_connection, engine=mock_snowflake_engine) - - return new_driver + return SnowflakeSqlDriver(connection_func=get_connection, engine=mock_snowflake_engine) def test_connection_function_wrong_return_type(self): def get_connection() -> Any: diff --git a/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py b/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py index 16e6530b3..b544a3494 100644 --- a/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_astra_db_vector_store_driver.py @@ -9,10 +9,7 @@ class TestAstraDbVectorStoreDriver: @pytest.fixture(autouse=True) def base_mock_collection(self, mocker): - mock_get_collection = mocker.patch( - "astrapy.DataAPIClient" - ).return_value.get_database.return_value.get_collection - return mock_get_collection + return mocker.patch("astrapy.DataAPIClient").return_value.get_database.return_value.get_collection @pytest.fixture() def mock_collection(self, base_mock_collection, one_document): diff --git a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py index 0b22784eb..ffb359953 100644 --- a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py @@ -20,7 +20,7 @@ def mock_engine(self): @pytest.fixture(autouse=True) def driver(self, embedding_driver, mocker): mocker.patch("qdrant_client.QdrantClient") - driver = QdrantVectorStoreDriver( + return QdrantVectorStoreDriver( url="http://some_url", port=8080, grpc_port=50051, @@ -36,7 +36,6 @@ def driver(self, embedding_driver, mocker): content_payload_key="data", embedding_driver=embedding_driver, ) - return driver def test_attrs_post_init(self, driver): with patch("griptape.drivers.vector.qdrant_vector_store_driver.import_optional_dependency") as mock_import: From 54efe3badc6319c5d640c81863714497ec139088 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 16 Aug 2024 11:07:22 -0700 Subject: [PATCH 220/238] Flatten rag tool outputs (#1066) --- griptape/tools/rag/tool.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/griptape/tools/rag/tool.py b/griptape/tools/rag/tool.py index 8608493d1..aab52e6c0 100644 --- a/griptape/tools/rag/tool.py +++ b/griptape/tools/rag/tool.py @@ -5,7 +5,7 @@ from attrs import define, field from schema import Literal, Schema -from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact +from griptape.artifacts import ErrorArtifact, ListArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -31,11 +31,18 @@ class RagTool(BaseTool): "schema": Schema({Literal("query", description="A natural language search query"): str}), }, ) - def search(self, params: dict) -> BaseArtifact: + def search(self, params: dict) -> ListArtifact | ErrorArtifact: query = params["values"]["query"] try: - outputs = self.rag_engine.process_query(query).outputs + artifacts = self.rag_engine.process_query(query).outputs + + outputs = [] + for artifact in artifacts: + if isinstance(artifact, ListArtifact): + outputs.extend(artifact.value) + else: + outputs.append(artifact) if len(outputs) > 0: return ListArtifact(outputs) From 24a682439b8978fa2a011baa96fa2731dc66b83a Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 16 Aug 2024 13:12:07 -0700 Subject: [PATCH 221/238] Chore/merge (#1072) --- CHANGELOG.md | 5 +++++ griptape/structures/workflow.py | 31 ++++++++++++++++--------------- griptape/tasks/toolkit_task.py | 7 ++++++- pyproject.toml | 2 +- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 967738f31..54cecbdc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. +## [0.29.2] - 2024-08-16 + +### Fixed +- `Workflow` threads not being properly cleaned up after completion. +- Crash when `ToolAction`s were missing output due to an `ActionsSubtask` exception. ## [0.29.1] - 2024-08-02 diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 53e59e751..f8a3a6ee0 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -94,21 +94,22 @@ def insert_task( def try_run(self, *args) -> Workflow: exit_loop = False - while not self.is_finished() and not exit_loop: - futures_list = {} - ordered_tasks = self.order_tasks() - - for task in ordered_tasks: - if task.can_execute(): - future = self.futures_executor_fn().submit(task.execute) - futures_list[future] = task - - # Wait for all tasks to complete - for future in futures.as_completed(futures_list): - if isinstance(future.result(), ErrorArtifact) and self.fail_fast: - exit_loop = True - - break + with self.futures_executor_fn() as executor: + while not self.is_finished() and not exit_loop: + futures_list = {} + ordered_tasks = self.order_tasks() + + for task in ordered_tasks: + if task.can_execute(): + future = executor.submit(task.execute) + futures_list[future] = task + + # Wait for all tasks to complete + for future in futures.as_completed(futures_list): + if isinstance(future.result(), ErrorArtifact) and self.fail_fast: + exit_loop = True + + break if self.conversation_memory and self.output is not None: run = Run(input=self.input_task.input, output=self.output) diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index b28c76575..24607a352 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -84,7 +84,12 @@ def prompt_stack(self) -> PromptStack: for action in s.actions ] action_results = [ - ToolAction(name=action.name, path=action.path, tag=action.tag, output=action.output) + ToolAction( + name=action.name, + path=action.path, + tag=action.tag, + output=action.output if action.output is not None else s.output, + ) for action in s.actions ] diff --git a/pyproject.toml b/pyproject.toml index 147d59a9d..c1a91271c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "griptape" -version = "0.29.1" +version = "0.29.2" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = ["Griptape "] license = "Apache 2.0" From 14a0f0d5ff927a8d8a8df6b6ed0328e7dd411435 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Fri, 16 Aug 2024 16:26:26 -0600 Subject: [PATCH 222/238] Add and integrate `FuturesExecutorMixin` (#1069) --- CHANGELOG.md | 1 + .../base_event_listener_driver.py | 14 ++---- .../vector/base_vector_store_driver.py | 48 ++++++++----------- .../engines/rag/modules/base_rag_module.py | 9 ++-- griptape/engines/rag/stages/base_rag_stage.py | 11 ++--- .../engines/rag/stages/response_rag_stage.py | 5 +- .../engines/rag/stages/retrieval_rag_stage.py | 5 +- griptape/loaders/base_loader.py | 22 ++++----- griptape/mixins/__init__.py | 2 + griptape/mixins/futures_executor_mixin.py | 32 +++++++++++++ griptape/structures/workflow.py | 37 +++++++------- griptape/tasks/actions_subtask.py | 5 +- griptape/tasks/base_task.py | 10 ++-- tests/mocks/mock_futures_executor.py | 4 ++ .../test_base_event_listener_driver.py | 2 - .../mixins/test_futures_executor_mixin.py | 10 ++++ 16 files changed, 119 insertions(+), 98 deletions(-) create mode 100644 griptape/mixins/futures_executor_mixin.py create mode 100644 tests/mocks/mock_futures_executor.py create mode 100644 tests/unit/mixins/test_futures_executor_mixin.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 54cecbdc1..03ead3395 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support for bitshift composition in `BaseTask` for adding parent/child tasks. - `JsonArtifact` for handling de/seralization of values. - `Chat.logger_level` for setting what the `Chat` utility sets the logger level to. +- `FuturesExecutorMixin` to DRY up and optimize concurrent code across multiple classes. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 9f7cb79fb..0af57f0f3 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -2,11 +2,12 @@ import logging from abc import ABC, abstractmethod -from concurrent import futures -from typing import TYPE_CHECKING, Callable +from typing import TYPE_CHECKING from attrs import Factory, define, field +from griptape.mixins import FuturesExecutorMixin + if TYPE_CHECKING: from griptape.events import BaseEvent @@ -14,11 +15,7 @@ @define -class BaseEventListenerDriver(ABC): - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - kw_only=True, - ) +class BaseEventListenerDriver(FuturesExecutorMixin, ABC): batched: bool = field(default=True, kw_only=True) batch_size: int = field(default=10, kw_only=True) @@ -29,8 +26,7 @@ def batch(self) -> list[dict]: return self._batch def publish_event(self, event: BaseEvent | dict, *, flush: bool = False) -> None: - with self.futures_executor_fn() as executor: - executor.submit(self._safe_try_publish_event, event, flush=flush) + self.futures_executor.submit(self._safe_try_publish_event, event, flush=flush) @abstractmethod def try_publish_event_payload(self, event_payload: dict) -> None: ... diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index ed1f2d589..7ebccdcad 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -2,22 +2,21 @@ import uuid from abc import ABC, abstractmethod -from concurrent import futures from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import define, field from griptape import utils from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact -from griptape.mixins import SerializableMixin +from griptape.mixins import FuturesExecutorMixin, SerializableMixin if TYPE_CHECKING: from griptape.drivers import BaseEmbeddingDriver @define -class BaseVectorStoreDriver(SerializableMixin, ABC): +class BaseVectorStoreDriver(SerializableMixin, FuturesExecutorMixin, ABC): DEFAULT_QUERY_COUNT = 5 @dataclass @@ -36,10 +35,6 @@ def to_artifact(self) -> BaseArtifact: return BaseArtifact.from_json(self.meta["artifact"]) # pyright: ignore[reportOptionalSubscript] embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - kw_only=True, - ) def upsert_text_artifacts( self, @@ -48,24 +43,23 @@ def upsert_text_artifacts( meta: Optional[dict] = None, **kwargs, ) -> None: - with self.futures_executor_fn() as executor: - if isinstance(artifacts, list): - utils.execute_futures_list( - [ - executor.submit(self.upsert_text_artifact, a, namespace=None, meta=meta, **kwargs) - for a in artifacts - ], - ) - else: - utils.execute_futures_dict( - { - namespace: executor.submit( - self.upsert_text_artifact, a, namespace=namespace, meta=meta, **kwargs - ) - for namespace, artifact_list in artifacts.items() - for a in artifact_list - }, - ) + if isinstance(artifacts, list): + utils.execute_futures_list( + [ + self.futures_executor.submit(self.upsert_text_artifact, a, namespace=None, meta=meta, **kwargs) + for a in artifacts + ], + ) + else: + utils.execute_futures_dict( + { + namespace: self.futures_executor.submit( + self.upsert_text_artifact, a, namespace=namespace, meta=meta, **kwargs + ) + for namespace, artifact_list in artifacts.items() + for a in artifact_list + }, + ) def upsert_text_artifact( self, diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 01d6d1b1d..668b3aced 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -2,25 +2,22 @@ import uuid from abc import ABC -from concurrent import futures -from typing import TYPE_CHECKING, Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field from griptape.common import Message, PromptStack +from griptape.mixins import FuturesExecutorMixin if TYPE_CHECKING: from griptape.engines.rag import RagContext @define(kw_only=True) -class BaseRagModule(ABC): +class BaseRagModule(FuturesExecutorMixin, ABC): name: str = field( default=Factory(lambda self: f"{self.__class__.__name__}-{uuid.uuid4().hex}", takes_self=True), kw_only=True ) - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - ) def generate_prompt_stack(self, system_prompt: Optional[str], query: str) -> PromptStack: messages = [] diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index 4f5a9bcd1..6a28551b4 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -1,20 +1,15 @@ from abc import ABC, abstractmethod from collections.abc import Sequence -from concurrent import futures -from typing import Callable -from attrs import Factory, define, field +from attrs import define from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule +from griptape.mixins import FuturesExecutorMixin @define(kw_only=True) -class BaseRagStage(ABC): - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - ) - +class BaseRagStage(FuturesExecutorMixin, ABC): @abstractmethod def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py index 4bc0b2be5..de286317c 100644 --- a/griptape/engines/rag/stages/response_rag_stage.py +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -31,8 +31,9 @@ def modules(self) -> list[BaseRagModule]: def run(self, context: RagContext) -> RagContext: logging.info("ResponseRagStage: running %s retrieval modules in parallel", len(self.response_modules)) - with self.futures_executor_fn() as executor: - results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.response_modules]) + results = utils.execute_futures_list( + [self.futures_executor.submit(r.run, context) for r in self.response_modules] + ) context.outputs = results diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index fa618a7ff..6ce9fb19f 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -35,8 +35,9 @@ def modules(self) -> list[BaseRagModule]: def run(self, context: RagContext) -> RagContext: logging.info("RetrievalRagStage: running %s retrieval modules in parallel", len(self.retrieval_modules)) - with self.futures_executor_fn() as executor: - results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.retrieval_modules]) + results = utils.execute_futures_list( + [self.futures_executor.submit(r.run, context) for r in self.retrieval_modules] + ) # flatten the list of lists results = list(itertools.chain.from_iterable(results)) diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 09551d9ab..525b4df0a 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -1,11 +1,11 @@ from __future__ import annotations from abc import ABC, abstractmethod -from concurrent import futures -from typing import TYPE_CHECKING, Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import define, field +from griptape.mixins import FuturesExecutorMixin from griptape.utils.futures import execute_futures_dict from griptape.utils.hash import bytes_to_hash, str_to_hash @@ -16,11 +16,7 @@ @define -class BaseLoader(ABC): - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - kw_only=True, - ) +class BaseLoader(FuturesExecutorMixin, ABC): encoding: Optional[str] = field(default=None, kw_only=True) @abstractmethod @@ -36,10 +32,12 @@ def load_collection( # to avoid duplicate work. sources_by_key = {self.to_key(source): source for source in sources} - with self.futures_executor_fn() as executor: - return execute_futures_dict( - {key: executor.submit(self.load, source, *args, **kwargs) for key, source in sources_by_key.items()}, - ) + return execute_futures_dict( + { + key: self.futures_executor.submit(self.load, source, *args, **kwargs) + for key, source in sources_by_key.items() + }, + ) def to_key(self, source: Any, *args, **kwargs) -> str: if isinstance(source, bytes): diff --git a/griptape/mixins/__init__.py b/griptape/mixins/__init__.py index d9eea53c2..1bfa95c9a 100644 --- a/griptape/mixins/__init__.py +++ b/griptape/mixins/__init__.py @@ -4,6 +4,7 @@ from .rule_mixin import RuleMixin from .serializable_mixin import SerializableMixin from .media_artifact_file_output_mixin import BlobArtifactFileOutputMixin +from .futures_executor_mixin import FuturesExecutorMixin __all__ = [ "ActivityMixin", @@ -12,4 +13,5 @@ "RuleMixin", "BlobArtifactFileOutputMixin", "SerializableMixin", + "FuturesExecutorMixin", ] diff --git a/griptape/mixins/futures_executor_mixin.py b/griptape/mixins/futures_executor_mixin.py new file mode 100644 index 000000000..6c09aee32 --- /dev/null +++ b/griptape/mixins/futures_executor_mixin.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import threading +from abc import ABC +from concurrent import futures +from typing import Callable, Optional + +from attrs import Factory, define, field + + +@define(slots=False, kw_only=True) +class FuturesExecutorMixin(ABC): + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + ) + thread_lock: threading.Lock = field(default=Factory(lambda: threading.Lock())) + + _futures_executor: Optional[futures.Executor] = field(init=False, default=None) + + @property + def futures_executor(self) -> futures.Executor: + with self.thread_lock: + if self._futures_executor is None: + self._futures_executor = self.futures_executor_fn() + + return self._futures_executor + + def __del__(self) -> None: + with self.thread_lock: + if self._futures_executor: + self._futures_executor.shutdown(wait=True) + self._futures_executor = None diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index f8a3a6ee0..f1e1ec86b 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -1,14 +1,15 @@ from __future__ import annotations import concurrent.futures as futures -from typing import TYPE_CHECKING, Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import define from graphlib import TopologicalSorter from griptape.artifacts import ErrorArtifact from griptape.common import observable from griptape.memory.structure import Run +from griptape.mixins import FuturesExecutorMixin from griptape.structures import Structure if TYPE_CHECKING: @@ -16,12 +17,7 @@ @define -class Workflow(Structure): - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - kw_only=True, - ) - +class Workflow(Structure, FuturesExecutorMixin): @property def input_task(self) -> Optional[BaseTask]: return self.order_tasks()[0] if self.tasks else None @@ -94,22 +90,21 @@ def insert_task( def try_run(self, *args) -> Workflow: exit_loop = False - with self.futures_executor_fn() as executor: - while not self.is_finished() and not exit_loop: - futures_list = {} - ordered_tasks = self.order_tasks() + while not self.is_finished() and not exit_loop: + futures_list = {} + ordered_tasks = self.order_tasks() - for task in ordered_tasks: - if task.can_execute(): - future = executor.submit(task.execute) - futures_list[future] = task + for task in ordered_tasks: + if task.can_execute(): + future = self.futures_executor.submit(task.execute) + futures_list[future] = task - # Wait for all tasks to complete - for future in futures.as_completed(futures_list): - if isinstance(future.result(), ErrorArtifact) and self.fail_fast: - exit_loop = True + # Wait for all tasks to complete + for future in futures.as_completed(futures_list): + if isinstance(future.result(), ErrorArtifact) and self.fail_fast: + exit_loop = True - break + break if self.conversation_memory and self.output is not None: run = Run(input=self.input_task.input, output=self.output) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 7d2fb5efd..befad59e0 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -139,8 +139,9 @@ def run(self) -> BaseArtifact: return ErrorArtifact("no tool output") def execute_actions(self, actions: list[ToolAction]) -> list[tuple[str, BaseArtifact]]: - with self.futures_executor_fn() as executor: - results = utils.execute_futures_dict({a.tag: executor.submit(self.execute_action, a) for a in actions}) + results = utils.execute_futures_dict( + {a.tag: self.futures_executor.submit(self.execute_action, a) for a in actions} + ) return list(results.values()) diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 1899eccd6..f5a772e48 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -3,15 +3,15 @@ import logging import uuid from abc import ABC, abstractmethod -from concurrent import futures from enum import Enum -from typing import TYPE_CHECKING, Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field from griptape.artifacts import ErrorArtifact from griptape.config import config from griptape.events import FinishTaskEvent, StartTaskEvent, event_bus +from griptape.mixins import FuturesExecutorMixin if TYPE_CHECKING: from griptape.artifacts import BaseArtifact @@ -22,7 +22,7 @@ @define -class BaseTask(ABC): +class BaseTask(FuturesExecutorMixin, ABC): class State(Enum): PENDING = 1 EXECUTING = 2 @@ -37,10 +37,6 @@ class State(Enum): output: Optional[BaseArtifact] = field(default=None, init=False) context: dict[str, Any] = field(factory=dict, kw_only=True) - futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), - kw_only=True, - ) def __rshift__(self, other: BaseTask) -> BaseTask: self.add_child(other) diff --git a/tests/mocks/mock_futures_executor.py b/tests/mocks/mock_futures_executor.py new file mode 100644 index 000000000..cbbf84560 --- /dev/null +++ b/tests/mocks/mock_futures_executor.py @@ -0,0 +1,4 @@ +from griptape.mixins import FuturesExecutorMixin + + +class MockFuturesExecutor(FuturesExecutorMixin): ... diff --git a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py index 04cfef34b..114778f72 100644 --- a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py @@ -12,9 +12,7 @@ def test_publish_event(self): driver.publish_event(MockEvent().to_dict()) - executor.__enter__.assert_called_once() executor.submit.assert_called_once() - executor.__exit__.assert_called_once() def test__safe_try_publish_event(self): driver = MockEventListenerDriver(batched=False) diff --git a/tests/unit/mixins/test_futures_executor_mixin.py b/tests/unit/mixins/test_futures_executor_mixin.py new file mode 100644 index 000000000..3be336687 --- /dev/null +++ b/tests/unit/mixins/test_futures_executor_mixin.py @@ -0,0 +1,10 @@ +from concurrent import futures + +from tests.mocks.mock_futures_executor import MockFuturesExecutor + + +class TestFuturesExecutorMixin: + def test_futures_executor(self): + executor = futures.ThreadPoolExecutor() + + assert MockFuturesExecutor(futures_executor_fn=lambda: executor).futures_executor == executor From a931176f48cb884ee8d80be7eed8fdaf35efac21 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 16 Aug 2024 15:58:47 -0700 Subject: [PATCH 223/238] Fix adding ErrorArtifacts to Prompt Stack (#1073) --- CHANGELOG.md | 2 ++ griptape/common/prompt_stack/prompt_stack.py | 13 +++++++++++-- tests/unit/common/test_prompt_stack.py | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ead3395..b62a3bb0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. +- Exception when adding `ErrorArtifact`'s to the Prompt Stack. + ## [0.29.2] - 2024-08-16 ### Fixed diff --git a/griptape/common/prompt_stack/prompt_stack.py b/griptape/common/prompt_stack/prompt_stack.py index cf6b67040..c9f71aa20 100644 --- a/griptape/common/prompt_stack/prompt_stack.py +++ b/griptape/common/prompt_stack/prompt_stack.py @@ -4,7 +4,15 @@ from attrs import define, field -from griptape.artifacts import ActionArtifact, BaseArtifact, GenericArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.artifacts import ( + ActionArtifact, + BaseArtifact, + ErrorArtifact, + GenericArtifact, + ImageArtifact, + ListArtifact, + TextArtifact, +) from griptape.common import ( ActionCallMessageContent, ActionResultMessageContent, @@ -62,6 +70,8 @@ def __to_message_content(self, artifact: str | BaseArtifact) -> list[BaseMessage return [ImageMessageContent(artifact)] elif isinstance(artifact, GenericArtifact): return [GenericMessageContent(artifact)] + elif isinstance(artifact, ErrorArtifact): + return [TextMessageContent(TextArtifact(artifact.to_text()))] elif isinstance(artifact, ActionArtifact): action = artifact.value output = action.output @@ -72,6 +82,5 @@ def __to_message_content(self, artifact: str | BaseArtifact) -> list[BaseMessage elif isinstance(artifact, ListArtifact): processed_contents = [self.__to_message_content(artifact) for artifact in artifact.value] return [sub_content for processed_content in processed_contents for sub_content in processed_content] - else: raise ValueError(f"Unsupported artifact type: {type(artifact)}") diff --git a/tests/unit/common/test_prompt_stack.py b/tests/unit/common/test_prompt_stack.py index 8aba023bc..983dccc4c 100644 --- a/tests/unit/common/test_prompt_stack.py +++ b/tests/unit/common/test_prompt_stack.py @@ -1,6 +1,7 @@ import pytest from griptape.artifacts import ActionArtifact, GenericArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.common import ( ActionCallMessageContent, ActionResultMessageContent, @@ -45,6 +46,8 @@ def test_add_message(self, prompt_stack): "role", ) + prompt_stack.add_message(ErrorArtifact("foo"), "role") + assert prompt_stack.messages[0].role == "role" assert isinstance(prompt_stack.messages[0].content[0], TextMessageContent) assert prompt_stack.messages[0].content[0].artifact.value == "foo" @@ -85,6 +88,9 @@ def test_add_message(self, prompt_stack): assert isinstance(prompt_stack.messages[6].content[0], GenericMessageContent) assert prompt_stack.messages[6].content[0].artifact.value == "foo" + assert prompt_stack.messages[7].role == "role" + assert isinstance(prompt_stack.messages[7].content[0], TextMessageContent) + def test_add_system_message(self, prompt_stack): prompt_stack.add_system_message("foo") From 3aaeb6e01d7bb1ab3f927516e9e529e785258912 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Mon, 19 Aug 2024 10:34:02 -0600 Subject: [PATCH 224/238] `BaseVectorStoreDriver.upsert_text_artifacts` concurrency bugfix (#1074) --- CHANGELOG.md | 2 ++ .../vector/base_vector_store_driver.py | 21 +++++++----- .../vector/local_vector_store_driver.py | 32 ++++++++++--------- griptape/mixins/futures_executor_mixin.py | 22 +++++-------- griptape/tasks/actions_subtask.py | 6 +--- griptape/utils/__init__.py | 4 +-- griptape/utils/futures.py | 6 ++++ .../vector/test_local_vector_store_driver.py | 13 ++++++++ tests/unit/tools/test_vector_store_tool.py | 6 ---- tests/unit/utils/test_futures.py | 17 ++++++++-- 10 files changed, 77 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b62a3bb0b..38d5784cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `JsonArtifact` for handling de/seralization of values. - `Chat.logger_level` for setting what the `Chat` utility sets the logger level to. - `FuturesExecutorMixin` to DRY up and optimize concurrent code across multiple classes. +- `utils.execute_futures_list_dict` for executing a dict of lists of futures. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. @@ -58,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. - Exception when adding `ErrorArtifact`'s to the Prompt Stack. +- Concurrency bug in `BaseVectorStoreDriver.upsert_text_artifacts`. ## [0.29.2] - 2024-08-16 diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 7ebccdcad..2abb29c3f 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -51,15 +51,20 @@ def upsert_text_artifacts( ], ) else: - utils.execute_futures_dict( - { - namespace: self.futures_executor.submit( - self.upsert_text_artifact, a, namespace=namespace, meta=meta, **kwargs + futures_dict = {} + + for namespace, artifact_list in artifacts.items(): + for a in artifact_list: + if not futures_dict.get(namespace): + futures_dict[namespace] = [] + + futures_dict[namespace].append( + self.futures_executor.submit( + self.upsert_text_artifact, a, namespace=namespace, meta=meta, **kwargs + ) ) - for namespace, artifact_list in artifacts.items() - for a in artifact_list - }, - ) + + utils.execute_futures_list_dict(futures_dict) def upsert_text_artifact( self, diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index 2b42b19f5..36203d540 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -31,24 +31,19 @@ def __attrs_post_init__(self) -> None: if not os.path.isfile(self.persist_file): with open(self.persist_file, "w") as file: - self.save_entries_to_file(file) + self.__save_entries_to_file(file) with open(self.persist_file, "r+") as file: if os.path.getsize(self.persist_file) > 0: self.entries = self.load_entries_from_file(file) else: - self.save_entries_to_file(file) - - def save_entries_to_file(self, json_file: TextIO) -> None: - with self.thread_lock: - serialized_data = {k: asdict(v) for k, v in self.entries.items()} - - json.dump(serialized_data, json_file) + self.__save_entries_to_file(file) def load_entries_from_file(self, json_file: TextIO) -> dict[str, BaseVectorStoreDriver.Entry]: - data = json.load(json_file) + with self.thread_lock: + data = json.load(json_file) - return {k: BaseVectorStoreDriver.Entry.from_dict(v) for k, v in data.items()} + return {k: BaseVectorStoreDriver.Entry.from_dict(v) for k, v in data.items()} def upsert_vector( self, @@ -62,7 +57,7 @@ def upsert_vector( vector_id = vector_id or utils.str_to_hash(str(vector)) with self.thread_lock: - self.entries[self._namespaced_vector_id(vector_id, namespace=namespace)] = self.Entry( + self.entries[self.__namespaced_vector_id(vector_id, namespace=namespace)] = self.Entry( id=vector_id, vector=vector, meta=meta, @@ -73,12 +68,12 @@ def upsert_vector( # TODO: optimize later since it reserializes all entries from memory and stores them in the JSON file # every time a new vector is inserted with open(self.persist_file, "w") as file: - self.save_entries_to_file(file) + self.__save_entries_to_file(file) return vector_id def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: - return self.entries.get(self._namespaced_vector_id(vector_id, namespace=namespace), None) + return self.entries.get(self.__namespaced_vector_id(vector_id, namespace=namespace), None) def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: return [entry for key, entry in self.entries.items() if namespace is None or entry.namespace == namespace] @@ -100,8 +95,9 @@ def query( entries = self.entries entries_and_relatednesses = [ - (entry, self.relatedness_fn(query_embedding, entry.vector)) for entry in entries.values() + (entry, self.relatedness_fn(query_embedding, entry.vector)) for entry in list(entries.values()) ] + entries_and_relatednesses.sort(key=operator.itemgetter(1), reverse=True) result = [ @@ -120,5 +116,11 @@ def query( def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") - def _namespaced_vector_id(self, vector_id: str, *, namespace: Optional[str]) -> str: + def __save_entries_to_file(self, json_file: TextIO) -> None: + with self.thread_lock: + serialized_data = {k: asdict(v) for k, v in self.entries.items()} + + json.dump(serialized_data, json_file) + + def __namespaced_vector_id(self, vector_id: str, *, namespace: Optional[str]) -> str: return vector_id if namespace is None else f"{namespace}-{vector_id}" diff --git a/griptape/mixins/futures_executor_mixin.py b/griptape/mixins/futures_executor_mixin.py index 6c09aee32..84a3b6f25 100644 --- a/griptape/mixins/futures_executor_mixin.py +++ b/griptape/mixins/futures_executor_mixin.py @@ -1,6 +1,5 @@ from __future__ import annotations -import threading from abc import ABC from concurrent import futures from typing import Callable, Optional @@ -13,20 +12,15 @@ class FuturesExecutorMixin(ABC): futures_executor_fn: Callable[[], futures.Executor] = field( default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), ) - thread_lock: threading.Lock = field(default=Factory(lambda: threading.Lock())) - _futures_executor: Optional[futures.Executor] = field(init=False, default=None) + futures_executor: Optional[futures.Executor] = field( + default=Factory(lambda self: self.futures_executor_fn(), takes_self=True) + ) - @property - def futures_executor(self) -> futures.Executor: - with self.thread_lock: - if self._futures_executor is None: - self._futures_executor = self.futures_executor_fn() + def __del__(self) -> None: + executor = self.futures_executor - return self._futures_executor + if executor is not None: + self.futures_executor = None - def __del__(self) -> None: - with self.thread_lock: - if self._futures_executor: - self._futures_executor.shutdown(wait=True) - self._futures_executor = None + executor.shutdown(wait=True) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index befad59e0..83ffc2081 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -139,11 +139,7 @@ def run(self) -> BaseArtifact: return ErrorArtifact("no tool output") def execute_actions(self, actions: list[ToolAction]) -> list[tuple[str, BaseArtifact]]: - results = utils.execute_futures_dict( - {a.tag: self.futures_executor.submit(self.execute_action, a) for a in actions} - ) - - return list(results.values()) + return utils.execute_futures_list([self.futures_executor.submit(self.execute_action, a) for a in actions]) def execute_action(self, action: ToolAction) -> tuple[str, BaseArtifact]: if action.tool is not None: diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index 19730ac3b..03725f59d 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -5,8 +5,7 @@ from .python_runner import PythonRunner from .command_runner import CommandRunner from .chat import Chat -from .futures import execute_futures_dict -from .futures import execute_futures_list +from .futures import execute_futures_dict, execute_futures_list, execute_futures_list_dict from .token_counter import TokenCounter from .dict_utils import remove_null_values_in_dict_recursively, dict_merge, remove_key_in_dict_recursively from .file_utils import load_file, load_files @@ -37,6 +36,7 @@ def minify_json(value: str) -> str: "is_dependency_installed", "execute_futures_dict", "execute_futures_list", + "execute_futures_list_dict", "TokenCounter", "remove_null_values_in_dict_recursively", "dict_merge", diff --git a/griptape/utils/futures.py b/griptape/utils/futures.py index ea22e4c56..b91bb3918 100644 --- a/griptape/utils/futures.py +++ b/griptape/utils/futures.py @@ -16,3 +16,9 @@ def execute_futures_list(fs_list: list[futures.Future[T]]) -> list[T]: futures.wait(fs_list, timeout=None, return_when=futures.ALL_COMPLETED) return [future.result() for future in fs_list] + + +def execute_futures_list_dict(fs_dict: dict[str, list[futures.Future[T]]]) -> dict[str, list[T]]: + execute_futures_list([item for sublist in fs_dict.values() for item in sublist]) + + return {key: [f.result() for f in fs] for key, fs in fs_dict.items()} diff --git a/tests/unit/drivers/vector/test_local_vector_store_driver.py b/tests/unit/drivers/vector/test_local_vector_store_driver.py index 6f022793c..2504b2486 100644 --- a/tests/unit/drivers/vector/test_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_local_vector_store_driver.py @@ -22,3 +22,16 @@ def test_upsert_text_artifacts_list(self, driver): assert len(driver.load_artifacts(namespace="foo")) == 0 assert len(driver.load_artifacts()) == 2 + + def test_upsert_text_artifacts_stress_test(self, driver): + driver.upsert_text_artifacts( + { + "test1": [TextArtifact(f"foo-{i}") for i in range(0, 1000)], + "test2": [TextArtifact(f"foo-{i}") for i in range(0, 1000)], + "test3": [TextArtifact(f"foo-{i}") for i in range(0, 1000)], + } + ) + + assert len(driver.query("foo", namespace="test1")) == 1000 + assert len(driver.query("foo", namespace="test2")) == 1000 + assert len(driver.query("foo", namespace="test3")) == 1000 diff --git a/tests/unit/tools/test_vector_store_tool.py b/tests/unit/tools/test_vector_store_tool.py index ea52a13ea..30596f09f 100644 --- a/tests/unit/tools/test_vector_store_tool.py +++ b/tests/unit/tools/test_vector_store_tool.py @@ -1,5 +1,3 @@ -import pytest - from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import LocalVectorStoreDriver from griptape.tools import VectorStoreTool @@ -7,10 +5,6 @@ class TestVectorStoreTool: - @pytest.fixture(autouse=True) - def _mock_try_run(self, mocker): - mocker.patch("griptape.drivers.OpenAiEmbeddingDriver.try_embed_chunk", return_value=[0, 1]) - def test_search(self): driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) tool = VectorStoreTool(description="Test", vector_store_driver=driver) diff --git a/tests/unit/utils/test_futures.py b/tests/unit/utils/test_futures.py index 04ddb9877..c34124c76 100644 --- a/tests/unit/utils/test_futures.py +++ b/tests/unit/utils/test_futures.py @@ -19,8 +19,21 @@ def test_execute_futures_list(self): [executor.submit(self.foobar, "foo"), executor.submit(self.foobar, "baz")] ) - assert result[0] == "foo-bar" - assert result[1] == "baz-bar" + assert set(result) == {"foo-bar", "baz-bar"} + + def test_execute_futures_list_dict(self): + with futures.ThreadPoolExecutor() as executor: + result = utils.execute_futures_list_dict( + { + "test1": [executor.submit(self.foobar, f"foo-{i}") for i in range(0, 1000)], + "test2": [executor.submit(self.foobar, f"foo-{i}") for i in range(0, 1000)], + "test3": [executor.submit(self.foobar, f"foo-{i}") for i in range(0, 1000)], + } + ) + + assert len(result["test1"]) == 1000 + assert len(result["test2"]) == 1000 + assert len(result["test3"]) == 1000 def foobar(self, foo): return f"{foo}-bar" From 717753cfac3444c19650e46fd1060e97064d7634 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 19 Aug 2024 12:40:50 -0500 Subject: [PATCH 225/238] Mock DDG in unit tests (#1076) --- .../test_duck_duck_go_web_search_driver.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py index 3d0a782eb..be79798ba 100644 --- a/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py +++ b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py @@ -13,14 +13,21 @@ def driver(self, mocker): {"title": "foo", "href": "bar", "body": "baz"}, {"title": "foo2", "href": "bar2", "body": "baz2"}, ] - - mocker.patch("duckduckgo_search.DDGS.text", return_value=mock_response) - + mock_ddg = mocker.Mock( + text=lambda *args, **kwargs: mock_response, + ) + mocker.patch("duckduckgo_search.DDGS", return_value=mock_ddg) return DuckDuckGoWebSearchDriver() @pytest.fixture() def driver_with_error(self, mocker): - mocker.patch("duckduckgo_search.DDGS.text", side_effect=Exception("test_error")) + def error(*args, **kwargs): + raise Exception("test_error") + + mock_ddg = mocker.Mock( + text=error, + ) + mocker.patch("duckduckgo_search.DDGS", return_value=mock_ddg) return DuckDuckGoWebSearchDriver() From 52c1930f089e18e180101324ad56e3d8675c31ad Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 19 Aug 2024 12:56:15 -0500 Subject: [PATCH 226/238] Add `GriptapeCloudConversationMemoryDriver` (#1063) --- CHANGELOG.md | 1 + .../drivers/conversation-memory-drivers.md | 9 ++ ...versation_memory_drivers_griptape_cloud.py | 15 +++ griptape/drivers/__init__.py | 2 + ...zon_dynamodb_conversation_memory_driver.py | 7 +- ...iptape_cloud_conversation_memory_driver.py | 123 ++++++++++++++++++ .../local_conversation_memory_driver.py | 7 +- .../redis_conversation_memory_driver.py | 8 +- ...iptape_cloud_conversation_memory_driver.py | 91 +++++++++++++ 9 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 docs/griptape-framework/drivers/src/conversation_memory_drivers_griptape_cloud.py create mode 100644 griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py create mode 100644 tests/unit/drivers/memory/conversation/test_griptape_cloud_conversation_memory_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 38d5784cf..ca6b750a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Chat.logger_level` for setting what the `Chat` utility sets the logger level to. - `FuturesExecutorMixin` to DRY up and optimize concurrent code across multiple classes. - `utils.execute_futures_list_dict` for executing a dict of lists of futures. +- `GriptapeCloudConversationMemoryDriver` to store conversation history in Griptape Cloud. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index 29ab328fd..bb4c1b35a 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -9,6 +9,14 @@ You can persist and load memory by using Conversation Memory Drivers. You can bu ## Conversation Memory Drivers +### Griptape Cloud + +The [GriptapeCloudConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.md) allows you to persist Conversation Memory in Griptape Cloud. It provides seamless integration with Griptape's cloud-based `Threads` and `Messages` resources. + +```python +--8<-- "docs/griptape-framework/drivers/src/conversation_memory_drivers_griptape_cloud.py" +``` + ### Local The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. @@ -40,3 +48,4 @@ The [RedisConversationMemoryDriver](../../reference/griptape/drivers/memory/conv ```python --8<-- "docs/griptape-framework/drivers/src/conversation_memory_drivers_3.py" ``` + diff --git a/docs/griptape-framework/drivers/src/conversation_memory_drivers_griptape_cloud.py b/docs/griptape-framework/drivers/src/conversation_memory_drivers_griptape_cloud.py new file mode 100644 index 000000000..35492e06b --- /dev/null +++ b/docs/griptape-framework/drivers/src/conversation_memory_drivers_griptape_cloud.py @@ -0,0 +1,15 @@ +import os +import uuid + +from griptape.drivers import GriptapeCloudConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +cloud_conversation_driver = GriptapeCloudConversationMemoryDriver( + api_key=os.environ["GT_CLOUD_API_KEY"], +) +agent = Agent(conversation_memory=ConversationMemory(driver=cloud_conversation_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 9e1790b01..f19ec7d10 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -15,6 +15,7 @@ from .memory.conversation.local_conversation_memory_driver import LocalConversationMemoryDriver from .memory.conversation.amazon_dynamodb_conversation_memory_driver import AmazonDynamoDbConversationMemoryDriver from .memory.conversation.redis_conversation_memory_driver import RedisConversationMemoryDriver +from .memory.conversation.griptape_cloud_conversation_memory_driver import GriptapeCloudConversationMemoryDriver from .embedding.base_embedding_driver import BaseEmbeddingDriver from .embedding.openai_embedding_driver import OpenAiEmbeddingDriver @@ -149,6 +150,7 @@ "LocalConversationMemoryDriver", "AmazonDynamoDbConversationMemoryDriver", "RedisConversationMemoryDriver", + "GriptapeCloudConversationMemoryDriver", "BaseEmbeddingDriver", "OpenAiEmbeddingDriver", "AzureOpenAiEmbeddingDriver", diff --git a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py index 44f214d7c..b0c2485d6 100644 --- a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field @@ -44,9 +45,11 @@ def load(self) -> Optional[BaseConversationMemory]: response = self.table.get_item(Key=self._get_key()) if "Item" in response and self.value_attribute_key in response["Item"]: - memory_value = response["Item"][self.value_attribute_key] + memory_dict = json.loads(response["Item"][self.value_attribute_key]) + # needed to avoid recursive method calls + memory_dict["autoload"] = False - memory = BaseConversationMemory.from_json(memory_value) + memory = BaseConversationMemory.from_dict(memory_dict) memory.driver = self diff --git a/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py b/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py new file mode 100644 index 000000000..fe5fb6a3e --- /dev/null +++ b/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py @@ -0,0 +1,123 @@ +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Optional +from urllib.parse import urljoin + +import requests +from attrs import Attribute, Factory, define, field + +from griptape.artifacts import BaseArtifact +from griptape.drivers import BaseConversationMemoryDriver + +if TYPE_CHECKING: + from griptape.memory.structure import BaseConversationMemory + + +@define(kw_only=True) +class GriptapeCloudConversationMemoryDriver(BaseConversationMemoryDriver): + """A driver for storing conversation memory in the Griptape Cloud. + + Attributes: + thread_id: The ID of the Thread to store the conversation memory in. If not provided, the driver will attempt to + retrieve the ID from the environment variable `GT_CLOUD_THREAD_ID`. If that is not set, a new Thread will be + created. + base_url: The base URL of the Griptape Cloud API. Defaults to the value of the environment variable + `GT_CLOUD_BASE_URL` or `https://cloud.griptape.ai`. + api_key: The API key to use for authenticating with the Griptape Cloud API. If not provided, the driver will + attempt to retrieve the API key from the environment variable `GT_CLOUD_API_KEY`. + + Raises: + ValueError: If `api_key` is not provided. + """ + + thread_id: str = field( + default=None, + metadata={"serializable": True}, + ) + base_url: str = field( + default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), + ) + api_key: Optional[str] = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY"))) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), + init=False, + ) + + def __attrs_post_init__(self) -> None: + if self.thread_id is None: + self.thread_id = os.getenv("GT_CLOUD_THREAD_ID", self._get_thread_id()) + + @api_key.validator # pyright: ignore[reportAttributeAccessIssue] + def validate_api_key(self, _: Attribute, value: Optional[str]) -> str: + if value is None: + raise ValueError(f"{self.__class__.__name__} requires an API key") + return value + + def store(self, memory: BaseConversationMemory) -> None: + # serliaze the run artifacts to json strings + messages = [{"input": run.input.to_json(), "output": run.output.to_json()} for run in memory.runs] + + # serialize the metadata to a json string + # remove runs because they are already stored as Messages + metadata = memory.to_dict() + del metadata["runs"] + + # patch the Thread with the new messages and metadata + # all old Messages are replaced with the new ones + response = requests.patch( + self._get_url(f"/threads/{self.thread_id}"), + json={"messages": messages, "metadata": metadata}, + headers=self.headers, + ) + response.raise_for_status() + + def load(self) -> BaseConversationMemory: + from griptape.memory.structure import BaseConversationMemory, ConversationMemory, Run + + # get the Messages from the Thread + messages_response = requests.get(self._get_url(f"/threads/{self.thread_id}/messages"), headers=self.headers) + messages_response.raise_for_status() + messages_response = messages_response.json() + + # retrieve the Thread to get the metadata + thread_response = requests.get(self._get_url(f"/threads/{self.thread_id}"), headers=self.headers) + thread_response.raise_for_status() + thread_response = thread_response.json() + + messages = messages_response.get("messages", []) + + runs = [ + Run( + id=m["message_id"], + input=BaseArtifact.from_json(m["input"]), + output=BaseArtifact.from_json(m["output"]), + ) + for m in messages + ] + metadata = thread_response.get("metadata") + + # the metadata will contain the serialized + # ConversationMemory object with the runs removed + # autoload=False to prevent recursively loading the memory + if metadata is not None and metadata != {}: + memory = BaseConversationMemory.from_dict( + { + **metadata, + "runs": [run.to_dict() for run in runs], + "autoload": False, + } + ) + memory.driver = self + return memory + # no metadata found, return a new ConversationMemory object + return ConversationMemory(runs=runs, autoload=False, driver=self) + + def _get_thread_id(self) -> str: + res = requests.post(self._get_url("/threads"), json={"name": "test"}, headers=self.headers) + res.raise_for_status() + return res.json().get("thread_id") + + def _get_url(self, path: str) -> str: + path = path.lstrip("/") + return urljoin(self.base_url, f"/api/{path}") diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index f7b6e7d6e..9a79accc3 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json import os from pathlib import Path from typing import TYPE_CHECKING, Optional @@ -24,7 +25,11 @@ def load(self) -> Optional[BaseConversationMemory]: if not os.path.exists(self.file_path): return None - memory = BaseConversationMemory.from_json(Path(self.file_path).read_text()) + + memory_dict = json.loads(Path(self.file_path).read_text()) + # needed to avoid recursive method calls + memory_dict["autoload"] = False + memory = BaseConversationMemory.from_dict(memory_dict) memory.driver = self diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py index 9afc2f204..8741cda50 100644 --- a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json import uuid from typing import TYPE_CHECKING, Optional @@ -59,8 +60,11 @@ def load(self) -> Optional[BaseConversationMemory]: key = self.index memory_json = self.client.hget(key, self.conversation_id) - if memory_json: - memory = BaseConversationMemory.from_json(memory_json) + if memory_json is not None: + memory_dict = json.loads(memory_json) + # needed to avoid recursive method calls + memory_dict["autoload"] = False + memory = BaseConversationMemory.from_dict(memory_dict) memory.driver = self return memory return None diff --git a/tests/unit/drivers/memory/conversation/test_griptape_cloud_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_griptape_cloud_conversation_memory_driver.py new file mode 100644 index 000000000..707132ef5 --- /dev/null +++ b/tests/unit/drivers/memory/conversation/test_griptape_cloud_conversation_memory_driver.py @@ -0,0 +1,91 @@ +import json + +import pytest + +from griptape.artifacts import BaseArtifact +from griptape.drivers import GriptapeCloudConversationMemoryDriver +from griptape.memory.structure import BaseConversationMemory, ConversationMemory, Run, SummaryConversationMemory + +TEST_CONVERSATION = '{"type": "SummaryConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": {"type": "TextArtifact", "id": "1234", "value": "Hi There, Hello"}, "output": {"type": "TextArtifact", "id": "123", "value": "Hello! How can I assist you today?"}}], "max_runs": 2}' + + +class TestGriptapeCloudConversationMemoryDriver: + @pytest.fixture(autouse=True) + def _mock_requests(self, mocker): + def get(*args, **kwargs): + if str(args[0]).endswith("/messages"): + return mocker.Mock( + raise_for_status=lambda: None, + json=lambda: { + "messages": [ + { + "message_id": "123", + "input": '{"type": "TextArtifact", "id": "1234", "value": "Hi There, Hello"}', + "output": '{"type": "TextArtifact", "id": "123", "value": "Hello! How can I assist you today?"}', + "index": 0, + } + ] + }, + ) + else: + thread_id = args[0].split("/")[-1] + return mocker.Mock( + raise_for_status=lambda: None, + json=lambda: { + "metadata": json.loads(TEST_CONVERSATION), + "name": "test", + "thread_id": "test_metadata", + } + if thread_id == "test_metadata" + else {"name": "test", "thread_id": "test"}, + ) + + mocker.patch( + "requests.get", + side_effect=get, + ) + mocker.patch( + "requests.post", + return_value=mocker.Mock( + raise_for_status=lambda: None, + json=lambda: {"thread_id": "test", "name": "test"}, + ), + ) + mocker.patch( + "requests.patch", + return_value=mocker.Mock( + raise_for_status=lambda: None, + ), + ) + + @pytest.fixture() + def driver(self): + return GriptapeCloudConversationMemoryDriver(api_key="test", thread_id="test") + + def test_no_api_key(self): + with pytest.raises(ValueError): + GriptapeCloudConversationMemoryDriver(api_key=None, thread_id="test") + + def test_no_thread_id(self): + driver = GriptapeCloudConversationMemoryDriver(api_key="test") + assert driver.thread_id == "test" + + def test_store(self, driver): + memory = ConversationMemory( + runs=[ + Run(input=BaseArtifact.from_dict(run["input"]), output=BaseArtifact.from_dict(run["output"])) + for run in json.loads(TEST_CONVERSATION)["runs"] + ], + ) + assert driver.store(memory) is None + + def test_load(self, driver): + memory = driver.load() + assert isinstance(memory, BaseConversationMemory) + assert len(memory.runs) == 1 + + def test_load_metadata(self, driver): + driver.thread_id = "test_metadata" + memory = driver.load() + assert isinstance(memory, SummaryConversationMemory) + assert len(memory.runs) == 1 From 0d19b0a6bde96348a7f8349369e9aecd99367330 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 12:11:05 -0700 Subject: [PATCH 227/238] Lazy load driver config fields (#1075) --- CHANGELOG.md | 1 + .../drivers/amazon_bedrock_driver_config.py | 83 +++++-------- .../config/drivers/anthropic_driver_config.py | 44 +++---- .../drivers/azure_openai_driver_config.py | 113 ++++++++---------- griptape/config/drivers/base_driver_config.py | 69 +++++++++-- .../config/drivers/cohere_driver_config.py | 43 ++++--- griptape/config/drivers/driver_config.py | 74 +++++------- .../config/drivers/google_driver_config.py | 34 ++---- .../config/drivers/openai_driver_config.py | 74 +++++------- griptape/schemas/base_schema.py | 2 +- griptape/utils/decorators.py | 24 +++- tests/mocks/mock_driver_config.py | 37 +++--- 12 files changed, 294 insertions(+), 304 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca6b750a2..0c85f7061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `FuturesExecutorMixin` to DRY up and optimize concurrent code across multiple classes. - `utils.execute_futures_list_dict` for executing a dict of lists of futures. - `GriptapeCloudConversationMemoryDriver` to store conversation history in Griptape Cloud. +- `griptape.utils.decorators.lazy_property` for creating lazy properties. ### Changed - **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. diff --git a/griptape/config/drivers/amazon_bedrock_driver_config.py b/griptape/config/drivers/amazon_bedrock_driver_config.py index 0eca4877b..db409353b 100644 --- a/griptape/config/drivers/amazon_bedrock_driver_config.py +++ b/griptape/config/drivers/amazon_bedrock_driver_config.py @@ -10,16 +10,12 @@ AmazonBedrockImageQueryDriver, AmazonBedrockPromptDriver, AmazonBedrockTitanEmbeddingDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, BedrockTitanImageGenerationModelDriver, LocalVectorStoreDriver, ) from griptape.utils import import_optional_dependency +from griptape.utils.decorators import lazy_property if TYPE_CHECKING: import boto3 @@ -33,51 +29,32 @@ class AmazonBedrockDriverConfig(DriverConfig): metadata={"serializable": False}, ) - prompt: BasePromptDriver = field( - default=Factory( - lambda self: AmazonBedrockPromptDriver( - session=self.session, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", - ), - takes_self=True, - ), - kw_only=True, - metadata={"serializable": True}, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory( - lambda self: AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1"), - takes_self=True, - ), - kw_only=True, - metadata={"serializable": True}, - ) - image_generation: BaseImageGenerationDriver = field( - default=Factory( - lambda self: AmazonBedrockImageGenerationDriver( - session=self.session, - model="amazon.titan-image-generator-v1", - image_generation_model_driver=BedrockTitanImageGenerationModelDriver(), - ), - takes_self=True, - ), - kw_only=True, - metadata={"serializable": True}, - ) - image_query: BaseImageQueryDriver = field( - default=Factory( - lambda self: AmazonBedrockImageQueryDriver( - session=self.session, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", - image_query_model_driver=BedrockClaudeImageQueryModelDriver(), - ), - takes_self=True, - ), - kw_only=True, - metadata={"serializable": True}, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), - kw_only=True, - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> AmazonBedrockPromptDriver: + return AmazonBedrockPromptDriver(session=self.session, model="anthropic.claude-3-5-sonnet-20240620-v1:0") + + @lazy_property() + def embedding(self) -> AmazonBedrockTitanEmbeddingDriver: + return AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1") + + @lazy_property() + def image_generation(self) -> AmazonBedrockImageGenerationDriver: + return AmazonBedrockImageGenerationDriver( + session=self.session, + model="amazon.titan-image-generator-v1", + image_generation_model_driver=BedrockTitanImageGenerationModelDriver(), + ) + + @lazy_property() + def image_query(self) -> AmazonBedrockImageQueryDriver: + return AmazonBedrockImageQueryDriver( + session=self.session, + model="anthropic.claude-3-5-sonnet-20240620-v1:0", + image_query_model_driver=BedrockClaudeImageQueryModelDriver(), + ) + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver( + embedding_driver=AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1") + ) diff --git a/griptape/config/drivers/anthropic_driver_config.py b/griptape/config/drivers/anthropic_driver_config.py index 0c4524159..399f13cdb 100644 --- a/griptape/config/drivers/anthropic_driver_config.py +++ b/griptape/config/drivers/anthropic_driver_config.py @@ -1,39 +1,29 @@ -from attrs import Factory, define, field +from attrs import define from griptape.config.drivers import DriverConfig from griptape.drivers import ( AnthropicImageQueryDriver, AnthropicPromptDriver, - BaseEmbeddingDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseVectorStoreDriver, LocalVectorStoreDriver, VoyageAiEmbeddingDriver, ) +from griptape.utils.decorators import lazy_property @define class AnthropicDriverConfig(DriverConfig): - prompt: BasePromptDriver = field( - default=Factory(lambda: AnthropicPromptDriver(model="claude-3-5-sonnet-20240620")), - metadata={"serializable": True}, - kw_only=True, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory(lambda: VoyageAiEmbeddingDriver(model="voyage-large-2")), - metadata={"serializable": True}, - kw_only=True, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")), - ), - kw_only=True, - metadata={"serializable": True}, - ) - image_query: BaseImageQueryDriver = field( - default=Factory(lambda: AnthropicImageQueryDriver(model="claude-3-5-sonnet-20240620")), - kw_only=True, - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> AnthropicPromptDriver: + return AnthropicPromptDriver(model="claude-3-5-sonnet-20240620") + + @lazy_property() + def embedding(self) -> VoyageAiEmbeddingDriver: + return VoyageAiEmbeddingDriver(model="voyage-large-2") + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")) + + @lazy_property() + def image_query(self) -> AnthropicImageQueryDriver: + return AnthropicImageQueryDriver(model="claude-3-5-sonnet-20240620") diff --git a/griptape/config/drivers/azure_openai_driver_config.py b/griptape/config/drivers/azure_openai_driver_config.py index bcb173fbd..211a7d209 100644 --- a/griptape/config/drivers/azure_openai_driver_config.py +++ b/griptape/config/drivers/azure_openai_driver_config.py @@ -2,7 +2,7 @@ from typing import Callable, Optional -from attrs import Factory, define, field +from attrs import define, field from griptape.config.drivers import DriverConfig from griptape.drivers import ( @@ -10,13 +10,9 @@ AzureOpenAiEmbeddingDriver, AzureOpenAiImageGenerationDriver, AzureOpenAiImageQueryDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseVectorStoreDriver, LocalVectorStoreDriver, ) +from griptape.utils.decorators import lazy_property @define @@ -43,65 +39,56 @@ class AzureOpenAiDriverConfig(DriverConfig): metadata={"serializable": False}, ) api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) - prompt: BasePromptDriver = field( - default=Factory( - lambda self: AzureOpenAiChatPromptDriver( - model="gpt-4o", - azure_endpoint=self.azure_endpoint, - api_key=self.api_key, - azure_ad_token=self.azure_ad_token, - azure_ad_token_provider=self.azure_ad_token_provider, - ), - takes_self=True, - ), - metadata={"serializable": True}, - kw_only=True, - ) - image_generation: BaseImageGenerationDriver = field( - default=Factory( - lambda self: AzureOpenAiImageGenerationDriver( - model="dall-e-2", - azure_endpoint=self.azure_endpoint, - api_key=self.api_key, - azure_ad_token=self.azure_ad_token, - azure_ad_token_provider=self.azure_ad_token_provider, - image_size="512x512", - ), - takes_self=True, - ), - metadata={"serializable": True}, - kw_only=True, - ) - image_query: BaseImageQueryDriver = field( - default=Factory( - lambda self: AzureOpenAiImageQueryDriver( - model="gpt-4o", - azure_endpoint=self.azure_endpoint, - api_key=self.api_key, - azure_ad_token=self.azure_ad_token, - azure_ad_token_provider=self.azure_ad_token_provider, - ), - takes_self=True, - ), - metadata={"serializable": True}, - kw_only=True, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory( - lambda self: AzureOpenAiEmbeddingDriver( + + @lazy_property() + def prompt(self) -> AzureOpenAiChatPromptDriver: + return AzureOpenAiChatPromptDriver( + model="gpt-4o", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ) + + @lazy_property() + def embedding(self) -> AzureOpenAiEmbeddingDriver: + return AzureOpenAiEmbeddingDriver( + model="text-embedding-3-small", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ) + + @lazy_property() + def image_generation(self) -> AzureOpenAiImageGenerationDriver: + return AzureOpenAiImageGenerationDriver( + model="dall-e-2", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + image_size="512x512", + ) + + @lazy_property() + def image_query(self) -> AzureOpenAiImageQueryDriver: + return AzureOpenAiImageQueryDriver( + model="gpt-4o", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ) + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver( + embedding_driver=AzureOpenAiEmbeddingDriver( model="text-embedding-3-small", azure_endpoint=self.azure_endpoint, api_key=self.api_key, azure_ad_token=self.azure_ad_token, azure_ad_token_provider=self.azure_ad_token_provider, - ), - takes_self=True, - ), - metadata={"serializable": True}, - kw_only=True, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), - metadata={"serializable": True}, - kw_only=True, - ) + ) + ) diff --git a/griptape/config/drivers/base_driver_config.py b/griptape/config/drivers/base_driver_config.py index df32d382e..3a8672a26 100644 --- a/griptape/config/drivers/base_driver_config.py +++ b/griptape/config/drivers/base_driver_config.py @@ -1,11 +1,12 @@ from __future__ import annotations -from abc import ABC +from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.mixins import SerializableMixin +from griptape.utils.decorators import lazy_property if TYPE_CHECKING: from griptape.drivers import ( @@ -22,15 +23,57 @@ @define class BaseDriverConfig(ABC, SerializableMixin): - prompt: BasePromptDriver = field(kw_only=True, metadata={"serializable": True}) - image_generation: BaseImageGenerationDriver = field(kw_only=True, metadata={"serializable": True}) - image_query: BaseImageQueryDriver = field(kw_only=True, metadata={"serializable": True}) - embedding: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) - vector_store: BaseVectorStoreDriver = field(kw_only=True, metadata={"serializable": True}) - conversation_memory: Optional[BaseConversationMemoryDriver] = field( - default=None, - kw_only=True, - metadata={"serializable": True}, - ) - text_to_speech: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) - audio_transcription: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) + _prompt: BasePromptDriver = field(kw_only=True, default=None, metadata={"serializable": True}, alias="prompt") + _image_generation: BaseImageGenerationDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="image_generation" + ) + _image_query: BaseImageQueryDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="image_query" + ) + _embedding: BaseEmbeddingDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="embedding" + ) + _vector_store: BaseVectorStoreDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="vector_store" + ) + _conversation_memory: Optional[BaseConversationMemoryDriver] = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="conversation_memory" + ) + _text_to_speech: BaseTextToSpeechDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="text_to_speech" + ) + _audio_transcription: BaseAudioTranscriptionDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="audio_transcription" + ) + + @lazy_property() + @abstractmethod + def prompt(self) -> BasePromptDriver: ... + + @lazy_property() + @abstractmethod + def image_generation(self) -> BaseImageGenerationDriver: ... + + @lazy_property() + @abstractmethod + def image_query(self) -> BaseImageQueryDriver: ... + + @lazy_property() + @abstractmethod + def embedding(self) -> BaseEmbeddingDriver: ... + + @lazy_property() + @abstractmethod + def vector_store(self) -> BaseVectorStoreDriver: ... + + @lazy_property() + @abstractmethod + def conversation_memory(self) -> Optional[BaseConversationMemoryDriver]: ... + + @lazy_property() + @abstractmethod + def text_to_speech(self) -> BaseTextToSpeechDriver: ... + + @lazy_property() + @abstractmethod + def audio_transcription(self) -> BaseAudioTranscriptionDriver: ... diff --git a/griptape/config/drivers/cohere_driver_config.py b/griptape/config/drivers/cohere_driver_config.py index eb8a55ce4..ae3b6c184 100644 --- a/griptape/config/drivers/cohere_driver_config.py +++ b/griptape/config/drivers/cohere_driver_config.py @@ -1,39 +1,36 @@ -from attrs import Factory, define, field +from attrs import define, field from griptape.config.drivers import DriverConfig from griptape.drivers import ( - BaseEmbeddingDriver, - BasePromptDriver, - BaseVectorStoreDriver, CohereEmbeddingDriver, CoherePromptDriver, LocalVectorStoreDriver, ) +from griptape.utils.decorators import lazy_property @define class CohereDriverConfig(DriverConfig): api_key: str = field(metadata={"serializable": False}, kw_only=True) - prompt: BasePromptDriver = field( - default=Factory(lambda self: CoherePromptDriver(model="command-r", api_key=self.api_key), takes_self=True), - metadata={"serializable": True}, - kw_only=True, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory( - lambda self: CohereEmbeddingDriver( + @lazy_property() + def prompt(self) -> CoherePromptDriver: + return CoherePromptDriver(model="command-r", api_key=self.api_key) + + @lazy_property() + def embedding(self) -> CohereEmbeddingDriver: + return CohereEmbeddingDriver( + model="embed-english-v3.0", + api_key=self.api_key, + input_type="search_document", + ) + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver( + embedding_driver=CohereEmbeddingDriver( model="embed-english-v3.0", api_key=self.api_key, input_type="search_document", - ), - takes_self=True, - ), - metadata={"serializable": True}, - kw_only=True, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), - kw_only=True, - metadata={"serializable": True}, - ) + ) + ) diff --git a/griptape/config/drivers/driver_config.py b/griptape/config/drivers/driver_config.py index d342ecb0a..b102c4465 100644 --- a/griptape/config/drivers/driver_config.py +++ b/griptape/config/drivers/driver_config.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional -from attrs import Factory, define, field +from attrs import define from griptape.config.drivers import BaseDriverConfig from griptape.drivers import ( @@ -14,6 +14,7 @@ DummyTextToSpeechDriver, DummyVectorStoreDriver, ) +from griptape.utils.decorators import lazy_property if TYPE_CHECKING: from griptape.drivers import ( @@ -30,43 +31,34 @@ @define class DriverConfig(BaseDriverConfig): - prompt: BasePromptDriver = field( - kw_only=True, - default=Factory(lambda: DummyPromptDriver()), - metadata={"serializable": True}, - ) - image_generation: BaseImageGenerationDriver = field( - kw_only=True, - default=Factory(lambda: DummyImageGenerationDriver()), - metadata={"serializable": True}, - ) - image_query: BaseImageQueryDriver = field( - kw_only=True, - default=Factory(lambda: DummyImageQueryDriver()), - metadata={"serializable": True}, - ) - embedding: BaseEmbeddingDriver = field( - kw_only=True, - default=Factory(lambda: DummyEmbeddingDriver()), - metadata={"serializable": True}, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory(lambda: DummyVectorStoreDriver()), - kw_only=True, - metadata={"serializable": True}, - ) - conversation_memory: Optional[BaseConversationMemoryDriver] = field( - default=None, - kw_only=True, - metadata={"serializable": True}, - ) - text_to_speech: BaseTextToSpeechDriver = field( - default=Factory(lambda: DummyTextToSpeechDriver()), - kw_only=True, - metadata={"serializable": True}, - ) - audio_transcription: BaseAudioTranscriptionDriver = field( - default=Factory(lambda: DummyAudioTranscriptionDriver()), - kw_only=True, - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> BasePromptDriver: + return DummyPromptDriver() + + @lazy_property() + def image_generation(self) -> BaseImageGenerationDriver: + return DummyImageGenerationDriver() + + @lazy_property() + def image_query(self) -> BaseImageQueryDriver: + return DummyImageQueryDriver() + + @lazy_property() + def embedding(self) -> BaseEmbeddingDriver: + return DummyEmbeddingDriver() + + @lazy_property() + def vector_store(self) -> BaseVectorStoreDriver: + return DummyVectorStoreDriver(embedding_driver=self.embedding) + + @lazy_property() + def conversation_memory(self) -> Optional[BaseConversationMemoryDriver]: + return None + + @lazy_property() + def text_to_speech(self) -> BaseTextToSpeechDriver: + return DummyTextToSpeechDriver() + + @lazy_property() + def audio_transcription(self) -> BaseAudioTranscriptionDriver: + return DummyAudioTranscriptionDriver() diff --git a/griptape/config/drivers/google_driver_config.py b/griptape/config/drivers/google_driver_config.py index 6f4243f01..5cff7ef6d 100644 --- a/griptape/config/drivers/google_driver_config.py +++ b/griptape/config/drivers/google_driver_config.py @@ -1,32 +1,24 @@ -from attrs import Factory, define, field +from attrs import define from griptape.config.drivers import DriverConfig from griptape.drivers import ( - BaseEmbeddingDriver, - BasePromptDriver, - BaseVectorStoreDriver, GoogleEmbeddingDriver, GooglePromptDriver, LocalVectorStoreDriver, ) +from griptape.utils.decorators import lazy_property @define class GoogleDriverConfig(DriverConfig): - prompt: BasePromptDriver = field( - default=Factory(lambda: GooglePromptDriver(model="gemini-1.5-pro")), - kw_only=True, - metadata={"serializable": True}, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory(lambda: GoogleEmbeddingDriver(model="models/embedding-001")), - kw_only=True, - metadata={"serializable": True}, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")), - ), - kw_only=True, - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> GooglePromptDriver: + return GooglePromptDriver(model="gemini-1.5-pro") + + @lazy_property() + def embedding(self) -> GoogleEmbeddingDriver: + return GoogleEmbeddingDriver(model="models/embedding-001") + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")) diff --git a/griptape/config/drivers/openai_driver_config.py b/griptape/config/drivers/openai_driver_config.py index 0b05d1636..a16f79ed8 100644 --- a/griptape/config/drivers/openai_driver_config.py +++ b/griptape/config/drivers/openai_driver_config.py @@ -1,14 +1,7 @@ -from attrs import Factory, define, field +from attrs import define from griptape.config.drivers import DriverConfig from griptape.drivers import ( - BaseAudioTranscriptionDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseTextToSpeechDriver, - BaseVectorStoreDriver, LocalVectorStoreDriver, OpenAiAudioTranscriptionDriver, OpenAiChatPromptDriver, @@ -17,44 +10,35 @@ OpenAiImageQueryDriver, OpenAiTextToSpeechDriver, ) +from griptape.utils.decorators import lazy_property @define class OpenAiDriverConfig(DriverConfig): - prompt: BasePromptDriver = field( - default=Factory(lambda: OpenAiChatPromptDriver(model="gpt-4o")), - metadata={"serializable": True}, - kw_only=True, - ) - image_generation: BaseImageGenerationDriver = field( - default=Factory(lambda: OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512")), - kw_only=True, - metadata={"serializable": True}, - ) - image_query: BaseImageQueryDriver = field( - default=Factory(lambda: OpenAiImageQueryDriver(model="gpt-4o")), - kw_only=True, - metadata={"serializable": True}, - ) - embedding: BaseEmbeddingDriver = field( - default=Factory(lambda: OpenAiEmbeddingDriver(model="text-embedding-3-small")), - metadata={"serializable": True}, - kw_only=True, - ) - vector_store: BaseVectorStoreDriver = field( - default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")), - ), - kw_only=True, - metadata={"serializable": True}, - ) - text_to_speech: BaseTextToSpeechDriver = field( - default=Factory(lambda: OpenAiTextToSpeechDriver(model="tts")), - kw_only=True, - metadata={"serializable": True}, - ) - audio_transcription: BaseAudioTranscriptionDriver = field( - default=Factory(lambda: OpenAiAudioTranscriptionDriver(model="whisper-1")), - kw_only=True, - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> OpenAiChatPromptDriver: + return OpenAiChatPromptDriver(model="gpt-4o") + + @lazy_property() + def image_generation(self) -> OpenAiImageGenerationDriver: + return OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512") + + @lazy_property() + def image_query(self) -> OpenAiImageQueryDriver: + return OpenAiImageQueryDriver(model="gpt-4o") + + @lazy_property() + def embedding(self) -> OpenAiEmbeddingDriver: + return OpenAiEmbeddingDriver(model="text-embedding-3-small") + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")) + + @lazy_property() + def text_to_speech(self) -> OpenAiTextToSpeechDriver: + return OpenAiTextToSpeechDriver(model="tts") + + @lazy_property() + def audio_transcription(self) -> OpenAiAudioTranscriptionDriver: + return OpenAiAudioTranscriptionDriver(model="whisper-1") diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index f2172b119..f25e8870b 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -36,7 +36,7 @@ def make_obj(self, data: Any, **kwargs) -> Any: cls._resolve_types(attrs_cls) return SubSchema.from_dict( { - a.name: cls._get_field_for_type(a.type) + a.alias or a.name: cls._get_field_for_type(a.type) for a in attrs.fields(attrs_cls) if a.metadata.get("serializable") }, diff --git a/griptape/utils/decorators.py b/griptape/utils/decorators.py index 10bf6c9a4..de7e4d1cb 100644 --- a/griptape/utils/decorators.py +++ b/griptape/utils/decorators.py @@ -1,5 +1,7 @@ +from __future__ import annotations + import functools -from typing import Any, Callable +from typing import Any, Callable, Optional import schema from schema import Schema @@ -27,3 +29,23 @@ def wrapper(self: Any, *args, **kwargs) -> Any: return wrapper return decorator + + +def lazy_property(attr_name: Optional[str] = None) -> Any: + def decorator(func: Callable) -> Any: + actual_attr_name = f"_{func.__name__}" if attr_name is None else attr_name + + @property + @functools.wraps(func) + def lazy_attr(self: Any) -> Any: + if getattr(self, actual_attr_name) is None: + setattr(self, actual_attr_name, func(self)) + return getattr(self, actual_attr_name) + + @lazy_attr.setter + def lazy_attr(self: Any, value: Any) -> None: + setattr(self, actual_attr_name, value) + + return lazy_attr + + return decorator diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_driver_config.py index 20f2ac684..eeab99abc 100644 --- a/tests/mocks/mock_driver_config.py +++ b/tests/mocks/mock_driver_config.py @@ -1,7 +1,8 @@ -from attrs import Factory, define, field +from attrs import define from griptape.config.drivers import DriverConfig from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver +from griptape.utils.decorators import lazy_property from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_image_query_driver import MockImageQueryDriver @@ -10,18 +11,22 @@ @define class MockDriverConfig(DriverConfig): - prompt: MockPromptDriver = field(default=Factory(lambda: MockPromptDriver()), metadata={"serializable": True}) - image_generation: MockImageGenerationDriver = field( - default=Factory(lambda: MockImageGenerationDriver()), - metadata={"serializable": True}, - ) - image_query: MockImageQueryDriver = field( - default=Factory(lambda: MockImageQueryDriver()), metadata={"serializable": True} - ) - embedding: MockEmbeddingDriver = field( - default=Factory(lambda: MockEmbeddingDriver()), metadata={"serializable": True} - ) - vector_store: LocalVectorStoreDriver = field( - default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding), takes_self=True), - metadata={"serializable": True}, - ) + @lazy_property() + def prompt(self) -> MockPromptDriver: + return MockPromptDriver() + + @lazy_property() + def image_generation(self) -> MockImageGenerationDriver: + return MockImageGenerationDriver() + + @lazy_property() + def image_query(self) -> MockImageQueryDriver: + return MockImageQueryDriver() + + @lazy_property() + def embedding(self) -> MockEmbeddingDriver: + return MockEmbeddingDriver() + + @lazy_property() + def vector_store(self) -> LocalVectorStoreDriver: + return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) From f08f0c377f8de024d14038f79fb8822857f5b7fc Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 13:14:53 -0700 Subject: [PATCH 228/238] Refactor/naming (#1078) --- .../src/multiple_agent_shared_memory_1.py | 6 +-- docs/examples/src/talk_to_a_video_1.py | 2 +- .../drivers/src/embedding_drivers_10.py | 12 ++--- .../drivers/src/event_listener_drivers_4.py | 2 +- .../structures/src/config_1.py | 2 +- .../structures/src/config_2.py | 2 +- .../structures/src/config_3.py | 2 +- .../structures/src/config_4.py | 2 +- .../structures/src/config_5.py | 2 +- .../structures/src/config_6.py | 2 +- .../structures/src/config_7.py | 4 +- .../structures/src/config_8.py | 2 +- .../structures/src/config_logging.py | 4 +- .../structures/src/task_memory_6.py | 8 ++-- .../official-tools/src/rest_api_tool_1.py | 4 +- griptape/config/base_config.py | 8 ++-- griptape/config/config.py | 35 +++++--------- .../drivers/amazon_bedrock_driver_config.py | 10 ++-- .../config/drivers/anthropic_driver_config.py | 8 ++-- .../drivers/azure_openai_driver_config.py | 10 ++-- griptape/config/drivers/base_driver_config.py | 48 ++++++++++--------- .../config/drivers/cohere_driver_config.py | 6 +-- griptape/config/drivers/driver_config.py | 18 +++---- .../config/drivers/google_driver_config.py | 6 +-- .../config/drivers/openai_driver_config.py | 14 +++--- .../audio/audio_transcription_engine.py | 2 +- .../engines/audio/text_to_speech_engine.py | 2 +- .../extraction/base_extraction_engine.py | 2 +- .../image/base_image_generation_engine.py | 2 +- .../engines/image_query/image_query_engine.py | 4 +- .../response/prompt_response_rag_module.py | 2 +- .../vector_store_retrieval_rag_module.py | 4 +- .../engines/summary/prompt_summary_engine.py | 2 +- .../structure/base_conversation_memory.py | 4 +- .../structure/summary_conversation_memory.py | 2 +- .../task/storage/text_artifact_storage.py | 4 +- griptape/structures/agent.py | 4 +- griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/base_audio_generation_task.py | 2 +- griptape/tasks/base_audio_input_task.py | 2 +- griptape/tasks/base_image_generation_task.py | 2 +- griptape/tasks/base_multi_text_input_task.py | 2 +- griptape/tasks/base_task.py | 2 +- griptape/tasks/base_text_input_task.py | 2 +- griptape/tasks/prompt_task.py | 4 +- griptape/tools/query/tool.py | 4 +- griptape/utils/chat.py | 8 ++-- tests/mocks/mock_driver_config.py | 10 ++-- .../test_amazon_bedrock_driver_config.py | 32 ++++++------- .../drivers/test_anthropic_driver_config.py | 16 +++---- .../test_azure_openai_driver_config.py | 16 +++---- .../drivers/test_cohere_driver_config.py | 16 +++---- .../unit/config/drivers/test_driver_config.py | 20 ++++---- .../drivers/test_google_driver_config.py | 16 +++---- .../drivers/test_openai_driver_config.py | 16 +++---- .../logging/test_newline_logging_filter.py | 2 +- .../logging/test_truncate_logging_filter.py | 2 +- tests/unit/config/test_config.py | 16 +++---- tests/unit/conftest.py | 2 +- .../drivers/prompt/test_base_prompt_driver.py | 6 +-- .../test_local_structure_run_driver.py | 2 +- tests/unit/events/test_event_listener.py | 2 +- .../structure/test_conversation_memory.py | 12 +++-- tests/unit/structures/test_agent.py | 2 +- tests/unit/tasks/test_structure_run_task.py | 4 +- tests/unit/tasks/test_tool_task.py | 4 +- tests/unit/tasks/test_toolkit_task.py | 6 +-- tests/unit/utils/test_chat.py | 2 +- tests/utils/structure_tester.py | 6 ++- 69 files changed, 251 insertions(+), 242 deletions(-) diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index 946a21190..b6089c190 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -34,10 +34,10 @@ vector_path=MONGODB_VECTOR_PATH, ) -config.drivers = AzureOpenAiDriverConfig( +config.driver_config = AzureOpenAiDriverConfig( azure_endpoint=AZURE_OPENAI_ENDPOINT_1, - vector_store=mongo_driver, - embedding=embedding_driver, + vector_store_driver=mongo_driver, + embedding_driver=embedding_driver, ) loader = Agent( diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py index 377e177a6..2748902a2 100644 --- a/docs/examples/src/talk_to_a_video_1.py +++ b/docs/examples/src/talk_to_a_video_1.py @@ -7,7 +7,7 @@ from griptape.config.drivers import GoogleDriverConfig from griptape.structures import Agent -config.drivers = GoogleDriverConfig() +config.driver_config = GoogleDriverConfig() video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") while video_file.state.name == "PROCESSING": diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index dbbc659fb..2705dcfad 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -7,14 +7,14 @@ from griptape.structures import Agent from griptape.tools import PromptSummaryTool, WebScraperTool -config.drivers = DriverConfig( - prompt=OpenAiChatPromptDriver(model="gpt-4o"), - embedding=VoyageAiEmbeddingDriver(), +config.driver_config = DriverConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), + embedding_driver=VoyageAiEmbeddingDriver(), ) -config.drivers = DriverConfig( - prompt=OpenAiChatPromptDriver(model="gpt-4o"), - embedding=VoyageAiEmbeddingDriver(), +config.driver_config = DriverConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), + embedding_driver=VoyageAiEmbeddingDriver(), ) agent = Agent( diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py index 7a0957e63..ff59be794 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py @@ -7,7 +7,7 @@ from griptape.rules import Rule from griptape.structures import Agent -config.drivers = DriverConfig(prompt=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)) +config.driver_config = DriverConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)) event_bus.add_event_listeners( [ EventListener( diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py index df75488dc..e038130c2 100644 --- a/docs/griptape-framework/structures/src/config_1.py +++ b/docs/griptape-framework/structures/src/config_1.py @@ -2,6 +2,6 @@ from griptape.config.drivers import OpenAiDriverConfig from griptape.structures import Agent -config.drivers = OpenAiDriverConfig() +config.driver_config = OpenAiDriverConfig() agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/config_2.py index 6fcdedbc8..a187e8c06 100644 --- a/docs/griptape-framework/structures/src/config_2.py +++ b/docs/griptape-framework/structures/src/config_2.py @@ -4,7 +4,7 @@ from griptape.config.drivers import AzureOpenAiDriverConfig from griptape.structures import Agent -config.drivers = AzureOpenAiDriverConfig( +config.driver_config = AzureOpenAiDriverConfig( azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], api_key=os.environ["AZURE_OPENAI_API_KEY_3"] ) diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/config_3.py index e4e33e379..4d08912f9 100644 --- a/docs/griptape-framework/structures/src/config_3.py +++ b/docs/griptape-framework/structures/src/config_3.py @@ -6,7 +6,7 @@ from griptape.config.drivers import AmazonBedrockDriverConfig from griptape.structures import Agent -config.drivers = AmazonBedrockDriverConfig( +config.driver_config = AmazonBedrockDriverConfig( session=boto3.Session( region_name=os.environ["AWS_DEFAULT_REGION"], aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py index 7ab5eee70..e97422388 100644 --- a/docs/griptape-framework/structures/src/config_4.py +++ b/docs/griptape-framework/structures/src/config_4.py @@ -2,6 +2,6 @@ from griptape.config.drivers import GoogleDriverConfig from griptape.structures import Agent -config.drivers = GoogleDriverConfig() +config.driver_config = GoogleDriverConfig() agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py index bee5050c2..519b770df 100644 --- a/docs/griptape-framework/structures/src/config_5.py +++ b/docs/griptape-framework/structures/src/config_5.py @@ -2,6 +2,6 @@ from griptape.config.drivers import AnthropicDriverConfig from griptape.structures import Agent -config.drivers = AnthropicDriverConfig() +config.driver_config = AnthropicDriverConfig() agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py index 569000180..c53d8c1b0 100644 --- a/docs/griptape-framework/structures/src/config_6.py +++ b/docs/griptape-framework/structures/src/config_6.py @@ -4,6 +4,6 @@ from griptape.config.drivers import CohereDriverConfig from griptape.structures import Agent -config.drivers = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"]) +config.driver_config = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"]) agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/config_7.py index 9f464b167..3f63d428e 100644 --- a/docs/griptape-framework/structures/src/config_7.py +++ b/docs/griptape-framework/structures/src/config_7.py @@ -5,8 +5,8 @@ from griptape.drivers import AnthropicPromptDriver from griptape.structures import Agent -config.drivers = DriverConfig( - prompt=AnthropicPromptDriver( +config.driver_config = DriverConfig( + prompt_driver=AnthropicPromptDriver( model="claude-3-sonnet-20240229", api_key=os.environ["ANTHROPIC_API_KEY"], ) diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py index 6bc87998c..909a2d5d9 100644 --- a/docs/griptape-framework/structures/src/config_8.py +++ b/docs/griptape-framework/structures/src/config_8.py @@ -13,6 +13,6 @@ } custom_config = AmazonBedrockDriverConfig.from_dict(dict_config) -config.drivers = custom_config +config.driver_config = custom_config agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_logging.py b/docs/griptape-framework/structures/src/config_logging.py index 81645d5e2..4dceb6edd 100644 --- a/docs/griptape-framework/structures/src/config_logging.py +++ b/docs/griptape-framework/structures/src/config_logging.py @@ -5,9 +5,9 @@ from griptape.config.logging import TruncateLoggingFilter from griptape.structures import Agent -config.drivers = OpenAiDriverConfig() +config.driver_config = OpenAiDriverConfig() -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) logger.setLevel(logging.ERROR) logger.addFilter(TruncateLoggingFilter(max_log_length=100)) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 3ce87f72d..1ee4538d7 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -11,12 +11,12 @@ from griptape.structures import Agent from griptape.tools import FileManagerTool, QueryTool, WebScraperTool -config.drivers = OpenAiDriverConfig( - prompt=OpenAiChatPromptDriver(model="gpt-4"), +config.driver_config = OpenAiDriverConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), ) -config.drivers = OpenAiDriverConfig( - prompt=OpenAiChatPromptDriver(model="gpt-4"), +config.driver_config = OpenAiDriverConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), ) vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) diff --git a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py index 4ef73dd9d..1e82b2dd9 100644 --- a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py +++ b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py @@ -8,8 +8,8 @@ from griptape.tasks import ToolkitTask from griptape.tools import RestApiTool -config.drivers = DriverConfig( - prompt=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), +config.driver_config = DriverConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), ) posts_client = RestApiTool( diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index 7ed00e445..e9f0bc687 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -14,9 +14,9 @@ @define(kw_only=True) class BaseConfig(SerializableMixin, ABC): - _logging: Optional[LoggingConfig] = field(alias="logging") - _drivers: Optional[BaseDriverConfig] = field(alias="drivers") + _logging_config: Optional[LoggingConfig] = field(alias="logging") + _driver_config: Optional[BaseDriverConfig] = field(alias="drivers") def reset(self) -> None: - self._logging = None - self._drivers = None + self._logging_config = None + self._driver_config = None diff --git a/griptape/config/config.py b/griptape/config/config.py index 11c2f9585..5f5dbb5db 100644 --- a/griptape/config/config.py +++ b/griptape/config/config.py @@ -4,6 +4,8 @@ from attrs import define, field +from griptape.utils.decorators import lazy_property + from .base_config import BaseConfig from .drivers.openai_driver_config import OpenAiDriverConfig from .logging.logging_config import LoggingConfig @@ -14,29 +16,16 @@ @define(kw_only=True) class _Config(BaseConfig): - _logging: Optional[LoggingConfig] = field(default=None, alias="logging") - _drivers: Optional[BaseDriverConfig] = field(default=None, alias="drivers") - - @property - def drivers(self) -> BaseDriverConfig: - """Lazily instantiates the drivers configuration to avoid client errors like missing API key.""" - if self._drivers is None: - self._drivers = OpenAiDriverConfig() - return self._drivers - - @drivers.setter - def drivers(self, drivers: BaseDriverConfig) -> None: - self._drivers = drivers - - @property - def logging(self) -> LoggingConfig: - if self._logging is None: - self._logging = LoggingConfig() - return self._logging - - @logging.setter - def logging(self, logging: LoggingConfig) -> None: - self._logging = logging + _logging_config: Optional[LoggingConfig] = field(default=None, alias="logging") + _driver_config: Optional[BaseDriverConfig] = field(default=None, alias="drivers") + + @lazy_property() + def driver_config(self) -> BaseDriverConfig: + return OpenAiDriverConfig() + + @lazy_property() + def logging_config(self) -> LoggingConfig: + return LoggingConfig() config = _Config() diff --git a/griptape/config/drivers/amazon_bedrock_driver_config.py b/griptape/config/drivers/amazon_bedrock_driver_config.py index db409353b..22d198167 100644 --- a/griptape/config/drivers/amazon_bedrock_driver_config.py +++ b/griptape/config/drivers/amazon_bedrock_driver_config.py @@ -30,15 +30,15 @@ class AmazonBedrockDriverConfig(DriverConfig): ) @lazy_property() - def prompt(self) -> AmazonBedrockPromptDriver: + def prompt_driver(self) -> AmazonBedrockPromptDriver: return AmazonBedrockPromptDriver(session=self.session, model="anthropic.claude-3-5-sonnet-20240620-v1:0") @lazy_property() - def embedding(self) -> AmazonBedrockTitanEmbeddingDriver: + def embedding_driver(self) -> AmazonBedrockTitanEmbeddingDriver: return AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1") @lazy_property() - def image_generation(self) -> AmazonBedrockImageGenerationDriver: + def image_generation_driver(self) -> AmazonBedrockImageGenerationDriver: return AmazonBedrockImageGenerationDriver( session=self.session, model="amazon.titan-image-generator-v1", @@ -46,7 +46,7 @@ def image_generation(self) -> AmazonBedrockImageGenerationDriver: ) @lazy_property() - def image_query(self) -> AmazonBedrockImageQueryDriver: + def image_query_driver(self) -> AmazonBedrockImageQueryDriver: return AmazonBedrockImageQueryDriver( session=self.session, model="anthropic.claude-3-5-sonnet-20240620-v1:0", @@ -54,7 +54,7 @@ def image_query(self) -> AmazonBedrockImageQueryDriver: ) @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver( embedding_driver=AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1") ) diff --git a/griptape/config/drivers/anthropic_driver_config.py b/griptape/config/drivers/anthropic_driver_config.py index 399f13cdb..b036d85f4 100644 --- a/griptape/config/drivers/anthropic_driver_config.py +++ b/griptape/config/drivers/anthropic_driver_config.py @@ -13,17 +13,17 @@ @define class AnthropicDriverConfig(DriverConfig): @lazy_property() - def prompt(self) -> AnthropicPromptDriver: + def prompt_driver(self) -> AnthropicPromptDriver: return AnthropicPromptDriver(model="claude-3-5-sonnet-20240620") @lazy_property() - def embedding(self) -> VoyageAiEmbeddingDriver: + def embedding_driver(self) -> VoyageAiEmbeddingDriver: return VoyageAiEmbeddingDriver(model="voyage-large-2") @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")) @lazy_property() - def image_query(self) -> AnthropicImageQueryDriver: + def image_query_driver(self) -> AnthropicImageQueryDriver: return AnthropicImageQueryDriver(model="claude-3-5-sonnet-20240620") diff --git a/griptape/config/drivers/azure_openai_driver_config.py b/griptape/config/drivers/azure_openai_driver_config.py index 211a7d209..f27c8970c 100644 --- a/griptape/config/drivers/azure_openai_driver_config.py +++ b/griptape/config/drivers/azure_openai_driver_config.py @@ -41,7 +41,7 @@ class AzureOpenAiDriverConfig(DriverConfig): api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) @lazy_property() - def prompt(self) -> AzureOpenAiChatPromptDriver: + def prompt_driver(self) -> AzureOpenAiChatPromptDriver: return AzureOpenAiChatPromptDriver( model="gpt-4o", azure_endpoint=self.azure_endpoint, @@ -51,7 +51,7 @@ def prompt(self) -> AzureOpenAiChatPromptDriver: ) @lazy_property() - def embedding(self) -> AzureOpenAiEmbeddingDriver: + def embedding_driver(self) -> AzureOpenAiEmbeddingDriver: return AzureOpenAiEmbeddingDriver( model="text-embedding-3-small", azure_endpoint=self.azure_endpoint, @@ -61,7 +61,7 @@ def embedding(self) -> AzureOpenAiEmbeddingDriver: ) @lazy_property() - def image_generation(self) -> AzureOpenAiImageGenerationDriver: + def image_generation_driver(self) -> AzureOpenAiImageGenerationDriver: return AzureOpenAiImageGenerationDriver( model="dall-e-2", azure_endpoint=self.azure_endpoint, @@ -72,7 +72,7 @@ def image_generation(self) -> AzureOpenAiImageGenerationDriver: ) @lazy_property() - def image_query(self) -> AzureOpenAiImageQueryDriver: + def image_query_driver(self) -> AzureOpenAiImageQueryDriver: return AzureOpenAiImageQueryDriver( model="gpt-4o", azure_endpoint=self.azure_endpoint, @@ -82,7 +82,7 @@ def image_query(self) -> AzureOpenAiImageQueryDriver: ) @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver( embedding_driver=AzureOpenAiEmbeddingDriver( model="text-embedding-3-small", diff --git a/griptape/config/drivers/base_driver_config.py b/griptape/config/drivers/base_driver_config.py index 3a8672a26..d8555052f 100644 --- a/griptape/config/drivers/base_driver_config.py +++ b/griptape/config/drivers/base_driver_config.py @@ -23,57 +23,59 @@ @define class BaseDriverConfig(ABC, SerializableMixin): - _prompt: BasePromptDriver = field(kw_only=True, default=None, metadata={"serializable": True}, alias="prompt") - _image_generation: BaseImageGenerationDriver = field( - kw_only=True, default=None, metadata={"serializable": True}, alias="image_generation" + _prompt_driver: BasePromptDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="prompt_driver" ) - _image_query: BaseImageQueryDriver = field( - kw_only=True, default=None, metadata={"serializable": True}, alias="image_query" + _image_generation_driver: BaseImageGenerationDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="image_generation_driver" ) - _embedding: BaseEmbeddingDriver = field( - kw_only=True, default=None, metadata={"serializable": True}, alias="embedding" + _image_query_driver: BaseImageQueryDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="image_query_driver" ) - _vector_store: BaseVectorStoreDriver = field( - default=None, kw_only=True, metadata={"serializable": True}, alias="vector_store" + _embedding_driver: BaseEmbeddingDriver = field( + kw_only=True, default=None, metadata={"serializable": True}, alias="embedding_driver" ) - _conversation_memory: Optional[BaseConversationMemoryDriver] = field( - default=None, kw_only=True, metadata={"serializable": True}, alias="conversation_memory" + _vector_store_driver: BaseVectorStoreDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="vector_store_driver" ) - _text_to_speech: BaseTextToSpeechDriver = field( - default=None, kw_only=True, metadata={"serializable": True}, alias="text_to_speech" + _conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="conversation_memory_driver" ) - _audio_transcription: BaseAudioTranscriptionDriver = field( - default=None, kw_only=True, metadata={"serializable": True}, alias="audio_transcription" + _text_to_speech_driver: BaseTextToSpeechDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="text_to_speech_driver" + ) + _audio_transcription_driver: BaseAudioTranscriptionDriver = field( + default=None, kw_only=True, metadata={"serializable": True}, alias="audio_transcription_driver" ) @lazy_property() @abstractmethod - def prompt(self) -> BasePromptDriver: ... + def prompt_driver(self) -> BasePromptDriver: ... @lazy_property() @abstractmethod - def image_generation(self) -> BaseImageGenerationDriver: ... + def image_generation_driver(self) -> BaseImageGenerationDriver: ... @lazy_property() @abstractmethod - def image_query(self) -> BaseImageQueryDriver: ... + def image_query_driver(self) -> BaseImageQueryDriver: ... @lazy_property() @abstractmethod - def embedding(self) -> BaseEmbeddingDriver: ... + def embedding_driver(self) -> BaseEmbeddingDriver: ... @lazy_property() @abstractmethod - def vector_store(self) -> BaseVectorStoreDriver: ... + def vector_store_driver(self) -> BaseVectorStoreDriver: ... @lazy_property() @abstractmethod - def conversation_memory(self) -> Optional[BaseConversationMemoryDriver]: ... + def conversation_memory_driver(self) -> Optional[BaseConversationMemoryDriver]: ... @lazy_property() @abstractmethod - def text_to_speech(self) -> BaseTextToSpeechDriver: ... + def text_to_speech_driver(self) -> BaseTextToSpeechDriver: ... @lazy_property() @abstractmethod - def audio_transcription(self) -> BaseAudioTranscriptionDriver: ... + def audio_transcription_driver(self) -> BaseAudioTranscriptionDriver: ... diff --git a/griptape/config/drivers/cohere_driver_config.py b/griptape/config/drivers/cohere_driver_config.py index ae3b6c184..25dc833e5 100644 --- a/griptape/config/drivers/cohere_driver_config.py +++ b/griptape/config/drivers/cohere_driver_config.py @@ -14,11 +14,11 @@ class CohereDriverConfig(DriverConfig): api_key: str = field(metadata={"serializable": False}, kw_only=True) @lazy_property() - def prompt(self) -> CoherePromptDriver: + def prompt_driver(self) -> CoherePromptDriver: return CoherePromptDriver(model="command-r", api_key=self.api_key) @lazy_property() - def embedding(self) -> CohereEmbeddingDriver: + def embedding_driver(self) -> CohereEmbeddingDriver: return CohereEmbeddingDriver( model="embed-english-v3.0", api_key=self.api_key, @@ -26,7 +26,7 @@ def embedding(self) -> CohereEmbeddingDriver: ) @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver( embedding_driver=CohereEmbeddingDriver( model="embed-english-v3.0", diff --git a/griptape/config/drivers/driver_config.py b/griptape/config/drivers/driver_config.py index b102c4465..16cb9a535 100644 --- a/griptape/config/drivers/driver_config.py +++ b/griptape/config/drivers/driver_config.py @@ -32,33 +32,33 @@ @define class DriverConfig(BaseDriverConfig): @lazy_property() - def prompt(self) -> BasePromptDriver: + def prompt_driver(self) -> BasePromptDriver: return DummyPromptDriver() @lazy_property() - def image_generation(self) -> BaseImageGenerationDriver: + def image_generation_driver(self) -> BaseImageGenerationDriver: return DummyImageGenerationDriver() @lazy_property() - def image_query(self) -> BaseImageQueryDriver: + def image_query_driver(self) -> BaseImageQueryDriver: return DummyImageQueryDriver() @lazy_property() - def embedding(self) -> BaseEmbeddingDriver: + def embedding_driver(self) -> BaseEmbeddingDriver: return DummyEmbeddingDriver() @lazy_property() - def vector_store(self) -> BaseVectorStoreDriver: - return DummyVectorStoreDriver(embedding_driver=self.embedding) + def vector_store_driver(self) -> BaseVectorStoreDriver: + return DummyVectorStoreDriver(embedding_driver=self.embedding_driver) @lazy_property() - def conversation_memory(self) -> Optional[BaseConversationMemoryDriver]: + def conversation_memory_driver(self) -> Optional[BaseConversationMemoryDriver]: return None @lazy_property() - def text_to_speech(self) -> BaseTextToSpeechDriver: + def text_to_speech_driver(self) -> BaseTextToSpeechDriver: return DummyTextToSpeechDriver() @lazy_property() - def audio_transcription(self) -> BaseAudioTranscriptionDriver: + def audio_transcription_driver(self) -> BaseAudioTranscriptionDriver: return DummyAudioTranscriptionDriver() diff --git a/griptape/config/drivers/google_driver_config.py b/griptape/config/drivers/google_driver_config.py index 5cff7ef6d..0ab72e6bb 100644 --- a/griptape/config/drivers/google_driver_config.py +++ b/griptape/config/drivers/google_driver_config.py @@ -12,13 +12,13 @@ @define class GoogleDriverConfig(DriverConfig): @lazy_property() - def prompt(self) -> GooglePromptDriver: + def prompt_driver(self) -> GooglePromptDriver: return GooglePromptDriver(model="gemini-1.5-pro") @lazy_property() - def embedding(self) -> GoogleEmbeddingDriver: + def embedding_driver(self) -> GoogleEmbeddingDriver: return GoogleEmbeddingDriver(model="models/embedding-001") @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")) diff --git a/griptape/config/drivers/openai_driver_config.py b/griptape/config/drivers/openai_driver_config.py index a16f79ed8..49cf60206 100644 --- a/griptape/config/drivers/openai_driver_config.py +++ b/griptape/config/drivers/openai_driver_config.py @@ -16,29 +16,29 @@ @define class OpenAiDriverConfig(DriverConfig): @lazy_property() - def prompt(self) -> OpenAiChatPromptDriver: + def prompt_driver(self) -> OpenAiChatPromptDriver: return OpenAiChatPromptDriver(model="gpt-4o") @lazy_property() - def image_generation(self) -> OpenAiImageGenerationDriver: + def image_generation_driver(self) -> OpenAiImageGenerationDriver: return OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512") @lazy_property() - def image_query(self) -> OpenAiImageQueryDriver: + def image_query_driver(self) -> OpenAiImageQueryDriver: return OpenAiImageQueryDriver(model="gpt-4o") @lazy_property() - def embedding(self) -> OpenAiEmbeddingDriver: + def embedding_driver(self) -> OpenAiEmbeddingDriver: return OpenAiEmbeddingDriver(model="text-embedding-3-small") @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")) @lazy_property() - def text_to_speech(self) -> OpenAiTextToSpeechDriver: + def text_to_speech_driver(self) -> OpenAiTextToSpeechDriver: return OpenAiTextToSpeechDriver(model="tts") @lazy_property() - def audio_transcription(self) -> OpenAiAudioTranscriptionDriver: + def audio_transcription_driver(self) -> OpenAiAudioTranscriptionDriver: return OpenAiAudioTranscriptionDriver(model="whisper-1") diff --git a/griptape/engines/audio/audio_transcription_engine.py b/griptape/engines/audio/audio_transcription_engine.py index cad8287d5..ee5739d81 100644 --- a/griptape/engines/audio/audio_transcription_engine.py +++ b/griptape/engines/audio/audio_transcription_engine.py @@ -8,7 +8,7 @@ @define class AudioTranscriptionEngine: audio_transcription_driver: BaseAudioTranscriptionDriver = field( - default=Factory(lambda: config.drivers.audio_transcription), kw_only=True + default=Factory(lambda: config.driver_config.audio_transcription_driver), kw_only=True ) def run(self, audio: AudioArtifact, *args, **kwargs) -> TextArtifact: diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index aad45a10a..3036d8bf5 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -14,7 +14,7 @@ @define class TextToSpeechEngine: text_to_speech_driver: BaseTextToSpeechDriver = field( - default=Factory(lambda: config.drivers.text_to_speech), kw_only=True + default=Factory(lambda: config.driver_config.text_to_speech_driver), kw_only=True ) def run(self, prompts: list[str], *args, **kwargs) -> AudioArtifact: diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index 8f61bb764..0a28b65b3 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -18,7 +18,7 @@ class BaseExtractionEngine(ABC): max_token_multiplier: float = field(default=0.5, kw_only=True) chunk_joiner: str = field(default="\n\n", kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 9bec68b91..9f72f16be 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -16,7 +16,7 @@ @define class BaseImageGenerationEngine(ABC): image_generation_driver: BaseImageGenerationDriver = field( - kw_only=True, default=Factory(lambda: config.drivers.image_generation) + kw_only=True, default=Factory(lambda: config.driver_config.image_generation_driver) ) @abstractmethod diff --git a/griptape/engines/image_query/image_query_engine.py b/griptape/engines/image_query/image_query_engine.py index f2bd99544..1b8fce277 100644 --- a/griptape/engines/image_query/image_query_engine.py +++ b/griptape/engines/image_query/image_query_engine.py @@ -13,7 +13,9 @@ @define class ImageQueryEngine: - image_query_driver: BaseImageQueryDriver = field(default=Factory(lambda: config.drivers.image_query), kw_only=True) + image_query_driver: BaseImageQueryDriver = field( + default=Factory(lambda: config.driver_config.image_query_driver), kw_only=True + ) def run(self, query: str, images: list[ImageArtifact]) -> TextArtifact: return self.image_query_driver.query(query, images) diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 92e611223..d1bcdd3b8 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -18,7 +18,7 @@ @define(kw_only=True) class PromptResponseRagModule(BaseResponseRagModule, RuleMixin): - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt)) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver)) answer_token_offset: int = field(default=400) metadata: Optional[str] = field(default=None) generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index 6ce235fa5..c04e9025a 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -18,7 +18,9 @@ @define(kw_only=True) class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): - vector_store_driver: BaseVectorStoreDriver = field(default=Factory(lambda: config.drivers.vector_store)) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory(lambda: config.driver_config.vector_store_driver) + ) query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( default=Factory(lambda: lambda es: [e.to_artifact() for e in es]), diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 065677e1b..04f30ca82 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -22,7 +22,7 @@ class PromptSummaryEngine(BaseSummaryEngine): max_token_multiplier: float = field(default=0.5, kw_only=True) system_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/system.j2")), kw_only=True) user_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/user.j2")), kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index d6e3549af..86431122a 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -18,7 +18,7 @@ @define class BaseConversationMemory(SerializableMixin, ABC): driver: Optional[BaseConversationMemoryDriver] = field( - default=Factory(lambda: config.drivers.conversation_memory), kw_only=True + default=Factory(lambda: config.driver_config.conversation_memory_driver), kw_only=True ) runs: list[Run] = field(factory=list, kw_only=True, metadata={"serializable": True}) structure: Structure = field(init=False) @@ -67,7 +67,7 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = if self.autoprune and hasattr(self, "structure"): should_prune = True - prompt_driver = config.drivers.prompt + prompt_driver = config.driver_config.prompt_driver temp_stack = PromptStack() # Try to determine how many Conversation Memory runs we can diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index 4263e61c8..736891d90 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -18,7 +18,7 @@ @define class SummaryConversationMemory(ConversationMemory): offset: int = field(default=1, kw_only=True, metadata={"serializable": True}) - prompt_driver: BasePromptDriver = field(kw_only=True, default=Factory(lambda: config.drivers.prompt)) + prompt_driver: BasePromptDriver = field(kw_only=True, default=Factory(lambda: config.driver_config.prompt_driver)) summary: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) summary_index: int = field(default=0, kw_only=True, metadata={"serializable": True}) summary_template_generator: J2 = field(default=Factory(lambda: J2("memory/conversation/summary.j2")), kw_only=True) diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 623c176ea..5eb3ab734 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -14,7 +14,9 @@ @define(kw_only=True) class TextArtifactStorage(BaseArtifactStorage): - vector_store_driver: BaseVectorStoreDriver = field(default=Factory(lambda: config.drivers.vector_store)) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory(lambda: config.driver_config.vector_store_driver) + ) def can_store(self, artifact: BaseArtifact) -> bool: return isinstance(artifact, TextArtifact) diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index a046da6a9..2c4edfc7d 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -23,8 +23,8 @@ class Agent(Structure): input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), ) - stream: bool = field(default=Factory(lambda: config.drivers.prompt.stream), kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) + stream: bool = field(default=Factory(lambda: config.driver_config.prompt_driver.stream), kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) fail_fast: bool = field(default=False, kw_only=True) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 83ffc2081..da6f214eb 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -20,7 +20,7 @@ if TYPE_CHECKING: from griptape.memory import TaskMemory -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index 00774e0a2..b24ec3f3c 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -9,7 +9,7 @@ from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.tasks import BaseTask -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_audio_input_task.py b/griptape/tasks/base_audio_input_task.py index 8a470bb85..fc94ed5d4 100644 --- a/griptape/tasks/base_audio_input_task.py +++ b/griptape/tasks/base_audio_input_task.py @@ -11,7 +11,7 @@ from griptape.mixins import RuleMixin from griptape.tasks import BaseTask -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index f94ff8de2..9c226256b 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -18,7 +18,7 @@ from griptape.artifacts import MediaArtifact -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index c688a1129..52b68e4e0 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -12,7 +12,7 @@ from griptape.tasks import BaseTask from griptape.utils import J2 -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index f5a772e48..d80767793 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -18,7 +18,7 @@ from griptape.memory.meta import BaseMetaEntry from griptape.structures import Structure -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index 1c9dfc023..0a53b9fcd 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -12,7 +12,7 @@ from griptape.tasks import BaseTask from griptape.utils import J2 -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index a8038832d..719ae77bc 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -15,12 +15,12 @@ if TYPE_CHECKING: from griptape.drivers import BasePromptDriver -logger = logging.getLogger(config.logging.logger_name) +logger = logging.getLogger(config.logging_config.logger_name) @define class PromptTask(RuleMixin, BaseTask): - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.drivers.prompt), kw_only=True) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) generate_system_template: Callable[[PromptTask], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True, diff --git a/griptape/tools/query/tool.py b/griptape/tools/query/tool.py index 3ecc63bca..70cc9f747 100644 --- a/griptape/tools/query/tool.py +++ b/griptape/tools/query/tool.py @@ -25,7 +25,9 @@ class QueryTool(BaseTool, RuleMixin): lambda self: RagEngine( response_stage=ResponseRagStage( response_modules=[ - PromptResponseRagModule(prompt_driver=config.drivers.prompt, rulesets=self.rulesets) + PromptResponseRagModule( + prompt_driver=config.driver_config.prompt_driver, rulesets=self.rulesets + ) ], ), ), diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index a5cbce13d..f30e9f1cd 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -41,8 +41,8 @@ def start(self) -> None: from griptape.config import config # Hide Griptape's logging output except for errors - old_logger_level = logging.getLogger(config.logging.logger_name).getEffectiveLevel() - logging.getLogger(config.logging.logger_name).setLevel(self.logger_level) + old_logger_level = logging.getLogger(config.logging_config.logger_name).getEffectiveLevel() + logging.getLogger(config.logging_config.logger_name).setLevel(self.logger_level) if self.intro_text: self.output_fn(self.intro_text) @@ -53,7 +53,7 @@ def start(self) -> None: self.output_fn(self.exiting_text) break - if config.drivers.prompt.stream: + if config.driver_config.prompt_driver.stream: self.output_fn(self.processing_text + "\n") stream = Stream(self.structure).run(question) first_chunk = next(stream) @@ -65,4 +65,4 @@ def start(self) -> None: self.output_fn(f"{self.response_prefix}{self.structure.run(question).output_task.output.to_text()}") # Restore the original logger level - logging.getLogger(config.logging.logger_name).setLevel(old_logger_level) + logging.getLogger(config.logging_config.logger_name).setLevel(old_logger_level) diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_driver_config.py index eeab99abc..b038fe920 100644 --- a/tests/mocks/mock_driver_config.py +++ b/tests/mocks/mock_driver_config.py @@ -12,21 +12,21 @@ @define class MockDriverConfig(DriverConfig): @lazy_property() - def prompt(self) -> MockPromptDriver: + def prompt_driver(self) -> MockPromptDriver: return MockPromptDriver() @lazy_property() - def image_generation(self) -> MockImageGenerationDriver: + def image_generation_driver(self) -> MockImageGenerationDriver: return MockImageGenerationDriver() @lazy_property() - def image_query(self) -> MockImageQueryDriver: + def image_query_driver(self) -> MockImageQueryDriver: return MockImageQueryDriver() @lazy_property() - def embedding(self) -> MockEmbeddingDriver: + def embedding_driver(self) -> MockEmbeddingDriver: return MockEmbeddingDriver() @lazy_property() - def vector_store(self) -> LocalVectorStoreDriver: + def vector_store_driver(self) -> LocalVectorStoreDriver: return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py index a76eeb278..e30444332 100644 --- a/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py +++ b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py @@ -25,9 +25,9 @@ def config_with_values(self): def test_to_dict(self, config): assert config.to_dict() == { - "conversation_memory": None, - "embedding": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, - "image_generation": { + "conversation_memory_driver": None, + "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation_driver": { "image_generation_model_driver": { "cfg_scale": 7, "outpainting_mode": "PRECISE", @@ -40,13 +40,13 @@ def test_to_dict(self, config): "seed": None, "type": "AmazonBedrockImageGenerationDriver", }, - "image_query": { + "image_query_driver": { "type": "AmazonBedrockImageQueryDriver", "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "max_tokens": 256, "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, }, - "prompt": { + "prompt_driver": { "max_tokens": None, "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "stream": False, @@ -55,7 +55,7 @@ def test_to_dict(self, config): "tool_choice": {"auto": {}}, "use_native_tools": True, }, - "vector_store": { + "vector_store_driver": { "embedding_driver": { "model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver", @@ -63,8 +63,8 @@ def test_to_dict(self, config): "type": "LocalVectorStoreDriver", }, "type": "AmazonBedrockDriverConfig", - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): @@ -77,9 +77,9 @@ def test_from_dict_with_values(self, config_with_values): def test_to_dict_with_values(self, config_with_values): assert config_with_values.to_dict() == { - "conversation_memory": None, - "embedding": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, - "image_generation": { + "conversation_memory_driver": None, + "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation_driver": { "image_generation_model_driver": { "cfg_scale": 7, "outpainting_mode": "PRECISE", @@ -92,13 +92,13 @@ def test_to_dict_with_values(self, config_with_values): "seed": None, "type": "AmazonBedrockImageGenerationDriver", }, - "image_query": { + "image_query_driver": { "type": "AmazonBedrockImageQueryDriver", "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "max_tokens": 256, "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, }, - "prompt": { + "prompt_driver": { "max_tokens": None, "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "stream": False, @@ -107,7 +107,7 @@ def test_to_dict_with_values(self, config_with_values): "tool_choice": {"auto": {}}, "use_native_tools": True, }, - "vector_store": { + "vector_store_driver": { "embedding_driver": { "model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver", @@ -115,7 +115,7 @@ def test_to_dict_with_values(self, config_with_values): "type": "LocalVectorStoreDriver", }, "type": "AmazonBedrockDriverConfig", - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } assert config_with_values.session.region_name == "region-value" diff --git a/tests/unit/config/drivers/test_anthropic_driver_config.py b/tests/unit/config/drivers/test_anthropic_driver_config.py index a496c47b7..770a04b9f 100644 --- a/tests/unit/config/drivers/test_anthropic_driver_config.py +++ b/tests/unit/config/drivers/test_anthropic_driver_config.py @@ -16,7 +16,7 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "AnthropicDriverConfig", - "prompt": { + "prompt_driver": { "type": "AnthropicPromptDriver", "temperature": 0.1, "max_tokens": 1000, @@ -26,18 +26,18 @@ def test_to_dict(self, config): "top_k": 250, "use_native_tools": True, }, - "image_generation": {"type": "DummyImageGenerationDriver"}, - "image_query": { + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": { "type": "AnthropicImageQueryDriver", "model": "claude-3-5-sonnet-20240620", "max_tokens": 256, }, - "embedding": { + "embedding_driver": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", "input_type": "document", }, - "vector_store": { + "vector_store_driver": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "VoyageAiEmbeddingDriver", @@ -45,9 +45,9 @@ def test_to_dict(self, config): "input_type": "document", }, }, - "conversation_memory": None, - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): diff --git a/tests/unit/config/drivers/test_azure_openai_driver_config.py b/tests/unit/config/drivers/test_azure_openai_driver_config.py index ef418e097..dfc69ce46 100644 --- a/tests/unit/config/drivers/test_azure_openai_driver_config.py +++ b/tests/unit/config/drivers/test_azure_openai_driver_config.py @@ -20,7 +20,7 @@ def test_to_dict(self, config): assert config.to_dict() == { "type": "AzureOpenAiDriverConfig", "azure_endpoint": "http://localhost:8080", - "prompt": { + "prompt_driver": { "type": "AzureOpenAiChatPromptDriver", "base_url": None, "model": "gpt-4o", @@ -36,8 +36,8 @@ def test_to_dict(self, config): "user": "", "use_native_tools": True, }, - "conversation_memory": None, - "embedding": { + "conversation_memory_driver": None, + "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", "api_version": "2023-05-15", @@ -46,7 +46,7 @@ def test_to_dict(self, config): "organization": None, "type": "AzureOpenAiEmbeddingDriver", }, - "image_generation": { + "image_generation_driver": { "api_version": "2024-02-01", "base_url": None, "image_size": "512x512", @@ -59,7 +59,7 @@ def test_to_dict(self, config): "style": None, "type": "AzureOpenAiImageGenerationDriver", }, - "image_query": { + "image_query_driver": { "base_url": None, "image_quality": "auto", "max_tokens": 256, @@ -70,7 +70,7 @@ def test_to_dict(self, config): "organization": None, "type": "AzureOpenAiImageQueryDriver", }, - "vector_store": { + "vector_store_driver": { "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", @@ -82,6 +82,6 @@ def test_to_dict(self, config): }, "type": "LocalVectorStoreDriver", }, - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } diff --git a/tests/unit/config/drivers/test_cohere_driver_config.py b/tests/unit/config/drivers/test_cohere_driver_config.py index 5a75c98cd..982733dd6 100644 --- a/tests/unit/config/drivers/test_cohere_driver_config.py +++ b/tests/unit/config/drivers/test_cohere_driver_config.py @@ -11,12 +11,12 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "CohereDriverConfig", - "image_generation": {"type": "DummyImageGenerationDriver"}, - "image_query": {"type": "DummyImageQueryDriver"}, - "conversation_memory": None, - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, - "prompt": { + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "prompt_driver": { "type": "CoherePromptDriver", "temperature": 0.1, "max_tokens": None, @@ -25,12 +25,12 @@ def test_to_dict(self, config): "force_single_step": False, "use_native_tools": True, }, - "embedding": { + "embedding_driver": { "type": "CohereEmbeddingDriver", "model": "embed-english-v3.0", "input_type": "search_document", }, - "vector_store": { + "vector_store_driver": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "CohereEmbeddingDriver", diff --git a/tests/unit/config/drivers/test_driver_config.py b/tests/unit/config/drivers/test_driver_config.py index 71220646f..4c11a24cd 100644 --- a/tests/unit/config/drivers/test_driver_config.py +++ b/tests/unit/config/drivers/test_driver_config.py @@ -11,29 +11,29 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "DriverConfig", - "prompt": { + "prompt_driver": { "type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False, "use_native_tools": False, }, - "conversation_memory": None, - "embedding": {"type": "DummyEmbeddingDriver"}, - "image_generation": {"type": "DummyImageGenerationDriver"}, - "image_query": {"type": "DummyImageQueryDriver"}, - "vector_store": { + "conversation_memory_driver": None, + "embedding_driver": {"type": "DummyEmbeddingDriver"}, + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "vector_store_driver": { "embedding_driver": {"type": "DummyEmbeddingDriver"}, "type": "DummyVectorStoreDriver", }, - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): assert DriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() def test_dot_update(self, config): - config.prompt.max_tokens = 10 + config.prompt_driver.max_tokens = 10 - assert config.prompt.max_tokens == 10 + assert config.prompt_driver.max_tokens == 10 diff --git a/tests/unit/config/drivers/test_google_driver_config.py b/tests/unit/config/drivers/test_google_driver_config.py index 3a16173b5..e16f63eb3 100644 --- a/tests/unit/config/drivers/test_google_driver_config.py +++ b/tests/unit/config/drivers/test_google_driver_config.py @@ -15,7 +15,7 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "GoogleDriverConfig", - "prompt": { + "prompt_driver": { "type": "GooglePromptDriver", "temperature": 0.1, "max_tokens": None, @@ -26,15 +26,15 @@ def test_to_dict(self, config): "tool_choice": "auto", "use_native_tools": True, }, - "image_generation": {"type": "DummyImageGenerationDriver"}, - "image_query": {"type": "DummyImageQueryDriver"}, - "embedding": { + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "embedding_driver": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", "task_type": "retrieval_document", "title": None, }, - "vector_store": { + "vector_store_driver": { "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "GoogleEmbeddingDriver", @@ -43,9 +43,9 @@ def test_to_dict(self, config): "title": None, }, }, - "conversation_memory": None, - "text_to_speech": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription": {"type": "DummyAudioTranscriptionDriver"}, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): diff --git a/tests/unit/config/drivers/test_openai_driver_config.py b/tests/unit/config/drivers/test_openai_driver_config.py index 860f70518..5c560a7f7 100644 --- a/tests/unit/config/drivers/test_openai_driver_config.py +++ b/tests/unit/config/drivers/test_openai_driver_config.py @@ -15,7 +15,7 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "OpenAiDriverConfig", - "prompt": { + "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, "model": "gpt-4o", @@ -28,14 +28,14 @@ def test_to_dict(self, config): "user": "", "use_native_tools": True, }, - "conversation_memory": None, - "embedding": { + "conversation_memory_driver": None, + "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", "organization": None, "type": "OpenAiEmbeddingDriver", }, - "image_generation": { + "image_generation_driver": { "api_version": None, "base_url": None, "image_size": "512x512", @@ -46,7 +46,7 @@ def test_to_dict(self, config): "style": None, "type": "OpenAiImageGenerationDriver", }, - "image_query": { + "image_query_driver": { "api_version": None, "base_url": None, "image_quality": "auto", @@ -55,7 +55,7 @@ def test_to_dict(self, config): "organization": None, "type": "OpenAiImageQueryDriver", }, - "vector_store": { + "vector_store_driver": { "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", @@ -64,7 +64,7 @@ def test_to_dict(self, config): }, "type": "LocalVectorStoreDriver", }, - "text_to_speech": { + "text_to_speech_driver": { "type": "OpenAiTextToSpeechDriver", "api_version": None, "base_url": None, @@ -73,7 +73,7 @@ def test_to_dict(self, config): "organization": None, "voice": "alloy", }, - "audio_transcription": { + "audio_transcription_driver": { "type": "OpenAiAudioTranscriptionDriver", "api_version": None, "base_url": None, diff --git a/tests/unit/config/logging/test_newline_logging_filter.py b/tests/unit/config/logging/test_newline_logging_filter.py index d5b05e323..89166dd40 100644 --- a/tests/unit/config/logging/test_newline_logging_filter.py +++ b/tests/unit/config/logging/test_newline_logging_filter.py @@ -10,7 +10,7 @@ class TestNewlineLoggingFilter: def test_filter(self): # use the filter in an Agent - logger = logging.getLogger(config.logging.logger_name) + logger = logging.getLogger(config.logging_config.logger_name) logger.addFilter(NewlineLoggingFilter(replace_str="$$$")) agent = Agent() # use a context manager to capture the stdout diff --git a/tests/unit/config/logging/test_truncate_logging_filter.py b/tests/unit/config/logging/test_truncate_logging_filter.py index fc0aa1c47..a9387b52b 100644 --- a/tests/unit/config/logging/test_truncate_logging_filter.py +++ b/tests/unit/config/logging/test_truncate_logging_filter.py @@ -10,7 +10,7 @@ class TestTruncateLoggingFilter: def test_filter(self): # use the filter in an Agent - logger = logging.getLogger(config.logging.logger_name) + logger = logging.getLogger(config.logging_config.logger_name) logger.addFilter(TruncateLoggingFilter(max_log_length=0)) agent = Agent() # use a context manager to capture the stdout diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 04d5586d2..4ed75d325 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -9,18 +9,18 @@ def test_init(self): from griptape.config import config from griptape.config.logging import LoggingConfig - assert isinstance(config.drivers, OpenAiDriverConfig) - assert isinstance(config.logging, LoggingConfig) + assert isinstance(config.driver_config, OpenAiDriverConfig) + assert isinstance(config.logging_config, LoggingConfig) @pytest.mark.skip_mock_config() def test_lazy_init(self): from griptape.config import config - assert config._drivers is None - assert config._logging is None + assert config._driver_config is None + assert config._logging_config is None - assert config.drivers is not None - assert config.logging is not None + assert config.driver_config is not None + assert config.logging_config is not None - assert config._drivers is not None - assert config._logging is not None + assert config._driver_config is not None + assert config._logging_config is not None diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index db881bc20..e2eaabe1f 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -26,7 +26,7 @@ def mock_config(request): return - config.drivers = MockDriverConfig() + config.driver_config = MockDriverConfig() yield config diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index c30acdec4..3e0b0ffc8 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -11,7 +11,7 @@ class TestBasePromptDriver: def test_run_via_pipeline_retries_success(self, mock_config): - mock_config.drivers.prompt = MockPromptDriver(max_attempts=2) + mock_config.driver_config.prompt_driver = MockPromptDriver(max_attempts=2) pipeline = Pipeline() pipeline.add_task(PromptTask("test")) @@ -19,7 +19,7 @@ def test_run_via_pipeline_retries_success(self, mock_config): assert isinstance(pipeline.run().output_task.output, TextArtifact) def test_run_via_pipeline_retries_failure(self, mock_config): - mock_config.drivers.prompt = MockFailingPromptDriver(max_failures=2, max_attempts=1) + mock_config.driver_config.prompt_driver = MockFailingPromptDriver(max_failures=2, max_attempts=1) pipeline = Pipeline() pipeline.add_task(PromptTask("test")) @@ -46,7 +46,7 @@ def test_run_with_stream(self): assert result.value == "mock output" def test_run_with_tools(self, mock_config): - mock_config.drivers.prompt = MockPromptDriver(max_attempts=1, use_native_tools=True) + mock_config.driver_config.prompt_driver = MockPromptDriver(max_attempts=1, use_native_tools=True) pipeline = Pipeline() pipeline.add_task(ToolkitTask(tools=[MockTool()])) diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index c2bb45208..2090be39c 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -20,7 +20,7 @@ def test_run(self): def test_run_with_env(self, mock_config): pipeline = Pipeline() - mock_config.drivers.prompt = MockPromptDriver(mock_output=lambda _: os.environ["KEY"]) + mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output=lambda _: os.environ["KEY"]) agent = Agent() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"KEY": "value"}) task = StructureRunTask(driver=driver) diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 4e21fa392..0078ebc34 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -26,7 +26,7 @@ class TestEventListener: @pytest.fixture() def pipeline(self, mock_config): - mock_config.drivers.prompt = MockPromptDriver(stream=True) + mock_config.driver_config.prompt_driver = MockPromptDriver(stream=True) task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) pipeline = Pipeline() diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index f0e4b0af3..b7137524e 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -97,7 +97,9 @@ def test_add_to_prompt_stack_autopruing_disabled(self): def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): # All memory is pruned. - mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0)) + mock_config.driver_config.prompt_driver = MockPromptDriver( + tokenizer=MockTokenizer(model="foo", max_input_tokens=0) + ) agent = Agent() memory = ConversationMemory( autoprune=True, @@ -119,7 +121,9 @@ def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): assert len(prompt_stack.messages) == 3 # No memory is pruned. - mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000)) + mock_config.driver_config.prompt_driver = MockPromptDriver( + tokenizer=MockTokenizer(model="foo", max_input_tokens=1000) + ) agent = Agent() memory = ConversationMemory( autoprune=True, @@ -143,7 +147,9 @@ def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): # One memory is pruned. # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens # so that a single memory is pruned. - mock_config.drivers.prompt = MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=160)) + mock_config.driver_config.prompt_driver = MockPromptDriver( + tokenizer=MockTokenizer(model="foo", max_input_tokens=160) + ) agent = Agent() memory = ConversationMemory( autoprune=True, diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index ef5faeff1..d90f2f8ba 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -222,7 +222,7 @@ def test_task_memory_defaults(self, mock_config): storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.vector_store_driver.embedding_driver == mock_config.drivers.embedding + assert storage.vector_store_driver.embedding_driver == mock_config.driver_config.embedding_driver def finished_tasks(self): task = PromptTask("test prompt") diff --git a/tests/unit/tasks/test_structure_run_task.py b/tests/unit/tasks/test_structure_run_task.py index d18d75d75..fe434a281 100644 --- a/tests/unit/tasks/test_structure_run_task.py +++ b/tests/unit/tasks/test_structure_run_task.py @@ -6,9 +6,9 @@ class TestStructureRunTask: def test_run(self, mock_config): - mock_config.drivers.prompt = MockPromptDriver(mock_output="agent mock output") + mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output="agent mock output") agent = Agent() - mock_config.drivers.prompt = MockPromptDriver(mock_output="pipeline mock output") + mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output="pipeline mock output") pipeline = Pipeline() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index 18521632e..9ba1df731 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -168,7 +168,9 @@ class TestToolTask: def agent(self, mock_config): output_dict = {"tag": "foo", "name": "MockTool", "path": "test", "input": {"values": {"test": "foobar"}}} - mock_config.drivers.prompt = MockPromptDriver(mock_output=f"```python foo bar\n{json.dumps(output_dict)}") + mock_config.driver_config.prompt_driver = MockPromptDriver( + mock_output=f"```python foo bar\n{json.dumps(output_dict)}" + ) return Agent() diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index c1b91b1ed..6837fca78 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -171,7 +171,7 @@ def test_init(self): def test_run(self, mock_config): output = """Answer: done""" - mock_config.drivers.prompt.mock_output = output + mock_config.driver_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1"), MockTool(name="Tool2")]) agent = Agent() @@ -186,7 +186,7 @@ def test_run(self, mock_config): def test_run_max_subtasks(self, mock_config): output = 'Actions: [{"tag": "foo", "name": "Tool1", "path": "test", "input": {"values": {"test": "value"}}}]' - mock_config.drivers.prompt.mock_output = output + mock_config.driver_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) agent = Agent() @@ -200,7 +200,7 @@ def test_run_max_subtasks(self, mock_config): def test_run_invalid_react_prompt(self, mock_config): output = """foo bar""" - mock_config.drivers.prompt.mock_output = output + mock_config.driver_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) agent = Agent() diff --git a/tests/unit/utils/test_chat.py b/tests/unit/utils/test_chat.py index 5c73a6845..ff728718a 100644 --- a/tests/unit/utils/test_chat.py +++ b/tests/unit/utils/test_chat.py @@ -37,7 +37,7 @@ def test_chat_logger_level(self, mock_input): chat = Chat(agent) - logger = logging.getLogger(config.logging.logger_name) + logger = logging.getLogger(config.logging_config.logger_name) logger.setLevel(logging.DEBUG) assert logger.getEffectiveLevel() == logging.DEBUG diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index d87fc095e..7de57d85c 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -25,7 +25,9 @@ def get_enabled_prompt_drivers(prompt_drivers_options) -> list[BasePromptDriver]: return [ - prompt_driver_option.prompt for prompt_driver_option in prompt_drivers_options if prompt_driver_option.enabled + prompt_driver_option.prompt_driver + for prompt_driver_option in prompt_drivers_options + if prompt_driver_option.enabled ] @@ -228,7 +230,7 @@ def prompt_driver_id_fn(cls, prompt_driver) -> str: def verify_structure_output(self, structure) -> dict: from griptape.config import config - config.drivers.prompt = AzureOpenAiChatPromptDriver( + config.driver_config.prompt_driver = AzureOpenAiChatPromptDriver( api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-4o", azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], From a6e3af8124ef83a0dbd4dda66dec75cbd36b9cb7 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 13:31:18 -0700 Subject: [PATCH 229/238] Use typed list for Tools (#1077) --- CHANGELOG.md | 3 ++ .../drivers/prompt/google_prompt_driver.py | 8 +++- griptape/tools/file_manager/tool.py | 2 +- griptape/tools/image_query/tool.py | 2 +- griptape/tools/rest_api/tool.py | 8 ++-- griptape/tools/structure_run/tool.py | 8 +++- .../prompt/test_google_prompt_driver.py | 41 ++++++++++++------- 7 files changed, 49 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c85f7061..a45f76053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `JsonExtractionEngine` failing to parse json when the LLM outputs more than just the json. - Exception when adding `ErrorArtifact`'s to the Prompt Stack. - Concurrency bug in `BaseVectorStoreDriver.upsert_text_artifacts`. +- Schema issues with Tools that use lists. +- Issue with native Tool calling and streaming with `GooglePromptDriver`. +- Description not being used properly in `StructureRunTool`. ## [0.29.2] - 2024-08-16 diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 57ebbd338..bbba4e0f9 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -225,6 +225,8 @@ def __to_google_message_content(self, content: BaseMessageContent) -> ContentDic raise ValueError(f"Unsupported prompt stack content type: {type(content)}") def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent: + json_format = import_optional_dependency("google.protobuf.json_format") + if content.text: return TextMessageContent(TextArtifact(content.text)) elif content.function_call: @@ -232,7 +234,7 @@ def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent name, path = ToolAction.from_native_tool_name(function_call.name) - args = dict(function_call.args.items()) + args = json_format.MessageToDict(function_call._pb).get("args", {}) return ActionCallMessageContent( artifact=ActionArtifact(value=ToolAction(tag=function_call.name, name=name, path=path, input=args)), ) @@ -240,6 +242,8 @@ def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent raise ValueError(f"Unsupported message content type {content}") def __to_prompt_stack_delta_message_content(self, content: Part) -> BaseDeltaMessageContent: + json_format = import_optional_dependency("google.protobuf.json_format") + if content.text: return TextDeltaMessageContent(content.text) elif content.function_call: @@ -247,7 +251,7 @@ def __to_prompt_stack_delta_message_content(self, content: Part) -> BaseDeltaMes name, path = ToolAction.from_native_tool_name(function_call.name) - args = dict(function_call.args.items()) + args = json_format.MessageToDict(function_call._pb).get("args", {}) return ActionCallDeltaMessageContent( tag=function_call.name, name=name, diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index a3e17a8c4..ece6a0e92 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -41,7 +41,7 @@ def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: Literal( "paths", description="Relative paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", - ): list[str], + ): Schema([str]), }, ), }, diff --git a/griptape/tools/image_query/tool.py b/griptape/tools/image_query/tool.py index 97772d546..9d1dbb89b 100644 --- a/griptape/tools/image_query/tool.py +++ b/griptape/tools/image_query/tool.py @@ -30,7 +30,7 @@ class ImageQueryTool(BaseTool): "query", description="A detailed question to be answered using the contents of the provided images.", ): str, - Literal("image_paths", description="The paths to an image files on disk."): list[str], + Literal("image_paths", description="The paths to an image files on disk."): Schema([str]), }, ), }, diff --git a/griptape/tools/rest_api/tool.py b/griptape/tools/rest_api/tool.py index 24ab4c93e..f5e233e57 100644 --- a/griptape/tools/rest_api/tool.py +++ b/griptape/tools/rest_api/tool.py @@ -83,7 +83,7 @@ def put(self, params: dict) -> BaseArtifact: ), "schema": Schema( { - Literal("path_params", description="The request path parameters."): list[str], + Literal("path_params", description="The request path parameters."): Schema([str]), Literal("body", description="The request body."): dict, }, ), @@ -148,7 +148,9 @@ def post(self, params: dict) -> BaseArtifact: Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, - schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], + schema.Optional(Literal("path_params", description="The request path parameters.")): Schema( + [str] + ), }, ), ), @@ -187,7 +189,7 @@ def get(self, params: dict) -> BaseArtifact: "schema": Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, - schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], + schema.Optional(Literal("path_params", description="The request path parameters.")): Schema([str]), }, ), }, diff --git a/griptape/tools/structure_run/tool.py b/griptape/tools/structure_run/tool.py index cda4f0b35..317d5482e 100644 --- a/griptape/tools/structure_run/tool.py +++ b/griptape/tools/structure_run/tool.py @@ -27,9 +27,13 @@ class StructureRunTool(BaseTool): @activity( config={ - "description": "Can be used to run a Griptape Structure with the following description: {{ self.description }}", + "description": "Can be used to run a Griptape Structure with the following description: {{ _self.description }}", "schema": Schema( - {Literal("args", description="A list of string arguments to submit to the Structure Run"): list[str]}, + { + Literal("args", description="A list of string arguments to submit to the Structure Run"): Schema( + [str] + ) + }, ), }, ) diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index 0dc797a74..ce3db921f 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -1,4 +1,4 @@ -from unittest.mock import Mock +from unittest.mock import MagicMock, Mock import pytest from google.generativeai.protos import FunctionCall, FunctionResponse, Part @@ -46,11 +46,19 @@ class TestGooglePromptDriver: @pytest.fixture() def mock_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") - mock_function_call = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) + mocker.patch("google.protobuf.json_format.MessageToDict").return_value = { + "args": {"foo": "bar"}, + } + mock_function_call = MagicMock( + type="tool_use", name="bar", id="MockTool_test", _pb=MagicMock(args={"foo": "bar"}) + ) mock_function_call.name = "MockTool_test" mock_generative_model.return_value.generate_content.return_value = Mock( - parts=[Mock(text="model-output", function_call=None), Mock(text=None, function_call=mock_function_call)], - usage_metadata=Mock(prompt_token_count=5, candidates_token_count=10), + parts=[ + Mock(text="model-output", function_call=None), + MagicMock(name="foo", text=None, function_call=mock_function_call), + ], + usage_metadata=MagicMock(prompt_token_count=5, candidates_token_count=10), ) return mock_generative_model @@ -58,21 +66,26 @@ def mock_generative_model(self, mocker): @pytest.fixture() def mock_stream_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") - mock_function_call_delta = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) + mocker.patch("google.protobuf.json_format.MessageToDict").return_value = { + "args": {"foo": "bar"}, + } + mock_function_call_delta = MagicMock( + type="tool_use", name="func call", id="MockTool_test", _pb=MagicMock(args={"foo": "bar"}) + ) mock_function_call_delta.name = "MockTool_test" mock_generative_model.return_value.generate_content.return_value = iter( [ - Mock( - parts=[Mock(text="model-output")], - usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + MagicMock( + parts=[MagicMock(text="model-output")], + usage_metadata=MagicMock(prompt_token_count=5, candidates_token_count=5), ), - Mock( - parts=[Mock(text=None, function_call=mock_function_call_delta)], - usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + MagicMock( + parts=[MagicMock(text=None, function_call=mock_function_call_delta)], + usage_metadata=MagicMock(prompt_token_count=5, candidates_token_count=5), ), - Mock( - parts=[Mock(text="model-output")], - usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + MagicMock( + parts=[MagicMock(text="model-output", id="3")], + usage_metadata=MagicMock(prompt_token_count=5, candidates_token_count=5), ), ] ) From aeb97f5067c057d7ddd4dade947945fb956f1e2a Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 14:56:47 -0700 Subject: [PATCH 230/238] Fix type hint for lazy property (#1079) --- griptape/config/base_config.py | 10 ++---- griptape/config/config.py | 18 +++-------- griptape/utils/decorators.py | 4 +-- .../unit/config/drivers/test_driver_config.py | 31 +++++++++++++++++++ tests/unit/config/test_config.py | 26 ---------------- tests/unit/conftest.py | 4 --- 6 files changed, 40 insertions(+), 53 deletions(-) delete mode 100644 tests/unit/config/test_config.py diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index e9f0bc687..12d951765 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define, field @@ -14,9 +14,5 @@ @define(kw_only=True) class BaseConfig(SerializableMixin, ABC): - _logging_config: Optional[LoggingConfig] = field(alias="logging") - _driver_config: Optional[BaseDriverConfig] = field(alias="drivers") - - def reset(self) -> None: - self._logging_config = None - self._driver_config = None + logging_config: LoggingConfig = field() + driver_config: BaseDriverConfig = field() diff --git a/griptape/config/config.py b/griptape/config/config.py index 5f5dbb5db..86bbfc8b7 100644 --- a/griptape/config/config.py +++ b/griptape/config/config.py @@ -1,10 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING -from attrs import define, field - -from griptape.utils.decorators import lazy_property +from attrs import Factory, define, field from .base_config import BaseConfig from .drivers.openai_driver_config import OpenAiDriverConfig @@ -16,16 +14,8 @@ @define(kw_only=True) class _Config(BaseConfig): - _logging_config: Optional[LoggingConfig] = field(default=None, alias="logging") - _driver_config: Optional[BaseDriverConfig] = field(default=None, alias="drivers") - - @lazy_property() - def driver_config(self) -> BaseDriverConfig: - return OpenAiDriverConfig() - - @lazy_property() - def logging_config(self) -> LoggingConfig: - return LoggingConfig() + logging_config: LoggingConfig = field(default=Factory(lambda: LoggingConfig())) + driver_config: BaseDriverConfig = field(default=Factory(lambda: OpenAiDriverConfig())) config = _Config() diff --git a/griptape/utils/decorators.py b/griptape/utils/decorators.py index de7e4d1cb..2ea296693 100644 --- a/griptape/utils/decorators.py +++ b/griptape/utils/decorators.py @@ -31,8 +31,8 @@ def wrapper(self: Any, *args, **kwargs) -> Any: return decorator -def lazy_property(attr_name: Optional[str] = None) -> Any: - def decorator(func: Callable) -> Any: +def lazy_property(attr_name: Optional[str] = None) -> Callable[[Callable[[Any], Any]], property]: + def decorator(func: Callable[[Any], Any]) -> property: actual_attr_name = f"_{func.__name__}" if attr_name is None else attr_name @property diff --git a/tests/unit/config/drivers/test_driver_config.py b/tests/unit/config/drivers/test_driver_config.py index 4c11a24cd..beb42a018 100644 --- a/tests/unit/config/drivers/test_driver_config.py +++ b/tests/unit/config/drivers/test_driver_config.py @@ -37,3 +37,34 @@ def test_dot_update(self, config): config.prompt_driver.max_tokens = 10 assert config.prompt_driver.max_tokens == 10 + + @pytest.mark.skip_mock_config() + def test_lazy_init(self): + from griptape.config import config + + assert config.driver_config._prompt_driver is None + assert config.driver_config._image_generation_driver is None + assert config.driver_config._image_query_driver is None + assert config.driver_config._embedding_driver is None + assert config.driver_config._vector_store_driver is None + assert config.driver_config._conversation_memory_driver is None + assert config.driver_config._text_to_speech_driver is None + assert config.driver_config._audio_transcription_driver is None + + assert config.driver_config.prompt_driver is not None + assert config.driver_config.image_generation_driver is not None + assert config.driver_config.image_query_driver is not None + assert config.driver_config.embedding_driver is not None + assert config.driver_config.vector_store_driver is not None + assert config.driver_config.conversation_memory_driver is None + assert config.driver_config.text_to_speech_driver is not None + assert config.driver_config.audio_transcription_driver is not None + + assert config.driver_config._prompt_driver is not None + assert config.driver_config._image_generation_driver is not None + assert config.driver_config._image_query_driver is not None + assert config.driver_config._embedding_driver is not None + assert config.driver_config._vector_store_driver is not None + assert config.driver_config._conversation_memory_driver is None + assert config.driver_config._text_to_speech_driver is not None + assert config.driver_config._audio_transcription_driver is not None diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py deleted file mode 100644 index 4ed75d325..000000000 --- a/tests/unit/config/test_config.py +++ /dev/null @@ -1,26 +0,0 @@ -import pytest - -from griptape.config.drivers import OpenAiDriverConfig - - -class TestConfig: - @pytest.mark.skip_mock_config() - def test_init(self): - from griptape.config import config - from griptape.config.logging import LoggingConfig - - assert isinstance(config.driver_config, OpenAiDriverConfig) - assert isinstance(config.logging_config, LoggingConfig) - - @pytest.mark.skip_mock_config() - def test_lazy_init(self): - from griptape.config import config - - assert config._driver_config is None - assert config._logging_config is None - - assert config.driver_config is not None - assert config.logging_config is not None - - assert config._driver_config is not None - assert config._logging_config is not None diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index e2eaabe1f..8c954c1c8 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -18,8 +18,6 @@ def mock_event_bus(): def mock_config(request): from griptape.config import config - config.reset() - # Some tests we don't want to use the autouse fixture's MockDriverConfig if "skip_mock_config" in request.keywords: yield @@ -29,5 +27,3 @@ def mock_config(request): config.driver_config = MockDriverConfig() yield config - - config.reset() From 49495dd14463f018d9842b8891f0cc23491b151c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 15:10:26 -0700 Subject: [PATCH 231/238] Fix integration tests (#1080) --- docs/griptape-framework/misc/src/events_4.py | 25 ++++++++++++------- .../structures/src/config_8.py | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py index 6dc2d3a6c..27bb3c5a8 100644 --- a/docs/griptape-framework/misc/src/events_4.py +++ b/docs/griptape-framework/misc/src/events_4.py @@ -1,15 +1,22 @@ -from griptape.structures import Pipeline -from griptape.tasks import ToolkitTask +import logging + +from griptape.config import config +from griptape.structures import Agent from griptape.tools import PromptSummaryTool, WebScraperTool from griptape.utils import Stream -pipeline = Pipeline() -pipeline.add_tasks( - ToolkitTask( - "Based on https://griptape.ai, tell me what griptape is.", - tools=[WebScraperTool(off_prompt=True), PromptSummaryTool(off_prompt=False)], - ) +# Hide Griptape's usual output +logging.getLogger(config.logging_config.logger_name).setLevel(logging.ERROR) + +agent = Agent( + input="Based on https://griptape.ai, tell me what griptape is.", + tools=[ + PromptSummaryTool(off_prompt=True), + WebScraperTool(off_prompt=False), + ], + stream=True, ) -for artifact in Stream(pipeline).run(): + +for artifact in Stream(agent).run(): print(artifact.value, end="", flush=True) diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py index 909a2d5d9..999911b25 100644 --- a/docs/griptape-framework/structures/src/config_8.py +++ b/docs/griptape-framework/structures/src/config_8.py @@ -5,7 +5,7 @@ custom_config = AmazonBedrockDriverConfig() dict_config = custom_config.to_dict() # Use OpenAi for embeddings -dict_config["embedding"] = { +dict_config["embedding_driver"] = { "base_url": None, "model": "text-embedding-3-small", "organization": None, From ade80a500df7c90a8efa0ec89879fa62521eb2d9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 15:29:14 -0700 Subject: [PATCH 232/238] Filter out cohere's pydantic warning (#1081) --- griptape/drivers/prompt/cohere_prompt_driver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index ff1a8b482..05be5b7f2 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,5 +1,6 @@ from __future__ import annotations +import warnings from typing import TYPE_CHECKING, Any from attrs import Factory, define, field @@ -24,6 +25,9 @@ from griptape.tokenizers import BaseTokenizer, CohereTokenizer from griptape.utils import import_optional_dependency +# TODO Remove once https://github.com/cohere-ai/cohere-python/issues/559 is resolved +warnings.filterwarnings("ignore", module="pydantic") + if TYPE_CHECKING: from collections.abc import Iterator From ad4e7805865a075093d11bc16738d7c83d422dcd Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 19 Aug 2024 17:48:00 -0500 Subject: [PATCH 233/238] Random thread name for `GriptapeCloudConversationMemoryDriver` (#1082) Co-authored-by: Collin Dutter --- .../conversation/griptape_cloud_conversation_memory_driver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py b/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py index fe5fb6a3e..2ea1d0d1a 100644 --- a/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/griptape_cloud_conversation_memory_driver.py @@ -1,6 +1,7 @@ from __future__ import annotations import os +import uuid from typing import TYPE_CHECKING, Optional from urllib.parse import urljoin @@ -114,7 +115,7 @@ def load(self) -> BaseConversationMemory: return ConversationMemory(runs=runs, autoload=False, driver=self) def _get_thread_id(self) -> str: - res = requests.post(self._get_url("/threads"), json={"name": "test"}, headers=self.headers) + res = requests.post(self._get_url("/threads"), json={"name": uuid.uuid4().hex}, headers=self.headers) res.raise_for_status() return res.json().get("thread_id") From bd0792228da1398138e1526c32d178df7da4e778 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 16:15:14 -0700 Subject: [PATCH 234/238] Check if future exists first (#1083) --- griptape/mixins/futures_executor_mixin.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/griptape/mixins/futures_executor_mixin.py b/griptape/mixins/futures_executor_mixin.py index 84a3b6f25..8fa3ed168 100644 --- a/griptape/mixins/futures_executor_mixin.py +++ b/griptape/mixins/futures_executor_mixin.py @@ -18,9 +18,10 @@ class FuturesExecutorMixin(ABC): ) def __del__(self) -> None: - executor = self.futures_executor + if hasattr(self, "futures_executor"): + executor = self.futures_executor - if executor is not None: - self.futures_executor = None + if executor is not None: + self.futures_executor = None - executor.shutdown(wait=True) + executor.shutdown(wait=True) From 15fdd08d2a1f74067070b2b1d80d7af735e5ebbe Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 19 Aug 2024 16:51:34 -0700 Subject: [PATCH 235/238] Create engine in factory (#1085) --- griptape/tools/prompt_summary/tool.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/griptape/tools/prompt_summary/tool.py b/griptape/tools/prompt_summary/tool.py index 88ec9d855..517507380 100644 --- a/griptape/tools/prompt_summary/tool.py +++ b/griptape/tools/prompt_summary/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attrs import define, field +from attrs import Factory, define, field from schema import Literal, Or, Schema from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact @@ -18,7 +18,7 @@ class PromptSummaryTool(BaseTool, RuleMixin): prompt_summary_engine: `PromptSummaryEngine`. """ - prompt_summary_engine: PromptSummaryEngine = field(kw_only=True, default=PromptSummaryEngine()) + prompt_summary_engine: PromptSummaryEngine = field(kw_only=True, default=Factory(lambda: PromptSummaryEngine())) @activity( config={ From 1d84b7ffbf22f749e40b0aa536ca4c7f0dd0143e Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 20 Aug 2024 11:23:33 -0700 Subject: [PATCH 236/238] Refactor/drivers config (#1086) --- CHANGELOG.md | 18 ++-- .../src/multiple_agent_shared_memory_1.py | 6 +- docs/examples/src/talk_to_a_video_1.py | 6 +- .../drivers/src/embedding_drivers_10.py | 8 +- .../drivers/src/event_listener_drivers_1.py | 4 +- .../drivers/src/event_listener_drivers_3.py | 4 +- .../drivers/src/event_listener_drivers_4.py | 10 +-- .../drivers/src/event_listener_drivers_5.py | 4 +- .../drivers/src/event_listener_drivers_6.py | 4 +- .../drivers/src/event_listener_drivers_7.py | 4 +- docs/griptape-framework/misc/events.md | 2 +- docs/griptape-framework/misc/src/events_1.py | 4 +- docs/griptape-framework/misc/src/events_2.py | 4 +- docs/griptape-framework/misc/src/events_3.py | 4 +- docs/griptape-framework/misc/src/events_4.py | 4 +- docs/griptape-framework/misc/src/events_5.py | 4 +- docs/griptape-framework/misc/src/events_6.py | 4 +- docs/griptape-framework/structures/config.md | 89 ------------------- docs/griptape-framework/structures/configs.md | 89 +++++++++++++++++++ .../structures/src/config_1.py | 7 -- .../structures/src/config_4.py | 7 -- .../structures/src/config_5.py | 7 -- .../structures/src/config_6.py | 9 -- .../structures/src/config_logging.py | 14 --- .../structures/src/drivers_config_1.py | 7 ++ .../src/{config_2.py => drivers_config_2.py} | 6 +- .../src/{config_3.py => drivers_config_3.py} | 6 +- .../structures/src/drivers_config_4.py | 7 ++ .../structures/src/drivers_config_5.py | 7 ++ .../structures/src/drivers_config_6.py | 9 ++ .../src/{config_7.py => drivers_config_7.py} | 6 +- .../src/{config_8.py => drivers_config_8.py} | 10 +-- .../structures/src/logging_config.py | 14 +++ .../structures/src/task_memory_6.py | 8 +- .../official-tools/src/rest_api_tool_1.py | 6 +- griptape/config/base_config.py | 18 ---- griptape/config/config.py | 21 ----- griptape/config/drivers/__init__.py | 20 ----- griptape/{config => configs}/__init__.py | 4 +- griptape/configs/base_config.py | 11 +++ griptape/configs/defaults_config.py | 23 +++++ griptape/configs/drivers/__init__.py | 20 +++++ .../drivers/amazon_bedrock_drivers_config.py} | 4 +- .../drivers/anthropic_drivers_config.py} | 4 +- .../drivers/azure_openai_drivers_config.py} | 6 +- .../drivers/base_drivers_config.py} | 2 +- .../drivers/cohere_drivers_config.py} | 4 +- .../drivers/drivers_config.py} | 4 +- .../drivers/google_drivers_config.py} | 4 +- .../drivers/openai_drivers_config.py} | 4 +- .../{config => configs}/logging/__init__.py | 0 .../logging/logging_config.py | 0 .../logging/newline_logging_filter.py | 0 .../logging/truncate_logging_filter.py | 0 .../base_audio_transcription_driver.py | 6 +- .../base_image_generation_driver.py | 6 +- .../image_query/base_image_query_driver.py | 6 +- griptape/drivers/prompt/base_prompt_driver.py | 12 +-- .../base_text_to_speech_driver.py | 6 +- .../audio/audio_transcription_engine.py | 4 +- .../engines/audio/text_to_speech_engine.py | 4 +- .../extraction/base_extraction_engine.py | 6 +- .../image/base_image_generation_engine.py | 4 +- .../engines/image_query/image_query_engine.py | 4 +- .../response/prompt_response_rag_module.py | 4 +- .../vector_store_retrieval_rag_module.py | 4 +- griptape/engines/rag/rag_context.py | 2 +- .../engines/summary/prompt_summary_engine.py | 6 +- griptape/events/__init__.py | 4 +- griptape/events/event_bus.py | 6 +- griptape/exceptions/dummy_exception.py | 2 +- .../structure/base_conversation_memory.py | 6 +- .../structure/summary_conversation_memory.py | 6 +- .../task/storage/text_artifact_storage.py | 4 +- griptape/mixins/__init__.py | 2 + griptape/mixins/singleton_mixin.py | 10 +++ griptape/structures/agent.py | 8 +- griptape/structures/structure.py | 6 +- griptape/tasks/actions_subtask.py | 10 +-- griptape/tasks/base_audio_generation_task.py | 4 +- griptape/tasks/base_audio_input_task.py | 4 +- griptape/tasks/base_image_generation_task.py | 4 +- griptape/tasks/base_multi_text_input_task.py | 4 +- griptape/tasks/base_task.py | 10 +-- griptape/tasks/base_text_input_task.py | 4 +- griptape/tasks/prompt_task.py | 8 +- griptape/tools/query/tool.py | 4 +- griptape/utils/chat.py | 10 +-- griptape/utils/stream.py | 6 +- mkdocs.yml | 2 +- ...river_config.py => mock_drivers_config.py} | 4 +- .../unit/config/drivers/test_driver_config.py | 70 --------------- tests/unit/{config => configs}/__init__.py | 0 .../{config => configs}/drivers/__init__.py | 0 .../test_amazon_bedrock_drivers_config.py} | 16 ++-- .../drivers/test_anthropic_drivers_config.py} | 10 +-- .../test_azure_openai_drivers_config.py} | 8 +- .../drivers/test_cohere_drivers_config.py} | 8 +- .../configs/drivers/test_drivers_config.py | 70 +++++++++++++++ .../drivers/test_google_drivers_config.py} | 10 +-- .../drivers/test_openai_driver_config.py | 10 +-- .../{config => configs}/logging/__init__.py | 0 .../logging/test_newline_logging_filter.py | 6 +- .../logging/test_truncate_logging_filter.py | 6 +- tests/unit/configs/test_defaults_config.py | 14 +++ tests/unit/conftest.py | 18 ++-- .../test_base_audio_transcription_driver.py | 4 +- .../test_base_image_generation_driver.py | 10 +-- .../test_base_image_query_driver.py | 4 +- .../drivers/prompt/test_base_prompt_driver.py | 6 +- .../test_local_structure_run_driver.py | 2 +- .../test_base_audio_transcription_driver.py | 4 +- tests/unit/events/test_event_bus.py | 35 ++++---- tests/unit/events/test_event_listener.py | 32 +++---- .../structure/test_conversation_memory.py | 6 +- tests/unit/structures/test_agent.py | 2 +- tests/unit/tasks/test_base_task.py | 8 +- tests/unit/tasks/test_structure_run_task.py | 4 +- tests/unit/tasks/test_tool_task.py | 2 +- tests/unit/tasks/test_toolkit_task.py | 6 +- tests/unit/utils/test_chat.py | 4 +- tests/utils/structure_tester.py | 4 +- 122 files changed, 585 insertions(+), 547 deletions(-) delete mode 100644 docs/griptape-framework/structures/config.md create mode 100644 docs/griptape-framework/structures/configs.md delete mode 100644 docs/griptape-framework/structures/src/config_1.py delete mode 100644 docs/griptape-framework/structures/src/config_4.py delete mode 100644 docs/griptape-framework/structures/src/config_5.py delete mode 100644 docs/griptape-framework/structures/src/config_6.py delete mode 100644 docs/griptape-framework/structures/src/config_logging.py create mode 100644 docs/griptape-framework/structures/src/drivers_config_1.py rename docs/griptape-framework/structures/src/{config_2.py => drivers_config_2.py} (53%) rename docs/griptape-framework/structures/src/{config_3.py => drivers_config_3.py} (65%) create mode 100644 docs/griptape-framework/structures/src/drivers_config_4.py create mode 100644 docs/griptape-framework/structures/src/drivers_config_5.py create mode 100644 docs/griptape-framework/structures/src/drivers_config_6.py rename docs/griptape-framework/structures/src/{config_7.py => drivers_config_7.py} (66%) rename docs/griptape-framework/structures/src/{config_8.py => drivers_config_8.py} (52%) create mode 100644 docs/griptape-framework/structures/src/logging_config.py delete mode 100644 griptape/config/base_config.py delete mode 100644 griptape/config/config.py delete mode 100644 griptape/config/drivers/__init__.py rename griptape/{config => configs}/__init__.py (56%) create mode 100644 griptape/configs/base_config.py create mode 100644 griptape/configs/defaults_config.py create mode 100644 griptape/configs/drivers/__init__.py rename griptape/{config/drivers/amazon_bedrock_driver_config.py => configs/drivers/amazon_bedrock_drivers_config.py} (95%) rename griptape/{config/drivers/anthropic_driver_config.py => configs/drivers/anthropic_drivers_config.py} (90%) rename griptape/{config/drivers/azure_openai_driver_config.py => configs/drivers/azure_openai_drivers_config.py} (96%) rename griptape/{config/drivers/base_driver_config.py => configs/drivers/base_drivers_config.py} (98%) rename griptape/{config/drivers/cohere_driver_config.py => configs/drivers/cohere_drivers_config.py} (91%) rename griptape/{config/drivers/driver_config.py => configs/drivers/drivers_config.py} (94%) rename griptape/{config/drivers/google_driver_config.py => configs/drivers/google_drivers_config.py} (87%) rename griptape/{config/drivers/openai_driver_config.py => configs/drivers/openai_drivers_config.py} (93%) rename griptape/{config => configs}/logging/__init__.py (100%) rename griptape/{config => configs}/logging/logging_config.py (100%) rename griptape/{config => configs}/logging/newline_logging_filter.py (100%) rename griptape/{config => configs}/logging/truncate_logging_filter.py (100%) create mode 100644 griptape/mixins/singleton_mixin.py rename tests/mocks/{mock_driver_config.py => mock_drivers_config.py} (92%) delete mode 100644 tests/unit/config/drivers/test_driver_config.py rename tests/unit/{config => configs}/__init__.py (100%) rename tests/unit/{config => configs}/drivers/__init__.py (100%) rename tests/unit/{config/drivers/test_amazon_bedrock_driver_config.py => configs/drivers/test_amazon_bedrock_drivers_config.py} (89%) rename tests/unit/{config/drivers/test_anthropic_driver_config.py => configs/drivers/test_anthropic_drivers_config.py} (85%) rename tests/unit/{config/drivers/test_azure_openai_driver_config.py => configs/drivers/test_azure_openai_drivers_config.py} (94%) rename tests/unit/{config/drivers/test_cohere_driver_config.py => configs/drivers/test_cohere_drivers_config.py} (87%) create mode 100644 tests/unit/configs/drivers/test_drivers_config.py rename tests/unit/{config/drivers/test_google_driver_config.py => configs/drivers/test_google_drivers_config.py} (86%) rename tests/unit/{config => configs}/drivers/test_openai_driver_config.py (91%) rename tests/unit/{config => configs}/logging/__init__.py (100%) rename tests/unit/{config => configs}/logging/test_newline_logging_filter.py (74%) rename tests/unit/{config => configs}/logging/test_truncate_logging_filter.py (75%) create mode 100644 tests/unit/configs/test_defaults_config.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a45f76053..21f72fe50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parameter `structure` to `BaseTask`. - Method `try_find_task` to `Structure`. - `TranslateQueryRagModule` `RagEngine` module for translating input queries. -- Global event bus, `griptape.events.event_bus`, for publishing and subscribing to events. -- Global config, `griptape.config.config`, for setting global configuration defaults. +- Global event bus, `griptape.events.EventBus`, for publishing and subscribing to events. +- Global object, `griptape.configs.Defaults`, for setting default values throughout the framework. - Unique name generation for all `RagEngine` modules. - `ExtractionTool` for having the LLM extract structured data from text. - `PromptSummaryTool` for having the LLM summarize text. @@ -27,14 +27,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `griptape.utils.decorators.lazy_property` for creating lazy properties. ### Changed -- **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `event_bus`. +- **BREAKING**: Removed all uses of `EventPublisherMixin` in favor of `EventBus`. - **BREAKING**: Removed `EventPublisherMixin`. -- **BREAKING**: Removed `Pipeline.prompt_driver` and `Workflow.prompt_driver`. `Agent.prompt_driver` has not been removed. -- **BREAKING**: Removed `Pipeline.stream` and `Workflow.stream`. `Agent.stream` has not been removed. -- **BREAKING**: Removed `Structure.embedding_driver`, set this via `griptape.config.config.drivers.embedding` instead. -- **BREAKING**: Removed `Structure.custom_logger` and `Structure.logger_level`, set these via `griptape.config.config.logger` instead. +- **BREAKING**: Removed `Pipeline.prompt_driver` and `Workflow.prompt_driver`. Set this via `griptape.configs.Defaults.drivers.prompt_driver` instead. `Agent.prompt_driver` has not been removed. +- **BREAKING**: Removed `Pipeline.stream` and `Workflow.stream`. Set this via `griptape.configs.Defaults.drivers.prompt_driver.stream` instead. `Agent.stream` has not been removed. +- **BREAKING**: Removed `Structure.embedding_driver`, set this via `griptape.configs.Defaults.drivers.embedding_driver` instead. +- **BREAKING**: Removed `Structure.custom_logger` and `Structure.logger_level`, set these via `logging.getLogger(griptape.configs.Defaults.logger_name)` instead. - **BREAKING**: Removed `BaseStructureConfig.merge_config`. -- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, moved to `griptape.config.drivers` and renamed fields accordingly. +- **BREAKING**: Renamed `StructureConfig` to `DriversConfig`, moved to `griptape.configs.drivers` and renamed fields accordingly. - **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly. - **BREAKING**: Removed before and after response modules from `ResponseRagStage`. - **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`. @@ -53,7 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `JsonExtractionTask`, and `CsvExtractionTask` use `ExtractionTask` instead. - **BREAKING**: Removed `TaskMemoryClient`, use `QueryClient`, `ExtractionTool`, or `PromptSummaryTool` instead. - **BREAKING**: `BaseTask.add_parent/child` now take a `BaseTask` instead of `str | BaseTask`. -- Engines that previously required Drivers now pull from `griptape.config.config.drivers` by default. +- Engines that previously required Drivers now pull from `griptape.configs.Defaults.drivers_config` by default. - `BaseTask.add_parent/child` will now call `self.structure.add_task` if possible. - `BaseTask.add_parent/child` now returns `self`, allowing for chaining. - `Chat` now sets the `griptape` logger level to `logging.ERROR`, suppressing all logs except for errors. diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py index b6089c190..e09f29ab7 100644 --- a/docs/examples/src/multiple_agent_shared_memory_1.py +++ b/docs/examples/src/multiple_agent_shared_memory_1.py @@ -1,7 +1,7 @@ import os -from griptape.config import config -from griptape.config.drivers import AzureOpenAiDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import AzureOpenAiDriversConfig from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver from griptape.structures import Agent from griptape.tools import QueryTool, WebScraperTool @@ -34,7 +34,7 @@ vector_path=MONGODB_VECTOR_PATH, ) -config.driver_config = AzureOpenAiDriverConfig( +Defaults.drivers_config = AzureOpenAiDriversConfig( azure_endpoint=AZURE_OPENAI_ENDPOINT_1, vector_store_driver=mongo_driver, embedding_driver=embedding_driver, diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py index 2748902a2..d23c906b6 100644 --- a/docs/examples/src/talk_to_a_video_1.py +++ b/docs/examples/src/talk_to_a_video_1.py @@ -3,11 +3,11 @@ import google.generativeai as genai from griptape.artifacts import GenericArtifact, TextArtifact -from griptape.config import config -from griptape.config.drivers import GoogleDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import GoogleDriversConfig from griptape.structures import Agent -config.driver_config = GoogleDriverConfig() +Defaults.drivers_config = GoogleDriversConfig() video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") while video_file.state.name == "PROCESSING": diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py index 2705dcfad..605b6e67a 100644 --- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py +++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py @@ -1,5 +1,5 @@ -from griptape.config import config -from griptape.config.drivers import DriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( OpenAiChatPromptDriver, VoyageAiEmbeddingDriver, @@ -7,12 +7,12 @@ from griptape.structures import Agent from griptape.tools import PromptSummaryTool, WebScraperTool -config.driver_config = DriverConfig( +Defaults.drivers_config = DriversConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), embedding_driver=VoyageAiEmbeddingDriver(), ) -config.driver_config = DriverConfig( +Defaults.drivers_config = DriversConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), embedding_driver=VoyageAiEmbeddingDriver(), ) diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_1.py b/docs/griptape-framework/drivers/src/event_listener_drivers_1.py index 01b02cf76..66b9372c3 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_1.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_1.py @@ -1,11 +1,11 @@ import os from griptape.drivers import AmazonSqsEventListenerDriver -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from griptape.rules import Rule from griptape.structures import Agent -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( driver=AmazonSqsEventListenerDriver( diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_3.py b/docs/griptape-framework/drivers/src/event_listener_drivers_3.py index 3a2ba8560..0bb248362 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_3.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_3.py @@ -1,11 +1,11 @@ import os from griptape.drivers import AmazonSqsEventListenerDriver -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from griptape.rules import Rule from griptape.structures import Agent -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( driver=AmazonSqsEventListenerDriver( diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py index ff59be794..6d03d2ce3 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py @@ -1,14 +1,14 @@ import os -from griptape.config import config -from griptape.config.drivers import DriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import DriversConfig from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver -from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.events import EventBus, EventListener, FinishStructureRunEvent from griptape.rules import Rule from griptape.structures import Agent -config.driver_config = DriverConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)) -event_bus.add_event_listeners( +Defaults.drivers_config = DriversConfig(prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo", temperature=0.7)) +EventBus.add_event_listeners( [ EventListener( event_types=[FinishStructureRunEvent], diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_5.py b/docs/griptape-framework/drivers/src/event_listener_drivers_5.py index b72ca19d4..27186e229 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_5.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_5.py @@ -1,8 +1,8 @@ from griptape.drivers import GriptapeCloudEventListenerDriver -from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.events import EventBus, EventListener, FinishStructureRunEvent from griptape.structures import Agent -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( event_types=[FinishStructureRunEvent], diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_6.py b/docs/griptape-framework/drivers/src/event_listener_drivers_6.py index 0c594bf12..c60cc6984 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_6.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_6.py @@ -1,10 +1,10 @@ import os from griptape.drivers import WebhookEventListenerDriver -from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.events import EventBus, EventListener, FinishStructureRunEvent from griptape.structures import Agent -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( event_types=[FinishStructureRunEvent], diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_7.py b/docs/griptape-framework/drivers/src/event_listener_drivers_7.py index 0d4f6abf5..c010cb8f9 100644 --- a/docs/griptape-framework/drivers/src/event_listener_drivers_7.py +++ b/docs/griptape-framework/drivers/src/event_listener_drivers_7.py @@ -1,10 +1,10 @@ import os from griptape.drivers import PusherEventListenerDriver -from griptape.events import EventListener, FinishStructureRunEvent, event_bus +from griptape.events import EventBus, EventListener, FinishStructureRunEvent from griptape.structures import Agent -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( event_types=[FinishStructureRunEvent], diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index a94746f99..3c4181aee 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -5,7 +5,7 @@ search: ## Overview -You can configure the global [event_bus](../../reference/griptape/events/event_bus.md) with [EventListener](../../reference/griptape/events/event_listener.md)s to listen for various framework events. +You can configure the global [EventBus](../../reference/griptape/events/event_bus.md) with [EventListener](../../reference/griptape/events/event_listener.md)s to listen for various framework events. See [Event Listener Drivers](../drivers/event-listener-drivers.md) for examples on forwarding events to external services. ## Specific Event Types diff --git a/docs/griptape-framework/misc/src/events_1.py b/docs/griptape-framework/misc/src/events_1.py index a69d63be0..993567cc6 100644 --- a/docs/griptape-framework/misc/src/events_1.py +++ b/docs/griptape-framework/misc/src/events_1.py @@ -1,5 +1,6 @@ from griptape.events import ( BaseEvent, + EventBus, EventListener, FinishActionsSubtaskEvent, FinishPromptEvent, @@ -7,7 +8,6 @@ StartActionsSubtaskEvent, StartPromptEvent, StartTaskEvent, - event_bus, ) from griptape.structures import Agent @@ -16,7 +16,7 @@ def handler(event: BaseEvent) -> None: print(event.__class__) -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( handler, diff --git a/docs/griptape-framework/misc/src/events_2.py b/docs/griptape-framework/misc/src/events_2.py index be92bfb37..7c3a967fe 100644 --- a/docs/griptape-framework/misc/src/events_2.py +++ b/docs/griptape-framework/misc/src/events_2.py @@ -1,4 +1,4 @@ -from griptape.events import BaseEvent, EventListener, event_bus +from griptape.events import BaseEvent, EventBus, EventListener from griptape.structures import Agent @@ -10,7 +10,7 @@ def handler2(event: BaseEvent) -> None: print("Handler 2", event.__class__) -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener(handler1), EventListener(handler2), diff --git a/docs/griptape-framework/misc/src/events_3.py b/docs/griptape-framework/misc/src/events_3.py index 721cf3511..7adac812f 100644 --- a/docs/griptape-framework/misc/src/events_3.py +++ b/docs/griptape-framework/misc/src/events_3.py @@ -1,12 +1,12 @@ from typing import cast from griptape.drivers import OpenAiChatPromptDriver -from griptape.events import CompletionChunkEvent, EventListener, event_bus +from griptape.events import CompletionChunkEvent, EventBus, EventListener from griptape.structures import Pipeline from griptape.tasks import ToolkitTask from griptape.tools import PromptSummaryTool, WebScraperTool -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( lambda e: print(cast(CompletionChunkEvent, e).token, end="", flush=True), diff --git a/docs/griptape-framework/misc/src/events_4.py b/docs/griptape-framework/misc/src/events_4.py index 27bb3c5a8..eba11b07a 100644 --- a/docs/griptape-framework/misc/src/events_4.py +++ b/docs/griptape-framework/misc/src/events_4.py @@ -1,12 +1,12 @@ import logging -from griptape.config import config +from griptape.configs import Defaults from griptape.structures import Agent from griptape.tools import PromptSummaryTool, WebScraperTool from griptape.utils import Stream # Hide Griptape's usual output -logging.getLogger(config.logging_config.logger_name).setLevel(logging.ERROR) +logging.getLogger(Defaults.logging_config.logger_name).setLevel(logging.ERROR) agent = Agent( input="Based on https://griptape.ai, tell me what griptape is.", diff --git a/docs/griptape-framework/misc/src/events_5.py b/docs/griptape-framework/misc/src/events_5.py index 14b3f531e..65bdcec4d 100644 --- a/docs/griptape-framework/misc/src/events_5.py +++ b/docs/griptape-framework/misc/src/events_5.py @@ -1,5 +1,5 @@ from griptape import utils -from griptape.events import BaseEvent, EventListener, FinishPromptEvent, event_bus +from griptape.events import BaseEvent, EventBus, EventListener, FinishPromptEvent from griptape.structures import Agent token_counter = utils.TokenCounter() @@ -10,7 +10,7 @@ def count_tokens(e: BaseEvent) -> None: token_counter.add_tokens(e.output_token_count) -event_bus.add_event_listeners( +EventBus.add_event_listeners( [ EventListener( count_tokens, diff --git a/docs/griptape-framework/misc/src/events_6.py b/docs/griptape-framework/misc/src/events_6.py index aae9c2078..25934442a 100644 --- a/docs/griptape-framework/misc/src/events_6.py +++ b/docs/griptape-framework/misc/src/events_6.py @@ -1,7 +1,7 @@ -from griptape.events import BaseEvent, EventListener, StartPromptEvent, event_bus +from griptape.events import BaseEvent, EventBus, EventListener, StartPromptEvent from griptape.structures import Agent -event_bus.add_event_listeners([EventListener(handler=lambda e: print(e), event_types=[StartPromptEvent])]) +EventBus.add_event_listeners([EventListener(handler=lambda e: print(e), event_types=[StartPromptEvent])]) def handler(event: BaseEvent) -> None: diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md deleted file mode 100644 index 67721ebb1..000000000 --- a/docs/griptape-framework/structures/config.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -search: - boost: 2 ---- - -## Overview - -Griptape exposes global configuration options to easily customize different parts of the framework. - -### Driver Configs - -The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. - -Griptape provides predefined [DriverConfig](../../reference/griptape/config/drivers/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. - -#### OpenAI - -The [OpenAI Driver config](../../reference/griptape/config/drivers/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. - -```python ---8<-- "docs/griptape-framework/structures/src/config_1.py" -``` - -#### Azure OpenAI - -The [Azure OpenAI Driver config](../../reference/griptape/config/drivers/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs. - -```python ---8<-- "docs/griptape-framework/structures/src/config_2.py" -``` - -#### Amazon Bedrock -The [Amazon Bedrock Driver config](../../reference/griptape/config/drivers/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs. - -```python ---8<-- "docs/griptape-framework/structures/src/config_3.py" -``` - -#### Google -The [Google Driver config](../../reference/griptape/config/drivers/google_driver_config.md) provides default Drivers for Google's Gemini APIs. - -```python ---8<-- "docs/griptape-framework/structures/src/config_4.py" -``` - -#### Anthropic - -The [Anthropic Driver config](../../reference/griptape/config/drivers/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs. - -!!! info - Anthropic does not provide an embeddings API which means you will need to use another service for embeddings. - The `AnthropicDriverConfig` defaults to using `VoyageAiEmbeddingDriver` which integrates with [VoyageAI](https://www.voyageai.com/), the service used in Anthropic's [embeddings documentation](https://docs.anthropic.com/claude/docs/embeddings). - To override the default embedding driver, see: [Override Default Structure Embedding Driver](../drivers/embedding-drivers.md#override-default-structure-embedding-driver). - -```python ---8<-- "docs/griptape-framework/structures/src/config_5.py" -``` - -#### Cohere - -The [Cohere Driver config](../../reference/griptape/config/drivers/cohere_driver_config.md) provides default Drivers for Cohere's APIs. - -```python ---8<-- "docs/griptape-framework/structures/src/config_6.py" -``` - -#### Custom - -You can create your own [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) by overriding relevant Drivers. -The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. -This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. - -```python ---8<-- "docs/griptape-framework/structures/src/config_7.py" -``` - -### Logging Config - -Griptape provides a predefined [LoggingConfig](../../reference/griptape/config/logging/logging_config.md)'s for easily customizing the logging events that the framework emits. In order to customize the logger, the logger can be fetched by using the `config.logging.logger_name`. - -```python ---8<-- "docs/griptape-framework/structures/src/config_logging.py" -``` - -### Loading/Saving Configs - -```python ---8<-- "docs/griptape-framework/structures/src/config_8.py" -``` diff --git a/docs/griptape-framework/structures/configs.md b/docs/griptape-framework/structures/configs.md new file mode 100644 index 000000000..2a9b5c62d --- /dev/null +++ b/docs/griptape-framework/structures/configs.md @@ -0,0 +1,89 @@ +--- +search: + boost: 2 +--- + +## Overview + +Griptape exposes global configuration options to easily customize different parts of the framework. + +### Drivers Configs + +The [DriversConfig](../../reference/griptape/configs/drivers/drivers_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. + +Griptape provides predefined [DriversConfig](../../reference/griptape/configs/drivers/drivers_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers. + +#### OpenAI + +The [OpenAI Driver config](../../reference/griptape/configs/drivers/openai_drivers_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_1.py" +``` + +#### Azure OpenAI + +The [Azure OpenAI Driver config](../../reference/griptape/configs/drivers/azure_openai_drivers_config.md) provides default Drivers for Azure's OpenAI APIs. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_2.py" +``` + +#### Amazon Bedrock +The [Amazon Bedrock Driver config](../../reference/griptape/configs/drivers/amazon_bedrock_drivers_config.md) provides default Drivers for Amazon Bedrock's APIs. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_3.py" +``` + +#### Google +The [Google Driver config](../../reference/griptape/configs/drivers/google_drivers_config.md) provides default Drivers for Google's Gemini APIs. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_4.py" +``` + +#### Anthropic + +The [Anthropic Driver config](../../reference/griptape/configs/drivers/anthropic_drivers_config.md) provides default Drivers for Anthropic's APIs. + +!!! info + Anthropic does not provide an embeddings API which means you will need to use another service for embeddings. + The `AnthropicDriversConfig` defaults to using `VoyageAiEmbeddingDriver` which integrates with [VoyageAI](https://www.voyageai.com/), the service used in Anthropic's [embeddings documentation](https://docs.anthropic.com/claude/docs/embeddings). + To override the default embedding driver, see: [Override Default Structure Embedding Driver](../drivers/embedding-drivers.md#override-default-structure-embedding-driver). + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_5.py" +``` + +#### Cohere + +The [Cohere Driver config](../../reference/griptape/configs/drivers/cohere_drivers_config.md) provides default Drivers for Cohere's APIs. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_6.py" +``` + +#### Custom + +You can create your own [DriversConfig](../../reference/griptape/configs/drivers/drivers_config.md) by overriding relevant Drivers. +The [DriversConfig](../../reference/griptape/configs/drivers/drivers_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. +This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_7.py" +``` + +### Logging Config + +Griptape provides a predefined [LoggingConfig](../../reference/griptape/configs/logging/logging_config.md)'s for easily customizing the logging events that the framework emits. In order to customize the logger, the logger can be fetched by using the `Defaults.logging.logger_name`. + +```python +--8<-- "docs/griptape-framework/structures/src/logging_config.py" +``` + +### Loading/Saving Configs + +```python +--8<-- "docs/griptape-framework/structures/src/drivers_config_8.py" +``` diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py deleted file mode 100644 index e038130c2..000000000 --- a/docs/griptape-framework/structures/src/config_1.py +++ /dev/null @@ -1,7 +0,0 @@ -from griptape.config import config -from griptape.config.drivers import OpenAiDriverConfig -from griptape.structures import Agent - -config.driver_config = OpenAiDriverConfig() - -agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py deleted file mode 100644 index e97422388..000000000 --- a/docs/griptape-framework/structures/src/config_4.py +++ /dev/null @@ -1,7 +0,0 @@ -from griptape.config import config -from griptape.config.drivers import GoogleDriverConfig -from griptape.structures import Agent - -config.driver_config = GoogleDriverConfig() - -agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py deleted file mode 100644 index 519b770df..000000000 --- a/docs/griptape-framework/structures/src/config_5.py +++ /dev/null @@ -1,7 +0,0 @@ -from griptape.config import config -from griptape.config.drivers import AnthropicDriverConfig -from griptape.structures import Agent - -config.driver_config = AnthropicDriverConfig() - -agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py deleted file mode 100644 index c53d8c1b0..000000000 --- a/docs/griptape-framework/structures/src/config_6.py +++ /dev/null @@ -1,9 +0,0 @@ -import os - -from griptape.config import config -from griptape.config.drivers import CohereDriverConfig -from griptape.structures import Agent - -config.driver_config = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"]) - -agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_logging.py b/docs/griptape-framework/structures/src/config_logging.py deleted file mode 100644 index 4dceb6edd..000000000 --- a/docs/griptape-framework/structures/src/config_logging.py +++ /dev/null @@ -1,14 +0,0 @@ -import logging - -from griptape.config import config -from griptape.config.drivers import OpenAiDriverConfig -from griptape.config.logging import TruncateLoggingFilter -from griptape.structures import Agent - -config.driver_config = OpenAiDriverConfig() - -logger = logging.getLogger(config.logging_config.logger_name) -logger.setLevel(logging.ERROR) -logger.addFilter(TruncateLoggingFilter(max_log_length=100)) - -agent = Agent() diff --git a/docs/griptape-framework/structures/src/drivers_config_1.py b/docs/griptape-framework/structures/src/drivers_config_1.py new file mode 100644 index 000000000..c156f8594 --- /dev/null +++ b/docs/griptape-framework/structures/src/drivers_config_1.py @@ -0,0 +1,7 @@ +from griptape.configs import Defaults +from griptape.configs.drivers import OpenAiDriversConfig +from griptape.structures import Agent + +Defaults.drivers_config = OpenAiDriversConfig() + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/drivers_config_2.py similarity index 53% rename from docs/griptape-framework/structures/src/config_2.py rename to docs/griptape-framework/structures/src/drivers_config_2.py index a187e8c06..b115a22f4 100644 --- a/docs/griptape-framework/structures/src/config_2.py +++ b/docs/griptape-framework/structures/src/drivers_config_2.py @@ -1,10 +1,10 @@ import os -from griptape.config import config -from griptape.config.drivers import AzureOpenAiDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import AzureOpenAiDriversConfig from griptape.structures import Agent -config.driver_config = AzureOpenAiDriverConfig( +Defaults.drivers_config = AzureOpenAiDriversConfig( azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], api_key=os.environ["AZURE_OPENAI_API_KEY_3"] ) diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/drivers_config_3.py similarity index 65% rename from docs/griptape-framework/structures/src/config_3.py rename to docs/griptape-framework/structures/src/drivers_config_3.py index 4d08912f9..0af0423de 100644 --- a/docs/griptape-framework/structures/src/config_3.py +++ b/docs/griptape-framework/structures/src/drivers_config_3.py @@ -2,11 +2,11 @@ import boto3 -from griptape.config import config -from griptape.config.drivers import AmazonBedrockDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import AmazonBedrockDriversConfig from griptape.structures import Agent -config.driver_config = AmazonBedrockDriverConfig( +Defaults.drivers_config = AmazonBedrockDriversConfig( session=boto3.Session( region_name=os.environ["AWS_DEFAULT_REGION"], aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], diff --git a/docs/griptape-framework/structures/src/drivers_config_4.py b/docs/griptape-framework/structures/src/drivers_config_4.py new file mode 100644 index 000000000..f9cfb6d16 --- /dev/null +++ b/docs/griptape-framework/structures/src/drivers_config_4.py @@ -0,0 +1,7 @@ +from griptape.configs import Defaults +from griptape.configs.drivers import GoogleDriversConfig +from griptape.structures import Agent + +Defaults.drivers_config = GoogleDriversConfig() + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/drivers_config_5.py b/docs/griptape-framework/structures/src/drivers_config_5.py new file mode 100644 index 000000000..fb2aa8eee --- /dev/null +++ b/docs/griptape-framework/structures/src/drivers_config_5.py @@ -0,0 +1,7 @@ +from griptape.configs import Defaults +from griptape.configs.drivers import AnthropicDriversConfig +from griptape.structures import Agent + +Defaults.drivers_config = AnthropicDriversConfig() + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/drivers_config_6.py b/docs/griptape-framework/structures/src/drivers_config_6.py new file mode 100644 index 000000000..eaa8e3d71 --- /dev/null +++ b/docs/griptape-framework/structures/src/drivers_config_6.py @@ -0,0 +1,9 @@ +import os + +from griptape.configs import Defaults +from griptape.configs.drivers import CohereDriversConfig +from griptape.structures import Agent + +Defaults.drivers_config = CohereDriversConfig(api_key=os.environ["COHERE_API_KEY"]) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/drivers_config_7.py similarity index 66% rename from docs/griptape-framework/structures/src/config_7.py rename to docs/griptape-framework/structures/src/drivers_config_7.py index 3f63d428e..3b1d396ce 100644 --- a/docs/griptape-framework/structures/src/config_7.py +++ b/docs/griptape-framework/structures/src/drivers_config_7.py @@ -1,11 +1,11 @@ import os -from griptape.config import config -from griptape.config.drivers import DriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import DriversConfig from griptape.drivers import AnthropicPromptDriver from griptape.structures import Agent -config.driver_config = DriverConfig( +Defaults.drivers_config = DriversConfig( prompt_driver=AnthropicPromptDriver( model="claude-3-sonnet-20240229", api_key=os.environ["ANTHROPIC_API_KEY"], diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/drivers_config_8.py similarity index 52% rename from docs/griptape-framework/structures/src/config_8.py rename to docs/griptape-framework/structures/src/drivers_config_8.py index 999911b25..f34a6d0b1 100644 --- a/docs/griptape-framework/structures/src/config_8.py +++ b/docs/griptape-framework/structures/src/drivers_config_8.py @@ -1,8 +1,8 @@ -from griptape.config import config -from griptape.config.drivers import AmazonBedrockDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import AmazonBedrockDriversConfig from griptape.structures import Agent -custom_config = AmazonBedrockDriverConfig() +custom_config = AmazonBedrockDriversConfig() dict_config = custom_config.to_dict() # Use OpenAi for embeddings dict_config["embedding_driver"] = { @@ -11,8 +11,8 @@ "organization": None, "type": "OpenAiEmbeddingDriver", } -custom_config = AmazonBedrockDriverConfig.from_dict(dict_config) +custom_config = AmazonBedrockDriversConfig.from_dict(dict_config) -config.driver_config = custom_config +Defaults.drivers_config = custom_config agent = Agent() diff --git a/docs/griptape-framework/structures/src/logging_config.py b/docs/griptape-framework/structures/src/logging_config.py new file mode 100644 index 000000000..b220e2478 --- /dev/null +++ b/docs/griptape-framework/structures/src/logging_config.py @@ -0,0 +1,14 @@ +import logging + +from griptape.configs import Defaults +from griptape.configs.drivers import OpenAiDriversConfig +from griptape.configs.logging import TruncateLoggingFilter +from griptape.structures import Agent + +Defaults.drivers_config = OpenAiDriversConfig() + +logger = logging.getLogger(Defaults.logging_config.logger_name) +logger.setLevel(logging.ERROR) +logger.addFilter(TruncateLoggingFilter(max_log_length=100)) + +agent = Agent() diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 1ee4538d7..371b3c821 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -1,6 +1,6 @@ from griptape.artifacts import TextArtifact -from griptape.config import config -from griptape.config.drivers import OpenAiDriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import OpenAiDriversConfig from griptape.drivers import ( LocalVectorStoreDriver, OpenAiChatPromptDriver, @@ -11,11 +11,11 @@ from griptape.structures import Agent from griptape.tools import FileManagerTool, QueryTool, WebScraperTool -config.driver_config = OpenAiDriverConfig( +Defaults.drivers_config = OpenAiDriversConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), ) -config.driver_config = OpenAiDriverConfig( +Defaults.drivers_config = OpenAiDriversConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), ) diff --git a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py index 1e82b2dd9..3f6b3b663 100644 --- a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py +++ b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py @@ -1,14 +1,14 @@ from json import dumps -from griptape.config import config -from griptape.config.drivers import DriverConfig +from griptape.configs import Defaults +from griptape.configs.drivers import DriversConfig from griptape.drivers import OpenAiChatPromptDriver from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import ToolkitTask from griptape.tools import RestApiTool -config.driver_config = DriverConfig( +Defaults.drivers_config = DriversConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.1), ) diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py deleted file mode 100644 index 12d951765..000000000 --- a/griptape/config/base_config.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from abc import ABC -from typing import TYPE_CHECKING - -from attrs import define, field - -from griptape.mixins.serializable_mixin import SerializableMixin - -if TYPE_CHECKING: - from .drivers.base_driver_config import BaseDriverConfig - from .logging.logging_config import LoggingConfig - - -@define(kw_only=True) -class BaseConfig(SerializableMixin, ABC): - logging_config: LoggingConfig = field() - driver_config: BaseDriverConfig = field() diff --git a/griptape/config/config.py b/griptape/config/config.py deleted file mode 100644 index 86bbfc8b7..000000000 --- a/griptape/config/config.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from attrs import Factory, define, field - -from .base_config import BaseConfig -from .drivers.openai_driver_config import OpenAiDriverConfig -from .logging.logging_config import LoggingConfig - -if TYPE_CHECKING: - from .drivers.base_driver_config import BaseDriverConfig - - -@define(kw_only=True) -class _Config(BaseConfig): - logging_config: LoggingConfig = field(default=Factory(lambda: LoggingConfig())) - driver_config: BaseDriverConfig = field(default=Factory(lambda: OpenAiDriverConfig())) - - -config = _Config() diff --git a/griptape/config/drivers/__init__.py b/griptape/config/drivers/__init__.py deleted file mode 100644 index 9d5f2f510..000000000 --- a/griptape/config/drivers/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from .base_driver_config import BaseDriverConfig -from .driver_config import DriverConfig - -from .openai_driver_config import OpenAiDriverConfig -from .azure_openai_driver_config import AzureOpenAiDriverConfig -from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig -from .anthropic_driver_config import AnthropicDriverConfig -from .google_driver_config import GoogleDriverConfig -from .cohere_driver_config import CohereDriverConfig - -__all__ = [ - "BaseDriverConfig", - "DriverConfig", - "OpenAiDriverConfig", - "AzureOpenAiDriverConfig", - "AmazonBedrockDriverConfig", - "AnthropicDriverConfig", - "GoogleDriverConfig", - "CohereDriverConfig", -] diff --git a/griptape/config/__init__.py b/griptape/configs/__init__.py similarity index 56% rename from griptape/config/__init__.py rename to griptape/configs/__init__.py index 043d152ba..bd12c7836 100644 --- a/griptape/config/__init__.py +++ b/griptape/configs/__init__.py @@ -1,8 +1,8 @@ from .base_config import BaseConfig -from .config import config +from .defaults_config import Defaults __all__ = [ "BaseConfig", - "config", + "Defaults", ] diff --git a/griptape/configs/base_config.py b/griptape/configs/base_config.py new file mode 100644 index 000000000..09d230016 --- /dev/null +++ b/griptape/configs/base_config.py @@ -0,0 +1,11 @@ +from __future__ import annotations + +from abc import ABC + +from attrs import define + +from griptape.mixins.serializable_mixin import SerializableMixin + + +@define(kw_only=True) +class BaseConfig(SerializableMixin, ABC): ... diff --git a/griptape/configs/defaults_config.py b/griptape/configs/defaults_config.py new file mode 100644 index 000000000..b81f50cdc --- /dev/null +++ b/griptape/configs/defaults_config.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from attrs import Factory, define, field + +from griptape.mixins.singleton_mixin import SingletonMixin + +from .base_config import BaseConfig +from .drivers.openai_drivers_config import OpenAiDriversConfig +from .logging.logging_config import LoggingConfig + +if TYPE_CHECKING: + from .drivers.base_drivers_config import BaseDriversConfig + + +@define(kw_only=True) +class _DefaultsConfig(BaseConfig, SingletonMixin): + logging_config: LoggingConfig = field(default=Factory(lambda: LoggingConfig())) + drivers_config: BaseDriversConfig = field(default=Factory(lambda: OpenAiDriversConfig())) + + +Defaults = _DefaultsConfig() diff --git a/griptape/configs/drivers/__init__.py b/griptape/configs/drivers/__init__.py new file mode 100644 index 000000000..d407814e8 --- /dev/null +++ b/griptape/configs/drivers/__init__.py @@ -0,0 +1,20 @@ +from .base_drivers_config import BaseDriversConfig +from .drivers_config import DriversConfig + +from .openai_drivers_config import OpenAiDriversConfig +from .azure_openai_drivers_config import AzureOpenAiDriversConfig +from .amazon_bedrock_drivers_config import AmazonBedrockDriversConfig +from .anthropic_drivers_config import AnthropicDriversConfig +from .google_drivers_config import GoogleDriversConfig +from .cohere_drivers_config import CohereDriversConfig + +__all__ = [ + "BaseDriversConfig", + "DriversConfig", + "OpenAiDriversConfig", + "AzureOpenAiDriversConfig", + "AmazonBedrockDriversConfig", + "AnthropicDriversConfig", + "GoogleDriversConfig", + "CohereDriversConfig", +] diff --git a/griptape/config/drivers/amazon_bedrock_driver_config.py b/griptape/configs/drivers/amazon_bedrock_drivers_config.py similarity index 95% rename from griptape/config/drivers/amazon_bedrock_driver_config.py rename to griptape/configs/drivers/amazon_bedrock_drivers_config.py index 22d198167..7a54ac522 100644 --- a/griptape/config/drivers/amazon_bedrock_driver_config.py +++ b/griptape/configs/drivers/amazon_bedrock_drivers_config.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, AmazonBedrockImageQueryDriver, @@ -22,7 +22,7 @@ @define -class AmazonBedrockDriverConfig(DriverConfig): +class AmazonBedrockDriversConfig(DriversConfig): session: boto3.Session = field( default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True, diff --git a/griptape/config/drivers/anthropic_driver_config.py b/griptape/configs/drivers/anthropic_drivers_config.py similarity index 90% rename from griptape/config/drivers/anthropic_driver_config.py rename to griptape/configs/drivers/anthropic_drivers_config.py index b036d85f4..e5a1f2719 100644 --- a/griptape/config/drivers/anthropic_driver_config.py +++ b/griptape/configs/drivers/anthropic_drivers_config.py @@ -1,6 +1,6 @@ from attrs import define -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( AnthropicImageQueryDriver, AnthropicPromptDriver, @@ -11,7 +11,7 @@ @define -class AnthropicDriverConfig(DriverConfig): +class AnthropicDriversConfig(DriversConfig): @lazy_property() def prompt_driver(self) -> AnthropicPromptDriver: return AnthropicPromptDriver(model="claude-3-5-sonnet-20240620") diff --git a/griptape/config/drivers/azure_openai_driver_config.py b/griptape/configs/drivers/azure_openai_drivers_config.py similarity index 96% rename from griptape/config/drivers/azure_openai_driver_config.py rename to griptape/configs/drivers/azure_openai_drivers_config.py index f27c8970c..a29ba3c2f 100644 --- a/griptape/config/drivers/azure_openai_driver_config.py +++ b/griptape/configs/drivers/azure_openai_drivers_config.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, @@ -16,8 +16,8 @@ @define -class AzureOpenAiDriverConfig(DriverConfig): - """Azure OpenAI Driver Configuration. +class AzureOpenAiDriversConfig(DriversConfig): + """Azure OpenAI Drivers Configuration. Attributes: azure_endpoint: The endpoint for the Azure OpenAI instance. diff --git a/griptape/config/drivers/base_driver_config.py b/griptape/configs/drivers/base_drivers_config.py similarity index 98% rename from griptape/config/drivers/base_driver_config.py rename to griptape/configs/drivers/base_drivers_config.py index d8555052f..ec7503478 100644 --- a/griptape/config/drivers/base_driver_config.py +++ b/griptape/configs/drivers/base_drivers_config.py @@ -22,7 +22,7 @@ @define -class BaseDriverConfig(ABC, SerializableMixin): +class BaseDriversConfig(ABC, SerializableMixin): _prompt_driver: BasePromptDriver = field( kw_only=True, default=None, metadata={"serializable": True}, alias="prompt_driver" ) diff --git a/griptape/config/drivers/cohere_driver_config.py b/griptape/configs/drivers/cohere_drivers_config.py similarity index 91% rename from griptape/config/drivers/cohere_driver_config.py rename to griptape/configs/drivers/cohere_drivers_config.py index 25dc833e5..b5d8da8b0 100644 --- a/griptape/config/drivers/cohere_driver_config.py +++ b/griptape/configs/drivers/cohere_drivers_config.py @@ -1,6 +1,6 @@ from attrs import define, field -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( CohereEmbeddingDriver, CoherePromptDriver, @@ -10,7 +10,7 @@ @define -class CohereDriverConfig(DriverConfig): +class CohereDriversConfig(DriversConfig): api_key: str = field(metadata={"serializable": False}, kw_only=True) @lazy_property() diff --git a/griptape/config/drivers/driver_config.py b/griptape/configs/drivers/drivers_config.py similarity index 94% rename from griptape/config/drivers/driver_config.py rename to griptape/configs/drivers/drivers_config.py index 16cb9a535..ed68bcf8c 100644 --- a/griptape/config/drivers/driver_config.py +++ b/griptape/configs/drivers/drivers_config.py @@ -4,7 +4,7 @@ from attrs import define -from griptape.config.drivers import BaseDriverConfig +from griptape.configs.drivers import BaseDriversConfig from griptape.drivers import ( DummyAudioTranscriptionDriver, DummyEmbeddingDriver, @@ -30,7 +30,7 @@ @define -class DriverConfig(BaseDriverConfig): +class DriversConfig(BaseDriversConfig): @lazy_property() def prompt_driver(self) -> BasePromptDriver: return DummyPromptDriver() diff --git a/griptape/config/drivers/google_driver_config.py b/griptape/configs/drivers/google_drivers_config.py similarity index 87% rename from griptape/config/drivers/google_driver_config.py rename to griptape/configs/drivers/google_drivers_config.py index 0ab72e6bb..8d5325235 100644 --- a/griptape/config/drivers/google_driver_config.py +++ b/griptape/configs/drivers/google_drivers_config.py @@ -1,6 +1,6 @@ from attrs import define -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( GoogleEmbeddingDriver, GooglePromptDriver, @@ -10,7 +10,7 @@ @define -class GoogleDriverConfig(DriverConfig): +class GoogleDriversConfig(DriversConfig): @lazy_property() def prompt_driver(self) -> GooglePromptDriver: return GooglePromptDriver(model="gemini-1.5-pro") diff --git a/griptape/config/drivers/openai_driver_config.py b/griptape/configs/drivers/openai_drivers_config.py similarity index 93% rename from griptape/config/drivers/openai_driver_config.py rename to griptape/configs/drivers/openai_drivers_config.py index 49cf60206..205cfb0e1 100644 --- a/griptape/config/drivers/openai_driver_config.py +++ b/griptape/configs/drivers/openai_drivers_config.py @@ -1,6 +1,6 @@ from attrs import define -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers import ( LocalVectorStoreDriver, OpenAiAudioTranscriptionDriver, @@ -14,7 +14,7 @@ @define -class OpenAiDriverConfig(DriverConfig): +class OpenAiDriversConfig(DriversConfig): @lazy_property() def prompt_driver(self) -> OpenAiChatPromptDriver: return OpenAiChatPromptDriver(model="gpt-4o") diff --git a/griptape/config/logging/__init__.py b/griptape/configs/logging/__init__.py similarity index 100% rename from griptape/config/logging/__init__.py rename to griptape/configs/logging/__init__.py diff --git a/griptape/config/logging/logging_config.py b/griptape/configs/logging/logging_config.py similarity index 100% rename from griptape/config/logging/logging_config.py rename to griptape/configs/logging/logging_config.py diff --git a/griptape/config/logging/newline_logging_filter.py b/griptape/configs/logging/newline_logging_filter.py similarity index 100% rename from griptape/config/logging/newline_logging_filter.py rename to griptape/configs/logging/newline_logging_filter.py diff --git a/griptape/config/logging/truncate_logging_filter.py b/griptape/configs/logging/truncate_logging_filter.py similarity index 100% rename from griptape/config/logging/truncate_logging_filter.py rename to griptape/configs/logging/truncate_logging_filter.py diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py index 91e7f4909..ae46c474c 100644 --- a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -5,7 +5,7 @@ from attrs import define, field -from griptape.events import FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent, event_bus +from griptape.events import EventBus, FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: @@ -17,10 +17,10 @@ class BaseAudioTranscriptionDriver(SerializableMixin, ExponentialBackoffMixin, A model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self) -> None: - event_bus.publish_event(StartAudioTranscriptionEvent()) + EventBus.publish_event(StartAudioTranscriptionEvent()) def after_run(self) -> None: - event_bus.publish_event(FinishAudioTranscriptionEvent()) + EventBus.publish_event(FinishAudioTranscriptionEvent()) def run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index 360fba8c9..8dfca5945 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -5,7 +5,7 @@ from attrs import define, field -from griptape.events import FinishImageGenerationEvent, StartImageGenerationEvent, event_bus +from griptape.events import EventBus, FinishImageGenerationEvent, StartImageGenerationEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: @@ -17,10 +17,10 @@ class BaseImageGenerationDriver(SerializableMixin, ExponentialBackoffMixin, ABC) model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> None: - event_bus.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) + EventBus.publish_event(StartImageGenerationEvent(prompts=prompts, negative_prompts=negative_prompts)) def after_run(self) -> None: - event_bus.publish_event(FinishImageGenerationEvent()) + EventBus.publish_event(FinishImageGenerationEvent()) def run_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index b1050b85c..28c571328 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -5,7 +5,7 @@ from attrs import define, field -from griptape.events import FinishImageQueryEvent, StartImageQueryEvent, event_bus +from griptape.events import EventBus, FinishImageQueryEvent, StartImageQueryEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: @@ -17,12 +17,12 @@ class BaseImageQueryDriver(SerializableMixin, ExponentialBackoffMixin, ABC): max_tokens: int = field(default=256, kw_only=True, metadata={"serializable": True}) def before_run(self, query: str, images: list[ImageArtifact]) -> None: - event_bus.publish_event( + EventBus.publish_event( StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]), ) def after_run(self, result: str) -> None: - event_bus.publish_event(FinishImageQueryEvent(result=result)) + EventBus.publish_event(FinishImageQueryEvent(result=result)) def query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: for attempt in self.retrying(): diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 43b31306c..c07980c9e 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -16,7 +16,7 @@ TextMessageContent, observable, ) -from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent, event_bus +from griptape.events import CompletionChunkEvent, EventBus, FinishPromptEvent, StartPromptEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: @@ -49,10 +49,10 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): use_native_tools: bool = field(default=False, kw_only=True, metadata={"serializable": True}) def before_run(self, prompt_stack: PromptStack) -> None: - event_bus.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) + EventBus.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) def after_run(self, result: Message) -> None: - event_bus.publish_event( + EventBus.publish_event( FinishPromptEvent( model=self.model, result=result.value, @@ -126,12 +126,12 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: else: delta_contents[content.index] = [content] if isinstance(content, TextDeltaMessageContent): - event_bus.publish_event(CompletionChunkEvent(token=content.text)) + EventBus.publish_event(CompletionChunkEvent(token=content.text)) elif isinstance(content, ActionCallDeltaMessageContent): if content.tag is not None and content.name is not None and content.path is not None: - event_bus.publish_event(CompletionChunkEvent(token=str(content))) + EventBus.publish_event(CompletionChunkEvent(token=str(content))) elif content.partial_input is not None: - event_bus.publish_event(CompletionChunkEvent(token=content.partial_input)) + EventBus.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas return self.__build_message(list(delta_contents.values()), usage) diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index c74264dc1..cb11cc498 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -5,7 +5,7 @@ from attrs import define, field -from griptape.events import event_bus +from griptape.events import EventBus from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent from griptape.events.start_text_to_speech_event import StartTextToSpeechEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin @@ -19,10 +19,10 @@ class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) def before_run(self, prompts: list[str]) -> None: - event_bus.publish_event(StartTextToSpeechEvent(prompts=prompts)) + EventBus.publish_event(StartTextToSpeechEvent(prompts=prompts)) def after_run(self) -> None: - event_bus.publish_event(FinishTextToSpeechEvent()) + EventBus.publish_event(FinishTextToSpeechEvent()) def run_text_to_audio(self, prompts: list[str]) -> AudioArtifact: for attempt in self.retrying(): diff --git a/griptape/engines/audio/audio_transcription_engine.py b/griptape/engines/audio/audio_transcription_engine.py index ee5739d81..4084c8829 100644 --- a/griptape/engines/audio/audio_transcription_engine.py +++ b/griptape/engines/audio/audio_transcription_engine.py @@ -1,14 +1,14 @@ from attrs import Factory, define, field from griptape.artifacts import AudioArtifact, TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.drivers import BaseAudioTranscriptionDriver @define class AudioTranscriptionEngine: audio_transcription_driver: BaseAudioTranscriptionDriver = field( - default=Factory(lambda: config.driver_config.audio_transcription_driver), kw_only=True + default=Factory(lambda: Defaults.drivers_config.audio_transcription_driver), kw_only=True ) def run(self, audio: AudioArtifact, *args, **kwargs) -> TextArtifact: diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index 3036d8bf5..1261ae369 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import config +from griptape.configs import Defaults if TYPE_CHECKING: from griptape.artifacts.audio_artifact import AudioArtifact @@ -14,7 +14,7 @@ @define class TextToSpeechEngine: text_to_speech_driver: BaseTextToSpeechDriver = field( - default=Factory(lambda: config.driver_config.text_to_speech_driver), kw_only=True + default=Factory(lambda: Defaults.drivers_config.text_to_speech_driver), kw_only=True ) def run(self, prompts: list[str], *args, **kwargs) -> AudioArtifact: diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index 0a28b65b3..fb1fab6c4 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -6,7 +6,7 @@ from attrs import Attribute, Factory, define, field from griptape.chunkers import BaseChunker, TextChunker -from griptape.config import config +from griptape.configs import Defaults if TYPE_CHECKING: from griptape.artifacts import ErrorArtifact, ListArtifact @@ -18,7 +18,9 @@ class BaseExtractionEngine(ABC): max_token_multiplier: float = field(default=0.5, kw_only=True) chunk_joiner: str = field(default="\n\n", kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: Defaults.drivers_config.prompt_driver), kw_only=True + ) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 9f72f16be..5fdc60531 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field -from griptape.config import config +from griptape.configs import Defaults if TYPE_CHECKING: from griptape.artifacts import ImageArtifact @@ -16,7 +16,7 @@ @define class BaseImageGenerationEngine(ABC): image_generation_driver: BaseImageGenerationDriver = field( - kw_only=True, default=Factory(lambda: config.driver_config.image_generation_driver) + kw_only=True, default=Factory(lambda: Defaults.drivers_config.image_generation_driver) ) @abstractmethod diff --git a/griptape/engines/image_query/image_query_engine.py b/griptape/engines/image_query/image_query_engine.py index 1b8fce277..348017e64 100644 --- a/griptape/engines/image_query/image_query_engine.py +++ b/griptape/engines/image_query/image_query_engine.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.config import config +from griptape.configs import Defaults if TYPE_CHECKING: from griptape.artifacts import ImageArtifact, TextArtifact @@ -14,7 +14,7 @@ @define class ImageQueryEngine: image_query_driver: BaseImageQueryDriver = field( - default=Factory(lambda: config.driver_config.image_query_driver), kw_only=True + default=Factory(lambda: Defaults.drivers_config.image_query_driver), kw_only=True ) def run(self, query: str, images: list[ImageArtifact]) -> TextArtifact: diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index d1bcdd3b8..78dfba8f4 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field from griptape.artifacts.text_artifact import TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.engines.rag.modules import BaseResponseRagModule from griptape.mixins import RuleMixin from griptape.utils import J2 @@ -18,7 +18,7 @@ @define(kw_only=True) class PromptResponseRagModule(BaseResponseRagModule, RuleMixin): - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver)) + prompt_driver: BasePromptDriver = field(default=Factory(lambda: Defaults.drivers_config.prompt_driver)) answer_token_offset: int = field(default=400) metadata: Optional[str] = field(default=None) generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index c04e9025a..ddff2549c 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field from griptape import utils -from griptape.config import config +from griptape.configs import Defaults from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: @@ -19,7 +19,7 @@ @define(kw_only=True) class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda: config.driver_config.vector_store_driver) + default=Factory(lambda: Defaults.drivers_config.vector_store_driver) ) query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index 1ddfbb1b0..3dbfc6834 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -18,7 +18,7 @@ class RagContext(SerializableMixin): Attributes: query: Query provided by the user. - module_configs: Dictionary of module configs. First key should be a module name and the second a dictionary of config parameters. + module_configs: Dictionary of module configs. First key should be a module name and the second a dictionary of configs parameters. before_query: An optional list of strings to add before the query in response modules. after_query: An optional list of strings to add after the query in response modules. text_chunks: A list of text chunks to pass around from the retrieval stage to the response stage. diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 04f30ca82..99e133844 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -7,7 +7,7 @@ from griptape.artifacts import ListArtifact, TextArtifact from griptape.chunkers import BaseChunker, TextChunker from griptape.common import Message, PromptStack -from griptape.config import config +from griptape.configs import Defaults from griptape.engines import BaseSummaryEngine from griptape.utils import J2 @@ -22,7 +22,9 @@ class PromptSummaryEngine(BaseSummaryEngine): max_token_multiplier: float = field(default=0.5, kw_only=True) system_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/system.j2")), kw_only=True) user_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/user.j2")), kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: Defaults.drivers_config.prompt_driver), kw_only=True + ) chunker: BaseChunker = field( default=Factory( lambda self: TextChunker(tokenizer=self.prompt_driver.tokenizer, max_tokens=self.max_chunker_tokens), diff --git a/griptape/events/__init__.py b/griptape/events/__init__.py index 431927663..b3e2f3a79 100644 --- a/griptape/events/__init__.py +++ b/griptape/events/__init__.py @@ -22,7 +22,7 @@ from .base_audio_transcription_event import BaseAudioTranscriptionEvent from .start_audio_transcription_event import StartAudioTranscriptionEvent from .finish_audio_transcription_event import FinishAudioTranscriptionEvent -from .event_bus import event_bus +from .event_bus import EventBus __all__ = [ "BaseEvent", @@ -49,5 +49,5 @@ "BaseAudioTranscriptionEvent", "StartAudioTranscriptionEvent", "FinishAudioTranscriptionEvent", - "event_bus", + "EventBus", ] diff --git a/griptape/events/event_bus.py b/griptape/events/event_bus.py index a956f7deb..3ddc325ff 100644 --- a/griptape/events/event_bus.py +++ b/griptape/events/event_bus.py @@ -4,12 +4,14 @@ from attrs import define, field +from griptape.mixins.singleton_mixin import SingletonMixin + if TYPE_CHECKING: from griptape.events import BaseEvent, EventListener @define -class _EventBus: +class _EventBus(SingletonMixin): _event_listeners: list[EventListener] = field(factory=list, kw_only=True, alias="_event_listeners") @property @@ -41,4 +43,4 @@ def clear_event_listeners(self) -> None: self._event_listeners.clear() -event_bus = _EventBus() +EventBus = _EventBus() diff --git a/griptape/exceptions/dummy_exception.py b/griptape/exceptions/dummy_exception.py index 172aeadc6..0020ce547 100644 --- a/griptape/exceptions/dummy_exception.py +++ b/griptape/exceptions/dummy_exception.py @@ -2,7 +2,7 @@ class DummyError(Exception): def __init__(self, dummy_class_name: str, dummy_method_name: str) -> None: message = ( f"You have attempted to use a {dummy_class_name}'s {dummy_method_name} method. " - "This likely originated from using a `DriverConfig` without providing a Driver required for this feature." + "This likely originated from using a `DriversConfig` without providing a Driver required for this feature." ) super().__init__(message) diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index 86431122a..44c053dc4 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -6,7 +6,7 @@ from attrs import Factory, define, field from griptape.common import PromptStack -from griptape.config import config +from griptape.configs import Defaults from griptape.mixins import SerializableMixin if TYPE_CHECKING: @@ -18,7 +18,7 @@ @define class BaseConversationMemory(SerializableMixin, ABC): driver: Optional[BaseConversationMemoryDriver] = field( - default=Factory(lambda: config.driver_config.conversation_memory_driver), kw_only=True + default=Factory(lambda: Defaults.drivers_config.conversation_memory_driver), kw_only=True ) runs: list[Run] = field(factory=list, kw_only=True, metadata={"serializable": True}) structure: Structure = field(init=False) @@ -67,7 +67,7 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = if self.autoprune and hasattr(self, "structure"): should_prune = True - prompt_driver = config.driver_config.prompt_driver + prompt_driver = Defaults.drivers_config.prompt_driver temp_stack = PromptStack() # Try to determine how many Conversation Memory runs we can diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index 736891d90..055057d34 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -6,7 +6,7 @@ from attrs import Factory, define, field from griptape.common import Message, PromptStack -from griptape.config import config +from griptape.configs import Defaults from griptape.memory.structure import ConversationMemory from griptape.utils import J2 @@ -18,7 +18,9 @@ @define class SummaryConversationMemory(ConversationMemory): offset: int = field(default=1, kw_only=True, metadata={"serializable": True}) - prompt_driver: BasePromptDriver = field(kw_only=True, default=Factory(lambda: config.driver_config.prompt_driver)) + prompt_driver: BasePromptDriver = field( + kw_only=True, default=Factory(lambda: Defaults.drivers_config.prompt_driver) + ) summary: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) summary_index: int = field(default=0, kw_only=True, metadata={"serializable": True}) summary_template_generator: J2 = field(default=Factory(lambda: J2("memory/conversation/summary.j2")), kw_only=True) diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 5eb3ab734..1560702fb 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.memory.task.storage import BaseArtifactStorage if TYPE_CHECKING: @@ -15,7 +15,7 @@ @define(kw_only=True) class TextArtifactStorage(BaseArtifactStorage): vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda: config.driver_config.vector_store_driver) + default=Factory(lambda: Defaults.drivers_config.vector_store_driver) ) def can_store(self, artifact: BaseArtifact) -> bool: diff --git a/griptape/mixins/__init__.py b/griptape/mixins/__init__.py index 1bfa95c9a..32e00dd8b 100644 --- a/griptape/mixins/__init__.py +++ b/griptape/mixins/__init__.py @@ -5,6 +5,7 @@ from .serializable_mixin import SerializableMixin from .media_artifact_file_output_mixin import BlobArtifactFileOutputMixin from .futures_executor_mixin import FuturesExecutorMixin +from .singleton_mixin import SingletonMixin __all__ = [ "ActivityMixin", @@ -14,4 +15,5 @@ "BlobArtifactFileOutputMixin", "SerializableMixin", "FuturesExecutorMixin", + "SingletonMixin", ] diff --git a/griptape/mixins/singleton_mixin.py b/griptape/mixins/singleton_mixin.py new file mode 100644 index 000000000..1d565ceec --- /dev/null +++ b/griptape/mixins/singleton_mixin.py @@ -0,0 +1,10 @@ +from __future__ import annotations + + +class SingletonMixin: + _instance = None + + def __new__(cls, *args, **kwargs) -> SingletonMixin: + if not cls._instance: + cls._instance = super().__new__(cls, *args, **kwargs) # noqa: UP008 + return cls._instance diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 2c4edfc7d..24f57395c 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -6,7 +6,7 @@ from griptape.artifacts.text_artifact import TextArtifact from griptape.common import observable -from griptape.config import config +from griptape.configs import Defaults from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask @@ -23,8 +23,10 @@ class Agent(Structure): input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), ) - stream: bool = field(default=Factory(lambda: config.driver_config.prompt_driver.stream), kw_only=True) - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) + stream: bool = field(default=Factory(lambda: Defaults.drivers_config.prompt_driver.stream), kw_only=True) + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: Defaults.drivers_config.prompt_driver), kw_only=True + ) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) fail_fast: bool = field(default=False, kw_only=True) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index a18e9d578..0572e289d 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -7,7 +7,7 @@ from attrs import Attribute, Factory, define, field from griptape.common import observable -from griptape.events import FinishStructureRunEvent, StartStructureRunEvent, event_bus +from griptape.events import EventBus, FinishStructureRunEvent, StartStructureRunEvent from griptape.memory import TaskMemory from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory @@ -137,7 +137,7 @@ def before_run(self, args: Any) -> None: [task.reset() for task in self.tasks] - event_bus.publish_event( + EventBus.publish_event( StartStructureRunEvent( structure_id=self.id, input_task_input=self.input_task.input, @@ -149,7 +149,7 @@ def before_run(self, args: Any) -> None: @observable def after_run(self) -> None: - event_bus.publish_event( + EventBus.publish_event( FinishStructureRunEvent( structure_id=self.id, output_task_input=self.output_task.input, diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index da6f214eb..7cdb5d4de 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -11,8 +11,8 @@ from griptape import utils from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.common import ToolAction -from griptape.config import config -from griptape.events import FinishActionsSubtaskEvent, StartActionsSubtaskEvent, event_bus +from griptape.configs import Defaults +from griptape.events import EventBus, FinishActionsSubtaskEvent, StartActionsSubtaskEvent from griptape.mixins import ActionsSubtaskOriginMixin from griptape.tasks import BaseTask from griptape.utils import remove_null_values_in_dict_recursively @@ -20,7 +20,7 @@ if TYPE_CHECKING: from griptape.memory import TaskMemory -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define @@ -93,7 +93,7 @@ def attach_to(self, parent_task: BaseTask) -> None: self.output = ErrorArtifact(f"ToolAction input parsing error: {e}", exception=e) def before_run(self) -> None: - event_bus.publish_event( + EventBus.publish_event( StartActionsSubtaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, @@ -156,7 +156,7 @@ def execute_action(self, action: ToolAction) -> tuple[str, BaseArtifact]: def after_run(self) -> None: response = self.output.to_text() if isinstance(self.output, BaseArtifact) else str(self.output) - event_bus.publish_event( + EventBus.publish_event( FinishActionsSubtaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index b24ec3f3c..519a1a59a 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -5,11 +5,11 @@ from attrs import define -from griptape.config import config +from griptape.configs import Defaults from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.tasks import BaseTask -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define diff --git a/griptape/tasks/base_audio_input_task.py b/griptape/tasks/base_audio_input_task.py index fc94ed5d4..e39f70fcd 100644 --- a/griptape/tasks/base_audio_input_task.py +++ b/griptape/tasks/base_audio_input_task.py @@ -7,11 +7,11 @@ from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact -from griptape.config.config import config +from griptape.configs import Defaults from griptape.mixins import RuleMixin from griptape.tasks import BaseTask -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 9c226256b..f0c1f0e7e 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -8,7 +8,7 @@ from attrs import Attribute, define, field -from griptape.config import config +from griptape.configs import Defaults from griptape.loaders import ImageLoader from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.rules import Rule, Ruleset @@ -18,7 +18,7 @@ from griptape.artifacts import MediaArtifact -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 52b68e4e0..347dd7e29 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -7,12 +7,12 @@ from attrs import Factory, define, field from griptape.artifacts import ListArtifact, TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.mixins.rule_mixin import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index d80767793..535b3a92d 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -9,8 +9,8 @@ from attrs import Factory, define, field from griptape.artifacts import ErrorArtifact -from griptape.config import config -from griptape.events import FinishTaskEvent, StartTaskEvent, event_bus +from griptape.configs import Defaults +from griptape.events import EventBus, FinishTaskEvent, StartTaskEvent from griptape.mixins import FuturesExecutorMixin if TYPE_CHECKING: @@ -18,7 +18,7 @@ from griptape.memory.meta import BaseMetaEntry from griptape.structures import Structure -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define @@ -137,7 +137,7 @@ def is_executing(self) -> bool: def before_run(self) -> None: if self.structure is not None: - event_bus.publish_event( + EventBus.publish_event( StartTaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, @@ -149,7 +149,7 @@ def before_run(self) -> None: def after_run(self) -> None: if self.structure is not None: - event_bus.publish_event( + EventBus.publish_event( FinishTaskEvent( task_id=self.id, task_parent_ids=self.parent_ids, diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index 0a53b9fcd..dfed85bcf 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -7,12 +7,12 @@ from attrs import define, field from griptape.artifacts import TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.mixins.rule_mixin import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 719ae77bc..17a73e4cd 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -7,7 +7,7 @@ from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.common import PromptStack -from griptape.config import config +from griptape.configs import Defaults from griptape.mixins import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 @@ -15,12 +15,14 @@ if TYPE_CHECKING: from griptape.drivers import BasePromptDriver -logger = logging.getLogger(config.logging_config.logger_name) +logger = logging.getLogger(Defaults.logging_config.logger_name) @define class PromptTask(RuleMixin, BaseTask): - prompt_driver: BasePromptDriver = field(default=Factory(lambda: config.driver_config.prompt_driver), kw_only=True) + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: Defaults.drivers_config.prompt_driver), kw_only=True + ) generate_system_template: Callable[[PromptTask], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True, diff --git a/griptape/tools/query/tool.py b/griptape/tools/query/tool.py index 70cc9f747..3bc954239 100644 --- a/griptape/tools/query/tool.py +++ b/griptape/tools/query/tool.py @@ -4,7 +4,7 @@ from schema import Literal, Or, Schema from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact -from griptape.config import config +from griptape.configs import Defaults from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( PromptResponseRagModule, @@ -26,7 +26,7 @@ class QueryTool(BaseTool, RuleMixin): response_stage=ResponseRagStage( response_modules=[ PromptResponseRagModule( - prompt_driver=config.driver_config.prompt_driver, rulesets=self.rulesets + prompt_driver=Defaults.drivers_config.prompt_driver, rulesets=self.rulesets ) ], ), diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index f30e9f1cd..21e045db7 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -38,11 +38,11 @@ def default_output_fn(self, text: str) -> None: print(text) # noqa: T201 def start(self) -> None: - from griptape.config import config + from griptape.configs import Defaults # Hide Griptape's logging output except for errors - old_logger_level = logging.getLogger(config.logging_config.logger_name).getEffectiveLevel() - logging.getLogger(config.logging_config.logger_name).setLevel(self.logger_level) + old_logger_level = logging.getLogger(Defaults.logging_config.logger_name).getEffectiveLevel() + logging.getLogger(Defaults.logging_config.logger_name).setLevel(self.logger_level) if self.intro_text: self.output_fn(self.intro_text) @@ -53,7 +53,7 @@ def start(self) -> None: self.output_fn(self.exiting_text) break - if config.driver_config.prompt_driver.stream: + if Defaults.drivers_config.prompt_driver.stream: self.output_fn(self.processing_text + "\n") stream = Stream(self.structure).run(question) first_chunk = next(stream) @@ -65,4 +65,4 @@ def start(self) -> None: self.output_fn(f"{self.response_prefix}{self.structure.run(question).output_task.output.to_text()}") # Restore the original logger level - logging.getLogger(config.logging_config.logger_name).setLevel(old_logger_level) + logging.getLogger(Defaults.logging_config.logger_name).setLevel(old_logger_level) diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 6da58b9e6..8a764e85a 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -7,7 +7,7 @@ from attrs import Attribute, Factory, define, field from griptape.artifacts.text_artifact import TextArtifact -from griptape.events import CompletionChunkEvent, EventListener, FinishPromptEvent, FinishStructureRunEvent, event_bus +from griptape.events import CompletionChunkEvent, EventBus, EventListener, FinishPromptEvent, FinishStructureRunEvent if TYPE_CHECKING: from collections.abc import Iterator @@ -66,8 +66,8 @@ def event_handler(event: BaseEvent) -> None: handler=event_handler, event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent], ) - event_bus.add_event_listener(stream_event_listener) + EventBus.add_event_listener(stream_event_listener) self.structure.run(*args) - event_bus.remove_event_listener(stream_event_listener) + EventBus.remove_event_listener(stream_event_listener) diff --git a/mkdocs.yml b/mkdocs.yml index 7e3806264..4207d2171 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -91,7 +91,7 @@ nav: - Task Memory and Off Prompt: "griptape-framework/structures/task-memory.md" - Conversation Memory: "griptape-framework/structures/conversation-memory.md" - Rulesets: "griptape-framework/structures/rulesets.md" - - Config: "griptape-framework/structures/config.md" + - Configs: "griptape-framework/structures/configs.md" - Observability: "griptape-framework/structures/observability.md" - Tools: - Overview: "griptape-framework/tools/index.md" diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_drivers_config.py similarity index 92% rename from tests/mocks/mock_driver_config.py rename to tests/mocks/mock_drivers_config.py index b038fe920..aa9683dbd 100644 --- a/tests/mocks/mock_driver_config.py +++ b/tests/mocks/mock_drivers_config.py @@ -1,6 +1,6 @@ from attrs import define -from griptape.config.drivers import DriverConfig +from griptape.configs.drivers import DriversConfig from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver from griptape.utils.decorators import lazy_property from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -10,7 +10,7 @@ @define -class MockDriverConfig(DriverConfig): +class MockDriversConfig(DriversConfig): @lazy_property() def prompt_driver(self) -> MockPromptDriver: return MockPromptDriver() diff --git a/tests/unit/config/drivers/test_driver_config.py b/tests/unit/config/drivers/test_driver_config.py deleted file mode 100644 index beb42a018..000000000 --- a/tests/unit/config/drivers/test_driver_config.py +++ /dev/null @@ -1,70 +0,0 @@ -import pytest - -from griptape.config.drivers import DriverConfig - - -class TestDriverConfig: - @pytest.fixture() - def config(self): - return DriverConfig() - - def test_to_dict(self, config): - assert config.to_dict() == { - "type": "DriverConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "use_native_tools": False, - }, - "conversation_memory_driver": None, - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, - "vector_store_driver": { - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "type": "DummyVectorStoreDriver", - }, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, - } - - def test_from_dict(self, config): - assert DriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() - - def test_dot_update(self, config): - config.prompt_driver.max_tokens = 10 - - assert config.prompt_driver.max_tokens == 10 - - @pytest.mark.skip_mock_config() - def test_lazy_init(self): - from griptape.config import config - - assert config.driver_config._prompt_driver is None - assert config.driver_config._image_generation_driver is None - assert config.driver_config._image_query_driver is None - assert config.driver_config._embedding_driver is None - assert config.driver_config._vector_store_driver is None - assert config.driver_config._conversation_memory_driver is None - assert config.driver_config._text_to_speech_driver is None - assert config.driver_config._audio_transcription_driver is None - - assert config.driver_config.prompt_driver is not None - assert config.driver_config.image_generation_driver is not None - assert config.driver_config.image_query_driver is not None - assert config.driver_config.embedding_driver is not None - assert config.driver_config.vector_store_driver is not None - assert config.driver_config.conversation_memory_driver is None - assert config.driver_config.text_to_speech_driver is not None - assert config.driver_config.audio_transcription_driver is not None - - assert config.driver_config._prompt_driver is not None - assert config.driver_config._image_generation_driver is not None - assert config.driver_config._image_query_driver is not None - assert config.driver_config._embedding_driver is not None - assert config.driver_config._vector_store_driver is not None - assert config.driver_config._conversation_memory_driver is None - assert config.driver_config._text_to_speech_driver is not None - assert config.driver_config._audio_transcription_driver is not None diff --git a/tests/unit/config/__init__.py b/tests/unit/configs/__init__.py similarity index 100% rename from tests/unit/config/__init__.py rename to tests/unit/configs/__init__.py diff --git a/tests/unit/config/drivers/__init__.py b/tests/unit/configs/drivers/__init__.py similarity index 100% rename from tests/unit/config/drivers/__init__.py rename to tests/unit/configs/drivers/__init__.py diff --git a/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py b/tests/unit/configs/drivers/test_amazon_bedrock_drivers_config.py similarity index 89% rename from tests/unit/config/drivers/test_amazon_bedrock_driver_config.py rename to tests/unit/configs/drivers/test_amazon_bedrock_drivers_config.py index e30444332..129fe281f 100644 --- a/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py +++ b/tests/unit/configs/drivers/test_amazon_bedrock_drivers_config.py @@ -1,11 +1,11 @@ import boto3 import pytest -from griptape.config.drivers import AmazonBedrockDriverConfig +from griptape.configs.drivers import AmazonBedrockDriversConfig from tests.utils.aws import mock_aws_credentials -class TestAmazonBedrockDriverConfig: +class TestAmazonBedrockDriversConfig: @pytest.fixture(autouse=True) def _run_before_and_after_tests(self): mock_aws_credentials() @@ -13,11 +13,11 @@ def _run_before_and_after_tests(self): @pytest.fixture() def config(self): mock_aws_credentials() - return AmazonBedrockDriverConfig() + return AmazonBedrockDriversConfig() @pytest.fixture() def config_with_values(self): - return AmazonBedrockDriverConfig( + return AmazonBedrockDriversConfig( session=boto3.Session( aws_access_key_id="testing", aws_secret_access_key="testing", region_name="region-value" ) @@ -62,17 +62,17 @@ def test_to_dict(self, config): }, "type": "LocalVectorStoreDriver", }, - "type": "AmazonBedrockDriverConfig", + "type": "AmazonBedrockDriversConfig", "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } def test_from_dict(self, config): - assert AmazonBedrockDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert AmazonBedrockDriversConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() def test_from_dict_with_values(self, config_with_values): assert ( - AmazonBedrockDriverConfig.from_dict(config_with_values.to_dict()).to_dict() == config_with_values.to_dict() + AmazonBedrockDriversConfig.from_dict(config_with_values.to_dict()).to_dict() == config_with_values.to_dict() ) def test_to_dict_with_values(self, config_with_values): @@ -114,7 +114,7 @@ def test_to_dict_with_values(self, config_with_values): }, "type": "LocalVectorStoreDriver", }, - "type": "AmazonBedrockDriverConfig", + "type": "AmazonBedrockDriversConfig", "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, } diff --git a/tests/unit/config/drivers/test_anthropic_driver_config.py b/tests/unit/configs/drivers/test_anthropic_drivers_config.py similarity index 85% rename from tests/unit/config/drivers/test_anthropic_driver_config.py rename to tests/unit/configs/drivers/test_anthropic_drivers_config.py index 770a04b9f..b2335d92a 100644 --- a/tests/unit/config/drivers/test_anthropic_driver_config.py +++ b/tests/unit/configs/drivers/test_anthropic_drivers_config.py @@ -1,9 +1,9 @@ import pytest -from griptape.config.drivers import AnthropicDriverConfig +from griptape.configs.drivers import AnthropicDriversConfig -class TestAnthropicDriverConfig: +class TestAnthropicDriversConfig: @pytest.fixture(autouse=True) def _mock_anthropic(self, mocker): mocker.patch("anthropic.Anthropic") @@ -11,11 +11,11 @@ def _mock_anthropic(self, mocker): @pytest.fixture() def config(self): - return AnthropicDriverConfig() + return AnthropicDriversConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "AnthropicDriverConfig", + "type": "AnthropicDriversConfig", "prompt_driver": { "type": "AnthropicPromptDriver", "temperature": 0.1, @@ -51,4 +51,4 @@ def test_to_dict(self, config): } def test_from_dict(self, config): - assert AnthropicDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert AnthropicDriversConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/drivers/test_azure_openai_driver_config.py b/tests/unit/configs/drivers/test_azure_openai_drivers_config.py similarity index 94% rename from tests/unit/config/drivers/test_azure_openai_driver_config.py rename to tests/unit/configs/drivers/test_azure_openai_drivers_config.py index dfc69ce46..5c514c947 100644 --- a/tests/unit/config/drivers/test_azure_openai_driver_config.py +++ b/tests/unit/configs/drivers/test_azure_openai_drivers_config.py @@ -1,16 +1,16 @@ import pytest -from griptape.config.drivers import AzureOpenAiDriverConfig +from griptape.configs.drivers import AzureOpenAiDriversConfig -class TestAzureOpenAiDriverConfig: +class TestAzureOpenAiDriversConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.AzureOpenAI") @pytest.fixture() def config(self): - return AzureOpenAiDriverConfig( + return AzureOpenAiDriversConfig( azure_endpoint="http://localhost:8080", azure_ad_token="test-token", azure_ad_token_provider=lambda: "test-provider", @@ -18,7 +18,7 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { - "type": "AzureOpenAiDriverConfig", + "type": "AzureOpenAiDriversConfig", "azure_endpoint": "http://localhost:8080", "prompt_driver": { "type": "AzureOpenAiChatPromptDriver", diff --git a/tests/unit/config/drivers/test_cohere_driver_config.py b/tests/unit/configs/drivers/test_cohere_drivers_config.py similarity index 87% rename from tests/unit/config/drivers/test_cohere_driver_config.py rename to tests/unit/configs/drivers/test_cohere_drivers_config.py index 982733dd6..3c267d73d 100644 --- a/tests/unit/config/drivers/test_cohere_driver_config.py +++ b/tests/unit/configs/drivers/test_cohere_drivers_config.py @@ -1,16 +1,16 @@ import pytest -from griptape.config.drivers import CohereDriverConfig +from griptape.configs.drivers import CohereDriversConfig -class TestCohereDriverConfig: +class TestCohereDriversConfig: @pytest.fixture() def config(self): - return CohereDriverConfig(api_key="api_key") + return CohereDriversConfig(api_key="api_key") def test_to_dict(self, config): assert config.to_dict() == { - "type": "CohereDriverConfig", + "type": "CohereDriversConfig", "image_generation_driver": {"type": "DummyImageGenerationDriver"}, "image_query_driver": {"type": "DummyImageQueryDriver"}, "conversation_memory_driver": None, diff --git a/tests/unit/configs/drivers/test_drivers_config.py b/tests/unit/configs/drivers/test_drivers_config.py new file mode 100644 index 000000000..20cc0926c --- /dev/null +++ b/tests/unit/configs/drivers/test_drivers_config.py @@ -0,0 +1,70 @@ +import pytest + +from griptape.configs.drivers import DriversConfig + + +class TestDriversConfig: + @pytest.fixture() + def config(self): + return DriversConfig() + + def test_to_dict(self, config): + assert config.to_dict() == { + "type": "DriversConfig", + "prompt_driver": { + "type": "DummyPromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "use_native_tools": False, + }, + "conversation_memory_driver": None, + "embedding_driver": {"type": "DummyEmbeddingDriver"}, + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "vector_store_driver": { + "embedding_driver": {"type": "DummyEmbeddingDriver"}, + "type": "DummyVectorStoreDriver", + }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + } + + def test_from_dict(self, config): + assert DriversConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + + def test_dot_update(self, config): + config.prompt_driver.max_tokens = 10 + + assert config.prompt_driver.max_tokens == 10 + + @pytest.mark.skip_mock_config() + def test_lazy_init(self): + from griptape.configs import Defaults + + assert Defaults.drivers_config._prompt_driver is None + assert Defaults.drivers_config._image_generation_driver is None + assert Defaults.drivers_config._image_query_driver is None + assert Defaults.drivers_config._embedding_driver is None + assert Defaults.drivers_config._vector_store_driver is None + assert Defaults.drivers_config._conversation_memory_driver is None + assert Defaults.drivers_config._text_to_speech_driver is None + assert Defaults.drivers_config._audio_transcription_driver is None + + assert Defaults.drivers_config.prompt_driver is not None + assert Defaults.drivers_config.image_generation_driver is not None + assert Defaults.drivers_config.image_query_driver is not None + assert Defaults.drivers_config.embedding_driver is not None + assert Defaults.drivers_config.vector_store_driver is not None + assert Defaults.drivers_config.conversation_memory_driver is None + assert Defaults.drivers_config.text_to_speech_driver is not None + assert Defaults.drivers_config.audio_transcription_driver is not None + + assert Defaults.drivers_config._prompt_driver is not None + assert Defaults.drivers_config._image_generation_driver is not None + assert Defaults.drivers_config._image_query_driver is not None + assert Defaults.drivers_config._embedding_driver is not None + assert Defaults.drivers_config._vector_store_driver is not None + assert Defaults.drivers_config._conversation_memory_driver is None + assert Defaults.drivers_config._text_to_speech_driver is not None + assert Defaults.drivers_config._audio_transcription_driver is not None diff --git a/tests/unit/config/drivers/test_google_driver_config.py b/tests/unit/configs/drivers/test_google_drivers_config.py similarity index 86% rename from tests/unit/config/drivers/test_google_driver_config.py rename to tests/unit/configs/drivers/test_google_drivers_config.py index e16f63eb3..f6df1afef 100644 --- a/tests/unit/config/drivers/test_google_driver_config.py +++ b/tests/unit/configs/drivers/test_google_drivers_config.py @@ -1,20 +1,20 @@ import pytest -from griptape.config.drivers import GoogleDriverConfig +from griptape.configs.drivers import GoogleDriversConfig -class TestGoogleDriverConfig: +class TestGoogleDriversConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("google.generativeai.GenerativeModel") @pytest.fixture() def config(self): - return GoogleDriverConfig() + return GoogleDriversConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "GoogleDriverConfig", + "type": "GoogleDriversConfig", "prompt_driver": { "type": "GooglePromptDriver", "temperature": 0.1, @@ -49,4 +49,4 @@ def test_to_dict(self, config): } def test_from_dict(self, config): - assert GoogleDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert GoogleDriversConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/drivers/test_openai_driver_config.py b/tests/unit/configs/drivers/test_openai_driver_config.py similarity index 91% rename from tests/unit/config/drivers/test_openai_driver_config.py rename to tests/unit/configs/drivers/test_openai_driver_config.py index 5c560a7f7..2425b178f 100644 --- a/tests/unit/config/drivers/test_openai_driver_config.py +++ b/tests/unit/configs/drivers/test_openai_driver_config.py @@ -1,20 +1,20 @@ import pytest -from griptape.config.drivers import OpenAiDriverConfig +from griptape.configs.drivers import OpenAiDriversConfig -class TestOpenAiDriverConfig: +class TestOpenAiDriversConfig: @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.OpenAI") @pytest.fixture() def config(self): - return OpenAiDriverConfig() + return OpenAiDriversConfig() def test_to_dict(self, config): assert config.to_dict() == { - "type": "OpenAiDriverConfig", + "type": "OpenAiDriversConfig", "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, @@ -83,4 +83,4 @@ def test_to_dict(self, config): } def test_from_dict(self, config): - assert OpenAiDriverConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + assert OpenAiDriversConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() diff --git a/tests/unit/config/logging/__init__.py b/tests/unit/configs/logging/__init__.py similarity index 100% rename from tests/unit/config/logging/__init__.py rename to tests/unit/configs/logging/__init__.py diff --git a/tests/unit/config/logging/test_newline_logging_filter.py b/tests/unit/configs/logging/test_newline_logging_filter.py similarity index 74% rename from tests/unit/config/logging/test_newline_logging_filter.py rename to tests/unit/configs/logging/test_newline_logging_filter.py index 89166dd40..05d022dca 100644 --- a/tests/unit/config/logging/test_newline_logging_filter.py +++ b/tests/unit/configs/logging/test_newline_logging_filter.py @@ -2,15 +2,15 @@ import logging from contextlib import redirect_stdout -from griptape.config import config -from griptape.config.logging import NewlineLoggingFilter +from griptape.configs import Defaults +from griptape.configs.logging import NewlineLoggingFilter from griptape.structures import Agent class TestNewlineLoggingFilter: def test_filter(self): # use the filter in an Agent - logger = logging.getLogger(config.logging_config.logger_name) + logger = logging.getLogger(Defaults.logging_config.logger_name) logger.addFilter(NewlineLoggingFilter(replace_str="$$$")) agent = Agent() # use a context manager to capture the stdout diff --git a/tests/unit/config/logging/test_truncate_logging_filter.py b/tests/unit/configs/logging/test_truncate_logging_filter.py similarity index 75% rename from tests/unit/config/logging/test_truncate_logging_filter.py rename to tests/unit/configs/logging/test_truncate_logging_filter.py index a9387b52b..8aade25f7 100644 --- a/tests/unit/config/logging/test_truncate_logging_filter.py +++ b/tests/unit/configs/logging/test_truncate_logging_filter.py @@ -2,15 +2,15 @@ import logging from contextlib import redirect_stdout -from griptape.config import config -from griptape.config.logging import TruncateLoggingFilter +from griptape.configs import Defaults +from griptape.configs.logging import TruncateLoggingFilter from griptape.structures import Agent class TestTruncateLoggingFilter: def test_filter(self): # use the filter in an Agent - logger = logging.getLogger(config.logging_config.logger_name) + logger = logging.getLogger(Defaults.logging_config.logger_name) logger.addFilter(TruncateLoggingFilter(max_log_length=0)) agent = Agent() # use a context manager to capture the stdout diff --git a/tests/unit/configs/test_defaults_config.py b/tests/unit/configs/test_defaults_config.py new file mode 100644 index 000000000..afb679dd0 --- /dev/null +++ b/tests/unit/configs/test_defaults_config.py @@ -0,0 +1,14 @@ +import pytest + + +class TestDefaultsConfig: + def test_init(self): + from griptape.configs.defaults_config import _DefaultsConfig + + assert _DefaultsConfig() is _DefaultsConfig() + + def test_error_init(self): + from griptape.configs import Defaults + + with pytest.raises(TypeError): + Defaults() # pyright: ignore[reportCallIssue] diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 8c954c1c8..a70b6b1a7 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,29 +1,29 @@ import pytest -from tests.mocks.mock_driver_config import MockDriverConfig +from tests.mocks.mock_drivers_config import MockDriversConfig @pytest.fixture(autouse=True) def mock_event_bus(): - from griptape.events import event_bus + from griptape.events import EventBus - event_bus.clear_event_listeners() + EventBus.clear_event_listeners() - yield event_bus + yield EventBus - event_bus.clear_event_listeners() + EventBus.clear_event_listeners() @pytest.fixture(autouse=True) def mock_config(request): - from griptape.config import config + from griptape.configs import Defaults - # Some tests we don't want to use the autouse fixture's MockDriverConfig + # Some tests we don't want to use the autouse fixture's MockDriversConfig if "skip_mock_config" in request.keywords: yield return - config.driver_config = MockDriverConfig() + Defaults.drivers_config = MockDriversConfig() - yield config + yield Defaults diff --git a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py index 61ef3aa53..29aecfdf9 100644 --- a/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py +++ b/tests/unit/drivers/audio_transcription/test_base_audio_transcription_driver.py @@ -3,7 +3,7 @@ import pytest from griptape.artifacts import AudioArtifact -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from tests.mocks.mock_audio_transcription_driver import MockAudioTranscriptionDriver @@ -14,7 +14,7 @@ def driver(self): def test_run_publish_events(self, driver, mock_config): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run( AudioArtifact( diff --git a/tests/unit/drivers/image_generation/test_base_image_generation_driver.py b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py index ab7b33ae8..96b615a58 100644 --- a/tests/unit/drivers/image_generation/test_base_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_base_image_generation_driver.py @@ -3,7 +3,7 @@ import pytest from griptape.artifacts.image_artifact import ImageArtifact -from griptape.events import event_bus +from griptape.events import EventBus from griptape.events.event_listener import EventListener from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver @@ -15,7 +15,7 @@ def driver(self): def test_run_text_to_image_publish_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run_text_to_image( ["foo", "bar"], @@ -31,7 +31,7 @@ def test_run_text_to_image_publish_events(self, driver): def test_run_image_variation_publish_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_variation( ["foo", "bar"], @@ -53,7 +53,7 @@ def test_run_image_variation_publish_events(self, driver): def test_run_image_image_inpainting_publish_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_inpainting( ["foo", "bar"], @@ -81,7 +81,7 @@ def test_run_image_image_inpainting_publish_events(self, driver): def test_run_image_image_outpainting_publish_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run_image_outpainting( ["foo", "bar"], diff --git a/tests/unit/drivers/image_query/test_base_image_query_driver.py b/tests/unit/drivers/image_query/test_base_image_query_driver.py index d8ba6b60f..a77fb268e 100644 --- a/tests/unit/drivers/image_query/test_base_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_base_image_query_driver.py @@ -2,7 +2,7 @@ import pytest -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from tests.mocks.mock_image_query_driver import MockImageQueryDriver @@ -13,7 +13,7 @@ def driver(self): def test_query_publishes_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.query("foo", []) diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 3e0b0ffc8..3efe85c98 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -11,7 +11,7 @@ class TestBasePromptDriver: def test_run_via_pipeline_retries_success(self, mock_config): - mock_config.driver_config.prompt_driver = MockPromptDriver(max_attempts=2) + mock_config.drivers_config.prompt_driver = MockPromptDriver(max_attempts=2) pipeline = Pipeline() pipeline.add_task(PromptTask("test")) @@ -19,7 +19,7 @@ def test_run_via_pipeline_retries_success(self, mock_config): assert isinstance(pipeline.run().output_task.output, TextArtifact) def test_run_via_pipeline_retries_failure(self, mock_config): - mock_config.driver_config.prompt_driver = MockFailingPromptDriver(max_failures=2, max_attempts=1) + mock_config.drivers_config.prompt_driver = MockFailingPromptDriver(max_failures=2, max_attempts=1) pipeline = Pipeline() pipeline.add_task(PromptTask("test")) @@ -46,7 +46,7 @@ def test_run_with_stream(self): assert result.value == "mock output" def test_run_with_tools(self, mock_config): - mock_config.driver_config.prompt_driver = MockPromptDriver(max_attempts=1, use_native_tools=True) + mock_config.drivers_config.prompt_driver = MockPromptDriver(max_attempts=1, use_native_tools=True) pipeline = Pipeline() pipeline.add_task(ToolkitTask(tools=[MockTool()])) diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index 2090be39c..2dd68e24e 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -20,7 +20,7 @@ def test_run(self): def test_run_with_env(self, mock_config): pipeline = Pipeline() - mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output=lambda _: os.environ["KEY"]) + mock_config.drivers_config.prompt_driver = MockPromptDriver(mock_output=lambda _: os.environ["KEY"]) agent = Agent() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"KEY": "value"}) task = StructureRunTask(driver=driver) diff --git a/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py index 19493aa0f..ab448c7c1 100644 --- a/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py +++ b/tests/unit/drivers/text_to_speech/test_base_audio_transcription_driver.py @@ -2,7 +2,7 @@ import pytest -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from tests.mocks.mock_text_to_speech_driver import MockTextToSpeechDriver @@ -13,7 +13,7 @@ def driver(self): def test_text_to_audio_publish_events(self, driver): mock_handler = Mock() - event_bus.add_event_listener(EventListener(handler=mock_handler)) + EventBus.add_event_listener(EventListener(handler=mock_handler)) driver.run_text_to_audio( ["foo", "bar"], diff --git a/tests/unit/events/test_event_bus.py b/tests/unit/events/test_event_bus.py index 7eb87036a..cc432dafb 100644 --- a/tests/unit/events/test_event_bus.py +++ b/tests/unit/events/test_event_bus.py @@ -1,45 +1,50 @@ from unittest.mock import Mock -from griptape.events import EventListener, event_bus +from griptape.events import EventBus, EventListener from tests.mocks.mock_event import MockEvent class TestEventBus: + def test_init(self): + from griptape.events.event_bus import _EventBus + + assert _EventBus() is _EventBus() + def test_add_event_listeners(self): - event_bus.add_event_listeners([EventListener(), EventListener()]) - assert len(event_bus.event_listeners) == 2 + EventBus.add_event_listeners([EventListener(), EventListener()]) + assert len(EventBus.event_listeners) == 2 def test_remove_event_listeners(self): listeners = [EventListener(), EventListener()] - event_bus.add_event_listeners(listeners) - event_bus.remove_event_listeners(listeners) - assert len(event_bus.event_listeners) == 0 + EventBus.add_event_listeners(listeners) + EventBus.remove_event_listeners(listeners) + assert len(EventBus.event_listeners) == 0 def test_add_event_listener(self): - event_bus.add_event_listener(EventListener()) - event_bus.add_event_listener(EventListener()) + EventBus.add_event_listener(EventListener()) + EventBus.add_event_listener(EventListener()) - assert len(event_bus.event_listeners) == 2 + assert len(EventBus.event_listeners) == 2 def test_remove_event_listener(self): listener = EventListener() - event_bus.add_event_listener(listener) - event_bus.remove_event_listener(listener) + EventBus.add_event_listener(listener) + EventBus.remove_event_listener(listener) - assert len(event_bus.event_listeners) == 0 + assert len(EventBus.event_listeners) == 0 def test_remove_unknown_event_listener(self): - event_bus.remove_event_listener(EventListener()) + EventBus.remove_event_listener(EventListener()) def test_publish_event(self): # Given mock_handler = Mock() mock_handler.return_value = None - event_bus.add_event_listeners([EventListener(handler=mock_handler)]) + EventBus.add_event_listeners([EventListener(handler=mock_handler)]) mock_event = MockEvent() # When - event_bus.publish_event(mock_event) + EventBus.publish_event(mock_event) # Then mock_handler.assert_called_once_with(mock_event) diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 0078ebc34..a6d90d4fc 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -4,6 +4,7 @@ from griptape.events import ( CompletionChunkEvent, + EventBus, EventListener, FinishActionsSubtaskEvent, FinishPromptEvent, @@ -13,7 +14,6 @@ StartPromptEvent, StartStructureRunEvent, StartTaskEvent, - event_bus, ) from griptape.events.base_event import BaseEvent from griptape.structures import Pipeline @@ -26,7 +26,7 @@ class TestEventListener: @pytest.fixture() def pipeline(self, mock_config): - mock_config.driver_config.prompt_driver = MockPromptDriver(stream=True) + mock_config.drivers_config.prompt_driver = MockPromptDriver(stream=True) task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) pipeline = Pipeline() @@ -39,7 +39,7 @@ def test_untyped_listeners(self, pipeline, mock_config): event_handler_1 = Mock() event_handler_2 = Mock() - event_bus.add_event_listeners([EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)]) + EventBus.add_event_listeners([EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)]) # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() @@ -60,7 +60,7 @@ def test_typed_listeners(self, pipeline, mock_config): finish_structure_run_event_handler = Mock() completion_chunk_handler = Mock() - event_bus.add_event_listeners( + EventBus.add_event_listeners( [ EventListener(start_prompt_event_handler, event_types=[StartPromptEvent]), EventListener(finish_prompt_event_handler, event_types=[FinishPromptEvent]), @@ -90,25 +90,25 @@ def test_typed_listeners(self, pipeline, mock_config): completion_chunk_handler.assert_called_once() def test_add_remove_event_listener(self, pipeline): - event_bus.clear_event_listeners() + EventBus.clear_event_listeners() mock1 = Mock() mock2 = Mock() # duplicate event listeners will only get added once - event_listener_1 = event_bus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - event_bus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + event_listener_1 = EventBus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + EventBus.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - event_listener_3 = event_bus.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) - event_listener_4 = event_bus.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) + event_listener_3 = EventBus.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) + event_listener_4 = EventBus.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) - event_listener_5 = event_bus.add_event_listener(EventListener(mock2)) + event_listener_5 = EventBus.add_event_listener(EventListener(mock2)) - assert len(event_bus.event_listeners) == 4 + assert len(EventBus.event_listeners) == 4 - event_bus.remove_event_listener(event_listener_1) - event_bus.remove_event_listener(event_listener_3) - event_bus.remove_event_listener(event_listener_4) - event_bus.remove_event_listener(event_listener_5) - assert len(event_bus.event_listeners) == 0 + EventBus.remove_event_listener(event_listener_1) + EventBus.remove_event_listener(event_listener_3) + EventBus.remove_event_listener(event_listener_4) + EventBus.remove_event_listener(event_listener_5) + assert len(EventBus.event_listeners) == 0 def test_publish_event(self): mock_event_listener_driver = Mock() diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index b7137524e..3f9ac2344 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -97,7 +97,7 @@ def test_add_to_prompt_stack_autopruing_disabled(self): def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): # All memory is pruned. - mock_config.driver_config.prompt_driver = MockPromptDriver( + mock_config.drivers_config.prompt_driver = MockPromptDriver( tokenizer=MockTokenizer(model="foo", max_input_tokens=0) ) agent = Agent() @@ -121,7 +121,7 @@ def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): assert len(prompt_stack.messages) == 3 # No memory is pruned. - mock_config.driver_config.prompt_driver = MockPromptDriver( + mock_config.drivers_config.prompt_driver = MockPromptDriver( tokenizer=MockTokenizer(model="foo", max_input_tokens=1000) ) agent = Agent() @@ -147,7 +147,7 @@ def test_add_to_prompt_stack_autopruning_enabled(self, mock_config): # One memory is pruned. # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens # so that a single memory is pruned. - mock_config.driver_config.prompt_driver = MockPromptDriver( + mock_config.drivers_config.prompt_driver = MockPromptDriver( tokenizer=MockTokenizer(model="foo", max_input_tokens=160) ) agent = Agent() diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index d90f2f8ba..235363bbe 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -222,7 +222,7 @@ def test_task_memory_defaults(self, mock_config): storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.vector_store_driver.embedding_driver == mock_config.driver_config.embedding_driver + assert storage.vector_store_driver.embedding_driver == mock_config.drivers_config.embedding_driver def finished_tasks(self): task = PromptTask("test prompt") diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index e87a99ccb..94a13b938 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -3,7 +3,7 @@ import pytest from griptape.artifacts import TextArtifact -from griptape.events import event_bus +from griptape.events import EventBus from griptape.events.event_listener import EventListener from griptape.structures import Agent, Workflow from griptape.tasks import ActionsSubtask @@ -14,11 +14,11 @@ class TestBaseTask: @pytest.fixture() def task(self): - event_bus.add_event_listeners([EventListener(handler=Mock())]) + EventBus.add_event_listeners([EventListener(handler=Mock())]) agent = Agent( tools=[MockTool()], ) - event_bus.add_event_listeners([EventListener(handler=Mock())]) + EventBus.add_event_listeners([EventListener(handler=Mock())]) agent.add_task(MockTask("foobar", max_meta_memory_entries=2)) @@ -115,7 +115,7 @@ def test_children_property_no_structure(self, task): def test_execute_publish_events(self, task): task.execute() - assert event_bus.event_listeners[0].handler.call_count == 2 + assert EventBus.event_listeners[0].handler.call_count == 2 def test_add_parent(self, task): parent = MockTask("parent foobar", id="parent_foobar") diff --git a/tests/unit/tasks/test_structure_run_task.py b/tests/unit/tasks/test_structure_run_task.py index fe434a281..6ea9f5985 100644 --- a/tests/unit/tasks/test_structure_run_task.py +++ b/tests/unit/tasks/test_structure_run_task.py @@ -6,9 +6,9 @@ class TestStructureRunTask: def test_run(self, mock_config): - mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output="agent mock output") + mock_config.drivers_config.prompt_driver = MockPromptDriver(mock_output="agent mock output") agent = Agent() - mock_config.driver_config.prompt_driver = MockPromptDriver(mock_output="pipeline mock output") + mock_config.drivers_config.prompt_driver = MockPromptDriver(mock_output="pipeline mock output") pipeline = Pipeline() driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index 9ba1df731..dbb76a943 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -168,7 +168,7 @@ class TestToolTask: def agent(self, mock_config): output_dict = {"tag": "foo", "name": "MockTool", "path": "test", "input": {"values": {"test": "foobar"}}} - mock_config.driver_config.prompt_driver = MockPromptDriver( + mock_config.drivers_config.prompt_driver = MockPromptDriver( mock_output=f"```python foo bar\n{json.dumps(output_dict)}" ) diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 6837fca78..6b238c399 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -171,7 +171,7 @@ def test_init(self): def test_run(self, mock_config): output = """Answer: done""" - mock_config.driver_config.prompt_driver.mock_output = output + mock_config.drivers_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1"), MockTool(name="Tool2")]) agent = Agent() @@ -186,7 +186,7 @@ def test_run(self, mock_config): def test_run_max_subtasks(self, mock_config): output = 'Actions: [{"tag": "foo", "name": "Tool1", "path": "test", "input": {"values": {"test": "value"}}}]' - mock_config.driver_config.prompt_driver.mock_output = output + mock_config.drivers_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) agent = Agent() @@ -200,7 +200,7 @@ def test_run_max_subtasks(self, mock_config): def test_run_invalid_react_prompt(self, mock_config): output = """foo bar""" - mock_config.driver_config.prompt_driver.mock_output = output + mock_config.drivers_config.prompt_driver.mock_output = output task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) agent = Agent() diff --git a/tests/unit/utils/test_chat.py b/tests/unit/utils/test_chat.py index ff728718a..a8ffb1fff 100644 --- a/tests/unit/utils/test_chat.py +++ b/tests/unit/utils/test_chat.py @@ -1,7 +1,7 @@ import logging from unittest.mock import patch -from griptape.config import config +from griptape.configs import Defaults from griptape.memory.structure import ConversationMemory from griptape.structures import Agent from griptape.utils import Chat @@ -37,7 +37,7 @@ def test_chat_logger_level(self, mock_input): chat = Chat(agent) - logger = logging.getLogger(config.logging_config.logger_name) + logger = logging.getLogger(Defaults.logging_config.logger_name) logger.setLevel(logging.DEBUG) assert logger.getEffectiveLevel() == logging.DEBUG diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 7de57d85c..9fadf4e36 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -228,9 +228,9 @@ def prompt_driver_id_fn(cls, prompt_driver) -> str: return f"{prompt_driver.__class__.__name__}-{prompt_driver.model}" def verify_structure_output(self, structure) -> dict: - from griptape.config import config + from griptape.configs import Defaults - config.driver_config.prompt_driver = AzureOpenAiChatPromptDriver( + Defaults.drivers_config.prompt_driver = AzureOpenAiChatPromptDriver( api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-4o", azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], From d6dde687ce496b7222d9b98c86fdcf37023168f6 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 20 Aug 2024 11:41:41 -0700 Subject: [PATCH 237/238] Fixe Task Memory sensitive data example (#1087) --- .../structures/src/task_memory_6.py | 20 +++++-------------- .../structures/task-memory.md | 4 ++-- griptape/tools/query/tool.py | 11 +++++++--- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py index 371b3c821..006bf8769 100644 --- a/docs/griptape-framework/structures/src/task_memory_6.py +++ b/docs/griptape-framework/structures/src/task_memory_6.py @@ -1,13 +1,11 @@ -from griptape.artifacts import TextArtifact from griptape.configs import Defaults from griptape.configs.drivers import OpenAiDriversConfig from griptape.drivers import ( + AmazonBedrockPromptDriver, LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver, ) -from griptape.memory import TaskMemory -from griptape.memory.task.storage import TextArtifactStorage from griptape.structures import Agent from griptape.tools import FileManagerTool, QueryTool, WebScraperTool @@ -15,23 +13,15 @@ prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), ) -Defaults.drivers_config = OpenAiDriversConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), -) - vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) agent = Agent( - task_memory=TaskMemory( - artifact_storages={ - TextArtifact: TextArtifactStorage( - vector_store_driver=vector_store_driver, - ) - } - ), tools=[ WebScraperTool(off_prompt=True), - QueryTool(off_prompt=True), + QueryTool( + off_prompt=True, + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-3-haiku-20240307-v1:0"), + ), FileManagerTool(off_prompt=True), ], ) diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 81334b1cb..a3fc04dc5 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -198,8 +198,8 @@ And now we get the expected output: Because Task Memory splits up the storage and retrieval of data, you can use different models for each step. -Here is an example where we use GPT-4 to orchestrate the Tools and store the data in Task Memory, and Amazon Bedrock's Titan model to query the raw content. -In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManagerTool` can save the results to disk without GPT-4 ever seeing them. +Here is an example where we use GPT-4 to orchestrate the Tools and store the data in Task Memory, and Anthropic's Claude 3 Haiku model to query the raw content. +In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Haiku model are stored in Task Memory so that the `FileManagerTool` can save the results to disk without GPT-4 ever seeing them. ```python --8<-- "docs/griptape-framework/structures/src/task_memory_6.py" diff --git a/griptape/tools/query/tool.py b/griptape/tools/query/tool.py index 3bc954239..0089970e9 100644 --- a/griptape/tools/query/tool.py +++ b/griptape/tools/query/tool.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import Factory, define, field from schema import Literal, Or, Schema @@ -15,19 +17,22 @@ from griptape.tools.base_tool import BaseTool from griptape.utils.decorators import activity +if TYPE_CHECKING: + from griptape.drivers.prompt.base_prompt_driver import BasePromptDriver + @define(kw_only=True) class QueryTool(BaseTool, RuleMixin): """Tool for performing a query against data.""" + prompt_driver: BasePromptDriver = field(default=Factory(lambda: Defaults.drivers_config.prompt_driver)) + _rag_engine: RagEngine = field( default=Factory( lambda self: RagEngine( response_stage=ResponseRagStage( response_modules=[ - PromptResponseRagModule( - prompt_driver=Defaults.drivers_config.prompt_driver, rulesets=self.rulesets - ) + PromptResponseRagModule(prompt_driver=self.prompt_driver, rulesets=self.rulesets) ], ), ), From 825b4cf095f21f28a55b536b6dc2cec67a6e4f9a Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 20 Aug 2024 11:42:04 -0700 Subject: [PATCH 238/238] Version bump v0.30.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c1a91271c..6c50013ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "griptape" -version = "0.29.2" +version = "0.30.0" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = ["Griptape "] license = "Apache 2.0"
  • c~O!fO>D;=HVFXk(yl#YNcK5+uq9okP&=c`CC_031{>CpmY*ip!! z^Gme86(STVcOF!BRh?{fiilIjV$@SQFGYqWLSzMQd=}hKropV&jY?{okLEt!OD_hb z>?07$wzo+$h}okbSluLJ8wl8;XumUuCcpo$h;eOcLM3(*#7jagUm$5vI6{xLaP*tg zDg;g^u(6Gr3eQO7^nuV+J~1`4ENN?Xz0xoTFIN9FkMW>NCK@!DZJf)?3l_UeK_nX_ zi0-D-j&Z*IsJkyp^6y{u%pbkZ+$Zdw=)NekmqqTbP#0V*ffzlU9&FmF<-Onf-;O$ud8L4==-yRuL*%hoFt)a@J4*)2COMIJS%K%XN7uHOxWo8Y%IamT!n_k z!KrJmA^t=REFXf?k_*uM#W+-}s z_A7ojOq}gc#{PfyZYG_@1kLCW>v<3h)}DV3Z>3IgjMVa(vYU5)y<+b{!;RKNH#V{! zUmH%nn*UPADn@Fg7^3H+M)C6TUjUpe>xgiziaAh{5Y;254t|LP7|J3&(RwPX=4n)YI#YlH%e%TW`kCx&(uSNOq7q3 zxhTF`Q*D29f%mQ^1lwJ&+Zqg5C=bIAFJxLlc9Bf%nu~$;%7qAX3=X|WKXPYgC7)q|L3+HG>L;f0l|a~Jpe$s`=hQHv!y*p+N{3>tErL5TF6;nbK%l>e zaNj)~m$3N&HWgB(u9BHR}ZpCPskwRGOGT^V}6uD*G zKPKvI5U&tB8Yd*RW2j)Ex_{)Xha0vZ)ik#OTQLeyJ3TZCn9N)cbak;f6|UsNE<)7% z^JVB{yl4V>@o~r?FR>`Z7Qk|CN!6eXS0zZC7RXKkTBH7Uxhlh+ZZnz3@rQCkm23qV zQ%lqYb|$$v|G0Kxq-yLt0CM55EsKdsjQnf6o(yArq8{az zt(un~AhL<9Ig^3jEqDAC(ttNsYq@l$T^4-?COp_p-R#bQa5=+N{qMmav}IbbHIY~H zm%i4Gb8xlJcE+ed8NZ4h_X^UmsKUKYrj~!C6ZVX?wz5OKg-s0{P60JxChfLbD(PV( z9nXpPog0D?!SdHg@#_)%==MH%j8Z{QZk}<}q9N}OoyNMn| z#!%%L0vCRD`PZU5ew58-Ndy3arzWrJ^-11(aw?cYW<(kjq?Ks5koJDJVYun4qw z=EO#somG3iz?c#s+SlrCRx+}vQEBsrhyojOjOkLOK+F*$#@=nz>b2(OAv>yl?HH%6 zX0ksb%sGQ%QyKhcuOROsX2P=rSzw5Dj`(n24(sHeafEJ#M4NAr>^T=JP6}GRD=e^g ze<0*9aHBw4!=P>2IZ>|6<>4W}o&Pp5ClpAbkWTsv5r`k@T7S3I9y>P8A7H84tr(}O zENw}4SZTJC(wbB14a zw0rUzEeNV1qvsTx^77VUOK(Z5LCtY^6jr?;*f|2;xA-lIjch+Abo^T$U~7|eMb1EI z?Qee@Pq59r9l@u)1f0 zm5b1w9ef?VL>w#guzctbzpO|9W5oYCP@nn=QCin86u8}#PdT7h{Q`l}opkm020cDfDOS^q;w zu0h%;vtKt3lqu|WC_;C_7@&{79KV1i1oRsBC?ZIA{0|Nkl`%${RTKF&eyVzPODpK1 zGW6A-r(OpGia&G!08&aJ3Y7J+5JN(+TqwhiH?68pLqR|}*0S5-R@jq@L9rz#kzc>=0)*(k@+R<*@{O8PbZER+f5-q#S%XPR-FDv3 zrDEHy>u!rg`o#J_q}E)T%58iyoa7}Pd8C?Up*LTJwJ*N?#}xiV!S*!T2m@VK?-qRT zV~4OR(~1dQ=5 z-#x5Lb27H()iLsQb9r@H?p5O^NHv7|-Zc3Xynpc$4_4(J)GfInHVQRg+FmS{nG_{g z1XARXyv6{C4pUm}4$Up7pj7JBFe}j;0lbPxyFhf;DDmqy5m1eq48^_g-@HrkNOFUO z%Dcb~BM0ga%bxR)g9(|FRXmV(pWMHllJfpCy=+@|WVsAzv=$U9u?-TdJ0r7(e}b-+ zeBE(}OeNTIZHK*ND2tYHlGKX5=9lrkBOHeNx*-M%5DD_^?V<;hqKTn;NoI==8xkCv zXOgn!M-icEjbzmzb1{x+dRcfKURVF25A6Y?N2N2=%(4EdjKF`x{yUNMU(4Q@YWdB) zaIuH*+6tP;7y4J1{<>HT$FCsCSjH#N$PIShFVRd*FhGcVLT(eCV&OD*#y(KP;>m-V zKma{w+AV;L$#47>*IzQgs((G~(FpbY@q9fE6T27Qr%u+DChZ)N3}6n&mOX3Fa0tpR z;vJ7;RN$gm-)y=UV{R-q1-LABe_yYE8k6iKuWl0DiXr{S&t5t&HqSG}8&R zSgr}MeF$b7&raZocu#S22|sX6?!M@_`=YPJ$|BcVLyItJX8cC@dfr%48cCsJnll+t z7e*4FMK!NV=T7iXhW&H|z$cA022GFz)&8nqM#VhpRruis`@KMiMV?1kxx$hCb2@$w zMAdAi?qmGwG!foaWYe+~emd^q6Aji;r5!LFQD8$*H~< zVRV*COv7~5J+e6nWuAplgb|eqsGA2fETH0o$0Ca5CCj3GNHZk9#A;Q%N#~g6a5d?5 z1nG63MuNpbfC;|?Hs7LE!-AI8KLJ($!vqe8o855i7KJueNmZ+&7pg{h^EW^_pHezM z_{21mG_XrR(w`dhUyj6Cy2kVFZmPfmy~5x8}Emh4@@Ly=nmq6)cVi}auwk7Ai(Kk#|@=9z7|U|xhMB> z?>VbRqtT$@LHaF((e0v58j!1YL<#Fxy?6fUoASYta_GXjhoP z|9xw&mI)}W7H-e&zAd(IM=LiV0aSH|=$V4F-;!}JhO7!#&D_!@4gK9jEzocS=&;o0 zwCCUG=Q1_U_ph7asWrxd#rUWP5+<1H3=-iP(d3}y8Uts|aR+@k-4T9_#_do=>Uw(j zP=|A+KZo6FEt!p_=N-6}xBI9jhSIqI$#7F_5X#l8lz9m~(owe?D==APvJvCEvT1>} zGM0-(&{8bS@Jh9A+L6%@DN(rSj6%i^U7EhxgtmjAxbJe8@sfdc30kUHvvqLuD}|5u zeSeQ?1=9kz6KQyvDdxXA$GcfWcfMyvs-2*#~w z{;%3pf*1rPr@bVFj(6j-s9(<*cLm`!7zLIjTaq5yP-Jo0oMZIvuzQaYQmEtFLfKGL zdj!3G+N!3nWf70xaLebrscH!JJumlg7p7sEklk4>F;brz)Uxdt7CP+03RYU~Gmi}n zd<;v7-h-m15%XA3-kzLO?DXk9umGGb-uN^km?$72LwVLlUKh0?cva`V{U)+yhpo2H9g#TH zljH{+;_N^2XsRS8P(E|JujP74ySEiGk3rxt7rU{mb77qj_bFb%C7z%pkd@@=XmGHU ztfZBHve~m`G-~?=#9&?(GWUjV4&C6uA@^P$&Ai;<{eIS%;%Ln4-U_QCJ!W@_7TH3* zj2kAnCPWm|moKG7qF_0hBzUDWZ(j(wx89B&x}JMP|6<3RC=e*d_s`QRbV6;gR2h$^ zHT4;1dX5KD_k)2>x!pi*vt*^65hKl6RnCDc6cNMeWm;S*9O({L+&#;*ih_&d$M*ZKxnB!kN`kBpcbG;k%uSkq|6vU1~ zPz7y)#`&`xfQzb1a&C!0wO|rkD2zkc5I`=Rs+_3JZ1Pv`q7CuX+9I4i z7aTU9OvK)j7K?44oqg7jwA;tP%5DI`Kz9FoUW2amxCD#2N<_+1C<-*>L0F&*=g;P} zdejgs<(l-YcoB_T{4a#BK*8Oyl-`&3WLked*`-YpgQMT%fIG{cDdZD&y%o*3Nwhw~ zMi{6rD7Lp)ZoFS?R_1n0S5kin(-iHoTQ=U%C-LESh2tVGvuTeO4Rt@5IUVgc4_=3# zx`qNwF-~G7y;9U`3_Q01iTHSQ2UnaK24aM@i(|dTbumH*&siji(`2Yf5O1j#ly!@| zd=H-+PQrh_3Y}=@n(QCa8P-S)IrF2k4c@Q736Wt?R&!+|#qZKWp9O!~{77y2%5Ar1 zC2??oLM*t5eM;F5#4Nk3J?0iFeL_aFvsBJpc7iL&%7*7clzdAjqpUL!KiSKE0KCB!Zez4}J=TC!*v=|S zVY4?`r_>nb`c1zR;M+$GL|zH`4ZI$o_KlfZlZY{VS?QA=e2T_bFWs#F4ykf4{oZ_Nq6&3DV) z{(DGbspkT=d62-rlr?m>og!=mA5Jr`+%@EbY5@IK+ok+d|l2CQDN8`G0F%3Z2B!Lur)XpO8MC(=Q#uQYF% z4Z-vw+LDX|nWv6zht=HjA@%ryqr)m>cS??yG>8vmUMWJ*Z35fgi3TO}1GHpk2r_?avXu@-W&g|ExQZ?E^2U5hcjp7Q_sDyioZ>^{ZiXBT+F<<`569epb9* zKEBN8yiFr!7qooaJIs#ugw>Xe#1@#yiV`tA+q^a1RRCQXMy`kftTv>e~ET#Vr6w&&9?l5P(EH&mf~u-$DaI?NJJn^y(Q*}0#Z;ncgE}g%#okB;1?3U6Sw51 zLmH^*u)1S>0xmi<0SN)d8BuYD(wkw5H0r+(SY~zcVTJx2`j=cExUSaz@C8%Z?sEkf z09HcFeju}t?+s}RJoju-0&ovr!A$jT7IR{qp2wf|AFraz8}yY*gPl+dc9BcY^=Db| zcRBm;AL68|-Ej{yt6x9y^(W@WpZgPJ4mOg&FRPY>+wM`dWl^XBNo+&*uu$W4je@GMB*s&E}+Qh^AstM0`(37{`Rvk7{~y8mcR8 zY!yxiBbkq=B`ib4oq#M_Vru1ok>w92wHv|X(Y6AxV z01(*$tlP?e005!N`WoMxg1_}9CdFpK446rf>0NDN4Y~AP=|M0t)?|F~KRC9o&)n7_3aK-e6yTcuc)}m%Do5F zhUFhe&;;xvVpJ(BNmd?Ut_MDFiO7#ugH-jgYVKN9JJb?l7R&-deZNUEJgi`nv23j0 zX&zf)hf{Jh#VHON_(WUd3W|G%jMToyvM?Z6JlczP>;RfY%wNxr0n5j6&n_W1*qWb8 zqf{RnS_34g-Dm}2`kv2>j>liKW*mRmk45C6`dhhoPD$*4oR-~9OdQ3P9#QEaeGdAf zQj(ol23*;}{Vd4JCS$Zf+VrX9-EOIph1A)xJ>7rWtc`he+7@Sp+CPB9(zZf=Q(v!n z`C`+Y(1tZRXMG-~i>*B}98l@H|I3je)3OAn+wkFGGF}GeuZYv)iJk|8B>#`e%P~abZtvm@kyvXLHH3< z@NB4^!+YRxt?Pg>lZC7-o-pE?_OM}d>b@;`7-D}tK3$8GbK}rI6?%veTBLZB{-5Oj z{IYVMSGzRURs&*|FirUEjLhcEb)J+OtT48Gl~&z6lfE~tI39eY@VAyk(GDD5!>$*v zZIF7#7++w^zKnFNddhKPS(B+wi$)VR$iM`cJP?S2?;7Zb4JmX!{IkenyDdw5ScGEM zBRmO1y~tJDDyRLMZb1t61X*XRZn0a+>n&!$Sostz;R8StXwFo77?Q>?^bR}0w3ncR ziXJs#?feS*dsJJo3rh$Z88-6b+PYMHZ^qxSBbX<(G;a#jVLtjXc+>nZ{T04TyfJf)VJ;OF0!wg9cgZh9igh*fp_RHkKbs&M7OeW-J0uZ&aj~ zK!%YHK4-Fe=OCBjxUP$9&8sK3W>68>(huCfEhH;DgRvSiFu!blY^b;dmtq&-~}P9mY447M?AmOkx5royY__0Y;vz!cWXbQ{igy<&6Ei^yAz(`_IG3hgCXk~|i{2kz zJJ)Kng%4Sa>E|S*!p*Iu$6sy;J~q^{wUJOq%;n^(J|2RNR9hM(`vTcmK!F#4!fpKB z$Ys02zC=AT(3M*-PA=u}=Mon2{XdT^W|^Wf2pJ%;sarR#Oe+tR1;Hb~aM=L^mYdpA zU&gHJI>%ObXNH0~EfdKJJBKv9^2BCskGy^h-YspXAu~QZ42?qtmCK-+ z>_#VSA2hhcnw`St6IvAFF$a6?cJ#}aMaN>9A|(jEU^*F-SY zm#XDGknJH~%k>+ec$v$c!7$V6B#$uov}*^fZLOKsI<0a)hJ`O}ul8%2OW z01t=z5!L)XxeJ;f3YSEO;MX=xaR+)MbwFEcaMk5Ga3=i!O7(%w%twWqjgIvY~nVFsApsZ93%}*Tp$+2v<_P z^qR=d6njdD30`kmGVN(^n+oJ@>%JU+TbXQ)a{r@N@c)|m=8B}@Ubzqt5{4%= zKGpJC;KVj~oTLy`*uLK==^YYI_3q+Sow%lH(x2-2c4ve2lLx!KkSp(ZJgcdbCPq>- z#je!qxXOSu44;U0nv#QXY@celO-`u04Ah#b7+MZg!KZUGI*B&k`DW2!2|b=;+v#%f zy^#qHt5x?xLFlSL#c#^E( z?dDgN=1__5dKfzO9f!j8x_Jao%{^Jq zy1to5F-+aB&y}NU3b{rfHdLEwz$MKN$1`=n_C#>3z~U>wy4l7kJgor8yH|h`Uo-t^ z>}^>9?I8wfnnuMb{DC@_F;TGotVF)Fg?O9z0^7Q(=X>ki)i$$X(X+u{z&jFkBh=OI ziGFk&x(-|48`Cz~n-ewKB_H;5R$avTHiXQ5`UR$Mr&5*w5BkOEzs$Y6l@lwUH4EsM zmbqq%i!iLp&W4Yl;5~A=7fY*QZ&Bd1``{@3!z61|jECkL*OV@|D=vK%*p7h}k2h^Y z0ynp=2UmIqK;l}%+}2rKOp1fsfoO$edT#MiJyUp;SQbK$FS+0d_7eCJl8CiF>!841 z*ptq*G#P+r&8*)%Y4ub+RNSc0x40;RT7hk2(j7NLg^FKteIt5vqF&%7E!fl%nuAB~ zy`^NU^pwv!pC>Ba4>uNCpOe<}vTq)i+#IAGQT{Wj!^yPnwolbgTr1yTsBpDdV`Swh zPL&=+-vbSLvqHT#`RFDvMK1h%AJOh2z6z*PI^wBV8MQu$*C^Rw9_Qy80}&BA(M_$@ z6@0@FAEPtXb(hAzW6PyXS7f3heL!Q4rJ& zz7qkCscusl(a$+Yn<>D#DrD#IYs-l5eudY?H`Ff)9tTAc(VE%&j7JPX>V`+WYS2=- z`KN(ESmaa5ad)CsKR3sjcl~}PQ%hl6-STO(lpk}dE$xfHgFVqhRCqSN-G$|LVL8=9 z-`JbbVojVzIcvX7UNS@U@(Vo7ipL2zQ~?lE=~Se7`sJFt=&` zH^*~cH`u<=d7#>NF%~$W7!ysGvng>bZX4CHbH)B+SQNi)VOV~BC8V7$#e$wk=KM^{ z%un|{*b@{_WvDzWAW@Fo43=@{B@EmKfa)_3{+qVs*d!Jb(@lNcB|3uyrt`8tn`a|Y zK@oo0BcqV#QH9Tr#n*wO2PAN?X#Z@qbTjE>C0XE^U~;IM`{5F)f&w;FI@ntOFuh8J zA>I}8IfMAqWS&QN(3f|2`+%g#gjG${z#h@zx~RUNIPu^o^jt7nS@$)UeJCKfo%Dr9 zLQl9?PR3PW#sjNEldZ(>2b6*|i0rG(&YH=g^j&aZkMRnb#l?GbFi3lF>;lbnlQmx# zbYT7L2g4vVD}UDthB}Fv2ETj9Y?BWk0|uDAP_rlIAaV`Br|etX_b??b7nkspr&o3+ zNEi3;>x{XU3}>+Jw7_JM-ql?Nr}kU&b#TP59Asz%)|{NtZ$J3g<(IBRoHTIQeDFU%1h zeCGGDPE?$+-$Mz2YiS%r+4G{Hoh#(Pg<GdE>vz4wAKCC<$<+b3ZQzTa)R-q|qv7!vsD? zHY%{Ta60Ii$6@@5hX!ePhnll1n>A77IoFC%Ep}G8bp0GmcF3*Ji|FHgrp$bV`A@Ab z2>GdE?O|CIjdTDZ6mGupAwgClYg};&3A#|fTLED(D75}&1G~3Rw%=&_eLQl5qBk== z|AOy(NCPR;qco1 z9j;4O-&o2Z@8DxG=Sp97?>>GGJn3RS-}RDWMu8xEr(xM7prU=D zU!^C$%J6OWiWq$es**A<;uy|fW-RENK3bL*?*nMSM)Q4mtvOMLMj>J2V z$JK84m94N)u%_C&LsSQW@rS5=^K55LZO!_!Q5EA!eeq4}3WCz3;MHFUh4)P6=h;Es zI+PDRg}~w0O+7M=|1lR{uUA~G>o^(m$}VMi>1??)xw=5ht?ukog=7&*Xyt5TryjbL z5HsmX%T_J4xOJCqqk@&@t4tgM9Jg=Pwz@YGw1LN)@KF)sS#KhFdVE(h5MT{(lz9LE z5GVnx-^zag0HNJMJB-t%N*M_x3JTMvqp>1_uLF&4axEW7Jxzns`4o9|u~$&q1b0)F zBJlgUj5e>^5xrxiKWR)V&HrocD}oYK2D}Sxhme`r-5`I$R!Z}*gmtr*NDL^Nde-QYbT~b>amE=u&-Rw)v2XpYv|E{qMwCuUY>MSVTfM zu5D;CFE!gtdblai9ZBrK8hgGUo9s=3G6#=>9meNX#b2IWP~Teu3)lCh*m{Z& zJg*Skw|!ck{gDyarFVJx!S5SyMCa`>rrS3k0aE}4J-1b)1iygKl4;ee<)xe`24A?K z>b?QY2`1?e!9{*Im+^F;u4E-AN$K-#`l^ma9CDxMYsM3)*^&KDB;1S4!J)fh+4uyU zHR=D6UEr%%SMxyZ%+VzF%Ogw;AAcBo{Oa?OUm9+^Nl;w{K6VGF;Ptl)iVFm%TI+l| zcEyRsk#sDU=hsj6DdN7fX8chFew%vBtT4;yk#au-9wO$nzQd>W^L~4UT*#DLJOdUk z(yS`~&ka6bEMwg?1&FWdkMcis=QmeXctHU&MZgA!fiV2h3@i$V@$^^B`P&D;q+!p( zay>%yat*hoWL<4e$Rgh``WMGFnPLIn)Pk{jMq2&nE#ca8NHA=eGLGx$7BnADsz-Z4 z)5Gv=p{)Oz&tQ3$eAAkO0+5NTI?UB!ZL@+ueAJ{30&5JtveQaqTHk(u7D zjfPXp3-2U!!3KRWWBhBStec$3OBWuSwSKQ@vZ^uaYrjv0Qy781gEC&@>=c&($ky>| z5h31c6X+oAY|75^1t+}t&bB%TxhA}#1sIuv79T9Cg>aoI@EZ_PJIjV*8Kl=eoV`{Z zp;-4}as(-u7if^mtMhRBGAU43rYgAPYm_lr(oE49h9&}~?VxZ=4G_E+X-3lXA!QkM z)yp|Rpc*`o|8(ww6MNR!<`4DG)AYLjDoOO4IZBJRL+hCTz4qPT$9ULZ-F!bEfw>yrCTEK4+cQ-=P#YMZ#UCpWd3{Do z4Sl?>wrYyO#xxRfi}Lvu%y)593A>}-IZzMq_JNol$1R2l8y@K0nAL#AY8V)%(>+?^>;qTx4ig#-6MxQO zlIzslW7@h*XRS5!G@FUVOCtd22lYisJ*hFnblRK2Ixd~tiRsDCtUAXcKaQ`o8lhM8 z?aViU!+-5sqMAT8kBP?gjibr$!{xNi_K00Z4hN2mwjt>qf{z4)LT@b5yY3m#Y{?HO zf!q~l=p8c!q75ZtFDZ@AF1Rj9nH!X@S0tTom#{8zoAE*=p=<98(_lbqS1XrQsK1e2 z)Puv)F}fw~$mub!e5~&ol>XTar9ixyS#-e9htgHSzNGk9tb~?g-B}sue;kSkOfu$E z0xd45?$28D-;*%G-ew}Lz<>jt%hMVO`13klLkb zDp!~j==PG25MB`>)s?HIAny|X(ObAS;Q&FI25{>5S4F5Iqx^1yOTLZOq3|8G_NEI% zVe17U6ZE)z7@HA5V+_9TM@hV;9diE(2w?&pmuIney6Sb;D>0Es;ss82&hM{-=OZov z!jC}-1LyqDWZ20A;_AKl`>#LoF~5Zs04&=5Ef3+TB=L(9`v2+AwJ4481ox<6vU#ox z5wIXdbNGC<`zpgo&xPM{TdkwAO3_j?QNxe^-e2gJyZAZb((@cc^~rF&?P>blMM{)` zC(&{}M&Cbg|Jm;@=nudQb}%)+tI7HgvNMY3(8Q0&7-VkiJ{X2%ZDb((gtOhw;eYQH zPVmbL+5xi2VE$Zwmz7&Geg2AZg!P94NUgfX(m1tBkuIhXk^gu>qaXU4)gfdX%>R?O z)1OtDEGEdM)d@xml-c9+vP-EhN0$NYaS80d(J5;ggoVJd9U%a#tf^ElwIYGRMA!hb z464`UboWuo7tlIovw|#22BWc}dehX8Ui^_&K4J9Ur6ZA&x4?W&OBRHrcn-c~1KOaz zrG@BV*l*X0uqE~;S1U=Ln6L6cy(?4jnV^EzM-N5}bgP?btzc77`n+Q2zc@S0)2_2)AUkSS7c`RkqRWiQI{jNXlUIb_FF!GsQOxWTWvawyeweGFf- zL%{INu#|DK=6<>Rw21yEkqQ|n`tRB-mk*;F2}2q~{)Jc1hKoLJmsfQ?mO&|EdusRt#5!QT7*>jN}xe+ONR5-Q;8jh^)_0EYTAK? z$RFpgtXbP%^~>ZW%&g#s%3-Wy z@j&EFqqw4XGWMf+;j}*NJSSCq(O>(EwV655%f+vm3G5NUMX^LcibfXltZ!}V!Zw=$ z?m|64UYg8m%RY|+dRortkpMmpr9!s0M`pzPy*(bA+_oy#uiXJ<(h}{SZj9Q3YC8J|M z$sP+E>y6Gd_QaD3piP1QxY7Bqp1!w8~YP#

    `7d@x~!3Z|XQ|zNDu0HTFBW$`pzp4ya(S+62R^*Qy&4M=kgj=7b zzfLlGkvxx_OW)m1)I-m16{LC#{yFJ+j44 zsVT;}F^mKx5>jF@?PIR-%_*F@Wa`-R^0W_4Qm`{8O}UE%*no&xS(F;8nBaqsfrKy< ztsnrgURO%50{N*r**=R(=n>Ef)g@B#ls|*L z&A{O}1-i=#^~A3S^28D~zK%>y?qV9oh; zIBM$AuGx{9M|FohF02|7z zK`YK}`@yq1Rs2DHAWx608NrQJdCO(!VBp_g$t0GS^yO6%BoWlHhR4{K`M8mx^DlY! zHb{4}Jaw^<^B94HCd@BELR?#UUBeMzKWH~dEBCg7ILRv>UUXTqieIfs4Yqkz09*my z-g@Xk9?$CT?PsshIe7B|hRFvf_PX9fXFl>*U+bA>uF|=y-cm*v?||Vv zrdrfGdAves;>^kn^0X7sQ$y@{{g>Sq*^&6b7+`|rv% z#o6%yLF?C@n5hcOC1G*~CBt2Xwy2jItS0!v_~%9SxbwQ87(C9hTQGrIkKM+);k9+6 zE4O}tp4PI-4|7^;SXA^t2K*7FXmKz`D$ko6{g=c;P!qIUKacI-=T9paxYBY8N@E7M zgB+hCf!L#L_LpHhJSzvDE*A1akc)9~cYBNT1c($Sh^#y*l>FL%@@`~X?DZ3k`5wiC zb^|D&oIBm*hjHbT=k9y|5K(R{-JT-Bf88{Q`h*Y_wZZynPoSukl!J)N6o~hqyYK>0 zoDD~X$fe)_kgqN3?~qrUN3*ZS_?yu1e5D}nVjRu8watFedD|Hgp|QmGtKYEd6?rm^ zI1HKrHMeIPE~5`)*Uuw(Gzyc7@s2hH zdMz8gCOlURt;9w8_kCe4*nPGKl68^tOq-a@(`ZjwkS!?@|AIO61zW1rD@u! z(!wOVzMoX#(R07L>}XJfQm~3vh(bG&74tiQIIj2Mk$r_)9bGwlfIy?aUu;DH{D*mm5e9hGx?lOvkMsdR_D*5aWieq`w#Ap& zKeQ~xII6`3$T^hMNlB0jFB9b|utN{$Z(&?a2~Mj#X}ho47cnrIC3TCcFpI3KV)b5@ zta#H#rshr|<}A2q_5mU)S6QsboLJP>)TqH}hs|3WAVg|kIG8E(;j@f}JOUf%!7Xcu zK_X~V+uaDDKpz$Afng`!cEt!nl941u2@G^{r2v3~7b?{d3zUPTl9*afwGQKh-OR~s zNgIN@*etYW*1pmrb(+xVe(AytzY+`Dh!4y+NV_3FW-IMF_G0+YKEy@W z0J)1cD<_){-n|5AUDKw=0cE3)H@cgQMC{XW2IM}wQD(r45$6TyG*@lZ%l=PLdy&3p zGC{WnD}<;|`aM?R0cmU#iC;M{ubtEle~IEr8YLv^2KHzU0000f1_dRg-1R>b3Mm|$ z)*8S9=Dn*iFgY|ZH!wFaH#IXiGB`FhH8C^*fB*o^TqU?b1YiF0?ELdAsC@;WyA5|d z;KVLz_|a+f17H9E0{{R60009300}RUg_}cYr2qf}000965C8xWU;qJ60028-IEd}; zE&1m8|8F?^|NpvD%tTImpDB*KyOTGSfqL5qH~#UD(zF8YcS?}ZB~?{a+=Oux3oI~H8)klf^LGMoR*&BxLuI7j%QOR@ht)exJI(xz<@ z)R3Jr8Jw96-3T(J4YY~)P^t$lLH$)@MusNwVSh_~>J`*T{SHoIPdDe_S5KlqDh|iXAQ-WYlOKoZ~ZpExH7Z*tH@9#Jlnc{9Y_P8VxB&WX( z_|R{Yuz+?bb8&5k&kF*$Ex$g{QB$ECkJ_UIH4ffwf#=?O!h36z-1&U@z6 zxu-3-zTGL>us0D6dUj=FVp)lcKsasC8j9qwb4dXJcH?$aIB0epm&p*oI!MnCj3f*z z)(6CU!}k1urgQV_En7A*gVl#0Ur-df>T6|4n|fv|Y5Hl0omv6DcbkdC-_TwxeET-Z zui7zh)kWelJ?GvoyQaE(vG^LEc{BBY#1fkK(dRo}@g#uQQb`FEi`fRhbixLzpRq+E z<7n<#>j}r%>*ds36|e8C96GA#Hh|PzU?6hVwI#EdHX)%C(M7v8UWXFOCm9s`tot&y zv54Z_ru8Ey>=Ycsc-gImQY=E>{7h*O6qe?0HO&}s!l3X&_3z=y&JceE{;B3>(h%fO zK9m{pKFJ+2u%Zw2un}S^<|Gba>u9S5;y;GziIIb80JZDAn)>R&0OgBIxo%{=Y=LJ9 zON1}MdvsOnL^BcjCEUxrcuBaL@w0pQy?DgYHPUcJq~&ecA<<=uVlYin;jGChec@c0 z{x9p&iw+4A9WEaAaknajJeDJm&3TRPs(~RXt@tR@ZrWgJ^(iQD_Ouh8|50D?n+fki z@& z-n%Bw3?q_0B8@8O7-+OEI@_&fTo)WauWpf7!S?yT-@p_)J*0(5TA>J}h&5QCSg^ei z*k-wCA99STx^vcx6_Og6Ikx@~CDtKQ^7onp z7TT2&lZqnBpv~ez3CYo}(9BN>ADwfP)-+GX#Qe@`nd8I|Fv5cW3lcX9W`jvO;?xy6 zDJJf1@?#zzJH_bOgTY(`Ay5^^>SrAIH8LSLsc#%}ZVu@%YUoN0F4Q8AuB#ZIdvTG#2AL9Ecs z{xe@>p)?^TS4U}TP+tDGf!>rYcnBlYe-{Xie#>8(n3e`4Bx&S7ZY8VFi!oEtT!(q) zS*5FPu}UA+Pr|Vh>0NXhIAp4US{&fZJ}W(?J?0D@SW(RUxG&tST`;H4=v#($9hXzbek(u1l0qSjPiV>3uEr|9v@ zLhTL~exg<;dM++E^%eJI6nadNjNSP8@dGJSTPVOAU?=(h*7YzzCSe?$i%8vNql%Z? zpdcvzd4z!3#1v2t*aHoRd2h*#&wCD9xgpq~lQ7F4!67soK%u3l`8A{#O<>!no)nzp zVdG=+p&!ZcX@U%3bb_R>S+X?_HSZS9$LYrR0N*I_`D*e_fMnptgm*nu?=5{bm-D4~ zvUT)${XB~;4ZA>~MI&K$YFXLDOoy40cG@zz7Tj{e_!-vUys$`UE{d>ulZt5-|G>1@jo9{;A9Ivfoa zc(f8bjhl9nK3}iPF~9SOlsqR@vORer-&7tvlNRs&3XSdQfN4bPcyBf7e4LPt@oZcQ z-tWz|gsIk}0BKxeGBBbK%j2>Png$#du@%TOWB$ z5b$8*fOhWVfAQ)&O;pn0&DxL2V0}jb(YgM>QU*6ox~QMmSx>n)#DKOHjH5c>mNRIF zWorbP(`wy1$a9>@&SRY*ENRU(M=6Shf9643FSl;rv+XfE#VdVd(4#GNi#vBfL4GHe z-WrSdu?>C%s!C?vGF~$jX}&vE-kIb}eKBx;NCVjtPT)m|BuS6NI!OMFDXkZ44+wHI zeJ;-4Wy{>1XWYu+4KL#Re7ep^3)az}9C$=>E5 zIc;1Z^T7pZhYdr?E>F1VtzOMcu~mcgV$$47s>vVey)|2cMWuQ@l#k-N26}>rmv|%Z zo*XlcIX7)Vj=+Dez}=58FtMe}_S}L_ZX_Bxx3Nt{H)}fQ>)v}X=Wovi&PDc{=3>wx z6OSWxdDRxy8=w_lV)HK{PV@bZotrTPVx0YoP0Z6}0N#OqS(Qp2aa&S;D@_S?Z)m9k`e8Cz?hQuZ86>HvBuBS46Lh9?y5pxHF^Jb25S(a zd`*US-*}+>CaP7r0xs&2pq#Hgb=?!(^AWc}icX+XuMY}Gd{#n6nzmp&HiwY&oucd~ zqI8TcOJIX`)Qp+I%5PRYk$PJ+>6fYN)>Z-6aZcUE&X`OFt8hRM>G$XnRI61RROrIE zTz_{wradQOH5cXl*)H;V5*On{S_rJhI!Y?*b<%JbEvy=JTc7L?woCR*RPOJ($pc zNn5{!FX&x-68V7L43bStTR!8UaC+}U{KeHfI^tApfBodYdz=QbX5~HCiQ25kTW=UU zyjf0U54v?zgq|plqKloX%q>@`GvlpvHy>yp5czOm(hXsbDroG>@>FCJe1D9?%D*al z5=lqZU;jOlS2yH;U-iXw6;VX)_@muD9=tP!s5IIoS+hgM*A0AF+Zw#KOr!xXPVC8W<9ay^OGarb4%(HM+;JGb$*CJ4 zt}Xc;18EQG84qspTqlwV@&By_i?r-Sli^{t5#n?$*IR~DOJWn=7V`YLg}}edb*!|j zRFB-Qlz8K&`0qbAcM`juKxYxLATDKJ_kGz!xN@o#Y~BV5d%$Cz6Q*dCfhowbDbv-u zmv0Jcp7g!?GE3r6z6Lp9`=4Sz#y4)HYF^$joYPa*XBm!e-s_{g@$7M$Ne;AUC+E64 z0uq>N&q29{J=f!?K+%<`(=p~|ig%H0swH+zApQo@9)i0}0@%k7F}IZnanQ4Vo0Hh7 z!-wO;Bw6)NL=X0pI{Q?7=gRmx28c-9b4f6>JpdhRLY>4fem}(ZG51?EvV(4*HfBcY zqPb|~N#@G!hRQg&`bB(?H(H^#W1_q-uQWB%5J)*HYOm>vF#iWMGjxkz$pVx78yRE= z9DcQPNKQ0`_joDpJ7;l>SRxm4=cj>?Exgw>Mt$VD3M9;B7y#cMQP8&40nAxxt91EC!+N;7)xK{z^Nl!Z2I%@Fn6#lk_MAI zFx!18n@Q36oTkX4albFEoA2Q-J}zk~R~%`}lU&i4yJjJiwNgmkEdO5&Xk@FBfB1@Z z|9?vaSHuN4w=vVJ-tJnVH7*~~NF&FPl4ztH4`-IqsYI@%cbDK`C3fw2qJt4M6oCC; z-X!|U{vG4)=|*zCOFj71 zd`!%N==p>2<^<$WAvf*t>jNkd%0h~0I0x2=u+fy*m;Hw&d*g)a!Sj{gI<`sQQ&ndv zX~4r35Trgmf4aWgd8@OO>vxn-&Ipk)<`U=o1#pkgJ{y&>$yyS0qzby_O8*RuF{4O+ zA?l;dM<=jTZo9-aN%Y_R=5x%YTbv(>y)J*bucIP3Xd_H&0*Ph&#VYVo-nEpf{o+Jf zFKgmA-`K4@?o4ugar>vy#mEuU5cp)}l2qU)(J}OeZd`cF7?;+2ti=Cbrrm`I`{+|_JEFc(7Ki$mBAOS8j z`G)0$>V8HoUhYK;d`j$~POT|Wcy+C?SfkB^HCJ?^8**~s4w|j}b-AIVu1GHU27H~b z9m64bED6w^5n3Da^Mt%Uyi5Uu-jy0$(7RNo5GX{msP0zJadr0_ixvD5k2hWnJyPZT z+=MO?SX%qhqs!{xoP|w_rZ{@dMoKE#p4;NWm@r3j(dc}DO}Sl-pYZ&=W{QkR_1E5V zNCxT@@{nF(S`^1Yu1TBy>IZaXTf4|avps+| z`?WQ%m}fmiNIy$gdusn1QzbD%r@jdOGSpSFYny7h({6opA4;D!z*2jvtheMGIB#I& zsX?O=l(Ux8&}N!vSqkq4^m?u_I62oPJu*!s6EI$5uH!#iU!!i0M(p3P?r|d-&vqO) zN+YBRf$8;ixV~|9IxSgGn1Y~6(eM`anQs1&tuGRqt-a{FqPj*h#HL)O%X#C22x~_B zzrH{u;$uOf@S(swfyF8MaEE#VWl~@T1QTE!TnzLe<690w2bv>WusLGM`S%uimW3r? zqR6tuK^ok5;OT%917!*Exjd5lgZXJk=dDtulBJ4DCRUcba#5d@kpZ&h+T6u85}O}> zJkD(}o`7N8z}^i~tO(x(F3WoQNr#<3usi-ZOFHcR=Lf(gZ0jyMwt4q_& z+FyLFm#O-Pk#W~CGkop&nYHj@6(5HIn29}{X&>WK*1y!MWpGvm`tTj%Fo{m|yL9#W zDhv*54F;(+_&3pq16J27pxFlA7fxlT?$X*%N7X^gP@E2wK|iOWP+^o48q-CsFxEZs zW+_B#TWi)@Of1(D_q-DVxA7UeG63#}P^hU7vn-#Z4w+pXN*>GuvfLD-c&@d~G$}}s z@%1y96`)$rbMVs^!_NMK>V~0fPZe`zcKVI$wgg_uh0O5gCFS#UzWRa;rAyS4S^N3g-f94W7x`tj zYz5Zp1oVTgYrLCVj`3nUAE-(loFLAiqavdd(^kWH0iYD1ZE#xKNVm4Jp?BngeVyr_ z=CaZ9t0N4`xpd}9coele#R1(|K7Ia70x}X%o?&HWc%>)4oF0S|& z7jIW3nr%+_|DSYxZ2MU&0zhx_XXAPWj0oZ~$gNUA@O_@lseVuB4i*Ha34=#9N?P4H zn)}T^Wt8##D#&XzkCNW-Amj5_OBb2P6B#L|64TLQszHgf8t z_+sq`ef8i4)d|9$#9M3xG)ypnb2`8(zeOB}Ebc}|V5fq@8hNIc)~T}bC9aMxYadg+kAdfS9E*W^Zv8XKF?j(X6ZFAG@gOhuMG#E% zm`uPlbd@mPQ2ugl$L-_)h)vOAnKP>NEjEH9fuIJ_L^GAxz`Sej=S;$jAuiW*48^c3wEF zjvE$X(xCn3B-hYhE$TcvX4_Yzd!>RPa0Chl(w#ZekXz}Uc3tY=F-lvXXWYd$hmr!? z{%TkvU&8n^5Uq#w6bzNk1SKfb*Ee~(Q{Aklq+@zsMeUech{%&B{iqguyJ=- zW#o!=h>a{lDTFm4dF?JKr4WHFw=v?t88V`+4*m8^W?w21M5n~=BEmdiNXXrxCD9aC zcE+x0TUjMaE~w$mPN(jvEkU`|CsVdZ)sJ4JODuk=kmm$D4R@zQ5+jh@3JZiTxV@Kb z48H#YX1%F=>HEMvKw27IOdP4rm=N%2b1@|P6NonXi$sjH( z=_o8SGA5E?c@-c2I(Hj*uN! zjEBZTv#*2}jtaI@D%*Tlg@h#M@iai)HmJM?+cp-w6(Kk5kfKqV}+qvq% zRLK03lsvLdu7y=HdhdWipTyk6#ZTTs4{qY?RC*8M14#8l{xWvpeBW+*Y+5=2W^p`D zV+PEOd@29NS$4A`I7svZ1Bfxc%v*w+ED#LJq|oMv)o_!4sl%4VPOY!9QGgu3$W^hJ|iJKB{UT zKxYt*Nz*t%%JrvEzdx@zOXxySWugX%ub4#kylVmAH7ocUF+m{hhCAkQv%5S@rmqHM zr;tB8Ns8lZ#T#YShgAvGLJFqSm42-Y#SsuDm^hYP)@H)vup;f6YYTe;?l^CzjAc@yMcP-L*tL9l`Eh&EA`sd@z2i01YNp+HVD+qN>lQGpV;!L)wu7^= z>Tn#~JLt3r{56XZbogME6)#_jRqPQ(=kFt2YOsza9mlwWAQ``m2ZEw^qR&CdP+GEp z?JQQ~S~1WYxf0eNy?qrBAW#+3{)w&nhD)^zuelovI9nJwyq|m8yDAukvdos)OgRdB zhrw#&XR?iWZoSh4SVmio!=UV&74-Vzo*s7**!9BdE=mlHUdC84;Tir&&ynN&jJjF- zq*0p3psl70X7PF4Wne;;vRH}l)U_ARA5Onm^1KX*ylXg0SXHUS>^sFB^iYI1T6Fvd zE+kL_@T{)rzo=uBt}xgE1WVqFZ7==LL2Bm_$tZg!*V)-MBowRNJc1%evc}_>iz$8> zCAIm(MyqM)HH%pcrkB(EdlA%TGL_h`oJA!9fV;Fx0f4R0t(}W67Cwm7XiO4^Sy}5g z=mRr3jp|&$(+KFXX9a8q`Da0k#}v^j0#ib(InX`7|_G{N(M^CG-lZI|?AzZwbk( z_$ik>w?*^SySqDyOojJMl}f4mhOJYsbU>rgGM)NR88x8{y*Y%eH&g@LRl4Gr!})q6 zE_ZF{WGm)UWd_OorWybknCsZq`6J{6Lx?3RxKidQ|B$k;vm85VMp3U`9W3yR)sbp3d46$uwh zeV8b&JJ97u>N6#~&S3!+3Gj=B)R765d%|dAvm)Rx0@*P)fa!ccJWL+@!l_zL04Y#f z-rx9*oV^pS29+M_%oCqCx~+eN35B>CoU<08KyHudfLl(`772qDEdCZT--txmri8}A zWJtde49zu)0aO1|1;EyRw6BgZy6ds8p_Q4`7n&o-{Z1eKh>NKgk+@QobWvB?KSuT0 z$4ob^@C@ldjl!0lMp>fr)p(jYJ8I?ky-1l=i0W584;!nv^b_{Q3ARK6KSYDZszjB) zwwMxx2}pCs{;i({{++<8Wm6D-tebYQ$#TmM027YBTBKaa4lxNt0+&htDXczELdP~` zjxaj$bFw&V?2g?uy7Oxh)IL82d|*P%sntVbpPxR%%0F*t@0y!7`jytS9LPtij(hhO z;fj&^T-3Eka$N7E_6>}4=i8oRaHjtp3`G)QfgxMy)0FB_++t@^`#O`m#tW+UJ~Y$N$^AdD3&jnZC!@i zL&BUh@Tz{u=)jb+I}p*6-Sj*|A*D*pUVjcZWpp{6qIOUpsR5Kd%KSGfoU!WM<^_05oma zWOK$@YnRJ6VoN=w|MU2uIx2Un5sfspDwHoTizSk|mz*eUyVSs7hnU$2q%d`RkJ!U0@mS#%dKxH8?6fGe42+|_;pI>*t< z1-wA{PQROT^}bq{_pd|BNl{bc8A9Xa?c!PNK=!yk`Ey4C5s=;QPj4E9-n$PcTG}7O zak0*Ri~eAo1vE{i3`S`#?vX9{r{y*o6FWMnXnv4qQ>pGEGIR`=6MB`dn>N9qm1$}b zQlQ(baA_<@U7^pFYY)REM%VacO1wX)drc8UG!#J%R=|S6#%{j(IGGO-hL%gYXB6V{ z--0q}{pt(MP1}NX>|guRynt)geO;427Z)jB`6+2k=EV{@7c90hv_<=mrDIAR2J*jH zKNGfOE-e||;qu$l(MO!p+2a$uO;-tf&I1d`KnI`kN1pmdNFFQQH)q(ku7APa+6S$c z=?Qx3nopv;kx09=C#sA43BPc*J7Z&xG4q&52grFw2vm#>hL~#*Gd8Hj3i=)2@f}@h zvw1GWwuTkap5$D9R%jPc_Z>Es?H7{zcJO;94u5yVM29}e0p`t;hP!F$M&1fNhJb?* z3hy7nF#;Rw9z5FT!W|o_JOqRN!tP8Qi(GuqT4RrKC{Brt%HufMt$P6c7OxK(vp0AAGq&#-#V0l)PotHqBeeRl0}fncEgI3{Z`3|3pOMY zBp^1Udu}?zFBmnHq78R8Q!7oPfvI7^aE8P#51ZoraeJ8Z;N4L>GG1&$tr8r3gb)Gx zg+z!xz5i(9;D*iTmpW|4G7n*I6U=dD6d@zQH9xy7SSzql+pMzTV@iK`u`PG!0MxiN zxuz}F?{VsLRlWEtXD)831sfmae=j$>Okf&1;BC$1T@>6o>f!UTjR!6t*lRU794x4H z<#rCSy@nlCf2J8g+uUh?f>-1O<4BRn77i@Ep-Xx)*Y+T#S?VBeU520w3@EjgNZ3)4 zXsM>x!uE|6g&jT~qAlzI0!VtVZ*9=_D63<{nAHgW%Ih&PJ9S}Kw6AMpJztjT&lH*1 ziKHY`6~V~jeEk|T3)d2|fUI)SUeq+*$Fpm0iRMmVfm*%?0mG&}3_W#Gi0E>nK_c+d z{LCl&iwOmI^QrC^gkf%L(+mXSrQJ@tr5dq@R^-Y&yZ~a*6U~6q55Iam2qIFjnCeOW ziy|b)d|xV-nC0wPf|afLSU(=Cn4DfWqHFGumD%VG;J=cCv?&mwVz4Qxm&V4*G~Fj- zzND3zW$q$>!q{CD8UX}}QNv~E-oxXxMC~Bz0*)O3U%KOTrn#NngOU+u9AUbXOm3I_ zVQeQ4@1EZ_%yH*pA4Y7DoMZU)ns4ePr|%6-+wwAvM73b_YGLo{#0K6}JC=u+tA!Px zbYqcJ;kdaPnX}I{uYFIpa+_(AmV8Uam0Ry=i)725FM3HkddoZ&{}Gw#!~7|xEoUxD z>H=8*!Kt9dZ1dVm%HLnV>s`dsrE}rz3hh*@+sWWpI9i=>)2YqzKgFTS*Yz%?BF+z+ zr=~!`plN2k29V87)=t!ntzXWXo>=o|vet|-F^kN)$CsGORXqwP{d%y|?s32eLGj~k z171$BZ@n=S1U*7+#dqKd$Li!G&$rO+H%8YUnnvs-crns!jQ&lG6_^}V7|=cTytDfS z&|2qu5I^A^is)_$gD}xNEO&_riOoj`v#(*CXxm~Zmdny%8li5hCXNPGK$m{FOD%|068G5DKCGiS zt3kYnGM9V2CC^1_|4b6jw8|hf|MDVmw#LKx1Rv)LS^;0iRN~dLSL!>(xd+{49MNJU zZP!@0@}Gak{UIyOIvnaX#Mo8}Vl4aS?|K$d!$N8U3*X;IyXdF9pFsCBB^`;JoBDEJ zbbfHv^!yNayk5@T$jwj`*e$iI?zZgW@-DBPM{q444LZfvqMbcJ(hQ@R@mBqFzC%th z{OL5=MmqSOWx=P6Z)XAUd01B@LeLJK4k=(5QQzjfKW;|JAd+}tC&Qh-aBKl{DF#%P z@DsFl>2VBVzzTg1LFpPj4|745l*)dq|K>p4_)0;*Zghr6l4K5g4JsHoVQXu5wzRi= z7SOVqhbwNcV-U^QHWFirLV5rsA1JB4O+vbLVs^@t!U->k!xI~aICnVP)K5RPj-4rK{YW>Ak;#Io~P2gs)lR#mroKxG}Sj&8NN})(Dhb~TQ=7a9Y4+AHS zOU)-w{%rW+lJDr-E6ijnmP);Lr+V4iG~`^9%QA@k0%tkuFoK;ok8h*z!MHUWb^Wbh zMfOEd_)hB_?RF#`vbN3#E+ZWz zer;wDsPN?)BT$Hy0ijC9dHJzXCm>bn8r$g&)uF){8TVJ?%ET~6PnMv9Ut;H7a`Hca zczpd6-pMgs^y3OEUHI(exx~P<-AVU=^==7_68k4CM7N&|>XN00v@{i}FkCl@J%mm!b;*)7qovj3Cnk%t1Y zgjdx`h!JJ0JsGBKXzX?_Z~;0nyK6ve0e3}wF=<}kuJ5M27g@-^*I_105$Y$nX{owq z7;+2w!cO;0>~s@&FzGhEEAZh{uc39Je%_sD7HI0GzUc z2fbsmvLs=%AX%HNmuY&qck*2jM_6S&F#!T2`nb$IjvlQGOb=1?HVJjPK+^bu2l9-x zj126Ajy0q~n%JOBExLkW*&o$La1u;8m}6FLCM=>i`M5pmII6ls1^Tx~EzHey|DqR19+-)S>Y0F3}nf zXnN}}_vXV=TTUyYhw}>Zx}@~*J2ycJ=tAJzdLzhS%sgl+{cy3Eo=*+ph-%Hyg=g)9 zK0q5&3)jnPjvQ0o6lkfY;Y`@3(0Ggv+E&wNpIE<%St#X z^VVWIM@#3lgrwx9`h1hca4xjx6E<)=yF=Cm6}oU+6q;v1D8XX^Sdb`_L&hzHLCl9i zZbv17XfK2h&Uqi2b5Jv&WQU&&(B+#N#5Mh=iVgwK*3=f^7?qI(wPH^I+Qjhjb3gMZ zB#ljCmC%>l)!<2cde#I^tZjMUfMRXM7K#_JZGgeIo&yt+k7MB9v{yLf_o$wmpf%M2 zX8YFrS}=2+ov#kUJS=$y_Ck&fTSLhK9Bdf`8~;1JFQUP%__>3T|L|TSRLZPpVnd+} zl}HQ7$G8qQy;mo|2C1*t;)Eb1aw(WH5l2Aw&w^?iu5tfBabCPXgIu8RP3&ooN0vr1 zOniC91$;3-xddvO-_TONVTRS@&Ld>7s`2}P0Mpa#QOivlJ1{TN@fIF@(CVx71<Op;@zNjl+Q3)l>8u^$Mh)D(iMcoYv0-v(3iTr%>QS`-* zqf2lJ%8F}d9*C`oS#1SlJFicH36e@dc)~1eD$jtnAdZyfkW9U0LflllE<``nn#^p? z{nsW(jX2IT*BO%BY1OP)2K54T3VIR8avI(UGPho11|7VIFux|p|uJ-Od8sk6LI^S!VOYV3c zC~|J&RZTM#clC(Vh?>x=yxdrYf5@%u8y+~7e_R<6JBaF4+mRnS>lwlS5N>QZiYcZ| zq|kN0A0R$E{EWs3;S2EW*(sZ`=$gq<0|np}*e)N6>+(s9PBmJEdIi<|TS1%-0d8sO zisE2{@F+D6MDuHuXw&%oDeKBi7K>yt6N@@IySE_r!MrebYr-Or;P(p!R77a={*M^^ zrRvcky-{Jin1@I#xBK(w##vOMmmS5kw*wXn>i7q^cX_!OyYoIegRDm4T9WDu=cZ$$ z9&=NMoaX}8==azkoqi%N=!h}9XCzpyA-m>u-U4+U_F#JKl(`Hvwww^P^V-|dqL8^H z44mJSfWaJSXVx8tH5kcv#Z@e#91y?zAyd${1O%_U0}>B4D zhf89zH58o#j@D-FFXFxqn^fO2gY)snAz^vXIwht3hZgA63_BD~l!58klg_c#w%ZdT z(fxx4C3klqL@FrE@yiX5VnZ!iEvK5jkL~`BLPUwuLfz}wMYsWTk>K^wHJlP*nVq0P z48G4=m2TTnP(OgDxq?sW#LdqR`a zDi0kAtMqLbz%S@ppk4_EKK(vEbj;>8t{E~m&l}W(sjNq@%pEltyo`K|Wr^)12Cgg^ zVht%duy>XfFaTJ7x-oznonQ&MeX7cM9Fb-(diYmN4(u%_g9oTxFXKS_NC#Afs|+Lx zK~FqYHPPquRgq8?G2ZB{rI(K;svqA*8j-iF3XJ92hvvc8fZcL3DA6-%HnqH({^}nZp>R6&p?4SRnb#aE%`j*@~3f3jn!snEEKz&ZRMU_Jm8?vh{LdVQZw&De;pk!~Z5#MaSTKabI$H20{| zI8UI*<($EWwQLgA@d&3)0_AuYQeWPR;`ExngB8jwMOH}`Xn$y3+Q#rLmj+_=U631y z3ba<85R#8b=Q8uA3tqli2HzId8+7=Af%woLJR65vM#_3s2XsH@#|65x9NwzAZQdy7 zz(6cC5E-z3L79)ez0d+}S8M5M*z`mfAQ*TWm(ORSP}YlJ6fB$lBgS4v*8e8i=$x%9 z^#558{dD#>E6B;?cjCfKcWcX>E*vqU;{YA-dQKIsPT^fEpSRoQ!uXk#ueII2wyN#!B^sr-Eg4+%3)(6#Tp zakE2HfUBu}1UYiHE#Rn`rREv+D2|vZ%6s8X&`rSZ{B0E%q-4^!>RLhP8UU+p7FxK+~3U=Z71A zr%s0K#aSN8HXIM>O~km;&Hs8-3=$lt#)8?Hooe}>B3M50-7H)C}+N`cx15T|5LSbuQ9D?D=x$L&Pm^++AM1g64dttx}=Av*rMOf!zph-X`XZ zXxrx_BIQwi z>*{=8wzp?&J`$T9lK>CnF?9iA z40-g}QUJK+&lJgdc_(jezUh?rQw*j67#Cz;kRW4pP|4n?$#Q{&Mih1B+>uWH9=l$A zlf+wJ@&Gz^0m%|ppMNZ>xK@=*O6sFZ?z^M0me#c&{i+MM4=D5yevV6ra$HINJ>|r69W||k_o^80hCpQ?hwSC|JbXseCxDk@7W+HwdwpX88^Ei z)>$po*)OE5MTb|cvHg{(%O&Ob8n&^If{Dzx%eSZl-J4=Y1^$pWr!K-Vj7_)Kr?(sS zE&c=sooB)yG>|10d(j0n%wT}?$wV)BJ>yPy$>!4dmG#64spOayz^*wYLdxYL??K`n zB=MVlR`iZso#S`W=+O%ft|Om!^-w7j@)yFvxsf4i9J&&fEu=}4T) zU{!UPH%n&^)q~laqZ#X2x*t#j8CgOWY= zvjL5US^?UR>VSOuLUaxW96~>ryWJrTy=jmOkxez~Jc2j0@-T^j{gHk@s*4|HJQ>EU zSCZe>#n5s8MSpgj8d5$MeIOUtB-c#n=F#GzoS~C}77c=-*C{mfk5Ok6cT>6VwtXEY z3OZhgG%hDd_5LI?J$$!+RT*vxNtdtsuv(lq%EkEb*3>@sGWD&}0iwX^^#X_B9sG6V zNk%h#NVRbiQjdtF1Bz@4KUL-4DV(bjMjBD+*>H4L8@MV>s7*3B%V#`}GEJjdbu&Lw zoAqz2U34W38a(2zBMrR(KH{w?RAN&=WYIc&P81?O>H(TO;||gJQ>frZ@R@5I^ZjK z6eIvUaC`d?$nA&^CH5sGv=E#7k_5pk<1HHnxT4wsa2J0?Jc2{?f7Rv-rA3X$oj~fT zMoV6M)_lZA+;OzbW^7iA#5KT>pu2q%Jg`0U`>J!8$n1jRB^<(~`YEFK`0AxN1OKa%Ez81NdpcU$2Y?bU}E=6VRh{SCt zp!t>vZO?2Q7m`SX)i4eJynr$t01|%UM2fNo@1@KifsMTo zswj3bG=K{?=*FeOoE!f9&RdmOUp_TCCj>!?qjL_VR2~tr#|#@ED&y!G7$*jg6!ZEeye`e|_?Vk@BW# z5_--9d!Q0=tJsb5&3XvFalfBg8F?v8s{RixA~KYQ!IOIev^)%r3zBp*n$T6!{a;xA z;IcY)wMCsZs}63N{T=|*#!)V{HUVo_9OU3INd{{zs!uN9F>hXKY#uMCCv)|UG6j*j zcFesT(dK`@p7ZLfiOmLaL=x-Y$dd9W$B96Ua477C^q8rHp|CbC+VmdRB0 zWL?bPi!MsVs2Oz0J2AQ}-bJ;Ai0u?Pc%Ptn@L(M39Nf$wm~M)2C0C=U8#S!g9AtqDr> ztaS{KH5QjSBNmg(jo#>-q&adIX{FvM0Bmr5&+ zjtLbKn9bUvl6&zZfjo3Lic7tMk3a28)4Ax5zLyHJzIG>e+4TMvu^3WsvpfzdAP&v! zsNfhryTFS)bkH}RL_V^lNHnf=d|w6L*obH>VFv*_|HZdz%scxDAO$hg(#i){K^{@R zTvH_(6z@b4C{WHk0NVcy$lsC`hu127$Z3ML-^t+4I4bQ2ex0lqNV%quem_!ggmo0< zDZD!h0~CK9&k3*LsuK^W5~Nc~RR=>0){qPHh#TzN5*LcJ+`d znJ`J^sPDh#ic^Y3Jq5>hGc1i}IZtyuD8%uUo#LY@dqAoxI8ne*Vcp$(RIJxFW}cQv zgwKK*q{|dHhAW$mHO_D&Ayk!eBe6(`wS#t{zV_pY9PIZ>b4-)wFpjQU4$y4ko?j!8 zN<#D^Y#~mU&;YT`X1*5tFJpJ>G)^`R6j;9Rmk`(QJ3QxGEkp>`Oh54D=ISuk@S`gE z&#Y%C>_c8%yS5OASC7vOcgKS^VYMT+X|fl=Wy7;O=`>s2$vx&Y>|BK;20Pkc5rMbw z*jhP{DigHC&^+ZCqLQ&TQ&`jD8}wj8h?kJQ9*w6O2UV9!m<2zNjeGx2{_*2LSsa+zr&G&rCRxOQovSJ;9 zXz1Z{;V6E?0Q3)A)8=c`>eI)+O&NJTKcwKk{Cz0ua3o7pP-n1;K#@UFbjy1nCO1;f zam4zI{jg%9Jyb64ojpCvb%x4R(M!D>B6HudfA(Y6z$OPWr!$au5vAW(ofgBf48B`F zA|JY~tCc0aF4^jg2gCS-sWc&jfa=_27H52is#+l-C`8vzv%#^%#Q3vRYA$}4((6uS zV%HGIiwF1@?otF{H4gbLZM{e@k63{<9q#`r4bv({Huqj{^SL+jQ$Y@t@{Kfow(RIq zi25Abw8ql$2zMc34&ULBTb2nZN(ZU4jStQjUtCz?lL}*LkH7`UPtONbFg5~1|95-j zyBpzbgzW%WzVF-DlZGx>-vnB8Ub6P_FQ2w+r5ptzZ)ShtcQwf&%1TsGN z;T@iDAJ){AN+I{9w1Z+<{0i%mczKv#G---y`i8sbiqg zBhX3Upq7~jB(0RND6y+kRn)Lw)V+* z-o{H@`|Nt#FO|Y3(L6FxG|)KPKa#Pu7Oz8bvm0>=7TlivAS8Xqeu1Ch7rOZ4D=tSe z^#uw=zBcGLYt%3I7C)jXSmB%kxST-!q@TG@3c4EF+lj#MJf^@qEo{NLe7QU$Hf+eC zruXnSH>8%J$fJjg z4XjYZ8Nx5j-k4FKMwAfJBv~hd#DF_8)Xrw8X)c|g$_4A2HVSISLJ=l=VxKCu~mlOX>_Vbf%joIhBa8+ zDM}S;@oCnHp&8%x>_3)Du3Vh*`o^#Q=AY@)TYxhG7#UW!1-oV3)v^Id=Np7vaz3y< zg}U57(}nz41lchqSWGM~?`B{{;xbssl@>G|*QVW}5*8OXL9GH)0heVV=sSJzAyzQ# z(NrBq%6ZLkt-}1M0-I@p?k($0ujQ zIE$~4v1#i;iW-oH5@FMuI3#~-17R*^Z`@{e`A3&a5DQyo{|L?}ouL8HTN&IGjAg~- zfZ*2dRVzd8tj)4Af20}YT>>baUtsFf%X;YwK4qP}f9o7u&x z8O6@}a|y>ZvzQU_hlpPgRwR|;bgg7%KlS9PN#*M*Z!D<^uep4Kwc1$Ev;v{c*kOX= zET0ZGw7cP4Y9nG)8p%JVrYxevBZb#bV>LGu{r+rK?JgkKL>!$(3@^Jm?@L2t3Qs^S z$?H489u>WS5OS9f;e4H!6~gNuOe2R5T>zJ;fBFgj&`{VUjridIm+l}hx|J)3`(2@t z)m)08i?rAA>BfGNDxt$*x!N(E zWou(@Gtz}!`mknf1y;%aqQ-kMGfTeY3hJe)xehPEqEc+m9|Kq zydDOj_8xZ*3bqa3$BkMXGo0x2SaCw#pG@#vzQy7LYA~tc#`=zf@HP2CjiBko4y=bu z7qHd(STFW&|0~!i060L$zpX8n!ai?f{eq9ZvkKZoCtu(Kq`t*WllV2P zmeIcuH(+r^VIfwZ@b^j+iNHwjYjq4tsc!7W90kg?K=c62=!0%F(||+FiBPr_vyM

    |K@U0*Qigm>SUy(&x?Aee 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

    FsI8$8h`*odK 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%0AJNbh|xxi;-J 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

    kSU`Q`X0^9li5j%#}6m{ZP7NMUsbw!B5(H~ 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 z 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
    V`@>=%O$P(eXqwv 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

    m+Z$)-X&9qVLcU0|0j=bC0PQ$w!f^h zBTjBDX3QA+9Pz%Zbc8g8Y{-M_kdYd05oGt#|JP zE5_$`@(aDUyB4L?a6)$RRcR$d1(xplK`43Y^Snp=usw%TVOb?mY)LnfRbZ8Sn zf`m#Fs(iI_s)tE{F?sj~`~Zp|FXw6I1E>%o4_Mj!IrJvHtZkKSFect>8jBf;SBBjh z{wijMU$u<`A8kF16{j$o%I5mt`HO1D3TNT-iOsS?BAcX{PVEv_?24>_=~Ib9r4=j- z9IBf8Uc_h^m_0bC6=RJ0XfXSx$g@l6pVHZvfw#f;Kc#e`$t|)UnnV&32P-7!MYRDzwU^(gUE}O=AK>8 z>SswZ_TV|SC#GghtcO5el(RkO9IZCw06%_{)d`N^8R|be8`V|{U9XC2 zv(gvqtEZqG&V`S;wt-kI-HXX0VHC`y+TGzyC_njjgP4>Oj4X16A}kl$=_DCd$og?O zNA^GU-d&OY=0yguT}#$M4H*`j9eS`~VzE5V{i!X$?o4shCYW1O=`7`+F6x91u@_No zB9h&I%W4Pk(AUAg5inFxDTcZTCgzh2Bw!)yACT<{Z(hOf3CQiClf9nPzCuB%wecMs zrxga1$>>1Prdsl(Y9)q8m2x}&v7I<;|OPS_E)}%Iv z2mcM#XGq>im3O3WF*h1{%xVT79SQJy?+K#KS8&NO2UP5b0rsGhOqi8pMsXm{N~$rW zRD1=!^ovT6bit-6v(1wN`|2bi zh;6V|Q9YbLRLe>i=D{sRW0Uy`Im;(W$FMjGj#>X>N`I`30{n;JUXj6WiW0h9J8`u) z3*2lZ{<=j8RvopBd;^nww-~SiS*p>4t*v^fOxsP-lC=y=*bQZ_Kluy{Hl>oJf=H~L zHN5efcOdvhTqFF(xTlI_f=3Zubj331|pm_YmR2qTp^Y*Z)?f7dgv{mWs}# zBPtCgN8Ty@ecoP#4wn z8j866IIs6D@L#McO}C0gNzs%91|DiSjHH4g$VpP>1f@Y9r#vh$Iu+tRa7hX2($cZ) z8dJ|u6m!nHVs4hsM|mzGRaIX3MJ^rV!tF;xXr80?47@Hu{u>rWZr~nR+CLmqL>rq5!-P`4fdK@qq_;`>_@FVjbmm=iH zIL_ZT?^7F^{~0A15TEe~RQZ9lng^;a6vw3Cd*pGfL>&`pi*<8cQH(|b0pWm}1~AW} zOh+iZCbZCp#IVRjF%n9Y`IRigYb@ZhEV=p~8qc%EGqpb)ABqJAK zD8epydEdC`tFi_hyz1f)7kiO{mF2^Vi{l)eG>1SwwGQ2W2E!{+wseFlf{P$4_V3Bx znO&o8-hfu*k0Dbf{hASh;!TeO1I{ZjjC?SU5Izav{K}rt!-HWNnp>Bm&AhNL3Tsgw z@kx3a<+?#B*C%5`@Pt|omfX8OBCo$I5j3gN;HxE4gy;(aZzvR(_K6D9VzdcBKQdw7 zOiBZy0>BMP!wtkns=E;BmtE+x2dTaMPoooe#(r{{M*0NMt|~fWCh{k-sD^KBBM{uY zV|_X^607`4l>{o#Z<$|O4k6R$()?+&<&F)0BA%$Q%{`KbY%VvCQaO_bDQHL5ANI$=j4vMMwUiwu6$7^ zJ!V)n@-slQ!P$Fg`WCS9Hl(aFN6d)y_AX7~+0Tsk>a-|dm>Z$aSYJlgHVN~jdW?35mP7f?+`o(@jFc`eiL5pppUW4V-lLSKKCEV4L_ zeKaT({56Hg#K{VmJ(3KcW+{6z`!N2jg8HzNX`W5LgjTY)o&X%#rFkJyAB0ZDQ8#eEk&%NJoNsr<;T#OdW zM-+P&un>*EV5uXW)zm8!?f2_1AHGkJUi`K;Va-}h&lmDtx57W1WYEakyv2yh>$&aR zEFVYB4}?hFndHlE>v0<=p!`sifdjNz8^VMd(DVTUsQ!qGhjPq>;V9f!CpqT^4&<%q)5 z43sRD!{xeL^8&dYgWC(QUCXg#!+UZ!0r%Xv&FZdIZ?WE6hW6 zeeDBvSt^K3S0X^$*9uOM%wx zS=tb>6!oTyE}`O<3{VB`#>Jp2I}i~^7PmlM(cU7pQNu*$Af8+M!T&+K*u zs?9va6leb93OQZK6SgYlD*avS=aB3Hy46uTt(CzLzbH~%JCL|9Q{;lM#<)`A1e{kx z?idUZbJXn@sZX@`HYFM|h8awwy`URbIiJT*oG-FHE?L{&jjOn`K(G_{llcvExCnZ3 z&dT4|#wH5;A=$z}gWTJ{uzSn)mp^J&qukxYFo$W!84_u;ARsF}M2E${L2R5(13k(j zdV+e{QF_!_4nsur^IZ3lI6dAJzp+p zMLLkB>}9$7^O(0X_7|;*5p4Q;P@$#htaYn1!Lqwwas&M6o`ODDv zyLLPaPbocPRvNx*xRmr3-BKXbQ)8G-DCmSx1+%HaF~J66V#@6s!d!<)u|zEMowAv? z&YB)+EG0t+hC=2u6xPH2`C>5~CX^AHs=J==oth&aXG=ntTk*QK2dHzZ`rO3MJz5jY zmfPl|q1`&+Fj7bUI8`kzxm+Yp^=OV$mTZmy<+q-vmj+Ihqc zZ~q@OGanfnH@!@E_)}e;-r#)?S(E1(4w)9DD|ek7boi(0;&S)e;qL9ty4y^D+msQF zZ%j+grt|41HwYXiHb2Lb)LwS$KWXw+EBlNvjo~0jrB14BFU{R>TT6MAMk?CbZSSos zo!IP_PwC8;s-ndQ!}F77w=I}k=WwxDyZ5(4H@QO zb1~YBEjVW0YEXev1es;^GN77vX`FBAIog|HYQPBlt7J(1)>3`+1S)!=dA2clV)+?j zBM3a>;Y(Itm(p!NGtJSN)tFc4^n|ERzY;J=N&c@^PZhG2tQ%G5+eI!>-D z`5hO6%?y)ZP|SJemOoS|*b%>vg?DddP+K!%FLy6%oY&<%Q~rH+ZcUc z>hwi=nSI^NYU&AYI!B5c>Z|Ibs|MIlQ~BU4U&cFtNQE6is{lP*s^{MMtyF z^D^Gu`quzK1vB%AyK#QNxk>(mwd#9ZKru^O-0}8$$gF-wC+I39f@6qf%Fz>`}j%=k19feM4LL#y%TYOO(kNIN=?zX;F_^2aVO zx6r>0O^2=$&{M&9<2`Ny-1hL7V@icT5Rd_%jIA2D&5zr zP47TT#)nfM7L4=A^qh7?Ez8I;sa!4x^&6zh&j@i(p{&R{tV+CZOnA&j z@bt}2#M}o@2_5YCoUe_;Mxgv(TPZMO$J5T~$o`%!u08RmqQI!Ec2&2YT!^4031BLE z1Yds{8Jh;l191;rl13y*=qP-!^pC;L9LN8^rW49^@g(y-D98OiN=LsErvvF zyplPo(=#p}#hb*5eo(6eY%{FdKxF2b{%mEvy7;c9Lb0;N)i)?SV%tR&ec9UN#&1j~ zV8@k(r{ORM_u#=c1&orEriBA*(XGrR;6Yuf@mkH_zw~KI!T-m`k6) zIq+mo*?m)tqd0~#LU23X(uazjZ}G2od52%&XWF1d|G`s#yk)Y-2X3-PP}0`vx;n}8 z#-YOUSs(I8&N-`h4|7m=^%o|OERMqVA%3U0*34lXym-$Cylcm>Udy{?O&(aYy#)U4 z_Xy3n!{(1+)Bv#QTdCJGK#kke<(--&1ZGyIHIyxU@VEg7B_oE#r!d#+ft75e?f`e@ zy%_P^enz6q_s35SJ^GiMW+7+O{C#Fq zepF1@mY33guWp0j#A$)p8HM3yCJJ{;!0WpZ$ z+&x5zpVMTrGbLi@)!UMC?$bvG!r{{LYi<{YWHlbPiO;A|7;z;^=Ag$8k;1qX4uXVq zUkaoa`b4cieFXw(NH(wqR8&T(-z6e{EwD$1mQUf_DVVv+5OdY9{w##ETsKBO5zLW2 zw%FS?Yy*408li`|Rg)OgN%4e?O@uNxv4D@vz8G;&w-3HYpvW3Mwiaod+tixuoLy`m zXIe^7cX7KTbZ3;2f59<0_l1uC=vEPOdJa?cdfLF?*7D;_eV^w+F7OK$C)jki>3Y-F z_8`{;-dW(%L&@DmdOE!!^6y#wm-B=udLzzqhbxj+OXD7)#I-^Xow(BJQoo(R_H8}S zE9BMOQbd$lg2FjkcR)+^D65VH4HOty*7?5Zv473n7+;SaDqJo`@1bdksDJ$o9$r=W z_>4Qid*ej8=Z~LZ4f5H#h`wo z4G%HB2Zq;dpxw0mJ#yeqT(4!>ZPy>J>rLPnD0Q|}5UpC+U%^}zFx7OSW#1E;!R`2Z z4eY@HEn?Mqybn$P=cMA0$Vpn9SR8aZ1y&-!u6~8RBcb|IG~m?O;u0MPF+70RqrgLt zI^|7~2hb;Vb0d&u0ek`Nt@_!>7e2O&@U}ye6A&L7I)ynU=}?JK?A2L&ZNuM52g~ai z6x0k)h`^g>5GEqZ{Jpl0b*$NZV$UD+9FUeDn@m*sa*jBz9ECkn$8ZSobi+ly8AqmX ztGhMf9q6HzH?QBKGP0onoYu))YxpZM!z#MLyPP}x1wCq0ElexvT3gk3G$+N+>NBs9 zY&}l^95^LrUGfEpgbdq{i(}~~1X;Ye-<26kKgf6VBs7eg`Cm$IQPNo0vXr2YN>G;0 z_FC)gyf+H)E>1$sXu&7m?dJeL?=j#OLzp+iO@+{eh)$fW>MOvOqlDUrbfPpp+EG?P zmeU3l9;vAKt&RPi+S+L?$b?bgptx9Fxh=Q`Z@+ofIQ!aN%2%BOvF&O>YYk z*?O{S)5w4I{c4~+?}FVW5POeGYp99t7>m=eKrBnoTkpY=m{&y~>I z${=E6qV!BkPZy~FO#aOD+G&_Ko1Q~g97hWptc4iwy0q*Mu#Y?e;*tTUJhDV8xG?bn zP1ir_GNW}BuBvkqtiNbRE5r`ou%0JXS|JD|Zbr+~x;$_$$jBwv5mFxyBP+W=b$k`Q zWk!96)fFd|2lY}W146H25(c?3e=PR^X|Rpb$2;b$&~l^^D#8<>nm^YUT|-VyRmXK5 z{p1+}Oe^2dC)a7bb=_%%Wwq^)Ct0!?u62^2AM81Az(ap~)enXv04VA>45vK_(g{f` zE~JAA0z?JXc|HhioO+`ZNR|c+QlhgdAg(h0n&CufxwL;CgOop$vo2F$L#|0h=R@%8 zIc|%1-s$t?vLb|SLsn+XS>n*Tl-cDO@PSQk2rAuV)?Eb+YM8B zJeAF)X0V+#f=}$TjFNV@O+mws`N|fzEsfr0Rd+Y%8OFm0JYdohX_$Qy#l3QYi@_^( zL1+GZM*`Fsq$It`BQId5?Z`$&VZ~-*0bd2V&=MaA>};CDvKlF zLBGCjJLnjyvEvLa^k!@@;Re%J)a)R!Cb659$wBIu-}>L^K}HVG?aY)}z0*=tGFW?g$o zKwT2b@%5&x0j^0x=)YsvEMq6)km)?*9{AxRhiX+kgp8Q}nO{iuDgYo28xnJo%$VhI zi&ThzeIT>27`_x2R%m}bz(fR=Q;Dg4m=X(#arwx!u8@yOZp0E|pojOf&k5%?7KzwN zFTOh$g-orny(jm3&guy@g;t!Y-_+-NYL6VchKls&Fk)OeF;l%NSqyNvo`WP=CA=U~ z>q0-LeVw}A+)-Y11+4<>#-sw7ahVID6+l5N5&gY9HTeLeW*abuAUG|#jZ>Yt_u5?( zq((KOjO`KXMZ`Odq*b)P2I&NB6txTaUBd2-8b{3D36>=w*!7tg^x2ax?|vDJ1e3M$ z-n~oEW@KQDmaQM}BeqRTZyzcn;at>2fkD8hm&>V&q@tGFI4o*oCu_p)J0=gQF6>lC zLV~7j-8gTX;l>QJB1+A7BBNf+$jZWUu4jNU@`q3(0bTs8_*QXTjD6lJB{?)KaSL;x z1u(q3#**HULqDV(dd9^FVtPwcvAfZ zHLhvEN#!HsxypgMrwqKm*K(_Kq)3!av9yE&dDStJZwajDcQ9~A8PwtnJ`&0Drg?9C zRK}B=q%;WUoqnz2&oy#zRf1&Wd&d^`PT zvKCk+cAG1A@IQ#=Bpc{GO_LStuiz0SFsI)%`a#G?vMYza=%NDkxf;h0YJZ4vGfYsx zY$9A?K*4A+oY6kxB^GuOpHs*KbDQZC}GdUANh7bVWtni-?0BZg{P^I8HL>I!Ee4PIdHO zLO!88i7M0j7E04K@aZ-rIAq>WZDyCYlbKCVL7y#I@1X$KM*7o7As@i9TXt(l4#$}# z|EyrRR%GC0ZJlRMRj3pqJ1_Vy_EuZapp;pf42^_tfApV;PT_ye711-el$dWAklB{n zC?%)T6gJ(mD?qZ4eHE&DxlPu3Q2O!l+JUkR6|Q+d+j{B0+j^1Gz;r&n7Oi6)N84CNw+h+qRysU&T_N>r~=qO6`$Lg6)4d7zP%wkFnYM}7Ss9IEI5jJq$J{4?v9JBjPG0``vtLGadAUgtHFp{t@ zIVeOHfjtPN7;`lmy4rpybS4OZD>Q1r8WDCfS_y10Gts69DRc<9Fzb~|eY!s!7`a{X zafDzHTd_b;9icqh(wdj6i3OMmEOB7N z=W)}SS3d?ZzOCkVY6Q2Eknn;KIrL1ym#9Py*O2nv824?A^j!v)bhO-TDuO_RidD00 zo0gqDn^z4a+`1+e8+40tH~a@8Uo}nLvut8$p*9qTows{K0vfL7I}Erz>eI_VtmIO3 zDaAjch1TNMmYWgOIcyb$zF7`vL{ZTgd-WV4XSo0XfGAKo#Aw)msROVC06?o(008)T z|0N2rU9j1EB-_i)jcNj+A!*EcxMn)yIaQ;d!++g%mbd&>`?rgle)oAViwO~S(o}Ut zpfO><1Zov!8;Ukj(S+($AWV~t>R27D+ABu}oy(y6G=W6r-uOyg4JK#o?=pjJMq`&$ zSq8e0)*v^VlsAs(C%O%juGu3H7(ytq3otlY+VY|-sEYiX4qz|v_fp7))!c^iKSxrg zp~_y%6E>0twnE)f)MH`}h54OYw%|1A9AL`P@XHI9!)`zt?6S1dT>dE9vdR$=gU7dd z!2qKs&soH&)?fIqc45il+>7h6@t^Ponuv^dCJ-df$mORXLGGxSDH~fwnZa+f^cazZ z{hNsmRirb?Da{flGXe>;dX%j!k$MQxGVDy=Lqpbf_g^Kp_xT@nW|(v*S2Dpkc<}kc z_`)fsMg3v?+N<7KR?eH3`qa?+!m$?7W{i4%8$E0=b+ z4*)HFNDz#Xyv(H;#4>&}NT9_ThRC{_=|lXm;!{M@un6K3saP_`{aMmfBq91q@uCQH zVCqf%+n69l?+N<`?F+++;lhzrp@hV!2GULrSqpVn$H<0}DH<4~2zZ|kB8%)Vk2O#3 zJM7>qCO6EoQ9+vuwIUr?+nBXtL^2~3PGs>y{}(sRzw=JpRpDb!VC?O* z4agrR6=*o+LgP18)mUm;Xc@b@;7;k+uSD@tdT3}kYdKf8cC4XnftETjZ2RTUTC>%V zjSYiC_p}?n4}#fb-+##G)EyDWPS^7W&m5r&Vi0aB`@azmm8+ z3C%qN0V8BTa$z+ZgXe8aSMa(n$6L|?$)cNqH*^To_iC{GVtE0BM71RIy-G@pO3s*) zzrH0Hx=W}rL?i}b0+Smf^%aeKs{)2(44DM~gH$=7a+v=esY|ly*!xv~la!F;-H2XLEYWPkuHw!=LZKtwm~%nK zxES?h3U4r(jKJS`Q1^9OB=FARkKULCuC+{;W%BD#qSSFM)cG?B~bZ!eE;>J~^0pG7rJr zG7rCaO)mm+ywh=w;d!k-AH(%oVERQaAo$2<_D*&hA5V}~J)^lmV!wb=)W%H!03x&t zeT@pQiAt$TP9|E0`ohGzh7S~kGm=d>zaLJaJ@8nacI@n1uhk3V)w&)L(<7ro?9a(+ zu3v}>l)4*SgO8Blz3LSkU%X#&&V4GYsla4>qt8mNlM084>7d6a(t41Jtb7x(aKG$8 zPd}qZ5BxNo&7_Sg4^Lo*nXq-GONInwsi-%Uj3xa&egfcr>0wOVWOYd3BuFaRNlp z$-MOu(TaqB%Gl-0+{Hem{vZPrN&|N%F9_tKda94(nifz3E#M_x?dJABV+Bgtv+teF zZz#i9MjZpOn=asJa!>YNHi538cVHq7!V5U3OMLiW22Hl_4QS=6`{+=t0VB6GYS(=-{`Wgul*(syFx9L(6Z zOgpVr3kI-&Y=)5&$zWLeSStfv&y1%!SZdMNqNcENHH365B3no$GHn*e6V$q#5GHlPY$X zYl@ixWkCMQ7pjICW$=pXMAQjuxhYs8X=?o$);OQOFs~1sB(}EyX9N;+W)AWc8HYKua0mtRNfXNTTHIt)y^fCZ_;yBR9e@=1qG{!(w8G1eD{SPKE(F!JpV8lIVQ;HWyAs8&oM@L|$1 zWsj{62-{rn$uT9s6UiOS^{)?odO28Ufj<*l7{yeSO8OUWM5PS#LvISQDoQS({ecIg z0agX?xgtY4o}VH6#m3WE0utY{E=R)715blGX7;eHOAbpb%U;p<&6Tb-LS0xK`i7W9 z5tQ29-{WfZjc8X}V0Waq+C>IyTtZe7DoBqee=k2msGN0_)Z*!g)vc$ZLN-~-Eq6l^ zXu8O3t;ZqN=Ghl)N?TB(<{DaboPSX93#c6Be@8{1LcjG-w{J@n+(;|DACbZK4rPus z&;N(JK1<+Z6$-*JG&UX4K?|nts0umyhDGdwsvsmgJZd{gyL`wr6mh;{wpdqPm{Y1t zoLD8qx-4OcQ)Uf-AY@4upn>18vA$8_-2C&i9z!mUI^h&C>8!|5?l0(S#NTWqow%2cwXqm6?|R8CtjO0g zNh>Ue%T93`K@ByUCUlxOhYk4$^}G4(M@q0<+*~u_@wc1xVbuk;nCpy3$(o9ko_g2T zw?|5aM|S?4NHMfYt(M-Mr%7;WeWoDTAm;MyNv*st*^kvpHj2&TT+wH=Qbm3;4b4-fsUEBuK2()se8x|_zpe^e+T*5+d z2F7Uk73C6&?U&o~qlR5o=p3i#Y+q>*4IJ^~CnrbJ0e)Glpf)YKwOiH4WCW9E4@By6 zsU*9u)oa&{`nSFS-U|)gLWT)#UU?N)b#cqzIfIDsf)Ap;J3F%mo9-xD@VTmzQbQZe z0_}ZVxd6VV4;Q?yYftmhc^S>PLkCtr(HsMaCMMjpRve^CIxq8;} zupqiqz^@W2S#S~E%+&4rE`Ks~>|g#`m6ejWD|RK0Sk=NKz20Oj>tVJF3IgzBFUDbh zx{BNL8pbf-(hHJ4C8nWZ1j{CmTPI$KBwfxpm#XR~eor*{s8MVyK&mb1OTea;*t! zZ+|%ph;2SsSRPn5BFTUz0jvvwpUfN}Omt|){y!-?2q2ePe^6RNk9imXGRo3PjQXEc z9e&TRyaMGk#NstMGCHv)DPisF^L8(_P6$xwr;!g;= z)q;|ZJAe9e6F;!sktI*$!aaK0N_UhnpPf z-&Q;dkxSQ5Y{9XObkyPaoI9zA{WUuxxvWYt-pD5-V(i?liF(3SD^Hisz9$<%P@yYy zVx0#&Bna7*a)v({kM31P%Us1i&_7!})U zCWUCg=;c}@qO)a8NzoE?s)y@Fx77pc*ROnOH#pnb=U%`6juTdSpqO>R$fQ{<$rfU7 zw=+{37TKbSrI{O2p(RaIhi5+U?o^&xZ^jvp4ZsvUD>K=5Re(x{g1-K(HF>Mq?j2fa zDa>F}h{tE0r{*vi=OA^D=ELns5wg@F-%H3HQ-fyq+08|lRBEOb?@I*JRAA1lYU5Ri_(*I_k~Jucs9mmZ7WDD%$`RMAOCrml|;U&Up9l zLJ-%l9m#x?9))|?%^5?aj8WBcp0i$#(0~CKLe`J1HAK2>UxYsNRlGxav#%yGS(#Au zhBT^X%C<>jzS5mQjW-=6I-kxT!5 zRso><6f&4X+A!;)^~7V)sHbH zW>t8(TbL)iK00Xt)nd2ajgy0+CWKTe=GRQ#HhbKfl%>LMLiz0T<5ekoynE#=55yUJ z<%LZ``Dfs_csK?Dk(V;S%SUgxqPY#=;Jqdx{IkCh*LdBV5ZqEn!fpJdObCy_u@7W3 za51WU7LMWdx{#WvAIe|LF{r;Yz7=bq8v?8< z3jjvY0TGig-Q$?E`^i+PlmGPsVJLIFd+#K^4>`TK^;x}(wu%BW4$HR?%HCwRmdr(L(V+Am7XO0jZVS8ppSzHRjeBb zPq$iPNXoXe(aLet7&)$|u1m3IZ`lSkfS=>57qk)>X?P|*!I8z<;qf+Q9m{8fd91g?h*Q9GDy z4y+@(ZK#!!7uu?(+d?Wgqrt^o%B4scAtNW3A3#kLoksj$K&|YQWP08(t60tJ?6;8t zId~FJtj#=_VLht*%c}STHj~g6|EDl?*AF(_$tmYyXDyWWk%VW9lK4TCuW=7|cO=R5 zw_KQ-v7*<6A+ri>x200JI*pv)wUqax!+|1aht`4shzu~X7&6RDL4IXY4}KctHWz{9syfxC0K-twLZih)k7zs;&a8O5q52?FJqE@ zoO4gs`&}P`)wIKusJN|&naIh1xz+RoR=5nr`-zxRjlpj4x+bfUF6F@SF<{ z@XbS7#{zA8JV!ld&ArhV5mBkZUc>gVg2Ba%p0&n1=)uris02-A0 zx0fVq+eUkF()iBkxb+wJ56c2{iOw_rKS@a(#yb9I-;NjLTgC0pg-OXI3=d12tdFj_ zEiZm;%!SPwk)z4PuCAG}7Mk(ts^oA0JhTZ*2>wkH9nnu1RdZlx1ep;d=MOx$SSY3Z ziDwhgfWBy-p@7ELJr1VdJ!IWJtlmq#fO%=VC$y*A3zO9n``Pl+Su!-&th?$s@=aO& zU>S$ett)|S;7rm05g}G(9PXr4kaqNgEb0KHLHzNhN;cXPB5`4us>B*1)lkSeg$OJy z?b1d!5IOs5XvlD?#(H<1?sAeQU^g6Ga?fKYDIiEWXfX_EvKn0wD`{)NNG2|( zdY#o=F!7LS7om*1s%cmvapMJ3SKQI%32R`HLhqP-RpCiz!TI1iz3H;hcyW z-$aI;P_bCef2H)SlP<|!h}_=6Q}D~NT2J<&Qo4bHB$0O7+YM=iNRV}Z>v$L-$CBt^ zaSk`d-qWqSr^nrtXIeZdAnL0J@Y%58z%U|~OWpB_MCKgF6l@~YothMnJ0{Li?bHAC z3uaYwunCBuINa!z?M0#qQSl;1YR|vQL0NGe2xu`fYgA`*ASguBe>c5|eC6g_No6)c zjfT3S2e7V|Zfc)usE39B*${lr2~iiaNWDJ~kJY>8QaR1gLJY4RwCw!^&WrtO2xa3B z9?^t-RB{dx{MZ$4{lsigTQn0CfF8ed*$MKbGyc!tv~Eg5zbpmXrBHjxxj*oHG$9C= z7XWlWmT!UW%hKrl1rehs8U(vS|lUw zFG~$&;j}zhcug&eKMMwSX?87$6St(-5o%=}gH%y07RO`ow-V+7=VwPYxGoFH{swJ( zy8pzHAAs2Iv{M6w&y39Ubr!<3TASqgrB(dU0mGjPJ_WIl095e~&+dmOL?&iF`kxJIjtCbp+ zolqV}T}vvz5-+rhLvKgCuav^MuM)2f@V=CyeqUB$?0{=uZ+!QZK*{}a&CQ3FGeu~@ zNo5`5(fHJPsAeEvhW93WI}jIj_hxYak%tDF0RZs)h%PJGzsvNs)mjS>|4Z3FeZQXv zkx_+Eu?xrze5?MG_b@XadmZ*)=zadxs&{>hulg z6|8#wO-F-pAik~5Yb?b{|vG_Fn=`cc!=RPtdi zJvgBe2$RIkCUicT^Kx?_i($qLE8nY9w2MT*ofHgm%|n13flbWtfy=>YDJI5)=PuHI zvF~WdcO-L*5ux)uEvq*l0>a(jM{>KtR5&VfxXpusdX-Bg4(*|JT^uXD#Pv?Qk%U)N z#sODwcji z4bA!4WfIqK$Qc@1V(2DBl072kr$KI{3)75gSKA@ik%~sp^W+v&$a!Blc3(Fgwzbro z=QQy081aBiW*pwvA{5hLBwr3{8h1Chad!b>&<)|!Fx7m|DE1vjD0*4!ky36up$y~O z0%pCZfleT`t`BAa-(DAtdj9Lp2qqTI)}%Q}CRNOkQJ!>YPONDht!zg6yC-PB%+T*4 zq$HBvU*gyOsZ(3#<#Pp>G5(DSV3ss3`d?+2?q@giGFn*L0mrm&zJWgfTr)%b`NOkz*9?|&hz4cMh)drjekR-fs~sk@khDuw-4b_JKGMuLI0KSdVxw`OE; z7?e=suECNm)qx*iSeU_*I&1@#HBtJid6K-epaf&l;o4~?Gbe3+M6xPRVXGnmlVf4y zzdyvpIecB_TXkLQXMwL_++l~+K$8!f)O@FT<{d#p^=QG)oaAeChrdd(9w~<$mt(QW z8RhSDdQTT=Ok7)6$$H(wug~9VIzYa0kj=@E%Au^s;c3!`7n!;qJ|M}dFIsFYuTrOV zV~?;@kbi3QMEUy0{~*((3BiOOb-6TP1KXoLtDJv5Ts!5g}?W-O-}-o9F^?v z=(pkrIgr?#-ko>ry3I-N;am`8!-d-bg2Ao)gSV#D;=egKY1^JP-~$EV?LrpDLl`wi zS|SNu2Jn&l)exv!c)!9pPHY^*C4mqEvJYCHvX3}d#Z)0Pom)PzSWN}b9;iZ$Obmm%DaNSSTD#QKZ;eEm1Y z_YFyk=iAgUUv2hs-)`MylR^7q;^fZ-V87%#!AHBUQJceCxTvAVwq79|$M9jgIX2`G zl5#(1m9GqAx}R8oTqlEGS$9darr@dvc9u`B5=|{Gm#wzHT=5V3DFi#sCA?PL*i)y9 z_Ze6I^oY`D16ZT0si#L!kjrK`LP1hNr5<|m;Mf9Y8?3CPJ9Ri1U;68_e+_+O2oY$! z{1{h5%1fub7^0)HmiI;SzsBDSmNuFRVsr^FP18t=Q_v~pz+lGC7_;*du3>Oxvv`pL zcT(oCu3~^t`G8e)xfD0e)S=|&PU%LOk>_=*Mz?=K0c~9^Qcvxunpe*mL~-3Vpx5xJ zCG`deDbaHd`qdj9$q*`srY@&=ve71sjr-X#%gdck*6l82bJ??>s6rJIGJH{ch;8SA zKxuLeUC6*0?@wq-oz{#CtE{SoIU_4Xqcv8p=QM872>Z2YAd?=dNgGkZKQyk@YhbIl z9>ko%Cw0dB`@kAZC;Wr;p)N_Bwmp|yBaQG6)wvX-V7L|Z)BYh@5$~rVA;kD5Gau1@ z31vtDI{$JJ7;T!JbUT^XX|$C|9x4RzFPfXhbX5W~x7y=)%ax*-f<}4}=~^{*>1+3R zfQDxootHMI5)f*EU&1#h*3?;z!*H(JQvH2;?9VH#b zTE90Jlrp4o5=3 zQ1Z1c-B4SCJDe=)EyCqoZODMK#&nW!});K~rnE}-)j)U3ppBqY=1<6#J)iqohsIjh^A8@wQck;6FuJ5~yB z?ht>#1%+RoYB6%GRr#PhdGay+$R?XaPup_F?JkLrVzlJiWo8Scy?FWUPCr?K^GTfH zn>rHP1ax$Rtk-wWg{}P7WOTD$*4;&x5qd+M@8i@+`oY%1^JMUM$2^+CMs0La0a9#LE- z?fI(};->65JsZ}qe<7qEr$X?lepz(G4EZyplLOa(Y1zs8$vF_lt3AyMcUThP}vgRZZ7F~t%GXI9WNydlyXDUh?r6BbU_|}M@Vpr zZpp$(cVcTfKL(XZPajtMq@s3jIHg`%GS(K;MusIYZntUg$;A=*O^Pp*^IQEQrSTD{ z-aOF1E$z;C*~)-^`&)pUzqE-3OuDE|fm;{j=H*Ghy?=pq@0zGEdFvMX!7d)V8dt8w zhg_Q7?Wlr#4iD)Q87kI)!`v6#8&4l3I7E5uL+)u7!EE!_wF7UC;-EAWfqdQudPZWoTZzaqTtWKg~?>d;?5Zd)s zu);cd+Y8Rwa=VnwBxmG>-COo$wf~zgNRxJochi%TGnq7_q_;fH$CZB!JBpx;IWl0Y>H??7e%;j#Aad9^&lW^tFJ-0{6?x> z`t!cg(}(YsaIfsKOI6qTBZfhvw`=Bu@-? z(SL|{0bG<+N1`<|I7kN$IoF#br12eFn@fIZU8=H#LbxD;D`NQbKf6#%^<>5h;1fhM z^5h<-gA|W~brC?B5WE1Ri`t|ZRu*tlO*eCqUwfA;#jNmpRg)pNOSWyvpqo~ccmjzfO(+X4DbyRb%v@TatWu#BNO_=^?#-%hF&?g`%~Ps2OU z_lXLHy+v(+wRA-Yh+Qr!X$n;tC8VM=>g%d z)c-A#W^L<*sCQWj-nX~D41BqLWQvYsk6{iJ4v9(smcT+vnHEv*Jd-K|O2YUx7nhF$}#a+|CfGqd1I{fYC7ui9&iONId}%Rs!vIw~_Z zgZzrgKSMLQY@F4k+x?7a^7in)@LK}yQAmckhvJ0ubu0+DILhhFbH-l0GIbcqYCiTa z`ES}?M*xMwvz$;~9s1IYD>)KOCIJHj{sA7aa5;hE37G_ZWnOn$;`X zQv^j-5?XnlJ=$uVd3)`A-D|VZ8oySQC!$G#G%>v_S;s*Y8+R7vAY(@-vdXIpcc}~oN)JaiF9^ zQBh$W<<^Iqd3CP0nQUfEBenLEM;G(yXlnGNS-dhL>qb3O5WUROli4hGS8s8_7I2|b zf;?#_JZ*)0p?ku_jZNe=Az~ z+Y_pODK0;d#suWCfBAeXBkc%1Z7<)Nr%?Ipeg$7+POR3y9DFjocfS&kx-3 zn%T-1qC#mK=8()VZ;!qHyYAOuO-PHdMC9N- z3P7}AjI2gYMu_Vc1U)}2Z=(#!J?|x8uJ%Z#z5^xrJ0y+4cje zx6vqmH)aoKD(Q-qN!PR;emmdIKAGFbd#g|c85^TGxt_riaPZ9&*eAI&X@$V zfV(b^=b8qfw4V3-3s!|pggxxd^O*bprg7-pCXnAt6xJEOu zIebPC{{H73QBH(ajy@-c14T~;-3Fb8 zy!JO6pOFFSFIx9Y_nlR4RaLch|1&SDA`<}|8D@*h6)rjYWt|AE*#%GqvW!d*1iWrOkk~!07>wnwBe7oT5(}_9+PYtE#s& zDE9pY`+E5=r75?*--6r%YeN#O%!A#XXT8S^HXnQ5_r33X-uJ!ld*1iHQu>f*racHTk7k)S8}`}ONQYsCqvt|ONML4EH9RXg{#Xf?0%bn|m}>H{xO|}}6@~UD z6AtNs)b-a4C6RfqmF6!CLi{qgk=C>sn=EK3@i57~Yimb50Z`ABR#-2Z)jGDB}Agon5}>EFW;rBQQg zRz(7`5eQi!ZUO)7FoiohA{5pkz1_W4pNMnv*}4}eCjlWu`B}8?7wuAPjTAU?p{e0n z$MV2TuoFyQdiy|-A995BhXA7`>)-3nP`17W%QJoI@vtlpy3K%&_!~PG%>03SX}mrf zm(&MzoROTGidg1LRJ2y zwFCPKgnTfbnCvC04+i0@x2q+SWvQL&WWU{_?2Weqr_T4i@B)rmAdtG@rQ7l_(|G{l z-V^MqZuq=fY#6wyOG1oPSVQqwL20T(_ zk5`{Tm!6&o;S#B8!^y7@&iDRHpnriVT!RfHITtBiR=V&q6s0LjQk11BN>Y@iDN0wt zjLace-}6@`Jy=JpNz3{U#T&a%fEAlEDr{NQ-U8kC1TDLzfIs8*MHCcv|nK+7*ib@ zKnQ3=H>xVg8Uj~n3E07OiN0=3C_yV=Jh}@I7Y(c!tLn$}7>kWf3ot`vyUvC`gI@R8 z)0LGj>mIyCQvKQ@-p8m3tf_S{ZR<`{$ zYifH21pp?Cpm5O@nD)3u`vR%pER65wwOG>L*e6XhM*{YIc#NaLJ<1k`iA%!FeIPEa zE0CD;Suf}KqvCPz*CYldrMqtX%#B}C0M!O8OPQl`FmI%HthlV`kD6f9?}At)b!wI} ziHeg=$e38WRvH~(;8-b%L%^$e_wZw*K_KxEL!)%)eU}U+Ub7wz3+SFinw6}io5#Sr2BDVC$2*aqB8KtCHhS_9WcrWtOw<+gl!&C zQh%t$vgf4UNW=d`xdq$cYRI7p$7!|`l61~K(HLAUCf4Q~-{a0Kr z>VEUgC~@?*S5CJ1s*05|cl==y^XO=y!<7wB3eG>40%cIG{!{_HYb=WC)YG7-oDbm= zZHL`{jpszfUE+fApSeGDDD||X=72EKL%}28NDyDAZncR^He_8STnc3C;aMk$e8@2( z%fKubd0l^gzpz#e(E21Lk-*#p%KOiloL(8DAfd z;J4Vk=m3V*>Bz5c31uD2cAvp(t!@-jgMkM=&Iv%2cp@58CC@~>ootBlr9!94H&f{w<=fMa$*;??jS`ZBU`raes zC4mnmqI(ciqGPh2V=)MV48m>2xB|eRUgPvzT`TySU34^1;mU@mg=Zhj0W!kW%*wvk z!{j|7ZT|7s$@M(YqdP@AusDR)u~5LA>C1iZd*1iG?|a_&z3+S91D&GqRnn6SPLMKd zreSOyR8#$*L;CK)OItA#bJ)-Pf_8^FB{$Cgx2_{UA7grkz#N-~1s8%!i7o1&t|QVm zi&x)gyce;fUuH^x8o@6bVF#^9#;96cKyPw!e&|jRhTi{JO7VT!fXEcnEYtpLHa41v z7<+*qJux0>gRNh9BC=rwHGmeQ9l$~#E6Pm(l>@McqE zNIYqjJwq-#EtE3JdqGuW3HUwAr%bJ2f59K)(LITEwGYp=lLF%*RB#%e`1=nqNUV{F zvd>m|g#M(#;HYF$|IwqF8%b%=n^7OyKq%pfa{txGDlEmy&xPLUX;f1s9(2ktYnf?u z>#4P=Fp(2a&Bj769=pa>4klze)}`S|E8Ff?|a_&z3+S8_#Vdg0@@;iSBIor zf&1;M^ohkqcqkx}zrg^K%hUEsHBG}WI6y}JvoXZiIO5{et`&*)869*dh!00u zfii$VD~j=fq5??^dsrj7HxaF9k;bQ6*ED09&wVOldbNYiH#KcEw`p=aD*yyV*0Y~W z@P=fu%I_4A$-BsbE>}B7X3@#T1)F>JyHsssaNU}^p!a9525jbzi*3*o=@jIDM2qA6 z7<&G-OaHA29*~*M<82Qd5|>WCsVG2x8&pOW{g0u$BSabol<1>CmSNZ)eJcE9KG#&G zT>#9LxjCP)2!}mcLF<=UJ2>&=aNL*k0zMvXR&u#CSbVG_=#7Q54s`xBd+Fj%%da*Y zFkcis$+7{mRaKZ#z~G2hLUSg>`1U;>v6awf_tV+U26@`O-Nan>ysjoH{`~HEN^`{j z*27vVQ5A6rblEXDFn$JWolb;pcWSk0CPiNrJDP)|P|GzIDW&QaM^&Jm-u-F-O4S?$ zanW)>6v(k>)xkFA7-vM*c6}e6wj82t9(T&4rB$wja)Ns_wn+$5SevRLPpPQ{Aqtf( zstk-GAjn7(A~Zqam|y^wSe64^c6_Rj6j$UN%ST7M!u46tanv_^@ub6zxmewz^t^}S zOlx{%SCMQFKEl-VVs4-r>+WxYC1$x3F0mMfH!Mep1V#mjf1iCGUOjo)9D+B7wiCi#cMXsSX!Hx`@e2~F3 ztsZbkFpD?i35FOSoxg5Cdc2h(su*DbWVE>7q6%41uZFtT{xtzr8(FD781pP z2fO`MR>{(O{x(hzCw!6d?<+9yVK8PLnMVnZvaLn{r$y*<-AB^|Il4T4dyRpKm46(c z_ukz#zpk$>Qe5nNiscK%xo8>${AqtfRv4)H%h_=e* z+noRl&J}3@Hd!ggBoW=BmxH|fRx`>x%Z|JxZ_m5RDWhDO;mcu&`*#lvT60lRdTz0+ zoQ$r~%n>cpnG2O&m|@k}4AbM2;~n1@5?R4-lla$~ z>8>32At z5)+b=jEEv>LLgZCKA!jHkz|wlmu`o3nyjmb8@IC+Hp={cn{Me+ckZR*H;#MqjT(bzq8Hn;Rh>pPLtFu4E$HC!dQAOc_RdS3`I30N~j z9p2xfm+k0@TuKF_ojdr-R%^>elr#+N(En`irXkW%2QwI%jPl_Yn2M3QPegX>w1r1F zcmkgmb@w!cQroDRIJ7~CrSgomUy}v|goHpM`pG$G(0Ie;E8=?Yt@wDgRUI~+2}pq! zyC%`AdEx%fA!d_U+*P$(U@EGiWk!P)(V=~|>+$VQXKZVf#J$k(jkEu&Uy!wPZ@DLD zc~(axsmbt{t4rTXXD%g}Q~|3Ej;oLv0$;+Npu?u`W$RZoMe0Vka0Bq6dwEBndD81S z{mdP*7(W+4$Pw)*=FR2K-R^WBh*?2n+Z(>oqsW6Sj>ZXpS6=J#4N+)3pm}r+DR)E$ z^_pyf%w#{~CZ0%8@z1c55w{2%MYCgQY#TB?b`sj*$l$(Qv+voq!Ys4m-h+O%ujbD(HuxE-rp<`w&E`}AVi#`)-T6kha% z%PNw87Yn3gi3+b>)q6~Tl&%Hvr1gf8rMFy0r~rqNw0J%j z1SV9FYEDVv%Bp)Z0RJQ$+sreQp)f`z_QLj}h3jHfN5&zdFZZja+5&Pc#$nXhYsMuU zA3?et&5WHStdpr!LLI$G>e9vIZuD#6Eil-%FV`=r+RDMj4?l!Y6U8f5`Wq%cf>aBP zcgHo@v~i;4ObSDoe29F3I)=$Vp75|T8b_%}A$ul^dGi3P{vUQA=0KSv!vMY&jn`=y zgO55lmku-n=n<=a944A;?8d)vNdTc~wRLW}kZnHG9kkw`=vKvSu3ymp^ztZ*bWR^} z2F(0Hs?#NM){;XUozLVF?L^U1p0fGtOvnMeB|~$Ck#8VwLUafXeYYiGDMcHE*CZR7 zlP$@?M8Jm6^RcQ_$KZqI9Mib=ECvSntm2kr`YUSZlEg)NbS)p(E1qbS!VeFsuBT~O z_Ve*%Rj+Wit8A(i zonw6fkQ*4}!8Z@DvzxAZPIB;$7aowxx|0aY=)GZ}Kq3x4SC+ZD2k!8O4K5?Swem1k zNQqBcx^G55`--h5BoVCRk&ex7-yN= zsIa5mR`3r?{aua5(?YRj;zMHr>#8H5G%J}KQKxDO9yxHVVeV0jkCTQ7%VOQjwBxC5 z)4+ZKEj`7(uGq2n+5p@X(ex{}|DygqF^?7xvX(0hS_k*z%}-uPl3}tyZcZ>W9%2}G z1Bw!?q8?`z910ceP-f$mWMQ$`8$ywmTmPkN038)7RifD|8}R+$r@O6A-gt`(`?ofa z=+8as?}d{|Je2nfshykBv26F{BHIL=>vt?X^|g$ELO#`IkYp-q^oU_Bm;?ADUSQkF z71feKIcqxJ?K8uG&69r_orv|uUQuw{cS;vZU63HD5}EsaoQAtxS3}f?4+ca{P9IjIR6DD$nxGGTGz0J7pc*zAcd!)t*gXj^s9rP+tV^!7=_ zG113-uC|+q|Ezho79Pl={j;$;mKS}!ss3JDnK)aX zjt-ewMZqM`0>6kMm;9mkRQ=v=*Q%cBYe(X|P9ooMj}v9axTSV|8VbL{{~zKvN{|H6 z+W8CIn<4on(X7AhWT|DRI;B|=ydti+_vi7WHc+N+K&+MpiYE!ItDP&DDw9?v-a(WN zQQ`JM6|>gz5+h6iS=Mt(ZlW_Dzcj7jc~b+}B1=f1 zkN9mF@|Jf+x$gmMom@Eu(?U6tKg;*D>ETXBM6;$P0r|=p57Q9XDJhOfrcUVG;~#!6 z9T>LBOWuLQ$QxAgC@Ox{n=_t9Z~zyH?8$75Ln1&FFJln{Z@S+lMXQ0GL8!fsD#|I@ zF1XxVtcMJ6!0N7IocUW+8~Iax0VF<=s^7HF>(4}uO>l@yR;x#A5w6F}9ki9c6bp^# z)o?}~z*-5pp?Yd1S7`rwLajg)Se_~&1erC11yWM{aJvS*>w+TFA|SVo!(t_v-YQ9} z%4efVyax1zGv3%a!ExJx;&9q8QnJg~m zI1*6ONhf@(a+?TM0<=1qw2WSu5%XHyb9a|6r=zA34$mQrZT_O1Uoe+~Rk>p`E+Ca?d0|x^}n4lty3q?pXr( z)Q43-cAUz5M>2K2bG3&}x)^;^>p$9@t#6E3M6i5HxeCRGzbJi(1k=qK7piyyCrXL< zSv4EkeT+YBr8QXIFK|t;$BREQdg3|$(~9+ULAkOQu}j+GKz&r{pze?z2DA?8%5%2b zC>LldK7$bE-`CN-(+85n6C28cRT}PP5urZQ?st!F7%Kw<4$|(ErW{C4Uc1AcT{b?~ z8e#a(TU%Q31W^}$igWsJ-HP9Ets$!d|u&ZW;tl6ALC5f$Eith$& zAhSn&c1QyNHP}dQZgx9>VZhisXhM28yA7Z>GWHsHMF<5F;+LQTsu>7xNxbEw5kc6A z$HxCr93~VNsWMn4%ME1fb-)}R$b{?f?$%jr!Dzke1j_`)U*VqyL<#yGnnIvJp||mO z*uI7R1;rlUMzp>ia*mH5Ye^wc0xkdtj#*|Lm%#?v&I0fe`DR0E6y;LXTcH-OSgekF zN;j!@EU-zTG5w1578?p$_cTl1xDOJJX5=bB1yWJt&%bw5m2mwmdJZ{o)I+6qrH%pp zw@v$S?Z1?6$MryOM{{YmWjRPJjp^O zB8FoijeDi{(NqBWU+!qqi#ct}$jxYCPN_f7V+0^na9Wo4Pvb{ONUzmUMoQ;CwTX{g z;`cJh`yu4@@&Sb8{bG~y+a3bzhG>={!1d67SN-`I2||4I1~xI&>Ee$HVVxl_liBTOB9XOHQsY z+x#TG(ZHchV=D7k>u2aCIbcUgrsLu8%F0OVXg#D`2+@{=+11=!H!D$t$t#rk5;~U1 zQIPAAWx%!O6CzD-);<+<`N64J<-QyC+YJ|IcF@KKTw$ts)7Zn| z>6Qu84Qj5K2X5oVc*dRlfr~HderecRLv$>0T$5NBUPt+`bw@6^*4-PF~9R|?wk>D|<9sB(CQp#Wslr;2oEydJ&A!tKB!m8?_M zA?q!%&8tk_SahQv%bFey?s0OPyw8VW3^tdjni>(ICFg1{GeoC}wU%&PX}ilz`^6>4 zdYF?&^jLgPSw}%*3+If{v)?3ObuSF?v+mTj@VCR+W0+I@TAzHm2n>G{)c z1JUg33v5OTN@j;(pXT`PN-Hed*uopcboJC%^dB|0f^ftuq@lIjh{sa(cpoj)|FIg3 zGGUD~PhGkSbR~2*eeGHQ$AHG`=LFh%+shn9MF0Lixg8{zlla3=!|o;s+_sc;_D4Om z9aV_E^sr%Fn#a)--Bs#ti+B;V$mjw~8e;h8(tX$ADy+9P;Q)8n@62=2!E>Z0KB$pb zMCxmpF5ItNn7)U86C#kAwiq_l7#)8YFy@K&v8v(q4M-!eJM`RYC%i|w*1%$mhU*d+ z!Z^PaaXRCkH|JtVmk(*7Sc`F{&|51&r$u1N0b()wmfQMh*o^q1dBJY#If=OZzc%w6zgiTjkzWBa%4c;5tJMH8b`!v+AlI+HOzFLn_~3@H^v^7{ev{@1WUF)~f;3+L&$ zC>urF5sT0S&nJjG^c6baTXMksFM!KMNf5IhDK~8pq0E}g>VtHqM=x>z)vF`uHG!ve zS5)P#R;-A!2m9USLi`gIscPqtyxjC(V*lZ7Pi&W3Nq2mu>~R;z_^#T)<}>C=3_Tm} z{nVBtbZ{3#Ni7YS`5<6eV}dpU56qM zGZ&>n1a`B)Dw4a6^=_G_m3l^%9K`vZ}QXb3y0o(pEq-wd%h_o zy!6?HAxLMdxOWCkqk}XFwb!zQrLBWJEKAOud*r)E5{KO|{yu4^9lSlcNyh}4gjW;Q z%HCZlNdXWoj2;z68+gh(V)gDXWfv>TmIt(T0#Quu=%0V(nEule7}Mw<=ZoxrT;epP7oAo>{M()Gy3}Q*IBK zD9T$V_}rvVVzJl)5Kw zB8_}|^qrNDHoD>zO})&fg-T%2Loiih3y0CzgTQXEgwY3vO#ukkhs zKmM%Z%PUX#g1v>pfnqWP9U-CJlex`zGLJDRv1&JL;r9H|jGSycKHxp{#3E_GW23#6 z+l_n%(#+c`(upBd%~P~4VJp*F77e&&xVa86EkSV=v_*<^x)Y~Ex0mM9>qW4{>%H3bY661F!Hk1#DhwMO8 zw+nw_VS4eiwdG03`O_e(gu_M9f13CS5GuY?XkMe5dJ#aE4~| zqfa20q3iAenCIth6y-;o73Iuv|8`Ug18ol1O33Lbw<}nbCO`jVgxIit$rw;+h+K(SoYZ@;j`9_r)Z+v zMB8Xjk@JF{PbKAj__>_i0R_HQuO%ycLhXbxZItvO;}POFt|13vK4fxT2Xud6CH;E$|yG`p+$RY zAU6I>%B9qdJ+2=yVl!J zVUZJ3_m%7_HM)3eCG<&%S@>9D50Rjo9)|POh{v6B&<;=-0!y_jRSq zOtZNH{!TVVM`4c4)xduj*9sBTZR8O;NyRC{uXDE4QYAQr(g>YySX?0O`d*FAIeCQR z)wF8mo@v`(^M?hWKxa_;Hp`GM4Tm_)z2^KsKe*&3IKHujno8Y$QX&0^yX4ueUf+3W z-WLDcdLt%Y2}s81@*>!_;G%0!vP{eRVpbis zM8Sx(aLvmN6Oca*NiN77WPB@ZG)Da8?YmMYF}uptjt5b!aRd+1Br;G-!9I9< zm*Y?uhb$kCln6hgS>g-;uKoy^gdS~6-w}gZWdfSmnhd>IfULk&(8{b$z%)jc^~u{| z8ilPcA5rY5M;1gKSRKu~?Ar<7Bm{vBbylx=MZeeQn9N4xOJ{7zWi2tOKc|Dfo{(G?Ze$UAa$>d#N0HM>SM zPF(Kd^a2OLwvVWqJe-MjFv$S^iL#k$K_a_@@o1E$@^feORU_@w%`Fn27p)6F$gpa;JFWuOth)kKI(h>Iqx3azR+DW;uW|XJpMnkoP^BB zTxT=%KE9efH8W&!XfHT(;h4kW?suZB4)qI33Cr24FH_aZxReeLWcCbEo{w_|9Y9`; zbm&8_LyR1US2Yt5CEd*n0uc61UwHPm1Q{c;hydExJ)UO-81_GPSxBMJVX4&MFRzF# zTBRhZ=K1jWr6&V$9A?ZF9=QUzMN>t&Rg=cxrhRU_gm~~3j`Z(d}YDt}W@MZmfh+ z165iK(yfN$0=J!h@S}d|>k9&%_5-US5e1oj1@D^L(F7L+}$v*D2~!JmO$X1Rgiu8CmbVTwQly(oNPFf={^m5JqWelD6fD zmv;Ur6>6N}-f&K_kt&o~`f6oDUBF3J_{UVB9|zNRh%4}x8so+MxFKwNdQl8`exzSa zxM-Db^%UE#)sb=^BA~dYe z`F0g?Lkj)@9_d?W9G&!GwI<;f;~*#o!N)akQ_j{N_;K za56RJ3c^<=raJ0jeBRD-b6?mcZ;&l++O)m*2-H_V2H_F7Oo77u3=t0a3E4sb-aIbi zbM{BgqT(rwK7BZ^vJ6k84RymKMcZSJTV{0J_zwVD6;NlO;1U|>oMOak=wC>-h*$&F z5ySFJk+c$W*&`x{l5ONhhqO*+9LW2cuxqO#Me+JnrL1pWxKWh8q%PL68bmE9uL?d{ z<0Y$h-SfR!=RQ0%fJjG!jJ(gaFcW&VsX)iYJ-@XlaAxLF?aZoXM>Wrm?PlMe1Gh3sa9y?Z3w>qJD=^~&OfBmum6xZdJ7q9Cah_-y#Q#1B0lM6DyH6M zWZr7PJ5A`?mq1v9mTc&2!Kh#UVO8(s#e1|zOW-?bX=RZP!+U^?YH) zQY-gLo3?;N^hRSCsf_#DeGvJn8rKoF{3_7mzSv{hMXL`1O`sxnk+yq%7|;gdU{GkT z8~d|Ias*}{bw%kb9DKoWx7`OB4+`M?A0J`>+qK`Ske4us^jvhODm);^g|RNh&+${7*o#qbG_U7Y(2!Yq#)xEZv8G z74oofKxz82mYF&+jHOxye%uYR>fXS0>Sd2&NMFmFpP%WcTN_LiRRtP;oy1g(Te&tL zQw2T-KB<#*@gK3|6A1g6yVte({)5yI#lljZ5JVj4DYKW|L+l2aB<(7yTM$h_;Sx+T zaqWmRc~M_%a9^Pj2ihNa$h~k1)g?C4q1u5))}&Ue*gESInXe(;JY?$@@lRi#W}eO= zgZ_-@ildc{SPd^S)5B=OoFi5&D5PEYM$3XI8u=rl>jf0Q%mgLc8n;FlA-&5!A8)*Z|dnlf7UcFj0d_ptBrMbTUHr_or zESo$B$MOe}Q(c#8St7E_tp@Pq`(1+ryvUL!q$i6k3Iz}&ui3E}rqk`jBW%91LUdK!!A!6zCR1Z`aD?;x0hL8-6IyVH z(~UA&zh3TGKfbVXAa{Fk(*PFh9vkXg$4ce!h`O45Ecr?YJ8n)z?}RXaZ!kQ&kB?U+i4kebjZrexNc--Fa3BWHmY&WFm4PdRUvpS)lQ z=d&psGe-m*#~-L^Nl%e1KvpW5d*NNbH?*j&8RCAEaNnALd04<$j&)xc-lbV z!sFMHR9i&9**ma~2OEb7FERSTV~Y_`NMVhNbQ=&FoN0Zphy*48X!~7&9n_N~(fOQS zL}HS8e?_$Cx=vZ-_VH58xW}5J$nFt^B((=}3GEgU*U>~)XpTFpbqM_x$cf`D;z;LD zW-D8eh|^}_unqLV!M!9oT-KHu60ZohWK$rV&WRq))#PXSz5PU-(Qh8Zfm{VYi)Uh! z0Z#~s;F}D8dS34NJ8gf~f9gPrjZKvGZ|Uy}89`X2cD$em=CKY(_(zw)*VHC0$;~4{ z$u{Vn=HMVKLneX>J8t9UNge$%<$8^+FzeUybvw%VSAniL4M6INGZoS%J%noCF!fIS z2{lj0H-WWbjYWu;3`+3i;x-*18Ik7FicMhIy1g=9!r2dgUj~sWHs2t{JZjbReJK~$ zn3zj?+@0Wrm2{`dU{_@1QdvDki`Ig1nVhoFds^WtU!?TVTNdfF4xnbr)8yHVfV;nw zi9{B|mlY}ZybL1XpVx%M5W&@F^nfov3aZchApySWc!OKO%Zn=(0Zxp=JDPFm(66Wi z9yzPLEh>xh8=iW>&-OMM_W~nBu4=bG=31mA*tbuWPYgZmo?YN0*dInizz#t!u?I+O zK19wze|ce+*rWS>JgVB}{lsC$!JY;q<}{S<`~jw(ihtN;?8uZgIYc4wpL^_4wtMe} zZ!urg@JS!fawj}EvL>YS6n631Y+xPKfc$yRZAC;wDCA8UklkN^o#2vB?=l(oTnQ>~ zETXpcVw)<;qNQ#ta{C)I9Ga7zXlPMlX*gE6Qq30^Y`4P!mVz`x@kCu!nH|C;&)gK8 zNNY&E?KZWpWREb-RCXzi*lUJ(KT41y8wmB37=VmH|6>@-Cm4&7d!gZwTwQ-6ARAE=kjHGi6<*7=#Qkou?XYNcI3R z_nyw;eG9^1mWl;mX_2PUarVb+BV_Q_Q3UfsO_mK0G5T1IGKR9xGy?}v0Cm+FJw!p- z2vN_WrrLn53STjJNdHD7%!Uiu2>t5?(5PgVbM|*fs#aQf6$OEGnic+x)p>CTzmp#` z_q{vW%ePnrAcP} zbLm`@RJ5V<6Zx7FF^}aMggv7YVkb^r(NOrCs$!`{>=B&?1U6uylVc`OxplVFhq*T;+-lk5OjiyO=jqnl)Bj%;>O2aSJq*Tnxz6JN$Qp>DPL z^!%*-$wt_#0i502NQ1Ud>f$@j59ydYXzvco+?A@hs{7-#L`0r*f6_3`;s6LESji!@ zcXII2+}h$iE3hZLR9JyE# zaR#u|heq2fE5I>?T2IH~o&&$z^&}u{Or*H7kPVW=6>;Mpn@#i?O4EILl0m>nWlBA) z<3ZnP0meiXS&@flhL@Uw34RuuKz58A)jrRjSwkqZHg9F3g1R(?Zkty|Yetg~-|4KF zRa|S{$sGi8vR{_gwmYcu#9N=1K~KPRT!-oI zT9_rf;ssZ+^NS9rpy&eu^w`8_lAn;rUQQz+ebCQZ4Ah?_@;oh+dZX|B5uu zoFI0z1-6sb;%(*jP7syoO@odI2`AAh2XXQXEfprb*v**e7VE8NykI{ND>}gDBLUk8 z4`!7Y^-{I~1#IoEEBz)*AtiJXtqyBYzxldxt)c|g*qriwg}?@>m+A!r*Rq#0-GqB< zTz-^%uG4scXr}p{Dn%hf-S~`-wzV?~R^(mSjl|E%4T7oeTrQM1j}44*>YYdi@}M6+ zXXdyr()FzZVs*o(Xb>_E(U>CKgUp2BLzVBwaj*>@kPBenkD3E>(Rehl<&I3q5DA(^ zGlog#aY!+fSd24erlSwe_sf;xbtFHiWIzW|t9q@?Y4y^#;I}kg8G&RI1H*v$AY4%Lc6vsFXQ(y#{D_EXLCzd$frZg}_ z2*C_U+WK2Gz<1SM%=Xr*pu(U{A0+42e5fxRRx6g!?q1c-BH+>_G`zx zS)>Yw81HG56&2cSRY1$WI+rHY<_F4)Kaj#ZshIBh^PVOmFOou=_(kX_)E93oUxJGT z9iCz905mgnJ^63T-x+<^3cYAcK}6$`ag0XOpE#CP!zGKt=f6fz*I0bPn9B(PK^6u1 zBv~g`;o#0kWMqiYbwlKmKw$Si`%rfk;|KAFMV`^*-2Nk45k{f=$3gomMkWfjNy46{ z7FS>YG{dzOz}maCaE-57<88}?3~HRgRoY}{BK8oioC3#%6XIwgY2D=XHkWpnH{8kS zjlz7JImC;F9`cIhd^!y+6^1O&%Ncc)AJb`TSai|ImUE})aY=N~^bu3{oxpA>@-G>d zUku9B_Oio@AH`1Ld;DPr0fmnd>D{+Mfv&(Lcz2114RjOP&3LX+5PJjTmvSH%op6Xu z5>JW=r+kPG_w-oBL!=pp5l3aP0;9PciwfQy3WlOV=o4P>%|D!XhDkGMKBDoz<=g|}GXGrpt>2X{XFQ5`?{&-UL&`aWnN5uMFNz2gfX%We;mfzWz?f5y3P(WECdT z@bDv6@pxMnIR{2~M=2yeba1CDdM}>uL4s}os~)yK2dzBU;A+_qQ=;oufu6;O6b=yL zPx8K0%<2TW&ilv|i9LFiGD&7A;-srO3In?-6+h^nN$GDjEJ?iH(2Nuw2*P($hByJu z&?Q7A(Bet083E2v7cDItguiA}8K_}nOWs!826ezqXs`*c<4dPla3@RXoT4RX{##e9 z12!xbu_Ddl&oQ6$-ylIr=Bi~DeMuiM5psh@y!GYJ_LFBPoO@c*rRrC#W9_tVs6Rjg z&b+dhY z9B@}esU@-KKj8P4uXNDIAe~;o@kHBSnAk0KC7UR1DI(A{X=j2AKr!?J>uIEJ7oDLY zq1L@?`d%y3a^2JaJkCq4KE&_sI(XM? zuv+uQ0^6BbUY%pLm4ECDO5Bq>1J-5^b&y^5Cl3G2$E`+>r~# zkPO_RVcAH=eXHri;ypE5YwOfVH8kqCt0-R4{`;D$O}Iexq^=*N6ZNl621TfQOyR_s zL+tKW3Slg*WOyuN#9~AsqQ_%WCBUw5JvPHPMr*RE<)y+V|CWw}tS-jRZr+sY02e6X zTlJ=^p)a!tzyVGBr&tS4&EmYz3D(cW63rBs&eW{!*fqoWB;5!eq;-XpPQxbzLq1c< zy6ydqD2F6brFHW`b3pq5KgqVP;pyrsSQ!oLT(75r-#g#@unp5-9;zyN9h%no%EY+i zZtVNqC0u$JD={tb2>*=B3t-Lnn_Y5c1f9Q3%p_sSEzy!*GNerPOAjWwhaTGM+|LKM zrxgGVvD*POG%V*@FA4}RHxXw(sMzyai;A46X2yUyENLFxFt#AKWS7I)y=H6SyQKYq zIU-pQ$O_Q|_FT+{8_wLOuymepV?D^=kj98!RRccV(UC3LgM3k&W^Nnt=E#-rD2EM= z%(wd78(~@GVvKw>E8Vo#_sBOx?JMr#V1YvkR05pPMKbL?p zW7@Kh9jL*m5HdU+64noQp8!NayT4ljdH>@K;`ivD{qIWh@gc6K>N?9Jc8JP?9e^!I zzzamBW^tZxj&!HpUAL^S=R*X(&6ce%ymROd%Q{i$dP`jP$=g6|u|Z#!5@_g&;UmwJ z=mhl(olsUjI#~x6nd3bN~QECeB zZw6WZm>>)}5yyhvC=H3BVe329UnGu~UXxR&&v1{jUH@NHdJp>vbzMB}zLKKqg9x!uIJsKy2o?)-Vdg*eE=g8SrWFj4PrqSD|R=7|s3@V_e6 zGv(B8v~AHxlTioGjOODddky$MPJ4E#n^QQ)SJ_GLXW59A)=-6_f$MEUU4Cj9i zHL4@h3RCejwHExKN!pPmsIR+wbv@SZ?cQ{t1>);$wkq>jTOk*PeYkM#5bje@lOzCa zEC*2vwg=&d>5>@I`SX~x0tPM$@oT4}O3;B0t%*vKZTtnfBvcAx`?CEmEFPO`+x!nk z6Y_u4P=~aUL${j3$%!JO4WoKRq5FAI9DVB<#%di9m+OK`W zaV2)nS8nw%7l9(;Hb;oAu(Q*aoOmB4!J+km4G{SILK=5HU{jX=33d0y#`wA1>qdYP z=SI|#kB2nc8F@S}&I521dT(g?yMg_TRD?j`Y6^3>zEbC#)NKM`3|o>6HSEwx(DzG* zrjf`Ruu6}8iO`~0H8h?_MNyDG`oGlZ;Zm#O6lY0+GCnFB6R)Cxr%nmT*(usyKv{e# zNLr=)S63_@O2T0`H71TI_Xk+g+a-?y*EO#tR4WBQUu$;m9lUh-+tjJ)9?t{fd(vlV zG(;*LwYG9mY-OfSAbEx5jCY{T2s3qt79BQxd1rphJe7^-A+gD&3VZ{`G;NdvdP>RF zqZJTPB{&XkJ8{1DA@C5cxhPuw3a{N)C0yMHTV5?VW`@WVb9>rNnY>-D6!uV-=aYS<4uC`KFnmQ%VTs+f)0JJV8JFC8sA=dPD|kouZ`p3sm&rVaNmly0e;oWAMqXf z6ljNBY8kbUoEv~;E889 z8087ue{ziP4KU=}V9jecYGJe|Z`Peo$BmDc&53_*L#$Q{jVbL=;^2h~OuY?DcUPaq zVoZx#(5p~a=a>!}ADOY*SGtOU-HiML(_7)dWL&w}U?L;a*73lBCKU!r ztYt($E0SGyVspNtp;fx96vdYvDO+!%IHgjuEs8zVv*Kk6bwA2%tr-|_JdG4XYpEx% z{ifsR2$)e=;`NtsB_AFL*pC@k;evKDRXiXX%<3F-Q1Upo@sI{_{1Nnx(K@Q5jQk*4HzLnfG+uh*{M zVB(J2J1B+q^F@M{PK6Z934oQ1S9SS2$LLf8@c-Dnq%;3NiN^i618wCnI9h;sBWAx|4J0pi4w&T@)X5ZaYoyPsD?)eAE01iunF$1 zrZqTp@fK2v0U)Q9X7eg|plu7c+&|J}dH~;L$?;obr-CmAFOMu&Epz%PCy$S>{!$Ei z;I{2;u84zTg+eI>-Fnro&fLpQ3CqBkTj;s*MEcf<)z_k1vIgo?^Dj9F{K%t0rE6nF zAZYrrS=mHch}VpxAb$-2D@PtnZPXYse~P?r7ERwkM0w)C*KhW|-uxP=Kg(&p2m<@O z^ZoIw()bBE-IR8+U86H|#*nvPK%WFg^UC)m69FxtjdA==mr=PEeTbM>>ExTWyCLA#1C7BFtw=5dXLX5 z%^(9*MWB`?4i0}+nE*ucVYNrn78x)3B~ zA`bQu>0AEyvL6Y}7}CiFY7N3#;sOswnCWHM-uQAY2IzjuvHwkut5Y+}RS~-(BsxZG zwUwF5*Ps?KXb{GjO_;Xf;j50E^JV;prYf87n|I3A(m9@58G!Jh9$RaH!pVHByuX}j ze-n$v{S^^xDuSt}BAc^vwf2dLCfwv}Cj|=hzU(9?A;2XR1JkG090M*j{g#|ErSVCO zOa#(u(EwMi=BsYir^)1s?XRPl@nI|5d+l&z5*AM8K;?*m>=#taVlh7N=}jK2;+0t% zNzV!AjUMCou}ic5&G!FIY8q5C`Nl1aFeRI{>D9+#N2LyXdh+nL{TRCQ*FEq@G{k8v zA-{&Cf}7}Z=OCN}UV|K5|+mbI5}*n>~!jMiHS& zL_o_XvZHRR^!FcZ7>%wjM2gEa^kBGYx6i)Iw0Ej;>mlkF_C9*d1rYnY?<1U)1x6S}Xr zIC$?rO-%^YE#p=E$7*U9AlkZ|2bAF{^8E2!qkJgbjS5rL1=*j9F?CsX5K$@rwM6%& zLN24DMRkf$dCh}!{0U+ucTQK{YKs$@LnR6(86Xg-wW1WPhO&lB(__5$QcUl(GX=&e z?U{XIJ||dhnOSfvvnI6Zyo0;;>&qdMN`vu{G|#y35{%hLJ0LV!4aZ_p`4ee~3yoom z@fjLViSC7sN^)BEaV+&8#G$M9;t`MjBV*^}<=khVEcY}$d$@C-pn*cx>_sZc8j`7~ zs`;qR2YCz>S3Of*4Ry-i0?JY3StxSp-EaxvZ9JQWqXDlgqzk}(1BUP{Fe!XZa!W0; zaVdel6%pWPw20Zf$(zQlcR?Kfn%#horjnl0o&z2D>{ zmPKywm+>1?VX!(f?e@TU4I9T8~ zINDpCa{LWETE}IW(AE+h@476&J^xW`#+0F*^MoAANBf&ry&}Vq?mgksy9^abSWFaW zRKr}XkWqGSk*o9wiS~;!l6au`rYbX}iI;twBSp{!<&~J!eez03P-O!Zb_urzA{vzG z#8Z*Vp7oO>3=E&~y+tQ-#_^Kz6s-NWRz3k4gIN4FDuu7%!~&Z2U`WZA_IjbCP!|38 zN(=7H%UPPG*Gh`>!`P)?PV>1=xD;^S-)rwq+rdOZqOHnE0#-UUW=c3%9{+h+Sk{lZ zS!%!eyp1;HI8}FuQ;(XDCEEmjj}MpR-d@G0>RL!q?f- z?shSdtsbEuNS6>scxRE#7ujY0T_8&Z$?jcoRY{wZbZ&;xCK&2(C0!=c!#GUgVfmYA zO9w^n!tm53XXW8_JA9t^wAe))wEKgAbx%1 zGTh!cJ_suf11#QRR(SFr(ui!O;A<^lIb4Erler1>t_w>YJ_OWiGR6UGo^+EOm1;hX zaDS4Am@G|TS!w7{pn6jonAmo(|`OJ8_-jhAdu|blMCO<7{IrNuJkruOs}Z z`a^{ysq$vF+*F7){JTb3+=5u|K4#&lY_{mT-o^w^O=03Gq zpDP*8e#}UEW7s7JYBO?XOQKeNN4!ouE~T`lbz)QlN`FQR#WFPKU_%GEjPkl5JahKc zpav;gy4R60tHm;#21Ae}8ZOdeZaup!W{J?P4pxC+dq24GtuSnThzpRmOy#7wGFiy6SkwBq)769UGYjU&f?bI4A*m0|fZ`|o7B2&F z?{C0qKL=tSa9@@x?HT)BMnxjmmlO$ho>Ecl&9!W`YkhTK|0<=V4Z7@u=<%!xLGguf zNsA*LbN9PQy-Qo+t2o2K=kxOrUSyd$p(A4!y-o?|KXRXPHL!gjAH z|0(@u#_THodno1a<~yk#!ExJBNJYekAM2H;26NeH6v;wglo~;rB_jfI%pfxWg|BeZ zt!uty2NiNT@U^Vl z={Q@O?iDZOWU+aaji*u-j2fQeBDM#zF8W;?Hvnm4mTz1w|b((U~9Cpq0+(%m24r*<+JVRX7)yC{rEAdC()_ z_QpyA#eEYnXu%Zm?zqP@Y;V>$CggMRbs)QoT5B@Hrsedv|FeI(2Pt-Mg zR@ELsyE*_s##RvSdn2s#H28bHkE2Tf0I&&UeyAOkaKfRji--cab4mcs8-IKj4tb!9Yz{m#(cP6N^`QnjJ6W=1LVB*~%Hub3`G^hi}` zVM-sis*V*hHolt8Ur&N-p0&bLQf*ThVt3%XKfox(XOl{1lCsWCouCcv0FZzUa9{`K zhv-p2JRRWKGL zk>uhAO*kEEM9)hjbm%2!#et3(H|+%5>0zWZGkpHa(vg2Q7=MAr#(cY7#hE6e(>8Le zUyj!_Y_RNFxkEltd*bY|YL3ytLSM=?lFNU}-QG##M2l;5)A;Q{`fD9Jm#V3kQWX_4FV zAgq`Cl+Fi$G+nUqD1BfhF8p-%DlPN7ge0HxolegZl&~RldAGPv90=SR zB-|T6Oa&XuxnF$54%ou;F@-iiZsD%JC_`V@?TGr2GFp{=A)|=fKHu5ZU?1LQdZsU)Bfqwjci+JtJi#qdi@UaBJEZn(SQIQ)_ zT*5J>uG|5N0rRyczNBLhpsx@=$UXsuk@L@msTTTJ7!U+~G+g3lfXG5{^Dt$`Qf7p| z;cZ|FldFf3Ox^ur>nf4_oD^-m?nxXH*uBP*uR+!>G97E`p>a?X1644qqtpXHX!11n zp`R~NgUEQ#k=-+k>Y11Tj4iVsXEr;#SnP>8#t;bY61or$?VhjCpu=@n}zoXv)GqePg+EO>!1HI44m7b zk62>`S*Dly=gYKvH55oiD`hu(>~eK)=nw&d{CQ^t)>_%~Es6Z>8JR;F()|z~po)(- z2eLk2+mfmaiIb|KAX*2Xt5nRB`QOxbSn&7dpV2rD2aV)%ynz+V) zJ#k)iFGGSpjse#pT-G{-jZ1pp#GvWXHAhqK;W9Y|Mp1q(OuAf0(&1#OSuY%_Gdsdz z;G4$~_6!H9XDs-`Z3J^Wz>cY88j^n4qSD#12Xa1N7bhsfrWj0NKd8+OrcD^evNJTM07yj~@PWcLDx>P|Uu=89~>NRr?XXO3QRV)(P!j0`HJ z*^_u}Vk!T~o+ctjfyX5y8epR153HQ&#t7#v(ANlTIt)~0IQtJRM}jW|WV>83^GaYz z;N1vCx#=(Q_(=XPfvOat$jA#3FY#>{zMGJJittk!%W$%P$rJQbBxWpSu(XSs>E7w6 ze+DjxD`?08{X_l?Z_jqf7;x&6M`$psNi?Vl_wBn+C5Dw|MlD4*vlcvny#!E_=fl`> zPU2WYz#*bChQ+4=ieZ4Lu+A?#D{qVHet#4GJ2Y!du^4{JzkT1?UsN=KG~ZOGr(ET# z+IE!*BB&SPjJcR5@#{B04w@@YVlf4S_+_{36h;hm3rPVQA;AD2#sU4CY-wXey#$0y~5LzHI_>0&0;gY}J&wo$$9N*ebGoN-qxm_UsMgnvQF zH1fKFVD_mk8A&9JwBo!s^iFmy#%=ktz$qw?gj@yiSO<&YVcpH)G^?h?{n%qW-jh9L zOU}&!X1LNluuBuEc)XkaTHyNX{v=AgCE^akF=4-fP~?5A zXfP-#_;;n0#Sr$jNEc11T)O94`Vy5!;0cQ$Z@KgNX({6B3ZJrzsfCjW)_i4fUWU~&Oytkk<4!>v* z`8oQBTdr7DJ@0EqznJ--!+(cLsW%6X_F4MXp_#$B{W|Rl8TFWSRhho16KsN~GHM2h_pS1l`g8E!vE++Scg5%lSxu>lov7OsLNRF=>haMgYd?Q>@OaN#-~h3DEO zCB6o;7AXm;CAjoNhwLCA{5tz#<9{Q_aQ&$bISa*dRYi(=6YPJ{OpPWubU1u(qRR=p zoTo|7ZEL}gP>g3ijMrX|E`BWav^eBXl|tH-(Fqt&7)rYEV^<%JaPv=eC*zr>KKE%X z>&+SF{|G0ku_ZfWA6`e9qOn=Bd77-@gGq_iN2Wdn%J8sVQft|rjulsA$LZ_VOAJoK zIdS+5|+ChL-z+B%azOY>53JgRu?Nw6iAdl;TLe$;` z29G9Ay@=6h1jmbq4j$_oY1Z92T7YR=i>??&@@6#Il_{)K`;@mU0kV$q3(_>)Nlk0#n0 zE!)fagW1q>JS-|xI44X{0q;lxHJ*R4Doaop-R3J&1$^u9KmVgoEn-PmsA>3@7D5T^ zbVr=rJTt;@sFdeO0J^7pwdY=PiLOL%W~J_}{W+pLlqCY+{GXfEZv?9j z9v(m_cwNKB(Ax(5-L=^-znRt=NY3vhYy%h5e{Owg+>34VHozwI>=K7T# z@$&}~LgL?R@4cT0p-Z>1s!J+nF|Ji7sYq}T+-gdewrW+n-+cJWLl0L7!@BvOpu!PC z2x#Ts>+V|$*e&&e=((g*J#sHmjZ7dG>q97DF^fgiyWbpAVy%!FKcAv8f~=t$XCW$D z5d9sI0t<0TWR^&yTvOP>RUCjCHc7TMCb>qwr=WHES!h7akLz*Gvx4qz+=PhKLccHZ zx-{6&Z27y1*)I80knL>7YwY+VN~`@)_Yf_7KZr$4_q+kT#sGI87(V`|z-!GinD07l zON%`UXQ<+Ac;B+;+s`+**{ttBpy!t7pWh)N3&nulCXECH?pZb2GGF*oO->Dhx7}$a z0}&v?0yA?46q4?3isB!~8VSF&@9kMy>Z7qEHD7^fny!b_POHo~1DbJltt>jBdFs=JO%!NasD<^GBBXguQF26sU#11Y} zy;+p$+f|xlg{59lF{oyN$xd4JNfsO} z=?n&E1`X5?l)#Wv5@M$Wa88f_)5GbJ3%!MXsGEN5n|J;gU4wuT7Hd6HSn&dScM*ku#Rl0ad*5PFJcE7$<6<$oS>&$ zOaNRq#7LoUE7Bgtd8c4>0J$Xd%& zgD*r~d^Qf!F~L5X@fvD!zBc(W`N10_pP6!JdZPR^>?ggNNrA|hB!v(y&i20CKZ1xa zP-uo@PRFd6mN-et^_i5#-OEL1IMy{Rw|ZMc=*zL3@iIU*y=sHMfIlyKdE0W6a0MF* zJCpF62L--WJm@Y6^V8sizrCx>TTUEWx|^j$R@JxuS#YtxP<>#FTo9nM9>NGPau0=o z3nN01oCehZ3g|JGejh_;Mytdi6^LnU(-O!+paoe#+HcGKa*v}Ju}poKaXZ-?MF@O9 z*H1qcgY(4(?IjN9)0!#)G;B^@57t}90NbjV8D7Hcib#v25UZ+s=d+RoViftMN8=JY zRYTBSE80D=g)UV0WA4qr!$SFLC)K`sO+BU92UuvvBh^Hot)DF1lwm|K1XCsRboaAdfHpDN_{suX^<7#0!k5JJC#gh7$ z6_?^XM@?IG@6ZAYE$42^!TwGKq^==MA> z09ni?o0qoB1{wrWng!nk5%c@#%3R^dzMJEScrrC>AXG}^VaNR3iY7qwUMHp#CGeQ7 zJ)&GsZdd$AGaDvSsxM(wG@@v4tcO29U8s&JcP(R%ajz_K^T`qiDhYZF|E^G4c+K-P z8rtbx-kehf+&evTt2-RWf+mrB3)Z)m*&3BTAWl8I0 zJ;M~Kl>qDskCA?2<9=1=Us!-9WNz8=^Q;X#`Z}xWqi}eS3JWcUeQ+la^=b9(A9hhSf15(1lcFq5YOFx)vps6*`i* zqcsaBQ1eo(QwzjjA2b({gg#yOe@I06KE=?CVKq#B1DPh8seq0);~*vmBm^|*ocT{s(;$9 zFD|Y(rcqxb67pP#XTx?+cUKn7evcFySKy>+?3n`MnP^V2mMyETuJ2O=)mhn0HeT1= zy^*e2E-O&72Li-yU%)?%@sSQ7aPVE}+j8`{4{Nz_mK&K}ysR)`?-V_h-_LJ`hdX*o2$$t0$I;>FO$>rIbgY)KvKkyabX8wDX;pQW77o!lx0>ia zy&X4(v};D9CY=X=6W39xw!|)+Oswz)znuB-mF5hwMVbH%$EI<+G2b(uOc)J5TaF)( zw0r2PP0Hh@8r!dG7>4DAV-7S^;(oIn(#YdPi zL~@zy{f%!2Wv)C<`zvMI99}JDz8o_+!!P2<((RW1$IUC9ucZBgNx`{&-GZz)FGIy{ zxe{*`$rz2Rf^yH!yD?f_0yf!Mdp<;s7`O=ULPMi(ox!Ggi}C5RWmJVOl!z5w+NW*Z za$nf6{HM_L%w7N=5GB)^oFBLU;P$vP(by(^N$hu%NQbEE^nAX zy|5P1u&<>F^zf1igZ$$hN6Kbi%mDc4CLz|sZ?m(Y+tm;!`O{fLVgg%efEJUpp%f># znUMNX@k5}TtOZ&zfxju}wj zEy^V%Bg<`@#t0ImL4=KO|21$)L>&W!#`e$Rg0U#Mv=fG=>7(wMQk2f4S1}k&iKCgJ zhz3gkFOUAsX{vaZ*{o^LOW}LI)4_x%9c9YT{5fQV)i~iIj>r|d2Htf+dblNWGAM4@ ziJLnzQS^zSkEoG-B(s`)uX%ZT7w%OoHU#Y1G4jfD)HBmax0q$I2bfvGidMZVetVhG z2s%DH=|<2h8OkuNH!otoefE9B2!k8Fd!=UGrLt{2Wa;HV(dVYI;);9H@?1)nDH#JV z=G90%eLRsRmFq3;kQkS5g_A^z*1~MN^IFpE0>K;fIP2D+mp4!4+|QN`9|2=L0L*Aw ziB9Cpfc)Ih2TUu_IPQW?aLIz@94K4g@DqogH48)BgBUm_9JV;fGq&bUTvcu^kMB$K z9k=MGOPfF@B^_D?Yo}TD(497N%&{z8IKD}wc&`z9OYT~vx*}X7Rm$hY05{jLYXcHg z^%%*>h7a6@$^5a4v!Y8M6A>0T)apSE&i#1yt~C|;?ce*+K{^39Ey9RI4pX$Gr(DOZ zv&{C)z2YTX(5IL_j=r_4hV>LJ3&jITy{SZ9fT;XZ|HjtEo^D#+8=rOj!xDZjFD=^$0a81dlox8Q=$7OUiZ+qJ$uUBNG!!Rn zPmG|Px+oGY+o{CQfb;$6w!Mzn%lm01hhNR&-gkJ|D)hn)7HnZb)<3~=A;w|&W72tz z=ed`#Pw2*pf4Q2cSy+xt`7Kk_Eja&H{dB6yDkWz(@5sA(U;d12;mojwS!(-nl*@7m zmP?OvebRgGEs8Je1C_Vx1gRiaz1YiAxpx><@o4pNYi6?`B7ZfUY}psB}r zziY0b!ym=!ZWIrqu2dzWF3X@s;41sL=!rS3H{%a4YYqx9iWDqX>%8uDA3Q)3L5ra5 zSt`OeZsmn{hCR_lG{_Gb`5#%ngGAzj8lRN|e#R1xyp0Q$*bOLGN>)s1quCNIYk5$SxAsUrO z8$!x?UvNxx!*EPk7VrA+D;#EnaZ zozks5Ppz#DtCTvgh*S(T8qcg?(w!N+e|aH1z==9%+NsMeTq6_gOihi;rR$BzEIO?W z9Q7&~yL!=j?a{}1mnv)LR=vq#DMT!&=_Kt%B+sH(tiNevp(gQXnr~-iSKp;TYI|&?Ya>>O~(_)F`$r03AnkcU75dy zbOq6%zFt#ow{K+zdu%d;dzHbJq@YqucU3&v5+K&ge1IH0xB1c$>Q_o2*fV-w*B*v% zut~4g8|GGLVwD@5>SDqRWZh65-uq@v*$=?n5tb1iNk} zyNUHyO#r}ISfI7BM+|EksR*kl%?eHcwTHNSjJ(K|mhXXrD}LEWWs_nKzwqUZ2!WlNl~zw~ck zv6y_hC4?y3c+?Y5@VQtOaS`yW1#ld%P&8+^;M}xg345u^b*M%B<#WYYkzjU@Nj*Oa zEx$03UL}Ruax^~peo&JM!K4dS%*l}wAr#Pk`e5W@MSu|{Bea_v;+&SPi}{|~ z00d}cU1r1UGovD(zhFV6QVAXGG)E?>Gn*xr z_QmJ65!9w`&c+5=VARo_6;z?x;+erXk%ELoSKr_CCFX9RWPThCB4`wAg}dCOe2|IP z9${`rsE*E`(7lM4P5Lw80rA^!2V&IxfPrKu0gu-;w1MeT^?I9)VN~yyqYr2ffi=p1 zjmR6TSS&E#$nAK!EW|}MpX?OR$s8??YTEZAQ345o>I{p~tRfRXb(v=Ev6aP?BQKyb znqA3qLM#1Yq)C1+RCJg}kyGiaexwPw@#m!s-DCTrvFPxsloWW7@G z6Loi_Mv96bDU|V(r(Egmw=y!(el@L`dA&7Ma<=crrm-urFHzTdX~`j&g#20jhza=3 ze&5Sz%02g#EXO!Obz83}H*%~M3u^tb3qxqleibc| znSuLr`fL~1#_~iJWVgyM#&Wlfn*bc7+7z!qW$>rt{S+G%AlV<8X001^Try#<&?!!S&_<#il^D;?)daMj8d?D03R}~?)eS8XfNA(O zqf+@uGD1#^bt(rk5WStYXnNE1BN_Ok!X#ny5LO%IOR<-raVe0(c=O!za1PJh7Rv;W zfzp$b;Hi!iXP+U4XzZg8;QKUW5d?r)GkO{rYS7V#l9`HZZx9E@tIElZ#dnEJ`A5=t zwXQXHqik`i6YTRku6bAjDis0bo|hhiz;$nA4^~9jaE+FIp(KLMWFMUl5$~M$@^y`b z;|A23y;~6RE!VuGswY|7XWj5w;JS62HNXUx-xVmN<+k`H+h~+TaFFDst7ClNO*$vG zR#FO{v?-{2R&O`&=?ES%gDvi)c?bFwGA7n!&)FC3{O@{H@d&1w6*#rcQ#TrTG6=ql zSx60g`LP-ktHq~+_MqA{m=a0e*kYP8hsy2~Xs-r$(%!}zhw7V}ErpqzH6#LqnVf0Q z0Ow25bw}zm%b_)^nbGFDR<$&+&38PulVc1PGZ*GfRVG%C`>z~jhzG43*<2O70J{2QY((j+yIZr2^C>&>Q0Wb|Qh(3i(i+$km`i&@4 z-3yQ2r7x{A2SlcEvPuSI)7S&%F=^j(B0dNwfZoW(?F!&~YwqZ3!Sx;w{Peig;}Jyt z>b|?czT3I?RrZWRLt20+v$8@`OxZju z)}R*Ue(WiTz^P}ti`W!K3iP=h`tLU*f&O)iJxc&1?q$H9(mV@7{Ref}`8a1}7okv#l0 zWjcEZ8zJ(ZDbS@szK#Moh!MyLh4`6 zDta_I?9~UeBLOw;?CmK5L()y?cPb2WGcb-TT-ydhXcKMoAAuKuq_kZX0tr%t*R0lm zET-C3Rq5_Bamwj*e-Ve5g#_zecqmGsdU*LDHa2ZCo>({EW&5QE{CPYbv=`E$or3dP z*+h8I**5$^x?-uKl8xGPuXioBg3d`*0Zdtu2|!}r!q+#Fg?b2aC6u#-VuE$4F8u@T zL#BnU75&iS4bCjxVf9AdjZIAZy@;WD6P1i|rsj|nM9HT(Sj6qRmGf36w=`ZKVOnQ{ zZw(=}vql{OMhbaGUx3r0GA^im$4m!F=@HsGi00(Gh8rk-pvn}_IN4qv%Okt3&2)p1 zKy4d+tiyczu2pj=^_{_$2hHZP56+IGZ19?2Ypj*^rm8*{1v{y)omGjC;M3}deQ4@Z z+|$Q*!pmh}4ymsSs$A;QdA?dKZjzRI!xlycS~F^PKp{8Y(YhrB-0-9f%DX+%DvHC6 zO6nx*Gckof$;lG3I7Il&Xi1ydz6g^V3R!1r^mm3x*(F!Vo;H19uOaN%Ooh~3NnGVVQ84?c|$YHkxpO1Y~IIh8J?`{!Yj5HK-Y;~qm zrGcDz@0y!!`@+;7u9jm4Ss^~%C$j*BNLWvUtNos&X?H{>= z%j1h0*>W97F^IRn?d8LGpWpjT?q$4uv54Tst(pjMmU{w8RdbcK7-3sIw4VPI*z@qa z@y$tWLavJNSOAOXN?i(bee7fQ*5IMJ>XG+6!WL4Hc^D(j^AG-Z4Zw_u1Jm@_<;gM zIjeaC*prPsJtn$^uEd%7e|$7^CzhRV42O%3@6$ zANiU*%~qDfRM5g@*^lveFq?^oAU0Umg|QJhBUx5lpY9O|cx0uqegW53P;R%yYeNG1 z-Nd?CVeSekiuG$p(MnPvx+_&Co%$oS-gtV{I$CmdHzGNG8g9WHpuFnJ$##0Jb zRq7VC3rF5A!X71s2h$e$bFs9lx8kbjaDSkj5kRrV#l?>b+DN}M!DSozz+c% z0)2S!R_o}pKPBhmfooYpe4DudMpC@rGVS5TYR~}L{?|_}k%!v+Vq(+wpnxh+w&mSG~?}G&L8o!$m1QcA8_VA0})$%-5haYKT*LH z(s&*u&Qv*%P{s|DCy^pkY%)52(wa>$ud-4NnEg(w2Lc}(Ov>g=n!PF~)OtII(;&MNVq{Zlx?dUHN|2$gKYOV{@0nrA04zjADC@e~r$p6RF zKg})(^;i)<&j|!|GYWLm4WI!-=nxVL=tWh;-AcD4JRhmK_Nx-Eem0zz#BbIK4xAWl zakf3Bn2TmNAUnpTOmgk{ZV$NA@C2nZ7YVu~X^yYLaGIeNwojrNy`K35&)MQY!sHA9 z2kL*)oB_HjP=dbUH-e=6$t-5JFVl6()3i!VGqo7KM*H<2XDdA^cGeJ@5pRU4c=bKy z5R1gdRIR@<5CTGfOId3U{ent{SzCY5w!p3(wQL*6DZn~Am)N{=@frX?K)=6<|D_TS z@8-SaXsH54aJV!qkqT5nqx1*ddW!iFazq5nDJm9UBNqw>OJiCb%h2Uy z_m13Ei1` zWx7o5p5ToS!ne+c7q+5PaU1s3c!DXCYQt=6K6kY`)BqoFxt%VQAgvzRBA$PHC<>j3 zdS%2L=zu1rz4)yjy`IQMdLuTog ztbL=E9VR>Cm`4aUEmK)nVpLHv(DZPJTR+dnkz7D6vz9biisSRCZ*5ph+t#e%u25fD z)DN1tm7hxs8u3*e2^ddd;Frl59~4G>Q8@y`c##>dVouQXZ3Y$n*pKoqz_m4PY?kv# z`~*on@~HH%sKatXIK#1o=M5d#K=GM|POsRz@d-a_4{TJJ&>{Hqbm;kD&i39m+1${E zkb6))e3Nt)zQDZTb?ZBUOv+KV7d9%kfcYih_P78@(hi8^&u%^>eMM$B zOY4SJO0StBXP+NJuF;EV=vg2velDz9&XUvIj&rthz?v`F!~*=)0rVf``8g*@B$$-E zpIqdz7MQ>&yoO~~bSo8NSzgaZB^%+!fTKaB;5^KidL-wHm)<}<8sgc?faV=y3v>k3H@C*VR zrIoVntUB~To5SYu-1T(FKHE`yLKU4@0x3Di59N?VLDOTQa2FcB9hG!88Ed-aC<0&(1NmaH5TS!6w2eF+o3b!|HEj+8OwFK|G+#wKNTLGjQ?RqSuRgn zKTvNUWtgX48sS&b4V2BcGfoKh z$kVv=tMqX)bS)3uN`Alt_A=eMS8nF}gjW39-Kx66!B(EinQN#O+dN0YyBLT|EX=7} z#>S9`N4#B`4}L%!bp=9tP7Z}Ta2!YjGbr{UQ>4jXSO>FZ2`M`Ch^T_Vk|hy zFotd9wv7;k(=*mHZgxjz`*Nt@ZgxD?Nx1&ScMJml+n-?Z^PRgV`||y@ozsJf5I-T^ zm_e7kDHsEu{$%y3*p0P+tmH-nC}UQ2VCFTjfsC#XtT+w4Vm9=HTpZNADV| zL2WWG;anaWbv+9Xcm4D4f1~ccWmLA>?Ceb3s3jCnTwM$Qo}1ZpRzba%%jB*g{0cw8 z*Ccx*BXCu${g`|dFDoW{gKNL^2m?W+b0tUp;ojIPf<(xwtThega%$l*A2zEr~nR0b|-nO z{ok+89|cG%{P&^Nl3E;B2jU{+Q_kiOcD(eXGS#jl$Q7g(#0QwIjUb>F+ox4Lm227G zCMH+A%RKP_(gJ;>S^|XX9s^GVdc_IP^25WpD*?s(@JRKX=P!~l3ZHj{GfIg}obD}| z_d=2zJ14GTyrF~y1*us!+JRMiM4t{%=u@9M)n0kP&dp_DoknM`^?yl;DQA#CcQxh-`bTnV|6oo}b_2c~W~z1MzA>fG=L#4?ex^bfkw zrVCU$TIy$1&g)}G(g2b>{C#xnQWxIxVjYHLxM6|g<-GrHS3^Ro4PKn0&}KTt#7>(* zgIHsI0!l=dao9q+W@~!uVV>vn5K%FQ_MXWGy=liLmVbbYv=Mr$@06q?lx$qE;uAx# zUshK)s<3mzV*Lp9E$bJUf4CG5S$q!8`dL14u#n-t1gc>{Usa`bvC=|*paRecq^v*n zj_SAdO!5igxf?pMj!7hf9|RI!7~^aF@IdBjkeX&pVR#XaTgS7mAc6vJ0C z-?rZUe2-xeZ6t=jd7lF35M!XG`I&_B8?Eo91BVxNi+$QtRm3q~qJ$CY`uKKVJ6) z#Jbj!uTn0I z7xZ<9EBz2(ZjpG8w`kVvfWt~8Lcg4zjG?j;-Q|l>ofat*7*~|FM{lM(3*-jw zB`LR4jRQ!hYnF36F%V-d4I-(d%5LNaq(z?9WUeH(fvQbcE(^UUf`fXz#9H&KsAH%* z?*R)t3J(uT)Qh=fG}H>J&#fO&w;ciJfjc)%(w*|zmM|KK)GyNTdq6**ewQDL+pG81 zB`-!*0KjK;M3ZvC;txvBQT*};CK%h?9q}9~DaOLsb_gCfm-CV81t8R_^c3Icvvc1xD{~S(@y=1wFZlMtWaO%UH55d0R1NmcljibT- zEQ99JJNJ@qSv?-{n_f>)iXQIfE%A&R2LcUK48fGVG0ZZG1GSjsYDyXj0Kp}c43N~(K-eUR|$^z zV$SS+CETkA>h0>#v*E0l?^=F$^$j%I4LmU?!6s6^3BjOs;>qTlGQ!o&X>+7gpAgj+; zfxxV|?DOhu=AS!CdbT_O*d=J&ZNh|)DuF-t@k(OoL572**{2G&zv{@WodFqVS>YUw z8?7VwLg}ISjuTemrV*zJ1A*GQB%1JsD%EnCq1ImnU0j&Zu5{KAsK>-)LXP;#&VGw6 zY-PX*px7_NTVJg({yoqWNz)(zJM?2RkgU5V(GFi#fG_z+m&vY9_BNK?4iuvE=MyY? zlyp93ts(#Nfr6Ccl<>s3>qnv?x#GC;LLf)bgO09eOwuYs07{d7^>AAHalBfK87u4U z+W|-z=|)f;lz`y2SGDmV19yPzmBn#5J-7lWaJC!@m*giTiW=Rz@zj7zSXDLj`vLtG z4%Cn@>;sGgl7bQAMxJNPm<0DW*i|71K}1M`n%OKiu{ni}K)SnrpM*=CiwU!SNOwu~ z1980zIEH2i5uPzxN%};0U28Uok~05rIP* zi8wYWz>{`xp}uxp39WIhk`sSzAcxVMaJh%Bg$-b%IZ%zI#e$7AXgKUy3?Gs{queZv z|82>sDz8A44Tr7$AIuLn9t?Xo#hARIh+cM(wvFV9#;#A|41$A}u7ECUJpxvsIB@62 z`k|DK4CXcan7q3f4ckE`f>bHA2egt^SyLrleQz_;x##ojJCv7#YTe6aYl-ba=;SiY zBw7Pca2t|$B?FkpVUgIbL+>vOuF66_NKKkvf+SG}Eou6i125*^bvSx?RXDU?*`>|) zJJ(WZQOsjvxsA9v;KjPu8nX3N(0(7l>)+dkYv+cDgk;-b`2Ws{!!BE>k#rkj1i$%c zCyJ#VG&*f=ullZYW<6=V?41D!!l<`6qKDNpi>QG+4=gCBnfhE=f2nbFl;x)W>xTZ8 z_;}u*1pwiRsUQ&!kmd)h0A1;G5R|Y(XupW+U!$@_*d%=QthpraOtlX_vd z*pCM=GwXKkM&5h5tLQaAbkU%VlL2Q4W4v_X{FyBuOh^>eIt59E_R zK0#42053^23wR}+Ew%jW*B4d(-EzRo`#qa~>9sq#vu;O-Vr3QTa-?AfSRj6Zb%S)d z4qWU=(MG50D))tLiRepe_RAOSrw}d>*R3dg+4GsfRtlQM<9Z zO37C2V;pcq`g!PHp{>dO>o`~}ybg6RaRr386UXldBZ$PG@W2*iQWhnVW(lYJqeWxs z!&>|zpB6o;{@e~u%T*w+_X)CCj@z{~$eooMG_}!ksFn+R%KlzhWgcxij6L;4F)$Fg z_5(@O%h_+y2gNqEicoV*^ce&r6 z=o8-o_Lg?tYS0RZLW??!xBwvZ<9Do2w>wDP7WaQ@*t3?Kg=TR+xZb^&_X_>}qbdV{ zC45Q6*7a=_fnYukvW9s_G-@6=c8$i6kp0H}xdv;(xN>=FhK*ng;ep@DIb1<`ilR}( z9AbzQ-=#;iuhACJeW^hlk1RwF*-zE-Ev@|1NqYWQv-rM~zm$L{ssElRy#_$xp?3Pv zvUPc(2_ScFWN)Vh+agzQnKcK)ME$#?d!&upaBf$!*Zg7CV&r`-!~mR+q$d@Rs8W6S z#5~iUX7CZCr*gSa0D;6|5)N}Me(CsDVyBnhANZS%<6^lnCnwUI==8xSZG4YnaN<0oS{}C z$LBtirR1lQ6X5dS&Ovj5D@6KX4E_SLXbWzBCfVexY30YpF&cVsyB=bS% zkNBWdckp===s&CVlNpgm#Mb>ev~ne@rHt>|V^3g?_Xz(=@Y4NImXpY2hY8*r{_+Gg zBYUH(o9z_EC?8`Q_m`r#>l+Ko_jl-aMWKbDV5*Onx&Bt_;qqHuB&6j!Rp8)$7P+wb zV$GR>FP72?SGN<#QGh|&Zfs`%cz7NOt?WGHX!SFS6i=&ClJThysayRJGZ|_PFMza9 zNFR`R*=zXLG1DtkkG=y`SMCa3c4#c2<>2i-37yxEnIe?yTjgtlfKmwYhtz69{bCd- zgwp9cNJaIdP6AoV9}S?JWw*2%uhuOKBL|+7H*Y5t@8ZKggCnqw39gG%Z57z#;h5Ii zjKXh%vZ;x`Ga{H_>M30s;=v9O_5sWP_uW@c{o`cr(C(^?@W4kr1L@d4hp(fbIlxRL z6BhpO;gqY9!!w|XOg<{&Iau_Bxl!f--x-hmJuBhDl+avc`28a^hg#PB)(;AFQVYk0 zshpK8I-4Q@Qtqo%Lb>y0K+oXCjxm_A*Kf!s!_t4iUm3a12aYrHpg~gK5UMpt7q_Io zEaj@6iF3X*?Sd^_+zo2edkJSil|d--eC*WVBM}Xn{?-XMu6!ZVNwzI{N$OsZTpdbi z@GqC|+(!coZluYms8YR)VSwtH^ch2|%WV1?&o0>+s-XBHUi?aAGze9!C5FL{Cbj(D z1k4d;T<{O{4oBcgWV`tGg*CIA+-+XHKg=M9ff^;MizRhk-_I30o408Ds{O_755`@hqFG zDZqE5vQN$)5JsoiUlQm^}BU>b}c0o1cFE^%oNz}bUZznX*s4)>vFAaWyb7- zjt$OBZcC#D87#qK97p7c35LV1I9@CsMBBeyo61uL^UVbw#9HV6{K`6wg0wqTyx83^ zQ>&)mq4Or9_Z%Ck8SahOw(!ivDEuq+Zieh(=5R3Qv}*6+$6bl#Ubl z2ShD)Ghf8o%2N+le9nPb5UIH{@I}eZoglbF_LH)T6euF+#u#O4%?~wamcShR0trEC|`P7D4*{jE%uRANNGE!g*p=j;!y$=m(~cfn7|sp zx<9>*FPVmo`U5Fs#cxoQpiYAmg8W_5BF0OQeehodUoVW2^5W-BDHDSLgG+a@@UyQq zn*Hf+xsf1)H;gyC{RzzGEQ^Y5zfaItkogkn0H4bBu!B8|_{faJ*|<@NU+^gq3G%O5 z3na_|9VG??z0wQDB32jC!kQPyr71bTzS9Q1Q#})6HxV4K%JOPthf(A968`KMjoxOx zKqP5bY#}qS3m;3*=gnajJ-D>{K;EpdJo`s@i>$D`A7`}Avbb<=LgSzAjw>0Y2ymj4 zLyvZ$JX>BtneFYUG5H-Fx9R1L^ck-J-!~r)$2BmW9)>0WRrDsf@q7o0;*9MGi4e zD!-6ZHhZzXLes`m+JqSKcy%?%10$O9jqYz7y;B>=xfG5ZE5|X&Sh+`;4PaT(rhk?R z_^zX*S0cZ&4PkYjmKyWB9yyBb_Iq!q^3(-NC4WcIS>G}6y40g$x_}XGa+-1_m#KB! zCUZHR+7^q$gst^P|UBw4mc_mS=Hdlcf6`+$#ldhAI@4VwUe}kKzX- zON{U6n*P>YVTKCvT{LuAW}*WPB0tu}r7+n6CeK7tD1+2xa;VmiM~#u)=$>0FhW<`#G) zvH^Uc)_XZ!vYae|cXFIi{2&O4f}HyeOGdGn6xfFG`L4&XZC;JlhF_pOp)+DFQ~z5i z+>;*h@_>MqdU%H?f#=xI6kx?Gq}BhqH`x1He?6Gc06`YAtc!OEeJgdNKzKawPu@70 zb12S7_ow&!eeK5)9xF1a54ia+6N1TnIM^Mtl&8po-(4_!^vF8NlZaA}9}MsP`r7Ec zjok{)>ya1>WSsm;>I2u-gIyVJPR`C-YR8<`eIWe&5#5t^$}P)cZ~>{u_N@`^c?x#C zM2(pNawi-v42Zw&B8ADbxx@Nv1dS1KGWxg!=-9hE07^Y~Rc8YSHi0*}3Xt~0W<=Cz z>yx3dzAWeW(DA~p0zThHpMpQoyapjuX_M#T$$=AlqKkF7H8;L-(ma@6!S)=)HI`%| z_D~z?ZDYlN3ttgny1NNy$hFdEgdE$WLHEulMlE%cQF<#=ga*Lyx8#cJj_v{o3+4wE z0Bdgt^>8$sBtI%V;zi}uy3-xdm(RNPrDSN9HQcpFHg%HKIMLx9-wzr4u$v;)OE&#m zudj0=Z6QI{MI`IyRAPuT zt<(iSk%&DkmygmsY40k@))^!NzrDsYh>F8+JVY7_T~oS}T5~+0S$I~yZTUoI5J3wH zy4^R$|GsXNI9@MQ!%!^$?S7{Y0EsAs`e4>{QYb;~tXZ^TMvVZU)2?a?hW0PbOkfcVgl;JXzI}s}De&IKaO&4Gh zn0Sed zCEzzR&x(G)@*P|OhiVMhOkw;t^+Ovhkv^930FGtG(_lE;8StT!{CmNh1kqCy%ixpm z8+XcByF>EesFS8tKiEV)lphuiZ`#$=n3}JVW6KHV0hcVcNh<$PBF7Jfy*X95uxhL* zyTmRlojkjA^XdB-aDh)Kl7%KGGbMJ7k)f~JIy0CFAv{`4B&A?@$J3OCTG_`ZukThNn3 z^v8s6blsF&!d=mA@Wu)92)el2N%mjIj*<*m|C$oVnieOCy(UK{HO1666)$70?V{13DBaiK*SfrH4F zgAscE?_nAnXbNf-|BEC%1%Ex`GTl%E7CA;|RY$V{G4X7&b?q#4HrSS3ye7=U9LojR zS^_t@aMAvEo7B=tyz|tHUYkXI>)q0aL3wfG?X;9g;&Y59Am!u^m_R5VG^c;V%Av^E zdrW}fK#+pr8k`Zd-L3MfbfdllUWr7^6+8&82~^dMEBIY7X*SK*hcBc&Hl7#WDk3r= z!{IcRF*#kbChLnHLc)cd#@;E-W@xO8cFSQQR^Kz_#Q7h3d$9l0bTt!ZZ;boDafJa_7JWL5peHDDj$=m{|GXaIdRd4I1F4c5%_fYW@iV-k|; z%&fHj_EE#Y(AMSpqWC(0AObJt&dcB1iU1bbAbC3@VA}0Dj-^)gM>eFwnfhBS@#BCW z(66a3IL0Vnj&09T&ck1Ti^h$ZTH5Lz?}M#P<|?(~Ps^hQqn7xK1LohHOCt721x4$Y z<`05c71-Gv?o2g@Xpz2!_TDRx7?keR6uycwAjG|?7GY>^K+vEA0J{u!7N)w80->26 ztd(UoNPV!6eh^IyjEpMu8tY-+@^Z0ZHc^iqU*@5BwQ9D8&gcl?8IV3?MR~Ehr*eBN zS*(zJtp60b@AX|_RR_g+I}feSpTY8iaZ=@IPrAv{ck@;~uvLXTA|U294gm*#tId$b zK(cCPzq7NsP~!ge*!xnck%S$0rJ8P|6SOHaMi zjqxtoE~>2Q;)|jU-Yv~^;X%F=-+WK#g;V)O#KAMt`@=>M#oFy!pdbCa-I^68;C=0`Zr3d`VI91`$BQdw6q8PPLcm|apStxJ zUR4|^yMLrtLb0NKmOZLG4q~Y$(^#2k`Z6@t)vzpDg08+^6p>tySKXrO(xO2pb;eAv zT(qYqzqD=ru8{8cUdq@>$G~0PiuzEdbEOH1dU2+l4zqRWjmn-^4i|DdW1eF$whhBi zkw4irZV6PY4-2*=sNX2CO3jK4HZ8DhmFS9<-*FlG;DBW>Rfg<_|MaZj4huvBcmbUA zt-Ere&WuW=I7C5V`FQ%unp{*<7ybjif9z27;KGHt?$Pm}&i?&A*L`v3UpunlE&}Oe zoi^A(ca$edHi?T+T6S5|)-T6%GaGcw`3J459XqQk`kuCPrS}KGLDrx7ZSySt-g`v* z=9k-QoW7JuNa6fuUWr4lXzF_t<8w#F@9Ig4v}uJSql_+1O(DRwJpT%(cM&1`8FPUi z&1A0piopRpK6#c(rCW*MA;bRHrBJlU_yF=AyC%irZl@cr8ebahg!vR;K!?s&Pw@>> za477f^g^+TMFe9ncmeuJ^W>n!;HYFvl~p47={@k;9@j6IxuMZalY_gHq}l~5!Qydw zMMKsE#JE!C_3JV{04lP);*gS!2Me-+fg(k9y4 zmm?IOZV9!86-bQM_kLtf5Eo>N)};r!ZefdSkmdfZGKAUj#W#{})C-5{=_*8l3>rF( z%USo2Xo%gb;31u3D+9^whkZus)Nq7)XKUN(>{|_N!!y}W?n4X3QA_Y8i!BTa8hPOB zQ6fJD(K&XPqEEh&l1XN$mGtt0E1iG11rZ^gA||~_nSrvXZt*P4g7QU857D*Hiu6uohnZ>tESv$bgL?a0~D&_cgo(K7gf~GjV&`7G(SyZTqz<(nSTH4i&)z zk?SZ8RM!w8q-Q=Gi%P6BcGS*CI)VH(+Bm|00093 z07ipn2Uu*ilL)2XMgdV^o6A;NAQhl9LZTnIVUNsY{Ns2uFI7yXhG=6MzI7DK1i;z> zuJT4oE$i0EGkI9H-E|>D^Lub?7UWQ_OlQ$*`&68_-x*V6pU&V09<9{8M01aL0Z!TG z*I9`uG3aX|?Fhxf+gL19H7+B|n8I&XgoGx{QSX=mR0T#dTGhnc-QKI$=}=}(@8#aK z#Bs8o&Pjq68vC>Wmy*->hS^vJGg`(7USG<4N_Ygk2w&*8NO&prr;Or?xUBANCc|N| z>4R9zS4vxVSx(e)T3IK~hzAW*WqnZ>dO;!xPR36kP|pcwM4ZDucjtjK1J`XXF3Ty> zu?Y2M7L^>i9ISnt{Qs9x8rOPsI8dIORUvW3?*lSmQ#qQicpZMFuL-881b=!A2dbqd z?K3F)-%{I!rZu~EbDMY?w)Oj*^B0p%z{RyNkw1F9HaFnTP#ESOxh|z0BeApn5aG^8 zsfc&9lM5AoX!(v2LAWs|h6F!)_mkDt7m3vhe1bX^ch74q{Xf(_ZAC=&T)b#@POQ?& zmTAu@5^FHDuXE1BMv_+Lk~z>upE<9?66-;9y z|H_O+0M}w0Zo;9KWfTr&Lay~v!OFAo_r|m`K|NmX>c2v%0D|whH6{PIK1TewOSVcf zJqFeMeEv$_b--u@-O*`zQ%lI6mjx)gXuS!(N+`y9gnRm9d<6df{iwnOmA-~7ut|h} zd_JY<$-&AA%%Y?@7iF7s4RtU_;}OWICZ z58S!!BBe&8hV1zYW?t!I0wcyr_7eU#?2pi#5Ap$0li4RT;>1C^V5Y^rc8wO3Px-klsE zf%1uexxnlDhTv(R6abwF?1_1f>0X|xSryJoP6ar~gF0?VsyirYjVJ!c1^8Y7u<2H6hLz79%!Vy(;+^t!3j0$S$e>9-QRbvI}1 zAAx7N#8?=sxl>-iy%aV|Gy)&BO)eT2T-$^Ag~+8w*sOagfe@iTgiKX2j=h?+_*~6$ zdW8PKm}M1>=2v*K0>Of*-{XJ(&Jtjqp9Cl?cs3lcfM35G%>qE#GcFOY;6H%BcRL5W zYmyKQssQw)YvNmX2b~A04t-H|Ke^{G!*v~!w7Qs?@96!#jZ#r|^c!Y9qG80ZC_NkZ zCKQw&icb6-G2Qllm2a%FyB5c1JO>h=!DdmuawIv?nl{-y9mCQ;Kjl{c!=ySSgiSkn z`#j2?A0O~Kdh`St7J4-O!9Jc8qI6iZTNS>VS&H(M`b$E%ZPZ|3u(%$$j4G!$$^m4> zG>k8MT_r@VH-)V{2Hl=p4NlFm!)j+SXuj*1%aic?ja01?P%kr2P*l2;*z&K7Jz}J% z^xXf;H{4olL2E_Oq@#E_S|Rm{8NI1N?$DcTU@TcLWu=4-pOZRD{9c=Jd;JCF(yNe? z28p=93ucxxCx1|d_>6b7v1GJUKqf0Z#?P>u*1Nb&@?V#&09t^Kxaf~Bp$FT`>1GMc z`{9g0%vdC(p#QyJ1en1BIbH#~KBN_rr$oYDY#tIK0YjYNTwSIdft^SUag?oHcAyG9 z50jSWe;TVksVLV8RILyZ;spz5+bLO_bQVjI)p0O;Nt?d&q38=vh9`1$);OAljv_`4 z&i@`HN^%<0-|wgZiB#(z#IZ?-nx@}1zmr()9*{3d2h?J<51m)kAhOE*^qq6%c$iV7 zseUBj2S$m9yTPZ|H*VWKrp;&H#Jy))OKILx>&AH0vUnCAXX)H!lhI&3QdS>A#}oY^ zeOn?cvF%4`LP%VSuLI4I>=~A~IPa7jdd&4L=yVHgUt;io?%!gc)QNU)OCF$OtMRf#lgW;Ff@nk*vyW1`jh`J6Z%du7d zN84luDz{KX0u%&GJDi=87V6tI4>W$UL2Z|bPHM_$zV{8edl7K+`%HZ{LO_C3-yRv3 z(b0z3x?$bNj|%$-EcI%W7X*7899v|gSX98bNOC%C7T_(r!uQl(Fsh=xx&kolAyDu> zkTj|gEU=n4* zu6rJMO?4^HKwdZ+OW6csj9iT)E#_*gf6Y-GJSdTTlO8=u&J#(*FZRK zhm^YifTGK#-2X8LW@Ej?LNMGXaEz=wU03(cxB|Sk``Z{C`J~bb;C3X2z%u$zvH%mB&<4TbDoV4Wg&($)ckRoy{ix48UqQ>;mr%24r)7_@S9v@@t zMlm{<2M6nJs$B?Ae`GP~CIl^mL9U{76B#KIy(r1=xiae#YfY{Q(v`53(#J@EsGPMso`_dOL3)S;Y+scu=*hP7S%QDh0CX>y@rd<{e6ox1Q8b{A( zf;X|@FY^Hh+t#!!X-8v=pI5YNFedpUos~V+swLQMN3kYP`DJgV%o#b?!taNuve<|$ z@kJP1;bDSGF6hPZcJEJ`l=ke6ZTIx!LxtxJnZNysB+-6e_pj%KDWQ-nf)u7yc6I-7U z{~lK4*QiNKTrypECuWMO3c*#XksCT77SYyKI_|1ea3}#XDgweyVdFT(m7Wbb za?>}n3s4gHzK_FbH=!;t!8_!Q)}H>a6tur<%1Wc71k1Ep2Q;2Qh3~jM=9UW0XC~Q< zP3dfYiDYH38zq$1VT!H~uTTROk*Gtl2TA{DN8Xrml&VcEc<+azRUw1^{zj(0D-!bc z2#-Gp#y!;QlNj^aaF{5ZRv&2QAw8umUy1+WMK3kc=%vC{Gc;j1Mw4$M|ZmRXf9l+m!evr@1W8wO<9N33S?i zW_pG3({i_kGQ*VA6<$)Xwq5U&X&oflmlGy@I=$^XTrn=Lv>V9N3Rn;u0Z>|lc9VFx zoUO%!;otT+BnbaRJ-oV#=n7=;XcQo0a(`3ZedOi>yv~L?g2=7?6Si|n=5!` zKtf*!o(bNGP|MN1;ggT<4BY|acE!wgYeE$ZvK%)-JC1HxwiM686EdEtVMIYy>RzPm zcnfFAPPq-0euV}3r5YS;Ngi5X^(`dw0^UFdW)%)%dVcovg)#Zm#*Ov<1iIzjK}`ObCX%T z+N94huv_MY#t%y*dalFHuQpt4zc4*P}bq2w~vmKz}6t7aZoPf!qa{%DrZtlBa9Wopl|bm>r{4|6RVl&lkxnLmu%7L?BRmw4T2Ri$#^}g5iox zem|-NIpV8#19 zp|re1iyLb{FkyM)@b)}eon4n7noOvEyjlr3LqC9J*HVa*CSPqQr64V7JpWP)x$wJy zU|i#!nyc==Ut`~9#XY4WT26-@dE~CgP(=gmC9frYw^IQUNNzC#pm^4h_zY?w-@iGc zC9j~IGNtaJ0Vb-~jF&q7Z9OKKJ9!I^77H@ypl7Z;G-Bk#`^WkP;xv?8yWDeMVwke3 z++=e3GR|PEV^`i%P@%%gLqeToU)|SPCv@>Vvm(61)tj63Nj`yuY6$HC^@_V3uFmLc zopEc7dh`bRgEn%IDnQJd-JxFmwxMakoodf;7kGh0aQ9B*pGw`2mFO1lg|S62^@^4` zbzEby;TgOX22; z5KrJJ8sJ85&uH+cmJ&0arug4*#XbU^6tS0!VF@ZE=#5wWhe;|EayKO+4*%FzrHp zKxF?*;e;*${gFWHdtUOX5TrP?`imZ1|5fkWE z8D$v}X5T+mhaMsFX*}sBt_}?N@In%g_!$yS&C(zkXXYO)mUUkPY~BLjX5wxk!p4~$ zBE|Omld4v6Re7t{w*p{4rYw=L3{jaIBeZ6RYeYLr1&jHZDTp+uE5S3NmGz#&r(_Dw zFRt`k!{;|u=)Aw^8r4oXZ5){R?>4zLiO$AjWB3FA+=j*iBQ6>FkRX>wyWJ*{*nEDN zIH3&Aly<)7HrCELBK zYh;YrT);8`K#5VR-+#aE3FlCmn&ul z%BKR%UYudO9?pk1v>#3NcEWY7y^>hAE z>^UgRxokVG8ra)&oZ)h90bd~b{N%uJBK4cSXyfECA(fh-2)FH1j^$ze} zhCF|@pxc7Cz1fP5cx>CjC*fzqc-FY3WPQFr!U&j@kUSW<@HkYxfyn#OBUlp2%N25q zHSo}|_mECAhh%AKG(RGZ>gxNA@Xx16Xb)9pn0iu1;Q=v6yGkbD@DYoU&OaK1DLk3h z{6f_Mn%zSluF`vH_%VhyJ8f|5dkIR$hWUL4F}d9&*%D z6Xj$%=4*YYdgC5=kT;2b+%MJrk(6x#@TbGe98SBDUnUGA`M?-0#rJoUCI7$~m&<9d zX6AgW;z<11o%x!`d5@niiM`2xUl(KEnsVkRXsUL~J#+m#hXclK6${(iq5*feu6d{f*|1s*~*^Fq}iNT`ElpyRbJP|Z8VhzK~m<}?osG^M@l#d zF?Ln1)`XPc6Wv@agr_m_#|)`P)ys_*k*QC_E_}0^iFfqPrm4I_QV&1$FxCM$e!0e?^aA(33 zljQqmN5&M-m(U~IcAXrt$;&%)I)7KKrn?K!{5D%KsUT60SUhW=7mZuZq4H$mG{0dv zO5$s8fA-hWVT3<=>Bb@W#9C;0;8L$~(eE#dJvzYxq@_8Z`Erk8)sjN&8N}$TJphUF zD)v`?>vX`^b&UCp15oV~PHmjex)qFDI!j%#?QD=t4&a6X}T#mZGL6m+JU}$!kh$TXG{ZA zDm54h9Rw-@p@TH9bSdq-kdpuuJeff__E;w{Kbg~lS${;DPP7m}1WmTjj>)i_%5x~f z+#N!}_#gR5>qb(!FS@3^52t%W&wr--&yfal^D)#F@*SeDvBsH0EY7N82Qhz0imYoR zYegwVP?>B~u1dKsltUI0K20hj6@dXRH(5jkqdCwKxo(8a0U)5Qhsz0Qv+7bvuXlj- zZrT=rC^9}|Sip7B^@32beM|`|Vr?G*w?I`#T-{CjJoMDk;PEo)8-#JS@n;__3OD|N z+@tQ-Yn9C=@9n3%JliH4GmS2B)cqYBj zHdMV(GQCV-<@zfwhx0mN+vZF{Y!%{JSq6e4f#P?eC;9)xN@7M| z4L+AVp~UF3IOrK{M3=9AdD2FqCN0EwvFQm}f8F}$U3`2^iYsH1d%D*0_d-!*v1z-m2^#Dvp=!>^l)VQJ7mj09!4?!>)oxjw?6O zP;G-695SP{-6|o3M`J&Jic36tJP2+~ekjQR=KotGa(=bR(OVh7*+Lft+Rk16K=62+ zvr@D3?7;yh?Z`p&4CJV62a209gl5t1*AZt9Ws~P6V@MpCRNlgn$0?heq|pBd7jTL@ zi={m#Wu8&V79Qxzc#2p)*>3crK#p)&5HLo=SeqxrCwg|L&aFredbq}*^yDr5O!!_S zXfS@vvJGaY7MIM8KcU>TeRZ(qv1#=-xhz5X!JRS@C2r_s91`Igm*itFHNR+P4^*1C zVW>h+j9hfhLQc|;9qMkx8glYor#!Un^X?fvb}hsS-bbA-=U2>nUv}tCCwk? z!75fVt;}E~9edjH_-mptwop~5d2+`#Fhru|0d$49C&a(yMx6DPp?*)x#yBwB-zUTzv^`8$fOPaToq$5>{kO_8s@0_qq#eo3baVb3`zs%} z`y8$OAT%W+iHSSQ@B_T)G7vki=s}6676jajA06vF90PbJ{8B~xJLHiYB)!$trl2VI z1$ZG%;mx?z{lATnupMS1liMA%z6fW6O4g=Ao?6;syN4uD5imA^9^y+#@>U|6xVe8e z;=uz!2%uFhRlCg)X8g(3X_iC}Y!R6L;A9MT6^slQ-swM3I^WBf8th=rT1WqJuJ6G4 zi>As%sgYKzy)wGi6;s9~f|_0!R49DO)b)mCV5f93(RKWcISN$yuLWgTdy!m7M(b7F z5k3_rUts=m%)z`*NL2(qg_wjJkiR`%wJdKP7AMEkv8l2LB{vSxqO!z;ZGA2$U zvMr(x(D(wv*nsuNz)eeXM-nVHH*^Db7o--N7aKcCP*TKWBZF#ok=v zB74QM*d;gtt zs~NLHC0!>^CMe1B7k?M`%(@aPc@?uhKO@&#q_GA zE@;yS(EkDr17P_I{eR`%8qX@DYGMtSj9lx7T9yqs=F3DV!+X|9AHH(PV?Bro^1)ft z79Qn=o&k8gpv~RAi4A3@vd^6|V%ldUUDLecOZG05D@BfCa0jNoCP*jR&mdCfw5FVB zB#&$(;3}gHu`F{ zf%0&|0)M|zaUad#u?j3`n3d!x=6Lar?;I)VEFG7E`J|KQ+#5fLKhx*h$D6X0h5wYq zlnt9NSVaN7ir>!*;nC$6r0b%)G_SCg&jyhp?l?lH|KtktDT`vBgn#ug_p}3z%~R&2 z^CkrF$JX^s+Wy68dXAzFOcn_q19=PGE(TX}HnT{X8@7`lG-F4Sd_Fbf{%i33IIHWj3MPaj9hPnah#I?m{(kqCf zQRxCbbYI`}zq#7i$86!Wno(W;wY*r!93m?SEM`PUnd6FwNUKs@Gv!4$E2)r=p#B04 zPB8?FWqO!uVdC}3AqoT{+yVU4r0h|o0YW{bSOtQ~+PwcZqrbk(mL(f7S+w4Su_PZo zKc7o6j=UF~ zL)NBkI^lBBa>*WG`&z9fopeLToS&6F{koN%*q$wWMm3tr2^(SiKafFjU&iOS9g1j! z3z%29Plfo%LCocV&{_Kq_sul^jm6@Msx0gE-@(tG99(JQ4TEV0O89SW>Xa!zwXQv4 z)y`HguaL3wVS~jECK(xNyy*6|@SX2hx&N3y{|$#+R%V_2^p(RMseA)6fGeHjJxLSl z`Q+W`)S%ju=rG`BJ}O$!3*fv@TCz3~YPiXukC=b5>X-DGFK%<<*2ZkBSQ=G@t2`m% z0i@Fr8A^qDhkmb1zR=EmjBJ?cLdR%8t zHxnI7DVv8i%NpvDTmI|I_u-W@3Udup3{}bp7)>aDA2B@*WP?CdTWbpJ zD7CE|&BiMwYg&<(S3avSZulTgnE*V#zo~#S#hqibCyBBBz6gqnjQxx&Z9gmO<`us> za$loM0RE&%7Lh4?=x@-!ylc?)wiM_t8Ob?FtepuK)(vcc&k?D(4E&lHy3fP>>PBgH z(kj_G2_HyEePm91&FRyD^1j38{=gR5`;3(l4uEB|&$$;Jh>^M^Ku@3|^VsUCqkJmA zhsFNyE}GRf&-V5qk}3I*Us6v^PLgBu3t@owGWnHC7q3OcXH;qxqGhz#Q()-cK*12k z|1?lT6%^)oP`JvFg>3C89v#VG9Oz~+EnD;6RmBIGSIfF`6=5F$KJ+E|bSwR#@oYZ& z%_t0ysuZ%p{j8b;^aG{zVI}oK9NUFP^^-W+ut^)fdv_qPfgw*n0EEr_t zP_IXg&23ef)Ue01mYYdC0Zg$OX3AYh+R4z!_m^9MB~-K*z1qp{JGaG6?gMux3*k$= zJN?lMgUh?HD?eWFkpmszov=%G?Lf%zHyrakliKXnRsh1yH0j{-V|+Qoq3ARRdjKqh zC6MEl{dgX2HXoJ)10D2WWLoK%qF}56t3!@5bpApP)Nq2^J@^)3idaR9nbW!eH~Wsn zC+2fD(Au(R_+zw`bZE9KHH)WPhCfab(_s>H&p)!6qrZmx2Pj_A0erK08BdFykkf@mj{I?0{9oYAj~3cBW7GSspeKhO#K=0XNcQDr1cwH&5A zWB|LA7nnH;d`f!xBF_6NHtN>awh~{a_8jx!r;$@jz2jrCPoD{_4C>BIE9;*qZiNdd ztl{R|?{2G^8-|1*4k~7AQk}qoq+T~qqF5^Os(K$*NkL6guf!&W`m;vv%b_@I%>diQ3?k{+v8oIF@wL;`F4HiboVM4;O4-(WD(sw@AM+ z?t%v03_<1YVLGQGkWL!xlV8);%-7qcA)<11$I-R5kY~KBvSgsW4{`wXP2CY3gh|_! z!@(3d{M(U6fyX^FLrJx!Ok$i>5#r0WTahPb-|!5(Nk@C~o>&0GbrTG!Q;U>wyQC_% zO^dt<`2Nxg_gU}4!mXa9^jipsI{ti<&Nv{I{H%O029D0Cj$NjOHL>hEO5Y!lAOAN~ zV%QMzR%arwheAmLA>!zP)%cT}9qn3PypNvd6s^-txKNTK8 zGHi(>Nr*V1K)FoNZ%WaVQ4|AV zL21}^h1c!p#EX@0HS3S>vz`Y$99Dy&VwFerwOj$mte8JTp`9n0pLD6YT+13CM`>#n zC59_-epYT8eGhp$l7meJzqM07Pf%?C9m4d@XeHA?n0GxR*mg=O0C`Y>M)tX-+>6N-eP#5^n1d< zt^t^-rkuR*5hQN5W6DsZf<39T&O8Y9uF6~ay%V1B2`y#wTu>EK<|%#zh0O%L4|)M*n>4;UQC)(zhIZZ?mACa z_@>{(+A$Co>vdKyGJ6IRLn1Ziz#}PP@^i`H^-G5^A7hK2*>D>oBJM0>SS%i)h?M(N zBl0GuPmbK_F7~?JG#1IM83k>fJLrHZ$hk5@|Dx7NlhIqq0$Ar>th(U&bpFjYt}vu`YDYocu3H?hh){%(VSH zeb=q820_mILA$44aQ=JzEd@p;kYaj_ckGW)G$m3vbx5a~;!)|CPcR|!z{|X}{QPg1 zxx6d-uHnj>YcmnJ=U(&0v14N!_#54_m%^7FB=-7PWPVgkjxrbMYy+5{P?P5Nqss+K=CwmoqlaEsi+Tj5hh2_hGklwv6Wx zkBmM(@ic1mt0D6L#I&-jH z#ix2F@Mv3Rq*2$L`_|<m*OO2;UUNPa;CSOcmRFhT*EjhbdExou)YjgHgvM| zNw`$Qti?^qNyhs#*8~P%4A1Zs>L6RKLt!x{SLQN8jCRYeQ`bQ#C=~wq^-F-c1+)X!~o=J)Jlkd`!R661GvZp6*145hy)oGN#axGsx4OM*iYo6tx zrdEojve4~|VjRnr(lP#ZJ9GSc6{N0j?z*D%DG-Itc zD<4abLetpuKB$d)?Cy~fnqoWMUcDLoF=h^dY8z{ywE|;`UZVmLHGd%4D5bH*6qV7a zQ+s;X293bv<_x_?QY@IfPwr&AfZo-Jj7Lj#0ydB+^P2&&j{7F;oY9RZM&PI?L!#e; z4`+#E)o3EO_#~Jh^5aAD;GKw-q#f6RW(Pq3eL^aLA2Zn7Z6}Miar7iJ63Z(y@q`x5 zR^YsJ`=D1=7OanCq*UIe&_6WSR_VpCx}`$2RcDl($o^GbTQQxaaaKXbsnSor?gma$ zw5}y(aOS}H*q!xy1##gACodJh87ucoQSwB}X1zcu2GK``Qa~~plPkQU401CLdhu+3 zB%?@&-cHH56e)BPlqTGZ;JyjVhY*ZTBB`V`FN+{WsOGv@NdR8LqV*x1m)pValwcu6 z&;6)%f?_nbyWwvHM4I1oZ8Pm23&F48%g!HpoRFq}(h?AF+Gz=C*@{7OPO)txXZ; zd|r=%SAUfNAofMkVi-swDDD^6d!o<|PASRCcc*2des_M!Th_JMQE4$)+49fq-c9_w zQ|{ZemF5rj$j!fnd$1HrwM_D7s*PDGh;{x?slqucX9hqP@Wp^lDymtnqQ=3u9=PtGa)qDEC%#1kabtAat~*!-*}KOdNatT=$%OB6;kG&ei&rpt@iQ} znysRC3dde)azHIk!QkLG1>d2dFpB9odS_$=-_<|d!&7=e%LH<%TeajC^dY;Y$ykG6 zwXf`5T7}_Noo}Z7fH-?LQP5T5NnjfQ=>dO%!dM-@!Db zX_ZY-v^eINqQ_jWd{;v`W^ZBoj>79i30REIK0uH#lO$CCMDNig^};dkKtK7Oi;1v9 zGqZ0g*Lz>&{p}yV_BnS}gNW6YgfKT@91cR)F_6|+E}wptXIso1Mtrp^Y-4Q&py~K9 zs#gQ0&brU=2j#zCLSps1yuS)toL3+{`)`G+RB)E(>kNR%_sT_=_Ve4qm~ zT1D96=tV7aoTH$fFV{ZzYShU=I7cQ9;jDJh=t;zbmc@S?3?RxK=EgQF0b>1M+$!Fo-28v2AQ*oiq0ZtX-x_o--FvcYF6!;a&V|m=>t%W9{o{qQL^og>JVZ=kE~BH4 z=2%>$0Wvemowl0|Fp|;zgnEOnPam8LBJ%YR`IDw+igkE({brp@_~|K&TM;&#H6%0f z-oR%I^ad7W2dLCXy9E22NVQ^1hI3HR%HRZ@^|r@V%KUjM*H{oVUeIXCvNu*~uE=i{ zl0fJH!N+0-9mIZfJ6O-8*~;r6=Fpm?od)jn@IVLtO?R{11{$?Xf@v6>YN}BuooDxv zJ~{)}nJr-5#YmiOJm)1RQQ?GyPve?m3cHc%wl`oi!m_I-wlHOcUHghujEXa>dSatj z&9#(Tv28ayq-<6%2OSo@J=DHa1t>2PX}}$aFOikeI%|mKl(NXhSf@ggUIdc#1%I2C z6uXSy6_O_xit+FQrqQ7Efc#x%bw|x|E-?99c(nmZfr;@w2AtKnEk?fCnep(wrasJ+!DNPKX+}u^t;)gd=&fF zXF0h$kicI3kvN~eF5GSmFpyc)H1fHP+??zt=k(5k5e-z|C>CN@$-uipQL)}=+~13Y z1zVit?QzMiux6$9p~&#;3Z8J)Y<{3~@!$kaGUQlW1lrbh{xc*JsUf(k3u^oU9OX{o z#vDPP20tR66o>zIJI=+MxL4eAof52xioOrtPq3(p4SyHQwP%A)%>_KN(N>9g9x_(_ zr+`8i+8+=^ZfvhQCi`g)TyI<@HTf%-S@?4ZufOrlJf8;|Rivn1FX|zz(A-&jW*a_# zeh@!VD%XVw72E_3f>S2<(fi{P2}Dp@zGm73ekXQkjW?LCnBuw*Ir^?ac`#FNCL&^Q zUZ12;n>%!tR|f+rVjiPQ5*6%F#)CV-{Hq%LP+`9D0cIu;149>v~u0Y9bpT?~Yzbdh)e3!@FZUSj;9Fpd>tG~ z?NJg#(dZ#;dC+pTcEV2Lm1n??LHZ?^rv45-BKp>zgjYwPQ~YK%rHoy2s|Of&EK*F9 zmur>-kB)MA;w?7HYV%XlBdc!NnyeY(1DV@rn(;?@O(3}Sjs2CYLQ2B8k(uF~r$~Vk zqxc9TM6fl^Yd_wRtviRB!DgVDAP+e5#9}D7b5hG<9*#!b)~eCs##QG)tYNzf2B;GJ zFR`Alu_j>{a4?zfLMY)?Vn#S;!ovNeGdX}GfDJU`iYqWq&4QfrhiV_wB_<+QL;){d8yY_nT<+1d$1x>ZVDp; zRa%c>0+4UWe?aPi_7VimlR}f*bN-p=(g6bp883|UlR6ZfVs<~;hK$$V zwQm=F#)K%gfJtM0g~A=j@9 zLMx>hutu#`O^i-NB?c~i{yFQ?)w&3}eWE(rRU)^6iC&ipHPF&LSyDdrJolSmP69a?&9#2)|4M{Pxc)#l!a<%y@mQ#J88=6C^#R*y0hm6($Tsr_UbiX$p( z%b58U(6vV}me~e{vj7G4NR)5ykv>n7c2HAz6z0quWuqf}oxM%RxEHP18up~TxrReL z#GoI`fH~oWXQ?Pan36}c#QgcRsxr%;HG5o%bik|d!)%GKQ)rBIuAUK9mR3%FrQrSx zgwtUZBnr51HChQ*Y&e@eM-4jq511f_z(KnHXw$9l3l(PA}i@UA~ zHp^qm+zXgYoX-Wt$y9y7IuSm`+B5dAF2&R#+gaA{WjhSf=6j!Y4K=UR$!I-|Jq!0z z(;s_}{BSZpl}5d@(OL}FItBV~=l&J!@kle+oicH)U97#HRU|<7KWs&=ero1Ua?-CA zN`srEo+w0FoMx`OFM)%!n*i^Dpxo@_wAjZ$m4zBQHO8~I58}*rU#bg@?57vSLf^%2 z;K){|c?P-&caoDv!fRP5j3aU^hJsKf>}BBJHJtY42bnhY88zgKF}0PFVj<*MNj1ZH z7C5q}cLkm3z*o2d0riBxtFbe^^tvfQkj*Y8W3Z4!&RD}I9*IzdzP;Kk^)+QkMe^Q`JuG2FVi+Lh6wdU%~`?@ zcApzNbf>AJ@P!-)dMkICAdn29jZ|0zH?<7?3G*1t>em*KlxPkxscH0DXRugpu7(gCmR zLg}^#3M_8h6i$Jz+uZN|A7NW4ygIJ5zG7S56}t?2)_1T|m?-`UfTbm}6{g8e`R2Fd zyL3?7z}26d=RVMg!nqDL@Z$RCt^jB&bZ1$7mN0=Qoh9OEd$4I9j!PjXR?>1 zq*3iZq++GI@&~x6eOh*M74gfV20JEFX#f) zp2>E>GA<)S%O=mv3!lhLog9|Mg&(R=?1gtbzE+rFc@H zJ42o2IU{-2D=|`LKkJP=>?9NBu?5zd;lyR=k@a5cIWJr3MbC_-WY<1lFu}Cy+NFJ* zb2%Hk&&uMR+%?k0LmUbj8yN4RSCS4V4$j}Vvu_2b0)Y^F1zAqeakn|#>Hzx1pzI9E zxsnnzzt9${1xD(6LumgKC_6uh_~um`$QewoLvzS^U#*dUS zRLI-Kisakf>7J@X4ykuJN8&vf%`0HvV7%+CJFu6AikpC@)!ZZXG_dz!7X1-RFyK{7 z-o5do;x|cnP9@lGYrJX?FD`y&m}Tr%*7($BC=hRax*Kk0lKdDZl;8?q9^kf zXoAk?aq6jue}@JG4zI5=Zi>5eGgF9hfVCfD19;`eTxea)sQ>+8dnCe(oN{;ftk_C1 z0nQ!ws1FlYckr&vB|-9>%ytRYw{_Vre~~^{$d^*fRJCc3m8|6f4G%S>AN03A;MALc zeH?uVgy7clBVPd_Y=t`+zV*D8fS>vSvzlQj@KwqF1^vm=zIM5HI988Q0O^V73#k0U z^wWlb9v1yI3|PX_(iweJH`f>_Xf!(#{x0lO9eDX;m_7RxmxPEvTnu^-(r!Y??T9_> zN@HYs{!9IVpwrT$MxGDPN<>uAnALj8WvUE!<5PHclW*GP*VUcxP%!XUMpxUsyc0cd zYh*Y|zrFv2(eGyCFDnMjxN_*Vqr0xvW}ATyhS_Zh8-u7lwVv-7B;3%c5(JF=NR8oj z!eP^2<=f0&`1Xl$F0$A1;3b89-(f3ADI{o!(gfp4&Im?yGzJU`{*h6%7|P5aa+5s zZ}nG>>U75Q6lRopSi6`;%8JI16ho5s5EOX?Fj;IvQ}cjsBHj}i=jAg$92A+-+f~Ky6 z7K}A&{chep&^V*uO5No0^x|Ph_T<&jy&=`MkB2_^34er0o$jB&h;lK`&F8wI2 zmY~9j%qKOOz}^Zixg@@le~|T|{2<=(`ogVsSMo8P3DYj2!C6LlY@c6wOO5mM`v5s7 zRzyFyB2(c`E6*h{X3K*2UOetKyi6^*QEmMEsBM2vTD4*BWukRLL)(~m_otcMkHFna zF?%%5s`Y@%QGlH=`bdkohz`RNlEZ^v8x|pCA4t1z#_2ugMt#B5wdvT-VIgV1edRK3 z--9A|cb3Vpa*NyPHNIrMy3a+7P2b58+dQ7)@@v3$0o&O!4OXDIb7q7r*v+qXm@eu1wlr^- zxs@9>U(yJNFgGjAEijF?y_dD3EmPkSYKe!fSYfQQX^3c~8 z5q)vIBP8rMYuM}LO=g~6dVkdJWY+A74UK_LtUH6wO0$}XZNGf*cuOHFpb@2S*$r@U zQ*T?Vvh@2FR#e;mdN}=?UVQ1y2Tc*wq4WIZvCF)eOHH;w;e4Jla6nNIlF>|ecXOEl zM-|)PoeeS4Vuf*gmc&&$t^x19C?+gK$~J-Mk6(|s&b>tda9^d&j$cUxv!dm3?FM!X zeKqK3K@?oJDRO<8he)FU-THK(jS`eX#yZWL{LTQ2(Wkq|*;!ER*{&j?1XQf7t!xPkcE z{slNO$+MMf?K_mkF911*K3%hBC>a_q>_LU%&BH@&H**@wn4(D|y@j9!V*6Fy6$}7R zERSda9aZH(Ta8E^nuOWKW&Mr9HwkV8b;YJ?WV$40-Tx5JKl-?LmeIKo&Ca7Yl3vKh z;H2LKy@Ki=#D0<-st=T2_a?iHSnWoe`zkJclDV~Iwtv5ZeLam=2;-`zT{?d#Nl@VX5_?z?E*cGww@>ws&N)N4B@`;~4`dEA~y zNynSvV0%{8*pi21LP&5ZW3}6Cd~1et|9wCSA8}nlj_!CH(~>^B3|p>zl)bpY)8NQ$_3w!0IoZrYU=AJLz>Piy z^E43;zVEgs4H!`x2IM7HgjwkRJTH!mxtY=n{G60^--l;W>2{S~b*5t>Dn#Gp#Db_( z!vagdfRYdqrLyVpTyshyxB#zj_7`TVtmld_{#jz`b>~D)y;{TEI`{|#FLT}fi2&!! z(U*uLrfR~XoP6aaWEB|M>3bnYD;)r2CQYN8NKLU4$|yTRGMX$3_YrjR+ZOcZ;!Mhc znamm~c2D4;FrwaMZ zS|yAR7C8&-B)kbq7?+#gyuPh*j+RkBiGHZ@t=fDv%$X5BFc-(M_R19)4W@oL_xgP`Bh@{nE- zss@kQEAX7DrwX|ubvR_965DZ?#%wc=VvTB)Qqo%kbwQ9>x&Vd5xAE;M;bRJdq^j1| zqrM$Ey4Ry_z+MQb1ODDzvTJ+3U=NNe=1b%Tl-p2og^jAMZo_yn=>-0{C4G`q-hG6q z4eJpmU=^uAeTTV!^4;M}b>#V@tJv8ReTMl$e-Uc)Ia{JnXRS9XgW>0=H`kg%Z-#;H zSTwdg+PQj=mC?aKQ$RR1pMn>&u6YJUMM;>z5TuO76x)ln2v0#$iFmCD8&S4P@#-VH z9|5WxKx0KmOAiqmCTyT#lpgdL&<=cMX*&>8WO#G=B6J(|37s=7(bWkQzT_ZilOL120sUK-G^ zstB8##4Y(=YjSnDq5y^CIxO3#B7IUswMF$$cdU{+6IOPcknHwoCwi}1H0l62nkyq0 zEddLP8279yo-k>JLP(=opIZZE zT0Q)AV{&=&+(KYZO_$NQ<5w3?`6}?;5 zAo@M{joZY#(rS6WE6JbDCJa2HwFAb;JLLs4(_!YQ?V4*~kTa&4gP`UJHKGkn02nSx z3xC>0H&QreM3TlQ1s!9y+flS>{rlTJKY+2wj9FkAxwOzAl+Ud)Cpw93Z6opbVg^X4 zDo6o)QSMd#;e|!`3t@Ev&m`D=?$i~Hew^4z@w~M7UOqG!X+6fnb07RwGeG%shv3G9 zxf5fSmNzAi*lNe0Da(`A_@Ip@BhYAnX`NS6I_2=tIq!%=;ig>B701d_$V$Z<;ep2a z+^^#Mc4b3^+;AvDX4jjBT&fY7-G1PyhK$(laxut2&Bo#!r}X!oPsz9*Hj--T{Oqcf ze&7P|8ah!dXT87}Er(Q`?#oGeF>M;^rwVxPmcMm!M(I-(j=?LYXhVZfSSp-+{ca&J z5vOBDBnvC>$5ET1bDgb`IS%k}77G;46$3&BZV?F(E27gW#kk1^+sn%eC4wE0N#3>d zDa=b6i->#7l$HTWD-VZH$t8GVbwc+R_$ISV@#{EfOd=M-dC>Tp-kk1R{S+6eMOS#X zOds0KiL`cMR+L8MM2?zULF!Gp2q%De$H@Nhr}}}mmL!^V4P8(?BuKF85Hm*rdNlSh zOfTHVH$fu8zQs&BpVEF^9CZBH136t@s>sF;Q0mo+Xc9tTNx?H0IDhGE7GRZz8q_jK z6ifRFGeB9WsTx|L9%eKTW2`e*BBSysvtxpFM}-RBD3h~lpdoGm3+?%^j~208!Io;l z(10`-S(5sh5B0;v9@dUEH!xJnG)0a%QMrfQW6DiN6FRX(Ls4nOESnL6DBUuScCkw0 zE6bZxDfwRu8nMi6FZCiuCI=vYr8K5G@0ry+a0{IVq{RKH)d+;4IVY17L>{W|?X?S0 z$V6LvsuL`ttGuBiXKyK@7b@m&-*|0#+IV@@bT6^r!&DcBIK?kA+Uw7yq2Qb;1b$Wk zqd-uBDF;dy|HqbXpTqIgEqxP?ib6rFEu*cg2@JbS4U^z3?+$Nxrj4`H#kHF8XW$+J z(c@8x5EFYF;!Qx8^lQ)&N>ZuyAcT9@mTlbBp%V&qs02(Vx|dD|_Gkfmop#L8SxCjp zp8l(YTn{o5sha6rrh?+R#hL^&zSWHr8XPB}TxZTO0)UO{QQOT z>k;q6nO%u&9N=0PB`5UEJeC)epBQx)J8gXmBEbiCLC0p4(th=yAPa~cY@_VrXo8e4 z^HJ<{3f@O|YJ&hi$j6j>xN|H)yqu$G~Z}etb_l$C6jdGgT%TPJSV7lQxzIc(6jg zhQL_R3}jT-RPOQ4TKmO%(BP!yLQ zdc~^={}5vri9}H}PM1)KUzImu`AD4LIgmW29YMlv*`_vv@hBL%0yDK0-KE_9M7jaO z5h2^D zfrOpF7R$zJX+UV-M}Bp9+M-@>UVuytM??3mm8)V%JbyzIPa6RA^gIwKCvVt`CR*GY zx@r$dK=X^2sh`HztQkgo9Dp)1X`HxG?DqE0{R%;0RUEPT6(=~*kkV{;h`PGrdqJQk z7Z6$8fS;Z^DJ5&&H}0d#ETtTwSB=V;ZT}sYLlXAI@8CN}dJ~bcIn75k25LMN69Hf` z1|DXul>mhd&h=P85EwN!W!GpEm8nzM{!T|M_k(OeV5xJ~+OF$SDYbDs&!N=s8WAM? zc=9>W*Czz>HQV_D)LP_4?moMxtVYq6KdX)jgZQ(lu3V`a%TnI>JoIb}-OWmchOZ{Y z-~%)KqKUo4Wh4LGrCEbaH*1kLWFgDPw6!1s{X4iBtK}ec-+71dz~lliaQN9z-S33l zk7JXo16Vd-79&I`c%XrcxqQ=gkh+z{j5+TRi!nsEl&DHjM*q;U;Y0vo4(J8u1@r zsO*02nbzIfen^&71swEAD5lt+>`*IG8p7u`A2t`4~QgsXZ1Y)LXre zOgkY_>iOzZA5tqBrOc61ict&y17}T-Pltu<|4EI6M!L!KJdTglWt?R|>Y4joeVH69 zHtm!z$&Q7kljh0k10fLN?BdUj(R`u8x^W*CUSl)}2TVWz3~H$*>A=zEE!kG$6bP>rCS-0Sf#zrDoK zCAh^=+XRaZE{@jkjpomMsz%333_Ek-`SyhL>4};Uzu%6>x3wA#EtVxJb8Tex2k4E1 zNG+7m8g?emf+)7_U+ZXXB@o-8)D;+1qIChd5JypSt|R5~Dq%^Dxbmw?#0Nuwh7a=J z(MP~f#%sO@9W89YErEq8L;3Nn~bPqyU}% zy|QutNbY%9I^L!{YI3Z>-VB=C${s;e=6|g4uK?XfW+}Y0Z3@sBgfEgbb9LNFBiNy&0-lNNHPIzz-pqNPi<()}%N{VS4zS{{b5{l6;33I&P{}d|*St@I^spHnO_2 z?|G=587ce{U$Hx)fzB{RXg043bPcIZ)cTC#$SFFFs;_oK2_BqllyOOP! zJksn}uFE#tHKy3G+ z!AS{G=R|6U`k{fvONWeA+~RHHp&DRjNP$PZwT=b9KVKp#pS?VQhl}4|<-E1t2oB_p zOzPWlqz^30i^BZ?HoL~4H~Pv>9S{K7wJ3HTl9S_ib{B*jWx6E!$Mq3TMBdv4=#u3G zx`3>VjoRD~A5!+S@a(wwoQSizC!oZh4z7H;w+Uo+eA#m4u zy_CBm;d`X35*!vRkybYtws%6{4=5nQ9sBi(wl*Gj0SMbO={+CCin}L-)g;5uivC)S z5KwqUB-39gqQ4UwsBnQsgf`{hapBca#R0_j;DAIR&@bnvQ9y*ftJ<~&jo)4?(P#v_ zqj#ab6Tuz0=taSw|Fs#gON~3x>UcDF1F=l+$E9km@r==(cl9Fj?hV}P29QC92w z3i*Gi3UIU0?&oFfV=cJXs78&1a!?WbqqFb0^Y=x-rb%&G9yBLVpj!%*)hNjriS8R& zV2ZN5zZVSQS^!Am8}&_=uh3{Di;lItybbmAi_S$K#mwXv#QRzNm4cRbN{BA>01d|v-CnA z#Onj-Z8Ib?|I-cdehl9f9MYCSV7^d+yY+Ld7|3O$`R=W;PWQ{W1s{Vf{=m!!iPcu* zEwVUq(BVx&0?D$omo40|aL_H+9+#|;EnJ(C+0~s}6<=u4far=IxslhC(DyJ**C!UP zO|T8sr|~VsV{3IH^Ozi2z}B$sRPuYPC?;|%T(#8m^1?SEUg8xTGRMIFg{DfxlkW(9 zsXm@^dk4#5aj_R!#%==vOx>TE&Y~o^IM#EGeIIn}+^|^P_@t+8@y_F!S)Kp96UYvK znm!WjU@81b)jjVt_vwaXD9ZG=eZnl!Ek+B@!ScHRM?kp0xHSw_v(JdizrgeLOHwvM zf7vsQTg8eD^du8M40q!BYGoj90NDlh{BGa35V{&{O*0n3@+q}&>QL8ImA<4QS{NPb zuIUf0t^}m}UTQ2ntYeu&Wkf=VAGkdT$NLNE1NHvU?N~nb7v|8nHu?SpqFW+E+dL_{ zG%^PRSB+=GSs?C34pW_Y$Gf<10H#~z{2UQPU6eoGZJT@R3#aoNh0iY3;?GqXH_8U6 z>z%_Q-86YBK83=$0u$HJXI^!qp_Oi^)v8jSq3<4*D^)=ppBj(s@qL>qiWTM&d%Cuu zs*;>g4X2%439{k6P4=ayPx>UfHN)y?%V!s@xCRBdpe>0h=4#8`y!5G4ox0+-Atr^{Jm-h)cT4B;C(Duv5I&}j?| zk@UQb(~=OS)L$P{e=p+R8t!_+jUY)pIeeCtF0Ev&T_Xy)Y|Z@DRX{lewL|i@`_8;2 zIBm^*d!+5a!$4<4k-naYj4kHG#xREG3S3dI#)3|LaDE&NmsRGOp?cnIvhi3DCiB>3 zGHUE)Vp`-Z{$G8dswsA>eWhEBd zg)_$|E3NWlh|q}DPE>V=QGx!K7d+(C$3@JnTJv-b%MF5F!yc8kc1+_rMY57m#9Qfp zp)x%9p+T&^tZFM(vAl6YxDG_?@tmdFfG~y5mb(-N=kHk5K6n}$^o4@lWxD#6+K_Q; zk#$!E;cUUM3P<^+i^L3Nc2S$osuZ|N_>f(>V5Je^Hia2i&Gd+zVsy2f!7uoSONDaK z?o&{mKVY7^JtzYyJ81wgz`(d`e-Cfd43^~v=p29_2pLdaIuByP0#31y58$|Xcn9VH zAjt1~`-#iG=fSIvWg1-JNLtGc1Wdb{iLH z0~ObNU6YK9%DW7d-vohDq1X*X?!yBftW}pU)U{r)|C8Y#@L#Acl`=)v(@}z*@bt!M z)ml3_S@KIrV@I1j0sS?mV9!rFDj@G8x)T?vgAa!H9SQUqu~o-xv`r-J{(N8>DBp9Z zvyHH!=-8p~Oxw}JJE_bK$paJl)x*QnYH!>vf|ehJvi@M<5bonNToq1xBYs*uTO6?+ zJi<1j0v~0jML{vhS+m>&RVDGN@P4fd_#v0mVGM9bLWaHA9`cfH$t@LTGj!9?Vh=^> z0%64N41mfCWcE?0vG_&*z>9{O#7#({;=p0>IxK)b*u6@|cl}KyFuW_{blMo&dtKzpI9eJUZcVByrYV%sOwiXOU3Md&rS*c(CuX1jy2YI#NN<>7XN z*&%6pAff$>9%VHPMflf28_M@bor^U1r4~bYz-(&e8r@!dk91q%Z~iAJaGEoP38A!u zC0;)MwL=Ej88y;@V~#Bn;&fSmf)+=Im(k^qrqH7f&J5OaQkqVuLiaE4@HXx6m_Y^ zR5M*Z&Bz;tM8j8LzY@X4N+PY%xzC%6+tVbwd6Ya zvz_po0gz8U;m|z1V8|B2Xka*c9mSyuR#u(grF6oXp7gK>z3a9s$HVwX#hhsC6}AU z)6a;_-~YsAw-^uaXGG{SP}H;5Y<(TM`xC^uj~`QkXN*sW%GNQB*%i!9%V7lcDrLiL z7YDKLXvk=15gs~Lv5rQ5B`tP93%m}K2_ig9#_IiVt7f9m(IF6nVuzSWEt&XtTy7afMnzYc zCBhmlRkU2w5_bA%RmgcbT;bD^rxXi#J4iRN+Wp0HnA4ZH4$5QNg^232al}BTp*0Pe zZ`~%PTBI8xvdm=4p-r%LOet1Q-^Ivkw4YA0`-mwg@8rNvhMZS3;uPK4M)|c*NdD`J zJPF}SYgfI^vO>6?6T>Y)Mv64U^OI21FJ$_;lPm6jPY+j|UNlC|YXpr2elJL}1YC4} zOqgK*c0W+`tXz`ku{Q%;NzTgn%NkzLO^Zj@Pt*+IoaN3FdQ8B}(`!zs5N0;*k*B#( zUfc>exarQ!LuCHrwe$0EnBS<1(ltKf7Sa8g|KpA=<6H_l_kZe7UOb>TN)nG$?~GBF z+1^u+2d@ckxw9YH4)k><{+#ygDh-<>8U_aJe`_x&q+=mrcS4spnNyxAT{yN_iEVP` zCoo!Hp^w-BYSDbbbRs7P{S6ypjCaK@+95-HHHA_u7R1i(91hfgb}S6lS|COUKgl`7 zf}tXt6!vsy4G$=8J{7s*LA;d_BA@o{Aeg#_%wVKsL2Bj6@Lf>?v$rX>R$v>sw~V)# zG#Ue}okdtJ9hVE5!=X6aUIL_m<`R3>%szp2P{pBvy}{VT)@7KRK5>I%i_!^K*CPyV zRe4wHbxn@84q*HI(PDH{?oCM0$FiJZdi)>W`e#@b`yBc=?}b$*`h|7{i-gbc5W={J z8i^d^TBn$|l$D`Q!qm`w-9szeRR3msq}*8gqPMdJ`8 z)jl001=5V@yRzZ6%Cc@s#7)Hpg#GcqmENFcWp8I)pDOr7{d|!=o_$}D;WFc?>+>&|a z5`5_Mjf{&~={*p+!eUAbZT1+j$x@?{)VRB9r$6T{jQ(l-b_?~T(g&&p*{YYSq!6A4 zY^~$4c9X@F0GF;02r>D}MdEi?Grqv1p#q_!Ai?ofQ!~|VKPW{JUv{xKYL9`4u=d2vW(l=LLpF}2wP=xQ`x!ix%dyX8`gw{aR-P79r_Ew zG^ZB6{3s|e7dxj92)pw6Oz((`@rE^bhJ~jdd{b%nsjM9gh_k(OhB->Qd_5#BtE;On zUh&R#ufw#s@%ImIHXSGonJm3}_!f6K&BNsWL6QIMxEKjdr;or>Yp!Fx8{@WcLZ6R^QaOxJeT%ZNn6|>3j5DJ?~tZsw{kQglI%>>Uns$*LVA4{70h^iA`M<6P`S^ZNJ;BKHw zpAn$hy4_;6p3DzsWjiQ9g`9kQNN4tZL@pi=y)}$0ontXk1!^cvAYzlJHI1(}je?9@ z<%$E%!Llu_q=ippF<*W~#2_qNrZjQ#W^aH+7m;C5wg$4gC6b2R>{zTQ`wo3oqODQl(Ac@y`nSq592ES&%iX*qEV8 z65-kvUrem;7y%nDfW@i&Orp;8nxVE9dH@ICwvKu+WNx|cIjIBzh{;9))&{a=dN}Ce zD8y2JI9yrtwd7~iAGiMA%C&z+&w7HKq8y)`Zh(NABohAW>pHoCf1mID5h7U!qdk=s z(G8XdZx3*dv6ZmSS+L>JJTroTgE?aPazS@7@)anHwz%^U9Jz81~!=aUdintP5pZ3piK&Ae7FaSF-MNBwh0y2Ld1 z4%zlCj19mONCjV zIm;6VuWRADH>{|g?|F`bp&GGub?#c+#Q@W6eD`uZu>H!!1PVEVPE>p3v_UST`d07+pF)zeA-OUqErLAV++I^ zWB|KQ&WwH^6$Wz>nU*Tn8@Bu@*OF}q=|&FI6i59%#N$A&um^nb)utBp;iyvs(6N83 zbeF6#fZpzS29l5z&$N!0R7ZhPRJyf`^({X_>RQ%X=%S$l4u#IB)rcm<6BuOz^g_|l z+-Az@h~L~s zThFijpGQ0I9V9iR0KJ z_dxhBvWu$nN$r7y&CFD6?Un6*flDsxc9rHKk=_b;rI_nG&`YsvHO^P*UT_FW97aLS zaz9)tp%XE|O{tLX9_v^T%MmK7*9y(u|8@FT#f5M{x$FE5(9DT?$xAg!LXdRtiE zz~2mAb0)zsXbQ*JUW$$8eIe&b(90C2l*}Tm*>SpTn8Cs;KH%%*j_ZyNU*tj8&nn2~ zN66ns+rA7r&8bpP3&VYL;QQ+;XcXn#%GTJ~buW;yWCleSCV#hm$O05KNj4j%_Rbax36DW-EpoxjDnljU*QEW7qj^ z35T<`cmk!Zu9W+!-m}gXq)3wl#I!YU>5szc?!XGy#4nwPD4*acwD$a;3LgH_F0Xzs zM-giv+VxMVc6AxMJq595&82Y$4S9lK=u%wob@Bd5Nn1utIRmqpwW}U_6lT}yeAaMW z-<39$^5v*@Bx`h&TuSkc?#2*Op>UpxnmcYVG`qBqtIA9g1&Go1%?r^a5eF3*NJ{5G zP9_M?%Wh5MZuCJ2@&zzBq#hi(i+?bsGfyoPPf9KE?s1D6_(*u?BH+=0Rd2vV+e;%K z2YAZGlUaB}4;BqbSBe>frbVr+>!EIRxb%bZ`_|OdX0CBXJZfzM18YwM79GgAPWE)l zf$!3IjYL+=8*GQebwcL1Tj;K4kkQ>+uiX9svMDY)IrH_J!Gb02fHe@nl*EWMt+@-P z(Y`-foT7*10$sQd2XpQ3YlXVyZ)>QTs(c{R}g+ZRo8)vxGrBtE1 zFeP8_i5?2Ut||+&7lJZ}pkLYYTI^8d7WS-~Jy6qXD%+&~OPtDEMCY%H3v~@O33qgL zM;ycIE#V8@9pCQ3wecsr!`A^>-n>PfA~9Qruqg5+0N4>DEQ4VlS^)bM zJSPn=N9MRO&`hY4n(G+S#o;$m4Z|!V_OhzBb|AQQl6$eN8ImQTee`i(a5f9)Z|^Qp zbQhTcF-s=!+U_Lo`av3ayt~qpUc)Udv8>(Rz2MvGFp0gV;8R|nz|RHia~q8Tk-){(71HrzqiuA@Hly$_*ct!|A4R- z^=`8tTGHu5!SGB^aZhZcc!xGvXF{c16Bh6{Hk7 zf*JzdS#KHXdm57NNuWBE&vMxDl(b#kvW>XQ3{F7}qRU>$?cV%xxJp59QX2M=DDj3fEaJ2>+N-3;P$V!RQ}Gg@uJILM z{~z}7m#2k~)NQ5ztzmy`Mwu3tyP|Bf*(0{lxIz_9rmhtLX>Cev`SqG6VjR~T6UQqBV`^s91^=|wUTHkkkW+x{tvYuS#_b#I@i4v zz{tXDVI?^V8l(7f^h#x@xoP$NP_}v`qXXsHMxCC6E7npc`7yNjx5gZ%00f1AOMU}; z5wX8fTaBtV%q3@DAy+Sz;-$&xrHuA%ODhvR`C$l+(00xb_LCGMUXWFOmku^k9GIO|qs^b*u$Y*m)wr1ui! z;>|pP(Q>S9&$2hT_&q40z?Xz2_m|p5YP+0~p}8S@Cv(F0WwWR{jk}Ag+ziW79_-#v z@b9@qz`41$Zq}cDTtWF(l5Wu#8;|G@9-pZa8U8TjKik3eYOlZ@o}-LY@aSLd6>5bymZi^>Z7`s$#ZUxXEA%jpLCn#r2+`1^?f6Yv!|eR)XdG@3;cTA28xvXt}R}h8e7rfl9F>e!y5rg!j#R5 zwtj5>_k&2!O$7$=@YSkgt>=-SVBqD#rT(I(a98XNRHace?au}I$h=gbxHe}GmFHr&fIAHplsl3C=Gpc8cB zH#j{dCruGK4y>B4Ud-hdg*TOPH&X-18peg|YEago$Ze3`_XUV>f5{E9QGQ-Te8;bq zb3D3&zVg1W!WQGWrpfuKqHdz8gJM?4ICU%4FAAH)@PeBBW_w?`Vu1alA>^?iQHZ-2 z*|}+_;izKU`k`*?cZHLz8k+^wUk>F$Q+p_{)tHJIn!}sCirZePLeTy6E^$f-vzEWf z_yaNlX!a^T*2Kq@djB0%;RfM2+vdI1fr}@)CPhQLAmey~z!}W$Y7GDX=c!zKv^N&Va#o*#HYUK@uN33LhhLkqjykoHcyVqO|(DMkyJZ@ALXO1 zreDt`Qh^f)eKF51^n^8FS70$_UjLnPFKF4GoY zC-?dh!!DRCi_|yz8+RPfuwMZNmV=6RDlmmFgCMN+PC>ZNpxildgxXEYAtM>6Ha#|y zuY%q^zFq#FM{sT@Z4G}k(qS|Tnk%Hx%f4U8)XOrCQoQ)zt{W2r)Z^eadB+lSFhJH& zQ6AW2ep`ns@2YlwU!c9Aw}U~7;8d~DB#%E)4RE%D1j^(J8N|GQx$UZTrG<{P&ea(7 zb1PAa=cEUCP8%_Se>Q?G%{4+31&%6*vgc}``vUu zhSID>;PS5EcbotEv)+8zD^d&{;QKA{)P{Xi} z=iJd?^@RaQ?7oSm0VpUDGCsX-Ftsr|T_PurP^9=y&*tsIQ;5-O*?NNg<{6VOtP~EY zZziI=s#Q^ALZa>4hOnQ+=#+Pt)EpZ>4wY;OlaMD!8av;|ZE`+O^G$45zzM%O76_!_ zroW!^>|wu_r|bNSk9s3j!%vC<@*lbHr6RNo?v*5Om<{GvHS?w(IG3}DfXoajHew7k z$l-w}re7gM#FXljENdXWKG!CKYup^T^g{H1M?Ni}eP2Uoj33H`>W8rj>P@GzBMawV zIt;2bWJb>SD<|K=R;gth^OE$11Rh0I4(*;^mlzF&53jiKOuUv((0S~q+zi*DV8$4z zy8z-rc|Q8axIbMqDH>||jT_&8zPIf+Yj=C6*r+bgFIepn%XX{DT90U#A;|R;2+IF7 zi_P?|7%!1SHBqhL`DMYLH(wIC(Lhj@W_FawS0#H}MV7*EpN{^W(FW=2iHl6DDl8C$ z!3#+ML!j}r9Noj!2hW(yELYM_?$e{n?I9P zEQ=SsxD2cLJIGh-8JMU*L(MFg)ZG9nfup%E00yzCG{DZ4%`|GzQ!isC%zkq|h$W>&POye#tXeDh+*;bo9L0Urh$ZC$FN)3HL|c;Wtg& z=VOcg3;O`Lg^`spesi8jf=B8%nV8y{n(B=}QxQox6oWe>4rvOz+bG4OU7>h?ilCR$ z6kFJr(dY*JnfWj1Ef|Ei)a9n6g$6(Uswa4I?Z$GQNdOcD2KLSE0k|PNfImX1hZ;t!YW?!M=N&hv+_2tg0>BoNcjr8OT# zz0YLx_!wQ=ge@{4e%5~+IbRI}L#Vd3EO|4F1F<>UL*XsDPrNGAAU`TMLaj0jp*1b? zTQQLM(wjn*TS+p4Yu1{}2^@&8v);q6N>;ua?Jnprr=XD`&j+7z7(!;&q}TP^>p57l z9>v#&a4SNox?LWRL~C)G)7==&1eDdNAj9LizL?1R84237zRV5YJH-CyN^Rv_U2{5Zjp)gy|hG;&cgnu zw`IgOq)RqFQI7q6iEHIGH>d7UD}jvpLap7c{46+f6rtWY9ht44+T(->yajo#k9;Mw zLMXf=W(D{EUxz=n=JJ*4-6ooYTDz0q8PN*@S?}!n*6z60q{FbnKRhj=ptoO!Qwt2z zNpa`rgJ63g%($W*E^%R;CKiBhxhjjYu)JHB_<(Ya3`^mDe8)X^2Gz0!Szhb($ZE$g z&t}Adv3jhRIdpEet)%ikGFimBA63(VF1Qf1!g4R5y2S3rl+h9Lqv=8YyMFBVhes*1 zAKwDLjUNTuO!K8Y5wQ{0!fDPNeCH2j`?Mg=2k&+gX_J^X;?k3OD>FgWKI+~Q7clA_AXb%qXqDM^i!a8p5w1b3-OgsTKk}Kkb*tIyTLxbkBh#=1~*6$X} zo^6zpa^U9wAS#@!Y_|)p@JDrIMb-Xkj64blIOC5?MExJ=7-FQN+h1>jp&}( z>C&TLSNEL>eaebQegB*Z)0iAkQI+8L=F`PVsE<{IN6$?F z5}X~LkX+42CKuLfJYKM@0jlzV%CaMKp~3FB1}d)$=nLcPONna@w1RsrE%<$V4!5FG zILbyOso9X&m>);qAPZ+KHg&ivHcB8|h)1fRP)Sg0H-Qg ze;N-(a6T_jPb|C+QI%UA5Sdh<*uA+1I2A>IK7U=w9=@rx^rB7F`FYu~LhbTU;{KW= zjOVHaIQ_>g)8(d=pbkdM(_^wD%l7$~z*llc%itO_XZ9CQ;K+`Dr>NRd&E)FIWD~<6 zom|k3--dZbYO-=)RRGD*p*KqRyF@k2262Y5;peBoNVE?IDj+2v1+j>2?*Pk7Rl3!S z^8It43e}B3TRT#vo#FZCfv>YG@1v1`C#^q*UaAfsep`@t$bYdf#SEKNxK z2g_4N>DX%;&D?XsXAQR*&NI@_{p0H)#n=Olc3tE?^Ofp-t5h89ZX~-}g5|#2<#4~L zoCT?qpyTC~+q?q;#ctSDD>li`z zJDez6*`h~XNNu?X16B_LRG*REZ%0Z133Mszy8FTesd(Z}wN%dvnRZYSMk3->r1K_` z6iXg_XGow0ZnKD*@c%X+u7JYko&I@-fJ%-8Zk@oF?m{n>4(!;Ttc?;0h{;!stA@RyMw2b z#9*7Z*r;YlLlJB*(w}@{wdccWXcbU&nn(@2E(t7$s>m9r%e(XD}WcX4oL1Ev<;q zhlu4odeQYeTRoid*HLtx~NJB3#(iY_TjpV4>2xg*P-0 zpt$jlar%EHsK09p&l9qk!6f(ZWUDm$p|1o><5J7juiYbL1$7Mt&6su-dk}ra!Gt&T(ISqx`*{Su zlwXp!u=smzYPh6Iy2BeUz`Fi~%~nj)gbX@2EZwNc1anVt80DQ9?j|s2r^v2ry0b7o zXFaLSi#LF^pZQMuJ-LBsGx2y4#@8(2eumXl;FBe2_MZmE#JQ`6yWY?3Xn8%Y0MYQ56+dAG0A&<>UFlfIdWf(MVb!&6GZPki^n?U31q=fIVJdmSo*) z;(mm1I*l}|B1wgC(l+U?N0QIqyta;a>xBuw0Ri{~=gK6|NKKs7vv6tlTW8ogXm)^WdL;HtUstb+o?r_I*b21UVZ4XUyvRq|aroSO77;oE+7iRugWvg0^agSX{a*_%D(hsJ`=DPeo2WmZiFYco`k6Q9 z=?;(|vY3lf0$99V-HL5|#Hsf@C_`CZ#?xymQ;qsBnxqbRAnjrh3nOhi1y>cq zb_+>i`z%Z_&8G|SRijMnGL2>REM{`UiK(9nYlQ&K#(>L6z$r}Yw1Dk+_4W_fG?wM= z`QGU;L`jELyaV(|@@G(+qS(Gm?UrKdrrUXxP{2Zd$5imR=Q)A zERWSG@q0}|A5YFYrA4Tl*UQ1`W6(1N`w8b+7MR?y}_c2vo@2754s5^=V z@=YbeB|vyHQa=$lb;iht8Ng^_)0$xephA)ZBZvf89X1)BaE)^xNO)qnf;sM-L*(xu zhPv4l6VyV48e#)1B`ccE1(zfe=4O@ec4LutK^hZRxa-N_>(Q&_)P3)GFxm#`P5@~c z{h*W>Y3Zy(Xn+7yNKIL>&;EwYuU0k&+Gjide+N~i1V1M>uf_KC!EWJ^H|n*cyjqt@XNIT|HLX4udBFCXWJH_Ug~QiZO#iQDw*MCo?qJqFH2od zY{_Q)sZ->RI6G!$o`}ELb`l|LAJ8LkUG^W5V6V-MeL-Qz-)d@P@ebk&C>d4ai$Is0 z<7=rcPuS03gVF#^%+HubCg6?*5xZuMLTPzjB2soYNaTV!Ab}IAI8_%9v15ddgTFP4 zpmwrSp#YYImtS z9#6*D*;L4bSO2E8-r>flkCMez#H7a$J#riHc3)?GuS5Mq>W;Q$cG~_*^4Wso^g%p~ zMb|PJzSN$Xrf3vEbh>J+8jV~mL21bx-ORz_96?BM1LV<GtYqc~^B(1Hogrp<+BKaaY%E-pHPn2BMwn}>&(wT5qJp9its)NQH(%`|iFgRW& zN6DoHi&=dd-A*gL!SM{ zuswcFt10mSQd&8-RFC4y^z9YDm#x$E6yy!7???He#ejPC2ab2o=)Mt1G+hGMN~@b( zYh?J~qCD4l!`{ti3^JXxu&)u$^wTl#lJ|k$C`z!Pgsvv@qeafRY=0zz2)VMxA3zbN zy*G5cPp`70vVPdIf-tL?B;(L$Ge5IUx&Je=wIeUidOjS58Idkc7~;`q3y6@m&8Pwn?ywPqKXOH^eWI41?UUsjusw#=v8Bc~b-BnHm`1 zE8b z_hT1rVRyV*{P2drdra;ftk}Y}PQFnEJ3`oyNAB}C@8(2|(dA7LOlvtz zvAtrywo!WlUD(wXvGOi2zkc!Q(L6&$`rj?Qvsl>4e1)wpo2jC{g%t*x7|Ui|A;*Qu z3lX2CdhUhhvEBK9Xx#@gQr0-*wA$o}QzIplb0&Vp;@Wla*cUxxycbp&d%l-c*RL-Z zjWmogCqvD4F0lInwuh{6YeMdy7X{9)e1`cGQQ~KW2t&aMY6tXWguY^U0Z5P=h~$~2 zVFX6C{S}k$iTiRSugLtl^v1)w`dp1l|J}SdIW|)&v_=yFPa5ukc-Kj&?v`{b*VzP# z^u*JO3wx72kT^IJ##N?P;2jfbzseZ!nlj`B!KB~uu_^P3QkzFU(VxxALhT7}=L7ev zW->K-G}fk;2fd>k?U9^||{GVtU7Y)>RYDwr>n*VHf*O zsn$8dr8u{Xb)+}cbW<>VU=g@B`IHvN{g&aBBa3im5hn)%3DI$okEimhQ*@{|4@+uX zhln67nkZiVrmxe58s1t49Zi??IY6nohy8kWl*}pK=om2Jc%M~W4vMZtKRVuCbjIiF zFHJ#OxaoBRxVBXD9@Fak{(>D}{j3a2k_y;#kJeOeC?S!M+Y`88Yr+5wERXEI5pY(O z&iTJeM;9W}dfZR% zV=3+Y{42WD33wDK(S2Uy;N7BIL8`OXpoIZ==9I;afd3PDKQPN`US zI?eKU$eJy1v{JJ8g+4M}7W-)bcVoWTeQ~M11$lsr0|>eQ8!*gs z*&#~7k0GG@_PEuD1wct+sMG_HH;~=7MAmGzV9_A*B&7(3w)K%X>22L-&CvMjqgEXi zUu8{EXOS-0gy2qdvB#;|5xvU|V%hcwEc{6;87sm_{wm2TwB*g6$;M?wYPd<<1qSY@ zh}x!`RjrRdQ}bVgKPm6)`x!DJ@Gl}*pgS@G04=DUiI%;}TP_@~Lw0!EPz*~+Dk44? zKA3zAe_I84Z$!$OJ+5eM?N@*S6Fy?U)_jAzG3{T~h2nT^a_K-7!8;GM*m7C^f5kBK zvnK|R>*zrLvQZ(s2byd!QB)Pq+ z2L_Nnw|Q0V-P0ze)lR^uWd?X|*agLvzH$z_OTuLmh^^2qCIluV%z%^Uiz9X7iCw}L zHDf1egAN}>8RGA-Os=iQQs(_$P;2m4kARyAr||d^g<5DV`;vEBU)M zM{{4il4N2vUGqkHjZ@d9G}*(Jhg_Y(O19gNrKgoSYLukiqSYztds4w$on;Cy!ulD! zGfk%qBNI3PnrZl8t=BnQ$=n6s2XZQ>TAol8MR5zIm|)1FoHVThy@(B)Tx%3|71~Dd zbbh@{_U&BPyQX5cuDmhfh*&#`GSl_#I)4Z7Smd)VkKK{dIJ7+mvz_P4xj^LW(T`G} zwdo#$CI?-jSau*u)lb~JM_wCcJc;QsF*bp239<`cr0MDuk8#SnuG9uuHm< z2-f~<8bRyeQ5St@r{AC{mVxGWxx%#+Rpq3(1Cec4OYvh-0NWSam2+fuidya4K$)&nf}^jK3Rx|8o`*E~-}-R@-{#%pN!A?DkSNc1QwmIi*da3_T8 zi45x@^phuq^lN>w4!rVni*)H);xx}D`-2*TEl2VJ-`C0N(p)ndn8O>oz?fDUB1P#9 zd74^nR25Kr!MH$jNXdG=?Wsl@S)7VRzcuY8K}=`f_5hyB6i1Z~M3zgh=d$wH0g5bm zivo+OtLVUKvJq%$0EtG#r4NY~X zB}4PSbXrIbn!^U>ztnp+%lF54cQS~ihg~v2oKp@*<(xG4DC;ZjQ$I2Z4~E$CR^5G( zV!)7$!_h-;3^%PV0#(A)Db<}8|F3DLrO1R%6q{7UjdA23r`M9zKf*2+dI#wXwlbZ} zG_up|+wSa?ssy7+`%X^V(A;AhYFN^vXg*G)#9{VAN_ChUnRlByXobTi^jlIjwcI{o z#M|=WY5Qvn^c&ov8!zXKydl5bY|dNA_#0bciye!<^is8S?P2>KB%2oL1b9P?H|BBeyNa-|5Hnu?U9O-Bz5dzyO0W-|*7*XoHI zMV2=LK{Z%^lXIVm!x$Ho28Wa;C(dHT0=r z2}M^9qS6{(@(1ucgc)8tvrD$rfoUCA2shJ5JxI~{y9KZZQUZ!eXPLx^C6bpnj*qub z#g8D*2wSQx!ru$rvMxPh1GW@XQD|)a7|ca^EGW(h^9Hj4ONb7AEFy0&XQ?rB)}OD8 zo4SEg;^vtuio!4oW3$)=>Z1%zZ9_exBn(uce>C_xhl*hHlG-K+$n|@Tjo4U&nd7uA zc*TbzJdSX~w-5sWia)^y+&Sg(WJT`1v9ybz-{#{XfOdP9>fJ>Bb%-=EE?BE>dr2Um z|BN4yi(*E3kr4uyk(O(w6JwwQ1s`ijCfd`H(3i(mkwg{u%IYAIk0r#qI5Mk2?lDy= z&#^*3LMjB;tAP-@DW*BBOzA5m&c!{hPU6~1gL=+<+{5yCI6_h?aQ(IwCC>b)%S{_m zz~2-npu0n?bXX3rPjANk3z0DC$MA{p1nNvS@$J8wK7B<~e|lWuHsdW`R;X&XKGC_w zYa|VwPgTxhcu}ZT(fXD7Bprbh5de}*4hFhVVeU=kgjZ-HMjmU{=-kV%`w4N19z-$r z&v%gApg0|FA09=%L07TAHo=CfQha4i2KJov(yvaQZ>f`aaASF4LIsiDl4 zr`xnO;ab+Bp$ZruMn*rff4ZcP$a)h(+k&(xOzmn#pTvt%0y;Azun}m8=Ie))luD0F zt(+bSe5)s@Ogl+I9pP@PL+3@uYC?ybsE%lhWn$2Af4dDM-z&`XGtv~{d9ApO~T z1`cjR1B6J3`&oz*Qjdc_+w-$6i*(8Hc=KhwgwhOPDodK3iRB0f!iX_F>F5$}g10dS zp%x2kaOqjX=a#HonLLJXGOK}<62#}8$`D2kT_barN}hQT@Fl*3 zzm+_pIYPixePefKP1o%e+fK)}ZM$RJwv&!++qP||V>=z&Hc#$noG606VYsN=l^AwuA^)fQA~!r1Su*23`Oh0 z-ra*?NuAp#_e@V6PUkPl?Qm>+y4S(U|Kd)Jg6U?Rc>5Kxubtzb`)RfR`amI1g6F+= z!%#8n{b#Y(ia=w*~6UGVbBMn?}q%P6MWa#Ya8c6z-V2|CRh~P%5Z%zTU)9IK zzq_f6+H8VKVK#)I4>feG6Gf|V_Bzu1NERYN5=so`$eC$?pksdTUa%8f7_J zcNDE2FTxIZI+sUttQ9}sg6zG2<*$>=72O)vYxH~ZIi71w9TGm(IC`S&XvJ>7aOx(ciPuW}qH?D?u=(@@a#V2OA?Tbz@Z``3@$J1U`L?s) zQ;fc}qWbtv1<&wk@Y)YzjGcZX{fpg^6J#en_)*LZuVoAt4zK+87i*Yk2!j9JHcFMJ z?O4N08fLMR=?DysS9vgkMgDvsm&uv3sJd!!K&hPINR~c+9E~^BsH^rASl_6Sr^r0A zC(!+2A<}f#EoGi^j=_Od%igvy10Y_HPQ7e;18fYoZ#gCiI;mhKg4?T9CGc*ksFRj3Ed(fskjByh{{jTYYuS)w4LRS!97&|{qUB^wZfHaN$Hr5&VYyb0 zHTHqkBu3MlB605JMAVZHD>MmaK|kOH%|M`dR0dktY9_%e?ebe*(gYK#4fi!SBt1;h z$PVK^Iwzl2imE-3ULiW=Zfe^DXZlx`<}E0s!c&jPf~}AIkq!-F+G*JpO#!`fS9LxCaTY7{h*f9 zQy&zpwlfuapJX~YCUdxFTC785+dEOPGV^Z-M{!Y=EfapRPZYm3o+Q`?C7D@;@NNp@=Xw(U` zgaljD2h_F{dgWwfk_uA^Pa{iavZbS)FBV~~QoAZbUY=c(acK{5n5i9^<6Co=5Qk`q z=-Oe9Sg6>^df%MUl-&$2fT=6D!U#fe-Dk zS`I9ddMG1A1hP^)`R>wI;pX8XO_GpGpM1 z-4mO>2lFg_YvKkZ74097SA53 z0Z(K=6xdXmZd0VIe@Hh@3QMAK0J8$)fge@&W|<<`ROCe(aKJfudRC5*UT*SDV#u6h z6T#?kIddeAX%H*4TfQ=-^qd^4c*JTnmZ!P{jUg^tIx%M<0K33k1o-8b<@3Xfp?9x% z;ml|8lIbk&(chEjX=&&*cgM7#fk&U}Dn70Xsz?8TCj$oCd)J~j0agcg^L9PwiG;F~ zE0`mPDU&F zQcABHWvej=1OR}HLAa;g`V9bp06+wjnEXZ_mj+072w(-iGC)Hh#I@3a;;(HsCC!zz zY&+~`fs`#IyoZ$i;MvMKhe3`xP_?_R8_#uKz%sJogy5(cM7*r>zMi-5+9NoDM;Y4g z67-6hHm_+j=1*v=PL)NaDnCsK5Zzi|+@po!d>Hex3V;TMhv&WEJ$jY*=vqjJ&#IDb z5FQc|4%29+dmgv%cC^gRnca5rlUmSHK9YRH{R~%@>L51(n|v~m<5cR81Bz;%(*($| z2HC_Ash+0<>25Hf?D2e#?{?}$^R()2YhzY>v%SUS&YpJ9vsCr-cO^wytSC^w<8C|w z*y^S(rTAHRFt%?2zrClCFu;ubLE}z`M~TqA;yyw`hd8HFFQdSA3DwVbQTofJlZlZG zCLFQotr+Q}w8m*aIzGE6!|0h4bXjy3ggu{49W;0`?@@EgBpt}yPk5#x3MKloFV*u= zfF-yz2~-T+xf!$zIi-qsYo|EW0>SDlcJ4i*c{>xcz%JV$BguLTje+fn)*9`&7l-lG zf<+FS)N3DwW6P$a?o4IMT4dbO`N<9!50>QV9PxG*(JWkBJ490#@XHrSh;Zl3&v5f@ z|I!6B)b60}^r81mg9Qa|^k4I)(Kqu5Ys5c~1pvyJOI8}-3(NbLJZrB6;EOXlKPQ)5 z=~LB%oi9%)77erunIJ@4U@o>+;P`a^by{v@36q_zjGjE#Y*l9;`m^ zws|}p-V>!&1$hQe&(8h_H{{STp0#2Mc@D&%vxYDSHK&^LC5J#R3Ka_{l%h`DjRE6i z*kc0p?)tf>=HZ6+v^{KK(^d;%sHI2ECEuJx~Y=;7j{J$P9m z7<^H4^~_%fWFxJj#wf@lh|U)DeCh<7HPEtBDDGvaW2G1ZX2_8~)UjtmCDP99Q_% zUZXUYN;4<saDgf%SJX5I0vmREg?! z@!K_$*4|8C38>xxPo`Z^2Y)G7sZM#SdjadqkjC{Wds6ABmwB(O_f*$}tQKFCm88$V z<~!B=NJ2Dm177D%A5!;+E6k6>LcU&HpYSCglHC_u9LWE~t|Y)tO1y&O-?GQ6tlF*J zx1Ez-U#fdZQo2MqC3Q*Ibp*xKA}q;DBX@aK|A?6WR_dbhA~nN$g!~)_@7PxJ&i%?| z=euj7&R;Luu{zN@ZWU9NRvIYe3moKCEMlBN94^YSPJgRgM%>P#BC|)dfrRUIB`F#q z0OPkfN?f68yFuBS1C6da%xL|T>A#>rHwAy{6-VfnRUY0Eb@5$-#}^}7|DC7T zDykvU5|z7@P{btk3-0^a>f2%I`z0ZmPQTBWzz4+!f(6-NZ=LNX6yp!(Eg2M<0Ge@v z(Yd|R!#V6Gr_&{*rljz&RcU^hdAKplHW-~Gm<4fs&!Ssn*BO_`AuQNg>4nWJ;L3)a zxbBj^Ej#(FZ@Wd;?7SWL!~za0f3p3uZgHY{Ys-$#!pFWV3?eJn%L~@Bxp7(an|!=Q z>8}unfro^_Z`vgti``?#yiI-IGc^Y47wZ??LA+g$5!8Q${K;+ws^d))n#awJ1#e@O zCdJ*#eITMm@3TS=m;{99llb0uuB!-?UnE8yk088{SMIM_THJ>cB4=@gR}&T7@pri_ z>wgqPkFJ0 z^?kQn-*;^i^3xm%4e}KFUAH9xN&QY-0*f4!l`nC0q;~ zAopRJ0~#4!DhTq{34$ur50T2C0WPqTSdnMeda)sX%;uB26fTmI_z@$bUd5}fJyr)A9`G;-O9wWG zM<|Nl>XY=TmZGi?MzS*_FqV82(T@Wvs1O`8?EmIIr$8+Eq`rYm^OK_H*svD@#ckRZ{FtSJBK87BWo#PZq zeBd8tM`84Ad7~d2Z;1|yoi5P&G_-e!66_tsd1-AIT!n<;Q0Ij7$tx!HlypSPr(*ns zlP3kVb}r1+DR{R{cGi<3zHQ#mjr~J$_fXe)RMT4XohoE03eo+lB|z2NAg)nzWvUAk z@>?4rZJ+QxlTdv9N39XVzB6IxZKblu(suq4PHy`NugYGKOR%bFm95>gtX`O~dvU-& zi@)JgC-Bj~1NmM@tb#}77rpJPJ}pQ*W<8VlE1QufE@3{uBjA-5)6Av$+&}PpH|Nwr zC6K6YcsuMtq%}}$GkI{L;+w!vhUaO}n4w#=B_Q@@o)q)%s_sD>s?lq5L(kHg4Ws-c zM0l+1bTL&}MlJpXF$osXV0Rac4L)42t~rc0{H3$qHzb}gP6|fVl@87llxE-nAX~)E z-zwMx{Y;_=E6xfJoYOv{DXh-u$7FTEi^12TaUN1NpsJt^-+0v#=Mie5@pp6dU-YaW6=MW-FU1g( z4mTcSP~(d3$2C~6xBZNf;_RF+W;UvUMMkc(;$V|W$yy=Ip0B9h; z1`LgJ?-oGvvqPG2;l3Vw2k4dyCt~a0PURAnLie#pp&lrZQ*K?MoekFHYMiL_ybl^( z!B>qBE(XumFPJSn54BWNgR+`<@zP(fhzmrjuMT9jqRBgu?y1Q|;QW!OnhQCuBNR#D zNvWZ{9YJ~#sZW}TQq#X$-MSLHaY3Xj3=55+{f*I!Z5l5@mUuON^Z4Y1QA3>CWW88aQ$@Gc|%-Iy5KnM{2w6EydgB7z5f0Wu#Aep#PNq+j*tc#&ywKaw#k; z=}#2t#l$uc&mePL+{z(u#OAZu6PgXLEyA>=wtR-gXk}6sBT=fy*Zvm`LZKl+E2dT$ z?sTWzzN7Tfli3a}NmWFH?NI8IjTHo(-b34(r8crJOJJePzavG+D8cmsXqD}IL7r4! zi8CA|&ZoE(FWoX!K#$ztu0M>>6InnV!dMh0+LFAEPbEs4DU(S@`dCCgL(oH<@tvu%0)z=s&#hNG~r;_&1`Wr z3~T2bZm2GcNDfZwu*9ndK!~Ssn}{(EmX?IP2U5(=kBIbf6tbaH2NcAd5Xa^s+>WeG zYtp7ucfO;ChsOWxEwn&Z+fHGF9d=P~@1MPQZ_J3fD!G@h4-;c-TGQf}X+TDX&#zhj zi4%fUA7vCEy>k@SU;3djqq#xz@%@$xr2pc5DZ^}Y?Tano8aP>UDO_sVjjln$K!`j-$<>0v34O;Q@C{uC0Y~tYq?NZ3wchf81C3sctw|9 z$9#Ax1cP~@K*PH%3Q#D#z$5Vk)nqNi3sPX}Zbh9{dL`?EHGO2%7modM z;|5?BxoQnWMQQV2|030aoEak4M0SgPvuG}di~1)(?iHB2OWVRw1mv3?O}t(t35rLfldgF zo9esY8j?jU7N_qpjfh6m9XJOHZ##9y*XumQsG)@;PNQVa3@7GRIfRmI(M5xTwJ#_c zpUK(vkTFlGZz=UW)rG!s&E@BM5i8-h#d;zavm|C;>T=1U+I=LYm7FKtlSpyj0mk%q z`Y=8hO&kfEQoiI)IKg=wKcSNm4fM@)nD*+gG-%GMcsf!=ruOHL+_8Otoy^D3v7T{n z;!CA(64Xa8j10I8N98rxN@Kx{)va!TurK~U-XNB+OYFp2=RH`Ya6eI_(wUnNU8rt3 z-)&a5i}L-Mcn^W?rkM1j$m;ZAyLvCK%)>sT$E6c+CJM3b$BR5$o)1!sM;O%)nM;=5 z9ukv&(zbZc-A*K@!z+|Uagx*ytPZc78;NKeE0urGqt#7@-3jJ0ne~^XM4}ruhRSP= z#77SFJ|!lcZab_AFe#4Ms7V`t%BC}8ZYVa{HX={nA=&J=O+eVeO;1pf6^e+~!$Ck= zBmX|kc75|U=P6Q|9tOmFkUX6QM4O|n^*Dv7SCMbyBEr+J)xIUs5!)BQ;YBV_0CuX4Q14MGbpoy>#`x@u&=8^Do8PE`K$|;4Gju6sX`UP3YJd;JlN>hv-yF1M!-(a!XV48`V3K(U2G zCygXH6@`26mOP(Pi_o-X)@a^u>H6j5*Xat&%ntpTOg@&qRlb$BI9IY}sz%p)O*N#Nj-rw<)3isi18jvF#o^`V`Vl5)?QmAfJUD*&e+hwLD zUK*J`4rQnThjAcS{Eqd8Qx`}Z!;P{%ukhqqfA*+@u5lqr(!E`$-gs54qvRrg*zl122izF|!ZR_?v-1BqsYp zELYh(qZ#i0m{tOC)@N|bdPeSIO7wNS!~KOF^-I&3JrIYD`kiaZA6#Xp>I|d*G_Nbw zqZvq6?x%l~9fHCA{;0Ou4y~?;Hjk$`s#@IDMo^-G+Ax=XM$PCf5p^sNzrS`|JM6{F zW>55i$v1M~uZPmHWtKv;Hd2@{ydB|UqOFnx)w&T(f*HNEPIm-JoEWiAtnC|EB)I&K znqQwj6Zd~YY)In_)~2IOGp?JOb*ysHb1Zit0kgCqCo?ZjB0GBeY)-4 z`}}1faGZs26x$-bOd*3)QIfN(6H?oZg&0uj49BeQH#rDpg#mdp|2^22CH(n-8>wHEJw>^B zLjRPzp@tKJLctS+l2|A}3bZ5`wY97V&s{~)p zXh)jBgDhx5OdI%($^Zc1wz0FU?fqoBWNGl}oRN>VY$WX2Da_(~;Y|$}KidGAGB#jj z%up(`ruE(E8pUS$@^dnHGMF8Ik#-JYAO&1s-faALOnU&>2?L8P>6Bxtr@?n!SxU&w z{wBL9q7MC1E%Ug%(KqJ~(-3)pPnMS1&9)x1ov?;GB&xNG>OYOIL$|*C#wL-_3`Aa@ z;=Y%`Gc6W9bNN*lxRF<)8*ARlG;-xt>ciJLOngZYq2{r+!>30SRK{W@-42CXaZBc% zD1v`<-IlWef4@_Lt?*IWsmVA1Z09_}hu`l%&GdiVF#YoTtwQ04|qmwnnz+CR&b+dG zxveS?HYSx9VZXey7brG-m=+Aztvq-rfgfmqD}Wr5M4ZhhTbk@XPopyy1GV66>?D;GBs@L|*vOd0Mj3zm=di+nu3r08cCbX`aJYgSq z?RZ(^-cSnB!Ed$pWH2@vo3}GiDL5VtbfLGpFGLjL7qJB%?9n0V&H*GoJFZ$4%!|J& zxReaZWD&{OahFHuIoiqh$q05biT}h3Ew3<4nsE>`pOvjds8VU47`44<-%%F z@C>uC|8C$&45SN!MSLDw?v8<^Zg^0o;>Jm$A_h<>>;NIo712N#OUg^VQXA(o5A235 z<#drpl`mkOFO*Ft`yz1V2@tB7-Jvy)^DRYj5?Lo^hHqSq#=)xuNLFLL zFe^2>XPxmPY)A#>NVO0>8G5Pl^K@x4`!?%h;7NpZPWUMx%3TVLp(CXGQ)8;3wEuS0`@&7$q%8RNi@F zz%kXa%I(>yLzF7uXTufE1eGGExKNR58Q5%g_beF$n112ROB?1LB z{+a%YtZUDZ;G%;mMQZ2X_k~`r*7g}o#{<=nuq8j5trk}_G{j`mm?aM9ufaI19qDqb zU*PEIGu0=MlS3l#X|O_~9%{iM=5;W0{sg`I0b0N+?4M_!ii^bW!FR45x`vn-D6}SRiu0i^H=300PxD{WVyR(YP{hwc1MqY%`=%88EPA6!uQS z-BfXDNZAHC*c0FIS+^>e ztG&cXWCCk+ybt@-AW(Fn!l2Hw{ps=dU3&;!KwD5>6fMb{T9FE)c3KnM}kSS~X{ zj+igUNV8o1xc>u9VBR-kLIldwj?Ujzf0$9l!D=muMlVf*+A#+*qx`=(t*5QS$jaUH zRBdB#6LtrNB{CDvIgX80@c)_k{k}i8%=>Q<0F+jQuaoQNhS0B1vfT^Q>+P9s)^YjR zbF&qPAYt<9TGCW(Q`2U>%^e-Vp(l#}K7k4!{Qmb@UKY|;bd1qBss1lbubHd)44ivZ z-ee85ZQ}YK4C|PjL-LDvHhWf}TC8#AbUzdT9I`jZWQ2e}@02{ehP+5?$;nsaQauha zthuvUk-&526n)oSNh$Ts>Ev6dtR$$X4Ux5kO0_&14`Zuef4zJWF}Y76L5IhbxPemZ zt_p!MeOox+CN6yg0AWbs;y#5|x!u2!iduC~T8J~dLcA($d$Gq?`R5>T{)-jE?B>F3 zqs|p~%Y)o`O@c5F0DA*qv|+)z$`w{bKDp&_O_IPMHR+&p%GjQ*Ip_PmySb0UHzIepX}x@6%J4mg3jXm z*uP=i?FXND(hcwuX>r4SlG{sE8#EQo08o!$D87$Biq37nka>+KaxQw`BMslQ+fA(@0M*T>xNAgAlR0p!w!VpQS-swDm@iD;v(@Y?xE<+cJiYf8-<4<$|{gr z)XQyp7nlB4P0=F4Ae@+jlUI5vixT;eEAE+b79HtT)W0miMy>nwNdiFTOf1ueZEClv zqlp`p+7S$;Wf)1ZG@U@PGM91b%zT!3hk2+=6%R!wjh~$6_fMz2BV^q%TZLgSeB~-lJA>c^^c_rTAy!Oo%r| zj=62D63S8ff$89|vFmp2-s4Vn7ONq~q(#ct-JvJid@|N?xS1I>t?pSB6R;I7)`jq2 zq7jpnNSGE@^lW)xhf}7BWEwnxj-~65Rg@RHh!sL|H=~X9clOb?#rtzbFe-@8gD%}- zAfOJlr1noX!{DmfkcWy4H5j#n5S}J2IE6!G02-oLZeH;g; zNwUU{B_59D(wZ|K*?d)CMSoXTk1k8SeM)VFNFBuiy>S!`>8L-)bNoVg$QoC!OF10yKlTlBtElbZPt#DzM%U*3+lz{>C& zBD1X7OA{?txVlAMh?Ob^S&V8!>@ST7+Ph*O^{Wz2`d13nB=O+qfK^paH+STaSf(T# zCSkxkq2zZpxg$A99@p>s+$;;t{08j%oxYkA4$RYX7FU81J4~C?Fe?IAgdbvi11d-O zzr;r4MR1_wb-Dh!om*(~RYj@SV%LW*f}fftj%~f(odkrk7(Mzk2s-0^wWL>f8AeQS z3SE4Mp44uGF68d5*`zxxDt-?VY@5)i!-qQ}Xo1OL1HV_mSaS{3Ps?ecNV}223Gb$H zwKLOW^(2tUpTV{oKD~)l;xs*-zL+K?>IF}X&1=dP zgwn^k&7?hC)hD&^-qNVD*1#RlI2gUvPRNSUQ5bcdH{FP08Fbf=gYB9V4gt&>A^|5F zK|v1!|AWCFDuG;-{e%avwb?n2bDDV(pmgi%xim31F@VSL`Zc>m^@O|>kZf(*eF8Jc zwdf|)D@)n>*eIakn{FIhNuk+HW}7!8l|aWcROK# zU`?4SSE)hxVZ zl?s)pgpOZrS$=nXXP<8P=udE2>~X4KC#y~xfn?($+x(JYX%MqcUN$)$iF}U}dIExW z=vdl{|6m3t6&VNlB6q$N_$wP(Q`fPE9F``$-hu@t^^l~Zq5b}UctH>mzMq@Fq`>>J zCopb$zr8^S5I=4b`WzeL4C!!70t%~}Y#lCtw?SeR@4_1#4JXllv( zXH&QpGl`$_ga>FLA(N>Vzm&+{Z?_u~f1JE#>@mU0-AGH2I_B~lkl`}w^8ectSjG4A zSx4Xu^(y3Rmeifh1mQKk`xfw-0OF<7ooz&3CvAFR0;HtB@umafV@8ai`w zkI_7mzBHP_qI{*g$kt~2!9V!&tvzSdJ7SWe@nx<-pijt8Va%348plDV&?_(D$44-*H#f4$+lq zeL>D1>{Y(dH%G9$G~ZIymJzbC)`oyzFC?(rKsF>1=ZkJC3vM%4IOo9I3O*P!&10PL z!BGRbF?cX+0M}uK^~ti-ckLN1Cb;h}OTWw@mK=i|3g)rqZmGNjunRo$7h19SxbN5Y z6nClP6mIqCTfBY=Wg~_iBc=|Absv;kQED;C@ia}U^YyIEmCiAUiJ#F6|;CtQW~g|*D<5TAZh z)}+rI*aQV4Py!w`)PKPATBH^xht(LJp!F)Wx#Hl(8@ zj8zO+9QqLmq)rb8vLUcA2b!`7P{EiTo~=3{{328O*Q8IE;zbzHIYvE*Xx?fEl9j8ZVIo{HCk=A8^9%-Vt(86W=KOOdtWA%;~zi zKGPZtEV;Ol`5osf4Iiuk>xEDXNipc?mk8xKWXzV~-FiQWI1b2lCalSWW?cK^z8Ga( zx~<}#eQ0=G0L~A!i)O^75aW<^m#qRB7+#UcGsT{hw~-O-!Px!U%zDv9XnCKPz+AfOmf%GDANbJ8@rn7G^rWJMgGxJF=Ivo2%tV`GNYl( zafKDLDFFmcPDJ{6cdr*cD=bK7&bvLZ5ggZP)0_RXf4Q$zcAQ;B?Xhm=A2cmtZ91!k13p~%W#XZVfgE|9~K4U18qxLQ!|5DdzfSX0)yruB*j z%A3gDFl1EhLL>tk(=SerG^t_E+)-|>7%Rc(Ny6a0YD$)nuKbccpmD()=f|T_aX+W? zmgEGW0Q#EEd!18+UnKq+=mUiXDo6RhEYDHaPRiZ`46E$+Ga%!24wU21I^^Vcu>m`M zd(js{S*@g#xpC+4)Cz%15c(N=Mio#Yhp&X*QIf7u8R`dNB&vN+J7(7Nl*%Bw!yKsci zhii?7bG%JG&H%OYHzt%eAEFQux+k=!&5R{V@H{;yEmmFLHyg+2Vq)QfcbEPNi~z^Z zb^`^VPNzgB+xmZ`lTB#_O66S4YorA_G3>2KEMQG`*vbFIO1(L1Pb+5Zjz5B}bQE?&yPZ5yZT6%A?! z@9UqnCP32Q(@|q4dkC{SM={^?=`ke9luC{ila+Tx|NROg{yB}6iCJniVc7!x2@R?C z67|-#^*w>1;^h+*;nkBfsT-ZD1>e^m1VKE`b6qZ~dMl}VrEGUciyAr>G<#I^sHgWt7AQIsod3shBcT!*y zB&Nz4+btLmG6`&kTtzm@s__%QiQFWlCh&%@pct#mq@G%-;9R>ZpbNSPp2-IbF!~*K zkTyM*xGZ!T)hgrjso2S1(^K_)c_xbkCUdDAioTdGwoFxUf?BFmQm*}{Hdk{V zE@5!0Unt+_?6fZPfs-IY4xfEs!Pzm&M(-Q${Qle%G#TmrUsmz0ky&Va{=0%%BJhF{ zpSAAU=11MAQ}GXm@C!nEe!T47=L{nQ=r^l-53{DfVk?T|q^t<*0MPIQ^x*fN86YvE zKM2g45|^MDH)}ycY3eEce` zJ8z9uQs{;g+xQXNN050^$eK(|?GyP~UgPh*59QeH4vj*G$lEfe5Aky$W;17~Yz($m z%VbCv2_-Ld;$QcG^V8oX{iRviV0r8#Iv0zqebVDEC*~jp_$FbL5+* z*yB>>GRiB|=YmC@5>}{i^rJl{A-_SKs5reR9&|!WGSS^^7*IC&)#r4z9yV?RfU{ zJ2)_r!i9Ipyc@e(eWmvRe5xcH-hc&+ij0rNXP>6#XJU$V*PYmT_18j|r(xhzHZC|Q zX5L-;#-99OeV71!Xsb-zI*=yKV1y~JR`m;|YFXLRKs8Ovj27kionJ@eO0YYd$!{xh z1ySn!kk%mw0057S@SuW74?vQ~gsf?(*Z|<;?ucfVkAjmZS1ovzSBF5?%UHWS%=?4- z;o{rg!lWb{=M9_3o)e)LBV*~`P&m?}aWzMkeDF)&?vH3c-yyo08C+#sQeV#!5K-#< z%Vage7>;Z5y{_Z8X`B1S8ZY{U?i2MtEmJaP)G_}wl#kufxOD{(Gf$e4_{fN2g86XM zw=QCC$!O51s*BGqyxzSrIwlW$);0q}1v}ZPfK)_JC#1#3D5I+>W;c!*7?2<(WWbVH$BULW~vJ0}YCa4eXaUrUy3 zL4*H{Xu2vio4{N<=R(QyG;Yv90K7jA1^MJ>mkb5W=l>=-fcH7&zS*&R;E-(yWmja7 zgVb)fwT;d-?xroh`O~1(J*Tn4w^y1iN$P+4m<|WlZ&0xDaR(oti7gJX?3Iu-5K%8+ zVwhhh&5O6k^Y%~!7P9Q`>Tv$PU}K-43W#P6qG#L>3`6eTPRP(pFJar$mz_;jn0P^) zvg!r{P~f&H@~eCK{h;QtHgLduyVNGu_y^MA3+JYF$nh6dE?7EylnX#XGYbF}Sv8E9>(wDBxMGbZA{`lwyMnJHSI9p(rf_a!d{bi#Hn6optlQ5+ z{e8*6_UvT5A62vjMZsBZlATf3Z}|3q-QEJ|-U%O&fPF+0t14j^tQM08fCjLTE@#qO zFq{HzgbuT6ze&&^jh4|<+e#Z}@BCLgor}hw zEPHY@kVu%9e$}p-*RC;r-v!OGP(G`N`Tm+31?y{z@tJpBK|B2?PS=t_`_)A=^O4}E zOvu*6EGLf(6P%!wy#0h8qBzx*BX6>gJWHmmhcNe3ejE?1d{NC1Q}z7wMo*BmIK-pktAr zJpzU;UN#r~3<*{I!6&9E5Wsk#`NxGg{Xa}6x`Bfc5B<%TY86-9^^rV6OllL7jGC%y=)b4Pm&zpz9 zGNGD)YLkTd4@FK(39GHNeVctgou@Mo+Wo`mhnn(Td=WNNG+611{yJuYh3K+zLk0Y2 zY&H6%dgzfkqF(_k8UlIIN>G@?S0fYVlQ<9aBdG`?V=Oc4s^t&Cn57BK(#5QlS>laIsJ9tfu&Rn3b&w_x(#@sP*6W zS8Q3J1**A;ZA6a1%zz$aIyHI<8=H%|i)(dFZK`=N7T^BM^|UT>BlMOc*aAd$Nm!7$ zD?{l6NauVIcd>%KrzYdJ)P0IbonWbpnpvJp3ZUg@n?p3+2kwEVI$B*1ZXT~B`AtpVf*_DlfO>CWFu3YJDwQ^jkuzY zqu&?k*%DR^Sn)Bjg|krWu%)_1>@lz|`Eb~Qczxd8bVccx3CPvU4G&0mLCuKReO-PcO3@6B~t%RHuxj6pQ4yVjNZ|9vKi5JUXxiMufe(}Jea#Tui4n!=L7X>YAT zF00`b0C6-3g&j?+>xKsDg5zZN-^)dtG*A~;29yYshVTL$SX_Zn}5 zqpo*t+YO89Zh=ai%sZz3+)nuR`)<{t8--TP6p9aid)@h5eZ^LMli`?tKN4}WZuP37 zjdS_sOoo#sYwX~OvM5WoAQua3q5ct1O}&#Yqo?jF+C)azD0M!#KRgnpR!CoFh8i$@ zH28-pZK4ntu=ea3aLkeseBx(%Dm1l~6Nk^b_wyIA|1}HS@3$@}6Qf-gNHp<@#tS|0 z2i5}-BtBLNFZ?npTVK?qu>RP=XLN})Dsig_fvQg|yt7hw;BW{XTuZeI%sWucB5RiZ+aAE_};B7-a!roZtc~haCO$!^)WvUs7s1tq)x}32s8-PZ>#niv| z&3twBXW7WdCO#KsdS;oMuK5#gdVTxD)Wp}V8(I4I7uR1Rl;cgj0if1DJVXW92;7+- z5$rpU+Xq!zK6qgH-N|m#f$ybQO*-^8JXJPy)TNBOR5GDcPe~;pkZ4p1i>*%EP`VYP zurvi#Q-5#_v)P>@1!SP>8G&B?XzM^#3tEs9==}B6koA162Wa=@WZ5vHX6$b>EMxHu zYdh4(t1#axze-Sd@9?BXf)@P7iak>|S^INWyJ8M4k8!Q!D_3*!fTok~ou4C9pi-l{ zUcPKwkr)`8u!z>zlJWBwPB5Cqh-He%P(d40cBp2W1&GUv6p?8!Av?L@`wlb2s!yE@ z&12;4tb60MZnD`K|CCld;ds15`;>Xs_$Y+JsI%lZd&BeGs*3svnj zZwq^0a@NFh{TJIPJF&!C*#BxOooo+(h3QiuWvQiet6jd;rDUtNd~mg>ebqtj&h- zE?^%p_-6sie(UwMI+o{;Lt%_|`Y@=e^wr$(C^~JVrr|X=Xe)_Ke!n%0Zo@>uB z-ke4z{4Ii-vD%8bwW!V?C59|@``I0ER)Tm?Qxc)@0SzG`?ENvre#e8h0R7$HJB7XptSi;^ zrdcMXs<(bM^Uc68K>Vy{vzw3!_zh&YuUU6_Z_RN+!iwoHu9tc9{Iz zMV^TN0UQe;od~DnJddl2ktE{C;Ke2&W9qkWd54h-5P@{!#=po}C&c$*vBS_n;Fvp` zcQ4Xt38r9u*pU!D-sOG0EUUV8A z;Y90jhm7d(v56!DUP~WVm=)E_oF2g-4C&BQM4Kr@v}Xn6xUhfiX2Kpir=$jPe%NYY zd8}~swPs6DUClcdgJdu$dwJ-=e8;D>{O^7_*vfUncaS*H^)aBjAfcpTObc z({Ntuw;e+ohdLFddR2I__UivaDZm;t7z*ih{P;*2tjmA3xX?-_OyPB(#F4<6n5Ob_ zCnrRbNHhG|lZH?!u^LpV`ATP)iJSpjh9TErBqN*oJwe3~AZhP_)s8cUupJjytpb$j zVF6ouB}lyDyW>x_-Bw`U`9!KNP0YYJ(Nf(5Y9)8lpVvYa(s;=Y~A-EiMgLFh{DC`4cl1t{w7dNV%&ma>JrZqH@ssV0=mPQi4kC z|DBd{sEfwE#UdQH)=7=oahXPMUQaQsGVycswbUa*Oa@7M;yrF5{ zZ61amFlv&XGysBON0Cci)8S&bq0AGTud@h`)tFT}Qv-x?_Da`t&{vB*Eg4XgZSwsx&V(iGPOt)B4PAX_1yA5@rSz&4tx5zPb&phy0PQU+v)X zy>r`^QeWrAOzN81aFTs4YqRD~O$G~F`6>1e##LsE1=j=KY`dT$E+)st(Lax7 zp*@t9NWM&CY|CBlK`~xCnG#*9lYcOR^ykY%l@T%tOSEQ}5>a+`0JN56FK;`7T`SFu zwDc--I2*MOLjwxFkl{3{-#KAr0d(KV@}8TJdTBN$V7rY`R{NT_+@bdR{cYq$7l*1x z96CCTy>^52tnC&^D3C`TfO1Fyh@8+Zyytd}lrS|WpIG#A|GtH^@^^pHvJ1!;5M+8r&=j&u~k z=hhQS8`X?$3NQxf-E<&mb$%K*IR@iCbqbLF*DSW_@oh<q9cd$Q5Z@Rm77oos=KCZiD`zq~Evf)0t$;QT9`OF8$$TfR==0Luu=4Qe zyV#wNpvW3_Ot}={yDMcdw|H6U0@{lVaE4Ai{IBw?FAnxg`3ep#9I|uC3Q=Uu>M!~# z9L&Oks#dZDva1x?LQ@G>{ zV|G=qLE9F_<$GWC_U(`eLBvaX0XBtaxKjFN(ShnTQn*?UEU*gT#@MveK~L;yT=-}J zcIR_ea(JrTSpG|av~oIh&*>DtT8U;ac^7L^m(Q7tBR2V_#g(OCx|^@MHm zso<$U5kFPNHoB3T_p?({sv>d@lTXJzi7`j}{ce|_kOA&hY{Vp0{A?<@)Oe^Qyyy>g zaaKn6czpJsP&qXG5Y&TUt+&=2cSaN-_$115qRv86x&LtSd9OAec=ap=$$oF1I7MiseE=Ea zXk(x94C58okr7y`A;n;WnCs}H2sRni#TbxZwyIj3f4CpPZbb*xh6OF;^3`PfH|pFg zJYjIBLf5_X$k+@g2M)Zc-RtY|ReFBRTs%;xgB|`-ux$bD=A0ZnB+k8NXPFMoOG^#A z0G@qdQ7g3W+)K#l(FmjW?_>cZH9==>%nCWlT#RTx&&*qIypJaE)x)h7IOstc%oQAm z9(i{Gzj6}>td65t5_1@#DUn0v+gGJcKz#EkUeO#Jr3rTodbQ2wqNc%du8rRNh%uZ8 zdM3f8O8oe`Ez10}vubgnc8XA3U&3GE*FYmPlQXa6N?$w9u3rZf@}lk9v*eyJ^>&rW zDp7k*BWX-O@_XB+JqR*3_r*c>_s%*?>JftCwx4N#{NIA^n5%M0UjWO>Z&_C)PZ8+e z408_IP#~>Ri=RDo{eDSU%v^%5$~FTFcB+5rsE9@((x-nHBT9`@dE=YnFzswvJxBG* zUs*C$L8U4e0^M@(Y0aq`C0#!D7HqP4_*RQj;<+buk;je-u6Z9OI?(%8jd$)HfwKS3 zKV;gF8aI|UxAIn|^$p4VRwu-TgZah0@E1a?IR{=Z0+cLEi+(m%ed|Qfn?3y*je-Qi z!sO&H$nHGVGZ*CvsEck(mredi39zf{wB?N82#=NjHBPc}IrZic!iiEsS$(9G6q%4N zH=_O`qgafARY&~aNNqJD%nU(0Y9;@VpvHfwr%7^{Ee6cU@2IpH^Iw(b!6&)gxTTZ3 z^KcJ5Fenrq)n77$Enk1~HP-lzb{YeDPAbVJIm0F-8O4vQ{O!`gHF)W_LMWSbG6y0( zyUPa}3C9=!xR8@GZM}c7x|}8Xx$7N(ToRizD)-8r!V~@^oH^RlZ?)iy*VnhzDp}8V zb~1qFOoJUsAwvh=D2O`!9NO};fW*W&Icp?D

    =W-1bxx_CAG|8Bg6K5CBKZT@p@O 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 sHiVdD|5`6z#r+%DR*L3Jeqx-sxaH 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 z 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%0A@iOfC#m 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�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ţ+`OokZJk_ZZAVlsR5W8d; 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%0DDHlL6!_XFNJu?7l+U=5*qJr8 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

    iqM4r_VU3*PMpkVq( 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

    -ItBz$3)mkAZdfHe!$gWI=$JcPzd+ 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 0 + + def test_load_collection(self, create_source, loader): + resource_paths = ["sentences.wav", "sentences2.wav"] + sources = [create_source(resource_path) for resource_path in resource_paths] + + collection = loader.load_collection(sources) + + assert len(collection) == len(resource_paths) + + keys = {loader.to_key(source) for source in sources} + for key in collection.keys(): + artifact = collection[key] + assert isinstance(artifact, AudioArtifact) + assert artifact.name.endswith(".wav") + assert artifact.mime_type == "audio/wav" + assert len(artifact.value) > 0 diff --git a/tests/unit/tasks/test_audio_transcription_task.py b/tests/unit/tasks/test_audio_transcription_task.py new file mode 100644 index 000000000..fdab5f730 --- /dev/null +++ b/tests/unit/tasks/test_audio_transcription_task.py @@ -0,0 +1,38 @@ +from unittest.mock import Mock + +import pytest + +from griptape.artifacts import AudioArtifact +from griptape.engines import AudioTranscriptionEngine +from griptape.structures import Agent +from griptape.tasks import BaseTask, AudioTranscriptionTask +from tests.mocks.mock_structure_config import MockStructureConfig + + +class TestAudioTranscriptionTask: + @pytest.fixture + def audio_artifact(self): + return AudioArtifact(value=b"audio data", format="mp3") + + @pytest.fixture + def audio_transcription_engine(self): + return Mock() + + def test_audio_input(self, audio_artifact, audio_transcription_engine): + task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) + + assert task.input.value == audio_artifact.value + + def test_callable_input(self, audio_artifact, audio_transcription_engine): + def callable(task: BaseTask) -> AudioArtifact: + return audio_artifact + + task = AudioTranscriptionTask(callable, audio_transcription_engine=audio_transcription_engine) + + assert task.input == audio_artifact + + def test_config_audio_transcription_engine(self, audio_artifact): + task = AudioTranscriptionTask(audio_artifact) + Agent(config=MockStructureConfig()).add_task(task) + + assert isinstance(task.audio_transcription_engine, AudioTranscriptionEngine) diff --git a/tests/unit/tools/test_transcription_client.py b/tests/unit/tools/test_transcription_client.py new file mode 100644 index 000000000..ea6bd3453 --- /dev/null +++ b/tests/unit/tools/test_transcription_client.py @@ -0,0 +1,47 @@ +from unittest.mock import Mock, mock_open, patch + +import pytest + +from griptape.artifacts import AudioArtifact +from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient + + +class TestTranscriptionClient: + @pytest.fixture + def transcription_engine(self) -> Mock: + return Mock() + + @pytest.fixture + def audio_loader(self) -> Mock: + loader = Mock() + loader.load.return_value = AudioArtifact(value=b"audio data", format="wav") + + return loader + + def test_init_transcription_client(self, transcription_engine, audio_loader) -> None: + assert AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + + @patch("builtins.open", mock_open(read_data=b"audio data")) + def test_transcribe_audio_from_disk(self, transcription_engine, audio_loader) -> None: + client = AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + client.engine.run.return_value = Mock(value="transcription") # pyright: ignore + + text_artifact = client.transcribe_audio_from_disk(params={"values": {"path": "audio.wav"}}) + + assert text_artifact + assert text_artifact.value == "transcription" + + def test_transcribe_audio_from_memory(self, transcription_engine, audio_loader) -> None: + client = AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) + memory = Mock() + memory.load_artifacts = Mock(return_value=[AudioArtifact(value=b"audio data", format="wav", name="name")]) + client.find_input_memory = Mock(return_value=memory) + + client.engine.run.return_value = Mock(value="transcription") # pyright: ignore + + text_artifact = client.transcribe_audio_from_memory( + params={"values": {"memory_name": "memory", "artifact_namespace": "namespace", "artifact_name": "name"}} + ) + + assert text_artifact + assert text_artifact.value == "transcription" From 1b1accc5ded4a11c7cf335dc8028bf68db6f952b Mon Sep 17 00:00:00 2001 From: Kyle Roche Date: Tue, 4 Jun 2024 09:59:22 -0700 Subject: [PATCH 069/238] Feature/pusher event driver (#821) Co-authored-by: Collin Dutter --- .github/workflows/docs-integration-tests.yml | 4 + CHANGELOG.md | 1 + .../drivers/event-listener-drivers.md | 35 +++++++++ griptape/drivers/__init__.py | 2 + .../pusher_event_listener_driver.py | 39 ++++++++++ poetry.lock | 73 ++++++++++++++++++- pyproject.toml | 3 + .../test_pusher_event_listener_driver.py | 42 +++++++++++ 8 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 griptape/drivers/event_listener/pusher_event_listener_driver.py create mode 100644 tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index eb3621870..a87810774 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -112,6 +112,10 @@ jobs: AWS_IOT_CORE_ENDPOINT: ${{ secrets.INTEG_AWS_IOT_CORE_ENDPOINT }} AWS_IOT_CORE_TOPIC: ${{ secrets.INTEG_AWS_IOT_CORE_TOPIC }} ELEVEN_LABS_API_KEY: ${{ secrets.INTEG_ELEVEN_LABS_API_KEY }} + PUSHER_APP_ID: ${{ secrets.INTEG_PUSHER_APP_ID }} + PUSHER_KEY: ${{ secrets.INTEG_PUSHER_KEY }} + PUSHER_SECRET: ${{ secrets.INTEG_PUSHER_SECRET }} + PUSHER_CLUSTER: ${{ secretes.INTEG_PUSHER_CLUSTER }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index cf0d8ed36..62a9f49ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AudioTranscriptionTask` and `AudioTranscriptionClient` for transcribing audio content in Structures. - `OpenAiAudioTranscriptionDriver` for integration with OpenAI's speech-to-text models, including Whisper. - Parameter `env` to `BaseStructureRunDriver` to set environment variables for a Structure Run. +- `PusherEventListenerDriver` to enable sending of framework events over a Pusher WebSocket. ### Changed - **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index d35489f98..6e8f59b22 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -212,4 +212,39 @@ agent = Agent( agent.run("Analyze the pros and cons of remote work vs. office work") ``` +### Pusher Event Listener Driver +!!! info + This driver requires the `drivers-event-listener-pusher` [extra](../index.md#extras). + +The [PusherEventListenerDriver](../../reference/griptape/drivers/event_listener/pusher_event_listener_driver.md) sends Events to [Pusher](https://pusher.com). + +```python +import os +from griptape.drivers import PusherEventListenerDriver +from griptape.events import ( + EventListener, + FinishStructureRunEvent +) +from griptape.structures import Agent + +agent = Agent( + event_listeners=[ + EventListener( + event_types=[FinishStructureRunEvent], + driver=PusherEventListenerDriver( + batched=False, + app_id=os.environ["PUSHER_APP_ID"], + key=os.environ["PUSHER_KEY"], + secret=os.environ["PUSHER_SECRET"], + cluster=os.environ["PUSHER_CLUSTER"], + channel='my-channel', + event_name='my-event' + ), + ), + ], +) + +agent.run("Analyze the pros and cons of remote work vs. office work") + +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 6c64756e1..f44602f8b 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -93,6 +93,7 @@ from .event_listener.webhook_event_listener_driver import WebhookEventListenerDriver from .event_listener.aws_iot_core_event_listener_driver import AwsIotCoreEventListenerDriver from .event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver +from .event_listener.pusher_event_listener_driver import PusherEventListenerDriver from .file_manager.base_file_manager_driver import BaseFileManagerDriver from .file_manager.local_file_manager_driver import LocalFileManagerDriver @@ -193,6 +194,7 @@ "WebhookEventListenerDriver", "AwsIotCoreEventListenerDriver", "GriptapeCloudEventListenerDriver", + "PusherEventListenerDriver", "BaseFileManagerDriver", "LocalFileManagerDriver", "AmazonS3FileManagerDriver", diff --git a/griptape/drivers/event_listener/pusher_event_listener_driver.py b/griptape/drivers/event_listener/pusher_event_listener_driver.py new file mode 100644 index 000000000..d41b679d7 --- /dev/null +++ b/griptape/drivers/event_listener/pusher_event_listener_driver.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from attrs import define, field, Factory +from griptape.drivers import BaseEventListenerDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from pusher import Pusher + + +@define +class PusherEventListenerDriver(BaseEventListenerDriver): + app_id: str = field(kw_only=True) + key: str = field(kw_only=True) + secret: str = field(kw_only=True) + cluster: str = field(kw_only=True) + channel: str = field(kw_only=True) + event_name: str = field(kw_only=True) + pusher_client: Pusher = field( + default=Factory( + lambda self: import_optional_dependency("pusher").Pusher( + app_id=self.app_id, key=self.key, secret=self.secret, cluster=self.cluster, ssl=True + ), + takes_self=True, + ), + kw_only=True, + ) + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + data = [ + {"channel": self.channel, "name": self.event_name, "data": event_payload} + for event_payload in event_payload_batch + ] + + self.pusher_client.trigger_batch(data) + + def try_publish_event_payload(self, event_payload: dict) -> None: + self.pusher_client.trigger(channels=self.channel, event_name=self.event_name, data=event_payload) diff --git a/poetry.lock b/poetry.lock index 7e6804fcc..7d78e319e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -2974,6 +2974,22 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} +[[package]] +name = "ndg-httpsclient" +version = "0.5.1" +description = "Provides enhanced HTTPS support for httplib and urllib2 using PyOpenSSL" +optional = true +python-versions = ">=2.7,<3.0.dev0 || >=3.4.dev0" +files = [ + {file = "ndg_httpsclient-0.5.1-py2-none-any.whl", hash = "sha256:d2c7225f6a1c6cf698af4ebc962da70178a99bcde24ee6d1961c4f3338130d57"}, + {file = "ndg_httpsclient-0.5.1-py3-none-any.whl", hash = "sha256:dd174c11d971b6244a891f7be2b32ca9853d3797a72edb34fa5d7b07d8fff7d4"}, + {file = "ndg_httpsclient-0.5.1.tar.gz", hash = "sha256:d72faed0376ab039736c2ba12e30695e2788c4aa569c9c3e3d72131de2592210"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.1" +PyOpenSSL = "*" + [[package]] name = "networkx" version = "3.2.1" @@ -3747,6 +3763,30 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "pusher" +version = "3.3.2" +description = "A Python library to interract with the Pusher Channels API" +optional = true +python-versions = "*" +files = [ + {file = "pusher-3.3.2-py2.py3-none-any.whl", hash = "sha256:4ae2d2dc77eb28043da042796992b8b41454f458c4d8c8e151f7498f2c4374c7"}, + {file = "pusher-3.3.2.tar.gz", hash = "sha256:14f412c8e26562aaf663a114951792fefae01f0d220dac84971f926404620760"}, +] + +[package.dependencies] +ndg-httpsclient = "*" +pyasn1 = "*" +pynacl = "*" +pyopenssl = "*" +requests = ">=2.3.0" +six = "*" +urllib3 = "*" + +[package.extras] +aiohttp = ["aiohttp (>=0.20.0)"] +tornado = ["tornado (>=5.0.0)"] + [[package]] name = "py-partiql-parser" version = "0.5.0" @@ -3996,6 +4036,32 @@ snappy = ["python-snappy"] test = ["pytest (>=7)"] zstd = ["zstandard"] +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = true +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + [[package]] name = "pyopenssl" version = "24.1.0" @@ -5995,7 +6061,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-google = ["google-generativeai"] @@ -6003,6 +6069,7 @@ drivers-embedding-huggingface = ["huggingface-hub", "transformers"] drivers-embedding-voyageai = ["voyageai"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-amazon-sqs = ["boto3"] +drivers-event-listener-pusher = ["pusher"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] drivers-prompt-amazon-bedrock = ["anthropic", "boto3"] @@ -6033,4 +6100,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "da89e6bb7aa395fd5badc416ec859e574416ea1fe07ee6f93035fe6a7e314dcd" +content-hash = "b035e9419f6dbc25ee6663b81c49730946b9990641e14aa656080915cb4735b2" diff --git a/pyproject.toml b/pyproject.toml index 55ae82ce2..f9b4d1ba7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} torch = {version = "^2.3.0", optional = true} +pusher = {version = "^3.3.2", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -96,6 +97,7 @@ drivers-web-scraper-markdownify = ["playwright", "beautifulsoup4", "markdownify" drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-amazon-iot = ["boto3"] +drivers-event-listener-pusher = ["pusher"] loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] @@ -128,6 +130,7 @@ all = [ "voyageai", "elevenlabs", "torch", + "pusher", # loaders "pandas", diff --git a/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py b/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py new file mode 100644 index 000000000..6f0636b5c --- /dev/null +++ b/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py @@ -0,0 +1,42 @@ +from pytest import fixture +from tests.mocks.mock_event import MockEvent +from griptape.drivers import PusherEventListenerDriver +from unittest.mock import Mock + + +class TestPusherEventListenerDriver: + @fixture(autouse=True) + def mock_post(self, mocker): + mock_pusher_client = mocker.patch("pusher.Pusher") + mock_pusher_client.return_value.trigger.return_value = Mock() + mock_pusher_client.return_value.trigger_batch.return_value = Mock() + + return mock_pusher_client + + @fixture() + def driver(self): + return PusherEventListenerDriver( + app_id="test-app-id", + key="test-key", + secret="test-secret", + cluster="test-cluster", + channel="test-channel", + event_name="test-event", + ) + + def test_init(self, driver): + assert driver + + def test_try_publish_event_payload(self, driver): + data = MockEvent().to_dict() + driver.try_publish_event_payload(data) + + driver.pusher_client.trigger.assert_called_with(channels="test-channel", event_name="test-event", data=data) + + def test_try_publish_event_payload_batch(self, driver): + data = [MockEvent().to_dict() for _ in range(3)] + driver.try_publish_event_payload_batch(data) + + driver.pusher_client.trigger_batch.assert_called_with( + [{"channel": "test-channel", "name": "test-event", "data": data[i]} for i in range(3)] + ) From c6cceda255f58522edf6f1f1be9102c9d2fa2a4c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 4 Jun 2024 10:27:52 -0700 Subject: [PATCH 070/238] Fix computer tool (#820) --- poetry.lock | 31 ++++++++----------------------- pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7d78e319e..cf8fde4ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1200,24 +1200,25 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "docker" -version = "6.1.3" +version = "7.1.0" description = "A Python library for the Docker Engine API." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, - {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, + {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, + {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, ] [package.dependencies] -packaging = ">=14.0" pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} requests = ">=2.26.0" urllib3 = ">=1.26.0" -websocket-client = ">=0.32.0" [package.extras] +dev = ["coverage (==7.2.7)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.1.0)", "ruff (==0.1.8)"] +docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] ssh = ["paramiko (>=2.4.3)"] +websockets = ["websocket-client (>=1.3.0)"] [[package]] name = "docutils" @@ -5817,22 +5818,6 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - [[package]] name = "websockets" version = "12.0" @@ -6100,4 +6085,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "b035e9419f6dbc25ee6663b81c49730946b9990641e14aa656080915cb4735b2" +content-hash = "4e98cb17a098a86dc3c109bad3cb8b5299e333d20e7c12903a7fe9472b7a3d31" diff --git a/pyproject.toml b/pyproject.toml index f9b4d1ba7..66b408f6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ pyyaml = ">=6" tenacity = ">=8.0" numpy = ">=1" stringcase = "^1.2.0" -docker = "^6.1.3" +docker = "^7.1.0" sqlalchemy = "~=1.0" dateparser = "^1.1.8" requests = "^2" From 7fe0f7d8691beef7841a857cbb6839397001e082 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 4 Jun 2024 10:55:30 -0700 Subject: [PATCH 071/238] Don't exlude extra fields (#825) --- CHANGELOG.md | 3 +++ griptape/schemas/base_schema.py | 4 ++-- tests/unit/schemas/test_base_schema.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62a9f49ff..15e0fb9c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Default standard OpenAI and Azure OpenAI image query model to `gpt-4o`. - Error message to be more helpful when importing optional dependencies. +### Fixed +- Extra fields being excluded when using `SerializableMixin.from_dict`. + ## [0.25.1] - 2024-05-15 ### Fixed diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 82bc072fb..79ae5e51f 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -5,14 +5,14 @@ from collections.abc import Sequence import attrs -from marshmallow import Schema, fields, EXCLUDE +from marshmallow import Schema, fields, INCLUDE from griptape.schemas.bytes_field import Bytes class BaseSchema(Schema): class Meta: - unknown = EXCLUDE + unknown = INCLUDE DATACLASS_TYPE_MAPPING = {**Schema.TYPE_MAPPING, dict: fields.Dict, bytes: Bytes} diff --git a/tests/unit/schemas/test_base_schema.py b/tests/unit/schemas/test_base_schema.py index 947d69c24..fcbd08c7f 100644 --- a/tests/unit/schemas/test_base_schema.py +++ b/tests/unit/schemas/test_base_schema.py @@ -81,5 +81,5 @@ def test_load(self): def test_load_with_unknown_attribute(self): schema = BaseSchema.from_attrs_cls(MockSerializable)() - mock_serializable = schema.load({"foo": "baz", "bar": "qux", "baz": [1, 2, 3], "zoop": "bop"}) - assert hasattr(mock_serializable, "zoop") is False + with pytest.raises(TypeError): + schema.load({"foo": "baz", "bar": "qux", "baz": [1, 2, 3], "zoop": "bop"}) From dc9e58592d0a7f2a3ab17a7861e353110a6f7924 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:28:01 -0700 Subject: [PATCH 072/238] Add support for Llama 3 on Amazon SageMaker (#800) --- .github/workflows/docs-integration-tests.yml | 4 +- CHANGELOG.md | 3 ++ .../drivers/prompt-drivers.md | 23 ++++++++-- .../prompt/amazon_sagemaker_prompt_driver.py | 5 ++- .../prompt_model/base_prompt_model_driver.py | 2 +- .../bedrock_claude_prompt_model_driver.py | 2 +- .../bedrock_jurassic_prompt_model_driver.py | 2 +- .../bedrock_llama_prompt_model_driver.py | 4 +- .../bedrock_titan_prompt_model_driver.py | 2 +- .../sagemaker_falcon_prompt_model_driver.py | 2 +- .../sagemaker_llama_prompt_model_driver.py | 28 +++++++----- .../test_amazon_sagemaker_prompt_driver.py | 26 ++++++----- ...st_sagemaker_falcon_prompt_model_driver.py | 2 +- ...est_sagemaker_llama_prompt_model_driver.py | 44 ++++++++++++++----- 14 files changed, 103 insertions(+), 46 deletions(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index a87810774..ef2c96123 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -77,8 +77,10 @@ jobs: GRIPTAPE_CLOUD_BASE_URL: ${{ secrets.INTEG_GRIPTAPE_CLOUD_BASE_URL }} OPENWEATHER_API_KEY: ${{ secrets.INTEG_OPENWEATHER_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.INTEG_ANTHROPIC_API_KEY }} - SAGEMAKER_LLAMA_ENDPOINT_NAME: ${{ secrets.INTEG_LLAMA_ENDPOINT_NAME }} + SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME: ${{ secrets.SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME }} + SAGEMAKER_LLAMA_3_INSTRUCT_INFERENCE_COMPONENT_NAME: ${{ secrets.SAGEMAKER_LLAMA_3_INSTRUCT_INFERENCE_COMPONENT_NAME }} SAGEMAKER_FALCON_ENDPOINT_NAME: ${{ secrets.INTEG_FALCON_ENDPOINT_NAME }} + SAGEMAKER_FALCON_INFERENCE_COMPONENT_NAME: ${{ secrets.INTEG_FALCON_INFERENCE_COMPONENT_NAME }} HUGGINGFACE_HUB_ACCESS_TOKEN: ${{ secrets.INTEG_HUGGINGFACE_HUB_ACCESS_TOKEN }} AZURE_OPENAI_ENDPOINT_1: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_1 }} AZURE_OPENAI_API_KEY_1: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_1 }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 15e0fb9c7..3f12a4edb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Field `azure_ad_token` on all Azure Drivers is no longer serializable. - Default standard OpenAI and Azure OpenAI image query model to `gpt-4o`. - Error message to be more helpful when importing optional dependencies. +- **BREAKING**: `AmazonSageMakerPromptDriver.model` parameter, which gets passed to `SageMakerRuntime.Client.invoke_endpoint` as `EndpointName`, is now renamed to `AmazonSageMakerPromptDriver.endpoint`. +- **BREAKING** `AmazonSageMakerPromptDriver.model` parameter is now optional being passed to `SageMakerRuntime.Client.invoke_endpoint` as `InferenceComponentName` (instead of `EndpointName`). +- **BREAKING** `SageMakerLlamaPromptModelDriver` modified to exclusively support the Llama 3 Instruct model deployed via SageMaker JumpStart. (Support for Llama 2 models has been removed.) ### Fixed - Extra fields being excluded when using `SerializableMixin.from_dict`. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index bf8814330..1006f215f 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -401,7 +401,22 @@ through the [prompt_model_driver](../../reference/griptape/drivers/prompt/base_m The [AmazonSageMakerPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.md) uses [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) for inference on AWS. -##### LLaMA +!!! info + For single model endpoints, the `model` parameter does not need to be specified. + For multi-model endpoints, the `model` parameter should be the inference component name. + +!!! warning + Make sure that the selected prompt model driver is compatible with the selected model. Note that even the same + logical model can require different prompt model drivers depending on how it is bundled in the endpoint. For + example, the reponse format are different for `Meta-Llama-3-8B-Instruct` when deployed via + "Amazon SageMaker JumpStart" and "Hugging Face on Amazon SageMaker". + +##### Llama + +!!! info + `SageMakerLlamaPromptModelDriver` requires a tokenizer corresponding to a [Gated Model](https://huggingface.co/docs/hub/en/models-gated) on Hugging Face. + + Make sure to request access to the [Meta-Llama-3-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) model on Hugging Face and configure your environment for hugging face use. ```python title="PYTEST_IGNORE" import os @@ -416,7 +431,8 @@ from griptape.config import StructureConfig agent = Agent( config=StructureConfig( prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], + endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], + model=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_INFERENCE_COMPONENT_NAME"], prompt_model_driver=SageMakerLlamaPromptModelDriver(), temperature=0.75, ) @@ -446,7 +462,8 @@ from griptape.config import StructureConfig agent = Agent( config=StructureConfig( prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], + endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], + model=os.environ["SAGEMAKER_FALCON_INFERENCE_COMPONENT_NAME"], prompt_model_driver=SageMakerFalconPromptModelDriver(), ) ) diff --git a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py index 342faf909..2934ea642 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py @@ -18,6 +18,8 @@ class AmazonSageMakerPromptDriver(BaseMultiModelPromptDriver): sagemaker_client: Any = field( default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True ) + endpoint: str = field(kw_only=True, metadata={"serializable": True}) + model: str = field(default=None, kw_only=True, metadata={"serializable": True}) custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) @@ -32,10 +34,11 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: "parameters": self.prompt_model_driver.prompt_stack_to_model_params(prompt_stack), } response = self.sagemaker_client.invoke_endpoint( - EndpointName=self.model, + EndpointName=self.endpoint, ContentType="application/json", Body=json.dumps(payload), CustomAttributes=self.custom_attributes, + **({"InferenceComponentName": self.model} if self.model is not None else {}), ) decoded_body = json.loads(response["Body"].read().decode("utf8")) diff --git a/griptape/drivers/prompt_model/base_prompt_model_driver.py b/griptape/drivers/prompt_model/base_prompt_model_driver.py index de9b6b6d6..096802370 100644 --- a/griptape/drivers/prompt_model/base_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/base_prompt_model_driver.py @@ -26,4 +26,4 @@ def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str | list | def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: ... @abstractmethod - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: ... + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: ... diff --git a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py index 032940d66..2b4c547a9 100644 --- a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py @@ -65,7 +65,7 @@ def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: **input, } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: if isinstance(output, bytes): body = json.loads(output.decode()) else: diff --git a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py index 3b51eef1c..4da99e88f 100644 --- a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py @@ -68,7 +68,7 @@ def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: "frequencyPenalty": {"scale": 0}, } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: if isinstance(output, bytes): body = json.loads(output.decode()) else: diff --git a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py index 6c6dab1d2..951583c51 100644 --- a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py @@ -89,11 +89,11 @@ def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: "top_p": self.top_p, } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: # When streaming, the response body comes back as bytes. if isinstance(output, bytes): output = output.decode() - elif isinstance(output, list): + elif isinstance(output, list) or isinstance(output, dict): raise Exception("Invalid output format.") body = json.loads(output) diff --git a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py index 00621416a..5f5bbc1d2 100644 --- a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py @@ -67,7 +67,7 @@ def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: } } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: # When streaming, the response body comes back as bytes. if isinstance(output, str) or isinstance(output, bytes): if isinstance(output, bytes): diff --git a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py index a6859f13c..a5a8a4dc9 100644 --- a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py @@ -35,7 +35,7 @@ def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: "stop": stop_sequences, } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: if isinstance(output, list): return TextArtifact(output[0]["generated_text"].strip()) else: diff --git a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py index 7864a70a8..7e934d4a6 100644 --- a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py @@ -8,7 +8,8 @@ @define class SageMakerLlamaPromptModelDriver(BasePromptModelDriver): - DEFAULT_MAX_TOKENS = 600 + # Default context length for all Llama 3 models is 8K as per https://huggingface.co/blog/llama3 + DEFAULT_MAX_INPUT_TOKENS = 8000 _tokenizer: HuggingFaceTokenizer = field(default=None, kw_only=True) @@ -16,26 +17,31 @@ class SageMakerLlamaPromptModelDriver(BasePromptModelDriver): def tokenizer(self) -> HuggingFaceTokenizer: if self._tokenizer is None: self._tokenizer = HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").LlamaTokenizerFast.from_pretrained( - "hf-internal-testing/llama-tokenizer" + tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained( + "meta-llama/Meta-Llama-3-8B-Instruct", model_max_length=self.DEFAULT_MAX_INPUT_TOKENS ), - max_output_tokens=self.max_tokens or self.DEFAULT_MAX_TOKENS, + max_output_tokens=self.max_tokens or self.DEFAULT_MAX_INPUT_TOKENS, ) return self._tokenizer - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> list: - return [[{"role": i.role, "content": i.content} for i in prompt_stack.inputs]] + def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str: + return self.tokenizer.tokenizer.apply_chat_template( # pyright: ignore + [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], + tokenize=False, + add_generation_prompt=True, + ) def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: prompt = self.prompt_driver.prompt_stack_to_string(prompt_stack) - return { "max_new_tokens": self.prompt_driver.max_output_tokens(prompt), "temperature": self.prompt_driver.temperature, + "stop": self.tokenizer.tokenizer.eos_token, } - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: - if isinstance(output, list): - return TextArtifact(output[0]["generation"]["content"].strip()) + def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: + # This output format is specific to the Llama 3 Instruct models when deployed via SageMaker JumpStart. + if isinstance(output, dict): + return TextArtifact(output["generated_text"]) else: - raise ValueError("output must be an instance of 'list'") + raise ValueError("Invalid output format.") diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py index 11dc881ab..c6692e1ba 100644 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py @@ -1,7 +1,8 @@ from botocore.response import StreamingBody from griptape.artifacts import TextArtifact -from griptape.drivers import AmazonSageMakerPromptDriver, SageMakerLlamaPromptModelDriver +from griptape.drivers import AmazonSageMakerPromptDriver, SageMakerFalconPromptModelDriver from griptape.tokenizers import HuggingFaceTokenizer, OpenAiTokenizer +from griptape.utils import PromptStack from io import BytesIO from unittest.mock import Mock import json @@ -22,27 +23,30 @@ def mock_client(self, mocker): return mocker.patch("boto3.Session").return_value.client.return_value def test_init(self): - assert AmazonSageMakerPromptDriver(model="foo", prompt_model_driver=SageMakerLlamaPromptModelDriver()) + assert AmazonSageMakerPromptDriver(endpoint="foo", prompt_model_driver=SageMakerFalconPromptModelDriver()) def test_custom_tokenizer(self): assert isinstance( - AmazonSageMakerPromptDriver(model="foo", prompt_model_driver=SageMakerLlamaPromptModelDriver()).tokenizer, + AmazonSageMakerPromptDriver( + endpoint="foo", prompt_model_driver=SageMakerFalconPromptModelDriver() + ).tokenizer, HuggingFaceTokenizer, ) assert isinstance( AmazonSageMakerPromptDriver( - model="foo", + endpoint="foo", tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), - prompt_model_driver=SageMakerLlamaPromptModelDriver(), + prompt_model_driver=SageMakerFalconPromptModelDriver(), ).tokenizer, OpenAiTokenizer, ) def test_try_run(self, mock_model_driver, mock_client): # Given - driver = AmazonSageMakerPromptDriver(model="model", prompt_model_driver=mock_model_driver) - prompt_stack = "prompt-stack" + driver = AmazonSageMakerPromptDriver(endpoint="model", prompt_model_driver=mock_model_driver) + prompt_stack = PromptStack() + prompt_stack.add_user_input("prompt-stack") response_body = "invoke-endpoint-response-body" mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body(response_body)} @@ -53,7 +57,7 @@ def test_try_run(self, mock_model_driver, mock_client): mock_model_driver.prompt_stack_to_model_input.assert_called_once_with(prompt_stack) mock_model_driver.prompt_stack_to_model_params.assert_called_once_with(prompt_stack) mock_client.invoke_endpoint.assert_called_once_with( - EndpointName=driver.model, + EndpointName=driver.endpoint, ContentType="application/json", Body=json.dumps( { @@ -68,12 +72,14 @@ def test_try_run(self, mock_model_driver, mock_client): def test_try_run_throws_on_empty_response(self, mock_model_driver, mock_client): # Given - driver = AmazonSageMakerPromptDriver(model="model", prompt_model_driver=mock_model_driver) + driver = AmazonSageMakerPromptDriver(endpoint="model", prompt_model_driver=mock_model_driver) mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body("")} + prompt_stack = PromptStack() + prompt_stack.add_user_input("prompt-stack") # When with pytest.raises(Exception) as e: - driver.try_run("prompt-stack") + driver.try_run(prompt_stack) # Then assert e.value.args[0] == "model response is empty" diff --git a/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py index ecc3a5d8c..78d990229 100644 --- a/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py +++ b/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py @@ -8,7 +8,7 @@ class TestSageMakerFalconPromptModelDriver: @pytest.fixture def driver(self): return AmazonSageMakerPromptDriver( - model="foo", + endpoint="endpoint-name", session=boto3.Session(region_name="us-east-1"), prompt_model_driver=SageMakerFalconPromptModelDriver(), temperature=0.12345, diff --git a/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py index a06b34966..b39ce458e 100644 --- a/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py +++ b/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py @@ -5,10 +5,27 @@ class TestSageMakerLlamaPromptModelDriver: + @pytest.fixture(autouse=True) + def llama3_instruct_tokenizer(self, mocker): + tokenizer = mocker.patch("transformers.AutoTokenizer").return_value + tokenizer.model_max_length = 8000 + + return tokenizer + + @pytest.fixture(autouse=True) + def hugging_face_tokenizer(self, mocker, llama3_instruct_tokenizer): + tokenizer = mocker.patch( + "griptape.drivers.prompt_model.sagemaker_llama_prompt_model_driver.HuggingFaceTokenizer" + ).return_value + tokenizer.count_output_tokens_left.return_value = 7991 + tokenizer.tokenizer = llama3_instruct_tokenizer + return tokenizer + @pytest.fixture def driver(self): return AmazonSageMakerPromptDriver( - model="foo", + endpoint="endpoint-name", + model="inference-component-name", session=boto3.Session(region_name="us-east-1"), prompt_model_driver=SageMakerLlamaPromptModelDriver(), temperature=0.12345, @@ -26,22 +43,25 @@ def stack(self): def test_init(self, driver): assert driver.prompt_driver is not None - def test_prompt_stack_to_model_input(self, driver, stack): - model_input = driver.prompt_stack_to_model_input(stack) + def test_prompt_stack_to_model_input(self, driver, stack, hugging_face_tokenizer): + driver.prompt_stack_to_model_input(stack) - assert isinstance(model_input, list) - assert len(model_input[0]) == 2 - assert model_input[0][0]["role"] == "system" - assert model_input[0][0]["content"] == "foo" - assert model_input[0][1]["role"] == "user" - assert model_input[0][1]["content"] == "bar" + hugging_face_tokenizer.tokenizer.apply_chat_template.assert_called_once_with( + [{"role": "system", "content": "foo"}, {"role": "user", "content": "bar"}], + tokenize=False, + add_generation_prompt=True, + ) def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["max_new_tokens"] == 588 + assert driver.prompt_stack_to_model_params(stack)["max_new_tokens"] == 7991 assert driver.prompt_stack_to_model_params(stack)["temperature"] == 0.12345 def test_process_output(self, driver, stack): - assert driver.process_output([{"generation": {"content": "foobar"}}]).value == "foobar" + assert driver.process_output({"generated_text": "foobar"}).value == "foobar" + + def test_process_output_invalid_format(self, driver, stack): + with pytest.raises(ValueError): + assert driver.process_output([{"generated_text": "foobar"}]) def test_tokenizer_max_model_length(self, driver): - assert driver.tokenizer.tokenizer.model_max_length == 2048 + assert driver.tokenizer.tokenizer.model_max_length == 8000 From 1865b64365eb843761c6629534443d1ae1c1fb9f Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 4 Jun 2024 11:45:19 -0700 Subject: [PATCH 073/238] Fix integ tests (#827) --- .github/workflows/docs-integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index ef2c96123..4c469dcb6 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -117,7 +117,7 @@ jobs: PUSHER_APP_ID: ${{ secrets.INTEG_PUSHER_APP_ID }} PUSHER_KEY: ${{ secrets.INTEG_PUSHER_KEY }} PUSHER_SECRET: ${{ secrets.INTEG_PUSHER_SECRET }} - PUSHER_CLUSTER: ${{ secretes.INTEG_PUSHER_CLUSTER }} + PUSHER_CLUSTER: ${{ secrets.INTEG_PUSHER_CLUSTER }} services: postgres: image: ankane/pgvector:v0.5.0 From 0fade6403cceeaaeb1949a837ce28ba52688c023 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 4 Jun 2024 12:17:11 -0700 Subject: [PATCH 074/238] Fix out of space issue during integration tests (#828) --- .github/workflows/docs-integration-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 4c469dcb6..dcef2e2c7 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -133,6 +133,8 @@ jobs: --health-timeout 5s --health-retries 5 steps: + - name: Delete huge unnecessary tools folder # See https://github.com/orgs/community/discussions/25678#discussioncomment-5242449 + run: rm -rf /opt/hostedtoolcache - name: Checkout actions uses: actions/checkout@v3 - name: Init environment From 23018b8403c514862a55ba6a70be49cb36a9b016 Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Tue, 4 Jun 2024 12:41:29 -0700 Subject: [PATCH 075/238] adding docs for griptape-cloud-knowledge-base-client (#824) --- .github/workflows/docs-integration-tests.yml | 1 + .../griptape-cloud-knowledge-base-client.md | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index dcef2e2c7..7e1fc5712 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -75,6 +75,7 @@ jobs: GRIPTAPE_CLOUD_API_KEY: ${{ secrets.INTEG_GRIPTAPE_CLOUD_API_KEY }} GRIPTAPE_CLOUD_STRUCTURE_ID: ${{ secrets.INTEG_GRIPTAPE_CLOUD_STRUCTURE_ID }} GRIPTAPE_CLOUD_BASE_URL: ${{ secrets.INTEG_GRIPTAPE_CLOUD_BASE_URL }} + GRIPTAPE_CLOUD_KB_ID: ${{ secrets.INTEG_GRIPTAPE_CLOUD_KB_ID }} OPENWEATHER_API_KEY: ${{ secrets.INTEG_OPENWEATHER_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.INTEG_ANTHROPIC_API_KEY }} SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME: ${{ secrets.SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME }} diff --git a/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md new file mode 100644 index 000000000..cd6e33ac9 --- /dev/null +++ b/docs/griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md @@ -0,0 +1,25 @@ +## Overview + +The `GriptapeCloudKnowledgeBaseClient` is a lightweight Tool to retrieve data from a RAG pipeline and vector store hosted in [Griptape Cloud](https://cloud.griptape.ai). It enables searching across a centralized [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) that can consist of various data sources such as Confluence, Google Docs, and web pages. + +**Note:** This tool requires a [Knowledge Base](https://cloud.griptape.ai/knowledge-bases) hosted in Griptape Cloud and an [API Key](https://cloud.griptape.ai/keys) for access. + +```python +import os +from griptape.structures import Agent +from griptape.tools import GriptapeCloudKnowledgeBaseClient + +knowledge_base_client = GriptapeCloudKnowledgeBaseClient( + description="Contains information about the company and its operations", + api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], + knowledge_base_id=os.environ["GRIPTAPE_CLOUD_KB_ID"], +) + +agent = Agent( + tools=[ + knowledge_base_client, + ] +) + +agent.run("What is the company's corporate travel policy?") +``` From 21c17b5a6b805ed4db75391a9ab6ebbe29db1dfc Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 4 Jun 2024 13:47:57 -0700 Subject: [PATCH 076/238] Ignore computer tool due to out of space issues (#830) --- .github/workflows/docs-integration-tests.yml | 2 -- docs/griptape-tools/official-tools/computer.md | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 7e1fc5712..f752aa90d 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -134,8 +134,6 @@ jobs: --health-timeout 5s --health-retries 5 steps: - - name: Delete huge unnecessary tools folder # See https://github.com/orgs/community/discussions/25678#discussioncomment-5242449 - run: rm -rf /opt/hostedtoolcache - name: Checkout actions uses: actions/checkout@v3 - name: Init environment diff --git a/docs/griptape-tools/official-tools/computer.md b/docs/griptape-tools/official-tools/computer.md index f2b23a548..6496e6fff 100644 --- a/docs/griptape-tools/official-tools/computer.md +++ b/docs/griptape-tools/official-tools/computer.md @@ -4,7 +4,7 @@ This tool enables LLMs to execute Python code and run shell commands inside a Do You can specify a local working directory and environment variables during tool initialization: -```python +```python title="PYTEST_IGNORE" from griptape.structures import Agent from griptape.tools import Computer From a7f83b30148bff0968e8e9594a362e8e5b691859 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 5 Jun 2024 08:32:59 -0700 Subject: [PATCH 077/238] Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. (#833) --- CHANGELOG.md | 3 ++ .../drivers/prompt-drivers.md | 31 ++--------------- .../prompt/huggingface_hub_prompt_driver.py | 11 ++++-- griptape/tokenizers/huggingface_tokenizer.py | 5 +-- poetry.lock | 34 +++++++++---------- pyproject.toml | 2 +- 6 files changed, 33 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87de56beb..c65fcfd95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed +- Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. + ## [0.26.0] - 2024-06-04 ### Added diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 1006f215f..8e0ffcfad 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -237,52 +237,27 @@ agent.run('Briefly explain how a computer works to a young child.') !!! info This driver requires the `drivers-prompt-huggingface` [extra](../index.md#extras). -The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_hub_prompt_driver.md) connects to the [Hugging Face Hub API](https://huggingface.co/docs/hub/api). It supports models with the following tasks: +The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_hub_prompt_driver.md) connects to the [Hugging Face Hub API](https://huggingface.co/docs/hub/api). -- text2text-generation -- text-generation !!! warning Not all models featured on the Hugging Face Hub are supported by this driver. Models that are not supported by [Hugging Face serverless inference](https://huggingface.co/docs/api-inference/en/index) will not work with this driver. Due to the limitations of Hugging Face serverless inference, only models that are than 10GB are supported. -!!! info - The `prompt_stack_to_string_converter` function is intended to convert a `PromptStack` to model specific input. You - should consult the model's documentation to determine the correct format. - -Let's recreate the [Falcon-7B-Instruct](https://huggingface.co/tiiuae/falcon-7b-instruct) example using Griptape: - ```python import os from griptape.structures import Agent from griptape.drivers import HuggingFaceHubPromptDriver from griptape.rules import Rule, Ruleset -from griptape.utils import PromptStack from griptape.config import StructureConfig -def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: - prompt_lines = [] - - for i in prompt_stack.inputs: - if i.is_user(): - prompt_lines.append(f"User: {i.content}") - elif i.is_assistant(): - prompt_lines.append(f"Girafatron: {i.content}") - else: - prompt_lines.append(f"Instructions: {i.content}") - prompt_lines.append("Girafatron:") - - return "\n".join(prompt_lines) - - agent = Agent( config=StructureConfig( prompt_driver=HuggingFaceHubPromptDriver( - model="tiiuae/falcon-7b-instruct", + model="HuggingFaceH4/zephyr-7b-beta", api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - prompt_stack_to_string=prompt_stack_to_string_converter, ) ), rulesets=[ @@ -294,7 +269,7 @@ agent = Agent( "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." ) - ] + ], ) ], ) diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 062672aa8..d6b021f29 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -52,7 +52,7 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - prompt = self.prompt_stack_to_string(prompt_stack) + prompt = self.__to_prompt(prompt_stack) response = self.client.text_generation( prompt, return_full_text=False, max_new_tokens=self.max_output_tokens(prompt), **self.params @@ -61,7 +61,7 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: return TextArtifact(value=response) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - prompt = self.prompt_stack_to_string(prompt_stack) + prompt = self.__to_prompt(prompt_stack) response = self.client.text_generation( prompt, return_full_text=False, max_new_tokens=self.max_output_tokens(prompt), stream=True, **self.params @@ -69,3 +69,10 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: for token in response: yield TextArtifact(value=token) + + def __to_prompt(self, prompt_stack: PromptStack) -> str: + tokens = self.tokenizer.tokenizer.apply_chat_template( + [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], add_generation_prompt=True + ) + + return self.tokenizer.tokenizer.decode(tokens) diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index dbfba5429..84023a378 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -17,7 +17,4 @@ class HuggingFaceTokenizer(BaseTokenizer): max_output_tokens: int = field(kw_only=True) # pyright: ignore[reportGeneralTypeIssues] def count_tokens(self, text: str | list) -> int: - if isinstance(text, str): - return len(self.tokenizer.encode(text)) - else: - raise ValueError("Text must be a string.") + return len(self.tokenizer.encode(text)) diff --git a/poetry.lock b/poetry.lock index cf8fde4ac..c89d577b4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -5515,18 +5515,18 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.40.2" +version = "4.41.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.40.2-py3-none-any.whl", hash = "sha256:71cb94301ec211a2e1d4b8c8d18dcfaa902dfa00a089dceca167a8aa265d6f2d"}, - {file = "transformers-4.40.2.tar.gz", hash = "sha256:657b6054a2097671398d976ad46e60836e7e15f9ea9551631a96e33cb9240649"}, + {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, + {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.19.3,<1.0" +huggingface-hub = ">=0.23.0,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" @@ -5539,17 +5539,15 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] -docs-specific = ["hf-doc-builder"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] @@ -5559,7 +5557,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] @@ -5568,16 +5566,16 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -6085,4 +6083,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "4e98cb17a098a86dc3c109bad3cb8b5299e333d20e7c12903a7fe9472b7a3d31" +content-hash = "658965f94fd55e2ff1ee9e3579854d247344ce9da8b2f8f8a08826a515fb2aff" diff --git a/pyproject.toml b/pyproject.toml index 60fc345f2..c82cb8e26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ requests = "^2" # drivers cohere = { version = ">=4", optional = true } anthropic = { version = "^0.20.0", optional = true } -transformers = { version = "^4.30", optional = true } +transformers = { version = "^4.41.2", optional = true } huggingface-hub = { version = ">=0.13", optional = true } boto3 = { version = "^1.28.2", optional = true } sqlalchemy-redshift = { version = "*", optional = true } From 7025db89814a41a86ab7b8c9989e617958740bfe Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 5 Jun 2024 09:45:12 -0700 Subject: [PATCH 078/238] Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. (#832) --- CHANGELOG.md | 1 + .../drivers/prompt-drivers.md | 37 +++-------------- .../huggingface_pipeline_prompt_driver.py | 41 +++++++++++-------- ...est_hugging_face_pipeline_prompt_driver.py | 20 ++++++--- 4 files changed, 47 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c65fcfd95..31f79f873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. +- Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. ## [0.26.0] - 2024-06-04 diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 8e0ffcfad..c659c7e82 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -305,62 +305,37 @@ agent.run("Write the code for a snake game.") !!! info This driver requires the `drivers-prompt-huggingface-pipeline` [extra](../index.md#extras). -The [HuggingFacePipelinePromptDriver](../../reference/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.md) uses [Hugging Face Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines) for inference locally. It supports models with the following tasks: - -- text2text-generation -- text-generation +The [HuggingFacePipelinePromptDriver](../../reference/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.md) uses [Hugging Face Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines) for inference locally. !!! warning Running a model locally can be a computationally expensive process. ```python -import os from griptape.structures import Agent from griptape.drivers import HuggingFacePipelinePromptDriver from griptape.rules import Rule, Ruleset -from griptape.utils import PromptStack from griptape.config import StructureConfig -# Override the default Prompt Stack to string converter -# to format the prompt in a way that is easier for this model to understand. -def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: - prompt_lines = [] - - for i in prompt_stack.inputs: - if i.is_user(): - prompt_lines.append(f"User: {i.content}") - elif i.is_assistant(): - prompt_lines.append(f"Girafatron: {i.content}") - else: - prompt_lines.append(f"Instructions: {i.content}") - prompt_lines.append("Girafatron:") - - return "\n".join(prompt_lines) - - agent = Agent( config=StructureConfig( prompt_driver=HuggingFacePipelinePromptDriver( - model="TinyLlama/TinyLlama-1.1B-Chat-v0.6", - prompt_stack_to_string=prompt_stack_to_string_converter, + model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", ) ), rulesets=[ Ruleset( - name="Girafatron", + name="Pirate", rules=[ Rule( - value="You are Girafatron, a giraffe-obsessed robot. You are talking to a human. " - "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. " - "Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe." + value="You are a pirate chatbot who always responds in pirate speak!" ) - ] + ], ) ], ) -agent.run("Hello Girafatron, what is your favorite animal?") +agent.run("How many helicopters can a human eat in one sitting?") ``` ### Multi Model Prompt Drivers diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index bde6d5e4e..324ecd74f 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -1,5 +1,7 @@ +from __future__ import annotations from collections.abc import Iterator +from typing import TYPE_CHECKING from attrs import Factory, define, field from griptape.artifacts import TextArtifact @@ -7,6 +9,9 @@ from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import PromptStack, import_optional_dependency +if TYPE_CHECKING: + from transformers import TextGenerationPipeline + @define class HuggingFacePipelinePromptDriver(BasePromptDriver): @@ -14,13 +19,9 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): Attributes: params: Custom model run parameters. model: Hugging Face Hub model name. - tokenizer: Custom `HuggingFaceTokenizer`. """ - SUPPORTED_TASKS = ["text2text-generation", "text-generation"] - DEFAULT_PARAMS = {"return_full_text": False, "num_return_sequences": 1} - max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) model: str = field(kw_only=True, metadata={"serializable": True}) params: dict = field(factory=dict, kw_only=True, metadata={"serializable": True}) @@ -34,28 +35,36 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): ), kw_only=True, ) + pipe: TextGenerationPipeline = field( + default=Factory( + lambda self: import_optional_dependency("transformers").pipeline( + "text-generation", model=self.model, max_new_tokens=self.max_tokens, tokenizer=self.tokenizer.tokenizer + ), + takes_self=True, + ) + ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - prompt = self.prompt_stack_to_string(prompt_stack) - pipeline = import_optional_dependency("transformers").pipeline + messages = [{"role": input.role, "content": input.content} for input in prompt_stack.inputs] - generator = pipeline( + result = self.pipe( + messages, + max_new_tokens=self.max_tokens, tokenizer=self.tokenizer.tokenizer, - model=self.model, - max_new_tokens=self.tokenizer.count_output_tokens_left(prompt), + stop_strings=self.tokenizer.stop_sequences, + temperature=self.temperature, + do_sample=True, ) - if generator.task in self.SUPPORTED_TASKS: - extra_params = {"pad_token_id": self.tokenizer.tokenizer.eos_token_id} - - response = generator(prompt, **(self.DEFAULT_PARAMS | extra_params | self.params)) + if isinstance(result, list): + if len(result) == 1: + generated_text = result[0]["generated_text"][-1]["content"] - if len(response) == 1: - return TextArtifact(value=response[0]["generated_text"].strip()) + return TextArtifact(value=generated_text) else: raise Exception("completion with more than one choice is not supported yet") else: - raise Exception(f"only models with the following tasks are supported: {self.SUPPORTED_TASKS}") + raise Exception("invalid output format") def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: raise NotImplementedError("streaming is not supported") diff --git a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py index fec39da4d..b565ccf4d 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py @@ -13,7 +13,7 @@ def mock_pipeline(self, mocker): def mock_generator(self, mock_pipeline): mock_generator = mock_pipeline.return_value mock_generator.task = "text-generation" - mock_generator.return_value = [{"generated_text": "model-output"}] + mock_generator.return_value = [{"generated_text": [{"content": "model-output"}]}] return mock_generator @pytest.fixture(autouse=True) @@ -44,6 +44,16 @@ def test_try_run(self, prompt_stack): # Then assert text_artifact.value == "model-output" + def test_try_stream(self, prompt_stack): + # Given + driver = HuggingFacePipelinePromptDriver(model="foo", max_tokens=42) + + # When + with pytest.raises(Exception) as e: + driver.try_stream(prompt_stack) + + assert e.value.args[0] == "streaming is not supported" + @pytest.mark.parametrize("choices", [[], [1, 2]]) def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_generator, prompt_stack): # Given @@ -55,16 +65,16 @@ def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_gener driver.try_run(prompt_stack) # Then - e.value.args[0] == "completion with more than one choice is not supported yet" + assert e.value.args[0] == "completion with more than one choice is not supported yet" - def test_try_run_throws_when_unsupported_task_returned(self, prompt_stack, mock_generator): + def test_try_run_throws_when_non_list(self, mock_generator, prompt_stack): # Given driver = HuggingFacePipelinePromptDriver(model="foo", max_tokens=42) - mock_generator.task = "obviously-an-unsupported-task" + mock_generator.return_value = {} # When with pytest.raises(Exception) as e: driver.try_run(prompt_stack) # Then - assert e.value.args[0].startswith("only models with the following tasks are supported: ") + assert e.value.args[0] == "invalid output format" From 863031797ecf68f8888100ef82e1333dbbc2df84 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:17:22 -0700 Subject: [PATCH 079/238] Add task relationship APIs (#822) --- CHANGELOG.md | 12 + docs/examples/multi-agent-workflow.md | 44 +- .../structures/workflows.md | 181 +++++- griptape/structures/structure.py | 22 + griptape/structures/workflow.py | 11 +- griptape/tasks/actions_subtask.py | 18 - griptape/tasks/base_task.py | 20 + griptape/tasks/toolkit_task.py | 1 + tests/unit/structures/test_workflow.py | 526 +++++++++++++++--- 9 files changed, 698 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f79f873..a644b13d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `BaseTask.add_child()` to add a child task to a parent task. +- `BaseTask.add_children()` to add multiple child tasks to a parent task. +- `BaseTask.add_parent()` to add a parent task to a child task. +- `BaseTask.add_parents()` to add multiple parent tasks to a child task. +- `Structure.resolve_relationships()` to resolve asymmetrically defined parent/child relationships. In other words, if a parent declares a child, but the child does not declare the parent, the parent will automatically be added as a parent of the child when running this method. The method is invoked automatically by `Structure.before_run()`. + ### Changed +- **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. +- `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. - Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. +### Fixed +- `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. + ## [0.26.0] - 2024-06-04 ### Added diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md index 044f4abad..2678bf3ab 100644 --- a/docs/examples/multi-agent-workflow.md +++ b/docs/examples/multi-agent-workflow.md @@ -155,35 +155,33 @@ if __name__ == "__main__": ), ), ) - end_task = team.add_task( - PromptTask( - 'State "All Done!"', - ) - ) - team.insert_tasks( - research_task, - [ - StructureRunTask( - ( - """Using insights provided, develop an engaging blog + writer_tasks = team.add_tasks(*[ + StructureRunTask( + ( + """Using insights provided, develop an engaging blog post that highlights the most significant AI advancements. Your post should be informative yet accessible, catering to a tech-savvy audience. Make it sound cool, avoid complex words so it doesn't sound like AI. Insights: {{ parent_outputs["research"] }}""", - ), - driver=LocalStructureRunDriver( - structure_factory_fn=lambda: build_writer( - role=writer["role"], - goal=writer["goal"], - backstory=writer["backstory"], - ) - ), - ) - for writer in WRITERS - ], - end_task, + ), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: build_writer( + role=writer["role"], + goal=writer["goal"], + backstory=writer["backstory"], + ) + ), + parent_ids=[research_task.id], + ) + for writer in WRITERS + ]) + end_task = team.add_task( + PromptTask( + 'State "All Done!"', + parent_ids=[writer_task.id for writer_task in writer_tasks], + ) ) team.run() diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 3c2bac25a..74b6755a0 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -18,7 +18,14 @@ Let's build a simple workflow. Let's say, we want to write a story in a fantasy from griptape.tasks import PromptTask from griptape.structures import Workflow -workflow = Workflow() + +world_task = PromptTask( + "Create a fictional world based on the following key words {{ keywords|join(', ') }}", + context={ + "keywords": ["fantasy", "ocean", "tidal lock"] + }, + id="world" +) def character_task(task_id, character_name) -> PromptTask: return PromptTask( @@ -26,30 +33,20 @@ def character_task(task_id, character_name) -> PromptTask: context={ "name": character_name }, - id=task_id + id=task_id, + parent_ids=["world"] ) -world_task = PromptTask( - "Create a fictional world based on the following key words {{ keywords|join(', ') }}", - context={ - "keywords": ["fantasy", "ocean", "tidal lock"] - }, - id="world" -) -workflow.add_task(world_task) +scotty_task = character_task("scotty", "Scotty") +annie_task = character_task("annie", "Annie") story_task = PromptTask( "Based on the following description of the world and characters, write a short story:\n{{ parent_outputs['world'] }}\n{{ parent_outputs['scotty'] }}\n{{ parent_outputs['annie'] }}", - id="story" + id="story", + parent_ids=["world", "scotty", "annie"] ) -workflow.add_task(story_task) -character_task_1 = character_task("scotty", "Scotty") -character_task_2 = character_task("annie", "Annie") - -# Note the preserve_relationship flag. This ensures that world_task remains a parent of -# story_task so its output can be referenced in the story_task prompt. -workflow.insert_tasks(world_task, [character_task_1, character_task_2], story_task, preserve_relationship=True) +workflow = Workflow(tasks=[world_task, story_task, scotty_task, annie_task, story_task]) workflow.run() ``` @@ -147,3 +144,151 @@ workflow.run() unity and harmony that can exist in diversity. ``` +### Declarative vs Imperative Syntax + +The above example showed how to create a workflow using the declarative syntax via the `parent_ids` init param, but there are a number of declarative and imperative options for you to choose between. There is no functional difference, they merely exist to allow you to structure your code as is most readable for your use case. Possibilities are illustrated below. + +Declaratively specify parents (same as above example): + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal"), + PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"]), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal", parent_ids=["adjective"]), + ], + rules=[Rule("output a single lowercase word")] +) + +workflow.run() +``` + +Declaratively specify children: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal", child_ids=["adjective"]), + PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", child_ids=["new-animal"]), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), + ], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` + +Declaratively specifying a mix of parents and children: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +workflow = Workflow( + tasks=[ + PromptTask("Name an animal", id="animal"), + PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"], child_ids=["new-animal"]), + PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal"), + ], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` + +Imperatively specify parents: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") + +adjective_task.add_parent(animal_task) +new_animal_task.add_parent(adjective_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` + +Imperatively specify children: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") + +animal_task.add_child(adjective_task) +adjective_task.add_child(new_animal_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` + +Imperatively specify a mix of parents and children: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") + +adjective_task.add_parent(animal_task) +adjective_task.add_child(new_animal_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` + +Or even mix imperative and declarative: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective", parent_ids=["animal"]) + + +new_animal_task = PromptTask("Name a {{ parent_outputs['adjective'] }} animal", id="new-animal") +new_animal_task.add_parent(adjective_task) + +workflow = Workflow( + tasks=[animal_task, adjective_task, new_animal_task], + rules=[Rule("output a single lowercase word")], +) + +workflow.run() +``` diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 8b71dd905..84058dc7a 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -209,6 +209,26 @@ def publish_event(self, event: BaseEvent, flush: bool = False) -> None: def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} + def resolve_relationships(self) -> None: + task_by_id = {task.id: task for task in self.tasks} + + for task in self.tasks: + # Ensure parents include this task as a child + for parent_id in task.parent_ids: + if parent_id not in task_by_id: + raise ValueError(f"Task with id {parent_id} doesn't exist.") + parent = task_by_id[parent_id] + if task.id not in parent.child_ids: + parent.child_ids.append(task.id) + + # Ensure children include this task as a parent + for child_id in task.child_ids: + if child_id not in task_by_id: + raise ValueError(f"Task with id {child_id} doesn't exist.") + child = task_by_id[child_id] + if task.id not in child.parent_ids: + child.parent_ids.append(task.id) + def before_run(self) -> None: self.publish_event( StartStructureRunEvent( @@ -216,6 +236,8 @@ def before_run(self) -> None: ) ) + self.resolve_relationships() + def after_run(self) -> None: self.publish_event( FinishStructureRunEvent( diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index e60efa425..5927a1f4f 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -16,10 +16,6 @@ class Workflow(Structure): def add_task(self, task: BaseTask) -> BaseTask: task.preprocess(self) - if self.output_task: - self.output_task.child_ids.append(task.id) - task.parent_ids.append(self.output_task.id) - self.tasks.append(task) return task @@ -77,6 +73,7 @@ def insert_task( if parent_task.id in child_task.parent_ids: child_task.parent_ids.remove(parent_task.id) + last_parent_index = -1 for parent_task in parent_tasks: # Link the new task to the parent task if parent_task.id not in task.parent_ids: @@ -85,7 +82,11 @@ def insert_task( parent_task.child_ids.append(task.id) parent_index = self.tasks.index(parent_task) - self.tasks.insert(parent_index + 1, task) + if parent_index > last_parent_index: + last_parent_index = parent_index + + # Insert the new task once, just after the last parent task + self.tasks.insert(last_parent_index + 1, task) return task diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index d47d1df32..dfc54aca6 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -172,24 +172,6 @@ def actions_to_dicts(self) -> list[dict]: def actions_to_json(self) -> str: return json.dumps(self.actions_to_dicts()) - def add_child(self, child: ActionsSubtask) -> ActionsSubtask: - if child.id not in self.child_ids: - self.child_ids.append(child.id) - - if self.id not in child.parent_ids: - child.parent_ids.append(self.id) - - return child - - def add_parent(self, parent: ActionsSubtask) -> ActionsSubtask: - if parent.id not in self.parent_ids: - self.parent_ids.append(parent.id) - - if self.id not in parent.child_ids: - parent.child_ids.append(self.id) - - return parent - def __init_from_prompt(self, value: str) -> None: thought_matches = re.findall(self.THOUGHT_PATTERN, value, re.MULTILINE) actions_matches = re.findall(self.ACTIONS_PATTERN, value, re.DOTALL) diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 771fe4dc8..c75978997 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -60,6 +60,26 @@ def meta_memories(self) -> list[BaseMetaEntry]: def __str__(self) -> str: return str(self.output.value) + def add_parents(self, parents: list[str | BaseTask]) -> None: + for parent in parents: + self.add_parent(parent) + + def add_parent(self, parent: str | BaseTask) -> None: + parent_id = parent if isinstance(parent, str) else parent.id + + if parent_id not in self.parent_ids: + self.parent_ids.append(parent_id) + + def add_children(self, children: list[str | BaseTask]) -> None: + for child in children: + self.add_child(child) + + def add_child(self, child: str | BaseTask) -> None: + child_id = child if isinstance(child, str) else child.id + + if child_id not in self.child_ids: + self.child_ids.append(child_id) + def preprocess(self, structure: Structure) -> BaseTask: self.structure = structure diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index ed787aa45..3a3727434 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -161,6 +161,7 @@ def add_subtask(self, subtask: ActionsSubtask) -> ActionsSubtask: if len(self.subtasks) > 0: self.subtasks[-1].add_child(subtask) + subtask.add_parent(self.subtasks[-1]) self.subtasks.append(subtask) diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 970d43e74..4a493bdd8 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -140,10 +140,10 @@ def test_tasks_initialization(self): assert workflow.tasks[1].id == "test2" assert workflow.tasks[2].id == "test3" assert len(first_task.parents) == 0 - assert len(first_task.children) == 1 - assert len(second_task.parents) == 1 - assert len(second_task.children) == 1 - assert len(third_task.parents) == 1 + assert len(first_task.children) == 0 + assert len(second_task.parents) == 0 + assert len(second_task.children) == 0 + assert len(third_task.parents) == 0 assert len(third_task.children) == 0 def test_add_task(self): @@ -161,8 +161,8 @@ def test_add_task(self): assert first_task.structure == workflow assert second_task.structure == workflow assert len(first_task.parents) == 0 - assert len(first_task.children) == 1 - assert len(second_task.parents) == 1 + assert len(first_task.children) == 0 + assert len(second_task.parents) == 0 assert len(second_task.children) == 0 def test_add_tasks(self): @@ -179,8 +179,8 @@ def test_add_tasks(self): assert first_task.structure == workflow assert second_task.structure == workflow assert len(first_task.parents) == 0 - assert len(first_task.children) == 1 - assert len(second_task.parents) == 1 + assert len(first_task.children) == 0 + assert len(second_task.parents) == 0 assert len(second_task.children) == 0 def test_run(self): @@ -210,7 +210,111 @@ def test_run_with_args(self): assert task.input.to_text() == "-" - def test_run_topology_1(self): + @pytest.mark.parametrize( + "tasks", + [ + [PromptTask(id="task1", parent_ids=["missing"])], + [PromptTask(id="task1", child_ids=["missing"])], + [PromptTask(id="task1"), PromptTask(id="task2", parent_ids=["missing"])], + [PromptTask(id="task1"), PromptTask(id="task2", parent_ids=["task1", "missing"])], + [PromptTask(id="task1"), PromptTask(id="task2", parent_ids=["task1"], child_ids=["missing"])], + ], + ) + def test_run_raises_on_missing_parent_or_child_id(self, tasks): + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=tasks) + + with pytest.raises(ValueError) as e: + workflow.run() + + assert e.value.args[0] == "Task with id missing doesn't exist." + + def test_run_topology_1_declarative_parents(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1"), + PromptTask("test2", id="task2", parent_ids=["task1"]), + PromptTask("test3", id="task3", parent_ids=["task1"]), + PromptTask("test4", id="task4", parent_ids=["task2", "task3"]), + ], + ) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_declarative_children(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1", child_ids=["task2", "task3"]), + PromptTask("test2", id="task2", child_ids=["task4"]), + PromptTask("test3", id="task3", child_ids=["task4"]), + PromptTask("test4", id="task4"), + ], + ) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_declarative_mixed(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1", child_ids=["task3"]), + PromptTask("test2", id="task2", parent_ids=["task1"], child_ids=["task4"]), + PromptTask("test3", id="task3"), + PromptTask("test4", id="task4", parent_ids=["task2", "task3"]), + ], + ) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_imperative_parents(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + task2.add_parent(task1) + task3.add_parent("task1") + task4.add_parents([task2, "task3"]) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_imperative_children(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + task1.add_children([task2, task3]) + task2.add_child(task4) + task3.add_child(task4) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_imperative_mixed(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + task1.add_children([task2, task3]) + task4.add_parents([task2, task3]) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task1, task2, task3, task4]) + + workflow.run() + + self._validate_topology_1(workflow) + + def test_run_topology_1_imperative_insert(self): task1 = PromptTask("test1", id="task1") task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") @@ -225,60 +329,152 @@ def test_run_topology_1(self): workflow.run() - assert task1.state == BaseTask.State.FINISHED - assert task1.parent_ids == [] - assert task1.child_ids == ["task2", "task3"] + self._validate_topology_1(workflow) + + def test_run_topology_2_declarative_parents(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("testa", id="taska"), + PromptTask("testb", id="taskb", parent_ids=["taska"]), + PromptTask("testc", id="taskc", parent_ids=["taska"]), + PromptTask("testd", id="taskd", parent_ids=["taska", "taskb", "taskc"]), + PromptTask("teste", id="taske", parent_ids=["taska", "taskd", "taskc"]), + ], + ) - assert task2.state == BaseTask.State.FINISHED - assert task2.parent_ids == ["task1"] - assert task2.child_ids == ["task4"] + workflow.run() - assert task3.state == BaseTask.State.FINISHED - assert task3.parent_ids == ["task1"] - assert task3.child_ids == ["task4"] + self._validate_topology_2(workflow) + + def test_run_topology_2_declarative_children(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("testa", id="taska", child_ids=["taskb", "taskc", "taskd", "taske"]), + PromptTask("testb", id="taskb", child_ids=["taskd"]), + PromptTask("testc", id="taskc", child_ids=["taskd", "taske"]), + PromptTask("testd", id="taskd", child_ids=["taske"]), + PromptTask("teste", id="taske", child_ids=[]), + ], + ) - assert task4.state == BaseTask.State.FINISHED - assert task4.parent_ids == ["task2", "task3"] - assert task4.child_ids == [] + workflow.run() - def test_run_topology_2(self): - """Adapted from https://en.wikipedia.org/wiki/Directed_acyclic_graph#/media/File:Tred-G.svg""" + self._validate_topology_2(workflow) + + def test_run_topology_2_imperative_parents(self): taska = PromptTask("testa", id="taska") taskb = PromptTask("testb", id="taskb") taskc = PromptTask("testc", id="taskc") taskd = PromptTask("testd", id="taskd") taske = PromptTask("teste", id="taske") - workflow = Workflow(prompt_driver=MockPromptDriver()) + taskb.add_parent(taska) + taskc.add_parent("taska") + taskd.add_parents([taska, taskb, taskc]) + taske.add_parents(["taska", taskd, "taskc"]) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + + workflow.run() + self._validate_topology_2(workflow) + + def test_run_topology_2_imperative_children(self): + taska = PromptTask("testa", id="taska") + taskb = PromptTask("testb", id="taskb") + taskc = PromptTask("testc", id="taskc") + taskd = PromptTask("testd", id="taskd") + taske = PromptTask("teste", id="taske") + taska.add_children([taskb, taskc, taskd, taske]) + taskb.add_child(taskd) + taskc.add_children([taskd, taske]) + taskd.add_child(taske) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + + workflow.run() + + self._validate_topology_2(workflow) + + def test_run_topology_2_imperative_mixed(self): + taska = PromptTask("testa", id="taska") + taskb = PromptTask("testb", id="taskb") + taskc = PromptTask("testc", id="taskc") + taskd = PromptTask("testd", id="taskd") + taske = PromptTask("teste", id="taske") + taska.add_children([taskb, taskc, taskd, taske]) + taskb.add_child(taskd) + taskd.add_parent(taskc) + taske.add_parents(["taska", taskd, "taskc"]) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[taska, taskb, taskc, taskd, taske]) + + workflow.run() + + self._validate_topology_2(workflow) + + def test_run_topology_2_imperative_insert(self): + taska = PromptTask("testa", id="taska") + taskb = PromptTask("testb", id="taskb") + taskc = PromptTask("testc", id="taskc") + taskd = PromptTask("testd", id="taskd") + taske = PromptTask("teste", id="taske") + workflow = Workflow(prompt_driver=MockPromptDriver()) workflow.add_task(taska) workflow.add_task(taske) + taske.add_parent(taska) workflow.insert_tasks(taska, taskd, taske, preserve_relationship=True) workflow.insert_tasks(taska, [taskc], [taskd, taske], preserve_relationship=True) workflow.insert_tasks(taska, taskb, taskd, preserve_relationship=True) workflow.run() - assert taska.state == BaseTask.State.FINISHED - assert taska.parent_ids == [] - assert set(taska.child_ids) == {"taskb", "taskd", "taskc", "taske"} + self._validate_topology_2(workflow) + + def test_run_topology_3_declarative_parents(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1"), + PromptTask("test2", id="task2", parent_ids=["task4"]), + PromptTask("test4", id="task4", parent_ids=["task1"]), + PromptTask("test3", id="task3", parent_ids=["task2"]), + ], + ) - assert taskb.state == BaseTask.State.FINISHED - assert taskb.parent_ids == ["taska"] - assert taskb.child_ids == ["taskd"] + workflow.run() - assert taskc.state == BaseTask.State.FINISHED - assert taskc.parent_ids == ["taska"] - assert set(taskc.child_ids) == {"taskd", "taske"} + self._validate_topology_3(workflow) + + def test_run_topology_3_declarative_children(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1", child_ids=["task4"]), + PromptTask("test2", id="task2", child_ids=["task3"]), + PromptTask("test4", id="task4", child_ids=["task2"]), + PromptTask("test3", id="task3", child_ids=[]), + ], + ) - assert taskd.state == BaseTask.State.FINISHED - assert set(taskd.parent_ids) == {"taskb", "taska", "taskc"} - assert taskd.child_ids == ["taske"] + workflow.run() - assert taske.state == BaseTask.State.FINISHED - assert set(taske.parent_ids) == {"taskd", "taskc", "taska"} - assert taske.child_ids == [] + self._validate_topology_3(workflow) + + def test_run_topology_3_declarative_mixed(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1"), + PromptTask("test2", id="task2", parent_ids=["task4"], child_ids=["task3"]), + PromptTask("test4", id="task4", parent_ids=["task1"], child_ids=["task2"]), + PromptTask("test3", id="task3"), + ], + ) + + workflow.run() + + self._validate_topology_3(workflow) - def test_run_topology_3(self): + def test_run_topology_3_imperative_insert(self): task1 = PromptTask("test1", id="task1") task2 = PromptTask("test2", id="task2") task3 = PromptTask("test3", id="task3") @@ -288,28 +484,75 @@ def test_run_topology_3(self): workflow + task1 workflow + task2 workflow + task3 + task2.add_parent(task1) + task3.add_parent(task2) workflow.insert_tasks(task1, task4, task2) workflow.run() - assert task1.state == BaseTask.State.FINISHED - assert task1.parent_ids == [] - assert task1.child_ids == ["task4"] + self._validate_topology_3(workflow) + + def test_run_topology_4_declarative_parents(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask(id="collect_movie_info"), + PromptTask(id="movie_info_1", parent_ids=["collect_movie_info"]), + PromptTask(id="movie_info_2", parent_ids=["collect_movie_info"]), + PromptTask(id="movie_info_3", parent_ids=["collect_movie_info"]), + PromptTask(id="compare_movies", parent_ids=["movie_info_1", "movie_info_2", "movie_info_3"]), + PromptTask(id="send_email_task", parent_ids=["compare_movies"]), + PromptTask(id="save_to_disk", parent_ids=["compare_movies"]), + PromptTask(id="publish_website", parent_ids=["compare_movies"]), + PromptTask(id="summarize_to_slack", parent_ids=["send_email_task", "save_to_disk", "publish_website"]), + ], + ) - assert task2.state == BaseTask.State.FINISHED - assert task2.parent_ids == ["task4"] - assert task2.child_ids == ["task3"] + workflow.run() - assert task3.state == BaseTask.State.FINISHED - assert task3.parent_ids == ["task2"] - assert task3.child_ids == [] + self._validate_topology_4(workflow) + + def test_run_topology_4_declarative_children(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask(id="collect_movie_info", child_ids=["movie_info_1", "movie_info_2", "movie_info_3"]), + PromptTask(id="movie_info_1", child_ids=["compare_movies"]), + PromptTask(id="movie_info_2", child_ids=["compare_movies"]), + PromptTask(id="movie_info_3", child_ids=["compare_movies"]), + PromptTask(id="compare_movies", child_ids=["send_email_task", "save_to_disk", "publish_website"]), + PromptTask(id="send_email_task", child_ids=["summarize_to_slack"]), + PromptTask(id="save_to_disk", child_ids=["summarize_to_slack"]), + PromptTask(id="publish_website", child_ids=["summarize_to_slack"]), + PromptTask(id="summarize_to_slack", child_ids=[]), + ], + ) - assert task4.state == BaseTask.State.FINISHED - assert task4.parent_ids == ["task1"] - assert task4.child_ids == ["task2"] + workflow.run() - def test_run_topology_4(self): - workflow = Workflow(prompt_driver=MockPromptDriver()) + self._validate_topology_4(workflow) + + def test_run_topology_4_declarative_mixed(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask(id="collect_movie_info"), + PromptTask(id="movie_info_1", parent_ids=["collect_movie_info"], child_ids=["compare_movies"]), + PromptTask(id="movie_info_2", parent_ids=["collect_movie_info"], child_ids=["compare_movies"]), + PromptTask(id="movie_info_3", parent_ids=["collect_movie_info"], child_ids=["compare_movies"]), + PromptTask(id="compare_movies"), + PromptTask(id="send_email_task", parent_ids=["compare_movies"], child_ids=["summarize_to_slack"]), + PromptTask(id="save_to_disk", parent_ids=["compare_movies"], child_ids=["summarize_to_slack"]), + PromptTask(id="publish_website", parent_ids=["compare_movies"], child_ids=["summarize_to_slack"]), + PromptTask(id="summarize_to_slack"), + ], + ) + + workflow.run() + + self._validate_topology_4(workflow) + + def test_run_topology_4_imperative_insert(self): collect_movie_info = PromptTask(id="collect_movie_info") summarize_to_slack = PromptTask(id="summarize_to_slack") movie_info_1 = PromptTask(id="movie_info_1") @@ -321,30 +564,34 @@ def test_run_topology_4(self): publish_website = PromptTask(id="publish_website") movie_info_3 = PromptTask(id="movie_info_3") + workflow = Workflow(prompt_driver=MockPromptDriver()) workflow.add_tasks(collect_movie_info, summarize_to_slack) workflow.insert_tasks(collect_movie_info, [movie_info_1, movie_info_2, movie_info_3], summarize_to_slack) workflow.insert_tasks([movie_info_1, movie_info_2, movie_info_3], compare_movies, summarize_to_slack) workflow.insert_tasks(compare_movies, [send_email_task, save_to_disk, publish_website], summarize_to_slack) - assert set(collect_movie_info.child_ids) == {"movie_info_1", "movie_info_2", "movie_info_3"} - - assert set(movie_info_1.parent_ids) == {"collect_movie_info"} - assert set(movie_info_2.parent_ids) == {"collect_movie_info"} - assert set(movie_info_3.parent_ids) == {"collect_movie_info"} - assert set(movie_info_1.child_ids) == {"compare_movies"} - assert set(movie_info_2.child_ids) == {"compare_movies"} - assert set(movie_info_3.child_ids) == {"compare_movies"} - - assert set(compare_movies.parent_ids) == {"movie_info_1", "movie_info_2", "movie_info_3"} - assert set(compare_movies.child_ids) == {"send_email_task", "save_to_disk", "publish_website"} - - assert set(send_email_task.parent_ids) == {"compare_movies"} - assert set(save_to_disk.parent_ids) == {"compare_movies"} - assert set(publish_website.parent_ids) == {"compare_movies"} - - assert set(send_email_task.child_ids) == {"summarize_to_slack"} - assert set(save_to_disk.child_ids) == {"summarize_to_slack"} - assert set(publish_website.child_ids) == {"summarize_to_slack"} + self._validate_topology_4(workflow) + + @pytest.mark.parametrize( + "tasks", + [ + [PromptTask(id="a", parent_ids=["a"])], + [PromptTask(id="a"), PromptTask(id="b", parent_ids=["a", "b"])], + [PromptTask(id="a", parent_ids=["b"]), PromptTask(id="b", parent_ids=["a"])], + [ + PromptTask(id="a", parent_ids=["c"]), + PromptTask(id="b", parent_ids=["a"]), + PromptTask(id="c", parent_ids=["b"]), + ], + ], + ) + def test_run_raises_on_cycle(self, tasks): + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=tasks) + + with pytest.raises(ValueError) as e: + workflow.run() + + assert e.value.args[0] == "nodes are in a cycle" def test_input_task(self): task1 = PromptTask("prompt1") @@ -417,6 +664,9 @@ def test_context(self): workflow + task workflow + child + task.add_parent(parent) + task.add_child(child) + context = workflow.context(task) assert context["parent_outputs"] == {parent.id: ""} @@ -439,3 +689,133 @@ def test_deprecation(self): with pytest.deprecated_call(): Workflow(stream=True) + + @staticmethod + def _validate_topology_1(workflow): + assert len(workflow.tasks) == 4 + assert workflow.input_task.id == "task1" + assert workflow.output_task.id == "task4" + assert workflow.input_task.id == workflow.tasks[0].id + assert workflow.output_task.id == workflow.tasks[-1].id + + task1 = workflow.find_task("task1") + assert task1.state == BaseTask.State.FINISHED + assert task1.parent_ids == [] + assert sorted(task1.child_ids) == ["task2", "task3"] + + task2 = workflow.find_task("task2") + assert task2.state == BaseTask.State.FINISHED + assert task2.parent_ids == ["task1"] + assert task2.child_ids == ["task4"] + + task3 = workflow.find_task("task3") + assert task3.state == BaseTask.State.FINISHED + assert task3.parent_ids == ["task1"] + assert task3.child_ids == ["task4"] + + task4 = workflow.find_task("task4") + assert task4.state == BaseTask.State.FINISHED + assert sorted(task4.parent_ids) == ["task2", "task3"] + assert task4.child_ids == [] + + @staticmethod + def _validate_topology_2(workflow): + """Adapted from https://en.wikipedia.org/wiki/Directed_acyclic_graph#/media/File:Tred-G.svg""" + assert len(workflow.tasks) == 5 + assert workflow.input_task.id == "taska" + assert workflow.output_task.id == "taske" + assert workflow.input_task.id == workflow.tasks[0].id + assert workflow.output_task.id == workflow.tasks[-1].id + + taska = workflow.find_task("taska") + assert taska.state == BaseTask.State.FINISHED + assert taska.parent_ids == [] + assert sorted(taska.child_ids) == ["taskb", "taskc", "taskd", "taske"] + + taskb = workflow.find_task("taskb") + assert taskb.state == BaseTask.State.FINISHED + assert taskb.parent_ids == ["taska"] + assert taskb.child_ids == ["taskd"] + + taskc = workflow.find_task("taskc") + assert taskc.state == BaseTask.State.FINISHED + assert taskc.parent_ids == ["taska"] + assert sorted(taskc.child_ids) == ["taskd", "taske"] + + taskd = workflow.find_task("taskd") + assert taskd.state == BaseTask.State.FINISHED + assert sorted(taskd.parent_ids) == ["taska", "taskb", "taskc"] + assert taskd.child_ids == ["taske"] + + taske = workflow.find_task("taske") + assert taske.state == BaseTask.State.FINISHED + assert sorted(taske.parent_ids) == ["taska", "taskc", "taskd"] + assert taske.child_ids == [] + + @staticmethod + def _validate_topology_3(workflow): + assert len(workflow.tasks) == 4 + assert workflow.input_task.id == "task1" + assert workflow.output_task.id == "task3" + assert workflow.input_task.id == workflow.tasks[0].id + assert workflow.output_task.id == workflow.tasks[-1].id + + task1 = workflow.find_task("task1") + assert task1.state == BaseTask.State.FINISHED + assert task1.parent_ids == [] + assert task1.child_ids == ["task4"] + + task2 = workflow.find_task("task2") + assert task2.state == BaseTask.State.FINISHED + assert task2.parent_ids == ["task4"] + assert task2.child_ids == ["task3"] + + task3 = workflow.find_task("task3") + assert task3.state == BaseTask.State.FINISHED + assert task3.parent_ids == ["task2"] + assert task3.child_ids == [] + + task4 = workflow.find_task("task4") + assert task4.state == BaseTask.State.FINISHED + assert task4.parent_ids == ["task1"] + assert task4.child_ids == ["task2"] + + @staticmethod + def _validate_topology_4(workflow): + assert len(workflow.tasks) == 9 + assert workflow.input_task.id == "collect_movie_info" + assert workflow.output_task.id == "summarize_to_slack" + assert workflow.input_task.id == workflow.tasks[0].id + assert workflow.output_task.id == workflow.tasks[-1].id + + collect_movie_info = workflow.find_task("collect_movie_info") + assert collect_movie_info.parent_ids == [] + assert sorted(collect_movie_info.child_ids) == ["movie_info_1", "movie_info_2", "movie_info_3"] + + movie_info_1 = workflow.find_task("movie_info_1") + assert movie_info_1.parent_ids == ["collect_movie_info"] + assert movie_info_1.child_ids == ["compare_movies"] + + movie_info_2 = workflow.find_task("movie_info_2") + assert movie_info_2.parent_ids == ["collect_movie_info"] + assert movie_info_2.child_ids == ["compare_movies"] + + movie_info_3 = workflow.find_task("movie_info_3") + assert movie_info_3.parent_ids == ["collect_movie_info"] + assert movie_info_3.child_ids == ["compare_movies"] + + compare_movies = workflow.find_task("compare_movies") + assert sorted(compare_movies.parent_ids) == ["movie_info_1", "movie_info_2", "movie_info_3"] + assert sorted(compare_movies.child_ids) == ["publish_website", "save_to_disk", "send_email_task"] + + send_email_task = workflow.find_task("send_email_task") + assert send_email_task.parent_ids == ["compare_movies"] + assert send_email_task.child_ids == ["summarize_to_slack"] + + save_to_disk = workflow.find_task("save_to_disk") + assert save_to_disk.parent_ids == ["compare_movies"] + assert save_to_disk.child_ids == ["summarize_to_slack"] + + publish_website = workflow.find_task("publish_website") + assert publish_website.parent_ids == ["compare_movies"] + assert publish_website.child_ids == ["summarize_to_slack"] From 7a137e1cac88385eb7f0425cdc0453e603d13256 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 5 Jun 2024 10:40:27 -0700 Subject: [PATCH 080/238] =?UTF-8?q?Update=20cohere=20prompt=20driver,=20ad?= =?UTF-8?q?d=20cohere=20embedding=20driver,=20cohere=20stru=E2=80=A6=20(#8?= =?UTF-8?q?31)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 + .../drivers/embedding-drivers.md | 23 ++ griptape/config/__init__.py | 2 + griptape/config/cohere_structure_config.py | 37 +++ griptape/drivers/__init__.py | 2 + .../embedding/cohere_embedding_driver.py | 43 +++ .../drivers/prompt/cohere_prompt_driver.py | 50 ++-- griptape/schemas/base_schema.py | 2 + griptape/tokenizers/cohere_tokenizer.py | 4 +- poetry.lock | 265 +++++++++--------- pyproject.toml | 5 +- .../config/test_cohere_structure_config.py | 38 +++ .../embedding/test_cohere_embedding_driver.py | 21 ++ .../prompt/test_cohere_prompt_driver.py | 23 +- .../unit/tokenizers/test_cohere_tokenizer.py | 1 + 15 files changed, 348 insertions(+), 171 deletions(-) create mode 100644 griptape/config/cohere_structure_config.py create mode 100644 griptape/drivers/embedding/cohere_embedding_driver.py create mode 100644 tests/unit/config/test_cohere_structure_config.py create mode 100644 tests/unit/drivers/embedding/test_cohere_embedding_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a644b13d2..189dd785d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `BaseTask.add_parent()` to add a parent task to a child task. - `BaseTask.add_parents()` to add multiple parent tasks to a child task. - `Structure.resolve_relationships()` to resolve asymmetrically defined parent/child relationships. In other words, if a parent declares a child, but the child does not declare the parent, the parent will automatically be added as a parent of the child when running this method. The method is invoked automatically by `Structure.before_run()`. +- `CohereEmbeddingDriver` for using Cohere's embeddings API. +- `CohereStructureConfig` for providing Structures with quick Cohere configuration. ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. - Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. +- Updated `CoherePromptDriver` to use Cohere's latest SDK. ### Fixed - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 49dfde4a5..58182b03e 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -164,6 +164,29 @@ embeddings = driver.embed_string("Hello world!") print(embeddings[:3]) ``` +### Cohere Embeddings + +The [CohereEmbeddingDriver](../../reference/griptape/drivers/embedding/cohere_embedding_driver.md) uses the [Cohere Embeddings API](https://docs.cohere.com/docs/embeddings). + +!!! info + This driver requires the `drivers-embedding-cohere` [extra](../index.md#extras). + +```python +import os +from griptape.drivers import CohereEmbeddingDriver + +embedding_driver=CohereEmbeddingDriver( + model="embed-english-v3.0", + api_key=os.environ["COHERE_API_KEY"], + input_type="search_document", +) + +embeddings = embedding_driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` + ### Override Default Structure Embedding Driver Here is how you can override the Embedding Driver that is used by default in Structures. diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index 7783b3886..541eb0db0 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -8,6 +8,7 @@ from .amazon_bedrock_structure_config import AmazonBedrockStructureConfig from .anthropic_structure_config import AnthropicStructureConfig from .google_structure_config import GoogleStructureConfig +from .cohere_structure_config import CohereStructureConfig __all__ = [ @@ -19,4 +20,5 @@ "AmazonBedrockStructureConfig", "AnthropicStructureConfig", "GoogleStructureConfig", + "CohereStructureConfig", ] diff --git a/griptape/config/cohere_structure_config.py b/griptape/config/cohere_structure_config.py new file mode 100644 index 000000000..82f11b8f4 --- /dev/null +++ b/griptape/config/cohere_structure_config.py @@ -0,0 +1,37 @@ +from attrs import Factory, define, field + +from griptape.config import StructureConfig +from griptape.drivers import ( + BaseEmbeddingDriver, + BasePromptDriver, + CoherePromptDriver, + CohereEmbeddingDriver, + BaseVectorStoreDriver, + LocalVectorStoreDriver, +) + + +@define +class CohereStructureConfig(StructureConfig): + api_key: str = field(metadata={"serializable": False}, kw_only=True) + + prompt_driver: BasePromptDriver = field( + default=Factory(lambda self: CoherePromptDriver(model="command-r", api_key=self.api_key), takes_self=True), + metadata={"serializable": True}, + kw_only=True, + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory( + lambda self: CohereEmbeddingDriver( + model="embed-english-v3.0", api_key=self.api_key, input_type="search_document" + ), + takes_self=True, + ), + metadata={"serializable": True}, + kw_only=True, + ) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + kw_only=True, + metadata={"serializable": True}, + ) diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index f44602f8b..3050989fe 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -29,6 +29,7 @@ from .embedding.huggingface_hub_embedding_driver import HuggingFaceHubEmbeddingDriver from .embedding.google_embedding_driver import GoogleEmbeddingDriver from .embedding.dummy_embedding_driver import DummyEmbeddingDriver +from .embedding.cohere_embedding_driver import CohereEmbeddingDriver from .embedding_model.base_embedding_model_driver import BaseEmbeddingModelDriver from .embedding_model.sagemaker_huggingface_embedding_model_driver import SageMakerHuggingFaceEmbeddingModelDriver @@ -143,6 +144,7 @@ "GoogleEmbeddingDriver", "DummyEmbeddingDriver", "BaseEmbeddingModelDriver", + "CohereEmbeddingDriver", "SageMakerHuggingFaceEmbeddingModelDriver", "SageMakerTensorFlowHubEmbeddingModelDriver", "BaseVectorStoreDriver", diff --git a/griptape/drivers/embedding/cohere_embedding_driver.py b/griptape/drivers/embedding/cohere_embedding_driver.py new file mode 100644 index 000000000..5e8bdf4dd --- /dev/null +++ b/griptape/drivers/embedding/cohere_embedding_driver.py @@ -0,0 +1,43 @@ +from __future__ import annotations +from typing import TYPE_CHECKING +from attrs import define, field, Factory +from griptape.drivers import BaseEmbeddingDriver +from griptape.tokenizers import CohereTokenizer +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from cohere import Client + + +@define +class CohereEmbeddingDriver(BaseEmbeddingDriver): + """ + Attributes: + api_key: Cohere API key. + model: Cohere model name. + client: Custom `cohere.Client`. + tokenizer: Custom `CohereTokenizer`. + input_type: Cohere embedding input type. + """ + + DEFAULT_MODEL = "models/embedding-001" + + api_key: str = field(kw_only=True, metadata={"serializable": False}) + client: Client = field( + default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), + kw_only=True, + ) + tokenizer: CohereTokenizer = field( + default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True), + kw_only=True, + ) + + input_type: str = field(kw_only=True, metadata={"serializable": True}) + + def try_embed_chunk(self, chunk: str) -> list[float]: + result = self.client.embed(texts=[chunk], model=self.model, input_type=self.input_type) + + if isinstance(result.embeddings, list): + return result.embeddings[0] + else: + raise ValueError("Non-float embeddings are not supported.") diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 2f85c49bf..7a2f39cd6 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from collections.abc import Iterator from attrs import define, field, Factory from griptape.artifacts import TextArtifact @@ -21,7 +21,7 @@ class CoherePromptDriver(BasePromptDriver): tokenizer: Custom `CohereTokenizer`. """ - api_key: str = field(kw_only=True, metadata={"serializable": True}) + api_key: str = field(kw_only=True, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) client: Client = field( default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), @@ -33,33 +33,37 @@ class CoherePromptDriver(BasePromptDriver): ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - result = self.client.generate(**self._base_params(prompt_stack)) + result = self.client.chat(**self._base_params(prompt_stack)) - if result.generations: - if len(result.generations) == 1: - generation = result.generations[0] - - return TextArtifact(value=generation.text.strip()) - else: - raise Exception("completion with more than one choice is not supported yet") - else: - raise Exception("model response is empty") + return TextArtifact(value=result.text) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - result = self.client.generate( - **self._base_params(prompt_stack), - stream=True, # pyright: ignore[reportCallIssue] - ) + result = self.client.chat_stream(**self._base_params(prompt_stack)) - for chunk in result: - yield TextArtifact(value=chunk.text) + for event in result: + if event.event_type == "text-generation": + yield TextArtifact(value=event.text) def _base_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_string(prompt_stack) + user_message = prompt_stack.inputs[-1].content + history_messages = [self.__to_cohere_message(input) for input in prompt_stack.inputs[:-1]] + return { - "prompt": self.prompt_stack_to_string(prompt_stack), - "model": self.model, + "message": user_message, + "chat_history": history_messages, "temperature": self.temperature, - "end_sequences": self.tokenizer.stop_sequences, - "max_tokens": self.max_output_tokens(prompt), + "stop_sequences": self.tokenizer.stop_sequences, } + + def __to_cohere_message(self, input: PromptStack.Input) -> dict[str, Any]: + return {"role": self.__to_cohere_role(input.role), "text": input.content} + + def __to_cohere_role(self, role: str) -> str: + if role == PromptStack.SYSTEM_ROLE: + return "SYSTEM" + if role == PromptStack.USER_ROLE: + return "USER" + elif role == PromptStack.ASSISTANT_ROLE: + return "CHATBOT" + else: + return "USER" diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 79ae5e51f..2dd454b53 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -110,6 +110,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: from typing import Any boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any + Client = import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any attrs.resolve_types( attrs_cls, @@ -122,6 +123,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: "BaseTokenizer": BaseTokenizer, "BasePromptModelDriver": BasePromptModelDriver, "boto3": boto3, + "Client": Client, }, ) diff --git a/griptape/tokenizers/cohere_tokenizer.py b/griptape/tokenizers/cohere_tokenizer.py index 0a3c6a236..e6845d9ca 100644 --- a/griptape/tokenizers/cohere_tokenizer.py +++ b/griptape/tokenizers/cohere_tokenizer.py @@ -9,8 +9,8 @@ @define() class CohereTokenizer(BaseTokenizer): - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"command": 4096} - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"command": 4096} + MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"command-r": 128000, "command": 4096, "embed": 512} + MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"command": 4096, "embed": 512} client: Client = field(kw_only=True) diff --git a/poetry.lock b/poetry.lock index c89d577b4..65e767cc5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -955,13 +955,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cohere" -version = "5.5.0" +version = "5.5.4" description = "" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-5.5.0-py3-none-any.whl", hash = "sha256:7792e8898c95f2cb955b2d9f23b8602f73f3b698d59f1a1b4896c53809671da0"}, - {file = "cohere-5.5.0.tar.gz", hash = "sha256:00b492ebf8921e83cb2371f2ee36ddf301422daae3024343a87d4316f02b711b"}, + {file = "cohere-5.5.4-py3-none-any.whl", hash = "sha256:8b692dcb5e86b554e5884168a7d2454951ce102fbd983e9053ec933e06bf02fa"}, + {file = "cohere-5.5.4.tar.gz", hash = "sha256:14acb2ccf272e958f79f9241ae972fd82e96b9b8ee9e6922a5687370761203ec"}, ] [package.dependencies] @@ -971,7 +971,7 @@ httpx = ">=0.21.2" httpx-sse = ">=0.4.0,<0.5.0" pydantic = ">=1.9.2" requests = ">=2.0.0,<3.0.0" -tokenizers = ">=0.19,<0.20" +tokenizers = ">=0.15,<0.16" types-requests = ">=2.0.0,<3.0.0" typing_extensions = ">=4.0.0" @@ -5263,120 +5263,130 @@ files = [ [[package]] name = "tokenizers" -version = "0.19.1" +version = "0.15.2" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, - {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, - {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, - {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, - {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, - {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, - {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, - {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, - {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, - {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, - {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, - {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, + {file = "tokenizers-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:52f6130c9cbf70544287575a985bf44ae1bda2da7e8c24e97716080593638012"}, + {file = "tokenizers-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:054c1cc9c6d68f7ffa4e810b3d5131e0ba511b6e4be34157aa08ee54c2f8d9ee"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9b9b070fdad06e347563b88c278995735292ded1132f8657084989a4c84a6d5"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea621a7eef4b70e1f7a4e84dd989ae3f0eeb50fc8690254eacc08acb623e82f1"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf7fd9a5141634fa3aa8d6b7be362e6ae1b4cda60da81388fa533e0b552c98fd"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44f2a832cd0825295f7179eaf173381dc45230f9227ec4b44378322d900447c9"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b9ec69247a23747669ec4b0ca10f8e3dfb3545d550258129bd62291aabe8605"}, + {file = "tokenizers-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b6a4c78da863ff26dbd5ad9a8ecc33d8a8d97b535172601cf00aee9d7ce9ce"}, + {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5ab2a4d21dcf76af60e05af8063138849eb1d6553a0d059f6534357bce8ba364"}, + {file = "tokenizers-0.15.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a47acfac7e511f6bbfcf2d3fb8c26979c780a91e06fb5b9a43831b2c0153d024"}, + {file = "tokenizers-0.15.2-cp310-none-win32.whl", hash = "sha256:064ff87bb6acdbd693666de9a4b692add41308a2c0ec0770d6385737117215f2"}, + {file = "tokenizers-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3b919afe4df7eb6ac7cafd2bd14fb507d3f408db7a68c43117f579c984a73843"}, + {file = "tokenizers-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:89cd1cb93e4b12ff39bb2d626ad77e35209de9309a71e4d3d4672667b4b256e7"}, + {file = "tokenizers-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfed5c64e5be23d7ee0f0e98081a25c2a46b0b77ce99a4f0605b1ec43dd481fa"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a907d76dcfda37023ba203ab4ceeb21bc5683436ebefbd895a0841fd52f6f6f2"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ea60479de6fc7b8ae756b4b097572372d7e4032e2521c1bbf3d90c90a99ff0"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:48e2b9335be2bc0171df9281385c2ed06a15f5cf121c44094338306ab7b33f2c"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:112a1dd436d2cc06e6ffdc0b06d55ac019a35a63afd26475205cb4b1bf0bfbff"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4620cca5c2817177ee8706f860364cc3a8845bc1e291aaf661fb899e5d1c45b0"}, + {file = "tokenizers-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd73a82751c523b3fc31ff8194702e4af4db21dc20e55b30ecc2079c5d43cb7"}, + {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:107089f135b4ae7817affe6264f8c7a5c5b4fd9a90f9439ed495f54fcea56fb4"}, + {file = "tokenizers-0.15.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0ff110ecc57b7aa4a594396525a3451ad70988e517237fe91c540997c4e50e29"}, + {file = "tokenizers-0.15.2-cp311-none-win32.whl", hash = "sha256:6d76f00f5c32da36c61f41c58346a4fa7f0a61be02f4301fd30ad59834977cc3"}, + {file = "tokenizers-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:cc90102ed17271cf0a1262babe5939e0134b3890345d11a19c3145184b706055"}, + {file = "tokenizers-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f86593c18d2e6248e72fb91c77d413a815153b8ea4e31f7cd443bdf28e467670"}, + {file = "tokenizers-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0774bccc6608eca23eb9d620196687c8b2360624619623cf4ba9dc9bd53e8b51"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d0222c5b7c9b26c0b4822a82f6a7011de0a9d3060e1da176f66274b70f846b98"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3835738be1de66624fff2f4f6f6684775da4e9c00bde053be7564cbf3545cc66"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0143e7d9dcd811855c1ce1ab9bf5d96d29bf5e528fd6c7824d0465741e8c10fd"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db35825f6d54215f6b6009a7ff3eedee0848c99a6271c870d2826fbbedf31a38"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f5e64b0389a2be47091d8cc53c87859783b837ea1a06edd9d8e04004df55a5c"}, + {file = "tokenizers-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e0480c452217edd35eca56fafe2029fb4d368b7c0475f8dfa3c5c9c400a7456"}, + {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a33ab881c8fe70474980577e033d0bc9a27b7ab8272896e500708b212995d834"}, + {file = "tokenizers-0.15.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a308a607ca9de2c64c1b9ba79ec9a403969715a1b8ba5f998a676826f1a7039d"}, + {file = "tokenizers-0.15.2-cp312-none-win32.whl", hash = "sha256:b8fcfa81bcb9447df582c5bc96a031e6df4da2a774b8080d4f02c0c16b42be0b"}, + {file = "tokenizers-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:38d7ab43c6825abfc0b661d95f39c7f8af2449364f01d331f3b51c94dcff7221"}, + {file = "tokenizers-0.15.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:38bfb0204ff3246ca4d5e726e8cc8403bfc931090151e6eede54d0e0cf162ef0"}, + {file = "tokenizers-0.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c861d35e8286a53e06e9e28d030b5a05bcbf5ac9d7229e561e53c352a85b1fc"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:936bf3842db5b2048eaa53dade907b1160f318e7c90c74bfab86f1e47720bdd6"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620beacc3373277700d0e27718aa8b25f7b383eb8001fba94ee00aeea1459d89"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2735ecbbf37e52db4ea970e539fd2d450d213517b77745114f92867f3fc246eb"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:473c83c5e2359bb81b0b6fde870b41b2764fcdd36d997485e07e72cc3a62264a"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968fa1fb3c27398b28a4eca1cbd1e19355c4d3a6007f7398d48826bbe3a0f728"}, + {file = "tokenizers-0.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:865c60ae6eaebdde7da66191ee9b7db52e542ed8ee9d2c653b6d190a9351b980"}, + {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7c0d8b52664ab2d4a8d6686eb5effc68b78608a9008f086a122a7b2996befbab"}, + {file = "tokenizers-0.15.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f33dfbdec3784093a9aebb3680d1f91336c56d86cc70ddf88708251da1fe9064"}, + {file = "tokenizers-0.15.2-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d44ba80988ff9424e33e0a49445072ac7029d8c0e1601ad25a0ca5f41ed0c1d6"}, + {file = "tokenizers-0.15.2-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:dce74266919b892f82b1b86025a613956ea0ea62a4843d4c4237be2c5498ed3a"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0ef06b9707baeb98b316577acb04f4852239d856b93e9ec3a299622f6084e4be"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73e2e74bbb07910da0d37c326869f34113137b23eadad3fc00856e6b3d9930c"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eeb12daf02a59e29f578a865f55d87cd103ce62bd8a3a5874f8fdeaa82e336b"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ba9f6895af58487ca4f54e8a664a322f16c26bbb442effd01087eba391a719e"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccec77aa7150e38eec6878a493bf8c263ff1fa8a62404e16c6203c64c1f16a26"}, + {file = "tokenizers-0.15.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f40604f5042ff210ba82743dda2b6aa3e55aa12df4e9f2378ee01a17e2855e"}, + {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5645938a42d78c4885086767c70923abad047163d809c16da75d6b290cb30bbe"}, + {file = "tokenizers-0.15.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05a77cbfebe28a61ab5c3891f9939cc24798b63fa236d84e5f29f3a85a200c00"}, + {file = "tokenizers-0.15.2-cp37-none-win32.whl", hash = "sha256:361abdc068e8afe9c5b818769a48624687fb6aaed49636ee39bec4e95e1a215b"}, + {file = "tokenizers-0.15.2-cp37-none-win_amd64.whl", hash = "sha256:7ef789f83eb0f9baeb4d09a86cd639c0a5518528f9992f38b28e819df397eb06"}, + {file = "tokenizers-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4fe1f74a902bee74a3b25aff180fbfbf4f8b444ab37c4d496af7afd13a784ed2"}, + {file = "tokenizers-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4b89038a684f40a6b15d6b09f49650ac64d951ad0f2a3ea9169687bbf2a8ba"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d05a1b06f986d41aed5f2de464c003004b2df8aaf66f2b7628254bcbfb72a438"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508711a108684111ec8af89d3a9e9e08755247eda27d0ba5e3c50e9da1600f6d"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:daa348f02d15160cb35439098ac96e3a53bacf35885072611cd9e5be7d333daa"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:494fdbe5932d3416de2a85fc2470b797e6f3226c12845cadf054dd906afd0442"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2d60f5246f4da9373f75ff18d64c69cbf60c3bca597290cea01059c336d2470"}, + {file = "tokenizers-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93268e788825f52de4c7bdcb6ebc1fcd4a5442c02e730faa9b6b08f23ead0e24"}, + {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6fc7083ab404019fc9acafe78662c192673c1e696bd598d16dc005bd663a5cf9"}, + {file = "tokenizers-0.15.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e39b41e5531d6b2122a77532dbea60e171ef87a3820b5a3888daa847df4153"}, + {file = "tokenizers-0.15.2-cp38-none-win32.whl", hash = "sha256:06cd0487b1cbfabefb2cc52fbd6b1f8d4c37799bd6c6e1641281adaa6b2504a7"}, + {file = "tokenizers-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:5179c271aa5de9c71712e31cb5a79e436ecd0d7532a408fa42a8dbfa4bc23fd9"}, + {file = "tokenizers-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82f8652a74cc107052328b87ea8b34291c0f55b96d8fb261b3880216a9f9e48e"}, + {file = "tokenizers-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02458bee6f5f3139f1ebbb6d042b283af712c0981f5bc50edf771d6b762d5e4f"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c9a09cd26cca2e1c349f91aa665309ddb48d71636370749414fbf67bc83c5343"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:158be8ea8554e5ed69acc1ce3fbb23a06060bd4bbb09029431ad6b9a466a7121"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ddba9a2b0c8c81633eca0bb2e1aa5b3a15362b1277f1ae64176d0f6eba78ab1"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ef5dd1d39797044642dbe53eb2bc56435308432e9c7907728da74c69ee2adca"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:454c203164e07a860dbeb3b1f4a733be52b0edbb4dd2e5bd75023ffa8b49403a"}, + {file = "tokenizers-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf6b7f1d4dc59af960e6ffdc4faffe6460bbfa8dce27a58bf75755ffdb2526d"}, + {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2ef09bbc16519f6c25d0c7fc0c6a33a6f62923e263c9d7cca4e58b8c61572afb"}, + {file = "tokenizers-0.15.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c9a2ebdd2ad4ec7a68e7615086e633857c85e2f18025bd05d2a4399e6c5f7169"}, + {file = "tokenizers-0.15.2-cp39-none-win32.whl", hash = "sha256:918fbb0eab96fe08e72a8c2b5461e9cce95585d82a58688e7f01c2bd546c79d0"}, + {file = "tokenizers-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:524e60da0135e106b254bd71f0659be9f89d83f006ea9093ce4d1fab498c6d0d"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9b648a58281c4672212fab04e60648fde574877d0139cd4b4f93fe28ca8944"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c7d18b733be6bbca8a55084027f7be428c947ddf871c500ee603e375013ffba"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:13ca3611de8d9ddfbc4dc39ef54ab1d2d4aaa114ac8727dfdc6a6ec4be017378"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:237d1bf3361cf2e6463e6c140628e6406766e8b27274f5fcc62c747ae3c6f094"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67a0fe1e49e60c664915e9fb6b0cb19bac082ab1f309188230e4b2920230edb3"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e022fe65e99230b8fd89ebdfea138c24421f91c1a4f4781a8f5016fd5cdfb4d"}, + {file = "tokenizers-0.15.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d857be2df69763362ac699f8b251a8cd3fac9d21893de129bc788f8baaef2693"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:708bb3e4283177236309e698da5fcd0879ce8fd37457d7c266d16b550bcbbd18"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c35e09e9899b72a76e762f9854e8750213f67567787d45f37ce06daf57ca78"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1257f4394be0d3b00de8c9e840ca5601d0a4a8438361ce9c2b05c7d25f6057b"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02272fe48280e0293a04245ca5d919b2c94a48b408b55e858feae9618138aeda"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dc3ad9ebc76eabe8b1d7c04d38be884b8f9d60c0cdc09b0aa4e3bcf746de0388"}, + {file = "tokenizers-0.15.2-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:32e16bdeffa7c4f46bf2152172ca511808b952701d13e7c18833c0b73cb5c23f"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fb16ba563d59003028b678d2361a27f7e4ae0ab29c7a80690efa20d829c81fdb"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:2277c36d2d6cdb7876c274547921a42425b6810d38354327dd65a8009acf870c"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cf75d32e8d250781940d07f7eece253f2fe9ecdb1dc7ba6e3833fa17b82fcbc"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b3b31884dc8e9b21508bb76da80ebf7308fdb947a17affce815665d5c4d028"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10122d8d8e30afb43bb1fe21a3619f62c3e2574bff2699cf8af8b0b6c5dc4a3"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d88b96ff0fe8e91f6ef01ba50b0d71db5017fa4e3b1d99681cec89a85faf7bf7"}, + {file = "tokenizers-0.15.2-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:37aaec5a52e959892870a7c47cef80c53797c0db9149d458460f4f31e2fb250e"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2ea752f2b0fe96eb6e2f3adbbf4d72aaa1272079b0dfa1145507bd6a5d537e6"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b19a808d8799fda23504a5cd31d2f58e6f52f140380082b352f877017d6342b"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:64c86e5e068ac8b19204419ed8ca90f9d25db20578f5881e337d203b314f4104"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de19c4dc503c612847edf833c82e9f73cd79926a384af9d801dcf93f110cea4e"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea09acd2fe3324174063d61ad620dec3bcf042b495515f27f638270a7d466e8b"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cf27fd43472e07b57cf420eee1e814549203d56de00b5af8659cb99885472f1f"}, + {file = "tokenizers-0.15.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7ca22bd897537a0080521445d91a58886c8c04084a6a19e6c78c586e0cfa92a5"}, + {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, ] [package.dependencies] -huggingface-hub = ">=0.16.4,<1.0" +huggingface_hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] [[package]] name = "tomli" @@ -5515,39 +5525,41 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.41.2" +version = "4.39.3" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.41.2-py3-none-any.whl", hash = "sha256:05555d20e43f808de1ef211ab64803cdb513170cef70d29a888b589caebefc67"}, - {file = "transformers-4.41.2.tar.gz", hash = "sha256:80a4db216533d573e9cc7388646c31ed9480918feb7c55eb211249cb23567f87"}, + {file = "transformers-4.39.3-py3-none-any.whl", hash = "sha256:7838034a12cca3168247f9d2d1dba6724c9de3ae0f73a108258c6b8fc5912601"}, + {file = "transformers-4.39.3.tar.gz", hash = "sha256:2586e5ff4150f122716fc40f5530e92871befc051848fbe82600969c535b762d"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.23.0,<1.0" +huggingface-hub = ">=0.19.3,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" -tokenizers = ">=0.19,<0.20" +tokenizers = ">=0.14,<0.19" tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] @@ -5557,7 +5569,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (==0.1.5)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] @@ -5566,16 +5578,16 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] -tokenizers = ["tokenizers (>=0.19,<0.20)"] +tokenizers = ["tokenizers (>=0.14,<0.19)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -6047,6 +6059,7 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] +drivers-embedding-cohere = ["cohere"] drivers-embedding-google = ["google-generativeai"] drivers-embedding-huggingface = ["huggingface-hub", "transformers"] drivers-embedding-voyageai = ["voyageai"] @@ -6083,4 +6096,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "658965f94fd55e2ff1ee9e3579854d247344ce9da8b2f8f8a08826a515fb2aff" +content-hash = "7d073f2b3d8b7e16b3315c7c59925884fadda9c0b0c179b191a748de669f2e0c" diff --git a/pyproject.toml b/pyproject.toml index c82cb8e26..b750051e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,9 +31,9 @@ dateparser = "^1.1.8" requests = "^2" # drivers -cohere = { version = ">=4", optional = true } +cohere = { version = "^5.5.4", optional = true } anthropic = { version = "^0.20.0", optional = true } -transformers = { version = "^4.41.2", optional = true } +transformers = { version = "^4.39.3", optional = true } huggingface-hub = { version = ">=0.13", optional = true } boto3 = { version = "^1.28.2", optional = true } sqlalchemy-redshift = { version = "*", optional = true } @@ -91,6 +91,7 @@ drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-huggingface = ["huggingface-hub", "transformers"] drivers-embedding-voyageai = ["voyageai"] drivers-embedding-google = ["google-generativeai"] +drivers-embedding-cohere = ["cohere"] drivers-web-scraper-trafilatura = ["trafilatura"] drivers-web-scraper-markdownify = ["playwright", "beautifulsoup4", "markdownify"] diff --git a/tests/unit/config/test_cohere_structure_config.py b/tests/unit/config/test_cohere_structure_config.py new file mode 100644 index 000000000..1dc585421 --- /dev/null +++ b/tests/unit/config/test_cohere_structure_config.py @@ -0,0 +1,38 @@ +from pytest import fixture +from griptape.config import CohereStructureConfig + + +class TestCohereStructureConfig: + @fixture + def config(self): + return CohereStructureConfig(api_key="api_key") + + def test_to_dict(self, config): + assert config.to_dict() == { + "type": "CohereStructureConfig", + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + "prompt_driver": { + "type": "CoherePromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "model": "command-r", + }, + "embedding_driver": { + "type": "CohereEmbeddingDriver", + "model": "embed-english-v3.0", + "input_type": "search_document", + }, + "vector_store_driver": { + "type": "LocalVectorStoreDriver", + "embedding_driver": { + "type": "CohereEmbeddingDriver", + "model": "embed-english-v3.0", + "input_type": "search_document", + }, + }, + } diff --git a/tests/unit/drivers/embedding/test_cohere_embedding_driver.py b/tests/unit/drivers/embedding/test_cohere_embedding_driver.py new file mode 100644 index 000000000..af6a5576d --- /dev/null +++ b/tests/unit/drivers/embedding/test_cohere_embedding_driver.py @@ -0,0 +1,21 @@ +from unittest.mock import Mock +import pytest +from griptape.drivers import CohereEmbeddingDriver + + +class TestCohereEmbeddingDriver: + @pytest.fixture(autouse=True) + def mock_client(self, mocker): + mock_client = mocker.patch("cohere.Client").return_value + + mock_client.embed.return_value = Mock(embeddings=[[0, 1, 0]]) + + return mock_client + + def test_init(self): + assert CohereEmbeddingDriver(model="embed-english-v3.0", api_key="bar", input_type="search_document") + + def test_try_embed_chunk(self): + assert CohereEmbeddingDriver( + model="embed-english-v3.0", api_key="bar", input_type="search_document" + ).try_embed_chunk("foobar") == [0, 1, 0] diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index 907e27325..b3ceb11a4 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -8,16 +8,16 @@ class TestCoherePromptDriver: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value - mock_client.generate.return_value.generations = [Mock()] - mock_client.generate.return_value.generations[0].text = "model-output" + mock_client.chat.return_value = Mock(text="model-output") + return mock_client @pytest.fixture def mock_stream_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value - mock_chunk = Mock() - mock_chunk.text = "model-output" - mock_client.generate.return_value = iter([mock_chunk]) + mock_chunk = Mock(text="model-output", event_type="text-generation") + mock_client.chat_stream.return_value = iter([mock_chunk]) + return mock_client @pytest.fixture(autouse=True) @@ -55,16 +55,3 @@ def test_try_stream_run(self, mock_stream_client, prompt_stack): # pyright: ign # Then assert text_artifact.value == "model-output" - - @pytest.mark.parametrize("choices", [[], [1, 2]]) - def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_client, prompt_stack): - # Given - driver = CoherePromptDriver(model="command", api_key="api-key") - mock_client.generate.return_value.generations = choices - - # When - with pytest.raises(Exception) as e: - driver.try_run(prompt_stack) - - # Then - e.value.args[0] == "Completion with more than one choice is not supported yet." diff --git a/tests/unit/tokenizers/test_cohere_tokenizer.py b/tests/unit/tokenizers/test_cohere_tokenizer.py index ca724cee6..9ca23f4f0 100644 --- a/tests/unit/tokenizers/test_cohere_tokenizer.py +++ b/tests/unit/tokenizers/test_cohere_tokenizer.py @@ -7,6 +7,7 @@ class TestCohereTokenizer: @pytest.fixture(autouse=True) def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value.tokenize.return_value.tokens = ["foo", "bar"] + return mock_client @pytest.fixture From e167885dff5d07a087174836433e2697823e1ab5 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 5 Jun 2024 12:22:26 -0700 Subject: [PATCH 081/238] Update BedrockPromptDriver to use Converse API (#834) --- CHANGELOG.md | 10 ++ .../drivers/prompt-drivers.md | 160 +++++------------- .../structures/task-memory.md | 2 - .../config/amazon_bedrock_structure_config.py | 7 +- griptape/drivers/__init__.py | 8 - .../amazon_bedrock_cohere_embedding_driver.py | 6 +- .../amazon_bedrock_titan_embedding_driver.py | 6 +- .../prompt/amazon_bedrock_prompt_driver.py | 70 ++++---- .../bedrock_claude_prompt_model_driver.py | 87 ---------- .../bedrock_jurassic_prompt_model_driver.py | 76 --------- .../bedrock_llama_prompt_model_driver.py | 101 ----------- .../bedrock_titan_prompt_model_driver.py | 83 --------- griptape/tokenizers/__init__.py | 10 -- .../tokenizers/bedrock_claude_tokenizer.py | 12 -- .../tokenizers/bedrock_cohere_tokenizer.py | 14 -- .../tokenizers/bedrock_jurassic_tokenizer.py | 20 --- .../tokenizers/bedrock_llama_tokenizer.py | 14 -- .../tokenizers/bedrock_titan_tokenizer.py | 14 -- griptape/tokenizers/simple_tokenizer.py | 2 + poetry.lock | 16 +- pyproject.toml | 2 +- .../test_amazon_bedrock_structure_config.py | 1 - .../test_amazon_bedrock_prompt_driver.py | 152 +++++++---------- ...test_bedrock_claude_prompt_model_driver.py | 129 -------------- ...st_bedrock_jurassic_prompt_model_driver.py | 71 -------- .../test_bedrock_llama_prompt_model_driver.py | 64 ------- .../test_bedrock_titan_prompt_model_driver.py | 58 ------- .../test_bedrock_claude_tokenizer.py | 47 ----- .../test_bedrock_cohere_tokenizer.py | 25 --- .../test_bedrock_jurassic_tokenizer.py | 39 ----- .../test_bedrock_llama_tokenizer.py | 35 ---- .../test_bedrock_titan_tokenizer.py | 31 ---- tests/utils/structure_tester.py | 105 ++++++------ 33 files changed, 224 insertions(+), 1253 deletions(-) delete mode 100644 griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py delete mode 100644 griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py delete mode 100644 griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py delete mode 100644 griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py delete mode 100644 griptape/tokenizers/bedrock_claude_tokenizer.py delete mode 100644 griptape/tokenizers/bedrock_cohere_tokenizer.py delete mode 100644 griptape/tokenizers/bedrock_jurassic_tokenizer.py delete mode 100644 griptape/tokenizers/bedrock_llama_tokenizer.py delete mode 100644 griptape/tokenizers/bedrock_titan_tokenizer.py delete mode 100644 tests/unit/drivers/prompt_models/test_bedrock_claude_prompt_model_driver.py delete mode 100644 tests/unit/drivers/prompt_models/test_bedrock_jurassic_prompt_model_driver.py delete mode 100644 tests/unit/drivers/prompt_models/test_bedrock_llama_prompt_model_driver.py delete mode 100644 tests/unit/drivers/prompt_models/test_bedrock_titan_prompt_model_driver.py delete mode 100644 tests/unit/tokenizers/test_bedrock_claude_tokenizer.py delete mode 100644 tests/unit/tokenizers/test_bedrock_cohere_tokenizer.py delete mode 100644 tests/unit/tokenizers/test_bedrock_jurassic_tokenizer.py delete mode 100644 tests/unit/tokenizers/test_bedrock_llama_tokenizer.py delete mode 100644 tests/unit/tokenizers/test_bedrock_titan_tokenizer.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 189dd785d..ad589408c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. +- **BREAKING**: Removed `AmazonBedrockPromptDriver.prompt_model_driver` as it is no longer needed with the `AmazonBedrockPromptDriver` Converse API implementation. +- **BREAKING**: Removed `BedrockClaudePromptModelDriver`. +- **BREAKING**: Removed `BedrockJurassicPromptModelDriver`. +- **BREAKING**: Removed `BedrockLlamaPromptModelDriver`. +- **BREAKING**: Removed `BedrockTitanPromptModelDriver`. +- **BREAKING**: Removed `BedrockClaudeTokenizer`, use `SimpleTokenizer` instead. +- **BREAKING**: Removed `BedrockJurassicTokenizer`, use `SimpleTokenizer` instead. +- **BREAKING**: Removed `BedrockLlamaTokenizer`, use `SimpleTokenizer` instead. +- **BREAKING**: Removed `BedrockTitanTokenizer`, use `SimpleTokenizer` instead. +- Updated `AmazonBedrockPromptDriver` to use [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. - Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index c659c7e82..859dcec03 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -232,6 +232,47 @@ agent = Agent( agent.run('Briefly explain how a computer works to a young child.') ``` +### Amazon Bedrock + +!!! info + This driver requires the `drivers-prompt-amazon-bedrock` [extra](../index.md#extras). + +The [AmazonBedrockPromptDriver](../../reference/griptape/drivers/prompt/amazon_bedrock_prompt_driver.md) uses [Amazon Bedrock](https://aws.amazon.com/bedrock/)'s [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). + +All models supported by the Converse API are available for use with this driver. + +```python +from griptape.structures import Agent +from griptape.drivers import AmazonBedrockPromptDriver +from griptape.rules import Rule +from griptape.config import StructureConfig + +agent = Agent( + config=StructureConfig( + prompt_driver=AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + ) + ), + rules=[ + Rule( + value="You are a customer service agent that is classifying emails by type. I want you to give your answer and then explain it." + ) + ], +) +agent.run( + """How would you categorize this email? + + Can I use my Mixmaster 4000 to mix paint, or is it only meant for mixing food? + + + Categories are: + (A) Pre-sale question + (B) Broken or defective item + (C) Billing question + (D) Other (please explain)""" +) +``` + ### Hugging Face Hub !!! info @@ -339,7 +380,7 @@ agent.run("How many helicopters can a human eat in one sitting?") ``` ### Multi Model Prompt Drivers -Certain LLM providers such as Amazon SageMaker and Amazon Bedrock supports many types of models, each with their own slight differences in prompt structure and parameters. To support this variation across models, these Prompt Drivers takes a [Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md) +Certain LLM providers such as Amazon SageMaker support many types of models, each with their own slight differences in prompt structure and parameters. To support this variation across models, these Prompt Drivers takes a [Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md) through the [prompt_model_driver](../../reference/griptape/drivers/prompt/base_multi_model_prompt_driver.md#griptape.drivers.prompt.base_multi_model_prompt_driver.BaseMultiModelPromptDriver.prompt_model_driver) parameter. [Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md)s allows for model-specific customization for Prompt Drivers. @@ -422,120 +463,3 @@ agent = Agent( agent.run("What is a good lasagna recipe?") ``` - -#### Amazon Bedrock - -!!! info - This driver requires the `drivers-prompt-amazon-bedrock` [extra](../index.md#extras). - -The [AmazonBedrockPromptDriver](../../reference/griptape/drivers/prompt/amazon_bedrock_prompt_driver.md) uses [Amazon Bedrock](https://aws.amazon.com/bedrock/) for inference on AWS. - -##### Amazon Titan - -To use this model with Amazon Bedrock, use the [BedrockTitanPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.md). - -```python -from griptape.structures import Agent -from griptape.drivers import AmazonBedrockPromptDriver, BedrockTitanPromptModelDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="amazon.titan-text-express-v1", - prompt_model_driver=BedrockTitanPromptModelDriver( - top_p=1, - ) - ) - ) -) -agent.run( - "Write an informational article for children about how birds fly." - "Compare how birds fly to how airplanes fly." - 'Make sure to use the word "Thrust" at least three times.' -) -``` - -##### Anthropic Claude - -To use this model with Amazon Bedrock, use the [BedrockClaudePromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.md). - -```python -from griptape.structures import Agent -from griptape.drivers import AmazonBedrockPromptDriver, BedrockClaudePromptModelDriver -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - prompt_model_driver=BedrockClaudePromptModelDriver( - top_p=1, - ) - ) - ), - rules=[ - Rule( - value="You are a customer service agent that is classifying emails by type. I want you to give your answer and then explain it." - ) - ], -) -agent.run( - """How would you categorize this email? - - Can I use my Mixmaster 4000 to mix paint, or is it only meant for mixing food? - - - Categories are: - (A) Pre-sale question - (B) Broken or defective item - (C) Billing question - (D) Other (please explain)""" -) -``` -##### Meta Llama 2 - -To use this model with Amazon Bedrock, use the [BedrockLlamaPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.md). - -```python -from griptape.structures import Agent -from griptape.drivers import AmazonBedrockPromptDriver, BedrockLlamaPromptModelDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="meta.llama2-13b-chat-v1", - prompt_model_driver=BedrockLlamaPromptModelDriver(), - ) - ) -) -agent.run( - "Write an article about impact of high inflation to GDP of a country" -) -``` - -##### Ai21 Jurassic - -To use this model with Amazon Bedrock, use the [BedrockJurassicPromptModelDriver](../../reference/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.md). - -```python -from griptape.structures import Agent -from griptape.drivers import AmazonBedrockPromptDriver, BedrockJurassicPromptModelDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="ai21.j2-ultra-v1", - prompt_model_driver=BedrockJurassicPromptModelDriver(top_p=0.95), - temperature=0.7, - ) - ) -) -agent.run( - "Suggest an outline for a blog post based on a title. " - "Title: How I put the pro in prompt engineering." -) -``` diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index f76094dad..219fd4412 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -206,7 +206,6 @@ from griptape.config import ( ) from griptape.drivers import ( AmazonBedrockPromptDriver, - BedrockTitanPromptModelDriver, AmazonBedrockTitanEmbeddingDriver, LocalVectorStoreDriver, OpenAiChatPromptDriver, @@ -227,7 +226,6 @@ agent = Agent( query_engine=VectorQueryEngine( prompt_driver=AmazonBedrockPromptDriver( model="amazon.titan-text-express-v1", - prompt_model_driver=BedrockTitanPromptModelDriver(), ), vector_store_driver=LocalVectorStoreDriver( embedding_driver=AmazonBedrockTitanEmbeddingDriver() diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_structure_config.py index cefb97f57..e70d9c819 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_structure_config.py @@ -11,7 +11,6 @@ BasePromptDriver, BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, - BedrockClaudePromptModelDriver, BedrockTitanImageGenerationModelDriver, LocalVectorStoreDriver, ) @@ -21,11 +20,7 @@ class AmazonBedrockStructureConfig(StructureConfig): prompt_driver: BasePromptDriver = field( default=Factory( - lambda: AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - stream=False, - prompt_model_driver=BedrockClaudePromptModelDriver(), - ) + lambda: AmazonBedrockPromptDriver(model="anthropic.claude-3-sonnet-20240229-v1:0", stream=False) ), metadata={"serializable": True}, ) diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 3050989fe..02a3882fb 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -55,10 +55,6 @@ from .prompt_model.base_prompt_model_driver import BasePromptModelDriver from .prompt_model.sagemaker_llama_prompt_model_driver import SageMakerLlamaPromptModelDriver from .prompt_model.sagemaker_falcon_prompt_model_driver import SageMakerFalconPromptModelDriver -from .prompt_model.bedrock_titan_prompt_model_driver import BedrockTitanPromptModelDriver -from .prompt_model.bedrock_claude_prompt_model_driver import BedrockClaudePromptModelDriver -from .prompt_model.bedrock_jurassic_prompt_model_driver import BedrockJurassicPromptModelDriver -from .prompt_model.bedrock_llama_prompt_model_driver import BedrockLlamaPromptModelDriver from .image_generation_model.base_image_generation_model_driver import BaseImageGenerationModelDriver from .image_generation_model.bedrock_stable_diffusion_image_generation_model_driver import ( @@ -165,10 +161,6 @@ "BasePromptModelDriver", "SageMakerLlamaPromptModelDriver", "SageMakerFalconPromptModelDriver", - "BedrockTitanPromptModelDriver", - "BedrockClaudePromptModelDriver", - "BedrockJurassicPromptModelDriver", - "BedrockLlamaPromptModelDriver", "BaseImageGenerationModelDriver", "BedrockStableDiffusionImageGenerationModelDriver", "BedrockTitanImageGenerationModelDriver", diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index 15ce67c4c..54ac78b45 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -3,7 +3,7 @@ from typing import Any, TYPE_CHECKING from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver -from griptape.tokenizers import BedrockCohereTokenizer +from griptape.tokenizers.simple_tokenizer import SimpleTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -28,8 +28,8 @@ class AmazonBedrockCohereEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True) input_type: str = field(default="search_query", kw_only=True) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - tokenizer: BedrockCohereTokenizer = field( - default=Factory(lambda self: BedrockCohereTokenizer(model=self.model), takes_self=True), kw_only=True + tokenizer: SimpleTokenizer = field( + default=Factory(lambda self: SimpleTokenizer(characters_per_token=4), takes_self=True), kw_only=True ) bedrock_client: Any = field( default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index a510c618c..c6a692bf3 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -3,7 +3,7 @@ from typing import Any, TYPE_CHECKING from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver -from griptape.tokenizers import BedrockTitanTokenizer +from griptape.tokenizers import SimpleTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -24,8 +24,8 @@ class AmazonBedrockTitanEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - tokenizer: BedrockTitanTokenizer = field( - default=Factory(lambda self: BedrockTitanTokenizer(model=self.model), takes_self=True), kw_only=True + tokenizer: SimpleTokenizer = field( + default=Factory(lambda self: SimpleTokenizer(characters_per_token=4), takes_self=True), kw_only=True ) bedrock_client: Any = field( default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 0675e7f92..f3d03a684 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -1,11 +1,11 @@ from __future__ import annotations -import json from typing import TYPE_CHECKING, Any from collections.abc import Iterator from attrs import define, field, Factory +from griptape.drivers import BasePromptDriver from griptape.artifacts import TextArtifact from griptape.utils import import_optional_dependency -from .base_multi_model_prompt_driver import BaseMultiModelPromptDriver +from griptape.tokenizers import SimpleTokenizer, BaseTokenizer if TYPE_CHECKING: from griptape.utils import PromptStack @@ -13,43 +13,55 @@ @define -class AmazonBedrockPromptDriver(BaseMultiModelPromptDriver): +class AmazonBedrockPromptDriver(BasePromptDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) bedrock_client: Any = field( default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True ) + additional_model_request_fields: dict = field(default=Factory(dict), kw_only=True) + tokenizer: BaseTokenizer = field(default=Factory(lambda: SimpleTokenizer(characters_per_token=4)), kw_only=True) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - model_input = self.prompt_model_driver.prompt_stack_to_model_input(prompt_stack) - payload = {**self.prompt_model_driver.prompt_stack_to_model_params(prompt_stack)} - if isinstance(model_input, dict): - payload.update(model_input) + response = self.bedrock_client.converse(**self._base_params(prompt_stack)) - response = self.bedrock_client.invoke_model( - modelId=self.model, contentType="application/json", accept="application/json", body=json.dumps(payload) - ) + output_message = response["output"]["message"] + output_content = output_message["content"][0]["text"] - response_body = response["body"].read() + return TextArtifact(output_content) - if response_body: - return self.prompt_model_driver.process_output(response_body) + def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + response = self.bedrock_client.converse_stream(**self._base_params(prompt_stack)) + + stream = response.get("stream") + if stream is not None: + for event in stream: + if "contentBlockDelta" in event: + yield TextArtifact(event["contentBlockDelta"]["delta"]["text"]) else: raise Exception("model response is empty") - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - model_input = self.prompt_model_driver.prompt_stack_to_model_input(prompt_stack) - payload = {**self.prompt_model_driver.prompt_stack_to_model_params(prompt_stack)} - if isinstance(model_input, dict): - payload.update(model_input) - - response = self.bedrock_client.invoke_model_with_response_stream( - modelId=self.model, contentType="application/json", accept="application/json", body=json.dumps(payload) - ) - - response_body = response["body"] - if response_body: - for chunk in response["body"]: - chunk_bytes = chunk["chunk"]["bytes"] - yield self.prompt_model_driver.process_output(chunk_bytes) + def _base_params(self, prompt_stack: PromptStack) -> dict: + system_messages = [ + {"text": input.content} for input in prompt_stack.inputs if input.is_system() and input.content + ] + messages = [ + {"role": self.__to_amazon_bedrock_role(input), "content": [{"text": input.content}]} + for input in prompt_stack.inputs + if not input.is_system() + ] + + return { + "modelId": self.model, + "messages": messages, + "system": system_messages, + "inferenceConfig": {"temperature": self.temperature}, + "additionalModelRequestFields": self.additional_model_request_fields, + } + + def __to_amazon_bedrock_role(self, prompt_input: PromptStack.Input) -> str: + if prompt_input.is_system(): + return "system" + elif prompt_input.is_assistant(): + return "assistant" else: - raise Exception("model response is empty") + return "user" diff --git a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py deleted file mode 100644 index 2b4c547a9..000000000 --- a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import annotations -from typing import Optional -import json -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptModelDriver, AmazonBedrockPromptDriver -from griptape.tokenizers import BedrockClaudeTokenizer - - -@define -class BedrockClaudePromptModelDriver(BasePromptModelDriver): - ANTHROPIC_VERSION = "bedrock-2023-05-31" # static string for AWS: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#api-inference-examples-claude-multimodal-code-example - - top_p: float = field(default=0.999, kw_only=True, metadata={"serializable": True}) - top_k: int = field(default=250, kw_only=True, metadata={"serializable": True}) - _tokenizer: BedrockClaudeTokenizer = field(default=None, kw_only=True) - prompt_driver: Optional[AmazonBedrockPromptDriver] = field(default=None, kw_only=True) - - @property - def tokenizer(self) -> BedrockClaudeTokenizer: - """Returns the tokenizer for this driver. - - We need to pass the `session` field from the Prompt Driver to the - Tokenizer. However, the Prompt Driver is not initialized until after - the Prompt Model Driver is initialized. To resolve this, we make the `tokenizer` - field a @property that is only initialized when it is first accessed. - This ensures that by the time we need to initialize the Tokenizer, the - Prompt Driver has already been initialized. - - See this thread more more information: https://github.com/griptape-ai/griptape/issues/244 - - Returns: - BedrockClaudeTokenizer: The tokenizer for this driver. - """ - if self._tokenizer: - return self._tokenizer - else: - self._tokenizer = BedrockClaudeTokenizer(model=self.prompt_driver.model) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> dict: - messages = [ - {"role": self.__to_anthropic_role(prompt_input), "content": prompt_input.content} - for prompt_input in prompt_stack.inputs - if not prompt_input.is_system() - ] - system = next((i for i in prompt_stack.inputs if i.is_system()), None) - - if system is None: - return {"messages": messages} - else: - return {"messages": messages, "system": system.content} - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - input = self.prompt_stack_to_model_input(prompt_stack) - - return { - "stop_sequences": self.tokenizer.stop_sequences, - "temperature": self.prompt_driver.temperature, - "top_p": self.top_p, - "top_k": self.top_k, - "max_tokens": self.prompt_driver.max_output_tokens(self.prompt_driver.prompt_stack_to_string(prompt_stack)), - "anthropic_version": self.ANTHROPIC_VERSION, - **input, - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - if isinstance(output, bytes): - body = json.loads(output.decode()) - else: - raise Exception("Output must be bytes.") - - if body["type"] == "content_block_delta": - return TextArtifact(value=body["delta"]["text"]) - elif body["type"] == "message": - return TextArtifact(value=body["content"][0]["text"]) - else: - return TextArtifact(value="") - - def __to_anthropic_role(self, prompt_input: PromptStack.Input) -> str: - if prompt_input.is_system(): - return "system" - elif prompt_input.is_assistant(): - return "assistant" - else: - return "user" diff --git a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py deleted file mode 100644 index 4da99e88f..000000000 --- a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations -from typing import Optional -import json -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptModelDriver -from griptape.tokenizers import BedrockJurassicTokenizer -from griptape.drivers import AmazonBedrockPromptDriver - - -@define -class BedrockJurassicPromptModelDriver(BasePromptModelDriver): - top_p: float = field(default=0.9, kw_only=True, metadata={"serializable": True}) - _tokenizer: BedrockJurassicTokenizer = field(default=None, kw_only=True) - prompt_driver: Optional[AmazonBedrockPromptDriver] = field(default=None, kw_only=True) - supports_streaming: bool = field(default=False, kw_only=True) - - @property - def tokenizer(self) -> BedrockJurassicTokenizer: - """Returns the tokenizer for this driver. - - We need to pass the `session` field from the Prompt Driver to the - Tokenizer. However, the Prompt Driver is not initialized until after - the Prompt Model Driver is initialized. To resolve this, we make the `tokenizer` - field a @property that is only initialized when it is first accessed. - This ensures that by the time we need to initialize the Tokenizer, the - Prompt Driver has already been initialized. - - See this thread more more information: https://github.com/griptape-ai/griptape/issues/244 - - Returns: - BedrockJurassicTokenizer: The tokenizer for this driver. - """ - if self._tokenizer: - return self._tokenizer - else: - self._tokenizer = BedrockJurassicTokenizer(model=self.prompt_driver.model) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> dict: - prompt_lines = [] - - for i in prompt_stack.inputs: - if i.is_user(): - prompt_lines.append(f"User: {i.content}") - elif i.is_assistant(): - prompt_lines.append(f"Assistant: {i.content}") - elif i.is_system(): - prompt_lines.append(f"System: {i.content}") - else: - prompt_lines.append(i.content) - prompt_lines.append("Assistant:") - - prompt = "\n".join(prompt_lines) - - return {"prompt": prompt} - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_model_input(prompt_stack)["prompt"] - - return { - "maxTokens": self.prompt_driver.max_output_tokens(prompt), - "temperature": self.prompt_driver.temperature, - "stopSequences": self.tokenizer.stop_sequences, - "countPenalty": {"scale": 0}, - "presencePenalty": {"scale": 0}, - "frequencyPenalty": {"scale": 0}, - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - if isinstance(output, bytes): - body = json.loads(output.decode()) - else: - raise Exception("Output must be bytes.") - return TextArtifact(body["completions"][0]["data"]["text"]) diff --git a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py deleted file mode 100644 index 951583c51..000000000 --- a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations -import json -import itertools as it -from typing import Optional -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptModelDriver -from griptape.tokenizers import BedrockLlamaTokenizer -from griptape.drivers import AmazonBedrockPromptDriver - - -@define -class BedrockLlamaPromptModelDriver(BasePromptModelDriver): - top_p: float = field(default=0.9, kw_only=True) - _tokenizer: BedrockLlamaTokenizer = field(default=None, kw_only=True) - prompt_driver: Optional[AmazonBedrockPromptDriver] = field(default=None, kw_only=True) - - @property - def tokenizer(self) -> BedrockLlamaTokenizer: - """Returns the tokenizer for this driver. - - We need to pass the `session` field from the Prompt Driver to the - Tokenizer. However, the Prompt Driver is not initialized until after - the Prompt Model Driver is initialized. To resolve this, we make the `tokenizer` - field a @property that is only initialized when it is first accessed. - This ensures that by the time we need to initialize the Tokenizer, the - Prompt Driver has already been initialized. - - See this thread more more information: https://github.com/griptape-ai/griptape/issues/244 - - Returns: - BedrockLlamaTokenizer: The tokenizer for this driver. - """ - if self._tokenizer: - return self._tokenizer - else: - self._tokenizer = BedrockLlamaTokenizer(model=self.prompt_driver.model) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str: - """ - Converts a `PromptStack` to a string that can be used as the input to the model. - - Prompt structure adapted from https://huggingface.co/blog/llama2#how-to-prompt-llama-2 - - Args: - prompt_stack: The `PromptStack` to convert. - """ - prompt_lines = [] - - inputs = iter(prompt_stack.inputs) - input_pairs: list[tuple] = list(it.zip_longest(inputs, inputs)) - for input_pair in input_pairs: - first_input: PromptStack.Input = input_pair[0] - second_input: Optional[PromptStack.Input] = input_pair[1] - - if first_input.is_system(): - prompt_lines.append(f"[INST] <>\n{first_input.content}\n<>\n\n") - if second_input: - if second_input.is_user(): - prompt_lines.append(f"{second_input.content} [/INST]") - else: - raise Exception("System input must be followed by user input.") - elif first_input.is_assistant(): - prompt_lines.append(f" {first_input.content} ") - if second_input: - if second_input.is_user(): - prompt_lines.append(f"[INST] {second_input.content} [/INST]") - else: - raise Exception("Assistant input must be followed by user input.") - elif first_input.is_user(): - prompt_lines.append(f"[INST] {first_input.content} [/INST]") - if second_input: - if second_input.is_assistant(): - prompt_lines.append(f" {second_input.content} ") - else: - raise Exception("User input must be followed by assistant input.") - - return "".join(prompt_lines) - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_model_input(prompt_stack) - - return { - "prompt": prompt, - "max_gen_len": self.prompt_driver.max_output_tokens(prompt), - "temperature": self.prompt_driver.temperature, - "top_p": self.top_p, - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - # When streaming, the response body comes back as bytes. - if isinstance(output, bytes): - output = output.decode() - elif isinstance(output, list) or isinstance(output, dict): - raise Exception("Invalid output format.") - - body = json.loads(output) - - return TextArtifact(body["generation"]) diff --git a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py deleted file mode 100644 index 5f5bbc1d2..000000000 --- a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations -from typing import Optional -import json -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptModelDriver -from griptape.tokenizers import BedrockTitanTokenizer -from griptape.drivers import AmazonBedrockPromptDriver - - -@define -class BedrockTitanPromptModelDriver(BasePromptModelDriver): - top_p: float = field(default=0.9, kw_only=True, metadata={"serializable": True}) - _tokenizer: BedrockTitanTokenizer = field(default=None, kw_only=True) - prompt_driver: Optional[AmazonBedrockPromptDriver] = field(default=None, kw_only=True) - - @property - def tokenizer(self) -> BedrockTitanTokenizer: - """Returns the tokenizer for this driver. - - We need to pass the `session` field from the Prompt Driver to the - Tokenizer. However, the Prompt Driver is not initialized until after - the Prompt Model Driver is initialized. To resolve this, we make the `tokenizer` - field a @property that is only initialized when it is first accessed. - This ensures that by the time we need to initialize the Tokenizer, the - Prompt Driver has already been initialized. - - See this thread for more information: https://github.com/griptape-ai/griptape/issues/244 - - Returns: - BedrockTitanTokenizer: The tokenizer for this driver. - """ - if self._tokenizer: - return self._tokenizer - else: - self._tokenizer = BedrockTitanTokenizer(model=self.prompt_driver.model) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> dict: - prompt_lines = [] - - for i in prompt_stack.inputs: - if i.is_user(): - prompt_lines.append(f"User: {i.content}") - elif i.is_assistant(): - prompt_lines.append(f"Bot: {i.content}") - elif i.is_system(): - prompt_lines.append(f"Instructions: {i.content}") - else: - prompt_lines.append(i.content) - prompt_lines.append("Bot:") - - prompt = "\n\n".join(prompt_lines) - - return {"inputText": prompt} - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_model_input(prompt_stack)["inputText"] - - return { - "textGenerationConfig": { - "maxTokenCount": self.prompt_driver.max_output_tokens(prompt), - "stopSequences": self.tokenizer.stop_sequences, - "temperature": self.prompt_driver.temperature, - "topP": self.top_p, - } - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - # When streaming, the response body comes back as bytes. - if isinstance(output, str) or isinstance(output, bytes): - if isinstance(output, bytes): - output = output.decode() - - body = json.loads(output) - - if self.prompt_driver.stream: - return TextArtifact(body["outputText"]) - else: - return TextArtifact(body["results"][0]["outputText"]) - else: - raise ValueError("output must be an instance of 'str' or 'bytes'") diff --git a/griptape/tokenizers/__init__.py b/griptape/tokenizers/__init__.py index b116f9fb0..e69473acd 100644 --- a/griptape/tokenizers/__init__.py +++ b/griptape/tokenizers/__init__.py @@ -3,11 +3,6 @@ from griptape.tokenizers.cohere_tokenizer import CohereTokenizer from griptape.tokenizers.huggingface_tokenizer import HuggingFaceTokenizer from griptape.tokenizers.anthropic_tokenizer import AnthropicTokenizer -from griptape.tokenizers.bedrock_titan_tokenizer import BedrockTitanTokenizer -from griptape.tokenizers.bedrock_cohere_tokenizer import BedrockCohereTokenizer -from griptape.tokenizers.bedrock_jurassic_tokenizer import BedrockJurassicTokenizer -from griptape.tokenizers.bedrock_claude_tokenizer import BedrockClaudeTokenizer -from griptape.tokenizers.bedrock_llama_tokenizer import BedrockLlamaTokenizer from griptape.tokenizers.google_tokenizer import GoogleTokenizer from griptape.tokenizers.voyageai_tokenizer import VoyageAiTokenizer from griptape.tokenizers.simple_tokenizer import SimpleTokenizer @@ -20,11 +15,6 @@ "CohereTokenizer", "HuggingFaceTokenizer", "AnthropicTokenizer", - "BedrockTitanTokenizer", - "BedrockCohereTokenizer", - "BedrockJurassicTokenizer", - "BedrockClaudeTokenizer", - "BedrockLlamaTokenizer", "GoogleTokenizer", "VoyageAiTokenizer", "SimpleTokenizer", diff --git a/griptape/tokenizers/bedrock_claude_tokenizer.py b/griptape/tokenizers/bedrock_claude_tokenizer.py deleted file mode 100644 index d44116e2c..000000000 --- a/griptape/tokenizers/bedrock_claude_tokenizer.py +++ /dev/null @@ -1,12 +0,0 @@ -from attrs import define -from griptape.tokenizers import AnthropicTokenizer - - -@define() -class BedrockClaudeTokenizer(AnthropicTokenizer): - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = { - "anthropic.claude-3": 200000, - "anthropic.claude-v2:1": 200000, - "anthropic.claude": 100000, - } - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"anthropic.claude": 4096} diff --git a/griptape/tokenizers/bedrock_cohere_tokenizer.py b/griptape/tokenizers/bedrock_cohere_tokenizer.py deleted file mode 100644 index 44ccb4ac6..000000000 --- a/griptape/tokenizers/bedrock_cohere_tokenizer.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations -from attrs import define, field -from .simple_tokenizer import SimpleTokenizer - - -@define() -class BedrockCohereTokenizer(SimpleTokenizer): - # https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-embed.html - DEFAULT_CHARACTERS_PER_TOKEN = 4 - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"cohere": 1024} - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"cohere": 4096} - - model: str = field(kw_only=True) - characters_per_token: int = field(default=DEFAULT_CHARACTERS_PER_TOKEN, kw_only=True) diff --git a/griptape/tokenizers/bedrock_jurassic_tokenizer.py b/griptape/tokenizers/bedrock_jurassic_tokenizer.py deleted file mode 100644 index 7511138b3..000000000 --- a/griptape/tokenizers/bedrock_jurassic_tokenizer.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations -from attrs import define, field, Factory -from .simple_tokenizer import SimpleTokenizer - - -@define() -class BedrockJurassicTokenizer(SimpleTokenizer): - DEFAULT_CHARACTERS_PER_TOKEN = 6 # https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html#model-customization-prepare-finetuning - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"ai21": 8192} - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = { - "ai21.j2-mid-v1": 8191, - "ai21.j2-ultra-v1": 8191, - "ai21.j2-large-v1": 8191, - "ai21": 2048, - } - - model: str = field(kw_only=True) - characters_per_token: int = field( - default=Factory(lambda self: self.DEFAULT_CHARACTERS_PER_TOKEN, takes_self=True), kw_only=True - ) diff --git a/griptape/tokenizers/bedrock_llama_tokenizer.py b/griptape/tokenizers/bedrock_llama_tokenizer.py deleted file mode 100644 index e7d1ec829..000000000 --- a/griptape/tokenizers/bedrock_llama_tokenizer.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations -from attrs import define, field -from .simple_tokenizer import SimpleTokenizer - - -@define() -class BedrockLlamaTokenizer(SimpleTokenizer): - DEFAULT_CHARACTERS_PER_TOKEN = 6 # https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html#model-customization-prepare-finetuning - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"meta": 2048} - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"meta": 2048} - - model: str = field(kw_only=True) - characters_per_token: int = field(default=DEFAULT_CHARACTERS_PER_TOKEN, kw_only=True) - stop_sequences: list[str] = field(factory=list, kw_only=True) diff --git a/griptape/tokenizers/bedrock_titan_tokenizer.py b/griptape/tokenizers/bedrock_titan_tokenizer.py deleted file mode 100644 index 0d8ba0273..000000000 --- a/griptape/tokenizers/bedrock_titan_tokenizer.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations -from attrs import define, field, Factory -from .simple_tokenizer import SimpleTokenizer - - -@define() -class BedrockTitanTokenizer(SimpleTokenizer): - DEFAULT_CHARACTERS_PER_TOKEN = 6 # https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html#model-customization-prepare-finetuning - MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {"amazon": 4096} - MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"amazon": 8000} - - model: str = field(kw_only=True) - characters_per_token: int = field(default=DEFAULT_CHARACTERS_PER_TOKEN, kw_only=True) - stop_sequences: list[str] = field(default=Factory(lambda: ["User:"]), kw_only=True) diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index 484afe69f..864b92f96 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -7,6 +7,8 @@ @define() class SimpleTokenizer(BaseTokenizer): model: Optional[str] = field(init=False, kw_only=True, default=None) + max_input_tokens: int = field(kw_only=True, default=0) + max_output_tokens: int = field(kw_only=True, default=0) characters_per_token: int = field(kw_only=True) def count_tokens(self, text: str | list) -> int: diff --git a/poetry.lock b/poetry.lock index 65e767cc5..87b88792a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -278,17 +278,17 @@ lxml = ["lxml"] [[package]] name = "boto3" -version = "1.34.106" +version = "1.34.119" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.106-py3-none-any.whl", hash = "sha256:d3be4e1dd5d546a001cd4da805816934cbde9d395316546e9411fec341ade5cf"}, - {file = "boto3-1.34.106.tar.gz", hash = "sha256:6165b8cf1c7e625628ab28b32f9027064c8f5e5fca1c38d7fc228cd22069a19f"}, + {file = "boto3-1.34.119-py3-none-any.whl", hash = "sha256:8f9c43c54b3dfaa36c4a0d7b42c417227a515bc7a2e163e62802780000a5a3e2"}, + {file = "boto3-1.34.119.tar.gz", hash = "sha256:cea2365a25b2b83a97e77f24ac6f922ef62e20636b42f9f6ee9f97188f9c1c03"}, ] [package.dependencies] -botocore = ">=1.34.106,<1.35.0" +botocore = ">=1.34.119,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -706,13 +706,13 @@ xray = ["mypy-boto3-xray (>=1.34.0,<1.35.0)"] [[package]] name = "botocore" -version = "1.34.106" +version = "1.34.119" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.106-py3-none-any.whl", hash = "sha256:4baf0e27c2dfc4f4d0dee7c217c716e0782f9b30e8e1fff983fce237d88f73ae"}, - {file = "botocore-1.34.106.tar.gz", hash = "sha256:921fa5202f88c3e58fdcb4b3acffd56d65b24bca47092ee4b27aa988556c0be6"}, + {file = "botocore-1.34.119-py3-none-any.whl", hash = "sha256:4bdf7926a1290b2650d62899ceba65073dd2693e61c35f5cdeb3a286a0aaa27b"}, + {file = "botocore-1.34.119.tar.gz", hash = "sha256:b253f15b24b87b070e176af48e8ef146516090429d30a7d8b136a4c079b28008"}, ] [package.dependencies] @@ -6096,4 +6096,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "7d073f2b3d8b7e16b3315c7c59925884fadda9c0b0c179b191a748de669f2e0c" +content-hash = "d0913fb4119f352710d722c55029eaa74e948d57e3fa5ffb345ca4e690f20ec2" diff --git a/pyproject.toml b/pyproject.toml index b750051e0..53c07257e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ cohere = { version = "^5.5.4", optional = true } anthropic = { version = "^0.20.0", optional = true } transformers = { version = "^4.39.3", optional = true } huggingface-hub = { version = ">=0.13", optional = true } -boto3 = { version = "^1.28.2", optional = true } +boto3 = { version = "^1.34.119", optional = true } sqlalchemy-redshift = { version = "*", optional = true } snowflake-sqlalchemy = { version = "^1.4.7", optional = true } pinecone-client = { version = "^3", optional = true } diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index 5b8c63a98..33b286f94 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -38,7 +38,6 @@ def test_to_dict(self, config): "prompt_driver": { "max_tokens": None, "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": {"type": "BedrockClaudePromptModelDriver", "top_k": 250, "top_p": 0.999}, "stream": False, "temperature": 0.1, "type": "AmazonBedrockPromptDriver", diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 1bd94d3e9..28409cea1 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -1,117 +1,83 @@ -from botocore.response import StreamingBody -from griptape.artifacts import TextArtifact -from griptape.drivers import AmazonBedrockPromptDriver -from griptape.drivers import BedrockClaudePromptModelDriver, BedrockTitanPromptModelDriver -from griptape.tokenizers import AnthropicTokenizer, BedrockTitanTokenizer -from io import StringIO -from unittest.mock import Mock -import json import pytest +from griptape.utils import PromptStack +from griptape.drivers import AmazonBedrockPromptDriver + class TestAmazonBedrockPromptDriver: @pytest.fixture - def mock_prompt_model_driver(self): - mock_prompt_model_driver = Mock() - mock_prompt_model_driver.prompt_stack_to_model_params.return_value = {"model-param-key": "model-param-value"} - mock_prompt_model_driver.process_output.return_value = TextArtifact("model-output") - return mock_prompt_model_driver - - @pytest.fixture(autouse=True) - def mock_client(self, mocker): - return mocker.patch("boto3.Session").return_value.client.return_value - - def test_init(self): - assert AmazonBedrockPromptDriver(model="anthropic.claude", prompt_model_driver=BedrockClaudePromptModelDriver()) - - def test_custom_tokenizer(self): - assert isinstance( - AmazonBedrockPromptDriver( - model="anthropic.claude", prompt_model_driver=BedrockClaudePromptModelDriver() - ).tokenizer, - AnthropicTokenizer, - ) + def mock_converse(self, mocker): + mock_converse = mocker.patch("boto3.Session").return_value.client.return_value.converse - assert isinstance( - AmazonBedrockPromptDriver( - model="titan", - tokenizer=BedrockTitanTokenizer(model="amazon"), - prompt_model_driver=BedrockTitanPromptModelDriver(), - ).tokenizer, - BedrockTitanTokenizer, - ) + mock_converse.return_value = {"output": {"message": {"content": [{"text": "model-output"}]}}} + + return mock_converse + + @pytest.fixture + def mock_converse_stream(self, mocker): + mock_converse_stream = mocker.patch("boto3.Session").return_value.client.return_value.converse_stream + + mock_converse_stream.return_value = {"stream": [{"contentBlockDelta": {"delta": {"text": "model-output"}}}]} + + return mock_converse_stream + + @pytest.fixture + def prompt_stack(self): + prompt_stack = PromptStack() + prompt_stack.add_generic_input("generic-input") + prompt_stack.add_system_input("system-input") + prompt_stack.add_user_input("user-input") + prompt_stack.add_assistant_input("assistant-input") + + return prompt_stack - @pytest.mark.parametrize("model_inputs", [{"model-input-key": "model-input-value"}, "not-a-dict"]) - def test_try_run(self, model_inputs, mock_prompt_model_driver, mock_client): + @pytest.fixture + def messages(self): + return [ + {"role": "user", "content": [{"text": "generic-input"}]}, + {"role": "system", "content": [{"text": "system-input"}]}, + {"role": "user", "content": [{"text": "user-input"}]}, + {"role": "assistant", "content": [{"text": "assistant-input"}]}, + ] + + def test_try_run(self, mock_converse, prompt_stack, messages): # Given - driver = AmazonBedrockPromptDriver(model="model", prompt_model_driver=mock_prompt_model_driver) - prompt_stack = "prompt-stack" - response_body = "invoke-model-response-body" - mock_prompt_model_driver.prompt_stack_to_model_input.return_value = model_inputs - mock_client.invoke_model.return_value = {"body": to_streaming_body(response_body)} + driver = AmazonBedrockPromptDriver(model="foo bar") # When text_artifact = driver.try_run(prompt_stack) # Then - mock_prompt_model_driver.prompt_stack_to_model_input.assert_called_once_with(prompt_stack) - mock_prompt_model_driver.prompt_stack_to_model_params.assert_called_once_with(prompt_stack) - mock_client.invoke_model.assert_called_once_with( + mock_converse.assert_called_once_with( modelId=driver.model, - contentType="application/json", - accept="application/json", - body=json.dumps( - { - **mock_prompt_model_driver.prompt_stack_to_model_params.return_value, - **(model_inputs if isinstance(model_inputs, dict) else {}), - } - ), + messages=[ + {"role": "user", "content": [{"text": "generic-input"}]}, + {"role": "user", "content": [{"text": "user-input"}]}, + {"role": "assistant", "content": [{"text": "assistant-input"}]}, + ], + system=[{"text": "system-input"}], + inferenceConfig={"temperature": driver.temperature}, + additionalModelRequestFields={}, ) - mock_prompt_model_driver.process_output.assert_called_once_with(response_body) - assert text_artifact == mock_prompt_model_driver.process_output.return_value + assert text_artifact.value == "model-output" - @pytest.mark.parametrize("model_inputs", [{"model-input-key": "model-input-value"}, "not-a-dict"]) - def test_try_stream_run(self, model_inputs, mock_prompt_model_driver, mock_client): + def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages): # Given - driver = AmazonBedrockPromptDriver(model="model", prompt_model_driver=mock_prompt_model_driver, stream=True) - prompt_stack = "prompt-stack" - model_response = "invoke-model-response-body" - response_body = [{"chunk": {"bytes": model_response}}] - mock_prompt_model_driver.prompt_stack_to_model_input.return_value = model_inputs - mock_client.invoke_model_with_response_stream.return_value = {"body": response_body} + driver = AmazonBedrockPromptDriver(model="foo bar", stream=True) # When text_artifact = next(driver.try_stream(prompt_stack)) # Then - mock_prompt_model_driver.prompt_stack_to_model_input.assert_called_once_with(prompt_stack) - mock_prompt_model_driver.prompt_stack_to_model_params.assert_called_once_with(prompt_stack) - mock_client.invoke_model_with_response_stream.assert_called_once_with( + mock_converse_stream.assert_called_once_with( modelId=driver.model, - contentType="application/json", - accept="application/json", - body=json.dumps( - { - **mock_prompt_model_driver.prompt_stack_to_model_params.return_value, - **(model_inputs if isinstance(model_inputs, dict) else {}), - } - ), + messages=[ + {"role": "user", "content": [{"text": "generic-input"}]}, + {"role": "user", "content": [{"text": "user-input"}]}, + {"role": "assistant", "content": [{"text": "assistant-input"}]}, + ], + system=[{"text": "system-input"}], + inferenceConfig={"temperature": driver.temperature}, + additionalModelRequestFields={}, ) - mock_prompt_model_driver.process_output.assert_called_once_with(model_response) - assert text_artifact.value == mock_prompt_model_driver.process_output.return_value.value - - def test_try_run_throws_on_empty_response(self, mock_prompt_model_driver, mock_client): - # Given - driver = AmazonBedrockPromptDriver(model="model", prompt_model_driver=mock_prompt_model_driver) - mock_client.invoke_model.return_value = {"body": to_streaming_body("")} - - # When - with pytest.raises(Exception) as e: - driver.try_run("prompt-stack") - - # Then - assert e.value.args[0] == "model response is empty" - - -def to_streaming_body(text: str) -> StreamingBody: - return StreamingBody(StringIO(text), len(text)) + assert text_artifact.value == "model-output" diff --git a/tests/unit/drivers/prompt_models/test_bedrock_claude_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_bedrock_claude_prompt_model_driver.py deleted file mode 100644 index 94bc97122..000000000 --- a/tests/unit/drivers/prompt_models/test_bedrock_claude_prompt_model_driver.py +++ /dev/null @@ -1,129 +0,0 @@ -from unittest import mock -import json -import boto3 -import pytest -from griptape.utils import PromptStack -from griptape.drivers import AmazonBedrockPromptDriver, BedrockClaudePromptModelDriver - - -class TestBedrockClaudePromptModelDriver: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - @pytest.fixture - def driver(self, request): - return AmazonBedrockPromptDriver( - model=request.param, - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=BedrockClaudePromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.mark.parametrize( - "driver,", - [ - ("anthropic.claude-v2"), - ("anthropic.claude-v2:1"), - ("anthropic.claude-3-sonnet-20240229-v1:0"), - ("anthropic.claude-3-haiku-20240307-v1:0"), - ], - indirect=["driver"], - ) - def test_init(self, driver): - assert driver.prompt_driver is not None - - @pytest.mark.parametrize( - "driver,", - [ - ("anthropic.claude-v2"), - ("anthropic.claude-v2:1"), - ("anthropic.claude-3-sonnet-20240229-v1:0"), - ("anthropic.claude-3-haiku-20240307-v1:0"), - ], - indirect=["driver"], - ) - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_prompt_stack_to_model_input(self, driver, system_enabled): - stack = PromptStack() - if system_enabled: - stack.add_system_input("foo") - stack.add_user_input("bar") - stack.add_assistant_input("baz") - stack.add_generic_input("qux") - - expected_messages = [ - {"role": "user", "content": "bar"}, - {"role": "assistant", "content": "baz"}, - {"role": "user", "content": "qux"}, - ] - actual = driver.prompt_stack_to_model_input(stack) - expected = {"messages": expected_messages, **({"system": "foo"} if system_enabled else {})} - - assert actual == expected - - @pytest.mark.parametrize( - "driver,", - [ - ("anthropic.claude-v2"), - ("anthropic.claude-v2:1"), - ("anthropic.claude-3-sonnet-20240229-v1:0"), - ("anthropic.claude-3-haiku-20240307-v1:0"), - ], - indirect=["driver"], - ) - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_prompt_stack_to_model_params(self, driver, system_enabled): - stack = PromptStack() - if system_enabled: - stack.add_system_input("foo") - stack.add_user_input("bar") - stack.add_assistant_input("baz") - stack.add_generic_input("qux") - - max_tokens = driver.prompt_driver.max_output_tokens(driver.prompt_driver.prompt_stack_to_string(stack)) - - expected = { - "temperature": 0.12345, - "max_tokens": max_tokens, - "anthropic_version": driver.ANTHROPIC_VERSION, - "messages": [ - {"role": "user", "content": "bar"}, - {"role": "assistant", "content": "baz"}, - {"role": "user", "content": "qux"}, - ], - "top_p": 0.999, - "top_k": 250, - "stop_sequences": ["<|Response|>"], - **({"system": "foo"} if system_enabled else {}), - } - - assert driver.prompt_stack_to_model_params(stack) == expected - - @pytest.mark.parametrize( - "driver,", - [ - ("anthropic.claude-v2"), - ("anthropic.claude-v2:1"), - ("anthropic.claude-3-sonnet-20240229-v1:0"), - ("anthropic.claude-3-haiku-20240307-v1:0"), - ], - indirect=["driver"], - ) - def test_process_output(self, driver): - assert ( - driver.process_output(json.dumps({"type": "message", "content": [{"text": "foobar"}]}).encode()).value - == "foobar" - ) - assert ( - driver.process_output( - json.dumps({"type": "content_block_delta", "delta": {"text": "foobar"}}).encode() - ).value - == "foobar" - ) diff --git a/tests/unit/drivers/prompt_models/test_bedrock_jurassic_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_bedrock_jurassic_prompt_model_driver.py deleted file mode 100644 index e0d6f1f02..000000000 --- a/tests/unit/drivers/prompt_models/test_bedrock_jurassic_prompt_model_driver.py +++ /dev/null @@ -1,71 +0,0 @@ -from unittest import mock -import json -import boto3 -import pytest -from griptape.utils import PromptStack -from griptape.drivers import AmazonBedrockPromptDriver, BedrockJurassicPromptModelDriver - - -class TestBedrockJurassicPromptModelDriver: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"prompt": {"tokens": [{}, {}, {}]}}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - return mock_session_object - - @pytest.fixture - def driver(self): - return AmazonBedrockPromptDriver( - model="ai21.j2-ultra", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=BedrockJurassicPromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.fixture - def stack(self): - stack = PromptStack() - - stack.add_system_input("foo") - stack.add_user_input("bar") - - return stack - - def test_driver_stream(self): - with pytest.raises(ValueError): - AmazonBedrockPromptDriver( - model="ai21.j2-ultra", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=BedrockJurassicPromptModelDriver(), - temperature=0.12345, - stream=True, - ).prompt_model_driver - - def test_init(self, driver): - assert driver.prompt_driver is not None - - def test_prompt_stack_to_model_input(self, driver, stack): - model_input = driver.prompt_stack_to_model_input(stack) - - assert isinstance(model_input, dict) - assert model_input["prompt"].startswith("System: foo\nUser: bar\nAssistant:") - - def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["maxTokens"] == 2042 - assert driver.prompt_stack_to_model_params(stack)["temperature"] == 0.12345 - - def test_process_output(self, driver): - assert ( - driver.process_output(json.dumps({"completions": [{"data": {"text": "foobar"}}]}).encode()).value - == "foobar" - ) diff --git a/tests/unit/drivers/prompt_models/test_bedrock_llama_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_bedrock_llama_prompt_model_driver.py deleted file mode 100644 index 8cb4b2c94..000000000 --- a/tests/unit/drivers/prompt_models/test_bedrock_llama_prompt_model_driver.py +++ /dev/null @@ -1,64 +0,0 @@ -from unittest import mock -import json -import boto3 -import pytest -from griptape.tokenizers import BedrockLlamaTokenizer -from griptape.utils import PromptStack -from griptape.drivers import AmazonBedrockPromptDriver, BedrockLlamaPromptModelDriver - - -class TestBedrockLlamaPromptModelDriver: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"generation_token_count": 13}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - return mock_session_object - - @pytest.fixture - def driver(self): - return AmazonBedrockPromptDriver( - model="meta.llama", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=BedrockLlamaPromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.fixture - def stack(self): - stack = PromptStack() - - stack.add_system_input("{{ system_prompt }}") - stack.add_user_input("{{ usr_msg_1 }}") - stack.add_assistant_input("{{ model_msg_1 }}") - stack.add_user_input("{{ usr_msg_2 }}") - - return stack - - def test_init(self, driver): - assert driver.prompt_driver is not None - - def test_prompt_stack_to_model_input(self, driver, stack): - model_input = driver.prompt_stack_to_model_input(stack) - - assert isinstance(model_input, str) - assert ( - model_input - == "[INST] <>\n{{ system_prompt }}\n<>\n\n{{ usr_msg_1 }} [/INST] {{ model_msg_1 }} [INST] {{ usr_msg_2 }} [/INST]" - ) - - def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["max_gen_len"] == 2026 - assert driver.prompt_stack_to_model_params(stack)["temperature"] == 0.12345 - - def test_process_output(self, driver): - assert driver.process_output(json.dumps({"generation": "foobar"})).value == "foobar" diff --git a/tests/unit/drivers/prompt_models/test_bedrock_titan_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_bedrock_titan_prompt_model_driver.py deleted file mode 100644 index ae6d436b5..000000000 --- a/tests/unit/drivers/prompt_models/test_bedrock_titan_prompt_model_driver.py +++ /dev/null @@ -1,58 +0,0 @@ -from unittest import mock -import json -import boto3 -import pytest -from griptape.utils import PromptStack -from griptape.drivers import AmazonBedrockPromptDriver, BedrockTitanPromptModelDriver - - -class TestBedrockTitanPromptModelDriver: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"inputTextTokenCount": 13}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - return mock_session_object - - @pytest.fixture - def driver(self): - return AmazonBedrockPromptDriver( - model="amazon.titan", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=BedrockTitanPromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.fixture - def stack(self): - stack = PromptStack() - - stack.add_system_input("foo") - stack.add_user_input("bar") - - return stack - - def test_init(self, driver): - assert driver.prompt_driver is not None - - def test_prompt_stack_to_model_input(self, driver, stack): - model_input = driver.prompt_stack_to_model_input(stack) - - assert isinstance(model_input, dict) - assert model_input["inputText"].startswith("Instructions: foo\n\nUser: bar\n\nBot:") - - def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["textGenerationConfig"]["maxTokenCount"] == 7994 - assert driver.prompt_stack_to_model_params(stack)["textGenerationConfig"]["temperature"] == 0.12345 - - def test_process_output(self, driver): - assert driver.process_output(json.dumps({"results": [{"outputText": "foobar"}]})).value == "foobar" diff --git a/tests/unit/tokenizers/test_bedrock_claude_tokenizer.py b/tests/unit/tokenizers/test_bedrock_claude_tokenizer.py deleted file mode 100644 index 4f6e6723f..000000000 --- a/tests/unit/tokenizers/test_bedrock_claude_tokenizer.py +++ /dev/null @@ -1,47 +0,0 @@ -import pytest -from griptape.tokenizers import BedrockClaudeTokenizer - - -class TestBedrockClaudeTokenizer: - @pytest.fixture - def tokenizer(self, request): - return BedrockClaudeTokenizer(model=request.param) - - @pytest.mark.parametrize( - "tokenizer,expected", - [ - ("anthropic.claude-v2:1", 5), - ("anthropic.claude-v2", 5), - ("anthropic.claude-3-sonnet-20240229-v1:0", 5), - ("anthropic.claude-3-haiku-20240307-v1:0", 5), - ], - indirect=["tokenizer"], - ) - def test_token_count(self, tokenizer, expected): - assert tokenizer.count_tokens("foo bar huzzah") == expected - - @pytest.mark.parametrize( - "tokenizer,expected", - [ - ("anthropic.claude-v2", 99995), - ("anthropic.claude-v2:1", 199995), - ("anthropic.claude-3-sonnet-20240229-v1:0", 199995), - ("anthropic.claude-3-haiku-20240307-v1:0", 199995), - ], - indirect=["tokenizer"], - ) - def test_input_tokens_left(self, tokenizer, expected): - assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected - - @pytest.mark.parametrize( - "tokenizer,expected", - [ - ("anthropic.claude-v2", 4091), - ("anthropic.claude-v2:1", 4091), - ("anthropic.claude-3-sonnet-20240229-v1:0", 4091), - ("anthropic.claude-3-haiku-20240307-v1:0", 4091), - ], - indirect=["tokenizer"], - ) - def test_output_tokens_left(self, tokenizer, expected): - assert tokenizer.count_output_tokens_left("foo bar huzzah") == expected diff --git a/tests/unit/tokenizers/test_bedrock_cohere_tokenizer.py b/tests/unit/tokenizers/test_bedrock_cohere_tokenizer.py deleted file mode 100644 index 6238b0e54..000000000 --- a/tests/unit/tokenizers/test_bedrock_cohere_tokenizer.py +++ /dev/null @@ -1,25 +0,0 @@ -import pytest -from unittest import mock -from griptape.tokenizers import BedrockCohereTokenizer - - -class TestBedrockCohereTokenizer: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"inputTextTokenCount": 2}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - def test_input_tokens_left(self): - assert BedrockCohereTokenizer(model="cohere").count_input_tokens_left("foo bar") == 1022 - - def test_output_tokens_left(self): - assert BedrockCohereTokenizer(model="cohere").count_output_tokens_left("foo bar") == 4094 diff --git a/tests/unit/tokenizers/test_bedrock_jurassic_tokenizer.py b/tests/unit/tokenizers/test_bedrock_jurassic_tokenizer.py deleted file mode 100644 index 59c42493b..000000000 --- a/tests/unit/tokenizers/test_bedrock_jurassic_tokenizer.py +++ /dev/null @@ -1,39 +0,0 @@ -import pytest -from unittest import mock -from griptape.tokenizers import BedrockJurassicTokenizer - - -class TestBedrockJurassicTokenizer: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"prompt": {"tokens": [{}, {}, {}]}}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - @pytest.fixture - def tokenizer(self, request): - return BedrockJurassicTokenizer(model=request.param) - - @pytest.mark.parametrize( - "tokenizer,expected", - [("ai21.j2-mid-v1", 8186), ("ai21.j2-ultra-v1", 8186), ("ai21.j2-large-v1", 8186), ("ai21.j2-large-v2", 8186)], - indirect=["tokenizer"], - ) - def test_input_tokens_left(self, tokenizer, expected): - assert tokenizer.count_input_tokens_left("System: foo\nUser: bar\nAssistant:") == expected - - @pytest.mark.parametrize( - "tokenizer,expected", - [("ai21.j2-mid-v1", 8185), ("ai21.j2-ultra-v1", 8185), ("ai21.j2-large-v1", 8185), ("ai21.j2-large-v2", 2042)], - indirect=["tokenizer"], - ) - def test_output_tokens_left(self, tokenizer, expected): - assert tokenizer.count_output_tokens_left("System: foo\nUser: bar\nAssistant:") == expected diff --git a/tests/unit/tokenizers/test_bedrock_llama_tokenizer.py b/tests/unit/tokenizers/test_bedrock_llama_tokenizer.py deleted file mode 100644 index da842f0f3..000000000 --- a/tests/unit/tokenizers/test_bedrock_llama_tokenizer.py +++ /dev/null @@ -1,35 +0,0 @@ -import pytest -from unittest import mock -from griptape.tokenizers import BedrockLlamaTokenizer - - -class TestBedrockLlamaTokenizer: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"generation_token_count": 13}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - def test_input_tokens_left(self): - assert ( - BedrockLlamaTokenizer(model="meta.llama").count_input_tokens_left( - "[INST] <>\n{{ system_prompt }}\n<>\n\n{{ usr_msg_1 }} [/INST] {{ model_msg_1 }} [INST] {{ usr_msg_2 }} [/INST]" - ) - == 2026 - ) - - def test_ouput_tokens_left(self): - assert ( - BedrockLlamaTokenizer(model="meta.llama").count_output_tokens_left( - "[INST] <>\n{{ system_prompt }}\n<>\n\n{{ usr_msg_1 }} [/INST] {{ model_msg_1 }} [INST] {{ usr_msg_2 }} [/INST]" - ) - == 2026 - ) diff --git a/tests/unit/tokenizers/test_bedrock_titan_tokenizer.py b/tests/unit/tokenizers/test_bedrock_titan_tokenizer.py deleted file mode 100644 index c4f4f42ad..000000000 --- a/tests/unit/tokenizers/test_bedrock_titan_tokenizer.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from unittest import mock -from griptape.tokenizers import BedrockTitanTokenizer - - -class TestBedrockTitanTokenizer: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_tokenization = '{"inputTextTokenCount": 13}' - mock_session_class = mocker.patch("boto3.Session") - - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_tokenization - mock_client.invoke_model.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - def test_input_tokens_left(self): - assert ( - BedrockTitanTokenizer(model="amazon.titan").count_input_tokens_left("Instructions: foo\nUser: bar\nBot:") - == 4090 - ) - - def test_output_tokens_left(self): - assert ( - BedrockTitanTokenizer(model="amazon.titan").count_output_tokens_left("Instructions: foo\nUser: bar\nBot:") - == 7994 - ) diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 4f111b8d8..592843279 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -14,10 +14,6 @@ BasePromptDriver, AmazonBedrockPromptDriver, AnthropicPromptDriver, - BedrockClaudePromptModelDriver, - BedrockJurassicPromptModelDriver, - BedrockTitanPromptModelDriver, - BedrockLlamaPromptModelDriver, CoherePromptDriver, OpenAiChatPromptDriver, OpenAiCompletionPromptDriver, @@ -142,70 +138,76 @@ class TesterPromptDriverOption: "COHERE_COMMAND": TesterPromptDriverOption( prompt_driver=CoherePromptDriver(model="command", api_key=os.environ["COHERE_API_KEY"]), enabled=True ), - "BEDROCK_TITAN": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="amazon.titan-tg1-large", prompt_model_driver=BedrockTitanPromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_ANTHROPIC_CLAUDE_3_SONNET": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-3-sonnet-20240229-v1:0"), enabled=True ), - "BEDROCK_CLAUDE_INSTANT": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-instant-v1", prompt_model_driver=BedrockClaudePromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_ANTHROPIC_CLAUDE_3_HAIKU": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-3-haiku-20240307-v1:0"), enabled=True ), - "BEDROCK_CLAUDE_2": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-v2", prompt_model_driver=BedrockClaudePromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_ANTHROPIC_CLAUDE_2": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-v2"), enabled=True ), - "BEDROCK_CLAUDE_2.1": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-v2:1", prompt_model_driver=BedrockClaudePromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_ANTHROPIC_CLAUDE_2.1": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-v2:1"), enabled=True ), - "BEDROCK_CLAUDE_3_SONNET": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", prompt_model_driver=BedrockClaudePromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_ANTHROPIC_CLAUDE_INSTANT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="anthropic.claude-instant-v1"), enabled=True ), - "BEDROCK_CLAUDE_3_HAIKU": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-haiku-20240307-v1:0", prompt_model_driver=BedrockClaudePromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_J2_ULTRA": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="ai21.j2-ultra"), enabled=True ), - "BEDROCK_J2": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="ai21.j2-ultra", prompt_model_driver=BedrockJurassicPromptModelDriver() - ), - enabled=True, + "AMAZON_BEDROCK_J2_MID": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="ai21.j2-mid"), enabled=True ), - "BEDROCK_LLAMA2_13B": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="meta.llama2-13b-chat-v1", prompt_model_driver=BedrockLlamaPromptModelDriver(), max_attempts=1 - ), - enabled=True, + "AMAZON_BEDROCK_TITAN_TEXT_LITE": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="amazon.titan-text-lite-v1"), enabled=True ), - "BEDROCK_LLAMA2_70B": TesterPromptDriverOption( - prompt_driver=AmazonBedrockPromptDriver( - model="meta.llama2-70b-chat-v1", prompt_model_driver=BedrockLlamaPromptModelDriver(), max_attempts=1 - ), - enabled=True, + "AMAZON_BEDROCK_TITAN_TEXT_EXPRESS": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="amazon.titan-text-express-v1"), enabled=True + ), + "AMAZON_BEDROCK_COHERE_COMMAND_R_PLUS": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="cohere.command-r-plus-v1:0"), enabled=True + ), + "AMAZON_BEDROCK_COHERE_COMMAND_R": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="cohere.command-r-v1:0"), enabled=True + ), + "AMAZON_BEDROCK_COHERE_COMMAND_TEXT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="cohere.command-text-v14"), enabled=True + ), + "AMAZON_BEDROCK_COHERE_COMMAND_LIGHT_TEXT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="cohere.command-light-text-v14"), enabled=True + ), + "AMAZON_BEDROCK_LLAMA3_8B_INSTRUCT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="meta.llama3-8b-instruct-v1:0"), enabled=True + ), + "AMAZON_BEDROCK_LLAMA2_13B_CHAT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="meta.llama2-13b-chat-v1"), enabled=True + ), + "AMAZON_BEDROCK_LLAMA2_70B_CHAT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="meta.llama2-70b-chat-v1"), enabled=True + ), + "AMAZON_BEDROCK_MISTRAL_7B_INSTRUCT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="mistral.mistral-7b-instruct-v0:2"), enabled=True + ), + "AMAZON_BEDROCK_MISTRAL_MIXTRAL_8X7B_INSTRUCT": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="mistral.mixtral-8x7b-instruct-v0:1"), enabled=True + ), + "AMAZON_BEDROCK_MISTRAL_LARGE_2402": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="mistral.mistral-large-2402-v1:0"), enabled=True + ), + "AMAZON_BEDROCK_MISTRAL_SMALL_2402": TesterPromptDriverOption( + prompt_driver=AmazonBedrockPromptDriver(model="mistral.mistral-small-2402-v1:0"), enabled=True ), "SAGEMAKER_LLAMA_7B": TesterPromptDriverOption( prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], + endpoint=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], prompt_model_driver=SageMakerLlamaPromptModelDriver(max_tokens=4096), ), enabled=False, ), "SAGEMAKER_FALCON_7b": TesterPromptDriverOption( prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], + endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], prompt_model_driver=SageMakerFalconPromptModelDriver(), ), enabled=False, @@ -221,6 +223,7 @@ class TesterPromptDriverOption: PROMPT_DRIVERS["AZURE_CHAT_4"], PROMPT_DRIVERS["AZURE_CHAT_4_32K"], PROMPT_DRIVERS["ANTHROPIC_CLAUDE_3_OPUS"], + PROMPT_DRIVERS["ANTHROPIC_CLAUDE_3_OPUS"], PROMPT_DRIVERS["GOOGLE_GEMINI_PRO"], ] ) From 8d6de30c70998b27e298d77c344600c58e1c15c3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 6 Jun 2024 10:27:37 -0700 Subject: [PATCH 082/238] Remove un-used header extraction (#838) --- CHANGELOG.md | 1 + .../prompt/openai_chat_prompt_driver.py | 54 +-------------- poetry.lock | 10 +-- pyproject.toml | 1 - .../test_azure_openai_chat_prompt_driver.py | 4 +- .../prompt/test_openai_chat_prompt_driver.py | 67 +------------------ 6 files changed, 14 insertions(+), 123 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad589408c..0756ef35d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. +- Performance issue in `OpenAiChatPromptDriver` when extracting unused rate-limiting headers. ## [0.26.0] - 2024-06-04 diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 3d19063d3..345545b6f 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -7,8 +7,6 @@ from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer -import dateparser -from datetime import datetime, timedelta @define @@ -25,12 +23,6 @@ class OpenAiChatPromptDriver(BasePromptDriver): response_format: An optional OpenAi Chat Completion response format. Currently only supports `json_object` which will enable OpenAi's JSON mode. seed: An optional OpenAi Chat Completion seed. ignored_exception_types: An optional tuple of exception types to ignore. Defaults to OpenAI's known exception types. - _ratelimit_request_limit: The maximum number of requests allowed in the current rate limit window. - _ratelimit_requests_remaining: The number of requests remaining in the current rate limit window. - _ratelimit_requests_reset_at: The time at which the current rate limit window resets. - _ratelimit_token_limit: The maximum number of tokens allowed in the current rate limit window. - _ratelimit_tokens_remaining: The number of tokens remaining in the current rate limit window. - _ratelimit_tokens_reset_at: The time at which the current rate limit window resets. """ base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) @@ -64,22 +56,12 @@ class OpenAiChatPromptDriver(BasePromptDriver): ), kw_only=True, ) - _ratelimit_request_limit: Optional[int] = field(init=False, default=None) - _ratelimit_requests_remaining: Optional[int] = field(init=False, default=None) - _ratelimit_requests_reset_at: Optional[datetime] = field(init=False, default=None) - _ratelimit_token_limit: Optional[int] = field(init=False, default=None) - _ratelimit_tokens_remaining: Optional[int] = field(init=False, default=None) - _ratelimit_tokens_reset_at: Optional[datetime] = field(init=False, default=None) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - result = self.client.chat.completions.with_raw_response.create(**self._base_params(prompt_stack)) + result = self.client.chat.completions.create(**self._base_params(prompt_stack)) - self._extract_ratelimit_metadata(result) - - parsed_result = result.parse() - - if len(parsed_result.choices) == 1: - return TextArtifact(value=parsed_result.choices[0].message.content.strip()) + if len(result.choices) == 1: + return TextArtifact(value=result.choices[0].message.content.strip()) else: raise Exception("Completion with more than one choice is not supported yet.") @@ -136,33 +118,3 @@ def __to_openai_role(self, prompt_input: PromptStack.Input) -> str: return "assistant" else: return "user" - - def _extract_ratelimit_metadata(self, response): - # The OpenAI SDK's requestssession variable is global, so this hook will fire for all API requests. - # The following headers are not reliably returned in every API call, so we check for the presence of the - # headers before reading and parsing their values to prevent other SDK users from encountering KeyErrors. - reset_requests_at = response.headers.get("x-ratelimit-reset-requests") - if reset_requests_at is not None: - self._ratelimit_requests_reset_at = dateparser.parse( - reset_requests_at, settings={"PREFER_DATES_FROM": "future"} - ) - - # The dateparser utility doesn't handle sub-second durations as are sometimes returned by OpenAI's API. - # If the API returns, for example, "13ms", dateparser.parse() returns None. In this case, we will set - # the time value to the current time plus a one second buffer. - if self._ratelimit_requests_reset_at is None: - self._ratelimit_requests_reset_at = datetime.now() + timedelta(seconds=1) - - reset_tokens_at = response.headers.get("x-ratelimit-reset-tokens") - if reset_tokens_at is not None: - self._ratelimit_tokens_reset_at = dateparser.parse( - reset_tokens_at, settings={"PREFER_DATES_FROM": "future"} - ) - - if self._ratelimit_tokens_reset_at is None: - self._ratelimit_tokens_reset_at = datetime.now() + timedelta(seconds=1) - - self._ratelimit_request_limit = response.headers.get("x-ratelimit-limit-requests") - self._ratelimit_requests_remaining = response.headers.get("x-ratelimit-remaining-requests") - self._ratelimit_token_limit = response.headers.get("x-ratelimit-limit-tokens") - self._ratelimit_tokens_remaining = response.headers.get("x-ratelimit-remaining-tokens") diff --git a/poetry.lock b/poetry.lock index 87b88792a..ed65bc07f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1127,7 +1127,7 @@ test-randomorder = ["pytest-randomly"] name = "dateparser" version = "1.2.0" description = "Date parsing library designed to parse dates from HTML pages" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, @@ -4248,7 +4248,7 @@ six = ">=1.5" name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" -optional = false +optional = true python-versions = "*" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, @@ -5698,7 +5698,7 @@ files = [ name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" -optional = false +optional = true python-versions = ">=2" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, @@ -5709,7 +5709,7 @@ files = [ name = "tzlocal" version = "5.2" description = "tzinfo object for the local timezone" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, @@ -6096,4 +6096,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d0913fb4119f352710d722c55029eaa74e948d57e3fa5ffb345ca4e690f20ec2" +content-hash = "74de0d1e5ee382332635cea14dc0d39e288ab65adfec91569da0dbb06fd316e2" diff --git a/pyproject.toml b/pyproject.toml index 53c07257e..d58432b8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,6 @@ numpy = ">=1" stringcase = "^1.2.0" docker = "^7.1.0" sqlalchemy = "~=1.0" -dateparser = "^1.1.8" requests = "^2" # drivers diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index 9446d0520..f6bd12d80 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -7,11 +7,11 @@ class TestAzureOpenAiChatPromptDriver(TestOpenAiChatPromptDriverFixtureMixin): @pytest.fixture def mock_chat_completion_create(self, mocker): - mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.with_raw_response.create + mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create mock_choice = Mock() mock_choice.message.content = "model-output" mock_chat_create.return_value.headers = {} - mock_chat_create.return_value.parse.return_value.choices = [mock_choice] + mock_chat_create.return_value.choices = [mock_choice] return mock_chat_create @pytest.fixture diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index fbc939005..1f8f07cf5 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -1,5 +1,3 @@ -import datetime - from transformers import AutoTokenizer from griptape.drivers import OpenAiChatPromptDriver @@ -13,11 +11,11 @@ class TestOpenAiChatPromptDriverFixtureMixin: @pytest.fixture def mock_chat_completion_create(self, mocker): - mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.with_raw_response.create + mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create mock_choice = Mock() mock_choice.message.content = "model-output" mock_chat_create.return_value.headers = {} - mock_chat_create.return_value.parse.return_value.choices = [mock_choice] + mock_chat_create.return_value.choices = [mock_choice] return mock_chat_create @pytest.fixture @@ -202,7 +200,7 @@ def test_try_run_throws_when_prompt_stack_is_string(self): def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_chat_completion_create, prompt_stack): # Given driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, api_key="api-key") - mock_chat_completion_create.return_value.parse.return_value.choices = [choices] + mock_chat_completion_create.return_value.choices = [choices] # When with pytest.raises(Exception) as e: @@ -258,65 +256,6 @@ def test_max_output_tokens_with_max_tokens(self, messages): assert max_tokens == 42 - def test_extract_ratelimit_metadata(self): - response_with_headers = OpenAiApiResponseWithHeaders() - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - driver._extract_ratelimit_metadata(response_with_headers) - - assert driver._ratelimit_requests_remaining == response_with_headers.remaining_requests - assert driver._ratelimit_tokens_remaining == response_with_headers.remaining_tokens - assert driver._ratelimit_request_limit == response_with_headers.limit_requests - assert driver._ratelimit_token_limit == response_with_headers.limit_tokens - - # Assert that the reset times are within one second of the expected value. - expected_request_reset_time = datetime.datetime.now() + datetime.timedelta( - seconds=response_with_headers.reset_requests_in - ) - expected_token_reset_time = datetime.datetime.now() + datetime.timedelta( - seconds=response_with_headers.reset_tokens_in - ) - - assert driver._ratelimit_requests_reset_at is not None - assert abs(driver._ratelimit_requests_reset_at - expected_request_reset_time) < datetime.timedelta(seconds=1) - assert driver._ratelimit_tokens_reset_at is not None - assert abs(driver._ratelimit_tokens_reset_at - expected_token_reset_time) < datetime.timedelta(seconds=1) - - def test_extract_ratelimit_metadata_with_subsecond_reset_times(self): - response_with_headers = OpenAiApiResponseWithHeaders( - reset_requests_in=1, reset_requests_in_unit="ms", reset_tokens_in=10, reset_tokens_in_unit="ms" - ) - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, api_key="api-key") - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - driver._extract_ratelimit_metadata(response_with_headers) - - # Assert that the reset times are within one second of the expected value. With a sub-second reset time, - # this is rounded up to one second in the future. - expected_request_reset_time = datetime.datetime.now() + datetime.timedelta(seconds=1) - expected_token_reset_time = datetime.datetime.now() + datetime.timedelta(seconds=1) - - assert driver._ratelimit_requests_reset_at is not None - assert abs(driver._ratelimit_requests_reset_at - expected_request_reset_time) < datetime.timedelta(seconds=1) - assert driver._ratelimit_tokens_reset_at is not None - assert abs(driver._ratelimit_tokens_reset_at - expected_token_reset_time) < datetime.timedelta(seconds=1) - - def test_extract_ratelimit_metadata_missing_headers(self): - class OpenAiApiResponseNoHeaders: - @property - def headers(self): - return {} - - response_without_headers = OpenAiApiResponseNoHeaders() - - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - driver._extract_ratelimit_metadata(response_without_headers) - - assert driver._ratelimit_request_limit is None - assert driver._ratelimit_requests_remaining is None - assert driver._ratelimit_requests_reset_at is None - assert driver._ratelimit_token_limit is None - assert driver._ratelimit_tokens_remaining is None - assert driver._ratelimit_tokens_reset_at is None - def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messages): driver = OpenAiChatPromptDriver( model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, From 4e1f3b03c60f78a27cd05c3d02d73df12ce4d3d3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 6 Jun 2024 10:55:00 -0700 Subject: [PATCH 083/238] Remove Legacy `OpenAiChatCompletionPromptDriver` (#835) --- CHANGELOG.md | 1 + .../drivers/prompt-drivers.md | 32 ----- griptape/drivers/__init__.py | 4 - .../azure_openai_completion_prompt_driver.py | 41 ------- .../prompt/openai_completion_prompt_driver.py | 83 ------------- ...t_azure_openai_completion_prompt_driver.py | 75 ------------ .../test_openai_completion_prompt_driver.py | 112 ------------------ tests/utils/structure_tester.py | 11 -- 8 files changed, 1 insertion(+), 358 deletions(-) delete mode 100644 griptape/drivers/prompt/azure_openai_completion_prompt_driver.py delete mode 100644 griptape/drivers/prompt/openai_completion_prompt_driver.py delete mode 100644 tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py delete mode 100644 tests/unit/drivers/prompt/test_openai_completion_prompt_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0756ef35d..93d7b88ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `BedrockJurassicTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `BedrockLlamaTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `BedrockTitanTokenizer`, use `SimpleTokenizer` instead. +- **BREAKING**: Removed `OpenAiChatCompletionPromptDriver` as it uses the legacy [OpenAi Completions API](https://platform.openai.com/docs/api-reference/completions). - Updated `AmazonBedrockPromptDriver` to use [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 859dcec03..befbbd13a 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -125,38 +125,6 @@ agent = Agent( agent.run("Artificial intelligence is a technology with great promise.") ``` -### Azure OpenAI Completion - -The [AzureOpenAiCompletionPromptDriver](../../reference/griptape/drivers/prompt/azure_openai_completion_prompt_driver.md) connects to Azure OpenAI [Text Completion](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference) API. - -```python -import os -from griptape.structures import Agent -from griptape.drivers import AzureOpenAiCompletionPromptDriver -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AzureOpenAiCompletionPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="text-davinci-003", - azure_deployment=os.environ["AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - temperature=1 - ) - ) -) - -agent.run( - """ - Write a product launch email for new AI-powered headphones that are priced at $79.99 and available at Best Buy, Target and Amazon.com. The target audience is tech-savvy music lovers and the tone is friendly and exciting. - - 1. What should be the subject line of the email? - 2. What should be the body of the email? - """ -) -``` - ### Cohere The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_driver.md) connects to the Cohere [Generate](https://docs.cohere.ai/reference/generate) API. diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 02a3882fb..f9f5302ea 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -1,8 +1,6 @@ from .prompt.base_prompt_driver import BasePromptDriver from .prompt.openai_chat_prompt_driver import OpenAiChatPromptDriver -from .prompt.openai_completion_prompt_driver import OpenAiCompletionPromptDriver from .prompt.azure_openai_chat_prompt_driver import AzureOpenAiChatPromptDriver -from .prompt.azure_openai_completion_prompt_driver import AzureOpenAiCompletionPromptDriver from .prompt.cohere_prompt_driver import CoherePromptDriver from .prompt.huggingface_pipeline_prompt_driver import HuggingFacePipelinePromptDriver from .prompt.huggingface_hub_prompt_driver import HuggingFaceHubPromptDriver @@ -112,9 +110,7 @@ __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", - "OpenAiCompletionPromptDriver", "AzureOpenAiChatPromptDriver", - "AzureOpenAiCompletionPromptDriver", "CoherePromptDriver", "HuggingFacePipelinePromptDriver", "HuggingFaceHubPromptDriver", diff --git a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py deleted file mode 100644 index 4ff2a4902..000000000 --- a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import Callable, Optional -from attrs import define, field, Factory -from griptape.drivers import OpenAiCompletionPromptDriver -import openai - - -@define -class AzureOpenAiCompletionPromptDriver(OpenAiCompletionPromptDriver): - """ - Attributes: - azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. - azure_endpoint: An Azure OpenAi endpoint. - azure_ad_token: An optional Azure Active Directory token. - azure_ad_token_provider: An optional Azure Active Directory token provider. - api_version: An Azure OpenAi API version. - client: An `openai.AzureOpenAI` client. - """ - - azure_deployment: str = field( - kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} - ) - azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) - azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) - azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} - ) - api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) - client: openai.AzureOpenAI = field( - default=Factory( - lambda self: openai.AzureOpenAI( - organization=self.organization, - api_key=self.api_key, - api_version=self.api_version, - azure_endpoint=self.azure_endpoint, - azure_deployment=self.azure_deployment, - azure_ad_token=self.azure_ad_token, - azure_ad_token_provider=self.azure_ad_token_provider, - ), - takes_self=True, - ) - ) diff --git a/griptape/drivers/prompt/openai_completion_prompt_driver.py b/griptape/drivers/prompt/openai_completion_prompt_driver.py deleted file mode 100644 index 1a738a487..000000000 --- a/griptape/drivers/prompt/openai_completion_prompt_driver.py +++ /dev/null @@ -1,83 +0,0 @@ -from typing import Optional -from collections.abc import Iterator -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptDriver -from griptape.tokenizers import OpenAiTokenizer -import openai - - -@define -class OpenAiCompletionPromptDriver(BasePromptDriver): - """ - Attributes: - base_url: An optional OpenAi API URL. - api_key: An optional OpenAi API key. If not provided, the `OPENAI_API_KEY` environment variable will be used. - organization: An optional OpenAI organization. If not provided, the `OPENAI_ORG_ID` environment variable will be used. - client: An `openai.OpenAI` client. - model: An OpenAI model name. - tokenizer: An `OpenAiTokenizer`. - user: A user id. Can be used to track requests by user. - ignored_exception_types: An optional tuple of exception types to ignore. Defaults to OpenAI's known exception types. - """ - - base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) - organization: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - client: openai.OpenAI = field( - default=Factory( - lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), - takes_self=True, - ) - ) - model: str = field(kw_only=True, metadata={"serializable": True}) - tokenizer: OpenAiTokenizer = field( - default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), kw_only=True - ) - user: str = field(default="", kw_only=True, metadata={"serializable": True}) - ignored_exception_types: tuple[type[Exception], ...] = field( - default=Factory( - lambda: ( - openai.BadRequestError, - openai.AuthenticationError, - openai.PermissionDeniedError, - openai.NotFoundError, - openai.ConflictError, - openai.UnprocessableEntityError, - ) - ), - kw_only=True, - ) - - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - result = self.client.completions.create(**self._base_params(prompt_stack)) - - if len(result.choices) == 1: - return TextArtifact(value=result.choices[0].text.strip()) - else: - raise Exception("completion with more than one choice is not supported yet") - - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - result = self.client.completions.create(**self._base_params(prompt_stack), stream=True) - - for chunk in result: - if len(chunk.choices) == 1: - choice = chunk.choices[0] - delta_content = choice.text - yield TextArtifact(value=delta_content) - - else: - raise Exception("completion with more than one choice is not supported yet") - - def _base_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_string(prompt_stack) - - return { - "model": self.model, - "max_tokens": self.max_output_tokens(prompt), - "temperature": self.temperature, - "stop": self.tokenizer.stop_sequences, - "user": self.user, - "prompt": prompt, - } diff --git a/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py deleted file mode 100644 index 65758843a..000000000 --- a/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest -from unittest.mock import Mock -from griptape.drivers import AzureOpenAiCompletionPromptDriver -from tests.unit.drivers.prompt.test_openai_completion_prompt_driver import TestOpenAiCompletionPromptDriverFixtureMixin -from unittest.mock import ANY - - -class TestAzureOpenAiCompletionPromptDriver(TestOpenAiCompletionPromptDriverFixtureMixin): - @pytest.fixture - def mock_completion_create(self, mocker): - mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.completions.create - mock_choice = Mock() - mock_choice.text = "model-output" - mock_chat_create.return_value.choices = [mock_choice] - return mock_chat_create - - @pytest.fixture - def mock_completion_stream_create(self, mocker): - mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.completions.create - mock_chunk = Mock() - mock_choice = Mock() - mock_choice.text = "model-output" - mock_chunk.choices = [mock_choice] - mock_chat_create.return_value = iter([mock_chunk]) - return mock_chat_create - - def test_init(self): - assert AzureOpenAiCompletionPromptDriver( - azure_endpoint="endpoint", azure_deployment="deployment", model="text-davinci-003" - ) - assert ( - AzureOpenAiCompletionPromptDriver(azure_endpoint="endpoint", model="text-davinci-003").azure_deployment - == "text-davinci-003" - ) - - def test_try_run(self, mock_completion_create, prompt_stack, prompt): - # Given - driver = AzureOpenAiCompletionPromptDriver( - azure_endpoint="endpoint", azure_deployment="deployment", model="text-davinci-003" - ) - - # When - text_artifact = driver.try_run(prompt_stack) - - # Then - mock_completion_create.assert_called_once_with( - model=driver.model, - max_tokens=ANY, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - prompt=prompt, - ) - assert text_artifact.value == "model-output" - - def test_try_stream_run(self, mock_completion_stream_create, prompt_stack, prompt): - # Given - driver = AzureOpenAiCompletionPromptDriver( - azure_endpoint="endpoint", azure_deployment="deployment", model="text-davinci-003", stream=True - ) - - # When - text_artifact = next(driver.try_stream(prompt_stack)) - - # Then - mock_completion_stream_create.assert_called_once_with( - model=driver.model, - max_tokens=ANY, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - stream=True, - prompt=prompt, - ) - assert text_artifact.value == "model-output" diff --git a/tests/unit/drivers/prompt/test_openai_completion_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_completion_prompt_driver.py deleted file mode 100644 index 66998c261..000000000 --- a/tests/unit/drivers/prompt/test_openai_completion_prompt_driver.py +++ /dev/null @@ -1,112 +0,0 @@ -from griptape.drivers import OpenAiCompletionPromptDriver -from griptape.utils import PromptStack -from unittest.mock import ANY, Mock -from griptape.tokenizers import OpenAiTokenizer -import pytest - - -class TestOpenAiCompletionPromptDriverFixtureMixin: - @pytest.fixture - def mock_completion_create(self, mocker): - mock_chat_create = mocker.patch("openai.OpenAI").return_value.completions.create - mock_choice = Mock() - mock_choice.text = "model-output" - mock_chat_create.return_value.choices = [mock_choice] - return mock_chat_create - - @pytest.fixture - def mock_completion_stream_create(self, mocker): - mock_chat_create = mocker.patch("openai.OpenAI").return_value.completions.create - mock_chunk = Mock() - mock_choice = Mock() - mock_choice.text = "model-output" - mock_chunk.choices = [mock_choice] - mock_chat_create.return_value = iter([mock_chunk]) - return mock_chat_create - - @pytest.fixture - def prompt_stack(self): - prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") - return prompt_stack - - @pytest.fixture - def prompt(self): - return "".join( - [ - "generic-input\n\n", - "system-input\n\n", - "User: user-input\n\n", - "Assistant: assistant-input\n\n", - "Assistant:", - ] - ) - - -class TestOpenAiCompletionPromptDriver(TestOpenAiCompletionPromptDriverFixtureMixin): - def test_init(self): - assert OpenAiCompletionPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - - def test_try_run(self, mock_completion_create, prompt_stack, prompt): - # Given - driver = OpenAiCompletionPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - - # When - text_artifact = driver.try_run(prompt_stack) - - # Then - mock_completion_create.assert_called_once_with( - model=driver.model, - max_tokens=ANY, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - prompt=prompt, - ) - assert text_artifact.value == "model-output" - - def test_try_stream_run(self, mock_completion_stream_create, prompt_stack, prompt): - # Given - driver = OpenAiCompletionPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, stream=True) - - # When - text_artifact = next(driver.try_stream(prompt_stack)) - - # Then - mock_completion_stream_create.assert_called_once_with( - model=driver.model, - max_tokens=ANY, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - stream=True, - prompt=prompt, - ) - assert text_artifact.value == "model-output" - - def test_try_run_throws_when_prompt_stack_is_string(self): - # Given - driver = OpenAiCompletionPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - - # When - with pytest.raises(Exception) as e: - driver.try_run("prompt-stack") # pyright: ignore - - # Then - assert e.value.args[0] == "'str' object has no attribute 'inputs'" - - @pytest.mark.parametrize("choices", [[], [1, 2]]) - def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_completion_create, prompt_stack): - # Given - driver = OpenAiCompletionPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - mock_completion_create.return_value.choices = choices - - # When - with pytest.raises(Exception) as e: - driver.try_run(prompt_stack) - - # Then - e.value.args[0] == "Completion with more than one choice is not supported yet." diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 592843279..d21d52c93 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -16,7 +16,6 @@ AnthropicPromptDriver, CoherePromptDriver, OpenAiChatPromptDriver, - OpenAiCompletionPromptDriver, AzureOpenAiChatPromptDriver, AmazonSageMakerPromptDriver, SageMakerLlamaPromptModelDriver, @@ -49,12 +48,6 @@ class TesterPromptDriverOption: prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo-1106", api_key=os.environ["OPENAI_API_KEY"]), enabled=True, ), - "OPENAI_CHAT_35_TURBO_INSTRUCT": TesterPromptDriverOption( - prompt_driver=OpenAiCompletionPromptDriver( - model="gpt-3.5-turbo-instruct", api_key=os.environ["OPENAI_API_KEY"] - ), - enabled=True, - ), "OPENAI_CHAT_4": TesterPromptDriverOption( prompt_driver=OpenAiChatPromptDriver(model="gpt-4", api_key=os.environ["OPENAI_API_KEY"]), enabled=True ), @@ -65,10 +58,6 @@ class TesterPromptDriverOption: prompt_driver=OpenAiChatPromptDriver(model="gpt-4-1106-preview", api_key=os.environ["OPENAI_API_KEY"]), enabled=True, ), - "OPENAI_COMPLETION_DAVINCI": TesterPromptDriverOption( - prompt_driver=OpenAiCompletionPromptDriver(api_key=os.environ["OPENAI_API_KEY"], model="text-davinci-003"), - enabled=True, - ), "AZURE_CHAT_35_TURBO": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( api_key=os.environ["AZURE_OPENAI_API_KEY_1"], From 30aa370850e782e6f8a2e6c17ccb6146aaea5a6b Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 6 Jun 2024 13:01:56 -0700 Subject: [PATCH 084/238] Improve error when knowledgebase is missing a description (#839) --- CHANGELOG.md | 1 + .../tool.py | 4 +++- ...st_griptape_cloud_knowledge_base_client.py | 21 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93d7b88ce..1e5436df6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `BedrockLlamaTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `BedrockTitanTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `OpenAiChatCompletionPromptDriver` as it uses the legacy [OpenAi Completions API](https://platform.openai.com/docs/api-reference/completions). +- Improved error message when `GriptapeCloudKnowledgeBaseClient` does not have a description set. - Updated `AmazonBedrockPromptDriver` to use [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 917406cdd..96d24cccf 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -52,4 +52,6 @@ def _get_knowledge_base_description(self) -> str: if "description" in response: return response["description"] else: - raise ValueError(f'Error getting Knowledge Base description: {response["message"]}') + raise ValueError( + f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + ) diff --git a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py index 46270d216..a50929d66 100644 --- a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py +++ b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py @@ -19,6 +19,18 @@ def client(self, mocker): base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) + @pytest.fixture + def client_no_description(self, mocker): + from griptape.tools import GriptapeCloudKnowledgeBaseClient + + mock_response = mocker.Mock() + mock_response.json.return_value = {} + mocker.patch("requests.get", return_value=mock_response) + + return GriptapeCloudKnowledgeBaseClient( + base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" + ) + def test_query(self, client): assert isinstance(client.query({"values": {"query": "foo bar"}}), TextArtifact) @@ -27,3 +39,12 @@ def test_get_knowledge_base_description(self, client): client.description = "foo bar" assert client._get_knowledge_base_description() == "foo bar" + + def test_get_knowledge_base_description_error(self, client_no_description): + with pytest.raises(ValueError) as e: + client_no_description._get_knowledge_base_description() + + assert ( + str(e) + == f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + ) From 5e2e1a1bfd6a50703215226fe2cc401cc4c58f30 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 7 Jun 2024 11:13:06 -0700 Subject: [PATCH 085/238] Remove old tokenizer docs (#841) --- docs/griptape-framework/misc/tokenizers.md | 50 ---------------------- 1 file changed, 50 deletions(-) diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index aaf488187..1975fc977 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -78,56 +78,6 @@ print(tokenizer.count_input_tokens_left("Hello world!")) print(tokenizer.count_output_tokens_left("Hello world!")) ``` -### Bedrock - -#### Anthropic Claude -```python -from griptape.tokenizers import BedrockClaudeTokenizer - - -tokenizer = BedrockClaudeTokenizer(model="anthropic.claude-3-sonnet-20240229-v1:0") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) -``` - -#### Amazon Titan -```python -from griptape.tokenizers import BedrockTitanTokenizer - - -tokenizer = BedrockTitanTokenizer(model="amazon.titan-text-express-v1") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) -``` - -#### Meta Llama 2 -```python -from griptape.tokenizers import BedrockLlamaTokenizer - - -tokenizer = BedrockLlamaTokenizer(model="meta.llama2-13b-chat-v1") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) -``` - -#### Ai21 Jurassic -```python -from griptape.tokenizers import BedrockJurassicTokenizer - - -tokenizer = BedrockJurassicTokenizer(model="ai21.j2-ultra-v1") - -print(tokenizer.count_tokens("Hello world!")) -print(tokenizer.count_input_tokens_left("Hello world!")) -print(tokenizer.count_output_tokens_left("Hello world!")) -``` - ### Simple Not all LLM providers have a public tokenizer API. In this case, you can use the `SimpleTokenizer` to count tokens based on a simple heuristic. From 839ffb812dea7aa47d53fb5d3dcbcf9c83d23d52 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 7 Jun 2024 11:22:41 -0700 Subject: [PATCH 086/238] Correctly Ignore TYPE_CHECKING in coverage (#845) --- .coveragerc | 33 ++++++++++----------------------- .gitignore | 5 ++++- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/.coveragerc b/.coveragerc index a55d8962f..6112755cc 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,28 +1,15 @@ [run] -data_file = coverage/.coverage branch = True [report] -; Regexes for lines to exclude from consideration exclude_also = - ; Don't complain about missing debug-only code: - def __repr__ - if self\.debug - - ; Don't complain if tests don't hit defensive assertion code: - raise AssertionError - raise NotImplementedError - - ; Don't complain if non-runnable code isn't run: - if 0: - if __name__ == .__main__.: - if TYPE_CHECKING: - - ; Don't complain about abstract methods, they aren't run: - @(abc\.)?abstractmethod - -[html] -directory = coverage/html - -[xml] -output = coverage/coverage.xml + def __repr__ + if self.debug: + if settings.DEBUG + raise AssertionError + raise NotImplementedError + if 0: + if __name__ == .__main__.: + if TYPE_CHECKING: + class .*\bProtocol\): + @(abc\.)?abstractmethod diff --git a/.gitignore b/.gitignore index ba63b4aca..c71d930a9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ __pycache__ npm-debug.log **/.mypy_cache/** !yarn.lock -coverage/ cucumber-report.json **/.vscode-test/** **/.vscode test/** @@ -57,3 +56,7 @@ dist/** # mkdocs build output site reference + +# coverage.py +htmlcov/ +coverage.* From 029a65d2f6bb61ed8b6f74b8a2affd91f1f3741d Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 7 Jun 2024 12:53:38 -0700 Subject: [PATCH 087/238] Reduce scope of Amazon SageMaker Prompt Driver to only Jumpstart (#837) --- CHANGELOG.md | 12 +- .../drivers/embedding-drivers.md | 32 +---- .../drivers/prompt-drivers.md | 70 ++------- griptape/drivers/__init__.py | 26 +--- .../amazon_sagemaker_embedding_driver.py | 31 ---- ...on_sagemaker_jumpstart_embedding_driver.py | 53 +++++++ .../base_multi_model_embedding_driver.py | 15 -- griptape/drivers/embedding_model/__init__.py | 0 .../base_embedding_model_driver.py | 11 -- ...aker_huggingface_embedding_model_driver.py | 11 -- ...r_tensorflow_hub_embedding_model_driver.py | 11 -- ...mazon_sagemaker_jumpstart_prompt_driver.py | 95 +++++++++++++ .../prompt/amazon_sagemaker_prompt_driver.py | 52 ------- .../prompt/base_multi_model_prompt_driver.py | 38 ----- griptape/drivers/prompt_model/__init__.py | 0 .../prompt_model/base_prompt_model_driver.py | 29 ---- .../sagemaker_falcon_prompt_model_driver.py | 42 ------ .../sagemaker_llama_prompt_model_driver.py | 47 ------ griptape/schemas/base_schema.py | 3 +- .../test_sagemaker_embedding_driver.py | 33 ----- ...st_sagemaker_jumpstart_embedding_driver.py | 59 ++++++++ .../unit/drivers/embedding_model/__init__.py | 0 ...aker_huggingface_embedding_model_driver.py | 21 --- ...r_tensorflow_hub_embedding_model_driver.py | 21 --- ...mazon_sagemaker_jumpstart_prompt_driver.py | 134 ++++++++++++++++++ .../test_amazon_sagemaker_prompt_driver.py | 90 ------------ tests/unit/drivers/prompt_models/__init__.py | 0 ...st_sagemaker_falcon_prompt_model_driver.py | 43 ------ ...est_sagemaker_llama_prompt_model_driver.py | 67 --------- tests/utils/structure_tester.py | 14 +- 30 files changed, 374 insertions(+), 686 deletions(-) delete mode 100644 griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py create mode 100644 griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py delete mode 100644 griptape/drivers/embedding/base_multi_model_embedding_driver.py delete mode 100644 griptape/drivers/embedding_model/__init__.py delete mode 100644 griptape/drivers/embedding_model/base_embedding_model_driver.py delete mode 100644 griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py delete mode 100644 griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py create mode 100644 griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py delete mode 100644 griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py delete mode 100644 griptape/drivers/prompt/base_multi_model_prompt_driver.py delete mode 100644 griptape/drivers/prompt_model/__init__.py delete mode 100644 griptape/drivers/prompt_model/base_prompt_model_driver.py delete mode 100644 griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py delete mode 100644 griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py delete mode 100644 tests/unit/drivers/embedding/test_sagemaker_embedding_driver.py create mode 100644 tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py delete mode 100644 tests/unit/drivers/embedding_model/__init__.py delete mode 100644 tests/unit/drivers/embedding_model/test_sagemaker_huggingface_embedding_model_driver.py delete mode 100644 tests/unit/drivers/embedding_model/test_sagemaker_tensorflow_hub_embedding_model_driver.py create mode 100644 tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py delete mode 100644 tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py delete mode 100644 tests/unit/drivers/prompt_models/__init__.py delete mode 100644 tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py delete mode 100644 tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e5436df6..0d62a76cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Structure.resolve_relationships()` to resolve asymmetrically defined parent/child relationships. In other words, if a parent declares a child, but the child does not declare the parent, the parent will automatically be added as a parent of the child when running this method. The method is invoked automatically by `Structure.before_run()`. - `CohereEmbeddingDriver` for using Cohere's embeddings API. - `CohereStructureConfig` for providing Structures with quick Cohere configuration. +- `AmazonSageMakerJumpstartPromptDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. +- `AmazonSageMakerJumpstartEmbeddingDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. +- `AmazonSageMakerJumpstartEmbeddingDriver.custom_attributes` for setting custom attributes when invoking an endpoint. ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. @@ -27,6 +30,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `BedrockLlamaTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `BedrockTitanTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `OpenAiChatCompletionPromptDriver` as it uses the legacy [OpenAi Completions API](https://platform.openai.com/docs/api-reference/completions). +- **BREAKING**: Renamed `AmazonSagemakerPromptDriver` to `AmazonSageMakerJumpstartPromptDriver`. +- **BREAKING**: Removed `SagemakerFalconPromptModelDriver`, use `AmazonSageMakerJumpstartPromptDriver` instead. +- **BREAKING**: Removed `SagemakerLlamaPromptModelDriver`, use `AmazonSageMakerJumpstartPromptDriver` instead. +- **BREAKING**: Renamed `AmazonSagemakerEmbeddingDriver` to `AmazonSageMakerJumpstartEmbeddingDriver`. +- **BREAKING**: Removed `SagemakerHuggingfaceEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. +- **BREAKING**: Removed `SagemakerTensorflowHubEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. +- **BREAKING**: `AmazonSageMakerJumpstartPromptDriver.model` parameter, which gets passed to `SageMakerRuntime.Client.invoke_endpoint` as `EndpointName`, is now renamed to `AmazonSageMakerPromptDriver.endpoint`. - Improved error message when `GriptapeCloudKnowledgeBaseClient` does not have a description set. - Updated `AmazonBedrockPromptDriver` to use [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. @@ -263,7 +273,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ImageLoader` for loading images files into `ImageArtifact`s. - Support for all Tokenizers in `OpenAiChatPromptDriver`, enabling OpenAI drop-in clients such as Together AI. -- `AmazonSageMakerEmbeddingDriver` for using Amazon SageMaker to generate embeddings. Thanks @KaushikIyer16! +- `AmazonSageMakerJumpstartEmbeddingDriver` for using Amazon SageMaker to generate embeddings. Thanks @KaushikIyer16! - Claude 2.1 support in `AnthropicPromptDriver` and `AmazonBedrockPromptDriver` via `BedrockClaudePromptModelDriver`. - `CodeExecutionTask` for executing code as a Task without the need for an LLM. - `BedrockLlamaPromptModelDriver` for using Llama models on Amazon Bedrock. diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 58182b03e..74a6f550e 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -99,43 +99,21 @@ embeddings = driver.embed_string("Hello world!") # display the first 3 embeddings print(embeddings[:3]) -``` -### Multi Model Embedding Drivers -Certain embeddings providers such as Amazon SageMaker support many types of models, each with their own slight differences in parameters and response formats. To support this variation across models, these Embedding Drivers takes a [Embedding Model Driver](../../reference/griptape/drivers/embedding_model/base_embedding_model_driver.md) -through the [embedding_model_driver](../../reference/griptape/drivers/embedding/base_multi_model_embedding_driver.md#griptape.drivers.embedding.base_multi_model_embedding_driver.BaseMultiModelEmbeddingDriver.embedding_model_driver) parameter. -[Embedding Model Driver](../../reference/griptape/drivers/embedding_model/base_embedding_model_driver.md)s allows for model-specific customization for Embedding Drivers. -#### SageMaker Embeddings +``` +### Amazon SageMaker Jumpstart Embeddings -The [AmazonSageMakerEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.md) uses the [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) to generate embeddings on AWS. +The [AmazonSageMakerJumpstartEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.md) uses the [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) to generate embeddings on AWS. !!! info This driver requires the `drivers-embedding-amazon-sagemaker` [extra](../index.md#extras). -##### TensorFlow Hub Models ```python title="PYTEST_IGNORE" import os -from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerTensorFlowHubEmbeddingModelDriver +from griptape.drivers import AmazonSageMakerJumpstartEmbeddingDriver, SageMakerTensorFlowHubEmbeddingModelDriver -driver = AmazonSageMakerEmbeddingDriver( +driver = AmazonSageMakerJumpstartEmbeddingDriver( model=os.environ["SAGEMAKER_TENSORFLOW_HUB_MODEL"], - embedding_model_driver=SageMakerTensorFlowHubEmbeddingModelDriver(), -) - -embeddings = driver.embed_string("Hello world!") - -# display the first 3 embeddings -print(embeddings[:3]) -``` - -##### HuggingFace Models -```python title="PYTEST_IGNORE" -import os -from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerHuggingFaceEmbeddingModelDriver - -driver = AmazonSageMakerEmbeddingDriver( - model=os.environ["SAGEMAKER_HUGGINGFACE_MODEL"], - embedding_model_driver=SageMakerHuggingFaceEmbeddingModelDriver(), ) embeddings = driver.embed_string("Hello world!") diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index befbbd13a..0f376cd5f 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -347,87 +347,35 @@ agent = Agent( agent.run("How many helicopters can a human eat in one sitting?") ``` -### Multi Model Prompt Drivers -Certain LLM providers such as Amazon SageMaker support many types of models, each with their own slight differences in prompt structure and parameters. To support this variation across models, these Prompt Drivers takes a [Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md) -through the [prompt_model_driver](../../reference/griptape/drivers/prompt/base_multi_model_prompt_driver.md#griptape.drivers.prompt.base_multi_model_prompt_driver.BaseMultiModelPromptDriver.prompt_model_driver) parameter. -[Prompt Model Driver](../../reference/griptape/drivers/prompt_model/base_prompt_model_driver.md)s allows for model-specific customization for Prompt Drivers. - - -#### Amazon SageMaker +#### Amazon SageMaker Jumpstart !!! info This driver requires the `drivers-prompt-amazon-sagemaker` [extra](../index.md#extras). -The [AmazonSageMakerPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.md) uses [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) for inference on AWS. - -!!! info - For single model endpoints, the `model` parameter does not need to be specified. - For multi-model endpoints, the `model` parameter should be the inference component name. - -!!! warning - Make sure that the selected prompt model driver is compatible with the selected model. Note that even the same - logical model can require different prompt model drivers depending on how it is bundled in the endpoint. For - example, the reponse format are different for `Meta-Llama-3-8B-Instruct` when deployed via - "Amazon SageMaker JumpStart" and "Hugging Face on Amazon SageMaker". - -##### Llama +The [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) uses [Amazon SageMaker Jumpstart](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-jumpstart.html) for inference on AWS. -!!! info - `SageMakerLlamaPromptModelDriver` requires a tokenizer corresponding to a [Gated Model](https://huggingface.co/docs/hub/en/models-gated) on Hugging Face. +Amazon Sagemaker Jumpstart provides a wide range of models with varying capabilities. +This Driver has been primarily _chat-optimized_ models that have a [Huggingface Chat Template](https://huggingface.co/docs/transformers/en/chat_templating) available. +If your model does not fit this use-case, we suggest sub-classing [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) and overriding the [_to_model_input](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver/#griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver.AmazonSagemakerJumpstartPromptDriver._to_model_input) and [_to_model_params](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver/#griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver.AmazonSagemakerJumpstartPromptDriver._to_model_params) methods. - Make sure to request access to the [Meta-Llama-3-8B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct) model on Hugging Face and configure your environment for hugging face use. - -```python title="PYTEST_IGNORE" -import os -from griptape.structures import Agent -from griptape.drivers import ( - AmazonSageMakerPromptDriver, - SageMakerLlamaPromptModelDriver, -) -from griptape.rules import Rule -from griptape.config import StructureConfig - -agent = Agent( - config=StructureConfig( - prompt_driver=AmazonSageMakerPromptDriver( - endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], - model=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_INFERENCE_COMPONENT_NAME"], - prompt_model_driver=SageMakerLlamaPromptModelDriver(), - temperature=0.75, - ) - ), - rules=[ - Rule( - value="You are a helpful, respectful and honest assistant who is also a swarthy pirate." - "You only speak like a pirate and you never break character." - ) - ], -) - -agent.run("Hello!") -``` - -##### Falcon ```python title="PYTEST_IGNORE" import os from griptape.structures import Agent from griptape.drivers import ( - AmazonSageMakerPromptDriver, + AmazonSageMakerJumpstartPromptDriver, SageMakerFalconPromptModelDriver, ) from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - prompt_driver=AmazonSageMakerPromptDriver( - endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], - model=os.environ["SAGEMAKER_FALCON_INFERENCE_COMPONENT_NAME"], - prompt_model_driver=SageMakerFalconPromptModelDriver(), + prompt_driver=AmazonSageMakerJumpstartPromptDriver( + endpoint=os.environ["SAGEMAKER_LLAMA_3_INSTRUCT_ENDPOINT_NAME"], + model="meta-llama/Meta-Llama-3-8B-Instruct", ) ) ) agent.run("What is a good lasagna recipe?") - ``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index f9f5302ea..44a2941c9 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -5,10 +5,9 @@ from .prompt.huggingface_pipeline_prompt_driver import HuggingFacePipelinePromptDriver from .prompt.huggingface_hub_prompt_driver import HuggingFaceHubPromptDriver from .prompt.anthropic_prompt_driver import AnthropicPromptDriver -from .prompt.amazon_sagemaker_prompt_driver import AmazonSageMakerPromptDriver +from .prompt.amazon_sagemaker_jumpstart_prompt_driver import AmazonSageMakerJumpstartPromptDriver from .prompt.amazon_bedrock_prompt_driver import AmazonBedrockPromptDriver from .prompt.google_prompt_driver import GooglePromptDriver -from .prompt.base_multi_model_prompt_driver import BaseMultiModelPromptDriver from .prompt.dummy_prompt_driver import DummyPromptDriver from .memory.conversation.base_conversation_memory_driver import BaseConversationMemoryDriver @@ -19,8 +18,7 @@ from .embedding.base_embedding_driver import BaseEmbeddingDriver from .embedding.openai_embedding_driver import OpenAiEmbeddingDriver from .embedding.azure_openai_embedding_driver import AzureOpenAiEmbeddingDriver -from .embedding.base_multi_model_embedding_driver import BaseMultiModelEmbeddingDriver -from .embedding.amazon_sagemaker_embedding_driver import AmazonSageMakerEmbeddingDriver +from .embedding.amazon_sagemaker_jumpstart_embedding_driver import AmazonSageMakerJumpstartEmbeddingDriver from .embedding.amazon_bedrock_titan_embedding_driver import AmazonBedrockTitanEmbeddingDriver from .embedding.amazon_bedrock_cohere_embedding_driver import AmazonBedrockCohereEmbeddingDriver from .embedding.voyageai_embedding_driver import VoyageAiEmbeddingDriver @@ -29,10 +27,6 @@ from .embedding.dummy_embedding_driver import DummyEmbeddingDriver from .embedding.cohere_embedding_driver import CohereEmbeddingDriver -from .embedding_model.base_embedding_model_driver import BaseEmbeddingModelDriver -from .embedding_model.sagemaker_huggingface_embedding_model_driver import SageMakerHuggingFaceEmbeddingModelDriver -from .embedding_model.sagemaker_tensorflow_hub_embedding_model_driver import SageMakerTensorFlowHubEmbeddingModelDriver - from .vector.base_vector_store_driver import BaseVectorStoreDriver from .vector.local_vector_store_driver import LocalVectorStoreDriver from .vector.pinecone_vector_store_driver import PineconeVectorStoreDriver @@ -50,10 +44,6 @@ from .sql.snowflake_sql_driver import SnowflakeSqlDriver from .sql.sql_driver import SqlDriver -from .prompt_model.base_prompt_model_driver import BasePromptModelDriver -from .prompt_model.sagemaker_llama_prompt_model_driver import SageMakerLlamaPromptModelDriver -from .prompt_model.sagemaker_falcon_prompt_model_driver import SageMakerFalconPromptModelDriver - from .image_generation_model.base_image_generation_model_driver import BaseImageGenerationModelDriver from .image_generation_model.bedrock_stable_diffusion_image_generation_model_driver import ( BedrockStableDiffusionImageGenerationModelDriver, @@ -115,10 +105,9 @@ "HuggingFacePipelinePromptDriver", "HuggingFaceHubPromptDriver", "AnthropicPromptDriver", - "AmazonSageMakerPromptDriver", + "AmazonSageMakerJumpstartPromptDriver", "AmazonBedrockPromptDriver", "GooglePromptDriver", - "BaseMultiModelPromptDriver", "DummyPromptDriver", "BaseConversationMemoryDriver", "LocalConversationMemoryDriver", @@ -127,18 +116,14 @@ "BaseEmbeddingDriver", "OpenAiEmbeddingDriver", "AzureOpenAiEmbeddingDriver", - "BaseMultiModelEmbeddingDriver", - "AmazonSageMakerEmbeddingDriver", + "AmazonSageMakerJumpstartEmbeddingDriver", "AmazonBedrockTitanEmbeddingDriver", "AmazonBedrockCohereEmbeddingDriver", "VoyageAiEmbeddingDriver", "HuggingFaceHubEmbeddingDriver", "GoogleEmbeddingDriver", "DummyEmbeddingDriver", - "BaseEmbeddingModelDriver", "CohereEmbeddingDriver", - "SageMakerHuggingFaceEmbeddingModelDriver", - "SageMakerTensorFlowHubEmbeddingModelDriver", "BaseVectorStoreDriver", "LocalVectorStoreDriver", "PineconeVectorStoreDriver", @@ -154,9 +139,6 @@ "AmazonRedshiftSqlDriver", "SnowflakeSqlDriver", "SqlDriver", - "BasePromptModelDriver", - "SageMakerLlamaPromptModelDriver", - "SageMakerFalconPromptModelDriver", "BaseImageGenerationModelDriver", "BedrockStableDiffusionImageGenerationModelDriver", "BedrockTitanImageGenerationModelDriver", diff --git a/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py b/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py deleted file mode 100644 index 4ab6d2bf7..000000000 --- a/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations -from typing import TYPE_CHECKING -import json -from typing import Any - -from attrs import Factory, define, field - -from griptape.drivers import BaseMultiModelEmbeddingDriver -from griptape.utils import import_optional_dependency - -if TYPE_CHECKING: - from griptape.drivers import BaseEmbeddingModelDriver - import boto3 - - -@define -class AmazonSageMakerEmbeddingDriver(BaseMultiModelEmbeddingDriver): - session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - sagemaker_client: Any = field( - default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True - ) - embedding_model_driver: BaseEmbeddingModelDriver = field(kw_only=True) - - def try_embed_chunk(self, chunk: str) -> list[float]: - payload = self.embedding_model_driver.chunk_to_model_params(chunk) - endpoint_response = self.sagemaker_client.invoke_endpoint( - EndpointName=self.model, ContentType="application/x-text", Body=json.dumps(payload).encode("utf-8") - ) - - response = json.loads(endpoint_response.get("Body").read().decode("utf-8")) - return self.embedding_model_driver.process_output(response) diff --git a/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py new file mode 100644 index 000000000..2b764c2f4 --- /dev/null +++ b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py @@ -0,0 +1,53 @@ +from __future__ import annotations +from typing import TYPE_CHECKING +import json +from typing import Any, Optional + +from attrs import Factory, define, field + +from griptape.drivers import BaseEmbeddingDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + import boto3 + + +@define +class AmazonSageMakerJumpstartEmbeddingDriver(BaseEmbeddingDriver): + session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) + sagemaker_client: Any = field( + default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True + ) + endpoint: str = field(kw_only=True, metadata={"serializable": True}) + custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) + inference_component_name: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + + def try_embed_chunk(self, chunk: str) -> list[float]: + payload = {"text_inputs": chunk, "mode": "embedding"} + + endpoint_response = self.sagemaker_client.invoke_endpoint( + EndpointName=self.endpoint, + ContentType="application/json", + Body=json.dumps(payload).encode("utf-8"), + CustomAttributes=self.custom_attributes, + **( + {"InferenceComponentName": self.inference_component_name} + if self.inference_component_name is not None + else {} + ), + ) + + response = json.loads(endpoint_response.get("Body").read().decode("utf-8")) + + if "embedding" in response: + embedding = response["embedding"] + + if embedding: + if isinstance(embedding[0], list): + return embedding[0] + else: + return embedding + else: + raise ValueError("model response is empty") + else: + raise ValueError("invalid response from model") diff --git a/griptape/drivers/embedding/base_multi_model_embedding_driver.py b/griptape/drivers/embedding/base_multi_model_embedding_driver.py deleted file mode 100644 index 90f827ad2..000000000 --- a/griptape/drivers/embedding/base_multi_model_embedding_driver.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations -from abc import ABC -from typing import TYPE_CHECKING - -from attrs import define, field - -from griptape.drivers import BaseEmbeddingDriver - -if TYPE_CHECKING: - from griptape.drivers import BaseEmbeddingModelDriver - - -@define -class BaseMultiModelEmbeddingDriver(BaseEmbeddingDriver, ABC): - embedding_model_driver: BaseEmbeddingModelDriver = field(kw_only=True) diff --git a/griptape/drivers/embedding_model/__init__.py b/griptape/drivers/embedding_model/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/griptape/drivers/embedding_model/base_embedding_model_driver.py b/griptape/drivers/embedding_model/base_embedding_model_driver.py deleted file mode 100644 index ad7bf3bda..000000000 --- a/griptape/drivers/embedding_model/base_embedding_model_driver.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import define -from abc import ABC, abstractmethod - - -@define -class BaseEmbeddingModelDriver(ABC): - @abstractmethod - def chunk_to_model_params(self, chunk: str) -> dict: ... - - @abstractmethod - def process_output(self, output: dict) -> list[float]: ... diff --git a/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py b/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py deleted file mode 100644 index dceffcd8a..000000000 --- a/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import define -from griptape.drivers import BaseEmbeddingModelDriver - - -@define -class SageMakerHuggingFaceEmbeddingModelDriver(BaseEmbeddingModelDriver): - def chunk_to_model_params(self, chunk: str) -> dict: - return {"text_inputs": chunk} - - def process_output(self, output: dict) -> list[float]: - return output["embedding"][0] diff --git a/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py b/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py deleted file mode 100644 index 9d9632fb0..000000000 --- a/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import define -from griptape.drivers import BaseEmbeddingModelDriver - - -@define -class SageMakerTensorFlowHubEmbeddingModelDriver(BaseEmbeddingModelDriver): - def chunk_to_model_params(self, chunk: str) -> dict: - return {"text_inputs": chunk} - - def process_output(self, output: dict) -> list[float]: - return output["embedding"] diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py new file mode 100644 index 000000000..54247d001 --- /dev/null +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import json +from collections.abc import Iterator +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field + +from griptape.artifacts import TextArtifact +from griptape.drivers.prompt.base_prompt_driver import BasePromptDriver +from griptape.tokenizers import HuggingFaceTokenizer +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + import boto3 + + from griptape.utils import PromptStack + + +@define +class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): + session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) + sagemaker_client: Any = field( + default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True + ) + endpoint: str = field(kw_only=True, metadata={"serializable": True}) + custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) + inference_component_name: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) + tokenizer: HuggingFaceTokenizer = field( + default=Factory( + lambda self: HuggingFaceTokenizer( + tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained(self.model), + max_output_tokens=self.max_tokens, + ), + takes_self=True, + ), + kw_only=True, + ) + + @stream.validator # pyright: ignore + def validate_stream(self, _, stream): + if stream: + raise ValueError("streaming is not supported") + + def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + payload = {"inputs": self._to_model_input(prompt_stack), "parameters": self._to_model_params(prompt_stack)} + + response = self.sagemaker_client.invoke_endpoint( + EndpointName=self.endpoint, + ContentType="application/json", + Body=json.dumps(payload), + CustomAttributes=self.custom_attributes, + **( + {"InferenceComponentName": self.inference_component_name} + if self.inference_component_name is not None + else {} + ), + ) + + decoded_body = json.loads(response["Body"].read().decode("utf8")) + + if isinstance(decoded_body, list): + if decoded_body: + return TextArtifact(decoded_body[0]["generated_text"]) + else: + raise ValueError("model response is empty") + else: + return TextArtifact(decoded_body["generated_text"]) + + def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + raise NotImplementedError("streaming is not supported") + + def _to_model_input(self, prompt_stack: PromptStack) -> str: + prompt = self.tokenizer.tokenizer.apply_chat_template( + [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], + tokenize=False, + add_generation_prompt=True, + ) + + if isinstance(prompt, str): + return prompt + else: + raise ValueError("Invalid output type.") + + def _to_model_params(self, prompt_stack: PromptStack) -> dict: + return { + "temperature": self.temperature, + "max_new_tokens": self.max_tokens, + "do_sample": True, + "eos_token_id": self.tokenizer.tokenizer.eos_token_id, + "stop_strings": self.tokenizer.stop_sequences, + "return_full_text": False, + } diff --git a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py deleted file mode 100644 index 2934ea642..000000000 --- a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations -import json -from typing import TYPE_CHECKING, Any -from collections.abc import Iterator -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact -from griptape.utils import import_optional_dependency -from .base_multi_model_prompt_driver import BaseMultiModelPromptDriver - -if TYPE_CHECKING: - from griptape.utils import PromptStack - import boto3 - - -@define -class AmazonSageMakerPromptDriver(BaseMultiModelPromptDriver): - session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - sagemaker_client: Any = field( - default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True - ) - endpoint: str = field(kw_only=True, metadata={"serializable": True}) - model: str = field(default=None, kw_only=True, metadata={"serializable": True}) - custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) - stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) - - @stream.validator # pyright: ignore - def validate_stream(self, _, stream): - if stream: - raise ValueError("streaming is not supported") - - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - payload = { - "inputs": self.prompt_model_driver.prompt_stack_to_model_input(prompt_stack), - "parameters": self.prompt_model_driver.prompt_stack_to_model_params(prompt_stack), - } - response = self.sagemaker_client.invoke_endpoint( - EndpointName=self.endpoint, - ContentType="application/json", - Body=json.dumps(payload), - CustomAttributes=self.custom_attributes, - **({"InferenceComponentName": self.model} if self.model is not None else {}), - ) - - decoded_body = json.loads(response["Body"].read().decode("utf8")) - - if decoded_body: - return self.prompt_model_driver.process_output(decoded_body) - else: - raise Exception("model response is empty") - - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - raise NotImplementedError("streaming is not supported") diff --git a/griptape/drivers/prompt/base_multi_model_prompt_driver.py b/griptape/drivers/prompt/base_multi_model_prompt_driver.py deleted file mode 100644 index 5411ea730..000000000 --- a/griptape/drivers/prompt/base_multi_model_prompt_driver.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations -from attrs import define, field -from abc import ABC -from .base_prompt_driver import BasePromptDriver -from typing import TYPE_CHECKING, Optional - -if TYPE_CHECKING: - from griptape.tokenizers import BaseTokenizer - from griptape.drivers import BasePromptModelDriver - - -@define -class BaseMultiModelPromptDriver(BasePromptDriver, ABC): - """Prompt Driver for platforms like Amazon SageMaker, and Amazon Bedrock that host many LLM models. - - Instances of this Prompt Driver require a Prompt Model Driver which is used to convert the prompt stack - into a model input and parameters, and to process the model output. - - Attributes: - model: Name of the model to use. - tokenizer: Tokenizer to use. Defaults to the Tokenizer of the Prompt Model Driver. - prompt_model_driver: Prompt Model Driver to use. - """ - - tokenizer: Optional[BaseTokenizer] = field(default=None, kw_only=True) - prompt_model_driver: BasePromptModelDriver = field(kw_only=True, metadata={"serializable": True}) - stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) - - @stream.validator # pyright: ignore - def validate_stream(self, _, stream): - if stream and not self.prompt_model_driver.supports_streaming: - raise ValueError(f"{self.prompt_model_driver.__class__.__name__} does not support streaming") - - def __attrs_post_init__(self) -> None: - self.prompt_model_driver.prompt_driver = self - - if not self.tokenizer: - self.tokenizer = self.prompt_model_driver.tokenizer diff --git a/griptape/drivers/prompt_model/__init__.py b/griptape/drivers/prompt_model/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/griptape/drivers/prompt_model/base_prompt_model_driver.py b/griptape/drivers/prompt_model/base_prompt_model_driver.py deleted file mode 100644 index 096802370..000000000 --- a/griptape/drivers/prompt_model/base_prompt_model_driver.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations -from abc import ABC, abstractmethod -from typing import Optional -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack -from griptape.drivers import BasePromptDriver -from griptape.tokenizers import BaseTokenizer -from griptape.mixins import SerializableMixin - - -@define -class BasePromptModelDriver(SerializableMixin, ABC): - max_tokens: Optional[int] = field(default=None, kw_only=True) - prompt_driver: Optional[BasePromptDriver] = field(default=None, kw_only=True) - supports_streaming: bool = field(default=True, kw_only=True) - - @property - @abstractmethod - def tokenizer(self) -> BaseTokenizer: ... - - @abstractmethod - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str | list | dict: ... - - @abstractmethod - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: ... - - @abstractmethod - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: ... diff --git a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py deleted file mode 100644 index a5a8a4dc9..000000000 --- a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack, import_optional_dependency -from griptape.drivers import BasePromptModelDriver -from griptape.tokenizers import HuggingFaceTokenizer - - -@define -class SageMakerFalconPromptModelDriver(BasePromptModelDriver): - DEFAULT_MAX_TOKENS = 600 - - _tokenizer: HuggingFaceTokenizer = field(default=None, kw_only=True) - - @property - def tokenizer(self) -> HuggingFaceTokenizer: - if self._tokenizer is None: - self._tokenizer = HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained("tiiuae/falcon-40b"), - max_output_tokens=self.max_tokens or self.DEFAULT_MAX_TOKENS, - ) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str: - return self.prompt_driver.prompt_stack_to_string(prompt_stack) - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_stack_to_model_input(prompt_stack) - stop_sequences = self.prompt_driver.tokenizer.stop_sequences - - return { - "max_new_tokens": self.prompt_driver.max_output_tokens(prompt), - "temperature": self.prompt_driver.temperature, - "do_sample": True, - "stop": stop_sequences, - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - if isinstance(output, list): - return TextArtifact(output[0]["generated_text"].strip()) - else: - raise ValueError("output must be an instance of 'list'") diff --git a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py deleted file mode 100644 index 7e934d4a6..000000000 --- a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations -from attrs import define, field -from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack, import_optional_dependency -from griptape.drivers import BasePromptModelDriver -from griptape.tokenizers import HuggingFaceTokenizer - - -@define -class SageMakerLlamaPromptModelDriver(BasePromptModelDriver): - # Default context length for all Llama 3 models is 8K as per https://huggingface.co/blog/llama3 - DEFAULT_MAX_INPUT_TOKENS = 8000 - - _tokenizer: HuggingFaceTokenizer = field(default=None, kw_only=True) - - @property - def tokenizer(self) -> HuggingFaceTokenizer: - if self._tokenizer is None: - self._tokenizer = HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained( - "meta-llama/Meta-Llama-3-8B-Instruct", model_max_length=self.DEFAULT_MAX_INPUT_TOKENS - ), - max_output_tokens=self.max_tokens or self.DEFAULT_MAX_INPUT_TOKENS, - ) - return self._tokenizer - - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str: - return self.tokenizer.tokenizer.apply_chat_template( # pyright: ignore - [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], - tokenize=False, - add_generation_prompt=True, - ) - - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - prompt = self.prompt_driver.prompt_stack_to_string(prompt_stack) - return { - "max_new_tokens": self.prompt_driver.max_output_tokens(prompt), - "temperature": self.prompt_driver.temperature, - "stop": self.tokenizer.tokenizer.eos_token, - } - - def process_output(self, output: dict | list[dict] | str | bytes) -> TextArtifact: - # This output format is specific to the Llama 3 Instruct models when deployed via SageMaker JumpStart. - if isinstance(output, dict): - return TextArtifact(output["generated_text"]) - else: - raise ValueError("Invalid output format.") diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 2dd454b53..6ba23d6fe 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -103,7 +103,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed # These modules are required to avoid `NameError`s when resolving types. - from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver, BasePromptModelDriver + from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver from griptape.structures import Structure from griptape.utils import PromptStack from griptape.tokenizers.base_tokenizer import BaseTokenizer @@ -121,7 +121,6 @@ def _resolve_types(cls, attrs_cls: type) -> None: "BaseConversationMemoryDriver": BaseConversationMemoryDriver, "BasePromptDriver": BasePromptDriver, "BaseTokenizer": BaseTokenizer, - "BasePromptModelDriver": BasePromptModelDriver, "boto3": boto3, "Client": Client, }, diff --git a/tests/unit/drivers/embedding/test_sagemaker_embedding_driver.py b/tests/unit/drivers/embedding/test_sagemaker_embedding_driver.py deleted file mode 100644 index 9ceb98557..000000000 --- a/tests/unit/drivers/embedding/test_sagemaker_embedding_driver.py +++ /dev/null @@ -1,33 +0,0 @@ -import pytest -from unittest import mock -from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerHuggingFaceEmbeddingModelDriver -from griptape.tokenizers.openai_tokenizer import OpenAiTokenizer - - -class TestAmazonSagemakerEmbeddingDriver: - @pytest.fixture(autouse=True) - def mock_session(self, mocker): - fake_embeddings = b'{"embedding": [[0, 1, 0]]}' - mock_session_class = mocker.patch("boto3.Session") - mock_session_object = mock.Mock() - mock_client = mock.Mock() - mock_response = mock.Mock() - - mock_response.get().read.return_value = fake_embeddings - mock_client.invoke_endpoint.return_value = mock_response - mock_session_object.client.return_value = mock_client - mock_session_class.return_value = mock_session_object - - def test_init(self): - assert AmazonSageMakerEmbeddingDriver( - model="test-endpoint", - tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), - embedding_model_driver=SageMakerHuggingFaceEmbeddingModelDriver(), - ) - - def test_try_embed_chunk(self): - assert AmazonSageMakerEmbeddingDriver( - model="test-endpoint", - tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), - embedding_model_driver=SageMakerHuggingFaceEmbeddingModelDriver(), - ).try_embed_chunk("foobar") == [0, 1, 0] diff --git a/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py b/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py new file mode 100644 index 000000000..268b47c54 --- /dev/null +++ b/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py @@ -0,0 +1,59 @@ +import pytest +from unittest import mock +from griptape.drivers import AmazonSageMakerJumpstartEmbeddingDriver +from griptape.tokenizers.openai_tokenizer import OpenAiTokenizer + + +class TestAmazonSageMakerJumpstartEmbeddingDriver: + @pytest.fixture(autouse=True) + def mock_client(self, mocker): + mock_session_class = mocker.patch("boto3.Session") + mock_session_object = mock.Mock() + mock_client = mock.Mock() + mock_response = mock.Mock() + + mock_client.invoke_endpoint.return_value = mock_response + mock_session_object.client.return_value = mock_client + mock_session_class.return_value = mock_session_object + + return mock_response + + def test_init(self): + assert AmazonSageMakerJumpstartEmbeddingDriver( + endpoint="test-endpoint", + model="test-endpoint", + tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), + ) + + def test_try_embed_chunk(self, mock_client): + mock_client.get().read.return_value = b'{"embedding": [[0, 1, 0]]}' + assert AmazonSageMakerJumpstartEmbeddingDriver( + endpoint="test-endpoint", + model="test-model", + tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), + ).try_embed_chunk("foobar") == [0, 1, 0] + + mock_client.get().read.return_value = b'{"embedding": [0, 2, 0]}' + assert AmazonSageMakerJumpstartEmbeddingDriver( + endpoint="test-endpoint", + model="test-model", + tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), + ).try_embed_chunk("foobar") == [0, 2, 0] + + mock_client.get().read.return_value = b'{"embedding": []}' + with pytest.raises(ValueError) as e: + assert AmazonSageMakerJumpstartEmbeddingDriver( + endpoint="test-endpoint", + model="test-model", + tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), + ).try_embed_chunk("foobar") == [0, 2, 0] + assert str(e) == "model response is empty" + + mock_client.get().read.return_value = b"{}" + with pytest.raises(ValueError) as e: + assert AmazonSageMakerJumpstartEmbeddingDriver( + endpoint="test-endpoint", + model="test-model", + tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), + ).try_embed_chunk("foobar") == [0, 2, 0] + assert str(e) == "invalid response from model" diff --git a/tests/unit/drivers/embedding_model/__init__.py b/tests/unit/drivers/embedding_model/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/unit/drivers/embedding_model/test_sagemaker_huggingface_embedding_model_driver.py b/tests/unit/drivers/embedding_model/test_sagemaker_huggingface_embedding_model_driver.py deleted file mode 100644 index b63e593b3..000000000 --- a/tests/unit/drivers/embedding_model/test_sagemaker_huggingface_embedding_model_driver.py +++ /dev/null @@ -1,21 +0,0 @@ -import boto3 -import pytest -from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerHuggingFaceEmbeddingModelDriver -from tests.mocks.mock_tokenizer import MockTokenizer - - -class TestSageMakerHuggingFaceEmbeddingModelDriver: - @pytest.fixture - def driver(self): - return AmazonSageMakerEmbeddingDriver( - model="foo", - session=boto3.Session(region_name="us-east-1"), - tokenizer=MockTokenizer(model="foo"), - embedding_model_driver=SageMakerHuggingFaceEmbeddingModelDriver(), - ).embedding_model_driver - - def test_chunk_to_model_params(self, driver): - assert driver.chunk_to_model_params("foobar")["text_inputs"] == "foobar" - - def test_process_output(self, driver): - assert driver.process_output({"embedding": [["foobar"]]}) == ["foobar"] diff --git a/tests/unit/drivers/embedding_model/test_sagemaker_tensorflow_hub_embedding_model_driver.py b/tests/unit/drivers/embedding_model/test_sagemaker_tensorflow_hub_embedding_model_driver.py deleted file mode 100644 index 7080b93fb..000000000 --- a/tests/unit/drivers/embedding_model/test_sagemaker_tensorflow_hub_embedding_model_driver.py +++ /dev/null @@ -1,21 +0,0 @@ -import boto3 -import pytest -from griptape.drivers import AmazonSageMakerEmbeddingDriver, SageMakerTensorFlowHubEmbeddingModelDriver -from tests.mocks.mock_tokenizer import MockTokenizer - - -class TestSageMakerTensorFlowHubFaceEmbeddingModelDriver: - @pytest.fixture - def driver(self): - return AmazonSageMakerEmbeddingDriver( - model="foo", - session=boto3.Session(region_name="us-east-1"), - tokenizer=MockTokenizer(model="foo"), - embedding_model_driver=SageMakerTensorFlowHubEmbeddingModelDriver(), - ).embedding_model_driver - - def test_chunk_to_model_params(self, driver): - assert driver.chunk_to_model_params("foobar")["text_inputs"] == "foobar" - - def test_process_output(self, driver): - assert driver.process_output({"embedding": ["foobar"]}) == ["foobar"] diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py new file mode 100644 index 000000000..3ac9e5164 --- /dev/null +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py @@ -0,0 +1,134 @@ +from typing import Any +from botocore.response import StreamingBody +from griptape.tokenizers import HuggingFaceTokenizer +from griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver import AmazonSageMakerJumpstartPromptDriver +from griptape.utils import PromptStack +from io import BytesIO +import json +import pytest + +from griptape.utils.constants import Constants + + +def to_streaming_body(data: Any) -> StreamingBody: + bytes = json.dumps(data).encode("utf-8") + + return StreamingBody(BytesIO(bytes), len(bytes)) + + +class TestAmazonSageMakerJumpstartPromptDriver: + @pytest.fixture(autouse=True) + def tokenizer(self, mocker): + from_pretrained = mocker.patch("transformers.AutoTokenizer").from_pretrained + from_pretrained.return_value.apply_chat_template.return_value = "foo\n\nUser: bar" + from_pretrained.return_value.model_max_length = 8000 + from_pretrained.return_value.eos_token_id = 1 + + return from_pretrained + + @pytest.fixture(autouse=True) + def mock_client(self, mocker): + return mocker.patch("boto3.Session").return_value.client.return_value + + def test_init(self): + assert AmazonSageMakerJumpstartPromptDriver(endpoint="foo", model="bar") + + def test_try_run(self, mock_client): + # Given + driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") + prompt_stack = PromptStack() + prompt_stack.add_user_input("prompt-stack") + + # When + response_body = [{"generated_text": "foobar"}] + mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body(response_body)} + text_artifact = driver.try_run(prompt_stack) + assert isinstance(driver.tokenizer, HuggingFaceTokenizer) + + # Then + mock_client.invoke_endpoint.assert_called_with( + EndpointName=driver.endpoint, + ContentType="application/json", + Body=json.dumps( + { + "inputs": "foo\n\nUser: bar", + "parameters": { + "temperature": driver.temperature, + "max_new_tokens": 250, + "do_sample": True, + "eos_token_id": 1, + "stop_strings": [Constants.RESPONSE_STOP_SEQUENCE], + "return_full_text": False, + }, + } + ), + CustomAttributes="accept_eula=true", + ) + + assert text_artifact.value == "foobar" + + # When + response_body = {"generated_text": "foobar"} + mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body(response_body)} + text_artifact = driver.try_run(prompt_stack) + assert isinstance(driver.tokenizer, HuggingFaceTokenizer) + + # Then + mock_client.invoke_endpoint.assert_called_with( + EndpointName=driver.endpoint, + ContentType="application/json", + Body=json.dumps( + { + "inputs": "foo\n\nUser: bar", + "parameters": { + "temperature": driver.temperature, + "max_new_tokens": 250, + "do_sample": True, + "eos_token_id": 1, + "stop_strings": [Constants.RESPONSE_STOP_SEQUENCE], + "return_full_text": False, + }, + } + ), + CustomAttributes="accept_eula=true", + ) + + assert text_artifact.value == "foobar" + + def test_try_stream(self, mock_client): + # Given + driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") + prompt_stack = PromptStack() + prompt_stack.add_user_input("prompt-stack") + + # When + with pytest.raises(NotImplementedError) as e: + driver.try_stream(prompt_stack) + + # Then + assert e.value.args[0] == "streaming is not supported" + + def test_stream_init(self): + # Given + driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") + + # When + with pytest.raises(ValueError) as e: + driver.stream = True + + # Then + assert e.value.args[0] == "streaming is not supported" + + def test_try_run_throws_on_empty_response(self, mock_client): + # Given + driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") + mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body([])} + prompt_stack = PromptStack() + prompt_stack.add_user_input("prompt-stack") + + # When + with pytest.raises(Exception) as e: + driver.try_run(prompt_stack) + + # Then + assert e.value.args[0] == "model response is empty" diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py deleted file mode 100644 index c6692e1ba..000000000 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_prompt_driver.py +++ /dev/null @@ -1,90 +0,0 @@ -from botocore.response import StreamingBody -from griptape.artifacts import TextArtifact -from griptape.drivers import AmazonSageMakerPromptDriver, SageMakerFalconPromptModelDriver -from griptape.tokenizers import HuggingFaceTokenizer, OpenAiTokenizer -from griptape.utils import PromptStack -from io import BytesIO -from unittest.mock import Mock -import json -import pytest - - -class TestAmazonSageMakerPromptDriver: - @pytest.fixture - def mock_model_driver(self): - mock_model_driver = Mock() - mock_model_driver.prompt_stack_to_model_input.return_value = "model-inputs" - mock_model_driver.prompt_stack_to_model_params.return_value = "model-params" - mock_model_driver.process_output.return_value = TextArtifact("model-output") - return mock_model_driver - - @pytest.fixture(autouse=True) - def mock_client(self, mocker): - return mocker.patch("boto3.Session").return_value.client.return_value - - def test_init(self): - assert AmazonSageMakerPromptDriver(endpoint="foo", prompt_model_driver=SageMakerFalconPromptModelDriver()) - - def test_custom_tokenizer(self): - assert isinstance( - AmazonSageMakerPromptDriver( - endpoint="foo", prompt_model_driver=SageMakerFalconPromptModelDriver() - ).tokenizer, - HuggingFaceTokenizer, - ) - - assert isinstance( - AmazonSageMakerPromptDriver( - endpoint="foo", - tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), - prompt_model_driver=SageMakerFalconPromptModelDriver(), - ).tokenizer, - OpenAiTokenizer, - ) - - def test_try_run(self, mock_model_driver, mock_client): - # Given - driver = AmazonSageMakerPromptDriver(endpoint="model", prompt_model_driver=mock_model_driver) - prompt_stack = PromptStack() - prompt_stack.add_user_input("prompt-stack") - response_body = "invoke-endpoint-response-body" - mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body(response_body)} - - # When - text_artifact = driver.try_run(prompt_stack) - - # Then - mock_model_driver.prompt_stack_to_model_input.assert_called_once_with(prompt_stack) - mock_model_driver.prompt_stack_to_model_params.assert_called_once_with(prompt_stack) - mock_client.invoke_endpoint.assert_called_once_with( - EndpointName=driver.endpoint, - ContentType="application/json", - Body=json.dumps( - { - "inputs": mock_model_driver.prompt_stack_to_model_input.return_value, - "parameters": mock_model_driver.prompt_stack_to_model_params.return_value, - } - ), - CustomAttributes="accept_eula=true", - ) - mock_model_driver.process_output.assert_called_once_with(response_body) - assert text_artifact == mock_model_driver.process_output.return_value - - def test_try_run_throws_on_empty_response(self, mock_model_driver, mock_client): - # Given - driver = AmazonSageMakerPromptDriver(endpoint="model", prompt_model_driver=mock_model_driver) - mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body("")} - prompt_stack = PromptStack() - prompt_stack.add_user_input("prompt-stack") - - # When - with pytest.raises(Exception) as e: - driver.try_run(prompt_stack) - - # Then - assert e.value.args[0] == "model response is empty" - - -def to_streaming_body(text: str) -> StreamingBody: - bytes = json.dumps(text).encode("utf-8") - return StreamingBody(BytesIO(bytes), len(bytes)) diff --git a/tests/unit/drivers/prompt_models/__init__.py b/tests/unit/drivers/prompt_models/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py deleted file mode 100644 index 78d990229..000000000 --- a/tests/unit/drivers/prompt_models/test_sagemaker_falcon_prompt_model_driver.py +++ /dev/null @@ -1,43 +0,0 @@ -import boto3 -import pytest -from griptape.utils import PromptStack -from griptape.drivers import AmazonSageMakerPromptDriver, SageMakerFalconPromptModelDriver - - -class TestSageMakerFalconPromptModelDriver: - @pytest.fixture - def driver(self): - return AmazonSageMakerPromptDriver( - endpoint="endpoint-name", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=SageMakerFalconPromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.fixture - def stack(self): - stack = PromptStack() - - stack.add_system_input("foo") - stack.add_user_input("bar") - - return stack - - def test_init(self, driver): - assert driver.prompt_driver is not None - - def test_prompt_stack_to_model_input(self, driver, stack): - model_input = driver.prompt_stack_to_model_input(stack) - - assert isinstance(model_input, str) - assert model_input.startswith("foo\n\nUser: bar") - - def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["max_new_tokens"] == 590 - assert driver.prompt_stack_to_model_params(stack)["temperature"] == 0.12345 - - def test_process_output(self, driver, stack): - assert driver.process_output([{"generated_text": "foobar"}]).value == "foobar" - - def test_tokenizer_max_model_length(self, driver): - assert driver.tokenizer.tokenizer.model_max_length == 2048 diff --git a/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py b/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py deleted file mode 100644 index b39ce458e..000000000 --- a/tests/unit/drivers/prompt_models/test_sagemaker_llama_prompt_model_driver.py +++ /dev/null @@ -1,67 +0,0 @@ -import boto3 -import pytest -from griptape.utils import PromptStack -from griptape.drivers import AmazonSageMakerPromptDriver, SageMakerLlamaPromptModelDriver - - -class TestSageMakerLlamaPromptModelDriver: - @pytest.fixture(autouse=True) - def llama3_instruct_tokenizer(self, mocker): - tokenizer = mocker.patch("transformers.AutoTokenizer").return_value - tokenizer.model_max_length = 8000 - - return tokenizer - - @pytest.fixture(autouse=True) - def hugging_face_tokenizer(self, mocker, llama3_instruct_tokenizer): - tokenizer = mocker.patch( - "griptape.drivers.prompt_model.sagemaker_llama_prompt_model_driver.HuggingFaceTokenizer" - ).return_value - tokenizer.count_output_tokens_left.return_value = 7991 - tokenizer.tokenizer = llama3_instruct_tokenizer - return tokenizer - - @pytest.fixture - def driver(self): - return AmazonSageMakerPromptDriver( - endpoint="endpoint-name", - model="inference-component-name", - session=boto3.Session(region_name="us-east-1"), - prompt_model_driver=SageMakerLlamaPromptModelDriver(), - temperature=0.12345, - ).prompt_model_driver - - @pytest.fixture - def stack(self): - stack = PromptStack() - - stack.add_system_input("foo") - stack.add_user_input("bar") - - return stack - - def test_init(self, driver): - assert driver.prompt_driver is not None - - def test_prompt_stack_to_model_input(self, driver, stack, hugging_face_tokenizer): - driver.prompt_stack_to_model_input(stack) - - hugging_face_tokenizer.tokenizer.apply_chat_template.assert_called_once_with( - [{"role": "system", "content": "foo"}, {"role": "user", "content": "bar"}], - tokenize=False, - add_generation_prompt=True, - ) - - def test_prompt_stack_to_model_params(self, driver, stack): - assert driver.prompt_stack_to_model_params(stack)["max_new_tokens"] == 7991 - assert driver.prompt_stack_to_model_params(stack)["temperature"] == 0.12345 - - def test_process_output(self, driver, stack): - assert driver.process_output({"generated_text": "foobar"}).value == "foobar" - - def test_process_output_invalid_format(self, driver, stack): - with pytest.raises(ValueError): - assert driver.process_output([{"generated_text": "foobar"}]) - - def test_tokenizer_max_model_length(self, driver): - assert driver.tokenizer.tokenizer.model_max_length == 8000 diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index d21d52c93..5206b6bd4 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -17,9 +17,7 @@ CoherePromptDriver, OpenAiChatPromptDriver, AzureOpenAiChatPromptDriver, - AmazonSageMakerPromptDriver, - SageMakerLlamaPromptModelDriver, - SageMakerFalconPromptModelDriver, + AmazonSageMakerJumpstartPromptDriver, GooglePromptDriver, ) @@ -188,17 +186,11 @@ class TesterPromptDriverOption: prompt_driver=AmazonBedrockPromptDriver(model="mistral.mistral-small-2402-v1:0"), enabled=True ), "SAGEMAKER_LLAMA_7B": TesterPromptDriverOption( - prompt_driver=AmazonSageMakerPromptDriver( - endpoint=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], - prompt_model_driver=SageMakerLlamaPromptModelDriver(max_tokens=4096), - ), + prompt_driver=AmazonSageMakerJumpstartPromptDriver(endpoint=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"]), enabled=False, ), "SAGEMAKER_FALCON_7b": TesterPromptDriverOption( - prompt_driver=AmazonSageMakerPromptDriver( - endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], - prompt_model_driver=SageMakerFalconPromptModelDriver(), - ), + prompt_driver=AmazonSageMakerJumpstartPromptDriver(endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"]), enabled=False, ), "GOOGLE_GEMINI_PRO": TesterPromptDriverOption( From fc9c9766a3e7ce5f66c3cea21ad64db5b153051d Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 10 Jun 2024 11:16:34 -0500 Subject: [PATCH 088/238] Update `GriptapeCloudKnowledgeBaseClient` description fetching (#846) --- .../tool.py | 16 ++++--- ...st_griptape_cloud_knowledge_base_client.py | 46 ++++++++++++++++--- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 96d24cccf..6fed6e618 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -48,10 +48,14 @@ def _get_knowledge_base_description(self) -> str: else: url = urljoin(self.base_url.strip("/"), f"/api/knowledge-bases/{self.knowledge_base_id}/") - response = get(url, headers=self.headers).json() - if "description" in response: - return response["description"] + response = get(url, headers=self.headers) + response_body = response.json() + if response.status_code == 200: + if "description" in response_body: + return response_body["description"] + else: + raise ValueError( + f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + ) else: - raise ValueError( - f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." - ) + raise ValueError(f"Error accessing Knowledge Base {self.knowledge_base_id}.") diff --git a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py index a50929d66..9feba9cbf 100644 --- a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py +++ b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py @@ -1,5 +1,6 @@ import pytest -from griptape.artifacts import TextArtifact +from requests import exceptions +from griptape.artifacts import TextArtifact, ErrorArtifact class TestGriptapeCloudKnowledgeBaseClient: @@ -8,10 +9,12 @@ def client(self, mocker): from griptape.tools import GriptapeCloudKnowledgeBaseClient mock_response = mocker.Mock() + mock_response.status_code = 201 mock_response.text.return_value = "foo bar" mocker.patch("requests.post", return_value=mock_response) mock_response = mocker.Mock() + mock_response.status_code = 200 mock_response.json.return_value = {"description": "fizz buzz"} mocker.patch("requests.get", return_value=mock_response) @@ -25,15 +28,45 @@ def client_no_description(self, mocker): mock_response = mocker.Mock() mock_response.json.return_value = {} + mock_response.status_code = 200 mocker.patch("requests.get", return_value=mock_response) return GriptapeCloudKnowledgeBaseClient( base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) + @pytest.fixture + def client_kb_not_found(self, mocker): + from griptape.tools import GriptapeCloudKnowledgeBaseClient + + mock_response = mocker.Mock() + mock_response.json.return_value = {} + mock_response.status_code = 404 + mocker.patch("requests.get", return_value=mock_response) + + return GriptapeCloudKnowledgeBaseClient( + base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" + ) + + @pytest.fixture + def client_kb_error(self, mocker): + from griptape.tools import GriptapeCloudKnowledgeBaseClient + + mock_response = mocker.Mock() + mock_response.status_code = 500 + mocker.patch("requests.post", return_value=mock_response, side_effect=exceptions.RequestException("error")) + + return GriptapeCloudKnowledgeBaseClient( + base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" + ) + def test_query(self, client): assert isinstance(client.query({"values": {"query": "foo bar"}}), TextArtifact) + def test_query_error(self, client_kb_error): + assert isinstance(client_kb_error.query({"values": {"query": "foo bar"}}), ErrorArtifact) + assert client_kb_error.query({"values": {"query": "foo bar"}}).value == "error" + def test_get_knowledge_base_description(self, client): assert client._get_knowledge_base_description() == "fizz buzz" @@ -41,10 +74,11 @@ def test_get_knowledge_base_description(self, client): assert client._get_knowledge_base_description() == "foo bar" def test_get_knowledge_base_description_error(self, client_no_description): - with pytest.raises(ValueError) as e: + exception_match_text = f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + with pytest.raises(ValueError, match=exception_match_text) as e: client_no_description._get_knowledge_base_description() - assert ( - str(e) - == f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." - ) + def test_get_knowledge_base_kb_error(self, client_kb_not_found): + exception_match_text = f"Error accessing Knowledge Base {client_kb_not_found.knowledge_base_id}." + with pytest.raises(ValueError, match=exception_match_text) as e: + client_kb_not_found._get_knowledge_base_description() From 9c0d36843ff01e3b14c7d3afaf31aa260f79cc47 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 10 Jun 2024 09:32:32 -0700 Subject: [PATCH 089/238] Fix streaming not working when using deprecated Structure.stream field (#849) --- CHANGELOG.md | 1 + griptape/structures/structure.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d62a76cf..047284ac5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. - Performance issue in `OpenAiChatPromptDriver` when extracting unused rate-limiting headers. +- Streaming not working when using deprecated `Structure.stream` field. ## [0.26.0] - 2024-06-04 diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 84058dc7a..6f2d857c4 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -133,7 +133,7 @@ def finished_tasks(self) -> list[BaseTask]: @property def default_config(self) -> BaseStructureConfig: - if self.prompt_driver is not None or self.embedding_driver is not None: + if self.prompt_driver is not None or self.embedding_driver is not None or self.stream is not None: config = StructureConfig() if self.prompt_driver is None: From b466356b6fd13f9ce39e7fa2c883989bd37285bd Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 11 Jun 2024 10:00:48 -0700 Subject: [PATCH 090/238] Add StructureVisualizer util (#844) --- CHANGELOG.md | 1 + .../structures/workflows.md | 6 +++ griptape/utils/__init__.py | 2 + griptape/utils/structure_visualizer.py | 42 +++++++++++++++ tests/unit/utils/test_structure_visualizer.py | 52 +++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 griptape/utils/structure_visualizer.py create mode 100644 tests/unit/utils/test_structure_visualizer.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 047284ac5..a1c92ba1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AmazonSageMakerJumpstartPromptDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. - `AmazonSageMakerJumpstartEmbeddingDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. - `AmazonSageMakerJumpstartEmbeddingDriver.custom_attributes` for setting custom attributes when invoking an endpoint. +- `griptape.utils.StructureVisualizer` for visualizing Workflow structures with Mermaid.js ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 74b6755a0..f545851a2 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -17,6 +17,7 @@ Let's build a simple workflow. Let's say, we want to write a story in a fantasy ```python from griptape.tasks import PromptTask from griptape.structures import Workflow +from griptape.utils import StructureVisualizer world_task = PromptTask( @@ -48,9 +49,14 @@ story_task = PromptTask( workflow = Workflow(tasks=[world_task, story_task, scotty_task, annie_task, story_task]) +print(StructureVisualizer(workflow).to_url()) + workflow.run() ``` +Note that we use the `StructureVisualizer` to get a visual representation of the workflow. If we visit the printed url, it should look like this: + +![Workflow](https://mermaid.ink/img/Z3JhcGggVEQ7OwoJd29ybGQtLT4gc3RvcnkgJiBzY290dHkgJiBhbm5pZTsKCXNjb3R0eS0tPiBzdG9yeTsKCWFubmllLS0+IHN0b3J5Ow==) !!! Info Output edited for brevity diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index 64ca9a9f7..d253dd514 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -17,6 +17,7 @@ from .constants import Constants as constants from .load_artifact_from_memory import load_artifact_from_memory from .deprecation import deprecation_warn +from .structure_visualizer import StructureVisualizer def minify_json(value: str) -> str: @@ -45,4 +46,5 @@ def minify_json(value: str) -> str: "deprecation_warn", "load_file", "load_files", + "StructureVisualizer", ] diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py new file mode 100644 index 000000000..ede282761 --- /dev/null +++ b/griptape/utils/structure_visualizer.py @@ -0,0 +1,42 @@ +from __future__ import annotations +import base64 + +from attrs import define, field +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.tasks import BaseTask + from griptape.structures import Structure + + +@define +class StructureVisualizer: + """Utility class to visualize a Structure structure""" + + structure: Structure = field() + header: str = field(default="graph TD;", kw_only=True) + + def to_url(self) -> str: + """Generates a url that renders the Workflow structure as a Mermaid flowchart + Reference: https://mermaid.js.org/ecosystem/tutorials#jupyter-integration-with-mermaid-js + + Returns: + str: URL to the rendered image + """ + self.structure.resolve_relationships() + + tasks = "\n\t" + "\n\t".join([self.__render_task(task) for task in self.structure.tasks]) + graph = f"{self.header}{tasks}" + + graph_bytes = graph.encode("utf-8") + base64_string = base64.b64encode(graph_bytes).decode("utf-8") + + url = f"https://mermaid.ink/svg/{base64_string}" + + return url + + def __render_task(self, task: BaseTask) -> str: + if task.children: + return f'{task.id}--> {" & ".join([child.id for child in task.children])};' + else: + return f"{task.id};" diff --git a/tests/unit/utils/test_structure_visualizer.py b/tests/unit/utils/test_structure_visualizer.py new file mode 100644 index 000000000..d7177bf30 --- /dev/null +++ b/tests/unit/utils/test_structure_visualizer.py @@ -0,0 +1,52 @@ +from tests.mocks.mock_prompt_driver import MockPromptDriver +from griptape.utils import StructureVisualizer +from griptape.tasks import PromptTask +from griptape.structures import Agent, Workflow, Pipeline + + +class TestStructureVisualizer: + def test_agent(self): + agent = Agent(prompt_driver=MockPromptDriver(), tasks=[PromptTask("test1", id="task1")]) + + visualizer = StructureVisualizer(agent) + result = visualizer.to_url() + + assert result == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMTs=" + + def test_pipeline(self): + pipeline = Pipeline( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1"), + PromptTask("test2", id="task2"), + PromptTask("test3", id="task3"), + PromptTask("test4", id="task4"), + ], + ) + + visualizer = StructureVisualizer(pipeline) + result = visualizer.to_url() + + assert ( + result + == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMS0tPiB0YXNrMjsKCXRhc2syLS0+IHRhc2szOwoJdGFzazMtLT4gdGFzazQ7Cgl0YXNrNDs=" + ) + + def test_workflow(self): + workflow = Workflow( + prompt_driver=MockPromptDriver(), + tasks=[ + PromptTask("test1", id="task1"), + PromptTask("test2", id="task2", parent_ids=["task1"]), + PromptTask("test3", id="task3", parent_ids=["task1"]), + PromptTask("test4", id="task4", parent_ids=["task2", "task3"]), + ], + ) + + visualizer = StructureVisualizer(workflow) + result = visualizer.to_url() + + assert ( + result + == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMS0tPiB0YXNrMiAmIHRhc2szOwoJdGFzazItLT4gdGFzazQ7Cgl0YXNrMy0tPiB0YXNrNDsKCXRhc2s0Ow==" + ) From 75c502ff0dc9ab3e911fbe55488aa447590d6fd3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 11 Jun 2024 10:46:53 -0700 Subject: [PATCH 091/238] Add new Workflow/Task helper methods (#842) --- CHANGELOG.md | 3 ++ .../structures/workflows.md | 3 +- griptape/structures/workflow.py | 5 +-- griptape/tasks/base_task.py | 8 ++++ tests/unit/structures/test_workflow.py | 1 + tests/unit/tasks/test_base_task.py | 38 +++++++++++++++++++ 6 files changed, 54 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1c92ba1e..0349bbc93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AmazonSageMakerJumpstartEmbeddingDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. - `AmazonSageMakerJumpstartEmbeddingDriver.custom_attributes` for setting custom attributes when invoking an endpoint. - `griptape.utils.StructureVisualizer` for visualizing Workflow structures with Mermaid.js +- `BaseTask.parents_outputs` to get the textual output of all parent tasks. +- `BaseTask.parents_output_text` to get a concatenated string of all parent tasks' outputs. +- `parents_output_text` to Workflow context. ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index f545851a2..02ef8d148 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -7,7 +7,8 @@ A [Workflow](../../reference/griptape/structures/workflow.md) is a non-sequentia Workflows have access to the following [context](../../reference/griptape/structures/workflow.md#griptape.structures.workflow.Workflow.context) variables in addition to the [base context](./tasks.md#context): -* `parent_outputs`: outputs into the current task referenceable by parent task IDs. +* `parent_outputs`: dictionary containing mapping of parent ids to their outputs. +* `parents_output_text`: string containing the concatenated outputs of all parent tasks. * `parents`: parent tasks referenceable by IDs. * `children`: child tasks referenceable by IDs. diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 5927a1f4f..a9c571af2 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -127,9 +127,8 @@ def context(self, task: BaseTask) -> dict[str, Any]: context.update( { - "parent_outputs": { - parent.id: parent.output.to_text() if parent.output else "" for parent in task.parents - }, + "parent_outputs": task.parent_outputs, + "parents_output_text": task.parents_output_text, "parents": {parent.id: parent for parent in task.parents}, "children": {child.id: child for child in task.children}, } diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index c75978997..8a45cb14e 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -47,6 +47,14 @@ def parents(self) -> list[BaseTask]: def children(self) -> list[BaseTask]: return [self.structure.find_task(child_id) for child_id in self.child_ids] + @property + def parent_outputs(self) -> dict[str, str]: + return {parent.id: parent.output.to_text() if parent.output else "" for parent in self.parents} + + @property + def parents_output_text(self) -> str: + return "\n".join([parent.output.to_text() for parent in self.parents if parent.output]) + @property def meta_memories(self) -> list[BaseMetaEntry]: if self.structure and self.structure.meta_memory: diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 4a493bdd8..c11c837b7 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -676,6 +676,7 @@ def test_context(self): context = workflow.context(task) assert context["parent_outputs"] == {parent.id: parent.output.to_text()} + assert context["parents_output_text"] == "mock output" assert context["structure"] == workflow assert context["parents"] == {parent.id: parent} assert context["children"] == {child.id: child} diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 3048b7d7a..7fe2810f5 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -3,6 +3,7 @@ from griptape.artifacts import TextArtifact from griptape.structures import Agent from griptape.tasks import ActionsSubtask +from griptape.structures import Workflow from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_task import MockTask @@ -30,3 +31,40 @@ def test_meta_memories(self, task): task.structure.task_memory.process_output(MockTool().test, subtask, TextArtifact("foo")) assert len(task.meta_memories) == 2 + + def test_parent_outputs(self, task): + parent_1 = MockTask("foobar1", id="foobar1") + parent_2 = MockTask("foobar2", id="foobar2") + parent_3 = MockTask("foobar3", id="foobar3") + child = MockTask("foobar", id="foobar") + + child.add_parent(parent_1) + child.add_parent(parent_2) + child.add_parent(parent_3) + + workflow = Workflow(tasks=[parent_1, parent_2, parent_3, child]) + workflow.run() + + parent_3.output = None + assert child.parent_outputs == { + parent_1.id: parent_1.output.to_text(), + parent_2.id: parent_2.output.to_text(), + parent_3.id: "", + } + + def test_parents_output(self, task): + parent_1 = MockTask("foobar1", id="foobar1") + parent_2 = MockTask("foobar2", id="foobar2") + parent_3 = MockTask("foobar3", id="foobar3") + child = MockTask("foobar", id="foobar") + + child.add_parent(parent_1) + child.add_parent(parent_2) + child.add_parent(parent_3) + + workflow = Workflow(tasks=[parent_1, parent_2, parent_3, child]) + workflow.run() + + parent_2.output = None + + assert child.parents_output_text == "foobar1\nfoobar3" From 331c331180d69f1e3fb5b7577bc75ecbced586ca Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 11 Jun 2024 12:37:00 -0700 Subject: [PATCH 092/238] Refactor/tokenizers (#840) --- CHANGELOG.md | 7 ++ .../drivers/embedding-drivers.md | 4 +- docs/griptape-framework/misc/tokenizers.md | 13 ++- .../amazon_bedrock_cohere_embedding_driver.py | 7 +- .../amazon_bedrock_titan_embedding_driver.py | 7 +- .../prompt/amazon_bedrock_prompt_driver.py | 44 +++++---- ...mazon_sagemaker_jumpstart_prompt_driver.py | 11 +-- .../drivers/prompt/anthropic_prompt_driver.py | 32 +++--- griptape/drivers/prompt/base_prompt_driver.py | 33 +++---- .../drivers/prompt/cohere_prompt_driver.py | 32 +++--- .../drivers/prompt/dummy_prompt_driver.py | 3 + .../drivers/prompt/google_prompt_driver.py | 24 ++--- .../prompt/huggingface_hub_prompt_driver.py | 31 +++--- .../huggingface_pipeline_prompt_driver.py | 26 +++-- .../prompt/openai_chat_prompt_driver.py | 27 ++--- griptape/engines/query/vector_query_engine.py | 14 +-- .../structure/base_conversation_memory.py | 49 ++++++++++ griptape/tasks/prompt_task.py | 2 +- griptape/tasks/toolkit_task.py | 13 ++- griptape/tokenizers/__init__.py | 2 + .../tokenizers/amazon_bedrock_tokenizer.py | 40 ++++++++ griptape/tokenizers/anthropic_tokenizer.py | 7 +- griptape/tokenizers/base_tokenizer.py | 25 +++-- griptape/tokenizers/cohere_tokenizer.py | 7 +- griptape/tokenizers/dummy_tokenizer.py | 5 +- griptape/tokenizers/google_tokenizer.py | 7 +- griptape/tokenizers/huggingface_tokenizer.py | 14 ++- griptape/tokenizers/openai_tokenizer.py | 11 ++- griptape/tokenizers/simple_tokenizer.py | 15 +-- griptape/tokenizers/voyageai_tokenizer.py | 7 +- griptape/utils/__init__.py | 2 - griptape/utils/constants.py | 4 - griptape/utils/prompt_stack.py | 51 ---------- tests/mocks/mock_prompt_driver.py | 1 + tests/mocks/mock_tokenizer.py | 8 +- .../config/test_anthropic_structure_config.py | 2 +- .../test_amazon_bedrock_prompt_driver.py | 4 +- ...mazon_sagemaker_jumpstart_prompt_driver.py | 6 +- .../prompt/test_anthropic_prompt_driver.py | 8 +- .../drivers/prompt/test_base_prompt_driver.py | 29 ------ .../prompt/test_google_prompt_driver.py | 43 +------- .../test_hugging_face_hub_prompt_driver.py | 7 ++ ...est_hugging_face_pipeline_prompt_driver.py | 12 +++ .../prompt/test_openai_chat_prompt_driver.py | 82 ++-------------- .../structure/test_conversation_memory.py | 97 ++++++++++++++++++ tests/unit/tokenizers/__init__.py | 0 .../test_amazon_bedrock_tokenizer.py | 47 +++++++++ tests/unit/tokenizers/test_base_tokenizer.py | 13 +++ .../unit/tokenizers/test_google_tokenizer.py | 2 + .../tokenizers/test_hugging_face_tokenizer.py | 7 +- .../unit/tokenizers/test_openai_tokenizer.py | 12 +++ .../unit/tokenizers/test_simple_tokenizer.py | 2 +- tests/unit/utils/test_prompt_stack.py | 98 ------------------- tests/utils/structure_tester.py | 12 ++- 54 files changed, 554 insertions(+), 514 deletions(-) create mode 100644 griptape/tokenizers/amazon_bedrock_tokenizer.py create mode 100644 tests/unit/tokenizers/__init__.py create mode 100644 tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py create mode 100644 tests/unit/tokenizers/test_base_tokenizer.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0349bbc93..bf643f4f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AmazonSageMakerJumpstartPromptDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. - `AmazonSageMakerJumpstartEmbeddingDriver.inference_component_name` for setting the `InferenceComponentName` parameter when invoking an endpoint. - `AmazonSageMakerJumpstartEmbeddingDriver.custom_attributes` for setting custom attributes when invoking an endpoint. +- `ToolkitTask.response_stop_sequence` for overriding the default Chain of Thought stop sequence. - `griptape.utils.StructureVisualizer` for visualizing Workflow structures with Mermaid.js - `BaseTask.parents_outputs` to get the textual output of all parent tasks. - `BaseTask.parents_output_text` to get a concatenated string of all parent tasks' outputs. @@ -34,6 +35,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `BedrockLlamaTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `BedrockTitanTokenizer`, use `SimpleTokenizer` instead. - **BREAKING**: Removed `OpenAiChatCompletionPromptDriver` as it uses the legacy [OpenAi Completions API](https://platform.openai.com/docs/api-reference/completions). +- **BREAKING**: Removed `BasePromptDriver.count_tokens()`. +- **BREAKING**: Removed `BasePromptDriver.max_output_tokens()`. +- **BREAKING**: Moved/renamed `PromptStack.add_to_conversation_memory` to `BaseConversationMemory.add_to_prompt_stack`. +- **BREAKING**: Moved `griptape.constants.RESPONSE_STOP_SEQUENCE` to `ToolkitTask`. - **BREAKING**: Renamed `AmazonSagemakerPromptDriver` to `AmazonSageMakerJumpstartPromptDriver`. - **BREAKING**: Removed `SagemakerFalconPromptModelDriver`, use `AmazonSageMakerJumpstartPromptDriver` instead. - **BREAKING**: Removed `SagemakerLlamaPromptModelDriver`, use `AmazonSageMakerJumpstartPromptDriver` instead. @@ -41,6 +46,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `SagemakerHuggingfaceEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. - **BREAKING**: Removed `SagemakerTensorflowHubEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. - **BREAKING**: `AmazonSageMakerJumpstartPromptDriver.model` parameter, which gets passed to `SageMakerRuntime.Client.invoke_endpoint` as `EndpointName`, is now renamed to `AmazonSageMakerPromptDriver.endpoint`. +- `ToolkitTask.RESPONSE_STOP_SEQUENCE` is now only added when using `ToolkitTask`. +- Updated Prompt Drivers to use `BasePromptDriver.max_tokens` instead of using `BasePromptDriver.max_output_tokens()`. - Improved error message when `GriptapeCloudKnowledgeBaseClient` does not have a description set. - Updated `AmazonBedrockPromptDriver` to use [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). - `Structure.before_run()` now automatically resolves asymmetrically defined parent/child relationships using the new `Structure.resolve_relationships()`. diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 74a6f550e..b7212e6ff 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -88,10 +88,8 @@ driver = HuggingFaceHubEmbeddingDriver( api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], model="sentence-transformers/all-MiniLM-L6-v2", tokenizer=HuggingFaceTokenizer( + model="sentence-transformers/all-MiniLM-L6-v2", max_output_tokens=512, - tokenizer=AutoTokenizer.from_pretrained( - "sentence-transformers/all-MiniLM-L6-v2" - ) ), ) diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index 1975fc977..1920e912e 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -69,8 +69,8 @@ from griptape.tokenizers import HuggingFaceTokenizer tokenizer = HuggingFaceTokenizer( + model="sentence-transformers/all-MiniLM-L6-v2", max_output_tokens=512, - tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2") ) print(tokenizer.count_tokens("Hello world!")) @@ -78,6 +78,17 @@ print(tokenizer.count_input_tokens_left("Hello world!")) print(tokenizer.count_output_tokens_left("Hello world!")) ``` +### Amazon Bedrock +```python +from griptape.tokenizers import AmazonBedrockTokenizer + + +tokenizer = AmazonBedrockTokenizer(model="amazon.titan-text-express-v1") + +print(tokenizer.count_tokens("Hello world!")) +print(tokenizer.count_input_tokens_left("Hello world!")) +print(tokenizer.count_output_tokens_left("Hello world!")) +``` ### Simple Not all LLM providers have a public tokenizer API. In this case, you can use the `SimpleTokenizer` to count tokens based on a simple heuristic. diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index 54ac78b45..903022f86 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -3,7 +3,8 @@ from typing import Any, TYPE_CHECKING from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver -from griptape.tokenizers.simple_tokenizer import SimpleTokenizer +from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer +from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -28,8 +29,8 @@ class AmazonBedrockCohereEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True) input_type: str = field(default="search_query", kw_only=True) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - tokenizer: SimpleTokenizer = field( - default=Factory(lambda self: SimpleTokenizer(characters_per_token=4), takes_self=True), kw_only=True + tokenizer: BaseTokenizer = field( + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True ) bedrock_client: Any = field( default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index c6a692bf3..b754b0608 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -3,7 +3,8 @@ from typing import Any, TYPE_CHECKING from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver -from griptape.tokenizers import SimpleTokenizer +from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer +from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -24,8 +25,8 @@ class AmazonBedrockTitanEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) - tokenizer: SimpleTokenizer = field( - default=Factory(lambda self: SimpleTokenizer(characters_per_token=4), takes_self=True), kw_only=True + tokenizer: BaseTokenizer = field( + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True ) bedrock_client: Any = field( default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index f3d03a684..849ed0901 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -1,16 +1,20 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any + from collections.abc import Iterator -from attrs import define, field, Factory -from griptape.drivers import BasePromptDriver +from typing import TYPE_CHECKING, Any + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact +from griptape.drivers import BasePromptDriver +from griptape.tokenizers import AmazonBedrockTokenizer, BaseTokenizer from griptape.utils import import_optional_dependency -from griptape.tokenizers import SimpleTokenizer, BaseTokenizer if TYPE_CHECKING: - from griptape.utils import PromptStack import boto3 + from griptape.utils import PromptStack + @define class AmazonBedrockPromptDriver(BasePromptDriver): @@ -19,7 +23,9 @@ class AmazonBedrockPromptDriver(BasePromptDriver): default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True ) additional_model_request_fields: dict = field(default=Factory(dict), kw_only=True) - tokenizer: BaseTokenizer = field(default=Factory(lambda: SimpleTokenizer(characters_per_token=4)), kw_only=True) + tokenizer: BaseTokenizer = field( + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True + ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: response = self.bedrock_client.converse(**self._base_params(prompt_stack)) @@ -40,14 +46,24 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: else: raise Exception("model response is empty") + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + content = [{"text": prompt_input.content}] + + if prompt_input.is_system(): + return {"text": prompt_input.content} + elif prompt_input.is_assistant(): + return {"role": "assistant", "content": content} + else: + return {"role": "user", "content": content} + def _base_params(self, prompt_stack: PromptStack) -> dict: system_messages = [ - {"text": input.content} for input in prompt_stack.inputs if input.is_system() and input.content + self._prompt_stack_input_to_message(input) + for input in prompt_stack.inputs + if input.is_system() and input.content ] messages = [ - {"role": self.__to_amazon_bedrock_role(input), "content": [{"text": input.content}]} - for input in prompt_stack.inputs - if not input.is_system() + self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs if not input.is_system() ] return { @@ -57,11 +73,3 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "inferenceConfig": {"temperature": self.temperature}, "additionalModelRequestFields": self.additional_model_request_fields, } - - def __to_amazon_bedrock_role(self, prompt_input: PromptStack.Input) -> str: - if prompt_input.is_system(): - return "system" - elif prompt_input.is_assistant(): - return "assistant" - else: - return "user" diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 54247d001..18f8e4b77 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -30,11 +30,7 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained(self.model), - max_output_tokens=self.max_tokens, - ), - takes_self=True, + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True ), kw_only=True, ) @@ -72,9 +68,12 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: raise NotImplementedError("streaming is not supported") + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + return {"role": prompt_input.role, "content": prompt_input.content} + def _to_model_input(self, prompt_stack: PromptStack) -> str: prompt = self.tokenizer.tokenizer.apply_chat_template( - [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], + [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], tokenize=False, add_generation_prompt=True, ) diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 486233643..b74a9d5f6 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -5,7 +5,7 @@ from griptape.artifacts import TextArtifact from griptape.utils import PromptStack, import_optional_dependency from griptape.drivers import BasePromptDriver -from griptape.tokenizers import AnthropicTokenizer +from griptape.tokenizers import AnthropicTokenizer, BaseTokenizer @define @@ -15,7 +15,6 @@ class AnthropicPromptDriver(BasePromptDriver): api_key: Anthropic API key. model: Anthropic model name. client: Custom `Anthropic` client. - tokenizer: Custom `AnthropicTokenizer`. """ api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) @@ -26,11 +25,12 @@ class AnthropicPromptDriver(BasePromptDriver): ), kw_only=True, ) - tokenizer: AnthropicTokenizer = field( + tokenizer: BaseTokenizer = field( default=Factory(lambda self: AnthropicTokenizer(model=self.model), takes_self=True), kw_only=True ) top_p: float = field(default=0.999, kw_only=True, metadata={"serializable": True}) top_k: int = field(default=250, kw_only=True, metadata={"serializable": True}) + max_tokens: int = field(default=1000, kw_only=True, metadata={"serializable": True}) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: response = self.client.messages.create(**self._base_params(prompt_stack)) @@ -44,34 +44,36 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: if chunk.type == "content_block_delta": yield TextArtifact(value=chunk.delta.text) + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + content = prompt_input.content + + if prompt_input.is_system(): + return {"role": "system", "content": content} + elif prompt_input.is_assistant(): + return {"role": "assistant", "content": content} + else: + return {"role": "user", "content": content} + def _prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> dict: messages = [ - {"role": self.__to_anthropic_role(prompt_input), "content": prompt_input.content} + self._prompt_stack_input_to_message(prompt_input) for prompt_input in prompt_stack.inputs if not prompt_input.is_system() ] - system = next((i for i in prompt_stack.inputs if i.is_system()), None) + system = next((self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs if i.is_system()), None) if system is None: return {"messages": messages} else: - return {"messages": messages, "system": system.content} + return {"messages": messages, "system": system["content"]} def _base_params(self, prompt_stack: PromptStack) -> dict: return { "model": self.model, "temperature": self.temperature, "stop_sequences": self.tokenizer.stop_sequences, - "max_tokens": self.max_output_tokens(self.prompt_stack_to_string(prompt_stack)), "top_p": self.top_p, "top_k": self.top_k, + "max_tokens": self.max_tokens, **self._prompt_stack_to_model_input(prompt_stack), } - - def __to_anthropic_role(self, prompt_input: PromptStack.Input) -> str: - if prompt_input.is_system(): - return "system" - elif prompt_input.is_assistant(): - return "assistant" - else: - return "user" diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 096035f8b..9ef076dbc 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Optional, Callable +from typing import TYPE_CHECKING, Optional from collections.abc import Iterator from attrs import define, field, Factory from griptape.events import StartPromptEvent, FinishPromptEvent, CompletionChunkEvent @@ -32,9 +32,6 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): temperature: float = field(default=0.1, kw_only=True, metadata={"serializable": True}) max_tokens: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) structure: Optional[Structure] = field(default=None, kw_only=True) - prompt_stack_to_string: Callable[[PromptStack], str] = field( - default=Factory(lambda self: self.default_prompt_stack_to_string_converter, takes_self=True), kw_only=True - ) ignored_exception_types: tuple[type[Exception], ...] = field( default=Factory(lambda: (ImportError, ValueError)), kw_only=True ) @@ -42,23 +39,12 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): tokenizer: BaseTokenizer stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) - def max_output_tokens(self, text: str | list) -> int: - tokens_left = self.tokenizer.count_output_tokens_left(text) - - if self.max_tokens: - return min(self.max_tokens, tokens_left) - else: - return tokens_left - - def token_count(self, prompt_stack: PromptStack) -> int: - return self.tokenizer.count_tokens(self.prompt_stack_to_string(prompt_stack)) - def before_run(self, prompt_stack: PromptStack) -> None: if self.structure: self.structure.publish_event( StartPromptEvent( model=self.model, - token_count=self.token_count(prompt_stack), + token_count=self.tokenizer.count_tokens(self.prompt_stack_to_string(prompt_stack)), prompt_stack=prompt_stack, prompt=self.prompt_stack_to_string(prompt_stack), ) @@ -67,7 +53,9 @@ def before_run(self, prompt_stack: PromptStack) -> None: def after_run(self, result: TextArtifact) -> None: if self.structure: self.structure.publish_event( - FinishPromptEvent(model=self.model, token_count=result.token_count(self.tokenizer), result=result.value) + FinishPromptEvent( + model=self.model, result=result.value, token_count=self.tokenizer.count_tokens(result.value) + ) ) def run(self, prompt_stack: PromptStack) -> TextArtifact: @@ -92,7 +80,16 @@ def run(self, prompt_stack: PromptStack) -> TextArtifact: else: raise Exception("prompt driver failed after all retry attempts") - def default_prompt_stack_to_string_converter(self, prompt_stack: PromptStack) -> str: + def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: + """Converts a Prompt Stack to a string for token counting or model input. + This base implementation is only a rough approximation, and should be overridden by subclasses with model-specific tokens. + + Args: + prompt_stack: The Prompt Stack to convert to a string. + + Returns: + A single string representation of the Prompt Stack. + """ prompt_lines = [] for i in prompt_stack.inputs: diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 7a2f39cd6..3ff2c9e89 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from collections.abc import Iterator from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver -from griptape.tokenizers import CohereTokenizer from griptape.utils import PromptStack, import_optional_dependency +from griptape.tokenizers import BaseTokenizer, CohereTokenizer if TYPE_CHECKING: from cohere import Client @@ -18,7 +18,6 @@ class CoherePromptDriver(BasePromptDriver): api_key: Cohere API key. model: Cohere model name. client: Custom `cohere.Client`. - tokenizer: Custom `CohereTokenizer`. """ api_key: str = field(kw_only=True, metadata={"serializable": False}) @@ -27,7 +26,7 @@ class CoherePromptDriver(BasePromptDriver): default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), kw_only=True, ) - tokenizer: CohereTokenizer = field( + tokenizer: BaseTokenizer = field( default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True), kw_only=True, ) @@ -44,26 +43,23 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: if event.event_type == "text-generation": yield TextArtifact(value=event.text) + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + if prompt_input.is_system(): + return {"role": "SYSTEM", "text": prompt_input.content} + elif prompt_input.is_user(): + return {"role": "USER", "text": prompt_input.content} + else: + return {"role": "ASSISTANT", "text": prompt_input.content} + def _base_params(self, prompt_stack: PromptStack) -> dict: user_message = prompt_stack.inputs[-1].content - history_messages = [self.__to_cohere_message(input) for input in prompt_stack.inputs[:-1]] + + history_messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs[:-1]] return { "message": user_message, "chat_history": history_messages, "temperature": self.temperature, "stop_sequences": self.tokenizer.stop_sequences, + "max_tokens": self.max_tokens, } - - def __to_cohere_message(self, input: PromptStack.Input) -> dict[str, Any]: - return {"role": self.__to_cohere_role(input.role), "text": input.content} - - def __to_cohere_role(self, role: str) -> str: - if role == PromptStack.SYSTEM_ROLE: - return "SYSTEM" - if role == PromptStack.USER_ROLE: - return "USER" - elif role == PromptStack.ASSISTANT_ROLE: - return "CHATBOT" - else: - return "USER" diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index f92f9cbc1..a55ecd4fe 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -17,3 +17,6 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: raise DummyException(__class__.__name__, "try_stream") + + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + raise DummyException(__class__.__name__, "_prompt_stack_input_to_message") diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 9f833c035..67bc19e24 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -19,7 +19,6 @@ class GooglePromptDriver(BasePromptDriver): api_key: Google API key. model: Google model name. model_client: Custom `GenerativeModel` client. - tokenizer: Custom `GoogleTokenizer`. top_p: Optional value for top_p. top_k: Optional value for top_k. """ @@ -42,7 +41,7 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: inputs, generation_config=GenerationConfig( stop_sequences=self.tokenizer.stop_sequences, - max_output_tokens=self.max_output_tokens(inputs), + max_output_tokens=self.max_tokens, temperature=self.temperature, top_p=self.top_p, top_k=self.top_k, @@ -60,7 +59,7 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: stream=True, generation_config=GenerationConfig( stop_sequences=self.tokenizer.stop_sequences, - max_output_tokens=self.max_output_tokens(inputs), + max_output_tokens=self.max_tokens, temperature=self.temperature, top_p=self.top_p, top_k=self.top_k, @@ -70,6 +69,14 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: for chunk in response: yield TextArtifact(value=chunk.text) + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + parts = [prompt_input.content] + + if prompt_input.is_assistant(): + return {"role": "model", "parts": parts} + else: + return {"role": "user", "parts": parts} + def _default_model_client(self) -> GenerativeModel: genai = import_optional_dependency("google.generativeai") genai.configure(api_key=self.api_key) @@ -90,13 +97,6 @@ def _prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> list[Conten def __to_content_dict(self, prompt_input: PromptStack.Input) -> ContentDict: ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + message = self._prompt_stack_input_to_message(prompt_input) - return ContentDict({"role": self.__to_google_role(prompt_input), "parts": [prompt_input.content]}) - - def __to_google_role(self, prompt_input: PromptStack.Input) -> str: - if prompt_input.is_system(): - return "user" - elif prompt_input.is_assistant(): - return "model" - else: - return "user" + return ContentDict(message) diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index d6b021f29..3edd252cb 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -42,37 +42,44 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): ) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained(self.model), - max_output_tokens=self.max_tokens, - ), - takes_self=True, + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True ), kw_only=True, ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - prompt = self.__to_prompt(prompt_stack) + prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( - prompt, return_full_text=False, max_new_tokens=self.max_output_tokens(prompt), **self.params + prompt, return_full_text=False, max_new_tokens=self.max_tokens, **self.params ) return TextArtifact(value=response) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - prompt = self.__to_prompt(prompt_stack) + prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( - prompt, return_full_text=False, max_new_tokens=self.max_output_tokens(prompt), stream=True, **self.params + prompt, return_full_text=False, max_new_tokens=self.max_tokens, stream=True, **self.params ) for token in response: yield TextArtifact(value=token) - def __to_prompt(self, prompt_stack: PromptStack) -> str: + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + return {"role": prompt_input.role, "content": prompt_input.content} + + def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: + return self.tokenizer.tokenizer.decode(self.__prompt_stack_to_tokens(prompt_stack)) + + def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: tokens = self.tokenizer.tokenizer.apply_chat_template( - [{"role": i.role, "content": i.content} for i in prompt_stack.inputs], add_generation_prompt=True + [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], + add_generation_prompt=True, + tokenize=True, ) - return self.tokenizer.tokenizer.decode(tokens) + if isinstance(tokens, list): + return tokens + else: + raise ValueError("Invalid output type.") diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 324ecd74f..4fa291877 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -27,11 +27,7 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): params: dict = field(factory=dict, kw_only=True, metadata={"serializable": True}) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer( - tokenizer=import_optional_dependency("transformers").AutoTokenizer.from_pretrained(self.model), - max_output_tokens=self.max_tokens, - ), - takes_self=True, + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True ), kw_only=True, ) @@ -45,7 +41,7 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - messages = [{"role": input.role, "content": input.content} for input in prompt_stack.inputs] + messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs] result = self.pipe( messages, @@ -68,3 +64,21 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: raise NotImplementedError("streaming is not supported") + + def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: + return self.tokenizer.tokenizer.decode(self.__prompt_stack_to_tokens(prompt_stack)) + + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + return {"role": prompt_input.role, "content": prompt_input.content} + + def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: + tokens = self.tokenizer.tokenizer.apply_chat_template( + [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], + add_generation_prompt=True, + tokenize=True, + ) + + if isinstance(tokens, list): + return tokens + else: + raise ValueError("Invalid output type.") diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 345545b6f..9545bd45a 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Optional, Any, Literal +from typing import Optional, Literal from collections.abc import Iterator import openai from attrs import define, field, Factory @@ -79,14 +79,15 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: yield TextArtifact(value=delta_content) - def token_count(self, prompt_stack: PromptStack) -> int: - if isinstance(self.tokenizer, OpenAiTokenizer): - return self.tokenizer.count_tokens(self._prompt_stack_to_messages(prompt_stack)) - else: - return self.tokenizer.count_tokens(self.prompt_stack_to_string(prompt_stack)) + def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: + content = prompt_input.content - def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict[str, Any]]: - return [{"role": self.__to_openai_role(i), "content": i.content} for i in prompt_stack.inputs] + if prompt_input.is_system(): + return {"role": "system", "content": content} + elif prompt_input.is_assistant(): + return {"role": "assistant", "content": content} + else: + return {"role": "user", "content": content} def _base_params(self, prompt_stack: PromptStack) -> dict: params = { @@ -102,7 +103,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: # JSON mode still requires a system input instructing the LLM to output JSON. prompt_stack.add_system_input("Provide your response as a valid JSON object.") - messages = self._prompt_stack_to_messages(prompt_stack) + messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs] if self.max_tokens is not None: params["max_tokens"] = self.max_tokens @@ -110,11 +111,3 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: params["messages"] = messages return params - - def __to_openai_role(self, prompt_input: PromptStack.Input) -> str: - if prompt_input.is_system(): - return "system" - elif prompt_input.is_assistant(): - return "assistant" - else: - return "user" diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py index adfa4b2db..24338b348 100644 --- a/griptape/engines/query/vector_query_engine.py +++ b/griptape/engines/query/vector_query_engine.py @@ -49,12 +49,14 @@ def query( ) user_message = self.user_template_generator.render(query=query) - message_token_count = self.prompt_driver.token_count( - PromptStack( - inputs=[ - PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(user_message, role=PromptStack.USER_ROLE), - ] + message_token_count = self.prompt_driver.tokenizer.count_input_tokens_left( + self.prompt_driver.prompt_stack_to_string( + PromptStack( + inputs=[ + PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(user_message, role=PromptStack.USER_ROLE), + ] + ) ) ) diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index 6db05c92c..f8cc51743 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -45,3 +45,52 @@ def try_add_run(self, run: Run) -> None: ... @abstractmethod def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: ... + + def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = None) -> PromptStack: + """Add the Conversation Memory runs to the Prompt Stack by modifying the inputs in place. + + If autoprune is enabled, this will fit as many Conversation Memory runs into the Prompt Stack + as possible without exceeding the token limit. + + Args: + prompt_stack: The Prompt Stack to add the Conversation Memory to. + index: Optional index to insert the Conversation Memory runs at. + Defaults to appending to the end of the Prompt Stack. + """ + num_runs_to_fit_in_prompt = len(self.runs) + + if self.autoprune and hasattr(self, "structure"): + should_prune = True + prompt_driver = self.structure.config.prompt_driver + temp_stack = PromptStack() + + # Try to determine how many Conversation Memory runs we can + # fit into the Prompt Stack without exceeding the token limit. + while should_prune and num_runs_to_fit_in_prompt > 0: + temp_stack.inputs = prompt_stack.inputs.copy() + + # Add n runs from Conversation Memory. + # Where we insert into the Prompt Stack doesn't matter here + # since we only care about the total token count. + memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).inputs + temp_stack.inputs.extend(memory_inputs) + + # Convert the prompt stack into tokens left. + tokens_left = prompt_driver.tokenizer.count_input_tokens_left( + prompt_driver.prompt_stack_to_string(temp_stack) + ) + if tokens_left > 0: + # There are still tokens left, no need to prune. + should_prune = False + else: + # There were not any tokens left, prune one run and try again. + num_runs_to_fit_in_prompt -= 1 + + if num_runs_to_fit_in_prompt: + memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).inputs + if index: + prompt_stack.inputs[index:index] = memory_inputs + else: + prompt_stack.inputs.extend(memory_inputs) + + return prompt_stack diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 75051db74..694a5050d 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -34,7 +34,7 @@ def prompt_stack(self) -> PromptStack: if memory: # inserting at index 1 to place memory right after system prompt - stack.add_conversation_memory(memory, 1) + memory.add_to_prompt_stack(stack, 1) return stack diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 3a3727434..c99f9e23f 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -21,6 +21,9 @@ @define class ToolkitTask(PromptTask, ActionsSubtaskOriginMixin): DEFAULT_MAX_STEPS = 20 + # Stop sequence for chain-of-thought in the framework. Using this "token-like" string to make it more unique, + # so that it doesn't trigger on accident. + RESPONSE_STOP_SEQUENCE = "<|Response|>" tools: list[BaseTool] = field(factory=list, kw_only=True) max_subtasks: int = field(default=DEFAULT_MAX_STEPS, kw_only=True) @@ -32,6 +35,7 @@ class ToolkitTask(PromptTask, ActionsSubtaskOriginMixin): generate_user_subtask_template: Callable[[ActionsSubtask], str] = field( default=Factory(lambda self: self.default_user_subtask_template_generator, takes_self=True), kw_only=True ) + response_stop_sequence: str = field(default=RESPONSE_STOP_SEQUENCE, kw_only=True) def __attrs_post_init__(self) -> None: if self.task_memory: @@ -74,7 +78,7 @@ def prompt_stack(self) -> PromptStack: if memory: # inserting at index 1 to place memory right after system prompt - stack.add_conversation_memory(memory, 1) + memory.add_to_prompt_stack(stack, 1) return stack @@ -95,17 +99,17 @@ def default_system_template_generator(self, _: PromptTask) -> str: action_names=str.join(", ", [tool.name for tool in self.tools]), actions_schema=utils.minify_json(json.dumps(schema)), meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), - stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, + stop_sequence=self.response_stop_sequence, ) def default_assistant_subtask_template_generator(self, subtask: ActionsSubtask) -> str: return J2("tasks/toolkit_task/assistant_subtask.j2").render( - stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, subtask=subtask + stop_sequence=self.response_stop_sequence, subtask=subtask ) def default_user_subtask_template_generator(self, subtask: ActionsSubtask) -> str: return J2("tasks/toolkit_task/user_subtask.j2").render( - stop_sequence=utils.constants.RESPONSE_STOP_SEQUENCE, subtask=subtask + stop_sequence=self.response_stop_sequence, subtask=subtask ) def actions_schema(self) -> Schema: @@ -126,6 +130,7 @@ def run(self) -> BaseArtifact: self.subtasks.clear() + self.prompt_driver.tokenizer.stop_sequences.extend([self.response_stop_sequence]) subtask = self.add_subtask(ActionsSubtask(self.prompt_driver.run(prompt_stack=self.prompt_stack).to_text())) while True: diff --git a/griptape/tokenizers/__init__.py b/griptape/tokenizers/__init__.py index e69473acd..03b0aefe5 100644 --- a/griptape/tokenizers/__init__.py +++ b/griptape/tokenizers/__init__.py @@ -7,6 +7,7 @@ from griptape.tokenizers.voyageai_tokenizer import VoyageAiTokenizer from griptape.tokenizers.simple_tokenizer import SimpleTokenizer from griptape.tokenizers.dummy_tokenizer import DummyTokenizer +from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer __all__ = [ @@ -19,4 +20,5 @@ "VoyageAiTokenizer", "SimpleTokenizer", "DummyTokenizer", + "AmazonBedrockTokenizer", ] diff --git a/griptape/tokenizers/amazon_bedrock_tokenizer.py b/griptape/tokenizers/amazon_bedrock_tokenizer.py new file mode 100644 index 000000000..670b5739a --- /dev/null +++ b/griptape/tokenizers/amazon_bedrock_tokenizer.py @@ -0,0 +1,40 @@ +from __future__ import annotations +from attrs import define, field +from griptape.tokenizers.base_tokenizer import BaseTokenizer + + +@define() +class AmazonBedrockTokenizer(BaseTokenizer): + MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = { + "anthropic.claude-3": 200000, + "anthropic.claude-v2:1": 200000, + "anthropic.claude": 100000, + "cohere.command-r": 128000, + "cohere.embed": 512, + "cohere.command": 4000, + "cohere": 1024, + "ai21": 8192, + "meta-llama3": 8000, + "meta-llama2": 4096, + "mistral": 32000, + "amazon": 4096, + } + MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = { + "anthropic.claude": 4096, + "cohere": 4096, + "ai21.j2": 8191, + "meta": 2048, + "amazon.titan-text-lite": 4096, + "amazon.titan-text-express": 8192, + "amazon.titan-text-premier": 3072, + "amazon": 4096, + "mistral": 8192, + } + + model: str = field(kw_only=True) + characters_per_token: int = field(default=4, kw_only=True) + + def count_tokens(self, text: str) -> int: + num_tokens = (len(text) + self.characters_per_token - 1) // self.characters_per_token + + return num_tokens diff --git a/griptape/tokenizers/anthropic_tokenizer.py b/griptape/tokenizers/anthropic_tokenizer.py index 577df7b93..f5fabab0e 100644 --- a/griptape/tokenizers/anthropic_tokenizer.py +++ b/griptape/tokenizers/anthropic_tokenizer.py @@ -17,8 +17,5 @@ class AnthropicTokenizer(BaseTokenizer): default=Factory(lambda: import_optional_dependency("anthropic").Anthropic()), kw_only=True ) - def count_tokens(self, text: str | list) -> int: - if isinstance(text, str): - return self.client.count_tokens(text) - else: - raise ValueError("Text must be a string.") + def count_tokens(self, text: str) -> int: + return self.client.count_tokens(text) diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 179d2fb59..b7ae2a854 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -1,16 +1,18 @@ from __future__ import annotations -from abc import ABC, abstractmethod +import logging +from abc import ABC from attrs import define, field, Factory -from griptape import utils @define() class BaseTokenizer(ABC): + DEFAULT_MAX_INPUT_TOKENS = 4096 + DEFAULT_MAX_OUTPUT_TOKENS = 1000 MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = {} MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {} model: str = field(kw_only=True) - stop_sequences: list[str] = field(default=Factory(lambda: [utils.constants.RESPONSE_STOP_SEQUENCE]), kw_only=True) + stop_sequences: list[str] = field(default=Factory(list), kw_only=True) max_input_tokens: int = field(kw_only=True, default=None) max_output_tokens: int = field(kw_only=True, default=None) @@ -21,7 +23,7 @@ def __attrs_post_init__(self) -> None: if self.max_output_tokens is None: self.max_output_tokens = self._default_max_output_tokens() - def count_input_tokens_left(self, text: str | list) -> int: + def count_input_tokens_left(self, text: str) -> int: diff = self.max_input_tokens - self.count_tokens(text) if diff > 0: @@ -29,7 +31,7 @@ def count_input_tokens_left(self, text: str | list) -> int: else: return 0 - def count_output_tokens_left(self, text: str | list) -> int: + def count_output_tokens_left(self, text: str) -> int: diff = self.max_output_tokens - self.count_tokens(text) if diff > 0: @@ -37,14 +39,16 @@ def count_output_tokens_left(self, text: str | list) -> int: else: return 0 - @abstractmethod - def count_tokens(self, text: str | list[dict]) -> int: ... + def count_tokens(self, text: str) -> int: ... def _default_max_input_tokens(self) -> int: tokens = next((v for k, v in self.MODEL_PREFIXES_TO_MAX_INPUT_TOKENS.items() if self.model.startswith(k)), None) if tokens is None: - raise ValueError(f"Unknown model default max input tokens: {self.model}") + logging.warning( + f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_INPUT_TOKENS, using default value of {self.DEFAULT_MAX_INPUT_TOKENS}." + ) + return self.DEFAULT_MAX_INPUT_TOKENS else: return tokens @@ -54,6 +58,9 @@ def _default_max_output_tokens(self) -> int: ) if tokens is None: - raise ValueError(f"Unknown model for default max output tokens: {self.model}") + logging.warning( + f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS, using default value of {self.DEFAULT_MAX_OUTPUT_TOKENS}." + ) + return self.DEFAULT_MAX_OUTPUT_TOKENS else: return tokens diff --git a/griptape/tokenizers/cohere_tokenizer.py b/griptape/tokenizers/cohere_tokenizer.py index e6845d9ca..ae3bddd80 100644 --- a/griptape/tokenizers/cohere_tokenizer.py +++ b/griptape/tokenizers/cohere_tokenizer.py @@ -14,8 +14,5 @@ class CohereTokenizer(BaseTokenizer): client: Client = field(kw_only=True) - def count_tokens(self, text: str | list) -> int: - if isinstance(text, str): - return len(self.client.tokenize(text=text, model=self.model).tokens) - else: - raise ValueError("Text must be a string.") + def count_tokens(self, text: str) -> int: + return len(self.client.tokenize(text=text, model=self.model).tokens) diff --git a/griptape/tokenizers/dummy_tokenizer.py b/griptape/tokenizers/dummy_tokenizer.py index 74f6d104c..a36d0343e 100644 --- a/griptape/tokenizers/dummy_tokenizer.py +++ b/griptape/tokenizers/dummy_tokenizer.py @@ -1,14 +1,15 @@ from __future__ import annotations from attrs import define, field +from typing import Optional from griptape.exceptions import DummyException from griptape.tokenizers import BaseTokenizer @define class DummyTokenizer(BaseTokenizer): - model: None = field(init=False, default=None, kw_only=True) + model: Optional[str] = field(default=None, kw_only=True) max_input_tokens: int = field(init=False, default=0, kw_only=True) max_output_tokens: int = field(init=False, default=0, kw_only=True) - def count_tokens(self, text: str | list) -> int: + def count_tokens(self, text: str) -> int: raise DummyException(__class__.__name__, "count_tokens") diff --git a/griptape/tokenizers/google_tokenizer.py b/griptape/tokenizers/google_tokenizer.py index 55942f597..f99a0682f 100644 --- a/griptape/tokenizers/google_tokenizer.py +++ b/griptape/tokenizers/google_tokenizer.py @@ -18,11 +18,8 @@ class GoogleTokenizer(BaseTokenizer): default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True ) - def count_tokens(self, text: str | list) -> int: - if isinstance(text, str) or isinstance(text, list): - return self.model_client.count_tokens(text).total_tokens - else: - raise ValueError("Text must be a string or a list.") + def count_tokens(self, text: str) -> int: + return self.model_client.count_tokens(text).total_tokens def _default_model_client(self) -> GenerativeModel: genai = import_optional_dependency("google.generativeai") diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index 84023a378..a8312567d 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -1,6 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from attrs import define, field, Factory +from griptape.utils import import_optional_dependency from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: @@ -9,12 +10,17 @@ @define() class HuggingFaceTokenizer(BaseTokenizer): - tokenizer: PreTrainedTokenizerBase = field(kw_only=True) - model: None = field(init=False, default=None, kw_only=True) + tokenizer: PreTrainedTokenizerBase = field( + default=Factory( + lambda self: import_optional_dependency("transformers").AutoTokenizer.from_pretrained(self.model), + takes_self=True, + ), + kw_only=True, + ) max_input_tokens: int = field( default=Factory(lambda self: self.tokenizer.model_max_length, takes_self=True), kw_only=True ) - max_output_tokens: int = field(kw_only=True) # pyright: ignore[reportGeneralTypeIssues] + max_output_tokens: int = field(default=4096, kw_only=True) - def count_tokens(self, text: str | list) -> int: + def count_tokens(self, text: str) -> int: return len(self.tokenizer.encode(text)) diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index ec127ca1a..39a2a033e 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -1,9 +1,9 @@ from __future__ import annotations import logging -from attrs import define +from attrs import define, field, Factory import tiktoken -from griptape.tokenizers import BaseTokenizer from typing import Optional +from griptape.tokenizers import BaseTokenizer @define() @@ -41,6 +41,13 @@ class OpenAiTokenizer(BaseTokenizer): "text-embedding-3-large", ] + max_input_tokens: int = field( + kw_only=True, default=Factory(lambda self: self._default_max_input_tokens(), takes_self=True) + ) + max_output_tokens: int = field( + kw_only=True, default=Factory(lambda self: self._default_max_output_tokens(), takes_self=True) + ) + @property def encoding(self) -> tiktoken.Encoding: try: diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index 864b92f96..d1ddc8e2b 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -1,20 +1,15 @@ from __future__ import annotations -from typing import Optional from attrs import define, field +from typing import Optional from griptape.tokenizers import BaseTokenizer @define() class SimpleTokenizer(BaseTokenizer): - model: Optional[str] = field(init=False, kw_only=True, default=None) - max_input_tokens: int = field(kw_only=True, default=0) - max_output_tokens: int = field(kw_only=True, default=0) + model: Optional[str] = field(default=None, kw_only=True) characters_per_token: int = field(kw_only=True) - def count_tokens(self, text: str | list) -> int: - if isinstance(text, str): - num_tokens = (len(text) + self.characters_per_token - 1) // self.characters_per_token + def count_tokens(self, text: str) -> int: + num_tokens = (len(text) + self.characters_per_token - 1) // self.characters_per_token - return num_tokens - else: - raise ValueError("Text must be a string.") + return num_tokens diff --git a/griptape/tokenizers/voyageai_tokenizer.py b/griptape/tokenizers/voyageai_tokenizer.py index 565e53faa..d8fb5adf1 100644 --- a/griptape/tokenizers/voyageai_tokenizer.py +++ b/griptape/tokenizers/voyageai_tokenizer.py @@ -26,8 +26,5 @@ class VoyageAiTokenizer(BaseTokenizer): kw_only=True, ) - def count_tokens(self, text: str | list) -> int: - if isinstance(text, str): - return self.client.count_tokens([text]) - else: - raise ValueError("Text must be a str.") + def count_tokens(self, text: str) -> int: + return self.client.count_tokens([text]) diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index d253dd514..daac63f4e 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -14,7 +14,6 @@ from .import_utils import import_optional_dependency from .import_utils import is_dependency_installed from .stream import Stream -from .constants import Constants as constants from .load_artifact_from_memory import load_artifact_from_memory from .deprecation import deprecation_warn from .structure_visualizer import StructureVisualizer @@ -41,7 +40,6 @@ def minify_json(value: str) -> str: "remove_null_values_in_dict_recursively", "dict_merge", "Stream", - "constants", "load_artifact_from_memory", "deprecation_warn", "load_file", diff --git a/griptape/utils/constants.py b/griptape/utils/constants.py index 7bee76750..e69de29bb 100644 --- a/griptape/utils/constants.py +++ b/griptape/utils/constants.py @@ -1,4 +0,0 @@ -class Constants: - # Stop sequence for chain-of-thought in the framework. Using this "token-like" string to make it more unique, - # so that it doesn't trigger on accident. - RESPONSE_STOP_SEQUENCE = "<|Response|>" diff --git a/griptape/utils/prompt_stack.py b/griptape/utils/prompt_stack.py index f04cef486..378f9dd1e 100644 --- a/griptape/utils/prompt_stack.py +++ b/griptape/utils/prompt_stack.py @@ -1,12 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.mixins import SerializableMixin -if TYPE_CHECKING: - from griptape.memory.structure import BaseConversationMemory - @define class PromptStack(SerializableMixin): @@ -50,50 +46,3 @@ def add_user_input(self, content: str) -> Input: def add_assistant_input(self, content: str) -> Input: return self.add_input(content, self.ASSISTANT_ROLE) - - def add_conversation_memory(self, memory: BaseConversationMemory, index: Optional[int] = None) -> list[Input]: - """Add the Conversation Memory runs to the Prompt Stack. - - If autoprune is enabled, this will fit as many Conversation Memory runs into the Prompt Stack - as possible without exceeding the token limit. - - Args: - memory: The Conversation Memory to add the Prompt Stack to. - index: Optional index to insert the Conversation Memory runs at. - Defaults to appending to the end of the Prompt Stack. - """ - num_runs_to_fit_in_prompt = len(memory.runs) - - if memory.autoprune and hasattr(memory, "structure"): - should_prune = True - prompt_driver = memory.structure.config.prompt_driver - temp_stack = PromptStack() - - # Try to determine how many Conversation Memory runs we can - # fit into the Prompt Stack without exceeding the token limit. - while should_prune and num_runs_to_fit_in_prompt > 0: - temp_stack.inputs = self.inputs.copy() - - # Add n runs from Conversation Memory. - # Where we insert into the Prompt Stack doesn't matter here - # since we only care about the total token count. - memory_inputs = memory.to_prompt_stack(num_runs_to_fit_in_prompt).inputs - temp_stack.inputs.extend(memory_inputs) - - # Convert the prompt stack into tokens left. - prompt_string = prompt_driver.prompt_stack_to_string(temp_stack) - tokens_left = prompt_driver.tokenizer.count_input_tokens_left(prompt_string) - if tokens_left > 0: - # There are still tokens left, no need to prune. - should_prune = False - else: - # There were not any tokens left, prune one run and try again. - num_runs_to_fit_in_prompt -= 1 - - if num_runs_to_fit_in_prompt: - memory_inputs = memory.to_prompt_stack(num_runs_to_fit_in_prompt).inputs - if index: - self.inputs[index:index] = memory_inputs - else: - self.inputs.extend(memory_inputs) - return self.inputs diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index dc4cde69e..43d9a365f 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -13,6 +13,7 @@ class MockPromptDriver(BasePromptDriver): model: str = "test-model" tokenizer: BaseTokenizer = MockTokenizer(model="test-model", max_input_tokens=4096, max_output_tokens=4096) + mock_input: str | Callable[[], str] = field(default="mock input", kw_only=True) mock_output: str | Callable[[], str] = field(default="mock output", kw_only=True) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: diff --git a/tests/mocks/mock_tokenizer.py b/tests/mocks/mock_tokenizer.py index a333f9a13..eff103e99 100644 --- a/tests/mocks/mock_tokenizer.py +++ b/tests/mocks/mock_tokenizer.py @@ -1,13 +1,9 @@ from __future__ import annotations -from attrs import define, field +from attrs import define from griptape.tokenizers import BaseTokenizer @define() class MockTokenizer(BaseTokenizer): - model: str = field(kw_only=True) - max_input_tokens: int = field(default=1000, kw_only=True) - max_output_tokens: int = field(default=1000, kw_only=True) - - def count_tokens(self, text: str | list[dict]) -> int: + def count_tokens(self, text: str) -> int: return len(text) diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index 8279fb091..1dd83f96c 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -18,7 +18,7 @@ def test_to_dict(self, config): "prompt_driver": { "type": "AnthropicPromptDriver", "temperature": 0.1, - "max_tokens": None, + "max_tokens": 1000, "stream": False, "model": "claude-3-opus-20240229", "top_p": 0.999, diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 28409cea1..8aa345595 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -42,7 +42,7 @@ def messages(self): def test_try_run(self, mock_converse, prompt_stack, messages): # Given - driver = AmazonBedrockPromptDriver(model="foo bar") + driver = AmazonBedrockPromptDriver(model="ai21.j2") # When text_artifact = driver.try_run(prompt_stack) @@ -63,7 +63,7 @@ def test_try_run(self, mock_converse, prompt_stack, messages): def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages): # Given - driver = AmazonBedrockPromptDriver(model="foo bar", stream=True) + driver = AmazonBedrockPromptDriver(model="ai21.j2", stream=True) # When text_artifact = next(driver.try_stream(prompt_stack)) diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py index 3ac9e5164..4ae8fe944 100644 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py @@ -7,8 +7,6 @@ import json import pytest -from griptape.utils.constants import Constants - def to_streaming_body(data: Any) -> StreamingBody: bytes = json.dumps(data).encode("utf-8") @@ -57,7 +55,7 @@ def test_try_run(self, mock_client): "max_new_tokens": 250, "do_sample": True, "eos_token_id": 1, - "stop_strings": [Constants.RESPONSE_STOP_SEQUENCE], + "stop_strings": [], "return_full_text": False, }, } @@ -85,7 +83,7 @@ def test_try_run(self, mock_client): "max_new_tokens": 250, "do_sample": True, "eos_token_id": 1, - "stop_strings": [Constants.RESPONSE_STOP_SEQUENCE], + "stop_strings": [], "return_full_text": False, }, } diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index c5009afac..22178bbf3 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -63,9 +63,9 @@ def test_try_run(self, mock_client, model, system_enabled): # Then mock_client.return_value.messages.create.assert_called_once_with( messages=expected_messages, - stop_sequences=["<|Response|>"], + stop_sequences=[], model=driver.model, - max_tokens=4091, + max_tokens=1000, temperature=0.1, top_p=0.999, top_k=250, @@ -106,9 +106,9 @@ def test_try_stream_run(self, mock_stream_client, model, system_enabled): # Then mock_stream_client.return_value.messages.create.assert_called_once_with( messages=expected_messages, - stop_sequences=["<|Response|>"], + stop_sequences=[], model=driver.model, - max_tokens=4091, + max_tokens=1000, temperature=0.1, stream=True, top_p=0.999, diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 1a06b5907..0743402aa 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -39,35 +39,6 @@ def test_run_via_pipeline_publishes_events(self, mocker): def test_run(self): assert isinstance(MockPromptDriver().run(PromptStack(inputs=[])), TextArtifact) - def test_token_count(self): - assert ( - MockPromptDriver().token_count( - PromptStack(inputs=[PromptStack.Input("foobar", role=PromptStack.USER_ROLE)]) - ) - == 24 - ) - - def test_max_output_tokens(self): - assert MockPromptDriver().max_output_tokens("foobar") == 4090 - assert MockPromptDriver(max_tokens=5000).max_output_tokens("foobar") == 4090 - assert MockPromptDriver(max_tokens=100).max_output_tokens("foobar") == 100 - - def test_prompt_stack_to_string(self): - assert ( - MockPromptDriver().prompt_stack_to_string( - PromptStack(inputs=[PromptStack.Input("foobar", role=PromptStack.USER_ROLE)]) - ) - == "User: foobar\n\nAssistant:" - ) - - def test_custom_prompt_stack_to_string(self): - assert ( - MockPromptDriver( - prompt_stack_to_string=lambda stack: f"Foo: {stack.inputs[0].content}" - ).prompt_stack_to_string(PromptStack(inputs=[PromptStack.Input("foobar", role=PromptStack.USER_ROLE)])) - == "Foo: foobar" - ) - def instance_count(instances, clazz): return len([instance for instance in instances if isinstance(instance, clazz)]) diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index 6e38bd503..f655d3e51 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -2,7 +2,6 @@ from griptape.drivers import GooglePromptDriver from griptape.utils import PromptStack from unittest.mock import Mock -from tests.mocks.mock_tokenizer import MockTokenizer import pytest @@ -32,9 +31,7 @@ def test_try_run(self, mock_generative_model): prompt_stack.add_user_input("user-input") prompt_stack.add_assistant_input("assistant-input") prompt_stack.add_generic_input("generic-input") - driver = GooglePromptDriver( - model="gemini-pro", api_key="api-key", tokenizer=MockTokenizer(model="gemini-pro"), top_p=0.5, top_k=50 - ) + driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", top_p=0.5, top_k=50) # When text_artifact = driver.try_run(prompt_stack) @@ -47,7 +44,7 @@ def test_try_run(self, mock_generative_model): {"parts": ["generic-input"], "role": "user"}, ], generation_config=GenerationConfig( - max_output_tokens=997, temperature=0.1, top_p=0.5, top_k=50, stop_sequences=["<|Response|>"] + max_output_tokens=None, temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[] ), ) assert text_artifact.value == "model-output" @@ -59,14 +56,7 @@ def test_try_stream(self, mock_stream_generative_model): prompt_stack.add_user_input("user-input") prompt_stack.add_assistant_input("assistant-input") prompt_stack.add_generic_input("generic-input") - driver = GooglePromptDriver( - model="gemini-pro", - api_key="api-key", - stream=True, - tokenizer=MockTokenizer(model="gemini-pro"), - top_p=0.5, - top_k=50, - ) + driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", stream=True, top_p=0.5, top_k=50) # When text_artifact_stream = driver.try_stream(prompt_stack) @@ -80,9 +70,7 @@ def test_try_stream(self, mock_stream_generative_model): {"parts": ["generic-input"], "role": "user"}, ], stream=True, - generation_config=GenerationConfig( - max_output_tokens=997, temperature=0.1, top_p=0.5, top_k=50, stop_sequences=["<|Response|>"] - ), + generation_config=GenerationConfig(temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[]), ) assert text_artifact.value == "model-output" @@ -108,26 +96,3 @@ def test_prompt_stack_to_model_input(self): {"role": "model", "parts": ["assistant-input"]}, {"role": "user", "parts": ["user-input"]}, ] - - def test_to_content_dict(self): - # Given - driver = GooglePromptDriver(model="gemini-pro", api_key="1234") - - # When - assert driver._GooglePromptDriver__to_content_dict(PromptStack.Input("system-input", "system")) == { - "role": "user", - "parts": ["system-input"], - } - assert driver._GooglePromptDriver__to_content_dict(PromptStack.Input("user-input", "user")) == { - "role": "user", - "parts": ["user-input"], - } - assert driver._GooglePromptDriver__to_content_dict(PromptStack.Input("assistant-input", "assistant")) == { - "role": "model", - "parts": ["assistant-input"], - } - - assert driver._GooglePromptDriver__to_content_dict(PromptStack.Input("generic-input", "generic")) == { - "role": "user", - "parts": ["generic-input"], - } diff --git a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py index 6b91b56cb..15bbb4ead 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py @@ -10,6 +10,13 @@ def mock_client(self, mocker): mock_client.text_generation.return_value = "model-output" return mock_client + @pytest.fixture(autouse=True) + def tokenizer(self, mocker): + from_pretrained = tokenizer = mocker.patch("transformers.AutoTokenizer").from_pretrained + from_pretrained.return_value.apply_chat_template.return_value = [1, 2, 3] + + return tokenizer + @pytest.fixture def mock_client_stream(self, mocker): mock_client = mocker.patch("huggingface_hub.InferenceClient").return_value diff --git a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py index b565ccf4d..b2746ca58 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py @@ -20,6 +20,8 @@ def mock_generator(self, mock_pipeline): def mock_autotokenizer(self, mocker): mock_autotokenizer = mocker.patch("transformers.AutoTokenizer.from_pretrained").return_value mock_autotokenizer.model_max_length = 42 + mock_autotokenizer.apply_chat_template.return_value = [1, 2, 3] + mock_autotokenizer.decode.return_value = "model-output" return mock_autotokenizer @pytest.fixture @@ -78,3 +80,13 @@ def test_try_run_throws_when_non_list(self, mock_generator, prompt_stack): # Then assert e.value.args[0] == "invalid output format" + + def test_prompt_stack_to_string(self, prompt_stack): + # Given + driver = HuggingFacePipelinePromptDriver(model="foo", max_tokens=42) + + # When + result = driver.prompt_stack_to_string(prompt_stack) + + # Then + assert result == "model-output" diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 1f8f07cf5..a2900d4d3 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -1,5 +1,3 @@ -from transformers import AutoTokenizer - from griptape.drivers import OpenAiChatPromptDriver from griptape.tokenizers.huggingface_tokenizer import HuggingFaceTokenizer from griptape.utils import PromptStack @@ -161,30 +159,6 @@ def test_try_run_with_max_tokens(self, mock_chat_completion_create, prompt_stack ) assert text_artifact.value == "model-output" - def test_try_run_max_tokens_limited_by_tokenizer(self, mock_chat_completion_create, prompt_stack, messages): - # Given - max_tokens_request = 9999999 - driver = OpenAiChatPromptDriver( - model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, max_tokens=max_tokens_request - ) - tokens_left = driver.tokenizer.count_input_tokens_left(driver._prompt_stack_to_messages(prompt_stack)) - - # When - text_artifact = driver.try_run(prompt_stack) - - # Then - mock_chat_completion_create.assert_called_once_with( - model=driver.model, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - messages=messages, - max_tokens=max_tokens_request, - seed=driver.seed, - ) - assert max_tokens_request > tokens_left - assert text_artifact.value == "model-output" - def test_try_run_throws_when_prompt_stack_is_string(self): # Given driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) @@ -209,57 +183,10 @@ def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_chat_ # Then e.value.args[0] == "Completion with more than one choice is not supported yet." - def test_token_count(self, prompt_stack, messages): - # Given - mock_tokenizer = Mock(spec=OpenAiTokenizer) - mock_tokenizer.count_tokens.return_value = 42 - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, tokenizer=mock_tokenizer) - - # When - token_count = driver.token_count(prompt_stack) - - # Then - mock_tokenizer.count_tokens.assert_called_once_with(messages) - assert token_count == 42 - - # Given - mock_tokenizer = Mock() - mock_tokenizer.count_tokens.return_value = 42 - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, tokenizer=mock_tokenizer) - - # When - token_count = driver.token_count(prompt_stack) - - # Then - mock_tokenizer.count_tokens.assert_called_once_with(driver.prompt_stack_to_string(prompt_stack)) - assert token_count == 42 - - def test_max_output_tokens(self, messages): - # Given - mock_tokenizer = Mock() - mock_tokenizer.count_output_tokens_left.return_value = 42 - driver = OpenAiChatPromptDriver( - model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, tokenizer=mock_tokenizer, max_tokens=45 - ) - - # When - max_output_tokens = driver.max_output_tokens(messages) - - # Then - mock_tokenizer.count_output_tokens_left.assert_called_once_with(messages) - assert max_output_tokens == 42 - - def test_max_output_tokens_with_max_tokens(self, messages): - max_tokens = OpenAiChatPromptDriver( - model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, max_tokens=42 - ).max_output_tokens(messages) - - assert max_tokens == 42 - def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messages): driver = OpenAiChatPromptDriver( model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, - tokenizer=HuggingFaceTokenizer(tokenizer=AutoTokenizer.from_pretrained("gpt2"), max_output_tokens=1000), + tokenizer=HuggingFaceTokenizer(model="gpt2", max_output_tokens=1000), max_tokens=1, ) @@ -272,7 +199,12 @@ def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messa temperature=driver.temperature, stop=driver.tokenizer.stop_sequences, user=driver.user, - messages=messages, + messages=[ + {"role": "user", "content": "generic-input"}, + {"role": "system", "content": "system-input"}, + {"role": "user", "content": "user-input"}, + {"role": "assistant", "content": "assistant-input"}, + ], seed=driver.seed, max_tokens=1, ) diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index 665dca9b2..c6eba3df3 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -1,7 +1,10 @@ import json +from griptape.structures import Agent +from griptape.utils import PromptStack from griptape.memory.structure import ConversationMemory, Run, BaseConversationMemory from griptape.structures import Pipeline from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_tokenizer import MockTokenizer from griptape.tasks import PromptTask @@ -69,3 +72,97 @@ def test_buffering(self): assert len(pipeline.conversation_memory.runs) == 2 assert pipeline.conversation_memory.runs[0].input == "run4" assert pipeline.conversation_memory.runs[1].input == "run5" + + def test_add_to_prompt_stack_autopruing_disabled(self): + agent = Agent(prompt_driver=MockPromptDriver()) + memory = ConversationMemory( + autoprune=False, + runs=[ + Run(input="foo1", output="bar1"), + Run(input="foo2", output="bar2"), + Run(input="foo3", output="bar3"), + Run(input="foo4", output="bar4"), + Run(input="foo5", output="bar5"), + ], + ) + memory.structure = agent + prompt_stack = PromptStack() + prompt_stack.add_user_input("foo") + prompt_stack.add_assistant_input("bar") + memory.add_to_prompt_stack(prompt_stack) + + assert len(prompt_stack.inputs) == 12 + + def test_add_to_prompt_stack_autopruing_enabled(self): + # All memory is pruned. + agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0))) + memory = ConversationMemory( + autoprune=True, + runs=[ + Run(input="foo1", output="bar1"), + Run(input="foo2", output="bar2"), + Run(input="foo3", output="bar3"), + Run(input="foo4", output="bar4"), + Run(input="foo5", output="bar5"), + ], + ) + memory.structure = agent + prompt_stack = PromptStack() + prompt_stack.add_system_input("fizz") + prompt_stack.add_user_input("foo") + prompt_stack.add_assistant_input("bar") + memory.add_to_prompt_stack(prompt_stack) + + assert len(prompt_stack.inputs) == 3 + + # No memory is pruned. + agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000))) + memory = ConversationMemory( + autoprune=True, + runs=[ + Run(input="foo1", output="bar1"), + Run(input="foo2", output="bar2"), + Run(input="foo3", output="bar3"), + Run(input="foo4", output="bar4"), + Run(input="foo5", output="bar5"), + ], + ) + memory.structure = agent + prompt_stack = PromptStack() + prompt_stack.add_system_input("fizz") + prompt_stack.add_user_input("foo") + prompt_stack.add_assistant_input("bar") + memory.add_to_prompt_stack(prompt_stack) + + assert len(prompt_stack.inputs) == 13 + + # One memory is pruned. + # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens + # so that a single memory is pruned. + agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=160))) + memory = ConversationMemory( + autoprune=True, + runs=[ + # All of these sum to 155 tokens with the MockTokenizer. + Run(input="foo1", output="bar1"), + Run(input="foo2", output="bar2"), + Run(input="foo3", output="bar3"), + Run(input="foo4", output="bar4"), + Run(input="foo5", output="bar5"), + ], + ) + memory.structure = agent + prompt_stack = PromptStack() + # And then another 6 tokens from fizz for a total of 161 tokens. + prompt_stack.add_system_input("fizz") + prompt_stack.add_user_input("foo") + prompt_stack.add_assistant_input("bar") + memory.add_to_prompt_stack(prompt_stack, 1) + + # We expect one run (2 prompt stack inputs) to be pruned. + assert len(prompt_stack.inputs) == 11 + assert prompt_stack.inputs[0].content == "fizz" + assert prompt_stack.inputs[1].content == "foo2" + assert prompt_stack.inputs[2].content == "bar2" + assert prompt_stack.inputs[-2].content == "foo" + assert prompt_stack.inputs[-1].content == "bar" diff --git a/tests/unit/tokenizers/__init__.py b/tests/unit/tokenizers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py b/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py new file mode 100644 index 000000000..2b77ba3dc --- /dev/null +++ b/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py @@ -0,0 +1,47 @@ +from griptape.tokenizers import AmazonBedrockTokenizer +import pytest + + +class TestAmazonBedrockTokenizer: + @pytest.fixture + def tokenizer(self, request): + return AmazonBedrockTokenizer(model=request.param) + + @pytest.mark.parametrize( + "tokenizer,expected", + [ + ("anthropic.claude-v2:1", 4), + ("anthropic.claude-v2", 4), + ("anthropic.claude-3-sonnet-20240229-v1:0", 4), + ("anthropic.claude-3-haiku-20240307-v1:0", 4), + ], + indirect=["tokenizer"], + ) + def test_token_count(self, tokenizer, expected): + assert tokenizer.count_tokens("foo bar huzzah") == expected + + @pytest.mark.parametrize( + "tokenizer,expected", + [ + ("anthropic.claude-v2", 99996), + ("anthropic.claude-v2:1", 199996), + ("anthropic.claude-3-sonnet-20240229-v1:0", 199996), + ("anthropic.claude-3-haiku-20240307-v1:0", 199996), + ], + indirect=["tokenizer"], + ) + def test_input_tokens_left(self, tokenizer, expected): + assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected + + @pytest.mark.parametrize( + "tokenizer,expected", + [ + ("anthropic.claude-v2", 4092), + ("anthropic.claude-v2:1", 4092), + ("anthropic.claude-3-sonnet-20240229-v1:0", 4092), + ("anthropic.claude-3-haiku-20240307-v1:0", 4092), + ], + indirect=["tokenizer"], + ) + def test_output_tokens_left(self, tokenizer, expected): + assert tokenizer.count_output_tokens_left("foo bar huzzah") == expected diff --git a/tests/unit/tokenizers/test_base_tokenizer.py b/tests/unit/tokenizers/test_base_tokenizer.py new file mode 100644 index 000000000..eed15b9b2 --- /dev/null +++ b/tests/unit/tokenizers/test_base_tokenizer.py @@ -0,0 +1,13 @@ +import logging +from tests.mocks.mock_tokenizer import MockTokenizer + + +class TestBaseTokenizer: + def test_default_tokens(self, caplog): + with caplog.at_level(logging.WARNING): + tokenizer = MockTokenizer(model="gpt2") + + assert tokenizer.max_input_tokens == 4096 + assert tokenizer.max_output_tokens == 1000 + + assert "gpt2 not found" in caplog.text diff --git a/tests/unit/tokenizers/test_google_tokenizer.py b/tests/unit/tokenizers/test_google_tokenizer.py index 2b26ec6a6..955a0517f 100644 --- a/tests/unit/tokenizers/test_google_tokenizer.py +++ b/tests/unit/tokenizers/test_google_tokenizer.py @@ -1,5 +1,6 @@ import pytest from unittest.mock import Mock +from griptape.utils import PromptStack from griptape.tokenizers import GoogleTokenizer @@ -18,6 +19,7 @@ def tokenizer(self, request): @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 5)], indirect=["tokenizer"]) def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected + assert tokenizer.count_tokens(PromptStack(inputs=[PromptStack.Input(content="foo", role="user")])) == expected assert tokenizer.count_tokens(["foo", "bar", "huzzah"]) == expected @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 30715)], indirect=["tokenizer"]) diff --git a/tests/unit/tokenizers/test_hugging_face_tokenizer.py b/tests/unit/tokenizers/test_hugging_face_tokenizer.py index 5be74f667..dcb309a84 100644 --- a/tests/unit/tokenizers/test_hugging_face_tokenizer.py +++ b/tests/unit/tokenizers/test_hugging_face_tokenizer.py @@ -2,15 +2,14 @@ environ["TRANSFORMERS_VERBOSITY"] = "error" -import pytest -from transformers import GPT2Tokenizer -from griptape.tokenizers import HuggingFaceTokenizer +import pytest # noqa: E402 +from griptape.tokenizers import HuggingFaceTokenizer # noqa: E402 class TestHuggingFaceTokenizer: @pytest.fixture def tokenizer(self): - return HuggingFaceTokenizer(tokenizer=GPT2Tokenizer.from_pretrained("gpt2"), max_output_tokens=1024) + return HuggingFaceTokenizer(model="gpt2", max_output_tokens=1024) def test_token_count(self, tokenizer): assert tokenizer.count_tokens("foo bar huzzah") == 5 diff --git a/tests/unit/tokenizers/test_openai_tokenizer.py b/tests/unit/tokenizers/test_openai_tokenizer.py index b27080aa3..4aa42a87a 100644 --- a/tests/unit/tokenizers/test_openai_tokenizer.py +++ b/tests/unit/tokenizers/test_openai_tokenizer.py @@ -13,6 +13,7 @@ def tokenizer(self, request): ("gpt-4-1106", 5), ("gpt-4-32k", 5), ("gpt-4", 5), + ("gpt-4o", 5), ("gpt-3.5-turbo-0301", 5), ("gpt-3.5-turbo-16k", 5), ("gpt-3.5-turbo", 5), @@ -38,11 +39,13 @@ def test_initialize_with_unknown_model(self): ("gpt-4-1106", 19), ("gpt-4-32k", 19), ("gpt-4", 19), + ("gpt-4o", 19), ("gpt-3.5-turbo-0301", 21), ("gpt-3.5-turbo-16k", 19), ("gpt-3.5-turbo", 19), ("gpt-35-turbo-16k", 19), ("gpt-35-turbo", 19), + ("gpt-35-turbo", 19), ], indirect=["tokenizer"], ) @@ -54,10 +57,18 @@ def test_token_count_for_messages(self, tokenizer, expected): == expected ) + @pytest.mark.parametrize("tokenizer,expected", [("not-real-model", 19)], indirect=["tokenizer"]) + def test_token_count_for_messages_unknown_model(self, tokenizer, expected): + with pytest.raises(NotImplementedError): + tokenizer.count_tokens( + [{"role": "system", "content": "foobar baz"}, {"role": "user", "content": "how foobar am I?"}] + ) + @pytest.mark.parametrize( "tokenizer,expected", [ ("gpt-4-1106", 127987), + ("gpt-4o", 127987), ("gpt-4-32k", 32755), ("gpt-4", 8179), ("gpt-3.5-turbo-16k", 16371), @@ -80,6 +91,7 @@ def test_input_tokens_left(self, tokenizer, expected): ("gpt-4-1106", 4091), ("gpt-4-32k", 4091), ("gpt-4", 4091), + ("gpt-4o", 4091), ("gpt-3.5-turbo-16k", 4091), ("gpt-3.5-turbo", 4091), ("gpt-35-turbo-16k", 4091), diff --git a/tests/unit/tokenizers/test_simple_tokenizer.py b/tests/unit/tokenizers/test_simple_tokenizer.py index a34c0d481..48fa1bdfb 100644 --- a/tests/unit/tokenizers/test_simple_tokenizer.py +++ b/tests/unit/tokenizers/test_simple_tokenizer.py @@ -5,7 +5,7 @@ class TestSimpleTokenizer: @pytest.fixture def tokenizer(self): - return SimpleTokenizer(max_input_tokens=1024, max_output_tokens=4096, characters_per_token=6) + return SimpleTokenizer(model="any model", max_input_tokens=1024, max_output_tokens=4096, characters_per_token=6) def test_token_count(self, tokenizer): assert tokenizer.count_tokens("foo bar huzzah") == 3 diff --git a/tests/unit/utils/test_prompt_stack.py b/tests/unit/utils/test_prompt_stack.py index 253e8cd44..80010abec 100644 --- a/tests/unit/utils/test_prompt_stack.py +++ b/tests/unit/utils/test_prompt_stack.py @@ -1,9 +1,5 @@ import pytest from griptape.utils import PromptStack -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_tokenizer import MockTokenizer -from griptape.structures.agent import Agent -from griptape.memory.structure import ConversationMemory, Run class TestPromptStack: @@ -43,97 +39,3 @@ def test_add_assistant_input(self, prompt_stack): assert prompt_stack.inputs[0].role == "assistant" assert prompt_stack.inputs[0].content == "foo" - - def test_add_conversation_memory_autopruing_disabled(self): - agent = Agent(prompt_driver=MockPromptDriver()) - memory = ConversationMemory( - autoprune=False, - runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), - ], - ) - memory.structure = agent - prompt_stack = PromptStack() - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") - prompt_stack.add_conversation_memory(memory) - - assert len(prompt_stack.inputs) == 12 - - def test_add_conversation_memory_autopruing_enabled(self): - # All memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0))) - memory = ConversationMemory( - autoprune=True, - runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), - ], - ) - memory.structure = agent - prompt_stack = PromptStack() - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") - prompt_stack.add_conversation_memory(memory) - - assert len(prompt_stack.inputs) == 3 - - # No memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000))) - memory = ConversationMemory( - autoprune=True, - runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), - ], - ) - memory.structure = agent - prompt_stack = PromptStack() - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") - prompt_stack.add_conversation_memory(memory) - - assert len(prompt_stack.inputs) == 13 - - # One memory is pruned. - # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens - # so that a single memory is pruned. - agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=160))) - memory = ConversationMemory( - autoprune=True, - runs=[ - # All of these sum to 155 tokens with the MockTokenizer. - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), - ], - ) - memory.structure = agent - prompt_stack = PromptStack() - # And then another 6 tokens from fizz for a total of 161 tokens. - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") - prompt_stack.add_conversation_memory(memory, 1) - - # We expect one run (2 prompt stack inputs) to be pruned. - assert len(prompt_stack.inputs) == 11 - assert prompt_stack.inputs[0].content == "fizz" - assert prompt_stack.inputs[1].content == "foo2" - assert prompt_stack.inputs[2].content == "bar2" - assert prompt_stack.inputs[-2].content == "foo" - assert prompt_stack.inputs[-1].content == "bar" diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 5206b6bd4..43e397cb1 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -67,10 +67,10 @@ class TesterPromptDriverOption: ), "AZURE_CHAT_35_TURBO_16K": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + api_key=os.environ["AZURE_OPENAI_API_KEY_2"], model="gpt-35-turbo-16k", azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], ), enabled=True, ), @@ -186,11 +186,15 @@ class TesterPromptDriverOption: prompt_driver=AmazonBedrockPromptDriver(model="mistral.mistral-small-2402-v1:0"), enabled=True ), "SAGEMAKER_LLAMA_7B": TesterPromptDriverOption( - prompt_driver=AmazonSageMakerJumpstartPromptDriver(endpoint=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"]), + prompt_driver=AmazonSageMakerJumpstartPromptDriver( + endpoint=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], model="meta-llama/Llama-2-7b-chat-hf" + ), enabled=False, ), "SAGEMAKER_FALCON_7b": TesterPromptDriverOption( - prompt_driver=AmazonSageMakerJumpstartPromptDriver(endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"]), + prompt_driver=AmazonSageMakerJumpstartPromptDriver( + endpoint=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], model="tiiuae/falcon-7b-instruct" + ), enabled=False, ), "GOOGLE_GEMINI_PRO": TesterPromptDriverOption( From 331c64305bedfe8e48f8aa06dfaf136af1d4144b Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Tue, 11 Jun 2024 15:12:38 -0700 Subject: [PATCH 093/238] adding a link out to sample repo for multi-agents hosted in gtc (#850) --- docs/examples/multi-agent-workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md index 2678bf3ab..36048272f 100644 --- a/docs/examples/multi-agent-workflow.md +++ b/docs/examples/multi-agent-workflow.md @@ -1,7 +1,7 @@ In this example we implement a multi-agent Workflow. We have a single "Researcher" Agent that conducts research on a topic, and then fans out to multiple "Writer" Agents to write blog posts based on the research. By splitting up our workloads across multiple Structures, we can parallelize the work and leverage the strengths of each Agent. The Researcher can focus on gathering data and insights, while the Writers can focus on crafting engaging narratives. -Additionally, this architecture opens us up to using services such as [Griptape Cloud](https://www.griptape.ai/cloud) to have each Agent run on a separate machine, allowing us to scale our Workflow as needed 🤯. +Additionally, this architecture opens us up to using services such as [Griptape Cloud](https://www.griptape.ai/cloud) to have each Agent run on a separate machine, allowing us to scale our Workflow as needed 🤯. To try out how this would work, you can deploy this example as multiple structures from our [Sample Structures](https://github.com/griptape-ai/griptape-sample-structures/tree/main/griptape-multi-agent-workflows) repo. ```python From ff6ddfd79614d97ea03d7e1c1dc1965f469d3ca2 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 11 Jun 2024 18:28:30 -0500 Subject: [PATCH 094/238] Fix `ActionSubtask` output value (#853) --- CHANGELOG.md | 1 + griptape/tasks/actions_subtask.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf643f4f5..988d2c6c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. - Performance issue in `OpenAiChatPromptDriver` when extracting unused rate-limiting headers. - Streaming not working when using deprecated `Structure.stream` field. +- Raw Tool output being lost when being executed by ActionsSubtask. ## [0.26.0] - 2024-06-04 diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index dfc54aca6..1546a825d 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -101,7 +101,13 @@ def run(self) -> BaseArtifact: else: results = self.execute_actions(self.actions) - self.output = ListArtifact([TextArtifact(name=f"{r[0]} output", value=r[1].to_text()) for r in results]) + actions_output = [] + for result in results: + tag, output = result + output.name = f"{tag} output" + + actions_output.append(output) + self.output = ListArtifact(actions_output) except Exception as e: self.structure.logger.error(f"Subtask {self.id}\n{e}", exc_info=True) From b634598f8b10783c81ec514738ddfd1355419e07 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 12 Jun 2024 10:07:16 -0700 Subject: [PATCH 095/238] Fix/standardize all links, enable docs strict mode (#852) --- docs/examples/amazon-dynamodb-sessions.md | 4 +-- docs/griptape-framework/data/artifacts.md | 4 +-- docs/griptape-framework/data/loaders.md | 20 +++++------ .../drivers/conversation-memory-drivers.md | 6 ++-- .../drivers/embedding-drivers.md | 16 ++++----- .../drivers/event-listener-drivers.md | 8 ++--- .../drivers/image-generation-drivers.md | 4 +-- .../drivers/image-query-drivers.md | 10 +++--- .../drivers/prompt-drivers.md | 2 +- .../griptape-framework/drivers/sql-drivers.md | 8 ++--- .../drivers/structure-run-drivers.md | 4 +-- .../drivers/vector-store-drivers.md | 18 +++++----- .../drivers/web-scraper-drivers.md | 4 +-- .../engines/audio-engines.md | 4 +-- .../engines/extraction-engines.md | 4 +-- .../engines/image-generation-engines.md | 8 ++--- .../engines/image-query-engines.md | 25 ------------- .../engines/query-engines.md | 35 ++++++++++++++++--- .../engines/summary-engines.md | 4 +-- docs/griptape-framework/structures/config.md | 2 +- .../structures/conversation-memory.md | 2 +- .../griptape-framework/structures/rulesets.md | 2 +- docs/griptape-framework/structures/tasks.md | 2 +- docs/griptape-framework/tools/index.md | 2 +- mkdocs.yml | 3 +- 25 files changed, 101 insertions(+), 100 deletions(-) delete mode 100644 docs/griptape-framework/engines/image-query-engines.md diff --git a/docs/examples/amazon-dynamodb-sessions.md b/docs/examples/amazon-dynamodb-sessions.md index 279cced2a..69e9fb815 100644 --- a/docs/examples/amazon-dynamodb-sessions.md +++ b/docs/examples/amazon-dynamodb-sessions.md @@ -1,8 +1,8 @@ Griptape provides [Conversation Memory](../griptape-framework/structures/conversation-memory.md) as a means of persisting conversation context across multiple Structure runs. If you provide it with a suitable Driver, the memory of the previous conversation can be preserved between run of a Structure, giving it additional context for how to respond. -While we can use the [LocalConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#localconversationmemorydriver) to store the conversation history in a local file, this may not be suitable for production use cases. +While we can use the [LocalConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#local) to store the conversation history in a local file, this may not be suitable for production use cases. -In this example, we will show you how to use the [AmazonDynamoDbConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#amazondynamodbconversationmemorydriver) to persist the memory in an [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) table. Please refer to the [Amazon DynamoDB documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) for information on setting up DynamoDB. +In this example, we will show you how to use the [AmazonDynamoDbConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#amazon-dynamodb) to persist the memory in an [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) table. Please refer to the [Amazon DynamoDB documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) for information on setting up DynamoDB. This code implements the idea of a generic "Session" that represents a Conversation Memory entry. For example, a "Session" could be used to represent an individual user's conversation, or a group conversation thread. diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index 18d5cb61f..5b69b120a 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -14,7 +14,7 @@ and access it with [embedding](../../reference/griptape/artifacts/text_artifact. ## CsvRowArtifact Used for passing structured row data around the framework. It inherits from [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) and overrides the -[to_text()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.to_text) method, which always returns a valid CSV row. +[to_text()](../../reference/griptape/artifacts/csv_row_artifact.md#griptape.artifacts.csv_row_artifact.CsvRowArtifact.to_text) method, which always returns a valid CSV row. ## InfoArtifact @@ -29,7 +29,7 @@ Used for passing errors back to the LLM without task memory storing them. Used for passing binary large objects (blobs) back to the LLM. Treat it as a way to return unstructured data, such as images, videos, audio, and other files back from tools. Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#griptape.artifacts.base_artifact.BaseArtifact.name) and -[dir](../../reference/griptape/artifacts/blob_artifact.md#griptape.artifacts.blob_artifact.BlobArtifact.dir) to uniquely identify stored objects. +[dir](../../reference/griptape/artifacts/blob_artifact.md#griptape.artifacts.blob_artifact.BlobArtifact.dir_name) to uniquely identify stored objects. [TaskMemory](../../reference/griptape/memory/task/task_memory.md) automatically stores [BlobArtifact](../../reference/griptape/artifacts/blob_artifact.md)s returned by tool activities that can be reused by other tools. diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index 69ffeda06..dbc578ccd 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -4,7 +4,7 @@ Loaders are used to load textual data from different sources and chunk it into [ Each loader can be used to load a single "document" with [load()](../../reference/griptape/loaders/base_loader.md#griptape.loaders.base_loader.BaseLoader.load) or multiple documents with [load_collection()](../../reference/griptape/loaders/base_loader.md#griptape.loaders.base_loader.BaseLoader.load_collection). -## Pdf Loader +## PDF !!! info This driver requires the `loaders-pdf` [extra](../index.md#extras). @@ -33,7 +33,7 @@ with open("attention.pdf", "rb") as attention, open("CoT.pdf", "rb") as cot: PdfLoader().load_collection(list(load_files(["attention.pdf", "CoT.pdf"]).values())) ``` -## Sql Loader +## SQL Can be used to load data from a SQL database into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: @@ -54,7 +54,7 @@ SqlLoader( ).load_collection(["SELECT 'foo', 'bar';", "SELECT 'fizz', 'buzz';"]) ``` -## Csv Loader +## CSV Can be used to load CSV files into [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md)s: @@ -76,7 +76,7 @@ CsvLoader().load_collection(list(load_files(["tests/resources/cities.csv", "test ``` -## DataFrame Loader +## DataFrame !!! info This driver requires the `loaders-dataframe` [extra](../index.md#extras). @@ -100,7 +100,7 @@ DataFrameLoader().load_collection( ``` -## Text Loader +## Text Used to load arbitrary text and text files: @@ -124,9 +124,9 @@ with open("example.txt", "r") as f: ) ``` -You can set a custom [tokenizer](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.tokenizer.md), [max_tokens](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.max_tokens.md) parameter, and [chunker](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.chunker.md). +You can set a custom [tokenizer](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.tokenizer), [max_tokens](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.max_tokens) parameter, and [chunker](../../reference/griptape/loaders/text_loader.md#griptape.loaders.text_loader.TextLoader.chunker). -## Web Loader +## Web !!! info This driver requires the `loaders-web` [extra](../index.md#extras). @@ -145,7 +145,7 @@ WebLoader().load_collection( ) ``` -## Image Loader +## Image !!! info This driver requires the `loaders-image` [extra](../index.md#extras). @@ -183,7 +183,7 @@ ImageLoader().load_collection(list(load_files(["tests/resources/mountain.png", " ``` -## Email Loader +## Email !!! info This driver requires the `loaders-email` [extra](../index.md#extras). @@ -200,7 +200,7 @@ loader.load(EmailLoader.EmailQuery(label="INBOX")) loader.load_collection([EmailLoader.EmailQuery(label="INBOX"), EmailLoader.EmailQuery(label="SENT")]) ``` -## Audio Loader +## Audio !!! info This driver requires the `loaders-audio` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index 4c3de1e65..2ca5f8dd3 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -2,7 +2,7 @@ You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). -### LocalConversationMemoryDriver +### Local The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. @@ -18,7 +18,7 @@ agent.run("Surfing is my favorite sport.") agent.run("What is my favorite sport?") ``` -### AmazonDynamoDbConversationMemoryDriver +### Amazon DynamoDb !!! info This driver requires the `drivers-memory-conversation-amazon-dynamodb` [extra](../index.md#extras). @@ -47,7 +47,7 @@ agent.run("What is my name?") ``` -### Redis Conversation Memory Driver +### Redis !!! info This driver requires the `drivers-memory-conversation-redis` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index b7212e6ff..3f0135ac3 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -10,7 +10,7 @@ You can optionally provide a [Tokenizer](../misc/tokenizers.md) via the [tokeniz ## Embedding Drivers -### OpenAI Embeddings +### OpenAI The [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) uses the [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings). @@ -27,12 +27,12 @@ print(embeddings[:3]) [0.0017853748286142945, 0.006118456833064556, -0.005811543669551611] ``` -### Azure OpenAI Embeddings +### Azure OpenAI The [AzureOpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/azure_openai_embedding_driver.md) uses the same parameters as [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) with updated defaults. -### Bedrock Titan Embeddings +### Bedrock Titan !!! info This driver requires the `drivers-embedding-amazon-bedrock` [extra](../index.md#extras). @@ -51,7 +51,7 @@ print(embeddings[:3]) [-0.234375, -0.024902344, -0.14941406] ``` -### Google Embeddings +### Google !!! info This driver requires the `drivers-embedding-google` [extra](../index.md#extras). @@ -69,7 +69,7 @@ print(embeddings[:3]) [0.0588633, 0.0033929371, -0.072810836] ``` -### Hugging Face Hub Embeddings +### Hugging Face Hub !!! info This driver requires the `drivers-embedding-huggingface` [extra](../index.md#extras). @@ -99,7 +99,7 @@ embeddings = driver.embed_string("Hello world!") print(embeddings[:3]) ``` -### Amazon SageMaker Jumpstart Embeddings +### Amazon SageMaker Jumpstart The [AmazonSageMakerJumpstartEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.md) uses the [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) to generate embeddings on AWS. @@ -120,7 +120,7 @@ embeddings = driver.embed_string("Hello world!") print(embeddings[:3]) ``` -### VoyageAI Embeddings +### VoyageAI The [VoyageAiEmbeddingDriver](../../reference/griptape/drivers/embedding/voyageai_embedding_driver.md) uses the [VoyageAI Embeddings API](https://www.voyageai.com/). !!! info @@ -140,7 +140,7 @@ embeddings = driver.embed_string("Hello world!") print(embeddings[:3]) ``` -### Cohere Embeddings +### Cohere The [CohereEmbeddingDriver](../../reference/griptape/drivers/embedding/cohere_embedding_driver.md) uses the [Cohere Embeddings API](https://docs.cohere.com/docs/embeddings). diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index 6e8f59b22..4a85bc9a4 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -66,7 +66,7 @@ event_driver.publish_event(done_event) Griptape offers the following Event Listener Drivers for forwarding Griptape Events. -### Amazon SQS Event Listener Driver +### Amazon SQS !!! info This driver requires the `drivers-event-listener-amazon-sqs` [extra](../index.md#extras). @@ -108,7 +108,7 @@ agent.run( ) ``` -### AWS IoT Event Listener Driver +### AWS IoT !!! info This driver requires the `drivers-event-listener-amazon-iot` [extra](../index.md#extras). @@ -152,7 +152,7 @@ agent = Agent( agent.run("I want to fly from Orlando to Boston") ``` -### Griptape Cloud Event Listener Driver +### Griptape Cloud The [GriptapeCloudEventListenerDriver](../../reference/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.md) sends Events to [Griptape Cloud](https://www.griptape.ai/cloud). @@ -212,7 +212,7 @@ agent = Agent( agent.run("Analyze the pros and cons of remote work vs. office work") ``` -### Pusher Event Listener Driver +### Pusher !!! info This driver requires the `drivers-event-listener-pusher` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md index 7389ff711..25572ba9c 100644 --- a/docs/griptape-framework/drivers/image-generation-drivers.md +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -27,7 +27,7 @@ agent.run("Generate a watercolor painting of a dog riding a skateboard") The [Amazon Bedrock Image Generation Driver](../../reference/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.md) provides multi-model access to image generation models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. -#### Bedrock Stable Diffusion Model Driver +#### Stable Diffusion The [Bedrock Stable Diffusion Model Driver](../../reference/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.md) provides support for Stable Diffusion models hosted by Amazon Bedrock. This Model Driver supports configurations specific to Stable Diffusion, like style presets, clip guidance presets, and sampler. @@ -58,7 +58,7 @@ agent = Agent(tools=[ agent.run("Generate an image of a dog riding a skateboard") ``` -#### Bedrock Titan Image Generator Model Driver +#### Titan The [Bedrock Titan Image Generator Model Driver](../../reference/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.md) provides support for Titan Image Generator models hosted by Amazon Bedrock. This Model Driver supports configurations specific to Titan Image Generator, like quality, seed, and cfg_scale. diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index d795838d4..8003924b1 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -1,11 +1,11 @@ # Image Query Drivers -Image Query Drivers are used by [Image Query Engines](../engines/image-query-engines.md) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. +Image Query Drivers are used by [Image Query Engines](../engines/query-engines.md#image) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. !!! info All Image Query Drivers default to a `max_tokens` of 256. It is recommended that you set this value to correspond to the desired response length. -## AnthropicImageQueryDriver +## Anthropic !!! info To tune `max_tokens`, see [Anthropic's documentation on image tokens](https://docs.anthropic.com/claude/docs/vision#image-costs) for more information on how to relate token count to response length. @@ -59,7 +59,7 @@ result = engine.run("Describe the weather in the image", [image_artifact1, image print(result) ``` -## OpenAiVisionImageQueryDriver +## OpenAI !!! info While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. @@ -86,7 +86,7 @@ with open("tests/resources/mountain.png", "rb") as f: engine.run("Describe the weather in the image", [image_artifact]) ``` -## AzureOpenAiVisionImageQueryDriver +## Azure OpenAI !!! info In order to use the `gpt-4-vision-preview` model on Azure OpenAI, the `gpt-4` model must be deployed with the version set to `vision-preview`. More information can be found in the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision). @@ -117,7 +117,7 @@ with open("tests/resources/mountain.png", "rb") as f: engine.run("Describe the weather in the image", [image_artifact]) ``` -## AmazonBedrockImageQueryDriver +## Amazon Bedrock The [Amazon Bedrock Image Query Driver](../../reference/griptape/drivers/image_query/amazon_bedrock_image_query_driver.md) provides multi-model access to image query models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 0f376cd5f..8d8877871 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -356,7 +356,7 @@ The [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prom Amazon Sagemaker Jumpstart provides a wide range of models with varying capabilities. This Driver has been primarily _chat-optimized_ models that have a [Huggingface Chat Template](https://huggingface.co/docs/transformers/en/chat_templating) available. -If your model does not fit this use-case, we suggest sub-classing [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) and overriding the [_to_model_input](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver/#griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver.AmazonSagemakerJumpstartPromptDriver._to_model_input) and [_to_model_params](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver/#griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver.AmazonSagemakerJumpstartPromptDriver._to_model_params) methods. +If your model does not fit this use-case, we suggest sub-classing [AmazonSageMakerJumpstartPromptDriver](../../reference/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.md) and overriding the `_to_model_input` and `_to_model_params` methods. ```python title="PYTEST_IGNORE" diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md index 35377849a..c4b7dbcca 100644 --- a/docs/griptape-framework/drivers/sql-drivers.md +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -1,14 +1,14 @@ ## Overview SQL drivers can be used to make SQL queries and load table schemas. They are used by the [SqlLoader](../../reference/griptape/loaders/sql_loader.md) to process data. All loaders implement the following methods: -* `execute_query()` executes a query and returns [RowResult](../../reference/griptape/drivers/sql/base_sql_driver.md#griptape.drivers.sql.base_sql_driver.BaseSqlDriver.RowResult.md)s. +* `execute_query()` executes a query and returns [RowResult](../../reference/griptape/drivers/sql/base_sql_driver.md#griptape.drivers.sql.base_sql_driver.BaseSqlDriver.RowResult)s. * `execute_query_row()` executes a query and returns a raw result from SQL. * `get_table_schema()` returns a table schema. !!! info More database-specific SQL drivers are coming soon. -## SqlDriver +## SQL This is a basic SQL loader based on [SQLAlchemy 1.x](https://docs.sqlalchemy.org/en/14/). Here is an example of how to use it: @@ -22,7 +22,7 @@ driver = SqlDriver( driver.execute_query("select 'foo', 'bar';") ``` -## AmazonRedshiftSqlDriver +## Amazon Redshift !!! info This driver requires the `drivers-sql-redshift` [extra](../index.md#extras). @@ -46,7 +46,7 @@ driver = AmazonRedshiftSqlDriver( driver.execute_query("select * from people;") ``` -## SnowflakeSqlDriver +## Snowflake !!! info This driver requires the `drivers-sql-snowflake` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index c2b94190c..54413c3a2 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -2,7 +2,7 @@ Structure Run Drivers can be used to run Griptape Structures in a variety of runtime environments. When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Client](../../griptape-tools/official-tools/structure-run-client.md) you can create complex, multi-agent pipelines that span multiple runtime environments. -## Local Structure Run Driver +## Local The [LocalStructureRunDriver](../../reference/griptape/drivers/structure_run/local_structure_run_driver.md) is used to run Griptape Structures in the same runtime environment as the code that is running the Structure. @@ -53,7 +53,7 @@ joke_coordinator = Pipeline( joke_coordinator.run("Tell me a joke") ``` -## Griptape Cloud Structure Run Driver +## Griptape Cloud The [GriptapeCloudStructureRunDriver](../../reference/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.md) is used to run Griptape Structures in the Griptape Cloud. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index 73a416c84..481a2dd84 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -16,7 +16,7 @@ Each vector driver takes a [BaseEmbeddingDriver](../../reference/griptape/driver !!! info More vector drivers are coming soon. -## Local Vector Store Driver +## Local The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the driver can be used to load a webpage into the driver and query it later: @@ -47,7 +47,7 @@ print("\n\n".join(values)) ``` -## Pinecone Vector Store Driver +## Pinecone !!! info This driver requires the `drivers-vector-pinecone` [extra](../index.md#extras). @@ -103,7 +103,7 @@ result = vector_store_driver.query( ) ``` -## Marqo Vector Store Driver +## Marqo !!! info This driver requires the `drivers-vector-marqo` [extra](../index.md#extras). @@ -157,7 +157,7 @@ result = vector_store.query(query="What is griptape?") print(result) ``` -## Mongodb Atlas Vector Store Driver +## Mongodb Atlas !!! info This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). @@ -225,14 +225,14 @@ The format for creating a vector index should look similar to the following: ``` Replace `path_to_vector` with the expected field name where the vector content will be. -## Azure MongoDB Vector Store Driver +## Azure MongoDB !!! info This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). The [AzureMongoDbVectorStoreDriver](../../reference/griptape/drivers/vector/azure_mongodb_vector_store_driver.md) provides support for storing vector data in an Azure CosmosDb database account using the MongoDb vCore API -Here is an example of how the driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is almost the same as the [MongodbAtlasVectorStoreDriver](#mongodb-atlas-vector-store-driver): +Here is an example of how the driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is very similar to the Driver for [MongoDb Atlas](#mongodb-atlas): ```python from griptape.drivers import AzureMongoDbVectorStoreDriver, OpenAiEmbeddingDriver @@ -274,7 +274,7 @@ result = vector_store.query(query="What is griptape?") print(result) ``` -## Redis Vector Store Driver +## Redis !!! info This driver requires the `drivers-vector-redis` [extra](../index.md#extras). @@ -319,7 +319,7 @@ The format for creating a vector index should be similar to the following: FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA namespace TAG vector VECTOR FLAT 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE ``` -## OpenSearch Vector Store Driver +## OpenSearch !!! info This driver requires the `drivers-vector-opensearch` [extra](../index.md#extras). @@ -372,7 +372,7 @@ The body mappings for creating a vector index should look similar to the followi } ``` -## PGVector Vector Store Driver +## PGVector !!! info This driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index 888605b73..a02365b67 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -4,7 +4,7 @@ Web Scraper Drivers can be used to scrape text from the web. They are used by [W * `scrape_url()` scrapes text from a website and returns a [TextArtifact](../../reference/griptape/artifacts/text_artifact.md). The format of the scrapped text is determined by the Driver. -## Markdownify Web Scraper Driver +## Markdownify !!! info This driver requires the `drivers-web-scraper-markdownify` [extra](../index.md#extras) and the @@ -64,7 +64,7 @@ agent = Agent( agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") ``` -## Trafilatura Web Scraper Driver +## Trafilatura !!! info This driver requires the `drivers-web-scraper-trafilatura` [extra](../index.md#extras). diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md index cbef1ef23..6494d5365 100644 --- a/docs/griptape-framework/engines/audio-engines.md +++ b/docs/griptape-framework/engines/audio-engines.md @@ -2,7 +2,7 @@ [Audio Generation Engines](../../reference/griptape/engines/audio/index.md) facilitate audio generation. Audio Generation Engines provides a `run` method that accepts the necessary inputs for its particular mode and provides the request to the configured [Driver](../drivers/text-to-speech-drivers.md). -### Text to Speech Engine +### Text to Speech This Engine facilitates synthesizing speech from text inputs. @@ -28,7 +28,7 @@ engine.run( ) ``` -### Audio Transcription Engine +### Audio Transcription The [Audio Transcription Engine](../../reference/griptape/engines/audio/audio_transcription_engine.md) facilitates transcribing speech from audio inputs. diff --git a/docs/griptape-framework/engines/extraction-engines.md b/docs/griptape-framework/engines/extraction-engines.md index f7969ff4a..101f81ba8 100644 --- a/docs/griptape-framework/engines/extraction-engines.md +++ b/docs/griptape-framework/engines/extraction-engines.md @@ -3,7 +3,7 @@ Extraction Engines in Griptape facilitate the extraction of data from text forma These engines play a crucial role in the functionality of [Extraction Tasks](../../griptape-framework/structures/tasks.md). As of now, Griptape supports two types of Extraction Engines: the CSV Extraction Engine and the JSON Extraction Engine. -## CSV Extraction Engine +## CSV The CSV Extraction Engine is designed specifically for extracting data from CSV-formatted content. @@ -39,7 +39,7 @@ Bob,35,California Charlie,40,Texas ``` -## JSON Extraction Engine +## JSON The JSON Extraction Engine is tailored for extracting data from JSON-formatted content. diff --git a/docs/griptape-framework/engines/image-generation-engines.md b/docs/griptape-framework/engines/image-generation-engines.md index 0c3997fa9..9d38fd197 100644 --- a/docs/griptape-framework/engines/image-generation-engines.md +++ b/docs/griptape-framework/engines/image-generation-engines.md @@ -39,7 +39,7 @@ engine.run( ) ``` -### Prompt Image Generation Engine +### Prompt Image This Engine facilitates generating images from text prompts. @@ -65,7 +65,7 @@ engine.run( ) ``` -### Variation Image Generation Engine +### Variation This Engine facilitates generating variations of an input image according to a text prompt. The input image is used as a reference for the model's generation. @@ -95,7 +95,7 @@ engine.run( ) ``` -### Inpainting Image Generation Engine +### Inpainting This Engine facilitates inpainting, or modifying an input image according to a text prompt within the bounds of a mask defined by mask image. After inpainting, the area specified by the mask is replaced with the model's generation, while the rest of the input image remains the same. @@ -130,7 +130,7 @@ engine.run( ) ``` -### Outpainting Image Generation Engine +### Outpainting This Engine facilitates outpainting, or modifying an input image according to a text prompt outside the bounds of a mask defined by a mask image. After outpainting, the area of the input image specified by the mask remains the same, while the rest is replaced with the model's generation. diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md deleted file mode 100644 index 0457657f8..000000000 --- a/docs/griptape-framework/engines/image-query-engines.md +++ /dev/null @@ -1,25 +0,0 @@ -# ImageQueryEngine - -The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) is used to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). - -All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. - -```python -from griptape.drivers import OpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = OpenAiImageQueryDriver( - model="gpt-4o", - max_tokens=256 -) - -engine = ImageQueryEngine( - image_query_driver=driver -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) -``` diff --git a/docs/griptape-framework/engines/query-engines.md b/docs/griptape-framework/engines/query-engines.md index 8acd4686d..71aab6416 100644 --- a/docs/griptape-framework/engines/query-engines.md +++ b/docs/griptape-framework/engines/query-engines.md @@ -1,13 +1,13 @@ ## Overview -Query engines are used to search collections of text. +Query engines are used to perform text queries against various modalities. -## VectorQueryEngine +## Vector -Used to query vector storages. You can set a custom [prompt_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.prompt_driver.md) and [vector_store_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.vector_store_driver.md). Uses [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) by default. +Used to query vector storages. You can set a custom [prompt_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.prompt_driver) and [vector_store_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.vector_store_driver). Uses [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) by default. -Use the [upsert_text_artifact](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.upsert_text_artifact.md) method to insert [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s into vector storage with an optional `namespace`. +Use the [upsert_text_artifact](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.upsert_text_artifact)s into vector storage with an optional `namespace`. -Use the [VectorQueryEngine](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.query.md) method to query the vector storage. +Use the [VectorQueryEngine](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.query) method to query the vector storage. ```python from griptape.drivers import OpenAiChatPromptDriver, LocalVectorStoreDriver, OpenAiEmbeddingDriver @@ -25,3 +25,28 @@ engine.upsert_text_artifacts( engine.query("what is griptape?", namespace="griptape") ``` + +## Image +The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) is used to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). + +All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. + +```python +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiImageQueryDriver( + model="gpt-4o", + max_tokens=256 +) + +engine = ImageQueryEngine( + image_query_driver=driver +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` diff --git a/docs/griptape-framework/engines/summary-engines.md b/docs/griptape-framework/engines/summary-engines.md index 8ecc1ad09..936c12a7c 100644 --- a/docs/griptape-framework/engines/summary-engines.md +++ b/docs/griptape-framework/engines/summary-engines.md @@ -2,11 +2,11 @@ Summary engines are used to summarize text and collections of [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s. -## PromptSummaryEngine +## Prompt Used to summarize texts with LLMs. You can set a custom [prompt_driver](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.prompt_driver), [template_generator](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.template_generator), and [chunker](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.chunker). -Use the [summarize_artifacts](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_artifacts) method to summarize a list of artifacts or [summarize_text](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_text) to summarize an arbitrary string. +Use the [summarize_artifacts](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_artifacts) method to summarize a list of artifacts or [summarize_text](../../reference/griptape/engines/summary/base_summary_engine.md#griptape.engines.summary.base_summary_engine.BaseSummaryEngine.summarize_text) to summarize an arbitrary string. ```python import io diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 9637eaf35..d75354768 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -89,7 +89,7 @@ agent = Agent( ### Custom Configs -You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding the Drivers in [default_config](../../reference/griptape/config/structure_config.md#griptape.config.structure_config.StructureConfig.default_config). +You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding relevant Drivers. The [StructureConfig](../../reference/griptape/config/structure_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyException](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. diff --git a/docs/griptape-framework/structures/conversation-memory.md b/docs/griptape-framework/structures/conversation-memory.md index 92fdf98c4..1707a2ad9 100644 --- a/docs/griptape-framework/structures/conversation-memory.md +++ b/docs/griptape-framework/structures/conversation-memory.md @@ -57,7 +57,7 @@ agent.run("Hello!") print(agent.conversation_memory) ``` -You can set the [max_runs](../../reference/griptape/memory/structure/conversation_memory.md#griptape.memory.structure.conversation_memory.ConversationMemory.max_runs) parameter to limit how many runs are kept in memory. +You can set the [max_runs](../../reference/griptape/memory/structure/base_conversation_memory.md#griptape.memory.structure.base_conversation_memory.BaseConversationMemory.max_runs) parameter to limit how many runs are kept in memory. ```python from griptape.structures import Agent diff --git a/docs/griptape-framework/structures/rulesets.md b/docs/griptape-framework/structures/rulesets.md index d97ea65cb..f245579b7 100644 --- a/docs/griptape-framework/structures/rulesets.md +++ b/docs/griptape-framework/structures/rulesets.md @@ -154,7 +154,7 @@ pipeline.run("I love skateboarding!") ### Rules -You can pass [rules](../../reference/griptape/tasks/prompt_task.md#griptape.tasks.prompt_task.PromptTask.rules) directly to the Task to have a Ruleset created for you. +You can pass [rules](../../reference/griptape/mixins/rule_mixin.md#griptape.mixins.rule_mixin.RuleMixin.rules) directly to the Task to have a Ruleset created for you. ```python from griptape.structures import Pipeline diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 0f05ea3e2..c356ee0c7 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -627,7 +627,7 @@ pipeline.run("An image of a mountain shrouded by clouds") ## Image Query Task -The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) executes a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/image-query-engines.md) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. +The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) executes a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/query-engines.md#image) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#textartifact)) and a list of [Image Artifacts](../data/artifacts.md#imageartifact) or a Callable returning these two values. diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 0ae8054af..4d604a77c 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -1,4 +1,4 @@ -# Overview +## Overview One of the most powerful features of Griptape is the ability for Toolkit Tasks to generate _chains of thought_ (CoT) and use tools that can interact with the outside world. We use the [ReAct](https://arxiv.org/abs/2210.03629) technique to implement CoT reasoning and acting in the underlying LLMs without using any fine-tuning. diff --git a/mkdocs.yml b/mkdocs.yml index 99231cce7..317409c55 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,6 +1,7 @@ site_name: Griptape Docs hooks: - docs/plugins/swagger_ui_plugin.py +strict: true plugins: - glightbox - search @@ -96,7 +97,6 @@ nav: - Extraction Engines: "griptape-framework/engines/extraction-engines.md" - Summary Engines: "griptape-framework/engines/summary-engines.md" - Image Generation Engines: "griptape-framework/engines/image-generation-engines.md" - - Image Query Engines: "griptape-framework/engines/image-query-engines.md" - Audio Engines: "griptape-framework/engines/audio-engines.md" - Drivers: - Prompt Drivers: "griptape-framework/drivers/prompt-drivers.md" @@ -148,6 +148,7 @@ nav: - ImageQueryClient: "griptape-tools/official-tools/image-query-client.md" - TextToSpeechClient: "griptape-tools/official-tools/text-to-speech-client.md" - AudioTranscriptionClient: "griptape-tools/official-tools/audio-transcription-client.md" + - GriptapeCloudKnowledgeBaseClient: "griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: From 71c8d4dd950b88f47fc26cbc8d074919d21b93af Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 12 Jun 2024 14:39:34 -0700 Subject: [PATCH 096/238] Fix header indents (#855) --- docs/griptape-framework/drivers/prompt-drivers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 8d8877871..c765030d8 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -347,7 +347,7 @@ agent = Agent( agent.run("How many helicopters can a human eat in one sitting?") ``` -#### Amazon SageMaker Jumpstart +### Amazon SageMaker Jumpstart !!! info This driver requires the `drivers-prompt-amazon-sagemaker` [extra](../index.md#extras). From bfd7896ff90f4febe1c13cfc9c4a2e594a74aa36 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Wed, 12 Jun 2024 15:02:54 -0700 Subject: [PATCH 097/238] Re-order Workflow tasks on every task execution wave (#857) --- CHANGELOG.md | 1 + griptape/structures/workflow.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 988d2c6c6..6fef1a154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Performance issue in `OpenAiChatPromptDriver` when extracting unused rate-limiting headers. - Streaming not working when using deprecated `Structure.stream` field. - Raw Tool output being lost when being executed by ActionsSubtask. +- Re-order Workflow tasks on every task execution wave. ## [0.26.0] - 2024-06-04 diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index a9c571af2..417dd313f 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -92,11 +92,11 @@ def insert_task( def try_run(self, *args) -> Workflow: self._execution_args = args - ordered_tasks = self.order_tasks() exit_loop = False while not self.is_finished() and not exit_loop: futures_list = {} + ordered_tasks = self.order_tasks() for task in ordered_tasks: if task.can_execute(): From 7c36226f4efdc3ea4c161f9224183250383fb6ec Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Thu, 13 Jun 2024 13:00:34 -0400 Subject: [PATCH 098/238] Handle errors in web loader and return ErrorArtifact (#858) --- CHANGELOG.md | 1 + griptape/loaders/web_loader.py | 7 +++++-- tests/unit/loaders/test_web_loader.py | 19 +++++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fef1a154..709bea35d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Streaming not working when using deprecated `Structure.stream` field. - Raw Tool output being lost when being executed by ActionsSubtask. - Re-order Workflow tasks on every task execution wave. +- Web Loader to catch Exceptions and properly return an ErrorArtifact. ## [0.26.0] - 2024-06-04 diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index f8862f7cd..64a52b65f 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -13,5 +13,8 @@ class WebLoader(BaseTextLoader): ) def load(self, source: str, *args, **kwargs) -> ErrorArtifact | list[TextArtifact]: - single_chunk_text_artifact = self.web_scraper_driver.scrape_url(source) - return self._text_to_artifacts(single_chunk_text_artifact.value) + try: + single_chunk_text_artifact = self.web_scraper_driver.scrape_url(source) + return self._text_to_artifacts(single_chunk_text_artifact.value) + except Exception as e: + return ErrorArtifact(f"Error loading from source: {source}", exception=e) diff --git a/tests/unit/loaders/test_web_loader.py b/tests/unit/loaders/test_web_loader.py index fb63e87eb..e26573539 100644 --- a/tests/unit/loaders/test_web_loader.py +++ b/tests/unit/loaders/test_web_loader.py @@ -1,4 +1,5 @@ import pytest +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.loaders import WebLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -22,6 +23,14 @@ def test_load(self, loader): assert artifacts[0].embedding == [0, 1] + def test_load_exception(self, mocker, loader): + mocker.patch("trafilatura.fetch_url", side_effect=Exception("error")) + source = "https://github.com/griptape-ai/griptape" + artifact = loader.load(source) + + assert isinstance(artifact, ErrorArtifact) + assert f"Error loading from source: {source}" == artifact.value + def test_load_collection(self, loader): artifacts = loader.load_collection( ["https://github.com/griptape-ai/griptape", "https://github.com/griptape-ai/griptape-docs"] @@ -38,11 +47,13 @@ def test_load_collection(self, loader): def test_empty_page_string_response(self, loader, mocker): mocker.patch("trafilatura.extract", return_value="") - with pytest.raises(Exception, match="can't extract page"): - loader.load("https://example.com/") + artifact = loader.load("https://example.com/") + assert isinstance(artifact, ErrorArtifact) + assert str(artifact.exception) == "can't extract page" def test_empty_page_none_response(self, loader, mocker): mocker.patch("trafilatura.extract", return_value=None) - with pytest.raises(Exception, match="can't extract page"): - loader.load("https://example.com/") + artifact = loader.load("https://example.com/") + assert isinstance(artifact, ErrorArtifact) + assert str(artifact.exception) == "can't extract page" From e54a04ba6adfe9b78d9e3901f06f2802396793c9 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 13 Jun 2024 14:15:05 -0500 Subject: [PATCH 099/238] Add structure property `output`; add `output_task.output` check (#862) --- CHANGELOG.md | 4 +++- griptape/structures/agent.py | 2 +- griptape/structures/pipeline.py | 4 ++-- griptape/structures/structure.py | 6 +++++- griptape/structures/workflow.py | 2 +- tests/unit/structures/test_agent.py | 10 +++++++++ tests/unit/structures/test_workflow.py | 28 +++++++++++++++++++++++++- tests/utils/structure_tester.py | 2 +- 8 files changed, 50 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 709bea35d..5b42fba26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Raw Tool output being lost when being executed by ActionsSubtask. - Re-order Workflow tasks on every task execution wave. - Web Loader to catch Exceptions and properly return an ErrorArtifact. +- Conversation Memory entry only added if `output_task.output` is not `None` on all `Structures` ## [0.26.0] - 2024-06-04 @@ -72,7 +73,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AudioTranscriptionTask` and `AudioTranscriptionClient` for transcribing audio content in Structures. - `OpenAiAudioTranscriptionDriver` for integration with OpenAI's speech-to-text models, including Whisper. - Parameter `env` to `BaseStructureRunDriver` to set environment variables for a Structure Run. -- `PusherEventListenerDriver` to enable sending of framework events over a Pusher WebSocket. +- `PusherEventListenerDriver` to enable sending of framework events over a Pusher WebSocket. +- Parameter `output` on `Structure` as a convenience for `output_task.output` ### Changed - **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 79b831f63..2348002b5 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -53,7 +53,7 @@ def try_run(self, *args) -> Agent: self.task.execute() - if self.conversation_memory: + if self.conversation_memory and self.output is not None: if isinstance(self.task.input, tuple): input_text = self.task.input[0].to_text() else: diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 00c5f1d09..1d0aebd91 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -49,13 +49,13 @@ def try_run(self, *args) -> Pipeline: self.__run_from_task(self.input_task) - if self.conversation_memory: + if self.conversation_memory and self.output is not None: if isinstance(self.input_task.input, tuple): input_text = self.input_task.input[0].to_text() else: input_text = self.input_task.input.to_text() - run = Run(input=input_text, output=self.output_task.output.to_text()) + run = Run(input=input_text, output=self.output.to_text()) self.conversation_memory.add_run(run) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 6f2d857c4..0632b9328 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -9,7 +9,7 @@ from attrs import Factory, define, field from rich.logging import RichHandler -from griptape.artifacts import BlobArtifact, TextArtifact +from griptape.artifacts import BlobArtifact, TextArtifact, BaseArtifact from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver @@ -127,6 +127,10 @@ def input_task(self) -> Optional[BaseTask]: def output_task(self) -> Optional[BaseTask]: return self.tasks[-1] if self.tasks else None + @property + def output(self) -> Optional[BaseArtifact]: + return self.output_task.output if self.output_task is not None else None + @property def finished_tasks(self) -> list[BaseTask]: return [s for s in self.tasks if s.is_finished()] diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 417dd313f..7073fa43b 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -110,7 +110,7 @@ def try_run(self, *args) -> Workflow: break - if self.conversation_memory: + if self.conversation_memory and self.output is not None: if isinstance(self.input_task.input, tuple): input_text = self.input_task.input[0].to_text() else: diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index 371aee8a8..e6c2a1f01 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -252,3 +252,13 @@ def test_deprecation(self): with pytest.deprecated_call(): Agent(stream=True) + + def finished_tasks(self): + task = PromptTask("test prompt") + agent = Agent(prompt_driver=MockPromptDriver()) + + agent.add_task(task) + + agent.run("hello") + + assert len(agent.finished_tasks) == 1 diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index c11c837b7..14661036d 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -1,16 +1,34 @@ +import time import pytest +from pytest import fixture from griptape.memory.task.storage import TextArtifactStorage from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.rules import Rule, Ruleset -from griptape.tasks import PromptTask, BaseTask, ToolkitTask +from griptape.tasks import PromptTask, BaseTask, ToolkitTask, CodeExecutionTask from griptape.structures import Workflow +from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.memory.structure import ConversationMemory from tests.mocks.mock_tool.tool import MockTool from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestWorkflow: + @fixture + def waiting_task(self): + def fn(task): + time.sleep(10) + return TextArtifact("done") + + return CodeExecutionTask(run_fn=fn) + + @fixture + def error_artifact_task(self): + def fn(task): + return ErrorArtifact("error") + + return CodeExecutionTask(run_fn=fn) + def test_init(self): driver = MockPromptDriver() workflow = Workflow(prompt_driver=driver, rulesets=[Ruleset("TestRuleset", [Rule("test")])]) @@ -691,6 +709,14 @@ def test_deprecation(self): with pytest.deprecated_call(): Workflow(stream=True) + def test_run_with_error_artifact(self, error_artifact_task, waiting_task): + end_task = PromptTask("end") + end_task.add_parents([error_artifact_task, waiting_task]) + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task]) + workflow.run() + + assert workflow.output is None + @staticmethod def _validate_topology_1(workflow): assert len(workflow.tasks) == 4 diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 43e397cb1..8d62bc835 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -237,7 +237,7 @@ def verify_structure_output(self, structure) -> dict: ) task_names = [task.__class__.__name__ for task in structure.tasks] prompt = structure.input_task.input.to_text() - actual = structure.output_task.output.to_text() + actual = structure.output.to_text() rules = [rule.value for ruleset in structure.input_task.all_rulesets for rule in ruleset.rules] agent = Agent( From 9b934ee192deccbd682ee15305e7228be207aac8 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 13 Jun 2024 14:25:35 -0500 Subject: [PATCH 100/238] Fix `WebSearch.search` output (#854) --- CHANGELOG.md | 1 + griptape/tools/web_search/tool.py | 3 ++- tests/unit/tools/test_web_search.py | 33 +++++++++++++++++++++++++---- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b42fba26..a34ff5f73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Re-order Workflow tasks on every task execution wave. - Web Loader to catch Exceptions and properly return an ErrorArtifact. - Conversation Memory entry only added if `output_task.output` is not `None` on all `Structures` +- `TextArtifacts` contained in `ListArtifact` returned by `WebSearch.search` to properly formatted stringified JSON. ## [0.26.0] - 2024-06-04 diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index 6ad25ebf0..acc358342 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -5,6 +5,7 @@ from griptape.tools import BaseTool from griptape.utils.decorators import activity import requests +import json @define @@ -32,7 +33,7 @@ def search(self, props: dict) -> ListArtifact | ErrorArtifact: query = props["values"]["query"] try: - return ListArtifact([TextArtifact(str(result)) for result in self._search_google(query)]) + return ListArtifact([TextArtifact(json.dumps(result)) for result in self._search_google(query)]) except Exception as e: return ErrorArtifact(f"error searching Google: {e}") diff --git a/tests/unit/tools/test_web_search.py b/tests/unit/tools/test_web_search.py index faa1056b7..c9a79b452 100644 --- a/tests/unit/tools/test_web_search.py +++ b/tests/unit/tools/test_web_search.py @@ -1,9 +1,34 @@ -from griptape.artifacts import BaseArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tools import WebSearch +from pytest import fixture +import json class TestWebSearch: - def test_search(self): - tool = WebSearch(google_api_key="foo", google_api_search_id="bar") + @fixture + def websearch_tool(self, mocker): + mock_response = mocker.Mock() + mock_response.status_code = 200 + mock_response.json.return_value = {"items": [{"title": "foo", "link": "bar", "snippet": "baz"}]} + mocker.patch("requests.get", return_value=mock_response) - assert isinstance(tool.search({"values": {"query": "foo bar"}}), BaseArtifact) + return WebSearch(google_api_key="foo", google_api_search_id="bar") + + @fixture + def websearch_tool_with_error(self, mocker): + mock_response = mocker.Mock() + mock_response.status_code = 500 + mocker.patch("requests.get", return_value=mock_response) + + return WebSearch(google_api_key="foo", google_api_search_id="bar") + + def test_search(self, websearch_tool): + assert isinstance(websearch_tool.search({"values": {"query": "foo bar"}}), BaseArtifact) + assert json.loads(websearch_tool.search({"values": {"query": "foo bar"}}).value[0].value) == { + "title": "foo", + "url": "bar", + "description": "baz", + } + + def test_search_with_error(self, websearch_tool_with_error): + assert isinstance(websearch_tool_with_error.search({"values": {"query": "foo bar"}}), ErrorArtifact) From 5fe8c635ab139bc2a121ae1365c041d98d2b0728 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 13 Jun 2024 17:26:54 -0700 Subject: [PATCH 101/238] Reset Tasks and set Structure args before run (#865) --- CHANGELOG.md | 2 ++ griptape/structures/agent.py | 4 ---- griptape/structures/pipeline.py | 4 ---- griptape/structures/structure.py | 8 ++++++-- griptape/structures/workflow.py | 1 - 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34ff5f73..62265868d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated `HuggingFaceHubPromptDriver` to use `transformers`'s `apply_chat_template`. - Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. - Updated `CoherePromptDriver` to use Cohere's latest SDK. +- Moved Task reset logic for all Structures to `Structure.before_run`. ### Fixed - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. @@ -64,6 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Web Loader to catch Exceptions and properly return an ErrorArtifact. - Conversation Memory entry only added if `output_task.output` is not `None` on all `Structures` - `TextArtifacts` contained in `ListArtifact` returned by `WebSearch.search` to properly formatted stringified JSON. +- Structure run args not being set immediately. ## [0.26.0] - 2024-06-04 diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 2348002b5..d0446aff0 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -47,10 +47,6 @@ def add_tasks(self, *tasks: BaseTask) -> list[BaseTask]: return super().add_tasks(*tasks) def try_run(self, *args) -> Agent: - self._execution_args = args - - self.task.reset() - self.task.execute() if self.conversation_memory and self.output is not None: diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 1d0aebd91..d5724244e 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -43,10 +43,6 @@ def insert_task(self, parent_task: BaseTask, task: BaseTask) -> BaseTask: return task def try_run(self, *args) -> Pipeline: - self._execution_args = args - - [task.reset() for task in self.tasks] - self.__run_from_task(self.input_task) if self.conversation_memory and self.output is not None: diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 0632b9328..78dd69633 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -233,7 +233,11 @@ def resolve_relationships(self) -> None: if task.id not in child.parent_ids: child.parent_ids.append(task.id) - def before_run(self) -> None: + def before_run(self, args: Any) -> None: + self._execution_args = args + + [task.reset() for task in self.tasks] + self.publish_event( StartStructureRunEvent( structure_id=self.id, input_task_input=self.input_task.input, input_task_output=self.input_task.output @@ -256,7 +260,7 @@ def after_run(self) -> None: def add_task(self, task: BaseTask) -> BaseTask: ... def run(self, *args) -> Structure: - self.before_run() + self.before_run(args) result = self.try_run(*args) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 7073fa43b..f9570edc0 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -91,7 +91,6 @@ def insert_task( return task def try_run(self, *args) -> Workflow: - self._execution_args = args exit_loop = False while not self.is_finished() and not exit_loop: From 76f55940adce5a03ac9511bacaca1a1298b06006 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 14 Jun 2024 18:08:05 -0500 Subject: [PATCH 102/238] Split `PromptSummaryEngine` prompt stack template (#866) --- CHANGELOG.md | 4 +++ .../engines/summary/prompt_summary_engine.py | 32 +++++++++++++------ .../engines/summary/prompt_summary.j2 | 27 ---------------- griptape/templates/engines/summary/system.j2 | 14 ++++++++ griptape/templates/engines/summary/user.j2 | 5 +++ griptape/templates/tasks/tool_task/system.j2 | 3 +- .../summary/test_prompt_summary_engine.py | 18 +++++++++++ 7 files changed, 65 insertions(+), 38 deletions(-) delete mode 100644 griptape/templates/engines/summary/prompt_summary.j2 create mode 100644 griptape/templates/engines/summary/system.j2 create mode 100644 griptape/templates/engines/summary/user.j2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 62265868d..d7b4e4480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Removed `SagemakerHuggingfaceEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. - **BREAKING**: Removed `SagemakerTensorflowHubEmbeddingModelDriver`, use `AmazonSageMakerJumpstartEmbeddingDriver` instead. - **BREAKING**: `AmazonSageMakerJumpstartPromptDriver.model` parameter, which gets passed to `SageMakerRuntime.Client.invoke_endpoint` as `EndpointName`, is now renamed to `AmazonSageMakerPromptDriver.endpoint`. +- **BREAKING**: Removed parameter `template_generator` on `PromptSummaryEngine` and added parameters `system_template_generator` and `user_template_generator`. +- **BREAKING**: Removed template `engines/summary/prompt_summary.j2` and added templates `engines/summary/system.j2` and `engines/summary/user.j2`. - `ToolkitTask.RESPONSE_STOP_SEQUENCE` is now only added when using `ToolkitTask`. - Updated Prompt Drivers to use `BasePromptDriver.max_tokens` instead of using `BasePromptDriver.max_output_tokens()`. - Improved error message when `GriptapeCloudKnowledgeBaseClient` does not have a description set. @@ -55,6 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated `HuggingFacePipelinePromptDriver` to use chat features of `transformers.TextGenerationPipeline`. - Updated `CoherePromptDriver` to use Cohere's latest SDK. - Moved Task reset logic for all Structures to `Structure.before_run`. +- Updated default prompt templates for `PromptSummaryEngine`. +- Updated template `templates/tasks/tool_task/system.j2`. ### Fixed - `Workflow.insert_task()` no longer inserts duplicate tasks when given multiple parent tasks. diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 0da99cb0a..9d3e8db78 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -13,7 +13,8 @@ class PromptSummaryEngine(BaseSummaryEngine): chunk_joiner: str = field(default="\n\n", kw_only=True) max_token_multiplier: float = field(default=0.5, kw_only=True) - template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/prompt_summary.j2")), kw_only=True) + system_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/system.j2")), kw_only=True) + user_template_generator: J2 = field(default=Factory(lambda: J2("engines/summary/user.j2")), kw_only=True) prompt_driver: BasePromptDriver = field(kw_only=True) chunker: BaseChunker = field( default=Factory( @@ -49,25 +50,38 @@ def summarize_artifacts_rec( ) -> TextArtifact: artifacts_text = self.chunk_joiner.join([a.to_text() for a in artifacts]) - full_text = self.template_generator.render( - summary=summary, text=artifacts_text, rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets) + system_prompt = self.system_template_generator.render( + summary=summary, rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets) ) - if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: + user_prompt = self.user_template_generator.render(text=artifacts_text) + + if ( + self.prompt_driver.tokenizer.count_input_tokens_left(user_prompt + system_prompt) + >= self.min_response_tokens + ): return self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(full_text, role=PromptStack.USER_ROLE)]) + PromptStack( + inputs=[ + PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(user_prompt, role=PromptStack.USER_ROLE), + ] + ) ) else: chunks = self.chunker.chunk(artifacts_text) - partial_text = self.template_generator.render( - summary=summary, text=chunks[0].value, rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets) - ) + partial_text = self.user_template_generator.render(text=chunks[0].value) return self.summarize_artifacts_rec( chunks[1:], self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(partial_text, role=PromptStack.USER_ROLE)]) + PromptStack( + inputs=[ + PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(partial_text, role=PromptStack.USER_ROLE), + ] + ) ).value, rulesets=rulesets, ) diff --git a/griptape/templates/engines/summary/prompt_summary.j2 b/griptape/templates/engines/summary/prompt_summary.j2 deleted file mode 100644 index 717810de6..000000000 --- a/griptape/templates/engines/summary/prompt_summary.j2 +++ /dev/null @@ -1,27 +0,0 @@ -{% if summary %} -Current text summary: """ -{{ summary }} -""" - -Rewrite the current text summary to include the following additional text: """ -{{ text }} -""" -{% if rulesets %} - -{{ rulesets }} -{% endif %} - -Rewritten summary: -{% else %} - -Summarize the following text: """ -{{ text }} -""" - -{% if rulesets %} - -{{ rulesets }} -{% endif %} - -Summary: -{% endif %} diff --git a/griptape/templates/engines/summary/system.j2 b/griptape/templates/engines/summary/system.j2 new file mode 100644 index 000000000..b5e132aa0 --- /dev/null +++ b/griptape/templates/engines/summary/system.j2 @@ -0,0 +1,14 @@ +You are an expert in text summarization. +{% if rulesets %} + +{{ rulesets }} + +{% endif %} + +{% if summary %} +Use the current text summary to help summarize the additional text. +Current text summary: """ +{{ summary }} +""" + +{% endif %} diff --git a/griptape/templates/engines/summary/user.j2 b/griptape/templates/engines/summary/user.j2 new file mode 100644 index 000000000..d6a40e412 --- /dev/null +++ b/griptape/templates/engines/summary/user.j2 @@ -0,0 +1,5 @@ +Summarize the following text: """ +{{ text }} +""" + +Summary: diff --git a/griptape/templates/tasks/tool_task/system.j2 b/griptape/templates/tasks/tool_task/system.j2 index eaf858037..7a802d989 100644 --- a/griptape/templates/tasks/tool_task/system.j2 +++ b/griptape/templates/tasks/tool_task/system.j2 @@ -1,5 +1,4 @@ -When appropriate, respond to requests by using the following Action Schema. Your response should be a plain JSON object that successfully validates against the schema. The schema is provided below. If you can't use the Action Schema, say "I don't know how to respond." - +You must respond to requests by using the following Action Schema. Your response should be a plain JSON object that successfully validates against the schema. The schema is provided below. If you can't use the Action Schema, say "I don't know how to respond." Action Schema: {{ action_schema }} {% if meta_memory %} diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index 52179bdfb..cc4b94000 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -2,6 +2,7 @@ from griptape.artifacts import TextArtifact, ListArtifact from griptape.engines import PromptSummaryEngine from tests.mocks.mock_prompt_driver import MockPromptDriver +import os class TestPromptSummaryEngine: @@ -16,3 +17,20 @@ def test_summarize_artifacts(self, engine): assert ( engine.summarize_artifacts(ListArtifact([TextArtifact("foo"), TextArtifact("bar")])).value == "mock output" ) + + def test_max_token_multiplier_invalid(self, engine): + with pytest.raises(ValueError): + PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=0) + + with pytest.raises(ValueError): + PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=10000) + + def test_chunked_summary(self, engine): + engine = PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=0.03) + + def copy_test_resource(resource_path: str): + file_dir = os.path.dirname(__file__) + full_path = os.path.join(file_dir, "../../../resources", resource_path) + full_path = os.path.normpath(full_path) + + assert engine.summarize_text(copy_test_resource("test.txt")) From f2342e603e425d92323fc22a1ee2c13661b01394 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Mon, 17 Jun 2024 09:32:45 -0700 Subject: [PATCH 103/238] Small improvements to Audio tasks/tools (#843) --- CHANGELOG.md | 1 + griptape/tasks/audio_transcription_task.py | 23 +---------- griptape/tasks/base_audio_generation_task.py | 11 +++++- griptape/tasks/base_audio_input_task.py | 38 +++++++++++++++++++ griptape/tools/__init__.py | 4 ++ tests/mocks/mock_audio_input_task.py | 9 +++++ .../tasks/test_audio_transcription_task.py | 19 +++++++++- .../unit/tasks/test_base_audio_input_task.py | 26 +++++++++++++ tests/unit/tasks/test_text_to_speech_task.py | 21 +++++++++- 9 files changed, 126 insertions(+), 26 deletions(-) create mode 100644 griptape/tasks/base_audio_input_task.py create mode 100644 tests/mocks/mock_audio_input_task.py create mode 100644 tests/unit/tasks/test_base_audio_input_task.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d7b4e4480..6c0fefc61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Conversation Memory entry only added if `output_task.output` is not `None` on all `Structures` - `TextArtifacts` contained in `ListArtifact` returned by `WebSearch.search` to properly formatted stringified JSON. - Structure run args not being set immediately. +- Input and output logging in BaseAudioInputTasks and BaseAudioGenerationTasks ## [0.26.0] - 2024-06-04 diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py index c75faa0d4..57dbf6782 100644 --- a/griptape/tasks/audio_transcription_task.py +++ b/griptape/tasks/audio_transcription_task.py @@ -1,37 +1,18 @@ from __future__ import annotations -from abc import ABC -from typing import Callable - from attrs import define, field -from griptape.artifacts.audio_artifact import AudioArtifact from griptape.engines import AudioTranscriptionEngine from griptape.artifacts import TextArtifact -from griptape.mixins import RuleMixin -from griptape.tasks import BaseTask +from griptape.tasks.base_audio_input_task import BaseAudioInputTask @define -class AudioTranscriptionTask(RuleMixin, BaseTask, ABC): - _input: AudioArtifact | Callable[[BaseTask], AudioArtifact] = field() +class AudioTranscriptionTask(BaseAudioInputTask): _audio_transcription_engine: AudioTranscriptionEngine = field( default=None, kw_only=True, alias="audio_transcription_engine" ) - @property - def input(self) -> AudioArtifact: - if isinstance(self._input, AudioArtifact): - return self._input - elif isinstance(self._input, Callable): - return self._input(self) - else: - raise ValueError("Input must be an AudioArtifact.") - - @input.setter - def input(self, value: AudioArtifact | Callable[[BaseTask], AudioArtifact]) -> None: - self._input = value - @property def audio_transcription_engine(self) -> AudioTranscriptionEngine: if self._audio_transcription_engine is None: diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index d401af0a5..71c2fbdf4 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -9,4 +9,13 @@ @define -class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): ... +class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): + def before_run(self) -> None: + super().before_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + + def after_run(self) -> None: + super().after_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") diff --git a/griptape/tasks/base_audio_input_task.py b/griptape/tasks/base_audio_input_task.py new file mode 100644 index 000000000..0991a6014 --- /dev/null +++ b/griptape/tasks/base_audio_input_task.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from abc import ABC +from typing import Callable + +from attrs import define, field + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.mixins import RuleMixin +from griptape.tasks import BaseTask + + +@define +class BaseAudioInputTask(RuleMixin, BaseTask, ABC): + _input: AudioArtifact | Callable[[BaseTask], AudioArtifact] = field(alias="input") + + @property + def input(self) -> AudioArtifact: + if isinstance(self._input, AudioArtifact): + return self._input + elif isinstance(self._input, Callable): + return self._input(self) + else: + raise ValueError("Input must be an AudioArtifact.") + + @input.setter + def input(self, value: AudioArtifact | Callable[[BaseTask], AudioArtifact]) -> None: + self._input = value + + def before_run(self) -> None: + super().before_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") + + def after_run(self) -> None: + super().after_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 0c9b6e01d..1c152c95a 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -26,6 +26,8 @@ from .griptape_cloud_knowledge_base_client.tool import GriptapeCloudKnowledgeBaseClient from .structure_run_client.tool import StructureRunClient from .image_query_client.tool import ImageQueryClient +from .text_to_speech_client.tool import TextToSpeechClient +from .audio_transcription_client.tool import AudioTranscriptionClient __all__ = [ "BaseTool", @@ -56,4 +58,6 @@ "GriptapeCloudKnowledgeBaseClient", "StructureRunClient", "ImageQueryClient", + "TextToSpeechClient", + "AudioTranscriptionClient", ] diff --git a/tests/mocks/mock_audio_input_task.py b/tests/mocks/mock_audio_input_task.py new file mode 100644 index 000000000..d6a27d968 --- /dev/null +++ b/tests/mocks/mock_audio_input_task.py @@ -0,0 +1,9 @@ +from attrs import define +from griptape.artifacts import TextArtifact +from griptape.tasks.base_audio_input_task import BaseAudioInputTask + + +@define +class MockAudioInputTask(BaseAudioInputTask): + def run(self) -> TextArtifact: + return TextArtifact(self.input.to_text()) diff --git a/tests/unit/tasks/test_audio_transcription_task.py b/tests/unit/tasks/test_audio_transcription_task.py index fdab5f730..3a53fd49d 100644 --- a/tests/unit/tasks/test_audio_transcription_task.py +++ b/tests/unit/tasks/test_audio_transcription_task.py @@ -2,10 +2,11 @@ import pytest -from griptape.artifacts import AudioArtifact +from griptape.artifacts import AudioArtifact, TextArtifact from griptape.engines import AudioTranscriptionEngine -from griptape.structures import Agent +from griptape.structures import Agent, Pipeline from griptape.tasks import BaseTask, AudioTranscriptionTask +from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_structure_config import MockStructureConfig @@ -36,3 +37,17 @@ def test_config_audio_transcription_engine(self, audio_artifact): Agent(config=MockStructureConfig()).add_task(task) assert isinstance(task.audio_transcription_engine, AudioTranscriptionEngine) + + def test_run(self, audio_artifact, audio_transcription_engine): + audio_transcription_engine.run.return_value = TextArtifact("mock transcription") + logger = Mock() + + task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) + pipeline = Pipeline(prompt_driver=MockPromptDriver(), logger=logger) + pipeline.add_task(task) + + assert pipeline.run().output.to_text() == "mock transcription" + + def test_before_run(self, audio_artifact, audio_transcription_engine): + task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) + task diff --git a/tests/unit/tasks/test_base_audio_input_task.py b/tests/unit/tasks/test_base_audio_input_task.py new file mode 100644 index 000000000..e11074880 --- /dev/null +++ b/tests/unit/tasks/test_base_audio_input_task.py @@ -0,0 +1,26 @@ +import pytest + +from tests.mocks.mock_audio_input_task import MockAudioInputTask +from griptape.artifacts import AudioArtifact, TextArtifact +from tests.mocks.mock_text_input_task import MockTextInputTask + + +class TestBaseAudioInputTask: + @pytest.fixture + def audio_artifact(self): + return AudioArtifact(b"audio content", format="mp3") + + def test_audio_artifact_input(self, audio_artifact): + task = MockAudioInputTask(audio_artifact) + assert task.input.value == audio_artifact.value + + audio_artifact.value = b"new audio content" + task.input = audio_artifact + assert task.input.value == audio_artifact.value + + def test_callable_input(self, audio_artifact): + assert MockTextInputTask(lambda _: audio_artifact).input.value == audio_artifact.value + + def test_bad_input(self): + with pytest.raises(ValueError): + assert MockAudioInputTask(TextArtifact("foobar")).input.value == "foobar" diff --git a/tests/unit/tasks/test_text_to_speech_task.py b/tests/unit/tasks/test_text_to_speech_task.py index f30893e8a..7a8e49364 100644 --- a/tests/unit/tasks/test_text_to_speech_task.py +++ b/tests/unit/tasks/test_text_to_speech_task.py @@ -1,9 +1,10 @@ from unittest.mock import Mock -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, AudioArtifact from griptape.engines import TextToSpeechEngine -from griptape.structures import Agent +from griptape.structures import Agent, Pipeline from griptape.tasks import BaseTask, TextToSpeechTask +from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_structure_config import MockStructureConfig @@ -28,3 +29,19 @@ def test_config_text_to_speech_engine(self): Agent(config=MockStructureConfig()).add_task(task) assert isinstance(task.text_to_speech_engine, TextToSpeechEngine) + + def test_calls(self): + text_to_speech_engine = Mock() + text_to_speech_engine.run.return_value = AudioArtifact(b"audio content", format="mp3") + + assert TextToSpeechTask("test", text_to_speech_engine=text_to_speech_engine).run().value == b"audio content" + + def test_run(self): + text_to_speech_engine = Mock() + text_to_speech_engine.run.return_value = AudioArtifact(b"audio content", format="mp3") + + task = TextToSpeechTask("some text", text_to_speech_engine=text_to_speech_engine) + pipeline = Pipeline(prompt_driver=MockPromptDriver()) + pipeline.add_task(task) + + assert isinstance(pipeline.run().output, AudioArtifact) From 53ca5b104c935f2725eab8b9c4313c8d1d463751 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 17 Jun 2024 20:50:15 -0500 Subject: [PATCH 104/238] Validate `max_tokens`, fix tests (#868) --- CHANGELOG.md | 1 + griptape/chunkers/base_chunker.py | 5 +++++ tests/mocks/mock_prompt_driver.py | 10 +++++++--- tests/unit/chunkers/test_text_chunker.py | 4 ++++ .../structure_run/test_local_structure_run_driver.py | 2 +- .../unit/engines/summary/test_prompt_summary_engine.py | 10 ++++++++-- .../unit/memory/structure/test_conversation_memory.py | 2 +- 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c0fefc61..b75df462e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -102,6 +102,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Extra fields being excluded when using `SerializableMixin.from_dict`. +- Validation of `max_tokens` < 0 on `BaseChunker` ## [0.25.1] - 2024-05-15 diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index f2cc452ad..793bf24ad 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -21,6 +21,11 @@ class BaseChunker(ABC): default=Factory(lambda self: self.tokenizer.max_input_tokens, takes_self=True), kw_only=True ) + @max_tokens.validator # pyright: ignore + def validate_max_tokens(self, _, max_tokens: int) -> None: + if max_tokens < 0: + raise ValueError("max_tokens must be 0 or greater.") + def chunk(self, text: TextArtifact | str) -> list[TextArtifact]: text = text.value if isinstance(text, TextArtifact) else text diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index 43d9a365f..3235f7cd5 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -14,10 +14,14 @@ class MockPromptDriver(BasePromptDriver): model: str = "test-model" tokenizer: BaseTokenizer = MockTokenizer(model="test-model", max_input_tokens=4096, max_output_tokens=4096) mock_input: str | Callable[[], str] = field(default="mock input", kw_only=True) - mock_output: str | Callable[[], str] = field(default="mock output", kw_only=True) + mock_output: str | Callable[[PromptStack], str] = field(default="mock output", kw_only=True) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - return TextArtifact(value=self.mock_output() if isinstance(self.mock_output, Callable) else self.mock_output) + return TextArtifact( + value=self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output + ) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - yield TextArtifact(value=self.mock_output() if isinstance(self.mock_output, Callable) else self.mock_output) + yield TextArtifact( + value=self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output + ) diff --git a/tests/unit/chunkers/test_text_chunker.py b/tests/unit/chunkers/test_text_chunker.py index c1fb40137..243b287e1 100644 --- a/tests/unit/chunkers/test_text_chunker.py +++ b/tests/unit/chunkers/test_text_chunker.py @@ -106,3 +106,7 @@ def test_separators(self, chunker): assert chunks[5].value.endswith("? foo-12?") assert chunks[6].value.endswith(" foo-5") assert chunks[7].value.endswith(" foo-16") + + def test_chunk_with_max_tokens(self, chunker): + with pytest.raises(ValueError): + TextChunker(max_tokens=-1) diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index 921a4b013..cb7b3058e 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -22,7 +22,7 @@ def test_run(self): def test_run_with_env(self): pipeline = Pipeline() - agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda: os.environ["key"])) + agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda _: os.environ["key"])) driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"key": "value"}) task = StructureRunTask(driver=driver) diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index cc4b94000..59b36f48e 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -1,6 +1,7 @@ import pytest from griptape.artifacts import TextArtifact, ListArtifact from griptape.engines import PromptSummaryEngine +from griptape.utils import PromptStack from tests.mocks.mock_prompt_driver import MockPromptDriver import os @@ -26,11 +27,16 @@ def test_max_token_multiplier_invalid(self, engine): PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=10000) def test_chunked_summary(self, engine): - engine = PromptSummaryEngine(prompt_driver=MockPromptDriver(), max_token_multiplier=0.03) + def smaller_input(prompt_stack: PromptStack): + return prompt_stack.inputs[0].content[: (len(prompt_stack.inputs[0].content) // 2)] + + engine = PromptSummaryEngine(prompt_driver=MockPromptDriver(mock_output="smaller_input")) def copy_test_resource(resource_path: str): file_dir = os.path.dirname(__file__) full_path = os.path.join(file_dir, "../../../resources", resource_path) full_path = os.path.normpath(full_path) + with open(full_path) as f: + return f.read() - assert engine.summarize_text(copy_test_resource("test.txt")) + assert engine.summarize_text(copy_test_resource("test.txt") * 50) diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index c6eba3df3..298e5ac3f 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -93,7 +93,7 @@ def test_add_to_prompt_stack_autopruing_disabled(self): assert len(prompt_stack.inputs) == 12 - def test_add_to_prompt_stack_autopruing_enabled(self): + def test_add_to_prompt_stack_autopruning_enabled(self): # All memory is pruned. agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=0))) memory = ConversationMemory( From 6ceadf6446e33ae3a7769f41afd22b23fba977cf Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 18 Jun 2024 11:38:16 -0500 Subject: [PATCH 105/238] Add 'self.order_tasks()' before getting 'output_task' (#873) --- griptape/structures/workflow.py | 6 +++++- tests/unit/structures/test_workflow.py | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index f9570edc0..6552fba89 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -1,7 +1,7 @@ from __future__ import annotations import concurrent.futures as futures from graphlib import TopologicalSorter -from typing import Any +from typing import Any, Optional from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact from griptape.structures import Structure @@ -13,6 +13,10 @@ class Workflow(Structure): futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + @property + def output_task(self) -> Optional[BaseTask]: + return self.order_tasks()[-1] if self.tasks else None + def add_task(self, task: BaseTask) -> BaseTask: task.preprocess(self) diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 14661036d..bbcf5138e 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -637,6 +637,15 @@ def test_output_task(self): assert task4 == workflow.output_task + task4.add_parents([task2, task3]) + task1.add_children([task2, task3]) + + # task4 is the final task, but its defined at index 0 + workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task4, task1, task2, task3]) + + # ouput_task topologically should be task4 + assert task4 == workflow.output_task + def test_to_graph(self): task1 = PromptTask("prompt1", id="task1") task2 = PromptTask("prompt2", id="task2") From 3a203eda77b4cea1f2c7b672b637f40f2ffdcde6 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 18 Jun 2024 12:12:16 -0700 Subject: [PATCH 106/238] Feature/ollama (#847) --- CHANGELOG.md | 1 + .../drivers/prompt-drivers.md | 23 +++++ griptape/drivers/__init__.py | 2 + .../drivers/prompt/ollama_prompt_driver.py | 69 +++++++++++++ griptape/tokenizers/base_tokenizer.py | 9 +- griptape/tokenizers/simple_tokenizer.py | 3 +- poetry.lock | 19 +++- pyproject.toml | 3 + .../prompt/test_ollama_prompt_driver.py | 96 +++++++++++++++++++ .../unit/tokenizers/test_simple_tokenizer.py | 2 +- 10 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 griptape/drivers/prompt/ollama_prompt_driver.py create mode 100644 tests/unit/drivers/prompt/test_ollama_prompt_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b75df462e..4f2aef205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `BaseTask.parents_outputs` to get the textual output of all parent tasks. - `BaseTask.parents_output_text` to get a concatenated string of all parent tasks' outputs. - `parents_output_text` to Workflow context. +- `OllamaPromptModelDriver` for using models with Ollama. ### Changed - **BREAKING**: `Workflow` no longer modifies task relationships when adding tasks via `tasks` init param, `add_tasks()` or `add_task()`. Previously, adding a task would automatically add the previously added task as its parent. Existing code that relies on this behavior will need to be updated to explicitly add parent/child relationships using the API offered by `BaseTask`. diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index c765030d8..0100ccbac 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -241,6 +241,29 @@ agent.run( ) ``` +### Ollama + +!!! info + This driver requires the `drivers-prompt-ollama` [extra](../index.md#extras). + +The [OllamaPromptDriver](../../reference/griptape/drivers/prompt/ollama_prompt_driver.md) connects to the [Ollama Chat Completion API](https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion). + +```python +from griptape.config import StructureConfig +from griptape.drivers import OllamaPromptDriver +from griptape.structures import Agent + + +agent = Agent( + config=StructureConfig( + prompt_driver=OllamaPromptDriver( + model="llama3", + ), + ), +) +agent.run("What color is the sky at different times of the day?") +``` + ### Hugging Face Hub !!! info diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 44a2941c9..8e8128d7a 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -9,6 +9,7 @@ from .prompt.amazon_bedrock_prompt_driver import AmazonBedrockPromptDriver from .prompt.google_prompt_driver import GooglePromptDriver from .prompt.dummy_prompt_driver import DummyPromptDriver +from .prompt.ollama_prompt_driver import OllamaPromptDriver from .memory.conversation.base_conversation_memory_driver import BaseConversationMemoryDriver from .memory.conversation.local_conversation_memory_driver import LocalConversationMemoryDriver @@ -109,6 +110,7 @@ "AmazonBedrockPromptDriver", "GooglePromptDriver", "DummyPromptDriver", + "OllamaPromptDriver", "BaseConversationMemoryDriver", "LocalConversationMemoryDriver", "AmazonDynamoDbConversationMemoryDriver", diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py new file mode 100644 index 000000000..b21176e82 --- /dev/null +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -0,0 +1,69 @@ +from __future__ import annotations +from collections.abc import Iterator +from typing import TYPE_CHECKING, Optional +from attrs import define, field, Factory +from griptape.artifacts import TextArtifact +from griptape.drivers import BasePromptDriver +from griptape.tokenizers.base_tokenizer import BaseTokenizer +from griptape.utils import PromptStack, import_optional_dependency +from griptape.tokenizers import SimpleTokenizer + +if TYPE_CHECKING: + from ollama import Client + + +@define +class OllamaPromptDriver(BasePromptDriver): + """ + Attributes: + model: Model name. + """ + + model: str = field(kw_only=True, metadata={"serializable": True}) + host: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + client: Client = field( + default=Factory(lambda self: import_optional_dependency("ollama").Client(host=self.host), takes_self=True), + kw_only=True, + ) + tokenizer: BaseTokenizer = field( + default=Factory( + lambda self: SimpleTokenizer( + characters_per_token=4, max_input_tokens=2000, max_output_tokens=self.max_tokens + ), + takes_self=True, + ), + kw_only=True, + ) + options: dict = field( + default=Factory( + lambda self: { + "temperature": self.temperature, + "stop": self.tokenizer.stop_sequences, + "num_predict": self.max_tokens, + }, + takes_self=True, + ), + kw_only=True, + ) + + def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + response = self.client.chat(**self._base_params(prompt_stack)) + + if isinstance(response, dict): + return TextArtifact(value=response["message"]["content"]) + else: + raise Exception("invalid model response") + + def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + stream = self.client.chat(**self._base_params(prompt_stack), stream=True) + + if isinstance(stream, Iterator): + for chunk in stream: + yield TextArtifact(value=chunk["message"]["content"]) + else: + raise Exception("invalid model response") + + def _base_params(self, prompt_stack: PromptStack) -> dict: + messages = [{"role": input.role, "content": input.content} for input in prompt_stack.inputs] + + return {"messages": messages, "model": self.model, "options": self.options} diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index b7ae2a854..474ccbaa5 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -17,11 +17,12 @@ class BaseTokenizer(ABC): max_output_tokens: int = field(kw_only=True, default=None) def __attrs_post_init__(self) -> None: - if self.max_input_tokens is None: - self.max_input_tokens = self._default_max_input_tokens() + if hasattr(self, "model"): + if self.max_input_tokens is None: + self.max_input_tokens = self._default_max_input_tokens() - if self.max_output_tokens is None: - self.max_output_tokens = self._default_max_output_tokens() + if self.max_output_tokens is None: + self.max_output_tokens = self._default_max_output_tokens() def count_input_tokens_left(self, text: str) -> int: diff = self.max_input_tokens - self.count_tokens(text) diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index d1ddc8e2b..b4e125680 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -1,12 +1,11 @@ from __future__ import annotations from attrs import define, field -from typing import Optional from griptape.tokenizers import BaseTokenizer @define() class SimpleTokenizer(BaseTokenizer): - model: Optional[str] = field(default=None, kw_only=True) + model: str = field(init=False, kw_only=True) characters_per_token: int = field(kw_only=True) def count_tokens(self, text: str) -> int: diff --git a/poetry.lock b/poetry.lock index ed65bc07f..b94c05b2a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3235,6 +3235,20 @@ files = [ {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, ] +[[package]] +name = "ollama" +version = "0.2.1" +description = "The official Python client for Ollama." +optional = true +python-versions = "<4.0,>=3.8" +files = [ + {file = "ollama-0.2.1-py3-none-any.whl", hash = "sha256:b6e2414921c94f573a903d1069d682ba2fb2607070ea9e19ca4a7872f2a460ec"}, + {file = "ollama-0.2.1.tar.gz", hash = "sha256:fa316baa9a81eac3beb4affb0a17deb3008fdd6ed05b123c26306cfbe4c349b6"}, +] + +[package.dependencies] +httpx = ">=0.27.0,<0.28.0" + [[package]] name = "openai" version = "1.30.1" @@ -6056,7 +6070,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6075,6 +6089,7 @@ drivers-prompt-cohere = ["cohere"] drivers-prompt-google = ["google-generativeai"] drivers-prompt-huggingface = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["huggingface-hub", "torch", "transformers"] +drivers-prompt-ollama = ["ollama"] drivers-sql-postgres = ["pgvector", "psycopg2-binary"] drivers-sql-redshift = ["boto3", "sqlalchemy-redshift"] drivers-sql-snowflake = ["snowflake-sqlalchemy"] @@ -6096,4 +6111,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "74de0d1e5ee382332635cea14dc0d39e288ab65adfec91569da0dbb06fd316e2" +content-hash = "6ccbbba60b534e4756d1c36e37ce1379ee2126d37b822f186b5dbb8e8f701ff3" diff --git a/pyproject.toml b/pyproject.toml index d58432b8f..418098522 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} torch = {version = "^2.3.0", optional = true} pusher = {version = "^3.3.2", optional = true} +ollama = {version = "^0.2.1", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -69,6 +70,7 @@ drivers-prompt-huggingface-pipeline = ["huggingface-hub", "transformers", "torch drivers-prompt-amazon-bedrock = ["boto3", "anthropic"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-google = ["google-generativeai"] +drivers-prompt-ollama = ["ollama"] drivers-sql-redshift = ["sqlalchemy-redshift", "boto3"] drivers-sql-snowflake = ["snowflake-sqlalchemy", "snowflake", "snowflake-connector-python"] @@ -131,6 +133,7 @@ all = [ "elevenlabs", "torch", "pusher", + "ollama", # loaders "pandas", diff --git a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py new file mode 100644 index 000000000..d42a8b45d --- /dev/null +++ b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py @@ -0,0 +1,96 @@ +from griptape.drivers import OllamaPromptDriver +from griptape.utils import PromptStack +import pytest + + +class TestOllamaPromptDriver: + @pytest.fixture + def mock_client(self, mocker): + mock_client = mocker.patch("ollama.Client") + + mock_client.return_value.chat.return_value = {"message": {"content": "model-output"}} + + return mock_client + + @pytest.fixture + def mock_stream_client(self, mocker): + mock_stream_client = mocker.patch("ollama.Client") + mock_stream_client.return_value.chat.return_value = iter([{"message": {"content": "model-output"}}]) + + return mock_stream_client + + def test_init(self): + assert OllamaPromptDriver(model="llama") + + def test_try_run(self, mock_client): + # Given + prompt_stack = PromptStack() + prompt_stack.add_generic_input("generic-input") + prompt_stack.add_system_input("system-input") + prompt_stack.add_user_input("user-input") + prompt_stack.add_assistant_input("assistant-input") + driver = OllamaPromptDriver(model="llama") + expected_messages = [ + {"role": "generic", "content": "generic-input"}, + {"role": "system", "content": "system-input"}, + {"role": "user", "content": "user-input"}, + {"role": "assistant", "content": "assistant-input"}, + ] + + # When + text_artifact = driver.try_run(prompt_stack) + + # Then + mock_client.return_value.chat.assert_called_once_with( + messages=expected_messages, + model=driver.model, + options={"temperature": driver.temperature, "stop": [], "num_predict": driver.max_tokens}, + ) + assert text_artifact.value == "model-output" + + def test_try_run_bad_response(self, mock_client): + # Given + prompt_stack = PromptStack() + driver = OllamaPromptDriver(model="llama") + mock_client.return_value.chat.return_value = "bad-response" + + # When/Then + with pytest.raises(Exception, match="invalid model response"): + driver.try_run(prompt_stack) + + def test_try_stream_run(self, mock_stream_client): + # Given + prompt_stack = PromptStack() + prompt_stack.add_generic_input("generic-input") + prompt_stack.add_system_input("system-input") + prompt_stack.add_user_input("user-input") + prompt_stack.add_assistant_input("assistant-input") + expected_messages = [ + {"role": "generic", "content": "generic-input"}, + {"role": "system", "content": "system-input"}, + {"role": "user", "content": "user-input"}, + {"role": "assistant", "content": "assistant-input"}, + ] + driver = OllamaPromptDriver(model="llama", stream=True) + + # When + text_artifact = next(driver.try_stream(prompt_stack)) + + # Then + mock_stream_client.return_value.chat.assert_called_once_with( + messages=expected_messages, + model=driver.model, + options={"temperature": driver.temperature, "stop": [], "num_predict": driver.max_tokens}, + stream=True, + ) + assert text_artifact.value == "model-output" + + def test_try_stream_bad_response(self, mock_stream_client): + # Given + prompt_stack = PromptStack() + driver = OllamaPromptDriver(model="llama", stream=True) + mock_stream_client.return_value.chat.return_value = "bad-response" + + # When/Then + with pytest.raises(Exception, match="invalid model response"): + next(driver.try_stream(prompt_stack)) diff --git a/tests/unit/tokenizers/test_simple_tokenizer.py b/tests/unit/tokenizers/test_simple_tokenizer.py index 48fa1bdfb..a34c0d481 100644 --- a/tests/unit/tokenizers/test_simple_tokenizer.py +++ b/tests/unit/tokenizers/test_simple_tokenizer.py @@ -5,7 +5,7 @@ class TestSimpleTokenizer: @pytest.fixture def tokenizer(self): - return SimpleTokenizer(model="any model", max_input_tokens=1024, max_output_tokens=4096, characters_per_token=6) + return SimpleTokenizer(max_input_tokens=1024, max_output_tokens=4096, characters_per_token=6) def test_token_count(self, tokenizer): assert tokenizer.count_tokens("foo bar huzzah") == 3 From 0f196f5b47e8bb8308b4d7feba7a44f6c78d6db4 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:48:02 -0700 Subject: [PATCH 107/238] Add insert_tasks example (#877) --- .../structures/workflows.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/griptape-framework/structures/workflows.md b/docs/griptape-framework/structures/workflows.md index 02ef8d148..0d31b6f9e 100644 --- a/docs/griptape-framework/structures/workflows.md +++ b/docs/griptape-framework/structures/workflows.md @@ -299,3 +299,60 @@ workflow = Workflow( workflow.run() ``` + +### Insert Parallel Tasks + +`Workflow.insert_tasks()` provides a convenient way to insert parallel tasks between parents and children. + +!!! info + By default, all children are removed from the parent task and all parent tasks are removed from the child task. If you want to keep these parent-child relationships, then set the `preserve_relationship` parameter to `True`. + +Imperatively insert parallel tasks between a parent and child: + +```python +from griptape.tasks import PromptTask +from griptape.structures import Workflow +from griptape.rules import Rule + +workflow = Workflow( + rules=[Rule("output a single lowercase word")], +) + +animal_task = PromptTask("Name an animal", id="animal") +adjective_task = PromptTask("Describe {{ parent_outputs['animal'] }} with an adjective", id="adjective") +color_task = PromptTask("Describe {{ parent_outputs['animal'] }} with a color", id="color") +new_animal_task = PromptTask("Name an animal described as: \n{{ parents_output_text }}", id="new-animal") + +# The following workflow runs animal_task, then (adjective_task, and color_task) +# in parallel, then finally new_animal_task. +# +# In other words, the output of animal_task is passed to both adjective_task and color_task +# and the outputs of adjective_task and color_task are then passed to new_animal_task. +workflow.add_task(animal_task) +workflow.add_task(new_animal_task) +workflow.insert_tasks(animal_task, [adjective_task, color_task], new_animal_task) + +workflow.run() +``` + +output: +``` +[06/18/24 09:52:21] INFO PromptTask animal + Input: Name an animal +[06/18/24 09:52:22] INFO PromptTask animal + Output: elephant + INFO PromptTask adjective + Input: Describe elephant with an adjective + INFO PromptTask color + Input: Describe elephant with a color + INFO PromptTask color + Output: gray + INFO PromptTask adjective + Output: majestic + INFO PromptTask new-animal + Input: Name an animal described as: + majestic + gray +[06/18/24 09:52:23] INFO PromptTask new-animal + Output: elephant +``` From 68d9daee4e70426e24028f868b0c82ba554b4078 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 19 Jun 2024 12:28:11 -0700 Subject: [PATCH 108/238] Don't include "v" in tag name (#879) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 61d91e6a1..b4f3d0068 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ version: ## Bump version and push to release branch. .PHONY: publish publish: ## Push git tag and publish version to PyPI. - @git tag v$$(poetry version -s) + @git tag $$(poetry version -s) @git push --tags @poetry build @poetry publish From 28a8a14a23f7e4a1d95ab8202dc2a52601531692 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Wed, 19 Jun 2024 18:18:11 -0500 Subject: [PATCH 109/238] Update `WebSearch` to use a driver; add drivers for Google and DuckDuckGo (#869) --- CHANGELOG.md | 7 + docs/examples/multi-agent-workflow.md | 8 +- .../drivers/web-search-drivers.md | 62 +++++++++ docs/griptape-framework/structures/tasks.md | 8 +- .../official-tools/web-search.md | 13 +- griptape/drivers/__init__.py | 7 + griptape/drivers/web_search/__init__.py | 0 .../web_search/base_web_search_driver.py | 14 ++ .../duck_duck_go_web_search_driver.py | 29 ++++ .../web_search/google_web_search_driver.py | 39 ++++++ griptape/tools/web_search/tool.py | 40 +----- poetry.lock | 131 +++++++++++++++++- pyproject.toml | 4 + tests/integration/tasks/test_toolkit_task.py | 6 +- tests/unit/drivers/web_search/__init__.py | 0 .../test_duck_duck_go_web_search_driver.py | 36 +++++ .../test_google_web_search_driver.py | 43 ++++++ tests/unit/tools/test_web_search.py | 36 +++-- 18 files changed, 413 insertions(+), 70 deletions(-) create mode 100644 docs/griptape-framework/drivers/web-search-drivers.md create mode 100644 griptape/drivers/web_search/__init__.py create mode 100644 griptape/drivers/web_search/base_web_search_driver.py create mode 100644 griptape/drivers/web_search/duck_duck_go_web_search_driver.py create mode 100644 griptape/drivers/web_search/google_web_search_driver.py create mode 100644 tests/unit/drivers/web_search/__init__.py create mode 100644 tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py create mode 100644 tests/unit/drivers/web_search/test_google_web_search_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index feec674b5..62846b623 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `GoogleWebSearchDriver` to web search with the Google Customsearch API. +- `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. + +### Changed +- **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. + ## [0.27.0] - 2024-06-19 ### Added diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md index d0fa65232..4a26625b3 100644 --- a/docs/examples/multi-agent-workflow.md +++ b/docs/examples/multi-agent-workflow.md @@ -7,7 +7,7 @@ Additionally, this architecture opens us up to using services such as [Griptape ```python import os -from griptape.drivers import WebhookEventListenerDriver, LocalStructureRunDriver +from griptape.drivers import WebhookEventListenerDriver, LocalStructureRunDriver, GoogleWebSearchDriver from griptape.events import EventListener, FinishStructureRunEvent from griptape.rules import Rule, Ruleset from griptape.structures import Agent, Workflow @@ -38,8 +38,10 @@ def build_researcher(): id="researcher", tools=[ WebSearch( - google_api_key=os.environ["GOOGLE_API_KEY"], - google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), ), WebScraper( off_prompt=True, diff --git a/docs/griptape-framework/drivers/web-search-drivers.md b/docs/griptape-framework/drivers/web-search-drivers.md new file mode 100644 index 000000000..332ce2c2b --- /dev/null +++ b/docs/griptape-framework/drivers/web-search-drivers.md @@ -0,0 +1,62 @@ +## Overview + +Web Search Drivers can be used to search for links from a search query. They are used by [WebSearch](../../reference/griptape/tools/web_search/tool.md) to provide its functionality. All Web Search Drivers implement the following methods: + +* `search()` searchs the web and returns a [ListArtifact](../../reference/griptape/artifacts/list_artifact.md) that contains JSON-serializable [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s with the search results. + +## Google + +The [GoogleWebSearchDriver](../../reference/griptape/drivers/web_search/google_web_search_driver.md) uses the [Google Custom Search JSON API](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list) for web searching. + +Example using `GoogleWebSearchDriver` directly: + +```python +import os +from griptape.drivers import GoogleWebSearchDriver + +driver = GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], +) + +driver.search("griptape ai") +``` + +Example of using `GoogleWebSearchDriver` with an agent: + +```python +import os +from griptape.drivers import GoogleWebSearchDriver +from griptape.tools import TaskMemoryClient, WebSearch +from griptape.structures import Agent + +agent = Agent( + tools=[ + WebSearch( + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), + ), + TaskMemoryClient(off_prompt=False), + ], +) +agent.run("Give me some websites with information about AI frameworks.") +``` + +## DuckDuckGo + +!!! info + This driver requires the `drivers-web-search-duckduckgo` [extra](../index.md#extras). + +The [DuckDuckGoWebSearchDriver](../../reference/griptape/drivers/web_search/duck_duck_go_web_search_driver.md) uses the [duckduckgo_search](https://github.com/deedy5/duckduckgo_search) SDK for web searching. + +Example of using `DuckDuckGoWebSearchDriver` directly: + +```python +from griptape.drivers import DuckDuckGoWebSearchDriver + +driver = DuckDuckGoWebSearchDriver() + +driver.search("griptape ai") +``` diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 53b1b702e..c43603b1b 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -677,7 +677,7 @@ import os from griptape.rules import Rule, Ruleset from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask -from griptape.drivers import LocalStructureRunDriver +from griptape.drivers import LocalStructureRunDriver, GoogleWebSearchDriver from griptape.tools import ( TaskMemoryClient, WebScraper, @@ -689,8 +689,10 @@ def build_researcher(): researcher = Agent( tools=[ WebSearch( - google_api_key=os.environ["GOOGLE_API_KEY"], - google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + ), ), WebScraper( off_prompt=True, diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search.md index 2e2ea276d..b30c76038 100644 --- a/docs/griptape-tools/official-tools/web-search.md +++ b/docs/griptape-tools/official-tools/web-search.md @@ -6,14 +6,17 @@ This tool enables LLMs to search the web. import os from griptape.tools import WebSearch from griptape.structures import Agent +from griptape.drivers import GoogleWebSearchDriver # Initialize the WebSearch tool with necessary parameters web_search_tool = WebSearch( - results_count=5, - google_api_lang="lang_en", - google_api_key=os.environ["GOOGLE_API_KEY"], - google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], - google_api_country="us", + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], + search_id=os.environ["GOOGLE_API_SEARCH_ID"], + results_count=5, + language="en", + country="us", + ), ) # Set up an agent using the WebSearch tool diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 8e8128d7a..3576b66bb 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -74,6 +74,10 @@ from .web_scraper.trafilatura_web_scraper_driver import TrafilaturaWebScraperDriver from .web_scraper.markdownify_web_scraper_driver import MarkdownifyWebScraperDriver +from .web_search.base_web_search_driver import BaseWebSearchDriver +from .web_search.google_web_search_driver import GoogleWebSearchDriver +from .web_search.duck_duck_go_web_search_driver import DuckDuckGoWebSearchDriver + from .event_listener.base_event_listener_driver import BaseEventListenerDriver from .event_listener.amazon_sqs_event_listener_driver import AmazonSqsEventListenerDriver from .event_listener.webhook_event_listener_driver import WebhookEventListenerDriver @@ -163,6 +167,9 @@ "BaseWebScraperDriver", "TrafilaturaWebScraperDriver", "MarkdownifyWebScraperDriver", + "BaseWebSearchDriver", + "GoogleWebSearchDriver", + "DuckDuckGoWebSearchDriver", "BaseEventListenerDriver", "AmazonSqsEventListenerDriver", "WebhookEventListenerDriver", diff --git a/griptape/drivers/web_search/__init__.py b/griptape/drivers/web_search/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/web_search/base_web_search_driver.py b/griptape/drivers/web_search/base_web_search_driver.py new file mode 100644 index 000000000..2b5662155 --- /dev/null +++ b/griptape/drivers/web_search/base_web_search_driver.py @@ -0,0 +1,14 @@ +from abc import ABC, abstractmethod +from attrs import field, define + +from griptape.artifacts import ListArtifact + + +@define +class BaseWebSearchDriver(ABC): + results_count: int = field(default=5, kw_only=True) + language: str = field(default="en", kw_only=True) + country: str = field(default="us", kw_only=True) + + @abstractmethod + def search(self, query: str, **kwargs) -> ListArtifact: ... diff --git a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py new file mode 100644 index 000000000..9b90bf5ff --- /dev/null +++ b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py @@ -0,0 +1,29 @@ +from __future__ import annotations +import json +from typing import TYPE_CHECKING +from attrs import define, field, Factory +from griptape.artifacts import TextArtifact, ListArtifact +from griptape.drivers import BaseWebSearchDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from duckduckgo_search import DDGS + + +@define +class DuckDuckGoWebSearchDriver(BaseWebSearchDriver): + client: DDGS = field(default=Factory(lambda: import_optional_dependency("duckduckgo_search").DDGS()), kw_only=True) + + def search(self, query: str, **kwargs) -> ListArtifact: + try: + results = self.client.text(query, region=f"{self.language}-{self.country}", max_results=self.results_count) + return ListArtifact( + [ + TextArtifact( + json.dumps({"title": result["title"], "url": result["href"], "description": result["body"]}) + ) + for result in results + ] + ) + except Exception as e: + raise Exception(f"Error searching '{query}' with DuckDuckGo: {e}") diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py new file mode 100644 index 000000000..631170532 --- /dev/null +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -0,0 +1,39 @@ +from attrs import define, field +from griptape.artifacts import TextArtifact, ListArtifact +from griptape.drivers import BaseWebSearchDriver +import requests +import json + + +@define +class GoogleWebSearchDriver(BaseWebSearchDriver): + api_key: str = field(default=None, kw_only=True) + search_id: str = field(default=None, kw_only=True) + + def search(self, query: str, **kwargs) -> ListArtifact: + return ListArtifact([TextArtifact(json.dumps(result)) for result in self._search_google(query, **kwargs)]) + + def _search_google(self, query: str, **kwargs) -> list[dict]: + url = ( + f"https://www.googleapis.com/customsearch/v1?" + f"key={self.api_key}&" + f"cx={self.search_id}&" + f"q={query}&" + f"start=0&" + f"lr=lang_{self.language}&" + f"num={self.results_count}&" + f"gl={self.country}" + ) + response = requests.get(url) + + if response.status_code == 200: + data = response.json() + + links = [{"url": r["link"], "title": r["title"], "description": r["snippet"]} for r in data["items"]] + + return links + else: + raise Exception( + f"Google Search API returned an error with status code " + f"{response.status_code} and reason '{response.reason}'" + ) diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index acc358342..e5dc9add7 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -1,20 +1,15 @@ from __future__ import annotations from attrs import define, field -from griptape.artifacts import TextArtifact, ErrorArtifact, ListArtifact +from griptape.artifacts import ErrorArtifact, ListArtifact from schema import Schema, Literal from griptape.tools import BaseTool from griptape.utils.decorators import activity -import requests -import json +from griptape.drivers import BaseWebSearchDriver @define class WebSearch(BaseTool): - results_count: int = field(default=5, kw_only=True) - google_api_lang: str = field(default="lang_en", kw_only=True) - google_api_key: str = field(kw_only=True) - google_api_search_id: str = field(kw_only=True) - google_api_country: str = field(default="us", kw_only=True) + web_search_driver: BaseWebSearchDriver = field(default=None, kw_only=True) @activity( config={ @@ -33,31 +28,6 @@ def search(self, props: dict) -> ListArtifact | ErrorArtifact: query = props["values"]["query"] try: - return ListArtifact([TextArtifact(json.dumps(result)) for result in self._search_google(query)]) + return self.web_search_driver.search(query) except Exception as e: - return ErrorArtifact(f"error searching Google: {e}") - - def _search_google(self, query: str) -> list[dict]: - url = ( - f"https://www.googleapis.com/customsearch/v1?" - f"key={self.google_api_key}&" - f"cx={self.google_api_search_id}&" - f"q={query}&" - f"start=0&" - f"lr={self.google_api_lang}&" - f"num={self.results_count}&" - f"gl={self.google_api_country}" - ) - response = requests.get(url) - - if response.status_code == 200: - data = response.json() - - links = [{"url": r["link"], "title": r["title"], "description": r["snippet"]} for r in data["items"]] - - return links - else: - raise Exception( - f"Google Search API returned an error with status code " - f"{response.status_code} and reason '{response.reason}'" - ) + return ErrorArtifact(f"Error searching '{query}' with {self.web_search_driver.__class__.__name__}: {e}") diff --git a/poetry.lock b/poetry.lock index b94c05b2a..fd27e153b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1231,6 +1231,26 @@ files = [ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] +[[package]] +name = "duckduckgo-search" +version = "6.1.7" +description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." +optional = true +python-versions = ">=3.8" +files = [ + {file = "duckduckgo_search-6.1.7-py3-none-any.whl", hash = "sha256:ec7d5becb8c392c0293ff9464938c1014896e1e14725c05adc306290a636fab2"}, + {file = "duckduckgo_search-6.1.7.tar.gz", hash = "sha256:c6fd8ba17fe9cd0a4f32e5b96984e959c3da865f9c2864bfcf82bf7ff9b7e8f0"}, +] + +[package.dependencies] +click = ">=8.1.7" +orjson = ">=3.10.5" +pyreqwest-impersonate = ">=0.4.8" + +[package.extras] +dev = ["mypy (>=1.10.0)", "pytest (>=8.2.2)", "pytest-asyncio (>=0.23.7)", "ruff (>=0.4.8)"] +lxml = ["lxml (>=5.2.2)"] + [[package]] name = "elevenlabs" version = "1.1.2" @@ -3296,6 +3316,61 @@ develop = ["black", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-par docs = ["aiohttp (>=3,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] kerberos = ["requests-kerberos"] +[[package]] +name = "orjson" +version = "3.10.5" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = true +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, +] + [[package]] name = "packaging" version = "24.0" @@ -4116,6 +4191,55 @@ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] image = ["Pillow (>=8.0.0)"] +[[package]] +name = "pyreqwest-impersonate" +version = "0.4.8" +description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:45cad57afe4e6f56078ed9a7a90d0dc839d19d3e7a70175c80af21017f383bfb"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1986600253baf38f25fd07b8bdc1903359c26e5d34beb7d7d084845554b5664d"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cca4e6e59b9ad0cd20bad6caed3ac96992cd9c1d3126ecdfcab2c0ac2b75376"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab6b32544491ee655264dab86fc8a58e47c4f87d196b28022d4007faf971a50"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64bd6299e7fc888bb7f7292cf3e29504c406e5d5d04afd37ca994ab8142d8ee4"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e914b650dd953b8d9b24ef56aa4ecbfc16e399227b68accd818f8bf159e0c558"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f62620e023490902feca0109f306e122e427feff7d59e03ecd22c69a89452367"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08d4c01d76da88cfe3d7d03b311b375ce3fb5a59130f93f0637bb755d6e56ff1"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524e276bc460176c79d7ba4b9131d9db73c534586660371ebdf067749252a33"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22863bc0aaf02ca2f5d76c8130929ae680b7d82dfc1c28c1ed5f306ff626928"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cc82d57f6a91037e64a7aa9122f909576ef2a141a42ce599958ef9f8c4bc033"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da8a053308210e44fd8349f07f45442a0691ac932f2881e98b05cf9ac404b091"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:78db05deed0b32c9c75f2b3168a3a9b7d5e36487b218cb839bfe7e2a143450cb"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9af9446d605903c2b4e94621a9093f8d8a403729bc9cbfbcb62929f8238c838f"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c55890181d8d81e66cac25a95e215dc9680645d01e9091b64449d5407ad9bc6"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69344e7ae9964502a8693da7ad77ebc3e1418ee197e2e394bc23c5d4970772a"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5db5c957a10d8cc2815085ba0b8fe09245b2f94c2225d9653a854a03b4217e1"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03c19c21f63f9c91c590c4bbcc32cc2d8066b508c683a1d163b8c7d9816a01d5"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b8cb9471ab4b2fa7e80d3ac4e580249ff988d782f2938ad1f0428433652b170d"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8081a5ace2658be91519902bde9ddc5f94e1f850a39be196007a25e3da5bbfdc"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69eababfa3200459276acd780a0f3eaf41d1fe7c02bd169e714cba422055b5b9"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632957fa671ebb841166e40913015de457225cb73600ef250c436c280e68bf45"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2ce7ddef334b4e5c68f5ea1da1d65f686b8d84f4443059d128e0f069d3fa499a"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2503277f2a95a30e28e498570e2ed03ef4302f873054e8e21d6c0e607cbbc1d1"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8260395ef4ddae325e8b30cef0391adde7bd35e1a1decf8c729e26391f09b52d"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d8066b46d82bbaff5402d767e2f13d3449b8191c37bf8283e91d301a7159869"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c42f6343cfbd6663fb53edc9eb9feb4ebf6186b284e22368adc1eeb6a33854"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff534f491a059e74fb7f994876df86078b4b125dbecc53c098a298ecd55fa9c6"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24a16b8d55309f0af0db9d04ff442b0c91afccf078a94809e7c3a71747a5c214"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c8fada56465fc19179404cc9d5d5e1064f5dfe27405cb052f57a5b4fe06aed1"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a3d48d5abc146fd804395713427d944757a99254350e6a651e7d776818074aee"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef1ec0e97623bc0e18469418cc4dd2c59a2d5fddcae944de61e13c0b46f910e"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91857b196de89e9b36d3f8629aa8772c0bbe7efef8334fe266956b1c192ec31c"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:63831e407487b8a21bb51f97cd86a616c291d5138f8caec16ab6019cf6423935"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c72c37b03bce9900f5dbb4f476af17253ec60c13bf7a7259f71a8dc1b036cb"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f1096165741b5c2178ab15b0eb09b5de16dd39b1cc135767d72471f0a69ce"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:70c940c0e4ef335e22a6c705b01f286ee44780b5909065d212d94d82ea2580cb"}, +] + +[package.extras] +dev = ["pytest (>=8.1.1)"] + [[package]] name = "pyright" version = "1.1.363" @@ -6070,7 +6194,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6102,6 +6226,7 @@ drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] drivers-vector-redis = ["redis"] drivers-web-scraper-markdownify = ["beautifulsoup4", "markdownify", "playwright"] drivers-web-scraper-trafilatura = ["trafilatura"] +drivers-web-search-duckduckgo = ["duckduckgo-search"] loaders-audio = ["filetype"] loaders-dataframe = ["pandas"] loaders-email = ["mail-parser"] @@ -6111,4 +6236,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "6ccbbba60b534e4756d1c36e37ce1379ee2126d37b822f186b5dbb8e8f701ff3" +content-hash = "a10478cb634e28faa788c568ec9e1ab8bd8e86b09a4e3fb96d08071e76f54c7f" diff --git a/pyproject.toml b/pyproject.toml index 0869256a9..bc2fe0451 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ elevenlabs = {version = "^1.1.2", optional = true} torch = {version = "^2.3.0", optional = true} pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} +duckduckgo-search = {version = "^6.1.6", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -97,6 +98,8 @@ drivers-embedding-cohere = ["cohere"] drivers-web-scraper-trafilatura = ["trafilatura"] drivers-web-scraper-markdownify = ["playwright", "beautifulsoup4", "markdownify"] +drivers-web-search-duckduckgo = ["duckduckgo-search"] + drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-pusher = ["pusher"] @@ -134,6 +137,7 @@ all = [ "torch", "pusher", "ollama", + "duckduckgo-search", # loaders "pandas", diff --git a/tests/integration/tasks/test_toolkit_task.py b/tests/integration/tasks/test_toolkit_task.py index 97f068c5b..a4d8c30c3 100644 --- a/tests/integration/tasks/test_toolkit_task.py +++ b/tests/integration/tasks/test_toolkit_task.py @@ -12,13 +12,15 @@ def structure_tester(self, request): import os from griptape.structures import Agent from griptape.tools import WebScraper, WebSearch, TaskMemoryClient + from griptape.drivers import GoogleWebSearchDriver return StructureTester( Agent( tools=[ WebSearch( - google_api_key=os.environ["GOOGLE_API_KEY"], - google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + web_search_driver=GoogleWebSearchDriver( + api_key=os.environ["GOOGLE_API_KEY"], search_id=os.environ["GOOGLE_API_SEARCH_ID"] + ) ), WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False), diff --git a/tests/unit/drivers/web_search/__init__.py b/tests/unit/drivers/web_search/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py new file mode 100644 index 000000000..fcacc274c --- /dev/null +++ b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py @@ -0,0 +1,36 @@ +import pytest +import json +from griptape.drivers import DuckDuckGoWebSearchDriver +from griptape.artifacts import ListArtifact + + +class TestDuckDuckGoWebSearchDriver: + @pytest.fixture + def driver(self, mocker): + mock_response = [ + {"title": "foo", "href": "bar", "body": "baz"}, + {"title": "foo2", "href": "bar2", "body": "baz2"}, + ] + + mocker.patch("duckduckgo_search.DDGS.text", return_value=mock_response) + + return DuckDuckGoWebSearchDriver() + + @pytest.fixture + def driver_with_error(self, mocker): + mocker.patch("duckduckgo_search.DDGS.text", side_effect=Exception("test_error")) + + return DuckDuckGoWebSearchDriver() + + def test_search_returns_results(self, driver): + results = driver.search("test") + assert isinstance(results, ListArtifact) + output = [json.loads(result.value) for result in results] + assert len(output) == 2 + assert output[0]["title"] == "foo" + assert output[0]["url"] == "bar" + assert output[0]["description"] == "baz" + + def test_search_raises_error(self, driver_with_error): + with pytest.raises(Exception, match="Error searching 'test' with DuckDuckGo: test_error"): + driver_with_error.search("test") diff --git a/tests/unit/drivers/web_search/test_google_web_search_driver.py b/tests/unit/drivers/web_search/test_google_web_search_driver.py new file mode 100644 index 000000000..9ecb92f46 --- /dev/null +++ b/tests/unit/drivers/web_search/test_google_web_search_driver.py @@ -0,0 +1,43 @@ +from pytest import fixture +import pytest +from griptape.drivers import GoogleWebSearchDriver +from griptape.artifacts import ErrorArtifact +import json +from pytest_mock import MockerFixture + + +class TestGoogleWebSearchDriver: + @fixture + def driver(self, mocker: MockerFixture): + mock_response = mocker.Mock() + mocker.patch.object( + mock_response, "json", return_value={"items": [{"title": "foo", "link": "bar", "snippet": "baz"}]} + ) + mock_response.status_code = 200 + + mocker.patch("requests.get", return_value=mock_response) + + return GoogleWebSearchDriver(api_key="test", search_id="test") + + @fixture + def driver_with_error(self, mocker: MockerFixture): + mock_response = mocker.Mock() + mock_response.status_code = 500 + mock_response.reason = "test_reason" + mocker.patch("requests.get", return_value=mock_response) + + return GoogleWebSearchDriver(api_key="test", search_id="test") + + def test_search_returns_results(self, driver): + results = driver.search("test") + output = [json.loads(result.value) for result in results] + assert len(output) == 1 + assert output[0]["title"] == "foo" + assert output[0]["url"] == "bar" + assert output[0]["description"] == "baz" + + def test_search_raises_error(self, driver_with_error): + with pytest.raises( + Exception, match="Google Search API returned an error with status code 500 and reason 'test_reason'" + ): + driver_with_error.search("test") diff --git a/tests/unit/tools/test_web_search.py b/tests/unit/tools/test_web_search.py index c9a79b452..0abc880c8 100644 --- a/tests/unit/tools/test_web_search.py +++ b/tests/unit/tools/test_web_search.py @@ -1,34 +1,32 @@ -from griptape.artifacts import BaseArtifact, ErrorArtifact +import pytest +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import WebSearch -from pytest import fixture -import json class TestWebSearch: - @fixture + @pytest.fixture def websearch_tool(self, mocker): - mock_response = mocker.Mock() - mock_response.status_code = 200 - mock_response.json.return_value = {"items": [{"title": "foo", "link": "bar", "snippet": "baz"}]} - mocker.patch("requests.get", return_value=mock_response) + mock_response = TextArtifact("test_response") + driver = mocker.Mock() + mocker.patch.object(driver, "search", return_value=mock_response) - return WebSearch(google_api_key="foo", google_api_search_id="bar") + return WebSearch(web_search_driver=driver) - @fixture + @pytest.fixture def websearch_tool_with_error(self, mocker): - mock_response = mocker.Mock() - mock_response.status_code = 500 - mocker.patch("requests.get", return_value=mock_response) + mock_response = Exception("test_error") + driver = mocker.Mock() + mocker.patch.object(driver, "search", side_effect=mock_response) - return WebSearch(google_api_key="foo", google_api_search_id="bar") + return WebSearch(web_search_driver=driver) def test_search(self, websearch_tool): assert isinstance(websearch_tool.search({"values": {"query": "foo bar"}}), BaseArtifact) - assert json.loads(websearch_tool.search({"values": {"query": "foo bar"}}).value[0].value) == { - "title": "foo", - "url": "bar", - "description": "baz", - } + assert websearch_tool.search({"values": {"query": "foo bar"}}).value == "test_response" def test_search_with_error(self, websearch_tool_with_error): assert isinstance(websearch_tool_with_error.search({"values": {"query": "foo bar"}}), ErrorArtifact) + assert ( + websearch_tool_with_error.search({"values": {"query": "foo bar"}}).value + == "Error searching 'foo bar' with Mock: test_error" + ) From 73c1d51bfb1ae110bae12f5e79c8e0cf0ca40016 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 19 Jun 2024 16:42:28 -0700 Subject: [PATCH 110/238] Fix/drivers headers (#881) --- .../drivers/audio-transcription-drivers.md | 2 ++ .../drivers/conversation-memory-drivers.md | 2 ++ .../drivers/image-generation-drivers.md | 2 ++ .../drivers/image-query-drivers.md | 14 ++++++++------ docs/griptape-framework/drivers/sql-drivers.md | 8 +++++--- .../drivers/structure-run-drivers.md | 6 ++++-- .../drivers/text-to-speech-drivers.md | 2 ++ .../drivers/vector-store-drivers.md | 18 ++++++++++-------- .../drivers/web-scraper-drivers.md | 6 ++++-- .../engines/summary-engines.md | 2 +- 10 files changed, 40 insertions(+), 22 deletions(-) diff --git a/docs/griptape-framework/drivers/audio-transcription-drivers.md b/docs/griptape-framework/drivers/audio-transcription-drivers.md index ddadcb89a..c89ef9699 100644 --- a/docs/griptape-framework/drivers/audio-transcription-drivers.md +++ b/docs/griptape-framework/drivers/audio-transcription-drivers.md @@ -6,6 +6,8 @@ This driver acts as a critical bridge between audio transcription Engines and th This capability is essential for enhancing accessibility, improving content discoverability, and automating tasks that traditionally relied on manual transcription, thereby streamlining operations and enhancing efficiency across various industries. +## Audio Transcription Drivers + ### OpenAI The [OpenAI Audio Transcription Driver](../../reference/griptape/drivers/audio_transcription/openai_audio_transcription_driver.md) utilizes OpenAI's sophisticated `whisper` model to accurately transcribe spoken audio into text. This model supports multiple languages, ensuring precise transcription across a wide range of dialects. diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index 2ca5f8dd3..4e437a3f5 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -2,6 +2,8 @@ You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). +## Conversation Memory Drivers + ### Local The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. diff --git a/docs/griptape-framework/drivers/image-generation-drivers.md b/docs/griptape-framework/drivers/image-generation-drivers.md index 25572ba9c..95a8bf49b 100644 --- a/docs/griptape-framework/drivers/image-generation-drivers.md +++ b/docs/griptape-framework/drivers/image-generation-drivers.md @@ -23,6 +23,8 @@ agent = Agent(tools=[ agent.run("Generate a watercolor painting of a dog riding a skateboard") ``` +## Image Generation Drivers + ### Amazon Bedrock The [Amazon Bedrock Image Generation Driver](../../reference/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.md) provides multi-model access to image generation models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index 8003924b1..720aa1819 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -1,11 +1,13 @@ -# Image Query Drivers +## Overview Image Query Drivers are used by [Image Query Engines](../engines/query-engines.md#image) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. !!! info All Image Query Drivers default to a `max_tokens` of 256. It is recommended that you set this value to correspond to the desired response length. -## Anthropic +## Image Query Drivers + +### Anthropic !!! info To tune `max_tokens`, see [Anthropic's documentation on image tokens](https://docs.anthropic.com/claude/docs/vision#image-costs) for more information on how to relate token count to response length. @@ -59,7 +61,7 @@ result = engine.run("Describe the weather in the image", [image_artifact1, image print(result) ``` -## OpenAI +### OpenAI !!! info While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. @@ -86,7 +88,7 @@ with open("tests/resources/mountain.png", "rb") as f: engine.run("Describe the weather in the image", [image_artifact]) ``` -## Azure OpenAI +### Azure OpenAI !!! info In order to use the `gpt-4-vision-preview` model on Azure OpenAI, the `gpt-4` model must be deployed with the version set to `vision-preview`. More information can be found in the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision). @@ -117,11 +119,11 @@ with open("tests/resources/mountain.png", "rb") as f: engine.run("Describe the weather in the image", [image_artifact]) ``` -## Amazon Bedrock +### Amazon Bedrock The [Amazon Bedrock Image Query Driver](../../reference/griptape/drivers/image_query/amazon_bedrock_image_query_driver.md) provides multi-model access to image query models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. -### Claude +#### Claude The [BedrockClaudeImageQueryModelDriver](../../reference/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.md) provides support for Claude models hosted by Bedrock. diff --git a/docs/griptape-framework/drivers/sql-drivers.md b/docs/griptape-framework/drivers/sql-drivers.md index c4b7dbcca..c0f8e9f99 100644 --- a/docs/griptape-framework/drivers/sql-drivers.md +++ b/docs/griptape-framework/drivers/sql-drivers.md @@ -8,7 +8,9 @@ SQL drivers can be used to make SQL queries and load table schemas. They are use !!! info More database-specific SQL drivers are coming soon. -## SQL +## SQL Drivers + +### SQL This is a basic SQL loader based on [SQLAlchemy 1.x](https://docs.sqlalchemy.org/en/14/). Here is an example of how to use it: @@ -22,7 +24,7 @@ driver = SqlDriver( driver.execute_query("select 'foo', 'bar';") ``` -## Amazon Redshift +### Amazon Redshift !!! info This driver requires the `drivers-sql-redshift` [extra](../index.md#extras). @@ -46,7 +48,7 @@ driver = AmazonRedshiftSqlDriver( driver.execute_query("select * from people;") ``` -## Snowflake +### Snowflake !!! info This driver requires the `drivers-sql-snowflake` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index 54413c3a2..bba3de524 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -2,7 +2,9 @@ Structure Run Drivers can be used to run Griptape Structures in a variety of runtime environments. When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Client](../../griptape-tools/official-tools/structure-run-client.md) you can create complex, multi-agent pipelines that span multiple runtime environments. -## Local +## Structure Run Drivers + +### Local The [LocalStructureRunDriver](../../reference/griptape/drivers/structure_run/local_structure_run_driver.md) is used to run Griptape Structures in the same runtime environment as the code that is running the Structure. @@ -53,7 +55,7 @@ joke_coordinator = Pipeline( joke_coordinator.run("Tell me a joke") ``` -## Griptape Cloud +### Griptape Cloud The [GriptapeCloudStructureRunDriver](../../reference/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.md) is used to run Griptape Structures in the Griptape Cloud. diff --git a/docs/griptape-framework/drivers/text-to-speech-drivers.md b/docs/griptape-framework/drivers/text-to-speech-drivers.md index a37d4d33e..5f1823fdc 100644 --- a/docs/griptape-framework/drivers/text-to-speech-drivers.md +++ b/docs/griptape-framework/drivers/text-to-speech-drivers.md @@ -4,6 +4,8 @@ Provide a Driver when building an [Engine](../engines/audio-engines.md), then pass it to a [Tool](../tools/index.md) for use by an [Agent](../structures/agents.md): +## Text to Speech Drivers + ### Eleven Labs The [Eleven Labs Text to Speech Driver](../../reference/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.md) provides support for text-to-speech models hosted by Eleven Labs. This Driver supports configurations specific to Eleven Labs, like voice selection and output format. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index 481a2dd84..96480527a 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -16,7 +16,9 @@ Each vector driver takes a [BaseEmbeddingDriver](../../reference/griptape/driver !!! info More vector drivers are coming soon. -## Local +## Vector Store Drivers + +### Local The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the driver can be used to load a webpage into the driver and query it later: @@ -47,7 +49,7 @@ print("\n\n".join(values)) ``` -## Pinecone +### Pinecone !!! info This driver requires the `drivers-vector-pinecone` [extra](../index.md#extras). @@ -103,7 +105,7 @@ result = vector_store_driver.query( ) ``` -## Marqo +### Marqo !!! info This driver requires the `drivers-vector-marqo` [extra](../index.md#extras). @@ -157,7 +159,7 @@ result = vector_store.query(query="What is griptape?") print(result) ``` -## Mongodb Atlas +### Mongodb Atlas !!! info This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). @@ -225,7 +227,7 @@ The format for creating a vector index should look similar to the following: ``` Replace `path_to_vector` with the expected field name where the vector content will be. -## Azure MongoDB +### Azure MongoDB !!! info This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). @@ -274,7 +276,7 @@ result = vector_store.query(query="What is griptape?") print(result) ``` -## Redis +### Redis !!! info This driver requires the `drivers-vector-redis` [extra](../index.md#extras). @@ -319,7 +321,7 @@ The format for creating a vector index should be similar to the following: FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA namespace TAG vector VECTOR FLAT 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE ``` -## OpenSearch +### OpenSearch !!! info This driver requires the `drivers-vector-opensearch` [extra](../index.md#extras). @@ -372,7 +374,7 @@ The body mappings for creating a vector index should look similar to the followi } ``` -## PGVector +### PGVector !!! info This driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index a02365b67..c6835e1b5 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -4,7 +4,9 @@ Web Scraper Drivers can be used to scrape text from the web. They are used by [W * `scrape_url()` scrapes text from a website and returns a [TextArtifact](../../reference/griptape/artifacts/text_artifact.md). The format of the scrapped text is determined by the Driver. -## Markdownify +## Web Scraper Drivers + +### Markdownify !!! info This driver requires the `drivers-web-scraper-markdownify` [extra](../index.md#extras) and the @@ -64,7 +66,7 @@ agent = Agent( agent.run("List all email addresses on griptape.ai in a flat numbered markdown list.") ``` -## Trafilatura +### Trafilatura !!! info This driver requires the `drivers-web-scraper-trafilatura` [extra](../index.md#extras). diff --git a/docs/griptape-framework/engines/summary-engines.md b/docs/griptape-framework/engines/summary-engines.md index 936c12a7c..e6960c0fb 100644 --- a/docs/griptape-framework/engines/summary-engines.md +++ b/docs/griptape-framework/engines/summary-engines.md @@ -4,7 +4,7 @@ Summary engines are used to summarize text and collections of [TextArtifact](../ ## Prompt -Used to summarize texts with LLMs. You can set a custom [prompt_driver](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.prompt_driver), [template_generator](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.template_generator), and [chunker](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.chunker). +Used to summarize texts with LLMs. You can set a custom [prompt_driver](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.prompt_driver), [system_template_generator](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.system_template_generator), [user_template_generator](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.user_template_generator), and [chunker](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.chunker). Use the [summarize_artifacts](../../reference/griptape/engines/summary/prompt_summary_engine.md#griptape.engines.summary.prompt_summary_engine.PromptSummaryEngine.summarize_artifacts) method to summarize a list of artifacts or [summarize_text](../../reference/griptape/engines/summary/base_summary_engine.md#griptape.engines.summary.base_summary_engine.BaseSummaryEngine.summarize_text) to summarize an arbitrary string. From ab82f3c7d5f3b7911e5a4ab1c9b6906e05bda718 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 21 Jun 2024 12:25:10 -0500 Subject: [PATCH 111/238] Add `ProxyWebScraperDriver` (#886) --- .github/workflows/docs-integration-tests.yml | 1 + CHANGELOG.md | 1 + .../drivers/web-scraper-drivers.md | 30 ++++++++++++++++ griptape/drivers/__init__.py | 2 ++ .../web_scraper/proxy_web_scraper_driver.py | 17 ++++++++++ .../test_proxy_web_scraper_driver.py | 34 +++++++++++++++++++ 6 files changed, 85 insertions(+) create mode 100644 griptape/drivers/web_scraper/proxy_web_scraper_driver.py create mode 100644 tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index f752aa90d..79e0c9f3a 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -119,6 +119,7 @@ jobs: PUSHER_KEY: ${{ secrets.INTEG_PUSHER_KEY }} PUSHER_SECRET: ${{ secrets.INTEG_PUSHER_SECRET }} PUSHER_CLUSTER: ${{ secrets.INTEG_PUSHER_CLUSTER }} + ZENROWS_API_KEY: ${{ secrets.INTEG_ZENROWS_API_KEY }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 62846b623..6632b97fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `GoogleWebSearchDriver` to web search with the Google Customsearch API. - `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. +- `ProxyWebScraperDriver` to web scrape using proxies. ### Changed - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index c6835e1b5..8c05a3df2 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -6,6 +6,36 @@ Web Scraper Drivers can be used to scrape text from the web. They are used by [W ## Web Scraper Drivers +### Proxy + +The [ProxyWebScraperDriver](../../reference/griptape/drivers/web_scraper/proxy_web_scraper_driver.md) uses the `requests` library with a provided set of proxies to do web scraping. Paid webscraping services like [ZenRows](https://www.zenrows.com/) or [ScraperAPI](https://www.scraperapi.com/) offer a way to use their API via a set of proxies passed to `requests.get()` + +Example using `ProxyWebScraperDriver` directly: + +```python +import os +from griptape.drivers import ProxyWebScraperDriver + +query_params = [ + "markdown_response=true", + "js_render=false", + "premium_proxy=false", +] +proxy_url = f'http://{os.environ["ZENROWS_API_KEY"]}:{"&".join(query_params)}@proxy.zenrows.com:8001' + +driver = ProxyWebScraperDriver( + proxies={ + "http": proxy_url, + "https": proxy_url, + }, + params={ + "verify": False + } +) + +driver.scrape_url("https://griptape.ai") +``` + ### Markdownify !!! info diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 3576b66bb..94198b734 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -73,6 +73,7 @@ from .web_scraper.base_web_scraper_driver import BaseWebScraperDriver from .web_scraper.trafilatura_web_scraper_driver import TrafilaturaWebScraperDriver from .web_scraper.markdownify_web_scraper_driver import MarkdownifyWebScraperDriver +from .web_scraper.proxy_web_scraper_driver import ProxyWebScraperDriver from .web_search.base_web_search_driver import BaseWebSearchDriver from .web_search.google_web_search_driver import GoogleWebSearchDriver @@ -167,6 +168,7 @@ "BaseWebScraperDriver", "TrafilaturaWebScraperDriver", "MarkdownifyWebScraperDriver", + "ProxyWebScraperDriver", "BaseWebSearchDriver", "GoogleWebSearchDriver", "DuckDuckGoWebSearchDriver", diff --git a/griptape/drivers/web_scraper/proxy_web_scraper_driver.py b/griptape/drivers/web_scraper/proxy_web_scraper_driver.py new file mode 100644 index 000000000..4a9213365 --- /dev/null +++ b/griptape/drivers/web_scraper/proxy_web_scraper_driver.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from attrs import field, Factory, define +import requests + +from griptape.artifacts import TextArtifact +from griptape.drivers import BaseWebScraperDriver + + +@define +class ProxyWebScraperDriver(BaseWebScraperDriver): + proxies: dict = field(kw_only=True, metadata={"serializable": False}) + params: dict = field(default=Factory(dict), kw_only=True, metadata={"serializable": True}) + + def scrape_url(self, url: str) -> TextArtifact: + response = requests.get(url, proxies=self.proxies, **self.params) + return TextArtifact(response.text) diff --git a/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py new file mode 100644 index 000000000..569800c6a --- /dev/null +++ b/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py @@ -0,0 +1,34 @@ +import pytest + +from griptape.drivers import ProxyWebScraperDriver +from griptape.artifacts import TextArtifact + + +class TestProxyWebScraperDriver: + @pytest.fixture(autouse=True) + def mock_client(self, mocker): + mock_response = mocker.Mock() + mock_response.text = "test_scrape" + return mocker.patch("requests.get", return_value=mock_response) + + @pytest.fixture + def mock_client_error(self, mocker): + return mocker.patch("requests.get", side_effect=Exception("test_error")) + + @pytest.fixture + def web_scraper(self, mocker): + return ProxyWebScraperDriver( + proxies={"http": "http://localhost:8080", "https": "http://localhost:8080"}, + params={"test_param": "test_param"}, + ) + + def test_scrape_url(self, web_scraper, mock_client): + output = web_scraper.scrape_url("https://example.com/") + mock_client.assert_called_with("https://example.com/", proxies=web_scraper.proxies, test_param="test_param") + assert isinstance(output, TextArtifact) + assert "test_scrape" == output.value + + def test_scrape_url_error(self, web_scraper, mock_client_error): + with pytest.raises(Exception, match="test_error"): + web_scraper.scrape_url("https://example.com/") + assert mock_client_error.called From cff3f79196971c01e6c06d28fbfb45cdb511b518 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 21 Jun 2024 12:40:23 -0500 Subject: [PATCH 112/238] Update `AmazonBedrockStructureConfig` with helper params (#882) --- CHANGELOG.md | 1 + docs/griptape-framework/structures/config.md | 10 +++- .../config/amazon_bedrock_structure_config.py | 55 ++++++++++++----- .../test_amazon_bedrock_structure_config.py | 59 +++++++++++++++++++ 4 files changed, 108 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6632b97fe..683698785 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `GoogleWebSearchDriver` to web search with the Google Customsearch API. - `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. - `ProxyWebScraperDriver` to web scrape using proxies. +- Parameter `session` on `AmazonBedrockStructureConfig`. ### Changed - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index d75354768..1a69d70c0 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -48,11 +48,19 @@ agent = Agent( The [Amazon Bedrock Structure Config](../../reference/griptape/config/amazon_bedrock_structure_config.md) provides default Drivers for Amazon Bedrock's APIs. ```python +import os +import boto3 from griptape.structures import Agent from griptape.config import AmazonBedrockStructureConfig agent = Agent( - config=AmazonBedrockStructureConfig() + config=AmazonBedrockStructureConfig( + session=boto3.Session( + region_name=os.environ["AWS_DEFAULT_REGION"], + aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], + aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], + ) + ) ) ``` diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_structure_config.py index e70d9c819..3addf3b36 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_structure_config.py @@ -1,5 +1,9 @@ +from __future__ import annotations +from typing import TYPE_CHECKING from attrs import Factory, define, field +from griptape.drivers import BasePromptDriver +from griptape.utils import import_optional_dependency from griptape.config import StructureConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, @@ -8,49 +12,68 @@ AmazonBedrockTitanEmbeddingDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, - BasePromptDriver, BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, BedrockTitanImageGenerationModelDriver, LocalVectorStoreDriver, ) +if TYPE_CHECKING: + import boto3 -@define() + +@define class AmazonBedrockStructureConfig(StructureConfig): + session: boto3.Session = field( + default=Factory(lambda: import_optional_dependency("boto3").Session()), + kw_only=True, + metadata={"serializable": False}, + ) + prompt_driver: BasePromptDriver = field( default=Factory( - lambda: AmazonBedrockPromptDriver(model="anthropic.claude-3-sonnet-20240229-v1:0", stream=False) + lambda self: AmazonBedrockPromptDriver( + session=self.session, model="anthropic.claude-3-sonnet-20240229-v1:0" + ), + takes_self=True, ), + kw_only=True, + metadata={"serializable": True}, + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory( + lambda self: AmazonBedrockTitanEmbeddingDriver(session=self.session, model="amazon.titan-embed-text-v1"), + takes_self=True, + ), + kw_only=True, metadata={"serializable": True}, ) image_generation_driver: BaseImageGenerationDriver = field( default=Factory( - lambda: AmazonBedrockImageGenerationDriver( + lambda self: AmazonBedrockImageGenerationDriver( + session=self.session, model="amazon.titan-image-generator-v1", image_generation_model_driver=BedrockTitanImageGenerationModelDriver(), - ) + ), + takes_self=True, ), + kw_only=True, metadata={"serializable": True}, ) image_query_driver: BaseImageGenerationDriver = field( default=Factory( - lambda: AmazonBedrockImageQueryDriver( + lambda self: AmazonBedrockImageQueryDriver( + session=self.session, model="anthropic.claude-3-sonnet-20240229-v1:0", image_query_model_driver=BedrockClaudeImageQueryModelDriver(), - ) + ), + takes_self=True, ), - metadata={"serializable": True}, - ) - embedding_driver: BaseEmbeddingDriver = field( - default=Factory(lambda: AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1")), + kw_only=True, metadata={"serializable": True}, ) vector_store_driver: BaseVectorStoreDriver = field( - default=Factory( - lambda: LocalVectorStoreDriver( - embedding_driver=AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1") - ) - ), + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + kw_only=True, metadata={"serializable": True}, ) diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index 33b286f94..209c28f26 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -1,3 +1,4 @@ +import boto3 from pytest import fixture from griptape.config import AmazonBedrockStructureConfig from tests.utils.aws import mock_aws_credentials @@ -10,8 +11,17 @@ def run_before_and_after_tests(self): @fixture def config(self): + mock_aws_credentials() return AmazonBedrockStructureConfig() + @fixture + def config_with_values(self): + return AmazonBedrockStructureConfig( + session=boto3.Session( + aws_access_key_id="testing", aws_secret_access_key="testing", region_name="region-value" + ) + ) + def test_to_dict(self, config): assert config.to_dict() == { "conversation_memory_driver": None, @@ -56,3 +66,52 @@ def test_to_dict(self, config): def test_from_dict(self, config): assert AmazonBedrockStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + + def test_from_dict_with_values(self, config_with_values): + assert ( + AmazonBedrockStructureConfig.from_dict(config_with_values.to_dict()).to_dict() + == config_with_values.to_dict() + ) + + def test_to_dict_with_values(self, config_with_values): + assert config_with_values.to_dict() == { + "conversation_memory_driver": None, + "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation_driver": { + "image_generation_model_driver": { + "cfg_scale": 7, + "outpainting_mode": "PRECISE", + "quality": "standard", + "type": "BedrockTitanImageGenerationModelDriver", + }, + "image_height": 512, + "image_width": 512, + "model": "amazon.titan-image-generator-v1", + "seed": None, + "type": "AmazonBedrockImageGenerationDriver", + }, + "image_query_driver": { + "type": "AmazonBedrockImageQueryDriver", + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "max_tokens": 256, + "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, + }, + "prompt_driver": { + "max_tokens": None, + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "stream": False, + "temperature": 0.1, + "type": "AmazonBedrockPromptDriver", + }, + "vector_store_driver": { + "embedding_driver": { + "model": "amazon.titan-embed-text-v1", + "type": "AmazonBedrockTitanEmbeddingDriver", + }, + "type": "LocalVectorStoreDriver", + }, + "type": "AmazonBedrockStructureConfig", + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "audio_transcription_driver": {"type": "DummyAudioTranscriptionDriver"}, + } + assert config_with_values.session.region_name == "region-value" From 535380cccc49079991ea5a3e692f8cb4f6b772ae Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Fri, 21 Jun 2024 17:44:32 -0600 Subject: [PATCH 113/238] Replace `VectorQueryEngine` with `RagEngine` (#860) ### Added - `RagEngine` is an abstraction for implementing modular RAG pipelines. - `RagContext` is a container object for passing around RAG context. - RAG stages: - `QueryRagStage` for parsing and expanding queries. - `RetrievalRagStage` for retrieving content. - `GenerationRagStage` for augmenting and generating outputs. - RAG modules: - Query: - `RelatedQueryGenerationRagModule` for generating related queries. - Retrieval: - `TextRetrievalRagModule` for retrieving text chunks. - `TextRerankRagModule` for re-ranking retrieved results. - Generation: - `MetadataGenerationRagModule` for appending metadata. - `RulesetsGenerationRagModule` for appending rulesets. - `PromptGenerationRagModule` for generating responses based on retrieved text chunks. - `RagClient` tool for exposing `RagEngines` to LLM agents. - `RagTask` task for including `RagEngines` in any structure. - Rerank drivers: - `CohereRerankDriver` for using the Cohere rerank API. - `utils.execute_futures_list()` for executing a list of futures. - `LocalVectorStoreDriver.persist_file` for persisting vectors and chunks in a text file. - `Entry.to_artifact()` for easy vector store entry conversions into Griptape artifacts. - `BaseVectorStoreDriver.does_entry_exist()` to check if an entry exists in the vector store. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. - **BREAKING**: Removed `VectorQueryEngine` in favor of `RagEngine`. - **BREAKING**: Removed `TextQueryTask` in favor of `RagTask`. - **BREAKING**: `TextArtifactStorage` now requires `vector_store_driver` and `rag_engine` in place of `vector_query_engine`. - **BREAKING**: Moved `load_artifacts()` from `BaseQueryEngine` to `BaseVectorStoreDriver`. - **BREAKING**: Merged `BaseVectorStoreDriver.QueryResult` into `BaseVectorStoreDriver.Entry`. - **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. --- CHANGELOG.md | 31 +++++ README.md | 2 +- docs/examples/load-query-and-chat-marqo.md | 7 +- docs/examples/multiple-agent-shared-memory.md | 6 +- docs/examples/query-webpage.md | 2 +- docs/examples/talk-to-a-pdf.md | 49 ++++---- docs/examples/talk-to-a-webpage.md | 39 +++--- docs/griptape-framework/data/index.md | 12 +- .../drivers/image-query-drivers.md | 2 +- .../drivers/vector-store-drivers.md | 17 +-- .../engines/image-query-engines.md | 25 ++++ .../engines/query-engines.md | 52 -------- .../griptape-framework/engines/rag-engines.md | 66 ++++++++++ .../structures/task-memory.md | 113 ++++++++++++------ docs/griptape-framework/structures/tasks.md | 74 ++++++------ .../official-tools/rag-client.md | 49 ++++++++ .../official-tools/vector-store-client.md | 23 ++-- griptape/artifacts/media_artifact.py | 2 +- griptape/drivers/__init__.py | 5 + griptape/drivers/prompt/base_prompt_driver.py | 14 +-- .../drivers/prompt/cohere_prompt_driver.py | 12 +- .../query => drivers/rerank}/__init__.py | 0 griptape/drivers/rerank/base_rerank_driver.py | 9 ++ .../drivers/rerank/cohere_rerank_driver.py | 31 +++++ .../azure_mongodb_vector_store_driver.py | 4 +- .../vector/base_vector_store_driver.py | 87 +++++++++----- .../vector/dummy_vector_store_driver.py | 2 +- .../vector/local_vector_store_driver.py | 69 ++++++++--- .../vector/marqo_vector_store_driver.py | 16 ++- .../mongodb_atlas_vector_store_driver.py | 4 +- .../vector/opensearch_vector_store_driver.py | 6 +- .../vector/pgvector_vector_store_driver.py | 4 +- .../vector/pinecone_vector_store_driver.py | 4 +- .../vector/redis_vector_store_driver.py | 9 +- griptape/engines/__init__.py | 4 - griptape/engines/query/base_query_engine.py | 29 ----- griptape/engines/query/vector_query_engine.py | 95 --------------- griptape/engines/rag/__init__.py | 4 + griptape/engines/rag/modules/__init__.py | 29 +++++ .../engines/rag/modules/base_rag_module.py | 18 +++ .../rag/modules/generation}/__init__.py | 0 .../base_after_generation_rag_module.py | 10 ++ .../base_before_generation_rag_module.py | 10 ++ .../generation/base_generation_rag_module.py | 10 ++ .../metadata_generation_rag_module.py | 20 ++++ .../prompt_generation_rag_module.py | 54 +++++++++ .../rulesets_generation_rag_module.py | 15 +++ .../engines/rag/modules/query/__init__.py | 0 .../modules/query/base_query_rag_module.py | 10 ++ .../related_query_generation_rag_module.py | 33 +++++ .../engines/rag/modules/retrieval/__init__.py | 0 .../retrieval/base_rerank_rag_module.py | 16 +++ .../retrieval/base_retrieval_rag_module.py | 12 ++ .../retrieval/text_rerank_rag_module.py | 12 ++ .../retrieval/text_retrieval_rag_module.py | 35 ++++++ griptape/engines/rag/rag_context.py | 29 +++++ griptape/engines/rag/rag_engine.py | 26 ++++ griptape/engines/rag/stages/__init__.py | 6 + griptape/engines/rag/stages/base_rag_stage.py | 12 ++ .../rag/stages/generation_rag_stage.py | 33 +++++ .../engines/rag/stages/query_rag_stage.py | 23 ++++ .../engines/rag/stages/retrieval_rag_stage.py | 49 ++++++++ .../task/storage/text_artifact_storage.py | 36 ++++-- griptape/structures/structure.py | 36 ++++-- griptape/tasks/__init__.py | 4 +- griptape/tasks/rag_task.py | 31 +++++ griptape/tasks/text_query_task.py | 35 ------ .../rag/modules/metadata_generation/system.j2 | 5 + .../rag/modules/prompt_generation/system.j2 | 15 +++ .../rag/modules/query_generation/system.j2 | 3 + griptape/tools/__init__.py | 2 + griptape/tools/rag_client/__init__.py | 0 griptape/tools/rag_client/manifest.yml | 5 + griptape/tools/rag_client/requirements.txt | 0 griptape/tools/rag_client/tool.py | 38 ++++++ griptape/tools/vector_store_client/tool.py | 18 +-- griptape/utils/__init__.py | 2 + griptape/utils/futures.py | 6 + mkdocs.yml | 5 +- poetry.lock | 5 +- pyproject.toml | 2 + ...st_text_query_task.py => test_rag_task.py} | 16 ++- .../test_amazon_bedrock_structure_config.py | 4 +- tests/unit/drivers/rerank/__init__.py | 0 .../rerank/test_cohere_rerank_driver.py | 19 +++ ...r.py => base_local_vector_store_driver.py} | 32 +++-- .../test_azure_mongodb_vector_store_driver.py | 6 +- tests/unit/drivers/vector/test_entry.py | 12 ++ ...est_in_memory_local_vector_store_driver.py | 10 ++ .../test_mongodb_atlas_vector_store_driver.py | 6 +- ...st_persistent_local_vector_store_driver.py | 29 +++++ .../test_pinecone_vector_storage_driver.py | 4 +- .../engines/query/test_vector_query_engine.py | 58 --------- tests/unit/engines/rag/__init__.py | 0 tests/unit/engines/rag/modules/__init__.py | 0 .../rag/modules/generation/__init__.py | 0 .../test_metadata_generation_rag_module.py | 14 +++ .../test_prompt_generation_rag_module.py | 25 ++++ .../test_rulesets_generation_rag_module.py | 10 ++ .../engines/rag/modules/query/__init__.py | 0 ...est_related_query_generation_rag_module.py | 13 ++ .../engines/rag/modules/retrieval/__init__.py | 0 .../retrieval/test_text_rerank_rag_module.py | 20 ++++ .../test_text_retrieval_rag_module.py | 20 ++++ tests/unit/engines/rag/test_rag_engine.py | 30 +++++ tests/unit/memory/tool/test_task_memory.py | 2 +- tests/unit/structures/test_agent.py | 15 ++- tests/unit/structures/test_pipeline.py | 4 +- tests/unit/structures/test_workflow.py | 4 +- tests/unit/tasks/test_rag_task.py | 35 ++++++ tests/unit/tasks/test_text_query_task.py | 48 -------- tests/unit/tasks/test_toolkit_task.py | 16 +-- tests/unit/tools/test_rag_client.py | 13 ++ tests/unit/tools/test_vector_store_client.py | 19 +-- tests/unit/utils/test_futures.py | 9 ++ tests/utils/defaults.py | 22 +++- 116 files changed, 1550 insertions(+), 654 deletions(-) create mode 100644 docs/griptape-framework/engines/image-query-engines.md delete mode 100644 docs/griptape-framework/engines/query-engines.md create mode 100644 docs/griptape-framework/engines/rag-engines.md create mode 100644 docs/griptape-tools/official-tools/rag-client.md rename griptape/{engines/query => drivers/rerank}/__init__.py (100%) create mode 100644 griptape/drivers/rerank/base_rerank_driver.py create mode 100644 griptape/drivers/rerank/cohere_rerank_driver.py delete mode 100644 griptape/engines/query/base_query_engine.py delete mode 100644 griptape/engines/query/vector_query_engine.py create mode 100644 griptape/engines/rag/__init__.py create mode 100644 griptape/engines/rag/modules/__init__.py create mode 100644 griptape/engines/rag/modules/base_rag_module.py rename {tests/unit/engines/query => griptape/engines/rag/modules/generation}/__init__.py (100%) create mode 100644 griptape/engines/rag/modules/generation/base_after_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/generation/base_before_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/generation/base_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/generation/metadata_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/generation/prompt_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/query/__init__.py create mode 100644 griptape/engines/rag/modules/query/base_query_rag_module.py create mode 100644 griptape/engines/rag/modules/query/related_query_generation_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/__init__.py create mode 100644 griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py create mode 100644 griptape/engines/rag/rag_context.py create mode 100644 griptape/engines/rag/rag_engine.py create mode 100644 griptape/engines/rag/stages/__init__.py create mode 100644 griptape/engines/rag/stages/base_rag_stage.py create mode 100644 griptape/engines/rag/stages/generation_rag_stage.py create mode 100644 griptape/engines/rag/stages/query_rag_stage.py create mode 100644 griptape/engines/rag/stages/retrieval_rag_stage.py create mode 100644 griptape/tasks/rag_task.py delete mode 100644 griptape/tasks/text_query_task.py create mode 100644 griptape/templates/engines/rag/modules/metadata_generation/system.j2 create mode 100644 griptape/templates/engines/rag/modules/prompt_generation/system.j2 create mode 100644 griptape/templates/engines/rag/modules/query_generation/system.j2 create mode 100644 griptape/tools/rag_client/__init__.py create mode 100644 griptape/tools/rag_client/manifest.yml create mode 100644 griptape/tools/rag_client/requirements.txt create mode 100644 griptape/tools/rag_client/tool.py rename tests/integration/tasks/{test_text_query_task.py => test_rag_task.py} (65%) create mode 100644 tests/unit/drivers/rerank/__init__.py create mode 100644 tests/unit/drivers/rerank/test_cohere_rerank_driver.py rename tests/unit/drivers/vector/{test_local_vector_store_driver.py => base_local_vector_store_driver.py} (62%) create mode 100644 tests/unit/drivers/vector/test_entry.py create mode 100644 tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py create mode 100644 tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py delete mode 100644 tests/unit/engines/query/test_vector_query_engine.py create mode 100644 tests/unit/engines/rag/__init__.py create mode 100644 tests/unit/engines/rag/modules/__init__.py create mode 100644 tests/unit/engines/rag/modules/generation/__init__.py create mode 100644 tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py create mode 100644 tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py create mode 100644 tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py create mode 100644 tests/unit/engines/rag/modules/query/__init__.py create mode 100644 tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py create mode 100644 tests/unit/engines/rag/modules/retrieval/__init__.py create mode 100644 tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py create mode 100644 tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py create mode 100644 tests/unit/engines/rag/test_rag_engine.py create mode 100644 tests/unit/tasks/test_rag_task.py delete mode 100644 tests/unit/tasks/test_text_query_task.py create mode 100644 tests/unit/tools/test_rag_client.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 66104a6e1..e920f5a5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added +- `RagEngine` is an abstraction for implementing modular RAG pipelines. + - `RagContext` is a container object for passing around RAG context. + - RAG stages: + - `QueryRagStage` for parsing and expanding queries. + - `RetrievalRagStage` for retrieving content. + - `GenerationRagStage` for augmenting and generating outputs. + - RAG modules: + - Query: + - `RelatedQueryGenerationRagModule` for generating related queries. + - Retrieval: + - `TextRetrievalRagModule` for retrieving text chunks. + - `TextRerankRagModule` for re-ranking retrieved results. + - Generation: + - `MetadataGenerationRagModule` for appending metadata. + - `RulesetsGenerationRagModule` for appending rulesets. + - `PromptGenerationRagModule` for generating responses based on retrieved text chunks. +- `RagClient` tool for exposing `RagEngines` to LLM agents. +- `RagTask` task for including `RagEngines` in any structure. +- Rerank drivers: + - `CohereRerankDriver` for using the Cohere rerank API. +- `utils.execute_futures_list()` for executing a list of futures. +- `LocalVectorStoreDriver.persist_file` for persisting vectors and chunks in a text file. +- `Entry.to_artifact()` for easy vector store entry conversions into Griptape artifacts. +- `BaseVectorStoreDriver.does_entry_exist()` to check if an entry exists in the vector store. - `GoogleWebSearchDriver` to web search with the Google Customsearch API. - `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. - `ProxyWebScraperDriver` to web scrape using proxies. - Parameter `session` on `AmazonBedrockStructureConfig`. ### Changed +- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. +- **BREAKING**: Removed `VectorQueryEngine` in favor of `RagEngine`. +- **BREAKING**: Removed `TextQueryTask` in favor of `RagTask`. +- **BREAKING**: `TextArtifactStorage` now requires `vector_store_driver` and `rag_engine` in place of `vector_query_engine`. +- **BREAKING**: Moved `load_artifacts()` from `BaseQueryEngine` to `BaseVectorStoreDriver`. +- **BREAKING**: Merged `BaseVectorStoreDriver.QueryResult` into `BaseVectorStoreDriver.Entry`. +- **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. ## [0.27.1] - 2024-06-20 diff --git a/README.md b/README.md index b5e4f7bcb..f9eb2aa5c 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Drivers facilitate interactions with external resources and services: Engines wrap Drivers and provide use-case-specific functionality: -- 📊 **Query Engines** execute Retrieval Augmented Generation (RAG) queries. +- 📊 **RAG Engine** is an abstraction for implementing modular Retrieval Augmented Generation (RAG) pipelines. - 🛠️ **Extraction Engines** extract JSON or CSV data from unstructured text. - 📝 **Summary Engines** generate summaries from textual content. - 🖼️ **Image Generation Engines** generate images from textual descriptions. diff --git a/docs/examples/load-query-and-chat-marqo.md b/docs/examples/load-query-and-chat-marqo.md index 718b42729..fb5906e9e 100644 --- a/docs/examples/load-query-and-chat-marqo.md +++ b/docs/examples/load-query-and-chat-marqo.md @@ -2,11 +2,10 @@ import os from griptape import utils from griptape.drivers import MarqoVectorStoreDriver -from griptape.engines import VectorQueryEngine from griptape.loaders import WebLoader from griptape.structures import Agent from griptape.tools import VectorStoreClient -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.drivers import OpenAiEmbeddingDriver # Define the namespace namespace = "griptape-ai" @@ -18,14 +17,12 @@ vector_store = MarqoVectorStoreDriver( index=os.environ["MARQO_INDEX_NAME"], embedding_driver=OpenAiEmbeddingDriver() ) -# Initialize the query engine -query_engine = VectorQueryEngine(vector_store_driver=vector_store, prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo")) # Initialize the knowledge base tool vector_store_tool = VectorStoreClient( description="Contains information about the Griptape Framework from www.griptape.ai", - query_engine=query_engine, namespace=namespace, + vector_store_driver=vector_store ) # Load artifacts from the web diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index cc5498d7e..109394d49 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -8,13 +8,9 @@ The `MongoDbAtlasVectorStoreDriver` assumes that you have a vector index configu ```python import os -from griptape.tools import WebScraper, VectorStoreClient, TaskMemoryClient +from griptape.tools import WebScraper, TaskMemoryClient from griptape.structures import Agent from griptape.drivers import AzureOpenAiEmbeddingDriver, AzureMongoDbVectorStoreDriver -from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine -from griptape.memory import TaskMemory -from griptape.artifacts import TextArtifact -from griptape.memory.task.storage import TextArtifactStorage from griptape.config import AzureOpenAiStructureConfig diff --git a/docs/examples/query-webpage.md b/docs/examples/query-webpage.md index d11c5d9c4..07801b32c 100644 --- a/docs/examples/query-webpage.md +++ b/docs/examples/query-webpage.md @@ -22,7 +22,7 @@ results = vector_store.query( namespace="griptape" ) -values = [BaseArtifact.from_json(r.meta["artifact"]).value for r in results] +values = [r.to_artifact().value for r in results] print("\n\n".join(values)) ``` \ No newline at end of file diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md index 51f71b4f6..a39832961 100644 --- a/docs/examples/talk-to-a-pdf.md +++ b/docs/examples/talk-to-a-pdf.md @@ -1,48 +1,53 @@ This example demonstrates how to vectorize a PDF of the [Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf) paper and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. ```python -import os -import io import requests -from griptape.engines import VectorQueryEngine +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage from griptape.loaders import PdfLoader from griptape.structures import Agent -from griptape.tools import VectorStoreClient +from griptape.tools import RagClient from griptape.utils import Chat -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver - namespace = "attention" - response = requests.get("https://arxiv.org/pdf/1706.03762.pdf") - -engine = VectorQueryEngine( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-3.5-turbo", +vector_store = LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver() +) +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace=namespace, + vector_store_driver=vector_store, + top_n=20 + ) + ] ), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver( - api_key=os.environ["OPENAI_API_KEY"] + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) ) +vector_store_tool = RagClient( + description="Contains information about the Attention Is All You Need paper. " + "Use it to answer any related questions.", + rag_engine=engine +) -engine.vector_store_driver.upsert_text_artifacts( +vector_store.upsert_text_artifacts( { namespace: PdfLoader().load(response.content) } ) -vector_store_tool = VectorStoreClient( - description="Contains information about the Attention Is All You Need paper. " - "Use it to answer any related questions.", - query_engine=engine, - namespace=namespace, -) - agent = Agent( tools=[vector_store_tool] ) Chat(agent).start() + ``` diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md index 2f2cbf209..ddd1a18c9 100644 --- a/docs/examples/talk-to-a-webpage.md +++ b/docs/examples/talk-to-a-webpage.md @@ -1,25 +1,33 @@ -This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [VectorStoreClient](../reference/griptape/tools/vector_store_client/tool.md) tool to use it during conversations. +This example demonstrates how to vectorize a webpage and setup a Griptape agent with rules and the [RagClient](../reference/griptape/tools/rag_client/tool.md) tool to use it during conversations. ```python -import os -from griptape.engines import VectorQueryEngine +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage from griptape.loaders import WebLoader from griptape.rules import Ruleset, Rule from griptape.structures import Agent -from griptape.tools import VectorStoreClient +from griptape.tools import RagClient from griptape.utils import Chat -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver - namespace = "physics-wiki" -engine = VectorQueryEngine( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-3.5-turbo", +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace=namespace, + vector_store_driver=vector_store_driver, + top_n=20 + ) + ] ), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver( - api_key=os.environ["OPENAI_API_KEY"] + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) ) @@ -28,16 +36,15 @@ artifacts = WebLoader().load( "https://en.wikipedia.org/wiki/Physics" ) -engine.vector_store_driver.upsert_text_artifacts( +vector_store_driver.upsert_text_artifacts( {namespace: artifacts} ) -vector_store_tool = VectorStoreClient( +vector_store_tool = RagClient( description="Contains information about physics. " "Use it to answer any physics-related questions.", - query_engine=engine, - namespace=namespace, + rag_engine=engine ) agent = Agent( diff --git a/docs/griptape-framework/data/index.md b/docs/griptape-framework/data/index.md index 73dfe4c66..3e4359737 100644 --- a/docs/griptape-framework/data/index.md +++ b/docs/griptape-framework/data/index.md @@ -14,7 +14,17 @@ Griptape provides several abstractions for working with data. **Tokenizers** are used to tokenize and detokenize text in order to track LLM token limits. -[Query Engines](../engines/query-engines.md) are used to search text storages. +[Audio Engines](../engines/audio-engines.md) are used for working with audio. + +[Extraction Engines](../engines/extraction-engines.md) are used for extracting structured content. + +[Image Query Engines](../engines/image-query-engines.md) are used for querying images with text. + +[Image Generation Engines](../engines/image-generation-engines.md) are used for generating images. + +[Summary Engines](../engines/summary-engines.md) are used for summarizing text content. + +[RAG Engines](../engines/rag-engines.md) are used for implementing modular RAG pipelines. [Vector Store Drivers](../drivers/vector-store-drivers.md) are used to store and query vector databases. diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index 720aa1819..6fde89b80 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -1,6 +1,6 @@ ## Overview -Image Query Drivers are used by [Image Query Engines](../engines/query-engines.md#image) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. +Image Query Drivers are used by [Image Query Engines](../engines/image-query-engines.md) to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular Image Query Driver. !!! info All Image Query Drivers default to a `max_tokens` of 256. It is recommended that you set this value to correspond to the desired response length. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index 96480527a..095c14f22 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -43,7 +43,7 @@ results = vector_store_driver.query( namespace="griptape" ) -values = [BaseArtifact.from_json(r.meta["artifact"]).value for r in results] +values = [r.to_artifact().value for r in results] print("\n\n".join(values)) @@ -117,9 +117,7 @@ Here is an example of how the driver can be used to load and query information i ```python import os from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver -from griptape.engines import VectorQueryEngine from griptape.loaders import WebLoader -from griptape.tools import VectorStoreClient # Initialize an embedding driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) @@ -136,25 +134,16 @@ vector_store = MarqoVectorStoreDriver( embedding_driver=embedding_driver, ) -# Initialize the query engine -query_engine = VectorQueryEngine(vector_store_driver=vector_store, prompt_driver=prompt_driver) - -# Initialize the knowledge base tool -VectorStoreClient( - description="Contains information about the Griptape Framework from www.griptape.ai", - query_engine=query_engine, - namespace=namespace, -) - # Load artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") # Upsert the artifacts into the vector store vector_store.upsert_text_artifacts( { - namespace: artifacts, + "griptape": artifacts, } ) + result = vector_store.query(query="What is griptape?") print(result) ``` diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md new file mode 100644 index 000000000..def6cbd5d --- /dev/null +++ b/docs/griptape-framework/engines/image-query-engines.md @@ -0,0 +1,25 @@ +## Image Query Engines + +The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) allows you to perform natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). + +All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. + +```python +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = OpenAiImageQueryDriver( + model="gpt-4o", + max_tokens=256 +) + +engine = ImageQueryEngine( + image_query_driver=driver +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` diff --git a/docs/griptape-framework/engines/query-engines.md b/docs/griptape-framework/engines/query-engines.md deleted file mode 100644 index 38f5f6610..000000000 --- a/docs/griptape-framework/engines/query-engines.md +++ /dev/null @@ -1,52 +0,0 @@ -## Overview -Query engines are used to perform text queries against various modalities. - -## Vector - -Used to query vector storages. You can set a custom [prompt_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.prompt_driver) and [vector_store_driver](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.vector_store_driver). Uses [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) by default. - -Use the [upsert_text_artifact](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.upsert_text_artifact)s into vector storage with an optional `namespace`. - -Use the [VectorQueryEngine](../../reference/griptape/engines/query/vector_query_engine.md#griptape.engines.query.vector_query_engine.VectorQueryEngine.query) method to query the vector storage. - -```python -from griptape.drivers import OpenAiChatPromptDriver, LocalVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.engines import VectorQueryEngine -from griptape.loaders import WebLoader - -engine = VectorQueryEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), - vector_store_driver=LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) -) - -engine.upsert_text_artifacts( - WebLoader().load("https://www.griptape.ai"), namespace="griptape" -) - -engine.query("what is griptape?", namespace="griptape") -``` - -## Image -The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) allows you to perform natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). - -All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. - -```python -from griptape.drivers import OpenAiImageQueryDriver -from griptape.engines import ImageQueryEngine -from griptape.loaders import ImageLoader - -driver = OpenAiImageQueryDriver( - model="gpt-4o", - max_tokens=256 -) - -engine = ImageQueryEngine( - image_query_driver=driver -) - -with open("tests/resources/mountain.png", "rb") as f: - image_artifact = ImageLoader().load(f.read()) - -engine.run("Describe the weather in the image", [image_artifact]) -``` diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md new file mode 100644 index 000000000..600b91d03 --- /dev/null +++ b/docs/griptape-framework/engines/rag-engines.md @@ -0,0 +1,66 @@ +## RAG Engines + +!!! note + This section is a work in progress. + +`RagEngine` is an abstraction for implementing modular RAG pipelines. + +`RagContext` is a container object for passing around RAG context. + +### RAG Stages +- `QueryRagStage` is for parsing and expanding queries. +- `RetrievalRagStage` is for retrieving content. +- `GenerationRagStage` is for augmenting and generating outputs. + +### RAG Modules + +#### Query +- `RelatedQueryGenerationRagModule` is for generating related queries. + +#### Retrieval +- `TextRetrievalRagModule` is for retrieving text chunks. +- `TextRerankRagModule` is for re-ranking retrieved results. + +#### Generation +- `MetadataGenerationRagModule` is for appending metadata. +- `RulesetsGenerationRagModule` is for appending rulesets. +- `PromptGenerationRagModule` is for generating responses based on retrieved text chunks. + +### Example + +```python +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage + +vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifacts = [ + TextArtifact("Griptape builds AI-powered applications that connect securely to your enterprise data and APIs."), + TextArtifact("Griptape Agents provide incredible power and flexibility when working with large language models.") +] +vector_store.upsert_text_artifacts({"griptape": artifacts}) + +engine = RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace="griptape", + vector_store_driver=vector_store, + top_n=20 + ) + ] + ), + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + ) + ) +) + +print( + engine.process_query("what are Griptape agents?").output.to_text() +) +``` \ No newline at end of file diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 219fd4412..4597b6402 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -198,24 +198,26 @@ Because Task Memory splits up the storage and retrieval of data, you can use dif Here is an example where we use GPT-4 to orchestrate the Tools and store the data in Task Memory, and Amazon Bedrock's Titan model to query the raw content. In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManager` can save the results to disk without GPT-4 ever seeing them. - ```python from griptape.artifacts import TextArtifact from griptape.config import ( OpenAiStructureConfig, ) from griptape.drivers import ( - AmazonBedrockPromptDriver, - AmazonBedrockTitanEmbeddingDriver, LocalVectorStoreDriver, - OpenAiChatPromptDriver, + OpenAiChatPromptDriver, OpenAiEmbeddingDriver, ) -from griptape.engines import VectorQueryEngine +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.structures import Agent from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + agent = Agent( config=OpenAiStructureConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), @@ -223,21 +225,30 @@ agent = Agent( task_memory=TaskMemory( artifact_storages={ TextArtifact: TextArtifactStorage( - query_engine=VectorQueryEngine( - prompt_driver=AmazonBedrockPromptDriver( - model="amazon.titan-text-express-v1", - ), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=AmazonBedrockTitanEmbeddingDriver() + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace="griptape", + vector_store_driver=vector_store_driver, + top_n=20 + ) + ] ), + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + ) + ) ), - ), + vector_store_driver=vector_store_driver + ) } ), tools=[ WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=True, allowlist=["query"]), - FileManager(off_prompt=True), # FileManager returns an InfoArtifact which will not be stored in Task Memory regardless of the off_prompt setting + FileManager(off_prompt=True), ], ) @@ -247,27 +258,61 @@ agent.run( ``` ``` -[04/30/24 16:36:45] INFO ToolkitTask 3d3c5f5a98a44f32ad9533621c036604 - Input: According to this page https://en.wikipedia.org/wiki/Elden_Ring, find how many copies of Elden Ring have been sold and then save the - result to a file. -[04/30/24 16:36:52] INFO Subtask 61ec822bfe49472c9ed874fad07d13a1 - Thought: First, I need to scrape the content of the provided URL. Then, I will search the scraped content for the number of copies of Elden Ring that have been sold. Finally, I will save this information to a file. - - Actions: [{"name": "WebScraper", "path": "get_content", "input": {"values": {"url": "https://en.wikipedia.org/wiki/Elden_Ring"}}, "tag": "scrape_elden_ring"}] -[04/30/24 16:37:04] INFO Subtask 61ec822bfe49472c9ed874fad07d13a1 - Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace "c7a01e8202e24869b7be559e0daff110" -[04/30/24 16:37:10] INFO Subtask 32f9cb73d8944e5ca36bd68a90e4f4b2 - Thought: Now that the webpage content is stored in memory, I need to query this memory to find the number of copies of Elden Ring that have been sold. - Actions: [{"tag": "query_sales", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "c7a01e8202e24869b7be559e0daff110", "query": "How many copies of Elden Ring have been sold?"}}}] -[04/30/24 16:37:18] INFO Subtask 32f9cb73d8944e5ca36bd68a90e4f4b2 - Response: Output of "TaskMemoryClient.query" was stored in memory with memory_name "TaskMemory" and artifact_namespace "f8dd40fb302a47d7862c8b76eeaf61c2" -[04/30/24 16:37:25] INFO Subtask 74a5fd392b044956842a56b76d09183e - Thought: Now that I have the number of copies sold stored in memory, I need to save this information to a file. - Actions: [{"tag": "save_sales", "name": "FileManager", "path": "save_memory_artifacts_to_disk", "input": {"values": {"dir_name": "sales_data", "file_name": "elden_ring_sales.txt", "memory_name": "TaskMemory", "artifact_namespace": "f8dd40fb302a47d7862c8b76eeaf61c2"}}}] - INFO Subtask 74a5fd392b044956842a56b76d09183e - Response: Successfully saved memory artifacts to disk -[04/30/24 16:37:27] INFO ToolkitTask 3d3c5f5a98a44f32ad9533621c036604 - Output: The number of copies of Elden Ring sold has been successfully saved to the file "elden_ring_sales.txt" in the "sales_data" directory. +[06/21/24 16:00:01] INFO ToolkitTask 17f30ac14701490c8ef71508f420ea9f + Input: Use this page + https://en.wikipedia.org/wiki/Elden_Ring to find + how many copies of Elden Ring have been sold, and + then save the result to a file. +[06/21/24 16:00:05] INFO Subtask cb06889205334ec9afd7e97f7f231ab5 + Thought: First, I need to scrape the content of the + provided URL to find the information about how many + copies of Elden Ring have been sold. Then, I will + save this information to a file. + + Actions: [{"name": "WebScraper", "path": + "get_content", "input": {"values": {"url": + "https://en.wikipedia.org/wiki/Elden_Ring"}}, + "tag": "scrape_elden_ring"}] +[06/21/24 16:00:12] INFO Subtask cb06889205334ec9afd7e97f7f231ab5 + Response: Output of "WebScraper.get_content" was + stored in memory with memory_name "TaskMemory" and + artifact_namespace + "7e48bcff0da94ad3b06aa4e173f8f37b" +[06/21/24 16:00:17] INFO Subtask 56102d42475d413299ce52a0230506b7 + Thought: Now that the webpage content is stored in + memory, I need to query this memory to find the + information about how many copies of Elden Ring + have been sold. + Actions: [{"tag": "query_sales", "name": + "TaskMemoryClient", "path": "query", "input": + {"values": {"memory_name": "TaskMemory", + "artifact_namespace": + "7e48bcff0da94ad3b06aa4e173f8f37b", "query": "How + many copies of Elden Ring have been sold?"}}}] +[06/21/24 16:00:19] INFO Subtask 56102d42475d413299ce52a0230506b7 + Response: Output of "TaskMemoryClient.query" was + stored in memory with memory_name "TaskMemory" and + artifact_namespace + "9ecf4d7b7d0c46149dfc46ba236f178e" +[06/21/24 16:00:25] INFO Subtask ed2921791dcf46b68c9d8d2f8dbeddbd + Thought: Now that I have the sales information + stored in memory, I need to save this information + to a file. + Actions: [{"tag": "save_sales_info", "name": + "FileManager", "path": + "save_memory_artifacts_to_disk", "input": + {"values": {"dir_name": "sales_info", "file_name": + "elden_ring_sales.txt", "memory_name": + "TaskMemory", "artifact_namespace": + "9ecf4d7b7d0c46149dfc46ba236f178e"}}}] + INFO Subtask ed2921791dcf46b68c9d8d2f8dbeddbd + Response: Successfully saved memory artifacts to + disk +[06/21/24 16:00:27] INFO ToolkitTask 17f30ac14701490c8ef71508f420ea9f + Output: The information about how many copies of + Elden Ring have been sold has been successfully + saved to the file "elden_ring_sales.txt" in the + "sales_info" directory. ``` ## Tools That Can Read From Task Memory diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index c43603b1b..6bb517fa2 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -72,7 +72,7 @@ from griptape.structures import Agent agent = Agent() agent.add_task( # take the first argument from the agent `run` method - PromptTask("Respond to the users following request: {{ args[0] }}"), + PromptTask("Respond to the following request: {{ args[0] }}"), ) agent.run("Write me a haiku") @@ -80,7 +80,7 @@ agent.run("Write me a haiku") ``` [10/20/23 15:27:26] INFO PromptTask f5025c6352914e9f80ef730e5269985a - Input: Respond to the users following request: + Input: Respond to the following request: Write me a haiku [10/20/23 15:27:28] INFO PromptTask f5025c6352914e9f80ef730e5269985a Output: Gentle morning dew, @@ -350,40 +350,50 @@ agent.run( senses, bringing a revolution in technology. ``` -## Text Query Task +## RAG Task -To query text, use the [TextQueryTask](../../reference/griptape/tasks/text_query_task.md). -This Task takes a [Query Engine](../../griptape-framework/engines/query-engines.md), and a set of arguments specific to the engine. +To query text, use the [RagTask](../../reference/griptape/tasks/rag_task.md). +This task takes a [RAG Engine](../../griptape-framework/engines/rag-engines.md), and a set of arguments specific to the engine. ```python -from griptape.drivers import OpenAiChatPromptDriver from griptape.structures import Agent -from griptape.tasks import TextQueryTask -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.engines import VectorQueryEngine +from griptape.tasks import RagTask +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage # Initialize Embedding Driver and Vector Store Driver vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) -artifact = TextArtifact( - "Griptape builds AI-powered applications that connect securely to your enterprise data and APIs." - "Griptape Agents provide incredible power and flexibility when working with large language models." -) - -# Create a VectorQueryEngine using the LocalVectorStoreDriver -vector_query_engine = VectorQueryEngine( - vector_store_driver=vector_store_driver, - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo") -) -vector_query_engine.upsert_text_artifact(artifact=artifact) +artifacts = [ + TextArtifact("Griptape builds AI-powered applications that connect securely to your enterprise data and APIs."), + TextArtifact("Griptape Agents provide incredible power and flexibility when working with large language models.") +] +vector_store_driver.upsert_text_artifacts({"griptape": artifacts}) -# Instantiate the agent and add TextQueryTask with the VectorQueryEngine +# Instantiate the agent and add RagTask with the RagEngine agent = Agent() agent.add_task( - TextQueryTask( - "Respond to the users following query: {{ args[0] }}", - query_engine=vector_query_engine, + RagTask( + "Respond to the following query: {{ args[0] }}", + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace="griptape", + vector_store_driver=vector_store_driver, + top_n=20 + ) + ] + ), + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + ) + ) + ), ) ) @@ -391,21 +401,9 @@ agent.add_task( agent.run("Give me information about Griptape") ``` -``` -[10/20/23 15:32:39] INFO TextQueryTask a1d2eceab9204679b3f701f6ea821606 - Input: Respond to the users following query: Give - me information about Griptape -[10/20/23 15:32:41] INFO TextQueryTask a1d2eceab9204679b3f701f6ea821606 - Output: Griptape builds AI-powered applications - that connect securely to your enterprise data and - APIs. Griptape Agents provide incredible power and - flexibility when working with large language - models. -``` - ## Code Execution Task -To execute an arbitrary Python function, use the [CodeExecutionTask](../../reference/griptape/tasks/text_query_task.md). +To execute an arbitrary Python function, use the [CodeExecutionTask](../../reference/griptape/tasks/code_execution_task.md). This task takes a python function, and authors can elect to return a custom artifact. ```python @@ -627,7 +625,7 @@ pipeline.run("An image of a mountain shrouded by clouds") ## Image Query Task -The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) performs a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/query-engines.md#image) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. +The [Image Query Task](../../reference/griptape/tasks/image_query_task.md) performs a natural language query on one or more input images. This Task uses an [Image Query Engine](../engines/image-query-engines.md) configured with an [Image Query Driver](../drivers/image-query-drivers.md) to perform the query. The functionality provided by this Task depend on the capabilities of the model provided by the Driver. This Task accepts two inputs: a query (represented by either a string or a [Text Artifact](../data/artifacts.md#textartifact)) and a list of [Image Artifacts](../data/artifacts.md#imageartifact) or a Callable returning these two values. diff --git a/docs/griptape-tools/official-tools/rag-client.md b/docs/griptape-tools/official-tools/rag-client.md new file mode 100644 index 000000000..75bc5dee7 --- /dev/null +++ b/docs/griptape-tools/official-tools/rag-client.md @@ -0,0 +1,49 @@ +The [RagClient](../../reference/griptape/tools/rag_client/tool.md) enables LLMs to query modular RAG engines. + +Here is an example of how it can be used with a local vector store driver: + +```python +from griptape.structures import Agent +from griptape.tasks import RagTask +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage + +# Initialize Embedding Driver and Vector Store Driver +vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) + +artifact = TextArtifact( + "Griptape builds AI-powered applications that connect securely to your enterprise data and APIs." + "Griptape Agents provide incredible power and flexibility when working with large language models." +) +vector_store_driver.upsert_text_artifact(artifact=artifact, namespace="griptape") + +# Instantiate the agent and add RagTask with the RagEngine +agent = Agent() +agent.add_task( + RagTask( + "Respond to the following query: {{ args[0] }}", + rag_engine=RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + namespace="griptape", + vector_store_driver=vector_store_driver, + top_n=20 + ) + ] + ), + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") + ) + ) + ), + ) +) + +# Run the agent with a query string +agent.run("Give me information about Griptape") +``` diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md index 5af8cee88..ffdbbba91 100644 --- a/docs/griptape-tools/official-tools/vector-store-client.md +++ b/docs/griptape-tools/official-tools/vector-store-client.md @@ -1,29 +1,26 @@ -The [VectorStoreClient](../../reference/griptape/tools/vector_store_client/tool.md) enables LLMs to dynamically query task memory. +The [VectorStoreClient](../../reference/griptape/tools/vector_store_client/tool.md) enables LLMs to query vector stores. -Here is an example of how it can be used with the Pincone storage driver: +Here is an example of how it can be used with a local vector store driver: ```python from griptape.structures import Agent from griptape.tools import VectorStoreClient, TaskMemoryClient from griptape.loaders import WebLoader -from griptape.engines import VectorQueryEngine -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver -engine = VectorQueryEngine( - prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver(), - ), +vector_store_driver = LocalVectorStoreDriver( + embedding_driver=OpenAiEmbeddingDriver(), ) -engine.upsert_text_artifacts( - WebLoader().load("https://www.griptape.ai"), - namespace="griptape" +vector_store_driver.upsert_text_artifacts( + { + "griptape": WebLoader().load("https://www.griptape.ai") + } ) vector_db = VectorStoreClient( description="This DB has information about the Griptape Python framework", - query_engine=engine, + vector_store_driver=vector_store_driver, namespace="griptape", off_prompt=True ) diff --git a/griptape/artifacts/media_artifact.py b/griptape/artifacts/media_artifact.py index 92cc0d9cd..2848ec1bb 100644 --- a/griptape/artifacts/media_artifact.py +++ b/griptape/artifacts/media_artifact.py @@ -29,7 +29,7 @@ class MediaArtifact(BlobArtifact): model: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) prompt: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: # Generating the name string requires attributes set by child classes. # This waits until all attributes are available before generating a name. if self.name == self.id: diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 94198b734..34b43103b 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -90,6 +90,9 @@ from .file_manager.local_file_manager_driver import LocalFileManagerDriver from .file_manager.amazon_s3_file_manager_driver import AmazonS3FileManagerDriver +from .rerank.base_rerank_driver import BaseRerankDriver +from .rerank.cohere_rerank_driver import CohereRerankDriver + from .text_to_speech.base_text_to_speech_driver import BaseTextToSpeechDriver from .text_to_speech.dummy_text_to_speech_driver import DummyTextToSpeechDriver from .text_to_speech.elevenlabs_text_to_speech_driver import ElevenLabsTextToSpeechDriver @@ -181,6 +184,8 @@ "BaseFileManagerDriver", "LocalFileManagerDriver", "AmazonS3FileManagerDriver", + "BaseRerankDriver", + "CohereRerankDriver", "BaseTextToSpeechDriver", "DummyTextToSpeechDriver", "ElevenLabsTextToSpeechDriver", diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 9ef076dbc..45f95d544 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -14,7 +14,7 @@ from griptape.structures import Structure -@define +@define(kw_only=True) class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): """Base class for Prompt Drivers. @@ -29,15 +29,13 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): stream: Whether to stream the completion or not. `CompletionChunkEvent`s will be published to the `Structure` if one is provided. """ - temperature: float = field(default=0.1, kw_only=True, metadata={"serializable": True}) - max_tokens: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) - structure: Optional[Structure] = field(default=None, kw_only=True) - ignored_exception_types: tuple[type[Exception], ...] = field( - default=Factory(lambda: (ImportError, ValueError)), kw_only=True - ) + temperature: float = field(default=0.1, metadata={"serializable": True}) + max_tokens: Optional[int] = field(default=None, metadata={"serializable": True}) + structure: Optional[Structure] = field(default=None) + ignored_exception_types: tuple[type[Exception], ...] = field(default=Factory(lambda: (ImportError, ValueError))) model: str = field(metadata={"serializable": True}) tokenizer: BaseTokenizer - stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + stream: bool = field(default=False, metadata={"serializable": True}) def before_run(self, prompt_stack: PromptStack) -> None: if self.structure: diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 3ff2c9e89..ca199011a 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -11,7 +11,7 @@ from cohere import Client -@define +@define(kw_only=True) class CoherePromptDriver(BasePromptDriver): """ Attributes: @@ -20,15 +20,13 @@ class CoherePromptDriver(BasePromptDriver): client: Custom `cohere.Client`. """ - api_key: str = field(kw_only=True, metadata={"serializable": False}) - model: str = field(kw_only=True, metadata={"serializable": True}) + api_key: str = field(metadata={"serializable": False}) + model: str = field(metadata={"serializable": True}) client: Client = field( - default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), - kw_only=True, + default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True) ) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True), - kw_only=True, + default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True) ) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: diff --git a/griptape/engines/query/__init__.py b/griptape/drivers/rerank/__init__.py similarity index 100% rename from griptape/engines/query/__init__.py rename to griptape/drivers/rerank/__init__.py diff --git a/griptape/drivers/rerank/base_rerank_driver.py b/griptape/drivers/rerank/base_rerank_driver.py new file mode 100644 index 000000000..975575d49 --- /dev/null +++ b/griptape/drivers/rerank/base_rerank_driver.py @@ -0,0 +1,9 @@ +from abc import ABC, abstractmethod +from attrs import define +from griptape.artifacts import TextArtifact + + +@define(kw_only=True) +class BaseRerankDriver(ABC): + @abstractmethod + def run(self, query: str, artifacts: list[TextArtifact]) -> list[TextArtifact]: ... diff --git a/griptape/drivers/rerank/cohere_rerank_driver.py b/griptape/drivers/rerank/cohere_rerank_driver.py new file mode 100644 index 000000000..206706476 --- /dev/null +++ b/griptape/drivers/rerank/cohere_rerank_driver.py @@ -0,0 +1,31 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Optional +from attrs import define, field, Factory +from griptape.artifacts import TextArtifact +from griptape.drivers import BaseRerankDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from cohere import Client + + +@define(kw_only=True) +class CohereRerankDriver(BaseRerankDriver): + model: str = field(default="rerank-english-v3.0", metadata={"serializable": True}) + top_n: Optional[int] = field(default=None) + + api_key: str = field(metadata={"serializable": True}) + client: Client = field( + default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True) + ) + + def run(self, query: str, artifacts: list[TextArtifact]) -> list[TextArtifact]: + response = self.client.rerank( + model=self.model, + query=query, + documents=[a.value for a in artifacts], + return_documents=True, + top_n=self.top_n, + ) + + return [TextArtifact(r.document.text) for r in response.results] diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index 2e9968b63..e29a7fa70 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -16,7 +16,7 @@ def query( include_vectors: bool = False, offset: Optional[int] = None, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Queries the MongoDB collection for documents that match the provided query string. Results can be customized based on parameters like count, namespace, inclusion of vectors, offset, and index. @@ -50,7 +50,7 @@ def query( pipeline.append({"$project": {"similarityScore": {"$meta": "searchScore"}, "document": "$$ROOT"}}) return [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=str(doc["_id"]), vector=doc[self.vector_path] if include_vectors else [], score=doc["similarityScore"], diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 55a758da1..71f1c1061 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -2,33 +2,34 @@ from abc import ABC, abstractmethod from concurrent import futures from dataclasses import dataclass -from attrs import define, field, Factory +from typing import Any from typing import Optional +from attrs import define, field, Factory from griptape import utils -from griptape.mixins import SerializableMixin -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact from griptape.drivers import BaseEmbeddingDriver +from griptape.mixins import SerializableMixin @define class BaseVectorStoreDriver(SerializableMixin, ABC): DEFAULT_QUERY_COUNT = 5 - @dataclass - class QueryResult: - id: str - vector: Optional[list[float]] - score: float - meta: Optional[dict] = None - namespace: Optional[str] = None - @dataclass class Entry: id: str - vector: list[float] + vector: Optional[list[float]] = None + score: Optional[float] = None meta: Optional[dict] = None namespace: Optional[str] = None + @staticmethod + def from_dict(data: dict[str, Any]) -> BaseVectorStoreDriver.Entry: + return BaseVectorStoreDriver.Entry(**data) + + def to_artifact(self) -> BaseArtifact: + return BaseArtifact.from_json(self.meta["artifact"]) # pyright: ignore[reportOptionalSubscript] + embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) @@ -44,22 +45,30 @@ def upsert_text_artifacts( ) def upsert_text_artifact( - self, artifact: TextArtifact, namespace: Optional[str] = None, meta: Optional[dict] = None, **kwargs + self, + artifact: TextArtifact, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + vector_id: Optional[str] = None, + **kwargs, ) -> str: - if not meta: - meta = {} + meta = {} if meta is None else meta + vector_id = utils.str_to_hash(artifact.value) if vector_id is None else vector_id - meta["artifact"] = artifact.to_json() - - if artifact.embedding: - vector = artifact.embedding + if self.does_entry_exist(vector_id, namespace): + return vector_id else: - vector = artifact.generate_embedding(self.embedding_driver) + meta["artifact"] = artifact.to_json() - if isinstance(vector, list): - return self.upsert_vector(vector, vector_id=artifact.id, namespace=namespace, meta=meta, **kwargs) - else: - raise ValueError("Vector must be an instance of 'list'.") + if artifact.embedding: + vector = artifact.embedding + else: + vector = artifact.generate_embedding(self.embedding_driver) + + if isinstance(vector, list): + return self.upsert_vector(vector, vector_id=vector_id, namespace=namespace, meta=meta, **kwargs) + else: + raise ValueError("Vector must be an instance of 'list'.") def upsert_text( self, @@ -69,13 +78,27 @@ def upsert_text( meta: Optional[dict] = None, **kwargs, ) -> str: - return self.upsert_vector( - self.embedding_driver.embed_string(string), - vector_id=vector_id, - namespace=namespace, - meta=meta if meta else {}, - **kwargs, - ) + vector_id = utils.str_to_hash(string) if vector_id is None else vector_id + + if self.does_entry_exist(vector_id, namespace): + return vector_id + else: + return self.upsert_vector( + self.embedding_driver.embed_string(string), + vector_id=vector_id, + namespace=namespace, + meta=meta if meta else {}, + **kwargs, + ) + + def does_entry_exist(self, vector_id: str, namespace: Optional[str] = None) -> bool: + return self.load_entry(vector_id, namespace) is not None + + def load_artifacts(self, namespace: Optional[str] = None) -> ListArtifact: + result = self.load_entries(namespace) + artifacts = [r.to_artifact() for r in result] + + return ListArtifact([a for a in artifacts if isinstance(a, TextArtifact)]) @abstractmethod def delete_vector(self, vector_id: str) -> None: ... @@ -104,4 +127,4 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, **kwargs, - ) -> list[QueryResult]: ... + ) -> list[Entry]: ... diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index f53a5eb90..04dea2181 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -36,5 +36,5 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: raise DummyException(__class__.__name__, "query") diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index 4b9dae00f..1a86225c6 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -1,15 +1,49 @@ -from typing import Optional, Callable +import json +import os +import threading +from dataclasses import asdict +from typing import Optional, Callable, TextIO +from attrs import define, field, Factory from numpy import dot from numpy.linalg import norm from griptape import utils from griptape.drivers import BaseVectorStoreDriver -from attrs import define, field -@define +@define(kw_only=True) class LocalVectorStoreDriver(BaseVectorStoreDriver): - entries: dict[str, BaseVectorStoreDriver.Entry] = field(factory=dict, kw_only=True) - relatedness_fn: Callable = field(default=lambda x, y: dot(x, y) / (norm(x) * norm(y)), kw_only=True) + entries: dict[str, BaseVectorStoreDriver.Entry] = field(factory=dict) + persist_file: Optional[str] = field(default=None) + relatedness_fn: Callable = field(default=lambda x, y: dot(x, y) / (norm(x) * norm(y))) + thread_lock: threading.Lock = field(default=Factory(lambda: threading.Lock())) + + def __attrs_post_init__(self) -> None: + if self.persist_file is not None: + directory = os.path.dirname(self.persist_file) + + if directory and not os.path.exists(directory): + os.makedirs(directory) + + if not os.path.isfile(self.persist_file): + with open(self.persist_file, "w") as file: + self.save_entries_to_file(file) + + with open(self.persist_file, "r+") as file: + if os.path.getsize(self.persist_file) > 0: + self.entries = self.load_entries_from_file(file) + else: + self.save_entries_to_file(file) + + def save_entries_to_file(self, json_file: TextIO) -> None: + with self.thread_lock: + serialized_data = {k: asdict(v) for k, v in self.entries.items()} + + json.dump(serialized_data, json_file) + + def load_entries_from_file(self, json_file: TextIO) -> dict[str, BaseVectorStoreDriver.Entry]: + data = json.load(json_file) + + return {k: BaseVectorStoreDriver.Entry.from_dict(v) for k, v in data.items()} def upsert_vector( self, @@ -21,9 +55,16 @@ def upsert_vector( ) -> str: vector_id = vector_id if vector_id else utils.str_to_hash(str(vector)) - self.entries[self._namespaced_vector_id(vector_id, namespace)] = self.Entry( - id=vector_id, vector=vector, meta=meta, namespace=namespace - ) + with self.thread_lock: + self.entries[self._namespaced_vector_id(vector_id, namespace)] = self.Entry( + id=vector_id, vector=vector, meta=meta, namespace=namespace + ) + + if self.persist_file is not None: + # TODO: optimize later since it reserializes all entries from memory and stores them in the JSON file + # every time a new vector is inserted + with open(self.persist_file, "w") as file: + self.save_entries_to_file(file) return vector_id @@ -40,7 +81,7 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: query_embedding = self.embedding_driver.embed_string(query) if namespace: @@ -54,7 +95,7 @@ def query( entries_and_relatednesses.sort(key=lambda x: x[1], reverse=True) result = [ - BaseVectorStoreDriver.QueryResult(id=er[0].id, vector=er[0].vector, score=er[1], meta=er[0].meta) + BaseVectorStoreDriver.Entry(id=er[0].id, vector=er[0].vector, score=er[1], meta=er[0].meta) for er in entries_and_relatednesses ][:count] @@ -62,12 +103,12 @@ def query( return result else: return [ - BaseVectorStoreDriver.QueryResult(id=r.id, vector=[], score=r.score, meta=r.meta, namespace=r.namespace) + BaseVectorStoreDriver.Entry(id=r.id, vector=[], score=r.score, meta=r.meta, namespace=r.namespace) for r in result ] - def _namespaced_vector_id(self, vector_id: str, namespace: Optional[str]): - return vector_id if namespace is None else f"{namespace}-{vector_id}" - def delete_vector(self, vector_id: str): raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") + + def _namespaced_vector_id(self, vector_id: str, namespace: Optional[str]): + return vector_id if namespace is None else f"{namespace}-{vector_id}" diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index cccc716f8..f20530cff 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -1,5 +1,6 @@ from __future__ import annotations from typing import Optional, Any, TYPE_CHECKING +from griptape import utils from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver from griptape.artifacts import TextArtifact @@ -65,7 +66,12 @@ def upsert_text( raise ValueError(f"Failed to upsert text: {response}") def upsert_text_artifact( - self, artifact: TextArtifact, namespace: Optional[str] = None, meta: Optional[dict] = None, **kwargs + self, + artifact: TextArtifact, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + vector_id: Optional[str] = None, + **kwargs, ) -> str: """Upsert a text artifact into the Marqo index. @@ -73,15 +79,17 @@ def upsert_text_artifact( artifact: The text artifact to be indexed. namespace: An optional namespace for the artifact. meta: An optional dictionary of metadata for the artifact. + vector_id: An optional explicit vector_id. Returns: str: The ID of the artifact that was added. """ artifact_json = artifact.to_json() + vector_id = utils.str_to_hash(artifact.value) if vector_id is None else vector_id doc = { - "_id": artifact.id, + "_id": vector_id, "Description": artifact.value, # Description will be treated as tensor field "artifact": str(artifact_json), "namespace": namespace, @@ -160,7 +168,7 @@ def query( include_vectors: bool = False, include_metadata: bool = True, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Query the Marqo index for documents. Args: @@ -188,7 +196,7 @@ def query( ] return [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=r["_id"], vector=r["_tensor_facets"][0]["_embedding"] if include_vectors else [], score=r["_score"], diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index c5368de3d..73bcc02c7 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -110,7 +110,7 @@ def query( include_vectors: bool = False, offset: Optional[int] = None, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Queries the MongoDB collection for documents that match the provided query string. Results can be customized based on parameters like count, namespace, inclusion of vectors, offset, and index. @@ -148,7 +148,7 @@ def query( pipeline[0]["$vectorSearch"]["filter"] = {"namespace": namespace} results = [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=str(doc["_id"]), vector=doc[self.vector_path] if include_vectors else [], score=doc["score"], diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 7ff00d2de..81add74aa 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -127,13 +127,13 @@ def query( include_metadata=True, field_name: str = "vector", **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Performs a nearest neighbor search on OpenSearch to find vectors similar to the provided query string. Results can be limited using the count parameter and optionally filtered by a namespace. Returns: - A list of BaseVectorStoreDriver.QueryResult objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. + A list of BaseVectorStoreDriver.Entry objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. """ count = count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT vector = self.embedding_driver.embed_string(query) @@ -150,7 +150,7 @@ def query( response = self.client.search(index=self.index_name, body=query_body) return [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=hit["_id"], namespace=hit["_source"].get("namespace") if namespace else None, score=hit["_score"], diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 8058c8774..29c657589 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -127,7 +127,7 @@ def query( include_vectors: bool = False, distance_metric: str = "cosine_distance", **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Performs a search on the collection to find vectors similar to the provided input vector, optionally filtering to only those that match the provided namespace. """ @@ -163,7 +163,7 @@ def query( results = query_result.limit(count).all() return [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=str(result[0].id), vector=result[0].vector if include_vectors else None, score=result[1], diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index daf378087..6da2f2418 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -77,7 +77,7 @@ def query( # PineconeVectorStorageDriver-specific params: include_metadata=True, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: vector = self.embedding_driver.embed_string(query) params = { @@ -90,7 +90,7 @@ def query( results = self.index.query(vector=vector, **params) return [ - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=r["id"], vector=r["values"], score=r["score"], meta=r["metadata"], namespace=results["namespace"] ) for r in results["matches"] diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 6e39775b7..e58e4b3ea 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -1,14 +1,11 @@ from __future__ import annotations import json -import logging import numpy as np from griptape.utils import import_optional_dependency, str_to_hash from typing import Optional, TYPE_CHECKING from attrs import define, field, Factory from griptape.drivers import BaseVectorStoreDriver -logging.basicConfig(level=logging.WARNING) - if TYPE_CHECKING: from redis import Redis @@ -111,13 +108,13 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, **kwargs, - ) -> list[BaseVectorStoreDriver.QueryResult]: + ) -> list[BaseVectorStoreDriver.Entry]: """Performs a nearest neighbor search on Redis to find vectors similar to the provided input vector. Results can be limited using the count parameter and optionally filtered by a namespace. Returns: - A list of BaseVectorStoreDriver.QueryResult objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. + A list of BaseVectorStoreDriver.Entry objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. """ Query = import_optional_dependency("redis.commands.search.query").Query @@ -143,7 +140,7 @@ def query( vector_id = document.id.split(":")[1] if ":" in document.id else document.id vector_float_list = json.loads(document.vec_string) if include_vectors else None query_results.append( - BaseVectorStoreDriver.QueryResult( + BaseVectorStoreDriver.Entry( id=vector_id, vector=vector_float_list, score=float(document.score), diff --git a/griptape/engines/__init__.py b/griptape/engines/__init__.py index 17adaa53d..7835b2238 100644 --- a/griptape/engines/__init__.py +++ b/griptape/engines/__init__.py @@ -1,8 +1,6 @@ from .extraction.base_extraction_engine import BaseExtractionEngine from .extraction.csv_extraction_engine import CsvExtractionEngine from .extraction.json_extraction_engine import JsonExtractionEngine -from .query.base_query_engine import BaseQueryEngine -from .query.vector_query_engine import VectorQueryEngine from .summary.base_summary_engine import BaseSummaryEngine from .summary.prompt_summary_engine import PromptSummaryEngine from .image.base_image_generation_engine import BaseImageGenerationEngine @@ -15,8 +13,6 @@ from .audio.audio_transcription_engine import AudioTranscriptionEngine __all__ = [ - "BaseQueryEngine", - "VectorQueryEngine", "BaseSummaryEngine", "PromptSummaryEngine", "BaseExtractionEngine", diff --git a/griptape/engines/query/base_query_engine.py b/griptape/engines/query/base_query_engine.py deleted file mode 100644 index 61a488547..000000000 --- a/griptape/engines/query/base_query_engine.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations -from abc import ABC, abstractmethod -from attrs import define -from typing import Optional -from griptape.artifacts import TextArtifact, ListArtifact -from griptape.rules import Ruleset - - -@define -class BaseQueryEngine(ABC): - @abstractmethod - def query( - self, - query: str, - namespace: Optional[str] = None, - *, - rulesets: Optional[list[Ruleset]] = None, - top_n: Optional[int] = None, - filter: Optional[dict] = None, - ) -> TextArtifact: ... - - @abstractmethod - def load_artifacts(self, namespace: str) -> ListArtifact: ... - - @abstractmethod - def upsert_text_artifact(self, artifact: TextArtifact, namespace: Optional[str] = None) -> str: ... - - @abstractmethod - def upsert_text_artifacts(self, artifacts: list[TextArtifact], namespace: str) -> None: ... diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py deleted file mode 100644 index 24338b348..000000000 --- a/griptape/engines/query/vector_query_engine.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import annotations -from typing import TYPE_CHECKING, Optional -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact -from griptape.utils import PromptStack -from griptape.engines import BaseQueryEngine -from griptape.utils.j2 import J2 -from griptape.rules import Ruleset - -if TYPE_CHECKING: - from griptape.drivers import BaseVectorStoreDriver, BasePromptDriver - - -@define -class VectorQueryEngine(BaseQueryEngine): - answer_token_offset: int = field(default=400, kw_only=True) - vector_store_driver: BaseVectorStoreDriver = field(kw_only=True) - prompt_driver: BasePromptDriver = field(kw_only=True) - user_template_generator: J2 = field(default=Factory(lambda: J2("engines/query/user.j2")), kw_only=True) - system_template_generator: J2 = field(default=Factory(lambda: J2("engines/query/system.j2")), kw_only=True) - - def query( - self, - query: str, - namespace: Optional[str] = None, - *, - rulesets: Optional[list[Ruleset]] = None, - metadata: Optional[str] = None, - top_n: Optional[int] = None, - filter: Optional[dict] = None, - ) -> TextArtifact: - tokenizer = self.prompt_driver.tokenizer - result = self.vector_store_driver.query(query, top_n, namespace, filter=filter) - artifacts = [ - artifact - for artifact in [BaseArtifact.from_json(r.meta["artifact"]) for r in result if r.meta] - if isinstance(artifact, TextArtifact) - ] - text_segments = [] - user_message = "" - system_message = "" - - for artifact in artifacts: - text_segments.append(artifact.value) - system_message = self.system_template_generator.render( - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), - metadata=metadata, - text_segments=text_segments, - ) - user_message = self.user_template_generator.render(query=query) - - message_token_count = self.prompt_driver.tokenizer.count_input_tokens_left( - self.prompt_driver.prompt_stack_to_string( - PromptStack( - inputs=[ - PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(user_message, role=PromptStack.USER_ROLE), - ] - ) - ) - ) - - if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: - text_segments.pop() - - system_message = self.system_template_generator.render( - rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), - metadata=metadata, - text_segments=text_segments, - ) - - break - - return self.prompt_driver.run( - PromptStack( - inputs=[ - PromptStack.Input(system_message, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(user_message, role=PromptStack.USER_ROLE), - ] - ) - ) - - def upsert_text_artifact(self, artifact: TextArtifact, namespace: Optional[str] = None) -> str: - result = self.vector_store_driver.upsert_text_artifact(artifact, namespace=namespace) - - return result - - def upsert_text_artifacts(self, artifacts: list[TextArtifact], namespace: str) -> None: - self.vector_store_driver.upsert_text_artifacts({namespace: artifacts}) - - def load_artifacts(self, namespace: str) -> ListArtifact: - result = self.vector_store_driver.load_entries(namespace) - artifacts = [BaseArtifact.from_json(r.meta["artifact"]) for r in result if r.meta and r.meta.get("artifact")] - - return ListArtifact([a for a in artifacts if isinstance(a, TextArtifact)]) diff --git a/griptape/engines/rag/__init__.py b/griptape/engines/rag/__init__.py new file mode 100644 index 000000000..f009772fb --- /dev/null +++ b/griptape/engines/rag/__init__.py @@ -0,0 +1,4 @@ +from .rag_context import RagContext +from .rag_engine import RagEngine + +__all__ = ["RagContext", "RagEngine"] diff --git a/griptape/engines/rag/modules/__init__.py b/griptape/engines/rag/modules/__init__.py new file mode 100644 index 000000000..a9550d8bb --- /dev/null +++ b/griptape/engines/rag/modules/__init__.py @@ -0,0 +1,29 @@ +from .base_rag_module import BaseRagModule +from .query.base_query_rag_module import BaseQueryRagModule +from .query.related_query_generation_rag_module import RelatedQueryGenerationRagModule +from .retrieval.base_retrieval_rag_module import BaseRetrievalRagModule +from .retrieval.base_rerank_rag_module import BaseRerankRagModule +from .retrieval.text_rerank_rag_module import TextRerankRagModule +from .retrieval.text_retrieval_rag_module import TextRetrievalRagModule +from .generation.base_before_generation_rag_module import BaseBeforeGenerationRagModule +from .generation.base_after_generation_rag_module import BaseAfterGenerationRagModule +from .generation.base_generation_rag_module import BaseGenerationRagModule +from .generation.prompt_generation_rag_module import PromptGenerationRagModule +from .generation.rulesets_generation_rag_module import RulesetsGenerationRagModule +from .generation.metadata_generation_rag_module import MetadataGenerationRagModule + +__all__ = [ + "BaseRagModule", + "BaseQueryRagModule", + "RelatedQueryGenerationRagModule", + "BaseRetrievalRagModule", + "BaseRerankRagModule", + "TextRerankRagModule", + "TextRetrievalRagModule", + "BaseBeforeGenerationRagModule", + "BaseAfterGenerationRagModule", + "BaseGenerationRagModule", + "PromptGenerationRagModule", + "RulesetsGenerationRagModule", + "MetadataGenerationRagModule", +] diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py new file mode 100644 index 000000000..958cbd46c --- /dev/null +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -0,0 +1,18 @@ +from abc import ABC +from concurrent import futures +from attrs import define, field, Factory + +from griptape.utils import PromptStack + + +@define(kw_only=True) +class BaseRagModule(ABC): + futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor())) + + def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptStack: + return PromptStack( + inputs=[ + PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), + PromptStack.Input(query, role=PromptStack.USER_ROLE), + ] + ) diff --git a/tests/unit/engines/query/__init__.py b/griptape/engines/rag/modules/generation/__init__.py similarity index 100% rename from tests/unit/engines/query/__init__.py rename to griptape/engines/rag/modules/generation/__init__.py diff --git a/griptape/engines/rag/modules/generation/base_after_generation_rag_module.py b/griptape/engines/rag/modules/generation/base_after_generation_rag_module.py new file mode 100644 index 000000000..f3a26e9db --- /dev/null +++ b/griptape/engines/rag/modules/generation/base_after_generation_rag_module.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from attrs import define +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseAfterGenerationRagModule(BaseRagModule, ABC): + @abstractmethod + def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/generation/base_before_generation_rag_module.py b/griptape/engines/rag/modules/generation/base_before_generation_rag_module.py new file mode 100644 index 000000000..6a57bd6af --- /dev/null +++ b/griptape/engines/rag/modules/generation/base_before_generation_rag_module.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from attrs import define +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseBeforeGenerationRagModule(BaseRagModule, ABC): + @abstractmethod + def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/generation/base_generation_rag_module.py b/griptape/engines/rag/modules/generation/base_generation_rag_module.py new file mode 100644 index 000000000..08f1b5323 --- /dev/null +++ b/griptape/engines/rag/modules/generation/base_generation_rag_module.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from attrs import define +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseGenerationRagModule(BaseRagModule, ABC): + @abstractmethod + def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py b/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py new file mode 100644 index 000000000..1ce689960 --- /dev/null +++ b/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py @@ -0,0 +1,20 @@ +from typing import Optional +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseBeforeGenerationRagModule +from griptape.utils import J2 + + +@define(kw_only=True) +class MetadataGenerationRagModule(BaseBeforeGenerationRagModule): + metadata: Optional[str] = field(default=None) + + def run(self, context: RagContext) -> RagContext: + metadata = context.metadata if self.metadata is None else self.metadata + + if metadata is not None: + context.before_query.append( + J2("engines/rag/modules/metadata_generation/system.j2").render(metadata=metadata) + ) + + return context diff --git a/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py b/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py new file mode 100644 index 000000000..9e7c3b08f --- /dev/null +++ b/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py @@ -0,0 +1,54 @@ +from typing import Callable +from attrs import define, field, Factory +from griptape.drivers import BasePromptDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseGenerationRagModule +from griptape.utils import J2 + + +@define(kw_only=True) +class PromptGenerationRagModule(BaseGenerationRagModule): + answer_token_offset: int = field(default=400) + prompt_driver: BasePromptDriver = field() + generate_system_template: Callable[[list[str], list[str], list[str]], str] = field( + default=Factory(lambda self: self.default_system_template_generator, takes_self=True) + ) + + def run(self, context: RagContext) -> RagContext: + query = context.initial_query + before_query = context.before_query + after_query = context.after_query + text_artifact_chunks = context.text_chunks + + if query: + tokenizer = self.prompt_driver.tokenizer + text_chunks = [] + system_prompt = "" + + for artifact in text_artifact_chunks: + text_chunks.append(artifact.value) + + system_prompt = self.generate_system_template(text_chunks, before_query, after_query) + message_token_count = self.prompt_driver.tokenizer.count_tokens( + self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)) + ) + + if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: + text_chunks.pop() + + system_prompt = self.generate_system_template(text_chunks, before_query, after_query) + + break + + context.output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)) + + return context + + def default_system_template_generator( + self, text_chunks: list[str], before_system_prompt: list, after_system_prompt: list + ) -> str: + return J2("engines/rag/modules/prompt_generation/system.j2").render( + text_chunks=text_chunks, + before_system_prompt="\n\n".join(before_system_prompt), + after_system_prompt="\n\n".join(after_system_prompt), + ) diff --git a/griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py b/griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py new file mode 100644 index 000000000..ff29c379a --- /dev/null +++ b/griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py @@ -0,0 +1,15 @@ +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseBeforeGenerationRagModule +from griptape.rules import Ruleset +from griptape.utils import J2 + + +@define +class RulesetsGenerationRagModule(BaseBeforeGenerationRagModule): + rulesets: list[Ruleset] = field(kw_only=True) + + def run(self, context: RagContext) -> RagContext: + context.before_query.append(J2("rulesets/rulesets.j2").render(rulesets=self.rulesets)) + + return context diff --git a/griptape/engines/rag/modules/query/__init__.py b/griptape/engines/rag/modules/query/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/engines/rag/modules/query/base_query_rag_module.py b/griptape/engines/rag/modules/query/base_query_rag_module.py new file mode 100644 index 000000000..c9eace864 --- /dev/null +++ b/griptape/engines/rag/modules/query/base_query_rag_module.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from attrs import define +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseQueryRagModule(BaseRagModule, ABC): + @abstractmethod + def run(self, context: RagContext) -> list[str]: ... diff --git a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py new file mode 100644 index 000000000..4661e24a2 --- /dev/null +++ b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py @@ -0,0 +1,33 @@ +from typing import Callable +from attrs import define, field, Factory +from griptape import utils +from griptape.drivers import BasePromptDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseQueryRagModule +from griptape.utils import J2 + + +@define(kw_only=True) +class RelatedQueryGenerationRagModule(BaseQueryRagModule): + query_count: int = field(default=5) + prompt_driver: BasePromptDriver = field() + generate_system_template: Callable[[str], str] = field( + default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True + ) + + def run(self, context: RagContext) -> list[str]: + system_prompt = self.generate_system_template(context.initial_query) + + results = utils.execute_futures_list( + [ + self.futures_executor.submit( + self.prompt_driver.run, self.generate_query_prompt_stack(system_prompt, "Alternative query: ") + ) + for _ in range(self.query_count) + ] + ) + + return [r.value for r in results] + + def default_system_template_generator(self, initial_query: str) -> str: + return J2("engines/rag/modules/query_generation/system.j2").render(initial_query=initial_query) diff --git a/griptape/engines/rag/modules/retrieval/__init__.py b/griptape/engines/rag/modules/retrieval/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py b/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py new file mode 100644 index 000000000..8ecf9f046 --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod +from typing import Sequence + +from attrs import define, field +from griptape.artifacts import BaseArtifact +from griptape.drivers import BaseRerankDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseRerankRagModule(BaseRagModule, ABC): + rerank_driver: BaseRerankDriver = field() + + @abstractmethod + def run(self, context: RagContext) -> Sequence[BaseArtifact]: ... diff --git a/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py new file mode 100644 index 000000000..f11537d9f --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod +from typing import Sequence +from attrs import define +from griptape.artifacts import BaseArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule + + +@define(kw_only=True) +class BaseRetrievalRagModule(BaseRagModule, ABC): + @abstractmethod + def run(self, context: RagContext) -> Sequence[BaseArtifact]: ... diff --git a/griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py b/griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py new file mode 100644 index 000000000..a766d0cb6 --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py @@ -0,0 +1,12 @@ +from typing import Sequence + +from attrs import define +from griptape.artifacts import BaseArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRerankRagModule + + +@define(kw_only=True) +class TextRerankRagModule(BaseRerankRagModule): + def run(self, context: RagContext) -> Sequence[BaseArtifact]: + return self.rerank_driver.run(context.initial_query, context.text_chunks) diff --git a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py new file mode 100644 index 000000000..5c6bedac4 --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py @@ -0,0 +1,35 @@ +from __future__ import annotations +import itertools +from typing import TYPE_CHECKING, Optional, Sequence +from attrs import define, field +from griptape import utils +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRetrievalRagModule + +if TYPE_CHECKING: + from griptape.drivers import BaseVectorStoreDriver + + +@define(kw_only=True) +class TextRetrievalRagModule(BaseRetrievalRagModule): + vector_store_driver: BaseVectorStoreDriver = field() + namespace: Optional[str] = field(default=None) + top_n: Optional[int] = field(default=None) + + def run(self, context: RagContext) -> Sequence[TextArtifact]: + all_queries = [context.initial_query] + context.alternative_queries + namespace = self.namespace or context.namespace + + results = utils.execute_futures_list( + [ + self.futures_executor.submit(self.vector_store_driver.query, query, self.top_n, namespace, False) + for query in all_queries + ] + ) + + return [ + artifact + for artifact in [r.to_artifact() for r in list(itertools.chain.from_iterable(results))] + if isinstance(artifact, TextArtifact) + ] diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py new file mode 100644 index 000000000..5f8ce9d6a --- /dev/null +++ b/griptape/engines/rag/rag_context.py @@ -0,0 +1,29 @@ +from typing import Optional +from attrs import define, field +from griptape.artifacts import TextArtifact + + +@define(kw_only=True) +class RagContext: + """Used by RagEngine stages and module to pass context that individual modules are expected to update in the `run` + method. + + Attributes: + initial_query: Query provided by the user. + namespace: Optional namespace override for modules with an explicit namespace parameter. + metadata: Optional metadata override for modules with an explicit metadata parameter. + alternative_queries: Optional queries to expand retrieval results. + before_query: An optional list of strings to add before the query in generation modules. + after_query: An optional list of strings to add after the query in generation modules. + text_chunks: A list of text chunks to pass around from the retrieval stage to the generation stage. + output: Final output from the generation stage. + """ + + initial_query: str = field() + namespace: Optional[str] = field(default=None) + metadata: Optional[str] = field(default=None) + alternative_queries: list[str] = field(factory=list) + before_query: list[str] = field(factory=list) + after_query: list[str] = field(factory=list) + text_chunks: list[TextArtifact] = field(factory=list) + output: Optional[TextArtifact] = field(default=None) diff --git a/griptape/engines/rag/rag_engine.py b/griptape/engines/rag/rag_engine.py new file mode 100644 index 000000000..1c2176128 --- /dev/null +++ b/griptape/engines/rag/rag_engine.py @@ -0,0 +1,26 @@ +from typing import Optional +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.stages import QueryRagStage, GenerationRagStage, RetrievalRagStage + + +@define(kw_only=True) +class RagEngine: + query_stage: Optional[QueryRagStage] = field(default=None) + retrieval_stage: Optional[RetrievalRagStage] = field(default=None) + generation_stage: Optional[GenerationRagStage] = field(default=None) + + def process_query(self, query: str) -> RagContext: + return self.process(RagContext(initial_query=query)) + + def process(self, context: RagContext) -> RagContext: + if self.query_stage: + context = self.query_stage.run(context) + + if self.retrieval_stage: + context = self.retrieval_stage.run(context) + + if self.generation_stage: + context = self.generation_stage.run(context) + + return context diff --git a/griptape/engines/rag/stages/__init__.py b/griptape/engines/rag/stages/__init__.py new file mode 100644 index 000000000..85a603d03 --- /dev/null +++ b/griptape/engines/rag/stages/__init__.py @@ -0,0 +1,6 @@ +from .base_rag_stage import BaseRagStage +from .retrieval_rag_stage import RetrievalRagStage +from .query_rag_stage import QueryRagStage +from .generation_rag_stage import GenerationRagStage + +__all__ = ["BaseRagStage", "RetrievalRagStage", "QueryRagStage", "GenerationRagStage"] diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py new file mode 100644 index 000000000..786975b82 --- /dev/null +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod +from concurrent import futures +from attrs import define, field, Factory +from griptape.engines.rag import RagContext + + +@define(kw_only=True) +class BaseRagStage(ABC): + futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor())) + + @abstractmethod + def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/stages/generation_rag_stage.py b/griptape/engines/rag/stages/generation_rag_stage.py new file mode 100644 index 000000000..60102889a --- /dev/null +++ b/griptape/engines/rag/stages/generation_rag_stage.py @@ -0,0 +1,33 @@ +import logging +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import ( + BaseGenerationRagModule, + BaseBeforeGenerationRagModule, + BaseAfterGenerationRagModule, +) +from griptape.engines.rag.stages import BaseRagStage + + +@define(kw_only=True) +class GenerationRagStage(BaseRagStage): + before_generator_modules: list[BaseBeforeGenerationRagModule] = field(factory=list) + generation_module: BaseGenerationRagModule = field() + after_generator_modules: list[BaseAfterGenerationRagModule] = field(factory=list) + + def run(self, context: RagContext) -> RagContext: + logging.info(f"GenerationStage: running {len(self.before_generator_modules)} before modules sequentially") + + for generator in self.before_generator_modules: + context = generator.run(context) + + logging.info("GenerationStage: running generation module") + + context = self.generation_module.run(context) + + logging.info(f"GenerationStage: running {len(self.after_generator_modules)} after modules sequentially") + + for generator in self.after_generator_modules: + context = generator.run(context) + + return context diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py new file mode 100644 index 000000000..b122fa7a6 --- /dev/null +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -0,0 +1,23 @@ +import itertools +import logging +from attrs import define, field +from griptape import utils +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseQueryRagModule +from griptape.engines.rag.stages import BaseRagStage + + +@define(kw_only=True) +class QueryRagStage(BaseRagStage): + query_generation_modules: list[BaseQueryRagModule] = field() + + def run(self, context: RagContext) -> RagContext: + logging.info(f"QueryStage: running {len(self.query_generation_modules)} query generation modules in parallel") + + results = utils.execute_futures_list( + [self.futures_executor.submit(r.run, context) for r in self.query_generation_modules] + ) + + context.alternative_queries = list(itertools.chain.from_iterable(results)) + + return context diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py new file mode 100644 index 000000000..8a0ceca44 --- /dev/null +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -0,0 +1,49 @@ +import itertools +import logging +from typing import Optional +from attrs import define, field +from griptape import utils +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRerankRagModule +from griptape.engines.rag.modules import BaseRetrievalRagModule +from griptape.engines.rag.stages import BaseRagStage + + +@define(kw_only=True) +class RetrievalRagStage(BaseRagStage): + retrieval_modules: list[BaseRetrievalRagModule] = field() + rerank_module: Optional[BaseRerankRagModule] = field(default=None) + max_chunks: Optional[int] = field(default=None) + + def run(self, context: RagContext) -> RagContext: + logging.info(f"RetrievalStage: running {len(self.retrieval_modules)} retrieval modules in parallel") + + results = utils.execute_futures_list( + [self.futures_executor.submit(r.run, context) for r in self.retrieval_modules] + ) + + # flatten the list of lists + results = list(itertools.chain.from_iterable(results)) + + # deduplicate the list + chunks_before_dedup = len(results) + results = list({str(c.value): c for c in results}.values()) + chunks_after_dedup = len(results) + + logging.info( + f"RetrievalStage: deduplicated {chunks_before_dedup - chunks_after_dedup} " + f"chunks ({chunks_before_dedup} - {chunks_after_dedup})" + ) + + context.text_chunks = [a for a in results if isinstance(a, TextArtifact)] + + if self.rerank_module: + logging.info(f"RetrievalStage: running rerank module on {chunks_after_dedup} chunks") + + context.text_chunks = [a for a in self.rerank_module.run(context) if isinstance(a, TextArtifact)] + + if self.max_chunks: + context.text_chunks = context.text_chunks[: self.max_chunks] + + return context diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 3b3162751..34d65a0c5 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,36 +1,50 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any, Optional from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact +from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact, InfoArtifact +from griptape.drivers import BaseVectorStoreDriver +from griptape.engines.rag import RagEngine, RagContext from griptape.memory.task.storage import BaseArtifactStorage if TYPE_CHECKING: - from griptape.engines import BaseSummaryEngine, CsvExtractionEngine, JsonExtractionEngine, VectorQueryEngine + from griptape.engines import BaseSummaryEngine, CsvExtractionEngine, JsonExtractionEngine -@define +@define(kw_only=True) class TextArtifactStorage(BaseArtifactStorage): - query_engine: VectorQueryEngine = field(kw_only=True) - summary_engine: Optional[BaseSummaryEngine] = field(kw_only=True, default=None) - csv_extraction_engine: Optional[CsvExtractionEngine] = field(kw_only=True, default=None) - json_extraction_engine: Optional[JsonExtractionEngine] = field(kw_only=True, default=None) + vector_store_driver: BaseVectorStoreDriver = field() + rag_engine: Optional[RagEngine] = field(default=None) + summary_engine: Optional[BaseSummaryEngine] = field(default=None) + csv_extraction_engine: Optional[CsvExtractionEngine] = field(default=None) + json_extraction_engine: Optional[JsonExtractionEngine] = field(default=None) def can_store(self, artifact: BaseArtifact) -> bool: return isinstance(artifact, TextArtifact) def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: if isinstance(artifact, TextArtifact): - self.query_engine.upsert_text_artifact(artifact, namespace) + self.vector_store_driver.upsert_text_artifact(artifact, namespace) else: raise ValueError("Artifact must be of instance TextArtifact") def load_artifacts(self, namespace: str) -> ListArtifact: - return self.query_engine.load_artifacts(namespace) + return self.vector_store_driver.load_artifacts(namespace) def summarize(self, namespace: str) -> TextArtifact: if self.summary_engine is None: raise ValueError("Summary engine is not set.") + return self.summary_engine.summarize_artifacts(self.load_artifacts(namespace)) - def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact: - return self.query_engine.query(namespace=namespace, query=query, metadata=str(metadata) if metadata else None) + def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact | InfoArtifact: + if self.rag_engine is None: + raise ValueError("RAG engine is not set.") + + result = self.rag_engine.process( + RagContext(initial_query=query, namespace=namespace, metadata=None if metadata is None else str(metadata)) + ).output + + if result is None: + return InfoArtifact("Empty output") + else: + return result diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 78dd69633..036e47cc8 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -1,19 +1,24 @@ from __future__ import annotations - import logging import uuid from abc import ABC, abstractmethod from logging import Logger from typing import TYPE_CHECKING, Any, Optional - from attrs import Factory, define, field from rich.logging import RichHandler - from griptape.artifacts import BlobArtifact, TextArtifact, BaseArtifact from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver -from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine, VectorQueryEngine +from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import ( + TextRetrievalRagModule, + RulesetsGenerationRagModule, + PromptGenerationRagModule, + MetadataGenerationRagModule, +) +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage from griptape.events import BaseEvent, EventListener from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.start_structure_run_event import StartStructureRunEvent @@ -52,7 +57,8 @@ class Structure(ABC): ), kw_only=True, ) - task_memory: Optional[TaskMemory] = field( + rag_engine: RagEngine = field(default=Factory(lambda self: self.default_rag_engine, takes_self=True), kw_only=True) + task_memory: TaskMemory = field( default=Factory(lambda self: self.default_task_memory, takes_self=True), kw_only=True ) meta_memory: MetaMemory = field(default=Factory(lambda: MetaMemory()), kw_only=True) @@ -163,14 +169,28 @@ def default_config(self) -> BaseStructureConfig: return config + @property + def default_rag_engine(self) -> RagEngine: + return RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[TextRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)] + ), + generation_stage=GenerationRagStage( + before_generator_modules=[ + RulesetsGenerationRagModule(rulesets=self.rulesets), + MetadataGenerationRagModule(), + ], + generation_module=PromptGenerationRagModule(prompt_driver=self.config.prompt_driver), + ), + ) + @property def default_task_memory(self) -> TaskMemory: return TaskMemory( artifact_storages={ TextArtifact: TextArtifactStorage( - query_engine=VectorQueryEngine( - prompt_driver=self.config.prompt_driver, vector_store_driver=self.config.vector_store_driver - ), + rag_engine=self.rag_engine, + vector_store_driver=self.config.vector_store_driver, summary_engine=PromptSummaryEngine(prompt_driver=self.config.prompt_driver), csv_extraction_engine=CsvExtractionEngine(prompt_driver=self.config.prompt_driver), json_extraction_engine=JsonExtractionEngine(prompt_driver=self.config.prompt_driver), diff --git a/griptape/tasks/__init__.py b/griptape/tasks/__init__.py index 2c282adff..764d1669a 100644 --- a/griptape/tasks/__init__.py +++ b/griptape/tasks/__init__.py @@ -6,7 +6,7 @@ from .toolkit_task import ToolkitTask from .text_summary_task import TextSummaryTask from .tool_task import ToolTask -from .text_query_task import TextQueryTask +from .rag_task import RagTask from .extraction_task import ExtractionTask from .csv_extraction_task import CsvExtractionTask from .json_extraction_task import JsonExtractionTask @@ -31,7 +31,7 @@ "ToolkitTask", "TextSummaryTask", "ToolTask", - "TextQueryTask", + "RagTask", "ExtractionTask", "CsvExtractionTask", "JsonExtractionTask", diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py new file mode 100644 index 000000000..d50e881c1 --- /dev/null +++ b/griptape/tasks/rag_task.py @@ -0,0 +1,31 @@ +from __future__ import annotations +from attrs import define, field +from griptape.artifacts import TextArtifact, ErrorArtifact +from griptape.engines.rag import RagEngine +from griptape.tasks import BaseTextInputTask + + +@define +class RagTask(BaseTextInputTask): + _rag_engine: RagEngine = field(kw_only=True, default=None, alias="rag_engine") + + @property + def rag_engine(self) -> RagEngine: + if self._rag_engine is None: + if self.structure is not None: + self._rag_engine = self.structure.rag_engine + else: + raise ValueError("rag_engine is not set.") + return self._rag_engine + + @rag_engine.setter + def rag_engine(self, value: RagEngine) -> None: + self._rag_engine = value + + def run(self) -> TextArtifact | ErrorArtifact: + result = self.rag_engine.process_query(self.input.to_text()).output + + if result is None: + return ErrorArtifact("empty output") + else: + return result diff --git a/griptape/tasks/text_query_task.py b/griptape/tasks/text_query_task.py deleted file mode 100644 index f35161c17..000000000 --- a/griptape/tasks/text_query_task.py +++ /dev/null @@ -1,35 +0,0 @@ -from attrs import define, field, Factory -from typing import Optional -from griptape.artifacts import TextArtifact -from griptape.engines import BaseQueryEngine, VectorQueryEngine -from griptape.loaders import TextLoader -from griptape.tasks import BaseTextInputTask - - -@define -class TextQueryTask(BaseTextInputTask): - _query_engine: BaseQueryEngine = field(kw_only=True, default=None, alias="query_engine") - loader: TextLoader = field(default=Factory(lambda: TextLoader()), kw_only=True) - namespace: Optional[str] = field(default=None, kw_only=True) - top_n: Optional[int] = field(default=None, kw_only=True) - - @property - def query_engine(self) -> BaseQueryEngine: - if self._query_engine is None: - if self.structure is not None: - self._query_engine = VectorQueryEngine( - prompt_driver=self.structure.config.prompt_driver, - vector_store_driver=self.structure.config.vector_store_driver, - ) - else: - raise ValueError("Query Engine is not set.") - return self._query_engine - - @query_engine.setter - def query_engine(self, value: BaseQueryEngine) -> None: - self._query_engine = value - - def run(self) -> TextArtifact: - return self.query_engine.query( - self.input.to_text(), namespace=self.namespace, rulesets=self.all_rulesets, top_n=self.top_n - ) diff --git a/griptape/templates/engines/rag/modules/metadata_generation/system.j2 b/griptape/templates/engines/rag/modules/metadata_generation/system.j2 new file mode 100644 index 000000000..601fc7a13 --- /dev/null +++ b/griptape/templates/engines/rag/modules/metadata_generation/system.j2 @@ -0,0 +1,5 @@ +{% if metadata %} +Metadata: """ +{{ metadata }} +""" +{% endif %} \ No newline at end of file diff --git a/griptape/templates/engines/rag/modules/prompt_generation/system.j2 b/griptape/templates/engines/rag/modules/prompt_generation/system.j2 new file mode 100644 index 000000000..85c1b9fa8 --- /dev/null +++ b/griptape/templates/engines/rag/modules/prompt_generation/system.j2 @@ -0,0 +1,15 @@ +{% if before_system_prompt %} +{{ before_system_prompt }} + +{% endif %} +You can answer questions by searching through text chunks. Always be truthful. Don't make up facts. Use the below list of text chunks to respond. If the answer cannot be found in the chunks, say "I could not find an answer." + +{% for chunk in text_chunks %} +Text chunk: """ +{{ chunk }} +""" +{% endfor %} +{% if after_system_prompt %} + +{{ after_system_prompt }} +{% endif %} \ No newline at end of file diff --git a/griptape/templates/engines/rag/modules/query_generation/system.j2 b/griptape/templates/engines/rag/modules/query_generation/system.j2 new file mode 100644 index 000000000..dd2a8e4bd --- /dev/null +++ b/griptape/templates/engines/rag/modules/query_generation/system.j2 @@ -0,0 +1,3 @@ +Given the following query, generate an alternative query that has the same meaning but uses different words and introduces other related terms. Don't say anything else. Only output an alternative query and nothing else. + +Query: {{ initial_query }} \ No newline at end of file diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 1c152c95a..0bacdb303 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -26,6 +26,7 @@ from .griptape_cloud_knowledge_base_client.tool import GriptapeCloudKnowledgeBaseClient from .structure_run_client.tool import StructureRunClient from .image_query_client.tool import ImageQueryClient +from .rag_client.tool import RagClient from .text_to_speech_client.tool import TextToSpeechClient from .audio_transcription_client.tool import AudioTranscriptionClient @@ -58,6 +59,7 @@ "GriptapeCloudKnowledgeBaseClient", "StructureRunClient", "ImageQueryClient", + "RagClient", "TextToSpeechClient", "AudioTranscriptionClient", ] diff --git a/griptape/tools/rag_client/__init__.py b/griptape/tools/rag_client/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/rag_client/manifest.yml b/griptape/tools/rag_client/manifest.yml new file mode 100644 index 000000000..86998feb4 --- /dev/null +++ b/griptape/tools/rag_client/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: RAG Client +description: Tool for querying RAG engines +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal \ No newline at end of file diff --git a/griptape/tools/rag_client/requirements.txt b/griptape/tools/rag_client/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py new file mode 100644 index 000000000..78d716008 --- /dev/null +++ b/griptape/tools/rag_client/tool.py @@ -0,0 +1,38 @@ +from __future__ import annotations +from attrs import define, field +from schema import Schema, Literal +from griptape.artifacts import ErrorArtifact, TextArtifact +from griptape.engines.rag import RagEngine +from griptape.tools import BaseTool +from griptape.utils.decorators import activity + + +@define(kw_only=True) +class RagClient(BaseTool): + """ + Attributes: + description: LLM-friendly RAG engine description. + rag_engine: `RagEngine`. + """ + + description: str = field() + rag_engine: RagEngine = field() + + @activity( + config={ + "description": "{{ _self.description }}", + "schema": Schema({Literal("query", description="A natural language search query"): str}), + } + ) + def search(self, params: dict) -> TextArtifact | ErrorArtifact: + query = params["values"]["query"] + + try: + result = self.rag_engine.process_query(query) + + if result.output is None: + return ErrorArtifact("query output is empty") + else: + return result.output + except Exception as e: + return ErrorArtifact(f"error querying: {e}") diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index f2dc785b0..38d7784c2 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -1,8 +1,10 @@ +from __future__ import annotations from typing import Optional -from griptape.engines import VectorQueryEngine -from schema import Schema, Literal from attrs import define, field -from griptape.artifacts import BaseArtifact, ErrorArtifact +from schema import Schema, Literal +from griptape.artifacts import ErrorArtifact +from griptape.artifacts import ListArtifact +from griptape.drivers import BaseVectorStoreDriver from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -13,14 +15,14 @@ class VectorStoreClient(BaseTool): Attributes: description: LLM-friendly vector DB description. namespace: Vector storage namespace. - query_engine: `BaseQueryEngine`. + vector_store_driver: `BaseVectorStoreDriver`. top_n: Max number of results returned for the query engine query. """ DEFAULT_TOP_N = 5 description: str = field(kw_only=True) - query_engine: VectorQueryEngine = field(kw_only=True) + vector_store_driver: BaseVectorStoreDriver = field(kw_only=True) top_n: int = field(default=DEFAULT_TOP_N, kw_only=True) namespace: Optional[str] = field(default=None, kw_only=True) @@ -36,10 +38,12 @@ class VectorStoreClient(BaseTool): ), } ) - def search(self, params: dict) -> BaseArtifact: + def search(self, params: dict) -> ListArtifact | ErrorArtifact: query = params["values"]["query"] try: - return self.query_engine.query(query, top_n=self.top_n, namespace=self.namespace) + entries = self.vector_store_driver.query(query, namespace=self.namespace, count=self.top_n) + + return ListArtifact([e.to_artifact() for e in entries]) except Exception as e: return ErrorArtifact(f"error querying vector store: {e}") diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index daac63f4e..5ca129993 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -6,6 +6,7 @@ from .command_runner import CommandRunner from .chat import Chat from .futures import execute_futures_dict +from .futures import execute_futures_list from .token_counter import TokenCounter from .prompt_stack import PromptStack from .dict_utils import remove_null_values_in_dict_recursively, dict_merge @@ -35,6 +36,7 @@ def minify_json(value: str) -> str: "import_optional_dependency", "is_dependency_installed", "execute_futures_dict", + "execute_futures_list", "TokenCounter", "PromptStack", "remove_null_values_in_dict_recursively", diff --git a/griptape/utils/futures.py b/griptape/utils/futures.py index 55a4e5d55..d69f4ea48 100644 --- a/griptape/utils/futures.py +++ b/griptape/utils/futures.py @@ -8,3 +8,9 @@ def execute_futures_dict(fs_dict: dict[str, futures.Future[T]]) -> dict[str, T]: futures.wait(fs_dict.values(), timeout=None, return_when=futures.ALL_COMPLETED) return {key: future.result() for key, future in fs_dict.items()} + + +def execute_futures_list(fs_list: list[futures.Future[T]]) -> list[T]: + futures.wait(fs_list, timeout=None, return_when=futures.ALL_COMPLETED) + + return [future.result() for future in fs_list] diff --git a/mkdocs.yml b/mkdocs.yml index 317409c55..337b75f31 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -93,7 +93,8 @@ nav: - Overview: "griptape-framework/tools/index.md" - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Engines: - - Query Engines: "griptape-framework/engines/query-engines.md" + - RAG Engines: "griptape-framework/engines/rag-engines.md" + - Image Query Engines: "griptape-framework/engines/image-query-engines.md" - Extraction Engines: "griptape-framework/engines/extraction-engines.md" - Summary Engines: "griptape-framework/engines/summary-engines.md" - Image Generation Engines: "griptape-framework/engines/image-generation-engines.md" @@ -111,6 +112,7 @@ nav: - Structure Run Drivers: "griptape-framework/drivers/structure-run-drivers.md" - Text to Speech Drivers: "griptape-framework/drivers/text-to-speech-drivers.md" - Audio Transcription Drivers: "griptape-framework/drivers/audio-transcription-drivers.md" + - Web Search Drivers: "griptape-framework/drivers/web-search-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" @@ -149,6 +151,7 @@ nav: - TextToSpeechClient: "griptape-tools/official-tools/text-to-speech-client.md" - AudioTranscriptionClient: "griptape-tools/official-tools/audio-transcription-client.md" - GriptapeCloudKnowledgeBaseClient: "griptape-tools/official-tools/griptape-cloud-knowledge-base-client.md" + - RagClient: "griptape-tools/official-tools/rag-client.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: diff --git a/poetry.lock b/poetry.lock index b71ad227b..1b70d0c93 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3311,6 +3311,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4534,6 +4535,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -6296,6 +6298,7 @@ drivers-prompt-google = ["google-generativeai"] drivers-prompt-huggingface = ["huggingface-hub", "transformers"] drivers-prompt-huggingface-pipeline = ["huggingface-hub", "torch", "transformers"] drivers-prompt-ollama = ["ollama"] +drivers-rerank-cohere = ["cohere"] drivers-sql-postgres = ["pgvector", "psycopg2-binary"] drivers-sql-redshift = ["boto3", "sqlalchemy-redshift"] drivers-sql-snowflake = ["snowflake-sqlalchemy"] @@ -6318,4 +6321,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "ea8512a93be36ad1076915c5751167e3088b035deab1650182f72b842c5f8372" +content-hash = "a5e1a9aaf0fa253d904eee8803dab5f943be59c872c2449b73aea917ecb1c543" diff --git a/pyproject.toml b/pyproject.toml index 377ba46f9..972f0fe81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,6 +104,8 @@ drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-pusher = ["pusher"] +drivers-rerank-cohere = ["cohere"] + loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] loaders-image = ["pillow"] diff --git a/tests/integration/tasks/test_text_query_task.py b/tests/integration/tasks/test_rag_task.py similarity index 65% rename from tests/integration/tasks/test_text_query_task.py rename to tests/integration/tasks/test_rag_task.py index beb478b33..c0383002c 100644 --- a/tests/integration/tasks/test_text_query_task.py +++ b/tests/integration/tasks/test_rag_task.py @@ -1,8 +1,10 @@ +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils.defaults import rag_engine from tests.utils.structure_tester import StructureTester import pytest -class TestTextQueryTask: +class TestRagTask: @pytest.fixture( autouse=True, params=StructureTester.TEXT_SUMMARY_TASK_CAPABLE_PROMPT_DRIVERS, @@ -10,22 +12,18 @@ class TestTextQueryTask: ) def structure_tester(self, request): from griptape.structures import Agent - from griptape.tasks import TextQueryTask + from griptape.tasks import RagTask from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver - from griptape.engines import VectorQueryEngine from griptape.artifacts import TextArtifact vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) - artifact = TextArtifact("John Doe works as as software engineer at Griptape.") + rag_engine_instance = rag_engine(MockPromptDriver(), vector_store_driver) - vector_query_engine = VectorQueryEngine(prompt_driver=request.param, vector_store_driver=vector_store_driver) - vector_query_engine.upsert_text_artifact(artifact=artifact) + vector_store_driver.upsert_text_artifact(artifact=artifact) agent = Agent(prompt_driver=request.param) - agent.add_task( - TextQueryTask("Respond to the users following query: {{ args[0] }}", query_engine=vector_query_engine) - ) + agent.add_task(RagTask("Respond to the users following query: {{ args[0] }}", rag_engine=rag_engine_instance)) return StructureTester(agent) diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index d13f103cb..d75684829 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -92,13 +92,13 @@ def test_to_dict_with_values(self, config_with_values): }, "image_query_driver": { "type": "AmazonBedrockImageQueryDriver", - "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "max_tokens": 256, "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, }, "prompt_driver": { "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", "stream": False, "temperature": 0.1, "type": "AmazonBedrockPromptDriver", diff --git a/tests/unit/drivers/rerank/__init__.py b/tests/unit/drivers/rerank/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/rerank/test_cohere_rerank_driver.py b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py new file mode 100644 index 000000000..f7b050551 --- /dev/null +++ b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py @@ -0,0 +1,19 @@ +from unittest.mock import Mock +import pytest +from griptape.artifacts import TextArtifact +from griptape.drivers import CohereRerankDriver + + +class TestCohereRerankDriver: + @pytest.fixture + def mock_client(self, mocker): + mock_client = mocker.patch("cohere.Client").return_value + mock_client.rerank.return_value.results = [Mock(), Mock()] + + return mock_client + + def test_run(self, mock_client): + driver = CohereRerankDriver(api_key="api-key") + result = driver.run("hello", artifacts=[TextArtifact("foo"), TextArtifact("bar")]) + + assert len(result) == 2 diff --git a/tests/unit/drivers/vector/test_local_vector_store_driver.py b/tests/unit/drivers/vector/base_local_vector_store_driver.py similarity index 62% rename from tests/unit/drivers/vector/test_local_vector_store_driver.py rename to tests/unit/drivers/vector/base_local_vector_store_driver.py index 8def2c94f..07cf284f8 100644 --- a/tests/unit/drivers/vector/test_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/base_local_vector_store_driver.py @@ -1,21 +1,24 @@ +from abc import ABC, abstractmethod import pytest from griptape.artifacts import TextArtifact, BaseArtifact -from griptape.drivers import LocalVectorStoreDriver -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -class TestLocalVectorStoreDriver: +class BaseLocalVectorStoreDriver(ABC): @pytest.fixture - def driver(self): - return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + @abstractmethod + def driver(self): ... def test_upsert(self, driver): - namespace = driver.upsert_text_artifact(TextArtifact("foobar")) + namespace = driver.upsert_text_artifact(TextArtifact(id="foo1", value="foobar")) assert len(driver.entries) == 1 assert list(driver.entries.keys())[0] == namespace - driver.upsert_text_artifact(TextArtifact("foobar")) + driver.upsert_text_artifact(TextArtifact(id="foo1", value="foobar")) + + assert len(driver.entries) == 1 + + driver.upsert_text_artifact(TextArtifact(id="foo2", value="foobar2")) assert len(driver.entries) == 2 @@ -26,8 +29,8 @@ def test_upsert_multiple(self, driver): bar_entries = driver.load_entries("bar") assert len(driver.entries) == 2 - assert BaseArtifact.from_json(foo_entries[0].meta["artifact"]).value == "foo" - assert BaseArtifact.from_json(bar_entries[0].meta["artifact"]).value == "bar" + assert foo_entries[0].to_artifact().value == "foo" + assert bar_entries[0].to_artifact().value == "bar" def test_query(self, driver): vector_id = driver.upsert_text_artifact(TextArtifact("foobar"), namespace="test-namespace") @@ -37,7 +40,7 @@ def test_query(self, driver): assert len(driver.query("foobar", namespace="test-namespace")) == 1 assert driver.query("foobar")[0].vector == [] assert driver.query("foobar", include_vectors=True)[0].vector == [0, 1] - assert BaseArtifact.from_json(driver.query("foobar")[0].meta["artifact"]).value == "foobar" + assert driver.query("foobar")[0].to_artifact().value == "foobar" assert driver.query("foobar")[0].id == vector_id def test_load_entry(self, driver): @@ -53,3 +56,12 @@ def test_load_entries(self, driver): assert len(driver.load_entries()) == 3 assert len(driver.load_entries("test-namespace-1")) == 2 assert len(driver.load_entries("test-namespace-2")) == 1 + + def test_load_artifacts(self, driver): + driver.upsert_text_artifact(TextArtifact("foobar 1"), namespace="test-namespace-1") + driver.upsert_text_artifact(TextArtifact("foobar 2"), namespace="test-namespace-1") + driver.upsert_text_artifact(TextArtifact("foobar 3"), namespace="test-namespace-2") + + assert len(driver.load_artifacts()) == 3 + assert len(driver.load_artifacts("test-namespace-1")) == 2 + assert len(driver.load_artifacts("test-namespace-2")) == 1 diff --git a/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py b/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py index 53fce635e..b68486914 100644 --- a/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py @@ -40,8 +40,8 @@ def test_upsert_text(self, driver): def test_query(self, driver, monkeypatch): mock_query_result = [ - BaseVectorStoreDriver.QueryResult("foo", [0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), - BaseVectorStoreDriver.QueryResult("foo", vector=[0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), + BaseVectorStoreDriver.Entry("foo", [0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), + BaseVectorStoreDriver.Entry("foo", vector=[0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), ] monkeypatch.setattr(AzureMongoDbVectorStoreDriver, "query", lambda *args, **kwargs: mock_query_result) @@ -52,7 +52,7 @@ def test_query(self, driver, monkeypatch): for result, expected in zip(results, mock_query_result): assert result.id == expected.id assert result.vector == expected.vector - assert isinstance(result, BaseVectorStoreDriver.QueryResult) + assert isinstance(result, BaseVectorStoreDriver.Entry) def test_load_entry(self, driver): vector_id_str = "123" diff --git a/tests/unit/drivers/vector/test_entry.py b/tests/unit/drivers/vector/test_entry.py new file mode 100644 index 000000000..56ee468e1 --- /dev/null +++ b/tests/unit/drivers/vector/test_entry.py @@ -0,0 +1,12 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import BaseVectorStoreDriver + + +class TestEntry: + def test_from_dict(self): + entry_dict = {"id": "test", "vector": [], "meta": {"artifact": TextArtifact("foo").to_json()}} + assert BaseVectorStoreDriver.Entry.from_dict(entry_dict).id == "test" + + def test_to_artifact(self): + entry = BaseVectorStoreDriver.Entry(id="test", vector=[], meta={"artifact": TextArtifact("foo").to_json()}) + assert entry.to_artifact().value == "foo" diff --git a/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py b/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py new file mode 100644 index 000000000..c426ea5b4 --- /dev/null +++ b/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py @@ -0,0 +1,10 @@ +import pytest +from griptape.drivers import LocalVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.unit.drivers.vector.base_local_vector_store_driver import BaseLocalVectorStoreDriver + + +class TestInMemoryLocalVectorStoreDriver(BaseLocalVectorStoreDriver): + @pytest.fixture + def driver(self): + return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py b/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py index 28cddcfbc..5b9aeed06 100644 --- a/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py @@ -40,8 +40,8 @@ def test_upsert_text(self, driver): def test_query(self, driver, monkeypatch): mock_query_result = [ - BaseVectorStoreDriver.QueryResult("foo", [0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), - BaseVectorStoreDriver.QueryResult("foo", vector=[0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), + BaseVectorStoreDriver.Entry("foo", [0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), + BaseVectorStoreDriver.Entry("foo", vector=[0.5, 0.5, 0.5], score=0.0, meta={}, namespace=None), ] monkeypatch.setattr(MongoDbAtlasVectorStoreDriver, "query", lambda *args, **kwargs: mock_query_result) @@ -52,7 +52,7 @@ def test_query(self, driver, monkeypatch): for result, expected in zip(results, mock_query_result): assert result.id == expected.id assert result.vector == expected.vector - assert isinstance(result, BaseVectorStoreDriver.QueryResult) + assert isinstance(result, BaseVectorStoreDriver.Entry) def test_load_entry(self, driver): vector_id_str = "123" diff --git a/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py new file mode 100644 index 000000000..1f800967a --- /dev/null +++ b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py @@ -0,0 +1,29 @@ +import os +import tempfile +import pytest +from griptape.artifacts import TextArtifact, BaseArtifact +from griptape.drivers import LocalVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.unit.drivers.vector.base_local_vector_store_driver import BaseLocalVectorStoreDriver + + +class TestPersistentLocalVectorStoreDriver(BaseLocalVectorStoreDriver): + @pytest.fixture + def temp_dir(self): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + @pytest.fixture + def driver(self, temp_dir): + persist_file = os.path.join(temp_dir, "store.json") + + return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver(), persist_file=persist_file) + + def test_persistence(self, driver, temp_dir): + persist_file = os.path.join(temp_dir, "store.json") + + driver.upsert_text_artifact(TextArtifact("persistent foobar")) + + new_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver(), persist_file=persist_file) + + assert new_driver.query("persistent foobar")[0].to_artifact().value == "persistent foobar" diff --git a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py index defbe8e3b..c0477fe97 100644 --- a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py +++ b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py @@ -1,4 +1,6 @@ import pytest + +from griptape import utils from griptape.artifacts import TextArtifact from griptape.drivers import PineconeVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -32,7 +34,7 @@ def driver(self): def test_upsert_text_artifact(self, driver): artifact = TextArtifact("foo") - assert driver.upsert_text_artifact(artifact) == artifact.id + assert driver.upsert_text_artifact(artifact) == utils.str_to_hash(artifact.value) def test_upsert_vector(self, driver): assert driver.upsert_vector([0, 1, 2], vector_id="foo") == "foo" diff --git a/tests/unit/engines/query/test_vector_query_engine.py b/tests/unit/engines/query/test_vector_query_engine.py deleted file mode 100644 index 17bde6888..000000000 --- a/tests/unit/engines/query/test_vector_query_engine.py +++ /dev/null @@ -1,58 +0,0 @@ -import pytest -from griptape.artifacts import TextArtifact, BaseArtifact -from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import VectorQueryEngine -from griptape.loaders import TextLoader -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.unit.chunkers.utils import gen_paragraph - -MAX_TOKENS = 50 - - -class TestVectorQueryEngine: - @pytest.fixture - def engine(self): - return VectorQueryEngine( - vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()), - prompt_driver=MockPromptDriver(), - ) - - def test_query(self, engine): - artifacts = TextLoader(max_tokens=MAX_TOKENS).load( - gen_paragraph(MAX_TOKENS, engine.prompt_driver.tokenizer, ". ") - ) - - [engine.upsert_text_artifact(a) for a in artifacts] - - assert engine.query("foo").value.startswith("mock output") - - def test_upsert_text_artifact(self, engine): - engine.upsert_text_artifact(TextArtifact("foobar"), namespace="test") - - assert BaseArtifact.from_json(engine.vector_store_driver.load_entries()[0].meta["artifact"]).value == "foobar" - - def test_prompt_creation(self, engine): - system_message = engine.system_template_generator.render( - rulesets=["*RULESET*"], metadata="*META*", text_segments=["*TEXT SEGMENT 1*", "*TEXT SEGMENT 2*"] - ) - user_message = engine.user_template_generator.render(query="*QUESTION*") - - assert "*RULESET*" in system_message - - assert "*META*" in system_message - assert "*QUESTION*" in user_message - assert "*TEXT SEGMENT 1*" in system_message - assert "*TEXT SEGMENT 2*" in system_message - - def test_upsert_text_artifacts(self, engine): - engine.upsert_text_artifacts(artifacts=[TextArtifact("foobar1"), TextArtifact("foobar2")], namespace="test") - - assert BaseArtifact.from_json(engine.vector_store_driver.load_entries()[0].meta["artifact"]).value == "foobar1" - assert BaseArtifact.from_json(engine.vector_store_driver.load_entries()[1].meta["artifact"]).value == "foobar2" - - def test_load_artifacts(self, engine): - engine.upsert_text_artifacts(artifacts=[TextArtifact("foobar1"), TextArtifact("foobar2")], namespace="test") - - assert len(engine.load_artifacts("doesntexist")) == 0 - assert len(engine.load_artifacts("test")) == 2 diff --git a/tests/unit/engines/rag/__init__.py b/tests/unit/engines/rag/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/rag/modules/__init__.py b/tests/unit/engines/rag/modules/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/rag/modules/generation/__init__.py b/tests/unit/engines/rag/modules/generation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py new file mode 100644 index 000000000..0bd9f1f85 --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py @@ -0,0 +1,14 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import MetadataGenerationRagModule + + +class TestMetadataGenerationModule: + def test_run(self): + module = MetadataGenerationRagModule() + + assert "foo" in module.run(RagContext(metadata="foo", initial_query="test")).before_query[0] + + def test_run_with_override(self): + module = MetadataGenerationRagModule(metadata="bar") + + assert "bar" in module.run(RagContext(metadata="foo", initial_query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py new file mode 100644 index 000000000..0227e2783 --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py @@ -0,0 +1,25 @@ +import pytest +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import PromptGenerationRagModule +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestPromptGenerationRagModule: + @pytest.fixture + def module(self): + return PromptGenerationRagModule(prompt_driver=MockPromptDriver()) + + def test_run(self, module): + assert module.run(RagContext(initial_query="test")).output.value == "mock output" + + def test_prompt(self, module): + system_message = module.default_system_template_generator( + text_chunks=["*TEXT SEGMENT 1*", "*TEXT SEGMENT 2*"], + before_system_prompt=["*RULESET*", "*META*"], + after_system_prompt=[], + ) + + assert "*RULESET*" in system_message + assert "*META*" in system_message + assert "*TEXT SEGMENT 1*" in system_message + assert "*TEXT SEGMENT 2*" in system_message diff --git a/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py new file mode 100644 index 000000000..6e0fe725a --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py @@ -0,0 +1,10 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import RulesetsGenerationRagModule +from griptape.rules import Ruleset, Rule + + +class TestRulesetsGenerationRagModule: + def test_run(self): + module = RulesetsGenerationRagModule(rulesets=[Ruleset(name="test ruleset", rules=[Rule("test rule")])]) + + assert "test rule" in module.run(RagContext(initial_query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/query/__init__.py b/tests/unit/engines/rag/modules/query/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py b/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py new file mode 100644 index 000000000..699d73de5 --- /dev/null +++ b/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py @@ -0,0 +1,13 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import RelatedQueryGenerationRagModule +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestRelatedQueryGenerationRagModule: + def test_run(self): + result = RelatedQueryGenerationRagModule(prompt_driver=MockPromptDriver(), query_count=10).run( + RagContext(initial_query="test") + ) + + assert len(result) == 10 + assert all(r == "mock output" for r in result) diff --git a/tests/unit/engines/rag/modules/retrieval/__init__.py b/tests/unit/engines/rag/modules/retrieval/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py new file mode 100644 index 000000000..dc3e46a0a --- /dev/null +++ b/tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py @@ -0,0 +1,20 @@ +from unittest.mock import Mock +import pytest +from griptape.drivers import CohereRerankDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import TextRerankRagModule + + +class TestTextRerankRagModule: + @pytest.fixture + def mock_client(self, mocker): + mock_client = mocker.patch("cohere.Client").return_value + mock_client.rerank.return_value.results = [Mock(), Mock()] + + return mock_client + + def test_run(self, mock_client): + module = TextRerankRagModule(rerank_driver=CohereRerankDriver(api_key="api-key")) + result = module.run(RagContext(initial_query="test")) + + assert len(result) == 2 diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py new file mode 100644 index 000000000..5b69012d1 --- /dev/null +++ b/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py @@ -0,0 +1,20 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import TextRetrievalRagModule +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + + +class TestTextRetrievalRagModule: + def test_run(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + module = TextRetrievalRagModule(vector_store_driver=vector_store_driver) + + vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") + vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") + + result = module.run(RagContext(initial_query="test")) + + assert len(result) == 2 + assert result[0].value == "foobar1" + assert result[1].value == "foobar2" diff --git a/tests/unit/engines/rag/test_rag_engine.py b/tests/unit/engines/rag/test_rag_engine.py new file mode 100644 index 000000000..b03ab9a1c --- /dev/null +++ b/tests/unit/engines/rag/test_rag_engine.py @@ -0,0 +1,30 @@ +import pytest +from griptape.drivers import LocalVectorStoreDriver +from griptape.engines.rag import RagEngine, RagContext +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestRagEngine: + @pytest.fixture + def engine(self): + return RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + TextRetrievalRagModule( + vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + ) + ] + ), + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule(prompt_driver=MockPromptDriver()) + ), + ) + + def test_process_query(self, engine): + assert engine.process_query("test").output.value == "mock output" + + def test_process(self, engine): + assert engine.process(RagContext(initial_query="test")).output.value == "mock output" diff --git a/tests/unit/memory/tool/test_task_memory.py b/tests/unit/memory/tool/test_task_memory.py index ad7401fbb..fc1cf75c7 100644 --- a/tests/unit/memory/tool/test_task_memory.py +++ b/tests/unit/memory/tool/test_task_memory.py @@ -83,7 +83,7 @@ def test_load_artifacts_for_text_list_artifact(self, memory): memory.process_output( MockTool().test, ActionsSubtask(), - ListArtifact([TextArtifact("foo", name="test1"), TextArtifact("foo", name="test2")], name="test"), + ListArtifact([TextArtifact("foo1", name="test1"), TextArtifact("foo2", name="test2")], name="test"), ) assert len(memory.load_artifacts("test")) == 2 diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index e6c2a1f01..37c8da5a6 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -80,9 +80,11 @@ def test_embedding_driver(self): embedding_driver = MockEmbeddingDriver() agent = Agent(tools=[MockTool()], embedding_driver=embedding_driver) - artifact_storage = list(agent.task_memory.artifact_storages.values())[0] - assert isinstance(artifact_storage, TextArtifactStorage) - memory_embedding_driver = artifact_storage.query_engine.vector_store_driver.embedding_driver + storage = list(agent.task_memory.artifact_storages.values())[0] + assert isinstance(storage, TextArtifactStorage) + memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ + 0 + ].vector_store_driver.embedding_driver assert memory_embedding_driver == embedding_driver @@ -236,8 +238,11 @@ def test_task_memory_defaults(self): storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.query_engine.prompt_driver == prompt_driver - assert storage.query_engine.vector_store_driver.embedding_driver == embedding_driver + assert storage.rag_engine.generation_stage.generation_module.prompt_driver == prompt_driver + assert ( + storage.rag_engine.retrieval_stage.retrieval_modules[0].vector_store_driver.embedding_driver + == embedding_driver + ) assert isinstance(storage.summary_engine, PromptSummaryEngine) assert storage.summary_engine.prompt_driver == prompt_driver assert storage.csv_extraction_engine.prompt_driver == prompt_driver diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index 8c1cd8511..098709f0e 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -94,7 +94,9 @@ def test_embedding_driver(self): storage = list(pipeline.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - memory_embedding_driver = storage.query_engine.vector_store_driver.embedding_driver + memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ + 0 + ].vector_store_driver.embedding_driver assert memory_embedding_driver == embedding_driver diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index bbcf5138e..2646c7b43 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -108,7 +108,9 @@ def test_embedding_driver(self): storage = list(workflow.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - memory_embedding_driver = storage.query_engine.vector_store_driver.embedding_driver + memory_embedding_driver = storage.rag_engine.retrieval_stage.retrieval_modules[ + 0 + ].vector_store_driver.embedding_driver assert memory_embedding_driver == embedding_driver diff --git a/tests/unit/tasks/test_rag_task.py b/tests/unit/tasks/test_rag_task.py new file mode 100644 index 000000000..75e5007ad --- /dev/null +++ b/tests/unit/tasks/test_rag_task.py @@ -0,0 +1,35 @@ +import pytest +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import PromptGenerationRagModule +from griptape.engines.rag.stages import GenerationRagStage +from griptape.structures import Agent +from griptape.tasks import RagTask +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestRagTask: + @pytest.fixture + def task(self): + return RagTask( + input="test", + rag_engine=RagEngine( + generation_stage=GenerationRagStage( + generation_module=PromptGenerationRagModule(prompt_driver=MockPromptDriver()) + ) + ), + ) + + def test_run(self, task): + agent = Agent() + + agent.add_task(task) + + assert task.run().to_text() == "mock output" + + def test_context_propagation(self, task): + task._input = "{{ test }}" + task.context = {"test": "test value"} + + Agent().add_task(task) + + assert task.input.to_text() == "test value" diff --git a/tests/unit/tasks/test_text_query_task.py b/tests/unit/tasks/test_text_query_task.py deleted file mode 100644 index 6ab0524be..000000000 --- a/tests/unit/tasks/test_text_query_task.py +++ /dev/null @@ -1,48 +0,0 @@ -from tests.mocks.mock_structure_config import MockStructureConfig -import pytest -from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import VectorQueryEngine -from griptape.structures import Agent -from griptape.tasks import TextQueryTask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver - - -class TestTextQueryTask: - @pytest.fixture - def task(self): - return TextQueryTask( - "test", - query_engine=VectorQueryEngine( - vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()), - prompt_driver=MockPromptDriver(), - ), - namespace="test", - ) - - def test_run(self, task): - agent = Agent() - - agent.add_task(task) - - assert task.run().to_text() == "mock output" - - def test_context_propagation(self, task): - task._input = "{{ test }}" - task.context = {"test": "test value"} - - Agent().add_task(task) - - assert task.input.to_text() == "test value" - - def test_config_query_engine(self, task): - Agent(config=MockStructureConfig()).add_task(task) - - assert isinstance(task.query_engine, VectorQueryEngine) - assert isinstance(task.query_engine.prompt_driver, MockPromptDriver) - - def test_missing_summary_engine(self): - task = TextQueryTask("test") - - with pytest.raises(ValueError): - task.query_engine diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index f63b06d5b..28cc56ec9 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -1,11 +1,6 @@ -import pytest from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import VectorQueryEngine from griptape.structures import Agent from griptape.tasks import ToolkitTask, ActionsSubtask, PromptTask -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool from tests.mocks.mock_value_prompt_driver import MockValuePromptDriver from tests.utils import defaults @@ -141,13 +136,6 @@ class TestToolkitSubtask: "$schema": "http://json-schema.org/draft-07/schema#", } - @pytest.fixture - def query_engine(self): - return VectorQueryEngine( - prompt_driver=MockPromptDriver(), - vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()), - ) - def test_init(self): assert len(ToolkitTask("test", tools=[MockTool(name="Tool1"), MockTool(name="Tool2")]).tools) == 2 @@ -279,7 +267,7 @@ def test_find_tool(self): assert task.find_tool(tool.name) == tool - def test_find_memory(self, query_engine): + def test_find_memory(self): m1 = defaults.text_task_memory("Memory1") m2 = defaults.text_task_memory("Memory2") @@ -291,7 +279,7 @@ def test_find_memory(self, query_engine): assert task.find_memory("Memory1") == m1 assert task.find_memory("Memory2") == m2 - def test_memory(self, query_engine): + def test_memory(self): tool1 = MockTool( name="Tool1", output_memory={"test": [defaults.text_task_memory("Memory1"), defaults.text_task_memory("Memory2")]}, diff --git a/tests/unit/tools/test_rag_client.py b/tests/unit/tools/test_rag_client.py new file mode 100644 index 000000000..9c6497b02 --- /dev/null +++ b/tests/unit/tools/test_rag_client.py @@ -0,0 +1,13 @@ +from griptape.drivers import LocalVectorStoreDriver +from griptape.tools import RagClient +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils.defaults import rag_engine + + +class TestRagClient: + def test_search(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + tool = RagClient(description="Test", rag_engine=rag_engine(MockPromptDriver(), vector_store_driver)) + + assert tool.search({"values": {"query": "test"}}).value == "mock output" diff --git a/tests/unit/tools/test_vector_store_client.py b/tests/unit/tools/test_vector_store_client.py index ef54ed024..9503501b5 100644 --- a/tests/unit/tools/test_vector_store_client.py +++ b/tests/unit/tools/test_vector_store_client.py @@ -1,26 +1,19 @@ import pytest from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import VectorQueryEngine from griptape.tools import VectorStoreClient from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.mocks.mock_prompt_driver import MockPromptDriver class TestVectorStoreClient: @pytest.fixture(autouse=True) - def mock_try_runt(self, mocker): - mocker.patch("griptape.drivers.OpenAiChatPromptDriver.try_run", return_value=TextArtifact("foobar")) - + def mock_try_run(self, mocker): mocker.patch("griptape.drivers.OpenAiEmbeddingDriver.try_embed_chunk", return_value=[0, 1]) def test_search(self): - tool = VectorStoreClient( - description="Test", - query_engine=VectorQueryEngine( - prompt_driver=MockPromptDriver(mock_output="foobar"), - vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()), - ), - ) + driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + tool = VectorStoreClient(description="Test", vector_store_driver=driver) + + driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) - assert tool.search({"values": {"query": "test"}}).value == "foobar" + assert set([a.value for a in tool.search({"values": {"query": "test"}})]) == {"foo", "bar"} diff --git a/tests/unit/utils/test_futures.py b/tests/unit/utils/test_futures.py index d50416f58..5e30148a9 100644 --- a/tests/unit/utils/test_futures.py +++ b/tests/unit/utils/test_futures.py @@ -12,5 +12,14 @@ def test_execute_futures_dict(self): assert result["foo"] == "foo-bar" assert result["baz"] == "baz-bar" + def test_execute_futures_list(self): + with futures.ThreadPoolExecutor() as executor: + result = utils.execute_futures_list( + [executor.submit(self.foobar, "foo"), executor.submit(self.foobar, "baz")] + ) + + assert result[0] == "foo-bar" + assert result[1] == "baz-bar" + def foobar(self, foo): return f"{foo}-bar" diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index 801eed7de..f27410308 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -1,6 +1,9 @@ from griptape.artifacts import TextArtifact, BlobArtifact from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine +from griptape.engines import PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine +from griptape.engines.rag import RagEngine +from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule +from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage, BlobArtifactStorage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -8,11 +11,11 @@ def text_tool_artifact_storage(): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + return TextArtifactStorage( - query_engine=VectorQueryEngine( - vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()), - prompt_driver=MockPromptDriver(), - ), + rag_engine=rag_engine(MockPromptDriver(), vector_store_driver), + vector_store_driver=vector_store_driver, summary_engine=PromptSummaryEngine(prompt_driver=MockPromptDriver()), csv_extraction_engine=CsvExtractionEngine(prompt_driver=MockPromptDriver()), json_extraction_engine=JsonExtractionEngine(prompt_driver=MockPromptDriver()), @@ -23,3 +26,12 @@ def text_task_memory(name): return TaskMemory( name=name, artifact_storages={TextArtifact: text_tool_artifact_storage(), BlobArtifact: BlobArtifactStorage()} ) + + +def rag_engine(prompt_driver, vector_store_driver): + return RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[TextRetrievalRagModule(vector_store_driver=vector_store_driver)] + ), + generation_stage=GenerationRagStage(generation_module=PromptGenerationRagModule(prompt_driver=prompt_driver)), + ) From 095d12f9d458f283375920a4bc65f8d81e1fc4e8 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Mon, 24 Jun 2024 11:55:02 -0700 Subject: [PATCH 114/238] Change GriptapeCloudKnowledgeBaseClient to use /search API (#888) --- CHANGELOG.md | 1 + griptape/tools/griptape_cloud_knowledge_base_client/tool.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e920f5a5e..710a1c76f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Merged `BaseVectorStoreDriver.QueryResult` into `BaseVectorStoreDriver.Entry`. - **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. +- `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. ## [0.27.1] - 2024-06-20 diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 6fed6e618..7c94cda5d 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -31,7 +31,7 @@ def query(self, params: dict) -> TextArtifact | ErrorArtifact: from requests import post, exceptions query = params["values"]["query"] - url = urljoin(self.base_url.strip("/"), f"/api/knowledge-bases/{self.knowledge_base_id}/query") + url = urljoin(self.base_url.strip("/"), f"/api/knowledge-bases/{self.knowledge_base_id}/search") try: response = post(url, json={"query": query}, headers=self.headers) From 9010fdc7e30cf1d1501013c560d53e917ec0029e Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Mon, 24 Jun 2024 12:45:31 -0700 Subject: [PATCH 115/238] `meta` parameter added to TextArtifact (#891) --- CHANGELOG.md | 1 + griptape/artifacts/text_artifact.py | 3 ++- tests/unit/artifacts/test_text_artifact.py | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 710a1c76f..435b62505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. - `ProxyWebScraperDriver` to web scrape using proxies. - Parameter `session` on `AmazonBedrockStructureConfig`. +- Parameter `meta` on `TextArtifact`. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. diff --git a/griptape/artifacts/text_artifact.py b/griptape/artifacts/text_artifact.py index e8a2bb2a7..8b83303f0 100644 --- a/griptape/artifacts/text_artifact.py +++ b/griptape/artifacts/text_artifact.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Any, Optional from attrs import define, field from griptape.artifacts import BaseArtifact @@ -13,6 +13,7 @@ class TextArtifact(BaseArtifact): value: str = field(converter=str, metadata={"serializable": True}) encoding: str = field(default="utf-8", kw_only=True) encoding_error_handler: str = field(default="strict", kw_only=True) + meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) _embedding: list[float] = field(factory=list, kw_only=True) @property diff --git a/tests/unit/artifacts/test_text_artifact.py b/tests/unit/artifacts/test_text_artifact.py index f913429d7..6ea2c6697 100644 --- a/tests/unit/artifacts/test_text_artifact.py +++ b/tests/unit/artifacts/test_text_artifact.py @@ -61,3 +61,11 @@ def test_name(self): assert artifact.name == artifact.id assert TextArtifact("foo", name="bar").name == "bar" + + def test_meta(self): + artifact = TextArtifact("foo") + + assert artifact.meta == {} + + meta = {"foo": "bar"} + assert TextArtifact("foo", meta=meta).meta == meta From c2575f5318fccb7d11efd83d909ec248e9a7a28e Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Tue, 25 Jun 2024 08:05:38 -0700 Subject: [PATCH 116/238] Handle error on vector entry not existing (#893) --- griptape/drivers/vector/base_vector_store_driver.py | 5 ++++- ...re_driver.py => test_base_local_vector_store_driver.py} | 7 ++++++- .../vector/test_in_memory_local_vector_store_driver.py | 2 +- .../vector/test_persistent_local_vector_store_driver.py | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) rename tests/unit/drivers/vector/{base_local_vector_store_driver.py => test_base_local_vector_store_driver.py} (91%) diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 71f1c1061..b1d9ed6d0 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -92,7 +92,10 @@ def upsert_text( ) def does_entry_exist(self, vector_id: str, namespace: Optional[str] = None) -> bool: - return self.load_entry(vector_id, namespace) is not None + try: + return self.load_entry(vector_id, namespace) is not None + except Exception: + return False def load_artifacts(self, namespace: Optional[str] = None) -> ListArtifact: result = self.load_entries(namespace) diff --git a/tests/unit/drivers/vector/base_local_vector_store_driver.py b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py similarity index 91% rename from tests/unit/drivers/vector/base_local_vector_store_driver.py rename to tests/unit/drivers/vector/test_base_local_vector_store_driver.py index 07cf284f8..c34a54d98 100644 --- a/tests/unit/drivers/vector/base_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod import pytest -from griptape.artifacts import TextArtifact, BaseArtifact +from unittest.mock import patch +from griptape.artifacts import TextArtifact class BaseLocalVectorStoreDriver(ABC): @@ -65,3 +66,7 @@ def test_load_artifacts(self, driver): assert len(driver.load_artifacts()) == 3 assert len(driver.load_artifacts("test-namespace-1")) == 2 assert len(driver.load_artifacts("test-namespace-2")) == 1 + + def test_does_entry_exist_exception(self, driver): + with patch.object(driver, "load_entry", side_effect=Exception): + assert driver.does_entry_exist("does_not_exist") is False diff --git a/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py b/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py index c426ea5b4..cb8fcbefe 100644 --- a/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py @@ -1,7 +1,7 @@ import pytest from griptape.drivers import LocalVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.unit.drivers.vector.base_local_vector_store_driver import BaseLocalVectorStoreDriver +from tests.unit.drivers.vector.test_base_local_vector_store_driver import BaseLocalVectorStoreDriver class TestInMemoryLocalVectorStoreDriver(BaseLocalVectorStoreDriver): diff --git a/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py index 1f800967a..8f6773fc1 100644 --- a/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py @@ -1,10 +1,10 @@ import os import tempfile import pytest -from griptape.artifacts import TextArtifact, BaseArtifact +from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.unit.drivers.vector.base_local_vector_store_driver import BaseLocalVectorStoreDriver +from tests.unit.drivers.vector.test_base_local_vector_store_driver import BaseLocalVectorStoreDriver class TestPersistentLocalVectorStoreDriver(BaseLocalVectorStoreDriver): From 2df58d551963d214892642bc6645b407d45d2219 Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:56:09 -0700 Subject: [PATCH 117/238] Bumping gemini to latest version (#892) --- poetry.lock | 92 +++++++++++++++++++++++++++++++++++++++++++++----- pyproject.toml | 2 +- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1b70d0c93..e030c8906 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1543,17 +1543,18 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "google-ai-generativelanguage" -version = "0.4.0" +version = "0.6.5" description = "Google Ai Generativelanguage API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-ai-generativelanguage-0.4.0.tar.gz", hash = "sha256:c8199066c08f74c4e91290778329bb9f357ba1ea5d6f82de2bc0d10552bf4f8c"}, - {file = "google_ai_generativelanguage-0.4.0-py3-none-any.whl", hash = "sha256:e4c425376c1ee26c78acbc49a24f735f90ebfa81bf1a06495fae509a2433232c"}, + {file = "google-ai-generativelanguage-0.6.5.tar.gz", hash = "sha256:c4089c277fa4e26722f76ab03ee3039f28be8bf1c9be282948b9583a154c6d79"}, + {file = "google_ai_generativelanguage-0.6.5-py3-none-any.whl", hash = "sha256:236875bb4a6d6ebdba2f12bd9d5e776100fd913402157a47b5e9fb80a13f25a7"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" @@ -1588,6 +1589,24 @@ grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +[[package]] +name = "google-api-python-client" +version = "2.134.0" +description = "Google API Client Library for Python" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.134.0.tar.gz", hash = "sha256:4a8f0bea651a212997cc83c0f271fc86f80ef93d1cee9d84de7dfaeef2a858b6"}, + {file = "google_api_python_client-2.134.0-py2.py3-none-any.whl", hash = "sha256:ba05d60f6239990b7994f6328f17bb154c602d31860fb553016dc9f8ce886945"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + [[package]] name = "google-auth" version = "2.29.0" @@ -1611,19 +1630,35 @@ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = true +python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + [[package]] name = "google-generativeai" -version = "0.4.1" +version = "0.7.0" description = "Google Generative AI High level API client library and tools." optional = true python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.4.1-py3-none-any.whl", hash = "sha256:89be3c00c2e688108fccefc50f47f45fc9d37ecd53c1ade9d86b5d982919c24a"}, + {file = "google_generativeai-0.7.0-py3-none-any.whl", hash = "sha256:7be4b634afeb8b6bebde1af7271e94d2af84d2d28b5988c7ed9921733c40fe63"}, ] [package.dependencies] -google-ai-generativelanguage = "0.4.0" +google-ai-generativelanguage = "0.6.5" google-api-core = "*" +google-api-python-client = "*" google-auth = ">=2.15.0" protobuf = "*" pydantic = "*" @@ -1863,6 +1898,20 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.26.0)"] +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + [[package]] name = "httpx" version = "0.27.0" @@ -4242,6 +4291,20 @@ cryptography = ">=41.0.5,<43" docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = true +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pypdf" version = "3.17.4" @@ -5944,6 +6007,17 @@ tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = true +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + [[package]] name = "urllib3" version = "1.26.18" @@ -6321,4 +6395,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a5e1a9aaf0fa253d904eee8803dab5f943be59c872c2449b73aea917ecb1c543" +content-hash = "ce26764ee2c4a9a99d24ef4afc7efa6aa894a7560a725388ff24db15f6014e9a" diff --git a/pyproject.toml b/pyproject.toml index 972f0fe81..29d4fda44 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ redis = { version = "^4.6.0", optional = true } opensearch-py = { version = "^2.3.1", optional = true } pgvector = { version = "^0.2.3", optional = true } psycopg2-binary = { version = "^2.9.9", optional = true } -google-generativeai = { version = "^0.4.1", optional = true } +google-generativeai = { version = "^0.7.0", optional = true } trafilatura = {version = "^1.6", optional = true} playwright = {version = "^1.42", optional = true} beautifulsoup4 = {version = "^4.12.3", optional = true} From 80c27cb1fff80a4d3c9200f6a95db28c59de71ca Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Tue, 25 Jun 2024 15:06:43 -0600 Subject: [PATCH 118/238] VectorStoreClient improvements (#899) --- CHANGELOG.md | 4 +++ .../official-tools/vector-store-client.md | 2 +- griptape/tools/vector_store_client/tool.py | 30 +++++++++---------- tests/unit/tools/test_vector_store_client.py | 25 +++++++++++++++- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 435b62505..818211d8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ProxyWebScraperDriver` to web scrape using proxies. - Parameter `session` on `AmazonBedrockStructureConfig`. - Parameter `meta` on `TextArtifact`. +- `VectorStoreClient` improvements: + - `VectorStoreClient.query_params` dict for custom query params. + - `VectorStoreClient.process_query_output_fn` for custom query output processing logic. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. @@ -46,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Merged `BaseVectorStoreDriver.QueryResult` into `BaseVectorStoreDriver.Entry`. - **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. +- **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. - `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. ## [0.27.1] - 2024-06-20 diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md index ffdbbba91..f3cab2065 100644 --- a/docs/griptape-tools/official-tools/vector-store-client.md +++ b/docs/griptape-tools/official-tools/vector-store-client.md @@ -21,7 +21,7 @@ vector_store_driver.upsert_text_artifacts( vector_db = VectorStoreClient( description="This DB has information about the Griptape Python framework", vector_store_driver=vector_store_driver, - namespace="griptape", + query_params={"namespace": "griptape"}, off_prompt=True ) diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index 38d7784c2..8d4e73022 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -1,34 +1,36 @@ from __future__ import annotations -from typing import Optional -from attrs import define, field +from typing import Callable, Any +from attrs import define, field, Factory from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact +from griptape.artifacts import ErrorArtifact, BaseArtifact from griptape.artifacts import ListArtifact from griptape.drivers import BaseVectorStoreDriver from griptape.tools import BaseTool from griptape.utils.decorators import activity -@define +@define(kw_only=True) class VectorStoreClient(BaseTool): """ Attributes: description: LLM-friendly vector DB description. - namespace: Vector storage namespace. vector_store_driver: `BaseVectorStoreDriver`. - top_n: Max number of results returned for the query engine query. + query_params: Optional dictionary of vector store driver query parameters. + process_query_output_fn: Optional lambda for processing vector store driver query output `Entry`s. """ DEFAULT_TOP_N = 5 - description: str = field(kw_only=True) - vector_store_driver: BaseVectorStoreDriver = field(kw_only=True) - top_n: int = field(default=DEFAULT_TOP_N, kw_only=True) - namespace: Optional[str] = field(default=None, kw_only=True) + description: str = field() + vector_store_driver: BaseVectorStoreDriver = field() + query_params: dict[str, Any] = field(factory=dict) + process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], BaseArtifact] = field( + default=Factory(lambda: lambda es: ListArtifact([e.to_artifact() for e in es])) + ) @activity( config={ - "description": "Can be used to search a vector database with the following description: {{ _self.description }}", + "description": "Can be used to search a database with the following description: {{ _self.description }}", "schema": Schema( { Literal( @@ -38,12 +40,10 @@ class VectorStoreClient(BaseTool): ), } ) - def search(self, params: dict) -> ListArtifact | ErrorArtifact: + def search(self, params: dict) -> BaseArtifact: query = params["values"]["query"] try: - entries = self.vector_store_driver.query(query, namespace=self.namespace, count=self.top_n) - - return ListArtifact([e.to_artifact() for e in entries]) + return self.process_query_output_fn(self.vector_store_driver.query(query, **self.query_params)) except Exception as e: return ErrorArtifact(f"error querying vector store: {e}") diff --git a/tests/unit/tools/test_vector_store_client.py b/tests/unit/tools/test_vector_store_client.py index 9503501b5..45018b847 100644 --- a/tests/unit/tools/test_vector_store_client.py +++ b/tests/unit/tools/test_vector_store_client.py @@ -1,5 +1,5 @@ import pytest -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, ListArtifact from griptape.drivers import LocalVectorStoreDriver from griptape.tools import VectorStoreClient from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -17,3 +17,26 @@ def test_search(self): driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) assert set([a.value for a in tool.search({"values": {"query": "test"}})]) == {"foo", "bar"} + + def test_search_with_namespace(self): + driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + tool1 = VectorStoreClient(description="Test", vector_store_driver=driver, query_params={"namespace": "test"}) + tool2 = VectorStoreClient(description="Test", vector_store_driver=driver, query_params={"namespace": "test2"}) + + driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) + + assert len(tool1.search({"values": {"query": "test"}})) == 2 + assert len(tool2.search({"values": {"query": "test"}})) == 0 + + def test_custom_process_query_output_fn(self): + driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + tool1 = VectorStoreClient( + description="Test", + vector_store_driver=driver, + process_query_output_fn=lambda es: ListArtifact([e.vector for e in es]), + query_params={"include_vectors": True}, + ) + + driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) + + assert tool1.search({"values": {"query": "test"}}).value == [[0, 1], [0, 1]] From 22981b12529eadb96842d601e7eedf99d9d1bf6d Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Tue, 25 Jun 2024 15:19:37 -0600 Subject: [PATCH 119/238] Wrap future execution with context managers (#898) --- CHANGELOG.md | 1 + .../drivers/vector/base_vector_store_driver.py | 15 ++++++++------- .../related_query_generation_rag_module.py | 17 +++++++++-------- .../retrieval/text_retrieval_rag_module.py | 13 +++++++------ griptape/engines/rag/stages/query_rag_stage.py | 9 +++++---- .../engines/rag/stages/retrieval_rag_stage.py | 5 ++--- griptape/loaders/base_loader.py | 11 +++++------ griptape/tasks/actions_subtask.py | 5 ++--- griptape/utils/file_utils.py | 7 ++++--- 9 files changed, 43 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 818211d8f..d1e581b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. - **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. - `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. +- Wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. ## [0.27.1] - 2024-06-20 diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index b1d9ed6d0..8002101b7 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -36,13 +36,14 @@ def to_artifact(self) -> BaseArtifact: def upsert_text_artifacts( self, artifacts: dict[str, list[TextArtifact]], meta: Optional[dict] = None, **kwargs ) -> None: - utils.execute_futures_dict( - { - namespace: self.futures_executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) - for namespace, artifact_list in artifacts.items() - for a in artifact_list - } - ) + with self.futures_executor as executor: + utils.execute_futures_dict( + { + namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) + for namespace, artifact_list in artifacts.items() + for a in artifact_list + } + ) def upsert_text_artifact( self, diff --git a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py index 4661e24a2..9f610c0e5 100644 --- a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py +++ b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py @@ -18,14 +18,15 @@ class RelatedQueryGenerationRagModule(BaseQueryRagModule): def run(self, context: RagContext) -> list[str]: system_prompt = self.generate_system_template(context.initial_query) - results = utils.execute_futures_list( - [ - self.futures_executor.submit( - self.prompt_driver.run, self.generate_query_prompt_stack(system_prompt, "Alternative query: ") - ) - for _ in range(self.query_count) - ] - ) + with self.futures_executor as executor: + results = utils.execute_futures_list( + [ + executor.submit( + self.prompt_driver.run, self.generate_query_prompt_stack(system_prompt, "Alternative query: ") + ) + for _ in range(self.query_count) + ] + ) return [r.value for r in results] diff --git a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py index 5c6bedac4..1434b9880 100644 --- a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py @@ -21,12 +21,13 @@ def run(self, context: RagContext) -> Sequence[TextArtifact]: all_queries = [context.initial_query] + context.alternative_queries namespace = self.namespace or context.namespace - results = utils.execute_futures_list( - [ - self.futures_executor.submit(self.vector_store_driver.query, query, self.top_n, namespace, False) - for query in all_queries - ] - ) + with self.futures_executor as executor: + results = utils.execute_futures_list( + [ + executor.submit(self.vector_store_driver.query, query, self.top_n, namespace, False) + for query in all_queries + ] + ) return [ artifact diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index b122fa7a6..8c93ad763 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -14,10 +14,11 @@ class QueryRagStage(BaseRagStage): def run(self, context: RagContext) -> RagContext: logging.info(f"QueryStage: running {len(self.query_generation_modules)} query generation modules in parallel") - results = utils.execute_futures_list( - [self.futures_executor.submit(r.run, context) for r in self.query_generation_modules] - ) + with self.futures_executor as executor: + results = utils.execute_futures_list( + [executor.submit(r.run, context) for r in self.query_generation_modules] + ) - context.alternative_queries = list(itertools.chain.from_iterable(results)) + context.alternative_queries = list(itertools.chain.from_iterable(results)) return context diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index 8a0ceca44..77443fb2f 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -19,9 +19,8 @@ class RetrievalRagStage(BaseRagStage): def run(self, context: RagContext) -> RagContext: logging.info(f"RetrievalStage: running {len(self.retrieval_modules)} retrieval modules in parallel") - results = utils.execute_futures_list( - [self.futures_executor.submit(r.run, context) for r in self.retrieval_modules] - ) + with self.futures_executor as executor: + results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.retrieval_modules]) # flatten the list of lists results = list(itertools.chain.from_iterable(results)) diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 1648b8f26..40121067c 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -26,12 +26,11 @@ def load_collection( # Create a dictionary before actually submitting the jobs to the executor # to avoid duplicate work. sources_by_key = {self.to_key(source): source for source in sources} - return execute_futures_dict( - { - key: self.futures_executor.submit(self.load, source, *args, **kwargs) - for key, source in sources_by_key.items() - } - ) + + with self.futures_executor as executor: + return execute_futures_dict( + {key: executor.submit(self.load, source, *args, **kwargs) for key, source in sources_by_key.items()} + ) def to_key(self, source: Any, *args, **kwargs) -> str: if isinstance(source, bytes): diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 1546a825d..ae3893abb 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -119,9 +119,8 @@ def run(self) -> BaseArtifact: return ErrorArtifact("no tool output") def execute_actions(self, actions: list[Action]) -> list[tuple[str, BaseArtifact]]: - results = utils.execute_futures_dict( - {a.tag: self.futures_executor.submit(self.execute_action, a) for a in actions} - ) + with self.futures_executor as executor: + results = utils.execute_futures_dict({a.tag: executor.submit(self.execute_action, a) for a in actions}) return [r for r in results.values()] diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index 402436a2f..ebe5ba456 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -30,6 +30,7 @@ def load_files(paths: list[str], futures_executor: Optional[futures.ThreadPoolEx if futures_executor is None: futures_executor = futures.ThreadPoolExecutor() - return utils.execute_futures_dict( - {utils.str_to_hash(str(path)): futures_executor.submit(load_file, path) for path in paths} - ) + with futures_executor as executor: + return utils.execute_futures_dict( + {utils.str_to_hash(str(path)): executor.submit(load_file, path) for path in paths} + ) From 2a347f32ed1ce948ce4e1bf8654c13640ee342a5 Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:39:12 -0700 Subject: [PATCH 120/238] Bug Fix: Cohere prompts with no history (#900) --- CHANGELOG.md | 1 + .../drivers/prompt-drivers.md | 2 +- docs/griptape-framework/structures/config.md | 13 ++++++ .../drivers/prompt/cohere_prompt_driver.py | 12 ++++-- .../prompt/test_cohere_prompt_driver.py | 41 +++++++++++++++++-- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1e581b4b..183c3a34a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. - `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. - Wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. +- Fixed bug in `CoherePromptDriver` to properly handle empty history ## [0.27.1] - 2024-06-20 diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 0100ccbac..96a1be4e1 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -141,7 +141,7 @@ from griptape.config import StructureConfig agent = Agent( config=StructureConfig( prompt_driver=CoherePromptDriver( - model="command", + model="command-r", api_key=os.environ['COHERE_API_KEY'], ) ) diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 1a69d70c0..969163bf6 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -95,6 +95,19 @@ agent = Agent( ) ``` +#### Cohere + +The [Cohere Structure Config](../../reference/griptape/config/cohere_structure_config.md) provides default Drivers for Cohere's APIs. + + +```python +import os +from griptape.config import CohereStructureConfig +from griptape.structures import Agent + +agent = Agent(config=CohereStructureConfig(api_key=os.environ["COHERE_API_KEY"])) +``` + ### Custom Configs You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding relevant Drivers. diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index ca199011a..f4a306ebe 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -52,12 +52,18 @@ def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dic def _base_params(self, prompt_stack: PromptStack) -> dict: user_message = prompt_stack.inputs[-1].content - history_messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs[:-1]] + history_messages = [ + self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs[:-1] if input.content + ] - return { + params = { "message": user_message, - "chat_history": history_messages, "temperature": self.temperature, "stop_sequences": self.tokenizer.stop_sequences, "max_tokens": self.max_tokens, } + + if history_messages: + params["chat_history"] = history_messages + + return params diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index b3ceb11a4..6e5063b26 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -7,16 +7,16 @@ class TestCoherePromptDriver: @pytest.fixture def mock_client(self, mocker): - mock_client = mocker.patch("cohere.Client").return_value - mock_client.chat.return_value = Mock(text="model-output") + mock_client = mocker.patch("cohere.Client") + mock_client.return_value.chat.return_value = Mock(text="model-output") return mock_client @pytest.fixture def mock_stream_client(self, mocker): - mock_client = mocker.patch("cohere.Client").return_value + mock_client = mocker.patch("cohere.Client") mock_chunk = Mock(text="model-output", event_type="text-generation") - mock_client.chat_stream.return_value = iter([mock_chunk]) + mock_client.return_value.chat_stream.return_value = iter([mock_chunk]) return mock_client @@ -42,8 +42,41 @@ def test_try_run(self, mock_client, prompt_stack): # pyright: ignore # When text_artifact = driver.try_run(prompt_stack) + print(f"Called methods: {mock_client}") # Then + expected_message = "assistant-input" + expected_history = [ + {"role": "ASSISTANT", "text": "generic-input"}, + {"role": "SYSTEM", "text": "system-input"}, + {"role": "USER", "text": "user-input"}, + ] + mock_client.return_value.chat.assert_called_once_with( + message=expected_message, + temperature=driver.temperature, + stop_sequences=driver.tokenizer.stop_sequences, + max_tokens=driver.max_tokens, + chat_history=expected_history, + ) + assert text_artifact.value == "model-output" + + def test_try_run_no_history(self, mock_client, prompt_stack): + # Given + prompt_stack_no_history = PromptStack() + prompt_stack_no_history.add_user_input("user-input") + driver = CoherePromptDriver(model="command", api_key="api-key") + + # When + text_artifact = driver.try_run(prompt_stack_no_history) + + # Then + expected_message = "user-input" + mock_client.return_value.chat.assert_called_once_with( + message=expected_message, + temperature=driver.temperature, + stop_sequences=driver.tokenizer.stop_sequences, + max_tokens=driver.max_tokens, + ) assert text_artifact.value == "model-output" def test_try_stream_run(self, mock_stream_client, prompt_stack): # pyright: ignore From 6d08c20a2d50ace70595480cf58a2d54bef678aa Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 27 Jun 2024 11:19:19 -0500 Subject: [PATCH 121/238] Fix `StructureVisualizer.to_url()` (#903) --- CHANGELOG.md | 5 ++++- griptape/utils/structure_visualizer.py | 6 +++--- tests/unit/utils/test_structure_visualizer.py | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 183c3a34a..3d79f92f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. - `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. - Wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. -- Fixed bug in `CoherePromptDriver` to properly handle empty history + +### Fixed +- `CoherePromptDriver` to properly handle empty history. +- `StructureVisualizer.to_url()` by wrapping task IDs in single quotes. ## [0.27.1] - 2024-06-20 diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py index ede282761..999519cf1 100644 --- a/griptape/utils/structure_visualizer.py +++ b/griptape/utils/structure_visualizer.py @@ -32,11 +32,11 @@ def to_url(self) -> str: base64_string = base64.b64encode(graph_bytes).decode("utf-8") url = f"https://mermaid.ink/svg/{base64_string}" - return url def __render_task(self, task: BaseTask) -> str: if task.children: - return f'{task.id}--> {" & ".join([child.id for child in task.children])};' + children = " & ".join([f"'{child.id}'" for child in task.children]) + return f"'{task.id}'--> {children};" else: - return f"{task.id};" + return f"'{task.id}';" diff --git a/tests/unit/utils/test_structure_visualizer.py b/tests/unit/utils/test_structure_visualizer.py index d7177bf30..396b81166 100644 --- a/tests/unit/utils/test_structure_visualizer.py +++ b/tests/unit/utils/test_structure_visualizer.py @@ -11,7 +11,7 @@ def test_agent(self): visualizer = StructureVisualizer(agent) result = visualizer.to_url() - assert result == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMTs=" + assert result == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnOw==" def test_pipeline(self): pipeline = Pipeline( @@ -29,7 +29,7 @@ def test_pipeline(self): assert ( result - == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMS0tPiB0YXNrMjsKCXRhc2syLS0+IHRhc2szOwoJdGFzazMtLT4gdGFzazQ7Cgl0YXNrNDs=" + == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnLS0+ICd0YXNrMic7CgkndGFzazInLS0+ICd0YXNrMyc7CgkndGFzazMnLS0+ICd0YXNrNCc7CgkndGFzazQnOw==" ) def test_workflow(self): @@ -48,5 +48,5 @@ def test_workflow(self): assert ( result - == "https://mermaid.ink/svg/Z3JhcGggVEQ7Cgl0YXNrMS0tPiB0YXNrMiAmIHRhc2szOwoJdGFzazItLT4gdGFzazQ7Cgl0YXNrMy0tPiB0YXNrNDsKCXRhc2s0Ow==" + == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnLS0+ICd0YXNrMicgJiAndGFzazMnOwoJJ3Rhc2syJy0tPiAndGFzazQnOwoJJ3Rhc2szJy0tPiAndGFzazQnOwoJJ3Rhc2s0Jzs=" ) From ef070023ec28de4af8150145ef34048d25f07f77 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 27 Jun 2024 13:46:05 -0500 Subject: [PATCH 122/238] Add `fail_fast` parameter to `Structure` (#908) --- CHANGELOG.md | 1 + griptape/structures/agent.py | 6 +++++ griptape/structures/pipeline.py | 2 +- griptape/structures/structure.py | 1 + griptape/structures/workflow.py | 2 +- tests/unit/structures/test_agent.py | 4 +++ tests/unit/structures/test_pipeline.py | 36 ++++++++++++++++++++++++-- tests/unit/structures/test_workflow.py | 12 ++++++++- 8 files changed, 59 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d79f92f8..3de99e54f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `VectorStoreClient` improvements: - `VectorStoreClient.query_params` dict for custom query params. - `VectorStoreClient.process_query_output_fn` for custom query output processing logic. +- Parameter `fail_fast` to `Structure`. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index d0446aff0..2840d5c46 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -15,6 +15,12 @@ class Agent(Structure): input_template: str = field(default=PromptTask.DEFAULT_INPUT_TEMPLATE) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) + fail_fast: bool = field(default=False, kw_only=True) + + @fail_fast.validator # pyright: ignore + def validate_fail_fast(self, _, fail_fast: bool) -> None: + if fail_fast: + raise ValueError("Agents cannot fail fast, as they can only have 1 task.") def __attrs_post_init__(self) -> None: super().__attrs_post_init__() diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index d5724244e..4fc784974 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -74,7 +74,7 @@ def __run_from_task(self, task: Optional[BaseTask]) -> None: if task is None: return else: - if isinstance(task.execute(), ErrorArtifact): + if isinstance(task.execute(), ErrorArtifact) and self.fail_fast: return else: self.__run_from_task(next(iter(task.children), None)) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 036e47cc8..c5854ccac 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -62,6 +62,7 @@ class Structure(ABC): default=Factory(lambda self: self.default_task_memory, takes_self=True), kw_only=True ) meta_memory: MetaMemory = field(default=Factory(lambda: MetaMemory()), kw_only=True) + fail_fast: bool = field(default=True, kw_only=True) _execution_args: tuple = () _logger: Optional[Logger] = None diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 6552fba89..dd76597d8 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -108,7 +108,7 @@ def try_run(self, *args) -> Workflow: # Wait for all tasks to complete for future in futures.as_completed(futures_list): - if isinstance(future.result(), ErrorArtifact): + if isinstance(future.result(), ErrorArtifact) and self.fail_fast: exit_loop = True break diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index 37c8da5a6..8bcadb753 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -267,3 +267,7 @@ def finished_tasks(self): agent.run("hello") assert len(agent.finished_tasks) == 1 + + def test_fail_fast(self): + with pytest.raises(ValueError): + Agent(prompt_driver=MockPromptDriver(), fail_fast=True) diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index 098709f0e..d94616165 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -1,10 +1,11 @@ import pytest +import time -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, ErrorArtifact from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset from griptape.tokenizers import OpenAiTokenizer -from griptape.tasks import PromptTask, BaseTask, ToolkitTask +from griptape.tasks import PromptTask, BaseTask, ToolkitTask, CodeExecutionTask from griptape.memory.structure import ConversationMemory from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.structures import Pipeline @@ -13,6 +14,21 @@ class TestPipeline: + @pytest.fixture + def waiting_task(self): + def fn(task): + time.sleep(2) + return TextArtifact("done") + + return CodeExecutionTask(run_fn=fn) + + @pytest.fixture + def error_artifact_task(self): + def fn(task): + return ErrorArtifact("error") + + return CodeExecutionTask(run_fn=fn) + def test_init(self): driver = MockPromptDriver() pipeline = Pipeline(prompt_driver=driver, rulesets=[Ruleset("TestRuleset", [Rule("test")])]) @@ -357,3 +373,19 @@ def test_deprecation(self): with pytest.deprecated_call(): Pipeline(stream=True) + + def test_run_with_error_artifact(self, error_artifact_task, waiting_task): + end_task = PromptTask("end") + pipeline = Pipeline(prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task]) + pipeline.run() + + assert pipeline.output is None + + def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting_task): + end_task = PromptTask("end") + pipeline = Pipeline( + prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False + ) + pipeline.run() + + assert pipeline.output is not None diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 2646c7b43..4d44fceb8 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -17,7 +17,7 @@ class TestWorkflow: @fixture def waiting_task(self): def fn(task): - time.sleep(10) + time.sleep(2) return TextArtifact("done") return CodeExecutionTask(run_fn=fn) @@ -728,6 +728,16 @@ def test_run_with_error_artifact(self, error_artifact_task, waiting_task): assert workflow.output is None + def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting_task): + end_task = PromptTask("end") + end_task.add_parents([error_artifact_task, waiting_task]) + workflow = Workflow( + prompt_driver=MockPromptDriver(), tasks=[waiting_task, error_artifact_task, end_task], fail_fast=False + ) + workflow.run() + + assert workflow.output is not None + @staticmethod def _validate_topology_1(workflow): assert len(workflow.tasks) == 4 From 3858cdc50c912606f86e1d401ef96d8fdf18e574 Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Thu, 27 Jun 2024 12:14:11 -0700 Subject: [PATCH 123/238] fixing bug for upserting csv artifacts (#909) --- .../drivers/vector/base_vector_store_driver.py | 2 +- .../vector/test_base_local_vector_store_driver.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 8002101b7..219406d0b 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -54,7 +54,7 @@ def upsert_text_artifact( **kwargs, ) -> str: meta = {} if meta is None else meta - vector_id = utils.str_to_hash(artifact.value) if vector_id is None else vector_id + vector_id = utils.str_to_hash(artifact.to_text()) if vector_id is None else vector_id if self.does_entry_exist(vector_id, namespace): return vector_id diff --git a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py index c34a54d98..6cd1763f6 100644 --- a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py @@ -2,6 +2,7 @@ import pytest from unittest.mock import patch from griptape.artifacts import TextArtifact +from griptape.artifacts.csv_row_artifact import CsvRowArtifact class BaseLocalVectorStoreDriver(ABC): @@ -23,6 +24,20 @@ def test_upsert(self, driver): assert len(driver.entries) == 2 + def test_upsert_csv_row(self, driver): + namespace = driver.upsert_text_artifact(CsvRowArtifact(id="foo1", value={"col": "value"})) + + assert len(driver.entries) == 1 + assert list(driver.entries.keys())[0] == namespace + + driver.upsert_text_artifact(CsvRowArtifact(id="foo1", value={"col": "value"})) + + assert len(driver.entries) == 1 + + driver.upsert_text_artifact(CsvRowArtifact(id="foo2", value={"col": "value2"})) + + assert len(driver.entries) == 2 + def test_upsert_multiple(self, driver): driver.upsert_text_artifacts({"foo": [TextArtifact("foo")], "bar": [TextArtifact("bar")]}) From b93f209e458039fcd546e6dbb90a97869259ec2a Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Thu, 27 Jun 2024 15:31:26 -0600 Subject: [PATCH 124/238] All `futures_executor` fields renamed to `futures_executor_fn` and now accept callables instead of futures (#910) --- CHANGELOG.md | 2 +- .../event_listener/base_event_listener_driver.py | 10 +++++----- griptape/drivers/vector/base_vector_store_driver.py | 8 +++++--- griptape/engines/rag/modules/base_rag_module.py | 6 +++++- .../query/related_query_generation_rag_module.py | 2 +- .../rag/modules/retrieval/text_retrieval_rag_module.py | 2 +- griptape/engines/rag/stages/base_rag_stage.py | 5 ++++- griptape/engines/rag/stages/query_rag_stage.py | 2 +- griptape/engines/rag/stages/retrieval_rag_stage.py | 2 +- griptape/loaders/base_loader.py | 8 +++++--- griptape/structures/workflow.py | 8 +++++--- griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/base_task.py | 6 ++++-- 13 files changed, 39 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3de99e54f..1a4655652 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. - **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. - `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. -- Wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. +- **BREAKING**: All `futures_executor` fields renamed to `futures_executor_fn` and now accept callables instead of futures; wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. ### Fixed - `CoherePromptDriver` to properly handle empty history. diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index b6d2d9b12..17a754b65 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -1,11 +1,9 @@ from __future__ import annotations - from abc import ABC, abstractmethod from concurrent import futures from logging import Logger - +from typing import Callable from attrs import Factory, define, field - from griptape.events import BaseEvent logger = Logger(__name__) @@ -13,7 +11,9 @@ @define class BaseEventListenerDriver(ABC): - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + ) batched: bool = field(default=True, kw_only=True) batch_size: int = field(default=10, kw_only=True) @@ -24,7 +24,7 @@ def batch(self) -> list[dict]: return self._batch def publish_event(self, event: BaseEvent | dict, flush: bool = False) -> None: - self.futures_executor.submit(self._safe_try_publish_event, event, flush) + self.futures_executor_fn().submit(self._safe_try_publish_event, event, flush) @abstractmethod def try_publish_event_payload(self, event_payload: dict) -> None: ... diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 219406d0b..2c0962328 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from concurrent import futures from dataclasses import dataclass -from typing import Any +from typing import Any, Callable from typing import Optional from attrs import define, field, Factory from griptape import utils @@ -31,12 +31,14 @@ def to_artifact(self) -> BaseArtifact: return BaseArtifact.from_json(self.meta["artifact"]) # pyright: ignore[reportOptionalSubscript] embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + ) def upsert_text_artifacts( self, artifacts: dict[str, list[TextArtifact]], meta: Optional[dict] = None, **kwargs ) -> None: - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: utils.execute_futures_dict( { namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 958cbd46c..8e9b42e93 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -1,5 +1,7 @@ from abc import ABC from concurrent import futures +from typing import Callable + from attrs import define, field, Factory from griptape.utils import PromptStack @@ -7,7 +9,9 @@ @define(kw_only=True) class BaseRagModule(ABC): - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor())) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()) + ) def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptStack: return PromptStack( diff --git a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py index 9f610c0e5..138e5f034 100644 --- a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py +++ b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py @@ -18,7 +18,7 @@ class RelatedQueryGenerationRagModule(BaseQueryRagModule): def run(self, context: RagContext) -> list[str]: system_prompt = self.generate_system_template(context.initial_query) - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: results = utils.execute_futures_list( [ executor.submit( diff --git a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py index 1434b9880..9c756bfea 100644 --- a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py @@ -21,7 +21,7 @@ def run(self, context: RagContext) -> Sequence[TextArtifact]: all_queries = [context.initial_query] + context.alternative_queries namespace = self.namespace or context.namespace - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: results = utils.execute_futures_list( [ executor.submit(self.vector_store_driver.query, query, self.top_n, namespace, False) diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index 786975b82..ca19e1bb4 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -1,12 +1,15 @@ from abc import ABC, abstractmethod from concurrent import futures +from typing import Callable from attrs import define, field, Factory from griptape.engines.rag import RagContext @define(kw_only=True) class BaseRagStage(ABC): - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor())) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()) + ) @abstractmethod def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 8c93ad763..c2216aea8 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -14,7 +14,7 @@ class QueryRagStage(BaseRagStage): def run(self, context: RagContext) -> RagContext: logging.info(f"QueryStage: running {len(self.query_generation_modules)} query generation modules in parallel") - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: results = utils.execute_futures_list( [executor.submit(r.run, context) for r in self.query_generation_modules] ) diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index 77443fb2f..cbc90a43e 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -19,7 +19,7 @@ class RetrievalRagStage(BaseRagStage): def run(self, context: RagContext) -> RagContext: logging.info(f"RetrievalStage: running {len(self.retrieval_modules)} retrieval modules in parallel") - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: results = utils.execute_futures_list([executor.submit(r.run, context) for r in self.retrieval_modules]) # flatten the list of lists diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 40121067c..00fbf07ec 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from concurrent import futures -from typing import Any, Optional +from typing import Any, Optional, Callable from collections.abc import Mapping, Sequence from attrs import define, field, Factory @@ -14,7 +14,9 @@ @define class BaseLoader(ABC): - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + ) encoding: Optional[str] = field(default=None, kw_only=True) @abstractmethod @@ -27,7 +29,7 @@ def load_collection( # to avoid duplicate work. sources_by_key = {self.to_key(source): source for source in sources} - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: return execute_futures_dict( {key: executor.submit(self.load, source, *args, **kwargs) for key, source in sources_by_key.items()} ) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index dd76597d8..7e65fbf5a 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -1,7 +1,7 @@ from __future__ import annotations import concurrent.futures as futures from graphlib import TopologicalSorter -from typing import Any, Optional +from typing import Any, Optional, Callable from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact from griptape.structures import Structure @@ -11,7 +11,9 @@ @define class Workflow(Structure): - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + ) @property def output_task(self) -> Optional[BaseTask]: @@ -103,7 +105,7 @@ def try_run(self, *args) -> Workflow: for task in ordered_tasks: if task.can_execute(): - future = self.futures_executor.submit(task.execute) + future = self.futures_executor_fn().submit(task.execute) futures_list[future] = task # Wait for all tasks to complete diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index ae3893abb..fa2aff822 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -119,7 +119,7 @@ def run(self) -> BaseArtifact: return ErrorArtifact("no tool output") def execute_actions(self, actions: list[Action]) -> list[tuple[str, BaseArtifact]]: - with self.futures_executor as executor: + with self.futures_executor_fn() as executor: results = utils.execute_futures_dict({a.tag: executor.submit(self.execute_action, a) for a in actions}) return [r for r in results.values()] diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 8a45cb14e..be5ff94d8 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -4,7 +4,7 @@ from abc import ABC, abstractmethod from concurrent import futures from enum import Enum -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any, Optional, Callable from attrs import define, field, Factory @@ -33,7 +33,9 @@ class State(Enum): output: Optional[BaseArtifact] = field(default=None, init=False) structure: Optional[Structure] = field(default=None, init=False) context: dict[str, Any] = field(factory=dict, kw_only=True) - futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + futures_executor_fn: Callable[[], futures.Executor] = field( + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + ) @property @abstractmethod From 3ee8c3556a3bcd270088e210ea4fdc12bbf490ab Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 28 Jun 2024 11:50:03 -0500 Subject: [PATCH 125/238] Add `BooleanArtifact` (#905) --- CHANGELOG.md | 1 + docs/griptape-framework/data/artifacts.md | 19 ++++++---- griptape/artifacts/__init__.py | 2 ++ griptape/artifacts/boolean_artifact.py | 31 ++++++++++++++++ tests/unit/artifacts/test_boolean_artifact.py | 35 +++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 griptape/artifacts/boolean_artifact.py create mode 100644 tests/unit/artifacts/test_boolean_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a4655652..33824f753 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `VectorStoreClient.query_params` dict for custom query params. - `VectorStoreClient.process_query_output_fn` for custom query output processing logic. - Parameter `fail_fast` to `Structure`. +- `BooleanArtifact` for handling boolean values. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index 5b69b120a..6fe77574b 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -1,11 +1,11 @@ ## Overview -**Artifacts** are used for passing different types of data between Griptape components. All tools return artifacts that are later consumed by tasks and task memory. +**[Artifacts](../../reference/griptape/artifacts/base_artifact.md)** are used for passing different types of data between Griptape components. All tools return artifacts that are later consumed by tasks and task memory. Artifacts make sure framework components enforce contracts when passing and consuming data. ## TextArtifact -Used for passing text data of arbitrary size around the framework. It can be used to count tokens with [token_count()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.token_count) with a tokenizer. +A [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) for passing text data of arbitrary size around the framework. It can be used to count tokens with [token_count()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.token_count) with a tokenizer. It can also be used to generate a text embedding with [generate_embedding()](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.generate_embedding) and access it with [embedding](../../reference/griptape/artifacts/text_artifact.md#griptape.artifacts.text_artifact.TextArtifact.embedding). @@ -13,20 +13,20 @@ and access it with [embedding](../../reference/griptape/artifacts/text_artifact. ## CsvRowArtifact -Used for passing structured row data around the framework. It inherits from [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) and overrides the +A [CsvRowArtifact](../../reference/griptape/artifacts/csv_row_artifact.md) for passing structured row data around the framework. It inherits from [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) and overrides the [to_text()](../../reference/griptape/artifacts/csv_row_artifact.md#griptape.artifacts.csv_row_artifact.CsvRowArtifact.to_text) method, which always returns a valid CSV row. ## InfoArtifact -Used for passing short notifications back to the LLM without task memory storing them. +An [InfoArtifact](../../reference/griptape/artifacts/info_artifact.md) for passing short notifications back to the LLM without task memory storing them. ## ErrorArtifact -Used for passing errors back to the LLM without task memory storing them. +An [ErrorArtifact](../../reference/griptape/artifacts/error_artifact.md) is used for passing errors back to the LLM without task memory storing them. ## BlobArtifact -Used for passing binary large objects (blobs) back to the LLM. +A [BlobArtifact](../../reference/griptape/artifacts/blob_artifact.md) for passing binary large objects (blobs) back to the LLM. Treat it as a way to return unstructured data, such as images, videos, audio, and other files back from tools. Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#griptape.artifacts.base_artifact.BaseArtifact.name) and [dir](../../reference/griptape/artifacts/blob_artifact.md#griptape.artifacts.blob_artifact.BlobArtifact.dir_name) to uniquely identify stored objects. @@ -40,3 +40,10 @@ An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used ## AudioArtifact An [AudioArtifact](../../reference/griptape/artifacts/audio_artifact.md) allows the Framework to interact with audio content. An Audio Artifact includes binary audio content as well as metadata like format, duration, and prompt and model information for audio returned generative models. It inherits from [BlobArtifact](#blobartifact). + +## BooleanArtifact + +A [BooleanArtifact](../../reference/griptape/artifacts/boolean_artifact.md) is used for passing boolean values around the framework. + +!!! info + Any object passed on init to `BooleanArtifact` will be coerced into a `bool` type. This might lead to unintended behavior: `BooleanArtifact("False").value is True`. Use [BooleanArtifact.parse_bool](../../reference/griptape/artifacts/boolean_artifact.md#griptape.artifacts.boolean_artifact.BooleanArtifact.parse_bool) to convert case-insensitive string literal values `"True"` and `"False"` into a `BooleanArtifact`: `BooleanArtifact.parse_bool("False").value is False`. diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index e57177ac4..00c19519f 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -3,6 +3,7 @@ from .info_artifact import InfoArtifact from .text_artifact import TextArtifact from .blob_artifact import BlobArtifact +from .boolean_artifact import BooleanArtifact from .csv_row_artifact import CsvRowArtifact from .list_artifact import ListArtifact from .media_artifact import MediaArtifact @@ -16,6 +17,7 @@ "InfoArtifact", "TextArtifact", "BlobArtifact", + "BooleanArtifact", "CsvRowArtifact", "ListArtifact", "MediaArtifact", diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py new file mode 100644 index 000000000..a7a84da18 --- /dev/null +++ b/griptape/artifacts/boolean_artifact.py @@ -0,0 +1,31 @@ +from __future__ import annotations +from typing import Any, Union +from attrs import define, field +from griptape.artifacts import BaseArtifact + + +@define +class BooleanArtifact(BaseArtifact): + value: bool = field(converter=bool, metadata={"serializable": True}) + meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) + + @classmethod + def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: + """ + Convert a string literal or bool to a BooleanArtifact. The string must be either "true" or "false" with any casing. + """ + if value is not None: + if isinstance(value, str): + if value.lower() == "true": + return BooleanArtifact(True) + elif value.lower() == "false": + return BooleanArtifact(False) + elif isinstance(value, bool): + return BooleanArtifact(value) + raise ValueError(f"Cannot convert '{value}' to BooleanArtifact") + + def __add__(self, other: BaseArtifact) -> BooleanArtifact: + raise ValueError("Cannot add BooleanArtifact with other artifacts") + + def __eq__(self, value: object) -> bool: + return self.value is value diff --git a/tests/unit/artifacts/test_boolean_artifact.py b/tests/unit/artifacts/test_boolean_artifact.py new file mode 100644 index 000000000..bcad67673 --- /dev/null +++ b/tests/unit/artifacts/test_boolean_artifact.py @@ -0,0 +1,35 @@ +import pytest +from griptape.artifacts import BooleanArtifact + + +class TestBooleanArtifact: + def test_parse_bool(self): + assert BooleanArtifact.parse_bool("true").value is True + assert BooleanArtifact.parse_bool("false").value is False + assert BooleanArtifact.parse_bool("True").value is True + assert BooleanArtifact.parse_bool("False").value is False + + with pytest.raises(ValueError): + BooleanArtifact.parse_bool("foo") + + with pytest.raises(ValueError): + BooleanArtifact.parse_bool(None) + + assert BooleanArtifact.parse_bool(True).value is True + assert BooleanArtifact.parse_bool(False).value is False + + def test_add(self): + with pytest.raises(ValueError): + BooleanArtifact(True) + BooleanArtifact(True) + + def test_value_type_conversion(self): + assert BooleanArtifact(1).value is True + assert BooleanArtifact(0).value is False + assert BooleanArtifact(True).value is True + assert BooleanArtifact(False).value is False + assert BooleanArtifact("true").value is True + assert BooleanArtifact("false").value is True + assert BooleanArtifact([1]).value is True + assert BooleanArtifact([]).value is False + assert BooleanArtifact(False) == False + assert BooleanArtifact(True) == True From becdc1dfeffe9883190a4b8e1ba9a054eb4dd7fd Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 1 Jul 2024 17:23:23 -0500 Subject: [PATCH 126/238] Add pull request template (#921) --- .github/pull_request_template.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..3a3496ef6 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,8 @@ +## Describe your changes + +## Issue ticket number and link + +## Checklist before requesting a review +- [ ] I have performed a self-review of my code. +- [ ] I have added thorough tests. +- [ ] Is this a notable change? If so, please update the [changelog](https://github.com/griptape-ai/griptape/blob/dev/CHANGELOG.md). From 1cd558852372aa6ff6a5a25a73fccf4f049fc6f3 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Mon, 1 Jul 2024 15:48:59 -0700 Subject: [PATCH 127/238] Fix missing parent error handling in Workflow task insertion (#856) Co-authored-by: Collin Dutter --- CHANGELOG.md | 1 + griptape/structures/workflow.py | 10 +++++-- tests/unit/structures/test_workflow.py | 38 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33824f753..ddb48c4f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -133,6 +133,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Streaming not working when using deprecated `Structure.stream` field. - Raw Tool output being lost when being executed by ActionsSubtask. - Re-order Workflow tasks on every task execution wave. +- `Workflow.insert_task()` enumerates by parent id equality, opposed to object equality. - Web Loader to catch Exceptions and properly return an ErrorArtifact. - Conversation Memory entry only added if `output_task.output` is not `None` on all `Structures` - `TextArtifacts` contained in `ListArtifact` returned by `WebSearch.search` to properly formatted stringified JSON. diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 7e65fbf5a..204650c41 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -87,9 +87,13 @@ def insert_task( if task.id not in parent_task.child_ids: parent_task.child_ids.append(task.id) - parent_index = self.tasks.index(parent_task) - if parent_index > last_parent_index: - last_parent_index = parent_index + try: + parent_index = self.tasks.index(parent_task) + except ValueError: + raise ValueError(f"Parent task {parent_task.id} not found in workflow.") + else: + if parent_index > last_parent_index: + last_parent_index = parent_index # Insert the new task once, just after the last parent task self.tasks.insert(last_parent_index + 1, task) diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 4d44fceb8..2b89684d3 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -351,6 +351,44 @@ def test_run_topology_1_imperative_insert(self): self._validate_topology_1(workflow) + def test_run_topology_1_missing_parent(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + workflow = Workflow(prompt_driver=MockPromptDriver()) + + # task1 never added to workflow + workflow + task4 + with pytest.raises(ValueError): + workflow.insert_tasks(task1, [task2, task3], task4) + + def test_run_topology_1_id_equality(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + workflow = Workflow(prompt_driver=MockPromptDriver()) + + # task4 never added to workflow + workflow + task1 + workflow.insert_tasks(task1, [task2, task3], task4) + + with pytest.raises(ValueError): + workflow.run() + + def test_run_topology_1_object_equality(self): + task1 = PromptTask("test1", id="task1") + task2 = PromptTask("test2", id="task2") + task3 = PromptTask("test3", id="task3") + task4 = PromptTask("test4", id="task4") + workflow = Workflow(prompt_driver=MockPromptDriver()) + + workflow + task1 + workflow + task4 + with pytest.raises(ValueError): + workflow.insert_tasks(PromptTask("test1", id="task1"), [task2, task3], task4) + def test_run_topology_2_declarative_parents(self): workflow = Workflow( prompt_driver=MockPromptDriver(), From f8be8ee6078938fa51838fd658bf1d0acae6f861 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:35:00 -0700 Subject: [PATCH 128/238] Ensure Executor.shutdown() called after task submission in BaseEventListenerDriver.publish_event() (#919) --- .../event_listener/base_event_listener_driver.py | 3 ++- .../test_base_event_listener_driver.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 17a754b65..b433ed755 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -24,7 +24,8 @@ def batch(self) -> list[dict]: return self._batch def publish_event(self, event: BaseEvent | dict, flush: bool = False) -> None: - self.futures_executor_fn().submit(self._safe_try_publish_event, event, flush) + with self.futures_executor_fn() as executor: + executor.submit(self._safe_try_publish_event, event, flush) @abstractmethod def try_publish_event_payload(self, event_payload: dict) -> None: ... diff --git a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py index 6d33dd2a0..383c0be89 100644 --- a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py @@ -1,8 +1,20 @@ +from unittest.mock import MagicMock from tests.mocks.mock_event import MockEvent from tests.mocks.mock_event_listener_driver import MockEventListenerDriver class TestBaseEventListenerDriver: + def test_publish_event(self): + executor = MagicMock() + executor.__enter__.return_value = executor + driver = MockEventListenerDriver(futures_executor_fn=lambda: executor) + + driver.publish_event(MockEvent().to_dict()) + + executor.__enter__.assert_called_once() + executor.submit.assert_called_once() + executor.__exit__.assert_called_once() + def test__safe_try_publish_event(self): driver = MockEventListenerDriver(batched=False) From db9051d107d47d6df9756211d2f80dba7920d19c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 1 Jul 2024 19:27:00 -0500 Subject: [PATCH 129/238] `typos` to dev dependencies to catch typos in code/docs. (#923) --- .github/workflows/code-checks.yml | 13 ++++++++++ .pre-commit-config.yaml | 7 ++++++ CHANGELOG.md | 1 + Makefile | 6 ++++- _typos.toml | 8 ++++++ .../drivers/prompt-drivers.md | 2 +- .../drivers/web-search-drivers.md | 2 +- docs/griptape-framework/misc/tokenizers.md | 2 +- docs/griptape-framework/structures/tasks.md | 2 +- .../file_manager/base_file_manager_driver.py | 2 +- griptape/drivers/prompt/base_prompt_driver.py | 2 +- poetry.lock | 25 ++++++++++++++++--- pyproject.toml | 1 + .../test_amazon_s3_file_manager_driver.py | 4 +-- .../test_local_file_manager_driver.py | 4 +-- .../test_redis_conversation_memory_driver.py | 2 +- .../vector/test_redis_vector_store_driver.py | 1 - tests/unit/structures/test_workflow.py | 2 +- 18 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 _typos.toml diff --git a/.github/workflows/code-checks.yml b/.github/workflows/code-checks.yml index 03b1f0a17..51ffc543f 100644 --- a/.github/workflows/code-checks.yml +++ b/.github/workflows/code-checks.yml @@ -70,3 +70,16 @@ jobs: verbose: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + spell-check: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: [ "3.12" ] + steps: + - name: Checkout actions + uses: actions/checkout@v3 + - name: Init environment + uses: ./.github/actions/init-environment + - name: Run linter + run: make check/spell diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a54182464..33a90d824 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,3 +25,10 @@ repos: entry: make check/types language: system types: [python] +- repo: local + hooks: + - id: typos + name: Typos + entry: make check/spell + language: system + types: [python] diff --git a/CHANGELOG.md b/CHANGELOG.md index ddb48c4f5..273fe5429 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `VectorStoreClient.process_query_output_fn` for custom query output processing logic. - Parameter `fail_fast` to `Structure`. - `BooleanArtifact` for handling boolean values. +- `typos` to dev dependencies to catch typos in code/docs. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. diff --git a/Makefile b/Makefile index b4f3d0068..57d1869ce 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ format: ## Format project. @poetry run ruff format . .PHONY: check -check: check/format check/lint check/types ## Run all checks. +check: check/format check/lint check/types check/spell ## Run all checks. .PHONY: check/format check/format: @@ -53,6 +53,10 @@ check/lint: .PHONY: check/types check/types: @poetry run pyright griptape/ + +.PHONY: check/spell +check/spell: + @poetry run typos .DEFAULT_GOAL := help .PHONY: help diff --git a/_typos.toml b/_typos.toml new file mode 100644 index 000000000..1819b51ef --- /dev/null +++ b/_typos.toml @@ -0,0 +1,8 @@ +[default.extend-words] +# Don't correct the state ND +ND = "ND" +# Don't correct pirates using acronyms +mornin = "mornin" + +[files] +extend-exclude = ["docs/assets", "tests/resources/"] diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 96a1be4e1..9d5b6fc4a 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -57,7 +57,7 @@ print(result.value) Griptape offers the following Prompt Drivers for interacting with LLMs. !!! warning - When overriding a default Prompt Driver, take care to ensure you've updated the Structure's configured Embedding Driver as well. If Task Memory isn't needed, you can avoid compatability issues by setting `task_memory=None` to disable Task Memory in your Structure. + When overriding a default Prompt Driver, take care to ensure you've updated the Structure's configured Embedding Driver as well. If Task Memory isn't needed, you can avoid compatibility issues by setting `task_memory=None` to disable Task Memory in your Structure. ### OpenAI Chat diff --git a/docs/griptape-framework/drivers/web-search-drivers.md b/docs/griptape-framework/drivers/web-search-drivers.md index 332ce2c2b..18ba1e21c 100644 --- a/docs/griptape-framework/drivers/web-search-drivers.md +++ b/docs/griptape-framework/drivers/web-search-drivers.md @@ -2,7 +2,7 @@ Web Search Drivers can be used to search for links from a search query. They are used by [WebSearch](../../reference/griptape/tools/web_search/tool.md) to provide its functionality. All Web Search Drivers implement the following methods: -* `search()` searchs the web and returns a [ListArtifact](../../reference/griptape/artifacts/list_artifact.md) that contains JSON-serializable [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s with the search results. +* `search()` searches the web and returns a [ListArtifact](../../reference/griptape/artifacts/list_artifact.md) that contains JSON-serializable [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s with the search results. ## Google diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index 1920e912e..a6df1c388 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -1,7 +1,7 @@ ## Overview Tokenizers are used throughout Griptape to calculate the number of [tokens](https://learn.microsoft.com/en-us/semantic-kernel/prompt-engineering/tokens) in a piece of text. -They are particulary useful for ensuring that the LLM token limits are not exceeded. +They are particularly useful for ensuring that the LLM token limits are not exceeded. Tokenizers are a low level abstraction that you will rarely interact with directly. diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 6bb517fa2..e8f75b453 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -516,7 +516,7 @@ engine = VariationImageGenerationEngine( with open("tests/resources/mountain.png", "rb") as f: image_artifact = ImageLoader().load(f.read()) -# Instatiate a pipeline. +# Instantiate a pipeline. pipeline = Pipeline() # Add a VariationImageGenerationTask to the pipeline. diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 56f19b3cc..562d8be4c 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -12,7 +12,7 @@ class BaseFileManagerDriver(ABC): Attributes: default_loader: The default loader to use for loading file contents into artifacts. - loaders: Dictionary of file extension specifc loaders to use for loading file contents into artifacts. + loaders: Dictionary of file extension specific loaders to use for loading file contents into artifacts. """ default_loader: loaders.BaseLoader = field(default=Factory(lambda: loaders.BlobLoader()), kw_only=True) diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 45f95d544..90e5259ac 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -16,7 +16,7 @@ @define(kw_only=True) class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): - """Base class for Prompt Drivers. + """Base class for the Prompt Drivers. Attributes: temperature: The temperature to use for the completion. diff --git a/poetry.lock b/poetry.lock index e030c8906..768a4e8ae 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -3360,7 +3360,6 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4598,7 +4597,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -5979,6 +5977,25 @@ files = [ {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] +[[package]] +name = "typos" +version = "1.22.9" +description = "Source Code Spelling Correction" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typos-1.22.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6221400b82554f853e1d1a0f26bcfddf9f36008114d3441c566e1b5edf20d27d"}, + {file = "typos-1.22.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a57b5f0acd1596034fdc333f94d4713adbc181c545fb526cf2119d2af4c007ec"}, + {file = "typos-1.22.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77e2d9dfee24cccf177b09d8ace6d6012fa8c453aa092d869426bfef3dd8c67e"}, + {file = "typos-1.22.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38886031f4570d546b63ec112aed6b323762022ca5cc64d52537724a1529257"}, + {file = "typos-1.22.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8577b482256538822f76c9825d36f76b7b1e7cbccf2842279a7b46f0494796a5"}, + {file = "typos-1.22.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:63f7ae86eb7dccc43845bf0ef72a3746b1022889a178809c028f809081c6f20d"}, + {file = "typos-1.22.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5f290b85f1dddc875d4efa0b22802413f86532b99fa0ac2cb8d2e70eda68acfd"}, + {file = "typos-1.22.9-py3-none-win32.whl", hash = "sha256:76a58b1d54ee00ef8d90c3166b149e70d84b0414617a34abf5ded1db76feecef"}, + {file = "typos-1.22.9-py3-none-win_amd64.whl", hash = "sha256:53f31a9c0d321132f680ab92d80f7c520e163c53c9042fb009feaa91d9b4a7c4"}, + {file = "typos-1.22.9.tar.gz", hash = "sha256:c7b5feada41ce26e34eea1145141887257e59384d0ceea00f0f03349335ff688"}, +] + [[package]] name = "tzdata" version = "2024.1" @@ -6395,4 +6412,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "ce26764ee2c4a9a99d24ef4afc7efa6aa894a7560a725388ff24db15f6014e9a" +content-hash = "937d5e870407a493038178b3060c663feb9a1b6e6fc16e55fa380a18d02b0c80" diff --git a/pyproject.toml b/pyproject.toml index 29d4fda44..7fc62d6af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -174,6 +174,7 @@ ruff = "^0.4.6" pyright = "^1.1.363" pre-commit = "^3.7.1" boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.105"} +typos = "^1.22.9" [tool.poetry.group.docs] diff --git a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py index 285cf9510..8d1693ade 100644 --- a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py @@ -84,7 +84,7 @@ def test_validate_workdir(self, workdir, session, bucket): @pytest.mark.parametrize( "workdir,path,expected", [ - # Valid non-empty directories (witout trailing slash) + # Valid non-empty directories (without trailing slash) ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), ("/", "foo", ["bar", "bar.txt", "bar-empty"]), ("/", "foo/bar", ["baz.txt", "baz-empty"]), @@ -111,7 +111,7 @@ def test_validate_workdir(self, workdir, session, bucket): ("/./..", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), ("/./..", "foo/.", ["bar", "bar.txt", "bar-empty"]), ("/./..", "foo/bar/.", ["baz.txt", "baz-empty"]), - # Empty folders (witout trailing slash) + # Empty folders (without trailing slash) ("/", "foo-empty", []), ("/", "foo/bar-empty", []), ("/", "foo/bar/baz-empty", []), diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index 236281739..b3f4ec561 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -57,7 +57,7 @@ def test_validate_workdir(self): @pytest.mark.parametrize( "workdir,path,expected", [ - # Valid non-empty directories (witout trailing slash) + # Valid non-empty directories (without trailing slash) ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), ("/", "foo", ["bar", "bar.txt", "bar-empty"]), ("/", "foo/bar", ["baz.txt", "baz-empty"]), @@ -84,7 +84,7 @@ def test_validate_workdir(self): ("/./..", "bar/..", ["foo", "foo.txt", "foo-empty", "resources"]), ("/./..", "foo/.", ["bar", "bar.txt", "bar-empty"]), ("/./..", "foo/bar/.", ["baz.txt", "baz-empty"]), - # Empty folders (witout trailing slash) + # Empty folders (without trailing slash) ("/", "foo-empty", []), ("/", "foo/bar-empty", []), ("/", "foo/bar/baz-empty", []), diff --git a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py index dee840508..13f75d464 100644 --- a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py @@ -5,7 +5,7 @@ TEST_CONVERSATION = '{"type": "ConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": "Hi There, Hello", "output": "Hello! How can I assist you today?"}], "max_runs": 2}' CONVERSATION_ID = "117151897f344ff684b553d0655d8f39" -INDEX = "griptape_converstaion" +INDEX = "griptape_conversation" HOST = "127.0.0.1" PORT = 6379 PASSWORD = "" diff --git a/tests/unit/drivers/vector/test_redis_vector_store_driver.py b/tests/unit/drivers/vector/test_redis_vector_store_driver.py index 3c98180e7..18759a2d7 100644 --- a/tests/unit/drivers/vector/test_redis_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_redis_vector_store_driver.py @@ -1,6 +1,5 @@ from unittest.mock import MagicMock import pytest -import redis from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from griptape.drivers import RedisVectorStoreDriver diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 2b89684d3..bf55e852f 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -683,7 +683,7 @@ def test_output_task(self): # task4 is the final task, but its defined at index 0 workflow = Workflow(prompt_driver=MockPromptDriver(), tasks=[task4, task1, task2, task3]) - # ouput_task topologically should be task4 + # output_task topologically should be task4 assert task4 == workflow.output_task def test_to_graph(self): From 2dcfe2d55c06fcf0c53ae259aae8c393019d46ef Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 2 Jul 2024 09:48:39 -0500 Subject: [PATCH 130/238] Refactor prompt stack (#861) --- CHANGELOG.md | 26 ++++ README.md | 2 +- .../drivers/prompt-drivers.md | 24 ++-- docs/griptape-framework/misc/events.md | 8 +- docs/griptape-framework/structures/agents.md | 2 +- docs/griptape-framework/structures/tasks.md | 27 +++- griptape/common/__init__.py | 23 +++ griptape/common/prompt_stack/__init__.py | 0 .../common/prompt_stack/contents/__init__.py | 0 .../contents/base_delta_message_content.py | 12 ++ .../contents/base_message_content.py | 31 ++++ .../contents/image_message_content.py | 17 +++ .../contents/text_delta_message_content.py | 9 ++ .../contents/text_message_content.py | 20 +++ .../common/prompt_stack/messages/__init__.py | 0 .../prompt_stack/messages/base_message.py | 44 ++++++ .../prompt_stack/messages/delta_message.py | 15 ++ .../common/prompt_stack/messages/message.py | 38 +++++ griptape/common/prompt_stack/prompt_stack.py | 56 ++++++++ griptape/config/google_structure_config.py | 4 +- .../prompt/amazon_bedrock_prompt_driver.py | 78 ++++++++--- ...mazon_sagemaker_jumpstart_prompt_driver.py | 61 +++++--- .../drivers/prompt/anthropic_prompt_driver.py | 118 +++++++++++----- .../prompt/azure_openai_chat_prompt_driver.py | 2 +- griptape/drivers/prompt/base_prompt_driver.py | 101 +++++++++----- .../drivers/prompt/cohere_prompt_driver.py | 81 ++++++++--- .../drivers/prompt/dummy_prompt_driver.py | 17 ++- .../drivers/prompt/google_prompt_driver.py | 108 ++++++++++---- .../prompt/huggingface_hub_prompt_driver.py | 43 ++++-- .../huggingface_pipeline_prompt_driver.py | 44 +++--- .../drivers/prompt/ollama_prompt_driver.py | 38 ++++- .../prompt/openai_chat_prompt_driver.py | 132 +++++++++++++----- .../extraction/csv_extraction_engine.py | 11 +- .../extraction/json_extraction_engine.py | 11 +- .../engines/rag/modules/base_rag_module.py | 7 +- .../prompt_generation_rag_module.py | 8 +- .../engines/summary/prompt_summary_engine.py | 24 ++-- griptape/events/base_prompt_event.py | 1 - griptape/events/finish_prompt_event.py | 3 + griptape/events/start_prompt_event.py | 3 +- .../structure/base_conversation_memory.py | 18 +-- .../memory/structure/conversation_memory.py | 6 +- griptape/memory/structure/run.py | 5 +- .../structure/summary_conversation_memory.py | 12 +- griptape/schemas/base_schema.py | 4 +- griptape/structures/agent.py | 21 ++- griptape/structures/pipeline.py | 7 +- griptape/structures/workflow.py | 7 +- griptape/tasks/prompt_task.py | 69 +++++++-- griptape/tasks/toolkit_task.py | 12 +- .../tokenizers/amazon_bedrock_tokenizer.py | 1 + griptape/tokenizers/huggingface_tokenizer.py | 1 + griptape/tokenizers/openai_tokenizer.py | 7 +- griptape/tokenizers/voyageai_tokenizer.py | 7 +- .../prompt_image_generation_client/tool.py | 9 +- griptape/utils/__init__.py | 2 - griptape/utils/conversation.py | 4 +- griptape/utils/prompt_stack.py | 48 ------- tests/mocks/mock_failing_prompt_driver.py | 26 ++-- tests/mocks/mock_prompt_driver.py | 28 ++-- tests/mocks/mock_value_prompt_driver.py | 21 --- .../config/test_google_structure_config.py | 2 +- ...est_dynamodb_conversation_memory_driver.py | 4 +- .../test_local_conversation_memory_driver.py | 8 +- .../test_redis_conversation_memory_driver.py | 2 +- .../test_amazon_bedrock_prompt_driver.py | 61 ++++---- ...mazon_sagemaker_jumpstart_prompt_driver.py | 14 +- .../prompt/test_anthropic_prompt_driver.py | 98 +++++++++---- .../test_azure_openai_chat_prompt_driver.py | 40 +++--- .../drivers/prompt/test_base_prompt_driver.py | 11 +- .../prompt/test_cohere_prompt_driver.py | 105 +++++++------- .../prompt/test_google_prompt_driver.py | 106 +++++++------- .../test_hugging_face_hub_prompt_driver.py | 27 ++-- ...est_hugging_face_pipeline_prompt_driver.py | 16 ++- .../prompt/test_ollama_prompt_driver.py | 41 ++++-- .../prompt/test_openai_chat_prompt_driver.py | 107 +++++++------- .../summary/test_prompt_summary_engine.py | 4 +- tests/unit/events/test_base_event.py | 43 ++++-- tests/unit/events/test_finish_prompt_event.py | 5 +- tests/unit/events/test_start_prompt_event.py | 18 ++- .../structure/test_conversation_memory.py | 113 +++++++-------- .../test_summary_conversation_memory.py | 28 ++-- tests/unit/structures/test_agent.py | 12 +- tests/unit/structures/test_pipeline.py | 24 ++-- tests/unit/tasks/test_prompt_task.py | 86 ++++++++++++ tests/unit/tasks/test_toolkit_task.py | 8 +- .../unit/tokenizers/test_google_tokenizer.py | 5 +- tests/unit/utils/test_base_tokenizer.py | 13 ++ tests/unit/utils/test_message_stack.py | 55 ++++++++ tests/unit/utils/test_prompt_stack.py | 41 ------ 90 files changed, 1787 insertions(+), 874 deletions(-) create mode 100644 griptape/common/__init__.py create mode 100644 griptape/common/prompt_stack/__init__.py create mode 100644 griptape/common/prompt_stack/contents/__init__.py create mode 100644 griptape/common/prompt_stack/contents/base_delta_message_content.py create mode 100644 griptape/common/prompt_stack/contents/base_message_content.py create mode 100644 griptape/common/prompt_stack/contents/image_message_content.py create mode 100644 griptape/common/prompt_stack/contents/text_delta_message_content.py create mode 100644 griptape/common/prompt_stack/contents/text_message_content.py create mode 100644 griptape/common/prompt_stack/messages/__init__.py create mode 100644 griptape/common/prompt_stack/messages/base_message.py create mode 100644 griptape/common/prompt_stack/messages/delta_message.py create mode 100644 griptape/common/prompt_stack/messages/message.py create mode 100644 griptape/common/prompt_stack/prompt_stack.py delete mode 100644 griptape/utils/prompt_stack.py delete mode 100644 tests/mocks/mock_value_prompt_driver.py create mode 100644 tests/unit/utils/test_base_tokenizer.py create mode 100644 tests/unit/utils/test_message_stack.py delete mode 100644 tests/unit/utils/test_prompt_stack.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 273fe5429..1d270363c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased +### Added +- `Message` for storing messages in a `PromptStack`. Messages consist of a role, content, and usage. +- `DeltaMessage` for storing partial messages in a `PromptStack`. Multiple `DeltaMessage` can be combined to form a `Message`. +- `TextMessageContent` for storing textual content in a `Message`. +- `ImageMessageContent` for storing image content in a `Message`. +- Support for adding `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s to `PromptStack`. +- Support for image inputs to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AmazonBedrockPromptDriver`, `AnthropicPromptDriver`, and `GooglePromptDriver`. +- Input/output token usage metrics to all Prompt Drivers. +- `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. +- Support for storing Artifacts as inputs/outputs in Conversation Memory Runs. +- `Agent.input` for passing Artifacts as input. +- Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. + +### Changed +- **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. +- **BREAKING**: Renamed `PromptStack.inputs` to `PromptStack.messages`. +- **BREAKING**: Moved `PromptStack.USER_ROLE`, `PromptStack.ASSISTANT_ROLE`, and `PromptStack.SYSTEM_ROLE` to `Message`. +- **BREAKING**: Updated return type of `PromptDriver.try_run` from `TextArtifact` to `Message`. +- **BREAKING**: Updated return type of `PromptDriver.try_stream` from `Iterator[TextArtifact]` to `Iterator[DeltaMessage]`. +- **BREAKING**: Removed `BasePromptEvent.token_count` in favor of `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. +- **BREAKING**: Removed `StartPromptEvent.prompt`. Use `StartPromptEvent.prompt_stack` instead. +- **BREAKING**: Removed `Agent.input_template` in favor of `Agent.input`. +- **BREAKING**: `BasePromptDriver.run` now returns a `Message` instead of a `TextArtifact`. For compatibility, `Message.value` contains the Message's Artifact value +- Default Prompt Driver model in `GoogleStructureConfig` to `gemini-1.5-pro`. + + ### Added - `RagEngine` is an abstraction for implementing modular RAG pipelines. diff --git a/README.md b/README.md index f9eb2aa5c..6905903a3 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ from griptape.structures import Agent from griptape.tools import WebScraper, FileManager, TaskMemoryClient agent = Agent( - input_template="Load {{ args[0] }}, summarize it, and store it in a file called {{ args[1] }}.", + input="Load {{ args[0] }}, summarize it, and store it in a file called {{ args[1] }}.", tools=[ WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=True), diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index 9d5b6fc4a..f95a0ba4e 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -14,7 +14,7 @@ agent = Agent( config=StructureConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), ), - input_template="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", + input="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", rules=[ Rule( value="Output only the sentiment." @@ -28,23 +28,23 @@ agent.run("I loved the new Batman movie!") Or use them independently: ```python -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.drivers import OpenAiChatPromptDriver stack = PromptStack() -stack.add_system_input( +stack.add_system_message( "You will be provided with Python code, and your task is to calculate its time complexity." ) stack.add_user_input( -""" -def foo(n, k): - accum = 0 - for i in range(n): - for l in range(k): - accum += i - return accum -""" + """ + def foo(n, k): + accum = 0 + for i in range(n): + for l in range(k): + accum += i + return accum + """ ) result = OpenAiChatPromptDriver(model="gpt-3.5-turbo-16k", temperature=0).run(stack) @@ -80,7 +80,7 @@ agent = Agent( seed=42, ) ), - input_template="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", + input="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", rules=[ Rule( value='Write your output in json with a single key called "css_code".' diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index 0921676fb..2d3645e94 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -244,9 +244,9 @@ from griptape.events import BaseEvent, StartPromptEvent, EventListener def handler(event: BaseEvent): if isinstance(event, StartPromptEvent): - print("Prompt Stack Inputs:") - for input in event.prompt_stack.inputs: - print(f"{input.role}: {input.content}") + print("Prompt Stack PromptStack:") + for message in event.prompt_stack.messages: + print(f"{message.role}: {message.content}") print("Final Prompt String:") print(event.prompt) @@ -259,7 +259,7 @@ agent.run("Write me a poem.") ``` ``` ... -Prompt Stack Inputs: +Prompt Stack Messages: system: user: Write me a poem. Final Prompt String: diff --git a/docs/griptape-framework/structures/agents.md b/docs/griptape-framework/structures/agents.md index 8737d2a59..b36db72d3 100644 --- a/docs/griptape-framework/structures/agents.md +++ b/docs/griptape-framework/structures/agents.md @@ -15,7 +15,7 @@ from griptape.structures import Agent agent = Agent( - input_template="Calculate the following: {{ args[0] }}", + input="Calculate the following: {{ args[0] }}", tools=[Calculator()] ) diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index e8f75b453..c385df6cd 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -88,6 +88,31 @@ agent.run("Write me a haiku") Day begins anew. ``` +If the model supports it, you can also pass image inputs: + +```python +from griptape.structures import Agent +from griptape.loaders import ImageLoader + +agent = Agent() +with open("tests/resources/mountain.jpg", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +agent.run(["What's in this image?", image_artifact]) +``` + +``` +[06/21/24 10:01:08] INFO PromptTask c229d1792da34ab1a7c45768270aada9 + Input: What's in this image? + + Media, type: image/jpeg, size: 82351 bytes +[06/21/24 10:01:12] INFO PromptTask c229d1792da34ab1a7c45768270aada9 + Output: The image depicts a stunning mountain landscape at sunrise or sunset. The sun is partially visible on the left side of the image, + casting a warm golden light over the scene. The mountains are covered with snow at their peaks, and a layer of clouds or fog is settled in the + valleys between them. The sky is a mix of warm colors near the horizon, transitioning to cooler blues higher up, with some scattered clouds + adding texture to the sky. The overall scene is serene and majestic, highlighting the natural beauty of the mountainous terrain. +``` + ## Toolkit Task To use [Griptape Tools](../../griptape-framework/tools/index.md), use a [Toolkit Task](../../reference/griptape/tasks/toolkit_task.md). @@ -740,7 +765,7 @@ def build_researcher(): def build_writer(): writer = Agent( - input_template="Instructions: {{args[0]}}\nContext: {{args[1]}}", + input="Instructions: {{args[0]}}\nContext: {{args[1]}}", rulesets=[ Ruleset( name="Position", diff --git a/griptape/common/__init__.py b/griptape/common/__init__.py new file mode 100644 index 000000000..2b1189472 --- /dev/null +++ b/griptape/common/__init__.py @@ -0,0 +1,23 @@ +from .prompt_stack.contents.base_message_content import BaseMessageContent +from .prompt_stack.contents.base_delta_message_content import BaseDeltaMessageContent +from .prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent +from .prompt_stack.contents.text_message_content import TextMessageContent +from .prompt_stack.contents.image_message_content import ImageMessageContent + +from .prompt_stack.messages.base_message import BaseMessage +from .prompt_stack.messages.delta_message import DeltaMessage +from .prompt_stack.messages.message import Message + +from .prompt_stack.prompt_stack import PromptStack + +__all__ = [ + "BaseMessage", + "BaseDeltaMessageContent", + "BaseMessageContent", + "DeltaMessage", + "Message", + "TextDeltaMessageContent", + "TextMessageContent", + "ImageMessageContent", + "PromptStack", +] diff --git a/griptape/common/prompt_stack/__init__.py b/griptape/common/prompt_stack/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/common/prompt_stack/contents/__init__.py b/griptape/common/prompt_stack/contents/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/common/prompt_stack/contents/base_delta_message_content.py b/griptape/common/prompt_stack/contents/base_delta_message_content.py new file mode 100644 index 000000000..344f0bb7a --- /dev/null +++ b/griptape/common/prompt_stack/contents/base_delta_message_content.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from abc import ABC + +from attrs import define, field + +from griptape.mixins.serializable_mixin import SerializableMixin + + +@define +class BaseDeltaMessageContent(ABC, SerializableMixin): + index: int = field(kw_only=True, default=0, metadata={"serializable": True}) diff --git a/griptape/common/prompt_stack/contents/base_message_content.py b/griptape/common/prompt_stack/contents/base_message_content.py new file mode 100644 index 000000000..cd4d5bd92 --- /dev/null +++ b/griptape/common/prompt_stack/contents/base_message_content.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from abc import ABC +from collections.abc import Sequence + +from attrs import define, field + +from griptape.artifacts.base_artifact import BaseArtifact +from griptape.mixins import SerializableMixin + +from .base_delta_message_content import BaseDeltaMessageContent + + +@define +class BaseMessageContent(ABC, SerializableMixin): + artifact: BaseArtifact = field(metadata={"serializable": True}) + + def to_text(self) -> str: + return str(self.artifact) + + def __str__(self) -> str: + return self.artifact.to_text() + + def __bool__(self) -> bool: + return bool(self.artifact) + + def __len__(self) -> int: + return len(self.artifact) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> BaseMessageContent: ... diff --git a/griptape/common/prompt_stack/contents/image_message_content.py b/griptape/common/prompt_stack/contents/image_message_content.py new file mode 100644 index 000000000..0192a2cb4 --- /dev/null +++ b/griptape/common/prompt_stack/contents/image_message_content.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from collections.abc import Sequence + +from attrs import define, field + +from griptape.artifacts import ImageArtifact +from griptape.common import BaseDeltaMessageContent, BaseMessageContent + + +@define +class ImageMessageContent(BaseMessageContent): + artifact: ImageArtifact = field(metadata={"serializable": True}) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> ImageMessageContent: + raise NotImplementedError() diff --git a/griptape/common/prompt_stack/contents/text_delta_message_content.py b/griptape/common/prompt_stack/contents/text_delta_message_content.py new file mode 100644 index 000000000..ab5313df6 --- /dev/null +++ b/griptape/common/prompt_stack/contents/text_delta_message_content.py @@ -0,0 +1,9 @@ +from __future__ import annotations +from attrs import define, field + +from griptape.common import BaseDeltaMessageContent + + +@define +class TextDeltaMessageContent(BaseDeltaMessageContent): + text: str = field(metadata={"serializable": True}) diff --git a/griptape/common/prompt_stack/contents/text_message_content.py b/griptape/common/prompt_stack/contents/text_message_content.py new file mode 100644 index 000000000..1d7b2bd5b --- /dev/null +++ b/griptape/common/prompt_stack/contents/text_message_content.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from attrs import define, field +from collections.abc import Sequence + +from griptape.artifacts import TextArtifact +from griptape.common import BaseMessageContent, BaseDeltaMessageContent, TextDeltaMessageContent + + +@define +class TextMessageContent(BaseMessageContent): + artifact: TextArtifact = field(metadata={"serializable": True}) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> TextMessageContent: + text_deltas = [delta for delta in deltas if isinstance(delta, TextDeltaMessageContent)] + + artifact = TextArtifact(value="".join(delta.text for delta in text_deltas)) + + return cls(artifact=artifact) diff --git a/griptape/common/prompt_stack/messages/__init__.py b/griptape/common/prompt_stack/messages/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/common/prompt_stack/messages/base_message.py b/griptape/common/prompt_stack/messages/base_message.py new file mode 100644 index 000000000..3cc8e532a --- /dev/null +++ b/griptape/common/prompt_stack/messages/base_message.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from abc import ABC +from typing import Optional, Union +from attrs import Factory, define, field + + +from griptape.common import BaseMessageContent, BaseDeltaMessageContent +from griptape.mixins import SerializableMixin + + +@define +class BaseMessage(ABC, SerializableMixin): + @define + class Usage(SerializableMixin): + input_tokens: Optional[float] = field(kw_only=True, default=None, metadata={"serializable": True}) + output_tokens: Optional[float] = field(kw_only=True, default=None, metadata={"serializable": True}) + + @property + def total_tokens(self) -> float: + return (self.input_tokens or 0) + (self.output_tokens or 0) + + def __add__(self, other: BaseMessage.Usage) -> BaseMessage.Usage: + return BaseMessage.Usage( + input_tokens=(self.input_tokens or 0) + (other.input_tokens or 0), + output_tokens=(self.output_tokens or 0) + (other.output_tokens or 0), + ) + + USER_ROLE = "user" + ASSISTANT_ROLE = "assistant" + SYSTEM_ROLE = "system" + + content: list[Union[BaseMessageContent, BaseDeltaMessageContent]] = field(metadata={"serializable": True}) + role: str = field(kw_only=True, metadata={"serializable": True}) + usage: Usage = field(kw_only=True, default=Factory(lambda: BaseMessage.Usage()), metadata={"serializable": True}) + + def is_system(self) -> bool: + return self.role == self.SYSTEM_ROLE + + def is_user(self) -> bool: + return self.role == self.USER_ROLE + + def is_assistant(self) -> bool: + return self.role == self.ASSISTANT_ROLE diff --git a/griptape/common/prompt_stack/messages/delta_message.py b/griptape/common/prompt_stack/messages/delta_message.py new file mode 100644 index 000000000..7ff90b08f --- /dev/null +++ b/griptape/common/prompt_stack/messages/delta_message.py @@ -0,0 +1,15 @@ +from __future__ import annotations +from typing import Optional + +from attrs import define, field + +from griptape.common.prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent + + +from .base_message import BaseMessage + + +@define +class DeltaMessage(BaseMessage): + role: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + content: Optional[TextDeltaMessageContent] = field(kw_only=True, default=None, metadata={"serializable": True}) diff --git a/griptape/common/prompt_stack/messages/message.py b/griptape/common/prompt_stack/messages/message.py new file mode 100644 index 000000000..fcf6750ea --- /dev/null +++ b/griptape/common/prompt_stack/messages/message.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact +from griptape.common import BaseMessageContent, TextMessageContent + +from .base_message import BaseMessage + + +@define +class Message(BaseMessage): + def __init__(self, content: str | list[BaseMessageContent], **kwargs: Any): + if isinstance(content, str): + content = [TextMessageContent(TextArtifact(value=content))] + self.__attrs_init__(content, **kwargs) # pyright: ignore[reportAttributeAccessIssue] + + content: list[BaseMessageContent] = field(metadata={"serializable": True}) + + @property + def value(self) -> Any: + return self.to_artifact().value + + def __str__(self) -> str: + return self.to_text() + + def to_text(self) -> str: + return "".join( + [content.artifact.to_text() for content in self.content if isinstance(content, TextMessageContent)] + ) + + def to_artifact(self) -> BaseArtifact: + if len(self.content) == 1: + return self.content[0].artifact + else: + return ListArtifact([content.artifact for content in self.content]) diff --git a/griptape/common/prompt_stack/prompt_stack.py b/griptape/common/prompt_stack/prompt_stack.py new file mode 100644 index 000000000..ce19696e3 --- /dev/null +++ b/griptape/common/prompt_stack/prompt_stack.py @@ -0,0 +1,56 @@ +from __future__ import annotations +from attrs import define, field + +from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact, ImageArtifact +from griptape.mixins import SerializableMixin +from griptape.common import Message, TextMessageContent, BaseMessageContent, ImageMessageContent + + +@define +class PromptStack(SerializableMixin): + messages: list[Message] = field(factory=list, kw_only=True, metadata={"serializable": True}) + + @property + def system_messages(self) -> list[Message]: + return [message for message in self.messages if message.is_system()] + + @property + def user_messages(self) -> list[Message]: + return [message for message in self.messages if message.is_user()] + + @property + def assistant_messages(self) -> list[Message]: + return [message for message in self.messages if message.is_assistant()] + + def add_message(self, artifact: str | BaseArtifact, role: str) -> Message: + new_content = self.__process_artifact(artifact) + + self.messages.append(Message(content=new_content, role=role)) + + return self.messages[-1] + + def add_system_message(self, artifact: str | BaseArtifact) -> Message: + return self.add_message(artifact, Message.SYSTEM_ROLE) + + def add_user_message(self, artifact: str | BaseArtifact) -> Message: + return self.add_message(artifact, Message.USER_ROLE) + + def add_assistant_message(self, artifact: str | BaseArtifact) -> Message: + return self.add_message(artifact, Message.ASSISTANT_ROLE) + + def __process_artifact(self, artifact: str | BaseArtifact) -> list[BaseMessageContent]: + if isinstance(artifact, str): + return [TextMessageContent(TextArtifact(artifact))] + elif isinstance(artifact, TextArtifact): + return [TextMessageContent(artifact)] + elif isinstance(artifact, ImageArtifact): + return [ImageMessageContent(artifact)] + elif isinstance(artifact, ListArtifact): + processed_contents = [self.__process_artifact(artifact) for artifact in artifact.value] + flattened_content = [ + sub_content for processed_content in processed_contents for sub_content in processed_content + ] + + return flattened_content + else: + raise ValueError(f"Unsupported artifact type: {type(artifact)}") diff --git a/griptape/config/google_structure_config.py b/griptape/config/google_structure_config.py index 744d08782..fc0548ff7 100644 --- a/griptape/config/google_structure_config.py +++ b/griptape/config/google_structure_config.py @@ -14,7 +14,9 @@ @define class GoogleStructureConfig(StructureConfig): prompt_driver: BasePromptDriver = field( - default=Factory(lambda: GooglePromptDriver(model="gemini-pro")), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: GooglePromptDriver(model="gemini-1.5-pro")), + kw_only=True, + metadata={"serializable": True}, ) embedding_driver: BaseEmbeddingDriver = field( default=Factory(lambda: GoogleEmbeddingDriver(model="models/embedding-001")), diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 849ed0901..21d81724d 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -6,6 +6,14 @@ from attrs import Factory, define, field from griptape.artifacts import TextArtifact +from griptape.common import ( + DeltaMessage, + Message, + TextDeltaMessageContent, + BaseMessageContent, + TextMessageContent, + ImageMessageContent, +) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AmazonBedrockTokenizer, BaseTokenizer from griptape.utils import import_optional_dependency @@ -13,7 +21,7 @@ if TYPE_CHECKING: import boto3 - from griptape.utils import PromptStack + from griptape.common import PromptStack @define @@ -27,44 +35,54 @@ class AmazonBedrockPromptDriver(BasePromptDriver): default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: response = self.bedrock_client.converse(**self._base_params(prompt_stack)) + usage = response["usage"] output_message = response["output"]["message"] - output_content = output_message["content"][0]["text"] - return TextArtifact(output_content) + return Message( + content=[TextMessageContent(TextArtifact(content["text"])) for content in output_message["content"]], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=usage["inputTokens"], output_tokens=usage["outputTokens"]), + ) - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: response = self.bedrock_client.converse_stream(**self._base_params(prompt_stack)) stream = response.get("stream") if stream is not None: for event in stream: if "contentBlockDelta" in event: - yield TextArtifact(event["contentBlockDelta"]["delta"]["text"]) + content_block_delta = event["contentBlockDelta"] + yield DeltaMessage( + content=TextDeltaMessageContent( + content_block_delta["delta"]["text"], index=content_block_delta["contentBlockIndex"] + ) + ) + elif "metadata" in event: + usage = event["metadata"]["usage"] + yield DeltaMessage( + usage=DeltaMessage.Usage(input_tokens=usage["inputTokens"], output_tokens=usage["outputTokens"]) + ) else: raise Exception("model response is empty") - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - content = [{"text": prompt_input.content}] - - if prompt_input.is_system(): - return {"text": prompt_input.content} - elif prompt_input.is_assistant(): - return {"role": "assistant", "content": content} - else: - return {"role": "user", "content": content} + def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: + return [ + { + "role": self.__to_role(message), + "content": [self.__prompt_stack_content_message_content(content) for content in message.content], + } + for message in messages + ] def _base_params(self, prompt_stack: PromptStack) -> dict: - system_messages = [ - self._prompt_stack_input_to_message(input) - for input in prompt_stack.inputs - if input.is_system() and input.content - ] - messages = [ - self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs if not input.is_system() - ] + system_messages = [{"text": message.to_text()} for message in prompt_stack.system_messages] + + messages = self._prompt_stack_messages_to_messages( + [message for message in prompt_stack.messages if not message.is_system()] + ) return { "modelId": self.model, @@ -73,3 +91,17 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "inferenceConfig": {"temperature": self.temperature}, "additionalModelRequestFields": self.additional_model_request_fields, } + + def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + if isinstance(content, TextMessageContent): + return {"text": content.artifact.to_text()} + elif isinstance(content, ImageMessageContent): + return {"image": {"format": content.artifact.format, "source": {"bytes": content.artifact.value}}} + else: + raise ValueError(f"Unsupported content type: {type(content)}") + + def __to_role(self, message: Message) -> str: + if message.is_assistant(): + return "assistant" + else: + return "user" diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 18f8e4b77..dacaa62b0 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -7,14 +7,15 @@ from attrs import Factory, define, field from griptape.artifacts import TextArtifact -from griptape.drivers.prompt.base_prompt_driver import BasePromptDriver +from griptape.common import PromptStack, Message, TextMessageContent, DeltaMessage +from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: import boto3 - from griptape.utils import PromptStack + from griptape.common import PromptStack @define @@ -40,8 +41,11 @@ def validate_stream(self, _, stream): if stream: raise ValueError("streaming is not supported") - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - payload = {"inputs": self._to_model_input(prompt_stack), "parameters": self._to_model_params(prompt_stack)} + def try_run(self, prompt_stack: PromptStack) -> Message: + payload = { + "inputs": self.prompt_stack_to_string(prompt_stack), + "parameters": {**self._base_params(prompt_stack)}, + } response = self.sagemaker_client.invoke_endpoint( EndpointName=self.endpoint, @@ -59,31 +63,28 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: if isinstance(decoded_body, list): if decoded_body: - return TextArtifact(decoded_body[0]["generated_text"]) + generated_text = decoded_body[0]["generated_text"] else: raise ValueError("model response is empty") else: - return TextArtifact(decoded_body["generated_text"]) - - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - raise NotImplementedError("streaming is not supported") + generated_text = decoded_body["generated_text"] - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - return {"role": prompt_input.role, "content": prompt_input.content} + input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) + output_tokens = len(self.tokenizer.tokenizer.encode(generated_text)) - def _to_model_input(self, prompt_stack: PromptStack) -> str: - prompt = self.tokenizer.tokenizer.apply_chat_template( - [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], - tokenize=False, - add_generation_prompt=True, + return Message( + content=[TextMessageContent(TextArtifact(generated_text))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=input_tokens, output_tokens=output_tokens), ) - if isinstance(prompt, str): - return prompt - else: - raise ValueError("Invalid output type.") + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: + raise NotImplementedError("streaming is not supported") - def _to_model_params(self, prompt_stack: PromptStack) -> dict: + def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: + return self.tokenizer.tokenizer.decode(self.__prompt_stack_to_tokens(prompt_stack)) + + def _base_params(self, prompt_stack: PromptStack) -> dict: return { "temperature": self.temperature, "max_new_tokens": self.max_tokens, @@ -92,3 +93,21 @@ def _to_model_params(self, prompt_stack: PromptStack) -> dict: "stop_strings": self.tokenizer.stop_sequences, "return_full_text": False, } + + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + messages = [] + + for message in prompt_stack.messages: + messages.append({"role": message.role, "content": message.to_text()}) + + return messages + + def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: + messages = self._prompt_stack_to_messages(prompt_stack) + + tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) + + if isinstance(tokens, list): + return tokens + else: + raise ValueError("Invalid output type.") diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index b74a9d5f6..1dd7bb7f9 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -1,11 +1,27 @@ from __future__ import annotations -from typing import Optional, Any + from collections.abc import Iterator -from attrs import define, field, Factory +from typing import Any, Optional, TYPE_CHECKING + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack, import_optional_dependency +from griptape.common import ( + BaseMessageContent, + DeltaMessage, + TextDeltaMessageContent, + ImageMessageContent, + PromptStack, + Message, + TextMessageContent, +) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AnthropicTokenizer, BaseTokenizer +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from anthropic.types import ContentBlockDeltaEvent + from anthropic.types import ContentBlock @define @@ -32,42 +48,40 @@ class AnthropicPromptDriver(BasePromptDriver): top_k: int = field(default=250, kw_only=True, metadata={"serializable": True}) max_tokens: int = field(default=1000, kw_only=True, metadata={"serializable": True}) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: response = self.client.messages.create(**self._base_params(prompt_stack)) - return TextArtifact(value=response.content[0].text) + return Message( + content=[self.__message_content_to_prompt_stack_content(content) for content in response.content], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=response.usage.input_tokens, output_tokens=response.usage.output_tokens), + ) - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - response = self.client.messages.create(**self._base_params(prompt_stack), stream=True) + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: + events = self.client.messages.create(**self._base_params(prompt_stack), stream=True) - for chunk in response: - if chunk.type == "content_block_delta": - yield TextArtifact(value=chunk.delta.text) + for event in events: + if event.type == "content_block_delta": + yield DeltaMessage(content=self.__message_content_delta_to_prompt_stack_content_delta(event)) + elif event.type == "message_start": + yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=event.message.usage.input_tokens)) + elif event.type == "message_delta": + yield DeltaMessage(usage=DeltaMessage.Usage(output_tokens=event.usage.output_tokens)) - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - content = prompt_input.content + def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: + return [{"role": self.__to_role(message), "content": self.__to_content(message)} for message in messages] - if prompt_input.is_system(): - return {"role": "system", "content": content} - elif prompt_input.is_assistant(): - return {"role": "assistant", "content": content} - else: - return {"role": "user", "content": content} - - def _prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> dict: - messages = [ - self._prompt_stack_input_to_message(prompt_input) - for prompt_input in prompt_stack.inputs - if not prompt_input.is_system() - ] - system = next((self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs if i.is_system()), None) - - if system is None: - return {"messages": messages} + def _base_params(self, prompt_stack: PromptStack) -> dict: + messages = self._prompt_stack_messages_to_messages( + [message for message in prompt_stack.messages if not message.is_system()] + ) + + system_messages = prompt_stack.system_messages + if system_messages: + system_message = system_messages[0].to_text() else: - return {"messages": messages, "system": system["content"]} + system_message = None - def _base_params(self, prompt_stack: PromptStack) -> dict: return { "model": self.model, "temperature": self.temperature, @@ -75,5 +89,45 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "top_p": self.top_p, "top_k": self.top_k, "max_tokens": self.max_tokens, - **self._prompt_stack_to_model_input(prompt_stack), + "messages": messages, + **({"system": system_message} if system_message else {}), } + + def __to_role(self, message: Message) -> str: + if message.is_assistant(): + return "assistant" + else: + return "user" + + def __to_content(self, message: Message) -> str | list[dict]: + if all(isinstance(content, TextMessageContent) for content in message.content): + return message.to_text() + else: + return [self.__prompt_stack_content_message_content(content) for content in message.content] + + def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + if isinstance(content, TextMessageContent): + return {"type": "text", "text": content.artifact.to_text()} + elif isinstance(content, ImageMessageContent): + return { + "type": "image", + "source": {"type": "base64", "media_type": content.artifact.mime_type, "data": content.artifact.base64}, + } + else: + raise ValueError(f"Unsupported prompt content type: {type(content)}") + + def __message_content_to_prompt_stack_content(self, content: ContentBlock) -> BaseMessageContent: + if content.type == "text": + return TextMessageContent(TextArtifact(content.text)) + else: + raise ValueError(f"Unsupported message content type: {content.type}") + + def __message_content_delta_to_prompt_stack_content_delta( + self, content_delta: ContentBlockDeltaEvent + ) -> TextDeltaMessageContent: + index = content_delta.index + + if content_delta.delta.type == "text_delta": + return TextDeltaMessageContent(content_delta.delta.text, index=index) + else: + raise ValueError(f"Unsupported message content delta type : {content_delta.delta.type}") diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 41c91cb65..50e9effe6 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -1,6 +1,6 @@ from attrs import define, field, Factory from typing import Callable, Optional -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.drivers import OpenAiChatPromptDriver import openai diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 90e5259ac..f42e57081 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -1,14 +1,22 @@ from __future__ import annotations + from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Optional from collections.abc import Iterator -from attrs import define, field, Factory -from griptape.events import StartPromptEvent, FinishPromptEvent, CompletionChunkEvent -from griptape.mixins.serializable_mixin import SerializableMixin -from griptape.utils import PromptStack -from griptape.mixins import ExponentialBackoffMixin +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + +from griptape.common import ( + BaseDeltaMessageContent, + DeltaMessage, + TextDeltaMessageContent, + PromptStack, + Message, + TextMessageContent, +) +from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin from griptape.tokenizers import BaseTokenizer -from griptape.artifacts import TextArtifact if TYPE_CHECKING: from griptape.structures import Structure @@ -39,38 +47,28 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): def before_run(self, prompt_stack: PromptStack) -> None: if self.structure: - self.structure.publish_event( - StartPromptEvent( - model=self.model, - token_count=self.tokenizer.count_tokens(self.prompt_stack_to_string(prompt_stack)), - prompt_stack=prompt_stack, - prompt=self.prompt_stack_to_string(prompt_stack), - ) - ) + self.structure.publish_event(StartPromptEvent(model=self.model, prompt_stack=prompt_stack)) - def after_run(self, result: TextArtifact) -> None: + def after_run(self, result: Message) -> None: if self.structure: self.structure.publish_event( FinishPromptEvent( - model=self.model, result=result.value, token_count=self.tokenizer.count_tokens(result.value) + model=self.model, + result=result.value, + input_token_count=result.usage.input_tokens, + output_token_count=result.usage.output_tokens, ) ) - def run(self, prompt_stack: PromptStack) -> TextArtifact: + def run(self, prompt_stack: PromptStack) -> Message: for attempt in self.retrying(): with attempt: self.before_run(prompt_stack) if self.stream: - tokens = [] - completion_chunks = self.try_stream(prompt_stack) - for chunk in completion_chunks: - self.structure.publish_event(CompletionChunkEvent(token=chunk.value)) - tokens.append(chunk.value) - result = TextArtifact(value="".join(tokens).strip()) + result = self.__process_stream(prompt_stack) else: - result = self.try_run(prompt_stack) - result.value = result.value.strip() + result = self.__process_run(prompt_stack) self.after_run(result) @@ -90,20 +88,59 @@ def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: """ prompt_lines = [] - for i in prompt_stack.inputs: + for i in prompt_stack.messages: + content = i.to_text() if i.is_user(): - prompt_lines.append(f"User: {i.content}") + prompt_lines.append(f"User: {content}") elif i.is_assistant(): - prompt_lines.append(f"Assistant: {i.content}") + prompt_lines.append(f"Assistant: {content}") else: - prompt_lines.append(i.content) + prompt_lines.append(content) prompt_lines.append("Assistant:") return "\n\n".join(prompt_lines) @abstractmethod - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: ... + def try_run(self, prompt_stack: PromptStack) -> Message: ... @abstractmethod - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: ... + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: ... + + def __process_run(self, prompt_stack: PromptStack) -> Message: + result = self.try_run(prompt_stack) + + return result + + def __process_stream(self, prompt_stack: PromptStack) -> Message: + delta_contents: dict[int, list[BaseDeltaMessageContent]] = {} + usage = DeltaMessage.Usage() + + # Aggregate all content deltas from the stream + deltas = self.try_stream(prompt_stack) + for delta in deltas: + usage += delta.usage + + if delta.content is not None: + if delta.content.index in delta_contents: + delta_contents[delta.content.index].append(delta.content) + else: + delta_contents[delta.content.index] = [delta.content] + + if isinstance(delta.content, TextDeltaMessageContent): + self.structure.publish_event(CompletionChunkEvent(token=delta.content.text)) + + # Build a complete content from the content deltas + content = [] + for deltas in delta_contents.values(): + text_deltas = [delta for delta in deltas if isinstance(delta, TextDeltaMessageContent)] + if text_deltas: + content.append(TextMessageContent.from_deltas(text_deltas)) + + result = Message( + content=content, + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), + ) + + return result diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index f4a306ebe..331c2c039 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -4,8 +4,17 @@ from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver -from griptape.utils import PromptStack, import_optional_dependency -from griptape.tokenizers import BaseTokenizer, CohereTokenizer +from griptape.tokenizers import CohereTokenizer +from griptape.common import ( + PromptStack, + Message, + DeltaMessage, + TextMessageContent, + BaseMessageContent, + TextDeltaMessageContent, +) +from griptape.utils import import_optional_dependency +from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: from cohere import Client @@ -29,41 +38,71 @@ class CoherePromptDriver(BasePromptDriver): default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True) ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: result = self.client.chat(**self._base_params(prompt_stack)) + usage = result.meta.tokens - return TextArtifact(value=result.text) + return Message( + content=[TextMessageContent(TextArtifact(result.text))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), + ) - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: result = self.client.chat_stream(**self._base_params(prompt_stack)) for event in result: if event.event_type == "text-generation": - yield TextArtifact(value=event.text) + yield DeltaMessage(content=TextDeltaMessageContent(event.text, index=0)) + elif event.event_type == "stream-end": + usage = event.response.meta.tokens - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - if prompt_input.is_system(): - return {"role": "SYSTEM", "text": prompt_input.content} - elif prompt_input.is_user(): - return {"role": "USER", "text": prompt_input.content} - else: - return {"role": "ASSISTANT", "text": prompt_input.content} + yield DeltaMessage( + usage=DeltaMessage.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens) + ) + + def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: + return [ + { + "role": self.__to_role(message), + "content": [self.__prompt_stack_content_message_content(content) for content in message.content], + } + for message in messages + ] def _base_params(self, prompt_stack: PromptStack) -> dict: - user_message = prompt_stack.inputs[-1].content + last_input = prompt_stack.messages[-1] + user_message = last_input.to_text() - history_messages = [ - self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs[:-1] if input.content - ] + history_messages = self._prompt_stack_messages_to_messages( + [message for message in prompt_stack.messages[:-1] if not message.is_system()] + ) - params = { + system_messages = prompt_stack.system_messages + if system_messages: + preamble = system_messages[0].to_text() + else: + preamble = None + + return { "message": user_message, + "chat_history": history_messages, "temperature": self.temperature, "stop_sequences": self.tokenizer.stop_sequences, "max_tokens": self.max_tokens, + **({"preamble": preamble} if preamble else {}), } - if history_messages: - params["chat_history"] = history_messages + def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + if isinstance(content, TextMessageContent): + return {"text": content.artifact.to_text()} + else: + raise ValueError(f"Unsupported content type: {type(content)}") - return params + def __to_role(self, message: Message) -> str: + if message.is_system(): + return "SYSTEM" + elif message.is_user(): + return "USER" + else: + return "CHATBOT" diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index a55ecd4fe..72757624d 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -1,10 +1,12 @@ +from __future__ import annotations from collections.abc import Iterator -from attrs import field, Factory, define -from griptape.tokenizers import DummyTokenizer + +from attrs import Factory, define, field + +from griptape.common import PromptStack, Message, DeltaMessage from griptape.drivers import BasePromptDriver -from griptape.artifacts import TextArtifact from griptape.exceptions import DummyException -from griptape.utils.prompt_stack import PromptStack +from griptape.tokenizers import DummyTokenizer @define @@ -12,11 +14,8 @@ class DummyPromptDriver(BasePromptDriver): model: None = field(init=False, default=None, kw_only=True) tokenizer: DummyTokenizer = field(default=Factory(lambda: DummyTokenizer()), kw_only=True) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: raise DummyException(__class__.__name__, "try_run") - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: raise DummyException(__class__.__name__, "try_stream") - - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - raise DummyException(__class__.__name__, "_prompt_stack_input_to_message") diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 67bc19e24..ff4b07a93 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -1,15 +1,27 @@ from __future__ import annotations + from collections.abc import Iterator -from typing import TYPE_CHECKING, Optional, Any -from attrs import define, field, Factory -from griptape.utils import PromptStack, import_optional_dependency +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact +from griptape.common import ( + BaseMessageContent, + DeltaMessage, + TextDeltaMessageContent, + ImageMessageContent, + PromptStack, + Message, + TextMessageContent, +) from griptape.drivers import BasePromptDriver -from griptape.tokenizers import GoogleTokenizer, BaseTokenizer +from griptape.tokenizers import BaseTokenizer, GoogleTokenizer +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from google.generativeai import GenerativeModel - from google.generativeai.types import ContentDict + from google.generativeai.types import ContentDict, GenerateContentResponse @define @@ -33,12 +45,12 @@ class GooglePromptDriver(BasePromptDriver): top_p: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) top_k: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig - inputs = self._prompt_stack_to_model_input(prompt_stack) - response = self.model_client.generate_content( - inputs, + messages = self._prompt_stack_to_messages(prompt_stack) + response: GenerateContentResponse = self.model_client.generate_content( + messages, generation_config=GenerationConfig( stop_sequences=self.tokenizer.stop_sequences, max_output_tokens=self.max_tokens, @@ -48,14 +60,22 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: ), ) - return TextArtifact(value=response.text) + usage_metadata = response.usage_metadata - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + return Message( + content=[TextMessageContent(TextArtifact(response.text))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage( + input_tokens=usage_metadata.prompt_token_count, output_tokens=usage_metadata.candidates_token_count + ), + ) + + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig - inputs = self._prompt_stack_to_model_input(prompt_stack) - response = self.model_client.generate_content( - inputs, + messages = self._prompt_stack_to_messages(prompt_stack) + response: Iterator[GenerateContentResponse] = self.model_client.generate_content( + messages, stream=True, generation_config=GenerationConfig( stop_sequences=self.tokenizer.stop_sequences, @@ -66,16 +86,27 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: ), ) + prompt_token_count = None for chunk in response: - yield TextArtifact(value=chunk.text) - - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - parts = [prompt_input.content] - - if prompt_input.is_assistant(): - return {"role": "model", "parts": parts} - else: - return {"role": "user", "parts": parts} + usage_metadata = chunk.usage_metadata + + # Only want to output the prompt token count once since it is static each chunk + if prompt_token_count is None: + prompt_token_count = usage_metadata.prompt_token_count + yield DeltaMessage( + content=TextDeltaMessageContent(chunk.text), + role=Message.ASSISTANT_ROLE, + usage=DeltaMessage.Usage( + input_tokens=usage_metadata.prompt_token_count, + output_tokens=usage_metadata.candidates_token_count, + ), + ) + else: + yield DeltaMessage( + content=TextDeltaMessageContent(chunk.text), + role=Message.ASSISTANT_ROLE, + usage=DeltaMessage.Usage(output_tokens=usage_metadata.candidates_token_count), + ) def _default_model_client(self) -> GenerativeModel: genai = import_optional_dependency("google.generativeai") @@ -83,20 +114,35 @@ def _default_model_client(self) -> GenerativeModel: return genai.GenerativeModel(self.model) - def _prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> list[ContentDict]: + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: inputs = [ - self.__to_content_dict(prompt_input) for prompt_input in prompt_stack.inputs if not prompt_input.is_system() + {"role": self.__to_role(message), "parts": self.__to_content(message)} + for message in prompt_stack.messages + if not message.is_system() ] # Gemini does not have the notion of a system message, so we insert it as part of the first message in the history. - system = next((i for i in prompt_stack.inputs if i.is_system()), None) - if system is not None: - inputs[0]["parts"].insert(0, system.content) + system_messages = prompt_stack.system_messages + if system_messages: + inputs[0]["parts"].insert(0, system_messages[0].to_text()) return inputs - def __to_content_dict(self, prompt_input: PromptStack.Input) -> ContentDict: + def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> ContentDict | str: ContentDict = import_optional_dependency("google.generativeai.types").ContentDict - message = self._prompt_stack_input_to_message(prompt_input) - return ContentDict(message) + if isinstance(content, TextMessageContent): + return content.artifact.to_text() + elif isinstance(content, ImageMessageContent): + return ContentDict(mime_type=content.artifact.mime_type, data=content.artifact.value) + else: + raise ValueError(f"Unsupported content type: {type(content)}") + + def __to_role(self, message: Message) -> str: + if message.is_assistant(): + return "model" + else: + return "user" + + def __to_content(self, message: Message) -> list[ContentDict | str]: + return [self.__prompt_stack_content_message_content(content) for content in message.content] diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 3edd252cb..f327010c4 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -5,10 +5,10 @@ from attrs import Factory, define, field -from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer -from griptape.utils import PromptStack, import_optional_dependency +from griptape.common import PromptStack, Message, DeltaMessage, TextDeltaMessageContent +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from huggingface_hub import InferenceClient @@ -47,37 +47,54 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): kw_only=True, ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( prompt, return_full_text=False, max_new_tokens=self.max_tokens, **self.params ) + input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) + output_tokens = len(self.tokenizer.tokenizer.encode(response)) - return TextArtifact(value=response) + return Message( + content=response, + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=input_tokens, output_tokens=output_tokens), + ) - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( prompt, return_full_text=False, max_new_tokens=self.max_tokens, stream=True, **self.params ) + input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) + + full_text = "" for token in response: - yield TextArtifact(value=token) + full_text += token + yield DeltaMessage(content=TextDeltaMessageContent(token, index=0)) - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - return {"role": prompt_input.role, "content": prompt_input.content} + output_tokens = len(self.tokenizer.tokenizer.encode(full_text)) + yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=input_tokens, output_tokens=output_tokens)) def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: return self.tokenizer.tokenizer.decode(self.__prompt_stack_to_tokens(prompt_stack)) + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + messages = [] + for message in prompt_stack.messages: + if len(message.content) == 1: + messages.append({"role": message.role, "content": message.to_text()}) + else: + raise ValueError("Invalid input content length.") + + return messages + def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: - tokens = self.tokenizer.tokenizer.apply_chat_template( - [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], - add_generation_prompt=True, - tokenize=True, - ) + messages = self._prompt_stack_to_messages(prompt_stack) + tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) if isinstance(tokens, list): return tokens diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 4fa291877..6dabc3e20 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -1,13 +1,15 @@ from __future__ import annotations -from collections.abc import Iterator +from collections.abc import Iterator from typing import TYPE_CHECKING + from attrs import Factory, define, field from griptape.artifacts import TextArtifact +from griptape.common import DeltaMessage, PromptStack, Message, TextMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer -from griptape.utils import PromptStack, import_optional_dependency +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from transformers import TextGenerationPipeline @@ -40,43 +42,47 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): ) ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs] + def try_run(self, prompt_stack: PromptStack) -> Message: + messages = self._prompt_stack_to_messages(prompt_stack) result = self.pipe( - messages, - max_new_tokens=self.max_tokens, - tokenizer=self.tokenizer.tokenizer, - stop_strings=self.tokenizer.stop_sequences, - temperature=self.temperature, - do_sample=True, + messages, max_new_tokens=self.max_tokens, temperature=self.temperature, do_sample=True, **self.params ) if isinstance(result, list): if len(result) == 1: generated_text = result[0]["generated_text"][-1]["content"] - return TextArtifact(value=generated_text) + input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) + output_tokens = len(self.tokenizer.tokenizer.encode(generated_text)) + + return Message( + content=[TextMessageContent(TextArtifact(generated_text))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=input_tokens, output_tokens=output_tokens), + ) else: raise Exception("completion with more than one choice is not supported yet") else: raise Exception("invalid output format") - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: raise NotImplementedError("streaming is not supported") def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: return self.tokenizer.tokenizer.decode(self.__prompt_stack_to_tokens(prompt_stack)) - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - return {"role": prompt_input.role, "content": prompt_input.content} + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + messages = [] + + for message in prompt_stack.messages: + messages.append({"role": message.role, "content": message.to_text()}) + + return messages def __prompt_stack_to_tokens(self, prompt_stack: PromptStack) -> list[int]: - tokens = self.tokenizer.tokenizer.apply_chat_template( - [self._prompt_stack_input_to_message(i) for i in prompt_stack.inputs], - add_generation_prompt=True, - tokenize=True, - ) + messages = self._prompt_stack_to_messages(prompt_stack) + tokens = self.tokenizer.tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True) if isinstance(tokens, list): return tokens diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index b21176e82..5a78abf29 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -5,8 +5,11 @@ from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers.base_tokenizer import BaseTokenizer -from griptape.utils import PromptStack, import_optional_dependency +from griptape.common import PromptStack, TextMessageContent +from griptape.utils import import_optional_dependency from griptape.tokenizers import SimpleTokenizer +from griptape.common import Message, DeltaMessage, TextDeltaMessageContent +from griptape.common import ImageMessageContent if TYPE_CHECKING: from ollama import Client @@ -46,24 +49,47 @@ class OllamaPromptDriver(BasePromptDriver): kw_only=True, ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: response = self.client.chat(**self._base_params(prompt_stack)) if isinstance(response, dict): - return TextArtifact(value=response["message"]["content"]) + return Message( + content=[TextMessageContent(TextArtifact(value=response["message"]["content"]))], + role=Message.ASSISTANT_ROLE, + ) else: raise Exception("invalid model response") - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: stream = self.client.chat(**self._base_params(prompt_stack), stream=True) if isinstance(stream, Iterator): for chunk in stream: - yield TextArtifact(value=chunk["message"]["content"]) + yield DeltaMessage(content=TextDeltaMessageContent(chunk["message"]["content"])) else: raise Exception("invalid model response") def _base_params(self, prompt_stack: PromptStack) -> dict: - messages = [{"role": input.role, "content": input.content} for input in prompt_stack.inputs] + messages = self._prompt_stack_to_messages(prompt_stack) return {"messages": messages, "model": self.model, "options": self.options} + + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + return [ + { + "role": message.role, + "content": message.to_text(), + **( + { + "images": [ + content.artifact.base64 + for content in message.content + if isinstance(content, ImageMessageContent) + ] + } + if any(isinstance(content, ImageMessageContent) for content in message.content) + else {} + ), + } + for message in prompt_stack.messages + ] diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 9545bd45a..e1e046d11 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -1,12 +1,28 @@ from __future__ import annotations -from typing import Optional, Literal + from collections.abc import Iterator +from typing import Literal, Optional, TYPE_CHECKING + import openai -from attrs import define, field, Factory +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact -from griptape.utils import PromptStack +from griptape.common import ( + BaseMessageContent, + DeltaMessage, + TextDeltaMessageContent, + ImageMessageContent, + PromptStack, + Message, + TextMessageContent, +) from griptape.drivers import BasePromptDriver -from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer +from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer + + +if TYPE_CHECKING: + from openai.types.chat.chat_completion_message import ChatCompletionMessage + from openai.types.chat.chat_completion_chunk import ChoiceDelta @define @@ -57,57 +73,105 @@ class OpenAiChatPromptDriver(BasePromptDriver): kw_only=True, ) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: result = self.client.chat.completions.create(**self._base_params(prompt_stack)) if len(result.choices) == 1: - return TextArtifact(value=result.choices[0].message.content.strip()) + message = result.choices[0].message + + return Message( + content=[self.__message_to_prompt_stack_content(message)], + role=message.role, + usage=Message.Usage( + input_tokens=result.usage.prompt_tokens, output_tokens=result.usage.completion_tokens + ), + ) else: raise Exception("Completion with more than one choice is not supported yet.") - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - result = self.client.chat.completions.create(**self._base_params(prompt_stack), stream=True) + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: + result = self.client.chat.completions.create( + **self._base_params(prompt_stack), stream=True, stream_options={"include_usage": True} + ) for chunk in result: - if len(chunk.choices) == 1: - delta = chunk.choices[0].delta - else: - raise Exception("Completion with more than one choice is not supported yet.") - - if delta.content is not None: - delta_content = delta.content - - yield TextArtifact(value=delta_content) - - def _prompt_stack_input_to_message(self, prompt_input: PromptStack.Input) -> dict: - content = prompt_input.content - - if prompt_input.is_system(): - return {"role": "system", "content": content} - elif prompt_input.is_assistant(): - return {"role": "assistant", "content": content} - else: - return {"role": "user", "content": content} + if chunk.usage is not None: + yield DeltaMessage( + usage=DeltaMessage.Usage( + input_tokens=chunk.usage.prompt_tokens, output_tokens=chunk.usage.completion_tokens + ) + ) + elif chunk.choices is not None: + if len(chunk.choices) == 1: + choice = chunk.choices[0] + delta = choice.delta + + yield DeltaMessage(content=self.__message_delta_to_prompt_stack_content_delta(delta)) + else: + raise Exception("Completion with more than one choice is not supported yet.") + + def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + return [ + {"role": self.__to_role(message), "content": self.__to_content(message)} + for message in prompt_stack.messages + ] def _base_params(self, prompt_stack: PromptStack) -> dict: params = { "model": self.model, "temperature": self.temperature, - "stop": self.tokenizer.stop_sequences, "user": self.user, "seed": self.seed, + **({"stop": self.tokenizer.stop_sequences} if self.tokenizer.stop_sequences else {}), + **({"max_tokens": self.max_tokens} if self.max_tokens is not None else {}), } if self.response_format == "json_object": params["response_format"] = {"type": "json_object"} - # JSON mode still requires a system input instructing the LLM to output JSON. - prompt_stack.add_system_input("Provide your response as a valid JSON object.") + # JSON mode still requires a system message instructing the LLM to output JSON. + prompt_stack.add_system_message("Provide your response as a valid JSON object.") - messages = [self._prompt_stack_input_to_message(input) for input in prompt_stack.inputs] - - if self.max_tokens is not None: - params["max_tokens"] = self.max_tokens + messages = self._prompt_stack_to_messages(prompt_stack) params["messages"] = messages return params + + def __to_role(self, message: Message) -> str: + if message.is_system(): + return "system" + elif message.is_assistant(): + return "assistant" + else: + return "user" + + def __to_content(self, message: Message) -> str | list[dict]: + if all(isinstance(content, TextMessageContent) for content in message.content): + return message.to_text() + else: + return [self.__prompt_stack_content_message_content(content) for content in message.content] + + def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + if isinstance(content, TextMessageContent): + return {"type": "text", "text": content.artifact.to_text()} + elif isinstance(content, ImageMessageContent): + return { + "type": "image_url", + "image_url": {"url": f"data:{content.artifact.mime_type};base64,{content.artifact.base64}"}, + } + else: + raise ValueError(f"Unsupported content type: {type(content)}") + + def __message_to_prompt_stack_content(self, message: ChatCompletionMessage) -> BaseMessageContent: + if message.content is not None: + return TextMessageContent(TextArtifact(message.content)) + else: + raise ValueError(f"Unsupported message type: {message}") + + def __message_delta_to_prompt_stack_content_delta(self, content_delta: ChoiceDelta) -> TextDeltaMessageContent: + if content_delta.content is None: + return TextDeltaMessageContent("") + else: + delta_content = content_delta.content + + return TextDeltaMessageContent(delta_content) diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index fe4d0e6c7..6fe9bb879 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -4,7 +4,8 @@ import io from attrs import field, Factory, define from griptape.artifacts import TextArtifact, CsvRowArtifact, ListArtifact, ErrorArtifact -from griptape.utils import PromptStack +from griptape.common import PromptStack +from griptape.common.prompt_stack.messages.message import Message from griptape.engines import BaseExtractionEngine from griptape.utils import J2 from griptape.rules import Ruleset @@ -63,9 +64,7 @@ def _extract_rec( if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: rows.extend( self.text_to_csv_rows( - self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(full_text, role=PromptStack.USER_ROLE)]) - ).value, + self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value, column_names, ) ) @@ -81,9 +80,7 @@ def _extract_rec( rows.extend( self.text_to_csv_rows( - self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(partial_text, role=PromptStack.USER_ROLE)]) - ).value, + self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value, column_names, ) ) diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index 05db19d40..830092dab 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -3,9 +3,10 @@ import json from attrs import field, Factory, define from griptape.artifacts import TextArtifact, ListArtifact, ErrorArtifact +from griptape.common.prompt_stack.messages.message import Message from griptape.engines import BaseExtractionEngine from griptape.utils import J2 -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.rules import Ruleset @@ -58,9 +59,7 @@ def _extract_rec( if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(full_text, role=PromptStack.USER_ROLE)]) - ).value + self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value ) ) @@ -75,9 +74,7 @@ def _extract_rec( extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run( - PromptStack(inputs=[PromptStack.Input(partial_text, role=PromptStack.USER_ROLE)]) - ).value + self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value ) ) diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 8e9b42e93..13563970d 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -4,7 +4,7 @@ from attrs import define, field, Factory -from griptape.utils import PromptStack +from griptape.common import PromptStack, Message @define(kw_only=True) @@ -15,8 +15,5 @@ class BaseRagModule(ABC): def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptStack: return PromptStack( - inputs=[ - PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(query, role=PromptStack.USER_ROLE), - ] + messages=[Message(system_prompt, role=Message.SYSTEM_ROLE), Message(query, role=Message.USER_ROLE)] ) diff --git a/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py b/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py index 9e7c3b08f..26d95bdd1 100644 --- a/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py +++ b/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py @@ -1,5 +1,6 @@ from typing import Callable from attrs import define, field, Factory +from griptape.artifacts.text_artifact import TextArtifact from griptape.drivers import BasePromptDriver from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseGenerationRagModule @@ -40,7 +41,12 @@ def run(self, context: RagContext) -> RagContext: break - context.output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)) + output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)).to_artifact() + + if isinstance(output, TextArtifact): + context.output = output + else: + raise ValueError("Prompt driver did not return a TextArtifact") return context diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 9d3e8db78..51259e444 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -2,7 +2,8 @@ from attrs import define, Factory, field from griptape.artifacts import TextArtifact, ListArtifact from griptape.chunkers import BaseChunker, TextChunker -from griptape.utils import PromptStack +from griptape.common import PromptStack +from griptape.common.prompt_stack.messages.message import Message from griptape.drivers import BasePromptDriver from griptape.engines import BaseSummaryEngine from griptape.utils import J2 @@ -60,14 +61,19 @@ def summarize_artifacts_rec( self.prompt_driver.tokenizer.count_input_tokens_left(user_prompt + system_prompt) >= self.min_response_tokens ): - return self.prompt_driver.run( + result = self.prompt_driver.run( PromptStack( - inputs=[ - PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(user_prompt, role=PromptStack.USER_ROLE), + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(user_prompt, role=Message.USER_ROLE), ] ) - ) + ).to_artifact() + + if isinstance(result, TextArtifact): + return result + else: + raise ValueError("Prompt driver did not return a TextArtifact") else: chunks = self.chunker.chunk(artifacts_text) @@ -77,9 +83,9 @@ def summarize_artifacts_rec( chunks[1:], self.prompt_driver.run( PromptStack( - inputs=[ - PromptStack.Input(system_prompt, role=PromptStack.SYSTEM_ROLE), - PromptStack.Input(partial_text, role=PromptStack.USER_ROLE), + messages=[ + Message(system_prompt, role=Message.SYSTEM_ROLE), + Message(partial_text, role=Message.USER_ROLE), ] ) ).value, diff --git a/griptape/events/base_prompt_event.py b/griptape/events/base_prompt_event.py index b9dcd0c57..4a44599cc 100644 --- a/griptape/events/base_prompt_event.py +++ b/griptape/events/base_prompt_event.py @@ -7,4 +7,3 @@ @define class BasePromptEvent(BaseEvent, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) - token_count: int = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/finish_prompt_event.py b/griptape/events/finish_prompt_event.py index 83bc1b9ef..79e338871 100644 --- a/griptape/events/finish_prompt_event.py +++ b/griptape/events/finish_prompt_event.py @@ -1,7 +1,10 @@ from attrs import define, field +from typing import Optional from griptape.events.base_prompt_event import BasePromptEvent @define class FinishPromptEvent(BasePromptEvent): result: str = field(kw_only=True, metadata={"serializable": True}) + input_token_count: Optional[float] = field(kw_only=True, metadata={"serializable": True}) + output_token_count: Optional[float] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/start_prompt_event.py b/griptape/events/start_prompt_event.py index 7ab418adb..35dae95d6 100644 --- a/griptape/events/start_prompt_event.py +++ b/griptape/events/start_prompt_event.py @@ -5,10 +5,9 @@ from griptape.events.base_prompt_event import BasePromptEvent if TYPE_CHECKING: - from griptape.utils import PromptStack + from griptape.common import PromptStack @define class StartPromptEvent(BasePromptEvent): prompt_stack: PromptStack = field(kw_only=True, metadata={"serializable": True}) - prompt: str = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index f8cc51743..a8133d64b 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.memory.structure import Run -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.mixins import SerializableMixin from abc import ABC, abstractmethod @@ -47,7 +47,7 @@ def try_add_run(self, run: Run) -> None: ... def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: ... def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = None) -> PromptStack: - """Add the Conversation Memory runs to the Prompt Stack by modifying the inputs in place. + """Add the Conversation Memory runs to the Prompt Stack by modifying the messages in place. If autoprune is enabled, this will fit as many Conversation Memory runs into the Prompt Stack as possible without exceeding the token limit. @@ -67,15 +67,15 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = # Try to determine how many Conversation Memory runs we can # fit into the Prompt Stack without exceeding the token limit. while should_prune and num_runs_to_fit_in_prompt > 0: - temp_stack.inputs = prompt_stack.inputs.copy() + temp_stack.messages = prompt_stack.messages.copy() # Add n runs from Conversation Memory. # Where we insert into the Prompt Stack doesn't matter here # since we only care about the total token count. - memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).inputs - temp_stack.inputs.extend(memory_inputs) + memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).messages + temp_stack.messages.extend(memory_inputs) - # Convert the prompt stack into tokens left. + # Convert the Prompt Stack into tokens left. tokens_left = prompt_driver.tokenizer.count_input_tokens_left( prompt_driver.prompt_stack_to_string(temp_stack) ) @@ -87,10 +87,10 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = num_runs_to_fit_in_prompt -= 1 if num_runs_to_fit_in_prompt: - memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).inputs + memory_inputs = self.to_prompt_stack(num_runs_to_fit_in_prompt).messages if index: - prompt_stack.inputs[index:index] = memory_inputs + prompt_stack.messages[index:index] = memory_inputs else: - prompt_stack.inputs.extend(memory_inputs) + prompt_stack.messages.extend(memory_inputs) return prompt_stack diff --git a/griptape/memory/structure/conversation_memory.py b/griptape/memory/structure/conversation_memory.py index 94e73d80c..42d160abd 100644 --- a/griptape/memory/structure/conversation_memory.py +++ b/griptape/memory/structure/conversation_memory.py @@ -2,7 +2,7 @@ from attrs import define from typing import Optional from griptape.memory.structure import Run, BaseConversationMemory -from griptape.utils import PromptStack +from griptape.common import PromptStack @define @@ -18,6 +18,6 @@ def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: prompt_stack = PromptStack() runs = self.runs[-last_n:] if last_n else self.runs for run in runs: - prompt_stack.add_user_input(run.input) - prompt_stack.add_assistant_input(run.output) + prompt_stack.add_user_message(run.input) + prompt_stack.add_assistant_message(run.output) return prompt_stack diff --git a/griptape/memory/structure/run.py b/griptape/memory/structure/run.py index c5a2b9b55..b91df2ae9 100644 --- a/griptape/memory/structure/run.py +++ b/griptape/memory/structure/run.py @@ -1,10 +1,11 @@ import uuid from attrs import define, field, Factory +from griptape.artifacts.base_artifact import BaseArtifact from griptape.mixins import SerializableMixin @define class Run(SerializableMixin): id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True, metadata={"serializable": True}) - input: str = field(kw_only=True, metadata={"serializable": True}) - output: str = field(kw_only=True, metadata={"serializable": True}) + input: BaseArtifact = field(kw_only=True, metadata={"serializable": True}) + output: BaseArtifact = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index e4d5597d5..b88a4b4e6 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -2,7 +2,9 @@ import logging from typing import TYPE_CHECKING, Optional from attrs import define, field, Factory -from griptape.utils import J2, PromptStack +from griptape.common.prompt_stack.messages.message import Message +from griptape.utils import J2 +from griptape.common import PromptStack from griptape.memory.structure import ConversationMemory if TYPE_CHECKING: @@ -37,11 +39,11 @@ def prompt_driver(self, value: BasePromptDriver) -> None: def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: stack = PromptStack() if self.summary: - stack.add_user_input(self.summary_template_generator.render(summary=self.summary)) + stack.add_user_message(self.summary_template_generator.render(summary=self.summary)) for r in self.unsummarized_runs(last_n): - stack.add_user_input(r.input) - stack.add_assistant_input(r.output) + stack.add_user_message(r.input) + stack.add_assistant_message(r.output) return stack @@ -73,7 +75,7 @@ def summarize_runs(self, previous_summary: str | None, runs: list[Run]) -> str | if len(runs) > 0: summary = self.summarize_conversation_template_generator.render(summary=previous_summary, runs=runs) return self.prompt_driver.run( - prompt_stack=PromptStack(inputs=[PromptStack.Input(summary, role=PromptStack.USER_ROLE)]) + prompt_stack=PromptStack(messages=[Message(summary, role=Message.USER_ROLE)]) ).to_text() else: return previous_summary diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 6ba23d6fe..1099e1bf7 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -105,7 +105,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver from griptape.structures import Structure - from griptape.utils import PromptStack + from griptape.common import PromptStack, Message from griptape.tokenizers.base_tokenizer import BaseTokenizer from typing import Any @@ -116,7 +116,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: attrs_cls, localns={ "PromptStack": PromptStack, - "Input": PromptStack.Input, + "Usage": Message.Usage, "Structure": Structure, "BaseConversationMemoryDriver": BaseConversationMemoryDriver, "BasePromptDriver": BasePromptDriver, diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 2840d5c46..598aae37c 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -1,10 +1,12 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Optional, Callable from attrs import define, field +from griptape.artifacts.text_artifact import TextArtifact from griptape.tools import BaseTool from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask +from griptape.artifacts import BaseArtifact if TYPE_CHECKING: from griptape.tasks import BaseTask @@ -12,7 +14,9 @@ @define class Agent(Structure): - input_template: str = field(default=PromptTask.DEFAULT_INPUT_TEMPLATE) + input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( + default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value="") + ) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) fail_fast: bool = field(default=False, kw_only=True) @@ -26,11 +30,9 @@ def __attrs_post_init__(self) -> None: super().__attrs_post_init__() if len(self.tasks) == 0: if self.tools: - task = ToolkitTask( - self.input_template, tools=self.tools, max_meta_memory_entries=self.max_meta_memory_entries - ) + task = ToolkitTask(self.input, tools=self.tools, max_meta_memory_entries=self.max_meta_memory_entries) else: - task = PromptTask(self.input_template, max_meta_memory_entries=self.max_meta_memory_entries) + task = PromptTask(self.input, max_meta_memory_entries=self.max_meta_memory_entries) self.add_task(task) @@ -56,12 +58,7 @@ def try_run(self, *args) -> Agent: self.task.execute() if self.conversation_memory and self.output is not None: - if isinstance(self.task.input, tuple): - input_text = self.task.input[0].to_text() - else: - input_text = self.task.input.to_text() - - run = Run(input=input_text, output=self.task.output.to_text()) + run = Run(input=self.input_task.input, output=self.output) self.conversation_memory.add_run(run) diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 4fc784974..408a42225 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -46,12 +46,7 @@ def try_run(self, *args) -> Pipeline: self.__run_from_task(self.input_task) if self.conversation_memory and self.output is not None: - if isinstance(self.input_task.input, tuple): - input_text = self.input_task.input[0].to_text() - else: - input_text = self.input_task.input.to_text() - - run = Run(input=input_text, output=self.output.to_text()) + run = Run(input=self.input_task.input, output=self.output) self.conversation_memory.add_run(run) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 204650c41..3689f7330 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -120,12 +120,7 @@ def try_run(self, *args) -> Workflow: break if self.conversation_memory and self.output is not None: - if isinstance(self.input_task.input, tuple): - input_text = self.input_task.input[0].to_text() - else: - input_text = self.input_task.input.to_text() - - run = Run(input=input_text, output=self.output_task.output.to_text()) + run = Run(input=self.input_task.input, output=self.output) self.conversation_memory.add_run(run) diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 694a5050d..f10899f76 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -1,10 +1,15 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Callable -from attrs import define, field, Factory -from griptape.utils import PromptStack -from griptape.utils import J2 -from griptape.tasks import BaseTextInputTask + +from typing import TYPE_CHECKING, Callable, Optional + +from attrs import Factory, define, field + from griptape.artifacts import BaseArtifact +from griptape.common import PromptStack +from griptape.tasks import BaseTask +from griptape.utils import J2 +from griptape.artifacts import TextArtifact, ListArtifact +from griptape.mixins import RuleMixin if TYPE_CHECKING: from griptape.drivers import BasePromptDriver @@ -12,11 +17,23 @@ @define -class PromptTask(BaseTextInputTask): +class PromptTask(RuleMixin, BaseTask): _prompt_driver: Optional[BasePromptDriver] = field(default=None, kw_only=True, alias="prompt_driver") generate_system_template: Callable[[PromptTask], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True ) + _input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( + default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), + alias="input", + ) + + @property + def input(self) -> BaseArtifact: + return self._process_task_input(self._input) + + @input.setter + def input(self, value: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact]) -> None: + self._input = value output: Optional[BaseArtifact] = field(default=None, init=False) @@ -25,12 +42,12 @@ def prompt_stack(self) -> PromptStack: stack = PromptStack() memory = self.structure.conversation_memory - stack.add_system_input(self.generate_system_template(self)) + stack.add_system_message(self.generate_system_template(self)) - stack.add_user_input(self.input.to_text()) + stack.add_user_message(self.input) if self.output: - stack.add_assistant_input(self.output.to_text()) + stack.add_assistant_message(self.output) if memory: # inserting at index 1 to place memory right after system prompt @@ -59,7 +76,35 @@ def default_system_template_generator(self, _: PromptTask) -> str: rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets) ) - def run(self) -> BaseArtifact: - self.output = self.prompt_driver.run(self.prompt_stack) + def before_run(self) -> None: + super().before_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text()}") - return self.output + def after_run(self) -> None: + super().after_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") + + def run(self) -> BaseArtifact: + message = self.prompt_driver.run(self.prompt_stack) + + return message.to_artifact() + + def _process_task_input( + self, task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact] + ) -> BaseArtifact: + if isinstance(task_input, TextArtifact): + task_input.value = J2().render_from_string(task_input.value, **self.full_context) + + return task_input + elif isinstance(task_input, Callable): + return self._process_task_input(task_input(self)) + elif isinstance(task_input, str): + return self._process_task_input(TextArtifact(task_input)) + elif isinstance(task_input, BaseArtifact): + return task_input + elif isinstance(task_input, list) or isinstance(task_input, tuple): + return ListArtifact([self._process_task_input(elem) for elem in task_input]) + else: + raise ValueError(f"Invalid input type: {type(task_input)} ") diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index c99f9e23f..58300b529 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -10,7 +10,7 @@ from griptape.tasks import ActionsSubtask from griptape.tasks import PromptTask from griptape.utils import J2 -from griptape.utils import PromptStack +from griptape.common import PromptStack if TYPE_CHECKING: from griptape.tools import BaseTool @@ -65,16 +65,16 @@ def prompt_stack(self) -> PromptStack: stack = PromptStack() memory = self.structure.conversation_memory - stack.add_system_input(self.generate_system_template(self)) + stack.add_system_message(self.generate_system_template(self)) - stack.add_user_input(self.input.to_text()) + stack.add_user_message(self.input) if self.output: - stack.add_assistant_input(self.output.to_text()) + stack.add_assistant_message(self.output.to_text()) else: for s in self.subtasks: - stack.add_assistant_input(self.generate_assistant_subtask_template(s)) - stack.add_user_input(self.generate_user_subtask_template(s)) + stack.add_assistant_message(self.generate_assistant_subtask_template(s)) + stack.add_user_message(self.generate_user_subtask_template(s)) if memory: # inserting at index 1 to place memory right after system prompt diff --git a/griptape/tokenizers/amazon_bedrock_tokenizer.py b/griptape/tokenizers/amazon_bedrock_tokenizer.py index 670b5739a..951802d59 100644 --- a/griptape/tokenizers/amazon_bedrock_tokenizer.py +++ b/griptape/tokenizers/amazon_bedrock_tokenizer.py @@ -1,4 +1,5 @@ from __future__ import annotations + from attrs import define, field from griptape.tokenizers.base_tokenizer import BaseTokenizer diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index a8312567d..fdebd23da 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -1,4 +1,5 @@ from __future__ import annotations + from typing import TYPE_CHECKING from attrs import define, field, Factory from griptape.utils import import_optional_dependency diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index 39a2a033e..a58ec5ce5 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -1,8 +1,11 @@ from __future__ import annotations + import logging -from attrs import define, field, Factory -import tiktoken from typing import Optional + +import tiktoken +from attrs import Factory, define, field + from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tokenizers/voyageai_tokenizer.py b/griptape/tokenizers/voyageai_tokenizer.py index d8fb5adf1..649f6e0cc 100644 --- a/griptape/tokenizers/voyageai_tokenizer.py +++ b/griptape/tokenizers/voyageai_tokenizer.py @@ -1,8 +1,11 @@ from __future__ import annotations -from attrs import define, field, Factory + from typing import TYPE_CHECKING, Optional -from griptape.utils import import_optional_dependency + +from attrs import Factory, define, field + from griptape.tokenizers import BaseTokenizer +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from voyageai import Client diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index 50020a1ea..6f4ce0e1f 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -30,20 +30,15 @@ class PromptImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): Literal( "prompts", description="A detailed list of features and descriptions to include in the generated image.", - ): list[str], - Literal( - "negative_prompts", - description="A detailed list of features and descriptions to avoid in the generated image.", - ): list[str], + ): list[str] } ), } ) def generate_image(self, params: dict[str, dict[str, list[str]]]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] - negative_prompts = params["values"]["negative_prompts"] - output_artifact = self.engine.run(prompts=prompts, negative_prompts=negative_prompts) + output_artifact = self.engine.run(prompts=prompts) if self.output_dir or self.output_file: self._write_to_file(output_artifact) diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index 5ca129993..a84703f39 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -8,7 +8,6 @@ from .futures import execute_futures_dict from .futures import execute_futures_list from .token_counter import TokenCounter -from .prompt_stack import PromptStack from .dict_utils import remove_null_values_in_dict_recursively, dict_merge from .file_utils import load_file, load_files from .hash import str_to_hash @@ -38,7 +37,6 @@ def minify_json(value: str) -> str: "execute_futures_dict", "execute_futures_list", "TokenCounter", - "PromptStack", "remove_null_values_in_dict_recursively", "dict_merge", "Stream", diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index 2d87563ae..ae05e8b99 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -22,8 +22,8 @@ def lines(self) -> list[str]: def prompt_stack(self) -> list[str]: lines = [] - for stack in self.memory.to_prompt_stack().inputs: - lines.append(f"{stack.role}: {stack.content}") + for stack in self.memory.to_prompt_stack().messages: + lines.append(f"{stack.role}: {stack.to_text()}") return lines diff --git a/griptape/utils/prompt_stack.py b/griptape/utils/prompt_stack.py deleted file mode 100644 index 378f9dd1e..000000000 --- a/griptape/utils/prompt_stack.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations -from attrs import define, field - -from griptape.mixins import SerializableMixin - - -@define -class PromptStack(SerializableMixin): - GENERIC_ROLE = "generic" - USER_ROLE = "user" - ASSISTANT_ROLE = "assistant" - SYSTEM_ROLE = "system" - - @define - class Input(SerializableMixin): - content: str = field(metadata={"serializable": True}) - role: str = field(metadata={"serializable": True}) - - def is_generic(self) -> bool: - return self.role == PromptStack.GENERIC_ROLE - - def is_system(self) -> bool: - return self.role == PromptStack.SYSTEM_ROLE - - def is_user(self) -> bool: - return self.role == PromptStack.USER_ROLE - - def is_assistant(self) -> bool: - return self.role == PromptStack.ASSISTANT_ROLE - - inputs: list[Input] = field(factory=list, kw_only=True, metadata={"serializable": True}) - - def add_input(self, content: str, role: str) -> Input: - self.inputs.append(self.Input(content=content, role=role)) - - return self.inputs[-1] - - def add_generic_input(self, content: str) -> Input: - return self.add_input(content, self.GENERIC_ROLE) - - def add_system_input(self, content: str) -> Input: - return self.add_input(content, self.SYSTEM_ROLE) - - def add_user_input(self, content: str) -> Input: - return self.add_input(content, self.USER_ROLE) - - def add_assistant_input(self, content: str) -> Input: - return self.add_input(content, self.ASSISTANT_ROLE) diff --git a/tests/mocks/mock_failing_prompt_driver.py b/tests/mocks/mock_failing_prompt_driver.py index c97b25d86..0dbeb8fda 100644 --- a/tests/mocks/mock_failing_prompt_driver.py +++ b/tests/mocks/mock_failing_prompt_driver.py @@ -1,10 +1,11 @@ +from __future__ import annotations from collections.abc import Iterator from attrs import define -from griptape.utils import PromptStack -from griptape.drivers import BasePromptDriver -from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer from griptape.artifacts import TextArtifact +from griptape.common import PromptStack, Message, TextMessageContent, DeltaMessage, TextDeltaMessageContent +from griptape.drivers import BasePromptDriver +from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer @define @@ -14,18 +15,25 @@ class MockFailingPromptDriver(BasePromptDriver): model: str = "test-model" tokenizer: BaseTokenizer = OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: + def try_run(self, prompt_stack: PromptStack) -> Message: if self.current_attempt < self.max_failures: self.current_attempt += 1 - raise Exception(f"failed attempt") + raise Exception("failed attempt") else: - return TextArtifact("success") + return Message( + content=[TextMessageContent(TextArtifact("success"))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), + ) - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: if self.current_attempt < self.max_failures: self.current_attempt += 1 - raise Exception(f"failed attempt") + raise Exception("failed attempt") else: - yield TextArtifact("success") + yield DeltaMessage( + content=TextDeltaMessageContent("success"), + usage=DeltaMessage.Usage(input_tokens=100, output_tokens=100), + ) diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index 3235f7cd5..4786b78a6 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -1,11 +1,15 @@ from __future__ import annotations + from collections.abc import Iterator from typing import Callable + from attrs import define, field -from griptape.utils import PromptStack + +from griptape.artifacts import TextArtifact +from griptape.common import PromptStack, Message, DeltaMessage, TextMessageContent, TextDeltaMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer -from griptape.artifacts import TextArtifact + from tests.mocks.mock_tokenizer import MockTokenizer @@ -16,12 +20,18 @@ class MockPromptDriver(BasePromptDriver): mock_input: str | Callable[[], str] = field(default="mock input", kw_only=True) mock_output: str | Callable[[PromptStack], str] = field(default="mock output", kw_only=True) - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - return TextArtifact( - value=self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output - ) + def try_run(self, prompt_stack: PromptStack) -> Message: + output = self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - yield TextArtifact( - value=self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output + return Message( + content=[TextMessageContent(TextArtifact(output))], + role=Message.ASSISTANT_ROLE, + usage=Message.Usage(input_tokens=100, output_tokens=100), ) + + def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: + output = self.mock_output(prompt_stack) if isinstance(self.mock_output, Callable) else self.mock_output + + yield DeltaMessage(content=TextDeltaMessageContent(output)) + + yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=100, output_tokens=100)) diff --git a/tests/mocks/mock_value_prompt_driver.py b/tests/mocks/mock_value_prompt_driver.py deleted file mode 100644 index 12ddeec9f..000000000 --- a/tests/mocks/mock_value_prompt_driver.py +++ /dev/null @@ -1,21 +0,0 @@ -from collections.abc import Iterator -from attrs import define, field, Factory -from griptape.drivers import BasePromptDriver -from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer -from griptape.artifacts import TextArtifact -from griptape.utils.prompt_stack import PromptStack - - -@define -class MockValuePromptDriver(BasePromptDriver): - value: str = field(kw_only=True) - model: str = field(default="test-model") - tokenizer: BaseTokenizer = field( - default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)) - ) - - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - return TextArtifact(value=self.value) - - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - yield TextArtifact(value=self.value) diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index 72e623ff0..ad96f2a35 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -19,7 +19,7 @@ def test_to_dict(self, config): "temperature": 0.1, "max_tokens": None, "stream": False, - "model": "gemini-pro", + "model": "gemini-1.5-pro", "top_p": None, "top_k": None, }, diff --git a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py index ef3b0e1df..80d77d24d 100644 --- a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py @@ -81,5 +81,5 @@ def test_load(self): assert new_memory.type == "ConversationMemory" assert len(new_memory.runs) == 2 - assert new_memory.runs[0].input == "test" - assert new_memory.runs[0].output == "mock output" + assert new_memory.runs[0].input.value == "test" + assert new_memory.runs[0].output.value == "mock output" diff --git a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py index d12d5d3d2..c794afd0e 100644 --- a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py @@ -52,8 +52,8 @@ def test_load(self): assert new_memory.type == "ConversationMemory" assert len(new_memory.runs) == 2 - assert new_memory.runs[0].input == "test" - assert new_memory.runs[0].output == "mock output" + assert new_memory.runs[0].input.value == "test" + assert new_memory.runs[0].output.value == "mock output" assert new_memory.max_runs == 5 def test_autoload(self): @@ -71,8 +71,8 @@ def test_autoload(self): assert autoloaded_memory.type == "ConversationMemory" assert len(autoloaded_memory.runs) == 2 - assert autoloaded_memory.runs[0].input == "test" - assert autoloaded_memory.runs[0].output == "mock output" + assert autoloaded_memory.runs[0].input.value == "test" + assert autoloaded_memory.runs[0].output.value == "mock output" def __delete_file(self, file_path): try: diff --git a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py index 13f75d464..1af9d74dc 100644 --- a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py @@ -3,7 +3,7 @@ from griptape.memory.structure.base_conversation_memory import BaseConversationMemory from griptape.drivers.memory.conversation.redis_conversation_memory_driver import RedisConversationMemoryDriver -TEST_CONVERSATION = '{"type": "ConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": "Hi There, Hello", "output": "Hello! How can I assist you today?"}], "max_runs": 2}' +TEST_CONVERSATION = '{"type": "ConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": {"type": "TextArtifact", "id": "1234", "value": "Hi There, Hello"}, "output": {"type": "TextArtifact", "id": "123", "value": "Hello! How can I assist you today?"}}], "max_runs": 2}' CONVERSATION_ID = "117151897f344ff684b553d0655d8f39" INDEX = "griptape_conversation" HOST = "127.0.0.1" diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 8aa345595..3cd165140 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -1,6 +1,7 @@ import pytest -from griptape.utils import PromptStack +from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.common import PromptStack from griptape.drivers import AmazonBedrockPromptDriver @@ -9,7 +10,10 @@ class TestAmazonBedrockPromptDriver: def mock_converse(self, mocker): mock_converse = mocker.patch("boto3.Session").return_value.client.return_value.converse - mock_converse.return_value = {"output": {"message": {"content": [{"text": "model-output"}]}}} + mock_converse.return_value = { + "output": {"message": {"content": [{"text": "model-output"}]}}, + "usage": {"inputTokens": 5, "outputTokens": 10}, + } return mock_converse @@ -17,26 +21,33 @@ def mock_converse(self, mocker): def mock_converse_stream(self, mocker): mock_converse_stream = mocker.patch("boto3.Session").return_value.client.return_value.converse_stream - mock_converse_stream.return_value = {"stream": [{"contentBlockDelta": {"delta": {"text": "model-output"}}}]} + mock_converse_stream.return_value = { + "stream": [ + {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": "model-output"}}}, + {"metadata": {"usage": {"inputTokens": 5, "outputTokens": 10}}}, + ] + } return mock_converse_stream - @pytest.fixture - def prompt_stack(self): + @pytest.fixture(params=[True, False]) + def prompt_stack(self, request): prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + if request.param: + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message(TextArtifact("user-input")) + prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_assistant_message("assistant-input") return prompt_stack @pytest.fixture def messages(self): return [ - {"role": "user", "content": [{"text": "generic-input"}]}, - {"role": "system", "content": [{"text": "system-input"}]}, {"role": "user", "content": [{"text": "user-input"}]}, + {"role": "user", "content": [{"text": "user-input"}]}, + {"role": "user", "content": [{"image": {"format": "png", "source": {"bytes": b"image-data"}}}]}, {"role": "assistant", "content": [{"text": "assistant-input"}]}, ] @@ -50,34 +61,34 @@ def test_try_run(self, mock_converse, prompt_stack, messages): # Then mock_converse.assert_called_once_with( modelId=driver.model, - messages=[ - {"role": "user", "content": [{"text": "generic-input"}]}, - {"role": "user", "content": [{"text": "user-input"}]}, - {"role": "assistant", "content": [{"text": "assistant-input"}]}, - ], - system=[{"text": "system-input"}], + messages=messages, + **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), inferenceConfig={"temperature": driver.temperature}, additionalModelRequestFields={}, ) assert text_artifact.value == "model-output" + assert text_artifact.usage.input_tokens == 5 + assert text_artifact.usage.output_tokens == 10 def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages): # Given driver = AmazonBedrockPromptDriver(model="ai21.j2", stream=True) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then mock_converse_stream.assert_called_once_with( modelId=driver.model, - messages=[ - {"role": "user", "content": [{"text": "generic-input"}]}, - {"role": "user", "content": [{"text": "user-input"}]}, - {"role": "assistant", "content": [{"text": "assistant-input"}]}, - ], - system=[{"text": "system-input"}], + messages=messages, + **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), inferenceConfig={"temperature": driver.temperature}, additionalModelRequestFields={}, ) - assert text_artifact.value == "model-output" + + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.input_tokens == 5 + assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py index 4ae8fe944..a75fc6ed0 100644 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py @@ -2,7 +2,7 @@ from botocore.response import StreamingBody from griptape.tokenizers import HuggingFaceTokenizer from griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver import AmazonSageMakerJumpstartPromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack from io import BytesIO import json import pytest @@ -18,7 +18,9 @@ class TestAmazonSageMakerJumpstartPromptDriver: @pytest.fixture(autouse=True) def tokenizer(self, mocker): from_pretrained = mocker.patch("transformers.AutoTokenizer").from_pretrained - from_pretrained.return_value.apply_chat_template.return_value = "foo\n\nUser: bar" + from_pretrained.return_value.decode.return_value = "foo\n\nUser: bar" + from_pretrained.return_value.apply_chat_template.return_value = [1, 2, 3] + from_pretrained.return_value.encode.return_value = [1, 2, 3] from_pretrained.return_value.model_max_length = 8000 from_pretrained.return_value.eos_token_id = 1 @@ -35,7 +37,7 @@ def test_try_run(self, mock_client): # Given driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") prompt_stack = PromptStack() - prompt_stack.add_user_input("prompt-stack") + prompt_stack.add_user_message("prompt-stack") # When response_body = [{"generated_text": "foobar"}] @@ -64,6 +66,8 @@ def test_try_run(self, mock_client): ) assert text_artifact.value == "foobar" + assert text_artifact.usage.input_tokens == 3 + assert text_artifact.usage.output_tokens == 3 # When response_body = {"generated_text": "foobar"} @@ -97,7 +101,7 @@ def test_try_stream(self, mock_client): # Given driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") prompt_stack = PromptStack() - prompt_stack.add_user_input("prompt-stack") + prompt_stack.add_user_message("prompt-stack") # When with pytest.raises(NotImplementedError) as e: @@ -122,7 +126,7 @@ def test_try_run_throws_on_empty_response(self, mock_client): driver = AmazonSageMakerJumpstartPromptDriver(endpoint="model", model="model") mock_client.invoke_endpoint.return_value = {"Body": to_streaming_body([])} prompt_stack = PromptStack() - prompt_stack.add_user_input("prompt-stack") + prompt_stack.add_user_message("prompt-stack") # When with pytest.raises(Exception) as e: diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index 22178bbf3..858c05ee6 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -1,5 +1,6 @@ from griptape.drivers import AnthropicPromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack +from griptape.artifacts import TextArtifact, ImageArtifact, ListArtifact from unittest.mock import Mock import pytest @@ -8,21 +9,36 @@ class TestAnthropicPromptDriver: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("anthropic.Anthropic") - mock_content = Mock() - mock_content.text = "model-output" - mock_client.return_value.messages.create.return_value.content = [mock_content] - mock_client.return_value.count_tokens.return_value = 5 + + mock_client.return_value = Mock( + messages=Mock( + create=Mock( + return_value=Mock( + usage=Mock(input_tokens=5, output_tokens=10), content=[Mock(type="text", text="model-output")] + ) + ) + ) + ) return mock_client @pytest.fixture def mock_stream_client(self, mocker): mock_stream_client = mocker.patch("anthropic.Anthropic") - mock_chunk = Mock() - mock_chunk.type = "content_block_delta" - mock_chunk.delta.text = "model-output" - mock_stream_client.return_value.messages.create.return_value = iter([mock_chunk]) - mock_stream_client.return_value.count_tokens.return_value = 5 + + mock_stream_client.return_value = Mock( + messages=Mock( + create=Mock( + return_value=iter( + [ + Mock(type="message_start", message=Mock(usage=Mock(input_tokens=5))), + Mock(type="content_block_delta", delta=Mock(type="text_delta", text="model-output")), + Mock(type="message_delta", usage=Mock(output_tokens=10)), + ] + ) + ) + ) + ) return mock_stream_client @@ -45,20 +61,30 @@ def test_init(self, model): def test_try_run(self, mock_client, model, system_enabled): # Given prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") if system_enabled: - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message(TextArtifact("user-input")) + prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_assistant_message("assistant-input") driver = AnthropicPromptDriver(model=model, api_key="api-key") expected_messages = [ - {"role": "user", "content": "generic-input"}, {"role": "user", "content": "user-input"}, + {"role": "user", "content": "user-input"}, + { + "content": [ + { + "source": {"data": "aW1hZ2UtZGF0YQ==", "media_type": "image/png", "type": "base64"}, + "type": "image", + } + ], + "role": "user", + }, {"role": "assistant", "content": "assistant-input"}, ] # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_client.return_value.messages.create.assert_called_once_with( @@ -71,7 +97,9 @@ def test_try_run(self, mock_client, model, system_enabled): top_k=250, **{"system": "system-input"} if system_enabled else {}, ) - assert text_artifact.value == "model-output" + assert message.value == "model-output" + assert message.usage.input_tokens == 5 + assert message.usage.output_tokens == 10 @pytest.mark.parametrize( "model", @@ -88,20 +116,34 @@ def test_try_run(self, mock_client, model, system_enabled): def test_try_stream_run(self, mock_stream_client, model, system_enabled): # Given prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") if system_enabled: - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) + prompt_stack.add_assistant_message("assistant-input") expected_messages = [ - {"role": "user", "content": "generic-input"}, {"role": "user", "content": "user-input"}, + { + "content": [ + {"type": "text", "text": "user-input"}, + { + "source": {"data": "aW1hZ2UtZGF0YQ==", "media_type": "image/png", "type": "base64"}, + "type": "image", + }, + ], + "role": "user", + }, {"role": "assistant", "content": "assistant-input"}, ] driver = AnthropicPromptDriver(model=model, api_key="api-key", stream=True) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then mock_stream_client.return_value.messages.create.assert_called_once_with( @@ -115,7 +157,13 @@ def test_try_stream_run(self, mock_stream_client, model, system_enabled): top_k=250, **{"system": "system-input"} if system_enabled else {}, ) - assert text_artifact.value == "model-output" + assert event.usage.input_tokens == 5 + + event = next(stream) + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.output_tokens == 10 def test_try_run_throws_when_prompt_stack_is_string(self): # Given @@ -127,4 +175,4 @@ def test_try_run_throws_when_prompt_stack_is_string(self): driver.try_run(prompt_stack) # pyright: ignore # Then - assert e.value.args[0] == "'str' object has no attribute 'inputs'" + assert e.value.args[0] == "'str' object has no attribute 'messages'" diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index f6bd12d80..92544a74e 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -8,20 +8,22 @@ class TestAzureOpenAiChatPromptDriver(TestOpenAiChatPromptDriverFixtureMixin): @pytest.fixture def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create - mock_choice = Mock() - mock_choice.message.content = "model-output" - mock_chat_create.return_value.headers = {} - mock_chat_create.return_value.choices = [mock_choice] + mock_chat_create.return_value = Mock( + headers={}, + choices=[Mock(message=Mock(content="model-output"))], + usage=Mock(prompt_tokens=5, completion_tokens=10), + ) return mock_chat_create @pytest.fixture def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create - mock_chunk = Mock() - mock_choice = Mock() - mock_choice.delta.content = "model-output" - mock_chunk.choices = [mock_choice] - mock_chat_create.return_value = iter([mock_chunk]) + mock_chat_create.return_value = iter( + [ + Mock(choices=[Mock(delta=Mock(content="model-output"))], usage=None), + Mock(choices=None, usage=Mock(prompt_tokens=5, completion_tokens=10)), + ] + ) return mock_chat_create def test_init(self): @@ -37,13 +39,11 @@ def test_try_run(self, mock_chat_completion_create, prompt_stack, messages): # Then mock_chat_completion_create.assert_called_once_with( - model=driver.model, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - messages=messages, + model=driver.model, temperature=driver.temperature, user=driver.user, messages=messages ) assert text_artifact.value == "model-output" + assert text_artifact.usage.input_tokens == 5 + assert text_artifact.usage.output_tokens == 10 def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages): # Given @@ -52,15 +52,21 @@ def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, ) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then mock_chat_completion_stream_create.assert_called_once_with( model=driver.model, temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, user=driver.user, stream=True, messages=messages, + stream_options={"include_usage": True}, ) - assert text_artifact.value == "model-output" + + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.input_tokens == 5 + assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 0743402aa..6eb000e1f 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -1,5 +1,6 @@ +from griptape.common.prompt_stack.messages.message import Message from griptape.events import FinishPromptEvent, StartPromptEvent -from griptape.utils import PromptStack +from griptape.common import PromptStack from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_failing_prompt_driver import MockFailingPromptDriver from griptape.artifacts import ErrorArtifact, TextArtifact @@ -37,7 +38,13 @@ def test_run_via_pipeline_publishes_events(self, mocker): assert instance_count(events, FinishPromptEvent) == 1 def test_run(self): - assert isinstance(MockPromptDriver().run(PromptStack(inputs=[])), TextArtifact) + assert isinstance(MockPromptDriver().run(PromptStack(messages=[])), Message) + + def test_run_with_stream(self): + pipeline = Pipeline() + result = MockPromptDriver(stream=True, structure=pipeline).run(PromptStack(messages=[])) + assert isinstance(result, Message) + assert result.value == "mock output" def instance_count(instances, clazz): diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index 6e5063b26..d65775e8b 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -1,22 +1,30 @@ -from griptape.drivers import CoherePromptDriver -from griptape.utils import PromptStack from unittest.mock import Mock + import pytest +from griptape.common import PromptStack +from griptape.drivers import CoherePromptDriver + class TestCoherePromptDriver: @pytest.fixture def mock_client(self, mocker): - mock_client = mocker.patch("cohere.Client") - mock_client.return_value.chat.return_value = Mock(text="model-output") + mock_client = mocker.patch("cohere.Client").return_value + mock_client.chat.return_value = Mock( + text="model-output", meta=Mock(tokens=Mock(input_tokens=5, output_tokens=10)) + ) return mock_client @pytest.fixture def mock_stream_client(self, mocker): - mock_client = mocker.patch("cohere.Client") - mock_chunk = Mock(text="model-output", event_type="text-generation") - mock_client.return_value.chat_stream.return_value = iter([mock_chunk]) + mock_client = mocker.patch("cohere.Client").return_value + mock_client.chat_stream.return_value = iter( + [ + Mock(text="model-output", event_type="text-generation"), + Mock(response=Mock(meta=Mock(tokens=Mock(input_tokens=5, output_tokens=10))), event_type="stream-end"), + ] + ) return mock_client @@ -24,67 +32,70 @@ def mock_stream_client(self, mocker): def mock_tokenizer(self, mocker): return mocker.patch("griptape.tokenizers.CohereTokenizer").return_value - @pytest.fixture - def prompt_stack(self): + @pytest.fixture(params=[True, False]) + def prompt_stack(self, request): prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + if request.param: + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_assistant_message("assistant-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_assistant_message("assistant-input") return prompt_stack def test_init(self): assert CoherePromptDriver(model="command", api_key="foobar") - def test_try_run(self, mock_client, prompt_stack): # pyright: ignore + def test_try_run(self, mock_client, prompt_stack): # Given driver = CoherePromptDriver(model="command", api_key="api-key") # When text_artifact = driver.try_run(prompt_stack) - print(f"Called methods: {mock_client}") # Then - expected_message = "assistant-input" - expected_history = [ - {"role": "ASSISTANT", "text": "generic-input"}, - {"role": "SYSTEM", "text": "system-input"}, - {"role": "USER", "text": "user-input"}, - ] - mock_client.return_value.chat.assert_called_once_with( - message=expected_message, - temperature=driver.temperature, - stop_sequences=driver.tokenizer.stop_sequences, - max_tokens=driver.max_tokens, - chat_history=expected_history, + mock_client.chat.assert_called_once_with( + chat_history=[ + {"content": [{"text": "user-input"}], "role": "USER"}, + {"content": [{"text": "assistant-input"}], "role": "CHATBOT"}, + {"content": [{"text": "user-input"}], "role": "USER"}, + ], + max_tokens=None, + message="assistant-input", + **({"preamble": "system-input"} if prompt_stack.system_messages else {}), + stop_sequences=[], + temperature=0.1, ) - assert text_artifact.value == "model-output" - - def test_try_run_no_history(self, mock_client, prompt_stack): - # Given - prompt_stack_no_history = PromptStack() - prompt_stack_no_history.add_user_input("user-input") - driver = CoherePromptDriver(model="command", api_key="api-key") - - # When - text_artifact = driver.try_run(prompt_stack_no_history) - # Then - expected_message = "user-input" - mock_client.return_value.chat.assert_called_once_with( - message=expected_message, - temperature=driver.temperature, - stop_sequences=driver.tokenizer.stop_sequences, - max_tokens=driver.max_tokens, - ) assert text_artifact.value == "model-output" + assert text_artifact.usage.input_tokens == 5 + assert text_artifact.usage.output_tokens == 10 def test_try_stream_run(self, mock_stream_client, prompt_stack): # pyright: ignore # Given driver = CoherePromptDriver(model="command", api_key="api-key", stream=True) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then - assert text_artifact.value == "model-output" + + mock_stream_client.chat_stream.assert_called_once_with( + chat_history=[ + {"content": [{"text": "user-input"}], "role": "USER"}, + {"content": [{"text": "assistant-input"}], "role": "CHATBOT"}, + {"content": [{"text": "user-input"}], "role": "USER"}, + ], + max_tokens=None, + message="assistant-input", + **({"preamble": "system-input"} if prompt_stack.system_messages else {}), + stop_sequences=[], + temperature=0.1, + ) + + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.input_tokens == 5 + assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index f655d3e51..6a25ec3d3 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -1,6 +1,7 @@ from google.generativeai.types import GenerationConfig +from griptape.artifacts import TextArtifact, ImageArtifact from griptape.drivers import GooglePromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack from unittest.mock import Mock import pytest @@ -9,14 +10,21 @@ class TestGooglePromptDriver: @pytest.fixture def mock_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") - mock_generative_model.return_value.generate_content.return_value = Mock(text="model-output") + mock_generative_model.return_value.generate_content.return_value = Mock( + text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=10) + ) return mock_generative_model @pytest.fixture def mock_stream_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") - mock_generative_model.return_value.generate_content.return_value = iter([Mock(text="model-output")]) + mock_generative_model.return_value.generate_content.return_value = iter( + [ + Mock(text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5)), + Mock(text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5)), + ] + ) return mock_generative_model @@ -24,75 +32,77 @@ def test_init(self): driver = GooglePromptDriver(model="gemini-pro", api_key="1234") assert driver - def test_try_run(self, mock_generative_model): + @pytest.mark.parametrize("system_enabled", [True, False]) + def test_try_run(self, mock_generative_model, system_enabled): # Given prompt_stack = PromptStack() - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") - prompt_stack.add_generic_input("generic-input") + if system_enabled: + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message(TextArtifact("user-input")) + prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_assistant_message("assistant-input") driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", top_p=0.5, top_k=50) # When text_artifact = driver.try_run(prompt_stack) # Then + messages = [ + *( + [{"parts": ["system-input", "user-input"], "role": "user"}] + if system_enabled + else [{"parts": ["user-input"], "role": "user"}] + ), + {"parts": ["user-input"], "role": "user"}, + {"parts": [{"data": b"image-data", "mime_type": "image/png"}], "role": "user"}, + {"parts": ["assistant-input"], "role": "model"}, + ] mock_generative_model.return_value.generate_content.assert_called_once_with( - [ - {"parts": ["system-input", "user-input"], "role": "user"}, - {"parts": ["assistant-input"], "role": "model"}, - {"parts": ["generic-input"], "role": "user"}, - ], + messages, generation_config=GenerationConfig( max_output_tokens=None, temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[] ), ) assert text_artifact.value == "model-output" + assert text_artifact.usage.input_tokens == 5 + assert text_artifact.usage.output_tokens == 10 - def test_try_stream(self, mock_stream_generative_model): + @pytest.mark.parametrize("system_enabled", [True, False]) + def test_try_stream(self, mock_stream_generative_model, system_enabled): # Given prompt_stack = PromptStack() - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") - prompt_stack.add_generic_input("generic-input") + if system_enabled: + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message(TextArtifact("user-input")) + prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_assistant_message("assistant-input") driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", stream=True, top_p=0.5, top_k=50) # When - text_artifact_stream = driver.try_stream(prompt_stack) + stream = driver.try_stream(prompt_stack) # Then - text_artifact = next(text_artifact_stream) + event = next(stream) + messages = [ + *( + [{"parts": ["system-input", "user-input"], "role": "user"}] + if system_enabled + else [{"parts": ["user-input"], "role": "user"}] + ), + {"parts": ["user-input"], "role": "user"}, + {"parts": [{"data": b"image-data", "mime_type": "image/png"}], "role": "user"}, + {"parts": ["assistant-input"], "role": "model"}, + ] mock_stream_generative_model.return_value.generate_content.assert_called_once_with( - [ - {"parts": ["system-input", "user-input"], "role": "user"}, - {"parts": ["assistant-input"], "role": "model"}, - {"parts": ["generic-input"], "role": "user"}, - ], + messages, stream=True, generation_config=GenerationConfig(temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[]), ) - assert text_artifact.value == "model-output" - - def test_prompt_stack_to_model_input(self): - # Given - driver = GooglePromptDriver(model="gemini-pro", api_key="1234") - prompt_stack = PromptStack() - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_assistant_input("assistant-input") - prompt_stack.add_user_input("user-input") + assert event.content.text == "model-output" + assert event.usage.input_tokens == 5 + assert event.usage.output_tokens == 5 - # When - model_input = driver._prompt_stack_to_model_input(prompt_stack) - - # Then - assert model_input == [ - {"role": "user", "parts": ["system-input", "user-input"]}, - {"role": "model", "parts": ["assistant-input"]}, - {"role": "user", "parts": ["generic-input"]}, - {"role": "model", "parts": ["assistant-input"]}, - {"role": "user", "parts": ["user-input"]}, - ] + event = next(stream) + assert event.usage.output_tokens == 5 diff --git a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py index 15bbb4ead..4618e1de3 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py @@ -1,5 +1,5 @@ from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack import pytest @@ -7,6 +7,7 @@ class TestHuggingFaceHubPromptDriver: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("huggingface_hub.InferenceClient").return_value + mock_client.text_generation.return_value = "model-output" return mock_client @@ -14,6 +15,8 @@ def mock_client(self, mocker): def tokenizer(self, mocker): from_pretrained = tokenizer = mocker.patch("transformers.AutoTokenizer").from_pretrained from_pretrained.return_value.apply_chat_template.return_value = [1, 2, 3] + from_pretrained.return_value.decode.return_value = "foo\n\nUser: bar" + from_pretrained.return_value.encode.return_value = [1, 2, 3] return tokenizer @@ -27,10 +30,9 @@ def mock_client_stream(self, mocker): @pytest.fixture def prompt_stack(self): prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_assistant_message("assistant-input") return prompt_stack @pytest.fixture(autouse=True) @@ -47,17 +49,24 @@ def test_try_run(self, prompt_stack, mock_client): driver = HuggingFaceHubPromptDriver(api_token="api-token", model="repo-id") # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then - assert text_artifact.value == "model-output" + assert message.value == "model-output" + assert message.usage.input_tokens == 3 + assert message.usage.output_tokens == 3 def test_try_stream(self, prompt_stack, mock_client_stream): # Given driver = HuggingFaceHubPromptDriver(api_token="api-token", model="repo-id", stream=True) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then - assert text_artifact.value == "model-output" + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.input_tokens == 3 + assert event.usage.output_tokens == 3 diff --git a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py index b2746ca58..a63d697fb 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py @@ -1,5 +1,5 @@ from griptape.drivers import HuggingFacePipelinePromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack import pytest @@ -22,15 +22,15 @@ def mock_autotokenizer(self, mocker): mock_autotokenizer.model_max_length = 42 mock_autotokenizer.apply_chat_template.return_value = [1, 2, 3] mock_autotokenizer.decode.return_value = "model-output" + mock_autotokenizer.encode.return_value = [1, 2, 3] return mock_autotokenizer @pytest.fixture def prompt_stack(self): prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_assistant_message("assistant-input") return prompt_stack def test_init(self): @@ -41,10 +41,12 @@ def test_try_run(self, prompt_stack): driver = HuggingFacePipelinePromptDriver(model="foo", max_tokens=42) # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then - assert text_artifact.value == "model-output" + assert message.value == "model-output" + assert message.usage.input_tokens == 3 + assert message.usage.output_tokens == 3 def test_try_stream(self, prompt_stack): # Given diff --git a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py index d42a8b45d..a247a77ab 100644 --- a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py @@ -1,5 +1,7 @@ +from griptape.common.prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent from griptape.drivers import OllamaPromptDriver -from griptape.utils import PromptStack +from griptape.common import PromptStack +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact import pytest @@ -25,20 +27,24 @@ def test_init(self): def test_try_run(self, mock_client): # Given prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) + prompt_stack.add_assistant_message("assistant-input") driver = OllamaPromptDriver(model="llama") expected_messages = [ - {"role": "generic", "content": "generic-input"}, {"role": "system", "content": "system-input"}, {"role": "user", "content": "user-input"}, + {"role": "user", "content": "user-input", "images": ["aW1hZ2UtZGF0YQ=="]}, {"role": "assistant", "content": "assistant-input"}, ] # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_client.return_value.chat.assert_called_once_with( @@ -46,7 +52,9 @@ def test_try_run(self, mock_client): model=driver.model, options={"temperature": driver.temperature, "stop": [], "num_predict": driver.max_tokens}, ) - assert text_artifact.value == "model-output" + assert message.value == "model-output" + assert message.usage.input_tokens is None + assert message.usage.output_tokens is None def test_try_run_bad_response(self, mock_client): # Given @@ -61,14 +69,18 @@ def test_try_run_bad_response(self, mock_client): def test_try_stream_run(self, mock_stream_client): # Given prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) + prompt_stack.add_assistant_message("assistant-input") expected_messages = [ - {"role": "generic", "content": "generic-input"}, {"role": "system", "content": "system-input"}, {"role": "user", "content": "user-input"}, + {"role": "user", "content": "user-input", "images": ["aW1hZ2UtZGF0YQ=="]}, {"role": "assistant", "content": "assistant-input"}, ] driver = OllamaPromptDriver(model="llama", stream=True) @@ -83,7 +95,8 @@ def test_try_stream_run(self, mock_stream_client): options={"temperature": driver.temperature, "stop": [], "num_predict": driver.max_tokens}, stream=True, ) - assert text_artifact.value == "model-output" + if isinstance(text_artifact, TextDeltaMessageContent): + assert text_artifact.text == "model-output" def test_try_stream_bad_response(self, mock_stream_client): # Given diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index a2900d4d3..5c217ed06 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -1,8 +1,10 @@ +from griptape.artifacts import ImageArtifact, ListArtifact +from griptape.artifacts import TextArtifact from griptape.drivers import OpenAiChatPromptDriver -from griptape.tokenizers.huggingface_tokenizer import HuggingFaceTokenizer -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.tokenizers import OpenAiTokenizer from unittest.mock import Mock +from tests.mocks.mock_tokenizer import MockTokenizer import pytest @@ -10,37 +12,51 @@ class TestOpenAiChatPromptDriverFixtureMixin: @pytest.fixture def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create - mock_choice = Mock() - mock_choice.message.content = "model-output" - mock_chat_create.return_value.headers = {} - mock_chat_create.return_value.choices = [mock_choice] + mock_chat_create.return_value = Mock( + headers={}, + choices=[Mock(message=Mock(content="model-output"))], + usage=Mock(prompt_tokens=5, completion_tokens=10), + ) + return mock_chat_create @pytest.fixture def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create - mock_chunk = Mock() - mock_choice = Mock() - mock_choice.delta.content = "model-output" - mock_chunk.choices = [mock_choice] - mock_chat_create.return_value = iter([mock_chunk]) + mock_chat_create.return_value = iter( + [ + Mock(choices=[Mock(delta=Mock(content="model-output"))], usage=None), + Mock(choices=None, usage=Mock(prompt_tokens=5, completion_tokens=10)), + Mock(choices=[Mock(delta=Mock(content=None))], usage=None), + ] + ) return mock_chat_create @pytest.fixture def prompt_stack(self): prompt_stack = PromptStack() - prompt_stack.add_generic_input("generic-input") - prompt_stack.add_system_input("system-input") - prompt_stack.add_user_input("user-input") - prompt_stack.add_assistant_input("assistant-input") + prompt_stack.add_system_message("system-input") + prompt_stack.add_user_message("user-input") + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) + prompt_stack.add_assistant_message("assistant-input") return prompt_stack @pytest.fixture def messages(self): return [ - {"role": "user", "content": "generic-input"}, {"role": "system", "content": "system-input"}, {"role": "user", "content": "user-input"}, + { + "role": "user", + "content": [ + {"type": "text", "text": "user-input"}, + {"type": "image_url", "image_url": {"url": "data:image/png;base64,aW1hZ2UtZGF0YQ=="}}, + ], + }, {"role": "assistant", "content": "assistant-input"}, ] @@ -87,18 +103,13 @@ def test_try_run(self, mock_chat_completion_create, prompt_stack, messages): driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) # When - text_artifact = driver.try_run(prompt_stack) + event = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( - model=driver.model, - temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, - user=driver.user, - messages=messages, - seed=driver.seed, + model=driver.model, temperature=driver.temperature, user=driver.user, messages=messages, seed=driver.seed ) - assert text_artifact.value == "model-output" + assert event.value == "model-output" def test_try_run_response_format(self, mock_chat_completion_create, prompt_stack, messages): # Given @@ -107,57 +118,65 @@ def test_try_run_response_format(self, mock_chat_completion_create, prompt_stack ) # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( model=driver.model, temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, user=driver.user, messages=[*messages, {"role": "system", "content": "Provide your response as a valid JSON object."}], seed=driver.seed, response_format={"type": "json_object"}, ) - assert text_artifact.value == "model-output" + assert message.value == "model-output" + assert message.usage.input_tokens == 5 + assert message.usage.output_tokens == 10 def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages): # Given driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, stream=True) # When - text_artifact = next(driver.try_stream(prompt_stack)) + stream = driver.try_stream(prompt_stack) + event = next(stream) # Then mock_chat_completion_stream_create.assert_called_once_with( model=driver.model, temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, user=driver.user, stream=True, messages=messages, seed=driver.seed, + stream_options={"include_usage": True}, ) - assert text_artifact.value == "model-output" + + assert event.content.text == "model-output" + + event = next(stream) + assert event.usage.input_tokens == 5 + assert event.usage.output_tokens == 10 + event = next(stream) + assert event.content.text == "" def test_try_run_with_max_tokens(self, mock_chat_completion_create, prompt_stack, messages): # Given driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, max_tokens=1) # When - text_artifact = driver.try_run(prompt_stack) + event = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( model=driver.model, temperature=driver.temperature, - stop=driver.tokenizer.stop_sequences, user=driver.user, messages=messages, max_tokens=1, seed=driver.seed, ) - assert text_artifact.value == "model-output" + assert event.value == "model-output" def test_try_run_throws_when_prompt_stack_is_string(self): # Given @@ -168,30 +187,29 @@ def test_try_run_throws_when_prompt_stack_is_string(self): driver.try_run("prompt-stack") # pyright: ignore # Then - assert e.value.args[0] == "'str' object has no attribute 'inputs'" + assert e.value.args[0] == "'str' object has no attribute 'messages'" - @pytest.mark.parametrize("choices", [[], [1, 2]]) - def test_try_run_throws_when_multiple_choices_returned(self, choices, mock_chat_completion_create, prompt_stack): + def test_try_run_throws_when_multiple_choices_returned(self, mock_chat_completion_create, prompt_stack): # Given driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, api_key="api-key") - mock_chat_completion_create.return_value.choices = [choices] + mock_chat_completion_create.return_value.choices = [Mock(message=Mock(content="model-output"))] * 10 # When with pytest.raises(Exception) as e: driver.try_run(prompt_stack) # Then - e.value.args[0] == "Completion with more than one choice is not supported yet." + assert e.value.args[0] == "Completion with more than one choice is not supported yet." def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messages): driver = OpenAiChatPromptDriver( model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, - tokenizer=HuggingFaceTokenizer(model="gpt2", max_output_tokens=1000), + tokenizer=MockTokenizer(model="mock-model", stop_sequences=["mock-stop"]), max_tokens=1, ) # When - text_artifact = driver.try_run(prompt_stack) + event = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( @@ -199,13 +217,8 @@ def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messa temperature=driver.temperature, stop=driver.tokenizer.stop_sequences, user=driver.user, - messages=[ - {"role": "user", "content": "generic-input"}, - {"role": "system", "content": "system-input"}, - {"role": "user", "content": "user-input"}, - {"role": "assistant", "content": "assistant-input"}, - ], + messages=messages, seed=driver.seed, max_tokens=1, ) - assert text_artifact.value == "model-output" + assert event.value == "model-output" diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index 59b36f48e..34c6e3563 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -1,7 +1,7 @@ import pytest from griptape.artifacts import TextArtifact, ListArtifact from griptape.engines import PromptSummaryEngine -from griptape.utils import PromptStack +from griptape.common import PromptStack from tests.mocks.mock_prompt_driver import MockPromptDriver import os @@ -28,7 +28,7 @@ def test_max_token_multiplier_invalid(self, engine): def test_chunked_summary(self, engine): def smaller_input(prompt_stack: PromptStack): - return prompt_stack.inputs[0].content[: (len(prompt_stack.inputs[0].content) // 2)] + return prompt_stack.messages[0].content[: (len(prompt_stack.messages[0].content) // 2)] engine = PromptSummaryEngine(prompt_driver=MockPromptDriver(mock_output="smaller_input")) diff --git a/tests/unit/events/test_base_event.py b/tests/unit/events/test_base_event.py index 7656b6b0d..595c90f1f 100644 --- a/tests/unit/events/test_base_event.py +++ b/tests/unit/events/test_base_event.py @@ -29,30 +29,48 @@ def test_to_dict(self): def test_start_prompt_event_from_dict(self): dict_value = { "type": "StartPromptEvent", - "timestamp": 123.0, - "token_count": 10, - "prompt_stack": {"inputs": [{"content": "foo", "role": "user"}, {"content": "bar", "role": "system"}]}, - "prompt": "foo bar", + "id": "917298d4bf894b0a824a8fdb26717a0c", + "timestamp": 123, "model": "foo bar", + "prompt_stack": { + "type": "PromptStack", + "messages": [ + { + "type": "Message", + "role": "user", + "content": [ + {"type": "TextMessageContent", "artifact": {"type": "TextArtifact", "value": "foo"}} + ], + "usage": {"type": "Usage", "input_tokens": None, "output_tokens": None}, + }, + { + "type": "Message", + "role": "system", + "content": [ + {"type": "TextMessageContent", "artifact": {"type": "TextArtifact", "value": "bar"}} + ], + "usage": {"type": "Usage", "input_tokens": None, "output_tokens": None}, + }, + ], + }, } event = BaseEvent.from_dict(dict_value) assert isinstance(event, StartPromptEvent) assert event.timestamp == 123 - assert event.token_count == 10 - assert event.prompt_stack.inputs[0].content == "foo" - assert event.prompt_stack.inputs[0].role == "user" - assert event.prompt_stack.inputs[1].content == "bar" - assert event.prompt_stack.inputs[1].role == "system" - assert event.prompt == "foo bar" + assert event.prompt_stack.messages[0].content[0].artifact.value == "foo" + assert event.prompt_stack.messages[0].role == "user" + assert event.prompt_stack.messages[1].content[0].artifact.value == "bar" + assert event.prompt_stack.messages[1].role == "system" assert event.model == "foo bar" def test_finish_prompt_event_from_dict(self): dict_value = { "type": "FinishPromptEvent", "timestamp": 123.0, - "token_count": 10, + "input_token_count": 10, + "output_token_count": 12, "result": "foo bar", "model": "foo bar", } @@ -61,7 +79,8 @@ def test_finish_prompt_event_from_dict(self): assert isinstance(event, FinishPromptEvent) assert event.timestamp == 123 - assert event.token_count == 10 + assert event.input_token_count == 10 + assert event.output_token_count == 12 assert event.result == "foo bar" assert event.model == "foo bar" diff --git a/tests/unit/events/test_finish_prompt_event.py b/tests/unit/events/test_finish_prompt_event.py index b788c67f9..7443fce0c 100644 --- a/tests/unit/events/test_finish_prompt_event.py +++ b/tests/unit/events/test_finish_prompt_event.py @@ -5,12 +5,13 @@ class TestFinishPromptEvent: @pytest.fixture def finish_prompt_event(self): - return FinishPromptEvent(token_count=123, result="foo bar", model="foo bar") + return FinishPromptEvent(input_token_count=321, output_token_count=123, result="foo bar", model="foo bar") def test_to_dict(self, finish_prompt_event): assert "timestamp" in finish_prompt_event.to_dict() - assert finish_prompt_event.to_dict()["token_count"] == 123 + assert finish_prompt_event.to_dict()["input_token_count"] == 321 + assert finish_prompt_event.to_dict()["output_token_count"] == 123 assert finish_prompt_event.to_dict()["result"] == "foo bar" assert finish_prompt_event.to_dict()["model"] == "foo bar" diff --git a/tests/unit/events/test_start_prompt_event.py b/tests/unit/events/test_start_prompt_event.py index a80f8cdfc..4ef08ec5c 100644 --- a/tests/unit/events/test_start_prompt_event.py +++ b/tests/unit/events/test_start_prompt_event.py @@ -1,24 +1,22 @@ import pytest from griptape.events import StartPromptEvent -from griptape.utils import PromptStack +from griptape.common import PromptStack class TestStartPromptEvent: @pytest.fixture def start_prompt_event(self): prompt_stack = PromptStack() - prompt_stack.add_user_input("foo") - prompt_stack.add_system_input("bar") - return StartPromptEvent(token_count=123, prompt_stack=prompt_stack, prompt="foo bar", model="foo bar") + prompt_stack.add_user_message("foo") + prompt_stack.add_system_message("bar") + return StartPromptEvent(prompt_stack=prompt_stack, model="foo bar") def test_to_dict(self, start_prompt_event): assert "timestamp" in start_prompt_event.to_dict() - assert start_prompt_event.to_dict()["token_count"] == 123 - assert start_prompt_event.to_dict()["prompt_stack"]["inputs"][0]["content"] == "foo" - assert start_prompt_event.to_dict()["prompt_stack"]["inputs"][0]["role"] == "user" - assert start_prompt_event.to_dict()["prompt_stack"]["inputs"][1]["content"] == "bar" - assert start_prompt_event.to_dict()["prompt_stack"]["inputs"][1]["role"] == "system" + assert start_prompt_event.to_dict()["prompt_stack"]["messages"][0]["content"][0]["artifact"]["value"] == "foo" + assert start_prompt_event.to_dict()["prompt_stack"]["messages"][0]["role"] == "user" + assert start_prompt_event.to_dict()["prompt_stack"]["messages"][1]["content"][0]["artifact"]["value"] == "bar" + assert start_prompt_event.to_dict()["prompt_stack"]["messages"][1]["role"] == "system" - assert start_prompt_event.to_dict()["prompt"] == "foo bar" assert start_prompt_event.to_dict()["model"] == "foo bar" diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index 298e5ac3f..613d4b1fe 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -1,17 +1,18 @@ import json from griptape.structures import Agent -from griptape.utils import PromptStack +from griptape.common import PromptStack from griptape.memory.structure import ConversationMemory, Run, BaseConversationMemory from griptape.structures import Pipeline from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tokenizer import MockTokenizer from griptape.tasks import PromptTask +from griptape.artifacts import TextArtifact class TestConversationMemory: def test_add_run(self): memory = ConversationMemory() - run = Run(input="test", output="test") + run = Run(input=TextArtifact("foo"), output=TextArtifact("bar")) memory.add_run(run) @@ -19,42 +20,42 @@ def test_add_run(self): def test_to_json(self): memory = ConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) assert json.loads(memory.to_json())["type"] == "ConversationMemory" - assert json.loads(memory.to_json())["runs"][0]["input"] == "foo" + assert json.loads(memory.to_json())["runs"][0]["input"]["value"] == "foo" def test_to_dict(self): memory = ConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) assert memory.to_dict()["type"] == "ConversationMemory" - assert memory.to_dict()["runs"][0]["input"] == "foo" + assert memory.to_dict()["runs"][0]["input"]["value"] == "foo" def test_to_prompt_stack(self): memory = ConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) prompt_stack = memory.to_prompt_stack() - assert prompt_stack.inputs[0].content == "foo" - assert prompt_stack.inputs[1].content == "bar" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + assert prompt_stack.messages[1].content[0].artifact.value == "bar" def test_from_dict(self): memory = ConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) memory_dict = memory.to_dict() assert isinstance(BaseConversationMemory.from_dict(memory_dict), ConversationMemory) - assert BaseConversationMemory.from_dict(memory_dict).runs[0].input == "foo" + assert BaseConversationMemory.from_dict(memory_dict).runs[0].input.value == "foo" def test_from_json(self): memory = ConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) memory_dict = memory.to_dict() assert isinstance(memory.from_dict(memory_dict), ConversationMemory) - assert memory.from_dict(memory_dict).runs[0].input == "foo" + assert memory.from_dict(memory_dict).runs[0].input.value == "foo" def test_buffering(self): memory = ConversationMemory(max_runs=2) @@ -70,28 +71,28 @@ def test_buffering(self): pipeline.run("run5") assert len(pipeline.conversation_memory.runs) == 2 - assert pipeline.conversation_memory.runs[0].input == "run4" - assert pipeline.conversation_memory.runs[1].input == "run5" + assert pipeline.conversation_memory.runs[0].input.value == "run4" + assert pipeline.conversation_memory.runs[1].input.value == "run5" def test_add_to_prompt_stack_autopruing_disabled(self): agent = Agent(prompt_driver=MockPromptDriver()) memory = ConversationMemory( autoprune=False, runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), + Run(input=TextArtifact("foo1"), output=TextArtifact("bar1")), + Run(input=TextArtifact("foo2"), output=TextArtifact("bar2")), + Run(input=TextArtifact("foo3"), output=TextArtifact("bar3")), + Run(input=TextArtifact("foo4"), output=TextArtifact("bar4")), + Run(input=TextArtifact("foo5"), output=TextArtifact("bar5")), ], ) memory.structure = agent prompt_stack = PromptStack() - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") + prompt_stack.add_user_message(TextArtifact("foo")) + prompt_stack.add_assistant_message("bar") memory.add_to_prompt_stack(prompt_stack) - assert len(prompt_stack.inputs) == 12 + assert len(prompt_stack.messages) == 12 def test_add_to_prompt_stack_autopruning_enabled(self): # All memory is pruned. @@ -99,42 +100,42 @@ def test_add_to_prompt_stack_autopruning_enabled(self): memory = ConversationMemory( autoprune=True, runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), + Run(input=TextArtifact("foo1"), output=TextArtifact("bar1")), + Run(input=TextArtifact("foo2"), output=TextArtifact("bar2")), + Run(input=TextArtifact("foo3"), output=TextArtifact("bar3")), + Run(input=TextArtifact("foo4"), output=TextArtifact("bar4")), + Run(input=TextArtifact("foo5"), output=TextArtifact("bar5")), ], ) memory.structure = agent prompt_stack = PromptStack() - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") + prompt_stack.add_system_message("fizz") + prompt_stack.add_user_message("foo") + prompt_stack.add_assistant_message("bar") memory.add_to_prompt_stack(prompt_stack) - assert len(prompt_stack.inputs) == 3 + assert len(prompt_stack.messages) == 3 # No memory is pruned. agent = Agent(prompt_driver=MockPromptDriver(tokenizer=MockTokenizer(model="foo", max_input_tokens=1000))) memory = ConversationMemory( autoprune=True, runs=[ - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), + Run(input=TextArtifact("foo1"), output=TextArtifact("bar1")), + Run(input=TextArtifact("foo2"), output=TextArtifact("bar2")), + Run(input=TextArtifact("foo3"), output=TextArtifact("bar3")), + Run(input=TextArtifact("foo4"), output=TextArtifact("bar4")), + Run(input=TextArtifact("foo5"), output=TextArtifact("bar5")), ], ) memory.structure = agent prompt_stack = PromptStack() - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") + prompt_stack.add_system_message("fizz") + prompt_stack.add_user_message("foo") + prompt_stack.add_assistant_message("bar") memory.add_to_prompt_stack(prompt_stack) - assert len(prompt_stack.inputs) == 13 + assert len(prompt_stack.messages) == 13 # One memory is pruned. # MockTokenizer's max_input_tokens set to one below the sum of memory + system prompt tokens @@ -144,25 +145,25 @@ def test_add_to_prompt_stack_autopruning_enabled(self): autoprune=True, runs=[ # All of these sum to 155 tokens with the MockTokenizer. - Run(input="foo1", output="bar1"), - Run(input="foo2", output="bar2"), - Run(input="foo3", output="bar3"), - Run(input="foo4", output="bar4"), - Run(input="foo5", output="bar5"), + Run(input=TextArtifact("foo1"), output=TextArtifact("bar1")), + Run(input=TextArtifact("foo2"), output=TextArtifact("bar2")), + Run(input=TextArtifact("foo3"), output=TextArtifact("bar3")), + Run(input=TextArtifact("foo4"), output=TextArtifact("bar4")), + Run(input=TextArtifact("foo5"), output=TextArtifact("bar5")), ], ) memory.structure = agent prompt_stack = PromptStack() # And then another 6 tokens from fizz for a total of 161 tokens. - prompt_stack.add_system_input("fizz") - prompt_stack.add_user_input("foo") - prompt_stack.add_assistant_input("bar") + prompt_stack.add_system_message("fizz") + prompt_stack.add_user_message("foo") + prompt_stack.add_assistant_message("bar") memory.add_to_prompt_stack(prompt_stack, 1) - # We expect one run (2 prompt stack inputs) to be pruned. - assert len(prompt_stack.inputs) == 11 - assert prompt_stack.inputs[0].content == "fizz" - assert prompt_stack.inputs[1].content == "foo2" - assert prompt_stack.inputs[2].content == "bar2" - assert prompt_stack.inputs[-2].content == "foo" - assert prompt_stack.inputs[-1].content == "bar" + # We expect one run (2 Prompt Stack inputs) to be pruned. + assert len(prompt_stack.messages) == 11 + assert prompt_stack.messages[0].content[0].artifact.value == "fizz" + assert prompt_stack.messages[1].content[0].artifact.value == "foo2" + assert prompt_stack.messages[2].content[0].artifact.value == "bar2" + assert prompt_stack.messages[-2].content[0].artifact.value == "foo" + assert prompt_stack.messages[-1].content[0].artifact.value == "bar" diff --git a/tests/unit/memory/structure/test_summary_conversation_memory.py b/tests/unit/memory/structure/test_summary_conversation_memory.py index 09792ff5d..e625ac6c6 100644 --- a/tests/unit/memory/structure/test_summary_conversation_memory.py +++ b/tests/unit/memory/structure/test_summary_conversation_memory.py @@ -1,9 +1,9 @@ import json -import pytest from griptape.memory.structure import Run, SummaryConversationMemory from griptape.structures import Pipeline +from griptape.artifacts import TextArtifact from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_structure_config import MockStructureConfig @@ -41,36 +41,36 @@ def test_after_run(self): def test_to_json(self): memory = SummaryConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) assert json.loads(memory.to_json())["type"] == "SummaryConversationMemory" - assert json.loads(memory.to_json())["runs"][0]["input"] == "foo" + assert json.loads(memory.to_json())["runs"][0]["input"]["value"] == "foo" def test_to_dict(self): memory = SummaryConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) assert memory.to_dict()["type"] == "SummaryConversationMemory" - assert memory.to_dict()["runs"][0]["input"] == "foo" + assert memory.to_dict()["runs"][0]["input"]["value"] == "foo" def test_to_prompt_stack(self): memory = SummaryConversationMemory(summary="foobar") - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) prompt_stack = memory.to_prompt_stack() - assert prompt_stack.inputs[0].content == "Summary of the conversation so far: foobar" - assert prompt_stack.inputs[1].content == "foo" - assert prompt_stack.inputs[2].content == "bar" + assert prompt_stack.messages[0].content[0].artifact.value == "Summary of the conversation so far: foobar" + assert prompt_stack.messages[1].content[0].artifact.value == "foo" + assert prompt_stack.messages[2].content[0].artifact.value == "bar" def test_from_dict(self): memory = SummaryConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) memory_dict = memory.to_dict() assert isinstance(memory.from_dict(memory_dict), SummaryConversationMemory) - assert memory.from_dict(memory_dict).runs[0].input == "foo" - assert memory.from_dict(memory_dict).runs[0].output == "bar" + assert memory.from_dict(memory_dict).runs[0].input.value == "foo" + assert memory.from_dict(memory_dict).runs[0].output.value == "bar" assert memory.from_dict(memory_dict).offset == memory.offset assert memory.from_dict(memory_dict).summary == memory.summary assert memory.from_dict(memory_dict).summary_index == memory.summary_index @@ -78,11 +78,11 @@ def test_from_dict(self): def test_from_json(self): memory = SummaryConversationMemory() - memory.add_run(Run(input="foo", output="bar")) + memory.add_run(Run(input=TextArtifact("foo"), output=TextArtifact("bar"))) memory_dict = memory.to_dict() assert isinstance(memory.from_dict(memory_dict), SummaryConversationMemory) - assert memory.from_dict(memory_dict).runs[0].input == "foo" + assert memory.from_dict(memory_dict).runs[0].input.value == "foo" def test_config_prompt_driver(self): memory = SummaryConversationMemory() diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index 8bcadb753..942a960f9 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -166,15 +166,15 @@ def test_prompt_stack_without_memory(self): agent.add_task(task1) - assert len(task1.prompt_stack.inputs) == 2 + assert len(task1.prompt_stack.messages) == 2 agent.run() - assert len(task1.prompt_stack.inputs) == 3 + assert len(task1.prompt_stack.messages) == 3 agent.run() - assert len(task1.prompt_stack.inputs) == 3 + assert len(task1.prompt_stack.messages) == 3 def test_prompt_stack_with_memory(self): agent = Agent(prompt_driver=MockPromptDriver(), conversation_memory=ConversationMemory()) @@ -183,15 +183,15 @@ def test_prompt_stack_with_memory(self): agent.add_task(task1) - assert len(task1.prompt_stack.inputs) == 2 + assert len(task1.prompt_stack.messages) == 2 agent.run() - assert len(task1.prompt_stack.inputs) == 5 + assert len(task1.prompt_stack.messages) == 5 agent.run() - assert len(task1.prompt_stack.inputs) == 7 + assert len(task1.prompt_stack.messages) == 7 def test_run(self): task = PromptTask("test") diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index d94616165..99c4141bf 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -277,18 +277,18 @@ def test_prompt_stack_without_memory(self): pipeline.add_tasks(task1, task2) - assert len(task1.prompt_stack.inputs) == 2 - assert len(task2.prompt_stack.inputs) == 2 + assert len(task1.prompt_stack.messages) == 2 + assert len(task2.prompt_stack.messages) == 2 pipeline.run() - assert len(task1.prompt_stack.inputs) == 3 - assert len(task2.prompt_stack.inputs) == 3 + assert len(task1.prompt_stack.messages) == 3 + assert len(task2.prompt_stack.messages) == 3 pipeline.run() - assert len(task1.prompt_stack.inputs) == 3 - assert len(task2.prompt_stack.inputs) == 3 + assert len(task1.prompt_stack.messages) == 3 + assert len(task2.prompt_stack.messages) == 3 def test_prompt_stack_with_memory(self): pipeline = Pipeline(prompt_driver=MockPromptDriver()) @@ -298,18 +298,18 @@ def test_prompt_stack_with_memory(self): pipeline.add_tasks(task1, task2) - assert len(task1.prompt_stack.inputs) == 2 - assert len(task2.prompt_stack.inputs) == 2 + assert len(task1.prompt_stack.messages) == 2 + assert len(task2.prompt_stack.messages) == 2 pipeline.run() - assert len(task1.prompt_stack.inputs) == 5 - assert len(task2.prompt_stack.inputs) == 5 + assert len(task1.prompt_stack.messages) == 5 + assert len(task2.prompt_stack.messages) == 5 pipeline.run() - assert len(task1.prompt_stack.inputs) == 7 - assert len(task2.prompt_stack.inputs) == 7 + assert len(task1.prompt_stack.messages) == 7 + assert len(task2.prompt_stack.messages) == 7 def test_text_artifact_token_count(self): text = "foobar" diff --git a/tests/unit/tasks/test_prompt_task.py b/tests/unit/tasks/test_prompt_task.py index 1dd45ab64..bcef8bce1 100644 --- a/tests/unit/tasks/test_prompt_task.py +++ b/tests/unit/tasks/test_prompt_task.py @@ -1,4 +1,7 @@ import pytest +from griptape.artifacts.image_artifact import ImageArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.artifacts.text_artifact import TextArtifact from tests.mocks.mock_structure_config import MockStructureConfig from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -32,3 +35,86 @@ def test_missing_prompt_driver(self): with pytest.raises(ValueError): task.prompt_driver + + def test_input(self): + # Str + task = PromptTask("test") + + assert task.input.value == "test" + + # List of strs + task = PromptTask(["test1", "test2"]) + + assert task.input.value[0].value == "test1" + assert task.input.value[1].value == "test2" + + # Tuple of strs + task = PromptTask(("test1", "test2")) + + assert task.input.value[0].value == "test1" + assert task.input.value[1].value == "test2" + + # Image artifact + task = PromptTask(ImageArtifact(b"image-data", format="png", width=100, height=100)) + + assert isinstance(task.input, ImageArtifact) + assert task.input.value == b"image-data" + assert task.input.format == "png" + assert task.input.width == 100 + assert task.input.height == 100 + + # List of str and image artifact + task = PromptTask(["foo", ImageArtifact(b"image-data", format="png", width=100, height=100)]) + + assert isinstance(task.input, ListArtifact) + assert task.input.value[0].value == "foo" + assert isinstance(task.input.value[1], ImageArtifact) + assert task.input.value[1].value == b"image-data" + assert task.input.value[1].format == "png" + assert task.input.value[1].width == 100 + + # List of str and nested image artifact + task = PromptTask(["foo", [ImageArtifact(b"image-data", format="png", width=100, height=100)]]) + assert isinstance(task.input, ListArtifact) + assert task.input.value[0].value == "foo" + assert isinstance(task.input.value[1], ListArtifact) + assert isinstance(task.input.value[1].value[0], ImageArtifact) + assert task.input.value[1].value[0].value == b"image-data" + assert task.input.value[1].value[0].format == "png" + assert task.input.value[1].value[0].width == 100 + + # Tuple of str and image artifact + task = PromptTask(("foo", ImageArtifact(b"image-data", format="png", width=100, height=100))) + + assert isinstance(task.input, ListArtifact) + assert task.input.value[0].value == "foo" + assert isinstance(task.input.value[1], ImageArtifact) + assert task.input.value[1].value == b"image-data" + assert task.input.value[1].format == "png" + assert task.input.value[1].width == 100 + + # Lambda returning list of str and image artifact + task = PromptTask( + ListArtifact([TextArtifact("foo"), ImageArtifact(b"image-data", format="png", width=100, height=100)]) + ) + + assert isinstance(task.input, ListArtifact) + assert task.input.value[0].value == "foo" + assert isinstance(task.input.value[1], ImageArtifact) + assert task.input.value[1].value == b"image-data" + assert task.input.value[1].format == "png" + assert task.input.value[1].width == 100 + + # Lambda returning list of str and image artifact + task = PromptTask( + lambda _: ListArtifact( + [TextArtifact("foo"), ImageArtifact(b"image-data", format="png", width=100, height=100)] + ) + ) + + assert isinstance(task.input, ListArtifact) + assert task.input.value[0].value == "foo" + assert isinstance(task.input.value[1], ImageArtifact) + assert task.input.value[1].value == b"image-data" + assert task.input.value[1].format == "png" + assert task.input.value[1].width == 100 diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 28cc56ec9..cc05a5caf 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -2,7 +2,7 @@ from griptape.structures import Agent from griptape.tasks import ToolkitTask, ActionsSubtask, PromptTask from tests.mocks.mock_tool.tool import MockTool -from tests.mocks.mock_value_prompt_driver import MockValuePromptDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils import defaults @@ -149,7 +149,7 @@ def test_run(self): output = """Answer: done""" task = ToolkitTask("test", tools=[MockTool(name="Tool1"), MockTool(name="Tool2")]) - agent = Agent(prompt_driver=MockValuePromptDriver(value=output)) + agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) agent.add_task(task) @@ -163,7 +163,7 @@ def test_run_max_subtasks(self): output = """Actions: [{"name": "blah"}]""" task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) - agent = Agent(prompt_driver=MockValuePromptDriver(value=output)) + agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) agent.add_task(task) @@ -176,7 +176,7 @@ def test_run_invalid_react_prompt(self): output = """foo bar""" task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) - agent = Agent(prompt_driver=MockValuePromptDriver(value=output)) + agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) agent.add_task(task) diff --git a/tests/unit/tokenizers/test_google_tokenizer.py b/tests/unit/tokenizers/test_google_tokenizer.py index 955a0517f..34510cdac 100644 --- a/tests/unit/tokenizers/test_google_tokenizer.py +++ b/tests/unit/tokenizers/test_google_tokenizer.py @@ -1,6 +1,7 @@ import pytest from unittest.mock import Mock -from griptape.utils import PromptStack +from griptape.common import PromptStack +from griptape.common.prompt_stack.messages.message import Message from griptape.tokenizers import GoogleTokenizer @@ -19,7 +20,7 @@ def tokenizer(self, request): @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 5)], indirect=["tokenizer"]) def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected - assert tokenizer.count_tokens(PromptStack(inputs=[PromptStack.Input(content="foo", role="user")])) == expected + assert tokenizer.count_tokens(PromptStack(messages=[Message(content="foo", role="user")])) == expected assert tokenizer.count_tokens(["foo", "bar", "huzzah"]) == expected @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 30715)], indirect=["tokenizer"]) diff --git a/tests/unit/utils/test_base_tokenizer.py b/tests/unit/utils/test_base_tokenizer.py new file mode 100644 index 000000000..eed15b9b2 --- /dev/null +++ b/tests/unit/utils/test_base_tokenizer.py @@ -0,0 +1,13 @@ +import logging +from tests.mocks.mock_tokenizer import MockTokenizer + + +class TestBaseTokenizer: + def test_default_tokens(self, caplog): + with caplog.at_level(logging.WARNING): + tokenizer = MockTokenizer(model="gpt2") + + assert tokenizer.max_input_tokens == 4096 + assert tokenizer.max_output_tokens == 1000 + + assert "gpt2 not found" in caplog.text diff --git a/tests/unit/utils/test_message_stack.py b/tests/unit/utils/test_message_stack.py new file mode 100644 index 000000000..908388a33 --- /dev/null +++ b/tests/unit/utils/test_message_stack.py @@ -0,0 +1,55 @@ +import pytest + +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact +from griptape.common import ImageMessageContent, PromptStack, TextMessageContent + + +class TestPromptStack: + @pytest.fixture + def prompt_stack(self): + return PromptStack() + + def test_init(self): + assert PromptStack() + + def test_add_message(self, prompt_stack): + prompt_stack.add_message("foo", "role") + prompt_stack.add_message(TextArtifact("foo"), "role") + prompt_stack.add_message(ImageArtifact(b"foo", format="png", width=100, height=100), "role") + prompt_stack.add_message(ListArtifact([TextArtifact("foo"), TextArtifact("bar")]), "role") + + assert prompt_stack.messages[0].role == "role" + assert isinstance(prompt_stack.messages[0].content[0], TextMessageContent) + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + assert prompt_stack.messages[1].role == "role" + assert isinstance(prompt_stack.messages[1].content[0], TextMessageContent) + assert prompt_stack.messages[1].content[0].artifact.value == "foo" + + assert prompt_stack.messages[2].role == "role" + assert isinstance(prompt_stack.messages[2].content[0], ImageMessageContent) + assert prompt_stack.messages[2].content[0].artifact.value == b"foo" + + assert prompt_stack.messages[3].role == "role" + assert isinstance(prompt_stack.messages[3].content[0], TextMessageContent) + assert prompt_stack.messages[3].content[0].artifact.value == "foo" + assert isinstance(prompt_stack.messages[3].content[1], TextMessageContent) + assert prompt_stack.messages[3].content[1].artifact.value == "bar" + + def test_add_system_message(self, prompt_stack): + prompt_stack.add_system_message("foo") + + assert prompt_stack.messages[0].role == "system" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + def test_add_user_message(self, prompt_stack): + prompt_stack.add_user_message("foo") + + assert prompt_stack.messages[0].role == "user" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + def test_add_assistant_message(self, prompt_stack): + prompt_stack.add_assistant_message("foo") + + assert prompt_stack.messages[0].role == "assistant" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" diff --git a/tests/unit/utils/test_prompt_stack.py b/tests/unit/utils/test_prompt_stack.py deleted file mode 100644 index 80010abec..000000000 --- a/tests/unit/utils/test_prompt_stack.py +++ /dev/null @@ -1,41 +0,0 @@ -import pytest -from griptape.utils import PromptStack - - -class TestPromptStack: - @pytest.fixture - def prompt_stack(self): - return PromptStack() - - def test_init(self): - assert PromptStack() - - def test_add_input(self, prompt_stack): - prompt_stack.add_input("foo", "role") - - assert prompt_stack.inputs[0].role == "role" - assert prompt_stack.inputs[0].content == "foo" - - def test_add_generic_input(self, prompt_stack): - prompt_stack.add_generic_input("foo") - - assert prompt_stack.inputs[0].role == "generic" - assert prompt_stack.inputs[0].content == "foo" - - def test_add_system_input(self, prompt_stack): - prompt_stack.add_system_input("foo") - - assert prompt_stack.inputs[0].role == "system" - assert prompt_stack.inputs[0].content == "foo" - - def test_add_user_input(self, prompt_stack): - prompt_stack.add_user_input("foo") - - assert prompt_stack.inputs[0].role == "user" - assert prompt_stack.inputs[0].content == "foo" - - def test_add_assistant_input(self, prompt_stack): - prompt_stack.add_assistant_input("foo") - - assert prompt_stack.inputs[0].role == "assistant" - assert prompt_stack.inputs[0].content == "foo" From 07e2a1c792a8ea7598e70b21eab93d9f621366fe Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 2 Jul 2024 12:38:25 -0500 Subject: [PATCH 131/238] Add support for Qdrant VectorDB (#928) Co-authored-by: hkhajgiwale Co-authored-by: Harsh Khajgiwale <13365920+hkhajgiwale@users.noreply.github.com> Co-authored-by: Anush --- .github/workflows/docs-integration-tests.yml | 2 + CHANGELOG.md | 1 + .../drivers/vector-store-drivers.md | 62 ++++++ griptape/drivers/__init__.py | 2 + .../vector/qdrant_vector_store_driver.py | 207 ++++++++++++++++++ poetry.lock | 157 ++++++++++++- pyproject.toml | 3 + .../vector/test_qdrant_vector_store_driver.py | 171 +++++++++++++++ 8 files changed, 603 insertions(+), 2 deletions(-) create mode 100644 griptape/drivers/vector/qdrant_vector_store_driver.py create mode 100644 tests/unit/drivers/vector/test_qdrant_vector_store_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 79e0c9f3a..cd21ad1ac 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -120,6 +120,8 @@ jobs: PUSHER_SECRET: ${{ secrets.INTEG_PUSHER_SECRET }} PUSHER_CLUSTER: ${{ secrets.INTEG_PUSHER_CLUSTER }} ZENROWS_API_KEY: ${{ secrets.INTEG_ZENROWS_API_KEY }} + QDRANT_CLUSTER_ENDPOINT: ${{ secrets.INTEG_QDRANT_CLUSTER_ENDPOINT }} + QDRANT_CLUSTER_API_KEY: ${{ secrets.INTEG_QDRANT_CLUSTER_API_KEY }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index d8f1a3f2c..399da1969 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -295,6 +295,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `MarkdownifyWebScraperDriver` for scraping text from web pages using playwright and converting to markdown using markdownify. - `VoyageAiEmbeddingDriver` for use with VoyageAi's embedding models. - `AnthropicStructureConfig` for providing Structures with Anthropic Prompt and VoyageAi Embedding Driver configuration. +- `QdrantVectorStoreDriver` to integrate with Qdrant vector databases. ### Fixed - Improved system prompt in `ToolTask` to support more use cases. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index 095c14f22..da6fdc242 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -406,3 +406,65 @@ vector_store_driver.upsert_text_artifacts( result = vector_store_driver.query("What is griptape?") print(result) ``` + +### Qdrant + +!!! info + This driver requires the `drivers-vector-qdrant` [extra](../index.md#extras). + +The QdrantVectorStoreDriver supports the [Qdrant vector database](https://qdrant.tech/). + +Here is an example of how the driver can be used to query information in a Qdrant collection: + +```python +import os +from griptape.drivers import QdrantVectorStoreDriver, HuggingFaceHubEmbeddingDriver +from griptape.tokenizers import HuggingFaceTokenizer +from griptape.loaders import WebLoader + +# Set up environment variables +embedding_model_name = "sentence-transformers/all-MiniLM-L6-v2" +host = os.environ["QDRANT_CLUSTER_ENDPOINT"] +huggingface_token = os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"] + +# Initialize HuggingFace embedding driver +embedding_driver = HuggingFaceHubEmbeddingDriver( + api_token=huggingface_token, + model=embedding_model_name, + tokenizer=HuggingFaceTokenizer(model=embedding_model_name, max_output_tokens=512), +) + +# Initialize Qdrant vector store driver +vector_store_driver = QdrantVectorStoreDriver( + url=host, + collection_name="griptape", + content_payload_key="content", + embedding_driver=embedding_driver, + api_key=os.environ["QDRANT_CLUSTER_API_KEY"], +) + +# Load data from the website +artifacts = WebLoader().load("https://www.griptape.ai") + +# Encode text to get embeddings +embeddings = embedding_driver.embed_text_artifact(artifacts[0]) + +# Recreate Qdrant collection +vector_store_driver.client.recreate_collection( + collection_name=vector_store_driver.collection_name, + vectors_config={ + "size": len(embeddings), + "distance": vector_store_driver.distance + }, +) + +# Upsert vector into Qdrant +vector_store_driver.upsert_vector( + vector=embeddings, + vector_id=str(artifacts[0].id), + content=artifacts[0].value +) + +print("Vectors successfully inserted into Qdrant.") + +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 34b43103b..fa2934a38 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -39,6 +39,7 @@ from .vector.pgvector_vector_store_driver import PgVectorVectorStoreDriver from .vector.azure_mongodb_vector_store_driver import AzureMongoDbVectorStoreDriver from .vector.dummy_vector_store_driver import DummyVectorStoreDriver +from .vector.qdrant_vector_store_driver import QdrantVectorStoreDriver from .sql.base_sql_driver import BaseSqlDriver from .sql.amazon_redshift_sql_driver import AmazonRedshiftSqlDriver @@ -144,6 +145,7 @@ "OpenSearchVectorStoreDriver", "AmazonOpenSearchVectorStoreDriver", "PgVectorVectorStoreDriver", + "QdrantVectorStoreDriver", "DummyVectorStoreDriver", "BaseSqlDriver", "AmazonRedshiftSqlDriver", diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py new file mode 100644 index 000000000..5159bdb0a --- /dev/null +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -0,0 +1,207 @@ +from __future__ import annotations +from typing import Optional +from attrs import define, field +from griptape.drivers import BaseVectorStoreDriver +from griptape.utils import import_optional_dependency +import uuid +import logging + +DEFAULT_DISTANCE = "Cosine" +CONTENT_PAYLOAD_KEY = "data" + + +@define +class QdrantVectorStoreDriver(BaseVectorStoreDriver): + """ + Attributes: + location: An optional location for the Qdrant client. If set to ':memory:', an in-memory client is used. + url: An optional Qdrant API URL. + host: An optional Qdrant host. + path: Persistence path for QdrantLocal. Default: None + port: The port number for the Qdrant client. Defaults: 6333. + grpc_port: The gRPC port number for the Qdrant client. Defaults: 6334. + prefer_grpc: A boolean indicating whether to prefer gRPC over HTTP. Defaults: False. + force_disable_check_same_thread: For QdrantLocal, force disable check_same_thread. Default: False Only use this if you can guarantee that you can resolve the thread safety outside QdrantClient. + timeout: Timeout for REST and gRPC API requests. Default: 5 seconds for REST and unlimited for gRPC + api_key: API key for authentication in Qdrant Cloud. Defaults: False + https: If true - use HTTPS(SSL) protocol. Default: None + prefix: Add prefix to the REST URL path. Example: service/v1 will result in Example: service/v1 will result in http://localhost:6333/service/v1/{qdrant-endpoint} for REST API. Defaults: None + distance: The distance metric to be used for the vectors. Defaults: 'COSINE'. + collection_name: The name of the Qdrant collection. + vector_name: An optional name for the vectors. + content_payload_key: The key for the content payload in the metadata. Defaults: 'data'. + """ + + location: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + host: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + path: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + port: int = field(default=6333, kw_only=True, metadata={"serializable": True}) + grpc_port: int = field(default=6334, kw_only=True, metadata={"serializable": True}) + prefer_grpc: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + https: bool = field(default=None, kw_only=True, metadata={"serializable": True}) + prefix: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + force_disable_check_same_thread: Optional[bool] = field( + default=False, kw_only=True, metadata={"serializable": True} + ) + timeout: Optional[int] = field(default=5, kw_only=True, metadata={"serializable": True}) + distance: str = field(default=DEFAULT_DISTANCE, kw_only=True, metadata={"serializable": True}) + collection_name: str = field(kw_only=True, metadata={"serializable": True}) + vector_name: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + content_payload_key: str = field(default=CONTENT_PAYLOAD_KEY, kw_only=True, metadata={"serializable": True}) + + def __attrs_post_init__(self) -> None: + self.client = import_optional_dependency("qdrant_client").QdrantClient( + location=self.location, + url=self.url, + host=self.host, + path=self.path, + port=self.port, + prefer_grpc=self.prefer_grpc, + grpc_port=self.grpc_port, + api_key=self.api_key, + https=self.https, + prefix=self.prefix, + force_disable_check_same_thread=self.force_disable_check_same_thread, + timeout=self.timeout, + ) + + def delete_vector(self, vector_id: str) -> None: + """ + Delete a vector from the Qdrant collection based on its ID. + + Parameters: + vector_id (str | id): ID of the vector to delete. + """ + deletion_response = self.client.delete( + collection_name=self.collection_name, + points_selector=import_optional_dependency("qdrant_client.http.models").PointIdsList(points=[vector_id]), + ) + if deletion_response.status == import_optional_dependency("qdrant_client.http.models").UpdateStatus.COMPLETED: + logging.info(f"ID {vector_id} is successfully deleted") + + def query( + self, + query: str, + count: Optional[int] = None, + namespace: Optional[str] = None, + include_vectors: bool = False, + **kwargs, + ) -> list[BaseVectorStoreDriver.Entry]: + """ + Query the Qdrant collection based on a query vector. + + Parameters: + query (str): Query string. + count (Optional[int]): Optional number of results to return. + namespace (Optional[str]): Optional namespace of the vectors. + include_vectors (bool): Whether to include vectors in the results. + + Returns: + list[BaseVectorStoreDriver.Entry]: List of Entry objects. + """ + query_vector = self.embedding_driver.embed_string(query) + + # Create a search request + results = self.client.search(collection_name=self.collection_name, query_vector=query_vector, limit=count) + + # Convert results to QueryResult objects + query_results = [ + BaseVectorStoreDriver.Entry( + id=result.id, + vector=result.vector if include_vectors else [], + score=result.score, + meta={k: v for k, v in result.payload.items() if k not in ["_score", "_tensor_facets"]}, + ) + for result in results + ] + return query_results + + def upsert_vector( + self, + vector: list[float], + vector_id: Optional[str] = None, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + content: Optional[str] = None, + **kwargs, + ) -> str: + """ + Upsert vectors into the Qdrant collection. + + Parameters: + vector (list[float]): The vector to be upserted. + vector_id (Optional[str]): Optional vector ID. + namespace (Optional[str]): Optional namespace for the vector. + meta (Optional[dict]): Optional dictionary containing metadata. + content (Optional[str]): The text content to be included in the payload. + + Returns: + str: The ID of the upserted vector. + """ + + if vector_id is None: + vector_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, str(vector))) + + if meta is None: + meta = {} + + if content: + meta[self.content_payload_key] = content + + points = import_optional_dependency("qdrant_client.http.models").Batch( + ids=[vector_id], vectors=[vector], payloads=[meta] if meta else None + ) + + self.client.upsert(collection_name=self.collection_name, points=points) + return vector_id + + def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + """ + Load a vector entry from the Qdrant collection based on its ID. + + Parameters: + vector_id (str): ID of the vector to load. + namespace (str, optional): Optional namespace of the vector. + + Returns: + Optional[BaseVectorStoreDriver.Entry]: Vector entry if found, else None. + """ + results = self.client.retrieve(collection_name=self.collection_name, ids=[vector_id]) + if results: + entry = results[0] + return BaseVectorStoreDriver.Entry( + id=entry.id, + vector=entry.vector, + meta={k: v for k, v in entry.payload.items() if k not in ["_score", "_tensor_facets"]}, + ) + else: + return None + + def load_entries(self, namespace: Optional[str] = None, **kwargs) -> list[BaseVectorStoreDriver.Entry]: + """ + Load vector entries from the Qdrant collection. + + Parameters: + namespace: Optional namespace of the vectors. + + Returns: + List of points. + """ + + results = self.client.retrieve( + collection_name=self.collection_name, + ids=kwargs.get("ids", []), + with_payload=kwargs.get("with_payload", True), + with_vectors=kwargs.get("with_vectors", True), + ) + + return [ + BaseVectorStoreDriver.Entry( + id=entry.id, + vector=entry.vector if kwargs.get("with_vectors", True) else [], + meta={k: v for k, v in entry.payload.items() if k not in ["_score", "_tensor_facets"]}, + ) + for entry in results + ] diff --git a/poetry.lock b/poetry.lock index 768a4e8ae..64f01aa75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1844,6 +1844,74 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.62.2" protobuf = ">=4.21.6" +[[package]] +name = "grpcio-tools" +version = "1.62.2" +description = "Protobuf code generator for gRPC" +optional = true +python-versions = ">=3.7" +files = [ + {file = "grpcio-tools-1.62.2.tar.gz", hash = "sha256:5fd5e1582b678e6b941ee5f5809340be5e0724691df5299aae8226640f94e18f"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:1679b4903aed2dc5bd8cb22a452225b05dc8470a076f14fd703581efc0740cdb"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:9d41e0e47dd075c075bb8f103422968a65dd0d8dc8613288f573ae91eb1053ba"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:987e774f74296842bbffd55ea8826370f70c499e5b5f71a8cf3103838b6ee9c3"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd4eeea4b25bcb6903b82930d579027d034ba944393c4751cdefd9c49e6989"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6746bc823958499a3cf8963cc1de00072962fb5e629f26d658882d3f4c35095"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2ed775e844566ce9ce089be9a81a8b928623b8ee5820f5e4d58c1a9d33dfc5ae"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdc5dd3f57b5368d5d661d5d3703bcaa38bceca59d25955dff66244dbc987271"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win32.whl", hash = "sha256:3a8d6f07e64c0c7756f4e0c4781d9d5a2b9cc9cbd28f7032a6fb8d4f847d0445"}, + {file = "grpcio_tools-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:e33b59fb3efdddeb97ded988a871710033e8638534c826567738d3edce528752"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:472505d030135d73afe4143b0873efe0dcb385bd6d847553b4f3afe07679af00"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec674b4440ef4311ac1245a709e87b36aca493ddc6850eebe0b278d1f2b6e7d1"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:184b4174d4bd82089d706e8223e46c42390a6ebac191073b9772abc77308f9fa"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c195d74fe98541178ece7a50dad2197d43991e0f77372b9a88da438be2486f12"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d97c62e61bfe9e6cff0410fe144ac8cca2fc979ad0be46b7edf026339d161"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cbb8453ae83a1db2452b7fe0f4b78e4a8dd32be0f2b2b73591ae620d4d784d3d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f989e5cebead3ae92c6abf6bf7b19949e1563a776aea896ac5933f143f0c45d"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win32.whl", hash = "sha256:c48fabe40b9170f4e3d7dd2c252e4f1ff395dc24e49ac15fc724b1b6f11724da"}, + {file = "grpcio_tools-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c616d0ad872e3780693fce6a3ac8ef00fc0963e6d7815ce9dcfae68ba0fc287"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:10cc3321704ecd17c93cf68c99c35467a8a97ffaaed53207e9b2da6ae0308ee1"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:9be84ff6d47fd61462be7523b49d7ba01adf67ce4e1447eae37721ab32464dd8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d82f681c9a9d933a9d8068e8e382977768e7779ddb8870fa0cf918d8250d1532"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04c607029ae3660fb1624ed273811ffe09d57d84287d37e63b5b802a35897329"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72b61332f1b439c14cbd3815174a8f1d35067a02047c32decd406b3a09bb9890"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8214820990d01b52845f9fbcb92d2b7384a0c321b303e3ac614c219dc7d1d3af"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:462e0ab8dd7c7b70bfd6e3195eebc177549ede5cf3189814850c76f9a340d7ce"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win32.whl", hash = "sha256:fa107460c842e4c1a6266150881694fefd4f33baa544ea9489601810c2210ef8"}, + {file = "grpcio_tools-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:759c60f24c33a181bbbc1232a6752f9b49fbb1583312a4917e2b389fea0fb0f2"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:45db5da2bcfa88f2b86b57ef35daaae85c60bd6754a051d35d9449c959925b57"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ab84bae88597133f6ea7a2bdc57b2fda98a266fe8d8d4763652cbefd20e73ad7"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7a49bccae1c7d154b78e991885c3111c9ad8c8fa98e91233de425718f47c6139"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7e439476b29d6dac363b321781a113794397afceeb97dad85349db5f1cb5e9a"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea369c4d1567d1acdf69c8ea74144f4ccad9e545df7f9a4fc64c94fa7684ba3"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f955702dc4b530696375251319d05223b729ed24e8673c2129f7a75d2caefbb"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3708a747aa4b6b505727282ca887041174e146ae030ebcadaf4c1d346858df62"}, + {file = "grpcio_tools-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:2ce149ea55eadb486a7fb75a20f63ef3ac065ee6a0240ed25f3549ce7954c653"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:58cbb24b3fa6ae35aa9c210fcea3a51aa5fef0cd25618eb4fd94f746d5a9b703"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:6413581e14a80e0b4532577766cf0586de4dd33766a31b3eb5374a746771c07d"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:47117c8a7e861382470d0e22d336e5a91fdc5f851d1db44fa784b9acea190d87"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f1ba79a253df9e553d20319c615fa2b429684580fa042dba618d7f6649ac7e4"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04a394cf5e51ba9be412eb9f6c482b6270bd81016e033e8eb7d21b8cc28fe8b5"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3c53b221378b035ae2f1881cbc3aca42a6075a8e90e1a342c2f205eb1d1aa6a1"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c384c838b34d1b67068e51b5bbe49caa6aa3633acd158f1ab16b5da8d226bc53"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win32.whl", hash = "sha256:19ea69e41c3565932aa28a202d1875ec56786aea46a2eab54a3b28e8a27f9517"}, + {file = "grpcio_tools-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:1d768a5c07279a4c461ebf52d0cec1c6ca85c6291c71ec2703fe3c3e7e28e8c4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:5b07b5874187e170edfbd7aa2ca3a54ebf3b2952487653e8c0b0d83601c33035"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:d58389fe8be206ddfb4fa703db1e24c956856fcb9a81da62b13577b3a8f7fda7"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7d8b4e00c3d7237b92260fc18a561cd81f1da82e8be100db1b7d816250defc66"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe08d2038f2b7c53259b5c49e0ad08c8e0ce2b548d8185993e7ef67e8592cca"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19216e1fb26dbe23d12a810517e1b3fbb8d4f98b1a3fbebeec9d93a79f092de4"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b8574469ecc4ff41d6bb95f44e0297cdb0d95bade388552a9a444db9cd7485cd"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f6f32d39283ea834a493fccf0ebe9cfddee7577bdcc27736ad4be1732a36399"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win32.whl", hash = "sha256:76eb459bdf3fb666e01883270beee18f3f11ed44488486b61cd210b4e0e17cc1"}, + {file = "grpcio_tools-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:217c2ee6a7ce519a55958b8622e21804f6fdb774db08c322f4c9536c35fdce7c"}, +] + +[package.dependencies] +grpcio = ">=1.62.2" +protobuf = ">=4.21.6,<5.0dev" +setuptools = "*" + [[package]] name = "h11" version = "0.14.0" @@ -1855,6 +1923,32 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = true +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = true +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + [[package]] name = "htmldate" version = "1.8.1" @@ -1926,6 +2020,7 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" +h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} httpcore = "==1.*" idna = "*" sniffio = "*" @@ -1981,6 +2076,17 @@ testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gr torch = ["safetensors", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = true +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + [[package]] name = "identify" version = "2.5.36" @@ -3787,6 +3893,25 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "portalocker" +version = "2.8.2" +description = "Wraps the portalocker recipe for easy usage" +optional = true +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + [[package]] name = "pprintpp" version = "0.4.0" @@ -4597,6 +4722,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4645,6 +4771,32 @@ files = [ [package.dependencies] pyyaml = "*" +[[package]] +name = "qdrant-client" +version = "1.9.1" +description = "Client library for the Qdrant vector search engine" +optional = true +python-versions = ">=3.8" +files = [ + {file = "qdrant_client-1.9.1-py3-none-any.whl", hash = "sha256:b9b7e0e5c1a51410d8bb5106a869a51e12f92ab45a99030f27aba790553bd2c8"}, + {file = "qdrant_client-1.9.1.tar.gz", hash = "sha256:186b9c31d95aefe8f2db84b7746402d7365bd63b305550e530e31bde2002ce79"}, +] + +[package.dependencies] +grpcio = ">=1.41.0" +grpcio-tools = ">=1.41.0" +httpx = {version = ">=0.20.0", extras = ["http2"]} +numpy = [ + {version = ">=1.21", markers = "python_version >= \"3.8\" and python_version < \"3.12\""}, + {version = ">=1.26", markers = "python_version >= \"3.12\""}, +] +portalocker = ">=2.7.0,<3.0.0" +pydantic = ">=1.10.8" +urllib3 = ">=1.26.14,<3" + +[package.extras] +fastembed = ["fastembed (==0.2.6)"] + [[package]] name = "readme-renderer" version = "43.0" @@ -6369,7 +6521,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6399,6 +6551,7 @@ drivers-vector-mongodb = ["pymongo"] drivers-vector-opensearch = ["opensearch-py"] drivers-vector-pinecone = ["pinecone-client"] drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] +drivers-vector-qdrant = ["qdrant-client"] drivers-vector-redis = ["redis"] drivers-web-scraper-markdownify = ["beautifulsoup4", "markdownify", "playwright"] drivers-web-scraper-trafilatura = ["trafilatura"] @@ -6412,4 +6565,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "937d5e870407a493038178b3060c663feb9a1b6e6fc16e55fa380a18d02b0c80" +content-hash = "d4a00633119a6b9616fc0ea31ae354f806d1fc363e4a930fa912d2d710aa8938" diff --git a/pyproject.toml b/pyproject.toml index 7882790cd..be33acb39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,6 +52,7 @@ markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} torch = {version = "^2.3.0", optional = true} +qdrant-client = { version = ">=1.9.1", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} duckduckgo-search = {version = "^6.1.6", optional = true} @@ -87,6 +88,7 @@ drivers-vector-redis = ["redis"] drivers-vector-opensearch = ["opensearch-py"] drivers-vector-amazon-opensearch = ["opensearch-py", "boto3"] drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] +drivers-vector-qdrant = ["qdrant-client"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] @@ -124,6 +126,7 @@ all = [ "snowflake", "marqo", "pinecone-client", + "qdrant-client", "pymongo", "redis", "opensearch-py", diff --git a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py new file mode 100644 index 000000000..4431b146f --- /dev/null +++ b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py @@ -0,0 +1,171 @@ +import pytest +from unittest.mock import MagicMock, patch +from griptape.drivers import QdrantVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from griptape.utils import import_optional_dependency +import uuid + + +class TestQdrantVectorStoreDriver: + @pytest.fixture + def embedding_driver(self): + return MockEmbeddingDriver() + + @pytest.fixture + def mock_engine(self): + return MagicMock() + + @pytest.fixture(autouse=True) + def driver(self, embedding_driver): + driver = QdrantVectorStoreDriver( + url="http://some_url", + port=8080, + grpc_port=50051, + prefer_grpc=True, + api_key=None, + https=False, + prefix=None, + force_disable_check_same_thread=False, + timeout=5, + distance="COSINE", + collection_name="some_collection", + vector_name=None, + content_payload_key="data", + embedding_driver=embedding_driver, + ) + return driver + + def test_attrs_post_init(self, driver): + with patch("griptape.drivers.vector.qdrant_vector_store_driver.import_optional_dependency") as mock_import: + mock_qdrant_client = MagicMock() + mock_import.return_value.QdrantClient.return_value = mock_qdrant_client + + driver.__attrs_post_init__() + + mock_import.assert_called_once_with("qdrant_client") + mock_import.return_value.QdrantClient.assert_called_once_with( + location=driver.location, + url=driver.url, + host=driver.host, + path=driver.path, + port=driver.port, + prefer_grpc=driver.prefer_grpc, + grpc_port=driver.grpc_port, + api_key=driver.api_key, + https=driver.https, + prefix=driver.prefix, + force_disable_check_same_thread=driver.force_disable_check_same_thread, + timeout=driver.timeout, + ) + assert driver.client == mock_qdrant_client + + def test_delete_vector(self, driver): + vector_id = "test_vector_id" + + mock_deletion_response = MagicMock() + mock_deletion_response.status = import_optional_dependency("qdrant_client.http.models").UpdateStatus.COMPLETED + + with patch.object(driver.client, "delete", return_value=mock_deletion_response) as mock_delete, patch( + "griptape.drivers.vector.qdrant_vector_store_driver.import_optional_dependency" + ) as mock_import: + mock_import.return_value.PointIdsList.return_value = MagicMock() + mock_import.return_value.UpdateStatus = import_optional_dependency("qdrant_client.http.models").UpdateStatus + + driver.delete_vector(vector_id) + + mock_delete.assert_called_once_with( + collection_name=driver.collection_name, + points_selector=mock_import.return_value.PointIdsList(points=[vector_id]), + ) + + def test_query(self, driver): + mock_query_result = [ + MagicMock( + id="foo", vector=[0, 1, 0], score=42, payload={"foo": "bar", "_score": 0.99, "_tensor_facets": []} + ) + ] + + with patch.object( + driver.embedding_driver, "embed_string", return_value=[0.1, 0.2, 0.3] + ) as mock_embed, patch.object(driver.client, "search", return_value=mock_query_result) as mock_search: + query = "test" + count = 10 + include_vectors = True + + results = driver.query(query, count, include_vectors=include_vectors) + + mock_embed.assert_called_once_with(query) + mock_search.assert_called_once_with( + collection_name=driver.collection_name, query_vector=[0.1, 0.2, 0.3], limit=count + ) + + assert len(results) == 1 + assert results[0].id == "foo" + assert results[0].vector == [0, 1, 0] if include_vectors else [] + assert results[0].score == 42 + assert results[0].meta == {"foo": "bar"} + + def test_upsert_with_batch(self, driver): + vector = [0.1, 0.2, 0.3] + vector_id = str(uuid.uuid4()) + meta = {"meta_key": "meta_value"} + + with patch("griptape.drivers.vector.qdrant_vector_store_driver.import_optional_dependency") as mock_import: + mock_batch = MagicMock() + mock_import.return_value.Batch.return_value = mock_batch + mock_qdrant_client = MagicMock() + driver.client = mock_qdrant_client + + result = driver.upsert_vector(vector=vector, vector_id=vector_id, meta=meta) + + mock_import.assert_called_once_with("qdrant_client.http.models") + mock_import.return_value.Batch.assert_called_once_with(ids=[vector_id], vectors=[vector], payloads=[meta]) + driver.client.upsert.assert_called_once_with(collection_name=driver.collection_name, points=mock_batch) + assert result == vector_id + + def test_load_entry(self, driver): + vector_id = str(uuid.uuid4()) + mock_entry = MagicMock() + mock_entry.id = vector_id + mock_entry.vector = [0.1, 0.2, 0.3] + mock_entry.payload = {"meta_key": "meta_value", "_score": 0.99, "_tensor_facets": []} + + with patch.object(driver.client, "retrieve", return_value=[mock_entry]): + result = driver.load_entry(vector_id) + + driver.client.retrieve.assert_called_once_with(collection_name=driver.collection_name, ids=[vector_id]) + + assert result.id == vector_id + assert result.vector == [0.1, 0.2, 0.3] + assert result.meta == {"meta_key": "meta_value"} + + with patch.object(driver.client, "retrieve", return_value=[]): + result = driver.load_entry(vector_id) + + driver.client.retrieve.assert_called_with(collection_name=driver.collection_name, ids=[vector_id]) + assert result is None + + def test_load_entries(self, driver): + mock_entries = [ + MagicMock( + id="id1", vector=[0.1, 0.2, 0.3], payload={"key1": "value1", "_score": 0.99, "_tensor_facets": []} + ), + MagicMock( + id="id2", vector=[0.4, 0.5, 0.6], payload={"key2": "value2", "_score": 0.88, "_tensor_facets": []} + ), + ] + + with patch.object(driver.client, "retrieve", return_value=mock_entries) as mock_retrieve: + results = driver.load_entries(ids=["id1", "id2"], with_payload=True, with_vectors=True) + + mock_retrieve.assert_called_once_with( + collection_name=driver.collection_name, ids=["id1", "id2"], with_payload=True, with_vectors=True + ) + + assert len(results) == 2 + assert results[0].id == "id1" + assert results[0].vector == [0.1, 0.2, 0.3] + assert results[0].meta == {"key1": "value1"} + assert results[1].id == "id2" + assert results[1].vector == [0.4, 0.5, 0.6] + assert results[1].meta == {"key2": "value2"} From ef46d1e2de061d551b70336fd530a325954a80ef Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 2 Jul 2024 16:38:23 -0500 Subject: [PATCH 132/238] Update contributing guidelines (#927) --- .github/pull_request_template.md | 7 ++----- Makefile | 8 ++++++-- README.md | 26 +++++++++++++++++--------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3a3496ef6..71a920fcf 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,8 +1,5 @@ +- [ ] I have read and agree to the contributing guidelines for [submitting new pull requests](https://github.com/griptape-ai/griptape?tab=readme-ov-file#submitting-pull-requests). + ## Describe your changes ## Issue ticket number and link - -## Checklist before requesting a review -- [ ] I have performed a self-review of my code. -- [ ] I have added thorough tests. -- [ ] Is this a notable change? If so, please update the [changelog](https://github.com/griptape-ai/griptape/blob/dev/CHANGELOG.md). diff --git a/Makefile b/Makefile index 57d1869ce..13410094c 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ publish: ## Push git tag and publish version to PyPI. install: ## Install all dependencies. @poetry install --with dev --with test --with docs --all-extras -.PHONY: test -test: test/unit test/integration ## Run all tests. +.PHONY: test ## Run all tests. +test: test/unit test/integration .PHONY: test/unit test/unit: ## Run unit tests. @@ -57,6 +57,10 @@ check/types: .PHONY: check/spell check/spell: @poetry run typos + +.PHONY: docs +docs: ## Build documentation. + @poetry run mkdocs build .DEFAULT_GOAL := help .PHONY: help diff --git a/README.md b/README.md index 6905903a3..3f2a895ab 100644 --- a/README.md +++ b/README.md @@ -162,12 +162,6 @@ Thank you for considering contributing to Griptape! Before you start, please rea If you have identified a bug, want to propose a new feature, or have a question, please submit an issue through our public [issue tracker](https://github.com/griptape-ai/griptape/issues). Before submitting a new issue, please check the existing issues to ensure it hasn't been reported or discussed before. -### New Griptape Tools - -Griptape's extensibility allows anyone to develop and distribute tools independently. With rare exceptions for Tools providing broadly applicable functionality, new Griptape Tools should be managed as their own projects and not submitted to the core framework. Pull requests for new tools (unless addressing an [existing issue](https://github.com/griptape-ai/griptape/issues)) will be closed. - -The [Griptape Tool Template](https://github.com/griptape-ai/tool-template) provides the recommended structure, step-by-step instructions, basic automation, and usage examples for new Tools. In the Template, select **Use this template** then **Create a new repository** to begin a new Tool project. - ### Submitting Pull Requests We welcome and encourage pull requests. To streamline the process, please follow these guidelines: @@ -178,13 +172,27 @@ We welcome and encourage pull requests. To streamline the process, please follow 3. **Unit Tests:** Ensure that your pull request passes all existing unit tests. Additionally, if you are introducing new code, please include new unit tests to validate its functionality. +Run `make test/unit` to execute the test suite locally. + 4. **Documentation:** Every pull request must include updates to documentation or explicitly explain why a documentation update is not required. Documentation is crucial for maintaining a comprehensive and user-friendly project. -5. **Code Style:** Griptape uses [Ruff](https://github.com/astral-sh/ruff) to enforce style guidelines. You can ensure that your code is formatted accordingly and will pass formatting checks using `pre-commit`. See [Tools](#tools) for information on how to configure this and other dev tools. +Run `make docs` to build the documentation locally. + +5. **Code Checks:** Griptape a variety of tools to enforce code quality and style. Your code must pass all checks before it can be merged. + +Run `make check` to run all code checks locally. + +6. **Changelog:** If your pull request introduces a notable change, please update the [changelog](https://github.com/griptape-ai/griptape/blob/dev/CHANGELOG.md). + +### New Griptape Tools + +Griptape's extensibility allows anyone to develop and distribute tools independently. With rare exceptions for Tools providing broadly applicable functionality, new Griptape Tools should be managed as their own projects and not submitted to the core framework. Pull requests for new tools (unless addressing an [existing issue](https://github.com/griptape-ai/griptape/issues)) will be closed. + +The [Griptape Tool Template](https://github.com/griptape-ai/tool-template) provides the recommended structure, step-by-step instructions, basic automation, and usage examples for new Tools. In the Template, select **Use this template** then **Create a new repository** to begin a new Tool project. -### Tools +### Dev and Test Dependencies -Install dev dependencies via Make: +Install all dependencies via Make: ```shell make install From 748744194c257e882c6c622826ea6faa82766a92 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 2 Jul 2024 18:19:05 -0500 Subject: [PATCH 133/238] Fix integration tests; Update `PromptTask` input validation (#931) --- docs/griptape-framework/drivers/prompt-drivers.md | 2 +- docs/griptape-tools/official-tools/date-time.md | 4 +--- .../drivers/vector/base_vector_store_driver.py | 8 ++++++-- griptape/tasks/prompt_task.py | 4 +--- poetry.lock | 14 +------------- .../vector/test_pinecone_vector_storage_driver.py | 2 +- .../vector/test_qdrant_vector_store_driver.py | 3 ++- tests/unit/tasks/test_prompt_task.py | 6 +++++- 8 files changed, 18 insertions(+), 25 deletions(-) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index f95a0ba4e..a846cbb5b 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -36,7 +36,7 @@ stack = PromptStack() stack.add_system_message( "You will be provided with Python code, and your task is to calculate its time complexity." ) -stack.add_user_input( +stack.add_user_message( """ def foo(n, k): accum = 0 diff --git a/docs/griptape-tools/official-tools/date-time.md b/docs/griptape-tools/official-tools/date-time.md index 6ecf6e2a6..aa0c0cc55 100644 --- a/docs/griptape-tools/official-tools/date-time.md +++ b/docs/griptape-tools/official-tools/date-time.md @@ -12,9 +12,7 @@ agent = Agent( ) # Fetch the current date and time -agent.run({ - "description": "What is the current date and time?" -}) +agent.run("What is the current date and time?") ``` ``` [09/11/23 15:26:02] INFO Task d0bf49dacd8849e695494578a333f6cc diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 2c0962328..5a4130a88 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -1,4 +1,5 @@ from __future__ import annotations +import uuid from abc import ABC, abstractmethod from concurrent import futures from dataclasses import dataclass @@ -56,7 +57,7 @@ def upsert_text_artifact( **kwargs, ) -> str: meta = {} if meta is None else meta - vector_id = utils.str_to_hash(artifact.to_text()) if vector_id is None else vector_id + vector_id = self._get_default_vector_id(artifact.to_text()) if vector_id is None else vector_id if self.does_entry_exist(vector_id, namespace): return vector_id @@ -81,7 +82,7 @@ def upsert_text( meta: Optional[dict] = None, **kwargs, ) -> str: - vector_id = utils.str_to_hash(string) if vector_id is None else vector_id + vector_id = self._get_default_vector_id(string) if vector_id is None else vector_id if self.does_entry_exist(vector_id, namespace): return vector_id @@ -134,3 +135,6 @@ def query( include_vectors: bool = False, **kwargs, ) -> list[Entry]: ... + + def _get_default_vector_id(self, value: str) -> str: + return str(uuid.uuid5(uuid.NAMESPACE_OID, value)) diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index f10899f76..dba542d60 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -100,11 +100,9 @@ def _process_task_input( return task_input elif isinstance(task_input, Callable): return self._process_task_input(task_input(self)) - elif isinstance(task_input, str): - return self._process_task_input(TextArtifact(task_input)) elif isinstance(task_input, BaseArtifact): return task_input elif isinstance(task_input, list) or isinstance(task_input, tuple): return ListArtifact([self._process_task_input(elem) for elem in task_input]) else: - raise ValueError(f"Invalid input type: {type(task_input)} ") + return self._process_task_input(TextArtifact(task_input)) diff --git a/poetry.lock b/poetry.lock index 64f01aa75..1d925d6a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -4463,48 +4463,37 @@ files = [ {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab6b32544491ee655264dab86fc8a58e47c4f87d196b28022d4007faf971a50"}, {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64bd6299e7fc888bb7f7292cf3e29504c406e5d5d04afd37ca994ab8142d8ee4"}, {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e914b650dd953b8d9b24ef56aa4ecbfc16e399227b68accd818f8bf159e0c558"}, - {file = "pyreqwest_impersonate-0.4.8-cp310-none-win_amd64.whl", hash = "sha256:cb56a2149b0c4548a8e0158b071a943f33dae9b717f92b5c9ac34ccd1f5a958c"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f62620e023490902feca0109f306e122e427feff7d59e03ecd22c69a89452367"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08d4c01d76da88cfe3d7d03b311b375ce3fb5a59130f93f0637bb755d6e56ff1"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524e276bc460176c79d7ba4b9131d9db73c534586660371ebdf067749252a33"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22863bc0aaf02ca2f5d76c8130929ae680b7d82dfc1c28c1ed5f306ff626928"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cc82d57f6a91037e64a7aa9122f909576ef2a141a42ce599958ef9f8c4bc033"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da8a053308210e44fd8349f07f45442a0691ac932f2881e98b05cf9ac404b091"}, - {file = "pyreqwest_impersonate-0.4.8-cp311-none-win_amd64.whl", hash = "sha256:4baf3916c14364a815a64ead7f728afb61b37541933b2771f18dbb245029bb55"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:78db05deed0b32c9c75f2b3168a3a9b7d5e36487b218cb839bfe7e2a143450cb"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9af9446d605903c2b4e94621a9093f8d8a403729bc9cbfbcb62929f8238c838f"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c55890181d8d81e66cac25a95e215dc9680645d01e9091b64449d5407ad9bc6"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69344e7ae9964502a8693da7ad77ebc3e1418ee197e2e394bc23c5d4970772a"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5db5c957a10d8cc2815085ba0b8fe09245b2f94c2225d9653a854a03b4217e1"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03c19c21f63f9c91c590c4bbcc32cc2d8066b508c683a1d163b8c7d9816a01d5"}, - {file = "pyreqwest_impersonate-0.4.8-cp312-none-win_amd64.whl", hash = "sha256:0230610779129f74ff802c744643ce7589b1d07cba21d046fe3b574281c29581"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b8cb9471ab4b2fa7e80d3ac4e580249ff988d782f2938ad1f0428433652b170d"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8081a5ace2658be91519902bde9ddc5f94e1f850a39be196007a25e3da5bbfdc"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69eababfa3200459276acd780a0f3eaf41d1fe7c02bd169e714cba422055b5b9"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632957fa671ebb841166e40913015de457225cb73600ef250c436c280e68bf45"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2ce7ddef334b4e5c68f5ea1da1d65f686b8d84f4443059d128e0f069d3fa499a"}, - {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6ce333d450b158d582e36317089a006440b4e66739a8e8849d170e4cb15e8c8d"}, - {file = "pyreqwest_impersonate-0.4.8-cp38-none-win_amd64.whl", hash = "sha256:9d9c85ce19db92362854f534807e470f03e905f283a7de6826dc79b790a8788e"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2503277f2a95a30e28e498570e2ed03ef4302f873054e8e21d6c0e607cbbc1d1"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8260395ef4ddae325e8b30cef0391adde7bd35e1a1decf8c729e26391f09b52d"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d8066b46d82bbaff5402d767e2f13d3449b8191c37bf8283e91d301a7159869"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c42f6343cfbd6663fb53edc9eb9feb4ebf6186b284e22368adc1eeb6a33854"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff534f491a059e74fb7f994876df86078b4b125dbecc53c098a298ecd55fa9c6"}, - {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b8fbf73b3ac513ddadafd338d61f79cd2370f0691d9175b2b92a45920920d6b"}, - {file = "pyreqwest_impersonate-0.4.8-cp39-none-win_amd64.whl", hash = "sha256:a26447c82665d0e361207c1a15e56b0ca54974aa6c1fdfa18c68f908dec78cbe"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24a16b8d55309f0af0db9d04ff442b0c91afccf078a94809e7c3a71747a5c214"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c8fada56465fc19179404cc9d5d5e1064f5dfe27405cb052f57a5b4fe06aed1"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a3d48d5abc146fd804395713427d944757a99254350e6a651e7d776818074aee"}, - {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:475829fe9994c66258157a8d4adb1c038f44f79f901208ba656d547842337227"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef1ec0e97623bc0e18469418cc4dd2c59a2d5fddcae944de61e13c0b46f910e"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91857b196de89e9b36d3f8629aa8772c0bbe7efef8334fe266956b1c192ec31c"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:63831e407487b8a21bb51f97cd86a616c291d5138f8caec16ab6019cf6423935"}, - {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c30e61de93bcd0a9d3ca226b1ae5475002afde61e9d85018a6a4a040eeb86567"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c72c37b03bce9900f5dbb4f476af17253ec60c13bf7a7259f71a8dc1b036cb"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f1096165741b5c2178ab15b0eb09b5de16dd39b1cc135767d72471f0a69ce"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:70c940c0e4ef335e22a6c705b01f286ee44780b5909065d212d94d82ea2580cb"}, - {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81c06f21757602d85f16dbc1cbaee1121cd65455f65aed4c048b7dcda7be85c4"}, - {file = "pyreqwest_impersonate-0.4.8.tar.gz", hash = "sha256:1eba11d47bd17244c64fec1502cc26ee66cc5c8a3be131e408101ae2b455e5bc"}, ] [package.extras] @@ -4722,7 +4711,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, diff --git a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py index c0477fe97..7aea4d411 100644 --- a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py +++ b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py @@ -34,7 +34,7 @@ def driver(self): def test_upsert_text_artifact(self, driver): artifact = TextArtifact("foo") - assert driver.upsert_text_artifact(artifact) == utils.str_to_hash(artifact.value) + assert driver.upsert_text_artifact(artifact) == driver._get_default_vector_id("foo") def test_upsert_vector(self, driver): assert driver.upsert_vector([0, 1, 2], vector_id="foo") == "foo" diff --git a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py index 4431b146f..c999af8b9 100644 --- a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py @@ -16,7 +16,8 @@ def mock_engine(self): return MagicMock() @pytest.fixture(autouse=True) - def driver(self, embedding_driver): + def driver(self, embedding_driver, mocker): + mocker.patch("qdrant_client.QdrantClient") driver = QdrantVectorStoreDriver( url="http://some_url", port=8080, diff --git a/tests/unit/tasks/test_prompt_task.py b/tests/unit/tasks/test_prompt_task.py index bcef8bce1..3a02309d3 100644 --- a/tests/unit/tasks/test_prompt_task.py +++ b/tests/unit/tasks/test_prompt_task.py @@ -111,10 +111,14 @@ def test_input(self): [TextArtifact("foo"), ImageArtifact(b"image-data", format="png", width=100, height=100)] ) ) - assert isinstance(task.input, ListArtifact) assert task.input.value[0].value == "foo" assert isinstance(task.input.value[1], ImageArtifact) assert task.input.value[1].value == b"image-data" assert task.input.value[1].format == "png" assert task.input.value[1].width == 100 + + # default case + task = PromptTask({"default": "test"}) + + assert task.input.value == str({"default": "test"}) From de2315c655c173d5d9d6d55b7a65c1f5e171b70d Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Tue, 2 Jul 2024 19:35:14 -0500 Subject: [PATCH 134/238] Bump pydantic,urllib3,requests (#933) --- poetry.lock | 92 +++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1d925d6a1..f169895cc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4174,47 +4174,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.15" +version = "1.10.16" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"}, - {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"}, - {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"}, - {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"}, - {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"}, - {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"}, - {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"}, - {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, - {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, - {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, - {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, - {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, - {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, - {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, - {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"}, - {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"}, - {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"}, - {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"}, - {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"}, - {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"}, - {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"}, - {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"}, - {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"}, - {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"}, - {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"}, - {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"}, - {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"}, - {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"}, - {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"}, - {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"}, - {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"}, - {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"}, - {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"}, - {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"}, - {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, - {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, + {file = "pydantic-1.10.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1a539ac40551b01a85e899829aa43ca8036707474af8d74b48be288d4d2d2846"}, + {file = "pydantic-1.10.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a4fcc7b0b8038dbda2dda642cff024032dfae24a7960cc58e57a39eb1949b9b"}, + {file = "pydantic-1.10.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4660dd697de1ae2d4305a85161312611f64d5360663a9ba026cd6ad9e3fe14c3"}, + {file = "pydantic-1.10.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:900a787c574f903a97d0bf52a43ff3b6cf4fa0119674bcfc0e5fd1056d388ad9"}, + {file = "pydantic-1.10.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d30192a63e6d3334c3f0c0506dd6ae9f1dce7b2f8845518915291393a5707a22"}, + {file = "pydantic-1.10.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:16cf23ed599ca5ca937e37ba50ab114e6b5c387eb43a6cc533701605ad1be611"}, + {file = "pydantic-1.10.16-cp310-cp310-win_amd64.whl", hash = "sha256:8d23111f41d1e19334edd51438fd57933f3eee7d9d2fa8cc3f5eda515a272055"}, + {file = "pydantic-1.10.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef287b8d7fc0e86a8bd1f902c61aff6ba9479c50563242fe88ba39692e98e1e0"}, + {file = "pydantic-1.10.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b9ded699bfd3b3912d796ff388b0c607e6d35d41053d37aaf8fd6082c660de9a"}, + {file = "pydantic-1.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daeb199814333e4426c5e86d7fb610f4e230289f28cab90eb4de27330bef93cf"}, + {file = "pydantic-1.10.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5973843f1fa99ec6c3ac8d1a8698ac9340b35e45cca6c3e5beb5c3bd1ef15de6"}, + {file = "pydantic-1.10.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6b8a7788a8528a558828fe4a48783cafdcf2612d13c491594a8161dc721629c"}, + {file = "pydantic-1.10.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8abaecf54dacc9d991dda93c3b880d41092a8924cde94eeb811d7d9ab55df7d8"}, + {file = "pydantic-1.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:ddc7b682fbd23f051edc419dc6977e11dd2dbdd0cef9d05f0e15d1387862d230"}, + {file = "pydantic-1.10.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:067c2b5539f7839653ad8c3d1fc2f1343338da8677b7b2172abf3cd3fdc8f719"}, + {file = "pydantic-1.10.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d1fc943583c046ecad0ff5d6281ee571b64e11b5503d9595febdce54f38b290"}, + {file = "pydantic-1.10.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18548b30ccebe71d380b0886cc44ea5d80afbcc155e3518792f13677ad06097d"}, + {file = "pydantic-1.10.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4e92292f9580fc5ea517618580fac24e9f6dc5657196e977c194a8e50e14f5a9"}, + {file = "pydantic-1.10.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5da8bc4bb4f85b8c97cc7f11141fddbbd29eb25e843672e5807e19cc3d7c1b7f"}, + {file = "pydantic-1.10.16-cp37-cp37m-win_amd64.whl", hash = "sha256:a04ee1ea34172b87707a6ecfcdb120d7656892206b7c4dbdb771a73e90179fcb"}, + {file = "pydantic-1.10.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4fa86469fd46e732242c7acb83282d33f83591a7e06f840481327d5bf6d96112"}, + {file = "pydantic-1.10.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89c2783dc261726fe7a5ce1121bce29a2f7eb9b1e704c68df2b117604e3b346f"}, + {file = "pydantic-1.10.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78e59fa919fa7a192f423d190d8660c35dd444efa9216662273f36826765424b"}, + {file = "pydantic-1.10.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7e82a80068c77f4b074032e031e642530b6d45cb8121fc7c99faa31fb6c6b72"}, + {file = "pydantic-1.10.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d82d5956cee27a30e26a5b88d00a6a2a15a4855e13c9baf50175976de0dc282c"}, + {file = "pydantic-1.10.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b7b99424cc0970ff08deccb549b5a6ec1040c0b449eab91723e64df2bd8fdca"}, + {file = "pydantic-1.10.16-cp38-cp38-win_amd64.whl", hash = "sha256:d97a35e1ba59442775201657171f601a2879e63517a55862a51f8d67cdfc0017"}, + {file = "pydantic-1.10.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9d91f6866fd3e303c632207813ef6bc4d86055e21c5e5a0a311983a9ac5f0192"}, + {file = "pydantic-1.10.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8d3c71d14c8bd26d2350c081908dbf59d5a6a8f9596d9ef2b09cc1e61c8662b"}, + {file = "pydantic-1.10.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b73e6386b439b4881d79244e9fc1e32d1e31e8d784673f5d58a000550c94a6c0"}, + {file = "pydantic-1.10.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f039881fb2ef86f6de6eacce6e71701b47500355738367413ccc1550b2a69cf"}, + {file = "pydantic-1.10.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3895ddb26f22bdddee7e49741486aa7b389258c6f6771943e87fc00eabd79134"}, + {file = "pydantic-1.10.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55b945da2756b5cef93d792521ad0d457fdf2f69fd5a2d10a27513f5281717dd"}, + {file = "pydantic-1.10.16-cp39-cp39-win_amd64.whl", hash = "sha256:22dd265c77c3976a34be78409b128cb84629284dfd1b69d2fa1507a36f84dc8b"}, + {file = "pydantic-1.10.16-py3-none-any.whl", hash = "sha256:aa2774ba5412fd1c5cb890d08e8b0a3bb5765898913ba1f61a65a4810f03cf29"}, + {file = "pydantic-1.10.16.tar.gz", hash = "sha256:8bb388f6244809af69ee384900b10b677a69f1980fdc655ea419710cffcb5610"}, ] [package.dependencies] @@ -4912,13 +4912,13 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -6177,13 +6177,13 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "1.26.19" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-1.26.19-py2.py3-none-any.whl", hash = "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3"}, + {file = "urllib3-1.26.19.tar.gz", hash = "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429"}, ] [package.extras] @@ -6553,4 +6553,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d4a00633119a6b9616fc0ea31ae354f806d1fc363e4a930fa912d2d710aa8938" +content-hash = "a38d0f0671ff5deb42783721f4ce103e670a689f618e950451a807921f5d7139" diff --git a/pyproject.toml b/pyproject.toml index be33acb39..e4c84f624 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ numpy = ">=1" stringcase = "^1.2.0" docker = "^7.1.0" sqlalchemy = "~=1.0" -requests = "^2" +requests = "^2.32.0" # drivers cohere = { version = "^5.5.4", optional = true } From 89b69bcb5eca53b123e498374e86b7ec9f0aae4d Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Wed, 3 Jul 2024 07:45:05 -0700 Subject: [PATCH 135/238] Use custom discord invite link (#932) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f2a895ab..42df8fbd6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![codecov](https://codecov.io/github/griptape-ai/griptape/graph/badge.svg?token=HUBqUpl3NB)](https://codecov.io/github/griptape-ai/griptape) -[![Griptape Discord](https://dcbadge.vercel.app/api/server/gnWRz88eym?compact=true&style=flat)](https://discord.gg/gnWRz88eym) +[![Griptape Discord](https://dcbadge.vercel.app/api/server/gnWRz88eym?compact=true&style=flat)](https://discord.gg/griptape) Griptape is a modular Python framework for building AI-powered applications that securely connect to your enterprise data and APIs. It offers developers the ability to maintain control and flexibility at every step. From 1f09acb8089e054a2574f82ffce1b94b96603478 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Wed, 3 Jul 2024 10:57:52 -0600 Subject: [PATCH 136/238] `RagContext` and other `RagEngine` improvements (#930) --- CHANGELOG.md | 17 +++--- docs/examples/talk-to-a-pdf.md | 17 +++--- docs/examples/talk-to-a-webpage.md | 18 +++--- .../griptape-framework/engines/rag-engines.md | 32 +++++----- .../structures/task-memory.md | 19 +++--- docs/griptape-framework/structures/tasks.md | 16 ++--- .../official-tools/rag-client.md | 16 ++--- griptape/engines/rag/modules/__init__.py | 36 +++++------ .../engines/rag/modules/base_rag_module.py | 15 ++++- .../metadata_generation_rag_module.py | 20 ------- .../modules/query/base_query_rag_module.py | 2 +- .../related_query_generation_rag_module.py | 34 ----------- .../{generation => response}/__init__.py | 0 .../base_after_response_rag_module.py} | 2 +- .../base_before_response_rag_module.py} | 2 +- .../base_response_rag_module.py} | 2 +- .../metadata_before_response_rag_module.py | 19 ++++++ .../prompt_response_rag_module.py} | 10 ++-- .../rulesets_before_response_rag_module.py} | 4 +- .../text_chunks_response_rag_module.py | 12 ++++ ...le.py => text_chunks_rerank_rag_module.py} | 4 +- .../retrieval/text_retrieval_rag_module.py | 36 ----------- .../vector_store_retrieval_rag_module.py | 24 ++++++++ griptape/engines/rag/rag_context.py | 16 ++--- griptape/engines/rag/rag_engine.py | 27 +++++++-- griptape/engines/rag/stages/__init__.py | 4 +- griptape/engines/rag/stages/base_rag_stage.py | 5 ++ .../rag/stages/generation_rag_stage.py | 33 ----------- .../engines/rag/stages/query_rag_stage.py | 17 +++--- .../engines/rag/stages/response_rag_stage.py | 46 +++++++++++++++ .../engines/rag/stages/retrieval_rag_stage.py | 13 +++- .../task/storage/base_artifact_storage.py | 2 +- .../task/storage/blob_artifact_storage.py | 2 +- .../task/storage/text_artifact_storage.py | 25 +++++++- griptape/memory/task/task_memory.py | 2 +- griptape/structures/structure.py | 23 ++++---- griptape/tasks/rag_task.py | 4 +- .../rag/modules/prompt_generation/system.j2 | 15 ----- .../rag/modules/query_generation/system.j2 | 3 - .../metadata}/system.j2 | 0 .../rag/modules/response/prompt/system.j2 | 19 ++++++ griptape/tools/base_tool.py | 6 +- griptape/tools/rag_client/tool.py | 4 +- griptape/tools/task_memory_client/tool.py | 4 +- tests/mocks/mock_rag_module.py | 4 ++ ...est_metadata_before_response_rag_module.py | 19 ++++++ .../test_metadata_generation_rag_module.py | 14 ----- ....py => test_prompt_response_rag_module.py} | 8 +-- ...est_rulesets_before_response_rag_module.py | 10 ++++ .../test_rulesets_generation_rag_module.py | 10 ---- .../test_text_chunks_response_rag_module.py | 15 +++++ ...est_related_query_generation_rag_module.py | 13 ---- ... => test_text_chunks_rerank_rag_module.py} | 8 +-- .../test_text_retrieval_rag_module.py | 20 ------- .../test_vector_store_retrieval_rag_module.py | 59 +++++++++++++++++++ .../rag/modules/test_base_rag_nodule.py | 27 +++++++++ tests/unit/engines/rag/test_rag_engine.py | 34 ++++++++--- tests/unit/structures/test_agent.py | 2 +- tests/unit/tasks/test_rag_task.py | 8 +-- tests/unit/tools/test_base_tool.py | 4 -- tests/utils/defaults.py | 9 +-- 61 files changed, 516 insertions(+), 375 deletions(-) delete mode 100644 griptape/engines/rag/modules/generation/metadata_generation_rag_module.py delete mode 100644 griptape/engines/rag/modules/query/related_query_generation_rag_module.py rename griptape/engines/rag/modules/{generation => response}/__init__.py (100%) rename griptape/engines/rag/modules/{generation/base_after_generation_rag_module.py => response/base_after_response_rag_module.py} (82%) rename griptape/engines/rag/modules/{generation/base_before_generation_rag_module.py => response/base_before_response_rag_module.py} (82%) rename griptape/engines/rag/modules/{generation/base_generation_rag_module.py => response/base_response_rag_module.py} (83%) create mode 100644 griptape/engines/rag/modules/response/metadata_before_response_rag_module.py rename griptape/engines/rag/modules/{generation/prompt_generation_rag_module.py => response/prompt_response_rag_module.py} (87%) rename griptape/engines/rag/modules/{generation/rulesets_generation_rag_module.py => response/rulesets_before_response_rag_module.py} (73%) create mode 100644 griptape/engines/rag/modules/response/text_chunks_response_rag_module.py rename griptape/engines/rag/modules/retrieval/{text_rerank_rag_module.py => text_chunks_rerank_rag_module.py} (69%) delete mode 100644 griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py delete mode 100644 griptape/engines/rag/stages/generation_rag_stage.py create mode 100644 griptape/engines/rag/stages/response_rag_stage.py delete mode 100644 griptape/templates/engines/rag/modules/prompt_generation/system.j2 delete mode 100644 griptape/templates/engines/rag/modules/query_generation/system.j2 rename griptape/templates/engines/rag/modules/{metadata_generation => response/metadata}/system.j2 (100%) create mode 100644 griptape/templates/engines/rag/modules/response/prompt/system.j2 create mode 100644 tests/mocks/mock_rag_module.py create mode 100644 tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py delete mode 100644 tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py rename tests/unit/engines/rag/modules/generation/{test_prompt_generation_rag_module.py => test_prompt_response_rag_module.py} (71%) create mode 100644 tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py delete mode 100644 tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py create mode 100644 tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py delete mode 100644 tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py rename tests/unit/engines/rag/modules/retrieval/{test_text_rerank_rag_module.py => test_text_chunks_rerank_rag_module.py} (62%) delete mode 100644 tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py create mode 100644 tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py create mode 100644 tests/unit/engines/rag/modules/test_base_rag_nodule.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 399da1969..91c8fe89f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,17 +38,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - RAG stages: - `QueryRagStage` for parsing and expanding queries. - `RetrievalRagStage` for retrieving content. - - `GenerationRagStage` for augmenting and generating outputs. + - `ResponseRagStage` for augmenting and generating outputs. - RAG modules: - - Query: - - `RelatedQueryGenerationRagModule` for generating related queries. - Retrieval: - - `TextRetrievalRagModule` for retrieving text chunks. - - `TextRerankRagModule` for re-ranking retrieved results. - - Generation: - - `MetadataGenerationRagModule` for appending metadata. - - `RulesetsGenerationRagModule` for appending rulesets. - - `PromptGenerationRagModule` for generating responses based on retrieved text chunks. + - `VectorStoreRetrievalRagModule` for retrieving text chunks from vector stores. + - `TextChunksRerankRagModule` for re-ranking retrieved results. + - Response: + - `MetadataBeforeResponseRagModule` for appending metadata. + - `RulesetsBeforeResponseRagModule` for appending rulesets. + - `PromptResponseRagModule` for generating responses based on retrieved text chunks. + - `TextChunksResponseRagModule` for responding with retrieved text chunks. - `RagClient` tool for exposing `RagEngines` to LLM agents. - `RagTask` task for including `RagEngines` in any structure. - Rerank drivers: diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md index a39832961..a3f47f0c6 100644 --- a/docs/examples/talk-to-a-pdf.md +++ b/docs/examples/talk-to-a-pdf.md @@ -4,8 +4,8 @@ This example demonstrates how to vectorize a PDF of the [Attention Is All You Ne import requests from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from griptape.loaders import PdfLoader from griptape.structures import Agent from griptape.tools import RagClient @@ -19,15 +19,18 @@ vector_store = LocalVectorStoreDriver( engine = RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace=namespace, + VectorStoreRetrievalRagModule( vector_store_driver=vector_store, - top_n=20 + query_params={ + "namespace": namespace, + "top_n": 20 + + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md index ddd1a18c9..d1d0da5fa 100644 --- a/docs/examples/talk-to-a-webpage.md +++ b/docs/examples/talk-to-a-webpage.md @@ -3,8 +3,8 @@ This example demonstrates how to vectorize a webpage and setup a Griptape agent ```python from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from griptape.loaders import WebLoader from griptape.rules import Ruleset, Rule from griptape.structures import Agent @@ -18,15 +18,18 @@ vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDri engine = RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace=namespace, + VectorStoreRetrievalRagModule( vector_store_driver=vector_store_driver, - top_n=20 + query_params={ + "namespace": namespace, + "top_n": 20 + + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) @@ -40,7 +43,6 @@ vector_store_driver.upsert_text_artifacts( {namespace: artifacts} ) - vector_store_tool = RagClient( description="Contains information about physics. " "Use it to answer any physics-related questions.", diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md index 600b91d03..c03bf0f47 100644 --- a/docs/griptape-framework/engines/rag-engines.md +++ b/docs/griptape-framework/engines/rag-engines.md @@ -10,21 +10,23 @@ ### RAG Stages - `QueryRagStage` is for parsing and expanding queries. - `RetrievalRagStage` is for retrieving content. -- `GenerationRagStage` is for augmenting and generating outputs. +- `ResponseRagStage` is for augmenting and generating outputs. ### RAG Modules #### Query -- `RelatedQueryGenerationRagModule` is for generating related queries. + +No modules implemented yet. #### Retrieval - `TextRetrievalRagModule` is for retrieving text chunks. -- `TextRerankRagModule` is for re-ranking retrieved results. +- `TextChunksRerankRagModule` is for re-ranking retrieved results. -#### Generation -- `MetadataGenerationRagModule` is for appending metadata. -- `RulesetsGenerationRagModule` is for appending rulesets. -- `PromptGenerationRagModule` is for generating responses based on retrieved text chunks. +#### Response +- `MetadataBeforeResponseRagModule` is for appending metadata. +- `RulesetsBeforeResponseRagModule` is for appending rulesets. +- `PromptResponseRagModule` is for generating responses based on retrieved text chunks. +- `TextChunksResponseRagModule` for responding with retrieved text chunks. ### Example @@ -32,8 +34,8 @@ from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage vector_store = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) @@ -46,15 +48,17 @@ vector_store.upsert_text_artifacts({"griptape": artifacts}) engine = RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace="griptape", + VectorStoreRetrievalRagModule( vector_store_driver=vector_store, - top_n=20 + query_params={ + "namespace": "griptape", + "top_n": 20 + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 4597b6402..24f0c6363 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -208,14 +208,13 @@ from griptape.drivers import ( OpenAiChatPromptDriver, OpenAiEmbeddingDriver, ) from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.structures import Agent from griptape.tools import FileManager, TaskMemoryClient, WebScraper - vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) agent = Agent( @@ -228,19 +227,23 @@ agent = Agent( rag_engine=RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace="griptape", + VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, - top_n=20 + query_params={ + "namespace": "griptape", + "count": 20 + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) ), + retrieval_rag_module_name="VectorStoreRetrievalRagModule", vector_store_driver=vector_store_driver ) } diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index c385df6cd..b839b2910 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -386,8 +386,8 @@ from griptape.tasks import RagTask from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.artifacts import TextArtifact from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage # Initialize Embedding Driver and Vector Store Driver vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) @@ -406,15 +406,17 @@ agent.add_task( rag_engine=RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace="griptape", + VectorStoreRetrievalRagModule( vector_store_driver=vector_store_driver, - top_n=20 + query_params={ + "namespace": "griptape", + "top_n": 20 + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) diff --git a/docs/griptape-tools/official-tools/rag-client.md b/docs/griptape-tools/official-tools/rag-client.md index 75bc5dee7..6c8f9f17d 100644 --- a/docs/griptape-tools/official-tools/rag-client.md +++ b/docs/griptape-tools/official-tools/rag-client.md @@ -8,8 +8,8 @@ from griptape.tasks import RagTask from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.artifacts import TextArtifact from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage # Initialize Embedding Driver and Vector Store Driver vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) @@ -28,15 +28,17 @@ agent.add_task( rag_engine=RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( - namespace="griptape", + VectorStoreRetrievalRagModule( vector_store_driver=vector_store_driver, - top_n=20 + query_params={ + "namespace": "griptape", + "top_n": 20 + } ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule( + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o") ) ) diff --git a/griptape/engines/rag/modules/__init__.py b/griptape/engines/rag/modules/__init__.py index a9550d8bb..cb11551e3 100644 --- a/griptape/engines/rag/modules/__init__.py +++ b/griptape/engines/rag/modules/__init__.py @@ -1,29 +1,29 @@ from .base_rag_module import BaseRagModule from .query.base_query_rag_module import BaseQueryRagModule -from .query.related_query_generation_rag_module import RelatedQueryGenerationRagModule from .retrieval.base_retrieval_rag_module import BaseRetrievalRagModule from .retrieval.base_rerank_rag_module import BaseRerankRagModule -from .retrieval.text_rerank_rag_module import TextRerankRagModule -from .retrieval.text_retrieval_rag_module import TextRetrievalRagModule -from .generation.base_before_generation_rag_module import BaseBeforeGenerationRagModule -from .generation.base_after_generation_rag_module import BaseAfterGenerationRagModule -from .generation.base_generation_rag_module import BaseGenerationRagModule -from .generation.prompt_generation_rag_module import PromptGenerationRagModule -from .generation.rulesets_generation_rag_module import RulesetsGenerationRagModule -from .generation.metadata_generation_rag_module import MetadataGenerationRagModule +from .retrieval.text_chunks_rerank_rag_module import TextChunksRerankRagModule +from .retrieval.vector_store_retrieval_rag_module import VectorStoreRetrievalRagModule +from .response.base_before_response_rag_module import BaseBeforeResponseRagModule +from .response.base_after_response_rag_module import BaseAfterResponseRagModule +from .response.base_response_rag_module import BaseResponseRagModule +from .response.prompt_response_rag_module import PromptResponseRagModule +from .response.rulesets_before_response_rag_module import RulesetsBeforeResponseRagModule +from .response.metadata_before_response_rag_module import MetadataBeforeResponseRagModule +from .response.text_chunks_response_rag_module import TextChunksResponseRagModule __all__ = [ "BaseRagModule", "BaseQueryRagModule", - "RelatedQueryGenerationRagModule", "BaseRetrievalRagModule", "BaseRerankRagModule", - "TextRerankRagModule", - "TextRetrievalRagModule", - "BaseBeforeGenerationRagModule", - "BaseAfterGenerationRagModule", - "BaseGenerationRagModule", - "PromptGenerationRagModule", - "RulesetsGenerationRagModule", - "MetadataGenerationRagModule", + "TextChunksRerankRagModule", + "VectorStoreRetrievalRagModule", + "BaseBeforeResponseRagModule", + "BaseAfterResponseRagModule", + "BaseResponseRagModule", + "PromptResponseRagModule", + "RulesetsBeforeResponseRagModule", + "MetadataBeforeResponseRagModule", + "TextChunksResponseRagModule", ] diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 13563970d..becd94d9e 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -1,14 +1,14 @@ from abc import ABC from concurrent import futures -from typing import Callable - +from typing import Callable, Any, Optional from attrs import define, field, Factory - +from griptape.engines.rag import RagContext from griptape.common import PromptStack, Message @define(kw_only=True) class BaseRagModule(ABC): + name: str = field(default=Factory(lambda self: self.__class__.__name__, takes_self=True), kw_only=True) futures_executor_fn: Callable[[], futures.Executor] = field( default=Factory(lambda: lambda: futures.ThreadPoolExecutor()) ) @@ -17,3 +17,12 @@ def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptS return PromptStack( messages=[Message(system_prompt, role=Message.SYSTEM_ROLE), Message(query, role=Message.USER_ROLE)] ) + + def get_context_param(self, context: RagContext, key: str) -> Optional[Any]: + return context.module_params.get(self.name, {}).get(key) + + def set_context_param(self, context: RagContext, key: str, value: Any) -> None: + if not isinstance(context.module_params.get(self.name), dict): + context.module_params[self.name] = {} + + context.module_params[self.name][key] = value diff --git a/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py b/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py deleted file mode 100644 index 1ce689960..000000000 --- a/griptape/engines/rag/modules/generation/metadata_generation_rag_module.py +++ /dev/null @@ -1,20 +0,0 @@ -from typing import Optional -from attrs import define, field -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseBeforeGenerationRagModule -from griptape.utils import J2 - - -@define(kw_only=True) -class MetadataGenerationRagModule(BaseBeforeGenerationRagModule): - metadata: Optional[str] = field(default=None) - - def run(self, context: RagContext) -> RagContext: - metadata = context.metadata if self.metadata is None else self.metadata - - if metadata is not None: - context.before_query.append( - J2("engines/rag/modules/metadata_generation/system.j2").render(metadata=metadata) - ) - - return context diff --git a/griptape/engines/rag/modules/query/base_query_rag_module.py b/griptape/engines/rag/modules/query/base_query_rag_module.py index c9eace864..195bba6bd 100644 --- a/griptape/engines/rag/modules/query/base_query_rag_module.py +++ b/griptape/engines/rag/modules/query/base_query_rag_module.py @@ -7,4 +7,4 @@ @define(kw_only=True) class BaseQueryRagModule(BaseRagModule, ABC): @abstractmethod - def run(self, context: RagContext) -> list[str]: ... + def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py b/griptape/engines/rag/modules/query/related_query_generation_rag_module.py deleted file mode 100644 index 138e5f034..000000000 --- a/griptape/engines/rag/modules/query/related_query_generation_rag_module.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Callable -from attrs import define, field, Factory -from griptape import utils -from griptape.drivers import BasePromptDriver -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseQueryRagModule -from griptape.utils import J2 - - -@define(kw_only=True) -class RelatedQueryGenerationRagModule(BaseQueryRagModule): - query_count: int = field(default=5) - prompt_driver: BasePromptDriver = field() - generate_system_template: Callable[[str], str] = field( - default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True - ) - - def run(self, context: RagContext) -> list[str]: - system_prompt = self.generate_system_template(context.initial_query) - - with self.futures_executor_fn() as executor: - results = utils.execute_futures_list( - [ - executor.submit( - self.prompt_driver.run, self.generate_query_prompt_stack(system_prompt, "Alternative query: ") - ) - for _ in range(self.query_count) - ] - ) - - return [r.value for r in results] - - def default_system_template_generator(self, initial_query: str) -> str: - return J2("engines/rag/modules/query_generation/system.j2").render(initial_query=initial_query) diff --git a/griptape/engines/rag/modules/generation/__init__.py b/griptape/engines/rag/modules/response/__init__.py similarity index 100% rename from griptape/engines/rag/modules/generation/__init__.py rename to griptape/engines/rag/modules/response/__init__.py diff --git a/griptape/engines/rag/modules/generation/base_after_generation_rag_module.py b/griptape/engines/rag/modules/response/base_after_response_rag_module.py similarity index 82% rename from griptape/engines/rag/modules/generation/base_after_generation_rag_module.py rename to griptape/engines/rag/modules/response/base_after_response_rag_module.py index f3a26e9db..03d906204 100644 --- a/griptape/engines/rag/modules/generation/base_after_generation_rag_module.py +++ b/griptape/engines/rag/modules/response/base_after_response_rag_module.py @@ -5,6 +5,6 @@ @define(kw_only=True) -class BaseAfterGenerationRagModule(BaseRagModule, ABC): +class BaseAfterResponseRagModule(BaseRagModule, ABC): @abstractmethod def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/generation/base_before_generation_rag_module.py b/griptape/engines/rag/modules/response/base_before_response_rag_module.py similarity index 82% rename from griptape/engines/rag/modules/generation/base_before_generation_rag_module.py rename to griptape/engines/rag/modules/response/base_before_response_rag_module.py index 6a57bd6af..2a16b68d0 100644 --- a/griptape/engines/rag/modules/generation/base_before_generation_rag_module.py +++ b/griptape/engines/rag/modules/response/base_before_response_rag_module.py @@ -5,6 +5,6 @@ @define(kw_only=True) -class BaseBeforeGenerationRagModule(BaseRagModule, ABC): +class BaseBeforeResponseRagModule(BaseRagModule, ABC): @abstractmethod def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/generation/base_generation_rag_module.py b/griptape/engines/rag/modules/response/base_response_rag_module.py similarity index 83% rename from griptape/engines/rag/modules/generation/base_generation_rag_module.py rename to griptape/engines/rag/modules/response/base_response_rag_module.py index 08f1b5323..72a7dce1b 100644 --- a/griptape/engines/rag/modules/generation/base_generation_rag_module.py +++ b/griptape/engines/rag/modules/response/base_response_rag_module.py @@ -5,6 +5,6 @@ @define(kw_only=True) -class BaseGenerationRagModule(BaseRagModule, ABC): +class BaseResponseRagModule(BaseRagModule, ABC): @abstractmethod def run(self, context: RagContext) -> RagContext: ... diff --git a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py new file mode 100644 index 000000000..7bd1cf0a9 --- /dev/null +++ b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py @@ -0,0 +1,19 @@ +from typing import Optional +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseBeforeResponseRagModule +from griptape.utils import J2 + + +@define(kw_only=True) +class MetadataBeforeResponseRagModule(BaseBeforeResponseRagModule): + metadata: Optional[str] = field(default=None) + + def run(self, context: RagContext) -> RagContext: + context_metadata = self.get_context_param(context, "metadata") + metadata = self.metadata if context_metadata is None else context_metadata + + if metadata is not None: + context.before_query.append(J2("engines/rag/modules/response/metadata/system.j2").render(metadata=metadata)) + + return context diff --git a/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py similarity index 87% rename from griptape/engines/rag/modules/generation/prompt_generation_rag_module.py rename to griptape/engines/rag/modules/response/prompt_response_rag_module.py index 26d95bdd1..7b29de7ee 100644 --- a/griptape/engines/rag/modules/generation/prompt_generation_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -3,12 +3,12 @@ from griptape.artifacts.text_artifact import TextArtifact from griptape.drivers import BasePromptDriver from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseGenerationRagModule +from griptape.engines.rag.modules import BaseResponseRagModule from griptape.utils import J2 @define(kw_only=True) -class PromptGenerationRagModule(BaseGenerationRagModule): +class PromptResponseRagModule(BaseResponseRagModule): answer_token_offset: int = field(default=400) prompt_driver: BasePromptDriver = field() generate_system_template: Callable[[list[str], list[str], list[str]], str] = field( @@ -16,7 +16,7 @@ class PromptGenerationRagModule(BaseGenerationRagModule): ) def run(self, context: RagContext) -> RagContext: - query = context.initial_query + query = context.query before_query = context.before_query after_query = context.after_query text_artifact_chunks = context.text_chunks @@ -24,7 +24,7 @@ def run(self, context: RagContext) -> RagContext: if query: tokenizer = self.prompt_driver.tokenizer text_chunks = [] - system_prompt = "" + system_prompt = self.generate_system_template(text_chunks, before_query, after_query) for artifact in text_artifact_chunks: text_chunks.append(artifact.value) @@ -53,7 +53,7 @@ def run(self, context: RagContext) -> RagContext: def default_system_template_generator( self, text_chunks: list[str], before_system_prompt: list, after_system_prompt: list ) -> str: - return J2("engines/rag/modules/prompt_generation/system.j2").render( + return J2("engines/rag/modules/response/prompt/system.j2").render( text_chunks=text_chunks, before_system_prompt="\n\n".join(before_system_prompt), after_system_prompt="\n\n".join(after_system_prompt), diff --git a/griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py similarity index 73% rename from griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py rename to griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py index ff29c379a..27a421c1b 100644 --- a/griptape/engines/rag/modules/generation/rulesets_generation_rag_module.py +++ b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py @@ -1,12 +1,12 @@ from attrs import define, field from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseBeforeGenerationRagModule +from griptape.engines.rag.modules import BaseBeforeResponseRagModule from griptape.rules import Ruleset from griptape.utils import J2 @define -class RulesetsGenerationRagModule(BaseBeforeGenerationRagModule): +class RulesetsBeforeResponseRagModule(BaseBeforeResponseRagModule): rulesets: list[Ruleset] = field(kw_only=True) def run(self, context: RagContext) -> RagContext: diff --git a/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py new file mode 100644 index 000000000..699aa1124 --- /dev/null +++ b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py @@ -0,0 +1,12 @@ +from attrs import define +from griptape.artifacts import ListArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseResponseRagModule + + +@define(kw_only=True) +class TextChunksResponseRagModule(BaseResponseRagModule): + def run(self, context: RagContext) -> RagContext: + context.output = ListArtifact(context.text_chunks) + + return context diff --git a/griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py b/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py similarity index 69% rename from griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py rename to griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py index a766d0cb6..b78c3a880 100644 --- a/griptape/engines/rag/modules/retrieval/text_rerank_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py @@ -7,6 +7,6 @@ @define(kw_only=True) -class TextRerankRagModule(BaseRerankRagModule): +class TextChunksRerankRagModule(BaseRerankRagModule): def run(self, context: RagContext) -> Sequence[BaseArtifact]: - return self.rerank_driver.run(context.initial_query, context.text_chunks) + return self.rerank_driver.run(context.query, context.text_chunks) diff --git a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py deleted file mode 100644 index 9c756bfea..000000000 --- a/griptape/engines/rag/modules/retrieval/text_retrieval_rag_module.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations -import itertools -from typing import TYPE_CHECKING, Optional, Sequence -from attrs import define, field -from griptape import utils -from griptape.artifacts import TextArtifact -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseRetrievalRagModule - -if TYPE_CHECKING: - from griptape.drivers import BaseVectorStoreDriver - - -@define(kw_only=True) -class TextRetrievalRagModule(BaseRetrievalRagModule): - vector_store_driver: BaseVectorStoreDriver = field() - namespace: Optional[str] = field(default=None) - top_n: Optional[int] = field(default=None) - - def run(self, context: RagContext) -> Sequence[TextArtifact]: - all_queries = [context.initial_query] + context.alternative_queries - namespace = self.namespace or context.namespace - - with self.futures_executor_fn() as executor: - results = utils.execute_futures_list( - [ - executor.submit(self.vector_store_driver.query, query, self.top_n, namespace, False) - for query in all_queries - ] - ) - - return [ - artifact - for artifact in [r.to_artifact() for r in list(itertools.chain.from_iterable(results))] - if isinstance(artifact, TextArtifact) - ] diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py new file mode 100644 index 000000000..e91650faf --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -0,0 +1,24 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Sequence, Any, Callable +from attrs import define, field, Factory +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRetrievalRagModule + +if TYPE_CHECKING: + from griptape.drivers import BaseVectorStoreDriver + + +@define(kw_only=True) +class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): + vector_store_driver: BaseVectorStoreDriver = field() + query_params: dict[str, Any] = field(factory=dict) + process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( + default=Factory(lambda: lambda es: [e.to_artifact() for e in es]) + ) + + def run(self, context: RagContext) -> Sequence[TextArtifact]: + context_query_params = self.get_context_param(context, "query_params") + query_params = self.query_params if context_query_params is None else context_query_params + + return self.process_query_output_fn(self.vector_store_driver.query(context.query, **query_params)) diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index 5f8ce9d6a..ce0d1adc6 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -1,6 +1,6 @@ from typing import Optional from attrs import define, field -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, BaseArtifact @define(kw_only=True) @@ -9,21 +9,17 @@ class RagContext: method. Attributes: - initial_query: Query provided by the user. - namespace: Optional namespace override for modules with an explicit namespace parameter. - metadata: Optional metadata override for modules with an explicit metadata parameter. - alternative_queries: Optional queries to expand retrieval results. + query: Query provided by the user. + module_params: Dictionary of dictionary parameters to be used by modules. First key should be the module name and the second a parameter name. before_query: An optional list of strings to add before the query in generation modules. after_query: An optional list of strings to add after the query in generation modules. text_chunks: A list of text chunks to pass around from the retrieval stage to the generation stage. output: Final output from the generation stage. """ - initial_query: str = field() - namespace: Optional[str] = field(default=None) - metadata: Optional[str] = field(default=None) - alternative_queries: list[str] = field(factory=list) + query: str = field() + module_params: dict[str, dict] = field(factory=dict) before_query: list[str] = field(factory=list) after_query: list[str] = field(factory=list) text_chunks: list[TextArtifact] = field(factory=list) - output: Optional[TextArtifact] = field(default=None) + output: Optional[BaseArtifact] = field(default=None) diff --git a/griptape/engines/rag/rag_engine.py b/griptape/engines/rag/rag_engine.py index 1c2176128..da8a2eebe 100644 --- a/griptape/engines/rag/rag_engine.py +++ b/griptape/engines/rag/rag_engine.py @@ -1,17 +1,34 @@ from typing import Optional from attrs import define, field from griptape.engines.rag import RagContext -from griptape.engines.rag.stages import QueryRagStage, GenerationRagStage, RetrievalRagStage +from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage @define(kw_only=True) class RagEngine: query_stage: Optional[QueryRagStage] = field(default=None) retrieval_stage: Optional[RetrievalRagStage] = field(default=None) - generation_stage: Optional[GenerationRagStage] = field(default=None) + response_stage: Optional[ResponseRagStage] = field(default=None) + + def __attrs_post_init__(self) -> None: + modules = [] + + if self.query_stage is not None: + modules.extend(self.query_stage.modules) + + if self.retrieval_stage is not None: + modules.extend(self.retrieval_stage.modules) + + if self.response_stage is not None: + modules.extend(self.response_stage.modules) + + module_names = [m.name for m in modules] + + if len(module_names) > len(set(module_names)): + raise ValueError("module names have to be unique") def process_query(self, query: str) -> RagContext: - return self.process(RagContext(initial_query=query)) + return self.process(RagContext(query=query)) def process(self, context: RagContext) -> RagContext: if self.query_stage: @@ -20,7 +37,7 @@ def process(self, context: RagContext) -> RagContext: if self.retrieval_stage: context = self.retrieval_stage.run(context) - if self.generation_stage: - context = self.generation_stage.run(context) + if self.response_stage: + context = self.response_stage.run(context) return context diff --git a/griptape/engines/rag/stages/__init__.py b/griptape/engines/rag/stages/__init__.py index 85a603d03..14756563c 100644 --- a/griptape/engines/rag/stages/__init__.py +++ b/griptape/engines/rag/stages/__init__.py @@ -1,6 +1,6 @@ from .base_rag_stage import BaseRagStage from .retrieval_rag_stage import RetrievalRagStage from .query_rag_stage import QueryRagStage -from .generation_rag_stage import GenerationRagStage +from .response_rag_stage import ResponseRagStage -__all__ = ["BaseRagStage", "RetrievalRagStage", "QueryRagStage", "GenerationRagStage"] +__all__ = ["BaseRagStage", "RetrievalRagStage", "QueryRagStage", "ResponseRagStage"] diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index ca19e1bb4..4db996e30 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -3,6 +3,7 @@ from typing import Callable from attrs import define, field, Factory from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRagModule @define(kw_only=True) @@ -13,3 +14,7 @@ class BaseRagStage(ABC): @abstractmethod def run(self, context: RagContext) -> RagContext: ... + + @property + @abstractmethod + def modules(self) -> list[BaseRagModule]: ... diff --git a/griptape/engines/rag/stages/generation_rag_stage.py b/griptape/engines/rag/stages/generation_rag_stage.py deleted file mode 100644 index 60102889a..000000000 --- a/griptape/engines/rag/stages/generation_rag_stage.py +++ /dev/null @@ -1,33 +0,0 @@ -import logging -from attrs import define, field -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import ( - BaseGenerationRagModule, - BaseBeforeGenerationRagModule, - BaseAfterGenerationRagModule, -) -from griptape.engines.rag.stages import BaseRagStage - - -@define(kw_only=True) -class GenerationRagStage(BaseRagStage): - before_generator_modules: list[BaseBeforeGenerationRagModule] = field(factory=list) - generation_module: BaseGenerationRagModule = field() - after_generator_modules: list[BaseAfterGenerationRagModule] = field(factory=list) - - def run(self, context: RagContext) -> RagContext: - logging.info(f"GenerationStage: running {len(self.before_generator_modules)} before modules sequentially") - - for generator in self.before_generator_modules: - context = generator.run(context) - - logging.info("GenerationStage: running generation module") - - context = self.generation_module.run(context) - - logging.info(f"GenerationStage: running {len(self.after_generator_modules)} after modules sequentially") - - for generator in self.after_generator_modules: - context = generator.run(context) - - return context diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index c2216aea8..84c200bc8 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -1,24 +1,23 @@ -import itertools import logging from attrs import define, field from griptape import utils from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseQueryRagModule +from griptape.engines.rag.modules import BaseQueryRagModule, BaseRagModule from griptape.engines.rag.stages import BaseRagStage @define(kw_only=True) class QueryRagStage(BaseRagStage): - query_generation_modules: list[BaseQueryRagModule] = field() + query_modules: list[BaseQueryRagModule] = field() + + @property + def modules(self) -> list[BaseRagModule]: + return self.query_modules # pyright: ignore def run(self, context: RagContext) -> RagContext: - logging.info(f"QueryStage: running {len(self.query_generation_modules)} query generation modules in parallel") + logging.info(f"QueryStage: running {len(self.query_modules)} query generation modules in parallel") with self.futures_executor_fn() as executor: - results = utils.execute_futures_list( - [executor.submit(r.run, context) for r in self.query_generation_modules] - ) - - context.alternative_queries = list(itertools.chain.from_iterable(results)) + utils.execute_futures_list([executor.submit(r.run, context) for r in self.query_modules]) return context diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py new file mode 100644 index 000000000..aa0a15dfc --- /dev/null +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -0,0 +1,46 @@ +import logging +from attrs import define, field +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import ( + BaseResponseRagModule, + BaseBeforeResponseRagModule, + BaseAfterResponseRagModule, + BaseRagModule, +) +from griptape.engines.rag.stages import BaseRagStage + + +@define(kw_only=True) +class ResponseRagStage(BaseRagStage): + before_response_modules: list[BaseBeforeResponseRagModule] = field(factory=list) + response_module: BaseResponseRagModule = field() + after_response_modules: list[BaseAfterResponseRagModule] = field(factory=list) + + @property + def modules(self) -> list[BaseRagModule]: + ms = [] + + ms.extend(self.before_response_modules) + ms.extend(self.after_response_modules) + + if self.response_module is not None: + ms.append(self.response_module) + + return ms + + def run(self, context: RagContext) -> RagContext: + logging.info(f"GenerationStage: running {len(self.before_response_modules)} before modules sequentially") + + for generator in self.before_response_modules: + context = generator.run(context) + + logging.info("GenerationStage: running generation module") + + context = self.response_module.run(context) + + logging.info(f"GenerationStage: running {len(self.after_response_modules)} after modules sequentially") + + for generator in self.after_response_modules: + context = generator.run(context) + + return context diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index cbc90a43e..8fe376cd1 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -5,7 +5,7 @@ from griptape import utils from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseRerankRagModule +from griptape.engines.rag.modules import BaseRerankRagModule, BaseRagModule from griptape.engines.rag.modules import BaseRetrievalRagModule from griptape.engines.rag.stages import BaseRagStage @@ -16,6 +16,17 @@ class RetrievalRagStage(BaseRagStage): rerank_module: Optional[BaseRerankRagModule] = field(default=None) max_chunks: Optional[int] = field(default=None) + @property + def modules(self) -> list[BaseRagModule]: + ms = [] + + ms.extend(self.retrieval_modules) + + if self.rerank_module is not None: + ms.append(self.rerank_module) + + return ms + def run(self, context: RagContext) -> RagContext: logging.info(f"RetrievalStage: running {len(self.retrieval_modules)} retrieval modules in parallel") diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index fbd226363..e8378fee4 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -20,4 +20,4 @@ def can_store(self, artifact: BaseArtifact) -> bool: ... def summarize(self, namespace: str) -> TextArtifact | InfoArtifact: ... @abstractmethod - def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact | InfoArtifact: ... + def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: ... diff --git a/griptape/memory/task/storage/blob_artifact_storage.py b/griptape/memory/task/storage/blob_artifact_storage.py index 79b5798df..9d09e17fa 100644 --- a/griptape/memory/task/storage/blob_artifact_storage.py +++ b/griptape/memory/task/storage/blob_artifact_storage.py @@ -26,5 +26,5 @@ def load_artifacts(self, namespace: str) -> ListArtifact: def summarize(self, namespace: str) -> InfoArtifact: return InfoArtifact("can't summarize artifacts") - def query(self, namespace: str, query: str, metadata: Any = None) -> InfoArtifact: + def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: return InfoArtifact("can't query artifacts") diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 34d65a0c5..976a9ea5b 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -14,10 +14,16 @@ class TextArtifactStorage(BaseArtifactStorage): vector_store_driver: BaseVectorStoreDriver = field() rag_engine: Optional[RagEngine] = field(default=None) + retrieval_rag_module_name: Optional[str] = field(default=None) summary_engine: Optional[BaseSummaryEngine] = field(default=None) csv_extraction_engine: Optional[CsvExtractionEngine] = field(default=None) json_extraction_engine: Optional[JsonExtractionEngine] = field(default=None) + @rag_engine.validator # pyright: ignore + def validate_rag_engine(self, _, rag_engine: str) -> None: + if rag_engine is not None and self.retrieval_rag_module_name is None: + raise ValueError("You have to set retrieval_rag_module_name if rag_engine is provided") + def can_store(self, artifact: BaseArtifact) -> bool: return isinstance(artifact, TextArtifact) @@ -36,12 +42,25 @@ def summarize(self, namespace: str) -> TextArtifact: return self.summary_engine.summarize_artifacts(self.load_artifacts(namespace)) - def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact | InfoArtifact: + def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifact: if self.rag_engine is None: - raise ValueError("RAG engine is not set.") + raise ValueError("rag_engine is not set") + + if self.retrieval_rag_module_name is None: + raise ValueError("retrieval_rag_module_name is not set") result = self.rag_engine.process( - RagContext(initial_query=query, namespace=namespace, metadata=None if metadata is None else str(metadata)) + RagContext( + query=query, + module_params={ + self.retrieval_rag_module_name: { + "query_params": { + "namespace": namespace, + "metadata": None if metadata is None else str(metadata), + } + } + }, + ) ).output if result is None: diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index 2f1fdbe16..df9c9be30 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -124,7 +124,7 @@ def summarize_namespace(self, namespace: str) -> TextArtifact | InfoArtifact: else: return InfoArtifact("Can't find memory content") - def query_namespace(self, namespace: str, query: str) -> TextArtifact | InfoArtifact: + def query_namespace(self, namespace: str, query: str) -> BaseArtifact: storage = self.namespace_storage.get(namespace) if storage: diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index c5854ccac..18e7d1284 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -13,12 +13,12 @@ from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( - TextRetrievalRagModule, - RulesetsGenerationRagModule, - PromptGenerationRagModule, - MetadataGenerationRagModule, + VectorStoreRetrievalRagModule, + RulesetsBeforeResponseRagModule, + PromptResponseRagModule, + MetadataBeforeResponseRagModule, ) -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from griptape.events import BaseEvent, EventListener from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.start_structure_run_event import StartStructureRunEvent @@ -174,14 +174,14 @@ def default_config(self) -> BaseStructureConfig: def default_rag_engine(self) -> RagEngine: return RagEngine( retrieval_stage=RetrievalRagStage( - retrieval_modules=[TextRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)] + retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)] ), - generation_stage=GenerationRagStage( - before_generator_modules=[ - RulesetsGenerationRagModule(rulesets=self.rulesets), - MetadataGenerationRagModule(), + response_stage=ResponseRagStage( + before_response_modules=[ + RulesetsBeforeResponseRagModule(rulesets=self.rulesets), + MetadataBeforeResponseRagModule(), ], - generation_module=PromptGenerationRagModule(prompt_driver=self.config.prompt_driver), + response_module=PromptResponseRagModule(prompt_driver=self.config.prompt_driver), ), ) @@ -191,6 +191,7 @@ def default_task_memory(self) -> TaskMemory: artifact_storages={ TextArtifact: TextArtifactStorage( rag_engine=self.rag_engine, + retrieval_rag_module_name="VectorStoreRetrievalRagModule", vector_store_driver=self.config.vector_store_driver, summary_engine=PromptSummaryEngine(prompt_driver=self.config.prompt_driver), csv_extraction_engine=CsvExtractionEngine(prompt_driver=self.config.prompt_driver), diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py index d50e881c1..e85c8f28a 100644 --- a/griptape/tasks/rag_task.py +++ b/griptape/tasks/rag_task.py @@ -1,6 +1,6 @@ from __future__ import annotations from attrs import define, field -from griptape.artifacts import TextArtifact, ErrorArtifact +from griptape.artifacts import ErrorArtifact, BaseArtifact from griptape.engines.rag import RagEngine from griptape.tasks import BaseTextInputTask @@ -22,7 +22,7 @@ def rag_engine(self) -> RagEngine: def rag_engine(self, value: RagEngine) -> None: self._rag_engine = value - def run(self) -> TextArtifact | ErrorArtifact: + def run(self) -> BaseArtifact: result = self.rag_engine.process_query(self.input.to_text()).output if result is None: diff --git a/griptape/templates/engines/rag/modules/prompt_generation/system.j2 b/griptape/templates/engines/rag/modules/prompt_generation/system.j2 deleted file mode 100644 index 85c1b9fa8..000000000 --- a/griptape/templates/engines/rag/modules/prompt_generation/system.j2 +++ /dev/null @@ -1,15 +0,0 @@ -{% if before_system_prompt %} -{{ before_system_prompt }} - -{% endif %} -You can answer questions by searching through text chunks. Always be truthful. Don't make up facts. Use the below list of text chunks to respond. If the answer cannot be found in the chunks, say "I could not find an answer." - -{% for chunk in text_chunks %} -Text chunk: """ -{{ chunk }} -""" -{% endfor %} -{% if after_system_prompt %} - -{{ after_system_prompt }} -{% endif %} \ No newline at end of file diff --git a/griptape/templates/engines/rag/modules/query_generation/system.j2 b/griptape/templates/engines/rag/modules/query_generation/system.j2 deleted file mode 100644 index dd2a8e4bd..000000000 --- a/griptape/templates/engines/rag/modules/query_generation/system.j2 +++ /dev/null @@ -1,3 +0,0 @@ -Given the following query, generate an alternative query that has the same meaning but uses different words and introduces other related terms. Don't say anything else. Only output an alternative query and nothing else. - -Query: {{ initial_query }} \ No newline at end of file diff --git a/griptape/templates/engines/rag/modules/metadata_generation/system.j2 b/griptape/templates/engines/rag/modules/response/metadata/system.j2 similarity index 100% rename from griptape/templates/engines/rag/modules/metadata_generation/system.j2 rename to griptape/templates/engines/rag/modules/response/metadata/system.j2 diff --git a/griptape/templates/engines/rag/modules/response/prompt/system.j2 b/griptape/templates/engines/rag/modules/response/prompt/system.j2 new file mode 100644 index 000000000..4b06f3e8c --- /dev/null +++ b/griptape/templates/engines/rag/modules/response/prompt/system.j2 @@ -0,0 +1,19 @@ +{% if before_system_prompt %} +{{ before_system_prompt }} + +{% endif %} +Always be truthful. Don't make up facts. You can answer questions by searching through text chunks. Use the following list of text chunks to respond. If there are no text chunks available or text chunks don't have relevant information respond with "I could not find an answer." + +{% if text_chunks and text_chunks|length > 0 %} +{% for chunk in text_chunks %} +Text chunk: """ +{{ chunk }} +""" +{% endfor %} +{% if after_system_prompt %} + +{{ after_system_prompt }} +{% endif %} +{% else %} +No text chunks available. +{% endif %} \ No newline at end of file diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 8a0a924ac..03aaf22b5 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -35,7 +35,7 @@ class BaseTool(ActivityMixin, ABC): MANIFEST_FILE = "manifest.yml" REQUIREMENTS_FILE = "requirements.txt" - name: str = field(default=Factory(lambda self: self.class_name, takes_self=True), kw_only=True) + name: str = field(default=Factory(lambda self: self.__class__.__name__, takes_self=True), kw_only=True) input_memory: Optional[list[TaskMemory]] = field(default=None, kw_only=True) output_memory: Optional[dict[str, list[TaskMemory]]] = field(default=None, kw_only=True) install_dependencies_on_init: bool = field(default=True, kw_only=True) @@ -61,10 +61,6 @@ def validate_output_memory(self, _, output_memory: dict[str, Optional[list[TaskM if len(output_memory_names) > len(set(output_memory_names)): raise ValueError(f"memory names have to be unique in activity '{activity_name}' output") - @property - def class_name(self): - return self.__class__.__name__ - @property def manifest_path(self) -> str: return os.path.join(self.abs_dir_path, self.MANIFEST_FILE) diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index 78d716008..94422cc15 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -1,7 +1,7 @@ from __future__ import annotations from attrs import define, field from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact, TextArtifact +from griptape.artifacts import ErrorArtifact, BaseArtifact from griptape.engines.rag import RagEngine from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -24,7 +24,7 @@ class RagClient(BaseTool): "schema": Schema({Literal("query", description="A natural language search query"): str}), } ) - def search(self, params: dict) -> TextArtifact | ErrorArtifact: + def search(self, params: dict) -> BaseArtifact: query = params["values"]["query"] try: diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index b60c0acc0..ce89da22e 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -1,7 +1,7 @@ from __future__ import annotations from attrs import define from schema import Schema, Literal -from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact +from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, BaseArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -39,7 +39,7 @@ def summarize(self, params: dict) -> TextArtifact | InfoArtifact | ErrorArtifact ), } ) - def query(self, params: dict) -> TextArtifact | InfoArtifact | ErrorArtifact: + def query(self, params: dict) -> BaseArtifact: memory = self.find_input_memory(params["values"]["memory_name"]) artifact_namespace = params["values"]["artifact_namespace"] query = params["values"]["query"] diff --git a/tests/mocks/mock_rag_module.py b/tests/mocks/mock_rag_module.py new file mode 100644 index 000000000..98b69cee8 --- /dev/null +++ b/tests/mocks/mock_rag_module.py @@ -0,0 +1,4 @@ +from griptape.engines.rag.modules import BaseRagModule + + +class MockRagModule(BaseRagModule): ... diff --git a/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py new file mode 100644 index 000000000..43927bd8a --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py @@ -0,0 +1,19 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import MetadataBeforeResponseRagModule + + +class TestMetadataBeforeResponseRagModule: + def test_run(self): + module = MetadataBeforeResponseRagModule(name="foo") + + assert "foo" in module.run(RagContext(module_params={"foo": {"metadata": "foo"}}, query="test")).before_query[0] + + def test_run_with_override(self): + module = MetadataBeforeResponseRagModule(name="foo", metadata="bar") + + assert ( + "bar" + in module.run( + RagContext(module_params={"foo": {"query_params": {"metadata": "foo"}}}, query="test") + ).before_query[0] + ) diff --git a/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py deleted file mode 100644 index 0bd9f1f85..000000000 --- a/tests/unit/engines/rag/modules/generation/test_metadata_generation_rag_module.py +++ /dev/null @@ -1,14 +0,0 @@ -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import MetadataGenerationRagModule - - -class TestMetadataGenerationModule: - def test_run(self): - module = MetadataGenerationRagModule() - - assert "foo" in module.run(RagContext(metadata="foo", initial_query="test")).before_query[0] - - def test_run_with_override(self): - module = MetadataGenerationRagModule(metadata="bar") - - assert "bar" in module.run(RagContext(metadata="foo", initial_query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py similarity index 71% rename from tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py rename to tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py index 0227e2783..d8835bbe4 100644 --- a/tests/unit/engines/rag/modules/generation/test_prompt_generation_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py @@ -1,16 +1,16 @@ import pytest from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import PromptGenerationRagModule +from griptape.engines.rag.modules import PromptResponseRagModule from tests.mocks.mock_prompt_driver import MockPromptDriver -class TestPromptGenerationRagModule: +class TestPromptResponseRagModule: @pytest.fixture def module(self): - return PromptGenerationRagModule(prompt_driver=MockPromptDriver()) + return PromptResponseRagModule(prompt_driver=MockPromptDriver()) def test_run(self, module): - assert module.run(RagContext(initial_query="test")).output.value == "mock output" + assert module.run(RagContext(query="test")).output.value == "mock output" def test_prompt(self, module): system_message = module.default_system_template_generator( diff --git a/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py new file mode 100644 index 000000000..2750257f4 --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py @@ -0,0 +1,10 @@ +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import RulesetsBeforeResponseRagModule +from griptape.rules import Ruleset, Rule + + +class TestRulesetsBeforeResponseRagModule: + def test_run(self): + module = RulesetsBeforeResponseRagModule(rulesets=[Ruleset(name="test ruleset", rules=[Rule("test rule")])]) + + assert "test rule" in module.run(RagContext(query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py b/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py deleted file mode 100644 index 6e0fe725a..000000000 --- a/tests/unit/engines/rag/modules/generation/test_rulesets_generation_rag_module.py +++ /dev/null @@ -1,10 +0,0 @@ -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import RulesetsGenerationRagModule -from griptape.rules import Ruleset, Rule - - -class TestRulesetsGenerationRagModule: - def test_run(self): - module = RulesetsGenerationRagModule(rulesets=[Ruleset(name="test ruleset", rules=[Rule("test rule")])]) - - assert "test rule" in module.run(RagContext(initial_query="test")).before_query[0] diff --git a/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py new file mode 100644 index 000000000..6488d650e --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py @@ -0,0 +1,15 @@ +import pytest +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import TextChunksResponseRagModule + + +class TestTextChunksResponseRagModule: + @pytest.fixture + def module(self): + return TextChunksResponseRagModule() + + def test_run(self, module): + text_chunks = [TextArtifact("foo"), TextArtifact("bar")] + + assert module.run(RagContext(query="test", text_chunks=text_chunks)).output.value == text_chunks diff --git a/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py b/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py deleted file mode 100644 index 699d73de5..000000000 --- a/tests/unit/engines/rag/modules/query/test_related_query_generation_rag_module.py +++ /dev/null @@ -1,13 +0,0 @@ -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import RelatedQueryGenerationRagModule -from tests.mocks.mock_prompt_driver import MockPromptDriver - - -class TestRelatedQueryGenerationRagModule: - def test_run(self): - result = RelatedQueryGenerationRagModule(prompt_driver=MockPromptDriver(), query_count=10).run( - RagContext(initial_query="test") - ) - - assert len(result) == 10 - assert all(r == "mock output" for r in result) diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py similarity index 62% rename from tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py rename to tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py index dc3e46a0a..838f02e37 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_text_rerank_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py @@ -2,10 +2,10 @@ import pytest from griptape.drivers import CohereRerankDriver from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import TextRerankRagModule +from griptape.engines.rag.modules import TextChunksRerankRagModule -class TestTextRerankRagModule: +class TestTextChunksRerankRagModule: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value @@ -14,7 +14,7 @@ def mock_client(self, mocker): return mock_client def test_run(self, mock_client): - module = TextRerankRagModule(rerank_driver=CohereRerankDriver(api_key="api-key")) - result = module.run(RagContext(initial_query="test")) + module = TextChunksRerankRagModule(rerank_driver=CohereRerankDriver(api_key="api-key")) + result = module.run(RagContext(query="test")) assert len(result) == 2 diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py deleted file mode 100644 index 5b69012d1..000000000 --- a/tests/unit/engines/rag/modules/retrieval/test_text_retrieval_rag_module.py +++ /dev/null @@ -1,20 +0,0 @@ -from griptape.artifacts import TextArtifact -from griptape.drivers import LocalVectorStoreDriver -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import TextRetrievalRagModule -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver - - -class TestTextRetrievalRagModule: - def test_run(self): - vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) - module = TextRetrievalRagModule(vector_store_driver=vector_store_driver) - - vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") - vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") - - result = module.run(RagContext(initial_query="test")) - - assert len(result) == 2 - assert result[0].value == "foobar1" - assert result[1].value == "foobar2" diff --git a/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py new file mode 100644 index 000000000..3a01b3eaa --- /dev/null +++ b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py @@ -0,0 +1,59 @@ +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + + +class TestVectorStoreRetrievalRagModule: + def test_run_without_namespace(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + module = VectorStoreRetrievalRagModule(vector_store_driver=vector_store_driver) + + vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") + vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") + + result = module.run(RagContext(query="test")) + + assert len(result) == 2 + assert result[0].value == "foobar1" + assert result[1].value == "foobar2" + + def test_run_with_namespace(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + module = VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, query_params={"namespace": "test"} + ) + + vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") + vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") + + result = module.run(RagContext(query="test")) + + assert len(result) == 2 + assert result[0].value == "foobar1" + assert result[1].value == "foobar2" + + def test_run_with_namespace_overrides(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + module = VectorStoreRetrievalRagModule( + vector_store_driver=vector_store_driver, query_params={"namespace": "test"} + ) + + vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") + vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") + + result1 = module.run( + RagContext( + query="test", module_params={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "empty"}}} + ) + ) + + result2 = module.run( + RagContext( + query="test", module_params={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "test"}}} + ) + ) + + assert len(result1) == 0 + assert len(result2) == 2 diff --git a/tests/unit/engines/rag/modules/test_base_rag_nodule.py b/tests/unit/engines/rag/modules/test_base_rag_nodule.py new file mode 100644 index 000000000..0fc415e0e --- /dev/null +++ b/tests/unit/engines/rag/modules/test_base_rag_nodule.py @@ -0,0 +1,27 @@ +from griptape.engines.rag import RagContext +from tests.mocks.mock_rag_module import MockRagModule + + +class TestBaseRagModule: + def test_generate_query_prompt_stack(self): + prompt_stack = MockRagModule().generate_query_prompt_stack("test system", "test query") + + assert len(prompt_stack.messages) == 2 + assert prompt_stack.messages[0].is_system() + assert prompt_stack.messages[1].is_user() + + def test_get_context_param(self): + module = MockRagModule(name="boo") + context = RagContext(query="test") + + context.module_params["boo"] = {"foo": "bar"} + + assert module.get_context_param(context, "foo") == "bar" + + def test_set_context_param(self): + module = MockRagModule(name="boo") + context = RagContext(query="test") + + module.set_context_param(context, "foo", "bar") + + assert context.module_params["boo"]["foo"] == "bar" diff --git a/tests/unit/engines/rag/test_rag_engine.py b/tests/unit/engines/rag/test_rag_engine.py index b03ab9a1c..a39c0c2f1 100644 --- a/tests/unit/engines/rag/test_rag_engine.py +++ b/tests/unit/engines/rag/test_rag_engine.py @@ -1,8 +1,8 @@ import pytest from griptape.drivers import LocalVectorStoreDriver from griptape.engines.rag import RagEngine, RagContext -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -13,18 +13,38 @@ def engine(self): return RagEngine( retrieval_stage=RetrievalRagStage( retrieval_modules=[ - TextRetrievalRagModule( + VectorStoreRetrievalRagModule( vector_store_driver=LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) ) ] ), - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule(prompt_driver=MockPromptDriver()) - ), + response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=MockPromptDriver())), + ) + + def test_module_name_uniqueness(self): + vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + + with pytest.raises(ValueError): + RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule(name="test", vector_store_driver=vector_store_driver), + VectorStoreRetrievalRagModule(name="test", vector_store_driver=vector_store_driver), + ] + ) + ) + + assert RagEngine( + retrieval_stage=RetrievalRagStage( + retrieval_modules=[ + VectorStoreRetrievalRagModule(name="test1", vector_store_driver=vector_store_driver), + VectorStoreRetrievalRagModule(name="test2", vector_store_driver=vector_store_driver), + ] + ) ) def test_process_query(self, engine): assert engine.process_query("test").output.value == "mock output" def test_process(self, engine): - assert engine.process(RagContext(initial_query="test")).output.value == "mock output" + assert engine.process(RagContext(query="test")).output.value == "mock output" diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index 942a960f9..5dfcbc6d7 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -238,7 +238,7 @@ def test_task_memory_defaults(self): storage = list(agent.task_memory.artifact_storages.values())[0] assert isinstance(storage, TextArtifactStorage) - assert storage.rag_engine.generation_stage.generation_module.prompt_driver == prompt_driver + assert storage.rag_engine.response_stage.response_module.prompt_driver == prompt_driver assert ( storage.rag_engine.retrieval_stage.retrieval_modules[0].vector_store_driver.embedding_driver == embedding_driver diff --git a/tests/unit/tasks/test_rag_task.py b/tests/unit/tasks/test_rag_task.py index 75e5007ad..c9b82f208 100644 --- a/tests/unit/tasks/test_rag_task.py +++ b/tests/unit/tasks/test_rag_task.py @@ -1,7 +1,7 @@ import pytest from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import PromptGenerationRagModule -from griptape.engines.rag.stages import GenerationRagStage +from griptape.engines.rag.modules import PromptResponseRagModule +from griptape.engines.rag.stages import ResponseRagStage from griptape.structures import Agent from griptape.tasks import RagTask from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -13,8 +13,8 @@ def task(self): return RagTask( input="test", rag_engine=RagEngine( - generation_stage=GenerationRagStage( - generation_module=PromptGenerationRagModule(prompt_driver=MockPromptDriver()) + response_stage=ResponseRagStage( + response_module=PromptResponseRagModule(prompt_driver=MockPromptDriver()) ) ), ) diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 082973bcb..210780729 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -166,10 +166,6 @@ def test_name(self): assert MockTool().name == "MockTool" assert MockTool(name="FooBar").name == "FooBar" - def test_class_name(self): - assert MockTool().class_name == "MockTool" - assert MockTool(name="FooBar").class_name == "MockTool" - def test_validate(self, tool): assert tool.validate() diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index f27410308..5a9f6f958 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -2,8 +2,8 @@ from griptape.drivers import LocalVectorStoreDriver from griptape.engines import PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextRetrievalRagModule, PromptGenerationRagModule -from griptape.engines.rag.stages import RetrievalRagStage, GenerationRagStage +from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule +from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage from griptape.memory import TaskMemory from griptape.memory.task.storage import TextArtifactStorage, BlobArtifactStorage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -16,6 +16,7 @@ def text_tool_artifact_storage(): return TextArtifactStorage( rag_engine=rag_engine(MockPromptDriver(), vector_store_driver), vector_store_driver=vector_store_driver, + retrieval_rag_module_name="VectorStoreRetrievalRagModule", summary_engine=PromptSummaryEngine(prompt_driver=MockPromptDriver()), csv_extraction_engine=CsvExtractionEngine(prompt_driver=MockPromptDriver()), json_extraction_engine=JsonExtractionEngine(prompt_driver=MockPromptDriver()), @@ -31,7 +32,7 @@ def text_task_memory(name): def rag_engine(prompt_driver, vector_store_driver): return RagEngine( retrieval_stage=RetrievalRagStage( - retrieval_modules=[TextRetrievalRagModule(vector_store_driver=vector_store_driver)] + retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=vector_store_driver)] ), - generation_stage=GenerationRagStage(generation_module=PromptGenerationRagModule(prompt_driver=prompt_driver)), + response_stage=ResponseRagStage(response_module=PromptResponseRagModule(prompt_driver=prompt_driver)), ) From 83a16ac39159b9729f0108618ac85986c027d533 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Wed, 3 Jul 2024 13:47:05 -0500 Subject: [PATCH 137/238] Update `StructureVisualizer` (#936) --- griptape/utils/structure_visualizer.py | 10 +++++++--- tests/unit/utils/test_structure_visualizer.py | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py index 999519cf1..2a159a282 100644 --- a/griptape/utils/structure_visualizer.py +++ b/griptape/utils/structure_visualizer.py @@ -1,5 +1,6 @@ from __future__ import annotations import base64 +import hashlib from attrs import define, field from typing import TYPE_CHECKING @@ -36,7 +37,10 @@ def to_url(self) -> str: def __render_task(self, task: BaseTask) -> str: if task.children: - children = " & ".join([f"'{child.id}'" for child in task.children]) - return f"'{task.id}'--> {children};" + children = " & ".join([f"{self.__get_id(child.id)}({child.id})" for child in task.children]) + return f"{self.__get_id(task.id)}({task.id})--> {children};" else: - return f"'{task.id}';" + return f"{self.__get_id(task.id)}({task.id});" + + def __get_id(self, string: str) -> str: + return hashlib.md5(string.encode()).hexdigest()[:8] diff --git a/tests/unit/utils/test_structure_visualizer.py b/tests/unit/utils/test_structure_visualizer.py index 396b81166..e16275a5c 100644 --- a/tests/unit/utils/test_structure_visualizer.py +++ b/tests/unit/utils/test_structure_visualizer.py @@ -11,7 +11,7 @@ def test_agent(self): visualizer = StructureVisualizer(agent) result = visualizer.to_url() - assert result == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnOw==" + assert result == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgljYzVkYWYyNih0YXNrMSk7" def test_pipeline(self): pipeline = Pipeline( @@ -29,7 +29,7 @@ def test_pipeline(self): assert ( result - == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnLS0+ICd0YXNrMic7CgkndGFzazInLS0+ICd0YXNrMyc7CgkndGFzazMnLS0+ICd0YXNrNCc7CgkndGFzazQnOw==" + == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgljYzVkYWYyNih0YXNrMSktLT4gYWE1ZGU4N2UodGFzazIpOwoJYWE1ZGU4N2UodGFzazIpLS0+IDUxZmViYjIxKHRhc2szKTsKCTUxZmViYjIxKHRhc2szKS0tPiBhN2JlMzY4Yih0YXNrNCk7CglhN2JlMzY4Yih0YXNrNCk7" ) def test_workflow(self): @@ -48,5 +48,5 @@ def test_workflow(self): assert ( result - == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgkndGFzazEnLS0+ICd0YXNrMicgJiAndGFzazMnOwoJJ3Rhc2syJy0tPiAndGFzazQnOwoJJ3Rhc2szJy0tPiAndGFzazQnOwoJJ3Rhc2s0Jzs=" + == "https://mermaid.ink/svg/Z3JhcGggVEQ7CgljYzVkYWYyNih0YXNrMSktLT4gYWE1ZGU4N2UodGFzazIpICYgNTFmZWJiMjEodGFzazMpOwoJYWE1ZGU4N2UodGFzazIpLS0+IGE3YmUzNjhiKHRhc2s0KTsKCTUxZmViYjIxKHRhc2szKS0tPiBhN2JlMzY4Yih0YXNrNCk7CglhN2JlMzY4Yih0YXNrNCk7" ) From d6cf531425ff205eae44259d9cc5008b2e4a237e Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 3 Jul 2024 15:37:15 -0500 Subject: [PATCH 138/238] Update pyright, fix new pyright errors (#934) --- poetry.lock | 19 +++++++++++++++---- pyproject.toml | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index f169895cc..83d2d5632 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -4463,37 +4463,48 @@ files = [ {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab6b32544491ee655264dab86fc8a58e47c4f87d196b28022d4007faf971a50"}, {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:64bd6299e7fc888bb7f7292cf3e29504c406e5d5d04afd37ca994ab8142d8ee4"}, {file = "pyreqwest_impersonate-0.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e914b650dd953b8d9b24ef56aa4ecbfc16e399227b68accd818f8bf159e0c558"}, + {file = "pyreqwest_impersonate-0.4.8-cp310-none-win_amd64.whl", hash = "sha256:cb56a2149b0c4548a8e0158b071a943f33dae9b717f92b5c9ac34ccd1f5a958c"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f62620e023490902feca0109f306e122e427feff7d59e03ecd22c69a89452367"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08d4c01d76da88cfe3d7d03b311b375ce3fb5a59130f93f0637bb755d6e56ff1"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524e276bc460176c79d7ba4b9131d9db73c534586660371ebdf067749252a33"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22863bc0aaf02ca2f5d76c8130929ae680b7d82dfc1c28c1ed5f306ff626928"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cc82d57f6a91037e64a7aa9122f909576ef2a141a42ce599958ef9f8c4bc033"}, {file = "pyreqwest_impersonate-0.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da8a053308210e44fd8349f07f45442a0691ac932f2881e98b05cf9ac404b091"}, + {file = "pyreqwest_impersonate-0.4.8-cp311-none-win_amd64.whl", hash = "sha256:4baf3916c14364a815a64ead7f728afb61b37541933b2771f18dbb245029bb55"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:78db05deed0b32c9c75f2b3168a3a9b7d5e36487b218cb839bfe7e2a143450cb"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9af9446d605903c2b4e94621a9093f8d8a403729bc9cbfbcb62929f8238c838f"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c55890181d8d81e66cac25a95e215dc9680645d01e9091b64449d5407ad9bc6"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69344e7ae9964502a8693da7ad77ebc3e1418ee197e2e394bc23c5d4970772a"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5db5c957a10d8cc2815085ba0b8fe09245b2f94c2225d9653a854a03b4217e1"}, {file = "pyreqwest_impersonate-0.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03c19c21f63f9c91c590c4bbcc32cc2d8066b508c683a1d163b8c7d9816a01d5"}, + {file = "pyreqwest_impersonate-0.4.8-cp312-none-win_amd64.whl", hash = "sha256:0230610779129f74ff802c744643ce7589b1d07cba21d046fe3b574281c29581"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b8cb9471ab4b2fa7e80d3ac4e580249ff988d782f2938ad1f0428433652b170d"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8081a5ace2658be91519902bde9ddc5f94e1f850a39be196007a25e3da5bbfdc"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69eababfa3200459276acd780a0f3eaf41d1fe7c02bd169e714cba422055b5b9"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632957fa671ebb841166e40913015de457225cb73600ef250c436c280e68bf45"}, {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2ce7ddef334b4e5c68f5ea1da1d65f686b8d84f4443059d128e0f069d3fa499a"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6ce333d450b158d582e36317089a006440b4e66739a8e8849d170e4cb15e8c8d"}, + {file = "pyreqwest_impersonate-0.4.8-cp38-none-win_amd64.whl", hash = "sha256:9d9c85ce19db92362854f534807e470f03e905f283a7de6826dc79b790a8788e"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2503277f2a95a30e28e498570e2ed03ef4302f873054e8e21d6c0e607cbbc1d1"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8260395ef4ddae325e8b30cef0391adde7bd35e1a1decf8c729e26391f09b52d"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d8066b46d82bbaff5402d767e2f13d3449b8191c37bf8283e91d301a7159869"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9c42f6343cfbd6663fb53edc9eb9feb4ebf6186b284e22368adc1eeb6a33854"}, {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff534f491a059e74fb7f994876df86078b4b125dbecc53c098a298ecd55fa9c6"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b8fbf73b3ac513ddadafd338d61f79cd2370f0691d9175b2b92a45920920d6b"}, + {file = "pyreqwest_impersonate-0.4.8-cp39-none-win_amd64.whl", hash = "sha256:a26447c82665d0e361207c1a15e56b0ca54974aa6c1fdfa18c68f908dec78cbe"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24a16b8d55309f0af0db9d04ff442b0c91afccf078a94809e7c3a71747a5c214"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c8fada56465fc19179404cc9d5d5e1064f5dfe27405cb052f57a5b4fe06aed1"}, {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a3d48d5abc146fd804395713427d944757a99254350e6a651e7d776818074aee"}, + {file = "pyreqwest_impersonate-0.4.8-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:475829fe9994c66258157a8d4adb1c038f44f79f901208ba656d547842337227"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef1ec0e97623bc0e18469418cc4dd2c59a2d5fddcae944de61e13c0b46f910e"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91857b196de89e9b36d3f8629aa8772c0bbe7efef8334fe266956b1c192ec31c"}, {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:63831e407487b8a21bb51f97cd86a616c291d5138f8caec16ab6019cf6423935"}, + {file = "pyreqwest_impersonate-0.4.8-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c30e61de93bcd0a9d3ca226b1ae5475002afde61e9d85018a6a4a040eeb86567"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c72c37b03bce9900f5dbb4f476af17253ec60c13bf7a7259f71a8dc1b036cb"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f1096165741b5c2178ab15b0eb09b5de16dd39b1cc135767d72471f0a69ce"}, {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:70c940c0e4ef335e22a6c705b01f286ee44780b5909065d212d94d82ea2580cb"}, + {file = "pyreqwest_impersonate-0.4.8-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81c06f21757602d85f16dbc1cbaee1121cd65455f65aed4c048b7dcda7be85c4"}, + {file = "pyreqwest_impersonate-0.4.8.tar.gz", hash = "sha256:1eba11d47bd17244c64fec1502cc26ee66cc5c8a3be131e408101ae2b455e5bc"}, ] [package.extras] @@ -4501,13 +4512,13 @@ dev = ["pytest (>=8.1.1)"] [[package]] name = "pyright" -version = "1.1.363" +version = "1.1.370" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.363-py3-none-any.whl", hash = "sha256:d3b8d73c8d230e26cc3523862f3398032a0c39a00d7bb69dc0f595f8e888fd01"}, - {file = "pyright-1.1.363.tar.gz", hash = "sha256:00a8f0ae0e339473bb0488f8a2a2dcdf574e94a16cd7b4390d49d144714d8db2"}, + {file = "pyright-1.1.370-py3-none-any.whl", hash = "sha256:fc721601e480a69989775bfc210534a6ca0110ebd0c065244a8d3a151294fc61"}, + {file = "pyright-1.1.370.tar.gz", hash = "sha256:d0d559d506fc41e3297f721aaa05a1b9f06beda5acc9ac64ca371ce94c28f960"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index e4c84f624..dc7cb7877 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -215,6 +215,7 @@ exclude = [ pythonVersion = "3.9" reportOptionalMemberAccess = "none" reportIncompatibleVariableOverride = "none" # see thread: https://github.com/microsoft/pyright/issues/5933 +enableExperimentalFeatures = true # https://github.com/microsoft/pyright/issues/7713 [tool.pytest_env] OPENAI_API_KEY = {value = "api-key", skip_if_set = true} From c16f3f4ab9ea1e63bbb9229429970c5ca1f1162b Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 3 Jul 2024 16:06:58 -0500 Subject: [PATCH 139/238] Fix changelog (#938) --- CHANGELOG.md | 50 ++++++++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91c8fe89f..b96e0a724 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,33 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased -### Added -- `Message` for storing messages in a `PromptStack`. Messages consist of a role, content, and usage. -- `DeltaMessage` for storing partial messages in a `PromptStack`. Multiple `DeltaMessage` can be combined to form a `Message`. -- `TextMessageContent` for storing textual content in a `Message`. -- `ImageMessageContent` for storing image content in a `Message`. -- Support for adding `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s to `PromptStack`. -- Support for image inputs to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AmazonBedrockPromptDriver`, `AnthropicPromptDriver`, and `GooglePromptDriver`. -- Input/output token usage metrics to all Prompt Drivers. -- `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. -- Support for storing Artifacts as inputs/outputs in Conversation Memory Runs. -- `Agent.input` for passing Artifacts as input. -- Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. - -### Changed -- **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. -- **BREAKING**: Renamed `PromptStack.inputs` to `PromptStack.messages`. -- **BREAKING**: Moved `PromptStack.USER_ROLE`, `PromptStack.ASSISTANT_ROLE`, and `PromptStack.SYSTEM_ROLE` to `Message`. -- **BREAKING**: Updated return type of `PromptDriver.try_run` from `TextArtifact` to `Message`. -- **BREAKING**: Updated return type of `PromptDriver.try_stream` from `Iterator[TextArtifact]` to `Iterator[DeltaMessage]`. -- **BREAKING**: Removed `BasePromptEvent.token_count` in favor of `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. -- **BREAKING**: Removed `StartPromptEvent.prompt`. Use `StartPromptEvent.prompt_stack` instead. -- **BREAKING**: Removed `Agent.input_template` in favor of `Agent.input`. -- **BREAKING**: `BasePromptDriver.run` now returns a `Message` instead of a `TextArtifact`. For compatibility, `Message.value` contains the Message's Artifact value -- Default Prompt Driver model in `GoogleStructureConfig` to `gemini-1.5-pro`. - - - ### Added - `RagEngine` is an abstraction for implementing modular RAG pipelines. - `RagContext` is a container object for passing around RAG context. @@ -67,8 +40,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parameter `fail_fast` to `Structure`. - `BooleanArtifact` for handling boolean values. - `typos` to dev dependencies to catch typos in code/docs. +- `Message` for storing messages in a `PromptStack`. Messages consist of a role, content, and usage. +- `DeltaMessage` for storing partial messages in a `PromptStack`. Multiple `DeltaMessage` can be combined to form a `Message`. +- `TextMessageContent` for storing textual content in a `Message`. +- `ImageMessageContent` for storing image content in a `Message`. +- Support for adding `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s to `PromptStack`. +- Support for image inputs to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AmazonBedrockPromptDriver`, `AnthropicPromptDriver`, and `GooglePromptDriver`. +- Input/output token usage metrics to all Prompt Drivers. +- `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. +- Support for storing Artifacts as inputs/outputs in Conversation Memory Runs. +- `Agent.input` for passing Artifacts as input. +- Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. ### Changed +- **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. +- **BREAKING**: Renamed `PromptStack.inputs` to `PromptStack.messages`. +- **BREAKING**: Moved `PromptStack.USER_ROLE`, `PromptStack.ASSISTANT_ROLE`, and `PromptStack.SYSTEM_ROLE` to `Message`. +- **BREAKING**: Updated return type of `PromptDriver.try_run` from `TextArtifact` to `Message`. +- **BREAKING**: Updated return type of `PromptDriver.try_stream` from `Iterator[TextArtifact]` to `Iterator[DeltaMessage]`. +- **BREAKING**: Removed `BasePromptEvent.token_count` in favor of `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. +- **BREAKING**: Removed `StartPromptEvent.prompt`. Use `StartPromptEvent.prompt_stack` instead. +- **BREAKING**: Removed `Agent.input_template` in favor of `Agent.input`. +- **BREAKING**: `BasePromptDriver.run` now returns a `Message` instead of a `TextArtifact`. For compatibility, `Message.value` contains the Message's Artifact value - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. - **BREAKING**: Removed `VectorQueryEngine` in favor of `RagEngine`. - **BREAKING**: Removed `TextQueryTask` in favor of `RagTask`. @@ -78,8 +71,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. - **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. - **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. -- `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. - **BREAKING**: All `futures_executor` fields renamed to `futures_executor_fn` and now accept callables instead of futures; wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. +- `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. +- Default Prompt Driver model in `GoogleStructureConfig` to `gemini-1.5-pro`. ### Fixed - `CoherePromptDriver` to properly handle empty history. From c785aba5d11f4dc375f1bcb638affc0337d5f523 Mon Sep 17 00:00:00 2001 From: datashaman Date: Fri, 5 Jul 2024 18:40:18 +0200 Subject: [PATCH 140/238] DynamoDB sort key (#917) --- CHANGELOG.md | 1 + .../drivers/conversation-memory-drivers.md | 1 + ...zon_dynamodb_conversation_memory_driver.py | 14 ++++- ...est_dynamodb_conversation_memory_driver.py | 53 +++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b96e0a724..c02f822ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support for storing Artifacts as inputs/outputs in Conversation Memory Runs. - `Agent.input` for passing Artifacts as input. - Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. +- Parameters `sort_key` and `sort_key_value` on `AmazonDynamoDbConversationMemoryDriver` for tables with sort keys. ### Changed - **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index 4e437a3f5..88063292f 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -47,6 +47,7 @@ agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) agent.run("My name is Jeff.") agent.run("What is my name?") ``` +Optional parameters `sort_key` and `sort_key_value` can be supplied for tables with a composite primary key. ### Redis diff --git a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py index 87c3667fe..36f62c0e5 100644 --- a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py @@ -16,6 +16,8 @@ class AmazonDynamoDbConversationMemoryDriver(BaseConversationMemoryDriver): partition_key: str = field(kw_only=True, metadata={"serializable": True}) value_attribute_key: str = field(kw_only=True, metadata={"serializable": True}) partition_key_value: str = field(kw_only=True, metadata={"serializable": True}) + sort_key: Optional[str] = field(default=None, metadata={"serializable": True}) + sort_key_value: Optional[str | int] = field(default=None, metadata={"serializable": True}) table: Any = field(init=False) @@ -26,14 +28,14 @@ def __attrs_post_init__(self) -> None: def store(self, memory: BaseConversationMemory) -> None: self.table.update_item( - Key={self.partition_key: self.partition_key_value}, + Key=self._get_key(), UpdateExpression="set #attr = :value", ExpressionAttributeNames={"#attr": self.value_attribute_key}, ExpressionAttributeValues={":value": memory.to_json()}, ) def load(self) -> Optional[BaseConversationMemory]: - response = self.table.get_item(Key={self.partition_key: self.partition_key_value}) + response = self.table.get_item(Key=self._get_key()) if "Item" in response and self.value_attribute_key in response["Item"]: memory_value = response["Item"][self.value_attribute_key] @@ -45,3 +47,11 @@ def load(self) -> Optional[BaseConversationMemory]: return memory else: return None + + def _get_key(self) -> dict[str, str | int]: + key: dict[str, str | int] = {self.partition_key: self.partition_key_value} + + if self.sort_key is not None and self.sort_key_value is not None: + key[self.sort_key] = self.sort_key_value + + return key diff --git a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py index 80d77d24d..df0ca4d3c 100644 --- a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py @@ -60,6 +60,33 @@ def test_store(self): response = table.get_item(TableName=self.DYNAMODB_TABLE_NAME, Key={"entryId": "bar"}) assert "Item" in response + def test_store_with_sort_key(self): + session = boto3.Session(region_name=self.AWS_REGION) + dynamodb = session.resource("dynamodb") + table = dynamodb.Table(self.DYNAMODB_TABLE_NAME) + prompt_driver = MockPromptDriver() + memory_driver = AmazonDynamoDbConversationMemoryDriver( + session=session, + table_name=self.DYNAMODB_TABLE_NAME, + partition_key=self.DYNAMODB_PARTITION_KEY, + value_attribute_key=self.VALUE_ATTRIBUTE_KEY, + partition_key_value=self.PARTITION_KEY_VALUE, + sort_key="sortKey", + sort_key_value="foo" + ) + memory = ConversationMemory(driver=memory_driver) + pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + + pipeline.add_task(PromptTask("test")) + + response = table.get_item(TableName=self.DYNAMODB_TABLE_NAME, Key={"entryId": "bar", "sortKey": "foo"}) + assert "Item" not in response + + pipeline.run() + + response = table.get_item(TableName=self.DYNAMODB_TABLE_NAME, Key={"entryId": "bar", "sortKey": "foo"}) + assert "Item" in response + def test_load(self): prompt_driver = MockPromptDriver() memory_driver = AmazonDynamoDbConversationMemoryDriver( @@ -83,3 +110,29 @@ def test_load(self): assert len(new_memory.runs) == 2 assert new_memory.runs[0].input.value == "test" assert new_memory.runs[0].output.value == "mock output" + + def test_load_with_sort_key(self): + prompt_driver = MockPromptDriver() + memory_driver = AmazonDynamoDbConversationMemoryDriver( + session=boto3.Session(region_name=self.AWS_REGION), + table_name=self.DYNAMODB_TABLE_NAME, + partition_key=self.DYNAMODB_PARTITION_KEY, + value_attribute_key=self.VALUE_ATTRIBUTE_KEY, + partition_key_value=self.PARTITION_KEY_VALUE, + sort_key="sortKey", + sort_key_value="foo" + ) + memory = ConversationMemory(driver=memory_driver) + pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) + + pipeline.add_task(PromptTask("test")) + + pipeline.run() + pipeline.run() + + new_memory = memory_driver.load() + + assert new_memory.type == "ConversationMemory" + assert len(new_memory.runs) == 2 + assert new_memory.runs[0].input.value == "test" + assert new_memory.runs[0].output.value == "mock output" \ No newline at end of file From 3e5bd038c351ca369d41c87740fa300b212564ce Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 5 Jul 2024 14:27:14 -0500 Subject: [PATCH 141/238] Update ruff linter rules according to documentation (#940) --- griptape/artifacts/base_artifact.py | 5 +- griptape/chunkers/base_chunker.py | 5 +- .../amazon_s3_file_manager_driver.py | 2 +- .../file_manager/base_file_manager_driver.py | 7 +- .../amazon_bedrock_image_generation_driver.py | 2 +- .../amazon_bedrock_image_query_driver.py | 2 +- .../drivers/prompt/anthropic_prompt_driver.py | 5 +- griptape/drivers/prompt/base_prompt_driver.py | 5 +- .../drivers/prompt/cohere_prompt_driver.py | 5 +- .../vector/base_vector_store_driver.py | 5 +- .../mongodb_atlas_vector_store_driver.py | 5 +- .../markdownify_web_scraper_driver.py | 67 +++++++++---------- .../duck_duck_go_web_search_driver.py | 2 +- griptape/loaders/base_text_loader.py | 5 +- griptape/loaders/sql_loader.py | 5 +- griptape/mixins/rule_mixin.py | 5 +- griptape/mixins/serializable_mixin.py | 2 +- griptape/schemas/polymorphic_schema.py | 8 +-- griptape/structures/structure.py | 12 +--- griptape/structures/workflow.py | 4 +- griptape/tasks/actions_subtask.py | 14 ++-- griptape/tasks/base_task.py | 2 +- griptape/tasks/prompt_task.py | 2 +- griptape/tokenizers/base_tokenizer.py | 3 +- griptape/utils/chat.py | 9 ++- griptape/utils/dict_utils.py | 2 +- griptape/utils/import_utils.py | 4 +- griptape/utils/load_artifact_from_memory.py | 4 +- pyproject.toml | 17 ++++- tests/utils/code_blocks.py | 3 +- 30 files changed, 98 insertions(+), 120 deletions(-) diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index a7a1811ea..ced8e0e1c 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -24,10 +24,7 @@ def value_to_bytes(cls, value: Any) -> bytes: @classmethod def value_to_dict(cls, value: Any) -> dict: - if isinstance(value, dict): - dict_value = value - else: - dict_value = json.loads(value) + dict_value = value if isinstance(value, dict) else json.loads(value) return {k: v for k, v in dict_value.items()} diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index 793bf24ad..26199a16c 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -58,10 +58,7 @@ def _chunk_recursively(self, chunk: str, current_separator: Optional[ChunkSepara # Iterate through the subchunks and calculate token counts. for index, subchunk in enumerate(subchunks): if index < len(subchunks): - if separator.is_prefix: - subchunk = separator.value + subchunk - else: - subchunk = subchunk + separator.value + subchunk = separator.value + subchunk if separator.is_prefix else subchunk + separator.value tokens_count += self.tokenizer.count_tokens(subchunk) diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index bdb4d787c..e2d794f31 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -55,7 +55,7 @@ def try_load_file(self, path: str) -> bytes: return response["Body"].read() except botocore.exceptions.ClientError as e: if e.response["Error"]["Code"] in {"NoSuchKey", "404"}: - raise FileNotFoundError + raise FileNotFoundError from e else: raise e diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 562d8be4c..9b8fe8325 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -82,11 +82,8 @@ def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifa encoding = None if loader is None else loader.encoding if isinstance(value, str): - if encoding is None: - value = value.encode() - else: - value = value.encode(encoding=encoding) - elif isinstance(value, bytearray) or isinstance(value, memoryview): + value = value.encode() if encoding is None else value.encode(encoding=encoding) + elif isinstance(value, (bytearray, memoryview)): raise ValueError(f"Unsupported type: {type(value)}") self.try_save_file(path, value) diff --git a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py index 2edb9f862..b5a4b7e3b 100644 --- a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py +++ b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py @@ -122,6 +122,6 @@ def _make_request(self, request: dict) -> bytes: try: image_bytes = self.image_generation_model_driver.get_generated_image(response_body) except Exception as e: - raise ValueError(f"Inpainting generation failed: {e}") + raise ValueError(f"Inpainting generation failed: {e}") from e return image_bytes diff --git a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py index eabe9d27e..e91cbbedc 100644 --- a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py +++ b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py @@ -32,4 +32,4 @@ def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: try: return self.image_query_model_driver.process_output(response_body) except Exception as e: - raise ValueError(f"Output is unable to be processed as returned {e}") + raise ValueError(f"Output is unable to be processed as returned {e}") from e diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 1dd7bb7f9..2c338c84c 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -77,10 +77,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: ) system_messages = prompt_stack.system_messages - if system_messages: - system_message = system_messages[0].to_text() - else: - system_message = None + system_message = system_messages[0].to_text() if system_messages else None return { "model": self.model, diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index f42e57081..b499179ed 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -65,10 +65,7 @@ def run(self, prompt_stack: PromptStack) -> Message: with attempt: self.before_run(prompt_stack) - if self.stream: - result = self.__process_stream(prompt_stack) - else: - result = self.__process_run(prompt_stack) + result = self.__process_stream(prompt_stack) if self.stream else self.__process_run(prompt_stack) self.after_run(result) diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 331c2c039..b00abd855 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -79,10 +79,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: ) system_messages = prompt_stack.system_messages - if system_messages: - preamble = system_messages[0].to_text() - else: - preamble = None + preamble = system_messages[0].to_text() if system_messages else None return { "message": user_message, diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 5a4130a88..72ed2c322 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -64,10 +64,7 @@ def upsert_text_artifact( else: meta["artifact"] = artifact.to_json() - if artifact.embedding: - vector = artifact.embedding - else: - vector = artifact.generate_embedding(self.embedding_driver) + vector = artifact.embedding if artifact.embedding else artifact.generate_embedding(self.embedding_driver) if isinstance(vector, list): return self.upsert_vector(vector, vector_id=vector_id, namespace=namespace, meta=meta, **kwargs) diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index 73bcc02c7..e60524714 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -90,10 +90,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD Entries can optionally be filtered by namespace. """ collection = self.get_collection() - if namespace is None: - cursor = collection.find() - else: - cursor = collection.find({"namespace": namespace}) + cursor = collection.find() if namespace is None else collection.find({"namespace": namespace}) return [ BaseVectorStoreDriver.Entry( diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index eb33aeb19..28f225ba8 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -48,51 +48,50 @@ def convert_a(self, el, text, convert_as_inline): return super().convert_a(el, text, convert_as_inline) return text - with sync_playwright() as p: - with p.chromium.launch(headless=True) as browser: - page = browser.new_page() + with sync_playwright() as p, p.chromium.launch(headless=True) as browser: + page = browser.new_page() - def skip_loading_images(route): - if route.request.resource_type == "image": - return route.abort() - route.continue_() + def skip_loading_images(route): + if route.request.resource_type == "image": + return route.abort() + route.continue_() - page.route("**/*", skip_loading_images) + page.route("**/*", skip_loading_images) - page.goto(url) + page.goto(url) - # Some websites require a delay before the content is fully loaded - # even after the browser has emitted "load" event. - if self.timeout: - page.wait_for_timeout(self.timeout) + # Some websites require a delay before the content is fully loaded + # even after the browser has emitted "load" event. + if self.timeout: + page.wait_for_timeout(self.timeout) - content = page.content() + content = page.content() - if not content: - raise Exception("can't access URL") + if not content: + raise Exception("can't access URL") - soup = BeautifulSoup(content, "html.parser") + soup = BeautifulSoup(content, "html.parser") - # Remove unwanted elements - exclude_selector = ",".join( - self.exclude_tags + [f".{c}" for c in self.exclude_classes] + [f"#{i}" for i in self.exclude_ids] - ) - if exclude_selector: - for s in soup.select(exclude_selector): - s.extract() + # Remove unwanted elements + exclude_selector = ",".join( + self.exclude_tags + [f".{c}" for c in self.exclude_classes] + [f"#{i}" for i in self.exclude_ids] + ) + if exclude_selector: + for s in soup.select(exclude_selector): + s.extract() - text = OptionalLinksMarkdownConverter().convert_soup(soup) + text = OptionalLinksMarkdownConverter().convert_soup(soup) - # Remove leading and trailing whitespace from the entire text - text = text.strip() + # Remove leading and trailing whitespace from the entire text + text = text.strip() - # Remove trailing whitespace from each line - text = re.sub(r"[ \t]+$", "", text, flags=re.MULTILINE) + # Remove trailing whitespace from each line + text = re.sub(r"[ \t]+$", "", text, flags=re.MULTILINE) - # Indent using 2 spaces instead of tabs - text = re.sub(r"(\n?\s*?)\t", r"\1 ", text) + # Indent using 2 spaces instead of tabs + text = re.sub(r"(\n?\s*?)\t", r"\1 ", text) - # Remove triple+ newlines (keep double newlines for paragraphs) - text = re.sub(r"\n\n+", "\n\n", text) + # Remove triple+ newlines (keep double newlines for paragraphs) + text = re.sub(r"\n\n+", "\n\n", text) - return TextArtifact(text) + return TextArtifact(text) diff --git a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py index 9b90bf5ff..ade6ed85c 100644 --- a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py +++ b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py @@ -26,4 +26,4 @@ def search(self, query: str, **kwargs) -> ListArtifact: ] ) except Exception as e: - raise Exception(f"Error searching '{query}' with DuckDuckGo: {e}") + raise Exception(f"Error searching '{query}' with DuckDuckGo: {e}") from e diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index f09b57902..c2840d62f 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -41,10 +41,7 @@ def load_collection(self, sources: list[Any], *args, **kwargs) -> dict[str, Erro def _text_to_artifacts(self, text: str) -> list[TextArtifact]: artifacts = [] - if self.chunker: - chunks = self.chunker.chunk(text) - else: - chunks = [TextArtifact(text)] + chunks = self.chunker.chunk(text) if self.chunker else [TextArtifact(text)] if self.embedding_driver: for chunk in chunks: diff --git a/griptape/loaders/sql_loader.py b/griptape/loaders/sql_loader.py index c20fb022d..e6979e324 100644 --- a/griptape/loaders/sql_loader.py +++ b/griptape/loaders/sql_loader.py @@ -16,10 +16,7 @@ def load(self, source: str, *args, **kwargs) -> list[CsvRowArtifact]: rows = self.sql_driver.execute_query(source) artifacts = [] - if rows: - chunks = [CsvRowArtifact(row.cells) for row in rows] - else: - chunks = [] + chunks = [CsvRowArtifact(row.cells) for row in rows] if rows else [] if self.embedding_driver: for chunk in chunks: diff --git a/griptape/mixins/rule_mixin.py b/griptape/mixins/rule_mixin.py index a89309a15..0cc696242 100644 --- a/griptape/mixins/rule_mixin.py +++ b/griptape/mixins/rule_mixin.py @@ -49,10 +49,7 @@ def all_rulesets(self) -> list[Ruleset]: if self.rulesets: task_rulesets = self.rulesets elif self.rules: - if structure_rulesets: - task_ruleset_name = self.ADDITIONAL_RULESET_NAME - else: - task_ruleset_name = self.DEFAULT_RULESET_NAME + task_ruleset_name = self.ADDITIONAL_RULESET_NAME if structure_rulesets else self.DEFAULT_RULESET_NAME task_rulesets = [Ruleset(name=task_ruleset_name, rules=self.rules)] diff --git a/griptape/mixins/serializable_mixin.py b/griptape/mixins/serializable_mixin.py index c7a0bf035..667ae752d 100644 --- a/griptape/mixins/serializable_mixin.py +++ b/griptape/mixins/serializable_mixin.py @@ -42,7 +42,7 @@ def get_schema(cls: type[T], subclass_name: Optional[str] = None) -> Schema: @classmethod def from_dict(cls: type[T], data: dict) -> T: - return cast(T, cls.get_schema(subclass_name=data["type"] if "type" in data else None).load(data)) + return cast(T, cls.get_schema(subclass_name=data.get("type")).load(data)) @classmethod def from_json(cls: type[T], data: str) -> T: diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index 534ba8ffc..452e3001f 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -58,12 +58,12 @@ def _dump(self, obj, *, update_fields=True, **kwargs): obj_type = self.get_obj_type(obj) if not obj_type: - return (None, {"_schema": "Unknown object class: %s" % obj.__class__.__name__}) + return (None, {"_schema": f"Unknown object class: {obj.__class__.__name__}"}) type_schema = BaseSchema.from_attrs_cls(obj.__class__) if not type_schema: - return None, {"_schema": "Unsupported object type: %s" % obj_type} + return None, {"_schema": f"Unsupported object type: {obj_type}"} schema = type_schema if isinstance(type_schema, Schema) else type_schema() @@ -110,7 +110,7 @@ def load(self, data, *, many=None, partial=None, unknown=None, **kwargs): def _load(self, data, *, partial=None, unknown=None, **kwargs): if not isinstance(data, dict): - raise ValidationError({"_schema": "Invalid data type: %s" % data}) + raise ValidationError({"_schema": f"Invalid data type: {data}"}) data = dict(data) unknown = unknown or self.unknown @@ -121,7 +121,7 @@ def _load(self, data, *, partial=None, unknown=None, **kwargs): type_schema = self.inner_class.get_schema(data_type) if not type_schema: - raise ValidationError({self.type_field: ["Unsupported value: %s" % data_type]}) + raise ValidationError({self.type_field: [f"Unsupported value: {data_type}"]}) schema = type_schema if isinstance(type_schema, Schema) else type_schema() diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 18e7d1284..c7b779590 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -147,15 +147,9 @@ def default_config(self) -> BaseStructureConfig: if self.prompt_driver is not None or self.embedding_driver is not None or self.stream is not None: config = StructureConfig() - if self.prompt_driver is None: - prompt_driver = OpenAiChatPromptDriver(model="gpt-4o") - else: - prompt_driver = self.prompt_driver - - if self.embedding_driver is None: - embedding_driver = OpenAiEmbeddingDriver() - else: - embedding_driver = self.embedding_driver + prompt_driver = OpenAiChatPromptDriver(model="gpt-4o") if self.prompt_driver is None else self.prompt_driver + + embedding_driver = OpenAiEmbeddingDriver() if self.embedding_driver is None else self.embedding_driver if self.stream is not None: prompt_driver.stream = self.stream diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 3689f7330..f7bc2e893 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -89,8 +89,8 @@ def insert_task( try: parent_index = self.tasks.index(parent_task) - except ValueError: - raise ValueError(f"Parent task {parent_task.id} not found in workflow.") + except ValueError as exc: + raise ValueError(f"Parent task {parent_task.id} not found in workflow.") from exc else: if parent_index > last_parent_index: last_parent_index = parent_index diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index fa2aff822..c835f2b84 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -112,11 +112,10 @@ def run(self) -> BaseArtifact: self.structure.logger.error(f"Subtask {self.id}\n{e}", exc_info=True) self.output = ErrorArtifact(str(e), exception=e) - finally: - if self.output is not None: - return self.output - else: - return ErrorArtifact("no tool output") + if self.output is not None: + return self.output + else: + return ErrorArtifact("no tool output") def execute_actions(self, actions: list[Action]) -> list[tuple[str, BaseArtifact]]: with self.futures_executor_fn() as executor: @@ -234,9 +233,8 @@ def __parse_actions(self, actions_matches: list[str]) -> None: tag=action_tag, name=action_name, path=action_path, input=action_input, tool=tool ) - if new_action.tool: - if new_action.input: - self.__validate_action(new_action) + if new_action.tool and new_action.input: + self.__validate_action(new_action) # Don't forget to add it to the subtask actions list! self.actions.append(new_action) diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index be5ff94d8..9aa891e18 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -144,7 +144,7 @@ def execute(self) -> Optional[BaseArtifact]: finally: self.state = BaseTask.State.FINISHED - return self.output + return self.output def can_execute(self) -> bool: return self.state == BaseTask.State.PENDING and all(parent.is_finished() for parent in self.parents) diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index dba542d60..955855e3d 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -102,7 +102,7 @@ def _process_task_input( return self._process_task_input(task_input(self)) elif isinstance(task_input, BaseArtifact): return task_input - elif isinstance(task_input, list) or isinstance(task_input, tuple): + elif isinstance(task_input, (list, tuple)): return ListArtifact([self._process_task_input(elem) for elem in task_input]) else: return self._process_task_input(TextArtifact(task_input)) diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 474ccbaa5..212e40058 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations import logging -from abc import ABC +from abc import ABC, abstractmethod from attrs import define, field, Factory @@ -40,6 +40,7 @@ def count_output_tokens_left(self, text: str) -> int: else: return 0 + @abstractmethod def count_tokens(self, text: str) -> int: ... def _default_max_input_tokens(self) -> int: diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index 12653ce9e..f78d311f9 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -1,6 +1,9 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Callable + +from typing import TYPE_CHECKING, Callable, Optional + from attrs import Factory, define, field + from griptape.utils.stream import Stream if TYPE_CHECKING: @@ -22,9 +25,9 @@ class Chat: def default_output_fn(self, text: str) -> None: if self.structure.config.prompt_driver.stream: - print(text, end="", flush=True) + print(text, end="", flush=True) # noqa T201 else: - print(text) + print(text) # noqa T201 def start(self) -> None: if self.intro_text: diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index 64a91d68b..c5f6bb676 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -30,7 +30,7 @@ def dict_merge(dct: dict, merge_dct: dict, add_keys: bool = True) -> dict: if not add_keys: merge_dct = {k: merge_dct[k] for k in set(dct).intersection(set(merge_dct))} - for key in merge_dct.keys(): + for key in merge_dct: if key in dct and isinstance(dct[key], dict): dct[key] = dict_merge(dct[key], merge_dct[key], add_keys=add_keys) else: diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index 5e00551f8..0de09b2d1 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -32,8 +32,8 @@ def import_optional_dependency(name: str) -> Optional[ModuleType]: ) try: module = import_module(name) - except ImportError: - raise ImportError(msg) + except ImportError as exc: + raise ImportError(msg) from exc return module diff --git a/griptape/utils/load_artifact_from_memory.py b/griptape/utils/load_artifact_from_memory.py index 6ab823130..af11b8ae8 100644 --- a/griptape/utils/load_artifact_from_memory.py +++ b/griptape/utils/load_artifact_from_memory.py @@ -14,8 +14,8 @@ def load_artifact_from_memory( try: artifact = [a for a in artifacts if a.name == artifact_name][0] - except IndexError: - raise ValueError(f"artifact {artifact_name} not found in namespace {artifact_namespace}") + except IndexError as exc: + raise ValueError(f"artifact {artifact_name} not found in namespace {artifact_namespace}") from exc if not isinstance(artifact, artifact_type): raise ValueError(f"{artifact.name} is not of type {artifact_type}") diff --git a/pyproject.toml b/pyproject.toml index dc7cb7877..c1b6b934c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -200,7 +200,22 @@ line-length = 120 skip-magic-trailing-comma = true [tool.ruff.lint] -select = ["E4", "E7", "E9", "F", "TID251"] +select = [ + "E", # pycodestyle + "F", # Pyflakes + "UP", # pyupgrade + "B", # flake8-bugbear + "SIM", # flake8-simplify + "TID251", # banned-api + "T201", # print +] +ignore = [ + "UP007", # non-pep604-annotation + "E501", # line-too-long + "B024", # abstract-base-class-without-abstract-method + "B009", # get-attr-with-constant + "B010", # set-attr-with-constant +] [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." diff --git a/tests/utils/code_blocks.py b/tests/utils/code_blocks.py index 09a4695ba..9cfebb987 100644 --- a/tests/utils/code_blocks.py +++ b/tests/utils/code_blocks.py @@ -1,3 +1,4 @@ +import logging import pathlib import textwrap @@ -13,7 +14,7 @@ def check_py_string(source: str) -> None: try: exec(source, {"__MODULE__": "__main__"}) except Exception: - print(source) + logging.info(source) raise From 731c3bb46272d338fdd2bb8c9ec2b247d3f076f6 Mon Sep 17 00:00:00 2001 From: Vasily Vasinov Date: Mon, 8 Jul 2024 14:07:27 -0600 Subject: [PATCH 142/238] `FootnotePromptResponseRagModule`, `TextLoaderRetrievalRagModule`, and more (#942) --- CHANGELOG.md | 3 ++ .../griptape-framework/engines/rag-engines.md | 4 +- griptape/artifacts/base_artifact.py | 9 +++- griptape/artifacts/boolean_artifact.py | 3 +- griptape/artifacts/text_artifact.py | 3 +- griptape/common/__init__.py | 3 ++ .../contents/base_message_content.py | 9 ++-- griptape/common/reference.py | 14 +++++ .../drivers/rerank/cohere_rerank_driver.py | 5 +- .../vector/base_vector_store_driver.py | 26 +++++---- griptape/engines/rag/modules/__init__.py | 4 ++ .../engines/rag/modules/base_rag_module.py | 8 +-- .../footnote_prompt_response_rag_module.py | 18 +++++++ .../response/prompt_response_rag_module.py | 53 ++++++++----------- .../text_loader_retrieval_rag_module.py | 41 ++++++++++++++ .../vector_store_retrieval_rag_module.py | 4 +- griptape/engines/rag/rag_context.py | 30 +++++++---- griptape/loaders/base_text_loader.py | 18 ++++--- .../task/storage/text_artifact_storage.py | 2 +- griptape/schemas/base_schema.py | 7 ++- .../response/footnote_prompt/system.j2 | 37 +++++++++++++ .../rag/modules/response/prompt/system.j2 | 5 +- griptape/utils/__init__.py | 2 + griptape/utils/dict_utils.py | 9 +++- griptape/utils/reference_utils.py | 12 +++++ tests/mocks/mock_serializable.py | 5 ++ ...est_dynamodb_conversation_memory_driver.py | 6 +-- .../rerank/test_cohere_rerank_driver.py | 11 +++- ...est_in_memory_local_vector_store_driver.py | 10 ---- .../vector/test_local_vector_store_driver.py | 23 ++++++++ ...est_footnote_prompt_response_rag_module.py | 33 ++++++++++++ ...est_metadata_before_response_rag_module.py | 6 ++- .../test_prompt_response_rag_module.py | 6 +-- .../test_text_chunks_rerank_rag_module.py | 14 +++-- .../test_text_loader_retrieval_rag_module.py | 26 +++++++++ .../test_vector_store_retrieval_rag_module.py | 9 ++-- .../rag/modules/test_base_rag_nodule.py | 4 +- tests/unit/engines/rag/test_rag_context.py | 23 ++++++++ tests/unit/mixins/test_seriliazable_mixin.py | 17 ++++-- tests/unit/utils/test_dict_utils.py | 21 ++++++-- tests/utils/test_reference_utils.py | 22 ++++++++ 41 files changed, 450 insertions(+), 115 deletions(-) create mode 100644 griptape/common/reference.py create mode 100644 griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py create mode 100644 griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py create mode 100644 griptape/templates/engines/rag/modules/response/footnote_prompt/system.j2 create mode 100644 griptape/utils/reference_utils.py delete mode 100644 tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py create mode 100644 tests/unit/drivers/vector/test_local_vector_store_driver.py create mode 100644 tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py create mode 100644 tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py create mode 100644 tests/unit/engines/rag/test_rag_context.py create mode 100644 tests/utils/test_reference_utils.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c02f822ec..65634a8e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,12 +15,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - RAG modules: - Retrieval: - `VectorStoreRetrievalRagModule` for retrieving text chunks from vector stores. + - `TextLoaderRetrievalRagModule` for retrieving data with text loaders in real time. - `TextChunksRerankRagModule` for re-ranking retrieved results. - Response: - `MetadataBeforeResponseRagModule` for appending metadata. - `RulesetsBeforeResponseRagModule` for appending rulesets. - `PromptResponseRagModule` for generating responses based on retrieved text chunks. - `TextChunksResponseRagModule` for responding with retrieved text chunks. + - `FootnotePromptResponseRagModule` for responding with automatic footnotes from text chunk references. - `RagClient` tool for exposing `RagEngines` to LLM agents. - `RagTask` task for including `RagEngines` in any structure. - Rerank drivers: @@ -52,6 +54,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Agent.input` for passing Artifacts as input. - Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. - Parameters `sort_key` and `sort_key_value` on `AmazonDynamoDbConversationMemoryDriver` for tables with sort keys. +- `Reference` for supporting artifact citations in loaders and RAG engine modules. ### Changed - **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. diff --git a/docs/griptape-framework/engines/rag-engines.md b/docs/griptape-framework/engines/rag-engines.md index c03bf0f47..9d71aaa80 100644 --- a/docs/griptape-framework/engines/rag-engines.md +++ b/docs/griptape-framework/engines/rag-engines.md @@ -20,13 +20,15 @@ No modules implemented yet. #### Retrieval - `TextRetrievalRagModule` is for retrieving text chunks. +- `TextLoaderRetrievalRagModule` is for retrieving data with text loaders in real time. - `TextChunksRerankRagModule` is for re-ranking retrieved results. #### Response - `MetadataBeforeResponseRagModule` is for appending metadata. - `RulesetsBeforeResponseRagModule` is for appending rulesets. - `PromptResponseRagModule` is for generating responses based on retrieved text chunks. -- `TextChunksResponseRagModule` for responding with retrieved text chunks. +- `TextChunksResponseRagModule` is for responding with retrieved text chunks. +- `FootnotePromptResponseRagModule` is for responding with automatic footnotes from text chunk references. ### Example diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index ced8e0e1c..626e13f69 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -1,15 +1,20 @@ from __future__ import annotations from griptape.mixins import SerializableMixin -from typing import Any +from typing import Any, TYPE_CHECKING, Optional import json import uuid from abc import ABC, abstractmethod from attrs import define, field, Factory +if TYPE_CHECKING: + from griptape.common import Reference -@define() + +@define class BaseArtifact(SerializableMixin, ABC): id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True, metadata={"serializable": True}) + reference: Optional[Reference] = field(default=None, kw_only=True, metadata={"serializable": True}) + meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) name: str = field( default=Factory(lambda self: self.id, takes_self=True), kw_only=True, metadata={"serializable": True} ) diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py index a7a84da18..e7e440f45 100644 --- a/griptape/artifacts/boolean_artifact.py +++ b/griptape/artifacts/boolean_artifact.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Any, Union +from typing import Union from attrs import define, field from griptape.artifacts import BaseArtifact @@ -7,7 +7,6 @@ @define class BooleanArtifact(BaseArtifact): value: bool = field(converter=bool, metadata={"serializable": True}) - meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) @classmethod def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: diff --git a/griptape/artifacts/text_artifact.py b/griptape/artifacts/text_artifact.py index 8b83303f0..e8a2bb2a7 100644 --- a/griptape/artifacts/text_artifact.py +++ b/griptape/artifacts/text_artifact.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.artifacts import BaseArtifact @@ -13,7 +13,6 @@ class TextArtifact(BaseArtifact): value: str = field(converter=str, metadata={"serializable": True}) encoding: str = field(default="utf-8", kw_only=True) encoding_error_handler: str = field(default="strict", kw_only=True) - meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) _embedding: list[float] = field(factory=list, kw_only=True) @property diff --git a/griptape/common/__init__.py b/griptape/common/__init__.py index 2b1189472..6e357323a 100644 --- a/griptape/common/__init__.py +++ b/griptape/common/__init__.py @@ -10,6 +10,8 @@ from .prompt_stack.prompt_stack import PromptStack +from .reference import Reference + __all__ = [ "BaseMessage", "BaseDeltaMessageContent", @@ -20,4 +22,5 @@ "TextMessageContent", "ImageMessageContent", "PromptStack", + "Reference", ] diff --git a/griptape/common/prompt_stack/contents/base_message_content.py b/griptape/common/prompt_stack/contents/base_message_content.py index cd4d5bd92..28a9e317e 100644 --- a/griptape/common/prompt_stack/contents/base_message_content.py +++ b/griptape/common/prompt_stack/contents/base_message_content.py @@ -1,15 +1,14 @@ from __future__ import annotations - from abc import ABC from collections.abc import Sequence - +from typing import TYPE_CHECKING from attrs import define, field - -from griptape.artifacts.base_artifact import BaseArtifact from griptape.mixins import SerializableMixin - from .base_delta_message_content import BaseDeltaMessageContent +if TYPE_CHECKING: + from griptape.artifacts.base_artifact import BaseArtifact + @define class BaseMessageContent(ABC, SerializableMixin): diff --git a/griptape/common/reference.py b/griptape/common/reference.py new file mode 100644 index 000000000..d92c203f9 --- /dev/null +++ b/griptape/common/reference.py @@ -0,0 +1,14 @@ +import uuid +from typing import Optional +from attrs import define, field, Factory +from griptape.mixins import SerializableMixin + + +@define(kw_only=True) +class Reference(SerializableMixin): + id: str = field(default=Factory(lambda: uuid.uuid4().hex), metadata={"serializable": True}) + title: str = field(metadata={"serializable": True}) + authors: list[str] = field(factory=list, metadata={"serializable": True}) + source: Optional[str] = field(default=None, metadata={"serializable": True}) + year: Optional[str] = field(default=None, metadata={"serializable": True}) + url: Optional[str] = field(default=None, metadata={"serializable": True}) diff --git a/griptape/drivers/rerank/cohere_rerank_driver.py b/griptape/drivers/rerank/cohere_rerank_driver.py index 206706476..57a7863d4 100644 --- a/griptape/drivers/rerank/cohere_rerank_driver.py +++ b/griptape/drivers/rerank/cohere_rerank_driver.py @@ -20,12 +20,13 @@ class CohereRerankDriver(BaseRerankDriver): ) def run(self, query: str, artifacts: list[TextArtifact]) -> list[TextArtifact]: + artifacts_dict = {str(hash(a.value)): a for a in artifacts} response = self.client.rerank( model=self.model, query=query, - documents=[a.value for a in artifacts], + documents=[a.value for a in artifacts_dict.values()], return_documents=True, top_n=self.top_n, ) - return [TextArtifact(r.document.text) for r in response.results] + return [artifacts_dict[str(hash(r.document.text))] for r in response.results] diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 72ed2c322..2957d7557 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -37,16 +37,21 @@ def to_artifact(self) -> BaseArtifact: ) def upsert_text_artifacts( - self, artifacts: dict[str, list[TextArtifact]], meta: Optional[dict] = None, **kwargs + self, artifacts: list[TextArtifact] | dict[str, list[TextArtifact]], meta: Optional[dict] = None, **kwargs ) -> None: with self.futures_executor_fn() as executor: - utils.execute_futures_dict( - { - namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) - for namespace, artifact_list in artifacts.items() - for a in artifact_list - } - ) + if isinstance(artifacts, list): + utils.execute_futures_list( + [executor.submit(self.upsert_text_artifact, a, None, meta, **kwargs) for a in artifacts] + ) + else: + utils.execute_futures_dict( + { + namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) + for namespace, artifact_list in artifacts.items() + for a in artifact_list + } + ) def upsert_text_artifact( self, @@ -57,7 +62,10 @@ def upsert_text_artifact( **kwargs, ) -> str: meta = {} if meta is None else meta - vector_id = self._get_default_vector_id(artifact.to_text()) if vector_id is None else vector_id + + if vector_id is None: + value = artifact.to_text() if artifact.reference is None else artifact.to_text() + str(artifact.reference) + vector_id = self._get_default_vector_id(value) if self.does_entry_exist(vector_id, namespace): return vector_id diff --git a/griptape/engines/rag/modules/__init__.py b/griptape/engines/rag/modules/__init__.py index cb11551e3..4a180490d 100644 --- a/griptape/engines/rag/modules/__init__.py +++ b/griptape/engines/rag/modules/__init__.py @@ -4,6 +4,7 @@ from .retrieval.base_rerank_rag_module import BaseRerankRagModule from .retrieval.text_chunks_rerank_rag_module import TextChunksRerankRagModule from .retrieval.vector_store_retrieval_rag_module import VectorStoreRetrievalRagModule +from .retrieval.text_loader_retrieval_rag_module import TextLoaderRetrievalRagModule from .response.base_before_response_rag_module import BaseBeforeResponseRagModule from .response.base_after_response_rag_module import BaseAfterResponseRagModule from .response.base_response_rag_module import BaseResponseRagModule @@ -11,6 +12,7 @@ from .response.rulesets_before_response_rag_module import RulesetsBeforeResponseRagModule from .response.metadata_before_response_rag_module import MetadataBeforeResponseRagModule from .response.text_chunks_response_rag_module import TextChunksResponseRagModule +from .response.footnote_prompt_response_rag_module import FootnotePromptResponseRagModule __all__ = [ "BaseRagModule", @@ -19,6 +21,7 @@ "BaseRerankRagModule", "TextChunksRerankRagModule", "VectorStoreRetrievalRagModule", + "TextLoaderRetrievalRagModule", "BaseBeforeResponseRagModule", "BaseAfterResponseRagModule", "BaseResponseRagModule", @@ -26,4 +29,5 @@ "RulesetsBeforeResponseRagModule", "MetadataBeforeResponseRagModule", "TextChunksResponseRagModule", + "FootnotePromptResponseRagModule", ] diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index becd94d9e..9bdcb6372 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -19,10 +19,10 @@ def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptS ) def get_context_param(self, context: RagContext, key: str) -> Optional[Any]: - return context.module_params.get(self.name, {}).get(key) + return context.module_configs.get(self.name, {}).get(key) def set_context_param(self, context: RagContext, key: str, value: Any) -> None: - if not isinstance(context.module_params.get(self.name), dict): - context.module_params[self.name] = {} + if not isinstance(context.module_configs.get(self.name), dict): + context.module_configs[self.name] = {} - context.module_params[self.name][key] = value + context.module_configs[self.name][key] = value diff --git a/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py b/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py new file mode 100644 index 000000000..c64c8e5ee --- /dev/null +++ b/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py @@ -0,0 +1,18 @@ +from attrs import define + +from griptape import utils +from griptape.artifacts import TextArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import PromptResponseRagModule +from griptape.utils import J2 + + +@define(kw_only=True) +class FootnotePromptResponseRagModule(PromptResponseRagModule): + def default_system_template_generator(self, context: RagContext, artifacts: list[TextArtifact]) -> str: + return J2("engines/rag/modules/response/footnote_prompt/system.j2").render( + text_chunk_artifacts=artifacts, + references=utils.references_from_artifacts(artifacts), + before_system_prompt="\n\n".join(context.before_query), + after_system_prompt="\n\n".join(context.after_query), + ) diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 7b29de7ee..8552ab904 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -11,50 +11,43 @@ class PromptResponseRagModule(BaseResponseRagModule): answer_token_offset: int = field(default=400) prompt_driver: BasePromptDriver = field() - generate_system_template: Callable[[list[str], list[str], list[str]], str] = field( + generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( default=Factory(lambda self: self.default_system_template_generator, takes_self=True) ) def run(self, context: RagContext) -> RagContext: query = context.query - before_query = context.before_query - after_query = context.after_query - text_artifact_chunks = context.text_chunks + tokenizer = self.prompt_driver.tokenizer + included_chunks = [] + system_prompt = self.generate_system_template(context, included_chunks) - if query: - tokenizer = self.prompt_driver.tokenizer - text_chunks = [] - system_prompt = self.generate_system_template(text_chunks, before_query, after_query) + for artifact in context.text_chunks: + included_chunks.append(artifact) - for artifact in text_artifact_chunks: - text_chunks.append(artifact.value) + system_prompt = self.generate_system_template(context, included_chunks) + message_token_count = self.prompt_driver.tokenizer.count_tokens( + self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)) + ) - system_prompt = self.generate_system_template(text_chunks, before_query, after_query) - message_token_count = self.prompt_driver.tokenizer.count_tokens( - self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)) - ) + if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: + included_chunks.pop() - if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: - text_chunks.pop() + system_prompt = self.generate_system_template(context, included_chunks) - system_prompt = self.generate_system_template(text_chunks, before_query, after_query) + break - break + output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)).to_artifact() - output = self.prompt_driver.run(self.generate_query_prompt_stack(system_prompt, query)).to_artifact() - - if isinstance(output, TextArtifact): - context.output = output - else: - raise ValueError("Prompt driver did not return a TextArtifact") + if isinstance(output, TextArtifact): + context.output = output + else: + raise ValueError("Prompt driver did not return a TextArtifact") return context - def default_system_template_generator( - self, text_chunks: list[str], before_system_prompt: list, after_system_prompt: list - ) -> str: + def default_system_template_generator(self, context: RagContext, artifacts: list[TextArtifact]) -> str: return J2("engines/rag/modules/response/prompt/system.j2").render( - text_chunks=text_chunks, - before_system_prompt="\n\n".join(before_system_prompt), - after_system_prompt="\n\n".join(after_system_prompt), + text_chunks=[c.to_text() for c in artifacts], + before_system_prompt="\n\n".join(context.before_query), + after_system_prompt="\n\n".join(context.after_query), ) diff --git a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py new file mode 100644 index 000000000..a37910da6 --- /dev/null +++ b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py @@ -0,0 +1,41 @@ +from __future__ import annotations +import uuid +from typing import TYPE_CHECKING, Sequence, Any, Callable +from attrs import define, field, Factory +from griptape import utils +from griptape.artifacts import TextArtifact, ErrorArtifact +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import BaseRetrievalRagModule + +if TYPE_CHECKING: + from griptape.drivers import BaseVectorStoreDriver + from griptape.loaders import BaseTextLoader + + +@define(kw_only=True) +class TextLoaderRetrievalRagModule(BaseRetrievalRagModule): + loader: BaseTextLoader = field() + vector_store_driver: BaseVectorStoreDriver = field() + source: Any = field() + query_params: dict[str, Any] = field(factory=dict) + process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( + default=Factory(lambda: lambda es: [e.to_artifact() for e in es]) + ) + + def run(self, context: RagContext) -> Sequence[TextArtifact]: + namespace = uuid.uuid4().hex + context_source = self.get_context_param(context, "source") + source = self.source if context_source is None else context_source + + query_params = utils.dict_merge(self.query_params, self.get_context_param(context, "query_params")) + + query_params["namespace"] = namespace + + loader_output = self.loader.load(source) + + if isinstance(loader_output, ErrorArtifact): + raise Exception(loader_output.to_text() if loader_output.exception is None else loader_output.exception) + else: + self.vector_store_driver.upsert_text_artifacts({namespace: loader_output}) + + return self.process_query_output_fn(self.vector_store_driver.query(context.query, **query_params)) diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index e91650faf..96d249693 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -1,6 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, Sequence, Any, Callable from attrs import define, field, Factory +from griptape import utils from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRetrievalRagModule @@ -18,7 +19,6 @@ class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): ) def run(self, context: RagContext) -> Sequence[TextArtifact]: - context_query_params = self.get_context_param(context, "query_params") - query_params = self.query_params if context_query_params is None else context_query_params + query_params = utils.dict_merge(self.query_params, self.get_context_param(context, "query_params")) return self.process_query_output_fn(self.vector_store_driver.query(context.query, **query_params)) diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index ce0d1adc6..c0658ad7b 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -1,25 +1,35 @@ -from typing import Optional +from __future__ import annotations +from typing import Optional, TYPE_CHECKING from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact + +from griptape import utils +from griptape.common import Reference +from griptape.mixins import SerializableMixin + +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact, BaseArtifact @define(kw_only=True) -class RagContext: +class RagContext(SerializableMixin): """Used by RagEngine stages and module to pass context that individual modules are expected to update in the `run` method. Attributes: query: Query provided by the user. - module_params: Dictionary of dictionary parameters to be used by modules. First key should be the module name and the second a parameter name. + module_configs: Dictionary of module configs. First key should be a module name and the second a dictionary of config parameters. before_query: An optional list of strings to add before the query in generation modules. after_query: An optional list of strings to add after the query in generation modules. text_chunks: A list of text chunks to pass around from the retrieval stage to the generation stage. output: Final output from the generation stage. """ - query: str = field() - module_params: dict[str, dict] = field(factory=dict) - before_query: list[str] = field(factory=list) - after_query: list[str] = field(factory=list) - text_chunks: list[TextArtifact] = field(factory=list) - output: Optional[BaseArtifact] = field(default=None) + query: str = field(metadata={"serializable": True}) + module_configs: dict[str, dict] = field(factory=dict, metadata={"serializable": True}) + before_query: list[str] = field(factory=list, metadata={"serializable": True}) + after_query: list[str] = field(factory=list, metadata={"serializable": True}) + text_chunks: list[TextArtifact] = field(factory=list, metadata={"serializable": True}) + output: Optional[BaseArtifact] = field(default=None, metadata={"serializable": True}) + + def get_references(self) -> list[Reference]: + return utils.references_from_artifacts(self.text_chunks) diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index c2840d62f..4f2a93183 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -1,13 +1,11 @@ from __future__ import annotations - -from abc import ABC +from abc import ABC, abstractmethod from typing import Any, Optional, Union, cast - from attrs import define, field, Factory - from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact from griptape.chunkers import TextChunker, BaseChunker +from griptape.common import Reference from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader from griptape.tokenizers import OpenAiTokenizer @@ -32,6 +30,10 @@ class BaseTextLoader(BaseLoader, ABC): ) embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) encoding: str = field(default="utf-8", kw_only=True) + reference: Optional[Reference] = field(default=None, kw_only=True) + + @abstractmethod + def load(self, source: Any, *args, **kwargs) -> ErrorArtifact | list[TextArtifact]: ... def load_collection(self, sources: list[Any], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: return cast( @@ -43,12 +45,14 @@ def _text_to_artifacts(self, text: str) -> list[TextArtifact]: chunks = self.chunker.chunk(text) if self.chunker else [TextArtifact(text)] - if self.embedding_driver: - for chunk in chunks: + for chunk in chunks: + if self.embedding_driver: chunk.generate_embedding(self.embedding_driver) - for chunk in chunks: + chunk.reference = self.reference + chunk.encoding = self.encoding + artifacts.append(chunk) return artifacts diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 976a9ea5b..0d135bcbd 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -52,7 +52,7 @@ def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifac result = self.rag_engine.process( RagContext( query=query, - module_params={ + module_configs={ self.retrieval_rag_module_name: { "query_params": { "namespace": namespace, diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 1099e1bf7..e199a5c7e 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -59,7 +59,7 @@ def _get_field_for_type(cls, field_type: type) -> fields.Field | fields.Nested: if ABC in field_class.__bases__: return fields.Nested(PolymorphicSchema(inner_class=field_class), allow_none=optional) else: - return fields.Nested(cls.from_attrs_cls(field_type), allow_none=optional) + return fields.Nested(cls.from_attrs_cls(field_class), allow_none=optional) elif cls.is_list_sequence(field_class): if args: return fields.List(cls_or_instance=cls._get_field_for_type(args[0]), allow_none=optional) @@ -105,9 +105,10 @@ def _resolve_types(cls, attrs_cls: type) -> None: # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver from griptape.structures import Structure - from griptape.common import PromptStack, Message + from griptape.common import PromptStack, Message, Reference from griptape.tokenizers.base_tokenizer import BaseTokenizer from typing import Any + from griptape.artifacts import BaseArtifact boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any Client = import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any @@ -123,6 +124,8 @@ def _resolve_types(cls, attrs_cls: type) -> None: "BaseTokenizer": BaseTokenizer, "boto3": boto3, "Client": Client, + "Reference": Reference, + "BaseArtifact": BaseArtifact, }, ) diff --git a/griptape/templates/engines/rag/modules/response/footnote_prompt/system.j2 b/griptape/templates/engines/rag/modules/response/footnote_prompt/system.j2 new file mode 100644 index 000000000..0dcf60fd4 --- /dev/null +++ b/griptape/templates/engines/rag/modules/response/footnote_prompt/system.j2 @@ -0,0 +1,37 @@ +You are an expert Q&A system. Always answer the question using the provided context information, and not prior knowledge. Always be truthful. Don't make up facts. +{% if before_system_prompt %} +{{ before_system_prompt }} + +{% endif %} +Use the following list of excerpts to respond. If there are no excerpts available or excerpts don't have relevant information respond with "I could not find an answer." + +When responding to a question, always reference facts from excerpts whenever possible. Some excerpts might have references associated with them. When referencing facts from excerpts always add a footnote number in square brackets after that fact. At the end of your response compile a list of footnotes. Always include a reference title and other available reference information. Make sure footnotes are unique and have no duplicates. +{% if references|length > 0 %} + +## References + +{% for reference in references %} +{{ reference }} +{% endfor %} +{% endif %} +{% if text_chunk_artifacts|length > 0 %} + +## Excerpts + +{% for artifact in text_chunk_artifacts %} +{% if artifact.reference %} +Excerpt (Reference ID: {{ artifact.reference.id }}): """ +{{ artifact.to_text() }} +{% else %} +Excerpt: """ +{{ artifact.to_text() }} +{% endif %} +""" +{% endfor %} +{% if after_system_prompt %} + +{{ after_system_prompt }} +{% endif %} +{% else %} +No excerpt available. +{% endif %} \ No newline at end of file diff --git a/griptape/templates/engines/rag/modules/response/prompt/system.j2 b/griptape/templates/engines/rag/modules/response/prompt/system.j2 index 4b06f3e8c..1fa9d8c12 100644 --- a/griptape/templates/engines/rag/modules/response/prompt/system.j2 +++ b/griptape/templates/engines/rag/modules/response/prompt/system.j2 @@ -1,11 +1,14 @@ +You are an expert Q&A system. Always answer the question using the provided context information, and not prior knowledge. Always be truthful. Don't make up facts. You can answer questions by searching through text chunks. {% if before_system_prompt %} {{ before_system_prompt }} {% endif %} -Always be truthful. Don't make up facts. You can answer questions by searching through text chunks. Use the following list of text chunks to respond. If there are no text chunks available or text chunks don't have relevant information respond with "I could not find an answer." +Use the following list of text chunks to respond. If there are no text chunks available or text chunks don't have relevant information respond with "I could not find an answer." {% if text_chunks and text_chunks|length > 0 %} +## Text Chunks {% for chunk in text_chunks %} + Text chunk: """ {{ chunk }} """ diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index a84703f39..ceb19547e 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -17,6 +17,7 @@ from .load_artifact_from_memory import load_artifact_from_memory from .deprecation import deprecation_warn from .structure_visualizer import StructureVisualizer +from .reference_utils import references_from_artifacts def minify_json(value: str) -> str: @@ -45,4 +46,5 @@ def minify_json(value: str) -> str: "load_file", "load_files", "StructureVisualizer", + "references_from_artifacts", ] diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index c5f6bb676..a396bf7d1 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -1,3 +1,6 @@ +from typing import Optional + + def remove_null_values_in_dict_recursively(d: dict) -> dict: if isinstance(d, dict): return {k: remove_null_values_in_dict_recursively(v) for k, v in d.items() if v is not None} @@ -5,7 +8,7 @@ def remove_null_values_in_dict_recursively(d: dict) -> dict: return d -def dict_merge(dct: dict, merge_dct: dict, add_keys: bool = True) -> dict: +def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], add_keys: bool = True) -> dict: """Recursive dict merge. Inspired by :meth:``dict.update()``, instead of updating only top-level keys, dict_merge recurses down into dicts nested to an arbitrary depth, updating keys. The ``merge_dct`` is merged into @@ -26,7 +29,11 @@ def dict_merge(dct: dict, merge_dct: dict, add_keys: bool = True) -> dict: Returns: dict: updated dict """ + dct = {} if dct is None else dct + merge_dct = {} if merge_dct is None else merge_dct + dct = dct.copy() + if not add_keys: merge_dct = {k: merge_dct[k] for k in set(dct).intersection(set(merge_dct))} diff --git a/griptape/utils/reference_utils.py b/griptape/utils/reference_utils.py new file mode 100644 index 000000000..761ee3d24 --- /dev/null +++ b/griptape/utils/reference_utils.py @@ -0,0 +1,12 @@ +from griptape.artifacts import TextArtifact +from griptape.common import Reference + + +def references_from_artifacts(artifacts: list[TextArtifact]) -> list[Reference]: + references = [] + + for a in artifacts: + if a.reference is not None and a.reference not in references: + references.append(a.reference) + + return references diff --git a/tests/mocks/mock_serializable.py b/tests/mocks/mock_serializable.py index 4de173b07..b02c071aa 100644 --- a/tests/mocks/mock_serializable.py +++ b/tests/mocks/mock_serializable.py @@ -5,7 +5,12 @@ @define class MockSerializable(SerializableMixin): + @define + class NestedMockSerializable(SerializableMixin): + foo: str = field(default="bar", kw_only=True, metadata={"serializable": True}) + foo: str = field(default="bar", kw_only=True, metadata={"serializable": True}) bar: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) baz: Optional[list[int]] = field(default=None, kw_only=True, metadata={"serializable": True}) secret: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) + nested: Optional[NestedMockSerializable] = field(default=None, kw_only=True, metadata={"serializable": True}) diff --git a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py index df0ca4d3c..ba79a4def 100644 --- a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py @@ -72,7 +72,7 @@ def test_store_with_sort_key(self): value_attribute_key=self.VALUE_ATTRIBUTE_KEY, partition_key_value=self.PARTITION_KEY_VALUE, sort_key="sortKey", - sort_key_value="foo" + sort_key_value="foo", ) memory = ConversationMemory(driver=memory_driver) pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) @@ -120,7 +120,7 @@ def test_load_with_sort_key(self): value_attribute_key=self.VALUE_ATTRIBUTE_KEY, partition_key_value=self.PARTITION_KEY_VALUE, sort_key="sortKey", - sort_key_value="foo" + sort_key_value="foo", ) memory = ConversationMemory(driver=memory_driver) pipeline = Pipeline(prompt_driver=prompt_driver, conversation_memory=memory) @@ -135,4 +135,4 @@ def test_load_with_sort_key(self): assert new_memory.type == "ConversationMemory" assert len(new_memory.runs) == 2 assert new_memory.runs[0].input.value == "test" - assert new_memory.runs[0].output.value == "mock output" \ No newline at end of file + assert new_memory.runs[0].output.value == "mock output" diff --git a/tests/unit/drivers/rerank/test_cohere_rerank_driver.py b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py index f7b050551..952546e5a 100644 --- a/tests/unit/drivers/rerank/test_cohere_rerank_driver.py +++ b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py @@ -1,5 +1,5 @@ -from unittest.mock import Mock import pytest +from cohere import RerankResponseResultsItemDocument, RerankResponseResultsItem from griptape.artifacts import TextArtifact from griptape.drivers import CohereRerankDriver @@ -8,7 +8,14 @@ class TestCohereRerankDriver: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value - mock_client.rerank.return_value.results = [Mock(), Mock()] + mock_client.rerank.return_value.results = [ + RerankResponseResultsItem( + index=1, relevance_score=1.0, document=RerankResponseResultsItemDocument(text="foo") + ), + RerankResponseResultsItem( + index=2, relevance_score=0.5, document=RerankResponseResultsItemDocument(text="bar") + ), + ] return mock_client diff --git a/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py b/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py deleted file mode 100644 index cb8fcbefe..000000000 --- a/tests/unit/drivers/vector/test_in_memory_local_vector_store_driver.py +++ /dev/null @@ -1,10 +0,0 @@ -import pytest -from griptape.drivers import LocalVectorStoreDriver -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from tests.unit.drivers.vector.test_base_local_vector_store_driver import BaseLocalVectorStoreDriver - - -class TestInMemoryLocalVectorStoreDriver(BaseLocalVectorStoreDriver): - @pytest.fixture - def driver(self): - return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/drivers/vector/test_local_vector_store_driver.py b/tests/unit/drivers/vector/test_local_vector_store_driver.py new file mode 100644 index 000000000..937f14ece --- /dev/null +++ b/tests/unit/drivers/vector/test_local_vector_store_driver.py @@ -0,0 +1,23 @@ +import pytest +from griptape.artifacts import TextArtifact +from griptape.drivers import LocalVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.unit.drivers.vector.test_base_local_vector_store_driver import BaseLocalVectorStoreDriver + + +class TestLocalVectorStoreDriver(BaseLocalVectorStoreDriver): + @pytest.fixture + def driver(self): + return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) + + def test_upsert_text_artifacts_dict(self, driver): + driver.upsert_text_artifacts({"foo": [TextArtifact("bar"), TextArtifact("baz")], "bar": [TextArtifact("bar")]}) + + assert len(driver.load_artifacts("foo")) == 2 + assert len(driver.load_artifacts("bar")) == 1 + + def test_upsert_text_artifacts_list(self, driver): + driver.upsert_text_artifacts([TextArtifact("bar"), TextArtifact("baz")]) + + assert len(driver.load_artifacts("foo")) == 0 + assert len(driver.load_artifacts()) == 2 diff --git a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py new file mode 100644 index 000000000..e5ba50a5b --- /dev/null +++ b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py @@ -0,0 +1,33 @@ +import pytest +from griptape.artifacts import TextArtifact +from griptape.common import Reference +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import FootnotePromptResponseRagModule +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestFootnotePromptResponseRagModule: + @pytest.fixture + def module(self): + return FootnotePromptResponseRagModule(prompt_driver=MockPromptDriver()) + + def test_run(self, module): + assert module.run(RagContext(query="test")).output.value == "mock output" + + def test_prompt(self, module): + system_message = module.default_system_template_generator( + RagContext(query="test", before_query=["*RULESET*", "*META*"]), + artifacts=[ + TextArtifact("*TEXT SEGMENT 1*", reference=Reference(title="source 1")), + TextArtifact("*TEXT SEGMENT 2*", reference=Reference(title="source 2")), + TextArtifact("*TEXT SEGMENT 3*"), + ], + ) + + assert "*RULESET*" in system_message + assert "*META*" in system_message + assert "*TEXT SEGMENT 1*" in system_message + assert "*TEXT SEGMENT 2*" in system_message + assert "*TEXT SEGMENT 3*" in system_message + assert "source 1" in system_message + assert "source 2" in system_message diff --git a/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py index 43927bd8a..9519c8017 100644 --- a/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_metadata_before_response_rag_module.py @@ -6,7 +6,9 @@ class TestMetadataBeforeResponseRagModule: def test_run(self): module = MetadataBeforeResponseRagModule(name="foo") - assert "foo" in module.run(RagContext(module_params={"foo": {"metadata": "foo"}}, query="test")).before_query[0] + assert ( + "foo" in module.run(RagContext(module_configs={"foo": {"metadata": "foo"}}, query="test")).before_query[0] + ) def test_run_with_override(self): module = MetadataBeforeResponseRagModule(name="foo", metadata="bar") @@ -14,6 +16,6 @@ def test_run_with_override(self): assert ( "bar" in module.run( - RagContext(module_params={"foo": {"query_params": {"metadata": "foo"}}}, query="test") + RagContext(module_configs={"foo": {"query_params": {"metadata": "foo"}}}, query="test") ).before_query[0] ) diff --git a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py index d8835bbe4..f262d6d06 100644 --- a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py @@ -1,4 +1,5 @@ import pytest +from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import PromptResponseRagModule from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -14,9 +15,8 @@ def test_run(self, module): def test_prompt(self, module): system_message = module.default_system_template_generator( - text_chunks=["*TEXT SEGMENT 1*", "*TEXT SEGMENT 2*"], - before_system_prompt=["*RULESET*", "*META*"], - after_system_prompt=[], + RagContext(query="test", before_query=["*RULESET*", "*META*"], after_query=[]), + artifacts=[TextArtifact("*TEXT SEGMENT 1*"), TextArtifact("*TEXT SEGMENT 2*")], ) assert "*RULESET*" in system_message diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py index 838f02e37..fa3bfecb2 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py @@ -1,5 +1,6 @@ -from unittest.mock import Mock import pytest +from cohere import RerankResponseResultsItem, RerankResponseResultsItemDocument +from griptape.artifacts import TextArtifact from griptape.drivers import CohereRerankDriver from griptape.engines.rag import RagContext from griptape.engines.rag.modules import TextChunksRerankRagModule @@ -9,12 +10,19 @@ class TestTextChunksRerankRagModule: @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value - mock_client.rerank.return_value.results = [Mock(), Mock()] + mock_client.rerank.return_value.results = [ + RerankResponseResultsItem( + index=1, relevance_score=1.0, document=RerankResponseResultsItemDocument(text="foo") + ), + RerankResponseResultsItem( + index=2, relevance_score=0.5, document=RerankResponseResultsItemDocument(text="bar") + ), + ] return mock_client def test_run(self, mock_client): module = TextChunksRerankRagModule(rerank_driver=CohereRerankDriver(api_key="api-key")) - result = module.run(RagContext(query="test")) + result = module.run(RagContext(query="test", text_chunks=[TextArtifact("foo"), TextArtifact("bar")])) assert len(result) == 2 diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py new file mode 100644 index 000000000..7c69f674a --- /dev/null +++ b/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py @@ -0,0 +1,26 @@ +import pytest + +from griptape.drivers import LocalVectorStoreDriver +from griptape.engines.rag import RagContext +from griptape.engines.rag.modules import TextLoaderRetrievalRagModule +from griptape.loaders import WebLoader +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + +MAX_TOKENS = 50 + + +class TestTextLoaderRetrievalRagModule: + @pytest.fixture(autouse=True) + def mock_trafilatura_fetch_url(self, mocker): + mocker.patch("trafilatura.fetch_url", return_value="foobar") + + def test_run(self): + embedding_driver = MockEmbeddingDriver() + + module = TextLoaderRetrievalRagModule( + loader=WebLoader(max_tokens=MAX_TOKENS, embedding_driver=embedding_driver), + vector_store_driver=LocalVectorStoreDriver(embedding_driver=embedding_driver), + source="https://www.griptape.ai", + ) + + assert module.run(RagContext(query="foo"))[0].value == "foobar" diff --git a/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py index 3a01b3eaa..9fecc3c0e 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_vector_store_retrieval_rag_module.py @@ -1,4 +1,5 @@ from griptape.artifacts import TextArtifact +from griptape.common import Reference from griptape.drivers import LocalVectorStoreDriver from griptape.engines.rag import RagContext from griptape.engines.rag.modules import VectorStoreRetrievalRagModule @@ -10,7 +11,9 @@ def test_run_without_namespace(self): vector_store_driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) module = VectorStoreRetrievalRagModule(vector_store_driver=vector_store_driver) - vector_store_driver.upsert_text_artifact(TextArtifact("foobar1"), namespace="test") + vector_store_driver.upsert_text_artifact( + TextArtifact("foobar1", reference=Reference(title="boo")), namespace="test" + ) vector_store_driver.upsert_text_artifact(TextArtifact("foobar2"), namespace="test") result = module.run(RagContext(query="test")) @@ -45,13 +48,13 @@ def test_run_with_namespace_overrides(self): result1 = module.run( RagContext( - query="test", module_params={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "empty"}}} + query="test", module_configs={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "empty"}}} ) ) result2 = module.run( RagContext( - query="test", module_params={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "test"}}} + query="test", module_configs={"VectorStoreRetrievalRagModule": {"query_params": {"namespace": "test"}}} ) ) diff --git a/tests/unit/engines/rag/modules/test_base_rag_nodule.py b/tests/unit/engines/rag/modules/test_base_rag_nodule.py index 0fc415e0e..be1fda861 100644 --- a/tests/unit/engines/rag/modules/test_base_rag_nodule.py +++ b/tests/unit/engines/rag/modules/test_base_rag_nodule.py @@ -14,7 +14,7 @@ def test_get_context_param(self): module = MockRagModule(name="boo") context = RagContext(query="test") - context.module_params["boo"] = {"foo": "bar"} + context.module_configs["boo"] = {"foo": "bar"} assert module.get_context_param(context, "foo") == "bar" @@ -24,4 +24,4 @@ def test_set_context_param(self): module.set_context_param(context, "foo", "bar") - assert context.module_params["boo"]["foo"] == "bar" + assert context.module_configs["boo"]["foo"] == "bar" diff --git a/tests/unit/engines/rag/test_rag_context.py b/tests/unit/engines/rag/test_rag_context.py new file mode 100644 index 000000000..7eba86683 --- /dev/null +++ b/tests/unit/engines/rag/test_rag_context.py @@ -0,0 +1,23 @@ +from griptape.artifacts import TextArtifact +from griptape.common import Reference +from griptape.engines.rag import RagContext + + +class TestRagContext: + def test_get_references(self): + reference1 = Reference(title="foo") + reference2 = Reference(title="bar") + context = RagContext( + query="foo", + text_chunks=[ + TextArtifact("foo", reference=reference1), + TextArtifact("foo", reference=reference1), + TextArtifact("foo"), + TextArtifact("foo", reference=reference2), + ], + ) + references = context.get_references() + + assert len(references) == 2 + assert references[0].id == reference1.id + assert references[1].id == reference2.id diff --git a/tests/unit/mixins/test_seriliazable_mixin.py b/tests/unit/mixins/test_seriliazable_mixin.py index d733d7858..1704000e3 100644 --- a/tests/unit/mixins/test_seriliazable_mixin.py +++ b/tests/unit/mixins/test_seriliazable_mixin.py @@ -23,16 +23,22 @@ def test_from_json(self): def test_str(self): assert str(MockSerializable()) == json.dumps( - {"type": "MockSerializable", "foo": "bar", "bar": None, "baz": None} + {"type": "MockSerializable", "foo": "bar", "bar": None, "baz": None, "nested": None} ) def test_to_json(self): assert MockSerializable().to_json() == json.dumps( - {"type": "MockSerializable", "foo": "bar", "bar": None, "baz": None} + {"type": "MockSerializable", "foo": "bar", "bar": None, "baz": None, "nested": None} ) def test_to_dict(self): - assert MockSerializable().to_dict() == {"type": "MockSerializable", "foo": "bar", "bar": None, "baz": None} + assert MockSerializable().to_dict() == { + "type": "MockSerializable", + "foo": "bar", + "bar": None, + "baz": None, + "nested": None, + } def test_import_class_rec(self): assert ( @@ -47,3 +53,8 @@ def test_import_class_rec(self): with pytest.raises(ValueError): MockSerializable._import_cls_rec("griptape.memory.task", "ConversationMemory") + + def test_nested_optional_serializable(self): + assert MockSerializable(nested=None).to_dict().get("nested") is None + + assert MockSerializable(nested=MockSerializable.NestedMockSerializable()).to_dict()["nested"]["foo"] == "bar" diff --git a/tests/unit/utils/test_dict_utils.py b/tests/unit/utils/test_dict_utils.py index ba6d5470d..958e0295b 100644 --- a/tests/unit/utils/test_dict_utils.py +++ b/tests/unit/utils/test_dict_utils.py @@ -10,7 +10,7 @@ def test_remove_null_values_in_dict_recursively(self): assert remove_null_values_in_dict_recursively(dict_with_nones) == dict_without_nones - def test_merges_dicts(self): + def test_dict_merge_merges_dicts(self): a = {"a": 1, "b": {"b1": 2, "b2": 3}} b = {"a": 1, "b": {"b1": 4}} @@ -18,7 +18,22 @@ def test_merges_dicts(self): assert dict_merge(a, b)["b"]["b2"] == 3 assert dict_merge(a, b)["b"]["b1"] == 4 - def test_inserts_new_keys(self): + def test_dict_merge_works_with_optionals(self): + a = {"a": 1, "b": {"b1": 2, "b2": 3}} + b = None + + assert dict_merge(a, b)["a"] == 1 + assert dict_merge(a, b)["b"]["b2"] == 3 + assert dict_merge(a, b)["b"]["b1"] == 2 + + a = None + b = {"a": 1, "b": {"b1": 2, "b2": 3}} + + assert dict_merge(a, b)["a"] == 1 + assert dict_merge(a, b)["b"]["b2"] == 3 + assert dict_merge(a, b)["b"]["b1"] == 2 + + def test_dict_merge_inserts_new_keys(self): a = {"a": 1, "b": {"b1": 2, "b2": 3}} b = {"a": 1, "b": {"b1": 4, "b3": 5}, "c": 6} @@ -28,7 +43,7 @@ def test_inserts_new_keys(self): assert dict_merge(a, b)["b"]["b3"] == 5 assert dict_merge(a, b)["c"] == 6 - def test_does_not_insert_new_keys(self): + def test_dict_merge_does_not_insert_new_keys(self): a = {"a": 1, "b": {"b1": 2, "b2": 3}} b = {"a": 1, "b": {"b1": 4, "b3": 5}, "c": 6} diff --git a/tests/utils/test_reference_utils.py b/tests/utils/test_reference_utils.py new file mode 100644 index 000000000..c3491f5d0 --- /dev/null +++ b/tests/utils/test_reference_utils.py @@ -0,0 +1,22 @@ +from griptape.artifacts import TextArtifact +from griptape.common import Reference +from griptape.engines.rag.modules import PromptResponseRagModule +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestReferenceUtils: + def test_references_from_artifacts(self): + module = PromptResponseRagModule(prompt_driver=MockPromptDriver()) + reference1 = Reference(title="foo") + reference2 = Reference(title="bar") + artifacts = [ + TextArtifact("foo", reference=reference1), + TextArtifact("foo", reference=reference1), + TextArtifact("foo"), + TextArtifact("foo", reference=reference2), + ] + references = module.references_from_artifacts(artifacts) + + assert len(references) == 2 + assert references[0].id == reference1.id + assert references[1].id == reference2.id From bb158eae9ec106facc2e11164552a9c778981006 Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:21:34 -0400 Subject: [PATCH 143/238] Update certifi (#944) Co-authored-by: Collin Dutter --- poetry.lock | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 83d2d5632..da5b152d2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -757,13 +757,13 @@ files = [ [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -3466,6 +3466,7 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4709,7 +4710,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -4717,15 +4717,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -4742,7 +4735,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -4750,7 +4742,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, From c9b92ea3109cbe936091d3640921dde0a82a92a9 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 9 Jul 2024 09:58:53 -0700 Subject: [PATCH 144/238] Fix azure streaming (#946) --- griptape/drivers/prompt/azure_openai_chat_prompt_driver.py | 6 +++++- griptape/drivers/prompt/openai_chat_prompt_driver.py | 5 ++--- .../drivers/prompt/test_azure_openai_chat_prompt_driver.py | 7 +------ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 50e9effe6..64145b1a9 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -44,6 +44,10 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): def _base_params(self, prompt_stack: PromptStack) -> dict: params = super()._base_params(prompt_stack) # TODO: Add `seed` parameter once Azure supports it. - del params["seed"] + if "seed" in params: + del params["seed"] + # TODO: Add `stream_options` parameter once Azure supports it. + if "stream_options" in params: + del params["stream_options"] return params diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index e1e046d11..a89b4eb57 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -90,9 +90,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: raise Exception("Completion with more than one choice is not supported yet.") def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: - result = self.client.chat.completions.create( - **self._base_params(prompt_stack), stream=True, stream_options={"include_usage": True} - ) + result = self.client.chat.completions.create(**self._base_params(prompt_stack), stream=True) for chunk in result: if chunk.usage is not None: @@ -124,6 +122,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "seed": self.seed, **({"stop": self.tokenizer.stop_sequences} if self.tokenizer.stop_sequences else {}), **({"max_tokens": self.max_tokens} if self.max_tokens is not None else {}), + **({"stream_options": {"include_usage": True}} if self.stream else {}), } if self.response_format == "json_object": diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index 92544a74e..378ecc3da 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -57,12 +57,7 @@ def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, # Then mock_chat_completion_stream_create.assert_called_once_with( - model=driver.model, - temperature=driver.temperature, - user=driver.user, - stream=True, - messages=messages, - stream_options={"include_usage": True}, + model=driver.model, temperature=driver.temperature, user=driver.user, stream=True, messages=messages ) assert event.content.text == "model-output" From 4ef133f3be969b07fec25869874ca2f0e613b895 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Wed, 10 Jul 2024 08:13:11 -0700 Subject: [PATCH 145/238] Remove duplicate info from changelog (#952) --- CHANGELOG.md | 72 ---------------------------------------------------- 1 file changed, 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a57ca94b1..5a84861a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,82 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added -- `RagEngine` is an abstraction for implementing modular RAG pipelines. - - `RagContext` is a container object for passing around RAG context. - - RAG stages: - - `QueryRagStage` for parsing and expanding queries. - - `RetrievalRagStage` for retrieving content. - - `ResponseRagStage` for augmenting and generating outputs. - - RAG modules: - - Retrieval: - - `VectorStoreRetrievalRagModule` for retrieving text chunks from vector stores. - - `TextLoaderRetrievalRagModule` for retrieving data with text loaders in real time. - - `TextChunksRerankRagModule` for re-ranking retrieved results. - - Response: - - `MetadataBeforeResponseRagModule` for appending metadata. - - `RulesetsBeforeResponseRagModule` for appending rulesets. - - `PromptResponseRagModule` for generating responses based on retrieved text chunks. - - `TextChunksResponseRagModule` for responding with retrieved text chunks. - - `FootnotePromptResponseRagModule` for responding with automatic footnotes from text chunk references. -- `RagClient` tool for exposing `RagEngines` to LLM agents. -- `RagTask` task for including `RagEngines` in any structure. -- Rerank drivers: - - `CohereRerankDriver` for using the Cohere rerank API. -- `utils.execute_futures_list()` for executing a list of futures. -- `LocalVectorStoreDriver.persist_file` for persisting vectors and chunks in a text file. -- `Entry.to_artifact()` for easy vector store entry conversions into Griptape artifacts. -- `BaseVectorStoreDriver.does_entry_exist()` to check if an entry exists in the vector store. -- `GoogleWebSearchDriver` to web search with the Google Customsearch API. -- `DuckDuckGoWebSearchDriver` to web search with the DuckDuckGo search SDK. -- `ProxyWebScraperDriver` to web scrape using proxies. -- Parameter `session` on `AmazonBedrockStructureConfig`. -- Parameter `meta` on `TextArtifact`. -- `VectorStoreClient` improvements: - - `VectorStoreClient.query_params` dict for custom query params. - - `VectorStoreClient.process_query_output_fn` for custom query output processing logic. -- Parameter `fail_fast` to `Structure`. -- `BooleanArtifact` for handling boolean values. -- `typos` to dev dependencies to catch typos in code/docs. -- `Message` for storing messages in a `PromptStack`. Messages consist of a role, content, and usage. -- `DeltaMessage` for storing partial messages in a `PromptStack`. Multiple `DeltaMessage` can be combined to form a `Message`. -- `TextMessageContent` for storing textual content in a `Message`. -- `ImageMessageContent` for storing image content in a `Message`. -- Support for adding `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s to `PromptStack`. -- Support for image inputs to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AmazonBedrockPromptDriver`, `AnthropicPromptDriver`, and `GooglePromptDriver`. -- Input/output token usage metrics to all Prompt Drivers. -- `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. -- Support for storing Artifacts as inputs/outputs in Conversation Memory Runs. -- `Agent.input` for passing Artifacts as input. -- Support for `PromptTask`s to take `TextArtifact`s, `ImageArtifact`s, and `ListArtifact`s as input. -- Parameters `sort_key` and `sort_key_value` on `AmazonDynamoDbConversationMemoryDriver` for tables with sort keys. -- `Reference` for supporting artifact citations in loaders and RAG engine modules. ### Changed -- **BREAKING**: Moved/renamed `griptape.utils.PromptStack` to `griptape.common.PromptStack`. -- **BREAKING**: Renamed `PromptStack.inputs` to `PromptStack.messages`. -- **BREAKING**: Moved `PromptStack.USER_ROLE`, `PromptStack.ASSISTANT_ROLE`, and `PromptStack.SYSTEM_ROLE` to `Message`. -- **BREAKING**: Updated return type of `PromptDriver.try_run` from `TextArtifact` to `Message`. -- **BREAKING**: Updated return type of `PromptDriver.try_stream` from `Iterator[TextArtifact]` to `Iterator[DeltaMessage]`. -- **BREAKING**: Removed `BasePromptEvent.token_count` in favor of `FinishPromptEvent.input_token_count` and `FinishPromptEvent.output_token_count`. -- **BREAKING**: Removed `StartPromptEvent.prompt`. Use `StartPromptEvent.prompt_stack` instead. -- **BREAKING**: Removed `Agent.input_template` in favor of `Agent.input`. -- **BREAKING**: `BasePromptDriver.run` now returns a `Message` instead of a `TextArtifact`. For compatibility, `Message.value` contains the Message's Artifact value -- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact()` and `BaseVectorStoreDriver.upsert_text()` use artifact/string values to generate `vector_id` if it wasn't implicitly passed. This change ensures that we don't generate embeddings for the same content every time. -- **BREAKING**: Removed `VectorQueryEngine` in favor of `RagEngine`. -- **BREAKING**: Removed `TextQueryTask` in favor of `RagTask`. -- **BREAKING**: `TextArtifactStorage` now requires `vector_store_driver` and `rag_engine` in place of `vector_query_engine`. -- **BREAKING**: Moved `load_artifacts()` from `BaseQueryEngine` to `BaseVectorStoreDriver`. -- **BREAKING**: Merged `BaseVectorStoreDriver.QueryResult` into `BaseVectorStoreDriver.Entry`. -- **BREAKING**: Replaced `query_engine` with `vector_store_driver` in `VectorStoreClient`. -- **BREAKING**: removed parameters `google_api_lang`, `google_api_key`, `google_api_search_id`, `google_api_country` on `WebSearch` in favor of `web_search_driver`. -- **BREAKING**: removed `VectorStoreClient.top_n` and `VectorStoreClient.namespace` in favor of `VectorStoreClient.query_params`. -- **BREAKING**: All `futures_executor` fields renamed to `futures_executor_fn` and now accept callables instead of futures; wrapped all future `submit` calls with the `with` block to address future executor shutdown issues. -- `GriptapeCloudKnowledgeBaseClient` migrated to `/search` api. -- Default Prompt Driver model in `GoogleStructureConfig` to `gemini-1.5-pro`. ### Fixed -- `CoherePromptDriver` to properly handle empty history. -- `StructureVisualizer.to_url()` by wrapping task IDs in single quotes. ## [0.28.0] - 2024-07-09 ### Added From c20617a5c2763b372aa25d4e18698a56c2e98646 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 10 Jul 2024 11:20:17 -0700 Subject: [PATCH 146/238] Add Ollama Embedding Driver (#953) --- CHANGELOG.md | 1 + .../drivers/embedding-drivers.md | 20 +++++++++++++ griptape/drivers/__init__.py | 2 ++ .../embedding/ollama_embedding_driver.py | 28 +++++++++++++++++++ poetry.lock | 14 ++++++++-- pyproject.toml | 1 + .../embedding/test_ollama_embedding_driver.py | 18 ++++++++++++ 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 griptape/drivers/embedding/ollama_embedding_driver.py create mode 100644 tests/unit/drivers/embedding/test_ollama_embedding_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a84861a3..aa3b06a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added +- `OllamaEmbeddingDriver` for generating embeddings with Ollama. ### Changed diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 3f0135ac3..a607b0950 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -97,8 +97,28 @@ embeddings = driver.embed_string("Hello world!") # display the first 3 embeddings print(embeddings[:3]) +``` + +### Ollama + +!!! info + This driver requires the `drivers-embedding-ollama` [extra](../index.md#extras). + +The [OllamaEmbeddingDriver](../../reference/griptape/drivers/embedding/ollama_embedding_driver.md) uses the [Ollama Embeddings API](https://ollama.com/blog/embedding-models). + +```python title="PYTEST_IGNORE" +from griptape.drivers import OllamaEmbeddingDriver + +driver = OllamaEmbeddingDriver( + model="all-minilm", +) +results = driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(results[:3]) ``` + ### Amazon SageMaker Jumpstart The [AmazonSageMakerJumpstartEmbeddingDriver](../../reference/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.md) uses the [Amazon SageMaker Endpoints](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html) to generate embeddings on AWS. diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index fa2934a38..4e0fe6672 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -27,6 +27,7 @@ from .embedding.google_embedding_driver import GoogleEmbeddingDriver from .embedding.dummy_embedding_driver import DummyEmbeddingDriver from .embedding.cohere_embedding_driver import CohereEmbeddingDriver +from .embedding.ollama_embedding_driver import OllamaEmbeddingDriver from .vector.base_vector_store_driver import BaseVectorStoreDriver from .vector.local_vector_store_driver import LocalVectorStoreDriver @@ -135,6 +136,7 @@ "GoogleEmbeddingDriver", "DummyEmbeddingDriver", "CohereEmbeddingDriver", + "OllamaEmbeddingDriver", "BaseVectorStoreDriver", "LocalVectorStoreDriver", "PineconeVectorStoreDriver", diff --git a/griptape/drivers/embedding/ollama_embedding_driver.py b/griptape/drivers/embedding/ollama_embedding_driver.py new file mode 100644 index 000000000..d081321c1 --- /dev/null +++ b/griptape/drivers/embedding/ollama_embedding_driver.py @@ -0,0 +1,28 @@ +from __future__ import annotations +from typing import Optional, TYPE_CHECKING +from attrs import define, field, Factory +from griptape.utils import import_optional_dependency +from griptape.drivers import BaseEmbeddingDriver + +if TYPE_CHECKING: + from ollama import Client + + +@define +class OllamaEmbeddingDriver(BaseEmbeddingDriver): + """ + Attributes: + model: Ollama embedding model name. + host: Optional Ollama host. + client: Ollama `Client`. + """ + + model: str = field(kw_only=True, metadata={"serializable": True}) + host: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + client: Client = field( + default=Factory(lambda self: import_optional_dependency("ollama").Client(host=self.host), takes_self=True), + kw_only=True, + ) + + def try_embed_chunk(self, chunk: str) -> list[float]: + return list(self.client.embeddings(model=self.model, prompt=chunk)["embedding"]) diff --git a/poetry.lock b/poetry.lock index da5b152d2..1c4be2d3a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3466,7 +3466,6 @@ description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] @@ -4710,6 +4709,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -4717,8 +4717,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -4735,6 +4742,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -4742,6 +4750,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -6517,6 +6526,7 @@ drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] drivers-embedding-google = ["google-generativeai"] drivers-embedding-huggingface = ["huggingface-hub", "transformers"] +drivers-embedding-ollama = ["ollama"] drivers-embedding-voyageai = ["voyageai"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-amazon-sqs = ["boto3"] @@ -6555,4 +6565,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a38d0f0671ff5deb42783721f4ce103e670a689f618e950451a807921f5d7139" +content-hash = "b0688b6e39e07dce28c6609067b46e5047c56c7428ca11f626ee862e3c8daf20" diff --git a/pyproject.toml b/pyproject.toml index ffcba09af..c74e703b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,6 +96,7 @@ drivers-embedding-huggingface = ["huggingface-hub", "transformers"] drivers-embedding-voyageai = ["voyageai"] drivers-embedding-google = ["google-generativeai"] drivers-embedding-cohere = ["cohere"] +drivers-embedding-ollama = ["ollama"] drivers-web-scraper-trafilatura = ["trafilatura"] drivers-web-scraper-markdownify = ["playwright", "beautifulsoup4", "markdownify"] diff --git a/tests/unit/drivers/embedding/test_ollama_embedding_driver.py b/tests/unit/drivers/embedding/test_ollama_embedding_driver.py new file mode 100644 index 000000000..3886ab874 --- /dev/null +++ b/tests/unit/drivers/embedding/test_ollama_embedding_driver.py @@ -0,0 +1,18 @@ +import pytest +from griptape.drivers import OllamaEmbeddingDriver + + +class TestOllamaEmbeddingDriver: + @pytest.fixture(autouse=True) + def mock_client(self, mocker): + mock_client = mocker.patch("ollama.Client") + + mock_client.return_value.embeddings.return_value = {"embedding": [0, 1, 0]} + + return mock_client + + def test_init(self): + assert OllamaEmbeddingDriver(model="foo") + + def test_try_embed_chunk(self): + assert OllamaEmbeddingDriver(model="foo").try_embed_chunk("foobar") == [0, 1, 0] From 8fa35a55ff04a0858485229db495aa84c63e9d4e Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 10 Jul 2024 15:00:50 -0700 Subject: [PATCH 147/238] Feature/native functions (#867) --- CHANGELOG.md | 1 + .../drivers/prompt-drivers.md | 18 + docs/griptape-framework/misc/events.md | 2 +- docs/griptape-framework/tools/index.md | 7 +- griptape/artifacts/__init__.py | 2 + griptape/artifacts/action_artifact.py | 18 + griptape/common/__init__.py | 12 + griptape/common/actions/__init__.py | 0 griptape/common/actions/base_action.py | 5 + griptape/common/actions/tool_action.py | 54 +++ .../action_call_delta_message_content.py | 31 ++ .../contents/action_call_message_content.py | 47 +++ .../contents/action_result_message_content.py | 18 + .../contents/base_message_content.py | 10 +- .../prompt_stack/messages/delta_message.py | 6 +- .../common/prompt_stack/messages/message.py | 18 +- griptape/common/prompt_stack/prompt_stack.py | 33 +- griptape/config/anthropic_structure_config.py | 2 +- .../prompt/amazon_bedrock_prompt_driver.py | 178 +++++++-- .../drivers/prompt/anthropic_prompt_driver.py | 152 +++++-- griptape/drivers/prompt/base_prompt_driver.py | 41 +- .../drivers/prompt/cohere_prompt_driver.py | 188 +++++++-- .../drivers/prompt/google_prompt_driver.py | 194 ++++++--- .../prompt/openai_chat_prompt_driver.py | 180 +++++++-- griptape/schemas/base_schema.py | 11 +- griptape/tasks/actions_subtask.py | 206 +++++----- griptape/tasks/tool_task.py | 62 +-- griptape/tasks/toolkit_task.py | 46 ++- griptape/templates/tasks/tool_task/system.j2 | 7 +- .../templates/tasks/toolkit_task/system.j2 | 14 +- griptape/tools/base_tool.py | 11 +- griptape/utils/__init__.py | 3 +- griptape/utils/dict_utils.py | 7 + poetry.lock | 14 +- pyproject.toml | 2 +- tests/unit/artifacts/test_action_artifact.py | 53 +++ tests/unit/common/__init__.py | 0 .../test_action_call_delta_message_content.py | 25 ++ .../test_action_call_message_content.py | 55 +++ .../test_action_result_message_content.py | 18 + .../contents/test_base_message_content.py | 17 + .../contents/test_image_message_content.py | 12 + .../test_text_delta_message_content.py | 6 + .../contents/test_text_message_content.py | 15 + tests/unit/common/test_action.py | 33 ++ tests/unit/common/test_prompt_stack.py | 90 +++++ .../test_amazon_bedrock_structure_config.py | 4 + .../config/test_anthropic_structure_config.py | 3 +- .../test_azure_openai_structure_config.py | 1 + .../config/test_cohere_structure_config.py | 2 + .../config/test_google_structure_config.py | 2 + .../config/test_openai_structure_config.py | 1 + tests/unit/config/test_structure_config.py | 8 +- .../test_amazon_bedrock_prompt_driver.py | 317 ++++++++++++++- .../prompt/test_anthropic_prompt_driver.py | 375 ++++++++++++++---- .../test_azure_openai_chat_prompt_driver.py | 96 ++++- .../prompt/test_cohere_prompt_driver.py | 175 +++++++- .../prompt/test_google_prompt_driver.py | 225 ++++++++--- .../test_hugging_face_hub_prompt_driver.py | 3 +- .../prompt/test_openai_chat_prompt_driver.py | 267 +++++++++++-- tests/unit/tasks/test_actions_subtask.py | 75 +++- tests/unit/tasks/test_toolkit_task.py | 11 +- tests/unit/tools/test_base_tool.py | 7 +- tests/unit/utils/test_dict_utils.py | 9 +- 64 files changed, 2930 insertions(+), 575 deletions(-) create mode 100644 griptape/artifacts/action_artifact.py create mode 100644 griptape/common/actions/__init__.py create mode 100644 griptape/common/actions/base_action.py create mode 100644 griptape/common/actions/tool_action.py create mode 100644 griptape/common/prompt_stack/contents/action_call_delta_message_content.py create mode 100644 griptape/common/prompt_stack/contents/action_call_message_content.py create mode 100644 griptape/common/prompt_stack/contents/action_result_message_content.py create mode 100644 tests/unit/artifacts/test_action_artifact.py create mode 100644 tests/unit/common/__init__.py create mode 100644 tests/unit/common/contents/test_action_call_delta_message_content.py create mode 100644 tests/unit/common/contents/test_action_call_message_content.py create mode 100644 tests/unit/common/contents/test_action_result_message_content.py create mode 100644 tests/unit/common/contents/test_base_message_content.py create mode 100644 tests/unit/common/contents/test_image_message_content.py create mode 100644 tests/unit/common/contents/test_text_delta_message_content.py create mode 100644 tests/unit/common/contents/test_text_message_content.py create mode 100644 tests/unit/common/test_action.py create mode 100644 tests/unit/common/test_prompt_stack.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d2b2d7998..82eaeef3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added +- Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, and `CoherePromptDriver`. - `OllamaEmbeddingDriver` for generating embeddings with Ollama. ### Changed diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index a846cbb5b..cdb90aef5 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -61,6 +61,9 @@ Griptape offers the following Prompt Drivers for interacting with LLMs. ### OpenAI Chat +!!! info + This driver uses [OpenAi function calling](https://platform.openai.com/docs/guides/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + The [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat_prompt_driver.md) connects to the [OpenAI Chat](https://platform.openai.com/docs/guides/chat) API. ```python @@ -96,6 +99,9 @@ agent.run("Blue sky at dusk.") ### Azure OpenAI Chat +!!! info + This driver uses [Azure OpenAi function calling](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + The [AzureOpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/azure_openai_chat_prompt_driver.md) connects to Azure OpenAI [Chat Completion](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference) APIs. ```python @@ -132,6 +138,9 @@ The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_d !!! info This driver requires the `drivers-prompt-cohere` [extra](../index.md#extras). +!!! info + This driver uses [Cohere tool use](https://docs.cohere.com/docs/tools) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + ```python import os from griptape.structures import Agent @@ -155,6 +164,9 @@ agent.run('What is the sentiment of this review? Review: "I really enjoyed this !!! info This driver requires the `drivers-prompt-anthropic` [extra](../index.md#extras). +!!! info + This driver uses [Anthropic tool use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + The [AnthropicPromptDriver](../../reference/griptape/drivers/prompt/anthropic_prompt_driver.md) connects to the Anthropic [Messages](https://docs.anthropic.com/claude/reference/messages_post) API. ```python @@ -180,6 +192,9 @@ agent.run('Where is the best place to see cherry blossums in Japan?') !!! info This driver requires the `drivers-prompt-google` [extra](../index.md#extras). +!!! info + This driver uses [Gemini function calling](https://ai.google.dev/gemini-api/docs/function-calling) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + The [GooglePromptDriver](../../reference/griptape/drivers/prompt/google_prompt_driver.md) connects to the [Google Generative AI](https://ai.google.dev/tutorials/python_quickstart#generate_text_from_text_inputs) API. ```python @@ -205,6 +220,9 @@ agent.run('Briefly explain how a computer works to a young child.') !!! info This driver requires the `drivers-prompt-amazon-bedrock` [extra](../index.md#extras). +!!! info + This drivers uses [Bedrock tool use](https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html) when using [Tools](../tools/index.md). You can change this to use Griptape's own tool calling implementation by setting `use_native_tools` to `False`. + The [AmazonBedrockPromptDriver](../../reference/griptape/drivers/prompt/amazon_bedrock_prompt_driver.md) uses [Amazon Bedrock](https://aws.amazon.com/bedrock/)'s [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html). All models supported by the Converse API are available for use with this driver. diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index 2d3645e94..851b5f382 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -244,7 +244,7 @@ from griptape.events import BaseEvent, StartPromptEvent, EventListener def handler(event: BaseEvent): if isinstance(event, StartPromptEvent): - print("Prompt Stack PromptStack:") + print("Prompt Stack Messages:") for message in event.prompt_stack.messages: print(f"{message.role}: {message.content}") print("Final Prompt String:") diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 4d604a77c..05fc94501 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -1,11 +1,10 @@ ## Overview -One of the most powerful features of Griptape is the ability for Toolkit Tasks to generate _chains of thought_ (CoT) and use tools that can interact with the outside world. We use the [ReAct](https://arxiv.org/abs/2210.03629) technique to implement CoT reasoning and acting in the underlying LLMs without using any fine-tuning. - -Griptape implements the reasoning loop in the Toolkit Tasks and integrates Griptape Tools natively. +One of the most powerful features of Griptape is the ability to use tools that can interact with the outside world. +Many of our [Prompt Drivers](../drivers/prompt-drivers.md) leverage the native function calling built into the LLMs. For LLMs that don't support this, Griptape provides its own implementation using the [ReAct](https://arxiv.org/abs/2210.03629) technique. ## Tools -Here is an example of a pipeline using tools: +Here is an example of a Pipeline using Tools: ```python from griptape.tasks import ToolkitTask diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index 00c19519f..51525f60d 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -9,6 +9,7 @@ from .media_artifact import MediaArtifact from .image_artifact import ImageArtifact from .audio_artifact import AudioArtifact +from .action_artifact import ActionArtifact __all__ = [ @@ -23,4 +24,5 @@ "MediaArtifact", "ImageArtifact", "AudioArtifact", + "ActionArtifact", ] diff --git a/griptape/artifacts/action_artifact.py b/griptape/artifacts/action_artifact.py new file mode 100644 index 000000000..210e24f9f --- /dev/null +++ b/griptape/artifacts/action_artifact.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from attrs import define, field +from typing import TYPE_CHECKING + +from griptape.artifacts import BaseArtifact +from griptape.mixins import SerializableMixin + +if TYPE_CHECKING: + from griptape.common import ToolAction + + +@define() +class ActionArtifact(BaseArtifact, SerializableMixin): + value: ToolAction = field(metadata={"serializable": True}) + + def __add__(self, other: BaseArtifact) -> ActionArtifact: + raise NotImplementedError diff --git a/griptape/common/__init__.py b/griptape/common/__init__.py index 6e357323a..8324bcb9d 100644 --- a/griptape/common/__init__.py +++ b/griptape/common/__init__.py @@ -1,8 +1,14 @@ +from .actions.base_action import BaseAction +from .actions.tool_action import ToolAction + from .prompt_stack.contents.base_message_content import BaseMessageContent from .prompt_stack.contents.base_delta_message_content import BaseDeltaMessageContent from .prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent from .prompt_stack.contents.text_message_content import TextMessageContent from .prompt_stack.contents.image_message_content import ImageMessageContent +from .prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent +from .prompt_stack.contents.action_call_message_content import ActionCallMessageContent +from .prompt_stack.contents.action_result_message_content import ActionResultMessageContent from .prompt_stack.messages.base_message import BaseMessage from .prompt_stack.messages.delta_message import DeltaMessage @@ -12,6 +18,7 @@ from .reference import Reference + __all__ = [ "BaseMessage", "BaseDeltaMessageContent", @@ -21,6 +28,11 @@ "TextDeltaMessageContent", "TextMessageContent", "ImageMessageContent", + "ActionCallDeltaMessageContent", + "ActionCallMessageContent", + "ActionResultMessageContent", "PromptStack", "Reference", + "BaseAction", + "ToolAction", ] diff --git a/griptape/common/actions/__init__.py b/griptape/common/actions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/common/actions/base_action.py b/griptape/common/actions/base_action.py new file mode 100644 index 000000000..6bfda8f30 --- /dev/null +++ b/griptape/common/actions/base_action.py @@ -0,0 +1,5 @@ +from griptape.mixins import SerializableMixin +from abc import ABC + + +class BaseAction(SerializableMixin, ABC): ... diff --git a/griptape/common/actions/tool_action.py b/griptape/common/actions/tool_action.py new file mode 100644 index 000000000..db1e29f74 --- /dev/null +++ b/griptape/common/actions/tool_action.py @@ -0,0 +1,54 @@ +from __future__ import annotations +import json +from typing import TYPE_CHECKING, Optional + +from attrs import define, field + +from griptape.artifacts import BaseArtifact +from griptape.common import BaseAction + +if TYPE_CHECKING: + from griptape.tools import BaseTool + + +@define(kw_only=True) +class ToolAction(BaseAction): + """Represents an instance of an LLM using a Tool. + + Attributes: + tag: The tag (unique identifier) of the action. + name: The name (Tool name) of the action. + path: The path (Tool activity name) of the action. + input: The input (Tool params) of the action. + tool: The matched Tool of the action. + output: The output (Tool result) of the action. + """ + + tag: str = field(metadata={"serializable": True}) + name: str = field(metadata={"serializable": True}) + path: Optional[str] = field(default=None, metadata={"serializable": True}) + input: dict = field(factory=dict, metadata={"serializable": True}) + tool: Optional[BaseTool] = field(default=None) + output: Optional[BaseArtifact] = field(default=None) + + def __str__(self) -> str: + return json.dumps(self.to_dict()) + + def to_native_tool_name(self) -> str: + parts = [self.name] + + if self.path is not None: + parts.append(self.path) + + return "_".join(parts) + + @classmethod + def from_native_tool_name(cls, native_tool_name: str) -> tuple[str, Optional[str]]: + parts = native_tool_name.split("_", 1) + + if len(parts) == 1: + name, path = parts[0], None + else: + name, path = parts + + return name, path diff --git a/griptape/common/prompt_stack/contents/action_call_delta_message_content.py b/griptape/common/prompt_stack/contents/action_call_delta_message_content.py new file mode 100644 index 000000000..5e86aa164 --- /dev/null +++ b/griptape/common/prompt_stack/contents/action_call_delta_message_content.py @@ -0,0 +1,31 @@ +from __future__ import annotations +from attrs import define, field +from typing import Optional + +from griptape.common import BaseDeltaMessageContent + + +@define +class ActionCallDeltaMessageContent(BaseDeltaMessageContent): + tag: Optional[str] = field(default=None, metadata={"serializable": True}) + name: Optional[str] = field(default=None, metadata={"serializable": True}) + path: Optional[str] = field(default=None, metadata={"serializable": True}) + partial_input: Optional[str] = field(default=None, metadata={"serializable": True}) + + def __str__(self) -> str: + parts = [] + + if self.name: + parts.append(self.name) + if self.path: + parts.append(f".{self.path}") + if self.tag: + parts.append(f" ({self.tag})") + + if self.partial_input: + if parts: + parts.append(f" {self.partial_input}") + else: + parts.append(self.partial_input) + + return "".join(parts) diff --git a/griptape/common/prompt_stack/contents/action_call_message_content.py b/griptape/common/prompt_stack/contents/action_call_message_content.py new file mode 100644 index 000000000..9f8082d72 --- /dev/null +++ b/griptape/common/prompt_stack/contents/action_call_message_content.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +import json +from collections.abc import Sequence + +from attrs import define, field + +from griptape.common import ToolAction +from griptape.artifacts import ActionArtifact +from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ActionCallDeltaMessageContent + + +@define +class ActionCallMessageContent(BaseMessageContent): + artifact: ActionArtifact = field(metadata={"serializable": True}) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> ActionCallMessageContent: + action_call_deltas = [delta for delta in deltas if isinstance(delta, ActionCallDeltaMessageContent)] + + tag = None + name = None + path = None + input = "" + + for delta in action_call_deltas: + if delta.tag is not None: + tag = delta.tag + if delta.name is not None: + name = delta.name + if delta.path is not None: + path = delta.path + if delta.partial_input is not None: + input += delta.partial_input + + if tag is not None and name is not None and path is not None: + try: + parsed_input = json.loads(input) + except json.JSONDecodeError as exc: + raise ValueError("Invalid JSON input for ToolAction") from exc + action = ToolAction(tag=tag, name=name, path=path, input=parsed_input) + else: + raise ValueError("Missing required fields for ToolAction") + + artifact = ActionArtifact(value=action) + + return cls(artifact=artifact) diff --git a/griptape/common/prompt_stack/contents/action_result_message_content.py b/griptape/common/prompt_stack/contents/action_result_message_content.py new file mode 100644 index 000000000..871649aea --- /dev/null +++ b/griptape/common/prompt_stack/contents/action_result_message_content.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from collections.abc import Sequence + +from attrs import define, field + +from griptape.artifacts import BaseArtifact +from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ToolAction + + +@define +class ActionResultMessageContent(BaseMessageContent): + artifact: BaseArtifact = field(metadata={"serializable": True}) + action: ToolAction = field(metadata={"serializable": True}) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> ActionResultMessageContent: + raise NotImplementedError diff --git a/griptape/common/prompt_stack/contents/base_message_content.py b/griptape/common/prompt_stack/contents/base_message_content.py index 28a9e317e..f24f5229b 100644 --- a/griptape/common/prompt_stack/contents/base_message_content.py +++ b/griptape/common/prompt_stack/contents/base_message_content.py @@ -1,5 +1,6 @@ from __future__ import annotations -from abc import ABC + +from abc import ABC, abstractmethod from collections.abc import Sequence from typing import TYPE_CHECKING from attrs import define, field @@ -14,9 +15,6 @@ class BaseMessageContent(ABC, SerializableMixin): artifact: BaseArtifact = field(metadata={"serializable": True}) - def to_text(self) -> str: - return str(self.artifact) - def __str__(self) -> str: return self.artifact.to_text() @@ -26,5 +24,9 @@ def __bool__(self) -> bool: def __len__(self) -> int: return len(self.artifact) + def to_text(self) -> str: + return str(self.artifact) + @classmethod + @abstractmethod def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> BaseMessageContent: ... diff --git a/griptape/common/prompt_stack/messages/delta_message.py b/griptape/common/prompt_stack/messages/delta_message.py index 7ff90b08f..a540d205c 100644 --- a/griptape/common/prompt_stack/messages/delta_message.py +++ b/griptape/common/prompt_stack/messages/delta_message.py @@ -1,10 +1,10 @@ from __future__ import annotations + from typing import Optional from attrs import define, field -from griptape.common.prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent - +from griptape.common import BaseDeltaMessageContent from .base_message import BaseMessage @@ -12,4 +12,4 @@ @define class DeltaMessage(BaseMessage): role: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - content: Optional[TextDeltaMessageContent] = field(kw_only=True, default=None, metadata={"serializable": True}) + content: Optional[BaseDeltaMessageContent] = field(kw_only=True, default=None, metadata={"serializable": True}) diff --git a/griptape/common/prompt_stack/messages/message.py b/griptape/common/prompt_stack/messages/message.py index fcf6750ea..8bc6f63e2 100644 --- a/griptape/common/prompt_stack/messages/message.py +++ b/griptape/common/prompt_stack/messages/message.py @@ -1,14 +1,16 @@ from __future__ import annotations -from typing import Any +from typing import Any, TypeVar from attrs import define, field -from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact +from griptape.artifacts import TextArtifact, ListArtifact, BaseArtifact from griptape.common import BaseMessageContent, TextMessageContent from .base_message import BaseMessage +T = TypeVar("T", bound=BaseMessageContent) + @define class Message(BaseMessage): @@ -26,6 +28,18 @@ def value(self) -> Any: def __str__(self) -> str: return self.to_text() + def has_all_content_type(self, content_type: type[T]) -> bool: + return all(isinstance(content, content_type) for content in self.content) + + def has_any_content_type(self, content_type: type[T]) -> bool: + return any(isinstance(content, content_type) for content in self.content) + + def get_content_type(self, content_type: type[T]) -> list[T]: + return [content for content in self.content if isinstance(content, content_type)] + + def is_text(self) -> bool: + return all(isinstance(content, TextMessageContent) for content in self.content) + def to_text(self) -> str: return "".join( [content.artifact.to_text() for content in self.content if isinstance(content, TextMessageContent)] diff --git a/griptape/common/prompt_stack/prompt_stack.py b/griptape/common/prompt_stack/prompt_stack.py index ce19696e3..8bbe98161 100644 --- a/griptape/common/prompt_stack/prompt_stack.py +++ b/griptape/common/prompt_stack/prompt_stack.py @@ -1,14 +1,28 @@ from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact, ImageArtifact +from griptape.artifacts import ActionArtifact, BaseArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.common import ( + ActionCallMessageContent, + ActionResultMessageContent, + BaseMessageContent, + ImageMessageContent, + Message, + TextMessageContent, +) from griptape.mixins import SerializableMixin -from griptape.common import Message, TextMessageContent, BaseMessageContent, ImageMessageContent + +if TYPE_CHECKING: + from griptape.tools import BaseTool @define class PromptStack(SerializableMixin): messages: list[Message] = field(factory=list, kw_only=True, metadata={"serializable": True}) + tools: list[BaseTool] = field(factory=list, kw_only=True) @property def system_messages(self) -> list[Message]: @@ -23,9 +37,9 @@ def assistant_messages(self) -> list[Message]: return [message for message in self.messages if message.is_assistant()] def add_message(self, artifact: str | BaseArtifact, role: str) -> Message: - new_content = self.__process_artifact(artifact) + content = self.__to_message_content(artifact) - self.messages.append(Message(content=new_content, role=role)) + self.messages.append(Message(content=content, role=role)) return self.messages[-1] @@ -38,15 +52,22 @@ def add_user_message(self, artifact: str | BaseArtifact) -> Message: def add_assistant_message(self, artifact: str | BaseArtifact) -> Message: return self.add_message(artifact, Message.ASSISTANT_ROLE) - def __process_artifact(self, artifact: str | BaseArtifact) -> list[BaseMessageContent]: + def __to_message_content(self, artifact: str | BaseArtifact) -> list[BaseMessageContent]: if isinstance(artifact, str): return [TextMessageContent(TextArtifact(artifact))] elif isinstance(artifact, TextArtifact): return [TextMessageContent(artifact)] elif isinstance(artifact, ImageArtifact): return [ImageMessageContent(artifact)] + elif isinstance(artifact, ActionArtifact): + action = artifact.value + output = action.output + if output is None: + return [ActionCallMessageContent(artifact)] + else: + return [ActionResultMessageContent(output, action=action)] elif isinstance(artifact, ListArtifact): - processed_contents = [self.__process_artifact(artifact) for artifact in artifact.value] + processed_contents = [self.__to_message_content(artifact) for artifact in artifact.value] flattened_content = [ sub_content for processed_content in processed_contents for sub_content in processed_content ] diff --git a/griptape/config/anthropic_structure_config.py b/griptape/config/anthropic_structure_config.py index 28bb5f657..58db8d476 100644 --- a/griptape/config/anthropic_structure_config.py +++ b/griptape/config/anthropic_structure_config.py @@ -33,7 +33,7 @@ class AnthropicStructureConfig(StructureConfig): metadata={"serializable": True}, ) image_query_driver: BaseImageQueryDriver = field( - default=Factory(lambda: AnthropicImageQueryDriver(model="claude-3-opus-20240229")), + default=Factory(lambda: AnthropicImageQueryDriver(model="claude-3-5-sonnet-20240620")), kw_only=True, metadata={"serializable": True}, ) diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 21d81724d..8a1072716 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -4,15 +4,29 @@ from typing import TYPE_CHECKING, Any from attrs import Factory, define, field - -from griptape.artifacts import TextArtifact +from schema import Schema + +from griptape.artifacts import ( + ActionArtifact, + BaseArtifact, + ErrorArtifact, + ImageArtifact, + InfoArtifact, + ListArtifact, + TextArtifact, +) from griptape.common import ( + ActionCallDeltaMessageContent, + ActionCallMessageContent, + ActionResultMessageContent, + BaseDeltaMessageContent, + BaseMessageContent, DeltaMessage, + ImageMessageContent, Message, TextDeltaMessageContent, - BaseMessageContent, TextMessageContent, - ImageMessageContent, + ToolAction, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AmazonBedrockTokenizer, BaseTokenizer @@ -22,6 +36,7 @@ import boto3 from griptape.common import PromptStack + from griptape.tools import BaseTool @define @@ -34,6 +49,8 @@ class AmazonBedrockPromptDriver(BasePromptDriver): tokenizer: BaseTokenizer = field( default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True ) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) + tool_choice: dict = field(default=Factory(lambda: {"auto": {}}), kw_only=True, metadata={"serializable": True}) def try_run(self, prompt_stack: PromptStack) -> Message: response = self.bedrock_client.converse(**self._base_params(prompt_stack)) @@ -42,7 +59,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: output_message = response["output"]["message"] return Message( - content=[TextMessageContent(TextArtifact(content["text"])) for content in output_message["content"]], + content=[self.__to_prompt_stack_message_content(content) for content in output_message["content"]], role=Message.ASSISTANT_ROLE, usage=Message.Usage(input_tokens=usage["inputTokens"], output_tokens=usage["outputTokens"]), ) @@ -53,13 +70,8 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: stream = response.get("stream") if stream is not None: for event in stream: - if "contentBlockDelta" in event: - content_block_delta = event["contentBlockDelta"] - yield DeltaMessage( - content=TextDeltaMessageContent( - content_block_delta["delta"]["text"], index=content_block_delta["contentBlockIndex"] - ) - ) + if "contentBlockDelta" in event or "contentBlockStart" in event: + yield DeltaMessage(content=self.__to_prompt_stack_delta_message_content(event)) elif "metadata" in event: usage = event["metadata"]["usage"] yield DeltaMessage( @@ -68,21 +80,10 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: else: raise Exception("model response is empty") - def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: - return [ - { - "role": self.__to_role(message), - "content": [self.__prompt_stack_content_message_content(content) for content in message.content], - } - for message in messages - ] - def _base_params(self, prompt_stack: PromptStack) -> dict: system_messages = [{"text": message.to_text()} for message in prompt_stack.system_messages] - messages = self._prompt_stack_messages_to_messages( - [message for message in prompt_stack.messages if not message.is_system()] - ) + messages = self.__to_bedrock_messages([message for message in prompt_stack.messages if not message.is_system()]) return { "modelId": self.model, @@ -90,18 +91,135 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "system": system_messages, "inferenceConfig": {"temperature": self.temperature}, "additionalModelRequestFields": self.additional_model_request_fields, + **( + {"toolConfig": {"tools": self.__to_bedrock_tools(prompt_stack.tools), "toolChoice": self.tool_choice}} + if prompt_stack.tools and self.use_native_tools + else {} + ), } - def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + def __to_bedrock_messages(self, messages: list[Message]) -> list[dict]: + return [ + { + "role": self.__to_bedrock_role(message), + "content": [self.__to_bedrock_message_content(content) for content in message.content], + } + for message in messages + ] + + def __to_bedrock_role(self, message: Message) -> str: + if message.is_assistant(): + return "assistant" + else: + return "user" + + def __to_bedrock_tools(self, tools: list[BaseTool]) -> list[dict]: + return [ + { + "toolSpec": { + "name": f"{tool.name}_{tool.activity_name(activity)}", + "description": tool.activity_description(activity), + "inputSchema": { + "json": (tool.activity_schema(activity) or Schema({})).json_schema( + "http://json-schema.org/draft-07/schema#" + ) + }, + } + } + for tool in tools + for activity in tool.activities() + ] + + def __to_bedrock_message_content(self, content: BaseMessageContent) -> dict: if isinstance(content, TextMessageContent): return {"text": content.artifact.to_text()} elif isinstance(content, ImageMessageContent): - return {"image": {"format": content.artifact.format, "source": {"bytes": content.artifact.value}}} + artifact = content.artifact + + return {"image": {"format": artifact.format, "source": {"bytes": artifact.value}}} + elif isinstance(content, ActionCallMessageContent): + action_call = content.artifact.value + + return { + "toolUse": { + "toolUseId": action_call.tag, + "name": f"{action_call.name}_{action_call.path}", + "input": action_call.input, + } + } + elif isinstance(content, ActionResultMessageContent): + artifact = content.artifact + + if isinstance(artifact, ListArtifact): + message_content = [self.__to_bedrock_tool_use_content(artifact) for artifact in artifact.value] + else: + message_content = [self.__to_bedrock_tool_use_content(artifact)] + + return { + "toolResult": { + "toolUseId": content.action.tag, + "content": message_content, + "status": "error" if isinstance(artifact, ErrorArtifact) else "success", + } + } else: raise ValueError(f"Unsupported content type: {type(content)}") - def __to_role(self, message: Message) -> str: - if message.is_assistant(): - return "assistant" + def __to_bedrock_tool_use_content(self, artifact: BaseArtifact) -> dict: + if isinstance(artifact, ImageArtifact): + return {"image": {"format": artifact.format, "source": {"bytes": artifact.value}}} + elif isinstance(artifact, (TextArtifact, ErrorArtifact, InfoArtifact)): + return {"text": artifact.to_text()} else: - return "user" + raise ValueError(f"Unsupported artifact type: {type(artifact)}") + + def __to_prompt_stack_message_content(self, content: dict) -> BaseMessageContent: + if "text" in content: + return TextMessageContent(TextArtifact(content["text"])) + elif "toolUse" in content: + name, path = ToolAction.from_native_tool_name(content["toolUse"]["name"]) + return ActionCallMessageContent( + artifact=ActionArtifact( + value=ToolAction( + tag=content["toolUse"]["toolUseId"], name=name, path=path, input=content["toolUse"]["input"] + ) + ) + ) + else: + raise ValueError(f"Unsupported message content type: {content}") + + def __to_prompt_stack_delta_message_content(self, event: dict) -> BaseDeltaMessageContent: + if "contentBlockStart" in event: + content_block = event["contentBlockStart"]["start"] + + if "toolUse" in content_block: + name, path = ToolAction.from_native_tool_name(content_block["toolUse"]["name"]) + + return ActionCallDeltaMessageContent( + index=event["contentBlockStart"]["contentBlockIndex"], + tag=content_block["toolUse"]["toolUseId"], + name=name, + path=path, + ) + elif "text" in content_block: + return TextDeltaMessageContent( + content_block["text"], index=event["contentBlockStart"]["contentBlockIndex"] + ) + else: + raise ValueError(f"Unsupported message content type: {event}") + elif "contentBlockDelta" in event: + content_block_delta = event["contentBlockDelta"] + + if "text" in content_block_delta["delta"]: + return TextDeltaMessageContent( + content_block_delta["delta"]["text"], index=content_block_delta["contentBlockIndex"] + ) + elif "toolUse" in content_block_delta["delta"]: + return ActionCallDeltaMessageContent( + index=content_block_delta["contentBlockIndex"], + partial_input=content_block_delta["delta"]["toolUse"]["input"], + ) + else: + raise ValueError(f"Unsupported message content type: {event}") + else: + raise ValueError(f"Unsupported message content type: {event}") diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 2c338c84c..21fdc841c 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -1,18 +1,32 @@ from __future__ import annotations from collections.abc import Iterator -from typing import Any, Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field - -from griptape.artifacts import TextArtifact +from schema import Schema + +from griptape.artifacts import ( + ActionArtifact, + BaseArtifact, + ErrorArtifact, + ImageArtifact, + InfoArtifact, + ListArtifact, + TextArtifact, +) from griptape.common import ( + ActionCallMessageContent, + ActionResultMessageContent, + BaseDeltaMessageContent, BaseMessageContent, + ActionCallDeltaMessageContent, DeltaMessage, TextDeltaMessageContent, ImageMessageContent, PromptStack, Message, + ToolAction, TextMessageContent, ) from griptape.drivers import BasePromptDriver @@ -20,8 +34,10 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from anthropic.types import ContentBlockDeltaEvent - from anthropic.types import ContentBlock + from anthropic import Client + from anthropic.types import ContentBlock, ContentBlockDeltaEvent, ContentBlockStartEvent + + from griptape.tools.base_tool import BaseTool @define @@ -35,7 +51,7 @@ class AnthropicPromptDriver(BasePromptDriver): api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) - client: Any = field( + client: Client = field( default=Factory( lambda self: import_optional_dependency("anthropic").Anthropic(api_key=self.api_key), takes_self=True ), @@ -46,13 +62,15 @@ class AnthropicPromptDriver(BasePromptDriver): ) top_p: float = field(default=0.999, kw_only=True, metadata={"serializable": True}) top_k: int = field(default=250, kw_only=True, metadata={"serializable": True}) + tool_choice: dict = field(default=Factory(lambda: {"type": "auto"}), kw_only=True, metadata={"serializable": False}) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) max_tokens: int = field(default=1000, kw_only=True, metadata={"serializable": True}) def try_run(self, prompt_stack: PromptStack) -> Message: response = self.client.messages.create(**self._base_params(prompt_stack)) return Message( - content=[self.__message_content_to_prompt_stack_content(content) for content in response.content], + content=[self.__to_prompt_stack_message_content(content) for content in response.content], role=Message.ASSISTANT_ROLE, usage=Message.Usage(input_tokens=response.usage.input_tokens, output_tokens=response.usage.output_tokens), ) @@ -61,20 +79,15 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: events = self.client.messages.create(**self._base_params(prompt_stack), stream=True) for event in events: - if event.type == "content_block_delta": - yield DeltaMessage(content=self.__message_content_delta_to_prompt_stack_content_delta(event)) + if event.type == "content_block_delta" or event.type == "content_block_start": + yield DeltaMessage(content=self.__to_prompt_stack_delta_message_content(event)) elif event.type == "message_start": yield DeltaMessage(usage=DeltaMessage.Usage(input_tokens=event.message.usage.input_tokens)) elif event.type == "message_delta": yield DeltaMessage(usage=DeltaMessage.Usage(output_tokens=event.usage.output_tokens)) - def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: - return [{"role": self.__to_role(message), "content": self.__to_content(message)} for message in messages] - def _base_params(self, prompt_stack: PromptStack) -> dict: - messages = self._prompt_stack_messages_to_messages( - [message for message in prompt_stack.messages if not message.is_system()] - ) + messages = self.__to_anthropic_messages([i for i in prompt_stack.messages if not i.is_system()]) system_messages = prompt_stack.system_messages system_message = system_messages[0].to_text() if system_messages else None @@ -87,44 +100,121 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "top_k": self.top_k, "max_tokens": self.max_tokens, "messages": messages, + **( + {"tools": self.__to_anthropic_tools(prompt_stack.tools), "tool_choice": self.tool_choice} + if prompt_stack.tools and self.use_native_tools + else {} + ), **({"system": system_message} if system_message else {}), } - def __to_role(self, message: Message) -> str: + def __to_anthropic_messages(self, messages: list[Message]) -> list[dict]: + return [ + {"role": self.__to_anthropic_role(message), "content": self.__to_anthropic_content(message)} + for message in messages + ] + + def __to_anthropic_role(self, message: Message) -> str: if message.is_assistant(): return "assistant" else: return "user" - def __to_content(self, message: Message) -> str | list[dict]: - if all(isinstance(content, TextMessageContent) for content in message.content): + def __to_anthropic_tools(self, tools: list[BaseTool]) -> list[dict]: + return [ + { + "name": f"{tool.name}_{tool.activity_name(activity)}", + "description": tool.activity_description(activity), + "input_schema": (tool.activity_schema(activity) or Schema({})).json_schema("Input Schema"), + } + for tool in tools + for activity in tool.activities() + ] + + def __to_anthropic_content(self, message: Message) -> str | list[dict]: + if message.has_all_content_type(TextMessageContent): return message.to_text() else: - return [self.__prompt_stack_content_message_content(content) for content in message.content] + return [self.__to_anthropic_message_content(content) for content in message.content] - def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + def __to_anthropic_message_content(self, content: BaseMessageContent) -> dict: if isinstance(content, TextMessageContent): - return {"type": "text", "text": content.artifact.to_text()} + return {"type": "text", "text": content.artifact.value} elif isinstance(content, ImageMessageContent): + artifact = content.artifact + return { "type": "image", - "source": {"type": "base64", "media_type": content.artifact.mime_type, "data": content.artifact.base64}, + "source": {"type": "base64", "media_type": artifact.mime_type, "data": artifact.base64}, + } + elif isinstance(content, ActionCallMessageContent): + action = content.artifact.value + + return {"type": "tool_use", "id": action.tag, "name": action.to_native_tool_name(), "input": action.input} + elif isinstance(content, ActionResultMessageContent): + artifact = content.artifact + + if isinstance(artifact, ListArtifact): + message_content = [self.__to_anthropic_tool_result_content(artifact) for artifact in artifact.value] + else: + message_content = [self.__to_anthropic_tool_result_content(artifact)] + + return { + "type": "tool_result", + "tool_use_id": content.action.tag, + "content": message_content, + "is_error": isinstance(artifact, ErrorArtifact), } else: raise ValueError(f"Unsupported prompt content type: {type(content)}") - def __message_content_to_prompt_stack_content(self, content: ContentBlock) -> BaseMessageContent: + def __to_anthropic_tool_result_content(self, artifact: BaseArtifact) -> dict: + if isinstance(artifact, ImageArtifact): + return { + "type": "image", + "source": {"type": "base64", "media_type": artifact.mime_type, "data": artifact.base64}, + } + elif isinstance(artifact, (TextArtifact, ErrorArtifact, InfoArtifact)): + return {"type": "text", "text": artifact.to_text()} + else: + raise ValueError(f"Unsupported tool result artifact type: {type(artifact)}") + + def __to_prompt_stack_message_content(self, content: ContentBlock) -> BaseMessageContent: if content.type == "text": return TextMessageContent(TextArtifact(content.text)) + elif content.type == "tool_use": + name, path = ToolAction.from_native_tool_name(content.name) + + return ActionCallMessageContent( + artifact=ActionArtifact( + value=ToolAction(tag=content.id, name=name, path=path, input=content.input) # pyright: ignore[reportArgumentType] + ) + ) else: raise ValueError(f"Unsupported message content type: {content.type}") - def __message_content_delta_to_prompt_stack_content_delta( - self, content_delta: ContentBlockDeltaEvent - ) -> TextDeltaMessageContent: - index = content_delta.index - - if content_delta.delta.type == "text_delta": - return TextDeltaMessageContent(content_delta.delta.text, index=index) + def __to_prompt_stack_delta_message_content( + self, event: ContentBlockDeltaEvent | ContentBlockStartEvent + ) -> BaseDeltaMessageContent: + if event.type == "content_block_start": + content_block = event.content_block + + if content_block.type == "tool_use": + name, path = ToolAction.from_native_tool_name(content_block.name) + + return ActionCallDeltaMessageContent(index=event.index, tag=content_block.id, name=name, path=path) + elif content_block.type == "text": + return TextDeltaMessageContent(content_block.text, index=event.index) + else: + raise ValueError(f"Unsupported content block type: {content_block.type}") + elif event.type == "content_block_delta": + content_block_delta = event.delta + + if content_block_delta.type == "text_delta": + return TextDeltaMessageContent(content_block_delta.text, index=event.index) + elif content_block_delta.type == "input_json_delta": + return ActionCallDeltaMessageContent(index=event.index, partial_input=content_block_delta.partial_json) + else: + raise ValueError(f"Unsupported message content type: {event}") else: - raise ValueError(f"Unsupported message content delta type : {content_delta.delta.type}") + raise ValueError(f"Unsupported message content type: {event}") diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index b499179ed..ea785d045 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -7,7 +7,9 @@ from attrs import Factory, define, field from griptape.common import ( + ActionCallMessageContent, BaseDeltaMessageContent, + ActionCallDeltaMessageContent, DeltaMessage, TextDeltaMessageContent, PromptStack, @@ -35,6 +37,7 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: The model name. tokenizer: An instance of `BaseTokenizer` to when calculating tokens. stream: Whether to stream the completion or not. `CompletionChunkEvent`s will be published to the `Structure` if one is provided. + use_native_tools: Whether to use LLM's native function calling capabilities. Must be supported by the model. """ temperature: float = field(default=0.1, metadata={"serializable": True}) @@ -43,7 +46,8 @@ class BasePromptDriver(SerializableMixin, ExponentialBackoffMixin, ABC): ignored_exception_types: tuple[type[Exception], ...] = field(default=Factory(lambda: (ImportError, ValueError))) model: str = field(metadata={"serializable": True}) tokenizer: BaseTokenizer - stream: bool = field(default=False, metadata={"serializable": True}) + stream: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + use_native_tools: bool = field(default=False, kw_only=True, metadata={"serializable": True}) def before_run(self, prompt_stack: PromptStack) -> None: if self.structure: @@ -114,25 +118,34 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: usage = DeltaMessage.Usage() # Aggregate all content deltas from the stream - deltas = self.try_stream(prompt_stack) - for delta in deltas: - usage += delta.usage - - if delta.content is not None: - if delta.content.index in delta_contents: - delta_contents[delta.content.index].append(delta.content) + message_deltas = self.try_stream(prompt_stack) + for message_delta in message_deltas: + usage += message_delta.usage + content = message_delta.content + + if content is not None: + if content.index in delta_contents: + delta_contents[content.index].append(content) else: - delta_contents[delta.content.index] = [delta.content] - - if isinstance(delta.content, TextDeltaMessageContent): - self.structure.publish_event(CompletionChunkEvent(token=delta.content.text)) + delta_contents[content.index] = [content] + if isinstance(content, TextDeltaMessageContent): + self.structure.publish_event(CompletionChunkEvent(token=content.text)) + elif isinstance(content, ActionCallDeltaMessageContent): + if content.tag is not None and content.name is not None and content.path is not None: + self.structure.publish_event(CompletionChunkEvent(token=str(content))) + elif content.partial_input is not None: + self.structure.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas content = [] - for deltas in delta_contents.values(): - text_deltas = [delta for delta in deltas if isinstance(delta, TextDeltaMessageContent)] + for delta_content in delta_contents.values(): + text_deltas = [delta for delta in delta_content if isinstance(delta, TextDeltaMessageContent)] + action_deltas = [delta for delta in delta_content if isinstance(delta, ActionCallDeltaMessageContent)] + if text_deltas: content.append(TextMessageContent.from_deltas(text_deltas)) + if action_deltas: + content.append(ActionCallMessageContent.from_deltas(action_deltas)) result = Message( content=content, diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index b00abd855..a07489005 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,23 +1,32 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from collections.abc import Iterator from attrs import define, field, Factory from griptape.artifacts import TextArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.common.prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import CohereTokenizer +from griptape.artifacts import ActionArtifact from griptape.common import ( + ActionCallMessageContent, + BaseDeltaMessageContent, + BaseMessageContent, + DeltaMessage, + TextDeltaMessageContent, PromptStack, Message, - DeltaMessage, TextMessageContent, - BaseMessageContent, - TextDeltaMessageContent, + ActionResultMessageContent, + ToolAction, ) from griptape.utils import import_optional_dependency from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: from cohere import Client + from cohere.types import NonStreamedChatResponse + from griptape.tools import BaseTool @define(kw_only=True) @@ -37,13 +46,15 @@ class CoherePromptDriver(BasePromptDriver): tokenizer: BaseTokenizer = field( default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True) ) + force_single_step: bool = field(default=False, kw_only=True, metadata={"serializable": True}) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) def try_run(self, prompt_stack: PromptStack) -> Message: result = self.client.chat(**self._base_params(prompt_stack)) usage = result.meta.tokens return Message( - content=[TextMessageContent(TextArtifact(result.text))], + content=self.__to_prompt_stack_message_content(result), role=Message.ASSISTANT_ROLE, usage=Message.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), ) @@ -52,32 +63,34 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: result = self.client.chat_stream(**self._base_params(prompt_stack)) for event in result: - if event.event_type == "text-generation": - yield DeltaMessage(content=TextDeltaMessageContent(event.text, index=0)) - elif event.event_type == "stream-end": + if event.event_type == "stream-end": usage = event.response.meta.tokens yield DeltaMessage( usage=DeltaMessage.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens) ) - - def _prompt_stack_messages_to_messages(self, messages: list[Message]) -> list[dict]: - return [ - { - "role": self.__to_role(message), - "content": [self.__prompt_stack_content_message_content(content) for content in message.content], - } - for message in messages - ] + elif event.event_type == "text-generation" or event.event_type == "tool-calls-chunk": + yield DeltaMessage(content=self.__to_prompt_stack_delta_message_content(event)) def _base_params(self, prompt_stack: PromptStack) -> dict: + # Current message last_input = prompt_stack.messages[-1] - user_message = last_input.to_text() - - history_messages = self._prompt_stack_messages_to_messages( + user_message = "" + tool_results = [] + if last_input is not None: + message = self.__to_cohere_messages([prompt_stack.messages[-1]]) + + if "message" in message[0]: + user_message = message[0]["message"] + if "tool_results" in message[0]: + tool_results = message[0]["tool_results"] + + # History messages + history_messages = self.__to_cohere_messages( [message for message in prompt_stack.messages[:-1] if not message.is_system()] ) + # System message (preamble) system_messages = prompt_stack.system_messages preamble = system_messages[0].to_text() if system_messages else None @@ -87,19 +100,142 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "temperature": self.temperature, "stop_sequences": self.tokenizer.stop_sequences, "max_tokens": self.max_tokens, + **({"tool_results": tool_results} if tool_results else {}), + **( + {"tools": self.__to_cohere_tools(prompt_stack.tools), "force_single_step": self.force_single_step} + if prompt_stack.tools and self.use_native_tools + else {} + ), **({"preamble": preamble} if preamble else {}), } - def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: - if isinstance(content, TextMessageContent): + def __to_cohere_messages(self, messages: list[Message]) -> list[dict]: + cohere_messages = [] + + for message in messages: + cohere_message: dict = {"role": self.__to_cohere_role(message), "message": message.to_text()} + + if message.has_any_content_type(ActionResultMessageContent): + cohere_message["tool_results"] = [ + self.__to_cohere_message_content(action_result) + for action_result in message.get_content_type(ActionResultMessageContent) + ] + else: + if message.has_any_content_type(ActionCallMessageContent): + cohere_message["tool_calls"] = [ + self.__to_cohere_message_content(action_call) + for action_call in message.get_content_type(ActionCallMessageContent) + ] + + cohere_messages.append(cohere_message) + + return cohere_messages + + def __to_cohere_message_content(self, content: BaseMessageContent) -> str | dict: + if isinstance(content, ActionCallMessageContent): + action = content.artifact.value + + return {"name": action.to_native_tool_name(), "parameters": action.input} + elif isinstance(content, ActionResultMessageContent): + artifact = content.artifact + + if isinstance(artifact, ListArtifact): + message_content = [{"text": artifact.to_text()} for artifact in artifact.value] + else: + message_content = [{"text": artifact.to_text()}] + + return { + "call": {"name": content.action.to_native_tool_name(), "parameters": content.action.input}, + "outputs": message_content, + } + elif isinstance(content, ActionResultMessageContent): return {"text": content.artifact.to_text()} else: raise ValueError(f"Unsupported content type: {type(content)}") - def __to_role(self, message: Message) -> str: + def __to_cohere_role(self, message: Message) -> str: if message.is_system(): return "SYSTEM" - elif message.is_user(): - return "USER" - else: + elif message.is_assistant(): return "CHATBOT" + else: + if message.has_any_content_type(ActionResultMessageContent): + return "TOOL" + else: + return "USER" + + def __to_cohere_tools(self, tools: list[BaseTool]) -> list[dict]: + tool_definitions = [] + + for tool in tools: + for activity in tool.activities(): + activity_schema = tool.activity_schema(activity) + if activity_schema is not None: + properties_values = activity_schema.json_schema("Parameters Schema")["properties"]["values"] + + properties = properties_values["properties"] + else: + properties_values = {} + properties = {} + + tool_definitions.append( + { + "name": f"{tool.name}_{tool.activity_name(activity)}", + "description": tool.activity_description(activity), + "parameter_definitions": { + property_name: { + "type": property_value["type"], + "required": property_name in properties_values["required"], + **( + {"description": property_value["description"]} + if "description" in property_value + else {} + ), + } + for property_name, property_value in properties.items() + }, + } + ) + + return tool_definitions + + def __to_prompt_stack_message_content(self, response: NonStreamedChatResponse) -> list[BaseMessageContent]: + content = [] + if response.text: + content.append(TextMessageContent(TextArtifact(response.text))) + if response.tool_calls is not None: + content.extend( + [ + ActionCallMessageContent( + ActionArtifact( + ToolAction( + tag=tool_call.name, + name=ToolAction.from_native_tool_name(tool_call.name)[0], + path=ToolAction.from_native_tool_name(tool_call.name)[1], + input=tool_call.parameters, + ) + ) + ) + for tool_call in response.tool_calls + ] + ) + + return content + + def __to_prompt_stack_delta_message_content(self, event: Any) -> BaseDeltaMessageContent: + if event.event_type == "text-generation": + return TextDeltaMessageContent(event.text, index=0) + elif event.event_type == "tool-calls-chunk": + if event.tool_call_delta is not None: + tool_call_delta = event.tool_call_delta + if tool_call_delta.name is not None: + name, path = ToolAction.from_native_tool_name(tool_call_delta.name) + + return ActionCallDeltaMessageContent(tag=tool_call_delta.name, name=name, path=path) + else: + return ActionCallDeltaMessageContent(partial_input=tool_call_delta.parameters) + + else: + return TextDeltaMessageContent(event.text) + else: + raise ValueError(f"Unsupported event type: {event.event_type}") diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index ff4b07a93..41be786b6 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -1,11 +1,13 @@ from __future__ import annotations +import json from collections.abc import Iterator -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field +from google.generativeai.types import ContentsType + -from griptape.artifacts import TextArtifact from griptape.common import ( BaseMessageContent, DeltaMessage, @@ -14,14 +16,23 @@ PromptStack, Message, TextMessageContent, + ActionCallMessageContent, + ActionResultMessageContent, + ActionCallDeltaMessageContent, + BaseDeltaMessageContent, + ToolAction, ) +from griptape.artifacts import TextArtifact, ActionArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, GoogleTokenizer -from griptape.utils import import_optional_dependency +from griptape.utils import import_optional_dependency, remove_key_in_dict_recursively +from schema import Schema if TYPE_CHECKING: from google.generativeai import GenerativeModel from google.generativeai.types import ContentDict, GenerateContentResponse + from google.generativeai.protos import Part + from griptape.tools import BaseTool @define @@ -37,33 +48,28 @@ class GooglePromptDriver(BasePromptDriver): api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) - model_client: Any = field(default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True) + model_client: GenerativeModel = field( + default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True + ) tokenizer: BaseTokenizer = field( default=Factory(lambda self: GoogleTokenizer(api_key=self.api_key, model=self.model), takes_self=True), kw_only=True, ) top_p: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) top_k: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) + tool_choice: str = field(default="auto", kw_only=True, metadata={"serializable": True}) def try_run(self, prompt_stack: PromptStack) -> Message: - GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig - - messages = self._prompt_stack_to_messages(prompt_stack) + messages = self.__to_google_messages(prompt_stack) response: GenerateContentResponse = self.model_client.generate_content( - messages, - generation_config=GenerationConfig( - stop_sequences=self.tokenizer.stop_sequences, - max_output_tokens=self.max_tokens, - temperature=self.temperature, - top_p=self.top_p, - top_k=self.top_k, - ), + messages, **self._base_params(prompt_stack) ) usage_metadata = response.usage_metadata return Message( - content=[TextMessageContent(TextArtifact(response.text))], + content=[self.__to_prompt_stack_message_content(part) for part in response.parts], role=Message.ASSISTANT_ROLE, usage=Message.Usage( input_tokens=usage_metadata.prompt_token_count, output_tokens=usage_metadata.candidates_token_count @@ -71,31 +77,21 @@ def try_run(self, prompt_stack: PromptStack) -> Message: ) def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: - GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig - - messages = self._prompt_stack_to_messages(prompt_stack) - response: Iterator[GenerateContentResponse] = self.model_client.generate_content( - messages, - stream=True, - generation_config=GenerationConfig( - stop_sequences=self.tokenizer.stop_sequences, - max_output_tokens=self.max_tokens, - temperature=self.temperature, - top_p=self.top_p, - top_k=self.top_k, - ), + messages = self.__to_google_messages(prompt_stack) + response: GenerateContentResponse = self.model_client.generate_content( + messages, **self._base_params(prompt_stack), stream=True ) prompt_token_count = None for chunk in response: usage_metadata = chunk.usage_metadata + content = self.__to_prompt_stack_delta_message_content(chunk.parts[0]) if chunk.parts else None # Only want to output the prompt token count once since it is static each chunk if prompt_token_count is None: prompt_token_count = usage_metadata.prompt_token_count yield DeltaMessage( - content=TextDeltaMessageContent(chunk.text), - role=Message.ASSISTANT_ROLE, + content=content, usage=DeltaMessage.Usage( input_tokens=usage_metadata.prompt_token_count, output_tokens=usage_metadata.candidates_token_count, @@ -103,46 +99,146 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: ) else: yield DeltaMessage( - content=TextDeltaMessageContent(chunk.text), - role=Message.ASSISTANT_ROLE, - usage=DeltaMessage.Usage(output_tokens=usage_metadata.candidates_token_count), + content=content, usage=DeltaMessage.Usage(output_tokens=usage_metadata.candidates_token_count) ) + def _base_params(self, prompt_stack: PromptStack) -> dict: + GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig + ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + Part = import_optional_dependency("google.generativeai.protos").Part + + system_messages = prompt_stack.system_messages + if system_messages: + self.model_client._system_instruction = ContentDict( + role="system", parts=[Part(text=system_message.to_text()) for system_message in system_messages] + ) + + return { + "generation_config": GenerationConfig( + **{ + # For some reason, providing stop sequences when streaming breaks native functions + # https://github.com/google-gemini/generative-ai-python/issues/446 + "stop_sequences": [] if self.stream and self.use_native_tools else self.tokenizer.stop_sequences, + "max_output_tokens": self.max_tokens, + "temperature": self.temperature, + "top_p": self.top_p, + "top_k": self.top_k, + } + ), + **( + { + "tools": self.__to_google_tools(prompt_stack.tools), + "tool_config": {"function_calling_config": {"mode": self.tool_choice}}, + } + if prompt_stack.tools and self.use_native_tools + else {} + ), + } + def _default_model_client(self) -> GenerativeModel: genai = import_optional_dependency("google.generativeai") genai.configure(api_key=self.api_key) return genai.GenerativeModel(self.model) - def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: + def __to_google_messages(self, prompt_stack: PromptStack) -> ContentsType: + ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + inputs = [ - {"role": self.__to_role(message), "parts": self.__to_content(message)} + ContentDict( + { + "role": self.__to_google_role(message), + "parts": [self.__to_google_message_content(content) for content in message.content], + } + ) for message in prompt_stack.messages if not message.is_system() ] - # Gemini does not have the notion of a system message, so we insert it as part of the first message in the history. - system_messages = prompt_stack.system_messages - if system_messages: - inputs[0]["parts"].insert(0, system_messages[0].to_text()) - return inputs - def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> ContentDict | str: + def __to_google_role(self, message: Message) -> str: + if message.is_assistant(): + return "model" + else: + return "user" + + def __to_google_tools(self, tools: list[BaseTool]) -> list[dict]: + FunctionDeclaration = import_optional_dependency("google.generativeai.types").FunctionDeclaration + + tool_declarations = [] + for tool in tools: + for activity in tool.activities(): + schema = (tool.activity_schema(activity) or Schema({})).json_schema("Parameters Schema") + + if "values" in schema["properties"]: + schema = schema["properties"]["values"] + + schema = remove_key_in_dict_recursively(schema, "additionalProperties") + tool_declaration = FunctionDeclaration( + name=f"{tool.name}_{tool.activity_name(activity)}", + description=tool.activity_description(activity), + parameters={ + "type": schema["type"], + "properties": schema["properties"], + "required": schema.get("required", []), + }, + ) + + tool_declarations.append(tool_declaration) + + return tool_declarations + + def __to_google_message_content(self, content: BaseMessageContent) -> ContentDict | Part | str: ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + protos = import_optional_dependency("google.generativeai.protos") if isinstance(content, TextMessageContent): return content.artifact.to_text() elif isinstance(content, ImageMessageContent): return ContentDict(mime_type=content.artifact.mime_type, data=content.artifact.value) + elif isinstance(content, ActionCallMessageContent): + action = content.artifact.value + + return protos.Part(function_call=protos.FunctionCall(name=action.tag, args=action.input)) + elif isinstance(content, ActionResultMessageContent): + artifact = content.artifact + + return protos.Part( + function_response=protos.FunctionResponse( + name=content.action.to_native_tool_name(), response=artifact.to_dict() + ) + ) + else: - raise ValueError(f"Unsupported content type: {type(content)}") + raise ValueError(f"Unsupported prompt stack content type: {type(content)}") - def __to_role(self, message: Message) -> str: - if message.is_assistant(): - return "model" + def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent: + if content.text: + return TextMessageContent(TextArtifact(content.text)) + elif content.function_call: + function_call = content.function_call + + name, path = ToolAction.from_native_tool_name(function_call.name) + + args = {k: v for k, v in function_call.args.items()} + return ActionCallMessageContent( + artifact=ActionArtifact(value=ToolAction(tag=function_call.name, name=name, path=path, input=args)) + ) else: - return "user" + raise ValueError(f"Unsupported message content type {content}") + + def __to_prompt_stack_delta_message_content(self, content: Part) -> BaseDeltaMessageContent: + if content.text: + return TextDeltaMessageContent(content.text) + elif content.function_call: + function_call = content.function_call - def __to_content(self, message: Message) -> list[ContentDict | str]: - return [self.__prompt_stack_content_message_content(content) for content in message.content] + name, path = ToolAction.from_native_tool_name(function_call.name) + + args = {k: v for k, v in function_call.args.items()} + return ActionCallDeltaMessageContent( + tag=function_call.name, name=name, path=path, partial_input=json.dumps(args) + ) + else: + raise ValueError(f"Unsupported message content type {content}") diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index a89b4eb57..d1456007e 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -1,28 +1,36 @@ from __future__ import annotations +import json from collections.abc import Iterator -from typing import Literal, Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Literal, Optional import openai from attrs import Factory, define, field +from schema import Schema -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, ActionArtifact from griptape.common import ( + ActionCallMessageContent, + ActionResultMessageContent, + BaseDeltaMessageContent, BaseMessageContent, + ActionCallDeltaMessageContent, DeltaMessage, TextDeltaMessageContent, ImageMessageContent, PromptStack, Message, TextMessageContent, + ToolAction, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer - if TYPE_CHECKING: - from openai.types.chat.chat_completion_message import ChatCompletionMessage from openai.types.chat.chat_completion_chunk import ChoiceDelta + from openai.types.chat.chat_completion_message import ChatCompletionMessage + + from griptape.tools import BaseTool @define @@ -59,6 +67,8 @@ class OpenAiChatPromptDriver(BasePromptDriver): default=None, kw_only=True, metadata={"serializable": True} ) seed: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) + tool_choice: str = field(default="auto", kw_only=True, metadata={"serializable": False}) + use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) ignored_exception_types: tuple[type[Exception], ...] = field( default=Factory( lambda: ( @@ -80,8 +90,8 @@ def try_run(self, prompt_stack: PromptStack) -> Message: message = result.choices[0].message return Message( - content=[self.__message_to_prompt_stack_content(message)], - role=message.role, + content=self.__to_prompt_stack_message_content(message), + role=Message.ASSISTANT_ROLE, usage=Message.Usage( input_tokens=result.usage.prompt_tokens, output_tokens=result.usage.completion_tokens ), @@ -104,22 +114,21 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: choice = chunk.choices[0] delta = choice.delta - yield DeltaMessage(content=self.__message_delta_to_prompt_stack_content_delta(delta)) + yield DeltaMessage(content=self.__to_prompt_stack_delta_message_content(delta)) else: raise Exception("Completion with more than one choice is not supported yet.") - def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: - return [ - {"role": self.__to_role(message), "content": self.__to_content(message)} - for message in prompt_stack.messages - ] - def _base_params(self, prompt_stack: PromptStack) -> dict: params = { "model": self.model, "temperature": self.temperature, "user": self.user, "seed": self.seed, + **( + {"tools": self.__to_openai_tools(prompt_stack.tools), "tool_choice": self.tool_choice} + if prompt_stack.tools and self.use_native_tools + else {} + ), **({"stop": self.tokenizer.stop_sequences} if self.tokenizer.stop_sequences else {}), **({"max_tokens": self.max_tokens} if self.max_tokens is not None else {}), **({"stream_options": {"include_usage": True}} if self.stream else {}), @@ -130,27 +139,87 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: # JSON mode still requires a system message instructing the LLM to output JSON. prompt_stack.add_system_message("Provide your response as a valid JSON object.") - messages = self._prompt_stack_to_messages(prompt_stack) + messages = self.__to_openai_messages(prompt_stack.messages) params["messages"] = messages return params - def __to_role(self, message: Message) -> str: + def __to_openai_messages(self, messages: list[Message]) -> list[dict]: + openai_messages = [] + + for message in messages: + if message.is_text(): + openai_messages.append({"role": message.role, "content": message.to_text()}) + elif message.has_any_content_type(ActionResultMessageContent): + # ToolAction results need to be expanded into separate messages. + openai_messages.extend( + [ + { + "role": self.__to_openai_role(message), + "content": self.__to_openai_message_content(action_result), + "tool_call_id": action_result.action.tag, + } + for action_result in message.get_content_type(ActionResultMessageContent) + ] + ) + else: + # ToolAction calls are attached to the assistant message that originally generated them. + action_call_content = [] + non_action_call_content = [] + for content in message.content: + if isinstance(content, ActionCallMessageContent): + action_call_content.append(content) + else: + non_action_call_content.append(content) + + openai_messages.append( + { + "role": self.__to_openai_role(message), + "content": [ + self.__to_openai_message_content(content) + for content in non_action_call_content # ToolAction calls do not belong in the content + ], + **( + { + "tool_calls": [ + self.__to_openai_message_content(action_call) for action_call in action_call_content + ] + } + if action_call_content + else {} + ), + } + ) + + return openai_messages + + def __to_openai_role(self, message: Message) -> str: if message.is_system(): return "system" elif message.is_assistant(): return "assistant" else: - return "user" + if message.has_any_content_type(ActionResultMessageContent): + return "tool" + else: + return "user" - def __to_content(self, message: Message) -> str | list[dict]: - if all(isinstance(content, TextMessageContent) for content in message.content): - return message.to_text() - else: - return [self.__prompt_stack_content_message_content(content) for content in message.content] + def __to_openai_tools(self, tools: list[BaseTool]) -> list[dict]: + return [ + { + "function": { + "name": f"{tool.name}_{tool.activity_name(activity)}", + "description": tool.activity_description(activity), + "parameters": (tool.activity_schema(activity) or Schema({})).json_schema("Parameters Schema"), + }, + "type": "function", + } + for tool in tools + for activity in tool.activities() + ] - def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> dict: + def __to_openai_message_content(self, content: BaseMessageContent) -> str | dict: if isinstance(content, TextMessageContent): return {"type": "text", "text": content.artifact.to_text()} elif isinstance(content, ImageMessageContent): @@ -158,19 +227,64 @@ def __prompt_stack_content_message_content(self, content: BaseMessageContent) -> "type": "image_url", "image_url": {"url": f"data:{content.artifact.mime_type};base64,{content.artifact.base64}"}, } + elif isinstance(content, ActionCallMessageContent): + action = content.artifact.value + + return { + "type": "function", + "id": action.tag, + "function": {"name": action.to_native_tool_name(), "arguments": json.dumps(action.input)}, + } + elif isinstance(content, ActionResultMessageContent): + return content.artifact.to_text() else: raise ValueError(f"Unsupported content type: {type(content)}") - def __message_to_prompt_stack_content(self, message: ChatCompletionMessage) -> BaseMessageContent: - if message.content is not None: - return TextMessageContent(TextArtifact(message.content)) - else: - raise ValueError(f"Unsupported message type: {message}") + def __to_prompt_stack_message_content(self, response: ChatCompletionMessage) -> list[BaseMessageContent]: + content = [] - def __message_delta_to_prompt_stack_content_delta(self, content_delta: ChoiceDelta) -> TextDeltaMessageContent: - if content_delta.content is None: - return TextDeltaMessageContent("") - else: - delta_content = content_delta.content + if response.content is not None: + content.append(TextMessageContent(TextArtifact(response.content))) + if response.tool_calls is not None: + content.extend( + [ + ActionCallMessageContent( + ActionArtifact( + ToolAction( + tag=tool_call.id, + name=ToolAction.from_native_tool_name(tool_call.function.name)[0], + path=ToolAction.from_native_tool_name(tool_call.function.name)[1], + input=json.loads(tool_call.function.arguments), + ) + ) + ) + for tool_call in response.tool_calls + ] + ) + + return content + + def __to_prompt_stack_delta_message_content(self, content_delta: ChoiceDelta) -> BaseDeltaMessageContent: + if content_delta.content is not None: + return TextDeltaMessageContent(content_delta.content) + elif content_delta.tool_calls is not None: + tool_calls = content_delta.tool_calls + + if len(tool_calls) == 1: + tool_call = tool_calls[0] + index = tool_call.index - return TextDeltaMessageContent(delta_content) + # Tool call delta either contains the function header or the partial input. + if tool_call.id is not None and tool_call.function.name is not None: + return ActionCallDeltaMessageContent( + index=index, + tag=tool_call.id, + name=ToolAction.from_native_tool_name(tool_call.function.name)[0], + path=ToolAction.from_native_tool_name(tool_call.function.name)[1], + ) + else: + return ActionCallDeltaMessageContent(index=index, partial_input=tool_call.function.arguments) + else: + raise ValueError(f"Unsupported tool call delta length: {len(tool_calls)}") + else: + return TextDeltaMessageContent("") diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index e199a5c7e..867486700 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -105,25 +105,34 @@ def _resolve_types(cls, attrs_cls: type) -> None: # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver from griptape.structures import Structure - from griptape.common import PromptStack, Message, Reference + from griptape.common import PromptStack, Message, Reference, ToolAction from griptape.tokenizers.base_tokenizer import BaseTokenizer + from griptape.tools import BaseTool from typing import Any from griptape.artifacts import BaseArtifact boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any Client = import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any + GenerativeModel = ( + import_optional_dependency("google.generativeai").GenerativeModel + if is_dependency_installed("google.generativeai") + else Any + ) attrs.resolve_types( attrs_cls, localns={ "PromptStack": PromptStack, "Usage": Message.Usage, + "BaseTool": BaseTool, "Structure": Structure, "BaseConversationMemoryDriver": BaseConversationMemoryDriver, "BasePromptDriver": BasePromptDriver, "BaseTokenizer": BaseTokenizer, "boto3": boto3, "Client": Client, + "ToolAction": ToolAction, + "GenerativeModel": GenerativeModel, "Reference": Reference, "BaseArtifact": BaseArtifact, }, diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index c835f2b84..da378f881 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -6,49 +6,39 @@ import schema from attrs import define, field from griptape import utils +from griptape.common import ToolAction from griptape.utils import remove_null_values_in_dict_recursively from griptape.mixins import ActionsSubtaskOriginMixin -from griptape.tasks import BaseTextInputTask, BaseTask -from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact +from griptape.tasks import BaseTask +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact, ActionArtifact from griptape.events import StartActionsSubtaskEvent, FinishActionsSubtaskEvent if TYPE_CHECKING: from griptape.memory import TaskMemory - from griptape.tools import BaseTool @define -class ActionsSubtask(BaseTextInputTask): - @define(kw_only=True) - class Action: - tag: str = field() - name: str = field() - path: Optional[str] = field(default=None) - input: dict = field() - tool: Optional[BaseTool] = field(default=None) - +class ActionsSubtask(BaseTask): THOUGHT_PATTERN = r"(?s)^Thought:\s*(.*?)$" ACTIONS_PATTERN = r"(?s)Actions:[^\[]*(\[.*\])" ANSWER_PATTERN = r"(?s)^Answer:\s?([\s\S]*)$" parent_task_id: Optional[str] = field(default=None, kw_only=True) thought: Optional[str] = field(default=None, kw_only=True) - actions: list[Action] = field(factory=list, kw_only=True) - - _input: Optional[str | TextArtifact | Callable[[BaseTask], TextArtifact]] = field(default=None) + actions: list[ToolAction] = field(factory=list, kw_only=True) + output: Optional[BaseArtifact] = field(default=None, init=False) + _input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( + default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), + alias="input", + ) _memory: Optional[TaskMemory] = None @property - def input(self) -> TextArtifact: - if isinstance(self._input, TextArtifact): - return self._input - elif isinstance(self._input, Callable): - return self._input(self) - else: - return TextArtifact(self._input) + def input(self) -> TextArtifact | ListArtifact: + return self._process_task_input(self._input) @input.setter - def input(self, value: str | TextArtifact | Callable[[BaseTask], TextArtifact]) -> None: + def input(self, value: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact]) -> None: self._input = value @property @@ -75,7 +65,16 @@ def children(self) -> list[BaseTask]: def attach_to(self, parent_task: BaseTask): self.parent_task_id = parent_task.id self.structure = parent_task.structure - self.__init_from_prompt(self.input.to_text()) + + try: + if isinstance(self.input, TextArtifact): + self.__init_from_prompt(self.input.to_text()) + else: + self.__init_from_artifacts(self.input) + except Exception as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nError parsing tool action: {e}") + + self.output = ErrorArtifact(f"ToolAction input parsing error: {e}", exception=e) def before_run(self) -> None: self.structure.publish_event( @@ -90,12 +89,12 @@ def before_run(self) -> None: subtask_actions=self.actions_to_dicts(), ) ) - self.structure.logger.info(f"Subtask {self.id}\n{self.input.to_text()}") + self.structure.logger.info(f"Subtask {self.id}\n{self.actions_to_json()}") def run(self) -> BaseArtifact: try: - if any(a.name == "error" for a in self.actions): - errors = [a.input["error"] for a in self.actions if a.name == "error"] + if any(isinstance(a.output, ErrorArtifact) for a in self.actions): + errors = [a.output.value for a in self.actions if isinstance(a.output, ErrorArtifact)] self.output = ErrorArtifact("\n\n".join(errors)) else: @@ -117,13 +116,13 @@ def run(self) -> BaseArtifact: else: return ErrorArtifact("no tool output") - def execute_actions(self, actions: list[Action]) -> list[tuple[str, BaseArtifact]]: + def execute_actions(self, actions: list[ToolAction]) -> list[tuple[str, BaseArtifact]]: with self.futures_executor_fn() as executor: results = utils.execute_futures_dict({a.tag: executor.submit(self.execute_action, a) for a in actions}) return [r for r in results.values()] - def execute_action(self, action: Action) -> tuple[str, BaseArtifact]: + def execute_action(self, action: ToolAction) -> tuple[str, BaseArtifact]: if action.tool is not None: if action.path is not None: output = action.tool.execute(getattr(action.tool, action.path), self, action) @@ -131,6 +130,7 @@ def execute_action(self, action: Action) -> tuple[str, BaseArtifact]: output = ErrorArtifact("action path not found") else: output = ErrorArtifact("action name not found") + action.output = output return action.tag, output @@ -174,92 +174,114 @@ def actions_to_dicts(self) -> list[dict]: return json_list def actions_to_json(self) -> str: - return json.dumps(self.actions_to_dicts()) + return json.dumps(self.actions_to_dicts(), indent=2) + + def _process_task_input( + self, task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact] + ) -> TextArtifact | ListArtifact: + if isinstance(task_input, (TextArtifact, ListArtifact)): + return task_input + elif isinstance(task_input, ActionArtifact): + return ListArtifact([task_input]) + elif isinstance(task_input, Callable): + return self._process_task_input(task_input(self)) + elif isinstance(task_input, str): + return self._process_task_input(TextArtifact(task_input)) + elif isinstance(task_input, (list, tuple)): + return ListArtifact([self._process_task_input(elem) for elem in task_input]) + else: + raise ValueError(f"Invalid input type: {type(task_input)} ") def __init_from_prompt(self, value: str) -> None: thought_matches = re.findall(self.THOUGHT_PATTERN, value, re.MULTILINE) actions_matches = re.findall(self.ACTIONS_PATTERN, value, re.DOTALL) answer_matches = re.findall(self.ANSWER_PATTERN, value, re.MULTILINE) - if self.thought is None and len(thought_matches) > 0: + if self.thought is None and thought_matches: self.thought = thought_matches[-1] self.__parse_actions(actions_matches) # If there are no actions to take but an answer is provided, set the answer as the output. - if len(self.actions) == 0 and self.output is None and len(answer_matches) > 0: + if len(self.actions) == 0 and self.output is None and answer_matches: self.output = TextArtifact(answer_matches[-1]) + def __init_from_artifacts(self, artifacts: ListArtifact) -> None: + """Parses the input Artifacts to extract the thought and actions. + Text Artifacts are used to extract the thought, and ToolAction Artifacts are used to extract the actions. + + Args: + artifacts: The input Artifacts. + Returns: + None + """ + self.actions = [ + self.__process_action_object(artifact.value.to_dict()) + for artifact in artifacts.value + if isinstance(artifact, ActionArtifact) + ] + + thoughts = [artifact.value for artifact in artifacts.value if isinstance(artifact, TextArtifact)] + if thoughts: + self.thought = thoughts[0] + def __parse_actions(self, actions_matches: list[str]) -> None: if len(actions_matches) == 0: return - try: data = actions_matches[-1] - actions_list: list = json.loads(data, strict=False) - - if isinstance(self.origin_task, ActionsSubtaskOriginMixin): - self.origin_task.actions_schema().validate(actions_list) - - for action_object in actions_list: - # Load action name; throw exception if the key is not present - action_tag = action_object["tag"] - - # Load action name; throw exception if the key is not present - action_name = action_object["name"] - - # Load action method; throw exception if the key is not present - action_path = action_object["path"] - - # Load optional input value; don't throw exceptions if key is not present - if "input" in action_object: - # The schema library has a bug, where something like `Or(str, None)` doesn't get - # correctly translated into JSON schema. For some optional input fields LLMs sometimes - # still provide null value, which trips up the validator. The temporary solution that - # works is to strip all key-values where value is null. - action_input = remove_null_values_in_dict_recursively(action_object["input"]) - else: - action_input = {} - - # Load the action itself - if isinstance(self.origin_task, ActionsSubtaskOriginMixin): - tool = self.origin_task.find_tool(action_name) - else: - raise Exception( - "ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin." - ) - - new_action = ActionsSubtask.Action( - tag=action_tag, name=action_name, path=action_path, input=action_input, tool=tool - ) - - if new_action.tool and new_action.input: - self.__validate_action(new_action) - - # Don't forget to add it to the subtask actions list! - self.actions.append(new_action) - except SyntaxError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") + actions_list: list[dict] = json.loads(data, strict=False) - self.actions.append(self.__error_to_action(f"syntax error: {e}")) - except schema.SchemaError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") + self.actions = [self.__process_action_object(action_object) for action_object in actions_list] + except json.JSONDecodeError as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid actions JSON: {e}") - self.actions.append(self.__error_to_action(f"Action JSON validation error: {e}")) - except Exception as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nError parsing tool action: {e}") + self.output = ErrorArtifact(f"Actions JSON decoding error: {e}", exception=e) + + def __process_action_object(self, action_object: dict) -> ToolAction: + # Load action tag; throw exception if the key is not present + action_tag = action_object["tag"] + + # Load action name; throw exception if the key is not present + action_name = action_object["name"] + + # Load action method; throw exception if the key is not present + action_path = action_object["path"] + + # Load optional input value; don't throw exceptions if key is not present + if "input" in action_object: + # Some LLMs don't support nested parameters and therefore won't generate "values". + # So we need to manually add it here. + if "values" not in action_object["input"]: + action_object["input"] = {"values": action_object["input"]} + + # The schema library has a bug, where something like `Or(str, None)` doesn't get + # correctly translated into JSON schema. For some optional input fields LLMs sometimes + # still provide null value, which trips up the validator. The temporary solution that + # works is to strip all key-values where value is null. + action_input = remove_null_values_in_dict_recursively(action_object["input"]) + else: + action_input = {} + + # Load the action itself + if isinstance(self.origin_task, ActionsSubtaskOriginMixin): + tool = self.origin_task.find_tool(action_name) + else: + raise Exception("ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin.") + + action = ToolAction(tag=action_tag, name=action_name, path=action_path, input=action_input, tool=tool) - self.actions.append(self.__error_to_action(f"Action input parsing error: {e}")) + if action.tool and action.input: + self.__validate_action(action) - def __error_to_action(self, error: str) -> Action: - return ActionsSubtask.Action(tag="error", name="error", input={"error": error}) + return action - def __validate_action(self, action: Action) -> None: + def __validate_action(self, action: ToolAction) -> None: try: if action.path is not None: activity = getattr(action.tool, action.path) else: - raise Exception("Action path not found.") + raise Exception("ToolAction path not found.") if activity is not None: activity_schema = action.tool.activity_schema(activity) @@ -269,6 +291,10 @@ def __validate_action(self, action: Action) -> None: if activity_schema: activity_schema.validate(action.input) except schema.SchemaError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid activity input JSON: {e}") + self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") + + action.output = ErrorArtifact(f"Activity input JSON validation error: {e}", exception=e) + except SyntaxError as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") - self.actions.append(self.__error_to_action(f"Activity input JSON validation error: {e}")) + action.output = ErrorArtifact(f"Syntax error: {e}", exception=e) diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index edd90c26e..da40fd31a 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -1,6 +1,6 @@ from __future__ import annotations -import re import json +import re from typing import Optional, TYPE_CHECKING from attrs import define, field from schema import Schema @@ -11,6 +11,7 @@ from griptape.tools import BaseTool from griptape.utils import J2 from griptape.mixins import ActionsSubtaskOriginMixin +from griptape.common import PromptStack if TYPE_CHECKING: from griptape.memory import TaskMemory @@ -25,6 +26,13 @@ class ToolTask(PromptTask, ActionsSubtaskOriginMixin): subtask: Optional[ActionsSubtask] = field(default=None, kw_only=True) task_memory: Optional[TaskMemory] = field(default=None, kw_only=True) + @property + def prompt_stack(self) -> PromptStack: + stack = super().prompt_stack + stack.tools = [self.tool] + + return stack + def __attrs_post_init__(self) -> None: if self.task_memory is not None: self.set_default_tools_memory(self.task_memory) @@ -42,36 +50,42 @@ def default_system_template_generator(self, _: PromptTask) -> str: rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), action_schema=utils.minify_json(json.dumps(self.tool.schema())), meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), + use_native_tools=self.prompt_driver.use_native_tools, ) def actions_schema(self) -> Schema: return self._actions_schema_for_tools([self.tool]) def run(self) -> BaseArtifact: - prompt_output = self.prompt_driver.run(prompt_stack=self.prompt_stack).to_text() - action_matches = re.findall(self.ACTION_PATTERN, prompt_output, re.DOTALL) - - if action_matches: - try: - data = action_matches[-1] - action_dict = json.loads(data) - action_dict["tag"] = self.tool.name - subtask_input = J2("tasks/tool_task/subtask.j2").render(action_json=json.dumps(action_dict)) - subtask = self.add_subtask(ActionsSubtask(subtask_input)) - - subtask.before_run() - subtask.run() - subtask.after_run() - - if isinstance(subtask.output, ListArtifact): - self.output = subtask.output[0] - else: - self.output = InfoArtifact("No tool output") - except Exception as e: - self.output = ErrorArtifact(f"Error processing tool input: {e}", exception=e) - return self.output + result = self.prompt_driver.run(prompt_stack=self.prompt_stack) + + if self.prompt_driver.use_native_tools: + subtask_input = result.to_artifact() else: - return ErrorArtifact("No action found in prompt output.") + action_matches = re.findall(self.ACTION_PATTERN, result.to_text(), re.DOTALL) + + if not action_matches: + return ErrorArtifact("No action found in prompt output.") + data = action_matches[-1] + action_dict = json.loads(data) + + action_dict["tag"] = self.tool.name + subtask_input = J2("tasks/tool_task/subtask.j2").render(action_json=json.dumps(action_dict)) + + try: + subtask = self.add_subtask(ActionsSubtask(subtask_input)) + + subtask.before_run() + subtask.run() + subtask.after_run() + + if isinstance(subtask.output, ListArtifact): + self.output = subtask.output[0] + else: + self.output = InfoArtifact("No tool output") + except Exception as e: + self.output = ErrorArtifact(f"Error processing tool input: {e}", exception=e) + return self.output def find_tool(self, tool_name: str) -> BaseTool: if self.tool.name == tool_name: diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index cfad9f49f..0c5dce67c 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -5,12 +5,12 @@ from schema import Schema from griptape import utils -from griptape.artifacts import BaseArtifact, ErrorArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact, ActionArtifact from griptape.mixins import ActionsSubtaskOriginMixin from griptape.tasks import ActionsSubtask from griptape.tasks import PromptTask from griptape.utils import J2 -from griptape.common import PromptStack +from griptape.common import PromptStack, ToolAction if TYPE_CHECKING: from griptape.tools import BaseTool @@ -62,7 +62,7 @@ def tool_output_memory(self) -> list[TaskMemory]: @property def prompt_stack(self) -> PromptStack: - stack = PromptStack() + stack = PromptStack(tools=self.tools) memory = self.structure.conversation_memory stack.add_system_message(self.generate_system_template(self)) @@ -73,8 +73,35 @@ def prompt_stack(self) -> PromptStack: stack.add_assistant_message(self.output.to_text()) else: for s in self.subtasks: - stack.add_assistant_message(self.generate_assistant_subtask_template(s)) - stack.add_user_message(self.generate_user_subtask_template(s)) + if self.prompt_driver.use_native_tools: + action_calls = [ + ToolAction(name=action.name, path=action.path, tag=action.tag, input=action.input) + for action in s.actions + ] + action_results = [ + ToolAction(name=action.name, path=action.path, tag=action.tag, output=action.output) + for action in s.actions + ] + + stack.add_assistant_message( + ListArtifact( + [ + *([TextArtifact(s.thought)] if s.thought else []), + *[ActionArtifact(a) for a in action_calls], + ] + ) + ) + stack.add_user_message( + ListArtifact( + [ + *[ActionArtifact(a) for a in action_results], + *([] if s.output else [TextArtifact("Please keep going")]), + ] + ) + ) + else: + stack.add_assistant_message(self.generate_assistant_subtask_template(s)) + stack.add_user_message(self.generate_user_subtask_template(s)) if memory: # inserting at index 1 to place memory right after system prompt @@ -99,6 +126,7 @@ def default_system_template_generator(self, _: PromptTask) -> str: action_names=str.join(", ", [tool.name for tool in self.tools]), actions_schema=utils.minify_json(json.dumps(schema)), meta_memory=J2("memory/meta/meta_memory.j2").render(meta_memories=self.meta_memories), + use_native_tools=self.prompt_driver.use_native_tools, stop_sequence=self.response_stop_sequence, ) @@ -133,7 +161,8 @@ def run(self) -> BaseArtifact: if self.response_stop_sequence not in self.prompt_driver.tokenizer.stop_sequences: self.prompt_driver.tokenizer.stop_sequences.extend([self.response_stop_sequence]) - subtask = self.add_subtask(ActionsSubtask(self.prompt_driver.run(prompt_stack=self.prompt_stack).to_text())) + result = self.prompt_driver.run(self.prompt_stack) + subtask = self.add_subtask(ActionsSubtask(result.to_artifact())) while True: if subtask.output is None: @@ -147,9 +176,8 @@ def run(self) -> BaseArtifact: subtask.run() subtask.after_run() - subtask = self.add_subtask( - ActionsSubtask(self.prompt_driver.run(prompt_stack=self.prompt_stack).to_text()) - ) + result = self.prompt_driver.run(prompt_stack=self.prompt_stack) + subtask = self.add_subtask(ActionsSubtask(result.to_artifact())) else: break diff --git a/griptape/templates/tasks/tool_task/system.j2 b/griptape/templates/tasks/tool_task/system.j2 index 996f89e1f..f56f869b3 100644 --- a/griptape/templates/tasks/tool_task/system.j2 +++ b/griptape/templates/tasks/tool_task/system.j2 @@ -1,6 +1,9 @@ -You must respond to requests by using the following Action Schema. Your response must ONLY be a plain JSON object that successfully validates against the schema. The schema is provided below: -Action Schema: {{ action_schema }} +You must respond to requests by using the actions. Your response must ONLY be a plain JSON object that successfully validates against the Action Schema. +{% if not use_native_tools %} +The schema is provided below: +Action Schema: {{ action_schema }} +{% endif %} {% if meta_memory %} {{ meta_memory }} diff --git a/griptape/templates/tasks/toolkit_task/system.j2 b/griptape/templates/tasks/toolkit_task/system.j2 index 8ddfcf407..09c4e9af9 100644 --- a/griptape/templates/tasks/toolkit_task/system.j2 +++ b/griptape/templates/tasks/toolkit_task/system.j2 @@ -1,14 +1,20 @@ -Think step-by-step and execute actions sequentially or in parallel. You must use the following format when executing actions: +You can think step-by-step and execute actions sequentially or in parallel to get your final answer. +{% if not use_native_tools %} + +You must use the following format when executing actions: Thought: Actions: {{ stop_sequence }}: ...repeat Thought/Actions/{{ stop_sequence }} as many times as you need -Answer: +"Thought", "Actions", "{{ stop_sequence }}" must always start on a new line. If {{ stop_sequence }} contains an error, you MUST ALWAYS try to fix the error with another Thought/Actions/{{ stop_sequence }}. -"Thought", "Actions", "{{ stop_sequence }}", and "Answer" MUST ALWAYS start on a new line. If {{ stop_sequence }} contains an error, you MUST ALWAYS try to fix the error with another Thought/Actions/{{ stop_sequence }}. NEVER make up actions. Actions must ALWAYS be a plain JSON array of objects. ALWAYS use double quotes for keys and string values in JSON objects. NEVER make up facts. Be truthful. ALWAYS be proactive and NEVER ask the user for more information input. Keep going until you have the final answer. +{% endif %} +You must use the following format when providing your final answer: +Answer: -You have access ONLY to the actions with the following names: [{{ action_names }}]. You can use multiple actions in a sequence or in parallel to get the final answer. NEVER make up action names or action paths. NEVER reference tags in other action input values. +Be truthful. ALWAYS be proactive and NEVER ask the user for more information input. Keep using actions until you have your final answer. +NEVER make up actions, action names, or action paths. NEVER make up facts. NEVER reference tags in other action input values. Actions might store their output in memory as artifacts (with `memory_name` and `artifact_namespace`). If action output is stored in memory, ALWAYS try to pass it to another action. NEVER make up memory names or artifact namespaces. {% if meta_memory %} diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 03aaf22b5..44db36f2a 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -11,6 +11,7 @@ import yaml from attrs import define, field, Factory from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact +from griptape.common import ToolAction from griptape.mixins import ActivityMixin if TYPE_CHECKING: @@ -87,7 +88,7 @@ def abs_dir_path(self): def schema(self) -> dict: full_schema = Schema(Or(*self.activity_schemas()), description=f"{self.name} action schema.") - return full_schema.json_schema(f"{self.name} Action Schema") + return full_schema.json_schema(f"{self.name} ToolAction Schema") def activity_schemas(self) -> list[Schema]: return [ @@ -103,18 +104,18 @@ def activity_schemas(self) -> list[Schema]: for activity in self.activities() ] - def execute(self, activity: Callable, subtask: ActionsSubtask, action: ActionsSubtask.Action) -> BaseArtifact: + def execute(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> BaseArtifact: preprocessed_input = self.before_run(activity, subtask, action) output = self.run(activity, subtask, action, preprocessed_input) postprocessed_output = self.after_run(activity, subtask, action, output) return postprocessed_output - def before_run(self, activity: Callable, subtask: ActionsSubtask, action: ActionsSubtask.Action) -> Optional[dict]: + def before_run(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> Optional[dict]: return action.input def run( - self, activity: Callable, subtask: ActionsSubtask, action: ActionsSubtask.Action, value: Optional[dict] + self, activity: Callable, subtask: ActionsSubtask, action: ToolAction, value: Optional[dict] ) -> BaseArtifact: activity_result = activity(value) @@ -128,7 +129,7 @@ def run( return result def after_run( - self, activity: Callable, subtask: ActionsSubtask, action: ActionsSubtask.Action, value: BaseArtifact + self, activity: Callable, subtask: ActionsSubtask, action: ToolAction, value: BaseArtifact ) -> BaseArtifact: if value: if self.output_memory: diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index ceb19547e..19730ac3b 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -8,7 +8,7 @@ from .futures import execute_futures_dict from .futures import execute_futures_list from .token_counter import TokenCounter -from .dict_utils import remove_null_values_in_dict_recursively, dict_merge +from .dict_utils import remove_null_values_in_dict_recursively, dict_merge, remove_key_in_dict_recursively from .file_utils import load_file, load_files from .hash import str_to_hash from .import_utils import import_optional_dependency @@ -40,6 +40,7 @@ def minify_json(value: str) -> str: "TokenCounter", "remove_null_values_in_dict_recursively", "dict_merge", + "remove_key_in_dict_recursively", "Stream", "load_artifact_from_memory", "deprecation_warn", diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index a396bf7d1..42214a895 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -8,6 +8,13 @@ def remove_null_values_in_dict_recursively(d: dict) -> dict: return d +def remove_key_in_dict_recursively(d: dict, key: str) -> dict: + if isinstance(d, dict): + return {k: remove_key_in_dict_recursively(v, key) for k, v in d.items() if k != key} + else: + return d + + def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], add_keys: bool = True) -> dict: """Recursive dict merge. Inspired by :meth:``dict.update()``, instead of updating only top-level keys, dict_merge recurses down into dicts nested diff --git a/poetry.lock b/poetry.lock index 8e52c6fca..8e11c84e5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1542,13 +1542,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "google-ai-generativelanguage" -version = "0.6.5" +version = "0.6.6" description = "Google Ai Generativelanguage API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-ai-generativelanguage-0.6.5.tar.gz", hash = "sha256:c4089c277fa4e26722f76ab03ee3039f28be8bf1c9be282948b9583a154c6d79"}, - {file = "google_ai_generativelanguage-0.6.5-py3-none-any.whl", hash = "sha256:236875bb4a6d6ebdba2f12bd9d5e776100fd913402157a47b5e9fb80a13f25a7"}, + {file = "google-ai-generativelanguage-0.6.6.tar.gz", hash = "sha256:1739f035caeeeca5c28f887405eec8690f3372daf79fecf26454a97a4f1733a8"}, + {file = "google_ai_generativelanguage-0.6.6-py3-none-any.whl", hash = "sha256:59297737931f073d55ce1268dcc6d95111ee62850349d2b6cde942b16a4fca5c"}, ] [package.dependencies] @@ -1646,16 +1646,16 @@ httplib2 = ">=0.19.0" [[package]] name = "google-generativeai" -version = "0.7.0" +version = "0.7.2" description = "Google Generative AI High level API client library and tools." optional = true python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.7.0-py3-none-any.whl", hash = "sha256:7be4b634afeb8b6bebde1af7271e94d2af84d2d28b5988c7ed9921733c40fe63"}, + {file = "google_generativeai-0.7.2-py3-none-any.whl", hash = "sha256:3117d1ebc92ee77710d4bc25ab4763492fddce9b6332eb25d124cf5d8b78b339"}, ] [package.dependencies] -google-ai-generativelanguage = "0.6.5" +google-ai-generativelanguage = "0.6.6" google-api-core = "*" google-api-python-client = "*" google-auth = ">=2.15.0" @@ -6509,4 +6509,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "35d73438908ba9f1bf741ad03dde06c0c86a25873646447537440e4f50b5544c" +content-hash = "09d5503da93cfcba7fdb3cc462395d5a2754bace3cee33feef9002b5904d5493" diff --git a/pyproject.toml b/pyproject.toml index 757da88c1..c315e9ffa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ redis = { version = "^4.6.0", optional = true } opensearch-py = { version = "^2.3.1", optional = true } pgvector = { version = "^0.2.3", optional = true } psycopg2-binary = { version = "^2.9.9", optional = true } -google-generativeai = { version = "^0.7.0", optional = true } +google-generativeai = { version = "^0.7.2", optional = true } trafilatura = {version = "^1.6", optional = true} playwright = {version = "^1.42", optional = true} beautifulsoup4 = {version = "^4.12.3", optional = true} diff --git a/tests/unit/artifacts/test_action_artifact.py b/tests/unit/artifacts/test_action_artifact.py new file mode 100644 index 000000000..e415bbdaf --- /dev/null +++ b/tests/unit/artifacts/test_action_artifact.py @@ -0,0 +1,53 @@ +import json +import pytest +from griptape.common import ToolAction +from griptape.artifacts import ActionArtifact, BaseArtifact + + +class TestActionArtifact: + @pytest.fixture() + def action(self) -> ToolAction: + return ToolAction(tag="TestTag", name="TestName", path="TestPath", input={"foo": "bar"}) + + def test___add__(self, action): + with pytest.raises(NotImplementedError): + result = ActionArtifact(action) + ActionArtifact(action) + + def test_to_text(self, action): + assert ActionArtifact(action).to_text() == json.dumps(action.to_dict()) + + def test_to_dict(self, action): + assert ActionArtifact(action).to_dict()["value"] == { + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + "type": "ToolAction", + } + + def test_from_dict(self, action): + assert BaseArtifact.from_dict(ActionArtifact(action).to_dict()).to_dict()["value"] == { + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + "type": "ToolAction", + } + + def test_to_json(self, action): + assert json.loads(ActionArtifact(action).to_json())["value"] == { + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + "type": "ToolAction", + } + + def test_from_json(self, action): + assert ActionArtifact.from_json(ActionArtifact(action).to_json()).to_dict()["value"] == { + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + "type": "ToolAction", + } diff --git a/tests/unit/common/__init__.py b/tests/unit/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/common/contents/test_action_call_delta_message_content.py b/tests/unit/common/contents/test_action_call_delta_message_content.py new file mode 100644 index 000000000..d164d9006 --- /dev/null +++ b/tests/unit/common/contents/test_action_call_delta_message_content.py @@ -0,0 +1,25 @@ +from griptape.common.prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent + + +class TestActionCallDeltaMessageContent: + def test__str__(self): + content = ActionCallDeltaMessageContent() + assert str(content) == "" + + content.name = "TestName" + assert str(content) == "TestName" + + content.path = "test_path" + assert str(content) == "TestName.test_path" + + content.tag = "test_tag" + assert str(content) == "TestName.test_path (test_tag)" + + content.partial_input = "partial_input" + assert str(content) == "TestName.test_path (test_tag) partial_input" + + def test_missing_header__str__(self): + assert str(ActionCallDeltaMessageContent(partial_input="partial_input")) == "partial_input" + + def test_missing_input__str__(self): + assert str(ActionCallDeltaMessageContent(tag="tag", name="name", path="path")) == "name.path (tag)" diff --git a/tests/unit/common/contents/test_action_call_message_content.py b/tests/unit/common/contents/test_action_call_message_content.py new file mode 100644 index 000000000..2e2e69d27 --- /dev/null +++ b/tests/unit/common/contents/test_action_call_message_content.py @@ -0,0 +1,55 @@ +import pytest +from griptape.artifacts.action_artifact import ActionArtifact +from griptape.common import ActionCallMessageContent, ActionCallDeltaMessageContent, ToolAction + + +class TestActionCallMessageContent: + def test_init(self): + assert ActionCallMessageContent( + ActionArtifact(ToolAction(tag="TestTag", name="TestName", path="TestPath", input={"foo": "bar"})) + ).artifact.value.to_dict() == { + "type": "ToolAction", + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + } + + def test_from_deltas(self): + deltas = [ + ActionCallDeltaMessageContent(tag="testtag"), + ActionCallDeltaMessageContent(name="TestName"), + ActionCallDeltaMessageContent(path="test_tag"), + ActionCallDeltaMessageContent(partial_input='{"foo":'), + ActionCallDeltaMessageContent(partial_input='"bar"}'), + ] + + assert ActionCallMessageContent.from_deltas(deltas).artifact.value.to_dict() == { + "type": "ToolAction", + "tag": "testtag", + "name": "TestName", + "path": "test_tag", + "input": {"foo": "bar"}, + } + + def test_from_missing_header(self): + deltas = [ + ActionCallDeltaMessageContent(tag="testtag"), + ActionCallDeltaMessageContent(name="TestName"), + ActionCallDeltaMessageContent(partial_input='{"foo":'), + ActionCallDeltaMessageContent(partial_input='"bar"}'), + ] + + with pytest.raises(ValueError, match="Missing required fields"): + ActionCallMessageContent.from_deltas(deltas) + + def test_from_bad_json(self): + deltas = [ + ActionCallDeltaMessageContent(tag="testtag"), + ActionCallDeltaMessageContent(name="TestName"), + ActionCallDeltaMessageContent(path="test_tag"), + ActionCallDeltaMessageContent(partial_input='{"foo":'), + ] + + with pytest.raises(ValueError, match="Invalid JSON"): + ActionCallMessageContent.from_deltas(deltas) diff --git a/tests/unit/common/contents/test_action_result_message_content.py b/tests/unit/common/contents/test_action_result_message_content.py new file mode 100644 index 000000000..b1bcc356d --- /dev/null +++ b/tests/unit/common/contents/test_action_result_message_content.py @@ -0,0 +1,18 @@ +import pytest +from griptape.artifacts.text_artifact import TextArtifact +from griptape.common import ActionResultMessageContent, ToolAction + + +class TestActionResultMessageContent: + def test_init(self): + assert ( + ActionResultMessageContent( + TextArtifact("foo"), + action=ToolAction(tag="TestTag", name="TestName", path="TestPath", input={"foo": "bar"}), + ).artifact.value + == "foo" + ) + + def test_from_deltas(self): + with pytest.raises(NotImplementedError): + ActionResultMessageContent.from_deltas([]) diff --git a/tests/unit/common/contents/test_base_message_content.py b/tests/unit/common/contents/test_base_message_content.py new file mode 100644 index 000000000..8f1e9cf9f --- /dev/null +++ b/tests/unit/common/contents/test_base_message_content.py @@ -0,0 +1,17 @@ +from griptape.artifacts.text_artifact import TextArtifact +from griptape.common import TextMessageContent + + +class TestBaseMessageContent: + def test__str__(self): + assert str(TextMessageContent(TextArtifact("foo"))) == "foo" + + def test__bool__(self): + assert bool(TextMessageContent(TextArtifact("foo"))) + assert not bool(TextMessageContent(TextArtifact(""))) + + def test__len__(self): + assert len(TextMessageContent(TextArtifact("foo"))) == 3 + + def test_to_text(self): + assert TextMessageContent(TextArtifact("foo")).to_text() == "foo" diff --git a/tests/unit/common/contents/test_image_message_content.py b/tests/unit/common/contents/test_image_message_content.py new file mode 100644 index 000000000..b6c1b4c4f --- /dev/null +++ b/tests/unit/common/contents/test_image_message_content.py @@ -0,0 +1,12 @@ +import pytest +from griptape.artifacts.image_artifact import ImageArtifact +from griptape.common import ImageMessageContent + + +class TestImageMessageContent: + def test_init(self): + assert ImageMessageContent(ImageArtifact(b"foo", format="jpg", width=100, height=100)).artifact.value == b"foo" + + def test_from_deltas(self): + with pytest.raises(NotImplementedError): + ImageMessageContent.from_deltas([]) diff --git a/tests/unit/common/contents/test_text_delta_message_content.py b/tests/unit/common/contents/test_text_delta_message_content.py new file mode 100644 index 000000000..8fedd2822 --- /dev/null +++ b/tests/unit/common/contents/test_text_delta_message_content.py @@ -0,0 +1,6 @@ +from griptape.common import TextDeltaMessageContent + + +class TestTextDeltaMessageContent: + def test_init(self): + assert TextDeltaMessageContent("foo").text == "foo" diff --git a/tests/unit/common/contents/test_text_message_content.py b/tests/unit/common/contents/test_text_message_content.py new file mode 100644 index 000000000..01a3c0fd4 --- /dev/null +++ b/tests/unit/common/contents/test_text_message_content.py @@ -0,0 +1,15 @@ +from griptape.artifacts.text_artifact import TextArtifact +from griptape.common import TextMessageContent, TextDeltaMessageContent + + +class TestTextMessageContent: + def test_init(self): + assert TextMessageContent(TextArtifact("foo")).artifact.value == "foo" + + def test_from_deltas(self): + assert ( + TextMessageContent.from_deltas( + [TextDeltaMessageContent("foo"), TextDeltaMessageContent("bar")] + ).artifact.value + == "foobar" + ) diff --git a/tests/unit/common/test_action.py b/tests/unit/common/test_action.py new file mode 100644 index 000000000..db5284839 --- /dev/null +++ b/tests/unit/common/test_action.py @@ -0,0 +1,33 @@ +import pytest +import json +from griptape.common import ToolAction + + +class TestAction: + @pytest.fixture() + def action(self) -> ToolAction: + return ToolAction(tag="TestTag", name="TestName", path="TestPath", input={"foo": "bar"}) + + def test__str__(self, action: ToolAction): + assert str(action) == json.dumps( + {"type": "ToolAction", "tag": "TestTag", "name": "TestName", "path": "TestPath", "input": {"foo": "bar"}} + ) + + def test_to_dict(self, action: ToolAction): + assert action.to_dict() == { + "tag": "TestTag", + "name": "TestName", + "path": "TestPath", + "input": {"foo": "bar"}, + "type": "ToolAction", + } + + def test_to_native_tool_name(self, action: ToolAction): + assert action.to_native_tool_name() == "TestName_TestPath" + + action.path = None + assert action.to_native_tool_name() == "TestName" + + def test_from_native_tool_name(self): + assert ToolAction.from_native_tool_name("TestName_TestPath") == ("TestName", "TestPath") + assert ToolAction.from_native_tool_name("TestName") == ("TestName", None) diff --git a/tests/unit/common/test_prompt_stack.py b/tests/unit/common/test_prompt_stack.py new file mode 100644 index 000000000..83a16e140 --- /dev/null +++ b/tests/unit/common/test_prompt_stack.py @@ -0,0 +1,90 @@ +import pytest + +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact, ActionArtifact +from griptape.common import ImageMessageContent, PromptStack, TextMessageContent +from griptape.common import ActionCallMessageContent +from griptape.common import ActionResultMessageContent, ToolAction + + +class TestPromptStack: + @pytest.fixture + def prompt_stack(self): + return PromptStack() + + def test_init(self): + assert PromptStack() + + def test_add_message(self, prompt_stack): + prompt_stack.add_message("foo", "role") + prompt_stack.add_message(TextArtifact("foo"), "role") + prompt_stack.add_message(ImageArtifact(b"foo", format="png", width=100, height=100), "role") + prompt_stack.add_message(ListArtifact([TextArtifact("foo"), TextArtifact("bar")]), "role") + prompt_stack.add_message( + ListArtifact( + [TextArtifact("foo"), ActionArtifact(ToolAction(tag="foo", name="bar", path="baz", input={}))] + ), + "role", + ) + prompt_stack.add_message( + ListArtifact( + [ + TextArtifact("foo"), + ActionArtifact(ToolAction(tag="foo", name="bar", path="baz", input={}, output=TextArtifact("qux"))), + ] + ), + "role", + ) + + assert prompt_stack.messages[0].role == "role" + assert isinstance(prompt_stack.messages[0].content[0], TextMessageContent) + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + assert prompt_stack.messages[1].role == "role" + assert isinstance(prompt_stack.messages[1].content[0], TextMessageContent) + assert prompt_stack.messages[1].content[0].artifact.value == "foo" + + assert prompt_stack.messages[2].role == "role" + assert isinstance(prompt_stack.messages[2].content[0], ImageMessageContent) + assert prompt_stack.messages[2].content[0].artifact.value == b"foo" + + assert prompt_stack.messages[3].role == "role" + assert isinstance(prompt_stack.messages[3].content[0], TextMessageContent) + assert prompt_stack.messages[3].content[0].artifact.value == "foo" + assert isinstance(prompt_stack.messages[3].content[1], TextMessageContent) + assert prompt_stack.messages[3].content[1].artifact.value == "bar" + + assert prompt_stack.messages[4].role == "role" + assert isinstance(prompt_stack.messages[4].content[0], TextMessageContent) + assert prompt_stack.messages[4].content[0].artifact.value == "foo" + assert isinstance(prompt_stack.messages[4].content[1], ActionCallMessageContent) + assert prompt_stack.messages[4].content[1].artifact.value.to_dict() == { + "tag": "foo", + "name": "bar", + "path": "baz", + "input": {}, + "type": "ToolAction", + } + + assert prompt_stack.messages[5].role == "role" + assert isinstance(prompt_stack.messages[5].content[0], TextMessageContent) + assert prompt_stack.messages[5].content[0].artifact.value == "foo" + assert isinstance(prompt_stack.messages[5].content[1], ActionResultMessageContent) + assert prompt_stack.messages[5].content[1].artifact.value == "qux" + + def test_add_system_message(self, prompt_stack): + prompt_stack.add_system_message("foo") + + assert prompt_stack.messages[0].role == "system" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + def test_add_user_message(self, prompt_stack): + prompt_stack.add_user_message("foo") + + assert prompt_stack.messages[0].role == "user" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" + + def test_add_assistant_message(self, prompt_stack): + prompt_stack.add_assistant_message("foo") + + assert prompt_stack.messages[0].role == "assistant" + assert prompt_stack.messages[0].content[0].artifact.value == "foo" diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index d75684829..824e6ce11 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -51,6 +51,8 @@ def test_to_dict(self, config): "stream": False, "temperature": 0.1, "type": "AmazonBedrockPromptDriver", + "tool_choice": {"auto": {}}, + "use_native_tools": True, }, "vector_store_driver": { "embedding_driver": { @@ -102,6 +104,8 @@ def test_to_dict_with_values(self, config_with_values): "stream": False, "temperature": 0.1, "type": "AmazonBedrockPromptDriver", + "tool_choice": {"auto": {}}, + "use_native_tools": True, }, "vector_store_driver": { "embedding_driver": { diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index 03f9775f6..b41309a83 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -23,11 +23,12 @@ def test_to_dict(self, config): "model": "claude-3-5-sonnet-20240620", "top_p": 0.999, "top_k": 250, + "use_native_tools": True, }, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, "image_query_driver": { "type": "AnthropicImageQueryDriver", - "model": "claude-3-opus-20240229", + "model": "claude-3-5-sonnet-20240620", "max_tokens": 256, }, "embedding_driver": { diff --git a/tests/unit/config/test_azure_openai_structure_config.py b/tests/unit/config/test_azure_openai_structure_config.py index 7e06dc0f5..58d557fb9 100644 --- a/tests/unit/config/test_azure_openai_structure_config.py +++ b/tests/unit/config/test_azure_openai_structure_config.py @@ -33,6 +33,7 @@ def test_to_dict(self, config): "max_tokens": None, "stream": False, "user": "", + "use_native_tools": True, }, "conversation_memory_driver": None, "embedding_driver": { diff --git a/tests/unit/config/test_cohere_structure_config.py b/tests/unit/config/test_cohere_structure_config.py index 1dc585421..44ed3e4d8 100644 --- a/tests/unit/config/test_cohere_structure_config.py +++ b/tests/unit/config/test_cohere_structure_config.py @@ -21,6 +21,8 @@ def test_to_dict(self, config): "max_tokens": None, "stream": False, "model": "command-r", + "force_single_step": False, + "use_native_tools": True, }, "embedding_driver": { "type": "CohereEmbeddingDriver", diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index ad96f2a35..469493e2c 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -22,6 +22,8 @@ def test_to_dict(self, config): "model": "gemini-1.5-pro", "top_p": None, "top_k": None, + "tool_choice": "auto", + "use_native_tools": True, }, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, "image_query_driver": {"type": "DummyImageQueryDriver"}, diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index 3dd1ac85f..19321006f 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -25,6 +25,7 @@ def test_to_dict(self, config): "max_tokens": None, "stream": False, "user": "", + "use_native_tools": True, }, "conversation_memory_driver": None, "embedding_driver": { diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index a420205f2..27aaf81c4 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -10,7 +10,13 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "StructureConfig", - "prompt_driver": {"type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False}, + "prompt_driver": { + "type": "DummyPromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "use_native_tools": False, + }, "conversation_memory_driver": None, "embedding_driver": {"type": "DummyEmbeddingDriver"}, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 3cd165140..4b8323969 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -1,17 +1,154 @@ import pytest -from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact, ErrorArtifact, ActionArtifact from griptape.common import PromptStack +from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction from griptape.drivers import AmazonBedrockPromptDriver +from tests.mocks.mock_tool.tool import MockTool + class TestAmazonBedrockPromptDriver: + BEDROCK_TOOLS = [ + { + "toolSpec": { + "description": "test description: foo", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + } + }, + "name": "MockTool_test", + } + }, + { + "toolSpec": { + "description": "test description: foo", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + } + }, + "name": "MockTool_test_error", + } + }, + { + "toolSpec": { + "description": "test description", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + } + }, + "name": "MockTool_test_list_output", + } + }, + { + "toolSpec": { + "description": "test description", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + } + }, + "name": "MockTool_test_no_schema", + } + }, + { + "toolSpec": { + "description": "test description: foo", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + } + }, + "name": "MockTool_test_str_output", + } + }, + { + "toolSpec": { + "description": "test description", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + } + }, + "name": "MockTool_test_without_default_memory", + } + }, + ] + @pytest.fixture def mock_converse(self, mocker): mock_converse = mocker.patch("boto3.Session").return_value.client.return_value.converse mock_converse.return_value = { - "output": {"message": {"content": [{"text": "model-output"}]}}, + "output": { + "message": { + "content": [ + {"text": "model-output"}, + {"toolUse": {"name": "MockTool_test", "toolUseId": "mock-id", "input": {"foo": "bar"}}}, + ] + } + }, "usage": {"inputTokens": 5, "outputTokens": 10}, } @@ -23,7 +160,15 @@ def mock_converse_stream(self, mocker): mock_converse_stream.return_value = { "stream": [ + {"contentBlockStart": {"contentBlockIndex": 0, "start": {"text": "model-output"}}}, {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": "model-output"}}}, + { + "contentBlockStart": { + "contentBlockIndex": 1, + "start": {"toolUse": {"name": "MockTool_test", "toolUseId": "mock-id"}}, + } + }, + {"contentBlockDelta": {"contentBlockIndex": 1, "delta": {"toolUse": {"input": '{"foo": "bar"}'}}}}, {"metadata": {"usage": {"inputTokens": 5, "outputTokens": 10}}}, ] } @@ -33,12 +178,77 @@ def mock_converse_stream(self, mocker): @pytest.fixture(params=[True, False]) def prompt_stack(self, request): prompt_stack = PromptStack() + prompt_stack.tools = [MockTool()] if request.param: prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") - prompt_stack.add_user_message(TextArtifact("user-input")) - prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) prompt_stack.add_assistant_message("assistant-input") + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=ListArtifact( + [ + TextArtifact("tool-output"), + ImageArtifact(value=b"image-data", format="png", width=100, height=100), + ] + ), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=ErrorArtifact("error"), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) return prompt_stack @@ -46,33 +256,91 @@ def prompt_stack(self, request): def messages(self): return [ {"role": "user", "content": [{"text": "user-input"}]}, - {"role": "user", "content": [{"text": "user-input"}]}, - {"role": "user", "content": [{"image": {"format": "png", "source": {"bytes": b"image-data"}}}]}, + { + "role": "user", + "content": [{"text": "user-input"}, {"image": {"format": "png", "source": {"bytes": b"image-data"}}}], + }, {"role": "assistant", "content": [{"text": "assistant-input"}]}, + { + "content": [ + {"text": "thought"}, + {"toolUse": {"input": {"foo": "bar"}, "name": "MockTool_test", "toolUseId": "MockTool_test"}}, + ], + "role": "assistant", + }, + { + "content": [ + { + "toolResult": { + "content": [{"text": "tool-output"}], + "status": "success", + "toolUseId": "MockTool_test", + } + }, + {"text": "keep-going"}, + ], + "role": "user", + }, + { + "content": [ + { + "toolResult": { + "content": [ + {"text": "tool-output"}, + {"image": {"format": "png", "source": {"bytes": b"image-data"}}}, + ], + "status": "success", + "toolUseId": "MockTool_test", + } + }, + {"text": "keep-going"}, + ], + "role": "user", + }, + { + "content": [ + {"toolResult": {"content": [{"text": "error"}], "status": "error", "toolUseId": "MockTool_test"}}, + {"text": "keep-going"}, + ], + "role": "user", + }, ] - def test_try_run(self, mock_converse, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_converse, prompt_stack, messages, use_native_tools): # Given - driver = AmazonBedrockPromptDriver(model="ai21.j2") + driver = AmazonBedrockPromptDriver(model="ai21.j2", use_native_tools=use_native_tools) # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_converse.assert_called_once_with( modelId=driver.model, messages=messages, - **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), inferenceConfig={"temperature": driver.temperature}, additionalModelRequestFields={}, + **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), + **( + {"toolConfig": {"tools": self.BEDROCK_TOOLS, "toolChoice": driver.tool_choice}} + if use_native_tools + else {} + ), ) - assert text_artifact.value == "model-output" - assert text_artifact.usage.input_tokens == 5 - assert text_artifact.usage.output_tokens == 10 + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "mock-id" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} + assert message.usage.input_tokens == 5 + assert message.usage.output_tokens == 10 - def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages, use_native_tools): # Given - driver = AmazonBedrockPromptDriver(model="ai21.j2", stream=True) + driver = AmazonBedrockPromptDriver(model="ai21.j2", stream=True, use_native_tools=use_native_tools) # When stream = driver.try_stream(prompt_stack) @@ -82,13 +350,30 @@ def test_try_stream_run(self, mock_converse_stream, prompt_stack, messages): mock_converse_stream.assert_called_once_with( modelId=driver.model, messages=messages, - **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), inferenceConfig={"temperature": driver.temperature}, additionalModelRequestFields={}, + **({"system": [{"text": "system-input"}]} if prompt_stack.system_messages else {"system": []}), + **( + {"toolConfig": {"tools": self.BEDROCK_TOOLS, "toolChoice": driver.tool_choice}} + if prompt_stack.tools and use_native_tools + else {} + ), ) + event = next(stream) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "mock-id" + assert event.content.name == "MockTool" + assert event.content.path == "test" + + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.partial_input == '{"foo": "bar"}' + event = next(stream) assert event.usage.input_tokens == 5 assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index 858c05ee6..67b3af372 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -1,20 +1,129 @@ +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import AnthropicPromptDriver -from griptape.common import PromptStack -from griptape.artifacts import TextArtifact, ImageArtifact, ListArtifact +from griptape.common import PromptStack, TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction +from griptape.artifacts import TextArtifact, ActionArtifact, ImageArtifact, ListArtifact from unittest.mock import Mock import pytest +from tests.mocks.mock_tool.tool import MockTool + class TestAnthropicPromptDriver: + ANTHROPIC_TOOLS = [ + { + "description": "test description: foo", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + "name": "MockTool_test", + }, + { + "description": "test description: foo", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + "name": "MockTool_test_error", + }, + { + "description": "test description", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + }, + "name": "MockTool_test_list_output", + }, + { + "description": "test description", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + }, + "name": "MockTool_test_no_schema", + }, + { + "description": "test description: foo", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + "name": "MockTool_test_str_output", + }, + { + "description": "test description", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + "name": "MockTool_test_without_default_memory", + }, + ] + @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("anthropic.Anthropic") + mock_tool_use = Mock(type="tool_use", id="mock-id", input={"foo": "bar"}) + mock_tool_use.name = "MockTool_test" mock_client.return_value = Mock( messages=Mock( create=Mock( return_value=Mock( - usage=Mock(input_tokens=5, output_tokens=10), content=[Mock(type="text", text="model-output")] + usage=Mock(input_tokens=5, output_tokens=10), + content=[Mock(type="text", text="model-output"), mock_tool_use], ) ) ) @@ -26,13 +135,29 @@ def mock_client(self, mocker): def mock_stream_client(self, mocker): mock_stream_client = mocker.patch("anthropic.Anthropic") + mock_tool_call_delta_header = Mock(type="tool_use", id="mock-id") + mock_tool_call_delta_header.name = "MockTool_test" + mock_stream_client.return_value = Mock( messages=Mock( create=Mock( return_value=iter( [ Mock(type="message_start", message=Mock(usage=Mock(input_tokens=5))), - Mock(type="content_block_delta", delta=Mock(type="text_delta", text="model-output")), + Mock( + type="content_block_start", + index=0, + content_block=Mock(type="text", text="model-output"), + ), + Mock( + type="content_block_delta", index=0, delta=Mock(type="text_delta", text="model-output") + ), + Mock(type="content_block_start", index=1, content_block=mock_tool_call_delta_header), + Mock( + type="content_block_delta", + index=1, + delta=Mock(type="input_json_delta", partial_json='{"foo": "bar"}'), + ), Mock(type="message_delta", usage=Mock(output_tokens=10)), ] ) @@ -42,104 +167,188 @@ def mock_stream_client(self, mocker): return mock_stream_client - @pytest.mark.parametrize("model", [("claude-2.1"), ("claude-2.0")]) - def test_init(self, model): - assert AnthropicPromptDriver(model=model, api_key="1234") - - @pytest.mark.parametrize( - "model", - [ - ("claude-instant-1.2"), - ("claude-2.1"), - ("claude-2.0"), - ("claude-3-opus"), - ("claude-3-sonnet"), - ("claude-3-haiku"), - ], - ) - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_try_run(self, mock_client, model, system_enabled): - # Given + @pytest.fixture(params=[True, False]) + def prompt_stack(self, request): prompt_stack = PromptStack() - if system_enabled: + prompt_stack.tools = [MockTool()] + if request.param: prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") - prompt_stack.add_user_message(TextArtifact("user-input")) - prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) + prompt_stack.add_user_message( + ListArtifact( + [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] + ) + ) prompt_stack.add_assistant_message("assistant-input") - driver = AnthropicPromptDriver(model=model, api_key="api-key") - expected_messages = [ - {"role": "user", "content": "user-input"}, + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=ListArtifact( + [ + TextArtifact("tool-output"), + ImageArtifact(value=b"image-data", format="png", width=100, height=100), + ] + ), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=ErrorArtifact("error"), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) + + return prompt_stack + + @pytest.fixture + def messages(self): + return [ {"role": "user", "content": "user-input"}, { "content": [ + {"type": "text", "text": "user-input"}, { "source": {"data": "aW1hZ2UtZGF0YQ==", "media_type": "image/png", "type": "base64"}, "type": "image", - } + }, ], "role": "user", }, {"role": "assistant", "content": "assistant-input"}, + { + "content": [ + {"text": "thought", "type": "text"}, + {"id": "MockTool_test", "input": {"foo": "bar"}, "name": "MockTool_test", "type": "tool_use"}, + ], + "role": "assistant", + }, + { + "content": [ + { + "content": [{"text": "tool-output", "type": "text"}], + "is_error": False, + "tool_use_id": "MockTool_test", + "type": "tool_result", + }, + {"text": "keep-going", "type": "text"}, + ], + "role": "user", + }, + { + "content": [ + { + "content": [ + {"text": "tool-output", "type": "text"}, + { + "source": {"data": "aW1hZ2UtZGF0YQ==", "media_type": "image/png", "type": "base64"}, + "type": "image", + }, + ], + "is_error": False, + "tool_use_id": "MockTool_test", + "type": "tool_result", + }, + {"text": "keep-going", "type": "text"}, + ], + "role": "user", + }, + { + "content": [ + { + "content": [{"text": "error", "type": "text"}], + "is_error": True, + "tool_use_id": "MockTool_test", + "type": "tool_result", + }, + {"text": "keep-going", "type": "text"}, + ], + "role": "user", + }, ] + def test_init(self): + assert AnthropicPromptDriver(model="claude-3-haiku", api_key="1234") + + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_client, prompt_stack, messages, use_native_tools): + # Given + driver = AnthropicPromptDriver(model="claude-3-haiku", api_key="api-key", use_native_tools=use_native_tools) + # When message = driver.try_run(prompt_stack) # Then mock_client.return_value.messages.create.assert_called_once_with( - messages=expected_messages, + messages=messages, stop_sequences=[], model=driver.model, max_tokens=1000, temperature=0.1, top_p=0.999, top_k=250, - **{"system": "system-input"} if system_enabled else {}, + **{"system": "system-input"} if prompt_stack.system_messages else {}, + **{"tools": self.ANTHROPIC_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) - assert message.value == "model-output" + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "mock-id" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} assert message.usage.input_tokens == 5 assert message.usage.output_tokens == 10 - @pytest.mark.parametrize( - "model", - [ - ("claude-instant-1.2"), - ("claude-2.1"), - ("claude-2.0"), - ("claude-3-opus"), - ("claude-3-sonnet"), - ("claude-3-haiku"), - ], - ) - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_try_stream_run(self, mock_stream_client, model, system_enabled): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream_run(self, mock_stream_client, prompt_stack, messages, use_native_tools): # Given - prompt_stack = PromptStack() - if system_enabled: - prompt_stack.add_system_message("system-input") - prompt_stack.add_user_message("user-input") - prompt_stack.add_user_message( - ListArtifact( - [TextArtifact("user-input"), ImageArtifact(value=b"image-data", format="png", width=100, height=100)] - ) + driver = AnthropicPromptDriver( + model="claude-3-haiku", api_key="api-key", stream=True, use_native_tools=use_native_tools ) - prompt_stack.add_assistant_message("assistant-input") - expected_messages = [ - {"role": "user", "content": "user-input"}, - { - "content": [ - {"type": "text", "text": "user-input"}, - { - "source": {"data": "aW1hZ2UtZGF0YQ==", "media_type": "image/png", "type": "base64"}, - "type": "image", - }, - ], - "role": "user", - }, - {"role": "assistant", "content": "assistant-input"}, - ] - driver = AnthropicPromptDriver(model=model, api_key="api-key", stream=True) # When stream = driver.try_stream(prompt_stack) @@ -147,7 +356,7 @@ def test_try_stream_run(self, mock_stream_client, model, system_enabled): # Then mock_stream_client.return_value.messages.create.assert_called_once_with( - messages=expected_messages, + messages=messages, stop_sequences=[], model=driver.model, max_tokens=1000, @@ -155,24 +364,28 @@ def test_try_stream_run(self, mock_stream_client, model, system_enabled): stream=True, top_p=0.999, top_k=250, - **{"system": "system-input"} if system_enabled else {}, + **{"system": "system-input"} if prompt_stack.system_messages else {}, + **{"tools": self.ANTHROPIC_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) assert event.usage.input_tokens == 5 event = next(stream) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" event = next(stream) - assert event.usage.output_tokens == 10 + assert isinstance(event.content, TextDeltaMessageContent) + assert event.content.text == "model-output" - def test_try_run_throws_when_prompt_stack_is_string(self): - # Given - prompt_stack = "prompt-stack" - driver = AnthropicPromptDriver(model="claude", api_key="api-key") + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "mock-id" + assert event.content.name == "MockTool" + assert event.content.path == "test" - # When - with pytest.raises(Exception) as e: - driver.try_run(prompt_stack) # pyright: ignore + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.partial_input == '{"foo": "bar"}' - # Then - assert e.value.args[0] == "'str' object has no attribute 'messages'" + event = next(stream) + assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index 378ecc3da..9e56b39bd 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -1,6 +1,8 @@ import pytest +from griptape.artifacts import TextArtifact, ActionArtifact from unittest.mock import Mock from griptape.drivers import AzureOpenAiChatPromptDriver +from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent from tests.unit.drivers.prompt.test_openai_chat_prompt_driver import TestOpenAiChatPromptDriverFixtureMixin @@ -8,20 +10,52 @@ class TestAzureOpenAiChatPromptDriver(TestOpenAiChatPromptDriverFixtureMixin): @pytest.fixture def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create + mock_function = Mock(arguments='{"foo": "bar"}', id="mock-id") + mock_function.name = "MockTool_test" mock_chat_create.return_value = Mock( headers={}, - choices=[Mock(message=Mock(content="model-output"))], + choices=[ + Mock(message=Mock(content="model-output", tool_calls=[Mock(id="mock-id", function=mock_function)])) + ], usage=Mock(prompt_tokens=5, completion_tokens=10), ) + return mock_chat_create @pytest.fixture def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create + mock_tool_call_delta_header = Mock() + mock_tool_call_delta_header.name = "MockTool_test" + mock_tool_call_delta_body = Mock(arguments='{"foo": "bar"}') + mock_tool_call_delta_body.name = None + mock_chat_create.return_value = iter( [ - Mock(choices=[Mock(delta=Mock(content="model-output"))], usage=None), + Mock(choices=[Mock(delta=Mock(content="model-output", tool_calls=None))], usage=None), + Mock( + choices=[ + Mock( + delta=Mock( + content=None, + tool_calls=[Mock(index=0, id="mock-id", function=mock_tool_call_delta_header)], + ) + ) + ], + usage=None, + ), + Mock( + choices=[ + Mock( + delta=Mock( + content=None, tool_calls=[Mock(index=0, id=None, function=mock_tool_call_delta_body)] + ) + ) + ], + usage=None, + ), Mock(choices=None, usage=Mock(prompt_tokens=5, completion_tokens=10)), + Mock(choices=[Mock(delta=Mock(content=None, tool_calls=None))], usage=None), ] ) return mock_chat_create @@ -30,25 +64,44 @@ def test_init(self): assert AzureOpenAiChatPromptDriver(azure_endpoint="foobar", azure_deployment="foobar", model="gpt-4") assert AzureOpenAiChatPromptDriver(azure_endpoint="foobar", model="gpt-4").azure_deployment == "gpt-4" - def test_try_run(self, mock_chat_completion_create, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_chat_completion_create, prompt_stack, messages, use_native_tools): # Given - driver = AzureOpenAiChatPromptDriver(azure_endpoint="endpoint", azure_deployment="deployment-id", model="gpt-4") + driver = AzureOpenAiChatPromptDriver( + azure_endpoint="endpoint", + azure_deployment="deployment-id", + model="gpt-4", + use_native_tools=use_native_tools, + ) # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( - model=driver.model, temperature=driver.temperature, user=driver.user, messages=messages + model=driver.model, + temperature=driver.temperature, + user=driver.user, + messages=messages, + **{"tools": self.OPENAI_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) - assert text_artifact.value == "model-output" - assert text_artifact.usage.input_tokens == 5 - assert text_artifact.usage.output_tokens == 10 + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "mock-id" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} - def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages, use_native_tools): # Given driver = AzureOpenAiChatPromptDriver( - azure_endpoint="endpoint", azure_deployment="deployment-id", model="gpt-4", stream=True + azure_endpoint="endpoint", + azure_deployment="deployment-id", + model="gpt-4", + stream=True, + use_native_tools=use_native_tools, ) # When @@ -57,11 +110,30 @@ def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, # Then mock_chat_completion_stream_create.assert_called_once_with( - model=driver.model, temperature=driver.temperature, user=driver.user, stream=True, messages=messages + model=driver.model, + temperature=driver.temperature, + user=driver.user, + stream=True, + messages=messages, + **{"tools": self.OPENAI_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "mock-id" + assert event.content.name == "MockTool" + assert event.content.path == "test" + + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.partial_input == '{"foo": "bar"}' + event = next(stream) assert event.usage.input_tokens == 5 assert event.usage.output_tokens == 10 + event = next(stream) + assert isinstance(event.content, TextDeltaMessageContent) + assert event.content.text == "" diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index d65775e8b..059aaffe5 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -2,16 +2,48 @@ import pytest -from griptape.common import PromptStack +from griptape.artifacts.action_artifact import ActionArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.artifacts.text_artifact import TextArtifact +from griptape.common import PromptStack, ToolAction from griptape.drivers import CoherePromptDriver +from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent +from tests.mocks.mock_tool.tool import MockTool class TestCoherePromptDriver: + COHERE_TOOLS = [ + { + "description": "test description: foo", + "name": "MockTool_test", + "parameter_definitions": {"test": {"required": True, "type": "string"}}, + }, + { + "description": "test description: foo", + "name": "MockTool_test_error", + "parameter_definitions": {"test": {"required": True, "type": "string"}}, + }, + {"description": "test description", "name": "MockTool_test_list_output", "parameter_definitions": {}}, + {"description": "test description", "name": "MockTool_test_no_schema", "parameter_definitions": {}}, + { + "description": "test description: foo", + "name": "MockTool_test_str_output", + "parameter_definitions": {"test": {"required": True, "type": "string"}}, + }, + { + "description": "test description", + "name": "MockTool_test_without_default_memory", + "parameter_definitions": {"test": {"required": True, "type": "string"}}, + }, + ] + @pytest.fixture def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value + mock_tool_call = Mock(parameters={"foo": "bar"}) + mock_tool_call.name = "MockTool_test" mock_client.chat.return_value = Mock( - text="model-output", meta=Mock(tokens=Mock(input_tokens=5, output_tokens=10)) + text="model-output", meta=Mock(tokens=Mock(input_tokens=5, output_tokens=10)), tool_calls=[mock_tool_call] ) return mock_client @@ -19,9 +51,16 @@ def mock_client(self, mocker): @pytest.fixture def mock_stream_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value + mock_tool_call_delta_header = Mock() + mock_tool_call_delta_header.name = "MockTool_test" + mock_tool_call_delta_body = Mock() + mock_tool_call_delta_body.name = None + mock_tool_call_delta_body.parameters = '{"foo": "bar"}' mock_client.chat_stream.return_value = iter( [ Mock(text="model-output", event_type="text-generation"), + Mock(text="model-output", event_type="tool-calls-chunk", tool_call_delta=mock_tool_call_delta_header), + Mock(text="model-output", event_type="tool-calls-chunk", tool_call_delta=mock_tool_call_delta_body), Mock(response=Mock(meta=Mock(tokens=Mock(input_tokens=5, output_tokens=10))), event_type="stream-end"), ] ) @@ -35,67 +74,161 @@ def mock_tokenizer(self, mocker): @pytest.fixture(params=[True, False]) def prompt_stack(self, request): prompt_stack = PromptStack() + prompt_stack.tools = [MockTool()] if request.param: prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") prompt_stack.add_assistant_message("assistant-input") - prompt_stack.add_user_message("user-input") - prompt_stack.add_assistant_message("assistant-input") + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + TextArtifact("keep going"), + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + TextArtifact("keep going"), + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + ] + ) + ) return prompt_stack def test_init(self): assert CoherePromptDriver(model="command", api_key="foobar") - def test_try_run(self, mock_client, prompt_stack): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_client, prompt_stack, use_native_tools): # Given - driver = CoherePromptDriver(model="command", api_key="api-key") + driver = CoherePromptDriver(model="command", api_key="api-key", use_native_tools=use_native_tools) # When - text_artifact = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_client.chat.assert_called_once_with( chat_history=[ - {"content": [{"text": "user-input"}], "role": "USER"}, - {"content": [{"text": "assistant-input"}], "role": "CHATBOT"}, - {"content": [{"text": "user-input"}], "role": "USER"}, + {"message": "user-input", "role": "USER"}, + {"message": "assistant-input", "role": "CHATBOT"}, + { + "message": "thought", + "role": "CHATBOT", + "tool_calls": [{"name": "MockTool_test", "parameters": {"foo": "bar"}}], + }, + { + "message": "keep going", + "role": "TOOL", + "tool_results": [ + { + "call": {"name": "MockTool_test", "parameters": {"foo": "bar"}}, + "outputs": [{"text": "tool-output"}], + } + ], + }, ], max_tokens=None, - message="assistant-input", + message="keep going", + **({"tools": self.COHERE_TOOLS, "force_single_step": False} if use_native_tools else {}), **({"preamble": "system-input"} if prompt_stack.system_messages else {}), + tool_results=[ + {"call": {"name": "MockTool_test", "parameters": {"foo": "bar"}}, "outputs": [{"text": "tool-output"}]} + ], stop_sequences=[], temperature=0.1, ) - assert text_artifact.value == "model-output" - assert text_artifact.usage.input_tokens == 5 - assert text_artifact.usage.output_tokens == 10 + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "MockTool_test" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} - def test_try_stream_run(self, mock_stream_client, prompt_stack): # pyright: ignore + assert message.usage.input_tokens == 5 + assert message.usage.output_tokens == 10 + + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream_run(self, mock_stream_client, prompt_stack, use_native_tools): # Given - driver = CoherePromptDriver(model="command", api_key="api-key", stream=True) + driver = CoherePromptDriver(model="command", api_key="api-key", stream=True, use_native_tools=use_native_tools) # When stream = driver.try_stream(prompt_stack) event = next(stream) # Then - mock_stream_client.chat_stream.assert_called_once_with( chat_history=[ - {"content": [{"text": "user-input"}], "role": "USER"}, - {"content": [{"text": "assistant-input"}], "role": "CHATBOT"}, - {"content": [{"text": "user-input"}], "role": "USER"}, + {"message": "user-input", "role": "USER"}, + {"message": "assistant-input", "role": "CHATBOT"}, + { + "message": "thought", + "role": "CHATBOT", + "tool_calls": [{"name": "MockTool_test", "parameters": {"foo": "bar"}}], + }, + { + "role": "TOOL", + "message": "keep going", + "tool_results": [ + { + "call": {"name": "MockTool_test", "parameters": {"foo": "bar"}}, + "outputs": [{"text": "tool-output"}], + } + ], + }, ], max_tokens=None, - message="assistant-input", + message="keep going", + **({"tools": self.COHERE_TOOLS, "force_single_step": False} if use_native_tools else {}), **({"preamble": "system-input"} if prompt_stack.system_messages else {}), + tool_results=[ + {"call": {"name": "MockTool_test", "parameters": {"foo": "bar"}}, "outputs": [{"text": "tool-output"}]} + ], stop_sequences=[], temperature=0.1, ) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "MockTool_test" + assert event.content.name == "MockTool" + assert event.content.path == "test" + + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.partial_input == '{"foo": "bar"}' + event = next(stream) assert event.usage.input_tokens == 5 assert event.usage.output_tokens == 10 diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index 6a25ec3d3..c4b341481 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -1,17 +1,51 @@ -from google.generativeai.types import GenerationConfig -from griptape.artifacts import TextArtifact, ImageArtifact +from google.generativeai.types import ContentDict, GenerationConfig +from google.generativeai.protos import FunctionCall, FunctionResponse, Part +from griptape.artifacts import TextArtifact, ImageArtifact, ActionArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction from griptape.drivers import GooglePromptDriver from griptape.common import PromptStack from unittest.mock import Mock +from tests.mocks.mock_tool.tool import MockTool +from google.protobuf.json_format import MessageToDict + import pytest class TestGooglePromptDriver: + GOOGLE_TOOLS = [ + { + "name": "MockTool_test", + "description": "test description: foo", + "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, + }, + { + "name": "MockTool_test_error", + "description": "test description: foo", + "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, + }, + {"name": "MockTool_test_list_output", "description": "test description", "parameters": {"type": "OBJECT"}}, + {"name": "MockTool_test_no_schema", "description": "test description", "parameters": {"type": "OBJECT"}}, + { + "name": "MockTool_test_str_output", + "description": "test description: foo", + "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, + }, + { + "name": "MockTool_test_without_default_memory", + "description": "test description", + "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, + }, + ] + @pytest.fixture def mock_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") + mock_function_call = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) + mock_function_call.name = "MockTool_test" mock_generative_model.return_value.generate_content.return_value = Mock( - text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=10) + parts=[Mock(text="model-output", function_call=None), Mock(text=None, function_call=mock_function_call)], + usage_metadata=Mock(prompt_token_count=5, candidates_token_count=10), ) return mock_generative_model @@ -19,90 +53,171 @@ def mock_generative_model(self, mocker): @pytest.fixture def mock_stream_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") + mock_function_call_delta = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) + mock_function_call_delta.name = "MockTool_test" mock_generative_model.return_value.generate_content.return_value = iter( [ - Mock(text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5)), - Mock(text="model-output", usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5)), + Mock( + parts=[Mock(text="model-output")], + usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + ), + Mock( + parts=[Mock(text=None, function_call=mock_function_call_delta)], + usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + ), + Mock( + parts=[Mock(text="model-output")], + usage_metadata=Mock(prompt_token_count=5, candidates_token_count=5), + ), ] ) return mock_generative_model - def test_init(self): - driver = GooglePromptDriver(model="gemini-pro", api_key="1234") - assert driver - - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_try_run(self, mock_generative_model, system_enabled): - # Given + @pytest.fixture(params=[True, False]) + def prompt_stack(self, request): prompt_stack = PromptStack() - if system_enabled: + prompt_stack.tools = [MockTool()] + if request.param: prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") prompt_stack.add_user_message(TextArtifact("user-input")) prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) prompt_stack.add_assistant_message("assistant-input") - driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", top_p=0.5, top_k=50) - # When - text_artifact = driver.try_run(prompt_stack) + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output", id="output"), + ) + ), + TextArtifact("keep-going"), + ] + ) + ) - # Then - messages = [ - *( - [{"parts": ["system-input", "user-input"], "role": "user"}] - if system_enabled - else [{"parts": ["user-input"], "role": "user"}] - ), + return prompt_stack + + @pytest.fixture + def messages(self): + return [ + {"parts": ["user-input"], "role": "user"}, {"parts": ["user-input"], "role": "user"}, {"parts": [{"data": b"image-data", "mime_type": "image/png"}], "role": "user"}, {"parts": ["assistant-input"], "role": "model"}, + { + "parts": ["thought", Part(function_call=FunctionCall(name="MockTool_test", args={"foo": "bar"}))], + "role": "model", + }, + { + "parts": [ + Part( + function_response=FunctionResponse( + name="MockTool_test", response=TextArtifact("tool-output", id="output").to_dict() + ) + ), + "keep-going", + ], + "role": "user", + }, ] - mock_generative_model.return_value.generate_content.assert_called_once_with( - messages, - generation_config=GenerationConfig( - max_output_tokens=None, temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[] - ), + + def test_init(self): + driver = GooglePromptDriver(model="gemini-pro", api_key="1234") + assert driver + + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_generative_model, prompt_stack, messages, use_native_tools): + # Given + driver = GooglePromptDriver( + model="gemini-pro", api_key="api-key", top_p=0.5, top_k=50, use_native_tools=use_native_tools ) - assert text_artifact.value == "model-output" - assert text_artifact.usage.input_tokens == 5 - assert text_artifact.usage.output_tokens == 10 - @pytest.mark.parametrize("system_enabled", [True, False]) - def test_try_stream(self, mock_stream_generative_model, system_enabled): + # When + message = driver.try_run(prompt_stack) + + # Then + if prompt_stack.system_messages: + assert mock_generative_model.return_value._system_instruction == ContentDict( + role="system", parts=[Part(text="system-input")] + ) + mock_generative_model.return_value.generate_content.assert_called_once() + # We can't use assert_called_once_with because we can't compare the FunctionDeclaration objects + call_args = mock_generative_model.return_value.generate_content.call_args + assert messages == call_args.args[0] + generation_config = call_args.kwargs["generation_config"] + assert generation_config == GenerationConfig(temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[]) + if use_native_tools: + tool_declarations = call_args.kwargs["tools"] + assert [ + MessageToDict(tool_declaration.to_proto()._pb) for tool_declaration in tool_declarations + ] == self.GOOGLE_TOOLS + + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "MockTool_test" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} + assert message.usage.input_tokens == 5 + assert message.usage.output_tokens == 10 + + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream(self, mock_stream_generative_model, prompt_stack, messages, use_native_tools): # Given - prompt_stack = PromptStack() - if system_enabled: - prompt_stack.add_system_message("system-input") - prompt_stack.add_user_message("user-input") - prompt_stack.add_user_message(TextArtifact("user-input")) - prompt_stack.add_user_message(ImageArtifact(value=b"image-data", format="png", width=100, height=100)) - prompt_stack.add_assistant_message("assistant-input") - driver = GooglePromptDriver(model="gemini-pro", api_key="api-key", stream=True, top_p=0.5, top_k=50) + driver = GooglePromptDriver( + model="gemini-pro", api_key="api-key", stream=True, top_p=0.5, top_k=50, use_native_tools=use_native_tools + ) # When stream = driver.try_stream(prompt_stack) # Then event = next(stream) - messages = [ - *( - [{"parts": ["system-input", "user-input"], "role": "user"}] - if system_enabled - else [{"parts": ["user-input"], "role": "user"}] - ), - {"parts": ["user-input"], "role": "user"}, - {"parts": [{"data": b"image-data", "mime_type": "image/png"}], "role": "user"}, - {"parts": ["assistant-input"], "role": "model"}, - ] - mock_stream_generative_model.return_value.generate_content.assert_called_once_with( - messages, - stream=True, - generation_config=GenerationConfig(temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[]), + if prompt_stack.system_messages: + assert mock_stream_generative_model.return_value._system_instruction == ContentDict( + role="system", parts=[Part(text="system-input")] + ) + # We can't use assert_called_once_with because we can't compare the FunctionDeclaration objects + mock_stream_generative_model.return_value.generate_content.assert_called_once() + call_args = mock_stream_generative_model.return_value.generate_content.call_args + + assert messages == call_args.args[0] + assert call_args.kwargs["stream"] is True + assert call_args.kwargs["generation_config"] == GenerationConfig( + temperature=0.1, top_p=0.5, top_k=50, stop_sequences=[] ) + if use_native_tools: + tool_declarations = call_args.kwargs["tools"] + assert [ + MessageToDict(tool_declaration.to_proto()._pb) for tool_declaration in tool_declarations + ] == self.GOOGLE_TOOLS + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" assert event.usage.input_tokens == 5 assert event.usage.output_tokens == 5 + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "MockTool_test" + assert event.content.name == "MockTool" + assert event.content.path == "test" + assert event.content.partial_input == '{"foo": "bar"}' + event = next(stream) assert event.usage.output_tokens == 5 diff --git a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py index 4618e1de3..ec7ea73f8 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py @@ -1,5 +1,5 @@ from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.common import PromptStack +from griptape.common import PromptStack, TextDeltaMessageContent import pytest @@ -65,6 +65,7 @@ def test_try_stream(self, prompt_stack, mock_client_stream): event = next(stream) # Then + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" event = next(stream) diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 5c217ed06..9e664a398 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -1,20 +1,146 @@ from griptape.artifacts import ImageArtifact, ListArtifact -from griptape.artifacts import TextArtifact +from griptape.artifacts import TextArtifact, ActionArtifact from griptape.drivers import OpenAiChatPromptDriver -from griptape.common import PromptStack +from griptape.common import PromptStack, TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction from griptape.tokenizers import OpenAiTokenizer from unittest.mock import Mock from tests.mocks.mock_tokenizer import MockTokenizer +from tests.mocks.mock_tool.tool import MockTool import pytest class TestOpenAiChatPromptDriverFixtureMixin: + OPENAI_TOOLS = [ + { + "function": { + "description": "test description: foo", + "name": "MockTool_test", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_error", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_list_output", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_no_schema", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": {}, + "required": [], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_str_output", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + }, + "type": "function", + }, + { + "function": { + "description": "test description", + "name": "MockTool_test_without_default_memory", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + }, + "type": "function", + }, + ] + @pytest.fixture def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create + mock_function = Mock(arguments='{"foo": "bar"}', id="mock-id") + mock_function.name = "MockTool_test" mock_chat_create.return_value = Mock( headers={}, - choices=[Mock(message=Mock(content="model-output"))], + choices=[ + Mock(message=Mock(content="model-output", tool_calls=[Mock(id="mock-id", function=mock_function)])) + ], usage=Mock(prompt_tokens=5, completion_tokens=10), ) @@ -23,11 +149,37 @@ def mock_chat_completion_create(self, mocker): @pytest.fixture def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create + mock_tool_call_delta_header = Mock() + mock_tool_call_delta_header.name = "MockTool_test" + mock_tool_call_delta_body = Mock(arguments='{"foo": "bar"}') + mock_tool_call_delta_body.name = None + mock_chat_create.return_value = iter( [ - Mock(choices=[Mock(delta=Mock(content="model-output"))], usage=None), + Mock(choices=[Mock(delta=Mock(content="model-output", tool_calls=None))], usage=None), + Mock( + choices=[ + Mock( + delta=Mock( + content=None, + tool_calls=[Mock(index=0, id="mock-id", function=mock_tool_call_delta_header)], + ) + ) + ], + usage=None, + ), + Mock( + choices=[ + Mock( + delta=Mock( + content=None, tool_calls=[Mock(index=0, id=None, function=mock_tool_call_delta_body)] + ) + ) + ], + usage=None, + ), Mock(choices=None, usage=Mock(prompt_tokens=5, completion_tokens=10)), - Mock(choices=[Mock(delta=Mock(content=None))], usage=None), + Mock(choices=[Mock(delta=Mock(content=None, tool_calls=None))], usage=None), ] ) return mock_chat_create @@ -35,6 +187,7 @@ def mock_chat_completion_stream_create(self, mocker): @pytest.fixture def prompt_stack(self): prompt_stack = PromptStack() + prompt_stack.tools = [MockTool()] prompt_stack.add_system_message("system-input") prompt_stack.add_user_message("user-input") prompt_stack.add_user_message( @@ -43,6 +196,30 @@ def prompt_stack(self): ) ) prompt_stack.add_assistant_message("assistant-input") + prompt_stack.add_assistant_message( + ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact(ToolAction(tag="MockTool_test", name="MockTool", path="test", input={"foo": "bar"})), + ] + ) + ) + prompt_stack.add_user_message( + ListArtifact( + [ + TextArtifact("keep-going"), + ActionArtifact( + ToolAction( + tag="MockTool_test", + name="MockTool", + path="test", + input={"foo": "bar"}, + output=TextArtifact("tool-output"), + ) + ), + ] + ) + ) return prompt_stack @pytest.fixture @@ -58,6 +235,18 @@ def messages(self): ], }, {"role": "assistant", "content": "assistant-input"}, + { + "content": [{"text": "thought", "type": "text"}], + "role": "assistant", + "tool_calls": [ + { + "function": {"arguments": '{"foo": "bar"}', "name": "MockTool_test"}, + "id": "MockTool_test", + "type": "function", + } + ], + }, + {"content": "tool-output", "role": "tool", "tool_call_id": "MockTool_test"}, ] @@ -98,23 +287,37 @@ class TestOpenAiChatPromptDriver(TestOpenAiChatPromptDriverFixtureMixin): def test_init(self): assert OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_4_MODEL) - def test_try_run(self, mock_chat_completion_create, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_run(self, mock_chat_completion_create, prompt_stack, messages, use_native_tools): # Given - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) + driver = OpenAiChatPromptDriver( + model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, use_native_tools=use_native_tools + ) # When - event = driver.try_run(prompt_stack) + message = driver.try_run(prompt_stack) # Then mock_chat_completion_create.assert_called_once_with( - model=driver.model, temperature=driver.temperature, user=driver.user, messages=messages, seed=driver.seed + model=driver.model, + temperature=driver.temperature, + user=driver.user, + messages=messages, + seed=driver.seed, + **{"tools": self.OPENAI_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) - assert event.value == "model-output" + assert isinstance(message.value[0], TextArtifact) + assert message.value[0].value == "model-output" + assert isinstance(message.value[1], ActionArtifact) + assert message.value[1].value.tag == "mock-id" + assert message.value[1].value.name == "MockTool" + assert message.value[1].value.path == "test" + assert message.value[1].value.input == {"foo": "bar"} def test_try_run_response_format(self, mock_chat_completion_create, prompt_stack, messages): # Given driver = OpenAiChatPromptDriver( - model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, response_format="json_object" + model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, response_format="json_object", use_native_tools=False ) # When @@ -129,13 +332,16 @@ def test_try_run_response_format(self, mock_chat_completion_create, prompt_stack seed=driver.seed, response_format={"type": "json_object"}, ) - assert message.value == "model-output" + assert message.value[0].value == "model-output" assert message.usage.input_tokens == 5 assert message.usage.output_tokens == 10 - def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages): + @pytest.mark.parametrize("use_native_tools", [True, False]) + def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages, use_native_tools): # Given - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, stream=True) + driver = OpenAiChatPromptDriver( + model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, stream=True, use_native_tools=use_native_tools + ) # When stream = driver.try_stream(prompt_stack) @@ -150,19 +356,34 @@ def test_try_stream_run(self, mock_chat_completion_stream_create, prompt_stack, messages=messages, seed=driver.seed, stream_options={"include_usage": True}, + **{"tools": self.OPENAI_TOOLS, "tool_choice": driver.tool_choice} if use_native_tools else {}, ) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "model-output" + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.tag == "mock-id" + assert event.content.name == "MockTool" + assert event.content.path == "test" + + event = next(stream) + assert isinstance(event.content, ActionCallDeltaMessageContent) + assert event.content.partial_input == '{"foo": "bar"}' + event = next(stream) assert event.usage.input_tokens == 5 assert event.usage.output_tokens == 10 event = next(stream) + assert isinstance(event.content, TextDeltaMessageContent) assert event.content.text == "" def test_try_run_with_max_tokens(self, mock_chat_completion_create, prompt_stack, messages): # Given - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, max_tokens=1) + driver = OpenAiChatPromptDriver( + model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, max_tokens=1, use_native_tools=False + ) # When event = driver.try_run(prompt_stack) @@ -176,18 +397,7 @@ def test_try_run_with_max_tokens(self, mock_chat_completion_create, prompt_stack max_tokens=1, seed=driver.seed, ) - assert event.value == "model-output" - - def test_try_run_throws_when_prompt_stack_is_string(self): - # Given - driver = OpenAiChatPromptDriver(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL) - - # When - with pytest.raises(Exception) as e: - driver.try_run("prompt-stack") # pyright: ignore - - # Then - assert e.value.args[0] == "'str' object has no attribute 'messages'" + assert event.value[0].value == "model-output" def test_try_run_throws_when_multiple_choices_returned(self, mock_chat_completion_create, prompt_stack): # Given @@ -206,6 +416,7 @@ def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messa model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL, tokenizer=MockTokenizer(model="mock-model", stop_sequences=["mock-stop"]), max_tokens=1, + use_native_tools=False, ) # When @@ -221,4 +432,4 @@ def test_custom_tokenizer(self, mock_chat_completion_create, prompt_stack, messa seed=driver.seed, max_tokens=1, ) - assert event.value == "model-output" + assert event.value[0].value == "model-output" diff --git a/tests/unit/tasks/test_actions_subtask.py b/tests/unit/tasks/test_actions_subtask.py index 8b231d85f..ede892e2d 100644 --- a/tests/unit/tasks/test_actions_subtask.py +++ b/tests/unit/tasks/test_actions_subtask.py @@ -1,7 +1,10 @@ import json +from griptape.artifacts import ListArtifact, TextArtifact, ActionArtifact +from griptape.artifacts.error_artifact import ErrorArtifact from tests.mocks.mock_tool.tool import MockTool from griptape.tasks import ToolkitTask, ActionsSubtask from griptape.structures import Agent +from griptape.common import ToolAction class TestActionsSubtask: @@ -22,6 +25,58 @@ def test_basic_input(self): assert json_dict[0]["path"] == "test" assert json_dict[0]["input"] == {"values": {"test": "value"}} + def test_action_input(self): + valid_input = ActionArtifact( + ToolAction(tag="foo", name="MockTool", path="test", input={"values": {"test": "value"}}) + ) + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + json_dict = json.loads(subtask.actions_to_json()) + + assert subtask.thought is None + assert json_dict[0]["name"] == "MockTool" + assert json_dict[0]["path"] == "test" + assert json_dict[0]["input"] == {"values": {"test": "value"}} + + def test_action_and_thought_input(self): + valid_input = ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact( + ToolAction(tag="foo", name="MockTool", path="test", input={"values": {"test": "value"}}) + ), + ] + ) + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + json_dict = json.loads(subtask.actions_to_json()) + + assert subtask.thought == "thought" + assert json_dict[0]["name"] == "MockTool" + assert json_dict[0]["path"] == "test" + assert json_dict[0]["input"] == {"values": {"test": "value"}} + + def test_callable_input(self): + valid_input = ListArtifact( + [ + TextArtifact("thought"), + ActionArtifact( + ToolAction(tag="foo", name="MockTool", path="test", input={"values": {"test": "value"}}) + ), + ] + ) + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(lambda task: valid_input)) + json_dict = json.loads(subtask.actions_to_json()) + + assert subtask.thought == "thought" + assert json_dict[0]["name"] == "MockTool" + assert json_dict[0]["path"] == "test" + assert json_dict[0]["input"] == {"values": {"test": "value"}} + def test_input_with_multiline_actions(self): valid_input = ( "Thought: need to test\n" @@ -87,7 +142,23 @@ def test_invalid_actions(self): task = ToolkitTask(tools=[MockTool()]) Agent().add_task(task) subtask = task.add_subtask(ActionsSubtask(invalid_input)) + + assert isinstance(subtask.output, ErrorArtifact) + assert "Actions JSON decoding error" in subtask.output.value + + def test_implicit_values(self): + valid_input = ( + "Thought: need to test\n" + 'Actions:[{"tag": "foo", "name": "MockTool","path": "test","input": {"test":\n"value"}}]' + "Response: test response\n" + "Answer: test output" + ) + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) json_dict = json.loads(subtask.actions_to_json()) - assert json_dict[0]["name"] == "error" - assert "Action input parsing error" in json_dict[0]["input"]["error"] + assert json_dict[0]["name"] == "MockTool" + assert json_dict[0]["path"] == "test" + assert json_dict[0]["input"] == {"values": {"test": "value"}} diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index cc05a5caf..38002553c 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -1,6 +1,7 @@ from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.structures import Agent from griptape.tasks import ToolkitTask, ActionsSubtask, PromptTask +from griptape.common import ToolAction from tests.mocks.mock_tool.tool import MockTool from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils import defaults @@ -160,7 +161,7 @@ def test_run(self): assert result.output_task.output.to_text() == "done" def test_run_max_subtasks(self): - output = """Actions: [{"name": "blah"}]""" + output = 'Actions: [{"tag": "foo", "name": "Tool1", "path": "test", "input": {"values": {"test": "value"}}}]' task = ToolkitTask("test", tools=[MockTool(name="Tool1")], max_subtasks=3) agent = Agent(prompt_driver=MockPromptDriver(mock_output=output)) @@ -221,10 +222,10 @@ def test_init_from_prompt_2(self): def test_add_subtask(self): task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) subtask1 = ActionsSubtask( - "test1", actions=[ActionsSubtask.Action(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] + "test1", actions=[ToolAction(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] ) subtask2 = ActionsSubtask( - "test2", actions=[ActionsSubtask.Action(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] + "test2", actions=[ToolAction(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] ) Agent().add_task(task) @@ -245,10 +246,10 @@ def test_add_subtask(self): def test_find_subtask(self): task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) subtask1 = ActionsSubtask( - "test1", actions=[ActionsSubtask.Action(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] + "test1", actions=[ToolAction(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] ) subtask2 = ActionsSubtask( - "test2", actions=[ActionsSubtask.Action(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] + "test2", actions=[ToolAction(tag="foo", name="test", path="test", input={"values": {"f": "b"}})] ) Agent().add_task(task) diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 210780729..4b9b97260 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -4,6 +4,7 @@ import yaml from schema import SchemaMissingKeyError, Schema, Or from griptape.tasks import ActionsSubtask, ToolkitTask +from griptape.common import ToolAction from tests.mocks.mock_tool.tool import MockTool from tests.utils import defaults @@ -125,7 +126,7 @@ class TestBaseTool: "additionalProperties": False, }, ], - "$id": "MockTool Action Schema", + "$id": "MockTool ToolAction Schema", "$schema": "http://json-schema.org/draft-07/schema#", } @@ -206,7 +207,7 @@ def test_find_input_memory(self): assert MockTool(input_memory=[defaults.text_task_memory("foo")]).find_input_memory("foo") is not None def test_execute(self, tool): - action = ActionsSubtask.Action(input={}, name="", tag="") + action = ToolAction(input={}, name="", tag="") assert tool.execute(tool.test_list_output, ActionsSubtask("foo"), action).to_text() == "foo\n\nbar" def test_schema(self, tool): @@ -219,6 +220,6 @@ def test_activity_schemas(self, tool): full_schema = Schema(Or(*tool.activity_schemas()), description=f"{tool.name} action schema.") - tool_schema = full_schema.json_schema(f"{tool.name} Action Schema") + tool_schema = full_schema.json_schema(f"{tool.name} ToolAction Schema") assert tool_schema == self.TARGET_TOOL_SCHEMA diff --git a/tests/unit/utils/test_dict_utils.py b/tests/unit/utils/test_dict_utils.py index 958e0295b..4b4e4ca08 100644 --- a/tests/unit/utils/test_dict_utils.py +++ b/tests/unit/utils/test_dict_utils.py @@ -1,4 +1,4 @@ -from griptape.utils import remove_null_values_in_dict_recursively, dict_merge +from griptape.utils import remove_null_values_in_dict_recursively, dict_merge, remove_key_in_dict_recursively import pytest @@ -10,6 +10,13 @@ def test_remove_null_values_in_dict_recursively(self): assert remove_null_values_in_dict_recursively(dict_with_nones) == dict_without_nones + def test_remove_key_in_dict_recursively(self): + dict_with_key = {"foo": 1, "bar": {"baz": {"quxx": [1, 2, 3], "bar": 2}}} + + dict_without_key = {"foo": 1, "bar": {"baz": {"bar": 2}}} + + assert remove_key_in_dict_recursively(dict_with_key, "quxx") == dict_without_key + def test_dict_merge_merges_dicts(self): a = {"a": 1, "b": {"b1": 2, "b2": 3}} b = {"a": 1, "b": {"b1": 4}} From 0389725ffdd25f77ea432e8ac432b6542b27abe3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Jul 2024 07:41:32 -0700 Subject: [PATCH 148/238] Enable flake8 type check (#960) --- griptape/common/actions/tool_action.py | 2 +- .../contents/action_call_message_content.py | 5 ++- .../contents/action_result_message_content.py | 7 ++- .../contents/base_message_content.py | 4 +- .../contents/image_message_content.py | 7 ++- .../contents/text_message_content.py | 5 ++- .../prompt_stack/messages/base_message.py | 6 ++- .../prompt_stack/messages/delta_message.py | 6 ++- griptape/config/base_structure_config.py | 24 +++++----- .../base_audio_transcription_driver.py | 2 +- .../amazon_bedrock_cohere_embedding_driver.py | 2 +- .../amazon_bedrock_titan_embedding_driver.py | 2 +- .../embedding/base_embedding_driver.py | 8 ++-- .../base_event_listener_driver.py | 6 ++- .../base_image_generation_driver.py | 2 +- .../openai_image_generation_driver.py | 6 ++- .../base_image_generation_model_driver.py | 6 ++- ...diffusion_image_generation_model_driver.py | 6 ++- ...ock_titan_image_generation_model_driver.py | 6 ++- .../amazon_bedrock_image_query_driver.py | 2 +- .../image_query/base_image_query_driver.py | 2 +- .../base_image_query_model_driver.py | 5 ++- .../prompt/amazon_bedrock_prompt_driver.py | 2 +- ...mazon_sagemaker_jumpstart_prompt_driver.py | 2 +- .../drivers/prompt/anthropic_prompt_driver.py | 2 +- griptape/drivers/prompt/base_prompt_driver.py | 4 +- .../drivers/prompt/cohere_prompt_driver.py | 2 +- .../drivers/prompt/dummy_prompt_driver.py | 7 ++- .../drivers/prompt/google_prompt_driver.py | 4 +- .../prompt/huggingface_hub_prompt_driver.py | 2 +- .../huggingface_pipeline_prompt_driver.py | 2 +- .../drivers/prompt/ollama_prompt_driver.py | 2 +- .../prompt/openai_chat_prompt_driver.py | 2 +- .../drivers/rerank/cohere_rerank_driver.py | 2 +- .../base_text_to_speech_driver.py | 2 +- .../vector/base_vector_store_driver.py | 6 ++- .../vector/marqo_vector_store_driver.py | 2 +- .../engines/audio/text_to_speech_engine.py | 7 ++- .../extraction/base_extraction_engine.py | 10 +++-- .../extraction/csv_extraction_engine.py | 6 ++- .../extraction/json_extraction_engine.py | 6 ++- .../image/base_image_generation_engine.py | 10 +++-- .../inpainting_image_generation_engine.py | 8 ++-- .../outpainting_image_generation_engine.py | 8 ++-- .../image/prompt_image_generation_engine.py | 8 ++-- .../variation_image_generation_engine.py | 8 ++-- .../text_loader_retrieval_rag_module.py | 5 ++- .../vector_store_retrieval_rag_module.py | 7 +-- griptape/engines/rag/rag_context.py | 2 +- griptape/events/base_actions_subtask_event.py | 4 +- griptape/events/base_task_event.py | 6 ++- griptape/events/event_listener.py | 2 +- griptape/loaders/base_loader.py | 8 ++-- griptape/loaders/base_text_loader.py | 8 ++-- griptape/loaders/csv_loader.py | 6 ++- griptape/loaders/dataframe_loader.py | 2 +- griptape/loaders/text_loader.py | 6 ++- griptape/loaders/web_loader.py | 5 ++- .../structure/base_conversation_memory.py | 2 +- .../task/storage/base_artifact_storage.py | 6 ++- .../task/storage/text_artifact_storage.py | 2 +- griptape/mixins/serializable_mixin.py | 6 ++- griptape/schemas/base_schema.py | 45 +++++++++++++++---- griptape/structures/agent.py | 4 +- griptape/structures/structure.py | 6 +-- griptape/structures/workflow.py | 6 ++- griptape/tasks/audio_transcription_task.py | 5 ++- griptape/tasks/base_image_generation_task.py | 5 ++- griptape/tasks/extraction_task.py | 7 ++- griptape/tasks/rag_task.py | 5 ++- griptape/tasks/structure_run_task.py | 7 ++- griptape/tasks/text_to_speech_task.py | 8 ++-- griptape/tasks/tool_task.py | 6 +-- griptape/tasks/toolkit_task.py | 2 +- .../tools/audio_transcription_client/tool.py | 6 ++- griptape/tools/base_tool.py | 2 +- griptape/tools/image_query_client/tool.py | 6 ++- .../tool.py | 6 ++- .../tool.py | 6 ++- .../prompt_image_generation_client/tool.py | 7 ++- griptape/tools/rag_client/tool.py | 5 ++- griptape/tools/sql_client/tool.py | 6 ++- griptape/tools/structure_run_client/tool.py | 5 ++- griptape/tools/text_to_speech_client/tool.py | 8 ++-- .../variation_image_generation_client/tool.py | 6 ++- griptape/tools/vector_store_client/tool.py | 6 ++- griptape/tools/web_search/tool.py | 5 ++- griptape/utils/stream.py | 4 +- pyproject.toml | 1 + 89 files changed, 325 insertions(+), 172 deletions(-) diff --git a/griptape/common/actions/tool_action.py b/griptape/common/actions/tool_action.py index db1e29f74..2b03a10bb 100644 --- a/griptape/common/actions/tool_action.py +++ b/griptape/common/actions/tool_action.py @@ -4,10 +4,10 @@ from attrs import define, field -from griptape.artifacts import BaseArtifact from griptape.common import BaseAction if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact from griptape.tools import BaseTool diff --git a/griptape/common/prompt_stack/contents/action_call_message_content.py b/griptape/common/prompt_stack/contents/action_call_message_content.py index 9f8082d72..55cc78324 100644 --- a/griptape/common/prompt_stack/contents/action_call_message_content.py +++ b/griptape/common/prompt_stack/contents/action_call_message_content.py @@ -1,13 +1,16 @@ from __future__ import annotations import json -from collections.abc import Sequence from attrs import define, field from griptape.common import ToolAction from griptape.artifacts import ActionArtifact from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ActionCallDeltaMessageContent +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence @define diff --git a/griptape/common/prompt_stack/contents/action_result_message_content.py b/griptape/common/prompt_stack/contents/action_result_message_content.py index 871649aea..8f75daaac 100644 --- a/griptape/common/prompt_stack/contents/action_result_message_content.py +++ b/griptape/common/prompt_stack/contents/action_result_message_content.py @@ -1,11 +1,14 @@ from __future__ import annotations -from collections.abc import Sequence from attrs import define, field -from griptape.artifacts import BaseArtifact from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ToolAction +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact + from collections.abc import Sequence @define diff --git a/griptape/common/prompt_stack/contents/base_message_content.py b/griptape/common/prompt_stack/contents/base_message_content.py index f24f5229b..5515ef745 100644 --- a/griptape/common/prompt_stack/contents/base_message_content.py +++ b/griptape/common/prompt_stack/contents/base_message_content.py @@ -1,13 +1,13 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence from typing import TYPE_CHECKING from attrs import define, field from griptape.mixins import SerializableMixin -from .base_delta_message_content import BaseDeltaMessageContent if TYPE_CHECKING: + from .base_delta_message_content import BaseDeltaMessageContent + from collections.abc import Sequence from griptape.artifacts.base_artifact import BaseArtifact diff --git a/griptape/common/prompt_stack/contents/image_message_content.py b/griptape/common/prompt_stack/contents/image_message_content.py index 0192a2cb4..335004c30 100644 --- a/griptape/common/prompt_stack/contents/image_message_content.py +++ b/griptape/common/prompt_stack/contents/image_message_content.py @@ -1,11 +1,14 @@ from __future__ import annotations -from collections.abc import Sequence from attrs import define, field -from griptape.artifacts import ImageArtifact from griptape.common import BaseDeltaMessageContent, BaseMessageContent +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + from collections.abc import Sequence @define diff --git a/griptape/common/prompt_stack/contents/text_message_content.py b/griptape/common/prompt_stack/contents/text_message_content.py index 1d7b2bd5b..b98402097 100644 --- a/griptape/common/prompt_stack/contents/text_message_content.py +++ b/griptape/common/prompt_stack/contents/text_message_content.py @@ -1,10 +1,13 @@ from __future__ import annotations from attrs import define, field -from collections.abc import Sequence from griptape.artifacts import TextArtifact from griptape.common import BaseMessageContent, BaseDeltaMessageContent, TextDeltaMessageContent +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence @define diff --git a/griptape/common/prompt_stack/messages/base_message.py b/griptape/common/prompt_stack/messages/base_message.py index 3cc8e532a..84de85d7d 100644 --- a/griptape/common/prompt_stack/messages/base_message.py +++ b/griptape/common/prompt_stack/messages/base_message.py @@ -1,13 +1,15 @@ from __future__ import annotations from abc import ABC -from typing import Optional, Union +from typing import Optional, Union, TYPE_CHECKING from attrs import Factory, define, field -from griptape.common import BaseMessageContent, BaseDeltaMessageContent from griptape.mixins import SerializableMixin +if TYPE_CHECKING: + from griptape.common import BaseMessageContent, BaseDeltaMessageContent + @define class BaseMessage(ABC, SerializableMixin): diff --git a/griptape/common/prompt_stack/messages/delta_message.py b/griptape/common/prompt_stack/messages/delta_message.py index a540d205c..b535451db 100644 --- a/griptape/common/prompt_stack/messages/delta_message.py +++ b/griptape/common/prompt_stack/messages/delta_message.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, TYPE_CHECKING from attrs import define, field -from griptape.common import BaseDeltaMessageContent from .base_message import BaseMessage +if TYPE_CHECKING: + from griptape.common import BaseDeltaMessageContent + @define class DeltaMessage(BaseMessage): diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index 0e07d29f5..2ceaf024f 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -1,23 +1,25 @@ from __future__ import annotations from abc import ABC -from typing import Optional +from typing import Optional, TYPE_CHECKING from attrs import define, field from griptape.config import BaseConfig -from griptape.drivers import ( - BaseConversationMemoryDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BaseImageQueryDriver, - BasePromptDriver, - BaseVectorStoreDriver, - BaseTextToSpeechDriver, - BaseAudioTranscriptionDriver, -) from griptape.utils import dict_merge +if TYPE_CHECKING: + from griptape.drivers import ( + BaseConversationMemoryDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseVectorStoreDriver, + BaseTextToSpeechDriver, + BaseAudioTranscriptionDriver, + ) + @define class BaseStructureConfig(BaseConfig, ABC): diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py index 3cc368c94..2ccf752b7 100644 --- a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -5,11 +5,11 @@ from attrs import define, field -from griptape.artifacts import TextArtifact, AudioArtifact from griptape.events import StartAudioTranscriptionEvent, FinishAudioTranscriptionEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: + from griptape.artifacts import TextArtifact, AudioArtifact from griptape.structures import Structure diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index 903022f86..8a70c98e2 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -4,10 +4,10 @@ from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer -from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from griptape.tokenizers.base_tokenizer import BaseTokenizer import boto3 diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index b754b0608..d90eefba7 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -4,10 +4,10 @@ from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer -from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from griptape.tokenizers.base_tokenizer import BaseTokenizer import boto3 diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index 0fcc05fc1..a92fa325a 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -1,14 +1,16 @@ from __future__ import annotations import numpy as np -from typing import Optional +from typing import Optional, TYPE_CHECKING from abc import ABC, abstractmethod from attrs import define, field -from griptape.artifacts import TextArtifact from griptape.mixins import ExponentialBackoffMixin -from griptape.tokenizers import BaseTokenizer from griptape.chunkers import BaseChunker, TextChunker from griptape.mixins import SerializableMixin +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact + from griptape.tokenizers import BaseTokenizer + @define class BaseEmbeddingDriver(SerializableMixin, ExponentialBackoffMixin, ABC): diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index b433ed755..cc0f9d36c 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -2,9 +2,11 @@ from abc import ABC, abstractmethod from concurrent import futures from logging import Logger -from typing import Callable +from typing import Callable, TYPE_CHECKING from attrs import Factory, define, field -from griptape.events import BaseEvent + +if TYPE_CHECKING: + from griptape.events import BaseEvent logger = Logger(__name__) diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index dbe42442f..704595aec 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -5,11 +5,11 @@ from attrs import define, field -from griptape.artifacts import ImageArtifact from griptape.events import StartImageGenerationEvent, FinishImageGenerationEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact from griptape.structures import Structure diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index abc961e3d..72ce20a92 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -1,15 +1,17 @@ from __future__ import annotations import base64 -from typing import Literal, Optional, cast, Union +from typing import Literal, Optional, cast, Union, TYPE_CHECKING import openai -from openai.types.images_response import ImagesResponse from attrs import field, Factory, define from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver +if TYPE_CHECKING: + from openai.types.images_response import ImagesResponse + @define class OpenAiImageGenerationDriver(BaseImageGenerationDriver): diff --git a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py index 803863319..c5cc6ff2d 100644 --- a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py @@ -1,13 +1,15 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import Any, Optional +from typing import Any, Optional, TYPE_CHECKING from attrs import define -from griptape.artifacts import ImageArtifact from griptape.mixins import SerializableMixin +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + @define class BaseImageGenerationModelDriver(SerializableMixin, ABC): diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 03d593eac..9be3cc6b9 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -2,13 +2,15 @@ import base64 import logging -from typing import Optional +from typing import Optional, TYPE_CHECKING from attrs import field, define -from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationModelDriver +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + @define class BedrockStableDiffusionImageGenerationModelDriver(BaseImageGenerationModelDriver): diff --git a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py index 2f4577aa7..bfa998c1d 100644 --- a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py @@ -1,13 +1,15 @@ from __future__ import annotations import base64 -from typing import Any, Optional +from typing import Any, Optional, TYPE_CHECKING from attrs import field, define -from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationModelDriver +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + @define class BedrockTitanImageGenerationModelDriver(BaseImageGenerationModelDriver): diff --git a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py index e91cbbedc..1377bfce9 100644 --- a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py +++ b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py @@ -1,12 +1,12 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any from attrs import define, field, Factory -from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseMultiModelImageQueryDriver from griptape.utils import import_optional_dependency import json if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact, TextArtifact import boto3 diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 8944dd931..44aa13ce2 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -5,11 +5,11 @@ from attrs import define, field -from griptape.artifacts import TextArtifact, ImageArtifact from griptape.events import StartImageQueryEvent, FinishImageQueryEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: + from griptape.artifacts import TextArtifact, ImageArtifact from griptape.structures import Structure diff --git a/griptape/drivers/image_query_model/base_image_query_model_driver.py b/griptape/drivers/image_query_model/base_image_query_model_driver.py index 746a9f84c..39d858288 100644 --- a/griptape/drivers/image_query_model/base_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/base_image_query_model_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations from abc import ABC, abstractmethod from attrs import define -from griptape.artifacts import TextArtifact, ImageArtifact from griptape.mixins import SerializableMixin +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact, ImageArtifact @define diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 8a1072716..5158740df 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Iterator from typing import TYPE_CHECKING, Any from attrs import Factory, define, field @@ -33,6 +32,7 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from collections.abc import Iterator import boto3 from griptape.common import PromptStack diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index dacaa62b0..08ec3a3fa 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -1,7 +1,6 @@ from __future__ import annotations import json -from collections.abc import Iterator from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field @@ -13,6 +12,7 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from collections.abc import Iterator import boto3 from griptape.common import PromptStack diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 21fdc841c..5ef28e143 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Iterator from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field @@ -34,6 +33,7 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from collections.abc import Iterator from anthropic import Client from anthropic.types import ContentBlock, ContentBlockDeltaEvent, ContentBlockStartEvent diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index ea785d045..e36654b23 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -1,7 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Iterator from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field @@ -18,9 +17,10 @@ ) from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin -from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: + from griptape.tokenizers import BaseTokenizer + from collections.abc import Iterator from griptape.structures import Structure diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index a07489005..b2cc6ea83 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any -from collections.abc import Iterator from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.artifacts.list_artifact import ListArtifact @@ -24,6 +23,7 @@ from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: + from collections.abc import Iterator from cohere import Client from cohere.types import NonStreamedChatResponse from griptape.tools import BaseTool diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index 72757624d..301474954 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -1,12 +1,15 @@ from __future__ import annotations -from collections.abc import Iterator from attrs import Factory, define, field -from griptape.common import PromptStack, Message, DeltaMessage from griptape.drivers import BasePromptDriver from griptape.exceptions import DummyException from griptape.tokenizers import DummyTokenizer +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.common import PromptStack, Message, DeltaMessage + from collections.abc import Iterator @define diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 41be786b6..c1ef91ec8 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -1,11 +1,9 @@ from __future__ import annotations import json -from collections.abc import Iterator from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field -from google.generativeai.types import ContentsType from griptape.common import ( @@ -29,6 +27,8 @@ from schema import Schema if TYPE_CHECKING: + from google.generativeai.types import ContentsType + from collections.abc import Iterator from google.generativeai import GenerativeModel from google.generativeai.types import ContentDict, GenerateContentResponse from google.generativeai.protos import Part diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index f327010c4..ae080e34b 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Iterator from typing import TYPE_CHECKING from attrs import Factory, define, field @@ -11,6 +10,7 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from collections.abc import Iterator from huggingface_hub import InferenceClient diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 6dabc3e20..cd77deefe 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Iterator from typing import TYPE_CHECKING from attrs import Factory, define, field @@ -12,6 +11,7 @@ from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from collections.abc import Iterator from transformers import TextGenerationPipeline diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index 5a78abf29..d554b7c96 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -4,7 +4,6 @@ from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver -from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.common import PromptStack, TextMessageContent from griptape.utils import import_optional_dependency from griptape.tokenizers import SimpleTokenizer @@ -12,6 +11,7 @@ from griptape.common import ImageMessageContent if TYPE_CHECKING: + from griptape.tokenizers.base_tokenizer import BaseTokenizer from ollama import Client diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index d1456007e..755e05f56 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -1,7 +1,6 @@ from __future__ import annotations import json -from collections.abc import Iterator from typing import TYPE_CHECKING, Literal, Optional import openai @@ -27,6 +26,7 @@ from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer if TYPE_CHECKING: + from collections.abc import Iterator from openai.types.chat.chat_completion_chunk import ChoiceDelta from openai.types.chat.chat_completion_message import ChatCompletionMessage diff --git a/griptape/drivers/rerank/cohere_rerank_driver.py b/griptape/drivers/rerank/cohere_rerank_driver.py index 57a7863d4..6475ba766 100644 --- a/griptape/drivers/rerank/cohere_rerank_driver.py +++ b/griptape/drivers/rerank/cohere_rerank_driver.py @@ -1,11 +1,11 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional from attrs import define, field, Factory -from griptape.artifacts import TextArtifact from griptape.drivers import BaseRerankDriver from griptape.utils import import_optional_dependency if TYPE_CHECKING: + from griptape.artifacts import TextArtifact from cohere import Client diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index 4f6dbcf25..d91347c19 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -5,12 +5,12 @@ from attrs import define, field -from griptape.artifacts.audio_artifact import AudioArtifact from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent from griptape.events.start_text_to_speech_event import StartTextToSpeechEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: + from griptape.artifacts.audio_artifact import AudioArtifact from griptape.structures import Structure diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 2957d7557..98c078fd6 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -4,13 +4,15 @@ from concurrent import futures from dataclasses import dataclass from typing import Any, Callable -from typing import Optional +from typing import Optional, TYPE_CHECKING from attrs import define, field, Factory from griptape import utils from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact -from griptape.drivers import BaseEmbeddingDriver from griptape.mixins import SerializableMixin +if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver + @define class BaseVectorStoreDriver(SerializableMixin, ABC): diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index f20530cff..a46f4b02f 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -3,10 +3,10 @@ from griptape import utils from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver -from griptape.artifacts import TextArtifact from attrs import define, field, Factory if TYPE_CHECKING: + from griptape.artifacts import TextArtifact import marqo diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index 634837d82..d707c5099 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -2,8 +2,11 @@ from attrs import define, field -from griptape.artifacts.audio_artifact import AudioArtifact -from griptape.drivers import BaseTextToSpeechDriver +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.drivers import BaseTextToSpeechDriver + from griptape.artifacts.audio_artifact import AudioArtifact @define diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index e8bd29129..aae56569e 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -1,11 +1,13 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, TYPE_CHECKING from abc import ABC, abstractmethod from attrs import define, field, Factory -from griptape.artifacts import ListArtifact, ErrorArtifact from griptape.chunkers import BaseChunker, TextChunker -from griptape.drivers import BasePromptDriver -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.artifacts import ListArtifact, ErrorArtifact + from griptape.rules import Ruleset + from griptape.drivers import BasePromptDriver @define diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index 6fe9bb879..c85d26de2 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Optional, cast +from typing import Optional, cast, TYPE_CHECKING import csv import io from attrs import field, Factory, define @@ -8,7 +8,9 @@ from griptape.common.prompt_stack.messages.message import Message from griptape.engines import BaseExtractionEngine from griptape.utils import J2 -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.rules import Ruleset @define diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index 830092dab..13f6f58bb 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Optional, cast +from typing import Optional, cast, TYPE_CHECKING import json from attrs import field, Factory, define from griptape.artifacts import TextArtifact, ListArtifact, ErrorArtifact @@ -7,7 +7,9 @@ from griptape.engines import BaseExtractionEngine from griptape.utils import J2 from griptape.common import PromptStack -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.rules import Ruleset @define diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 2c65c1a60..5fcf45544 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -2,11 +2,13 @@ from abc import ABC, abstractmethod from attrs import field, define -from typing import Optional +from typing import Optional, TYPE_CHECKING -from griptape.artifacts import ImageArtifact -from griptape.drivers import BaseImageGenerationDriver -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.drivers import BaseImageGenerationDriver + from griptape.artifacts import ImageArtifact + from griptape.rules import Ruleset @define diff --git a/griptape/engines/image/inpainting_image_generation_engine.py b/griptape/engines/image/inpainting_image_generation_engine.py index 7fb83d66f..527cb4eb6 100644 --- a/griptape/engines/image/inpainting_image_generation_engine.py +++ b/griptape/engines/image/inpainting_image_generation_engine.py @@ -1,11 +1,13 @@ from __future__ import annotations from attrs import define -from typing import Optional +from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine -from griptape.artifacts import ImageArtifact -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.rules import Ruleset + from griptape.artifacts import ImageArtifact @define diff --git a/griptape/engines/image/outpainting_image_generation_engine.py b/griptape/engines/image/outpainting_image_generation_engine.py index 135e3c77d..46feed614 100644 --- a/griptape/engines/image/outpainting_image_generation_engine.py +++ b/griptape/engines/image/outpainting_image_generation_engine.py @@ -1,12 +1,14 @@ from __future__ import annotations from attrs import define -from typing import Optional +from typing import Optional, TYPE_CHECKING -from griptape.artifacts import ImageArtifact -from griptape.rules import Ruleset from griptape.engines import BaseImageGenerationEngine +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + from griptape.rules import Ruleset + @define class OutpaintingImageGenerationEngine(BaseImageGenerationEngine): diff --git a/griptape/engines/image/prompt_image_generation_engine.py b/griptape/engines/image/prompt_image_generation_engine.py index 4b4a9ce63..d58ab74b9 100644 --- a/griptape/engines/image/prompt_image_generation_engine.py +++ b/griptape/engines/image/prompt_image_generation_engine.py @@ -1,12 +1,14 @@ from __future__ import annotations from attrs import define -from typing import Optional +from typing import Optional, TYPE_CHECKING -from griptape.rules import Ruleset -from griptape.artifacts import ImageArtifact from griptape.engines import BaseImageGenerationEngine +if TYPE_CHECKING: + from griptape.rules import Ruleset + from griptape.artifacts import ImageArtifact + @define class PromptImageGenerationEngine(BaseImageGenerationEngine): diff --git a/griptape/engines/image/variation_image_generation_engine.py b/griptape/engines/image/variation_image_generation_engine.py index 7b932ac2a..89dfadda1 100644 --- a/griptape/engines/image/variation_image_generation_engine.py +++ b/griptape/engines/image/variation_image_generation_engine.py @@ -2,10 +2,12 @@ from attrs import define -from typing import Optional +from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine -from griptape.artifacts import ImageArtifact -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.rules import Ruleset + from griptape.artifacts import ImageArtifact @define diff --git a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py index a37910da6..248f69af2 100644 --- a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py @@ -1,13 +1,14 @@ from __future__ import annotations import uuid -from typing import TYPE_CHECKING, Sequence, Any, Callable +from typing import TYPE_CHECKING, Any, Callable from attrs import define, field, Factory from griptape import utils from griptape.artifacts import TextArtifact, ErrorArtifact -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: + from collections.abc import Sequence + from griptape.engines.rag import RagContext from griptape.drivers import BaseVectorStoreDriver from griptape.loaders import BaseTextLoader diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index 96d249693..00d709346 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -1,12 +1,13 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Sequence, Any, Callable +from typing import TYPE_CHECKING, Any, Callable from attrs import define, field, Factory from griptape import utils -from griptape.artifacts import TextArtifact -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: + from collections.abc import Sequence + from griptape.engines.rag import RagContext + from griptape.artifacts import TextArtifact from griptape.drivers import BaseVectorStoreDriver diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index c0658ad7b..e6f111279 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -3,10 +3,10 @@ from attrs import define, field from griptape import utils -from griptape.common import Reference from griptape.mixins import SerializableMixin if TYPE_CHECKING: + from griptape.common import Reference from griptape.artifacts import TextArtifact, BaseArtifact diff --git a/griptape/events/base_actions_subtask_event.py b/griptape/events/base_actions_subtask_event.py index 8e1853b1c..cfd900000 100644 --- a/griptape/events/base_actions_subtask_event.py +++ b/griptape/events/base_actions_subtask_event.py @@ -5,7 +5,7 @@ from .base_task_event import BaseTaskEvent if TYPE_CHECKING: - from griptape.tasks import BaseTask, ActionsSubtask + from griptape.tasks import BaseTask @define @@ -16,6 +16,8 @@ class BaseActionsSubtaskEvent(BaseTaskEvent, ABC): @classmethod def from_task(cls, task: BaseTask) -> BaseActionsSubtaskEvent: + from griptape.tasks import ActionsSubtask + if not isinstance(task, ActionsSubtask): raise ValueError("Event must be of instance ActionSubtask.") return cls( diff --git a/griptape/events/base_task_event.py b/griptape/events/base_task_event.py index e853114d5..c486d3f75 100644 --- a/griptape/events/base_task_event.py +++ b/griptape/events/base_task_event.py @@ -1,10 +1,12 @@ from __future__ import annotations from attrs import define, field from abc import ABC -from typing import Optional -from griptape.artifacts import BaseArtifact +from typing import Optional, TYPE_CHECKING from .base_event import BaseEvent +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact + @define class BaseTaskEvent(BaseEvent, ABC): diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index 44d7b2d85..1aad6ffc5 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -1,9 +1,9 @@ from __future__ import annotations from typing import Optional, TYPE_CHECKING, Callable from attrs import define, field, Factory -from .base_event import BaseEvent if TYPE_CHECKING: + from .base_event import BaseEvent from griptape.drivers import BaseEventListenerDriver diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 00fbf07ec..d2448d103 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -2,15 +2,17 @@ from abc import ABC, abstractmethod from concurrent import futures -from typing import Any, Optional, Callable -from collections.abc import Mapping, Sequence +from typing import Any, Optional, Callable, TYPE_CHECKING from attrs import define, field, Factory -from griptape.artifacts import BaseArtifact from griptape.utils.futures import execute_futures_dict from griptape.utils.hash import bytes_to_hash, str_to_hash +if TYPE_CHECKING: + from collections.abc import Mapping, Sequence + from griptape.artifacts import BaseArtifact + @define class BaseLoader(ABC): diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index 4f2a93183..58787c881 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -1,15 +1,17 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import Any, Optional, Union, cast +from typing import Any, Optional, Union, cast, TYPE_CHECKING from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact from griptape.chunkers import TextChunker, BaseChunker -from griptape.common import Reference -from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader from griptape.tokenizers import OpenAiTokenizer +if TYPE_CHECKING: + from griptape.common import Reference + from griptape.drivers import BaseEmbeddingDriver + @define class BaseTextLoader(BaseLoader, ABC): diff --git a/griptape/loaders/csv_loader.py b/griptape/loaders/csv_loader.py index d396f80bc..21ca1f5a6 100644 --- a/griptape/loaders/csv_loader.py +++ b/griptape/loaders/csv_loader.py @@ -1,14 +1,16 @@ from __future__ import annotations import csv from io import StringIO -from typing import Optional, Union, cast +from typing import Optional, Union, cast, TYPE_CHECKING from attrs import define, field from griptape.artifacts import CsvRowArtifact, ErrorArtifact -from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader +if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver + @define class CsvLoader(BaseLoader): diff --git a/griptape/loaders/dataframe_loader.py b/griptape/loaders/dataframe_loader.py index 3d5a0f48b..a547ab7cc 100644 --- a/griptape/loaders/dataframe_loader.py +++ b/griptape/loaders/dataframe_loader.py @@ -5,12 +5,12 @@ from attrs import define, field from griptape.artifacts import CsvRowArtifact -from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseLoader from griptape.utils import import_optional_dependency from griptape.utils.hash import str_to_hash if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver from pandas import DataFrame diff --git a/griptape/loaders/text_loader.py b/griptape/loaders/text_loader.py index e8a80fa64..2dfa3bbe9 100644 --- a/griptape/loaders/text_loader.py +++ b/griptape/loaders/text_loader.py @@ -1,16 +1,18 @@ from __future__ import annotations -from typing import Optional, Union, cast +from typing import Optional, Union, cast, TYPE_CHECKING from attrs import field, define, Factory from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact from griptape.chunkers import TextChunker -from griptape.drivers import BaseEmbeddingDriver from griptape.loaders import BaseTextLoader from griptape.tokenizers import OpenAiTokenizer +if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver + @define class TextLoader(BaseTextLoader): diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index 64a52b65f..bde2ec305 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -2,8 +2,11 @@ from attrs import define, field, Factory from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import BaseWebScraperDriver, TrafilaturaWebScraperDriver -from griptape.artifacts import TextArtifact from griptape.loaders import BaseTextLoader +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact @define diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index a8133d64b..e68939026 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -1,12 +1,12 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.memory.structure import Run from griptape.common import PromptStack from griptape.mixins import SerializableMixin from abc import ABC, abstractmethod if TYPE_CHECKING: + from griptape.memory.structure import Run from griptape.drivers import BaseConversationMemoryDriver from griptape.structures import Structure diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index e8378fee4..e6ec68797 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -1,8 +1,10 @@ from __future__ import annotations -from typing import Any +from typing import Any, TYPE_CHECKING from abc import ABC, abstractmethod from attrs import define -from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact + +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact @define diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 0d135bcbd..51994fa6c 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -2,11 +2,11 @@ from typing import TYPE_CHECKING, Any, Optional from attrs import define, field from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact, InfoArtifact -from griptape.drivers import BaseVectorStoreDriver from griptape.engines.rag import RagEngine, RagContext from griptape.memory.task.storage import BaseArtifactStorage if TYPE_CHECKING: + from griptape.drivers import BaseVectorStoreDriver from griptape.engines import BaseSummaryEngine, CsvExtractionEngine, JsonExtractionEngine diff --git a/griptape/mixins/serializable_mixin.py b/griptape/mixins/serializable_mixin.py index 667ae752d..5535c69c6 100644 --- a/griptape/mixins/serializable_mixin.py +++ b/griptape/mixins/serializable_mixin.py @@ -1,15 +1,17 @@ from __future__ import annotations import json -from typing import TypeVar, Generic, cast, Optional +from typing import TypeVar, Generic, cast, Optional, TYPE_CHECKING from attrs import Factory, define, field from abc import ABC -from marshmallow import Schema from griptape.schemas.base_schema import BaseSchema from importlib import import_module +if TYPE_CHECKING: + from marshmallow import Schema + T = TypeVar("T", bound="SerializableMixin") diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 867486700..cfc9c2f5c 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -103,11 +103,28 @@ def _resolve_types(cls, attrs_cls: type) -> None: from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed # These modules are required to avoid `NameError`s when resolving types. - from griptape.drivers import BaseConversationMemoryDriver, BasePromptDriver + from griptape.drivers import ( + BaseConversationMemoryDriver, + BasePromptDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BaseEmbeddingDriver, + BaseVectorStoreDriver, + BaseTextToSpeechDriver, + BaseAudioTranscriptionDriver, + ) from griptape.structures import Structure - from griptape.common import PromptStack, Message, Reference, ToolAction + from griptape.common import ( + PromptStack, + Message, + Reference, + ToolAction, + BaseMessageContent, + BaseDeltaMessageContent, + ) from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.tools import BaseTool + from griptape.memory.structure import Run from typing import Any from griptape.artifacts import BaseArtifact @@ -122,19 +139,29 @@ def _resolve_types(cls, attrs_cls: type) -> None: attrs.resolve_types( attrs_cls, localns={ + "BasePromptDriver": BasePromptDriver, + "BaseImageQueryDriver": BaseImageQueryDriver, + "BaseEmbeddingDriver": BaseEmbeddingDriver, + "BaseVectorStoreDriver": BaseVectorStoreDriver, + "BaseTextToSpeechDriver": BaseTextToSpeechDriver, + "BaseAudioTranscriptionDriver": BaseAudioTranscriptionDriver, + "BaseConversationMemoryDriver": BaseConversationMemoryDriver, + "BaseImageGenerationDriver": BaseImageGenerationDriver, + "BaseArtifact": BaseArtifact, "PromptStack": PromptStack, - "Usage": Message.Usage, + "BaseMessageContent": BaseMessageContent, + "BaseDeltaMessageContent": BaseDeltaMessageContent, "BaseTool": BaseTool, + "Usage": Message.Usage, "Structure": Structure, - "BaseConversationMemoryDriver": BaseConversationMemoryDriver, - "BasePromptDriver": BasePromptDriver, "BaseTokenizer": BaseTokenizer, - "boto3": boto3, - "Client": Client, "ToolAction": ToolAction, - "GenerativeModel": GenerativeModel, "Reference": Reference, - "BaseArtifact": BaseArtifact, + "Run": Run, + # Third party modules + "Client": Client, + "GenerativeModel": GenerativeModel, + "boto3": boto3, }, ) diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 598aae37c..1df541e2a 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -2,13 +2,13 @@ from typing import TYPE_CHECKING, Optional, Callable from attrs import define, field from griptape.artifacts.text_artifact import TextArtifact -from griptape.tools import BaseTool from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask -from griptape.artifacts import BaseArtifact if TYPE_CHECKING: + from griptape.tools import BaseTool + from griptape.artifacts import BaseArtifact from griptape.tasks import BaseTask diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index c7b779590..52098f05f 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -19,18 +19,18 @@ MetadataBeforeResponseRagModule, ) from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage -from griptape.events import BaseEvent, EventListener from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.start_structure_run_event import StartStructureRunEvent from griptape.memory import TaskMemory from griptape.memory.meta import MetaMemory from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage -from griptape.rules import Rule, Ruleset -from griptape.tasks import BaseTask from griptape.utils import deprecation_warn if TYPE_CHECKING: + from griptape.rules import Rule, Ruleset + from griptape.events import BaseEvent, EventListener + from griptape.tasks import BaseTask from griptape.memory.structure import BaseConversationMemory diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index f7bc2e893..ffb3bf721 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -1,13 +1,15 @@ from __future__ import annotations import concurrent.futures as futures from graphlib import TopologicalSorter -from typing import Any, Optional, Callable +from typing import Any, Optional, Callable, TYPE_CHECKING from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact from griptape.structures import Structure -from griptape.tasks import BaseTask from griptape.memory.structure import Run +if TYPE_CHECKING: + from griptape.tasks import BaseTask + @define class Workflow(Structure): diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py index 57dbf6782..607911782 100644 --- a/griptape/tasks/audio_transcription_task.py +++ b/griptape/tasks/audio_transcription_task.py @@ -3,8 +3,11 @@ from attrs import define, field from griptape.engines import AudioTranscriptionEngine -from griptape.artifacts import TextArtifact from griptape.tasks.base_audio_input_task import BaseAudioInputTask +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact @define diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 75f57b711..3b8cfb16a 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -5,11 +5,14 @@ from attrs import field, define -from griptape.artifacts import MediaArtifact from griptape.loaders import ImageLoader from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin from griptape.rules import Ruleset, Rule from griptape.tasks import BaseTask +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import MediaArtifact @define diff --git a/griptape/tasks/extraction_task.py b/griptape/tasks/extraction_task.py index 03838ef6c..8c9ac85b1 100644 --- a/griptape/tasks/extraction_task.py +++ b/griptape/tasks/extraction_task.py @@ -1,8 +1,11 @@ from __future__ import annotations from attrs import define, field -from griptape.artifacts import ListArtifact, ErrorArtifact -from griptape.engines import BaseExtractionEngine from griptape.tasks import BaseTextInputTask +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.engines import BaseExtractionEngine + from griptape.artifacts import ListArtifact, ErrorArtifact @define diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py index e85c8f28a..fd5c5daa1 100644 --- a/griptape/tasks/rag_task.py +++ b/griptape/tasks/rag_task.py @@ -1,8 +1,11 @@ from __future__ import annotations from attrs import define, field from griptape.artifacts import ErrorArtifact, BaseArtifact -from griptape.engines.rag import RagEngine from griptape.tasks import BaseTextInputTask +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.engines.rag import RagEngine @define diff --git a/griptape/tasks/structure_run_task.py b/griptape/tasks/structure_run_task.py index 012f5c235..148b5b2de 100644 --- a/griptape/tasks/structure_run_task.py +++ b/griptape/tasks/structure_run_task.py @@ -3,9 +3,12 @@ from attrs import define, field -from griptape.artifacts import BaseArtifact -from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver from griptape.tasks import BaseMultiTextInputTask +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver + from griptape.artifacts import BaseArtifact @define diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index d69e907b1..29a2f0165 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -1,16 +1,18 @@ from __future__ import annotations -from typing import Callable +from typing import Callable, TYPE_CHECKING from attrs import define, field -from griptape.artifacts.audio_artifact import AudioArtifact from griptape.engines import TextToSpeechEngine from griptape.artifacts import TextArtifact -from griptape.tasks import BaseTask from griptape.tasks.base_audio_generation_task import BaseAudioGenerationTask from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.artifacts.audio_artifact import AudioArtifact + from griptape.tasks import BaseTask + @define class TextToSpeechTask(BaseAudioGenerationTask): diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index da40fd31a..447525f3e 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -3,17 +3,17 @@ import re from typing import Optional, TYPE_CHECKING from attrs import define, field -from schema import Schema from griptape import utils from griptape.artifacts import InfoArtifact, BaseArtifact, ErrorArtifact, ListArtifact from griptape.tasks import PromptTask, ActionsSubtask -from griptape.tools import BaseTool from griptape.utils import J2 from griptape.mixins import ActionsSubtaskOriginMixin -from griptape.common import PromptStack if TYPE_CHECKING: + from schema import Schema + from griptape.tools import BaseTool + from griptape.common import PromptStack from griptape.memory import TaskMemory from griptape.structures import Structure diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 0c5dce67c..97835928c 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -2,7 +2,6 @@ import json from typing import TYPE_CHECKING, Callable, Optional from attrs import define, field, Factory -from schema import Schema from griptape import utils from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact, ActionArtifact @@ -13,6 +12,7 @@ from griptape.common import PromptStack, ToolAction if TYPE_CHECKING: + from schema import Schema from griptape.tools import BaseTool from griptape.memory import TaskMemory from griptape.structures import Structure diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription_client/tool.py index ad0f0626e..3fdde0102 100644 --- a/griptape/tools/audio_transcription_client/tool.py +++ b/griptape/tools/audio_transcription_client/tool.py @@ -1,17 +1,19 @@ from __future__ import annotations -from typing import Any, cast +from typing import Any, cast, TYPE_CHECKING from attrs import define, field, Factory from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, AudioArtifact, TextArtifact -from griptape.engines import AudioTranscriptionEngine from griptape.loaders.audio_loader import AudioLoader from griptape.tools import BaseTool from griptape.utils import load_artifact_from_memory from griptape.utils.decorators import activity +if TYPE_CHECKING: + from griptape.engines import AudioTranscriptionEngine + @define class AudioTranscriptionClient(BaseTool): diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 44db36f2a..c46027049 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -11,10 +11,10 @@ import yaml from attrs import define, field, Factory from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact -from griptape.common import ToolAction from griptape.mixins import ActivityMixin if TYPE_CHECKING: + from griptape.common import ToolAction from griptape.memory import TaskMemory from griptape.tasks import ActionsSubtask diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query_client/tool.py index 60f2970ff..b03f3fed0 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query_client/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, cast +from typing import Any, cast, TYPE_CHECKING from attrs import define, field, Factory from schema import Schema, Literal @@ -10,7 +10,9 @@ from griptape.tools import BaseTool from griptape.utils import load_artifact_from_memory from griptape.utils.decorators import activity -from griptape.engines import ImageQueryEngine + +if TYPE_CHECKING: + from griptape.engines import ImageQueryEngine @define diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation_client/tool.py index 02799ad29..c343f9923 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation_client/tool.py @@ -1,18 +1,20 @@ from __future__ import annotations -from typing import Any, cast +from typing import Any, cast, TYPE_CHECKING from attrs import define, field from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, ImageArtifact -from griptape.engines import InpaintingImageGenerationEngine from griptape.loaders import ImageLoader from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory +if TYPE_CHECKING: + from griptape.engines import InpaintingImageGenerationEngine + @define class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index bd9a2125c..72db0e54c 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -1,18 +1,20 @@ from __future__ import annotations -from typing import Any, cast +from typing import Any, cast, TYPE_CHECKING from attrs import define, field from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, ImageArtifact -from griptape.engines import OutpaintingImageGenerationEngine from griptape.loaders import ImageLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory +if TYPE_CHECKING: + from griptape.engines import OutpaintingImageGenerationEngine + @define class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index 6f4ce0e1f..799df8673 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -3,11 +3,14 @@ from attrs import define, field from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact, ImageArtifact -from griptape.engines import PromptImageGenerationEngine from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.mixins import BlobArtifactFileOutputMixin +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.engines import PromptImageGenerationEngine + from griptape.artifacts import ErrorArtifact, ImageArtifact @define diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index 94422cc15..034843798 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -2,9 +2,12 @@ from attrs import define, field from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, BaseArtifact -from griptape.engines.rag import RagEngine from griptape.tools import BaseTool from griptape.utils.decorators import activity +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.engines.rag import RagEngine @define(kw_only=True) diff --git a/griptape/tools/sql_client/tool.py b/griptape/tools/sql_client/tool.py index a07c2e734..c06cfe4d9 100644 --- a/griptape/tools/sql_client/tool.py +++ b/griptape/tools/sql_client/tool.py @@ -1,12 +1,14 @@ from __future__ import annotations -from typing import Optional +from typing import Optional, TYPE_CHECKING from attrs import define, field from griptape.artifacts import InfoArtifact, ListArtifact, ErrorArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.loaders import SqlLoader from schema import Schema +if TYPE_CHECKING: + from griptape.loaders import SqlLoader + @define class SqlClient(BaseTool): diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index f48e84a1d..fe6d33f85 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -4,9 +4,12 @@ from schema import Literal, Schema from griptape.artifacts import BaseArtifact, TextArtifact -from griptape.drivers import BaseStructureRunDriver from griptape.tools.base_tool import BaseTool from griptape.utils.decorators import activity +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.drivers import BaseStructureRunDriver @define diff --git a/griptape/tools/text_to_speech_client/tool.py b/griptape/tools/text_to_speech_client/tool.py index 9f8c36a81..675320d83 100644 --- a/griptape/tools/text_to_speech_client/tool.py +++ b/griptape/tools/text_to_speech_client/tool.py @@ -1,16 +1,18 @@ from __future__ import annotations -from typing import Any +from typing import Any, TYPE_CHECKING from attrs import define, field from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact, AudioArtifact -from griptape.engines import TextToSpeechEngine from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.mixins import BlobArtifactFileOutputMixin +if TYPE_CHECKING: + from griptape.engines import TextToSpeechEngine + from griptape.artifacts import ErrorArtifact, AudioArtifact + @define class TextToSpeechClient(BlobArtifactFileOutputMixin, BaseTool): diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index 4d0d0537e..40afab05a 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -1,18 +1,20 @@ from __future__ import annotations -from typing import Any, cast +from typing import Any, cast, TYPE_CHECKING from attrs import define, field from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, ImageArtifact -from griptape.engines import VariationImageGenerationEngine from griptape.loaders import ImageLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory +if TYPE_CHECKING: + from griptape.engines import VariationImageGenerationEngine + @define class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index 8d4e73022..a1d7463a7 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Callable, Any +from typing import Callable, Any, TYPE_CHECKING from attrs import define, field, Factory from schema import Schema, Literal from griptape.artifacts import ErrorArtifact, BaseArtifact from griptape.artifacts import ListArtifact -from griptape.drivers import BaseVectorStoreDriver from griptape.tools import BaseTool from griptape.utils.decorators import activity +if TYPE_CHECKING: + from griptape.drivers import BaseVectorStoreDriver + @define(kw_only=True) class VectorStoreClient(BaseTool): diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index e5dc9add7..17c62dcc4 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -4,7 +4,10 @@ from schema import Schema, Literal from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.drivers import BaseWebSearchDriver +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.drivers import BaseWebSearchDriver @define diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 8cb2c3a7c..18df1ba56 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -1,17 +1,17 @@ from __future__ import annotations from typing import TYPE_CHECKING -from collections.abc import Iterator from threading import Thread from queue import Queue from griptape.artifacts.text_artifact import TextArtifact from griptape.events.completion_chunk_event import CompletionChunkEvent from griptape.events.event_listener import EventListener -from griptape.events.base_event import BaseEvent from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.finish_prompt_event import FinishPromptEvent from attrs import field, define, Factory if TYPE_CHECKING: + from collections.abc import Iterator + from griptape.events.base_event import BaseEvent from griptape.structures import Structure diff --git a/pyproject.toml b/pyproject.toml index c315e9ffa..e2c4fdfd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -209,6 +209,7 @@ select = [ "SIM", # flake8-simplify "TID251", # banned-api "T201", # print + "TCH" ] ignore = [ "UP007", # non-pep604-annotation From 160a4ef741aa5b6640e07ffe13009a75e74c2384 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Jul 2024 10:22:01 -0700 Subject: [PATCH 149/238] Enable ruff pydocstyle rules (#959) --- griptape/artifacts/boolean_artifact.py | 4 +--- griptape/artifacts/media_artifact.py | 3 +-- .../amazon_bedrock_cohere_embedding_driver.py | 3 ++- .../amazon_bedrock_titan_embedding_driver.py | 3 ++- .../azure_openai_embedding_driver.py | 3 ++- .../embedding/base_embedding_driver.py | 3 ++- .../embedding/cohere_embedding_driver.py | 3 ++- .../embedding/google_embedding_driver.py | 3 ++- .../huggingface_hub_embedding_driver.py | 3 ++- .../embedding/ollama_embedding_driver.py | 3 ++- .../embedding/openai_embedding_driver.py | 3 ++- .../embedding/voyageai_embedding_driver.py | 3 ++- .../amazon_s3_file_manager_driver.py | 3 +-- .../file_manager/base_file_manager_driver.py | 3 +-- .../file_manager/local_file_manager_driver.py | 3 +-- .../anthropic_image_query_driver.py | 3 ++- .../drivers/prompt/anthropic_prompt_driver.py | 3 ++- .../prompt/azure_openai_chat_prompt_driver.py | 3 ++- griptape/drivers/prompt/base_prompt_driver.py | 1 + .../drivers/prompt/cohere_prompt_driver.py | 3 ++- .../drivers/prompt/google_prompt_driver.py | 3 ++- .../prompt/huggingface_hub_prompt_driver.py | 4 ++-- .../huggingface_pipeline_prompt_driver.py | 4 ++-- .../drivers/prompt/ollama_prompt_driver.py | 3 ++- .../prompt/openai_chat_prompt_driver.py | 3 ++- .../amazon_opensearch_vector_store_driver.py | 1 - .../vector/marqo_vector_store_driver.py | 19 ++++++++---------- .../vector/opensearch_vector_store_driver.py | 2 -- .../vector/pgvector_vector_store_driver.py | 11 ++-------- .../vector/qdrant_vector_store_driver.py | 20 +++++++------------ griptape/engines/rag/rag_context.py | 3 +-- griptape/loaders/email_loader.py | 2 +- griptape/mixins/serializable_mixin.py | 1 + griptape/schemas/polymorphic_schema.py | 10 +++------- griptape/structures/workflow.py | 1 - griptape/tasks/actions_subtask.py | 2 ++ griptape/tasks/image_query_task.py | 6 ++++-- .../tasks/inpainting_image_generation_task.py | 6 ++++-- .../outpainting_image_generation_task.py | 6 ++++-- .../tasks/prompt_image_generation_task.py | 6 ++++-- .../tasks/variation_image_generation_task.py | 6 ++++-- griptape/tokenizers/openai_tokenizer.py | 7 ++++--- griptape/tools/base_griptape_cloud_client.py | 3 ++- griptape/tools/email_client/tool.py | 2 +- griptape/tools/file_manager/tool.py | 3 +-- .../tool.py | 3 ++- griptape/tools/rag_client/tool.py | 3 ++- griptape/tools/rest_api_client/tool.py | 3 ++- griptape/tools/structure_run_client/tool.py | 3 ++- griptape/tools/vector_store_client/tool.py | 3 ++- griptape/utils/dict_utils.py | 4 +++- griptape/utils/file_utils.py | 1 - griptape/utils/import_utils.py | 3 ++- griptape/utils/structure_visualizer.py | 7 ++++--- pyproject.toml | 13 +++++++++++- 55 files changed, 128 insertions(+), 108 deletions(-) diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py index e7e440f45..0c5ae6f35 100644 --- a/griptape/artifacts/boolean_artifact.py +++ b/griptape/artifacts/boolean_artifact.py @@ -10,9 +10,7 @@ class BooleanArtifact(BaseArtifact): @classmethod def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: - """ - Convert a string literal or bool to a BooleanArtifact. The string must be either "true" or "false" with any casing. - """ + """Convert a string literal or bool to a BooleanArtifact. The string must be either "true" or "false" with any casing.""" if value is not None: if isinstance(value, str): if value.lower() == "true": diff --git a/griptape/artifacts/media_artifact.py b/griptape/artifacts/media_artifact.py index 2848ec1bb..751f2bf62 100644 --- a/griptape/artifacts/media_artifact.py +++ b/griptape/artifacts/media_artifact.py @@ -12,8 +12,7 @@ @define class MediaArtifact(BlobArtifact): - """MediaArtifact is a type of BlobArtifact that represents media (image, audio, video, etc.) - and can be extended to support a specific media type. + """MediaArtifact is a type of BlobArtifact that represents media (image, audio, video, etc.) and can be extended to support a specific media type. Attributes: value: Raw bytes representing media data. diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index 8a70c98e2..fe113c300 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -13,7 +13,8 @@ @define class AmazonBedrockCohereEmbeddingDriver(BaseEmbeddingDriver): - """ + """Amazon Bedrock Cohere Embedding Driver. + Attributes: model: Embedding model name. Defaults to DEFAULT_MODEL. input_type: Defaults to `search_query`. Prepends special tokens to differentiate each type from one another: diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index d90eefba7..1de4d6cfe 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -13,7 +13,8 @@ @define class AmazonBedrockTitanEmbeddingDriver(BaseEmbeddingDriver): - """ + """Amazon Bedrock Titan Embedding Driver. + Attributes: model: Embedding model name. Defaults to DEFAULT_MODEL. tokenizer: Optionally provide custom `BedrockTitanTokenizer`. diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index c92197e9b..bf78ef1ae 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -9,7 +9,8 @@ @define class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): - """ + """Azure OpenAi Embedding Driver. + Attributes: azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index a92fa325a..dc9e2c9ae 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -14,7 +14,8 @@ @define class BaseEmbeddingDriver(SerializableMixin, ExponentialBackoffMixin, ABC): - """ + """Base Embedding Driver. + Attributes: model: The name of the model to use. tokenizer: An instance of `BaseTokenizer` to use when calculating tokens. diff --git a/griptape/drivers/embedding/cohere_embedding_driver.py b/griptape/drivers/embedding/cohere_embedding_driver.py index 5e8bdf4dd..13f72aa16 100644 --- a/griptape/drivers/embedding/cohere_embedding_driver.py +++ b/griptape/drivers/embedding/cohere_embedding_driver.py @@ -11,7 +11,8 @@ @define class CohereEmbeddingDriver(BaseEmbeddingDriver): - """ + """Cohere Embedding Driver. + Attributes: api_key: Cohere API key. model: Cohere model name. diff --git a/griptape/drivers/embedding/google_embedding_driver.py b/griptape/drivers/embedding/google_embedding_driver.py index 884a40c3c..b8745345c 100644 --- a/griptape/drivers/embedding/google_embedding_driver.py +++ b/griptape/drivers/embedding/google_embedding_driver.py @@ -7,7 +7,8 @@ @define class GoogleEmbeddingDriver(BaseEmbeddingDriver): - """ + """Google Embedding Driver. + Attributes: api_key: Google API key. model: Google model name. diff --git a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py index 71abef81f..8b47e56e9 100644 --- a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py +++ b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py @@ -10,7 +10,8 @@ @define class HuggingFaceHubEmbeddingDriver(BaseEmbeddingDriver): - """ + """Hugging Face Hub Embedding Driver. + Attributes: api_token: Hugging Face Hub API token. model: Hugging Face Hub model name. diff --git a/griptape/drivers/embedding/ollama_embedding_driver.py b/griptape/drivers/embedding/ollama_embedding_driver.py index d081321c1..f3f68a049 100644 --- a/griptape/drivers/embedding/ollama_embedding_driver.py +++ b/griptape/drivers/embedding/ollama_embedding_driver.py @@ -10,7 +10,8 @@ @define class OllamaEmbeddingDriver(BaseEmbeddingDriver): - """ + """Ollama Embedding Driver. + Attributes: model: Ollama embedding model name. host: Optional Ollama host. diff --git a/griptape/drivers/embedding/openai_embedding_driver.py b/griptape/drivers/embedding/openai_embedding_driver.py index 089875c1a..46b9e77b5 100644 --- a/griptape/drivers/embedding/openai_embedding_driver.py +++ b/griptape/drivers/embedding/openai_embedding_driver.py @@ -8,7 +8,8 @@ @define class OpenAiEmbeddingDriver(BaseEmbeddingDriver): - """ + """OpenAI Embedding Driver. + Attributes: model: OpenAI embedding model name. Defaults to `text-embedding-3-small`. base_url: API URL. Defaults to OpenAI's v1 API URL. diff --git a/griptape/drivers/embedding/voyageai_embedding_driver.py b/griptape/drivers/embedding/voyageai_embedding_driver.py index 0cfac6fda..76bcf71b8 100644 --- a/griptape/drivers/embedding/voyageai_embedding_driver.py +++ b/griptape/drivers/embedding/voyageai_embedding_driver.py @@ -8,7 +8,8 @@ @define class VoyageAiEmbeddingDriver(BaseEmbeddingDriver): - """ + """VoyageAI Embedding Driver. + Attributes: model: VoyageAI embedding model name. Defaults to `voyage-large-2`. api_key: API key to pass directly. Defaults to `VOYAGE_API_KEY` environment variable. diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index e2d794f31..840ae60d7 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -12,8 +12,7 @@ @define class AmazonS3FileManagerDriver(BaseFileManagerDriver): - """ - AmazonS3FileManagerDriver can be used to list, load, and save files in an Amazon S3 bucket. + """AmazonS3FileManagerDriver can be used to list, load, and save files in an Amazon S3 bucket. Attributes: session: The boto3 session to use for S3 operations. diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 9b8fe8325..546642554 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -7,8 +7,7 @@ @define class BaseFileManagerDriver(ABC): - """ - BaseFileManagerDriver can be used to list, load, and save files. + """BaseFileManagerDriver can be used to list, load, and save files. Attributes: default_loader: The default loader to use for loading file contents into artifacts. diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index 186296aa3..befe2fdd2 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -7,8 +7,7 @@ @define class LocalFileManagerDriver(BaseFileManagerDriver): - """ - LocalFileManagerDriver can be used to list, load, and save files on the local file system. + """LocalFileManagerDriver can be used to list, load, and save files on the local file system. Attributes: workdir: The absolute working directory. List, load, and save operations will be performed relative to this directory. diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index aca06ac2f..9bc9ec4ae 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -8,7 +8,8 @@ @define class AnthropicImageQueryDriver(BaseImageQueryDriver): - """ + """Anthropic Image Query Driver. + Attributes: api_key: Anthropic API key. model: Anthropic model name. diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 5ef28e143..877e41621 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -42,7 +42,8 @@ @define class AnthropicPromptDriver(BasePromptDriver): - """ + """Anthropic Prompt Driver. + Attributes: api_key: Anthropic API key. model: Anthropic model name. diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 64145b1a9..0b33aa103 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -7,7 +7,8 @@ @define class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): - """ + """Azure OpenAi Chat Prompt Driver. + Attributes: azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index e36654b23..f012e7339 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -79,6 +79,7 @@ def run(self, prompt_stack: PromptStack) -> Message: def prompt_stack_to_string(self, prompt_stack: PromptStack) -> str: """Converts a Prompt Stack to a string for token counting or model input. + This base implementation is only a rough approximation, and should be overridden by subclasses with model-specific tokens. Args: diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index b2cc6ea83..a5dccb2a5 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -31,7 +31,8 @@ @define(kw_only=True) class CoherePromptDriver(BasePromptDriver): - """ + """Cohere Prompt Driver. + Attributes: api_key: Cohere API key. model: Cohere model name. diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index c1ef91ec8..48bb29f59 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -37,7 +37,8 @@ @define class GooglePromptDriver(BasePromptDriver): - """ + """Google Prompt Driver. + Attributes: api_key: Google API key. model: Google model name. diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index ae080e34b..1c5647856 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -16,7 +16,8 @@ @define class HuggingFaceHubPromptDriver(BasePromptDriver): - """ + """Hugging Face Hub Prompt Driver. + Attributes: api_token: Hugging Face Hub API token. use_gpu: Use GPU during model run. @@ -24,7 +25,6 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): model: Hugging Face Hub model name. client: Custom `InferenceApi`. tokenizer: Custom `HuggingFaceTokenizer`. - """ api_token: str = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index cd77deefe..9273deb0c 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -17,11 +17,11 @@ @define class HuggingFacePipelinePromptDriver(BasePromptDriver): - """ + """Hugging Face Pipeline Prompt Driver. + Attributes: params: Custom model run parameters. model: Hugging Face Hub model name. - """ max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index d554b7c96..0818bd5e8 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -17,7 +17,8 @@ @define class OllamaPromptDriver(BasePromptDriver): - """ + """Ollama Prompt Driver. + Attributes: model: Model name. """ diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 755e05f56..c6bd02489 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -35,7 +35,8 @@ @define class OpenAiChatPromptDriver(BasePromptDriver): - """ + """OpenAI Chat Prompt Driver. + Attributes: base_url: An optional OpenAi API URL. api_key: An optional OpenAi API key. If not provided, the `OPENAI_API_KEY` environment variable will be used. diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index 668f89b7e..d53ac2c64 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -57,7 +57,6 @@ def upsert_vector( If a vector with the given vector ID already exists, it is updated; otherwise, a new vector is inserted. Metadata associated with the vector can also be provided. """ - vector_id = vector_id if vector_id else str_to_hash(str(vector)) doc = {"vector": vector, "namespace": namespace, "metadata": meta} doc.update(kwargs) diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index a46f4b02f..2e4d0acf0 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -37,7 +37,7 @@ def upsert_text( vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, - **kwargs, + **kwargs: Any, ) -> str: """Upsert a text document into the Marqo index. @@ -46,11 +46,11 @@ def upsert_text( vector_id: The ID for the vector. If None, Marqo will generate an ID. namespace: An optional namespace for the document. meta: An optional dictionary of metadata for the document. + kwargs: Additional keyword arguments to pass to the Marqo client. Returns: str: The ID of the document that was added. """ - doc = {"_id": vector_id, "Description": string} # Description will be treated as tensor field # Non-tensor fields @@ -71,7 +71,7 @@ def upsert_text_artifact( namespace: Optional[str] = None, meta: Optional[dict] = None, vector_id: Optional[str] = None, - **kwargs, + **kwargs: Any, ) -> str: """Upsert a text artifact into the Marqo index. @@ -80,11 +80,11 @@ def upsert_text_artifact( namespace: An optional namespace for the artifact. meta: An optional dictionary of metadata for the artifact. vector_id: An optional explicit vector_id. + kwargs: Additional keyword arguments to pass to the Marqo client. Returns: str: The ID of the artifact that was added. """ - artifact_json = artifact.to_json() vector_id = utils.str_to_hash(artifact.value) if vector_id is None else vector_id @@ -131,7 +131,6 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD Returns: The list of loaded Entries. """ - filter_string = f"namespace:{namespace}" if namespace else None if filter_string is not None: @@ -167,7 +166,7 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, include_metadata: bool = True, - **kwargs, + **kwargs: Any, ) -> list[BaseVectorStoreDriver.Entry]: """Query the Marqo index for documents. @@ -177,11 +176,11 @@ def query( namespace: The namespace to filter results by. include_vectors: Whether to include vector data in the results. include_metadata: Whether to include metadata in the results. + kwargs: Additional keyword arguments to pass to the Marqo client. Returns: The list of query results. """ - params = { "limit": count if count else BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, "attributes_to_retrieve": ["*"] if include_metadata else ["_id"], @@ -211,7 +210,6 @@ def delete_index(self, name: str) -> dict[str, Any]: Args: name: The name of the index to delete. """ - return self.mq.delete_index(name) def get_indexes(self) -> list[str]: @@ -220,7 +218,6 @@ def get_indexes(self) -> list[str]: Returns: The list of all indexes. """ - return [index["index"] for index in self.mq.get_indexes()["results"]] def upsert_vector( @@ -229,7 +226,7 @@ def upsert_vector( vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, - **kwargs, + **kwargs: Any, ) -> str: """Upsert a vector into the Marqo index. @@ -238,6 +235,7 @@ def upsert_vector( vector_id: The ID for the vector. If None, Marqo will generate an ID. namespace: An optional namespace for the vector. meta: An optional dictionary of metadata for the vector. + kwargs: Additional keyword arguments to pass to the Marqo client. Raises: Exception: This function is not yet implemented. @@ -245,7 +243,6 @@ def upsert_vector( Returns: The ID of the vector that was added. """ - raise NotImplementedError(f"{self.__class__.__name__} does not support upserting a vector.") def delete_vector(self, vector_id: str): diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 81add74aa..49e73af96 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -56,7 +56,6 @@ def upsert_vector( If a vector with the given vector ID already exists, it is updated; otherwise, a new vector is inserted. Metadata associated with the vector can also be provided. """ - vector_id = vector_id if vector_id else utils.str_to_hash(str(vector)) doc = {"vector": vector, "namespace": namespace, "metadata": meta} doc.update(kwargs) @@ -99,7 +98,6 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD Returns: A list of BaseVectorStoreDriver.Entry objects. """ - query_body = {"size": 10000, "query": {"match_all": {}}} if namespace: diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 29c657589..abe01098a 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -53,9 +53,6 @@ def validate_engine(self, _, engine: Optional[Engine]) -> None: raise ValueError("An engine or connection string is required") def __attrs_post_init__(self) -> None: - """If an engine is provided, it will be used to connect to the database. - If not, a connection string is used to create a new database connection here. - """ if self.engine is None: self.engine = cast(Engine, create_engine(self.connection_string, **self.create_engine_params)) @@ -102,9 +99,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> BaseVec ) def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: - """Retrieves all vector entries from the collection, optionally filtering to only - those that match the provided namespace. - """ + """Retrieves all vector entries from the collection, optionally filtering to only those that match the provided namespace.""" with Session(self.engine) as session: query = session.query(self._model) if namespace: @@ -128,9 +123,7 @@ def query( distance_metric: str = "cosine_distance", **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: - """Performs a search on the collection to find vectors similar to the provided input vector, - optionally filtering to only those that match the provided namespace. - """ + """Performs a search on the collection to find vectors similar to the provided input vector, optionally filtering to only those that match the provided namespace.""" distance_metrics = { "cosine_distance": self._model.vector.cosine_distance, "l2_distance": self._model.vector.l2_distance, diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index 5159bdb0a..0b96f03b9 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -12,7 +12,8 @@ @define class QdrantVectorStoreDriver(BaseVectorStoreDriver): - """ + """Vector Store Driver for Qdrant. + Attributes: location: An optional location for the Qdrant client. If set to ':memory:', an in-memory client is used. url: An optional Qdrant API URL. @@ -68,8 +69,7 @@ def __attrs_post_init__(self) -> None: ) def delete_vector(self, vector_id: str) -> None: - """ - Delete a vector from the Qdrant collection based on its ID. + """Delete a vector from the Qdrant collection based on its ID. Parameters: vector_id (str | id): ID of the vector to delete. @@ -89,8 +89,7 @@ def query( include_vectors: bool = False, **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: - """ - Query the Qdrant collection based on a query vector. + """Query the Qdrant collection based on a query vector. Parameters: query (str): Query string. @@ -127,8 +126,7 @@ def upsert_vector( content: Optional[str] = None, **kwargs, ) -> str: - """ - Upsert vectors into the Qdrant collection. + """Upsert vectors into the Qdrant collection. Parameters: vector (list[float]): The vector to be upserted. @@ -140,7 +138,6 @@ def upsert_vector( Returns: str: The ID of the upserted vector. """ - if vector_id is None: vector_id = str(uuid.uuid5(uuid.NAMESPACE_DNS, str(vector))) @@ -158,8 +155,7 @@ def upsert_vector( return vector_id def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: - """ - Load a vector entry from the Qdrant collection based on its ID. + """Load a vector entry from the Qdrant collection based on its ID. Parameters: vector_id (str): ID of the vector to load. @@ -180,8 +176,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona return None def load_entries(self, namespace: Optional[str] = None, **kwargs) -> list[BaseVectorStoreDriver.Entry]: - """ - Load vector entries from the Qdrant collection. + """Load vector entries from the Qdrant collection. Parameters: namespace: Optional namespace of the vectors. @@ -189,7 +184,6 @@ def load_entries(self, namespace: Optional[str] = None, **kwargs) -> list[BaseVe Returns: List of points. """ - results = self.client.retrieve( collection_name=self.collection_name, ids=kwargs.get("ids", []), diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index e6f111279..be4807599 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -12,8 +12,7 @@ @define(kw_only=True) class RagContext(SerializableMixin): - """Used by RagEngine stages and module to pass context that individual modules are expected to update in the `run` - method. + """Used by RagEngine stages and module to pass context that individual modules are expected to update in the `run` method. Attributes: query: Query provided by the user. diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index a7598e2a6..3d0ad1358 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -15,7 +15,7 @@ class EmailLoader(BaseLoader): @define(frozen=True) class EmailQuery: - """An email retrieval query + """An email retrieval query. Attributes: label: Label to retrieve emails from such as 'INBOX' or 'SENT'. diff --git a/griptape/mixins/serializable_mixin.py b/griptape/mixins/serializable_mixin.py index 5535c69c6..2364e8bc4 100644 --- a/griptape/mixins/serializable_mixin.py +++ b/griptape/mixins/serializable_mixin.py @@ -64,6 +64,7 @@ def to_dict(self) -> dict: @classmethod def _import_cls_rec(cls, module_name: str, class_name: str) -> type: """Imports a class given a module name and class name. + Will recursively traverse up the module's path until it finds a package that it can import `class_name` from. diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index 452e3001f..60001de18 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -4,9 +4,7 @@ class PolymorphicSchema(BaseSchema): - """ - PolymorphicSchema is based on https://github.com/marshmallow-code/marshmallow-oneofschema - """ + """PolymorphicSchema is based on https://github.com/marshmallow-code/marshmallow-oneofschema.""" def __init__(self, inner_class: Any, **kwargs): super().__init__(**kwargs) @@ -17,13 +15,11 @@ def __init__(self, inner_class: Any, **kwargs): type_field_remove = True def get_obj_type(self, obj): - """Returns name of the schema during dump() calls, given the object - being dumped.""" + """Returns name of the schema during dump() calls, given the object being dumped.""" return obj.__class__.__name__ def get_data_type(self, data): - """Returns name of the schema during load() calls, given the data being - loaded. Defaults to looking up `type_field` in the data.""" + """Returns name of the schema during load() calls, given the data being loaded. Defaults to looking up `type_field` in the data.""" data_type = data.get(self.type_field) if self.type_field in data and self.type_field_remove: data.pop(self.type_field) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index ffb3bf721..3c0ee6586 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -43,7 +43,6 @@ def insert_tasks( child_tasks: The tasks that will be the children of the new tasks. preserve_relationship: Whether to preserve the parent/child relationship when inserting between parent and child tasks. """ - if not isinstance(parent_tasks, list): parent_tasks = [parent_tasks] if not isinstance(tasks, list): diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index da378f881..ac0503e8f 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -208,10 +208,12 @@ def __init_from_prompt(self, value: str) -> None: def __init_from_artifacts(self, artifacts: ListArtifact) -> None: """Parses the input Artifacts to extract the thought and actions. + Text Artifacts are used to extract the thought, and ToolAction Artifacts are used to extract the actions. Args: artifacts: The input Artifacts. + Returns: None """ diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 85b25715a..aac3c655b 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -12,11 +12,13 @@ @define class ImageQueryTask(BaseTask): - """A task that executes a natural language query on one or more input images. Accepts a text prompt and a list of + """A task that executes a natural language query on one or more input images. + + Accepts a text prompt and a list of images as input in one of the following formats: - tuple of (template string, list[ImageArtifact]) - tuple of (TextArtifact, list[ImageArtifact]) - - Callable that returns a tuple of (TextArtifact, list[ImageArtifact]) + - Callable that returns a tuple of (TextArtifact, list[ImageArtifact]). Attributes: image_query_engine: The engine used to execute the query. diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index b0fae9118..838ab4489 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -12,11 +12,13 @@ @define class InpaintingImageGenerationTask(BaseImageGenerationTask): - """A task that modifies a select region within an image using a mask. Accepts a text prompt, image, and mask as + """A task that modifies a select region within an image using a mask. + + Accepts a text prompt, image, and mask as input in one of the following formats: - tuple of (template string, ImageArtifact, ImageArtifact) - tuple of (TextArtifact, ImageArtifact, ImageArtifact) - - Callable that returns a tuple of (TextArtifact, ImageArtifact, ImageArtifact) + - Callable that returns a tuple of (TextArtifact, ImageArtifact, ImageArtifact). Attributes: image_generation_engine: The engine used to generate the image. diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 61a7c1b8a..135304ad3 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -12,11 +12,13 @@ @define class OutpaintingImageGenerationTask(BaseImageGenerationTask): - """A task that modifies an image outside the bounds of a mask. Accepts a text prompt, image, and mask as + """A task that modifies an image outside the bounds of a mask. + + Accepts a text prompt, image, and mask as input in one of the following formats: - tuple of (template string, ImageArtifact, ImageArtifact) - tuple of (TextArtifact, ImageArtifact, ImageArtifact) - - Callable that returns a tuple of (TextArtifact, ImageArtifact, ImageArtifact) + - Callable that returns a tuple of (TextArtifact, ImageArtifact, ImageArtifact). Attributes: image_generation_engine: The engine used to generate the image. diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 577abacbb..8c487d1ed 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -12,10 +12,12 @@ @define class PromptImageGenerationTask(BaseImageGenerationTask): - """Used to generate an image from a text prompt. Accepts prompt as input in one of the following formats: + """Used to generate an image from a text prompt. + + Accepts prompt as input in one of the following formats: - template string - TextArtifact - - Callable that returns a TextArtifact + - Callable that returns a TextArtifact. Attributes: image_generation_engine: The engine used to generate the image. diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index 6efba1e65..1f2cebbfc 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -12,11 +12,13 @@ @define class VariationImageGenerationTask(BaseImageGenerationTask): - """A task that generates a variation of an image using a prompt. Accepts a text prompt and image as + """A task that generates a variation of an image using a prompt. + + Accepts a text prompt and image as input in one of the following formats: - tuple of (template string, ImageArtifact) - tuple of (TextArtifact, ImageArtifact) - - Callable that returns a tuple of (TextArtifact, ImageArtifact) + - Callable that returns a tuple of (TextArtifact, ImageArtifact). Attributes: image_generation_engine: The engine used to generate the image. diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index a58ec5ce5..3cb2674cf 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -75,9 +75,10 @@ def _default_max_output_tokens(self) -> int: return tokens def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> int: - """ - Handles the special case of ChatML. Implementation adopted from the official OpenAI notebook: - https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb + """Handles the special case of ChatML. + + Implementation adopted from the official OpenAI notebook: + https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb. """ if isinstance(text, list): model = model if model else self.model diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_client.py index 8c42f817e..3e7f44fe6 100644 --- a/griptape/tools/base_griptape_cloud_client.py +++ b/griptape/tools/base_griptape_cloud_client.py @@ -6,7 +6,8 @@ @define class BaseGriptapeCloudClient(BaseTool, ABC): - """ + """Base class for Griptape Cloud clients. + Attributes: base_url: Base URL for the Griptape Cloud Knowledge Base API. api_key: API key for Griptape Cloud. diff --git a/griptape/tools/email_client/tool.py b/griptape/tools/email_client/tool.py index e2b42ea7e..6e0b32dc3 100644 --- a/griptape/tools/email_client/tool.py +++ b/griptape/tools/email_client/tool.py @@ -14,7 +14,7 @@ @define class EmailClient(BaseTool): - """Tool for working with email + """Tool for working with email. Attributes: username: Username/email address used to send email via the SMTP protocol and retrieve email via the IMAP protocol. diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 162b546a6..e26ad7b3a 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -10,8 +10,7 @@ @define class FileManager(BaseTool): - """ - FileManager is a tool that can be used to list, load, and save files. + """FileManager is a tool that can be used to list, load, and save files. Attributes: file_manager_driver: File Manager Driver to use to list, load, and save files. diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 7c94cda5d..281c13b60 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -10,7 +10,8 @@ @define class GriptapeCloudKnowledgeBaseClient(BaseGriptapeCloudClient): - """ + """Tool for querying a Griptape Cloud Knowledge Base. + Attributes: description: LLM-friendly knowledge base description. knowledge_base_id: ID of the Griptape Cloud Knowledge Base. diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index 034843798..36ab82bf3 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -12,7 +12,8 @@ @define(kw_only=True) class RagClient(BaseTool): - """ + """Tool for querying a RAG engine. + Attributes: description: LLM-friendly RAG engine description. rag_engine: `RagEngine`. diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index e33971cc2..2722356e2 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -11,7 +11,8 @@ @define class RestApiClient(BaseTool): - """ + """A tool for making REST API requests. + Attributes: base_url: The base url that will be used for the request. path: The resource path that will be appended to base_url. diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index fe6d33f85..90b6071f1 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -14,7 +14,8 @@ @define class StructureRunClient(BaseTool): - """ + """Tool for running a Structure. + Attributes: description: A description of what the Structure does. driver: Driver to run the Structure. diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index a1d7463a7..8a334c21a 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -13,7 +13,8 @@ @define(kw_only=True) class VectorStoreClient(BaseTool): - """ + """A tool for querying a vector database. + Attributes: description: LLM-friendly vector DB description. vector_store_driver: `BaseVectorStoreDriver`. diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index 42214a895..e142d3bb2 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -16,7 +16,9 @@ def remove_key_in_dict_recursively(d: dict, key: str) -> dict: def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], add_keys: bool = True) -> dict: - """Recursive dict merge. Inspired by :meth:``dict.update()``, instead of + """Recursive dict merge. + + Inspired by :meth:``dict.update()``, instead of updating only top-level keys, dict_merge recurses down into dicts nested to an arbitrary depth, updating keys. The ``merge_dct`` is merged into ``dct``. diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index ebe5ba456..daf2982d8 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -26,7 +26,6 @@ def load_files(paths: list[str], futures_executor: Optional[futures.ThreadPoolEx Returns: A dictionary where the keys are a hash of the path and the values are the content of the files. """ - if futures_executor is None: futures_executor = futures.ThreadPoolExecutor() diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index 0de09b2d1..b3e830caf 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -18,11 +18,11 @@ def import_optional_dependency(name: str) -> Optional[ModuleType]: Args: name: The module name. + Returns: The imported module, when found. None is returned when the package is not found and `errors` is False. """ - package_name = INSTALL_MAPPING.get(name) install_name = package_name if package_name is not None else name @@ -43,6 +43,7 @@ def is_dependency_installed(name: str) -> bool: Args: name: The module name. + Returns: True if the dependency is available. False if the dependency is not available. diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py index 2a159a282..7c315a0bc 100644 --- a/griptape/utils/structure_visualizer.py +++ b/griptape/utils/structure_visualizer.py @@ -12,14 +12,15 @@ @define class StructureVisualizer: - """Utility class to visualize a Structure structure""" + """Utility class to visualize a Structure structure.""" structure: Structure = field() header: str = field(default="graph TD;", kw_only=True) def to_url(self) -> str: - """Generates a url that renders the Workflow structure as a Mermaid flowchart - Reference: https://mermaid.js.org/ecosystem/tutorials#jupyter-integration-with-mermaid-js + """Generates a url that renders the Workflow structure as a Mermaid flowchart. + + Reference: https://mermaid.js.org/ecosystem/tutorials#jupyter-integration-with-mermaid-js. Returns: str: URL to the rendered image diff --git a/pyproject.toml b/pyproject.toml index e2c4fdfd4..81a21946c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -209,7 +209,8 @@ select = [ "SIM", # flake8-simplify "TID251", # banned-api "T201", # print - "TCH" + "TCH", # flake8-type-checking + "D" # pydocstyle ] ignore = [ "UP007", # non-pep604-annotation @@ -217,7 +218,17 @@ ignore = [ "B024", # abstract-base-class-without-abstract-method "B009", # get-attr-with-constant "B010", # set-attr-with-constant + "D100", # undocumented-public-module + "D101", # undocumented-public-class + "D102", # undocumented-public-method + "D103", # undocumented-public-function + "D104", # undocumented-public-package + "D105", # undocumented-magic-method + "D106", # undocumented-public-nested-class + "D107", # undocumented-public-init ] +[tool.ruff.lint.pydocstyle] +convention = "google" [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." From 2056f0e0c8491e2ee1a06bd9ea1143e57f7edcd7 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Jul 2024 11:09:01 -0700 Subject: [PATCH 150/238] Add ruff rule for complex code paths (#951) --- griptape/chunkers/base_chunker.py | 29 ++++---- ...diffusion_image_generation_model_driver.py | 29 +++----- griptape/drivers/prompt/base_prompt_driver.py | 7 +- griptape/structures/workflow.py | 69 +++++++++++-------- griptape/tokenizers/openai_tokenizer.py | 2 +- pyproject.toml | 1 + 6 files changed, 77 insertions(+), 60 deletions(-) diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index 26199a16c..183264bb4 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -43,10 +43,9 @@ def _chunk_recursively(self, chunk: str, current_separator: Optional[ChunkSepara half_token_count = token_count // 2 # If a separator is provided, only use separators after it. - if current_separator: - separators = self.separators[self.separators.index(current_separator) :] - else: - separators = self.separators + separators = ( + self.separators[self.separators.index(current_separator) :] if current_separator else self.separators + ) # Loop through available separators to find the best split. for separator in separators: @@ -68,14 +67,7 @@ def _chunk_recursively(self, chunk: str, current_separator: Optional[ChunkSepara balance_diff = abs(tokens_count - half_token_count) # Create the two subchunks based on the best separator. - if separator.is_prefix: - # If the separator is a prefix, append it before this subchunk. - first_subchunk = separator.value + separator.value.join(subchunks[: balance_index + 1]) - second_subchunk = separator.value + separator.value.join(subchunks[balance_index + 1 :]) - else: - # If the separator is not a prefix, append it after this subchunk. - first_subchunk = separator.value.join(subchunks[: balance_index + 1]) + separator.value - second_subchunk = separator.value.join(subchunks[balance_index + 1 :]) + first_subchunk, second_subchunk = self.__get_subchunks(separator, subchunks, balance_index) # Continue recursively chunking the subchunks. first_subchunk_rec = self._chunk_recursively(first_subchunk.strip(), separator) @@ -94,3 +86,16 @@ def _chunk_recursively(self, chunk: str, current_separator: Optional[ChunkSepara # If none of the separators result in a balanced split, split the chunk in half. midpoint = len(chunk) // 2 return self._chunk_recursively(chunk[:midpoint]) + self._chunk_recursively(chunk[midpoint:]) + + def __get_subchunks(self, separator: ChunkSeparator, subchunks: list[str], balance_index: int) -> tuple[str, str]: + # Create the two subchunks based on the best separator. + if separator.is_prefix: + # If the separator is a prefix, append it before this subchunk. + first_subchunk = separator.value + separator.value.join(subchunks[: balance_index + 1]) + second_subchunk = separator.value + separator.value.join(subchunks[balance_index + 1 :]) + else: + # If the separator is not a prefix, append it after this subchunk. + first_subchunk = separator.value.join(subchunks[: balance_index + 1]) + separator.value + second_subchunk = separator.value.join(subchunks[balance_index + 1 :]) + + return first_subchunk, second_subchunk diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 9be3cc6b9..c0206dea0 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -109,16 +109,16 @@ def _request_parameters( text_prompts = [{"text": prompt, "weight": 1.0} for prompt in prompts] text_prompts += [{"text": negative_prompt, "weight": -1.0} for negative_prompt in negative_prompts] - request = {"text_prompts": text_prompts, "cfg_scale": self.cfg_scale} - - if self.style_preset is not None: - request["style_preset"] = self.style_preset - - if self.clip_guidance_preset is not None: - request["clip_guidance_preset"] = self.clip_guidance_preset - - if self.sampler is not None: - request["sampler"] = self.sampler + request = { + "text_prompts": text_prompts, + "cfg_scale": self.cfg_scale, + "style_preset": self.style_preset, + "clip_guidance_preset": self.clip_guidance_preset, + "sampler": self.sampler, + "steps": self.steps, + "seed": seed, + "start_schedule": self.start_schedule, + } if image is not None: request["init_image"] = image.base64 @@ -128,12 +128,6 @@ def _request_parameters( request["width"] = width request["height"] = height - if self.steps is not None: - request["steps"] = self.steps - - if seed is not None: - request["seed"] = seed - if mask is not None: if not mask_source: raise ValueError("mask_source must be provided when mask is provided") @@ -141,8 +135,7 @@ def _request_parameters( request["mask_source"] = mask_source request["mask_image"] = mask.base64 - if self.start_schedule is not None: - request["start_schedule"] = self.start_schedule + request = {k: v for k, v in request.items() if v is not None} return request diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index f012e7339..7a5c0cfc1 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -138,8 +138,13 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: self.structure.publish_event(CompletionChunkEvent(token=content.partial_input)) # Build a complete content from the content deltas + result = self.__build_message(list(delta_contents.values()), usage) + + return result + + def __build_message(self, delta_contents: list[list[BaseDeltaMessageContent]], usage: DeltaMessage.Usage): content = [] - for delta_content in delta_contents.values(): + for delta_content in delta_contents: text_deltas = [delta for delta in delta_content if isinstance(delta, TextDeltaMessageContent)] action_deltas = [delta for delta in delta_content if isinstance(delta, ActionCallDeltaMessageContent)] diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 3c0ee6586..523e5317d 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -64,37 +64,12 @@ def insert_task( ) -> BaseTask: task.preprocess(self) - for child_task in child_tasks: - # Link the new task to the child task - if child_task.id not in task.child_ids: - task.child_ids.append(child_task.id) - if task.id not in child_task.parent_ids: - child_task.parent_ids.append(task.id) + self.__link_task_to_children(task, child_tasks) if not preserve_relationship: - for parent_task in parent_tasks: - for child_task in child_tasks: - # Remove the old parent/child relationship - if child_task.id in parent_task.child_ids: - parent_task.child_ids.remove(child_task.id) - if parent_task.id in child_task.parent_ids: - child_task.parent_ids.remove(parent_task.id) + self.__remove_old_parent_child_relationships(parent_tasks, child_tasks) - last_parent_index = -1 - for parent_task in parent_tasks: - # Link the new task to the parent task - if parent_task.id not in task.parent_ids: - task.parent_ids.append(parent_task.id) - if task.id not in parent_task.child_ids: - parent_task.child_ids.append(task.id) - - try: - parent_index = self.tasks.index(parent_task) - except ValueError as exc: - raise ValueError(f"Parent task {parent_task.id} not found in workflow.") from exc - else: - if parent_index > last_parent_index: - last_parent_index = parent_index + last_parent_index = self.__link_task_to_parents(task, parent_tasks) # Insert the new task once, just after the last parent task self.tasks.insert(last_parent_index + 1, task) @@ -155,3 +130,41 @@ def to_graph(self) -> dict[str, set[str]]: def order_tasks(self) -> list[BaseTask]: return [self.find_task(task_id) for task_id in TopologicalSorter(self.to_graph()).static_order()] + + def __link_task_to_children(self, task: BaseTask, child_tasks: list[BaseTask]) -> None: + for child_task in child_tasks: + # Link the new task to the child task + if child_task.id not in task.child_ids: + task.child_ids.append(child_task.id) + if task.id not in child_task.parent_ids: + child_task.parent_ids.append(task.id) + + def __remove_old_parent_child_relationships( + self, parent_tasks: list[BaseTask], child_tasks: list[BaseTask] + ) -> None: + for parent_task in parent_tasks: + for child_task in child_tasks: + # Remove the old parent/child relationship + if child_task.id in parent_task.child_ids: + parent_task.child_ids.remove(child_task.id) + if parent_task.id in child_task.parent_ids: + child_task.parent_ids.remove(parent_task.id) + + def __link_task_to_parents(self, task: BaseTask, parent_tasks: list[BaseTask]) -> int: + last_parent_index = -1 + for parent_task in parent_tasks: + # Link the new task to the parent task + if parent_task.id not in task.parent_ids: + task.parent_ids.append(parent_task.id) + if task.id not in parent_task.child_ids: + parent_task.child_ids.append(task.id) + + try: + parent_index = self.tasks.index(parent_task) + except ValueError as exc: + raise ValueError(f"Parent task {parent_task.id} not found in workflow.") from exc + else: + if parent_index > last_parent_index: + last_parent_index = parent_index + + return last_parent_index diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index 3cb2674cf..13449f007 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -74,7 +74,7 @@ def _default_max_output_tokens(self) -> int: else: return tokens - def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> int: + def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> int: # noqa: C901 """Handles the special case of ChatML. Implementation adopted from the official OpenAI notebook: diff --git a/pyproject.toml b/pyproject.toml index 81a21946c..49e786a1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -209,6 +209,7 @@ select = [ "SIM", # flake8-simplify "TID251", # banned-api "T201", # print + "C901", # complex-structure "TCH", # flake8-type-checking "D" # pydocstyle ] From 627081ef4a2c727ed3b1fc3a09872dd6669d1889 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Jul 2024 12:34:35 -0700 Subject: [PATCH 151/238] Add docs for OpenAI compatible services (#962) --- .../drivers/embedding-drivers.md | 22 +++++++++++++++ .../drivers/prompt-drivers.md | 27 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index a607b0950..5bbad3e1e 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -27,6 +27,28 @@ print(embeddings[:3]) [0.0017853748286142945, 0.006118456833064556, -0.005811543669551611] ``` +### OpenAI Compatible + +Many services such as [LMStudio](https://lmstudio.ai/) and [OhMyGPT](https://www.ohmygpt.com/) provide OpenAI-compatible APIs. You can use the [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) to interact with these services. +Simply set the `base_url` to the service's API endpoint and the `model` to the model name. If the service requires an API key, you can set it in the `api_key` field. + +```python title="PYTEST_IGNORE" +from griptape.drivers import OpenAiEmbeddingDriver + +embedding_driver = OpenAiEmbeddingDriver( + base_url="http://127.0.0.1:1234/v1", + model="nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q2_K", +) + +embeddings = embedding_driver.embed_string("Hello world!") + +# display the first 3 embeddings +print(embeddings[:3]) +``` + +!!! tip + Make sure to include `v1` at the end of the `base_url` to match the OpenAI API endpoint. + ### Azure OpenAI The [AzureOpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/azure_openai_embedding_driver.md) uses the same parameters as [OpenAiEmbeddingDriver](../../reference/griptape/drivers/embedding/openai_embedding_driver.md) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index cdb90aef5..b9fc7f161 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -97,6 +97,33 @@ agent.run("Blue sky at dusk.") !!! info `response_format` and `seed` are unique to the OpenAI Chat Prompt Driver and Azure OpenAi Chat Prompt Driver. +### OpenAI Compatible + +Many services such as [LMStudio](https://lmstudio.ai/) and [OhMyGPT](https://www.ohmygpt.com/) provide OpenAI-compatible APIs. You can use the [OpenAiChatPromptDriver](../../reference/griptape/drivers/prompt/openai_chat_prompt_driver.md) to interact with these services. +Simply set the `base_url` to the service's API endpoint and the `model` to the model name. If the service requires an API key, you can set it in the `api_key` field. + +```python title="PYTEST_IGNORE" +from griptape.structures import Agent +from griptape.drivers import OpenAiChatPromptDriver +from griptape.rules import Rule +from griptape.config import StructureConfig + +agent = Agent( + config=StructureConfig( + prompt_driver=OpenAiChatPromptDriver( + base_url="http://127.0.0.1:1234/v1", + model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF", stream=True + ) + ), + rules=[Rule(value="You are a helpful coding assistant.")], +) + +agent.run("How do I init and update a git submodule?") +``` + +!!! tip + Make sure to include `v1` at the end of the `base_url` to match the OpenAI API endpoint. + ### Azure OpenAI Chat !!! info From be9ce34c8a391dc08e26b900767d6f8c1002ccd4 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 11 Jul 2024 14:00:04 -0700 Subject: [PATCH 152/238] Native Tool Fixes (#963) --- .../official-tools/rag-client.md | 46 +++++++++---------- .../prompt/amazon_bedrock_prompt_driver.py | 2 +- .../drivers/prompt/anthropic_prompt_driver.py | 2 +- .../drivers/prompt/cohere_prompt_driver.py | 2 +- .../drivers/prompt/google_prompt_driver.py | 2 +- .../prompt/openai_chat_prompt_driver.py | 2 +- griptape/tasks/actions_subtask.py | 8 +++- griptape/tools/base_tool.py | 14 ++++++ griptape/tools/file_manager/tool.py | 2 +- griptape/tools/google_cal/tool.py | 2 +- griptape/tools/rest_api_client/tool.py | 6 +-- griptape/tools/structure_run_client/tool.py | 2 +- tests/unit/tools/test_base_tool.py | 9 ++++ 13 files changed, 63 insertions(+), 36 deletions(-) diff --git a/docs/griptape-tools/official-tools/rag-client.md b/docs/griptape-tools/official-tools/rag-client.md index b11287b3e..8b1447768 100644 --- a/docs/griptape-tools/official-tools/rag-client.md +++ b/docs/griptape-tools/official-tools/rag-client.md @@ -52,27 +52,25 @@ agent.run("what is Griptape?") ``` ``` -[07/11/24 08:47:04] INFO ToolkitTask 4a5308b86cac447783e6abe1be0646cd - Input: what is Griptape? -[07/11/24 08:47:06] INFO Subtask e034a5d82658411694e9e19e51fa6699 - Thought: I need to search for information about - Griptape using the RagClient. I will perform a - search query to gather relevant details. - - Actions: - [{"name":"RagClient","path":"search","input":{"valu - es":{"query":"What is - Griptape?"}},"tag":"search_griptape"}] -[07/11/24 08:47:08] INFO Subtask e034a5d82658411694e9e19e51fa6699 - Response: Griptape builds AI-powered applications - that connect securely to your enterprise data and - APIs. Griptape Agents provide incredible power and - flexibility when working with large language - models. -[07/11/24 08:47:09] INFO ToolkitTask 4a5308b86cac447783e6abe1be0646cd - Output: Griptape builds AI-powered applications - that connect securely to your enterprise data and - APIs. Griptape Agents provide incredible power and - flexibility when working with large language - models. -``` \ No newline at end of file +[07/11/24 13:30:43] INFO ToolkitTask a6d057d5c71d4e9cb6863a2adb64b76c + Input: what is Griptape? +[07/11/24 13:30:44] INFO Subtask 8fd89ed9eefe49b8892187f2fca3890a + Actions: [ + { + "tag": "call_4MaDzOuKnWAs2gmhK3KJhtjI", + "name": "RagClient", + "path": "search", + "input": { + "values": { + "query": "What is Griptape?" + } + } + } + ] +[07/11/24 13:30:49] INFO Subtask 8fd89ed9eefe49b8892187f2fca3890a + Response: Griptape builds AI-powered applications that connect securely to your enterprise data and APIs. Griptape Agents provide incredible + power and flexibility when working with large language models. + INFO ToolkitTask a6d057d5c71d4e9cb6863a2adb64b76c + Output: Griptape builds AI-powered applications that connect securely to your enterprise data and APIs. Griptape Agents provide incredible + power and flexibility when working with large language models. +``` diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 5158740df..0b56af445 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -117,7 +117,7 @@ def __to_bedrock_tools(self, tools: list[BaseTool]) -> list[dict]: return [ { "toolSpec": { - "name": f"{tool.name}_{tool.activity_name(activity)}", + "name": tool.to_native_tool_name(activity), "description": tool.activity_description(activity), "inputSchema": { "json": (tool.activity_schema(activity) or Schema({})).json_schema( diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 877e41621..d42fee46f 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -124,7 +124,7 @@ def __to_anthropic_role(self, message: Message) -> str: def __to_anthropic_tools(self, tools: list[BaseTool]) -> list[dict]: return [ { - "name": f"{tool.name}_{tool.activity_name(activity)}", + "name": tool.to_native_tool_name(activity), "description": tool.activity_description(activity), "input_schema": (tool.activity_schema(activity) or Schema({})).json_schema("Input Schema"), } diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index a5dccb2a5..3943e2211 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -181,7 +181,7 @@ def __to_cohere_tools(self, tools: list[BaseTool]) -> list[dict]: tool_definitions.append( { - "name": f"{tool.name}_{tool.activity_name(activity)}", + "name": tool.to_native_tool_name(activity), "description": tool.activity_description(activity), "parameter_definitions": { property_name: { diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 48bb29f59..02b9f0f87 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -177,7 +177,7 @@ def __to_google_tools(self, tools: list[BaseTool]) -> list[dict]: schema = remove_key_in_dict_recursively(schema, "additionalProperties") tool_declaration = FunctionDeclaration( - name=f"{tool.name}_{tool.activity_name(activity)}", + name=tool.to_native_tool_name(activity), description=tool.activity_description(activity), parameters={ "type": schema["type"], diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index c6bd02489..b706cbeb6 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -210,7 +210,7 @@ def __to_openai_tools(self, tools: list[BaseTool]) -> list[dict]: return [ { "function": { - "name": f"{tool.name}_{tool.activity_name(activity)}", + "name": tool.to_native_tool_name(activity), "description": tool.activity_description(activity), "parameters": (tool.activity_schema(activity) or Schema({})).json_schema("Parameters Schema"), }, diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index ac0503e8f..ba73a29f0 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -89,7 +89,13 @@ def before_run(self) -> None: subtask_actions=self.actions_to_dicts(), ) ) - self.structure.logger.info(f"Subtask {self.id}\n{self.actions_to_json()}") + + parts = [ + f"Subtask {self.id}", + *([f"\nThought: {self.thought}"] if self.thought is not None else []), + f"\nActions: {self.actions_to_json()}", + ] + self.structure.logger.info("".join(parts)) def run(self) -> BaseArtifact: try: diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index c46027049..317a95ad5 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -187,3 +187,17 @@ def find_input_memory(self, memory_name: str) -> Optional[TaskMemory]: return next((m for m in self.input_memory if m.name == memory_name), None) else: return None + + def to_native_tool_name(self, activity: Callable) -> str: + """Converts a Tool into to a native tool name. + + Args: + activity: Activity to convert. + + Returns: + str: Native tool name. + """ + if "_" in self.name: + raise ValueError("Tool name can't contain underscores when using native tools.") + + return f"{self.name}_{self.activity_name(activity)}" diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index e26ad7b3a..47582f8cc 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -38,7 +38,7 @@ def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: Literal( "paths", description="Relative paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", - ): list + ): list[str] } ), } diff --git a/griptape/tools/google_cal/tool.py b/griptape/tools/google_cal/tool.py index b18c5f41c..e0097fd02 100644 --- a/griptape/tools/google_cal/tool.py +++ b/griptape/tools/google_cal/tool.py @@ -86,7 +86,7 @@ def get_upcoming_events(self, params: dict) -> ListArtifact | ErrorArtifact: Literal("description", description="description of the event"): str, Literal( "attendees", description="list of the email addresses of attendees using 'email' as key" - ): list, + ): list[str], Optional(Literal("location", description="location of the event")): str, } ), diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index 2722356e2..6206c1dba 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -79,7 +79,7 @@ def put(self, params: dict) -> BaseArtifact: ), "schema": Schema( { - Literal("path_params", description="The request path parameters."): list, + Literal("path_params", description="The request path parameters."): list[str], Literal("body", description="The request body."): dict, } ), @@ -144,7 +144,7 @@ def post(self, params: dict) -> BaseArtifact: Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, - schema.Optional(Literal("path_params", description="The request path parameters.")): list, + schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], } ) ), @@ -183,7 +183,7 @@ def get(self, params: dict) -> BaseArtifact: "schema": Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, - schema.Optional(Literal("path_params", description="The request path parameters.")): list, + schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], } ), } diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index 90b6071f1..79ed635df 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -28,7 +28,7 @@ class StructureRunClient(BaseTool): config={ "description": "Can be used to run a Griptape Structure with the following description: {{ self.description }}", "schema": Schema( - {Literal("args", description="A list of string arguments to submit to the Structure Run"): list} + {Literal("args", description="A list of string arguments to submit to the Structure Run"): list[str]} ), } ) diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 4b9b97260..51d76d3fd 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -223,3 +223,12 @@ def test_activity_schemas(self, tool): tool_schema = full_schema.json_schema(f"{tool.name} ToolAction Schema") assert tool_schema == self.TARGET_TOOL_SCHEMA + + def test_to_native_tool_name(self, tool): + tool = MockTool() + + assert tool.to_native_tool_name(tool.test) == "MockTool_test" + + with pytest.raises(ValueError): + tool.name = "mock_tool" + tool.to_native_tool_name(tool.foo) From afb8ceac7e0555cd0d07cd80cd97a63a3fcca643 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 12 Jul 2024 09:34:18 -0700 Subject: [PATCH 153/238] Catch tool errors (#965) --- griptape/tools/base_tool.py | 15 ++++++---- tests/mocks/mock_tool/tool.py | 9 ++++++ .../test_amazon_bedrock_prompt_driver.py | 23 ++++++++++++++ .../prompt/test_anthropic_prompt_driver.py | 19 ++++++++++++ .../prompt/test_cohere_prompt_driver.py | 5 ++++ .../prompt/test_google_prompt_driver.py | 5 ++++ .../prompt/test_openai_chat_prompt_driver.py | 22 ++++++++++++++ tests/unit/mixins/test_activity_mixin.py | 4 +-- tests/unit/tasks/test_actions_subtask.py | 30 +++++++++++++++++++ tests/unit/tasks/test_tool_task.py | 24 +++++++++++++++ tests/unit/tasks/test_toolkit_task.py | 24 +++++++++++++++ tests/unit/tools/test_base_tool.py | 23 ++++++++++++++ 12 files changed, 196 insertions(+), 7 deletions(-) diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 317a95ad5..bfff2fffb 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -10,7 +10,7 @@ from typing import Optional import yaml from attrs import define, field, Factory -from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact +from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact, ErrorArtifact from griptape.mixins import ActivityMixin if TYPE_CHECKING: @@ -105,11 +105,16 @@ def activity_schemas(self) -> list[Schema]: ] def execute(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> BaseArtifact: - preprocessed_input = self.before_run(activity, subtask, action) - output = self.run(activity, subtask, action, preprocessed_input) - postprocessed_output = self.after_run(activity, subtask, action, output) + try: + output = self.before_run(activity, subtask, action) - return postprocessed_output + output = self.run(activity, subtask, action, output) + + output = self.after_run(activity, subtask, action, output) + except Exception as e: + output = ErrorArtifact(str(e), exception=e) + + return output def before_run(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> Optional[dict]: return action.input diff --git a/tests/mocks/mock_tool/tool.py b/tests/mocks/mock_tool/tool.py index 266f77c1b..e79023a6e 100644 --- a/tests/mocks/mock_tool/tool.py +++ b/tests/mocks/mock_tool/tool.py @@ -29,6 +29,15 @@ def test(self, value: dict) -> BaseArtifact: def test_error(self, value: dict) -> BaseArtifact: return ErrorArtifact(f"error {value['values']['test']}") + @activity( + config={ + "description": "test description: {{ _self.foo() }}", + "schema": Schema({Literal("test"): str}, description="Test input"), + } + ) + def test_exception(self, value: dict) -> BaseArtifact: + raise Exception(f"error {value['values']['test']}") + @activity( config={ "description": "test description: {{ _self.foo() }}", diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index 4b8323969..e31b6a448 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -56,6 +56,29 @@ class TestAmazonBedrockPromptDriver: "name": "MockTool_test_error", } }, + { + "toolSpec": { + "description": "test description: foo", + "inputSchema": { + "json": { + "$id": "http://json-schema.org/draft-07/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + } + }, + "name": "MockTool_test_exception", + } + }, { "toolSpec": { "description": "test description", diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index 67b3af372..e8f6d337f 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -48,6 +48,25 @@ class TestAnthropicPromptDriver: }, "name": "MockTool_test_error", }, + { + "description": "test description: foo", + "input_schema": { + "$id": "Input Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + "name": "MockTool_test_exception", + }, { "description": "test description", "input_schema": { diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index 059aaffe5..167c08b34 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -23,6 +23,11 @@ class TestCoherePromptDriver: "name": "MockTool_test_error", "parameter_definitions": {"test": {"required": True, "type": "string"}}, }, + { + "description": "test description: foo", + "name": "MockTool_test_exception", + "parameter_definitions": {"test": {"required": True, "type": "string"}}, + }, {"description": "test description", "name": "MockTool_test_list_output", "parameter_definitions": {}}, {"description": "test description", "name": "MockTool_test_no_schema", "parameter_definitions": {}}, { diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index c4b341481..b1a72d10d 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -24,6 +24,11 @@ class TestGooglePromptDriver: "description": "test description: foo", "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, }, + { + "name": "MockTool_test_exception", + "description": "test description: foo", + "parameters": {"type": "OBJECT", "properties": {"test": {"type": "STRING"}}, "required": ["test"]}, + }, {"name": "MockTool_test_list_output", "description": "test description", "parameters": {"type": "OBJECT"}}, {"name": "MockTool_test_no_schema", "description": "test description", "parameters": {"type": "OBJECT"}}, { diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 9e664a398..59772ff23 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -55,6 +55,28 @@ class TestOpenAiChatPromptDriverFixtureMixin: }, "type": "function", }, + { + "function": { + "description": "test description: foo", + "name": "MockTool_test_exception", + "parameters": { + "$id": "Parameters Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": False, + "properties": { + "values": { + "additionalProperties": False, + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "type": "object", + } + }, + "required": ["values"], + "type": "object", + }, + }, + "type": "function", + }, { "function": { "description": "test description", diff --git a/tests/unit/mixins/test_activity_mixin.py b/tests/unit/mixins/test_activity_mixin.py index c27568c21..45db7cc7f 100644 --- a/tests/unit/mixins/test_activity_mixin.py +++ b/tests/unit/mixins/test_activity_mixin.py @@ -31,7 +31,7 @@ def test_find_activity(self): assert tool.find_activity("test_str_output") is None def test_activities(self, tool): - assert len(tool.activities()) == 6 + assert len(tool.activities()) == 7 assert tool.activities()[0] == tool.test def test_allowlist_and_denylist_validation(self): @@ -46,7 +46,7 @@ def test_allowlist(self): def test_denylist(self): tool = MockTool(test_field="hello", test_int=5, denylist=["test"]) - assert len(tool.activities()) == 5 + assert len(tool.activities()) == 6 def test_invalid_allowlist(self): with pytest.raises(ValueError): diff --git a/tests/unit/tasks/test_actions_subtask.py b/tests/unit/tasks/test_actions_subtask.py index ede892e2d..c6e5ca038 100644 --- a/tests/unit/tasks/test_actions_subtask.py +++ b/tests/unit/tasks/test_actions_subtask.py @@ -162,3 +162,33 @@ def test_implicit_values(self): assert json_dict[0]["name"] == "MockTool" assert json_dict[0]["path"] == "test" assert json_dict[0]["input"] == {"values": {"test": "value"}} + + def test_execute_tool(self): + valid_input = ( + "Thought: need to test\n" + 'Actions:[{"tag": "foo", "name": "MockTool","path": "test","input": {"values": {"test": "value"}}}]' + ) + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + subtask.execute() + + assert isinstance(subtask.output, ListArtifact) + assert isinstance(subtask.output.value[0], TextArtifact) + assert subtask.output.value[0].value == "ack value" + + def test_execute_tool_exception(self): + valid_input = ( + "Thought: need to test\n" + 'Actions:[{"tag": "foo", "name": "MockTool","path": "test_exception","input": {"values": {"test": "value"}}}]' + ) + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + subtask.execute() + + assert isinstance(subtask.output, ListArtifact) + assert isinstance(subtask.output.value[0], ErrorArtifact) + assert subtask.output.value[0].value == "error value" diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index efab408fe..2af8b73c3 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -63,6 +63,30 @@ class TestToolTask: "required": ["name", "path", "input", "tag"], "additionalProperties": False, }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_exception"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, { "type": "object", "properties": { diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 38002553c..2217ba70c 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -61,6 +61,30 @@ class TestToolkitSubtask: "required": ["name", "path", "input", "tag"], "additionalProperties": False, }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_exception"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + "tag": {"description": "Unique tag name for action execution.", "type": "string"}, + }, + "required": ["name", "path", "input", "tag"], + "additionalProperties": False, + }, { "type": "object", "properties": { diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 51d76d3fd..75154b509 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -59,6 +59,29 @@ class TestBaseTool: "required": ["name", "path", "input"], "additionalProperties": False, }, + { + "type": "object", + "properties": { + "name": {"const": "MockTool"}, + "path": {"description": "test description: foo", "const": "test_exception"}, + "input": { + "type": "object", + "properties": { + "values": { + "description": "Test input", + "type": "object", + "properties": {"test": {"type": "string"}}, + "required": ["test"], + "additionalProperties": False, + } + }, + "required": ["values"], + "additionalProperties": False, + }, + }, + "required": ["name", "path", "input"], + "additionalProperties": False, + }, { "type": "object", "properties": { From fe1e9915a665eea3ce2d161b74bb100350ca0e00 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 12 Jul 2024 12:16:56 -0700 Subject: [PATCH 154/238] Add isort ruff rule (#967) --- griptape/artifacts/action_artifact.py | 3 +- griptape/artifacts/base_artifact.py | 9 +++-- griptape/artifacts/blob_artifact.py | 5 ++- griptape/artifacts/boolean_artifact.py | 3 ++ griptape/artifacts/csv_row_artifact.py | 5 ++- griptape/artifacts/error_artifact.py | 3 ++ griptape/artifacts/info_artifact.py | 2 + griptape/artifacts/list_artifact.py | 6 ++- griptape/artifacts/media_artifact.py | 5 ++- griptape/artifacts/text_artifact.py | 3 ++ griptape/chunkers/base_chunker.py | 5 ++- griptape/common/actions/base_action.py | 3 +- griptape/common/actions/tool_action.py | 1 + .../action_call_delta_message_content.py | 4 +- .../contents/action_call_message_content.py | 5 +-- .../contents/action_result_message_content.py | 5 ++- .../contents/base_message_content.py | 6 ++- .../contents/image_message_content.py | 5 ++- .../contents/text_delta_message_content.py | 1 + .../contents/text_message_content.py | 5 ++- .../prompt_stack/messages/base_message.py | 6 +-- .../prompt_stack/messages/delta_message.py | 3 +- .../common/prompt_stack/messages/message.py | 2 +- griptape/common/reference.py | 4 +- .../config/amazon_bedrock_structure_config.py | 6 ++- .../config/azure_openai_structure_config.py | 5 ++- griptape/config/base_structure_config.py | 6 +-- griptape/config/cohere_structure_config.py | 4 +- griptape/config/openai_structure_config.py | 8 ++-- griptape/config/structure_config.py | 16 ++++---- .../base_audio_transcription_driver.py | 4 +- .../dummy_audio_transcription_driver.py | 1 + .../openai_audio_transcription_driver.py | 2 +- .../amazon_bedrock_cohere_embedding_driver.py | 10 +++-- .../amazon_bedrock_titan_embedding_driver.py | 10 +++-- ...on_sagemaker_jumpstart_embedding_driver.py | 4 +- .../azure_openai_embedding_driver.py | 6 ++- .../embedding/base_embedding_driver.py | 10 +++-- .../embedding/cohere_embedding_driver.py | 5 ++- .../embedding/dummy_embedding_driver.py | 1 + .../embedding/google_embedding_driver.py | 3 ++ .../huggingface_hub_embedding_driver.py | 7 +++- .../embedding/ollama_embedding_driver.py | 9 +++-- .../embedding/openai_embedding_driver.py | 7 +++- .../embedding/voyageai_embedding_driver.py | 9 +++-- .../base_event_listener_driver.py | 4 +- .../griptape_cloud_event_listener_driver.py | 6 +-- .../pusher_event_listener_driver.py | 4 +- .../webhook_event_listener_driver.py | 1 - .../amazon_s3_file_manager_driver.py | 6 ++- .../file_manager/base_file_manager_driver.py | 5 ++- .../file_manager/local_file_manager_driver.py | 5 ++- .../amazon_bedrock_image_generation_driver.py | 2 +- .../azure_openai_image_generation_driver.py | 5 ++- .../base_image_generation_driver.py | 2 +- ...ase_multi_model_image_generation_driver.py | 3 +- .../dummy_image_generation_driver.py | 2 + .../leonardo_image_generation_driver.py | 4 +- .../openai_image_generation_driver.py | 4 +- .../base_image_generation_model_driver.py | 2 +- ...diffusion_image_generation_model_driver.py | 4 +- ...ock_titan_image_generation_model_driver.py | 4 +- .../amazon_bedrock_image_query_driver.py | 10 +++-- .../anthropic_image_query_driver.py | 7 +++- .../azure_openai_image_query_driver.py | 3 +- .../image_query/base_image_query_driver.py | 8 ++-- .../base_multi_model_image_query_driver.py | 3 +- .../image_query/dummy_image_query_driver.py | 2 +- .../image_query/openai_image_query_driver.py | 8 ++-- .../base_image_query_model_driver.py | 7 +++- ...bedrock_claude_image_query_model_driver.py | 2 + ...zon_dynamodb_conversation_memory_driver.py | 9 +++-- .../base_conversation_memory_driver.py | 4 +- .../local_conversation_memory_driver.py | 4 +- .../redis_conversation_memory_driver.py | 7 +++- .../prompt/amazon_bedrock_prompt_driver.py | 1 + ...mazon_sagemaker_jumpstart_prompt_driver.py | 3 +- .../drivers/prompt/anthropic_prompt_driver.py | 9 +++-- .../prompt/azure_openai_chat_prompt_driver.py | 6 ++- griptape/drivers/prompt/base_prompt_driver.py | 9 +++-- .../drivers/prompt/cohere_prompt_driver.py | 23 ++++++----- .../drivers/prompt/dummy_prompt_driver.py | 6 ++- .../drivers/prompt/google_prompt_driver.py | 22 +++++------ .../prompt/huggingface_hub_prompt_driver.py | 3 +- .../huggingface_pipeline_prompt_driver.py | 3 +- .../drivers/prompt/ollama_prompt_driver.py | 21 +++++++--- .../prompt/openai_chat_prompt_driver.py | 9 +++-- griptape/drivers/rerank/base_rerank_driver.py | 2 + .../drivers/rerank/cohere_rerank_driver.py | 8 +++- .../drivers/sql/amazon_redshift_sql_driver.py | 7 +++- griptape/drivers/sql/base_sql_driver.py | 3 +- griptape/drivers/sql/snowflake_sql_driver.py | 11 ++++-- griptape/drivers/sql/sql_driver.py | 7 +++- .../base_structure_run_driver.py | 2 +- .../griptape_cloud_structure_run_driver.py | 2 +- .../local_structure_run_driver.py | 4 +- .../dummy_text_to_speech_driver.py | 1 + .../elevenlabs_text_to_speech_driver.py | 2 +- .../openai_text_to_speech_driver.py | 4 +- .../amazon_opensearch_vector_store_driver.py | 7 +++- .../azure_mongodb_vector_store_driver.py | 3 ++ .../vector/base_vector_store_driver.py | 10 +++-- .../vector/dummy_vector_store_driver.py | 6 ++- .../vector/local_vector_store_driver.py | 6 ++- .../vector/marqo_vector_store_driver.py | 12 ++++-- .../mongodb_atlas_vector_store_driver.py | 5 ++- .../vector/opensearch_vector_store_driver.py | 11 ++++-- .../vector/pgvector_vector_store_driver.py | 16 ++++---- .../vector/pinecone_vector_store_driver.py | 9 +++-- .../vector/qdrant_vector_store_driver.py | 7 +++- .../vector/redis_vector_store_driver.py | 9 +++-- .../markdownify_web_scraper_driver.py | 4 +- .../web_scraper/proxy_web_scraper_driver.py | 2 +- .../trafilatura_web_scraper_driver.py | 2 + .../web_search/base_web_search_driver.py | 3 +- .../duck_duck_go_web_search_driver.py | 7 +++- .../web_search/google_web_search_driver.py | 8 ++-- .../engines/audio/text_to_speech_engine.py | 6 +-- .../extraction/base_extraction_engine.py | 11 ++++-- .../extraction/csv_extraction_engine.py | 9 +++-- .../extraction/json_extraction_engine.py | 11 ++++-- .../image/base_image_generation_engine.py | 8 ++-- .../inpainting_image_generation_engine.py | 5 ++- .../outpainting_image_generation_engine.py | 3 +- .../image/prompt_image_generation_engine.py | 5 ++- .../variation_image_generation_engine.py | 5 ++- .../engines/rag/modules/base_rag_module.py | 8 ++-- .../modules/query/base_query_rag_module.py | 2 + .../base_after_response_rag_module.py | 2 + .../base_before_response_rag_module.py | 2 + .../response/base_response_rag_module.py | 2 + .../metadata_before_response_rag_module.py | 2 + .../response/prompt_response_rag_module.py | 4 +- .../rulesets_before_response_rag_module.py | 1 + .../text_chunks_response_rag_module.py | 1 + .../retrieval/base_rerank_rag_module.py | 3 +- .../retrieval/base_retrieval_rag_module.py | 4 +- .../text_chunks_rerank_rag_module.py | 3 +- .../text_loader_retrieval_rag_module.py | 10 +++-- .../vector_store_retrieval_rag_module.py | 8 +++- griptape/engines/rag/rag_context.py | 6 ++- griptape/engines/rag/rag_engine.py | 2 + griptape/engines/rag/stages/base_rag_stage.py | 4 +- .../engines/rag/stages/query_rag_stage.py | 2 + .../engines/rag/stages/response_rag_stage.py | 6 ++- .../engines/rag/stages/retrieval_rag_stage.py | 5 ++- .../engines/summary/base_summary_engine.py | 4 +- .../engines/summary/prompt_summary_engine.py | 8 ++-- griptape/events/base_actions_subtask_event.py | 5 ++- .../events/base_image_generation_event.py | 5 ++- .../events/base_media_generation_event.py | 5 ++- griptape/events/base_prompt_event.py | 5 ++- griptape/events/base_task_event.py | 7 +++- griptape/events/base_text_to_speech_event.py | 4 +- griptape/events/completion_chunk_event.py | 4 +- griptape/events/event_listener.py | 9 +++-- .../events/finish_actions_subtask_event.py | 2 + griptape/events/finish_prompt_event.py | 4 +- griptape/events/finish_task_event.py | 2 + .../events/start_actions_subtask_event.py | 2 + .../events/start_image_generation_event.py | 1 + griptape/events/start_prompt_event.py | 6 ++- griptape/events/start_task_event.py | 2 + griptape/loaders/base_loader.py | 5 ++- griptape/loaders/base_text_loader.py | 9 +++-- griptape/loaders/blob_loader.py | 1 + griptape/loaders/csv_loader.py | 3 +- griptape/loaders/dataframe_loader.py | 5 ++- griptape/loaders/email_loader.py | 6 +-- griptape/loaders/image_loader.py | 2 +- griptape/loaders/pdf_loader.py | 9 +++-- griptape/loaders/sql_loader.py | 2 +- griptape/loaders/text_loader.py | 4 +- griptape/loaders/web_loader.py | 7 +++- .../memory/meta/action_subtask_meta_entry.py | 5 ++- griptape/memory/meta/base_meta_entry.py | 4 +- griptape/memory/meta/meta_memory.py | 1 + .../structure/base_conversation_memory.py | 7 +++- .../memory/structure/conversation_memory.py | 7 +++- griptape/memory/structure/run.py | 4 +- .../structure/summary_conversation_memory.py | 9 +++-- .../task/storage/base_artifact_storage.py | 6 ++- .../task/storage/blob_artifact_storage.py | 4 +- .../task/storage/text_artifact_storage.py | 7 +++- griptape/memory/task/task_memory.py | 9 +++-- .../mixins/actions_subtask_origin_mixin.py | 8 ++-- griptape/mixins/activity_mixin.py | 7 ++-- griptape/mixins/exponential_backoff_mixin.py | 5 ++- .../media_artifact_file_output_mixin.py | 3 +- griptape/mixins/rule_mixin.py | 2 +- griptape/mixins/serializable_mixin.py | 6 +-- griptape/rules/rule.py | 1 + griptape/rules/ruleset.py | 3 +- griptape/schemas/base_schema.py | 38 ++++++++++--------- griptape/schemas/bytes_field.py | 3 +- griptape/schemas/polymorphic_schema.py | 4 +- griptape/structures/agent.py | 7 +++- griptape/structures/pipeline.py | 5 ++- griptape/structures/structure.py | 19 ++++++---- griptape/structures/workflow.py | 9 +++-- griptape/tasks/actions_subtask.py | 10 +++-- griptape/tasks/audio_transcription_task.py | 3 +- griptape/tasks/base_audio_generation_task.py | 2 +- griptape/tasks/base_image_generation_task.py | 8 ++-- griptape/tasks/base_multi_text_input_task.py | 2 +- griptape/tasks/base_task.py | 8 ++-- griptape/tasks/code_execution_task.py | 5 ++- griptape/tasks/csv_extraction_task.py | 2 + griptape/tasks/extraction_task.py | 7 +++- .../tasks/inpainting_image_generation_task.py | 2 +- griptape/tasks/json_extraction_task.py | 2 + .../outpainting_image_generation_task.py | 2 +- .../tasks/prompt_image_generation_task.py | 2 +- griptape/tasks/prompt_task.py | 5 +-- griptape/tasks/rag_task.py | 7 +++- griptape/tasks/structure_run_task.py | 4 +- griptape/tasks/text_summary_task.py | 3 ++ griptape/tasks/text_to_speech_task.py | 4 +- griptape/tasks/tool_task.py | 13 ++++--- griptape/tasks/toolkit_task.py | 14 ++++--- .../tasks/variation_image_generation_task.py | 2 +- .../tokenizers/amazon_bedrock_tokenizer.py | 1 + griptape/tokenizers/anthropic_tokenizer.py | 7 +++- griptape/tokenizers/base_tokenizer.py | 4 +- griptape/tokenizers/cohere_tokenizer.py | 3 ++ griptape/tokenizers/dummy_tokenizer.py | 5 ++- griptape/tokenizers/google_tokenizer.py | 7 +++- griptape/tokenizers/huggingface_tokenizer.py | 6 ++- griptape/tokenizers/simple_tokenizer.py | 2 + .../tools/audio_transcription_client/tool.py | 8 ++-- griptape/tools/aws_iam_client/tool.py | 11 ++++-- griptape/tools/aws_s3_client/tool.py | 13 ++++--- griptape/tools/base_aws_client.py | 7 +++- griptape/tools/base_google_client.py | 4 +- griptape/tools/base_griptape_cloud_client.py | 3 ++ griptape/tools/base_tool.py | 16 ++++---- griptape/tools/calculator/tool.py | 3 +- griptape/tools/computer/tool.py | 14 ++++--- griptape/tools/date_time/tool.py | 4 +- griptape/tools/email_client/tool.py | 15 +++++--- griptape/tools/file_manager/tool.py | 7 +++- griptape/tools/google_cal/tool.py | 11 ++++-- griptape/tools/google_docs/tool.py | 9 +++-- griptape/tools/google_drive/tool.py | 11 ++++-- griptape/tools/google_gmail/tool.py | 11 ++++-- .../tool.py | 9 +++-- griptape/tools/image_query_client/tool.py | 8 ++-- .../tool.py | 4 +- griptape/tools/openweather_client/tool.py | 15 +++++--- .../tool.py | 6 +-- .../prompt_image_generation_client/tool.py | 9 +++-- griptape/tools/rag_client/tool.py | 9 +++-- griptape/tools/rest_api_client/tool.py | 14 ++++--- griptape/tools/sql_client/tool.py | 9 +++-- griptape/tools/structure_run_client/tool.py | 3 +- griptape/tools/task_memory_client/tool.py | 6 ++- griptape/tools/text_to_speech_client/tool.py | 8 ++-- .../variation_image_generation_client/tool.py | 6 +-- griptape/tools/vector_store_client/tool.py | 12 +++--- griptape/tools/web_scraper/tool.py | 8 ++-- griptape/tools/web_search/tool.py | 7 +++- griptape/utils/command_runner.py | 4 +- griptape/utils/conversation.py | 2 + griptape/utils/decorators.py | 2 +- griptape/utils/file_utils.py | 3 +- griptape/utils/import_utils.py | 1 - griptape/utils/j2.py | 4 +- griptape/utils/python_runner.py | 1 + griptape/utils/stream.py | 12 ++++-- griptape/utils/structure_visualizer.py | 5 ++- pyproject.toml | 6 ++- 271 files changed, 1022 insertions(+), 555 deletions(-) diff --git a/griptape/artifacts/action_artifact.py b/griptape/artifacts/action_artifact.py index 210e24f9f..a10653078 100644 --- a/griptape/artifacts/action_artifact.py +++ b/griptape/artifacts/action_artifact.py @@ -1,8 +1,9 @@ from __future__ import annotations -from attrs import define, field from typing import TYPE_CHECKING +from attrs import define, field + from griptape.artifacts import BaseArtifact from griptape.mixins import SerializableMixin diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index 626e13f69..ef82110af 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -1,10 +1,13 @@ from __future__ import annotations -from griptape.mixins import SerializableMixin -from typing import Any, TYPE_CHECKING, Optional + import json import uuid from abc import ABC, abstractmethod -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field + +from griptape.mixins import SerializableMixin if TYPE_CHECKING: from griptape.common import Reference diff --git a/griptape/artifacts/blob_artifact.py b/griptape/artifacts/blob_artifact.py index 5d2f32272..0c0dcc122 100644 --- a/griptape/artifacts/blob_artifact.py +++ b/griptape/artifacts/blob_artifact.py @@ -1,7 +1,10 @@ from __future__ import annotations + import os.path from typing import Optional -from attrs import field, define + +from attrs import define, field + from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py index 0c5ae6f35..7719e9cfe 100644 --- a/griptape/artifacts/boolean_artifact.py +++ b/griptape/artifacts/boolean_artifact.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import Union + from attrs import define, field + from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/csv_row_artifact.py b/griptape/artifacts/csv_row_artifact.py index 7572b7a2f..74b8f1a4e 100644 --- a/griptape/artifacts/csv_row_artifact.py +++ b/griptape/artifacts/csv_row_artifact.py @@ -1,8 +1,11 @@ from __future__ import annotations + import csv import io + from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, TextArtifact @define diff --git a/griptape/artifacts/error_artifact.py b/griptape/artifacts/error_artifact.py index 1900002b3..d065d754b 100644 --- a/griptape/artifacts/error_artifact.py +++ b/griptape/artifacts/error_artifact.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import Optional + from attrs import define, field + from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/info_artifact.py b/griptape/artifacts/info_artifact.py index 3692e9631..26fe6366b 100644 --- a/griptape/artifacts/info_artifact.py +++ b/griptape/artifacts/info_artifact.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define, field + from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 68b377df2..23cca6461 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -1,6 +1,8 @@ -from typing import Optional from collections.abc import Sequence -from attrs import field, define +from typing import Optional + +from attrs import define, field + from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/media_artifact.py b/griptape/artifacts/media_artifact.py index 751f2bf62..a57217fc7 100644 --- a/griptape/artifacts/media_artifact.py +++ b/griptape/artifacts/media_artifact.py @@ -1,13 +1,14 @@ from __future__ import annotations +import base64 +import random import string import time -import random from typing import Optional from attrs import define, field + from griptape.artifacts import BlobArtifact -import base64 @define diff --git a/griptape/artifacts/text_artifact.py b/griptape/artifacts/text_artifact.py index e8a2bb2a7..1e44a8df5 100644 --- a/griptape/artifacts/text_artifact.py +++ b/griptape/artifacts/text_artifact.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Optional + from attrs import define, field + from griptape.artifacts import BaseArtifact if TYPE_CHECKING: diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index 183264bb4..a6258d43b 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -1,7 +1,10 @@ from __future__ import annotations + from abc import ABC from typing import Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact from griptape.chunkers import ChunkSeparator from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer diff --git a/griptape/common/actions/base_action.py b/griptape/common/actions/base_action.py index 6bfda8f30..abd9abcd4 100644 --- a/griptape/common/actions/base_action.py +++ b/griptape/common/actions/base_action.py @@ -1,5 +1,6 @@ -from griptape.mixins import SerializableMixin from abc import ABC +from griptape.mixins import SerializableMixin + class BaseAction(SerializableMixin, ABC): ... diff --git a/griptape/common/actions/tool_action.py b/griptape/common/actions/tool_action.py index 2b03a10bb..1b84cd551 100644 --- a/griptape/common/actions/tool_action.py +++ b/griptape/common/actions/tool_action.py @@ -1,4 +1,5 @@ from __future__ import annotations + import json from typing import TYPE_CHECKING, Optional diff --git a/griptape/common/prompt_stack/contents/action_call_delta_message_content.py b/griptape/common/prompt_stack/contents/action_call_delta_message_content.py index 5e86aa164..4751cc13c 100644 --- a/griptape/common/prompt_stack/contents/action_call_delta_message_content.py +++ b/griptape/common/prompt_stack/contents/action_call_delta_message_content.py @@ -1,7 +1,9 @@ from __future__ import annotations -from attrs import define, field + from typing import Optional +from attrs import define, field + from griptape.common import BaseDeltaMessageContent diff --git a/griptape/common/prompt_stack/contents/action_call_message_content.py b/griptape/common/prompt_stack/contents/action_call_message_content.py index 55cc78324..e658af23d 100644 --- a/griptape/common/prompt_stack/contents/action_call_message_content.py +++ b/griptape/common/prompt_stack/contents/action_call_message_content.py @@ -1,13 +1,12 @@ from __future__ import annotations import json +from typing import TYPE_CHECKING from attrs import define, field -from griptape.common import ToolAction from griptape.artifacts import ActionArtifact -from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ActionCallDeltaMessageContent -from typing import TYPE_CHECKING +from griptape.common import ActionCallDeltaMessageContent, BaseDeltaMessageContent, BaseMessageContent, ToolAction if TYPE_CHECKING: from collections.abc import Sequence diff --git a/griptape/common/prompt_stack/contents/action_result_message_content.py b/griptape/common/prompt_stack/contents/action_result_message_content.py index 8f75daaac..9b55b81ff 100644 --- a/griptape/common/prompt_stack/contents/action_result_message_content.py +++ b/griptape/common/prompt_stack/contents/action_result_message_content.py @@ -1,15 +1,16 @@ from __future__ import annotations +from typing import TYPE_CHECKING from attrs import define, field from griptape.common import BaseDeltaMessageContent, BaseMessageContent, ToolAction -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.artifacts import BaseArtifact from collections.abc import Sequence + from griptape.artifacts import BaseArtifact + @define class ActionResultMessageContent(BaseMessageContent): diff --git a/griptape/common/prompt_stack/contents/base_message_content.py b/griptape/common/prompt_stack/contents/base_message_content.py index 5515ef745..a0b10fd05 100644 --- a/griptape/common/prompt_stack/contents/base_message_content.py +++ b/griptape/common/prompt_stack/contents/base_message_content.py @@ -2,14 +2,18 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING + from attrs import define, field + from griptape.mixins import SerializableMixin if TYPE_CHECKING: - from .base_delta_message_content import BaseDeltaMessageContent from collections.abc import Sequence + from griptape.artifacts.base_artifact import BaseArtifact + from .base_delta_message_content import BaseDeltaMessageContent + @define class BaseMessageContent(ABC, SerializableMixin): diff --git a/griptape/common/prompt_stack/contents/image_message_content.py b/griptape/common/prompt_stack/contents/image_message_content.py index 335004c30..37906ec38 100644 --- a/griptape/common/prompt_stack/contents/image_message_content.py +++ b/griptape/common/prompt_stack/contents/image_message_content.py @@ -1,15 +1,16 @@ from __future__ import annotations +from typing import TYPE_CHECKING from attrs import define, field from griptape.common import BaseDeltaMessageContent, BaseMessageContent -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.artifacts import ImageArtifact from collections.abc import Sequence + from griptape.artifacts import ImageArtifact + @define class ImageMessageContent(BaseMessageContent): diff --git a/griptape/common/prompt_stack/contents/text_delta_message_content.py b/griptape/common/prompt_stack/contents/text_delta_message_content.py index ab5313df6..23448261c 100644 --- a/griptape/common/prompt_stack/contents/text_delta_message_content.py +++ b/griptape/common/prompt_stack/contents/text_delta_message_content.py @@ -1,4 +1,5 @@ from __future__ import annotations + from attrs import define, field from griptape.common import BaseDeltaMessageContent diff --git a/griptape/common/prompt_stack/contents/text_message_content.py b/griptape/common/prompt_stack/contents/text_message_content.py index b98402097..c862564f3 100644 --- a/griptape/common/prompt_stack/contents/text_message_content.py +++ b/griptape/common/prompt_stack/contents/text_message_content.py @@ -1,10 +1,11 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import define, field from griptape.artifacts import TextArtifact -from griptape.common import BaseMessageContent, BaseDeltaMessageContent, TextDeltaMessageContent -from typing import TYPE_CHECKING +from griptape.common import BaseDeltaMessageContent, BaseMessageContent, TextDeltaMessageContent if TYPE_CHECKING: from collections.abc import Sequence diff --git a/griptape/common/prompt_stack/messages/base_message.py b/griptape/common/prompt_stack/messages/base_message.py index 84de85d7d..15bcd9c73 100644 --- a/griptape/common/prompt_stack/messages/base_message.py +++ b/griptape/common/prompt_stack/messages/base_message.py @@ -1,14 +1,14 @@ from __future__ import annotations from abc import ABC -from typing import Optional, Union, TYPE_CHECKING -from attrs import Factory, define, field +from typing import TYPE_CHECKING, Optional, Union +from attrs import Factory, define, field from griptape.mixins import SerializableMixin if TYPE_CHECKING: - from griptape.common import BaseMessageContent, BaseDeltaMessageContent + from griptape.common import BaseDeltaMessageContent, BaseMessageContent @define diff --git a/griptape/common/prompt_stack/messages/delta_message.py b/griptape/common/prompt_stack/messages/delta_message.py index b535451db..20aedbbe3 100644 --- a/griptape/common/prompt_stack/messages/delta_message.py +++ b/griptape/common/prompt_stack/messages/delta_message.py @@ -1,10 +1,9 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from attrs import define, field - from .base_message import BaseMessage if TYPE_CHECKING: diff --git a/griptape/common/prompt_stack/messages/message.py b/griptape/common/prompt_stack/messages/message.py index 8bc6f63e2..aaba331d9 100644 --- a/griptape/common/prompt_stack/messages/message.py +++ b/griptape/common/prompt_stack/messages/message.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.artifacts import TextArtifact, ListArtifact, BaseArtifact +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.common import BaseMessageContent, TextMessageContent from .base_message import BaseMessage diff --git a/griptape/common/reference.py b/griptape/common/reference.py index d92c203f9..40b709df9 100644 --- a/griptape/common/reference.py +++ b/griptape/common/reference.py @@ -1,6 +1,8 @@ import uuid from typing import Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.mixins import SerializableMixin diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_structure_config.py index cdb685c76..c99b59026 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_structure_config.py @@ -1,9 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING + from attrs import Factory, define, field -from griptape.drivers import BasePromptDriver -from griptape.utils import import_optional_dependency from griptape.config import StructureConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, @@ -12,11 +12,13 @@ AmazonBedrockTitanEmbeddingDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, + BasePromptDriver, BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, BedrockTitanImageGenerationModelDriver, LocalVectorStoreDriver, ) +from griptape.utils import import_optional_dependency if TYPE_CHECKING: import boto3 diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_structure_config.py index 3aee53f32..8361c7894 100644 --- a/griptape/config/azure_openai_structure_config.py +++ b/griptape/config/azure_openai_structure_config.py @@ -1,18 +1,19 @@ from typing import Callable, Optional + from attrs import Factory, define, field from griptape.config import StructureConfig from griptape.drivers import ( - LocalVectorStoreDriver, AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, AzureOpenAiImageGenerationDriver, AzureOpenAiImageQueryDriver, - BasePromptDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, BaseImageQueryDriver, + BasePromptDriver, BaseVectorStoreDriver, + LocalVectorStoreDriver, ) diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index 2ceaf024f..a75cb9e80 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from attrs import define, field @@ -10,14 +10,14 @@ if TYPE_CHECKING: from griptape.drivers import ( + BaseAudioTranscriptionDriver, BaseConversationMemoryDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, BaseImageQueryDriver, BasePromptDriver, - BaseVectorStoreDriver, BaseTextToSpeechDriver, - BaseAudioTranscriptionDriver, + BaseVectorStoreDriver, ) diff --git a/griptape/config/cohere_structure_config.py b/griptape/config/cohere_structure_config.py index 82f11b8f4..c4c9f7eef 100644 --- a/griptape/config/cohere_structure_config.py +++ b/griptape/config/cohere_structure_config.py @@ -4,9 +4,9 @@ from griptape.drivers import ( BaseEmbeddingDriver, BasePromptDriver, - CoherePromptDriver, - CohereEmbeddingDriver, BaseVectorStoreDriver, + CohereEmbeddingDriver, + CoherePromptDriver, LocalVectorStoreDriver, ) diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index 416306a98..cce828913 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -2,20 +2,20 @@ from griptape.config import StructureConfig from griptape.drivers import ( + BaseAudioTranscriptionDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, BaseImageQueryDriver, BasePromptDriver, + BaseTextToSpeechDriver, BaseVectorStoreDriver, LocalVectorStoreDriver, + OpenAiAudioTranscriptionDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver, OpenAiImageGenerationDriver, - BaseTextToSpeechDriver, - OpenAiTextToSpeechDriver, - BaseAudioTranscriptionDriver, - OpenAiAudioTranscriptionDriver, OpenAiImageQueryDriver, + OpenAiTextToSpeechDriver, ) diff --git a/griptape/config/structure_config.py b/griptape/config/structure_config.py index ae3ad1e99..fe7bc7342 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/structure_config.py @@ -1,24 +1,24 @@ -from attrs import Factory, define, field from typing import Optional -from griptape.config import BaseStructureConfig +from attrs import Factory, define, field +from griptape.config import BaseStructureConfig from griptape.drivers import ( + BaseAudioTranscriptionDriver, BaseConversationMemoryDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, + BaseImageQueryDriver, BasePromptDriver, + BaseTextToSpeechDriver, BaseVectorStoreDriver, - DummyVectorStoreDriver, + DummyAudioTranscriptionDriver, DummyEmbeddingDriver, DummyImageGenerationDriver, - DummyPromptDriver, DummyImageQueryDriver, - BaseImageQueryDriver, - BaseTextToSpeechDriver, + DummyPromptDriver, DummyTextToSpeechDriver, - BaseAudioTranscriptionDriver, - DummyAudioTranscriptionDriver, + DummyVectorStoreDriver, ) diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py index 2ccf752b7..5a0c96648 100644 --- a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -5,11 +5,11 @@ from attrs import define, field -from griptape.events import StartAudioTranscriptionEvent, FinishAudioTranscriptionEvent +from griptape.events import FinishAudioTranscriptionEvent, StartAudioTranscriptionEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: - from griptape.artifacts import TextArtifact, AudioArtifact + from griptape.artifacts import AudioArtifact, TextArtifact from griptape.structures import Structure diff --git a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py index 1602604e4..ba3da3231 100644 --- a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py @@ -1,6 +1,7 @@ from typing import Optional from attrs import define, field + from griptape.artifacts import AudioArtifact, TextArtifact from griptape.drivers import BaseAudioTranscriptionDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py index 14b367521..c2098bb67 100644 --- a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py @@ -4,7 +4,7 @@ from typing import Optional import openai -from attrs import field, Factory, define +from attrs import Factory, define, field from griptape.artifacts import AudioArtifact, TextArtifact from griptape.drivers import BaseAudioTranscriptionDriver diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index fe113c300..41fbf2a92 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -1,15 +1,19 @@ from __future__ import annotations + import json -from typing import Any, TYPE_CHECKING -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Any + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from griptape.tokenizers.base_tokenizer import BaseTokenizer import boto3 + from griptape.tokenizers.base_tokenizer import BaseTokenizer + @define class AmazonBedrockCohereEmbeddingDriver(BaseEmbeddingDriver): diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index 1de4d6cfe..2eb83b033 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -1,15 +1,19 @@ from __future__ import annotations + import json -from typing import Any, TYPE_CHECKING -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Any + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers.amazon_bedrock_tokenizer import AmazonBedrockTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from griptape.tokenizers.base_tokenizer import BaseTokenizer import boto3 + from griptape.tokenizers.base_tokenizer import BaseTokenizer + @define class AmazonBedrockTitanEmbeddingDriver(BaseEmbeddingDriver): diff --git a/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py index 2b764c2f4..413ad2fe2 100644 --- a/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING + import json -from typing import Any, Optional +from typing import TYPE_CHECKING, Any, Optional from attrs import Factory, define, field diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index bf78ef1ae..420458e29 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -1,10 +1,12 @@ from __future__ import annotations from typing import Callable, Optional -from attrs import define, field, Factory + +import openai +from attrs import Factory, define, field + from griptape.drivers import OpenAiEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer -import openai @define diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index dc9e2c9ae..8998f00e5 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -1,11 +1,13 @@ from __future__ import annotations -import numpy as np -from typing import Optional, TYPE_CHECKING + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional + +import numpy as np from attrs import define, field -from griptape.mixins import ExponentialBackoffMixin + from griptape.chunkers import BaseChunker, TextChunker -from griptape.mixins import SerializableMixin +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: from griptape.artifacts import TextArtifact diff --git a/griptape/drivers/embedding/cohere_embedding_driver.py b/griptape/drivers/embedding/cohere_embedding_driver.py index 13f72aa16..365dc972e 100644 --- a/griptape/drivers/embedding/cohere_embedding_driver.py +++ b/griptape/drivers/embedding/cohere_embedding_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import CohereTokenizer from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/dummy_embedding_driver.py b/griptape/drivers/embedding/dummy_embedding_driver.py index 3aa4f739e..dadd02897 100644 --- a/griptape/drivers/embedding/dummy_embedding_driver.py +++ b/griptape/drivers/embedding/dummy_embedding_driver.py @@ -1,4 +1,5 @@ from attrs import define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/embedding/google_embedding_driver.py b/griptape/drivers/embedding/google_embedding_driver.py index b8745345c..f57c75611 100644 --- a/griptape/drivers/embedding/google_embedding_driver.py +++ b/griptape/drivers/embedding/google_embedding_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import Optional + from attrs import define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py index 8b47e56e9..9a8fd5292 100644 --- a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py +++ b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations + from typing import TYPE_CHECKING -from griptape.utils import import_optional_dependency -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from huggingface_hub import InferenceClient diff --git a/griptape/drivers/embedding/ollama_embedding_driver.py b/griptape/drivers/embedding/ollama_embedding_driver.py index f3f68a049..c5c30d5af 100644 --- a/griptape/drivers/embedding/ollama_embedding_driver.py +++ b/griptape/drivers/embedding/ollama_embedding_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from attrs import define, field, Factory -from griptape.utils import import_optional_dependency + +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from ollama import Client diff --git a/griptape/drivers/embedding/openai_embedding_driver.py b/griptape/drivers/embedding/openai_embedding_driver.py index 46b9e77b5..73c737d6b 100644 --- a/griptape/drivers/embedding/openai_embedding_driver.py +++ b/griptape/drivers/embedding/openai_embedding_driver.py @@ -1,9 +1,12 @@ from __future__ import annotations + from typing import Optional -from attrs import define, field, Factory + +import openai +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer -import openai @define diff --git a/griptape/drivers/embedding/voyageai_embedding_driver.py b/griptape/drivers/embedding/voyageai_embedding_driver.py index 76bcf71b8..b29dd5692 100644 --- a/griptape/drivers/embedding/voyageai_embedding_driver.py +++ b/griptape/drivers/embedding/voyageai_embedding_driver.py @@ -1,9 +1,12 @@ from __future__ import annotations -from typing import Optional, Any -from attrs import define, field, Factory -from griptape.utils import import_optional_dependency + +from typing import Any, Optional + +from attrs import Factory, define, field + from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import VoyageAiTokenizer +from griptape.utils import import_optional_dependency @define diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index cc0f9d36c..710e6382f 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -1,8 +1,10 @@ from __future__ import annotations + from abc import ABC, abstractmethod from concurrent import futures from logging import Logger -from typing import Callable, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable + from attrs import Factory, define, field if TYPE_CHECKING: diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index c481d3081..0ecf17d9b 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -1,10 +1,10 @@ from __future__ import annotations import os -import requests - from urllib.parse import urljoin -from attrs import define, field, Factory + +import requests +from attrs import Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver diff --git a/griptape/drivers/event_listener/pusher_event_listener_driver.py b/griptape/drivers/event_listener/pusher_event_listener_driver.py index d41b679d7..2e9de8d72 100644 --- a/griptape/drivers/event_listener/pusher_event_listener_driver.py +++ b/griptape/drivers/event_listener/pusher_event_listener_driver.py @@ -1,7 +1,9 @@ from __future__ import annotations from typing import TYPE_CHECKING -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseEventListenerDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/event_listener/webhook_event_listener_driver.py b/griptape/drivers/event_listener/webhook_event_listener_driver.py index a0eb5ab5f..54fd532b6 100644 --- a/griptape/drivers/event_listener/webhook_event_listener_driver.py +++ b/griptape/drivers/event_listener/webhook_event_listener_driver.py @@ -1,7 +1,6 @@ from __future__ import annotations import requests - from attrs import define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index 840ae60d7..d9eae9696 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -1,9 +1,13 @@ from __future__ import annotations + import os from pathlib import Path from typing import TYPE_CHECKING, Any -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.utils.import_utils import import_optional_dependency + from .base_file_manager_driver import BaseFileManagerDriver if TYPE_CHECKING: diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 546642554..b69aa374d 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations + from abc import ABC, abstractmethod + from attrs import Factory, define, field -from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, InfoArtifact, ListArtifact + import griptape.loaders as loaders +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact @define diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index befe2fdd2..3dea4612b 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -1,7 +1,10 @@ from __future__ import annotations + import os from pathlib import Path -from attrs import define, field, Factory + +from attrs import Factory, define, field + from .base_file_manager_driver import BaseFileManagerDriver diff --git a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py index b5a4b7e3b..a8f4c2d2e 100644 --- a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py +++ b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Any, Optional -from attrs import define, field, Factory +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact from griptape.drivers import BaseMultiModelImageGenerationDriver diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index b631703d8..d7ec7681a 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -1,9 +1,10 @@ from __future__ import annotations -import openai -from attrs import field, Factory, define from typing import Callable, Optional +import openai +from attrs import Factory, define, field + from griptape.drivers import OpenAiImageGenerationDriver diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index 704595aec..ee132605c 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -5,7 +5,7 @@ from attrs import define, field -from griptape.events import StartImageGenerationEvent, FinishImageGenerationEvent +from griptape.events import FinishImageGenerationEvent, StartImageGenerationEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: diff --git a/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py b/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py index 12c2fbef5..b1966d36b 100644 --- a/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py @@ -1,7 +1,8 @@ from __future__ import annotations + from abc import ABC -from attrs import field, define +from attrs import define, field from griptape.drivers import BaseImageGenerationDriver, BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_generation/dummy_image_generation_driver.py b/griptape/drivers/image_generation/dummy_image_generation_driver.py index 0f6b622f7..ac1961821 100644 --- a/griptape/drivers/image_generation/dummy_image_generation_driver.py +++ b/griptape/drivers/image_generation/dummy_image_generation_driver.py @@ -1,5 +1,7 @@ from typing import Optional + from attrs import define, field + from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/image_generation/leonardo_image_generation_driver.py b/griptape/drivers/image_generation/leonardo_image_generation_driver.py index d274970ee..44d583683 100644 --- a/griptape/drivers/image_generation/leonardo_image_generation_driver.py +++ b/griptape/drivers/image_generation/leonardo_image_generation_driver.py @@ -1,9 +1,9 @@ import json import time -from typing import Optional, Literal +from typing import Literal, Optional import requests -from attrs import field, define, Factory +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index 72ce20a92..d3e8ce727 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -1,10 +1,10 @@ from __future__ import annotations import base64 -from typing import Literal, Optional, cast, Union, TYPE_CHECKING +from typing import TYPE_CHECKING, Literal, Optional, Union, cast import openai -from attrs import field, Factory, define +from attrs import Factory, define, field from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver diff --git a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py index c5cc6ff2d..9acc62890 100644 --- a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import Any, Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Optional from attrs import define diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index c0206dea0..78bcecc87 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -2,9 +2,9 @@ import base64 import logging -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional -from attrs import field, define +from attrs import define, field from griptape.drivers import BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py index bfa998c1d..77a866c45 100644 --- a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py @@ -1,9 +1,9 @@ from __future__ import annotations import base64 -from typing import Any, Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Optional -from attrs import field, define +from attrs import define, field from griptape.drivers import BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py index 1377bfce9..cc1d13f4e 100644 --- a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py +++ b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py @@ -1,14 +1,18 @@ from __future__ import annotations + +import json from typing import TYPE_CHECKING, Any -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseMultiModelImageQueryDriver from griptape.utils import import_optional_dependency -import json if TYPE_CHECKING: - from griptape.artifacts import ImageArtifact, TextArtifact import boto3 + from griptape.artifacts import ImageArtifact, TextArtifact + @define class AmazonBedrockImageQueryDriver(BaseMultiModelImageQueryDriver): diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index 9bc9ec4ae..fe39177ab 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations -from typing import Optional, Any -from attrs import define, field, Factory + +from typing import Any, Optional + +from attrs import Factory, define, field + from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/image_query/azure_openai_image_query_driver.py b/griptape/drivers/image_query/azure_openai_image_query_driver.py index f59c64823..ad37737c7 100644 --- a/griptape/drivers/image_query/azure_openai_image_query_driver.py +++ b/griptape/drivers/image_query/azure_openai_image_query_driver.py @@ -2,8 +2,9 @@ from typing import Callable, Optional -from attrs import define, field, Factory import openai +from attrs import Factory, define, field + from griptape.drivers.image_query.openai_image_query_driver import OpenAiImageQueryDriver diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 44aa13ce2..3f606e749 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -1,15 +1,15 @@ from __future__ import annotations -from abc import abstractmethod, ABC -from typing import Optional, TYPE_CHECKING +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.events import StartImageQueryEvent, FinishImageQueryEvent +from griptape.events import FinishImageQueryEvent, StartImageQueryEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: - from griptape.artifacts import TextArtifact, ImageArtifact + from griptape.artifacts import ImageArtifact, TextArtifact from griptape.structures import Structure diff --git a/griptape/drivers/image_query/base_multi_model_image_query_driver.py b/griptape/drivers/image_query/base_multi_model_image_query_driver.py index d801fd917..52af617e8 100644 --- a/griptape/drivers/image_query/base_multi_model_image_query_driver.py +++ b/griptape/drivers/image_query/base_multi_model_image_query_driver.py @@ -1,7 +1,8 @@ from __future__ import annotations + from abc import ABC -from attrs import field, define +from attrs import define, field from griptape.drivers import BaseImageQueryDriver, BaseImageQueryModelDriver diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index ddc6e2318..43d481c68 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -1,6 +1,6 @@ from attrs import define, field -from griptape.artifacts import TextArtifact, ImageArtifact +from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/image_query/openai_image_query_driver.py b/griptape/drivers/image_query/openai_image_query_driver.py index 8b0020c2c..693f67184 100644 --- a/griptape/drivers/image_query/openai_image_query_driver.py +++ b/griptape/drivers/image_query/openai_image_query_driver.py @@ -2,14 +2,14 @@ from typing import Literal, Optional -from attrs import define, field, Factory +import openai +from attrs import Factory, define, field from openai.types.chat import ( - ChatCompletionUserMessageParam, + ChatCompletionContentPartImageParam, ChatCompletionContentPartParam, ChatCompletionContentPartTextParam, - ChatCompletionContentPartImageParam, + ChatCompletionUserMessageParam, ) -import openai from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers.image_query.base_image_query_driver import BaseImageQueryDriver diff --git a/griptape/drivers/image_query_model/base_image_query_model_driver.py b/griptape/drivers/image_query_model/base_image_query_model_driver.py index 39d858288..5f60367d5 100644 --- a/griptape/drivers/image_query_model/base_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/base_image_query_model_driver.py @@ -1,11 +1,14 @@ from __future__ import annotations + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING + from attrs import define + from griptape.mixins import SerializableMixin -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.artifacts import TextArtifact, ImageArtifact + from griptape.artifacts import ImageArtifact, TextArtifact @define diff --git a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py index 3d3ca0164..ccb902a81 100644 --- a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryModelDriver diff --git a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py index 36f62c0e5..e52174c28 100644 --- a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py @@ -1,9 +1,12 @@ from __future__ import annotations -from attrs import define, field, Factory -from typing import Optional, TYPE_CHECKING, Any -from griptape.utils import import_optional_dependency + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field + from griptape.drivers import BaseConversationMemoryDriver from griptape.memory.structure import BaseConversationMemory +from griptape.utils import import_optional_dependency if TYPE_CHECKING: import boto3 diff --git a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py index 28299a7e4..1caeb902f 100644 --- a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py @@ -1,6 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional + from griptape.mixins import SerializableMixin if TYPE_CHECKING: diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index 9e3f4ffc9..b94bd3065 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -1,6 +1,8 @@ import os -from attrs import define, field from typing import Optional + +from attrs import define, field + from griptape.drivers import BaseConversationMemoryDriver from griptape.memory.structure import BaseConversationMemory diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py index 3de8737b8..531b009af 100644 --- a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -1,7 +1,10 @@ from __future__ import annotations + import uuid -from attrs import define, field, Factory -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + from griptape.drivers import BaseConversationMemoryDriver from griptape.memory.structure import BaseConversationMemory from griptape.utils.import_utils import import_optional_dependency diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 0b56af445..824e3abcc 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -33,6 +33,7 @@ if TYPE_CHECKING: from collections.abc import Iterator + import boto3 from griptape.common import PromptStack diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 08ec3a3fa..9eafed64a 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -6,13 +6,14 @@ from attrs import Factory, define, field from griptape.artifacts import TextArtifact -from griptape.common import PromptStack, Message, TextMessageContent, DeltaMessage +from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: from collections.abc import Iterator + import boto3 from griptape.common import PromptStack diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index d42fee46f..9eed9c275 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -15,18 +15,18 @@ TextArtifact, ) from griptape.common import ( + ActionCallDeltaMessageContent, ActionCallMessageContent, ActionResultMessageContent, BaseDeltaMessageContent, BaseMessageContent, - ActionCallDeltaMessageContent, DeltaMessage, - TextDeltaMessageContent, ImageMessageContent, - PromptStack, Message, - ToolAction, + PromptStack, + TextDeltaMessageContent, TextMessageContent, + ToolAction, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AnthropicTokenizer, BaseTokenizer @@ -34,6 +34,7 @@ if TYPE_CHECKING: from collections.abc import Iterator + from anthropic import Client from anthropic.types import ContentBlock, ContentBlockDeltaEvent, ContentBlockStartEvent diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 0b33aa103..0f8c76ea9 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -1,8 +1,10 @@ -from attrs import define, field, Factory from typing import Callable, Optional + +import openai +from attrs import Factory, define, field + from griptape.common import PromptStack from griptape.drivers import OpenAiChatPromptDriver -import openai @define diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 7a5c0cfc1..3f957c34e 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -6,22 +6,23 @@ from attrs import Factory, define, field from griptape.common import ( + ActionCallDeltaMessageContent, ActionCallMessageContent, BaseDeltaMessageContent, - ActionCallDeltaMessageContent, DeltaMessage, - TextDeltaMessageContent, - PromptStack, Message, + PromptStack, + TextDeltaMessageContent, TextMessageContent, ) from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin if TYPE_CHECKING: - from griptape.tokenizers import BaseTokenizer from collections.abc import Iterator + from griptape.structures import Structure + from griptape.tokenizers import BaseTokenizer @define(kw_only=True) diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 3943e2211..d44016d19 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,31 +1,34 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Any -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact + +from attrs import Factory, define, field + +from griptape.artifacts import ActionArtifact, TextArtifact from griptape.artifacts.list_artifact import ListArtifact -from griptape.common.prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent -from griptape.drivers import BasePromptDriver -from griptape.tokenizers import CohereTokenizer -from griptape.artifacts import ActionArtifact from griptape.common import ( ActionCallMessageContent, + ActionResultMessageContent, BaseDeltaMessageContent, BaseMessageContent, DeltaMessage, - TextDeltaMessageContent, - PromptStack, Message, + PromptStack, + TextDeltaMessageContent, TextMessageContent, - ActionResultMessageContent, ToolAction, ) +from griptape.common.prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent +from griptape.drivers import BasePromptDriver +from griptape.tokenizers import BaseTokenizer, CohereTokenizer from griptape.utils import import_optional_dependency -from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: from collections.abc import Iterator + from cohere import Client from cohere.types import NonStreamedChatResponse + from griptape.tools import BaseTool diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index 301474954..c26d53794 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -1,16 +1,18 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import Factory, define, field from griptape.drivers import BasePromptDriver from griptape.exceptions import DummyException from griptape.tokenizers import DummyTokenizer -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.common import PromptStack, Message, DeltaMessage from collections.abc import Iterator + from griptape.common import DeltaMessage, Message, PromptStack + @define class DummyPromptDriver(BasePromptDriver): diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 02b9f0f87..ed85f6229 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -4,34 +4,34 @@ from typing import TYPE_CHECKING, Optional from attrs import Factory, define, field +from schema import Schema - +from griptape.artifacts import ActionArtifact, TextArtifact from griptape.common import ( + ActionCallDeltaMessageContent, + ActionCallMessageContent, + ActionResultMessageContent, + BaseDeltaMessageContent, BaseMessageContent, DeltaMessage, - TextDeltaMessageContent, ImageMessageContent, - PromptStack, Message, + PromptStack, + TextDeltaMessageContent, TextMessageContent, - ActionCallMessageContent, - ActionResultMessageContent, - ActionCallDeltaMessageContent, - BaseDeltaMessageContent, ToolAction, ) -from griptape.artifacts import TextArtifact, ActionArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, GoogleTokenizer from griptape.utils import import_optional_dependency, remove_key_in_dict_recursively -from schema import Schema if TYPE_CHECKING: - from google.generativeai.types import ContentsType from collections.abc import Iterator + from google.generativeai import GenerativeModel - from google.generativeai.types import ContentDict, GenerateContentResponse from google.generativeai.protos import Part + from google.generativeai.types import ContentDict, ContentsType, GenerateContentResponse + from griptape.tools import BaseTool diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 1c5647856..7d1debbf7 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -4,13 +4,14 @@ from attrs import Factory, define, field +from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer -from griptape.common import PromptStack, Message, DeltaMessage, TextDeltaMessageContent from griptape.utils import import_optional_dependency if TYPE_CHECKING: from collections.abc import Iterator + from huggingface_hub import InferenceClient diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 9273deb0c..caff742c3 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -5,13 +5,14 @@ from attrs import Factory, define, field from griptape.artifacts import TextArtifact -from griptape.common import DeltaMessage, PromptStack, Message, TextMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency if TYPE_CHECKING: from collections.abc import Iterator + from transformers import TextGenerationPipeline diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index 0818bd5e8..040099070 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -1,19 +1,28 @@ from __future__ import annotations + from collections.abc import Iterator from typing import TYPE_CHECKING, Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact +from griptape.common import ( + DeltaMessage, + ImageMessageContent, + Message, + PromptStack, + TextDeltaMessageContent, + TextMessageContent, +) from griptape.drivers import BasePromptDriver -from griptape.common import PromptStack, TextMessageContent -from griptape.utils import import_optional_dependency from griptape.tokenizers import SimpleTokenizer -from griptape.common import Message, DeltaMessage, TextDeltaMessageContent -from griptape.common import ImageMessageContent +from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from griptape.tokenizers.base_tokenizer import BaseTokenizer from ollama import Client + from griptape.tokenizers.base_tokenizer import BaseTokenizer + @define class OllamaPromptDriver(BasePromptDriver): diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index b706cbeb6..f5b3796ed 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -7,18 +7,18 @@ from attrs import Factory, define, field from schema import Schema -from griptape.artifacts import TextArtifact, ActionArtifact +from griptape.artifacts import ActionArtifact, TextArtifact from griptape.common import ( + ActionCallDeltaMessageContent, ActionCallMessageContent, ActionResultMessageContent, BaseDeltaMessageContent, BaseMessageContent, - ActionCallDeltaMessageContent, DeltaMessage, - TextDeltaMessageContent, ImageMessageContent, - PromptStack, Message, + PromptStack, + TextDeltaMessageContent, TextMessageContent, ToolAction, ) @@ -27,6 +27,7 @@ if TYPE_CHECKING: from collections.abc import Iterator + from openai.types.chat.chat_completion_chunk import ChoiceDelta from openai.types.chat.chat_completion_message import ChatCompletionMessage diff --git a/griptape/drivers/rerank/base_rerank_driver.py b/griptape/drivers/rerank/base_rerank_driver.py index 975575d49..8193a108d 100644 --- a/griptape/drivers/rerank/base_rerank_driver.py +++ b/griptape/drivers/rerank/base_rerank_driver.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod + from attrs import define + from griptape.artifacts import TextArtifact diff --git a/griptape/drivers/rerank/cohere_rerank_driver.py b/griptape/drivers/rerank/cohere_rerank_driver.py index 6475ba766..36956452c 100644 --- a/griptape/drivers/rerank/cohere_rerank_driver.py +++ b/griptape/drivers/rerank/cohere_rerank_driver.py @@ -1,13 +1,17 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseRerankDriver from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from griptape.artifacts import TextArtifact from cohere import Client + from griptape.artifacts import TextArtifact + @define(kw_only=True) class CohereRerankDriver(BaseRerankDriver): diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index e6ec8b2b9..edb7d39cb 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -1,9 +1,12 @@ from __future__ import annotations + import time -from typing import Optional, TYPE_CHECKING, Any -from griptape.drivers import BaseSqlDriver +from typing import TYPE_CHECKING, Any, Optional + from attrs import Factory, define, field +from griptape.drivers import BaseSqlDriver + if TYPE_CHECKING: import boto3 diff --git a/griptape/drivers/sql/base_sql_driver.py b/griptape/drivers/sql/base_sql_driver.py index 564746389..db05615b9 100644 --- a/griptape/drivers/sql/base_sql_driver.py +++ b/griptape/drivers/sql/base_sql_driver.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Optional, Any +from typing import Any, Optional + from attrs import define diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index 4c85ab3a3..2b89ec720 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -1,12 +1,15 @@ from __future__ import annotations -from typing import Callable, Optional, TYPE_CHECKING, Any -from griptape.utils import import_optional_dependency -from griptape.drivers import BaseSqlDriver + +from typing import TYPE_CHECKING, Any, Callable, Optional + from attrs import Factory, define, field +from griptape.drivers import BaseSqlDriver +from griptape.utils import import_optional_dependency + if TYPE_CHECKING: - from sqlalchemy.engine import Engine from snowflake.connector import SnowflakeConnection + from sqlalchemy.engine import Engine @define diff --git a/griptape/drivers/sql/sql_driver.py b/griptape/drivers/sql/sql_driver.py index a789a90c3..d3da01e2e 100644 --- a/griptape/drivers/sql/sql_driver.py +++ b/griptape/drivers/sql/sql_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING, Any + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + from griptape.drivers import BaseSqlDriver from griptape.utils import import_optional_dependency -from attrs import define, field if TYPE_CHECKING: from sqlalchemy.engine import Engine diff --git a/griptape/drivers/structure_run/base_structure_run_driver.py b/griptape/drivers/structure_run/base_structure_run_driver.py index 4ff9b6eb2..5bf2c9a5f 100644 --- a/griptape/drivers/structure_run/base_structure_run_driver.py +++ b/griptape/drivers/structure_run/base_structure_run_driver.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod -from attrs import define, Factory, field +from attrs import Factory, define, field from griptape.artifacts import BaseArtifact diff --git a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py index 40e6ff874..f2cda50be 100644 --- a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py +++ b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py @@ -69,7 +69,7 @@ def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | Tex return InfoArtifact("No output found in response") def _get_structure_run_result_attempt(self, structure_run_url: str) -> Any: - from requests import get, Response + from requests import Response, get response: Response = get(structure_run_url, headers=self.headers) response.raise_for_status() diff --git a/griptape/drivers/structure_run/local_structure_run_driver.py b/griptape/drivers/structure_run/local_structure_run_driver.py index 4f140c1fe..c0049b29a 100644 --- a/griptape/drivers/structure_run/local_structure_run_driver.py +++ b/griptape/drivers/structure_run/local_structure_run_driver.py @@ -1,4 +1,6 @@ from __future__ import annotations + +import os from typing import TYPE_CHECKING, Callable from attrs import define, field @@ -6,8 +8,6 @@ from griptape.artifacts import BaseArtifact, InfoArtifact from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver -import os - if TYPE_CHECKING: from griptape.structures import Structure diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py index b34b06019..bfef900c5 100644 --- a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -1,4 +1,5 @@ from attrs import define, field + from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py index 02d55c023..96d0ded0c 100644 --- a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py @@ -2,7 +2,7 @@ from typing import Any -from attrs import define, field, Factory +from attrs import Factory, define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py index 2d6e7b155..8d8a81ad2 100644 --- a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py @@ -1,9 +1,9 @@ from __future__ import annotations -from typing import Optional, Literal +from typing import Literal, Optional import openai -from attrs import define, field, Factory +from attrs import Factory, define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index d53ac2c64..140e429f1 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations -from attrs import define, field, Factory -from typing import Optional, TYPE_CHECKING + +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + from griptape.drivers import OpenSearchVectorStoreDriver from griptape.utils import import_optional_dependency, str_to_hash diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index e29a7fa70..a1043040b 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import Optional + from attrs import define + from griptape.drivers import BaseVectorStoreDriver, MongoDbAtlasVectorStoreDriver diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 98c078fd6..9f9a13ea2 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -1,13 +1,15 @@ from __future__ import annotations + import uuid from abc import ABC, abstractmethod from concurrent import futures from dataclasses import dataclass -from typing import Any, Callable -from typing import Optional, TYPE_CHECKING -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Any, Callable, Optional + +from attrs import Factory, define, field + from griptape import utils -from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.mixins import SerializableMixin if TYPE_CHECKING: diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index 04dea2181..d1a6fdf0e 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -1,6 +1,8 @@ -from attrs import field, define, Factory from typing import Optional -from griptape.drivers import BaseVectorStoreDriver, BaseEmbeddingDriver, DummyEmbeddingDriver + +from attrs import Factory, define, field + +from griptape.drivers import BaseEmbeddingDriver, BaseVectorStoreDriver, DummyEmbeddingDriver from griptape.exceptions import DummyException diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index 1a86225c6..2ed76056e 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -2,10 +2,12 @@ import os import threading from dataclasses import asdict -from typing import Optional, Callable, TextIO -from attrs import define, field, Factory +from typing import Callable, Optional, TextIO + +from attrs import Factory, define, field from numpy import dot from numpy.linalg import norm + from griptape import utils from griptape.drivers import BaseVectorStoreDriver diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 2e4d0acf0..08c7b89bb 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -1,14 +1,18 @@ from __future__ import annotations -from typing import Optional, Any, TYPE_CHECKING + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field + from griptape import utils -from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver -from attrs import define, field, Factory +from griptape.utils import import_optional_dependency if TYPE_CHECKING: - from griptape.artifacts import TextArtifact import marqo + from griptape.artifacts import TextArtifact + @define class MarqoVectorStoreDriver(BaseVectorStoreDriver): diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index e60524714..e27f48b79 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 49e73af96..3819cf791 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -1,10 +1,13 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from griptape import utils + import logging -from griptape.utils import import_optional_dependency +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + +from griptape import utils from griptape.drivers import BaseVectorStoreDriver -from attrs import define, field, Factory +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from opensearchpy import OpenSearch diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index abe01098a..3b3e5646f 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -1,15 +1,17 @@ import uuid -from typing import Optional, Any, cast -from attrs import define, field, Factory +from collections import OrderedDict from dataclasses import dataclass -from griptape.drivers import BaseVectorStoreDriver -from griptape.utils import import_optional_dependency +from typing import Any, Optional, cast + +from attrs import Factory, define, field +from sqlalchemy import JSON, Column, String, create_engine +from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.engine import Engine -from sqlalchemy import create_engine, Column, String, JSON from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Session -from collections import OrderedDict + +from griptape.drivers import BaseVectorStoreDriver +from griptape.utils import import_optional_dependency @define diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 6da2f2418..634a707e7 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -1,9 +1,12 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING, Any -from griptape.utils import str_to_hash, import_optional_dependency -from griptape.drivers import BaseVectorStoreDriver + +from typing import TYPE_CHECKING, Any, Optional + from attrs import define, field +from griptape.drivers import BaseVectorStoreDriver +from griptape.utils import import_optional_dependency, str_to_hash + if TYPE_CHECKING: import pinecone diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index 0b96f03b9..34345b6df 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -1,10 +1,13 @@ from __future__ import annotations + +import logging +import uuid from typing import Optional + from attrs import define, field + from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency -import uuid -import logging DEFAULT_DISTANCE = "Cosine" CONTENT_PAYLOAD_KEY = "data" diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index e58e4b3ea..35a171cee 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -1,10 +1,13 @@ from __future__ import annotations + import json +from typing import TYPE_CHECKING, Optional + import numpy as np -from griptape.utils import import_optional_dependency, str_to_hash -from typing import Optional, TYPE_CHECKING -from attrs import define, field, Factory +from attrs import Factory, define, field + from griptape.drivers import BaseVectorStoreDriver +from griptape.utils import import_optional_dependency, str_to_hash if TYPE_CHECKING: from redis import Redis diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 28f225ba8..3945c786a 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -1,6 +1,8 @@ import re from typing import Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact from griptape.drivers import BaseWebScraperDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/web_scraper/proxy_web_scraper_driver.py b/griptape/drivers/web_scraper/proxy_web_scraper_driver.py index 4a9213365..2d785fde2 100644 --- a/griptape/drivers/web_scraper/proxy_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/proxy_web_scraper_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations -from attrs import field, Factory, define import requests +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.drivers import BaseWebScraperDriver diff --git a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py index cc0ca3a18..f0adfae22 100644 --- a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py @@ -1,6 +1,8 @@ import json import logging + from attrs import define, field + from griptape.artifacts import TextArtifact from griptape.drivers import BaseWebScraperDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/web_search/base_web_search_driver.py b/griptape/drivers/web_search/base_web_search_driver.py index 2b5662155..b561085ef 100644 --- a/griptape/drivers/web_search/base_web_search_driver.py +++ b/griptape/drivers/web_search/base_web_search_driver.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod -from attrs import field, define + +from attrs import define, field from griptape.artifacts import ListArtifact diff --git a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py index ade6ed85c..7e5c8b287 100644 --- a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py +++ b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py @@ -1,8 +1,11 @@ from __future__ import annotations + import json from typing import TYPE_CHECKING -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact, ListArtifact + +from attrs import Factory, define, field + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import BaseWebSearchDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py index 631170532..16d024f77 100644 --- a/griptape/drivers/web_search/google_web_search_driver.py +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -1,8 +1,10 @@ +import json + +import requests from attrs import define, field -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import BaseWebSearchDriver -import requests -import json @define diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index d707c5099..af5d5a494 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -1,12 +1,12 @@ from __future__ import annotations -from attrs import define, field - from typing import TYPE_CHECKING +from attrs import define, field + if TYPE_CHECKING: - from griptape.drivers import BaseTextToSpeechDriver from griptape.artifacts.audio_artifact import AudioArtifact + from griptape.drivers import BaseTextToSpeechDriver @define diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index aae56569e..cad3680bd 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -1,13 +1,16 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING + from abc import ABC, abstractmethod -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Optional + +from attrs import Factory, define, field + from griptape.chunkers import BaseChunker, TextChunker if TYPE_CHECKING: - from griptape.artifacts import ListArtifact, ErrorArtifact - from griptape.rules import Ruleset + from griptape.artifacts import ErrorArtifact, ListArtifact from griptape.drivers import BasePromptDriver + from griptape.rules import Ruleset @define diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index c85d26de2..b3a578064 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -1,9 +1,12 @@ from __future__ import annotations -from typing import Optional, cast, TYPE_CHECKING + import csv import io -from attrs import field, Factory, define -from griptape.artifacts import TextArtifact, CsvRowArtifact, ListArtifact, ErrorArtifact +from typing import TYPE_CHECKING, Optional, cast + +from attrs import Factory, define, field + +from griptape.artifacts import CsvRowArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message from griptape.engines import BaseExtractionEngine diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index 13f6f58bb..2662f28c3 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -1,12 +1,15 @@ from __future__ import annotations -from typing import Optional, cast, TYPE_CHECKING + import json -from attrs import field, Factory, define -from griptape.artifacts import TextArtifact, ListArtifact, ErrorArtifact +from typing import TYPE_CHECKING, Optional, cast + +from attrs import Factory, define, field + +from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact +from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message from griptape.engines import BaseExtractionEngine from griptape.utils import J2 -from griptape.common import PromptStack if TYPE_CHECKING: from griptape.rules import Ruleset diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 5fcf45544..47a853871 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -1,13 +1,13 @@ from __future__ import annotations -from abc import ABC, abstractmethod -from attrs import field, define -from typing import Optional, TYPE_CHECKING +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional +from attrs import define, field if TYPE_CHECKING: - from griptape.drivers import BaseImageGenerationDriver from griptape.artifacts import ImageArtifact + from griptape.drivers import BaseImageGenerationDriver from griptape.rules import Ruleset diff --git a/griptape/engines/image/inpainting_image_generation_engine.py b/griptape/engines/image/inpainting_image_generation_engine.py index 527cb4eb6..63f91af2e 100644 --- a/griptape/engines/image/inpainting_image_generation_engine.py +++ b/griptape/engines/image/inpainting_image_generation_engine.py @@ -1,13 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING, Optional + from attrs import define -from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine if TYPE_CHECKING: - from griptape.rules import Ruleset from griptape.artifacts import ImageArtifact + from griptape.rules import Ruleset @define diff --git a/griptape/engines/image/outpainting_image_generation_engine.py b/griptape/engines/image/outpainting_image_generation_engine.py index 46feed614..4ede5044a 100644 --- a/griptape/engines/image/outpainting_image_generation_engine.py +++ b/griptape/engines/image/outpainting_image_generation_engine.py @@ -1,7 +1,8 @@ from __future__ import annotations +from typing import TYPE_CHECKING, Optional + from attrs import define -from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine diff --git a/griptape/engines/image/prompt_image_generation_engine.py b/griptape/engines/image/prompt_image_generation_engine.py index d58ab74b9..742ba4b97 100644 --- a/griptape/engines/image/prompt_image_generation_engine.py +++ b/griptape/engines/image/prompt_image_generation_engine.py @@ -1,13 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING, Optional + from attrs import define -from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine if TYPE_CHECKING: - from griptape.rules import Ruleset from griptape.artifacts import ImageArtifact + from griptape.rules import Ruleset @define diff --git a/griptape/engines/image/variation_image_generation_engine.py b/griptape/engines/image/variation_image_generation_engine.py index 89dfadda1..fa182a40b 100644 --- a/griptape/engines/image/variation_image_generation_engine.py +++ b/griptape/engines/image/variation_image_generation_engine.py @@ -1,13 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING, Optional + from attrs import define -from typing import Optional, TYPE_CHECKING from griptape.engines import BaseImageGenerationEngine if TYPE_CHECKING: - from griptape.rules import Ruleset from griptape.artifacts import ImageArtifact + from griptape.rules import Ruleset @define diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 9bdcb6372..527fa8ad6 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -1,9 +1,11 @@ from abc import ABC from concurrent import futures -from typing import Callable, Any, Optional -from attrs import define, field, Factory +from typing import Any, Callable, Optional + +from attrs import Factory, define, field + +from griptape.common import Message, PromptStack from griptape.engines.rag import RagContext -from griptape.common import PromptStack, Message @define(kw_only=True) diff --git a/griptape/engines/rag/modules/query/base_query_rag_module.py b/griptape/engines/rag/modules/query/base_query_rag_module.py index 195bba6bd..11333c784 100644 --- a/griptape/engines/rag/modules/query/base_query_rag_module.py +++ b/griptape/engines/rag/modules/query/base_query_rag_module.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod + from attrs import define + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/modules/response/base_after_response_rag_module.py b/griptape/engines/rag/modules/response/base_after_response_rag_module.py index 03d906204..3e05c967d 100644 --- a/griptape/engines/rag/modules/response/base_after_response_rag_module.py +++ b/griptape/engines/rag/modules/response/base_after_response_rag_module.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod + from attrs import define + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/modules/response/base_before_response_rag_module.py b/griptape/engines/rag/modules/response/base_before_response_rag_module.py index 2a16b68d0..f1b6ca76d 100644 --- a/griptape/engines/rag/modules/response/base_before_response_rag_module.py +++ b/griptape/engines/rag/modules/response/base_before_response_rag_module.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod + from attrs import define + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/modules/response/base_response_rag_module.py b/griptape/engines/rag/modules/response/base_response_rag_module.py index 72a7dce1b..30ab82201 100644 --- a/griptape/engines/rag/modules/response/base_response_rag_module.py +++ b/griptape/engines/rag/modules/response/base_response_rag_module.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod + from attrs import define + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py index 7bd1cf0a9..7e88a3a8a 100644 --- a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py +++ b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py @@ -1,5 +1,7 @@ from typing import Optional + from attrs import define, field + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseBeforeResponseRagModule from griptape.utils import J2 diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 8552ab904..915b430d8 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -1,5 +1,7 @@ from typing import Callable -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.artifacts.text_artifact import TextArtifact from griptape.drivers import BasePromptDriver from griptape.engines.rag import RagContext diff --git a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py index 27a421c1b..eb22807a6 100644 --- a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py +++ b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py @@ -1,4 +1,5 @@ from attrs import define, field + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseBeforeResponseRagModule from griptape.rules import Ruleset diff --git a/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py index 699aa1124..fd57b3905 100644 --- a/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py +++ b/griptape/engines/rag/modules/response/text_chunks_response_rag_module.py @@ -1,4 +1,5 @@ from attrs import define + from griptape.artifacts import ListArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseResponseRagModule diff --git a/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py b/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py index 8ecf9f046..84a7565d4 100644 --- a/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/base_rerank_rag_module.py @@ -1,7 +1,8 @@ from abc import ABC, abstractmethod -from typing import Sequence +from collections.abc import Sequence from attrs import define, field + from griptape.artifacts import BaseArtifact from griptape.drivers import BaseRerankDriver from griptape.engines.rag import RagContext diff --git a/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py index f11537d9f..fbeb216f2 100644 --- a/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/base_retrieval_rag_module.py @@ -1,6 +1,8 @@ from abc import ABC, abstractmethod -from typing import Sequence +from collections.abc import Sequence + from attrs import define + from griptape.artifacts import BaseArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py b/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py index b78c3a880..c0256847e 100644 --- a/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_chunks_rerank_rag_module.py @@ -1,6 +1,7 @@ -from typing import Sequence +from collections.abc import Sequence from attrs import define + from griptape.artifacts import BaseArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRerankRagModule diff --git a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py index 248f69af2..7ae5df226 100644 --- a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py @@ -1,15 +1,19 @@ from __future__ import annotations + import uuid from typing import TYPE_CHECKING, Any, Callable -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape import utils -from griptape.artifacts import TextArtifact, ErrorArtifact +from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: from collections.abc import Sequence - from griptape.engines.rag import RagContext + from griptape.drivers import BaseVectorStoreDriver + from griptape.engines.rag import RagContext from griptape.loaders import BaseTextLoader diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index 00d709346..cbe5e6852 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -1,14 +1,18 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Any, Callable -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape import utils from griptape.engines.rag.modules import BaseRetrievalRagModule if TYPE_CHECKING: from collections.abc import Sequence - from griptape.engines.rag import RagContext + from griptape.artifacts import TextArtifact from griptape.drivers import BaseVectorStoreDriver + from griptape.engines.rag import RagContext @define(kw_only=True) diff --git a/griptape/engines/rag/rag_context.py b/griptape/engines/rag/rag_context.py index be4807599..1b0496d72 100644 --- a/griptape/engines/rag/rag_context.py +++ b/griptape/engines/rag/rag_context.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING + +from typing import TYPE_CHECKING, Optional + from attrs import define, field from griptape import utils from griptape.mixins import SerializableMixin if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact, TextArtifact from griptape.common import Reference - from griptape.artifacts import TextArtifact, BaseArtifact @define(kw_only=True) diff --git a/griptape/engines/rag/rag_engine.py b/griptape/engines/rag/rag_engine.py index da8a2eebe..9fdb13384 100644 --- a/griptape/engines/rag/rag_engine.py +++ b/griptape/engines/rag/rag_engine.py @@ -1,5 +1,7 @@ from typing import Optional + from attrs import define, field + from griptape.engines.rag import RagContext from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index 4db996e30..8c94405e0 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -1,7 +1,9 @@ from abc import ABC, abstractmethod from concurrent import futures from typing import Callable -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseRagModule diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 84c200bc8..35f5df371 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -1,5 +1,7 @@ import logging + from attrs import define, field + from griptape import utils from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseQueryRagModule, BaseRagModule diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py index aa0a15dfc..d6467bbb5 100644 --- a/griptape/engines/rag/stages/response_rag_stage.py +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -1,11 +1,13 @@ import logging + from attrs import define, field + from griptape.engines.rag import RagContext from griptape.engines.rag.modules import ( - BaseResponseRagModule, - BaseBeforeResponseRagModule, BaseAfterResponseRagModule, + BaseBeforeResponseRagModule, BaseRagModule, + BaseResponseRagModule, ) from griptape.engines.rag.stages import BaseRagStage diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index 8fe376cd1..f65d92f57 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -1,12 +1,13 @@ import itertools import logging from typing import Optional + from attrs import define, field + from griptape import utils from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseRerankRagModule, BaseRagModule -from griptape.engines.rag.modules import BaseRetrievalRagModule +from griptape.engines.rag.modules import BaseRagModule, BaseRerankRagModule, BaseRetrievalRagModule from griptape.engines.rag.stages import BaseRagStage diff --git a/griptape/engines/summary/base_summary_engine.py b/griptape/engines/summary/base_summary_engine.py index 26a5cd46d..108666bb7 100644 --- a/griptape/engines/summary/base_summary_engine.py +++ b/griptape/engines/summary/base_summary_engine.py @@ -1,7 +1,9 @@ from abc import ABC, abstractmethod from typing import Optional + from attrs import define -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.rules import Ruleset diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 51259e444..01823ed08 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -1,13 +1,15 @@ from typing import Optional, cast -from attrs import define, Factory, field -from griptape.artifacts import TextArtifact, ListArtifact + +from attrs import Factory, define, field + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.chunkers import BaseChunker, TextChunker from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message from griptape.drivers import BasePromptDriver from griptape.engines import BaseSummaryEngine -from griptape.utils import J2 from griptape.rules import Ruleset +from griptape.utils import J2 @define diff --git a/griptape/events/base_actions_subtask_event.py b/griptape/events/base_actions_subtask_event.py index cfd900000..d8dd0fd4a 100644 --- a/griptape/events/base_actions_subtask_event.py +++ b/griptape/events/base_actions_subtask_event.py @@ -1,7 +1,10 @@ from __future__ import annotations + from abc import ABC -from attrs import define, field from typing import TYPE_CHECKING, Optional + +from attrs import define, field + from .base_task_event import BaseTaskEvent if TYPE_CHECKING: diff --git a/griptape/events/base_image_generation_event.py b/griptape/events/base_image_generation_event.py index 5cc516b8e..c951cf64a 100644 --- a/griptape/events/base_image_generation_event.py +++ b/griptape/events/base_image_generation_event.py @@ -1,6 +1,9 @@ from __future__ import annotations -from attrs import define + from abc import ABC + +from attrs import define + from .base_media_generation_event import BaseMediaGenerationEvent diff --git a/griptape/events/base_media_generation_event.py b/griptape/events/base_media_generation_event.py index 0280c41aa..8d54169a4 100644 --- a/griptape/events/base_media_generation_event.py +++ b/griptape/events/base_media_generation_event.py @@ -1,6 +1,9 @@ from __future__ import annotations -from attrs import define + from abc import ABC + +from attrs import define + from .base_event import BaseEvent diff --git a/griptape/events/base_prompt_event.py b/griptape/events/base_prompt_event.py index 4a44599cc..19490de5f 100644 --- a/griptape/events/base_prompt_event.py +++ b/griptape/events/base_prompt_event.py @@ -1,6 +1,9 @@ from __future__ import annotations -from attrs import define, field + from abc import ABC + +from attrs import define, field + from .base_event import BaseEvent diff --git a/griptape/events/base_task_event.py b/griptape/events/base_task_event.py index c486d3f75..ab4fddb2a 100644 --- a/griptape/events/base_task_event.py +++ b/griptape/events/base_task_event.py @@ -1,7 +1,10 @@ from __future__ import annotations -from attrs import define, field + from abc import ABC -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional + +from attrs import define, field + from .base_event import BaseEvent if TYPE_CHECKING: diff --git a/griptape/events/base_text_to_speech_event.py b/griptape/events/base_text_to_speech_event.py index d73b3a663..6fa9d9ce0 100644 --- a/griptape/events/base_text_to_speech_event.py +++ b/griptape/events/base_text_to_speech_event.py @@ -1,7 +1,9 @@ from __future__ import annotations -from attrs import define + from abc import ABC +from attrs import define + from griptape.events.base_media_generation_event import BaseMediaGenerationEvent diff --git a/griptape/events/completion_chunk_event.py b/griptape/events/completion_chunk_event.py index a4244bd5d..48b479625 100644 --- a/griptape/events/completion_chunk_event.py +++ b/griptape/events/completion_chunk_event.py @@ -1,5 +1,5 @@ -from attrs import field -from attrs import define +from attrs import define, field + from griptape.events.base_event import BaseEvent diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index 1aad6ffc5..aee850e08 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -1,11 +1,14 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING, Callable -from attrs import define, field, Factory + +from typing import TYPE_CHECKING, Callable, Optional + +from attrs import Factory, define, field if TYPE_CHECKING: - from .base_event import BaseEvent from griptape.drivers import BaseEventListenerDriver + from .base_event import BaseEvent + @define class EventListener: diff --git a/griptape/events/finish_actions_subtask_event.py b/griptape/events/finish_actions_subtask_event.py index 068efca0b..772ac36ae 100644 --- a/griptape/events/finish_actions_subtask_event.py +++ b/griptape/events/finish_actions_subtask_event.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from .base_actions_subtask_event import BaseActionsSubtaskEvent diff --git a/griptape/events/finish_prompt_event.py b/griptape/events/finish_prompt_event.py index 79e338871..25f658a0f 100644 --- a/griptape/events/finish_prompt_event.py +++ b/griptape/events/finish_prompt_event.py @@ -1,5 +1,7 @@ -from attrs import define, field from typing import Optional + +from attrs import define, field + from griptape.events.base_prompt_event import BasePromptEvent diff --git a/griptape/events/finish_task_event.py b/griptape/events/finish_task_event.py index 65b2ca4f2..f83f98c04 100644 --- a/griptape/events/finish_task_event.py +++ b/griptape/events/finish_task_event.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from .base_task_event import BaseTaskEvent diff --git a/griptape/events/start_actions_subtask_event.py b/griptape/events/start_actions_subtask_event.py index eb3827daf..e688ef1c3 100644 --- a/griptape/events/start_actions_subtask_event.py +++ b/griptape/events/start_actions_subtask_event.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from .base_actions_subtask_event import BaseActionsSubtaskEvent diff --git a/griptape/events/start_image_generation_event.py b/griptape/events/start_image_generation_event.py index c673f34c4..d5b5a9805 100644 --- a/griptape/events/start_image_generation_event.py +++ b/griptape/events/start_image_generation_event.py @@ -1,6 +1,7 @@ from __future__ import annotations from typing import Optional + from attrs import define, field from .base_image_generation_event import BaseImageGenerationEvent diff --git a/griptape/events/start_prompt_event.py b/griptape/events/start_prompt_event.py index 35dae95d6..ca3958f89 100644 --- a/griptape/events/start_prompt_event.py +++ b/griptape/events/start_prompt_event.py @@ -1,7 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING -from attrs import define -from attrs import field + +from attrs import define, field + from griptape.events.base_prompt_event import BasePromptEvent if TYPE_CHECKING: diff --git a/griptape/events/start_task_event.py b/griptape/events/start_task_event.py index bd4661c2f..699d42a17 100644 --- a/griptape/events/start_task_event.py +++ b/griptape/events/start_task_event.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from .base_task_event import BaseTaskEvent diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index d2448d103..f9fa5d4bc 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -2,15 +2,16 @@ from abc import ABC, abstractmethod from concurrent import futures -from typing import Any, Optional, Callable, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Callable, Optional -from attrs import define, field, Factory +from attrs import Factory, define, field from griptape.utils.futures import execute_futures_dict from griptape.utils.hash import bytes_to_hash, str_to_hash if TYPE_CHECKING: from collections.abc import Mapping, Sequence + from griptape.artifacts import BaseArtifact diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index 58787c881..eac16ab91 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -1,10 +1,13 @@ from __future__ import annotations + from abc import ABC, abstractmethod -from typing import Any, Optional, Union, cast, TYPE_CHECKING -from attrs import define, field, Factory +from typing import TYPE_CHECKING, Any, Optional, Union, cast + +from attrs import Factory, define, field + from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact -from griptape.chunkers import TextChunker, BaseChunker +from griptape.chunkers import BaseChunker, TextChunker from griptape.loaders import BaseLoader from griptape.tokenizers import OpenAiTokenizer diff --git a/griptape/loaders/blob_loader.py b/griptape/loaders/blob_loader.py index 8b9ea4bf9..fffabb849 100644 --- a/griptape/loaders/blob_loader.py +++ b/griptape/loaders/blob_loader.py @@ -1,4 +1,5 @@ from __future__ import annotations + from typing import Any, Union, cast from attrs import define diff --git a/griptape/loaders/csv_loader.py b/griptape/loaders/csv_loader.py index 21ca1f5a6..435ecb873 100644 --- a/griptape/loaders/csv_loader.py +++ b/griptape/loaders/csv_loader.py @@ -1,7 +1,8 @@ from __future__ import annotations + import csv from io import StringIO -from typing import Optional, Union, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional, Union, cast from attrs import define, field diff --git a/griptape/loaders/dataframe_loader.py b/griptape/loaders/dataframe_loader.py index a547ab7cc..0b1ae1448 100644 --- a/griptape/loaders/dataframe_loader.py +++ b/griptape/loaders/dataframe_loader.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING, cast +from typing import TYPE_CHECKING, Optional, cast from attrs import define, field @@ -10,9 +10,10 @@ from griptape.utils.hash import str_to_hash if TYPE_CHECKING: - from griptape.drivers import BaseEmbeddingDriver from pandas import DataFrame + from griptape.drivers import BaseEmbeddingDriver + @define class DataFrameLoader(BaseLoader): diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index 3d0ad1358..e13558ab3 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -1,14 +1,14 @@ from __future__ import annotations -from typing import Optional, Union, cast -import logging import imaplib +import logging +from typing import Optional, Union, cast from attrs import astuple, define, field -from griptape.utils import import_optional_dependency from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact from griptape.loaders import BaseLoader +from griptape.utils import import_optional_dependency @define diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index ca0ba776a..90048abc1 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -5,9 +5,9 @@ from attrs import define, field -from griptape.utils import import_optional_dependency from griptape.artifacts import ImageArtifact from griptape.loaders import BaseLoader +from griptape.utils import import_optional_dependency @define diff --git a/griptape/loaders/pdf_loader.py b/griptape/loaders/pdf_loader.py index 8e4560cfc..d0622a9b4 100644 --- a/griptape/loaders/pdf_loader.py +++ b/griptape/loaders/pdf_loader.py @@ -1,14 +1,15 @@ from __future__ import annotations -from io import BytesIO -from attrs import define, field, Factory +from io import BytesIO from typing import Optional, Union, cast +from attrs import Factory, define, field + +from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.chunkers import PdfChunker from griptape.loaders import BaseTextLoader from griptape.utils import import_optional_dependency -from griptape.artifacts import TextArtifact -from griptape.chunkers import PdfChunker @define diff --git a/griptape/loaders/sql_loader.py b/griptape/loaders/sql_loader.py index e6979e324..2ac621a82 100644 --- a/griptape/loaders/sql_loader.py +++ b/griptape/loaders/sql_loader.py @@ -3,7 +3,7 @@ from attrs import define, field from griptape.artifacts import CsvRowArtifact -from griptape.drivers import BaseSqlDriver, BaseEmbeddingDriver +from griptape.drivers import BaseEmbeddingDriver, BaseSqlDriver from griptape.loaders import BaseLoader diff --git a/griptape/loaders/text_loader.py b/griptape/loaders/text_loader.py index 2dfa3bbe9..8eaa0b110 100644 --- a/griptape/loaders/text_loader.py +++ b/griptape/loaders/text_loader.py @@ -1,8 +1,8 @@ from __future__ import annotations -from typing import Optional, Union, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional, Union, cast -from attrs import field, define, Factory +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index bde2ec305..e7265bba2 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -1,9 +1,12 @@ from __future__ import annotations -from attrs import define, field, Factory + +from typing import TYPE_CHECKING + +from attrs import Factory, define, field + from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import BaseWebScraperDriver, TrafilaturaWebScraperDriver from griptape.loaders import BaseTextLoader -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.artifacts import TextArtifact diff --git a/griptape/memory/meta/action_subtask_meta_entry.py b/griptape/memory/meta/action_subtask_meta_entry.py index 6b5124971..10920ae20 100644 --- a/griptape/memory/meta/action_subtask_meta_entry.py +++ b/griptape/memory/meta/action_subtask_meta_entry.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import Optional -from attrs import field, define + +from attrs import define, field + from griptape.memory.meta import BaseMetaEntry diff --git a/griptape/memory/meta/base_meta_entry.py b/griptape/memory/meta/base_meta_entry.py index c79ec4731..c1b253317 100644 --- a/griptape/memory/meta/base_meta_entry.py +++ b/griptape/memory/meta/base_meta_entry.py @@ -1,7 +1,9 @@ from __future__ import annotations -from attrs import define + from abc import ABC +from attrs import define + from griptape.mixins import SerializableMixin diff --git a/griptape/memory/meta/meta_memory.py b/griptape/memory/meta/meta_memory.py index 214e6e285..2c580de28 100644 --- a/griptape/memory/meta/meta_memory.py +++ b/griptape/memory/meta/meta_memory.py @@ -1,4 +1,5 @@ from attrs import define, field + from griptape.memory.meta import BaseMetaEntry diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index e68939026..5d52eb4ad 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -1,13 +1,16 @@ from __future__ import annotations + +from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional + from attrs import define, field + from griptape.common import PromptStack from griptape.mixins import SerializableMixin -from abc import ABC, abstractmethod if TYPE_CHECKING: - from griptape.memory.structure import Run from griptape.drivers import BaseConversationMemoryDriver + from griptape.memory.structure import Run from griptape.structures import Structure diff --git a/griptape/memory/structure/conversation_memory.py b/griptape/memory/structure/conversation_memory.py index 42d160abd..34f96e414 100644 --- a/griptape/memory/structure/conversation_memory.py +++ b/griptape/memory/structure/conversation_memory.py @@ -1,8 +1,11 @@ from __future__ import annotations -from attrs import define + from typing import Optional -from griptape.memory.structure import Run, BaseConversationMemory + +from attrs import define + from griptape.common import PromptStack +from griptape.memory.structure import BaseConversationMemory, Run @define diff --git a/griptape/memory/structure/run.py b/griptape/memory/structure/run.py index b91df2ae9..3d8ca3869 100644 --- a/griptape/memory/structure/run.py +++ b/griptape/memory/structure/run.py @@ -1,5 +1,7 @@ import uuid -from attrs import define, field, Factory + +from attrs import Factory, define, field + from griptape.artifacts.base_artifact import BaseArtifact from griptape.mixins import SerializableMixin diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index b88a4b4e6..5854aa058 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -1,11 +1,14 @@ from __future__ import annotations + import logging from typing import TYPE_CHECKING, Optional -from attrs import define, field, Factory -from griptape.common.prompt_stack.messages.message import Message -from griptape.utils import J2 + +from attrs import Factory, define, field + from griptape.common import PromptStack +from griptape.common.prompt_stack.messages.message import Message from griptape.memory.structure import ConversationMemory +from griptape.utils import J2 if TYPE_CHECKING: from griptape.drivers import BasePromptDriver diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index e6ec68797..866df19da 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -1,10 +1,12 @@ from __future__ import annotations -from typing import Any, TYPE_CHECKING + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + from attrs import define if TYPE_CHECKING: - from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact + from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact @define diff --git a/griptape/memory/task/storage/blob_artifact_storage.py b/griptape/memory/task/storage/blob_artifact_storage.py index 9d09e17fa..25706c079 100644 --- a/griptape/memory/task/storage/blob_artifact_storage.py +++ b/griptape/memory/task/storage/blob_artifact_storage.py @@ -1,6 +1,8 @@ from typing import Any + from attrs import define, field -from griptape.artifacts import BaseArtifact, ListArtifact, BlobArtifact, InfoArtifact + +from griptape.artifacts import BaseArtifact, BlobArtifact, InfoArtifact, ListArtifact from griptape.memory.task.storage import BaseArtifactStorage diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 51994fa6c..f6bcf93d5 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,8 +1,11 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Any, Optional + from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact, InfoArtifact -from griptape.engines.rag import RagEngine, RagContext + +from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.engines.rag import RagContext, RagEngine from griptape.memory.task.storage import BaseArtifactStorage if TYPE_CHECKING: diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index df9c9be30..2c3075576 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -1,7 +1,10 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any, Callable -from attrs import define, field, Factory -from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, ErrorArtifact, TextArtifact + +from typing import TYPE_CHECKING, Any, Callable, Optional + +from attrs import Factory, define, field + +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.memory.meta import ActionSubtaskMetaEntry from griptape.mixins import ActivityMixin diff --git a/griptape/mixins/actions_subtask_origin_mixin.py b/griptape/mixins/actions_subtask_origin_mixin.py index 22f06a1c6..eba3637e5 100644 --- a/griptape/mixins/actions_subtask_origin_mixin.py +++ b/griptape/mixins/actions_subtask_origin_mixin.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import TYPE_CHECKING + from abc import abstractmethod +from typing import TYPE_CHECKING + from attrs import define -from schema import Schema, Literal +from schema import Literal, Schema if TYPE_CHECKING: from griptape.memory import TaskMemory - from griptape.tools import BaseTool from griptape.tasks import ActionsSubtask + from griptape.tools import BaseTool @define(slots=False) diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 9dc605543..31f398482 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -1,9 +1,10 @@ import inspect -from typing import Optional, Callable +from typing import Callable, Optional + +import schema from attrs import define, field from jinja2 import Template -import schema -from schema import Schema, Literal +from schema import Literal, Schema @define(slots=False) diff --git a/griptape/mixins/exponential_backoff_mixin.py b/griptape/mixins/exponential_backoff_mixin.py index 5045575f1..fb17a3400 100644 --- a/griptape/mixins/exponential_backoff_mixin.py +++ b/griptape/mixins/exponential_backoff_mixin.py @@ -1,9 +1,10 @@ import logging from abc import ABC -from attrs import define, field -from tenacity import Retrying, wait_exponential, stop_after_attempt, retry_if_not_exception_type from typing import Callable +from attrs import define, field +from tenacity import Retrying, retry_if_not_exception_type, stop_after_attempt, wait_exponential + @define(slots=False) class ExponentialBackoffMixin(ABC): diff --git a/griptape/mixins/media_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py index 14dcd4898..b2a0d8ef9 100644 --- a/griptape/mixins/media_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -1,10 +1,9 @@ from __future__ import annotations import os -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from attrs import define, field -from typing import Optional if TYPE_CHECKING: from griptape.artifacts import BlobArtifact diff --git a/griptape/mixins/rule_mixin.py b/griptape/mixins/rule_mixin.py index 0cc696242..04a487505 100644 --- a/griptape/mixins/rule_mixin.py +++ b/griptape/mixins/rule_mixin.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.rules import Ruleset, Rule +from griptape.rules import Rule, Ruleset if TYPE_CHECKING: from griptape.structures import Structure diff --git a/griptape/mixins/serializable_mixin.py b/griptape/mixins/serializable_mixin.py index 2364e8bc4..e8f772cab 100644 --- a/griptape/mixins/serializable_mixin.py +++ b/griptape/mixins/serializable_mixin.py @@ -1,13 +1,13 @@ from __future__ import annotations import json -from typing import TypeVar, Generic, cast, Optional, TYPE_CHECKING +from abc import ABC +from importlib import import_module +from typing import TYPE_CHECKING, Generic, Optional, TypeVar, cast from attrs import Factory, define, field -from abc import ABC from griptape.schemas.base_schema import BaseSchema -from importlib import import_module if TYPE_CHECKING: from marshmallow import Schema diff --git a/griptape/rules/rule.py b/griptape/rules/rule.py index f2a33c7e5..1063d174e 100644 --- a/griptape/rules/rule.py +++ b/griptape/rules/rule.py @@ -1,4 +1,5 @@ from __future__ import annotations + from attrs import define diff --git a/griptape/rules/ruleset.py b/griptape/rules/ruleset.py index 9a78b58b8..5d2cca62a 100644 --- a/griptape/rules/ruleset.py +++ b/griptape/rules/ruleset.py @@ -1,4 +1,5 @@ -from attrs import field, define +from attrs import define, field + from griptape.rules import Rule diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index cfc9c2f5c..15dd96b5d 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -1,11 +1,11 @@ from __future__ import annotations from abc import ABC -from typing import Union, Literal, get_args, get_origin from collections.abc import Sequence +from typing import Literal, Union, get_args, get_origin import attrs -from marshmallow import Schema, fields, INCLUDE +from marshmallow import INCLUDE, Schema, fields from griptape.schemas.bytes_field import Bytes @@ -24,6 +24,7 @@ def from_attrs_cls(cls, attrs_cls: type) -> type: attrs_cls: An attrs class. """ from marshmallow import post_load + from griptape.mixins import SerializableMixin class SubSchema(cls): @@ -100,33 +101,34 @@ def _resolve_types(cls, attrs_cls: type) -> None: Args: attrs_cls: An attrs class. """ - from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed + from typing import Any + + from griptape.artifacts import BaseArtifact + from griptape.common import ( + BaseDeltaMessageContent, + BaseMessageContent, + Message, + PromptStack, + Reference, + ToolAction, + ) # These modules are required to avoid `NameError`s when resolving types. from griptape.drivers import ( + BaseAudioTranscriptionDriver, BaseConversationMemoryDriver, - BasePromptDriver, + BaseEmbeddingDriver, BaseImageGenerationDriver, BaseImageQueryDriver, - BaseEmbeddingDriver, - BaseVectorStoreDriver, + BasePromptDriver, BaseTextToSpeechDriver, - BaseAudioTranscriptionDriver, + BaseVectorStoreDriver, ) + from griptape.memory.structure import Run from griptape.structures import Structure - from griptape.common import ( - PromptStack, - Message, - Reference, - ToolAction, - BaseMessageContent, - BaseDeltaMessageContent, - ) from griptape.tokenizers.base_tokenizer import BaseTokenizer from griptape.tools import BaseTool - from griptape.memory.structure import Run - from typing import Any - from griptape.artifacts import BaseArtifact + from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any Client = import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any diff --git a/griptape/schemas/bytes_field.py b/griptape/schemas/bytes_field.py index 11636e4d5..ac2830388 100644 --- a/griptape/schemas/bytes_field.py +++ b/griptape/schemas/bytes_field.py @@ -1,5 +1,6 @@ import base64 -from marshmallow import fields, ValidationError + +from marshmallow import ValidationError, fields class Bytes(fields.Field): diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index 60001de18..3fd7450ff 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -1,5 +1,7 @@ from typing import Any -from marshmallow import ValidationError, Schema + +from marshmallow import Schema, ValidationError + from griptape.schemas import BaseSchema diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 1df541e2a..5d4c3054a 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -1,15 +1,18 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Callable + +from typing import TYPE_CHECKING, Callable, Optional + from attrs import define, field + from griptape.artifacts.text_artifact import TextArtifact from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask if TYPE_CHECKING: - from griptape.tools import BaseTool from griptape.artifacts import BaseArtifact from griptape.tasks import BaseTask + from griptape.tools import BaseTool @define diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 408a42225..81e9d31fd 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -1,6 +1,9 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any + +from typing import TYPE_CHECKING, Any, Optional + from attrs import define + from griptape.artifacts import ErrorArtifact from griptape.memory.structure import Run from griptape.structures import Structure diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 52098f05f..fb6cd25cd 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -1,24 +1,27 @@ from __future__ import annotations + import logging import uuid from abc import ABC, abstractmethod from logging import Logger from typing import TYPE_CHECKING, Any, Optional + from attrs import Factory, define, field from rich.logging import RichHandler -from griptape.artifacts import BlobArtifact, TextArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig -from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( - VectorStoreRetrievalRagModule, - RulesetsBeforeResponseRagModule, - PromptResponseRagModule, MetadataBeforeResponseRagModule, + PromptResponseRagModule, + RulesetsBeforeResponseRagModule, + VectorStoreRetrievalRagModule, ) -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.start_structure_run_event import StartStructureRunEvent from griptape.memory import TaskMemory @@ -28,10 +31,10 @@ from griptape.utils import deprecation_warn if TYPE_CHECKING: - from griptape.rules import Rule, Ruleset from griptape.events import BaseEvent, EventListener - from griptape.tasks import BaseTask from griptape.memory.structure import BaseConversationMemory + from griptape.rules import Rule, Ruleset + from griptape.tasks import BaseTask @define diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 523e5317d..d83dee756 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -1,11 +1,14 @@ from __future__ import annotations + import concurrent.futures as futures +from typing import TYPE_CHECKING, Any, Callable, Optional + +from attrs import Factory, define, field from graphlib import TopologicalSorter -from typing import Any, Optional, Callable, TYPE_CHECKING -from attrs import define, field, Factory + from griptape.artifacts import ErrorArtifact -from griptape.structures import Structure from griptape.memory.structure import Run +from griptape.structures import Structure if TYPE_CHECKING: from griptape.tasks import BaseTask diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index ba73a29f0..d384acde9 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -1,17 +1,19 @@ from __future__ import annotations + import json import re -from typing import Optional, TYPE_CHECKING, Callable +from typing import TYPE_CHECKING, Callable, Optional import schema from attrs import define, field + from griptape import utils +from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.common import ToolAction -from griptape.utils import remove_null_values_in_dict_recursively +from griptape.events import FinishActionsSubtaskEvent, StartActionsSubtaskEvent from griptape.mixins import ActionsSubtaskOriginMixin from griptape.tasks import BaseTask -from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact, ActionArtifact -from griptape.events import StartActionsSubtaskEvent, FinishActionsSubtaskEvent +from griptape.utils import remove_null_values_in_dict_recursively if TYPE_CHECKING: from griptape.memory import TaskMemory diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py index 607911782..cc36f4eae 100644 --- a/griptape/tasks/audio_transcription_task.py +++ b/griptape/tasks/audio_transcription_task.py @@ -1,10 +1,11 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import define, field from griptape.engines import AudioTranscriptionEngine from griptape.tasks.base_audio_input_task import BaseAudioInputTask -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.artifacts import TextArtifact diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index 71c2fbdf4..0a730e3b2 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -4,7 +4,7 @@ from attrs import define -from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin from griptape.tasks import BaseTask diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 3b8cfb16a..74cf2d04e 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -2,14 +2,14 @@ import os from abc import ABC +from typing import TYPE_CHECKING -from attrs import field, define +from attrs import define, field from griptape.loaders import ImageLoader -from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin -from griptape.rules import Ruleset, Rule +from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin +from griptape.rules import Rule, Ruleset from griptape.tasks import BaseTask -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.artifacts import MediaArtifact diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 385bc9b5b..3804a749f 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -3,7 +3,7 @@ from abc import ABC from typing import Callable -from attrs import define, field, Factory +from attrs import Factory, define, field from griptape.artifacts import ListArtifact, TextArtifact from griptape.mixins.rule_mixin import RuleMixin diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 9aa891e18..bf985a313 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -4,17 +4,17 @@ from abc import ABC, abstractmethod from concurrent import futures from enum import Enum -from typing import TYPE_CHECKING, Any, Optional, Callable +from typing import TYPE_CHECKING, Any, Callable, Optional -from attrs import define, field, Factory +from attrs import Factory, define, field -from griptape.events import StartTaskEvent, FinishTaskEvent from griptape.artifacts import ErrorArtifact +from griptape.events import FinishTaskEvent, StartTaskEvent if TYPE_CHECKING: from griptape.artifacts import BaseArtifact - from griptape.structures import Structure from griptape.memory.meta import BaseMetaEntry + from griptape.structures import Structure @define diff --git a/griptape/tasks/code_execution_task.py b/griptape/tasks/code_execution_task.py index 038642b76..68e0d66ad 100644 --- a/griptape/tasks/code_execution_task.py +++ b/griptape/tasks/code_execution_task.py @@ -1,8 +1,11 @@ from __future__ import annotations + +from typing import Callable + from attrs import define, field + from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tasks import BaseTextInputTask -from typing import Callable @define diff --git a/griptape/tasks/csv_extraction_task.py b/griptape/tasks/csv_extraction_task.py index 8770187f0..538596dfe 100644 --- a/griptape/tasks/csv_extraction_task.py +++ b/griptape/tasks/csv_extraction_task.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define, field + from griptape.engines import CsvExtractionEngine from griptape.tasks import ExtractionTask diff --git a/griptape/tasks/extraction_task.py b/griptape/tasks/extraction_task.py index 8c9ac85b1..d8f492693 100644 --- a/griptape/tasks/extraction_task.py +++ b/griptape/tasks/extraction_task.py @@ -1,11 +1,14 @@ from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field + from griptape.tasks import BaseTextInputTask -from typing import TYPE_CHECKING if TYPE_CHECKING: + from griptape.artifacts import ErrorArtifact, ListArtifact from griptape.engines import BaseExtractionEngine - from griptape.artifacts import ListArtifact, ErrorArtifact @define diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 838ab4489..5c508b534 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -4,8 +4,8 @@ from attrs import define, field +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import InpaintingImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 diff --git a/griptape/tasks/json_extraction_task.py b/griptape/tasks/json_extraction_task.py index e1f082fd8..ce51b316f 100644 --- a/griptape/tasks/json_extraction_task.py +++ b/griptape/tasks/json_extraction_task.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define, field + from griptape.engines import JsonExtractionEngine from griptape.tasks import ExtractionTask diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 135304ad3..8e7b210a2 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -4,8 +4,8 @@ from attrs import define, field +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import OutpaintingImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 8c487d1ed..01bfd4b87 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -4,8 +4,8 @@ from attrs import define, field -from griptape.engines import PromptImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.engines import PromptImageGenerationEngine from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index c428e092d..adf140443 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -4,12 +4,11 @@ from attrs import Factory, define, field -from griptape.artifacts import BaseArtifact +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact from griptape.common import PromptStack +from griptape.mixins import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 -from griptape.artifacts import TextArtifact, ListArtifact -from griptape.mixins import RuleMixin if TYPE_CHECKING: from griptape.drivers import BasePromptDriver diff --git a/griptape/tasks/rag_task.py b/griptape/tasks/rag_task.py index fd5c5daa1..3f88f34d1 100644 --- a/griptape/tasks/rag_task.py +++ b/griptape/tasks/rag_task.py @@ -1,8 +1,11 @@ from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts import ErrorArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tasks import BaseTextInputTask -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.engines.rag import RagEngine diff --git a/griptape/tasks/structure_run_task.py b/griptape/tasks/structure_run_task.py index 148b5b2de..887a33b8a 100644 --- a/griptape/tasks/structure_run_task.py +++ b/griptape/tasks/structure_run_task.py @@ -1,14 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING from attrs import define, field from griptape.tasks import BaseMultiTextInputTask -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver from griptape.artifacts import BaseArtifact + from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver @define diff --git a/griptape/tasks/text_summary_task.py b/griptape/tasks/text_summary_task.py index 648fb1cf1..5bd1b547e 100644 --- a/griptape/tasks/text_summary_task.py +++ b/griptape/tasks/text_summary_task.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING, Optional + from attrs import define, field + from griptape.artifacts import TextArtifact from griptape.engines import PromptSummaryEngine from griptape.tasks import BaseTextInputTask diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index 29a2f0165..ab01e298c 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import Callable, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable from attrs import define, field -from griptape.engines import TextToSpeechEngine from griptape.artifacts import TextArtifact +from griptape.engines import TextToSpeechEngine from griptape.tasks.base_audio_generation_task import BaseAudioGenerationTask from griptape.utils import J2 diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index 447525f3e..ca548b34d 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -1,21 +1,24 @@ from __future__ import annotations + import json import re -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional + from attrs import define, field from griptape import utils -from griptape.artifacts import InfoArtifact, BaseArtifact, ErrorArtifact, ListArtifact -from griptape.tasks import PromptTask, ActionsSubtask -from griptape.utils import J2 +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, ListArtifact from griptape.mixins import ActionsSubtaskOriginMixin +from griptape.tasks import ActionsSubtask, PromptTask +from griptape.utils import J2 if TYPE_CHECKING: from schema import Schema - from griptape.tools import BaseTool + from griptape.common import PromptStack from griptape.memory import TaskMemory from griptape.structures import Structure + from griptape.tools import BaseTool @define diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 97835928c..6306fa7b3 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -1,21 +1,23 @@ from __future__ import annotations + import json from typing import TYPE_CHECKING, Callable, Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field from griptape import utils -from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, ListArtifact, ActionArtifact +from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact +from griptape.common import PromptStack, ToolAction from griptape.mixins import ActionsSubtaskOriginMixin -from griptape.tasks import ActionsSubtask -from griptape.tasks import PromptTask +from griptape.tasks import ActionsSubtask, PromptTask from griptape.utils import J2 -from griptape.common import PromptStack, ToolAction if TYPE_CHECKING: from schema import Schema - from griptape.tools import BaseTool + from griptape.memory import TaskMemory from griptape.structures import Structure + from griptape.tools import BaseTool @define diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index 1f2cebbfc..c3e71e0b5 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -4,8 +4,8 @@ from attrs import define, field +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import VariationImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 diff --git a/griptape/tokenizers/amazon_bedrock_tokenizer.py b/griptape/tokenizers/amazon_bedrock_tokenizer.py index 951802d59..292dcde17 100644 --- a/griptape/tokenizers/amazon_bedrock_tokenizer.py +++ b/griptape/tokenizers/amazon_bedrock_tokenizer.py @@ -1,6 +1,7 @@ from __future__ import annotations from attrs import define, field + from griptape.tokenizers.base_tokenizer import BaseTokenizer diff --git a/griptape/tokenizers/anthropic_tokenizer.py b/griptape/tokenizers/anthropic_tokenizer.py index f5fabab0e..0955a506b 100644 --- a/griptape/tokenizers/anthropic_tokenizer.py +++ b/griptape/tokenizers/anthropic_tokenizer.py @@ -1,8 +1,11 @@ from __future__ import annotations -from attrs import define, field, Factory + from typing import TYPE_CHECKING -from griptape.utils import import_optional_dependency + +from attrs import Factory, define, field + from griptape.tokenizers import BaseTokenizer +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from anthropic import Anthropic diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 212e40058..5b334f096 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -1,7 +1,9 @@ from __future__ import annotations + import logging from abc import ABC, abstractmethod -from attrs import define, field, Factory + +from attrs import Factory, define, field @define() diff --git a/griptape/tokenizers/cohere_tokenizer.py b/griptape/tokenizers/cohere_tokenizer.py index ae3bddd80..a0abf55c7 100644 --- a/griptape/tokenizers/cohere_tokenizer.py +++ b/griptape/tokenizers/cohere_tokenizer.py @@ -1,6 +1,9 @@ from __future__ import annotations + from typing import TYPE_CHECKING + from attrs import define, field + from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: diff --git a/griptape/tokenizers/dummy_tokenizer.py b/griptape/tokenizers/dummy_tokenizer.py index a36d0343e..b13b1fecb 100644 --- a/griptape/tokenizers/dummy_tokenizer.py +++ b/griptape/tokenizers/dummy_tokenizer.py @@ -1,6 +1,9 @@ from __future__ import annotations -from attrs import define, field + from typing import Optional + +from attrs import define, field + from griptape.exceptions import DummyException from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tokenizers/google_tokenizer.py b/griptape/tokenizers/google_tokenizer.py index f99a0682f..45e927cc9 100644 --- a/griptape/tokenizers/google_tokenizer.py +++ b/griptape/tokenizers/google_tokenizer.py @@ -1,8 +1,11 @@ from __future__ import annotations -from attrs import define, field, Factory + from typing import TYPE_CHECKING -from griptape.utils import import_optional_dependency + +from attrs import Factory, define, field + from griptape.tokenizers import BaseTokenizer +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from google.generativeai import GenerativeModel diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index fdebd23da..63ddf0ea7 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -1,9 +1,11 @@ from __future__ import annotations from typing import TYPE_CHECKING -from attrs import define, field, Factory -from griptape.utils import import_optional_dependency + +from attrs import Factory, define, field + from griptape.tokenizers import BaseTokenizer +from griptape.utils import import_optional_dependency if TYPE_CHECKING: from transformers import PreTrainedTokenizerBase diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index b4e125680..214e5be2d 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define, field + from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription_client/tool.py index 3fdde0102..786fb406b 100644 --- a/griptape/tools/audio_transcription_client/tool.py +++ b/griptape/tools/audio_transcription_client/tool.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import Any, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast -from attrs import define, field, Factory -from schema import Schema, Literal +from attrs import Factory, define, field +from schema import Literal, Schema -from griptape.artifacts import ErrorArtifact, AudioArtifact, TextArtifact +from griptape.artifacts import AudioArtifact, ErrorArtifact, TextArtifact from griptape.loaders.audio_loader import AudioLoader from griptape.tools import BaseTool from griptape.utils import load_artifact_from_memory diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam_client/tool.py index 467540829..b9f149b23 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam_client/tool.py @@ -1,10 +1,13 @@ from __future__ import annotations + from typing import TYPE_CHECKING -from schema import Schema, Literal -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact, ErrorArtifact, ListArtifact -from griptape.utils.decorators import activity + +from attrs import Factory, define, field +from schema import Literal, Schema + +from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact from griptape.tools import BaseAwsClient +from griptape.utils.decorators import activity if TYPE_CHECKING: from mypy_boto3_iam import Client diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3_client/tool.py index 9d50c7cf8..e69db8390 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3_client/tool.py @@ -1,11 +1,14 @@ from __future__ import annotations + import io -from typing import Any, TYPE_CHECKING -from schema import Schema, Literal -from attrs import define, field, Factory -from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, ListArtifact, BlobArtifact -from griptape.utils.decorators import activity +from typing import TYPE_CHECKING, Any + +from attrs import Factory, define, field +from schema import Literal, Schema + +from griptape.artifacts import BlobArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.tools import BaseAwsClient +from griptape.utils.decorators import activity if TYPE_CHECKING: from mypy_boto3_s3 import Client diff --git a/griptape/tools/base_aws_client.py b/griptape/tools/base_aws_client.py index bd7b41e59..8c6d02e2b 100644 --- a/griptape/tools/base_aws_client.py +++ b/griptape/tools/base_aws_client.py @@ -1,8 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING + from abc import ABC +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts import TextArtifact, ErrorArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_client.py index 51ae2f946..4a15770ec 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_client.py @@ -1,7 +1,9 @@ from abc import ABC +from typing import Any, Optional + from attrs import define, field + from griptape.tools import BaseTool -from typing import Optional, Any @define diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_client.py index 3e7f44fe6..908f59b52 100644 --- a/griptape/tools/base_griptape_cloud_client.py +++ b/griptape/tools/base_griptape_cloud_client.py @@ -1,6 +1,9 @@ from __future__ import annotations + from abc import ABC + from attrs import Factory, define, field + from griptape.tools import BaseTool diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index bfff2fffb..1e71e6a8f 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -1,16 +1,18 @@ from __future__ import annotations + +import inspect import logging +import os import subprocess import sys -from typing import TYPE_CHECKING, Callable -from schema import Schema, Literal, Or -import inspect -import os from abc import ABC -from typing import Optional +from typing import TYPE_CHECKING, Callable, Optional + import yaml -from attrs import define, field, Factory -from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact, ErrorArtifact +from attrs import Factory, define, field +from schema import Literal, Or, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact from griptape.mixins import ActivityMixin if TYPE_CHECKING: diff --git a/griptape/tools/calculator/tool.py b/griptape/tools/calculator/tool.py index 141da0bfc..02e5fe95e 100644 --- a/griptape/tools/calculator/tool.py +++ b/griptape/tools/calculator/tool.py @@ -1,7 +1,8 @@ +from schema import Literal, Schema + from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from schema import Schema, Literal class Calculator(BaseTool): diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index b63ba9e0b..565389a3f 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -1,21 +1,23 @@ from __future__ import annotations + import logging import os import shutil import tempfile from pathlib import Path -from typing import Optional, TYPE_CHECKING -from attrs import define, field, Factory -from docker.models.containers import Container -from schema import Schema, Literal -import stringcase +from typing import TYPE_CHECKING, Optional + import docker +import stringcase +from attrs import Factory, define, field from docker.errors import NotFound +from docker.models.containers import Container +from schema import Literal, Schema + from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity - if TYPE_CHECKING: from docker import DockerClient diff --git a/griptape/tools/date_time/tool.py b/griptape/tools/date_time/tool.py index c72ff4f8c..886969575 100644 --- a/griptape/tools/date_time/tool.py +++ b/griptape/tools/date_time/tool.py @@ -1,5 +1,7 @@ from datetime import datetime -from schema import Schema, Literal + +from schema import Literal, Schema + from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/email_client/tool.py b/griptape/tools/email_client/tool.py index 6e0b32dc3..622c21fa3 100644 --- a/griptape/tools/email_client/tool.py +++ b/griptape/tools/email_client/tool.py @@ -1,15 +1,18 @@ from __future__ import annotations -from attrs import Factory, define, field + +import logging +import smtplib from email.mime.text import MIMEText +from typing import Optional + +import schema +from attrs import Factory, define, field +from schema import Literal, Schema + from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact from griptape.loaders.email_loader import EmailLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity -from schema import Schema, Literal -from typing import Optional -import logging -import schema -import smtplib @define diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 47582f8cc..db6ef451a 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -1,11 +1,14 @@ from __future__ import annotations + import os -from attrs import define, field, Factory + +from attrs import Factory, define, field +from schema import Literal, Schema + from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.drivers import BaseFileManagerDriver, LocalFileManagerDriver from griptape.tools import BaseTool from griptape.utils.decorators import activity -from schema import Schema, Literal @define diff --git a/griptape/tools/google_cal/tool.py b/griptape/tools/google_cal/tool.py index e0097fd02..85f6158cd 100644 --- a/griptape/tools/google_cal/tool.py +++ b/griptape/tools/google_cal/tool.py @@ -1,11 +1,14 @@ from __future__ import annotations -import logging + import datetime -from schema import Schema, Literal, Optional +import logging + from attrs import define, field -from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, ListArtifact -from griptape.utils.decorators import activity +from schema import Literal, Optional, Schema + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.tools import BaseGoogleClient +from griptape.utils.decorators import activity @define diff --git a/griptape/tools/google_docs/tool.py b/griptape/tools/google_docs/tool.py index 48dbbe39c..2cab05208 100644 --- a/griptape/tools/google_docs/tool.py +++ b/griptape/tools/google_docs/tool.py @@ -1,12 +1,13 @@ from __future__ import annotations + import logging -from attrs import field, define -from schema import Schema, Optional, Literal -from griptape.artifacts import ErrorArtifact, InfoArtifact +from attrs import define, field +from schema import Literal, Optional, Schema -from griptape.utils.decorators import activity +from griptape.artifacts import ErrorArtifact, InfoArtifact from griptape.tools import BaseGoogleClient +from griptape.utils.decorators import activity @define diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index fcb042cfb..427ed5e0a 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -1,13 +1,16 @@ from __future__ import annotations + import logging +from io import BytesIO from typing import Any, Optional + import schema -from schema import Schema, Literal, Or from attrs import define, field -from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BlobArtifact, TextArtifact -from griptape.utils.decorators import activity +from schema import Literal, Or, Schema + +from griptape.artifacts import BlobArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.tools import BaseGoogleClient -from io import BytesIO +from griptape.utils.decorators import activity @define diff --git a/griptape/tools/google_gmail/tool.py b/griptape/tools/google_gmail/tool.py index 5b4bf5cd5..137f2584b 100644 --- a/griptape/tools/google_gmail/tool.py +++ b/griptape/tools/google_gmail/tool.py @@ -1,12 +1,15 @@ from __future__ import annotations -import logging + import base64 +import logging from email.message import EmailMessage -from schema import Schema, Literal + from attrs import define, field -from griptape.artifacts import InfoArtifact, ErrorArtifact -from griptape.utils.decorators import activity +from schema import Literal, Schema + +from griptape.artifacts import ErrorArtifact, InfoArtifact from griptape.tools import BaseGoogleClient +from griptape.utils.decorators import activity @define diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 281c13b60..438d09aa0 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -1,11 +1,14 @@ from __future__ import annotations + from typing import Optional from urllib.parse import urljoin -from schema import Schema, Literal + from attrs import define, field +from schema import Literal, Schema + +from griptape.artifacts import ErrorArtifact, TextArtifact from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient from griptape.utils.decorators import activity -from griptape.artifacts import TextArtifact, ErrorArtifact @define @@ -29,7 +32,7 @@ class GriptapeCloudKnowledgeBaseClient(BaseGriptapeCloudClient): } ) def query(self, params: dict) -> TextArtifact | ErrorArtifact: - from requests import post, exceptions + from requests import exceptions, post query = params["values"]["query"] url = urljoin(self.base_url.strip("/"), f"/api/knowledge-bases/{self.knowledge_base_id}/search") diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query_client/tool.py index b03f3fed0..aeaa3e4b2 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query_client/tool.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import Any, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast -from attrs import define, field, Factory -from schema import Schema, Literal +from attrs import Factory, define, field +from schema import Literal, Schema -from griptape.artifacts import TextArtifact, ImageArtifact, ErrorArtifact, BlobArtifact +from griptape.artifacts import BlobArtifact, ErrorArtifact, ImageArtifact, TextArtifact from griptape.loaders import ImageLoader from griptape.tools import BaseTool from griptape.utils import load_artifact_from_memory diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation_client/tool.py index c343f9923..7c57e6f08 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation_client/tool.py @@ -1,9 +1,9 @@ from __future__ import annotations -from typing import Any, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader diff --git a/griptape/tools/openweather_client/tool.py b/griptape/tools/openweather_client/tool.py index e338677dd..21b80c6f0 100644 --- a/griptape/tools/openweather_client/tool.py +++ b/griptape/tools/openweather_client/tool.py @@ -1,12 +1,15 @@ from __future__ import annotations -from griptape.artifacts import ListArtifact, TextArtifact, ErrorArtifact, InfoArtifact -from griptape.tools import BaseTool -from griptape.utils.decorators import activity -from schema import Schema, Literal + +import logging from typing import Optional -from attrs import define, field + import requests -import logging +from attrs import define, field +from schema import Literal, Schema + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact +from griptape.tools import BaseTool +from griptape.utils.decorators import activity @define diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index 72db0e54c..0e355b1dc 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -1,15 +1,15 @@ from __future__ import annotations -from typing import Any, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory if TYPE_CHECKING: diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index 799df8673..17e2f6768 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -1,16 +1,17 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import BlobArtifactFileOutputMixin -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.engines import PromptImageGenerationEngine from griptape.artifacts import ErrorArtifact, ImageArtifact + from griptape.engines import PromptImageGenerationEngine @define diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index 36ab82bf3..afc1b9d06 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -1,10 +1,13 @@ from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact, BaseArtifact +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.engines.rag import RagEngine diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index 6206c1dba..fd63ab500 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -1,12 +1,14 @@ from textwrap import dedent from typing import Optional from urllib.parse import urljoin + import schema -from schema import Schema, Literal from attrs import define, field +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.artifacts import BaseArtifact, TextArtifact, ErrorArtifact @define @@ -51,7 +53,7 @@ def full_url(self) -> str: } ) def put(self, params: dict) -> BaseArtifact: - from requests import put, exceptions + from requests import exceptions, put values = params["values"] base_url = self.base_url @@ -86,7 +88,7 @@ def put(self, params: dict) -> BaseArtifact: } ) def patch(self, params: dict) -> BaseArtifact: - from requests import patch, exceptions + from requests import exceptions, patch values = params["values"] base_url = self.base_url @@ -115,7 +117,7 @@ def patch(self, params: dict) -> BaseArtifact: } ) def post(self, params: dict) -> BaseArtifact: - from requests import post, exceptions + from requests import exceptions, post values = params["values"] base_url = self.base_url @@ -151,7 +153,7 @@ def post(self, params: dict) -> BaseArtifact: } ) def get(self, params: dict) -> BaseArtifact: - from requests import get, exceptions + from requests import exceptions, get values = params["values"] base_url = self.base_url diff --git a/griptape/tools/sql_client/tool.py b/griptape/tools/sql_client/tool.py index c06cfe4d9..93c69c51b 100644 --- a/griptape/tools/sql_client/tool.py +++ b/griptape/tools/sql_client/tool.py @@ -1,10 +1,13 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING + +from typing import TYPE_CHECKING, Optional + from attrs import define, field -from griptape.artifacts import InfoArtifact, ListArtifact, ErrorArtifact +from schema import Schema + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity -from schema import Schema if TYPE_CHECKING: from griptape.loaders import SqlLoader diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index 79ed635df..0a1cc223b 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -1,12 +1,13 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from attrs import define, field from schema import Literal, Schema from griptape.artifacts import BaseArtifact, TextArtifact from griptape.tools.base_tool import BaseTool from griptape.utils.decorators import activity -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.drivers import BaseStructureRunDriver diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index ce89da22e..406f50fed 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -1,7 +1,9 @@ from __future__ import annotations + from attrs import define -from schema import Schema, Literal -from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, BaseArtifact +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/text_to_speech_client/tool.py b/griptape/tools/text_to_speech_client/tool.py index 675320d83..9649279be 100644 --- a/griptape/tools/text_to_speech_client/tool.py +++ b/griptape/tools/text_to_speech_client/tool.py @@ -1,17 +1,17 @@ from __future__ import annotations -from typing import Any, TYPE_CHECKING +from typing import TYPE_CHECKING, Any from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import BlobArtifactFileOutputMixin if TYPE_CHECKING: + from griptape.artifacts import AudioArtifact, ErrorArtifact from griptape.engines import TextToSpeechEngine - from griptape.artifacts import ErrorArtifact, AudioArtifact @define diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index 40afab05a..c1ab91896 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -1,15 +1,15 @@ from __future__ import annotations -from typing import Any, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.loaders import ImageLoader +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory if TYPE_CHECKING: diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index 8a334c21a..ef831e508 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -1,9 +1,11 @@ from __future__ import annotations -from typing import Callable, Any, TYPE_CHECKING -from attrs import define, field, Factory -from schema import Schema, Literal -from griptape.artifacts import ErrorArtifact, BaseArtifact -from griptape.artifacts import ListArtifact + +from typing import TYPE_CHECKING, Any, Callable + +from attrs import Factory, define, field +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/web_scraper/tool.py b/griptape/tools/web_scraper/tool.py index c42dedad9..a72378bb2 100644 --- a/griptape/tools/web_scraper/tool.py +++ b/griptape/tools/web_scraper/tool.py @@ -1,10 +1,12 @@ from __future__ import annotations -from attrs import define, field, Factory + +from attrs import Factory, define, field +from schema import Literal, Schema + from griptape.artifacts import ErrorArtifact, ListArtifact -from schema import Schema, Literal +from griptape.loaders import WebLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.loaders import WebLoader @define diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index 17c62dcc4..5a3360077 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -1,10 +1,13 @@ from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field +from schema import Literal, Schema + from griptape.artifacts import ErrorArtifact, ListArtifact -from schema import Schema, Literal from griptape.tools import BaseTool from griptape.utils.decorators import activity -from typing import TYPE_CHECKING if TYPE_CHECKING: from griptape.drivers import BaseWebSearchDriver diff --git a/griptape/utils/command_runner.py b/griptape/utils/command_runner.py index bbc03ec39..957be8272 100644 --- a/griptape/utils/command_runner.py +++ b/griptape/utils/command_runner.py @@ -1,6 +1,8 @@ import subprocess + from attrs import define -from griptape.artifacts import BaseArtifact, TextArtifact, ErrorArtifact + +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact @define diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index ae05e8b99..25dd310e1 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -1,5 +1,7 @@ from __future__ import annotations + from typing import TYPE_CHECKING + from attrs import define, field if TYPE_CHECKING: diff --git a/griptape/utils/decorators.py b/griptape/utils/decorators.py index d2c2a4951..83811d9a6 100644 --- a/griptape/utils/decorators.py +++ b/griptape/utils/decorators.py @@ -1,8 +1,8 @@ import functools + import schema from schema import Schema - CONFIG_SCHEMA = Schema({"description": str, schema.Optional("schema"): Schema}) diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index daf2982d8..ecefcc6b6 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -1,7 +1,8 @@ -import griptape.utils as utils from concurrent import futures from typing import Optional +import griptape.utils as utils + def load_file(path: str) -> bytes: """Load a file from the given path and return its content as bytes. diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index b3e830caf..9ad25be20 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -2,7 +2,6 @@ from types import ModuleType from typing import Optional - INSTALL_MAPPING = { "huggingface_hub": "huggingface-hub", "pinecone": "pinecone-client", diff --git a/griptape/utils/j2.py b/griptape/utils/j2.py index ca54fed9e..52d7eb69e 100644 --- a/griptape/utils/j2.py +++ b/griptape/utils/j2.py @@ -1,6 +1,8 @@ from typing import Optional -from attrs import define, field, Factory + +from attrs import Factory, define, field from jinja2 import Environment, FileSystemLoader + from .paths import abs_path diff --git a/griptape/utils/python_runner.py b/griptape/utils/python_runner.py index 75b6e53c2..009d17b7f 100644 --- a/griptape/utils/python_runner.py +++ b/griptape/utils/python_runner.py @@ -1,6 +1,7 @@ import importlib import sys from io import StringIO + from attrs import define, field diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 18df1ba56..32e31ea7b 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -1,16 +1,20 @@ from __future__ import annotations -from typing import TYPE_CHECKING -from threading import Thread + from queue import Queue +from threading import Thread +from typing import TYPE_CHECKING + +from attrs import Factory, define, field + from griptape.artifacts.text_artifact import TextArtifact from griptape.events.completion_chunk_event import CompletionChunkEvent from griptape.events.event_listener import EventListener -from griptape.events.finish_structure_run_event import FinishStructureRunEvent from griptape.events.finish_prompt_event import FinishPromptEvent -from attrs import field, define, Factory +from griptape.events.finish_structure_run_event import FinishStructureRunEvent if TYPE_CHECKING: from collections.abc import Iterator + from griptape.events.base_event import BaseEvent from griptape.structures import Structure diff --git a/griptape/utils/structure_visualizer.py b/griptape/utils/structure_visualizer.py index 7c315a0bc..f24443cd6 100644 --- a/griptape/utils/structure_visualizer.py +++ b/griptape/utils/structure_visualizer.py @@ -1,13 +1,14 @@ from __future__ import annotations + import base64 import hashlib +from typing import TYPE_CHECKING from attrs import define, field -from typing import TYPE_CHECKING if TYPE_CHECKING: - from griptape.tasks import BaseTask from griptape.structures import Structure + from griptape.tasks import BaseTask @define diff --git a/pyproject.toml b/pyproject.toml index 49e786a1d..6e0b43917 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -211,7 +211,8 @@ select = [ "T201", # print "C901", # complex-structure "TCH", # flake8-type-checking - "D" # pydocstyle + "D", # pydocstyle + "I" # isort ] ignore = [ "UP007", # non-pep604-annotation @@ -231,6 +232,9 @@ ignore = [ [tool.ruff.lint.pydocstyle] convention = "google" +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["I"] + [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." From 9fb4dd925cc677c3b2fa57b249e6f23f5a6aa6f2 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Fri, 12 Jul 2024 13:05:58 -0700 Subject: [PATCH 155/238] GriptapeCloudVectorStoreDriver (#885) --- CHANGELOG.md | 1 + .../drivers/vector-store-drivers.md | 189 +++++++++++------- griptape/drivers/__init__.py | 2 + ...loud_knowledge_base_vector_store_driver.py | 101 ++++++++++ ...loud_knowledge_base_vector_store_driver.py | 69 +++++++ 5 files changed, 294 insertions(+), 68 deletions(-) create mode 100644 griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py create mode 100644 tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 82eaeef3c..cd83a793c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, and `CoherePromptDriver`. - `OllamaEmbeddingDriver` for generating embeddings with Ollama. +- `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. ### Changed diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index da6fdc242..ea2b72a56 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -1,6 +1,6 @@ ## Overview -Griptape provides a way to build drivers for vector DBs where embeddings can be stored and queried. Every vector store driver implements the following methods: +Griptape provides a way to build drivers for vector DBs where embeddings can be stored and queried. Every Vector Store Driver implements the following methods: - `upsert_text_artifact()` for updating or inserting a new [TextArtifact](../../reference/griptape/artifacts/text_artifact.md) into vector DBs. The method will automatically generate embeddings for a given value. - `upsert_text_artifacts()` for updating or inserting multiple [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s into vector DBs. The method will automatically generate embeddings for given values. @@ -8,19 +8,19 @@ Griptape provides a way to build drivers for vector DBs where embeddings can be - `upsert_vector()` for updating and inserting new vectors directly. - `query()` for querying vector DBs. -Each vector driver takes a [BaseEmbeddingDriver](../../reference/griptape/drivers/embedding/base_embedding_driver.md) used to dynamically generate embeddings for strings. +Each Vector Store Driver takes a [BaseEmbeddingDriver](../../reference/griptape/drivers/embedding/base_embedding_driver.md) used to dynamically generate embeddings for strings. !!! info - When working with vector database indexes with Griptape drivers, make sure the number of dimensions is equal to 1536. Nearly all embedding models create vectors with this number of dimensions. Check the documentation for your vector database on how to create/update vector indexes. + When working with vector database indexes with Griptape Drivers, make sure the number of dimensions is equal to 1536. Nearly all embedding models create vectors with this number of dimensions. Check the documentation for your vector database on how to create/update vector indexes. !!! info - More vector drivers are coming soon. + More Vector Store Drivers are coming soon. ## Vector Store Drivers ### Local -The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the driver can be used to load a webpage into the driver and query it later: +The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vector_store_driver.md) can be used to load and query data from memory. Here is a complete example of how the Driver can be used to load a webpage into the Driver and query it later: ```python import os @@ -29,12 +29,15 @@ from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) + +# Load Artifacts from the web artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") +# Upsert Artifacts into the Vector Store Driver [vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] results = vector_store_driver.query( @@ -49,14 +52,38 @@ print("\n\n".join(values)) ``` +### Griptape Cloud Knowledge Base + +The [GriptapeCloudKnowledgeBaseVectorStoreDriver](../../reference/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.md) can be used to query data from a Griptape Cloud Knowledge Base. Loading into Knowledge Bases is not supported at this time, only querying. Here is a complete example of how the Driver can be used to query an existing Knowledge Base: + +```python +import os +from griptape.artifacts import BaseArtifact +from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver + + +# Initialize environment variables +gt_cloud_api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +gt_cloud_knowledge_base_id = os.environ["GRIPTAPE_CLOUD_KB_ID"] + +vector_store_driver = GriptapeCloudKnowledgeBaseVectorStoreDriver(api_key=gt_cloud_api_key, knowledge_base_id=gt_cloud_knowledge_base_id) + +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) + +``` + ### Pinecone !!! info - This driver requires the `drivers-vector-pinecone` [extra](../index.md#extras). + This Driver requires the `drivers-vector-pinecone` [extra](../index.md#extras). The [PineconeVectorStoreDriver](../../reference/griptape/drivers/vector/pinecone_vector_store_driver.md) supports the [Pinecone vector database](https://www.pinecone.io/). -Here is an example of how the driver can be used to load and query information in a Pinecone cluster: +Here is an example of how the Driver can be used to load and query information in a Pinecone cluster: ```python import os @@ -85,7 +112,7 @@ def load_data(driver: PineconeVectorStoreDriver) -> None: namespace="supermarket-products", ) -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) vector_store_driver = PineconeVectorStoreDriver( @@ -97,72 +124,79 @@ vector_store_driver = PineconeVectorStoreDriver( load_data(vector_store_driver) -result = vector_store_driver.query( +results = vector_store_driver.query( "fruit", count=3, filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, namespace="supermarket-products", ) + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` ### Marqo !!! info - This driver requires the `drivers-vector-marqo` [extra](../index.md#extras). + This Driver requires the `drivers-vector-marqo` [extra](../index.md#extras). The [MarqoVectorStoreDriver](../../reference/griptape/drivers/vector/marqo_vector_store_driver.md) supports the Marqo vector database. -Here is an example of how the driver can be used to load and query information in a Marqo cluster: +Here is an example of how the Driver can be used to load and query information in a Marqo cluster: ```python import os from griptape.drivers import MarqoVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.loaders import WebLoader -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") # Define the namespace namespace = 'griptape-ai' -# Initialize the vector store driver -vector_store = MarqoVectorStoreDriver( +# Initialize the Vector Store Driver +vector_store_driver = MarqoVectorStoreDriver( api_key=os.environ["MARQO_API_KEY"], url=os.environ["MARQO_URL"], index=os.environ["MARQO_INDEX_NAME"], embedding_driver=embedding_driver, ) -# Load artifacts from the web +# Load Artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") -# Upsert the artifacts into the vector store -vector_store.upsert_text_artifacts( +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store.query(query="What is griptape?") -print(result) +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` ### Mongodb Atlas !!! info - This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). + This Driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). The [MongodbAtlasVectorStoreDriver](../../reference/griptape/drivers/vector/mongodb_atlas_vector_store_driver.md) provides support for storing vector data in a MongoDB Atlas database. -Here is an example of how the driver can be used to load and query information in a MongoDb Atlas Cluster: +Here is an example of how the Driver can be used to load and query information in a MongoDb Atlas Cluster: ```python from griptape.drivers import MongoDbAtlasVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader import os -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) host = os.environ["MONGODB_HOST"] @@ -173,8 +207,8 @@ collection_name = os.environ[ "MONGODB_COLLECTION_NAME"] index_name = os.environ["MONGODB_INDEX_NAME"] vector_path = os.environ["MONGODB_VECTOR_PATH"] -# Initialize the vector store driver -vector_store = MongoDbAtlasVectorStoreDriver( +# Initialize the Vector Store Driver +vector_store_driver = MongoDbAtlasVectorStoreDriver( connection_string=f"mongodb+srv://{username}:{password}@{host}/{database_name}", database_name=database_name, collection_name=collection_name, @@ -183,18 +217,21 @@ vector_store = MongoDbAtlasVectorStoreDriver( vector_path=vector_path, ) -# Load artifacts from the web +# Load Artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") -# Upsert the artifacts into the vector store -vector_store.upsert_text_artifacts( +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store.query(query="What is griptape?") -print(result) +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` The format for creating a vector index should look similar to the following: @@ -219,18 +256,18 @@ Replace `path_to_vector` with the expected field name where the vector content w ### Azure MongoDB !!! info - This driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). + This Driver requires the `drivers-vector-mongodb` [extra](../index.md#extras). The [AzureMongoDbVectorStoreDriver](../../reference/griptape/drivers/vector/azure_mongodb_vector_store_driver.md) provides support for storing vector data in an Azure CosmosDb database account using the MongoDb vCore API -Here is an example of how the driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is very similar to the Driver for [MongoDb Atlas](#mongodb-atlas): +Here is an example of how the Driver can be used to load and query information in an Azure CosmosDb MongoDb vCore database. It is very similar to the Driver for [MongoDb Atlas](#mongodb-atlas): ```python from griptape.drivers import AzureMongoDbVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader import os -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) azure_host = os.environ["AZURE_MONGODB_HOST"] @@ -241,8 +278,8 @@ collection_name = os.environ["AZURE_MONGODB_COLLECTION_NAME"] index_name = os.environ["AZURE_MONGODB_INDEX_NAME"] vector_path = os.environ["AZURE_MONGODB_VECTOR_PATH"] -# Initialize the vector store driver -vector_store = AzureMongoDbVectorStoreDriver( +# Initialize the Vector Store Driver +vector_store_driver = AzureMongoDbVectorStoreDriver( connection_string=f"mongodb+srv://{username}:{password}@{azure_host}/{database_name}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000", database_name=database_name, collection_name=collection_name, @@ -251,28 +288,31 @@ vector_store = AzureMongoDbVectorStoreDriver( vector_path=vector_path, ) -# Load artifacts from the web +# Load Artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") -# Upsert the artifacts into the vector store -vector_store.upsert_text_artifacts( +# Upsert Artifacts into the Vector Store Driver +vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store.query(query="What is griptape?") -print(result) +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` ### Redis !!! info - This driver requires the `drivers-vector-redis` [extra](../index.md#extras). + This Driver requires the `drivers-vector-redis` [extra](../index.md#extras). The [RedisVectorStoreDriver](../../reference/griptape/drivers/vector/redis_vector_store_driver.md) integrates with the Redis vector storage system. -Here is an example of how the driver can be used to load and query information in a Redis Cluster: +Here is an example of how the Driver can be used to load and query information in a Redis Cluster: ```python import os @@ -280,7 +320,7 @@ from griptape.drivers import RedisVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader import numpy as np # Assuming you'd use numpy to create a dummy vector for the sake of example. -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) vector_store_driver = RedisVectorStoreDriver( @@ -291,18 +331,21 @@ vector_store_driver = RedisVectorStoreDriver( embedding_driver=embedding_driver, ) -# Load artifacts from the web +# Load Artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") -# Upsert the artifacts into the vector store +# Upsert Artifacts into the Vector Store Driver vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store_driver.query(query="What is griptape?") -print(result) +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` The format for creating a vector index should be similar to the following: @@ -313,11 +356,11 @@ FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA namespace TAG vector ### OpenSearch !!! info - This driver requires the `drivers-vector-opensearch` [extra](../index.md#extras). + This Driver requires the `drivers-vector-opensearch` [extra](../index.md#extras). The [OpenSearchVectorStoreDriver](../../reference/griptape/drivers/vector/opensearch_vector_store_driver.md) integrates with the OpenSearch platform, allowing for storage, retrieval, and querying of vector data. -Here is an example of how the driver can be used to load and query information in an OpenSearch Cluster: +Here is an example of how the Driver can be used to load and query information in an OpenSearch Cluster: ```python import os @@ -325,7 +368,7 @@ import boto3 from griptape.drivers import AmazonOpenSearchVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader -# Initialize an embedding driver +# Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) vector_store_driver = AmazonOpenSearchVectorStoreDriver( @@ -335,19 +378,21 @@ vector_store_driver = AmazonOpenSearchVectorStoreDriver( embedding_driver=embedding_driver, ) -# Load artifacts from the web +# Load Artifacts from the web artifacts = WebLoader(max_tokens=200).load("https://www.griptape.ai") -# Upsert the artifacts into the vector store +# Upsert Artifacts into the Vector Store Driver vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store_driver.query(query="What is griptape?") +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] -print(result) +print("\n\n".join(values)) ``` The body mappings for creating a vector index should look similar to the following: @@ -366,18 +411,18 @@ The body mappings for creating a vector index should look similar to the followi ### PGVector !!! info - This driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). + This Driver requires the `drivers-vector-postgresql` [extra](../index.md#extras). -The [PGVectorVectorStoreDriver](../../reference/griptape/drivers/vector/pgvector_vector_store_driver.md) integrates with PGVector, a vector storage and search extension for Postgres. While Griptape will handle enabling the extension, PGVector must be installed and ready for use in your Postgres instance before using this vector store driver. +The [PGVectorVectorStoreDriver](../../reference/griptape/drivers/vector/pgvector_vector_store_driver.md) integrates with PGVector, a vector storage and search extension for Postgres. While Griptape will handle enabling the extension, PGVector must be installed and ready for use in your Postgres instance before using this Vector Store Driver. -Here is an example of how the driver can be used to load and query information in a Postgres database: +Here is an example of how the Driver can be used to load and query information in a Postgres database: ```python import os from griptape.drivers import PgVectorVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader -# Initialize an embedding driver. +# Initialize an Embedding Driver. embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) db_user = os.environ["POSTGRES_USER"] @@ -395,26 +440,31 @@ vector_store_driver = PgVectorVectorStoreDriver( # Install required Postgres extensions and create database schema. vector_store_driver.setup() -web_loader = WebLoader() -artifacts = web_loader.load("https://www.griptape.ai") +# Load Artifacts from the web +artifacts = WebLoader().load("https://www.griptape.ai") + +# Upsert Artifacts into the Vector Store Driver vector_store_driver.upsert_text_artifacts( { "griptape": artifacts, } ) -result = vector_store_driver.query("What is griptape?") -print(result) +results =vector_store_driver.query(query="What is griptape?") + +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` ### Qdrant !!! info - This driver requires the `drivers-vector-qdrant` [extra](../index.md#extras). + This Driver requires the `drivers-vector-qdrant` [extra](../index.md#extras). The QdrantVectorStoreDriver supports the [Qdrant vector database](https://qdrant.tech/). -Here is an example of how the driver can be used to query information in a Qdrant collection: +Here is an example of how the Driver can be used to query information in a Qdrant collection: ```python import os @@ -427,14 +477,14 @@ embedding_model_name = "sentence-transformers/all-MiniLM-L6-v2" host = os.environ["QDRANT_CLUSTER_ENDPOINT"] huggingface_token = os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"] -# Initialize HuggingFace embedding driver +# Initialize HuggingFace Embedding Driver embedding_driver = HuggingFaceHubEmbeddingDriver( api_token=huggingface_token, model=embedding_model_name, tokenizer=HuggingFaceTokenizer(model=embedding_model_name, max_output_tokens=512), ) -# Initialize Qdrant vector store driver +# Initialize Qdrant Vector Store Driver vector_store_driver = QdrantVectorStoreDriver( url=host, collection_name="griptape", @@ -443,7 +493,7 @@ vector_store_driver = QdrantVectorStoreDriver( api_key=os.environ["QDRANT_CLUSTER_API_KEY"], ) -# Load data from the website +# Load Artifacts from the web artifacts = WebLoader().load("https://www.griptape.ai") # Encode text to get embeddings @@ -465,6 +515,9 @@ vector_store_driver.upsert_vector( content=artifacts[0].value ) -print("Vectors successfully inserted into Qdrant.") +results =vector_store_driver.query(query="What is griptape?") +values = [r.to_artifact().value for r in results] + +print("\n\n".join(values)) ``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 4e0fe6672..4ecb6c9bd 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -41,6 +41,7 @@ from .vector.azure_mongodb_vector_store_driver import AzureMongoDbVectorStoreDriver from .vector.dummy_vector_store_driver import DummyVectorStoreDriver from .vector.qdrant_vector_store_driver import QdrantVectorStoreDriver +from .vector.griptape_cloud_knowledge_base_vector_store_driver import GriptapeCloudKnowledgeBaseVectorStoreDriver from .sql.base_sql_driver import BaseSqlDriver from .sql.amazon_redshift_sql_driver import AmazonRedshiftSqlDriver @@ -149,6 +150,7 @@ "PgVectorVectorStoreDriver", "QdrantVectorStoreDriver", "DummyVectorStoreDriver", + "GriptapeCloudKnowledgeBaseVectorStoreDriver", "BaseSqlDriver", "AmazonRedshiftSqlDriver", "SnowflakeSqlDriver", diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py new file mode 100644 index 000000000..0c7d5c961 --- /dev/null +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -0,0 +1,101 @@ +from urllib.parse import urljoin +import requests +from typing import Optional, Any +from attrs import Factory, define, field +from griptape.artifacts import TextArtifact, ListArtifact +from griptape.drivers import BaseEmbeddingDriver, BaseVectorStoreDriver, DummyEmbeddingDriver + + +@define +class GriptapeCloudKnowledgeBaseVectorStoreDriver(BaseVectorStoreDriver): + """A vector store driver for Griptape Cloud Knowledge Bases. + + Attributes: + api_key: API Key for Griptape Cloud. + knowledge_base_id: Knowledge Base ID for Griptape Cloud. + base_url: Base URL for Griptape Cloud. + headers: Headers for Griptape Cloud. + """ + + api_key: str = field(kw_only=True, metadata={"serializable": True}) + knowledge_base_id: str = field(kw_only=True, metadata={"serializable": True}) + base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True}, kw_only=True, init=False + ) + + def upsert_vector( + self, + vector: list[float], + vector_id: Optional[str] = None, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + **kwargs, + ) -> str: + raise NotImplementedError(f"{self.__class__.__name__} does not support vector upsert.") + + def upsert_text_artifact( + self, + artifact: TextArtifact, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + vector_id: Optional[str] = None, + **kwargs, + ) -> str: + raise NotImplementedError(f"{self.__class__.__name__} does not support text artifact upsert.") + + def upsert_text( + self, + string: str, + vector_id: Optional[str] = None, + namespace: Optional[str] = None, + meta: Optional[dict] = None, + **kwargs, + ) -> str: + raise NotImplementedError(f"{self.__class__.__name__} does not support text upsert.") + + def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: + raise NotImplementedError(f"{self.__class__.__name__} does not support entry loading.") + + def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + raise NotImplementedError(f"{self.__class__.__name__} does not support entry loading.") + + def load_artifacts(self, namespace: Optional[str] = None) -> ListArtifact: + raise NotImplementedError(f"{self.__class__.__name__} does not support Artifact loading.") + + def query( + self, + query: str, + count: Optional[int] = None, + namespace: Optional[str] = None, + include_vectors: Optional[bool] = None, + distance_metric: Optional[str] = None, + # GriptapeCloudKnowledgeBaseVectorStoreDriver-specific params: + filter: Optional[dict] = None, + **kwargs, + ) -> list[BaseVectorStoreDriver.Entry]: + """Performs a query on the Knowledge Base. + + Performs a query on the Knowledge Base and returns Artifacts with close vector proximity to the query, optionally filtering to only those that match the provided filter(s). + """ + url = urljoin(self.base_url.strip("/"), f"/api/knowledge-bases/{self.knowledge_base_id}/query") + + request: dict[str, Any] = { + "query": query, + "count": count, + "distance_metric": distance_metric, + "filter": filter, + "include_vectors": include_vectors, + } + request = {k: v for k, v in request.items() if v is not None} + + response = requests.post(url, json=request, headers=self.headers).json() + entries = response.get("entries", []) + entry_list = [BaseVectorStoreDriver.Entry.from_dict(entry) for entry in entries] + return entry_list + + def delete_vector(self, vector_id: str): + raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py b/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py new file mode 100644 index 000000000..957edebb8 --- /dev/null +++ b/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py @@ -0,0 +1,69 @@ +import pytest +import uuid +from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver + + +class TestGriptapeCloudKnowledgeBaseVectorStoreDriver: + test_ids = [str(uuid.uuid4()), str(uuid.uuid4())] + test_vecs = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]] + test_namespaces = [str(uuid.uuid4()), str(uuid.uuid4())] + test_metas = [{"key": "value1"}, {"key": "value2"}] + test_scores = [0.7, 0.8] + + @pytest.fixture + def driver(self, mocker): + test_entries = { + "entries": [ + { + "id": self.test_ids[0], + "vector": self.test_vecs[0], + "namespace": self.test_namespaces[0], + "meta": self.test_metas[0], + "score": self.test_scores[0], + }, + { + "id": self.test_ids[1], + "vector": self.test_vecs[1], + "namespace": self.test_namespaces[1], + "meta": self.test_metas[1], + "score": self.test_scores[1], + }, + ] + } + + mock_response = mocker.Mock() + mock_response.status_code = 200 + mock_response.json.return_value = test_entries + mocker.patch("requests.post", return_value=mock_response) + + return GriptapeCloudKnowledgeBaseVectorStoreDriver(api_key="foo bar", knowledge_base_id="1") + + def test_query(self, driver): + result = driver.query( + "some query", count=10, namespace="foo", include_vectors=True, distance_metric="bar", filter={"foo": "bar"} + ) + + assert result[0].id == self.test_ids[0] + assert result[1].id == self.test_ids[1] + assert result[0].vector == self.test_vecs[0] + assert result[1].vector == self.test_vecs[1] + assert result[0].namespace == self.test_namespaces[0] + assert result[1].namespace == self.test_namespaces[1] + assert result[0].meta == self.test_metas[0] + assert result[1].meta == self.test_metas[1] + assert result[0].score == self.test_scores[0] + assert result[1].score == self.test_scores[1] + + def test_query_defaults(self, driver): + result = driver.query("some query") + + assert result[0].id == self.test_ids[0] + assert result[1].id == self.test_ids[1] + assert result[0].vector == self.test_vecs[0] + assert result[1].vector == self.test_vecs[1] + assert result[0].namespace == self.test_namespaces[0] + assert result[1].namespace == self.test_namespaces[1] + assert result[0].meta == self.test_metas[0] + assert result[1].meta == self.test_metas[1] + assert result[0].score == self.test_scores[0] + assert result[1].score == self.test_scores[1] From 3bf5876457529e2660940f57b23b0f7f9b6621fe Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 12 Jul 2024 14:15:46 -0700 Subject: [PATCH 156/238] Add ruff rule for pygrep-hooks (#966) --- griptape/artifacts/list_artifact.py | 2 +- griptape/chunkers/base_chunker.py | 2 +- .../griptape_cloud_event_listener_driver.py | 2 +- .../file_manager/amazon_s3_file_manager_driver.py | 2 +- .../drivers/file_manager/local_file_manager_driver.py | 2 +- .../prompt/amazon_sagemaker_jumpstart_prompt_driver.py | 2 +- griptape/drivers/sql/amazon_redshift_sql_driver.py | 2 +- griptape/drivers/sql/snowflake_sql_driver.py | 4 ++-- ...riptape_cloud_knowledge_base_vector_store_driver.py | 6 ++++-- .../drivers/vector/pgvector_vector_store_driver.py | 6 +++--- griptape/drivers/vector/redis_vector_store_driver.py | 2 +- griptape/engines/extraction/base_extraction_engine.py | 2 +- griptape/engines/rag/stages/base_rag_stage.py | 3 ++- griptape/engines/rag/stages/query_rag_stage.py | 5 +++-- griptape/engines/summary/prompt_summary_engine.py | 2 +- griptape/memory/task/storage/text_artifact_storage.py | 2 +- griptape/memory/task/task_memory.py | 2 +- griptape/mixins/activity_mixin.py | 4 ++-- griptape/mixins/media_artifact_file_output_mixin.py | 4 ++-- griptape/mixins/rule_mixin.py | 4 ++-- griptape/schemas/polymorphic_schema.py | 6 +++--- griptape/structures/agent.py | 2 +- griptape/structures/structure.py | 10 +++++----- griptape/tasks/base_image_generation_task.py | 4 ++-- griptape/tasks/toolkit_task.py | 2 +- griptape/tools/base_google_client.py | 4 ++-- griptape/tools/base_tool.py | 2 +- griptape/tools/calculator/tool.py | 2 +- griptape/tools/computer/tool.py | 2 +- griptape/utils/chat.py | 4 ++-- griptape/utils/stream.py | 2 +- pyproject.toml | 1 + 32 files changed, 53 insertions(+), 48 deletions(-) diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 23cca6461..9af86aa40 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -12,7 +12,7 @@ class ListArtifact(BaseArtifact): item_separator: str = field(default="\n\n", kw_only=True, metadata={"serializable": True}) validate_uniform_types: bool = field(default=False, kw_only=True, metadata={"serializable": True}) - @value.validator # pyright: ignore + @value.validator # pyright: ignore[reportAttributeAccessIssue] def validate_value(self, _, value: list[BaseArtifact]) -> None: if self.validate_uniform_types and len(value) > 0: first_type = type(value[0]) diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index a6258d43b..bf298baf4 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -24,7 +24,7 @@ class BaseChunker(ABC): default=Factory(lambda self: self.tokenizer.max_input_tokens, takes_self=True), kw_only=True ) - @max_tokens.validator # pyright: ignore + @max_tokens.validator # pyright: ignore[reportAttributeAccessIssue] def validate_max_tokens(self, _, max_tokens: int) -> None: if max_tokens < 0: raise ValueError("max_tokens must be 0 or greater.") diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 0ecf17d9b..e89ab6da0 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -29,7 +29,7 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): ) structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) - @structure_run_id.validator # pyright: ignore + @structure_run_id.validator # pyright: ignore[reportAttributeAccessIssue] def validate_run_id(self, _, structure_run_id: str): if structure_run_id is None: raise ValueError( diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index d9eae9696..84e49ecd3 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -31,7 +31,7 @@ class AmazonS3FileManagerDriver(BaseFileManagerDriver): workdir: str = field(default="/", kw_only=True) s3_client: Any = field(default=Factory(lambda self: self.session.client("s3"), takes_self=True), kw_only=True) - @workdir.validator # pyright: ignore + @workdir.validator # pyright: ignore[reportAttributeAccessIssue] def validate_workdir(self, _, workdir: str) -> None: if not Path(workdir).is_absolute(): raise ValueError("Workdir must be an absolute path") diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index 3dea4612b..ad681e24b 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -18,7 +18,7 @@ class LocalFileManagerDriver(BaseFileManagerDriver): workdir: str = field(default=Factory(lambda: os.getcwd()), kw_only=True) - @workdir.validator # pyright: ignore + @workdir.validator # pyright: ignore[reportAttributeAccessIssue] def validate_workdir(self, _, workdir: str) -> None: if not Path(workdir).is_absolute(): raise ValueError("Workdir must be an absolute path") diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 9eafed64a..6bc83954e 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -37,7 +37,7 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): kw_only=True, ) - @stream.validator # pyright: ignore + @stream.validator # pyright: ignore[reportAttributeAccessIssue] def validate_stream(self, _, stream): if stream: raise ValueError("streaming is not supported") diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index edb7d39cb..00391dc63 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -24,7 +24,7 @@ class AmazonRedshiftSqlDriver(BaseSqlDriver): default=Factory(lambda self: self.session.client("redshift-data"), takes_self=True), kw_only=True ) - @workgroup_name.validator # pyright: ignore + @workgroup_name.validator # pyright: ignore[reportAttributeAccessIssue] def validate_params(self, _, workgroup_name: Optional[str]) -> None: if not self.cluster_identifier and not self.workgroup_name: raise ValueError("Provide a value for one of `cluster_identifier` or `workgroup_name`") diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index 2b89ec720..7af4c78cc 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -27,7 +27,7 @@ class SnowflakeSqlDriver(BaseSqlDriver): kw_only=True, ) - @connection_func.validator # pyright: ignore + @connection_func.validator # pyright: ignore[reportFunctionMemberAccess] def validate_connection_func(self, _, connection_func: Callable[[], SnowflakeConnection]) -> None: snowflake_connection = connection_func() snowflake = import_optional_dependency("snowflake") @@ -37,7 +37,7 @@ def validate_connection_func(self, _, connection_func: Callable[[], SnowflakeCon if not snowflake_connection.schema or not snowflake_connection.database: raise ValueError("Provide a schema and database for the Snowflake connection") - @engine.validator # pyright: ignore + @engine.validator # pyright: ignore[reportAttributeAccessIssue] def validate_engine_url(self, _, engine: Engine) -> None: if not engine.url.render_as_string().startswith("snowflake://"): raise ValueError("Provide a Snowflake connection") diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index 0c7d5c961..416d5e258 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -1,8 +1,10 @@ +from typing import Any, Optional from urllib.parse import urljoin + import requests -from typing import Optional, Any from attrs import Factory, define, field -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import BaseEmbeddingDriver, BaseVectorStoreDriver, DummyEmbeddingDriver diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 3b3e5646f..01747c35e 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -31,7 +31,7 @@ class PgVectorVectorStoreDriver(BaseVectorStoreDriver): table_name: str = field(kw_only=True, metadata={"serializable": True}) _model: Any = field(default=Factory(lambda self: self.default_vector_model(), takes_self=True)) - @connection_string.validator # pyright: ignore + @connection_string.validator # pyright: ignore[reportAttributeAccessIssue] def validate_connection_string(self, _, connection_string: Optional[str]) -> None: # If an engine is provided, the connection string is not used. if self.engine is not None: @@ -44,7 +44,7 @@ def validate_connection_string(self, _, connection_string: Optional[str]) -> Non if not connection_string.startswith("postgresql://"): raise ValueError("The connection string must describe a Postgres database connection") - @engine.validator # pyright: ignore + @engine.validator # pyright: ignore[reportAttributeAccessIssue] def validate_engine(self, _, engine: Optional[Engine]) -> None: # If a connection string is provided, an engine does not need to be provided. if self.connection_string is not None: @@ -141,7 +141,7 @@ def query( vector = self.embedding_driver.embed_string(query) # The query should return both the vector and the distance metric score. - query_result = session.query(self._model, op(vector).label("score")).order_by(op(vector)) # pyright: ignore + query_result = session.query(self._model, op(vector).label("score")).order_by(op(vector)) # pyright: ignore[reportOptionalCall] filter_kwargs: Optional[OrderedDict] = None diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 35a171cee..3008760b2 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -134,7 +134,7 @@ def query( query_params = {"vector": np.array(vector, dtype=np.float32).tobytes()} - results = self.client.ft(self.index).search(query_expression, query_params).docs # pyright: ignore + results = self.client.ft(self.index).search(query_expression, query_params).docs # pyright: ignore[reportArgumentType] query_results = [] for document in results: diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index cad3680bd..e1974ca9e 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -26,7 +26,7 @@ class BaseExtractionEngine(ABC): kw_only=True, ) - @max_token_multiplier.validator # pyright: ignore + @max_token_multiplier.validator # pyright: ignore[reportAttributeAccessIssue] def validate_max_token_multiplier(self, _, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index 8c94405e0..5484f6193 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from collections.abc import Sequence from concurrent import futures from typing import Callable @@ -19,4 +20,4 @@ def run(self, context: RagContext) -> RagContext: ... @property @abstractmethod - def modules(self) -> list[BaseRagModule]: ... + def modules(self) -> Sequence[BaseRagModule]: ... diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index 35f5df371..a131230ef 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -1,4 +1,5 @@ import logging +from collections.abc import Sequence from attrs import define, field @@ -13,8 +14,8 @@ class QueryRagStage(BaseRagStage): query_modules: list[BaseQueryRagModule] = field() @property - def modules(self) -> list[BaseRagModule]: - return self.query_modules # pyright: ignore + def modules(self) -> Sequence[BaseRagModule]: + return self.query_modules def run(self, context: RagContext) -> RagContext: logging.info(f"QueryStage: running {len(self.query_modules)} query generation modules in parallel") diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 01823ed08..1447c3c97 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -27,7 +27,7 @@ class PromptSummaryEngine(BaseSummaryEngine): kw_only=True, ) - @max_token_multiplier.validator # pyright: ignore + @max_token_multiplier.validator # pyright: ignore[reportAttributeAccessIssue] def validate_allowlist(self, _, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index f6bcf93d5..9bbf83433 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -22,7 +22,7 @@ class TextArtifactStorage(BaseArtifactStorage): csv_extraction_engine: Optional[CsvExtractionEngine] = field(default=None) json_extraction_engine: Optional[JsonExtractionEngine] = field(default=None) - @rag_engine.validator # pyright: ignore + @rag_engine.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rag_engine(self, _, rag_engine: str) -> None: if rag_engine is not None and self.retrieval_rag_module_name is None: raise ValueError("You have to set retrieval_rag_module_name if rag_engine is provided") diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index 2c3075576..2e0639adc 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -20,7 +20,7 @@ class TaskMemory(ActivityMixin): namespace_storage: dict[str, BaseArtifactStorage] = field(factory=dict, kw_only=True) namespace_metadata: dict[str, Any] = field(factory=dict, kw_only=True) - @artifact_storages.validator # pyright: ignore + @artifact_storages.validator # pyright: ignore[reportAttributeAccessIssue] def validate_artifact_storages(self, _, artifact_storage: dict[type, BaseArtifactStorage]) -> None: seen_types = [] diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 31f398482..7730e1b43 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -12,7 +12,7 @@ class ActivityMixin: allowlist: Optional[list[str]] = field(default=None, kw_only=True) denylist: Optional[list[str]] = field(default=None, kw_only=True) - @allowlist.validator # pyright: ignore + @allowlist.validator # pyright: ignore[reportAttributeAccessIssue] def validate_allowlist(self, _, allowlist: Optional[list[str]]) -> None: if allowlist is None: return @@ -23,7 +23,7 @@ def validate_allowlist(self, _, allowlist: Optional[list[str]]) -> None: for activity_name in allowlist: self._validate_tool_activity(activity_name) - @denylist.validator # pyright: ignore + @denylist.validator # pyright: ignore[reportAttributeAccessIssue] def validate_denylist(self, _, denylist: Optional[list[str]]) -> None: if denylist is None: return diff --git a/griptape/mixins/media_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py index b2a0d8ef9..36907634b 100644 --- a/griptape/mixins/media_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -14,7 +14,7 @@ class BlobArtifactFileOutputMixin: output_dir: Optional[str] = field(default=None, kw_only=True) output_file: Optional[str] = field(default=None, kw_only=True) - @output_dir.validator # pyright: ignore + @output_dir.validator # pyright: ignore[reportAttributeAccessIssue] def validate_output_dir(self, _, output_dir: str) -> None: if not output_dir: return @@ -22,7 +22,7 @@ def validate_output_dir(self, _, output_dir: str) -> None: if self.output_file: raise ValueError("Can't have both output_dir and output_file specified.") - @output_file.validator # pyright: ignore + @output_file.validator # pyright: ignore[reportAttributeAccessIssue] def validate_output_file(self, _, output_file: str) -> None: if not output_file: return diff --git a/griptape/mixins/rule_mixin.py b/griptape/mixins/rule_mixin.py index 04a487505..920c17c5b 100644 --- a/griptape/mixins/rule_mixin.py +++ b/griptape/mixins/rule_mixin.py @@ -19,7 +19,7 @@ class RuleMixin: rules: list[Rule] = field(factory=list, kw_only=True) structure: Optional[Structure] = field(default=None, kw_only=True) - @rulesets.validator # pyright: ignore + @rulesets.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: if not rulesets: return @@ -27,7 +27,7 @@ def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: if self.rules: raise ValueError("Can't have both rulesets and rules specified.") - @rules.validator # pyright: ignore + @rules.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rules(self, _, rules: list[Rule]) -> None: if not rules: return diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index 3fd7450ff..87772539c 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -49,7 +49,7 @@ def dump(self, obj, *, many=None, **kwargs): if not errors: return result else: - exc = ValidationError(errors, data=obj, valid_data=result) # pyright: ignore + exc = ValidationError(errors, data=obj, valid_data=result) # pyright: ignore[reportArgumentType] raise exc def _dump(self, obj, *, update_fields=True, **kwargs): @@ -70,7 +70,7 @@ def _dump(self, obj, *, update_fields=True, **kwargs): result = schema.dump(obj, many=False, **kwargs) if result is not None: - result[self.type_field] = obj_type # pyright: ignore + result[self.type_field] = obj_type # pyright: ignore[reportArgumentType,reportCallIssue] return result @@ -127,7 +127,7 @@ def _load(self, data, *, partial=None, unknown=None, **kwargs): return schema.load(data, many=False, partial=partial, unknown=unknown, **kwargs) - def validate(self, data, *, many=None, partial=None): # pyright: ignore + def validate(self, data, *, many=None, partial=None): # pyright: ignore[reportIncompatibleMethodOverride] try: self.load(data, many=many, partial=partial) except ValidationError as ve: diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 5d4c3054a..1392bfb27 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -24,7 +24,7 @@ class Agent(Structure): max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) fail_fast: bool = field(default=False, kw_only=True) - @fail_fast.validator # pyright: ignore + @fail_fast.validator # pyright: ignore[reportAttributeAccessIssue] def validate_fail_fast(self, _, fail_fast: bool) -> None: if fail_fast: raise ValueError("Agents cannot fail fast, as they can only have 1 task.") diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index fb6cd25cd..144394732 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -69,7 +69,7 @@ class Structure(ABC): _execution_args: tuple = () _logger: Optional[Logger] = None - @rulesets.validator # pyright: ignore + @rulesets.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: if not rulesets: return @@ -77,7 +77,7 @@ def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: if self.rules: raise ValueError("can't have both rulesets and rules specified") - @rules.validator # pyright: ignore + @rules.validator # pyright: ignore[reportAttributeAccessIssue] def validate_rules(self, _, rules: list[Rule]) -> None: if not rules: return @@ -96,17 +96,17 @@ def __attrs_post_init__(self) -> None: def __add__(self, other: BaseTask | list[BaseTask]) -> list[BaseTask]: return self.add_tasks(*other) if isinstance(other, list) else self + [other] - @prompt_driver.validator # pyright: ignore + @prompt_driver.validator # pyright: ignore[reportAttributeAccessIssue] def validate_prompt_driver(self, attribute, value): if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver` instead.") - @embedding_driver.validator # pyright: ignore + @embedding_driver.validator # pyright: ignore[reportAttributeAccessIssue] def validate_embedding_driver(self, attribute, value): if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.embedding_driver` instead.") - @stream.validator # pyright: ignore + @stream.validator # pyright: ignore[reportAttributeAccessIssue] def validate_stream(self, attribute, value): if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver.stream` instead.") diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 74cf2d04e..a6e8ad8ef 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -31,7 +31,7 @@ class BaseImageGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, negative_rulesets: list[Ruleset] = field(factory=list, kw_only=True) negative_rules: list[Rule] = field(factory=list, kw_only=True) - @negative_rulesets.validator # pyright: ignore + @negative_rulesets.validator # pyright: ignore[reportAttributeAccessIssue] def validate_negative_rulesets(self, _, negative_rulesets: list[Ruleset]) -> None: if not negative_rulesets: return @@ -39,7 +39,7 @@ def validate_negative_rulesets(self, _, negative_rulesets: list[Ruleset]) -> Non if self.negative_rules: raise ValueError("Can't have both negative_rulesets and negative_rules specified.") - @negative_rules.validator # pyright: ignore + @negative_rules.validator # pyright: ignore[reportAttributeAccessIssue] def validate_negative_rules(self, _, negative_rules: list[Rule]) -> None: if not negative_rules: return diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 6306fa7b3..9132f53f5 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -43,7 +43,7 @@ def __attrs_post_init__(self) -> None: if self.task_memory: self.set_default_tools_memory(self.task_memory) - @tools.validator # pyright: ignore + @tools.validator # pyright: ignore[reportAttributeAccessIssue] def validate_tools(self, _, tools: list[BaseTool]) -> None: tool_names = [t.name for t in tools] diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_client.py index 4a15770ec..63e6f0b31 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_client.py @@ -15,8 +15,8 @@ class BaseGoogleClient(BaseTool, ABC): service_account_credentials: dict = field(kw_only=True) def _build_client(self, scopes: list[str], service_name: str, version: str, owner_email: str) -> Any: - from google.oauth2 import service_account # pyright: ignore - from googleapiclient.discovery import build # pyright: ignore + from google.oauth2 import service_account + from googleapiclient.discovery import build credentials = service_account.Credentials.from_service_account_info( self.service_account_credentials, scopes=scopes diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 1e71e6a8f..b9cc21cdf 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -50,7 +50,7 @@ def __attrs_post_init__(self) -> None: if self.install_dependencies_on_init: self.install_dependencies(os.environ.copy()) - @output_memory.validator # pyright: ignore + @output_memory.validator # pyright: ignore[reportAttributeAccessIssue] def validate_output_memory(self, _, output_memory: dict[str, Optional[list[TaskMemory]]]) -> None: if output_memory: for activity_name, memory_list in output_memory.items(): diff --git a/griptape/tools/calculator/tool.py b/griptape/tools/calculator/tool.py index 02e5fe95e..04d6868e3 100644 --- a/griptape/tools/calculator/tool.py +++ b/griptape/tools/calculator/tool.py @@ -21,7 +21,7 @@ class Calculator(BaseTool): } ) def calculate(self, params: dict) -> BaseArtifact: - import numexpr # type: ignore + import numexpr try: expression = params["values"]["expression"] diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 565389a3f..06129bfd6 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -50,7 +50,7 @@ def __attrs_post_init__(self) -> None: self._tempdir = tempfile.TemporaryDirectory() self.local_workdir = self._tempdir.name - @docker_client.validator # pyright: ignore + @docker_client.validator # pyright: ignore[reportAttributeAccessIssue] def validate_docker_client(self, _, docker_client: DockerClient) -> None: if not docker_client: raise ValueError("Docker client can't be initialized: make sure the Docker daemon is running") diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index f78d311f9..032938706 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -25,9 +25,9 @@ class Chat: def default_output_fn(self, text: str) -> None: if self.structure.config.prompt_driver.stream: - print(text, end="", flush=True) # noqa T201 + print(text, end="", flush=True) # noqa: T201 else: - print(text) # noqa T201 + print(text) # noqa: T201 def start(self) -> None: if self.intro_text: diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 32e31ea7b..64f94e943 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -35,7 +35,7 @@ class Stream: structure: Structure = field() - @structure.validator # pyright: ignore + @structure.validator # pyright: ignore[reportAttributeAccessIssue] def validate_structure(self, _, structure: Structure): if structure and not structure.config.prompt_driver.stream: raise ValueError("prompt driver does not have streaming enabled, enable with stream=True") diff --git a/pyproject.toml b/pyproject.toml index 6e0b43917..e462fc7c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -212,6 +212,7 @@ select = [ "C901", # complex-structure "TCH", # flake8-type-checking "D", # pydocstyle + "PGH", # pygrep-hooks "I" # isort ] ignore = [ From 0a8e178e70791ac324dbcac67edc7eb258f0eb70 Mon Sep 17 00:00:00 2001 From: CJ Kindel Date: Fri, 12 Jul 2024 23:47:02 -0700 Subject: [PATCH 157/238] Fix: Qdrant query count not optional (#972) --- CHANGELOG.md | 1 + .../drivers/vector-store-drivers.md | 96 +++++-------------- .../vector/qdrant_vector_store_driver.py | 4 +- 3 files changed, 30 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97c34314a..a8d6002e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed ### Fixed +- Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. ## [0.28.2] - 2024-07-12 ### Fixed diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index ea2b72a56..c1f54ab2e 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -24,7 +24,6 @@ The [LocalVectorStoreDriver](../../reference/griptape/drivers/vector/local_vecto ```python import os -from griptape.artifacts import BaseArtifact from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader @@ -40,16 +39,11 @@ artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") # Upsert Artifacts into the Vector Store Driver [vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] -results = vector_store_driver.query( - "creativity", - count=3, - namespace="griptape" -) +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] print("\n\n".join(values)) - ``` ### Griptape Cloud Knowledge Base @@ -58,7 +52,6 @@ The [GriptapeCloudKnowledgeBaseVectorStoreDriver](../../reference/griptape/drive ```python import os -from griptape.artifacts import BaseArtifact from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver @@ -68,12 +61,11 @@ gt_cloud_knowledge_base_id = os.environ["GRIPTAPE_CLOUD_KB_ID"] vector_store_driver = GriptapeCloudKnowledgeBaseVectorStoreDriver(api_key=gt_cloud_api_key, knowledge_base_id=gt_cloud_knowledge_base_id) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] print("\n\n".join(values)) - ``` ### Pinecone @@ -86,31 +78,10 @@ The [PineconeVectorStoreDriver](../../reference/griptape/drivers/vector/pinecone Here is an example of how the Driver can be used to load and query information in a Pinecone cluster: ```python -import os -import hashlib -import json -from urllib.request import urlopen +import os from griptape.drivers import PineconeVectorStoreDriver, OpenAiEmbeddingDriver +from griptape.loaders import WebLoader -def load_data(driver: PineconeVectorStoreDriver) -> None: - response = urlopen( - "https://raw.githubusercontent.com/wedeploy-examples/" - "supermarket-web-example/master/products.json" - ) - - for product in json.loads(response.read()): - driver.upsert_text( - product["description"], - vector_id=hashlib.md5(product["title"].encode()).hexdigest(), - meta={ - "title": product["title"], - "description": product["description"], - "type": product["type"], - "price": product["price"], - "rating": product["rating"], - }, - namespace="supermarket-products", - ) # Initialize an Embedding Driver embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) @@ -118,18 +89,17 @@ embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) vector_store_driver = PineconeVectorStoreDriver( api_key=os.environ["PINECONE_API_KEY"], environment=os.environ["PINECONE_ENVIRONMENT"], - index_name=os.environ['PINECONE_INDEX_NAME'], + index_name=os.environ["PINECONE_INDEX_NAME"], embedding_driver=embedding_driver, ) -load_data(vector_store_driver) +# Load Artifacts from the web +artifacts = WebLoader(max_tokens=100).load("https://www.griptape.ai") -results = vector_store_driver.query( - "fruit", - count=3, - filter={"price": {"$lte": 15}, "rating": {"$gte": 4}}, - namespace="supermarket-products", -) +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] + +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -175,7 +145,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -227,7 +197,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -298,7 +268,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -341,7 +311,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -388,7 +358,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -450,7 +420,7 @@ vector_store_driver.upsert_text_artifacts( } ) -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] @@ -468,54 +438,40 @@ Here is an example of how the Driver can be used to query information in a Qdran ```python import os -from griptape.drivers import QdrantVectorStoreDriver, HuggingFaceHubEmbeddingDriver -from griptape.tokenizers import HuggingFaceTokenizer +from griptape.drivers import QdrantVectorStoreDriver, OpenAiEmbeddingDriver from griptape.loaders import WebLoader # Set up environment variables -embedding_model_name = "sentence-transformers/all-MiniLM-L6-v2" host = os.environ["QDRANT_CLUSTER_ENDPOINT"] -huggingface_token = os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"] +api_key = os.environ["QDRANT_CLUSTER_API_KEY"] -# Initialize HuggingFace Embedding Driver -embedding_driver = HuggingFaceHubEmbeddingDriver( - api_token=huggingface_token, - model=embedding_model_name, - tokenizer=HuggingFaceTokenizer(model=embedding_model_name, max_output_tokens=512), -) +# Initialize an Embedding Driver. +embedding_driver = OpenAiEmbeddingDriver(api_key=os.environ["OPENAI_API_KEY"]) -# Initialize Qdrant Vector Store Driver vector_store_driver = QdrantVectorStoreDriver( url=host, collection_name="griptape", content_payload_key="content", embedding_driver=embedding_driver, - api_key=os.environ["QDRANT_CLUSTER_API_KEY"], + api_key=api_key, ) # Load Artifacts from the web artifacts = WebLoader().load("https://www.griptape.ai") -# Encode text to get embeddings -embeddings = embedding_driver.embed_text_artifact(artifacts[0]) - # Recreate Qdrant collection vector_store_driver.client.recreate_collection( collection_name=vector_store_driver.collection_name, vectors_config={ - "size": len(embeddings), + "size": 1536, "distance": vector_store_driver.distance }, ) -# Upsert vector into Qdrant -vector_store_driver.upsert_vector( - vector=embeddings, - vector_id=str(artifacts[0].id), - content=artifacts[0].value -) +# Upsert Artifacts into the Vector Store Driver +[vector_store_driver.upsert_text_artifact(a, namespace="griptape") for a in artifacts] -results =vector_store_driver.query(query="What is griptape?") +results = vector_store_driver.query(query="What is griptape?") values = [r.to_artifact().value for r in results] diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index 34345b6df..a5162f754 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -106,7 +106,9 @@ def query( query_vector = self.embedding_driver.embed_string(query) # Create a search request - results = self.client.search(collection_name=self.collection_name, query_vector=query_vector, limit=count) + request = {"collection_name": self.collection_name, "query_vector": query_vector, "limit": count} + request = {k: v for k, v in request.items() if v is not None} + results = self.client.search(**request) # Convert results to QueryResult objects query_results = [ From e4f8d6fe66d360cf19f57a13d99e8082a3feb76f Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 09:34:35 -0700 Subject: [PATCH 158/238] Add flake8-future-annotations ruff rule (#973) --- griptape/artifacts/list_artifact.py | 8 ++++++-- griptape/common/reference.py | 2 ++ .../config/azure_openai_structure_config.py | 2 ++ griptape/config/structure_config.py | 2 ++ .../dummy_audio_transcription_driver.py | 8 ++++++-- .../embedding/dummy_embedding_driver.py | 2 ++ .../dummy_image_generation_driver.py | 8 ++++++-- .../leonardo_image_generation_driver.py | 2 ++ .../image_query/dummy_image_query_driver.py | 8 +++++++- .../local_conversation_memory_driver.py | 2 ++ .../prompt/azure_openai_chat_prompt_driver.py | 8 ++++++-- griptape/drivers/rerank/base_rerank_driver.py | 6 +++++- griptape/drivers/sql/base_sql_driver.py | 2 ++ .../base_structure_run_driver.py | 6 +++++- .../dummy_text_to_speech_driver.py | 8 +++++++- .../vector/dummy_vector_store_driver.py | 2 ++ ...loud_knowledge_base_vector_store_driver.py | 8 ++++++-- .../vector/local_vector_store_driver.py | 2 ++ .../vector/pgvector_vector_store_driver.py | 2 ++ .../markdownify_web_scraper_driver.py | 2 ++ .../web_search/google_web_search_driver.py | 2 ++ .../engines/image_query/image_query_engine.py | 9 +++++++-- .../engines/rag/modules/base_rag_module.py | 8 ++++++-- .../footnote_prompt_response_rag_module.py | 10 ++++++++-- .../metadata_before_response_rag_module.py | 8 ++++++-- .../response/prompt_response_rag_module.py | 10 +++++++--- .../rulesets_before_response_rag_module.py | 10 ++++++++-- griptape/engines/rag/rag_engine.py | 8 ++++++-- .../engines/rag/stages/query_rag_stage.py | 12 +++++++++--- .../engines/rag/stages/response_rag_stage.py | 19 ++++++++++++------- .../engines/rag/stages/retrieval_rag_stage.py | 10 +++++++--- .../engines/summary/base_summary_engine.py | 8 ++++++-- .../engines/summary/prompt_summary_engine.py | 10 +++++++--- griptape/events/finish_prompt_event.py | 2 ++ griptape/events/finish_structure_run_event.py | 8 ++++++-- griptape/events/start_image_query_event.py | 2 ++ griptape/events/start_structure_run_event.py | 8 ++++++-- griptape/loaders/sql_loader.py | 8 ++++++-- griptape/memory/meta/meta_memory.py | 7 ++++++- .../task/storage/blob_artifact_storage.py | 2 ++ griptape/mixins/activity_mixin.py | 2 ++ griptape/mixins/exponential_backoff_mixin.py | 2 ++ griptape/rules/ruleset.py | 7 ++++++- griptape/schemas/base_schema.py | 2 ++ griptape/tools/base_google_client.py | 2 ++ griptape/tools/rest_api_client/tool.py | 2 ++ griptape/utils/dict_utils.py | 2 ++ griptape/utils/file_utils.py | 2 ++ griptape/utils/futures.py | 2 ++ griptape/utils/import_utils.py | 8 ++++++-- griptape/utils/j2.py | 2 ++ griptape/utils/python_runner.py | 2 ++ griptape/utils/reference_utils.py | 9 +++++++-- pyproject.toml | 3 ++- 54 files changed, 238 insertions(+), 60 deletions(-) diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 9af86aa40..8590f57d3 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -1,10 +1,14 @@ -from collections.abc import Sequence -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.artifacts import BaseArtifact +if TYPE_CHECKING: + from collections.abc import Sequence + @define class ListArtifact(BaseArtifact): diff --git a/griptape/common/reference.py b/griptape/common/reference.py index 40b709df9..66a62b83f 100644 --- a/griptape/common/reference.py +++ b/griptape/common/reference.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import uuid from typing import Optional diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_structure_config.py index 8361c7894..712815416 100644 --- a/griptape/config/azure_openai_structure_config.py +++ b/griptape/config/azure_openai_structure_config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Callable, Optional from attrs import Factory, define, field diff --git a/griptape/config/structure_config.py b/griptape/config/structure_config.py index fe7bc7342..0c2ed9743 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/structure_config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from attrs import Factory, define, field diff --git a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py index ba3da3231..9fc44b4b9 100644 --- a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py @@ -1,11 +1,15 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.artifacts import AudioArtifact, TextArtifact from griptape.drivers import BaseAudioTranscriptionDriver from griptape.exceptions import DummyException +if TYPE_CHECKING: + from griptape.artifacts import AudioArtifact, TextArtifact + @define class DummyAudioTranscriptionDriver(BaseAudioTranscriptionDriver): diff --git a/griptape/drivers/embedding/dummy_embedding_driver.py b/griptape/drivers/embedding/dummy_embedding_driver.py index dadd02897..09171060e 100644 --- a/griptape/drivers/embedding/dummy_embedding_driver.py +++ b/griptape/drivers/embedding/dummy_embedding_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from attrs import define, field from griptape.drivers import BaseEmbeddingDriver diff --git a/griptape/drivers/image_generation/dummy_image_generation_driver.py b/griptape/drivers/image_generation/dummy_image_generation_driver.py index ac1961821..788280a11 100644 --- a/griptape/drivers/image_generation/dummy_image_generation_driver.py +++ b/griptape/drivers/image_generation/dummy_image_generation_driver.py @@ -1,11 +1,15 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver from griptape.exceptions import DummyException +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact + @define class DummyImageGenerationDriver(BaseImageGenerationDriver): diff --git a/griptape/drivers/image_generation/leonardo_image_generation_driver.py b/griptape/drivers/image_generation/leonardo_image_generation_driver.py index 44d583683..6b6cdc61f 100644 --- a/griptape/drivers/image_generation/leonardo_image_generation_driver.py +++ b/griptape/drivers/image_generation/leonardo_image_generation_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import time from typing import Literal, Optional diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index 43d481c68..1df1c4c65 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -1,9 +1,15 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver from griptape.exceptions import DummyException +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact, TextArtifact + @define class DummyImageQueryDriver(BaseImageQueryDriver): diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index b94bd3065..d8c7e992e 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from typing import Optional diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 0f8c76ea9..dca64763b 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -1,11 +1,15 @@ -from typing import Callable, Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Callable, Optional import openai from attrs import Factory, define, field -from griptape.common import PromptStack from griptape.drivers import OpenAiChatPromptDriver +if TYPE_CHECKING: + from griptape.common import PromptStack + @define class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): diff --git a/griptape/drivers/rerank/base_rerank_driver.py b/griptape/drivers/rerank/base_rerank_driver.py index 8193a108d..c49e0f41b 100644 --- a/griptape/drivers/rerank/base_rerank_driver.py +++ b/griptape/drivers/rerank/base_rerank_driver.py @@ -1,8 +1,12 @@ +from __future__ import annotations + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING from attrs import define -from griptape.artifacts import TextArtifact +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact @define(kw_only=True) diff --git a/griptape/drivers/sql/base_sql_driver.py b/griptape/drivers/sql/base_sql_driver.py index db05615b9..0a872ebdc 100644 --- a/griptape/drivers/sql/base_sql_driver.py +++ b/griptape/drivers/sql/base_sql_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Any, Optional diff --git a/griptape/drivers/structure_run/base_structure_run_driver.py b/griptape/drivers/structure_run/base_structure_run_driver.py index 5bf2c9a5f..9dfc6c8ce 100644 --- a/griptape/drivers/structure_run/base_structure_run_driver.py +++ b/griptape/drivers/structure_run/base_structure_run_driver.py @@ -1,8 +1,12 @@ +from __future__ import annotations + from abc import ABC, abstractmethod +from typing import TYPE_CHECKING from attrs import Factory, define, field -from griptape.artifacts import BaseArtifact +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact @define diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py index bfef900c5..6472bdff8 100644 --- a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -1,9 +1,15 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver from griptape.exceptions import DummyException +if TYPE_CHECKING: + from griptape.artifacts.audio_artifact import AudioArtifact + @define class DummyTextToSpeechDriver(BaseTextToSpeechDriver): diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index d1a6fdf0e..998b7a747 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from attrs import Factory, define, field diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index 416d5e258..2f3417f04 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -1,12 +1,16 @@ -from typing import Any, Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional from urllib.parse import urljoin import requests from attrs import Factory, define, field -from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import BaseEmbeddingDriver, BaseVectorStoreDriver, DummyEmbeddingDriver +if TYPE_CHECKING: + from griptape.artifacts import ListArtifact, TextArtifact + @define class GriptapeCloudKnowledgeBaseVectorStoreDriver(BaseVectorStoreDriver): diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index 2ed76056e..f855f4228 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os import threading diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 01747c35e..61c789243 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import uuid from collections import OrderedDict from dataclasses import dataclass diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 3945c786a..92d2c6244 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re from typing import Optional diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py index 16d024f77..6d08a9561 100644 --- a/griptape/drivers/web_search/google_web_search_driver.py +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import requests diff --git a/griptape/engines/image_query/image_query_engine.py b/griptape/engines/image_query/image_query_engine.py index 9cb61cd92..d0a1e99d4 100644 --- a/griptape/engines/image_query/image_query_engine.py +++ b/griptape/engines/image_query/image_query_engine.py @@ -1,7 +1,12 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.artifacts import ImageArtifact, TextArtifact -from griptape.drivers import BaseImageQueryDriver +if TYPE_CHECKING: + from griptape.artifacts import ImageArtifact, TextArtifact + from griptape.drivers import BaseImageQueryDriver @define diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index 527fa8ad6..c90ed182c 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -1,11 +1,15 @@ +from __future__ import annotations + from abc import ABC from concurrent import futures -from typing import Any, Callable, Optional +from typing import TYPE_CHECKING, Any, Callable, Optional from attrs import Factory, define, field from griptape.common import Message, PromptStack -from griptape.engines.rag import RagContext + +if TYPE_CHECKING: + from griptape.engines.rag import RagContext @define(kw_only=True) diff --git a/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py b/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py index c64c8e5ee..3687d1942 100644 --- a/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/footnote_prompt_response_rag_module.py @@ -1,11 +1,17 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define from griptape import utils -from griptape.artifacts import TextArtifact -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import PromptResponseRagModule from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact + from griptape.engines.rag import RagContext + @define(kw_only=True) class FootnotePromptResponseRagModule(PromptResponseRagModule): diff --git a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py index 7e88a3a8a..d2d546213 100644 --- a/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py +++ b/griptape/engines/rag/modules/response/metadata_before_response_rag_module.py @@ -1,11 +1,15 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseBeforeResponseRagModule from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.engines.rag import RagContext + @define(kw_only=True) class MetadataBeforeResponseRagModule(BaseBeforeResponseRagModule): diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 915b430d8..7f9b4daf8 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -1,13 +1,17 @@ -from typing import Callable +from __future__ import annotations + +from typing import TYPE_CHECKING, Callable from attrs import Factory, define, field from griptape.artifacts.text_artifact import TextArtifact -from griptape.drivers import BasePromptDriver -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseResponseRagModule from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.drivers import BasePromptDriver + from griptape.engines.rag import RagContext + @define(kw_only=True) class PromptResponseRagModule(BaseResponseRagModule): diff --git a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py index eb22807a6..81b8410ce 100644 --- a/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py +++ b/griptape/engines/rag/modules/response/rulesets_before_response_rag_module.py @@ -1,10 +1,16 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.engines.rag import RagContext from griptape.engines.rag.modules import BaseBeforeResponseRagModule -from griptape.rules import Ruleset from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.engines.rag import RagContext + from griptape.rules import Ruleset + @define class RulesetsBeforeResponseRagModule(BaseBeforeResponseRagModule): diff --git a/griptape/engines/rag/rag_engine.py b/griptape/engines/rag/rag_engine.py index 9fdb13384..b3533bdba 100644 --- a/griptape/engines/rag/rag_engine.py +++ b/griptape/engines/rag/rag_engine.py @@ -1,9 +1,13 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape.engines.rag import RagContext -from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage + +if TYPE_CHECKING: + from griptape.engines.rag.stages import QueryRagStage, ResponseRagStage, RetrievalRagStage @define(kw_only=True) diff --git a/griptape/engines/rag/stages/query_rag_stage.py b/griptape/engines/rag/stages/query_rag_stage.py index a131230ef..5f9ccd019 100644 --- a/griptape/engines/rag/stages/query_rag_stage.py +++ b/griptape/engines/rag/stages/query_rag_stage.py @@ -1,13 +1,19 @@ +from __future__ import annotations + import logging -from collections.abc import Sequence +from typing import TYPE_CHECKING from attrs import define, field from griptape import utils -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseQueryRagModule, BaseRagModule from griptape.engines.rag.stages import BaseRagStage +if TYPE_CHECKING: + from collections.abc import Sequence + + from griptape.engines.rag import RagContext + from griptape.engines.rag.modules import BaseQueryRagModule, BaseRagModule + @define(kw_only=True) class QueryRagStage(BaseRagStage): diff --git a/griptape/engines/rag/stages/response_rag_stage.py b/griptape/engines/rag/stages/response_rag_stage.py index d6467bbb5..ac4451a34 100644 --- a/griptape/engines/rag/stages/response_rag_stage.py +++ b/griptape/engines/rag/stages/response_rag_stage.py @@ -1,16 +1,21 @@ +from __future__ import annotations + import logging +from typing import TYPE_CHECKING from attrs import define, field -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import ( - BaseAfterResponseRagModule, - BaseBeforeResponseRagModule, - BaseRagModule, - BaseResponseRagModule, -) from griptape.engines.rag.stages import BaseRagStage +if TYPE_CHECKING: + from griptape.engines.rag import RagContext + from griptape.engines.rag.modules import ( + BaseAfterResponseRagModule, + BaseBeforeResponseRagModule, + BaseRagModule, + BaseResponseRagModule, + ) + @define(kw_only=True) class ResponseRagStage(BaseRagStage): diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index f65d92f57..8f552af3a 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -1,15 +1,19 @@ +from __future__ import annotations + import itertools import logging -from typing import Optional +from typing import TYPE_CHECKING, Optional from attrs import define, field from griptape import utils from griptape.artifacts import TextArtifact -from griptape.engines.rag import RagContext -from griptape.engines.rag.modules import BaseRagModule, BaseRerankRagModule, BaseRetrievalRagModule from griptape.engines.rag.stages import BaseRagStage +if TYPE_CHECKING: + from griptape.engines.rag import RagContext + from griptape.engines.rag.modules import BaseRagModule, BaseRerankRagModule, BaseRetrievalRagModule + @define(kw_only=True) class RetrievalRagStage(BaseRagStage): diff --git a/griptape/engines/summary/base_summary_engine.py b/griptape/engines/summary/base_summary_engine.py index 108666bb7..e5ce6ee1e 100644 --- a/griptape/engines/summary/base_summary_engine.py +++ b/griptape/engines/summary/base_summary_engine.py @@ -1,10 +1,14 @@ +from __future__ import annotations + from abc import ABC, abstractmethod -from typing import Optional +from typing import TYPE_CHECKING, Optional from attrs import define from griptape.artifacts import ListArtifact, TextArtifact -from griptape.rules import Ruleset + +if TYPE_CHECKING: + from griptape.rules import Ruleset @define diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 1447c3c97..61fe2c2ea 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -1,4 +1,6 @@ -from typing import Optional, cast +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, cast from attrs import Factory, define, field @@ -6,11 +8,13 @@ from griptape.chunkers import BaseChunker, TextChunker from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message -from griptape.drivers import BasePromptDriver from griptape.engines import BaseSummaryEngine -from griptape.rules import Ruleset from griptape.utils import J2 +if TYPE_CHECKING: + from griptape.drivers import BasePromptDriver + from griptape.rules import Ruleset + @define class PromptSummaryEngine(BaseSummaryEngine): diff --git a/griptape/events/finish_prompt_event.py b/griptape/events/finish_prompt_event.py index 25f658a0f..f8a0b6885 100644 --- a/griptape/events/finish_prompt_event.py +++ b/griptape/events/finish_prompt_event.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from attrs import define, field diff --git a/griptape/events/finish_structure_run_event.py b/griptape/events/finish_structure_run_event.py index 588a5be31..3a7aeddb0 100644 --- a/griptape/events/finish_structure_run_event.py +++ b/griptape/events/finish_structure_run_event.py @@ -1,10 +1,14 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.artifacts import BaseArtifact from griptape.events.base_event import BaseEvent +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact + @define class FinishStructureRunEvent(BaseEvent): diff --git a/griptape/events/start_image_query_event.py b/griptape/events/start_image_query_event.py index 46001a43f..8deeaaa5a 100644 --- a/griptape/events/start_image_query_event.py +++ b/griptape/events/start_image_query_event.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from attrs import define, field from griptape.events.base_image_query_event import BaseImageQueryEvent diff --git a/griptape/events/start_structure_run_event.py b/griptape/events/start_structure_run_event.py index f0bb5528c..cc3989575 100644 --- a/griptape/events/start_structure_run_event.py +++ b/griptape/events/start_structure_run_event.py @@ -1,10 +1,14 @@ -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional from attrs import define, field -from griptape.artifacts import BaseArtifact from griptape.events.base_event import BaseEvent +if TYPE_CHECKING: + from griptape.artifacts import BaseArtifact + @define class StartStructureRunEvent(BaseEvent): diff --git a/griptape/loaders/sql_loader.py b/griptape/loaders/sql_loader.py index 2ac621a82..e4522796f 100644 --- a/griptape/loaders/sql_loader.py +++ b/griptape/loaders/sql_loader.py @@ -1,11 +1,15 @@ -from typing import Optional, cast +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, cast from attrs import define, field from griptape.artifacts import CsvRowArtifact -from griptape.drivers import BaseEmbeddingDriver, BaseSqlDriver from griptape.loaders import BaseLoader +if TYPE_CHECKING: + from griptape.drivers import BaseEmbeddingDriver, BaseSqlDriver + @define class SqlLoader(BaseLoader): diff --git a/griptape/memory/meta/meta_memory.py b/griptape/memory/meta/meta_memory.py index 2c580de28..66d813e50 100644 --- a/griptape/memory/meta/meta_memory.py +++ b/griptape/memory/meta/meta_memory.py @@ -1,6 +1,11 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.memory.meta import BaseMetaEntry +if TYPE_CHECKING: + from griptape.memory.meta import BaseMetaEntry @define diff --git a/griptape/memory/task/storage/blob_artifact_storage.py b/griptape/memory/task/storage/blob_artifact_storage.py index 25706c079..6199dc3a3 100644 --- a/griptape/memory/task/storage/blob_artifact_storage.py +++ b/griptape/memory/task/storage/blob_artifact_storage.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any from attrs import define, field diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 7730e1b43..a00a70001 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import inspect from typing import Callable, Optional diff --git a/griptape/mixins/exponential_backoff_mixin.py b/griptape/mixins/exponential_backoff_mixin.py index fb17a3400..3fb57599d 100644 --- a/griptape/mixins/exponential_backoff_mixin.py +++ b/griptape/mixins/exponential_backoff_mixin.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from abc import ABC from typing import Callable diff --git a/griptape/rules/ruleset.py b/griptape/rules/ruleset.py index 5d2cca62a..1f158411a 100644 --- a/griptape/rules/ruleset.py +++ b/griptape/rules/ruleset.py @@ -1,6 +1,11 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from attrs import define, field -from griptape.rules import Rule +if TYPE_CHECKING: + from griptape.rules import Rule @define diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 15dd96b5d..982c155e4 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -101,6 +101,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: Args: attrs_cls: An attrs class. """ + from collections.abc import Sequence from typing import Any from griptape.artifacts import BaseArtifact @@ -160,6 +161,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: "ToolAction": ToolAction, "Reference": Reference, "Run": Run, + "Sequence": Sequence, # Third party modules "Client": Client, "GenerativeModel": GenerativeModel, diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_client.py index 63e6f0b31..1269548f3 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_client.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from abc import ABC from typing import Any, Optional diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index fd63ab500..dbd294cd9 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from textwrap import dedent from typing import Optional from urllib.parse import urljoin diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index e142d3bb2..04be605df 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index ecefcc6b6..01dd1318a 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from concurrent import futures from typing import Optional diff --git a/griptape/utils/futures.py b/griptape/utils/futures.py index d69f4ea48..ea22e4c56 100644 --- a/griptape/utils/futures.py +++ b/griptape/utils/futures.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from concurrent import futures from typing import TypeVar diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index 9ad25be20..f0a8c205d 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -1,6 +1,10 @@ +from __future__ import annotations + from importlib import import_module -from types import ModuleType -from typing import Optional +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from types import ModuleType INSTALL_MAPPING = { "huggingface_hub": "huggingface-hub", diff --git a/griptape/utils/j2.py b/griptape/utils/j2.py index 52d7eb69e..70cf936db 100644 --- a/griptape/utils/j2.py +++ b/griptape/utils/j2.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from attrs import Factory, define, field diff --git a/griptape/utils/python_runner.py b/griptape/utils/python_runner.py index 009d17b7f..0b5c06587 100644 --- a/griptape/utils/python_runner.py +++ b/griptape/utils/python_runner.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib import sys from io import StringIO diff --git a/griptape/utils/reference_utils.py b/griptape/utils/reference_utils.py index 761ee3d24..b036e0eaf 100644 --- a/griptape/utils/reference_utils.py +++ b/griptape/utils/reference_utils.py @@ -1,5 +1,10 @@ -from griptape.artifacts import TextArtifact -from griptape.common import Reference +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from griptape.artifacts import TextArtifact + from griptape.common import Reference def references_from_artifacts(artifacts: list[TextArtifact]) -> list[Reference]: diff --git a/pyproject.toml b/pyproject.toml index d2cf664fc..a1ed38836 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -213,7 +213,8 @@ select = [ "TCH", # flake8-type-checking "D", # pydocstyle "PGH", # pygrep-hooks - "I" # isort + "I", # isort + "FA" # flake8-future-annotations ] ignore = [ "UP007", # non-pep604-annotation From 5edfae92d4d563c0007ae3e0e9c8e2af64c83b1a Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 10:32:42 -0700 Subject: [PATCH 159/238] Add flake8-commas ruff rule (#974) --- griptape/artifacts/base_artifact.py | 4 +- griptape/artifacts/csv_row_artifact.py | 5 +- griptape/chunkers/base_chunker.py | 9 ++- .../common/prompt_stack/messages/message.py | 2 +- .../config/amazon_bedrock_structure_config.py | 3 +- griptape/config/anthropic_structure_config.py | 2 +- .../config/azure_openai_structure_config.py | 4 +- griptape/config/base_structure_config.py | 4 +- griptape/config/cohere_structure_config.py | 4 +- griptape/config/google_structure_config.py | 2 +- griptape/config/openai_structure_config.py | 14 +++-- griptape/config/structure_config.py | 32 +++++++--- .../openai_audio_transcription_driver.py | 2 +- .../amazon_bedrock_cohere_embedding_driver.py | 11 +++- .../amazon_bedrock_titan_embedding_driver.py | 11 +++- ...on_sagemaker_jumpstart_embedding_driver.py | 3 +- .../azure_openai_embedding_driver.py | 13 ++-- .../huggingface_hub_embedding_driver.py | 3 +- .../embedding/openai_embedding_driver.py | 5 +- .../embedding/voyageai_embedding_driver.py | 5 +- .../base_event_listener_driver.py | 3 +- .../griptape_cloud_event_listener_driver.py | 8 ++- .../pusher_event_listener_driver.py | 6 +- .../amazon_s3_file_manager_driver.py | 5 +- .../file_manager/base_file_manager_driver.py | 2 +- .../amazon_bedrock_image_generation_driver.py | 35 ++++++++--- .../azure_openai_image_generation_driver.py | 10 ++- .../base_image_generation_driver.py | 10 ++- .../dummy_image_generation_driver.py | 5 +- .../leonardo_image_generation_driver.py | 21 +++++-- .../openai_image_generation_driver.py | 28 +++++++-- ...diffusion_image_generation_model_driver.py | 6 +- .../amazon_bedrock_image_query_driver.py | 8 ++- .../anthropic_image_query_driver.py | 3 +- .../azure_openai_image_query_driver.py | 10 ++- .../image_query/base_image_query_driver.py | 2 +- .../image_query/openai_image_query_driver.py | 6 +- .../redis_conversation_memory_driver.py | 8 ++- .../prompt/amazon_bedrock_prompt_driver.py | 36 +++++++---- ...mazon_sagemaker_jumpstart_prompt_driver.py | 6 +- .../drivers/prompt/anthropic_prompt_driver.py | 13 ++-- .../prompt/azure_openai_chat_prompt_driver.py | 10 ++- griptape/drivers/prompt/base_prompt_driver.py | 2 +- .../drivers/prompt/cohere_prompt_driver.py | 16 ++--- .../drivers/prompt/google_prompt_driver.py | 35 +++++++---- .../prompt/huggingface_hub_prompt_driver.py | 17 +++-- .../huggingface_pipeline_prompt_driver.py | 16 +++-- .../drivers/prompt/ollama_prompt_driver.py | 6 +- .../prompt/openai_chat_prompt_driver.py | 31 ++++++---- .../drivers/rerank/cohere_rerank_driver.py | 2 +- .../drivers/sql/amazon_redshift_sql_driver.py | 6 +- griptape/drivers/sql/snowflake_sql_driver.py | 3 +- .../griptape_cloud_structure_run_driver.py | 9 ++- .../elevenlabs_text_to_speech_driver.py | 5 +- .../openai_text_to_speech_driver.py | 11 +++- .../amazon_opensearch_vector_store_driver.py | 8 ++- .../azure_mongodb_vector_store_driver.py | 4 +- .../vector/base_vector_store_driver.py | 12 ++-- .../vector/dummy_vector_store_driver.py | 4 +- ...loud_knowledge_base_vector_store_driver.py | 8 ++- .../vector/local_vector_store_driver.py | 5 +- .../vector/marqo_vector_store_driver.py | 5 +- .../mongodb_atlas_vector_store_driver.py | 27 +++++--- .../vector/opensearch_vector_store_driver.py | 9 ++- .../vector/pgvector_vector_store_driver.py | 10 ++- .../vector/pinecone_vector_store_driver.py | 25 ++++++-- .../vector/qdrant_vector_store_driver.py | 8 ++- .../vector/redis_vector_store_driver.py | 10 ++- .../markdownify_web_scraper_driver.py | 5 +- .../trafilatura_web_scraper_driver.py | 5 +- .../duck_duck_go_web_search_driver.py | 4 +- .../web_search/google_web_search_driver.py | 2 +- .../extraction/base_extraction_engine.py | 8 ++- .../extraction/csv_extraction_engine.py | 4 +- .../extraction/json_extraction_engine.py | 8 +-- .../inpainting_image_generation_engine.py | 5 +- .../outpainting_image_generation_engine.py | 5 +- .../variation_image_generation_engine.py | 4 +- .../engines/rag/modules/base_rag_module.py | 4 +- .../response/prompt_response_rag_module.py | 4 +- .../text_loader_retrieval_rag_module.py | 2 +- .../vector_store_retrieval_rag_module.py | 2 +- griptape/engines/rag/stages/base_rag_stage.py | 2 +- .../engines/rag/stages/retrieval_rag_stage.py | 2 +- .../engines/summary/base_summary_engine.py | 5 +- .../engines/summary/prompt_summary_engine.py | 18 +++--- griptape/loaders/base_loader.py | 10 ++- griptape/loaders/base_text_loader.py | 9 ++- griptape/loaders/csv_loader.py | 8 ++- griptape/loaders/pdf_loader.py | 9 ++- griptape/loaders/text_loader.py | 14 +++-- griptape/loaders/web_loader.py | 3 +- .../structure/base_conversation_memory.py | 2 +- .../structure/summary_conversation_memory.py | 5 +- .../task/storage/text_artifact_storage.py | 6 +- griptape/memory/task/task_memory.py | 11 +++- griptape/mixins/activity_mixin.py | 2 +- griptape/structures/agent.py | 2 +- griptape/structures/pipeline.py | 2 +- griptape/structures/structure.py | 19 +++--- griptape/structures/workflow.py | 9 ++- griptape/tasks/actions_subtask.py | 7 ++- griptape/tasks/audio_transcription_task.py | 6 +- griptape/tasks/base_multi_text_input_task.py | 8 ++- griptape/tasks/base_task.py | 7 ++- griptape/tasks/base_text_input_task.py | 3 +- griptape/tasks/image_query_task.py | 2 +- .../tasks/inpainting_image_generation_task.py | 9 ++- .../outpainting_image_generation_task.py | 9 ++- .../tasks/prompt_image_generation_task.py | 10 ++- griptape/tasks/prompt_task.py | 8 ++- griptape/tasks/text_to_speech_task.py | 2 +- griptape/tasks/toolkit_task.py | 20 +++--- .../tasks/variation_image_generation_task.py | 8 ++- griptape/tokenizers/anthropic_tokenizer.py | 3 +- griptape/tokenizers/base_tokenizer.py | 7 ++- griptape/tokenizers/google_tokenizer.py | 3 +- griptape/tokenizers/huggingface_tokenizer.py | 3 +- griptape/tokenizers/openai_tokenizer.py | 11 ++-- griptape/tokenizers/voyageai_tokenizer.py | 3 +- .../tools/audio_transcription_client/tool.py | 7 ++- griptape/tools/aws_iam_client/tool.py | 11 ++-- griptape/tools/aws_s3_client/tool.py | 45 ++++++++------ griptape/tools/base_google_client.py | 3 +- griptape/tools/base_griptape_cloud_client.py | 3 +- griptape/tools/base_tool.py | 16 +++-- griptape/tools/calculator/tool.py | 6 +- griptape/tools/computer/tool.py | 12 ++-- griptape/tools/date_time/tool.py | 6 +- griptape/tools/email_client/tool.py | 14 ++--- griptape/tools/file_manager/tool.py | 20 +++--- griptape/tools/google_cal/tool.py | 16 +++-- griptape/tools/google_docs/tool.py | 51 ++++++++++----- griptape/tools/google_drive/tool.py | 62 ++++++++++++------- griptape/tools/google_gmail/tool.py | 9 ++- .../tool.py | 11 +++- griptape/tools/image_query_client/tool.py | 10 +-- .../tool.py | 33 +++++++--- griptape/tools/openweather_client/tool.py | 14 ++--- .../tool.py | 28 ++++++--- .../prompt_image_generation_client/tool.py | 6 +- griptape/tools/rag_client/tool.py | 2 +- griptape/tools/rest_api_client/tool.py | 28 ++++----- griptape/tools/sql_client/tool.py | 2 +- griptape/tools/structure_run_client/tool.py | 4 +- griptape/tools/task_memory_client/tool.py | 6 +- griptape/tools/text_to_speech_client/tool.py | 2 +- .../variation_image_generation_client/tool.py | 8 +-- griptape/tools/vector_store_client/tool.py | 11 ++-- griptape/tools/web_scraper/tool.py | 2 +- griptape/tools/web_search/tool.py | 6 +- griptape/utils/chat.py | 3 +- griptape/utils/file_utils.py | 2 +- griptape/utils/load_artifact_from_memory.py | 5 +- griptape/utils/stream.py | 3 +- pyproject.toml | 7 +-- 156 files changed, 972 insertions(+), 504 deletions(-) diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index ef82110af..249ae48c8 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -19,7 +19,9 @@ class BaseArtifact(SerializableMixin, ABC): reference: Optional[Reference] = field(default=None, kw_only=True, metadata={"serializable": True}) meta: dict[str, Any] = field(factory=dict, kw_only=True, metadata={"serializable": True}) name: str = field( - default=Factory(lambda self: self.id, takes_self=True), kw_only=True, metadata={"serializable": True} + default=Factory(lambda self: self.id, takes_self=True), + kw_only=True, + metadata={"serializable": True}, ) value: Any = field() diff --git a/griptape/artifacts/csv_row_artifact.py b/griptape/artifacts/csv_row_artifact.py index 74b8f1a4e..ce752e685 100644 --- a/griptape/artifacts/csv_row_artifact.py +++ b/griptape/artifacts/csv_row_artifact.py @@ -19,7 +19,10 @@ def __add__(self, other: BaseArtifact) -> CsvRowArtifact: def to_text(self) -> str: with io.StringIO() as csvfile: writer = csv.DictWriter( - csvfile, fieldnames=self.value.keys(), quoting=csv.QUOTE_MINIMAL, delimiter=self.delimiter + csvfile, + fieldnames=self.value.keys(), + quoting=csv.QUOTE_MINIMAL, + delimiter=self.delimiter, ) writer.writerow(self.value) diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index bf298baf4..4383ce569 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -15,13 +15,16 @@ class BaseChunker(ABC): DEFAULT_SEPARATORS = [ChunkSeparator(" ")] separators: list[ChunkSeparator] = field( - default=Factory(lambda self: self.DEFAULT_SEPARATORS, takes_self=True), kw_only=True + default=Factory(lambda self: self.DEFAULT_SEPARATORS, takes_self=True), + kw_only=True, ) tokenizer: BaseTokenizer = field( - default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), kw_only=True + default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), + kw_only=True, ) max_tokens: int = field( - default=Factory(lambda self: self.tokenizer.max_input_tokens, takes_self=True), kw_only=True + default=Factory(lambda self: self.tokenizer.max_input_tokens, takes_self=True), + kw_only=True, ) @max_tokens.validator # pyright: ignore[reportAttributeAccessIssue] diff --git a/griptape/common/prompt_stack/messages/message.py b/griptape/common/prompt_stack/messages/message.py index aaba331d9..4bed14efb 100644 --- a/griptape/common/prompt_stack/messages/message.py +++ b/griptape/common/prompt_stack/messages/message.py @@ -42,7 +42,7 @@ def is_text(self) -> bool: def to_text(self) -> str: return "".join( - [content.artifact.to_text() for content in self.content if isinstance(content, TextMessageContent)] + [content.artifact.to_text() for content in self.content if isinstance(content, TextMessageContent)], ) def to_artifact(self) -> BaseArtifact: diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_structure_config.py index c99b59026..3ad7f8f48 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_structure_config.py @@ -35,7 +35,8 @@ class AmazonBedrockStructureConfig(StructureConfig): prompt_driver: BasePromptDriver = field( default=Factory( lambda self: AmazonBedrockPromptDriver( - session=self.session, model="anthropic.claude-3-5-sonnet-20240620-v1:0" + session=self.session, + model="anthropic.claude-3-5-sonnet-20240620-v1:0", ), takes_self=True, ), diff --git a/griptape/config/anthropic_structure_config.py b/griptape/config/anthropic_structure_config.py index 58db8d476..1bb5bf49b 100644 --- a/griptape/config/anthropic_structure_config.py +++ b/griptape/config/anthropic_structure_config.py @@ -27,7 +27,7 @@ class AnthropicStructureConfig(StructureConfig): ) vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")) + lambda: LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")), ), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_structure_config.py index 712815416..ce0303e34 100644 --- a/griptape/config/azure_openai_structure_config.py +++ b/griptape/config/azure_openai_structure_config.py @@ -38,7 +38,9 @@ class AzureOpenAiStructureConfig(StructureConfig): azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} + kw_only=True, + default=None, + metadata={"serializable": False}, ) api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) prompt_driver: BasePromptDriver = field( diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index a75cb9e80..c2aa82d7e 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -29,7 +29,9 @@ class BaseStructureConfig(BaseConfig, ABC): embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) vector_store_driver: BaseVectorStoreDriver = field(kw_only=True, metadata={"serializable": True}) conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( - default=None, kw_only=True, metadata={"serializable": True} + default=None, + kw_only=True, + metadata={"serializable": True}, ) text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/config/cohere_structure_config.py b/griptape/config/cohere_structure_config.py index c4c9f7eef..2e896b9b0 100644 --- a/griptape/config/cohere_structure_config.py +++ b/griptape/config/cohere_structure_config.py @@ -23,7 +23,9 @@ class CohereStructureConfig(StructureConfig): embedding_driver: BaseEmbeddingDriver = field( default=Factory( lambda self: CohereEmbeddingDriver( - model="embed-english-v3.0", api_key=self.api_key, input_type="search_document" + model="embed-english-v3.0", + api_key=self.api_key, + input_type="search_document", ), takes_self=True, ), diff --git a/griptape/config/google_structure_config.py b/griptape/config/google_structure_config.py index fc0548ff7..66ed90b4b 100644 --- a/griptape/config/google_structure_config.py +++ b/griptape/config/google_structure_config.py @@ -25,7 +25,7 @@ class GoogleStructureConfig(StructureConfig): ) vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")) + lambda: LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")), ), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index cce828913..63806dfc9 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -22,7 +22,9 @@ @define class OpenAiStructureConfig(StructureConfig): prompt_driver: BasePromptDriver = field( - default=Factory(lambda: OpenAiChatPromptDriver(model="gpt-4o")), metadata={"serializable": True}, kw_only=True + default=Factory(lambda: OpenAiChatPromptDriver(model="gpt-4o")), + metadata={"serializable": True}, + kw_only=True, ) image_generation_driver: BaseImageGenerationDriver = field( default=Factory(lambda: OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512")), @@ -30,7 +32,9 @@ class OpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, ) image_query_driver: BaseImageQueryDriver = field( - default=Factory(lambda: OpenAiImageQueryDriver(model="gpt-4o")), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: OpenAiImageQueryDriver(model="gpt-4o")), + kw_only=True, + metadata={"serializable": True}, ) embedding_driver: BaseEmbeddingDriver = field( default=Factory(lambda: OpenAiEmbeddingDriver(model="text-embedding-3-small")), @@ -39,13 +43,15 @@ class OpenAiStructureConfig(StructureConfig): ) vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda: LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")) + lambda: LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")), ), kw_only=True, metadata={"serializable": True}, ) text_to_speech_driver: BaseTextToSpeechDriver = field( - default=Factory(lambda: OpenAiTextToSpeechDriver(model="tts")), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: OpenAiTextToSpeechDriver(model="tts")), + kw_only=True, + metadata={"serializable": True}, ) audio_transcription_driver: BaseAudioTranscriptionDriver = field( default=Factory(lambda: OpenAiAudioTranscriptionDriver(model="whisper-1")), diff --git a/griptape/config/structure_config.py b/griptape/config/structure_config.py index 0c2ed9743..ef95012ce 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/structure_config.py @@ -27,26 +27,42 @@ @define class StructureConfig(BaseStructureConfig): prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda: DummyPromptDriver()), + metadata={"serializable": True}, ) image_generation_driver: BaseImageGenerationDriver = field( - kw_only=True, default=Factory(lambda: DummyImageGenerationDriver()), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda: DummyImageGenerationDriver()), + metadata={"serializable": True}, ) image_query_driver: BaseImageQueryDriver = field( - kw_only=True, default=Factory(lambda: DummyImageQueryDriver()), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda: DummyImageQueryDriver()), + metadata={"serializable": True}, ) embedding_driver: BaseEmbeddingDriver = field( - kw_only=True, default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda: DummyEmbeddingDriver()), + metadata={"serializable": True}, ) vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda: DummyVectorStoreDriver()), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: DummyVectorStoreDriver()), + kw_only=True, + metadata={"serializable": True}, ) conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( - default=None, kw_only=True, metadata={"serializable": True} + default=None, + kw_only=True, + metadata={"serializable": True}, ) text_to_speech_driver: BaseTextToSpeechDriver = field( - default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: DummyTextToSpeechDriver()), + kw_only=True, + metadata={"serializable": True}, ) audio_transcription_driver: BaseAudioTranscriptionDriver = field( - default=Factory(lambda: DummyAudioTranscriptionDriver()), kw_only=True, metadata={"serializable": True} + default=Factory(lambda: DummyAudioTranscriptionDriver()), + kw_only=True, + metadata={"serializable": True}, ) diff --git a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py index c2098bb67..9240c3a4f 100644 --- a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py @@ -21,7 +21,7 @@ class OpenAiAudioTranscriptionDriver(BaseAudioTranscriptionDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) def try_run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index 41fbf2a92..4e4f4aa31 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -35,17 +35,22 @@ class AmazonBedrockCohereEmbeddingDriver(BaseEmbeddingDriver): input_type: str = field(default="search_query", kw_only=True) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), + kw_only=True, ) bedrock_client: Any = field( - default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), + kw_only=True, ) def try_embed_chunk(self, chunk: str) -> list[float]: payload = {"input_type": self.input_type, "texts": [chunk]} response = self.bedrock_client.invoke_model( - body=json.dumps(payload), modelId=self.model, accept="*/*", contentType="application/json" + body=json.dumps(payload), + modelId=self.model, + accept="*/*", + contentType="application/json", ) response_body = json.loads(response.get("body").read()) diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index 2eb83b033..5900d7d86 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -31,17 +31,22 @@ class AmazonBedrockTitanEmbeddingDriver(BaseEmbeddingDriver): model: str = field(default=DEFAULT_MODEL, kw_only=True, metadata={"serializable": True}) session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), + kw_only=True, ) bedrock_client: Any = field( - default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), + kw_only=True, ) def try_embed_chunk(self, chunk: str) -> list[float]: payload = {"inputText": chunk} response = self.bedrock_client.invoke_model( - body=json.dumps(payload), modelId=self.model, accept="application/json", contentType="application/json" + body=json.dumps(payload), + modelId=self.model, + accept="application/json", + contentType="application/json", ) response_body = json.loads(response.get("body").read()) diff --git a/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py index 413ad2fe2..c4feb8a1d 100644 --- a/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_sagemaker_jumpstart_embedding_driver.py @@ -16,7 +16,8 @@ class AmazonSageMakerJumpstartEmbeddingDriver(BaseEmbeddingDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) sagemaker_client: Any = field( - default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), + kw_only=True, ) endpoint: str = field(kw_only=True, metadata={"serializable": True}) custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index 420458e29..c1e601aef 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -24,16 +24,21 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): """ azure_deployment: str = field( - kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda self: self.model, takes_self=True), + metadata={"serializable": True}, ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} + kw_only=True, + default=None, + metadata={"serializable": False}, ) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) tokenizer: OpenAiTokenizer = field( - default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), + kw_only=True, ) client: openai.AzureOpenAI = field( default=Factory( @@ -47,5 +52,5 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): azure_ad_token_provider=self.azure_ad_token_provider, ), takes_self=True, - ) + ), ) diff --git a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py index 9a8fd5292..c1be2ec96 100644 --- a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py +++ b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py @@ -25,7 +25,8 @@ class HuggingFaceHubEmbeddingDriver(BaseEmbeddingDriver): client: InferenceClient = field( default=Factory( lambda self: import_optional_dependency("huggingface_hub").InferenceClient( - model=self.model, token=self.api_token + model=self.model, + token=self.api_token, ), takes_self=True, ), diff --git a/griptape/drivers/embedding/openai_embedding_driver.py b/griptape/drivers/embedding/openai_embedding_driver.py index 73c737d6b..0995fba68 100644 --- a/griptape/drivers/embedding/openai_embedding_driver.py +++ b/griptape/drivers/embedding/openai_embedding_driver.py @@ -37,10 +37,11 @@ class OpenAiEmbeddingDriver(BaseEmbeddingDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) tokenizer: OpenAiTokenizer = field( - default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), + kw_only=True, ) def try_embed_chunk(self, chunk: str) -> list[float]: diff --git a/griptape/drivers/embedding/voyageai_embedding_driver.py b/griptape/drivers/embedding/voyageai_embedding_driver.py index b29dd5692..c5e418ed1 100644 --- a/griptape/drivers/embedding/voyageai_embedding_driver.py +++ b/griptape/drivers/embedding/voyageai_embedding_driver.py @@ -27,8 +27,9 @@ class VoyageAiEmbeddingDriver(BaseEmbeddingDriver): api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) client: Any = field( default=Factory( - lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), takes_self=True - ) + lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), + takes_self=True, + ), ) tokenizer: VoyageAiTokenizer = field( default=Factory(lambda self: VoyageAiTokenizer(model=self.model, api_key=self.api_key), takes_self=True), diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 710e6382f..7792943f3 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -16,7 +16,8 @@ @define class BaseEventListenerDriver(ABC): futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + kw_only=True, ) batched: bool = field(default=True, kw_only=True) batch_size: int = field(default=10, kw_only=True) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index e89ab6da0..1520afbcc 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -21,11 +21,13 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): """ base_url: str = field( - default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True + default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), + kw_only=True, ) api_key: str = field(kw_only=True) headers: dict = field( - default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), + kw_only=True, ) structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) @@ -33,7 +35,7 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): def validate_run_id(self, _, structure_run_id: str): if structure_run_id is None: raise ValueError( - "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID)." + "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID).", ) def try_publish_event_payload(self, event_payload: dict) -> None: diff --git a/griptape/drivers/event_listener/pusher_event_listener_driver.py b/griptape/drivers/event_listener/pusher_event_listener_driver.py index 2e9de8d72..ce9a4fb34 100644 --- a/griptape/drivers/event_listener/pusher_event_listener_driver.py +++ b/griptape/drivers/event_listener/pusher_event_listener_driver.py @@ -22,7 +22,11 @@ class PusherEventListenerDriver(BaseEventListenerDriver): pusher_client: Pusher = field( default=Factory( lambda self: import_optional_dependency("pusher").Pusher( - app_id=self.app_id, key=self.key, secret=self.secret, cluster=self.cluster, ssl=True + app_id=self.app_id, + key=self.key, + secret=self.secret, + cluster=self.cluster, + ssl=True, ), takes_self=True, ), diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index 84e49ecd3..18b591b41 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -94,7 +94,10 @@ def _list_files_and_dirs(self, full_key: str, **kwargs) -> list[str]: paginator = self.s3_client.get_paginator("list_objects_v2") pages = paginator.paginate( - Bucket=self.bucket, Prefix=full_key, Delimiter="/", PaginationConfig=pagination_config + Bucket=self.bucket, + Prefix=full_key, + Delimiter="/", + PaginationConfig=pagination_config, ) files_and_dirs = [] for page in pages: diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index b69aa374d..5fdb84b8f 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -35,7 +35,7 @@ class BaseFileManagerDriver(ABC): "gif": loaders.ImageLoader(), "bmp": loaders.ImageLoader(), "tiff": loaders.ImageLoader(), - } + }, ), kw_only=True, ) diff --git a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py index a8f4c2d2e..7106c8192 100644 --- a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py +++ b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py @@ -28,7 +28,7 @@ class AmazonBedrockImageGenerationDriver(BaseMultiModelImageGenerationDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) bedrock_client: Any = field( - default=Factory(lambda self: self.session.client(service_name="bedrock-runtime"), takes_self=True) + default=Factory(lambda self: self.session.client(service_name="bedrock-runtime"), takes_self=True), ) image_width: int = field(default=512, kw_only=True, metadata={"serializable": True}) image_height: int = field(default=512, kw_only=True, metadata={"serializable": True}) @@ -36,7 +36,11 @@ class AmazonBedrockImageGenerationDriver(BaseMultiModelImageGenerationDriver): def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: request = self.image_generation_model_driver.text_to_image_request_parameters( - prompts, self.image_width, self.image_height, negative_prompts=negative_prompts, seed=self.seed + prompts, + self.image_width, + self.image_height, + negative_prompts=negative_prompts, + seed=self.seed, ) image_bytes = self._make_request(request) @@ -51,10 +55,16 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ ) def try_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: request = self.image_generation_model_driver.image_variation_request_parameters( - prompts, image=image, negative_prompts=negative_prompts, seed=self.seed + prompts, + image=image, + negative_prompts=negative_prompts, + seed=self.seed, ) image_bytes = self._make_request(request) @@ -76,7 +86,11 @@ def try_image_inpainting( negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: request = self.image_generation_model_driver.image_inpainting_request_parameters( - prompts, image=image, mask=mask, negative_prompts=negative_prompts, seed=self.seed + prompts, + image=image, + mask=mask, + negative_prompts=negative_prompts, + seed=self.seed, ) image_bytes = self._make_request(request) @@ -98,7 +112,11 @@ def try_image_outpainting( negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: request = self.image_generation_model_driver.image_outpainting_request_parameters( - prompts, image=image, mask=mask, negative_prompts=negative_prompts, seed=self.seed + prompts, + image=image, + mask=mask, + negative_prompts=negative_prompts, + seed=self.seed, ) image_bytes = self._make_request(request) @@ -114,7 +132,10 @@ def try_image_outpainting( def _make_request(self, request: dict) -> bytes: response = self.bedrock_client.invoke_model( - body=json.dumps(request), modelId=self.model, accept="application/json", contentType="application/json" + body=json.dumps(request), + modelId=self.model, + accept="application/json", + contentType="application/json", ) response_body = json.loads(response.get("body").read()) diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index d7ec7681a..85facda4c 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -22,12 +22,16 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): """ azure_deployment: str = field( - kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda self: self.model, takes_self=True), + metadata={"serializable": True}, ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} + kw_only=True, + default=None, + metadata={"serializable": False}, ) api_version: str = field(default="2024-02-01", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( @@ -42,5 +46,5 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): azure_ad_token_provider=self.azure_ad_token_provider, ), takes_self=True, - ) + ), ) diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index ee132605c..93666a513 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -39,7 +39,10 @@ def run_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ raise Exception("Failed to run text to image generation") def run_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: for attempt in self.retrying(): with attempt: @@ -93,7 +96,10 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ @abstractmethod def try_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: ... @abstractmethod diff --git a/griptape/drivers/image_generation/dummy_image_generation_driver.py b/griptape/drivers/image_generation/dummy_image_generation_driver.py index 788280a11..9d668c5b2 100644 --- a/griptape/drivers/image_generation/dummy_image_generation_driver.py +++ b/griptape/drivers/image_generation/dummy_image_generation_driver.py @@ -19,7 +19,10 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ raise DummyException(__class__.__name__, "try_text_to_image") def try_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: raise DummyException(__class__.__name__, "try_image_variation") diff --git a/griptape/drivers/image_generation/leonardo_image_generation_driver.py b/griptape/drivers/image_generation/leonardo_image_generation_driver.py index 6b6cdc61f..e32dbb4c7 100644 --- a/griptape/drivers/image_generation/leonardo_image_generation_driver.py +++ b/griptape/drivers/image_generation/leonardo_image_generation_driver.py @@ -42,7 +42,9 @@ class LeonardoImageGenerationDriver(BaseImageGenerationDriver): init_strength: Optional[float] = field(default=None, kw_only=True, metadata={"serializable": True}) control_net: bool = field(default=False, kw_only=True, metadata={"serializable": True}) control_net_type: Optional[Literal["POSE", "CANNY", "DEPTH"]] = field( - default=None, kw_only=True, metadata={"serializable": True} + default=None, + kw_only=True, + metadata={"serializable": True}, ) def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: @@ -63,14 +65,19 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ ) def try_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: if negative_prompts is None: negative_prompts = [] init_image_id = self._upload_init_image(image) generation_id = self._create_generation( - prompts=prompts, negative_prompts=negative_prompts, init_image_id=init_image_id + prompts=prompts, + negative_prompts=negative_prompts, + init_image_id=init_image_id, ) image_url = self._get_image_url(generation_id=generation_id) image_data = self._download_image(url=image_url) @@ -121,7 +128,10 @@ def _upload_init_image(self, image: ImageArtifact) -> str: return init_image_id def _create_generation( - self, prompts: list[str], negative_prompts: list[str], init_image_id: Optional[str] = None + self, + prompts: list[str], + negative_prompts: list[str], + init_image_id: Optional[str] = None, ) -> str: prompt = ", ".join(prompts) negative_prompt = ", ".join(negative_prompts) @@ -169,7 +179,8 @@ def _make_api_request(self, endpoint: str, request: dict, method: str = "POST") def _get_image_url(self, generation_id: str) -> str: for attempt in range(self.max_attempts): response = self.requests_session.get( - url=f"{self.api_base}/generations/{generation_id}", headers={"Authorization": f"Bearer {self.api_key}"} + url=f"{self.api_base}/generations/{generation_id}", + headers={"Authorization": f"Bearer {self.api_key}"}, ).json() if response["generations_by_pk"]["status"] == "PENDING": diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index d3e8ce727..54eab48ec 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -42,14 +42,20 @@ class OpenAiImageGenerationDriver(BaseImageGenerationDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) style: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) quality: Union[Literal["standard"], Literal["hd"]] = field( - default="standard", kw_only=True, metadata={"serializable": True} + default="standard", + kw_only=True, + metadata={"serializable": True}, ) image_size: Union[ - Literal["256x256"], Literal["512x512"], Literal["1024x1024"], Literal["1024x1792"], Literal["1792x1024"] + Literal["256x256"], + Literal["512x512"], + Literal["1024x1024"], + Literal["1024x1792"], + Literal["1792x1024"], ] = field(default="1024x1024", kw_only=True, metadata={"serializable": True}) response_format: Literal["b64_json"] = field(default="b64_json", kw_only=True, metadata={"serializable": True}) @@ -76,12 +82,18 @@ def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[ return self._parse_image_response(response, prompt) def try_image_variation( - self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None + self, + prompts: list[str], + image: ImageArtifact, + negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: image_size = self._dall_e_2_filter_image_size("variation") response = self.client.images.create_variation( - image=image.value, n=1, response_format=self.response_format, size=image_size + image=image.value, + n=1, + response_format=self.response_format, + size=image_size, ) return self._parse_image_response(response, "") @@ -97,7 +109,11 @@ def try_image_inpainting( prompt = ", ".join(prompts) response = self.client.images.edit( - prompt=prompt, image=image.value, mask=mask.value, response_format=self.response_format, size=image_size + prompt=prompt, + image=image.value, + mask=mask.value, + response_format=self.response_format, + size=image_size, ) return self._parse_image_response(response, prompt) diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 78bcecc87..92428e157 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -46,7 +46,11 @@ def text_to_image_request_parameters( seed: Optional[int] = None, ) -> dict: return self._request_parameters( - prompts, width=image_width, height=image_height, negative_prompts=negative_prompts, seed=seed + prompts, + width=image_width, + height=image_height, + negative_prompts=negative_prompts, + seed=seed, ) def image_variation_request_parameters( diff --git a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py index cc1d13f4e..46406d972 100644 --- a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py +++ b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py @@ -18,14 +18,18 @@ class AmazonBedrockImageQueryDriver(BaseMultiModelImageQueryDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) bedrock_client: Any = field( - default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), + kw_only=True, ) def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: payload = self.image_query_model_driver.image_query_request_parameters(query, images, self.max_tokens) response = self.bedrock_client.invoke_model( - modelId=self.model, contentType="application/json", accept="application/json", body=json.dumps(payload) + modelId=self.model, + contentType="application/json", + accept="application/json", + body=json.dumps(payload), ) response_body = json.loads(response.get("body").read()) diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index fe39177ab..c4756783e 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -23,7 +23,8 @@ class AnthropicImageQueryDriver(BaseImageQueryDriver): model: str = field(kw_only=True, metadata={"serializable": True}) client: Any = field( default=Factory( - lambda self: import_optional_dependency("anthropic").Anthropic(api_key=self.api_key), takes_self=True + lambda self: import_optional_dependency("anthropic").Anthropic(api_key=self.api_key), + takes_self=True, ), kw_only=True, ) diff --git a/griptape/drivers/image_query/azure_openai_image_query_driver.py b/griptape/drivers/image_query/azure_openai_image_query_driver.py index ad37737c7..04492e471 100644 --- a/griptape/drivers/image_query/azure_openai_image_query_driver.py +++ b/griptape/drivers/image_query/azure_openai_image_query_driver.py @@ -22,12 +22,16 @@ class AzureOpenAiImageQueryDriver(OpenAiImageQueryDriver): """ azure_deployment: str = field( - kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda self: self.model, takes_self=True), + metadata={"serializable": True}, ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} + kw_only=True, + default=None, + metadata={"serializable": False}, ) api_version: str = field(default="2024-02-01", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( @@ -42,5 +46,5 @@ class AzureOpenAiImageQueryDriver(OpenAiImageQueryDriver): azure_ad_token_provider=self.azure_ad_token_provider, ), takes_self=True, - ) + ), ) diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 3f606e749..88fbb5160 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -21,7 +21,7 @@ class BaseImageQueryDriver(SerializableMixin, ExponentialBackoffMixin, ABC): def before_run(self, query: str, images: list[ImageArtifact]) -> None: if self.structure: self.structure.publish_event( - StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]) + StartImageQueryEvent(query=query, images_info=[image.to_text() for image in images]), ) def after_run(self, result: str) -> None: diff --git a/griptape/drivers/image_query/openai_image_query_driver.py b/griptape/drivers/image_query/openai_image_query_driver.py index 693f67184..b607c97f5 100644 --- a/griptape/drivers/image_query/openai_image_query_driver.py +++ b/griptape/drivers/image_query/openai_image_query_driver.py @@ -28,12 +28,12 @@ class OpenAiImageQueryDriver(BaseImageQueryDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: message_parts: list[ChatCompletionContentPartParam] = [ - ChatCompletionContentPartTextParam(type="text", text=query) + ChatCompletionContentPartTextParam(type="text", text=query), ] for image in images: @@ -41,7 +41,7 @@ def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: ChatCompletionContentPartImageParam( type="image_url", image_url={"url": f"data:{image.mime_type};base64,{image.base64}", "detail": self.image_quality}, - ) + ), ) messages = ChatCompletionUserMessageParam(content=message_parts, role="user") diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py index 531b009af..2ba3737e8 100644 --- a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -40,10 +40,14 @@ class RedisConversationMemoryDriver(BaseConversationMemoryDriver): client: Redis = field( default=Factory( lambda self: import_optional_dependency("redis").Redis( - host=self.host, port=self.port, db=self.db, password=self.password, decode_responses=False + host=self.host, + port=self.port, + db=self.db, + password=self.password, + decode_responses=False, ), takes_self=True, - ) + ), ) def store(self, memory: BaseConversationMemory) -> None: diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 824e3abcc..4cb5801d3 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -44,11 +44,13 @@ class AmazonBedrockPromptDriver(BasePromptDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) bedrock_client: Any = field( - default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("bedrock-runtime"), takes_self=True), + kw_only=True, ) additional_model_request_fields: dict = field(default=Factory(dict), kw_only=True) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: AmazonBedrockTokenizer(model=self.model), takes_self=True), + kw_only=True, ) use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) tool_choice: dict = field(default=Factory(lambda: {"auto": {}}), kw_only=True, metadata={"serializable": True}) @@ -76,7 +78,10 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: elif "metadata" in event: usage = event["metadata"]["usage"] yield DeltaMessage( - usage=DeltaMessage.Usage(input_tokens=usage["inputTokens"], output_tokens=usage["outputTokens"]) + usage=DeltaMessage.Usage( + input_tokens=usage["inputTokens"], + output_tokens=usage["outputTokens"], + ), ) else: raise Exception("model response is empty") @@ -122,10 +127,10 @@ def __to_bedrock_tools(self, tools: list[BaseTool]) -> list[dict]: "description": tool.activity_description(activity), "inputSchema": { "json": (tool.activity_schema(activity) or Schema({})).json_schema( - "http://json-schema.org/draft-07/schema#" - ) + "http://json-schema.org/draft-07/schema#", + ), }, - } + }, } for tool in tools for activity in tool.activities() @@ -146,7 +151,7 @@ def __to_bedrock_message_content(self, content: BaseMessageContent) -> dict: "toolUseId": action_call.tag, "name": f"{action_call.name}_{action_call.path}", "input": action_call.input, - } + }, } elif isinstance(content, ActionResultMessageContent): artifact = content.artifact @@ -161,7 +166,7 @@ def __to_bedrock_message_content(self, content: BaseMessageContent) -> dict: "toolUseId": content.action.tag, "content": message_content, "status": "error" if isinstance(artifact, ErrorArtifact) else "success", - } + }, } else: raise ValueError(f"Unsupported content type: {type(content)}") @@ -182,9 +187,12 @@ def __to_prompt_stack_message_content(self, content: dict) -> BaseMessageContent return ActionCallMessageContent( artifact=ActionArtifact( value=ToolAction( - tag=content["toolUse"]["toolUseId"], name=name, path=path, input=content["toolUse"]["input"] - ) - ) + tag=content["toolUse"]["toolUseId"], + name=name, + path=path, + input=content["toolUse"]["input"], + ), + ), ) else: raise ValueError(f"Unsupported message content type: {content}") @@ -204,7 +212,8 @@ def __to_prompt_stack_delta_message_content(self, event: dict) -> BaseDeltaMessa ) elif "text" in content_block: return TextDeltaMessageContent( - content_block["text"], index=event["contentBlockStart"]["contentBlockIndex"] + content_block["text"], + index=event["contentBlockStart"]["contentBlockIndex"], ) else: raise ValueError(f"Unsupported message content type: {event}") @@ -213,7 +222,8 @@ def __to_prompt_stack_delta_message_content(self, event: dict) -> BaseDeltaMessa if "text" in content_block_delta["delta"]: return TextDeltaMessageContent( - content_block_delta["delta"]["text"], index=content_block_delta["contentBlockIndex"] + content_block_delta["delta"]["text"], + index=content_block_delta["contentBlockIndex"], ) elif "toolUse" in content_block_delta["delta"]: return ActionCallDeltaMessageContent( diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 6bc83954e..70862f55f 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -23,7 +23,8 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) sagemaker_client: Any = field( - default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("sagemaker-runtime"), takes_self=True), + kw_only=True, ) endpoint: str = field(kw_only=True, metadata={"serializable": True}) custom_attributes: str = field(default="accept_eula=true", kw_only=True, metadata={"serializable": True}) @@ -32,7 +33,8 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), + takes_self=True, ), kw_only=True, ) diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 9eed9c275..14be9a26b 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -55,12 +55,14 @@ class AnthropicPromptDriver(BasePromptDriver): model: str = field(kw_only=True, metadata={"serializable": True}) client: Client = field( default=Factory( - lambda self: import_optional_dependency("anthropic").Anthropic(api_key=self.api_key), takes_self=True + lambda self: import_optional_dependency("anthropic").Anthropic(api_key=self.api_key), + takes_self=True, ), kw_only=True, ) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: AnthropicTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: AnthropicTokenizer(model=self.model), takes_self=True), + kw_only=True, ) top_p: float = field(default=0.999, kw_only=True, metadata={"serializable": True}) top_k: int = field(default=250, kw_only=True, metadata={"serializable": True}) @@ -189,14 +191,15 @@ def __to_prompt_stack_message_content(self, content: ContentBlock) -> BaseMessag return ActionCallMessageContent( artifact=ActionArtifact( - value=ToolAction(tag=content.id, name=name, path=path, input=content.input) # pyright: ignore[reportArgumentType] - ) + value=ToolAction(tag=content.id, name=name, path=path, input=content.input), # pyright: ignore[reportArgumentType] + ), ) else: raise ValueError(f"Unsupported message content type: {content.type}") def __to_prompt_stack_delta_message_content( - self, event: ContentBlockDeltaEvent | ContentBlockStartEvent + self, + event: ContentBlockDeltaEvent | ContentBlockStartEvent, ) -> BaseDeltaMessageContent: if event.type == "content_block_start": content_block = event.content_block diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index dca64763b..b08b51b69 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -25,12 +25,16 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): """ azure_deployment: str = field( - kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda self: self.model, takes_self=True), + metadata={"serializable": True}, ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( - kw_only=True, default=None, metadata={"serializable": False} + kw_only=True, + default=None, + metadata={"serializable": False}, ) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( @@ -45,7 +49,7 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): azure_ad_token_provider=self.azure_ad_token_provider, ), takes_self=True, - ) + ), ) def _base_params(self, prompt_stack: PromptStack) -> dict: diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 3f957c34e..57cb7272d 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -62,7 +62,7 @@ def after_run(self, result: Message) -> None: result=result.value, input_token_count=result.usage.input_tokens, output_token_count=result.usage.output_tokens, - ) + ), ) def run(self, prompt_stack: PromptStack) -> Message: diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index d44016d19..0a28a9c59 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -45,10 +45,10 @@ class CoherePromptDriver(BasePromptDriver): api_key: str = field(metadata={"serializable": False}) model: str = field(metadata={"serializable": True}) client: Client = field( - default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True) + default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), ) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True) + default=Factory(lambda self: CohereTokenizer(model=self.model, client=self.client), takes_self=True), ) force_single_step: bool = field(default=False, kw_only=True, metadata={"serializable": True}) use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) @@ -71,7 +71,7 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: usage = event.response.meta.tokens yield DeltaMessage( - usage=DeltaMessage.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens) + usage=DeltaMessage.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), ) elif event.event_type == "text-generation" or event.event_type == "tool-calls-chunk": yield DeltaMessage(content=self.__to_prompt_stack_delta_message_content(event)) @@ -91,7 +91,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: # History messages history_messages = self.__to_cohere_messages( - [message for message in prompt_stack.messages[:-1] if not message.is_system()] + [message for message in prompt_stack.messages[:-1] if not message.is_system()], ) # System message (preamble) @@ -198,7 +198,7 @@ def __to_cohere_tools(self, tools: list[BaseTool]) -> list[dict]: } for property_name, property_value in properties.items() }, - } + }, ) return tool_definitions @@ -217,11 +217,11 @@ def __to_prompt_stack_message_content(self, response: NonStreamedChatResponse) - name=ToolAction.from_native_tool_name(tool_call.name)[0], path=ToolAction.from_native_tool_name(tool_call.name)[1], input=tool_call.parameters, - ) - ) + ), + ), ) for tool_call in response.tool_calls - ] + ], ) return content diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index ed85f6229..33c5a9985 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -50,7 +50,8 @@ class GooglePromptDriver(BasePromptDriver): api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) model: str = field(kw_only=True, metadata={"serializable": True}) model_client: GenerativeModel = field( - default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True + default=Factory(lambda self: self._default_model_client(), takes_self=True), + kw_only=True, ) tokenizer: BaseTokenizer = field( default=Factory(lambda self: GoogleTokenizer(api_key=self.api_key, model=self.model), takes_self=True), @@ -64,7 +65,8 @@ class GooglePromptDriver(BasePromptDriver): def try_run(self, prompt_stack: PromptStack) -> Message: messages = self.__to_google_messages(prompt_stack) response: GenerateContentResponse = self.model_client.generate_content( - messages, **self._base_params(prompt_stack) + messages, + **self._base_params(prompt_stack), ) usage_metadata = response.usage_metadata @@ -73,14 +75,17 @@ def try_run(self, prompt_stack: PromptStack) -> Message: content=[self.__to_prompt_stack_message_content(part) for part in response.parts], role=Message.ASSISTANT_ROLE, usage=Message.Usage( - input_tokens=usage_metadata.prompt_token_count, output_tokens=usage_metadata.candidates_token_count + input_tokens=usage_metadata.prompt_token_count, + output_tokens=usage_metadata.candidates_token_count, ), ) def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: messages = self.__to_google_messages(prompt_stack) response: GenerateContentResponse = self.model_client.generate_content( - messages, **self._base_params(prompt_stack), stream=True + messages, + **self._base_params(prompt_stack), + stream=True, ) prompt_token_count = None @@ -100,7 +105,8 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: ) else: yield DeltaMessage( - content=content, usage=DeltaMessage.Usage(output_tokens=usage_metadata.candidates_token_count) + content=content, + usage=DeltaMessage.Usage(output_tokens=usage_metadata.candidates_token_count), ) def _base_params(self, prompt_stack: PromptStack) -> dict: @@ -111,7 +117,8 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: system_messages = prompt_stack.system_messages if system_messages: self.model_client._system_instruction = ContentDict( - role="system", parts=[Part(text=system_message.to_text()) for system_message in system_messages] + role="system", + parts=[Part(text=system_message.to_text()) for system_message in system_messages], ) return { @@ -124,7 +131,7 @@ def _base_params(self, prompt_stack: PromptStack) -> dict: "temperature": self.temperature, "top_p": self.top_p, "top_k": self.top_k, - } + }, ), **( { @@ -150,7 +157,7 @@ def __to_google_messages(self, prompt_stack: PromptStack) -> ContentsType: { "role": self.__to_google_role(message), "parts": [self.__to_google_message_content(content) for content in message.content], - } + }, ) for message in prompt_stack.messages if not message.is_system() @@ -207,8 +214,9 @@ def __to_google_message_content(self, content: BaseMessageContent) -> ContentDic return protos.Part( function_response=protos.FunctionResponse( - name=content.action.to_native_tool_name(), response=artifact.to_dict() - ) + name=content.action.to_native_tool_name(), + response=artifact.to_dict(), + ), ) else: @@ -224,7 +232,7 @@ def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent args = {k: v for k, v in function_call.args.items()} return ActionCallMessageContent( - artifact=ActionArtifact(value=ToolAction(tag=function_call.name, name=name, path=path, input=args)) + artifact=ActionArtifact(value=ToolAction(tag=function_call.name, name=name, path=path, input=args)), ) else: raise ValueError(f"Unsupported message content type {content}") @@ -239,7 +247,10 @@ def __to_prompt_stack_delta_message_content(self, content: Part) -> BaseDeltaMes args = {k: v for k, v in function_call.args.items()} return ActionCallDeltaMessageContent( - tag=function_call.name, name=name, path=path, partial_input=json.dumps(args) + tag=function_call.name, + name=name, + path=path, + partial_input=json.dumps(args), ) else: raise ValueError(f"Unsupported message content type {content}") diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 7d1debbf7..072b01ab5 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -35,7 +35,8 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): client: InferenceClient = field( default=Factory( lambda self: import_optional_dependency("huggingface_hub").InferenceClient( - model=self.model, token=self.api_token + model=self.model, + token=self.api_token, ), takes_self=True, ), @@ -43,7 +44,8 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): ) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), + takes_self=True, ), kw_only=True, ) @@ -52,7 +54,10 @@ def try_run(self, prompt_stack: PromptStack) -> Message: prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( - prompt, return_full_text=False, max_new_tokens=self.max_tokens, **self.params + prompt, + return_full_text=False, + max_new_tokens=self.max_tokens, + **self.params, ) input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) output_tokens = len(self.tokenizer.tokenizer.encode(response)) @@ -67,7 +72,11 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: prompt = self.prompt_stack_to_string(prompt_stack) response = self.client.text_generation( - prompt, return_full_text=False, max_new_tokens=self.max_tokens, stream=True, **self.params + prompt, + return_full_text=False, + max_new_tokens=self.max_tokens, + stream=True, + **self.params, ) input_tokens = len(self.__prompt_stack_to_tokens(prompt_stack)) diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index caff742c3..992aff918 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -30,24 +30,32 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): params: dict = field(factory=dict, kw_only=True, metadata={"serializable": True}) tokenizer: HuggingFaceTokenizer = field( default=Factory( - lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), takes_self=True + lambda self: HuggingFaceTokenizer(model=self.model, max_output_tokens=self.max_tokens), + takes_self=True, ), kw_only=True, ) pipe: TextGenerationPipeline = field( default=Factory( lambda self: import_optional_dependency("transformers").pipeline( - "text-generation", model=self.model, max_new_tokens=self.max_tokens, tokenizer=self.tokenizer.tokenizer + "text-generation", + model=self.model, + max_new_tokens=self.max_tokens, + tokenizer=self.tokenizer.tokenizer, ), takes_self=True, - ) + ), ) def try_run(self, prompt_stack: PromptStack) -> Message: messages = self._prompt_stack_to_messages(prompt_stack) result = self.pipe( - messages, max_new_tokens=self.max_tokens, temperature=self.temperature, do_sample=True, **self.params + messages, + max_new_tokens=self.max_tokens, + temperature=self.temperature, + do_sample=True, + **self.params, ) if isinstance(result, list): diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index 040099070..fb1e28e87 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -41,7 +41,9 @@ class OllamaPromptDriver(BasePromptDriver): tokenizer: BaseTokenizer = field( default=Factory( lambda self: SimpleTokenizer( - characters_per_token=4, max_input_tokens=2000, max_output_tokens=self.max_tokens + characters_per_token=4, + max_input_tokens=2000, + max_output_tokens=self.max_tokens, ), takes_self=True, ), @@ -95,7 +97,7 @@ def _prompt_stack_to_messages(self, prompt_stack: PromptStack) -> list[dict]: content.artifact.base64 for content in message.content if isinstance(content, ImageMessageContent) - ] + ], } if any(isinstance(content, ImageMessageContent) for content in message.content) else {} diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index f5b3796ed..9c4ab9a74 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -58,15 +58,18 @@ class OpenAiChatPromptDriver(BasePromptDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) model: str = field(kw_only=True, metadata={"serializable": True}) tokenizer: BaseTokenizer = field( - default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), kw_only=True + default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), + kw_only=True, ) user: str = field(default="", kw_only=True, metadata={"serializable": True}) response_format: Optional[Literal["json_object"]] = field( - default=None, kw_only=True, metadata={"serializable": True} + default=None, + kw_only=True, + metadata={"serializable": True}, ) seed: Optional[int] = field(default=None, kw_only=True, metadata={"serializable": True}) tool_choice: str = field(default="auto", kw_only=True, metadata={"serializable": False}) @@ -80,7 +83,7 @@ class OpenAiChatPromptDriver(BasePromptDriver): openai.NotFoundError, openai.ConflictError, openai.UnprocessableEntityError, - ) + ), ), kw_only=True, ) @@ -95,7 +98,8 @@ def try_run(self, prompt_stack: PromptStack) -> Message: content=self.__to_prompt_stack_message_content(message), role=Message.ASSISTANT_ROLE, usage=Message.Usage( - input_tokens=result.usage.prompt_tokens, output_tokens=result.usage.completion_tokens + input_tokens=result.usage.prompt_tokens, + output_tokens=result.usage.completion_tokens, ), ) else: @@ -108,8 +112,9 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: if chunk.usage is not None: yield DeltaMessage( usage=DeltaMessage.Usage( - input_tokens=chunk.usage.prompt_tokens, output_tokens=chunk.usage.completion_tokens - ) + input_tokens=chunk.usage.prompt_tokens, + output_tokens=chunk.usage.completion_tokens, + ), ) elif chunk.choices is not None: if len(chunk.choices) == 1: @@ -163,7 +168,7 @@ def __to_openai_messages(self, messages: list[Message]) -> list[dict]: "tool_call_id": action_result.action.tag, } for action_result in message.get_content_type(ActionResultMessageContent) - ] + ], ) else: # ToolAction calls are attached to the assistant message that originally generated them. @@ -186,12 +191,12 @@ def __to_openai_messages(self, messages: list[Message]) -> list[dict]: { "tool_calls": [ self.__to_openai_message_content(action_call) for action_call in action_call_content - ] + ], } if action_call_content else {} ), - } + }, ) return openai_messages @@ -257,11 +262,11 @@ def __to_prompt_stack_message_content(self, response: ChatCompletionMessage) -> name=ToolAction.from_native_tool_name(tool_call.function.name)[0], path=ToolAction.from_native_tool_name(tool_call.function.name)[1], input=json.loads(tool_call.function.arguments), - ) - ) + ), + ), ) for tool_call in response.tool_calls - ] + ], ) return content diff --git a/griptape/drivers/rerank/cohere_rerank_driver.py b/griptape/drivers/rerank/cohere_rerank_driver.py index 36956452c..12793846b 100644 --- a/griptape/drivers/rerank/cohere_rerank_driver.py +++ b/griptape/drivers/rerank/cohere_rerank_driver.py @@ -20,7 +20,7 @@ class CohereRerankDriver(BaseRerankDriver): api_key: str = field(metadata={"serializable": True}) client: Client = field( - default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True) + default=Factory(lambda self: import_optional_dependency("cohere").Client(self.api_key), takes_self=True), ) def run(self, query: str, artifacts: list[TextArtifact]) -> list[TextArtifact]: diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index 00391dc63..fc97d4e7e 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -21,7 +21,8 @@ class AmazonRedshiftSqlDriver(BaseSqlDriver): database_credentials_secret_arn: Optional[str] = field(default=None, kw_only=True) wait_for_query_completion_sec: float = field(default=0.3, kw_only=True) client: Any = field( - default=Factory(lambda self: self.session.client("redshift-data"), takes_self=True), kw_only=True + default=Factory(lambda self: self.session.client("redshift-data"), takes_self=True), + kw_only=True, ) @workgroup_name.validator # pyright: ignore[reportAttributeAccessIssue] @@ -82,7 +83,8 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Optional[Any] while "NextToken" in statement_result: statement_result = self.client.get_statement_result( - Id=response_id, NextToken=statement_result["NextToken"] + Id=response_id, + NextToken=statement_result["NextToken"], ) results = results + response.get("Records", []) diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index 7af4c78cc..a2d3eaead 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -20,7 +20,8 @@ class SnowflakeSqlDriver(BaseSqlDriver): # Creator bypasses the URL param # https://docs.sqlalchemy.org/en/14/core/engines.html#sqlalchemy.create_engine.params.creator lambda self: import_optional_dependency("sqlalchemy").create_engine( - "snowflake://not@used/db", creator=self.connection_func + "snowflake://not@used/db", + creator=self.connection_func, ), takes_self=True, ), diff --git a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py index f2cda50be..00b90a819 100644 --- a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py +++ b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py @@ -15,7 +15,8 @@ class GriptapeCloudStructureRunDriver(BaseStructureRunDriver): base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) api_key: str = field(kw_only=True) headers: dict = field( - default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), + kw_only=True, ) structure_id: str = field(kw_only=True) structure_run_wait_time_interval: int = field(default=2, kw_only=True) @@ -29,7 +30,9 @@ def try_run(self, *args: BaseArtifact) -> BaseArtifact: try: response: Response = post( - url, json={"args": [arg.value for arg in args], "env": self.env}, headers=self.headers + url, + json={"args": [arg.value for arg in args], "env": self.env}, + headers=self.headers, ) response.raise_for_status() response_json = response.json() @@ -57,7 +60,7 @@ def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | Tex if wait_attempts >= self.structure_run_max_wait_time_attempts: return ErrorArtifact( - f"Failed to get Run result after {self.structure_run_max_wait_time_attempts} attempts." + f"Failed to get Run result after {self.structure_run_max_wait_time_attempts} attempts.", ) if status != "SUCCEEDED": diff --git a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py index 96d0ded0c..f4be58162 100644 --- a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py @@ -25,7 +25,10 @@ class ElevenLabsTextToSpeechDriver(BaseTextToSpeechDriver): def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: audio = self.client.generate( - text=". ".join(prompts), voice=self.voice, model=self.model, output_format=self.output_format + text=". ".join(prompts), + voice=self.voice, + model=self.model, + output_format=self.output_format, ) content = b"" diff --git a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py index 8d8a81ad2..cb0c5340d 100644 --- a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py @@ -13,7 +13,9 @@ class OpenAiTextToSpeechDriver(BaseTextToSpeechDriver): model: str = field(default="tts-1", kw_only=True, metadata={"serializable": True}) voice: Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"] = field( - default="alloy", kw_only=True, metadata={"serializable": True} + default="alloy", + kw_only=True, + metadata={"serializable": True}, ) format: Literal["mp3", "opus", "aac", "flac"] = field(default="mp3", kw_only=True, metadata={"serializable": True}) api_type: str = field(default=openai.api_type, kw_only=True) @@ -25,12 +27,15 @@ class OpenAiTextToSpeechDriver(BaseTextToSpeechDriver): default=Factory( lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), takes_self=True, - ) + ), ) def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: response = self.client.audio.speech.create( - input=". ".join(prompts), voice=self.voice, model=self.model, response_format=self.format + input=". ".join(prompts), + voice=self.voice, + model=self.model, + response_format=self.format, ) return AudioArtifact(value=response.content, format=self.format) diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index 140e429f1..14e3d81dc 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -28,10 +28,12 @@ class AmazonOpenSearchVectorStoreDriver(OpenSearchVectorStoreDriver): http_auth: str | tuple[str, str] = field( default=Factory( lambda self: import_optional_dependency("opensearchpy").AWSV4SignerAuth( - self.session.get_credentials(), self.session.region_name, self.service + self.session.get_credentials(), + self.session.region_name, + self.service, ), takes_self=True, - ) + ), ) client: OpenSearch = field( @@ -44,7 +46,7 @@ class AmazonOpenSearchVectorStoreDriver(OpenSearchVectorStoreDriver): connection_class=import_optional_dependency("opensearchpy").RequestsHttpConnection, ), takes_self=True, - ) + ), ) def upsert_vector( diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index a1043040b..c4c7ef912 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -43,8 +43,8 @@ def query( "k": min(count * self.num_candidates_multiplier, self.MAX_NUM_CANDIDATES), }, "returnStoredSource": True, - } - } + }, + }, ) if namespace: diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 9f9a13ea2..78407b254 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -37,16 +37,20 @@ def to_artifact(self) -> BaseArtifact: embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + kw_only=True, ) def upsert_text_artifacts( - self, artifacts: list[TextArtifact] | dict[str, list[TextArtifact]], meta: Optional[dict] = None, **kwargs + self, + artifacts: list[TextArtifact] | dict[str, list[TextArtifact]], + meta: Optional[dict] = None, + **kwargs, ) -> None: with self.futures_executor_fn() as executor: if isinstance(artifacts, list): utils.execute_futures_list( - [executor.submit(self.upsert_text_artifact, a, None, meta, **kwargs) for a in artifacts] + [executor.submit(self.upsert_text_artifact, a, None, meta, **kwargs) for a in artifacts], ) else: utils.execute_futures_dict( @@ -54,7 +58,7 @@ def upsert_text_artifacts( namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) for namespace, artifact_list in artifacts.items() for a in artifact_list - } + }, ) def upsert_text_artifact( diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index 998b7a747..2b659ab62 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -11,7 +11,9 @@ @define() class DummyVectorStoreDriver(BaseVectorStoreDriver): embedding_driver: BaseEmbeddingDriver = field( - kw_only=True, default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True} + kw_only=True, + default=Factory(lambda: DummyEmbeddingDriver()), + metadata={"serializable": True}, ) def delete_vector(self, vector_id: str) -> None: diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index 2f3417f04..4929c58f2 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -27,10 +27,14 @@ class GriptapeCloudKnowledgeBaseVectorStoreDriver(BaseVectorStoreDriver): knowledge_base_id: str = field(kw_only=True, metadata={"serializable": True}) base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) headers: dict = field( - default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), + kw_only=True, ) embedding_driver: BaseEmbeddingDriver = field( - default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True}, kw_only=True, init=False + default=Factory(lambda: DummyEmbeddingDriver()), + metadata={"serializable": True}, + kw_only=True, + init=False, ) def upsert_vector( diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index f855f4228..f9520c0be 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -61,7 +61,10 @@ def upsert_vector( with self.thread_lock: self.entries[self._namespaced_vector_id(vector_id, namespace)] = self.Entry( - id=vector_id, vector=vector, meta=meta, namespace=namespace + id=vector_id, + vector=vector, + meta=meta, + namespace=namespace, ) if self.persist_file is not None: diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 08c7b89bb..0c8940238 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -29,7 +29,8 @@ class MarqoVectorStoreDriver(BaseVectorStoreDriver): url: str = field(kw_only=True, metadata={"serializable": True}) mq: Optional[marqo.Client] = field( default=Factory( - lambda self: import_optional_dependency("marqo").Client(self.url, api_key=self.api_key), takes_self=True + lambda self: import_optional_dependency("marqo").Client(self.url, api_key=self.api_key), + takes_self=True, ), kw_only=True, ) @@ -158,7 +159,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD vector=doc["_tensor_facets"][0]["_embedding"], meta={k: v for k, v in doc.items() if k not in ["_id", "_tensor_facets", "_found"]}, namespace=doc.get("namespace"), - ) + ), ) return entries diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index e27f48b79..3a96a9741 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -33,12 +33,15 @@ class MongoDbAtlasVectorStoreDriver(BaseVectorStoreDriver): index_name: str = field(kw_only=True, metadata={"serializable": True}) vector_path: str = field(kw_only=True, metadata={"serializable": True}) num_candidates_multiplier: int = field( - default=10, kw_only=True, metadata={"serializable": True} + default=10, + kw_only=True, + metadata={"serializable": True}, ) # https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/#fields client: MongoClient = field( default=Factory( - lambda self: import_optional_dependency("pymongo").MongoClient(self.connection_string), takes_self=True - ) + lambda self: import_optional_dependency("pymongo").MongoClient(self.connection_string), + takes_self=True, + ), ) def get_collection(self) -> Collection: @@ -64,7 +67,9 @@ def upsert_vector( vector_id = str(result.inserted_id) else: collection.replace_one( - {"_id": vector_id}, {self.vector_path: vector, "namespace": namespace, "meta": meta}, upsert=True + {"_id": vector_id}, + {self.vector_path: vector, "namespace": namespace, "meta": meta}, + upsert=True, ) return vector_id @@ -84,7 +89,10 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona return doc else: return BaseVectorStoreDriver.Entry( - id=str(doc["_id"]), vector=doc[self.vector_path], namespace=doc["namespace"], meta=doc["meta"] + id=str(doc["_id"]), + vector=doc[self.vector_path], + namespace=doc["namespace"], + meta=doc["meta"], ) def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: @@ -97,7 +105,10 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD return [ BaseVectorStoreDriver.Entry( - id=str(doc["_id"]), vector=doc[self.vector_path], namespace=doc["namespace"], meta=doc["meta"] + id=str(doc["_id"]), + vector=doc[self.vector_path], + namespace=doc["namespace"], + meta=doc["meta"], ) for doc in cursor ] @@ -131,7 +142,7 @@ def query( "queryVector": vector, "numCandidates": min(count * self.num_candidates_multiplier, self.MAX_NUM_CANDIDATES), "limit": count, - } + }, }, { "$project": { @@ -140,7 +151,7 @@ def query( "namespace": 1, "meta": 1, "score": {"$meta": "vectorSearchScore"}, - } + }, }, ] diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 3819cf791..31921a0df 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -43,7 +43,7 @@ class OpenSearchVectorStoreDriver(BaseVectorStoreDriver): connection_class=import_optional_dependency("opensearchpy").RequestsHttpConnection, ), takes_self=True, - ) + ), ) def upsert_vector( @@ -144,8 +144,11 @@ def query( if namespace: query_body["query"] = { "bool": { - "must": [{"match": {"namespace": namespace}}, {"knn": {field_name: {"vector": vector, "k": count}}}] - } + "must": [ + {"match": {"namespace": namespace}}, + {"knn": {field_name: {"vector": vector, "k": count}}}, + ], + }, } response = self.client.search(index=self.index_name, body=query_body) diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 61c789243..ffc7a7516 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -61,7 +61,10 @@ def __attrs_post_init__(self) -> None: self.engine = cast(Engine, create_engine(self.connection_string, **self.create_engine_params)) def setup( - self, create_schema: bool = True, install_uuid_extension: bool = True, install_vector_extension: bool = True + self, + create_schema: bool = True, + install_uuid_extension: bool = True, + install_vector_extension: bool = True, ) -> None: """Provides a mechanism to initialize the database schema and extensions.""" if install_uuid_extension: @@ -113,7 +116,10 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD return [ BaseVectorStoreDriver.Entry( - id=str(result.id), vector=result.vector, namespace=result.namespace, meta=result.meta + id=str(result.id), + vector=result.vector, + namespace=result.namespace, + meta=result.meta, ) for result in results ] diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 634a707e7..240829b7c 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -21,7 +21,9 @@ class PineconeVectorStoreDriver(BaseVectorStoreDriver): def __attrs_post_init__(self) -> None: pinecone = import_optional_dependency("pinecone").Pinecone( - api_key=self.api_key, environment=self.environment, project_name=self.project_name + api_key=self.api_key, + environment=self.environment, + project_name=self.project_name, ) self.index = pinecone.Index(self.index_name) @@ -50,7 +52,10 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona vector = vectors[0] return BaseVectorStoreDriver.Entry( - id=vector["id"], meta=vector["metadata"], vector=vector["values"], namespace=result["namespace"] + id=vector["id"], + meta=vector["metadata"], + vector=vector["values"], + namespace=result["namespace"], ) else: return None @@ -61,12 +66,18 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD # https://community.pinecone.io/t/is-there-a-way-to-query-all-the-vectors-and-or-metadata-from-a-namespace/797/5 results = self.index.query( - vector=self.embedding_driver.embed_string(""), top_k=10000, include_metadata=True, namespace=namespace + vector=self.embedding_driver.embed_string(""), + top_k=10000, + include_metadata=True, + namespace=namespace, ) return [ BaseVectorStoreDriver.Entry( - id=r["id"], vector=r["values"], meta=r["metadata"], namespace=results["namespace"] + id=r["id"], + vector=r["values"], + meta=r["metadata"], + namespace=results["namespace"], ) for r in results["matches"] ] @@ -94,7 +105,11 @@ def query( return [ BaseVectorStoreDriver.Entry( - id=r["id"], vector=r["values"], score=r["score"], meta=r["metadata"], namespace=results["namespace"] + id=r["id"], + vector=r["values"], + score=r["score"], + meta=r["metadata"], + namespace=results["namespace"], ) for r in results["matches"] ] diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index a5162f754..a92e9a060 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -47,7 +47,9 @@ class QdrantVectorStoreDriver(BaseVectorStoreDriver): https: bool = field(default=None, kw_only=True, metadata={"serializable": True}) prefix: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) force_disable_check_same_thread: Optional[bool] = field( - default=False, kw_only=True, metadata={"serializable": True} + default=False, + kw_only=True, + metadata={"serializable": True}, ) timeout: Optional[int] = field(default=5, kw_only=True, metadata={"serializable": True}) distance: str = field(default=DEFAULT_DISTANCE, kw_only=True, metadata={"serializable": True}) @@ -153,7 +155,9 @@ def upsert_vector( meta[self.content_payload_key] = content points = import_optional_dependency("qdrant_client.http.models").Batch( - ids=[vector_id], vectors=[vector], payloads=[meta] if meta else None + ids=[vector_id], + vectors=[vector], + payloads=[meta] if meta else None, ) self.client.upsert(collection_name=self.collection_name, points=points) diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 3008760b2..aec02e59a 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -37,10 +37,14 @@ class RedisVectorStoreDriver(BaseVectorStoreDriver): client: Redis = field( default=Factory( lambda self: import_optional_dependency("redis").Redis( - host=self.host, port=self.port, db=self.db, password=self.password, decode_responses=False + host=self.host, + port=self.port, + db=self.db, + password=self.password, + decode_responses=False, ), takes_self=True, - ) + ), ) def upsert_vector( @@ -149,7 +153,7 @@ def query( score=float(document.score), meta=metadata, namespace=namespace, - ) + ), ) return query_results diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 92d2c6244..d285d773e 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -31,7 +31,8 @@ class MarkdownifyWebScraperDriver(BaseWebScraperDriver): include_links: bool = field(default=True, kw_only=True) exclude_tags: list[str] = field( - default=Factory(lambda self: self.DEFAULT_EXCLUDE_TAGS, takes_self=True), kw_only=True + default=Factory(lambda self: self.DEFAULT_EXCLUDE_TAGS, takes_self=True), + kw_only=True, ) exclude_classes: list[str] = field(default=Factory(list), kw_only=True) exclude_ids: list[str] = field(default=Factory(list), kw_only=True) @@ -78,7 +79,7 @@ def skip_loading_images(route): # Remove unwanted elements exclude_selector = ",".join( - self.exclude_tags + [f".{c}" for c in self.exclude_classes] + [f"#{i}" for i in self.exclude_ids] + self.exclude_tags + [f".{c}" for c in self.exclude_classes] + [f"#{i}" for i in self.exclude_ids], ) if exclude_selector: for s in soup.select(exclude_selector): diff --git a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py index f0adfae22..0763155d5 100644 --- a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py @@ -31,7 +31,10 @@ def scrape_url(self, url: str) -> TextArtifact: raise Exception("can't access URL") else: extracted_page = trafilatura.extract( - page, include_links=self.include_links, output_format="json", config=config + page, + include_links=self.include_links, + output_format="json", + config=config, ) if not extracted_page: diff --git a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py index 7e5c8b287..e701e8e0c 100644 --- a/griptape/drivers/web_search/duck_duck_go_web_search_driver.py +++ b/griptape/drivers/web_search/duck_duck_go_web_search_driver.py @@ -23,10 +23,10 @@ def search(self, query: str, **kwargs) -> ListArtifact: return ListArtifact( [ TextArtifact( - json.dumps({"title": result["title"], "url": result["href"], "description": result["body"]}) + json.dumps({"title": result["title"], "url": result["href"], "description": result["body"]}), ) for result in results - ] + ], ) except Exception as e: raise Exception(f"Error searching '{query}' with DuckDuckGo: {e}") from e diff --git a/griptape/drivers/web_search/google_web_search_driver.py b/griptape/drivers/web_search/google_web_search_driver.py index 6d08a9561..26ac57342 100644 --- a/griptape/drivers/web_search/google_web_search_driver.py +++ b/griptape/drivers/web_search/google_web_search_driver.py @@ -39,5 +39,5 @@ def _search_google(self, query: str, **kwargs) -> list[dict]: else: raise Exception( f"Google Search API returned an error with status code " - f"{response.status_code} and reason '{response.reason}'" + f"{response.status_code} and reason '{response.reason}'", ) diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index e1974ca9e..f0a658fe7 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -41,10 +41,14 @@ def max_chunker_tokens(self) -> int: def min_response_tokens(self) -> int: return round( self.prompt_driver.tokenizer.max_input_tokens - - self.prompt_driver.tokenizer.max_input_tokens * self.max_token_multiplier + - self.prompt_driver.tokenizer.max_input_tokens * self.max_token_multiplier, ) @abstractmethod def extract( - self, text: str | ListArtifact, *, rulesets: Optional[list[Ruleset]] = None, **kwargs + self, + text: str | ListArtifact, + *, + rulesets: Optional[list[Ruleset]] = None, + **kwargs, ) -> ListArtifact | ErrorArtifact: ... diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index b3a578064..3184654b1 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -71,7 +71,7 @@ def _extract_rec( self.text_to_csv_rows( self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value, column_names, - ) + ), ) return rows @@ -87,7 +87,7 @@ def _extract_rec( self.text_to_csv_rows( self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value, column_names, - ) + ), ) return self._extract_rec(chunks[1:], column_names, rows, rulesets=rulesets) diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index 2662f28c3..436fc093f 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -64,8 +64,8 @@ def _extract_rec( if self.prompt_driver.tokenizer.count_input_tokens_left(full_text) >= self.min_response_tokens: extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value - ) + self.prompt_driver.run(PromptStack(messages=[Message(full_text, role=Message.USER_ROLE)])).value, + ), ) return extractions @@ -79,8 +79,8 @@ def _extract_rec( extractions.extend( self.json_to_text_artifacts( - self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value - ) + self.prompt_driver.run(PromptStack(messages=[Message(partial_text, role=Message.USER_ROLE)])).value, + ), ) return self._extract_rec(chunks[1:], json_template_schema, extractions, rulesets=rulesets) diff --git a/griptape/engines/image/inpainting_image_generation_engine.py b/griptape/engines/image/inpainting_image_generation_engine.py index 63f91af2e..a87f6622b 100644 --- a/griptape/engines/image/inpainting_image_generation_engine.py +++ b/griptape/engines/image/inpainting_image_generation_engine.py @@ -28,5 +28,8 @@ def run( negative_prompts = self._ruleset_to_prompts(negative_prompts, negative_rulesets) return self.image_generation_driver.run_image_inpainting( - prompts, image=image, mask=mask, negative_prompts=negative_prompts + prompts, + image=image, + mask=mask, + negative_prompts=negative_prompts, ) diff --git a/griptape/engines/image/outpainting_image_generation_engine.py b/griptape/engines/image/outpainting_image_generation_engine.py index 4ede5044a..267a13817 100644 --- a/griptape/engines/image/outpainting_image_generation_engine.py +++ b/griptape/engines/image/outpainting_image_generation_engine.py @@ -28,5 +28,8 @@ def run( negative_prompts = self._ruleset_to_prompts(negative_prompts, negative_rulesets) return self.image_generation_driver.run_image_outpainting( - prompts, image=image, mask=mask, negative_prompts=negative_prompts + prompts, + image=image, + mask=mask, + negative_prompts=negative_prompts, ) diff --git a/griptape/engines/image/variation_image_generation_engine.py b/griptape/engines/image/variation_image_generation_engine.py index fa182a40b..56d29c7e1 100644 --- a/griptape/engines/image/variation_image_generation_engine.py +++ b/griptape/engines/image/variation_image_generation_engine.py @@ -27,5 +27,7 @@ def run( negative_prompts = self._ruleset_to_prompts(negative_prompts, negative_rulesets) return self.image_generation_driver.run_image_variation( - prompts=prompts, image=image, negative_prompts=negative_prompts + prompts=prompts, + image=image, + negative_prompts=negative_prompts, ) diff --git a/griptape/engines/rag/modules/base_rag_module.py b/griptape/engines/rag/modules/base_rag_module.py index c90ed182c..f2c8316a8 100644 --- a/griptape/engines/rag/modules/base_rag_module.py +++ b/griptape/engines/rag/modules/base_rag_module.py @@ -16,12 +16,12 @@ class BaseRagModule(ABC): name: str = field(default=Factory(lambda self: self.__class__.__name__, takes_self=True), kw_only=True) futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()) + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), ) def generate_query_prompt_stack(self, system_prompt: str, query: str) -> PromptStack: return PromptStack( - messages=[Message(system_prompt, role=Message.SYSTEM_ROLE), Message(query, role=Message.USER_ROLE)] + messages=[Message(system_prompt, role=Message.SYSTEM_ROLE), Message(query, role=Message.USER_ROLE)], ) def get_context_param(self, context: RagContext, key: str) -> Optional[Any]: diff --git a/griptape/engines/rag/modules/response/prompt_response_rag_module.py b/griptape/engines/rag/modules/response/prompt_response_rag_module.py index 7f9b4daf8..0b7cbd953 100644 --- a/griptape/engines/rag/modules/response/prompt_response_rag_module.py +++ b/griptape/engines/rag/modules/response/prompt_response_rag_module.py @@ -18,7 +18,7 @@ class PromptResponseRagModule(BaseResponseRagModule): answer_token_offset: int = field(default=400) prompt_driver: BasePromptDriver = field() generate_system_template: Callable[[RagContext, list[TextArtifact]], str] = field( - default=Factory(lambda self: self.default_system_template_generator, takes_self=True) + default=Factory(lambda self: self.default_system_template_generator, takes_self=True), ) def run(self, context: RagContext) -> RagContext: @@ -32,7 +32,7 @@ def run(self, context: RagContext) -> RagContext: system_prompt = self.generate_system_template(context, included_chunks) message_token_count = self.prompt_driver.tokenizer.count_tokens( - self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)) + self.prompt_driver.prompt_stack_to_string(self.generate_query_prompt_stack(system_prompt, query)), ) if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: diff --git a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py index 7ae5df226..b79668583 100644 --- a/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/text_loader_retrieval_rag_module.py @@ -24,7 +24,7 @@ class TextLoaderRetrievalRagModule(BaseRetrievalRagModule): source: Any = field() query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( - default=Factory(lambda: lambda es: [e.to_artifact() for e in es]) + default=Factory(lambda: lambda es: [e.to_artifact() for e in es]), ) def run(self, context: RagContext) -> Sequence[TextArtifact]: diff --git a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py index cbe5e6852..0a07b4c50 100644 --- a/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py +++ b/griptape/engines/rag/modules/retrieval/vector_store_retrieval_rag_module.py @@ -20,7 +20,7 @@ class VectorStoreRetrievalRagModule(BaseRetrievalRagModule): vector_store_driver: BaseVectorStoreDriver = field() query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], Sequence[TextArtifact]] = field( - default=Factory(lambda: lambda es: [e.to_artifact() for e in es]) + default=Factory(lambda: lambda es: [e.to_artifact() for e in es]), ) def run(self, context: RagContext) -> Sequence[TextArtifact]: diff --git a/griptape/engines/rag/stages/base_rag_stage.py b/griptape/engines/rag/stages/base_rag_stage.py index 5484f6193..4f5a9bcd1 100644 --- a/griptape/engines/rag/stages/base_rag_stage.py +++ b/griptape/engines/rag/stages/base_rag_stage.py @@ -12,7 +12,7 @@ @define(kw_only=True) class BaseRagStage(ABC): futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()) + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), ) @abstractmethod diff --git a/griptape/engines/rag/stages/retrieval_rag_stage.py b/griptape/engines/rag/stages/retrieval_rag_stage.py index 8f552af3a..d0a92031e 100644 --- a/griptape/engines/rag/stages/retrieval_rag_stage.py +++ b/griptape/engines/rag/stages/retrieval_rag_stage.py @@ -48,7 +48,7 @@ def run(self, context: RagContext) -> RagContext: logging.info( f"RetrievalStage: deduplicated {chunks_before_dedup - chunks_after_dedup} " - f"chunks ({chunks_before_dedup} - {chunks_after_dedup})" + f"chunks ({chunks_before_dedup} - {chunks_after_dedup})", ) context.text_chunks = [a for a in results if isinstance(a, TextArtifact)] diff --git a/griptape/engines/summary/base_summary_engine.py b/griptape/engines/summary/base_summary_engine.py index e5ce6ee1e..a39d4d267 100644 --- a/griptape/engines/summary/base_summary_engine.py +++ b/griptape/engines/summary/base_summary_engine.py @@ -18,5 +18,8 @@ def summarize_text(self, text: str, *, rulesets: Optional[list[Ruleset]] = None) @abstractmethod def summarize_artifacts( - self, artifacts: ListArtifact, *, rulesets: Optional[list[Ruleset]] = None + self, + artifacts: ListArtifact, + *, + rulesets: Optional[list[Ruleset]] = None, ) -> TextArtifact: ... diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 61fe2c2ea..3cf0d6f3e 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -46,19 +46,23 @@ def max_chunker_tokens(self) -> int: def min_response_tokens(self) -> int: return round( self.prompt_driver.tokenizer.max_input_tokens - - self.prompt_driver.tokenizer.max_input_tokens * self.max_token_multiplier + - self.prompt_driver.tokenizer.max_input_tokens * self.max_token_multiplier, ) def summarize_artifacts(self, artifacts: ListArtifact, *, rulesets: Optional[list[Ruleset]] = None) -> TextArtifact: return self.summarize_artifacts_rec(cast(list[TextArtifact], artifacts.value), None, rulesets=rulesets) def summarize_artifacts_rec( - self, artifacts: list[TextArtifact], summary: Optional[str] = None, rulesets: Optional[list[Ruleset]] = None + self, + artifacts: list[TextArtifact], + summary: Optional[str] = None, + rulesets: Optional[list[Ruleset]] = None, ) -> TextArtifact: artifacts_text = self.chunk_joiner.join([a.to_text() for a in artifacts]) system_prompt = self.system_template_generator.render( - summary=summary, rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets) + summary=summary, + rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), ) user_prompt = self.user_template_generator.render(text=artifacts_text) @@ -72,8 +76,8 @@ def summarize_artifacts_rec( messages=[ Message(system_prompt, role=Message.SYSTEM_ROLE), Message(user_prompt, role=Message.USER_ROLE), - ] - ) + ], + ), ).to_artifact() if isinstance(result, TextArtifact): @@ -92,8 +96,8 @@ def summarize_artifacts_rec( messages=[ Message(system_prompt, role=Message.SYSTEM_ROLE), Message(partial_text, role=Message.USER_ROLE), - ] - ) + ], + ), ).value, rulesets=rulesets, ) diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index f9fa5d4bc..09551d9ab 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -18,7 +18,8 @@ @define class BaseLoader(ABC): futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + kw_only=True, ) encoding: Optional[str] = field(default=None, kw_only=True) @@ -26,7 +27,10 @@ class BaseLoader(ABC): def load(self, source: Any, *args, **kwargs) -> BaseArtifact | Sequence[BaseArtifact]: ... def load_collection( - self, sources: list[Any], *args, **kwargs + self, + sources: list[Any], + *args, + **kwargs, ) -> Mapping[str, BaseArtifact | Sequence[BaseArtifact | Sequence[BaseArtifact]]]: # Create a dictionary before actually submitting the jobs to the executor # to avoid duplicate work. @@ -34,7 +38,7 @@ def load_collection( with self.futures_executor_fn() as executor: return execute_futures_dict( - {key: executor.submit(self.load, source, *args, **kwargs) for key, source in sources_by_key.items()} + {key: executor.submit(self.load, source, *args, **kwargs) for key, source in sources_by_key.items()}, ) def to_key(self, source: Any, *args, **kwargs) -> str: diff --git a/griptape/loaders/base_text_loader.py b/griptape/loaders/base_text_loader.py index eac16ab91..369f3f1fc 100644 --- a/griptape/loaders/base_text_loader.py +++ b/griptape/loaders/base_text_loader.py @@ -21,7 +21,8 @@ class BaseTextLoader(BaseLoader, ABC): MAX_TOKEN_RATIO = 0.5 tokenizer: OpenAiTokenizer = field( - default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), kw_only=True + default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), + kw_only=True, ) max_tokens: int = field( default=Factory(lambda self: round(self.tokenizer.max_input_tokens * self.MAX_TOKEN_RATIO), takes_self=True), @@ -29,7 +30,8 @@ class BaseTextLoader(BaseLoader, ABC): ) chunker: BaseChunker = field( default=Factory( - lambda self: TextChunker(tokenizer=self.tokenizer, max_tokens=self.max_tokens), takes_self=True + lambda self: TextChunker(tokenizer=self.tokenizer, max_tokens=self.max_tokens), + takes_self=True, ), kw_only=True, ) @@ -42,7 +44,8 @@ def load(self, source: Any, *args, **kwargs) -> ErrorArtifact | list[TextArtifac def load_collection(self, sources: list[Any], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: return cast( - dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) + dict[str, Union[ErrorArtifact, list[TextArtifact]]], + super().load_collection(sources, *args, **kwargs), ) def _text_to_artifacts(self, text: str) -> list[TextArtifact]: diff --git a/griptape/loaders/csv_loader.py b/griptape/loaders/csv_loader.py index 435ecb873..dc73ca52c 100644 --- a/griptape/loaders/csv_loader.py +++ b/griptape/loaders/csv_loader.py @@ -43,8 +43,12 @@ def load(self, source: bytes | str, *args, **kwargs) -> ErrorArtifact | list[Csv return artifacts def load_collection( - self, sources: list[bytes | str], *args, **kwargs + self, + sources: list[bytes | str], + *args, + **kwargs, ) -> dict[str, ErrorArtifact | list[CsvRowArtifact]]: return cast( - dict[str, Union[ErrorArtifact, list[CsvRowArtifact]]], super().load_collection(sources, *args, **kwargs) + dict[str, Union[ErrorArtifact, list[CsvRowArtifact]]], + super().load_collection(sources, *args, **kwargs), ) diff --git a/griptape/loaders/pdf_loader.py b/griptape/loaders/pdf_loader.py index d0622a9b4..0dfb959cf 100644 --- a/griptape/loaders/pdf_loader.py +++ b/griptape/loaders/pdf_loader.py @@ -21,7 +21,11 @@ class PdfLoader(BaseTextLoader): encoding: None = field(default=None, kw_only=True) def load( - self, source: bytes, password: Optional[str] = None, *args, **kwargs + self, + source: bytes, + password: Optional[str] = None, + *args, + **kwargs, ) -> ErrorArtifact | list[TextArtifact]: PdfReader = import_optional_dependency("pypdf").PdfReader reader = PdfReader(BytesIO(source), strict=True, password=password) @@ -29,5 +33,6 @@ def load( def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: return cast( - dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) + dict[str, Union[ErrorArtifact, list[TextArtifact]]], + super().load_collection(sources, *args, **kwargs), ) diff --git a/griptape/loaders/text_loader.py b/griptape/loaders/text_loader.py index 8eaa0b110..e356a2cdb 100644 --- a/griptape/loaders/text_loader.py +++ b/griptape/loaders/text_loader.py @@ -19,7 +19,8 @@ class TextLoader(BaseTextLoader): MAX_TOKEN_RATIO = 0.5 tokenizer: OpenAiTokenizer = field( - default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), kw_only=True + default=Factory(lambda: OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL)), + kw_only=True, ) max_tokens: int = field( default=Factory(lambda self: round(self.tokenizer.max_input_tokens * self.MAX_TOKEN_RATIO), takes_self=True), @@ -27,7 +28,8 @@ class TextLoader(BaseTextLoader): ) chunker: TextChunker = field( default=Factory( - lambda self: TextChunker(tokenizer=self.tokenizer, max_tokens=self.max_tokens), takes_self=True + lambda self: TextChunker(tokenizer=self.tokenizer, max_tokens=self.max_tokens), + takes_self=True, ), kw_only=True, ) @@ -46,8 +48,12 @@ def load(self, source: bytes | str, *args, **kwargs) -> ErrorArtifact | list[Tex return self._text_to_artifacts(source) def load_collection( - self, sources: list[bytes | str], *args, **kwargs + self, + sources: list[bytes | str], + *args, + **kwargs, ) -> dict[str, ErrorArtifact | list[TextArtifact]]: return cast( - dict[str, Union[ErrorArtifact, list[TextArtifact]]], super().load_collection(sources, *args, **kwargs) + dict[str, Union[ErrorArtifact, list[TextArtifact]]], + super().load_collection(sources, *args, **kwargs), ) diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index e7265bba2..3798f9488 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -15,7 +15,8 @@ @define class WebLoader(BaseTextLoader): web_scraper_driver: BaseWebScraperDriver = field( - default=Factory(lambda: TrafilaturaWebScraperDriver()), kw_only=True + default=Factory(lambda: TrafilaturaWebScraperDriver()), + kw_only=True, ) def load(self, source: str, *args, **kwargs) -> ErrorArtifact | list[TextArtifact]: diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index 75450bcb9..c3d3c501e 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -80,7 +80,7 @@ def add_to_prompt_stack(self, prompt_stack: PromptStack, index: Optional[int] = # Convert the Prompt Stack into tokens left. tokens_left = prompt_driver.tokenizer.count_input_tokens_left( - prompt_driver.prompt_stack_to_string(temp_stack) + prompt_driver.prompt_stack_to_string(temp_stack), ) if tokens_left > 0: # There are still tokens left, no need to prune. diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index 5854aa058..17c3601c5 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -23,7 +23,8 @@ class SummaryConversationMemory(ConversationMemory): summary_index: int = field(default=0, kw_only=True, metadata={"serializable": True}) summary_template_generator: J2 = field(default=Factory(lambda: J2("memory/conversation/summary.j2")), kw_only=True) summarize_conversation_template_generator: J2 = field( - default=Factory(lambda: J2("memory/conversation/summarize_conversation.j2")), kw_only=True + default=Factory(lambda: J2("memory/conversation/summarize_conversation.j2")), + kw_only=True, ) @property @@ -78,7 +79,7 @@ def summarize_runs(self, previous_summary: str | None, runs: list[Run]) -> str | if len(runs) > 0: summary = self.summarize_conversation_template_generator.render(summary=previous_summary, runs=runs) return self.prompt_driver.run( - prompt_stack=PromptStack(messages=[Message(summary, role=Message.USER_ROLE)]) + prompt_stack=PromptStack(messages=[Message(summary, role=Message.USER_ROLE)]), ).to_text() else: return previous_summary diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 9bbf83433..d68d03209 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -60,10 +60,10 @@ def query(self, namespace: str, query: str, metadata: Any = None) -> BaseArtifac "query_params": { "namespace": namespace, "metadata": None if metadata is None else str(metadata), - } - } + }, + }, }, - ) + ), ).output if result is None: diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index 2e0639adc..79c375cdb 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -43,7 +43,10 @@ def find_storage(a): return find_storage(artifact) def process_output( - self, tool_activity: Callable, subtask: ActionsSubtask, output_artifact: BaseArtifact + self, + tool_activity: Callable, + subtask: ActionsSubtask, + output_artifact: BaseArtifact, ) -> BaseArtifact: from griptape.utils import J2 @@ -69,8 +72,10 @@ def process_output( if subtask.structure and subtask.structure.meta_memory: subtask.structure.meta_memory.add_entry( ActionSubtaskMetaEntry( - thought=subtask.thought, actions=subtask.actions_to_json(), answer=output - ) + thought=subtask.thought, + actions=subtask.actions_to_json(), + answer=output, + ), ) return InfoArtifact(output, name=namespace) diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index a00a70001..0178e342f 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -82,7 +82,7 @@ def activity_schema(self, activity: Callable) -> Optional[Schema]: raise Exception("This method is not an activity.") elif getattr(activity, "config")["schema"]: full_schema = { - "values": getattr(activity, "config")["schema"].schema if getattr(activity, "config")["schema"] else {} + "values": getattr(activity, "config")["schema"].schema if getattr(activity, "config")["schema"] else {}, } return Schema(full_schema) diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 1392bfb27..4aedd98ad 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -18,7 +18,7 @@ @define class Agent(Structure): input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( - default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value="") + default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), ) tools: list[BaseTool] = field(factory=list, kw_only=True) max_meta_memory_entries: Optional[int] = field(default=20, kw_only=True) diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 81e9d31fd..b768cf6c6 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -63,7 +63,7 @@ def context(self, task: BaseTask) -> dict[str, Any]: "parent_output": task.parents[0].output.to_text() if task.parents and task.parents[0].output else None, "parent": task.parents[0] if task.parents else None, "child": task.children[0] if task.children else None, - } + }, ) return context diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 144394732..5e2615c9d 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -46,7 +46,8 @@ class Structure(ABC): prompt_driver: Optional[BasePromptDriver] = field(default=None) embedding_driver: Optional[BaseEmbeddingDriver] = field(default=None, kw_only=True) config: BaseStructureConfig = field( - default=Factory(lambda self: self.default_config, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_config, takes_self=True), + kw_only=True, ) rulesets: list[Ruleset] = field(factory=list, kw_only=True) rules: list[Rule] = field(factory=list, kw_only=True) @@ -56,13 +57,15 @@ class Structure(ABC): event_listeners: list[EventListener] = field(factory=list, kw_only=True) conversation_memory: Optional[BaseConversationMemory] = field( default=Factory( - lambda self: ConversationMemory(driver=self.config.conversation_memory_driver), takes_self=True + lambda self: ConversationMemory(driver=self.config.conversation_memory_driver), + takes_self=True, ), kw_only=True, ) rag_engine: RagEngine = field(default=Factory(lambda self: self.default_rag_engine, takes_self=True), kw_only=True) task_memory: TaskMemory = field( - default=Factory(lambda self: self.default_task_memory, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_task_memory, takes_self=True), + kw_only=True, ) meta_memory: MetaMemory = field(default=Factory(lambda: MetaMemory()), kw_only=True) fail_fast: bool = field(default=True, kw_only=True) @@ -171,7 +174,7 @@ def default_config(self) -> BaseStructureConfig: def default_rag_engine(self) -> RagEngine: return RagEngine( retrieval_stage=RetrievalRagStage( - retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)] + retrieval_modules=[VectorStoreRetrievalRagModule(vector_store_driver=self.config.vector_store_driver)], ), response_stage=ResponseRagStage( before_response_modules=[ @@ -195,7 +198,7 @@ def default_task_memory(self) -> TaskMemory: json_extraction_engine=JsonExtractionEngine(prompt_driver=self.config.prompt_driver), ), BlobArtifact: BlobArtifactStorage(), - } + }, ) def is_finished(self) -> bool: @@ -259,8 +262,10 @@ def before_run(self, args: Any) -> None: self.publish_event( StartStructureRunEvent( - structure_id=self.id, input_task_input=self.input_task.input, input_task_output=self.input_task.output - ) + structure_id=self.id, + input_task_input=self.input_task.input, + input_task_output=self.input_task.output, + ), ) self.resolve_relationships() diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index d83dee756..55dc63033 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -17,7 +17,8 @@ @define class Workflow(Structure): futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + kw_only=True, ) @property @@ -114,7 +115,7 @@ def context(self, task: BaseTask) -> dict[str, Any]: "parents_output_text": task.parents_output_text, "parents": {parent.id: parent for parent in task.parents}, "children": {child.id: child for child in task.children}, - } + }, ) return context @@ -143,7 +144,9 @@ def __link_task_to_children(self, task: BaseTask, child_tasks: list[BaseTask]) - child_task.parent_ids.append(task.id) def __remove_old_parent_child_relationships( - self, parent_tasks: list[BaseTask], child_tasks: list[BaseTask] + self, + parent_tasks: list[BaseTask], + child_tasks: list[BaseTask], ) -> None: for parent_task in parent_tasks: for child_task in child_tasks: diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index d384acde9..3a44dc3e6 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -89,7 +89,7 @@ def before_run(self) -> None: subtask_parent_task_id=self.parent_task_id, subtask_thought=self.thought, subtask_actions=self.actions_to_dicts(), - ) + ), ) parts = [ @@ -155,7 +155,7 @@ def after_run(self) -> None: subtask_parent_task_id=self.parent_task_id, subtask_thought=self.thought, subtask_actions=self.actions_to_dicts(), - ) + ), ) self.structure.logger.info(f"Subtask {self.id}\nResponse: {response}") @@ -185,7 +185,8 @@ def actions_to_json(self) -> str: return json.dumps(self.actions_to_dicts(), indent=2) def _process_task_input( - self, task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact] + self, + task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact], ) -> TextArtifact | ListArtifact: if isinstance(task_input, (TextArtifact, ListArtifact)): return task_input diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py index cc36f4eae..3a4b17b9e 100644 --- a/griptape/tasks/audio_transcription_task.py +++ b/griptape/tasks/audio_transcription_task.py @@ -14,7 +14,9 @@ @define class AudioTranscriptionTask(BaseAudioInputTask): _audio_transcription_engine: AudioTranscriptionEngine = field( - default=None, kw_only=True, alias="audio_transcription_engine" + default=None, + kw_only=True, + alias="audio_transcription_engine", ) @property @@ -22,7 +24,7 @@ def audio_transcription_engine(self) -> AudioTranscriptionEngine: if self._audio_transcription_engine is None: if self.structure is not None: self._audio_transcription_engine = AudioTranscriptionEngine( - audio_transcription_driver=self.structure.config.audio_transcription_driver + audio_transcription_driver=self.structure.config.audio_transcription_driver, ) else: raise ValueError("Audio Generation Engine is not set.") diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 3804a749f..2891e52d7 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -16,7 +16,8 @@ class BaseMultiTextInputTask(RuleMixin, BaseTask, ABC): DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" _input: tuple[str, ...] | tuple[TextArtifact, ...] | tuple[Callable[[BaseTask], TextArtifact], ...] = field( - default=Factory(lambda self: (self.DEFAULT_INPUT_TEMPLATE,), takes_self=True), alias="input" + default=Factory(lambda self: (self.DEFAULT_INPUT_TEMPLATE,), takes_self=True), + alias="input", ) @property @@ -31,12 +32,13 @@ def input(self) -> ListArtifact: TextArtifact(J2().render_from_string(input_template, **self.full_context)) for input_template in self._input if isinstance(input_template, str) - ] + ], ) @input.setter def input( - self, value: tuple[str, ...] | tuple[TextArtifact, ...] | tuple[Callable[[BaseTask], TextArtifact], ...] + self, + value: tuple[str, ...] | tuple[TextArtifact, ...] | tuple[Callable[[BaseTask], TextArtifact], ...], ) -> None: self._input = value diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index bf985a313..9efe37002 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -34,7 +34,8 @@ class State(Enum): structure: Optional[Structure] = field(default=None, init=False) context: dict[str, Any] = field(factory=dict, kw_only=True) futures_executor_fn: Callable[[], futures.Executor] = field( - default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), kw_only=True + default=Factory(lambda: lambda: futures.ThreadPoolExecutor()), + kw_only=True, ) @property @@ -113,7 +114,7 @@ def before_run(self) -> None: task_child_ids=self.child_ids, task_input=self.input, task_output=self.output, - ) + ), ) def after_run(self) -> None: @@ -125,7 +126,7 @@ def after_run(self) -> None: task_child_ids=self.child_ids, task_input=self.input, task_output=self.output, - ) + ), ) def execute(self) -> Optional[BaseArtifact]: diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index c5641bb14..d94cdf734 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -16,7 +16,8 @@ class BaseTextInputTask(RuleMixin, BaseTask, ABC): DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field( - default=DEFAULT_INPUT_TEMPLATE, alias="input" + default=DEFAULT_INPUT_TEMPLATE, + alias="input", ) @property diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index aac3c655b..527729b94 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -48,7 +48,7 @@ def input(self) -> ListArtifact: else: raise ValueError( "Input must be a tuple of a TextArtifact and a list of ImageArtifacts or a callable that " - "returns a tuple of a TextArtifact and a list of ImageArtifacts." + "returns a tuple of a TextArtifact and a list of ImageArtifacts.", ) @input.setter diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 5c508b534..2096c60e4 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -29,7 +29,9 @@ class InpaintingImageGenerationTask(BaseImageGenerationTask): """ _image_generation_engine: InpaintingImageGenerationEngine = field( - default=None, kw_only=True, alias="image_generation_engine" + default=None, + kw_only=True, + alias="image_generation_engine", ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact @@ -53,7 +55,8 @@ def input(self) -> ListArtifact: @input.setter def input( - self, value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] + self, + value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact], ) -> None: self._input = value @@ -62,7 +65,7 @@ def image_generation_engine(self) -> InpaintingImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = InpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver, ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 8e7b210a2..a23fafd0f 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -29,7 +29,9 @@ class OutpaintingImageGenerationTask(BaseImageGenerationTask): """ _image_generation_engine: OutpaintingImageGenerationEngine = field( - default=None, kw_only=True, alias="image_generation_engine" + default=None, + kw_only=True, + alias="image_generation_engine", ) _input: ( tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact @@ -53,7 +55,8 @@ def input(self) -> ListArtifact: @input.setter def input( - self, value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] + self, + value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact], ) -> None: self._input = value @@ -62,7 +65,7 @@ def image_generation_engine(self) -> OutpaintingImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = OutpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver, ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 01bfd4b87..66cffab3e 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -31,7 +31,9 @@ class PromptImageGenerationTask(BaseImageGenerationTask): _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field(default=DEFAULT_INPUT_TEMPLATE) _image_generation_engine: PromptImageGenerationEngine = field( - default=None, kw_only=True, alias="image_generation_engine" + default=None, + kw_only=True, + alias="image_generation_engine", ) @property @@ -52,7 +54,7 @@ def image_generation_engine(self) -> PromptImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = PromptImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver, ) else: raise ValueError("Image Generation Engine is not set.") @@ -64,7 +66,9 @@ def image_generation_engine(self, value: PromptImageGenerationEngine) -> None: def run(self) -> ImageArtifact: image_artifact = self.image_generation_engine.run( - prompts=[self.input.to_text()], rulesets=self.all_rulesets, negative_rulesets=self.negative_rulesets + prompts=[self.input.to_text()], + rulesets=self.all_rulesets, + negative_rulesets=self.negative_rulesets, ) if self.output_dir or self.output_file: diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 8562b1e0c..45511875f 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -19,7 +19,8 @@ class PromptTask(RuleMixin, BaseTask): _prompt_driver: Optional[BasePromptDriver] = field(default=None, kw_only=True, alias="prompt_driver") generate_system_template: Callable[[PromptTask], str] = field( - default=Factory(lambda self: self.default_system_template_generator, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_system_template_generator, takes_self=True), + kw_only=True, ) _input: str | list | tuple | BaseArtifact | Callable[[BaseTask], BaseArtifact] = field( default=lambda task: task.full_context["args"][0] if task.full_context["args"] else TextArtifact(value=""), @@ -74,7 +75,7 @@ def preprocess(self, structure: Structure) -> PromptTask: def default_system_template_generator(self, _: PromptTask) -> str: return J2("tasks/prompt_task/system.j2").render( - rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets) + rulesets=J2("rulesets/rulesets.j2").render(rulesets=self.all_rulesets), ) def before_run(self) -> None: @@ -93,7 +94,8 @@ def run(self) -> BaseArtifact: return message.to_artifact() def _process_task_input( - self, task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact] + self, + task_input: str | tuple | list | BaseArtifact | Callable[[BaseTask], BaseArtifact], ) -> BaseArtifact: if isinstance(task_input, TextArtifact): task_input.value = J2().render_from_string(task_input.value, **self.full_context) diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index ab01e298c..3ca503dfe 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -39,7 +39,7 @@ def text_to_speech_engine(self) -> TextToSpeechEngine: if self._text_to_speech_engine is None: if self.structure is not None: self._text_to_speech_engine = TextToSpeechEngine( - text_to_speech_driver=self.structure.config.text_to_speech_driver + text_to_speech_driver=self.structure.config.text_to_speech_driver, ) else: raise ValueError("Audio Generation Engine is not set.") diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 9132f53f5..8f3519c32 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -32,10 +32,12 @@ class ToolkitTask(PromptTask, ActionsSubtaskOriginMixin): task_memory: Optional[TaskMemory] = field(default=None, kw_only=True) subtasks: list[ActionsSubtask] = field(factory=list) generate_assistant_subtask_template: Callable[[ActionsSubtask], str] = field( - default=Factory(lambda self: self.default_assistant_subtask_template_generator, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_assistant_subtask_template_generator, takes_self=True), + kw_only=True, ) generate_user_subtask_template: Callable[[ActionsSubtask], str] = field( - default=Factory(lambda self: self.default_user_subtask_template_generator, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_user_subtask_template_generator, takes_self=True), + kw_only=True, ) response_stop_sequence: str = field(default=RESPONSE_STOP_SEQUENCE, kw_only=True) @@ -90,16 +92,16 @@ def prompt_stack(self) -> PromptStack: [ *([TextArtifact(s.thought)] if s.thought else []), *[ActionArtifact(a) for a in action_calls], - ] - ) + ], + ), ) stack.add_user_message( ListArtifact( [ *[ActionArtifact(a) for a in action_results], *([] if s.output else [TextArtifact("Please keep going")]), - ] - ) + ], + ), ) else: stack.add_assistant_message(self.generate_assistant_subtask_template(s)) @@ -134,12 +136,14 @@ def default_system_template_generator(self, _: PromptTask) -> str: def default_assistant_subtask_template_generator(self, subtask: ActionsSubtask) -> str: return J2("tasks/toolkit_task/assistant_subtask.j2").render( - stop_sequence=self.response_stop_sequence, subtask=subtask + stop_sequence=self.response_stop_sequence, + subtask=subtask, ) def default_user_subtask_template_generator(self, subtask: ActionsSubtask) -> str: return J2("tasks/toolkit_task/user_subtask.j2").render( - stop_sequence=self.response_stop_sequence, subtask=subtask + stop_sequence=self.response_stop_sequence, + subtask=subtask, ) def actions_schema(self) -> Schema: diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index c3e71e0b5..df4579efa 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -29,10 +29,12 @@ class VariationImageGenerationTask(BaseImageGenerationTask): """ _image_generation_engine: VariationImageGenerationEngine = field( - default=None, kw_only=True, alias="image_generation_engine" + default=None, + kw_only=True, + alias="image_generation_engine", ) _input: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact = field( - default=None + default=None, ) @property @@ -60,7 +62,7 @@ def image_generation_engine(self) -> VariationImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = VariationImageGenerationEngine( - image_generation_driver=self.structure.config.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver, ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tokenizers/anthropic_tokenizer.py b/griptape/tokenizers/anthropic_tokenizer.py index 0955a506b..ffa492740 100644 --- a/griptape/tokenizers/anthropic_tokenizer.py +++ b/griptape/tokenizers/anthropic_tokenizer.py @@ -17,7 +17,8 @@ class AnthropicTokenizer(BaseTokenizer): MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS = {"claude": 4096} client: Anthropic = field( - default=Factory(lambda: import_optional_dependency("anthropic").Anthropic()), kw_only=True + default=Factory(lambda: import_optional_dependency("anthropic").Anthropic()), + kw_only=True, ) def count_tokens(self, text: str) -> int: diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 5b334f096..7bdfe523a 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -50,7 +50,7 @@ def _default_max_input_tokens(self) -> int: if tokens is None: logging.warning( - f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_INPUT_TOKENS, using default value of {self.DEFAULT_MAX_INPUT_TOKENS}." + f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_INPUT_TOKENS, using default value of {self.DEFAULT_MAX_INPUT_TOKENS}.", ) return self.DEFAULT_MAX_INPUT_TOKENS else: @@ -58,12 +58,13 @@ def _default_max_input_tokens(self) -> int: def _default_max_output_tokens(self) -> int: tokens = next( - (v for k, v in self.MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS.items() if self.model.startswith(k)), None + (v for k, v in self.MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS.items() if self.model.startswith(k)), + None, ) if tokens is None: logging.warning( - f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS, using default value of {self.DEFAULT_MAX_OUTPUT_TOKENS}." + f"Model {self.model} not found in MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS, using default value of {self.DEFAULT_MAX_OUTPUT_TOKENS}.", ) return self.DEFAULT_MAX_OUTPUT_TOKENS else: diff --git a/griptape/tokenizers/google_tokenizer.py b/griptape/tokenizers/google_tokenizer.py index 45e927cc9..87020bd96 100644 --- a/griptape/tokenizers/google_tokenizer.py +++ b/griptape/tokenizers/google_tokenizer.py @@ -18,7 +18,8 @@ class GoogleTokenizer(BaseTokenizer): api_key: str = field(kw_only=True, metadata={"serializable": True}) model_client: GenerativeModel = field( - default=Factory(lambda self: self._default_model_client(), takes_self=True), kw_only=True + default=Factory(lambda self: self._default_model_client(), takes_self=True), + kw_only=True, ) def count_tokens(self, text: str) -> int: diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index 63ddf0ea7..381289d63 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -21,7 +21,8 @@ class HuggingFaceTokenizer(BaseTokenizer): kw_only=True, ) max_input_tokens: int = field( - default=Factory(lambda self: self.tokenizer.model_max_length, takes_self=True), kw_only=True + default=Factory(lambda self: self.tokenizer.model_max_length, takes_self=True), + kw_only=True, ) max_output_tokens: int = field(default=4096, kw_only=True) diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index 13449f007..9cbbd6a03 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -45,10 +45,12 @@ class OpenAiTokenizer(BaseTokenizer): ] max_input_tokens: int = field( - kw_only=True, default=Factory(lambda self: self._default_max_input_tokens(), takes_self=True) + kw_only=True, + default=Factory(lambda self: self._default_max_input_tokens(), takes_self=True), ) max_output_tokens: int = field( - kw_only=True, default=Factory(lambda self: self._default_max_output_tokens(), takes_self=True) + kw_only=True, + default=Factory(lambda self: self._default_max_output_tokens(), takes_self=True), ) @property @@ -66,7 +68,8 @@ def _default_max_input_tokens(self) -> int: def _default_max_output_tokens(self) -> int: tokens = next( - (v for k, v in self.MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS.items() if self.model.startswith(k)), None + (v for k, v in self.MODEL_PREFIXES_TO_MAX_OUTPUT_TOKENS.items() if self.model.startswith(k)), + None, ) if tokens is None: @@ -119,7 +122,7 @@ def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> i raise NotImplementedError( f"""token_count() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for - information on how messages are converted to tokens.""" + information on how messages are converted to tokens.""", ) num_tokens = 0 diff --git a/griptape/tokenizers/voyageai_tokenizer.py b/griptape/tokenizers/voyageai_tokenizer.py index 649f6e0cc..d5007cf7d 100644 --- a/griptape/tokenizers/voyageai_tokenizer.py +++ b/griptape/tokenizers/voyageai_tokenizer.py @@ -24,7 +24,8 @@ class VoyageAiTokenizer(BaseTokenizer): api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) client: Client = field( default=Factory( - lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), takes_self=True + lambda self: import_optional_dependency("voyageai").Client(api_key=self.api_key), + takes_self=True, ), kw_only=True, ) diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription_client/tool.py index 786fb406b..bf2dfc67f 100644 --- a/griptape/tools/audio_transcription_client/tool.py +++ b/griptape/tools/audio_transcription_client/tool.py @@ -26,7 +26,7 @@ class AudioTranscriptionClient(BaseTool): config={ "description": "This tool can be used to generate transcriptions of audio files on disk.", "schema": Schema({Literal("path", description="The paths to an audio file on disk."): str}), - } + }, ) def transcribe_audio_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: audio_path = params["values"]["path"] @@ -40,7 +40,7 @@ def transcribe_audio_from_disk(self, params: dict) -> TextArtifact | ErrorArtifa config={ "description": "This tool can be used to generate the transcription of an audio artifact in memory.", "schema": Schema({"schema": Schema({"memory_name": str, "artifact_namespace": str, "artifact_name": str})}), - } + }, ) def transcribe_audio_from_memory(self, params: dict[str, Any]) -> TextArtifact | ErrorArtifact: memory = self.find_input_memory(params["values"]["memory_name"]) @@ -51,7 +51,8 @@ def transcribe_audio_from_memory(self, params: dict[str, Any]) -> TextArtifact | return ErrorArtifact("memory not found") audio_artifact = cast( - AudioArtifact, load_artifact_from_memory(memory, artifact_namespace, artifact_name, AudioArtifact) + AudioArtifact, + load_artifact_from_memory(memory, artifact_namespace, artifact_name, AudioArtifact), ) return self.engine.run(audio_artifact) diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam_client/tool.py index b9f149b23..1be0251f0 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam_client/tool.py @@ -27,14 +27,15 @@ class AwsIamClient(BaseAwsClient): "policy_name", description="PolicyName of the AWS IAM Policy embedded in the specified IAM user.", ): str, - } + }, ), - } + }, ) def get_user_policy(self, params: dict) -> TextArtifact | ErrorArtifact: try: policy = self.iam_client.get_user_policy( - UserName=params["values"]["user_name"], PolicyName=params["values"]["policy_name"] + UserName=params["values"]["user_name"], + PolicyName=params["values"]["policy_name"], ) return TextArtifact(policy["PolicyDocument"]) except Exception as e: @@ -52,9 +53,9 @@ def list_mfa_devices(self, _: dict) -> ListArtifact | ErrorArtifact: config={ "description": "Can be used to list policies for a given IAM user.", "schema": Schema( - {Literal("user_name", description="Username of the AWS IAM user for which to list policies."): str} + {Literal("user_name", description="Username of the AWS IAM user for which to list policies."): str}, ), - } + }, ) def list_user_policies(self, params: dict) -> ListArtifact | ErrorArtifact: try: diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3_client/tool.py index e69db8390..8f67195a1 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3_client/tool.py @@ -26,10 +26,10 @@ class AwsS3Client(BaseAwsClient): Literal( "bucket_name", description="The bucket name that contains the object for which to get the ACL information.", - ): str - } + ): str, + }, ), - } + }, ) def get_bucket_acl(self, params: dict) -> TextArtifact | ErrorArtifact: try: @@ -42,9 +42,9 @@ def get_bucket_acl(self, params: dict) -> TextArtifact | ErrorArtifact: config={ "description": "Can be used to get an AWS S3 bucket policy.", "schema": Schema( - {Literal("bucket_name", description="The bucket name for which to get the bucket policy."): str} + {Literal("bucket_name", description="The bucket name for which to get the bucket policy."): str}, ), - } + }, ) def get_bucket_policy(self, params: dict) -> TextArtifact | ErrorArtifact: try: @@ -60,14 +60,15 @@ def get_bucket_policy(self, params: dict) -> TextArtifact | ErrorArtifact: { Literal("bucket_name", description="Name of the AWS S3 bucket for which to get an ACL."): str, Literal("object_key", description="Key of the object for which to get the ACL information."): str, - } + }, ), - } + }, ) def get_object_acl(self, params: dict) -> TextArtifact | ErrorArtifact: try: acl = self.s3_client.get_object_acl( - Bucket=params["values"]["bucket_name"], Key=params["values"]["object_key"] + Bucket=params["values"]["bucket_name"], + Key=params["values"]["object_key"], ) return TextArtifact(acl) except Exception as e: @@ -86,7 +87,7 @@ def list_s3_buckets(self, _: dict) -> ListArtifact | ErrorArtifact: config={ "description": "Can be used to list all objects in an AWS S3 bucket.", "schema": Schema({Literal("bucket_name", description="The name of the S3 bucket to list."): str}), - } + }, ) def list_objects(self, params: dict) -> ListArtifact | ErrorArtifact: try: @@ -108,9 +109,9 @@ def list_objects(self, params: dict) -> ListArtifact | ErrorArtifact: "artifact_namespace": str, "bucket_name": str, Literal("object_key", description="Destination object key name. For example, 'baz.txt'"): str, - } + }, ), - } + }, ) def upload_memory_artifacts_to_s3(self, params: dict) -> InfoArtifact | ErrorArtifact: memory = self.find_input_memory(params["values"]["memory_name"]) @@ -149,9 +150,9 @@ def upload_memory_artifacts_to_s3(self, params: dict) -> InfoArtifact | ErrorArt "bucket_name": str, Literal("object_key", description="Destination object key name. For example, 'baz.txt'"): str, "content": str, - } + }, ), - } + }, ) def upload_content_to_s3(self, params: dict) -> ErrorArtifact | InfoArtifact: content = params["values"]["content"] @@ -173,16 +174,18 @@ def upload_content_to_s3(self, params: dict) -> ErrorArtifact | InfoArtifact: Literal("objects", description="A list of bucket name and object key pairs to download"): [ { Literal( - "bucket_name", description="The name of the bucket to download the object from" + "bucket_name", + description="The name of the bucket to download the object from", ): str, Literal( - "object_key", description="The name of the object key to download from the bucket" + "object_key", + description="The name of the object key to download from the bucket", ): str, - } - ] - } + }, + ], + }, ), - } + }, ) def download_objects(self, params: dict) -> ListArtifact | ErrorArtifact: objects = params["values"]["objects"] @@ -203,5 +206,7 @@ def _upload_object(self, bucket_name: str, object_name: str, value: Any) -> None self.s3_client.create_bucket(Bucket=bucket_name) self.s3_client.upload_fileobj( - Fileobj=io.BytesIO(value.encode() if isinstance(value, str) else value), Bucket=bucket_name, Key=object_name + Fileobj=io.BytesIO(value.encode() if isinstance(value, str) else value), + Bucket=bucket_name, + Key=object_name, ) diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_client.py index 1269548f3..2a38d8ffe 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_client.py @@ -21,7 +21,8 @@ def _build_client(self, scopes: list[str], service_name: str, version: str, owne from googleapiclient.discovery import build credentials = service_account.Credentials.from_service_account_info( - self.service_account_credentials, scopes=scopes + self.service_account_credentials, + scopes=scopes, ) return build(serviceName=service_name, version=version, credentials=credentials.with_subject(owner_email)) diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_client.py index 908f59b52..4f5692957 100644 --- a/griptape/tools/base_griptape_cloud_client.py +++ b/griptape/tools/base_griptape_cloud_client.py @@ -20,5 +20,6 @@ class BaseGriptapeCloudClient(BaseTool, ABC): base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) api_key: str = field(kw_only=True) headers: dict = field( - default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), + kw_only=True, ) diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index b9cc21cdf..eb1689c86 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -99,9 +99,9 @@ def activity_schemas(self) -> list[Schema]: Literal("name"): self.name, Literal("path", description=self.activity_description(activity)): self.activity_name(activity), **self.activity_to_input( - activity + activity, ), # Unpack the dictionary in order to only add the key-values if there are any - } + }, ) for activity in self.activities() ] @@ -122,7 +122,11 @@ def before_run(self, activity: Callable, subtask: ActionsSubtask, action: ToolAc return action.input def run( - self, activity: Callable, subtask: ActionsSubtask, action: ToolAction, value: Optional[dict] + self, + activity: Callable, + subtask: ActionsSubtask, + action: ToolAction, + value: Optional[dict], ) -> BaseArtifact: activity_result = activity(value) @@ -136,7 +140,11 @@ def run( return result def after_run( - self, activity: Callable, subtask: ActionsSubtask, action: ToolAction, value: BaseArtifact + self, + activity: Callable, + subtask: ActionsSubtask, + action: ToolAction, + value: BaseArtifact, ) -> BaseArtifact: if value: if self.output_memory: diff --git a/griptape/tools/calculator/tool.py b/griptape/tools/calculator/tool.py index 04d6868e3..141d1a333 100644 --- a/griptape/tools/calculator/tool.py +++ b/griptape/tools/calculator/tool.py @@ -15,10 +15,10 @@ class Calculator(BaseTool): "expression", description="Arithmetic expression parsable in pure Python. Single line only. " "Don't use variables. Don't use any imports or external libraries", - ): str - } + ): str, + }, ), - } + }, ) def calculate(self, params: dict) -> BaseArtifact: import numexpr diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 06129bfd6..08a1f6976 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -36,7 +36,8 @@ class Computer(BaseTool): kw_only=True, ) docker_client: DockerClient = field( - default=Factory(lambda self: self.default_docker_client(), takes_self=True), kw_only=True + default=Factory(lambda self: self.default_docker_client(), takes_self=True), + kw_only=True, ) _tempdir: Optional[tempfile.TemporaryDirectory] = field(default=None, kw_only=True) @@ -71,11 +72,12 @@ def install_dependencies(self, env: Optional[dict[str, str]] = None) -> None: { Literal("code", description="Python code to execute"): str, Literal( - "filename", description="name of the file to put the Python code in before executing it" + "filename", + description="name of the file to put the Python code in before executing it", ): str, - } + }, ), - } + }, ) def execute_code(self, params: dict) -> BaseArtifact: code = params["values"]["code"] @@ -87,7 +89,7 @@ def execute_code(self, params: dict) -> BaseArtifact: config={ "description": "Can be used to execute shell commands in Linux", "schema": Schema({Literal("command", description="shell command to execute"): str}), - } + }, ) def execute_command(self, params: dict) -> BaseArtifact: command = params["values"]["command"] diff --git a/griptape/tools/date_time/tool.py b/griptape/tools/date_time/tool.py index 886969575..728a3449a 100644 --- a/griptape/tools/date_time/tool.py +++ b/griptape/tools/date_time/tool.py @@ -26,10 +26,10 @@ def get_current_datetime(self, _: dict) -> BaseArtifact: "relative_date_string", description='Relative date in English. For example, "now EST", "20 minutes ago", ' '"in 2 days", "3 months, 1 week and 1 day ago", or "yesterday at 2pm"', - ): str - } + ): str, + }, ), - } + }, ) def get_relative_datetime(self, params: dict) -> BaseArtifact: from dateparser import parse diff --git a/griptape/tools/email_client/tool.py b/griptape/tools/email_client/tool.py index 622c21fa3..26c13bb9f 100644 --- a/griptape/tools/email_client/tool.py +++ b/griptape/tools/email_client/tool.py @@ -66,15 +66,15 @@ class EmailClient(BaseTool): { Literal("label", description="Label to retrieve emails from such as 'INBOX' or 'SENT'"): str, schema.Optional( - Literal("key", description="Optional key for filtering such as 'FROM' or 'SUBJECT'") + Literal("key", description="Optional key for filtering such as 'FROM' or 'SUBJECT'"), ): str, schema.Optional( - Literal("search_criteria", description="Optional search criteria to filter emails by key") + Literal("search_criteria", description="Optional search criteria to filter emails by key"), ): str, schema.Optional(Literal("max_count", description="Optional max email count")): int, - } + }, ), - } + }, ) def retrieve(self, params: dict) -> ListArtifact | ErrorArtifact: if self.mailboxes is None: @@ -89,7 +89,7 @@ def retrieve(self, params: dict) -> ListArtifact | ErrorArtifact: key=values.get("key"), search_criteria=values.get("search_criteria"), max_count=max_count, - ) + ), ) @activity( @@ -100,9 +100,9 @@ def retrieve(self, params: dict) -> ListArtifact | ErrorArtifact: Literal("to", description="Recipient's email address"): str, Literal("subject", description="Email subject"): str, Literal("body", description="Email body"): str, - } + }, ), - } + }, ) def send(self, params: dict) -> InfoArtifact | ErrorArtifact: values = params["values"] diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index db6ef451a..c0cb691ea 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -25,9 +25,9 @@ class FileManager(BaseTool): config={ "description": "Can be used to list files on disk", "schema": Schema( - {Literal("path", description="Relative path in the POSIX format. For example, 'foo/bar'"): str} + {Literal("path", description="Relative path in the POSIX format. For example, 'foo/bar'"): str}, ), - } + }, ) def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: path = params["values"]["path"] @@ -41,10 +41,10 @@ def list_files_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: Literal( "paths", description="Relative paths to files to be loaded in the POSIX format. For example, ['foo/bar/file.txt']", - ): list[str] - } + ): list[str], + }, ), - } + }, ) def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: paths = params["values"]["paths"] @@ -70,9 +70,9 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: Literal("file_name", description="Destination file name. For example, 'baz.txt'"): str, "memory_name": str, "artifact_namespace": str, - } + }, ), - } + }, ) def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArtifact: dir_name = params["values"]["dir_name"] @@ -88,7 +88,7 @@ def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArt if len(list_artifact) == 0: return ErrorArtifact( - f"Failed to save memory artifacts to disk - memory named '{memory_name}' does not contain any artifacts" + f"Failed to save memory artifacts to disk - memory named '{memory_name}' does not contain any artifacts", ) for artifact in list_artifact.value: @@ -109,9 +109,9 @@ def save_memory_artifacts_to_disk(self, params: dict) -> ErrorArtifact | InfoArt description="Destination file path on disk in the POSIX format. For example, 'foo/bar/baz.txt'", ): str, "content": str, - } + }, ), - } + }, ) def save_content_to_file(self, params: dict) -> ErrorArtifact | InfoArtifact: path = params["values"]["path"] diff --git a/griptape/tools/google_cal/tool.py b/griptape/tools/google_cal/tool.py index 85f6158cd..70f685605 100644 --- a/griptape/tools/google_cal/tool.py +++ b/griptape/tools/google_cal/tool.py @@ -26,9 +26,9 @@ class GoogleCalendarClient(BaseGoogleClient): { Literal("calendar_id", description="id of the google calendar such as 'primary'"): str, Literal("max_events", description="maximum number of events to return"): int, - } + }, ), - } + }, ) def get_upcoming_events(self, params: dict) -> ListArtifact | ErrorArtifact: values = params["values"] @@ -88,19 +88,23 @@ def get_upcoming_events(self, params: dict) -> ListArtifact | ErrorArtifact: Literal("title", description="title of the event"): str, Literal("description", description="description of the event"): str, Literal( - "attendees", description="list of the email addresses of attendees using 'email' as key" + "attendees", + description="list of the email addresses of attendees using 'email' as key", ): list[str], Optional(Literal("location", description="location of the event")): str, - } + }, ), - } + }, ) def create_event(self, params: dict) -> InfoArtifact | ErrorArtifact: values = params["values"] try: service = self._build_client( - scopes=self.CREATE_EVENT_SCOPES, service_name="calendar", version="v3", owner_email=self.owner_email + scopes=self.CREATE_EVENT_SCOPES, + service_name="calendar", + version="v3", + owner_email=self.owner_email, ) event = { diff --git a/griptape/tools/google_docs/tool.py b/griptape/tools/google_docs/tool.py index 2cab05208..b3564b9b2 100644 --- a/griptape/tools/google_docs/tool.py +++ b/griptape/tools/google_docs/tool.py @@ -29,9 +29,9 @@ class GoogleDocsClient(BaseGoogleClient): "For example, 'foo/bar/baz.txt'", ): str, Literal("text", description="Text to be appended to the Google Doc."): str, - } + }, ), - } + }, ) def append_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifact: values = params["values"] @@ -40,10 +40,16 @@ def append_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifac try: docs_service = self._build_client( - scopes=self.DOCS_SCOPES, service_name="docs", version="v1", owner_email=self.owner_email + scopes=self.DOCS_SCOPES, + service_name="docs", + version="v1", + owner_email=self.owner_email, ) drive_service = self._build_client( - scopes=self.DRIVE_FILE_SCOPES, service_name="drive", version="v3", owner_email=self.owner_email + scopes=self.DRIVE_FILE_SCOPES, + service_name="drive", + version="v3", + owner_email=self.owner_email, ) document_id = self._convert_path_to_file_id(drive_service, file_path) @@ -77,9 +83,9 @@ def append_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifac "For example, 'foo/bar/baz.txt'", ): str, Literal("text", description="Text to be prepended to the Google Doc."): str, - } + }, ), - } + }, ) def prepend_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifact: values = params["values"] @@ -88,10 +94,16 @@ def prepend_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifa try: docs_service = self._build_client( - scopes=self.DOCS_SCOPES, service_name="docs", version="v1", owner_email=self.owner_email + scopes=self.DOCS_SCOPES, + service_name="docs", + version="v1", + owner_email=self.owner_email, ) drive_service = self._build_client( - scopes=self.DRIVE_FILE_SCOPES, service_name="drive", version="v3", owner_email=self.owner_email + scopes=self.DRIVE_FILE_SCOPES, + service_name="drive", + version="v3", + owner_email=self.owner_email, ) document_id = self._convert_path_to_file_id(drive_service, file_path) @@ -128,9 +140,9 @@ def prepend_text_to_google_doc(self, params: dict) -> InfoArtifact | ErrorArtifa default=DEFAULT_FOLDER_PATH, description="Path of the folder where the Google doc will be created.", ): str, - } + }, ), - } + }, ) def save_content_to_google_doc(self, params: dict) -> ErrorArtifact | InfoArtifact: values = params["values"] @@ -140,10 +152,16 @@ def save_content_to_google_doc(self, params: dict) -> ErrorArtifact | InfoArtifa try: docs_service = self._build_client( - scopes=self.DOCS_SCOPES, service_name="docs", version="v1", owner_email=self.owner_email + scopes=self.DOCS_SCOPES, + service_name="docs", + version="v1", + owner_email=self.owner_email, ) drive_service = self._build_client( - scopes=self.DRIVE_FILE_SCOPES, service_name="drive", version="v3", owner_email=self.owner_email + scopes=self.DRIVE_FILE_SCOPES, + service_name="drive", + version="v3", + owner_email=self.owner_email, ) body = {"title": file_path} @@ -183,9 +201,9 @@ def save_content_to_google_doc(self, params: dict) -> ErrorArtifact | InfoArtifa description="Path of the folder where the Google Doc should be saved.", default=DEFAULT_FOLDER_PATH, ): str, - } + }, ), - } + }, ) def save_memory_artifacts_to_google_docs(self, params: dict) -> ErrorArtifact | InfoArtifact: values = params["values"] @@ -217,7 +235,10 @@ def save_memory_artifacts_to_google_docs(self, params: dict) -> ErrorArtifact | def _save_to_doc(self, params: dict) -> str: service = self._build_client( - scopes=self.DOCS_SCOPES, service_name="docs", version="v1", owner_email=self.owner_email + scopes=self.DOCS_SCOPES, + service_name="docs", + version="v1", + owner_email=self.owner_email, ) requests = [{"insertText": {"location": {"index": 1}, "text": params["content"]}}] diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index 427ed5e0a..d3e84f83a 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -41,10 +41,10 @@ class GoogleDriveClient(BaseGoogleClient): default=DEFAULT_FOLDER_PATH, description="Path of the Google Drive folder (like 'MainFolder/Subfolder1/Subfolder2') " "from which files should be listed.", - ): str - } + ): str, + }, ), - } + }, ) def list_files(self, params: dict) -> ListArtifact | ErrorArtifact: values = params["values"] @@ -54,7 +54,10 @@ def list_files(self, params: dict) -> ListArtifact | ErrorArtifact: try: service = self._build_client( - self.LIST_FILES_SCOPES, self.SERVICE_NAME, self.SERVICE_VERSION, self.owner_email + self.LIST_FILES_SCOPES, + self.SERVICE_NAME, + self.SERVICE_VERSION, + self.owner_email, ) if folder_path == self.DEFAULT_FOLDER_PATH: @@ -88,9 +91,9 @@ def list_files(self, params: dict) -> ListArtifact | ErrorArtifact: "where the file should be saved.", default=DEFAULT_FOLDER_PATH, ): str, - } + }, ), - } + }, ) def save_memory_artifacts_to_drive(self, params: dict) -> ErrorArtifact | InfoArtifact: values = params["values"] @@ -103,7 +106,10 @@ def save_memory_artifacts_to_drive(self, params: dict) -> ErrorArtifact | InfoAr if artifacts: service = self._build_client( - self.DRIVE_FILE_SCOPES, self.SERVICE_NAME, self.SERVICE_VERSION, self.owner_email + self.DRIVE_FILE_SCOPES, + self.SERVICE_NAME, + self.SERVICE_VERSION, + self.owner_email, ) if folder_path == self.DEFAULT_FOLDER_PATH: @@ -141,9 +147,9 @@ def save_memory_artifacts_to_drive(self, params: dict) -> ErrorArtifact | InfoAr "For example, 'foo/bar/baz.txt'", ): str, "content": str, - } + }, ), - } + }, ) def save_content_to_drive(self, params: dict) -> ErrorArtifact | InfoArtifact: content = params["values"]["content"] @@ -165,10 +171,10 @@ def save_content_to_drive(self, params: dict) -> ErrorArtifact | InfoArtifact: "paths", description="List of paths to files to be loaded in the POSIX format. " "For example, ['foo/bar/file1.txt', 'foo/bar/file2.txt']", - ): [str] - } + ): [str], + }, ), - } + }, ) def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: from google.auth.exceptions import MalformedError @@ -179,7 +185,10 @@ def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: try: service = self._build_client( - self.LIST_FILES_SCOPES, self.SERVICE_NAME, self.SERVICE_VERSION, self.owner_email + self.LIST_FILES_SCOPES, + self.SERVICE_NAME, + self.SERVICE_VERSION, + self.owner_email, ) for path in values["paths"]: @@ -230,9 +239,9 @@ def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: "where the search should be performed.", default=DEFAULT_FOLDER_PATH, ): str, - } + }, ), - } + }, ) def search_files(self, params: dict) -> ListArtifact | ErrorArtifact: from google.auth.exceptions import MalformedError @@ -245,7 +254,10 @@ def search_files(self, params: dict) -> ListArtifact | ErrorArtifact: try: service = self._build_client( - self.LIST_FILES_SCOPES, self.SERVICE_NAME, self.SERVICE_VERSION, self.owner_email + self.LIST_FILES_SCOPES, + self.SERVICE_NAME, + self.SERVICE_VERSION, + self.owner_email, ) folder_id = None @@ -296,9 +308,9 @@ def search_files(self, params: dict) -> ListArtifact | ErrorArtifact: "writer", # pyright: ignore [reportArgumentType] "commenter", # pyright: ignore [reportArgumentType] ), - } + }, ), - } + }, ) def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: from google.auth.exceptions import MalformedError @@ -311,7 +323,10 @@ def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: try: service = self._build_client( - scopes=self.DRIVE_AUTH_SCOPES, service_name="drive", version="v3", owner_email=self.owner_email + scopes=self.DRIVE_AUTH_SCOPES, + service_name="drive", + version="v3", + owner_email=self.owner_email, ) if file_path.lower() == self.DEFAULT_FOLDER_PATH: @@ -322,7 +337,9 @@ def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: if file_id: batch_update_permission_request_body = {"role": role, "type": "user", "emailAddress": email_address} request = service.permissions().create( - fileId=file_id, body=batch_update_permission_request_body, fields="id" + fileId=file_id, + body=batch_update_permission_request_body, + fields="id", ) request.execute() return InfoArtifact(f"File at {file_path} shared with {email_address} as a {role}") @@ -336,7 +353,10 @@ def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: return ErrorArtifact(f"error sharing file: {e}") def _save_to_drive( - self, filename: str, value: Any, parent_folder_id: Optional[str] = None + self, + filename: str, + value: Any, + parent_folder_id: Optional[str] = None, ) -> InfoArtifact | ErrorArtifact: from googleapiclient.http import MediaIoBaseUpload # pyright: ignore[reportMissingImports] diff --git a/griptape/tools/google_gmail/tool.py b/griptape/tools/google_gmail/tool.py index 137f2584b..853b8850f 100644 --- a/griptape/tools/google_gmail/tool.py +++ b/griptape/tools/google_gmail/tool.py @@ -26,16 +26,19 @@ class GoogleGmailClient(BaseGoogleClient): Literal("to", description="email address which to send to"): str, Literal("subject", description="subject of the email"): str, Literal("body", description="body of the email"): str, - } + }, ), - } + }, ) def create_draft_email(self, params: dict) -> InfoArtifact | ErrorArtifact: values = params["values"] try: service = self._build_client( - scopes=self.CREATE_DRAFT_EMAIL_SCOPES, service_name="gmail", version="v1", owner_email=self.owner_email + scopes=self.CREATE_DRAFT_EMAIL_SCOPES, + service_name="gmail", + version="v1", + owner_email=self.owner_email, ) message = EmailMessage() diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 438d09aa0..0c544524d 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -27,9 +27,14 @@ class GriptapeCloudKnowledgeBaseClient(BaseGriptapeCloudClient): config={ "description": "Can be used to search a knowledge base with the following description: {{ _self._get_knowledge_base_description() }}", "schema": Schema( - {Literal("query", description="A natural language search query to run against the knowledge base"): str} + { + Literal( + "query", + description="A natural language search query to run against the knowledge base", + ): str, + }, ), - } + }, ) def query(self, params: dict) -> TextArtifact | ErrorArtifact: from requests import exceptions, post @@ -59,7 +64,7 @@ def _get_knowledge_base_description(self) -> str: return response_body["description"] else: raise ValueError( - f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." + f"No description found for Knowledge Base {self.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute.", ) else: raise ValueError(f"Error accessing Knowledge Base {self.knowledge_base_id}.") diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query_client/tool.py index aeaa3e4b2..1b8cea534 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query_client/tool.py @@ -30,9 +30,9 @@ class ImageQueryClient(BaseTool): description="A detailed question to be answered using the contents of the provided images.", ): str, Literal("image_paths", description="The paths to an image files on disk."): list[str], - } + }, ), - } + }, ) def query_image_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: query = params["values"]["query"] @@ -55,12 +55,12 @@ def query_image_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: description="A detailed question to be answered using the contents of the provided images.", ): str, Literal("image_artifacts", description="Image artifact memory references."): [ - {"image_artifact_namespace": str, "image_artifact_name": str} + {"image_artifact_namespace": str, "image_artifact_name": str}, ], "memory_name": str, - } + }, ), - } + }, ) def query_images_from_memory(self, params: dict[str, Any]) -> TextArtifact | ErrorArtifact: query = params["values"]["query"] diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation_client/tool.py index 7c57e6f08..ff60dd975 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation_client/tool.py @@ -47,9 +47,9 @@ class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): description="The path to an image file to be used as a base to generate variations from.", ): str, Literal("mask_file", description="The path to mask image file."): str, - } + }, ), - } + }, ) def image_inpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] @@ -61,7 +61,10 @@ def image_inpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | mask_artifact = self.image_loader.load(mask_file) output_artifact = self.engine.run( - prompts=prompts, negative_prompts=negative_prompts, image=input_artifact, mask=mask_artifact + prompts=prompts, + negative_prompts=negative_prompts, + image=input_artifact, + mask=mask_artifact, ) if self.output_dir or self.output_file: @@ -87,9 +90,9 @@ def image_inpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | "image_artifact_name": str, "mask_artifact_namespace": str, "mask_artifact_name": str, - } + }, ), - } + }, ) def image_inpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] @@ -105,16 +108,25 @@ def image_inpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact try: image_artifact = load_artifact_from_memory( - memory, image_artifact_namespace, image_artifact_name, ImageArtifact + memory, + image_artifact_namespace, + image_artifact_name, + ImageArtifact, ) mask_artifact = load_artifact_from_memory( - memory, mask_artifact_namespace, mask_artifact_name, ImageArtifact + memory, + mask_artifact_namespace, + mask_artifact_name, + ImageArtifact, ) except ValueError as e: return ErrorArtifact(str(e)) return self._generate_inpainting( - prompts, negative_prompts, cast(ImageArtifact, image_artifact), cast(ImageArtifact, mask_artifact) + prompts, + negative_prompts, + cast(ImageArtifact, image_artifact), + cast(ImageArtifact, mask_artifact), ) def _generate_inpainting( @@ -125,7 +137,10 @@ def _generate_inpainting( mask_artifact: ImageArtifact, ) -> ImageArtifact: output_artifact = self.engine.run( - prompts=prompts, negative_prompts=negative_prompts, image=image_artifact, mask=mask_artifact + prompts=prompts, + negative_prompts=negative_prompts, + image=image_artifact, + mask=mask_artifact, ) if self.output_dir or self.output_file: diff --git a/griptape/tools/openweather_client/tool.py b/griptape/tools/openweather_client/tool.py index 21b80c6f0..d15bbc87a 100644 --- a/griptape/tools/openweather_client/tool.py +++ b/griptape/tools/openweather_client/tool.py @@ -82,10 +82,10 @@ class OpenWeatherClient(BaseTool): "For US cities, use the format 'city_name, state_code'. " "For non-US cities, use 'city_name, country_code'. " "For cities without specifying state or country, simply use 'city_name'.", - ): str - } + ): str, + }, ), - } + }, ) def get_coordinates_by_location(self, params: dict) -> InfoArtifact | ErrorArtifact: location = params["values"].get("location") @@ -109,7 +109,7 @@ def _fetch_coordinates(self, location: str) -> Optional[tuple[float, Optional[fl return data[0]["lat"], data[0]["lon"] else: logging.error( - f"Error fetching coordinates. HTTP Status Code: {response.status_code}. Response: {response.text}" + f"Error fetching coordinates. HTTP Status Code: {response.status_code}. Response: {response.text}", ) except Exception as e: logging.error(f"Error fetching coordinates: {e}") @@ -120,7 +120,7 @@ def _fetch_coordinates(self, location: str) -> Optional[tuple[float, Optional[fl "description": "Can be used to fetch current weather data for a given location. " "Temperatures are returned in {{ _self.units }} by default.", "schema": Schema({Literal("location", description="Location to fetch weather data for."): str}), - } + }, ) def get_current_weather_by_location(self, params: dict) -> ListArtifact | TextArtifact | ErrorArtifact: location = params["values"].get("location") @@ -143,7 +143,7 @@ def get_current_weather_by_location(self, params: dict) -> ListArtifact | TextAr "description": "Can be used to fetch hourly forecast for a given location up to 48 hours ahead. " "Temperatures are returned in {{ _self.units }} by default.", "schema": Schema({Literal("location", description="Location to fetch hourly forecast for."): str}), - } + }, ) def get_hourly_forecast_by_location(self, params: dict) -> ListArtifact | TextArtifact | ErrorArtifact: location = params["values"].get("location") @@ -166,7 +166,7 @@ def get_hourly_forecast_by_location(self, params: dict) -> ListArtifact | TextAr "description": "Can be used to fetch daily forecast for a given location up to 8 days ahead. " "Temperatures are returned in {{ _self.units }} by default.", "schema": Schema({Literal("location", description="Location to fetch daily forecast for."): str}), - } + }, ) def get_daily_forecast_by_location(self, params: dict) -> ListArtifact | TextArtifact | ErrorArtifact: location = params["values"].get("location") diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index 0e355b1dc..e11bb8cd8 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -47,9 +47,9 @@ class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): description="The path to an image file to be used as a base to generate variations from.", ): str, Literal("mask_file", description="The path to mask image file."): str, - } + }, ), - } + }, ) def image_outpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] @@ -78,9 +78,9 @@ def image_outpainting_from_file(self, params: dict[str, Any]) -> ImageArtifact | "memory_name": str, "image_artifact_namespace": str, "mask_artifact_namespace": str, - } + }, ), - } + }, ) def image_outpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] @@ -96,16 +96,25 @@ def image_outpainting_from_memory(self, params: dict[str, Any]) -> ImageArtifact try: image_artifact = load_artifact_from_memory( - memory, image_artifact_namespace, image_artifact_name, ImageArtifact + memory, + image_artifact_namespace, + image_artifact_name, + ImageArtifact, ) mask_artifact = load_artifact_from_memory( - memory, mask_artifact_namespace, mask_artifact_name, ImageArtifact + memory, + mask_artifact_namespace, + mask_artifact_name, + ImageArtifact, ) except ValueError as e: return ErrorArtifact(str(e)) return self._generate_outpainting( - prompts, negative_prompts, cast(ImageArtifact, image_artifact), cast(ImageArtifact, mask_artifact) + prompts, + negative_prompts, + cast(ImageArtifact, image_artifact), + cast(ImageArtifact, mask_artifact), ) def _generate_outpainting( @@ -116,7 +125,10 @@ def _generate_outpainting( mask_artifact: ImageArtifact, ): output_artifact = self.engine.run( - prompts=prompts, negative_prompts=negative_prompts, image=image_artifact, mask=mask_artifact + prompts=prompts, + negative_prompts=negative_prompts, + image=image_artifact, + mask=mask_artifact, ) if self.output_dir or self.output_file: diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index 17e2f6768..1373d5523 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -34,10 +34,10 @@ class PromptImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): Literal( "prompts", description="A detailed list of features and descriptions to include in the generated image.", - ): list[str] - } + ): list[str], + }, ), - } + }, ) def generate_image(self, params: dict[str, dict[str, list[str]]]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] diff --git a/griptape/tools/rag_client/tool.py b/griptape/tools/rag_client/tool.py index afc1b9d06..bbdef8159 100644 --- a/griptape/tools/rag_client/tool.py +++ b/griptape/tools/rag_client/tool.py @@ -29,7 +29,7 @@ class RagClient(BaseTool): config={ "description": "{{ _self.description }}", "schema": Schema({Literal("query", description="A natural language search query"): str}), - } + }, ) def search(self, params: dict) -> BaseArtifact: query = params["values"]["query"] diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index dbd294cd9..6d359e20e 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -49,10 +49,10 @@ def full_url(self) -> str: This rest api has the following description: {{ _self.description }} {% if _self.request_body_schema %}The request body must follow this JSON schema: {{ _self.request_body_schema }}{% endif %} {% if _self.response_body_schema %}The response body must follow this JSON schema: {{ _self.response_body_schema }}{% endif %} - """ + """, ), "schema": Schema({Literal("body", description="The request body."): dict}), - } + }, ) def put(self, params: dict) -> BaseArtifact: from requests import exceptions, put @@ -79,15 +79,15 @@ def put(self, params: dict) -> BaseArtifact: {% if _self.request_path_parameters %}The request path parameters must follow this JSON schema: {{ _self.request_path_params_schema }}{% endif %} {% if _self.request_body_schema %}The request body must follow this JSON schema: {{ _self.request_body_schema }}{% endif %} {% if _self.response_body_schema %}The response body must follow this JSON schema: {{ _self.response_body_schema }}{% endif %} - """ + """, ), "schema": Schema( { Literal("path_params", description="The request path parameters."): list[str], Literal("body", description="The request body."): dict, - } + }, ), - } + }, ) def patch(self, params: dict) -> BaseArtifact: from requests import exceptions, patch @@ -113,10 +113,10 @@ def patch(self, params: dict) -> BaseArtifact: This rest api has the following description: {{ _self.description }} {% if _self.request_body_schema %}The request body must follow this JSON schema: {{ _self.request_body_schema }}{% endif %} {% if _self.response_body_schema %}The response body must follow this JSON schema: {{ _self.response_body_schema }}{% endif %} - """ + """, ), "schema": Schema({Literal("body", description="The request body."): dict}), - } + }, ) def post(self, params: dict) -> BaseArtifact: from requests import exceptions, post @@ -142,17 +142,17 @@ def post(self, params: dict) -> BaseArtifact: {% if _self.request_path_parameters %}The request path parameters must follow this JSON schema: {{ _self.request_path_params_schema }}{% endif %} {% if _self.request_query_parameters %}The request query parameters must follow this JSON schema: {{ _self.request_path_params_schema }}{% endif %} {% if _self.response_body_schema %}The response body must follow this JSON schema: {{ _self.response_body_schema }}{% endif %} - """ + """, ), "schema": schema.Optional( Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], - } - ) + }, + ), ), - } + }, ) def get(self, params: dict) -> BaseArtifact: from requests import exceptions, get @@ -182,15 +182,15 @@ def get(self, params: dict) -> BaseArtifact: This rest api has the following description: {{ _self.description }} {% if _self.request_path_parameters %}The request path parameters must follow this JSON schema: {{ _self.request_path_params_schema }}{% endif %} {% if _self.request_query_parameters %}The request query parameters must follow this JSON schema: {{ _self.request_path_params_schema }}{% endif %} - """ + """, ), "schema": Schema( { schema.Optional(Literal("query_params", description="The request query parameters.")): dict, schema.Optional(Literal("path_params", description="The request path parameters.")): list[str], - } + }, ), - } + }, ) def delete(self, params: dict) -> BaseArtifact: from requests import delete, exceptions diff --git a/griptape/tools/sql_client/tool.py b/griptape/tools/sql_client/tool.py index 93c69c51b..2de598c6b 100644 --- a/griptape/tools/sql_client/tool.py +++ b/griptape/tools/sql_client/tool.py @@ -41,7 +41,7 @@ def table_schema(self) -> Optional[str]: "{{ _self.table_name }} schema: {{ _self.table_schema }}\n" "{% if _self.table_description %}{{ _self.table_name }} description: {{ _self.table_description }}{% endif %}", "schema": Schema({"sql_query": str}), - } + }, ) def execute_query(self, params: dict) -> ListArtifact | InfoArtifact | ErrorArtifact: try: diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index 0a1cc223b..f4f6c3786 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -29,9 +29,9 @@ class StructureRunClient(BaseTool): config={ "description": "Can be used to run a Griptape Structure with the following description: {{ self.description }}", "schema": Schema( - {Literal("args", description="A list of string arguments to submit to the Structure Run"): list[str]} + {Literal("args", description="A list of string arguments to submit to the Structure Run"): list[str]}, ), - } + }, ) def run_structure(self, params: dict) -> BaseArtifact: args: list[str] = params["values"]["args"] diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index 406f50fed..160a54d85 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -14,7 +14,7 @@ class TaskMemoryClient(BaseTool): config={ "description": "Can be used to summarize memory content", "schema": Schema({"memory_name": str, "artifact_namespace": str}), - } + }, ) def summarize(self, params: dict) -> TextArtifact | InfoArtifact | ErrorArtifact: memory = self.find_input_memory(params["values"]["memory_name"]) @@ -37,9 +37,9 @@ def summarize(self, params: dict) -> TextArtifact | InfoArtifact | ErrorArtifact description="A natural language search query in the form of a question with enough " "contextual information for another person to understand what the query is about", ): str, - } + }, ), - } + }, ) def query(self, params: dict) -> BaseArtifact: memory = self.find_input_memory(params["values"]["memory_name"]) diff --git a/griptape/tools/text_to_speech_client/tool.py b/griptape/tools/text_to_speech_client/tool.py index 9649279be..295641fd3 100644 --- a/griptape/tools/text_to_speech_client/tool.py +++ b/griptape/tools/text_to_speech_client/tool.py @@ -30,7 +30,7 @@ class TextToSpeechClient(BlobArtifactFileOutputMixin, BaseTool): config={ "description": "Can be used to generate speech from the provided input text.", "schema": Schema({Literal("text", description="The literal text to be converted to speech."): str}), - } + }, ) def text_to_speech(self, params: dict[str, Any]) -> AudioArtifact | ErrorArtifact: text = params["values"]["text"] diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index c1ab91896..e82561c59 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -46,9 +46,9 @@ class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): "image_file", description="The path to an image file to be used as a base to generate variations from.", ): str, - } + }, ), - } + }, ) def image_variation_from_file(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] @@ -77,9 +77,9 @@ def image_variation_from_file(self, params: dict[str, Any]) -> ImageArtifact | E "memory_name": str, "artifact_namespace": str, "artifact_name": str, - } + }, ), - } + }, ) def image_variation_from_memory(self, params: dict[str, Any]) -> ImageArtifact | ErrorArtifact: prompts = params["values"]["prompts"] diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index ef831e508..a0c638eef 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -30,7 +30,7 @@ class VectorStoreClient(BaseTool): vector_store_driver: BaseVectorStoreDriver = field() query_params: dict[str, Any] = field(factory=dict) process_query_output_fn: Callable[[list[BaseVectorStoreDriver.Entry]], BaseArtifact] = field( - default=Factory(lambda: lambda es: ListArtifact([e.to_artifact() for e in es])) + default=Factory(lambda: lambda es: ListArtifact([e.to_artifact() for e in es])), ) @activity( @@ -39,11 +39,12 @@ class VectorStoreClient(BaseTool): "schema": Schema( { Literal( - "query", description="A natural language search query to run against the vector database" - ): str - } + "query", + description="A natural language search query to run against the vector database", + ): str, + }, ), - } + }, ) def search(self, params: dict) -> BaseArtifact: query = params["values"]["query"] diff --git a/griptape/tools/web_scraper/tool.py b/griptape/tools/web_scraper/tool.py index a72378bb2..782e85d37 100644 --- a/griptape/tools/web_scraper/tool.py +++ b/griptape/tools/web_scraper/tool.py @@ -17,7 +17,7 @@ class WebScraper(BaseTool): config={ "description": "Can be used to browse a web page and load its content", "schema": Schema({Literal("url", description="Valid HTTP URL"): str}), - } + }, ) def get_content(self, params: dict) -> ListArtifact | ErrorArtifact: url = params["values"]["url"] diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index 5a3360077..8a1821a13 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -25,10 +25,10 @@ class WebSearch(BaseTool): Literal( "query", description="Search engine request that returns a list of pages with titles, descriptions, and URLs", - ): str - } + ): str, + }, ), - } + }, ) def search(self, props: dict) -> ListArtifact | ErrorArtifact: query = props["values"]["query"] diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index 032938706..e98eeaa4d 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -20,7 +20,8 @@ class Chat: prompt_prefix: str = field(default="User: ", kw_only=True) response_prefix: str = field(default="Assistant: ", kw_only=True) output_fn: Callable[[str], None] = field( - default=Factory(lambda self: self.default_output_fn, takes_self=True), kw_only=True + default=Factory(lambda self: self.default_output_fn, takes_self=True), + kw_only=True, ) def default_output_fn(self, text: str) -> None: diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py index 01dd1318a..f730034d3 100644 --- a/griptape/utils/file_utils.py +++ b/griptape/utils/file_utils.py @@ -34,5 +34,5 @@ def load_files(paths: list[str], futures_executor: Optional[futures.ThreadPoolEx with futures_executor as executor: return utils.execute_futures_dict( - {utils.str_to_hash(str(path)): executor.submit(load_file, path) for path in paths} + {utils.str_to_hash(str(path)): executor.submit(load_file, path) for path in paths}, ) diff --git a/griptape/utils/load_artifact_from_memory.py b/griptape/utils/load_artifact_from_memory.py index af11b8ae8..a45a41dbd 100644 --- a/griptape/utils/load_artifact_from_memory.py +++ b/griptape/utils/load_artifact_from_memory.py @@ -3,7 +3,10 @@ def load_artifact_from_memory( - memory: TaskMemory, artifact_namespace: str, artifact_name: str, artifact_type: type + memory: TaskMemory, + artifact_namespace: str, + artifact_name: str, + artifact_type: type, ) -> BaseArtifact: if memory is None: raise ValueError("memory not found") diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 64f94e943..fe0cf50d7 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -61,7 +61,8 @@ def event_handler(event: BaseEvent): self._event_queue.put(event) stream_event_listener = EventListener( - handler=event_handler, event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent] + handler=event_handler, + event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent], ) self.structure.add_event_listener(stream_event_listener) diff --git a/pyproject.toml b/pyproject.toml index a1ed38836..a03e2ac2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -197,9 +197,6 @@ pymdown-extensions = "^10.3" [tool.ruff] line-length = 120 -[tool.ruff.format] -skip-magic-trailing-comma = true - [tool.ruff.lint] select = [ "E", # pycodestyle @@ -214,7 +211,8 @@ select = [ "D", # pydocstyle "PGH", # pygrep-hooks "I", # isort - "FA" # flake8-future-annotations + "FA", # flake8-future-annotations + "COM" # flake8-commas ] ignore = [ "UP007", # non-pep604-annotation @@ -230,6 +228,7 @@ ignore = [ "D105", # undocumented-magic-method "D106", # undocumented-public-nested-class "D107", # undocumented-public-init + "COM812" # missing-trailing-comma -- See https://github.com/astral-sh/ruff/issues/9216 ] [tool.ruff.lint.pydocstyle] convention = "google" From 9371aab2e550cfc07a04d4df87ffd61248d62bb7 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 11:01:22 -0700 Subject: [PATCH 160/238] Enable pycodestyle-warnings ruff rule (#978) --- griptape/tokenizers/openai_tokenizer.py | 6 +++--- pyproject.toml | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index 9cbbd6a03..b839109fa 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -120,9 +120,9 @@ def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> i return self.count_tokens(text, model="gpt-4-0613") else: raise NotImplementedError( - f"""token_count() is not implemented for model {model}. - See https://github.com/openai/openai-python/blob/main/chatml.md for - information on how messages are converted to tokens.""", + f"token_count() is not implemented for model {model}. " + "See https://github.com/openai/openai-python/blob/main/chatml.md for " + "information on how messages are converted to tokens." ) num_tokens = 0 diff --git a/pyproject.toml b/pyproject.toml index a03e2ac2d..75789369c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -199,7 +199,8 @@ line-length = 120 [tool.ruff.lint] select = [ - "E", # pycodestyle + "E", # pycodestyle-errors + "W", # pycodestyle-warnings "F", # Pyflakes "UP", # pyupgrade "B", # flake8-bugbear From 71ba8520e37636a5d07e6c4b70fdf03cac033d37 Mon Sep 17 00:00:00 2001 From: Emily Danielson <2302515+emjay07@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:02:28 -0700 Subject: [PATCH 161/238] updating docs to use 35-turbo instead of 35-turbo-16k (#980) --- .github/workflows/docs-integration-tests.yml | 1 + docs/griptape-framework/drivers/prompt-drivers.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index cd21ad1ac..241c4a2ef 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -90,6 +90,7 @@ jobs: AZURE_OPENAI_ENDPOINT_3: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_3 }} AZURE_OPENAI_API_KEY_3: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_3 }} AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_35_TURBO_16K_DEPLOYMENT_ID }} + AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_35_TURBO_DEPLOYMENT_ID }} AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_DAVINCI_DEPLOYMENT_ID }} AZURE_OPENAI_4_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_DEPLOYMENT_ID }} AZURE_OPENAI_4_32K_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_32K_DEPLOYMENT_ID }} diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index b9fc7f161..bc6142d3d 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -142,8 +142,8 @@ agent = Agent( config=StructureConfig( prompt_driver=AzureOpenAiChatPromptDriver( api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-3.5-turbo-16k", - azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], + model="gpt-3.5-turbo", + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ) ), From 2ee57a67ec3346e1c96fe1c82c3058a772a5e4dd Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 12:32:39 -0700 Subject: [PATCH 162/238] Enable flake8-comprehensions ruff rule (#977) --- griptape/artifacts/base_artifact.py | 2 +- griptape/drivers/file_manager/base_file_manager_driver.py | 2 +- griptape/drivers/prompt/google_prompt_driver.py | 4 ++-- griptape/drivers/sql/snowflake_sql_driver.py | 2 +- griptape/drivers/sql/sql_driver.py | 2 +- griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/image_query_task.py | 2 +- pyproject.toml | 3 ++- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index 249ae48c8..d1e0d34f4 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -36,7 +36,7 @@ def value_to_bytes(cls, value: Any) -> bytes: def value_to_dict(cls, value: Any) -> dict: dict_value = value if isinstance(value, dict) else json.loads(value) - return {k: v for k, v in dict_value.items()} + return dict(dict_value.items()) def to_text(self) -> str: return str(self.value) diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 5fdb84b8f..db7f64438 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -43,7 +43,7 @@ class BaseFileManagerDriver(ABC): def list_files(self, path: str) -> TextArtifact | ErrorArtifact: try: entries = self.try_list_files(path) - return TextArtifact("\n".join([e for e in entries])) + return TextArtifact("\n".join(list(entries))) except FileNotFoundError: return ErrorArtifact("Path not found") except NotADirectoryError: diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 33c5a9985..c85835826 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -230,7 +230,7 @@ def __to_prompt_stack_message_content(self, content: Part) -> BaseMessageContent name, path = ToolAction.from_native_tool_name(function_call.name) - args = {k: v for k, v in function_call.args.items()} + args = dict(function_call.args.items()) return ActionCallMessageContent( artifact=ActionArtifact(value=ToolAction(tag=function_call.name, name=name, path=path, input=args)), ) @@ -245,7 +245,7 @@ def __to_prompt_stack_delta_message_content(self, content: Part) -> BaseDeltaMes name, path = ToolAction.from_native_tool_name(function_call.name) - args = {k: v for k, v in function_call.args.items()} + args = dict(function_call.args.items()) return ActionCallDeltaMessageContent( tag=function_call.name, name=name, diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index a2d3eaead..6fa75bb1c 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -59,7 +59,7 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Any]]]: if results is not None: if results.returns_rows: - return [{column: value for column, value in result.items()} for result in results] + return [dict(result.items()) for result in results] else: return None else: diff --git a/griptape/drivers/sql/sql_driver.py b/griptape/drivers/sql/sql_driver.py index d3da01e2e..5a3a4f5b2 100644 --- a/griptape/drivers/sql/sql_driver.py +++ b/griptape/drivers/sql/sql_driver.py @@ -38,7 +38,7 @@ def execute_query_raw(self, query: str) -> Optional[list[dict[str, Optional[Any] if results is not None: if results.returns_rows: - return [{column: value for column, value in result.items()} for result in results] + return [dict(result.items()) for result in results] else: return None else: diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 3a44dc3e6..66ec9c0b0 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -128,7 +128,7 @@ def execute_actions(self, actions: list[ToolAction]) -> list[tuple[str, BaseArti with self.futures_executor_fn() as executor: results = utils.execute_futures_dict({a.tag: executor.submit(self.execute_action, a) for a in actions}) - return [r for r in results.values()] + return list(results.values()) def execute_action(self, action: ToolAction) -> tuple[str, BaseArtifact]: if action.tool is not None: diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 527729b94..60a1c89c8 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -78,7 +78,7 @@ def image_query_engine(self, value: ImageQueryEngine) -> None: def run(self) -> TextArtifact: query = self.input.value[0] - if all([isinstance(input, ImageArtifact) for input in self.input.value[1:]]): + if all(isinstance(input, ImageArtifact) for input in self.input.value[1:]): image_artifacts = [input for input in self.input.value[1:] if isinstance(input, ImageArtifact)] else: raise ValueError("All inputs after the query must be ImageArtifacts.") diff --git a/pyproject.toml b/pyproject.toml index 75789369c..a6b35bd7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -213,7 +213,8 @@ select = [ "PGH", # pygrep-hooks "I", # isort "FA", # flake8-future-annotations - "COM" # flake8-commas + "COM", # flake8-commas + "C4", # flake8-comprehensions ] ignore = [ "UP007", # non-pep604-annotation From 67a913b983f7de2722227784df2c7269d2e9174c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 13:36:06 -0700 Subject: [PATCH 163/238] Fully enable flake8-tidy-imports, flake8-print, mccabe (#976) --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a6b35bd7d..0c0d28d3f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -205,9 +205,9 @@ select = [ "UP", # pyupgrade "B", # flake8-bugbear "SIM", # flake8-simplify - "TID251", # banned-api - "T201", # print - "C901", # complex-structure + "TID", # flake8-tidy-imports + "T20", # flake8-print + "C90", # mccabe "TCH", # flake8-type-checking "D", # pydocstyle "PGH", # pygrep-hooks From 5c4b3a87dab8732e24eae7835e7cd64303a3ee47 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 15 Jul 2024 13:57:03 -0700 Subject: [PATCH 164/238] Add flake8-annotations ruff rule (#975) --- griptape/artifacts/list_artifact.py | 4 ++-- griptape/chunkers/base_chunker.py | 4 ++-- griptape/common/prompt_stack/messages/message.py | 2 +- .../griptape_cloud_event_listener_driver.py | 4 ++-- .../amazon_s3_file_manager_driver.py | 6 +++--- .../file_manager/base_file_manager_driver.py | 2 +- .../file_manager/local_file_manager_driver.py | 6 +++--- .../image_query/anthropic_image_query_driver.py | 2 +- .../amazon_sagemaker_jumpstart_prompt_driver.py | 4 ++-- griptape/drivers/prompt/base_prompt_driver.py | 4 +++- .../drivers/sql/amazon_redshift_sql_driver.py | 10 +++++----- griptape/drivers/sql/snowflake_sql_driver.py | 6 +++--- ...e_cloud_knowledge_base_vector_store_driver.py | 4 ++-- .../drivers/vector/local_vector_store_driver.py | 6 +++--- .../drivers/vector/marqo_vector_store_driver.py | 4 ++-- .../vector/mongodb_atlas_vector_store_driver.py | 2 +- .../vector/opensearch_vector_store_driver.py | 6 +++--- .../vector/pgvector_vector_store_driver.py | 10 +++++----- .../vector/pinecone_vector_store_driver.py | 6 +++--- .../drivers/vector/redis_vector_store_driver.py | 4 ++-- .../markdownify_web_scraper_driver.py | 6 +++--- .../engines/extraction/base_extraction_engine.py | 4 ++-- .../engines/summary/prompt_summary_engine.py | 4 ++-- griptape/exceptions/dummy_exception.py | 2 +- griptape/loaders/email_loader.py | 2 +- .../memory/task/storage/text_artifact_storage.py | 4 ++-- griptape/memory/task/task_memory.py | 6 +++--- griptape/mixins/activity_mixin.py | 8 ++++---- .../mixins/media_artifact_file_output_mixin.py | 6 +++--- griptape/mixins/rule_mixin.py | 6 +++--- griptape/schemas/base_schema.py | 4 ++-- griptape/schemas/bytes_field.py | 7 ++++--- griptape/schemas/polymorphic_schema.py | 16 ++++++++-------- griptape/structures/agent.py | 4 ++-- griptape/structures/structure.py | 12 ++++++------ griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/base_image_generation_task.py | 6 +++--- griptape/tasks/toolkit_task.py | 4 ++-- griptape/tools/base_tool.py | 10 +++++----- griptape/tools/computer/tool.py | 4 ++-- .../outpainting_image_generation_client/tool.py | 2 +- griptape/tools/rest_api_client/tool.py | 2 +- .../variation_image_generation_client/tool.py | 4 +++- griptape/utils/decorators.py | 7 ++++--- griptape/utils/deprecation.py | 2 +- griptape/utils/stream.py | 8 ++++---- pyproject.toml | 8 +++++++- 47 files changed, 129 insertions(+), 117 deletions(-) diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 8590f57d3..298f29c6a 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Attribute, define, field from griptape.artifacts import BaseArtifact @@ -17,7 +17,7 @@ class ListArtifact(BaseArtifact): validate_uniform_types: bool = field(default=False, kw_only=True, metadata={"serializable": True}) @value.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_value(self, _, value: list[BaseArtifact]) -> None: + def validate_value(self, _: Attribute, value: list[BaseArtifact]) -> None: if self.validate_uniform_types and len(value) > 0: first_type = type(value[0]) diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index 4383ce569..623185237 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -3,7 +3,7 @@ from abc import ABC from typing import Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts import TextArtifact from griptape.chunkers import ChunkSeparator @@ -28,7 +28,7 @@ class BaseChunker(ABC): ) @max_tokens.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_max_tokens(self, _, max_tokens: int) -> None: + def validate_max_tokens(self, _: Attribute, max_tokens: int) -> None: if max_tokens < 0: raise ValueError("max_tokens must be 0 or greater.") diff --git a/griptape/common/prompt_stack/messages/message.py b/griptape/common/prompt_stack/messages/message.py index 4bed14efb..64dec79c6 100644 --- a/griptape/common/prompt_stack/messages/message.py +++ b/griptape/common/prompt_stack/messages/message.py @@ -14,7 +14,7 @@ @define class Message(BaseMessage): - def __init__(self, content: str | list[BaseMessageContent], **kwargs: Any): + def __init__(self, content: str | list[BaseMessageContent], **kwargs: Any) -> None: if isinstance(content, str): content = [TextMessageContent(TextArtifact(value=content))] self.__attrs_init__(content, **kwargs) # pyright: ignore[reportAttributeAccessIssue] diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 1520afbcc..2e208d786 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -4,7 +4,7 @@ from urllib.parse import urljoin import requests -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver @@ -32,7 +32,7 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) @structure_run_id.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_run_id(self, _, structure_run_id: str): + def validate_run_id(self, _: Attribute, structure_run_id: str) -> None: if structure_run_id is None: raise ValueError( "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID).", diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index 18b591b41..4623f8231 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.utils.import_utils import import_optional_dependency @@ -32,7 +32,7 @@ class AmazonS3FileManagerDriver(BaseFileManagerDriver): s3_client: Any = field(default=Factory(lambda self: self.session.client("s3"), takes_self=True), kw_only=True) @workdir.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_workdir(self, _, workdir: str) -> None: + def validate_workdir(self, _: Attribute, workdir: str) -> None: if not Path(workdir).is_absolute(): raise ValueError("Workdir must be an absolute path") @@ -62,7 +62,7 @@ def try_load_file(self, path: str) -> bytes: else: raise e - def try_save_file(self, path: str, value: bytes): + def try_save_file(self, path: str, value: bytes) -> None: full_key = self._to_full_key(path) if self._is_a_directory(full_key): raise IsADirectoryError diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index db7f64438..1c4f1dd6a 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -97,4 +97,4 @@ def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifa return ErrorArtifact(f"Failed to save file: {str(e)}") @abstractmethod - def try_save_file(self, path: str, value: bytes): ... + def try_save_file(self, path: str, value: bytes) -> None: ... diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index ad681e24b..4c2fcf5e6 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -3,7 +3,7 @@ import os from pathlib import Path -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from .base_file_manager_driver import BaseFileManagerDriver @@ -19,7 +19,7 @@ class LocalFileManagerDriver(BaseFileManagerDriver): workdir: str = field(default=Factory(lambda: os.getcwd()), kw_only=True) @workdir.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_workdir(self, _, workdir: str) -> None: + def validate_workdir(self, _: Attribute, workdir: str) -> None: if not Path(workdir).is_absolute(): raise ValueError("Workdir must be an absolute path") @@ -34,7 +34,7 @@ def try_load_file(self, path: str) -> bytes: with open(full_path, "rb") as file: return file.read() - def try_save_file(self, path: str, value: bytes): + def try_save_file(self, path: str, value: bytes) -> None: full_path = self._full_path(path) if self._is_dir(full_path): raise IsADirectoryError diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index c4756783e..4d91b6ea5 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -43,7 +43,7 @@ def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: return TextArtifact(text_content) - def _base_params(self, text_query: str, images: list[ImageArtifact]): + def _base_params(self, text_query: str, images: list[ImageArtifact]) -> dict: content = [self._construct_image_message(image) for image in images] content.append(self._construct_text_message(text_query)) messages = self._construct_messages(content) diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 70862f55f..440d6c3c5 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts import TextArtifact from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent @@ -40,7 +40,7 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): ) @stream.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_stream(self, _, stream): + def validate_stream(self, _: Attribute, stream: bool) -> None: if stream: raise ValueError("streaming is not supported") diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 57cb7272d..f2a5522d6 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -143,7 +143,9 @@ def __process_stream(self, prompt_stack: PromptStack) -> Message: return result - def __build_message(self, delta_contents: list[list[BaseDeltaMessageContent]], usage: DeltaMessage.Usage): + def __build_message( + self, delta_contents: list[list[BaseDeltaMessageContent]], usage: DeltaMessage.Usage + ) -> Message: content = [] for delta_content in delta_contents: text_deltas = [delta for delta in delta_content if isinstance(delta, TextDeltaMessageContent)] diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index fc97d4e7e..5ae85c495 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -3,7 +3,7 @@ import time from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.drivers import BaseSqlDriver @@ -26,14 +26,14 @@ class AmazonRedshiftSqlDriver(BaseSqlDriver): ) @workgroup_name.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_params(self, _, workgroup_name: Optional[str]) -> None: + def validate_params(self, _: Attribute, workgroup_name: Optional[str]) -> None: if not self.cluster_identifier and not self.workgroup_name: raise ValueError("Provide a value for one of `cluster_identifier` or `workgroup_name`") elif self.cluster_identifier and self.workgroup_name: raise ValueError("Provide a value for either `cluster_identifier` or `workgroup_name`, but not both") @classmethod - def _process_rows_from_records(cls, records) -> list[list]: + def _process_rows_from_records(cls, records: list) -> list[list]: return [[c[list(c.keys())[0]] for c in r] for r in records] @classmethod @@ -41,11 +41,11 @@ def _process_cells_from_rows_and_columns(cls, columns: list, rows: list[list]) - return [{column: r[idx] for idx, column in enumerate(columns)} for r in rows] @classmethod - def _process_columns_from_column_metadata(cls, meta) -> list: + def _process_columns_from_column_metadata(cls, meta: dict) -> list: return [k["name"] for k in meta] @classmethod - def _post_process(cls, meta, records) -> list[dict[str, Any]]: + def _post_process(cls, meta: dict, records: list) -> list[dict[str, Any]]: columns = cls._process_columns_from_column_metadata(meta) rows = cls._process_rows_from_records(records) return cls._process_cells_from_rows_and_columns(columns, rows) diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index 6fa75bb1c..43d147663 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.drivers import BaseSqlDriver from griptape.utils import import_optional_dependency @@ -29,7 +29,7 @@ class SnowflakeSqlDriver(BaseSqlDriver): ) @connection_func.validator # pyright: ignore[reportFunctionMemberAccess] - def validate_connection_func(self, _, connection_func: Callable[[], SnowflakeConnection]) -> None: + def validate_connection_func(self, _: Attribute, connection_func: Callable[[], SnowflakeConnection]) -> None: snowflake_connection = connection_func() snowflake = import_optional_dependency("snowflake") @@ -39,7 +39,7 @@ def validate_connection_func(self, _, connection_func: Callable[[], SnowflakeCon raise ValueError("Provide a schema and database for the Snowflake connection") @engine.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_engine_url(self, _, engine: Engine) -> None: + def validate_engine_url(self, _: Attribute, engine: Engine) -> None: if not engine.url.render_as_string().startswith("snowflake://"): raise ValueError("Provide a Snowflake connection") diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index 4929c58f2..f85f5b9ea 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any, NoReturn, Optional from urllib.parse import urljoin import requests @@ -107,5 +107,5 @@ def query( entry_list = [BaseVectorStoreDriver.Entry.from_dict(entry) for entry in entries] return entry_list - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index f9520c0be..68fa4561b 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -4,7 +4,7 @@ import os import threading from dataclasses import asdict -from typing import Callable, Optional, TextIO +from typing import Callable, NoReturn, Optional, TextIO from attrs import Factory, define, field from numpy import dot @@ -114,8 +114,8 @@ def query( for r in result ] - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") - def _namespaced_vector_id(self, vector_id: str, namespace: Optional[str]): + def _namespaced_vector_id(self, vector_id: str, namespace: Optional[str]) -> str: return vector_id if namespace is None else f"{namespace}-{vector_id}" diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 0c8940238..38c6f7977 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any, NoReturn, Optional from attrs import Factory, define, field @@ -250,5 +250,5 @@ def upsert_vector( """ raise NotImplementedError(f"{self.__class__.__name__} does not support upserting a vector.") - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index 3a96a9741..26d92e6fd 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -171,7 +171,7 @@ def query( return results - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> None: """Deletes the vector from the collection.""" collection = self.get_collection() collection.delete_one({"_id": vector_id}) diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 31921a0df..7f4044e19 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, NoReturn, Optional from attrs import Factory, define, field @@ -125,7 +125,7 @@ def query( count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, - include_metadata=True, + include_metadata: bool = True, field_name: str = "vector", **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: @@ -164,5 +164,5 @@ def query( for hit in response["hits"]["hits"] ] - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index ffc7a7516..2d3d5bf65 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -3,9 +3,9 @@ import uuid from collections import OrderedDict from dataclasses import dataclass -from typing import Any, Optional, cast +from typing import Any, NoReturn, Optional, cast -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from sqlalchemy import JSON, Column, String, create_engine from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.engine import Engine @@ -34,7 +34,7 @@ class PgVectorVectorStoreDriver(BaseVectorStoreDriver): _model: Any = field(default=Factory(lambda self: self.default_vector_model(), takes_self=True)) @connection_string.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_connection_string(self, _, connection_string: Optional[str]) -> None: + def validate_connection_string(self, _: Attribute, connection_string: Optional[str]) -> None: # If an engine is provided, the connection string is not used. if self.engine is not None: return @@ -47,7 +47,7 @@ def validate_connection_string(self, _, connection_string: Optional[str]) -> Non raise ValueError("The connection string must describe a Postgres database connection") @engine.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_engine(self, _, engine: Optional[Engine]) -> None: + def validate_engine(self, _: Attribute, engine: Optional[Engine]) -> None: # If a connection string is provided, an engine does not need to be provided. if self.connection_string is not None: return @@ -191,5 +191,5 @@ class VectorModel(Base): return VectorModel - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 240829b7c..94754317d 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any, NoReturn, Optional from attrs import define, field @@ -89,7 +89,7 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, # PineconeVectorStorageDriver-specific params: - include_metadata=True, + include_metadata: bool = True, **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: vector = self.embedding_driver.embed_string(query) @@ -114,5 +114,5 @@ def query( for r in results["matches"] ] - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index aec02e59a..a676dd908 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import json -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, NoReturn, Optional import numpy as np from attrs import Factory, define, field @@ -165,5 +165,5 @@ def _get_doc_prefix(self, namespace: Optional[str] = None) -> str: """Get the document prefix based on the provided namespace.""" return f"{namespace}:" if namespace else "" - def delete_vector(self, vector_id: str): + def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index d285d773e..6e25ca3b6 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import re -from typing import Optional +from typing import Any, Optional from attrs import Factory, define, field @@ -48,7 +48,7 @@ def scrape_url(self, url: str) -> TextArtifact: # Custom MarkdownConverter to optionally linked urls. If include_links is False only # the text of the link is returned. class OptionalLinksMarkdownConverter(MarkdownConverter): - def convert_a(self, el, text, convert_as_inline): + def convert_a(self, el: Any, text: str, convert_as_inline: Any) -> str: if include_links: return super().convert_a(el, text, convert_as_inline) return text @@ -56,7 +56,7 @@ def convert_a(self, el, text, convert_as_inline): with sync_playwright() as p, p.chromium.launch(headless=True) as browser: page = browser.new_page() - def skip_loading_images(route): + def skip_loading_images(route: Any) -> Any: if route.request.resource_type == "image": return route.abort() route.continue_() diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index f0a658fe7..f263ee0aa 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.chunkers import BaseChunker, TextChunker @@ -27,7 +27,7 @@ class BaseExtractionEngine(ABC): ) @max_token_multiplier.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_max_token_multiplier(self, _, max_token_multiplier: int) -> None: + def validate_max_token_multiplier(self, _: Attribute, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") elif max_token_multiplier <= 0: diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index 3cf0d6f3e..c5d8e695d 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional, cast -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts import ListArtifact, TextArtifact from griptape.chunkers import BaseChunker, TextChunker @@ -32,7 +32,7 @@ class PromptSummaryEngine(BaseSummaryEngine): ) @max_token_multiplier.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_allowlist(self, _, max_token_multiplier: int) -> None: + def validate_allowlist(self, _: Attribute, max_token_multiplier: int) -> None: if max_token_multiplier > 1: raise ValueError("has to be less than or equal to 1") elif max_token_multiplier <= 0: diff --git a/griptape/exceptions/dummy_exception.py b/griptape/exceptions/dummy_exception.py index 0e17898bd..3b4de955a 100644 --- a/griptape/exceptions/dummy_exception.py +++ b/griptape/exceptions/dummy_exception.py @@ -1,5 +1,5 @@ class DummyException(Exception): - def __init__(self, dummy_class_name: str, dummy_method_name: str): + def __init__(self, dummy_class_name: str, dummy_method_name: str) -> None: message = ( f"You have attempted to use a {dummy_class_name}'s {dummy_method_name} method. " "This likely originated from using a `StructureConfig` without providing a Driver required for this feature." diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index e13558ab3..a54d5a063 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -75,7 +75,7 @@ def load(self, source: EmailQuery, *args, **kwargs) -> ListArtifact | ErrorArtif logging.error(e) return ErrorArtifact(f"error retrieving email: {e}") - def _count_messages(self, message_numbers: bytes): + def _count_messages(self, message_numbers: bytes) -> int: return len(list(filter(None, message_numbers.decode().split(" ")))) def load_collection(self, sources: list[EmailQuery], *args, **kwargs) -> dict[str, ListArtifact | ErrorArtifact]: diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index d68d03209..4fdb4011c 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, Optional -from attrs import define, field +from attrs import Attribute, define, field from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.engines.rag import RagContext, RagEngine @@ -23,7 +23,7 @@ class TextArtifactStorage(BaseArtifactStorage): json_extraction_engine: Optional[JsonExtractionEngine] = field(default=None) @rag_engine.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rag_engine(self, _, rag_engine: str) -> None: + def validate_rag_engine(self, _: Attribute, rag_engine: str) -> None: if rag_engine is not None and self.retrieval_rag_module_name is None: raise ValueError("You have to set retrieval_rag_module_name if rag_engine is provided") diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index 79c375cdb..e2131d1f0 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.memory.meta import ActionSubtaskMetaEntry @@ -21,7 +21,7 @@ class TaskMemory(ActivityMixin): namespace_metadata: dict[str, Any] = field(factory=dict, kw_only=True) @artifact_storages.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_artifact_storages(self, _, artifact_storage: dict[type, BaseArtifactStorage]) -> None: + def validate_artifact_storages(self, _: Attribute, artifact_storage: dict[type, BaseArtifactStorage]) -> None: seen_types = [] for storage in artifact_storage.values(): @@ -31,7 +31,7 @@ def validate_artifact_storages(self, _, artifact_storage: dict[type, BaseArtifac seen_types.append(type(storage)) def get_storage_for(self, artifact: BaseArtifact) -> Optional[BaseArtifactStorage]: - def find_storage(a): + def find_storage(a: BaseArtifact) -> Optional[BaseArtifactStorage]: return next((v for k, v in self.artifact_storages.items() if isinstance(a, k)), None) if isinstance(artifact, ListArtifact): diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index 0178e342f..2caee49e4 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -4,7 +4,7 @@ from typing import Callable, Optional import schema -from attrs import define, field +from attrs import Attribute, define, field from jinja2 import Template from schema import Literal, Schema @@ -15,7 +15,7 @@ class ActivityMixin: denylist: Optional[list[str]] = field(default=None, kw_only=True) @allowlist.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_allowlist(self, _, allowlist: Optional[list[str]]) -> None: + def validate_allowlist(self, _: Attribute, allowlist: Optional[list[str]]) -> None: if allowlist is None: return @@ -26,7 +26,7 @@ def validate_allowlist(self, _, allowlist: Optional[list[str]]) -> None: self._validate_tool_activity(activity_name) @denylist.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_denylist(self, _, denylist: Optional[list[str]]) -> None: + def validate_denylist(self, _: Attribute, denylist: Optional[list[str]]) -> None: if denylist is None: return @@ -95,7 +95,7 @@ def activity_to_input(self, activity: Callable) -> dict: else: return {schema.Optional("input"): {}} - def _validate_tool_activity(self, activity_name): + def _validate_tool_activity(self, activity_name: str) -> None: tool = self.__class__ activity = getattr(tool, activity_name, None) diff --git a/griptape/mixins/media_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py index 36907634b..4097960bd 100644 --- a/griptape/mixins/media_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -3,7 +3,7 @@ import os from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Attribute, define, field if TYPE_CHECKING: from griptape.artifacts import BlobArtifact @@ -15,7 +15,7 @@ class BlobArtifactFileOutputMixin: output_file: Optional[str] = field(default=None, kw_only=True) @output_dir.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_output_dir(self, _, output_dir: str) -> None: + def validate_output_dir(self, _: Attribute, output_dir: str) -> None: if not output_dir: return @@ -23,7 +23,7 @@ def validate_output_dir(self, _, output_dir: str) -> None: raise ValueError("Can't have both output_dir and output_file specified.") @output_file.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_output_file(self, _, output_file: str) -> None: + def validate_output_file(self, _: Attribute, output_file: str) -> None: if not output_file: return diff --git a/griptape/mixins/rule_mixin.py b/griptape/mixins/rule_mixin.py index 920c17c5b..ff4395270 100644 --- a/griptape/mixins/rule_mixin.py +++ b/griptape/mixins/rule_mixin.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional -from attrs import define, field +from attrs import Attribute, define, field from griptape.rules import Rule, Ruleset @@ -20,7 +20,7 @@ class RuleMixin: structure: Optional[Structure] = field(default=None, kw_only=True) @rulesets.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: + def validate_rulesets(self, _: Attribute, rulesets: list[Ruleset]) -> None: if not rulesets: return @@ -28,7 +28,7 @@ def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: raise ValueError("Can't have both rulesets and rules specified.") @rules.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rules(self, _, rules: list[Rule]) -> None: + def validate_rules(self, _: Attribute, rules: list[Rule]) -> None: if not rules: return diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 982c155e4..0bf7c4760 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -2,7 +2,7 @@ from abc import ABC from collections.abc import Sequence -from typing import Literal, Union, get_args, get_origin +from typing import Any, Literal, Union, get_args, get_origin import attrs from marshmallow import INCLUDE, Schema, fields @@ -29,7 +29,7 @@ def from_attrs_cls(cls, attrs_cls: type) -> type: class SubSchema(cls): @post_load - def make_obj(self, data, **kwargs): + def make_obj(self, data: Any, **kwargs) -> Any: return attrs_cls(**data) if issubclass(attrs_cls, SerializableMixin): diff --git a/griptape/schemas/bytes_field.py b/griptape/schemas/bytes_field.py index ac2830388..fb08b65a3 100644 --- a/griptape/schemas/bytes_field.py +++ b/griptape/schemas/bytes_field.py @@ -1,15 +1,16 @@ import base64 +from typing import Any from marshmallow import ValidationError, fields class Bytes(fields.Field): - def _serialize(self, value, attr, obj, **kwargs): + def _serialize(self, value: Any, attr: Any, obj: Any, **kwargs) -> str: return base64.b64encode(value).decode() - def _deserialize(self, value, attr, data, **kwargs): + def _deserialize(self, value: Any, attr: Any, data: Any, **kwargs) -> bytes: return base64.b64decode(value) - def _validate(self, value): + def _validate(self, value: Any) -> None: if not isinstance(value, bytes): raise ValidationError("Invalid input type.") diff --git a/griptape/schemas/polymorphic_schema.py b/griptape/schemas/polymorphic_schema.py index 87772539c..f31f7a922 100644 --- a/griptape/schemas/polymorphic_schema.py +++ b/griptape/schemas/polymorphic_schema.py @@ -8,7 +8,7 @@ class PolymorphicSchema(BaseSchema): """PolymorphicSchema is based on https://github.com/marshmallow-code/marshmallow-oneofschema.""" - def __init__(self, inner_class: Any, **kwargs): + def __init__(self, inner_class: Any, **kwargs) -> None: super().__init__(**kwargs) self.inner_class = inner_class @@ -16,18 +16,18 @@ def __init__(self, inner_class: Any, **kwargs): type_field = "type" type_field_remove = True - def get_obj_type(self, obj): + def get_obj_type(self, obj: Any) -> Any: """Returns name of the schema during dump() calls, given the object being dumped.""" return obj.__class__.__name__ - def get_data_type(self, data): + def get_data_type(self, data: Any) -> Any: """Returns name of the schema during load() calls, given the data being loaded. Defaults to looking up `type_field` in the data.""" data_type = data.get(self.type_field) if self.type_field in data and self.type_field_remove: data.pop(self.type_field) return data_type - def dump(self, obj, *, many=None, **kwargs): + def dump(self, obj: Any, *, many: Any = None, **kwargs) -> Any: errors = {} result_data = [] result_errors = {} @@ -52,7 +52,7 @@ def dump(self, obj, *, many=None, **kwargs): exc = ValidationError(errors, data=obj, valid_data=result) # pyright: ignore[reportArgumentType] raise exc - def _dump(self, obj, *, update_fields=True, **kwargs): + def _dump(self, obj: Any, *, update_fields: bool = True, **kwargs) -> Any: obj_type = self.get_obj_type(obj) if not obj_type: @@ -74,7 +74,7 @@ def _dump(self, obj, *, update_fields=True, **kwargs): return result - def load(self, data, *, many=None, partial=None, unknown=None, **kwargs): + def load(self, data: Any, *, many: Any = None, partial: Any = None, unknown: Any = None, **kwargs) -> Any: errors = {} result_data = [] result_errors = {} @@ -106,7 +106,7 @@ def load(self, data, *, many=None, partial=None, unknown=None, **kwargs): exc = ValidationError(errors, data=data, valid_data=result) raise exc - def _load(self, data, *, partial=None, unknown=None, **kwargs): + def _load(self, data: Any, *, partial: Any = None, unknown: Any = None, **kwargs) -> Any: if not isinstance(data, dict): raise ValidationError({"_schema": f"Invalid data type: {data}"}) @@ -127,7 +127,7 @@ def _load(self, data, *, partial=None, unknown=None, **kwargs): return schema.load(data, many=False, partial=partial, unknown=unknown, **kwargs) - def validate(self, data, *, many=None, partial=None): # pyright: ignore[reportIncompatibleMethodOverride] + def validate(self, data: Any, *, many: Any = None, partial: Any = None) -> Any: # pyright: ignore[reportIncompatibleMethodOverride] try: self.load(data, many=many, partial=partial) except ValidationError as ve: diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 4aedd98ad..569accffc 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Callable, Optional -from attrs import define, field +from attrs import Attribute, define, field from griptape.artifacts.text_artifact import TextArtifact from griptape.memory.structure import Run @@ -25,7 +25,7 @@ class Agent(Structure): fail_fast: bool = field(default=False, kw_only=True) @fail_fast.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_fail_fast(self, _, fail_fast: bool) -> None: + def validate_fail_fast(self, _: Attribute, fail_fast: bool) -> None: if fail_fast: raise ValueError("Agents cannot fail fast, as they can only have 1 task.") diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 5e2615c9d..5a37c137e 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -6,7 +6,7 @@ from logging import Logger from typing import TYPE_CHECKING, Any, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from rich.logging import RichHandler from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact @@ -73,7 +73,7 @@ class Structure(ABC): _logger: Optional[Logger] = None @rulesets.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: + def validate_rulesets(self, _: Attribute, rulesets: list[Ruleset]) -> None: if not rulesets: return @@ -81,7 +81,7 @@ def validate_rulesets(self, _, rulesets: list[Ruleset]) -> None: raise ValueError("can't have both rulesets and rules specified") @rules.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_rules(self, _, rules: list[Rule]) -> None: + def validate_rules(self, _: Attribute, rules: list[Rule]) -> None: if not rules: return @@ -100,17 +100,17 @@ def __add__(self, other: BaseTask | list[BaseTask]) -> list[BaseTask]: return self.add_tasks(*other) if isinstance(other, list) else self + [other] @prompt_driver.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_prompt_driver(self, attribute, value): + def validate_prompt_driver(self, attribute: Attribute, value: BasePromptDriver) -> None: if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver` instead.") @embedding_driver.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_embedding_driver(self, attribute, value): + def validate_embedding_driver(self, attribute: Attribute, value: BaseEmbeddingDriver) -> None: if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.embedding_driver` instead.") @stream.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_stream(self, attribute, value): + def validate_stream(self, attribute: Attribute, value: bool) -> None: if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver.stream` instead.") diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 66ec9c0b0..0a00fba42 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -64,7 +64,7 @@ def children(self) -> list[BaseTask]: else: raise Exception("ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin.") - def attach_to(self, parent_task: BaseTask): + def attach_to(self, parent_task: BaseTask) -> None: self.parent_task_id = parent_task.id self.structure = parent_task.structure diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index a6e8ad8ef..2f5d46475 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -4,7 +4,7 @@ from abc import ABC from typing import TYPE_CHECKING -from attrs import define, field +from attrs import Attribute, define, field from griptape.loaders import ImageLoader from griptape.mixins import BlobArtifactFileOutputMixin, RuleMixin @@ -32,7 +32,7 @@ class BaseImageGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, negative_rules: list[Rule] = field(factory=list, kw_only=True) @negative_rulesets.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_negative_rulesets(self, _, negative_rulesets: list[Ruleset]) -> None: + def validate_negative_rulesets(self, _: Attribute, negative_rulesets: list[Ruleset]) -> None: if not negative_rulesets: return @@ -40,7 +40,7 @@ def validate_negative_rulesets(self, _, negative_rulesets: list[Ruleset]) -> Non raise ValueError("Can't have both negative_rulesets and negative_rules specified.") @negative_rules.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_negative_rules(self, _, negative_rules: list[Rule]) -> None: + def validate_negative_rules(self, _: Attribute, negative_rules: list[Rule]) -> None: if not negative_rules: return diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index 8f3519c32..59d8f9f90 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Callable, Optional -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape import utils from griptape.artifacts import ActionArtifact, BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact @@ -46,7 +46,7 @@ def __attrs_post_init__(self) -> None: self.set_default_tools_memory(self.task_memory) @tools.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_tools(self, _, tools: list[BaseTool]) -> None: + def validate_tools(self, _: Attribute, tools: list[BaseTool]) -> None: tool_names = [t.name for t in tools] if len(tool_names) > len(set(tool_names)): diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index eb1689c86..60eb10cda 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Callable, Optional import yaml -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from schema import Literal, Or, Schema from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact @@ -51,7 +51,7 @@ def __attrs_post_init__(self) -> None: self.install_dependencies(os.environ.copy()) @output_memory.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_output_memory(self, _, output_memory: dict[str, Optional[list[TaskMemory]]]) -> None: + def validate_output_memory(self, _: Attribute, output_memory: dict[str, Optional[list[TaskMemory]]]) -> None: if output_memory: for activity_name, memory_list in output_memory.items(): if not self.find_activity(activity_name): @@ -78,11 +78,11 @@ def manifest(self) -> dict: return yaml.safe_load(yaml_file) @property - def abs_file_path(self): + def abs_file_path(self) -> str: return os.path.abspath(inspect.getfile(self.__class__)) @property - def abs_dir_path(self): + def abs_dir_path(self) -> str: return os.path.dirname(self.abs_file_path) # This method has to remain a method and can't be decorated with @property because @@ -174,7 +174,7 @@ def validate(self) -> bool: return True - def tool_dir(self): + def tool_dir(self) -> str: class_file = inspect.getfile(self.__class__) return os.path.dirname(os.path.abspath(class_file)) diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 08a1f6976..4416cf5fa 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -9,7 +9,7 @@ import docker import stringcase -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from docker.errors import NotFound from docker.models.containers import Container from schema import Literal, Schema @@ -52,7 +52,7 @@ def __attrs_post_init__(self) -> None: self.local_workdir = self._tempdir.name @docker_client.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_docker_client(self, _, docker_client: DockerClient) -> None: + def validate_docker_client(self, _: Attribute, docker_client: DockerClient) -> None: if not docker_client: raise ValueError("Docker client can't be initialized: make sure the Docker daemon is running") diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index e11bb8cd8..22f47b866 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -123,7 +123,7 @@ def _generate_outpainting( negative_prompts: list[str], image_artifact: ImageArtifact, mask_artifact: ImageArtifact, - ): + ) -> ImageArtifact: output_artifact = self.engine.run( prompts=prompts, negative_prompts=negative_prompts, diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index 6d359e20e..b27beda0e 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -209,7 +209,7 @@ def delete(self, params: dict) -> BaseArtifact: except exceptions.RequestException as err: return ErrorArtifact(str(err)) - def _build_url(self, base_url, path=None, path_params=None): + def _build_url(self, base_url: str, path: Optional[str] = None, path_params: Optional[list] = None) -> str: url = "" if path: diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index e82561c59..deab543a1 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -98,7 +98,9 @@ def image_variation_from_memory(self, params: dict[str, Any]) -> ImageArtifact | return self._generate_variation(prompts, negative_prompts, cast(ImageArtifact, image_artifact)) - def _generate_variation(self, prompts: list[str], negative_prompts: list[str], image_artifact: ImageArtifact): + def _generate_variation( + self, prompts: list[str], negative_prompts: list[str], image_artifact: ImageArtifact + ) -> ImageArtifact: output_artifact = self.engine.run(prompts=prompts, negative_prompts=negative_prompts, image=image_artifact) if self.output_dir or self.output_file: diff --git a/griptape/utils/decorators.py b/griptape/utils/decorators.py index 83811d9a6..10bf6c9a4 100644 --- a/griptape/utils/decorators.py +++ b/griptape/utils/decorators.py @@ -1,4 +1,5 @@ import functools +from typing import Any, Callable import schema from schema import Schema @@ -6,7 +7,7 @@ CONFIG_SCHEMA = Schema({"description": str, schema.Optional("schema"): Schema}) -def activity(config: dict): +def activity(config: dict) -> Any: validated_config = CONFIG_SCHEMA.validate(config) validated_config.update({k: v for k, v in config.items() if k not in validated_config}) @@ -14,9 +15,9 @@ def activity(config: dict): if not validated_config.get("schema"): validated_config["schema"] = None - def decorator(func): + def decorator(func: Callable) -> Any: @functools.wraps(func) - def wrapper(self, *args, **kwargs): + def wrapper(self: Any, *args, **kwargs) -> Any: return func(self, *args, **kwargs) setattr(wrapper, "name", func.__name__) diff --git a/griptape/utils/deprecation.py b/griptape/utils/deprecation.py index f52ea7c64..0b69f1b4f 100644 --- a/griptape/utils/deprecation.py +++ b/griptape/utils/deprecation.py @@ -1,7 +1,7 @@ import warnings -def deprecation_warn(message: str, stacklevel: int = 2): +def deprecation_warn(message: str, stacklevel: int = 2) -> None: warnings.simplefilter("always", DeprecationWarning) warnings.warn(message, category=DeprecationWarning, stacklevel=stacklevel) warnings.simplefilter("default", DeprecationWarning) diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index fe0cf50d7..372004423 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -4,7 +4,7 @@ from threading import Thread from typing import TYPE_CHECKING -from attrs import Factory, define, field +from attrs import Attribute, Factory, define, field from griptape.artifacts.text_artifact import TextArtifact from griptape.events.completion_chunk_event import CompletionChunkEvent @@ -36,7 +36,7 @@ class Stream: structure: Structure = field() @structure.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_structure(self, _, structure: Structure): + def validate_structure(self, _: Attribute, structure: Structure) -> None: if structure and not structure.config.prompt_driver.stream: raise ValueError("prompt driver does not have streaming enabled, enable with stream=True") @@ -56,8 +56,8 @@ def run(self, *args) -> Iterator[TextArtifact]: yield TextArtifact(value=event.token) t.join() - def _run_structure(self, *args): - def event_handler(event: BaseEvent): + def _run_structure(self, *args) -> None: + def event_handler(event: BaseEvent) -> None: self._event_queue.put(event) stream_event_listener = EventListener( diff --git a/pyproject.toml b/pyproject.toml index 0c0d28d3f..2e094141a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -215,6 +215,7 @@ select = [ "FA", # flake8-future-annotations "COM", # flake8-commas "C4", # flake8-comprehensions + "ANN", # flake8-annotations ] ignore = [ "UP007", # non-pep604-annotation @@ -230,7 +231,12 @@ ignore = [ "D105", # undocumented-magic-method "D106", # undocumented-public-nested-class "D107", # undocumented-public-init - "COM812" # missing-trailing-comma -- See https://github.com/astral-sh/ruff/issues/9216 + "COM812", # missing-trailing-comma -- See https://github.com/astral-sh/ruff/issues/9216 + "ANN002", # missing-type-args + "ANN003", # missing-type-kwargs + "ANN101", # missing-type-self + "ANN102", # missing-type-cls + "ANN401", # any-type ] [tool.ruff.lint.pydocstyle] convention = "google" From b99a828482877eb68284ab3c3e1efb2d9364abf1 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Jul 2024 07:24:23 -0700 Subject: [PATCH 165/238] Add flake8-boolean-trap ruff rule (#985) --- CHANGELOG.md | 9 ++++++ griptape/artifacts/boolean_artifact.py | 4 +-- .../base_event_listener_driver.py | 6 ++-- ...mazon_sagemaker_jumpstart_prompt_driver.py | 2 +- .../amazon_opensearch_vector_store_driver.py | 1 + .../azure_mongodb_vector_store_driver.py | 1 + .../vector/base_vector_store_driver.py | 30 ++++++++++++------- .../vector/dummy_vector_store_driver.py | 5 ++-- ...loud_knowledge_base_vector_store_driver.py | 7 +++-- .../vector/local_vector_store_driver.py | 12 ++++---- .../vector/marqo_vector_store_driver.py | 8 +++-- .../mongodb_atlas_vector_store_driver.py | 6 ++-- .../vector/opensearch_vector_store_driver.py | 6 ++-- .../vector/pgvector_vector_store_driver.py | 7 +++-- .../vector/pinecone_vector_store_driver.py | 6 ++-- .../vector/qdrant_vector_store_driver.py | 6 ++-- .../vector/redis_vector_store_driver.py | 7 +++-- griptape/events/event_listener.py | 2 +- .../task/storage/text_artifact_storage.py | 4 +-- griptape/structures/agent.py | 2 +- griptape/structures/structure.py | 6 ++-- griptape/structures/workflow.py | 4 ++- griptape/utils/dict_utils.py | 2 +- pyproject.toml | 1 + .../test_base_local_vector_store_driver.py | 12 ++++---- .../vector/test_dummy_vector_store_driver.py | 2 +- .../vector/test_local_vector_store_driver.py | 6 ++-- .../vector/test_qdrant_vector_store_driver.py | 2 +- 28 files changed, 104 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d6002e1..151a2199a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. ### Changed +- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifact` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.upsert_text` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.does_entry_exist` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.load_artifacts` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.upsert_vector` optional arguments are now keyword-only arguments. +- **BREAKING**: `BaseVectorStoreDriver.query` optional arguments are now keyword-only arguments. +- **BREAKING**: `EventListener.publish_event`'s `flush` argument is now a keyword-only argument. +- **BREAKING**: `BaseEventListenerDriver.publish_event`'s `flush` argument is now a keyword-only argument. ### Fixed - Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. diff --git a/griptape/artifacts/boolean_artifact.py b/griptape/artifacts/boolean_artifact.py index 7719e9cfe..ac45a1967 100644 --- a/griptape/artifacts/boolean_artifact.py +++ b/griptape/artifacts/boolean_artifact.py @@ -17,9 +17,9 @@ def parse_bool(cls, value: Union[str, bool]) -> BooleanArtifact: if value is not None: if isinstance(value, str): if value.lower() == "true": - return BooleanArtifact(True) + return BooleanArtifact(True) # noqa: FBT003 elif value.lower() == "false": - return BooleanArtifact(False) + return BooleanArtifact(False) # noqa: FBT003 elif isinstance(value, bool): return BooleanArtifact(value) raise ValueError(f"Cannot convert '{value}' to BooleanArtifact") diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 7792943f3..97d7e5cfa 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -28,9 +28,9 @@ class BaseEventListenerDriver(ABC): def batch(self) -> list[dict]: return self._batch - def publish_event(self, event: BaseEvent | dict, flush: bool = False) -> None: + def publish_event(self, event: BaseEvent | dict, *, flush: bool = False) -> None: with self.futures_executor_fn() as executor: - executor.submit(self._safe_try_publish_event, event, flush) + executor.submit(self._safe_try_publish_event, event, flush=flush) @abstractmethod def try_publish_event_payload(self, event_payload: dict) -> None: ... @@ -38,7 +38,7 @@ def try_publish_event_payload(self, event_payload: dict) -> None: ... @abstractmethod def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: ... - def _safe_try_publish_event(self, event: BaseEvent | dict, flush: bool) -> None: + def _safe_try_publish_event(self, event: BaseEvent | dict, *, flush: bool) -> None: try: event_payload = event if isinstance(event, dict) else event.to_dict() diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 440d6c3c5..09eadace5 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -40,7 +40,7 @@ class AmazonSageMakerJumpstartPromptDriver(BasePromptDriver): ) @stream.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_stream(self, _: Attribute, stream: bool) -> None: + def validate_stream(self, _: Attribute, stream: bool) -> None: # noqa: FBT001 if stream: raise ValueError("streaming is not supported") diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index 14e3d81dc..d54b98ec2 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -52,6 +52,7 @@ class AmazonOpenSearchVectorStoreDriver(OpenSearchVectorStoreDriver): def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index c4c7ef912..60e9df097 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -14,6 +14,7 @@ class AzureMongoDbVectorStoreDriver(MongoDbAtlasVectorStoreDriver): def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 78407b254..c22285be6 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -44,18 +44,24 @@ def to_artifact(self) -> BaseArtifact: def upsert_text_artifacts( self, artifacts: list[TextArtifact] | dict[str, list[TextArtifact]], + *, meta: Optional[dict] = None, **kwargs, ) -> None: with self.futures_executor_fn() as executor: if isinstance(artifacts, list): utils.execute_futures_list( - [executor.submit(self.upsert_text_artifact, a, None, meta, **kwargs) for a in artifacts], + [ + executor.submit(self.upsert_text_artifact, a, namespace=None, meta=meta, **kwargs) + for a in artifacts + ], ) else: utils.execute_futures_dict( { - namespace: executor.submit(self.upsert_text_artifact, a, namespace, meta, **kwargs) + namespace: executor.submit( + self.upsert_text_artifact, a, namespace=namespace, meta=meta, **kwargs + ) for namespace, artifact_list in artifacts.items() for a in artifact_list }, @@ -64,6 +70,7 @@ def upsert_text_artifacts( def upsert_text_artifact( self, artifact: TextArtifact, + *, namespace: Optional[str] = None, meta: Optional[dict] = None, vector_id: Optional[str] = None, @@ -75,7 +82,7 @@ def upsert_text_artifact( value = artifact.to_text() if artifact.reference is None else artifact.to_text() + str(artifact.reference) vector_id = self._get_default_vector_id(value) - if self.does_entry_exist(vector_id, namespace): + if self.does_entry_exist(vector_id, namespace=namespace): return vector_id else: meta["artifact"] = artifact.to_json() @@ -90,6 +97,7 @@ def upsert_text_artifact( def upsert_text( self, string: str, + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -97,7 +105,7 @@ def upsert_text( ) -> str: vector_id = self._get_default_vector_id(string) if vector_id is None else vector_id - if self.does_entry_exist(vector_id, namespace): + if self.does_entry_exist(vector_id, namespace=namespace): return vector_id else: return self.upsert_vector( @@ -108,14 +116,14 @@ def upsert_text( **kwargs, ) - def does_entry_exist(self, vector_id: str, namespace: Optional[str] = None) -> bool: + def does_entry_exist(self, vector_id: str, *, namespace: Optional[str] = None) -> bool: try: - return self.load_entry(vector_id, namespace) is not None + return self.load_entry(vector_id, namespace=namespace) is not None except Exception: return False - def load_artifacts(self, namespace: Optional[str] = None) -> ListArtifact: - result = self.load_entries(namespace) + def load_artifacts(self, *, namespace: Optional[str] = None) -> ListArtifact: + result = self.load_entries(namespace=namespace) artifacts = [r.to_artifact() for r in result] return ListArtifact([a for a in artifacts if isinstance(a, TextArtifact)]) @@ -127,6 +135,7 @@ def delete_vector(self, vector_id: str) -> None: ... def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -134,15 +143,16 @@ def upsert_vector( ) -> str: ... @abstractmethod - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[Entry]: ... + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[Entry]: ... @abstractmethod - def load_entries(self, namespace: Optional[str] = None) -> list[Entry]: ... + def load_entries(self, *, namespace: Optional[str] = None) -> list[Entry]: ... @abstractmethod def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index 2b659ab62..4dbb6c038 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -29,15 +29,16 @@ def upsert_vector( ) -> str: raise DummyException(__class__.__name__, "upsert_vector") - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: raise DummyException(__class__.__name__, "load_entry") - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: raise DummyException(__class__.__name__, "load_entries") def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py index f85f5b9ea..e3bda9d4e 100644 --- a/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py +++ b/griptape/drivers/vector/griptape_cloud_knowledge_base_vector_store_driver.py @@ -67,18 +67,19 @@ def upsert_text( ) -> str: raise NotImplementedError(f"{self.__class__.__name__} does not support text upsert.") - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: raise NotImplementedError(f"{self.__class__.__name__} does not support entry loading.") - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: raise NotImplementedError(f"{self.__class__.__name__} does not support entry loading.") - def load_artifacts(self, namespace: Optional[str] = None) -> ListArtifact: + def load_artifacts(self, *, namespace: Optional[str] = None) -> ListArtifact: raise NotImplementedError(f"{self.__class__.__name__} does not support Artifact loading.") def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: Optional[bool] = None, diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index 68fa4561b..ab59f332c 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -52,6 +52,7 @@ def load_entries_from_file(self, json_file: TextIO) -> dict[str, BaseVectorStore def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -60,7 +61,7 @@ def upsert_vector( vector_id = vector_id if vector_id else utils.str_to_hash(str(vector)) with self.thread_lock: - self.entries[self._namespaced_vector_id(vector_id, namespace)] = self.Entry( + self.entries[self._namespaced_vector_id(vector_id, namespace=namespace)] = self.Entry( id=vector_id, vector=vector, meta=meta, @@ -75,15 +76,16 @@ def upsert_vector( return vector_id - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: - return self.entries.get(self._namespaced_vector_id(vector_id, namespace), None) + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + return self.entries.get(self._namespaced_vector_id(vector_id, namespace=namespace), None) - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: return [entry for key, entry in self.entries.items() if namespace is None or entry.namespace == namespace] def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, @@ -117,5 +119,5 @@ def query( def delete_vector(self, vector_id: str) -> NoReturn: raise NotImplementedError(f"{self.__class__.__name__} does not support deletion.") - def _namespaced_vector_id(self, vector_id: str, namespace: Optional[str]) -> str: + def _namespaced_vector_id(self, vector_id: str, *, namespace: Optional[str]) -> str: return vector_id if namespace is None else f"{namespace}-{vector_id}" diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 38c6f7977..7f6b52103 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -39,6 +39,7 @@ class MarqoVectorStoreDriver(BaseVectorStoreDriver): def upsert_text( self, string: str, + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -73,6 +74,7 @@ def upsert_text( def upsert_text_artifact( self, artifact: TextArtifact, + *, namespace: Optional[str] = None, meta: Optional[dict] = None, vector_id: Optional[str] = None, @@ -106,7 +108,7 @@ def upsert_text_artifact( else: raise ValueError(f"Failed to upsert text: {response}") - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: """Load a document entry from the Marqo index. Args: @@ -127,7 +129,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona else: return None - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Load all document entries from the Marqo index. Args: @@ -167,6 +169,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, @@ -228,6 +231,7 @@ def get_indexes(self) -> list[str]: def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index 26d92e6fd..b17aaf4e7 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -51,6 +51,7 @@ def get_collection(self) -> Collection: def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -73,7 +74,7 @@ def upsert_vector( ) return vector_id - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: """Loads a document entry from the MongoDB collection based on the vector ID. Returns: @@ -95,7 +96,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona meta=doc["meta"], ) - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Loads all document entries from the MongoDB collection. Entries can optionally be filtered by namespace. @@ -116,6 +117,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 7f4044e19..403ee18a4 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -49,6 +49,7 @@ class OpenSearchVectorStoreDriver(BaseVectorStoreDriver): def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -66,7 +67,7 @@ def upsert_vector( return response["_id"] - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: """Retrieves a specific vector entry from OpenSearch based on its identifier and optional namespace. Returns: @@ -95,7 +96,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona logging.error(f"Error while loading entry: {e}") return None - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Retrieves all vector entries from OpenSearch that match the optional namespace. Returns: @@ -122,6 +123,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 2d3d5bf65..f82a5e3ac 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -62,6 +62,7 @@ def __attrs_post_init__(self) -> None: def setup( self, + *, create_schema: bool = True, install_uuid_extension: bool = True, install_vector_extension: bool = True, @@ -79,6 +80,7 @@ def setup( def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -93,7 +95,7 @@ def upsert_vector( return str(getattr(obj, "id")) - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> BaseVectorStoreDriver.Entry: """Retrieves a specific vector entry from the collection based on its identifier and optional namespace.""" with Session(self.engine) as session: result = session.get(self._model, vector_id) @@ -105,7 +107,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> BaseVec meta=getattr(result, "meta"), ) - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Retrieves all vector entries from the collection, optionally filtering to only those that match the provided namespace.""" with Session(self.engine) as session: query = session.query(self._model) @@ -127,6 +129,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = BaseVectorStoreDriver.DEFAULT_QUERY_COUNT, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 94754317d..028ddebd6 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -44,7 +44,7 @@ def upsert_vector( return vector_id - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: result = self.index.fetch(ids=[vector_id], namespace=namespace).to_dict() vectors = list(result["vectors"].values()) @@ -60,7 +60,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona else: return None - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: # This is a hacky way to query up to 10,000 values from Pinecone. Waiting on an official API for fetching # all values from a namespace: # https://community.pinecone.io/t/is-there-a-way-to-query-all-the-vectors-and-or-metadata-from-a-namespace/797/5 @@ -85,10 +85,10 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, - # PineconeVectorStorageDriver-specific params: include_metadata: bool = True, **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: diff --git a/griptape/drivers/vector/qdrant_vector_store_driver.py b/griptape/drivers/vector/qdrant_vector_store_driver.py index a92e9a060..4b88b9d5c 100644 --- a/griptape/drivers/vector/qdrant_vector_store_driver.py +++ b/griptape/drivers/vector/qdrant_vector_store_driver.py @@ -89,6 +89,7 @@ def delete_vector(self, vector_id: str) -> None: def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, @@ -127,6 +128,7 @@ def query( def upsert_vector( self, vector: list[float], + *, vector_id: Optional[str] = None, namespace: Optional[str] = None, meta: Optional[dict] = None, @@ -163,7 +165,7 @@ def upsert_vector( self.client.upsert(collection_name=self.collection_name, points=points) return vector_id - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: """Load a vector entry from the Qdrant collection based on its ID. Parameters: @@ -184,7 +186,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona else: return None - def load_entries(self, namespace: Optional[str] = None, **kwargs) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None, **kwargs) -> list[BaseVectorStoreDriver.Entry]: """Load vector entries from the Qdrant collection. Parameters: diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index a676dd908..7d262f05d 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -78,7 +78,7 @@ def upsert_vector( return vector_id - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: + def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: """Retrieves a specific vector entry from Redis based on its identifier and optional namespace. Returns: @@ -91,7 +91,7 @@ def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optiona return BaseVectorStoreDriver.Entry(id=vector_id, meta=meta, vector=vector, namespace=namespace) - def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: + def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: """Retrieves all vector entries from Redis that match the optional namespace. Returns: @@ -102,7 +102,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD entries = [] for key in keys: - entry = self.load_entry(key.decode("utf-8"), namespace) + entry = self.load_entry(key.decode("utf-8"), namespace=namespace) if entry: entries.append(entry) @@ -111,6 +111,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD def query( self, query: str, + *, count: Optional[int] = None, namespace: Optional[str] = None, include_vectors: bool = False, diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index aee850e08..74171d375 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -16,7 +16,7 @@ class EventListener: event_types: Optional[list[type[BaseEvent]]] = field(default=None, kw_only=True) driver: Optional[BaseEventListenerDriver] = field(default=None, kw_only=True) - def publish_event(self, event: BaseEvent, flush: bool = False) -> None: + def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None: event_types = self.event_types if event_types is None or type(event) in event_types: diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 4fdb4011c..8e66c5aba 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -32,12 +32,12 @@ def can_store(self, artifact: BaseArtifact) -> bool: def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: if isinstance(artifact, TextArtifact): - self.vector_store_driver.upsert_text_artifact(artifact, namespace) + self.vector_store_driver.upsert_text_artifact(artifact, namespace=namespace) else: raise ValueError("Artifact must be of instance TextArtifact") def load_artifacts(self, namespace: str) -> ListArtifact: - return self.vector_store_driver.load_artifacts(namespace) + return self.vector_store_driver.load_artifacts(namespace=namespace) def summarize(self, namespace: str) -> TextArtifact: if self.summary_engine is None: diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 569accffc..693a98c34 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -25,7 +25,7 @@ class Agent(Structure): fail_fast: bool = field(default=False, kw_only=True) @fail_fast.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_fail_fast(self, _: Attribute, fail_fast: bool) -> None: + def validate_fail_fast(self, _: Attribute, fail_fast: bool) -> None: # noqa: FBT001 if fail_fast: raise ValueError("Agents cannot fail fast, as they can only have 1 task.") diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 5a37c137e..13c247824 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -110,7 +110,7 @@ def validate_embedding_driver(self, attribute: Attribute, value: BaseEmbeddingDr deprecation_warn(f"`{attribute.name}` is deprecated, use `config.embedding_driver` instead.") @stream.validator # pyright: ignore[reportAttributeAccessIssue] - def validate_stream(self, attribute: Attribute, value: bool) -> None: + def validate_stream(self, attribute: Attribute, value: bool) -> None: # noqa: FBT001 if value is not None: deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver.stream` instead.") @@ -228,9 +228,9 @@ def remove_event_listener(self, event_listener: EventListener) -> None: else: raise ValueError("Event Listener not found.") - def publish_event(self, event: BaseEvent, flush: bool = False) -> None: + def publish_event(self, event: BaseEvent, *, flush: bool = False) -> None: for event_listener in self.event_listeners: - event_listener.publish_event(event, flush) + event_listener.publish_event(event, flush=True) def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 55dc63033..32485af7b 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -37,6 +37,7 @@ def insert_tasks( parent_tasks: BaseTask | list[BaseTask], tasks: BaseTask | list[BaseTask], child_tasks: BaseTask | list[BaseTask], + *, preserve_relationship: bool = False, ) -> list[BaseTask]: """Insert tasks between parent and child tasks in the workflow. @@ -55,7 +56,7 @@ def insert_tasks( child_tasks = [child_tasks] for task in tasks: - self.insert_task(parent_tasks, task, child_tasks, preserve_relationship) + self.insert_task(parent_tasks, task, child_tasks, preserve_relationship=preserve_relationship) return tasks @@ -64,6 +65,7 @@ def insert_task( parent_tasks: list[BaseTask], task: BaseTask, child_tasks: list[BaseTask], + *, preserve_relationship: bool = False, ) -> BaseTask: task.preprocess(self) diff --git a/griptape/utils/dict_utils.py b/griptape/utils/dict_utils.py index 04be605df..0bf5f59db 100644 --- a/griptape/utils/dict_utils.py +++ b/griptape/utils/dict_utils.py @@ -17,7 +17,7 @@ def remove_key_in_dict_recursively(d: dict, key: str) -> dict: return d -def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], add_keys: bool = True) -> dict: +def dict_merge(dct: Optional[dict], merge_dct: Optional[dict], *, add_keys: bool = True) -> dict: """Recursive dict merge. Inspired by :meth:``dict.update()``, instead of diff --git a/pyproject.toml b/pyproject.toml index 2e094141a..4f9c3b49d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -216,6 +216,7 @@ select = [ "COM", # flake8-commas "C4", # flake8-comprehensions "ANN", # flake8-annotations + "FBT", # flake8-boolean-trap ] ignore = [ "UP007", # non-pep604-annotation diff --git a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py index 6cd1763f6..8c08292dd 100644 --- a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py @@ -41,8 +41,8 @@ def test_upsert_csv_row(self, driver): def test_upsert_multiple(self, driver): driver.upsert_text_artifacts({"foo": [TextArtifact("foo")], "bar": [TextArtifact("bar")]}) - foo_entries = driver.load_entries("foo") - bar_entries = driver.load_entries("bar") + foo_entries = driver.load_entries(namespace="foo") + bar_entries = driver.load_entries(namespace="bar") assert len(driver.entries) == 2 assert foo_entries[0].to_artifact().value == "foo" @@ -70,8 +70,8 @@ def test_load_entries(self, driver): driver.upsert_text_artifact(TextArtifact("foobar 3"), namespace="test-namespace-2") assert len(driver.load_entries()) == 3 - assert len(driver.load_entries("test-namespace-1")) == 2 - assert len(driver.load_entries("test-namespace-2")) == 1 + assert len(driver.load_entries(namespace="test-namespace-1")) == 2 + assert len(driver.load_entries(namespace="test-namespace-2")) == 1 def test_load_artifacts(self, driver): driver.upsert_text_artifact(TextArtifact("foobar 1"), namespace="test-namespace-1") @@ -79,8 +79,8 @@ def test_load_artifacts(self, driver): driver.upsert_text_artifact(TextArtifact("foobar 3"), namespace="test-namespace-2") assert len(driver.load_artifacts()) == 3 - assert len(driver.load_artifacts("test-namespace-1")) == 2 - assert len(driver.load_artifacts("test-namespace-2")) == 1 + assert len(driver.load_artifacts(namespace="test-namespace-1")) == 2 + assert len(driver.load_artifacts(namespace="test-namespace-2")) == 1 def test_does_entry_exist_exception(self, driver): with patch.object(driver, "load_entry", side_effect=Exception): diff --git a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py index abb7f3b38..720778c38 100644 --- a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py @@ -22,7 +22,7 @@ def test_load_entry(self, vector_store_driver): def test_load_entries(self, vector_store_driver): with pytest.raises(DummyException): - vector_store_driver.load_entries("foo bar huzzah") + vector_store_driver.load_entries(namespace="foo bar huzzah") def test_query(self, vector_store_driver): with pytest.raises(DummyException): diff --git a/tests/unit/drivers/vector/test_local_vector_store_driver.py b/tests/unit/drivers/vector/test_local_vector_store_driver.py index 937f14ece..314f2fd6d 100644 --- a/tests/unit/drivers/vector/test_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_local_vector_store_driver.py @@ -13,11 +13,11 @@ def driver(self): def test_upsert_text_artifacts_dict(self, driver): driver.upsert_text_artifacts({"foo": [TextArtifact("bar"), TextArtifact("baz")], "bar": [TextArtifact("bar")]}) - assert len(driver.load_artifacts("foo")) == 2 - assert len(driver.load_artifacts("bar")) == 1 + assert len(driver.load_artifacts(namespace="foo")) == 2 + assert len(driver.load_artifacts(namespace="bar")) == 1 def test_upsert_text_artifacts_list(self, driver): driver.upsert_text_artifacts([TextArtifact("bar"), TextArtifact("baz")]) - assert len(driver.load_artifacts("foo")) == 0 + assert len(driver.load_artifacts(namespace="foo")) == 0 assert len(driver.load_artifacts()) == 2 diff --git a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py index c999af8b9..8abfbf4f7 100644 --- a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py @@ -93,7 +93,7 @@ def test_query(self, driver): count = 10 include_vectors = True - results = driver.query(query, count, include_vectors=include_vectors) + results = driver.query(query, count=count, include_vectors=include_vectors) mock_embed.assert_called_once_with(query) mock_search.assert_called_once_with( From 974a3cb1626e8c75ea9a44f58dbd5b12b04e38f1 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Jul 2024 11:19:52 -0700 Subject: [PATCH 166/238] Run ruff on entire project (#986) --- Makefile | 8 ++-- docs/gen_ref_pages.py | 9 ++-- docs/plugins/swagger_ui_plugin.py | 9 ++-- pyproject.toml | 11 ++++- .../test_pgvector_vector_store_driver.py | 25 +++++------ tests/integration/rules/test_rule.py | 5 ++- .../tasks/test_csv_extraction_task.py | 7 ++-- .../tasks/test_json_extraction_task.py | 10 +++-- tests/integration/tasks/test_prompt_task.py | 3 +- tests/integration/tasks/test_rag_task.py | 7 ++-- .../tasks/test_text_summary_task.py | 29 ++++++------- tests/integration/tasks/test_tool_task.py | 3 +- tests/integration/tasks/test_toolkit_task.py | 8 ++-- tests/integration/test_code_blocks.py | 2 +- tests/integration/tools/test_calculator.py | 3 +- tests/integration/tools/test_file_manager.py | 3 +- .../tools/test_google_docs_client.py | 4 +- .../tools/test_google_drive_client.py | 4 +- tests/mocks/docker/fake_api.py | 17 ++++---- tests/mocks/docker/fake_api_client.py | 15 +++---- tests/mocks/invalid_mock_tool/tool.py | 3 +- tests/mocks/mock_audio_input_task.py | 1 + tests/mocks/mock_embedding_driver.py | 5 ++- tests/mocks/mock_event_listener_driver.py | 2 + tests/mocks/mock_failing_prompt_driver.py | 9 +++- tests/mocks/mock_image_generation_driver.py | 4 ++ tests/mocks/mock_image_generation_task.py | 2 +- tests/mocks/mock_image_query_driver.py | 5 ++- tests/mocks/mock_multi_text_input_task.py | 1 + tests/mocks/mock_prompt_driver.py | 12 +++--- tests/mocks/mock_serializable.py | 10 ++++- tests/mocks/mock_structure_config.py | 5 ++- tests/mocks/mock_task.py | 3 +- tests/mocks/mock_text_input_task.py | 1 + tests/mocks/mock_tokenizer.py | 2 + tests/mocks/mock_tool/tool.py | 7 ++-- tests/unit/artifacts/test_action_artifact.py | 6 ++- tests/unit/artifacts/test_audio_artifact.py | 3 +- tests/unit/artifacts/test_base_artifact.py | 7 ++-- .../artifacts/test_base_media_artifact.py | 3 +- tests/unit/artifacts/test_blob_artifact.py | 4 +- tests/unit/artifacts/test_boolean_artifact.py | 10 +++-- tests/unit/artifacts/test_image_artifact.py | 5 ++- tests/unit/artifacts/test_list_artifact.py | 3 +- tests/unit/artifacts/test_text_artifact.py | 4 +- tests/unit/chunkers/test_markdown_chunker.py | 3 +- tests/unit/chunkers/test_pdf_chunker.py | 4 +- tests/unit/chunkers/test_text_chunker.py | 3 +- tests/unit/chunkers/utils.py | 4 +- .../test_action_call_message_content.py | 3 +- .../test_action_result_message_content.py | 1 + .../contents/test_image_message_content.py | 1 + .../contents/test_text_message_content.py | 2 +- tests/unit/common/test_action.py | 4 +- tests/unit/common/test_prompt_stack.py | 15 ++++--- .../test_amazon_bedrock_structure_config.py | 11 ++--- .../config/test_anthropic_structure_config.py | 9 ++-- .../test_azure_openai_structure_config.py | 7 ++-- .../config/test_cohere_structure_config.py | 5 ++- .../config/test_google_structure_config.py | 7 ++-- .../config/test_openai_structure_config.py | 7 ++-- tests/unit/config/test_structure_config.py | 5 ++- ..._amazon_bedrock_cohere_embedding_driver.py | 6 ++- ...t_amazon_bedrock_titan_embedding_driver.py | 6 ++- .../test_azure_openai_embedding_driver.py | 4 +- .../embedding/test_base_embedding_driver.py | 6 ++- .../embedding/test_cohere_embedding_driver.py | 2 + .../embedding/test_dummy_embedding_driver.py | 4 +- .../embedding/test_google_embedding_driver.py | 2 + .../embedding/test_ollama_embedding_driver.py | 1 + .../embedding/test_openai_embedding_driver.py | 4 +- ...st_sagemaker_jumpstart_embedding_driver.py | 10 ++--- .../test_voyageai_embedding_driver.py | 4 +- .../test_amazon_sqs_event_listener_driver.py | 13 +++--- .../test_aws_iot_event_listener_driver.py | 13 +++--- .../test_base_event_listener_driver.py | 1 + ...st_griptape_cloud_event_listener_driver.py | 5 +-- .../test_pusher_event_listener_driver.py | 12 +++--- .../test_webhook_event_listener_driver.py | 8 ++-- .../test_amazon_s3_file_manager_driver.py | 41 +++++++++---------- .../test_local_file_manager_driver.py | 26 ++++++------ ...table_diffusion_image_generation_driver.py | 10 ++--- ...st_azure_openai_image_generation_driver.py | 8 ++-- .../test_dummy_image_generation_driver.py | 6 +-- .../test_leonardo_image_generation_driver.py | 6 ++- .../test_openai_image_generation_driver.py | 6 ++- ...ock_stable_diffusion_image_model_driver.py | 8 ++-- .../test_bedrock_titan_image_model_driver.py | 6 +-- .../test_amazon_bedrock_image_query_driver.py | 14 ++++--- .../test_anthropic_image_query_driver.py | 10 +++-- .../test_azure_openai_image_query_driver.py | 10 +++-- .../test_dummy_image_query_driver.py | 6 +-- .../test_openai_image_query_driver.py | 10 +++-- ...bedrock_claude_image_query_model_driver.py | 3 +- ...est_dynamodb_conversation_memory_driver.py | 13 +++--- .../test_local_conversation_memory_driver.py | 17 ++++---- .../test_redis_conversation_memory_driver.py | 9 ++-- .../test_amazon_bedrock_prompt_driver.py | 12 +++--- ...mazon_sagemaker_jumpstart_prompt_driver.py | 12 +++--- .../prompt/test_anthropic_prompt_driver.py | 15 +++---- .../test_azure_openai_chat_prompt_driver.py | 12 +++--- .../drivers/prompt/test_base_prompt_driver.py | 10 ++--- .../prompt/test_cohere_prompt_driver.py | 7 ++-- .../prompt/test_dummy_prompt_driver.py | 4 +- .../prompt/test_google_prompt_driver.py | 22 +++++----- .../test_hugging_face_hub_prompt_driver.py | 11 ++--- ...est_hugging_face_pipeline_prompt_driver.py | 7 ++-- .../prompt/test_ollama_prompt_driver.py | 11 ++--- .../prompt/test_openai_chat_prompt_driver.py | 21 +++++----- .../rerank/test_cohere_rerank_driver.py | 5 ++- .../sql/test_amazon_redshift_sql_driver.py | 9 ++-- .../drivers/sql/test_snowflake_sql_driver.py | 18 ++++---- tests/unit/drivers/sql/test_sql_driver.py | 3 +- ...est_griptape_cloud_structure_run_driver.py | 5 ++- .../test_local_structure_run_driver.py | 12 +++--- ...test_elevenlabs_audio_generation_driver.py | 6 ++- .../test_openai_audio_transcription_driver.py | 7 ++-- ...t_amazon_opensearch_vector_store_driver.py | 10 +++-- .../test_azure_mongodb_vector_store_driver.py | 16 ++++---- .../test_base_local_vector_store_driver.py | 6 ++- .../vector/test_dummy_vector_store_driver.py | 3 +- ...loud_knowledge_base_vector_store_driver.py | 6 ++- .../vector/test_local_vector_store_driver.py | 3 +- .../vector/test_marqo_vector_store_driver.py | 6 ++- .../test_mongodb_atlas_vector_store_driver.py | 18 ++++---- .../test_opensearch_vector_store_driver.py | 8 ++-- ...st_persistent_local_vector_store_driver.py | 6 ++- .../test_pgvector_vector_store_driver.py | 20 +++++---- .../test_pinecone_vector_storage_driver.py | 10 +---- .../vector/test_qdrant_vector_store_driver.py | 12 +++--- .../vector/test_redis_vector_store_driver.py | 12 +++--- .../test_markdownify_web_scraper_driver.py | 17 ++++---- .../test_proxy_web_scraper_driver.py | 8 ++-- .../test_trafilatura_web_scraper_driver.py | 4 +- .../test_duck_duck_go_web_search_driver.py | 10 +++-- .../test_google_web_search_driver.py | 12 +++--- .../extraction/test_csv_extraction_engine.py | 3 +- .../extraction/test_json_extraction_engine.py | 3 +- ...est_footnote_prompt_response_rag_module.py | 3 +- .../test_prompt_response_rag_module.py | 3 +- ...est_rulesets_before_response_rag_module.py | 2 +- .../test_text_chunks_response_rag_module.py | 3 +- .../test_text_chunks_rerank_rag_module.py | 3 +- .../test_text_loader_retrieval_rag_module.py | 2 +- tests/unit/engines/rag/test_rag_engine.py | 9 ++-- .../summary/test_prompt_summary_engine.py | 10 +++-- tests/unit/events/test_base_event.py | 14 ++++--- .../events/test_completion_chunk_event.py | 3 +- tests/unit/events/test_event_listener.py | 26 ++++++------ .../test_finish_actions_subtask_event.py | 3 +- tests/unit/events/test_finish_prompt_event.py | 3 +- .../events/test_finish_structure_run_event.py | 2 +- tests/unit/events/test_finish_task_event.py | 5 ++- .../test_start_actions_subtask_event.py | 3 +- tests/unit/events/test_start_prompt_event.py | 5 ++- .../events/test_start_structure_run_event.py | 3 +- tests/unit/events/test_start_task_event.py | 3 +- tests/unit/loaders/conftest.py | 6 +-- tests/unit/loaders/test_audio_loader.py | 9 ++-- tests/unit/loaders/test_blob_loader.py | 1 + tests/unit/loaders/test_csv_loader.py | 3 +- tests/unit/loaders/test_dataframe_loader.py | 5 ++- tests/unit/loaders/test_email_loader.py | 14 ++++--- tests/unit/loaders/test_image_loader.py | 8 ++-- tests/unit/loaders/test_pdf_loader.py | 9 ++-- tests/unit/loaders/test_sql_loader.py | 3 +- tests/unit/loaders/test_text_loader.py | 1 + tests/unit/loaders/test_web_loader.py | 5 ++- .../meta/test_action_subtask_meta_entry.py | 3 +- tests/unit/memory/meta/test_meta_memory.py | 5 ++- .../structure/test_conversation_memory.py | 10 ++--- .../test_summary_conversation_memory.py | 3 +- .../storage/test_blob_artifact_storage.py | 3 +- .../storage/test_text_artifact_storage.py | 3 +- tests/unit/memory/tool/test_task_memory.py | 8 ++-- tests/unit/mixins/test_activity_mixin.py | 5 ++- .../test_image_artifact_file_output_mixin.py | 4 +- tests/unit/mixins/test_seriliazable_mixin.py | 8 ++-- tests/unit/schemas/test_base_schema.py | 13 +++--- tests/unit/structures/test_agent.py | 16 ++++---- tests/unit/structures/test_pipeline.py | 17 ++++---- tests/unit/structures/test_workflow.py | 28 ++++++------- tests/unit/tasks/test_actions_subtask.py | 9 ++-- .../tasks/test_audio_transcription_task.py | 13 ++---- .../unit/tasks/test_base_audio_input_task.py | 4 +- .../tasks/test_base_multi_text_input_task.py | 4 +- tests/unit/tasks/test_base_task.py | 5 +-- tests/unit/tasks/test_base_text_input_task.py | 6 +-- tests/unit/tasks/test_code_execution_task.py | 2 +- tests/unit/tasks/test_csv_extraction_task.py | 4 +- tests/unit/tasks/test_extraction_task.py | 3 +- tests/unit/tasks/test_image_query_task.py | 8 ++-- .../test_inpainting_image_generation_task.py | 15 +++---- tests/unit/tasks/test_json_extraction_task.py | 9 ++-- .../test_outpainting_image_generation_task.py | 10 ++--- .../test_prompt_image_generation_task.py | 4 +- tests/unit/tasks/test_prompt_task.py | 9 ++-- tests/unit/tasks/test_rag_task.py | 3 +- tests/unit/tasks/test_structure_run_task.py | 5 +-- tests/unit/tasks/test_text_summary_task.py | 7 ++-- tests/unit/tasks/test_text_to_speech_task.py | 2 +- tests/unit/tasks/test_tool_task.py | 6 ++- tests/unit/tasks/test_toolkit_task.py | 10 ++--- .../test_variation_image_generation_task.py | 17 ++++---- .../test_amazon_bedrock_tokenizer.py | 11 ++--- .../tokenizers/test_anthropic_tokenizer.py | 9 ++-- tests/unit/tokenizers/test_base_tokenizer.py | 1 + .../unit/tokenizers/test_cohere_tokenizer.py | 3 +- tests/unit/tokenizers/test_dummy_tokenizer.py | 3 +- .../unit/tokenizers/test_google_tokenizer.py | 12 +++--- .../tokenizers/test_hugging_face_tokenizer.py | 3 +- .../unit/tokenizers/test_openai_tokenizer.py | 14 +++---- .../unit/tokenizers/test_simple_tokenizer.py | 3 +- .../tokenizers/test_voyageai_tokenizer.py | 9 ++-- tests/unit/tools/test_aws_iam.py | 9 ++-- tests/unit/tools/test_aws_s3.py | 9 ++-- tests/unit/tools/test_base_tool.py | 14 ++++--- tests/unit/tools/test_computer.py | 5 ++- tests/unit/tools/test_date_time.py | 3 +- tests/unit/tools/test_email_client.py | 12 +++--- tests/unit/tools/test_file_manager.py | 10 +++-- tests/unit/tools/test_google_docs_client.py | 2 +- tests/unit/tools/test_google_drive_client.py | 2 +- ...st_griptape_cloud_knowledge_base_client.py | 15 +++---- ...test_inpainting_image_generation_client.py | 8 ++-- tests/unit/tools/test_openweather_client.py | 8 ++-- ...test_outpainting_image_variation_client.py | 8 ++-- .../test_prompt_image_generation_client.py | 6 +-- tests/unit/tools/test_rest_api_client.py | 3 +- tests/unit/tools/test_sql_client.py | 6 ++- tests/unit/tools/test_structure_run_client.py | 5 ++- tests/unit/tools/test_task_memory_client.py | 3 +- .../unit/tools/test_text_to_speech_client.py | 6 +-- tests/unit/tools/test_transcription_client.py | 8 ++-- .../test_variation_image_generation_client.py | 8 ++-- tests/unit/tools/test_vector_store_client.py | 7 ++-- tests/unit/tools/test_web_scraper.py | 3 +- tests/unit/tools/test_web_search.py | 5 ++- tests/unit/utils/test_base_tokenizer.py | 1 + tests/unit/utils/test_command_runner.py | 1 - tests/unit/utils/test_conversation.py | 4 +- tests/unit/utils/test_deprecate.py | 1 + tests/unit/utils/test_dict_utils.py | 3 +- tests/unit/utils/test_file_utils.py | 5 ++- tests/unit/utils/test_futures.py | 1 + tests/unit/utils/test_import_utils.py | 1 + .../utils/test_load_artifact_from_memory.py | 22 ++++------ tests/unit/utils/test_message_stack.py | 2 +- tests/unit/utils/test_stream.py | 6 ++- tests/unit/utils/test_structure_visualizer.py | 6 +-- tests/utils/code_blocks.py | 4 +- tests/utils/defaults.py | 10 ++--- tests/utils/postgres.py | 2 +- tests/utils/structure_tester.py | 29 ++++++------- 254 files changed, 1059 insertions(+), 824 deletions(-) diff --git a/Makefile b/Makefile index 13410094c..d14c7184d 100644 --- a/Makefile +++ b/Makefile @@ -33,22 +33,22 @@ test/integration: .PHONY: lint lint: ## Lint project. - @poetry run ruff check --fix griptape/ + @poetry run ruff check --fix .PHONY: format format: ## Format project. - @poetry run ruff format . + @poetry run ruff format .PHONY: check check: check/format check/lint check/types check/spell ## Run all checks. .PHONY: check/format check/format: - @poetry run ruff format --check griptape/ + @poetry run ruff format --check .PHONY: check/lint check/lint: - @poetry run ruff check griptape/ + @poetry run ruff check .PHONY: check/types check/types: diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py index 62fe85b0c..85a3f3127 100644 --- a/docs/gen_ref_pages.py +++ b/docs/gen_ref_pages.py @@ -1,11 +1,12 @@ """Generate the code reference pages and navigation.""" -from textwrap import dedent from pathlib import Path +from textwrap import dedent + import mkdocs_gen_files -def build_reference_docs(): +def build_reference_docs() -> None: nav = mkdocs_gen_files.Nav() for path in sorted(Path("griptape").rglob("*.py")): @@ -37,8 +38,8 @@ def build_reference_docs(): index_file.write( dedent( """ - # Overview - This section of the documentation is dedicated to a reference API of Griptape. + # Overview + This section of the documentation is dedicated to a reference API of Griptape. Here you will find every class, function, and method that is available to you when using the library. """ ) diff --git a/docs/plugins/swagger_ui_plugin.py b/docs/plugins/swagger_ui_plugin.py index 6d5fb52da..499d74cf5 100644 --- a/docs/plugins/swagger_ui_plugin.py +++ b/docs/plugins/swagger_ui_plugin.py @@ -1,4 +1,5 @@ import os +from typing import Any import markdown from jinja2 import Environment, FileSystemLoader, select_autoescape @@ -11,7 +12,7 @@ } -def generate_page_contents(page): +def generate_page_contents(page: Any) -> str: spec_url = config_scheme["spec_url"] tmpl_url = config_scheme["template"] env = Environment(loader=FileSystemLoader("docs/plugins/tmpl"), autoescape=select_autoescape(["html", "xml"])) @@ -23,11 +24,11 @@ def generate_page_contents(page): return tmpl_out -def on_config(config): - print("INFO - swagger-ui plugin ENABLED") +def on_config(config: Any) -> None: + pass -def on_page_read_source(page, config): +def on_page_read_source(page: Any, config: Any) -> Any: index_path = os.path.join(config["docs_dir"], config_scheme["outfile"]) page_path = os.path.join(config["docs_dir"], page.file.src_path) if index_path == page_path: diff --git a/pyproject.toml b/pyproject.toml index 4f9c3b49d..807a2560e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -217,6 +217,7 @@ select = [ "C4", # flake8-comprehensions "ANN", # flake8-annotations "FBT", # flake8-boolean-trap + "PT", # flake8-pytest-style ] ignore = [ "UP007", # non-pep604-annotation @@ -238,12 +239,20 @@ ignore = [ "ANN101", # missing-type-self "ANN102", # missing-type-cls "ANN401", # any-type + "PT011", # pytest-raises-too-broad ] [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.lint.per-file-ignores] -"__init__.py" = ["I"] +"__init__.py" = [ + "I" # isort +] +"tests/*" = [ + "ANN001", # missing-type-function-argument + "ANN201", # missing-return-type-undocumented-public-function + "ANN202", # missing-return-type-private-function +] [tool.ruff.lint.flake8-tidy-imports.banned-api] "attr".msg = "The attr module is deprecated, use attrs instead." diff --git a/tests/integration/drivers/vector/test_pgvector_vector_store_driver.py b/tests/integration/drivers/vector/test_pgvector_vector_store_driver.py index e0345cecb..e592fce06 100644 --- a/tests/integration/drivers/vector/test_pgvector_vector_store_driver.py +++ b/tests/integration/drivers/vector/test_pgvector_vector_store_driver.py @@ -1,9 +1,11 @@ import uuid + import pytest +from sqlalchemy import create_engine + from griptape.drivers import PgVectorVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.utils.postgres import can_connect_to_postgres -from sqlalchemy import create_engine @pytest.mark.skipif(not can_connect_to_postgres(), reason="Postgres is not present") @@ -13,11 +15,11 @@ class TestPgVectorVectorStoreDriver: vec1 = [0.1, 0.2, 0.3] vec2 = [0.4, 0.5, 0.6] - @pytest.fixture + @pytest.fixture() def embedding_driver(self): return MockEmbeddingDriver() - @pytest.fixture + @pytest.fixture() def vector_store_driver(self, embedding_driver): driver = PgVectorVectorStoreDriver( connection_string=self.connection_string, embedding_driver=embedding_driver, table_name=self.table_name @@ -28,13 +30,13 @@ def vector_store_driver(self, embedding_driver): return driver def test_initialize_requires_engine_or_connection_string(self, embedding_driver): + driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, table_name=self.table_name) with pytest.raises(ValueError): - driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, table_name=self.table_name) driver.setup() def test_initialize_accepts_engine(self, embedding_driver): engine = create_engine(self.connection_string) - driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, engine=engine, table_name=self.table_name) + driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, engine=engine, table_name=self.table_name) # pyright: ignore[reportArgumentType] driver.setup() @@ -86,11 +88,9 @@ def test_can_insert_and_load_entry_with_namespace(self, vector_store_driver): assert result.vector == pytest.approx(self.vec1) def test_can_load_entries(self, vector_store_driver): - """ - Depending on when this test is executed relative to the others, - we don't know exactly how many vectors will be returned. We can - ensure that at least two exist and confirm that those are found. - """ + # Depending on when this test is executed relative to the others, + # we don't know exactly how many vectors will be returned. We can + # ensure that at least two exist and confirm that those are found. vec1_id = vector_store_driver.upsert_vector(self.vec1) vec2_id = vector_store_driver.upsert_vector(self.vec2) @@ -173,8 +173,9 @@ def test_query_returns_vectors_when_requested(self, vector_store_driver): assert results[0].vector == pytest.approx(embedding) def test_can_use_custom_table_name(self, embedding_driver, vector_store_driver): - """This test ensures at least one row exists in the default table before specifying - a custom table name. After inserting another row, we should be able to query only one + """This test ensures at least one row exists in the default table before specifying a custom table name. + + After inserting another row, we should be able to query only one vector from the table, and it should be the vector added to the table with the new name. """ vector_store_driver.upsert_vector(self.vec1) diff --git a/tests/integration/rules/test_rule.py b/tests/integration/rules/test_rule.py index f04996040..a62263c57 100644 --- a/tests/integration/rules/test_rule.py +++ b/tests/integration/rules/test_rule.py @@ -1,14 +1,15 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestRule: @pytest.fixture( autouse=True, params=StructureTester.RULE_CAPABLE_PROMPT_DRIVERS, ids=StructureTester.prompt_driver_id_fn ) def structure_tester(self, request): - from griptape.structures import Agent from griptape.rules import Rule + from griptape.structures import Agent agent = Agent(prompt_driver=request.param, rules=[Rule("Your name is Tony.")]) diff --git a/tests/integration/tasks/test_csv_extraction_task.py b/tests/integration/tasks/test_csv_extraction_task.py index 4624431ca..db58b9615 100644 --- a/tests/integration/tasks/test_csv_extraction_task.py +++ b/tests/integration/tasks/test_csv_extraction_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestCsvExtractionTask: @pytest.fixture( @@ -9,9 +10,9 @@ class TestCsvExtractionTask: ids=StructureTester.prompt_driver_id_fn, ) def structure_tester(self, request): - from griptape.tasks import ExtractionTask - from griptape.structures import Agent from griptape.engines import CsvExtractionEngine + from griptape.structures import Agent + from griptape.tasks import ExtractionTask columns = ["Name", "Age", "Address"] diff --git a/tests/integration/tasks/test_json_extraction_task.py b/tests/integration/tasks/test_json_extraction_task.py index fdd7140f3..115f805da 100644 --- a/tests/integration/tasks/test_json_extraction_task.py +++ b/tests/integration/tasks/test_json_extraction_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestJsonExtractionTask: @pytest.fixture( @@ -9,11 +10,12 @@ class TestJsonExtractionTask: ids=StructureTester.prompt_driver_id_fn, ) def structure_tester(self, request): - from griptape.tasks import ExtractionTask - from griptape.structures import Agent - from griptape.engines import JsonExtractionEngine from schema import Schema + from griptape.engines import JsonExtractionEngine + from griptape.structures import Agent + from griptape.tasks import ExtractionTask + # Define some JSON data user_schema = Schema({"users": [{"name": str, "age": int, "location": str}]}).json_schema("UserSchema") diff --git a/tests/integration/tasks/test_prompt_task.py b/tests/integration/tasks/test_prompt_task.py index 6734df678..1d223b4ca 100644 --- a/tests/integration/tasks/test_prompt_task.py +++ b/tests/integration/tasks/test_prompt_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestPromptTask: @pytest.fixture( diff --git a/tests/integration/tasks/test_rag_task.py b/tests/integration/tasks/test_rag_task.py index c0383002c..ce3a9140d 100644 --- a/tests/integration/tasks/test_rag_task.py +++ b/tests/integration/tasks/test_rag_task.py @@ -1,7 +1,8 @@ +import pytest + from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.utils.defaults import rag_engine from tests.utils.structure_tester import StructureTester -import pytest class TestRagTask: @@ -11,10 +12,10 @@ class TestRagTask: ids=StructureTester.prompt_driver_id_fn, ) def structure_tester(self, request): + from griptape.artifacts import TextArtifact + from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver from griptape.structures import Agent from griptape.tasks import RagTask - from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver - from griptape.artifacts import TextArtifact vector_store_driver = LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver()) artifact = TextArtifact("John Doe works as as software engineer at Griptape.") diff --git a/tests/integration/tasks/test_text_summary_task.py b/tests/integration/tasks/test_text_summary_task.py index 9cbf1d905..ff6597ba0 100644 --- a/tests/integration/tasks/test_text_summary_task.py +++ b/tests/integration/tasks/test_text_summary_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestTextSummaryTask: @pytest.fixture( @@ -10,8 +11,8 @@ class TestTextSummaryTask: ) def structure_tester(self, request): from griptape.engines.summary.prompt_summary_engine import PromptSummaryEngine - from griptape.tasks import TextSummaryTask from griptape.structures import Agent + from griptape.tasks import TextSummaryTask agent = Agent(conversation_memory=None, prompt_driver=request.param) agent.add_task(TextSummaryTask(summary_engine=PromptSummaryEngine(prompt_driver=request.param))) @@ -21,17 +22,17 @@ def structure_tester(self, request): def test_summary_task(self, structure_tester): structure_tester.run( """ - Meeting transcriot: - Miguel: Hi Brant, I want to discuss the workstream for our new product launch - Brant: Sure Miguel, is there anything in particular you want to discuss? - Miguel: Yes, I want to talk about how users enter into the product. - Brant: Ok, in that case let me add in Namita. - Namita: Hey everyone - Brant: Hi Namita, Miguel wants to discuss how users enter into the product. - Miguel: its too complicated and we should remove friction. for example, why do I need to fill out additional forms? I also find it difficult to find where to access the product when I first land on the landing page. - Brant: I would also add that I think there are too many steps. - Namita: Ok, I can work on the landing page to make the product more discoverable but brant can you work on the additional forms? - Brant: Yes but I would need to work with James from another team as he needs to unblock the sign up workflow. Miguel can you document any other concerns so that I can discuss with James only once? - Miguel: Sure. + Meeting transcriot: + Miguel: Hi Brant, I want to discuss the workstream for our new product launch + Brant: Sure Miguel, is there anything in particular you want to discuss? + Miguel: Yes, I want to talk about how users enter into the product. + Brant: Ok, in that case let me add in Namita. + Namita: Hey everyone + Brant: Hi Namita, Miguel wants to discuss how users enter into the product. + Miguel: its too complicated and we should remove friction. for example, why do I need to fill out additional forms? I also find it difficult to find where to access the product when I first land on the landing page. + Brant: I would also add that I think there are too many steps. + Namita: Ok, I can work on the landing page to make the product more discoverable but brant can you work on the additional forms? + Brant: Yes but I would need to work with James from another team as he needs to unblock the sign up workflow. Miguel can you document any other concerns so that I can discuss with James only once? + Miguel: Sure. """ ) diff --git a/tests/integration/tasks/test_tool_task.py b/tests/integration/tasks/test_tool_task.py index 1fa48e98d..aee0af110 100644 --- a/tests/integration/tasks/test_tool_task.py +++ b/tests/integration/tasks/test_tool_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestToolTask: @pytest.fixture( diff --git a/tests/integration/tasks/test_toolkit_task.py b/tests/integration/tasks/test_toolkit_task.py index a4d8c30c3..8dfcfdc73 100644 --- a/tests/integration/tasks/test_toolkit_task.py +++ b/tests/integration/tasks/test_toolkit_task.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestToolkitTask: @pytest.fixture( @@ -10,9 +11,10 @@ class TestToolkitTask: ) def structure_tester(self, request): import os - from griptape.structures import Agent - from griptape.tools import WebScraper, WebSearch, TaskMemoryClient + from griptape.drivers import GoogleWebSearchDriver + from griptape.structures import Agent + from griptape.tools import TaskMemoryClient, WebScraper, WebSearch return StructureTester( Agent( diff --git a/tests/integration/test_code_blocks.py b/tests/integration/test_code_blocks.py index 3a267a529..2da683a2a 100644 --- a/tests/integration/test_code_blocks.py +++ b/tests/integration/test_code_blocks.py @@ -2,8 +2,8 @@ import os import pytest -from tests.utils.code_blocks import get_all_code_blocks, check_py_string +from tests.utils.code_blocks import check_py_string, get_all_code_blocks if "DOCS_ALL_CHANGED_FILES" in os.environ and os.environ["DOCS_ALL_CHANGED_FILES"] != "": docs_all_changed_files = os.environ["DOCS_ALL_CHANGED_FILES"].split() diff --git a/tests/integration/tools/test_calculator.py b/tests/integration/tools/test_calculator.py index 9015c7158..2547b947d 100644 --- a/tests/integration/tools/test_calculator.py +++ b/tests/integration/tools/test_calculator.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestCalculator: @pytest.fixture( diff --git a/tests/integration/tools/test_file_manager.py b/tests/integration/tools/test_file_manager.py index 462e66470..8a283c6e8 100644 --- a/tests/integration/tools/test_file_manager.py +++ b/tests/integration/tools/test_file_manager.py @@ -1,6 +1,7 @@ -from tests.utils.structure_tester import StructureTester import pytest +from tests.utils.structure_tester import StructureTester + class TestFileManager: @pytest.fixture( diff --git a/tests/integration/tools/test_google_docs_client.py b/tests/integration/tools/test_google_docs_client.py index dfb1eb95b..4d70aac17 100644 --- a/tests/integration/tools/test_google_docs_client.py +++ b/tests/integration/tools/test_google_docs_client.py @@ -1,5 +1,7 @@ -import pytest import os + +import pytest + from tests.utils.structure_tester import StructureTester diff --git a/tests/integration/tools/test_google_drive_client.py b/tests/integration/tools/test_google_drive_client.py index 9bbbacfb5..23ebb1b32 100644 --- a/tests/integration/tools/test_google_drive_client.py +++ b/tests/integration/tools/test_google_drive_client.py @@ -1,5 +1,7 @@ -import pytest import os + +import pytest + from tests.utils.structure_tester import StructureTester diff --git a/tests/mocks/docker/fake_api.py b/tests/mocks/docker/fake_api.py index 3d5a411e5..881093057 100644 --- a/tests/mocks/docker/fake_api.py +++ b/tests/mocks/docker/fake_api.py @@ -150,7 +150,7 @@ def post_fake_create_container(): return status_code, response -def get_fake_inspect_container(tty=False): +def get_fake_inspect_container(*, tty=False): status_code = 200 response = { "Id": FAKE_CONTAINER_ID, @@ -531,7 +531,6 @@ def post_fake_secret(): f"{prefix}/{CURRENT_VERSION}/containers/{FAKE_CONTAINER_ID}/unpause": post_fake_unpause_container, f"{prefix}/{CURRENT_VERSION}/containers/{FAKE_CONTAINER_ID}/restart": post_fake_restart_container, f"{prefix}/{CURRENT_VERSION}/containers/{FAKE_CONTAINER_ID}": delete_fake_remove_container, - f"{prefix}/{CURRENT_VERSION}/images/create": post_fake_image_create, f"{prefix}/{CURRENT_VERSION}/images/{FAKE_IMAGE_ID}": delete_fake_remove_image, f"{prefix}/{CURRENT_VERSION}/images/{FAKE_IMAGE_ID}/get": get_fake_get_image, f"{prefix}/{CURRENT_VERSION}/images/load": post_fake_load_image, @@ -544,20 +543,20 @@ def post_fake_secret(): f"{prefix}/{CURRENT_VERSION}/events": get_fake_events, (f"{prefix}/{CURRENT_VERSION}/volumes", "GET"): get_fake_volume_list, (f"{prefix}/{CURRENT_VERSION}/volumes/create", "POST"): get_fake_volume, - ("{1}/{0}/volumes/{2}".format(CURRENT_VERSION, prefix, FAKE_VOLUME_NAME), "GET"): get_fake_volume, - ("{1}/{0}/volumes/{2}".format(CURRENT_VERSION, prefix, FAKE_VOLUME_NAME), "DELETE"): fake_remove_volume, - ("{1}/{0}/nodes/{2}/update?version=1".format(CURRENT_VERSION, prefix, FAKE_NODE_ID), "POST"): post_fake_update_node, + (f"{prefix}/{CURRENT_VERSION}/volumes/{FAKE_VOLUME_NAME}", "GET"): get_fake_volume, + (f"{prefix}/{CURRENT_VERSION}/volumes/{FAKE_VOLUME_NAME}", "DELETE"): fake_remove_volume, + (f"{prefix}/{CURRENT_VERSION}/nodes/{FAKE_NODE_ID}/update?version=1", "POST"): post_fake_update_node, (f"{prefix}/{CURRENT_VERSION}/swarm/join", "POST"): post_fake_join_swarm, (f"{prefix}/{CURRENT_VERSION}/networks", "GET"): get_fake_network_list, (f"{prefix}/{CURRENT_VERSION}/networks/create", "POST"): post_fake_network, - ("{1}/{0}/networks/{2}".format(CURRENT_VERSION, prefix, FAKE_NETWORK_ID), "GET"): get_fake_network, - ("{1}/{0}/networks/{2}".format(CURRENT_VERSION, prefix, FAKE_NETWORK_ID), "DELETE"): delete_fake_network, + (f"{prefix}/{CURRENT_VERSION}/networks/{FAKE_NETWORK_ID}", "GET"): get_fake_network, + (f"{prefix}/{CURRENT_VERSION}/networks/{FAKE_NETWORK_ID}", "DELETE"): delete_fake_network, ( - "{1}/{0}/networks/{2}/connect".format(CURRENT_VERSION, prefix, FAKE_NETWORK_ID), + f"{prefix}/{CURRENT_VERSION}/networks/{FAKE_NETWORK_ID}/connect", "POST", ): post_fake_network_connect, ( - "{1}/{0}/networks/{2}/disconnect".format(CURRENT_VERSION, prefix, FAKE_NETWORK_ID), + f"{prefix}/{CURRENT_VERSION}/networks/{FAKE_NETWORK_ID}/disconnect", "POST", ): post_fake_network_disconnect, f"{prefix}/{CURRENT_VERSION}/secrets/create": post_fake_secret, diff --git a/tests/mocks/docker/fake_api_client.py b/tests/mocks/docker/fake_api_client.py index 05b06216a..25df7ab83 100644 --- a/tests/mocks/docker/fake_api_client.py +++ b/tests/mocks/docker/fake_api_client.py @@ -1,15 +1,14 @@ import copy +from unittest import mock import docker from docker.constants import DEFAULT_DOCKER_API_VERSION -from unittest import mock + from . import fake_api class CopyReturnMagicMock(mock.MagicMock): - """ - A MagicMock which deep copies every return value. - """ + """A MagicMock which deep copies every return value.""" def _mock_call(self, *args, **kwargs): ret = super()._mock_call(*args, **kwargs) @@ -19,13 +18,11 @@ def _mock_call(self, *args, **kwargs): def make_fake_api_client(overrides=None): - """ - Returns non-complete fake APIClient. + """Returns non-complete fake APIClient. This returns most of the default cases correctly, but most arguments that change behaviour will not work. """ - if overrides is None: overrides = {} api_client = docker.APIClient(version=DEFAULT_DOCKER_API_VERSION) @@ -57,9 +54,7 @@ def make_fake_api_client(overrides=None): def make_fake_client(overrides=None): - """ - Returns a Client with a fake APIClient. - """ + """Returns a Client with a fake APIClient.""" client = docker.DockerClient(version=DEFAULT_DOCKER_API_VERSION) client.api = make_fake_api_client(overrides) return client diff --git a/tests/mocks/invalid_mock_tool/tool.py b/tests/mocks/invalid_mock_tool/tool.py index 91b2f78f7..fc761cae5 100644 --- a/tests/mocks/invalid_mock_tool/tool.py +++ b/tests/mocks/invalid_mock_tool/tool.py @@ -1,5 +1,6 @@ from attrs import define, field -from schema import Schema, Literal +from schema import Literal, Schema + from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/tests/mocks/mock_audio_input_task.py b/tests/mocks/mock_audio_input_task.py index d6a27d968..95b8c88d0 100644 --- a/tests/mocks/mock_audio_input_task.py +++ b/tests/mocks/mock_audio_input_task.py @@ -1,4 +1,5 @@ from attrs import define + from griptape.artifacts import TextArtifact from griptape.tasks.base_audio_input_task import BaseAudioInputTask diff --git a/tests/mocks/mock_embedding_driver.py b/tests/mocks/mock_embedding_driver.py index e21c56308..46d9bf515 100644 --- a/tests/mocks/mock_embedding_driver.py +++ b/tests/mocks/mock_embedding_driver.py @@ -1,4 +1,7 @@ -from attrs import field, define +from __future__ import annotations + +from attrs import define, field + from griptape.drivers import BaseEmbeddingDriver from tests.mocks.mock_tokenizer import MockTokenizer diff --git a/tests/mocks/mock_event_listener_driver.py b/tests/mocks/mock_event_listener_driver.py index 560fb8733..5833dd1c0 100644 --- a/tests/mocks/mock_event_listener_driver.py +++ b/tests/mocks/mock_event_listener_driver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from attrs import define from griptape.drivers import BaseEventListenerDriver diff --git a/tests/mocks/mock_failing_prompt_driver.py b/tests/mocks/mock_failing_prompt_driver.py index 0dbeb8fda..18895fdc9 100644 --- a/tests/mocks/mock_failing_prompt_driver.py +++ b/tests/mocks/mock_failing_prompt_driver.py @@ -1,12 +1,17 @@ from __future__ import annotations -from collections.abc import Iterator + +from typing import TYPE_CHECKING + from attrs import define from griptape.artifacts import TextArtifact -from griptape.common import PromptStack, Message, TextMessageContent, DeltaMessage, TextDeltaMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent, TextMessageContent from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer +if TYPE_CHECKING: + from collections.abc import Iterator + @define class MockFailingPromptDriver(BasePromptDriver): diff --git a/tests/mocks/mock_image_generation_driver.py b/tests/mocks/mock_image_generation_driver.py index de94771e2..10de11071 100644 --- a/tests/mocks/mock_image_generation_driver.py +++ b/tests/mocks/mock_image_generation_driver.py @@ -1,5 +1,9 @@ +from __future__ import annotations + from typing import Optional + from attrs import define + from griptape.artifacts import ImageArtifact from griptape.drivers.image_generation.base_image_generation_driver import BaseImageGenerationDriver diff --git a/tests/mocks/mock_image_generation_task.py b/tests/mocks/mock_image_generation_task.py index 1c79b42a9..b55c5c995 100644 --- a/tests/mocks/mock_image_generation_task.py +++ b/tests/mocks/mock_image_generation_task.py @@ -13,7 +13,7 @@ def input(self) -> TextArtifact: return self._input @input.setter - def input(self, value: str): + def input(self, value: str) -> None: self._input = TextArtifact(value) def run(self) -> ImageArtifact: diff --git a/tests/mocks/mock_image_query_driver.py b/tests/mocks/mock_image_query_driver.py index d3bec164f..8f8cc888c 100644 --- a/tests/mocks/mock_image_query_driver.py +++ b/tests/mocks/mock_image_query_driver.py @@ -1,8 +1,11 @@ +from __future__ import annotations + from typing import Optional + from attrs import define + from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver -from griptape.drivers.image_generation.base_image_generation_driver import BaseImageGenerationDriver @define diff --git a/tests/mocks/mock_multi_text_input_task.py b/tests/mocks/mock_multi_text_input_task.py index 7ab5aedf9..be00bbf65 100644 --- a/tests/mocks/mock_multi_text_input_task.py +++ b/tests/mocks/mock_multi_text_input_task.py @@ -1,4 +1,5 @@ from attrs import define + from griptape.artifacts import TextArtifact from griptape.tasks import BaseMultiTextInputTask diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index 4786b78a6..5a23dd8a2 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -1,17 +1,19 @@ from __future__ import annotations -from collections.abc import Iterator -from typing import Callable +from typing import TYPE_CHECKING, Callable from attrs import define, field from griptape.artifacts import TextArtifact -from griptape.common import PromptStack, Message, DeltaMessage, TextMessageContent, TextDeltaMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent, TextMessageContent from griptape.drivers import BasePromptDriver -from griptape.tokenizers import BaseTokenizer - from tests.mocks.mock_tokenizer import MockTokenizer +if TYPE_CHECKING: + from collections.abc import Iterator + + from griptape.tokenizers import BaseTokenizer + @define class MockPromptDriver(BasePromptDriver): diff --git a/tests/mocks/mock_serializable.py b/tests/mocks/mock_serializable.py index b02c071aa..b40ae25b4 100644 --- a/tests/mocks/mock_serializable.py +++ b/tests/mocks/mock_serializable.py @@ -1,5 +1,9 @@ -from attrs import define, field +from __future__ import annotations + from typing import Optional + +from attrs import define, field + from griptape.mixins import SerializableMixin @@ -13,4 +17,6 @@ class NestedMockSerializable(SerializableMixin): bar: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) baz: Optional[list[int]] = field(default=None, kw_only=True, metadata={"serializable": True}) secret: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) - nested: Optional[NestedMockSerializable] = field(default=None, kw_only=True, metadata={"serializable": True}) + nested: Optional[MockSerializable.NestedMockSerializable] = field( + default=None, kw_only=True, metadata={"serializable": True} + ) diff --git a/tests/mocks/mock_structure_config.py b/tests/mocks/mock_structure_config.py index 8309f541b..3f95288f4 100644 --- a/tests/mocks/mock_structure_config.py +++ b/tests/mocks/mock_structure_config.py @@ -1,9 +1,10 @@ -from attrs import define, field, Factory +from attrs import Factory, define, field + from griptape.config import StructureConfig +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_image_query_driver import MockImageQueryDriver from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @define diff --git a/tests/mocks/mock_task.py b/tests/mocks/mock_task.py index 42595f6eb..81aa03713 100644 --- a/tests/mocks/mock_task.py +++ b/tests/mocks/mock_task.py @@ -1,5 +1,6 @@ from attrs import define, field -from griptape.artifacts import TextArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, TextArtifact from griptape.tasks import BaseTask diff --git a/tests/mocks/mock_text_input_task.py b/tests/mocks/mock_text_input_task.py index 930c77e74..f1439bd42 100644 --- a/tests/mocks/mock_text_input_task.py +++ b/tests/mocks/mock_text_input_task.py @@ -1,4 +1,5 @@ from attrs import define + from griptape.artifacts import TextArtifact from griptape.tasks import BaseTextInputTask diff --git a/tests/mocks/mock_tokenizer.py b/tests/mocks/mock_tokenizer.py index eff103e99..b16332ce0 100644 --- a/tests/mocks/mock_tokenizer.py +++ b/tests/mocks/mock_tokenizer.py @@ -1,5 +1,7 @@ from __future__ import annotations + from attrs import define + from griptape.tokenizers import BaseTokenizer diff --git a/tests/mocks/mock_tool/tool.py b/tests/mocks/mock_tool/tool.py index e79023a6e..7d09f391e 100644 --- a/tests/mocks/mock_tool/tool.py +++ b/tests/mocks/mock_tool/tool.py @@ -1,6 +1,7 @@ from attrs import define, field -from schema import Schema, Literal -from griptape.artifacts import TextArtifact, ErrorArtifact, BaseArtifact, ListArtifact +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, ErrorArtifact, ListArtifact, TextArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity @@ -49,7 +50,7 @@ def test_str_output(self, value: dict) -> str: @activity(config={"description": "test description"}) def test_no_schema(self, value: dict) -> str: - return f"no schema" + return "no schema" @activity(config={"description": "test description"}) def test_list_output(self, value: dict) -> ListArtifact: diff --git a/tests/unit/artifacts/test_action_artifact.py b/tests/unit/artifacts/test_action_artifact.py index e415bbdaf..2530ed8c3 100644 --- a/tests/unit/artifacts/test_action_artifact.py +++ b/tests/unit/artifacts/test_action_artifact.py @@ -1,7 +1,9 @@ import json + import pytest -from griptape.common import ToolAction + from griptape.artifacts import ActionArtifact, BaseArtifact +from griptape.common import ToolAction class TestActionArtifact: @@ -11,7 +13,7 @@ def action(self) -> ToolAction: def test___add__(self, action): with pytest.raises(NotImplementedError): - result = ActionArtifact(action) + ActionArtifact(action) + ActionArtifact(action) + ActionArtifact(action) def test_to_text(self, action): assert ActionArtifact(action).to_text() == json.dumps(action.to_dict()) diff --git a/tests/unit/artifacts/test_audio_artifact.py b/tests/unit/artifacts/test_audio_artifact.py index 93ea816e4..6d44c05b3 100644 --- a/tests/unit/artifacts/test_audio_artifact.py +++ b/tests/unit/artifacts/test_audio_artifact.py @@ -1,9 +1,10 @@ import pytest + from griptape.artifacts import AudioArtifact, BaseArtifact class TestAudioArtifact: - @pytest.fixture + @pytest.fixture() def audio_artifact(self): return AudioArtifact(value=b"some binary audio data", format="pcm", model="provider/model", prompt="two words") diff --git a/tests/unit/artifacts/test_base_artifact.py b/tests/unit/artifacts/test_base_artifact.py index a7d7acaaf..6cf8f4466 100644 --- a/tests/unit/artifacts/test_base_artifact.py +++ b/tests/unit/artifacts/test_base_artifact.py @@ -1,12 +1,13 @@ import pytest + from griptape.artifacts import ( BaseArtifact, - TextArtifact, + BlobArtifact, ErrorArtifact, + ImageArtifact, InfoArtifact, ListArtifact, - BlobArtifact, - ImageArtifact, + TextArtifact, ) diff --git a/tests/unit/artifacts/test_base_media_artifact.py b/tests/unit/artifacts/test_base_media_artifact.py index 2829a1e2f..c85d070fe 100644 --- a/tests/unit/artifacts/test_base_media_artifact.py +++ b/tests/unit/artifacts/test_base_media_artifact.py @@ -1,5 +1,4 @@ import pytest - from attrs import define from griptape.artifacts import MediaArtifact @@ -10,7 +9,7 @@ class TestMediaArtifact: class ImaginaryMediaArtifact(MediaArtifact): media_type: str = "imagination" - @pytest.fixture + @pytest.fixture() def media_artifact(self): return self.ImaginaryMediaArtifact(value=b"some binary dream data", format="dream") diff --git a/tests/unit/artifacts/test_blob_artifact.py b/tests/unit/artifacts/test_blob_artifact.py index 08844d241..a50a673f4 100644 --- a/tests/unit/artifacts/test_blob_artifact.py +++ b/tests/unit/artifacts/test_blob_artifact.py @@ -1,6 +1,8 @@ import base64 + import pytest -from griptape.artifacts import BlobArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, BlobArtifact class TestBlobArtifact: diff --git a/tests/unit/artifacts/test_boolean_artifact.py b/tests/unit/artifacts/test_boolean_artifact.py index bcad67673..57bbf1662 100644 --- a/tests/unit/artifacts/test_boolean_artifact.py +++ b/tests/unit/artifacts/test_boolean_artifact.py @@ -1,4 +1,6 @@ +# ruff: noqa: FBT003 import pytest + from griptape.artifacts import BooleanArtifact @@ -13,14 +15,14 @@ def test_parse_bool(self): BooleanArtifact.parse_bool("foo") with pytest.raises(ValueError): - BooleanArtifact.parse_bool(None) + BooleanArtifact.parse_bool(None) # pyright: ignore[reportArgumentType] assert BooleanArtifact.parse_bool(True).value is True assert BooleanArtifact.parse_bool(False).value is False def test_add(self): with pytest.raises(ValueError): - BooleanArtifact(True) + BooleanArtifact(True) + BooleanArtifact(True) + BooleanArtifact(True) # pyright: ignore[reportUnusedExpression] def test_value_type_conversion(self): assert BooleanArtifact(1).value is True @@ -31,5 +33,5 @@ def test_value_type_conversion(self): assert BooleanArtifact("false").value is True assert BooleanArtifact([1]).value is True assert BooleanArtifact([]).value is False - assert BooleanArtifact(False) == False - assert BooleanArtifact(True) == True + assert BooleanArtifact(False).value is False + assert BooleanArtifact(True).value is True diff --git a/tests/unit/artifacts/test_image_artifact.py b/tests/unit/artifacts/test_image_artifact.py index 687397260..a722ebd91 100644 --- a/tests/unit/artifacts/test_image_artifact.py +++ b/tests/unit/artifacts/test_image_artifact.py @@ -1,9 +1,10 @@ import pytest -from griptape.artifacts import ImageArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, ImageArtifact class TestImageArtifact: - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact( value=b"some binary png image data", diff --git a/tests/unit/artifacts/test_list_artifact.py b/tests/unit/artifacts/test_list_artifact.py index 044ca8ed5..06d234645 100644 --- a/tests/unit/artifacts/test_list_artifact.py +++ b/tests/unit/artifacts/test_list_artifact.py @@ -1,5 +1,6 @@ import pytest -from griptape.artifacts import ListArtifact, TextArtifact, BlobArtifact, CsvRowArtifact + +from griptape.artifacts import BlobArtifact, CsvRowArtifact, ListArtifact, TextArtifact class TestListArtifact: diff --git a/tests/unit/artifacts/test_text_artifact.py b/tests/unit/artifacts/test_text_artifact.py index 6ea2c6697..067da0912 100644 --- a/tests/unit/artifacts/test_text_artifact.py +++ b/tests/unit/artifacts/test_text_artifact.py @@ -1,6 +1,8 @@ import json + import pytest -from griptape.artifacts import TextArtifact, BaseArtifact + +from griptape.artifacts import BaseArtifact, TextArtifact from griptape.tokenizers import OpenAiTokenizer from tests.mocks.mock_embedding_driver import MockEmbeddingDriver diff --git a/tests/unit/chunkers/test_markdown_chunker.py b/tests/unit/chunkers/test_markdown_chunker.py index 08709c092..30db64611 100644 --- a/tests/unit/chunkers/test_markdown_chunker.py +++ b/tests/unit/chunkers/test_markdown_chunker.py @@ -1,4 +1,5 @@ import pytest + from griptape.chunkers import MarkdownChunker from tests.unit.chunkers.test_text_chunker import gen_paragraph @@ -6,7 +7,7 @@ class TestTextChunker: - @pytest.fixture + @pytest.fixture() def chunker(self): return MarkdownChunker(max_tokens=MAX_TOKENS) diff --git a/tests/unit/chunkers/test_pdf_chunker.py b/tests/unit/chunkers/test_pdf_chunker.py index 605c2f6e6..dc072ca36 100644 --- a/tests/unit/chunkers/test_pdf_chunker.py +++ b/tests/unit/chunkers/test_pdf_chunker.py @@ -1,13 +1,15 @@ import os + import pytest from pypdf import PdfReader + from griptape.chunkers import PdfChunker MAX_TOKENS = 500 class TestPdfChunker: - @pytest.fixture + @pytest.fixture() def chunker(self): return PdfChunker(max_tokens=MAX_TOKENS) diff --git a/tests/unit/chunkers/test_text_chunker.py b/tests/unit/chunkers/test_text_chunker.py index 243b287e1..d9d01f16c 100644 --- a/tests/unit/chunkers/test_text_chunker.py +++ b/tests/unit/chunkers/test_text_chunker.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.chunkers import TextChunker from tests.unit.chunkers.utils import gen_paragraph @@ -7,7 +8,7 @@ class TestTextChunker: - @pytest.fixture + @pytest.fixture() def chunker(self): return TextChunker(max_tokens=MAX_TOKENS) diff --git a/tests/unit/chunkers/utils.py b/tests/unit/chunkers/utils.py index 80335e978..b9e7b8539 100644 --- a/tests/unit/chunkers/utils.py +++ b/tests/unit/chunkers/utils.py @@ -5,7 +5,9 @@ def gen_paragraph(max_tokens: int, tokenizer: BaseTokenizer, sentence_separator: all_text = "" word = "foo" index = 0 - add_word = lambda base, w, i: sentence_separator.join([base, f"{w}-{i}"]) + + def add_word(base, w, i): + return sentence_separator.join([base, f"{w}-{i}"]) while max_tokens >= tokenizer.count_tokens(add_word(all_text, word, index)): all_text = f"{word}-{index}" if all_text == "" else add_word(all_text, word, index) diff --git a/tests/unit/common/contents/test_action_call_message_content.py b/tests/unit/common/contents/test_action_call_message_content.py index 2e2e69d27..d6c3f438f 100644 --- a/tests/unit/common/contents/test_action_call_message_content.py +++ b/tests/unit/common/contents/test_action_call_message_content.py @@ -1,6 +1,7 @@ import pytest + from griptape.artifacts.action_artifact import ActionArtifact -from griptape.common import ActionCallMessageContent, ActionCallDeltaMessageContent, ToolAction +from griptape.common import ActionCallDeltaMessageContent, ActionCallMessageContent, ToolAction class TestActionCallMessageContent: diff --git a/tests/unit/common/contents/test_action_result_message_content.py b/tests/unit/common/contents/test_action_result_message_content.py index b1bcc356d..c5eed60d9 100644 --- a/tests/unit/common/contents/test_action_result_message_content.py +++ b/tests/unit/common/contents/test_action_result_message_content.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts.text_artifact import TextArtifact from griptape.common import ActionResultMessageContent, ToolAction diff --git a/tests/unit/common/contents/test_image_message_content.py b/tests/unit/common/contents/test_image_message_content.py index b6c1b4c4f..ff8dbe59d 100644 --- a/tests/unit/common/contents/test_image_message_content.py +++ b/tests/unit/common/contents/test_image_message_content.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts.image_artifact import ImageArtifact from griptape.common import ImageMessageContent diff --git a/tests/unit/common/contents/test_text_message_content.py b/tests/unit/common/contents/test_text_message_content.py index 01a3c0fd4..eab9eb718 100644 --- a/tests/unit/common/contents/test_text_message_content.py +++ b/tests/unit/common/contents/test_text_message_content.py @@ -1,5 +1,5 @@ from griptape.artifacts.text_artifact import TextArtifact -from griptape.common import TextMessageContent, TextDeltaMessageContent +from griptape.common import TextDeltaMessageContent, TextMessageContent class TestTextMessageContent: diff --git a/tests/unit/common/test_action.py b/tests/unit/common/test_action.py index db5284839..8fcf09a57 100644 --- a/tests/unit/common/test_action.py +++ b/tests/unit/common/test_action.py @@ -1,5 +1,7 @@ -import pytest import json + +import pytest + from griptape.common import ToolAction diff --git a/tests/unit/common/test_prompt_stack.py b/tests/unit/common/test_prompt_stack.py index 83a16e140..e69fe710d 100644 --- a/tests/unit/common/test_prompt_stack.py +++ b/tests/unit/common/test_prompt_stack.py @@ -1,13 +1,18 @@ import pytest -from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact, ActionArtifact -from griptape.common import ImageMessageContent, PromptStack, TextMessageContent -from griptape.common import ActionCallMessageContent -from griptape.common import ActionResultMessageContent, ToolAction +from griptape.artifacts import ActionArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.common import ( + ActionCallMessageContent, + ActionResultMessageContent, + ImageMessageContent, + PromptStack, + TextMessageContent, + ToolAction, +) class TestPromptStack: - @pytest.fixture + @pytest.fixture() def prompt_stack(self): return PromptStack() diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index 824e6ce11..afe9b3720 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -1,20 +1,21 @@ import boto3 -from pytest import fixture +import pytest + from griptape.config import AmazonBedrockStructureConfig from tests.utils.aws import mock_aws_credentials class TestAmazonBedrockStructureConfig: - @fixture(autouse=True) - def run_before_and_after_tests(self): + @pytest.fixture(autouse=True) + def _run_before_and_after_tests(self): mock_aws_credentials() - @fixture + @pytest.fixture() def config(self): mock_aws_credentials() return AmazonBedrockStructureConfig() - @fixture + @pytest.fixture() def config_with_values(self): return AmazonBedrockStructureConfig( session=boto3.Session( diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index b41309a83..05519fa5e 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -1,14 +1,15 @@ -from pytest import fixture +import pytest + from griptape.config import AnthropicStructureConfig class TestAnthropicStructureConfig: - @fixture(autouse=True) - def mock_anthropic(self, mocker): + @pytest.fixture(autouse=True) + def _mock_anthropic(self, mocker): mocker.patch("anthropic.Anthropic") mocker.patch("voyageai.Client") - @fixture + @pytest.fixture() def config(self): return AnthropicStructureConfig() diff --git a/tests/unit/config/test_azure_openai_structure_config.py b/tests/unit/config/test_azure_openai_structure_config.py index 58d557fb9..dcdc3a1dc 100644 --- a/tests/unit/config/test_azure_openai_structure_config.py +++ b/tests/unit/config/test_azure_openai_structure_config.py @@ -1,13 +1,14 @@ -from pytest import fixture +import pytest + from griptape.config import AzureOpenAiStructureConfig class TestAzureOpenAiStructureConfig: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.AzureOpenAI") - @fixture + @pytest.fixture() def config(self): return AzureOpenAiStructureConfig( azure_endpoint="http://localhost:8080", diff --git a/tests/unit/config/test_cohere_structure_config.py b/tests/unit/config/test_cohere_structure_config.py index 44ed3e4d8..113a589ec 100644 --- a/tests/unit/config/test_cohere_structure_config.py +++ b/tests/unit/config/test_cohere_structure_config.py @@ -1,9 +1,10 @@ -from pytest import fixture +import pytest + from griptape.config import CohereStructureConfig class TestCohereStructureConfig: - @fixture + @pytest.fixture() def config(self): return CohereStructureConfig(api_key="api_key") diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index 469493e2c..e193cc983 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -1,13 +1,14 @@ -from pytest import fixture +import pytest + from griptape.config import GoogleStructureConfig class TestGoogleStructureConfig: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("google.generativeai.GenerativeModel") - @fixture + @pytest.fixture() def config(self): return GoogleStructureConfig() diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index 19321006f..8969e0ad0 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -1,13 +1,14 @@ -from pytest import fixture +import pytest + from griptape.config import OpenAiStructureConfig class TestOpenAiStructureConfig: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_openai(self, mocker): return mocker.patch("openai.OpenAI") - @fixture + @pytest.fixture() def config(self): return OpenAiStructureConfig() diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index 27aaf81c4..96a68628f 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -1,9 +1,10 @@ -from pytest import fixture +import pytest + from griptape.config import StructureConfig class TestStructureConfig: - @fixture + @pytest.fixture() def config(self): return StructureConfig() diff --git a/tests/unit/drivers/embedding/test_amazon_bedrock_cohere_embedding_driver.py b/tests/unit/drivers/embedding/test_amazon_bedrock_cohere_embedding_driver.py index ba8edad90..5644227c9 100644 --- a/tests/unit/drivers/embedding/test_amazon_bedrock_cohere_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_amazon_bedrock_cohere_embedding_driver.py @@ -1,11 +1,13 @@ -import pytest from unittest import mock + +import pytest + from griptape.drivers import AmazonBedrockCohereEmbeddingDriver class TestAmazonBedrockCohereEmbeddingDriver: @pytest.fixture(autouse=True) - def mock_session(self, mocker): + def _mock_session(self, mocker): fake_embeddings = '{"embeddings": [[0, 1, 0]] }' mock_session_class = mocker.patch("boto3.Session") diff --git a/tests/unit/drivers/embedding/test_amazon_bedrock_titan_embedding_driver.py b/tests/unit/drivers/embedding/test_amazon_bedrock_titan_embedding_driver.py index df4455c24..4470cf62b 100644 --- a/tests/unit/drivers/embedding/test_amazon_bedrock_titan_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_amazon_bedrock_titan_embedding_driver.py @@ -1,11 +1,13 @@ -import pytest from unittest import mock + +import pytest + from griptape.drivers import AmazonBedrockTitanEmbeddingDriver class TestAmazonBedrockTitanEmbeddingDriver: @pytest.fixture(autouse=True) - def mock_session(self, mocker): + def _mock_session(self, mocker): fake_embeddings = '{"embedding": [0, 1, 0]}' mock_session_class = mocker.patch("boto3.Session") diff --git a/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py b/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py index d2c20c043..7f604434b 100644 --- a/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py @@ -1,5 +1,7 @@ from unittest.mock import Mock + import pytest + from griptape.drivers import AzureOpenAiEmbeddingDriver @@ -17,7 +19,7 @@ def mock_openai(self, mocker): return mock_chat_create - @pytest.fixture + @pytest.fixture() def driver(self): return AzureOpenAiEmbeddingDriver(azure_endpoint="foobar", model="gpt-4", azure_deployment="foobar") diff --git a/tests/unit/drivers/embedding/test_base_embedding_driver.py b/tests/unit/drivers/embedding/test_base_embedding_driver.py index 24b07778d..4413468b6 100644 --- a/tests/unit/drivers/embedding/test_base_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_base_embedding_driver.py @@ -1,11 +1,13 @@ +from unittest.mock import patch + import pytest + from griptape.artifacts import TextArtifact from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from unittest.mock import patch class TestBaseEmbeddingDriver: - @pytest.fixture + @pytest.fixture() def driver(self): return MockEmbeddingDriver() diff --git a/tests/unit/drivers/embedding/test_cohere_embedding_driver.py b/tests/unit/drivers/embedding/test_cohere_embedding_driver.py index af6a5576d..024e0e74c 100644 --- a/tests/unit/drivers/embedding/test_cohere_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_cohere_embedding_driver.py @@ -1,5 +1,7 @@ from unittest.mock import Mock + import pytest + from griptape.drivers import CohereEmbeddingDriver diff --git a/tests/unit/drivers/embedding/test_dummy_embedding_driver.py b/tests/unit/drivers/embedding/test_dummy_embedding_driver.py index 35f81bf77..af56ce6ac 100644 --- a/tests/unit/drivers/embedding/test_dummy_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_dummy_embedding_driver.py @@ -1,11 +1,11 @@ -from griptape.drivers import DummyEmbeddingDriver import pytest +from griptape.drivers import DummyEmbeddingDriver from griptape.exceptions import DummyException class TestDummyEmbeddingDriver: - @pytest.fixture + @pytest.fixture() def embedding_driver(self): return DummyEmbeddingDriver() diff --git a/tests/unit/drivers/embedding/test_google_embedding_driver.py b/tests/unit/drivers/embedding/test_google_embedding_driver.py index 324b95ddb..9e756491e 100644 --- a/tests/unit/drivers/embedding/test_google_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_google_embedding_driver.py @@ -1,5 +1,7 @@ from unittest.mock import MagicMock + import pytest + from griptape.drivers import GoogleEmbeddingDriver diff --git a/tests/unit/drivers/embedding/test_ollama_embedding_driver.py b/tests/unit/drivers/embedding/test_ollama_embedding_driver.py index 3886ab874..6dda23930 100644 --- a/tests/unit/drivers/embedding/test_ollama_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_ollama_embedding_driver.py @@ -1,4 +1,5 @@ import pytest + from griptape.drivers import OllamaEmbeddingDriver diff --git a/tests/unit/drivers/embedding/test_openai_embedding_driver.py b/tests/unit/drivers/embedding/test_openai_embedding_driver.py index fd30dd30f..78879345a 100644 --- a/tests/unit/drivers/embedding/test_openai_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_openai_embedding_driver.py @@ -1,5 +1,7 @@ -from unittest.mock import Mock, MagicMock +from unittest.mock import Mock + import pytest + from griptape.drivers import OpenAiEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer diff --git a/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py b/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py index 268b47c54..09ec8ec87 100644 --- a/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_sagemaker_jumpstart_embedding_driver.py @@ -1,5 +1,7 @@ -import pytest from unittest import mock + +import pytest + from griptape.drivers import AmazonSageMakerJumpstartEmbeddingDriver from griptape.tokenizers.openai_tokenizer import OpenAiTokenizer @@ -41,19 +43,17 @@ def test_try_embed_chunk(self, mock_client): ).try_embed_chunk("foobar") == [0, 2, 0] mock_client.get().read.return_value = b'{"embedding": []}' - with pytest.raises(ValueError) as e: + with pytest.raises(ValueError, match="model response is empty"): assert AmazonSageMakerJumpstartEmbeddingDriver( endpoint="test-endpoint", model="test-model", tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), ).try_embed_chunk("foobar") == [0, 2, 0] - assert str(e) == "model response is empty" mock_client.get().read.return_value = b"{}" - with pytest.raises(ValueError) as e: + with pytest.raises(ValueError, match="invalid response from model"): assert AmazonSageMakerJumpstartEmbeddingDriver( endpoint="test-endpoint", model="test-model", tokenizer=OpenAiTokenizer(model=OpenAiTokenizer.DEFAULT_OPENAI_GPT_3_CHAT_MODEL), ).try_embed_chunk("foobar") == [0, 2, 0] - assert str(e) == "invalid response from model" diff --git a/tests/unit/drivers/embedding/test_voyageai_embedding_driver.py b/tests/unit/drivers/embedding/test_voyageai_embedding_driver.py index 69db0213c..5371f8db0 100644 --- a/tests/unit/drivers/embedding/test_voyageai_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_voyageai_embedding_driver.py @@ -1,5 +1,7 @@ -import pytest from unittest.mock import Mock + +import pytest + from griptape.drivers import VoyageAiEmbeddingDriver diff --git a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py index 706831d67..10ef0354c 100644 --- a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py @@ -1,17 +1,18 @@ -from pytest import fixture -from moto import mock_sqs import boto3 -from tests.mocks.mock_event import MockEvent +import pytest +from moto import mock_sqs + from griptape.drivers.event_listener.amazon_sqs_event_listener_driver import AmazonSqsEventListenerDriver +from tests.mocks.mock_event import MockEvent from tests.utils.aws import mock_aws_credentials class TestAmazonSqsEventListenerDriver: - @fixture() - def run_before_and_after_tests(self): + @pytest.fixture() + def _run_before_and_after_tests(self): mock_aws_credentials() - @fixture() + @pytest.fixture() def driver(self): mock = mock_sqs() mock.start() diff --git a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py index 9a5fe9ec0..b597a5332 100644 --- a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py @@ -1,18 +1,19 @@ -from pytest import fixture -from moto import mock_iotdata import boto3 -from tests.mocks.mock_event import MockEvent +import pytest +from moto import mock_iotdata + from griptape.drivers.event_listener.aws_iot_core_event_listener_driver import AwsIotCoreEventListenerDriver +from tests.mocks.mock_event import MockEvent from tests.utils.aws import mock_aws_credentials @mock_iotdata class TestAwsIotCoreEventListenerDriver: - @fixture(autouse=True) - def run_before_and_after_tests(self): + @pytest.fixture(autouse=True) + def _run_before_and_after_tests(self): mock_aws_credentials() - @fixture() + @pytest.fixture() def driver(self): return AwsIotCoreEventListenerDriver( iot_endpoint="foo bar", topic="fizz buzz", session=boto3.Session(region_name="us-east-1") diff --git a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py index 383c0be89..04cfef34b 100644 --- a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py @@ -1,4 +1,5 @@ from unittest.mock import MagicMock + from tests.mocks.mock_event import MockEvent from tests.mocks.mock_event_listener_driver import MockEventListenerDriver diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index d27f09ec8..b651841ca 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -2,14 +2,13 @@ from unittest.mock import Mock import pytest -from pytest import fixture from griptape.drivers.event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver from tests.mocks.mock_event import MockEvent class TestGriptapeCloudEventListenerDriver: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_post(self, mocker): data = {"data": {"id": "test"}} @@ -18,7 +17,7 @@ def mock_post(self, mocker): return mock_post - @fixture() + @pytest.fixture() def driver(self): os.environ["GT_CLOUD_BASE_URL"] = "https://cloud123.griptape.ai" diff --git a/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py b/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py index 6f0636b5c..50856c0da 100644 --- a/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_pusher_event_listener_driver.py @@ -1,11 +1,13 @@ -from pytest import fixture -from tests.mocks.mock_event import MockEvent -from griptape.drivers import PusherEventListenerDriver from unittest.mock import Mock +import pytest + +from griptape.drivers import PusherEventListenerDriver +from tests.mocks.mock_event import MockEvent + class TestPusherEventListenerDriver: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_post(self, mocker): mock_pusher_client = mocker.patch("pusher.Pusher") mock_pusher_client.return_value.trigger.return_value = Mock() @@ -13,7 +15,7 @@ def mock_post(self, mocker): return mock_pusher_client - @fixture() + @pytest.fixture() def driver(self): return PusherEventListenerDriver( app_id="test-app-id", diff --git a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py index 50021cbe3..f6de0d20f 100644 --- a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py @@ -1,11 +1,13 @@ from unittest.mock import Mock -from pytest import fixture -from tests.mocks.mock_event import MockEvent + +import pytest + from griptape.drivers.event_listener.webhook_event_listener_driver import WebhookEventListenerDriver +from tests.mocks.mock_event import MockEvent class TestWebhookEventListenerDriver: - @fixture(autouse=True) + @pytest.fixture(autouse=True) def mock_post(self, mocker): mock_post = mocker.patch("requests.post") mock_post.return_value = Mock(status_code=201) diff --git a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py index 8d1693ade..cad76a7d6 100644 --- a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py @@ -1,9 +1,11 @@ import os import tempfile + import boto3 import pytest from moto import mock_s3 -from griptape.artifacts import ErrorArtifact, ListArtifact, InfoArtifact, TextArtifact + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.drivers import AmazonS3FileManagerDriver from griptape.loaders import TextLoader from tests.utils.aws import mock_aws_credentials @@ -11,35 +13,35 @@ class TestAmazonS3FileManagerDriver: @pytest.fixture(autouse=True) - def set_aws_credentials(self): + def _set_aws_credentials(self): mock_aws_credentials() - @pytest.fixture + @pytest.fixture() def session(self): mock = mock_s3() mock.start() yield boto3.Session(region_name="us-east-1") mock.stop() - @pytest.fixture + @pytest.fixture() def s3_client(self, session): - yield session.client("s3") + return session.client("s3") @pytest.fixture(autouse=True) def bucket(self, s3_client): bucket = "test-bucket" s3_client.create_bucket(Bucket=bucket) - def write_file(path: str, content: bytes): + def write_file(path: str, content: bytes) -> None: s3_client.put_object(Bucket=bucket, Key=path, Body=content) - def mkdir(path: str): + def mkdir(path: str) -> None: # S3-style empty directories, such as is created via the `Create Folder` button # in the AWS S3 console (essentially, an empty file with a trailing slash). s3_dir_key = path.rstrip("/") + "/" s3_client.put_object(Bucket=bucket, Key=s3_dir_key) - def copy_test_resource(resource_path: str): + def copy_test_resource(resource_path: str) -> None: file_dir = os.path.dirname(__file__) full_path = os.path.join(file_dir, "../../../resources", resource_path) full_path = os.path.normpath(full_path) @@ -58,18 +60,18 @@ def copy_test_resource(resource_path: str): mkdir("foo/bar-empty") mkdir("foo/bar/baz-empty") - yield bucket + return bucket - @pytest.fixture + @pytest.fixture() def driver(self, session, bucket): return AmazonS3FileManagerDriver(session=session, bucket=bucket) - @pytest.fixture + @pytest.fixture() def temp_dir(self): with tempfile.TemporaryDirectory() as temp_dir: yield temp_dir - @pytest.fixture + @pytest.fixture() def get_s3_value(self, s3_client, bucket): def _get_s3_value(key): return s3_client.get_object(Bucket=bucket, Key=key)["Body"].read().decode() @@ -82,7 +84,7 @@ def test_validate_workdir(self, workdir, session, bucket): AmazonS3FileManagerDriver(session=session, bucket=bucket, workdir=workdir) @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # Valid non-empty directories (without trailing slash) ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), @@ -130,7 +132,7 @@ def test_list_files(self, workdir, path, expected, driver): assert set(filter(None, artifact.value.split("\n"))) == set(expected) @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # non-existent paths ("/", "bar", "Path not found"), @@ -158,7 +160,7 @@ def test_load_file(self, driver): assert len(artifact.value) == 4 @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # non-existent files or directories ("/", "bitcoin.pdf", "Path not found"), @@ -201,7 +203,7 @@ def test_load_file_with_encoding_failure(self, session, bucket): assert isinstance(artifact, ErrorArtifact) @pytest.mark.parametrize( - "workdir,path,content", + ("workdir", "path", "content"), [ # non-existent files ("/", "resources/foo.txt", "one"), @@ -226,7 +228,7 @@ def test_save_file(self, workdir, path, content, driver, get_s3_value): assert get_s3_value(expected_s3_key) == content_str @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # non-existent directories ("/", "bar/", "Path is a directory"), @@ -248,11 +250,6 @@ def test_save_file_failure(self, workdir, path, expected, temp_dir, driver, s3_c artifact = driver.save_file(path, "foobar") - # loop over the files in the bucket and print them - response = s3_client.list_objects_v2(Bucket=bucket) - for obj in response.get("Contents", []): - print(obj.get("Key")) - assert isinstance(artifact, ErrorArtifact) assert artifact.value == expected diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index b3f4ec561..ec9963b49 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -1,28 +1,30 @@ import os -from pathlib import Path import tempfile +from pathlib import Path + import pytest -from griptape.artifacts import ErrorArtifact, ListArtifact, InfoArtifact, TextArtifact + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.drivers import LocalFileManagerDriver from griptape.loaders.text_loader import TextLoader class TestLocalFileManagerDriver: - @pytest.fixture + @pytest.fixture() def temp_dir(self): with tempfile.TemporaryDirectory() as temp_dir: - def write_file(path: str, content: bytes): + def write_file(path: str, content: bytes) -> None: full_path = os.path.join(temp_dir, path) os.makedirs(os.path.dirname(full_path), exist_ok=True) with open(full_path, "wb") as f: f.write(content) - def mkdir(path: str): + def mkdir(path: str) -> None: full_path = os.path.join(temp_dir, path) os.makedirs(full_path, exist_ok=True) - def copy_test_resources(resource_path: str): + def copy_test_resources(resource_path: str) -> None: file_dir = os.path.dirname(__file__) full_path = os.path.join(file_dir, "../../../resources", resource_path) full_path = os.path.normpath(full_path) @@ -46,7 +48,7 @@ def copy_test_resources(resource_path: str): yield temp_dir - @pytest.fixture + @pytest.fixture() def driver(self, temp_dir): return LocalFileManagerDriver(workdir=temp_dir) @@ -55,7 +57,7 @@ def test_validate_workdir(self): LocalFileManagerDriver(workdir="foo") @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # Valid non-empty directories (without trailing slash) ("/", "", ["foo", "foo.txt", "foo-empty", "resources"]), @@ -104,7 +106,7 @@ def test_list_files(self, workdir, path, expected, temp_dir, driver): assert set(filter(None, artifact.value.split("\n"))) == set(expected) @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # non-existent paths ("/", "bar", "Path not found"), @@ -133,7 +135,7 @@ def test_load_file(self, driver: LocalFileManagerDriver): assert len(artifact.value) == 4 @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # # non-existent files or directories ("/", "bitcoin.pdf", "Path not found"), @@ -177,7 +179,7 @@ def test_load_file_with_encoding_failure(self): assert isinstance(artifact, ErrorArtifact) @pytest.mark.parametrize( - "workdir,path,content", + ("workdir", "path", "content"), [ # non-existent files ("/", "resources/foo.txt", "one"), @@ -202,7 +204,7 @@ def test_save_file(self, workdir, path, content, temp_dir, driver): assert Path(driver.workdir, path).read_text() == content_bytes @pytest.mark.parametrize( - "workdir,path,expected", + ("workdir", "path", "expected"), [ # non-existent directories ("/", "bar/", "Path is a directory"), diff --git a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py index a2c51f58b..9aa4d3f4f 100644 --- a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py @@ -7,18 +7,18 @@ class TestAmazonBedrockImageGenerationDriver: - @pytest.fixture + @pytest.fixture() def bedrock_client(self): return Mock() - @pytest.fixture + @pytest.fixture() def session(self, bedrock_client): session = Mock() session.client.return_value = bedrock_client return session - @pytest.fixture + @pytest.fixture() def model_driver(self): model_driver = Mock() model_driver.text_to_image_request_parameters.return_value = {} @@ -26,7 +26,7 @@ def model_driver(self): return model_driver - @pytest.fixture + @pytest.fixture() def driver(self, session, model_driver): return AmazonBedrockImageGenerationDriver( session=session, model="stability.stable-diffusion-xl-v1", image_generation_model_driver=model_driver @@ -37,7 +37,7 @@ def test_init(self, driver): def test_init_requires_image_generation_model_driver(self, session): with pytest.raises(TypeError): - AmazonBedrockImageGenerationDriver(session=session, model="stability.stable-diffusion-xl-v1") # pyright: ignore + AmazonBedrockImageGenerationDriver(session=session, model="stability.stable-diffusion-xl-v1") # pyright: ignore[reportCallIssue] def test_try_text_to_image(self, driver): driver.bedrock_client.invoke_model.return_value = { diff --git a/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py b/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py index 2166bc28a..268708b2b 100644 --- a/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py @@ -1,10 +1,12 @@ -import pytest from unittest.mock import Mock + +import pytest + from griptape.drivers import AzureOpenAiImageGenerationDriver class TestAzureOpenAiImageGenerationDriver: - @pytest.fixture + @pytest.fixture() def driver(self): return AzureOpenAiImageGenerationDriver( model="dall-e-3", @@ -27,7 +29,7 @@ def test_init_requires_endpoint(self): with pytest.raises(TypeError): AzureOpenAiImageGenerationDriver( model="dall-e-3", client=Mock(), azure_deployment="dalle-deployment", image_size="512x512" - ) # pyright: ignore + ) # pyright: ignore[reportCallIssues] def test_try_text_to_image(self, driver): driver.client.images.generate.return_value = Mock(data=[Mock(b64_json=b"aW1hZ2UgZGF0YQ==")]) diff --git a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py index 971c39b89..2df6c6499 100644 --- a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py @@ -1,12 +1,12 @@ -from griptape.drivers import DummyImageGenerationDriver -from griptape.artifacts import ImageArtifact import pytest +from griptape.artifacts import ImageArtifact +from griptape.drivers import DummyImageGenerationDriver from griptape.exceptions import DummyException class TestDummyImageGenerationDriver: - @pytest.fixture + @pytest.fixture() def image_generation_driver(self): return DummyImageGenerationDriver() diff --git a/tests/unit/drivers/image_generation/test_leonardo_image_generation_driver.py b/tests/unit/drivers/image_generation/test_leonardo_image_generation_driver.py index 564d3616a..48805cde6 100644 --- a/tests/unit/drivers/image_generation/test_leonardo_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_leonardo_image_generation_driver.py @@ -1,11 +1,13 @@ import uuid -from unittest.mock import Mock, PropertyMock, MagicMock +from unittest.mock import Mock + import pytest + from griptape.drivers import LeonardoImageGenerationDriver class TestLeonardoImageGenerationDriver: - @pytest.fixture + @pytest.fixture() def driver(self): requests_session = Mock() diff --git a/tests/unit/drivers/image_generation/test_openai_image_generation_driver.py b/tests/unit/drivers/image_generation/test_openai_image_generation_driver.py index 8ca488eb1..16bcd2870 100644 --- a/tests/unit/drivers/image_generation/test_openai_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_openai_image_generation_driver.py @@ -1,10 +1,12 @@ -import pytest from unittest.mock import Mock + +import pytest + from griptape.drivers import OpenAiImageGenerationDriver class TestOpenAiImageGenerationDriver: - @pytest.fixture + @pytest.fixture() def driver(self): return OpenAiImageGenerationDriver(model="dall-e-2", client=Mock(), quality="hd", image_size="512x512") diff --git a/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py b/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py index cdd4e95b7..60583455e 100644 --- a/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py +++ b/tests/unit/drivers/image_generation_model/test_bedrock_stable_diffusion_image_model_driver.py @@ -7,15 +7,15 @@ class TestBedrockStableDiffusionImageGenerationModelDriver: - @pytest.fixture + @pytest.fixture() def model_driver(self): return BedrockStableDiffusionImageGenerationModelDriver() - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(b"image", format="png", width=1024, height=1024) - @pytest.fixture + @pytest.fixture() def mask_artifact(self): return ImageArtifact(b"mask", format="png", width=1024, height=1024) @@ -118,5 +118,5 @@ def test_get_generated_image_failed(self, model_driver): response = {"artifacts": [{"finishReason": "ERROR", "base64": base64.b64encode(image_bytes).decode("utf-8")}]} - with pytest.raises(Exception): + with pytest.raises(Exception, match="Image generation failed:"): model_driver.get_generated_image(response) diff --git a/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py b/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py index 8c4ed40e3..6bf4c30d5 100644 --- a/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py +++ b/tests/unit/drivers/image_generation_model/test_bedrock_titan_image_model_driver.py @@ -5,15 +5,15 @@ class TestBedrockTitanImageGenerationModelDriver: - @pytest.fixture + @pytest.fixture() def model_driver(self): return BedrockTitanImageGenerationModelDriver() - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(b"image", format="png", width=1024, height=512) - @pytest.fixture + @pytest.fixture() def mask_artifact(self): return ImageArtifact(b"mask", format="png", width=1024, height=512) diff --git a/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py b/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py index 57336e8ea..9493ab23d 100644 --- a/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_amazon_bedrock_image_query_driver.py @@ -1,23 +1,25 @@ -import pytest import io from unittest.mock import Mock -from griptape.drivers import AmazonBedrockImageQueryDriver + +import pytest + from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.drivers import AmazonBedrockImageQueryDriver class TestAmazonBedrockImageQueryDriver: - @pytest.fixture + @pytest.fixture() def bedrock_client(self, mocker): return Mock() - @pytest.fixture + @pytest.fixture() def session(self, bedrock_client): session = Mock() session.client.return_value = bedrock_client return session - @pytest.fixture + @pytest.fixture() def model_driver(self): model_driver = Mock() model_driver.image_query_request_parameters.return_value = {} @@ -25,7 +27,7 @@ def model_driver(self): return model_driver - @pytest.fixture + @pytest.fixture() def image_query_driver(self, session, model_driver): return AmazonBedrockImageQueryDriver(session=session, model="model", image_query_model_driver=model_driver) diff --git a/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py b/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py index 24958d58f..db4b2407c 100644 --- a/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_anthropic_image_query_driver.py @@ -1,12 +1,14 @@ -import pytest import base64 from unittest.mock import Mock -from griptape.drivers import AnthropicImageQueryDriver + +import pytest + from griptape.artifacts import ImageArtifact +from griptape.drivers import AnthropicImageQueryDriver class TestAnthropicImageQueryDriver: - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("anthropic.Anthropic") return_value = Mock(text="Content") @@ -55,7 +57,7 @@ def test_try_query_max_tokens_value(self, mock_client): assert text_artifact.value == "Content" def test_try_query_max_tokens_none(self, mock_client): - driver = AnthropicImageQueryDriver(model="test-model", max_tokens=None) # pyright: ignore + driver = AnthropicImageQueryDriver(model="test-model", max_tokens=None) # pyright: ignore[reportArgumentType] test_prompt_string = "Prompt String" test_binary_data = b"test-data" with pytest.raises(TypeError): diff --git a/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py index a44319861..a1d428197 100644 --- a/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py @@ -1,11 +1,13 @@ -import pytest from unittest.mock import Mock -from griptape.drivers import AzureOpenAiImageQueryDriver + +import pytest + from griptape.artifacts import ImageArtifact +from griptape.drivers import AzureOpenAiImageQueryDriver class TestAzureOpenAiVisionImageQueryDriver: - @pytest.fixture + @pytest.fixture() def mock_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create mock_choice = Mock(message=Mock(content="expected_output_text")) @@ -52,7 +54,7 @@ def test_try_query_multiple_choices(self, mock_completion_create): azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" ) - with pytest.raises(Exception): + with pytest.raises(Exception, match="Image query responses with more than one choice are not supported yet."): driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")]) def _expected_messages(self, expected_prompt_string, expected_binary_data): diff --git a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py index 8efcfa749..02b69595f 100644 --- a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py @@ -1,12 +1,12 @@ -from griptape.drivers import DummyImageQueryDriver -from griptape.artifacts import ImageArtifact import pytest +from griptape.artifacts import ImageArtifact +from griptape.drivers import DummyImageQueryDriver from griptape.exceptions import DummyException class TestDummyImageQueryDriver: - @pytest.fixture + @pytest.fixture() def image_query_driver(self): return DummyImageQueryDriver() diff --git a/tests/unit/drivers/image_query/test_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_openai_image_query_driver.py index 08f0c70c9..9c4b011a6 100644 --- a/tests/unit/drivers/image_query/test_openai_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_openai_image_query_driver.py @@ -1,11 +1,13 @@ -import pytest from unittest.mock import Mock -from griptape.drivers import OpenAiImageQueryDriver + +import pytest + from griptape.artifacts import ImageArtifact +from griptape.drivers import OpenAiImageQueryDriver class TestOpenAiVisionImageQueryDriver: - @pytest.fixture + @pytest.fixture() def mock_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create mock_choice = Mock(message=Mock(content="expected_output_text")) @@ -43,7 +45,7 @@ def test_try_query_multiple_choices(self, mock_completion_create): mock_completion_create.return_value.choices.append(Mock(message=Mock(content="expected_output_text2"))) driver = OpenAiImageQueryDriver(model="gpt-4-vision-preview") - with pytest.raises(Exception): + with pytest.raises(Exception, match="Image query responses with more than one choice are not supported yet."): driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")]) def _expected_messages(self, expected_prompt_string, expected_binary_data): diff --git a/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py b/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py index 14fa8ff28..c274f71dd 100644 --- a/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py +++ b/tests/unit/drivers/image_query_models/test_bedrock_claude_image_query_model_driver.py @@ -1,6 +1,7 @@ import pytest -from griptape.drivers import BedrockClaudeImageQueryModelDriver + from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.drivers import BedrockClaudeImageQueryModelDriver class TestBedrockClaudeImageQueryModelDriver: diff --git a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py index ba79a4def..8e700d0a5 100644 --- a/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_dynamodb_conversation_memory_driver.py @@ -1,12 +1,13 @@ +import boto3 import pytest from moto import mock_dynamodb -import boto3 -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.utils.aws import mock_aws_credentials + +from griptape.drivers import AmazonDynamoDbConversationMemoryDriver from griptape.memory.structure import ConversationMemory -from griptape.tasks import PromptTask from griptape.structures import Pipeline -from griptape.drivers import AmazonDynamoDbConversationMemoryDriver +from griptape.tasks import PromptTask +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils.aws import mock_aws_credentials class TestDynamoDbConversationMemoryDriver: @@ -17,7 +18,7 @@ class TestDynamoDbConversationMemoryDriver: PARTITION_KEY_VALUE = "bar" @pytest.fixture(autouse=True) - def run_before_and_after_tests(self): + def _run_before_and_after_tests(self): mock_aws_credentials() self.mock_dynamodb = mock_dynamodb() self.mock_dynamodb.start() diff --git a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py index c794afd0e..e1a383ab9 100644 --- a/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_local_conversation_memory_driver.py @@ -1,17 +1,20 @@ +import contextlib import os + import pytest -from tests.mocks.mock_prompt_driver import MockPromptDriver + from griptape.drivers import LocalConversationMemoryDriver from griptape.memory.structure import ConversationMemory -from griptape.tasks import PromptTask from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from tests.mocks.mock_prompt_driver import MockPromptDriver class TestLocalConversationMemoryDriver: MEMORY_FILE_PATH = "test_memory.json" @pytest.fixture(autouse=True) - def run_before_and_after_tests(self): + def _run_before_and_after_tests(self): self.__delete_file(self.MEMORY_FILE_PATH) yield @@ -28,7 +31,7 @@ def test_store(self): try: with open(self.MEMORY_FILE_PATH): - assert False + raise AssertionError() except FileNotFoundError: assert True @@ -74,8 +77,6 @@ def test_autoload(self): assert autoloaded_memory.runs[0].input.value == "test" assert autoloaded_memory.runs[0].output.value == "mock output" - def __delete_file(self, file_path): - try: + def __delete_file(self, file_path) -> None: + with contextlib.suppress(FileNotFoundError): os.remove(file_path) - except FileNotFoundError: - pass diff --git a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py index 1af9d74dc..4a92a28a8 100644 --- a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py +++ b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py @@ -1,7 +1,8 @@ import pytest import redis -from griptape.memory.structure.base_conversation_memory import BaseConversationMemory + from griptape.drivers.memory.conversation.redis_conversation_memory_driver import RedisConversationMemoryDriver +from griptape.memory.structure.base_conversation_memory import BaseConversationMemory TEST_CONVERSATION = '{"type": "ConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": {"type": "TextArtifact", "id": "1234", "value": "Hi There, Hello"}, "output": {"type": "TextArtifact", "id": "123", "value": "Hello! How can I assist you today?"}}], "max_runs": 2}' CONVERSATION_ID = "117151897f344ff684b553d0655d8f39" @@ -13,7 +14,7 @@ class TestRedisConversationMemoryDriver: @pytest.fixture(autouse=True) - def mock_redis(self, mocker): + def _mock_redis(self, mocker): mocker.patch.object(redis.StrictRedis, "hset", return_value=None) mocker.patch.object(redis.StrictRedis, "keys", return_value=[b"test"]) mocker.patch.object(redis.StrictRedis, "hget", return_value=TEST_CONVERSATION) @@ -25,13 +26,13 @@ def mock_redis(self, mocker): mocker.patch.object(redis.StrictRedis, "ft", return_value=fake_redisearch) - @pytest.fixture + @pytest.fixture() def driver(self): return RedisConversationMemoryDriver(host=HOST, port=PORT, db=0, index=INDEX, conversation_id=CONVERSATION_ID) def test_store(self, driver): memory = BaseConversationMemory.from_json(TEST_CONVERSATION) - assert driver.store(memory) == None + assert driver.store(memory) is None def test_load(self, driver): memory = driver.load() diff --git a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py index e31b6a448..6a58b09dc 100644 --- a/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_bedrock_prompt_driver.py @@ -1,10 +1,8 @@ import pytest -from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact, ErrorArtifact, ActionArtifact -from griptape.common import PromptStack -from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction +from griptape.artifacts import ActionArtifact, ErrorArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import AmazonBedrockPromptDriver - from tests.mocks.mock_tool.tool import MockTool @@ -159,7 +157,7 @@ class TestAmazonBedrockPromptDriver: }, ] - @pytest.fixture + @pytest.fixture() def mock_converse(self, mocker): mock_converse = mocker.patch("boto3.Session").return_value.client.return_value.converse @@ -177,7 +175,7 @@ def mock_converse(self, mocker): return mock_converse - @pytest.fixture + @pytest.fixture() def mock_converse_stream(self, mocker): mock_converse_stream = mocker.patch("boto3.Session").return_value.client.return_value.converse_stream @@ -275,7 +273,7 @@ def prompt_stack(self, request): return prompt_stack - @pytest.fixture + @pytest.fixture() def messages(self): return [ {"role": "user", "content": [{"text": "user-input"}]}, diff --git a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py index a75fc6ed0..e74797e42 100644 --- a/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_amazon_sagemaker_jumpstart_prompt_driver.py @@ -1,11 +1,13 @@ +import json +from io import BytesIO from typing import Any + +import pytest from botocore.response import StreamingBody -from griptape.tokenizers import HuggingFaceTokenizer -from griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver import AmazonSageMakerJumpstartPromptDriver + from griptape.common import PromptStack -from io import BytesIO -import json -import pytest +from griptape.drivers.prompt.amazon_sagemaker_jumpstart_prompt_driver import AmazonSageMakerJumpstartPromptDriver +from griptape.tokenizers import HuggingFaceTokenizer def to_streaming_body(data: Any) -> StreamingBody: diff --git a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py index e8f6d337f..3b1343336 100644 --- a/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_anthropic_prompt_driver.py @@ -1,10 +1,11 @@ -from griptape.artifacts.error_artifact import ErrorArtifact -from griptape.drivers import AnthropicPromptDriver -from griptape.common import PromptStack, TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction -from griptape.artifacts import TextArtifact, ActionArtifact, ImageArtifact, ListArtifact from unittest.mock import Mock + import pytest +from griptape.artifacts import ActionArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.artifacts.error_artifact import ErrorArtifact +from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction +from griptape.drivers import AnthropicPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -131,7 +132,7 @@ class TestAnthropicPromptDriver: }, ] - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("anthropic.Anthropic") mock_tool_use = Mock(type="tool_use", id="mock-id", input={"foo": "bar"}) @@ -150,7 +151,7 @@ def mock_client(self, mocker): return mock_client - @pytest.fixture + @pytest.fixture() def mock_stream_client(self, mocker): mock_stream_client = mocker.patch("anthropic.Anthropic") @@ -263,7 +264,7 @@ def prompt_stack(self, request): return prompt_stack - @pytest.fixture + @pytest.fixture() def messages(self): return [ {"role": "user", "content": "user-input"}, diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index 9e56b39bd..dc0b54b0a 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -1,13 +1,15 @@ -import pytest -from griptape.artifacts import TextArtifact, ActionArtifact from unittest.mock import Mock + +import pytest + +from griptape.artifacts import ActionArtifact, TextArtifact +from griptape.common import ActionCallDeltaMessageContent, TextDeltaMessageContent from griptape.drivers import AzureOpenAiChatPromptDriver -from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent from tests.unit.drivers.prompt.test_openai_chat_prompt_driver import TestOpenAiChatPromptDriverFixtureMixin class TestAzureOpenAiChatPromptDriver(TestOpenAiChatPromptDriverFixtureMixin): - @pytest.fixture + @pytest.fixture() def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create mock_function = Mock(arguments='{"foo": "bar"}', id="mock-id") @@ -22,7 +24,7 @@ def mock_chat_completion_create(self, mocker): return mock_chat_create - @pytest.fixture + @pytest.fixture() def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create mock_tool_call_delta_header = Mock() diff --git a/tests/unit/drivers/prompt/test_base_prompt_driver.py b/tests/unit/drivers/prompt/test_base_prompt_driver.py index 6eb000e1f..3c2bb333e 100644 --- a/tests/unit/drivers/prompt/test_base_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_base_prompt_driver.py @@ -1,11 +1,11 @@ +from griptape.artifacts import ErrorArtifact, TextArtifact +from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message from griptape.events import FinishPromptEvent, StartPromptEvent -from griptape.common import PromptStack -from tests.mocks.mock_prompt_driver import MockPromptDriver -from tests.mocks.mock_failing_prompt_driver import MockFailingPromptDriver -from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.tasks import PromptTask from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from tests.mocks.mock_failing_prompt_driver import MockFailingPromptDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver class TestBasePromptDriver: diff --git a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py index 167c08b34..c642b7ee0 100644 --- a/tests/unit/drivers/prompt/test_cohere_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_cohere_prompt_driver.py @@ -5,9 +5,8 @@ from griptape.artifacts.action_artifact import ActionArtifact from griptape.artifacts.list_artifact import ListArtifact from griptape.artifacts.text_artifact import TextArtifact -from griptape.common import PromptStack, ToolAction +from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import CoherePromptDriver -from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent from tests.mocks.mock_tool.tool import MockTool @@ -42,7 +41,7 @@ class TestCoherePromptDriver: }, ] - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value mock_tool_call = Mock(parameters={"foo": "bar"}) @@ -53,7 +52,7 @@ def mock_client(self, mocker): return mock_client - @pytest.fixture + @pytest.fixture() def mock_stream_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value mock_tool_call_delta_header = Mock() diff --git a/tests/unit/drivers/prompt/test_dummy_prompt_driver.py b/tests/unit/drivers/prompt/test_dummy_prompt_driver.py index d569b55af..203bad3d5 100644 --- a/tests/unit/drivers/prompt/test_dummy_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_dummy_prompt_driver.py @@ -1,11 +1,11 @@ -from griptape.drivers import DummyPromptDriver import pytest +from griptape.drivers import DummyPromptDriver from griptape.exceptions import DummyException class TestDummyPromptDriver: - @pytest.fixture + @pytest.fixture() def prompt_driver(self): return DummyPromptDriver() diff --git a/tests/unit/drivers/prompt/test_google_prompt_driver.py b/tests/unit/drivers/prompt/test_google_prompt_driver.py index b1a72d10d..478ef8fb9 100644 --- a/tests/unit/drivers/prompt/test_google_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_google_prompt_driver.py @@ -1,15 +1,15 @@ -from google.generativeai.types import ContentDict, GenerationConfig +from unittest.mock import Mock + +import pytest from google.generativeai.protos import FunctionCall, FunctionResponse, Part -from griptape.artifacts import TextArtifact, ImageArtifact, ActionArtifact +from google.generativeai.types import ContentDict, GenerationConfig +from google.protobuf.json_format import MessageToDict + +from griptape.artifacts import ActionArtifact, ImageArtifact, TextArtifact from griptape.artifacts.list_artifact import ListArtifact -from griptape.common import TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction +from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import GooglePromptDriver -from griptape.common import PromptStack -from unittest.mock import Mock from tests.mocks.mock_tool.tool import MockTool -from google.protobuf.json_format import MessageToDict - -import pytest class TestGooglePromptDriver: @@ -43,7 +43,7 @@ class TestGooglePromptDriver: }, ] - @pytest.fixture + @pytest.fixture() def mock_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") mock_function_call = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) @@ -55,7 +55,7 @@ def mock_generative_model(self, mocker): return mock_generative_model - @pytest.fixture + @pytest.fixture() def mock_stream_generative_model(self, mocker): mock_generative_model = mocker.patch("google.generativeai.GenerativeModel") mock_function_call_delta = Mock(type="tool_use", id="MockTool_test", args={"foo": "bar"}) @@ -117,7 +117,7 @@ def prompt_stack(self, request): return prompt_stack - @pytest.fixture + @pytest.fixture() def messages(self): return [ {"parts": ["user-input"], "role": "user"}, diff --git a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py index ec7ea73f8..1a4e1b25b 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_hub_prompt_driver.py @@ -1,10 +1,11 @@ -from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.common import PromptStack, TextDeltaMessageContent import pytest +from griptape.common import PromptStack, TextDeltaMessageContent +from griptape.drivers import HuggingFaceHubPromptDriver + class TestHuggingFaceHubPromptDriver: - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("huggingface_hub.InferenceClient").return_value @@ -20,14 +21,14 @@ def tokenizer(self, mocker): return tokenizer - @pytest.fixture + @pytest.fixture() def mock_client_stream(self, mocker): mock_client = mocker.patch("huggingface_hub.InferenceClient").return_value mock_client.text_generation.return_value = iter(["model-output"]) return mock_client - @pytest.fixture + @pytest.fixture() def prompt_stack(self): prompt_stack = PromptStack() prompt_stack.add_system_message("system-input") diff --git a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py index a63d697fb..5323f5d2d 100644 --- a/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_hugging_face_pipeline_prompt_driver.py @@ -1,7 +1,8 @@ -from griptape.drivers import HuggingFacePipelinePromptDriver -from griptape.common import PromptStack import pytest +from griptape.common import PromptStack +from griptape.drivers import HuggingFacePipelinePromptDriver + class TestHuggingFacePipelinePromptDriver: @pytest.fixture(autouse=True) @@ -25,7 +26,7 @@ def mock_autotokenizer(self, mocker): mock_autotokenizer.encode.return_value = [1, 2, 3] return mock_autotokenizer - @pytest.fixture + @pytest.fixture() def prompt_stack(self): prompt_stack = PromptStack() prompt_stack.add_system_message("system-input") diff --git a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py index a247a77ab..e51da368a 100644 --- a/tests/unit/drivers/prompt/test_ollama_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_ollama_prompt_driver.py @@ -1,12 +1,13 @@ +import pytest + +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact +from griptape.common import PromptStack from griptape.common.prompt_stack.contents.text_delta_message_content import TextDeltaMessageContent from griptape.drivers import OllamaPromptDriver -from griptape.common import PromptStack -from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact -import pytest class TestOllamaPromptDriver: - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("ollama.Client") @@ -14,7 +15,7 @@ def mock_client(self, mocker): return mock_client - @pytest.fixture + @pytest.fixture() def mock_stream_client(self, mocker): mock_stream_client = mocker.patch("ollama.Client") mock_stream_client.return_value.chat.return_value = iter([{"message": {"content": "model-output"}}]) diff --git a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py index 59772ff23..23a40e20c 100644 --- a/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_openai_chat_prompt_driver.py @@ -1,12 +1,13 @@ -from griptape.artifacts import ImageArtifact, ListArtifact -from griptape.artifacts import TextArtifact, ActionArtifact +from unittest.mock import Mock + +import pytest + +from griptape.artifacts import ActionArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.common import ActionCallDeltaMessageContent, PromptStack, TextDeltaMessageContent, ToolAction from griptape.drivers import OpenAiChatPromptDriver -from griptape.common import PromptStack, TextDeltaMessageContent, ActionCallDeltaMessageContent, ToolAction from griptape.tokenizers import OpenAiTokenizer -from unittest.mock import Mock from tests.mocks.mock_tokenizer import MockTokenizer from tests.mocks.mock_tool.tool import MockTool -import pytest class TestOpenAiChatPromptDriverFixtureMixin: @@ -153,7 +154,7 @@ class TestOpenAiChatPromptDriverFixtureMixin: }, ] - @pytest.fixture + @pytest.fixture() def mock_chat_completion_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create mock_function = Mock(arguments='{"foo": "bar"}', id="mock-id") @@ -168,7 +169,7 @@ def mock_chat_completion_create(self, mocker): return mock_chat_create - @pytest.fixture + @pytest.fixture() def mock_chat_completion_stream_create(self, mocker): mock_chat_create = mocker.patch("openai.OpenAI").return_value.chat.completions.create mock_tool_call_delta_header = Mock() @@ -206,7 +207,7 @@ def mock_chat_completion_stream_create(self, mocker): ) return mock_chat_create - @pytest.fixture + @pytest.fixture() def prompt_stack(self): prompt_stack = PromptStack() prompt_stack.tools = [MockTool()] @@ -244,7 +245,7 @@ def prompt_stack(self): ) return prompt_stack - @pytest.fixture + @pytest.fixture() def messages(self): return [ {"role": "system", "content": "system-input"}, @@ -283,7 +284,7 @@ def __init__( remaining_tokens=234, limit_requests=345, limit_tokens=456, - ): + ) -> None: self.reset_requests_in = reset_requests_in self.reset_requests_in_unit = reset_requests_in_unit self.reset_tokens_in = reset_tokens_in diff --git a/tests/unit/drivers/rerank/test_cohere_rerank_driver.py b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py index 952546e5a..87a727269 100644 --- a/tests/unit/drivers/rerank/test_cohere_rerank_driver.py +++ b/tests/unit/drivers/rerank/test_cohere_rerank_driver.py @@ -1,11 +1,12 @@ import pytest -from cohere import RerankResponseResultsItemDocument, RerankResponseResultsItem +from cohere import RerankResponseResultsItem, RerankResponseResultsItemDocument + from griptape.artifacts import TextArtifact from griptape.drivers import CohereRerankDriver class TestCohereRerankDriver: - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value mock_client.rerank.return_value.results = [ diff --git a/tests/unit/drivers/sql/test_amazon_redshift_sql_driver.py b/tests/unit/drivers/sql/test_amazon_redshift_sql_driver.py index d67e1c557..966df481c 100644 --- a/tests/unit/drivers/sql/test_amazon_redshift_sql_driver.py +++ b/tests/unit/drivers/sql/test_amazon_redshift_sql_driver.py @@ -1,7 +1,8 @@ -import pytest import boto3 +import pytest from botocore.stub import Stubber -from griptape.drivers import BaseSqlDriver, AmazonRedshiftSqlDriver + +from griptape.drivers import AmazonRedshiftSqlDriver, BaseSqlDriver class TestAmazonRedshiftSqlDriver: @@ -41,7 +42,7 @@ class TestAmazonRedshiftSqlDriver: }, ] - @pytest.fixture + @pytest.fixture() def statement_driver(self): session = boto3.Session(region_name="us-east-1") client = session.client("redshift-data") @@ -108,7 +109,7 @@ def statement_driver(self): return AmazonRedshiftSqlDriver(database="dev", session=session, workgroup_name="dev", client=client) - @pytest.fixture + @pytest.fixture() def describe_table_driver(self): session = boto3.Session(region_name="us-east-1") client = session.client("redshift-data") diff --git a/tests/unit/drivers/sql/test_snowflake_sql_driver.py b/tests/unit/drivers/sql/test_snowflake_sql_driver.py index 91403a467..055b1e744 100644 --- a/tests/unit/drivers/sql/test_snowflake_sql_driver.py +++ b/tests/unit/drivers/sql/test_snowflake_sql_driver.py @@ -1,8 +1,10 @@ from dataclasses import dataclass from unittest import mock + import pytest -from sqlalchemy import create_engine from snowflake.connector import SnowflakeConnection +from sqlalchemy import create_engine + from griptape.drivers import BaseSqlDriver, SnowflakeSqlDriver @@ -11,7 +13,7 @@ class TestSnowflakeSqlDriver: TEST_COLUMNS = [("first_name", "VARCHAR"), ("last_name", "VARCHAR")] - @pytest.fixture + @pytest.fixture() def mock_table(self, mocker): @dataclass class Column: @@ -21,13 +23,13 @@ class Column: mock_table = mocker.MagicMock(name="table", columns=[Column("first_name"), Column("last_name")]) return mock_table - @pytest.fixture + @pytest.fixture() def mock_metadata(self, mocker): mock_meta = mocker.MagicMock(name="metadata") mock_meta.reflect.return_value = None return mock_meta - @pytest.fixture + @pytest.fixture() def mock_snowflake_engine(self, mocker): mock_engine = mocker.MagicMock(name="engine") result_mock = mocker.MagicMock(name="result") @@ -44,22 +46,22 @@ def mock_snowflake_engine(self, mocker): return mock_engine - @pytest.fixture + @pytest.fixture() def mock_snowflake_connection(self, mocker): mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection") return mock_connection - @pytest.fixture + @pytest.fixture() def mock_snowflake_connection_no_schema(self, mocker): mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_schema", schema=None) return mock_connection - @pytest.fixture + @pytest.fixture() def mock_snowflake_connection_no_database(self, mocker): mock_connection = mocker.MagicMock(spec=SnowflakeConnection, name="connection_no_database", database=None) return mock_connection - @pytest.fixture + @pytest.fixture() def driver(self, mock_snowflake_engine, mock_snowflake_connection): def get_connection(): return mock_snowflake_connection diff --git a/tests/unit/drivers/sql/test_sql_driver.py b/tests/unit/drivers/sql/test_sql_driver.py index d4caf6f50..742acd0b2 100644 --- a/tests/unit/drivers/sql/test_sql_driver.py +++ b/tests/unit/drivers/sql/test_sql_driver.py @@ -1,9 +1,10 @@ import pytest + from griptape.drivers import SqlDriver class TestSqlDriver: - @pytest.fixture + @pytest.fixture() def driver(self): new_driver = SqlDriver(engine_url="sqlite:///:memory:") diff --git a/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py index b056241ec..bdd5cd3ed 100644 --- a/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py @@ -1,9 +1,10 @@ import pytest -from griptape.artifacts import TextArtifact, InfoArtifact + +from griptape.artifacts import InfoArtifact, TextArtifact class TestGriptapeCloudStructureRunDriver: - @pytest.fixture + @pytest.fixture() def driver(self, mocker): from griptape.drivers import GriptapeCloudStructureRunDriver diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index cb7b3058e..316f7bf71 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -1,11 +1,9 @@ import os -import pytest -from griptape.artifacts.text_artifact import TextArtifact + +from griptape.drivers import LocalStructureRunDriver +from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask -from griptape.structures import Agent from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.drivers import LocalStructureRunDriver -from griptape.structures import Pipeline class TestLocalStructureRunDriver: @@ -22,8 +20,8 @@ def test_run(self): def test_run_with_env(self): pipeline = Pipeline() - agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda _: os.environ["key"])) - driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"key": "value"}) + agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda _: os.environ["KEY"])) + driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"KEY": "value"}) task = StructureRunTask(driver=driver) pipeline.add_task(task) diff --git a/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py b/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py index 2d90bc2f5..26c29adcf 100644 --- a/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py +++ b/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py @@ -1,10 +1,12 @@ -import pytest from unittest.mock import Mock + +import pytest + from griptape.drivers import ElevenLabsTextToSpeechDriver class TestElevenLabsTextToSpeechDriver: - @pytest.fixture + @pytest.fixture() def driver(self): return ElevenLabsTextToSpeechDriver(model="model", client=Mock(), voice="voice", api_key="key") diff --git a/tests/unit/drivers/transcription/test_openai_audio_transcription_driver.py b/tests/unit/drivers/transcription/test_openai_audio_transcription_driver.py index 57c5a5e2e..f9c22a725 100644 --- a/tests/unit/drivers/transcription/test_openai_audio_transcription_driver.py +++ b/tests/unit/drivers/transcription/test_openai_audio_transcription_driver.py @@ -1,16 +1,17 @@ -import pytest from unittest.mock import Mock +import pytest + from griptape.artifacts import AudioArtifact from griptape.drivers import OpenAiAudioTranscriptionDriver class TestOpenAiAudioTranscriptionDriver: - @pytest.fixture + @pytest.fixture() def audio_artifact(self): return AudioArtifact(value=b"audio data", format="mp3") - @pytest.fixture + @pytest.fixture() def driver(self): return OpenAiAudioTranscriptionDriver(model="model", client=Mock(), api_key="key") diff --git a/tests/unit/drivers/vector/test_amazon_opensearch_vector_store_driver.py b/tests/unit/drivers/vector/test_amazon_opensearch_vector_store_driver.py index b66cc057e..e5988b234 100644 --- a/tests/unit/drivers/vector/test_amazon_opensearch_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_amazon_opensearch_vector_store_driver.py @@ -1,12 +1,14 @@ +from unittest.mock import Mock, create_autospec, patch + +import boto3 +import numpy as np import pytest -from unittest.mock import patch, Mock, create_autospec + from griptape.drivers import AmazonOpenSearchVectorStoreDriver -import numpy as np -import boto3 class TestAmazonOpenSearchVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def driver(self): mock_session = create_autospec(boto3.Session, instance=True) mock_driver = create_autospec(AmazonOpenSearchVectorStoreDriver, instance=True, session=mock_session) diff --git a/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py b/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py index b68486914..6dd4fa5e9 100644 --- a/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_azure_mongodb_vector_store_driver.py @@ -1,14 +1,13 @@ -import pytest import mongomock -from unittest.mock import patch -from pymongo.errors import OperationFailure +import pytest + from griptape.artifacts import TextArtifact from griptape.drivers import AzureMongoDbVectorStoreDriver, BaseVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestAzureMongoDbVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def driver(self, monkeypatch): embedding_driver = MockEmbeddingDriver() return AzureMongoDbVectorStoreDriver( @@ -66,15 +65,18 @@ def test_load_entries(self, driver): vector = [0.5, 0.5, 0.5] driver.upsert_vector(vector, vector_id=vector_id_str) # ensure at least one entry exists results = list(driver.load_entries()) - assert results is not None and len(results) > 0 + assert results is not None + assert len(results) > 0 def test_delete(self, driver): vector_id_str = "123" vector = [0.5, 0.5, 0.5] driver.upsert_vector(vector, vector_id=vector_id_str) # ensure at least one entry exists results = list(driver.load_entries()) - assert results is not None and len(results) > 0 + assert results is not None + assert len(results) > 0 driver.delete_vector(vector_id_str) results = list(driver.load_entries()) - assert results is not None and len(results) == 0 + assert results is not None + assert len(results) == 0 diff --git a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py index 8c08292dd..ac4ff8043 100644 --- a/tests/unit/drivers/vector/test_base_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_base_local_vector_store_driver.py @@ -1,12 +1,14 @@ from abc import ABC, abstractmethod -import pytest from unittest.mock import patch + +import pytest + from griptape.artifacts import TextArtifact from griptape.artifacts.csv_row_artifact import CsvRowArtifact class BaseLocalVectorStoreDriver(ABC): - @pytest.fixture + @pytest.fixture() @abstractmethod def driver(self): ... diff --git a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py index 720778c38..df4867212 100644 --- a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py @@ -1,10 +1,11 @@ import pytest + from griptape.drivers import DummyVectorStoreDriver from griptape.exceptions import DummyException class TestDummyVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def vector_store_driver(self): return DummyVectorStoreDriver() diff --git a/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py b/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py index 957edebb8..0f52ba6c5 100644 --- a/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_griptape_cloud_knowledge_base_vector_store_driver.py @@ -1,5 +1,7 @@ -import pytest import uuid + +import pytest + from griptape.drivers import GriptapeCloudKnowledgeBaseVectorStoreDriver @@ -10,7 +12,7 @@ class TestGriptapeCloudKnowledgeBaseVectorStoreDriver: test_metas = [{"key": "value1"}, {"key": "value2"}] test_scores = [0.7, 0.8] - @pytest.fixture + @pytest.fixture() def driver(self, mocker): test_entries = { "entries": [ diff --git a/tests/unit/drivers/vector/test_local_vector_store_driver.py b/tests/unit/drivers/vector/test_local_vector_store_driver.py index 314f2fd6d..6f022793c 100644 --- a/tests/unit/drivers/vector/test_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_local_vector_store_driver.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -6,7 +7,7 @@ class TestLocalVectorStoreDriver(BaseLocalVectorStoreDriver): - @pytest.fixture + @pytest.fixture() def driver(self): return LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/drivers/vector/test_marqo_vector_store_driver.py b/tests/unit/drivers/vector/test_marqo_vector_store_driver.py index f42906035..5c2399bc5 100644 --- a/tests/unit/drivers/vector/test_marqo_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_marqo_vector_store_driver.py @@ -1,7 +1,9 @@ from collections import namedtuple + import pytest -from griptape.drivers import MarqoVectorStoreDriver + from griptape.artifacts import TextArtifact +from griptape.drivers import MarqoVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -79,7 +81,7 @@ def mock_marqo(self, mocker): # Return the mock_client for use in other fixtures return mock_client - @pytest.fixture + @pytest.fixture() def driver(self, mock_marqo): return MarqoVectorStoreDriver( api_key="foobar", diff --git a/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py b/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py index 5b9aeed06..20cb8bdc0 100644 --- a/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_mongodb_atlas_vector_store_driver.py @@ -1,14 +1,13 @@ -import pytest import mongomock -from unittest.mock import patch -from pymongo.errors import OperationFailure +import pytest + from griptape.artifacts import TextArtifact -from griptape.drivers import MongoDbAtlasVectorStoreDriver, BaseVectorStoreDriver +from griptape.drivers import BaseVectorStoreDriver, MongoDbAtlasVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestMongoDbAtlasVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def driver(self, monkeypatch): embedding_driver = MockEmbeddingDriver() return MongoDbAtlasVectorStoreDriver( @@ -66,15 +65,18 @@ def test_load_entries(self, driver): vector = [0.5, 0.5, 0.5] driver.upsert_vector(vector, vector_id=vector_id_str) # ensure at least one entry exists results = list(driver.load_entries()) - assert results is not None and len(results) > 0 + assert results is not None + assert len(results) > 0 def test_delete(self, driver): vector_id_str = "123" vector = [0.5, 0.5, 0.5] driver.upsert_vector(vector, vector_id=vector_id_str) # ensure at least one entry exists results = list(driver.load_entries()) - assert results is not None and len(results) > 0 + assert results is not None + assert len(results) > 0 driver.delete_vector(vector_id_str) results = list(driver.load_entries()) - assert results is not None and len(results) == 0 + assert results is not None + assert len(results) == 0 diff --git a/tests/unit/drivers/vector/test_opensearch_vector_store_driver.py b/tests/unit/drivers/vector/test_opensearch_vector_store_driver.py index d2c967caf..cef3805ab 100644 --- a/tests/unit/drivers/vector/test_opensearch_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_opensearch_vector_store_driver.py @@ -1,11 +1,13 @@ +from unittest.mock import Mock, create_autospec, patch + +import numpy as np import pytest -from unittest.mock import patch, Mock, create_autospec + from griptape.drivers import OpenSearchVectorStoreDriver -import numpy as np class TestOpenSearchVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def driver(self): mock_driver = create_autospec(OpenSearchVectorStoreDriver, instance=True) mock_driver.upsert_vector.return_value = "foo" diff --git a/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py index 8f6773fc1..c130858b5 100644 --- a/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_persistent_local_vector_store_driver.py @@ -1,6 +1,8 @@ import os import tempfile + import pytest + from griptape.artifacts import TextArtifact from griptape.drivers import LocalVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -8,12 +10,12 @@ class TestPersistentLocalVectorStoreDriver(BaseLocalVectorStoreDriver): - @pytest.fixture + @pytest.fixture() def temp_dir(self): with tempfile.TemporaryDirectory() as temp_dir: yield temp_dir - @pytest.fixture + @pytest.fixture() def driver(self, temp_dir): persist_file = os.path.join(temp_dir, "store.json") diff --git a/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py b/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py index 3854ea4f1..29b5ad82e 100644 --- a/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_pgvector_vector_store_driver.py @@ -1,25 +1,27 @@ -from typing import Any import uuid -import pytest +from typing import Any from unittest.mock import MagicMock, Mock + +import pytest +from sqlalchemy import create_engine + from griptape.drivers import PgVectorVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver -from sqlalchemy import create_engine class TestPgVectorVectorStoreDriver: connection_string = "postgresql://postgres:postgres@localhost:5432/postgres" table_name = "griptape_vectors" - @pytest.fixture + @pytest.fixture() def embedding_driver(self): return MockEmbeddingDriver() - @pytest.fixture + @pytest.fixture() def mock_engine(self): return MagicMock() - @pytest.fixture + @pytest.fixture() def mock_session(self, mocker): session = MagicMock() mock_session_manager = MagicMock() @@ -30,14 +32,14 @@ def mock_session(self, mocker): def test_initialize_requires_engine_or_connection_string(self, embedding_driver): with pytest.raises(ValueError): - driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, table_name=self.table_name) + PgVectorVectorStoreDriver(embedding_driver=embedding_driver, table_name=self.table_name) def test_initialize_accepts_engine(self, embedding_driver): engine: Any = create_engine(self.connection_string) - driver = PgVectorVectorStoreDriver(embedding_driver=embedding_driver, engine=engine, table_name=self.table_name) + PgVectorVectorStoreDriver(embedding_driver=embedding_driver, engine=engine, table_name=self.table_name) def test_initialize_accepts_connection_string(self, embedding_driver): - driver = PgVectorVectorStoreDriver( + PgVectorVectorStoreDriver( embedding_driver=embedding_driver, connection_string=self.connection_string, table_name=self.table_name ) diff --git a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py index 7aea4d411..0726a0c7e 100644 --- a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py +++ b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py @@ -1,19 +1,13 @@ import pytest -from griptape import utils from griptape.artifacts import TextArtifact from griptape.drivers import PineconeVectorStoreDriver from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestPineconeVectorStorageDriver: - """ - This should really be under `unit` but the Pinecone client results - in tests hanging on GitHub. - """ - @pytest.fixture(autouse=True) - def mock_pinecone(self, mocker): + def _mock_pinecone(self, mocker): # Create a fake response fake_query_response = { "matches": [{"id": "foo", "values": [0, 1, 0], "score": 42, "metadata": {"foo": "bar"}}], @@ -25,7 +19,7 @@ def mock_pinecone(self, mocker): mock_client().Index().query.return_value = fake_query_response mock_client().create_index.return_value = None - @pytest.fixture + @pytest.fixture() def driver(self): return PineconeVectorStoreDriver( api_key="foobar", index_name="test", environment="test", embedding_driver=MockEmbeddingDriver() diff --git a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py index 8abfbf4f7..0b22784eb 100644 --- a/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_qdrant_vector_store_driver.py @@ -1,17 +1,19 @@ -import pytest +import uuid from unittest.mock import MagicMock, patch + +import pytest + from griptape.drivers import QdrantVectorStoreDriver -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from griptape.utils import import_optional_dependency -import uuid +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestQdrantVectorStoreDriver: - @pytest.fixture + @pytest.fixture() def embedding_driver(self): return MockEmbeddingDriver() - @pytest.fixture + @pytest.fixture() def mock_engine(self): return MagicMock() diff --git a/tests/unit/drivers/vector/test_redis_vector_store_driver.py b/tests/unit/drivers/vector/test_redis_vector_store_driver.py index 18759a2d7..2f74b9279 100644 --- a/tests/unit/drivers/vector/test_redis_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_redis_vector_store_driver.py @@ -1,7 +1,9 @@ from unittest.mock import MagicMock + import pytest -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + from griptape.drivers import RedisVectorStoreDriver +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestRedisVectorStorageDriver: @@ -9,12 +11,12 @@ class TestRedisVectorStorageDriver: def mock_client(self, mocker): return mocker.patch("redis.Redis").return_value - @pytest.fixture + @pytest.fixture() def mock_keys(self, mock_client): mock_client.keys.return_value = [b"some_vector_id"] return mock_client.keys - @pytest.fixture + @pytest.fixture() def mock_hgetall(self, mock_client): mock_client.hgetall.return_value = { b"vector": b"\x00\x00\x80?\x00\x00\x00@\x00\x00@@", @@ -22,13 +24,13 @@ def mock_hgetall(self, mock_client): } return mock_client.hgetall - @pytest.fixture + @pytest.fixture() def driver(self): return RedisVectorStoreDriver( host="localhost", port=6379, index="test_index", db=0, embedding_driver=MockEmbeddingDriver() ) - @pytest.fixture + @pytest.fixture() def mock_search(self, mock_client): mock_client.ft.return_value.search.return_value.docs = [ MagicMock( diff --git a/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py index 33500839f..dbdafa98f 100644 --- a/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py +++ b/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py @@ -1,4 +1,5 @@ from textwrap import dedent + import pytest from griptape.drivers.web_scraper.markdownify_web_scraper_driver import MarkdownifyWebScraperDriver @@ -15,13 +16,13 @@ def mock_content(self, mock_playwright): mock_content.return_value = 'foobar' return mock_content - @pytest.fixture + @pytest.fixture() def web_scraper(self): return MarkdownifyWebScraperDriver() def test_scrape_url(self, web_scraper): artifact = web_scraper.scrape_url("https://example.com/") - assert "[foobar](foobar.com)" == artifact.value + assert artifact.value == "[foobar](foobar.com)" def test_scrape_url_whitespace(self, web_scraper, mock_content): mock_content.return_value = dedent( @@ -46,35 +47,35 @@ def test_scrape_url_whitespace(self, web_scraper, mock_content): """ ) artifact = web_scraper.scrape_url("https://example.com/") - assert "foo\n---\n\n* bar:\n + baz\n + baz\n\n + baz" == artifact.value + assert artifact.value == "foo\n---\n\n* bar:\n + baz\n + baz\n\n + baz" def test_scrape_url_no_excludes(self): web_scraper = MarkdownifyWebScraperDriver(exclude_tags=[], exclude_classes=[], exclude_ids=[]) artifact = web_scraper.scrape_url("https://example.com/") - assert "[foobar](foobar.com)" == artifact.value + assert artifact.value == "[foobar](foobar.com)" def test_scrape_url_exclude_links(self): web_scraper = MarkdownifyWebScraperDriver(include_links=False) artifact = web_scraper.scrape_url("https://example.com/") - assert "foobar" == artifact.value + assert artifact.value == "foobar" def test_scrape_url_exclude_tags(self, mock_content): mock_content.return_value = "powwow" web_scraper = MarkdownifyWebScraperDriver(exclude_tags=["wow"], exclude_classes=[], exclude_ids=[]) artifact = web_scraper.scrape_url("https://example.com/") - assert "pow" == artifact.value + assert artifact.value == "pow" def test_scrape_url_exclude_classes(self, mock_content): mock_content.return_value = 'powwow' web_scraper = MarkdownifyWebScraperDriver(exclude_tags=[], exclude_classes=["now"], exclude_ids=[]) artifact = web_scraper.scrape_url("https://example.com/") - assert "pow" == artifact.value + assert artifact.value == "pow" def test_scrape_url_exclude_ids(self, mock_content): mock_content.return_value = 'powwow' web_scraper = MarkdownifyWebScraperDriver(exclude_tags=[], exclude_classes=[], exclude_ids=["cow"]) artifact = web_scraper.scrape_url("https://example.com/") - assert "pow" == artifact.value + assert artifact.value == "pow" def test_scrape_url_raises_on_empty_string_from_playwright(self, web_scraper, mock_content): mock_content.return_value = "" diff --git a/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py index 569800c6a..95e5a2880 100644 --- a/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py +++ b/tests/unit/drivers/web_scraper/test_proxy_web_scraper_driver.py @@ -1,7 +1,7 @@ import pytest -from griptape.drivers import ProxyWebScraperDriver from griptape.artifacts import TextArtifact +from griptape.drivers import ProxyWebScraperDriver class TestProxyWebScraperDriver: @@ -11,11 +11,11 @@ def mock_client(self, mocker): mock_response.text = "test_scrape" return mocker.patch("requests.get", return_value=mock_response) - @pytest.fixture + @pytest.fixture() def mock_client_error(self, mocker): return mocker.patch("requests.get", side_effect=Exception("test_error")) - @pytest.fixture + @pytest.fixture() def web_scraper(self, mocker): return ProxyWebScraperDriver( proxies={"http": "http://localhost:8080", "https": "http://localhost:8080"}, @@ -26,7 +26,7 @@ def test_scrape_url(self, web_scraper, mock_client): output = web_scraper.scrape_url("https://example.com/") mock_client.assert_called_with("https://example.com/", proxies=web_scraper.proxies, test_param="test_param") assert isinstance(output, TextArtifact) - assert "test_scrape" == output.value + assert output.value == "test_scrape" def test_scrape_url_error(self, web_scraper, mock_client_error): with pytest.raises(Exception, match="test_error"): diff --git a/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py index f2ea56666..53ddf4500 100644 --- a/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py +++ b/tests/unit/drivers/web_scraper/test_trafilatura_web_scraper_driver.py @@ -5,7 +5,7 @@ class TestTrafilaturaWebScraperDriver: @pytest.fixture(autouse=True) - def mock_fetch_url(self, mocker): + def _mock_fetch_url(self, mocker): # Through trial and error, I've found that include_links in trafilatura's extract does not work # if the body of the page is not long enough, which is why I'm adding an arbitrary number of # characters to the body. @@ -13,7 +13,7 @@ def mock_fetch_url(self, mocker): "trafilatura.fetch_url" ).return_value = f'{"x"*243}foobar' - @pytest.fixture + @pytest.fixture() def web_scraper(self): return TrafilaturaWebScraperDriver(include_links=True) diff --git a/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py index fcacc274c..3d0a782eb 100644 --- a/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py +++ b/tests/unit/drivers/web_search/test_duck_duck_go_web_search_driver.py @@ -1,11 +1,13 @@ -import pytest import json -from griptape.drivers import DuckDuckGoWebSearchDriver + +import pytest + from griptape.artifacts import ListArtifact +from griptape.drivers import DuckDuckGoWebSearchDriver class TestDuckDuckGoWebSearchDriver: - @pytest.fixture + @pytest.fixture() def driver(self, mocker): mock_response = [ {"title": "foo", "href": "bar", "body": "baz"}, @@ -16,7 +18,7 @@ def driver(self, mocker): return DuckDuckGoWebSearchDriver() - @pytest.fixture + @pytest.fixture() def driver_with_error(self, mocker): mocker.patch("duckduckgo_search.DDGS.text", side_effect=Exception("test_error")) diff --git a/tests/unit/drivers/web_search/test_google_web_search_driver.py b/tests/unit/drivers/web_search/test_google_web_search_driver.py index 9ecb92f46..3809532de 100644 --- a/tests/unit/drivers/web_search/test_google_web_search_driver.py +++ b/tests/unit/drivers/web_search/test_google_web_search_driver.py @@ -1,13 +1,13 @@ -from pytest import fixture -import pytest -from griptape.drivers import GoogleWebSearchDriver -from griptape.artifacts import ErrorArtifact import json + +import pytest from pytest_mock import MockerFixture +from griptape.drivers import GoogleWebSearchDriver + class TestGoogleWebSearchDriver: - @fixture + @pytest.fixture() def driver(self, mocker: MockerFixture): mock_response = mocker.Mock() mocker.patch.object( @@ -19,7 +19,7 @@ def driver(self, mocker: MockerFixture): return GoogleWebSearchDriver(api_key="test", search_id="test") - @fixture + @pytest.fixture() def driver_with_error(self, mocker: MockerFixture): mock_response = mocker.Mock() mock_response.status_code = 500 diff --git a/tests/unit/engines/extraction/test_csv_extraction_engine.py b/tests/unit/engines/extraction/test_csv_extraction_engine.py index ded595d59..f69d8a0ba 100644 --- a/tests/unit/engines/extraction/test_csv_extraction_engine.py +++ b/tests/unit/engines/extraction/test_csv_extraction_engine.py @@ -1,10 +1,11 @@ import pytest + from griptape.engines import CsvExtractionEngine from tests.mocks.mock_prompt_driver import MockPromptDriver class TestCsvExtractionEngine: - @pytest.fixture + @pytest.fixture() def engine(self): return CsvExtractionEngine(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/engines/extraction/test_json_extraction_engine.py b/tests/unit/engines/extraction/test_json_extraction_engine.py index 797c5de7a..d95adbb43 100644 --- a/tests/unit/engines/extraction/test_json_extraction_engine.py +++ b/tests/unit/engines/extraction/test_json_extraction_engine.py @@ -1,12 +1,13 @@ import pytest from schema import Schema + from griptape.artifacts import ErrorArtifact from griptape.engines import JsonExtractionEngine from tests.mocks.mock_prompt_driver import MockPromptDriver class TestJsonExtractionEngine: - @pytest.fixture + @pytest.fixture() def engine(self): return JsonExtractionEngine( prompt_driver=MockPromptDriver( diff --git a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py index e5ba50a5b..385cf0c04 100644 --- a/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_footnote_prompt_response_rag_module.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.common import Reference from griptape.engines.rag import RagContext @@ -7,7 +8,7 @@ class TestFootnotePromptResponseRagModule: - @pytest.fixture + @pytest.fixture() def module(self): return FootnotePromptResponseRagModule(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py index f262d6d06..2f8a912e2 100644 --- a/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_prompt_response_rag_module.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import PromptResponseRagModule @@ -6,7 +7,7 @@ class TestPromptResponseRagModule: - @pytest.fixture + @pytest.fixture() def module(self): return PromptResponseRagModule(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py index 2750257f4..bc85cf266 100644 --- a/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_rulesets_before_response_rag_module.py @@ -1,6 +1,6 @@ from griptape.engines.rag import RagContext from griptape.engines.rag.modules import RulesetsBeforeResponseRagModule -from griptape.rules import Ruleset, Rule +from griptape.rules import Rule, Ruleset class TestRulesetsBeforeResponseRagModule: diff --git a/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py index 6488d650e..ae4410b2c 100644 --- a/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py +++ b/tests/unit/engines/rag/modules/generation/test_text_chunks_response_rag_module.py @@ -1,11 +1,12 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.engines.rag import RagContext from griptape.engines.rag.modules import TextChunksResponseRagModule class TestTextChunksResponseRagModule: - @pytest.fixture + @pytest.fixture() def module(self): return TextChunksResponseRagModule() diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py index fa3bfecb2..dda6e89e7 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_text_chunks_rerank_rag_module.py @@ -1,5 +1,6 @@ import pytest from cohere import RerankResponseResultsItem, RerankResponseResultsItemDocument + from griptape.artifacts import TextArtifact from griptape.drivers import CohereRerankDriver from griptape.engines.rag import RagContext @@ -7,7 +8,7 @@ class TestTextChunksRerankRagModule: - @pytest.fixture + @pytest.fixture() def mock_client(self, mocker): mock_client = mocker.patch("cohere.Client").return_value mock_client.rerank.return_value.results = [ diff --git a/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py b/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py index 7c69f674a..69e334c7f 100644 --- a/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py +++ b/tests/unit/engines/rag/modules/retrieval/test_text_loader_retrieval_rag_module.py @@ -11,7 +11,7 @@ class TestTextLoaderRetrievalRagModule: @pytest.fixture(autouse=True) - def mock_trafilatura_fetch_url(self, mocker): + def _mock_trafilatura_fetch_url(self, mocker): mocker.patch("trafilatura.fetch_url", return_value="foobar") def test_run(self): diff --git a/tests/unit/engines/rag/test_rag_engine.py b/tests/unit/engines/rag/test_rag_engine.py index a39c0c2f1..c3d728bb3 100644 --- a/tests/unit/engines/rag/test_rag_engine.py +++ b/tests/unit/engines/rag/test_rag_engine.py @@ -1,14 +1,15 @@ import pytest + from griptape.drivers import LocalVectorStoreDriver -from griptape.engines.rag import RagEngine, RagContext -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage +from griptape.engines.rag import RagContext, RagEngine +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver class TestRagEngine: - @pytest.fixture + @pytest.fixture() def engine(self): return RagEngine( retrieval_stage=RetrievalRagStage( diff --git a/tests/unit/engines/summary/test_prompt_summary_engine.py b/tests/unit/engines/summary/test_prompt_summary_engine.py index 34c6e3563..e826a2b4d 100644 --- a/tests/unit/engines/summary/test_prompt_summary_engine.py +++ b/tests/unit/engines/summary/test_prompt_summary_engine.py @@ -1,13 +1,15 @@ +import os + import pytest -from griptape.artifacts import TextArtifact, ListArtifact -from griptape.engines import PromptSummaryEngine + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.common import PromptStack +from griptape.engines import PromptSummaryEngine from tests.mocks.mock_prompt_driver import MockPromptDriver -import os class TestPromptSummaryEngine: - @pytest.fixture + @pytest.fixture() def engine(self): return PromptSummaryEngine(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/events/test_base_event.py b/tests/unit/events/test_base_event.py index 595c90f1f..778f7c096 100644 --- a/tests/unit/events/test_base_event.py +++ b/tests/unit/events/test_base_event.py @@ -1,17 +1,19 @@ import time + import pytest + from griptape.artifacts.base_artifact import BaseArtifact from griptape.events import ( - StartPromptEvent, + BaseEvent, + CompletionChunkEvent, + FinishActionsSubtaskEvent, FinishPromptEvent, - StartTaskEvent, + FinishStructureRunEvent, FinishTaskEvent, StartActionsSubtaskEvent, - FinishActionsSubtaskEvent, - CompletionChunkEvent, + StartPromptEvent, StartStructureRunEvent, - FinishStructureRunEvent, - BaseEvent, + StartTaskEvent, ) from tests.mocks.mock_event import MockEvent diff --git a/tests/unit/events/test_completion_chunk_event.py b/tests/unit/events/test_completion_chunk_event.py index aa9618a53..943ea483f 100644 --- a/tests/unit/events/test_completion_chunk_event.py +++ b/tests/unit/events/test_completion_chunk_event.py @@ -1,9 +1,10 @@ import pytest + from griptape.events import CompletionChunkEvent class TestCompletionChunkEvent: - @pytest.fixture + @pytest.fixture() def completion_chunk_event(self): return CompletionChunkEvent(token="foo bar") diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 2f32837e0..a79d2b6ea 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -1,27 +1,29 @@ from unittest.mock import Mock + import pytest -from griptape.events.base_event import BaseEvent -from griptape.structures import Pipeline -from griptape.tasks import ToolkitTask, ActionsSubtask + from griptape.events import ( - StartTaskEvent, + CompletionChunkEvent, + EventListener, + FinishActionsSubtaskEvent, + FinishPromptEvent, + FinishStructureRunEvent, FinishTaskEvent, StartActionsSubtaskEvent, - FinishActionsSubtaskEvent, StartPromptEvent, - FinishPromptEvent, StartStructureRunEvent, - FinishStructureRunEvent, - CompletionChunkEvent, - EventListener, + StartTaskEvent, ) +from griptape.events.base_event import BaseEvent +from griptape.structures import Pipeline +from griptape.tasks import ActionsSubtask, ToolkitTask +from tests.mocks.mock_event import MockEvent from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool -from tests.mocks.mock_event import MockEvent class TestEventListener: - @pytest.fixture + @pytest.fixture() def pipeline(self): task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) @@ -107,7 +109,7 @@ def test_publish_event(self): mock_event_listener_driver = Mock() mock_event_listener_driver.try_publish_event_payload.return_value = None - def event_handler(_: BaseEvent): + def event_handler(_: BaseEvent) -> None: return None mock_event = MockEvent() diff --git a/tests/unit/events/test_finish_actions_subtask_event.py b/tests/unit/events/test_finish_actions_subtask_event.py index 14d7cbdde..5e2a0807a 100644 --- a/tests/unit/events/test_finish_actions_subtask_event.py +++ b/tests/unit/events/test_finish_actions_subtask_event.py @@ -1,4 +1,5 @@ import pytest + from griptape.events import FinishActionsSubtaskEvent from griptape.structures import Agent from griptape.tasks import ActionsSubtask, ToolkitTask @@ -7,7 +8,7 @@ class TestFinishActionsSubtaskEvent: - @pytest.fixture + @pytest.fixture() def finish_subtask_event(self): valid_input = ( "Thought: need to test\n" diff --git a/tests/unit/events/test_finish_prompt_event.py b/tests/unit/events/test_finish_prompt_event.py index 7443fce0c..397efe8a0 100644 --- a/tests/unit/events/test_finish_prompt_event.py +++ b/tests/unit/events/test_finish_prompt_event.py @@ -1,9 +1,10 @@ import pytest + from griptape.events import FinishPromptEvent class TestFinishPromptEvent: - @pytest.fixture + @pytest.fixture() def finish_prompt_event(self): return FinishPromptEvent(input_token_count=321, output_token_count=123, result="foo bar", model="foo bar") diff --git a/tests/unit/events/test_finish_structure_run_event.py b/tests/unit/events/test_finish_structure_run_event.py index 0e9e61f4f..9c0961314 100644 --- a/tests/unit/events/test_finish_structure_run_event.py +++ b/tests/unit/events/test_finish_structure_run_event.py @@ -5,7 +5,7 @@ class TestFinishStructureRunEvent: - @pytest.fixture + @pytest.fixture() def finish_structure_run_event(self): return FinishStructureRunEvent( structure_id="fizz", diff --git a/tests/unit/events/test_finish_task_event.py b/tests/unit/events/test_finish_task_event.py index 40e71c9ea..df1d6d42a 100644 --- a/tests/unit/events/test_finish_task_event.py +++ b/tests/unit/events/test_finish_task_event.py @@ -1,12 +1,13 @@ import pytest -from griptape.structures import Agent + from griptape.events import FinishTaskEvent +from griptape.structures import Agent from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver class TestFinishTaskEvent: - @pytest.fixture + @pytest.fixture() def finish_task_event(self): task = PromptTask() agent = Agent(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/events/test_start_actions_subtask_event.py b/tests/unit/events/test_start_actions_subtask_event.py index d8b63de22..8b628057c 100644 --- a/tests/unit/events/test_start_actions_subtask_event.py +++ b/tests/unit/events/test_start_actions_subtask_event.py @@ -1,4 +1,5 @@ import pytest + from griptape.events import StartActionsSubtaskEvent from griptape.structures import Agent from griptape.tasks import ActionsSubtask, ToolkitTask @@ -7,7 +8,7 @@ class TestStartActionsSubtaskEvent: - @pytest.fixture + @pytest.fixture() def start_subtask_event(self): valid_input = ( "Thought: need to test\n" diff --git a/tests/unit/events/test_start_prompt_event.py b/tests/unit/events/test_start_prompt_event.py index 4ef08ec5c..2d7e9368f 100644 --- a/tests/unit/events/test_start_prompt_event.py +++ b/tests/unit/events/test_start_prompt_event.py @@ -1,10 +1,11 @@ import pytest -from griptape.events import StartPromptEvent + from griptape.common import PromptStack +from griptape.events import StartPromptEvent class TestStartPromptEvent: - @pytest.fixture + @pytest.fixture() def start_prompt_event(self): prompt_stack = PromptStack() prompt_stack.add_user_message("foo") diff --git a/tests/unit/events/test_start_structure_run_event.py b/tests/unit/events/test_start_structure_run_event.py index c2f1b923d..221f1a544 100644 --- a/tests/unit/events/test_start_structure_run_event.py +++ b/tests/unit/events/test_start_structure_run_event.py @@ -1,10 +1,11 @@ import pytest + from griptape.artifacts.text_artifact import TextArtifact from griptape.events import StartStructureRunEvent class TestStartStructureRunEvent: - @pytest.fixture + @pytest.fixture() def start_structure_run_event(self): return StartStructureRunEvent( structure_id="fizz", input_task_input=TextArtifact("foo"), input_task_output=TextArtifact("bar") diff --git a/tests/unit/events/test_start_task_event.py b/tests/unit/events/test_start_task_event.py index f4d243421..ea027f147 100644 --- a/tests/unit/events/test_start_task_event.py +++ b/tests/unit/events/test_start_task_event.py @@ -1,4 +1,5 @@ import pytest + from griptape.events import StartTaskEvent from griptape.structures import Agent from griptape.tasks import PromptTask @@ -6,7 +7,7 @@ class TestStartTaskEvent: - @pytest.fixture + @pytest.fixture() def start_task_event(self): task = PromptTask() agent = Agent(prompt_driver=MockPromptDriver()) diff --git a/tests/unit/loaders/conftest.py b/tests/unit/loaders/conftest.py index e1823a154..494916be6 100644 --- a/tests/unit/loaders/conftest.py +++ b/tests/unit/loaders/conftest.py @@ -4,7 +4,7 @@ import pytest -@pytest.fixture +@pytest.fixture() def path_from_resource_path(): def create_source(resource_path: str) -> Path: return Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../resources", resource_path)) @@ -12,7 +12,7 @@ def create_source(resource_path: str) -> Path: return create_source -@pytest.fixture +@pytest.fixture() def bytes_from_resource_path(path_from_resource_path): def create_source(resource_path: str) -> bytes: with open(path_from_resource_path(resource_path), "rb") as f: @@ -21,7 +21,7 @@ def create_source(resource_path: str) -> bytes: return create_source -@pytest.fixture +@pytest.fixture() def str_from_resource_path(path_from_resource_path): def test_csv_str(resource_path: str) -> str: with open(path_from_resource_path(resource_path)) as f: diff --git a/tests/unit/loaders/test_audio_loader.py b/tests/unit/loaders/test_audio_loader.py index b7946da03..473fd0d9e 100644 --- a/tests/unit/loaders/test_audio_loader.py +++ b/tests/unit/loaders/test_audio_loader.py @@ -5,15 +5,15 @@ class TestAudioLoader: - @pytest.fixture + @pytest.fixture() def loader(self): return AudioLoader() - @pytest.fixture + @pytest.fixture() def create_source(self, bytes_from_resource_path): return bytes_from_resource_path - @pytest.mark.parametrize("resource_path,suffix,mime_type", [("sentences.wav", ".wav", "audio/wav")]) + @pytest.mark.parametrize(("resource_path", "suffix", "mime_type"), [("sentences.wav", ".wav", "audio/wav")]) def test_load(self, resource_path, suffix, mime_type, loader, create_source): source = create_source(resource_path) @@ -32,8 +32,7 @@ def test_load_collection(self, create_source, loader): assert len(collection) == len(resource_paths) - keys = {loader.to_key(source) for source in sources} - for key in collection.keys(): + for key in collection: artifact = collection[key] assert isinstance(artifact, AudioArtifact) assert artifact.name.endswith(".wav") diff --git a/tests/unit/loaders/test_blob_loader.py b/tests/unit/loaders/test_blob_loader.py index f2b462726..4812e669c 100644 --- a/tests/unit/loaders/test_blob_loader.py +++ b/tests/unit/loaders/test_blob_loader.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts import BlobArtifact from griptape.loaders import BlobLoader diff --git a/tests/unit/loaders/test_csv_loader.py b/tests/unit/loaders/test_csv_loader.py index 579146ba2..a747afff7 100644 --- a/tests/unit/loaders/test_csv_loader.py +++ b/tests/unit/loaders/test_csv_loader.py @@ -1,4 +1,5 @@ import pytest + from griptape.loaders.csv_loader import CsvLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -12,7 +13,7 @@ def loader(self, request): else: return CsvLoader(embedding_driver=MockEmbeddingDriver(), encoding=encoding) - @pytest.fixture + @pytest.fixture() def loader_with_pipe_delimiter(self): return CsvLoader(embedding_driver=MockEmbeddingDriver(), delimiter="|") diff --git a/tests/unit/loaders/test_dataframe_loader.py b/tests/unit/loaders/test_dataframe_loader.py index 536555558..5c2a57ed6 100644 --- a/tests/unit/loaders/test_dataframe_loader.py +++ b/tests/unit/loaders/test_dataframe_loader.py @@ -1,13 +1,14 @@ import os + import pandas as pd import pytest -from griptape import utils + from griptape.loaders.dataframe_loader import DataFrameLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestDataFrameLoader: - @pytest.fixture + @pytest.fixture() def loader(self): return DataFrameLoader(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/loaders/test_email_loader.py b/tests/unit/loaders/test_email_loader.py index ef69b8348..f1e057453 100644 --- a/tests/unit/loaders/test_email_loader.py +++ b/tests/unit/loaders/test_email_loader.py @@ -1,12 +1,14 @@ from __future__ import annotations +import email from email import message -from griptape.artifacts import ErrorArtifact, ListArtifact -from griptape.loaders import EmailLoader from typing import Optional -import email + import pytest +from griptape.artifacts import ErrorArtifact, ListArtifact +from griptape.loaders import EmailLoader + class TestEmailLoader: @pytest.fixture(autouse=True) @@ -15,7 +17,7 @@ def mock_imap_connection(self, mocker): mock_imap_connection.__enter__.return_value = mock_imap_connection return mock_imap_connection - @pytest.fixture + @pytest.fixture() def mock_login(self, mock_imap_connection): return mock_imap_connection.login @@ -25,7 +27,7 @@ def mock_select(self, mock_imap_connection): mock_select.return_value = to_select_response("OK", 1) return mock_select - @pytest.fixture + @pytest.fixture() def mock_search(self, mock_imap_connection): return mock_imap_connection.search @@ -35,7 +37,7 @@ def mock_fetch(self, mock_imap_connection): mock_fetch.return_value = to_fetch_message("message", "text/plain") return mock_fetch - @pytest.fixture + @pytest.fixture() def loader(self): return EmailLoader(imap_url="an.email.server.hostname", username="username", password="password") diff --git a/tests/unit/loaders/test_image_loader.py b/tests/unit/loaders/test_image_loader.py index 2a90d6b5d..eca4cbccc 100644 --- a/tests/unit/loaders/test_image_loader.py +++ b/tests/unit/loaders/test_image_loader.py @@ -5,20 +5,20 @@ class TestImageLoader: - @pytest.fixture + @pytest.fixture() def loader(self): return ImageLoader() - @pytest.fixture + @pytest.fixture() def png_loader(self): return ImageLoader(format="png") - @pytest.fixture + @pytest.fixture() def create_source(self, bytes_from_resource_path): return bytes_from_resource_path @pytest.mark.parametrize( - "resource_path,suffix,mime_type", + ("resource_path", "suffix", "mime_type"), [ ("small.png", ".png", "image/png"), ("small.jpg", ".jpeg", "image/jpeg"), diff --git a/tests/unit/loaders/test_pdf_loader.py b/tests/unit/loaders/test_pdf_loader.py index 0ab78b8b6..3f4f7848e 100644 --- a/tests/unit/loaders/test_pdf_loader.py +++ b/tests/unit/loaders/test_pdf_loader.py @@ -1,8 +1,5 @@ -import os -from pathlib import Path -from typing import IO import pytest -from griptape import utils + from griptape.loaders import PdfLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -10,11 +7,11 @@ class TestPdfLoader: - @pytest.fixture + @pytest.fixture() def loader(self): return PdfLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) - @pytest.fixture + @pytest.fixture() def create_source(self, bytes_from_resource_path): return bytes_from_resource_path diff --git a/tests/unit/loaders/test_sql_loader.py b/tests/unit/loaders/test_sql_loader.py index 8541e4fb8..fbfa6d4fa 100644 --- a/tests/unit/loaders/test_sql_loader.py +++ b/tests/unit/loaders/test_sql_loader.py @@ -1,5 +1,6 @@ import pytest from sqlalchemy.pool import StaticPool + from griptape.drivers import SqlDriver from griptape.loaders import SqlLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -8,7 +9,7 @@ class TestSqlLoader: - @pytest.fixture + @pytest.fixture() def loader(self): sql_loader = SqlLoader( sql_driver=SqlDriver( diff --git a/tests/unit/loaders/test_text_loader.py b/tests/unit/loaders/test_text_loader.py index 0c59df12f..07527f9e6 100644 --- a/tests/unit/loaders/test_text_loader.py +++ b/tests/unit/loaders/test_text_loader.py @@ -1,4 +1,5 @@ import pytest + from griptape.loaders.text_loader import TextLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver diff --git a/tests/unit/loaders/test_web_loader.py b/tests/unit/loaders/test_web_loader.py index e26573539..f264ce667 100644 --- a/tests/unit/loaders/test_web_loader.py +++ b/tests/unit/loaders/test_web_loader.py @@ -1,4 +1,5 @@ import pytest + from griptape.artifacts.error_artifact import ErrorArtifact from griptape.loaders import WebLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -8,10 +9,10 @@ class TestWebLoader: @pytest.fixture(autouse=True) - def mock_trafilatura_fetch_url(self, mocker): + def _mock_trafilatura_fetch_url(self, mocker): mocker.patch("trafilatura.fetch_url", return_value="foobar") - @pytest.fixture + @pytest.fixture() def loader(self): return WebLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/memory/meta/test_action_subtask_meta_entry.py b/tests/unit/memory/meta/test_action_subtask_meta_entry.py index f5da6ee01..0a51e7227 100644 --- a/tests/unit/memory/meta/test_action_subtask_meta_entry.py +++ b/tests/unit/memory/meta/test_action_subtask_meta_entry.py @@ -1,9 +1,10 @@ import pytest + from griptape.memory.meta import ActionSubtaskMetaEntry class TestActionSubtaskMetaEntry: - @pytest.fixture + @pytest.fixture() def entry(self): return ActionSubtaskMetaEntry(thought="foo", actions="[]", answer="baz") diff --git a/tests/unit/memory/meta/test_meta_memory.py b/tests/unit/memory/meta/test_meta_memory.py index bbdacf5b4..5a1249529 100644 --- a/tests/unit/memory/meta/test_meta_memory.py +++ b/tests/unit/memory/meta/test_meta_memory.py @@ -1,9 +1,10 @@ import pytest -from griptape.memory.meta import MetaMemory, ActionSubtaskMetaEntry + +from griptape.memory.meta import ActionSubtaskMetaEntry, MetaMemory class TestMetaMemory: - @pytest.fixture + @pytest.fixture() def memory(self): return MetaMemory() diff --git a/tests/unit/memory/structure/test_conversation_memory.py b/tests/unit/memory/structure/test_conversation_memory.py index 613d4b1fe..2ffd7b8cb 100644 --- a/tests/unit/memory/structure/test_conversation_memory.py +++ b/tests/unit/memory/structure/test_conversation_memory.py @@ -1,12 +1,12 @@ import json -from griptape.structures import Agent + +from griptape.artifacts import TextArtifact from griptape.common import PromptStack -from griptape.memory.structure import ConversationMemory, Run, BaseConversationMemory -from griptape.structures import Pipeline +from griptape.memory.structure import BaseConversationMemory, ConversationMemory, Run +from griptape.structures import Agent, Pipeline +from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tokenizer import MockTokenizer -from griptape.tasks import PromptTask -from griptape.artifacts import TextArtifact class TestConversationMemory: diff --git a/tests/unit/memory/structure/test_summary_conversation_memory.py b/tests/unit/memory/structure/test_summary_conversation_memory.py index e625ac6c6..4396c7b23 100644 --- a/tests/unit/memory/structure/test_summary_conversation_memory.py +++ b/tests/unit/memory/structure/test_summary_conversation_memory.py @@ -1,9 +1,8 @@ import json - +from griptape.artifacts import TextArtifact from griptape.memory.structure import Run, SummaryConversationMemory from griptape.structures import Pipeline -from griptape.artifacts import TextArtifact from griptape.tasks import PromptTask from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_structure_config import MockStructureConfig diff --git a/tests/unit/memory/tool/storage/test_blob_artifact_storage.py b/tests/unit/memory/tool/storage/test_blob_artifact_storage.py index dd42b6bc2..c7f2cfcbd 100644 --- a/tests/unit/memory/tool/storage/test_blob_artifact_storage.py +++ b/tests/unit/memory/tool/storage/test_blob_artifact_storage.py @@ -1,10 +1,11 @@ import pytest + from griptape.artifacts import BlobArtifact, TextArtifact from griptape.memory.task.storage import BlobArtifactStorage class TestBlobArtifactStorage: - @pytest.fixture + @pytest.fixture() def storage(self): return BlobArtifactStorage() diff --git a/tests/unit/memory/tool/storage/test_text_artifact_storage.py b/tests/unit/memory/tool/storage/test_text_artifact_storage.py index 706a80f0c..64f44c581 100644 --- a/tests/unit/memory/tool/storage/test_text_artifact_storage.py +++ b/tests/unit/memory/tool/storage/test_text_artifact_storage.py @@ -1,10 +1,11 @@ import pytest + from griptape.artifacts import BlobArtifact, TextArtifact from tests.utils import defaults class TestTextArtifactStorage: - @pytest.fixture + @pytest.fixture() def storage(self): return defaults.text_tool_artifact_storage() diff --git a/tests/unit/memory/tool/test_task_memory.py b/tests/unit/memory/tool/test_task_memory.py index fc1cf75c7..53e4703a6 100644 --- a/tests/unit/memory/tool/test_task_memory.py +++ b/tests/unit/memory/tool/test_task_memory.py @@ -1,6 +1,6 @@ import pytest -from griptape.artifacts import CsvRowArtifact, BlobArtifact, ErrorArtifact, InfoArtifact -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import BlobArtifact, CsvRowArtifact, ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.memory import TaskMemory from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage from griptape.structures import Agent @@ -11,10 +11,10 @@ class TestTaskMemory: @pytest.fixture(autouse=True) - def mock_griptape(self, mocker): + def _mock_griptape(self, mocker): mocker.patch("griptape.engines.CsvExtractionEngine.extract", return_value=[CsvRowArtifact({"foo": "bar"})]) - @pytest.fixture + @pytest.fixture() def memory(self): return defaults.text_task_memory("MyMemory") diff --git a/tests/unit/mixins/test_activity_mixin.py b/tests/unit/mixins/test_activity_mixin.py index 45db7cc7f..91e0c3a67 100644 --- a/tests/unit/mixins/test_activity_mixin.py +++ b/tests/unit/mixins/test_activity_mixin.py @@ -1,10 +1,11 @@ import pytest -from schema import Schema, Literal, Optional +from schema import Literal, Optional, Schema + from tests.mocks.mock_tool.tool import MockTool class TestActivityMixin: - @pytest.fixture + @pytest.fixture() def tool(self): return MockTool(test_field="hello", test_int=5) diff --git a/tests/unit/mixins/test_image_artifact_file_output_mixin.py b/tests/unit/mixins/test_image_artifact_file_output_mixin.py index 69a2f1d71..03c44e081 100644 --- a/tests/unit/mixins/test_image_artifact_file_output_mixin.py +++ b/tests/unit/mixins/test_image_artifact_file_output_mixin.py @@ -19,7 +19,7 @@ def test_output_file(self): artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") class Test(BlobArtifactFileOutputMixin): - def run(self): + def run(self) -> None: self._write_to_file(artifact) outfile = os.path.join(tempfile.gettempdir(), artifact.name) @@ -34,7 +34,7 @@ def test_output_dir(self): artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") class Test(BlobArtifactFileOutputMixin): - def run(self): + def run(self) -> None: self._write_to_file(artifact) outdir = tempfile.gettempdir() diff --git a/tests/unit/mixins/test_seriliazable_mixin.py b/tests/unit/mixins/test_seriliazable_mixin.py index 1704000e3..afb3d1eb4 100644 --- a/tests/unit/mixins/test_seriliazable_mixin.py +++ b/tests/unit/mixins/test_seriliazable_mixin.py @@ -1,11 +1,13 @@ import json + import pytest + +from griptape.artifacts import BaseArtifact, TextArtifact from griptape.drivers import OpenAiChatPromptDriver -from griptape.memory.structure import ConversationMemory from griptape.memory import TaskMemory -from tests.mocks.mock_serializable import MockSerializable +from griptape.memory.structure import ConversationMemory from griptape.schemas import BaseSchema -from griptape.artifacts import BaseArtifact, TextArtifact +from tests.mocks.mock_serializable import MockSerializable class TestSerializableMixin: diff --git a/tests/unit/schemas/test_base_schema.py b/tests/unit/schemas/test_base_schema.py index fcbd08c7f..f3a3f0c1f 100644 --- a/tests/unit/schemas/test_base_schema.py +++ b/tests/unit/schemas/test_base_schema.py @@ -1,13 +1,16 @@ from __future__ import annotations + from datetime import datetime +from typing import Literal, Optional, Union + import pytest -from typing import Union, Optional, Literal from marshmallow import fields + from griptape.artifacts import BaseArtifact, TextArtifact +from griptape.loaders import TextLoader from griptape.schemas import PolymorphicSchema -from griptape.schemas.bytes_field import Bytes from griptape.schemas.base_schema import BaseSchema -from griptape.loaders import TextLoader +from griptape.schemas.bytes_field import Bytes from tests.mocks.mock_serializable import MockSerializable @@ -62,8 +65,8 @@ def test_get_field_type_info(self): assert BaseSchema._get_field_type_info(list) == (list, (), False) - assert BaseSchema._get_field_type_info(Literal["foo"]) == (str, (), False) # pyright: ignore - assert BaseSchema._get_field_type_info(Literal[5]) == (int, (), False) # pyright: ignore + assert BaseSchema._get_field_type_info(Literal["foo"]) == (str, (), False) # pyright: ignore[reportArgumentType] + assert BaseSchema._get_field_type_info(Literal[5]) == (int, (), False) # pyright: ignore[reportArgumentType] def test_is_list_sequence(self): assert BaseSchema.is_list_sequence(list) diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index baceac825..a09ad0f9a 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -1,15 +1,15 @@ import pytest -from griptape.memory.structure import ConversationMemory + +from griptape.engines import PromptSummaryEngine from griptape.memory import TaskMemory +from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset from griptape.structures import Agent -from griptape.tasks import PromptTask, BaseTask, ToolkitTask -from griptape.engines import PromptSummaryEngine - +from griptape.tasks import BaseTask, PromptTask, ToolkitTask +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool -from tests.mocks.mock_embedding_driver import MockEmbeddingDriver class TestAgent: @@ -49,8 +49,8 @@ def test_rules_and_rulesets(self): with pytest.raises(ValueError): Agent(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])]) + agent = Agent() with pytest.raises(ValueError): - agent = Agent() agent.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) def test_with_task_memory(self): @@ -149,13 +149,13 @@ def test_add_tasks(self): try: agent.add_tasks(first_task, second_task) - assert False + raise AssertionError() except ValueError: assert True try: agent + [first_task, second_task] - assert False + raise AssertionError() except ValueError: assert True diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index e63937a62..38f8abfb3 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -1,20 +1,21 @@ -import pytest import time -from griptape.artifacts import TextArtifact, ErrorArtifact +import pytest + +from griptape.artifacts import ErrorArtifact, TextArtifact +from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import TextArtifactStorage from griptape.rules import Rule, Ruleset +from griptape.structures import Pipeline +from griptape.tasks import BaseTask, CodeExecutionTask, PromptTask, ToolkitTask from griptape.tokenizers import OpenAiTokenizer -from griptape.tasks import PromptTask, BaseTask, ToolkitTask, CodeExecutionTask -from griptape.memory.structure import ConversationMemory from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.structures import Pipeline from tests.mocks.mock_tool.tool import MockTool from tests.unit.structures.test_agent import MockEmbeddingDriver class TestPipeline: - @pytest.fixture + @pytest.fixture() def waiting_task(self): def fn(task): time.sleep(2) @@ -22,7 +23,7 @@ def fn(task): return CodeExecutionTask(run_fn=fn) - @pytest.fixture + @pytest.fixture() def error_artifact_task(self): def fn(task): return ErrorArtifact("error") @@ -76,8 +77,8 @@ def test_rules_and_rulesets(self): with pytest.raises(ValueError): Pipeline(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])]) + pipeline = Pipeline() with pytest.raises(ValueError): - pipeline = Pipeline() pipeline.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) def test_with_no_task_memory(self): diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index bf55e852f..2be164ea7 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -1,20 +1,20 @@ import time + import pytest -from pytest import fixture +from griptape.artifacts import ErrorArtifact, TextArtifact +from griptape.memory.structure import ConversationMemory from griptape.memory.task.storage import TextArtifactStorage -from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.rules import Rule, Ruleset -from griptape.tasks import PromptTask, BaseTask, ToolkitTask, CodeExecutionTask from griptape.structures import Workflow -from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.memory.structure import ConversationMemory -from tests.mocks.mock_tool.tool import MockTool +from griptape.tasks import BaseTask, CodeExecutionTask, PromptTask, ToolkitTask from tests.mocks.mock_embedding_driver import MockEmbeddingDriver +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_tool.tool import MockTool class TestWorkflow: - @fixture + @pytest.fixture() def waiting_task(self): def fn(task): time.sleep(2) @@ -22,7 +22,7 @@ def fn(task): return CodeExecutionTask(run_fn=fn) - @fixture + @pytest.fixture() def error_artifact_task(self): def fn(task): return ErrorArtifact("error") @@ -75,8 +75,8 @@ def test_rules_and_rulesets(self): with pytest.raises(ValueError): Workflow(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])]) + workflow = Workflow() with pytest.raises(ValueError): - workflow = Workflow() workflow.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) def test_with_no_task_memory(self): @@ -777,7 +777,7 @@ def test_run_with_error_artifact_no_fail_fast(self, error_artifact_task, waiting assert workflow.output is not None @staticmethod - def _validate_topology_1(workflow): + def _validate_topology_1(workflow) -> None: assert len(workflow.tasks) == 4 assert workflow.input_task.id == "task1" assert workflow.output_task.id == "task4" @@ -805,8 +805,8 @@ def _validate_topology_1(workflow): assert task4.child_ids == [] @staticmethod - def _validate_topology_2(workflow): - """Adapted from https://en.wikipedia.org/wiki/Directed_acyclic_graph#/media/File:Tred-G.svg""" + def _validate_topology_2(workflow) -> None: + """Adapted from https://en.wikipedia.org/wiki/Directed_acyclic_graph#/media/File:Tred-G.svg.""" assert len(workflow.tasks) == 5 assert workflow.input_task.id == "taska" assert workflow.output_task.id == "taske" @@ -839,7 +839,7 @@ def _validate_topology_2(workflow): assert taske.child_ids == [] @staticmethod - def _validate_topology_3(workflow): + def _validate_topology_3(workflow) -> None: assert len(workflow.tasks) == 4 assert workflow.input_task.id == "task1" assert workflow.output_task.id == "task3" @@ -867,7 +867,7 @@ def _validate_topology_3(workflow): assert task4.child_ids == ["task2"] @staticmethod - def _validate_topology_4(workflow): + def _validate_topology_4(workflow) -> None: assert len(workflow.tasks) == 9 assert workflow.input_task.id == "collect_movie_info" assert workflow.output_task.id == "summarize_to_slack" diff --git a/tests/unit/tasks/test_actions_subtask.py b/tests/unit/tasks/test_actions_subtask.py index c6e5ca038..e25a42120 100644 --- a/tests/unit/tasks/test_actions_subtask.py +++ b/tests/unit/tasks/test_actions_subtask.py @@ -1,10 +1,11 @@ import json -from griptape.artifacts import ListArtifact, TextArtifact, ActionArtifact + +from griptape.artifacts import ActionArtifact, ListArtifact, TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact -from tests.mocks.mock_tool.tool import MockTool -from griptape.tasks import ToolkitTask, ActionsSubtask -from griptape.structures import Agent from griptape.common import ToolAction +from griptape.structures import Agent +from griptape.tasks import ActionsSubtask, ToolkitTask +from tests.mocks.mock_tool.tool import MockTool class TestActionsSubtask: diff --git a/tests/unit/tasks/test_audio_transcription_task.py b/tests/unit/tasks/test_audio_transcription_task.py index 3a53fd49d..f4bc0e8b8 100644 --- a/tests/unit/tasks/test_audio_transcription_task.py +++ b/tests/unit/tasks/test_audio_transcription_task.py @@ -5,17 +5,17 @@ from griptape.artifacts import AudioArtifact, TextArtifact from griptape.engines import AudioTranscriptionEngine from griptape.structures import Agent, Pipeline -from griptape.tasks import BaseTask, AudioTranscriptionTask +from griptape.tasks import AudioTranscriptionTask, BaseTask from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_structure_config import MockStructureConfig class TestAudioTranscriptionTask: - @pytest.fixture + @pytest.fixture() def audio_artifact(self): return AudioArtifact(value=b"audio data", format="mp3") - @pytest.fixture + @pytest.fixture() def audio_transcription_engine(self): return Mock() @@ -40,14 +40,9 @@ def test_config_audio_transcription_engine(self, audio_artifact): def test_run(self, audio_artifact, audio_transcription_engine): audio_transcription_engine.run.return_value = TextArtifact("mock transcription") - logger = Mock() task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) - pipeline = Pipeline(prompt_driver=MockPromptDriver(), logger=logger) + pipeline = Pipeline(prompt_driver=MockPromptDriver()) pipeline.add_task(task) assert pipeline.run().output.to_text() == "mock transcription" - - def test_before_run(self, audio_artifact, audio_transcription_engine): - task = AudioTranscriptionTask(audio_artifact, audio_transcription_engine=audio_transcription_engine) - task diff --git a/tests/unit/tasks/test_base_audio_input_task.py b/tests/unit/tasks/test_base_audio_input_task.py index e11074880..e16c6536c 100644 --- a/tests/unit/tasks/test_base_audio_input_task.py +++ b/tests/unit/tasks/test_base_audio_input_task.py @@ -1,12 +1,12 @@ import pytest -from tests.mocks.mock_audio_input_task import MockAudioInputTask from griptape.artifacts import AudioArtifact, TextArtifact +from tests.mocks.mock_audio_input_task import MockAudioInputTask from tests.mocks.mock_text_input_task import MockTextInputTask class TestBaseAudioInputTask: - @pytest.fixture + @pytest.fixture() def audio_artifact(self): return AudioArtifact(b"audio content", format="mp3") diff --git a/tests/unit/tasks/test_base_multi_text_input_task.py b/tests/unit/tasks/test_base_multi_text_input_task.py index ad4776aee..3d8d67a55 100644 --- a/tests/unit/tasks/test_base_multi_text_input_task.py +++ b/tests/unit/tasks/test_base_multi_text_input_task.py @@ -1,7 +1,7 @@ -from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.structures import Pipeline from griptape.artifacts import TextArtifact +from griptape.structures import Pipeline from tests.mocks.mock_multi_text_input_task import MockMultiTextInputTask +from tests.mocks.mock_prompt_driver import MockPromptDriver class TestBaseMultiTextInputTask: diff --git a/tests/unit/tasks/test_base_task.py b/tests/unit/tasks/test_base_task.py index 7fe2810f5..7a1afcf07 100644 --- a/tests/unit/tasks/test_base_task.py +++ b/tests/unit/tasks/test_base_task.py @@ -1,9 +1,8 @@ import pytest from griptape.artifacts import TextArtifact -from griptape.structures import Agent +from griptape.structures import Agent, Workflow from griptape.tasks import ActionsSubtask -from griptape.structures import Workflow from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_task import MockTask @@ -11,7 +10,7 @@ class TestBaseTask: - @pytest.fixture + @pytest.fixture() def task(self): agent = Agent(prompt_driver=MockPromptDriver(), embedding_driver=MockEmbeddingDriver(), tools=[MockTool()]) diff --git a/tests/unit/tasks/test_base_text_input_task.py b/tests/unit/tasks/test_base_text_input_task.py index 14c3c3f2e..86dc98805 100644 --- a/tests/unit/tasks/test_base_text_input_task.py +++ b/tests/unit/tasks/test_base_text_input_task.py @@ -1,7 +1,7 @@ -from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.structures import Pipeline from griptape.artifacts import TextArtifact -from griptape.rules import Ruleset, Rule +from griptape.rules import Rule, Ruleset +from griptape.structures import Pipeline +from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_text_input_task import MockTextInputTask diff --git a/tests/unit/tasks/test_code_execution_task.py b/tests/unit/tasks/test_code_execution_task.py index b94714912..3178e29db 100644 --- a/tests/unit/tasks/test_code_execution_task.py +++ b/tests/unit/tasks/test_code_execution_task.py @@ -1,4 +1,4 @@ -from griptape.artifacts import BaseArtifact, TextArtifact, ErrorArtifact +from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.structures import Pipeline from griptape.tasks import CodeExecutionTask from tests.mocks.mock_prompt_driver import MockPromptDriver diff --git a/tests/unit/tasks/test_csv_extraction_task.py b/tests/unit/tasks/test_csv_extraction_task.py index 9b8fb15bb..7d37c3897 100644 --- a/tests/unit/tasks/test_csv_extraction_task.py +++ b/tests/unit/tasks/test_csv_extraction_task.py @@ -8,7 +8,7 @@ class TestCsvExtractionTask: - @pytest.fixture + @pytest.fixture() def task(self): return CsvExtractionTask(args={"column_names": ["test1"]}) @@ -30,4 +30,4 @@ def test_config_extraction_engine(self, task): def test_missing_extraction_engine(self, task): with pytest.raises(ValueError): - task.extraction_engine + task.extraction_engine # noqa: B018 diff --git a/tests/unit/tasks/test_extraction_task.py b/tests/unit/tasks/test_extraction_task.py index 5e5ec09f6..afa73a506 100644 --- a/tests/unit/tasks/test_extraction_task.py +++ b/tests/unit/tasks/test_extraction_task.py @@ -1,4 +1,5 @@ import pytest + from griptape.engines import CsvExtractionEngine from griptape.structures import Agent from griptape.tasks import ExtractionTask @@ -6,7 +7,7 @@ class TestExtractionTask: - @pytest.fixture + @pytest.fixture() def task(self): return ExtractionTask( extraction_engine=CsvExtractionEngine(prompt_driver=MockPromptDriver()), args={"column_names": ["test1"]} diff --git a/tests/unit/tasks/test_image_query_task.py b/tests/unit/tasks/test_image_query_task.py index dd4940213..549009fc1 100644 --- a/tests/unit/tasks/test_image_query_task.py +++ b/tests/unit/tasks/test_image_query_task.py @@ -12,18 +12,18 @@ class TestImageQueryTask: - @pytest.fixture + @pytest.fixture() def image_query_engine(self) -> Mock: mock = Mock() mock.run.return_value = TextArtifact("image") return mock - @pytest.fixture + @pytest.fixture() def text_artifact(self): return TextArtifact(value="some text") - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(value=b"some image data", format="png", width=512, height=512) @@ -70,7 +70,7 @@ def test_missing_image_generation_engine(self, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) with pytest.raises(ValueError, match="Image Query Engine"): - task.image_query_engine + task.image_query_engine # noqa: B018 def test_run(self, image_query_engine, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact]), image_query_engine=image_query_engine) diff --git a/tests/unit/tasks/test_inpainting_image_generation_task.py b/tests/unit/tasks/test_inpainting_image_generation_task.py index 9dc6aff54..ff287d79a 100644 --- a/tests/unit/tasks/test_inpainting_image_generation_task.py +++ b/tests/unit/tasks/test_inpainting_image_generation_task.py @@ -1,21 +1,22 @@ -from griptape.artifacts.list_artifact import ListArtifact -from griptape.engines import InpaintingImageGenerationEngine from unittest.mock import Mock import pytest -from griptape.tasks import BaseTask, InpaintingImageGenerationTask -from griptape.artifacts import TextArtifact, ImageArtifact + +from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.engines import InpaintingImageGenerationEngine from griptape.structures import Agent +from griptape.tasks import BaseTask, InpaintingImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_structure_config import MockStructureConfig class TestInpaintingImageGenerationTask: - @pytest.fixture + @pytest.fixture() def text_artifact(self): return TextArtifact(value="some text") - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(value=b"some image data", format="png", width=512, height=512) @@ -59,4 +60,4 @@ def test_missing_image_generation_engine(self, text_artifact, image_artifact): task = InpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) with pytest.raises(ValueError): - task.image_generation_engine + task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_json_extraction_task.py b/tests/unit/tasks/test_json_extraction_task.py index 0366652b0..ba7d1ce30 100644 --- a/tests/unit/tasks/test_json_extraction_task.py +++ b/tests/unit/tasks/test_json_extraction_task.py @@ -1,14 +1,15 @@ -from griptape.engines import JsonExtractionEngine import pytest from schema import Schema + +from griptape.engines import JsonExtractionEngine from griptape.structures import Agent from griptape.tasks import JsonExtractionTask -from tests.mocks.mock_structure_config import MockStructureConfig from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_structure_config import MockStructureConfig class TestJsonExtractionTask: - @pytest.fixture + @pytest.fixture() def task(self): return JsonExtractionTask("foo", args={"template_schema": Schema({"foo": "bar"}).json_schema("TemplateSchema")}) @@ -34,4 +35,4 @@ def test_config_extraction_engine(self, task): def test_missing_extraction_engine(self, task): with pytest.raises(ValueError): - task.extraction_engine + task.extraction_engine # noqa: B018 diff --git a/tests/unit/tasks/test_outpainting_image_generation_task.py b/tests/unit/tasks/test_outpainting_image_generation_task.py index 148ea133d..7de530330 100644 --- a/tests/unit/tasks/test_outpainting_image_generation_task.py +++ b/tests/unit/tasks/test_outpainting_image_generation_task.py @@ -1,10 +1,10 @@ -from griptape.artifacts.list_artifact import ListArtifact -from griptape.engines import OutpaintingImageGenerationEngine from unittest.mock import Mock import pytest from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.engines import OutpaintingImageGenerationEngine from griptape.structures import Agent from griptape.tasks import BaseTask, OutpaintingImageGenerationTask from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver @@ -12,11 +12,11 @@ class TestOutpaintingImageGenerationTask: - @pytest.fixture + @pytest.fixture() def text_artifact(self): return TextArtifact(value="some text") - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(value=b"some image data", format="png", width=512, height=512) @@ -60,4 +60,4 @@ def test_missing_image_generation_engine(self, text_artifact, image_artifact): task = OutpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) with pytest.raises(ValueError): - task.image_generation_engine + task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_prompt_image_generation_task.py b/tests/unit/tasks/test_prompt_image_generation_task.py index 4f6117c07..c3add5720 100644 --- a/tests/unit/tasks/test_prompt_image_generation_task.py +++ b/tests/unit/tasks/test_prompt_image_generation_task.py @@ -1,4 +1,3 @@ -from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from unittest.mock import Mock import pytest @@ -7,6 +6,7 @@ from griptape.engines import PromptImageGenerationEngine from griptape.structures import Agent from griptape.tasks import BaseTask, PromptImageGenerationTask +from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_structure_config import MockStructureConfig @@ -37,4 +37,4 @@ def test_missing_summary_engine(self): task = PromptImageGenerationTask("foo bar") with pytest.raises(ValueError): - task.image_generation_engine + task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tasks/test_prompt_task.py b/tests/unit/tasks/test_prompt_task.py index c76f0284b..083ea6da5 100644 --- a/tests/unit/tasks/test_prompt_task.py +++ b/tests/unit/tasks/test_prompt_task.py @@ -1,14 +1,15 @@ import pytest + from griptape.artifacts.image_artifact import ImageArtifact from griptape.artifacts.list_artifact import ListArtifact from griptape.artifacts.text_artifact import TextArtifact from griptape.memory.structure import ConversationMemory from griptape.memory.structure.run import Run -from tests.mocks.mock_structure_config import MockStructureConfig -from griptape.tasks import PromptTask from griptape.rules import Rule -from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.structures import Pipeline +from griptape.tasks import PromptTask +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_structure_config import MockStructureConfig class TestPromptTask: @@ -37,7 +38,7 @@ def test_missing_prompt_driver(self): task = PromptTask("test") with pytest.raises(ValueError): - task.prompt_driver + task.prompt_driver # noqa: B018 def test_input(self): # Str diff --git a/tests/unit/tasks/test_rag_task.py b/tests/unit/tasks/test_rag_task.py index c9b82f208..b205d385a 100644 --- a/tests/unit/tasks/test_rag_task.py +++ b/tests/unit/tasks/test_rag_task.py @@ -1,4 +1,5 @@ import pytest + from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import PromptResponseRagModule from griptape.engines.rag.stages import ResponseRagStage @@ -8,7 +9,7 @@ class TestRagTask: - @pytest.fixture + @pytest.fixture() def task(self): return RagTask( input="test", diff --git a/tests/unit/tasks/test_structure_run_task.py b/tests/unit/tasks/test_structure_run_task.py index d89e98c91..1053ade9e 100644 --- a/tests/unit/tasks/test_structure_run_task.py +++ b/tests/unit/tasks/test_structure_run_task.py @@ -1,8 +1,7 @@ +from griptape.drivers import LocalStructureRunDriver +from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask -from griptape.structures import Agent from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.drivers import LocalStructureRunDriver -from griptape.structures import Pipeline class TestStructureRunTask: diff --git a/tests/unit/tasks/test_text_summary_task.py b/tests/unit/tasks/test_text_summary_task.py index d7a474373..bb08f9d31 100644 --- a/tests/unit/tasks/test_text_summary_task.py +++ b/tests/unit/tasks/test_text_summary_task.py @@ -1,9 +1,10 @@ import pytest -from tests.mocks.mock_structure_config import MockStructureConfig + from griptape.engines import PromptSummaryEngine +from griptape.structures import Agent from griptape.tasks import TextSummaryTask from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.structures import Agent +from tests.mocks.mock_structure_config import MockStructureConfig class TestTextSummaryTask: @@ -34,4 +35,4 @@ def test_missing_summary_engine(self): task = TextSummaryTask("test") with pytest.raises(ValueError): - task.summary_engine + task.summary_engine # noqa: B018 diff --git a/tests/unit/tasks/test_text_to_speech_task.py b/tests/unit/tasks/test_text_to_speech_task.py index 7a8e49364..86bc1d2ce 100644 --- a/tests/unit/tasks/test_text_to_speech_task.py +++ b/tests/unit/tasks/test_text_to_speech_task.py @@ -1,6 +1,6 @@ from unittest.mock import Mock -from griptape.artifacts import TextArtifact, AudioArtifact +from griptape.artifacts import AudioArtifact, TextArtifact from griptape.engines import TextToSpeechEngine from griptape.structures import Agent, Pipeline from griptape.tasks import BaseTask, TextToSpeechTask diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index 2af8b73c3..dfc679919 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -1,8 +1,10 @@ import json + import pytest + from griptape.artifacts import TextArtifact from griptape.structures import Agent -from griptape.tasks import ToolTask, ActionsSubtask +from griptape.tasks import ActionsSubtask, ToolTask from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool @@ -163,7 +165,7 @@ class TestToolTask: "$schema": "http://json-schema.org/draft-07/schema#", } - @pytest.fixture + @pytest.fixture() def agent(self): output_dict = {"tag": "foo", "name": "MockTool", "path": "test", "input": {"values": {"test": "foobar"}}} diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 2217ba70c..cd5dd21f8 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -1,9 +1,9 @@ from griptape.artifacts import ErrorArtifact, TextArtifact -from griptape.structures import Agent -from griptape.tasks import ToolkitTask, ActionsSubtask, PromptTask from griptape.common import ToolAction -from tests.mocks.mock_tool.tool import MockTool +from griptape.structures import Agent +from griptape.tasks import ActionsSubtask, PromptTask, ToolkitTask from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.mocks.mock_tool.tool import MockTool from tests.utils import defaults @@ -166,7 +166,7 @@ def test_init(self): try: ToolkitTask("test", tools=[MockTool(), MockTool()]) - assert False + raise AssertionError() except ValueError: assert True @@ -231,7 +231,7 @@ def test_init_from_prompt_1(self): assert subtask.output is None def test_init_from_prompt_2(self): - valid_input = """Thought: need to test\nObservation: test + valid_input = """Thought: need to test\nObservation: test observation\nAnswer: test output""" task = ToolkitTask("test", tools=[MockTool(name="Tool1")]) diff --git a/tests/unit/tasks/test_variation_image_generation_task.py b/tests/unit/tasks/test_variation_image_generation_task.py index 6a9533da3..3f865931f 100644 --- a/tests/unit/tasks/test_variation_image_generation_task.py +++ b/tests/unit/tasks/test_variation_image_generation_task.py @@ -1,21 +1,22 @@ -from griptape.artifacts.list_artifact import ListArtifact -from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver -from tests.mocks.mock_structure_config import MockStructureConfig from unittest.mock import Mock import pytest -from griptape.tasks import BaseTask, VariationImageGenerationTask -from griptape.artifacts import TextArtifact, ImageArtifact + +from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts.list_artifact import ListArtifact from griptape.engines import VariationImageGenerationEngine from griptape.structures import Agent +from griptape.tasks import BaseTask, VariationImageGenerationTask +from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver +from tests.mocks.mock_structure_config import MockStructureConfig class TestVariationImageGenerationTask: - @pytest.fixture + @pytest.fixture() def text_artifact(self): return TextArtifact(value="some text") - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(value=b"some image data", format="png", width=512, height=512) @@ -56,4 +57,4 @@ def test_missing_summary_engine(self, text_artifact, image_artifact): task = VariationImageGenerationTask((text_artifact, image_artifact)) with pytest.raises(ValueError): - task.image_generation_engine + task.image_generation_engine # noqa: B018 diff --git a/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py b/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py index 2b77ba3dc..bb928c1c3 100644 --- a/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py +++ b/tests/unit/tokenizers/test_amazon_bedrock_tokenizer.py @@ -1,14 +1,15 @@ -from griptape.tokenizers import AmazonBedrockTokenizer import pytest +from griptape.tokenizers import AmazonBedrockTokenizer + class TestAmazonBedrockTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self, request): return AmazonBedrockTokenizer(model=request.param) @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("anthropic.claude-v2:1", 4), ("anthropic.claude-v2", 4), @@ -21,7 +22,7 @@ def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("anthropic.claude-v2", 99996), ("anthropic.claude-v2:1", 199996), @@ -34,7 +35,7 @@ def test_input_tokens_left(self, tokenizer, expected): assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("anthropic.claude-v2", 4092), ("anthropic.claude-v2:1", 4092), diff --git a/tests/unit/tokenizers/test_anthropic_tokenizer.py b/tests/unit/tokenizers/test_anthropic_tokenizer.py index ee165d270..859ba9684 100644 --- a/tests/unit/tokenizers/test_anthropic_tokenizer.py +++ b/tests/unit/tokenizers/test_anthropic_tokenizer.py @@ -1,14 +1,15 @@ import pytest + from griptape.tokenizers import AnthropicTokenizer class TestAnthropicTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self, request): return AnthropicTokenizer(model=request.param) @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [("claude-2.1", 5), ("claude-2.0", 5), ("claude-3-opus", 5), ("claude-3-sonnet", 5), ("claude-3-haiku", 5)], indirect=["tokenizer"], ) @@ -16,7 +17,7 @@ def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("claude-2.0", 99995), ("claude-2.1", 199995), @@ -30,7 +31,7 @@ def test_input_tokens_left(self, tokenizer, expected): assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("claude-2.0", 4091), ("claude-2.1", 4091), diff --git a/tests/unit/tokenizers/test_base_tokenizer.py b/tests/unit/tokenizers/test_base_tokenizer.py index eed15b9b2..08fd42c72 100644 --- a/tests/unit/tokenizers/test_base_tokenizer.py +++ b/tests/unit/tokenizers/test_base_tokenizer.py @@ -1,4 +1,5 @@ import logging + from tests.mocks.mock_tokenizer import MockTokenizer diff --git a/tests/unit/tokenizers/test_cohere_tokenizer.py b/tests/unit/tokenizers/test_cohere_tokenizer.py index 9ca23f4f0..3999ec399 100644 --- a/tests/unit/tokenizers/test_cohere_tokenizer.py +++ b/tests/unit/tokenizers/test_cohere_tokenizer.py @@ -1,5 +1,6 @@ import cohere import pytest + from griptape.tokenizers import CohereTokenizer @@ -10,7 +11,7 @@ def mock_client(self, mocker): return mock_client - @pytest.fixture + @pytest.fixture() def tokenizer(self): return CohereTokenizer(model="command", client=cohere.Client("foobar")) diff --git a/tests/unit/tokenizers/test_dummy_tokenizer.py b/tests/unit/tokenizers/test_dummy_tokenizer.py index 855fb6eee..5d770d1aa 100644 --- a/tests/unit/tokenizers/test_dummy_tokenizer.py +++ b/tests/unit/tokenizers/test_dummy_tokenizer.py @@ -1,10 +1,11 @@ import pytest + from griptape.exceptions import DummyException from griptape.tokenizers import DummyTokenizer class TestDummyTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self): return DummyTokenizer() diff --git a/tests/unit/tokenizers/test_google_tokenizer.py b/tests/unit/tokenizers/test_google_tokenizer.py index 34510cdac..41012f5d6 100644 --- a/tests/unit/tokenizers/test_google_tokenizer.py +++ b/tests/unit/tokenizers/test_google_tokenizer.py @@ -1,5 +1,7 @@ -import pytest from unittest.mock import Mock + +import pytest + from griptape.common import PromptStack from griptape.common.prompt_stack.messages.message import Message from griptape.tokenizers import GoogleTokenizer @@ -13,22 +15,22 @@ def mock_generative_model(self, mocker): return mock_generative_model - @pytest.fixture + @pytest.fixture() def tokenizer(self, request): return GoogleTokenizer(model=request.param, api_key="1234") - @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 5)], indirect=["tokenizer"]) + @pytest.mark.parametrize(("tokenizer", "expected"), [("gemini-pro", 5)], indirect=["tokenizer"]) def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected assert tokenizer.count_tokens(PromptStack(messages=[Message(content="foo", role="user")])) == expected assert tokenizer.count_tokens(["foo", "bar", "huzzah"]) == expected - @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 30715)], indirect=["tokenizer"]) + @pytest.mark.parametrize(("tokenizer", "expected"), [("gemini-pro", 30715)], indirect=["tokenizer"]) def test_input_tokens_left(self, tokenizer, expected): assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected assert tokenizer.count_input_tokens_left(["foo", "bar", "huzzah"]) == expected - @pytest.mark.parametrize("tokenizer,expected", [("gemini-pro", 2043)], indirect=["tokenizer"]) + @pytest.mark.parametrize(("tokenizer", "expected"), [("gemini-pro", 2043)], indirect=["tokenizer"]) def test_output_tokens_left(self, tokenizer, expected): assert tokenizer.count_output_tokens_left("foo bar huzzah") == expected assert tokenizer.count_output_tokens_left(["foo", "bar", "huzzah"]) == expected diff --git a/tests/unit/tokenizers/test_hugging_face_tokenizer.py b/tests/unit/tokenizers/test_hugging_face_tokenizer.py index dcb309a84..e717140e3 100644 --- a/tests/unit/tokenizers/test_hugging_face_tokenizer.py +++ b/tests/unit/tokenizers/test_hugging_face_tokenizer.py @@ -3,11 +3,12 @@ environ["TRANSFORMERS_VERBOSITY"] = "error" import pytest # noqa: E402 + from griptape.tokenizers import HuggingFaceTokenizer # noqa: E402 class TestHuggingFaceTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self): return HuggingFaceTokenizer(model="gpt2", max_output_tokens=1024) diff --git a/tests/unit/tokenizers/test_openai_tokenizer.py b/tests/unit/tokenizers/test_openai_tokenizer.py index 4aa42a87a..697184546 100644 --- a/tests/unit/tokenizers/test_openai_tokenizer.py +++ b/tests/unit/tokenizers/test_openai_tokenizer.py @@ -1,14 +1,15 @@ import pytest + from griptape.tokenizers import OpenAiTokenizer class TestOpenAiTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self, request): return OpenAiTokenizer(model=request.param) @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("gpt-4-1106", 5), ("gpt-4-32k", 5), @@ -34,7 +35,7 @@ def test_initialize_with_unknown_model(self): assert tokenizer.max_input_tokens == OpenAiTokenizer.DEFAULT_MAX_TOKENS - OpenAiTokenizer.TOKEN_OFFSET @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("gpt-4-1106", 19), ("gpt-4-32k", 19), @@ -45,7 +46,6 @@ def test_initialize_with_unknown_model(self): ("gpt-3.5-turbo", 19), ("gpt-35-turbo-16k", 19), ("gpt-35-turbo", 19), - ("gpt-35-turbo", 19), ], indirect=["tokenizer"], ) @@ -57,7 +57,7 @@ def test_token_count_for_messages(self, tokenizer, expected): == expected ) - @pytest.mark.parametrize("tokenizer,expected", [("not-real-model", 19)], indirect=["tokenizer"]) + @pytest.mark.parametrize(("tokenizer", "expected"), [("not-real-model", 19)], indirect=["tokenizer"]) def test_token_count_for_messages_unknown_model(self, tokenizer, expected): with pytest.raises(NotImplementedError): tokenizer.count_tokens( @@ -65,7 +65,7 @@ def test_token_count_for_messages_unknown_model(self, tokenizer, expected): ) @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("gpt-4-1106", 127987), ("gpt-4o", 127987), @@ -86,7 +86,7 @@ def test_input_tokens_left(self, tokenizer, expected): assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [ ("gpt-4-1106", 4091), ("gpt-4-32k", 4091), diff --git a/tests/unit/tokenizers/test_simple_tokenizer.py b/tests/unit/tokenizers/test_simple_tokenizer.py index a34c0d481..d2598067a 100644 --- a/tests/unit/tokenizers/test_simple_tokenizer.py +++ b/tests/unit/tokenizers/test_simple_tokenizer.py @@ -1,9 +1,10 @@ import pytest + from griptape.tokenizers import SimpleTokenizer class TestSimpleTokenizer: - @pytest.fixture + @pytest.fixture() def tokenizer(self): return SimpleTokenizer(max_input_tokens=1024, max_output_tokens=4096, characters_per_token=6) diff --git a/tests/unit/tokenizers/test_voyageai_tokenizer.py b/tests/unit/tokenizers/test_voyageai_tokenizer.py index 46c9490f7..6f631ae4e 100644 --- a/tests/unit/tokenizers/test_voyageai_tokenizer.py +++ b/tests/unit/tokenizers/test_voyageai_tokenizer.py @@ -1,4 +1,5 @@ import pytest + from griptape.tokenizers import VoyageAiTokenizer @@ -10,12 +11,12 @@ def mock_client(self, mocker): return mock_client - @pytest.fixture + @pytest.fixture() def tokenizer(self, request): return VoyageAiTokenizer(model=request.param) @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [("voyage-large-2", 5), ("voyage-code-2", 5), ("voyage-2", 5), ("voyage-lite-02-instruct", 5)], indirect=["tokenizer"], ) @@ -23,7 +24,7 @@ def test_token_count(self, tokenizer, expected): assert tokenizer.count_tokens("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [("voyage-large-2", 15995), ("voyage-code-2", 15995), ("voyage-2", 3995), ("voyage-lite-02-instruct", 3995)], indirect=["tokenizer"], ) @@ -31,7 +32,7 @@ def test_input_tokens_left(self, tokenizer, expected): assert tokenizer.count_input_tokens_left("foo bar huzzah") == expected @pytest.mark.parametrize( - "tokenizer,expected", + ("tokenizer", "expected"), [("voyage-large-2", 0), ("voyage-code-2", 0), ("voyage-2", 0), ("voyage-lite-02-instruct", 0)], indirect=["tokenizer"], ) diff --git a/tests/unit/tools/test_aws_iam.py b/tests/unit/tools/test_aws_iam.py index 2a256425e..54dbaa5fb 100644 --- a/tests/unit/tools/test_aws_iam.py +++ b/tests/unit/tools/test_aws_iam.py @@ -1,12 +1,13 @@ -from pytest import fixture +import boto3 +import pytest + from griptape.tools import AwsIamClient from tests.utils.aws import mock_aws_credentials -import boto3 class TestAwsIamClient: - @fixture(autouse=True) - def run_before_and_after_tests(self): + @pytest.fixture(autouse=True) + def _run_before_and_after_tests(self): mock_aws_credentials() def test_get_user_policy(self): diff --git a/tests/unit/tools/test_aws_s3.py b/tests/unit/tools/test_aws_s3.py index 6fe62b71c..5c6a4c151 100644 --- a/tests/unit/tools/test_aws_s3.py +++ b/tests/unit/tools/test_aws_s3.py @@ -1,12 +1,13 @@ -from pytest import fixture +import boto3 +import pytest + from griptape.tools import AwsS3Client from tests.utils.aws import mock_aws_credentials -import boto3 class TestAwsS3Client: - @fixture(autouse=True) - def run_before_and_after_tests(self): + @pytest.fixture(autouse=True) + def _run_before_and_after_tests(self): mock_aws_credentials() def test_get_bucket_acl(self): diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 75154b509..a4d4097c1 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -1,10 +1,12 @@ import inspect import os + import pytest import yaml -from schema import SchemaMissingKeyError, Schema, Or -from griptape.tasks import ActionsSubtask, ToolkitTask +from schema import Or, Schema, SchemaMissingKeyError + from griptape.common import ToolAction +from griptape.tasks import ActionsSubtask, ToolkitTask from tests.mocks.mock_tool.tool import MockTool from tests.utils import defaults @@ -153,7 +155,7 @@ class TestBaseTool: "$schema": "http://json-schema.org/draft-07/schema#", } - @pytest.fixture + @pytest.fixture() def tool(self): return MockTool(test_field="hello", test_int=5, test_dict={"foo": "bar"}) @@ -195,9 +197,9 @@ def test_validate(self, tool): def test_invalid_config(self): try: - from tests.mocks.invalid_mock_tool.tool import InvalidMockTool # noqa + from tests.mocks.invalid_mock_tool.tool import InvalidMockTool # noqa: F401 - assert False + raise AssertionError() except SchemaMissingKeyError: assert True @@ -252,6 +254,6 @@ def test_to_native_tool_name(self, tool): assert tool.to_native_tool_name(tool.test) == "MockTool_test" + tool.name = "mock_tool" with pytest.raises(ValueError): - tool.name = "mock_tool" tool.to_native_tool_name(tool.foo) diff --git a/tests/unit/tools/test_computer.py b/tests/unit/tools/test_computer.py index b11fd080e..95de18ae3 100644 --- a/tests/unit/tools/test_computer.py +++ b/tests/unit/tools/test_computer.py @@ -1,10 +1,11 @@ import pytest -from tests.mocks.docker.fake_api_client import make_fake_client + from griptape.tools import Computer +from tests.mocks.docker.fake_api_client import make_fake_client class TestComputer: - @pytest.fixture + @pytest.fixture() def computer(self): return Computer(docker_client=make_fake_client(), install_dependencies_on_init=False) diff --git a/tests/unit/tools/test_date_time.py b/tests/unit/tools/test_date_time.py index daa511f04..c534ae69b 100644 --- a/tests/unit/tools/test_date_time.py +++ b/tests/unit/tools/test_date_time.py @@ -1,6 +1,7 @@ -from griptape.tools import DateTime from datetime import datetime +from griptape.tools import DateTime + class TestDateTime: def test_get_current_datetime(self): diff --git a/tests/unit/tools/test_email_client.py b/tests/unit/tools/test_email_client.py index 183d7b265..cf99009b8 100644 --- a/tests/unit/tools/test_email_client.py +++ b/tests/unit/tools/test_email_client.py @@ -1,8 +1,8 @@ -from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact +import pytest + +from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.loaders.email_loader import EmailLoader -from griptape.artifacts import TextArtifact from griptape.tools import EmailClient -import pytest class TestEmailClient: @@ -27,7 +27,7 @@ def mock_smtp_ssl(self, mocker): mock_smtp_ssl.__enter__.return_value = mock_smtp_ssl return mock_smtp_ssl - @pytest.fixture + @pytest.fixture() def client(self): return EmailClient( username="fake-username", @@ -37,12 +37,12 @@ def client(self): mailboxes={"INBOX": "default mailbox for incoming email", "SENT": "default mailbox for sent email"}, ) - @pytest.fixture + @pytest.fixture() def send_params(self): return {"values": {"to": "fake@fake.fake", "subject": "fake-subject", "body": "fake-body"}} @pytest.mark.parametrize( - "values,query", + ("values", "query"), [ ({"label": "fake-label"}, EmailLoader.EmailQuery(label="fake-label")), ({"label": "fake-label", "key": "fake-key"}, EmailLoader.EmailQuery(label="fake-label", key="fake-key")), diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index 06c49f32b..57dd2c83e 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -1,9 +1,11 @@ -import os.path import os +import os.path import tempfile from pathlib import Path + import pytest -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers.file_manager.local_file_manager_driver import LocalFileManagerDriver from griptape.loaders.text_loader import TextLoader @@ -12,14 +14,14 @@ class TestFileManager: - @pytest.fixture + @pytest.fixture() def file_manager(self): return FileManager( input_memory=[defaults.text_task_memory("Memory1")], file_manager_driver=LocalFileManagerDriver(workdir=os.path.abspath(os.path.dirname(__file__))), ) - @pytest.fixture + @pytest.fixture() def temp_dir(self): with tempfile.TemporaryDirectory() as temp_dir: yield temp_dir diff --git a/tests/unit/tools/test_google_docs_client.py b/tests/unit/tools/test_google_docs_client.py index ad74fcaca..a42fddda3 100644 --- a/tests/unit/tools/test_google_docs_client.py +++ b/tests/unit/tools/test_google_docs_client.py @@ -2,7 +2,7 @@ class TestGoogleDocsClient: - @pytest.fixture + @pytest.fixture() def mock_docs_client(self): from griptape.tools import GoogleDocsClient diff --git a/tests/unit/tools/test_google_drive_client.py b/tests/unit/tools/test_google_drive_client.py index 5d2f62df7..55f3c168f 100644 --- a/tests/unit/tools/test_google_drive_client.py +++ b/tests/unit/tools/test_google_drive_client.py @@ -1,5 +1,5 @@ -from griptape.tools import GoogleDriveClient from griptape.artifacts import ErrorArtifact +from griptape.tools import GoogleDriveClient class TestGoogleDriveClient: diff --git a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py index 9feba9cbf..7d75d8670 100644 --- a/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py +++ b/tests/unit/tools/test_griptape_cloud_knowledge_base_client.py @@ -1,10 +1,11 @@ import pytest from requests import exceptions -from griptape.artifacts import TextArtifact, ErrorArtifact + +from griptape.artifacts import ErrorArtifact, TextArtifact class TestGriptapeCloudKnowledgeBaseClient: - @pytest.fixture + @pytest.fixture() def client(self, mocker): from griptape.tools import GriptapeCloudKnowledgeBaseClient @@ -22,7 +23,7 @@ def client(self, mocker): base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) - @pytest.fixture + @pytest.fixture() def client_no_description(self, mocker): from griptape.tools import GriptapeCloudKnowledgeBaseClient @@ -35,7 +36,7 @@ def client_no_description(self, mocker): base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) - @pytest.fixture + @pytest.fixture() def client_kb_not_found(self, mocker): from griptape.tools import GriptapeCloudKnowledgeBaseClient @@ -48,7 +49,7 @@ def client_kb_not_found(self, mocker): base_url="https://api.griptape.ai", api_key="foo bar", knowledge_base_id="1" ) - @pytest.fixture + @pytest.fixture() def client_kb_error(self, mocker): from griptape.tools import GriptapeCloudKnowledgeBaseClient @@ -75,10 +76,10 @@ def test_get_knowledge_base_description(self, client): def test_get_knowledge_base_description_error(self, client_no_description): exception_match_text = f"No description found for Knowledge Base {client_no_description.knowledge_base_id}. Please set a description, or manually set the `GriptapeCloudKnowledgeBaseClient.description` attribute." - with pytest.raises(ValueError, match=exception_match_text) as e: + with pytest.raises(ValueError, match=exception_match_text): client_no_description._get_knowledge_base_description() def test_get_knowledge_base_kb_error(self, client_kb_not_found): exception_match_text = f"Error accessing Knowledge Base {client_kb_not_found.knowledge_base_id}." - with pytest.raises(ValueError, match=exception_match_text) as e: + with pytest.raises(ValueError, match=exception_match_text): client_kb_not_found._get_knowledge_base_description() diff --git a/tests/unit/tools/test_inpainting_image_generation_client.py b/tests/unit/tools/test_inpainting_image_generation_client.py index 9e1d017bb..14ddcb5b6 100644 --- a/tests/unit/tools/test_inpainting_image_generation_client.py +++ b/tests/unit/tools/test_inpainting_image_generation_client.py @@ -10,18 +10,18 @@ class TestInpaintingImageGenerationClient: - @pytest.fixture + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def image_loader(self) -> Mock: loader = Mock() loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader - @pytest.fixture + @pytest.fixture() def image_generator(self, image_generation_engine, image_loader) -> InpaintingImageGenerationClient: return InpaintingImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) @@ -53,7 +53,7 @@ def test_image_inpainting_with_outfile(self, image_generation_engine, image_load engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) - image_generator.engine.run.return_value = Mock( # pyright: ignore + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) diff --git a/tests/unit/tools/test_openweather_client.py b/tests/unit/tools/test_openweather_client.py index 319a7ec2a..89b80e164 100644 --- a/tests/unit/tools/test_openweather_client.py +++ b/tests/unit/tools/test_openweather_client.py @@ -1,16 +1,18 @@ -import pytest from unittest.mock import patch + +import pytest + from griptape.artifacts import ErrorArtifact from griptape.tools import OpenWeatherClient -@pytest.fixture +@pytest.fixture() def client(): return OpenWeatherClient(api_key="YOUR_API_KEY") class MockResponse: - def __init__(self, json_data, status_code): + def __init__(self, json_data, status_code) -> None: self.json_data = json_data self.status_code = status_code diff --git a/tests/unit/tools/test_outpainting_image_variation_client.py b/tests/unit/tools/test_outpainting_image_variation_client.py index 1a84018a4..d604574cb 100644 --- a/tests/unit/tools/test_outpainting_image_variation_client.py +++ b/tests/unit/tools/test_outpainting_image_variation_client.py @@ -10,18 +10,18 @@ class TestOutpaintingImageGenerationClient: - @pytest.fixture + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def image_loader(self) -> Mock: loader = Mock() loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader - @pytest.fixture + @pytest.fixture() def image_generator(self, image_generation_engine, image_loader) -> OutpaintingImageGenerationClient: return OutpaintingImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) @@ -53,7 +53,7 @@ def test_image_outpainting_with_outfile(self, image_generation_engine, image_loa engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) - image_generator.engine.run.return_value = Mock( # pyright: ignore + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) diff --git a/tests/unit/tools/test_prompt_image_generation_client.py b/tests/unit/tools/test_prompt_image_generation_client.py index dffbb4239..7393d1eff 100644 --- a/tests/unit/tools/test_prompt_image_generation_client.py +++ b/tests/unit/tools/test_prompt_image_generation_client.py @@ -9,11 +9,11 @@ class TestPromptImageGenerationClient: - @pytest.fixture + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def image_generator(self, image_generation_engine) -> PromptImageGenerationClient: return PromptImageGenerationClient(engine=image_generation_engine) @@ -36,7 +36,7 @@ def test_generate_image_with_outfile(self, image_generation_engine) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.png" image_generator = PromptImageGenerationClient(engine=image_generation_engine, output_file=outfile) - image_generator.engine.run.return_value = Mock( # pyright: ignore + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) diff --git a/tests/unit/tools/test_rest_api_client.py b/tests/unit/tools/test_rest_api_client.py index b937b9f23..58f21d1f1 100644 --- a/tests/unit/tools/test_rest_api_client.py +++ b/tests/unit/tools/test_rest_api_client.py @@ -1,9 +1,10 @@ import pytest + from griptape.artifacts import BaseArtifact class TestRestApi: - @pytest.fixture + @pytest.fixture() def client(self): from griptape.tools import RestApiClient diff --git a/tests/unit/tools/test_sql_client.py b/tests/unit/tools/test_sql_client.py index 6584fa752..8ab61fc8f 100644 --- a/tests/unit/tools/test_sql_client.py +++ b/tests/unit/tools/test_sql_client.py @@ -1,12 +1,14 @@ +import sqlite3 + import pytest + from griptape.drivers import SqlDriver from griptape.loaders import SqlLoader from griptape.tools import SqlClient -import sqlite3 class TestSqlClient: - @pytest.fixture + @pytest.fixture() def driver(self): new_driver = SqlDriver(engine_url="sqlite:///:memory:") diff --git a/tests/unit/tools/test_structure_run_client.py b/tests/unit/tools/test_structure_run_client.py index b57bfb28f..d498b7c56 100644 --- a/tests/unit/tools/test_structure_run_client.py +++ b/tests/unit/tools/test_structure_run_client.py @@ -1,12 +1,13 @@ import pytest + from griptape.drivers.structure_run.local_structure_run_driver import LocalStructureRunDriver -from griptape.tools import StructureRunClient from griptape.structures import Agent +from griptape.tools import StructureRunClient from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStructureRunClient: - @pytest.fixture + @pytest.fixture() def client(self): driver = MockPromptDriver() agent = Agent(prompt_driver=driver) diff --git a/tests/unit/tools/test_task_memory_client.py b/tests/unit/tools/test_task_memory_client.py index 3956ae415..4276b89ec 100644 --- a/tests/unit/tools/test_task_memory_client.py +++ b/tests/unit/tools/test_task_memory_client.py @@ -1,11 +1,12 @@ import pytest + from griptape.artifacts import TextArtifact from griptape.tools import TaskMemoryClient from tests.utils import defaults class TestTaskMemoryClient: - @pytest.fixture + @pytest.fixture() def tool(self): return TaskMemoryClient(off_prompt=True, input_memory=[defaults.text_task_memory("TestMemory")]) diff --git a/tests/unit/tools/test_text_to_speech_client.py b/tests/unit/tools/test_text_to_speech_client.py index 881b1234d..0b9061aa6 100644 --- a/tests/unit/tools/test_text_to_speech_client.py +++ b/tests/unit/tools/test_text_to_speech_client.py @@ -9,11 +9,11 @@ class TestTextToSpeechClient: - @pytest.fixture + @pytest.fixture() def text_to_speech_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def text_to_speech_client(self, text_to_speech_engine) -> TextToSpeechClient: return TextToSpeechClient(engine=text_to_speech_engine) @@ -32,7 +32,7 @@ def test_text_to_speech_with_outfile(self, text_to_speech_engine) -> None: outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.mp3" text_to_speech_client = TextToSpeechClient(engine=text_to_speech_engine, output_file=outfile) - text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") # pyright: ignore + text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") # pyright: ignore[reportFunctionMemberAccess] audio_artifact = text_to_speech_client.text_to_speech(params={"values": {"text": "say this!"}}) diff --git a/tests/unit/tools/test_transcription_client.py b/tests/unit/tools/test_transcription_client.py index ea6bd3453..7768792d0 100644 --- a/tests/unit/tools/test_transcription_client.py +++ b/tests/unit/tools/test_transcription_client.py @@ -7,11 +7,11 @@ class TestTranscriptionClient: - @pytest.fixture + @pytest.fixture() def transcription_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def audio_loader(self) -> Mock: loader = Mock() loader.load.return_value = AudioArtifact(value=b"audio data", format="wav") @@ -24,7 +24,7 @@ def test_init_transcription_client(self, transcription_engine, audio_loader) -> @patch("builtins.open", mock_open(read_data=b"audio data")) def test_transcribe_audio_from_disk(self, transcription_engine, audio_loader) -> None: client = AudioTranscriptionClient(engine=transcription_engine, audio_loader=audio_loader) - client.engine.run.return_value = Mock(value="transcription") # pyright: ignore + client.engine.run.return_value = Mock(value="transcription") # pyright: ignore[reportFunctionMemberAccess] text_artifact = client.transcribe_audio_from_disk(params={"values": {"path": "audio.wav"}}) @@ -37,7 +37,7 @@ def test_transcribe_audio_from_memory(self, transcription_engine, audio_loader) memory.load_artifacts = Mock(return_value=[AudioArtifact(value=b"audio data", format="wav", name="name")]) client.find_input_memory = Mock(return_value=memory) - client.engine.run.return_value = Mock(value="transcription") # pyright: ignore + client.engine.run.return_value = Mock(value="transcription") # pyright: ignore[reportFunctionMemberAccess] text_artifact = client.transcribe_audio_from_memory( params={"values": {"memory_name": "memory", "artifact_namespace": "namespace", "artifact_name": "name"}} diff --git a/tests/unit/tools/test_variation_image_generation_client.py b/tests/unit/tools/test_variation_image_generation_client.py index b29f4fecf..ba707e5bb 100644 --- a/tests/unit/tools/test_variation_image_generation_client.py +++ b/tests/unit/tools/test_variation_image_generation_client.py @@ -10,18 +10,18 @@ class TestVariationImageGenerationClient: - @pytest.fixture + @pytest.fixture() def image_generation_engine(self) -> Mock: return Mock() - @pytest.fixture + @pytest.fixture() def image_loader(self) -> Mock: loader = Mock() loader.load.return_value = ImageArtifact(value=b"image_data", format="png", width=512, height=512) return loader - @pytest.fixture + @pytest.fixture() def image_generator(self, image_generation_engine, image_loader) -> VariationImageGenerationClient: return VariationImageGenerationClient(engine=image_generation_engine, image_loader=image_loader) @@ -54,7 +54,7 @@ def test_image_variation_with_outfile(self, image_generation_engine, image_loade engine=image_generation_engine, output_file=outfile, image_loader=image_loader ) - image_generator.engine.run.return_value = Mock( # pyright: ignore + image_generator.engine.run.return_value = Mock( # pyright: ignore[reportFunctionMemberAccess] value=b"image data", format="png", width=512, height=512, model="test model", prompt="test prompt" ) diff --git a/tests/unit/tools/test_vector_store_client.py b/tests/unit/tools/test_vector_store_client.py index 45018b847..b02dda226 100644 --- a/tests/unit/tools/test_vector_store_client.py +++ b/tests/unit/tools/test_vector_store_client.py @@ -1,5 +1,6 @@ import pytest -from griptape.artifacts import TextArtifact, ListArtifact + +from griptape.artifacts import ListArtifact, TextArtifact from griptape.drivers import LocalVectorStoreDriver from griptape.tools import VectorStoreClient from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -7,7 +8,7 @@ class TestVectorStoreClient: @pytest.fixture(autouse=True) - def mock_try_run(self, mocker): + def _mock_try_run(self, mocker): mocker.patch("griptape.drivers.OpenAiEmbeddingDriver.try_embed_chunk", return_value=[0, 1]) def test_search(self): @@ -16,7 +17,7 @@ def test_search(self): driver.upsert_text_artifacts({"test": [TextArtifact("foo"), TextArtifact("bar")]}) - assert set([a.value for a in tool.search({"values": {"query": "test"}})]) == {"foo", "bar"} + assert {a.value for a in tool.search({"values": {"query": "test"}})} == {"foo", "bar"} def test_search_with_namespace(self): driver = LocalVectorStoreDriver(embedding_driver=MockEmbeddingDriver()) diff --git a/tests/unit/tools/test_web_scraper.py b/tests/unit/tools/test_web_scraper.py index f46004e8f..30362ce65 100644 --- a/tests/unit/tools/test_web_scraper.py +++ b/tests/unit/tools/test_web_scraper.py @@ -1,9 +1,10 @@ import pytest + from griptape.artifacts import ListArtifact class TestWebScraper: - @pytest.fixture + @pytest.fixture() def scraper(self): from griptape.tools import WebScraper diff --git a/tests/unit/tools/test_web_search.py b/tests/unit/tools/test_web_search.py index 0abc880c8..dd447de5d 100644 --- a/tests/unit/tools/test_web_search.py +++ b/tests/unit/tools/test_web_search.py @@ -1,10 +1,11 @@ import pytest + from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact from griptape.tools import WebSearch class TestWebSearch: - @pytest.fixture + @pytest.fixture() def websearch_tool(self, mocker): mock_response = TextArtifact("test_response") driver = mocker.Mock() @@ -12,7 +13,7 @@ def websearch_tool(self, mocker): return WebSearch(web_search_driver=driver) - @pytest.fixture + @pytest.fixture() def websearch_tool_with_error(self, mocker): mock_response = Exception("test_error") driver = mocker.Mock() diff --git a/tests/unit/utils/test_base_tokenizer.py b/tests/unit/utils/test_base_tokenizer.py index eed15b9b2..08fd42c72 100644 --- a/tests/unit/utils/test_base_tokenizer.py +++ b/tests/unit/utils/test_base_tokenizer.py @@ -1,4 +1,5 @@ import logging + from tests.mocks.mock_tokenizer import MockTokenizer diff --git a/tests/unit/utils/test_command_runner.py b/tests/unit/utils/test_command_runner.py index 4ca3afebc..25b7fd8c3 100644 --- a/tests/unit/utils/test_command_runner.py +++ b/tests/unit/utils/test_command_runner.py @@ -1,4 +1,3 @@ -from griptape.artifacts import TextArtifact from griptape.utils import CommandRunner diff --git a/tests/unit/utils/test_conversation.py b/tests/unit/utils/test_conversation.py index cce067f73..28ee72409 100644 --- a/tests/unit/utils/test_conversation.py +++ b/tests/unit/utils/test_conversation.py @@ -1,8 +1,8 @@ -from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.memory.structure import ConversationMemory, SummaryConversationMemory -from griptape.tasks import PromptTask from griptape.structures import Pipeline +from griptape.tasks import PromptTask from griptape.utils import Conversation +from tests.mocks.mock_prompt_driver import MockPromptDriver class TestConversation: diff --git a/tests/unit/utils/test_deprecate.py b/tests/unit/utils/test_deprecate.py index 0c8064f8d..868dbd60f 100644 --- a/tests/unit/utils/test_deprecate.py +++ b/tests/unit/utils/test_deprecate.py @@ -1,4 +1,5 @@ import pytest + from griptape.utils.deprecation import deprecation_warn diff --git a/tests/unit/utils/test_dict_utils.py b/tests/unit/utils/test_dict_utils.py index 4b4e4ca08..94e870e1a 100644 --- a/tests/unit/utils/test_dict_utils.py +++ b/tests/unit/utils/test_dict_utils.py @@ -1,6 +1,7 @@ -from griptape.utils import remove_null_values_in_dict_recursively, dict_merge, remove_key_in_dict_recursively import pytest +from griptape.utils import dict_merge, remove_key_in_dict_recursively, remove_null_values_in_dict_recursively + class TestDictUtils: def test_remove_null_values_in_dict_recursively(self): diff --git a/tests/unit/utils/test_file_utils.py b/tests/unit/utils/test_file_utils.py index dbcf1044b..de1882ef5 100644 --- a/tests/unit/utils/test_file_utils.py +++ b/tests/unit/utils/test_file_utils.py @@ -1,7 +1,8 @@ import os -from griptape.loaders import TextLoader -from griptape import utils from concurrent import futures + +from griptape import utils +from griptape.loaders import TextLoader from tests.mocks.mock_embedding_driver import MockEmbeddingDriver MAX_TOKENS = 50 diff --git a/tests/unit/utils/test_futures.py b/tests/unit/utils/test_futures.py index 5e30148a9..04ddb9877 100644 --- a/tests/unit/utils/test_futures.py +++ b/tests/unit/utils/test_futures.py @@ -1,4 +1,5 @@ from concurrent import futures + from griptape import utils diff --git a/tests/unit/utils/test_import_utils.py b/tests/unit/utils/test_import_utils.py index bcfb06c87..f6b2429d9 100644 --- a/tests/unit/utils/test_import_utils.py +++ b/tests/unit/utils/test_import_utils.py @@ -1,4 +1,5 @@ import pytest + from griptape.utils import import_optional_dependency, is_dependency_installed diff --git a/tests/unit/utils/test_load_artifact_from_memory.py b/tests/unit/utils/test_load_artifact_from_memory.py index db4f7d573..946ddd6e7 100644 --- a/tests/unit/utils/test_load_artifact_from_memory.py +++ b/tests/unit/utils/test_load_artifact_from_memory.py @@ -2,43 +2,39 @@ import pytest -from griptape.artifacts import TextArtifact, ErrorArtifact, ImageArtifact +from griptape.artifacts import ImageArtifact, TextArtifact from griptape.utils import load_artifact_from_memory class TestLoadImageArtifactFromMemory: - @pytest.fixture + @pytest.fixture() def memory(self): return Mock() - @pytest.fixture + @pytest.fixture() def text_artifact(self): return TextArtifact(value="text", name="text") - @pytest.fixture + @pytest.fixture() def image_artifact(self): return ImageArtifact(value=b"image", name="image", format="png", height=32, width=32) def test_no_memory(self): with pytest.raises(ValueError): - load_artifact_from_memory(None, "", "", TextArtifact) # pyright: ignore + load_artifact_from_memory(None, "", "", TextArtifact) # pyright: ignore[reportArgumentType] def test_no_artifacts_in_memory(self, memory): memory.load_artifacts.return_value = [] - with pytest.raises(ValueError) as e: + with pytest.raises(ValueError, match="no artifacts found in namespace"): load_artifact_from_memory(memory, "", "", TextArtifact) - assert str(e) == "no artifacts found in namespace" - def test_no_artifacts_by_name(self, memory, text_artifact): memory.load_artifacts.return_value = [text_artifact] - with pytest.raises(ValueError) as e: + with pytest.raises(ValueError, match="artifact other_name not found in namespace namespace"): load_artifact_from_memory(memory, "namespace", "other_name", TextArtifact) - assert str(e) == "artifact name not found in namespace" - def test_returns_one_artifact(self, memory, text_artifact): memory.load_artifacts.return_value = [text_artifact] @@ -56,7 +52,5 @@ def test_returns_multiple_artifacts(self, memory, text_artifact, image_artifact) def test_wrong_artifact_type(self, memory, image_artifact): memory.load_artifacts.return_value = [image_artifact] - with pytest.raises(ValueError) as e: + with pytest.raises(ValueError, match="image is not of type"): load_artifact_from_memory(memory, "namespace", image_artifact.name, TextArtifact) - - assert str(e) == "artifact is not of type ImageArtifact" diff --git a/tests/unit/utils/test_message_stack.py b/tests/unit/utils/test_message_stack.py index 908388a33..799705a54 100644 --- a/tests/unit/utils/test_message_stack.py +++ b/tests/unit/utils/test_message_stack.py @@ -5,7 +5,7 @@ class TestPromptStack: - @pytest.fixture + @pytest.fixture() def prompt_stack(self): return PromptStack() diff --git a/tests/unit/utils/test_stream.py b/tests/unit/utils/test_stream.py index 33c97cc75..767d31ba0 100644 --- a/tests/unit/utils/test_stream.py +++ b/tests/unit/utils/test_stream.py @@ -1,5 +1,7 @@ -from typing import Iterator +from collections.abc import Iterator + import pytest + from griptape.structures import Agent from griptape.utils import Stream from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -20,9 +22,9 @@ def test_init(self, agent): chat_stream_artifact = next(chat_stream_run) assert chat_stream_artifact.value == "mock output" + next(chat_stream_run) with pytest.raises(StopIteration): next(chat_stream_run) - next(chat_stream_run) else: with pytest.raises(ValueError): Stream(agent) diff --git a/tests/unit/utils/test_structure_visualizer.py b/tests/unit/utils/test_structure_visualizer.py index e16275a5c..f6e621b91 100644 --- a/tests/unit/utils/test_structure_visualizer.py +++ b/tests/unit/utils/test_structure_visualizer.py @@ -1,7 +1,7 @@ -from tests.mocks.mock_prompt_driver import MockPromptDriver -from griptape.utils import StructureVisualizer +from griptape.structures import Agent, Pipeline, Workflow from griptape.tasks import PromptTask -from griptape.structures import Agent, Workflow, Pipeline +from griptape.utils import StructureVisualizer +from tests.mocks.mock_prompt_driver import MockPromptDriver class TestStructureVisualizer: diff --git a/tests/utils/code_blocks.py b/tests/utils/code_blocks.py index 9cfebb987..ca5b193d1 100644 --- a/tests/utils/code_blocks.py +++ b/tests/utils/code_blocks.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import pathlib import textwrap @@ -6,7 +8,7 @@ def check_py_string(source: str) -> None: - """Exec the python source given in a new module namespace + """Exec the python source given in a new module namespace. Does not return anything, but exceptions raised by the source will propagate out unmodified diff --git a/tests/utils/defaults.py b/tests/utils/defaults.py index 5a9f6f958..bad7f0d79 100644 --- a/tests/utils/defaults.py +++ b/tests/utils/defaults.py @@ -1,11 +1,11 @@ -from griptape.artifacts import TextArtifact, BlobArtifact +from griptape.artifacts import BlobArtifact, TextArtifact from griptape.drivers import LocalVectorStoreDriver -from griptape.engines import PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine +from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import VectorStoreRetrievalRagModule, PromptResponseRagModule -from griptape.engines.rag.stages import RetrievalRagStage, ResponseRagStage +from griptape.engines.rag.modules import PromptResponseRagModule, VectorStoreRetrievalRagModule +from griptape.engines.rag.stages import ResponseRagStage, RetrievalRagStage from griptape.memory import TaskMemory -from griptape.memory.task.storage import TextArtifactStorage, BlobArtifactStorage +from griptape.memory.task.storage import BlobArtifactStorage, TextArtifactStorage from tests.mocks.mock_embedding_driver import MockEmbeddingDriver from tests.mocks.mock_prompt_driver import MockPromptDriver diff --git a/tests/utils/postgres.py b/tests/utils/postgres.py index 1e04153bd..a320d9a05 100644 --- a/tests/utils/postgres.py +++ b/tests/utils/postgres.py @@ -1,4 +1,4 @@ -from psycopg2 import connect, OperationalError +from psycopg2 import OperationalError, connect def can_connect_to_postgres(user="postgres", password="postgres", host="localhost", port="5432", database="postgres"): diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index 8d62bc835..5b908065b 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -1,25 +1,26 @@ from __future__ import annotations -import os -from attrs import field, define -from schema import Schema, Literal -import logging + import json -from griptape.artifacts.error_artifact import ErrorArtifact +import logging +import os -from griptape.structures import Agent -from griptape.rules import Rule, Ruleset -from griptape.tasks import PromptTask -from griptape.structures import Structure +from attrs import define, field +from schema import Literal, Schema + +from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import ( - BasePromptDriver, AmazonBedrockPromptDriver, + AmazonSageMakerJumpstartPromptDriver, AnthropicPromptDriver, - CoherePromptDriver, - OpenAiChatPromptDriver, AzureOpenAiChatPromptDriver, - AmazonSageMakerJumpstartPromptDriver, + BasePromptDriver, + CoherePromptDriver, GooglePromptDriver, + OpenAiChatPromptDriver, ) +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent, Structure +from griptape.tasks import PromptTask def get_enabled_prompt_drivers(prompt_drivers_options) -> list[BasePromptDriver]: @@ -295,7 +296,7 @@ def verify_structure_output(self, structure) -> dict: return result - def run(self, prompt, assert_correctness: bool = True) -> dict: + def run(self, prompt, *, assert_correctness: bool = True) -> dict: result = self.structure.run(prompt) if isinstance(result.output_task.output, ErrorArtifact): verified_result = {"correct": False, "explanation": f"ErrorArtifact: {result.output_task.output.to_text()}"} From f51447581d122ad58506e8928f45d1fbd59e1dad Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Jul 2024 12:05:40 -0700 Subject: [PATCH 167/238] Fix docs header (#979) --- docs/griptape-framework/drivers/web-search-drivers.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/griptape-framework/drivers/web-search-drivers.md b/docs/griptape-framework/drivers/web-search-drivers.md index 18ba1e21c..b06c8d0a5 100644 --- a/docs/griptape-framework/drivers/web-search-drivers.md +++ b/docs/griptape-framework/drivers/web-search-drivers.md @@ -4,7 +4,9 @@ Web Search Drivers can be used to search for links from a search query. They are * `search()` searches the web and returns a [ListArtifact](../../reference/griptape/artifacts/list_artifact.md) that contains JSON-serializable [TextArtifact](../../reference/griptape/artifacts/text_artifact.md)s with the search results. -## Google +## Vector Store Drivers + +### Google The [GoogleWebSearchDriver](../../reference/griptape/drivers/web_search/google_web_search_driver.md) uses the [Google Custom Search JSON API](https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list) for web searching. @@ -44,7 +46,7 @@ agent = Agent( agent.run("Give me some websites with information about AI frameworks.") ``` -## DuckDuckGo +### DuckDuckGo !!! info This driver requires the `drivers-web-search-duckduckgo` [extra](../index.md#extras). From 71a499d72b98a4260c4bdc654afb127ce8f0c4b2 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Jul 2024 15:04:47 -0700 Subject: [PATCH 168/238] Remove unnecessary dependencies in extras (#989) --- CHANGELOG.md | 2 + poetry.lock | 155 +++++++++++++++++++++++++++++++++++-------------- pyproject.toml | 8 +-- 3 files changed, 115 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 151a2199a..6483152d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `BaseVectorStoreDriver.query` optional arguments are now keyword-only arguments. - **BREAKING**: `EventListener.publish_event`'s `flush` argument is now a keyword-only argument. - **BREAKING**: `BaseEventListenerDriver.publish_event`'s `flush` argument is now a keyword-only argument. +- Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. +- Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. ### Fixed - Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. diff --git a/poetry.lock b/poetry.lock index 8e11c84e5..d654c99f5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,36 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "accelerate" +version = "0.32.1" +description = "Accelerate" +optional = true +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.32.1-py3-none-any.whl", hash = "sha256:71fcf4be00872194071de561634268b71417d7f5b16b178e2fa76b6f117c52b0"}, + {file = "accelerate-0.32.1.tar.gz", hash = "sha256:3999acff0237cd0d4f9fd98b42d5a3163544777b53fc4f1eec886b77e992d177"}, +] + +[package.dependencies] +huggingface-hub = "*" +numpy = ">=1.17,<2.0.0" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = ">=0.3.1" +torch = ">=1.10.0" + +[package.extras] +deepspeed = ["deepspeed (<=0.14.0)"] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "diffusers", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.2.1,<0.3.0)", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.2.1,<0.3.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "diffusers", "evaluate", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] + [[package]] name = "aiohttp" version = "3.9.5" @@ -3460,13 +3491,13 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.4.127" +version = "12.5.82" description = "Nvidia JIT LTO Library" optional = true python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, - {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, ] [[package]] @@ -3936,6 +3967,35 @@ files = [ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = true +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + [[package]] name = "psycopg2-binary" version = "2.9.9" @@ -5536,29 +5596,32 @@ files = [ [[package]] name = "sympy" -version = "1.12" +version = "1.13.0" description = "Computer algebra system (CAS) in Python" optional = true python-versions = ">=3.8" files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, + {file = "sympy-1.13.0-py3-none-any.whl", hash = "sha256:6b0b32a4673fb91bd3cac3b55406c8e01d53ae22780be467301cc452f6680c92"}, + {file = "sympy-1.13.0.tar.gz", hash = "sha256:3b6af8f4d008b9a1a6a4268b335b984b23835f26d1d60b0526ebc71d48a25f57"}, ] [package.dependencies] -mpmath = ">=0.19" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tbb" -version = "2021.12.0" +version = "2021.13.0" description = "Intel® oneAPI Threading Building Blocks (oneTBB)" optional = true python-versions = "*" files = [ - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, - {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, - {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, - {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, + {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, + {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, + {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, ] [[package]] @@ -5790,31 +5853,31 @@ files = [ [[package]] name = "torch" -version = "2.3.0" +version = "2.3.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, - {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, - {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, - {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, - {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, - {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, - {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, - {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, - {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, - {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, - {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, - {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, - {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, - {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, - {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, - {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, - {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, - {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, - {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, - {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, + {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, + {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, + {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, + {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, + {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, + {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, + {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, + {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, + {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, + {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, + {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, + {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, + {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, + {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, + {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, + {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, + {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, + {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, + {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, + {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, ] [package.dependencies] @@ -5835,7 +5898,7 @@ nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \" nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} typing-extensions = ">=4.8.0" [package.extras] @@ -5913,6 +5976,7 @@ files = [ ] [package.dependencies] +accelerate = {version = ">=0.21.0", optional = true, markers = "extra == \"torch\""} filelock = "*" huggingface-hub = ">=0.19.3,<1.0" numpy = ">=1.17" @@ -5922,6 +5986,7 @@ regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" tokenizers = ">=0.14,<0.19" +torch = {version = "*", optional = true, markers = "extra == \"torch\""} tqdm = ">=4.27" [package.extras] @@ -5971,17 +6036,17 @@ vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "triton" -version = "2.3.0" +version = "2.3.1" description = "A language and compiler for custom Deep Learning operations" optional = true python-versions = "*" files = [ - {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, - {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, - {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, - {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, - {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, - {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, + {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, + {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, + {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, + {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, + {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, + {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, ] [package.dependencies] @@ -6464,7 +6529,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6482,8 +6547,8 @@ drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-anthropic = ["anthropic"] drivers-prompt-cohere = ["cohere"] drivers-prompt-google = ["google-generativeai"] -drivers-prompt-huggingface = ["huggingface-hub", "transformers"] -drivers-prompt-huggingface-pipeline = ["huggingface-hub", "torch", "transformers"] +drivers-prompt-huggingface = ["huggingface-hub"] +drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-ollama = ["ollama"] drivers-rerank-cohere = ["cohere"] drivers-sql-postgres = ["pgvector", "psycopg2-binary"] @@ -6509,4 +6574,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "09d5503da93cfcba7fdb3cc462395d5a2754bace3cee33feef9002b5904d5493" +content-hash = "a49e3177bd216b5af2ffe2f213d1e2d8081f23ef33e4c71ecc16c673287823fa" diff --git a/pyproject.toml b/pyproject.toml index 807a2560e..fabce497e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ requests = "^2.32.0" # drivers cohere = { version = "^5.5.4", optional = true } anthropic = { version = "^0.29.0", optional = true } -transformers = { version = "^4.39.3", optional = true } +transformers = { version = "^4.39.3", optional = true, extras=["torch"] } huggingface-hub = { version = ">=0.13", optional = true } boto3 = { version = "^1.34.119", optional = true } sqlalchemy-redshift = { version = "*", optional = true } @@ -51,7 +51,6 @@ beautifulsoup4 = {version = "^4.12.3", optional = true} markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} -torch = {version = "^2.3.0", optional = true} qdrant-client = { version = ">=1.9.1", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} @@ -67,8 +66,8 @@ filetype = {version = "^1.2", optional = true} [tool.poetry.extras] drivers-prompt-cohere = ["cohere"] drivers-prompt-anthropic = ["anthropic"] -drivers-prompt-huggingface = ["huggingface-hub", "transformers"] -drivers-prompt-huggingface-pipeline = ["huggingface-hub", "transformers", "torch"] +drivers-prompt-huggingface = ["huggingface-hub"] +drivers-prompt-huggingface-pipeline = ["transformers"] drivers-prompt-amazon-bedrock = ["boto3", "anthropic"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-google = ["google-generativeai"] @@ -140,7 +139,6 @@ all = [ "markdownify", "voyageai", "elevenlabs", - "torch", "pusher", "ollama", "duckduckgo-search", From 7c13601c1cd1c547f2a0f5b1e24c837998194f2f Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:31:36 -0700 Subject: [PATCH 169/238] Add default for GriptapeCloudEventListenerDriver.api_key (#990) --- .github/workflows/docs-integration-tests.yml | 1 + CHANGELOG.md | 1 + .../drivers/event-listener-drivers.md | 12 ++++++------ .../griptape_cloud_event_listener_driver.py | 2 +- griptape/tools/calculator/tool.py | 2 +- ...est_griptape_cloud_event_listener_driver.py | 18 ++++++++++++++++-- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 241c4a2ef..ce30f83bb 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -72,6 +72,7 @@ jobs: GOOGLE_AUTH_URI: ${{ secrets.INTEG_GOOGLE_AUTH_URI }} GOOGLE_TOKEN_URI: ${{ secrets.INTEG_GOOGLE_TOKEN_URI }} GOOGLE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.INTEG_GOOGLE_AUTH_PROVIDER_X509_CERT_URL }} + GT_CLOUD_API_KEY: ${{ secrets.INTEG_GRIPTAPE_CLOUD_API_KEY }} GRIPTAPE_CLOUD_API_KEY: ${{ secrets.INTEG_GRIPTAPE_CLOUD_API_KEY }} GRIPTAPE_CLOUD_STRUCTURE_ID: ${{ secrets.INTEG_GRIPTAPE_CLOUD_STRUCTURE_ID }} GRIPTAPE_CLOUD_BASE_URL: ${{ secrets.INTEG_GRIPTAPE_CLOUD_BASE_URL }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6483152d6..d146d815a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Native function calling support to `OpenAiChatPromptDriver`, `AzureOpenAiChatPromptDriver`, `AnthropicPromptDriver`, `AmazonBedrockPromptDriver`, `GooglePromptDriver`, and `CoherePromptDriver`. - `OllamaEmbeddingDriver` for generating embeddings with Ollama. - `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. +- `GriptapeCloudEventListenerDriver.api_key` defaults to the value in the `GT_CLOUD_API_KEY` environment variable. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index 4a85bc9a4..5e73f1a09 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -50,9 +50,9 @@ from griptape.drivers import GriptapeCloudEventListenerDriver from griptape.events import FinishStructureRunEvent from griptape.artifacts import TextArtifact -event_driver = GriptapeCloudEventListenerDriver( - api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"] -) +# By default, GriptapeCloudEventListenerDriver uses the api key provided +# in the GT_CLOUD_API_KEY environment variable. +event_driver = GriptapeCloudEventListenerDriver() done_event = FinishStructureRunEvent( output_task_input=TextArtifact("Just started!"), @@ -173,9 +173,9 @@ agent = Agent( event_listeners=[ EventListener( event_types=[FinishStructureRunEvent], - driver=GriptapeCloudEventListenerDriver( - api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], - ), + # By default, GriptapeCloudEventListenerDriver uses the api key provided + # in the GT_CLOUD_API_KEY environment variable. + driver=GriptapeCloudEventListenerDriver(), ), ], ) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 2e208d786..cf9dd7bd2 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -24,7 +24,7 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True, ) - api_key: str = field(kw_only=True) + api_key: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) headers: dict = field( default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True, diff --git a/griptape/tools/calculator/tool.py b/griptape/tools/calculator/tool.py index 141d1a333..e8fcb1ed4 100644 --- a/griptape/tools/calculator/tool.py +++ b/griptape/tools/calculator/tool.py @@ -21,7 +21,7 @@ class Calculator(BaseTool): }, ) def calculate(self, params: dict) -> BaseArtifact: - import numexpr + import numexpr # pyright: ignore[reportMissingImports] try: expression = params["values"]["expression"] diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index b651841ca..5db78b76f 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -19,9 +19,23 @@ def mock_post(self, mocker): @pytest.fixture() def driver(self): - os.environ["GT_CLOUD_BASE_URL"] = "https://cloud123.griptape.ai" + environ = { + "GT_CLOUD_BASE_URL": "https://cloud123.griptape.ai", + "GT_CLOUD_API_KEY": "foo bar", + "GT_CLOUD_STRUCTURE_RUN_ID": "bar baz", + } + original_environ = {} + for key, value in environ.items(): + original_environ[key] = os.environ.get(key) + os.environ[key] = value - return GriptapeCloudEventListenerDriver(api_key="foo bar", structure_run_id="bar baz") + yield GriptapeCloudEventListenerDriver() + + for key, value in original_environ.items(): + if value is None: + del os.environ[key] + else: + os.environ[key] = value def test_init(self, driver): assert driver From 8026409cee885bcf0a038605679ad2077270d0db Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 17 Jul 2024 10:50:26 -0700 Subject: [PATCH 170/238] Fix Windows-specific issues (#992) --- .github/actions/init-environment/action.yml | 2 +- .github/workflows/unit-tests.yml | 22 ++++++++++++++- CHANGELOG.md | 1 + .../amazon_s3_file_manager_driver.py | 27 +++++++++++++++---- tests/unit/artifacts/test_blob_artifact.py | 5 +++- .../test_amazon_s3_file_manager_driver.py | 12 ++++----- .../test_local_file_manager_driver.py | 21 +++++++-------- tests/unit/utils/test_command_runner.py | 2 +- tests/unit/utils/test_file_utils.py | 2 -- 9 files changed, 65 insertions(+), 29 deletions(-) diff --git a/.github/actions/init-environment/action.yml b/.github/actions/init-environment/action.yml index 686f57e34..0d9ad94fc 100644 --- a/.github/actions/init-environment/action.yml +++ b/.github/actions/init-environment/action.yml @@ -32,7 +32,7 @@ runs: - name: Activate venv run: | - source .venv/bin/activate + source $VENV echo PATH=$PATH >> $GITHUB_ENV shell: bash diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index d24a0d541..946af9a51 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -11,7 +11,7 @@ concurrency: cancel-in-progress: true jobs: - test: + test-ubuntu: runs-on: ubuntu-latest strategy: fail-fast: false @@ -24,3 +24,23 @@ jobs: uses: ./.github/actions/init-environment - name: Run unit tests run: make test/unit + test-windows: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.9"] + defaults: + run: + shell: bash + steps: + - name: Checkout actions + uses: actions/checkout@v3 + - name: Init environment + uses: ./.github/actions/init-environment + - name: Run unit tests + # TODO: make test/unit fails with the following error: + # process_begin: CreateProcess(NULL, poetry run pytest -n auto tests/unit, ...) failed. + # make (e=2): The system cannot find the file specified. + # make: *** [Makefile:24: test/unit] Error 2 + run: poetry run pytest -n auto tests/unit diff --git a/CHANGELOG.md b/CHANGELOG.md index d146d815a..67d7fd92f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Parameter `count` for `QdrantVectorStoreDriver.query` now optional as per documentation. +- Path issues on Windows with `LocalFileManagerDriver` and `AmazonS3FileManagerDriver`. ## [0.28.2] - 2024-07-12 ### Fixed diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index 4623f8231..01eb1e21f 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -1,7 +1,5 @@ from __future__ import annotations -import os -from pathlib import Path from typing import TYPE_CHECKING, Any from attrs import Attribute, Factory, define, field @@ -33,7 +31,7 @@ class AmazonS3FileManagerDriver(BaseFileManagerDriver): @workdir.validator # pyright: ignore[reportAttributeAccessIssue] def validate_workdir(self, _: Attribute, workdir: str) -> None: - if not Path(workdir).is_absolute(): + if not workdir.startswith("/"): raise ValueError("Workdir must be an absolute path") def try_list_files(self, path: str) -> list[str]: @@ -70,11 +68,13 @@ def try_save_file(self, path: str, value: bytes) -> None: def _to_full_key(self, path: str) -> str: path = path.lstrip("/") - full_key = os.path.join(self.workdir, path) + full_key = f"{self.workdir}/{path}" # Need to keep the trailing slash if it was there, # because it means the path is a directory. ended_with_slash = path.endswith("/") - full_key = os.path.normpath(full_key) + + full_key = self._normpath(full_key) + if ended_with_slash: full_key += "/" return full_key.lstrip("/") @@ -126,3 +126,20 @@ def _is_a_directory(self, full_key: str) -> bool: raise e return False + + def _normpath(self, path: str) -> str: + unix_path = path.replace("\\", "/") + parts = unix_path.split("/") + stack = [] + + for part in parts: + if part == "" or part == ".": + continue + if part == "..": + if stack: + stack.pop() + else: + stack.append(part) + + normalized_path = "/".join(stack) + return normalized_path diff --git a/tests/unit/artifacts/test_blob_artifact.py b/tests/unit/artifacts/test_blob_artifact.py index a50a673f4..3d88d5793 100644 --- a/tests/unit/artifacts/test_blob_artifact.py +++ b/tests/unit/artifacts/test_blob_artifact.py @@ -1,4 +1,5 @@ import base64 +import os import pytest @@ -32,7 +33,9 @@ def test_to_dict(self): assert BlobArtifact(b"foobar", name="foobar.txt", dir_name="foo").to_dict()["name"] == "foobar.txt" def test_full_path_with_path(self): - assert BlobArtifact(b"foobar", name="foobar.txt", dir_name="foo").full_path == "foo/foobar.txt" + assert BlobArtifact(b"foobar", name="foobar.txt", dir_name="foo").full_path == os.path.normpath( + "foo/foobar.txt" + ) def test_full_path_without_path(self): assert BlobArtifact(b"foobar", name="foobar.txt").full_path == "foobar.txt" diff --git a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py index cad76a7d6..3af9eb4cc 100644 --- a/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_amazon_s3_file_manager_driver.py @@ -223,7 +223,7 @@ def test_save_file(self, workdir, path, content, driver, get_s3_value): assert isinstance(result, InfoArtifact) assert result.value == "Successfully saved file" - expected_s3_key = os.path.join(workdir, path).lstrip("/") + expected_s3_key = f"{workdir}/{path}".lstrip("/") content_str = content if isinstance(content, str) else content.decode() assert get_s3_value(expected_s3_key) == content_str @@ -258,11 +258,11 @@ def test_save_file_with_encoding(self, session, bucket, get_s3_value): driver = AmazonS3FileManagerDriver( session=session, bucket=bucket, default_loader=TextLoader(encoding="utf-8"), loaders={}, workdir=workdir ) - path = os.path.join("test", "foobar.txt") + path = "test/foobar.txt" result = driver.save_file(path, "foobar") - expected_s3_key = os.path.join(workdir, path).lstrip("/") + expected_s3_key = f"{workdir}/{path}".lstrip("/") assert get_s3_value(expected_s3_key) == "foobar" assert result.value == "Successfully saved file" @@ -271,18 +271,18 @@ def test_save_and_load_file_with_encoding(self, session, bucket, get_s3_value): driver = AmazonS3FileManagerDriver( session=session, bucket=bucket, loaders={"txt": TextLoader(encoding="ascii")}, workdir=workdir ) - path = os.path.join("test", "foobar.txt") + path = "test/foobar.txt" result = driver.save_file(path, "foobar") - expected_s3_key = os.path.join(workdir, path).lstrip("/") + expected_s3_key = f"{workdir}/{path}".lstrip("/") assert get_s3_value(expected_s3_key) == "foobar" assert result.value == "Successfully saved file" driver = AmazonS3FileManagerDriver( session=session, bucket=bucket, default_loader=TextLoader(encoding="ascii"), loaders={}, workdir=workdir ) - path = os.path.join("test", "foobar.txt") + path = "test/foobar.txt" result = driver.load_file(path) diff --git a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py index ec9963b49..23f9ef535 100644 --- a/tests/unit/drivers/file_manager/test_local_file_manager_driver.py +++ b/tests/unit/drivers/file_manager/test_local_file_manager_driver.py @@ -98,7 +98,7 @@ def test_validate_workdir(self): ) def test_list_files(self, workdir, path, expected, temp_dir, driver): # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. - driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + driver.workdir = self._to_driver_workdir(temp_dir, workdir) artifact = driver.list_files(path) @@ -121,7 +121,7 @@ def test_list_files(self, workdir, path, expected, temp_dir, driver): ) def test_list_files_failure(self, workdir, path, expected, temp_dir, driver): # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. - driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + driver.workdir = self._to_driver_workdir(temp_dir, workdir) artifact = driver.list_files(path) @@ -155,7 +155,7 @@ def test_load_file(self, driver: LocalFileManagerDriver): ) def test_load_file_failure(self, workdir, path, expected, temp_dir, driver): # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. - driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + driver.workdir = self._to_driver_workdir(temp_dir, workdir) artifact = driver.load_file(path) @@ -194,7 +194,7 @@ def test_load_file_with_encoding_failure(self): ) def test_save_file(self, workdir, path, content, temp_dir, driver): # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. - driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + driver.workdir = self._to_driver_workdir(temp_dir, workdir) result = driver.save_file(path, content) @@ -223,7 +223,7 @@ def test_save_file(self, workdir, path, content, temp_dir, driver): ) def test_save_file_failure(self, workdir, path, expected, temp_dir, driver): # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. - driver.workdir = os.path.join(temp_dir, os.path.abspath(workdir).lstrip("/")) + driver.workdir = self._to_driver_workdir(temp_dir, workdir) artifact = driver.save_file(path, "foobar") @@ -251,10 +251,7 @@ def test_save_and_load_file_with_encoding(self, temp_dir): assert len(result.value) == 1 assert isinstance(result.value[0], TextArtifact) - def test_chrdir_getcwd(self, temp_dir): - os.chdir(temp_dir) - file_manager_1 = LocalFileManagerDriver() - assert file_manager_1.workdir.endswith(temp_dir) - os.chdir("/tmp") - file_manager_2 = LocalFileManagerDriver() - assert file_manager_2.workdir.endswith("/tmp") + def _to_driver_workdir(self, temp_dir, workdir): + # Treat the workdir as an absolute path, but modify it to be relative to the temp_dir. + root_relative_parts = Path(os.path.abspath(workdir)).parts[1:] + return os.path.join(temp_dir, Path(*root_relative_parts)) diff --git a/tests/unit/utils/test_command_runner.py b/tests/unit/utils/test_command_runner.py index 25b7fd8c3..4cf0bbeaa 100644 --- a/tests/unit/utils/test_command_runner.py +++ b/tests/unit/utils/test_command_runner.py @@ -3,4 +3,4 @@ class TestCommandRunner: def test_run(self): - assert CommandRunner().run("echo 'test'").value == "test" + assert "test" in CommandRunner().run("echo 'test'").value diff --git a/tests/unit/utils/test_file_utils.py b/tests/unit/utils/test_file_utils.py index de1882ef5..a9c122126 100644 --- a/tests/unit/utils/test_file_utils.py +++ b/tests/unit/utils/test_file_utils.py @@ -14,7 +14,6 @@ def test_load_file(self): file = utils.load_file(os.path.join(dirname, "../../resources/foobar-many.txt")) assert file.decode("utf-8").startswith("foobar foobar foobar") - assert len(file.decode("utf-8")) == 4563 def test_load_files(self): dirname = os.path.dirname(__file__) @@ -24,7 +23,6 @@ def test_load_files(self): assert len(files) == 2 test_file = files[utils.str_to_hash(sources[0])] - assert len(test_file) == 4563 assert test_file.decode("utf-8").startswith("foobar foobar foobar") small_file = files[utils.str_to_hash(sources[2])] From 7d263b9b9fc802ff67ff9273fa84bb20625d1bee Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 17 Jul 2024 11:07:03 -0700 Subject: [PATCH 171/238] Improve native tool name check (#968) Co-authored-by: dylanholmes <4370153+dylanholmes@users.noreply.github.com> --- griptape/tools/base_tool.py | 19 ++++++++++++++----- tests/unit/tools/test_base_tool.py | 11 +++++++++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 60eb10cda..91b90e775 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -3,6 +3,7 @@ import inspect import logging import os +import re import subprocess import sys from abc import ABC @@ -204,15 +205,23 @@ def find_input_memory(self, memory_name: str) -> Optional[TaskMemory]: return None def to_native_tool_name(self, activity: Callable) -> str: - """Converts a Tool into to a native tool name. + """Converts a Tool's name and an Activity into to a native tool name. + + The native tool name is a combination of the Tool's name and the Activity's name. + The Tool's name may only contain letters and numbers, and the Activity's name may only contain letters, numbers, and underscores. Args: - activity: Activity to convert. + activity: Activity to convert Returns: str: Native tool name. """ - if "_" in self.name: - raise ValueError("Tool name can't contain underscores when using native tools.") + tool_name = self.name + if re.match(r"^[a-zA-Z0-9]+$", tool_name) is None: + raise ValueError("Tool name can only contain letters and numbers.") + + activity_name = self.activity_name(activity) + if re.match(r"^[a-zA-Z0-9_]+$", activity_name) is None: + raise ValueError("Activity name can only contain letters, numbers, and underscores.") - return f"{self.name}_{self.activity_name(activity)}" + return f"{tool_name}_{activity_name}" diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index a4d4097c1..9c1764837 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -249,11 +249,18 @@ def test_activity_schemas(self, tool): assert tool_schema == self.TARGET_TOOL_SCHEMA - def test_to_native_tool_name(self, tool): + def test_to_native_tool_name(self, tool, mocker): tool = MockTool() assert tool.to_native_tool_name(tool.test) == "MockTool_test" + # Bad name tool.name = "mock_tool" - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Tool name"): tool.to_native_tool_name(tool.foo) + + # Bad activity name + mocker.patch.object(tool, "activity_name", return_value="foo^bar") + tool.name = "MockTool" + with pytest.raises(ValueError, match="Activity name"): + tool.to_native_tool_name(tool.test) From 33469efd7012bd65e745e14df59928e6523e288f Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:47:32 -0700 Subject: [PATCH 172/238] Add observability (#991) --- CHANGELOG.md | 6 + .../drivers/observability-drivers.md | 192 ++++++++++++ .../structures/observability.md | 57 ++++ griptape/common/__init__.py | 3 + griptape/common/observable.py | 77 +++++ griptape/drivers/__init__.py | 9 + .../griptape_cloud_event_listener_driver.py | 12 + griptape/drivers/observability/__init__.py | 0 .../base_observability_driver.py | 31 ++ .../griptape_cloud_observability_driver.py | 104 +++++++ .../no_op_observability_driver.py | 19 ++ .../open_telemetry_observability_driver.py | 86 ++++++ .../prompt/amazon_bedrock_prompt_driver.py | 3 + ...mazon_sagemaker_jumpstart_prompt_driver.py | 4 +- .../drivers/prompt/anthropic_prompt_driver.py | 3 + griptape/drivers/prompt/base_prompt_driver.py | 2 + .../drivers/prompt/cohere_prompt_driver.py | 3 + .../drivers/prompt/dummy_prompt_driver.py | 3 + .../drivers/prompt/google_prompt_driver.py | 3 + .../prompt/huggingface_hub_prompt_driver.py | 4 +- .../huggingface_pipeline_prompt_driver.py | 4 +- .../drivers/prompt/ollama_prompt_driver.py | 3 + .../prompt/openai_chat_prompt_driver.py | 3 + griptape/observability/__init__.py | 3 + griptape/observability/observability.py | 57 ++++ griptape/structures/agent.py | 2 + griptape/structures/pipeline.py | 2 + griptape/structures/structure.py | 4 + griptape/structures/workflow.py | 2 + griptape/tools/base_tool.py | 2 + poetry.lock | 228 +++++++++++++- pyproject.toml | 25 ++ tests/unit/common/test_observable.py | 238 +++++++++++++++ ...st_griptape_cloud_event_listener_driver.py | 27 +- tests/unit/drivers/observability/__init__.py | 0 ...est_griptape_cloud_observability_driver.py | 284 ++++++++++++++++++ .../test_no_op_observability_driver.py | 32 ++ ...est_open_telemetry_observability_driver.py | 197 ++++++++++++ tests/unit/observability/__init__.py | 0 .../unit/observability/test_observability.py | 50 +++ tests/utils/expected_spans.py | 86 ++++++ 41 files changed, 1864 insertions(+), 6 deletions(-) create mode 100644 docs/griptape-framework/drivers/observability-drivers.md create mode 100644 docs/griptape-framework/structures/observability.md create mode 100644 griptape/common/observable.py create mode 100644 griptape/drivers/observability/__init__.py create mode 100644 griptape/drivers/observability/base_observability_driver.py create mode 100644 griptape/drivers/observability/griptape_cloud_observability_driver.py create mode 100644 griptape/drivers/observability/no_op_observability_driver.py create mode 100644 griptape/drivers/observability/open_telemetry_observability_driver.py create mode 100644 griptape/observability/__init__.py create mode 100644 griptape/observability/observability.py create mode 100644 tests/unit/common/test_observable.py create mode 100644 tests/unit/drivers/observability/__init__.py create mode 100644 tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py create mode 100644 tests/unit/drivers/observability/test_no_op_observability_driver.py create mode 100644 tests/unit/drivers/observability/test_open_telemetry_observability_driver.py create mode 100644 tests/unit/observability/__init__.py create mode 100644 tests/unit/observability/test_observability.py create mode 100644 tests/utils/expected_spans.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 67d7fd92f..f636f548a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `OllamaEmbeddingDriver` for generating embeddings with Ollama. - `GriptapeCloudKnowledgeBaseVectorStoreDriver` to query Griptape Cloud Knowledge Bases. - `GriptapeCloudEventListenerDriver.api_key` defaults to the value in the `GT_CLOUD_API_KEY` environment variable. +- `BaseObservabilityDriver` as the base class for all Observability Drivers. +- `DummyObservabilityDriver` as a no-op Observability Driver. +- `OpenTelemetryObservabilityDriver` for sending observability data to an open telemetry collector or vendor. +- `GriptapeCloudObservabilityDriver` for sending observability data to Griptape Cloud. +- `Observability` context manager for enabling observability and configuring which Observability Driver to use. +- `@observable` decorator for selecting which functions/methods to provide observability for. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. diff --git a/docs/griptape-framework/drivers/observability-drivers.md b/docs/griptape-framework/drivers/observability-drivers.md new file mode 100644 index 000000000..8c2c5d2a5 --- /dev/null +++ b/docs/griptape-framework/drivers/observability-drivers.md @@ -0,0 +1,192 @@ +# Observability Drivers + +Observability Drivers are used by [Observability](../structures/observability.md) to send telemetry (metrics and traces) related to the execution of an LLM application. The telemetry can be used to monitor the application and to diagnose and troubleshoot issues. All Observability Drivers implement the following methods: + +* `__enter__()` sets up the Driver. +* `__exit__()` tears down the Driver. +* `observe()` wraps all functions and methods marked with the `@observable` decorator. At a bare minimum, implementations call the wrapped function and return its result (a no-op). This enables the Driver to generate telemetry related to the invocation's call arguments, return values, exceptions, latency, etc. + +## Griptape Cloud + +!!! info + This driver requires the `drivers-observability-griptape-cloud` [extra](../index.md#extras). + +The Griptape Cloud Observability Driver instruments `@observable` functions and methods with metrics and traces for use with the Griptape Cloud. + +!!! note + For the Griptape Cloud Observability Driver to function as intended, it must be run from within either a Managed Structure on Griptape Cloud + or locally via the [Skatepark Emulator](https://github.com/griptape-ai/griptape-cli?tab=readme-ov-file#skatepark-emulator). + +Here is an example of how to use the `GriptapeCloudObservabilityDriver` with the `Observability` context manager to send the telemetry to Griptape Cloud: + + +```python title="PYTEST_IGNORE" +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.rules import Rule +from griptape.structures import Agent +from griptape.observability import Observability + +observability_driver = GriptapeCloudObservabilityDriver() + +with Observability(observability_driver=observability_driver): + agent = Agent(rules=[Rule("Output one word")]) + agent.run("Name an animal") +``` + + +## OpenTelemetry + +!!! info + This driver requires the `drivers-observability-opentelemetry` [extra](../index.md#extras). + +The [OpenTelemetry](https://opentelemetry.io/) Observability Driver instruments `@observable` functions and methods with metrics and traces for use with OpenTelemetry. You must configure a destination for the telemetry by providing a `SpanProcessor` to the Driver. + + +Here is an example of how to use the `OpenTelemetryObservabilityDriver` with the `Observability` context manager to output the telemetry directly to the console: + +```python title="PYTEST_IGNORE" +from griptape.drivers import OpenTelemetryObservabilityDriver +from griptape.rules import Rule +from griptape.structures import Agent +from griptape.observability import Observability +from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor + +observability_driver = OpenTelemetryObservabilityDriver( + service_name="name-an-animal", + span_processor=BatchSpanProcessor(ConsoleSpanExporter()) +) + +with Observability(observability_driver=observability_driver): + agent = Agent(rules=[Rule("Output one word")]) + agent.run("Name an animal") +``` + +Output (only relevant because of use of `ConsoleSpanExporter`): +``` +[06/18/24 06:57:22] INFO PromptTask 2d8ef95bf817480188ae2f74e754308a + Input: Name an animal +[06/18/24 06:57:23] INFO PromptTask 2d8ef95bf817480188ae2f74e754308a + Output: Elephant +{ + "name": "Agent.before_run()", + "context": { + "trace_id": "0x4f3d72f7ff4e6a453f5c950fa097583e", + "span_id": "0x8cf827b375f6922f", + "trace_state": "[]" + }, + "kind": "SpanKind.INTERNAL", + "parent_id": "0x580276d16c584de3", + "start_time": "2024-06-18T13:57:22.640040Z", + "end_time": "2024-06-18T13:57:22.640822Z", + "status": { + "status_code": "OK" + }, + "attributes": {}, + "events": [], + "links": [], + "resource": { + "attributes": { + "service.name": "my-gt-app" + }, + "schema_url": "" + } +} +{ + "name": "Agent.try_run()", + "context": { + "trace_id": "0x4f3d72f7ff4e6a453f5c950fa097583e", + "span_id": "0x7191a27da608cbe7", + "trace_state": "[]" + }, + "kind": "SpanKind.INTERNAL", + "parent_id": "0x580276d16c584de3", + "start_time": "2024-06-18T13:57:22.640846Z", + "end_time": "2024-06-18T13:57:23.287311Z", + "status": { + "status_code": "OK" + }, + "attributes": {}, + "events": [], + "links": [], + "resource": { + "attributes": { + "service.name": "my-gt-app" + }, + "schema_url": "" + } +} +{ + "name": "Agent.after_run()", + "context": { + "trace_id": "0x4f3d72f7ff4e6a453f5c950fa097583e", + "span_id": "0x99824dd1bc842f66", + "trace_state": "[]" + }, + "kind": "SpanKind.INTERNAL", + "parent_id": "0x580276d16c584de3", + "start_time": "2024-06-18T13:57:23.287707Z", + "end_time": "2024-06-18T13:57:23.288666Z", + "status": { + "status_code": "OK" + }, + "attributes": {}, + "events": [], + "links": [], + "resource": { + "attributes": { + "service.name": "my-gt-app" + }, + "schema_url": "" + } +} +{ + "name": "Agent.run()", + "context": { + "trace_id": "0x4f3d72f7ff4e6a453f5c950fa097583e", + "span_id": "0x580276d16c584de3", + "trace_state": "[]" + }, + "kind": "SpanKind.INTERNAL", + "parent_id": "0xa42d36d9fff76325", + "start_time": "2024-06-18T13:57:22.640021Z", + "end_time": "2024-06-18T13:57:23.288694Z", + "status": { + "status_code": "OK" + }, + "attributes": {}, + "events": [], + "links": [], + "resource": { + "attributes": { + "service.name": "my-gt-app" + }, + "schema_url": "" + } +} +{ + "name": "main", + "context": { + "trace_id": "0x4f3d72f7ff4e6a453f5c950fa097583e", + "span_id": "0xa42d36d9fff76325", + "trace_state": "[]" + }, + "kind": "SpanKind.INTERNAL", + "parent_id": null, + "start_time": "2024-06-18T13:57:22.607005Z", + "end_time": "2024-06-18T13:57:23.288764Z", + "status": { + "status_code": "OK" + }, + "attributes": {}, + "events": [], + "links": [], + "resource": { + "attributes": { + "service.name": "my-gt-app" + }, + "schema_url": "" + } +} +``` + + diff --git a/docs/griptape-framework/structures/observability.md b/docs/griptape-framework/structures/observability.md new file mode 100644 index 000000000..5a9e9c51c --- /dev/null +++ b/docs/griptape-framework/structures/observability.md @@ -0,0 +1,57 @@ +## Overview + +The [Observability](../../reference/griptape/observability/observability.md) context manager sends telemetry (metrics and traces) for all functions and methods annotated with the `@observable` decorator to a destination of your choice. This is useful for monitoring and debugging your application. + +Observability is completely optional. To opt in, wrap your application code with the [Observability](../../reference/griptape/observability/observability.md) context manager, for example: + +```python title="PYTEST_IGNORE" +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.structures import Agent +from griptape.observability import Observability + +observability_driver = GriptapeCloudObservabilityDriver() + +with Observability(observability_driver=observability_driver): + # Important! Only code within this block is subject to observability + agent = Agent() + agent.run("Name the five greatest rappers of all time") +``` + +!!! info + For available Drivers (and destinations), see [Observability Drivers](../drivers/observability-drivers.md). + +## Tracing Custom Code + +All functions and methods annotated with the `@observable` decorator will be traced when invoked within the context of the [Observability](../../reference/griptape/observability/observability.md) context manager, including functions and methods defined outside of the Griptape framework. Thus to trace custom code, you just need to add the `@observable` decorator to your function or method, then invoke it within the [Observability](../../reference/griptape/observability/observability.md) context manager. + +For example: + +```python title="PYTEST_IGNORE" +import time +from griptape.drivers import GriptapeCloudObservabilityDriver +from griptape.rules import Rule +from griptape.structures import Agent +from griptape.observability import Observability +from griptape.common import observable + +# Decorate a function +@observable +def my_function(): + time.sleep(3) + +class MyClass: + # Decorate a method + @observable + def my_method(self): + time.sleep(1) + my_function() + time.sleep(2) + +observability_driver = GriptapeCloudObservabilityDriver() + +# When invoking the instrumented code from within the Observability context manager, the +# telemetry for the custom code will be sent to the destination specified by the driver. +with Observability(observability_driver=observability_driver): + my_function() + MyClass().my_method() +``` \ No newline at end of file diff --git a/griptape/common/__init__.py b/griptape/common/__init__.py index 8324bcb9d..6ceff61eb 100644 --- a/griptape/common/__init__.py +++ b/griptape/common/__init__.py @@ -18,6 +18,7 @@ from .reference import Reference +from .observable import observable, Observable __all__ = [ "BaseMessage", @@ -35,4 +36,6 @@ "Reference", "BaseAction", "ToolAction", + "observable", + "Observable", ] diff --git a/griptape/common/observable.py b/griptape/common/observable.py new file mode 100644 index 000000000..aa675dfbe --- /dev/null +++ b/griptape/common/observable.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import functools +from inspect import isfunction +from typing import Any, Callable, Optional, TypeVar, cast + +from attrs import Factory, define, field + +T = TypeVar("T", bound=Callable) + + +def observable(*args: T | Any, **kwargs: Any) -> T: + return cast(T, Observable(*args, **kwargs)) + + +class Observable: + @define + class Call: + func: Callable = field(kw_only=True) + instance: Optional[Any] = field(default=None, kw_only=True) + args: tuple[Any, ...] = field(default=Factory(tuple), kw_only=True) + kwargs: dict[str, Any] = field(default=Factory(dict), kw_only=True) + decorator_args: tuple[Any, ...] = field(default=Factory(tuple), kw_only=True) + decorator_kwargs: dict[str, Any] = field(default=Factory(dict), kw_only=True) + + def __call__(self) -> Any: + # If self.func has a __self__ attribute, it is a bound method and we do not need to pass the instance. + args = (self.instance, *self.args) if self.instance and not hasattr(self.func, "__self__") else self.args + return self.func(*args, **self.kwargs) + + @property + def tags(self) -> Optional[list[str]]: + return self.decorator_kwargs.get("tags") + + def __init__(self, *args, **kwargs) -> None: + self._instance = None + if len(args) == 1 and len(kwargs) == 0 and isfunction(args[0]): + # Parameterless call. In otherwords, the `@observable` annotation + # was not followed by parentheses. + self._func = args[0] + functools.update_wrapper(self, self._func) + self.decorator_args = () + self.decorator_kwargs = {} + else: + # Parameterized call. In otherwords, the `@observable` annotation + # was followed by parentheses, for example `@observable()`, + # `@observable("x")` or `@observable(y="y")`. + self._func = None + self.decorator_args = args + self.decorator_kwargs = kwargs + + def __get__(self, obj: Any, objtype: Any = None) -> Observable: + self._instance = obj + return self + + def __call__(self, *args, **kwargs) -> Any: + if self._func: + # Parameterless call (self._func was a set in __init__) + from griptape.observability.observability import Observability + + return Observability.observe( + Observable.Call( + func=self._func, + instance=self._instance, + args=args, + kwargs=kwargs, + decorator_args=self.decorator_args, + decorator_kwargs=self.decorator_kwargs, + ) + ) + else: + # Parameterized call, create and return the "real" observable decorator + func = args[0] + decorated_func = Observable(func) + decorated_func.decorator_args = self.decorator_args + decorated_func.decorator_kwargs = self.decorator_kwargs + return decorated_func diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 4ecb6c9bd..8d84b68cf 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -109,6 +109,11 @@ from .audio_transcription.dummy_audio_transcription_driver import DummyAudioTranscriptionDriver from .audio_transcription.openai_audio_transcription_driver import OpenAiAudioTranscriptionDriver +from .observability.base_observability_driver import BaseObservabilityDriver +from .observability.no_op_observability_driver import NoOpObservabilityDriver +from .observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver +from .observability.griptape_cloud_observability_driver import GriptapeCloudObservabilityDriver + __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", @@ -202,4 +207,8 @@ "BaseAudioTranscriptionDriver", "DummyAudioTranscriptionDriver", "OpenAiAudioTranscriptionDriver", + "BaseObservabilityDriver", + "NoOpObservabilityDriver", + "OpenTelemetryObservabilityDriver", + "GriptapeCloudObservabilityDriver", ] diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index cf9dd7bd2..733f0baa2 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -7,6 +7,7 @@ from attrs import Attribute, Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver +from griptape.events.base_event import BaseEvent @define @@ -38,6 +39,17 @@ def validate_run_id(self, _: Attribute, structure_run_id: str) -> None: "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID).", ) + def publish_event(self, event: BaseEvent | dict, *, flush: bool = False) -> None: + from griptape.observability.observability import Observability + + event_payload = event.to_dict() if isinstance(event, BaseEvent) else event + + span_id = Observability.get_span_id() + if span_id is not None: + event_payload["span_id"] = span_id + + super().publish_event(event_payload, flush=flush) + def try_publish_event_payload(self, event_payload: dict) -> None: url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/events") diff --git a/griptape/drivers/observability/__init__.py b/griptape/drivers/observability/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/observability/base_observability_driver.py b/griptape/drivers/observability/base_observability_driver.py new file mode 100644 index 000000000..41b779578 --- /dev/null +++ b/griptape/drivers/observability/base_observability_driver.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define + +if TYPE_CHECKING: + from types import TracebackType + + from griptape.common import Observable + + +@define +class BaseObservabilityDriver(ABC): + def __enter__(self) -> None: # noqa: B027 + pass + + def __exit__( + self, + exc_type: Optional[type[BaseException]], + exc_value: Optional[BaseException], + exc_traceback: Optional[TracebackType], + ) -> bool: + return False + + @abstractmethod + def observe(self, call: Observable.Call) -> Any: ... + + @abstractmethod + def get_span_id(self) -> Optional[str]: ... diff --git a/griptape/drivers/observability/griptape_cloud_observability_driver.py b/griptape/drivers/observability/griptape_cloud_observability_driver.py new file mode 100644 index 000000000..e520def50 --- /dev/null +++ b/griptape/drivers/observability/griptape_cloud_observability_driver.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +import os +from typing import TYPE_CHECKING, Optional +from urllib.parse import urljoin +from uuid import UUID + +import requests +from attrs import Attribute, Factory, define, field +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter, SpanExportResult +from opentelemetry.sdk.util import ns_to_iso_str +from opentelemetry.trace import INVALID_SPAN, get_current_span + +from griptape.drivers.observability.open_telemetry_observability_driver import OpenTelemetryObservabilityDriver + +if TYPE_CHECKING: + from collections.abc import Sequence + + from opentelemetry.sdk.trace import ReadableSpan, SpanProcessor + + +@define +class GriptapeCloudObservabilityDriver(OpenTelemetryObservabilityDriver): + @define + class SpanExporter(SpanExporter): + base_url: str = field(kw_only=True) + api_key: str = field(kw_only=True) + headers: dict = field(kw_only=True) + structure_run_id: str = field(kw_only=True) + + def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/spans") + payload = [ + { + "trace_id": GriptapeCloudObservabilityDriver.format_trace_id(span.context.trace_id), + "span_id": GriptapeCloudObservabilityDriver.format_span_id(span.context.span_id), + "parent_id": GriptapeCloudObservabilityDriver.format_span_id(span.parent.span_id) + if span.parent + else None, + "name": span.name, + "start_time": ns_to_iso_str(span.start_time) if span.start_time else None, + "end_time": ns_to_iso_str(span.end_time) if span.end_time else None, + "status": span.status.status_code.name, + "attributes": {**span.attributes} if span.attributes else {}, + "events": [ + { + "name": event.name, + "timestamp": ns_to_iso_str(event.timestamp) if event.timestamp else None, + "attributes": {**event.attributes} if event.attributes else {}, + } + for event in span.events + ], + } + for span in spans + ] + response = requests.post(url=url, json=payload, headers=self.headers) + return SpanExportResult.SUCCESS if response.status_code == 200 else SpanExportResult.FAILURE + + service_name: str = field(default="griptape-cloud", kw_only=True) + base_url: str = field( + default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True + ) + api_key: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_API_KEY")), kw_only=True) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + ) + structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) + span_processor: SpanProcessor = field( + default=Factory( + lambda self: BatchSpanProcessor( + GriptapeCloudObservabilityDriver.SpanExporter( + base_url=self.base_url, + api_key=self.api_key, + headers=self.headers, + structure_run_id=self.structure_run_id, + ) + ), + takes_self=True, + ), + kw_only=True, + ) + trace_provider: TracerProvider = field(default=Factory(lambda: TracerProvider()), kw_only=True) + + @structure_run_id.validator # pyright: ignore[reportAttributeAccessIssue] + def validate_run_id(self, _: Attribute, structure_run_id: str) -> None: + if structure_run_id is None: + raise ValueError( + "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID)." + ) + + @staticmethod + def format_trace_id(trace_id: int) -> str: + return str(UUID(int=trace_id)) + + @staticmethod + def format_span_id(span_id: int) -> str: + return str(UUID(int=span_id)) + + def get_span_id(self) -> Optional[str]: + span = get_current_span() + if span is INVALID_SPAN: + return None + return GriptapeCloudObservabilityDriver.format_span_id(span.get_span_context().span_id) diff --git a/griptape/drivers/observability/no_op_observability_driver.py b/griptape/drivers/observability/no_op_observability_driver.py new file mode 100644 index 000000000..c0fc9bfcf --- /dev/null +++ b/griptape/drivers/observability/no_op_observability_driver.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define + +from griptape.drivers import BaseObservabilityDriver + +if TYPE_CHECKING: + from griptape.common import Observable + + +@define +class NoOpObservabilityDriver(BaseObservabilityDriver): + def observe(self, call: Observable.Call) -> Any: + return call() + + def get_span_id(self) -> Optional[str]: + return None diff --git a/griptape/drivers/observability/open_telemetry_observability_driver.py b/griptape/drivers/observability/open_telemetry_observability_driver.py new file mode 100644 index 000000000..fec067a4b --- /dev/null +++ b/griptape/drivers/observability/open_telemetry_observability_driver.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import Factory, define, field +from opentelemetry.instrumentation.threading import ThreadingInstrumentor +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import SpanProcessor, TracerProvider +from opentelemetry.trace import INVALID_SPAN, Status, StatusCode, Tracer, format_span_id, get_current_span, get_tracer + +from griptape.drivers import BaseObservabilityDriver + +if TYPE_CHECKING: + from types import TracebackType + + from griptape.common import Observable + + +@define +class OpenTelemetryObservabilityDriver(BaseObservabilityDriver): + service_name: str = field(kw_only=True) + span_processor: SpanProcessor = field(kw_only=True) + trace_provider: TracerProvider = field( + default=Factory( + lambda self: TracerProvider(resource=Resource(attributes={"service.name": self.service_name})), + takes_self=True, + ), + kw_only=True, + ) + _tracer: Optional[Tracer] = None + _root_span_context_manager: Any = None + + def __attrs_post_init__(self) -> None: + self.trace_provider.add_span_processor(self.span_processor) + self._tracer = get_tracer(self.service_name, tracer_provider=self.trace_provider) + + def __enter__(self) -> None: + ThreadingInstrumentor().instrument() + self._root_span_context_manager = self._tracer.start_as_current_span("main") # pyright: ignore[reportCallIssue] + self._root_span_context_manager.__enter__() + + def __exit__( + self, + exc_type: Optional[type[BaseException]], + exc_value: Optional[BaseException], + exc_traceback: Optional[TracebackType], + ) -> bool: + root_span = get_current_span() + if exc_value: + root_span = get_current_span() + root_span.set_status(Status(StatusCode.ERROR)) + root_span.record_exception(exc_value) + else: + root_span.set_status(Status(StatusCode.OK)) + if self._root_span_context_manager: + self._root_span_context_manager.__exit__(exc_type, exc_value, exc_traceback) + self._root_span_context_manager = None + self.trace_provider.force_flush() + ThreadingInstrumentor().uninstrument() + return False + + def observe(self, call: Observable.Call) -> Any: + func = call.func + instance = call.instance + tags = call.tags + + class_name = f"{instance.__class__.__name__}." if instance else "" + span_name = f"{class_name}{func.__name__}()" + with self._tracer.start_as_current_span(span_name) as span: # pyright: ignore[reportCallIssue] + if tags is not None: + span.set_attribute("tags", tags) + + try: + result = call() + span.set_status(Status(StatusCode.OK)) + return result + except Exception as e: + span.set_status(Status(StatusCode.ERROR)) + span.record_exception(e) + raise e + + def get_span_id(self) -> Optional[str]: + span = get_current_span() + if span is INVALID_SPAN: + return None + return format_span_id(span.get_span_context().span_id) diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index 4cb5801d3..b663d06fd 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -26,6 +26,7 @@ TextDeltaMessageContent, TextMessageContent, ToolAction, + observable, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AmazonBedrockTokenizer, BaseTokenizer @@ -55,6 +56,7 @@ class AmazonBedrockPromptDriver(BasePromptDriver): use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) tool_choice: dict = field(default=Factory(lambda: {"auto": {}}), kw_only=True, metadata={"serializable": True}) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: response = self.bedrock_client.converse(**self._base_params(prompt_stack)) @@ -67,6 +69,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: usage=Message.Usage(input_tokens=usage["inputTokens"], output_tokens=usage["outputTokens"]), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: response = self.bedrock_client.converse_stream(**self._base_params(prompt_stack)) diff --git a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py index 09eadace5..c31e66abc 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_jumpstart_prompt_driver.py @@ -6,7 +6,7 @@ from attrs import Attribute, Factory, define, field from griptape.artifacts import TextArtifact -from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent, observable from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency @@ -44,6 +44,7 @@ def validate_stream(self, _: Attribute, stream: bool) -> None: # noqa: FBT001 if stream: raise ValueError("streaming is not supported") + @observable def try_run(self, prompt_stack: PromptStack) -> Message: payload = { "inputs": self.prompt_stack_to_string(prompt_stack), @@ -81,6 +82,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: usage=Message.Usage(input_tokens=input_tokens, output_tokens=output_tokens), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: raise NotImplementedError("streaming is not supported") diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 14be9a26b..ae50bc59e 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -27,6 +27,7 @@ TextDeltaMessageContent, TextMessageContent, ToolAction, + observable, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import AnthropicTokenizer, BaseTokenizer @@ -70,6 +71,7 @@ class AnthropicPromptDriver(BasePromptDriver): use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) max_tokens: int = field(default=1000, kw_only=True, metadata={"serializable": True}) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: response = self.client.messages.create(**self._base_params(prompt_stack)) @@ -79,6 +81,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: usage=Message.Usage(input_tokens=response.usage.input_tokens, output_tokens=response.usage.output_tokens), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: events = self.client.messages.create(**self._base_params(prompt_stack), stream=True) diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index f2a5522d6..0a67b4f4e 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -14,6 +14,7 @@ PromptStack, TextDeltaMessageContent, TextMessageContent, + observable, ) from griptape.events import CompletionChunkEvent, FinishPromptEvent, StartPromptEvent from griptape.mixins import ExponentialBackoffMixin, SerializableMixin @@ -65,6 +66,7 @@ def after_run(self, result: Message) -> None: ), ) + @observable(tags=["PromptDriver.run()"]) def run(self, prompt_stack: PromptStack) -> Message: for attempt in self.retrying(): with attempt: diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 0a28a9c59..ff1a8b482 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -17,6 +17,7 @@ TextDeltaMessageContent, TextMessageContent, ToolAction, + observable, ) from griptape.common.prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent from griptape.drivers import BasePromptDriver @@ -53,6 +54,7 @@ class CoherePromptDriver(BasePromptDriver): force_single_step: bool = field(default=False, kw_only=True, metadata={"serializable": True}) use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: result = self.client.chat(**self._base_params(prompt_stack)) usage = result.meta.tokens @@ -63,6 +65,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: usage=Message.Usage(input_tokens=usage.input_tokens, output_tokens=usage.output_tokens), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: result = self.client.chat_stream(**self._base_params(prompt_stack)) diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index c26d53794..9ed1f45ec 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -4,6 +4,7 @@ from attrs import Factory, define, field +from griptape.common import observable from griptape.drivers import BasePromptDriver from griptape.exceptions import DummyException from griptape.tokenizers import DummyTokenizer @@ -19,8 +20,10 @@ class DummyPromptDriver(BasePromptDriver): model: None = field(init=False, default=None, kw_only=True) tokenizer: DummyTokenizer = field(default=Factory(lambda: DummyTokenizer()), kw_only=True) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: raise DummyException(__class__.__name__, "try_run") + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: raise DummyException(__class__.__name__, "try_stream") diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index c85835826..3a32ebca7 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -20,6 +20,7 @@ TextDeltaMessageContent, TextMessageContent, ToolAction, + observable, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, GoogleTokenizer @@ -62,6 +63,7 @@ class GooglePromptDriver(BasePromptDriver): use_native_tools: bool = field(default=True, kw_only=True, metadata={"serializable": True}) tool_choice: str = field(default="auto", kw_only=True, metadata={"serializable": True}) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: messages = self.__to_google_messages(prompt_stack) response: GenerateContentResponse = self.model_client.generate_content( @@ -80,6 +82,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: ), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: messages = self.__to_google_messages(prompt_stack) response: GenerateContentResponse = self.model_client.generate_content( diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index 072b01ab5..71244ddf0 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -4,7 +4,7 @@ from attrs import Factory, define, field -from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextDeltaMessageContent, observable from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency @@ -50,6 +50,7 @@ class HuggingFaceHubPromptDriver(BasePromptDriver): kw_only=True, ) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: prompt = self.prompt_stack_to_string(prompt_stack) @@ -68,6 +69,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: usage=Message.Usage(input_tokens=input_tokens, output_tokens=output_tokens), ) + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: prompt = self.prompt_stack_to_string(prompt_stack) diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 992aff918..fb475bdd7 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field from griptape.artifacts import TextArtifact -from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent +from griptape.common import DeltaMessage, Message, PromptStack, TextMessageContent, observable from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer from griptape.utils import import_optional_dependency @@ -47,6 +47,7 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): ), ) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: messages = self._prompt_stack_to_messages(prompt_stack) @@ -75,6 +76,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: else: raise Exception("invalid output format") + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: raise NotImplementedError("streaming is not supported") diff --git a/griptape/drivers/prompt/ollama_prompt_driver.py b/griptape/drivers/prompt/ollama_prompt_driver.py index fb1e28e87..ea4f8b344 100644 --- a/griptape/drivers/prompt/ollama_prompt_driver.py +++ b/griptape/drivers/prompt/ollama_prompt_driver.py @@ -13,6 +13,7 @@ PromptStack, TextDeltaMessageContent, TextMessageContent, + observable, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import SimpleTokenizer @@ -61,6 +62,7 @@ class OllamaPromptDriver(BasePromptDriver): kw_only=True, ) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: response = self.client.chat(**self._base_params(prompt_stack)) @@ -72,6 +74,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: else: raise Exception("invalid model response") + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: stream = self.client.chat(**self._base_params(prompt_stack), stream=True) diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 9c4ab9a74..c845aa6c5 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -21,6 +21,7 @@ TextDeltaMessageContent, TextMessageContent, ToolAction, + observable, ) from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer @@ -88,6 +89,7 @@ class OpenAiChatPromptDriver(BasePromptDriver): kw_only=True, ) + @observable def try_run(self, prompt_stack: PromptStack) -> Message: result = self.client.chat.completions.create(**self._base_params(prompt_stack)) @@ -105,6 +107,7 @@ def try_run(self, prompt_stack: PromptStack) -> Message: else: raise Exception("Completion with more than one choice is not supported yet.") + @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: result = self.client.chat.completions.create(**self._base_params(prompt_stack), stream=True) diff --git a/griptape/observability/__init__.py b/griptape/observability/__init__.py new file mode 100644 index 000000000..a17bb63f6 --- /dev/null +++ b/griptape/observability/__init__.py @@ -0,0 +1,3 @@ +from .observability import Observability + +__all__ = ["Observability"] diff --git a/griptape/observability/observability.py b/griptape/observability/observability.py new file mode 100644 index 000000000..1cbc589eb --- /dev/null +++ b/griptape/observability/observability.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional + +from attrs import define, field + +from griptape.common import Observable +from griptape.drivers import BaseObservabilityDriver, NoOpObservabilityDriver + +_no_op_observability_driver = NoOpObservabilityDriver() +_global_observability_driver: Optional[BaseObservabilityDriver] = None + +if TYPE_CHECKING: + from types import TracebackType + + from griptape.common import Observable + + +@define +class Observability: + observability_driver: BaseObservabilityDriver = field(kw_only=True) + + @staticmethod + def get_global_driver() -> Optional[BaseObservabilityDriver]: + global _global_observability_driver + return _global_observability_driver + + @staticmethod + def set_global_driver(driver: Optional[BaseObservabilityDriver]) -> None: + global _global_observability_driver + _global_observability_driver = driver + + @staticmethod + def observe(call: Observable.Call) -> Any: + driver = Observability.get_global_driver() or _no_op_observability_driver + return driver.observe(call) + + @staticmethod + def get_span_id() -> Optional[str]: + driver = Observability.get_global_driver() or _no_op_observability_driver + return driver.get_span_id() + + def __enter__(self) -> None: + if Observability.get_global_driver() is not None: + raise ValueError("Observability driver already set.") + Observability.set_global_driver(self.observability_driver) + self.observability_driver.__enter__() + + def __exit__( + self, + exc_type: Optional[type[BaseException]], + exc_value: Optional[BaseException], + exc_traceback: Optional[TracebackType], + ) -> bool: + Observability.set_global_driver(None) + self.observability_driver.__exit__(exc_type, exc_value, exc_traceback) + return False diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index 693a98c34..b133a7b6b 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -5,6 +5,7 @@ from attrs import Attribute, define, field from griptape.artifacts.text_artifact import TextArtifact +from griptape.common import observable from griptape.memory.structure import Run from griptape.structures import Structure from griptape.tasks import PromptTask, ToolkitTask @@ -57,6 +58,7 @@ def add_tasks(self, *tasks: BaseTask) -> list[BaseTask]: raise ValueError("Agents can only have one task.") return super().add_tasks(*tasks) + @observable def try_run(self, *args) -> Agent: self.task.execute() diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index b768cf6c6..0aed369bb 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -5,6 +5,7 @@ from attrs import define from griptape.artifacts import ErrorArtifact +from griptape.common import observable from griptape.memory.structure import Run from griptape.structures import Structure @@ -45,6 +46,7 @@ def insert_task(self, parent_task: BaseTask, task: BaseTask) -> BaseTask: return task + @observable def try_run(self, *args) -> Pipeline: self.__run_from_task(self.input_task) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 13c247824..0a296f980 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -10,6 +10,7 @@ from rich.logging import RichHandler from griptape.artifacts import BaseArtifact, BlobArtifact, TextArtifact +from griptape.common import observable from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver @@ -255,6 +256,7 @@ def resolve_relationships(self) -> None: if task.id not in child.parent_ids: child.parent_ids.append(task.id) + @observable def before_run(self, args: Any) -> None: self._execution_args = args @@ -270,6 +272,7 @@ def before_run(self, args: Any) -> None: self.resolve_relationships() + @observable def after_run(self) -> None: self.publish_event( FinishStructureRunEvent( @@ -283,6 +286,7 @@ def after_run(self) -> None: @abstractmethod def add_task(self, task: BaseTask) -> BaseTask: ... + @observable def run(self, *args) -> Structure: self.before_run(args) diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 32485af7b..2ecfb8676 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -7,6 +7,7 @@ from graphlib import TopologicalSorter from griptape.artifacts import ErrorArtifact +from griptape.common import observable from griptape.memory.structure import Run from griptape.structures import Structure @@ -82,6 +83,7 @@ def insert_task( return task + @observable def try_run(self, *args) -> Workflow: exit_loop = False diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 91b90e775..3fb6af26b 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -14,6 +14,7 @@ from schema import Literal, Or, Schema from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact +from griptape.common import observable from griptape.mixins import ActivityMixin if TYPE_CHECKING: @@ -122,6 +123,7 @@ def execute(self, activity: Callable, subtask: ActionsSubtask, action: ToolActio def before_run(self, activity: Callable, subtask: ActionsSubtask, action: ToolAction) -> Optional[dict]: return action.input + @observable(tags=["Tool.run()"]) def run( self, activity: Callable, diff --git a/poetry.lock b/poetry.lock index d654c99f5..3ae72743c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1188,6 +1188,23 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + [[package]] name = "distlib" version = "0.3.8" @@ -3572,6 +3589,131 @@ develop = ["black", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-par docs = ["aiohttp (>=3,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] kerberos = ["requests-kerberos"] +[[package]] +name = "opentelemetry-api" +version = "1.25.0" +description = "OpenTelemetry Python API" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, + {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<=7.1" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.25.0" +description = "OpenTelemetry Protobuf encoding" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.25.0-py3-none-any.whl", hash = "sha256:15637b7d580c2675f70246563363775b4e6de947871e01d0f4e3881d1848d693"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.25.0.tar.gz", hash = "sha256:c93f4e30da4eee02bacd1e004eb82ce4da143a2f8e15b987a9f603e0a85407d3"}, +] + +[package.dependencies] +opentelemetry-proto = "1.25.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.25.0" +description = "OpenTelemetry Collector Protobuf over HTTP Exporter" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_http-1.25.0-py3-none-any.whl", hash = "sha256:2eca686ee11b27acd28198b3ea5e5863a53d1266b91cda47c839d95d5e0541a6"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.25.0.tar.gz", hash = "sha256:9f8723859e37c75183ea7afa73a3542f01d0fd274a5b97487ea24cb683d7d684"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.25.0" +opentelemetry-proto = "1.25.0" +opentelemetry-sdk = ">=1.25.0,<1.26.0" +requests = ">=2.7,<3.0" + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.46b0" +description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_instrumentation-0.46b0-py3-none-any.whl", hash = "sha256:89cd721b9c18c014ca848ccd11181e6b3fd3f6c7669e35d59c48dc527408c18b"}, + {file = "opentelemetry_instrumentation-0.46b0.tar.gz", hash = "sha256:974e0888fb2a1e01c38fbacc9483d024bb1132aad92d6d24e2e5543887a7adda"}, +] + +[package.dependencies] +opentelemetry-api = ">=1.4,<2.0" +setuptools = ">=16.0" +wrapt = ">=1.0.0,<2.0.0" + +[[package]] +name = "opentelemetry-instrumentation-threading" +version = "0.46b0" +description = "Thread context propagation support for OpenTelemetry" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_instrumentation_threading-0.46b0-py3-none-any.whl", hash = "sha256:60fe4e86a8e399c187eeafccfeeefa07d5b9d4382bc9c4f52ab5436d6bb244bf"}, + {file = "opentelemetry_instrumentation_threading-0.46b0.tar.gz", hash = "sha256:938dacb52b2ac1114678d146d2ef2d0044f3e32ec8b2045db36d709de6c95548"}, +] + +[package.dependencies] +opentelemetry-api = ">=1.12,<2.0" +opentelemetry-instrumentation = "0.46b0" +wrapt = ">=1.0.0,<2.0.0" + +[[package]] +name = "opentelemetry-proto" +version = "1.25.0" +description = "OpenTelemetry Python Proto" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_proto-1.25.0-py3-none-any.whl", hash = "sha256:f07e3341c78d835d9b86665903b199893befa5e98866f63d22b00d0b7ca4972f"}, + {file = "opentelemetry_proto-1.25.0.tar.gz", hash = "sha256:35b6ef9dc4a9f7853ecc5006738ad40443701e52c26099e197895cbda8b815a3"}, +] + +[package.dependencies] +protobuf = ">=3.19,<5.0" + +[[package]] +name = "opentelemetry-sdk" +version = "1.25.0" +description = "OpenTelemetry Python SDK" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, + {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, +] + +[package.dependencies] +opentelemetry-api = "1.25.0" +opentelemetry-semantic-conventions = "0.46b0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.46b0" +description = "OpenTelemetry Semantic Conventions" +optional = true +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, + {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, +] + +[package.dependencies] +opentelemetry-api = "1.25.0" + [[package]] name = "packaging" version = "24.0" @@ -4726,6 +4868,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -6399,6 +6542,85 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = true +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + [[package]] name = "xmltodict" version = "0.13.0" @@ -6529,7 +6751,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "duckduckgo-search", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "ollama", "opensearch-py", "opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pusher", "pymongo", "pypdf", "qdrant-client", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-cohere = ["cohere"] @@ -6542,6 +6764,8 @@ drivers-event-listener-amazon-sqs = ["boto3"] drivers-event-listener-pusher = ["pusher"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] drivers-memory-conversation-redis = ["redis"] +drivers-observability-griptape-cloud = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] +drivers-observability-opentelemetry = ["opentelemetry-api", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-instrumentation", "opentelemetry-instrumentation-threading", "opentelemetry-sdk"] drivers-prompt-amazon-bedrock = ["anthropic", "boto3"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-anthropic = ["anthropic"] @@ -6574,4 +6798,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a49e3177bd216b5af2ffe2f213d1e2d8081f23ef33e4c71ecc16c673287823fa" +content-hash = "9bd25bfc6e645b80acebb1266659832642799443b5f7314dc42487f4e67f1e42" diff --git a/pyproject.toml b/pyproject.toml index fabce497e..510209d82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,11 @@ qdrant-client = { version = ">=1.9.1", optional = true } pusher = {version = "^3.3.2", optional = true} ollama = {version = "^0.2.1", optional = true} duckduckgo-search = {version = "^6.1.12", optional = true} +opentelemetry-sdk = {version = "^1.25.0", optional = true} +opentelemetry-api = {version = "^1.25.0", optional = true} +opentelemetry-instrumentation = {version = "^0.46b0", optional = true} +opentelemetry-instrumentation-threading = {version = "^0.46b0", optional = true} +opentelemetry-exporter-otlp-proto-http = {version = "^1.25.0", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -108,6 +113,21 @@ drivers-event-listener-pusher = ["pusher"] drivers-rerank-cohere = ["cohere"] +drivers-observability-opentelemetry = [ + "opentelemetry-sdk", + "opentelemetry-api", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-threading", + "opentelemetry-exporter-otlp-proto-http", +] +drivers-observability-griptape-cloud = [ + "opentelemetry-sdk", + "opentelemetry-api", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-threading", + "opentelemetry-exporter-otlp-proto-http", +] + loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] loaders-image = ["pillow"] @@ -142,6 +162,11 @@ all = [ "pusher", "ollama", "duckduckgo-search", + "opentelemetry-sdk", + "opentelemetry-api", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-threading", + "opentelemetry-exporter-otlp-proto-http", # loaders "pandas", diff --git a/tests/unit/common/test_observable.py b/tests/unit/common/test_observable.py new file mode 100644 index 000000000..f48c3086c --- /dev/null +++ b/tests/unit/common/test_observable.py @@ -0,0 +1,238 @@ +from unittest.mock import call + +import pytest + +import griptape.observability.observability as observability +from griptape.common.observable import Observable + + +class TestObservable: + @pytest.fixture() + def observe_spy(self, mocker): + return mocker.spy(observability.Observability, "observe") + + def test_observable_function_no_parenthesis(self, observe_spy): + from griptape.common import observable + + @observable + def bar(*args, **kwargs): + """Bar's docstring.""" + if args: + return args[0] + + assert bar() is None + assert bar("a") == "a" + assert bar("b", "2") == "b" + assert bar("c", x="y") == "c" + + original_bar = bar.__wrapped__ + assert bar.__name__ == original_bar.__name__ + assert bar.__name__ == "bar" + assert bar.__doc__ == original_bar.__doc__ + assert bar.__doc__ == "Bar's docstring." + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call(Observable.Call(func=original_bar, args=())), + call(Observable.Call(func=original_bar, args=("a",))), + call(Observable.Call(func=original_bar, args=("b", "2"))), + call(Observable.Call(func=original_bar, args=("c",), kwargs={"x": "y"})), + ] + ) + + def test_observable_function_empty_parenthesis(self, observe_spy): + from griptape.common import observable + + @observable() + def bar(*args, **kwargs): + if args: + return args[0] + + assert bar() is None + assert bar("a") == "a" + assert bar("b", "2") == "b" + assert bar("c", x="y") == "c" + + original_bar = bar.__wrapped__ + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call(Observable.Call(func=original_bar, args=())), + call(Observable.Call(func=original_bar, args=("a",))), + call(Observable.Call(func=original_bar, args=("b", "2"))), + call(Observable.Call(func=original_bar, args=("c",), kwargs={"x": "y"})), + ] + ) + + def test_observable_function_args(self, observe_spy): + from griptape.common import observable + + @observable("one", 2, {"th": "ree"}, a="b", b=6) + def bar(*args, **kwargs): + if args: + return args[0] + + assert bar() is None + assert bar("a") == "a" + assert bar("b", "2") == "b" + assert bar("c", x="y") == "c" + + original_bar = bar.__wrapped__ + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call( + Observable.Call( + func=original_bar, + args=(), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + args=("a",), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + args=("b", "2"), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + args=("c",), + kwargs={"x": "y"}, + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + ] + ) + + def test_observable_method_no_parenthesis(self, observe_spy): + from griptape.common import observable + + class Foo: + @observable + def bar(self, *args, **kwargs): + if args: + return args[0] + return None + + foo = Foo() + assert foo.bar() is None + assert foo.bar("a") == "a" + assert foo.bar("b", "2") == "b" + assert foo.bar("c", x="y") == "c" + + original_bar = foo.bar.__wrapped__ + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call(Observable.Call(func=original_bar, instance=foo, args=())), + call(Observable.Call(func=original_bar, instance=foo, args=("a",))), + call(Observable.Call(func=original_bar, instance=foo, args=("b", "2"))), + call(Observable.Call(func=original_bar, instance=foo, args=("c",), kwargs={"x": "y"})), + ] + ) + + def test_observable_method_empty_parenthesis(self, observe_spy): + from griptape.common import observable + + class Foo: + @observable() + def bar(self, *args, **kwargs): + if args: + return args[0] + return None + + foo = Foo() + assert foo.bar() is None + assert foo.bar("a") == "a" + assert foo.bar("b", "2") == "b" + assert foo.bar("c", x="y") == "c" + + original_bar = foo.bar.__wrapped__ + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call(Observable.Call(func=original_bar, instance=foo, args=())), + call(Observable.Call(func=original_bar, instance=foo, args=("a",))), + call(Observable.Call(func=original_bar, instance=foo, args=("b", "2"))), + call(Observable.Call(func=original_bar, instance=foo, args=("c",), kwargs={"x": "y"})), + ] + ) + + def test_observable_method_args(self, observe_spy): + from griptape.common import observable + + class Foo: + @observable("one", 2, {"th": "ree"}, a="b", b=6) + def bar(self, *args, **kwargs): + if args: + return args[0] + return None + + foo = Foo() + assert foo.bar() is None + assert foo.bar("a") == "a" + assert foo.bar("b", "2") == "b" + assert foo.bar("c", x="y") == "c" + + original_bar = foo.bar.__wrapped__ + + assert observe_spy.call_count == 4 + observe_spy.assert_has_calls( + [ + call( + Observable.Call( + func=original_bar, + instance=foo, + args=(), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + instance=foo, + args=("a",), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + instance=foo, + args=("b", "2"), + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + call( + Observable.Call( + func=original_bar, + instance=foo, + args=("c",), + kwargs={"x": "y"}, + decorator_args=("one", 2, {"th": "ree"}), + decorator_kwargs={"a": "b", "b": 6}, + ) + ), + ] + ) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index 5db78b76f..1cd198756 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -1,9 +1,10 @@ import os -from unittest.mock import Mock +from unittest.mock import MagicMock, Mock import pytest from griptape.drivers.event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver +from griptape.observability.observability import Observability from tests.mocks.mock_event import MockEvent @@ -42,6 +43,30 @@ def test_init(self, driver): assert driver.api_key == "foo bar" assert driver.structure_run_id == "bar baz" + def test_publish_event_without_span_id(self, mock_post, driver): + event = MockEvent() + driver.publish_event(event, flush=True) + + mock_post.assert_called_with( + url="https://cloud123.griptape.ai/api/structure-runs/bar baz/events", + json=[event.to_dict()], + headers={"Authorization": "Bearer foo bar"}, + ) + + def test_publish_event_with_span_id(self, mock_post, driver): + event = MockEvent() + observability_driver = MagicMock() + observability_driver.get_span_id.return_value = "test" + + with Observability(observability_driver=observability_driver): + driver.publish_event(event, flush=True) + + mock_post.assert_called_with( + url="https://cloud123.griptape.ai/api/structure-runs/bar baz/events", + json=[{**event.to_dict(), "span_id": "test"}], + headers={"Authorization": "Bearer foo bar"}, + ) + def test_try_publish_event_payload(self, mock_post, driver): event = MockEvent() driver.try_publish_event_payload(event.to_dict()) diff --git a/tests/unit/drivers/observability/__init__.py b/tests/unit/drivers/observability/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py b/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py new file mode 100644 index 000000000..f559a9077 --- /dev/null +++ b/tests/unit/drivers/observability/test_griptape_cloud_observability_driver.py @@ -0,0 +1,284 @@ +import os +from uuid import UUID + +import pytest +from opentelemetry.sdk.trace import Event, ReadableSpan +from opentelemetry.trace import SpanContext, Status, StatusCode + +from griptape.common import Observable +from griptape.drivers import GriptapeCloudObservabilityDriver +from tests.utils.expected_spans import ExpectedSpan, ExpectedSpans + + +class TestGriptapeCloudObservabilityDriver: + @pytest.fixture() + def driver(self): + environ = { + "GT_CLOUD_BASE_URL": "http://base-url:1234", + "GT_CLOUD_API_KEY": "api-key", + "GT_CLOUD_STRUCTURE_RUN_ID": "structure-run-id", + } + original_environ = {} + for key in environ: + original_environ[key] = environ.get(key) + os.environ[key] = environ[key] + + yield GriptapeCloudObservabilityDriver() + + for key, value in original_environ.items(): + if value is None: + del os.environ[key] + else: + os.environ[key] = value + + @pytest.fixture(autouse=True) + def mock_span_exporter_class(self, mocker): + return mocker.patch( + "griptape.drivers.observability.griptape_cloud_observability_driver.GriptapeCloudObservabilityDriver.SpanExporter" + ) + + @pytest.fixture() + def mock_span_exporter(self, mock_span_exporter_class): + return mock_span_exporter_class.return_value + + def test_init(self, mock_span_exporter_class, mock_span_exporter): + GriptapeCloudObservabilityDriver( + base_url="http://base-url:1234", api_key="api-key", structure_run_id="structure-run-id" + ) + + assert mock_span_exporter_class.call_count == 1 + mock_span_exporter_class.assert_called_once_with( + base_url="http://base-url:1234", + api_key="api-key", + headers={"Authorization": "Bearer api-key"}, + structure_run_id="structure-run-id", + ) + + mock_span_exporter.export.assert_not_called() + + def test_init_raises_when_structure_run_is_none(self): + with pytest.raises(ValueError, match="structure_run_id must be set"): + GriptapeCloudObservabilityDriver(structure_run_id=None) + + def test_context_manager_pass(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans(spans=[ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK)]) + + with driver: + pass + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with driver: + pass + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_pass_exc(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans(spans=[ExpectedSpan(name="main", parent=None, status_code=StatusCode.ERROR)]) + + with pytest.raises(Exception, match="Boom"), driver: + raise Exception("Boom") + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with pytest.raises(Exception, match="Boom"), driver: + raise Exception("Boom") + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_observe_exception(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK), + ExpectedSpan(name="func()", parent="main", status_code=StatusCode.OK), + ExpectedSpan(name="Klass.method()", parent="main", status_code=StatusCode.OK), + ] + ) + + def func(word: str): + return word + " you" + + class Klass: + def method(self, word: str): + return word + " yous" + + instance = Klass() + + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_observe(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK), + ExpectedSpan(name="func()", parent="main", status_code=StatusCode.OK), + ExpectedSpan(name="Klass.method()", parent="main", status_code=StatusCode.OK), + ] + ) + + def func(word: str): + return word + " you" + + class Klass: + def method(self, word: str): + return word + " yous" + + instance = Klass() + + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_get_span_id(self, driver): + assert driver.get_span_id() is None + with driver: + # Span ID's returned from GriptapeCloudObservabilityDriver should be valid UUIDs + assert self._is_valid_uuid(driver.get_span_id()) + + def _is_valid_uuid(self, val: str) -> bool: + try: + UUID(str(val)) + return True + except ValueError: + return False + + +class TestGriptapeCloudObservabilityDriverSpanExporter: + @pytest.fixture() + def mock_post(self, mocker): + return mocker.patch("requests.post") + + def test_span_exporter_export(self, mock_post): + exporter = GriptapeCloudObservabilityDriver.SpanExporter( + base_url="http://base-url:1234", + api_key="api-key", + headers={"Authorization": "Bearer api-key"}, + structure_run_id="structure-run-id", + ) + + exporter.export( + [ + ReadableSpan( + name="main", + parent=None, + context=SpanContext(trace_id=1, span_id=2, is_remote=False), + start_time=3000, + end_time=4000, + attributes={"key": "value"}, + ), + ReadableSpan( + name="thing-1", + parent=SpanContext(trace_id=1, span_id=2, is_remote=False), + context=SpanContext(trace_id=1, span_id=3, is_remote=False), + start_time=8000, + end_time=9000, + status=Status(status_code=StatusCode.OK), + ), + ReadableSpan( + name="thing-2", + parent=SpanContext(trace_id=1, span_id=2, is_remote=False), + context=SpanContext(trace_id=1, span_id=3, is_remote=False), + start_time=8000, + end_time=9000, + status=Status(status_code=StatusCode.ERROR), + events=[ + Event( + timestamp=10000, + name="exception", + attributes={ + "exception.type": "Exception", + "exception.message": "Boom", + "exception.stacktrace": "Traceback (most recent call last) ...", + }, + ) + ], + ), + ] + ) + + mock_post.assert_called_once_with( + url="http://base-url:1234/api/structure-runs/structure-run-id/spans", + json=[ + { + "trace_id": "00000000-0000-0000-0000-000000000001", + "span_id": "00000000-0000-0000-0000-000000000002", + "parent_id": None, + "name": "main", + "start_time": "1970-01-01T00:00:00.000003Z", + "end_time": "1970-01-01T00:00:00.000004Z", + "status": "UNSET", + "attributes": {"key": "value"}, + "events": [], + }, + { + "trace_id": "00000000-0000-0000-0000-000000000001", + "span_id": "00000000-0000-0000-0000-000000000003", + "parent_id": "00000000-0000-0000-0000-000000000002", + "name": "thing-1", + "start_time": "1970-01-01T00:00:00.000008Z", + "end_time": "1970-01-01T00:00:00.000009Z", + "status": "OK", + "attributes": {}, + "events": [], + }, + { + "trace_id": "00000000-0000-0000-0000-000000000001", + "span_id": "00000000-0000-0000-0000-000000000003", + "parent_id": "00000000-0000-0000-0000-000000000002", + "name": "thing-2", + "start_time": "1970-01-01T00:00:00.000008Z", + "end_time": "1970-01-01T00:00:00.000009Z", + "status": "ERROR", + "attributes": {}, + "events": [ + { + "timestamp": "1970-01-01T00:00:00.000010Z", + "name": "exception", + "attributes": { + "exception.type": "Exception", + "exception.message": "Boom", + "exception.stacktrace": "Traceback (most recent call last) ...", + }, + } + ], + }, + ], + headers={"Authorization": "Bearer api-key"}, + ) diff --git a/tests/unit/drivers/observability/test_no_op_observability_driver.py b/tests/unit/drivers/observability/test_no_op_observability_driver.py new file mode 100644 index 000000000..3a8cccc8d --- /dev/null +++ b/tests/unit/drivers/observability/test_no_op_observability_driver.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import pytest + +from griptape.common.observable import Observable +from griptape.drivers.observability.no_op_observability_driver import NoOpObservabilityDriver + + +class TestNoOpObservabilityDriver: + @pytest.fixture() + def driver(self): + return NoOpObservabilityDriver() + + def test_observe(self, driver): + def func(word: str): + return word + " you" + + class Klass: + def method(self, word: str): + return word + " yous" + + instance = Klass() + + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + def test_get_span_id(self, driver): + assert driver.get_span_id() is None + + with driver: + assert driver.get_span_id() is None diff --git a/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py new file mode 100644 index 000000000..b903fb1c9 --- /dev/null +++ b/tests/unit/drivers/observability/test_open_telemetry_observability_driver.py @@ -0,0 +1,197 @@ +from unittest.mock import MagicMock + +import pytest +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.trace import StatusCode + +from griptape.common import Observable +from griptape.drivers import OpenTelemetryObservabilityDriver +from griptape.observability.observability import Observability +from griptape.structures.agent import Agent +from tests.mocks.mock_prompt_driver import MockPromptDriver +from tests.utils.expected_spans import ExpectedSpan, ExpectedSpans + + +class TestOpenTelemetryObservabilityDriver: + @pytest.fixture() + def mock_span_exporter(self): + return MagicMock() + + @pytest.fixture() + def span_processor(self, mock_span_exporter): + return BatchSpanProcessor(mock_span_exporter) + + @pytest.fixture() + def driver(self, span_processor): + return OpenTelemetryObservabilityDriver(service_name="test", span_processor=span_processor) + + def test_init(self, span_processor): + OpenTelemetryObservabilityDriver(service_name="test", span_processor=span_processor) + + def test_context_manager_pass(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans(spans=[ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK)]) + + with driver: + pass + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with driver: + pass + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_exception(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ExpectedSpan(name="main", parent=None, status_code=StatusCode.ERROR, exception=Exception("Boom"))] + ) + + with pytest.raises(Exception, match="Boom"), driver: + raise Exception("Boom") + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with pytest.raises(Exception, match="Boom"), driver: + raise Exception("Boom") + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_observe(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK), + ExpectedSpan(name="func()", parent="main", status_code=StatusCode.OK), + ExpectedSpan(name="Klass.method()", parent="main", status_code=StatusCode.OK), + ] + ) + + def func(word: str): + return word + " you" + + class Klass: + def method(self, word: str): + return word + " yous" + + instance = Klass() + + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + # Works second time too + with driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_observe_exception_function(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.ERROR, exception=Exception("Boom func")), + ExpectedSpan( + name="func()", parent="main", status_code=StatusCode.ERROR, exception=Exception("Boom func") + ), + ] + ) + + def func(word: str): + raise Exception("Boom func") + + with pytest.raises(Exception, match="Boom func"), driver: + assert driver.observe(Observable.Call(func=func, instance=None, args=["Hi"])) == "Hi you" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + + def test_context_manager_observe_exception_method(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.ERROR, exception=Exception("Boom meth")), + ExpectedSpan( + name="Klass.method()", parent="main", status_code=StatusCode.ERROR, exception=Exception("Boom meth") + ), + ] + ) + + class Klass: + def method(self, word: str): + raise Exception("Boom meth") + + instance = Klass() + + # Works second time too + with pytest.raises(Exception, match="Boom meth"), driver: + assert driver.observe(Observable.Call(func=instance.method, instance=instance, args=["Bye"])) == "Bye yous" + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_observability_agent(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK), + ExpectedSpan(name="Agent.run()", parent="main", status_code=StatusCode.OK), + ExpectedSpan(name="Agent.before_run()", parent="Agent.run()", status_code=StatusCode.OK), + ExpectedSpan(name="Agent.try_run()", parent="Agent.run()", status_code=StatusCode.OK), + ExpectedSpan(name="MockPromptDriver.run()", parent="Agent.try_run()", status_code=StatusCode.OK), + ExpectedSpan(name="Agent.after_run()", parent="Agent.run()", status_code=StatusCode.OK), + ] + ) + + with Observability(observability_driver=driver): + agent = Agent(prompt_driver=MockPromptDriver()) + agent.run("Hi") + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_context_manager_observe_adds_tags_attribute(self, driver, mock_span_exporter): + expected_spans = ExpectedSpans( + spans=[ + ExpectedSpan(name="main", parent=None, status_code=StatusCode.OK), + ExpectedSpan( + name="func()", parent="main", status_code=StatusCode.OK, attributes={"tags": ("Foo.bar()",)} + ), + ] + ) + + def func(word: str): + return word + " you" + + with driver: + assert ( + driver.observe( + Observable.Call(func=func, instance=None, args=["Hi"], decorator_kwargs={"tags": ["Foo.bar()"]}) + ) + == "Hi you" + ) + + assert mock_span_exporter.export.call_count == 1 + mock_span_exporter.export.assert_called_with(expected_spans) + mock_span_exporter.export.reset_mock() + + def test_get_span_id(self, driver): + assert driver.get_span_id() is None + with driver: + span_id = driver.get_span_id() + assert span_id is not None + assert isinstance(span_id, str) diff --git a/tests/unit/observability/__init__.py b/tests/unit/observability/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/observability/test_observability.py b/tests/unit/observability/test_observability.py new file mode 100644 index 000000000..6ed87e6b5 --- /dev/null +++ b/tests/unit/observability/test_observability.py @@ -0,0 +1,50 @@ +from unittest.mock import MagicMock + +import pytest + +import griptape.observability.observability as observability +from griptape.observability.observability import Observability + + +class TestObservability: + @pytest.fixture() + def mock_observability_driver(self): + return MagicMock() + + def test_init(self, mock_observability_driver): + assert observability._global_observability_driver is None + + Observability(observability_driver=mock_observability_driver) + + assert observability._global_observability_driver is None + + def test_context_manager(self, mock_observability_driver): + assert observability._global_observability_driver is None + + with Observability(observability_driver=mock_observability_driver): + assert observability._global_observability_driver is mock_observability_driver + mock_observability_driver.__enter__.assert_called_once_with() + + mock_observability_driver.__exit__.assert_called_once_with(None, None, None) + + assert observability._global_observability_driver is None + + def test_context_manager_exception(self, mock_observability_driver): + assert observability._global_observability_driver is None + + with pytest.raises(Exception, match="Boom") as e: # noqa: PT012, SIM117 + with Observability(observability_driver=mock_observability_driver): + assert observability._global_observability_driver is mock_observability_driver + mock_observability_driver.__enter__.assert_called_once_with() + raise Exception("Boom") + + mock_observability_driver.__exit__.assert_called_once_with(*e._excinfo) + assert observability._global_observability_driver is None + + def test_nested_context_manager_raises_exception(self, mock_observability_driver): + assert observability._global_observability_driver is None + + with pytest.raises(Exception, match="Observability driver already set."), Observability( + observability_driver=mock_observability_driver + ), Observability(observability_driver=mock_observability_driver): + pass diff --git a/tests/utils/expected_spans.py b/tests/utils/expected_spans.py new file mode 100644 index 000000000..98cb645db --- /dev/null +++ b/tests/utils/expected_spans.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional + +from attrs import define, field +from opentelemetry.trace import SpanKind, StatusCode + +if TYPE_CHECKING: + from collections.abc import Sequence + + from opentelemetry.sdk.trace import ReadableSpan + + +@define +class ExpectedSpan: + name: str = field(kw_only=True) + parent: str = field(kw_only=True) + status_code: StatusCode = field(kw_only=True) + exception: Optional[Exception] = field(default=None, kw_only=True) + attributes: Optional[dict] = field(default=None, kw_only=True) + + +@define +class ExpectedSpans: + spans: list[ExpectedSpan] = field(kw_only=True) + + def __eq__(self, other_spans: Sequence[ReadableSpan]) -> bool: # noqa: C901 + # Has expected spans + span_names = [span.name for span in self.spans] + other_span_names = [span.name for span in other_spans] + if sorted(other_span_names) != sorted(span_names): + raise Exception(f"Expected spans {other_span_names} not found. Found: {span_names}") + + # Has valid trace id + trace_id = other_spans[0].context.trace_id + if not trace_id: + raise Exception(f"Trace id is not set on span {other_spans[0].name}") + + for span in other_spans: + # All have same trace id + if span.context.trace_id != trace_id: + raise Exception(f"Span {span.name} has different trace id than the rest") + + # All have kind set to internal + if span.kind != SpanKind.INTERNAL: + raise Exception(f"Span {span.name} is not of kind INTERNAL") + + other_span_by_name = {span.name: span for span in other_spans} + span_by_name = {span.name: span for span in self.spans} + expected_status_codes = {span.name: span.status_code for span in self.spans} + for span_name, status_code in expected_status_codes.items(): + span = other_span_by_name[span_name] + actual_status_code = span.status.status_code + if actual_status_code != status_code: + raise Exception(f"Span {span_name} has code {actual_status_code} instead of {status_code}") + + exception = span_by_name[span_name].exception + if exception: + event = span.events[0] + exc_type = event.attributes.get("exception.type") + exc_message = event.attributes.get("exception.message") + exc_stacktrace = event.attributes.get("exception.stacktrace") + + if exc_type != "Exception": + raise Exception(f"Span {span_name} does not have exception type Exception") + if exc_message != str(exception): + raise Exception(f"Span {span_name} does not have exception message {exception}") + if not exc_stacktrace: + raise Exception(f"Span {span_name} has no stacktrace") + + expected_parents = {span.name: span.parent for span in self.spans} + for child, parent in expected_parents.items(): + actual_parent = other_span_by_name[child].parent.span_id if other_span_by_name[child].parent else None + expected_parent = parent and other_span_by_name[parent].context.span_id + if actual_parent != expected_parent: + raise Exception(f"Span {child} has wrong parent") + + expected_attributes_by_span_name = {span.name: span.attributes for span in self.spans} + for span_name, expected_attributes in expected_attributes_by_span_name.items(): + other_span = other_span_by_name[span_name] + if expected_attributes is not None and other_span.attributes != expected_attributes: + raise Exception( + f"Span {span_name} has attributes {other_span.attributes} instead of {expected_attributes}" + ) + + return True From 2c86a25365eac8cfa25e3662c228d97800224fbf Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Wed, 17 Jul 2024 14:08:34 -0700 Subject: [PATCH 173/238] Add pep8-naming ruff rule (#993) --- CHANGELOG.md | 1 + docs/griptape-framework/structures/config.md | 2 +- .../dummy_audio_transcription_driver.py | 4 ++-- .../embedding/dummy_embedding_driver.py | 4 ++-- .../dummy_image_generation_driver.py | 10 ++++---- .../image_query/dummy_image_query_driver.py | 4 ++-- .../drivers/prompt/dummy_prompt_driver.py | 6 ++--- .../drivers/prompt/google_prompt_driver.py | 23 +++++++++---------- .../dummy_text_to_speech_driver.py | 4 ++-- .../vector/dummy_vector_store_driver.py | 12 +++++----- .../vector/pgvector_vector_store_driver.py | 7 +++--- .../vector/redis_vector_store_driver.py | 4 ++-- .../markdownify_web_scraper_driver.py | 8 +++---- griptape/exceptions/__init__.py | 4 ++-- griptape/exceptions/dummy_exception.py | 2 +- griptape/loaders/image_loader.py | 6 ++--- griptape/loaders/pdf_loader.py | 4 ++-- griptape/schemas/base_schema.py | 20 ++++++---------- griptape/tokenizers/dummy_tokenizer.py | 4 ++-- griptape/utils/import_utils.py | 4 ++-- pyproject.toml | 1 + .../embedding/test_dummy_embedding_driver.py | 4 ++-- .../test_dummy_image_generation_driver.py | 10 ++++---- .../test_dummy_image_query_driver.py | 4 ++-- .../prompt/test_dummy_prompt_driver.py | 6 ++--- .../vector/test_dummy_vector_store_driver.py | 12 +++++----- tests/unit/tokenizers/test_dummy_tokenizer.py | 6 ++--- 27 files changed, 85 insertions(+), 91 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f636f548a..3ab0563f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `BaseVectorStoreDriver.query` optional arguments are now keyword-only arguments. - **BREAKING**: `EventListener.publish_event`'s `flush` argument is now a keyword-only argument. - **BREAKING**: `BaseEventListenerDriver.publish_event`'s `flush` argument is now a keyword-only argument. +- **BREAKING**: Renamed `DummyException` to `DummyError` for pep8 naming compliance. - Removed unnecessary `transformers` dependency in `drivers-prompt-huggingface` extra. - Removed unnecessary `huggingface-hub` dependency in `drivers-prompt-huggingface-pipeline` extra. diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 969163bf6..ef4bc4864 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -111,7 +111,7 @@ agent = Agent(config=CohereStructureConfig(api_key=os.environ["COHERE_API_KEY"]) ### Custom Configs You can create your own [StructureConfig](../../reference/griptape/config/structure_config.md) by overriding relevant Drivers. -The [StructureConfig](../../reference/griptape/config/structure_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyException](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. +The [StructureConfig](../../reference/griptape/config/structure_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations. ```python diff --git a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py index 9fc44b4b9..c42b21c19 100644 --- a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py +++ b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.drivers import BaseAudioTranscriptionDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError if TYPE_CHECKING: from griptape.artifacts import AudioArtifact, TextArtifact @@ -16,4 +16,4 @@ class DummyAudioTranscriptionDriver(BaseAudioTranscriptionDriver): model: str = field(init=False) def try_run(self, audio: AudioArtifact, prompts: Optional[list] = None) -> TextArtifact: - raise DummyException(__class__.__name__, "try_transcription") + raise DummyError(__class__.__name__, "try_transcription") diff --git a/griptape/drivers/embedding/dummy_embedding_driver.py b/griptape/drivers/embedding/dummy_embedding_driver.py index 09171060e..cac8b2418 100644 --- a/griptape/drivers/embedding/dummy_embedding_driver.py +++ b/griptape/drivers/embedding/dummy_embedding_driver.py @@ -3,7 +3,7 @@ from attrs import define, field from griptape.drivers import BaseEmbeddingDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError @define @@ -11,4 +11,4 @@ class DummyEmbeddingDriver(BaseEmbeddingDriver): model: None = field(init=False, default=None, kw_only=True) def try_embed_chunk(self, chunk: str) -> list[float]: - raise DummyException(__class__.__name__, "try_embed_chunk") + raise DummyError(__class__.__name__, "try_embed_chunk") diff --git a/griptape/drivers/image_generation/dummy_image_generation_driver.py b/griptape/drivers/image_generation/dummy_image_generation_driver.py index 9d668c5b2..ec9346841 100644 --- a/griptape/drivers/image_generation/dummy_image_generation_driver.py +++ b/griptape/drivers/image_generation/dummy_image_generation_driver.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.drivers import BaseImageGenerationDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError if TYPE_CHECKING: from griptape.artifacts import ImageArtifact @@ -16,7 +16,7 @@ class DummyImageGenerationDriver(BaseImageGenerationDriver): model: None = field(init=False, default=None, kw_only=True) def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: - raise DummyException(__class__.__name__, "try_text_to_image") + raise DummyError(__class__.__name__, "try_text_to_image") def try_image_variation( self, @@ -24,7 +24,7 @@ def try_image_variation( image: ImageArtifact, negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: - raise DummyException(__class__.__name__, "try_image_variation") + raise DummyError(__class__.__name__, "try_image_variation") def try_image_inpainting( self, @@ -33,7 +33,7 @@ def try_image_inpainting( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: - raise DummyException(__class__.__name__, "try_image_inpainting") + raise DummyError(__class__.__name__, "try_image_inpainting") def try_image_outpainting( self, @@ -42,4 +42,4 @@ def try_image_outpainting( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, ) -> ImageArtifact: - raise DummyException(__class__.__name__, "try_image_outpainting") + raise DummyError(__class__.__name__, "try_image_outpainting") diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index 1df1c4c65..62820efd7 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.drivers import BaseImageQueryDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError if TYPE_CHECKING: from griptape.artifacts import ImageArtifact, TextArtifact @@ -17,4 +17,4 @@ class DummyImageQueryDriver(BaseImageQueryDriver): max_tokens: None = field(init=False, default=None, kw_only=True) def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: - raise DummyException(__class__.__name__, "try_query") + raise DummyError(__class__.__name__, "try_query") diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index 9ed1f45ec..377630531 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -6,7 +6,7 @@ from griptape.common import observable from griptape.drivers import BasePromptDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError from griptape.tokenizers import DummyTokenizer if TYPE_CHECKING: @@ -22,8 +22,8 @@ class DummyPromptDriver(BasePromptDriver): @observable def try_run(self, prompt_stack: PromptStack) -> Message: - raise DummyException(__class__.__name__, "try_run") + raise DummyError(__class__.__name__, "try_run") @observable def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: - raise DummyException(__class__.__name__, "try_stream") + raise DummyError(__class__.__name__, "try_stream") diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 3a32ebca7..8256ba6eb 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -113,19 +113,18 @@ def try_stream(self, prompt_stack: PromptStack) -> Iterator[DeltaMessage]: ) def _base_params(self, prompt_stack: PromptStack) -> dict: - GenerationConfig = import_optional_dependency("google.generativeai.types").GenerationConfig - ContentDict = import_optional_dependency("google.generativeai.types").ContentDict - Part = import_optional_dependency("google.generativeai.protos").Part + types = import_optional_dependency("google.generativeai.types") + protos = import_optional_dependency("google.generativeai.protos") system_messages = prompt_stack.system_messages if system_messages: - self.model_client._system_instruction = ContentDict( + self.model_client._system_instruction = types.ContentDict( role="system", - parts=[Part(text=system_message.to_text()) for system_message in system_messages], + parts=[protos.Part(text=system_message.to_text()) for system_message in system_messages], ) return { - "generation_config": GenerationConfig( + "generation_config": types.GenerationConfig( **{ # For some reason, providing stop sequences when streaming breaks native functions # https://github.com/google-gemini/generative-ai-python/issues/446 @@ -153,10 +152,10 @@ def _default_model_client(self) -> GenerativeModel: return genai.GenerativeModel(self.model) def __to_google_messages(self, prompt_stack: PromptStack) -> ContentsType: - ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + types = import_optional_dependency("google.generativeai.types") inputs = [ - ContentDict( + types.ContentDict( { "role": self.__to_google_role(message), "parts": [self.__to_google_message_content(content) for content in message.content], @@ -175,7 +174,7 @@ def __to_google_role(self, message: Message) -> str: return "user" def __to_google_tools(self, tools: list[BaseTool]) -> list[dict]: - FunctionDeclaration = import_optional_dependency("google.generativeai.types").FunctionDeclaration + types = import_optional_dependency("google.generativeai.types") tool_declarations = [] for tool in tools: @@ -186,7 +185,7 @@ def __to_google_tools(self, tools: list[BaseTool]) -> list[dict]: schema = schema["properties"]["values"] schema = remove_key_in_dict_recursively(schema, "additionalProperties") - tool_declaration = FunctionDeclaration( + tool_declaration = types.FunctionDeclaration( name=tool.to_native_tool_name(activity), description=tool.activity_description(activity), parameters={ @@ -201,13 +200,13 @@ def __to_google_tools(self, tools: list[BaseTool]) -> list[dict]: return tool_declarations def __to_google_message_content(self, content: BaseMessageContent) -> ContentDict | Part | str: - ContentDict = import_optional_dependency("google.generativeai.types").ContentDict + types = import_optional_dependency("google.generativeai.types") protos = import_optional_dependency("google.generativeai.protos") if isinstance(content, TextMessageContent): return content.artifact.to_text() elif isinstance(content, ImageMessageContent): - return ContentDict(mime_type=content.artifact.mime_type, data=content.artifact.value) + return types.ContentDict(mime_type=content.artifact.mime_type, data=content.artifact.value) elif isinstance(content, ActionCallMessageContent): action = content.artifact.value diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py index 6472bdff8..0f5842bfe 100644 --- a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.drivers import BaseTextToSpeechDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError if TYPE_CHECKING: from griptape.artifacts.audio_artifact import AudioArtifact @@ -16,4 +16,4 @@ class DummyTextToSpeechDriver(BaseTextToSpeechDriver): model: None = field(init=False, default=None, kw_only=True) def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: - raise DummyException(__class__.__name__, "try_text_to_audio") + raise DummyError(__class__.__name__, "try_text_to_audio") diff --git a/griptape/drivers/vector/dummy_vector_store_driver.py b/griptape/drivers/vector/dummy_vector_store_driver.py index 4dbb6c038..3bbfbd304 100644 --- a/griptape/drivers/vector/dummy_vector_store_driver.py +++ b/griptape/drivers/vector/dummy_vector_store_driver.py @@ -5,7 +5,7 @@ from attrs import Factory, define, field from griptape.drivers import BaseEmbeddingDriver, BaseVectorStoreDriver, DummyEmbeddingDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError @define() @@ -17,7 +17,7 @@ class DummyVectorStoreDriver(BaseVectorStoreDriver): ) def delete_vector(self, vector_id: str) -> None: - raise DummyException(__class__.__name__, "delete_vector") + raise DummyError(__class__.__name__, "delete_vector") def upsert_vector( self, @@ -27,13 +27,13 @@ def upsert_vector( meta: Optional[dict] = None, **kwargs, ) -> str: - raise DummyException(__class__.__name__, "upsert_vector") + raise DummyError(__class__.__name__, "upsert_vector") def load_entry(self, vector_id: str, *, namespace: Optional[str] = None) -> Optional[BaseVectorStoreDriver.Entry]: - raise DummyException(__class__.__name__, "load_entry") + raise DummyError(__class__.__name__, "load_entry") def load_entries(self, *, namespace: Optional[str] = None) -> list[BaseVectorStoreDriver.Entry]: - raise DummyException(__class__.__name__, "load_entries") + raise DummyError(__class__.__name__, "load_entries") def query( self, @@ -44,4 +44,4 @@ def query( include_vectors: bool = False, **kwargs, ) -> list[BaseVectorStoreDriver.Entry]: - raise DummyException(__class__.__name__, "query") + raise DummyError(__class__.__name__, "query") diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index f82a5e3ac..ec266030a 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -180,15 +180,14 @@ def query( ] def default_vector_model(self) -> Any: - Vector = import_optional_dependency("pgvector.sqlalchemy").Vector - Base = declarative_base() + sqlalchemy = import_optional_dependency("pgvector.sqlalchemy") @dataclass - class VectorModel(Base): + class VectorModel(declarative_base()): __tablename__ = self.table_name id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) - vector = Column(Vector()) + vector = Column(sqlalchemy.Vector()) namespace = Column(String) meta = Column(JSON) diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 7d262f05d..06aa853c6 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -124,13 +124,13 @@ def query( Returns: A list of BaseVectorStoreDriver.Entry objects, each encapsulating the retrieved vector, its similarity score, metadata, and namespace. """ - Query = import_optional_dependency("redis.commands.search.query").Query + search_query = import_optional_dependency("redis.commands.search.query") vector = self.embedding_driver.embed_string(query) filter_expression = f"(@namespace:{{{namespace}}})" if namespace else "*" query_expression = ( - Query(f"{filter_expression}=>[KNN {count or 10} @vector $vector as score]") + search_query.Query(f"{filter_expression}=>[KNN {count or 10} @vector $vector as score]") .sort_by("score") .return_fields("id", "score", "metadata", "vec_string") .paging(0, count or 10) diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 6e25ca3b6..556d5e06e 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -40,14 +40,14 @@ class MarkdownifyWebScraperDriver(BaseWebScraperDriver): def scrape_url(self, url: str) -> TextArtifact: sync_playwright = import_optional_dependency("playwright.sync_api").sync_playwright - BeautifulSoup = import_optional_dependency("bs4").BeautifulSoup - MarkdownConverter = import_optional_dependency("markdownify").MarkdownConverter + bs4 = import_optional_dependency("bs4") + markdownify = import_optional_dependency("markdownify") include_links = self.include_links # Custom MarkdownConverter to optionally linked urls. If include_links is False only # the text of the link is returned. - class OptionalLinksMarkdownConverter(MarkdownConverter): + class OptionalLinksMarkdownConverter(markdownify.MarkdownConverter): def convert_a(self, el: Any, text: str, convert_as_inline: Any) -> str: if include_links: return super().convert_a(el, text, convert_as_inline) @@ -75,7 +75,7 @@ def skip_loading_images(route: Any) -> Any: if not content: raise Exception("can't access URL") - soup = BeautifulSoup(content, "html.parser") + soup = bs4.BeautifulSoup(content, "html.parser") # Remove unwanted elements exclude_selector = ",".join( diff --git a/griptape/exceptions/__init__.py b/griptape/exceptions/__init__.py index 5c8e6920b..80d5081ed 100644 --- a/griptape/exceptions/__init__.py +++ b/griptape/exceptions/__init__.py @@ -1,3 +1,3 @@ -from .dummy_exception import DummyException +from .dummy_exception import DummyError -__all__ = ["DummyException"] +__all__ = ["DummyError"] diff --git a/griptape/exceptions/dummy_exception.py b/griptape/exceptions/dummy_exception.py index 3b4de955a..815cb245f 100644 --- a/griptape/exceptions/dummy_exception.py +++ b/griptape/exceptions/dummy_exception.py @@ -1,4 +1,4 @@ -class DummyException(Exception): +class DummyError(Exception): def __init__(self, dummy_class_name: str, dummy_method_name: str) -> None: message = ( f"You have attempted to use a {dummy_class_name}'s {dummy_method_name} method. " diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index 90048abc1..b7a277edb 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -32,14 +32,14 @@ class ImageLoader(BaseLoader): } def load(self, source: bytes, *args, **kwargs) -> ImageArtifact: - Image = import_optional_dependency("PIL.Image") - image = Image.open(BytesIO(source)) + pil_image = import_optional_dependency("PIL.Image") + image = pil_image.open(BytesIO(source)) # Normalize format only if requested. if self.format is not None: byte_stream = BytesIO() image.save(byte_stream, format=self.format) - image = Image.open(byte_stream) + image = pil_image.open(byte_stream) source = byte_stream.getvalue() image_artifact = ImageArtifact(source, format=image.format.lower(), width=image.width, height=image.height) diff --git a/griptape/loaders/pdf_loader.py b/griptape/loaders/pdf_loader.py index 0dfb959cf..b38e2cd77 100644 --- a/griptape/loaders/pdf_loader.py +++ b/griptape/loaders/pdf_loader.py @@ -27,8 +27,8 @@ def load( *args, **kwargs, ) -> ErrorArtifact | list[TextArtifact]: - PdfReader = import_optional_dependency("pypdf").PdfReader - reader = PdfReader(BytesIO(source), strict=True, password=password) + pypdf = import_optional_dependency("pypdf") + reader = pypdf.PdfReader(BytesIO(source), strict=True, password=password) return self._text_to_artifacts("\n".join([p.extract_text() for p in reader.pages])) def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, ErrorArtifact | list[TextArtifact]]: diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 0bf7c4760..9fd7c22db 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -67,9 +67,9 @@ def _get_field_for_type(cls, field_type: type) -> fields.Field | fields.Nested: else: raise ValueError(f"Missing type for list field: {field_type}") else: - FieldClass = cls.DATACLASS_TYPE_MAPPING[field_class] + field_class = cls.DATACLASS_TYPE_MAPPING[field_class] - return FieldClass(allow_none=optional) + return field_class(allow_none=optional) @classmethod def _get_field_type_info(cls, field_type: type) -> tuple[type, tuple[type, ...], bool]: @@ -131,14 +131,6 @@ def _resolve_types(cls, attrs_cls: type) -> None: from griptape.tools import BaseTool from griptape.utils.import_utils import import_optional_dependency, is_dependency_installed - boto3 = import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any - Client = import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any - GenerativeModel = ( - import_optional_dependency("google.generativeai").GenerativeModel - if is_dependency_installed("google.generativeai") - else Any - ) - attrs.resolve_types( attrs_cls, localns={ @@ -163,9 +155,11 @@ def _resolve_types(cls, attrs_cls: type) -> None: "Run": Run, "Sequence": Sequence, # Third party modules - "Client": Client, - "GenerativeModel": GenerativeModel, - "boto3": boto3, + "Client": import_optional_dependency("cohere").Client if is_dependency_installed("cohere") else Any, + "GenerativeModel": import_optional_dependency("google.generativeai").GenerativeModel + if is_dependency_installed("google.generativeai") + else Any, + "boto3": import_optional_dependency("boto3") if is_dependency_installed("boto3") else Any, }, ) diff --git a/griptape/tokenizers/dummy_tokenizer.py b/griptape/tokenizers/dummy_tokenizer.py index b13b1fecb..978d423c0 100644 --- a/griptape/tokenizers/dummy_tokenizer.py +++ b/griptape/tokenizers/dummy_tokenizer.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError from griptape.tokenizers import BaseTokenizer @@ -15,4 +15,4 @@ class DummyTokenizer(BaseTokenizer): max_output_tokens: int = field(init=False, default=0, kw_only=True) def count_tokens(self, text: str) -> int: - raise DummyException(__class__.__name__, "count_tokens") + raise DummyError(__class__.__name__, "count_tokens") diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index f0a8c205d..ce9173231 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -1,7 +1,7 @@ from __future__ import annotations from importlib import import_module -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING if TYPE_CHECKING: from types import ModuleType @@ -14,7 +14,7 @@ } -def import_optional_dependency(name: str) -> Optional[ModuleType]: +def import_optional_dependency(name: str) -> ModuleType: """Import an optional dependency. If a dependency is missing, an ImportError with a nice message will be raised. diff --git a/pyproject.toml b/pyproject.toml index 510209d82..1e7a7cf33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -241,6 +241,7 @@ select = [ "ANN", # flake8-annotations "FBT", # flake8-boolean-trap "PT", # flake8-pytest-style + "N" # pep8-naming ] ignore = [ "UP007", # non-pep604-annotation diff --git a/tests/unit/drivers/embedding/test_dummy_embedding_driver.py b/tests/unit/drivers/embedding/test_dummy_embedding_driver.py index af56ce6ac..bafb4fc9a 100644 --- a/tests/unit/drivers/embedding/test_dummy_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_dummy_embedding_driver.py @@ -1,7 +1,7 @@ import pytest from griptape.drivers import DummyEmbeddingDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError class TestDummyEmbeddingDriver: @@ -13,5 +13,5 @@ def test_init(self, embedding_driver): assert embedding_driver def test_try_embed_chunk(self, embedding_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): embedding_driver.try_embed_chunk("prompt-stack") diff --git a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py index 2df6c6499..118bd778a 100644 --- a/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_dummy_image_generation_driver.py @@ -2,7 +2,7 @@ from griptape.artifacts import ImageArtifact from griptape.drivers import DummyImageGenerationDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError class TestDummyImageGenerationDriver: @@ -14,11 +14,11 @@ def test_init(self, image_generation_driver): assert image_generation_driver def test_text_to_image(self, image_generation_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): image_generation_driver.try_text_to_image("prompt-stack") def test_try_image_variation(self, image_generation_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): image_generation_driver.try_image_variation( "prompt-stack", ImageArtifact(value=b"", width=100, height=100, format="png"), @@ -26,7 +26,7 @@ def test_try_image_variation(self, image_generation_driver): ) def test_try_image_inpainting(self, image_generation_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): image_generation_driver.try_image_inpainting( "prompt-stack", ImageArtifact(value=b"", width=100, height=100, format="png"), @@ -34,7 +34,7 @@ def test_try_image_inpainting(self, image_generation_driver): ) def test_try_image_outpainting(self, image_generation_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): image_generation_driver.try_image_outpainting( "prompt-stack", ImageArtifact(value=b"", width=100, height=100, format="png"), diff --git a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py index 02b69595f..9da59c435 100644 --- a/tests/unit/drivers/image_query/test_dummy_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_dummy_image_query_driver.py @@ -2,7 +2,7 @@ from griptape.artifacts import ImageArtifact from griptape.drivers import DummyImageQueryDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError class TestDummyImageQueryDriver: @@ -14,5 +14,5 @@ def test_init(self, image_query_driver): assert image_query_driver def test_try_query(self, image_query_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): image_query_driver.try_query("Prompt", [ImageArtifact(value=b"", width=100, height=100, format="png")]) diff --git a/tests/unit/drivers/prompt/test_dummy_prompt_driver.py b/tests/unit/drivers/prompt/test_dummy_prompt_driver.py index 203bad3d5..2758b909b 100644 --- a/tests/unit/drivers/prompt/test_dummy_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_dummy_prompt_driver.py @@ -1,7 +1,7 @@ import pytest from griptape.drivers import DummyPromptDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError class TestDummyPromptDriver: @@ -13,9 +13,9 @@ def test_init(self, prompt_driver): assert prompt_driver def test_try_run(self, prompt_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): prompt_driver.try_run("prompt-stack") def test_try_stream_run(self, prompt_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): prompt_driver.try_run("prompt-stack") diff --git a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py index df4867212..3cde52ebc 100644 --- a/tests/unit/drivers/vector/test_dummy_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_dummy_vector_store_driver.py @@ -1,7 +1,7 @@ import pytest from griptape.drivers import DummyVectorStoreDriver -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError class TestDummyVectorStoreDriver: @@ -10,21 +10,21 @@ def vector_store_driver(self): return DummyVectorStoreDriver() def test_delete_vector(self, vector_store_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): vector_store_driver.delete_vector("foo bar huzzah") def test_upsert_vector(self, vector_store_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): vector_store_driver.upsert_vector("foo bar huzzah") def test_load_entry(self, vector_store_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): vector_store_driver.load_entry("foo bar huzzah") def test_load_entries(self, vector_store_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): vector_store_driver.load_entries(namespace="foo bar huzzah") def test_query(self, vector_store_driver): - with pytest.raises(DummyException): + with pytest.raises(DummyError): vector_store_driver.query("foo bar huzzah") diff --git a/tests/unit/tokenizers/test_dummy_tokenizer.py b/tests/unit/tokenizers/test_dummy_tokenizer.py index 5d770d1aa..7edfd6e40 100644 --- a/tests/unit/tokenizers/test_dummy_tokenizer.py +++ b/tests/unit/tokenizers/test_dummy_tokenizer.py @@ -1,6 +1,6 @@ import pytest -from griptape.exceptions import DummyException +from griptape.exceptions import DummyError from griptape.tokenizers import DummyTokenizer @@ -10,9 +10,9 @@ def tokenizer(self): return DummyTokenizer() def test_token_count(self, tokenizer): - with pytest.raises(DummyException): + with pytest.raises(DummyError): tokenizer.count_tokens("foo bar huzzah") def test_tokens_left(self, tokenizer): - with pytest.raises(DummyException): + with pytest.raises(DummyError): tokenizer.count_tokens("foo bar huzzah") From 362fac0be9fb869c947e974c2ff8734fd5b8633c Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 18 Jul 2024 09:46:09 -0700 Subject: [PATCH 174/238] Add generic artifact (#983) --- CHANGELOG.md | 1 + docs/examples/talk-to-a-video.md | 77 ++++++++++++++++++ griptape/artifacts/__init__.py | 2 + griptape/artifacts/generic_artifact.py | 15 ++++ griptape/common/__init__.py | 2 + .../contents/generic_message_content.py | 21 +++++ griptape/common/prompt_stack/prompt_stack.py | 5 +- .../drivers/prompt/google_prompt_driver.py | 4 +- griptape/schemas/base_schema.py | 16 ++-- griptape/tasks/prompt_task.py | 2 + mkdocs.yml | 1 + tests/resources/griptape-comfyui.mp4 | Bin 0 -> 4667824 bytes tests/unit/artifacts/test_generic_artifact.py | 27 ++++++ tests/unit/common/test_prompt_stack.py | 11 ++- .../prompt/test_google_prompt_driver.py | 4 +- 15 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 docs/examples/talk-to-a-video.md create mode 100644 griptape/artifacts/generic_artifact.py create mode 100644 griptape/common/prompt_stack/contents/generic_message_content.py create mode 100644 tests/resources/griptape-comfyui.mp4 create mode 100644 tests/unit/artifacts/test_generic_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ab0563f3..79e3dd5db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `GriptapeCloudObservabilityDriver` for sending observability data to Griptape Cloud. - `Observability` context manager for enabling observability and configuring which Observability Driver to use. - `@observable` decorator for selecting which functions/methods to provide observability for. +- `GenericArtifact` for storing any data. ### Changed - **BREAKING**: `BaseVectorStoreDriver.upsert_text_artifacts` optional arguments are now keyword-only arguments. diff --git a/docs/examples/talk-to-a-video.md b/docs/examples/talk-to-a-video.md new file mode 100644 index 000000000..9673bd1c3 --- /dev/null +++ b/docs/examples/talk-to-a-video.md @@ -0,0 +1,77 @@ +We can use Google Gemini's [native video input](https://ai.google.dev/gemini-api/docs/vision?lang=python#prompting-video) capabilities to ask questions about [a video](https://www.youtube.com/watch?v=XXuIBHO4qa8). +In this example, we upload a video file using Gemini's file API, and then pass the result using the [GenericArtifact](../reference/griptape/artifacts/generic_artifact.md) to the Agent. +Note that because we are using Gemini-specific features, this will not work with other [Prompt Drivers](../griptape-framework/drivers/prompt-drivers.md). + +```python +import time +from griptape.structures import Agent +from griptape.tasks import PromptTask +from griptape.artifacts import GenericArtifact, TextArtifact +from griptape.config import GoogleStructureConfig +import google.generativeai as genai + +video_file = genai.upload_file(path="tests/resources/griptape-comfyui.mp4") +while video_file.state.name == "PROCESSING": + time.sleep(2) + video_file = genai.get_file(video_file.name) + +if video_file.state.name == "FAILED": + raise ValueError(video_file.state.name) + +agent = Agent( + config=GoogleStructureConfig(), + input=[ + GenericArtifact(video_file), + TextArtifact("Answer this question regarding the video: {{ args[0] }}"), + ] +) + +agent.run("Are there any scenes that show a character with earings?") +agent.run("What happens in the scene starting at 19 seconds?") +``` + +``` +[07/15/24 11:27:17] INFO PromptTask 765a4a2833a34084b0077fb49c948ace + Input: genai.File({ + 'name': 'files/zzqllezrzmz7', + 'display_name': 'griptape-comfyui.mp4', + 'mime_type': 'video/mp4', + 'sha256_hash': 'ODk5ZDIxMzQwMGZjYTJkNWU3OTY3YjgzZmUxNzg1ZTNmYzc2YTAxMzgxMWIzYWQyMTBjNzM4ODc5MjU1ZmFmNQ==', + 'size_bytes': '4667824', + 'state': 'ACTIVE', + 'uri': 'https://generativelanguage.googleapis.com/v1beta/files/zzqllezrzmz7', + 'video_metadata': {'video_duration': '36s'}, + 'create_time': '2024-07-15T18:27:14.692475Z', + 'expiration_time': '2024-07-17T18:27:14.625351853Z', + 'update_time': '2024-07-15T18:27:16.179456Z'}) + + Are there any scenes that show a character with earings? +[07/15/24 11:27:21] INFO PromptTask 765a4a2833a34084b0077fb49c948ace + Output: Yes, there are a few scenes that show characters with earrings: + + * **0:10-0:15:** A woman with short, dark hair and facial tattoos is shown wearing large hoop earrings. + * **0:23:** A woman with short, dark hair and facial tattoos is shown wearing large hoop earrings. + + Let me know if you have any other questions about the video! + + INFO PromptTask 765a4a2833a34084b0077fb49c948ace + Input: genai.File({ + 'name': 'files/zzqllezrzmz7', + 'display_name': 'griptape-comfyui.mp4', + 'mime_type': 'video/mp4', + 'sha256_hash': 'ODk5ZDIxMzQwMGZjYTJkNWU3OTY3YjgzZmUxNzg1ZTNmYzc2YTAxMzgxMWIzYWQyMTBjNzM4ODc5MjU1ZmFmNQ==', + 'size_bytes': '4667824', + 'state': 'ACTIVE', + 'uri': 'https://generativelanguage.googleapis.com/v1beta/files/zzqllezrzmz7', + 'video_metadata': {'video_duration': '36s'}, + 'create_time': '2024-07-15T18:27:14.692475Z', + 'expiration_time': '2024-07-17T18:27:14.625351853Z', + 'update_time': '2024-07-15T18:27:16.179456Z'}) + + What happens in the scene starting at 19 seconds? +[07/15/24 11:27:26] INFO PromptTask 765a4a2833a34084b0077fb49c948ace + Output: At 19 seconds, a futuristic, four-legged robotic vehicle descends from the sky in a misty forest. The vehicle resembles a mechanical + spider or insect, with a rounded central body and powerful-looking legs. It hovers slightly above the ground, emitting two bright beams of + light from its underside. The scene has a slightly eerie and mysterious atmosphere, with the fog and bare trees adding to the sense of + otherworldliness. +``` diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index 51525f60d..e9fc6daba 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -10,6 +10,7 @@ from .image_artifact import ImageArtifact from .audio_artifact import AudioArtifact from .action_artifact import ActionArtifact +from .generic_artifact import GenericArtifact __all__ = [ @@ -25,4 +26,5 @@ "ImageArtifact", "AudioArtifact", "ActionArtifact", + "GenericArtifact", ] diff --git a/griptape/artifacts/generic_artifact.py b/griptape/artifacts/generic_artifact.py new file mode 100644 index 000000000..8e0b7e38c --- /dev/null +++ b/griptape/artifacts/generic_artifact.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from typing import Any + +from attrs import define, field + +from griptape.artifacts import BaseArtifact + + +@define +class GenericArtifact(BaseArtifact): + value: Any = field(metadata={"serializable": True}) + + def __add__(self, other: BaseArtifact) -> BaseArtifact: + raise NotImplementedError diff --git a/griptape/common/__init__.py b/griptape/common/__init__.py index 6ceff61eb..6ac434649 100644 --- a/griptape/common/__init__.py +++ b/griptape/common/__init__.py @@ -9,6 +9,7 @@ from .prompt_stack.contents.action_call_delta_message_content import ActionCallDeltaMessageContent from .prompt_stack.contents.action_call_message_content import ActionCallMessageContent from .prompt_stack.contents.action_result_message_content import ActionResultMessageContent +from .prompt_stack.contents.generic_message_content import GenericMessageContent from .prompt_stack.messages.base_message import BaseMessage from .prompt_stack.messages.delta_message import DeltaMessage @@ -29,6 +30,7 @@ "TextDeltaMessageContent", "TextMessageContent", "ImageMessageContent", + "GenericMessageContent", "ActionCallDeltaMessageContent", "ActionCallMessageContent", "ActionResultMessageContent", diff --git a/griptape/common/prompt_stack/contents/generic_message_content.py b/griptape/common/prompt_stack/contents/generic_message_content.py new file mode 100644 index 000000000..453b52df9 --- /dev/null +++ b/griptape/common/prompt_stack/contents/generic_message_content.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from attrs import define, field + +from griptape.common import BaseDeltaMessageContent, BaseMessageContent + +if TYPE_CHECKING: + from collections.abc import Sequence + + from griptape.artifacts import GenericArtifact + + +@define +class GenericMessageContent(BaseMessageContent): + artifact: GenericArtifact = field(metadata={"serializable": True}) + + @classmethod + def from_deltas(cls, deltas: Sequence[BaseDeltaMessageContent]) -> GenericMessageContent: + raise NotImplementedError() diff --git a/griptape/common/prompt_stack/prompt_stack.py b/griptape/common/prompt_stack/prompt_stack.py index 8bbe98161..3186dac89 100644 --- a/griptape/common/prompt_stack/prompt_stack.py +++ b/griptape/common/prompt_stack/prompt_stack.py @@ -4,11 +4,12 @@ from attrs import define, field -from griptape.artifacts import ActionArtifact, BaseArtifact, ImageArtifact, ListArtifact, TextArtifact +from griptape.artifacts import ActionArtifact, BaseArtifact, GenericArtifact, ImageArtifact, ListArtifact, TextArtifact from griptape.common import ( ActionCallMessageContent, ActionResultMessageContent, BaseMessageContent, + GenericMessageContent, ImageMessageContent, Message, TextMessageContent, @@ -59,6 +60,8 @@ def __to_message_content(self, artifact: str | BaseArtifact) -> list[BaseMessage return [TextMessageContent(artifact)] elif isinstance(artifact, ImageArtifact): return [ImageMessageContent(artifact)] + elif isinstance(artifact, GenericArtifact): + return [GenericMessageContent(artifact)] elif isinstance(artifact, ActionArtifact): action = artifact.value output = action.output diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index 8256ba6eb..06f9dfbe6 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -14,6 +14,7 @@ BaseDeltaMessageContent, BaseMessageContent, DeltaMessage, + GenericMessageContent, ImageMessageContent, Message, PromptStack, @@ -220,7 +221,8 @@ def __to_google_message_content(self, content: BaseMessageContent) -> ContentDic response=artifact.to_dict(), ), ) - + elif isinstance(content, GenericMessageContent): + return content.artifact.value else: raise ValueError(f"Unsupported prompt stack content type: {type(content)}") diff --git a/griptape/schemas/base_schema.py b/griptape/schemas/base_schema.py index 9fd7c22db..728fdb34f 100644 --- a/griptape/schemas/base_schema.py +++ b/griptape/schemas/base_schema.py @@ -2,7 +2,7 @@ from abc import ABC from collections.abc import Sequence -from typing import Any, Literal, Union, get_args, get_origin +from typing import Any, Literal, Union, _SpecialForm, get_args, get_origin import attrs from marshmallow import INCLUDE, Schema, fields @@ -14,7 +14,7 @@ class BaseSchema(Schema): class Meta: unknown = INCLUDE - DATACLASS_TYPE_MAPPING = {**Schema.TYPE_MAPPING, dict: fields.Dict, bytes: Bytes} + DATACLASS_TYPE_MAPPING = {**Schema.TYPE_MAPPING, dict: fields.Dict, bytes: Bytes, Any: fields.Raw} @classmethod def from_attrs_cls(cls, attrs_cls: type) -> type: @@ -134,6 +134,7 @@ def _resolve_types(cls, attrs_cls: type) -> None: attrs.resolve_types( attrs_cls, localns={ + "Any": Any, "BasePromptDriver": BasePromptDriver, "BaseImageQueryDriver": BaseImageQueryDriver, "BaseEmbeddingDriver": BaseEmbeddingDriver, @@ -164,8 +165,11 @@ def _resolve_types(cls, attrs_cls: type) -> None: ) @classmethod - def is_list_sequence(cls, field_type: type) -> bool: - if issubclass(field_type, str) or issubclass(field_type, bytes) or issubclass(field_type, tuple): - return False + def is_list_sequence(cls, field_type: type | _SpecialForm) -> bool: + if isinstance(field_type, type): + if issubclass(field_type, str) or issubclass(field_type, bytes) or issubclass(field_type, tuple): + return False + else: + return issubclass(field_type, Sequence) else: - return issubclass(field_type, Sequence) + return False diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 45511875f..350ca4ce0 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -103,6 +103,8 @@ def _process_task_input( return task_input elif isinstance(task_input, Callable): return self._process_task_input(task_input(self)) + elif isinstance(task_input, ListArtifact): + return ListArtifact([self._process_task_input(elem) for elem in task_input.value]) elif isinstance(task_input, BaseArtifact): return task_input elif isinstance(task_input, (list, tuple)): diff --git a/mkdocs.yml b/mkdocs.yml index 337b75f31..5c603e4d6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -160,6 +160,7 @@ nav: - Talk to Redshift: "examples/talk-to-redshift.md" - Talk to a Webpage: "examples/talk-to-a-webpage.md" - Talk to a PDF: "examples/talk-to-a-pdf.md" + - Talk to a Video: "examples/talk-to-a-video.md" - Multi Agent Workflows: "examples/multi-agent-workflow.md" - Shared Memory Between Agents: "examples/multiple-agent-shared-memory.md" - Chat Sessions with Amazon DynamoDB: "examples/amazon-dynamodb-sessions.md" diff --git a/tests/resources/griptape-comfyui.mp4 b/tests/resources/griptape-comfyui.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e0f18e8f5f3fa576804061b7c7a8c0625fb2da9b GIT binary patch literal 4667824 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

  • *f*lUOuBzJfL3N03OxWtIQ~6hM;)+faR8#u%! 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 z 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%0Du-w?qXEEnQkXi?5Q$&QUiY-A zzrC!Z9QcTEd2msJ%LC?DV6AMPm5CJXpVM*hSSI&%*yA`9?pFX&y_xu3?JLVajY!0|MvR$>E&?%41X*d`Qv#y4qL~m@aILNt-}~cj@?v*5IGYP z=oE62T=_bQz*=jqMd@+}XyAjmA}q?on*~1UNTYF?J=V$+Xc9Fa9x%mYJpf!DAZ(dm zTFcPGS+kd&vJ4)>bwilNZv%C)u*mECAI zz;lnavXFw;bya2<(8IZ~4l=T^wXC60B)J9}tdodGa09BEh7_zUxsYAYp{M~^OxLe6 z%{u~SrsyepsYj}7f3!qvUwoZG^=wOyZA%)h2?t%2n%t&L5kqU^{=bo5bI8&tv7w$R z8!ScJ>LxJ(Q(K&$pMIT}UjnZ9eEaxqnHe4uyqsmJo7mJx0#&Y&VU`W5*u(0!#h-K) za)NXMJs)#Ggg8TFD-j{}Vd|^c2JleT4f&5|XnHQ8|HVV0@G22XnK~{2T|lD0iTb{V zGxrg89C`bZ`l4!p%?=xJKwCrAdQ*9LcJh&8?oEwu z=&KoeFx{-8*WX^XjR7N*M(5Kg(Od*qkZmth6W^QD*_Gbo*1O9WHW&nMe`^Sy>+iCU z-c*CwhHteojf1Cyr0p=Pk7WbcdHzJ8?iM2(eDrI}5E%z#;iUq46TI}|d)KWVA*hthrsRr*sVVz!Mi@ywLh z=p(l-d|At?E=pnRaQ7ow?s6i|kL&gIcz^#c;^pNh+WPU^?|yxL`-bno{9XPg$<}gz zu0>=m2>b2?R%vbBK~r2q{Lb?)^0ure%8(nZ24RCo7XOwSltk+WtIDpc zX7FONgoh{a%uBFDe!!v*OY{`s0i%$fJq9yZ^*SsM4PIa@6S1*ag6}x&SWD1Z4HXyH zp+LB=9!*Zg>9DoVaFGszxD*y)VCn@6TV@Xf9QJy=JQgA{cuM2@)3ZVO^E#iGgL+`e zMKDk4BXg@C$5ItJT1{s{k9f+eZR@JplC*_dik-lmhSA<)Lz-6MuAuB#J^UiC%e~%J zjdAp)3Ks;9K|hVcTL^uXUJ2^^&c5QI5@xJv(4zuJYG|z1hB>9_2KY9(Y18Az<|<`& zW4X~YWuT$7W+|Qgb-r=9v?|$4YnHh{Nm{nDzao$w?V-$#=V7$U`K8eqS;Cdlr8}aL z3}JyF*0HK+%Sf~A%4CZKXa{TfYiJ@J6DlkPWF;3Wo(v|nRA`HJRA7`QAkuFXr7g_3 zmN}x@QAbvjWd>3QGDlrB!#8HdZGb}=dxJUqLhBw&c( zoe~kvK22L1?NW?8w{%0`5nkT8!Ue^#b#yg^;pTU#MLR@Vw`QJ0-c-;(VrpYzKcJkE zjf$1$!=?tHJu*c(Y+b(5V@Z@-Fn#ZKKE#59H;>IMwB!~yJ*tz%pb@#Z7Y;Te+HXft z6_qLY0;H#HuBQwSbwyyvRaXl|P41g^&<1fGb$Mf^;zyJGx|NQ;?$A^CY`S0sE{_>Z9`^&%n>-&$NCI5W? zyv}#%N`tpMHL&I!jNLg3LSw_EmoQJL1mbwF0p5+*7D>`0JW{$U6b!CZv<;4}`dsSBeleNb)8SJOC$htq z+-vyeVdm-33xvY5AB0NO98LP%oX!gHZe`g&NrA-_U~JbkO?(%@POpYHx3 z%y`f;-`SDfg9>mt(D^ErWbaiR80*Yn7!AP2opY}!#H$}6BqBMB`Y#6)muc(FX|7q}3 z@@^Ymo$!=eVL%Kk??He%e-?nA=jZEjkgLu6(vodFvz;H&r^!3RRruWu=^&CdJ(bE0 z_d;phT2u;nK7OlTp+VFACr#dWEI6#*L|rkJ7%xwz5htOkd1b!W|6%VopUnNxdSjle zHLS=x`HHD-3&OapHUsw3HJ@&YiJh6f(O1e=CROH|W9*+TJJ8<4dirRhx|a5dbiVk%Hm@0CrnhaD! zfw|cvz8qoId5vIt#|Kq6L_{fiD|N4&$_g~e0D!F}eq1Dca+JNiXD!;bDi|uekp7`kLeA5p>bboEEUkM?Thd zT~`$iC?Rx6?pI~tkeQfAST@Q^3hMw4%fTGD{DQES9UxURpcJu|HSdNQZLPSn#<7x3 z>}Yk99xPkBweEx99tIvL+kG2o5}@cT_LfymFfG{{24T`CQzDMq*qX7-gE7#DneOUD z#R-z8BW;zVlPxbx45t^QFOrr_4;1(MpH?5#gP-rtWuzuKmR8Rcu5wYQa?=5UJJ_GP7O zbXqNxzR$ypqT~)@Bs95U5#0R&4JsS-v>!nwK-+1jW}N6C3V<4|wa;ruH3|^nCZ&be z^6d>N$T+45wpx!Ghz4Y8UEx9i+soT87PL>k_sv>R8z|$}y7>cV;X8}#3+fvgP;Wxd z-@VBN3=WzDW>b`qv81_&eZqtEHb|Q{a@*GXXgAf?-5mXm zO^R#Z+Mu=|Sz(-ll2+D6rSC}K+{sM&Sj!cy42`hI<8fY>%gyX%J$_ntNHrEA+(Xm?bh!c+!s*%VC2E#w z2-P@|>#$RCUcqiJ9synk^`fJN2Yx+adIe|{X)kw3TtFvq@G4NE@kdgiR2^i1I*#6 z*@!fMd#vLMhmhe(njOuMV}g`dAthR2kAXH@`Zv*+O_uzA;|sLV-gbG4hce{4gF=($ zJ)4f3rOI2#F|&63FF(*R=|Wm|Q=;=HLT1~;q-;q=0x(-Zkkum6J(XZ~M@>+RONpQLIZ?=%Tf5U&C@nXQ*f~)U-vyiwsutg0V_~-N3kNL)M{nYRd3lz zys%0+89mf%roPb9VAob2+3%hEBvCj$p4W%R6O;OtUKwzTJk$>DChFENCB&G~tnwPE ztPLV@57Kj-ODfV$JdxCR3(rC~8=%hP2H=L78X!!KNa;Y73T_Elpo05H?T6?T$X0Z% z42uog0x5Kpw={^P!^g>sRWTR1XJ{osbP#ReU_rV2P2I1op+`HAVwA^5pp8fK8JVVe zdn+e+Y`nI;Wo?uoBo2fmnpZ2s+GVC1n`w)<>l#8ReU~?r{Yw<* z^Nn=y`S$krw|M;9fB$#+`SJE0s_v1HFI%U_TIT-YF04bk$n^AQVMmR7WSW*kDe4nT zZ-EiDj65`?PsGfCV3dB7WQ)}%t_mGA{b>M+Wppb6-(tDrjjHr15;fd8*N_d~vR(9X z91r8eFh@r-2NP6nac6PcwNSTdv`#wj4SDk;IbUs#IBHfUQWSa zYZ;kzVc~LU)tp^D7GDp0;X3^^3z9g=G;k~m%2+xm)tUicJbtR2m+za+)DCYe3TqIfRhI z!Na6TKw)bE3ioi`gm{CP%-&};srC(qNZ65=>n^{_N06Q;wm40~usONpjqv2WWpt-GHc?;3@v^lC*kd@?SitL0sSy_zC1?gi?Nvf`NEQ#Fi zx{X!ajRj;!_|lz?AvE`&b)NFLuIseNN=3kIjRkf$VB=2TOsU#{BPSo0?i-zf_DvQo zbrG0Uj%JeO8LDK){M9JIR$;y1FN(Y%Ute-?T&jeRC7O{@M2gYElM(E?8tAO5?ZQcK^v6*WRx7&$HI% z%Q>i>k#nr+Wl@42wTaRgD4D$x`Ic`*`Wc^=!|6Zy8;jk+zDF35bmoXRH;o zh44^>Ze-n>V9Vb|jwmL}WWG^r_=@BPgJwtj&af6~*L5Ase*5wJ=lSdB=db4}zh1EX z^ZonB^9K}CnAziaJg>9T#>z^GV8M$<^MfaQFC&E-)ledAnT1DXQkCFN!%4!lRt6e+ z22qnJbGYfa5QKy{meL+wUb+v6elLWH{nm#%hbQ}CMK0kjYU05i3^acDY$Kh{dCZxLoVx>*QqU18E8!_!Yc z!;Hr|maU(Tq!oR8c>uYHYVEs>Yjv+eWPy;PjR0kR7}Fm=A!>EvkBl(k7nagc!K&0A9 zT|9xTomJO8PGT8asm!t%=(#Q_0HXlV0D!iYC+{SwseW6_NZMv^VaT?=UTxiqESs3o zHAt$Bqx~B7qPfZ0Zz(=b?}oNs_n+p3TUkqO9P`iC1~>gZ(x81>m69^rQ85R%<00Ek zg&G(+gPgziVd{-HX76 ze6dAM`E;?R(};!pF>3=B>E;tcG2zW~nlz$4I(ouQXm?3Jyf8~r4I9EWX{$qaOPKR8b;45aauZh{zNxha$BOhT`>B!8BD zCwBvc5zF-QVn6@#+tc50UUAuPzdmhQ=zK9{S@h|bm@rF5n9=2tSS4gIX0>kJ&LC4L zB3q!0MZDNKhp5Vl8ZRq#6RGNfQU%*&_oPPqblTgmGIhBFo%Du*Bv+;@dmL-6Wk7i; zmNA>Ro}r9Vp=MpXC!)#}PgI|S#q}^g$d{LlU%_41bvgtZj9NTTw{)=>bEx8D(IXN! ztVIdg4&=Hn00$R^MO!cwvdm}%0ba5caQmK8M~@J>vc7&G;Iy}7U}FW-iJDhnR}yk8tj-m$_v#@wcpq$hLU0J!Q2-(?pEz` zsxLR(%LM>MLW+K=Z_HSjz2#iFWs7&e9BP>(dzHLhMqkGbi`47y$uVO_ROVw_F~q2P zt57q)oEgL#gJfUMykL4IK9ywdoar=GvovyuXK@KYsjr;qyUo#pmbm zkwx;5=jI2Qc3b-DPgtSsF-(f?mDG_)hD1+6&i>}zdQF8a(N|cpf$p4IfN;d^TZbBJv+Qc$g`z|5#%Yyg>MJHJ=Q^(l#S-j3xYtNgrC>x zGF$5?55nnJmPtR31>p1Z3TYiHfrm$25m$(CTL{vt`@-}CD=&bthmBLKVrNh~{;wQy z1_Q_?wk0oSrs;K^90l1XTZV2TTlz!CT1*{{>+*<@35U=vJ^}XJ6}8w)MkzjQUj!tp z76L-LQkc~cHw=>j)hJk(L&;lNx8Br9(Dt&8D&tp?QRGz~o`wZ&UX&_LFIBNI`Q@wC zKBUg96llDh}6brt3tt>1f3JA|Q@+$=vW z2t>rk#|N<1ZUAIasqVi=qpKQLT1?RBY}95iNpmUw>oRSS}%AT#G(flU9Xh8YZeb>y8je83Pu$Dt9tj25fnUXdW*3=H4-Z?i} z^tmNq%xBWjw&ec&uXq&+9Z>$H3_N|1DD5>f5rV8_t3e>JKIEVY^;Rc3YLi50){NYas<}^>a@QHS5k9 zrcjF`>@3w3gMUz;ZDbVvjsK|y@aUXYS}FNQ!KGl!-+Xbml$=U;dNCU*Mo)=%GcL32 zR4Amwr-sM(4L~`e{a}R8L+jvFEL~Pexy&n(!dCV*SDQEau$nbqUxm(>*M3iY{^!qDh*;Ff=!s4k_7=_LAATENp4=rmg?EOH3en2 zC}@HOs5Y(CC4Ow!lxk}dTE_pjm0bhbJ7{V$o%HQmbGD081uEL2)!b>B7U&qtAjWwt z?gW>|uKTYVBki|xYy2$}_~i%tKLt(t>wO4!4js5svLF*ZQUuRV3%%baZKSs@;|U!? z4Q+Qt!?B%iuYK12pG-h%?-9BU;Wq8}*2bw_7Fv6N^2XXQYFsg=kp6~(m=)_pIbwz$ z3Wvr0f^!^FQ^<%OYqZ2UIRTwcB_NFeZYWmTx1rw6&S1l{0Vj!Ki%-hS*wU{rYx8ff zO=SxKpjG%LAz4ZnTlJV0l~tl$7t}bOBsgs|YeQz89$ZRt9v@U38UX!KD$V~BT8G5gCl$ojBr7818W?)5)-ZNc#%;x@~ zMN}`{%uf*%WnPwuDa$=_Bq}2mE?Op3AWN=tLm_f)YrC#Y9e^mT12EB9F>{K$EsB8>k4MQ--2An7iUjhX&__ixw!nqHWr5TT2$|fk}&{Gp=Crx z%rd;gBr1G0pwRNOIk#29h|itaP>MC-#;C}WX5|6s41t#a7@Tv9jA?pg-QNX9L{HQj zb4r=fvkU?}d@akeuZUu?<5&>G$Q90N%E!{8DLG2 zKqNue*>!Gq3!sw2`NY`rbzdZEs8{x$-^#bp(tLgvR~P1Sc|3u~v}hxd8d5E?NAy*% zeKO;Dc{p2kraDb%SnE#bY*q@_2Xih{(RW%LmHW!^xK^fm%jE%cH!|1e~>zD3D5B->VG3Q1a+oVHL8{7;69C~~hepb(HcR_O<+GU(;mnXIdQE)8>~e^5KNq5Ao`tr}4b_|ug&&XOyqv=0 zJ7u-7gJFQJj>rxb{Kz*ht@6xyc2X5YuEL*kZU{@Vx?VA*sj`JFG zl4&#$X_ig*+trtSXVW0bS$9gSvv0id-GnWw*D`>tU~tV?nSSrCy;QTML)lTDgoflV6NpRiDkTEOw5PGFqTX57V&-#dZ1R zalE`-g0CZh5EOna3pgE*msNv3GTDfhhFVDFh5@6(@e*j+IhZMXYgSrRThKBo7Ay@Tf z+VCN&4@!%|o28g6&|!wV6wGp`{OrxU3560lW?(m)^CdS(8Jpze<&kBEQIUMPU+Xwp z29@wl_LBx%V&t@?){SV{O*4zoBHJMm%Jv93>Wr#@RQlMMCa9HDHA$Y7)z)H!+$nv9q4o zBDNf3K!=Ud;<ox_z z_@Y(W9+F+3WLrk!rSjb; zxVuZyZjHzko3=Wb5J58p6q)663jX==e7r29zW?^ikKg{e?0{eL%PdbOZik|fdREPy zTua0>$=(6a5G2t_Lg}y}keXetZXp{W-ABl@w~&B)_5^CGXUZ`OuAF*-ttVS#n$ZO! zE1@1H9hE$t<3QnvoIByd6#>!{5~aRVCP-zH2}!;j2Q6M#R)#A}y4G3_T%Ij+iu7^} zcR3yU1S%+-cstdRAsr(R>2=wwE!8+EK0U60jItFWS7y>Mq|4pi&j=W@NWjdp=)LFn z6}rkBsSbN>A>U*gSdCsp@K`x^Dirb}Rs@jA^$@dJ-^12%EOwv|B}S~L1yerlBB|^uJ8(7S zy{hvw;FV&~34N6wl0KcBeK82YDrQ#BACl?&uPS+xi3(Eu#B>j5@*lY(!a^QV{=al| z8WFZN6lypGTht|28BGyfwzx`Zd%*(?1kPQXjoDp3CjhY6c5{`SA|eA~?8HJ`5tzHYFnk<|tg#EwD?1iBTv55UD2$ijXGE6&{fStnb)@w6AeFJn%*eo&v-plsHQ z%Ba0vX00V}u!R;z}aA7sVQYCEK z^feX*uH$hWW)>dTGeBERM_CTh2oIPkYl)L~nBxkO#jwTbxvYR07x)5vdpTA$NzxU% z#2`M-%Yj2H5%Ai_3BPIpLrz%-)crMj6a-~0J*uNiw@?|oTFp!?LX@4GvUPYiBM0pO zvipn?%NE;-V3yvo?B7rf)-8y$+a$X$dC5~vjHE~vB(o3D1h9wBTNi!doz2#bRyN1g z58GV7L4{O*6$QvxX~N*dN*Po!qjpy=c4fs#63yFh!dJEQEzY-4*&kA2npPs(&Va2H z`fhVYT|YURA9%T`OP;TM6=#aX{To1XI-Dm9~CetBvUk>60wixeo@%`aXSKF`ZU*@;zri3 zkfc9q-_}a=&_*?d0&aQD7_IX40mH}lGq~%Xk{um`Y5wi|-FQ_w0jJUPaq)g)sID8(Sr-j-#`G%|4fiNSl!qjc@NiC_WyqlESag=a1ii|Hohd z;L$dKOfKM^Zo7T^ZEXpfA{M&!o7>ppq1hvbt2~O8-tFah1$Oa>+aRP z>Vy#WnUJgva&Ty1T*Y&r0-*RqdH-0bHy>=>v?yhBUDe2J8MIJ&8{H~|A$aHgB<9Z` zm#Y$oP_d7MDNu%}fCm{swVZ>63X>&KT5lgm!=x@d()^Qt6;*LH?z9Qb*EJne0{Z#2bSZ1{mX|*57u+ zhB+v$#*$`gqA8>#WMLD*id?d>SVt@>*=-~W(E}~#y}17&pejPk@{^=QyUV$rHmFLJ z*&70?Cuh?|>Z^8wJkXbNi0AWkhk`0K*c&C2_98zTXt`;O_YJ)goFm2y0N!fRBptlo1(6N zmwezXc2Hll0^0Y`ySpig3Z2Y0>ieT-dH*zS`|ZDo6+uSB1xB|F6?%#O%=BTg62Hyq3v+G`?s28>hKlH(yZNF-YCWU`}c1zKasDC z>+|F7|MS29kB=X}J)i&f_WtAXV!wU=$LHt!=k-J85za-pgJFwVF>RUf*cN7snaXn~ zZj93^ClB1pGE6UMWU-vm|t-210h*fCUEM`2Y%!nm2R>0~|;D|i=x4Bly;YHmmY zVX!4U*6}cA_79}XJxE<~5mD`_N#ny-lF$`lRW-vaBBV1@^37;V3bTcTBS~I)b8X+D z6zQW)iBp%@VQ`5@9_DJjqe5tWt7K22F8Ai7odi1jue|%k;CPFQx`zB`F;@ zh631D$jI`$X*Ckz&hst%Haj=a(wJBL0{qxqlu0{N30#9_P)YJE-v%_P<2QaCL6gck zr=Tm6D4LHGB4oRT%rI8F761ql-jZxH&V5ICY>?0kz>9A^P9$?7eRBBH<6U#(wZ!DObZhiT z@bfy)&*$U#CX2Y9?{B|+e*E|q&rpP4|NP}|mtRtNIN`@S1W!0s{;7!Qp+Ia9-sf9T zd^Fe)GSjO<$lc0CECa7@omFCJNQT`#AJycgcs@F8E~NM_X$+7EO-ZvPEaO@$6QfO7 zi)NHpH(eSopQcIXx_VC(6cGxn%4>mwmO5}VMwDCS@i-#O zkFynBjT6c2ogy<^)m$wzoQ}1!BTI5d%CJQSVW^qDre0m8?_@&&KviJWBUS-I+2_!h zpp)P-Go~A9yPgul9)*N4f<%*t$h$NeX1c0mQoUJ$kwqrmgvkOy*R6$QGk*Y)UGRF+?R#39?Kq&7ZBHVJ)ci?3+AmziFAaFAG>U(FKVWmN7U}K zHEN59gq#3`0L^SctgL=1B4^=ogg`YTOdPgK%N=XUx<{gv{+!&=GUHkj#PF)R&&4$? z_##brw#d@`x(dj_LK>iOksyq5DCWcB#_zrX^$!Q?l3A7CR!eO>u%W z_X(DbHUc-~oU32~`bh^CI@@7_#Py`&vleP2;;I#7`47tB5fKF8%gi9EoH~iysuAe0 zfKZXeCPsAvoTa?mRn|!`WcAo7_fjSGZ55){9gP_JBzG>9Dt=dCwDKhaM0LY$z&oOO zutfn9eBr~5yvmh=f(BbDw`$Ut;79?BYG7L?^4!HdJnBZaH*2T-G{6D6#Jpzgaqe-i zpeMtPj@Nz3^|t=oHo5k02X>)UUI1xz^gH+mmsH8cTt<@by+jBpms%7Qxgp{9Ccq)% zUgb8ydof>@dXtwZGnD%`ck0#+O4gdS5l~;d2p>mF-A(nO87!0G>oO_oOn6&QCu;Ru zHfrmAHI&~D4Ges2MB60X4YiuwTjq15I9AYvte3t>Jr4f-%P)WV^MCv4r`Ny0M*xg#XIhBV-JLRquxx2%Ln4C? zpIUkh?kdx{7@6Ck!Z&%5huM){ zs~iuXOd7I9Q`SwxQU0jhV>EFV?7WGP5X`uab-4#hNTbJ?FB**=5t0ie7J0NAp=INU zn7Y%x_+j)`7lY>-i(`B!EjNVmV6jq@H2jpGYRXHp?VdMD+=bD+qbYy<)9Ncc2jK-Z z1iY@7jxzB&DE%#%8KJ0m8$o-MVsQ zE`T0!SFysh+)@Os94;1;s>=e(;nyP_utijP@1b(eTX`M{lgVhISavtk)CM=oSd3j= z3RUFTj!J(kwM|r&Yu%u1HHZZBf@#?+AGz!*c*wW3g%31>8uwQ##1zyc<=FJ0LDxer zt(I~vRj!3B%`hp#RbsGum1h#3bvkg5m__TT)~aA>mm+a7O>TqTflj9;)=wzI;-G=y}h(Eu21xuM(~)wGqxBs}_d0-Sz`HJE@ye@1)+V zc3E3oPsx{s;rjeI|Ni&Cz5VzeafZXMuAMic;zAu9!45`EVSfu7Vv^bJSamBV8k8p4 zaV$^@C(XliC?a|$RBWd}5rxWJ?8|O6e+Rlb&rz=RSj37VgYt_obxpz`WgM_BL|Hgf ziO&+Ueh6vpFT+|U&$4$yVWq{=@n@HZRdbmn2Ig=uFtGETG0$X_%&{URrq{>B%TISj zNW>8!VbusSAx$LkKF^#w3MtO>#Ij=<4d)fMQn^=HFrbCy?w+l!kvYqZvY+Y%ml+y9 z9pHoQ1kIkmApwVR*^y~UQe<_ocd<{-AjwaY8S5AnpLOt!W)cPy`CylF4(oY^OHfXO zpFm6t<1IyRUf_|DYBps0W0N@=OtgS*?yby9j`|#;Wuk{kbQ=UAmKk9;NRc9>%@MTP z%HjzcLvdag6zznlPa$!7wP_i6)VsV{LApt6wn%RtX!0ptI*t$$y3SzEsOm#d1dIvz zGX9IgOtGUyMw*3t=CEZ3kX2LCk|~*9gKnJRsSyCmJ0m-5s;pt>zWddXq*j#LsAB$ZE*y&tDRV}8*H8KIDs{QK9 zvc9@5V4LgtqPOd6`-UVbJVzWyc;bzyau>5@tw^FQGzvAvkedod(GKWpdLtMrHY-=q zHn55Ee4zDkhfrEHOAVD;P36WnakntnEF)V-3}5Ge)J;=IRTWEiZsqu0pz%I}`=BZ= zHa@T0AMWj-w{pKZ)k~|{#P+k~MU8@z)c%QieebEkPhoD<%m8g>Ek{M`w*K)P%W&qb zxm&aLsw?F(?Fz$G1N6yFudG2)O=P!Yt%q&sgVKVnDXS$#T`q&4w zW!`^MC%^zki%>zx?)}p=*d%oet{Z*=Cl- z-8U?jxK4GaTro9sW~?YJ!!k6AESg%V=tdMtz-v`k z#hfqU9*@OT<;utgJAeR=#tERB526}>lzx_s%YX$O%N~oM`4!g{N;5hAO+qch%&Vsy zGMgb4f2PqGq|jlMaF{*JAYI{Rbm&z$9WM}>G@QM8I;=0338Bc`20 zW?2yk!GlF56$fD*ebyqylo)AP?x?9>O?Ue0Q~H9g@A@l=?nZ|DqoctR<}@RtbxHYM zlCp0lYQyzObJ5v=+}wZjL$%{+mU>-zmqWJfBnVFG$Z$;ighsY%V9*xY{qWRH8*Vi8 zDDhk!!MJ-|VlNY={~`;^w>g;2#aJUnLW=AOn&-ljGzp2=;nFrIk%L{B!y1$6fOQ-g z!;s{nqADmv7#F!b0*W-ZHCZd81!m<^dy836OzrbfIm(qPftl|dwpK=Eb6Z)dn+mUG zNxK$CvA0VF^(YPGBln@FHG&8s0Hufsp_mPdOw#&okX9kG0HJX2xDF7f$zde}=*w1|3{4wnSWh z1?;fn^2;-Aq64}`jWrn)y>+=d5ltd+tYewEyF!Xn$08uF!KU8!vn``=g$r6)?^6Ic zab6D&kq)z!DMIdfct$F-o12vp>8^w2DAvry0?byL4@bDhsaY1#=%AY&b{D^mwYU00 zdrmR7uEylRo#k4K)Xc1u9i2z4`-k^~5*Xfer|=~YZtTJhapu%eZj5arws5V5m!aAc z<6eh5>uuH>G*ug&emxR1Ni9vKDp}}8!U=lQGgOc5mk>G0H#^K{1h6dF%pD7vnJt>K zyery)WWAX$@(c+}(8~Co+3(i2luDp~+ zM{yY}e0S)!rNjv$LT943et*Q|}m}B86LI-d`3uvKZ5(~75k-8UYy}Lh?2s{^+(164B1)z%pv%sh4%PSllLww7)eX_NY6euml)eeB2 zA=R2X#y2zXL|+lcU1WRtNu(vf8c*I%xONV1a=*)?QtVOgF;=UU^uKP3(oKxz8|#qv z_0KlgE6IlJC@ktSyRle!I&`bRi^w>_b)9iNg;?uY>(%`vSGJoWBRoEz?{UV<<8fWT zuS22F@9+PB!FdY4m}Z@NB+j;IiX@Rumy7PAj(G^48-g}wottQK->$YA&Xg9T+T-0S zMC}(!hgJ8OMa>{DV~IeH9?J0snKVf`EYo`cwLeO%l$Z1Sqmlrz~S79!#EDo#(AS1ghQocWczA&6AV1EbUhgEp+IOIrYrkI zD@VSPXt`RzHX!557)!pun5~aMZd*HpT+oJQ0;I@1hAaEsbq%Q*B{JfuJdHNg(9q!~ zm$>E3ORwv=?zmOd^eqROeh zKQT$N-A^gDHs`6odfy{3wLyI{`+23jtKzy68A`Qt0my6=qkRcqxDVu;o=B|JpS+4) zZh3nhX?A3*tIcagG4;J{+h7T0Dps9ua78yGPa)PRdQmgX0IC}T0ogx5J@%^;yro3h z8HPg@k~eRwL{iMz_f)w1d5-E!994TLjaFw|!s83V{^Ityzfn^A;UWSCi<~mV5-?DY zjEBq;`lO0-h%^&C9c57$Uf?d71(}JJ-zTU*C;Z$XcUg?AnFizLtac!?7j4eDU+wm9 z{n2N%Pi_C3ttCc-|AE)O0wNC7Yoe;P--1mIzoY@MBrAxGtq})yC-NH((p>*-opXt^ zQOz*I^wAC<-xXjdgR3(XTdpR3+)n3azhLewF^7a1ik)9!v*ztSZej5ut0G6-FiNA+ z+g8w0Y=0f?Csw%+%2Bc)`(}CzO*uAes6k`>pdq_<;mz~Q zNni1oEGA9AS+>dxWr+&xh=*Ht;|N1`(a}N_Ce|bHg*V{jT{g2P@ zZ~y+k{{8#+pMU%PXPQ3GA1+V9SM@Dz_>{OS`ON@!Hozztl)&2&tUkVS9yF@WE_szi zk!Qf<+C01p*$3dN%-I_m7P4U`HYDYEB=$L$8ST0*Fg?uG$vC7lM8d?CO>q+#uq|_| zJXB@uJ+TYQ)prmEnAt+a1&_+l5e#O|)cu94h9i>qQ&q6aNyET{cC1ALm&bL9dVG6< z050tg#^zqObu1DW3%QX?NSIgsYWlhop>z+uCISFTgFLUhqGJq?G_Rw*BWl7(K48V2a;8eO z)x)FR8($E{=954Cxg(So)+H{!KnWHa9`J+_AGlj!xIJlWyZgItf7vqe=8DDFk`dmQ z*l?%K<(5ynKe#N!wgzs$9l1Xe{3h=(kf{D)0AN1IAzj6^gdV+qDDB^DAzBNthL;2qqA}}on-Ze(QgKUHQOGj=r|})6sK&eF zM;N}^Y*)^gr0Or+nA_`T)ebo!*(C9=0hceZ2VH`sak+6H6K>xq=UCY!5YqA0mtU(I z;6ZNk$!-2oVc#yYBxbZK+B|@p{%+{7xlCxYY*IcF>)jAxE5F9Utvw4tmpN2~h31F7 z(y8XHAW^~h=$Uc-rhQ-czpWnZq{{8aL_s<{4GFq5B+LmaM zs!1kfp>Ii;s==9NF#GDQ)B(2kX~_Us%|PgZLgh%x<7?MKv6q1nq#_#YRm(&(h67A@ zysge&CSw@|xbKE<9#w=TXl0+ljO--JpcIz!n_Xr`1H+A2hKDW7ELoR59_~snN7Z?? zB4;Y7?2}TkvFt@9unHJ-06!f|f)0x~4f;GU!5r``pC?705fLts>sU}XFwXLOnjS(t z!!HRmfeBto8hMyq;blAsA(_EwJsz{95`n`kE67r%xnCZYEgr<_5ty;vo#&8#xD*Rk zTDC1tX2X(#4)&$1>Rx!610;iivPL3cLfrot8u zU-C2BBptc>1=iF9JHt*}FjRbGub~LG_+nc^+pf8VPgF7|w4sI?@Z8wHp1$`aY{RvA ztguV}>h}F{yI^m*L`P=_w|edXS!s=${1)h0tI5Ka^Kqi95u#lKMl<7uD{k#iCBbXx z!CIC#or%>YG$yN#Z1-1jO2@<@sR9C0=OCpCXeCgQnQmF8FgsPIpk-Qq-$E%6vimTl z@hJ3!#gq@kHil5ZNqsPThSfdn-k|f2;aFO*&$KUd6iwX_!R#eg4mYF|3rz2J`L?VO zCulXV2EEyG9FWLSk+pK;Dvcu*X|j^)$PBX>gXo--aR=?gcVkpH&?qe4V5_W!;f~Ev1UmM2yPEa^HIdeJ-q)i} zFC6n_M>7VZ7nsnvmemO2OMX}_H7RhvPxIFOMeL2%eYXse8hi%8RDW!eK^p>vn@n8@ znkQ2Wn3T!l6qM^;bF!omoj+5<&U#&GSR1O57v_P3naC!A!NNCWhbF}W0^P-LLXl|= zs{%J_mQ8Ug1+dbBHSju50LNj1e*N_qAYL9XkH`A{+uL9N^{YHR5rW>==t$>etbXA@1N&yFq!f4GrP9xD-`ZOJ@p>t;!%{q0n>}x z2Ha3~Yk~Z0gJ>+X9EjsRsR2EFh{)(3cG+n2MU!v<>2|>)V_6_8((zb}%04u#$0_AH zBQm|J2B9Q*FPcY~EkPa-f@aH(_6TFqUS1X>EV~CG2%h1f1#n$i{iMr7QM0=ffMshE z&SsCL=as&XW&F16#VoFqpc!mgINar?=j9+@Y-I;sH=$hR4$!I@wFx25iR-vRPNa36 zBUKlnoPxlbWWbRD+{Q}sLLyOHW`F`lUXfX-g@RcId`Hq@nQv9CoPkBNtOPH~RaGtM zUezme8?t_g#w-Rc^q*Y^ly!a6>#pc6!pNhIqtPKZQ8rTL544K;Q6Z&r&D{0YHfLG_ zu|sSl)TDh{P`NaUB1cy@v6r7yt$7{b0;0_tqi*KBHQ?YCi zQX+N!wBx0ZrSk!%8*_oVYK&0g8#Q{*q)NnXw$|XNOp{u6lu|BJwj^e+ovUypE4(Nsg@?+2(r`WTJXp0OhfU`N_}K5LcotERsd1nO8! z*gX}!JP?{^wPLIYDcCvYo6btlNSGPet-Usi(AdVUcOzRxw^o8y9g8aP*A$p9QhN=V zg07)RfT|{q4U4O4{B8vSyb%n?saB+7ou836)u5{VUYj5KZ}*5z-zm@}GVmh5JN5u? zPilWdLV!8rCd~TSJ;&m9?gB84NegGBcXA-da8H*MVbk_Lim{i9yf*IDAGQW&E$2AD z^6YNHsohEzx}XXhns zt>@4Aa7(Xp8`TKoeyZjwfd;QA*AIH&Xuhu#*wEJ!0^^Yi2L{QT5)fgZXHq&?g(#dDc` zd;RwD_G{pRGb8Ek2Q4G4ZhNG5gUY^iG9&4ATHEcv&##%xs+Dl8tPQCMR0f`aYzx;4 zs0UBxaRw)6nORaqDC@4mNXup-X?KKMNvU1;8)P62N-XkdfElVPV1Qsm1O-GaV3Dp^ z)Qc@MV|eCTx>v{)i{U3ytf8{DrOcKg)BJ6vVzjlE!6Y5PGCRz!^GO1-5CsP5z~fj4 zv0#Euc|Oh7iimI*?RXptxyv&fVp*7xg%wKVwD?$9MtR*0Bn6^GqhPdy$ay0Xa*1XE z!WMG?DD%XyU})3*%8XP1%OEh*HjqU=I2Ju!c}9;A!DD5LYe`A`;l$& zG(WdU)3$9nk|$v&+iNkSS6Y1J%f?-emb3lzyL=Y77q@qR|5hmpHezXUJWj3q`Di?# z8s1G`POB|(O97Z!#cA4fF6h?mmDW+7Lp7mJNXe$tp-t|4Q;Y(wdWTHV%OCA*$4bUW zwiu|xiRywnSDtpjKBdeM0)WOu$pETU5q4@DSsg<6p$#y;DS>u-3WE^Qdb5>yQ)mIl zor|26oEw03keFRk>p2>zuTFJtg`&9=E^irgK!(CdaNXZgMU;iq!a-pvp6%S#>(uk8b@uNJ!uChd#r0VX%4c<1~3t3b4HM7w~Jv6@@k zx~i3x4KS7Vs*iTpA4E4=oSPa_?XT<()3+s!mBeO~0gq}SxbbiCLYoGixN~=sHD73_ zE))j0+iOt}JJ}&;Ov=^)1&tr?@6XS-WAXjR@1JkKK3-mE_Uq4o|9pR2%lM~EQ{m_5 z=UT72{Cs}Azkm13Ki7BX-xLxkF8F2Ptnhsfcq z-y8wj0$5J!qA<^XvO;w82INc$Qm`gh zYn+kPo?hXU^MG&+CY2N+vru?w*+S14YEG>A=qW_X2qpn6v+RuUSd8#+5pYCY)p|0J zZN6I~P=F#YIzVWV%M78HWkz_i1lM(y>2{O|XpMsjLX5(>{r9edT1dAOxDzKaTWOHg zGGc!YXpxMDFy$54lH`lpE?d7?X8SFghfrd2TuA8=O>2Gb?P(Y{`D$ced1taU2!RQOHOU@Z=-BuS)%1J{&%#nVT$6TqA1qjNyl9ZjEpnOC&J?f&??5~hH zHkwUt+4psfc*<`O-9|5k|GsDK!yQ`fzpB+@gO8McoaBuH#|@k_&BJnZYeii$&AD4< zXX;*|)mAZ7H9AfyP5=x?WjkdzG6>#D89+((c0V;$)S^-VbnO#_TK~90O2lJ3l(=zH zv(MKkGw&zae3nPqYI#Uj6Z5K%+*p|Pdp4)`?@C0W;cWk|RXBidEy%f9++W)qR)D;P z$~dmV`eGuT3dYTCMb6>Xy0P=OXhP0tlL0Br(!iaOc0!W-4UY9fHkALKcDZ%dim*3 ze^KCAc0BC;$Mg5!e>tzui1WJqSorbd<9zz7Uf(}{|Mu-C+Jan)pZ@Zb{ua;Yd&K3} zdHH$%_~-f5fBSF$PVnRX`;Q;LhCU)LbY^nXc<*l$@hG1@`a&=DZ?+M0bHWc07Dmnn zvIlFH4ehfJsV2bB4Oof9Pz7f~secSOXhB_4w&6q0CjhUAZ2Z56k5)cU&y$y;%&M)< zJky9GSlxYAX&o*z=sef5K;{6OUmnIQBFG>;dz>WH_YkPX7UmK%Gs!#x9@#c}5is-c zpwaAff0C!b2zfjREmdLmD*1Vz-e;x=Whz2aV+J$7es|{z;O|u--gud|AD}{`r8iy$9_# zR?F{}sI#hSOIlOEDC{=pC@(#bIx^Q>8P>^r$yTa{gjW6hnWdC<+UgF9w|mX}-)^vp zoE@!zNBZz-q+~gTKD*`}pz2L-za8pog2e_i%^({9+=#sXegmD8-(HI7 zwuDydxdv?rMWSBs61ulk}< zJAGz0GFp0zhdZVz`%&A7_yW}h7{7+bfgYvPqKG?qKjcz6V$6MDb3xzDcBkA{Gsw2z z$6I{4dwS)P5t94)|a^Z9(9&yVAQ&(9y{^NqaD>-;=_W8hdXKYshi z^@s#T|^vKK^)Ms_f*PQ;u2)6gqEI7)H&CX;;dgokX<>Al zhg@{PGX~IN@i-1ijvAqL5U-D80lM6Xwd|$Th7=wF9_#eDT$kw#9m^JtftSZ43%jx@ zQRkOo(Nc!5wI0Xgyv~r!%!i|IY|6^5m!d|nAr}< zQ5d6iN@j0%A31enx0{gMHLfLdi`ttQ`_By*jbu+0z(2^~alD|DMaI)MMo}r%*l4NW zTU?H6k2W4=+;6d^%j~j5*yy7AR7*^D7^-{_(x~M8K*^~Vrz&Z+rK{>qn*X$f9>4k) zbbUPamXZ#V`xr^-_;1f_j@rnHfvqz}7uZ@U1#7-o+AMXhmAzl`q~h?EPap}j((bHM zh?>uwA}lSWGCT$Jgb&ABma;=-U4h+%7=j|qEGtmz?A5!{P#kyoUrk|uAf`IP$~XGM zAC8`A(%IM{)o=F_ZF3w7+Nv=Q?a*zSV0JdlOUb9t-L?sut*yHIdA+)D!62uoBvmWU zQ3Ip$Ll){Pou6AM{E$1|ewqfC_2Z)4Mh<;KH@$<~Ddw?HG^ROxeuCQriZnP%X2`3$ z)hP>!|H~WeH5;?>ej|54G2i|AWzFlxUG5Q^j=6 z!(B8yuxiWldVfbj?q#gWm0gXS2d{FD_DMAEEg3aHb-VO>pWO<+=x(=5+6&o`dVW|K zQz(A7OzVII_<4Pt=f?-v`}+?+&*%C6`>((J>wo*xsgI8zZ;TMUst4fD=Z8Cgy#4dM zzP-Ku2I{ZJPtVUcu4^p|`S;)dex6~0zy0n1bzaYZ{_~&06R7mq5tOk{+{)5M#WF@% zswD1LVqg`5=K&UrGGUEnnOFv)vQuzfpmw9(wr3b>)dLuDSlUF&q?$C-+#~gp0htmO z%7FrsK^|+Z>%1-*J^S8N z_<-roI&7WinIQrr9%iqPLmm#jJnTGOl2KmWhY-Ot9Ds?3l!?asc8 zIXjm1cs;OXd%5CDnruPZo|v0ibQfzkm&^QMq9H=No^SGg{=H2AY@_G?l#SQ`l+R>O z72t+H!&B|LxeK@Ucz;nB0}02i)UWQJ=U36_L-$|aS6cug|JiP^DLra!(MCLhnKurb z#Ws3i`?`kJ@rOgthgvlnFAduQTjRyR7rCsuX444wyn-pk7s~PUMQJr6-l(&l+0A2( zDnHPdg9pnV&O_fe2b(uqKJ}q$@2z3qhMzamns=1jsQ%dzxZ$Jh6H-%Ctf7r5hhS8S z58JN4&ESOfGd3YqR9O>gon`c;3d1qwnz?E1B93zHZ2e!GY$0A0)Le=CcJ_*H5w-S` z&gXABW(W`ab-CF>eQaKA>gaSb`~hYqfi>W6)Q*l--Tb*<7ur8BlHR|%oyz`I%Lh!L z6TPF&=Dhvy-tS$re)(r-?G(5x$KjSwTXuEV^IC#1*?nzR=bm|g?_KO|&&Kd`3*mOI zZSi^E++D8By$-gxeWQ&iq{G9jgRaL~y3Y4F-%shf{`9<_Z{L4^KHr`fK0m*QKMC0q zBm+F23SQFhzyJK_KmYaZ`>$p?esa*WD-59sH^lk;@%^{B+|3-sb!A?5n_Gwu=cIv( zwz%^4?*28PQIkdssbpaWg_2Ra#fHX*L|XvVlX8(xoE+@{Krrl(VGTKrIF^z0)S(7j zyt3(|b+l}g4QXapVg1Yrw8rLj>c-<(@;Hu_LN3DBIwIt**T;g{6>)hIlFUqj($4^Z z)v_@`P^Mr?M`8nMFME1k9H4@`{gzbgV^_BCH=oG4cFsbcws9C%C2zofHthjt9Hqi#_LYQgh2Dp1T2%Jd&9>S}Ai~O+``wdjG)v0P0Q<|{^HvKS~rJTExr}NJ>30Y1?Y(S61F3;s#sw>UHk1Ky11j9 zU(PXuYE#w9xtCH!E$r3^AZLtxA&qL^$uF1DAavSiP-?TC$liwemk0!sq}sS5;~wVg z!)$+E>GX0Rq5L;Q1skHh_IGNUkYW?0>RxZxT`q!Mc+|VOxe-bW&+}{JBSy!TS0j&G zjn2MZYO<7&Mj8tvH1OM0HW&ZJOQorA=;O|{)FYuD8am>-i$C+2n0eMP@~{Un%E{1o`r= z!LzrYfb9-pQ{5kVf3thL2l}ytJ2WQQ{qtzMXs?Jj0v!X3Uru^HJ)11jp94&ZaknA| zD6+rU{?o75_J!cE&!Qj1BKfWdbS%7o{CI!=?s59Z^Y`EF^6SUj4=KL?eqPt7Eyi`3 z9g3iVj!PH8&(H7S=Xre!*Yj`R&8mHiptT6tb)AoExw}xF7PL}r&KZTUH;em1(THdh zOZ7O-t?h{@sSqMdhm(gvqldbuS)ZCl6k24@VQ8f%i6n4&9EXv-LZS|lW-n`fJg*Q8 zx;$)|0tcD1Ce?E)$qfZc?g0;5%;v>{U;c6&upG7p7hJ&Q%Z%iCg`~9rz(d&x*Zr#L z2*WQlDVFhZtZ=7fgd#3?fXgfcI#;C7&@zU11F~Zwp%M_Th%3_=j>jtWZwBFfUU}*k zBxGx43Iuw72y@gJVC4CHUVxM%hE~?PuM97Q+&!)2ynEV_^E%wGSVWFuN?Y2vYOt%! zxU87LuMBp;{UU9ZUoDWm$d#*RM2?Zj-vP=IM+I+}5uk^Nu$nqmS~7=Y0FZRF#NT$= z=KIno^Y0NeTgJAk-IUzd)+!CqhPJ#@{a0x;(r|z4_Niv_yZLzgHe2I-dHhXm{#PmZ z1+Hv`Tib01#_bFJvT`K!a`z|NeUrUsbsOSg^P;Y$TgSod0y zlr7S>4_xW#;e;FW9J1;m5r}%9ozuB*S$*K#7dsB4FA9GmmvvmJ>%0D3;D8>budC^? zdto;ins-{kKaSqvA8-bNoN=YCvwzS+Ck7K3W$UxCL`i1UTo3pfg6FPO6)6e!y8?RH<9duf^V747u; z+mWz$GM}HTx>3N?cFopEW&$Q}p6fdMKHq&3?33ynAI)3`UeBuMw;ZUOX{XXnpl%n= zyr)5KeQ1E-_G;AUS5_p^3Ivb?y*c}CV4s9izPNw4;K%mptHI+=>S0W z?Aga8s4By$5jSnQWXA1CG;3yWbE`C(R7DR3XhL4$BSZ#<41nCLdSAG$9=JTJ(MNWL z&9ouZMiUvBQD+dWCT$)x7;F);p$|HNdRS{>bTf*$1<6f6R%PF x>Y@a5g-Z(ZDt}tKM$ None: + """Exec the python source given in a new module namespace + + Does not return anything, but exceptions raised by the source + will propagate out unmodified + """ + try: + exec(source, {"__MODULE__": "__main__"}) + except Exception: + print(source) + raise + + +def check_code_block(block: str, lang: str = "python") -> str: + """Cleans the found codeblock and checks if the proglang is correct. + + Returns an empty string if the codeblock is deemed invalid. + + Args: + block: the code block to analyse + lang: if not None, the language that is assigned to the codeblock + """ + first_line = block.split("\n")[0] + if lang: + line_elements = first_line[3:].split(" ", 2) + if len(line_elements) == 1: + block_lang = line_elements[0] + title_value = None + elif len(line_elements) == 2: + block_lang, title = line_elements + title_elements = title.replace(" ", "").split("=", 2) + if len(title_elements) == 2: + _, title_value = title_elements + else: + title_value = None + else: + block_lang = None + title_value = None + + if block_lang != lang: + return "" + if title_value == '"PYTEST_IGNORE"': + return "" + return "\n".join(block.split("\n")[1:]) + + +def get_code_blocks(docstring: str, lang: str = "python") -> list[str]: + """Given a docstring, grab all the markdown codeblocks found in docstring. + + Args: + docstring: the docstring to analyse + lang: if not None, the language that is assigned to the codeblock + """ + docstring = textwrap.dedent(docstring) + in_block = False + block = "" + codeblocks = [] + for line in docstring.split("\n"): + if line.startswith("```"): + if in_block: + codeblocks.append(check_code_block(block, lang=lang)) + block = "" + in_block = not in_block + if in_block: + block += line + "\n" + return [c for c in codeblocks if c != ""] + + +def get_all_code_blocks(path: str) -> list[dict]: + return [ + {"id": f"{str(fpath)}-{block_num + 1}", "code": code_block} + for fpath in pathlib.Path().glob(path) + for block_num, code_block in enumerate(get_code_blocks(fpath.read_text())) + ] diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index c230501a9..e9972660f 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -72,37 +72,37 @@ class TesterPromptDriverOption: ), "AZURE_CHAT_35_TURBO": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY"], + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-35-turbo", azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_API_BASE"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ), enabled=True, ), - "AZURE_CHAT_35_TURBO_16k": TesterPromptDriverOption( + "AZURE_CHAT_35_TURBO_16K": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY"], + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-35-turbo-16k", - azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16k_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_API_BASE"], + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ), enabled=True, ), "AZURE_CHAT_4": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY"], + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-4", azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_API_BASE"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ), enabled=True, ), - "AZURE_CHAT_4_32k": TesterPromptDriverOption( + "AZURE_CHAT_4_32K": TesterPromptDriverOption( prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY"], + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-4-32k", - azure_deployment=os.environ["AZURE_OPENAI_4_32k_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_API_BASE"], + azure_deployment=os.environ["AZURE_OPENAI_4_32K_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ), enabled=True, ), @@ -216,7 +216,7 @@ class TesterPromptDriverOption: PROMPT_DRIVERS["OPENAI_CHAT_4"], PROMPT_DRIVERS["OPENAI_CHAT_4_1106_PREVIEW"], PROMPT_DRIVERS["AZURE_CHAT_4"], - PROMPT_DRIVERS["AZURE_CHAT_4_32k"], + PROMPT_DRIVERS["AZURE_CHAT_4_32K"], PROMPT_DRIVERS["ANTHROPIC_CLAUDE_3_OPUS"], PROMPT_DRIVERS["GOOGLE_GEMINI_PRO"], ] @@ -274,10 +274,10 @@ def verify_structure_output(self, structure) -> dict: ), ], prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY"], + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], model="gpt-4", azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_API_BASE"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], response_format="json_object", ), tasks=[ From fe9abf983413319a287be716faee7cb9c9c6105e Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Apr 2024 14:18:07 -0700 Subject: [PATCH 020/238] Add missing readthedocs poetry setup (#748) --- .readthedocs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yml b/.readthedocs.yml index 4e6ae54a4..d9aa46776 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,6 +5,9 @@ build: tools: python: "3.11" jobs: + post_create_environment: + - pip install poetry + - poetry config virtualenvs.create false post_install: - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --with docs From b944728ac6fa4c1d71f92d037b0bed6d4a977eef Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 16 Apr 2024 14:40:07 -0700 Subject: [PATCH 021/238] Remove references to old docs repo (#749) --- README.md | 2 +- docs/contributing.md | 23 +++-------------------- docs/examples/index.md | 2 +- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 66d21c82f..847c9d9c9 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ We welcome and encourage pull requests. To streamline the process, please follow 3. **Unit Tests:** Ensure that your pull request passes all existing unit tests. Additionally, if you are introducing new code, please include new unit tests to validate its functionality. -4. **Documentation:** Every pull request must include a corresponding pull request in the [docs repository](https://github.com/griptape-ai/griptape-docs) or explicitly explain why a documentation update is not required. Documentation is crucial for maintaining a comprehensive and user-friendly project. +4. **Documentation:** Every pull request must include updates to documentation or explicitly explain why a documentation update is not required. Documentation is crucial for maintaining a comprehensive and user-friendly project. 5. **Code Style:** Griptape uses [Black](https://github.com/ambv/black) to enforce style guidelines. You can ensure that your code is formatted accordingly and will pass formatting checks using `pre-commit`. See [Tools](#tools) for information on how to configure this and other dev tools. diff --git a/docs/contributing.md b/docs/contributing.md index 0e4ba9670..0342dcd81 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -4,7 +4,7 @@ Thank you for considering contributing to Griptape documentation! Before you sta ## Submitting Issues -If you have identified a documentation issue, want to propose new documentation, or have a question, please submit an issue through our public [issue tracker](https://github.com/griptape-ai/griptape-docs/issues). Before submitting a new issue, please check the existing issues to ensure it hasn't been reported or discussed before. +If you have identified a documentation issue, want to propose new documentation, or have a question, please submit an issue through our public [issue tracker](https://github.com/griptape-ai/griptape/issues). Before submitting a new issue, please check the existing issues to ensure it hasn't been reported or discussed before. ## Submitting Pull Requests @@ -17,13 +17,11 @@ We welcome and encourage pull requests. To streamline the process, please follow ## Getting Started Griptape docs are built using [MkDocs](https://squidfunk.github.io/mkdocs-material/getting-started/). Dependencies are managed using [Poetry](https://python-poetry.org/). -To directly contribute to Griptape documentation, first fork the [griptape-docs](https://github.com/griptape-ai/griptape-docs) repository to your GitHub account. Then clone your repository to your local machine. - -From inside the directory run: +To contribute to Griptape docs, install the `docs` extra with: ```poetry install --with docs``` -To run `griptape-docs` locally run: +Then serve the documentation locally with: ```poetry run mkdocs serve``` @@ -37,18 +35,3 @@ INFO - [09:28:33] Watching paths for changes: 'docs', 'mkdocs.yml' INFO - [09:28:33] Serving on http://127.0.0.1:8000/ INFO - [09:28:37] Browser connected: http://127.0.0.1:8000/ ``` - -### Reference Docs - -You may see many `WARNING` messages in the console output. This is because the [reference docs](./reference/griptape/index.md) are not built. -Fixing this is not necessary to contribute to the documentation, but it helps to reduce noise in the console output. - -First, clone the Griptape repository to a separate directory: - -`git clone git@github.com:griptape-ai/griptape.git ~/some/other/directory/` - -Then, create a symlink called `griptape` in the `griptape-docs` repository: - -`ln -s ~/some/other/directory/griptape griptape` - -The `WARNING` messages should now be resolved. diff --git a/docs/examples/index.md b/docs/examples/index.md index acd38e988..63791c114 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -1,3 +1,3 @@ This section of the documentation is dedicated to examples highlighting Griptape functionality. -We try to keep all examples up to date, but if you think there is a bug please [submit a pull request](https://github.com/griptape-ai/griptape-docs/tree/main/docs/examples). We are also more than happy to include new examples :) \ No newline at end of file +We try to keep all examples up to date, but if you think there is a bug please [submit a pull request](https://github.com/griptape-ai/griptape/tree/dev/docs/examples). We are also more than happy to include new examples :) From 77ba1a7291d19164ac9a047949ec55e677b6c823 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Wed, 17 Apr 2024 11:41:05 -0500 Subject: [PATCH 022/238] Fix type hint for token_provider, Add missing params in `AzureOpenAiCompletionPromptDriver` openai client (#750) --- CHANGELOG.md | 4 ++++ .../drivers/embedding/azure_openai_embedding_driver.py | 6 ++++-- .../azure_openai_image_generation_driver.py | 6 ++++-- .../drivers/prompt/azure_openai_chat_prompt_driver.py | 6 ++++-- .../prompt/azure_openai_completion_prompt_driver.py | 8 ++++++-- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93291262f..c1ff2f6cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. - Moved [Griptape Docs](https://github.com/griptape-ai/griptape-docs) to this repository. +### Fixed +- Type hint for parameter `azure_ad_token_provider` on Azure OpenAI drivers to `Optional[Callable[[], str]]`. +- Missing parameters `azure_ad_token` and `azure_ad_token_provider` on the default client for `AzureOpenAiCompletionPromptDriver`. + ## [0.24.2] - 2024-04-04 - Fixed FileManager.load_files_from_disk schema. diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index 1f91f5a06..3cf473c06 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Optional +from typing import Callable, Optional from attr import define, field, Factory from griptape.drivers import OpenAiEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer @@ -23,7 +23,9 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) - azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) tokenizer: OpenAiTokenizer = field( default=Factory(lambda self: OpenAiTokenizer(model=self.model), takes_self=True), kw_only=True diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index 885fd451c..d037656ca 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -2,7 +2,7 @@ import openai from attr import field, Factory, define -from typing import Optional +from typing import Callable, Optional from griptape.drivers import OpenAiImageGenerationDriver @@ -23,7 +23,9 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) api_version: str = field(default="2024-02-01", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( default=Factory( diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 3e1e2af5b..9824c31a0 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -1,5 +1,5 @@ from attr import define, field, Factory -from typing import Optional +from typing import Callable, Optional from griptape.utils import PromptStack from griptape.drivers import OpenAiChatPromptDriver import openai @@ -20,7 +20,9 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( default=Factory( diff --git a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py index b0f986ac3..805b45519 100644 --- a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Callable, Optional from attr import define, field, Factory from griptape.drivers import OpenAiCompletionPromptDriver import openai @@ -19,7 +19,9 @@ class AzureOpenAiCompletionPromptDriver(OpenAiCompletionPromptDriver): azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - azure_ad_token_provider: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) api_version: str = field(default="2023-05-15", kw_only=True, metadata={"serializable": True}) client: openai.AzureOpenAI = field( default=Factory( @@ -29,6 +31,8 @@ class AzureOpenAiCompletionPromptDriver(OpenAiCompletionPromptDriver): api_version=self.api_version, azure_endpoint=self.azure_endpoint, azure_deployment=self.azure_deployment, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, ), takes_self=True, ) From e16f729d6e621a071e45ff746aca018e73d8be34 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 17 Apr 2024 19:41:30 +0200 Subject: [PATCH 023/238] Add optional exception attribute to ErrorArtifact (#747) --- CHANGELOG.md | 1 + griptape/artifacts/error_artifact.py | 2 ++ griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/base_task.py | 2 +- griptape/tasks/tool_task.py | 2 +- tests/unit/artifacts/test_error_artifact.py | 3 +++ 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1ff2f6cf..8d16348bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `output_task_input` and `output_task_output` fields to `FinishStructureRunEvent`. - `AmazonS3FileManagerDriver` for managing files on Amazon S3. - `MediaArtifact` as a base class for `ImageArtifact` and future media Artifacts. +- Optional `exception` field to `ErrorArtifact`. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. diff --git a/griptape/artifacts/error_artifact.py b/griptape/artifacts/error_artifact.py index d2d194e70..f2fb02a8f 100644 --- a/griptape/artifacts/error_artifact.py +++ b/griptape/artifacts/error_artifact.py @@ -1,4 +1,5 @@ from __future__ import annotations +from typing import Optional from attr import define, field from griptape.artifacts import BaseArtifact @@ -6,6 +7,7 @@ @define class ErrorArtifact(BaseArtifact): value: str = field(converter=str, metadata={"serializable": True}) + exception: Optional[Exception] = field(default=None, kw_only=True, metadata={"serializable": False}) def __add__(self, other: BaseArtifact) -> ErrorArtifact: return ErrorArtifact(self.value + other.value) diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index bca7f6987..6ed1bff5d 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -105,7 +105,7 @@ def run(self) -> BaseArtifact: except Exception as e: self.structure.logger.error(f"Subtask {self.id}\n{e}", exc_info=True) - self.output = ErrorArtifact(str(e)) + self.output = ErrorArtifact(str(e), exception=e) finally: if self.output is not None: return self.output diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index a88ae43f5..7c583763f 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -112,7 +112,7 @@ def execute(self) -> Optional[BaseArtifact]: except Exception as e: self.structure.logger.error(f"{self.__class__.__name__} {self.id}\n{e}", exc_info=True) - self.output = ErrorArtifact(str(e)) + self.output = ErrorArtifact(str(e), exception=e) finally: self.state = BaseTask.State.FINISHED diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index dbadc3f10..f875186ea 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -68,7 +68,7 @@ def run(self) -> BaseArtifact: else: self.output = InfoArtifact("No tool output") except Exception as e: - self.output = ErrorArtifact(f"Error processing tool input: {e}") + self.output = ErrorArtifact(f"Error processing tool input: {e}", exception=e) return self.output else: return ErrorArtifact("No action found in prompt output.") diff --git a/tests/unit/artifacts/test_error_artifact.py b/tests/unit/artifacts/test_error_artifact.py index 4ed79e36d..120f6406e 100644 --- a/tests/unit/artifacts/test_error_artifact.py +++ b/tests/unit/artifacts/test_error_artifact.py @@ -11,3 +11,6 @@ def test_to_text(self): def test_to_dict(self): assert ErrorArtifact("foobar").to_dict()["value"] == "foobar" + + def test_exception_instance(self): + assert isinstance(ErrorArtifact("foobar", exception=Exception("foobar")).exception, Exception) From 16305a078fdb37cd23248c3353c61ce125d70997 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Fri, 19 Apr 2024 17:47:04 +0200 Subject: [PATCH 024/238] Edit events route in GriptapeCloudEventListenerDriver (#753) --- .../event_listener/griptape_cloud_event_listener_driver.py | 2 +- .../event_listener/test_griptape_cloud_event_listener_driver.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 0b59d93cb..51b62aeac 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -27,6 +27,6 @@ def validate_run_id(self, _, run_id: str): ) def try_publish_event(self, event: BaseEvent) -> None: - url = urljoin(self.base_url.strip("/"), f"/api/runs/{self.run_id}/events") + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.run_id}/events") requests.post(url=url, json=event.to_dict(), headers=self.headers) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index 04b7de4e7..c459fc8a2 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -27,7 +27,7 @@ def test_try_publish_event(self, mock_post, driver): driver.try_publish_event(event=event) mock_post.assert_called_once_with( - url=f"https://cloud.griptape.ai/api/runs/{driver.run_id}/events", + url=f"https://cloud.griptape.ai/api/structure-runs/{driver.run_id}/events", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"}, ) From f16f421b8acce2e1de07cdd04e205b500795e4df Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 22 Apr 2024 19:19:39 -0700 Subject: [PATCH 025/238] Feature/conversation memory (#751) --- .github/workflows/docs-integration-tests.yml | 10 +- docs/examples/amazon-dynamodb-sessions.md | 92 +++++++++++++++++++ .../drivers/conversation-memory-drivers.md | 47 ++++++++++ .../structures/conversation-memory.md | 62 ------------- mkdocs.yml | 2 + 5 files changed, 144 insertions(+), 69 deletions(-) create mode 100644 docs/examples/amazon-dynamodb-sessions.md create mode 100644 docs/griptape-framework/drivers/conversation-memory-drivers.md diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index bba8bdcdd..ad4457a20 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -1,15 +1,11 @@ name: Docs Integration Tests on: - pull_request: - types: - - opened - - reopened - branches: [ "main", "dev" ] - paths: - - "docs/**" + pull_request_review: + types: [submitted] jobs: test: + if: github.event.review.state == 'APPROVED' runs-on: ubuntu-latest strategy: fail-fast: false diff --git a/docs/examples/amazon-dynamodb-sessions.md b/docs/examples/amazon-dynamodb-sessions.md new file mode 100644 index 000000000..279cced2a --- /dev/null +++ b/docs/examples/amazon-dynamodb-sessions.md @@ -0,0 +1,92 @@ +Griptape provides [Conversation Memory](../griptape-framework/structures/conversation-memory.md) as a means of persisting conversation context across multiple Structure runs. +If you provide it with a suitable Driver, the memory of the previous conversation can be preserved between run of a Structure, giving it additional context for how to respond. +While we can use the [LocalConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#localconversationmemorydriver) to store the conversation history in a local file, this may not be suitable for production use cases. + +In this example, we will show you how to use the [AmazonDynamoDbConversationMemoryDriver](../griptape-framework/drivers/conversation-memory-drivers.md#amazondynamodbconversationmemorydriver) to persist the memory in an [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) table. Please refer to the [Amazon DynamoDB documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) for information on setting up DynamoDB. + +This code implements the idea of a generic "Session" that represents a Conversation Memory entry. For example, a "Session" could be used to represent an individual user's conversation, or a group conversation thread. + +```python +import sys +import os +import argparse + +import boto3 +from griptape.drivers import ( + AmazonDynamoDbConversationMemoryDriver, +) +from griptape.structures import Agent +from griptape.memory.structure import ConversationMemory + +if len(sys.argv) > 2: + input = sys.argv[1] + session_id = sys.argv[2] +else: + input = "Hello!" # Default input + session_id = "session-id-123" # Default session ID + +structure = Agent( + conversation_memory=ConversationMemory( + driver=AmazonDynamoDbConversationMemoryDriver( + session=boto3.Session( + aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"], + aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"], + ), + table_name=os.environ["DYNAMODB_TABLE_NAME"], # The name of the DynamoDB table + partition_key="id", # The name of the partition key + partition_key_value=session_id, # The value of the partition key + value_attribute_key="value", # The key in the DynamoDB item that stores the memory value + ) + ) +) + +print(structure.run(input).output_task.output.value) +``` + +Conversation Memory for an individual user: + +```bash +python session.py "Hello my name is Collin." "user-id-123" +python session.py "What is my name?" "user-id-123" +``` + +``` +> Hello Collin! How can I assist you today? +> Your name is Collin. +``` + +```json +{ + "id": { + "S": "user-id-123" + }, + "value": { + "S": "{\"type\": \"ConversationMemory\", \"runs\": [{\"type\": \"Run\", \"id\": \"8c403fb92b134b14a0af8847e52e6212\", \"input\": \"Hello my name is Collin.\", \"output\": \"Hello Collin! How can I assist you today?\"}, {\"type\": \"Run\", \"id\": \"706d9fb072ca49e192bfed7fc1964925\", \"input\": \"What is my name?\", \"output\": \"Your name is Collin.\"}], \"max_runs\": null}" + } +} +``` + +Conversation Memory for a group of users: + +```bash +python session.py "Hello my name is Zach." "group-id-122" +python session.py "And I'm Matt" "group-id-123" +python session.py "And I'm Collin, who all is here?" "group-id-123" +``` + +``` +> Hello Zach! How can I assist you today? +> Hello Matt! Nice to meet you too. How can I help you today? +> Hello Collin! So far, we have Zach, Matt, and now you. How can I assist you all today? +``` + +```json +{ + "id": { + "S": "group-id-123" + }, + "value": { + "S": "{\"type\": \"ConversationMemory\", \"runs\": [{\"type\": \"Run\", \"id\": \"b612cdf5908845e392c026e1cf00460b\", \"input\": \"Hello my name is Zach.\", \"output\": \"Hello Zach! How can I assist you today?\"}, {\"type\": \"Run\", \"id\": \"4507988d82164cad8a288da8c984817c\", \"input\": \"And I'm Matt\", \"output\": \"Hello Matt! Nice to meet you too. How can I help you today?\"}, {\"type\": \"Run\", \"id\": \"65a70c22dae24655b312cf8eaa649bfd\", \"input\": \"And I'm Collin, who all is here?\", \"output\": \"Hello Collin! So far, we have Zach, Matt, and now you. How can I assist you all today?\"}], \"max_runs\": null}" + } +} +``` diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md new file mode 100644 index 000000000..d429be527 --- /dev/null +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -0,0 +1,47 @@ +## Overview + +You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). + +### LocalConversationMemoryDriver + +The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. + +```python +from griptape.structures import Agent +from griptape.drivers import LocalConversationMemoryDriver +from griptape.memory.structure import ConversationMemory + +local_driver = LocalConversationMemoryDriver(file_path="memory.json") +agent = Agent(conversation_memory=ConversationMemory(driver=local_driver)) + +agent.run("Surfing is my favorite sport.") +agent.run("What is my favorite sport?") +``` + +### AmazonDynamoDbConversationMemoryDriver + +!!! info + This driver requires the `drivers-memory-conversation-amazon-dynamodb` [extra](../index.md#extras). + +The [AmazonDynamoDbConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.md) allows you to persist Conversation Memory in [Amazon DynamoDb](https://aws.amazon.com/dynamodb/). + +```python +import os +import uuid +from griptape.drivers import AmazonDynamoDbConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +dynamodb_driver = AmazonDynamoDbConversationMemoryDriver( + table_name=os.environ["DYNAMODB_TABLE_NAME"], + partition_key="id", + value_attribute_key="memory", + partition_key_value=conversation_id, +) + +agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") +``` diff --git a/docs/griptape-framework/structures/conversation-memory.md b/docs/griptape-framework/structures/conversation-memory.md index 0fdcf1867..92fdf98c4 100644 --- a/docs/griptape-framework/structures/conversation-memory.md +++ b/docs/griptape-framework/structures/conversation-memory.md @@ -97,65 +97,3 @@ agent.run("Hello!") print(agent.conversation_memory.summary) ``` -## Conversation Memory Drivers - -You can persist and load memory by using Conversation Memory Drivers. You can build drivers for your own data stores by extending [BaseConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/base_conversation_memory_driver.md). - -```python -from griptape.drivers import LocalConversationMemoryDriver -from griptape.structures import Agent -from griptape.memory.structure import ConversationMemory - -memory_driver = LocalConversationMemoryDriver(file_path="memory.json") - -agent_1 = Agent(conversation_memory=ConversationMemory(driver=memory_driver)) -agent_1.run("Skateboarding is my favorite activity.") - -agent_2 = Agent(conversation_memory=memory_driver.load()) -agent_2.run("What is my favorite activity?") -``` - -### Local Conversation Memory Driver - -The [LocalConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/local_conversation_memory_driver.md) allows you to persist Conversation Memory in a local JSON file. - -```python -from griptape.structures import Agent -from griptape.drivers import LocalConversationMemoryDriver -from griptape.memory.structure import ConversationMemory - -local_driver = LocalConversationMemoryDriver(file_path="memory.json") -agent = Agent(conversation_memory=ConversationMemory(driver=local_driver)) - -agent.run("Surfing is my favorite sport.") -agent.run("What is my favorite sport?") -``` - -### Amazon DynamoDb Conversation Memory Driver - -!!! info - This driver requires the `drivers-memory-conversation-amazon-dynamodb` [extra](../index.md#extras). - -The [AmazonDynamoDbConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.md) allows you to persist Conversation Memory in [Amazon DynamoDb](https://aws.amazon.com/dynamodb/). - -```python -import os -import uuid -from griptape.drivers import AmazonDynamoDbConversationMemoryDriver -from griptape.memory.structure import ConversationMemory -from griptape.structures import Agent - -conversation_id = uuid.uuid4().hex -dynamodb_driver = AmazonDynamoDbConversationMemoryDriver( - table_name=os.environ["DYNAMODB_TABLE_NAME"], - partition_key="id", - value_attribute_key="memory", - partition_key_value=conversation_id, -) - -agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) - -agent.run("My name is Jeff.") -agent.run("What is my name?") -``` - diff --git a/mkdocs.yml b/mkdocs.yml index 0b9852e82..bb90117a3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -102,6 +102,7 @@ nav: - SQL Drivers: "griptape-framework/drivers/sql-drivers.md" - Image Query Drivers: "griptape-framework/drivers/image-query-drivers.md" - Web Scraper Drivers: "griptape-framework/drivers/web-scraper-drivers.md" + - Conversation Memory Drivers: "griptape-framework/drivers/conversation-memory-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" @@ -145,6 +146,7 @@ nav: - Talk to a Webpage: "examples/talk-to-a-webpage.md" - Talk to a PDF: "examples/talk-to-a-pdf.md" - Shared Memory Between Agents: "examples/multiple-agent-shared-memory.md" + - Chat Sessions with Amazon DynamoDB: "examples/amazon-dynamodb-sessions.md" - Data: - Load and Query Pinecone: "examples/load-and-query-pinecone.md" - Load and Query Marqo: "examples/load-query-and-chat-marqo.md" From 670616f2fa8d6da154b01710051bb1dd6e7dae7f Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 23 Apr 2024 14:11:59 -0700 Subject: [PATCH 026/238] Pull cloud url from env var (#756) --- .../griptape_cloud_event_listener_driver.py | 13 ++++++++++++- .../test_griptape_cloud_event_listener_driver.py | 15 +++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 51b62aeac..7f52b3519 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -12,7 +12,18 @@ @define class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): - base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) + """Driver for publishing events to Griptape Cloud. + + Attributes: + base_url: The base URL of Griptape Cloud. Defaults to the GT_CLOUD_BASE_URL environment variable. + api_key: The API key to authenticate with Griptape Cloud. + headers: The headers to use when making requests to Griptape Cloud. Defaults to include the Authorization header. + run_id: The ID of the Structure Run to publish events to. Defaults to the GT_CLOUD_RUN_ID environment variable. + """ + + base_url: str = field( + default=Factory(lambda: os.getenv("GT_CLOUD_BASE_URL", "https://cloud.griptape.ai")), kw_only=True + ) api_key: str = field(kw_only=True) headers: dict = field( default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index c459fc8a2..bbffa1059 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -1,8 +1,11 @@ +import os from unittest.mock import Mock -from pytest import fixture + import pytest -from tests.mocks.mock_event import MockEvent +from pytest import fixture + from griptape.drivers.event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver +from tests.mocks.mock_event import MockEvent class TestGriptapeCloudEventListenerDriver: @@ -17,17 +20,21 @@ def mock_post(self, mocker): @fixture() def driver(self): - return GriptapeCloudEventListenerDriver(api_key="foo bar", run_id="baz") + os.environ["GT_CLOUD_BASE_URL"] = "https://cloud123.griptape.ai" + + return GriptapeCloudEventListenerDriver(api_key="foo bar", run_id="bar baz") def test_init(self, driver): assert driver + assert driver.api_key == "foo bar" + assert driver.run_id == "bar baz" def test_try_publish_event(self, mock_post, driver): event = MockEvent() driver.try_publish_event(event=event) mock_post.assert_called_once_with( - url=f"https://cloud.griptape.ai/api/structure-runs/{driver.run_id}/events", + url="https://cloud123.griptape.ai/api/structure-runs/bar baz/events", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"}, ) From 30d3e29cb807fc22734b670248d119d15e694c05 Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Thu, 25 Apr 2024 17:00:53 -0400 Subject: [PATCH 027/238] Rename GT Cloud run ID env var (#758) --- .../griptape_cloud_event_listener_driver.py | 14 +++++++------- .../test_griptape_cloud_event_listener_driver.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 7f52b3519..90b94c313 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -18,7 +18,7 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): base_url: The base URL of Griptape Cloud. Defaults to the GT_CLOUD_BASE_URL environment variable. api_key: The API key to authenticate with Griptape Cloud. headers: The headers to use when making requests to Griptape Cloud. Defaults to include the Authorization header. - run_id: The ID of the Structure Run to publish events to. Defaults to the GT_CLOUD_RUN_ID environment variable. + structure_run_id: The ID of the Structure Run to publish events to. Defaults to the GT_CLOUD_STRUCTURE_RUN_ID environment variable. """ base_url: str = field( @@ -28,16 +28,16 @@ class GriptapeCloudEventListenerDriver(BaseEventListenerDriver): headers: dict = field( default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True ) - run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_RUN_ID")), kw_only=True) + structure_run_id: str = field(default=Factory(lambda: os.getenv("GT_CLOUD_STRUCTURE_RUN_ID")), kw_only=True) - @run_id.validator # pyright: ignore - def validate_run_id(self, _, run_id: str): - if run_id is None: + @structure_run_id.validator # pyright: ignore + def validate_run_id(self, _, structure_run_id: str): + if structure_run_id is None: raise ValueError( - "run_id must be set either in the constructor or as an environment variable (GT_CLOUD_RUN_ID)." + "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID)." ) def try_publish_event(self, event: BaseEvent) -> None: - url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.run_id}/events") + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/events") requests.post(url=url, json=event.to_dict(), headers=self.headers) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index bbffa1059..8d2a261ba 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -22,12 +22,12 @@ def mock_post(self, mocker): def driver(self): os.environ["GT_CLOUD_BASE_URL"] = "https://cloud123.griptape.ai" - return GriptapeCloudEventListenerDriver(api_key="foo bar", run_id="bar baz") + return GriptapeCloudEventListenerDriver(api_key="foo bar", structure_run_id="bar baz") def test_init(self, driver): assert driver assert driver.api_key == "foo bar" - assert driver.run_id == "bar baz" + assert driver.structure_run_id == "bar baz" def test_try_publish_event(self, mock_post, driver): event = MockEvent() @@ -39,6 +39,6 @@ def test_try_publish_event(self, mock_post, driver): headers={"Authorization": "Bearer foo bar"}, ) - def test_no_run_id(self): + def test_no_structure_run_id(self): with pytest.raises(ValueError): GriptapeCloudEventListenerDriver(api_key="foo bar") From f2ac9ca161c41c17289276084d9dd7636786e589 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 26 Apr 2024 13:51:10 -0700 Subject: [PATCH 028/238] Fix vector query engine exceeding token limits (#759) --- griptape/engines/query/vector_query_engine.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py index ac38a05a3..7ca42f59f 100644 --- a/griptape/engines/query/vector_query_engine.py +++ b/griptape/engines/query/vector_query_engine.py @@ -61,7 +61,11 @@ def query( if message_token_count + self.answer_token_offset >= tokenizer.max_input_tokens: text_segments.pop() - user_message = self.user_template_generator.render(query=query, text_segments=text_segments) + system_message = self.system_template_generator.render( + rulesets=J2("rulesets/rulesets.j2").render(rulesets=rulesets), + metadata=metadata, + text_segments=text_segments, + ) break From 9aa2f02774c35c5c60fd65aecb2ff8706e817448 Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Mon, 29 Apr 2024 12:27:02 -0400 Subject: [PATCH 029/238] Add cloud docs API Reference (#760) --- docs/griptape-cloud/api/api-reference.md | 1 + docs/griptape-cloud/index.md | 3 +++ docs/index.md | 4 ++++ docs/plugins/swagger_ui_plugin.py | 2 +- mkdocs.yml | 3 +++ 5 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 docs/griptape-cloud/api/api-reference.md create mode 100644 docs/griptape-cloud/index.md diff --git a/docs/griptape-cloud/api/api-reference.md b/docs/griptape-cloud/api/api-reference.md new file mode 100644 index 000000000..95ed4459e --- /dev/null +++ b/docs/griptape-cloud/api/api-reference.md @@ -0,0 +1 @@ +# Content overriden by Swagger Plugin \ No newline at end of file diff --git a/docs/griptape-cloud/index.md b/docs/griptape-cloud/index.md new file mode 100644 index 000000000..6a841dccc --- /dev/null +++ b/docs/griptape-cloud/index.md @@ -0,0 +1,3 @@ +# Griptape Cloud + +Griptape Cloud is a managed platform for running AI-powered agents, pipelines, and workflows. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 727761f87..5d22224e7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,6 +6,10 @@ Welcome to Griptape Docs! This documentation is organized into the following sec Griptape Topic Guides discuss key topics at a high level and provide useful background information and explanation. +### Griptape Cloud + +[Griptape Cloud](griptape-cloud/api/api-reference.md) provides an overview of the APIs available in the managed cloud service. + ### Griptape Framework [Griptape Framework](griptape-framework/index.md) provides an overview of the key topics within Griptape, and how you can get started building agents. diff --git a/docs/plugins/swagger_ui_plugin.py b/docs/plugins/swagger_ui_plugin.py index 0243f6900..6d5fb52da 100644 --- a/docs/plugins/swagger_ui_plugin.py +++ b/docs/plugins/swagger_ui_plugin.py @@ -5,7 +5,7 @@ from markupsafe import Markup config_scheme = { - "spec_url": "https://cloud-preview.griptape.ai/public/openapi.yaml", + "spec_url": "https://griptape-cloud-assets.s3.amazonaws.com/Griptape.openapi.yaml", "template": "swagger.md.tmpl", "outfile": "griptape-cloud/api/api-reference.md", } diff --git a/mkdocs.yml b/mkdocs.yml index bb90117a3..a083f2b8b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -74,6 +74,9 @@ nav: - Home: - Overview: "index.md" - Contributing: "contributing.md" + - Cloud: + - Cloud API: + - API Reference: "griptape-cloud/api/api-reference.md" - Framework: - Overview: "griptape-framework/index.md" - Structures: From 5c93b4e544118ecd3e85b44d68e9b627d0d1eebb Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 29 Apr 2024 10:55:40 -0700 Subject: [PATCH 030/238] Add file utils (#745) --- docs/griptape-framework/data/loaders.md | 29 +++++++++++++- griptape/utils/__init__.py | 6 ++- griptape/utils/file_utils.py | 35 ++++++++++++++++ tests/resources/foobar-many.txt | 26 ++++++++++++ tests/unit/utils/test_file_utils.py | 53 +++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 griptape/utils/file_utils.py create mode 100644 tests/resources/foobar-many.txt create mode 100644 tests/unit/utils/test_file_utils.py diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index 8aac96d6a..d767d0d8f 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -13,17 +13,24 @@ Inherits from the [TextLoader](../../reference/griptape/loaders/text_loader.md) ```python from griptape.loaders import PdfLoader +from griptape.utils import load_files, load_file import urllib.request urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "attention.pdf") +# Load a single PDF file with open("attention.pdf", "rb") as f: PdfLoader().load(f.read()) +# You can also use the load_file utility function +PdfLoader().load(load_file("attention.pdf")) urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", "CoT.pdf") +# Load multiple PDF files with open("attention.pdf", "rb") as attention, open("CoT.pdf", "rb") as cot: PdfLoader().load_collection([attention.read(), cot.read()]) +# You can also use the load_files utility function +PdfLoader().load_collection(list(load_files(["attention.pdf", "CoT.pdf"]).values())) ``` ## Sql Loader @@ -53,12 +60,19 @@ Can be used to load CSV files into [CsvRowArtifact](../../reference/griptape/art ```python from griptape.loaders import CsvLoader +from griptape.utils import load_file, load_files +# Load a single CSV file with open("tests/resources/cities.csv", "r") as f: CsvLoader().load(f.read()) +# You can also use the load_file utility function +CsvLoader().load(load_file("tests/resources/cities.csv")) +# Load multiple CSV files with open("tests/resources/cities.csv", "r") as cities, open("tests/resources/addresses.csv", "r") as addresses: CsvLoader().load_collection([cities.read(), addresses.read()]) +# You can also use the load_files utility function +CsvLoader().load_collection(list(load_files(["tests/resources/cities.csv", "tests/resources/addresses.csv"]).values())) ``` @@ -140,19 +154,32 @@ The Image Loader is used to load an image as an [ImageArtifact](./artifacts.md#i ```python from griptape.loaders import ImageLoader +from griptape.utils import load_file +# Load an image from disk with open("tests/resources/mountain.png", "rb") as f: disk_image_artifact = ImageLoader().load(f.read()) +# You can also use the load_file utility function +ImageLoader().load(load_file("tests/resources/mountain.png")) ``` By default, the Image Loader will load images in their native format, but not all models work on all formats. To normalize the format of Artifacts returned by the Loader, set the `format` field. ```python from griptape.loaders import ImageLoader +from griptape.utils import load_files, load_file -# Image data in artifact will be in BMP format. +# Load a single image in BMP format with open("tests/resources/mountain.png", "rb") as f: image_artifact_jpeg = ImageLoader(format="bmp").load(f.read()) +# You can also use the load_file utility function +ImageLoader(format="bmp").load(load_file("tests/resources/mountain.png")) + +# Load multiple images in BMP format +with open("tests/resources/mountain.png", "rb") as mountain, open("tests/resources/cow.png", "rb") as cow: + ImageLoader().load_collection([mountain.read(), cow.read()]) +# You can also use the load_files utility function +ImageLoader().load_collection(list(load_files(["tests/resources/mountain.png", "tests/resources/cow.png"]).values())) ``` diff --git a/griptape/utils/__init__.py b/griptape/utils/__init__.py index 1aad72db9..64ca9a9f7 100644 --- a/griptape/utils/__init__.py +++ b/griptape/utils/__init__.py @@ -8,8 +8,8 @@ from .futures import execute_futures_dict from .token_counter import TokenCounter from .prompt_stack import PromptStack -from .dict_utils import remove_null_values_in_dict_recursively -from .dict_utils import dict_merge +from .dict_utils import remove_null_values_in_dict_recursively, dict_merge +from .file_utils import load_file, load_files from .hash import str_to_hash from .import_utils import import_optional_dependency from .import_utils import is_dependency_installed @@ -43,4 +43,6 @@ def minify_json(value: str) -> str: "constants", "load_artifact_from_memory", "deprecation_warn", + "load_file", + "load_files", ] diff --git a/griptape/utils/file_utils.py b/griptape/utils/file_utils.py new file mode 100644 index 000000000..402436a2f --- /dev/null +++ b/griptape/utils/file_utils.py @@ -0,0 +1,35 @@ +import griptape.utils as utils +from concurrent import futures +from typing import Optional + + +def load_file(path: str) -> bytes: + """Load a file from the given path and return its content as bytes. + + Args: + path (str): The path to the file to load. + + Returns: + The content of the file. + """ + with open(path, "rb") as f: + return f.read() + + +def load_files(paths: list[str], futures_executor: Optional[futures.ThreadPoolExecutor] = None) -> dict[str, bytes]: + """Load multiple files concurrently and return a dictionary of their content. + + Args: + paths: The paths to the files to load. + futures_executor: The executor to use for concurrent loading. If None, a new ThreadPoolExecutor will be created. + + Returns: + A dictionary where the keys are a hash of the path and the values are the content of the files. + """ + + if futures_executor is None: + futures_executor = futures.ThreadPoolExecutor() + + return utils.execute_futures_dict( + {utils.str_to_hash(str(path)): futures_executor.submit(load_file, path) for path in paths} + ) diff --git a/tests/resources/foobar-many.txt b/tests/resources/foobar-many.txt new file mode 100644 index 000000000..00fbc1398 --- /dev/null +++ b/tests/resources/foobar-many.txt @@ -0,0 +1,26 @@ +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + +foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar + diff --git a/tests/unit/utils/test_file_utils.py b/tests/unit/utils/test_file_utils.py new file mode 100644 index 000000000..dbcf1044b --- /dev/null +++ b/tests/unit/utils/test_file_utils.py @@ -0,0 +1,53 @@ +import os +from griptape.loaders import TextLoader +from griptape import utils +from concurrent import futures +from tests.mocks.mock_embedding_driver import MockEmbeddingDriver + +MAX_TOKENS = 50 + + +class TestFileUtils: + def test_load_file(self): + dirname = os.path.dirname(__file__) + file = utils.load_file(os.path.join(dirname, "../../resources/foobar-many.txt")) + + assert file.decode("utf-8").startswith("foobar foobar foobar") + assert len(file.decode("utf-8")) == 4563 + + def test_load_files(self): + dirname = os.path.dirname(__file__) + sources = ["resources/foobar-many.txt", "resources/foobar-many.txt", "resources/small.png"] + sources = [os.path.join(dirname, "../../", source) for source in sources] + files = utils.load_files(sources, futures_executor=futures.ThreadPoolExecutor(max_workers=1)) + assert len(files) == 2 + + test_file = files[utils.str_to_hash(sources[0])] + assert len(test_file) == 4563 + assert test_file.decode("utf-8").startswith("foobar foobar foobar") + + small_file = files[utils.str_to_hash(sources[2])] + assert len(small_file) == 97 + assert small_file[:8] == b"\x89PNG\r\n\x1a\n" + + def test_load_file_with_loader(self): + dirname = os.path.dirname(__file__) + file = utils.load_file(os.path.join(dirname, "../../", "resources/foobar-many.txt")) + artifacts = TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()).load(file) + + assert len(artifacts) == 39 + assert isinstance(artifacts, list) + assert artifacts[0].value.startswith("foobar foobar foobar") + + def test_load_files_with_loader(self): + dirname = os.path.dirname(__file__) + sources = ["resources/foobar-many.txt"] + sources = [os.path.join(dirname, "../../", source) for source in sources] + files = utils.load_files(sources) + loader = TextLoader(max_tokens=MAX_TOKENS, embedding_driver=MockEmbeddingDriver()) + collection = loader.load_collection(list(files.values())) + + test_file_artifacts = collection[loader.to_key(files[utils.str_to_hash(sources[0])])] + assert len(test_file_artifacts) == 39 + assert isinstance(test_file_artifacts, list) + assert test_file_artifacts[0].value.startswith("foobar foobar foobar") From c009e53155315c9b5088ca8e040b0c955c451b3d Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Tue, 30 Apr 2024 03:13:31 +0900 Subject: [PATCH 031/238] Update api-reference.md (#761) --- docs/griptape-cloud/api/api-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/griptape-cloud/api/api-reference.md b/docs/griptape-cloud/api/api-reference.md index 95ed4459e..1b49f33d8 100644 --- a/docs/griptape-cloud/api/api-reference.md +++ b/docs/griptape-cloud/api/api-reference.md @@ -1 +1 @@ -# Content overriden by Swagger Plugin \ No newline at end of file +# Content overridden by Swagger Plugin From 88520d8b1931d5fb69cd4cb9fe15be75bf54133d Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 29 Apr 2024 11:42:13 -0700 Subject: [PATCH 032/238] Add note to changelog regarding stability v0 deprecation (#762) --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d16348bc..84ec366ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -122,13 +122,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ImageQueryTask` and `ImageQueryEngine`. ### Fixed -- `BedrockStableDiffusionImageGenerationModelDriver` request parameters for SDXLv1. +- `BedrockStableDiffusionImageGenerationModelDriver` request parameters for SDXLv1 (`stability.stable-diffusion-xl-v1`). - `BedrockStableDiffusionImageGenerationModelDriver` correctly handles the CONTENT_FILTERED response case. ### Changed - **BREAKING**: Make `index_name` on `MongoDbAtlasVectorStoreDriver` a required field. - **BREAKING**: Remove `create_index()` from `MarqoVectorStoreDriver`, `OpenSearchVectorStoreDriver`, `PineconeVectorStoreDriver`, `RedisVectorStoreDriver`. - **BREAKING**: `ImageLoader().load()` now accepts image bytes instead of a file path. +- **BREAKING**: Request parameters for `BedrockStableDiffusionImageGenerationModelDriver` have been updated for `stability.stable-diffusion-xl-v1`. Use this over the now deprecated `stability.stable-diffusion-xl-v0`. - Deprecated `Structure.prompt_driver` in favor of `Structure.config.global_drivers.prompt_driver`. - Deprecated `Structure.embedding_driver` in favor of `Structure.config.global_drivers.embedding_driver`. - Deprecated `Structure.stream` in favor of `Structure.config.global_drivers.prompt_driver.stream`. From df8b42bd1505b8b8c5e121ed0fd6a4d8e21c1192 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 30 Apr 2024 10:36:56 -0700 Subject: [PATCH 033/238] Update to pinecone@3 (#763) --- CHANGELOG.md | 3 +- .../vector/pinecone_vector_store_driver.py | 11 ++-- poetry.lock | 56 ++++--------------- pyproject.toml | 2 +- .../test_pinecone_vector_storage_driver.py | 8 +-- 5 files changed, 24 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84ec366ab..dbe44d5c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,9 +33,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `TextLoader` no longer accepts `Path` file paths as a source. It will now accept the content of the text file as a `str` or `bytes` object. - **BREAKING**: `FileManager.default_loader` is now `None` by default. - **BREAKING**: Replaced `EventListener.handler` with `EventListener.driver` and `LocalEventListenerDriver`. -- Improved RAG performance in `VectorQueryEngine`. +- **BREAKING** Bumped `pinecone` from `^2` to `^3`. - **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. - **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. +- Improved RAG performance in `VectorQueryEngine`. - Moved [Griptape Docs](https://github.com/griptape-ai/griptape-docs) to this repository. ### Fixed diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 0ee86cb4e..7b573ed68 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -17,8 +17,9 @@ class PineconeVectorStoreDriver(BaseVectorStoreDriver): index: pinecone.Index = field(init=False) def __attrs_post_init__(self) -> None: - pinecone = import_optional_dependency("pinecone") - pinecone.init(api_key=self.api_key, environment=self.environment, project_name=self.project_name) + pinecone = import_optional_dependency("pinecone").Pinecone( + api_key=self.api_key, environment=self.environment, project_name=self.project_name + ) self.index = pinecone.Index(self.index_name) @@ -34,7 +35,7 @@ def upsert_vector( params: dict[str, Any] = {"namespace": namespace} | kwargs - self.index.upsert([(vector_id, vector, meta)], **params) + self.index.upsert(vectors=[(vector_id, vector, meta)], **params) return vector_id @@ -57,7 +58,7 @@ def load_entries(self, namespace: Optional[str] = None) -> list[BaseVectorStoreD # https://community.pinecone.io/t/is-there-a-way-to-query-all-the-vectors-and-or-metadata-from-a-namespace/797/5 results = self.index.query( - self.embedding_driver.embed_string(""), top_k=10000, include_metadata=True, namespace=namespace + vector=self.embedding_driver.embed_string(""), top_k=10000, include_metadata=True, namespace=namespace ) return [ @@ -86,7 +87,7 @@ def query( "include_metadata": include_metadata, } | kwargs - results = self.index.query(vector, **params) + results = self.index.query(vector=vector, **params) return [ BaseVectorStoreDriver.QueryResult( diff --git a/poetry.lock b/poetry.lock index 429d4574d..300206470 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2050,24 +2050,6 @@ files = [ [package.extras] data = ["language-data (>=1.1,<2.0)"] -[[package]] -name = "loguru" -version = "0.7.2" -description = "Python logging made (stupidly) simple" -optional = true -python-versions = ">=3.5" -files = [ - {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, -] - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] - [[package]] name = "lxml" version = "4.9.4" @@ -3125,28 +3107,26 @@ xmp = ["defusedxml"] [[package]] name = "pinecone-client" -version = "2.2.4" +version = "3.2.2" description = "Pinecone client and SDK" optional = true -python-versions = ">=3.8" +python-versions = "<4.0,>=3.8" files = [ - {file = "pinecone-client-2.2.4.tar.gz", hash = "sha256:2c1cc1d6648b2be66e944db2ffa59166a37b9164d1135ad525d9cd8b1e298168"}, - {file = "pinecone_client-2.2.4-py3-none-any.whl", hash = "sha256:5bf496c01c2f82f4e5c2dc977cc5062ecd7168b8ed90743b09afcc8c7eb242ec"}, + {file = "pinecone_client-3.2.2-py3-none-any.whl", hash = "sha256:7e492fdda23c73726bc0cb94c689bb950d06fb94e82b701a0c610c2e830db327"}, + {file = "pinecone_client-3.2.2.tar.gz", hash = "sha256:887a12405f90ac11c396490f605fc479f31cf282361034d1ae0fccc02ac75bee"}, ] [package.dependencies] -dnspython = ">=2.0.0" -loguru = ">=0.5.0" -numpy = ">=1.22.0" -python-dateutil = ">=2.5.3" -pyyaml = ">=5.4" -requests = ">=2.19.0" +certifi = ">=2019.11.17" tqdm = ">=4.64.1" typing-extensions = ">=3.7.4" -urllib3 = ">=1.21.1" +urllib3 = [ + {version = ">=1.26.0", markers = "python_version >= \"3.8\" and python_version < \"3.12\""}, + {version = ">=1.26.5", markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, +] [package.extras] -grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv2 (==0.1.0)", "grpcio (>=1.44.0)", "lz4 (>=3.1.3)", "protobuf (>=3.20.0,<3.21.0)"] +grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv2 (==0.1.0)", "grpcio (>=1.44.0)", "grpcio (>=1.59.0)", "lz4 (>=3.1.3)", "protobuf (>=3.20.0,<3.21.0)"] [[package]] name = "pkginfo" @@ -5246,20 +5226,6 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] -[[package]] -name = "win32-setctime" -version = "1.1.0" -description = "A small Python utility to set file creation time on Windows" -optional = true -python-versions = ">=3.5" -files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] - -[package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] - [[package]] name = "xmltodict" version = "0.13.0" @@ -5425,4 +5391,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "99746cb554c4bc04b03cb998baf428d187e2f0fa9fef3ec7667004578bb65d2c" +content-hash = "7aa1485db323176c7b372efd3483d060c469d18fdf0c6ed172bb3a82d4ab238b" diff --git a/pyproject.toml b/pyproject.toml index ea2d78d06..b323f9a36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ huggingface-hub = { version = ">=0.13", optional = true } boto3 = { version = "^1.28.2", optional = true } sqlalchemy-redshift = { version = "*", optional = true } snowflake-sqlalchemy = { version = "^1.4.7", optional = true } -pinecone-client = { version = "^2", optional = true } +pinecone-client = { version = "^3", optional = true } pymongo = { version = "*", optional = true } marqo = { version = ">=1.1.0", optional = true } redis = { version = "^4.6.0", optional = true } diff --git a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py index 993821de9..defbe8e3b 100644 --- a/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py +++ b/tests/unit/drivers/vector/test_pinecone_vector_storage_driver.py @@ -18,10 +18,10 @@ def mock_pinecone(self, mocker): "namespace": "foobar", } - mocker.patch("pinecone.init", return_value=None) - mocker.patch("pinecone.Index.upsert", return_value=None) - mocker.patch("pinecone.Index.query", return_value=fake_query_response) - mocker.patch("pinecone.create_index", return_value=None) + mock_client = mocker.patch("pinecone.Pinecone") + mock_client().Index().upsert.return_value = None + mock_client().Index().query.return_value = fake_query_response + mock_client().create_index.return_value = None @pytest.fixture def driver(self): From a33324bb738dc86f5bb50a642b167f9c0c16655d Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:09:00 -0400 Subject: [PATCH 034/238] Add structure run tool (#764) --- .github/workflows/docs-integration-tests.yml | 2 + CHANGELOG.md | 1 + .../griptape-cloud-structure-run-client.md | 64 ++++++++++++ griptape/tools/__init__.py | 1 + griptape/tools/base_griptape_cloud_client.py | 20 ++++ .../tool.py | 14 +-- .../__init__.py | 0 .../manifest.yml | 5 + .../tool.py | 99 +++++++++++++++++++ mkdocs.yml | 1 + ...est_griptape_cloud_structure_run_client.py | 27 +++++ 11 files changed, 223 insertions(+), 11 deletions(-) create mode 100644 docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md create mode 100644 griptape/tools/base_griptape_cloud_client.py create mode 100644 griptape/tools/griptape_cloud_structure_run_client/__init__.py create mode 100644 griptape/tools/griptape_cloud_structure_run_client/manifest.yml create mode 100644 griptape/tools/griptape_cloud_structure_run_client/tool.py create mode 100644 tests/unit/tools/test_griptape_cloud_structure_run_client.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index ad4457a20..005b8dd5f 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -63,6 +63,8 @@ jobs: GOOGLE_AUTH_URI: ${{ secrets.INTEG_GOOGLE_AUTH_URI }} GOOGLE_TOKEN_URI: ${{ secrets.INTEG_GOOGLE_TOKEN_URI }} GOOGLE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.INTEG_GOOGLE_AUTH_PROVIDER_X509_CERT_URL }} + GRIPTAPE_CLOUD_API_KEY: ${{ secrets.INTEG_GRIPTAPE_CLOUD_API_KEY }} + GRIPTAPE_CLOUD_STRUCTURE_ID: ${{ secrets.INTEG_GRIPTAPE_CLOUD_STRUCTURE_ID }} OPENWEATHER_API_KEY: ${{ secrets.INTEG_OPENWEATHER_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.INTEG_ANTHROPIC_API_KEY }} SAGEMAKER_LLAMA_ENDPOINT_NAME: ${{ secrets.INTEG_LLAMA_ENDPOINT_NAME }} diff --git a/CHANGELOG.md b/CHANGELOG.md index dbe44d5c1..9d5680c46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AmazonS3FileManagerDriver` for managing files on Amazon S3. - `MediaArtifact` as a base class for `ImageArtifact` and future media Artifacts. - Optional `exception` field to `ErrorArtifact`. +- `GriptapeCloudStructureRunClient` tool for invoking Griptape Cloud Structure Run APIs. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. diff --git a/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md b/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md new file mode 100644 index 000000000..032a84b97 --- /dev/null +++ b/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md @@ -0,0 +1,64 @@ +# GriptapeCloudStructureRunClient + +The GriptapeCloudStructureRunClient tool provides a way to interact with the Griptape Cloud Structure Run API. It can be used to execute a Structure Run and retrieve the results. + +```python +from griptape.tools import GriptapeCloudStructureRunClient +from griptape.structures import Agent +import os + +api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] + +# Create the GriptapeCloudStructureRunClient tool +structure_run_tool = GriptapeCloudStructureRunClient( + description="Danish Baker Agent - Structure to invoke with natural language queries about Danish pastries", + api_key=api_key, + structure_id=structure_id, + off_prompt=False, +) + +# Set up an agent using the GriptapeCloudStructureRunClient tool +agent = Agent( + tools=[structure_run_tool] +) + +# Task: Ask the Griptape Cloud Hosted Structure about new Danish pastries +agent.run( + "What are the new pastries?" +) +``` +``` +[04/29/24 20:46:14] INFO ToolkitTask 3b3f31a123584f05be9bcb02a58dddb6 + Input: what are the new pastries? +[04/29/24 20:46:23] INFO Subtask 2740dcd92bdf4b159dc7a7fb132c98f3 + Thought: To find out about new pastries, I need to use the Danish Baker Agent Structure. I will execute a run of + this Structure with the query "what are the new pastries". + + Actions: [ + { + "name": "GriptapeCloudStructureRunClient", + "path": "execute_structure_run", + "input": { + "values": { + "args": ["what are the new pastries"] + } + }, + "tag": "query_new_pastries" + } + ] +[04/29/24 20:47:01] INFO Subtask 2740dcd92bdf4b159dc7a7fb132c98f3 + Response: {'id': '4a329cbd09ad42e0bd265e9ba4690400', 'name': '4a329cbd09ad42e0bd265e9ba4690400', 'type': + 'TextArtifact', 'value': 'Ah, my friend, I am glad you asked! We have been busy in the bakery, kneading dough + and sprinkling sugar. Our new pastries include the "Copenhagen Cream Puff", a delightful puff pastry filled with + sweet cream and dusted with powdered sugar. We also have the "Danish Delight", a buttery croissant filled with + raspberry jam and topped with a drizzle of white chocolate. And let\'s not forget the "Nordic Nutella Twist", a + flaky pastry twisted with Nutella and sprinkled with chopped hazelnuts. I promise, each bite will transport you + to a cozy Danish bakery!'} +[04/29/24 20:47:07] INFO ToolkitTask 3b3f31a123584f05be9bcb02a58dddb6 + Output: The new pastries include the "Copenhagen Cream Puff," which is a puff pastry filled with sweet cream and + dusted with powdered sugar; the "Danish Delight," a buttery croissant filled with raspberry jam and topped with + white chocolate; and the "Nordic Nutella Twist," a flaky pastry twisted with Nutella and sprinkled with chopped + hazelnuts. +Assistant: The new pastries include the "Copenhagen Cream Puff," which is a puff pastry filled with sweet cream and dusted with powdered sugar; the "Danish Delight," a buttery croissant filled with raspberry jam and topped with white chocolate; and the "Nordic Nutella Twist," a flaky pastry twisted with Nutella and sprinkled with chopped hazelnuts. +``` \ No newline at end of file diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 5e68ca3fc..13bcf41b3 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -24,6 +24,7 @@ from .inpainting_image_generation_client.tool import InpaintingImageGenerationClient from .outpainting_image_generation_client.tool import OutpaintingImageGenerationClient from .griptape_cloud_knowledge_base_client.tool import GriptapeCloudKnowledgeBaseClient +from .griptape_cloud_structure_run_client.tool import GriptapeCloudStructureRunClient from .image_query_client.tool import ImageQueryClient __all__ = [ diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_client.py new file mode 100644 index 000000000..cafe01cd1 --- /dev/null +++ b/griptape/tools/base_griptape_cloud_client.py @@ -0,0 +1,20 @@ +from __future__ import annotations +from abc import ABC +from attr import Factory, define, field +from griptape.tools import BaseTool + + +@define +class BaseGriptapeCloudClient(BaseTool, ABC): + """ + Attributes: + base_url: Base URL for the Griptape Cloud Knowledge Base API. + api_key: API key for Griptape Cloud. + headers: Headers for the Griptape Cloud Knowledge Base API. + """ + + base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) + api_key: str = field(kw_only=True) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + ) diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index da988284f..89a284c98 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -2,29 +2,21 @@ from typing import Optional from urllib.parse import urljoin from schema import Schema, Literal -from attr import define, field, Factory -from griptape.tools import BaseTool +from attr import define, field +from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient from griptape.utils.decorators import activity from griptape.artifacts import TextArtifact, ErrorArtifact @define -class GriptapeCloudKnowledgeBaseClient(BaseTool): +class GriptapeCloudKnowledgeBaseClient(BaseGriptapeCloudClient): """ Attributes: description: LLM-friendly knowledge base description. - base_url: Base URL for the Griptape Cloud Knowledge Base API. - api_key: API key for Griptape Cloud. - headers: Headers for the Griptape Cloud Knowledge Base API. knowledge_base_id: ID of the Griptape Cloud Knowledge Base. """ description: Optional[str] = field(default=None, kw_only=True) - base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) - api_key: str = field(kw_only=True) - headers: dict = field( - default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True - ) knowledge_base_id: str = field(kw_only=True) @activity( diff --git a/griptape/tools/griptape_cloud_structure_run_client/__init__.py b/griptape/tools/griptape_cloud_structure_run_client/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/griptape_cloud_structure_run_client/manifest.yml b/griptape/tools/griptape_cloud_structure_run_client/manifest.yml new file mode 100644 index 000000000..5741fa336 --- /dev/null +++ b/griptape/tools/griptape_cloud_structure_run_client/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Griptape Cloud Structure Run Client +description: Tool for using the Griptape Cloud Structure Run API. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/griptape_cloud_structure_run_client/tool.py b/griptape/tools/griptape_cloud_structure_run_client/tool.py new file mode 100644 index 000000000..7d4edbd72 --- /dev/null +++ b/griptape/tools/griptape_cloud_structure_run_client/tool.py @@ -0,0 +1,99 @@ +from __future__ import annotations +import time +from typing import Any, Optional +from urllib.parse import urljoin +from schema import Schema, Literal +from attr import define, field +from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient +from griptape.utils.decorators import activity +from griptape.artifacts import InfoArtifact, TextArtifact, ErrorArtifact + + +@define +class GriptapeCloudStructureRunClient(BaseGriptapeCloudClient): + """ + Attributes: + description: LLM-friendly structure description. + structure_id: ID of the Griptape Cloud Structure. + """ + + _description: Optional[str] = field(default=None, kw_only=True) + structure_id: str = field(kw_only=True) + structure_run_wait_time_interval: int = field(default=2, kw_only=True) + structure_run_max_wait_time_attempts: int = field(default=20, kw_only=True) + + @property + def description(self) -> str: + if self._description is None: + from requests import get + + url = urljoin(self.base_url.strip("/"), f"/api/structures/{self.structure_id}/") + + response = get(url, headers=self.headers).json() + if "description" in response: + self._description = response["description"] + else: + raise ValueError(f'Error getting Structure description: {response["message"]}') + + return self._description + + @description.setter + def description(self, value: str) -> None: + self._description = value + + @activity( + config={ + "description": "Can be used to execute a Run of a Structure with the following description: {{ _self.description }}", + "schema": Schema( + {Literal("args", description="A list of string arguments to submit to the Structure Run"): list} + ), + } + ) + def execute_structure_run(self, params: dict) -> InfoArtifact | TextArtifact | ErrorArtifact: + from requests import post, exceptions, HTTPError, Response + + args: list[str] = params["values"]["args"] + url = urljoin(self.base_url.strip("/"), f"/api/structures/{self.structure_id}/runs") + + try: + response: Response = post(url, json={"args": args}, headers=self.headers) + response.raise_for_status() + response_json = response.json() + return self._get_structure_run_result(response_json["structure_run_id"]) + + except (exceptions.RequestException, HTTPError) as err: + return ErrorArtifact(str(err)) + + def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | TextArtifact | ErrorArtifact: + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{structure_run_id}") + + result = self._get_structure_run_result_attempt(url) + status = result["status"] + + wait_attempts = 0 + while status in ("QUEUED", "RUNNING") and wait_attempts < self.structure_run_max_wait_time_attempts: + # wait + time.sleep(self.structure_run_wait_time_interval) + wait_attempts += 1 + result = self._get_structure_run_result_attempt(url) + status = result["status"] + + if wait_attempts >= self.structure_run_max_wait_time_attempts: + return ErrorArtifact( + f"Failed to get Run result after {self.structure_run_max_wait_time_attempts} attempts." + ) + + if status != "SUCCEEDED": + return ErrorArtifact(result) + + if "output" in result: + return TextArtifact(result["output"]) + else: + return InfoArtifact("No output found in response") + + def _get_structure_run_result_attempt(self, structure_run_url: str) -> Any: + from requests import get, Response + + response: Response = get(structure_run_url, headers=self.headers) + response.raise_for_status() + return response.json() diff --git a/mkdocs.yml b/mkdocs.yml index a083f2b8b..9359bbce8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -128,6 +128,7 @@ nav: - GoogleGmailClient: "griptape-tools/official-tools/google-gmail-client.md" - GoogleDriveClient: "griptape-tools/official-tools/google-drive-client.md" - GoogleDocsClient: "griptape-tools/official-tools/google-docs-client.md" + - GriptapeCloudStructureRunClient: "griptape-tools/official-tools/griptape-cloud-structure-run-client.md" - OpenWeatherClient: "griptape-tools/official-tools/openweather-client.md" - RestApiClient: "griptape-tools/official-tools/rest-api-client.md" - SqlClient: "griptape-tools/official-tools/sql-client.md" diff --git a/tests/unit/tools/test_griptape_cloud_structure_run_client.py b/tests/unit/tools/test_griptape_cloud_structure_run_client.py new file mode 100644 index 000000000..8656a8f77 --- /dev/null +++ b/tests/unit/tools/test_griptape_cloud_structure_run_client.py @@ -0,0 +1,27 @@ +import pytest +from griptape.artifacts import TextArtifact + + +class TestGriptapeCloudStructureRunClient: + @pytest.fixture + def client(self, mocker): + from griptape.tools import GriptapeCloudStructureRunClient + + mock_response = mocker.Mock() + mock_response.json.return_value = {"structure_run_id": 1} + mocker.patch("requests.post", return_value=mock_response) + + mock_response = mocker.Mock() + mock_response.json.return_value = {"description": "fizz buzz", "output": "fooey booey", "status": "SUCCEEDED"} + mocker.patch("requests.get", return_value=mock_response) + + return GriptapeCloudStructureRunClient(base_url="https://api.griptape.ai", api_key="foo bar", structure_id="1") + + def test_execute_structure_run(self, client): + assert isinstance(client.execute_structure_run({"values": {"args": ["foo bar"]}}), TextArtifact) + + def test_get_structure_description(self, client): + assert client.description == "fizz buzz" + + client.description = "foo bar" + assert client.description == "foo bar" From 40735bb6c02909a75f9b3fa26cf38f93951816e1 Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Wed, 1 May 2024 13:37:20 -0400 Subject: [PATCH 035/238] Export GriptapeCloudStructureRunClient in tools __all__ (#766) --- griptape/tools/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 13bcf41b3..3e4dbb5bc 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -54,5 +54,6 @@ "InpaintingImageGenerationClient", "OutpaintingImageGenerationClient", "GriptapeCloudKnowledgeBaseClient", + "GriptapeCloudStructureRunClient", "ImageQueryClient", ] From b2f1323e3fd6db13517c39eca233ac8879dbb0ba Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Thu, 2 May 2024 12:13:22 -0400 Subject: [PATCH 036/238] Update structure run tool example docs (#769) --- .../griptape-cloud-structure-run-client.md | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md b/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md index 032a84b97..1e98de1c3 100644 --- a/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md +++ b/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md @@ -12,7 +12,7 @@ structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] # Create the GriptapeCloudStructureRunClient tool structure_run_tool = GriptapeCloudStructureRunClient( - description="Danish Baker Agent - Structure to invoke with natural language queries about Danish pastries", + description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", api_key=api_key, structure_id=structure_id, off_prompt=False, @@ -23,17 +23,17 @@ agent = Agent( tools=[structure_run_tool] ) -# Task: Ask the Griptape Cloud Hosted Structure about new Danish pastries +# Task: Ask the Griptape Cloud Hosted Structure about modular RAG agent.run( - "What are the new pastries?" + "what is modular RAG?" ) ``` ``` -[04/29/24 20:46:14] INFO ToolkitTask 3b3f31a123584f05be9bcb02a58dddb6 - Input: what are the new pastries? -[04/29/24 20:46:23] INFO Subtask 2740dcd92bdf4b159dc7a7fb132c98f3 - Thought: To find out about new pastries, I need to use the Danish Baker Agent Structure. I will execute a run of - this Structure with the query "what are the new pastries". +[05/02/24 11:36:16] INFO ToolkitTask 0d99b986140a42c0828215cbc42156e8 + Input: what is modular RAG? +[05/02/24 11:36:24] INFO Subtask b498fb971198476a83ba1a555ff4fb98 + Thought: To provide an explanation of what modular RAG (Retrieval Augmented Generation) is, I will use the + GriptapeCloudStructureRunClient to execute a Structure Run that can provide information on this topic. Actions: [ { @@ -41,24 +41,28 @@ agent.run( "path": "execute_structure_run", "input": { "values": { - "args": ["what are the new pastries"] + "args": ["What is modular RAG?"] } }, - "tag": "query_new_pastries" + "tag": "modular_rag_info" } ] -[04/29/24 20:47:01] INFO Subtask 2740dcd92bdf4b159dc7a7fb132c98f3 - Response: {'id': '4a329cbd09ad42e0bd265e9ba4690400', 'name': '4a329cbd09ad42e0bd265e9ba4690400', 'type': - 'TextArtifact', 'value': 'Ah, my friend, I am glad you asked! We have been busy in the bakery, kneading dough - and sprinkling sugar. Our new pastries include the "Copenhagen Cream Puff", a delightful puff pastry filled with - sweet cream and dusted with powdered sugar. We also have the "Danish Delight", a buttery croissant filled with - raspberry jam and topped with a drizzle of white chocolate. And let\'s not forget the "Nordic Nutella Twist", a - flaky pastry twisted with Nutella and sprinkled with chopped hazelnuts. I promise, each bite will transport you - to a cozy Danish bakery!'} -[04/29/24 20:47:07] INFO ToolkitTask 3b3f31a123584f05be9bcb02a58dddb6 - Output: The new pastries include the "Copenhagen Cream Puff," which is a puff pastry filled with sweet cream and - dusted with powdered sugar; the "Danish Delight," a buttery croissant filled with raspberry jam and topped with - white chocolate; and the "Nordic Nutella Twist," a flaky pastry twisted with Nutella and sprinkled with chopped - hazelnuts. -Assistant: The new pastries include the "Copenhagen Cream Puff," which is a puff pastry filled with sweet cream and dusted with powdered sugar; the "Danish Delight," a buttery croissant filled with raspberry jam and topped with white chocolate; and the "Nordic Nutella Twist," a flaky pastry twisted with Nutella and sprinkled with chopped hazelnuts. +[05/02/24 11:37:28] INFO Subtask b498fb971198476a83ba1a555ff4fb98 + Response: {'id': 'ea96fc6f92f9417880938ff59273be59', 'name': 'ea96fc6f92f9417880938ff59273be59', 'type': + 'TextArtifact', 'value': "Modular RAG is an advanced architecture that builds upon the foundational principles + of Advanced and Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse + strategies to improve its components. Modular RAG introduces additional specialized components like the Search + module for direct searches across various data sources, the RAG-Fusion module for expanding user queries into + diverse perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports + both sequential processing and integrated end-to-end training across its components, illustrating progression + and refinement within the RAG family."} +[05/02/24 11:37:40] INFO ToolkitTask 0d99b986140a42c0828215cbc42156e8 + Output: Modular RAG is an advanced architecture that builds upon the foundational principles of Advanced and + Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse strategies to + improve its components. Modular RAG introduces additional specialized components like the Search module for + direct searches across various data sources, the RAG-Fusion module for expanding user queries into diverse + perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports both + sequential processing and integrated end-to-end training across its components, illustrating progression and + refinement within the RAG family. +Assistant: Modular RAG is an advanced architecture that builds upon the foundational principles of Advanced and Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse strategies to improve its components. Modular RAG introduces additional specialized components like the Search module for direct searches across various data sources, the RAG-Fusion module for expanding user queries into diverse perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports both sequential processing and integrated end-to-end training across its components, illustrating progression and refinement within the RAG family. ``` \ No newline at end of file From 333b4d534bea1b40a71c11aecd5f2941f7c04c58 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 3 May 2024 13:41:53 -0700 Subject: [PATCH 037/238] Feature/better events (#768) --- .github/workflows/docs-integration-tests.yml | 5 + CHANGELOG.md | 3 +- .../drivers/event-listener-drivers.md | 217 ++++++++++++++++++ docs/griptape-framework/misc/events.md | 18 +- griptape/drivers/__init__.py | 2 - .../amazon_sqs_event_listener_driver.py | 7 +- .../aws_iot_core_event_listener_driver.py | 7 +- .../base_event_listener_driver.py | 26 ++- .../griptape_cloud_event_listener_driver.py | 6 +- .../local_event_listener_driver.py | 18 -- .../webhook_event_listener_driver.py | 6 +- griptape/events/event_listener.py | 11 +- griptape/events/finish_structure_run_event.py | 1 + griptape/events/start_structure_run_event.py | 1 + griptape/structures/structure.py | 8 +- griptape/utils/stream.py | 5 +- mkdocs.yml | 1 + tests/mocks/mock_event_listener_driver.py | 9 + .../test_amazon_sqs_event_listener_driver.py | 4 +- .../test_aws_iot_event_listener_driver.py | 4 +- ...st_griptape_cloud_event_listener_driver.py | 4 +- .../test_local_event_listener_driver.py | 14 -- .../test_webhook_event_listener_driver.py | 6 +- tests/unit/events/test_base_event.py | 2 + tests/unit/events/test_event_listener.py | 92 ++++---- .../events/test_finish_structure_run_event.py | 5 +- .../events/test_start_structure_run_event.py | 5 +- 27 files changed, 352 insertions(+), 135 deletions(-) create mode 100644 docs/griptape-framework/drivers/event-listener-drivers.md delete mode 100644 griptape/drivers/event_listener/local_event_listener_driver.py create mode 100644 tests/mocks/mock_event_listener_driver.py delete mode 100644 tests/unit/drivers/event_listener/test_local_event_listener_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 005b8dd5f..0d6cb76ca 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -94,6 +94,11 @@ jobs: POSTGRES_HOST: ${{ secrets.INTEG_POSTGRES_HOST }} POSTGRES_PORT: ${{ secrets.INTEG_POSTGRES_PORT }} VOYAGE_API_KEY: ${{ secrets.INTEG_VOYAGE_API_KEY }} + WEBHOOK_URL: ${{ secrets.INTEG_WEBHOOK_URL }} + AMAZON_SQS_QUEUE_URL: ${{ secrets.INTEG_AMAZON_SQS_QUEUE_URL }} + GT_CLOUD_STRUCTURE_RUN_ID: ${{ secrets.INTEG_GT_CLOUD_STRUCTURE_RUN_ID }} + AWS_IOT_CORE_ENDPOINT: ${{ secrets.INTEG_AWS_IOT_CORE_ENDPOINT }} + AWS_IOT_CORE_TOPIC: ${{ secrets.INTEG_AWS_IOT_CORE_TOPIC }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d5680c46..ff497d2fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AwsIotCoreEventListenerDriver` for sending events to a topic on AWS IoT Core. - `GriptapeCloudEventListenerDriver` for sending events to Griptape Cloud. - `WebhookEventListenerDriver` for sending events to a webhook. -- `LocalEventListenerDriver` for sending events to a callback function. - `BaseFileManagerDriver` to abstract file management operations. - `LocalFileManagerDriver` for managing files on the local file system. - Added optional `BaseLoader.encoding` field. @@ -33,12 +32,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `PdfLoader` no longer accepts `str` file content, `Path` file paths or `IO` objects as sources. Instead, it will only accept the content of the PDF file as a `bytes` object. - **BREAKING**: `TextLoader` no longer accepts `Path` file paths as a source. It will now accept the content of the text file as a `str` or `bytes` object. - **BREAKING**: `FileManager.default_loader` is now `None` by default. -- **BREAKING**: Replaced `EventListener.handler` with `EventListener.driver` and `LocalEventListenerDriver`. - **BREAKING** Bumped `pinecone` from `^2` to `^3`. - **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. - **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. - Improved RAG performance in `VectorQueryEngine`. - Moved [Griptape Docs](https://github.com/griptape-ai/griptape-docs) to this repository. +- Updated `EventListener.handler`'s behavior so that the return value will be passed to the `EventListenerDriver.try_publish_event_payload`'s `event_payload` parameter. ### Fixed - Type hint for parameter `azure_ad_token_provider` on Azure OpenAI drivers to `Optional[Callable[[], str]]`. diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md new file mode 100644 index 000000000..da9a6c05d --- /dev/null +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -0,0 +1,217 @@ +## Overview + +Event Listener Drivers are used to send Griptape [Events](../misc/events.md) to external services. + +You can instantiate Drivers and pass them to Event Listeners in your Structure: + +```python +import os + +from griptape.drivers import AmazonSqsEventListenerDriver +from griptape.events import ( + EventListener, +) +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + rules=[ + Rule( + value="You will be provided with a block of text, and your task is to extract a list of keywords from it." + ) + ], + event_listeners=[ + EventListener( + handler=lambda event: { # You can optionally use the handler to transform the event payload before sending it to the Driver + "event": event.to_dict(), + }, + driver=AmazonSqsEventListenerDriver( + queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], + ), + ), + ], +) + +agent.run( + """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. + Traditional reduction-fired blackware has been made for centuries by pueblo artists. + Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. + Another style involves carving or incising designs and selectively polishing the raised areas. + For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. + Several contemporary artists have created works honoring the pottery of their ancestors.""" +) +``` + +Or use them independently: + +```python +import os +from griptape.drivers import GriptapeCloudEventListenerDriver +from griptape.events import FinishStructureRunEvent +from griptape.artifacts import TextArtifact + +event_driver = GriptapeCloudEventListenerDriver( + api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"] +) + +done_event = FinishStructureRunEvent( + output_task_input=TextArtifact("Just started!"), + output_task_output=TextArtifact("All done!"), +) + +event_driver.publish_event(done_event) +``` + +## Event Listener Drivers + +Griptape offers the following Event Listener Drivers for forwarding Griptape Events. + +### Amazon SQS Event Listener Driver + +!!! info + This driver requires the `drivers-event-listener-amazon-sqs` [extra](../index.md#extras). + +The [AmazonSqsEventListenerDriver](../../reference/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.md) sends Events to an [Amazon SQS](https://aws.amazon.com/sqs/) queue. + +```python +import os + +from griptape.drivers import AmazonSqsEventListenerDriver +from griptape.events import ( + EventListener, +) +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + rules=[ + Rule( + value="You will be provided with a block of text, and your task is to extract a list of keywords from it." + ) + ], + event_listeners=[ + EventListener( + driver=AmazonSqsEventListenerDriver( + queue_url=os.environ["AMAZON_SQS_QUEUE_URL"], + ), + ), + ], +) + +agent.run( + """Black-on-black ware is a 20th- and 21st-century pottery tradition developed by the Puebloan Native American ceramic artists in Northern New Mexico. + Traditional reduction-fired blackware has been made for centuries by pueblo artists. + Black-on-black ware of the past century is produced with a smooth surface, with the designs applied through selective burnishing or the application of refractory slip. + Another style involves carving or incising designs and selectively polishing the raised areas. + For generations several families from Kha'po Owingeh and P'ohwhóge Owingeh pueblos have been making black-on-black ware with the techniques passed down from matriarch potters. Artists from other pueblos have also produced black-on-black ware. + Several contemporary artists have created works honoring the pottery of their ancestors.""" +) +``` + +### AWS IoT Event Listener Driver + +!!! info + This driver requires the `drivers-event-listener-amazon-iot` [extra](../index.md#extras). + +The [AwsIotCoreEventListenerDriver](../../reference/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.md) sends Events to the [AWS IoT Message Broker](https://aws.amazon.com/iot-core/). + +```python +import os + +from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver +from griptape.events import ( + EventListener, + FinishStructureRunEvent, +) +from griptape.rules import Rule +from griptape.structures import Agent + +agent = Agent( + rules=[ + Rule( + value="You will be provided with a text, and your task is to extract the airport codes from it." + ) + ], + config=StructureConfig( + global_drivers=StructureGlobalDriversConfig( + prompt_driver=OpenAiChatPromptDriver( + model="gpt-3.5-turbo", temperature=0.7 + ), + ) + ), + event_listeners=[ + EventListener( + event_types=[FinishStructureRunEvent], + driver=AwsIotCoreEventListenerDriver( + topic=os.environ["AWS_IOT_CORE_TOPIC"], + iot_endpoint=os.environ["AWS_IOT_CORE_ENDPOINT"], + ), + ), + ], +) + +agent.run("I want to fly from Orlando to Boston") +``` + +### Griptape Cloud Event Listener Driver + +The [GriptapeCloudEventListenerDriver](../../reference/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.md) sends Events to [Griptape Cloud](https://www.griptape.ai/cloud). + +!!! note + This Driver is required when using the Griptape Cloud Managed Structures feature. For local development, you can use the [Skatepark Emulator](https://github.com/griptape-ai/griptape-cli?tab=readme-ov-file#skatepark-emulator). + +```python +import os + +from griptape.drivers import GriptapeCloudEventListenerDriver +from griptape.events import ( + EventListener, + FinishStructureRunEvent, +) +from griptape.structures import Agent + +agent = Agent( + event_listeners=[ + EventListener( + event_types=[FinishStructureRunEvent], + driver=GriptapeCloudEventListenerDriver( + api_key=os.environ["GRIPTAPE_CLOUD_API_KEY"], + ), + ), + ], +) + +agent.run( + "Create a list of 8 questions for an interview with a science fiction author." +) +``` + +### Webhook Event Listener Driver + +The [WebhookEventListenerDriver](../../reference/griptape/drivers/event_listener/webhook_event_listener_driver.md) sends Events to any [Webhook](https://en.wikipedia.org/wiki/Webhook) URL. + +```python +import os + +from griptape.drivers import WebhookEventListenerDriver +from griptape.events import ( + EventListener, + FinishStructureRunEvent, +) +from griptape.structures import Agent + +agent = Agent( + event_listeners=[ + EventListener( + event_types=[FinishStructureRunEvent], + driver=WebhookEventListenerDriver( + webhook_url=os.environ["WEBHOOK_URL"], + ), + ), + ], +) + +agent.run("Analyze the pros and cons of remote work vs. office work") +``` + diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index bd43f2404..f45f77199 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -1,6 +1,7 @@ ## Overview You can use [EventListener](../../reference/griptape/events/event_listener.md)s to listen for events during a Structure's execution. +See [Event Listener Drivers](../drivers/event-listener-drivers.md) for examples on forwarding events to external services. ## Specific Event Types @@ -18,7 +19,6 @@ from griptape.events import ( FinishPromptEvent, EventListener, ) -from griptape.drivers import LocalEventListenerDriver def handler(event: BaseEvent): @@ -28,6 +28,7 @@ def handler(event: BaseEvent): agent = Agent( event_listeners=[ EventListener( + handler, event_types=[ StartTaskEvent, FinishTaskEvent, @@ -36,7 +37,6 @@ agent = Agent( StartPromptEvent, FinishPromptEvent, ], - driver=LocalEventListenerDriver(handler=handler), ) ] ) @@ -65,7 +65,6 @@ Or listen to all events: ```python from griptape.structures import Agent from griptape.events import BaseEvent, EventListener -from griptape.drivers import LocalEventListenerDriver def handler1(event: BaseEvent): @@ -78,8 +77,8 @@ def handler2(event: BaseEvent): agent = Agent( event_listeners=[ - EventListener(driver=LocalEventListenerDriver(handler=handler1)), - EventListener(driver=LocalEventListenerDriver(handler=handler1)), + EventListener(handler1), + EventListener(handler2), ] ) @@ -131,13 +130,12 @@ from griptape.events import CompletionChunkEvent, EventListener from griptape.tasks import ToolkitTask from griptape.structures import Pipeline from griptape.tools import WebScraper, TaskMemoryClient -from griptape.drivers import LocalEventListenerDriver pipeline = Pipeline( event_listeners=[ EventListener( - driver=LocalEventListenerDriver(handler=lambda e: print(e.token, end="", flush=True)), + lambda e: print(e.token, end="", flush=True), event_types=[CompletionChunkEvent], ) ] @@ -180,7 +178,6 @@ To count tokens, you can use Event Listeners and the [TokenCounter](../../refere from griptape import utils from griptape.events import BaseEvent, StartPromptEvent, FinishPromptEvent, EventListener from griptape.structures import Agent -from griptape.drivers import LocalEventListenerDriver token_counter = utils.TokenCounter() @@ -194,7 +191,7 @@ def count_tokens(e: BaseEvent): agent = Agent( event_listeners=[ EventListener( - driver=LocalEventListenerDriver(handler=lambda e: count_tokens(e)), + handler=lambda e: count_tokens(e), event_types=[StartPromptEvent, FinishPromptEvent], ) ] @@ -238,7 +235,6 @@ You can use the [StartPromptEvent](../../reference/griptape/events/start_prompt_ ```python from griptape.structures import Agent from griptape.events import BaseEvent, StartPromptEvent, EventListener -from griptape.drivers import LocalEventListenerDriver def handler(event: BaseEvent): @@ -251,7 +247,7 @@ def handler(event: BaseEvent): agent = Agent( - event_listeners=[EventListener(driver=LocalEventListenerDriver(handler=handler), event_types=[StartPromptEvent])] + event_listeners=[EventListener(handler=handler, event_types=[StartPromptEvent])] ) agent.run("Write me a poem.") diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 740990031..c727c154d 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -91,7 +91,6 @@ from .event_listener.webhook_event_listener_driver import WebhookEventListenerDriver from .event_listener.aws_iot_core_event_listener_driver import AwsIotCoreEventListenerDriver from .event_listener.griptape_cloud_event_listener_driver import GriptapeCloudEventListenerDriver -from .event_listener.local_event_listener_driver import LocalEventListenerDriver from .file_manager.base_file_manager_driver import BaseFileManagerDriver from .file_manager.local_file_manager_driver import LocalFileManagerDriver @@ -177,7 +176,6 @@ "WebhookEventListenerDriver", "AwsIotCoreEventListenerDriver", "GriptapeCloudEventListenerDriver", - "LocalEventListenerDriver", "BaseFileManagerDriver", "LocalFileManagerDriver", "AmazonS3FileManagerDriver", diff --git a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py index 0db63726b..24e3c9e1e 100644 --- a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py +++ b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py @@ -1,12 +1,11 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any import json +from typing import TYPE_CHECKING, Any from attr import Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver -from griptape.events.base_event import BaseEvent from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -19,5 +18,5 @@ class AmazonSqsEventListenerDriver(BaseEventListenerDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) sqs_client: Any = field(default=Factory(lambda self: self.session.client("sqs"), takes_self=True)) - def try_publish_event(self, event: BaseEvent) -> None: - self.sqs_client.send_message(QueueUrl=self.queue_url, MessageBody=json.dumps({"event": event.to_dict()})) + def try_publish_event_payload(self, event_payload: dict) -> None: + self.sqs_client.send_message(QueueUrl=self.queue_url, MessageBody=json.dumps(event_payload)) diff --git a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py index 876b790e8..302fd91d5 100644 --- a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py +++ b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py @@ -1,12 +1,11 @@ from __future__ import annotations +import json from typing import TYPE_CHECKING, Any -import json from attr import Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver -from griptape.events.base_event import BaseEvent from griptape.utils import import_optional_dependency if TYPE_CHECKING: @@ -20,5 +19,5 @@ class AwsIotCoreEventListenerDriver(BaseEventListenerDriver): session: boto3.Session = field(default=Factory(lambda: import_optional_dependency("boto3").Session()), kw_only=True) iotdata_client: Any = field(default=Factory(lambda self: self.session.client("iot-data"), takes_self=True)) - def try_publish_event(self, event: BaseEvent) -> None: - self.iotdata_client.publish(topic=self.topic, payload=json.dumps({"event": event.to_dict()})) + def try_publish_event_payload(self, event_payload: dict) -> None: + self.iotdata_client.publish(topic=self.topic, payload=json.dumps(event_payload)) diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 5bfbe6709..eec0fe320 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -1,20 +1,32 @@ from __future__ import annotations + from abc import ABC, abstractmethod from concurrent import futures -from attr import define, field, Factory -from typing import TYPE_CHECKING +from logging import Logger + +from attr import Factory, define, field -if TYPE_CHECKING: - from griptape.events import BaseEvent +from griptape.events import BaseEvent + +logger = Logger(__name__) @define class BaseEventListenerDriver(ABC): futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) - def publish_event(self, event: BaseEvent) -> None: - self.futures_executor.submit(self.try_publish_event, event) + def publish_event(self, event: BaseEvent | dict) -> None: + if isinstance(event, dict): + self.futures_executor.submit(self._safe_try_publish_event_payload, event) + else: + self.futures_executor.submit(self._safe_try_publish_event_payload, event.to_dict()) @abstractmethod - def try_publish_event(self, event: BaseEvent) -> None: + def try_publish_event_payload(self, event_payload: dict) -> None: ... + + def _safe_try_publish_event_payload(self, event_payload: dict) -> None: + try: + self.try_publish_event_payload(event_payload) + except Exception as e: + logger.error(e) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 90b94c313..461f06be9 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -7,7 +7,6 @@ from attr import define, field, Factory from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver -from griptape.events.base_event import BaseEvent @define @@ -37,7 +36,8 @@ def validate_run_id(self, _, structure_run_id: str): "structure_run_id must be set either in the constructor or as an environment variable (GT_CLOUD_STRUCTURE_RUN_ID)." ) - def try_publish_event(self, event: BaseEvent) -> None: + def try_publish_event_payload(self, event_payload: dict) -> None: url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/events") - requests.post(url=url, json=event.to_dict(), headers=self.headers) + response = requests.post(url=url, json=event_payload, headers=self.headers) + response.raise_for_status() diff --git a/griptape/drivers/event_listener/local_event_listener_driver.py b/griptape/drivers/event_listener/local_event_listener_driver.py deleted file mode 100644 index b276b94ef..000000000 --- a/griptape/drivers/event_listener/local_event_listener_driver.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from typing import Callable, Any -from attr import define, field - -from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver -from griptape.events.base_event import BaseEvent - - -@define -class LocalEventListenerDriver(BaseEventListenerDriver): - handler: Callable[[BaseEvent], Any] = field(default=None, kw_only=True) - - def publish_event(self, event: BaseEvent) -> None: - self.try_publish_event(event) - - def try_publish_event(self, event: BaseEvent) -> None: - self.handler(event) diff --git a/griptape/drivers/event_listener/webhook_event_listener_driver.py b/griptape/drivers/event_listener/webhook_event_listener_driver.py index d2f0046d0..3803c86b6 100644 --- a/griptape/drivers/event_listener/webhook_event_listener_driver.py +++ b/griptape/drivers/event_listener/webhook_event_listener_driver.py @@ -5,7 +5,6 @@ from attr import define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver -from griptape.events.base_event import BaseEvent @define @@ -13,5 +12,6 @@ class WebhookEventListenerDriver(BaseEventListenerDriver): webhook_url: str = field(kw_only=True) headers: dict = field(default=None, kw_only=True) - def try_publish_event(self, event: BaseEvent) -> None: - requests.post(url=self.webhook_url, json={"event": event.to_dict()}, headers=self.headers) + def try_publish_event_payload(self, event_payload: dict) -> None: + response = requests.post(url=self.webhook_url, json=event_payload, headers=self.headers) + response.raise_for_status() diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index aa7da5dcd..a6b692d4d 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Optional, TYPE_CHECKING -from attrs import define, field +from typing import Optional, TYPE_CHECKING, Callable +from attrs import define, field, Factory from .base_event import BaseEvent if TYPE_CHECKING: @@ -9,6 +9,7 @@ @define class EventListener: + handler: Callable[[BaseEvent], Optional[dict]] = field(default=Factory(lambda: lambda event: event.to_dict())) event_types: Optional[list[type[BaseEvent]]] = field(default=None, kw_only=True) driver: Optional[BaseEventListenerDriver] = field(default=None, kw_only=True) @@ -16,5 +17,9 @@ def publish_event(self, event: BaseEvent) -> None: event_types = self.event_types if event_types is None or type(event) in event_types: + event_payload = self.handler(event) if self.driver is not None: - self.driver.publish_event(event) + if event_payload is not None and isinstance(event_payload, dict): + self.driver.publish_event(event_payload) + else: + self.driver.publish_event(event) diff --git a/griptape/events/finish_structure_run_event.py b/griptape/events/finish_structure_run_event.py index 8591041e2..2a4688fb9 100644 --- a/griptape/events/finish_structure_run_event.py +++ b/griptape/events/finish_structure_run_event.py @@ -9,6 +9,7 @@ @define class FinishStructureRunEvent(BaseEvent): + structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) output_task_input: Union[ BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] ] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/start_structure_run_event.py b/griptape/events/start_structure_run_event.py index a0780fd1f..311d687a9 100644 --- a/griptape/events/start_structure_run_event.py +++ b/griptape/events/start_structure_run_event.py @@ -9,6 +9,7 @@ @define class StartStructureRunEvent(BaseEvent): + structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) input_task_input: Union[ BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] ] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index e807393f4..ef9205db9 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -258,13 +258,17 @@ def context(self, task: BaseTask) -> dict[str, Any]: def before_run(self) -> None: self.publish_event( - StartStructureRunEvent(input_task_input=self.input_task.input, input_task_output=self.input_task.output) + StartStructureRunEvent( + structure_id=self.id, input_task_input=self.input_task.input, input_task_output=self.input_task.output + ) ) def after_run(self) -> None: self.publish_event( FinishStructureRunEvent( - output_task_input=self.output_task.input, output_task_output=self.output_task.output + structure_id=self.id, + output_task_input=self.output_task.input, + output_task_output=self.output_task.output, ) ) diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index 80d3ea5a1..a0251fa57 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -53,14 +53,11 @@ def run(self, *args) -> Iterator[TextArtifact]: t.join() def _run_structure(self, *args): - from griptape.drivers import LocalEventListenerDriver - def event_handler(event: BaseEvent): self._event_queue.put(event) stream_event_listener = EventListener( - driver=LocalEventListenerDriver(handler=event_handler), - event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent], + handler=event_handler, event_types=[CompletionChunkEvent, FinishPromptEvent, FinishStructureRunEvent] ) self.structure.add_event_listener(stream_event_listener) diff --git a/mkdocs.yml b/mkdocs.yml index 9359bbce8..bfedcaac4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -106,6 +106,7 @@ nav: - Image Query Drivers: "griptape-framework/drivers/image-query-drivers.md" - Web Scraper Drivers: "griptape-framework/drivers/web-scraper-drivers.md" - Conversation Memory Drivers: "griptape-framework/drivers/conversation-memory-drivers.md" + - Event Listener Drivers: "griptape-framework/drivers/event-listener-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" diff --git a/tests/mocks/mock_event_listener_driver.py b/tests/mocks/mock_event_listener_driver.py new file mode 100644 index 000000000..3e0c173ca --- /dev/null +++ b/tests/mocks/mock_event_listener_driver.py @@ -0,0 +1,9 @@ +from attr import define + +from griptape.drivers import BaseEventListenerDriver + + +@define +class MockEventListenerDriver(BaseEventListenerDriver): + def try_publish_event_payload(self, event_payload: dict) -> None: + ... diff --git a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py index 4a19011be..e0a9e7b7c 100644 --- a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py @@ -27,5 +27,5 @@ def driver(self): def test_init(self, driver): assert driver - def test_try_publish_event(self, driver): - driver.try_publish_event(event=MockEvent()) + def test_try_publish_event_payload(self, driver): + driver.try_publish_event_payload(MockEvent().to_dict()) diff --git a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py index c8b6a77ed..cd50ac82d 100644 --- a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py @@ -21,5 +21,5 @@ def driver(self): def test_init(self, driver): assert driver - def test_try_publish_event(self, driver): - driver.try_publish_event(event=MockEvent()) + def test_try_publish_event_payload(self, driver): + driver.try_publish_event_payload(MockEvent().to_dict()) diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index 8d2a261ba..51f29ff71 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -29,9 +29,9 @@ def test_init(self, driver): assert driver.api_key == "foo bar" assert driver.structure_run_id == "bar baz" - def test_try_publish_event(self, mock_post, driver): + def test_try_publish_event_payload(self, mock_post, driver): event = MockEvent() - driver.try_publish_event(event=event) + driver.try_publish_event_payload(event.to_dict()) mock_post.assert_called_once_with( url="https://cloud123.griptape.ai/api/structure-runs/bar baz/events", diff --git a/tests/unit/drivers/event_listener/test_local_event_listener_driver.py b/tests/unit/drivers/event_listener/test_local_event_listener_driver.py deleted file mode 100644 index a92276fa8..000000000 --- a/tests/unit/drivers/event_listener/test_local_event_listener_driver.py +++ /dev/null @@ -1,14 +0,0 @@ -from moto import mock_iotdata -from unittest.mock import Mock -from tests.mocks.mock_event import MockEvent -from griptape.drivers.event_listener.local_event_listener_driver import LocalEventListenerDriver - - -@mock_iotdata -class TestLocalEventListenerDriver: - def test_try_publish_event(self): - mock = Mock() - event = MockEvent() - driver = LocalEventListenerDriver(handler=mock) - driver.try_publish_event(event=event) - mock.assert_called_once_with(event) diff --git a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py index 207fd48cf..f3f872c0a 100644 --- a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py @@ -15,11 +15,11 @@ def mock_post(self, mocker): def test_init(self): assert WebhookEventListenerDriver(webhook_url="") - def test_try_publish_event(self, mock_post): + def test_try_publish_event_payload(self, mock_post): driver = WebhookEventListenerDriver(webhook_url="foo bar", headers={"Authorization": "Bearer foo bar"}) event = MockEvent() - driver.try_publish_event(event=event) + driver.try_publish_event_payload(event.to_dict()) mock_post.assert_called_once_with( - url="foo bar", json={"event": event.to_dict()}, headers={"Authorization": "Bearer foo bar"} + url="foo bar", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"} ) diff --git a/tests/unit/events/test_base_event.py b/tests/unit/events/test_base_event.py index 2def78015..7656b6b0d 100644 --- a/tests/unit/events/test_base_event.py +++ b/tests/unit/events/test_base_event.py @@ -177,6 +177,7 @@ def test_start_structure_run_event_from_dict(self): dict_value = { "type": "StartStructureRunEvent", "timestamp": 123.0, + "structure_id": "foo", "input_task_input": {"type": "TextArtifact", "value": "foo"}, "input_task_output": {"type": "TextArtifact", "value": "bar"}, } @@ -193,6 +194,7 @@ def test_finish_structure_run_event_from_dict(self): dict_value = { "type": "FinishStructureRunEvent", "timestamp": 123.0, + "structure_id": "foo", "output_task_input": {"type": "TextArtifact", "value": "foo"}, "output_task_output": {"type": "TextArtifact", "value": "bar"}, } diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index 39b59ea94..fcc9688ed 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -1,6 +1,6 @@ from unittest.mock import Mock import pytest -from griptape.drivers.event_listener.local_event_listener_driver import LocalEventListenerDriver +from griptape.events.base_event import BaseEvent from griptape.structures import Pipeline from griptape.tasks import ToolkitTask, ActionsSubtask from griptape.events import ( @@ -17,6 +17,7 @@ ) from tests.mocks.mock_prompt_driver import MockPromptDriver from tests.mocks.mock_tool.tool import MockTool +from tests.mocks.mock_event import MockEvent class TestEventListener: @@ -34,10 +35,7 @@ def test_untyped_listeners(self, pipeline): event_handler_1 = Mock() event_handler_2 = Mock() - pipeline.event_listeners = [ - EventListener(driver=LocalEventListenerDriver(handler=event_handler_1)), - EventListener(driver=LocalEventListenerDriver(handler=event_handler_2)), - ] + pipeline.event_listeners = [EventListener(handler=event_handler_1), EventListener(handler=event_handler_2)] # can't mock subtask events, so must manually call pipeline.tasks[0].subtasks[0].before_run() pipeline.tasks[0].subtasks[0].after_run() @@ -58,37 +56,15 @@ def test_typed_listeners(self, pipeline): completion_chunk_handler = Mock() pipeline.event_listeners = [ - EventListener( - driver=LocalEventListenerDriver(handler=start_prompt_event_handler), event_types=[StartPromptEvent] - ), - EventListener( - driver=LocalEventListenerDriver(handler=finish_prompt_event_handler), event_types=[FinishPromptEvent] - ), - EventListener( - driver=LocalEventListenerDriver(handler=start_task_event_handler), event_types=[StartTaskEvent] - ), - EventListener( - driver=LocalEventListenerDriver(handler=finish_task_event_handler), event_types=[FinishTaskEvent] - ), - EventListener( - driver=LocalEventListenerDriver(handler=start_subtask_event_handler), - event_types=[StartActionsSubtaskEvent], - ), - EventListener( - driver=LocalEventListenerDriver(handler=finish_subtask_event_handler), - event_types=[FinishActionsSubtaskEvent], - ), - EventListener( - driver=LocalEventListenerDriver(handler=start_structure_run_event_handler), - event_types=[StartStructureRunEvent], - ), - EventListener( - driver=LocalEventListenerDriver(handler=finish_structure_run_event_handler), - event_types=[FinishStructureRunEvent], - ), - EventListener( - driver=LocalEventListenerDriver(handler=completion_chunk_handler), event_types=[CompletionChunkEvent] - ), + EventListener(start_prompt_event_handler, event_types=[StartPromptEvent]), + EventListener(finish_prompt_event_handler, event_types=[FinishPromptEvent]), + EventListener(start_task_event_handler, event_types=[StartTaskEvent]), + EventListener(finish_task_event_handler, event_types=[FinishTaskEvent]), + EventListener(start_subtask_event_handler, event_types=[StartActionsSubtaskEvent]), + EventListener(finish_subtask_event_handler, event_types=[FinishActionsSubtaskEvent]), + EventListener(start_structure_run_event_handler, event_types=[StartStructureRunEvent]), + EventListener(finish_structure_run_event_handler, event_types=[FinishStructureRunEvent]), + EventListener(completion_chunk_handler, event_types=[CompletionChunkEvent]), ] # can't mock subtask events, so must manually call @@ -110,23 +86,45 @@ def test_add_remove_event_listener(self, pipeline): pipeline.event_listeners = [] mock1 = Mock() mock2 = Mock() - event_listener_1 = pipeline.add_event_listener( - EventListener(driver=LocalEventListenerDriver(handler=mock1), event_types=[StartPromptEvent]) - ) + # duplicate event listeners will only get added once + event_listener_1 = pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) + pipeline.add_event_listener(EventListener(mock1, event_types=[StartPromptEvent])) - event_listener_2 = pipeline.add_event_listener( - EventListener(driver=LocalEventListenerDriver(handler=mock1), event_types=[FinishPromptEvent]) - ) - event_listener_3 = pipeline.add_event_listener( - EventListener(driver=LocalEventListenerDriver(handler=mock2), event_types=[StartPromptEvent]) - ) + event_listener_3 = pipeline.add_event_listener(EventListener(mock1, event_types=[FinishPromptEvent])) + event_listener_4 = pipeline.add_event_listener(EventListener(mock2, event_types=[StartPromptEvent])) - event_listener_4 = pipeline.add_event_listener(EventListener(driver=LocalEventListenerDriver(handler=mock2))) + event_listener_5 = pipeline.add_event_listener(EventListener(mock2)) assert len(pipeline.event_listeners) == 4 pipeline.remove_event_listener(event_listener_1) - pipeline.remove_event_listener(event_listener_2) pipeline.remove_event_listener(event_listener_3) pipeline.remove_event_listener(event_listener_4) + pipeline.remove_event_listener(event_listener_5) assert len(pipeline.event_listeners) == 0 + + def test_publish_event(self): + mock_event_listener_driver = Mock() + mock_event_listener_driver.try_publish_event_payload.return_value = None + + def event_handler(_: BaseEvent): + return None + + mock_event = MockEvent() + event_listener = EventListener(event_handler, driver=mock_event_listener_driver, event_types=[MockEvent]) + event_listener.publish_event(mock_event) + + mock_event_listener_driver.publish_event.assert_called_once_with(mock_event) + + def test_publish_transformed_event(self): + mock_event_listener_driver = Mock() + mock_event_listener_driver.publish_event.return_value = None + + def event_handler(event: BaseEvent): + return {"event": event.to_dict()} + + mock_event = MockEvent() + event_listener = EventListener(event_handler, driver=mock_event_listener_driver, event_types=[MockEvent]) + event_listener.publish_event(mock_event) + + mock_event_listener_driver.publish_event.assert_called_once_with({"event": mock_event.to_dict()}) diff --git a/tests/unit/events/test_finish_structure_run_event.py b/tests/unit/events/test_finish_structure_run_event.py index d369ab5e5..68ad1ea01 100644 --- a/tests/unit/events/test_finish_structure_run_event.py +++ b/tests/unit/events/test_finish_structure_run_event.py @@ -6,10 +6,13 @@ class TestFinishStructureRunEvent: @pytest.fixture def finish_structure_run_event(self): - return FinishStructureRunEvent(output_task_input=TextArtifact("foo"), output_task_output=TextArtifact("bar")) + return FinishStructureRunEvent( + structure_id="fizz", output_task_input=TextArtifact("foo"), output_task_output=TextArtifact("bar") + ) def test_to_dict(self, finish_structure_run_event): assert finish_structure_run_event.to_dict() is not None + assert finish_structure_run_event.to_dict()["structure_id"] == "fizz" assert finish_structure_run_event.to_dict()["output_task_input"]["value"] == "foo" assert finish_structure_run_event.to_dict()["output_task_output"]["value"] == "bar" diff --git a/tests/unit/events/test_start_structure_run_event.py b/tests/unit/events/test_start_structure_run_event.py index 945b38e64..c2f1b923d 100644 --- a/tests/unit/events/test_start_structure_run_event.py +++ b/tests/unit/events/test_start_structure_run_event.py @@ -6,9 +6,12 @@ class TestStartStructureRunEvent: @pytest.fixture def start_structure_run_event(self): - return StartStructureRunEvent(input_task_input=TextArtifact("foo"), input_task_output=TextArtifact("bar")) + return StartStructureRunEvent( + structure_id="fizz", input_task_input=TextArtifact("foo"), input_task_output=TextArtifact("bar") + ) def test_to_dict(self, start_structure_run_event): assert start_structure_run_event.to_dict() is not None + assert start_structure_run_event.to_dict()["structure_id"] == "fizz" assert start_structure_run_event.to_dict()["input_task_input"]["value"] == "foo" assert start_structure_run_event.to_dict()["input_task_output"]["value"] == "bar" From 8584f0d32f630a42eb340ea1c630bd95e954236b Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 3 May 2024 15:47:30 -0700 Subject: [PATCH 038/238] Fix docs for extras (#770) --- README.md | 3 ++- docs/griptape-framework/index.md | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 847c9d9c9..53c941a2e 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ Tools provide capabilities for LLMs to interact with data and services. Griptape Drivers facilitate interactions with external resources and services: -- 🔢 **Prompt and Embedding Drivers** generate vector embeddings from textual inputs. +- 🗣️ **Prompt Drivers** manage textual interactions with LLMs. +- 🔢 **Embedding Drivers** generate vector embeddings from textual inputs. - 💾 **Vector Store Drivers** manage the storage and retrieval of embeddings. - 🎨 **Image Generation Drivers** create images from text descriptions. - 🔎 **Image Query Drivers** query images from text queries. diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index 7c33e0588..decf00da5 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -22,7 +22,7 @@ By default, Griptape uses [OpenAI Completions API](https://platform.openai.com/d Install **griptape**: ``` -pip install griptape[all] -U +pip install "griptape[all]" -U ``` ### Using Poetry @@ -36,7 +36,7 @@ poetry new griptape-quickstart Change your working directory to the new `griptape-quickstart` directory created by Poetry and add the the `griptape` dependency. ``` -poetry add griptape[all] +poetry add "griptape[all]" ``` ### Extras @@ -56,7 +56,7 @@ poetry add griptape To install specific extras (e.g., drivers for [AnthropicPromptDriver](./drivers/prompt-drivers.md#anthropic) and [PineconeVectorStoreDriver](./drivers/vector-store-drivers.md#pinecone)): ``` -poetry add griptape[drivers-prompt-anthropic,drivers-vector-pinecone] +poetry add "griptape[drivers-prompt-anthropic,drivers-vector-pinecone]" ``` For a comprehensive list of extras, please refer to the `[tool.poetry.extras]` section of Griptape's [pyproject.toml](https://github.com/griptape-ai/griptape/blob/main/pyproject.toml). From 0c87ea2c2e27f85bd70c69bc4b6da93392b20172 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 6 May 2024 10:13:51 -0700 Subject: [PATCH 039/238] Add structure run tool/task (#767) --- .github/workflows/docs-integration-tests.yml | 1 + CHANGELOG.md | 7 +- docs/examples/multi-agent-workflow.md | 191 ++++++++++++++++++ .../drivers/structure-run-drivers.md | 97 +++++++++ docs/griptape-framework/structures/tasks.md | 140 +++++++++++++ .../griptape-cloud-structure-run-client.md | 68 ------- .../official-tools/structure-run-client.md | 64 ++++++ griptape/drivers/__init__.py | 7 + .../structure_run}/__init__.py | 0 .../base_structure_run_driver.py | 15 ++ .../griptape_cloud_structure_run_driver.py} | 70 +++---- .../local_structure_run_driver.py | 23 +++ griptape/tasks/__init__.py | 4 + griptape/tasks/base_multi_text_input_task.py | 53 +++++ griptape/tasks/structure_run_task.py | 22 ++ griptape/tools/__init__.py | 4 +- .../manifest.yml | 5 - .../tools/structure_run_client/__init__.py | 0 .../tools/structure_run_client/manifest.yml | 5 + griptape/tools/structure_run_client/tool.py | 34 ++++ mkdocs.yml | 3 +- tests/mocks/mock_multi_text_input_task.py | 9 + tests/unit/drivers/structure_run/__init__.py | 0 ...est_griptape_cloud_structure_run_driver.py | 35 ++++ .../test_local_structure_run_driver.py | 24 +++ .../tasks/test_base_multi_text_input_task.py | 58 ++++++ tests/unit/tasks/test_structure_run_task.py | 18 ++ ...est_griptape_cloud_structure_run_client.py | 27 --- tests/unit/tools/test_structure_run_client.py | 20 ++ 29 files changed, 852 insertions(+), 152 deletions(-) create mode 100644 docs/examples/multi-agent-workflow.md create mode 100644 docs/griptape-framework/drivers/structure-run-drivers.md delete mode 100644 docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md create mode 100644 docs/griptape-tools/official-tools/structure-run-client.md rename griptape/{tools/griptape_cloud_structure_run_client => drivers/structure_run}/__init__.py (100%) create mode 100644 griptape/drivers/structure_run/base_structure_run_driver.py rename griptape/{tools/griptape_cloud_structure_run_client/tool.py => drivers/structure_run/griptape_cloud_structure_run_driver.py} (50%) create mode 100644 griptape/drivers/structure_run/local_structure_run_driver.py create mode 100644 griptape/tasks/base_multi_text_input_task.py create mode 100644 griptape/tasks/structure_run_task.py delete mode 100644 griptape/tools/griptape_cloud_structure_run_client/manifest.yml create mode 100644 griptape/tools/structure_run_client/__init__.py create mode 100644 griptape/tools/structure_run_client/manifest.yml create mode 100644 griptape/tools/structure_run_client/tool.py create mode 100644 tests/mocks/mock_multi_text_input_task.py create mode 100644 tests/unit/drivers/structure_run/__init__.py create mode 100644 tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py create mode 100644 tests/unit/drivers/structure_run/test_local_structure_run_driver.py create mode 100644 tests/unit/tasks/test_base_multi_text_input_task.py create mode 100644 tests/unit/tasks/test_structure_run_task.py delete mode 100644 tests/unit/tools/test_griptape_cloud_structure_run_client.py create mode 100644 tests/unit/tools/test_structure_run_client.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 0d6cb76ca..2f1dba285 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -65,6 +65,7 @@ jobs: GOOGLE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.INTEG_GOOGLE_AUTH_PROVIDER_X509_CERT_URL }} GRIPTAPE_CLOUD_API_KEY: ${{ secrets.INTEG_GRIPTAPE_CLOUD_API_KEY }} GRIPTAPE_CLOUD_STRUCTURE_ID: ${{ secrets.INTEG_GRIPTAPE_CLOUD_STRUCTURE_ID }} + GRIPTAPE_CLOUD_BASE_URL: ${{ secrets.INTEG_GRIPTAPE_CLOUD_BASE_URL }} OPENWEATHER_API_KEY: ${{ secrets.INTEG_OPENWEATHER_API_KEY }} ANTHROPIC_API_KEY: ${{ secrets.INTEG_ANTHROPIC_API_KEY }} SAGEMAKER_LLAMA_ENDPOINT_NAME: ${{ secrets.INTEG_LLAMA_ENDPOINT_NAME }} diff --git a/CHANGELOG.md b/CHANGELOG.md index ff497d2fb..255ec88b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AmazonS3FileManagerDriver` for managing files on Amazon S3. - `MediaArtifact` as a base class for `ImageArtifact` and future media Artifacts. - Optional `exception` field to `ErrorArtifact`. -- `GriptapeCloudStructureRunClient` tool for invoking Griptape Cloud Structure Run APIs. +- `StructureRunClient` for running other Structures via a Tool. +- `StructureRunTask` for running Structures as a Task from within another Structure. +- `GriptapeCloudStructureRunDriver` for running Structures in Griptape Cloud. +- `LocalStructureRunDriver` for running Structures in the same run-time environment as the code that is running the Structure. ### Changed - **BREAKING**: Secret fields (ex: api_key) removed from serialized Drivers. @@ -34,7 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING**: `FileManager.default_loader` is now `None` by default. - **BREAKING** Bumped `pinecone` from `^2` to `^3`. - **BREAKING**: Removed `workdir`, `loaders`, `default_loader`, and `save_file_encoding` fields from `FileManager` and added `file_manager_driver`. -- **BREADKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. +- **BREAKING**: Removed `mime_type` field from `ImageArtifact`. `mime_type` is now a property constructed using the Artifact type and `format` field. - Improved RAG performance in `VectorQueryEngine`. - Moved [Griptape Docs](https://github.com/griptape-ai/griptape-docs) to this repository. - Updated `EventListener.handler`'s behavior so that the return value will be passed to the `EventListenerDriver.try_publish_event_payload`'s `event_payload` parameter. diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md new file mode 100644 index 000000000..0e85b9bde --- /dev/null +++ b/docs/examples/multi-agent-workflow.md @@ -0,0 +1,191 @@ +In this example we implement a multi-agent Workflow. We have a single "Researcher" Agent that conducts research on a topic, and then fans out to multiple "Writer" Agents to write blog posts based on the research. + +By splitting up our workloads across multiple Structures, we can parallelize the work and leverage the strengths of each Agent. The Researcher can focus on gathering data and insights, while the Writers can focus on crafting engaging narratives. +Additionally, this architecture opens us up to using services such as [Griptape Cloud](https://www.griptape.ai/cloud) to have each Agent run on a separate machine, allowing us to scale our Workflow as needed 🤯. + + +```python +import os + +from griptape.drivers import WebhookEventListenerDriver, LocalStructureRunDriver +from griptape.events import EventListener, FinishStructureRunEvent +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent, Workflow +from griptape.tasks import PromptTask, StructureRunTask +from griptape.tools import ( + TaskMemoryClient, + WebScraper, + WebSearch, +) + +WRITERS = [ + { + "role": "Travel Adventure Blogger", + "goal": "Inspire wanderlust with stories of hidden gems and exotic locales", + "backstory": "With a passport full of stamps, you bring distant cultures and breathtaking scenes to life through vivid storytelling and personal anecdotes.", + }, + { + "role": "Lifestyle Freelance Writer", + "goal": "Share practical advice on living a balanced and stylish life", + "backstory": "From the latest trends in home decor to tips for wellness, your articles help readers create a life that feels both aspirational and attainable.", + }, +] + + +def build_researcher(): + """Builds a Researcher Structure.""" + researcher = Agent( + id="researcher", + tools=[ + WebSearch( + google_api_key=os.environ["GOOGLE_API_KEY"], + google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + off_prompt=False, + ), + WebScraper( + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Lead Research Analyst", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Discover innovative advancements in artificial intelligence and data analytics", + ) + ], + ), + Ruleset( + name="Background", + rules=[ + Rule( + value="""You are part of a prominent technology research institute. + Your speciality is spotting new trends. + You excel at analyzing intricate data and delivering practical insights.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Comprehensive analysis report in list format", + ) + ], + ), + ], + ) + + return researcher + + +def build_writer(role: str, goal: str, backstory: str): + """Builds a Writer Structure. + + Args: + role: The role of the writer. + goal: The goal of the writer. + backstory: The backstory of the writer. + """ + writer = Agent( + id=role.lower().replace(" ", "_"), + event_listeners=[ + EventListener( + event_types=[FinishStructureRunEvent], + driver=WebhookEventListenerDriver( + webhook_url=os.environ["WEBHOOK_URL"], + ), + ) + ], + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value=role, + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value=goal, + ) + ], + ), + Ruleset( + name="Backstory", + rules=[Rule(value=backstory)], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full blog post of at least 4 paragraphs", + ) + ], + ), + ], + ) + + return writer + + +if __name__ == "__main__": + # Build the team + team = Workflow() + research_task = team.add_task( + StructureRunTask( + ( + """Perform a detailed examination of the newest developments in AI as of 2024. + Pinpoint major trends, breakthroughs, and their implications for various industries.""", + ), + id="research", + driver=LocalStructureRunDriver( + structure_factory_fn=build_researcher, + ), + ), + ) + end_task = team.add_task( + PromptTask( + 'State "All Done!"', + ) + ) + team.insert_tasks( + research_task, + [ + StructureRunTask( + ( + """Using insights provided, develop an engaging blog + post that highlights the most significant AI advancements. + Your post should be informative yet accessible, catering to a tech-savvy audience. + Make it sound cool, avoid complex words so it doesn't sound like AI. + + Insights: + {{ parent_outputs["research"] }}""", + ), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: build_writer( + role=writer["role"], + goal=writer["goal"], + backstory=writer["backstory"], + ) + ), + ) + for writer in WRITERS + ], + end_task, + ) + + team.run() +``` diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md new file mode 100644 index 000000000..9c1441608 --- /dev/null +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -0,0 +1,97 @@ +## Overview +Structure Run Drivers can be used to run Griptape Structures in a variety of runtime environments. +When combined with the [Structure Run Task](../../griptape-framework/structures/tasks.md#structure-run-task) or [Structure Run Client](../../griptape-tools/official-tools/structure-run-client.md) you can create complex, multi-agent pipelines that span multiple runtime environments. + +## Local Structure Run Driver + +The [LocalStructureRunDriver](../../reference/griptape/drivers/structure_run/local_structure_run_driver.md) is used to run Griptape Structures in the same runtime environment as the code that is running the Structure. + +```python +from griptape.drivers import LocalStructureRunDriver +from griptape.rules import Rule +from griptape.structures import Agent, Pipeline +from griptape.tasks import StructureRunTask + +joke_teller = Agent( + rules=[ + Rule( + value="You are very funny.", + ) + ], +) + +joke_rewriter = Agent( + rules=[ + Rule( + value="You are the editor of a joke book. But you only speak in riddles", + ) + ], +) + +joke_coordinator = Pipeline( + tasks=[ + StructureRunTask( + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: joke_teller, + ), + ), + StructureRunTask( + ("Rewrite this joke: {{ parent_output }}",), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: joke_rewriter, + ), + ), + ] +) + +joke_coordinator.run("Tell me a joke") +``` + +## Griptape Cloud Structure Run Driver + +The [GriptapeCloudStructureRunDriver](../../reference/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.md) is used to run Griptape Structures in the Griptape Cloud. + + +```python +import os + +from griptape.drivers import GriptapeCloudStructureRunDriver, LocalStructureRunDriver +from griptape.structures import Pipeline, Agent +from griptape.rules import Rule +from griptape.tasks import StructureRunTask + +base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] +api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] + + +pipeline = Pipeline( + tasks=[ + StructureRunTask( + ("Think of a question related to Retrieval Augmented Generation.",), + driver=LocalStructureRunDriver( + structure_factory_fn=lambda: Agent( + rules=[ + Rule( + value="You are an expert in Retrieval Augmented Generation.", + ), + Rule( + value="Only output your answer, no other information.", + ), + ] + ) + ), + ), + StructureRunTask( + ("{{ parent_output }}",), + driver=GriptapeCloudStructureRunDriver( + base_url=base_url, + api_key=api_key, + structure_id=structure_id, + ), + ), + ] +) + +pipeline.run() +``` diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index a7aae8734..c7f9e78cd 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -667,3 +667,143 @@ pipeline.add_task( pipeline.run("Describe the weather in the image") ``` + +## Structure Run Task +The [Structure Run Task](../../reference/griptape/tasks/structure_run_task.md) executes another Structure with a given input. +This Task is useful for orchestrating multiple specialized Structures in a single run. Note that the input to the Task is a tuple of arguments that will be passed to the Structure. + +```python +import os + +from griptape.rules import Rule, Ruleset +from griptape.structures import Agent, Pipeline +from griptape.tasks import StructureRunTask +from griptape.drivers import LocalStructureRunDriver +from griptape.tools import ( + TaskMemoryClient, + WebScraper, + WebSearch, +) + + +def build_researcher(): + researcher = Agent( + tools=[ + WebSearch( + google_api_key=os.environ["GOOGLE_API_KEY"], + google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], + off_prompt=False, + ), + WebScraper( + off_prompt=True, + ), + TaskMemoryClient(off_prompt=False), + ], + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Senior Research Analyst", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Uncover cutting-edge developments in AI and data science", + ) + ], + ), + Ruleset( + name="Background", + rules=[ + Rule( + value="""You work at a leading tech think tank., + Your expertise lies in identifying emerging trends. + You have a knack for dissecting complex data and presenting actionable insights.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full analysis report in bullet points", + ) + ], + ), + ], + ) + + return researcher + + +def build_writer(): + writer = Agent( + input_template="Instructions: {{args[0]}}\nContext: {{args[1]}}", + rulesets=[ + Ruleset( + name="Position", + rules=[ + Rule( + value="Tech Content Strategist", + ) + ], + ), + Ruleset( + name="Objective", + rules=[ + Rule( + value="Craft compelling content on tech advancements", + ) + ], + ), + Ruleset( + name="Backstory", + rules=[ + Rule( + value="""You are a renowned Content Strategist, known for your insightful and engaging articles. + You transform complex concepts into compelling narratives.""" + ) + ], + ), + Ruleset( + name="Desired Outcome", + rules=[ + Rule( + value="Full blog post of at least 4 paragraphs", + ) + ], + ), + ], + ) + + return writer + + +team = Pipeline( + tasks=[ + StructureRunTask( + ( + """Perform a detailed examination of the newest developments in AI as of 2024. + Pinpoint major trends, breakthroughs, and their implications for various industries.""", + ), + driver=LocalStructureRunDriver(structure_factory_fn=build_researcher), + ), + StructureRunTask( + ( + """Utilize the gathered insights to craft a captivating blog + article showcasing the key AI innovations. + Ensure the content is engaging yet straightforward, appealing to a tech-aware readership. + Keep the tone appealing and use simple language to make it less technical.""", + "{{parent_output}}", + ), + driver=LocalStructureRunDriver(structure_factory_fn=build_writer), + ), + ], +) + +team.run() +``` diff --git a/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md b/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md deleted file mode 100644 index 1e98de1c3..000000000 --- a/docs/griptape-tools/official-tools/griptape-cloud-structure-run-client.md +++ /dev/null @@ -1,68 +0,0 @@ -# GriptapeCloudStructureRunClient - -The GriptapeCloudStructureRunClient tool provides a way to interact with the Griptape Cloud Structure Run API. It can be used to execute a Structure Run and retrieve the results. - -```python -from griptape.tools import GriptapeCloudStructureRunClient -from griptape.structures import Agent -import os - -api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] -structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] - -# Create the GriptapeCloudStructureRunClient tool -structure_run_tool = GriptapeCloudStructureRunClient( - description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", - api_key=api_key, - structure_id=structure_id, - off_prompt=False, -) - -# Set up an agent using the GriptapeCloudStructureRunClient tool -agent = Agent( - tools=[structure_run_tool] -) - -# Task: Ask the Griptape Cloud Hosted Structure about modular RAG -agent.run( - "what is modular RAG?" -) -``` -``` -[05/02/24 11:36:16] INFO ToolkitTask 0d99b986140a42c0828215cbc42156e8 - Input: what is modular RAG? -[05/02/24 11:36:24] INFO Subtask b498fb971198476a83ba1a555ff4fb98 - Thought: To provide an explanation of what modular RAG (Retrieval Augmented Generation) is, I will use the - GriptapeCloudStructureRunClient to execute a Structure Run that can provide information on this topic. - - Actions: [ - { - "name": "GriptapeCloudStructureRunClient", - "path": "execute_structure_run", - "input": { - "values": { - "args": ["What is modular RAG?"] - } - }, - "tag": "modular_rag_info" - } - ] -[05/02/24 11:37:28] INFO Subtask b498fb971198476a83ba1a555ff4fb98 - Response: {'id': 'ea96fc6f92f9417880938ff59273be59', 'name': 'ea96fc6f92f9417880938ff59273be59', 'type': - 'TextArtifact', 'value': "Modular RAG is an advanced architecture that builds upon the foundational principles - of Advanced and Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse - strategies to improve its components. Modular RAG introduces additional specialized components like the Search - module for direct searches across various data sources, the RAG-Fusion module for expanding user queries into - diverse perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports - both sequential processing and integrated end-to-end training across its components, illustrating progression - and refinement within the RAG family."} -[05/02/24 11:37:40] INFO ToolkitTask 0d99b986140a42c0828215cbc42156e8 - Output: Modular RAG is an advanced architecture that builds upon the foundational principles of Advanced and - Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse strategies to - improve its components. Modular RAG introduces additional specialized components like the Search module for - direct searches across various data sources, the RAG-Fusion module for expanding user queries into diverse - perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports both - sequential processing and integrated end-to-end training across its components, illustrating progression and - refinement within the RAG family. -Assistant: Modular RAG is an advanced architecture that builds upon the foundational principles of Advanced and Naive RAG paradigms. It offers enhanced adaptability and versatility by incorporating diverse strategies to improve its components. Modular RAG introduces additional specialized components like the Search module for direct searches across various data sources, the RAG-Fusion module for expanding user queries into diverse perspectives, and the Memory module to guide retrieval using the LLM's memory. This approach supports both sequential processing and integrated end-to-end training across its components, illustrating progression and refinement within the RAG family. -``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/structure-run-client.md b/docs/griptape-tools/official-tools/structure-run-client.md new file mode 100644 index 000000000..863e02727 --- /dev/null +++ b/docs/griptape-tools/official-tools/structure-run-client.md @@ -0,0 +1,64 @@ +# StructureRunClient + +The StructureRunClient Tool provides a way to run Structures via a Tool. +It requires you to provide a [Structure Run Driver](../../griptape-framework/drivers/structure-run-drivers.md) to run the Structure in the desired environment. + +```python +import os + +from griptape.drivers import GriptapeCloudStructureRunDriver +from griptape.structures import Agent +from griptape.tools import StructureRunClient + +base_url = os.environ["GRIPTAPE_CLOUD_BASE_URL"] +api_key = os.environ["GRIPTAPE_CLOUD_API_KEY"] +structure_id = os.environ["GRIPTAPE_CLOUD_STRUCTURE_ID"] + +structure_run_tool = StructureRunClient( + description="RAG Expert Agent - Structure to invoke with natural language queries about the topic of Retrieval Augmented Generation", + driver=GriptapeCloudStructureRunDriver( + base_url=base_url, + api_key=api_key, + structure_id=structure_id, + ), + off_prompt=False, +) + +# Set up an agent using the StructureRunClient tool +agent = Agent(tools=[structure_run_tool]) + +# Task: Ask the Griptape Cloud Hosted Structure about modular RAG +agent.run("what is modular RAG?") +``` +``` +[05/02/24 13:50:03] INFO ToolkitTask 4e9458375bda4fbcadb77a94624ed64c + Input: what is modular RAG? +[05/02/24 13:50:10] INFO Subtask 5ef2d72028fc495aa7faf6f46825b004 + Thought: To answer this question, I need to run a search for the term "modular RAG". I will use the StructureRunClient action to execute a + search structure. + Actions: [ + { + "name": "StructureRunClient", + "path": "run_structure", + "input": { + "values": { + "args": "modular RAG" + } + }, + "tag": "search_modular_RAG" + } + ] +[05/02/24 13:50:36] INFO Subtask 5ef2d72028fc495aa7faf6f46825b004 + Response: {'id': '87fa21aded76416e988f8bf39c19760b', 'name': '87fa21aded76416e988f8bf39c19760b', 'type': 'TextArtifact', 'value': 'Modular + Retrieval-Augmented Generation (RAG) is an advanced approach that goes beyond the traditional RAG paradigms, offering enhanced adaptability + and versatility. It involves incorporating diverse strategies to improve its components by adding specialized modules for retrieval and + processing capabilities. The Modular RAG framework allows for module substitution or reconfiguration to address specific challenges, expanding + flexibility by integrating new modules or adjusting interaction flow among existing ones. This approach supports both sequential processing + and integrated end-to-end training across its components, illustrating progression and refinement within the RAG family.'} +[05/02/24 13:50:44] INFO ToolkitTask 4e9458375bda4fbcadb77a94624ed64c + Output: Modular Retrieval-Augmented Generation (RAG) is an advanced approach that goes beyond the traditional RAG paradigms, offering enhanced + adaptability and versatility. It involves incorporating diverse strategies to improve its components by adding specialized modules for + retrieval and processing capabilities. The Modular RAG framework allows for module substitution or reconfiguration to address specific + challenges, expanding flexibility by integrating new modules or adjusting interaction flow among existing ones. This approach supports both + sequential processing and integrated end-to-end training across its components, illustrating progression and refinement within the RAG family. +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index c727c154d..999cacfb5 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -96,6 +96,10 @@ from .file_manager.local_file_manager_driver import LocalFileManagerDriver from .file_manager.amazon_s3_file_manager_driver import AmazonS3FileManagerDriver +from .structure_run.base_structure_run_driver import BaseStructureRunDriver +from .structure_run.griptape_cloud_structure_run_driver import GriptapeCloudStructureRunDriver +from .structure_run.local_structure_run_driver import LocalStructureRunDriver + __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", @@ -179,4 +183,7 @@ "BaseFileManagerDriver", "LocalFileManagerDriver", "AmazonS3FileManagerDriver", + "BaseStructureRunDriver", + "GriptapeCloudStructureRunDriver", + "LocalStructureRunDriver", ] diff --git a/griptape/tools/griptape_cloud_structure_run_client/__init__.py b/griptape/drivers/structure_run/__init__.py similarity index 100% rename from griptape/tools/griptape_cloud_structure_run_client/__init__.py rename to griptape/drivers/structure_run/__init__.py diff --git a/griptape/drivers/structure_run/base_structure_run_driver.py b/griptape/drivers/structure_run/base_structure_run_driver.py new file mode 100644 index 000000000..8e10fb231 --- /dev/null +++ b/griptape/drivers/structure_run/base_structure_run_driver.py @@ -0,0 +1,15 @@ +from abc import ABC, abstractmethod + +from attrs import define + +from griptape.artifacts import BaseArtifact + + +@define +class BaseStructureRunDriver(ABC): + def run(self, *args: BaseArtifact) -> BaseArtifact: + return self.try_run(*args) + + @abstractmethod + def try_run(self, *args: BaseArtifact) -> BaseArtifact: + ... diff --git a/griptape/tools/griptape_cloud_structure_run_client/tool.py b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py similarity index 50% rename from griptape/tools/griptape_cloud_structure_run_client/tool.py rename to griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py index 7d4edbd72..9ed036995 100644 --- a/griptape/tools/griptape_cloud_structure_run_client/tool.py +++ b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py @@ -1,66 +1,41 @@ from __future__ import annotations + import time -from typing import Any, Optional +from typing import Any from urllib.parse import urljoin -from schema import Schema, Literal -from attr import define, field -from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient -from griptape.utils.decorators import activity -from griptape.artifacts import InfoArtifact, TextArtifact, ErrorArtifact + +from attrs import Factory, define, field + +from griptape.artifacts import BaseArtifact, ErrorArtifact, InfoArtifact, TextArtifact +from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver @define -class GriptapeCloudStructureRunClient(BaseGriptapeCloudClient): - """ - Attributes: - description: LLM-friendly structure description. - structure_id: ID of the Griptape Cloud Structure. - """ - - _description: Optional[str] = field(default=None, kw_only=True) +class GriptapeCloudStructureRunDriver(BaseStructureRunDriver): + base_url: str = field(default="https://cloud.griptape.ai", kw_only=True) + api_key: str = field(kw_only=True) + headers: dict = field( + default=Factory(lambda self: {"Authorization": f"Bearer {self.api_key}"}, takes_self=True), kw_only=True + ) structure_id: str = field(kw_only=True) structure_run_wait_time_interval: int = field(default=2, kw_only=True) structure_run_max_wait_time_attempts: int = field(default=20, kw_only=True) + async_run: bool = field(default=False, kw_only=True) - @property - def description(self) -> str: - if self._description is None: - from requests import get - - url = urljoin(self.base_url.strip("/"), f"/api/structures/{self.structure_id}/") - - response = get(url, headers=self.headers).json() - if "description" in response: - self._description = response["description"] - else: - raise ValueError(f'Error getting Structure description: {response["message"]}') + def try_run(self, *args: BaseArtifact) -> BaseArtifact: + from requests import HTTPError, Response, exceptions, post - return self._description - - @description.setter - def description(self, value: str) -> None: - self._description = value - - @activity( - config={ - "description": "Can be used to execute a Run of a Structure with the following description: {{ _self.description }}", - "schema": Schema( - {Literal("args", description="A list of string arguments to submit to the Structure Run"): list} - ), - } - ) - def execute_structure_run(self, params: dict) -> InfoArtifact | TextArtifact | ErrorArtifact: - from requests import post, exceptions, HTTPError, Response - - args: list[str] = params["values"]["args"] url = urljoin(self.base_url.strip("/"), f"/api/structures/{self.structure_id}/runs") try: - response: Response = post(url, json={"args": args}, headers=self.headers) + response: Response = post(url, json={"args": [arg.value for arg in args]}, headers=self.headers) response.raise_for_status() response_json = response.json() - return self._get_structure_run_result(response_json["structure_run_id"]) + if self.async_run: + return InfoArtifact("Run started successfully") + else: + return self._get_structure_run_result(response_json["structure_run_id"]) except (exceptions.RequestException, HTTPError) as err: return ErrorArtifact(str(err)) @@ -87,7 +62,7 @@ def _get_structure_run_result(self, structure_run_id: str) -> InfoArtifact | Tex return ErrorArtifact(result) if "output" in result: - return TextArtifact(result["output"]) + return TextArtifact.from_dict(result["output"]) else: return InfoArtifact("No output found in response") @@ -96,4 +71,5 @@ def _get_structure_run_result_attempt(self, structure_run_url: str) -> Any: response: Response = get(structure_run_url, headers=self.headers) response.raise_for_status() + return response.json() diff --git a/griptape/drivers/structure_run/local_structure_run_driver.py b/griptape/drivers/structure_run/local_structure_run_driver.py new file mode 100644 index 000000000..255f91445 --- /dev/null +++ b/griptape/drivers/structure_run/local_structure_run_driver.py @@ -0,0 +1,23 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Callable + +from attrs import define, field + +from griptape.artifacts import BaseArtifact, InfoArtifact +from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver + +if TYPE_CHECKING: + from griptape.structures import Structure + + +@define +class LocalStructureRunDriver(BaseStructureRunDriver): + structure_factory_fn: Callable[[], Structure] = field(kw_only=True) + + def try_run(self, *args: BaseArtifact) -> BaseArtifact: + structure_factory_fn = self.structure_factory_fn().run(*[arg.value for arg in args]) + + if structure_factory_fn.output_task.output is not None: + return structure_factory_fn.output_task.output + else: + return InfoArtifact("No output found in response") diff --git a/griptape/tasks/__init__.py b/griptape/tasks/__init__.py index 7751a0cc9..5d8dac58e 100644 --- a/griptape/tasks/__init__.py +++ b/griptape/tasks/__init__.py @@ -1,5 +1,6 @@ from .base_task import BaseTask from .base_text_input_task import BaseTextInputTask +from .base_multi_text_input_task import BaseMultiTextInputTask from .prompt_task import PromptTask from .actions_subtask import ActionsSubtask from .toolkit_task import ToolkitTask @@ -16,10 +17,12 @@ from .outpainting_image_generation_task import OutpaintingImageGenerationTask from .variation_image_generation_task import VariationImageGenerationTask from .image_query_task import ImageQueryTask +from .structure_run_task import StructureRunTask __all__ = [ "BaseTask", "BaseTextInputTask", + "BaseMultiTextInputTask", "PromptTask", "ActionsSubtask", "ToolkitTask", @@ -36,4 +39,5 @@ "InpaintingImageGenerationTask", "OutpaintingImageGenerationTask", "ImageQueryTask", + "StructureRunTask", ] diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py new file mode 100644 index 000000000..eb00af6ca --- /dev/null +++ b/griptape/tasks/base_multi_text_input_task.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from abc import ABC +from typing import Callable + +from attr import define, field, Factory + +from griptape.artifacts import TextArtifact +from griptape.mixins.rule_mixin import RuleMixin +from griptape.tasks import BaseTask +from griptape.utils import J2 + + +@define +class BaseMultiTextInputTask(RuleMixin, BaseTask, ABC): + DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" + + _input: tuple[str, ...] | tuple[TextArtifact, ...] | tuple[Callable[[BaseTask], TextArtifact], ...] = field( + default=Factory(lambda self: (self.DEFAULT_INPUT_TEMPLATE,), takes_self=True), alias="input" + ) + + @property + def input(self) -> tuple[TextArtifact, ...]: + if all(isinstance(elem, TextArtifact) for elem in self._input): + return self._input # pyright: ignore + elif all(isinstance(elem, Callable) for elem in self._input): + return tuple([elem(self) for elem in self._input]) # pyright: ignore + elif isinstance(self._input, tuple): + return tuple( + [ + TextArtifact(J2().render_from_string(input_template, **self.full_context)) # pyright: ignore + for input_template in self._input + ] + ) + else: + return tuple([TextArtifact(J2().render_from_string(self._input, **self.full_context))]) + + @input.setter + def input( + self, value: tuple[str, ...] | tuple[TextArtifact, ...] | tuple[Callable[[BaseTask], TextArtifact], ...] + ) -> None: + self._input = value + + def before_run(self) -> None: + super().before_run() + + joined_input = "\n".join([input.to_text() for input in self.input]) + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nInput: {joined_input}") + + def after_run(self) -> None: + super().after_run() + + self.structure.logger.info(f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text()}") diff --git a/griptape/tasks/structure_run_task.py b/griptape/tasks/structure_run_task.py new file mode 100644 index 000000000..b7a8f9ea9 --- /dev/null +++ b/griptape/tasks/structure_run_task.py @@ -0,0 +1,22 @@ +from __future__ import annotations + + +from attr import define, field + +from griptape.artifacts import BaseArtifact +from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver +from griptape.tasks import BaseMultiTextInputTask + + +@define +class StructureRunTask(BaseMultiTextInputTask): + """Task to run a Structure. + + Attributes: + driver: Driver to run the Structure. + """ + + driver: BaseStructureRunDriver = field(kw_only=True) + + def run(self) -> BaseArtifact: + return self.driver.run(*self.input) diff --git a/griptape/tools/__init__.py b/griptape/tools/__init__.py index 3e4dbb5bc..0c9b6e01d 100644 --- a/griptape/tools/__init__.py +++ b/griptape/tools/__init__.py @@ -24,7 +24,7 @@ from .inpainting_image_generation_client.tool import InpaintingImageGenerationClient from .outpainting_image_generation_client.tool import OutpaintingImageGenerationClient from .griptape_cloud_knowledge_base_client.tool import GriptapeCloudKnowledgeBaseClient -from .griptape_cloud_structure_run_client.tool import GriptapeCloudStructureRunClient +from .structure_run_client.tool import StructureRunClient from .image_query_client.tool import ImageQueryClient __all__ = [ @@ -54,6 +54,6 @@ "InpaintingImageGenerationClient", "OutpaintingImageGenerationClient", "GriptapeCloudKnowledgeBaseClient", - "GriptapeCloudStructureRunClient", + "StructureRunClient", "ImageQueryClient", ] diff --git a/griptape/tools/griptape_cloud_structure_run_client/manifest.yml b/griptape/tools/griptape_cloud_structure_run_client/manifest.yml deleted file mode 100644 index 5741fa336..000000000 --- a/griptape/tools/griptape_cloud_structure_run_client/manifest.yml +++ /dev/null @@ -1,5 +0,0 @@ -version: "v1" -name: Griptape Cloud Structure Run Client -description: Tool for using the Griptape Cloud Structure Run API. -contact_email: hello@griptape.ai -legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/structure_run_client/__init__.py b/griptape/tools/structure_run_client/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/structure_run_client/manifest.yml b/griptape/tools/structure_run_client/manifest.yml new file mode 100644 index 000000000..5f53158d8 --- /dev/null +++ b/griptape/tools/structure_run_client/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Structure Run Client +description: Tool for running a Structure. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py new file mode 100644 index 000000000..c62b53e97 --- /dev/null +++ b/griptape/tools/structure_run_client/tool.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from attr import define, field +from schema import Literal, Schema + +from griptape.artifacts import BaseArtifact, TextArtifact +from griptape.drivers import BaseStructureRunDriver +from griptape.tools.base_tool import BaseTool +from griptape.utils.decorators import activity + + +@define +class StructureRunClient(BaseTool): + """ + Attributes: + description: A description of what the Structure does. + driver: Driver to run the Structure. + """ + + description: str = field(kw_only=True) + driver: BaseStructureRunDriver = field(kw_only=True) + + @activity( + config={ + "description": "Can be used to run a Griptape Structure with the following description: {{ self.description }}", + "schema": Schema( + {Literal("args", description="A list of string arguments to submit to the Structure Run"): list} + ), + } + ) + def run_structure(self, params: dict) -> BaseArtifact: + args: list[str] = params["values"]["args"] + + return self.driver.run(*[TextArtifact(arg) for arg in args]) diff --git a/mkdocs.yml b/mkdocs.yml index bfedcaac4..f5f0dc954 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -129,7 +129,7 @@ nav: - GoogleGmailClient: "griptape-tools/official-tools/google-gmail-client.md" - GoogleDriveClient: "griptape-tools/official-tools/google-drive-client.md" - GoogleDocsClient: "griptape-tools/official-tools/google-docs-client.md" - - GriptapeCloudStructureRunClient: "griptape-tools/official-tools/griptape-cloud-structure-run-client.md" + - StructureRunClient: "griptape-tools/official-tools/structure-run-client.md" - OpenWeatherClient: "griptape-tools/official-tools/openweather-client.md" - RestApiClient: "griptape-tools/official-tools/rest-api-client.md" - SqlClient: "griptape-tools/official-tools/sql-client.md" @@ -150,6 +150,7 @@ nav: - Talk to Redshift: "examples/talk-to-redshift.md" - Talk to a Webpage: "examples/talk-to-a-webpage.md" - Talk to a PDF: "examples/talk-to-a-pdf.md" + - Multi Agent Workflows: "examples/multi-agent-workflow.md" - Shared Memory Between Agents: "examples/multiple-agent-shared-memory.md" - Chat Sessions with Amazon DynamoDB: "examples/amazon-dynamodb-sessions.md" - Data: diff --git a/tests/mocks/mock_multi_text_input_task.py b/tests/mocks/mock_multi_text_input_task.py new file mode 100644 index 000000000..1da645ee4 --- /dev/null +++ b/tests/mocks/mock_multi_text_input_task.py @@ -0,0 +1,9 @@ +from attr import define +from griptape.artifacts import TextArtifact +from griptape.tasks import BaseMultiTextInputTask + + +@define +class MockMultiTextInputTask(BaseMultiTextInputTask): + def run(self) -> TextArtifact: + return TextArtifact(self.input[0].to_text()) diff --git a/tests/unit/drivers/structure_run/__init__.py b/tests/unit/drivers/structure_run/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py new file mode 100644 index 000000000..8318553b1 --- /dev/null +++ b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py @@ -0,0 +1,35 @@ +import pytest +from griptape.artifacts import TextArtifact, InfoArtifact + + +class TestGriptapeCloudStructureRunDriver: + @pytest.fixture + def driver(self, mocker): + from griptape.drivers import GriptapeCloudStructureRunDriver + + mock_response = mocker.Mock() + mock_response.json.return_value = {"structure_run_id": 1} + mocker.patch("requests.post", return_value=mock_response) + + mock_response = mocker.Mock() + mock_response.json.return_value = { + "description": "fizz buzz", + "output": TextArtifact("foo bar").to_dict(), + "status": "SUCCEEDED", + } + mocker.patch("requests.get", return_value=mock_response) + + return GriptapeCloudStructureRunDriver( + base_url="https://cloud-foo.griptape.ai", api_key="foo bar", structure_id="1" + ) + + def test_run(self, driver): + result = driver.run(TextArtifact("foo bar")) + assert isinstance(result, TextArtifact) + assert result.value == "foo bar" + + def test_async_run(self, driver): + driver.async_run = True + result = driver.run(TextArtifact("foo bar")) + assert isinstance(result, InfoArtifact) + assert result.value == "Run started successfully" diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py new file mode 100644 index 000000000..04da4f2cf --- /dev/null +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -0,0 +1,24 @@ +import pytest +from griptape.tasks import StructureRunTask +from griptape.structures import Agent +from tests.mocks.mock_prompt_driver import MockPromptDriver +from griptape.drivers import LocalStructureRunDriver +from griptape.structures import Pipeline + + +class TestLocalStructureRunDriver: + @pytest.fixture + def driver(self): + agent = Agent(prompt_driver=MockPromptDriver(mock_output="agent mock output")) + driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) + + return driver + + def test_run(self, driver): + pipeline = Pipeline(prompt_driver=MockPromptDriver(mock_output="pipeline mock output")) + + task = StructureRunTask(driver=driver) + + pipeline.add_task(task) + + assert task.run().to_text() == "agent mock output" diff --git a/tests/unit/tasks/test_base_multi_text_input_task.py b/tests/unit/tasks/test_base_multi_text_input_task.py new file mode 100644 index 000000000..542162757 --- /dev/null +++ b/tests/unit/tasks/test_base_multi_text_input_task.py @@ -0,0 +1,58 @@ +from tests.mocks.mock_prompt_driver import MockPromptDriver +from griptape.structures import Pipeline +from griptape.artifacts import TextArtifact +from griptape.rules import Ruleset, Rule +from tests.mocks.mock_multi_text_input_task import MockMultiTextInputTask + + +class TestBaseMultiTextInputTask: + def test_string_input(self): + assert MockMultiTextInputTask(("foobar", "bazbar")).input[0].value == "foobar" + assert MockMultiTextInputTask(("foobar", "bazbar")).input[1].value == "bazbar" + + task = MockMultiTextInputTask() + task.input = ("foobar", "bazbar") + assert task.input[0].value == "foobar" + assert task.input[1].value == "bazbar" + + def test_artifact_input(self): + assert MockMultiTextInputTask((TextArtifact("foobar"), TextArtifact("bazbar"))).input[0].value == "foobar" + assert MockMultiTextInputTask((TextArtifact("foobar"), TextArtifact("bazbar"))).input[1].value == "bazbar" + + task = MockMultiTextInputTask() + task.input = (TextArtifact("foobar"), TextArtifact("bazbar")) + assert task.input[0].value == "foobar" + assert task.input[1].value == "bazbar" + + def test_callable_input(self): + assert ( + MockMultiTextInputTask((lambda _: TextArtifact("foobar"), lambda _: TextArtifact("bazbar"))).input[0].value + == "foobar" + ) + assert ( + MockMultiTextInputTask((lambda _: TextArtifact("foobar"), lambda _: TextArtifact("bazbar"))).input[1].value + == "bazbar" + ) + + task = MockMultiTextInputTask() + task.input = (lambda _: TextArtifact("foobar"), lambda _: TextArtifact("bazbar")) + assert task.input[0].value == "foobar" + assert task.input[1].value == "bazbar" + + def test_full_context(self): + parent = MockMultiTextInputTask(("parent1", "parent2")) + subtask = MockMultiTextInputTask(("test1", "test2"), context={"foo": "bar"}) + child = MockMultiTextInputTask(("child2", "child2")) + pipeline = Pipeline(prompt_driver=MockPromptDriver()) + + pipeline.add_tasks(parent, subtask, child) + + pipeline.run() + + context = subtask.full_context + + assert context["foo"] == "bar" + assert context["parent_output"] == parent.output.to_text() + assert context["structure"] == pipeline + assert context["parent"] == parent + assert context["child"] == child diff --git a/tests/unit/tasks/test_structure_run_task.py b/tests/unit/tasks/test_structure_run_task.py new file mode 100644 index 000000000..d89e98c91 --- /dev/null +++ b/tests/unit/tasks/test_structure_run_task.py @@ -0,0 +1,18 @@ +from griptape.tasks import StructureRunTask +from griptape.structures import Agent +from tests.mocks.mock_prompt_driver import MockPromptDriver +from griptape.drivers import LocalStructureRunDriver +from griptape.structures import Pipeline + + +class TestStructureRunTask: + def test_run(self): + agent = Agent(prompt_driver=MockPromptDriver(mock_output="agent mock output")) + pipeline = Pipeline(prompt_driver=MockPromptDriver(mock_output="pipeline mock output")) + driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) + + task = StructureRunTask(driver=driver) + + pipeline.add_task(task) + + assert task.run().to_text() == "agent mock output" diff --git a/tests/unit/tools/test_griptape_cloud_structure_run_client.py b/tests/unit/tools/test_griptape_cloud_structure_run_client.py deleted file mode 100644 index 8656a8f77..000000000 --- a/tests/unit/tools/test_griptape_cloud_structure_run_client.py +++ /dev/null @@ -1,27 +0,0 @@ -import pytest -from griptape.artifacts import TextArtifact - - -class TestGriptapeCloudStructureRunClient: - @pytest.fixture - def client(self, mocker): - from griptape.tools import GriptapeCloudStructureRunClient - - mock_response = mocker.Mock() - mock_response.json.return_value = {"structure_run_id": 1} - mocker.patch("requests.post", return_value=mock_response) - - mock_response = mocker.Mock() - mock_response.json.return_value = {"description": "fizz buzz", "output": "fooey booey", "status": "SUCCEEDED"} - mocker.patch("requests.get", return_value=mock_response) - - return GriptapeCloudStructureRunClient(base_url="https://api.griptape.ai", api_key="foo bar", structure_id="1") - - def test_execute_structure_run(self, client): - assert isinstance(client.execute_structure_run({"values": {"args": ["foo bar"]}}), TextArtifact) - - def test_get_structure_description(self, client): - assert client.description == "fizz buzz" - - client.description = "foo bar" - assert client.description == "foo bar" diff --git a/tests/unit/tools/test_structure_run_client.py b/tests/unit/tools/test_structure_run_client.py new file mode 100644 index 000000000..b57bfb28f --- /dev/null +++ b/tests/unit/tools/test_structure_run_client.py @@ -0,0 +1,20 @@ +import pytest +from griptape.drivers.structure_run.local_structure_run_driver import LocalStructureRunDriver +from griptape.tools import StructureRunClient +from griptape.structures import Agent +from tests.mocks.mock_prompt_driver import MockPromptDriver + + +class TestStructureRunClient: + @pytest.fixture + def client(self): + driver = MockPromptDriver() + agent = Agent(prompt_driver=driver) + + return StructureRunClient( + description="foo bar", driver=LocalStructureRunDriver(structure_factory_fn=lambda: agent) + ) + + def test_run_structure(self, client): + assert client.run_structure({"values": {"args": "foo bar"}}).value == "mock output" + assert client.description == "foo bar" From 73cc9a888de2277a3e08851ef58f1e8b406909c3 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 6 May 2024 10:43:45 -0700 Subject: [PATCH 040/238] Use factory in example (#772) --- .../drivers/structure-run-drivers.md | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/docs/griptape-framework/drivers/structure-run-drivers.md b/docs/griptape-framework/drivers/structure-run-drivers.md index 9c1441608..c2b94190c 100644 --- a/docs/griptape-framework/drivers/structure-run-drivers.md +++ b/docs/griptape-framework/drivers/structure-run-drivers.md @@ -12,33 +12,39 @@ from griptape.rules import Rule from griptape.structures import Agent, Pipeline from griptape.tasks import StructureRunTask -joke_teller = Agent( - rules=[ - Rule( - value="You are very funny.", - ) - ], -) - -joke_rewriter = Agent( - rules=[ - Rule( - value="You are the editor of a joke book. But you only speak in riddles", - ) - ], -) +def build_joke_teller(): + joke_teller = Agent( + rules=[ + Rule( + value="You are very funny.", + ) + ], + ) + + return joke_teller + +def build_joke_rewriter(): + joke_rewriter = Agent( + rules=[ + Rule( + value="You are the editor of a joke book. But you only speak in riddles", + ) + ], + ) + + return joke_rewriter joke_coordinator = Pipeline( tasks=[ StructureRunTask( driver=LocalStructureRunDriver( - structure_factory_fn=lambda: joke_teller, + structure_factory_fn=build_joke_teller, ), ), StructureRunTask( ("Rewrite this joke: {{ parent_output }}",), driver=LocalStructureRunDriver( - structure_factory_fn=lambda: joke_rewriter, + structure_factory_fn=build_joke_rewriter, ), ), ] From 307ac2bbedfe9ade61aa740d60e3bc88e2d9bc45 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Tue, 14 May 2024 08:15:23 -1000 Subject: [PATCH 041/238] Support batched events (#777) --- CHANGELOG.md | 8 +++++ .../amazon_sqs_event_listener_driver.py | 8 +++++ .../aws_iot_core_event_listener_driver.py | 3 ++ .../base_event_listener_driver.py | 32 +++++++++++++++---- .../griptape_cloud_event_listener_driver.py | 6 ++++ .../webhook_event_listener_driver.py | 4 +++ griptape/events/base_event.py | 6 +++- griptape/events/event_listener.py | 6 ++-- griptape/structures/structure.py | 7 ++-- tests/mocks/mock_event.py | 2 +- tests/mocks/mock_event_listener_driver.py | 5 ++- .../test_amazon_sqs_event_listener_driver.py | 3 ++ .../test_aws_iot_event_listener_driver.py | 3 ++ .../test_base_event_listener_driver.py | 25 +++++++++++++++ ...st_griptape_cloud_event_listener_driver.py | 11 +++++++ .../test_webhook_event_listener_driver.py | 11 +++++++ tests/unit/events/test_event_listener.py | 4 +-- 17 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 tests/unit/drivers/event_listener/test_base_event_listener_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e31647b7b..632c58bee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [0.25.1] - 2024-05-09 +### Added +- Optional event batching on Event Listener Drivers. +- `id` field to all events. + +### Changed +- Default behavior of Event Listener Drivers to batch events. + ## [0.25.0] - 2024-05-06 ### Added diff --git a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py index 24e3c9e1e..1c8132b67 100644 --- a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py +++ b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py @@ -20,3 +20,11 @@ class AmazonSqsEventListenerDriver(BaseEventListenerDriver): def try_publish_event_payload(self, event_payload: dict) -> None: self.sqs_client.send_message(QueueUrl=self.queue_url, MessageBody=json.dumps(event_payload)) + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + entries = [ + {"Id": str(event_payload["id"]), "MessageBody": json.dumps(event_payload)} + for event_payload in event_payload_batch + ] + + self.sqs_client.send_message_batch(QueueUrl=self.queue_url, Entries=entries) diff --git a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py index 302fd91d5..c4fd72084 100644 --- a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py +++ b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py @@ -21,3 +21,6 @@ class AwsIotCoreEventListenerDriver(BaseEventListenerDriver): def try_publish_event_payload(self, event_payload: dict) -> None: self.iotdata_client.publish(topic=self.topic, payload=json.dumps(event_payload)) + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + self.iotdata_client.publish(topic=self.topic, payload=json.dumps(event_payload_batch)) diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index eec0fe320..8e7f827e9 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -14,19 +14,37 @@ @define class BaseEventListenerDriver(ABC): futures_executor: futures.Executor = field(default=Factory(lambda: futures.ThreadPoolExecutor()), kw_only=True) + batched: bool = field(default=True, kw_only=True) + batch_size: int = field(default=10, kw_only=True) - def publish_event(self, event: BaseEvent | dict) -> None: - if isinstance(event, dict): - self.futures_executor.submit(self._safe_try_publish_event_payload, event) - else: - self.futures_executor.submit(self._safe_try_publish_event_payload, event.to_dict()) + _batch: list[dict] = field(default=Factory(list), kw_only=True) + + @property + def batch(self) -> list[dict]: + return self._batch + + def publish_event(self, event: BaseEvent | dict, flush: bool = False) -> None: + self.futures_executor.submit(self._safe_try_publish_event, event, flush) @abstractmethod def try_publish_event_payload(self, event_payload: dict) -> None: ... - def _safe_try_publish_event_payload(self, event_payload: dict) -> None: + @abstractmethod + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + ... + + def _safe_try_publish_event(self, event: BaseEvent | dict, flush: bool) -> None: try: - self.try_publish_event_payload(event_payload) + event_payload = event if isinstance(event, dict) else event.to_dict() + + if self.batched: + self._batch.append(event_payload) + if len(self.batch) >= self.batch_size or flush: + self.try_publish_event_payload_batch(self.batch) + self._batch = [] + return + else: + self.try_publish_event_payload(event_payload) except Exception as e: logger.error(e) diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 461f06be9..2c4149ae7 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -41,3 +41,9 @@ def try_publish_event_payload(self, event_payload: dict) -> None: response = requests.post(url=url, json=event_payload, headers=self.headers) response.raise_for_status() + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + url = urljoin(self.base_url.strip("/"), f"/api/structure-runs/{self.structure_run_id}/events") + + response = requests.post(url=url, json=event_payload_batch, headers=self.headers) + response.raise_for_status() diff --git a/griptape/drivers/event_listener/webhook_event_listener_driver.py b/griptape/drivers/event_listener/webhook_event_listener_driver.py index 3803c86b6..242e5428a 100644 --- a/griptape/drivers/event_listener/webhook_event_listener_driver.py +++ b/griptape/drivers/event_listener/webhook_event_listener_driver.py @@ -15,3 +15,7 @@ class WebhookEventListenerDriver(BaseEventListenerDriver): def try_publish_event_payload(self, event_payload: dict) -> None: response = requests.post(url=self.webhook_url, json=event_payload, headers=self.headers) response.raise_for_status() + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + response = requests.post(url=self.webhook_url, json=event_payload_batch, headers=self.headers) + response.raise_for_status() diff --git a/griptape/events/base_event.py b/griptape/events/base_event.py index d32defe96..48a48890e 100644 --- a/griptape/events/base_event.py +++ b/griptape/events/base_event.py @@ -1,11 +1,15 @@ from __future__ import annotations + import time +import uuid from abc import ABC -from attr import define, field, Factory + +from attr import Factory, define, field from griptape.mixins import SerializableMixin @define class BaseEvent(SerializableMixin, ABC): + id: str = field(default=Factory(lambda: uuid.uuid4().hex), kw_only=True, metadata={"serializable": True}) timestamp: float = field(default=Factory(lambda: time.time()), kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/event_listener.py b/griptape/events/event_listener.py index a6b692d4d..44d7b2d85 100644 --- a/griptape/events/event_listener.py +++ b/griptape/events/event_listener.py @@ -13,13 +13,13 @@ class EventListener: event_types: Optional[list[type[BaseEvent]]] = field(default=None, kw_only=True) driver: Optional[BaseEventListenerDriver] = field(default=None, kw_only=True) - def publish_event(self, event: BaseEvent) -> None: + def publish_event(self, event: BaseEvent, flush: bool = False) -> None: event_types = self.event_types if event_types is None or type(event) in event_types: event_payload = self.handler(event) if self.driver is not None: if event_payload is not None and isinstance(event_payload, dict): - self.driver.publish_event(event_payload) + self.driver.publish_event(event_payload, flush=flush) else: - self.driver.publish_event(event) + self.driver.publish_event(event, flush=flush) diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index ef9205db9..9cd28ab67 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -249,9 +249,9 @@ def remove_event_listener(self, event_listener: EventListener) -> None: else: raise ValueError("Event Listener not found.") - def publish_event(self, event: BaseEvent) -> None: + def publish_event(self, event: BaseEvent, flush: bool = False) -> None: for event_listener in self.event_listeners: - event_listener.publish_event(event) + event_listener.publish_event(event, flush) def context(self, task: BaseTask) -> dict[str, Any]: return {"args": self.execution_args, "structure": self} @@ -269,7 +269,8 @@ def after_run(self) -> None: structure_id=self.id, output_task_input=self.output_task.input, output_task_output=self.output_task.output, - ) + ), + flush=True, ) @abstractmethod diff --git a/tests/mocks/mock_event.py b/tests/mocks/mock_event.py index 651cf3ece..2b9d9ade3 100644 --- a/tests/mocks/mock_event.py +++ b/tests/mocks/mock_event.py @@ -3,4 +3,4 @@ class MockEvent(BaseEvent): def to_dict(self) -> dict: - return {"timestamp": self.timestamp} + return {"timestamp": self.timestamp, "id": self.id} diff --git a/tests/mocks/mock_event_listener_driver.py b/tests/mocks/mock_event_listener_driver.py index 3e0c173ca..dd54eeb73 100644 --- a/tests/mocks/mock_event_listener_driver.py +++ b/tests/mocks/mock_event_listener_driver.py @@ -6,4 +6,7 @@ @define class MockEventListenerDriver(BaseEventListenerDriver): def try_publish_event_payload(self, event_payload: dict) -> None: - ... + pass + + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: + pass diff --git a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py index e0a9e7b7c..706831d67 100644 --- a/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_amazon_sqs_event_listener_driver.py @@ -29,3 +29,6 @@ def test_init(self, driver): def test_try_publish_event_payload(self, driver): driver.try_publish_event_payload(MockEvent().to_dict()) + + def test_try_publish_event_payload_batch(self, driver): + driver.try_publish_event_payload_batch([MockEvent().to_dict() for _ in range(3)]) diff --git a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py index cd50ac82d..9a5fe9ec0 100644 --- a/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_aws_iot_event_listener_driver.py @@ -23,3 +23,6 @@ def test_init(self, driver): def test_try_publish_event_payload(self, driver): driver.try_publish_event_payload(MockEvent().to_dict()) + + def test_try_publish_event_payload_batch(self, driver): + driver.try_publish_event_payload_batch([MockEvent().to_dict() for _ in range(3)]) diff --git a/tests/unit/drivers/event_listener/test_base_event_listener_driver.py b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py new file mode 100644 index 000000000..6d33dd2a0 --- /dev/null +++ b/tests/unit/drivers/event_listener/test_base_event_listener_driver.py @@ -0,0 +1,25 @@ +from tests.mocks.mock_event import MockEvent +from tests.mocks.mock_event_listener_driver import MockEventListenerDriver + + +class TestBaseEventListenerDriver: + def test__safe_try_publish_event(self): + driver = MockEventListenerDriver(batched=False) + + for _ in range(4): + driver._safe_try_publish_event(MockEvent().to_dict(), flush=False) + assert len(driver.batch) == 0 + + def test__safe_try_publish_event_batch(self): + driver = MockEventListenerDriver(batched=True) + + for _ in range(0, 3): + driver._safe_try_publish_event(MockEvent().to_dict(), flush=False) + assert len(driver.batch) == 3 + + def test__safe_try_publish_event_batch_flush(self): + driver = MockEventListenerDriver(batched=True) + + for _ in range(0, 3): + driver._safe_try_publish_event(MockEvent().to_dict(), flush=True) + assert len(driver.batch) == 0 diff --git a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py index 51f29ff71..d27f09ec8 100644 --- a/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_griptape_cloud_event_listener_driver.py @@ -39,6 +39,17 @@ def test_try_publish_event_payload(self, mock_post, driver): headers={"Authorization": "Bearer foo bar"}, ) + def try_publish_event_payload_batch(self, mock_post, driver): + for _ in range(3): + event = MockEvent() + driver.try_publish_event_payload(event.to_dict()) + + mock_post.assert_called_with( + url="https://cloud123.griptape.ai/api/structure-runs/bar baz/events", + json=event.to_dict(), + headers={"Authorization": "Bearer foo bar"}, + ) + def test_no_structure_run_id(self): with pytest.raises(ValueError): GriptapeCloudEventListenerDriver(api_key="foo bar") diff --git a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py index f3f872c0a..50021cbe3 100644 --- a/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py +++ b/tests/unit/drivers/event_listener/test_webhook_event_listener_driver.py @@ -23,3 +23,14 @@ def test_try_publish_event_payload(self, mock_post): mock_post.assert_called_once_with( url="foo bar", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"} ) + + def test_try_publish_event_payload_batch(self, mock_post): + driver = WebhookEventListenerDriver(webhook_url="foo bar", headers={"Authorization": "Bearer foo bar"}) + + for _ in range(3): + event = MockEvent() + driver.try_publish_event_payload(event.to_dict()) + + mock_post.assert_called_with( + url="foo bar", json=event.to_dict(), headers={"Authorization": "Bearer foo bar"} + ) diff --git a/tests/unit/events/test_event_listener.py b/tests/unit/events/test_event_listener.py index fcc9688ed..2f32837e0 100644 --- a/tests/unit/events/test_event_listener.py +++ b/tests/unit/events/test_event_listener.py @@ -114,7 +114,7 @@ def event_handler(_: BaseEvent): event_listener = EventListener(event_handler, driver=mock_event_listener_driver, event_types=[MockEvent]) event_listener.publish_event(mock_event) - mock_event_listener_driver.publish_event.assert_called_once_with(mock_event) + mock_event_listener_driver.publish_event.assert_called_once_with(mock_event, flush=False) def test_publish_transformed_event(self): mock_event_listener_driver = Mock() @@ -127,4 +127,4 @@ def event_handler(event: BaseEvent): event_listener = EventListener(event_handler, driver=mock_event_listener_driver, event_types=[MockEvent]) event_listener.publish_event(mock_event) - mock_event_listener_driver.publish_event.assert_called_once_with({"event": mock_event.to_dict()}) + mock_event_listener_driver.publish_event.assert_called_once_with({"event": mock_event.to_dict()}, flush=False) From c39ad53f5dd67522b84f5399fca84b1fda75505e Mon Sep 17 00:00:00 2001 From: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> Date: Tue, 14 May 2024 17:31:58 -0400 Subject: [PATCH 042/238] Add gpt-4o and update OpenAiStructureConfig default prompt_driver (#780) --- CHANGELOG.md | 3 +++ griptape/config/openai_structure_config.py | 2 +- griptape/tokenizers/openai_tokenizer.py | 7 ++++++- tests/unit/config/test_openai_structure_config.py | 10 +++++----- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 632c58bee..c2b9403b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed +- Default behavior of OpenAiStructureConfig to utilize `gpt-4o` for prompt_driver. + ## [0.25.1] - 2024-05-09 ### Added - Optional event batching on Event Listener Drivers. diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index 283fca2d1..64c32ecec 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -24,7 +24,7 @@ class OpenAiStructureConfig(BaseStructureConfig): global_drivers: StructureGlobalDriversConfig = field( default=Factory( lambda: StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), image_generation_driver=OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512"), image_query_driver=OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview"), embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small"), diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index 08c334e0c..dda8bfe15 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -10,7 +10,7 @@ class OpenAiTokenizer(BaseTokenizer): DEFAULT_OPENAI_GPT_3_COMPLETION_MODEL = "gpt-3.5-turbo-instruct" DEFAULT_OPENAI_GPT_3_CHAT_MODEL = "gpt-3.5-turbo" - DEFAULT_OPENAI_GPT_4_MODEL = "gpt-4" + DEFAULT_OPENAI_GPT_4_MODEL = "gpt-4o" DEFAULT_ENCODING = "cl100k_base" DEFAULT_MAX_TOKENS = 2049 DEFAULT_MAX_OUTPUT_TOKENS = 4096 @@ -18,6 +18,7 @@ class OpenAiTokenizer(BaseTokenizer): # https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo MODEL_PREFIXES_TO_MAX_INPUT_TOKENS = { + "gpt-4o": 128000, "gpt-4-1106": 128000, "gpt-4-32k": 32768, "gpt-4": 8192, @@ -85,6 +86,7 @@ def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> i "gpt-4-32k-0314", "gpt-4-0613", "gpt-4-32k-0613", + "gpt-4o-2024-05-13", }: tokens_per_message = 3 tokens_per_name = 1 @@ -96,6 +98,9 @@ def count_tokens(self, text: str | list[dict], model: Optional[str] = None) -> i elif "gpt-3.5-turbo" in model or "gpt-35-turbo" in model: logging.info("gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.") return self.count_tokens(text, model="gpt-3.5-turbo-0613") + elif "gpt-4o" in model: + logging.info("gpt-4o may update over time. Returning num tokens assuming gpt-4o-2024-05-13.") + return self.count_tokens(text, model="gpt-4o-2024-05-13") elif "gpt-4" in model: logging.info("gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.") return self.count_tokens(text, model="gpt-4-0613") diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index 60eeed091..a6df9330c 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -19,7 +19,7 @@ def test_to_dict(self, config): "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, - "model": "gpt-4", + "model": "gpt-4o", "organization": None, "response_format": None, "seed": None, @@ -72,7 +72,7 @@ def test_to_dict(self, config): "prompt_driver": { "base_url": None, "type": "OpenAiChatPromptDriver", - "model": "gpt-4", + "model": "gpt-4o", "organization": None, "response_format": None, "seed": None, @@ -98,7 +98,7 @@ def test_to_dict(self, config): "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, - "model": "gpt-4", + "model": "gpt-4o", "organization": None, "response_format": None, "seed": None, @@ -113,7 +113,7 @@ def test_to_dict(self, config): "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, - "model": "gpt-4", + "model": "gpt-4o", "organization": None, "response_format": None, "seed": None, @@ -129,7 +129,7 @@ def test_to_dict(self, config): "prompt_driver": { "type": "OpenAiChatPromptDriver", "base_url": None, - "model": "gpt-4", + "model": "gpt-4o", "organization": None, "response_format": None, "seed": None, From 6e1e84ff25418d70e4cc9bd3c9b9e19f847b4a23 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Wed, 15 May 2024 09:58:56 -0700 Subject: [PATCH 043/238] Update tiktoken to support GPT-4o (#783) --- poetry.lock | 79 ++++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/poetry.lock b/poetry.lock index 072338a59..14f5e2bff 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3292,6 +3292,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -3300,6 +3301,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -4691,47 +4694,47 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tiktoken" -version = "0.5.2" +version = "0.7.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false python-versions = ">=3.8" files = [ - {file = "tiktoken-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c4e654282ef05ec1bd06ead22141a9a1687991cef2c6a81bdd1284301abc71d"}, - {file = "tiktoken-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b3134aa24319f42c27718c6967f3c1916a38a715a0fa73d33717ba121231307"}, - {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6092e6e77730929c8c6a51bb0d7cfdf1b72b63c4d033d6258d1f2ee81052e9e5"}, - {file = "tiktoken-0.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ad8ae2a747622efae75837abba59be6c15a8f31b4ac3c6156bc56ec7a8e631"}, - {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51cba7c8711afa0b885445f0637f0fcc366740798c40b981f08c5f984e02c9d1"}, - {file = "tiktoken-0.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3d8c7d2c9313f8e92e987d585ee2ba0f7c40a0de84f4805b093b634f792124f5"}, - {file = "tiktoken-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:692eca18c5fd8d1e0dde767f895c17686faaa102f37640e884eecb6854e7cca7"}, - {file = "tiktoken-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:138d173abbf1ec75863ad68ca289d4da30caa3245f3c8d4bfb274c4d629a2f77"}, - {file = "tiktoken-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7388fdd684690973fdc450b47dfd24d7f0cbe658f58a576169baef5ae4658607"}, - {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a114391790113bcff670c70c24e166a841f7ea8f47ee2fe0e71e08b49d0bf2d4"}, - {file = "tiktoken-0.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca96f001e69f6859dd52926d950cfcc610480e920e576183497ab954e645e6ac"}, - {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:15fed1dd88e30dfadcdd8e53a8927f04e1f6f81ad08a5ca824858a593ab476c7"}, - {file = "tiktoken-0.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f8e692db5756f7ea8cb0cfca34638316dcf0841fb8469de8ed7f6a015ba0b0"}, - {file = "tiktoken-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:bcae1c4c92df2ffc4fe9f475bf8148dbb0ee2404743168bbeb9dcc4b79dc1fdd"}, - {file = "tiktoken-0.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b76a1e17d4eb4357d00f0622d9a48ffbb23401dcf36f9716d9bd9c8e79d421aa"}, - {file = "tiktoken-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01d8b171bb5df4035580bc26d4f5339a6fd58d06f069091899d4a798ea279d3e"}, - {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42adf7d4fb1ed8de6e0ff2e794a6a15005f056a0d83d22d1d6755a39bffd9e7f"}, - {file = "tiktoken-0.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3f894dbe0adb44609f3d532b8ea10820d61fdcb288b325a458dfc60fefb7db"}, - {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58ccfddb4e62f0df974e8f7e34a667981d9bb553a811256e617731bf1d007d19"}, - {file = "tiktoken-0.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58902a8bad2de4268c2a701f1c844d22bfa3cbcc485b10e8e3e28a050179330b"}, - {file = "tiktoken-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:5e39257826d0647fcac403d8fa0a474b30d02ec8ffc012cfaf13083e9b5e82c5"}, - {file = "tiktoken-0.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bde3b0fbf09a23072d39c1ede0e0821f759b4fa254a5f00078909158e90ae1f"}, - {file = "tiktoken-0.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ddee082dcf1231ccf3a591d234935e6acf3e82ee28521fe99af9630bc8d2a60"}, - {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35c057a6a4e777b5966a7540481a75a31429fc1cb4c9da87b71c8b75b5143037"}, - {file = "tiktoken-0.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c4a049b87e28f1dc60509f8eb7790bc8d11f9a70d99b9dd18dfdd81a084ffe6"}, - {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5bf5ce759089f4f6521ea6ed89d8f988f7b396e9f4afb503b945f5c949c6bec2"}, - {file = "tiktoken-0.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0c964f554af1a96884e01188f480dad3fc224c4bbcf7af75d4b74c4b74ae0125"}, - {file = "tiktoken-0.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:368dd5726d2e8788e47ea04f32e20f72a2012a8a67af5b0b003d1e059f1d30a3"}, - {file = "tiktoken-0.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2deef9115b8cd55536c0a02c0203512f8deb2447f41585e6d929a0b878a0dd2"}, - {file = "tiktoken-0.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ed7d380195affbf886e2f8b92b14edfe13f4768ff5fc8de315adba5b773815e"}, - {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76fce01309c8140ffe15eb34ded2bb94789614b7d1d09e206838fc173776a18"}, - {file = "tiktoken-0.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60a5654d6a2e2d152637dd9a880b4482267dfc8a86ccf3ab1cec31a8c76bfae8"}, - {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41d4d3228e051b779245a8ddd21d4336f8975563e92375662f42d05a19bdff41"}, - {file = "tiktoken-0.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c1cdec2c92fcde8c17a50814b525ae6a88e8e5b02030dc120b76e11db93f13"}, - {file = "tiktoken-0.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:84ddb36faedb448a50b246e13d1b6ee3437f60b7169b723a4b2abad75e914f3e"}, - {file = "tiktoken-0.5.2.tar.gz", hash = "sha256:f54c581f134a8ea96ce2023ab221d4d4d81ab614efa0b2fbce926387deb56c80"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, ] [package.dependencies] @@ -5389,4 +5392,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "7aa1485db323176c7b372efd3483d060c469d18fdf0c6ed172bb3a82d4ab238b" +content-hash = "032d9be0951a4048eb10716e492ea1f91e978ceb1ee24e5d13f3251f37cefb0a" diff --git a/pyproject.toml b/pyproject.toml index 105591208..65df87303 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ attrs = ">=22" jinja2 = ">=3.1.3" marshmallow = ">=3" marshmallow-enum = ">=1.5" -tiktoken = ">=0.3" +tiktoken = ">=0.7" rich = ">=13" schema = ">=0.7" pyyaml = ">=6" From 72e3022733d648f4cf1eb3545020838867cd423f Mon Sep 17 00:00:00 2001 From: Andrew French Date: Wed, 15 May 2024 10:42:24 -0700 Subject: [PATCH 044/238] Support case when model returns empty Actions list (#779) --- CHANGELOG.md | 1 + griptape/tasks/actions_subtask.py | 114 ++++++++++++----------- tests/unit/tasks/test_actions_subtask.py | 26 +++++- 3 files changed, 83 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2b9403b6..3c77efce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Type hint for parameter `azure_ad_token_provider` on Azure OpenAI drivers to `Optional[Callable[[], str]]`. - Missing parameters `azure_ad_token` and `azure_ad_token_provider` on the default client for `AzureOpenAiCompletionPromptDriver`. +- Standardize behavior between omitted and empty actions list when initializing `ActionsSubtask`. ## [0.24.2] - 2024-04-04 diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index 6ed1bff5d..ef2c2ce6f 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -198,69 +198,73 @@ def __init_from_prompt(self, value: str) -> None: if self.thought is None and len(thought_matches) > 0: self.thought = thought_matches[-1] - if len(actions_matches) > 0: - try: - data = actions_matches[-1] - actions_list: list = json.loads(data, strict=False) + self.__parse_actions(actions_matches) + # If there are no actions to take but an answer is provided, set the answer as the output. + if len(self.actions) == 0 and self.output is None and len(answer_matches) > 0: + self.output = TextArtifact(answer_matches[-1]) + + def __parse_actions(self, actions_matches: list[str]) -> None: + if len(actions_matches) == 0: + return + + try: + data = actions_matches[-1] + actions_list: list = json.loads(data, strict=False) + + if isinstance(self.origin_task, ActionsSubtaskOriginMixin): + self.origin_task.actions_schema().validate(actions_list) + + for action_object in actions_list: + # Load action name; throw exception if the key is not present + action_tag = action_object["tag"] + + # Load action name; throw exception if the key is not present + action_name = action_object["name"] + + # Load action method; throw exception if the key is not present + action_path = action_object["path"] + + # Load optional input value; don't throw exceptions if key is not present + if "input" in action_object: + # The schema library has a bug, where something like `Or(str, None)` doesn't get + # correctly translated into JSON schema. For some optional input fields LLMs sometimes + # still provide null value, which trips up the validator. The temporary solution that + # works is to strip all key-values where value is null. + action_input = remove_null_values_in_dict_recursively(action_object["input"]) + else: + action_input = {} + + # Load the action itself if isinstance(self.origin_task, ActionsSubtaskOriginMixin): - self.origin_task.actions_schema().validate(actions_list) - - if not actions_list: - raise schema.SchemaError("Array item count 0 is less than minimum count of 1.") - - for action_object in actions_list: - # Load action name; throw exception if the key is not present - action_tag = action_object["tag"] - - # Load action name; throw exception if the key is not present - action_name = action_object["name"] - - # Load action method; throw exception if the key is not present - action_path = action_object["path"] - - # Load optional input value; don't throw exceptions if key is not present - if "input" in action_object: - # The schema library has a bug, where something like `Or(str, None)` doesn't get - # correctly translated into JSON schema. For some optional input fields LLMs sometimes - # still provide null value, which trips up the validator. The temporary solution that - # works is to strip all key-values where value is null. - action_input = remove_null_values_in_dict_recursively(action_object["input"]) - else: - action_input = {} - - # Load the action itself - if isinstance(self.origin_task, ActionsSubtaskOriginMixin): - tool = self.origin_task.find_tool(action_name) - else: - raise Exception( - "ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin." - ) - - new_action = ActionsSubtask.Action( - tag=action_tag, name=action_name, path=action_path, input=action_input, tool=tool + tool = self.origin_task.find_tool(action_name) + else: + raise Exception( + "ActionSubtask must be attached to a Task that implements ActionSubtaskOriginMixin." ) - if new_action.tool: - if new_action.input: - self.__validate_action(new_action) + new_action = ActionsSubtask.Action( + tag=action_tag, name=action_name, path=action_path, input=action_input, tool=tool + ) - # Don't forget to add it to the subtask actions list! - self.actions.append(new_action) - except SyntaxError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") + if new_action.tool: + if new_action.input: + self.__validate_action(new_action) - self.actions.append(self.__error_to_action(f"syntax error: {e}")) - except schema.SchemaError as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") + # Don't forget to add it to the subtask actions list! + self.actions.append(new_action) + except SyntaxError as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nSyntax error: {e}") - self.actions.append(self.__error_to_action(f"Action JSON validation error: {e}")) - except Exception as e: - self.structure.logger.error(f"Subtask {self.origin_task.id}\nError parsing tool action: {e}") + self.actions.append(self.__error_to_action(f"syntax error: {e}")) + except schema.SchemaError as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nInvalid action JSON: {e}") - self.actions.append(self.__error_to_action(f"Action input parsing error: {e}")) - elif self.output is None and len(answer_matches) > 0: - self.output = TextArtifact(answer_matches[-1]) + self.actions.append(self.__error_to_action(f"Action JSON validation error: {e}")) + except Exception as e: + self.structure.logger.error(f"Subtask {self.origin_task.id}\nError parsing tool action: {e}") + + self.actions.append(self.__error_to_action(f"Action input parsing error: {e}")) def __error_to_action(self, error: str) -> Action: return ActionsSubtask.Action(tag="error", name="error", input={"error": error}) diff --git a/tests/unit/tasks/test_actions_subtask.py b/tests/unit/tasks/test_actions_subtask.py index a1e697346..8b231d85f 100644 --- a/tests/unit/tasks/test_actions_subtask.py +++ b/tests/unit/tasks/test_actions_subtask.py @@ -60,6 +60,16 @@ def test_with_no_action_input(self): assert json_dict[0].get("input") is None def test_no_actions(self): + valid_input = "Thought: need to test\n" "<|Response|>: test observation\n" "Answer: test output" + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(valid_input)) + json_dict = json.loads(subtask.actions_to_json()) + + assert len(json_dict) == 0 + + def test_empty_actions(self): valid_input = "Thought: need to test\n" "Actions: []\n" "<|Response|>: test observation\n" "Answer: test output" task = ToolkitTask(tools=[MockTool()]) @@ -67,7 +77,17 @@ def test_no_actions(self): subtask = task.add_subtask(ActionsSubtask(valid_input)) json_dict = json.loads(subtask.actions_to_json()) + assert len(json_dict) == 0 + + def test_invalid_actions(self): + invalid_input = ( + "Thought: need to test\n" "Actions: [{,{]\n" "<|Response|>: test observation\n" "Answer: test output" + ) + + task = ToolkitTask(tools=[MockTool()]) + Agent().add_task(task) + subtask = task.add_subtask(ActionsSubtask(invalid_input)) + json_dict = json.loads(subtask.actions_to_json()) + assert json_dict[0]["name"] == "error" - assert json_dict[0]["input"] == { - "error": "Action JSON validation error: Array item count 0 is less than minimum count of 1." - } + assert "Action input parsing error" in json_dict[0]["input"]["error"] From 3d4c58102946e912902553e79ac791e497352d0b Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Wed, 15 May 2024 20:37:46 +0200 Subject: [PATCH 045/238] Fix RedisVectorStoreDriver bugs (#782) --- CHANGELOG.md | 4 + .../drivers/vector-store-drivers.md | 2 +- .../vector/redis_vector_store_driver.py | 12 ++- .../vector/test_redis_vector_store_driver.py | 80 +++++++++++++++---- 4 files changed, 78 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c77efce5..c24f744c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Default behavior of OpenAiStructureConfig to utilize `gpt-4o` for prompt_driver. +### Fixed +- Honor `namespace` in `RedisVectorStoreDriver.query()`. +- Correctly set the `meta`, `score`, and `vector` fields of query result returned from `RedisVectorStoreDriver.query()`. + ## [0.25.1] - 2024-05-09 ### Added - Optional event batching on Event Listener Drivers. diff --git a/docs/griptape-framework/drivers/vector-store-drivers.md b/docs/griptape-framework/drivers/vector-store-drivers.md index e2e85d2c9..73a416c84 100644 --- a/docs/griptape-framework/drivers/vector-store-drivers.md +++ b/docs/griptape-framework/drivers/vector-store-drivers.md @@ -316,7 +316,7 @@ print(result) The format for creating a vector index should be similar to the following: ``` -FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA tag TAG vector VECTOR FLAT 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE +FT.CREATE idx:griptape ON hash PREFIX 1 "griptape:" SCHEMA namespace TAG vector VECTOR FLAT 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE ``` ## OpenSearch Vector Store Driver diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index db99725a3..3772818ab 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -64,6 +64,9 @@ def upsert_vector( mapping["vector"] = np.array(vector, dtype=np.float32).tobytes() mapping["vec_string"] = bytes_vector + if namespace: + mapping["namespace"] = namespace + if meta: mapping["metadata"] = json.dumps(meta) @@ -120,8 +123,9 @@ def query( vector = self.embedding_driver.embed_string(query) + filter_expression = f"(@namespace:{{{namespace}}})" if namespace else "*" query_expression = ( - Query(f"*=>[KNN {count or 10} @vector $vector as score]") + Query(f"{filter_expression}=>[KNN {count or 10} @vector $vector as score]") .sort_by("score") .return_fields("id", "score", "metadata", "vec_string") .paging(0, count or 10) @@ -134,15 +138,15 @@ def query( query_results = [] for document in results: - metadata = getattr(document, "metadata", None) + metadata = json.loads(document.metadata) if hasattr(document, "metadata") else None namespace = document.id.split(":")[0] if ":" in document.id else None vector_id = document.id.split(":")[1] if ":" in document.id else document.id - vector_float_list = json.loads(document["vec_string"]) if include_vectors else None + vector_float_list = json.loads(document.vec_string) if include_vectors else None query_results.append( BaseVectorStoreDriver.QueryResult( id=vector_id, vector=vector_float_list, - score=float(document["score"]), + score=float(document.score), meta=metadata, namespace=namespace, ) diff --git a/tests/unit/drivers/vector/test_redis_vector_store_driver.py b/tests/unit/drivers/vector/test_redis_vector_store_driver.py index b5dfa2832..3c98180e7 100644 --- a/tests/unit/drivers/vector/test_redis_vector_store_driver.py +++ b/tests/unit/drivers/vector/test_redis_vector_store_driver.py @@ -1,3 +1,4 @@ +from unittest.mock import MagicMock import pytest import redis from tests.mocks.mock_embedding_driver import MockEmbeddingDriver @@ -6,19 +7,21 @@ class TestRedisVectorStorageDriver: @pytest.fixture(autouse=True) - def mock_redis(self, mocker): - fake_hgetall_response = {b"vector": b"\x00\x00\x80?\x00\x00\x00@\x00\x00@@", b"metadata": b'{"foo": "bar"}'} + def mock_client(self, mocker): + return mocker.patch("redis.Redis").return_value - mocker.patch.object(redis.StrictRedis, "hset", return_value=None) - mocker.patch.object(redis.StrictRedis, "hgetall", return_value=fake_hgetall_response) - mocker.patch.object(redis.StrictRedis, "keys", return_value=[b"some_namespace:some_vector_id"]) - - fake_redisearch = mocker.MagicMock() - fake_redisearch.search = mocker.MagicMock(return_value=mocker.MagicMock(docs=[])) - fake_redisearch.info = mocker.MagicMock(side_effect=Exception("Index not found")) - fake_redisearch.create_index = mocker.MagicMock(return_value=None) + @pytest.fixture + def mock_keys(self, mock_client): + mock_client.keys.return_value = [b"some_vector_id"] + return mock_client.keys - mocker.patch.object(redis.StrictRedis, "ft", return_value=fake_redisearch) + @pytest.fixture + def mock_hgetall(self, mock_client): + mock_client.hgetall.return_value = { + b"vector": b"\x00\x00\x80?\x00\x00\x00@\x00\x00@@", + b"metadata": b'{"foo": "bar"}', + } + return mock_client.hgetall @pytest.fixture def driver(self): @@ -26,23 +29,70 @@ def driver(self): host="localhost", port=6379, index="test_index", db=0, embedding_driver=MockEmbeddingDriver() ) + @pytest.fixture + def mock_search(self, mock_client): + mock_client.ft.return_value.search.return_value.docs = [ + MagicMock( + id="some_namespace:some_vector_id", + score="0.456198036671", + metadata='{"foo": "bar"}', + vec_string="[1.0, 2.0, 3.0]", + ) + ] + return mock_client.ft.return_value.search + def test_upsert_vector(self, driver): assert ( driver.upsert_vector([1.0, 2.0, 3.0], vector_id="some_vector_id", namespace="some_namespace") == "some_vector_id" ) - def test_load_entry(self, driver): + def test_load_entry(self, driver, mock_hgetall): + entry = driver.load_entry("some_vector_id") + mock_hgetall.assert_called_once_with("some_vector_id") + assert entry.id == "some_vector_id" + assert entry.vector == [1.0, 2.0, 3.0] + assert entry.meta == {"foo": "bar"} + + def test_load_entry_with_namespace(self, driver, mock_hgetall): entry = driver.load_entry("some_vector_id", namespace="some_namespace") + mock_hgetall.assert_called_once_with("some_namespace:some_vector_id") assert entry.id == "some_vector_id" assert entry.vector == [1.0, 2.0, 3.0] assert entry.meta == {"foo": "bar"} - def test_load_entries(self, driver): + def test_load_entries(self, driver, mock_keys, mock_hgetall): + entries = driver.load_entries() + mock_keys.assert_called_once_with("*") + mock_hgetall.assert_called_once_with("some_vector_id") + assert len(entries) == 1 + assert entries[0].vector == [1.0, 2.0, 3.0] + assert entries[0].meta == {"foo": "bar"} + + def test_load_entries_with_namespace(self, driver, mock_keys, mock_hgetall): entries = driver.load_entries(namespace="some_namespace") + mock_keys.assert_called_once_with("some_namespace:*") + mock_hgetall.assert_called_once_with("some_namespace:some_vector_id") assert len(entries) == 1 assert entries[0].vector == [1.0, 2.0, 3.0] assert entries[0].meta == {"foo": "bar"} - def test_query(self, driver): - assert driver.query("some_vector_id") == [] + def test_query(self, driver, mock_search): + results = driver.query("Some query") + mock_search.assert_called_once() + assert len(results) == 1 + assert results[0].namespace == "some_namespace" + assert results[0].id == "some_vector_id" + assert results[0].score == 0.456198036671 + assert results[0].meta == {"foo": "bar"} + assert results[0].vector is None + + def test_query_with_include_vectors(self, driver, mock_search): + results = driver.query("Some query", include_vectors=True) + mock_search.assert_called_once() + assert len(results) == 1 + assert results[0].namespace == "some_namespace" + assert results[0].id == "some_vector_id" + assert results[0].score == 0.456198036671 + assert results[0].meta == {"foo": "bar"} + assert results[0].vector == [1.0, 2.0, 3.0] From 44a2c62a6d6dd35f1c12eeedd2be3fc6d6df447e Mon Sep 17 00:00:00 2001 From: Andrew French Date: Wed, 15 May 2024 13:44:18 -0700 Subject: [PATCH 046/238] Text to Speech Support (#755) --- .github/workflows/docs-integration-tests.yml | 1 + docs/griptape-framework/data/artifacts.md | 6 +- .../drivers/text-to-speech-drivers.md | 54 +++ .../engines/audio-engines.md | 29 ++ .../official-tools/text-to-speech-client.md | 27 ++ griptape/artifacts/__init__.py | 4 +- griptape/artifacts/audio_artifact.py | 12 + .../config/structure_global_drivers_config.py | 5 + griptape/drivers/__init__.py | 9 + griptape/drivers/text_to_speech/__init__.py | 0 .../base_text_to_speech_driver.py | 44 +++ .../dummy_text_to_speech_driver.py | 13 + .../elevenlabs_text_to_speech_driver.py | 42 +++ .../openai_text_to_speech_driver.py | 36 ++ griptape/engines/__init__.py | 2 + griptape/engines/audio/__init__.py | 0 .../engines/audio/text_to_speech_engine.py | 14 + griptape/events/__init__.py | 7 +- .../events/base_image_generation_event.py | 4 +- .../events/base_media_generation_event.py | 9 + griptape/events/base_text_to_speech_event.py | 10 + .../events/finish_text_to_speech_event.py | 11 + griptape/events/start_text_to_speech_event.py | 10 + griptape/mixins/__init__.py | 4 +- ...py => media_artifact_file_output_mixin.py} | 6 +- griptape/tasks/__init__.py | 4 + griptape/tasks/base_audio_generation_task.py | 17 + griptape/tasks/base_image_generation_task.py | 8 +- .../tasks/prompt_image_generation_task.py | 2 +- griptape/tasks/text_to_speech_task.py | 56 +++ .../tool.py | 4 +- .../tool.py | 4 +- .../prompt_image_generation_client/tool.py | 4 +- .../tools/text_to_speech_client/__init__.py | 0 .../tools/text_to_speech_client/manifest.yml | 5 + griptape/tools/text_to_speech_client/tool.py | 41 +++ .../variation_image_generation_client/tool.py | 4 +- mkdocs.yml | 4 + poetry.lock | 330 +++++++++++++++++- pyproject.toml | 2 + tests/unit/artifacts/test_audio_artifact.py | 34 ++ .../test_amazon_bedrock_structure_config.py | 1 + .../config/test_anthropic_structure_config.py | 1 + .../config/test_google_structure_config.py | 1 + .../config/test_openai_structure_config.py | 1 + tests/unit/config/test_structure_config.py | 1 + tests/unit/drivers/text_to_speech/__init__.py | 0 ...test_elevenlabs_audio_generation_driver.py | 20 ++ .../test_image_artifact_file_output_mixin.py | 12 +- tests/unit/tasks/test_text_to_speech_task.py | 30 ++ .../unit/tools/test_text_to_speech_client.py | 40 +++ 51 files changed, 954 insertions(+), 31 deletions(-) create mode 100644 docs/griptape-framework/drivers/text-to-speech-drivers.md create mode 100644 docs/griptape-framework/engines/audio-engines.md create mode 100644 docs/griptape-tools/official-tools/text-to-speech-client.md create mode 100644 griptape/artifacts/audio_artifact.py create mode 100644 griptape/drivers/text_to_speech/__init__.py create mode 100644 griptape/drivers/text_to_speech/base_text_to_speech_driver.py create mode 100644 griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py create mode 100644 griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py create mode 100644 griptape/drivers/text_to_speech/openai_text_to_speech_driver.py create mode 100644 griptape/engines/audio/__init__.py create mode 100644 griptape/engines/audio/text_to_speech_engine.py create mode 100644 griptape/events/base_media_generation_event.py create mode 100644 griptape/events/base_text_to_speech_event.py create mode 100644 griptape/events/finish_text_to_speech_event.py create mode 100644 griptape/events/start_text_to_speech_event.py rename griptape/mixins/{image_artifact_file_output_mixin.py => media_artifact_file_output_mixin.py} (89%) create mode 100644 griptape/tasks/base_audio_generation_task.py create mode 100644 griptape/tasks/text_to_speech_task.py create mode 100644 griptape/tools/text_to_speech_client/__init__.py create mode 100644 griptape/tools/text_to_speech_client/manifest.yml create mode 100644 griptape/tools/text_to_speech_client/tool.py create mode 100644 tests/unit/artifacts/test_audio_artifact.py create mode 100644 tests/unit/drivers/text_to_speech/__init__.py create mode 100644 tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py create mode 100644 tests/unit/tasks/test_text_to_speech_task.py create mode 100644 tests/unit/tools/test_text_to_speech_client.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 2f1dba285..14051de7f 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -100,6 +100,7 @@ jobs: GT_CLOUD_STRUCTURE_RUN_ID: ${{ secrets.INTEG_GT_CLOUD_STRUCTURE_RUN_ID }} AWS_IOT_CORE_ENDPOINT: ${{ secrets.INTEG_AWS_IOT_CORE_ENDPOINT }} AWS_IOT_CORE_TOPIC: ${{ secrets.INTEG_AWS_IOT_CORE_TOPIC }} + ELEVEN_LABS_API_KEY: ${{ secrets.INTEG_ELEVEN_LABS_API_KEY }} services: postgres: image: ankane/pgvector:v0.5.0 diff --git a/docs/griptape-framework/data/artifacts.md b/docs/griptape-framework/data/artifacts.md index b12dc97d3..18d5cb61f 100644 --- a/docs/griptape-framework/data/artifacts.md +++ b/docs/griptape-framework/data/artifacts.md @@ -35,4 +35,8 @@ Each blob has a [name](../../reference/griptape/artifacts/base_artifact.md#gript ## ImageArtifact -An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an ImageArtifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blobartifact). +An [ImageArtifact](../../reference/griptape/artifacts/image_artifact.md) is used for passing images back to the LLM. In addition to binary image data, an Image Artifact includes image metadata like MIME type, dimensions, and prompt and model information for images returned by [image generation Drivers](../drivers/image-generation-drivers.md). It inherits from [BlobArtifact](#blobartifact). + +## AudioArtifact + +An [AudioArtifact](../../reference/griptape/artifacts/audio_artifact.md) allows the Framework to interact with audio content. An Audio Artifact includes binary audio content as well as metadata like format, duration, and prompt and model information for audio returned generative models. It inherits from [BlobArtifact](#blobartifact). diff --git a/docs/griptape-framework/drivers/text-to-speech-drivers.md b/docs/griptape-framework/drivers/text-to-speech-drivers.md new file mode 100644 index 000000000..a37d4d33e --- /dev/null +++ b/docs/griptape-framework/drivers/text-to-speech-drivers.md @@ -0,0 +1,54 @@ +## Overview + +[Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md) are used by [Text To Speech Engines](../engines/audio-engines.md) to build and execute API calls to audio generation models. + +Provide a Driver when building an [Engine](../engines/audio-engines.md), then pass it to a [Tool](../tools/index.md) for use by an [Agent](../structures/agents.md): + +### Eleven Labs + +The [Eleven Labs Text to Speech Driver](../../reference/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.md) provides support for text-to-speech models hosted by Eleven Labs. This Driver supports configurations specific to Eleven Labs, like voice selection and output format. + +```python +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.structures import Agent + + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.getenv("ELEVEN_LABS_API_KEY"), + model="eleven_multilingual_v2", + voice="Matilda", +) + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") +``` + +## OpenAI + +The [OpenAI Text to Speech Driver](../../reference/griptape/drivers/text_to_speech/openai_text_to_speech_driver.md) provides support for text-to-speech models hosted by OpenAI. This Driver supports configurations specific to OpenAI, like voice selection and output format. + +```python +from griptape.drivers import OpenAiTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.structures import Agent + +driver = OpenAiTextToSpeechDriver() + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") +``` diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md new file mode 100644 index 000000000..514b8dd8f --- /dev/null +++ b/docs/griptape-framework/engines/audio-engines.md @@ -0,0 +1,29 @@ +## Overview + +[Audio Generation Engines](../../reference/griptape/engines/audio/index.md) facilitate audio generation. Audio Generation Engines provides a `run` method that accepts the necessary inputs for its particular mode and provides the request to the configured [Driver](../drivers/text-to-speech-drivers.md). + +### Text to Speech Engine + +This Engine facilitates synthesizing speech from text inputs. + +```python +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine + + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.getenv("ELEVEN_LABS_API_KEY"), + model="eleven_multilingual_v2", + voice="Rachel", +) + +engine = TextToSpeechEngine( + text_to_speech_driver=driver, +) + +engine.run( + prompts=["Hello, world!"], +) +``` diff --git a/docs/griptape-tools/official-tools/text-to-speech-client.md b/docs/griptape-tools/official-tools/text-to-speech-client.md new file mode 100644 index 000000000..f016db551 --- /dev/null +++ b/docs/griptape-tools/official-tools/text-to-speech-client.md @@ -0,0 +1,27 @@ +# TextToSpeechClient + +This tool enables LLMs to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). + +```python +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient +from griptape.structures import Agent + + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.getenv("ELEVEN_LABS_API_KEY"), + model="eleven_multilingual_v2", + voice="Matilda", +) + +tool = TextToSpeechClient( + engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Agent(tools=[tool]).run("Generate audio from this text: 'Hello, world!'") +``` \ No newline at end of file diff --git a/griptape/artifacts/__init__.py b/griptape/artifacts/__init__.py index f97580db1..e57177ac4 100644 --- a/griptape/artifacts/__init__.py +++ b/griptape/artifacts/__init__.py @@ -7,6 +7,7 @@ from .list_artifact import ListArtifact from .media_artifact import MediaArtifact from .image_artifact import ImageArtifact +from .audio_artifact import AudioArtifact __all__ = [ @@ -17,6 +18,7 @@ "BlobArtifact", "CsvRowArtifact", "ListArtifact", - "ImageArtifact", "MediaArtifact", + "ImageArtifact", + "AudioArtifact", ] diff --git a/griptape/artifacts/audio_artifact.py b/griptape/artifacts/audio_artifact.py new file mode 100644 index 000000000..b6d4667e4 --- /dev/null +++ b/griptape/artifacts/audio_artifact.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from attr import define + +from griptape.artifacts import MediaArtifact + + +@define +class AudioArtifact(MediaArtifact): + """AudioArtifact is a type of MediaArtifact representing audio.""" + + media_type: str = "audio" diff --git a/griptape/config/structure_global_drivers_config.py b/griptape/config/structure_global_drivers_config.py index b3e2e879f..b599039a2 100644 --- a/griptape/config/structure_global_drivers_config.py +++ b/griptape/config/structure_global_drivers_config.py @@ -14,7 +14,9 @@ DummyPromptDriver, DummyImageQueryDriver, BaseImageQueryDriver, + BaseTextToSpeechDriver, ) +from griptape.drivers.text_to_speech.dummy_text_to_speech_driver import DummyTextToSpeechDriver from griptape.mixins.serializable_mixin import SerializableMixin @@ -38,3 +40,6 @@ class StructureGlobalDriversConfig(SerializableMixin): conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( default=None, kw_only=True, metadata={"serializable": True} ) + text_to_speech_driver: BaseTextToSpeechDriver = field( + default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True} + ) diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 999cacfb5..fdc5cdb59 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -96,6 +96,11 @@ from .file_manager.local_file_manager_driver import LocalFileManagerDriver from .file_manager.amazon_s3_file_manager_driver import AmazonS3FileManagerDriver +from .text_to_speech.base_text_to_speech_driver import BaseTextToSpeechDriver +from .text_to_speech.dummy_text_to_speech_driver import DummyTextToSpeechDriver +from .text_to_speech.elevenlabs_text_to_speech_driver import ElevenLabsTextToSpeechDriver +from .text_to_speech.openai_text_to_speech_driver import OpenAiTextToSpeechDriver + from .structure_run.base_structure_run_driver import BaseStructureRunDriver from .structure_run.griptape_cloud_structure_run_driver import GriptapeCloudStructureRunDriver from .structure_run.local_structure_run_driver import LocalStructureRunDriver @@ -183,6 +188,10 @@ "BaseFileManagerDriver", "LocalFileManagerDriver", "AmazonS3FileManagerDriver", + "BaseTextToSpeechDriver", + "DummyTextToSpeechDriver", + "ElevenLabsTextToSpeechDriver", + "OpenAiTextToSpeechDriver", "BaseStructureRunDriver", "GriptapeCloudStructureRunDriver", "LocalStructureRunDriver", diff --git a/griptape/drivers/text_to_speech/__init__.py b/griptape/drivers/text_to_speech/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py new file mode 100644 index 000000000..58a911b1a --- /dev/null +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional + +from attr import define, field + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent +from griptape.events.start_text_to_speech_event import StartTextToSpeechEvent +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin + +if TYPE_CHECKING: + from griptape.structures import Structure + + +@define +class BaseTextToSpeechDriver(SerializableMixin, ExponentialBackoffMixin, ABC): + model: str = field(kw_only=True, metadata={"serializable": True}) + structure: Optional[Structure] = field(default=None, kw_only=True) + + def before_run(self, prompts: list[str]) -> None: + if self.structure: + self.structure.publish_event(StartTextToSpeechEvent(prompts=prompts)) + + def after_run(self) -> None: + if self.structure: + self.structure.publish_event(FinishTextToSpeechEvent()) + + def run_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + for attempt in self.retrying(): + with attempt: + self.before_run(prompts) + result = self.try_text_to_audio(prompts) + self.after_run() + + return result + + else: + raise Exception("Failed to run text to audio generation") + + @abstractmethod + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + ... diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py new file mode 100644 index 000000000..03adc10ce --- /dev/null +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -0,0 +1,13 @@ +from typing import Optional +from attrs import define, field +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.drivers import BaseTextToSpeechDriver +from griptape.exceptions import DummyException + + +@define +class DummyTextToSpeechDriver(BaseTextToSpeechDriver): + model: str = field(init=False) + + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + raise DummyException(__class__.__name__, "try_text_to_audio") diff --git a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py new file mode 100644 index 000000000..c3aeefd26 --- /dev/null +++ b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional, Any + +from attr import define, field, Factory + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.drivers import BaseTextToSpeechDriver +from griptape.utils import import_optional_dependency + +if TYPE_CHECKING: + from elevenlabs.client import ElevenLabs + + +@define +class ElevenLabsTextToSpeechDriver(BaseTextToSpeechDriver): + api_key: str = field(kw_only=True, metadata={"serializable": True}) + client: Any = field( + default=Factory( + lambda self: import_optional_dependency("elevenlabs.client").ElevenLabs(api_key=self.api_key), + takes_self=True, + ), + kw_only=True, + metadata={"serializable": True}, + ) + voice: str = field(kw_only=True, metadata={"serializable": True}) + output_format: str = field(default="mp3_44100_128", kw_only=True, metadata={"serializable": True}) + + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + audio = self.client.generate( + text=". ".join(prompts), voice=self.voice, model=self.model, output_format=self.output_format + ) + + content = b"" + for chunk in audio: + content += chunk + + # All ElevenLabs audio format strings have the following structure: + # {format}_{sample_rate}_{bitrate} + artifact_format = self.output_format.split("_")[0] + + return AudioArtifact(value=content, format=artifact_format) diff --git a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py new file mode 100644 index 000000000..e6022b29d --- /dev/null +++ b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from typing import Optional, Literal + +import openai +from attr import define, field, Factory + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.drivers import BaseTextToSpeechDriver + + +@define +class OpenAiTextToSpeechDriver(BaseTextToSpeechDriver): + model: str = field(default="tts-1", kw_only=True, metadata={"serializable": True}) + voice: Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"] = field( + default="alloy", kw_only=True, metadata={"serializable": True} + ) + format: Literal["mp3", "opus", "aac", "flac"] = field(default="mp3", kw_only=True, metadata={"serializable": True}) + api_type: str = field(default=openai.api_type, kw_only=True) + api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) + base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True) + organization: Optional[str] = field(default=openai.organization, kw_only=True, metadata={"serializable": True}) + client: openai.OpenAI = field( + default=Factory( + lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), + takes_self=True, + ) + ) + + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: + response = self.client.audio.speech.create( + input=". ".join(prompts), voice=self.voice, model=self.model, response_format=self.format + ) + + return AudioArtifact(value=response.content, format=self.format) diff --git a/griptape/engines/__init__.py b/griptape/engines/__init__.py index 0f1bc9b4e..f76e373ef 100644 --- a/griptape/engines/__init__.py +++ b/griptape/engines/__init__.py @@ -11,6 +11,7 @@ from .image.inpainting_image_generation_engine import InpaintingImageGenerationEngine from .image.outpainting_image_generation_engine import OutpaintingImageGenerationEngine from .image_query.image_query_engine import ImageQueryEngine +from .audio.text_to_speech_engine import TextToSpeechEngine __all__ = [ "BaseQueryEngine", @@ -26,4 +27,5 @@ "InpaintingImageGenerationEngine", "OutpaintingImageGenerationEngine", "ImageQueryEngine", + "TextToSpeechEngine", ] diff --git a/griptape/engines/audio/__init__.py b/griptape/engines/audio/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py new file mode 100644 index 000000000..29118848e --- /dev/null +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from attr import define, field + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.drivers import BaseTextToSpeechDriver + + +@define +class TextToSpeechEngine: + text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True) + + def run(self, prompts: list[str], *args, **kwargs) -> AudioArtifact: + return self.text_to_speech_driver.try_text_to_audio(prompts=prompts) diff --git a/griptape/events/__init__.py b/griptape/events/__init__.py index bc9fb466c..0aa4552dd 100644 --- a/griptape/events/__init__.py +++ b/griptape/events/__init__.py @@ -16,7 +16,9 @@ from .finish_image_generation_event import FinishImageGenerationEvent from .start_image_query_event import StartImageQueryEvent from .finish_image_query_event import FinishImageQueryEvent - +from .base_text_to_speech_event import BaseTextToSpeechEvent +from .start_text_to_speech_event import StartTextToSpeechEvent +from .finish_text_to_speech_event import FinishTextToSpeechEvent __all__ = [ "BaseEvent", @@ -37,4 +39,7 @@ "FinishImageGenerationEvent", "StartImageQueryEvent", "FinishImageQueryEvent", + "BaseTextToSpeechEvent", + "StartTextToSpeechEvent", + "FinishTextToSpeechEvent", ] diff --git a/griptape/events/base_image_generation_event.py b/griptape/events/base_image_generation_event.py index ee51a77a2..244310469 100644 --- a/griptape/events/base_image_generation_event.py +++ b/griptape/events/base_image_generation_event.py @@ -1,9 +1,9 @@ from __future__ import annotations from attrs import define from abc import ABC -from .base_event import BaseEvent +from .base_media_generation_event import BaseMediaGenerationEvent @define -class BaseImageGenerationEvent(BaseEvent, ABC): +class BaseImageGenerationEvent(BaseMediaGenerationEvent, ABC): ... diff --git a/griptape/events/base_media_generation_event.py b/griptape/events/base_media_generation_event.py new file mode 100644 index 000000000..b3a9bcb33 --- /dev/null +++ b/griptape/events/base_media_generation_event.py @@ -0,0 +1,9 @@ +from __future__ import annotations +from attrs import define +from abc import ABC +from .base_event import BaseEvent + + +@define +class BaseMediaGenerationEvent(BaseEvent, ABC): + ... diff --git a/griptape/events/base_text_to_speech_event.py b/griptape/events/base_text_to_speech_event.py new file mode 100644 index 000000000..f4d032d0d --- /dev/null +++ b/griptape/events/base_text_to_speech_event.py @@ -0,0 +1,10 @@ +from __future__ import annotations +from attrs import define +from abc import ABC + +from griptape.events.base_media_generation_event import BaseMediaGenerationEvent + + +@define +class BaseTextToSpeechEvent(BaseMediaGenerationEvent, ABC): + ... diff --git a/griptape/events/finish_text_to_speech_event.py b/griptape/events/finish_text_to_speech_event.py new file mode 100644 index 000000000..6b4366c88 --- /dev/null +++ b/griptape/events/finish_text_to_speech_event.py @@ -0,0 +1,11 @@ +from __future__ import annotations + +from attrs import define + +from .base_text_to_speech_event import BaseTextToSpeechEvent +from .base_image_generation_event import BaseImageGenerationEvent + + +@define +class FinishTextToSpeechEvent(BaseTextToSpeechEvent): + ... diff --git a/griptape/events/start_text_to_speech_event.py b/griptape/events/start_text_to_speech_event.py new file mode 100644 index 000000000..9824a9827 --- /dev/null +++ b/griptape/events/start_text_to_speech_event.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from attr import define, field + +from .base_text_to_speech_event import BaseTextToSpeechEvent + + +@define +class StartTextToSpeechEvent(BaseTextToSpeechEvent): + prompts: list[str] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/mixins/__init__.py b/griptape/mixins/__init__.py index 383e6183b..d9eea53c2 100644 --- a/griptape/mixins/__init__.py +++ b/griptape/mixins/__init__.py @@ -3,13 +3,13 @@ from .actions_subtask_origin_mixin import ActionsSubtaskOriginMixin from .rule_mixin import RuleMixin from .serializable_mixin import SerializableMixin -from .image_artifact_file_output_mixin import ImageArtifactFileOutputMixin +from .media_artifact_file_output_mixin import BlobArtifactFileOutputMixin __all__ = [ "ActivityMixin", "ExponentialBackoffMixin", "ActionsSubtaskOriginMixin", "RuleMixin", - "ImageArtifactFileOutputMixin", + "BlobArtifactFileOutputMixin", "SerializableMixin", ] diff --git a/griptape/mixins/image_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py similarity index 89% rename from griptape/mixins/image_artifact_file_output_mixin.py rename to griptape/mixins/media_artifact_file_output_mixin.py index b1511582d..d7d6f584c 100644 --- a/griptape/mixins/image_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -7,11 +7,11 @@ from typing import Optional if TYPE_CHECKING: - from griptape.artifacts import ImageArtifact + from griptape.artifacts import BlobArtifact @define(slots=False) -class ImageArtifactFileOutputMixin: +class BlobArtifactFileOutputMixin: output_dir: Optional[str] = field(default=None, kw_only=True) output_file: Optional[str] = field(default=None, kw_only=True) @@ -31,7 +31,7 @@ def validate_output_file(self, _, output_file: str) -> None: if self.output_dir: raise ValueError("Can't have both output_dir and output_file specified.") - def _write_to_file(self, artifact: ImageArtifact) -> None: + def _write_to_file(self, artifact: BlobArtifact) -> None: if self.output_file: outfile = self.output_file elif self.output_dir: diff --git a/griptape/tasks/__init__.py b/griptape/tasks/__init__.py index 5d8dac58e..e51335241 100644 --- a/griptape/tasks/__init__.py +++ b/griptape/tasks/__init__.py @@ -17,6 +17,8 @@ from .outpainting_image_generation_task import OutpaintingImageGenerationTask from .variation_image_generation_task import VariationImageGenerationTask from .image_query_task import ImageQueryTask +from .base_audio_generation_task import BaseAudioGenerationTask +from .text_to_speech_task import TextToSpeechTask from .structure_run_task import StructureRunTask __all__ = [ @@ -39,5 +41,7 @@ "InpaintingImageGenerationTask", "OutpaintingImageGenerationTask", "ImageQueryTask", + "BaseAudioGenerationTask", + "TextToSpeechTask", "StructureRunTask", ] diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py new file mode 100644 index 000000000..f9d691768 --- /dev/null +++ b/griptape/tasks/base_audio_generation_task.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +import os +from abc import ABC + +from attr import field, define + +from griptape.artifacts import MediaArtifact +from griptape.loaders import ImageLoader +from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin +from griptape.rules import Ruleset, Rule +from griptape.tasks import BaseTask + + +@define +class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): + ... diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index b72c33968..2dbab4ce9 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -5,15 +5,15 @@ from attr import field, define -from griptape.artifacts import ImageArtifact +from griptape.artifacts import MediaArtifact from griptape.loaders import ImageLoader -from griptape.mixins import RuleMixin, ImageArtifactFileOutputMixin +from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin from griptape.rules import Ruleset, Rule from griptape.tasks import BaseTask @define -class BaseImageGenerationTask(ImageArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): +class BaseImageGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): """Provides a base class for image generation-related tasks. Attributes: @@ -55,7 +55,7 @@ def all_negative_rulesets(self) -> list[Ruleset]: return task_rulesets - def _read_from_file(self, path: str) -> ImageArtifact: + def _read_from_file(self, path: str) -> MediaArtifact: self.structure.logger.info(f"Reading image from {os.path.abspath(path)}") with open(path, "rb") as file: return ImageLoader().load(file.read()) diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 7d9bad53e..24971d1cb 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field, Factory +from attr import define, field from griptape.engines import PromptImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py new file mode 100644 index 000000000..ab90b1bbb --- /dev/null +++ b/griptape/tasks/text_to_speech_task.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +from typing import Callable + +from attr import define, field + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.engines import TextToSpeechEngine +from griptape.artifacts import TextArtifact +from griptape.tasks import BaseTask +from griptape.tasks.base_audio_generation_task import BaseAudioGenerationTask +from griptape.utils import J2 + + +@define +class TextToSpeechTask(BaseAudioGenerationTask): + DEFAULT_INPUT_TEMPLATE = "{{ args[0] }}" + + _input: str | TextArtifact | Callable[[BaseTask], TextArtifact] = field(default=DEFAULT_INPUT_TEMPLATE) + _text_to_speech_engine: TextToSpeechEngine = field(default=None, kw_only=True, alias="text_to_speech_engine") + + @property + def input(self) -> TextArtifact: + if isinstance(self._input, TextArtifact): + return self._input + elif isinstance(self._input, Callable): + return self._input(self) + else: + return TextArtifact(J2().render_from_string(self._input, **self.full_context)) + + @input.setter + def input(self, value: TextArtifact) -> None: + self._input = value + + @property + def text_to_speech_engine(self) -> TextToSpeechEngine: + if self._text_to_speech_engine is None: + if self.structure is not None: + self._text_to_speech_engine = TextToSpeechEngine( + text_to_speech_driver=self.structure.config.global_drivers.text_to_speech_driver + ) + else: + raise ValueError("Audio Generation Engine is not set.") + return self._text_to_speech_engine + + @text_to_speech_engine.setter + def text_to_speech_engine(self, value: TextToSpeechEngine) -> None: + self._text_to_speech_engine = value + + def run(self) -> AudioArtifact: + audio_artifact = self.text_to_speech_engine.run(prompts=[self.input.to_text()], rulesets=self.all_rulesets) + + if self.output_dir or self.output_file: + self._write_to_file(audio_artifact) + + return audio_artifact diff --git a/griptape/tools/inpainting_image_generation_client/tool.py b/griptape/tools/inpainting_image_generation_client/tool.py index b9130ca3e..02799ad29 100644 --- a/griptape/tools/inpainting_image_generation_client/tool.py +++ b/griptape/tools/inpainting_image_generation_client/tool.py @@ -8,14 +8,14 @@ from griptape.artifacts import ErrorArtifact, ImageArtifact from griptape.engines import InpaintingImageGenerationEngine from griptape.loaders import ImageLoader -from griptape.mixins import ImageArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @define -class InpaintingImageGenerationClient(ImageArtifactFileOutputMixin, BaseTool): +class InpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): """A tool that can be used to generate prompted inpaintings of an image. Attributes: diff --git a/griptape/tools/outpainting_image_generation_client/tool.py b/griptape/tools/outpainting_image_generation_client/tool.py index 2ce2697d4..bd9a2125c 100644 --- a/griptape/tools/outpainting_image_generation_client/tool.py +++ b/griptape/tools/outpainting_image_generation_client/tool.py @@ -10,12 +10,12 @@ from griptape.loaders import ImageLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import ImageArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @define -class OutpaintingImageGenerationClient(ImageArtifactFileOutputMixin, BaseTool): +class OutpaintingImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): """A tool that can be used to generate prompted outpaintings of an image. Attributes: diff --git a/griptape/tools/prompt_image_generation_client/tool.py b/griptape/tools/prompt_image_generation_client/tool.py index b9a26af67..50020a1ea 100644 --- a/griptape/tools/prompt_image_generation_client/tool.py +++ b/griptape/tools/prompt_image_generation_client/tool.py @@ -7,11 +7,11 @@ from griptape.engines import PromptImageGenerationEngine from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import ImageArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin @define -class PromptImageGenerationClient(ImageArtifactFileOutputMixin, BaseTool): +class PromptImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): """A tool that can be used to generate an image from a text prompt. Attributes: diff --git a/griptape/tools/text_to_speech_client/__init__.py b/griptape/tools/text_to_speech_client/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/text_to_speech_client/manifest.yml b/griptape/tools/text_to_speech_client/manifest.yml new file mode 100644 index 000000000..73062bb13 --- /dev/null +++ b/griptape/tools/text_to_speech_client/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Text to Speech Client +description: A tool for generating speech from text. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/text_to_speech_client/tool.py b/griptape/tools/text_to_speech_client/tool.py new file mode 100644 index 000000000..9f8c36a81 --- /dev/null +++ b/griptape/tools/text_to_speech_client/tool.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +from typing import Any + +from attrs import define, field +from schema import Schema, Literal + +from griptape.artifacts import ErrorArtifact, AudioArtifact +from griptape.engines import TextToSpeechEngine +from griptape.tools import BaseTool +from griptape.utils.decorators import activity +from griptape.mixins import BlobArtifactFileOutputMixin + + +@define +class TextToSpeechClient(BlobArtifactFileOutputMixin, BaseTool): + """A tool that can be used to generate speech from input text. + + Attributes: + engine: The text to audio generation engine used to generate the speech audio. + output_dir: If provided, the generated audio will be written to disk in output_dir. + output_file: If provided, the generated audio will be written to disk as output_file. + """ + + engine: TextToSpeechEngine = field(kw_only=True) + + @activity( + config={ + "description": "Can be used to generate speech from the provided input text.", + "schema": Schema({Literal("text", description="The literal text to be converted to speech."): str}), + } + ) + def text_to_speech(self, params: dict[str, Any]) -> AudioArtifact | ErrorArtifact: + text = params["values"]["text"] + + output_artifact = self.engine.run(prompts=[text]) + + if self.output_dir or self.output_file: + self._write_to_file(output_artifact) + + return output_artifact diff --git a/griptape/tools/variation_image_generation_client/tool.py b/griptape/tools/variation_image_generation_client/tool.py index a67b87750..4d0d0537e 100644 --- a/griptape/tools/variation_image_generation_client/tool.py +++ b/griptape/tools/variation_image_generation_client/tool.py @@ -10,12 +10,12 @@ from griptape.loaders import ImageLoader from griptape.tools import BaseTool from griptape.utils.decorators import activity -from griptape.mixins import ImageArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin from griptape.utils.load_artifact_from_memory import load_artifact_from_memory @define -class VariationImageGenerationClient(ImageArtifactFileOutputMixin, BaseTool): +class VariationImageGenerationClient(BlobArtifactFileOutputMixin, BaseTool): """A tool that can be used to generate prompted variations of an image. Attributes: diff --git a/mkdocs.yml b/mkdocs.yml index f5f0dc954..df2a1536c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -97,6 +97,7 @@ nav: - Summary Engines: "griptape-framework/engines/summary-engines.md" - Image Generation Engines: "griptape-framework/engines/image-generation-engines.md" - Image Query Engines: "griptape-framework/engines/image-query-engines.md" + - Audio Engines: "griptape-framework/engines/audio-engines.md" - Drivers: - Prompt Drivers: "griptape-framework/drivers/prompt-drivers.md" - Embedding Drivers: "griptape-framework/drivers/embedding-drivers.md" @@ -107,6 +108,8 @@ nav: - Web Scraper Drivers: "griptape-framework/drivers/web-scraper-drivers.md" - Conversation Memory Drivers: "griptape-framework/drivers/conversation-memory-drivers.md" - Event Listener Drivers: "griptape-framework/drivers/event-listener-drivers.md" + - Structure Run Drivers: "griptape-framework/drivers/structure-run-drivers.md" + - Text to Speech Drivers: "griptape-framework/drivers/text-to-speech-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" @@ -142,6 +145,7 @@ nav: - InpaintingImageGenerationClient: "griptape-tools/official-tools/inpainting-image-generation-client.md" - OutpaintingImageGenerationClient: "griptape-tools/official-tools/outpainting-image-generation-client.md" - ImageQueryClient: "griptape-tools/official-tools/image-query-client.md" + - TextToSpeechClient: "griptape-tools/official-tools/text-to-speech-client.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: diff --git a/poetry.lock b/poetry.lock index 14f5e2bff..c66d806c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -178,6 +178,24 @@ files = [ {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, ] +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = true +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + [[package]] name = "async-timeout" version = "4.0.3" @@ -1171,6 +1189,17 @@ calendars = ["convertdate", "hijri-converter"] fasttext = ["fasttext"] langdetect = ["langdetect"] +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = true +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "distlib" version = "0.3.8" @@ -1245,6 +1274,25 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "elevenlabs" +version = "1.1.2" +description = "" +optional = true +python-versions = "<4.0,>=3.8" +files = [ + {file = "elevenlabs-1.1.2-py3-none-any.whl", hash = "sha256:c10742b7175c8b9cd089c7d8c515637449a22e069e4b963993ef2f1bb2fe61db"}, + {file = "elevenlabs-1.1.2.tar.gz", hash = "sha256:9df81038b3586ed68a74df9d2e5848283f6d770d0207df7cd0434a8675f3023c"}, +] + +[package.dependencies] +httpx = ">=0.21.2" +ipython = ">=7.0" +pydantic = ">=1.9.2" +requests = ">=2.20" +typing_extensions = ">=4.0.0" +websockets = ">=11.0" + [[package]] name = "exceptiongroup" version = "1.2.0" @@ -1273,6 +1321,20 @@ files = [ [package.extras] testing = ["hatch", "pre-commit", "pytest", "tox"] +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = true +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] name = "fastavro" version = "1.9.3" @@ -1927,6 +1989,43 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +optional = true +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + [[package]] name = "jaraco-classes" version = "3.3.0" @@ -1945,6 +2044,25 @@ more-itertools = "*" docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = true +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jeepney" version = "0.8.0" @@ -2351,6 +2469,20 @@ files = [ [package.dependencies] marshmallow = ">=2.0.0" +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = true +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "mdurl" version = "0.1.2" @@ -2997,6 +3129,21 @@ pytz = ">=2020.1" [package.extras] test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = true +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "0.12.1" @@ -3008,6 +3155,20 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = true +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pgvector" version = "0.2.4" @@ -3222,6 +3383,20 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = true +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "proto-plus" version = "1.23.0" @@ -3340,6 +3515,31 @@ files = [ {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, ] +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = true +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = true +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "py-partiql-parser" version = "0.5.0" @@ -4668,6 +4868,25 @@ files = [ packaging = "*" SQLAlchemy = ">=0.9.2,<2.0.0" +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = true +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "stringcase" version = "1.2.0" @@ -4948,6 +5167,21 @@ urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.18)", "htmldate[speed] (>=1.6.0)", "py3langid (>=0.2.2)", "pycurl (>=7.45.2)"] gui = ["Gooey (>=1.0.1)"] +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = true +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "transformers" version = "4.37.0" @@ -5194,6 +5428,17 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = true +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + [[package]] name = "websocket-client" version = "1.7.0" @@ -5210,6 +5455,87 @@ docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + [[package]] name = "werkzeug" version = "3.0.1" @@ -5357,7 +5683,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-google = ["google-generativeai"] @@ -5392,4 +5718,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "032d9be0951a4048eb10716e492ea1f91e978ceb1ee24e5d13f3251f37cefb0a" +content-hash = "895031a580cca4467c6bb500ef92e9c84e911f3add4046ed94385893dcb643b1" diff --git a/pyproject.toml b/pyproject.toml index 65df87303..77ae12331 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,7 @@ playwright = {version = "^1.42", optional = true} beautifulsoup4 = {version = "^4.12.3", optional = true} markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} +elevenlabs = {version = "^1.1.2", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -120,6 +121,7 @@ all = [ "beautifulsoup4", "markdownify", "voyageai", + "elevenlabs", # loaders "pandas", diff --git a/tests/unit/artifacts/test_audio_artifact.py b/tests/unit/artifacts/test_audio_artifact.py new file mode 100644 index 000000000..93ea816e4 --- /dev/null +++ b/tests/unit/artifacts/test_audio_artifact.py @@ -0,0 +1,34 @@ +import pytest +from griptape.artifacts import AudioArtifact, BaseArtifact + + +class TestAudioArtifact: + @pytest.fixture + def audio_artifact(self): + return AudioArtifact(value=b"some binary audio data", format="pcm", model="provider/model", prompt="two words") + + def test_mime_type(self, audio_artifact: AudioArtifact): + assert audio_artifact.mime_type == "audio/pcm" + + def test_to_text(self, audio_artifact: AudioArtifact): + assert audio_artifact.to_text() == "Media, type: audio/pcm, size: 22 bytes" + + def test_to_dict(self, audio_artifact: AudioArtifact): + audio_dict = audio_artifact.to_dict() + + assert audio_dict["format"] == "pcm" + assert audio_dict["model"] == "provider/model" + assert audio_dict["prompt"] == "two words" + assert audio_dict["value"] == "c29tZSBiaW5hcnkgYXVkaW8gZGF0YQ==" + + def test_deserialization(self, audio_artifact): + artifact_dict = audio_artifact.to_dict() + deserialized_artifact = BaseArtifact.from_dict(artifact_dict) + + assert isinstance(deserialized_artifact, AudioArtifact) + + assert deserialized_artifact.value == b"some binary audio data" + assert deserialized_artifact.mime_type == "audio/pcm" + assert deserialized_artifact.format == "pcm" + assert deserialized_artifact.model == "provider/model" + assert deserialized_artifact.prompt == "two words" diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index 04fe4d7a1..05eda5644 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -33,6 +33,7 @@ def test_to_dict(self, config): "seed": None, "type": "AmazonBedrockImageGenerationDriver", }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "image_query_driver": { "type": "AmazonBedrockImageQueryDriver", "model": "anthropic.claude-3-sonnet-20240229-v1:0", diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index 5653ddb46..b637eb929 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -27,6 +27,7 @@ def test_to_dict(self, config): "top_k": 250, }, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "image_query_driver": { "type": "AnthropicImageQueryDriver", "model": "claude-3-opus-20240229", diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index ad9283d02..2a4d50641 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -26,6 +26,7 @@ def test_to_dict(self, config): "top_k": None, }, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "image_query_driver": {"type": "DummyImageQueryDriver"}, "embedding_driver": { "type": "GoogleEmbeddingDriver", diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index a6df9330c..4a0ab7369 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -46,6 +46,7 @@ def test_to_dict(self, config): "style": None, "type": "OpenAiImageGenerationDriver", }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "image_query_driver": { "api_version": None, "base_url": None, diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index 13060cf92..16f189b02 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -16,6 +16,7 @@ def test_to_dict(self, config): "conversation_memory_driver": None, "embedding_driver": {"type": "DummyEmbeddingDriver"}, "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, "image_query_driver": {"type": "DummyImageQueryDriver"}, "vector_store_driver": { "embedding_driver": {"type": "DummyEmbeddingDriver"}, diff --git a/tests/unit/drivers/text_to_speech/__init__.py b/tests/unit/drivers/text_to_speech/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py b/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py new file mode 100644 index 000000000..2d90bc2f5 --- /dev/null +++ b/tests/unit/drivers/text_to_speech/test_elevenlabs_audio_generation_driver.py @@ -0,0 +1,20 @@ +import pytest +from unittest.mock import Mock +from griptape.drivers import ElevenLabsTextToSpeechDriver + + +class TestElevenLabsTextToSpeechDriver: + @pytest.fixture + def driver(self): + return ElevenLabsTextToSpeechDriver(model="model", client=Mock(), voice="voice", api_key="key") + + def test_init(self, driver): + assert driver + + def test_try_text_to_audio(self, driver): + driver.client.generate.return_value = [b"audio data"] + + audio_artifact = driver.try_text_to_audio(prompts=["test prompt"]) + + assert audio_artifact.value == b"audio data" + assert audio_artifact.format == "mp3" diff --git a/tests/unit/mixins/test_image_artifact_file_output_mixin.py b/tests/unit/mixins/test_image_artifact_file_output_mixin.py index c0b021f5e..69a2f1d71 100644 --- a/tests/unit/mixins/test_image_artifact_file_output_mixin.py +++ b/tests/unit/mixins/test_image_artifact_file_output_mixin.py @@ -4,12 +4,12 @@ import pytest from griptape.artifacts import ImageArtifact -from griptape.mixins import ImageArtifactFileOutputMixin +from griptape.mixins import BlobArtifactFileOutputMixin -class TestImageArtifactFileOutputMixin: +class TestMediaArtifactFileOutputMixin: def test_no_output(self): - class Test(ImageArtifactFileOutputMixin): + class Test(BlobArtifactFileOutputMixin): pass assert Test().output_file is None @@ -18,7 +18,7 @@ class Test(ImageArtifactFileOutputMixin): def test_output_file(self): artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") - class Test(ImageArtifactFileOutputMixin): + class Test(BlobArtifactFileOutputMixin): def run(self): self._write_to_file(artifact) @@ -33,7 +33,7 @@ def run(self): def test_output_dir(self): artifact = ImageArtifact(name="test.png", value=b"test", height=1, width=1, format="png") - class Test(ImageArtifactFileOutputMixin): + class Test(BlobArtifactFileOutputMixin): def run(self): self._write_to_file(artifact) @@ -46,7 +46,7 @@ def run(self): assert os.path.exists(os.path.join(outdir, artifact.name)) def test_output_file_and_dir(self): - class Test(ImageArtifactFileOutputMixin): + class Test(BlobArtifactFileOutputMixin): pass outfile = "test.txt" diff --git a/tests/unit/tasks/test_text_to_speech_task.py b/tests/unit/tasks/test_text_to_speech_task.py new file mode 100644 index 000000000..f30893e8a --- /dev/null +++ b/tests/unit/tasks/test_text_to_speech_task.py @@ -0,0 +1,30 @@ +from unittest.mock import Mock + +from griptape.artifacts import TextArtifact +from griptape.engines import TextToSpeechEngine +from griptape.structures import Agent +from griptape.tasks import BaseTask, TextToSpeechTask +from tests.mocks.mock_structure_config import MockStructureConfig + + +class TestTextToSpeechTask: + def test_string_input(self): + task = TextToSpeechTask("string input", text_to_speech_engine=Mock()) + + assert task.input.value == "string input" + + def test_callable_input(self): + input_artifact = TextArtifact("some text input") + + def callable(task: BaseTask) -> TextArtifact: + return input_artifact + + task = TextToSpeechTask(callable, text_to_speech_engine=Mock()) + + assert task.input == input_artifact + + def test_config_text_to_speech_engine(self): + task = TextToSpeechTask("foo bar") + Agent(config=MockStructureConfig()).add_task(task) + + assert isinstance(task.text_to_speech_engine, TextToSpeechEngine) diff --git a/tests/unit/tools/test_text_to_speech_client.py b/tests/unit/tools/test_text_to_speech_client.py new file mode 100644 index 000000000..881b1234d --- /dev/null +++ b/tests/unit/tools/test_text_to_speech_client.py @@ -0,0 +1,40 @@ +import os +import tempfile +import uuid +from unittest.mock import Mock + +import pytest + +from griptape.tools.text_to_speech_client.tool import TextToSpeechClient + + +class TestTextToSpeechClient: + @pytest.fixture + def text_to_speech_engine(self) -> Mock: + return Mock() + + @pytest.fixture + def text_to_speech_client(self, text_to_speech_engine) -> TextToSpeechClient: + return TextToSpeechClient(engine=text_to_speech_engine) + + def test_validate_output_configs(self, text_to_speech_engine) -> None: + with pytest.raises(ValueError): + TextToSpeechClient(engine=text_to_speech_engine, output_dir="test", output_file="test") + + def test_text_to_speech(self, text_to_speech_client) -> None: + text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") + + audio_artifact = text_to_speech_client.text_to_speech(params={"values": {"text": "say this!"}}) + + assert audio_artifact + + def test_text_to_speech_with_outfile(self, text_to_speech_engine) -> None: + outfile = f"{tempfile.gettempdir()}/{str(uuid.uuid4())}.mp3" + text_to_speech_client = TextToSpeechClient(engine=text_to_speech_engine, output_file=outfile) + + text_to_speech_client.engine.run.return_value = Mock(value=b"audio data", format="mp3") # pyright: ignore + + audio_artifact = text_to_speech_client.text_to_speech(params={"values": {"text": "say this!"}}) + + assert audio_artifact + assert os.path.exists(outfile) From f1a2dba94bea0dfb2ebc5e4eae75ebfdb851cdcf Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 16 May 2024 18:18:15 -0500 Subject: [PATCH 047/238] Add `RedisConversationMemoryDriver` (#787) Co-authored-by: torabshaikh --- CHANGELOG.md | 3 + .../drivers/conversation-memory-drivers.md | 30 ++++++++++ griptape/drivers/__init__.py | 2 + .../redis_conversation_memory_driver.py | 56 +++++++++++++++++++ poetry.lock | 27 ++++++++- pyproject.toml | 1 + .../test_redis_conversation_memory_driver.py | 40 +++++++++++++ 7 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 griptape/drivers/memory/conversation/redis_conversation_memory_driver.py create mode 100644 tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c24f744c0..9f237ce6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `RedisConversationMemoryDriver` to save conversation memory in redis. + ### Changed - Default behavior of OpenAiStructureConfig to utilize `gpt-4o` for prompt_driver. diff --git a/docs/griptape-framework/drivers/conversation-memory-drivers.md b/docs/griptape-framework/drivers/conversation-memory-drivers.md index d429be527..4c3de1e65 100644 --- a/docs/griptape-framework/drivers/conversation-memory-drivers.md +++ b/docs/griptape-framework/drivers/conversation-memory-drivers.md @@ -45,3 +45,33 @@ agent = Agent(conversation_memory=ConversationMemory(driver=dynamodb_driver)) agent.run("My name is Jeff.") agent.run("What is my name?") ``` + + +### Redis Conversation Memory Driver + +!!! info + This driver requires the `drivers-memory-conversation-redis` [extra](../index.md#extras). + +The [RedisConversationMemoryDriver](../../reference/griptape/drivers/memory/conversation/redis_conversation_memory_driver.md) allows you to persist Conversation Memory in [Redis](https://redis.io/). + +```python +import os +import uuid +from griptape.drivers import RedisConversationMemoryDriver +from griptape.memory.structure import ConversationMemory +from griptape.structures import Agent + +conversation_id = uuid.uuid4().hex +redis_conversation_driver = RedisConversationMemoryDriver( + host=os.environ["REDIS_HOST"], + port=os.environ["REDIS_PORT"], + password=os.environ["REDIS_PASSWORD"], + index=os.environ["REDIS_INDEX"], + conversation_id = conversation_id +) + +agent = Agent(conversation_memory=ConversationMemory(driver=redis_conversation_driver)) + +agent.run("My name is Jeff.") +agent.run("What is my name?") +``` diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index fdc5cdb59..7941ed61e 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -16,6 +16,7 @@ from .memory.conversation.base_conversation_memory_driver import BaseConversationMemoryDriver from .memory.conversation.local_conversation_memory_driver import LocalConversationMemoryDriver from .memory.conversation.amazon_dynamodb_conversation_memory_driver import AmazonDynamoDbConversationMemoryDriver +from .memory.conversation.redis_conversation_memory_driver import RedisConversationMemoryDriver from .embedding.base_embedding_driver import BaseEmbeddingDriver from .embedding.openai_embedding_driver import OpenAiEmbeddingDriver @@ -123,6 +124,7 @@ "BaseConversationMemoryDriver", "LocalConversationMemoryDriver", "AmazonDynamoDbConversationMemoryDriver", + "RedisConversationMemoryDriver", "BaseEmbeddingDriver", "OpenAiEmbeddingDriver", "AzureOpenAiEmbeddingDriver", diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py new file mode 100644 index 000000000..0531d5f9d --- /dev/null +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -0,0 +1,56 @@ +from __future__ import annotations +import uuid +from attr import define, field, Factory +from typing import Optional, TYPE_CHECKING +from griptape.drivers import BaseConversationMemoryDriver +from griptape.memory.structure import BaseConversationMemory +from griptape.utils.import_utils import import_optional_dependency + +if TYPE_CHECKING: + from redis import Redis + + +@define +class RedisConversationMemoryDriver(BaseConversationMemoryDriver): + """A Conversation Memory Driver for Redis. + + This driver interfaces with a Redis instance and utilizes the Redis hashes and RediSearch module to store, + retrieve, and query conversations in a structured manner. + Proper setup of the Redis instance and RediSearch is necessary for the driver to function correctly. + + Attributes: + host: The host of the Redis instance. + port: The port of the Redis instance. + db: The database of the Redis instance. + password: The password of the Redis instance. + index: The name of the index to use. + conversation_id: The id of the conversation. + """ + + host: str = field(kw_only=True, metadata={"serializable": True}) + port: int = field(kw_only=True, metadata={"serializable": True}) + db: int = field(kw_only=True, default=0, metadata={"serializable": True}) + password: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) + index: str = field(kw_only=True, metadata={"serializable": True}) + conversation_id: str = field(kw_only=True, default=uuid.uuid4().hex) + + client: Redis = field( + default=Factory( + lambda self: import_optional_dependency("redis").Redis( + host=self.host, port=self.port, db=self.db, password=self.password, decode_responses=False + ), + takes_self=True, + ) + ) + + def store(self, memory: BaseConversationMemory) -> None: + self.client.hset(self.index, self.conversation_id, memory.to_json()) + + def load(self) -> Optional[BaseConversationMemory]: + key = self.index + memory_json = self.client.hget(key, self.conversation_id) + if memory_json: + memory = BaseConversationMemory.from_json(memory_json) + memory.driver = self + return memory + return None diff --git a/poetry.lock b/poetry.lock index c66d806c6..ccb990264 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -3746,6 +3746,7 @@ files = [ {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, + {file = "pymongo-4.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dcc95f4bb9ed793714b43f4f23a7b0c57e4ef47414162297d6f650213512c19"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, @@ -4802,30 +4803,51 @@ description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ + {file = "SQLAlchemy-1.4.51-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:1a09d5bd1a40d76ad90e5570530e082ddc000e1d92de495746f6257dc08f166b"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2be4e6294c53f2ec8ea36486b56390e3bcaa052bf3a9a47005687ccf376745d1"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca484ca11c65e05639ffe80f20d45e6be81fbec7683d6c9a15cd421e6e8b340"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0535d5b57d014d06ceeaeffd816bb3a6e2dddeb670222570b8c4953e2d2ea678"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af55cc207865d641a57f7044e98b08b09220da3d1b13a46f26487cc2f898a072"}, + {file = "SQLAlchemy-1.4.51-cp310-cp310-win32.whl", hash = "sha256:7af40425ac535cbda129d9915edcaa002afe35d84609fd3b9d6a8c46732e02ee"}, + {file = "SQLAlchemy-1.4.51-cp310-cp310-win_amd64.whl", hash = "sha256:8d1d7d63e5d2f4e92a39ae1e897a5d551720179bb8d1254883e7113d3826d43c"}, + {file = "SQLAlchemy-1.4.51-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eaeeb2464019765bc4340214fca1143081d49972864773f3f1e95dba5c7edc7d"}, {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7deeae5071930abb3669b5185abb6c33ddfd2398f87660fafdb9e6a5fb0f3f2f"}, {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0892e7ac8bc76da499ad3ee8de8da4d7905a3110b952e2a35a940dab1ffa550e"}, + {file = "SQLAlchemy-1.4.51-cp311-cp311-win32.whl", hash = "sha256:50e074aea505f4427151c286955ea025f51752fa42f9939749336672e0674c81"}, + {file = "SQLAlchemy-1.4.51-cp311-cp311-win_amd64.whl", hash = "sha256:3b0cd89a7bd03f57ae58263d0f828a072d1b440c8c2949f38f3b446148321171"}, + {file = "SQLAlchemy-1.4.51-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a33cb3f095e7d776ec76e79d92d83117438b6153510770fcd57b9c96f9ef623d"}, {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cacc0b2dd7d22a918a9642fc89840a5d3cee18a0e1fe41080b1141b23b10916"}, {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245c67c88e63f1523e9216cad6ba3107dea2d3ee19adc359597a628afcabfbcb"}, + {file = "SQLAlchemy-1.4.51-cp312-cp312-win32.whl", hash = "sha256:8e702e7489f39375601c7ea5a0bef207256828a2bc5986c65cb15cd0cf097a87"}, + {file = "SQLAlchemy-1.4.51-cp312-cp312-win_amd64.whl", hash = "sha256:0525c4905b4b52d8ccc3c203c9d7ab2a80329ffa077d4bacf31aefda7604dc65"}, + {file = "SQLAlchemy-1.4.51-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:1980e6eb6c9be49ea8f89889989127daafc43f0b1b6843d71efab1514973cca0"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec7a0ed9b32afdf337172678a4a0e6419775ba4e649b66f49415615fa47efbd"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352df882088a55293f621328ec33b6ffca936ad7f23013b22520542e1ab6ad1b"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86a22143a4001f53bf58027b044da1fb10d67b62a785fc1390b5c7f089d9838c"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c37bc677690fd33932182b85d37433845de612962ed080c3e4d92f758d1bd894"}, + {file = "SQLAlchemy-1.4.51-cp36-cp36m-win32.whl", hash = "sha256:d0a83afab5e062abffcdcbcc74f9d3ba37b2385294dd0927ad65fc6ebe04e054"}, + {file = "SQLAlchemy-1.4.51-cp36-cp36m-win_amd64.whl", hash = "sha256:a61184c7289146c8cff06b6b41807c6994c6d437278e72cf00ff7fe1c7a263d1"}, + {file = "SQLAlchemy-1.4.51-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:3f0ef620ecbab46e81035cf3dedfb412a7da35340500ba470f9ce43a1e6c423b"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c55040d8ea65414de7c47f1a23823cd9f3fad0dc93e6b6b728fee81230f817b"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ef80328e3fee2be0a1abe3fe9445d3a2e52a1282ba342d0dab6edf1fef4707"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f8cafa6f885a0ff5e39efa9325195217bb47d5929ab0051636610d24aef45ade"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f2df79a46e130235bc5e1bbef4de0583fb19d481eaa0bffa76e8347ea45ec6"}, + {file = "SQLAlchemy-1.4.51-cp37-cp37m-win32.whl", hash = "sha256:f2e5b6f5cf7c18df66d082604a1d9c7a2d18f7d1dbe9514a2afaccbb51cc4fc3"}, + {file = "SQLAlchemy-1.4.51-cp37-cp37m-win_amd64.whl", hash = "sha256:5e180fff133d21a800c4f050733d59340f40d42364fcb9d14f6a67764bdc48d2"}, + {file = "SQLAlchemy-1.4.51-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7d8139ca0b9f93890ab899da678816518af74312bb8cd71fb721436a93a93298"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb18549b770351b54e1ab5da37d22bc530b8bfe2ee31e22b9ebe650640d2ef12"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e699466106d09f028ab78d3c2e1f621b5ef2c8694598242259e4515715da7c"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2ad16880ccd971ac8e570550fbdef1385e094b022d6fc85ef3ce7df400dddad3"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b97fd5bb6b7c1a64b7ac0632f7ce389b8ab362e7bd5f60654c2a418496be5d7f"}, + {file = "SQLAlchemy-1.4.51-cp38-cp38-win32.whl", hash = "sha256:cecb66492440ae8592797dd705a0cbaa6abe0555f4fa6c5f40b078bd2740fc6b"}, + {file = "SQLAlchemy-1.4.51-cp38-cp38-win_amd64.whl", hash = "sha256:39b02b645632c5fe46b8dd30755682f629ffbb62ff317ecc14c998c21b2896ff"}, + {file = "SQLAlchemy-1.4.51-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b03850c290c765b87102959ea53299dc9addf76ca08a06ea98383348ae205c99"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e646b19f47d655261b22df9976e572f588185279970efba3d45c377127d35349"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3cf56cc36d42908495760b223ca9c2c0f9f0002b4eddc994b24db5fcb86a9e4"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0d661cff58c91726c601cc0ee626bf167b20cc4d7941c93c5f3ac28dc34ddbea"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3823dda635988e6744d4417e13f2e2b5fe76c4bf29dd67e95f98717e1b094cad"}, + {file = "SQLAlchemy-1.4.51-cp39-cp39-win32.whl", hash = "sha256:b00cf0471888823b7a9f722c6c41eb6985cf34f077edcf62695ac4bed6ec01ee"}, + {file = "SQLAlchemy-1.4.51-cp39-cp39-win_amd64.whl", hash = "sha256:a055ba17f4675aadcda3005df2e28a86feb731fdcc865e1f6b4f209ed1225cba"}, {file = "SQLAlchemy-1.4.51.tar.gz", hash = "sha256:e7908c2025eb18394e32d65dd02d2e37e17d733cdbe7d78231c2b6d7eb20cdb9"}, ] @@ -5692,6 +5714,7 @@ drivers-embedding-voyageai = ["voyageai"] drivers-event-listener-amazon-iot = ["boto3"] drivers-event-listener-amazon-sqs = ["boto3"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] +drivers-memory-conversation-redis = ["redis"] drivers-prompt-amazon-bedrock = ["anthropic", "boto3"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-anthropic = ["anthropic"] @@ -5718,4 +5741,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "895031a580cca4467c6bb500ef92e9c84e911f3add4046ed94385893dcb643b1" +content-hash = "edfa749ceeaae8216026c5c18245dbb284383a3b6772d648319253cc9657a2d1" diff --git a/pyproject.toml b/pyproject.toml index 77ae12331..06ea541f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,6 +72,7 @@ drivers-sql-snowflake = ["snowflake-sqlalchemy", "snowflake", "snowflake-connect drivers-sql-postgres = ["pgvector", "psycopg2-binary"] drivers-memory-conversation-amazon-dynamodb = ["boto3"] +drivers-memory-conversation-redis = ["redis"] drivers-vector-marqo = ["marqo"] drivers-vector-pinecone = ["pinecone-client"] diff --git a/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py new file mode 100644 index 000000000..dee840508 --- /dev/null +++ b/tests/unit/drivers/memory/conversation/test_redis_conversation_memory_driver.py @@ -0,0 +1,40 @@ +import pytest +import redis +from griptape.memory.structure.base_conversation_memory import BaseConversationMemory +from griptape.drivers.memory.conversation.redis_conversation_memory_driver import RedisConversationMemoryDriver + +TEST_CONVERSATION = '{"type": "ConversationMemory", "runs": [{"type": "Run", "id": "729ca6be5d79433d9762eb06dfd677e2", "input": "Hi There, Hello", "output": "Hello! How can I assist you today?"}], "max_runs": 2}' +CONVERSATION_ID = "117151897f344ff684b553d0655d8f39" +INDEX = "griptape_converstaion" +HOST = "127.0.0.1" +PORT = 6379 +PASSWORD = "" + + +class TestRedisConversationMemoryDriver: + @pytest.fixture(autouse=True) + def mock_redis(self, mocker): + mocker.patch.object(redis.StrictRedis, "hset", return_value=None) + mocker.patch.object(redis.StrictRedis, "keys", return_value=[b"test"]) + mocker.patch.object(redis.StrictRedis, "hget", return_value=TEST_CONVERSATION) + + fake_redisearch = mocker.MagicMock() + fake_redisearch.search = mocker.MagicMock(return_value=mocker.MagicMock(docs=[])) + fake_redisearch.info = mocker.MagicMock(side_effect=Exception("Index not found")) + fake_redisearch.create_index = mocker.MagicMock(return_value=None) + + mocker.patch.object(redis.StrictRedis, "ft", return_value=fake_redisearch) + + @pytest.fixture + def driver(self): + return RedisConversationMemoryDriver(host=HOST, port=PORT, db=0, index=INDEX, conversation_id=CONVERSATION_ID) + + def test_store(self, driver): + memory = BaseConversationMemory.from_json(TEST_CONVERSATION) + assert driver.store(memory) == None + + def test_load(self, driver): + memory = driver.load() + assert memory.type == "ConversationMemory" + assert memory.max_runs == 2 + assert memory.runs == BaseConversationMemory.from_json(TEST_CONVERSATION).runs From c9afae6f1951070e2983750241836b2247d419d7 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Fri, 17 May 2024 10:01:40 -0700 Subject: [PATCH 048/238] Merge main to dev (#789) Co-authored-by: Aodhan Roche Co-authored-by: Collin Dutter Co-authored-by: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Co-authored-by: Zach Giordano <32624672+zachgiordano@users.noreply.github.com> --- CHANGELOG.md | 10 +++------- poetry.lock | 24 +----------------------- pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f237ce6b..519708d18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,23 +6,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -### Added -- `RedisConversationMemoryDriver` to save conversation memory in redis. - -### Changed -- Default behavior of OpenAiStructureConfig to utilize `gpt-4o` for prompt_driver. +## [0.25.1] - 2024-05-15 ### Fixed - Honor `namespace` in `RedisVectorStoreDriver.query()`. - Correctly set the `meta`, `score`, and `vector` fields of query result returned from `RedisVectorStoreDriver.query()`. +- Standardize behavior between omitted and empty actions list when initializing `ActionsSubtask`. -## [0.25.1] - 2024-05-09 ### Added - Optional event batching on Event Listener Drivers. - `id` field to all events. ### Changed - Default behavior of Event Listener Drivers to batch events. +- Default behavior of OpenAiStructureConfig to utilize `gpt-4o` for prompt_driver. ## [0.25.0] - 2024-05-06 @@ -65,7 +62,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Type hint for parameter `azure_ad_token_provider` on Azure OpenAI drivers to `Optional[Callable[[], str]]`. - Missing parameters `azure_ad_token` and `azure_ad_token_provider` on the default client for `AzureOpenAiCompletionPromptDriver`. -- Standardize behavior between omitted and empty actions list when initializing `ActionsSubtask`. ## [0.24.2] - 2024-04-04 diff --git a/poetry.lock b/poetry.lock index ccb990264..d40bc7c93 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -3746,7 +3746,6 @@ files = [ {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, - {file = "pymongo-4.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dcc95f4bb9ed793714b43f4f23a7b0c57e4ef47414162297d6f650213512c19"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, @@ -4803,51 +4802,30 @@ description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-1.4.51-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:1a09d5bd1a40d76ad90e5570530e082ddc000e1d92de495746f6257dc08f166b"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2be4e6294c53f2ec8ea36486b56390e3bcaa052bf3a9a47005687ccf376745d1"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca484ca11c65e05639ffe80f20d45e6be81fbec7683d6c9a15cd421e6e8b340"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0535d5b57d014d06ceeaeffd816bb3a6e2dddeb670222570b8c4953e2d2ea678"}, {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af55cc207865d641a57f7044e98b08b09220da3d1b13a46f26487cc2f898a072"}, - {file = "SQLAlchemy-1.4.51-cp310-cp310-win32.whl", hash = "sha256:7af40425ac535cbda129d9915edcaa002afe35d84609fd3b9d6a8c46732e02ee"}, - {file = "SQLAlchemy-1.4.51-cp310-cp310-win_amd64.whl", hash = "sha256:8d1d7d63e5d2f4e92a39ae1e897a5d551720179bb8d1254883e7113d3826d43c"}, - {file = "SQLAlchemy-1.4.51-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eaeeb2464019765bc4340214fca1143081d49972864773f3f1e95dba5c7edc7d"}, {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7deeae5071930abb3669b5185abb6c33ddfd2398f87660fafdb9e6a5fb0f3f2f"}, {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0892e7ac8bc76da499ad3ee8de8da4d7905a3110b952e2a35a940dab1ffa550e"}, - {file = "SQLAlchemy-1.4.51-cp311-cp311-win32.whl", hash = "sha256:50e074aea505f4427151c286955ea025f51752fa42f9939749336672e0674c81"}, - {file = "SQLAlchemy-1.4.51-cp311-cp311-win_amd64.whl", hash = "sha256:3b0cd89a7bd03f57ae58263d0f828a072d1b440c8c2949f38f3b446148321171"}, - {file = "SQLAlchemy-1.4.51-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a33cb3f095e7d776ec76e79d92d83117438b6153510770fcd57b9c96f9ef623d"}, {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cacc0b2dd7d22a918a9642fc89840a5d3cee18a0e1fe41080b1141b23b10916"}, {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245c67c88e63f1523e9216cad6ba3107dea2d3ee19adc359597a628afcabfbcb"}, - {file = "SQLAlchemy-1.4.51-cp312-cp312-win32.whl", hash = "sha256:8e702e7489f39375601c7ea5a0bef207256828a2bc5986c65cb15cd0cf097a87"}, - {file = "SQLAlchemy-1.4.51-cp312-cp312-win_amd64.whl", hash = "sha256:0525c4905b4b52d8ccc3c203c9d7ab2a80329ffa077d4bacf31aefda7604dc65"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:1980e6eb6c9be49ea8f89889989127daafc43f0b1b6843d71efab1514973cca0"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec7a0ed9b32afdf337172678a4a0e6419775ba4e649b66f49415615fa47efbd"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352df882088a55293f621328ec33b6ffca936ad7f23013b22520542e1ab6ad1b"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86a22143a4001f53bf58027b044da1fb10d67b62a785fc1390b5c7f089d9838c"}, {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c37bc677690fd33932182b85d37433845de612962ed080c3e4d92f758d1bd894"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-win32.whl", hash = "sha256:d0a83afab5e062abffcdcbcc74f9d3ba37b2385294dd0927ad65fc6ebe04e054"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-win_amd64.whl", hash = "sha256:a61184c7289146c8cff06b6b41807c6994c6d437278e72cf00ff7fe1c7a263d1"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:3f0ef620ecbab46e81035cf3dedfb412a7da35340500ba470f9ce43a1e6c423b"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c55040d8ea65414de7c47f1a23823cd9f3fad0dc93e6b6b728fee81230f817b"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ef80328e3fee2be0a1abe3fe9445d3a2e52a1282ba342d0dab6edf1fef4707"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f8cafa6f885a0ff5e39efa9325195217bb47d5929ab0051636610d24aef45ade"}, {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f2df79a46e130235bc5e1bbef4de0583fb19d481eaa0bffa76e8347ea45ec6"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-win32.whl", hash = "sha256:f2e5b6f5cf7c18df66d082604a1d9c7a2d18f7d1dbe9514a2afaccbb51cc4fc3"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-win_amd64.whl", hash = "sha256:5e180fff133d21a800c4f050733d59340f40d42364fcb9d14f6a67764bdc48d2"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7d8139ca0b9f93890ab899da678816518af74312bb8cd71fb721436a93a93298"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb18549b770351b54e1ab5da37d22bc530b8bfe2ee31e22b9ebe650640d2ef12"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e699466106d09f028ab78d3c2e1f621b5ef2c8694598242259e4515715da7c"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2ad16880ccd971ac8e570550fbdef1385e094b022d6fc85ef3ce7df400dddad3"}, {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b97fd5bb6b7c1a64b7ac0632f7ce389b8ab362e7bd5f60654c2a418496be5d7f"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-win32.whl", hash = "sha256:cecb66492440ae8592797dd705a0cbaa6abe0555f4fa6c5f40b078bd2740fc6b"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-win_amd64.whl", hash = "sha256:39b02b645632c5fe46b8dd30755682f629ffbb62ff317ecc14c998c21b2896ff"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b03850c290c765b87102959ea53299dc9addf76ca08a06ea98383348ae205c99"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e646b19f47d655261b22df9976e572f588185279970efba3d45c377127d35349"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3cf56cc36d42908495760b223ca9c2c0f9f0002b4eddc994b24db5fcb86a9e4"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0d661cff58c91726c601cc0ee626bf167b20cc4d7941c93c5f3ac28dc34ddbea"}, {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3823dda635988e6744d4417e13f2e2b5fe76c4bf29dd67e95f98717e1b094cad"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-win32.whl", hash = "sha256:b00cf0471888823b7a9f722c6c41eb6985cf34f077edcf62695ac4bed6ec01ee"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-win_amd64.whl", hash = "sha256:a055ba17f4675aadcda3005df2e28a86feb731fdcc865e1f6b4f209ed1225cba"}, {file = "SQLAlchemy-1.4.51.tar.gz", hash = "sha256:e7908c2025eb18394e32d65dd02d2e37e17d733cdbe7d78231c2b6d7eb20cdb9"}, ] diff --git a/pyproject.toml b/pyproject.toml index 06ea541f2..c7f89bdca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "griptape" -version = "0.25.0" +version = "0.25.1" description = "Modular Python framework for LLM workflows, tools, memory, and data." authors = ["Griptape "] license = "Apache 2.0" From fcb9727607b4dbf90e6fa29d8bf15e73372b0330 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 17 May 2024 12:13:08 -0700 Subject: [PATCH 049/238] Add ruff to github code check, use local deps for pre-commit (#784) --- .github/workflows/code-checks.yml | 15 +- .pre-commit-config.yaml | 30 +- README.md | 4 +- griptape/artifacts/base_artifact.py | 3 +- griptape/config/base_config.py | 3 +- .../embedding/base_embedding_driver.py | 3 +- .../base_embedding_model_driver.py | 6 +- .../base_event_listener_driver.py | 6 +- .../file_manager/base_file_manager_driver.py | 9 +- .../base_image_generation_driver.py | 12 +- .../openai_image_generation_driver.py | 6 +- .../base_image_generation_model_driver.py | 15 +- ...diffusion_image_generation_model_driver.py | 2 +- .../image_query/base_image_query_driver.py | 3 +- .../image_query/dummy_image_query_driver.py | 2 +- .../base_image_query_model_driver.py | 6 +- ...bedrock_claude_image_query_model_driver.py | 3 +- .../base_conversation_memory_driver.py | 6 +- griptape/drivers/prompt/base_prompt_driver.py | 6 +- .../drivers/prompt/cohere_prompt_driver.py | 5 +- .../prompt/huggingface_hub_prompt_driver.py | 9 +- .../huggingface_pipeline_prompt_driver.py | 8 +- .../prompt/openai_chat_prompt_driver.py | 1 - .../prompt/openai_completion_prompt_driver.py | 1 - .../prompt_model/base_prompt_model_driver.py | 12 +- griptape/drivers/sql/base_sql_driver.py | 9 +- .../base_structure_run_driver.py | 3 +- .../base_text_to_speech_driver.py | 3 +- .../dummy_text_to_speech_driver.py | 1 - .../elevenlabs_text_to_speech_driver.py | 5 +- .../azure_mongodb_vector_store_driver.py | 9 +- .../vector/base_vector_store_driver.py | 15 +- .../vector/marqo_vector_store_driver.py | 2 +- .../vector/opensearch_vector_store_driver.py | 2 +- .../vector/pgvector_vector_store_driver.py | 1 - .../vector/redis_vector_store_driver.py | 2 +- .../web_scraper/base_web_scraper_driver.py | 3 +- .../extraction/base_extraction_engine.py | 3 +- .../extraction/csv_extraction_engine.py | 2 +- .../image/base_image_generation_engine.py | 3 +- .../image/prompt_image_generation_engine.py | 1 - griptape/engines/query/base_query_engine.py | 12 +- griptape/engines/query/vector_query_engine.py | 2 +- .../engines/summary/base_summary_engine.py | 5 +- .../events/base_image_generation_event.py | 3 +- griptape/events/base_image_query_event.py | 3 +- .../events/base_media_generation_event.py | 3 +- griptape/events/base_text_to_speech_event.py | 3 +- .../events/finish_actions_subtask_event.py | 3 +- .../events/finish_image_generation_event.py | 3 +- griptape/events/finish_structure_run_event.py | 6 +- griptape/events/finish_task_event.py | 3 +- .../events/finish_text_to_speech_event.py | 4 +- .../events/start_actions_subtask_event.py | 3 +- griptape/events/start_prompt_event.py | 2 +- griptape/events/start_structure_run_event.py | 6 +- griptape/events/start_task_event.py | 3 +- griptape/loaders/base_loader.py | 3 +- griptape/loaders/image_loader.py | 5 +- griptape/memory/meta/base_meta_entry.py | 3 +- .../structure/base_conversation_memory.py | 6 +- .../task/storage/base_artifact_storage.py | 17 +- .../task/storage/text_artifact_storage.py | 2 +- griptape/memory/task/task_memory.py | 5 +- .../mixins/actions_subtask_origin_mixin.py | 15 +- griptape/structures/structure.py | 7 +- griptape/tasks/base_audio_generation_task.py | 9 +- griptape/tasks/base_task.py | 6 +- griptape/tasks/image_query_task.py | 8 +- .../outpainting_image_generation_task.py | 7 +- griptape/tokenizers/base_tokenizer.py | 3 +- griptape/tokenizers/cohere_tokenizer.py | 2 +- griptape/tokenizers/huggingface_tokenizer.py | 2 +- griptape/tools/aws_iam_client/tool.py | 4 +- griptape/tools/aws_s3_client/tool.py | 3 + griptape/tools/google_drive/tool.py | 27 +- griptape/tools/task_memory_client/tool.py | 2 +- griptape/utils/conversation.py | 2 +- poetry.lock | 3164 ++++++++--------- pyproject.toml | 18 +- ...table_diffusion_image_generation_driver.py | 4 +- .../test_markdownify_web_scraper_driver.py | 5 +- 82 files changed, 1778 insertions(+), 1855 deletions(-) diff --git a/.github/workflows/code-checks.yml b/.github/workflows/code-checks.yml index 8b6311b9b..19b65bce9 100644 --- a/.github/workflows/code-checks.yml +++ b/.github/workflows/code-checks.yml @@ -19,7 +19,7 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run formatter - run: poetry run black --check . + run: poetry run ruff format --check . type-check: runs-on: ubuntu-latest strategy: @@ -33,3 +33,16 @@ jobs: uses: ./.github/actions/init-environment - name: Run type checker run: poetry run pyright griptape/ + lint: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: [ "3.9" ] + steps: + - name: Checkout actions + uses: actions/checkout@v3 + - name: Init environment + uses: ./.github/actions/init-environment + - name: Run linter + run: poetry run ruff check griptape/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b941ffdef..69209ba17 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,14 +1,28 @@ repos: -- repo: https://github.com/ambv/black - rev: 23.7.0 - hooks: - - id: black - repo: https://github.com/asottile/pyupgrade rev: v3.15.0 hooks: - id: pyupgrade args: [--py39-plus, --keep-runtime-typing] -- repo: https://github.com/RobertCraigie/pyright-python - rev: v1.1.355 - hooks: - - id: pyright +- repo: local + hooks: + - id: ruff-lint + name: Ruff + entry: poetry run ruff check + args: [--fix] + language: system + types: [python] +- repo: local + hooks: + - id: ruff-format + name: Ruff + entry: poetry run ruff format + language: system + types: [python] +- repo: local + hooks: + - id: pyright + name: Pyright + entry: poetry run pyright + language: system + types: [python] diff --git a/README.md b/README.md index 53c941a2e..aed7cdaac 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Tests](https://github.com/griptape-ai/griptape/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/griptape-ai/griptape/actions/workflows/unit-tests.yml) [![Docs](https://readthedocs.org/projects/griptape/badge/)](https://griptape.readthedocs.io/) [![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Griptape Discord](https://dcbadge.vercel.app/api/server/gnWRz88eym?compact=true&style=flat)](https://discord.gg/gnWRz88eym) Griptape is a modular Python framework for building AI-powered applications that securely connect to your enterprise data and APIs. It offers developers the ability to maintain control and flexibility at every step. @@ -179,7 +179,7 @@ We welcome and encourage pull requests. To streamline the process, please follow 4. **Documentation:** Every pull request must include updates to documentation or explicitly explain why a documentation update is not required. Documentation is crucial for maintaining a comprehensive and user-friendly project. -5. **Code Style:** Griptape uses [Black](https://github.com/ambv/black) to enforce style guidelines. You can ensure that your code is formatted accordingly and will pass formatting checks using `pre-commit`. See [Tools](#tools) for information on how to configure this and other dev tools. +5. **Code Style:** Griptape uses [Ruff](https://github.com/astral-sh/ruff) to enforce style guidelines. You can ensure that your code is formatted accordingly and will pass formatting checks using `pre-commit`. See [Tools](#tools) for information on how to configure this and other dev tools. ### Tools diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index 50df2381d..daaa32c4f 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -44,5 +44,4 @@ def __len__(self) -> int: return len(self.value) @abstractmethod - def __add__(self, other: BaseArtifact) -> BaseArtifact: - ... + def __add__(self, other: BaseArtifact) -> BaseArtifact: ... diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py index a96c2b0c5..241efadcd 100644 --- a/griptape/config/base_config.py +++ b/griptape/config/base_config.py @@ -6,5 +6,4 @@ @define -class BaseConfig(SerializableMixin, ABC): - ... +class BaseConfig(SerializableMixin, ABC): ... diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index a59f9bd9e..938bdd476 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -41,8 +41,7 @@ def embed_string(self, string: str) -> list[float]: raise RuntimeError("Failed to embed string.") @abstractmethod - def try_embed_chunk(self, chunk: str) -> list[float]: - ... + def try_embed_chunk(self, chunk: str) -> list[float]: ... def _embed_long_string(self, string: str) -> list[float]: """Embeds a string that is too long to embed in one go. diff --git a/griptape/drivers/embedding_model/base_embedding_model_driver.py b/griptape/drivers/embedding_model/base_embedding_model_driver.py index 21962c70d..d2b169495 100644 --- a/griptape/drivers/embedding_model/base_embedding_model_driver.py +++ b/griptape/drivers/embedding_model/base_embedding_model_driver.py @@ -5,9 +5,7 @@ @define class BaseEmbeddingModelDriver(ABC): @abstractmethod - def chunk_to_model_params(self, chunk: str) -> dict: - ... + def chunk_to_model_params(self, chunk: str) -> dict: ... @abstractmethod - def process_output(self, output: dict) -> list[float]: - ... + def process_output(self, output: dict) -> list[float]: ... diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 8e7f827e9..9ff18cf4f 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -27,12 +27,10 @@ def publish_event(self, event: BaseEvent | dict, flush: bool = False) -> None: self.futures_executor.submit(self._safe_try_publish_event, event, flush) @abstractmethod - def try_publish_event_payload(self, event_payload: dict) -> None: - ... + def try_publish_event_payload(self, event_payload: dict) -> None: ... @abstractmethod - def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: - ... + def try_publish_event_payload_batch(self, event_payload_batch: list[dict]) -> None: ... def _safe_try_publish_event(self, event: BaseEvent | dict, flush: bool) -> None: try: diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index b6c0a02ca..1cff06d06 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -50,8 +50,7 @@ def list_files(self, path: str) -> TextArtifact | ErrorArtifact: return ErrorArtifact(f"Failed to list files: {str(e)}") @abstractmethod - def try_list_files(self, path: str) -> list[str]: - ... + def try_list_files(self, path: str) -> list[str]: ... def load_file(self, path: str) -> BaseArtifact: try: @@ -74,8 +73,7 @@ def load_file(self, path: str) -> BaseArtifact: return ErrorArtifact(f"Failed to load file: {str(e)}") @abstractmethod - def try_load_file(self, path: str) -> bytes: - ... + def try_load_file(self, path: str) -> bytes: ... def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifact: try: @@ -100,5 +98,4 @@ def save_file(self, path: str, value: bytes | str) -> InfoArtifact | ErrorArtifa return ErrorArtifact(f"Failed to save file: {str(e)}") @abstractmethod - def try_save_file(self, path: str, value: bytes): - ... + def try_save_file(self, path: str, value: bytes): ... diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index b6dfffc5d..771fc30dc 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -89,14 +89,12 @@ def run_image_outpainting( raise Exception("Failed to run image outpainting") @abstractmethod - def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: - ... + def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: ... @abstractmethod def try_image_variation( self, prompts: list[str], image: ImageArtifact, negative_prompts: Optional[list[str]] = None - ) -> ImageArtifact: - ... + ) -> ImageArtifact: ... @abstractmethod def try_image_inpainting( @@ -105,8 +103,7 @@ def try_image_inpainting( image: ImageArtifact, mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, - ) -> ImageArtifact: - ... + ) -> ImageArtifact: ... @abstractmethod def try_image_outpainting( @@ -115,5 +112,4 @@ def try_image_outpainting( image: ImageArtifact, mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, - ) -> ImageArtifact: - ... + ) -> ImageArtifact: ... diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index aaf959038..327132f64 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -46,9 +46,9 @@ class OpenAiImageGenerationDriver(BaseImageGenerationDriver): quality: Union[Literal["standard"], Literal["hd"]] = field( default="standard", kw_only=True, metadata={"serializable": True} ) - image_size: ( - Union[Literal["256x256"], Literal["512x512"], Literal["1024x1024"], Literal["1024x1792"], Literal["1792x1024"]] - ) = field(default="1024x1024", kw_only=True, metadata={"serializable": True}) + image_size: Union[ + Literal["256x256"], Literal["512x512"], Literal["1024x1024"], Literal["1024x1792"], Literal["1792x1024"] + ] = field(default="1024x1024", kw_only=True, metadata={"serializable": True}) response_format: Literal["b64_json"] = field(default="b64_json", kw_only=True, metadata={"serializable": True}) def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: diff --git a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py index c32f02a60..328bbf4d7 100644 --- a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py @@ -12,8 +12,7 @@ @define class BaseImageGenerationModelDriver(SerializableMixin, ABC): @abstractmethod - def get_generated_image(self, response: dict) -> bytes: - ... + def get_generated_image(self, response: dict) -> bytes: ... @abstractmethod def text_to_image_request_parameters( @@ -23,8 +22,7 @@ def text_to_image_request_parameters( image_height: int, negative_prompts: Optional[list[str]] = None, seed: Optional[int] = None, - ) -> dict[str, Any]: - ... + ) -> dict[str, Any]: ... @abstractmethod def image_variation_request_parameters( @@ -33,8 +31,7 @@ def image_variation_request_parameters( image: ImageArtifact, negative_prompts: Optional[list[str]] = None, seed: Optional[int] = None, - ) -> dict[str, Any]: - ... + ) -> dict[str, Any]: ... @abstractmethod def image_inpainting_request_parameters( @@ -44,8 +41,7 @@ def image_inpainting_request_parameters( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, seed: Optional[int] = None, - ) -> dict[str, Any]: - ... + ) -> dict[str, Any]: ... @abstractmethod def image_outpainting_request_parameters( @@ -55,5 +51,4 @@ def image_outpainting_request_parameters( mask: ImageArtifact, negative_prompts: Optional[list[str]] = None, seed: Optional[int] = None, - ) -> dict[str, Any]: - ... + ) -> dict[str, Any]: ... diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 6cde398b6..5018b42e4 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -151,6 +151,6 @@ def get_generated_image(self, response: dict) -> bytes: if image_response.get("finishReason") == "ERROR": raise Exception(f"Image generation failed: {image_response.get('finishReason')}") elif image_response.get("finishReason") == "CONTENT_FILTERED": - logging.warning(f"Image generation triggered content filter and may be blurred") + logging.warning("Image generation triggered content filter and may be blurred") return base64.decodebytes(bytes(image_response.get("base64"), "utf-8")) diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 369cb13c6..8f7425732 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -42,5 +42,4 @@ def query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: raise Exception("image query driver failed after all retry attempts") @abstractmethod - def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: - ... + def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: ... diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index b8f677507..1dea5ee14 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -8,7 +8,7 @@ @define class DummyImageQueryDriver(BaseImageQueryDriver): model: str = field(init=False) - max_tokens: int = field(init=False) + max_tokens: int = field(init=False) # pyright: ignore[reportGeneralTypeIssues] def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: raise DummyException(__class__.__name__, "try_query") diff --git a/griptape/drivers/image_query_model/base_image_query_model_driver.py b/griptape/drivers/image_query_model/base_image_query_model_driver.py index 46320f945..9bddbb979 100644 --- a/griptape/drivers/image_query_model/base_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/base_image_query_model_driver.py @@ -8,9 +8,7 @@ @define class BaseImageQueryModelDriver(SerializableMixin, ABC): @abstractmethod - def image_query_request_parameters(self, query: str, images: list[ImageArtifact], max_tokens: int) -> dict: - ... + def image_query_request_parameters(self, query: str, images: list[ImageArtifact], max_tokens: int) -> dict: ... @abstractmethod - def process_output(self, output: dict) -> TextArtifact: - ... + def process_output(self, output: dict) -> TextArtifact: ... diff --git a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py index caa646ba7..df7dd326a 100644 --- a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py @@ -1,6 +1,5 @@ from __future__ import annotations -from typing import Optional -from attr import field, define +from attr import define from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryModelDriver diff --git a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py index 8a9f2cd9e..28299a7e4 100644 --- a/griptape/drivers/memory/conversation/base_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/base_conversation_memory_driver.py @@ -9,9 +9,7 @@ class BaseConversationMemoryDriver(SerializableMixin, ABC): @abstractmethod - def store(self, memory: BaseConversationMemory) -> None: - ... + def store(self, memory: BaseConversationMemory) -> None: ... @abstractmethod - def load(self) -> Optional[BaseConversationMemory]: - ... + def load(self) -> Optional[BaseConversationMemory]: ... diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index 2f7607b00..ef6a35bcf 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -108,9 +108,7 @@ def default_prompt_stack_to_string_converter(self, prompt_stack: PromptStack) -> return "\n\n".join(prompt_lines) @abstractmethod - def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - ... + def try_run(self, prompt_stack: PromptStack) -> TextArtifact: ... @abstractmethod - def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - ... + def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: ... diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index f651f0482..07ae7717d 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -46,7 +46,10 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: raise Exception("model response is empty") def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - result = self.client.generate(**self._base_params(prompt_stack), stream=True) + result = self.client.generate( + **self._base_params(prompt_stack), + stream=True, # pyright: ignore[reportCallIssue] + ) for chunk in result: yield TextArtifact(value=chunk.text) diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index c1e2db2fd..a1a6f31d5 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -1,15 +1,14 @@ from __future__ import annotations -from typing import TYPE_CHECKING + from collections.abc import Iterator -from os import environ -from griptape.utils import PromptStack, import_optional_dependency +from typing import TYPE_CHECKING -environ["TRANSFORMERS_VERBOSITY"] = "error" +from attr import Factory, define, field -from attr import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer +from griptape.utils import PromptStack, import_optional_dependency if TYPE_CHECKING: from huggingface_hub import InferenceClient diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 2f8b307aa..d93a3a10c 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -1,15 +1,11 @@ from collections.abc import Iterator -from os import environ -from griptape.utils import PromptStack +from attr import Factory, define, field -environ["TRANSFORMERS_VERBOSITY"] = "error" - -from attr import define, field, Factory -from griptape.utils import import_optional_dependency from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import HuggingFaceTokenizer +from griptape.utils import PromptStack, import_optional_dependency @define diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index 944ed1456..eee6e2d97 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -7,7 +7,6 @@ from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer -from typing import Tuple, Type import dateparser from datetime import datetime, timedelta diff --git a/griptape/drivers/prompt/openai_completion_prompt_driver.py b/griptape/drivers/prompt/openai_completion_prompt_driver.py index cc334ae3d..92ae4f36f 100644 --- a/griptape/drivers/prompt/openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/openai_completion_prompt_driver.py @@ -5,7 +5,6 @@ from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver from griptape.tokenizers import OpenAiTokenizer -from typing import Tuple, Type import openai diff --git a/griptape/drivers/prompt_model/base_prompt_model_driver.py b/griptape/drivers/prompt_model/base_prompt_model_driver.py index b4315dc38..9738127db 100644 --- a/griptape/drivers/prompt_model/base_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/base_prompt_model_driver.py @@ -17,17 +17,13 @@ class BasePromptModelDriver(SerializableMixin, ABC): @property @abstractmethod - def tokenizer(self) -> BaseTokenizer: - ... + def tokenizer(self) -> BaseTokenizer: ... @abstractmethod - def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str | list | dict: - ... + def prompt_stack_to_model_input(self, prompt_stack: PromptStack) -> str | list | dict: ... @abstractmethod - def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: - ... + def prompt_stack_to_model_params(self, prompt_stack: PromptStack) -> dict: ... @abstractmethod - def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: - ... + def process_output(self, output: list[dict] | str | bytes) -> TextArtifact: ... diff --git a/griptape/drivers/sql/base_sql_driver.py b/griptape/drivers/sql/base_sql_driver.py index 93762629a..95d1d0fa2 100644 --- a/griptape/drivers/sql/base_sql_driver.py +++ b/griptape/drivers/sql/base_sql_driver.py @@ -11,13 +11,10 @@ class RowResult: cells: dict[str, Any] @abstractmethod - def execute_query(self, query: str) -> Optional[list[RowResult]]: - ... + def execute_query(self, query: str) -> Optional[list[RowResult]]: ... @abstractmethod - def execute_query_raw(self, query: str) -> Optional[list[dict[str, Any]]]: - ... + def execute_query_raw(self, query: str) -> Optional[list[dict[str, Any]]]: ... @abstractmethod - def get_table_schema(self, table_name: str, schema: Optional[str] = None) -> Optional[str]: - ... + def get_table_schema(self, table_name: str, schema: Optional[str] = None) -> Optional[str]: ... diff --git a/griptape/drivers/structure_run/base_structure_run_driver.py b/griptape/drivers/structure_run/base_structure_run_driver.py index 8e10fb231..5c188a18d 100644 --- a/griptape/drivers/structure_run/base_structure_run_driver.py +++ b/griptape/drivers/structure_run/base_structure_run_driver.py @@ -11,5 +11,4 @@ def run(self, *args: BaseArtifact) -> BaseArtifact: return self.try_run(*args) @abstractmethod - def try_run(self, *args: BaseArtifact) -> BaseArtifact: - ... + def try_run(self, *args: BaseArtifact) -> BaseArtifact: ... diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index 58a911b1a..e1365a69f 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -40,5 +40,4 @@ def run_text_to_audio(self, prompts: list[str]) -> AudioArtifact: raise Exception("Failed to run text to audio generation") @abstractmethod - def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: - ... + def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: ... diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py index 03adc10ce..ca109c8eb 100644 --- a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -1,4 +1,3 @@ -from typing import Optional from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py index c3aeefd26..cf342b87b 100644 --- a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any +from typing import Any from attr import define, field, Factory @@ -8,9 +8,6 @@ from griptape.drivers import BaseTextToSpeechDriver from griptape.utils import import_optional_dependency -if TYPE_CHECKING: - from elevenlabs.client import ElevenLabs - @define class ElevenLabsTextToSpeechDriver(BaseTextToSpeechDriver): diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index 049422259..47eb7d0d1 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -1,12 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional -from attr import define, field, Factory +from typing import Optional +from attr import define from griptape.drivers import BaseVectorStoreDriver, MongoDbAtlasVectorStoreDriver -from griptape.utils import import_optional_dependency - -if TYPE_CHECKING: - from pymongo import MongoClient - from pymongo.collection import Collection @define diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 33020482e..0667df8a9 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -78,8 +78,7 @@ def upsert_text( ) @abstractmethod - def delete_vector(self, vector_id: str) -> None: - ... + def delete_vector(self, vector_id: str) -> None: ... @abstractmethod def upsert_vector( @@ -89,16 +88,13 @@ def upsert_vector( namespace: Optional[str] = None, meta: Optional[dict] = None, **kwargs, - ) -> str: - ... + ) -> str: ... @abstractmethod - def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[Entry]: - ... + def load_entry(self, vector_id: str, namespace: Optional[str] = None) -> Optional[Entry]: ... @abstractmethod - def load_entries(self, namespace: Optional[str] = None) -> list[Entry]: - ... + def load_entries(self, namespace: Optional[str] = None) -> list[Entry]: ... @abstractmethod def query( @@ -108,5 +104,4 @@ def query( namespace: Optional[str] = None, include_vectors: bool = False, **kwargs, - ) -> list[QueryResult]: - ... + ) -> list[QueryResult]: ... diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 5ae760b27..100c75d79 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Optional, List, Dict, Any, TYPE_CHECKING +from typing import Optional, Any, TYPE_CHECKING from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver from griptape.artifacts import TextArtifact diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index e132206af..41bae7254 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import Optional, Tuple, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING from griptape import utils import logging from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 02f2f4268..29d5afb67 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -1,5 +1,4 @@ import uuid -from logging import exception from typing import Optional, Any, cast from attr import define, field, Factory from dataclasses import dataclass diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index 3772818ab..b347bfa41 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -3,7 +3,7 @@ import logging import numpy as np from griptape.utils import import_optional_dependency, str_to_hash -from typing import Optional, List, TYPE_CHECKING, Dict, Any +from typing import Optional, TYPE_CHECKING from attr import define, field, Factory from griptape.drivers import BaseVectorStoreDriver diff --git a/griptape/drivers/web_scraper/base_web_scraper_driver.py b/griptape/drivers/web_scraper/base_web_scraper_driver.py index bd66cca0a..ae39f8eac 100644 --- a/griptape/drivers/web_scraper/base_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/base_web_scraper_driver.py @@ -5,5 +5,4 @@ class BaseWebScraperDriver(ABC): @abstractmethod - def scrape_url(self, url: str) -> TextArtifact: - ... + def scrape_url(self, url: str) -> TextArtifact: ... diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index 94c26d287..760a77d39 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -42,5 +42,4 @@ def min_response_tokens(self) -> int: @abstractmethod def extract( self, text: str | ListArtifact, *, rulesets: Optional[list[Ruleset]] = None, **kwargs - ) -> ListArtifact | ErrorArtifact: - ... + ) -> ListArtifact | ErrorArtifact: ... diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index e1112075d..696abd6d3 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -7,7 +7,7 @@ from griptape.utils import PromptStack from griptape.engines import BaseExtractionEngine from griptape.utils import J2 -from griptape.rules import Ruleset, rule +from griptape.rules import Ruleset @define diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index b63983c57..73dd5ac74 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -14,8 +14,7 @@ class BaseImageGenerationEngine(ABC): image_generation_driver: BaseImageGenerationDriver = field(kw_only=True) @abstractmethod - def run(self, prompts: list[str], *args, rulesets: Optional[list[Ruleset]], **kwargs) -> ImageArtifact: - ... + def run(self, prompts: list[str], *args, rulesets: Optional[list[Ruleset]], **kwargs) -> ImageArtifact: ... def _ruleset_to_prompts(self, prompts: Optional[list[str]], rulesets: Optional[list[Ruleset]]) -> list[str]: if not prompts: diff --git a/griptape/engines/image/prompt_image_generation_engine.py b/griptape/engines/image/prompt_image_generation_engine.py index d9f5493a1..c7d304beb 100644 --- a/griptape/engines/image/prompt_image_generation_engine.py +++ b/griptape/engines/image/prompt_image_generation_engine.py @@ -1,6 +1,5 @@ from __future__ import annotations -from abc import abstractmethod from attr import define from typing import Optional diff --git a/griptape/engines/query/base_query_engine.py b/griptape/engines/query/base_query_engine.py index 3851e8531..9477b3bd0 100644 --- a/griptape/engines/query/base_query_engine.py +++ b/griptape/engines/query/base_query_engine.py @@ -17,17 +17,13 @@ def query( rulesets: Optional[list[Ruleset]] = None, top_n: Optional[int] = None, filter: Optional[dict] = None, - ) -> TextArtifact: - ... + ) -> TextArtifact: ... @abstractmethod - def load_artifacts(self, namespace: str) -> ListArtifact: - ... + def load_artifacts(self, namespace: str) -> ListArtifact: ... @abstractmethod - def upsert_text_artifact(self, artifact: TextArtifact, namespace: Optional[str] = None) -> str: - ... + def upsert_text_artifact(self, artifact: TextArtifact, namespace: Optional[str] = None) -> str: ... @abstractmethod - def upsert_text_artifacts(self, artifacts: list[TextArtifact], namespace: str) -> None: - ... + def upsert_text_artifacts(self, artifacts: list[TextArtifact], namespace: str) -> None: ... diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py index 7ca42f59f..34667d592 100644 --- a/griptape/engines/query/vector_query_engine.py +++ b/griptape/engines/query/vector_query_engine.py @@ -5,7 +5,7 @@ from griptape.utils import PromptStack from griptape.engines import BaseQueryEngine from griptape.utils.j2 import J2 -from griptape.rules import Ruleset, Rule +from griptape.rules import Ruleset if TYPE_CHECKING: from griptape.drivers import BaseVectorStoreDriver, BasePromptDriver diff --git a/griptape/engines/summary/base_summary_engine.py b/griptape/engines/summary/base_summary_engine.py index d464757ff..4a5aca520 100644 --- a/griptape/engines/summary/base_summary_engine.py +++ b/griptape/engines/summary/base_summary_engine.py @@ -11,5 +11,6 @@ def summarize_text(self, text: str, *, rulesets: Optional[list[Ruleset]] = None) return self.summarize_artifacts(ListArtifact([TextArtifact(text)]), rulesets=rulesets).value @abstractmethod - def summarize_artifacts(self, artifacts: ListArtifact, *, rulesets: Optional[list[Ruleset]] = None) -> TextArtifact: - ... + def summarize_artifacts( + self, artifacts: ListArtifact, *, rulesets: Optional[list[Ruleset]] = None + ) -> TextArtifact: ... diff --git a/griptape/events/base_image_generation_event.py b/griptape/events/base_image_generation_event.py index 244310469..5cc516b8e 100644 --- a/griptape/events/base_image_generation_event.py +++ b/griptape/events/base_image_generation_event.py @@ -5,5 +5,4 @@ @define -class BaseImageGenerationEvent(BaseMediaGenerationEvent, ABC): - ... +class BaseImageGenerationEvent(BaseMediaGenerationEvent, ABC): ... diff --git a/griptape/events/base_image_query_event.py b/griptape/events/base_image_query_event.py index df1db1fb5..8ed796072 100644 --- a/griptape/events/base_image_query_event.py +++ b/griptape/events/base_image_query_event.py @@ -6,5 +6,4 @@ @define -class BaseImageQueryEvent(BaseEvent, ABC): - ... +class BaseImageQueryEvent(BaseEvent, ABC): ... diff --git a/griptape/events/base_media_generation_event.py b/griptape/events/base_media_generation_event.py index b3a9bcb33..0280c41aa 100644 --- a/griptape/events/base_media_generation_event.py +++ b/griptape/events/base_media_generation_event.py @@ -5,5 +5,4 @@ @define -class BaseMediaGenerationEvent(BaseEvent, ABC): - ... +class BaseMediaGenerationEvent(BaseEvent, ABC): ... diff --git a/griptape/events/base_text_to_speech_event.py b/griptape/events/base_text_to_speech_event.py index f4d032d0d..d73b3a663 100644 --- a/griptape/events/base_text_to_speech_event.py +++ b/griptape/events/base_text_to_speech_event.py @@ -6,5 +6,4 @@ @define -class BaseTextToSpeechEvent(BaseMediaGenerationEvent, ABC): - ... +class BaseTextToSpeechEvent(BaseMediaGenerationEvent, ABC): ... diff --git a/griptape/events/finish_actions_subtask_event.py b/griptape/events/finish_actions_subtask_event.py index 6623190ea..068efca0b 100644 --- a/griptape/events/finish_actions_subtask_event.py +++ b/griptape/events/finish_actions_subtask_event.py @@ -4,5 +4,4 @@ @define -class FinishActionsSubtaskEvent(BaseActionsSubtaskEvent): - ... +class FinishActionsSubtaskEvent(BaseActionsSubtaskEvent): ... diff --git a/griptape/events/finish_image_generation_event.py b/griptape/events/finish_image_generation_event.py index b74e074ef..1633ae246 100644 --- a/griptape/events/finish_image_generation_event.py +++ b/griptape/events/finish_image_generation_event.py @@ -6,5 +6,4 @@ @define -class FinishImageGenerationEvent(BaseImageGenerationEvent): - ... +class FinishImageGenerationEvent(BaseImageGenerationEvent): ... diff --git a/griptape/events/finish_structure_run_event.py b/griptape/events/finish_structure_run_event.py index 2a4688fb9..2ff7786d8 100644 --- a/griptape/events/finish_structure_run_event.py +++ b/griptape/events/finish_structure_run_event.py @@ -10,7 +10,7 @@ @define class FinishStructureRunEvent(BaseEvent): structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - output_task_input: Union[ - BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] - ] = field(kw_only=True, metadata={"serializable": True}) + output_task_input: Union[BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]]] = ( + field(kw_only=True, metadata={"serializable": True}) + ) output_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/finish_task_event.py b/griptape/events/finish_task_event.py index a237b4470..65b2ca4f2 100644 --- a/griptape/events/finish_task_event.py +++ b/griptape/events/finish_task_event.py @@ -4,5 +4,4 @@ @define -class FinishTaskEvent(BaseTaskEvent): - ... +class FinishTaskEvent(BaseTaskEvent): ... diff --git a/griptape/events/finish_text_to_speech_event.py b/griptape/events/finish_text_to_speech_event.py index 6b4366c88..95a38f87f 100644 --- a/griptape/events/finish_text_to_speech_event.py +++ b/griptape/events/finish_text_to_speech_event.py @@ -3,9 +3,7 @@ from attrs import define from .base_text_to_speech_event import BaseTextToSpeechEvent -from .base_image_generation_event import BaseImageGenerationEvent @define -class FinishTextToSpeechEvent(BaseTextToSpeechEvent): - ... +class FinishTextToSpeechEvent(BaseTextToSpeechEvent): ... diff --git a/griptape/events/start_actions_subtask_event.py b/griptape/events/start_actions_subtask_event.py index 0fda60dc0..eb3827daf 100644 --- a/griptape/events/start_actions_subtask_event.py +++ b/griptape/events/start_actions_subtask_event.py @@ -4,5 +4,4 @@ @define -class StartActionsSubtaskEvent(BaseActionsSubtaskEvent): - ... +class StartActionsSubtaskEvent(BaseActionsSubtaskEvent): ... diff --git a/griptape/events/start_prompt_event.py b/griptape/events/start_prompt_event.py index 8ca6d4f3d..7ab418adb 100644 --- a/griptape/events/start_prompt_event.py +++ b/griptape/events/start_prompt_event.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attrs import define from attrs import field from griptape.events.base_prompt_event import BasePromptEvent diff --git a/griptape/events/start_structure_run_event.py b/griptape/events/start_structure_run_event.py index 311d687a9..e75c5cd68 100644 --- a/griptape/events/start_structure_run_event.py +++ b/griptape/events/start_structure_run_event.py @@ -10,7 +10,7 @@ @define class StartStructureRunEvent(BaseEvent): structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - input_task_input: Union[ - BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]] - ] = field(kw_only=True, metadata={"serializable": True}) + input_task_input: Union[BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]]] = ( + field(kw_only=True, metadata={"serializable": True}) + ) input_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/start_task_event.py b/griptape/events/start_task_event.py index 3ee988c1f..bd4661c2f 100644 --- a/griptape/events/start_task_event.py +++ b/griptape/events/start_task_event.py @@ -4,5 +4,4 @@ @define -class StartTaskEvent(BaseTaskEvent): - ... +class StartTaskEvent(BaseTaskEvent): ... diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 092319b85..56c3e840c 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -18,8 +18,7 @@ class BaseLoader(ABC): encoding: Optional[str] = field(default=None, kw_only=True) @abstractmethod - def load(self, source: Any, *args, **kwargs) -> BaseArtifact | Sequence[BaseArtifact]: - ... + def load(self, source: Any, *args, **kwargs) -> BaseArtifact | Sequence[BaseArtifact]: ... def load_collection( self, sources: list[Any], *args, **kwargs diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index 99b779210..71908a3bc 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -1,7 +1,7 @@ from __future__ import annotations from io import BytesIO -from typing import Optional, TYPE_CHECKING, cast +from typing import Optional, cast from attr import define, field @@ -9,9 +9,6 @@ from griptape.artifacts import ImageArtifact from griptape.loaders import BaseLoader -if TYPE_CHECKING: - import PIL.Image as Image - @define class ImageLoader(BaseLoader): diff --git a/griptape/memory/meta/base_meta_entry.py b/griptape/memory/meta/base_meta_entry.py index 994e13f12..a7be50dda 100644 --- a/griptape/memory/meta/base_meta_entry.py +++ b/griptape/memory/meta/base_meta_entry.py @@ -6,5 +6,4 @@ @define -class BaseMetaEntry(SerializableMixin, ABC): - ... +class BaseMetaEntry(SerializableMixin, ABC): ... diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index 29d306422..85c90d3e1 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -41,9 +41,7 @@ def after_add_run(self) -> None: self.driver.store(self) @abstractmethod - def try_add_run(self, run: Run) -> None: - ... + def try_add_run(self, run: Run) -> None: ... @abstractmethod - def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: - ... + def to_prompt_stack(self, last_n: Optional[int] = None) -> PromptStack: ... diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index 29bc0327c..cb3d963be 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -2,27 +2,22 @@ from typing import Any from abc import ABC, abstractmethod from attr import define -from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact, BlobArtifact +from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact @define class BaseArtifactStorage(ABC): @abstractmethod - def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: - ... + def store_artifact(self, namespace: str, artifact: BaseArtifact) -> None: ... @abstractmethod - def load_artifacts(self, namespace: str) -> ListArtifact: - ... + def load_artifacts(self, namespace: str) -> ListArtifact: ... @abstractmethod - def can_store(self, artifact: BaseArtifact) -> bool: - ... + def can_store(self, artifact: BaseArtifact) -> bool: ... @abstractmethod - def summarize(self, namespace: str) -> TextArtifact | InfoArtifact: - ... + def summarize(self, namespace: str) -> TextArtifact | InfoArtifact: ... @abstractmethod - def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact | InfoArtifact: - ... + def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact | InfoArtifact: ... diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 104bb6f5e..e5cd73eb8 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Any +from typing import TYPE_CHECKING, Any from attr import define, field from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact from griptape.memory.task.storage import BaseArtifactStorage diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index d814a5510..597b151c0 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Type, Any, Callable +from typing import TYPE_CHECKING, Optional, Any, Callable from attr import define, field, Factory from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, ErrorArtifact, TextArtifact from griptape.memory.meta import ActionSubtaskMetaEntry @@ -28,7 +28,8 @@ def validate_artifact_storages(self, _, artifact_storage: dict[type, BaseArtifac seen_types.append(type(storage)) def get_storage_for(self, artifact: BaseArtifact) -> Optional[BaseArtifactStorage]: - find_storage = lambda a: next((v for k, v in self.artifact_storages.items() if isinstance(a, k)), None) + def find_storage(a): + return next((v for k, v in self.artifact_storages.items() if isinstance(a, k)), None) if isinstance(artifact, ListArtifact): if artifact.has_items(): diff --git a/griptape/mixins/actions_subtask_origin_mixin.py b/griptape/mixins/actions_subtask_origin_mixin.py index 6caa63b5d..01711140b 100644 --- a/griptape/mixins/actions_subtask_origin_mixin.py +++ b/griptape/mixins/actions_subtask_origin_mixin.py @@ -13,24 +13,19 @@ @define(slots=False) class ActionsSubtaskOriginMixin: @abstractmethod - def find_tool(self, tool_name: str) -> BaseTool: - ... + def find_tool(self, tool_name: str) -> BaseTool: ... @abstractmethod - def find_memory(self, memory_name: str) -> TaskMemory: - ... + def find_memory(self, memory_name: str) -> TaskMemory: ... @abstractmethod - def find_subtask(self, subtask_id: str) -> ActionsSubtask: - ... + def find_subtask(self, subtask_id: str) -> ActionsSubtask: ... @abstractmethod - def add_subtask(self, subtask: ActionsSubtask) -> ActionsSubtask: - ... + def add_subtask(self, subtask: ActionsSubtask) -> ActionsSubtask: ... @abstractmethod - def actions_schema(self) -> Schema: - ... + def actions_schema(self) -> Schema: ... def _actions_schema_for_tools(self, tools: list[BaseTool]) -> Schema: action_schemas = [] diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index 9cd28ab67..c3912649d 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -1,6 +1,5 @@ from __future__ import annotations -import warnings import logging import uuid from abc import ABC, abstractmethod @@ -274,8 +273,7 @@ def after_run(self) -> None: ) @abstractmethod - def add_task(self, task: BaseTask) -> BaseTask: - ... + def add_task(self, task: BaseTask) -> BaseTask: ... def run(self, *args) -> Structure: self.before_run() @@ -287,5 +285,4 @@ def run(self, *args) -> Structure: return result @abstractmethod - def try_run(self, *args) -> Structure: - ... + def try_run(self, *args) -> Structure: ... diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index f9d691768..2e5572aba 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -1,17 +1,12 @@ from __future__ import annotations -import os from abc import ABC -from attr import field, define +from attr import define -from griptape.artifacts import MediaArtifact -from griptape.loaders import ImageLoader from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin -from griptape.rules import Ruleset, Rule from griptape.tasks import BaseTask @define -class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): - ... +class BaseAudioGenerationTask(BlobArtifactFileOutputMixin, RuleMixin, BaseTask, ABC): ... diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 7c583763f..037a3e526 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -38,8 +38,7 @@ class State(Enum): @property @abstractmethod - def input(self) -> BaseArtifact | tuple[BaseArtifact, ...] | tuple[BaseArtifact, Sequence[BaseArtifact]]: - ... + def input(self) -> BaseArtifact | tuple[BaseArtifact, ...] | tuple[BaseArtifact, Sequence[BaseArtifact]]: ... @property def parents(self) -> list[BaseTask]: @@ -128,8 +127,7 @@ def reset(self) -> BaseTask: return self @abstractmethod - def run(self) -> BaseArtifact: - ... + def run(self) -> BaseArtifact: ... @property def full_context(self) -> dict[str, Any]: diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 5a8c49f9c..29077a055 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -23,9 +23,11 @@ class ImageQueryTask(BaseTask): """ _image_query_engine: ImageQueryEngine = field(default=None, kw_only=True, alias="image_query_engine") - _input: tuple[str, list[ImageArtifact]] | tuple[TextArtifact, list[ImageArtifact]] | Callable[ - [BaseTask], tuple[TextArtifact, list[ImageArtifact]] - ] = field(default=None, alias="input") + _input: ( + tuple[str, list[ImageArtifact]] + | tuple[TextArtifact, list[ImageArtifact]] + | Callable[[BaseTask], tuple[TextArtifact, list[ImageArtifact]]] + ) = field(default=None, alias="input") @property def input(self) -> tuple[TextArtifact, list[ImageArtifact]]: diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 203a6c2ba..7b0ffd06b 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -29,9 +29,10 @@ class OutpaintingImageGenerationTask(BaseImageGenerationTask): _image_generation_engine: OutpaintingImageGenerationEngine = field( default=None, kw_only=True, alias="image_generation_engine" ) - _input: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[ - [BaseTask], tuple[TextArtifact, ImageArtifact, ImageArtifact] - ] = field(default=None) + _input: ( + tuple[str | TextArtifact, ImageArtifact, ImageArtifact] + | Callable[[BaseTask], tuple[TextArtifact, ImageArtifact, ImageArtifact]] + ) = field(default=None) @property def input(self) -> tuple[TextArtifact, ImageArtifact, ImageArtifact]: diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 570e13e3a..28f30e66c 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -38,8 +38,7 @@ def count_output_tokens_left(self, text: str | list) -> int: return 0 @abstractmethod - def count_tokens(self, text: str | list[dict]) -> int: - ... + def count_tokens(self, text: str | list[dict]) -> int: ... def _default_max_input_tokens(self) -> int: tokens = next((v for k, v in self.MODEL_PREFIXES_TO_MAX_INPUT_TOKENS.items() if self.model.startswith(k)), None) diff --git a/griptape/tokenizers/cohere_tokenizer.py b/griptape/tokenizers/cohere_tokenizer.py index 1e57b7b6b..4856b7ff7 100644 --- a/griptape/tokenizers/cohere_tokenizer.py +++ b/griptape/tokenizers/cohere_tokenizer.py @@ -16,6 +16,6 @@ class CohereTokenizer(BaseTokenizer): def count_tokens(self, text: str | list) -> int: if isinstance(text, str): - return len(self.client.tokenize(text=text).tokens) + return len(self.client.tokenize(text=text, model=self.model).tokens) else: raise ValueError("Text must be a string.") diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index 10c1bbada..4c548d8ab 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -14,7 +14,7 @@ class HuggingFaceTokenizer(BaseTokenizer): max_input_tokens: int = field( default=Factory(lambda self: self.tokenizer.model_max_length, takes_self=True), kw_only=True ) - max_output_tokens: int = field(kw_only=True) + max_output_tokens: int = field(kw_only=True) # pyright: ignore[reportGeneralTypeIssues] def count_tokens(self, text: str | list) -> int: if isinstance(text, str): diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam_client/tool.py index 78193ec22..0c94be90e 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam_client/tool.py @@ -59,7 +59,9 @@ def list_user_policies(self, params: dict) -> ListArtifact | ErrorArtifact: policy_names = policies["PolicyNames"] attached_policies = self.iam_client.list_attached_user_policies(UserName=params["values"]["user_name"]) - attached_policy_names = [p["PolicyName"] for p in attached_policies["AttachedPolicies"]] + attached_policy_names = [ + p["PolicyName"] for p in attached_policies["AttachedPolicies"] if "PolicyName" in p + ] return ListArtifact([TextArtifact(str(p)) for p in policy_names + attached_policy_names]) except Exception as e: diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3_client/tool.py index 9db5e2728..fc63f3988 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3_client/tool.py @@ -89,6 +89,9 @@ def list_objects(self, params: dict) -> ListArtifact | ErrorArtifact: try: objects = self.s3_client.list_objects_v2(Bucket=params["values"]["bucket_name"]) + if "Contents" not in objects: + return ErrorArtifact("no objects found in the bucket") + return ListArtifact([TextArtifact(str(o)) for o in objects["Contents"]]) except Exception as e: return ErrorArtifact(f"error listing objects in bucket: {e}") diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index 938896e55..761b38754 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -45,7 +45,7 @@ class GoogleDriveClient(BaseGoogleClient): ) def list_files(self, params: dict) -> ListArtifact | ErrorArtifact: values = params["values"] - from google.auth.exceptions import MalformedError # pyright: ignore + from google.auth.exceptions import MalformedError # pyright: ignore[reportMissingImports] folder_path = values.get("folder_path", self.DEFAULT_FOLDER_PATH) @@ -168,8 +168,8 @@ def save_content_to_drive(self, params: dict) -> ErrorArtifact | InfoArtifact: } ) def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: - from google.auth.exceptions import MalformedError # pyright: ignore - from googleapiclient.errors import HttpError # pyright: ignore + from google.auth.exceptions import MalformedError + from googleapiclient.errors import HttpError # pyright: ignore[reportMissingImports] values = params["values"] downloaded_files = [] @@ -212,7 +212,10 @@ def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: "search_mode", description="File search mode. Use 'name' to search in file name or " "'content' to search in file content", - ): Or("name", "content"), + ): Or( + "name", # pyright: ignore [reportArgumentType] + "content", # pyright: ignore [reportArgumentType] + ), Literal( "search_query", description="Query to search for. If search_mode is 'name', it's the file name. If 'content', " @@ -229,8 +232,8 @@ def download_files(self, params: dict) -> ListArtifact | ErrorArtifact: } ) def search_files(self, params: dict) -> ListArtifact | ErrorArtifact: - from google.auth.exceptions import MalformedError # pyright: ignore - from googleapiclient.errors import HttpError # pyright: ignore + from google.auth.exceptions import MalformedError + from googleapiclient.errors import HttpError # pyright: ignore[reportMissingImports] values = params["values"] @@ -285,14 +288,18 @@ def search_files(self, params: dict) -> ListArtifact | ErrorArtifact: "role", default="reader", description="The role to give to the user, e.g., 'reader', 'writer', or 'commenter'", - ): Or("reader", "writer", "commenter"), + ): Or( + "reader", # pyright: ignore [reportArgumentType] + "writer", # pyright: ignore [reportArgumentType] + "commenter", # pyright: ignore [reportArgumentType] + ), } ), } ) def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: - from google.auth.exceptions import MalformedError # pyright: ignore - from googleapiclient.errors import HttpError # pyright: ignore + from google.auth.exceptions import MalformedError + from googleapiclient.errors import HttpError # pyright: ignore [reportMissingImports] values = params["values"] file_path = values.get("file_path") @@ -328,7 +335,7 @@ def share_file(self, params: dict) -> InfoArtifact | ErrorArtifact: def _save_to_drive( self, filename: str, value: Any, parent_folder_id: Optional[str] = None ) -> InfoArtifact | ErrorArtifact: - from googleapiclient.http import MediaIoBaseUpload # pyright: ignore + from googleapiclient.http import MediaIoBaseUpload # pyright: ignore[reportMissingImports] service = self._build_client(self.DRIVE_FILE_SCOPES, self.SERVICE_NAME, self.SERVICE_VERSION, self.owner_email) diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index 0da9fa200..b7234aca2 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -8,7 +8,7 @@ @define class TaskMemoryClient(BaseTool): - off_prompt: bool = field(kw_only=True) + off_prompt: bool = field(kw_only=True) # pyright: ignore[reportGeneralTypeIssues] @activity( config={ diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index cae078526..38b3e30a9 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING from attr import define, field if TYPE_CHECKING: diff --git a/poetry.lock b/poetry.lock index d40bc7c93..b46742b6c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,88 +1,88 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.9.1" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, - {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, - {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, - {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, - {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, - {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, - {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, - {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, - {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, - {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, - {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, - {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -147,13 +147,13 @@ vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -228,29 +228,33 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "babel" -version = "2.14.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = true -python-versions = ">=3.7,<4.0" +name = "backports-tarfile" +version = "1.1.1" +description = "Backport of CPython tarfile module" +optional = false +python-versions = ">=3.8" files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, + {file = "backports.tarfile-1.1.1-py3-none-any.whl", hash = "sha256:73e0179647803d3726d82e76089d01d8549ceca9bace469953fcb4d97cf2d417"}, + {file = "backports_tarfile-1.1.1.tar.gz", hash = "sha256:9c2ef9696cb73374f7164e17fc761389393ca76777036f5aad42e8b93fcd8009"}, ] +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] + [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -272,65 +276,19 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "23.12.1" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, - {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, - {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, - {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, - {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, - {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, - {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, - {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, - {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, - {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, - {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, - {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, - {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, - {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, - {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "boto3" -version = "1.34.24" +version = "1.34.106" description = "The AWS SDK for Python" optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "boto3-1.34.24-py3-none-any.whl", hash = "sha256:795803812b78260cfe019ef65021ec9e8049bfb6a027564e1a3b59c1a4a11106"}, - {file = "boto3-1.34.24.tar.gz", hash = "sha256:791523f41b5e731c8ac0d2f65b978348fb6c92f02e0dbc9a7bc0b3760195cc60"}, + {file = "boto3-1.34.106-py3-none-any.whl", hash = "sha256:d3be4e1dd5d546a001cd4da805816934cbde9d395316546e9411fec341ade5cf"}, + {file = "boto3-1.34.106.tar.gz", hash = "sha256:6165b8cf1c7e625628ab28b32f9027064c8f5e5fca1c38d7fc228cd22069a19f"}, ] [package.dependencies] -botocore = ">=1.34.24,<1.35.0" +botocore = ">=1.34.106,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -339,13 +297,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "boto3-stubs" -version = "1.34.24" -description = "Type annotations for boto3 1.34.24 generated with mypy-boto3-builder 7.23.1" +version = "1.34.105" +description = "Type annotations for boto3 1.34.105 generated with mypy-boto3-builder 7.24.0" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-stubs-1.34.24.tar.gz", hash = "sha256:9d7de485b09e474c1a46f11d46b493c57b888170c568a37966421a3b9809bd8e"}, - {file = "boto3_stubs-1.34.24-py3-none-any.whl", hash = "sha256:ec04088474b3977878274c88289a3f3892e4bd3427eb26c5096b30917bc9ee5f"}, + {file = "boto3_stubs-1.34.105-py3-none-any.whl", hash = "sha256:ba03524668d5edb5e177d11df7937e769bd52e7d7adbee20762353f72b775eb5"}, + {file = "boto3_stubs-1.34.105.tar.gz", hash = "sha256:6aec0131447885a24db82279609a08130c5d0b0f738dfc70a59ff3f453c04a68"}, ] [package.dependencies] @@ -364,7 +322,7 @@ account = ["mypy-boto3-account (>=1.34.0,<1.35.0)"] acm = ["mypy-boto3-acm (>=1.34.0,<1.35.0)"] acm-pca = ["mypy-boto3-acm-pca (>=1.34.0,<1.35.0)"] alexaforbusiness = ["mypy-boto3-alexaforbusiness (>=1.34.0,<1.35.0)"] -all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-alexaforbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-backupstorage (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-honeycode (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-roborunner (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mobile (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] +all = ["mypy-boto3-accessanalyzer (>=1.34.0,<1.35.0)", "mypy-boto3-account (>=1.34.0,<1.35.0)", "mypy-boto3-acm (>=1.34.0,<1.35.0)", "mypy-boto3-acm-pca (>=1.34.0,<1.35.0)", "mypy-boto3-alexaforbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-amp (>=1.34.0,<1.35.0)", "mypy-boto3-amplify (>=1.34.0,<1.35.0)", "mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)", "mypy-boto3-amplifyuibuilder (>=1.34.0,<1.35.0)", "mypy-boto3-apigateway (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewaymanagementapi (>=1.34.0,<1.35.0)", "mypy-boto3-apigatewayv2 (>=1.34.0,<1.35.0)", "mypy-boto3-appconfig (>=1.34.0,<1.35.0)", "mypy-boto3-appconfigdata (>=1.34.0,<1.35.0)", "mypy-boto3-appfabric (>=1.34.0,<1.35.0)", "mypy-boto3-appflow (>=1.34.0,<1.35.0)", "mypy-boto3-appintegrations (>=1.34.0,<1.35.0)", "mypy-boto3-application-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-application-insights (>=1.34.0,<1.35.0)", "mypy-boto3-applicationcostprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-appmesh (>=1.34.0,<1.35.0)", "mypy-boto3-apprunner (>=1.34.0,<1.35.0)", "mypy-boto3-appstream (>=1.34.0,<1.35.0)", "mypy-boto3-appsync (>=1.34.0,<1.35.0)", "mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)", "mypy-boto3-artifact (>=1.34.0,<1.35.0)", "mypy-boto3-athena (>=1.34.0,<1.35.0)", "mypy-boto3-auditmanager (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling (>=1.34.0,<1.35.0)", "mypy-boto3-autoscaling-plans (>=1.34.0,<1.35.0)", "mypy-boto3-b2bi (>=1.34.0,<1.35.0)", "mypy-boto3-backup (>=1.34.0,<1.35.0)", "mypy-boto3-backup-gateway (>=1.34.0,<1.35.0)", "mypy-boto3-backupstorage (>=1.34.0,<1.35.0)", "mypy-boto3-batch (>=1.34.0,<1.35.0)", "mypy-boto3-bcm-data-exports (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-billingconductor (>=1.34.0,<1.35.0)", "mypy-boto3-braket (>=1.34.0,<1.35.0)", "mypy-boto3-budgets (>=1.34.0,<1.35.0)", "mypy-boto3-ce (>=1.34.0,<1.35.0)", "mypy-boto3-chatbot (>=1.34.0,<1.35.0)", "mypy-boto3-chime (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-meetings (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-messaging (>=1.34.0,<1.35.0)", "mypy-boto3-chime-sdk-voice (>=1.34.0,<1.35.0)", "mypy-boto3-cleanrooms (>=1.34.0,<1.35.0)", "mypy-boto3-cleanroomsml (>=1.34.0,<1.35.0)", "mypy-boto3-cloud9 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudcontrol (>=1.34.0,<1.35.0)", "mypy-boto3-clouddirectory (>=1.34.0,<1.35.0)", "mypy-boto3-cloudformation (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront (>=1.34.0,<1.35.0)", "mypy-boto3-cloudfront-keyvaluestore (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsm (>=1.34.0,<1.35.0)", "mypy-boto3-cloudhsmv2 (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearch (>=1.34.0,<1.35.0)", "mypy-boto3-cloudsearchdomain (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail (>=1.34.0,<1.35.0)", "mypy-boto3-cloudtrail-data (>=1.34.0,<1.35.0)", "mypy-boto3-cloudwatch (>=1.34.0,<1.35.0)", "mypy-boto3-codeartifact (>=1.34.0,<1.35.0)", "mypy-boto3-codebuild (>=1.34.0,<1.35.0)", "mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)", "mypy-boto3-codecommit (>=1.34.0,<1.35.0)", "mypy-boto3-codeconnections (>=1.34.0,<1.35.0)", "mypy-boto3-codedeploy (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)", "mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)", "mypy-boto3-codeguruprofiler (>=1.34.0,<1.35.0)", "mypy-boto3-codepipeline (>=1.34.0,<1.35.0)", "mypy-boto3-codestar (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-connections (>=1.34.0,<1.35.0)", "mypy-boto3-codestar-notifications (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-identity (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-idp (>=1.34.0,<1.35.0)", "mypy-boto3-cognito-sync (>=1.34.0,<1.35.0)", "mypy-boto3-comprehend (>=1.34.0,<1.35.0)", "mypy-boto3-comprehendmedical (>=1.34.0,<1.35.0)", "mypy-boto3-compute-optimizer (>=1.34.0,<1.35.0)", "mypy-boto3-config (>=1.34.0,<1.35.0)", "mypy-boto3-connect (>=1.34.0,<1.35.0)", "mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)", "mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)", "mypy-boto3-connectcases (>=1.34.0,<1.35.0)", "mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)", "mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)", "mypy-boto3-controltower (>=1.34.0,<1.35.0)", "mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)", "mypy-boto3-cur (>=1.34.0,<1.35.0)", "mypy-boto3-customer-profiles (>=1.34.0,<1.35.0)", "mypy-boto3-databrew (>=1.34.0,<1.35.0)", "mypy-boto3-dataexchange (>=1.34.0,<1.35.0)", "mypy-boto3-datapipeline (>=1.34.0,<1.35.0)", "mypy-boto3-datasync (>=1.34.0,<1.35.0)", "mypy-boto3-datazone (>=1.34.0,<1.35.0)", "mypy-boto3-dax (>=1.34.0,<1.35.0)", "mypy-boto3-deadline (>=1.34.0,<1.35.0)", "mypy-boto3-detective (>=1.34.0,<1.35.0)", "mypy-boto3-devicefarm (>=1.34.0,<1.35.0)", "mypy-boto3-devops-guru (>=1.34.0,<1.35.0)", "mypy-boto3-directconnect (>=1.34.0,<1.35.0)", "mypy-boto3-discovery (>=1.34.0,<1.35.0)", "mypy-boto3-dlm (>=1.34.0,<1.35.0)", "mypy-boto3-dms (>=1.34.0,<1.35.0)", "mypy-boto3-docdb (>=1.34.0,<1.35.0)", "mypy-boto3-docdb-elastic (>=1.34.0,<1.35.0)", "mypy-boto3-drs (>=1.34.0,<1.35.0)", "mypy-boto3-ds (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodb (>=1.34.0,<1.35.0)", "mypy-boto3-dynamodbstreams (>=1.34.0,<1.35.0)", "mypy-boto3-ebs (>=1.34.0,<1.35.0)", "mypy-boto3-ec2 (>=1.34.0,<1.35.0)", "mypy-boto3-ec2-instance-connect (>=1.34.0,<1.35.0)", "mypy-boto3-ecr (>=1.34.0,<1.35.0)", "mypy-boto3-ecr-public (>=1.34.0,<1.35.0)", "mypy-boto3-ecs (>=1.34.0,<1.35.0)", "mypy-boto3-efs (>=1.34.0,<1.35.0)", "mypy-boto3-eks (>=1.34.0,<1.35.0)", "mypy-boto3-eks-auth (>=1.34.0,<1.35.0)", "mypy-boto3-elastic-inference (>=1.34.0,<1.35.0)", "mypy-boto3-elasticache (>=1.34.0,<1.35.0)", "mypy-boto3-elasticbeanstalk (>=1.34.0,<1.35.0)", "mypy-boto3-elastictranscoder (>=1.34.0,<1.35.0)", "mypy-boto3-elb (>=1.34.0,<1.35.0)", "mypy-boto3-elbv2 (>=1.34.0,<1.35.0)", "mypy-boto3-emr (>=1.34.0,<1.35.0)", "mypy-boto3-emr-containers (>=1.34.0,<1.35.0)", "mypy-boto3-emr-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-entityresolution (>=1.34.0,<1.35.0)", "mypy-boto3-es (>=1.34.0,<1.35.0)", "mypy-boto3-events (>=1.34.0,<1.35.0)", "mypy-boto3-evidently (>=1.34.0,<1.35.0)", "mypy-boto3-finspace (>=1.34.0,<1.35.0)", "mypy-boto3-finspace-data (>=1.34.0,<1.35.0)", "mypy-boto3-firehose (>=1.34.0,<1.35.0)", "mypy-boto3-fis (>=1.34.0,<1.35.0)", "mypy-boto3-fms (>=1.34.0,<1.35.0)", "mypy-boto3-forecast (>=1.34.0,<1.35.0)", "mypy-boto3-forecastquery (>=1.34.0,<1.35.0)", "mypy-boto3-frauddetector (>=1.34.0,<1.35.0)", "mypy-boto3-freetier (>=1.34.0,<1.35.0)", "mypy-boto3-fsx (>=1.34.0,<1.35.0)", "mypy-boto3-gamelift (>=1.34.0,<1.35.0)", "mypy-boto3-glacier (>=1.34.0,<1.35.0)", "mypy-boto3-globalaccelerator (>=1.34.0,<1.35.0)", "mypy-boto3-glue (>=1.34.0,<1.35.0)", "mypy-boto3-grafana (>=1.34.0,<1.35.0)", "mypy-boto3-greengrass (>=1.34.0,<1.35.0)", "mypy-boto3-greengrassv2 (>=1.34.0,<1.35.0)", "mypy-boto3-groundstation (>=1.34.0,<1.35.0)", "mypy-boto3-guardduty (>=1.34.0,<1.35.0)", "mypy-boto3-health (>=1.34.0,<1.35.0)", "mypy-boto3-healthlake (>=1.34.0,<1.35.0)", "mypy-boto3-honeycode (>=1.34.0,<1.35.0)", "mypy-boto3-iam (>=1.34.0,<1.35.0)", "mypy-boto3-identitystore (>=1.34.0,<1.35.0)", "mypy-boto3-imagebuilder (>=1.34.0,<1.35.0)", "mypy-boto3-importexport (>=1.34.0,<1.35.0)", "mypy-boto3-inspector (>=1.34.0,<1.35.0)", "mypy-boto3-inspector-scan (>=1.34.0,<1.35.0)", "mypy-boto3-inspector2 (>=1.34.0,<1.35.0)", "mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-iot (>=1.34.0,<1.35.0)", "mypy-boto3-iot-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)", "mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)", "mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-iotdeviceadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents (>=1.34.0,<1.35.0)", "mypy-boto3-iotevents-data (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleethub (>=1.34.0,<1.35.0)", "mypy-boto3-iotfleetwise (>=1.34.0,<1.35.0)", "mypy-boto3-iotsecuretunneling (>=1.34.0,<1.35.0)", "mypy-boto3-iotsitewise (>=1.34.0,<1.35.0)", "mypy-boto3-iotthingsgraph (>=1.34.0,<1.35.0)", "mypy-boto3-iottwinmaker (>=1.34.0,<1.35.0)", "mypy-boto3-iotwireless (>=1.34.0,<1.35.0)", "mypy-boto3-ivs (>=1.34.0,<1.35.0)", "mypy-boto3-ivs-realtime (>=1.34.0,<1.35.0)", "mypy-boto3-ivschat (>=1.34.0,<1.35.0)", "mypy-boto3-kafka (>=1.34.0,<1.35.0)", "mypy-boto3-kafkaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-kendra (>=1.34.0,<1.35.0)", "mypy-boto3-kendra-ranking (>=1.34.0,<1.35.0)", "mypy-boto3-keyspaces (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-archived-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-media (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-signaling (>=1.34.0,<1.35.0)", "mypy-boto3-kinesis-video-webrtc-storage (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisanalyticsv2 (>=1.34.0,<1.35.0)", "mypy-boto3-kinesisvideo (>=1.34.0,<1.35.0)", "mypy-boto3-kms (>=1.34.0,<1.35.0)", "mypy-boto3-lakeformation (>=1.34.0,<1.35.0)", "mypy-boto3-lambda (>=1.34.0,<1.35.0)", "mypy-boto3-launch-wizard (>=1.34.0,<1.35.0)", "mypy-boto3-lex-models (>=1.34.0,<1.35.0)", "mypy-boto3-lex-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-models (>=1.34.0,<1.35.0)", "mypy-boto3-lexv2-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-linux-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-license-manager-user-subscriptions (>=1.34.0,<1.35.0)", "mypy-boto3-lightsail (>=1.34.0,<1.35.0)", "mypy-boto3-location (>=1.34.0,<1.35.0)", "mypy-boto3-logs (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutequipment (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutmetrics (>=1.34.0,<1.35.0)", "mypy-boto3-lookoutvision (>=1.34.0,<1.35.0)", "mypy-boto3-m2 (>=1.34.0,<1.35.0)", "mypy-boto3-machinelearning (>=1.34.0,<1.35.0)", "mypy-boto3-macie2 (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain (>=1.34.0,<1.35.0)", "mypy-boto3-managedblockchain-query (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-agreement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-catalog (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-deployment (>=1.34.0,<1.35.0)", "mypy-boto3-marketplace-entitlement (>=1.34.0,<1.35.0)", "mypy-boto3-marketplacecommerceanalytics (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconnect (>=1.34.0,<1.35.0)", "mypy-boto3-mediaconvert (>=1.34.0,<1.35.0)", "mypy-boto3-medialive (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackage-vod (>=1.34.0,<1.35.0)", "mypy-boto3-mediapackagev2 (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore (>=1.34.0,<1.35.0)", "mypy-boto3-mediastore-data (>=1.34.0,<1.35.0)", "mypy-boto3-mediatailor (>=1.34.0,<1.35.0)", "mypy-boto3-medical-imaging (>=1.34.0,<1.35.0)", "mypy-boto3-memorydb (>=1.34.0,<1.35.0)", "mypy-boto3-meteringmarketplace (>=1.34.0,<1.35.0)", "mypy-boto3-mgh (>=1.34.0,<1.35.0)", "mypy-boto3-mgn (>=1.34.0,<1.35.0)", "mypy-boto3-migration-hub-refactor-spaces (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhub-config (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhuborchestrator (>=1.34.0,<1.35.0)", "mypy-boto3-migrationhubstrategy (>=1.34.0,<1.35.0)", "mypy-boto3-mobile (>=1.34.0,<1.35.0)", "mypy-boto3-mq (>=1.34.0,<1.35.0)", "mypy-boto3-mturk (>=1.34.0,<1.35.0)", "mypy-boto3-mwaa (>=1.34.0,<1.35.0)", "mypy-boto3-neptune (>=1.34.0,<1.35.0)", "mypy-boto3-neptune-graph (>=1.34.0,<1.35.0)", "mypy-boto3-neptunedata (>=1.34.0,<1.35.0)", "mypy-boto3-network-firewall (>=1.34.0,<1.35.0)", "mypy-boto3-networkmanager (>=1.34.0,<1.35.0)", "mypy-boto3-networkmonitor (>=1.34.0,<1.35.0)", "mypy-boto3-nimble (>=1.34.0,<1.35.0)", "mypy-boto3-oam (>=1.34.0,<1.35.0)", "mypy-boto3-omics (>=1.34.0,<1.35.0)", "mypy-boto3-opensearch (>=1.34.0,<1.35.0)", "mypy-boto3-opensearchserverless (>=1.34.0,<1.35.0)", "mypy-boto3-opsworks (>=1.34.0,<1.35.0)", "mypy-boto3-opsworkscm (>=1.34.0,<1.35.0)", "mypy-boto3-organizations (>=1.34.0,<1.35.0)", "mypy-boto3-osis (>=1.34.0,<1.35.0)", "mypy-boto3-outposts (>=1.34.0,<1.35.0)", "mypy-boto3-panorama (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography (>=1.34.0,<1.35.0)", "mypy-boto3-payment-cryptography-data (>=1.34.0,<1.35.0)", "mypy-boto3-pca-connector-ad (>=1.34.0,<1.35.0)", "mypy-boto3-personalize (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-events (>=1.34.0,<1.35.0)", "mypy-boto3-personalize-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-pi (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-email (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-pinpoint-sms-voice-v2 (>=1.34.0,<1.35.0)", "mypy-boto3-pipes (>=1.34.0,<1.35.0)", "mypy-boto3-polly (>=1.34.0,<1.35.0)", "mypy-boto3-pricing (>=1.34.0,<1.35.0)", "mypy-boto3-privatenetworks (>=1.34.0,<1.35.0)", "mypy-boto3-proton (>=1.34.0,<1.35.0)", "mypy-boto3-qbusiness (>=1.34.0,<1.35.0)", "mypy-boto3-qconnect (>=1.34.0,<1.35.0)", "mypy-boto3-qldb (>=1.34.0,<1.35.0)", "mypy-boto3-qldb-session (>=1.34.0,<1.35.0)", "mypy-boto3-quicksight (>=1.34.0,<1.35.0)", "mypy-boto3-ram (>=1.34.0,<1.35.0)", "mypy-boto3-rbin (>=1.34.0,<1.35.0)", "mypy-boto3-rds (>=1.34.0,<1.35.0)", "mypy-boto3-rds-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-data (>=1.34.0,<1.35.0)", "mypy-boto3-redshift-serverless (>=1.34.0,<1.35.0)", "mypy-boto3-rekognition (>=1.34.0,<1.35.0)", "mypy-boto3-repostspace (>=1.34.0,<1.35.0)", "mypy-boto3-resiliencehub (>=1.34.0,<1.35.0)", "mypy-boto3-resource-explorer-2 (>=1.34.0,<1.35.0)", "mypy-boto3-resource-groups (>=1.34.0,<1.35.0)", "mypy-boto3-resourcegroupstaggingapi (>=1.34.0,<1.35.0)", "mypy-boto3-robomaker (>=1.34.0,<1.35.0)", "mypy-boto3-rolesanywhere (>=1.34.0,<1.35.0)", "mypy-boto3-route53 (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)", "mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)", "mypy-boto3-route53domains (>=1.34.0,<1.35.0)", "mypy-boto3-route53profiles (>=1.34.0,<1.35.0)", "mypy-boto3-route53resolver (>=1.34.0,<1.35.0)", "mypy-boto3-rum (>=1.34.0,<1.35.0)", "mypy-boto3-s3 (>=1.34.0,<1.35.0)", "mypy-boto3-s3control (>=1.34.0,<1.35.0)", "mypy-boto3-s3outposts (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-a2i-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-edge (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-featurestore-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-geospatial (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-metrics (>=1.34.0,<1.35.0)", "mypy-boto3-sagemaker-runtime (>=1.34.0,<1.35.0)", "mypy-boto3-savingsplans (>=1.34.0,<1.35.0)", "mypy-boto3-scheduler (>=1.34.0,<1.35.0)", "mypy-boto3-schemas (>=1.34.0,<1.35.0)", "mypy-boto3-sdb (>=1.34.0,<1.35.0)", "mypy-boto3-secretsmanager (>=1.34.0,<1.35.0)", "mypy-boto3-securityhub (>=1.34.0,<1.35.0)", "mypy-boto3-securitylake (>=1.34.0,<1.35.0)", "mypy-boto3-serverlessrepo (>=1.34.0,<1.35.0)", "mypy-boto3-service-quotas (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog (>=1.34.0,<1.35.0)", "mypy-boto3-servicecatalog-appregistry (>=1.34.0,<1.35.0)", "mypy-boto3-servicediscovery (>=1.34.0,<1.35.0)", "mypy-boto3-ses (>=1.34.0,<1.35.0)", "mypy-boto3-sesv2 (>=1.34.0,<1.35.0)", "mypy-boto3-shield (>=1.34.0,<1.35.0)", "mypy-boto3-signer (>=1.34.0,<1.35.0)", "mypy-boto3-simspaceweaver (>=1.34.0,<1.35.0)", "mypy-boto3-sms (>=1.34.0,<1.35.0)", "mypy-boto3-sms-voice (>=1.34.0,<1.35.0)", "mypy-boto3-snow-device-management (>=1.34.0,<1.35.0)", "mypy-boto3-snowball (>=1.34.0,<1.35.0)", "mypy-boto3-sns (>=1.34.0,<1.35.0)", "mypy-boto3-sqs (>=1.34.0,<1.35.0)", "mypy-boto3-ssm (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-contacts (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-incidents (>=1.34.0,<1.35.0)", "mypy-boto3-ssm-sap (>=1.34.0,<1.35.0)", "mypy-boto3-sso (>=1.34.0,<1.35.0)", "mypy-boto3-sso-admin (>=1.34.0,<1.35.0)", "mypy-boto3-sso-oidc (>=1.34.0,<1.35.0)", "mypy-boto3-stepfunctions (>=1.34.0,<1.35.0)", "mypy-boto3-storagegateway (>=1.34.0,<1.35.0)", "mypy-boto3-sts (>=1.34.0,<1.35.0)", "mypy-boto3-supplychain (>=1.34.0,<1.35.0)", "mypy-boto3-support (>=1.34.0,<1.35.0)", "mypy-boto3-support-app (>=1.34.0,<1.35.0)", "mypy-boto3-swf (>=1.34.0,<1.35.0)", "mypy-boto3-synthetics (>=1.34.0,<1.35.0)", "mypy-boto3-textract (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-query (>=1.34.0,<1.35.0)", "mypy-boto3-timestream-write (>=1.34.0,<1.35.0)", "mypy-boto3-tnb (>=1.34.0,<1.35.0)", "mypy-boto3-transcribe (>=1.34.0,<1.35.0)", "mypy-boto3-transfer (>=1.34.0,<1.35.0)", "mypy-boto3-translate (>=1.34.0,<1.35.0)", "mypy-boto3-trustedadvisor (>=1.34.0,<1.35.0)", "mypy-boto3-verifiedpermissions (>=1.34.0,<1.35.0)", "mypy-boto3-voice-id (>=1.34.0,<1.35.0)", "mypy-boto3-vpc-lattice (>=1.34.0,<1.35.0)", "mypy-boto3-waf (>=1.34.0,<1.35.0)", "mypy-boto3-waf-regional (>=1.34.0,<1.35.0)", "mypy-boto3-wafv2 (>=1.34.0,<1.35.0)", "mypy-boto3-wellarchitected (>=1.34.0,<1.35.0)", "mypy-boto3-wisdom (>=1.34.0,<1.35.0)", "mypy-boto3-workdocs (>=1.34.0,<1.35.0)", "mypy-boto3-worklink (>=1.34.0,<1.35.0)", "mypy-boto3-workmail (>=1.34.0,<1.35.0)", "mypy-boto3-workmailmessageflow (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-thin-client (>=1.34.0,<1.35.0)", "mypy-boto3-workspaces-web (>=1.34.0,<1.35.0)", "mypy-boto3-xray (>=1.34.0,<1.35.0)"] amp = ["mypy-boto3-amp (>=1.34.0,<1.35.0)"] amplify = ["mypy-boto3-amplify (>=1.34.0,<1.35.0)"] amplifybackend = ["mypy-boto3-amplifybackend (>=1.34.0,<1.35.0)"] @@ -385,6 +343,7 @@ apprunner = ["mypy-boto3-apprunner (>=1.34.0,<1.35.0)"] appstream = ["mypy-boto3-appstream (>=1.34.0,<1.35.0)"] appsync = ["mypy-boto3-appsync (>=1.34.0,<1.35.0)"] arc-zonal-shift = ["mypy-boto3-arc-zonal-shift (>=1.34.0,<1.35.0)"] +artifact = ["mypy-boto3-artifact (>=1.34.0,<1.35.0)"] athena = ["mypy-boto3-athena (>=1.34.0,<1.35.0)"] auditmanager = ["mypy-boto3-auditmanager (>=1.34.0,<1.35.0)"] autoscaling = ["mypy-boto3-autoscaling (>=1.34.0,<1.35.0)"] @@ -400,10 +359,11 @@ bedrock-agent = ["mypy-boto3-bedrock-agent (>=1.34.0,<1.35.0)"] bedrock-agent-runtime = ["mypy-boto3-bedrock-agent-runtime (>=1.34.0,<1.35.0)"] bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.34.0,<1.35.0)"] billingconductor = ["mypy-boto3-billingconductor (>=1.34.0,<1.35.0)"] -boto3 = ["boto3 (==1.34.24)", "botocore (==1.34.24)"] +boto3 = ["boto3 (==1.34.105)", "botocore (==1.34.105)"] braket = ["mypy-boto3-braket (>=1.34.0,<1.35.0)"] budgets = ["mypy-boto3-budgets (>=1.34.0,<1.35.0)"] ce = ["mypy-boto3-ce (>=1.34.0,<1.35.0)"] +chatbot = ["mypy-boto3-chatbot (>=1.34.0,<1.35.0)"] chime = ["mypy-boto3-chime (>=1.34.0,<1.35.0)"] chime-sdk-identity = ["mypy-boto3-chime-sdk-identity (>=1.34.0,<1.35.0)"] chime-sdk-media-pipelines = ["mypy-boto3-chime-sdk-media-pipelines (>=1.34.0,<1.35.0)"] @@ -429,6 +389,7 @@ codeartifact = ["mypy-boto3-codeartifact (>=1.34.0,<1.35.0)"] codebuild = ["mypy-boto3-codebuild (>=1.34.0,<1.35.0)"] codecatalyst = ["mypy-boto3-codecatalyst (>=1.34.0,<1.35.0)"] codecommit = ["mypy-boto3-codecommit (>=1.34.0,<1.35.0)"] +codeconnections = ["mypy-boto3-codeconnections (>=1.34.0,<1.35.0)"] codedeploy = ["mypy-boto3-codedeploy (>=1.34.0,<1.35.0)"] codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (>=1.34.0,<1.35.0)"] codeguru-security = ["mypy-boto3-codeguru-security (>=1.34.0,<1.35.0)"] @@ -449,6 +410,7 @@ connect-contact-lens = ["mypy-boto3-connect-contact-lens (>=1.34.0,<1.35.0)"] connectcampaigns = ["mypy-boto3-connectcampaigns (>=1.34.0,<1.35.0)"] connectcases = ["mypy-boto3-connectcases (>=1.34.0,<1.35.0)"] connectparticipant = ["mypy-boto3-connectparticipant (>=1.34.0,<1.35.0)"] +controlcatalog = ["mypy-boto3-controlcatalog (>=1.34.0,<1.35.0)"] controltower = ["mypy-boto3-controltower (>=1.34.0,<1.35.0)"] cost-optimization-hub = ["mypy-boto3-cost-optimization-hub (>=1.34.0,<1.35.0)"] cur = ["mypy-boto3-cur (>=1.34.0,<1.35.0)"] @@ -459,6 +421,7 @@ datapipeline = ["mypy-boto3-datapipeline (>=1.34.0,<1.35.0)"] datasync = ["mypy-boto3-datasync (>=1.34.0,<1.35.0)"] datazone = ["mypy-boto3-datazone (>=1.34.0,<1.35.0)"] dax = ["mypy-boto3-dax (>=1.34.0,<1.35.0)"] +deadline = ["mypy-boto3-deadline (>=1.34.0,<1.35.0)"] detective = ["mypy-boto3-detective (>=1.34.0,<1.35.0)"] devicefarm = ["mypy-boto3-devicefarm (>=1.34.0,<1.35.0)"] devops-guru = ["mypy-boto3-devops-guru (>=1.34.0,<1.35.0)"] @@ -528,7 +491,6 @@ internetmonitor = ["mypy-boto3-internetmonitor (>=1.34.0,<1.35.0)"] iot = ["mypy-boto3-iot (>=1.34.0,<1.35.0)"] iot-data = ["mypy-boto3-iot-data (>=1.34.0,<1.35.0)"] iot-jobs-data = ["mypy-boto3-iot-jobs-data (>=1.34.0,<1.35.0)"] -iot-roborunner = ["mypy-boto3-iot-roborunner (>=1.34.0,<1.35.0)"] iot1click-devices = ["mypy-boto3-iot1click-devices (>=1.34.0,<1.35.0)"] iot1click-projects = ["mypy-boto3-iot1click-projects (>=1.34.0,<1.35.0)"] iotanalytics = ["mypy-boto3-iotanalytics (>=1.34.0,<1.35.0)"] @@ -665,6 +627,7 @@ route53-recovery-cluster = ["mypy-boto3-route53-recovery-cluster (>=1.34.0,<1.35 route53-recovery-control-config = ["mypy-boto3-route53-recovery-control-config (>=1.34.0,<1.35.0)"] route53-recovery-readiness = ["mypy-boto3-route53-recovery-readiness (>=1.34.0,<1.35.0)"] route53domains = ["mypy-boto3-route53domains (>=1.34.0,<1.35.0)"] +route53profiles = ["mypy-boto3-route53profiles (>=1.34.0,<1.35.0)"] route53resolver = ["mypy-boto3-route53resolver (>=1.34.0,<1.35.0)"] rum = ["mypy-boto3-rum (>=1.34.0,<1.35.0)"] s3 = ["mypy-boto3-s3 (>=1.34.0,<1.35.0)"] @@ -716,6 +679,7 @@ support-app = ["mypy-boto3-support-app (>=1.34.0,<1.35.0)"] swf = ["mypy-boto3-swf (>=1.34.0,<1.35.0)"] synthetics = ["mypy-boto3-synthetics (>=1.34.0,<1.35.0)"] textract = ["mypy-boto3-textract (>=1.34.0,<1.35.0)"] +timestream-influxdb = ["mypy-boto3-timestream-influxdb (>=1.34.0,<1.35.0)"] timestream-query = ["mypy-boto3-timestream-query (>=1.34.0,<1.35.0)"] timestream-write = ["mypy-boto3-timestream-write (>=1.34.0,<1.35.0)"] tnb = ["mypy-boto3-tnb (>=1.34.0,<1.35.0)"] @@ -742,13 +706,13 @@ xray = ["mypy-boto3-xray (>=1.34.0,<1.35.0)"] [[package]] name = "botocore" -version = "1.34.24" +version = "1.34.106" description = "Low-level, data-driven core of boto 3." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "botocore-1.34.24-py3-none-any.whl", hash = "sha256:c92f810b5faec5126f3faf7dc7d77346e407ab3b89bb613290c86ff2fd5405b9"}, - {file = "botocore-1.34.24.tar.gz", hash = "sha256:4a48c15b87c6a72719a6c2d8688f4e52fe52c18ac9dfcaa25c7e62c5df475ee2"}, + {file = "botocore-1.34.106-py3-none-any.whl", hash = "sha256:4baf0e27c2dfc4f4d0dee7c217c716e0782f9b30e8e1fff983fce237d88f73ae"}, + {file = "botocore-1.34.106.tar.gz", hash = "sha256:921fa5202f88c3e58fdcb4b3acffd56d65b24bca47092ee4b27aa988556c0be6"}, ] [package.dependencies] @@ -756,21 +720,21 @@ jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = [ {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, - {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, ] [package.extras] -crt = ["awscrt (==0.19.19)"] +crt = ["awscrt (==0.20.9)"] [[package]] name = "botocore-stubs" -version = "1.34.23" +version = "1.34.94" description = "Type annotations and code completion for botocore" optional = false -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "botocore_stubs-1.34.23-py3-none-any.whl", hash = "sha256:8218bbc0a2339ac6176b1f0c1f386327c3e2b854441879ac6036529c223915d3"}, - {file = "botocore_stubs-1.34.23.tar.gz", hash = "sha256:6927d18fa26b14e8532573bf0662040dbf8e3943a0f6e353121ce25579e5c942"}, + {file = "botocore_stubs-1.34.94-py3-none-any.whl", hash = "sha256:b0345f55babd8b901c53804fc5c326a4a0bd2e23e3b71f9ea5d9f7663466e6ba"}, + {file = "botocore_stubs-1.34.94.tar.gz", hash = "sha256:64d80a3467e3b19939e9c2750af33328b3087f8f524998dbdf7ed168227f507d"}, ] [package.dependencies] @@ -792,13 +756,13 @@ files = [ [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -991,22 +955,25 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cohere" -version = "4.44" -description = "Python SDK for the Cohere API" +version = "5.5.0" +description = "" optional = true -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-4.44-py3-none-any.whl", hash = "sha256:a6d01d579dcd43ef98ce1886b55e00a308d40332eafc1da4bf56526c81d6ff73"}, - {file = "cohere-4.44.tar.gz", hash = "sha256:06d9d056ed9b40f152d9551ca547a20ed08410e2e43488ba174e9025cf09746b"}, + {file = "cohere-5.5.0-py3-none-any.whl", hash = "sha256:7792e8898c95f2cb955b2d9f23b8602f73f3b698d59f1a1b4896c53809671da0"}, + {file = "cohere-5.5.0.tar.gz", hash = "sha256:00b492ebf8921e83cb2371f2ee36ddf301422daae3024343a87d4316f02b711b"}, ] [package.dependencies] -aiohttp = ">=3.0,<4.0" -backoff = ">=2.0,<3.0" -fastavro = ">=1.8,<2.0" -importlib_metadata = ">=6.0,<7.0" -requests = ">=2.25.0,<3.0.0" -urllib3 = ">=1.26,<3" +boto3 = ">=1.34.0,<2.0.0" +fastavro = ">=1.9.4,<2.0.0" +httpx = ">=0.21.2" +httpx-sse = ">=0.4.0,<0.5.0" +pydantic = ">=1.9.2" +requests = ">=2.0.0,<3.0.0" +tokenizers = ">=0.19,<0.20" +types-requests = ">=2.0.0,<3.0.0" +typing_extensions = ">=4.0.0" [[package]] name = "colorama" @@ -1019,92 +986,81 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "contextlib2" -version = "21.6.0" -description = "Backports and enhancements for the contextlib module" -optional = false -python-versions = ">=3.6" -files = [ - {file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"}, - {file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"}, -] - [[package]] name = "courlan" -version = "0.9.5" +version = "1.1.0" description = "Clean, filter and sample URLs to optimize data collection – includes spam, content type and language filters." optional = true python-versions = ">=3.6" files = [ - {file = "courlan-0.9.5-py3-none-any.whl", hash = "sha256:3c10fb06a26422b5c5e6f5f6d2c16e5d4308026f9dcea783ca6a88dae5922ee5"}, - {file = "courlan-0.9.5.tar.gz", hash = "sha256:38dc35b2e3bf1f5d516d00d51ac12ebde543e3417c6be6f6a2273c0fc5b5b353"}, + {file = "courlan-1.1.0-py3-none-any.whl", hash = "sha256:88354c1e50fde84890c13f58924a5ecc5c0527dcf3eb36e80564fe68e330bb03"}, + {file = "courlan-1.1.0.tar.gz", hash = "sha256:d706684334f18be4ada1fbd57f2680adf0036648f6d840852f7a4822d3adfd8d"}, ] [package.dependencies] -langcodes = ">=3.3.0" +babel = ">=2.11.0" tld = {version = ">=0.13", markers = "python_version >= \"3.7\""} urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} [[package]] name = "coverage" -version = "7.4.0" +version = "7.5.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, + {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, + {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, + {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, + {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, + {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, + {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, + {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, + {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, + {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, + {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, + {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, + {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, ] [package.dependencies] @@ -1115,43 +1071,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -1224,22 +1180,22 @@ files = [ [[package]] name = "dnspython" -version = "2.5.0" +version = "2.6.1" description = "DNS toolkit" optional = true python-versions = ">=3.8" files = [ - {file = "dnspython-2.5.0-py3-none-any.whl", hash = "sha256:6facdf76b73c742ccf2d07add296f178e629da60be23ce4b0a9c927b1e02c3a6"}, - {file = "dnspython-2.5.0.tar.gz", hash = "sha256:a0034815a59ba9ae888946be7ccca8f7c157b286f8455b379c692efb51022a15"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] [package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=5.0.3)", "mypy (>=1.0.1)", "pylint (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "sphinx (>=7.0.0)", "twine (>=4.0.0)", "wheel (>=0.41.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] dnssec = ["cryptography (>=41)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.25.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1)"] -trio = ["trio (>=0.14)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] [[package]] @@ -1265,13 +1221,13 @@ ssh = ["paramiko (>=2.4.3)"] [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] @@ -1295,13 +1251,13 @@ websockets = ">=11.0" [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -1309,13 +1265,13 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] @@ -1337,42 +1293,42 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastavro" -version = "1.9.3" +version = "1.9.4" description = "Fast read/write of AVRO files" optional = true python-versions = ">=3.8" files = [ - {file = "fastavro-1.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5e9b2e1427fb84c0754bc34923d10cabcf2ed23230201208a1371ab7b6027674"}, - {file = "fastavro-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ef82f86ae276309abc0072598474b6be68105a0b28f8d7cc0398d1d353d7de"}, - {file = "fastavro-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280ef7ab7232ecb2097038d6842416ec717d0e1c314b80ff245f85201f3396a4"}, - {file = "fastavro-1.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a36cfc0421ed7576ecb1c22de7bd1dedcce62aebbffcc597379d59171e5d76e"}, - {file = "fastavro-1.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d80f2e20199140eb8c036b4393e9bc9eff325543311b958c72318999499d4279"}, - {file = "fastavro-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:a435f7edd7c5b52cee3f23ca950cd9373ab35cf2aa3d269b3d6aca7e2fc1372c"}, - {file = "fastavro-1.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a7053ed10194ec53754f5337b57b3273a74b48505edcd6edb79fe3c4cd259c0"}, - {file = "fastavro-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853e01f13534d1baa0a3d493a8573e665e93ffa35b4bf1d125e21764d343af8e"}, - {file = "fastavro-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a279cda25d876e6f120950cadf184a307fd8998f9a22a90bb62e6749f88d1e"}, - {file = "fastavro-1.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:63d6f928840f3fb1f2e1fe20bc8b7d0e1a51ba4bb0e554ecb837a669fba31288"}, - {file = "fastavro-1.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8807046edc78f50b3ea5f55f6a534c87b2a13538e7c56fec3532ef802bcae333"}, - {file = "fastavro-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:e502579da4a51c5630eadbd811a1b3d262d6e783bf19998cfb33d2ea0cf6f516"}, - {file = "fastavro-1.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6b665efe442061df8d9608c2fb692847df85d52ad825b776c441802f0dfa6571"}, - {file = "fastavro-1.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b8c96d81f0115633489d7f1133a03832922629a61ca81c1d47b482ddcda3b94"}, - {file = "fastavro-1.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338c7ec94dd2474c4679e44d2560a1922cb6fa99acbb7b18957264baf8eadfc7"}, - {file = "fastavro-1.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a509b34c9af71a109c633631ac2f6d2209830e13200d0048f7e9c057fd563f8f"}, - {file = "fastavro-1.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:967edefab470987c024cd5a1fcd04744a50a91e740c7bdf325181043a47f1083"}, - {file = "fastavro-1.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:033c15e8ed02f80f01d58be1cd880b09fd444faf277263d563a727711d47a98a"}, - {file = "fastavro-1.9.3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:6b38723327603d77080aec56628e13a739415f8596ca0cc41a905615977c6d6b"}, - {file = "fastavro-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046d75c4400941fd08f0a6855a34ae63bf02ea01f366b5b749942abe10640056"}, - {file = "fastavro-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87ab312b8baf0e61ee717878d390022ee1b713d70b244d69efbf3325680f9749"}, - {file = "fastavro-1.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c562fcf8f5091a2446aafd0c2a0da590c24e0b53527a0100d33908e32f20eea8"}, - {file = "fastavro-1.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2aa0111e7ebd076d2a094862bbdf8ea175cebba148fcce6c89ff46b625e334b4"}, - {file = "fastavro-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:652072e0f455ca19a1ee502b527e603389783657c130d81f89df66775979d6f5"}, - {file = "fastavro-1.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0a57cdd4edaee36d4216faf801ebc7f53f45e4e1518bdd9832d6f6f1d6e2d88f"}, - {file = "fastavro-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b46a18ebed61573b0823c28eda2716485d283258a83659c7fe6ad3aaeacfed4"}, - {file = "fastavro-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f756f0723f3bd97db20437d0a8e45712839e6ccd7c82f4d82469533be48b4c7"}, - {file = "fastavro-1.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d98d5a08063f5b6d7ac5016a0dfe0698b50d9987cb74686f7dfa8288b7b09e0b"}, - {file = "fastavro-1.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:00698e60db58a2d52cb709df882d451fb7664ebb2f8cb37d9171697e060dc767"}, - {file = "fastavro-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:d021bbc135023194688e88a7431fb0b5e3ce20e27153bf258f2ce08ee1a0106b"}, - {file = "fastavro-1.9.3.tar.gz", hash = "sha256:a30d3d2353f6d3b4f6dcd6a97ae937b3775faddd63f5856fe11ba3b0dbb1756a"}, + {file = "fastavro-1.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60cb38f07462a7fb4e4440ed0de67d3d400ae6b3d780f81327bebde9aa55faef"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063d01d197fc929c20adc09ca9f0ca86d33ac25ee0963ce0b438244eee8315ae"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a9053fcfbc895f2a16a4303af22077e3a8fdcf1cd5d6ed47ff2ef22cbba2f0"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:02bf1276b7326397314adf41b34a4890f6ffa59cf7e0eb20b9e4ab0a143a1598"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56bed9eca435389a8861e6e2d631ec7f8f5dda5b23f93517ac710665bd34ca29"}, + {file = "fastavro-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:0cd2099c8c672b853e0b20c13e9b62a69d3fbf67ee7c59c7271ba5df1680310d"}, + {file = "fastavro-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af8c6d8c43a02b5569c093fc5467469541ac408c79c36a5b0900d3dd0b3ba838"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a138710bd61580324d23bc5e3df01f0b82aee0a76404d5dddae73d9e4c723f"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:903d97418120ca6b6a7f38a731166c1ccc2c4344ee5e0470d09eb1dc3687540a"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c443eeb99899d062dbf78c525e4614dd77e041a7688fa2710c224f4033f193ae"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac26ab0774d1b2b7af6d8f4300ad20bbc4b5469e658a02931ad13ce23635152f"}, + {file = "fastavro-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:cf7247874c22be856ba7d1f46a0f6e0379a6025f1a48a7da640444cbac6f570b"}, + {file = "fastavro-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68912f2020e1b3d70557260b27dd85fb49a4fc6bfab18d384926127452c1da4c"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6925ce137cdd78e109abdb0bc33aad55de6c9f2d2d3036b65453128f2f5f5b92"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b928cd294e36e35516d0deb9e104b45be922ba06940794260a4e5dbed6c192a"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:90c9838bc4c991ffff5dd9d88a0cc0030f938b3fdf038cdf6babde144b920246"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca6e54da571b06a3c5a72dbb7212073f56c92a6fbfbf847b91c347510f8a426"}, + {file = "fastavro-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4b02839ac261100cefca2e2ad04cdfedc556cb66b5ec735e0db428e74b399de"}, + {file = "fastavro-1.9.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4451ee9a305a73313a1558d471299f3130e4ecc10a88bf5742aa03fb37e042e6"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8524fccfb379565568c045d29b2ebf71e1f2c0dd484aeda9fe784ef5febe1a8"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d0a00a6e09baa20f6f038d7a2ddcb7eef0e7a9980e947a018300cb047091b8"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23d7e5b29c9bf6f26e8be754b2c8b919838e506f78ef724de7d22881696712fc"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e6ab3ee53944326460edf1125b2ad5be2fadd80f7211b13c45fa0c503b4cf8d"}, + {file = "fastavro-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:64d335ec2004204c501f8697c385d0a8f6b521ac82d5b30696f789ff5bc85f3c"}, + {file = "fastavro-1.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7e05f44c493e89e73833bd3ff3790538726906d2856f59adc8103539f4a1b232"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:253c63993250bff4ee7b11fb46cf3a4622180a783bedc82a24c6fdcd1b10ca2a"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d6942eb1db14640c2581e0ecd1bbe0afc8a83731fcd3064ae7f429d7880cb7"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d47bb66be6091cd48cfe026adcad11c8b11d7d815a2949a1e4ccf03df981ca65"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c293897f12f910e58a1024f9c77f565aa8e23b36aafda6ad8e7041accc57a57f"}, + {file = "fastavro-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:f05d2afcb10a92e2a9e580a3891f090589b3e567fdc5641f8a46a0b084f120c3"}, + {file = "fastavro-1.9.4.tar.gz", hash = "sha256:56b8363e360a1256c94562393dc7f8611f3baf2b3159f64fb2b9c6b87b14e876"}, ] [package.extras] @@ -1383,18 +1339,18 @@ zstandard = ["zstandard"] [[package]] name = "filelock" -version = "3.13.1" +version = "3.14.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -1485,13 +1441,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.5.0" description = "File-system specification" optional = true python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.extras] @@ -1499,7 +1455,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -1509,13 +1465,16 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] [[package]] @@ -1567,13 +1526,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-api-core" -version = "2.17.1" +version = "2.19.0" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.17.1.tar.gz", hash = "sha256:9df18a1f87ee0df0bc4eea2770ebc4228392d8cc4066655b320e2cfccb15db95"}, - {file = "google_api_core-2.17.1-py3-none-any.whl", hash = "sha256:610c5b90092c360736baccf17bd3efbcb30dd380e7a6dc28a71059edb8bd0d8e"}, + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, ] [package.dependencies] @@ -1587,6 +1546,7 @@ grpcio-status = [ {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -1597,13 +1557,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.28.2" +version = "2.29.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.28.2.tar.gz", hash = "sha256:80b8b4969aa9ed5938c7828308f20f035bc79f9d8fb8120bf9dc8db20b41ba30"}, - {file = "google_auth-2.28.2-py2.py3-none-any.whl", hash = "sha256:9fd67bbcd40f16d9d42f950228e9cf02a2ded4ae49198b27432d0cded5a74c38"}, + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, ] [package.dependencies] @@ -1730,13 +1690,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.42.1" +version = "0.45.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, - {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, + {file = "griffe-0.45.0-py3-none-any.whl", hash = "sha256:90fe5c90e1b0ca7dd6fee78f9009f4e01b37dbc9ab484a9b2c1578915db1e571"}, + {file = "griffe-0.45.0.tar.gz", hash = "sha256:85cb2868d026ea51c89bdd589ad3ccc94abc5bd8d5d948e3d4450778a2a05b4a"}, ] [package.dependencies] @@ -1744,84 +1704,76 @@ colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.62.1" +version = "1.63.0" description = "HTTP/2-based RPC framework" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.62.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:179bee6f5ed7b5f618844f760b6acf7e910988de77a4f75b95bbfaa8106f3c1e"}, - {file = "grpcio-1.62.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:48611e4fa010e823ba2de8fd3f77c1322dd60cb0d180dc6630a7e157b205f7ea"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b2a0e71b0a2158aa4bce48be9f8f9eb45cbd17c78c7443616d00abbe2a509f6d"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbe80577c7880911d3ad65e5ecc997416c98f354efeba2f8d0f9112a67ed65a5"}, - {file = "grpcio-1.62.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f6c693d446964e3292425e1d16e21a97a48ba9172f2d0df9d7b640acb99243"}, - {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:77c339403db5a20ef4fed02e4d1a9a3d9866bf9c0afc77a42234677313ea22f3"}, - {file = "grpcio-1.62.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b5a4ea906db7dec694098435d84bf2854fe158eb3cd51e1107e571246d4d1d70"}, - {file = "grpcio-1.62.1-cp310-cp310-win32.whl", hash = "sha256:4187201a53f8561c015bc745b81a1b2d278967b8de35f3399b84b0695e281d5f"}, - {file = "grpcio-1.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:844d1f3fb11bd1ed362d3fdc495d0770cfab75761836193af166fee113421d66"}, - {file = "grpcio-1.62.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:833379943d1728a005e44103f17ecd73d058d37d95783eb8f0b28ddc1f54d7b2"}, - {file = "grpcio-1.62.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c7fcc6a32e7b7b58f5a7d27530669337a5d587d4066060bcb9dee7a8c833dfb7"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:fa7d28eb4d50b7cbe75bb8b45ed0da9a1dc5b219a0af59449676a29c2eed9698"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48f7135c3de2f298b833be8b4ae20cafe37091634e91f61f5a7eb3d61ec6f660"}, - {file = "grpcio-1.62.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f11fd63365ade276c9d4a7b7df5c136f9030e3457107e1791b3737a9b9ed6a"}, - {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b49fd8fe9f9ac23b78437da94c54aa7e9996fbb220bac024a67469ce5d0825f"}, - {file = "grpcio-1.62.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:482ae2ae78679ba9ed5752099b32e5fe580443b4f798e1b71df412abf43375db"}, - {file = "grpcio-1.62.1-cp311-cp311-win32.whl", hash = "sha256:1faa02530b6c7426404372515fe5ddf66e199c2ee613f88f025c6f3bd816450c"}, - {file = "grpcio-1.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bd90b8c395f39bc82a5fb32a0173e220e3f401ff697840f4003e15b96d1befc"}, - {file = "grpcio-1.62.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b134d5d71b4e0837fff574c00e49176051a1c532d26c052a1e43231f252d813b"}, - {file = "grpcio-1.62.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d1f6c96573dc09d50dbcbd91dbf71d5cf97640c9427c32584010fbbd4c0e0037"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:359f821d4578f80f41909b9ee9b76fb249a21035a061a327f91c953493782c31"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a485f0c2010c696be269184bdb5ae72781344cb4e60db976c59d84dd6354fac9"}, - {file = "grpcio-1.62.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b50b09b4dc01767163d67e1532f948264167cd27f49e9377e3556c3cba1268e1"}, - {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3227c667dccbe38f2c4d943238b887bac588d97c104815aecc62d2fd976e014b"}, - {file = "grpcio-1.62.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3952b581eb121324853ce2b191dae08badb75cd493cb4e0243368aa9e61cfd41"}, - {file = "grpcio-1.62.1-cp312-cp312-win32.whl", hash = "sha256:83a17b303425104d6329c10eb34bba186ffa67161e63fa6cdae7776ff76df73f"}, - {file = "grpcio-1.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:6696ffe440333a19d8d128e88d440f91fb92c75a80ce4b44d55800e656a3ef1d"}, - {file = "grpcio-1.62.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:e3393b0823f938253370ebef033c9fd23d27f3eae8eb9a8f6264900c7ea3fb5a"}, - {file = "grpcio-1.62.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83e7ccb85a74beaeae2634f10eb858a0ed1a63081172649ff4261f929bacfd22"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:882020c87999d54667a284c7ddf065b359bd00251fcd70279ac486776dbf84ec"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a10383035e864f386fe096fed5c47d27a2bf7173c56a6e26cffaaa5a361addb1"}, - {file = "grpcio-1.62.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:960edebedc6b9ada1ef58e1c71156f28689978188cd8cff3b646b57288a927d9"}, - {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:23e2e04b83f347d0aadde0c9b616f4726c3d76db04b438fd3904b289a725267f"}, - {file = "grpcio-1.62.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978121758711916d34fe57c1f75b79cdfc73952f1481bb9583399331682d36f7"}, - {file = "grpcio-1.62.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9084086190cc6d628f282e5615f987288b95457292e969b9205e45b442276407"}, - {file = "grpcio-1.62.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:22bccdd7b23c420a27fd28540fb5dcbc97dc6be105f7698cb0e7d7a420d0e362"}, - {file = "grpcio-1.62.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:8999bf1b57172dbc7c3e4bb3c732658e918f5c333b2942243f10d0d653953ba9"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d9e52558b8b8c2f4ac05ac86344a7417ccdd2b460a59616de49eb6933b07a0bd"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1714e7bc935780bc3de1b3fcbc7674209adf5208ff825799d579ffd6cd0bd505"}, - {file = "grpcio-1.62.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8842ccbd8c0e253c1f189088228f9b433f7a93b7196b9e5b6f87dba393f5d5d"}, - {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f1e7b36bdff50103af95a80923bf1853f6823dd62f2d2a2524b66ed74103e49"}, - {file = "grpcio-1.62.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bba97b8e8883a8038606480d6b6772289f4c907f6ba780fa1f7b7da7dfd76f06"}, - {file = "grpcio-1.62.1-cp38-cp38-win32.whl", hash = "sha256:a7f615270fe534548112a74e790cd9d4f5509d744dd718cd442bf016626c22e4"}, - {file = "grpcio-1.62.1-cp38-cp38-win_amd64.whl", hash = "sha256:e6c8c8693df718c5ecbc7babb12c69a4e3677fd11de8886f05ab22d4e6b1c43b"}, - {file = "grpcio-1.62.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:73db2dc1b201d20ab7083e7041946910bb991e7e9761a0394bbc3c2632326483"}, - {file = "grpcio-1.62.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:407b26b7f7bbd4f4751dbc9767a1f0716f9fe72d3d7e96bb3ccfc4aace07c8de"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f8de7c8cef9261a2d0a62edf2ccea3d741a523c6b8a6477a340a1f2e417658de"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd5c8a1af40ec305d001c60236308a67e25419003e9bb3ebfab5695a8d0b369"}, - {file = "grpcio-1.62.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0477cb31da67846a33b1a75c611f88bfbcd427fe17701b6317aefceee1b96f"}, - {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:60dcd824df166ba266ee0cfaf35a31406cd16ef602b49f5d4dfb21f014b0dedd"}, - {file = "grpcio-1.62.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:973c49086cabab773525f6077f95e5a993bfc03ba8fc32e32f2c279497780585"}, - {file = "grpcio-1.62.1-cp39-cp39-win32.whl", hash = "sha256:12859468e8918d3bd243d213cd6fd6ab07208195dc140763c00dfe901ce1e1b4"}, - {file = "grpcio-1.62.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7209117bbeebdfa5d898205cc55153a51285757902dd73c47de498ad4d11332"}, - {file = "grpcio-1.62.1.tar.gz", hash = "sha256:6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947"}, + {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, + {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, + {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, + {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, + {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, + {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, + {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, + {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, + {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, + {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, + {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, + {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, + {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, + {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, + {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, + {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, + {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, + {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, + {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, + {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, + {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.62.1)"] +protobuf = ["grpcio-tools (>=1.63.0)"] [[package]] name = "grpcio-status" -version = "1.62.1" +version = "1.62.2" description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.62.1.tar.gz", hash = "sha256:3431c8abbab0054912c41df5c72f03ddf3b7a67be8a287bb3c18a3456f96ff77"}, - {file = "grpcio_status-1.62.1-py3-none-any.whl", hash = "sha256:af0c3ab85da31669f21749e8d53d669c061ebc6ce5637be49a46edcb7aa8ab17"}, + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.1" +grpcio = ">=1.62.2" protobuf = ">=4.21.6" [[package]] @@ -1837,13 +1789,13 @@ files = [ [[package]] name = "htmldate" -version = "1.7.0" +version = "1.8.1" description = "Fast and robust extraction of original and updated publication dates from URLs and web pages." optional = true python-versions = ">=3.6" files = [ - {file = "htmldate-1.7.0-py3-none-any.whl", hash = "sha256:d82265ac19571b78985d53585b63917d2d2f2c6b96fc9b5cd1928f2777636832"}, - {file = "htmldate-1.7.0.tar.gz", hash = "sha256:02a800dd224cbf74bf483b042f64e14f57ba0e40c6b4404b284e98bc6c30b68d"}, + {file = "htmldate-1.8.1-py3-none-any.whl", hash = "sha256:b1209dedfa7bc9bb4d0b812a3f0983ea5d39f1bdfe21745659ad26af4f8b7f32"}, + {file = "htmldate-1.8.1.tar.gz", hash = "sha256:caf1686cf75c61dd1f061ede5d7a46e759b15d5f9987cd8e13c8c4237511263d"}, ] [package.dependencies] @@ -1859,13 +1811,13 @@ speed = ["backports-datetime-fromisoformat", "faust-cchardet (>=2.1.19)", "urlli [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -1876,17 +1828,17 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -1902,15 +1854,26 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "httpx-sse" +version = "0.4.0" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = true +python-versions = ">=3.8" +files = [ + {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"}, + {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"}, +] + [[package]] name = "huggingface-hub" -version = "0.20.3" +version = "0.23.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, - {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, + {file = "huggingface_hub-0.23.0-py3-none-any.whl", hash = "sha256:075c30d48ee7db2bba779190dc526d2c11d422aed6f9044c5e2fdc2c432fdb91"}, + {file = "huggingface_hub-0.23.0.tar.gz", hash = "sha256:7126dedd10a4c6fac796ced4d87a8cf004efc722a5125c2c09299017fa366fa9"}, ] [package.dependencies] @@ -1923,26 +1886,28 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "identify" -version = "2.5.33" +version = "2.5.36" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, - {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, ] [package.extras] @@ -1950,33 +1915,33 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "6.11.0" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, - {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -2028,13 +1993,13 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "jaraco-classes" -version = "3.3.0" +version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" files = [ - {file = "jaraco.classes-3.3.0-py3-none-any.whl", hash = "sha256:10afa92b6743f25c0cf5f37c6bb6e18e2c5bb84a16527ccfc0040ea377e7aaeb"}, - {file = "jaraco.classes-3.3.0.tar.gz", hash = "sha256:c063dd08e89217cee02c8d5e5ec560f2c8ce6cdc2fcdc2e68f7b2e5547ed3621"}, + {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, + {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, ] [package.dependencies] @@ -2042,7 +2007,43 @@ more-itertools = "*" [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jaraco-context" +version = "5.3.0" +description = "Useful decorators and context managers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.context-5.3.0-py3-none-any.whl", hash = "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266"}, + {file = "jaraco.context-5.3.0.tar.gz", hash = "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2"}, +] + +[package.dependencies] +"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["portend", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jaraco-functools" +version = "4.0.1" +description = "Functools like those found in stdlib" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.functools-4.0.1-py3-none-any.whl", hash = "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664"}, + {file = "jaraco_functools-4.0.1.tar.gz", hash = "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "jedi" @@ -2080,13 +2081,13 @@ trio = ["async_generator", "trio"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -2119,162 +2120,130 @@ files = [ [[package]] name = "justext" -version = "3.0.0" +version = "3.0.1" description = "Heuristic based boilerplate removal tool" optional = true python-versions = "*" files = [ - {file = "jusText-3.0.0-py2.py3-none-any.whl", hash = "sha256:86b48f5b1d99505acd072f5831def6cd3f1306043651c524a1c609e62e3544e4"}, - {file = "jusText-3.0.0.tar.gz", hash = "sha256:7640e248218795f6be65f6c35fe697325a3280fcb4675d1525bcdff2b86faadf"}, + {file = "jusText-3.0.1-py2.py3-none-any.whl", hash = "sha256:e0fb882dd7285415709f4b7466aed23d6b98b7b89404c36e8a2e730facfed02b"}, + {file = "justext-3.0.1.tar.gz", hash = "sha256:b6ed2fb6c5d21618e2e34b2295c4edfc0bcece3bd549ed5c8ef5a8d20f0b3451"}, ] [package.dependencies] -lxml = ">=4.4.2" +lxml = {version = ">=4.4.2", extras = ["html-clean"]} [[package]] name = "keyring" -version = "24.3.0" +version = "25.2.1" description = "Store and access your passwords safely." optional = false python-versions = ">=3.8" files = [ - {file = "keyring-24.3.0-py3-none-any.whl", hash = "sha256:4446d35d636e6a10b8bce7caa66913dd9eca5fd222ca03a3d42c38608ac30836"}, - {file = "keyring-24.3.0.tar.gz", hash = "sha256:e730ecffd309658a08ee82535a3b5ec4b4c8669a9be11efb66249d8e0aeb9a25"}, + {file = "keyring-25.2.1-py3-none-any.whl", hash = "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50"}, + {file = "keyring-25.2.1.tar.gz", hash = "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b"}, ] [package.dependencies] importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} "jaraco.classes" = "*" +"jaraco.context" = "*" +"jaraco.functools" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - -[[package]] -name = "langcodes" -version = "3.3.0" -description = "Tools for labeling human languages with IETF language tags" -optional = true -python-versions = ">=3.6" -files = [ - {file = "langcodes-3.3.0-py3-none-any.whl", hash = "sha256:4d89fc9acb6e9c8fdef70bcdf376113a3db09b67285d9e1d534de6d8818e7e69"}, - {file = "langcodes-3.3.0.tar.gz", hash = "sha256:794d07d5a28781231ac335a1561b8442f8648ca07cd518310aeb45d6f0807ef6"}, -] - -[package.extras] -data = ["language-data (>=1.1,<2.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "lxml" -version = "4.9.4" +version = "5.1.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -files = [ - {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e214025e23db238805a600f1f37bf9f9a15413c7bf5f9d6ae194f84980c78722"}, - {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ec53a09aee61d45e7dbe7e91252ff0491b6b5fee3d85b2d45b173d8ab453efc1"}, - {file = "lxml-4.9.4-cp27-cp27m-win32.whl", hash = "sha256:7d1d6c9e74c70ddf524e3c09d9dc0522aba9370708c2cb58680ea40174800013"}, - {file = "lxml-4.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:cb53669442895763e61df5c995f0e8361b61662f26c1b04ee82899c2789c8f69"}, - {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:647bfe88b1997d7ae8d45dabc7c868d8cb0c8412a6e730a7651050b8c7289cf2"}, - {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d973729ce04784906a19108054e1fd476bc85279a403ea1a72fdb051c76fa48"}, - {file = "lxml-4.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:056a17eaaf3da87a05523472ae84246f87ac2f29a53306466c22e60282e54ff8"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aaa5c173a26960fe67daa69aa93d6d6a1cd714a6eb13802d4e4bd1d24a530644"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:647459b23594f370c1c01768edaa0ba0959afc39caeeb793b43158bb9bb6a663"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bdd9abccd0927673cffe601d2c6cdad1c9321bf3437a2f507d6b037ef91ea307"}, - {file = "lxml-4.9.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:00e91573183ad273e242db5585b52670eddf92bacad095ce25c1e682da14ed91"}, - {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a602ed9bd2c7d85bd58592c28e101bd9ff9c718fbde06545a70945ffd5d11868"}, - {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de362ac8bc962408ad8fae28f3967ce1a262b5d63ab8cefb42662566737f1dc7"}, - {file = "lxml-4.9.4-cp310-cp310-win32.whl", hash = "sha256:33714fcf5af4ff7e70a49731a7cc8fd9ce910b9ac194f66eaa18c3cc0a4c02be"}, - {file = "lxml-4.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:d3caa09e613ece43ac292fbed513a4bce170681a447d25ffcbc1b647d45a39c5"}, - {file = "lxml-4.9.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:359a8b09d712df27849e0bcb62c6a3404e780b274b0b7e4c39a88826d1926c28"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:43498ea734ccdfb92e1886dfedaebeb81178a241d39a79d5351ba2b671bff2b2"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4855161013dfb2b762e02b3f4d4a21cc7c6aec13c69e3bffbf5022b3e708dd97"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c71b5b860c5215fdbaa56f715bc218e45a98477f816b46cfde4a84d25b13274e"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9a2b5915c333e4364367140443b59f09feae42184459b913f0f41b9fed55794a"}, - {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d82411dbf4d3127b6cde7da0f9373e37ad3a43e89ef374965465928f01c2b979"}, - {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:273473d34462ae6e97c0f4e517bd1bf9588aa67a1d47d93f760a1282640e24ac"}, - {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:389d2b2e543b27962990ab529ac6720c3dded588cc6d0f6557eec153305a3622"}, - {file = "lxml-4.9.4-cp311-cp311-win32.whl", hash = "sha256:8aecb5a7f6f7f8fe9cac0bcadd39efaca8bbf8d1bf242e9f175cbe4c925116c3"}, - {file = "lxml-4.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:c7721a3ef41591341388bb2265395ce522aba52f969d33dacd822da8f018aff8"}, - {file = "lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8"}, - {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229"}, - {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, - {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, - {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, - {file = "lxml-4.9.4-cp312-cp312-win32.whl", hash = "sha256:266f655d1baff9c47b52f529b5f6bec33f66042f65f7c56adde3fcf2ed62ae8b"}, - {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, - {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, - {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, - {file = "lxml-4.9.4-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:5557461f83bb7cc718bc9ee1f7156d50e31747e5b38d79cf40f79ab1447afd2d"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d74d4a3c4b8f7a1f676cedf8e84bcc57705a6d7925e6daef7a1e54ae543a197"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ac7674d1638df129d9cb4503d20ffc3922bd463c865ef3cb412f2c926108e9a4"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ddd92e18b783aeb86ad2132d84a4b795fc5ec612e3545c1b687e7747e66e2b53"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bd9ac6e44f2db368ef8986f3989a4cad3de4cd55dbdda536e253000c801bcc7"}, - {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bc354b1393dce46026ab13075f77b30e40b61b1a53e852e99d3cc5dd1af4bc85"}, - {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f836f39678cb47c9541f04d8ed4545719dc31ad850bf1832d6b4171e30d65d23"}, - {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9c131447768ed7bc05a02553d939e7f0e807e533441901dd504e217b76307745"}, - {file = "lxml-4.9.4-cp36-cp36m-win32.whl", hash = "sha256:bafa65e3acae612a7799ada439bd202403414ebe23f52e5b17f6ffc2eb98c2be"}, - {file = "lxml-4.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6197c3f3c0b960ad033b9b7d611db11285bb461fc6b802c1dd50d04ad715c225"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7b378847a09d6bd46047f5f3599cdc64fcb4cc5a5a2dd0a2af610361fbe77b16"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:1343df4e2e6e51182aad12162b23b0a4b3fd77f17527a78c53f0f23573663545"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6dbdacf5752fbd78ccdb434698230c4f0f95df7dd956d5f205b5ed6911a1367c"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:506becdf2ecaebaf7f7995f776394fcc8bd8a78022772de66677c84fb02dd33d"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca8e44b5ba3edb682ea4e6185b49661fc22b230cf811b9c13963c9f982d1d964"}, - {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d9d5726474cbbef279fd709008f91a49c4f758bec9c062dfbba88eab00e3ff9"}, - {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bbdd69e20fe2943b51e2841fc1e6a3c1de460d630f65bde12452d8c97209464d"}, - {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8671622256a0859f5089cbe0ce4693c2af407bc053dcc99aadff7f5310b4aa02"}, - {file = "lxml-4.9.4-cp37-cp37m-win32.whl", hash = "sha256:dd4fda67f5faaef4f9ee5383435048ee3e11ad996901225ad7615bc92245bc8e"}, - {file = "lxml-4.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6bee9c2e501d835f91460b2c904bc359f8433e96799f5c2ff20feebd9bb1e590"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:1f10f250430a4caf84115b1e0f23f3615566ca2369d1962f82bef40dd99cd81a"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b505f2bbff50d261176e67be24e8909e54b5d9d08b12d4946344066d66b3e43"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1449f9451cd53e0fd0a7ec2ff5ede4686add13ac7a7bfa6988ff6d75cff3ebe2"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4ece9cca4cd1c8ba889bfa67eae7f21d0d1a2e715b4d5045395113361e8c533d"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59bb5979f9941c61e907ee571732219fa4774d5a18f3fa5ff2df963f5dfaa6bc"}, - {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b1980dbcaad634fe78e710c8587383e6e3f61dbe146bcbfd13a9c8ab2d7b1192"}, - {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9ae6c3363261021144121427b1552b29e7b59de9d6a75bf51e03bc072efb3c37"}, - {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bcee502c649fa6351b44bb014b98c09cb00982a475a1912a9881ca28ab4f9cd9"}, - {file = "lxml-4.9.4-cp38-cp38-win32.whl", hash = "sha256:a8edae5253efa75c2fc79a90068fe540b197d1c7ab5803b800fccfe240eed33c"}, - {file = "lxml-4.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:701847a7aaefef121c5c0d855b2affa5f9bd45196ef00266724a80e439220e46"}, - {file = "lxml-4.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:f610d980e3fccf4394ab3806de6065682982f3d27c12d4ce3ee46a8183d64a6a"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aa9b5abd07f71b081a33115d9758ef6077924082055005808f68feccb27616bd"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:365005e8b0718ea6d64b374423e870648ab47c3a905356ab6e5a5ff03962b9a9"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:16b9ec51cc2feab009e800f2c6327338d6ee4e752c76e95a35c4465e80390ccd"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a905affe76f1802edcac554e3ccf68188bea16546071d7583fb1b693f9cf756b"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd814847901df6e8de13ce69b84c31fc9b3fb591224d6762d0b256d510cbf382"}, - {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91bbf398ac8bb7d65a5a52127407c05f75a18d7015a270fdd94bbcb04e65d573"}, - {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f99768232f036b4776ce419d3244a04fe83784bce871b16d2c2e984c7fcea847"}, - {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bb5bd6212eb0edfd1e8f254585290ea1dadc3687dd8fd5e2fd9a87c31915cdab"}, - {file = "lxml-4.9.4-cp39-cp39-win32.whl", hash = "sha256:88f7c383071981c74ec1998ba9b437659e4fd02a3c4a4d3efc16774eb108d0ec"}, - {file = "lxml-4.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:936e8880cc00f839aa4173f94466a8406a96ddce814651075f95837316369899"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:f6c35b2f87c004270fa2e703b872fcc984d714d430b305145c39d53074e1ffe0"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:606d445feeb0856c2b424405236a01c71af7c97e5fe42fbc778634faef2b47e4"}, - {file = "lxml-4.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1bdcbebd4e13446a14de4dd1825f1e778e099f17f79718b4aeaf2403624b0f7"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0a08c89b23117049ba171bf51d2f9c5f3abf507d65d016d6e0fa2f37e18c0fc5"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:232fd30903d3123be4c435fb5159938c6225ee8607b635a4d3fca847003134ba"}, - {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:231142459d32779b209aa4b4d460b175cadd604fed856f25c1571a9d78114771"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:520486f27f1d4ce9654154b4494cf9307b495527f3a2908ad4cb48e4f7ed7ef7"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:562778586949be7e0d7435fcb24aca4810913771f845d99145a6cee64d5b67ca"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a9e7c6d89c77bb2770c9491d988f26a4b161d05c8ca58f63fb1f1b6b9a74be45"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:786d6b57026e7e04d184313c1359ac3d68002c33e4b1042ca58c362f1d09ff58"}, - {file = "lxml-4.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95ae6c5a196e2f239150aa4a479967351df7f44800c93e5a975ec726fef005e2"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b556596c49fa1232b0fff4b0e69b9d4083a502e60e404b44341e2f8fb7187f5"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:cc02c06e9e320869d7d1bd323df6dd4281e78ac2e7f8526835d3d48c69060683"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:857d6565f9aa3464764c2cb6a2e3c2e75e1970e877c188f4aeae45954a314e0c"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c42ae7e010d7d6bc51875d768110c10e8a59494855c3d4c348b068f5fb81fdcd"}, - {file = "lxml-4.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f10250bb190fb0742e3e1958dd5c100524c2cc5096c67c8da51233f7448dc137"}, - {file = "lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e"}, +python-versions = ">=3.6" +files = [ + {file = "lxml-5.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9cc30dc3c49ea914fa62ea73b57198b541cf2cd522fcf2b9559f99a24df769bb"}, + {file = "lxml-5.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d0824e3ddb969fe1337b1bc45cf0bec8095b342f36903f41a74b7769cc8c73"}, + {file = "lxml-5.1.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4958c378d9387c45ef8c4859495cf6be76f863e4e3b31494f6ec7f2c48d3b8e3"}, + {file = "lxml-5.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aff34295a6c87638a1f1905355cf3a97e4026c45c0cf3bb6ed6bc35b885b4a33"}, + {file = "lxml-5.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b174885fd2cabd1ad48585296f495e25d607f02db99668c08b2afaceb668e21b"}, + {file = "lxml-5.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1b0611bba10d6f5467b86673e8f6bba4de0d00f7d111eea843bc872abfe11b5c"}, + {file = "lxml-5.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:adff469b7dbfe9f3babc9e4479449ee97085ba70ac492fbe5f0f7217940c6731"}, + {file = "lxml-5.1.1-cp310-cp310-win32.whl", hash = "sha256:99bcdf665576a26b44c7ce767d76b769a4418b0a13cda8300b26fb7b2647bd5b"}, + {file = "lxml-5.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3da8db291568c27b2bb248dcfc8838ca3149f373a24e204bcd1c2c89e2813d14"}, + {file = "lxml-5.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906966babd374fdfe46e130fc656488003f0d0d63b7cba612aa5a796c8804283"}, + {file = "lxml-5.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03f3715c68fc707d9383d56e482d95d198ba07cb3dad4aee9e5a5ca06b2536"}, + {file = "lxml-5.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d26243d994d4077a50056e9008848e5b421be0c6f0fd4e932a9463e1d89fc42b"}, + {file = "lxml-5.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de00750318ae6869b9dfa6429a4f82b8ecad043049414547474d09db549c2ee"}, + {file = "lxml-5.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29b2771b4eec4e85063f10294facdd9829d010e6cc9668040d0cf936dc56733a"}, + {file = "lxml-5.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d9358f7268c161dc0a1c3216018f26c04954b5dd47ba6dead79da6598f4725d4"}, + {file = "lxml-5.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8a943826e7a9254eed661a7134fcde3c832a9fecd989d0f47c6e08c7b769cb2c"}, + {file = "lxml-5.1.1-cp311-cp311-win32.whl", hash = "sha256:74d0967c6f91eec6fe91159f9e8ccb3720fa0fbf9f462109c7bef62550df397c"}, + {file = "lxml-5.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:26974096654241df08a30dc2eb0e139c1ad5653660aa4b2ced66000230e96c14"}, + {file = "lxml-5.1.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:55e13a19829dcdbf0c5233062977aeb6daf72e65124909128045976f659164e8"}, + {file = "lxml-5.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:adedfb61be862f48907218e3a24bf051fd2ecca53358f3958b0bdb17d7881c20"}, + {file = "lxml-5.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77425482e4311d1cff119a2b5ab26c52ec209d2a3d728a54db3223ab91995e20"}, + {file = "lxml-5.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d380f183bd03ab827899753ea96dabe27d2025eb0bfd4f2ac0eee4afa0f351d"}, + {file = "lxml-5.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8682af96b5ad5093aab9eee5e4ff24cb7a9796c78699d914dd456ebfe7484a6"}, + {file = "lxml-5.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68eed33377a9925aed7ba56c8611d50aaa1e45638c07a92b4b4b0a0436cc2dd2"}, + {file = "lxml-5.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7c1d2f6e9c7a1c4478146ee38d16dbe0eb3be998424bc0f01346c671c38b86d"}, + {file = "lxml-5.1.1-cp312-cp312-win32.whl", hash = "sha256:81107c8de3e463052ae8fd05fd31b97c371c7a9ce4a189b8bb5f45b0b3545fb9"}, + {file = "lxml-5.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e46181d15fae102c53621bed9356b7a599a1e837b978c934a350dd00842b1d9"}, + {file = "lxml-5.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:48dd28b9f410329de709a4bb6169c58f2cd8bff25f5a48d647678ec9b8a40c65"}, + {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf7e57dbe7b3c605e63849d9c8dae246a6ab9002223c57cd3f3dec7c3a0a8e6d"}, + {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5020b3081030b5cfc8149eee231167aea4ff68df73a610e1d542809e1f11fde7"}, + {file = "lxml-5.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77842b79b63c83c04dcfe2f045c78e15e4d97c86838eabd2e6518c1ed97e3900"}, + {file = "lxml-5.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:666432274881cb2535e71dbe745e08ef10fe25c81fbb1a6b1e3c973177823b0c"}, + {file = "lxml-5.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a103426e809640a2d985062d2f4b28db2f0fe4469ff72a67cb31fa70613158f1"}, + {file = "lxml-5.1.1-cp36-cp36m-win32.whl", hash = "sha256:95a51324a55000c55f4ab79e1f7f1e0bc42b7a24e39633f79542753023a9d4b7"}, + {file = "lxml-5.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:bd46b5b19ac969de8e87fb3d04414641d12ee489e2ea6cc75344087829b31c63"}, + {file = "lxml-5.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59ca75cfcf646ff64aa19ca4e7fd2a0fde77268d5a87856525d9e0b69b77d0c4"}, + {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55ddc73dec971277b181a6d1a6abdd34f50e4511e1e60f6b4ebe22cbaad05bb"}, + {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56f1e813ff660d031c77edba90a068d57e47ae93a9e811330fc88946fa68af9a"}, + {file = "lxml-5.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43f21b5929185fa4560836942020bb00a0fcdec9f67be98cac1a4b99501757c1"}, + {file = "lxml-5.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1528b37e83c3aeecb438e76e5be6279b353275560125a9c3f4d74642c5f110f9"}, + {file = "lxml-5.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2992480a25434d2df31413136ef87effab14d43b07f1f54c5012c4f6c7530144"}, + {file = "lxml-5.1.1-cp37-cp37m-win32.whl", hash = "sha256:1d0270d33fbde6e1c6758ff58e2e284144f5331aa05dfe7f44ceafdf4e9d31aa"}, + {file = "lxml-5.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dec3491aa69a91ed07f5e6bc033e2b1a9424447ad5312ee69ac973e94d79083a"}, + {file = "lxml-5.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bd2595ebe95214446e00a1ab94571f778b126e17736ea222c07505c4e092289"}, + {file = "lxml-5.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfbdadc3cfe552331ecb0bbdcabf148d1697c73aa4321151e0e6c1704eeb76a7"}, + {file = "lxml-5.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52358249292bc155af681a9240ec3d944c1195f0124aa10ec4e3635adc1e10a1"}, + {file = "lxml-5.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036b36c48cd775e4fd2084b34ae62ffeefa7a01f955f5a5b816f9257c308cfc0"}, + {file = "lxml-5.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f05ab8cea65363d0cc7ce818f42407504b6d94ca885b4cde0270f021e2f4ef61"}, + {file = "lxml-5.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d94a28c16cc430b68c374b37b8bb536ba5f0a4a080be0e1daa8310c44a00a75c"}, + {file = "lxml-5.1.1-cp38-cp38-win32.whl", hash = "sha256:9113fe65a62f834b8e994c8f48e7b2179bf81878c0ec80ad7feba51ab9417663"}, + {file = "lxml-5.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:acff17e0cd5344677757a152631d8411efac6a84e4476d60123a9b33f5d6c511"}, + {file = "lxml-5.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a94a97380ad689d751eb0a1e1ccd2a0622c5141771a31abe9a16075f80027e95"}, + {file = "lxml-5.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f4d37b3f8d2d44493edce3d65ac987127bababd8ae208a6f0d7d260852346e"}, + {file = "lxml-5.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5940f188189956ccb3d1adb413001ada79f2d2b81087d2612a0cc4a1197eed"}, + {file = "lxml-5.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50007f4e94dc4e38030487a8b6c4af87a2d51ed059c7b74b29e3dd937cb1dfe1"}, + {file = "lxml-5.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305d0469177fd78a0a9aa2231c60218266bb85d4b7955f9b67dab628c9267fd"}, + {file = "lxml-5.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:13b73d78a8023203722cf98e9ea0b222da83110d1d5ef437ef8782a7755b4586"}, + {file = "lxml-5.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc6904519dd1f92eb82f7d49814a33bbc444d0b66b1438e76daf3f79ef4aa38f"}, + {file = "lxml-5.1.1-cp39-cp39-win32.whl", hash = "sha256:04ef231dde88294a5499f61a74cdc42af97d8d5ecec1b0a645d1c7d436942789"}, + {file = "lxml-5.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:071e5123d1eca861708c4be5b54e4d88923fa33fab3aa02722e907518b07071c"}, + {file = "lxml-5.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:19c6bc7476eeac4598ff925ae98597610109e21af4cd7ab1e060efcfc4b1c6e2"}, + {file = "lxml-5.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20cd17eb21f5ae54da96791c49e1fbd3327bf66b2c00556cdf8d0552c2270f92"}, + {file = "lxml-5.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a02ed1ebc469734dbfed5b688f709334de19e7a333cba7ae187b17d2b2c1d4ff"}, + {file = "lxml-5.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:161838cb95c97e8d76d01e544a3570b52ab6b863f4897a90e1f073bb110a75ba"}, + {file = "lxml-5.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1abbf2249467a37da45fb2d7ff37e578dfc9813f142800e58db9da761cb7899"}, + {file = "lxml-5.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6c49eb5deaed1990fde5b5d80d6800aec1b5fd6113346b5f11068d988f68f2c4"}, + {file = "lxml-5.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:60ceffdca5d637fe8ee95c7f06733a6c9646e07da80997efe3af2d4b4f366e36"}, + {file = "lxml-5.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a76a7b35e7660c74eb3f943c19f5f78c882dceab890cf8017027b6100b79ad8e"}, + {file = "lxml-5.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5dcb373720b70aa05419e508265dd86f06886ca0388967f6f024fbc4d551379f"}, + {file = "lxml-5.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3641bc124b037921de4220538a5ebb52354fd2799fc2bbfb335d28096063c7d6"}, + {file = "lxml-5.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a6e9b34f59c9755aa279c652e1c48c333c665d05a88afcd8e5ff0bde86f3b14"}, + {file = "lxml-5.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:318847c165063549c8fda6b162a0d068689b10deb825cb3859caef69fddaaaff"}, + {file = "lxml-5.1.1.tar.gz", hash = "sha256:42a8aa957e98bd8b884a8142175ec24ce4ef0a57760e8879f193bfe64b757ca9"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (==0.29.37)"] +source = ["Cython (>=3.0.9)"] [[package]] name = "mail-parser" @@ -2350,82 +2319,82 @@ six = ">=1.15,<2" [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "marqo" -version = "3.0.0" +version = "3.4.0" description = "Tensor search for humans" optional = true python-versions = ">=3" files = [ - {file = "marqo-3.0.0-py3-none-any.whl", hash = "sha256:6b3e2135799fdc0eb0af18fc947cfc13222dccaaa16450fe1af27d89f6331705"}, - {file = "marqo-3.0.0.tar.gz", hash = "sha256:72179435ac7277ca65de3ad1e6c699eedb4cb06de4e568c4280eb4469ab0fcc5"}, + {file = "marqo-3.4.0-py3-none-any.whl", hash = "sha256:4b1b70f841596f6ae13bab61646286b0a1b5792e0e31815f757c15286fef0570"}, + {file = "marqo-3.4.0.tar.gz", hash = "sha256:d1a0ccc8b938c456e8ed56c2326bcff2b7a4d039496a24394b29d67dafb61b64"}, ] [package.dependencies] @@ -2437,22 +2406,21 @@ urllib3 = ">=1.26.0,<2.0.0" [[package]] name = "marshmallow" -version = "3.20.2" +version = "3.21.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, - {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, + {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, + {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["pre-commit (>=2.4,<4.0)"] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -2507,34 +2475,34 @@ files = [ [[package]] name = "mkdocs" -version = "1.5.3" +version = "1.6.0" description = "Project documentation with Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, - {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, + {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, + {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" -markdown = ">=3.2.1" +markdown = ">=3.3.6" markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" packaging = ">=20.5" pathspec = ">=0.11.1" -platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" @@ -2566,6 +2534,23 @@ files = [ [package.dependencies] mkdocs = ">=1.0.3" +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + [[package]] name = "mkdocs-glightbox" version = "0.3.7" @@ -2593,13 +2578,13 @@ mkdocs = ">=1.0.3" [[package]] name = "mkdocs-material" -version = "9.5.17" +version = "9.5.23" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.17-py3-none-any.whl", hash = "sha256:14a2a60119a785e70e765dd033e6211367aca9fc70230e577c1cf6a326949571"}, - {file = "mkdocs_material-9.5.17.tar.gz", hash = "sha256:06ae1275a72db1989cf6209de9e9ecdfbcfdbc24c58353877b2bb927dbe413e4"}, + {file = "mkdocs_material-9.5.23-py3-none-any.whl", hash = "sha256:ffd08a5beaef3cd135aceb58ded8b98bbbbf2b70e5b656f6a14a63c917d9b001"}, + {file = "mkdocs_material-9.5.23.tar.gz", hash = "sha256:4627fc3f15de2cba2bde9debc2fd59b9888ef494beabfe67eb352e23d14bf288"}, ] [package.dependencies] @@ -2607,7 +2592,7 @@ babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" -mkdocs = ">=1.5.3,<1.6.0" +mkdocs = ">=1.6,<2.0" mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" @@ -2633,13 +2618,13 @@ files = [ [[package]] name = "mkdocs-section-index" -version = "0.3.8" +version = "0.3.9" description = "MkDocs plugin to allow clickable sections that lead to an index page" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, - {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, + {file = "mkdocs_section_index-0.3.9-py3-none-any.whl", hash = "sha256:5e5eb288e8d7984d36c11ead5533f376fdf23498f44e903929d72845b24dfe34"}, + {file = "mkdocs_section_index-0.3.9.tar.gz", hash = "sha256:b66128d19108beceb08b226ee1ba0981840d14baf8a652b6c59e650f3f92e4f8"}, ] [package.dependencies] @@ -2715,13 +2700,13 @@ files = [ [[package]] name = "moto" -version = "4.2.13" +version = "4.2.14" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "moto-4.2.13-py2.py3-none-any.whl", hash = "sha256:93e0fd13b624bd79115494f833308c3641b2be0fc9f4f18aa9264aa01f6168e0"}, - {file = "moto-4.2.13.tar.gz", hash = "sha256:01aef6a489a725c8d725bd3dc6f70ff1bedaee3e2641752e4b471ff0ede4b4d7"}, + {file = "moto-4.2.14-py2.py3-none-any.whl", hash = "sha256:6d242dbbabe925bb385ddb6958449e5c827670b13b8e153ed63f91dbdb50372c"}, + {file = "moto-4.2.14.tar.gz", hash = "sha256:8f9263ca70b646f091edcc93e97cda864a542e6d16ed04066b1370ed217bd190"}, ] [package.dependencies] @@ -2747,18 +2732,13 @@ awslambda = ["docker (>=3.0.0)"] batch = ["docker (>=3.0.0)"] cloudformation = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.5.0)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] cognitoidp = ["ecdsa (!=0.15)", "python-jose[cryptography] (>=3.1.0,<4.0.0)"] -ds = ["sshpubkeys (>=3.1.0)"] dynamodb = ["docker (>=3.0.0)", "py-partiql-parser (==0.5.0)"] dynamodbstreams = ["docker (>=3.0.0)", "py-partiql-parser (==0.5.0)"] -ebs = ["sshpubkeys (>=3.1.0)"] ec2 = ["sshpubkeys (>=3.1.0)"] -efs = ["sshpubkeys (>=3.1.0)"] -eks = ["sshpubkeys (>=3.1.0)"] glue = ["pyparsing (>=3.0.7)"] iotdata = ["jsondiff (>=1.1.2)"] proxy = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=2.5.1)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "multipart", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.5.0)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] -resourcegroupstaggingapi = ["PyYAML (>=5.1)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.5.0)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "sshpubkeys (>=3.1.0)"] -route53resolver = ["sshpubkeys (>=3.1.0)"] +resourcegroupstaggingapi = ["PyYAML (>=5.1)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.5.0)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)"] s3 = ["PyYAML (>=5.1)", "py-partiql-parser (==0.5.0)"] s3crc32c = ["PyYAML (>=5.1)", "crc32c", "py-partiql-parser (==0.5.0)"] server = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "flask (!=2.2.0,!=2.2.1)", "flask-cors", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.5.0)", "py-partiql-parser (==0.5.0)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] @@ -2767,96 +2747,112 @@ xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = true python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] name = "mypy-boto3-bedrock" -version = "1.34.0" -description = "Type annotations for boto3.Bedrock 1.34.0 service generated with mypy-boto3-builder 7.21.0" +version = "1.34.90" +description = "Type annotations for boto3.Bedrock 1.34.90 service generated with mypy-boto3-builder 7.23.2" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mypy-boto3-bedrock-1.34.0.tar.gz", hash = "sha256:2603ad9ef33473511401e9bc6ee1a0fbb8cd77a854331e0d0f062d60efff8973"}, - {file = "mypy_boto3_bedrock-1.34.0-py3-none-any.whl", hash = "sha256:9a1dc86638ebec478df43dd36676d52a444fdc42b700c2464113c6654c3d2384"}, + {file = "mypy_boto3_bedrock-1.34.90-py3-none-any.whl", hash = "sha256:36fbd11b6db51284891b6aa87d16653afa1f57a58e1181cdafcd99e67079d3ca"}, + {file = "mypy_boto3_bedrock-1.34.90.tar.gz", hash = "sha256:a8a71505c6aa268bd182259f79d26d9daa5ae3a27ff471394a424eef2afa78bb"}, ] [package.dependencies] @@ -2864,13 +2860,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-iam" -version = "1.34.8" -description = "Type annotations for boto3.IAM 1.34.8 service generated with mypy-boto3-builder 7.23.0" +version = "1.34.83" +description = "Type annotations for boto3.IAM 1.34.83 service generated with mypy-boto3-builder 7.23.2" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-boto3-iam-1.34.8.tar.gz", hash = "sha256:6faf68cf800182924687b6711b3f9afa8d940ad993f259a3b91e55e82892d641"}, - {file = "mypy_boto3_iam-1.34.8-py3-none-any.whl", hash = "sha256:0d13057a2141c5633b78ed0b1aed8f2f8a11a9c58a8a17a25622d966428a41b0"}, + {file = "mypy-boto3-iam-1.34.83.tar.gz", hash = "sha256:7261315616757ebf7509df0e9b091d5942e470eb51c4b23c662a06873a9a8eca"}, + {file = "mypy_boto3_iam-1.34.83-py3-none-any.whl", hash = "sha256:dec66a98e29ec1e36178c24b8ff57aab6b91230df97557363bbd90ec06874768"}, ] [package.dependencies] @@ -2878,13 +2874,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-opensearch" -version = "1.34.13" -description = "Type annotations for boto3.OpenSearchService 1.34.13 service generated with mypy-boto3-builder 7.23.0" +version = "1.34.95" +description = "Type annotations for boto3.OpenSearchService 1.34.95 service generated with mypy-boto3-builder 7.24.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-boto3-opensearch-1.34.13.tar.gz", hash = "sha256:a0ad105dbb19f2b30bf69e4702282f7e1772f83a3bfce3a386646c9b5c53b520"}, - {file = "mypy_boto3_opensearch-1.34.13-py3-none-any.whl", hash = "sha256:da502c66acc75050c56b9692627e79c4baba7e193801285ee1891d7f65193efd"}, + {file = "mypy_boto3_opensearch-1.34.95-py3-none-any.whl", hash = "sha256:ddec083f059886f8b3fc2c68bdf3cd810bbf75492a8fc19fef91f974963344e0"}, + {file = "mypy_boto3_opensearch-1.34.95.tar.gz", hash = "sha256:108c6aeb9cf557a6b3aa2346d2bd5842fb0032bdcb6cb8c0f23cda6ed349462f"}, ] [package.dependencies] @@ -2892,13 +2888,13 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-s3" -version = "1.34.14" -description = "Type annotations for boto3.S3 1.34.14 service generated with mypy-boto3-builder 7.21.0" +version = "1.34.105" +description = "Type annotations for boto3.S3 1.34.105 service generated with mypy-boto3-builder 7.24.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-boto3-s3-1.34.14.tar.gz", hash = "sha256:71c39ab0623cdb442d225b71c1783f6a513cff4c4a13505a2efbb2e3aff2e965"}, - {file = "mypy_boto3_s3-1.34.14-py3-none-any.whl", hash = "sha256:f9669ecd182d5bf3532f5f2dcc5e5237776afe157ad5a0b37b26d6bec5fcc432"}, + {file = "mypy_boto3_s3-1.34.105-py3-none-any.whl", hash = "sha256:95fbc6bcba2bb03c20a97cc5cf60ff66c6842c8c4fc4183c49bfa35905d5a1ee"}, + {file = "mypy_boto3_s3-1.34.105.tar.gz", hash = "sha256:a137bca9bbe86c0fe35bbf36a2d44ab62526f41bb683550dd6cfbb5a10ede832"}, ] [package.dependencies] @@ -2906,52 +2902,41 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} [[package]] name = "mypy-boto3-sagemaker" -version = "1.34.19" -description = "Type annotations for boto3.SageMaker 1.34.19 service generated with mypy-boto3-builder 7.23.1" +version = "1.34.103" +description = "Type annotations for boto3.SageMaker 1.34.103 service generated with mypy-boto3-builder 7.24.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-boto3-sagemaker-1.34.19.tar.gz", hash = "sha256:ba6ae404f6a87359343af0d2b7ecaac380dcf7d1b12c89d64d073489a8e8e793"}, - {file = "mypy_boto3_sagemaker-1.34.19-py3-none-any.whl", hash = "sha256:44f60275a3fa8b09581788c2069c2f32b36ac3b1a9d2335fc44a7eecd7954a76"}, + {file = "mypy_boto3_sagemaker-1.34.103-py3-none-any.whl", hash = "sha256:f00deadbcaf89c9f1af62a23a697e5d5590453fc8211faf9ed84871499d51dad"}, + {file = "mypy_boto3_sagemaker-1.34.103.tar.gz", hash = "sha256:7e2c9dd16866314080c8aa1cbc561301599a87e3dce4759e293090e93ed8b5ef"}, ] [package.dependencies] typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - [[package]] name = "nh3" -version = "0.2.15" +version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, - {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, - {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, - {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9"}, + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10"}, + {file = "nh3-0.2.17-cp37-abi3-win32.whl", hash = "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911"}, + {file = "nh3-0.2.17-cp37-abi3-win_amd64.whl", hash = "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb"}, + {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, ] [[package]] @@ -2970,58 +2955,58 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openai" -version = "1.9.0" +version = "1.30.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.9.0-py3-none-any.whl", hash = "sha256:5774a0582ed82f6de92200ed5024e03e272b93e04e9d31caeda5fb80f63df50d"}, - {file = "openai-1.9.0.tar.gz", hash = "sha256:3e9947a544556c051fa138a4def5bd8b468364ec52803c6628532ab949ddce55"}, + {file = "openai-1.30.1-py3-none-any.whl", hash = "sha256:c9fb3c3545c118bbce8deb824397b9433a66d0d0ede6a96f7009c95b76de4a46"}, + {file = "openai-1.30.1.tar.gz", hash = "sha256:4f85190e577cba0b066e1950b8eb9b11d25bc7ebcc43a86b326ce1bfa564ec74"}, ] [package.dependencies] @@ -3038,13 +3023,13 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opensearch-py" -version = "2.4.2" +version = "2.5.0" description = "Python client for OpenSearch" optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,<4,>=2.7" files = [ - {file = "opensearch-py-2.4.2.tar.gz", hash = "sha256:564f175af134aa885f4ced6846eb4532e08b414fff0a7976f76b276fe0e69158"}, - {file = "opensearch_py-2.4.2-py2.py3-none-any.whl", hash = "sha256:7867319132133e2974c09f76a54eb1d502b989229be52da583d93ddc743ea111"}, + {file = "opensearch-py-2.5.0.tar.gz", hash = "sha256:0dde4ac7158a717d92a8cd81964cb99705a4b80bcf9258ba195b9a9f23f5226d"}, + {file = "opensearch_py-2.5.0-py2.py3-none-any.whl", hash = "sha256:cf093a40e272b60663f20417fc1264ac724dcf1e03c1a4542a6b44835b1e6c49"}, ] [package.dependencies] @@ -3052,7 +3037,7 @@ certifi = ">=2022.12.07" python-dateutil = "*" requests = ">=2.4.0,<3.0.0" six = "*" -urllib3 = ">=1.26.18" +urllib3 = ">=1.26.18,<2" [package.extras] async = ["aiohttp (>=3,<4)"] @@ -3062,13 +3047,13 @@ kerberos = ["requests-kerberos"] [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -3171,12 +3156,12 @@ ptyprocess = ">=0.5" [[package]] name = "pgvector" -version = "0.2.4" +version = "0.2.5" description = "pgvector support for Python" optional = true python-versions = ">=3.8" files = [ - {file = "pgvector-0.2.4-py2.py3-none-any.whl", hash = "sha256:548e1f88d3c7433020c1c177feddad2f36915c262852d621f9018fcafff6870b"}, + {file = "pgvector-0.2.5-py2.py3-none-any.whl", hash = "sha256:5e5e93ec4d3c45ab1fa388729d56c602f6966296e19deee8878928c6d567e41b"}, ] [package.dependencies] @@ -3184,79 +3169,80 @@ numpy = "*" [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = true python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] @@ -3292,62 +3278,63 @@ grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv [[package]] name = "pkginfo" -version = "1.9.6" +version = "1.10.0" description = "Query metadata from sdists / bdists / installed packages." optional = false python-versions = ">=3.6" files = [ - {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, - {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, + {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, + {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, ] [package.extras] -testing = ["pytest", "pytest-cov"] +testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "3.11.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "playwright" -version = "1.42.0" +version = "1.43.0" description = "A high-level API to automate web browsers" optional = true python-versions = ">=3.8" files = [ - {file = "playwright-1.42.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e2b293f077efeaa45253fde31cea4bc6b0ae8be6b5e65e8ce8b4aa3b9f0d55b6"}, - {file = "playwright-1.42.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:283887f0bdd0039c3d720e32fbc73a045c24fa800599a6ad60fb199c29580534"}, - {file = "playwright-1.42.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:4e1fc1c049a0af64626ddd50814d14a01f316bcbb4d1aa83c3416fe420add558"}, - {file = "playwright-1.42.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:313f2551a772f57c9ccca017c4dd4661f2277166f9e1d84bbf5a2e316f0f892c"}, - {file = "playwright-1.42.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2a46a24641e5d468046cde567c98fdb8d85e32df901630b14dfb288cbd1ed4f"}, - {file = "playwright-1.42.0-py3-none-win32.whl", hash = "sha256:dbf473496808d4c2c816902c1dee2aabc029648e56ce8514b643f5a1a6fc8e22"}, - {file = "playwright-1.42.0-py3-none-win_amd64.whl", hash = "sha256:e092c6cfbf797bff03fbdfc53c3e6a9e29fbcf6b82f9e43113d37494aee0561b"}, + {file = "playwright-1.43.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b03b12bd4da9c2cfb78dff820deac8b52892fe3c2f89a4d95d6f08c59e41deb9"}, + {file = "playwright-1.43.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e9ec21b141727392f630761c7f4dec46d80c98243614257cc501b64ff636d337"}, + {file = "playwright-1.43.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:e05a8d8fb2040c630429cca07e843c8fa33059717837c8f50c01b7d1fc651ce1"}, + {file = "playwright-1.43.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:50d9a5c07c76456945a2296d63f78fdf6eb11aed3e8d39bb5ccbda760a8d6d41"}, + {file = "playwright-1.43.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87191272c40b4c282cf2c9449ca3acaf705f38ac6e2372270f1617ce16b661b8"}, + {file = "playwright-1.43.0-py3-none-win32.whl", hash = "sha256:bd8b818904b17e2914be23e7bc2a340b203f57fe81678520b10f908485b056ea"}, + {file = "playwright-1.43.0-py3-none-win_amd64.whl", hash = "sha256:9b7bd707eeeaebee47f656b2de90aa9bd85e9ca2c6af7a08efd73896299e4d50"}, ] [package.dependencies] greenlet = "3.0.3" -pyee = "11.0.1" +pyee = "11.1.0" [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -3367,13 +3354,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.6.0" +version = "3.7.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, - {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, + {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, + {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, ] [package.dependencies] @@ -3556,83 +3543,83 @@ dev = ["black (==22.6.0)", "flake8", "mypy", "pytest"] [[package]] name = "pyasn1" -version = "0.5.1" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, - {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "1.10.14" +version = "1.10.15" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, - {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, - {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, - {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, - {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, - {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, - {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, - {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, - {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, - {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"}, + {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, + {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, + {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"}, + {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"}, + {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"}, + {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"}, + {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, + {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, ] [package.dependencies] @@ -3644,34 +3631,33 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pyee" -version = "11.0.1" +version = "11.1.0" description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" optional = true python-versions = ">=3.8" files = [ - {file = "pyee-11.0.1-py3-none-any.whl", hash = "sha256:9bcc9647822234f42c228d88de63d0f9ffa881e87a87f9d36ddf5211f6ac977d"}, - {file = "pyee-11.0.1.tar.gz", hash = "sha256:a642c51e3885a33ead087286e35212783a4e9b8d6514a10a5db4e57ac57b2b29"}, + {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, + {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, ] [package.dependencies] typing-extensions = "*" [package.extras] -dev = ["black", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -3693,17 +3679,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "10.7.1" +version = "10.8.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, - {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, + {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, + {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, ] [package.dependencies] -markdown = ">=3.5" +markdown = ">=3.6" pyyaml = "*" [package.extras] @@ -3711,100 +3697,79 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pymongo" -version = "4.6.1" +version = "4.7.2" description = "Python driver for MongoDB " optional = true python-versions = ">=3.7" files = [ - {file = "pymongo-4.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4344c30025210b9fa80ec257b0e0aab5aa1d5cca91daa70d82ab97b482cc038e"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:1c5654bb8bb2bdb10e7a0bc3c193dd8b49a960b9eebc4381ff5a2043f4c3c441"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:eaf2f65190c506def2581219572b9c70b8250615dc918b3b7c218361a51ec42e"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:262356ea5fcb13d35fb2ab6009d3927bafb9504ef02339338634fffd8a9f1ae4"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:2dd2f6960ee3c9360bed7fb3c678be0ca2d00f877068556785ec2eb6b73d2414"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:ff925f1cca42e933376d09ddc254598f8c5fcd36efc5cac0118bb36c36217c41"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:3cadf7f4c8e94d8a77874b54a63c80af01f4d48c4b669c8b6867f86a07ba994f"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55dac73316e7e8c2616ba2e6f62b750918e9e0ae0b2053699d66ca27a7790105"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:154b361dcb358ad377d5d40df41ee35f1cc14c8691b50511547c12404f89b5cb"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2940aa20e9cc328e8ddeacea8b9a6f5ddafe0b087fedad928912e787c65b4909"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:010bc9aa90fd06e5cc52c8fac2c2fd4ef1b5f990d9638548dde178005770a5e8"}, - {file = "pymongo-4.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e470fa4bace5f50076c32f4b3cc182b31303b4fefb9b87f990144515d572820b"}, - {file = "pymongo-4.6.1-cp310-cp310-win32.whl", hash = "sha256:da08ea09eefa6b960c2dd9a68ec47949235485c623621eb1d6c02b46765322ac"}, - {file = "pymongo-4.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:13d613c866f9f07d51180f9a7da54ef491d130f169e999c27e7633abe8619ec9"}, - {file = "pymongo-4.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6a0ae7a48a6ef82ceb98a366948874834b86c84e288dbd55600c1abfc3ac1d88"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bd94c503271e79917b27c6e77f7c5474da6930b3fb9e70a12e68c2dff386b9a"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d4ccac3053b84a09251da8f5350bb684cbbf8c8c01eda6b5418417d0a8ab198"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:349093675a2d3759e4fb42b596afffa2b2518c890492563d7905fac503b20daa"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88beb444fb438385e53dc9110852910ec2a22f0eab7dd489e827038fdc19ed8d"}, - {file = "pymongo-4.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8e62d06e90f60ea2a3d463ae51401475568b995bafaffd81767d208d84d7bb1"}, - {file = "pymongo-4.6.1-cp311-cp311-win32.whl", hash = "sha256:5556e306713e2522e460287615d26c0af0fe5ed9d4f431dad35c6624c5d277e9"}, - {file = "pymongo-4.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:b10d8cda9fc2fcdcfa4a000aa10413a2bf8b575852cd07cb8a595ed09689ca98"}, - {file = "pymongo-4.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b435b13bb8e36be11b75f7384a34eefe487fe87a6267172964628e2b14ecf0a7"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e438417ce1dc5b758742e12661d800482200b042d03512a8f31f6aaa9137ad40"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b47ebd89e69fbf33d1c2df79759d7162fc80c7652dacfec136dae1c9b3afac7"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbed8cccebe1169d45cedf00461b2842652d476d2897fd1c42cf41b635d88746"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30a9e06041fbd7a7590693ec5e407aa8737ad91912a1e70176aff92e5c99d20"}, - {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, - {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, - {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:026a24a36394dc8930cbcb1d19d5eb35205ef3c838a7e619e04bd170713972e7"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:3b287e814a01deddb59b88549c1e0c87cefacd798d4afc0c8bd6042d1c3d48aa"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9a710c184ba845afb05a6f876edac8f27783ba70e52d5eaf939f121fc13b2f59"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:30b2c9caf3e55c2e323565d1f3b7e7881ab87db16997dc0cbca7c52885ed2347"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff62ba8ff70f01ab4fe0ae36b2cb0b5d1f42e73dfc81ddf0758cd9f77331ad25"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:547dc5d7f834b1deefda51aedb11a7af9c51c45e689e44e14aa85d44147c7657"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1de3c6faf948f3edd4e738abdb4b76572b4f4fdfc1fed4dad02427e70c5a6219"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2831e05ce0a4df10c4ac5399ef50b9a621f90894c2a4d2945dc5658765514ed"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:144a31391a39a390efce0c5ebcaf4bf112114af4384c90163f402cec5ede476b"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33bb16a07d3cc4e0aea37b242097cd5f7a156312012455c2fa8ca396953b11c4"}, - {file = "pymongo-4.6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b7b1a83ce514700276a46af3d9e481ec381f05b64939effc9065afe18456a6b9"}, - {file = "pymongo-4.6.1-cp37-cp37m-win32.whl", hash = "sha256:3071ec998cc3d7b4944377e5f1217c2c44b811fae16f9a495c7a1ce9b42fb038"}, - {file = "pymongo-4.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2346450a075625c4d6166b40a013b605a38b6b6168ce2232b192a37fb200d588"}, - {file = "pymongo-4.6.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:061598cbc6abe2f382ab64c9caa83faa2f4c51256f732cdd890bcc6e63bfb67e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d483793a384c550c2d12cb794ede294d303b42beff75f3b3081f57196660edaf"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f9756f1d25454ba6a3c2f1ef8b7ddec23e5cdeae3dc3c3377243ae37a383db00"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:1ed23b0e2dac6f84f44c8494fbceefe6eb5c35db5c1099f56ab78fc0d94ab3af"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:3d18a9b9b858ee140c15c5bfcb3e66e47e2a70a03272c2e72adda2482f76a6ad"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:c258dbacfff1224f13576147df16ce3c02024a0d792fd0323ac01bed5d3c545d"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:f7acc03a4f1154ba2643edeb13658d08598fe6e490c3dd96a241b94f09801626"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:76013fef1c9cd1cd00d55efde516c154aa169f2bf059b197c263a255ba8a9ddf"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0e6a6c807fa887a0c51cc24fe7ea51bb9e496fe88f00d7930063372c3664c3"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd1fa413f8b9ba30140de198e4f408ffbba6396864c7554e0867aa7363eb58b2"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d219b4508f71d762368caec1fc180960569766049bbc4d38174f05e8ef2fe5b"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b81ecf18031998ad7db53b960d1347f8f29e8b7cb5ea7b4394726468e4295e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56816e43c92c2fa8c11dc2a686f0ca248bea7902f4a067fa6cbc77853b0f041e"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef801027629c5b511cf2ba13b9be29bfee36ae834b2d95d9877818479cdc99ea"}, - {file = "pymongo-4.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d4c2be9760b112b1caf649b4977b81b69893d75aa86caf4f0f398447be871f3c"}, - {file = "pymongo-4.6.1-cp38-cp38-win32.whl", hash = "sha256:39d77d8bbb392fa443831e6d4ae534237b1f4eee6aa186f0cdb4e334ba89536e"}, - {file = "pymongo-4.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:4497d49d785482cc1a44a0ddf8830b036a468c088e72a05217f5b60a9e025012"}, - {file = "pymongo-4.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:69247f7a2835fc0984bbf0892e6022e9a36aec70e187fcfe6cae6a373eb8c4de"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7bb0e9049e81def6829d09558ad12d16d0454c26cabe6efc3658e544460688d9"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6a1810c2cbde714decf40f811d1edc0dae45506eb37298fd9d4247b8801509fe"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e2aced6fb2f5261b47d267cb40060b73b6527e64afe54f6497844c9affed5fd0"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d0355cff58a4ed6d5e5f6b9c3693f52de0784aa0c17119394e2a8e376ce489d4"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:3c74f4725485f0a7a3862cfd374cc1b740cebe4c133e0c1425984bcdcce0f4bb"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:9c79d597fb3a7c93d7c26924db7497eba06d58f88f58e586aa69b2ad89fee0f8"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8ec75f35f62571a43e31e7bd11749d974c1b5cd5ea4a8388725d579263c0fdf6"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e641f931c5cd95b376fd3c59db52770e17bec2bf86ef16cc83b3906c054845"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aafd036f6f2e5ad109aec92f8dbfcbe76cff16bad683eb6dd18013739c0b3ae"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f2b856518bfcfa316c8dae3d7b412aecacf2e8ba30b149f5eb3b63128d703b9"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec31adc2e988fd7db3ab509954791bbc5a452a03c85e45b804b4bfc31fa221d"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9167e735379ec43d8eafa3fd675bfbb12e2c0464f98960586e9447d2cf2c7a83"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1461199b07903fc1424709efafe379205bf5f738144b1a50a08b0396357b5abf"}, - {file = "pymongo-4.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3094c7d2f820eecabadae76bfec02669567bbdd1730eabce10a5764778564f7b"}, - {file = "pymongo-4.6.1-cp39-cp39-win32.whl", hash = "sha256:c91ea3915425bd4111cb1b74511cdc56d1d16a683a48bf2a5a96b6a6c0f297f7"}, - {file = "pymongo-4.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef102a67ede70e1721fe27f75073b5314911dbb9bc27cde0a1c402a11531e7bd"}, - {file = "pymongo-4.6.1.tar.gz", hash = "sha256:31dab1f3e1d0cdd57e8df01b645f52d43cc1b653ed3afd535d2891f4fc4f9712"}, + {file = "pymongo-4.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:268d8578c0500012140c5460755ea405cbfe541ef47c81efa9d6744f0f99aeca"}, + {file = "pymongo-4.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:827611beb6c483260d520cfa6a49662d980dfa5368a04296f65fa39e78fccea7"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a754e366c404d19ff3f077ddeed64be31e0bb515e04f502bf11987f1baa55a16"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44efab10d9a3db920530f7bcb26af8f408b7273d2f0214081d3891979726328"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35b3f0c7d49724859d4df5f0445818d525824a6cd55074c42573d9b50764df67"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e37faf298a37ffb3e0809e77fbbb0a32b6a2d18a83c59cfc2a7b794ea1136b0"}, + {file = "pymongo-4.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1bcd58669e56c08f1e72c5758868b5df169fe267501c949ee83c418e9df9155"}, + {file = "pymongo-4.7.2-cp310-cp310-win32.whl", hash = "sha256:c72d16fede22efe7cdd1f422e8da15760e9498024040429362886f946c10fe95"}, + {file = "pymongo-4.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:12d1fef77d25640cb78893d07ff7d2fac4c4461d8eec45bd3b9ad491a1115d6e"}, + {file = "pymongo-4.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fc5af24fcf5fc6f7f40d65446400d45dd12bea933d0299dc9e90c5b22197f1e9"}, + {file = "pymongo-4.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:730778b6f0964b164c187289f906bbc84cb0524df285b7a85aa355bbec43eb21"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47a1a4832ef2f4346dcd1a10a36ade7367ad6905929ddb476459abb4fd1b98cb"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6eab12c6385526d386543d6823b07187fefba028f0da216506e00f0e1855119"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37e9ea81fa59ee9274457ed7d59b6c27f6f2a5fe8e26f184ecf58ea52a019cb8"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e9d9d2c0aae73aa4369bd373ac2ac59f02c46d4e56c4b6d6e250cfe85f76802"}, + {file = "pymongo-4.7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6e00a79dff22c9a72212ad82021b54bdb3b85f38a85f4fc466bde581d7d17a"}, + {file = "pymongo-4.7.2-cp311-cp311-win32.whl", hash = "sha256:02efd1bb3397e24ef2af45923888b41a378ce00cb3a4259c5f4fc3c70497a22f"}, + {file = "pymongo-4.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:87bb453ac3eb44db95cb6d5a616fbc906c1c00661eec7f55696253a6245beb8a"}, + {file = "pymongo-4.7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:12c466e02133b7f8f4ff1045c6b5916215c5f7923bc83fd6e28e290cba18f9f6"}, + {file = "pymongo-4.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f91073049c43d14e66696970dd708d319b86ee57ef9af359294eee072abaac79"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87032f818bf5052ab742812c715eff896621385c43f8f97cdd37d15b5d394e95"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a87eef394039765679f75c6a47455a4030870341cb76eafc349c5944408c882"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d275596f840018858757561840767b39272ac96436fcb54f5cac6d245393fd97"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82102e353be13f1a6769660dd88115b1da382447672ba1c2662a0fbe3df1d861"}, + {file = "pymongo-4.7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194065c9d445017b3c82fb85f89aa2055464a080bde604010dc8eb932a6b3c95"}, + {file = "pymongo-4.7.2-cp312-cp312-win32.whl", hash = "sha256:db4380d1e69fdad1044a4b8f3bb105200542c49a0dde93452d938ff9db1d6d29"}, + {file = "pymongo-4.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:fadc6e8db7707c861ebe25b13ad6aca19ea4d2c56bf04a26691f46c23dadf6e4"}, + {file = "pymongo-4.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2cb77d09bd012cb4b30636e7e38d00b5f9be5eb521c364bde66490c45ee6c4b4"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bf8b706946952acdea0fe478f8e44f1ed101c4b87f046859e6c3abe6c0a9f4"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcf337d1b252405779d9c79978d6ca15eab3cdaa2f44c100a79221bddad97c8a"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ffd1519edbe311df73c74ec338de7d294af535b2748191c866ea3a7c484cd15"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d59776f435564159196d971aa89422ead878174aff8fe18e06d9a0bc6d648c"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:347c49cf7f0ba49ea87c1a5a1984187ecc5516b7c753f31938bf7b37462824fd"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84bc00200c3cbb6c98a2bb964c9e8284b641e4a33cf10c802390552575ee21de"}, + {file = "pymongo-4.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fcaf8c911cb29316a02356f89dbc0e0dfcc6a712ace217b6b543805690d2aefd"}, + {file = "pymongo-4.7.2-cp37-cp37m-win32.whl", hash = "sha256:b48a5650ee5320d59f6d570bd99a8d5c58ac6f297a4e9090535f6561469ac32e"}, + {file = "pymongo-4.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5239ef7e749f1326ea7564428bf861d5250aa39d7f26d612741b1b1273227062"}, + {file = "pymongo-4.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2dcf608d35644e8d276d61bf40a93339d8d66a0e5f3e3f75b2c155a421a1b71"}, + {file = "pymongo-4.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25eeb2c18ede63891cbd617943dd9e6b9cbccc54f276e0b2e693a0cc40f243c5"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9349f0bb17a31371d4cacb64b306e4ca90413a3ad1fffe73ac7cd495570d94b5"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffd4d7cb2e6c6e100e2b39606d38a9ffc934e18593dc9bb326196afc7d93ce3d"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a8bd37f5dabc86efceb8d8cbff5969256523d42d08088f098753dba15f3b37a"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c78f156edc59b905c80c9003e022e1a764c54fd40ac4fea05b0764f829790e2"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d892fb91e81cccb83f507cdb2ea0aa026ec3ced7f12a1d60f6a5bf0f20f9c1f"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87832d6076c2c82f42870157414fd876facbb6554d2faf271ffe7f8f30ce7bed"}, + {file = "pymongo-4.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ce1a374ea0e49808e0380ffc64284c0ce0f12bd21042b4bef1af3eb7bdf49054"}, + {file = "pymongo-4.7.2-cp38-cp38-win32.whl", hash = "sha256:eb0642e5f0dd7e86bb358749cc278e70b911e617f519989d346f742dc9520dfb"}, + {file = "pymongo-4.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:4bdb5ffe1cd3728c9479671a067ef44dacafc3743741d4dc700c377c4231356f"}, + {file = "pymongo-4.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:743552033c63f0afdb56b9189ab04b5c1dbffd7310cf7156ab98eebcecf24621"}, + {file = "pymongo-4.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5239776633f7578b81207e5646245415a5a95f6ae5ef5dff8e7c2357e6264bfc"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727ad07952c155cd20045f2ce91143c7dc4fb01a5b4e8012905a89a7da554b0c"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9385654f01a90f73827af4db90c290a1519f7d9102ba43286e187b373e9a78e9"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d833651f1ba938bb7501f13e326b96cfbb7d98867b2d545ca6d69c7664903e0"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf17ea9cea14d59b0527403dd7106362917ced7c4ec936c4ba22bd36c912c8e0"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cecd2df037249d1c74f0af86fb5b766104a5012becac6ff63d85d1de53ba8b98"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65b4c00dedbd333698b83cd2095a639a6f0d7c4e2a617988f6c65fb46711f028"}, + {file = "pymongo-4.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d9b6cbc037108ff1a0a867e7670d8513c37f9bcd9ee3d2464411bfabf70ca002"}, + {file = "pymongo-4.7.2-cp39-cp39-win32.whl", hash = "sha256:cf28430ec1924af1bffed37b69a812339084697fd3f3e781074a0148e6475803"}, + {file = "pymongo-4.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:e004527ea42a6b99a8b8d5b42b42762c3bdf80f88fbdb5c3a9d47f3808495b86"}, + {file = "pymongo-4.7.2.tar.gz", hash = "sha256:9024e1661c6e40acf468177bf90ce924d1bc681d2b244adda3ed7b2f4c4d17d7"}, ] [package.dependencies] dnspython = ">=1.16.0,<3.0.0" [package.extras] -aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] @@ -3813,13 +3778,13 @@ zstd = ["zstandard"] [[package]] name = "pyopenssl" -version = "24.0.0" +version = "24.1.0" description = "Python wrapper module around the OpenSSL library" optional = true python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-24.0.0-py3-none-any.whl", hash = "sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3"}, - {file = "pyOpenSSL-24.0.0.tar.gz", hash = "sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf"}, + {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, + {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, ] [package.dependencies] @@ -3827,7 +3792,7 @@ cryptography = ">=41.0.5,<43" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] +test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] [[package]] name = "pypdf" @@ -3852,13 +3817,13 @@ image = ["Pillow (>=8.0.0)"] [[package]] name = "pyright" -version = "1.1.355" +version = "1.1.363" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.355-py3-none-any.whl", hash = "sha256:bf30b6728fd68ae7d09c98292b67152858dd89738569836896df786e52b5fe48"}, - {file = "pyright-1.1.355.tar.gz", hash = "sha256:dca4104cd53d6484e6b1b50b7a239ad2d16d2ffd20030bcf3111b56f44c263bf"}, + {file = "pyright-1.1.363-py3-none-any.whl", hash = "sha256:d3b8d73c8d230e26cc3523862f3398032a0c39a00d7bb69dc0f595f8e888fd01"}, + {file = "pyright-1.1.363.tar.gz", hash = "sha256:00a8f0ae0e339473bb0488f8a2a2dcdf574e94a16cd7b4390d49d144714d8db2"}, ] [package.dependencies] @@ -3943,35 +3908,35 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "pytest-mock (>=3.12)"] [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "pytest-xdist" -version = "3.5.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, - {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -3980,13 +3945,13 @@ testing = ["filelock"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -3994,13 +3959,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -4112,13 +4077,13 @@ pyyaml = "*" [[package]] name = "readme-renderer" -version = "42.0" +version = "43.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" optional = false python-versions = ">=3.8" files = [ - {file = "readme_renderer-42.0-py3-none-any.whl", hash = "sha256:13d039515c1f24de668e2c93f2e877b9dbe6c6c32328b90a40a49d8b2b85f36d"}, - {file = "readme_renderer-42.0.tar.gz", hash = "sha256:2d55489f83be4992fe4454939d1a051c33edbab778e82761d060c9fc6b308cd1"}, + {file = "readme_renderer-43.0-py3-none-any.whl", hash = "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9"}, + {file = "readme_renderer-43.0.tar.gz", hash = "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311"}, ] [package.dependencies] @@ -4149,104 +4114,90 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] @@ -4286,13 +4237,13 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "responses" -version = "0.24.1" +version = "0.25.0" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" files = [ - {file = "responses-0.24.1-py3-none-any.whl", hash = "sha256:a2b43f4c08bfb9c9bd242568328c65a34b318741d3fab884ac843c5ceeb543f9"}, - {file = "responses-0.24.1.tar.gz", hash = "sha256:b127c6ca3f8df0eb9cc82fd93109a3007a86acb24871834c47b77765152ecf8c"}, + {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, + {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, ] [package.dependencies] @@ -4319,13 +4270,13 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "13.7.0" +version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] @@ -4351,39 +4302,39 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.0.286" -description = "An extremely fast Python linter, written in Rust." +version = "0.4.4" +description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.286-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:8e22cb557e7395893490e7f9cfea1073d19a5b1dd337f44fd81359b2767da4e9"}, - {file = "ruff-0.0.286-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:68ed8c99c883ae79a9133cb1a86d7130feee0397fdf5ba385abf2d53e178d3fa"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8301f0bb4ec1a5b29cfaf15b83565136c47abefb771603241af9d6038f8981e8"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acc4598f810bbc465ce0ed84417ac687e392c993a84c7eaf3abf97638701c1ec"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88c8e358b445eb66d47164fa38541cfcc267847d1e7a92dd186dddb1a0a9a17f"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0433683d0c5dbcf6162a4beb2356e820a593243f1fa714072fec15e2e4f4c939"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddb61a0c4454cbe4623f4a07fef03c5ae921fe04fede8d15c6e36703c0a73b07"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47549c7c0be24c8ae9f2bce6f1c49fbafea83bca80142d118306f08ec7414041"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:559aa793149ac23dc4310f94f2c83209eedb16908a0343663be19bec42233d25"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d73cfb1c3352e7aa0ce6fb2321f36fa1d4a2c48d2ceac694cb03611ddf0e4db6"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3dad93b1f973c6d1db4b6a5da8690c5625a3fa32bdf38e543a6936e634b83dc3"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26afc0851f4fc3738afcf30f5f8b8612a31ac3455cb76e611deea80f5c0bf3ce"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9b6b116d1c4000de1b9bf027131dbc3b8a70507788f794c6b09509d28952c512"}, - {file = "ruff-0.0.286-py3-none-win32.whl", hash = "sha256:556e965ac07c1e8c1c2d759ac512e526ecff62c00fde1a046acb088d3cbc1a6c"}, - {file = "ruff-0.0.286-py3-none-win_amd64.whl", hash = "sha256:5d295c758961376c84aaa92d16e643d110be32add7465e197bfdaec5a431a107"}, - {file = "ruff-0.0.286-py3-none-win_arm64.whl", hash = "sha256:1d6142d53ab7f164204b3133d053c4958d4d11ec3a39abf23a40b13b0784e3f0"}, - {file = "ruff-0.0.286.tar.gz", hash = "sha256:f1e9d169cce81a384a26ee5bb8c919fe9ae88255f39a1a69fd1ebab233a85ed2"}, + {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, + {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, + {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, + {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, + {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, + {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, ] [[package]] name = "s3transfer" -version = "0.10.0" +version = "0.10.1" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">= 3.8" files = [ - {file = "s3transfer-0.10.0-py3-none-any.whl", hash = "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e"}, - {file = "s3transfer-0.10.0.tar.gz", hash = "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b"}, + {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, + {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, ] [package.dependencies] @@ -4394,137 +4345,137 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "safetensors" -version = "0.4.1" +version = "0.4.3" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "safetensors-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:cba01c6b76e01ec453933b3b3c0157c59b52881c83eaa0f7666244e71aa75fd1"}, - {file = "safetensors-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a8f6f679d97ea0135c7935c202feefbd042c149aa70ee759855e890c01c7814"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc2ce1f5ae5143a7fb72b71fa71db6a42b4f6cf912aa3acdc6b914084778e68"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d87d993eaefe6611a9c241a8bd364a5f1ffed5771c74840363a6c4ed8d868f6"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:097e9af2efa8778cd2f0cba451784253e62fa7cc9fc73c0744d27212f7294e25"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d10a9f7bae608ccfdc009351f01dc3d8535ff57f9488a58a4c38e45bf954fe93"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270b99885ec14abfd56c1d7f28ada81740a9220b4bae960c3de1c6fe84af9e4d"}, - {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:285b52a481e7ba93e29ad4ec5841ef2c4479ef0a6c633c4e2629e0508453577b"}, - {file = "safetensors-0.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c3c9f0ca510e0de95abd6424789dcbc879942a3a4e29b0dfa99d9427bf1da75c"}, - {file = "safetensors-0.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:88b4653059c903015284a9722f9a46838c654257173b279c8f6f46dbe80b612d"}, - {file = "safetensors-0.4.1-cp310-none-win32.whl", hash = "sha256:2fe6926110e3d425c4b684a4379b7796fdc26ad7d16922ea1696c8e6ea7e920f"}, - {file = "safetensors-0.4.1-cp310-none-win_amd64.whl", hash = "sha256:a79e16222106b2f5edbca1b8185661477d8971b659a3c814cc6f15181a9b34c8"}, - {file = "safetensors-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:d93321eea0dd7e81b283e47a1d20dee6069165cc158286316d0d06d340de8fe8"}, - {file = "safetensors-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ff8e41c8037db17de0ea2a23bc684f43eaf623be7d34906fe1ac10985b8365e"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39d36f1d88468a87c437a1bc27c502e71b6ca44c385a9117a9f9ba03a75cc9c6"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ef010e9afcb4057fb6be3d0a0cfa07aac04fe97ef73fe4a23138d8522ba7c17"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b287304f2b2220d51ccb51fd857761e78bcffbeabe7b0238f8dc36f2edfd9542"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e09000b2599e1836314430f81a3884c66a5cbabdff5d9f175b5d560d4de38d78"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9c80ce0001efa16066358d2dd77993adc25f5a6c61850e4ad096a2232930bce"}, - {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:413e1f6ac248f7d1b755199a06635e70c3515493d3b41ba46063dec33aa2ebb7"}, - {file = "safetensors-0.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3ac139377cfe71ba04573f1cda66e663b7c3e95be850e9e6c2dd4b5984bd513"}, - {file = "safetensors-0.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:04157d008385bea66d12fe90844a80d4a76dc25ec5230b5bd9a630496d1b7c03"}, - {file = "safetensors-0.4.1-cp311-none-win32.whl", hash = "sha256:5f25297148ec665f0deb8bd67e9564634d8d6841041ab5393ccfe203379ea88b"}, - {file = "safetensors-0.4.1-cp311-none-win_amd64.whl", hash = "sha256:b2f8877990a72ff595507b80f4b69036a9a1986a641f8681adf3425d97d3d2a5"}, - {file = "safetensors-0.4.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:eb2c1da1cc39509d1a55620a5f4d14f8911c47a89c926a96e6f4876e864375a3"}, - {file = "safetensors-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:303d2c0415cf15a28f8d7f17379ea3c34c2b466119118a34edd9965983a1a8a6"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb4cb3e37a9b961ddd68e873b29fe9ab4a081e3703412e34aedd2b7a8e9cafd9"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae5497adc68669db2fed7cb2dad81e6a6106e79c9a132da3efdb6af1db1014fa"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30abd0cddfe959d1daedf92edcd1b445521ebf7ddefc20860ed01486b33c90"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d784a98c492c751f228a4a894c3b8a092ff08b24e73b5568938c28b8c0e8f8df"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57a5ab08b0ec7a7caf30d2ac79bb30c89168431aca4f8854464bb9461686925"}, - {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:edcf3121890b5f0616aa5a54683b1a5d2332037b970e507d6bb7841a3a596556"}, - {file = "safetensors-0.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fdb58dee173ef33634c3016c459d671ca12d11e6acf9db008261cbe58107e579"}, - {file = "safetensors-0.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:780dc21eb3fd32ddd0e8c904bdb0290f2454f4ac21ae71e94f9ce72db1900a5a"}, - {file = "safetensors-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:48901bd540f8a3c1791314bc5c8a170927bf7f6acddb75bf0a263d081a3637d4"}, - {file = "safetensors-0.4.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3b0b7b2d5976fbed8a05e2bbdce5816a59e6902e9e7c7e07dc723637ed539787"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f69903ff49cb30b9227fb5d029bea276ea20d04b06803877a420c5b1b74c689"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0ddd050e01f3e843aa8c1c27bf68675b8a08e385d0045487af4d70418c3cb356"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a82bc2bd7a9a0e08239bdd6d7774d64121f136add93dfa344a2f1a6d7ef35fa"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ace9e66a40f98a216ad661245782483cf79cf56eb2b112650bb904b0baa9db5"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82cbb8f4d022f2e94498cbefca900698b8ded3d4f85212f47da614001ff06652"}, - {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:791edc10a3c359a2f5f52d5cddab0df8a45107d91027d86c3d44e57162e5d934"}, - {file = "safetensors-0.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:83c2cfbe8c6304f0891e7bb378d56f66d2148972eeb5f747cd8a2246886f0d8c"}, - {file = "safetensors-0.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:04dd14f53f5500eb4c4149674216ba1000670efbcf4b1b5c2643eb244e7882ea"}, - {file = "safetensors-0.4.1-cp37-none-win32.whl", hash = "sha256:d5b3defa74f3723a388bfde2f5d488742bc4879682bd93267c09a3bcdf8f869b"}, - {file = "safetensors-0.4.1-cp37-none-win_amd64.whl", hash = "sha256:25a043cbb59d4f75e9dd87fdf5c009dd8830105a2c57ace49b72167dd9808111"}, - {file = "safetensors-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:3f6a520af7f2717c5ecba112041f2c8af1ca6480b97bf957aba81ed9642e654c"}, - {file = "safetensors-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3807ac3b16288dffebb3474b555b56fe466baa677dfc16290dcd02dca1ab228"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b58ba13a9e82b4bc3fc221914f6ef237fe6c2adb13cede3ace64d1aacf49610"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dac4bb42f8679aadc59bd91a4c5a1784a758ad49d0912995945cd674089f628e"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911b48dc09e321a194def3a7431662ff4f03646832f3a8915bbf0f449b8a5fcb"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82571d20288c975c1b30b08deb9b1c3550f36b31191e1e81fae87669a92217d0"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da52ee0dc8ba03348ffceab767bd8230842fdf78f8a996e2a16445747143a778"}, - {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2536b11ce665834201072e9397404170f93f3be10cca9995b909f023a04501ee"}, - {file = "safetensors-0.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:998fbac99ca956c3a09fe07cc0b35fac26a521fa8865a690686d889f0ff4e4a6"}, - {file = "safetensors-0.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:845be0aafabf2a60c2d482d4e93023fecffe5e5443d801d7a7741bae9de41233"}, - {file = "safetensors-0.4.1-cp38-none-win32.whl", hash = "sha256:ce7a28bc8af685a69d7e869d09d3e180a275e3281e29cf5f1c7319e231932cc7"}, - {file = "safetensors-0.4.1-cp38-none-win_amd64.whl", hash = "sha256:e056fb9e22d118cc546107f97dc28b449d88274207dd28872bd668c86216e4f6"}, - {file = "safetensors-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:bdc0d039e44a727824639824090bd8869535f729878fa248addd3dc01db30eae"}, - {file = "safetensors-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c1b1d510c7aba71504ece87bf393ea82638df56303e371e5e2cf09d18977dd7"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd0afd95c1e497f520e680ea01e0397c0868a3a3030e128438cf6e9e3fcd671"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f603bdd8deac6726d39f41688ed353c532dd53935234405d79e9eb53f152fbfb"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8a85e3e47e0d4eebfaf9a58b40aa94f977a56050cb5598ad5396a9ee7c087c6"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0ccb5aa0f3be2727117e5631200fbb3a5b3a2b3757545a92647d6dd8be6658f"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d784938534e255473155e4d9f276ee69eb85455b6af1292172c731409bf9adee"}, - {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a257de175c254d39ccd6a21341cd62eb7373b05c1e618a78096a56a857e0c316"}, - {file = "safetensors-0.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6fd80f7794554091836d4d613d33a7d006e2b8d6ba014d06f97cebdfda744f64"}, - {file = "safetensors-0.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:35803201d980efcf964b75a0a2aee97fe5e9ecc5f3ad676b38fafdfe98e0620d"}, - {file = "safetensors-0.4.1-cp39-none-win32.whl", hash = "sha256:7ff8a36e0396776d3ed9a106fc9a9d7c55d4439ca9a056a24bf66d343041d3e6"}, - {file = "safetensors-0.4.1-cp39-none-win_amd64.whl", hash = "sha256:bfa2e20342b81921b98edba52f8deb68843fa9c95250739a56b52ceda5ea5c61"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ae2d5a31cfb8a973a318f7c4d2cffe0bd1fe753cdf7bb41a1939d45a0a06f964"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a45dbf03e8334d3a5dc93687d98b6dc422f5d04c7d519dac09b84a3c87dd7c6"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297b359d91126c0f9d4fd17bae3cfa2fe3a048a6971b8db07db746ad92f850c"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda3d98e2bcece388232cfc551ebf063b55bdb98f65ab54df397da30efc7dcc5"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8934bdfd202ebd0697040a3dff40dd77bc4c5bbf3527ede0532f5e7fb4d970f"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:42c3710cec7e5c764c7999697516370bee39067de0aa089b7e2cfb97ac8c6b20"}, - {file = "safetensors-0.4.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53134226053e56bd56e73f7db42596e7908ed79f3c9a1016e4c1dade593ac8e5"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:257d59e40a1b367cb544122e7451243d65b33c3f34d822a347f4eea6fdf97fdf"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d54c2f1826e790d1eb2d2512bfd0ee443f0206b423d6f27095057c7f18a0687"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645b3f1138fce6e818e79d4128afa28f0657430764cc045419c1d069ff93f732"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9a7ffb1e551c6df51d267f5a751f042b183df22690f6feceac8d27364fd51d7"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:44e230fbbe120de564b64f63ef3a8e6ff02840fa02849d9c443d56252a1646d4"}, - {file = "safetensors-0.4.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9d16b3b2fcc6fca012c74bd01b5619c655194d3e3c13e4d4d0e446eefa39a463"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5d95ea4d8b32233910734a904123bdd3979c137c461b905a5ed32511defc075f"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:dab431699b5d45e0ca043bc580651ce9583dda594e62e245b7497adb32e99809"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d8bbb7344e39cb9d4762e85c21df94ebeb03edac923dd94bb9ed8c10eac070"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1faf5111c66a6ba91f85dff2e36edaaf36e6966172703159daeef330de4ddc7b"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:660ca1d8bff6c7bc7c6b30b9b32df74ef3ab668f5df42cefd7588f0d40feadcb"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ae2f67f04ed0bb2e56fd380a8bd3eef03f609df53f88b6f5c7e89c08e52aae00"}, - {file = "safetensors-0.4.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8ed5d2c04cdc1afc6b3c28d59580448ac07732c50d94c15e14670f9c473a2ce"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2b6a2814278b6660261aa9a9aae524616de9f1ec364e3716d219b6ed8f91801f"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3cfd1ca35eacc635f0eaa894e5c5ed83ffebd0f95cac298fd430014fa7323631"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4177b456c6b0c722d82429127b5beebdaf07149d265748e97e0a34ff0b3694c8"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313e8472197bde54e3ec54a62df184c414582979da8f3916981b6a7954910a1b"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fdb4adb76e21bad318210310590de61c9f4adcef77ee49b4a234f9dc48867869"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1d568628e9c43ca15eb96c217da73737c9ccb07520fafd8a1eba3f2750614105"}, - {file = "safetensors-0.4.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:573b6023a55a2f28085fc0a84e196c779b6cbef4d9e73acea14c8094fee7686f"}, - {file = "safetensors-0.4.1.tar.gz", hash = "sha256:2304658e6ada81a5223225b4efe84748e760c46079bffedf7e321763cafb36c9"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dcf5705cab159ce0130cd56057f5f3425023c407e170bca60b4868048bae64fd"}, + {file = "safetensors-0.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb4f8c5d0358a31e9a08daeebb68f5e161cdd4018855426d3f0c23bb51087055"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a5319ef409e7f88686a46607cbc3c428271069d8b770076feaf913664a07ac"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb9c65bd82f9ef3ce4970dc19ee86be5f6f93d032159acf35e663c6bea02b237"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edb5698a7bc282089f64c96c477846950358a46ede85a1c040e0230344fdde10"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efcc860be094b8d19ac61b452ec635c7acb9afa77beb218b1d7784c6d41fe8ad"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88b33980222085dd6001ae2cad87c6068e0991d4f5ccf44975d216db3b57376"}, + {file = "safetensors-0.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5fc6775529fb9f0ce2266edd3e5d3f10aab068e49f765e11f6f2a63b5367021d"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9c6ad011c1b4e3acff058d6b090f1da8e55a332fbf84695cf3100c649cc452d1"}, + {file = "safetensors-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c496c5401c1b9c46d41a7688e8ff5b0310a3b9bae31ce0f0ae870e1ea2b8caf"}, + {file = "safetensors-0.4.3-cp310-none-win32.whl", hash = "sha256:38e2a8666178224a51cca61d3cb4c88704f696eac8f72a49a598a93bbd8a4af9"}, + {file = "safetensors-0.4.3-cp310-none-win_amd64.whl", hash = "sha256:393e6e391467d1b2b829c77e47d726f3b9b93630e6a045b1d1fca67dc78bf632"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a"}, + {file = "safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8c5093206ef4b198600ae484230402af6713dab1bd5b8e231905d754022bec7"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0b2104df1579d6ba9052c0ae0e3137c9698b2d85b0645507e6fd1813b70931a"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cf18888606dad030455d18f6c381720e57fc6a4170ee1966adb7ebc98d4d6a3"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b"}, + {file = "safetensors-0.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:585c9ae13a205807b63bef8a37994f30c917ff800ab8a1ca9c9b5d73024f97ee"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faefeb3b81bdfb4e5a55b9bbdf3d8d8753f65506e1d67d03f5c851a6c87150e9"}, + {file = "safetensors-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:befdf0167ad626f22f6aac6163477fcefa342224a22f11fdd05abb3995c1783c"}, + {file = "safetensors-0.4.3-cp311-none-win32.whl", hash = "sha256:a7cef55929dcbef24af3eb40bedec35d82c3c2fa46338bb13ecf3c5720af8a61"}, + {file = "safetensors-0.4.3-cp311-none-win_amd64.whl", hash = "sha256:840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:22d21760dc6ebae42e9c058d75aa9907d9f35e38f896e3c69ba0e7b213033856"}, + {file = "safetensors-0.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d22c1a10dff3f64d0d68abb8298a3fd88ccff79f408a3e15b3e7f637ef5c980"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1648568667f820b8c48317c7006221dc40aced1869908c187f493838a1362bc"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:446e9fe52c051aeab12aac63d1017e0f68a02a92a027b901c4f8e931b24e5397"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fef5d70683643618244a4f5221053567ca3e77c2531e42ad48ae05fae909f542"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a1f4430cc0c9d6afa01214a4b3919d0a029637df8e09675ceef1ca3f0dfa0df"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d603846a8585b9432a0fd415db1d4c57c0f860eb4aea21f92559ff9902bae4d"}, + {file = "safetensors-0.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a844cdb5d7cbc22f5f16c7e2a0271170750763c4db08381b7f696dbd2c78a361"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:88887f69f7a00cf02b954cdc3034ffb383b2303bc0ab481d4716e2da51ddc10e"}, + {file = "safetensors-0.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ee463219d9ec6c2be1d331ab13a8e0cd50d2f32240a81d498266d77d07b7e71e"}, + {file = "safetensors-0.4.3-cp312-none-win32.whl", hash = "sha256:d0dd4a1db09db2dba0f94d15addc7e7cd3a7b0d393aa4c7518c39ae7374623c3"}, + {file = "safetensors-0.4.3-cp312-none-win_amd64.whl", hash = "sha256:d14d30c25897b2bf19b6fb5ff7e26cc40006ad53fd4a88244fdf26517d852dd7"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d1456f814655b224d4bf6e7915c51ce74e389b413be791203092b7ff78c936dd"}, + {file = "safetensors-0.4.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:455d538aa1aae4a8b279344a08136d3f16334247907b18a5c3c7fa88ef0d3c46"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf476bca34e1340ee3294ef13e2c625833f83d096cfdf69a5342475602004f95"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02ef3a24face643456020536591fbd3c717c5abaa2737ec428ccbbc86dffa7a4"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7de32d0d34b6623bb56ca278f90db081f85fb9c5d327e3c18fd23ac64f465768"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a0deb16a1d3ea90c244ceb42d2c6c276059616be21a19ac7101aa97da448faf"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c59d51f182c729f47e841510b70b967b0752039f79f1de23bcdd86462a9b09ee"}, + {file = "safetensors-0.4.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f598b713cc1a4eb31d3b3203557ac308acf21c8f41104cdd74bf640c6e538e3"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5757e4688f20df083e233b47de43845d1adb7e17b6cf7da5f8444416fc53828d"}, + {file = "safetensors-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fe746d03ed8d193674a26105e4f0fe6c726f5bb602ffc695b409eaf02f04763d"}, + {file = "safetensors-0.4.3-cp37-none-win32.whl", hash = "sha256:0d5ffc6a80f715c30af253e0e288ad1cd97a3d0086c9c87995e5093ebc075e50"}, + {file = "safetensors-0.4.3-cp37-none-win_amd64.whl", hash = "sha256:a11c374eb63a9c16c5ed146457241182f310902bd2a9c18255781bb832b6748b"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1e31be7945f66be23f4ec1682bb47faa3df34cb89fc68527de6554d3c4258a4"}, + {file = "safetensors-0.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:03a4447c784917c9bf01d8f2ac5080bc15c41692202cd5f406afba16629e84d6"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d244bcafeb1bc06d47cfee71727e775bca88a8efda77a13e7306aae3813fa7e4"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53c4879b9c6bd7cd25d114ee0ef95420e2812e676314300624594940a8d6a91f"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74707624b81f1b7f2b93f5619d4a9f00934d5948005a03f2c1845ffbfff42212"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d52c958dc210265157573f81d34adf54e255bc2b59ded6218500c9b15a750eb"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f9568f380f513a60139971169c4a358b8731509cc19112369902eddb33faa4d"}, + {file = "safetensors-0.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9cd8e1560dfc514b6d7859247dc6a86ad2f83151a62c577428d5102d872721"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:89f9f17b0dacb913ed87d57afbc8aad85ea42c1085bd5de2f20d83d13e9fc4b2"}, + {file = "safetensors-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1139eb436fd201c133d03c81209d39ac57e129f5e74e34bb9ab60f8d9b726270"}, + {file = "safetensors-0.4.3-cp38-none-win32.whl", hash = "sha256:d9c289f140a9ae4853fc2236a2ffc9a9f2d5eae0cb673167e0f1b8c18c0961ac"}, + {file = "safetensors-0.4.3-cp38-none-win_amd64.whl", hash = "sha256:622afd28968ef3e9786562d352659a37de4481a4070f4ebac883f98c5836563e"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8651c7299cbd8b4161a36cd6a322fa07d39cd23535b144d02f1c1972d0c62f3c"}, + {file = "safetensors-0.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e375d975159ac534c7161269de24ddcd490df2157b55c1a6eeace6cbb56903f0"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084fc436e317f83f7071fc6a62ca1c513b2103db325cd09952914b50f51cf78f"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41a727a7f5e6ad9f1db6951adee21bbdadc632363d79dc434876369a17de6ad6"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7dbbde64b6c534548696808a0e01276d28ea5773bc9a2dfb97a88cd3dffe3df"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbae3b4b9d997971431c346edbfe6e41e98424a097860ee872721e176040a893"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e4b22e3284cd866edeabe4f4d896229495da457229408d2e1e4810c5187121"}, + {file = "safetensors-0.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dd37306546b58d3043eb044c8103a02792cc024b51d1dd16bd3dd1f334cb3ed"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8815b5e1dac85fc534a97fd339e12404db557878c090f90442247e87c8aeaea"}, + {file = "safetensors-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e011cc162503c19f4b1fd63dfcddf73739c7a243a17dac09b78e57a00983ab35"}, + {file = "safetensors-0.4.3-cp39-none-win32.whl", hash = "sha256:01feb3089e5932d7e662eda77c3ecc389f97c0883c4a12b5cfdc32b589a811c3"}, + {file = "safetensors-0.4.3-cp39-none-win_amd64.whl", hash = "sha256:3f9cdca09052f585e62328c1c2923c70f46814715c795be65f0b93f57ec98a02"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1b89381517891a7bb7d1405d828b2bf5d75528299f8231e9346b8eba092227f9"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cd6fff9e56df398abc5866b19a32124815b656613c1c5ec0f9350906fd798aac"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840caf38d86aa7014fe37ade5d0d84e23dcfbc798b8078015831996ecbc206a3"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9650713b2cfa9537a2baf7dd9fee458b24a0aaaa6cafcea8bdd5fb2b8efdc34"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4119532cd10dba04b423e0f86aecb96cfa5a602238c0aa012f70c3a40c44b50"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e066e8861eef6387b7c772344d1fe1f9a72800e04ee9a54239d460c400c72aab"}, + {file = "safetensors-0.4.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90964917f5b0fa0fa07e9a051fbef100250c04d150b7026ccbf87a34a54012e0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c41e1893d1206aa7054029681778d9a58b3529d4c807002c156d58426c225173"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae7613a119a71a497d012ccc83775c308b9c1dab454806291427f84397d852fd"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9bac020faba7f5dc481e881b14b6425265feabb5bfc552551d21189c0eddc3"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:420a98f593ff9930f5822560d14c395ccbc57342ddff3b463bc0b3d6b1951550"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f5e6883af9a68c0028f70a4c19d5a6ab6238a379be36ad300a22318316c00cb0"}, + {file = "safetensors-0.4.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cdd0a3b5da66e7f377474599814dbf5cbf135ff059cc73694de129b58a5e8a2c"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9bfb92f82574d9e58401d79c70c716985dc049b635fef6eecbb024c79b2c46ad"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3615a96dd2dcc30eb66d82bc76cda2565f4f7bfa89fcb0e31ba3cea8a1a9ecbb"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:868ad1b6fc41209ab6bd12f63923e8baeb1a086814cb2e81a65ed3d497e0cf8f"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffba80aa49bd09195145a7fd233a7781173b422eeb995096f2b30591639517"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0acbe31340ab150423347e5b9cc595867d814244ac14218932a5cf1dd38eb39"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19bbdf95de2cf64f25cd614c5236c8b06eb2cfa47cbf64311f4b5d80224623a3"}, + {file = "safetensors-0.4.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b852e47eb08475c2c1bd8131207b405793bfc20d6f45aff893d3baaad449ed14"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d07cbca5b99babb692d76d8151bec46f461f8ad8daafbfd96b2fca40cadae65"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ab6527a20586d94291c96e00a668fa03f86189b8a9defa2cdd34a1a01acc7d5"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02318f01e332cc23ffb4f6716e05a492c5f18b1d13e343c49265149396284a44"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec4b52ce9a396260eb9731eb6aea41a7320de22ed73a1042c2230af0212758ce"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:018b691383026a2436a22b648873ed11444a364324e7088b99cd2503dd828400"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:309b10dbcab63269ecbf0e2ca10ce59223bb756ca5d431ce9c9eeabd446569da"}, + {file = "safetensors-0.4.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b277482120df46e27a58082df06a15aebda4481e30a1c21eefd0921ae7e03f65"}, + {file = "safetensors-0.4.3.tar.gz", hash = "sha256:2f85fc50c4e07a21e95c24e07460fe6f7e2859d0ce88092838352b798ce711c2"}, ] [package.extras] all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] dev = ["safetensors[all]"] jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] numpy = ["numpy (>=1.21.6)"] paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] -testing = ["h5py (>=3.7.0)", "huggingface_hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools_rust (>=1.5.2)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "schema" -version = "0.7.5" +version = "0.7.7" description = "Simple data validation library" optional = false python-versions = "*" files = [ - {file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"}, - {file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"}, + {file = "schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde"}, + {file = "schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807"}, ] -[package.dependencies] -contextlib2 = ">=0.5.5" - [[package]] name = "secretstorage" version = "3.3.3" @@ -4552,19 +4503,19 @@ files = [ [[package]] name = "setuptools" -version = "69.0.3" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "simplejson" @@ -4686,48 +4637,48 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] name = "snowflake-connector-python" -version = "3.7.1" +version = "3.10.0" description = "Snowflake Connector for Python" optional = true python-versions = ">=3.8" files = [ - {file = "snowflake-connector-python-3.7.1.tar.gz", hash = "sha256:dc6982f653860edef1614a3047a16bcb07e22775e6e090808bbf4f7629c4191d"}, - {file = "snowflake_connector_python-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c60093a47ead3bf9dafe6194626f433a1872ddb521f1635492584ee65885c3"}, - {file = "snowflake_connector_python-3.7.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:959b1c93f9aff684627c3ce56e9193e23f28d867d932da83a18d8aff613cc182"}, - {file = "snowflake_connector_python-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6966a50dd981ce8f553867e8e4216ba966ae8d0625b2ef63de383f3184d7351"}, - {file = "snowflake_connector_python-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f1c1c95388b3bb18fb17f185e21860cf4f8feae4167a432183dfadbda3f7ae"}, - {file = "snowflake_connector_python-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:d771ff5e632a088b9aa1c663f956cc89714cc1c5732cbdeb39217d749c8c447b"}, - {file = "snowflake_connector_python-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:796be35e6b4842fc4eaf7d82628f61a9bff946c89a7c47a97c2ac442e7c69b45"}, - {file = "snowflake_connector_python-3.7.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:d26b509185333a7681191fed6d4e345d3206bb630e545f575d8cce0149f2f7cf"}, - {file = "snowflake_connector_python-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a972f4cabb3c5fd23f6b310ba1c2216f0d5afa0dbb95d05ad935ddeba700a718"}, - {file = "snowflake_connector_python-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:266506d4001f3260a80425d1d9b61e1f4d1183dcb4623e3799b7dc0757327469"}, - {file = "snowflake_connector_python-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:cb6d90cf992af2a795613ba54a9b0824dc1b73b4f4377b4f7479f40b5135d4eb"}, - {file = "snowflake_connector_python-3.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09b62cb4fd447d99756aa251d07fdec726b4c0173978450d6172e900ede2da7f"}, - {file = "snowflake_connector_python-3.7.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:3f466f459942520fc2bc4ae2a0ffbdc2535cb2eac73e180c7ec8fa11a75fe993"}, - {file = "snowflake_connector_python-3.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0a770fe783868b1559ba5e72c436b2781cd0a06ca0c9127776a3f927a91249f"}, - {file = "snowflake_connector_python-3.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5f178d71892d54f246681e601a628cab7086fbd80828430d795b60a5e4991f"}, - {file = "snowflake_connector_python-3.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:c6822d6b21d22a237d90b0b45b7d28d12d9b9ff392445fc1aaf3fe60aa200e81"}, - {file = "snowflake_connector_python-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2e2fdd6c65f03f0fd649477e35828e7ebd0bd2717852542e720f2a4ab3443bc8"}, - {file = "snowflake_connector_python-3.7.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:0ec3a7d17643167e1224d0f992fd34abf3ddca64099c3c377bbeb5ec54b58fc6"}, - {file = "snowflake_connector_python-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcce35becef53b80d8addbd0d248242c14f74e842eb989baabceb42016800d66"}, - {file = "snowflake_connector_python-3.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093732fb559d255e6687eb1940e6677ae98cfa3713c548696ad99f345c3c43d7"}, - {file = "snowflake_connector_python-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:cf1021752e11b9e23688440b81e116dd54ada6335a9745db8ce3f223fa5e942c"}, - {file = "snowflake_connector_python-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ab47de37dcf66464f45eb365c66ec07c3af19a4011ef1d575116af308fcb025"}, - {file = "snowflake_connector_python-3.7.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:c4e824c6226a8c01ccc0af258517d707b614254f58cc7b0b6005cf641e34d2c2"}, - {file = "snowflake_connector_python-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97f13203ec29790d1c7e6e7d37a16ddb5182c93820a328a7f6d3678733baadd8"}, - {file = "snowflake_connector_python-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73d2af0435cb29bda23609a94220dd0e4765e997fe669a7ef117620b731c772"}, - {file = "snowflake_connector_python-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:1b833b4165e7c3b0e911fb33aba936bee46b320a367b3f9451987039bef85be9"}, + {file = "snowflake_connector_python-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e2afca4bca70016519d1a7317c498f1d9c56140bf3e40ea40bddcc95fe827ca"}, + {file = "snowflake_connector_python-3.10.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:d19bde29f89b226eb22af4c83134ecb5c229da1d5e960a01b8f495df78dcdc36"}, + {file = "snowflake_connector_python-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfe013ed97b4dd2e191fd6770a14030d29dd0108817d6ce76b9773250dd2d560"}, + {file = "snowflake_connector_python-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0917c9f9382d830907e1a18ee1208537b203618700a9c671c2a20167b30f574"}, + {file = "snowflake_connector_python-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:7e828bc99240433e6552ac4cc4e37f223ae5c51c7880458ddb281668503c7491"}, + {file = "snowflake_connector_python-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a0d3d06d758455c50b998eabc1fd972a1f67faa5c85ef250fd5986f5a41aab0b"}, + {file = "snowflake_connector_python-3.10.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4602cb19b204bb03e03d65c6d5328467c9efc0fec53ca56768c3747c8dc8a70f"}, + {file = "snowflake_connector_python-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb1a04b496bbd3e1e2e926df82b2369887b2eea958f535fb934c240bfbabf6c5"}, + {file = "snowflake_connector_python-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c889f9f60f915d657e0a0ad2e6cc52cdcafd9bcbfa95a095aadfd8bcae62b819"}, + {file = "snowflake_connector_python-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e441484216ed416a6ed338133e23bd991ac4ba2e46531f4d330f61568c49314"}, + {file = "snowflake_connector_python-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bb4aced19053c67513cecc92311fa9d3b507b2277698c8e987d404f6f3a49fb2"}, + {file = "snowflake_connector_python-3.10.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:858315a2feff86213b079c6293ad8d850a778044c664686802ead8bb1337e1bc"}, + {file = "snowflake_connector_python-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adf16e1ca9f46d3bdf68e955ffa42075ebdb251e3b13b59003d04e4fea7d579a"}, + {file = "snowflake_connector_python-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4c5c2a08b39086a5348502652ad4fdf24871d7ab30fd59f6b7b57249158468c"}, + {file = "snowflake_connector_python-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:05011286f42c52eb3e5a6db59ee3eaf79f3039f3a19d7ffac6f4ee143779c637"}, + {file = "snowflake_connector_python-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:569301289ada5b0d72d0bd8432b7ca180220335faa6d9a0f7185f60891db6f2c"}, + {file = "snowflake_connector_python-3.10.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4e5641c70a12da9804b74f350b8cbbdffdc7aca5069b096755abd2a1fdcf5d1b"}, + {file = "snowflake_connector_python-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ff767a1b8c48431549ac28884f8bd9647e63a23f470b05f6ab8d143c4b1475"}, + {file = "snowflake_connector_python-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52bbc1e2e7bda956525b4229d7f87579f8cabd7d5506b12aa754c4bcdc8c8d7"}, + {file = "snowflake_connector_python-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:280a8dcca0249e864419564e38764c08f8841900d9872fec2f2855fda494b29f"}, + {file = "snowflake_connector_python-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:67bf570230b0cf818e6766c17245c7355a1f5ea27778e54ab8d09e5bb3536ad9"}, + {file = "snowflake_connector_python-3.10.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:aa1e26f9c571d2c4206da5c978c1b345ffd798d3db1f9ae91985e6243c6bf94b"}, + {file = "snowflake_connector_python-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73e9baa531d5156a03bfe5af462cf6193ec2a01cbb575edf7a2dd3b2a35254c7"}, + {file = "snowflake_connector_python-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e03361c4749e4d65bf0d223fdea1c2d7a33af53b74e873929a6085d150aff17e"}, + {file = "snowflake_connector_python-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:e8cddd4357e70ab55d7aeeed144cbbeb1ff658b563d7d8d307afc06178a367ec"}, + {file = "snowflake_connector_python-3.10.0.tar.gz", hash = "sha256:7c7438e958753bd1174b73581d77c92b0b47a86c38d8ea0ba1ea23c442eb8e75"}, ] [package.dependencies] @@ -4739,7 +4690,7 @@ cryptography = ">=3.1.0,<43.0.0" filelock = ">=3.5,<4" idna = ">=2.5,<4" packaging = "*" -platformdirs = ">=2.6.0,<4.0.0" +platformdirs = ">=2.6.0,<5.0.0" pyjwt = "<3.0.0" pyOpenSSL = ">=16.2.0,<25.0.0" pytz = "*" @@ -4756,22 +4707,22 @@ secure-local-storage = ["keyring (>=23.1.0,<25.0.0)"] [[package]] name = "snowflake-sqlalchemy" -version = "1.5.1" +version = "1.5.3" description = "Snowflake SQLAlchemy Dialect" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "snowflake-sqlalchemy-1.5.1.tar.gz", hash = "sha256:4f1383402ffc89311974bd810dee22003aef4af0f312a0fdb55778333ad1abf7"}, - {file = "snowflake_sqlalchemy-1.5.1-py2.py3-none-any.whl", hash = "sha256:df022fb73bc04d68dfb3216ebf7a1bfbd14d22def9c38bbe05275beb258adcd0"}, + {file = "snowflake_sqlalchemy-1.5.3-py3-none-any.whl", hash = "sha256:0a4aa3f391797b22dd7658892f906191fd1d44870503ae7ca9278cddce6e5b89"}, + {file = "snowflake_sqlalchemy-1.5.3.tar.gz", hash = "sha256:79191ec3febfb32bcffecd66f2a7dd561bd571345ea4bccbf41cc1fb5c0682ff"}, ] [package.dependencies] snowflake-connector-python = "<4.0.0" -sqlalchemy = ">=1.4.0,<2.0.0" +sqlalchemy = ">=1.4.19,<2.0.0" [package.extras] -development = ["mock", "numpy", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytz"] -pandas = ["snowflake-connector-python[pandas] (<4.0.0)"] +development = ["mock", "numpy", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytz"] +pandas = ["snowflake-connector-python[pandas]"] [[package]] name = "sortedcontainers" @@ -4797,36 +4748,57 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.51" +version = "1.4.52" description = "Database Abstraction Library" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2be4e6294c53f2ec8ea36486b56390e3bcaa052bf3a9a47005687ccf376745d1"}, - {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca484ca11c65e05639ffe80f20d45e6be81fbec7683d6c9a15cd421e6e8b340"}, - {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0535d5b57d014d06ceeaeffd816bb3a6e2dddeb670222570b8c4953e2d2ea678"}, - {file = "SQLAlchemy-1.4.51-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af55cc207865d641a57f7044e98b08b09220da3d1b13a46f26487cc2f898a072"}, - {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7deeae5071930abb3669b5185abb6c33ddfd2398f87660fafdb9e6a5fb0f3f2f"}, - {file = "SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0892e7ac8bc76da499ad3ee8de8da4d7905a3110b952e2a35a940dab1ffa550e"}, - {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cacc0b2dd7d22a918a9642fc89840a5d3cee18a0e1fe41080b1141b23b10916"}, - {file = "SQLAlchemy-1.4.51-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245c67c88e63f1523e9216cad6ba3107dea2d3ee19adc359597a628afcabfbcb"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec7a0ed9b32afdf337172678a4a0e6419775ba4e649b66f49415615fa47efbd"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352df882088a55293f621328ec33b6ffca936ad7f23013b22520542e1ab6ad1b"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:86a22143a4001f53bf58027b044da1fb10d67b62a785fc1390b5c7f089d9838c"}, - {file = "SQLAlchemy-1.4.51-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c37bc677690fd33932182b85d37433845de612962ed080c3e4d92f758d1bd894"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c55040d8ea65414de7c47f1a23823cd9f3fad0dc93e6b6b728fee81230f817b"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ef80328e3fee2be0a1abe3fe9445d3a2e52a1282ba342d0dab6edf1fef4707"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f8cafa6f885a0ff5e39efa9325195217bb47d5929ab0051636610d24aef45ade"}, - {file = "SQLAlchemy-1.4.51-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8f2df79a46e130235bc5e1bbef4de0583fb19d481eaa0bffa76e8347ea45ec6"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb18549b770351b54e1ab5da37d22bc530b8bfe2ee31e22b9ebe650640d2ef12"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e699466106d09f028ab78d3c2e1f621b5ef2c8694598242259e4515715da7c"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2ad16880ccd971ac8e570550fbdef1385e094b022d6fc85ef3ce7df400dddad3"}, - {file = "SQLAlchemy-1.4.51-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b97fd5bb6b7c1a64b7ac0632f7ce389b8ab362e7bd5f60654c2a418496be5d7f"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e646b19f47d655261b22df9976e572f588185279970efba3d45c377127d35349"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3cf56cc36d42908495760b223ca9c2c0f9f0002b4eddc994b24db5fcb86a9e4"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0d661cff58c91726c601cc0ee626bf167b20cc4d7941c93c5f3ac28dc34ddbea"}, - {file = "SQLAlchemy-1.4.51-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3823dda635988e6744d4417e13f2e2b5fe76c4bf29dd67e95f98717e1b094cad"}, - {file = "SQLAlchemy-1.4.51.tar.gz", hash = "sha256:e7908c2025eb18394e32d65dd02d2e37e17d733cdbe7d78231c2b6d7eb20cdb9"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-win32.whl", hash = "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94"}, + {file = "SQLAlchemy-1.4.52-cp310-cp310-win_amd64.whl", hash = "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef"}, + {file = "SQLAlchemy-1.4.52-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d"}, + {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0"}, + {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb"}, + {file = "SQLAlchemy-1.4.52-cp311-cp311-win32.whl", hash = "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e"}, + {file = "SQLAlchemy-1.4.52-cp311-cp311-win_amd64.whl", hash = "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12"}, + {file = "SQLAlchemy-1.4.52-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c"}, + {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554"}, + {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b"}, + {file = "SQLAlchemy-1.4.52-cp312-cp312-win32.whl", hash = "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126"}, + {file = "SQLAlchemy-1.4.52-cp312-cp312-win_amd64.whl", hash = "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-win32.whl", hash = "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd"}, + {file = "SQLAlchemy-1.4.52-cp36-cp36m-win_amd64.whl", hash = "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-win32.whl", hash = "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782"}, + {file = "SQLAlchemy-1.4.52-cp37-cp37m-win_amd64.whl", hash = "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-win32.whl", hash = "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e"}, + {file = "SQLAlchemy-1.4.52-cp38-cp38-win_amd64.whl", hash = "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-win32.whl", hash = "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821"}, + {file = "SQLAlchemy-1.4.52-cp39-cp39-win_amd64.whl", hash = "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680"}, + {file = "SQLAlchemy-1.4.52.tar.gz", hash = "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296"}, ] [package.dependencies] @@ -4899,17 +4871,18 @@ files = [ [[package]] name = "tenacity" -version = "8.2.3" +version = "8.3.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, + {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tiktoken" @@ -4976,130 +4949,120 @@ files = [ [[package]] name = "tokenizers" -version = "0.15.1" +version = "0.19.1" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, - {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, - {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, - {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, - {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, - {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, - {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, - {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, - {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, - {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, - {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, - {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, - {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, - {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, - {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, ] [package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" @@ -5114,24 +5077,24 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.3" +version = "0.12.5" description = "Style preserving TOML library" optional = true python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -5145,26 +5108,26 @@ telegram = ["requests"] [[package]] name = "trafilatura" -version = "1.6.4" -description = "Python package and command-line tool designed to gather text on the Web. It includes discovery, extraction and text processing components. Its main applications are web crawling, downloads, scraping, and extraction of main texts, metadata and comments." +version = "1.9.0" +description = "Python package and command-line tool designed to gather text on the Web, includes all necessary discovery and text processing components to perform web crawling, downloads, scraping, and extraction of main texts, metadata and comments." optional = true python-versions = ">=3.6" files = [ - {file = "trafilatura-1.6.4-py3-none-any.whl", hash = "sha256:e148efc283cce017c42335ecfcb0e2feb0a7b31dac5e29fa5d545285c54d2395"}, - {file = "trafilatura-1.6.4.tar.gz", hash = "sha256:97609203089b73be9aa8d1aaaefd5d8dd93e2e92037b0d72f19976af91b18c8a"}, + {file = "trafilatura-1.9.0-py3-none-any.whl", hash = "sha256:8ea09de226c4eae25685f65b2cf56de47260d5c858ed3a8a0bc9c3ddd0841344"}, + {file = "trafilatura-1.9.0.tar.gz", hash = "sha256:e6833d29ab8a13ed853937d7c91e6868bc62efbe10214ac2b106436dd23d1412"}, ] [package.dependencies] certifi = "*" charset-normalizer = {version = ">=3.2.0", markers = "python_version >= \"3.7\""} -courlan = ">=0.9.5" -htmldate = ">=1.6.1" +courlan = ">=1.1.0" +htmldate = ">=1.8.1" justext = ">=3.0.0" -lxml = {version = "4.9.4", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} +lxml = {version = ">=4.9.4,<5.2.0", markers = "platform_system != \"Darwin\" or python_version > \"3.8\""} urllib3 = {version = ">=1.26,<3", markers = "python_version >= \"3.7\""} [package.extras] -all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.18)", "htmldate[speed] (>=1.6.0)", "py3langid (>=0.2.2)", "pycurl (>=7.45.2)"] +all = ["brotli", "cchardet (>=2.1.7)", "faust-cchardet (>=2.1.19)", "htmldate[speed] (>=1.8.1)", "py3langid (>=0.2.2)", "pycurl (>=7.45.3)"] gui = ["Gooey (>=1.0.1)"] [[package]] @@ -5184,13 +5147,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.37.0" +version = "4.40.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.37.0-py3-none-any.whl", hash = "sha256:669d4e2c12661e71c464eb18d6a9b9a2c74d4cba0f4648bb9323896bdd046826"}, - {file = "transformers-4.37.0.tar.gz", hash = "sha256:5a0fdee36168f751770f7036ce7a8787be14f8b0d8f29806c493b6cb819c6c83"}, + {file = "transformers-4.40.2-py3-none-any.whl", hash = "sha256:71cb94301ec211a2e1d4b8c8d18dcfaa902dfa00a089dceca167a8aa265d6f2d"}, + {file = "transformers-4.40.2.tar.gz", hash = "sha256:657b6054a2097671398d976ad46e60836e7e15f9ea9551631a96e33cb9240649"}, ] [package.dependencies] @@ -5201,22 +5164,22 @@ packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" -safetensors = ">=0.3.1" -tokenizers = ">=0.14,<0.19" +safetensors = ">=0.4.1" +tokenizers = ">=0.19,<0.20" tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.11,!=1.12.0)"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.19)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] @@ -5233,32 +5196,32 @@ ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] -serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic (<2)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.1.5)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] -tokenizers = ["tokenizers (>=0.14,<0.19)"] -torch = ["accelerate (>=0.21.0)", "torch (>=1.11,!=1.12.0)"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.19)", "torch (>=1.11,!=1.12.0)", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] [[package]] name = "twine" -version = "4.0.2" +version = "5.0.0" description = "Collection of utilities for publishing packages on PyPI" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "twine-4.0.2-py3-none-any.whl", hash = "sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8"}, - {file = "twine-4.0.2.tar.gz", hash = "sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8"}, + {file = "twine-5.0.0-py3-none-any.whl", hash = "sha256:a262933de0b484c53408f9edae2e7821c1c45a3314ff2df9bdd343aa7ab8edc0"}, + {file = "twine-5.0.0.tar.gz", hash = "sha256:89b0cc7d370a4b66421cc6102f269aa910fe0f1861c124f573cf2ddedbc10cf4"}, ] [package.dependencies] @@ -5274,46 +5237,71 @@ urllib3 = ">=1.26.0" [[package]] name = "types-awscrt" -version = "0.20.2" +version = "0.20.9" description = "Type annotations and code completion for awscrt" optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.7" files = [ - {file = "types_awscrt-0.20.2-py3-none-any.whl", hash = "sha256:7b5ccaaecc030ffe9e28f59e876a3013f401181ff04e0458e961d0bb9c7cdfbd"}, - {file = "types_awscrt-0.20.2.tar.gz", hash = "sha256:5e29986a4ad3968ac3d82caa85d668d3c66224c9ee78be3fe64bce30dae7b798"}, + {file = "types_awscrt-0.20.9-py3-none-any.whl", hash = "sha256:3ae374b553e7228ba41a528cf42bd0b2ad7303d806c73eff4aaaac1515e3ea4e"}, + {file = "types_awscrt-0.20.9.tar.gz", hash = "sha256:64898a2f4a2468f66233cb8c29c5f66de907cf80ba1ef5bb1359aef2f81bb521"}, ] +[[package]] +name = "types-requests" +version = "2.31.0.6" +description = "Typing stubs for requests" +optional = true +python-versions = ">=3.7" +files = [ + {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, + {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, +] + +[package.dependencies] +types-urllib3 = "*" + [[package]] name = "types-s3transfer" -version = "0.10.0" +version = "0.10.1" description = "Type annotations and code completion for s3transfer" optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "types_s3transfer-0.10.0-py3-none-any.whl", hash = "sha256:44fcdf0097b924a9aab1ee4baa1179081a9559ca62a88c807e2b256893ce688f"}, - {file = "types_s3transfer-0.10.0.tar.gz", hash = "sha256:35e4998c25df7f8985ad69dedc8e4860e8af3b43b7615e940d53c00d413bdc69"}, + {file = "types_s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:49a7c81fa609ac1532f8de3756e64b58afcecad8767933310228002ec7adff74"}, + {file = "types_s3transfer-0.10.1.tar.gz", hash = "sha256:02154cce46528287ad76ad1a0153840e0492239a0887e8833466eccf84b98da0"}, +] + +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = true +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, ] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -5351,13 +5339,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.26.2" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, + {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, ] [package.dependencies] @@ -5366,18 +5354,18 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "voyageai" -version = "0.2.1" +version = "0.2.2" description = "" optional = true -python-versions = ">=3.7.1,<4.0.0" +python-versions = "<4.0.0,>=3.7.1" files = [ - {file = "voyageai-0.2.1-py3-none-any.whl", hash = "sha256:a00978f880adb689718940f8a5c5e4b80f76053e51d1e7e2dd35a9f2025b5506"}, - {file = "voyageai-0.2.1.tar.gz", hash = "sha256:209ddf06343a271538a1f48340bcc4ddf93f346797462d4cf58d32a891d56093"}, + {file = "voyageai-0.2.2-py3-none-any.whl", hash = "sha256:caba84fa448bb82eeb39a4c4479978dc08bff9e2473773fea9cdcdd737560e4d"}, + {file = "voyageai-0.2.2.tar.gz", hash = "sha256:e477ea2aa6d54580426c7a4a67ad45cfba5480db2bad4da3eb74007b3984f3a5"}, ] [package.dependencies] @@ -5441,17 +5429,17 @@ files = [ [[package]] name = "websocket-client" -version = "1.7.0" +version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.8" files = [ - {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, - {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -5538,13 +5526,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.1" +version = "3.0.3" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, + {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, ] [package.dependencies] @@ -5669,18 +5657,18 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] @@ -5719,4 +5707,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "edfa749ceeaae8216026c5c18245dbb284383a3b6772d648319253cc9657a2d1" +content-hash = "d6bedf8297bbcd3c597bf93c4fb25e57192a8195941d0ad462bbacb9835c8607" diff --git a/pyproject.toml b/pyproject.toml index c7f89bdca..e60ec709a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -152,11 +152,10 @@ pytest-clarity = "^1.0.1" optional = true [tool.poetry.group.dev.dependencies] -ruff = "^0.0.286" -black = "^23.7.0" -pyright = "^1.1.355" -pre-commit = "^3.5.0" -boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.18"} +ruff = "^0.4.4" +pyright = "^1.1.363" +pre-commit = "^3.7.1" +boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.105"} [tool.poetry.group.docs] @@ -172,12 +171,11 @@ mkdocs-literate-nav = "^0.6.0" mkdocs-section-index = "^0.3.6" pymdown-extensions = "^10.3" -[tool.black] -line-length=120 -skip_magic_trailing_comma = true - [tool.ruff] -line-length=120 +line-length = 120 + +[tool.ruff.format] +skip-magic-trailing-comma = true [tool.pyright] venvPath = "." diff --git a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py index 2c911da18..a2c51f58b 100644 --- a/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_amazon_bedrock_stable_diffusion_image_generation_driver.py @@ -37,9 +37,7 @@ def test_init(self, driver): def test_init_requires_image_generation_model_driver(self, session): with pytest.raises(TypeError): - AmazonBedrockImageGenerationDriver( - session=session, model="stability.stable-diffusion-xl-v1" - ) # pyright: ignore + AmazonBedrockImageGenerationDriver(session=session, model="stability.stable-diffusion-xl-v1") # pyright: ignore def test_try_text_to_image(self, driver): driver.bedrock_client.invoke_model.return_value = { diff --git a/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py b/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py index 4e7487c6b..33500839f 100644 --- a/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py +++ b/tests/unit/drivers/web_scraper/test_markdownify_web_scraper_driver.py @@ -2,7 +2,6 @@ import pytest from griptape.drivers.web_scraper.markdownify_web_scraper_driver import MarkdownifyWebScraperDriver -from griptape.utils.import_utils import import_optional_dependency class TestMarkdownifyWebScraperDriver: @@ -12,9 +11,7 @@ def mock_playwright(self, mocker): @pytest.fixture(autouse=True) def mock_content(self, mock_playwright): - mock_content = ( - mock_playwright.__enter__.return_value.chromium.launch.return_value.__enter__.return_value.new_page.return_value.content - ) + mock_content = mock_playwright.__enter__.return_value.chromium.launch.return_value.__enter__.return_value.new_page.return_value.content mock_content.return_value = 'foobar' return mock_content From e2f7f72d8895f4c9cbd9834dadb744a748c24364 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 20 May 2024 08:35:30 -0700 Subject: [PATCH 050/238] Refactor how configs work (#765) --- docs/examples/multiple-agent-shared-memory.md | 10 +- docs/griptape-framework/data/chunkers.md | 2 +- .../drivers/embedding-drivers.md | 11 +- .../drivers/event-listener-drivers.md | 8 +- .../drivers/prompt-drivers.md | 188 ++++++++---------- docs/griptape-framework/misc/events.md | 9 +- docs/griptape-framework/misc/tokenizers.md | 2 +- docs/griptape-framework/structures/config.md | 51 +---- .../official-tools/rest-api-client.md | 12 +- griptape/config/__init__.py | 14 -- .../config/amazon_bedrock_structure_config.py | 84 ++++---- griptape/config/anthropic_structure_config.py | 59 ++---- griptape/config/base_structure_config.py | 23 ++- griptape/config/google_structure_config.py | 50 ++--- griptape/config/openai_structure_config.py | 60 +++--- griptape/config/structure_config.py | 65 +++--- .../config/structure_global_drivers_config.py | 45 ----- .../config/structure_task_memory_config.py | 23 --- ...re_task_memory_extraction_engine_config.py | 18 -- ...ask_memory_extraction_engine_csv_config.py | 11 - ...sk_memory_extraction_engine_json_config.py | 11 - ...ructure_task_memory_query_engine_config.py | 22 -- ...cture_task_memory_summary_engine_config.py | 11 - .../structure/summary_conversation_memory.py | 2 +- .../task/storage/text_artifact_storage.py | 10 +- griptape/structures/structure.py | 72 ++----- griptape/tasks/csv_extraction_task.py | 4 +- griptape/tasks/image_query_task.py | 4 +- .../tasks/inpainting_image_generation_task.py | 2 +- griptape/tasks/json_extraction_task.py | 4 +- .../outpainting_image_generation_task.py | 2 +- .../tasks/prompt_image_generation_task.py | 2 +- griptape/tasks/prompt_task.py | 2 +- griptape/tasks/text_query_task.py | 4 +- griptape/tasks/text_summary_task.py | 4 +- griptape/tasks/text_to_speech_task.py | 2 +- .../tasks/variation_image_generation_task.py | 2 +- griptape/utils/chat.py | 4 +- griptape/utils/prompt_stack.py | 2 +- griptape/utils/stream.py | 2 +- tests/mocks/mock_structure_config.py | 59 ++---- .../test_amazon_bedrock_structure_config.py | 135 +++---------- .../config/test_anthropic_structure_config.py | 113 +++-------- .../config/test_google_structure_config.py | 108 ++-------- .../config/test_openai_structure_config.py | 162 ++++----------- tests/unit/config/test_structure_config.py | 91 ++------- tests/unit/tasks/test_json_extraction_task.py | 6 +- tests/utils/structure_tester.py | 5 +- 48 files changed, 459 insertions(+), 1133 deletions(-) delete mode 100644 griptape/config/structure_global_drivers_config.py delete mode 100644 griptape/config/structure_task_memory_config.py delete mode 100644 griptape/config/structure_task_memory_extraction_engine_config.py delete mode 100644 griptape/config/structure_task_memory_extraction_engine_csv_config.py delete mode 100644 griptape/config/structure_task_memory_extraction_engine_json_config.py delete mode 100644 griptape/config/structure_task_memory_query_engine_config.py delete mode 100644 griptape/config/structure_task_memory_summary_engine_config.py diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index cf3966c97..ac69abcd4 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -15,7 +15,7 @@ from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtracti from griptape.memory import TaskMemory from griptape.artifacts import TextArtifact from griptape.memory.task.storage import TextArtifactStorage -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] @@ -59,11 +59,9 @@ loader = Agent( WebScraper() ], config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=azure_prompt_driver, - vector_store_driver=mongo_driver, - embedding_driver=azure_embedding_driver - ) + prompt_driver=azure_prompt_driver, + vector_store_driver=mongo_driver, + embedding_driver=azure_embedding_driver ), ) asker = Agent( diff --git a/docs/griptape-framework/data/chunkers.md b/docs/griptape-framework/data/chunkers.md index 0df73f965..b67951b2a 100644 --- a/docs/griptape-framework/data/chunkers.md +++ b/docs/griptape-framework/data/chunkers.md @@ -15,7 +15,7 @@ from griptape.chunkers import TextChunker from griptape.tokenizers import OpenAiTokenizer TextChunker( # set an optional custom tokenizer - tokenizer=OpenAiTokenizer(model="gpt-4"), + tokenizer=OpenAiTokenizer(model="gpt-4o"), # optionally modify default number of tokens max_tokens=100 ).chunk("long text") diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 332e9674a..876013e7f 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -174,18 +174,13 @@ from griptape.drivers import ( OpenAiChatPromptDriver, VoyageAiEmbeddingDriver, ) -from griptape.config import ( - StructureGlobalDriversConfig, - StructureConfig, -) +from griptape.config import StructureConfig agent = Agent( tools=[WebScraper(), TaskMemoryClient(off_prompt=False)], config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), - embedding_driver=VoyageAiEmbeddingDriver(), - ) + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), + embedding_driver=VoyageAiEmbeddingDriver(), ), ) diff --git a/docs/griptape-framework/drivers/event-listener-drivers.md b/docs/griptape-framework/drivers/event-listener-drivers.md index da9a6c05d..d35489f98 100644 --- a/docs/griptape-framework/drivers/event-listener-drivers.md +++ b/docs/griptape-framework/drivers/event-listener-drivers.md @@ -118,7 +118,7 @@ The [AwsIotCoreEventListenerDriver](../../reference/griptape/drivers/event_liste ```python import os -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver from griptape.events import ( EventListener, @@ -134,10 +134,8 @@ agent = Agent( ) ], config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-3.5-turbo", temperature=0.7 - ), + prompt_driver=OpenAiChatPromptDriver( + model="gpt-3.5-turbo", temperature=0.7 ) ), event_listeners=[ diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index db6bf5d96..ae798b22e 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -8,13 +8,11 @@ You can instantiate drivers and pass them to structures: from griptape.structures import Agent from griptape.drivers import OpenAiChatPromptDriver from griptape.rules import Rule -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4", temperature=0.3), - ) + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", temperature=0.3), ), input_template="You will be provided with a tweet, and your task is to classify its sentiment as positive, neutral, or negative. Tweet: {{ args[0] }}", rules=[ @@ -70,18 +68,16 @@ import os from griptape.structures import Agent from griptape.drivers import OpenAiChatPromptDriver from griptape.rules import Rule -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver( - api_key=os.environ["OPENAI_API_KEY"], - temperature=0.1, - model="gpt-3.5-turbo", - response_format="json_object", - seed=42, - ) + prompt_driver=OpenAiChatPromptDriver( + api_key=os.environ["OPENAI_API_KEY"], + temperature=0.1, + model="gpt-3.5-turbo", + response_format="json_object", + seed=42, ) ), input_template="You will be provided with a description of a mood, and your task is to generate the CSS code for a color that matches it. Description: {{ args[0] }}", @@ -107,17 +103,15 @@ import os from griptape.structures import Agent from griptape.rules import Rule from griptape.drivers import AzureOpenAiChatPromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AzureOpenAiChatPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-3.5-turbo-16k", - azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - ) + prompt_driver=AzureOpenAiChatPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="gpt-3.5-turbo-16k", + azure_deployment=os.environ["AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], ) ), rules=[ @@ -139,18 +133,16 @@ The [AzureOpenAiCompletionPromptDriver](../../reference/griptape/drivers/prompt/ import os from griptape.structures import Agent from griptape.drivers import AzureOpenAiCompletionPromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AzureOpenAiCompletionPromptDriver( - api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="text-davinci-003", - azure_deployment=os.environ["AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID"], - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], - temperature=1 - ) + prompt_driver=AzureOpenAiCompletionPromptDriver( + api_key=os.environ["AZURE_OPENAI_API_KEY_1"], + model="text-davinci-003", + azure_deployment=os.environ["AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID"], + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], + temperature=1 ) ) ) @@ -176,15 +168,13 @@ The [CoherePromptDriver](../../reference/griptape/drivers/prompt/cohere_prompt_d import os from griptape.structures import Agent from griptape.drivers import CoherePromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=CoherePromptDriver( - model="command", - api_key=os.environ['COHERE_API_KEY'], - ) + prompt_driver=CoherePromptDriver( + model="command", + api_key=os.environ['COHERE_API_KEY'], ) ) ) @@ -203,15 +193,13 @@ The [AnthropicPromptDriver](../../reference/griptape/drivers/prompt/anthropic_pr import os from griptape.structures import Agent from griptape.drivers import AnthropicPromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-opus-20240229", - api_key=os.environ['ANTHROPIC_API_KEY'], - ) + prompt_driver=AnthropicPromptDriver( + model="claude-3-opus-20240229", + api_key=os.environ['ANTHROPIC_API_KEY'], ) ) ) @@ -230,15 +218,13 @@ The [GooglePromptDriver](../../reference/griptape/drivers/prompt/google_prompt_d import os from griptape.structures import Agent from griptape.drivers import GooglePromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=GooglePromptDriver( - model="gemini-pro", - api_key=os.environ['GOOGLE_API_KEY'], - ) + prompt_driver=GooglePromptDriver( + model="gemini-pro", + api_key=os.environ['GOOGLE_API_KEY'], ) ) ) @@ -264,7 +250,7 @@ from griptape.structures import Agent from griptape.drivers import HuggingFaceHubPromptDriver from griptape.rules import Rule, Ruleset from griptape.utils import PromptStack -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: @@ -284,12 +270,10 @@ def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="tiiuae/falcon-7b-instruct", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - prompt_stack_to_string=prompt_stack_to_string_converter, - ) + prompt_driver=HuggingFaceHubPromptDriver( + model="tiiuae/falcon-7b-instruct", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + prompt_stack_to_string=prompt_stack_to_string_converter, ) ), rulesets=[ @@ -317,17 +301,15 @@ The [HuggingFaceHubPromptDriver](#hugging-face-hub) also supports [Text Generati import os from griptape.structures import Agent from griptape.drivers import HuggingFaceHubPromptDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="http://127.0.0.1:8080", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - ), - ) + prompt_driver=HuggingFaceHubPromptDriver( + model="http://127.0.0.1:8080", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + ), ), ) @@ -353,7 +335,7 @@ from griptape.structures import Agent from griptape.drivers import HuggingFaceHubPromptDriver from griptape.rules import Rule, Ruleset from griptape.utils import PromptStack -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig # Override the default Prompt Stack to string converter @@ -375,12 +357,10 @@ def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="tiiuae/falcon-7b-instruct", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], - prompt_stack_to_string=prompt_stack_to_string_converter, - ), + prompt_driver=HuggingFaceHubPromptDriver( + model="tiiuae/falcon-7b-instruct", + api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + prompt_stack_to_string=prompt_stack_to_string_converter, ) ), rulesets=[ @@ -423,16 +403,14 @@ from griptape.drivers import ( SageMakerLlamaPromptModelDriver, ) from griptape.rules import Rule -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], - prompt_model_driver=SageMakerLlamaPromptModelDriver(), - temperature=0.75, - ), + prompt_driver=AmazonSageMakerPromptDriver( + model=os.environ["SAGEMAKER_LLAMA_ENDPOINT_NAME"], + prompt_model_driver=SageMakerLlamaPromptModelDriver(), + temperature=0.75, ) ), rules=[ @@ -455,15 +433,13 @@ from griptape.drivers import ( AmazonSageMakerPromptDriver, SageMakerFalconPromptModelDriver, ) -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonSageMakerPromptDriver( - model=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], - prompt_model_driver=SageMakerFalconPromptModelDriver(), - ), + prompt_driver=AmazonSageMakerPromptDriver( + model=os.environ["SAGEMAKER_FALCON_ENDPOINT_NAME"], + prompt_model_driver=SageMakerFalconPromptModelDriver(), ) ) ) @@ -486,16 +462,14 @@ To use this model with Amazon Bedrock, use the [BedrockTitanPromptModelDriver](. ```python from griptape.structures import Agent from griptape.drivers import AmazonBedrockPromptDriver, BedrockTitanPromptModelDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="amazon.titan-text-express-v1", - prompt_model_driver=BedrockTitanPromptModelDriver( - top_p=1, - ) + prompt_driver=AmazonBedrockPromptDriver( + model="amazon.titan-text-express-v1", + prompt_model_driver=BedrockTitanPromptModelDriver( + top_p=1, ) ) ) @@ -515,17 +489,15 @@ To use this model with Amazon Bedrock, use the [BedrockClaudePromptModelDriver]( from griptape.structures import Agent from griptape.drivers import AmazonBedrockPromptDriver, BedrockClaudePromptModelDriver from griptape.rules import Rule -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - prompt_model_driver=BedrockClaudePromptModelDriver( - top_p=1, - ), - ), + prompt_driver=AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + prompt_model_driver=BedrockClaudePromptModelDriver( + top_p=1, + ) ) ), rules=[ @@ -554,15 +526,13 @@ To use this model with Amazon Bedrock, use the [BedrockLlamaPromptModelDriver](. ```python from griptape.structures import Agent from griptape.drivers import AmazonBedrockPromptDriver, BedrockLlamaPromptModelDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="meta.llama2-13b-chat-v1", - prompt_model_driver=BedrockLlamaPromptModelDriver(), - ), + prompt_driver=AmazonBedrockPromptDriver( + model="meta.llama2-13b-chat-v1", + prompt_model_driver=BedrockLlamaPromptModelDriver(), ) ) ) @@ -578,16 +548,14 @@ To use this model with Amazon Bedrock, use the [BedrockJurassicPromptModelDriver ```python from griptape.structures import Agent from griptape.drivers import AmazonBedrockPromptDriver, BedrockJurassicPromptModelDriver -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="ai21.j2-ultra-v1", - prompt_model_driver=BedrockJurassicPromptModelDriver(top_p=0.95), - temperature=0.7, - ) + prompt_driver=AmazonBedrockPromptDriver( + model="ai21.j2-ultra-v1", + prompt_model_driver=BedrockJurassicPromptModelDriver(top_p=0.95), + temperature=0.7, ) ) ) diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index f45f77199..e4ff8b8f3 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -130,15 +130,20 @@ from griptape.events import CompletionChunkEvent, EventListener from griptape.tasks import ToolkitTask from griptape.structures import Pipeline from griptape.tools import WebScraper, TaskMemoryClient +from griptape.config import OpenAiStructureConfig +from griptape.drivers import OpenAiChatPromptDriver pipeline = Pipeline( + config=OpenAiStructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", stream=True) + ), event_listeners=[ EventListener( lambda e: print(e.token, end="", flush=True), event_types=[CompletionChunkEvent], ) - ] + ], ) pipeline.add_tasks( @@ -162,7 +167,7 @@ from griptape.tools import WebScraper pipeline = Pipeline() -pipeline.config.global_drivers.prompt_driver.stream = True +pipeline.config.prompt_driver.stream = True pipeline.add_tasks(ToolkitTask("Based on https://griptape.ai, tell me what griptape is.", tools=[WebScraper()])) for artifact in Stream(pipeline).run(): diff --git a/docs/griptape-framework/misc/tokenizers.md b/docs/griptape-framework/misc/tokenizers.md index b523d04e4..aaf488187 100644 --- a/docs/griptape-framework/misc/tokenizers.md +++ b/docs/griptape-framework/misc/tokenizers.md @@ -13,7 +13,7 @@ Tokenizers are a low level abstraction that you will rarely interact with direct from griptape.tokenizers import OpenAiTokenizer -tokenizer = OpenAiTokenizer(model="gpt-4") +tokenizer = OpenAiTokenizer(model="gpt-4o") print(tokenizer.count_tokens("Hello world!")) print(tokenizer.count_input_tokens_left("Hello world!")) diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index c392200f9..817dfb7fe 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -74,44 +74,19 @@ This approach ensures that you are informed through clear error messages if you ```python import os from griptape.structures import Agent -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig from griptape.drivers import AnthropicPromptDriver agent = Agent( config=StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=AnthropicPromptDriver( - model="claude-3-sonnet-20240229", - api_key=os.environ["ANTHROPIC_API_KEY"], - ) + prompt_driver=AnthropicPromptDriver( + model="claude-3-sonnet-20240229", + api_key=os.environ["ANTHROPIC_API_KEY"], ) ), ) ``` -### Task Memory - -Griptape allows for detailed control over [Task Memory](./task-memory.md) settings, permitting overrides on a per Engine basis, beyond the global Drivers configuration. - -```python -from griptape.structures import Agent -from griptape.config import StructureConfig, StructureTaskMemoryConfig, StructureTaskMemoryQueryEngineConfig -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver - - -agent = Agent( - config=StructureConfig( - task_memory=StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver(), - ) - ) - ) - ) -) -``` - ### Loading/Saving Configs Configuration classes in Griptape offer utility methods for loading, saving, and merging configurations, streamlining the management of complex setups. @@ -122,19 +97,15 @@ from griptape.config import AmazonBedrockStructureConfig from griptape.drivers import AmazonBedrockCohereEmbeddingDriver custom_config = AmazonBedrockStructureConfig() -custom_config.global_drivers.embedding_driver = AmazonBedrockCohereEmbeddingDriver() +custom_config.embedding_driver = AmazonBedrockCohereEmbeddingDriver() custom_config.merge_config( { - "task_memory": { - "summary_engine": { - "prompt_driver": { - "model": "amazon.titan-text-express-v1", - "prompt_model_driver": { - "type": "BedrockTitanPromptModelDriver", - }, - } - } - } + "embedding_driver": { + "base_url": None, + "model": "text-embedding-3-small", + "organization": None, + "type": "OpenAiEmbeddingDriver", + }, } ) serialized_config = custom_config.to_json() diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-client.md index b253d0bce..a889f0e81 100644 --- a/docs/griptape-tools/official-tools/rest-api-client.md +++ b/docs/griptape-tools/official-tools/rest-api-client.md @@ -14,7 +14,7 @@ from griptape.memory.structure import ConversationMemory from griptape.structures import Pipeline from griptape.tasks import ToolkitTask from griptape.tools import RestApiClient -from griptape.config import StructureConfig, StructureGlobalDriversConfig +from griptape.config import StructureConfig posts_client = RestApiClient( base_url="https://jsonplaceholder.typicode.com", @@ -119,12 +119,10 @@ posts_client = RestApiClient( pipeline = Pipeline( conversation_memory=ConversationMemory(), config = StructureConfig( - global_drivers=StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver( - model="gpt-4", - temperature=0.1 - ), - ) + prompt_driver=OpenAiChatPromptDriver( + model="gpt-4o", + temperature=0.1 + ), ), ) diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index 273a338f2..849556017 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -1,12 +1,5 @@ from .base_config import BaseConfig -from .structure_global_drivers_config import StructureGlobalDriversConfig -from .structure_task_memory_extraction_engine_csv_config import StructureTaskMemoryExtractionEngineCsvConfig -from .structure_task_memory_extraction_engine_json_config import StructureTaskMemoryExtractionEngineJsonConfig -from .structure_task_memory_extraction_engine_config import StructureTaskMemoryExtractionEngineConfig -from .structure_task_memory_query_engine_config import StructureTaskMemoryQueryEngineConfig -from .structure_task_memory_summary_engine_config import StructureTaskMemorySummaryEngineConfig -from .structure_task_memory_config import StructureTaskMemoryConfig from .base_structure_config import BaseStructureConfig from .structure_config import StructureConfig @@ -19,13 +12,6 @@ __all__ = [ "BaseConfig", "BaseStructureConfig", - "StructureTaskMemoryConfig", - "StructureGlobalDriversConfig", - "StructureTaskMemoryQueryEngineConfig", - "StructureTaskMemorySummaryEngineConfig", - "StructureTaskMemoryExtractionEngineConfig", - "StructureTaskMemoryExtractionEngineCsvConfig", - "StructureTaskMemoryExtractionEngineJsonConfig", "StructureConfig", "OpenAiStructureConfig", "AmazonBedrockStructureConfig", diff --git a/griptape/config/amazon_bedrock_structure_config.py b/griptape/config/amazon_bedrock_structure_config.py index 54b8d91c7..cefb97f57 100644 --- a/griptape/config/amazon_bedrock_structure_config.py +++ b/griptape/config/amazon_bedrock_structure_config.py @@ -1,69 +1,61 @@ from attrs import Factory, define, field -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryExtractionEngineCsvConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, -) +from griptape.config import StructureConfig from griptape.drivers import ( AmazonBedrockImageGenerationDriver, AmazonBedrockImageQueryDriver, AmazonBedrockPromptDriver, AmazonBedrockTitanEmbeddingDriver, - BedrockClaudePromptModelDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BasePromptDriver, + BaseVectorStoreDriver, BedrockClaudeImageQueryModelDriver, + BedrockClaudePromptModelDriver, BedrockTitanImageGenerationModelDriver, LocalVectorStoreDriver, ) @define() -class AmazonBedrockStructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( +class AmazonBedrockStructureConfig(StructureConfig): + prompt_driver: BasePromptDriver = field( + default=Factory( + lambda: AmazonBedrockPromptDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + stream=False, + prompt_model_driver=BedrockClaudePromptModelDriver(), + ) + ), + metadata={"serializable": True}, + ) + image_generation_driver: BaseImageGenerationDriver = field( default=Factory( - lambda: StructureGlobalDriversConfig( - prompt_driver=AmazonBedrockPromptDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - stream=False, - prompt_model_driver=BedrockClaudePromptModelDriver(), - ), - image_generation_driver=AmazonBedrockImageGenerationDriver( - model="amazon.titan-image-generator-v1", - image_generation_model_driver=BedrockTitanImageGenerationModelDriver(), - ), - image_query_driver=AmazonBedrockImageQueryDriver( - model="anthropic.claude-3-sonnet-20240229-v1:0", - image_query_model_driver=BedrockClaudeImageQueryModelDriver(), - ), - embedding_driver=AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1") - ), + lambda: AmazonBedrockImageGenerationDriver( + model="amazon.titan-image-generator-v1", + image_generation_model_driver=BedrockTitanImageGenerationModelDriver(), ) ), - kw_only=True, metadata={"serializable": True}, ) - task_memory: StructureTaskMemoryConfig = field( + image_query_driver: BaseImageGenerationDriver = field( default=Factory( - lambda self: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=self.global_drivers.prompt_driver, - vector_store_driver=self.global_drivers.vector_store_driver, - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig(prompt_driver=self.global_drivers.prompt_driver), - json=StructureTaskMemoryExtractionEngineJsonConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - takes_self=True, + lambda: AmazonBedrockImageQueryDriver( + model="anthropic.claude-3-sonnet-20240229-v1:0", + image_query_model_driver=BedrockClaudeImageQueryModelDriver(), + ) + ), + metadata={"serializable": True}, + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory(lambda: AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1")), + metadata={"serializable": True}, + ) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory( + lambda: LocalVectorStoreDriver( + embedding_driver=AmazonBedrockTitanEmbeddingDriver(model="amazon.titan-embed-text-v1") + ) ), - kw_only=True, metadata={"serializable": True}, ) diff --git a/griptape/config/anthropic_structure_config.py b/griptape/config/anthropic_structure_config.py index 06978a5c2..8984300a5 100644 --- a/griptape/config/anthropic_structure_config.py +++ b/griptape/config/anthropic_structure_config.py @@ -1,54 +1,39 @@ from attrs import Factory, define, field -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryExtractionEngineCsvConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, -) +from griptape.config import StructureConfig from griptape.drivers import ( - LocalVectorStoreDriver, - AnthropicPromptDriver, AnthropicImageQueryDriver, + AnthropicPromptDriver, + BaseEmbeddingDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseVectorStoreDriver, + LocalVectorStoreDriver, VoyageAiEmbeddingDriver, ) @define -class AnthropicStructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( - default=Factory( - lambda: StructureGlobalDriversConfig( - prompt_driver=AnthropicPromptDriver(model="claude-3-opus-20240229"), - embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2") - ), - image_query_driver=AnthropicImageQueryDriver(model="claude-3-opus-20240229"), - ) - ), +class AnthropicStructureConfig(StructureConfig): + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: AnthropicPromptDriver(model="claude-3-opus-20240229")), + metadata={"serializable": True}, kw_only=True, + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory(lambda: VoyageAiEmbeddingDriver(model="voyage-large-2")), metadata={"serializable": True}, + kw_only=True, ) - task_memory: StructureTaskMemoryConfig = field( + vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda self: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=self.global_drivers.prompt_driver, - vector_store_driver=LocalVectorStoreDriver(embedding_driver=self.global_drivers.embedding_driver), - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig(prompt_driver=self.global_drivers.prompt_driver), - json=StructureTaskMemoryExtractionEngineJsonConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - takes_self=True, + lambda: LocalVectorStoreDriver(embedding_driver=VoyageAiEmbeddingDriver(model="voyage-large-2")) ), kw_only=True, metadata={"serializable": True}, ) + image_query_driver: BaseImageQueryDriver = field( + default=Factory(lambda: AnthropicImageQueryDriver(model="claude-3-opus-20240229")), + kw_only=True, + metadata={"serializable": True}, + ) diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index afa8e4012..d716205c8 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -1,17 +1,34 @@ from __future__ import annotations from abc import ABC +from typing import Optional from attr import define, field -from griptape.config import BaseConfig, StructureGlobalDriversConfig, StructureTaskMemoryConfig +from griptape.config import BaseConfig +from griptape.drivers import ( + BaseConversationMemoryDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseVectorStoreDriver, + BaseTextToSpeechDriver, +) from griptape.utils import dict_merge @define class BaseStructureConfig(BaseConfig, ABC): - global_drivers: StructureGlobalDriversConfig = field(kw_only=True, metadata={"serializable": True}) - task_memory: StructureTaskMemoryConfig = field(kw_only=True, metadata={"serializable": True}) + prompt_driver: BasePromptDriver = field(kw_only=True, metadata={"serializable": True}) + image_generation_driver: BaseImageGenerationDriver = field(kw_only=True, metadata={"serializable": True}) + image_query_driver: BaseImageQueryDriver = field(kw_only=True, metadata={"serializable": True}) + embedding_driver: BaseEmbeddingDriver = field(kw_only=True, metadata={"serializable": True}) + vector_store_driver: BaseVectorStoreDriver = field(kw_only=True, metadata={"serializable": True}) + conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( + default=None, kw_only=True, metadata={"serializable": True} + ) + text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) def merge_config(self, config: dict) -> BaseStructureConfig: base_config = self.to_dict() diff --git a/griptape/config/google_structure_config.py b/griptape/config/google_structure_config.py index 9ba40622f..744d08782 100644 --- a/griptape/config/google_structure_config.py +++ b/griptape/config/google_structure_config.py @@ -1,47 +1,29 @@ from attrs import Factory, define, field -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryExtractionEngineCsvConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, +from griptape.config import StructureConfig +from griptape.drivers import ( + BaseEmbeddingDriver, + BasePromptDriver, + BaseVectorStoreDriver, + GoogleEmbeddingDriver, + GooglePromptDriver, + LocalVectorStoreDriver, ) -from griptape.drivers import LocalVectorStoreDriver, GooglePromptDriver, GoogleEmbeddingDriver @define -class GoogleStructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( - default=Factory( - lambda: StructureGlobalDriversConfig( - prompt_driver=GooglePromptDriver(model="gemini-pro"), - embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001") - ), - ) - ), +class GoogleStructureConfig(StructureConfig): + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: GooglePromptDriver(model="gemini-pro")), kw_only=True, metadata={"serializable": True} + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory(lambda: GoogleEmbeddingDriver(model="models/embedding-001")), kw_only=True, metadata={"serializable": True}, ) - task_memory: StructureTaskMemoryConfig = field( + vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda self: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=self.global_drivers.prompt_driver, - vector_store_driver=LocalVectorStoreDriver(embedding_driver=self.global_drivers.embedding_driver), - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig(prompt_driver=self.global_drivers.prompt_driver), - json=StructureTaskMemoryExtractionEngineJsonConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - takes_self=True, + lambda: LocalVectorStoreDriver(embedding_driver=GoogleEmbeddingDriver(model="models/embedding-001")) ), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index 64c32ecec..5b2e163ba 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -1,16 +1,12 @@ from attrs import Factory, define, field -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryExtractionEngineCsvConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, -) +from griptape.config import StructureConfig from griptape.drivers import ( + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BasePromptDriver, + BaseVectorStoreDriver, LocalVectorStoreDriver, OpenAiChatPromptDriver, OpenAiEmbeddingDriver, @@ -20,36 +16,28 @@ @define -class OpenAiStructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( - default=Factory( - lambda: StructureGlobalDriversConfig( - prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), - image_generation_driver=OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512"), - image_query_driver=OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview"), - embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small") - ), - ) - ), +class OpenAiStructureConfig(StructureConfig): + prompt_driver: BasePromptDriver = field( + default=Factory(lambda: OpenAiChatPromptDriver(model="gpt-4o")), metadata={"serializable": True}, kw_only=True + ) + image_generation_driver: BaseImageGenerationDriver = field( + default=Factory(lambda: OpenAiImageGenerationDriver(model="dall-e-2", image_size="512x512")), + kw_only=True, + metadata={"serializable": True}, + ) + image_query_driver: BaseImageQueryDriver = field( + default=Factory(lambda: OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview")), kw_only=True, metadata={"serializable": True}, ) - task_memory: StructureTaskMemoryConfig = field( + embedding_driver: BaseEmbeddingDriver = field( + default=Factory(lambda: OpenAiEmbeddingDriver(model="text-embedding-3-small")), + metadata={"serializable": True}, + kw_only=True, + ) + vector_store_driver: BaseVectorStoreDriver = field( default=Factory( - lambda self: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=self.global_drivers.prompt_driver, - vector_store_driver=LocalVectorStoreDriver(embedding_driver=self.global_drivers.embedding_driver), - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig(prompt_driver=self.global_drivers.prompt_driver), - json=StructureTaskMemoryExtractionEngineJsonConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - takes_self=True, + lambda: LocalVectorStoreDriver(embedding_driver=OpenAiEmbeddingDriver(model="text-embedding-3-small")) ), kw_only=True, metadata={"serializable": True}, diff --git a/griptape/config/structure_config.py b/griptape/config/structure_config.py index 6381450f4..63f1ea9f3 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/structure_config.py @@ -1,38 +1,45 @@ from attrs import Factory, define, field +from typing import Optional -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryExtractionEngineCsvConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, +from griptape.config import BaseStructureConfig + +from griptape.drivers import ( + BaseConversationMemoryDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BasePromptDriver, + BaseVectorStoreDriver, + DummyVectorStoreDriver, + DummyEmbeddingDriver, + DummyImageGenerationDriver, + DummyPromptDriver, + DummyImageQueryDriver, + BaseImageQueryDriver, + BaseTextToSpeechDriver, + DummyTextToSpeechDriver, ) -from griptape.drivers import LocalVectorStoreDriver @define class StructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( - default=Factory(lambda: StructureGlobalDriversConfig()), kw_only=True, metadata={"serializable": True} + prompt_driver: BasePromptDriver = field( + kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} + ) + image_generation_driver: BaseImageGenerationDriver = field( + kw_only=True, default=Factory(lambda: DummyImageGenerationDriver()), metadata={"serializable": True} + ) + image_query_driver: BaseImageQueryDriver = field( + kw_only=True, default=Factory(lambda: DummyImageQueryDriver()), metadata={"serializable": True} + ) + embedding_driver: BaseEmbeddingDriver = field( + kw_only=True, default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True} + ) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory(lambda: DummyVectorStoreDriver()), kw_only=True, metadata={"serializable": True} + ) + conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( + default=None, kw_only=True, metadata={"serializable": True} ) - task_memory: StructureTaskMemoryConfig = field( - default=Factory( - lambda self: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=self.global_drivers.prompt_driver, - vector_store_driver=LocalVectorStoreDriver(embedding_driver=self.global_drivers.embedding_driver), - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig(prompt_driver=self.global_drivers.prompt_driver), - json=StructureTaskMemoryExtractionEngineJsonConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig(prompt_driver=self.global_drivers.prompt_driver), - ), - takes_self=True, - ), - kw_only=True, - metadata={"serializable": True}, + text_to_speech_driver: BaseTextToSpeechDriver = field( + default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True} ) diff --git a/griptape/config/structure_global_drivers_config.py b/griptape/config/structure_global_drivers_config.py deleted file mode 100644 index b599039a2..000000000 --- a/griptape/config/structure_global_drivers_config.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import Optional - -from attrs import Factory, define, field - -from griptape.drivers import ( - BaseConversationMemoryDriver, - BaseEmbeddingDriver, - BaseImageGenerationDriver, - BasePromptDriver, - BaseVectorStoreDriver, - DummyVectorStoreDriver, - DummyEmbeddingDriver, - DummyImageGenerationDriver, - DummyPromptDriver, - DummyImageQueryDriver, - BaseImageQueryDriver, - BaseTextToSpeechDriver, -) -from griptape.drivers.text_to_speech.dummy_text_to_speech_driver import DummyTextToSpeechDriver -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureGlobalDriversConfig(SerializableMixin): - prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} - ) - image_generation_driver: BaseImageGenerationDriver = field( - kw_only=True, default=Factory(lambda: DummyImageGenerationDriver()), metadata={"serializable": True} - ) - image_query_driver: BaseImageQueryDriver = field( - kw_only=True, default=Factory(lambda: DummyImageQueryDriver()), metadata={"serializable": True} - ) - embedding_driver: BaseEmbeddingDriver = field( - kw_only=True, default=Factory(lambda: DummyEmbeddingDriver()), metadata={"serializable": True} - ) - vector_store_driver: BaseVectorStoreDriver = field( - default=Factory(lambda: DummyVectorStoreDriver()), kw_only=True, metadata={"serializable": True} - ) - conversation_memory_driver: Optional[BaseConversationMemoryDriver] = field( - default=None, kw_only=True, metadata={"serializable": True} - ) - text_to_speech_driver: BaseTextToSpeechDriver = field( - default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True} - ) diff --git a/griptape/config/structure_task_memory_config.py b/griptape/config/structure_task_memory_config.py deleted file mode 100644 index 3b8648dcf..000000000 --- a/griptape/config/structure_task_memory_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from attrs import Factory, define, field - -from griptape.config import ( - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemorySummaryEngineConfig, -) -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemoryConfig(SerializableMixin): - query_engine: StructureTaskMemoryQueryEngineConfig = field( - kw_only=True, default=Factory(lambda: StructureTaskMemoryQueryEngineConfig()), metadata={"serializable": True} - ) - extraction_engine: StructureTaskMemoryExtractionEngineConfig = field( - kw_only=True, - default=Factory(lambda: StructureTaskMemoryExtractionEngineConfig()), - metadata={"serializable": True}, - ) - summary_engine: StructureTaskMemorySummaryEngineConfig = field( - kw_only=True, default=Factory(lambda: StructureTaskMemorySummaryEngineConfig()), metadata={"serializable": True} - ) diff --git a/griptape/config/structure_task_memory_extraction_engine_config.py b/griptape/config/structure_task_memory_extraction_engine_config.py deleted file mode 100644 index 8c2a58f02..000000000 --- a/griptape/config/structure_task_memory_extraction_engine_config.py +++ /dev/null @@ -1,18 +0,0 @@ -from attrs import Factory, define, field - -from griptape.config import StructureTaskMemoryExtractionEngineCsvConfig, StructureTaskMemoryExtractionEngineJsonConfig -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemoryExtractionEngineConfig(SerializableMixin): - csv: StructureTaskMemoryExtractionEngineCsvConfig = field( - kw_only=True, - default=Factory(lambda: StructureTaskMemoryExtractionEngineCsvConfig()), - metadata={"serializable": True}, - ) - json: StructureTaskMemoryExtractionEngineJsonConfig = field( - kw_only=True, - default=Factory(lambda: StructureTaskMemoryExtractionEngineJsonConfig()), - metadata={"serializable": True}, - ) diff --git a/griptape/config/structure_task_memory_extraction_engine_csv_config.py b/griptape/config/structure_task_memory_extraction_engine_csv_config.py deleted file mode 100644 index cce5f3e02..000000000 --- a/griptape/config/structure_task_memory_extraction_engine_csv_config.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import define, field, Factory - -from griptape.drivers import BasePromptDriver, DummyPromptDriver -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemoryExtractionEngineCsvConfig(SerializableMixin): - prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} - ) diff --git a/griptape/config/structure_task_memory_extraction_engine_json_config.py b/griptape/config/structure_task_memory_extraction_engine_json_config.py deleted file mode 100644 index 04210b8c8..000000000 --- a/griptape/config/structure_task_memory_extraction_engine_json_config.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import define, field, Factory - -from griptape.drivers import BasePromptDriver, DummyPromptDriver -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemoryExtractionEngineJsonConfig(SerializableMixin): - prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} - ) diff --git a/griptape/config/structure_task_memory_query_engine_config.py b/griptape/config/structure_task_memory_query_engine_config.py deleted file mode 100644 index 30d6bbcf9..000000000 --- a/griptape/config/structure_task_memory_query_engine_config.py +++ /dev/null @@ -1,22 +0,0 @@ -from attrs import Factory, define, field - -from griptape.drivers import ( - BasePromptDriver, - BaseVectorStoreDriver, - DummyVectorStoreDriver, - DummyEmbeddingDriver, - DummyPromptDriver, -) -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemoryQueryEngineConfig(SerializableMixin): - prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} - ) - vector_store_driver: BaseVectorStoreDriver = field( - kw_only=True, - default=Factory(lambda: DummyVectorStoreDriver(embedding_driver=DummyEmbeddingDriver())), - metadata={"serializable": True}, - ) diff --git a/griptape/config/structure_task_memory_summary_engine_config.py b/griptape/config/structure_task_memory_summary_engine_config.py deleted file mode 100644 index 100f9d8f1..000000000 --- a/griptape/config/structure_task_memory_summary_engine_config.py +++ /dev/null @@ -1,11 +0,0 @@ -from attrs import Factory, define, field - -from griptape.drivers import BasePromptDriver, DummyPromptDriver -from griptape.mixins.serializable_mixin import SerializableMixin - - -@define -class StructureTaskMemorySummaryEngineConfig(SerializableMixin): - prompt_driver: BasePromptDriver = field( - kw_only=True, default=Factory(lambda: DummyPromptDriver()), metadata={"serializable": True} - ) diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index 1f622b0d2..fa06a3c76 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -25,7 +25,7 @@ class SummaryConversationMemory(ConversationMemory): def prompt_driver(self) -> BasePromptDriver: if self._prompt_driver is None: if self.structure is not None: - self._prompt_driver = self.structure.config.global_drivers.prompt_driver + self._prompt_driver = self.structure.config.prompt_driver else: raise ValueError("Prompt Driver is not set.") return self._prompt_driver diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index e5cd73eb8..8e4423f54 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Optional from attr import define, field from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact from griptape.memory.task.storage import BaseArtifactStorage @@ -11,9 +11,9 @@ @define class TextArtifactStorage(BaseArtifactStorage): query_engine: VectorQueryEngine = field(kw_only=True) - summary_engine: BaseSummaryEngine = field(kw_only=True) - csv_extraction_engine: CsvExtractionEngine = field(kw_only=True) - json_extraction_engine: JsonExtractionEngine = field(kw_only=True) + summary_engine: Optional[BaseSummaryEngine] = field(kw_only=True, default=None) + csv_extraction_engine: Optional[CsvExtractionEngine] = field(kw_only=True, default=None) + json_extraction_engine: Optional[JsonExtractionEngine] = field(kw_only=True, default=None) def can_store(self, artifact: BaseArtifact) -> bool: return isinstance(artifact, TextArtifact) @@ -28,6 +28,8 @@ def load_artifacts(self, namespace: str) -> ListArtifact: return self.query_engine.load_artifacts(namespace) def summarize(self, namespace: str) -> TextArtifact: + if self.summary_engine is None: + raise ValueError("Summary engine is not set.") return self.summary_engine.summarize_artifacts(self.load_artifacts(namespace)) def query(self, namespace: str, query: str, metadata: Any = None) -> TextArtifact: diff --git a/griptape/structures/structure.py b/griptape/structures/structure.py index c3912649d..8b71dd905 100644 --- a/griptape/structures/structure.py +++ b/griptape/structures/structure.py @@ -11,14 +11,7 @@ from griptape.artifacts import BlobArtifact, TextArtifact from griptape.config import BaseStructureConfig, OpenAiStructureConfig, StructureConfig -from griptape.drivers import ( - BaseEmbeddingDriver, - BasePromptDriver, - DummyPromptDriver, - DummyVectorStoreDriver, - OpenAiEmbeddingDriver, - OpenAiChatPromptDriver, -) +from griptape.drivers import BaseEmbeddingDriver, BasePromptDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver from griptape.engines import CsvExtractionEngine, JsonExtractionEngine, PromptSummaryEngine, VectorQueryEngine from griptape.events import BaseEvent, EventListener @@ -55,8 +48,7 @@ class Structure(ABC): event_listeners: list[EventListener] = field(factory=list, kw_only=True) conversation_memory: Optional[BaseConversationMemory] = field( default=Factory( - lambda self: ConversationMemory(driver=self.config.global_drivers.conversation_memory_driver), - takes_self=True, + lambda self: ConversationMemory(driver=self.config.conversation_memory_driver), takes_self=True ), kw_only=True, ) @@ -97,19 +89,17 @@ def __add__(self, other: BaseTask | list[BaseTask]) -> list[BaseTask]: @prompt_driver.validator # pyright: ignore def validate_prompt_driver(self, attribute, value): if value is not None: - deprecation_warn(f"`{attribute.name}` is deprecated, use `config.global_drivers.prompt_driver` instead.") + deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver` instead.") @embedding_driver.validator # pyright: ignore def validate_embedding_driver(self, attribute, value): if value is not None: - deprecation_warn(f"`{attribute.name}` is deprecated, use `config.global_drivers.embedding_driver` instead.") + deprecation_warn(f"`{attribute.name}` is deprecated, use `config.embedding_driver` instead.") @stream.validator # pyright: ignore def validate_stream(self, attribute, value): if value is not None: - deprecation_warn( - f"`{attribute.name}` is deprecated, use `config.global_drivers.prompt_driver.stream` instead." - ) + deprecation_warn(f"`{attribute.name}` is deprecated, use `config.prompt_driver.stream` instead.") @property def execution_args(self) -> tuple: @@ -147,7 +137,7 @@ def default_config(self) -> BaseStructureConfig: config = StructureConfig() if self.prompt_driver is None: - prompt_driver = OpenAiChatPromptDriver(model="gpt-4") + prompt_driver = OpenAiChatPromptDriver(model="gpt-4o") else: prompt_driver = self.prompt_driver @@ -161,15 +151,9 @@ def default_config(self) -> BaseStructureConfig: vector_store_driver = LocalVectorStoreDriver(embedding_driver=embedding_driver) - config.global_drivers.prompt_driver = prompt_driver - config.global_drivers.vector_store_driver = vector_store_driver - config.global_drivers.embedding_driver = embedding_driver - - config.task_memory.query_engine.prompt_driver = prompt_driver - config.task_memory.query_engine.vector_store_driver = vector_store_driver - config.task_memory.summary_engine.prompt_driver = prompt_driver - config.task_memory.extraction_engine.csv.prompt_driver = prompt_driver - config.task_memory.extraction_engine.json.prompt_driver = prompt_driver + config.prompt_driver = prompt_driver + config.vector_store_driver = vector_store_driver + config.embedding_driver = embedding_driver else: config = OpenAiStructureConfig() @@ -177,45 +161,15 @@ def default_config(self) -> BaseStructureConfig: @property def default_task_memory(self) -> TaskMemory: - global_drivers = self.config.global_drivers - task_memory = self.config.task_memory - return TaskMemory( artifact_storages={ TextArtifact: TextArtifactStorage( query_engine=VectorQueryEngine( - prompt_driver=( - global_drivers.prompt_driver - if isinstance(task_memory.query_engine.prompt_driver, DummyPromptDriver) - else task_memory.query_engine.prompt_driver - ), - vector_store_driver=( - global_drivers.vector_store_driver - if isinstance(task_memory.query_engine.prompt_driver, DummyVectorStoreDriver) - else task_memory.query_engine.vector_store_driver - ), - ), - summary_engine=PromptSummaryEngine( - prompt_driver=( - global_drivers.prompt_driver - if isinstance(task_memory.summary_engine.prompt_driver, DummyPromptDriver) - else task_memory.summary_engine.prompt_driver - ) - ), - csv_extraction_engine=CsvExtractionEngine( - prompt_driver=( - global_drivers.prompt_driver - if isinstance(task_memory.extraction_engine.csv.prompt_driver, DummyPromptDriver) - else task_memory.extraction_engine.csv.prompt_driver - ) - ), - json_extraction_engine=JsonExtractionEngine( - prompt_driver=( - global_drivers.prompt_driver - if isinstance(task_memory.extraction_engine.json.prompt_driver, DummyPromptDriver) - else task_memory.extraction_engine.json.prompt_driver - ) + prompt_driver=self.config.prompt_driver, vector_store_driver=self.config.vector_store_driver ), + summary_engine=PromptSummaryEngine(prompt_driver=self.config.prompt_driver), + csv_extraction_engine=CsvExtractionEngine(prompt_driver=self.config.prompt_driver), + json_extraction_engine=JsonExtractionEngine(prompt_driver=self.config.prompt_driver), ), BlobArtifact: BlobArtifactStorage(), } diff --git a/griptape/tasks/csv_extraction_task.py b/griptape/tasks/csv_extraction_task.py index ae71ea5d4..2f5f3db56 100644 --- a/griptape/tasks/csv_extraction_task.py +++ b/griptape/tasks/csv_extraction_task.py @@ -12,9 +12,7 @@ class CsvExtractionTask(ExtractionTask): def extraction_engine(self) -> CsvExtractionEngine: if self._extraction_engine is None: if self.structure is not None: - self._extraction_engine = CsvExtractionEngine( - prompt_driver=self.structure.config.global_drivers.prompt_driver - ) + self._extraction_engine = CsvExtractionEngine(prompt_driver=self.structure.config.prompt_driver) else: raise ValueError("Extraction Engine is not set.") return self._extraction_engine diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 29077a055..94be4f483 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -58,9 +58,7 @@ def input( def image_query_engine(self) -> ImageQueryEngine: if self._image_query_engine is None: if self.structure is not None: - self._image_query_engine = ImageQueryEngine( - image_query_driver=self.structure.config.global_drivers.image_query_driver - ) + self._image_query_engine = ImageQueryEngine(image_query_driver=self.structure.config.image_query_driver) else: raise ValueError("Image Query Engine is not set.") return self._image_query_engine diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 028ae336e..f3b2edb7a 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -57,7 +57,7 @@ def image_generation_engine(self) -> InpaintingImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = InpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.global_drivers.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tasks/json_extraction_task.py b/griptape/tasks/json_extraction_task.py index a43b1e1e2..e1f082fd8 100644 --- a/griptape/tasks/json_extraction_task.py +++ b/griptape/tasks/json_extraction_task.py @@ -12,9 +12,7 @@ class JsonExtractionTask(ExtractionTask): def extraction_engine(self) -> JsonExtractionEngine: if self._extraction_engine is None: if self.structure is not None: - self._extraction_engine = JsonExtractionEngine( - prompt_driver=self.structure.config.global_drivers.prompt_driver - ) + self._extraction_engine = JsonExtractionEngine(prompt_driver=self.structure.config.prompt_driver) else: raise ValueError("Extraction Engine is not set.") return self._extraction_engine diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index 7b0ffd06b..fd2d335e5 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -57,7 +57,7 @@ def image_generation_engine(self) -> OutpaintingImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = OutpaintingImageGenerationEngine( - image_generation_driver=self.structure.config.global_drivers.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 24971d1cb..93404ef84 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -50,7 +50,7 @@ def image_generation_engine(self) -> PromptImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = PromptImageGenerationEngine( - image_generation_driver=self.structure.config.global_drivers.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 525e21eef..16f7c6dac 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -42,7 +42,7 @@ def prompt_stack(self) -> PromptStack: def prompt_driver(self) -> BasePromptDriver: if self._prompt_driver is None: if self.structure is not None: - self._prompt_driver = self.structure.config.global_drivers.prompt_driver + self._prompt_driver = self.structure.config.prompt_driver else: raise ValueError("Prompt Driver is not set") return self._prompt_driver diff --git a/griptape/tasks/text_query_task.py b/griptape/tasks/text_query_task.py index 88fb94d10..5fee68103 100644 --- a/griptape/tasks/text_query_task.py +++ b/griptape/tasks/text_query_task.py @@ -18,8 +18,8 @@ def query_engine(self) -> BaseQueryEngine: if self._query_engine is None: if self.structure is not None: self._query_engine = VectorQueryEngine( - prompt_driver=self.structure.config.global_drivers.prompt_driver, - vector_store_driver=self.structure.config.global_drivers.vector_store_driver, + prompt_driver=self.structure.config.prompt_driver, + vector_store_driver=self.structure.config.vector_store_driver, ) else: raise ValueError("Query Engine is not set.") diff --git a/griptape/tasks/text_summary_task.py b/griptape/tasks/text_summary_task.py index 7cb6a8a0b..f10f851d0 100644 --- a/griptape/tasks/text_summary_task.py +++ b/griptape/tasks/text_summary_task.py @@ -17,9 +17,7 @@ class TextSummaryTask(BaseTextInputTask): def summary_engine(self) -> Optional[BaseSummaryEngine]: if self._summary_engine is None: if self.structure is not None: - self._summary_engine = PromptSummaryEngine( - prompt_driver=self.structure.config.global_drivers.prompt_driver - ) + self._summary_engine = PromptSummaryEngine(prompt_driver=self.structure.config.prompt_driver) else: raise ValueError("Summary Engine is not set.") return self._summary_engine diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index ab90b1bbb..8a69227c5 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -37,7 +37,7 @@ def text_to_speech_engine(self) -> TextToSpeechEngine: if self._text_to_speech_engine is None: if self.structure is not None: self._text_to_speech_engine = TextToSpeechEngine( - text_to_speech_driver=self.structure.config.global_drivers.text_to_speech_driver + text_to_speech_driver=self.structure.config.text_to_speech_driver ) else: raise ValueError("Audio Generation Engine is not set.") diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index 650d395c3..1242bc59b 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -56,7 +56,7 @@ def image_generation_engine(self) -> VariationImageGenerationEngine: if self._image_generation_engine is None: if self.structure is not None: self._image_generation_engine = VariationImageGenerationEngine( - image_generation_driver=self.structure.config.global_drivers.image_generation_driver + image_generation_driver=self.structure.config.image_generation_driver ) else: raise ValueError("Image Generation Engine is not set.") diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index 110a427da..549d93e53 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -21,7 +21,7 @@ class Chat: ) def default_output_fn(self, text: str) -> None: - if self.structure.config.global_drivers.prompt_driver.stream: + if self.structure.config.prompt_driver.stream: print(text, end="", flush=True) else: print(text) @@ -36,7 +36,7 @@ def start(self) -> None: self.output_fn(self.exiting_text) break - if self.structure.config.global_drivers.prompt_driver.stream: + if self.structure.config.prompt_driver.stream: self.output_fn(self.processing_text + "\n") stream = Stream(self.structure).run(question) first_chunk = next(stream) diff --git a/griptape/utils/prompt_stack.py b/griptape/utils/prompt_stack.py index f4dda1462..a5f336030 100644 --- a/griptape/utils/prompt_stack.py +++ b/griptape/utils/prompt_stack.py @@ -66,7 +66,7 @@ def add_conversation_memory(self, memory: BaseConversationMemory, index: Optiona if memory.autoprune and hasattr(memory, "structure"): should_prune = True - prompt_driver = memory.structure.config.global_drivers.prompt_driver + prompt_driver = memory.structure.config.prompt_driver temp_stack = PromptStack() # Try to determine how many Conversation Memory runs we can diff --git a/griptape/utils/stream.py b/griptape/utils/stream.py index a0251fa57..8cb2c3a7c 100644 --- a/griptape/utils/stream.py +++ b/griptape/utils/stream.py @@ -33,7 +33,7 @@ class Stream: @structure.validator # pyright: ignore def validate_structure(self, _, structure: Structure): - if structure and not structure.config.global_drivers.prompt_driver.stream: + if structure and not structure.config.prompt_driver.stream: raise ValueError("prompt driver does not have streaming enabled, enable with stream=True") _event_queue: Queue[BaseEvent] = field(default=Factory(lambda: Queue())) diff --git a/tests/mocks/mock_structure_config.py b/tests/mocks/mock_structure_config.py index 2ac901009..8309f541b 100644 --- a/tests/mocks/mock_structure_config.py +++ b/tests/mocks/mock_structure_config.py @@ -1,15 +1,5 @@ from attrs import define, field, Factory -from griptape.drivers import LocalVectorStoreDriver -from griptape.config import ( - BaseStructureConfig, - StructureGlobalDriversConfig, - StructureTaskMemoryConfig, - StructureTaskMemoryQueryEngineConfig, - StructureTaskMemoryExtractionEngineConfig, - StructureTaskMemorySummaryEngineConfig, - StructureTaskMemoryExtractionEngineJsonConfig, - StructureTaskMemoryExtractionEngineCsvConfig, -) +from griptape.config import StructureConfig from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_image_query_driver import MockImageQueryDriver from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -17,41 +7,16 @@ @define -class MockStructureConfig(BaseStructureConfig): - global_drivers: StructureGlobalDriversConfig = field( - default=Factory( - lambda: StructureGlobalDriversConfig( - prompt_driver=MockPromptDriver(), - image_generation_driver=MockImageGenerationDriver(model="dall-e-2"), - image_query_driver=MockImageQueryDriver(model="gpt-4-vision-preview"), - embedding_driver=MockEmbeddingDriver(model="text-embedding-3-small"), - ) - ), - kw_only=True, - metadata={"serializable": True}, +class MockStructureConfig(StructureConfig): + prompt_driver: MockPromptDriver = field( + default=Factory(lambda: MockPromptDriver()), metadata={"serializable": True} ) - task_memory: StructureTaskMemoryConfig = field( - default=Factory( - lambda: StructureTaskMemoryConfig( - query_engine=StructureTaskMemoryQueryEngineConfig( - prompt_driver=MockPromptDriver(model="gpt-3.5-turbo"), - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=MockEmbeddingDriver(model="text-embedding-3-small") - ), - ), - extraction_engine=StructureTaskMemoryExtractionEngineConfig( - csv=StructureTaskMemoryExtractionEngineCsvConfig( - prompt_driver=MockPromptDriver(model="gpt-3.5-turbo") - ), - json=StructureTaskMemoryExtractionEngineJsonConfig( - prompt_driver=MockPromptDriver(model="gpt-3.5-turbo") - ), - ), - summary_engine=StructureTaskMemorySummaryEngineConfig( - prompt_driver=MockPromptDriver(model="gpt-3.5-turbo") - ), - ) - ), - kw_only=True, - metadata={"serializable": True}, + image_generation_driver: MockImageGenerationDriver = field( + default=Factory(lambda: MockImageGenerationDriver(model="dall-e-2")), metadata={"serializable": True} + ) + image_query_driver: MockImageQueryDriver = field( + default=Factory(lambda: MockImageQueryDriver(model="gpt-4-vision-preview")), metadata={"serializable": True} + ) + embedding_driver: MockEmbeddingDriver = field( + default=Factory(lambda: MockEmbeddingDriver(model="text-embedding-3-small")), metadata={"serializable": True} ) diff --git a/tests/unit/config/test_amazon_bedrock_structure_config.py b/tests/unit/config/test_amazon_bedrock_structure_config.py index 05eda5644..66ca44bb5 100644 --- a/tests/unit/config/test_amazon_bedrock_structure_config.py +++ b/tests/unit/config/test_amazon_bedrock_structure_config.py @@ -14,115 +14,44 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { - "global_drivers": { - "conversation_memory_driver": None, + "conversation_memory_driver": None, + "embedding_driver": {"model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver"}, + "image_generation_driver": { + "image_generation_model_driver": { + "cfg_scale": 7, + "outpainting_mode": "PRECISE", + "quality": "standard", + "type": "BedrockTitanImageGenerationModelDriver", + }, + "image_height": 512, + "image_width": 512, + "model": "amazon.titan-image-generator-v1", + "seed": None, + "type": "AmazonBedrockImageGenerationDriver", + }, + "image_query_driver": { + "type": "AmazonBedrockImageQueryDriver", + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "max_tokens": 256, + "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, + }, + "prompt_driver": { + "max_tokens": None, + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + "prompt_model_driver": {"type": "BedrockClaudePromptModelDriver", "top_k": 250, "top_p": 0.999}, + "stream": False, + "temperature": 0.1, + "type": "AmazonBedrockPromptDriver", + }, + "vector_store_driver": { "embedding_driver": { "model": "amazon.titan-embed-text-v1", "type": "AmazonBedrockTitanEmbeddingDriver", }, - "image_generation_driver": { - "image_generation_model_driver": { - "cfg_scale": 7, - "outpainting_mode": "PRECISE", - "quality": "standard", - "type": "BedrockTitanImageGenerationModelDriver", - }, - "image_height": 512, - "image_width": 512, - "model": "amazon.titan-image-generator-v1", - "seed": None, - "type": "AmazonBedrockImageGenerationDriver", - }, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "image_query_driver": { - "type": "AmazonBedrockImageQueryDriver", - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "max_tokens": 256, - "image_query_model_driver": {"type": "BedrockClaudeImageQueryModelDriver"}, - }, - "prompt_driver": { - "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": {"type": "BedrockClaudePromptModelDriver", "top_k": 250, "top_p": 0.999}, - "stream": False, - "temperature": 0.1, - "type": "AmazonBedrockPromptDriver", - }, - "type": "StructureGlobalDriversConfig", - "vector_store_driver": { - "embedding_driver": { - "model": "amazon.titan-embed-text-v1", - "type": "AmazonBedrockTitanEmbeddingDriver", - }, - "type": "LocalVectorStoreDriver", - }, + "type": "LocalVectorStoreDriver", }, "type": "AmazonBedrockStructureConfig", - "task_memory": { - "type": "StructureTaskMemoryConfig", - "query_engine": { - "type": "StructureTaskMemoryQueryEngineConfig", - "prompt_driver": { - "type": "AmazonBedrockPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": {"type": "BedrockClaudePromptModelDriver", "top_k": 250, "top_p": 0.999}, - "stream": False, - }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "AmazonBedrockTitanEmbeddingDriver", - "model": "amazon.titan-embed-text-v1", - }, - }, - }, - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "AmazonBedrockPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": { - "type": "BedrockClaudePromptModelDriver", - "top_k": 250, - "top_p": 0.999, - }, - "stream": False, - }, - }, - "json": { - "type": "StructureTaskMemoryExtractionEngineJsonConfig", - "prompt_driver": { - "type": "AmazonBedrockPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": { - "type": "BedrockClaudePromptModelDriver", - "top_k": 250, - "top_p": 0.999, - }, - "stream": False, - }, - }, - }, - "summary_engine": { - "type": "StructureTaskMemorySummaryEngineConfig", - "prompt_driver": { - "type": "AmazonBedrockPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "model": "anthropic.claude-3-sonnet-20240229-v1:0", - "prompt_model_driver": {"type": "BedrockClaudePromptModelDriver", "top_k": 250, "top_p": 0.999}, - "stream": False, - }, - }, - }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, } def test_from_dict(self, config): diff --git a/tests/unit/config/test_anthropic_structure_config.py b/tests/unit/config/test_anthropic_structure_config.py index b637eb929..9f014092a 100644 --- a/tests/unit/config/test_anthropic_structure_config.py +++ b/tests/unit/config/test_anthropic_structure_config.py @@ -15,101 +15,36 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "AnthropicStructureConfig", - "global_drivers": { - "type": "StructureGlobalDriversConfig", - "prompt_driver": { - "type": "AnthropicPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "claude-3-opus-20240229", - "top_p": 0.999, - "top_k": 250, - }, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "image_query_driver": { - "type": "AnthropicImageQueryDriver", - "model": "claude-3-opus-20240229", - "max_tokens": 256, - }, + "prompt_driver": { + "type": "AnthropicPromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "model": "claude-3-opus-20240229", + "top_p": 0.999, + "top_k": 250, + }, + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": { + "type": "AnthropicImageQueryDriver", + "model": "claude-3-opus-20240229", + "max_tokens": 256, + }, + "embedding_driver": { + "type": "VoyageAiEmbeddingDriver", + "model": "voyage-large-2", + "input_type": "document", + }, + "vector_store_driver": { + "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "VoyageAiEmbeddingDriver", "model": "voyage-large-2", "input_type": "document", }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "VoyageAiEmbeddingDriver", - "model": "voyage-large-2", - "input_type": "document", - }, - }, - "conversation_memory_driver": None, - }, - "task_memory": { - "type": "StructureTaskMemoryConfig", - "query_engine": { - "type": "StructureTaskMemoryQueryEngineConfig", - "prompt_driver": { - "type": "AnthropicPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "claude-3-opus-20240229", - "top_p": 0.999, - "top_k": 250, - }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "VoyageAiEmbeddingDriver", - "model": "voyage-large-2", - "input_type": "document", - }, - }, - }, - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "AnthropicPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "claude-3-opus-20240229", - "top_p": 0.999, - "top_k": 250, - }, - }, - "json": { - "type": "StructureTaskMemoryExtractionEngineJsonConfig", - "prompt_driver": { - "type": "AnthropicPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "claude-3-opus-20240229", - "top_p": 0.999, - "top_k": 250, - }, - }, - }, - "summary_engine": { - "type": "StructureTaskMemorySummaryEngineConfig", - "prompt_driver": { - "type": "AnthropicPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "claude-3-opus-20240229", - "top_p": 0.999, - "top_k": 250, - }, - }, }, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, } def test_from_dict(self, config): diff --git a/tests/unit/config/test_google_structure_config.py b/tests/unit/config/test_google_structure_config.py index 2a4d50641..f089b611b 100644 --- a/tests/unit/config/test_google_structure_config.py +++ b/tests/unit/config/test_google_structure_config.py @@ -14,100 +14,34 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "GoogleStructureConfig", - "global_drivers": { - "type": "StructureGlobalDriversConfig", - "prompt_driver": { - "type": "GooglePromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "gemini-pro", - "top_p": None, - "top_k": None, - }, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, + "prompt_driver": { + "type": "GooglePromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "model": "gemini-pro", + "top_p": None, + "top_k": None, + }, + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "embedding_driver": { + "type": "GoogleEmbeddingDriver", + "model": "models/embedding-001", + "task_type": "retrieval_document", + "title": None, + }, + "vector_store_driver": { + "type": "LocalVectorStoreDriver", "embedding_driver": { "type": "GoogleEmbeddingDriver", "model": "models/embedding-001", "task_type": "retrieval_document", "title": None, }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "GoogleEmbeddingDriver", - "model": "models/embedding-001", - "task_type": "retrieval_document", - "title": None, - }, - }, - "conversation_memory_driver": None, - }, - "task_memory": { - "type": "StructureTaskMemoryConfig", - "query_engine": { - "type": "StructureTaskMemoryQueryEngineConfig", - "prompt_driver": { - "type": "GooglePromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "gemini-pro", - "top_p": None, - "top_k": None, - }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "GoogleEmbeddingDriver", - "model": "models/embedding-001", - "task_type": "retrieval_document", - "title": None, - }, - }, - }, - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "GooglePromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "gemini-pro", - "top_p": None, - "top_k": None, - }, - }, - "json": { - "type": "StructureTaskMemoryExtractionEngineJsonConfig", - "prompt_driver": { - "type": "GooglePromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "gemini-pro", - "top_p": None, - "top_k": None, - }, - }, - }, - "summary_engine": { - "type": "StructureTaskMemorySummaryEngineConfig", - "prompt_driver": { - "type": "GooglePromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "model": "gemini-pro", - "top_p": None, - "top_k": None, - }, - }, }, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, } def test_from_dict(self, config): diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index 4a0ab7369..bd8db27cd 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -14,132 +14,54 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "OpenAiStructureConfig", - "global_drivers": { - "type": "StructureGlobalDriversConfig", - "prompt_driver": { - "type": "OpenAiChatPromptDriver", - "base_url": None, - "model": "gpt-4o", - "organization": None, - "response_format": None, - "seed": None, - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "user": "", - }, - "conversation_memory_driver": None, + "prompt_driver": { + "type": "OpenAiChatPromptDriver", + "base_url": None, + "model": "gpt-4o", + "organization": None, + "response_format": None, + "seed": None, + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "user": "", + }, + "conversation_memory_driver": None, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "embedding_driver": { + "base_url": None, + "model": "text-embedding-3-small", + "organization": None, + "type": "OpenAiEmbeddingDriver", + }, + "image_generation_driver": { + "api_version": None, + "base_url": None, + "image_size": "512x512", + "model": "dall-e-2", + "organization": None, + "quality": "standard", + "response_format": "b64_json", + "style": None, + "type": "OpenAiImageGenerationDriver", + }, + "image_query_driver": { + "api_version": None, + "base_url": None, + "image_quality": "auto", + "max_tokens": 256, + "model": "gpt-4-vision-preview", + "organization": None, + "type": "OpenAiVisionImageQueryDriver", + }, + "vector_store_driver": { "embedding_driver": { "base_url": None, "model": "text-embedding-3-small", "organization": None, "type": "OpenAiEmbeddingDriver", }, - "image_generation_driver": { - "api_version": None, - "base_url": None, - "image_size": "512x512", - "model": "dall-e-2", - "organization": None, - "quality": "standard", - "response_format": "b64_json", - "style": None, - "type": "OpenAiImageGenerationDriver", - }, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "image_query_driver": { - "api_version": None, - "base_url": None, - "image_quality": "auto", - "max_tokens": 256, - "model": "gpt-4-vision-preview", - "organization": None, - "type": "OpenAiVisionImageQueryDriver", - }, - "vector_store_driver": { - "embedding_driver": { - "base_url": None, - "model": "text-embedding-3-small", - "organization": None, - "type": "OpenAiEmbeddingDriver", - }, - "type": "LocalVectorStoreDriver", - }, - }, - "task_memory": { - "type": "StructureTaskMemoryConfig", - "query_engine": { - "type": "StructureTaskMemoryQueryEngineConfig", - "prompt_driver": { - "base_url": None, - "type": "OpenAiChatPromptDriver", - "model": "gpt-4o", - "organization": None, - "response_format": None, - "seed": None, - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "user": "", - }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": { - "type": "OpenAiEmbeddingDriver", - "base_url": None, - "organization": None, - "model": "text-embedding-3-small", - }, - }, - }, - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "OpenAiChatPromptDriver", - "base_url": None, - "model": "gpt-4o", - "organization": None, - "response_format": None, - "seed": None, - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "user": "", - }, - }, - "json": { - "type": "StructureTaskMemoryExtractionEngineJsonConfig", - "prompt_driver": { - "type": "OpenAiChatPromptDriver", - "base_url": None, - "model": "gpt-4o", - "organization": None, - "response_format": None, - "seed": None, - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "user": "", - }, - }, - }, - "summary_engine": { - "type": "StructureTaskMemorySummaryEngineConfig", - "prompt_driver": { - "type": "OpenAiChatPromptDriver", - "base_url": None, - "model": "gpt-4o", - "organization": None, - "response_format": None, - "seed": None, - "temperature": 0.1, - "max_tokens": None, - "stream": False, - "user": "", - }, - }, + "type": "LocalVectorStoreDriver", }, } diff --git a/tests/unit/config/test_structure_config.py b/tests/unit/config/test_structure_config.py index 16f189b02..9e1b00038 100644 --- a/tests/unit/config/test_structure_config.py +++ b/tests/unit/config/test_structure_config.py @@ -10,65 +10,16 @@ def config(self): def test_to_dict(self, config): assert config.to_dict() == { "type": "StructureConfig", - "global_drivers": { - "type": "StructureGlobalDriversConfig", - "prompt_driver": {"type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False}, - "conversation_memory_driver": None, + "prompt_driver": {"type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False}, + "conversation_memory_driver": None, + "embedding_driver": {"type": "DummyEmbeddingDriver"}, + "image_generation_driver": {"type": "DummyImageGenerationDriver"}, + "image_query_driver": {"type": "DummyImageQueryDriver"}, + "vector_store_driver": { "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "image_generation_driver": {"type": "DummyImageGenerationDriver"}, - "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, - "image_query_driver": {"type": "DummyImageQueryDriver"}, - "vector_store_driver": { - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - "type": "DummyVectorStoreDriver", - }, - }, - "task_memory": { - "type": "StructureTaskMemoryConfig", - "query_engine": { - "type": "StructureTaskMemoryQueryEngineConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "stream": False, - "temperature": 0.1, - "max_tokens": None, - }, - "vector_store_driver": { - "type": "LocalVectorStoreDriver", - "embedding_driver": {"type": "DummyEmbeddingDriver"}, - }, - }, - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - }, - }, - "json": { - "type": "StructureTaskMemoryExtractionEngineJsonConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - }, - }, - }, - "summary_engine": { - "type": "StructureTaskMemorySummaryEngineConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - }, - }, + "type": "DummyVectorStoreDriver", }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, } def test_from_dict(self, config): @@ -79,19 +30,11 @@ def test_unchanged_merge_config(self, config): config.merge_config( { "type": "StructureConfig", - "task_memory": { - "extraction_engine": { - "type": "StructureTaskMemoryExtractionEngineConfig", - "csv": { - "type": "StructureTaskMemoryExtractionEngineCsvConfig", - "prompt_driver": { - "type": "DummyPromptDriver", - "temperature": 0.1, - "max_tokens": None, - "stream": False, - }, - }, - } + "prompt_driver": { + "type": "DummyPromptDriver", + "temperature": 0.1, + "max_tokens": None, + "stream": False, }, } ).to_dict() @@ -100,12 +43,12 @@ def test_unchanged_merge_config(self, config): def test_changed_merge_config(self, config): config = config.merge_config( - {"task_memory": {"extraction_engine": {"csv": {"prompt_driver": {"stream": True}}}}} + {"prompt_driver": {"type": "DummyPromptDriver", "temperature": 0.1, "max_tokens": None, "stream": False}} ) - assert config.task_memory.extraction_engine.csv.prompt_driver.stream is True + assert config.prompt_driver.temperature == 0.1 def test_dot_update(self, config): - config.task_memory.extraction_engine.csv.prompt_driver.stream = True + config.prompt_driver.max_tokens = 10 - assert config.task_memory.extraction_engine.csv.prompt_driver.stream is True + assert config.prompt_driver.max_tokens == 10 diff --git a/tests/unit/tasks/test_json_extraction_task.py b/tests/unit/tasks/test_json_extraction_task.py index 1ffa24ecd..0366652b0 100644 --- a/tests/unit/tasks/test_json_extraction_task.py +++ b/tests/unit/tasks/test_json_extraction_task.py @@ -14,10 +14,8 @@ def task(self): def test_run(self, task): mock_config = MockStructureConfig() - assert isinstance(mock_config.global_drivers.prompt_driver, MockPromptDriver) - mock_config.global_drivers.prompt_driver.mock_output = ( - '[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' - ) + assert isinstance(mock_config.prompt_driver, MockPromptDriver) + mock_config.prompt_driver.mock_output = '[{"test_key_1": "test_value_1"}, {"test_key_2": "test_value_2"}]' agent = Agent(config=mock_config) agent.add_task(task) diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index e9972660f..abd8f0e0a 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -62,6 +62,9 @@ class TesterPromptDriverOption: "OPENAI_CHAT_4": TesterPromptDriverOption( prompt_driver=OpenAiChatPromptDriver(model="gpt-4", api_key=os.environ["OPENAI_API_KEY"]), enabled=True ), + "OPENAI_CHAT_4o": TesterPromptDriverOption( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4o", api_key=os.environ["OPENAI_API_KEY"]), enabled=True + ), "OPENAI_CHAT_4_1106_PREVIEW": TesterPromptDriverOption( prompt_driver=OpenAiChatPromptDriver(model="gpt-4-1106-preview", api_key=os.environ["OPENAI_API_KEY"]), enabled=True, @@ -275,7 +278,7 @@ def verify_structure_output(self, structure) -> dict: ], prompt_driver=AzureOpenAiChatPromptDriver( api_key=os.environ["AZURE_OPENAI_API_KEY_1"], - model="gpt-4", + model="gpt-4o", azure_deployment=os.environ["AZURE_OPENAI_4_DEPLOYMENT_ID"], azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_1"], response_format="json_object", From 7ed3b9011f0e3e38255df1088ac791e5ec56633d Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 20 May 2024 15:05:35 -0700 Subject: [PATCH 051/238] Add codecov (#794) --- .github/workflows/code-checks.yml | 26 +++++++++++++++++++++++--- README.md | 1 + poetry.lock | 12 ++++++------ pyproject.toml | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/.github/workflows/code-checks.yml b/.github/workflows/code-checks.yml index 19b65bce9..16c9b58b4 100644 --- a/.github/workflows/code-checks.yml +++ b/.github/workflows/code-checks.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9"] + python-version: ["3.12"] steps: - name: Checkout actions uses: actions/checkout@v3 @@ -25,7 +25,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ "3.9" ] + python-version: [ "3.12" ] steps: - name: Checkout actions uses: actions/checkout@v3 @@ -38,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ "3.9" ] + python-version: [ "3.12" ] steps: - name: Checkout actions uses: actions/checkout@v3 @@ -46,3 +46,23 @@ jobs: uses: ./.github/actions/init-environment - name: Run linter run: poetry run ruff check griptape/ + coverage: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12"] + steps: + - name: Checkout actions + uses: actions/checkout@v3 + - name: Init environment + uses: ./.github/actions/init-environment + - name: Run unit tests + run: pytest -n auto --cov=griptape tests/unit + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + flags: smart-tests + verbose: true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index aed7cdaac..405f729e3 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![Docs](https://readthedocs.org/projects/griptape/badge/)](https://griptape.readthedocs.io/) [![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) +[![codecov](https://codecov.io/github/griptape-ai/griptape/graph/badge.svg?token=HUBqUpl3NB)](https://codecov.io/github/griptape-ai/griptape) [![Griptape Discord](https://dcbadge.vercel.app/api/server/gnWRz88eym?compact=true&style=flat)](https://discord.gg/gnWRz88eym) Griptape is a modular Python framework for building AI-powered applications that securely connect to your enterprise data and APIs. It offers developers the ability to maintain control and flexibility at every step. diff --git a/poetry.lock b/poetry.lock index b46742b6c..02da58de3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3872,13 +3872,13 @@ rich = ">=8.0.0" [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -3886,7 +3886,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-env" @@ -5707,4 +5707,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d6bedf8297bbcd3c597bf93c4fb25e57192a8195941d0ad462bbacb9835c8607" +content-hash = "7e866d7a5968b9e5a5c166be3cf667488d00d03d412deabe29090a9f6d1ab83d" diff --git a/pyproject.toml b/pyproject.toml index e60ec709a..9206f23c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -142,7 +142,7 @@ mongomock = "*" twine = ">=4" moto = {extras = ["dynamodb", "iotdata", "sqs"], version = "^4.2.13"} pytest-xdist = "^3.3.1" -pytest-cov = "^4.1.0" +pytest-cov = "^5.0.0" pytest-env = "^1.1.1" fuzzywuzzy = "^0.18.0" pytest-clarity = "^1.0.1" From 540e8f321d5b43663085b021b912e41711872a6d Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 20 May 2024 18:13:03 -0500 Subject: [PATCH 052/238] Add `AzureOpenAiStructureConfig`, default `azure_deployment` (#788) --- .github/workflows/docs-integration-tests.yml | 2 + CHANGELOG.md | 8 ++ docs/examples/multiple-agent-shared-memory.md | 33 +++--- .../drivers/image-query-drivers.md | 33 +++++- docs/griptape-framework/structures/config.md | 28 ++++- griptape/config/__init__.py | 2 + .../config/azure_openai_structure_config.py | 102 ++++++++++++++++++ griptape/drivers/__init__.py | 2 + .../azure_openai_embedding_driver.py | 6 +- .../azure_openai_image_generation_driver.py | 8 +- .../azure_openai_vision_image_query_driver.py | 45 ++++++++ .../prompt/azure_openai_chat_prompt_driver.py | 8 +- .../azure_openai_completion_prompt_driver.py | 8 +- .../test_azure_openai_structure_config.py | 97 +++++++++++++++++ .../test_azure_openai_embedding_driver.py | 1 + ...st_azure_openai_image_generation_driver.py | 12 +-- .../test_azure_openai_image_query_driver.py | 70 ++++++++++++ .../test_azure_openai_chat_prompt_driver.py | 1 + ...t_azure_openai_completion_prompt_driver.py | 4 + 19 files changed, 432 insertions(+), 38 deletions(-) create mode 100644 griptape/config/azure_openai_structure_config.py create mode 100644 griptape/drivers/image_query/azure_openai_vision_image_query_driver.py create mode 100644 tests/unit/config/test_azure_openai_structure_config.py create mode 100644 tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 14051de7f..cb4add5ae 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -75,6 +75,8 @@ jobs: AZURE_OPENAI_API_KEY_1: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_1 }} AZURE_OPENAI_ENDPOINT_2: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_2 }} AZURE_OPENAI_API_KEY_2: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_2 }} + AZURE_OPENAI_ENDPOINT_3: ${{ secrets.INTEG_AZURE_OPENAI_ENDPOINT_3 }} + AZURE_OPENAI_API_KEY_3: ${{ secrets.INTEG_AZURE_OPENAI_API_KEY_3 }} AZURE_OPENAI_35_TURBO_16K_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_35_TURBO_16K_DEPLOYMENT_ID }} AZURE_OPENAI_DAVINCI_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_DAVINCI_DEPLOYMENT_ID }} AZURE_OPENAI_4_DEPLOYMENT_ID: ${{ secrets.INTEG_OPENAI_4_DEPLOYMENT_ID }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 519708d18..aaa95e7a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added +- `AzureOpenAiStructureConfig` for providing Structures with all Azure OpenAI Driver configuration. +- `AzureOpenAiVisionImageQueryDriver` to support queries on images using Azure's OpenAI Vision models. + +### Changed +- Default the value of `azure_deployment` on all Azure Drivers to the model the Driver is using. +- Field `azure_ad_token` on all Azure Drivers is no longer serializable. + ## [0.25.1] - 2024-05-15 ### Fixed diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index ac69abcd4..7332de165 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -10,12 +10,12 @@ The `MongoDbAtlasVectorStoreDriver` assumes that you have a vector index configu import os from griptape.tools import WebScraper, VectorStoreClient, TaskMemoryClient from griptape.structures import Agent -from griptape.drivers import AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, AzureMongoDbVectorStoreDriver +from griptape.drivers import AzureOpenAiEmbeddingDriver, AzureMongoDbVectorStoreDriver from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine from griptape.memory import TaskMemory from griptape.artifacts import TextArtifact from griptape.memory.task.storage import TextArtifactStorage -from griptape.config import StructureConfig +from griptape.config import AzureOpenAiStructureConfig AZURE_OPENAI_ENDPOINT_1 = os.environ["AZURE_OPENAI_ENDPOINT_1"] @@ -31,38 +31,32 @@ MONGODB_VECTOR_PATH = os.environ["MONGODB_VECTOR_PATH"] MONGODB_CONNECTION_STRING = f"mongodb+srv://{MONGODB_USERNAME}:{MONGODB_PASSWORD}@{MONGODB_HOST}/{MONGODB_DATABASE_NAME}?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000" -azure_embedding_driver = AzureOpenAiEmbeddingDriver( +embedding_driver = AzureOpenAiEmbeddingDriver( model='text-embedding-ada-002', azure_endpoint=AZURE_OPENAI_ENDPOINT_1, api_key=AZURE_OPENAI_API_KEY_1, - azure_deployment='text-embedding-ada-002' -) - -azure_prompt_driver = AzureOpenAiChatPromptDriver( - model='gpt-4', - azure_endpoint=AZURE_OPENAI_ENDPOINT_1, - api_key=AZURE_OPENAI_API_KEY_1, - azure_deployment='gpt-4' ) mongo_driver = AzureMongoDbVectorStoreDriver( connection_string=MONGODB_CONNECTION_STRING, database_name=MONGODB_DATABASE_NAME, collection_name=MONGODB_COLLECTION_NAME, - embedding_driver=azure_embedding_driver, + embedding_driver=embedding_driver, index_name=MONGODB_INDEX_NAME, - vector_path=MONGODB_VECTOR_PATH + vector_path=MONGODB_VECTOR_PATH, +) + +config = AzureOpenAiStructureConfig( + azure_endpoint=AZURE_OPENAI_ENDPOINT_1, + vector_store_driver=mongo_driver, + embedding_driver=embedding_driver, ) loader = Agent( tools=[ - WebScraper() + WebScraper(), ], - config=StructureConfig( - prompt_driver=azure_prompt_driver, - vector_store_driver=mongo_driver, - embedding_driver=azure_embedding_driver - ), + config=config, ) asker = Agent( tools=[ @@ -70,6 +64,7 @@ asker = Agent( ], meta_memory=loader.meta_memory, task_memory=loader.task_memory, + config=config, ) if __name__ == "__main__": diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index f643b09eb..7538496b1 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -62,7 +62,7 @@ print(result) ## OpenAiVisionImageQueryDriver !!! info - This Driver defaults to using the `gpt-4-vision-preview` model. As other multimodal models are released, they can be specified using the `model` field. While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. + While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. The [OpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/openai_vision_image_query_driver.md) is used to query images using the OpenAI Vision API. Here is an example of how to use it: @@ -86,6 +86,37 @@ with open("tests/resources/mountain.png", "rb") as f: engine.run("Describe the weather in the image", [image_artifact]) ``` +## AzureOpenAiVisionImageQueryDriver + +!!! info + In order to use the `gpt-4-vision-preview` model on Azure OpenAI, the `gpt-4` model must be deployed with the version set to `vision-preview`. More information can be found in the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision). + +The [AzureOpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/azure_openai_vision_image_query_driver.md) is used to query images using the Azure OpenAI Vision API. Here is an example of how to use it: + +```python +import os +from griptape.drivers import AzureOpenAiVisionImageQueryDriver +from griptape.engines import ImageQueryEngine +from griptape.loaders import ImageLoader + +driver = AzureOpenAiVisionImageQueryDriver( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], + api_key=os.environ["AZURE_OPENAI_API_KEY_3"], + model="gpt-4", + azure_deployment="gpt-4-vision-preview", + max_tokens=256, +) + +engine = ImageQueryEngine( + image_query_driver=driver, +) + +with open("tests/resources/mountain.png", "rb") as f: + image_artifact = ImageLoader().load(f.read()) + +engine.run("Describe the weather in the image", [image_artifact]) +``` + ## AmazonBedrockImageQueryDriver The [Amazon Bedrock Image Query Driver](../../reference/griptape/drivers/image_query/amazon_bedrock_image_query_driver.md) provides multi-model access to image query models hosted by Amazon Bedrock. This Driver manages API calls to the Bedrock API, while the specific Model Drivers below format the API requests and parse the responses. diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 817dfb7fe..374468639 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -22,6 +22,28 @@ agent = Agent( agent = Agent() # This is equivalent to the above ``` +#### Azure OpenAI + +The [Azure OpenAI Structure Config](../../reference/griptape/config/azure_openai_structure_config.md) provides default Drivers for Azure's OpenAI APIs. + + +```python +import os +from griptape.structures import Agent +from griptape.config import AzureOpenAiStructureConfig + +agent = Agent( + config=AzureOpenAiStructureConfig( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], + api_key=os.environ["AZURE_OPENAI_API_KEY_3"] + ).merge_config({ + "image_query_driver": { + "azure_deployment": "gpt-4-vision-preview", + }, + }), +) +``` + #### Amazon Bedrock The [Amazon Bedrock Structure Config](../../reference/griptape/config/amazon_bedrock_structure_config.md) provides default Drivers for Amazon Bedrock's APIs. @@ -112,7 +134,11 @@ serialized_config = custom_config.to_json() deserialized_config = AmazonBedrockStructureConfig.from_json(serialized_config) agent = Agent( - config=deserialized_config, + config=deserialized_config.merge_config({ + "prompt_driver" : { + "model": "anthropic.claude-3-sonnet-20240229-v1:0", + }, + }), ) ``` diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py index 849556017..7783b3886 100644 --- a/griptape/config/__init__.py +++ b/griptape/config/__init__.py @@ -4,6 +4,7 @@ from .structure_config import StructureConfig from .openai_structure_config import OpenAiStructureConfig +from .azure_openai_structure_config import AzureOpenAiStructureConfig from .amazon_bedrock_structure_config import AmazonBedrockStructureConfig from .anthropic_structure_config import AnthropicStructureConfig from .google_structure_config import GoogleStructureConfig @@ -14,6 +15,7 @@ "BaseStructureConfig", "StructureConfig", "OpenAiStructureConfig", + "AzureOpenAiStructureConfig", "AmazonBedrockStructureConfig", "AnthropicStructureConfig", "GoogleStructureConfig", diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_structure_config.py new file mode 100644 index 000000000..8c7ce82d3 --- /dev/null +++ b/griptape/config/azure_openai_structure_config.py @@ -0,0 +1,102 @@ +from typing import Callable, Optional +from attrs import Factory, define, field + +from griptape.config import StructureConfig +from griptape.drivers import ( + LocalVectorStoreDriver, + AzureOpenAiChatPromptDriver, + AzureOpenAiEmbeddingDriver, + AzureOpenAiImageGenerationDriver, + AzureOpenAiVisionImageQueryDriver, + BasePromptDriver, + BaseEmbeddingDriver, + BaseImageGenerationDriver, + BaseImageQueryDriver, + BaseVectorStoreDriver, +) + + +@define +class AzureOpenAiStructureConfig(StructureConfig): + """Azure OpenAI Structure Configuration. + + Attributes: + azure_endpoint: The endpoint for the Azure OpenAI instance. + azure_ad_token: An optional Azure Active Directory token. + azure_ad_token_provider: An optional Azure Active Directory token provider. + api_key: An optional Azure API key. + prompt_driver: An Azure OpenAI Chat Prompt Driver. + image_generation_driver: An Azure OpenAI Image Generation Driver. + image_query_driver: An Azure OpenAI Vision Image Query Driver. + embedding_driver: An Azure OpenAI Embedding Driver. + vector_store_driver: A Local Vector Store Driver. + """ + + azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) + api_key: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) + prompt_driver: BasePromptDriver = field( + default=Factory( + lambda self: AzureOpenAiChatPromptDriver( + model="gpt-4", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ), + takes_self=True, + ), + metadata={"serializable": True}, + kw_only=True, + ) + image_generation_driver: BaseImageGenerationDriver = field( + default=Factory( + lambda self: AzureOpenAiImageGenerationDriver( + model="dall-e-2", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + image_size="512x512", + ), + takes_self=True, + ), + metadata={"serializable": True}, + kw_only=True, + ) + image_query_driver: BaseImageQueryDriver = field( + default=Factory( + lambda self: AzureOpenAiVisionImageQueryDriver( + model="gpt-4", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ), + takes_self=True, + ), + metadata={"serializable": True}, + kw_only=True, + ) + embedding_driver: BaseEmbeddingDriver = field( + default=Factory( + lambda self: AzureOpenAiEmbeddingDriver( + model="text-embedding-3-small", + azure_endpoint=self.azure_endpoint, + api_key=self.api_key, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ), + takes_self=True, + ), + metadata={"serializable": True}, + kw_only=True, + ) + vector_store_driver: BaseVectorStoreDriver = field( + default=Factory(lambda self: LocalVectorStoreDriver(embedding_driver=self.embedding_driver), takes_self=True), + metadata={"serializable": True}, + kw_only=True, + ) diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 7941ed61e..1d76ba30d 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -81,6 +81,7 @@ from .image_query.dummy_image_query_driver import DummyImageQueryDriver from .image_query.openai_vision_image_query_driver import OpenAiVisionImageQueryDriver from .image_query.anthropic_image_query_driver import AnthropicImageQueryDriver +from .image_query.azure_openai_vision_image_query_driver import AzureOpenAiVisionImageQueryDriver from .image_query.amazon_bedrock_image_query_driver import AmazonBedrockImageQueryDriver from .web_scraper.base_web_scraper_driver import BaseWebScraperDriver @@ -175,6 +176,7 @@ "BedrockClaudeImageQueryModelDriver", "BaseImageQueryDriver", "OpenAiVisionImageQueryDriver", + "AzureOpenAiVisionImageQueryDriver", "DummyImageQueryDriver", "AnthropicImageQueryDriver", "BaseMultiModelImageQueryDriver", diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index 3cf473c06..f2c3b8d39 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -11,7 +11,7 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): """ Attributes: - azure_deployment: An Azure OpenAi deployment id. + azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. azure_ad_token: An optional Azure Active Directory token. azure_ad_token_provider: An optional Azure Active Directory token provider. @@ -20,7 +20,9 @@ class AzureOpenAiEmbeddingDriver(OpenAiEmbeddingDriver): client: An `openai.AzureOpenAI` client. """ - azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) + azure_deployment: str = field( + kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index d037656ca..f6cbbe1a9 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -12,7 +12,7 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): """Driver for Azure-hosted OpenAI image generation API. Attributes: - azure_deployment: An Azure OpenAi deployment id. + azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. azure_ad_token: An optional Azure Active Directory token. azure_ad_token_provider: An optional Azure Active Directory token provider. @@ -20,9 +20,11 @@ class AzureOpenAiImageGenerationDriver(OpenAiImageGenerationDriver): client: An `openai.AzureOpenAI` client. """ - azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) + azure_deployment: str = field( + kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) - azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( kw_only=True, default=None, metadata={"serializable": False} ) diff --git a/griptape/drivers/image_query/azure_openai_vision_image_query_driver.py b/griptape/drivers/image_query/azure_openai_vision_image_query_driver.py new file mode 100644 index 000000000..06b329c03 --- /dev/null +++ b/griptape/drivers/image_query/azure_openai_vision_image_query_driver.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from typing import Callable, Optional + +from attr import define, field, Factory +import openai +from griptape.drivers.image_query.openai_vision_image_query_driver import OpenAiVisionImageQueryDriver + + +@define +class AzureOpenAiVisionImageQueryDriver(OpenAiVisionImageQueryDriver): + """Driver for Azure-hosted OpenAI image query API. + + Attributes: + azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. + azure_endpoint: An Azure OpenAi endpoint. + azure_ad_token: An optional Azure Active Directory token. + azure_ad_token_provider: An optional Azure Active Directory token provider. + api_version: An Azure OpenAi API version. + client: An `openai.AzureOpenAI` client. + """ + + azure_deployment: str = field( + kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + ) + azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) + azure_ad_token_provider: Optional[Callable[[], str]] = field( + kw_only=True, default=None, metadata={"serializable": False} + ) + api_version: str = field(default="2024-02-01", kw_only=True, metadata={"serializable": True}) + client: openai.AzureOpenAI = field( + default=Factory( + lambda self: openai.AzureOpenAI( + organization=self.organization, + api_key=self.api_key, + api_version=self.api_version, + azure_endpoint=self.azure_endpoint, + azure_deployment=self.azure_deployment, + azure_ad_token=self.azure_ad_token, + azure_ad_token_provider=self.azure_ad_token_provider, + ), + takes_self=True, + ) + ) diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 9824c31a0..0583369c4 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -9,7 +9,7 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): """ Attributes: - azure_deployment: An Azure OpenAi deployment id. + azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. azure_ad_token: An optional Azure Active Directory token. azure_ad_token_provider: An optional Azure Active Directory token provider. @@ -17,9 +17,11 @@ class AzureOpenAiChatPromptDriver(OpenAiChatPromptDriver): client: An `openai.AzureOpenAI` client. """ - azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) + azure_deployment: str = field( + kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) - azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( kw_only=True, default=None, metadata={"serializable": False} ) diff --git a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py index 805b45519..89f2651ef 100644 --- a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py @@ -8,7 +8,7 @@ class AzureOpenAiCompletionPromptDriver(OpenAiCompletionPromptDriver): """ Attributes: - azure_deployment: An Azure OpenAi deployment id. + azure_deployment: An optional Azure OpenAi deployment id. Defaults to the model name. azure_endpoint: An Azure OpenAi endpoint. azure_ad_token: An optional Azure Active Directory token. azure_ad_token_provider: An optional Azure Active Directory token provider. @@ -16,9 +16,11 @@ class AzureOpenAiCompletionPromptDriver(OpenAiCompletionPromptDriver): client: An `openai.AzureOpenAI` client. """ - azure_deployment: str = field(kw_only=True, metadata={"serializable": True}) + azure_deployment: str = field( + kw_only=True, default=Factory(lambda self: self.model, takes_self=True), metadata={"serializable": True} + ) azure_endpoint: str = field(kw_only=True, metadata={"serializable": True}) - azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) + azure_ad_token: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": False}) azure_ad_token_provider: Optional[Callable[[], str]] = field( kw_only=True, default=None, metadata={"serializable": False} ) diff --git a/tests/unit/config/test_azure_openai_structure_config.py b/tests/unit/config/test_azure_openai_structure_config.py new file mode 100644 index 000000000..acec4526a --- /dev/null +++ b/tests/unit/config/test_azure_openai_structure_config.py @@ -0,0 +1,97 @@ +from pytest import fixture +from griptape.config import AzureOpenAiStructureConfig + + +class TestAzureOpenAiStructureConfig: + @fixture(autouse=True) + def mock_openai(self, mocker): + return mocker.patch("openai.AzureOpenAI") + + @fixture + def config(self): + return AzureOpenAiStructureConfig( + azure_endpoint="http://localhost:8080", + azure_ad_token="test-token", + azure_ad_token_provider=lambda: "test-provider", + ) + + def test_to_dict(self, config): + assert config.to_dict() == { + "type": "AzureOpenAiStructureConfig", + "azure_endpoint": "http://localhost:8080", + "prompt_driver": { + "type": "AzureOpenAiChatPromptDriver", + "base_url": None, + "model": "gpt-4", + "azure_deployment": "gpt-4", + "azure_endpoint": "http://localhost:8080", + "api_version": "2023-05-15", + "organization": None, + "response_format": None, + "seed": None, + "temperature": 0.1, + "max_tokens": None, + "stream": False, + "user": "", + }, + "conversation_memory_driver": None, + "embedding_driver": { + "base_url": None, + "model": "text-embedding-3-small", + "api_version": "2023-05-15", + "azure_deployment": "text-embedding-3-small", + "azure_endpoint": "http://localhost:8080", + "organization": None, + "type": "AzureOpenAiEmbeddingDriver", + }, + "image_generation_driver": { + "api_version": "2024-02-01", + "base_url": None, + "image_size": "512x512", + "model": "dall-e-2", + "azure_deployment": "dall-e-2", + "azure_endpoint": "http://localhost:8080", + "organization": None, + "quality": "standard", + "response_format": "b64_json", + "style": None, + "type": "AzureOpenAiImageGenerationDriver", + }, + "text_to_speech_driver": {"type": "DummyTextToSpeechDriver"}, + "image_query_driver": { + "base_url": None, + "image_quality": "auto", + "max_tokens": 256, + "model": "gpt-4", + "api_version": "2024-02-01", + "azure_deployment": "gpt-4", + "azure_endpoint": "http://localhost:8080", + "organization": None, + "type": "AzureOpenAiVisionImageQueryDriver", + }, + "vector_store_driver": { + "embedding_driver": { + "base_url": None, + "model": "text-embedding-3-small", + "api_version": "2023-05-15", + "azure_deployment": "text-embedding-3-small", + "azure_endpoint": "http://localhost:8080", + "organization": None, + "type": "AzureOpenAiEmbeddingDriver", + }, + "type": "LocalVectorStoreDriver", + }, + } + + def test_from_dict(self, config: AzureOpenAiStructureConfig): + assert AzureOpenAiStructureConfig.from_dict(config.to_dict()).to_dict() == config.to_dict() + + # override values in the dict config + # serialize and deserialize the config + new_config = config.merge_config( + { + "prompt_driver": {"azure_deployment": "new-test-gpt-4"}, + "embedding_driver": {"model": "new-text-embedding-3-small"}, + } + ).to_dict() + assert AzureOpenAiStructureConfig.from_dict(new_config).to_dict() == new_config diff --git a/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py b/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py index f22ad02f0..d2c20c043 100644 --- a/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py +++ b/tests/unit/drivers/embedding/test_azure_openai_embedding_driver.py @@ -23,6 +23,7 @@ def driver(self): def test_init(self, driver): assert driver + assert AzureOpenAiEmbeddingDriver(azure_endpoint="foobar", model="gpt-4").azure_deployment == "gpt-4" def test_embed_chunk(self, driver): assert driver.try_embed_chunk("foobar") == [0, 1, 0] diff --git a/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py b/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py index 13b122af7..2166bc28a 100644 --- a/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py +++ b/tests/unit/drivers/image_generation/test_azure_openai_image_generation_driver.py @@ -16,6 +16,12 @@ def driver(self): def test_init(self, driver): assert driver + assert ( + AzureOpenAiImageGenerationDriver( + model="dall-e-3", client=Mock(), azure_endpoint="https://dalle.example.com", image_size="512x512" + ).azure_deployment + == "dall-e-3" + ) def test_init_requires_endpoint(self): with pytest.raises(TypeError): @@ -23,12 +29,6 @@ def test_init_requires_endpoint(self): model="dall-e-3", client=Mock(), azure_deployment="dalle-deployment", image_size="512x512" ) # pyright: ignore - def test_init_requires_deployment(self): - with pytest.raises(TypeError): - AzureOpenAiImageGenerationDriver( - model="dall-e-3", client=Mock(), azure_endpoint="https://dalle.example.com", image_size="512x512" - ) # pyright: ignore - def test_try_text_to_image(self, driver): driver.client.images.generate.return_value = Mock(data=[Mock(b64_json=b"aW1hZ2UgZGF0YQ==")]) diff --git a/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py new file mode 100644 index 000000000..d3a34fe44 --- /dev/null +++ b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py @@ -0,0 +1,70 @@ +import pytest +from unittest.mock import Mock +from griptape.drivers import AzureOpenAiVisionImageQueryDriver +from griptape.artifacts import ImageArtifact + + +class TestAzureOpenAiVisionImageQueryDriver: + @pytest.fixture + def mock_completion_create(self, mocker): + mock_chat_create = mocker.patch("openai.AzureOpenAI").return_value.chat.completions.create + mock_choice = Mock(message=Mock(content="expected_output_text")) + mock_chat_create.return_value.choices = [mock_choice] + return mock_chat_create + + def test_init(self): + assert AzureOpenAiVisionImageQueryDriver( + azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" + ) + assert ( + AzureOpenAiVisionImageQueryDriver(azure_endpoint="test-endpoint", model="gpt-4").azure_deployment == "gpt-4" + ) + + def test_try_query_defaults(self, mock_completion_create): + driver = AzureOpenAiVisionImageQueryDriver( + azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" + ) + test_prompt_string = "Prompt String" + test_binary_data = b"test-data" + test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") + text_artifact = driver.try_query(test_prompt_string, [test_image]) + + messages = self._expected_messages(test_prompt_string, test_image.base64) + + mock_completion_create.assert_called_once_with(model=driver.model, messages=[messages], max_tokens=256) + + assert text_artifact.value == "expected_output_text" + + def test_try_query_max_tokens(self, mock_completion_create): + driver = AzureOpenAiVisionImageQueryDriver( + azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4", max_tokens=1024 + ) + test_prompt_string = "Prompt String" + test_binary_data = b"test-data" + test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") + driver.try_query(test_prompt_string, [test_image]) + + messages = self._expected_messages(test_prompt_string, test_image.base64) + + mock_completion_create.assert_called_once_with(model=driver.model, messages=[messages], max_tokens=1024) + + def test_try_query_multiple_choices(self, mock_completion_create): + mock_completion_create.return_value.choices.append(Mock(message=Mock(content="expected_output_text2"))) + driver = AzureOpenAiVisionImageQueryDriver( + azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" + ) + + with pytest.raises(Exception): + driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")]) + + def _expected_messages(self, expected_prompt_string, expected_binary_data): + return { + "content": [ + {"type": "text", "text": expected_prompt_string}, + { + "type": "image_url", + "image_url": {"url": f"data:image/png;base64,{expected_binary_data}", "detail": "auto"}, + }, + ], + "role": "user", + } diff --git a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py index ebf598570..9446d0520 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_chat_prompt_driver.py @@ -26,6 +26,7 @@ def mock_chat_completion_stream_create(self, mocker): def test_init(self): assert AzureOpenAiChatPromptDriver(azure_endpoint="foobar", azure_deployment="foobar", model="gpt-4") + assert AzureOpenAiChatPromptDriver(azure_endpoint="foobar", model="gpt-4").azure_deployment == "gpt-4" def test_try_run(self, mock_chat_completion_create, prompt_stack, messages): # Given diff --git a/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py b/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py index cf92f64e9..65758843a 100644 --- a/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py +++ b/tests/unit/drivers/prompt/test_azure_openai_completion_prompt_driver.py @@ -28,6 +28,10 @@ def test_init(self): assert AzureOpenAiCompletionPromptDriver( azure_endpoint="endpoint", azure_deployment="deployment", model="text-davinci-003" ) + assert ( + AzureOpenAiCompletionPromptDriver(azure_endpoint="endpoint", model="text-davinci-003").azure_deployment + == "text-davinci-003" + ) def test_try_run(self, mock_completion_create, prompt_stack, prompt): # Given From 9db5c8d862162b00d3f6b44cf95d859f2252857d Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Mon, 20 May 2024 19:02:04 -0500 Subject: [PATCH 053/238] Run integration tests on push to `main` and `dev` (#795) --- .github/workflows/docs-integration-tests.yml | 11 ++++++++--- tests/integration/test_code_blocks.py | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index cb4add5ae..ed2720917 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -3,9 +3,13 @@ name: Docs Integration Tests on: pull_request_review: types: [submitted] + push: + branches: + - main + - dev jobs: test: - if: github.event.review.state == 'APPROVED' + if: github.event.review.state == 'APPROVED' || github.event_name == 'push' runs-on: ubuntu-latest strategy: fail-fast: false @@ -125,6 +129,7 @@ jobs: - name: Get changed files id: changed-files uses: tj-actions/changed-files@v44 + if: github.event_name == 'pull_request_review' with: files: | **.md @@ -136,7 +141,7 @@ jobs: echo "$file was changed" done - name: Run integration tests - if: steps.changed-files.outputs.any_changed == 'true' + if: steps.changed-files.outputs.any_changed == 'true' || github.event_name == 'push' run: pytest -n auto tests/integration/test_code_blocks.py env: - DOCS_ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} + DOCS_ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files || '' }} diff --git a/tests/integration/test_code_blocks.py b/tests/integration/test_code_blocks.py index a37e0d086..3a267a529 100644 --- a/tests/integration/test_code_blocks.py +++ b/tests/integration/test_code_blocks.py @@ -5,7 +5,7 @@ from tests.utils.code_blocks import get_all_code_blocks, check_py_string -if "DOCS_ALL_CHANGED_FILES" in os.environ: +if "DOCS_ALL_CHANGED_FILES" in os.environ and os.environ["DOCS_ALL_CHANGED_FILES"] != "": docs_all_changed_files = os.environ["DOCS_ALL_CHANGED_FILES"].split() all_code_blocks = [get_all_code_blocks(changed_file) for changed_file in docs_all_changed_files] From b0606c7cdfd07afd00f76e34463d8b0d60029466 Mon Sep 17 00:00:00 2001 From: dylanholmes <4370153+dylanholmes@users.noreply.github.com> Date: Wed, 22 May 2024 11:02:50 -0700 Subject: [PATCH 054/238] Fix hugging face prompt pipeline driver + docs (#796) --- .../drivers/prompt-drivers.md | 20 +- .../huggingface_pipeline_prompt_driver.py | 1 + poetry.lock | 321 +++++++++++++++++- pyproject.toml | 3 + 4 files changed, 336 insertions(+), 9 deletions(-) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index ae798b22e..e2b324ee1 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -242,6 +242,15 @@ The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/hugging - text2text-generation - text-generation +!!! warning + Not all models featured on the Hugging Face Hub are supported by this driver. Models that are not supported by + [Hugging Face serverless inference](https://huggingface.co/docs/api-inference/en/index) will not work with this driver. + Due to the limitations of Hugging Face serverless inference, only models that are than 10GB are supported. + +!!! info + The `prompt_stack_to_string_converter` function is intended to convert a `PromptStack` to model specific input. You + should consult the model's documentation to determine the correct format. + Let's recreate the [Falcon-7B-Instruct](https://huggingface.co/tiiuae/falcon-7b-instruct) example using Griptape: ```python @@ -319,9 +328,9 @@ agent.run("Write the code for a snake game.") ### Hugging Face Pipeline !!! info - This driver requires the `drivers-prompt-huggingface` [extra](../index.md#extras). + This driver requires the `drivers-prompt-huggingface-pipeline` [extra](../index.md#extras). -The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.md) uses [Hugging Face Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines) for inference locally. It supports models with the following tasks: +The [HuggingFacePipelinePromptDriver](../../reference/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.md) uses [Hugging Face Pipelines](https://huggingface.co/docs/transformers/main_classes/pipelines) for inference locally. It supports models with the following tasks: - text2text-generation - text-generation @@ -332,7 +341,7 @@ The [HuggingFaceHubPromptDriver](../../reference/griptape/drivers/prompt/hugging ```python import os from griptape.structures import Agent -from griptape.drivers import HuggingFaceHubPromptDriver +from griptape.drivers import HuggingFacePipelinePromptDriver from griptape.rules import Rule, Ruleset from griptape.utils import PromptStack from griptape.config import StructureConfig @@ -357,9 +366,8 @@ def prompt_stack_to_string_converter(prompt_stack: PromptStack) -> str: agent = Agent( config=StructureConfig( - prompt_driver=HuggingFaceHubPromptDriver( - model="tiiuae/falcon-7b-instruct", - api_token=os.environ["HUGGINGFACE_HUB_ACCESS_TOKEN"], + prompt_driver=HuggingFacePipelinePromptDriver( + model="TinyLlama/TinyLlama-1.1B-Chat-v0.6", prompt_stack_to_string=prompt_stack_to_string_converter, ) ), diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index d93a3a10c..9fb8b9ece 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -21,6 +21,7 @@ class HuggingFacePipelinePromptDriver(BasePromptDriver): SUPPORTED_TASKS = ["text2text-generation", "text-generation"] DEFAULT_PARAMS = {"return_full_text": False, "num_return_sequences": 1} + max_tokens: int = field(default=250, kw_only=True, metadata={"serializable": True}) model: str = field(kw_only=True, metadata={"serializable": True}) params: dict = field(factory=dict, kw_only=True, metadata={"serializable": True}) tokenizer: HuggingFaceTokenizer = field( diff --git a/poetry.lock b/poetry.lock index 02da58de3..c4e2e1024 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1954,6 +1954,20 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = true +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + [[package]] name = "ipython" version = "8.18.1" @@ -2672,6 +2686,24 @@ files = [ griffe = ">=0.37" mkdocstrings = ">=0.20" +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = true +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + [[package]] name = "mongomock" version = "4.1.2" @@ -2745,6 +2777,23 @@ server = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0) ssm = ["PyYAML (>=5.1)"] xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = true +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + [[package]] name = "multidict" version = "6.0.5" @@ -2914,6 +2963,24 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.12\""} +[[package]] +name = "networkx" +version = "3.2.1" +description = "Python package for creating and manipulating graphs and networks" +optional = true +python-versions = ">=3.9" +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[package.extras] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + [[package]] name = "nh3" version = "0.2.17" @@ -2998,6 +3065,148 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = true +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + [[package]] name = "openai" version = "1.30.1" @@ -4027,6 +4236,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4869,6 +5079,33 @@ files = [ {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, ] +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tbb" +version = "2021.12.0" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = true +python-versions = "*" +files = [ + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:f2cc9a7f8ababaa506cbff796ce97c3bf91062ba521e15054394f773375d81d8"}, + {file = "tbb-2021.12.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:a925e9a7c77d3a46ae31c34b0bb7f801c4118e857d137b68f68a8e458fcf2bd7"}, + {file = "tbb-2021.12.0-py3-none-win32.whl", hash = "sha256:b1725b30c174048edc8be70bd43bb95473f396ce895d91151a474d0fa9f450a8"}, + {file = "tbb-2021.12.0-py3-none-win_amd64.whl", hash = "sha256:fc2772d850229f2f3df85f1109c4844c495a2db7433d38200959ee9265b34789"}, +] + [[package]] name = "tenacity" version = "8.3.0" @@ -5086,6 +5323,60 @@ files = [ {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] +[[package]] +name = "torch" +version = "2.3.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = true +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.3.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d8ea5a465dbfd8501f33c937d1f693176c9aef9d1c1b0ca1d44ed7b0a18c52ac"}, + {file = "torch-2.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09c81c5859a5b819956c6925a405ef1cdda393c9d8a01ce3851453f699d3358c"}, + {file = "torch-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:1bf023aa20902586f614f7682fedfa463e773e26c58820b74158a72470259459"}, + {file = "torch-2.3.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:758ef938de87a2653bba74b91f703458c15569f1562bf4b6c63c62d9c5a0c1f5"}, + {file = "torch-2.3.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:493d54ee2f9df100b5ce1d18c96dbb8d14908721f76351e908c9d2622773a788"}, + {file = "torch-2.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:bce43af735c3da16cc14c7de2be7ad038e2fbf75654c2e274e575c6c05772ace"}, + {file = "torch-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:729804e97b7cf19ae9ab4181f91f5e612af07956f35c8b2c8e9d9f3596a8e877"}, + {file = "torch-2.3.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:d24e328226d8e2af7cf80fcb1d2f1d108e0de32777fab4aaa2b37b9765d8be73"}, + {file = "torch-2.3.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b0de2bdc0486ea7b14fc47ff805172df44e421a7318b7c4d92ef589a75d27410"}, + {file = "torch-2.3.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a306c87a3eead1ed47457822c01dfbd459fe2920f2d38cbdf90de18f23f72542"}, + {file = "torch-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9b98bf1a3c8af2d4c41f0bf1433920900896c446d1ddc128290ff146d1eb4bd"}, + {file = "torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad"}, + {file = "torch-2.3.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:20572f426965dd8a04e92a473d7e445fa579e09943cc0354f3e6fef6130ce061"}, + {file = "torch-2.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e65ba85ae292909cde0dde6369826d51165a3fc8823dc1854cd9432d7f79b932"}, + {file = "torch-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:5515503a193781fd1b3f5c474e89c9dfa2faaa782b2795cc4a7ab7e67de923f6"}, + {file = "torch-2.3.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:6ae9f64b09516baa4ef890af0672dc981c20b1f0d829ce115d4420a247e88fba"}, + {file = "torch-2.3.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cd0dc498b961ab19cb3f8dbf0c6c50e244f2f37dbfa05754ab44ea057c944ef9"}, + {file = "torch-2.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e05f836559251e4096f3786ee99f4a8cbe67bc7fbedba8ad5e799681e47c5e80"}, + {file = "torch-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:4fb27b35dbb32303c2927da86e27b54a92209ddfb7234afb1949ea2b3effffea"}, + {file = "torch-2.3.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:760f8bedff506ce9e6e103498f9b1e9e15809e008368594c3a66bf74a8a51380"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + [[package]] name = "tqdm" version = "4.66.4" @@ -5213,6 +5504,29 @@ torchhub = ["filelock", "huggingface-hub (>=0.19.3,<1.0)", "importlib-metadata", video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] +[[package]] +name = "triton" +version = "2.3.0" +description = "A language and compiler for custom Deep Learning operations" +optional = true +python-versions = "*" +files = [ + {file = "triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8"}, + {file = "triton-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c3d9607f85103afdb279938fc1dd2a66e4f5999a58eb48a346bd42738f986dd"}, + {file = "triton-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:218d742e67480d9581bafb73ed598416cc8a56f6316152e5562ee65e33de01c0"}, + {file = "triton-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381ec6b3dac06922d3e4099cfc943ef032893b25415de295e82b1a82b0359d2c"}, + {file = "triton-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038e06a09c06a164fef9c48de3af1e13a63dc1ba3c792871e61a8e79720ea440"}, + {file = "triton-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8f636e0341ac348899a47a057c3daea99ea7db31528a225a3ba4ded28ccc65"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + [[package]] name = "twine" version = "5.0.0" @@ -5671,7 +5985,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-google = ["google-generativeai"] @@ -5687,6 +6001,7 @@ drivers-prompt-anthropic = ["anthropic"] drivers-prompt-cohere = ["cohere"] drivers-prompt-google = ["google-generativeai"] drivers-prompt-huggingface = ["huggingface-hub", "transformers"] +drivers-prompt-huggingface-pipeline = ["huggingface-hub", "torch", "transformers"] drivers-sql-postgres = ["pgvector", "psycopg2-binary"] drivers-sql-redshift = ["boto3", "sqlalchemy-redshift"] drivers-sql-snowflake = ["snowflake-sqlalchemy"] @@ -5707,4 +6022,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "7e866d7a5968b9e5a5c166be3cf667488d00d03d412deabe29090a9f6d1ab83d" +content-hash = "2590fc0528b584775d753939abbde032c34055a92db2538385002b9808d1fa31" diff --git a/pyproject.toml b/pyproject.toml index 9206f23c9..5ca064399 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,6 +52,7 @@ beautifulsoup4 = {version = "^4.12.3", optional = true} markdownify = {version = "^0.11.6", optional = true} voyageai = {version = "^0.2.1", optional = true} elevenlabs = {version = "^1.1.2", optional = true} +torch = {version = "^2.3.0", optional = true} # loaders pandas = {version = "^1.3", optional = true} @@ -63,6 +64,7 @@ mail-parser = {version = "^3.15.0", optional = true} drivers-prompt-cohere = ["cohere"] drivers-prompt-anthropic = ["anthropic"] drivers-prompt-huggingface = ["huggingface-hub", "transformers"] +drivers-prompt-huggingface-pipeline = ["huggingface-hub", "transformers", "torch"] drivers-prompt-amazon-bedrock = ["boto3", "anthropic"] drivers-prompt-amazon-sagemaker = ["boto3", "transformers"] drivers-prompt-google = ["google-generativeai"] @@ -123,6 +125,7 @@ all = [ "markdownify", "voyageai", "elevenlabs", + "torch", # loaders "pandas", From f7bf18048b9e23ec7236f35a04acfb3d6d60fe7d Mon Sep 17 00:00:00 2001 From: Andrew French Date: Wed, 22 May 2024 14:27:06 -0700 Subject: [PATCH 055/238] Makefile target for big install command (#797) --- Makefile | 4 ++++ README.md | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 70378dd38..c6374c380 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,10 @@ publish: ## Push git tag and publish version to PyPI. @poetry build @poetry publish +.PHONY: install +install: ## Install all dependencies. + @poetry install --with dev --with test --with docs --all-extras + .DEFAULT_GOAL := help .PHONY: help help: ## Print Makefile help text. diff --git a/README.md b/README.md index 405f729e3..2f57670ee 100644 --- a/README.md +++ b/README.md @@ -184,10 +184,16 @@ We welcome and encourage pull requests. To streamline the process, please follow ### Tools -Install dev dependencies with Poetry: +Install dev dependencies via Make: ```shell -poetry install --all-extras --with dev --with test +make install +``` + +Or install by calling Poetry directly: + +```shell +poetry install --all-extras --with dev --with test --with docs ``` Configure pre-commit to ensure that your code is formatted correctly and passes all checks: From 157186afa89061682ff696107159aff6ec20fa85 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Thu, 23 May 2024 08:40:50 -0700 Subject: [PATCH 056/238] Update Makefile + process-as-code (#799) --- .github/workflows/code-checks.yml | 8 ++--- .github/workflows/docs-integration-tests.yml | 2 +- .github/workflows/unit-tests.yml | 2 +- .pre-commit-config.yaml | 7 ++-- Makefile | 38 ++++++++++++++++++++ 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/.github/workflows/code-checks.yml b/.github/workflows/code-checks.yml index 16c9b58b4..56cbe717f 100644 --- a/.github/workflows/code-checks.yml +++ b/.github/workflows/code-checks.yml @@ -19,7 +19,7 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run formatter - run: poetry run ruff format --check . + run: make check/format type-check: runs-on: ubuntu-latest strategy: @@ -32,7 +32,7 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run type checker - run: poetry run pyright griptape/ + run: make check/types lint: runs-on: ubuntu-latest strategy: @@ -45,7 +45,7 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run linter - run: poetry run ruff check griptape/ + run: make check/lint coverage: runs-on: ubuntu-latest strategy: @@ -58,7 +58,7 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run unit tests - run: pytest -n auto --cov=griptape tests/unit + run: make test/unit/coverage - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index ed2720917..08c600fb0 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -142,6 +142,6 @@ jobs: done - name: Run integration tests if: steps.changed-files.outputs.any_changed == 'true' || github.event_name == 'push' - run: pytest -n auto tests/integration/test_code_blocks.py + run: make test/integration env: DOCS_ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files || '' }} diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 8c8b4cc56..e7bb5689b 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -19,4 +19,4 @@ jobs: - name: Init environment uses: ./.github/actions/init-environment - name: Run unit tests - run: pytest -n auto tests/unit + run: make test/unit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 69209ba17..a54182464 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,21 +8,20 @@ repos: hooks: - id: ruff-lint name: Ruff - entry: poetry run ruff check - args: [--fix] + entry: make lint language: system types: [python] - repo: local hooks: - id: ruff-format name: Ruff - entry: poetry run ruff format + entry: make format language: system types: [python] - repo: local hooks: - id: pyright name: Pyright - entry: poetry run pyright + entry: make check/types language: system types: [python] diff --git a/Makefile b/Makefile index c6374c380..61d91e6a1 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,44 @@ publish: ## Push git tag and publish version to PyPI. install: ## Install all dependencies. @poetry install --with dev --with test --with docs --all-extras +.PHONY: test +test: test/unit test/integration ## Run all tests. + +.PHONY: test/unit +test/unit: ## Run unit tests. + @poetry run pytest -n auto tests/unit + +.PHONY: test/unit/coverage +test/unit/coverage: + @poetry run pytest -n auto --cov=griptape tests/unit + +.PHONY: test/integration +test/integration: + @poetry run pytest -n auto tests/integration/test_code_blocks.py + +.PHONY: lint +lint: ## Lint project. + @poetry run ruff check --fix griptape/ + +.PHONY: format +format: ## Format project. + @poetry run ruff format . + +.PHONY: check +check: check/format check/lint check/types ## Run all checks. + +.PHONY: check/format +check/format: + @poetry run ruff format --check griptape/ + +.PHONY: check/lint +check/lint: + @poetry run ruff check griptape/ + +.PHONY: check/types +check/types: + @poetry run pyright griptape/ + .DEFAULT_GOAL := help .PHONY: help help: ## Print Makefile help text. From 74706844048b039d56c620beebcd2131c0c7e74b Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 23 May 2024 10:09:32 -0700 Subject: [PATCH 057/238] Set concurrency for actions (#801) --- .github/workflows/code-checks.yml | 4 ++++ .github/workflows/docs-integration-tests.yml | 5 +++++ .github/workflows/pull-request-links.yml | 4 ++++ .github/workflows/unit-tests.yml | 4 ++++ 4 files changed, 17 insertions(+) diff --git a/.github/workflows/code-checks.yml b/.github/workflows/code-checks.yml index 56cbe717f..03b1f0a17 100644 --- a/.github/workflows/code-checks.yml +++ b/.github/workflows/code-checks.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ "main", "dev" ] +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: format: runs-on: ubuntu-latest diff --git a/.github/workflows/docs-integration-tests.yml b/.github/workflows/docs-integration-tests.yml index 08c600fb0..eb3621870 100644 --- a/.github/workflows/docs-integration-tests.yml +++ b/.github/workflows/docs-integration-tests.yml @@ -7,6 +7,11 @@ on: branches: - main - dev + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: test: if: github.event.review.state == 'APPROVED' || github.event_name == 'push' diff --git a/.github/workflows/pull-request-links.yml b/.github/workflows/pull-request-links.yml index 0d937ac94..36a8d51a4 100644 --- a/.github/workflows/pull-request-links.yml +++ b/.github/workflows/pull-request-links.yml @@ -6,6 +6,10 @@ on: paths: - "docs/**" +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + permissions: pull-requests: write diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index e7bb5689b..d24a0d541 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ "main", "dev" ] +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: test: runs-on: ubuntu-latest From 04af7d1df7c4cfb45bf3f42ce0808a491843d5ae Mon Sep 17 00:00:00 2001 From: Andrew French Date: Thu, 23 May 2024 13:58:52 -0700 Subject: [PATCH 058/238] Update OpenAI image query default model to GPT-4o (#802) --- CHANGELOG.md | 2 ++ .../drivers/image-query-drivers.md | 22 +++++++++---------- .../engines/image-query-engines.md | 8 +++---- docs/griptape-framework/structures/config.md | 2 +- docs/griptape-framework/structures/tasks.md | 7 +++--- .../official-tools/image-query-client.md | 10 ++++----- .../config/azure_openai_structure_config.py | 8 +++---- griptape/config/openai_structure_config.py | 6 ++--- griptape/drivers/__init__.py | 8 +++---- ....py => azure_openai_image_query_driver.py} | 4 ++-- ...driver.py => openai_image_query_driver.py} | 2 +- .../test_azure_openai_structure_config.py | 10 ++++----- .../config/test_openai_structure_config.py | 4 ++-- .../test_azure_openai_image_query_driver.py | 14 +++++------- .../test_openai_image_query_driver.py | 10 ++++----- 15 files changed, 57 insertions(+), 60 deletions(-) rename griptape/drivers/image_query/{azure_openai_vision_image_query_driver.py => azure_openai_image_query_driver.py} (90%) rename griptape/drivers/image_query/{openai_vision_image_query_driver.py => openai_image_query_driver.py} (97%) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa95e7a5..99a15137e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Default the value of `azure_deployment` on all Azure Drivers to the model the Driver is using. - Field `azure_ad_token` on all Azure Drivers is no longer serializable. +- Default standard OpenAI and Azure OpenAI image query model to `gpt-4o`. +- **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. ## [0.25.1] - 2024-05-15 diff --git a/docs/griptape-framework/drivers/image-query-drivers.md b/docs/griptape-framework/drivers/image-query-drivers.md index 7538496b1..d795838d4 100644 --- a/docs/griptape-framework/drivers/image-query-drivers.md +++ b/docs/griptape-framework/drivers/image-query-drivers.md @@ -64,15 +64,15 @@ print(result) !!! info While the `max_tokens` field is optional, it is recommended to set this to a value that corresponds to the desired response length. Without an explicit value, the model will default to very short responses. See [OpenAI's documentation](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them) for more information on how to relate token count to response length. -The [OpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/openai_vision_image_query_driver.md) is used to query images using the OpenAI Vision API. Here is an example of how to use it: +The [OpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/openai_image_query_driver.md) is used to query images using the OpenAI Vision API. Here is an example of how to use it: ```python -from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.drivers import OpenAiImageQueryDriver from griptape.engines import ImageQueryEngine from griptape.loaders import ImageLoader -driver = OpenAiVisionImageQueryDriver( - model="gpt-4-vision-preview", +driver = OpenAiImageQueryDriver( + model="gpt-4o", max_tokens=256, ) @@ -91,19 +91,19 @@ engine.run("Describe the weather in the image", [image_artifact]) !!! info In order to use the `gpt-4-vision-preview` model on Azure OpenAI, the `gpt-4` model must be deployed with the version set to `vision-preview`. More information can be found in the [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision). -The [AzureOpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/azure_openai_vision_image_query_driver.md) is used to query images using the Azure OpenAI Vision API. Here is an example of how to use it: +The [AzureOpenAiVisionImageQueryDriver](../../reference/griptape/drivers/image_query/azure_openai_image_query_driver.md) is used to query images using the Azure OpenAI Vision API. Here is an example of how to use it: ```python import os -from griptape.drivers import AzureOpenAiVisionImageQueryDriver +from griptape.drivers import AzureOpenAiImageQueryDriver from griptape.engines import ImageQueryEngine from griptape.loaders import ImageLoader -driver = AzureOpenAiVisionImageQueryDriver( - azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_3"], - api_key=os.environ["AZURE_OPENAI_API_KEY_3"], - model="gpt-4", - azure_deployment="gpt-4-vision-preview", +driver = AzureOpenAiImageQueryDriver( + azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT_2"], + api_key=os.environ["AZURE_OPENAI_API_KEY_2"], + model="gpt-4o", + azure_deployment="gpt-4o", max_tokens=256, ) diff --git a/docs/griptape-framework/engines/image-query-engines.md b/docs/griptape-framework/engines/image-query-engines.md index a0b9309d8..0457657f8 100644 --- a/docs/griptape-framework/engines/image-query-engines.md +++ b/docs/griptape-framework/engines/image-query-engines.md @@ -2,15 +2,15 @@ The [Image Query Engine](../../reference/griptape/engines/image_query/image_query_engine.md) is used to execute natural language queries on the contents of images. You can specify the provider and model used to query the image by providing the Engine with a particular [Image Query Driver](../drivers/image-query-drivers.md). -All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. +All Image Query Drivers default to a `max_tokens` of 256. You can tune this value based on your use case and the [Image Query Driver](../drivers/image-query-drivers.md) you are providing. ```python -from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.drivers import OpenAiImageQueryDriver from griptape.engines import ImageQueryEngine from griptape.loaders import ImageLoader -driver = OpenAiVisionImageQueryDriver( - model="gpt-4-vision-preview", +driver = OpenAiImageQueryDriver( + model="gpt-4o", max_tokens=256 ) diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md index 374468639..9637eaf35 100644 --- a/docs/griptape-framework/structures/config.md +++ b/docs/griptape-framework/structures/config.md @@ -38,7 +38,7 @@ agent = Agent( api_key=os.environ["AZURE_OPENAI_API_KEY_3"] ).merge_config({ "image_query_driver": { - "azure_deployment": "gpt-4-vision-preview", + "azure_deployment": "gpt-4o", }, }), ) diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index c7f9e78cd..683648cef 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -633,15 +633,14 @@ This Task accepts two inputs: a query (represented by either a string or a [Text ```python from griptape.engines import ImageQueryEngine -from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.drivers import OpenAiImageQueryDriver from griptape.tasks import ImageQueryTask from griptape.loaders import ImageLoader from griptape.structures import Pipeline - # Create a driver configured to use OpenAI's GPT-4 Vision model. -driver = OpenAiVisionImageQueryDriver( - model="gpt-4-vision-preview", +driver = OpenAiImageQueryDriver( + model="gpt-4o", max_tokens=100, ) diff --git a/docs/griptape-tools/official-tools/image-query-client.md b/docs/griptape-tools/official-tools/image-query-client.md index fb5dcca33..8da058d3e 100644 --- a/docs/griptape-tools/official-tools/image-query-client.md +++ b/docs/griptape-tools/official-tools/image-query-client.md @@ -5,14 +5,14 @@ This tool allows Agents to execute natural language queries on the contents of i ```python from griptape.structures import Agent from griptape.tools import ImageQueryClient -from griptape.drivers import OpenAiVisionImageQueryDriver -from griptape.engines import ImageQueryEngine +from griptape.drivers import OpenAiImageQueryDriver +from griptape.engines import ImageQueryEngine # Create an Image Query Driver. -driver = OpenAiVisionImageQueryDriver( - model="gpt-4-vision-preview" +driver = OpenAiImageQueryDriver( + model="gpt-4o" ) - + # Create an Image Query Engine configured to use the driver. engine = ImageQueryEngine( image_query_driver=driver, diff --git a/griptape/config/azure_openai_structure_config.py b/griptape/config/azure_openai_structure_config.py index 8c7ce82d3..3aee53f32 100644 --- a/griptape/config/azure_openai_structure_config.py +++ b/griptape/config/azure_openai_structure_config.py @@ -7,7 +7,7 @@ AzureOpenAiChatPromptDriver, AzureOpenAiEmbeddingDriver, AzureOpenAiImageGenerationDriver, - AzureOpenAiVisionImageQueryDriver, + AzureOpenAiImageQueryDriver, BasePromptDriver, BaseEmbeddingDriver, BaseImageGenerationDriver, @@ -41,7 +41,7 @@ class AzureOpenAiStructureConfig(StructureConfig): prompt_driver: BasePromptDriver = field( default=Factory( lambda self: AzureOpenAiChatPromptDriver( - model="gpt-4", + model="gpt-4o", azure_endpoint=self.azure_endpoint, api_key=self.api_key, azure_ad_token=self.azure_ad_token, @@ -69,8 +69,8 @@ class AzureOpenAiStructureConfig(StructureConfig): ) image_query_driver: BaseImageQueryDriver = field( default=Factory( - lambda self: AzureOpenAiVisionImageQueryDriver( - model="gpt-4", + lambda self: AzureOpenAiImageQueryDriver( + model="gpt-4o", azure_endpoint=self.azure_endpoint, api_key=self.api_key, azure_ad_token=self.azure_ad_token, diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index 5b2e163ba..459160b11 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -11,7 +11,7 @@ OpenAiChatPromptDriver, OpenAiEmbeddingDriver, OpenAiImageGenerationDriver, - OpenAiVisionImageQueryDriver, + OpenAiImageQueryDriver, ) @@ -26,9 +26,7 @@ class OpenAiStructureConfig(StructureConfig): metadata={"serializable": True}, ) image_query_driver: BaseImageQueryDriver = field( - default=Factory(lambda: OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview")), - kw_only=True, - metadata={"serializable": True}, + default=Factory(lambda: OpenAiImageQueryDriver(model="gpt-4o")), kw_only=True, metadata={"serializable": True} ) embedding_driver: BaseEmbeddingDriver = field( default=Factory(lambda: OpenAiEmbeddingDriver(model="text-embedding-3-small")), diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 1d76ba30d..6043b0b43 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -79,9 +79,9 @@ from .image_query.base_image_query_driver import BaseImageQueryDriver from .image_query.base_multi_model_image_query_driver import BaseMultiModelImageQueryDriver from .image_query.dummy_image_query_driver import DummyImageQueryDriver -from .image_query.openai_vision_image_query_driver import OpenAiVisionImageQueryDriver +from .image_query.openai_image_query_driver import OpenAiImageQueryDriver from .image_query.anthropic_image_query_driver import AnthropicImageQueryDriver -from .image_query.azure_openai_vision_image_query_driver import AzureOpenAiVisionImageQueryDriver +from .image_query.azure_openai_image_query_driver import AzureOpenAiImageQueryDriver from .image_query.amazon_bedrock_image_query_driver import AmazonBedrockImageQueryDriver from .web_scraper.base_web_scraper_driver import BaseWebScraperDriver @@ -175,8 +175,8 @@ "BaseImageQueryModelDriver", "BedrockClaudeImageQueryModelDriver", "BaseImageQueryDriver", - "OpenAiVisionImageQueryDriver", - "AzureOpenAiVisionImageQueryDriver", + "OpenAiImageQueryDriver", + "AzureOpenAiImageQueryDriver", "DummyImageQueryDriver", "AnthropicImageQueryDriver", "BaseMultiModelImageQueryDriver", diff --git a/griptape/drivers/image_query/azure_openai_vision_image_query_driver.py b/griptape/drivers/image_query/azure_openai_image_query_driver.py similarity index 90% rename from griptape/drivers/image_query/azure_openai_vision_image_query_driver.py rename to griptape/drivers/image_query/azure_openai_image_query_driver.py index 06b329c03..017c98f1f 100644 --- a/griptape/drivers/image_query/azure_openai_vision_image_query_driver.py +++ b/griptape/drivers/image_query/azure_openai_image_query_driver.py @@ -4,11 +4,11 @@ from attr import define, field, Factory import openai -from griptape.drivers.image_query.openai_vision_image_query_driver import OpenAiVisionImageQueryDriver +from griptape.drivers.image_query.openai_image_query_driver import OpenAiImageQueryDriver @define -class AzureOpenAiVisionImageQueryDriver(OpenAiVisionImageQueryDriver): +class AzureOpenAiImageQueryDriver(OpenAiImageQueryDriver): """Driver for Azure-hosted OpenAI image query API. Attributes: diff --git a/griptape/drivers/image_query/openai_vision_image_query_driver.py b/griptape/drivers/image_query/openai_image_query_driver.py similarity index 97% rename from griptape/drivers/image_query/openai_vision_image_query_driver.py rename to griptape/drivers/image_query/openai_image_query_driver.py index c37cebba9..515bdcc7c 100644 --- a/griptape/drivers/image_query/openai_vision_image_query_driver.py +++ b/griptape/drivers/image_query/openai_image_query_driver.py @@ -16,7 +16,7 @@ @define -class OpenAiVisionImageQueryDriver(BaseImageQueryDriver): +class OpenAiImageQueryDriver(BaseImageQueryDriver): model: str = field(kw_only=True, metadata={"serializable": True}) api_type: str = field(default=openai.api_type, kw_only=True) api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) diff --git a/tests/unit/config/test_azure_openai_structure_config.py b/tests/unit/config/test_azure_openai_structure_config.py index acec4526a..dd5cd56a7 100644 --- a/tests/unit/config/test_azure_openai_structure_config.py +++ b/tests/unit/config/test_azure_openai_structure_config.py @@ -22,8 +22,8 @@ def test_to_dict(self, config): "prompt_driver": { "type": "AzureOpenAiChatPromptDriver", "base_url": None, - "model": "gpt-4", - "azure_deployment": "gpt-4", + "model": "gpt-4o", + "azure_deployment": "gpt-4o", "azure_endpoint": "http://localhost:8080", "api_version": "2023-05-15", "organization": None, @@ -62,12 +62,12 @@ def test_to_dict(self, config): "base_url": None, "image_quality": "auto", "max_tokens": 256, - "model": "gpt-4", + "model": "gpt-4o", "api_version": "2024-02-01", - "azure_deployment": "gpt-4", + "azure_deployment": "gpt-4o", "azure_endpoint": "http://localhost:8080", "organization": None, - "type": "AzureOpenAiVisionImageQueryDriver", + "type": "AzureOpenAiImageQueryDriver", }, "vector_store_driver": { "embedding_driver": { diff --git a/tests/unit/config/test_openai_structure_config.py b/tests/unit/config/test_openai_structure_config.py index bd8db27cd..efcac008e 100644 --- a/tests/unit/config/test_openai_structure_config.py +++ b/tests/unit/config/test_openai_structure_config.py @@ -50,9 +50,9 @@ def test_to_dict(self, config): "base_url": None, "image_quality": "auto", "max_tokens": 256, - "model": "gpt-4-vision-preview", + "model": "gpt-4o", "organization": None, - "type": "OpenAiVisionImageQueryDriver", + "type": "OpenAiImageQueryDriver", }, "vector_store_driver": { "embedding_driver": { diff --git a/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py index d3a34fe44..a44319861 100644 --- a/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_azure_openai_image_query_driver.py @@ -1,6 +1,6 @@ import pytest from unittest.mock import Mock -from griptape.drivers import AzureOpenAiVisionImageQueryDriver +from griptape.drivers import AzureOpenAiImageQueryDriver from griptape.artifacts import ImageArtifact @@ -13,15 +13,13 @@ def mock_completion_create(self, mocker): return mock_chat_create def test_init(self): - assert AzureOpenAiVisionImageQueryDriver( + assert AzureOpenAiImageQueryDriver( azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" ) - assert ( - AzureOpenAiVisionImageQueryDriver(azure_endpoint="test-endpoint", model="gpt-4").azure_deployment == "gpt-4" - ) + assert AzureOpenAiImageQueryDriver(azure_endpoint="test-endpoint", model="gpt-4").azure_deployment == "gpt-4" def test_try_query_defaults(self, mock_completion_create): - driver = AzureOpenAiVisionImageQueryDriver( + driver = AzureOpenAiImageQueryDriver( azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" ) test_prompt_string = "Prompt String" @@ -36,7 +34,7 @@ def test_try_query_defaults(self, mock_completion_create): assert text_artifact.value == "expected_output_text" def test_try_query_max_tokens(self, mock_completion_create): - driver = AzureOpenAiVisionImageQueryDriver( + driver = AzureOpenAiImageQueryDriver( azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4", max_tokens=1024 ) test_prompt_string = "Prompt String" @@ -50,7 +48,7 @@ def test_try_query_max_tokens(self, mock_completion_create): def test_try_query_multiple_choices(self, mock_completion_create): mock_completion_create.return_value.choices.append(Mock(message=Mock(content="expected_output_text2"))) - driver = AzureOpenAiVisionImageQueryDriver( + driver = AzureOpenAiImageQueryDriver( azure_endpoint="test-endpoint", azure_deployment="test-deployment", model="gpt-4" ) diff --git a/tests/unit/drivers/image_query/test_openai_image_query_driver.py b/tests/unit/drivers/image_query/test_openai_image_query_driver.py index d6ce8550b..08f0c70c9 100644 --- a/tests/unit/drivers/image_query/test_openai_image_query_driver.py +++ b/tests/unit/drivers/image_query/test_openai_image_query_driver.py @@ -1,6 +1,6 @@ import pytest from unittest.mock import Mock -from griptape.drivers import OpenAiVisionImageQueryDriver +from griptape.drivers import OpenAiImageQueryDriver from griptape.artifacts import ImageArtifact @@ -13,10 +13,10 @@ def mock_completion_create(self, mocker): return mock_chat_create def test_init(self): - assert OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview") + assert OpenAiImageQueryDriver(model="gpt-4-vision-preview") def test_try_query_defaults(self, mock_completion_create): - driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview") + driver = OpenAiImageQueryDriver(model="gpt-4-vision-preview") test_prompt_string = "Prompt String" test_binary_data = b"test-data" test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") @@ -29,7 +29,7 @@ def test_try_query_defaults(self, mock_completion_create): assert text_artifact.value == "expected_output_text" def test_try_query_max_tokens(self, mock_completion_create): - driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview", max_tokens=1024) + driver = OpenAiImageQueryDriver(model="gpt-4-vision-preview", max_tokens=1024) test_prompt_string = "Prompt String" test_binary_data = b"test-data" test_image = ImageArtifact(value=test_binary_data, width=100, height=100, format="png") @@ -41,7 +41,7 @@ def test_try_query_max_tokens(self, mock_completion_create): def test_try_query_multiple_choices(self, mock_completion_create): mock_completion_create.return_value.choices.append(Mock(message=Mock(content="expected_output_text2"))) - driver = OpenAiVisionImageQueryDriver(model="gpt-4-vision-preview") + driver = OpenAiImageQueryDriver(model="gpt-4-vision-preview") with pytest.raises(Exception): driver.try_query("Prompt String", [ImageArtifact(value=b"test-data", width=100, height=100, format="png")]) From 2e030bb105a00e9b3d8c1a2a0a56cb86849beafe Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Thu, 23 May 2024 14:50:59 -0700 Subject: [PATCH 059/238] Fix/docs extras (#803) --- CHANGELOG.md | 3 ++- docs/griptape-framework/drivers/web-scraper-drivers.md | 3 +++ griptape/utils/import_utils.py | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99a15137e..fb2e5636a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `AzureOpenAiVisionImageQueryDriver` to support queries on images using Azure's OpenAI Vision models. ### Changed +- **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. - Default the value of `azure_deployment` on all Azure Drivers to the model the Driver is using. - Field `azure_ad_token` on all Azure Drivers is no longer serializable. - Default standard OpenAI and Azure OpenAI image query model to `gpt-4o`. -- **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. +- Error message to be more helpful when importing optional dependencies. ## [0.25.1] - 2024-05-15 diff --git a/docs/griptape-framework/drivers/web-scraper-drivers.md b/docs/griptape-framework/drivers/web-scraper-drivers.md index e1a3f53b3..888605b73 100644 --- a/docs/griptape-framework/drivers/web-scraper-drivers.md +++ b/docs/griptape-framework/drivers/web-scraper-drivers.md @@ -66,6 +66,9 @@ agent.run("List all email addresses on griptape.ai in a flat numbered markdown l ## Trafilatura Web Scraper Driver +!!! info + This driver requires the `drivers-web-scraper-trafilatura` [extra](../index.md#extras). + The [TrafilaturaWebScraperDriver](../../reference/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.md) scrapes text from a webpage using the [Trafilatura](https://trafilatura.readthedocs.io) library. Example of using `TrafilaturaWebScraperDriver` directly: diff --git a/griptape/utils/import_utils.py b/griptape/utils/import_utils.py index dd5b5b68e..5e00551f8 100644 --- a/griptape/utils/import_utils.py +++ b/griptape/utils/import_utils.py @@ -26,7 +26,10 @@ def import_optional_dependency(name: str) -> Optional[ModuleType]: package_name = INSTALL_MAPPING.get(name) install_name = package_name if package_name is not None else name - msg = f"Missing optional dependency: '{install_name}'. " f"Use poetry or pip to install '{install_name}'." + msg = ( + f"Missing optional dependency: '{install_name}'. " + f"Please install the appropriate extra: https://docs.griptape.ai/stable/griptape-framework/#extras." + ) try: module = import_module(name) except ImportError: From 3f3f8b9df0cf16279123129bc9e0921055429564 Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Thu, 23 May 2024 19:03:28 -0500 Subject: [PATCH 060/238] Update `init=False` instances (#804) --- griptape/drivers/embedding/base_embedding_driver.py | 5 ++--- griptape/drivers/embedding/dummy_embedding_driver.py | 2 +- .../image_generation/dummy_image_generation_driver.py | 2 +- griptape/drivers/image_query/dummy_image_query_driver.py | 4 ++-- griptape/drivers/prompt/dummy_prompt_driver.py | 2 +- .../drivers/text_to_speech/dummy_text_to_speech_driver.py | 2 +- griptape/tokenizers/dummy_tokenizer.py | 8 ++++---- griptape/tokenizers/huggingface_tokenizer.py | 2 +- griptape/tokenizers/simple_tokenizer.py | 3 ++- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index 938bdd476..6f74b9306 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -20,11 +20,10 @@ class BaseEmbeddingDriver(SerializableMixin, ExponentialBackoffMixin, ABC): model: str = field(kw_only=True, metadata={"serializable": True}) tokenizer: Optional[BaseTokenizer] = field(default=None, kw_only=True) - chunker: BaseChunker = field(init=False) + chunker: Optional[BaseChunker] = field(init=False) def __attrs_post_init__(self) -> None: - if self.tokenizer: - self.chunker = TextChunker(tokenizer=self.tokenizer) + self.chunker = TextChunker(tokenizer=self.tokenizer) if self.tokenizer else None def embed_text_artifact(self, artifact: TextArtifact) -> list[float]: return self.embed_string(artifact.to_text()) diff --git a/griptape/drivers/embedding/dummy_embedding_driver.py b/griptape/drivers/embedding/dummy_embedding_driver.py index 1dd9390cf..3aa4f739e 100644 --- a/griptape/drivers/embedding/dummy_embedding_driver.py +++ b/griptape/drivers/embedding/dummy_embedding_driver.py @@ -5,7 +5,7 @@ @define class DummyEmbeddingDriver(BaseEmbeddingDriver): - model: str = field(init=False) + model: None = field(init=False, default=None, kw_only=True) def try_embed_chunk(self, chunk: str) -> list[float]: raise DummyException(__class__.__name__, "try_embed_chunk") diff --git a/griptape/drivers/image_generation/dummy_image_generation_driver.py b/griptape/drivers/image_generation/dummy_image_generation_driver.py index 97bebaecd..0f6b622f7 100644 --- a/griptape/drivers/image_generation/dummy_image_generation_driver.py +++ b/griptape/drivers/image_generation/dummy_image_generation_driver.py @@ -7,7 +7,7 @@ @define class DummyImageGenerationDriver(BaseImageGenerationDriver): - model: str = field(init=False) + model: None = field(init=False, default=None, kw_only=True) def try_text_to_image(self, prompts: list[str], negative_prompts: Optional[list[str]] = None) -> ImageArtifact: raise DummyException(__class__.__name__, "try_text_to_image") diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index 1dea5ee14..ebf579dd4 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -7,8 +7,8 @@ @define class DummyImageQueryDriver(BaseImageQueryDriver): - model: str = field(init=False) - max_tokens: int = field(init=False) # pyright: ignore[reportGeneralTypeIssues] + model: None = field(init=False, default=None, kw_only=True) + max_tokens: None = field(init=False, default=None, kw_only=True) def try_query(self, query: str, images: list[ImageArtifact]) -> TextArtifact: raise DummyException(__class__.__name__, "try_query") diff --git a/griptape/drivers/prompt/dummy_prompt_driver.py b/griptape/drivers/prompt/dummy_prompt_driver.py index c7f5bb1c8..f92f9cbc1 100644 --- a/griptape/drivers/prompt/dummy_prompt_driver.py +++ b/griptape/drivers/prompt/dummy_prompt_driver.py @@ -9,7 +9,7 @@ @define class DummyPromptDriver(BasePromptDriver): - model: str = field(init=False) + model: None = field(init=False, default=None, kw_only=True) tokenizer: DummyTokenizer = field(default=Factory(lambda: DummyTokenizer()), kw_only=True) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: diff --git a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py index ca109c8eb..b34b06019 100644 --- a/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/dummy_text_to_speech_driver.py @@ -6,7 +6,7 @@ @define class DummyTextToSpeechDriver(BaseTextToSpeechDriver): - model: str = field(init=False) + model: None = field(init=False, default=None, kw_only=True) def try_text_to_audio(self, prompts: list[str]) -> AudioArtifact: raise DummyException(__class__.__name__, "try_text_to_audio") diff --git a/griptape/tokenizers/dummy_tokenizer.py b/griptape/tokenizers/dummy_tokenizer.py index 68a730ccd..74f6d104c 100644 --- a/griptape/tokenizers/dummy_tokenizer.py +++ b/griptape/tokenizers/dummy_tokenizer.py @@ -4,11 +4,11 @@ from griptape.tokenizers import BaseTokenizer -@define() +@define class DummyTokenizer(BaseTokenizer): - model: str = field(init=False) - max_input_tokens: int = field(default=0, kw_only=True) - max_output_tokens: int = field(default=0, kw_only=True) + model: None = field(init=False, default=None, kw_only=True) + max_input_tokens: int = field(init=False, default=0, kw_only=True) + max_output_tokens: int = field(init=False, default=0, kw_only=True) def count_tokens(self, text: str | list) -> int: raise DummyException(__class__.__name__, "count_tokens") diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index 4c548d8ab..c3203d4a9 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -10,7 +10,7 @@ @define() class HuggingFaceTokenizer(BaseTokenizer): tokenizer: PreTrainedTokenizerBase = field(kw_only=True) - model: str = field(init=False, kw_only=True) + model: None = field(init=False, default=None, kw_only=True) max_input_tokens: int = field( default=Factory(lambda self: self.tokenizer.model_max_length, takes_self=True), kw_only=True ) diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index 5dfa0bcb3..d97c3bd89 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -1,11 +1,12 @@ from __future__ import annotations +from typing import Optional from attr import define, field from griptape.tokenizers import BaseTokenizer @define() class SimpleTokenizer(BaseTokenizer): - model: str = field(kw_only=True, init=False) + model: Optional[str] = field(init=False, kw_only=True, default=None) characters_per_token: int = field(kw_only=True) def count_tokens(self, text: str | list) -> int: From 943ce723b4227778c732e5e0dbf6d405f092a3fc Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 31 May 2024 09:09:07 -0700 Subject: [PATCH 061/238] Use environment variables for structure runs (#808) --- CHANGELOG.md | 1 + .../base_structure_run_driver.py | 10 +++++++- .../griptape_cloud_structure_run_driver.py | 4 +++- .../local_structure_run_driver.py | 10 +++++++- tests/mocks/mock_prompt_driver.py | 7 +++--- ...est_griptape_cloud_structure_run_driver.py | 2 +- .../test_local_structure_run_driver.py | 23 ++++++++++++------- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb2e5636a..8dee34445 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `AzureOpenAiStructureConfig` for providing Structures with all Azure OpenAI Driver configuration. - `AzureOpenAiVisionImageQueryDriver` to support queries on images using Azure's OpenAI Vision models. +- Parameter `env` to `BaseStructureRunDriver` to set environment variables for a Structure Run. ### Changed - **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. diff --git a/griptape/drivers/structure_run/base_structure_run_driver.py b/griptape/drivers/structure_run/base_structure_run_driver.py index 5c188a18d..4ff9b6eb2 100644 --- a/griptape/drivers/structure_run/base_structure_run_driver.py +++ b/griptape/drivers/structure_run/base_structure_run_driver.py @@ -1,12 +1,20 @@ from abc import ABC, abstractmethod -from attrs import define +from attrs import define, Factory, field from griptape.artifacts import BaseArtifact @define class BaseStructureRunDriver(ABC): + """Base class for Structure Run Drivers. + + Attributes: + env: Environment variables to set before running the Structure. + """ + + env: dict[str, str] = field(default=Factory(dict), kw_only=True) + def run(self, *args: BaseArtifact) -> BaseArtifact: return self.try_run(*args) diff --git a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py index 9ed036995..40e6ff874 100644 --- a/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py +++ b/griptape/drivers/structure_run/griptape_cloud_structure_run_driver.py @@ -28,7 +28,9 @@ def try_run(self, *args: BaseArtifact) -> BaseArtifact: url = urljoin(self.base_url.strip("/"), f"/api/structures/{self.structure_id}/runs") try: - response: Response = post(url, json={"args": [arg.value for arg in args]}, headers=self.headers) + response: Response = post( + url, json={"args": [arg.value for arg in args], "env": self.env}, headers=self.headers + ) response.raise_for_status() response_json = response.json() diff --git a/griptape/drivers/structure_run/local_structure_run_driver.py b/griptape/drivers/structure_run/local_structure_run_driver.py index 255f91445..4f140c1fe 100644 --- a/griptape/drivers/structure_run/local_structure_run_driver.py +++ b/griptape/drivers/structure_run/local_structure_run_driver.py @@ -6,6 +6,8 @@ from griptape.artifacts import BaseArtifact, InfoArtifact from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver +import os + if TYPE_CHECKING: from griptape.structures import Structure @@ -15,7 +17,13 @@ class LocalStructureRunDriver(BaseStructureRunDriver): structure_factory_fn: Callable[[], Structure] = field(kw_only=True) def try_run(self, *args: BaseArtifact) -> BaseArtifact: - structure_factory_fn = self.structure_factory_fn().run(*[arg.value for arg in args]) + old_env = os.environ.copy() + try: + os.environ.update(self.env) + structure_factory_fn = self.structure_factory_fn().run(*[arg.value for arg in args]) + finally: + os.environ.clear() + os.environ.update(old_env) if structure_factory_fn.output_task.output is not None: return structure_factory_fn.output_task.output diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index ca1f67f5f..e2018c6f6 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -1,5 +1,6 @@ from collections.abc import Iterator -from attr import define, field +from typing import Callable +from attr import Factory, define, field from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer @@ -11,10 +12,10 @@ class MockPromptDriver(BasePromptDriver): model: str = "test-model" tokenizer: BaseTokenizer = MockTokenizer(model="test-model", max_input_tokens=4096, max_output_tokens=4096) - mock_output: str = field(default="mock output", kw_only=True) + mock_output: str | Callable[[], str] = field(default="mock output", kw_only=True) def try_run(self, prompt_stack: PromptStack) -> TextArtifact: - return TextArtifact(value=self.mock_output) + return TextArtifact(value=self.mock_output() if isinstance(self.mock_output, Callable) else self.mock_output) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: yield TextArtifact(value=self.mock_output) diff --git a/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py index 8318553b1..b056241ec 100644 --- a/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_griptape_cloud_structure_run_driver.py @@ -20,7 +20,7 @@ def driver(self, mocker): mocker.patch("requests.get", return_value=mock_response) return GriptapeCloudStructureRunDriver( - base_url="https://cloud-foo.griptape.ai", api_key="foo bar", structure_id="1" + base_url="https://cloud-foo.griptape.ai", api_key="foo bar", structure_id="1", env={"key": "value"} ) def test_run(self, driver): diff --git a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py index 04da4f2cf..921a4b013 100644 --- a/tests/unit/drivers/structure_run/test_local_structure_run_driver.py +++ b/tests/unit/drivers/structure_run/test_local_structure_run_driver.py @@ -1,4 +1,6 @@ +import os import pytest +from griptape.artifacts.text_artifact import TextArtifact from griptape.tasks import StructureRunTask from griptape.structures import Agent from tests.mocks.mock_prompt_driver import MockPromptDriver @@ -7,18 +9,23 @@ class TestLocalStructureRunDriver: - @pytest.fixture - def driver(self): - agent = Agent(prompt_driver=MockPromptDriver(mock_output="agent mock output")) - driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) + def test_run(self): + pipeline = Pipeline() + driver = LocalStructureRunDriver(structure_factory_fn=lambda: Agent(prompt_driver=MockPromptDriver())) - return driver + task = StructureRunTask(driver=driver) + + pipeline.add_task(task) + + assert task.run().to_text() == "mock output" - def test_run(self, driver): - pipeline = Pipeline(prompt_driver=MockPromptDriver(mock_output="pipeline mock output")) + def test_run_with_env(self): + pipeline = Pipeline() + agent = Agent(prompt_driver=MockPromptDriver(mock_output=lambda: os.environ["key"])) + driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent, env={"key": "value"}) task = StructureRunTask(driver=driver) pipeline.add_task(task) - assert task.run().to_text() == "agent mock output" + assert task.run().to_text() == "value" From 427df75d61d8862c043b6b1045a1cbdc85aaf5af Mon Sep 17 00:00:00 2001 From: Matt Vallillo Date: Fri, 31 May 2024 10:43:40 -0700 Subject: [PATCH 062/238] chore: update `attr` to `attrs` (#810) Co-authored-by: Collin Dutter --- griptape/artifacts/audio_artifact.py | 2 +- griptape/artifacts/base_artifact.py | 2 +- griptape/artifacts/blob_artifact.py | 2 +- griptape/artifacts/csv_row_artifact.py | 2 +- griptape/artifacts/error_artifact.py | 2 +- griptape/artifacts/image_artifact.py | 2 +- griptape/artifacts/info_artifact.py | 2 +- griptape/artifacts/list_artifact.py | 2 +- griptape/artifacts/media_artifact.py | 2 +- griptape/artifacts/text_artifact.py | 2 +- griptape/chunkers/base_chunker.py | 2 +- griptape/config/base_structure_config.py | 2 +- .../amazon_bedrock_cohere_embedding_driver.py | 2 +- .../amazon_bedrock_titan_embedding_driver.py | 2 +- .../amazon_sagemaker_embedding_driver.py | 2 +- .../azure_openai_embedding_driver.py | 2 +- .../embedding/base_embedding_driver.py | 2 +- .../base_multi_model_embedding_driver.py | 2 +- .../embedding/google_embedding_driver.py | 2 +- .../huggingface_hub_embedding_driver.py | 2 +- .../embedding/openai_embedding_driver.py | 2 +- .../embedding/voyageai_embedding_driver.py | 2 +- .../base_embedding_model_driver.py | 2 +- ...aker_huggingface_embedding_model_driver.py | 2 +- ...r_tensorflow_hub_embedding_model_driver.py | 2 +- .../amazon_sqs_event_listener_driver.py | 2 +- .../aws_iot_core_event_listener_driver.py | 2 +- .../base_event_listener_driver.py | 2 +- .../griptape_cloud_event_listener_driver.py | 2 +- .../webhook_event_listener_driver.py | 2 +- .../amazon_s3_file_manager_driver.py | 2 +- .../file_manager/base_file_manager_driver.py | 2 +- .../file_manager/local_file_manager_driver.py | 2 +- .../amazon_bedrock_image_generation_driver.py | 2 +- .../azure_openai_image_generation_driver.py | 2 +- .../base_image_generation_driver.py | 2 +- ...ase_multi_model_image_generation_driver.py | 2 +- .../leonardo_image_generation_driver.py | 2 +- .../openai_image_generation_driver.py | 2 +- .../base_image_generation_model_driver.py | 2 +- ...diffusion_image_generation_model_driver.py | 2 +- ...ock_titan_image_generation_model_driver.py | 2 +- .../amazon_bedrock_image_query_driver.py | 2 +- .../anthropic_image_query_driver.py | 2 +- .../azure_openai_image_query_driver.py | 2 +- .../image_query/base_image_query_driver.py | 2 +- .../base_multi_model_image_query_driver.py | 2 +- .../image_query/dummy_image_query_driver.py | 2 +- .../image_query/openai_image_query_driver.py | 2 +- .../base_image_query_model_driver.py | 2 +- ...bedrock_claude_image_query_model_driver.py | 2 +- ...zon_dynamodb_conversation_memory_driver.py | 2 +- .../local_conversation_memory_driver.py | 2 +- .../redis_conversation_memory_driver.py | 2 +- .../prompt/amazon_bedrock_prompt_driver.py | 2 +- .../prompt/amazon_sagemaker_prompt_driver.py | 2 +- .../drivers/prompt/anthropic_prompt_driver.py | 2 +- .../prompt/azure_openai_chat_prompt_driver.py | 2 +- .../azure_openai_completion_prompt_driver.py | 2 +- griptape/drivers/prompt/base_prompt_driver.py | 2 +- .../drivers/prompt/cohere_prompt_driver.py | 2 +- .../drivers/prompt/google_prompt_driver.py | 2 +- .../prompt/huggingface_hub_prompt_driver.py | 2 +- .../huggingface_pipeline_prompt_driver.py | 2 +- .../prompt/openai_chat_prompt_driver.py | 2 +- .../prompt/openai_completion_prompt_driver.py | 2 +- .../prompt_model/base_prompt_model_driver.py | 2 +- .../bedrock_claude_prompt_model_driver.py | 2 +- .../bedrock_jurassic_prompt_model_driver.py | 2 +- .../bedrock_llama_prompt_model_driver.py | 2 +- .../bedrock_titan_prompt_model_driver.py | 2 +- .../sagemaker_falcon_prompt_model_driver.py | 2 +- .../sagemaker_llama_prompt_model_driver.py | 2 +- .../drivers/sql/amazon_redshift_sql_driver.py | 2 +- griptape/drivers/sql/base_sql_driver.py | 2 +- griptape/drivers/sql/snowflake_sql_driver.py | 2 +- griptape/drivers/sql/sql_driver.py | 2 +- .../base_text_to_speech_driver.py | 2 +- .../elevenlabs_text_to_speech_driver.py | 2 +- .../openai_text_to_speech_driver.py | 2 +- .../amazon_opensearch_vector_store_driver.py | 2 +- .../azure_mongodb_vector_store_driver.py | 2 +- .../vector/base_vector_store_driver.py | 2 +- .../vector/local_vector_store_driver.py | 2 +- .../vector/marqo_vector_store_driver.py | 2 +- .../mongodb_atlas_vector_store_driver.py | 2 +- .../vector/opensearch_vector_store_driver.py | 2 +- .../vector/pgvector_vector_store_driver.py | 2 +- .../vector/pinecone_vector_store_driver.py | 2 +- .../vector/redis_vector_store_driver.py | 2 +- .../markdownify_web_scraper_driver.py | 2 +- .../trafilatura_web_scraper_driver.py | 2 +- .../engines/audio/text_to_speech_engine.py | 2 +- .../extraction/base_extraction_engine.py | 2 +- .../extraction/csv_extraction_engine.py | 2 +- .../extraction/json_extraction_engine.py | 2 +- .../image/base_image_generation_engine.py | 2 +- .../inpainting_image_generation_engine.py | 2 +- .../outpainting_image_generation_engine.py | 2 +- .../image/prompt_image_generation_engine.py | 2 +- .../variation_image_generation_engine.py | 2 +- .../engines/image_query/image_query_engine.py | 2 +- griptape/engines/query/base_query_engine.py | 2 +- griptape/engines/query/vector_query_engine.py | 2 +- .../engines/summary/base_summary_engine.py | 2 +- .../engines/summary/prompt_summary_engine.py | 2 +- griptape/events/base_event.py | 2 +- griptape/events/base_image_query_event.py | 2 +- griptape/events/completion_chunk_event.py | 2 +- griptape/events/finish_image_query_event.py | 2 +- .../events/start_image_generation_event.py | 2 +- griptape/events/start_image_query_event.py | 2 +- griptape/events/start_text_to_speech_event.py | 2 +- griptape/loaders/base_loader.py | 2 +- griptape/loaders/blob_loader.py | 2 +- griptape/loaders/csv_loader.py | 2 +- griptape/loaders/dataframe_loader.py | 2 +- griptape/loaders/email_loader.py | 2 +- griptape/loaders/image_loader.py | 2 +- griptape/loaders/pdf_loader.py | 2 +- griptape/loaders/sql_loader.py | 2 +- griptape/loaders/text_loader.py | 2 +- griptape/loaders/web_loader.py | 2 +- .../memory/meta/action_subtask_meta_entry.py | 2 +- griptape/memory/meta/base_meta_entry.py | 2 +- griptape/memory/meta/meta_memory.py | 2 +- .../structure/base_conversation_memory.py | 2 +- .../memory/structure/conversation_memory.py | 2 +- griptape/memory/structure/run.py | 2 +- .../structure/summary_conversation_memory.py | 2 +- .../task/storage/base_artifact_storage.py | 2 +- .../task/storage/blob_artifact_storage.py | 2 +- .../task/storage/text_artifact_storage.py | 2 +- griptape/memory/task/task_memory.py | 2 +- .../mixins/actions_subtask_origin_mixin.py | 2 +- griptape/mixins/activity_mixin.py | 2 +- griptape/mixins/exponential_backoff_mixin.py | 6 +-- .../media_artifact_file_output_mixin.py | 2 +- griptape/mixins/rule_mixin.py | 2 +- griptape/mixins/serializable_mixin.py | 2 +- griptape/rules/rule.py | 2 +- griptape/rules/ruleset.py | 2 +- griptape/structures/agent.py | 2 +- griptape/structures/pipeline.py | 2 +- griptape/structures/workflow.py | 2 +- griptape/tasks/actions_subtask.py | 2 +- griptape/tasks/base_audio_generation_task.py | 2 +- griptape/tasks/base_image_generation_task.py | 2 +- griptape/tasks/base_multi_text_input_task.py | 2 +- griptape/tasks/base_task.py | 2 +- griptape/tasks/base_text_input_task.py | 2 +- griptape/tasks/code_execution_task.py | 2 +- griptape/tasks/csv_extraction_task.py | 2 +- griptape/tasks/extraction_task.py | 2 +- griptape/tasks/image_query_task.py | 2 +- .../tasks/inpainting_image_generation_task.py | 2 +- .../outpainting_image_generation_task.py | 2 +- .../tasks/prompt_image_generation_task.py | 2 +- griptape/tasks/prompt_task.py | 2 +- griptape/tasks/structure_run_task.py | 2 +- griptape/tasks/text_query_task.py | 2 +- griptape/tasks/text_summary_task.py | 2 +- griptape/tasks/text_to_speech_task.py | 2 +- griptape/tasks/tool_task.py | 2 +- griptape/tasks/toolkit_task.py | 2 +- .../tasks/variation_image_generation_task.py | 2 +- griptape/tokenizers/anthropic_tokenizer.py | 2 +- griptape/tokenizers/base_tokenizer.py | 2 +- .../tokenizers/bedrock_claude_tokenizer.py | 2 +- .../tokenizers/bedrock_cohere_tokenizer.py | 2 +- .../tokenizers/bedrock_jurassic_tokenizer.py | 2 +- .../tokenizers/bedrock_llama_tokenizer.py | 2 +- .../tokenizers/bedrock_titan_tokenizer.py | 2 +- griptape/tokenizers/cohere_tokenizer.py | 2 +- griptape/tokenizers/google_tokenizer.py | 2 +- griptape/tokenizers/huggingface_tokenizer.py | 2 +- griptape/tokenizers/openai_tokenizer.py | 2 +- griptape/tokenizers/simple_tokenizer.py | 2 +- griptape/tokenizers/voyageai_tokenizer.py | 2 +- griptape/tools/aws_iam_client/tool.py | 2 +- griptape/tools/aws_s3_client/tool.py | 2 +- griptape/tools/base_aws_client.py | 2 +- griptape/tools/base_google_client.py | 2 +- griptape/tools/base_griptape_cloud_client.py | 2 +- griptape/tools/base_tool.py | 2 +- griptape/tools/computer/tool.py | 2 +- griptape/tools/email_client/tool.py | 2 +- griptape/tools/file_manager/tool.py | 2 +- griptape/tools/google_cal/tool.py | 2 +- griptape/tools/google_docs/tool.py | 2 +- griptape/tools/google_drive/tool.py | 2 +- griptape/tools/google_gmail/tool.py | 2 +- .../tool.py | 2 +- griptape/tools/image_query_client/tool.py | 2 +- griptape/tools/openweather_client/tool.py | 2 +- griptape/tools/rest_api_client/tool.py | 6 +-- griptape/tools/sql_client/tool.py | 2 +- griptape/tools/structure_run_client/tool.py | 2 +- griptape/tools/task_memory_client/tool.py | 2 +- griptape/tools/vector_store_client/tool.py | 2 +- griptape/tools/web_scraper/tool.py | 2 +- griptape/tools/web_search/tool.py | 2 +- griptape/utils/chat.py | 2 +- griptape/utils/command_runner.py | 2 +- griptape/utils/conversation.py | 2 +- griptape/utils/j2.py | 2 +- griptape/utils/prompt_stack.py | 2 +- griptape/utils/python_runner.py | 2 +- griptape/utils/token_counter.py | 2 +- poetry.lock | 39 +++++++++---------- pyproject.toml | 8 +++- tests/mocks/invalid_mock_tool/tool.py | 2 +- tests/mocks/mock_embedding_driver.py | 2 +- tests/mocks/mock_event_listener_driver.py | 2 +- tests/mocks/mock_failing_prompt_driver.py | 4 +- tests/mocks/mock_image_generation_driver.py | 2 +- tests/mocks/mock_image_generation_task.py | 2 +- tests/mocks/mock_image_query_driver.py | 2 +- tests/mocks/mock_multi_text_input_task.py | 2 +- tests/mocks/mock_prompt_driver.py | 3 +- tests/mocks/mock_task.py | 2 +- tests/mocks/mock_text_input_task.py | 2 +- tests/mocks/mock_tokenizer.py | 2 +- tests/mocks/mock_tool/tool.py | 2 +- tests/mocks/mock_value_prompt_driver.py | 2 +- .../artifacts/test_base_media_artifact.py | 2 +- tests/utils/structure_tester.py | 2 +- 227 files changed, 257 insertions(+), 251 deletions(-) diff --git a/griptape/artifacts/audio_artifact.py b/griptape/artifacts/audio_artifact.py index b6d4667e4..3dc67fa36 100644 --- a/griptape/artifacts/audio_artifact.py +++ b/griptape/artifacts/audio_artifact.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define +from attrs import define from griptape.artifacts import MediaArtifact diff --git a/griptape/artifacts/base_artifact.py b/griptape/artifacts/base_artifact.py index daaa32c4f..a7a1811ea 100644 --- a/griptape/artifacts/base_artifact.py +++ b/griptape/artifacts/base_artifact.py @@ -4,7 +4,7 @@ import json import uuid from abc import ABC, abstractmethod -from attr import define, field, Factory +from attrs import define, field, Factory @define() diff --git a/griptape/artifacts/blob_artifact.py b/griptape/artifacts/blob_artifact.py index 7b5173736..5d2f32272 100644 --- a/griptape/artifacts/blob_artifact.py +++ b/griptape/artifacts/blob_artifact.py @@ -1,7 +1,7 @@ from __future__ import annotations import os.path from typing import Optional -from attr import field, define +from attrs import field, define from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/csv_row_artifact.py b/griptape/artifacts/csv_row_artifact.py index 14fc1c0f9..7572b7a2f 100644 --- a/griptape/artifacts/csv_row_artifact.py +++ b/griptape/artifacts/csv_row_artifact.py @@ -1,7 +1,7 @@ from __future__ import annotations import csv import io -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, BaseArtifact diff --git a/griptape/artifacts/error_artifact.py b/griptape/artifacts/error_artifact.py index f2fb02a8f..1900002b3 100644 --- a/griptape/artifacts/error_artifact.py +++ b/griptape/artifacts/error_artifact.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/image_artifact.py b/griptape/artifacts/image_artifact.py index 068cf6d00..e963b3881 100644 --- a/griptape/artifacts/image_artifact.py +++ b/griptape/artifacts/image_artifact.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import MediaArtifact diff --git a/griptape/artifacts/info_artifact.py b/griptape/artifacts/info_artifact.py index 19b50a043..3692e9631 100644 --- a/griptape/artifacts/info_artifact.py +++ b/griptape/artifacts/info_artifact.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 3a8c93d50..558f32432 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -1,6 +1,6 @@ from typing import Optional from collections.abc import Sequence -from attr import field, define +from attrs import field, define from griptape.artifacts import BaseArtifact diff --git a/griptape/artifacts/media_artifact.py b/griptape/artifacts/media_artifact.py index dc78ea352..92cc0d9cd 100644 --- a/griptape/artifacts/media_artifact.py +++ b/griptape/artifacts/media_artifact.py @@ -5,7 +5,7 @@ import random from typing import Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import BlobArtifact import base64 diff --git a/griptape/artifacts/text_artifact.py b/griptape/artifacts/text_artifact.py index ef0567d03..e8a2bb2a7 100644 --- a/griptape/artifacts/text_artifact.py +++ b/griptape/artifacts/text_artifact.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact if TYPE_CHECKING: diff --git a/griptape/chunkers/base_chunker.py b/griptape/chunkers/base_chunker.py index c9700a91f..f2cc452ad 100644 --- a/griptape/chunkers/base_chunker.py +++ b/griptape/chunkers/base_chunker.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC from typing import Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.chunkers import ChunkSeparator from griptape.tokenizers import BaseTokenizer, OpenAiTokenizer diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index d716205c8..a94cf75d9 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -3,7 +3,7 @@ from abc import ABC from typing import Optional -from attr import define, field +from attrs import define, field from griptape.config import BaseConfig from griptape.drivers import ( diff --git a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py index e3161b38a..15ce67c4c 100644 --- a/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_cohere_embedding_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import json from typing import Any, TYPE_CHECKING -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import BedrockCohereTokenizer from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py index f3e0cb7f7..a510c618c 100644 --- a/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_bedrock_titan_embedding_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import json from typing import Any, TYPE_CHECKING -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import BedrockTitanTokenizer from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py b/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py index 376836bbd..4ab6d2bf7 100644 --- a/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py +++ b/griptape/drivers/embedding/amazon_sagemaker_embedding_driver.py @@ -3,7 +3,7 @@ import json from typing import Any -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.drivers import BaseMultiModelEmbeddingDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/azure_openai_embedding_driver.py b/griptape/drivers/embedding/azure_openai_embedding_driver.py index f2c3b8d39..c92197e9b 100644 --- a/griptape/drivers/embedding/azure_openai_embedding_driver.py +++ b/griptape/drivers/embedding/azure_openai_embedding_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Callable, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import OpenAiEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer import openai diff --git a/griptape/drivers/embedding/base_embedding_driver.py b/griptape/drivers/embedding/base_embedding_driver.py index 6f74b9306..0fcc05fc1 100644 --- a/griptape/drivers/embedding/base_embedding_driver.py +++ b/griptape/drivers/embedding/base_embedding_driver.py @@ -2,7 +2,7 @@ import numpy as np from typing import Optional from abc import ABC, abstractmethod -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.mixins import ExponentialBackoffMixin from griptape.tokenizers import BaseTokenizer diff --git a/griptape/drivers/embedding/base_multi_model_embedding_driver.py b/griptape/drivers/embedding/base_multi_model_embedding_driver.py index 792c13c4b..90f827ad2 100644 --- a/griptape/drivers/embedding/base_multi_model_embedding_driver.py +++ b/griptape/drivers/embedding/base_multi_model_embedding_driver.py @@ -2,7 +2,7 @@ from abc import ABC from typing import TYPE_CHECKING -from attr import define, field +from attrs import define, field from griptape.drivers import BaseEmbeddingDriver diff --git a/griptape/drivers/embedding/google_embedding_driver.py b/griptape/drivers/embedding/google_embedding_driver.py index 3467d3360..884a40c3c 100644 --- a/griptape/drivers/embedding/google_embedding_driver.py +++ b/griptape/drivers/embedding/google_embedding_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define, field +from attrs import define, field from griptape.drivers import BaseEmbeddingDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py index 8e90513cc..71abef81f 100644 --- a/griptape/drivers/embedding/huggingface_hub_embedding_driver.py +++ b/griptape/drivers/embedding/huggingface_hub_embedding_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from griptape.utils import import_optional_dependency -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver if TYPE_CHECKING: diff --git a/griptape/drivers/embedding/openai_embedding_driver.py b/griptape/drivers/embedding/openai_embedding_driver.py index 676a6209b..089875c1a 100644 --- a/griptape/drivers/embedding/openai_embedding_driver.py +++ b/griptape/drivers/embedding/openai_embedding_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import OpenAiTokenizer import openai diff --git a/griptape/drivers/embedding/voyageai_embedding_driver.py b/griptape/drivers/embedding/voyageai_embedding_driver.py index 1f1779b50..0cfac6fda 100644 --- a/griptape/drivers/embedding/voyageai_embedding_driver.py +++ b/griptape/drivers/embedding/voyageai_embedding_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional, Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.utils import import_optional_dependency from griptape.drivers import BaseEmbeddingDriver from griptape.tokenizers import VoyageAiTokenizer diff --git a/griptape/drivers/embedding_model/base_embedding_model_driver.py b/griptape/drivers/embedding_model/base_embedding_model_driver.py index d2b169495..ad7bf3bda 100644 --- a/griptape/drivers/embedding_model/base_embedding_model_driver.py +++ b/griptape/drivers/embedding_model/base_embedding_model_driver.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from abc import ABC, abstractmethod diff --git a/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py b/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py index 602902c3f..dceffcd8a 100644 --- a/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py +++ b/griptape/drivers/embedding_model/sagemaker_huggingface_embedding_model_driver.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.drivers import BaseEmbeddingModelDriver diff --git a/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py b/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py index 1b509a698..9d9632fb0 100644 --- a/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py +++ b/griptape/drivers/embedding_model/sagemaker_tensorflow_hub_embedding_model_driver.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.drivers import BaseEmbeddingModelDriver diff --git a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py index 1c8132b67..4c632cb01 100644 --- a/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py +++ b/griptape/drivers/event_listener/amazon_sqs_event_listener_driver.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Any -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py index c4fd72084..3b014aed4 100644 --- a/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py +++ b/griptape/drivers/event_listener/aws_iot_core_event_listener_driver.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Any -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/event_listener/base_event_listener_driver.py b/griptape/drivers/event_listener/base_event_listener_driver.py index 9ff18cf4f..b6d2d9b12 100644 --- a/griptape/drivers/event_listener/base_event_listener_driver.py +++ b/griptape/drivers/event_listener/base_event_listener_driver.py @@ -4,7 +4,7 @@ from concurrent import futures from logging import Logger -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.events import BaseEvent diff --git a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py index 2c4149ae7..c481d3081 100644 --- a/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py +++ b/griptape/drivers/event_listener/griptape_cloud_event_listener_driver.py @@ -4,7 +4,7 @@ import requests from urllib.parse import urljoin -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver diff --git a/griptape/drivers/event_listener/webhook_event_listener_driver.py b/griptape/drivers/event_listener/webhook_event_listener_driver.py index 242e5428a..a0eb5ab5f 100644 --- a/griptape/drivers/event_listener/webhook_event_listener_driver.py +++ b/griptape/drivers/event_listener/webhook_event_listener_driver.py @@ -2,7 +2,7 @@ import requests -from attr import define, field +from attrs import define, field from griptape.drivers.event_listener.base_event_listener_driver import BaseEventListenerDriver diff --git a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py index cbf2109ef..bdb4d787c 100644 --- a/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py +++ b/griptape/drivers/file_manager/amazon_s3_file_manager_driver.py @@ -2,7 +2,7 @@ import os from pathlib import Path from typing import TYPE_CHECKING, Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.utils.import_utils import import_optional_dependency from .base_file_manager_driver import BaseFileManagerDriver diff --git a/griptape/drivers/file_manager/base_file_manager_driver.py b/griptape/drivers/file_manager/base_file_manager_driver.py index 1cff06d06..56f19b3cc 100644 --- a/griptape/drivers/file_manager/base_file_manager_driver.py +++ b/griptape/drivers/file_manager/base_file_manager_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.artifacts import BaseArtifact, ErrorArtifact, TextArtifact, InfoArtifact, ListArtifact import griptape.loaders as loaders diff --git a/griptape/drivers/file_manager/local_file_manager_driver.py b/griptape/drivers/file_manager/local_file_manager_driver.py index 96766fa9a..186296aa3 100644 --- a/griptape/drivers/file_manager/local_file_manager_driver.py +++ b/griptape/drivers/file_manager/local_file_manager_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import os from pathlib import Path -from attr import define, field, Factory +from attrs import define, field, Factory from .base_file_manager_driver import BaseFileManagerDriver diff --git a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py index e3e72d55e..2edb9f862 100644 --- a/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py +++ b/griptape/drivers/image_generation/amazon_bedrock_image_generation_driver.py @@ -3,7 +3,7 @@ import json from typing import TYPE_CHECKING, Any, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ImageArtifact from griptape.drivers import BaseMultiModelImageGenerationDriver diff --git a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py index f6cbbe1a9..b631703d8 100644 --- a/griptape/drivers/image_generation/azure_openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/azure_openai_image_generation_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations import openai -from attr import field, Factory, define +from attrs import field, Factory, define from typing import Callable, Optional from griptape.drivers import OpenAiImageGenerationDriver diff --git a/griptape/drivers/image_generation/base_image_generation_driver.py b/griptape/drivers/image_generation/base_image_generation_driver.py index 771fc30dc..dbe42442f 100644 --- a/griptape/drivers/image_generation/base_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_image_generation_driver.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import ImageArtifact from griptape.events import StartImageGenerationEvent, FinishImageGenerationEvent diff --git a/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py b/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py index 9b1bb9932..12c2fbef5 100644 --- a/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py +++ b/griptape/drivers/image_generation/base_multi_model_image_generation_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC -from attr import field, define +from attrs import field, define from griptape.drivers import BaseImageGenerationDriver, BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_generation/leonardo_image_generation_driver.py b/griptape/drivers/image_generation/leonardo_image_generation_driver.py index c41b15d97..d274970ee 100644 --- a/griptape/drivers/image_generation/leonardo_image_generation_driver.py +++ b/griptape/drivers/image_generation/leonardo_image_generation_driver.py @@ -3,7 +3,7 @@ from typing import Optional, Literal import requests -from attr import field, define, Factory +from attrs import field, define, Factory from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver diff --git a/griptape/drivers/image_generation/openai_image_generation_driver.py b/griptape/drivers/image_generation/openai_image_generation_driver.py index 327132f64..abc961e3d 100644 --- a/griptape/drivers/image_generation/openai_image_generation_driver.py +++ b/griptape/drivers/image_generation/openai_image_generation_driver.py @@ -5,7 +5,7 @@ import openai from openai.types.images_response import ImagesResponse -from attr import field, Factory, define +from attrs import field, Factory, define from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationDriver diff --git a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py index 328bbf4d7..803863319 100644 --- a/griptape/drivers/image_generation_model/base_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/base_image_generation_model_driver.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from typing import Any, Optional -from attr import define +from attrs import define from griptape.artifacts import ImageArtifact from griptape.mixins import SerializableMixin diff --git a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py index 5018b42e4..03d593eac 100644 --- a/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_stable_diffusion_image_generation_model_driver.py @@ -4,7 +4,7 @@ import logging from typing import Optional -from attr import field, define +from attrs import field, define from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py index 8602b386b..2f4577aa7 100644 --- a/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py +++ b/griptape/drivers/image_generation_model/bedrock_titan_image_generation_model_driver.py @@ -3,7 +3,7 @@ import base64 from typing import Any, Optional -from attr import field, define +from attrs import field, define from griptape.artifacts import ImageArtifact from griptape.drivers import BaseImageGenerationModelDriver diff --git a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py index a5a7c6f15..eabe9d27e 100644 --- a/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py +++ b/griptape/drivers/image_query/amazon_bedrock_image_query_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseMultiModelImageQueryDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/image_query/anthropic_image_query_driver.py b/griptape/drivers/image_query/anthropic_image_query_driver.py index cfb1a1d48..aca06ac2f 100644 --- a/griptape/drivers/image_query/anthropic_image_query_driver.py +++ b/griptape/drivers/image_query/anthropic_image_query_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional, Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/image_query/azure_openai_image_query_driver.py b/griptape/drivers/image_query/azure_openai_image_query_driver.py index 017c98f1f..f59c64823 100644 --- a/griptape/drivers/image_query/azure_openai_image_query_driver.py +++ b/griptape/drivers/image_query/azure_openai_image_query_driver.py @@ -2,7 +2,7 @@ from typing import Callable, Optional -from attr import define, field, Factory +from attrs import define, field, Factory import openai from griptape.drivers.image_query.openai_image_query_driver import OpenAiImageQueryDriver diff --git a/griptape/drivers/image_query/base_image_query_driver.py b/griptape/drivers/image_query/base_image_query_driver.py index 8f7425732..8944dd931 100644 --- a/griptape/drivers/image_query/base_image_query_driver.py +++ b/griptape/drivers/image_query/base_image_query_driver.py @@ -3,7 +3,7 @@ from abc import abstractmethod, ABC from typing import Optional, TYPE_CHECKING -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, ImageArtifact from griptape.events import StartImageQueryEvent, FinishImageQueryEvent diff --git a/griptape/drivers/image_query/base_multi_model_image_query_driver.py b/griptape/drivers/image_query/base_multi_model_image_query_driver.py index 07d5b7c27..d801fd917 100644 --- a/griptape/drivers/image_query/base_multi_model_image_query_driver.py +++ b/griptape/drivers/image_query/base_multi_model_image_query_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC -from attr import field, define +from attrs import field, define from griptape.drivers import BaseImageQueryDriver, BaseImageQueryModelDriver diff --git a/griptape/drivers/image_query/dummy_image_query_driver.py b/griptape/drivers/image_query/dummy_image_query_driver.py index ebf579dd4..ddc6e2318 100644 --- a/griptape/drivers/image_query/dummy_image_query_driver.py +++ b/griptape/drivers/image_query/dummy_image_query_driver.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, ImageArtifact from griptape.drivers import BaseImageQueryDriver diff --git a/griptape/drivers/image_query/openai_image_query_driver.py b/griptape/drivers/image_query/openai_image_query_driver.py index 515bdcc7c..8b0020c2c 100644 --- a/griptape/drivers/image_query/openai_image_query_driver.py +++ b/griptape/drivers/image_query/openai_image_query_driver.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from openai.types.chat import ( ChatCompletionUserMessageParam, ChatCompletionContentPartParam, diff --git a/griptape/drivers/image_query_model/base_image_query_model_driver.py b/griptape/drivers/image_query_model/base_image_query_model_driver.py index 9bddbb979..746a9f84c 100644 --- a/griptape/drivers/image_query_model/base_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/base_image_query_model_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from attr import define +from attrs import define from griptape.artifacts import TextArtifact, ImageArtifact from griptape.mixins import SerializableMixin diff --git a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py index df7dd326a..3d3ca0164 100644 --- a/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py +++ b/griptape/drivers/image_query_model/bedrock_claude_image_query_model_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define +from attrs import define from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryModelDriver diff --git a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py index 545ad559b..87c3667fe 100644 --- a/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/amazon_dynamodb_conversation_memory_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional, TYPE_CHECKING, Any from griptape.utils import import_optional_dependency from griptape.drivers import BaseConversationMemoryDriver diff --git a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py index b22c1c896..9e3f4ffc9 100644 --- a/griptape/drivers/memory/conversation/local_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/local_conversation_memory_driver.py @@ -1,5 +1,5 @@ import os -from attr import define, field +from attrs import define, field from typing import Optional from griptape.drivers import BaseConversationMemoryDriver from griptape.memory.structure import BaseConversationMemory diff --git a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py index 0531d5f9d..3de8737b8 100644 --- a/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py +++ b/griptape/drivers/memory/conversation/redis_conversation_memory_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations import uuid -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional, TYPE_CHECKING from griptape.drivers import BaseConversationMemoryDriver from griptape.memory.structure import BaseConversationMemory diff --git a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py index b645da39a..0675e7f92 100644 --- a/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_bedrock_prompt_driver.py @@ -2,7 +2,7 @@ import json from typing import TYPE_CHECKING, Any from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.utils import import_optional_dependency from .base_multi_model_prompt_driver import BaseMultiModelPromptDriver diff --git a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py b/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py index bca558c72..342faf909 100644 --- a/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py +++ b/griptape/drivers/prompt/amazon_sagemaker_prompt_driver.py @@ -2,7 +2,7 @@ import json from typing import TYPE_CHECKING, Any from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.utils import import_optional_dependency from .base_multi_model_prompt_driver import BaseMultiModelPromptDriver diff --git a/griptape/drivers/prompt/anthropic_prompt_driver.py b/griptape/drivers/prompt/anthropic_prompt_driver.py index 35b411ac5..486233643 100644 --- a/griptape/drivers/prompt/anthropic_prompt_driver.py +++ b/griptape/drivers/prompt/anthropic_prompt_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional, Any from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.utils import PromptStack, import_optional_dependency from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py index 0583369c4..41c91cb65 100644 --- a/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_chat_prompt_driver.py @@ -1,4 +1,4 @@ -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Callable, Optional from griptape.utils import PromptStack from griptape.drivers import OpenAiChatPromptDriver diff --git a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py index 89f2651ef..4ff2a4902 100644 --- a/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/azure_openai_completion_prompt_driver.py @@ -1,5 +1,5 @@ from typing import Callable, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import OpenAiCompletionPromptDriver import openai diff --git a/griptape/drivers/prompt/base_prompt_driver.py b/griptape/drivers/prompt/base_prompt_driver.py index ef6a35bcf..096035f8b 100644 --- a/griptape/drivers/prompt/base_prompt_driver.py +++ b/griptape/drivers/prompt/base_prompt_driver.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional, Callable from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.events import StartPromptEvent, FinishPromptEvent, CompletionChunkEvent from griptape.mixins.serializable_mixin import SerializableMixin from griptape.utils import PromptStack diff --git a/griptape/drivers/prompt/cohere_prompt_driver.py b/griptape/drivers/prompt/cohere_prompt_driver.py index 07ae7717d..2f85c49bf 100644 --- a/griptape/drivers/prompt/cohere_prompt_driver.py +++ b/griptape/drivers/prompt/cohere_prompt_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver from griptape.tokenizers import CohereTokenizer diff --git a/griptape/drivers/prompt/google_prompt_driver.py b/griptape/drivers/prompt/google_prompt_driver.py index b576a440b..9f833c035 100644 --- a/griptape/drivers/prompt/google_prompt_driver.py +++ b/griptape/drivers/prompt/google_prompt_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from collections.abc import Iterator from typing import TYPE_CHECKING, Optional, Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.utils import PromptStack, import_optional_dependency from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py index a1a6f31d5..062672aa8 100644 --- a/griptape/drivers/prompt/huggingface_hub_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_hub_prompt_driver.py @@ -3,7 +3,7 @@ from collections.abc import Iterator from typing import TYPE_CHECKING -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py index 9fb8b9ece..bde6d5e4e 100644 --- a/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py +++ b/griptape/drivers/prompt/huggingface_pipeline_prompt_driver.py @@ -1,6 +1,6 @@ from collections.abc import Iterator -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.artifacts import TextArtifact from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt/openai_chat_prompt_driver.py b/griptape/drivers/prompt/openai_chat_prompt_driver.py index eee6e2d97..3d19063d3 100644 --- a/griptape/drivers/prompt/openai_chat_prompt_driver.py +++ b/griptape/drivers/prompt/openai_chat_prompt_driver.py @@ -2,7 +2,7 @@ from typing import Optional, Any, Literal from collections.abc import Iterator import openai -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt/openai_completion_prompt_driver.py b/griptape/drivers/prompt/openai_completion_prompt_driver.py index 92ae4f36f..1a738a487 100644 --- a/griptape/drivers/prompt/openai_completion_prompt_driver.py +++ b/griptape/drivers/prompt/openai_completion_prompt_driver.py @@ -1,6 +1,6 @@ from typing import Optional from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt_model/base_prompt_model_driver.py b/griptape/drivers/prompt_model/base_prompt_model_driver.py index 9738127db..de9b6b6d6 100644 --- a/griptape/drivers/prompt_model/base_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/base_prompt_model_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC, abstractmethod from typing import Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver diff --git a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py index 1233a8f04..032940d66 100644 --- a/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_claude_prompt_model_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional import json -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptModelDriver, AmazonBedrockPromptDriver diff --git a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py index 47d9f1199..3b51eef1c 100644 --- a/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_jurassic_prompt_model_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional import json -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptModelDriver diff --git a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py index ae7de03eb..6c6dab1d2 100644 --- a/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_llama_prompt_model_driver.py @@ -2,7 +2,7 @@ import json import itertools as it from typing import Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptModelDriver diff --git a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py b/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py index 5e03e491a..00621416a 100644 --- a/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/bedrock_titan_prompt_model_driver.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional import json -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack from griptape.drivers import BasePromptModelDriver diff --git a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py index 0fd50386b..a6859f13c 100644 --- a/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/sagemaker_falcon_prompt_model_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack, import_optional_dependency from griptape.drivers import BasePromptModelDriver diff --git a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py b/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py index 31f22427d..7864a70a8 100644 --- a/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py +++ b/griptape/drivers/prompt_model/sagemaker_llama_prompt_model_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.utils import PromptStack, import_optional_dependency from griptape.drivers import BasePromptModelDriver diff --git a/griptape/drivers/sql/amazon_redshift_sql_driver.py b/griptape/drivers/sql/amazon_redshift_sql_driver.py index 51acbfa04..e6ec8b2b9 100644 --- a/griptape/drivers/sql/amazon_redshift_sql_driver.py +++ b/griptape/drivers/sql/amazon_redshift_sql_driver.py @@ -2,7 +2,7 @@ import time from typing import Optional, TYPE_CHECKING, Any from griptape.drivers import BaseSqlDriver -from attr import Factory, define, field +from attrs import Factory, define, field if TYPE_CHECKING: import boto3 diff --git a/griptape/drivers/sql/base_sql_driver.py b/griptape/drivers/sql/base_sql_driver.py index 95d1d0fa2..564746389 100644 --- a/griptape/drivers/sql/base_sql_driver.py +++ b/griptape/drivers/sql/base_sql_driver.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Optional, Any -from attr import define +from attrs import define @define diff --git a/griptape/drivers/sql/snowflake_sql_driver.py b/griptape/drivers/sql/snowflake_sql_driver.py index c4519b6c8..4c85ab3a3 100644 --- a/griptape/drivers/sql/snowflake_sql_driver.py +++ b/griptape/drivers/sql/snowflake_sql_driver.py @@ -2,7 +2,7 @@ from typing import Callable, Optional, TYPE_CHECKING, Any from griptape.utils import import_optional_dependency from griptape.drivers import BaseSqlDriver -from attr import Factory, define, field +from attrs import Factory, define, field if TYPE_CHECKING: from sqlalchemy.engine import Engine diff --git a/griptape/drivers/sql/sql_driver.py b/griptape/drivers/sql/sql_driver.py index ad6d5637c..a789a90c3 100644 --- a/griptape/drivers/sql/sql_driver.py +++ b/griptape/drivers/sql/sql_driver.py @@ -2,7 +2,7 @@ from typing import Optional, TYPE_CHECKING, Any from griptape.drivers import BaseSqlDriver from griptape.utils import import_optional_dependency -from attr import define, field +from attrs import define, field if TYPE_CHECKING: from sqlalchemy.engine import Engine diff --git a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py index e1365a69f..4f6dbcf25 100644 --- a/griptape/drivers/text_to_speech/base_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/base_text_to_speech_driver.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.events.finish_text_to_speech_event import FinishTextToSpeechEvent diff --git a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py index cf342b87b..02d55c023 100644 --- a/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/elevenlabs_text_to_speech_driver.py @@ -2,7 +2,7 @@ from typing import Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py index e6022b29d..2d6e7b155 100644 --- a/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py +++ b/griptape/drivers/text_to_speech/openai_text_to_speech_driver.py @@ -3,7 +3,7 @@ from typing import Optional, Literal import openai -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py index 15ff16546..668f89b7e 100644 --- a/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/amazon_opensearch_vector_store_driver.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional, TYPE_CHECKING from griptape.drivers import OpenSearchVectorStoreDriver from griptape.utils import import_optional_dependency, str_to_hash diff --git a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py index 47eb7d0d1..2e9968b63 100644 --- a/griptape/drivers/vector/azure_mongodb_vector_store_driver.py +++ b/griptape/drivers/vector/azure_mongodb_vector_store_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define +from attrs import define from griptape.drivers import BaseVectorStoreDriver, MongoDbAtlasVectorStoreDriver diff --git a/griptape/drivers/vector/base_vector_store_driver.py b/griptape/drivers/vector/base_vector_store_driver.py index 0667df8a9..55a758da1 100644 --- a/griptape/drivers/vector/base_vector_store_driver.py +++ b/griptape/drivers/vector/base_vector_store_driver.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from concurrent import futures from dataclasses import dataclass -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional from griptape import utils from griptape.mixins import SerializableMixin diff --git a/griptape/drivers/vector/local_vector_store_driver.py b/griptape/drivers/vector/local_vector_store_driver.py index bea8dc579..4b9dae00f 100644 --- a/griptape/drivers/vector/local_vector_store_driver.py +++ b/griptape/drivers/vector/local_vector_store_driver.py @@ -3,7 +3,7 @@ from numpy.linalg import norm from griptape import utils from griptape.drivers import BaseVectorStoreDriver -from attr import define, field +from attrs import define, field @define diff --git a/griptape/drivers/vector/marqo_vector_store_driver.py b/griptape/drivers/vector/marqo_vector_store_driver.py index 100c75d79..cccc716f8 100644 --- a/griptape/drivers/vector/marqo_vector_store_driver.py +++ b/griptape/drivers/vector/marqo_vector_store_driver.py @@ -3,7 +3,7 @@ from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver from griptape.artifacts import TextArtifact -from attr import define, field, Factory +from attrs import define, field, Factory if TYPE_CHECKING: import marqo diff --git a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py index df47dc5e1..c5368de3d 100644 --- a/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py +++ b/griptape/drivers/vector/mongodb_atlas_vector_store_driver.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/vector/opensearch_vector_store_driver.py b/griptape/drivers/vector/opensearch_vector_store_driver.py index 41bae7254..7ff00d2de 100644 --- a/griptape/drivers/vector/opensearch_vector_store_driver.py +++ b/griptape/drivers/vector/opensearch_vector_store_driver.py @@ -4,7 +4,7 @@ import logging from griptape.utils import import_optional_dependency from griptape.drivers import BaseVectorStoreDriver -from attr import define, field, Factory +from attrs import define, field, Factory if TYPE_CHECKING: from opensearchpy import OpenSearch diff --git a/griptape/drivers/vector/pgvector_vector_store_driver.py b/griptape/drivers/vector/pgvector_vector_store_driver.py index 29d5afb67..8058c8774 100644 --- a/griptape/drivers/vector/pgvector_vector_store_driver.py +++ b/griptape/drivers/vector/pgvector_vector_store_driver.py @@ -1,6 +1,6 @@ import uuid from typing import Optional, Any, cast -from attr import define, field, Factory +from attrs import define, field, Factory from dataclasses import dataclass from griptape.drivers import BaseVectorStoreDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/vector/pinecone_vector_store_driver.py b/griptape/drivers/vector/pinecone_vector_store_driver.py index 7b573ed68..daf378087 100644 --- a/griptape/drivers/vector/pinecone_vector_store_driver.py +++ b/griptape/drivers/vector/pinecone_vector_store_driver.py @@ -2,7 +2,7 @@ from typing import Optional, TYPE_CHECKING, Any from griptape.utils import str_to_hash, import_optional_dependency from griptape.drivers import BaseVectorStoreDriver -from attr import define, field +from attrs import define, field if TYPE_CHECKING: import pinecone diff --git a/griptape/drivers/vector/redis_vector_store_driver.py b/griptape/drivers/vector/redis_vector_store_driver.py index b347bfa41..6e39775b7 100644 --- a/griptape/drivers/vector/redis_vector_store_driver.py +++ b/griptape/drivers/vector/redis_vector_store_driver.py @@ -4,7 +4,7 @@ import numpy as np from griptape.utils import import_optional_dependency, str_to_hash from typing import Optional, TYPE_CHECKING -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BaseVectorStoreDriver logging.basicConfig(level=logging.WARNING) diff --git a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py index 3b4931579..eb33aeb19 100644 --- a/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/markdownify_web_scraper_driver.py @@ -1,6 +1,6 @@ import re from typing import Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.drivers import BaseWebScraperDriver from griptape.utils import import_optional_dependency diff --git a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py index 787dd24d7..cc0ca3a18 100644 --- a/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py +++ b/griptape/drivers/web_scraper/trafilatura_web_scraper_driver.py @@ -1,6 +1,6 @@ import json import logging -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.drivers import BaseWebScraperDriver from griptape.utils import import_optional_dependency diff --git a/griptape/engines/audio/text_to_speech_engine.py b/griptape/engines/audio/text_to_speech_engine.py index 29118848e..634837d82 100644 --- a/griptape/engines/audio/text_to_speech_engine.py +++ b/griptape/engines/audio/text_to_speech_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.drivers import BaseTextToSpeechDriver diff --git a/griptape/engines/extraction/base_extraction_engine.py b/griptape/engines/extraction/base_extraction_engine.py index 760a77d39..e8bd29129 100644 --- a/griptape/engines/extraction/base_extraction_engine.py +++ b/griptape/engines/extraction/base_extraction_engine.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional from abc import ABC, abstractmethod -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ListArtifact, ErrorArtifact from griptape.chunkers import BaseChunker, TextChunker from griptape.drivers import BasePromptDriver diff --git a/griptape/engines/extraction/csv_extraction_engine.py b/griptape/engines/extraction/csv_extraction_engine.py index 696abd6d3..fe4d0e6c7 100644 --- a/griptape/engines/extraction/csv_extraction_engine.py +++ b/griptape/engines/extraction/csv_extraction_engine.py @@ -2,7 +2,7 @@ from typing import Optional, cast import csv import io -from attr import field, Factory, define +from attrs import field, Factory, define from griptape.artifacts import TextArtifact, CsvRowArtifact, ListArtifact, ErrorArtifact from griptape.utils import PromptStack from griptape.engines import BaseExtractionEngine diff --git a/griptape/engines/extraction/json_extraction_engine.py b/griptape/engines/extraction/json_extraction_engine.py index e14e40d5a..05db19d40 100644 --- a/griptape/engines/extraction/json_extraction_engine.py +++ b/griptape/engines/extraction/json_extraction_engine.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional, cast import json -from attr import field, Factory, define +from attrs import field, Factory, define from griptape.artifacts import TextArtifact, ListArtifact, ErrorArtifact from griptape.engines import BaseExtractionEngine from griptape.utils import J2 diff --git a/griptape/engines/image/base_image_generation_engine.py b/griptape/engines/image/base_image_generation_engine.py index 73dd5ac74..2c65c1a60 100644 --- a/griptape/engines/image/base_image_generation_engine.py +++ b/griptape/engines/image/base_image_generation_engine.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC, abstractmethod -from attr import field, define +from attrs import field, define from typing import Optional from griptape.artifacts import ImageArtifact diff --git a/griptape/engines/image/inpainting_image_generation_engine.py b/griptape/engines/image/inpainting_image_generation_engine.py index 3f1295866..7fb83d66f 100644 --- a/griptape/engines/image/inpainting_image_generation_engine.py +++ b/griptape/engines/image/inpainting_image_generation_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define +from attrs import define from typing import Optional from griptape.engines import BaseImageGenerationEngine diff --git a/griptape/engines/image/outpainting_image_generation_engine.py b/griptape/engines/image/outpainting_image_generation_engine.py index 0d4008543..135e3c77d 100644 --- a/griptape/engines/image/outpainting_image_generation_engine.py +++ b/griptape/engines/image/outpainting_image_generation_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define +from attrs import define from typing import Optional from griptape.artifacts import ImageArtifact diff --git a/griptape/engines/image/prompt_image_generation_engine.py b/griptape/engines/image/prompt_image_generation_engine.py index c7d304beb..4b4a9ce63 100644 --- a/griptape/engines/image/prompt_image_generation_engine.py +++ b/griptape/engines/image/prompt_image_generation_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define +from attrs import define from typing import Optional from griptape.rules import Ruleset diff --git a/griptape/engines/image/variation_image_generation_engine.py b/griptape/engines/image/variation_image_generation_engine.py index e07a6fc9d..7b932ac2a 100644 --- a/griptape/engines/image/variation_image_generation_engine.py +++ b/griptape/engines/image/variation_image_generation_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define +from attrs import define from typing import Optional from griptape.engines import BaseImageGenerationEngine diff --git a/griptape/engines/image_query/image_query_engine.py b/griptape/engines/image_query/image_query_engine.py index 4cbac9755..9cb61cd92 100644 --- a/griptape/engines/image_query/image_query_engine.py +++ b/griptape/engines/image_query/image_query_engine.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver diff --git a/griptape/engines/query/base_query_engine.py b/griptape/engines/query/base_query_engine.py index 9477b3bd0..61a488547 100644 --- a/griptape/engines/query/base_query_engine.py +++ b/griptape/engines/query/base_query_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from attr import define +from attrs import define from typing import Optional from griptape.artifacts import TextArtifact, ListArtifact from griptape.rules import Ruleset diff --git a/griptape/engines/query/vector_query_engine.py b/griptape/engines/query/vector_query_engine.py index 34667d592..adfa4b2db 100644 --- a/griptape/engines/query/vector_query_engine.py +++ b/griptape/engines/query/vector_query_engine.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact from griptape.utils import PromptStack from griptape.engines import BaseQueryEngine diff --git a/griptape/engines/summary/base_summary_engine.py b/griptape/engines/summary/base_summary_engine.py index 4a5aca520..26a5cd46d 100644 --- a/griptape/engines/summary/base_summary_engine.py +++ b/griptape/engines/summary/base_summary_engine.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from typing import Optional -from attr import define +from attrs import define from griptape.artifacts import TextArtifact, ListArtifact from griptape.rules import Ruleset diff --git a/griptape/engines/summary/prompt_summary_engine.py b/griptape/engines/summary/prompt_summary_engine.py index bb74cfd6f..0da99cb0a 100644 --- a/griptape/engines/summary/prompt_summary_engine.py +++ b/griptape/engines/summary/prompt_summary_engine.py @@ -1,5 +1,5 @@ from typing import Optional, cast -from attr import define, Factory, field +from attrs import define, Factory, field from griptape.artifacts import TextArtifact, ListArtifact from griptape.chunkers import BaseChunker, TextChunker from griptape.utils import PromptStack diff --git a/griptape/events/base_event.py b/griptape/events/base_event.py index 48a48890e..9ab8e6c47 100644 --- a/griptape/events/base_event.py +++ b/griptape/events/base_event.py @@ -4,7 +4,7 @@ import uuid from abc import ABC -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.mixins import SerializableMixin diff --git a/griptape/events/base_image_query_event.py b/griptape/events/base_image_query_event.py index 8ed796072..b634f2bf0 100644 --- a/griptape/events/base_image_query_event.py +++ b/griptape/events/base_image_query_event.py @@ -1,6 +1,6 @@ from abc import ABC -from attr import define +from attrs import define from griptape.events import BaseEvent diff --git a/griptape/events/completion_chunk_event.py b/griptape/events/completion_chunk_event.py index 829b07c1b..a4244bd5d 100644 --- a/griptape/events/completion_chunk_event.py +++ b/griptape/events/completion_chunk_event.py @@ -1,4 +1,4 @@ -from attr import field +from attrs import field from attrs import define from griptape.events.base_event import BaseEvent diff --git a/griptape/events/finish_image_query_event.py b/griptape/events/finish_image_query_event.py index bdcad2ca3..3eb2e7ccb 100644 --- a/griptape/events/finish_image_query_event.py +++ b/griptape/events/finish_image_query_event.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.events.base_image_query_event import BaseImageQueryEvent diff --git a/griptape/events/start_image_generation_event.py b/griptape/events/start_image_generation_event.py index a8f2d6b2a..c673f34c4 100644 --- a/griptape/events/start_image_generation_event.py +++ b/griptape/events/start_image_generation_event.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Optional -from attr import define, field +from attrs import define, field from .base_image_generation_event import BaseImageGenerationEvent diff --git a/griptape/events/start_image_query_event.py b/griptape/events/start_image_query_event.py index e72579b04..46001a43f 100644 --- a/griptape/events/start_image_query_event.py +++ b/griptape/events/start_image_query_event.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.events.base_image_query_event import BaseImageQueryEvent diff --git a/griptape/events/start_text_to_speech_event.py b/griptape/events/start_text_to_speech_event.py index 9824a9827..4c3f27ca0 100644 --- a/griptape/events/start_text_to_speech_event.py +++ b/griptape/events/start_text_to_speech_event.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from .base_text_to_speech_event import BaseTextToSpeechEvent diff --git a/griptape/loaders/base_loader.py b/griptape/loaders/base_loader.py index 56c3e840c..1648b8f26 100644 --- a/griptape/loaders/base_loader.py +++ b/griptape/loaders/base_loader.py @@ -5,7 +5,7 @@ from typing import Any, Optional from collections.abc import Mapping, Sequence -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import BaseArtifact from griptape.utils.futures import execute_futures_dict diff --git a/griptape/loaders/blob_loader.py b/griptape/loaders/blob_loader.py index c85c63bcb..8b9ea4bf9 100644 --- a/griptape/loaders/blob_loader.py +++ b/griptape/loaders/blob_loader.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Any, Union, cast -from attr import define +from attrs import define from griptape.artifacts import BlobArtifact, ErrorArtifact from griptape.loaders import BaseLoader diff --git a/griptape/loaders/csv_loader.py b/griptape/loaders/csv_loader.py index 72fdcc73a..d396f80bc 100644 --- a/griptape/loaders/csv_loader.py +++ b/griptape/loaders/csv_loader.py @@ -3,7 +3,7 @@ from io import StringIO from typing import Optional, Union, cast -from attr import define, field +from attrs import define, field from griptape.artifacts import CsvRowArtifact, ErrorArtifact from griptape.drivers import BaseEmbeddingDriver diff --git a/griptape/loaders/dataframe_loader.py b/griptape/loaders/dataframe_loader.py index 1c652d8d2..3d5a0f48b 100644 --- a/griptape/loaders/dataframe_loader.py +++ b/griptape/loaders/dataframe_loader.py @@ -2,7 +2,7 @@ from typing import Optional, TYPE_CHECKING, cast -from attr import define, field +from attrs import define, field from griptape.artifacts import CsvRowArtifact from griptape.drivers import BaseEmbeddingDriver diff --git a/griptape/loaders/email_loader.py b/griptape/loaders/email_loader.py index dbb6f3afe..a7598e2a6 100644 --- a/griptape/loaders/email_loader.py +++ b/griptape/loaders/email_loader.py @@ -4,7 +4,7 @@ import logging import imaplib -from attr import astuple, define, field +from attrs import astuple, define, field from griptape.utils import import_optional_dependency from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact diff --git a/griptape/loaders/image_loader.py b/griptape/loaders/image_loader.py index 71908a3bc..ca0ba776a 100644 --- a/griptape/loaders/image_loader.py +++ b/griptape/loaders/image_loader.py @@ -3,7 +3,7 @@ from io import BytesIO from typing import Optional, cast -from attr import define, field +from attrs import define, field from griptape.utils import import_optional_dependency from griptape.artifacts import ImageArtifact diff --git a/griptape/loaders/pdf_loader.py b/griptape/loaders/pdf_loader.py index 66b1e1a01..8e4560cfc 100644 --- a/griptape/loaders/pdf_loader.py +++ b/griptape/loaders/pdf_loader.py @@ -1,7 +1,7 @@ from __future__ import annotations from io import BytesIO -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional, Union, cast from griptape.artifacts.error_artifact import ErrorArtifact diff --git a/griptape/loaders/sql_loader.py b/griptape/loaders/sql_loader.py index 527b74de4..c20fb022d 100644 --- a/griptape/loaders/sql_loader.py +++ b/griptape/loaders/sql_loader.py @@ -1,6 +1,6 @@ from typing import Optional, cast -from attr import define, field +from attrs import define, field from griptape.artifacts import CsvRowArtifact from griptape.drivers import BaseSqlDriver, BaseEmbeddingDriver diff --git a/griptape/loaders/text_loader.py b/griptape/loaders/text_loader.py index 3bba6023d..e8a80fa64 100644 --- a/griptape/loaders/text_loader.py +++ b/griptape/loaders/text_loader.py @@ -2,7 +2,7 @@ from typing import Optional, Union, cast -from attr import field, define, Factory +from attrs import field, define, Factory from griptape.artifacts import TextArtifact from griptape.artifacts.error_artifact import ErrorArtifact diff --git a/griptape/loaders/web_loader.py b/griptape/loaders/web_loader.py index d6e38f7e0..f8862f7cd 100644 --- a/griptape/loaders/web_loader.py +++ b/griptape/loaders/web_loader.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts.error_artifact import ErrorArtifact from griptape.drivers import BaseWebScraperDriver, TrafilaturaWebScraperDriver from griptape.artifacts import TextArtifact diff --git a/griptape/memory/meta/action_subtask_meta_entry.py b/griptape/memory/meta/action_subtask_meta_entry.py index 19c60e8fa..6b5124971 100644 --- a/griptape/memory/meta/action_subtask_meta_entry.py +++ b/griptape/memory/meta/action_subtask_meta_entry.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import field, define +from attrs import field, define from griptape.memory.meta import BaseMetaEntry diff --git a/griptape/memory/meta/base_meta_entry.py b/griptape/memory/meta/base_meta_entry.py index a7be50dda..c79ec4731 100644 --- a/griptape/memory/meta/base_meta_entry.py +++ b/griptape/memory/meta/base_meta_entry.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define +from attrs import define from abc import ABC from griptape.mixins import SerializableMixin diff --git a/griptape/memory/meta/meta_memory.py b/griptape/memory/meta/meta_memory.py index 05d256455..214e6e285 100644 --- a/griptape/memory/meta/meta_memory.py +++ b/griptape/memory/meta/meta_memory.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.memory.meta import BaseMetaEntry diff --git a/griptape/memory/structure/base_conversation_memory.py b/griptape/memory/structure/base_conversation_memory.py index 85c90d3e1..6db05c92c 100644 --- a/griptape/memory/structure/base_conversation_memory.py +++ b/griptape/memory/structure/base_conversation_memory.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.memory.structure import Run from griptape.utils import PromptStack from griptape.mixins import SerializableMixin diff --git a/griptape/memory/structure/conversation_memory.py b/griptape/memory/structure/conversation_memory.py index 71e41c431..94e73d80c 100644 --- a/griptape/memory/structure/conversation_memory.py +++ b/griptape/memory/structure/conversation_memory.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define +from attrs import define from typing import Optional from griptape.memory.structure import Run, BaseConversationMemory from griptape.utils import PromptStack diff --git a/griptape/memory/structure/run.py b/griptape/memory/structure/run.py index f725bb9f4..c5a2b9b55 100644 --- a/griptape/memory/structure/run.py +++ b/griptape/memory/structure/run.py @@ -1,5 +1,5 @@ import uuid -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.mixins import SerializableMixin diff --git a/griptape/memory/structure/summary_conversation_memory.py b/griptape/memory/structure/summary_conversation_memory.py index fa06a3c76..e4d5597d5 100644 --- a/griptape/memory/structure/summary_conversation_memory.py +++ b/griptape/memory/structure/summary_conversation_memory.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging from typing import TYPE_CHECKING, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.utils import J2, PromptStack from griptape.memory.structure import ConversationMemory diff --git a/griptape/memory/task/storage/base_artifact_storage.py b/griptape/memory/task/storage/base_artifact_storage.py index cb3d963be..fbd226363 100644 --- a/griptape/memory/task/storage/base_artifact_storage.py +++ b/griptape/memory/task/storage/base_artifact_storage.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Any from abc import ABC, abstractmethod -from attr import define +from attrs import define from griptape.artifacts import BaseArtifact, ListArtifact, TextArtifact, InfoArtifact diff --git a/griptape/memory/task/storage/blob_artifact_storage.py b/griptape/memory/task/storage/blob_artifact_storage.py index 322d06617..79b5798df 100644 --- a/griptape/memory/task/storage/blob_artifact_storage.py +++ b/griptape/memory/task/storage/blob_artifact_storage.py @@ -1,5 +1,5 @@ from typing import Any -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact, ListArtifact, BlobArtifact, InfoArtifact from griptape.memory.task.storage import BaseArtifactStorage diff --git a/griptape/memory/task/storage/text_artifact_storage.py b/griptape/memory/task/storage/text_artifact_storage.py index 8e4423f54..3b3162751 100644 --- a/griptape/memory/task/storage/text_artifact_storage.py +++ b/griptape/memory/task/storage/text_artifact_storage.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, BaseArtifact, ListArtifact from griptape.memory.task.storage import BaseArtifactStorage diff --git a/griptape/memory/task/task_memory.py b/griptape/memory/task/task_memory.py index 597b151c0..2f1fdbe16 100644 --- a/griptape/memory/task/task_memory.py +++ b/griptape/memory/task/task_memory.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Any, Callable -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import BaseArtifact, InfoArtifact, ListArtifact, ErrorArtifact, TextArtifact from griptape.memory.meta import ActionSubtaskMetaEntry from griptape.mixins import ActivityMixin diff --git a/griptape/mixins/actions_subtask_origin_mixin.py b/griptape/mixins/actions_subtask_origin_mixin.py index 01711140b..22f06a1c6 100644 --- a/griptape/mixins/actions_subtask_origin_mixin.py +++ b/griptape/mixins/actions_subtask_origin_mixin.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from abc import abstractmethod -from attr import define +from attrs import define from schema import Schema, Literal if TYPE_CHECKING: diff --git a/griptape/mixins/activity_mixin.py b/griptape/mixins/activity_mixin.py index a28a8b412..73810864f 100644 --- a/griptape/mixins/activity_mixin.py +++ b/griptape/mixins/activity_mixin.py @@ -1,6 +1,6 @@ import inspect from typing import Optional, Callable -from attr import define, field +from attrs import define, field from jinja2 import Template from schema import Schema, Literal diff --git a/griptape/mixins/exponential_backoff_mixin.py b/griptape/mixins/exponential_backoff_mixin.py index 6559b7460..5045575f1 100644 --- a/griptape/mixins/exponential_backoff_mixin.py +++ b/griptape/mixins/exponential_backoff_mixin.py @@ -1,8 +1,8 @@ import logging from abc import ABC -from attr import define, field +from attrs import define, field from tenacity import Retrying, wait_exponential, stop_after_attempt, retry_if_not_exception_type -from typing import Tuple, Type, Callable +from typing import Callable @define(slots=False) @@ -11,7 +11,7 @@ class ExponentialBackoffMixin(ABC): max_retry_delay: float = field(default=10, kw_only=True) max_attempts: int = field(default=10, kw_only=True) after_hook: Callable = field(default=lambda s: logging.warning(s), kw_only=True) - ignored_exception_types: Tuple[Type[Exception], ...] = field(factory=tuple, kw_only=True) + ignored_exception_types: tuple[type[Exception], ...] = field(factory=tuple, kw_only=True) def retrying(self) -> Retrying: return Retrying( diff --git a/griptape/mixins/media_artifact_file_output_mixin.py b/griptape/mixins/media_artifact_file_output_mixin.py index d7d6f584c..14dcd4898 100644 --- a/griptape/mixins/media_artifact_file_output_mixin.py +++ b/griptape/mixins/media_artifact_file_output_mixin.py @@ -3,7 +3,7 @@ import os from typing import TYPE_CHECKING -from attr import define, field +from attrs import define, field from typing import Optional if TYPE_CHECKING: diff --git a/griptape/mixins/rule_mixin.py b/griptape/mixins/rule_mixin.py index 4c7c98225..a89309a15 100644 --- a/griptape/mixins/rule_mixin.py +++ b/griptape/mixins/rule_mixin.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.rules import Ruleset, Rule diff --git a/griptape/mixins/serializable_mixin.py b/griptape/mixins/serializable_mixin.py index ee80f5efa..c7a0bf035 100644 --- a/griptape/mixins/serializable_mixin.py +++ b/griptape/mixins/serializable_mixin.py @@ -3,7 +3,7 @@ import json from typing import TypeVar, Generic, cast, Optional -from attr import Factory, define, field +from attrs import Factory, define, field from abc import ABC from marshmallow import Schema diff --git a/griptape/rules/rule.py b/griptape/rules/rule.py index 5239396c8..f2a33c7e5 100644 --- a/griptape/rules/rule.py +++ b/griptape/rules/rule.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define +from attrs import define @define(frozen=True) diff --git a/griptape/rules/ruleset.py b/griptape/rules/ruleset.py index 71c0a78e7..9a78b58b8 100644 --- a/griptape/rules/ruleset.py +++ b/griptape/rules/ruleset.py @@ -1,4 +1,4 @@ -from attr import field, define +from attrs import field, define from griptape.rules import Rule diff --git a/griptape/structures/agent.py b/griptape/structures/agent.py index aee95dbf8..79b831f63 100644 --- a/griptape/structures/agent.py +++ b/griptape/structures/agent.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.tools import BaseTool from griptape.memory.structure import Run from griptape.structures import Structure diff --git a/griptape/structures/pipeline.py b/griptape/structures/pipeline.py index 8db5cfae9..00c5f1d09 100644 --- a/griptape/structures/pipeline.py +++ b/griptape/structures/pipeline.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Any -from attr import define +from attrs import define from griptape.artifacts import ErrorArtifact from griptape.memory.structure import Run from griptape.structures import Structure diff --git a/griptape/structures/workflow.py b/griptape/structures/workflow.py index 3d59b656d..e60efa425 100644 --- a/griptape/structures/workflow.py +++ b/griptape/structures/workflow.py @@ -2,7 +2,7 @@ import concurrent.futures as futures from graphlib import TopologicalSorter from typing import Any -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact from griptape.structures import Structure from griptape.tasks import BaseTask diff --git a/griptape/tasks/actions_subtask.py b/griptape/tasks/actions_subtask.py index ef2c2ce6f..d47d1df32 100644 --- a/griptape/tasks/actions_subtask.py +++ b/griptape/tasks/actions_subtask.py @@ -4,7 +4,7 @@ from typing import Optional, TYPE_CHECKING, Callable import schema -from attr import define, field +from attrs import define, field from griptape import utils from griptape.utils import remove_null_values_in_dict_recursively from griptape.mixins import ActionsSubtaskOriginMixin diff --git a/griptape/tasks/base_audio_generation_task.py b/griptape/tasks/base_audio_generation_task.py index 2e5572aba..d401af0a5 100644 --- a/griptape/tasks/base_audio_generation_task.py +++ b/griptape/tasks/base_audio_generation_task.py @@ -2,7 +2,7 @@ from abc import ABC -from attr import define +from attrs import define from griptape.mixins import RuleMixin, BlobArtifactFileOutputMixin from griptape.tasks import BaseTask diff --git a/griptape/tasks/base_image_generation_task.py b/griptape/tasks/base_image_generation_task.py index 2dbab4ce9..75f57b711 100644 --- a/griptape/tasks/base_image_generation_task.py +++ b/griptape/tasks/base_image_generation_task.py @@ -3,7 +3,7 @@ import os from abc import ABC -from attr import field, define +from attrs import field, define from griptape.artifacts import MediaArtifact from griptape.loaders import ImageLoader diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index eb00af6ca..314cdb596 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -3,7 +3,7 @@ from abc import ABC from typing import Callable -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact from griptape.mixins.rule_mixin import RuleMixin diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 037a3e526..79552ce66 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any, Optional from collections.abc import Sequence -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.events import StartTaskEvent, FinishTaskEvent from griptape.artifacts import ErrorArtifact diff --git a/griptape/tasks/base_text_input_task.py b/griptape/tasks/base_text_input_task.py index 3dd5d7009..c5641bb14 100644 --- a/griptape/tasks/base_text_input_task.py +++ b/griptape/tasks/base_text_input_task.py @@ -3,7 +3,7 @@ from abc import ABC from typing import Callable -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.mixins.rule_mixin import RuleMixin diff --git a/griptape/tasks/code_execution_task.py b/griptape/tasks/code_execution_task.py index a1255093d..038642b76 100644 --- a/griptape/tasks/code_execution_task.py +++ b/griptape/tasks/code_execution_task.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tasks import BaseTextInputTask from typing import Callable diff --git a/griptape/tasks/csv_extraction_task.py b/griptape/tasks/csv_extraction_task.py index 2f5f3db56..8770187f0 100644 --- a/griptape/tasks/csv_extraction_task.py +++ b/griptape/tasks/csv_extraction_task.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.engines import CsvExtractionEngine from griptape.tasks import ExtractionTask diff --git a/griptape/tasks/extraction_task.py b/griptape/tasks/extraction_task.py index 76c0be395..03838ef6c 100644 --- a/griptape/tasks/extraction_task.py +++ b/griptape/tasks/extraction_task.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import ListArtifact, ErrorArtifact from griptape.engines import BaseExtractionEngine from griptape.tasks import BaseTextInputTask diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index 94be4f483..f6791f5a6 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.artifacts import ImageArtifact, TextArtifact from griptape.engines import ImageQueryEngine diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index f3b2edb7a..374820d01 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.engines import InpaintingImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index fd2d335e5..a35671de3 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.engines import OutpaintingImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact diff --git a/griptape/tasks/prompt_image_generation_task.py b/griptape/tasks/prompt_image_generation_task.py index 93404ef84..577abacbb 100644 --- a/griptape/tasks/prompt_image_generation_task.py +++ b/griptape/tasks/prompt_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.engines import PromptImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact diff --git a/griptape/tasks/prompt_task.py b/griptape/tasks/prompt_task.py index 16f7c6dac..75051db74 100644 --- a/griptape/tasks/prompt_task.py +++ b/griptape/tasks/prompt_task.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Callable -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.utils import PromptStack from griptape.utils import J2 from griptape.tasks import BaseTextInputTask diff --git a/griptape/tasks/structure_run_task.py b/griptape/tasks/structure_run_task.py index b7a8f9ea9..012f5c235 100644 --- a/griptape/tasks/structure_run_task.py +++ b/griptape/tasks/structure_run_task.py @@ -1,7 +1,7 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact from griptape.drivers.structure_run.base_structure_run_driver import BaseStructureRunDriver diff --git a/griptape/tasks/text_query_task.py b/griptape/tasks/text_query_task.py index 5fee68103..f35161c17 100644 --- a/griptape/tasks/text_query_task.py +++ b/griptape/tasks/text_query_task.py @@ -1,4 +1,4 @@ -from attr import define, field, Factory +from attrs import define, field, Factory from typing import Optional from griptape.artifacts import TextArtifact from griptape.engines import BaseQueryEngine, VectorQueryEngine diff --git a/griptape/tasks/text_summary_task.py b/griptape/tasks/text_summary_task.py index f10f851d0..648fb1cf1 100644 --- a/griptape/tasks/text_summary_task.py +++ b/griptape/tasks/text_summary_task.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact from griptape.engines import PromptSummaryEngine from griptape.tasks import BaseTextInputTask diff --git a/griptape/tasks/text_to_speech_task.py b/griptape/tasks/text_to_speech_task.py index 8a69227c5..d69e907b1 100644 --- a/griptape/tasks/text_to_speech_task.py +++ b/griptape/tasks/text_to_speech_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.artifacts.audio_artifact import AudioArtifact from griptape.engines import TextToSpeechEngine diff --git a/griptape/tasks/tool_task.py b/griptape/tasks/tool_task.py index f875186ea..edd90c26e 100644 --- a/griptape/tasks/tool_task.py +++ b/griptape/tasks/tool_task.py @@ -2,7 +2,7 @@ import re import json from typing import Optional, TYPE_CHECKING -from attr import define, field +from attrs import define, field from schema import Schema from griptape import utils diff --git a/griptape/tasks/toolkit_task.py b/griptape/tasks/toolkit_task.py index ead020c47..ed787aa45 100644 --- a/griptape/tasks/toolkit_task.py +++ b/griptape/tasks/toolkit_task.py @@ -1,7 +1,7 @@ from __future__ import annotations import json from typing import TYPE_CHECKING, Callable, Optional -from attr import define, field, Factory +from attrs import define, field, Factory from schema import Schema from griptape import utils diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index 1242bc59b..0d1269840 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -2,7 +2,7 @@ from typing import Callable -from attr import define, field +from attrs import define, field from griptape.engines import VariationImageGenerationEngine from griptape.artifacts import ImageArtifact, TextArtifact diff --git a/griptape/tokenizers/anthropic_tokenizer.py b/griptape/tokenizers/anthropic_tokenizer.py index 3aefbc980..577df7b93 100644 --- a/griptape/tokenizers/anthropic_tokenizer.py +++ b/griptape/tokenizers/anthropic_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from typing import TYPE_CHECKING from griptape.utils import import_optional_dependency from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tokenizers/base_tokenizer.py b/griptape/tokenizers/base_tokenizer.py index 28f30e66c..179d2fb59 100644 --- a/griptape/tokenizers/base_tokenizer.py +++ b/griptape/tokenizers/base_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC, abstractmethod -from attr import define, field, Factory +from attrs import define, field, Factory from griptape import utils diff --git a/griptape/tokenizers/bedrock_claude_tokenizer.py b/griptape/tokenizers/bedrock_claude_tokenizer.py index d5ff9722b..d44116e2c 100644 --- a/griptape/tokenizers/bedrock_claude_tokenizer.py +++ b/griptape/tokenizers/bedrock_claude_tokenizer.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.tokenizers import AnthropicTokenizer diff --git a/griptape/tokenizers/bedrock_cohere_tokenizer.py b/griptape/tokenizers/bedrock_cohere_tokenizer.py index 772453eb5..44ccb4ac6 100644 --- a/griptape/tokenizers/bedrock_cohere_tokenizer.py +++ b/griptape/tokenizers/bedrock_cohere_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from .simple_tokenizer import SimpleTokenizer diff --git a/griptape/tokenizers/bedrock_jurassic_tokenizer.py b/griptape/tokenizers/bedrock_jurassic_tokenizer.py index 525e2e211..7511138b3 100644 --- a/griptape/tokenizers/bedrock_jurassic_tokenizer.py +++ b/griptape/tokenizers/bedrock_jurassic_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from .simple_tokenizer import SimpleTokenizer diff --git a/griptape/tokenizers/bedrock_llama_tokenizer.py b/griptape/tokenizers/bedrock_llama_tokenizer.py index 051b4552d..e7d1ec829 100644 --- a/griptape/tokenizers/bedrock_llama_tokenizer.py +++ b/griptape/tokenizers/bedrock_llama_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from .simple_tokenizer import SimpleTokenizer diff --git a/griptape/tokenizers/bedrock_titan_tokenizer.py b/griptape/tokenizers/bedrock_titan_tokenizer.py index 403fa2039..0d8ba0273 100644 --- a/griptape/tokenizers/bedrock_titan_tokenizer.py +++ b/griptape/tokenizers/bedrock_titan_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from .simple_tokenizer import SimpleTokenizer diff --git a/griptape/tokenizers/cohere_tokenizer.py b/griptape/tokenizers/cohere_tokenizer.py index 4856b7ff7..0a3c6a236 100644 --- a/griptape/tokenizers/cohere_tokenizer.py +++ b/griptape/tokenizers/cohere_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -from attr import define, field +from attrs import define, field from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: diff --git a/griptape/tokenizers/google_tokenizer.py b/griptape/tokenizers/google_tokenizer.py index 26d1f16b0..55942f597 100644 --- a/griptape/tokenizers/google_tokenizer.py +++ b/griptape/tokenizers/google_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from typing import TYPE_CHECKING from griptape.utils import import_optional_dependency from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tokenizers/huggingface_tokenizer.py b/griptape/tokenizers/huggingface_tokenizer.py index c3203d4a9..dbfba5429 100644 --- a/griptape/tokenizers/huggingface_tokenizer.py +++ b/griptape/tokenizers/huggingface_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.tokenizers import BaseTokenizer if TYPE_CHECKING: diff --git a/griptape/tokenizers/openai_tokenizer.py b/griptape/tokenizers/openai_tokenizer.py index dda8bfe15..ec127ca1a 100644 --- a/griptape/tokenizers/openai_tokenizer.py +++ b/griptape/tokenizers/openai_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations import logging -from attr import define +from attrs import define import tiktoken from griptape.tokenizers import BaseTokenizer from typing import Optional diff --git a/griptape/tokenizers/simple_tokenizer.py b/griptape/tokenizers/simple_tokenizer.py index d97c3bd89..484afe69f 100644 --- a/griptape/tokenizers/simple_tokenizer.py +++ b/griptape/tokenizers/simple_tokenizer.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define, field +from attrs import define, field from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tokenizers/voyageai_tokenizer.py b/griptape/tokenizers/voyageai_tokenizer.py index 799c64276..565e53faa 100644 --- a/griptape/tokenizers/voyageai_tokenizer.py +++ b/griptape/tokenizers/voyageai_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from typing import TYPE_CHECKING, Optional from griptape.utils import import_optional_dependency from griptape.tokenizers import BaseTokenizer diff --git a/griptape/tools/aws_iam_client/tool.py b/griptape/tools/aws_iam_client/tool.py index 0c94be90e..467540829 100644 --- a/griptape/tools/aws_iam_client/tool.py +++ b/griptape/tools/aws_iam_client/tool.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from schema import Schema, Literal -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact, ErrorArtifact, ListArtifact from griptape.utils.decorators import activity from griptape.tools import BaseAwsClient diff --git a/griptape/tools/aws_s3_client/tool.py b/griptape/tools/aws_s3_client/tool.py index fc63f3988..9d50c7cf8 100644 --- a/griptape/tools/aws_s3_client/tool.py +++ b/griptape/tools/aws_s3_client/tool.py @@ -2,7 +2,7 @@ import io from typing import Any, TYPE_CHECKING from schema import Schema, Literal -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, ListArtifact, BlobArtifact from griptape.utils.decorators import activity from griptape.tools import BaseAwsClient diff --git a/griptape/tools/base_aws_client.py b/griptape/tools/base_aws_client.py index cb6159a34..bd7b41e59 100644 --- a/griptape/tools/base_aws_client.py +++ b/griptape/tools/base_aws_client.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from abc import ABC -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, ErrorArtifact, BaseArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/base_google_client.py b/griptape/tools/base_google_client.py index b0da963b5..51ae2f946 100644 --- a/griptape/tools/base_google_client.py +++ b/griptape/tools/base_google_client.py @@ -1,5 +1,5 @@ from abc import ABC -from attr import define, field +from attrs import define, field from griptape.tools import BaseTool from typing import Optional, Any diff --git a/griptape/tools/base_griptape_cloud_client.py b/griptape/tools/base_griptape_cloud_client.py index cafe01cd1..8c42f817e 100644 --- a/griptape/tools/base_griptape_cloud_client.py +++ b/griptape/tools/base_griptape_cloud_client.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import ABC -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.tools import BaseTool diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 2c9f74839..4f1255665 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -9,7 +9,7 @@ from abc import ABC from typing import Optional import yaml -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import BaseArtifact, InfoArtifact, TextArtifact from griptape.mixins import ActivityMixin diff --git a/griptape/tools/computer/tool.py b/griptape/tools/computer/tool.py index 57953f005..b63ba9e0b 100644 --- a/griptape/tools/computer/tool.py +++ b/griptape/tools/computer/tool.py @@ -5,7 +5,7 @@ import tempfile from pathlib import Path from typing import Optional, TYPE_CHECKING -from attr import define, field, Factory +from attrs import define, field, Factory from docker.models.containers import Container from schema import Schema, Literal import stringcase diff --git a/griptape/tools/email_client/tool.py b/griptape/tools/email_client/tool.py index b67a16e4c..e2b42ea7e 100644 --- a/griptape/tools/email_client/tool.py +++ b/griptape/tools/email_client/tool.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import Factory, define, field +from attrs import Factory, define, field from email.mime.text import MIMEText from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact from griptape.loaders.email_loader import EmailLoader diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index 6aa2c85c0..162b546a6 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations import os -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, TextArtifact from griptape.drivers import BaseFileManagerDriver, LocalFileManagerDriver from griptape.tools import BaseTool diff --git a/griptape/tools/google_cal/tool.py b/griptape/tools/google_cal/tool.py index 7ca83e3a5..b18c5f41c 100644 --- a/griptape/tools/google_cal/tool.py +++ b/griptape/tools/google_cal/tool.py @@ -2,7 +2,7 @@ import logging import datetime from schema import Schema, Literal, Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact, ListArtifact from griptape.utils.decorators import activity from griptape.tools import BaseGoogleClient diff --git a/griptape/tools/google_docs/tool.py b/griptape/tools/google_docs/tool.py index 2aaffa13e..48dbbe39c 100644 --- a/griptape/tools/google_docs/tool.py +++ b/griptape/tools/google_docs/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations import logging -from attr import field, define +from attrs import field, define from schema import Schema, Optional, Literal from griptape.artifacts import ErrorArtifact, InfoArtifact diff --git a/griptape/tools/google_drive/tool.py b/griptape/tools/google_drive/tool.py index 761b38754..fcb042cfb 100644 --- a/griptape/tools/google_drive/tool.py +++ b/griptape/tools/google_drive/tool.py @@ -3,7 +3,7 @@ from typing import Any, Optional import schema from schema import Schema, Literal, Or -from attr import define, field +from attrs import define, field from griptape.artifacts import ErrorArtifact, InfoArtifact, ListArtifact, BlobArtifact, TextArtifact from griptape.utils.decorators import activity from griptape.tools import BaseGoogleClient diff --git a/griptape/tools/google_gmail/tool.py b/griptape/tools/google_gmail/tool.py index 7539b6668..5b4bf5cd5 100644 --- a/griptape/tools/google_gmail/tool.py +++ b/griptape/tools/google_gmail/tool.py @@ -3,7 +3,7 @@ import base64 from email.message import EmailMessage from schema import Schema, Literal -from attr import define, field +from attrs import define, field from griptape.artifacts import InfoArtifact, ErrorArtifact from griptape.utils.decorators import activity from griptape.tools import BaseGoogleClient diff --git a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py index 89a284c98..917406cdd 100644 --- a/griptape/tools/griptape_cloud_knowledge_base_client/tool.py +++ b/griptape/tools/griptape_cloud_knowledge_base_client/tool.py @@ -2,7 +2,7 @@ from typing import Optional from urllib.parse import urljoin from schema import Schema, Literal -from attr import define, field +from attrs import define, field from griptape.tools.base_griptape_cloud_client import BaseGriptapeCloudClient from griptape.utils.decorators import activity from griptape.artifacts import TextArtifact, ErrorArtifact diff --git a/griptape/tools/image_query_client/tool.py b/griptape/tools/image_query_client/tool.py index eab3b5e3e..60f2970ff 100644 --- a/griptape/tools/image_query_client/tool.py +++ b/griptape/tools/image_query_client/tool.py @@ -2,7 +2,7 @@ from typing import Any, cast -from attr import define, field, Factory +from attrs import define, field, Factory from schema import Schema, Literal from griptape.artifacts import TextArtifact, ImageArtifact, ErrorArtifact, BlobArtifact diff --git a/griptape/tools/openweather_client/tool.py b/griptape/tools/openweather_client/tool.py index 875fc2cf4..e338677dd 100644 --- a/griptape/tools/openweather_client/tool.py +++ b/griptape/tools/openweather_client/tool.py @@ -4,7 +4,7 @@ from griptape.utils.decorators import activity from schema import Schema, Literal from typing import Optional -from attr import define, field +from attrs import define, field import requests import logging diff --git a/griptape/tools/rest_api_client/tool.py b/griptape/tools/rest_api_client/tool.py index 97bd9384e..e33971cc2 100644 --- a/griptape/tools/rest_api_client/tool.py +++ b/griptape/tools/rest_api_client/tool.py @@ -1,9 +1,9 @@ from textwrap import dedent -from typing import Optional, Dict +from typing import Optional from urllib.parse import urljoin import schema from schema import Schema, Literal -from attr import define, field +from attrs import define, field from griptape.tools import BaseTool from griptape.utils.decorators import activity from griptape.artifacts import BaseArtifact, TextArtifact, ErrorArtifact @@ -30,7 +30,7 @@ class RestApiClient(BaseTool): request_query_params_schema: Optional[str] = field(default=None, kw_only=True) request_body_schema: Optional[str] = field(default=None, kw_only=True) response_body_schema: Optional[str] = field(default=None, kw_only=True) - request_headers: Optional[Dict[str, str]] = field(default=None, kw_only=True) + request_headers: Optional[dict[str, str]] = field(default=None, kw_only=True) @property def full_url(self) -> str: diff --git a/griptape/tools/sql_client/tool.py b/griptape/tools/sql_client/tool.py index e5ed9263e..a07c2e734 100644 --- a/griptape/tools/sql_client/tool.py +++ b/griptape/tools/sql_client/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import Optional -from attr import define, field +from attrs import define, field from griptape.artifacts import InfoArtifact, ListArtifact, ErrorArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/structure_run_client/tool.py b/griptape/tools/structure_run_client/tool.py index c62b53e97..f48e84a1d 100644 --- a/griptape/tools/structure_run_client/tool.py +++ b/griptape/tools/structure_run_client/tool.py @@ -1,6 +1,6 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from schema import Literal, Schema from griptape.artifacts import BaseArtifact, TextArtifact diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index b7234aca2..2a85a7c0f 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from schema import Schema, Literal from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact from griptape.tools import BaseTool diff --git a/griptape/tools/vector_store_client/tool.py b/griptape/tools/vector_store_client/tool.py index 90ba845c0..f2dc785b0 100644 --- a/griptape/tools/vector_store_client/tool.py +++ b/griptape/tools/vector_store_client/tool.py @@ -1,7 +1,7 @@ from typing import Optional from griptape.engines import VectorQueryEngine from schema import Schema, Literal -from attr import define, field +from attrs import define, field from griptape.artifacts import BaseArtifact, ErrorArtifact from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/griptape/tools/web_scraper/tool.py b/griptape/tools/web_scraper/tool.py index bff46473f..c42dedad9 100644 --- a/griptape/tools/web_scraper/tool.py +++ b/griptape/tools/web_scraper/tool.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.artifacts import ErrorArtifact, ListArtifact from schema import Schema, Literal from griptape.tools import BaseTool diff --git a/griptape/tools/web_search/tool.py b/griptape/tools/web_search/tool.py index af8a75d11..6ad25ebf0 100644 --- a/griptape/tools/web_search/tool.py +++ b/griptape/tools/web_search/tool.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, ErrorArtifact, ListArtifact from schema import Schema, Literal from griptape.tools import BaseTool diff --git a/griptape/utils/chat.py b/griptape/utils/chat.py index 549d93e53..12653ce9e 100644 --- a/griptape/utils/chat.py +++ b/griptape/utils/chat.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Callable -from attr import Factory, define, field +from attrs import Factory, define, field from griptape.utils.stream import Stream if TYPE_CHECKING: diff --git a/griptape/utils/command_runner.py b/griptape/utils/command_runner.py index c1ad9c9fe..bbc03ec39 100644 --- a/griptape/utils/command_runner.py +++ b/griptape/utils/command_runner.py @@ -1,5 +1,5 @@ import subprocess -from attr import define +from attrs import define from griptape.artifacts import BaseArtifact, TextArtifact, ErrorArtifact diff --git a/griptape/utils/conversation.py b/griptape/utils/conversation.py index 38b3e30a9..2d87563ae 100644 --- a/griptape/utils/conversation.py +++ b/griptape/utils/conversation.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -from attr import define, field +from attrs import define, field if TYPE_CHECKING: from griptape.memory.structure import ConversationMemory diff --git a/griptape/utils/j2.py b/griptape/utils/j2.py index 6b57e274c..ca54fed9e 100644 --- a/griptape/utils/j2.py +++ b/griptape/utils/j2.py @@ -1,5 +1,5 @@ from typing import Optional -from attr import define, field, Factory +from attrs import define, field, Factory from jinja2 import Environment, FileSystemLoader from .paths import abs_path diff --git a/griptape/utils/prompt_stack.py b/griptape/utils/prompt_stack.py index a5f336030..f04cef486 100644 --- a/griptape/utils/prompt_stack.py +++ b/griptape/utils/prompt_stack.py @@ -1,6 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -from attr import define, field +from attrs import define, field from griptape.mixins import SerializableMixin diff --git a/griptape/utils/python_runner.py b/griptape/utils/python_runner.py index 0c54ad652..75b6e53c2 100644 --- a/griptape/utils/python_runner.py +++ b/griptape/utils/python_runner.py @@ -1,7 +1,7 @@ import importlib import sys from io import StringIO -from attr import define, field +from attrs import define, field @define diff --git a/griptape/utils/token_counter.py b/griptape/utils/token_counter.py index eccae3afd..2732d95f1 100644 --- a/griptape/utils/token_counter.py +++ b/griptape/utils/token_counter.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field @define diff --git a/poetry.lock b/poetry.lock index c4e2e1024..c78b72391 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4236,7 +4236,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4512,28 +4511,28 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.4.4" +version = "0.4.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, - {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, - {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, - {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, - {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, - {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, - {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, - {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, + {file = "ruff-0.4.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ef995583a038cd4a7edf1422c9e19118e2511b8ba0b015861b4abd26ec5367c5"}, + {file = "ruff-0.4.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:602ebd7ad909eab6e7da65d3c091547781bb06f5f826974a53dbe563d357e53c"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f9ced5cbb7510fd7525448eeb204e0a22cabb6e99a3cb160272262817d49786"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04a80acfc862e0e1630c8b738e70dcca03f350bad9e106968a8108379e12b31f"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be47700ecb004dfa3fd4dcdddf7322d4e632de3c06cd05329d69c45c0280e618"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1ff930d6e05f444090a0139e4e13e1e2e1f02bd51bb4547734823c760c621e79"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13410aabd3b5776f9c5699f42b37a3a348d65498c4310589bc6e5c548dc8a2f"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cf5cc02d3ae52dfb0c8a946eb7a1d6ffe4d91846ffc8ce388baa8f627e3bd50"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea3424793c29906407e3cf417f28fc33f689dacbbadfb52b7e9a809dd535dcef"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1fa8561489fadf483ffbb091ea94b9c39a00ed63efacd426aae2f197a45e67fc"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d5b914818d8047270308fe3e85d9d7f4a31ec86c6475c9f418fbd1624d198e0"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4f02284335c766678778475e7698b7ab83abaf2f9ff0554a07b6f28df3b5c259"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3a6a0a4f4b5f54fff7c860010ab3dd81425445e37d35701a965c0248819dde7a"}, + {file = "ruff-0.4.6-py3-none-win32.whl", hash = "sha256:9018bf59b3aa8ad4fba2b1dc0299a6e4e60a4c3bc62bbeaea222679865453062"}, + {file = "ruff-0.4.6-py3-none-win_amd64.whl", hash = "sha256:a769ae07ac74ff1a019d6bd529426427c3e30d75bdf1e08bb3d46ac8f417326a"}, + {file = "ruff-0.4.6-py3-none-win_arm64.whl", hash = "sha256:735a16407a1a8f58e4c5b913ad6102722e80b562dd17acb88887685ff6f20cf6"}, + {file = "ruff-0.4.6.tar.gz", hash = "sha256:a797a87da50603f71e6d0765282098245aca6e3b94b7c17473115167d8dfb0b7"}, ] [[package]] @@ -6022,4 +6021,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "2590fc0528b584775d753939abbde032c34055a92db2538385002b9808d1fa31" +content-hash = "ce7c88b4d4ea368bd7a6c08c8e0f4310b2c10f1237d77d80f50bda4b35612481" diff --git a/pyproject.toml b/pyproject.toml index 5ca064399..af264a5dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -155,7 +155,7 @@ pytest-clarity = "^1.0.1" optional = true [tool.poetry.group.dev.dependencies] -ruff = "^0.4.4" +ruff = "^0.4.6" pyright = "^1.1.363" pre-commit = "^3.7.1" boto3-stubs = {extras = ["bedrock", "iam", "opensearch", "s3", "sagemaker"], version = "^1.34.105"} @@ -180,6 +180,12 @@ line-length = 120 [tool.ruff.format] skip-magic-trailing-comma = true +[tool.ruff.lint] +select = ["E4", "E7", "E9", "F", "TID251"] + +[tool.ruff.lint.flake8-tidy-imports.banned-api] +"attr".msg = "The attr module is deprecated, use attrs instead." + [tool.pyright] venvPath = "." venv = ".venv" diff --git a/tests/mocks/invalid_mock_tool/tool.py b/tests/mocks/invalid_mock_tool/tool.py index 3700d28eb..91b2f78f7 100644 --- a/tests/mocks/invalid_mock_tool/tool.py +++ b/tests/mocks/invalid_mock_tool/tool.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from schema import Schema, Literal from griptape.tools import BaseTool from griptape.utils.decorators import activity diff --git a/tests/mocks/mock_embedding_driver.py b/tests/mocks/mock_embedding_driver.py index 9502421a9..e21c56308 100644 --- a/tests/mocks/mock_embedding_driver.py +++ b/tests/mocks/mock_embedding_driver.py @@ -1,4 +1,4 @@ -from attr import field, define +from attrs import field, define from griptape.drivers import BaseEmbeddingDriver from tests.mocks.mock_tokenizer import MockTokenizer diff --git a/tests/mocks/mock_event_listener_driver.py b/tests/mocks/mock_event_listener_driver.py index dd54eeb73..560fb8733 100644 --- a/tests/mocks/mock_event_listener_driver.py +++ b/tests/mocks/mock_event_listener_driver.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.drivers import BaseEventListenerDriver diff --git a/tests/mocks/mock_failing_prompt_driver.py b/tests/mocks/mock_failing_prompt_driver.py index 3bc0e1511..c97b25d86 100644 --- a/tests/mocks/mock_failing_prompt_driver.py +++ b/tests/mocks/mock_failing_prompt_driver.py @@ -1,5 +1,5 @@ -from typing import Iterator -from attr import define +from collections.abc import Iterator +from attrs import define from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver diff --git a/tests/mocks/mock_image_generation_driver.py b/tests/mocks/mock_image_generation_driver.py index 0775ad5e2..de94771e2 100644 --- a/tests/mocks/mock_image_generation_driver.py +++ b/tests/mocks/mock_image_generation_driver.py @@ -1,5 +1,5 @@ from typing import Optional -from attr import define +from attrs import define from griptape.artifacts import ImageArtifact from griptape.drivers.image_generation.base_image_generation_driver import BaseImageGenerationDriver diff --git a/tests/mocks/mock_image_generation_task.py b/tests/mocks/mock_image_generation_task.py index 24c25dc37..1c79b42a9 100644 --- a/tests/mocks/mock_image_generation_task.py +++ b/tests/mocks/mock_image_generation_task.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.artifacts import ImageArtifact, TextArtifact from griptape.tasks import BaseImageGenerationTask diff --git a/tests/mocks/mock_image_query_driver.py b/tests/mocks/mock_image_query_driver.py index b25684178..d3bec164f 100644 --- a/tests/mocks/mock_image_query_driver.py +++ b/tests/mocks/mock_image_query_driver.py @@ -1,5 +1,5 @@ from typing import Optional -from attr import define +from attrs import define from griptape.artifacts import ImageArtifact, TextArtifact from griptape.drivers import BaseImageQueryDriver from griptape.drivers.image_generation.base_image_generation_driver import BaseImageGenerationDriver diff --git a/tests/mocks/mock_multi_text_input_task.py b/tests/mocks/mock_multi_text_input_task.py index 1da645ee4..7ab5aedf9 100644 --- a/tests/mocks/mock_multi_text_input_task.py +++ b/tests/mocks/mock_multi_text_input_task.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.artifacts import TextArtifact from griptape.tasks import BaseMultiTextInputTask diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index e2018c6f6..20913a965 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -1,6 +1,7 @@ +from __future__ import annotations from collections.abc import Iterator from typing import Callable -from attr import Factory, define, field +from attrs import define, field from griptape.utils import PromptStack from griptape.drivers import BasePromptDriver from griptape.tokenizers import BaseTokenizer diff --git a/tests/mocks/mock_task.py b/tests/mocks/mock_task.py index a3ea7688d..42595f6eb 100644 --- a/tests/mocks/mock_task.py +++ b/tests/mocks/mock_task.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from griptape.artifacts import TextArtifact, BaseArtifact from griptape.tasks import BaseTask diff --git a/tests/mocks/mock_text_input_task.py b/tests/mocks/mock_text_input_task.py index 5c8c8174c..930c77e74 100644 --- a/tests/mocks/mock_text_input_task.py +++ b/tests/mocks/mock_text_input_task.py @@ -1,4 +1,4 @@ -from attr import define +from attrs import define from griptape.artifacts import TextArtifact from griptape.tasks import BaseTextInputTask diff --git a/tests/mocks/mock_tokenizer.py b/tests/mocks/mock_tokenizer.py index 56a5bc5cc..a333f9a13 100644 --- a/tests/mocks/mock_tokenizer.py +++ b/tests/mocks/mock_tokenizer.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attr import define, field +from attrs import define, field from griptape.tokenizers import BaseTokenizer diff --git a/tests/mocks/mock_tool/tool.py b/tests/mocks/mock_tool/tool.py index ea66b4aa1..266f77c1b 100644 --- a/tests/mocks/mock_tool/tool.py +++ b/tests/mocks/mock_tool/tool.py @@ -1,4 +1,4 @@ -from attr import define, field +from attrs import define, field from schema import Schema, Literal from griptape.artifacts import TextArtifact, ErrorArtifact, BaseArtifact, ListArtifact from griptape.tools import BaseTool diff --git a/tests/mocks/mock_value_prompt_driver.py b/tests/mocks/mock_value_prompt_driver.py index 8c660602b..12ddeec9f 100644 --- a/tests/mocks/mock_value_prompt_driver.py +++ b/tests/mocks/mock_value_prompt_driver.py @@ -1,5 +1,5 @@ from collections.abc import Iterator -from attr import define, field, Factory +from attrs import define, field, Factory from griptape.drivers import BasePromptDriver from griptape.tokenizers import OpenAiTokenizer, BaseTokenizer from griptape.artifacts import TextArtifact diff --git a/tests/unit/artifacts/test_base_media_artifact.py b/tests/unit/artifacts/test_base_media_artifact.py index d72a8bb02..2829a1e2f 100644 --- a/tests/unit/artifacts/test_base_media_artifact.py +++ b/tests/unit/artifacts/test_base_media_artifact.py @@ -1,6 +1,6 @@ import pytest -from attr import define +from attrs import define from griptape.artifacts import MediaArtifact diff --git a/tests/utils/structure_tester.py b/tests/utils/structure_tester.py index abd8f0e0a..4f111b8d8 100644 --- a/tests/utils/structure_tester.py +++ b/tests/utils/structure_tester.py @@ -1,6 +1,6 @@ from __future__ import annotations import os -from attr import field, define +from attrs import field, define from schema import Schema, Literal import logging import json From 5a0e1c3e0a99d4fab8ad27263c569b644a3b571a Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 31 May 2024 11:11:24 -0700 Subject: [PATCH 063/238] Refactor tasks to use ListArtifact as input (#811) --- griptape/artifacts/list_artifact.py | 3 +- griptape/events/base_task_event.py | 7 +-- griptape/events/finish_structure_run_event.py | 7 +-- griptape/events/start_structure_run_event.py | 7 +-- griptape/tasks/base_multi_text_input_task.py | 17 +++--- griptape/tasks/base_task.py | 3 +- griptape/tasks/image_query_task.py | 31 +++++++---- .../tasks/inpainting_image_generation_task.py | 23 +++++--- .../outpainting_image_generation_task.py | 23 +++++--- .../tasks/variation_image_generation_task.py | 17 +++--- tests/unit/artifacts/test_list_artifact.py | 2 +- .../events/test_finish_structure_run_event.py | 14 +++-- .../tasks/test_base_multi_text_input_task.py | 1 - tests/unit/tasks/test_image_query_task.py | 52 +++++++++++++++---- .../test_inpainting_image_generation_task.py | 25 ++++++--- .../test_outpainting_image_generation_task.py | 25 ++++++--- .../test_variation_image_generation_task.py | 22 +++++--- 17 files changed, 188 insertions(+), 91 deletions(-) diff --git a/griptape/artifacts/list_artifact.py b/griptape/artifacts/list_artifact.py index 558f32432..68b377df2 100644 --- a/griptape/artifacts/list_artifact.py +++ b/griptape/artifacts/list_artifact.py @@ -8,10 +8,11 @@ class ListArtifact(BaseArtifact): value: Sequence[BaseArtifact] = field(factory=list, metadata={"serializable": True}) item_separator: str = field(default="\n\n", kw_only=True, metadata={"serializable": True}) + validate_uniform_types: bool = field(default=False, kw_only=True, metadata={"serializable": True}) @value.validator # pyright: ignore def validate_value(self, _, value: list[BaseArtifact]) -> None: - if len(value) > 0: + if self.validate_uniform_types and len(value) > 0: first_type = type(value[0]) if not all(isinstance(v, first_type) for v in value): diff --git a/griptape/events/base_task_event.py b/griptape/events/base_task_event.py index c037ec7ab..e853114d5 100644 --- a/griptape/events/base_task_event.py +++ b/griptape/events/base_task_event.py @@ -1,8 +1,7 @@ from __future__ import annotations from attrs import define, field from abc import ABC -from typing import Optional, Union -from collections.abc import Sequence +from typing import Optional from griptape.artifacts import BaseArtifact from .base_event import BaseEvent @@ -13,7 +12,5 @@ class BaseTaskEvent(BaseEvent, ABC): task_parent_ids: list[str] = field(kw_only=True, metadata={"serializable": True}) task_child_ids: list[str] = field(kw_only=True, metadata={"serializable": True}) - task_input: Union[BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]]] = field( - kw_only=True, metadata={"serializable": True} - ) + task_input: BaseArtifact = field(kw_only=True, metadata={"serializable": True}) task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/finish_structure_run_event.py b/griptape/events/finish_structure_run_event.py index 2ff7786d8..588a5be31 100644 --- a/griptape/events/finish_structure_run_event.py +++ b/griptape/events/finish_structure_run_event.py @@ -1,5 +1,4 @@ -from typing import Optional, Union -from collections.abc import Sequence +from typing import Optional from attrs import define, field @@ -10,7 +9,5 @@ @define class FinishStructureRunEvent(BaseEvent): structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - output_task_input: Union[BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]]] = ( - field(kw_only=True, metadata={"serializable": True}) - ) + output_task_input: BaseArtifact = field(kw_only=True, metadata={"serializable": True}) output_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/events/start_structure_run_event.py b/griptape/events/start_structure_run_event.py index e75c5cd68..f0bb5528c 100644 --- a/griptape/events/start_structure_run_event.py +++ b/griptape/events/start_structure_run_event.py @@ -1,5 +1,4 @@ -from typing import Optional, Union -from collections.abc import Sequence +from typing import Optional from attrs import define, field @@ -10,7 +9,5 @@ @define class StartStructureRunEvent(BaseEvent): structure_id: Optional[str] = field(kw_only=True, default=None, metadata={"serializable": True}) - input_task_input: Union[BaseArtifact, tuple[BaseArtifact, ...], tuple[BaseArtifact, Sequence[BaseArtifact]]] = ( - field(kw_only=True, metadata={"serializable": True}) - ) + input_task_input: BaseArtifact = field(kw_only=True, metadata={"serializable": True}) input_task_output: Optional[BaseArtifact] = field(kw_only=True, metadata={"serializable": True}) diff --git a/griptape/tasks/base_multi_text_input_task.py b/griptape/tasks/base_multi_text_input_task.py index 314cdb596..385bc9b5b 100644 --- a/griptape/tasks/base_multi_text_input_task.py +++ b/griptape/tasks/base_multi_text_input_task.py @@ -5,7 +5,7 @@ from attrs import define, field, Factory -from griptape.artifacts import TextArtifact +from griptape.artifacts import ListArtifact, TextArtifact from griptape.mixins.rule_mixin import RuleMixin from griptape.tasks import BaseTask from griptape.utils import J2 @@ -20,20 +20,19 @@ class BaseMultiTextInputTask(RuleMixin, BaseTask, ABC): ) @property - def input(self) -> tuple[TextArtifact, ...]: + def input(self) -> ListArtifact: if all(isinstance(elem, TextArtifact) for elem in self._input): - return self._input # pyright: ignore + return ListArtifact([artifact for artifact in self._input if isinstance(artifact, TextArtifact)]) elif all(isinstance(elem, Callable) for elem in self._input): - return tuple([elem(self) for elem in self._input]) # pyright: ignore - elif isinstance(self._input, tuple): - return tuple( + return ListArtifact([callable(self) for callable in self._input if isinstance(callable, Callable)]) + else: + return ListArtifact( [ - TextArtifact(J2().render_from_string(input_template, **self.full_context)) # pyright: ignore + TextArtifact(J2().render_from_string(input_template, **self.full_context)) for input_template in self._input + if isinstance(input_template, str) ] ) - else: - return tuple([TextArtifact(J2().render_from_string(self._input, **self.full_context))]) @input.setter def input( diff --git a/griptape/tasks/base_task.py b/griptape/tasks/base_task.py index 79552ce66..771fe4dc8 100644 --- a/griptape/tasks/base_task.py +++ b/griptape/tasks/base_task.py @@ -5,7 +5,6 @@ from concurrent import futures from enum import Enum from typing import TYPE_CHECKING, Any, Optional -from collections.abc import Sequence from attrs import define, field, Factory @@ -38,7 +37,7 @@ class State(Enum): @property @abstractmethod - def input(self) -> BaseArtifact | tuple[BaseArtifact, ...] | tuple[BaseArtifact, Sequence[BaseArtifact]]: ... + def input(self) -> BaseArtifact: ... @property def parents(self) -> list[BaseTask]: diff --git a/griptape/tasks/image_query_task.py b/griptape/tasks/image_query_task.py index f6791f5a6..85b25715a 100644 --- a/griptape/tasks/image_query_task.py +++ b/griptape/tasks/image_query_task.py @@ -4,7 +4,7 @@ from attrs import define, field -from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.engines import ImageQueryEngine from griptape.tasks import BaseTask from griptape.utils import J2 @@ -26,18 +26,21 @@ class ImageQueryTask(BaseTask): _input: ( tuple[str, list[ImageArtifact]] | tuple[TextArtifact, list[ImageArtifact]] - | Callable[[BaseTask], tuple[TextArtifact, list[ImageArtifact]]] + | Callable[[BaseTask], ListArtifact] + | ListArtifact ) = field(default=None, alias="input") @property - def input(self) -> tuple[TextArtifact, list[ImageArtifact]]: - if isinstance(self._input, tuple): + def input(self) -> ListArtifact: + if isinstance(self._input, ListArtifact): + return self._input + elif isinstance(self._input, tuple): if isinstance(self._input[0], TextArtifact): query_text = self._input[0] else: query_text = TextArtifact(J2().render_from_string(self._input[0], **self.full_context)) - return query_text, self._input[1] + return ListArtifact([query_text, *self._input[1]]) elif isinstance(self._input, Callable): return self._input(self) else: @@ -49,8 +52,11 @@ def input(self) -> tuple[TextArtifact, list[ImageArtifact]]: @input.setter def input( self, - value: tuple[TextArtifact, list[ImageArtifact]] - | Callable[[BaseTask], tuple[TextArtifact, list[ImageArtifact]]], + value: ( + tuple[str, list[ImageArtifact]] + | tuple[TextArtifact, list[ImageArtifact]] + | Callable[[BaseTask], ListArtifact] + ), ) -> None: self._input = value @@ -68,8 +74,13 @@ def image_query_engine(self, value: ImageQueryEngine) -> None: self._image_query_engine = value def run(self) -> TextArtifact: - query, image_artifacts = self.input + query = self.input.value[0] - response = self.image_query_engine.run(query.value, image_artifacts) + if all([isinstance(input, ImageArtifact) for input in self.input.value[1:]]): + image_artifacts = [input for input in self.input.value[1:] if isinstance(input, ImageArtifact)] + else: + raise ValueError("All inputs after the query must be ImageArtifacts.") + + self.output = self.image_query_engine.run(query.value, image_artifacts) - return response + return self.output diff --git a/griptape/tasks/inpainting_image_generation_task.py b/griptape/tasks/inpainting_image_generation_task.py index 374820d01..b0fae9118 100644 --- a/griptape/tasks/inpainting_image_generation_task.py +++ b/griptape/tasks/inpainting_image_generation_task.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.engines import InpaintingImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 @@ -30,26 +30,29 @@ class InpaintingImageGenerationTask(BaseImageGenerationTask): default=None, kw_only=True, alias="image_generation_engine" ) _input: ( - tuple[str | TextArtifact, ImageArtifact, ImageArtifact] - | Callable[[BaseTask], tuple[TextArtifact, ImageArtifact, ImageArtifact]] + tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact ) = field(default=None) @property - def input(self) -> tuple[TextArtifact, ImageArtifact, ImageArtifact]: - if isinstance(self._input, tuple): + def input(self) -> ListArtifact: + if isinstance(self._input, ListArtifact): + return self._input + elif isinstance(self._input, tuple): if isinstance(self._input[0], TextArtifact): input_text = self._input[0] else: input_text = TextArtifact(J2().render_from_string(self._input[0], **self.full_context)) - return input_text, self._input[1], self._input[2] + return ListArtifact([input_text, self._input[1], self._input[2]]) elif isinstance(self._input, Callable): return self._input(self) else: raise ValueError("Input must be a tuple of (text, image, mask) or a callable that returns such a tuple.") @input.setter - def input(self, value: tuple[TextArtifact, ImageArtifact, ImageArtifact]) -> None: + def input( + self, value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] + ) -> None: self._input = value @property @@ -69,8 +72,14 @@ def image_generation_engine(self, value: InpaintingImageGenerationEngine) -> Non def run(self) -> ImageArtifact: prompt_artifact = self.input[0] + image_artifact = self.input[1] + if not isinstance(image_artifact, ImageArtifact): + raise ValueError("Image must be an ImageArtifact.") + mask_artifact = self.input[2] + if not isinstance(mask_artifact, ImageArtifact): + raise ValueError("Mask must be an ImageArtifact.") output_image_artifact = self.image_generation_engine.run( prompts=[prompt_artifact.to_text()], diff --git a/griptape/tasks/outpainting_image_generation_task.py b/griptape/tasks/outpainting_image_generation_task.py index a35671de3..61a7c1b8a 100644 --- a/griptape/tasks/outpainting_image_generation_task.py +++ b/griptape/tasks/outpainting_image_generation_task.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.engines import OutpaintingImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 @@ -30,26 +30,29 @@ class OutpaintingImageGenerationTask(BaseImageGenerationTask): default=None, kw_only=True, alias="image_generation_engine" ) _input: ( - tuple[str | TextArtifact, ImageArtifact, ImageArtifact] - | Callable[[BaseTask], tuple[TextArtifact, ImageArtifact, ImageArtifact]] + tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact ) = field(default=None) @property - def input(self) -> tuple[TextArtifact, ImageArtifact, ImageArtifact]: - if isinstance(self._input, tuple): + def input(self) -> ListArtifact: + if isinstance(self._input, ListArtifact): + return self._input + elif isinstance(self._input, tuple): if isinstance(self._input[0], TextArtifact): input_text = self._input[0] else: input_text = TextArtifact(J2().render_from_string(self._input[0], **self.full_context)) - return input_text, self._input[1], self._input[2] + return ListArtifact([input_text, self._input[1], self._input[2]]) elif isinstance(self._input, Callable): return self._input(self) else: raise ValueError("Input must be a tuple of (text, image, mask) or a callable that returns such a tuple.") @input.setter - def input(self, value: tuple[TextArtifact, ImageArtifact, ImageArtifact]) -> None: + def input( + self, value: tuple[str | TextArtifact, ImageArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] + ) -> None: self._input = value @property @@ -70,8 +73,14 @@ def image_generation_engine(self, value: OutpaintingImageGenerationEngine) -> No def run(self) -> ImageArtifact: prompt_artifact = self.input[0] + image_artifact = self.input[1] + if not isinstance(image_artifact, ImageArtifact): + raise ValueError("Image must be an ImageArtifact.") + mask_artifact = self.input[2] + if not isinstance(mask_artifact, ImageArtifact): + raise ValueError("Mask must be an ImageArtifact.") output_image_artifact = self.image_generation_engine.run( prompts=[prompt_artifact.to_text()], diff --git a/griptape/tasks/variation_image_generation_task.py b/griptape/tasks/variation_image_generation_task.py index 0d1269840..6efba1e65 100644 --- a/griptape/tasks/variation_image_generation_task.py +++ b/griptape/tasks/variation_image_generation_task.py @@ -5,7 +5,7 @@ from attrs import define, field from griptape.engines import VariationImageGenerationEngine -from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts import ImageArtifact, TextArtifact, ListArtifact from griptape.tasks import BaseImageGenerationTask, BaseTask from griptape.utils import J2 @@ -29,26 +29,28 @@ class VariationImageGenerationTask(BaseImageGenerationTask): _image_generation_engine: VariationImageGenerationEngine = field( default=None, kw_only=True, alias="image_generation_engine" ) - _input: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], tuple[TextArtifact, ImageArtifact]] = field( + _input: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact] | ListArtifact = field( default=None ) @property - def input(self) -> tuple[TextArtifact, ImageArtifact]: - if isinstance(self._input, tuple): + def input(self) -> ListArtifact: + if isinstance(self._input, ListArtifact): + return self._input + elif isinstance(self._input, tuple): if isinstance(self._input[0], TextArtifact): input_text = self._input[0] else: input_text = TextArtifact(J2().render_from_string(self._input[0], **self.full_context)) - return input_text, self._input[1] + return ListArtifact([input_text, self._input[1]]) elif isinstance(self._input, Callable): return self._input(self) else: raise ValueError("Input must be a tuple of (text, image) or a callable that returns such a tuple.") @input.setter - def input(self, value: tuple[TextArtifact, ImageArtifact]) -> None: + def input(self, value: tuple[str | TextArtifact, ImageArtifact] | Callable[[BaseTask], ListArtifact]) -> None: self._input = value @property @@ -68,7 +70,10 @@ def image_generation_engine(self, value: VariationImageGenerationEngine) -> None def run(self) -> ImageArtifact: prompt_artifact = self.input[0] + image_artifact = self.input[1] + if not isinstance(image_artifact, ImageArtifact): + raise ValueError("Image must be an ImageArtifact.") output_image_artifact = self.image_generation_engine.run( prompts=[prompt_artifact.to_text()], diff --git a/tests/unit/artifacts/test_list_artifact.py b/tests/unit/artifacts/test_list_artifact.py index cd0183703..044ca8ed5 100644 --- a/tests/unit/artifacts/test_list_artifact.py +++ b/tests/unit/artifacts/test_list_artifact.py @@ -24,7 +24,7 @@ def test___add__(self): def test_validate_value(self): with pytest.raises(ValueError): - ListArtifact([TextArtifact("foo"), BlobArtifact(b"bar")]) + ListArtifact([TextArtifact("foo"), BlobArtifact(b"bar")], validate_uniform_types=True) def test_child_type(self): assert ListArtifact([TextArtifact("foo")]).child_type == TextArtifact diff --git a/tests/unit/events/test_finish_structure_run_event.py b/tests/unit/events/test_finish_structure_run_event.py index 68ad1ea01..0e9e61f4f 100644 --- a/tests/unit/events/test_finish_structure_run_event.py +++ b/tests/unit/events/test_finish_structure_run_event.py @@ -1,5 +1,6 @@ import pytest -from griptape.artifacts.text_artifact import TextArtifact + +from griptape.artifacts import ImageArtifact, ListArtifact, TextArtifact from griptape.events import FinishStructureRunEvent @@ -7,12 +8,19 @@ class TestFinishStructureRunEvent: @pytest.fixture def finish_structure_run_event(self): return FinishStructureRunEvent( - structure_id="fizz", output_task_input=TextArtifact("foo"), output_task_output=TextArtifact("bar") + structure_id="fizz", + output_task_input=ListArtifact( + [TextArtifact("foo"), ImageArtifact(b"", format="png", width=100, height=100)] + ), + output_task_output=TextArtifact("bar"), ) def test_to_dict(self, finish_structure_run_event): assert finish_structure_run_event.to_dict() is not None assert finish_structure_run_event.to_dict()["structure_id"] == "fizz" - assert finish_structure_run_event.to_dict()["output_task_input"]["value"] == "foo" + assert finish_structure_run_event.to_dict()["output_task_input"]["value"][0]["value"] == "foo" assert finish_structure_run_event.to_dict()["output_task_output"]["value"] == "bar" + + def test_from_dict(self, finish_structure_run_event): + assert FinishStructureRunEvent.from_dict(finish_structure_run_event.to_dict()) == finish_structure_run_event diff --git a/tests/unit/tasks/test_base_multi_text_input_task.py b/tests/unit/tasks/test_base_multi_text_input_task.py index 542162757..ad4776aee 100644 --- a/tests/unit/tasks/test_base_multi_text_input_task.py +++ b/tests/unit/tasks/test_base_multi_text_input_task.py @@ -1,7 +1,6 @@ from tests.mocks.mock_prompt_driver import MockPromptDriver from griptape.structures import Pipeline from griptape.artifacts import TextArtifact -from griptape.rules import Ruleset, Rule from tests.mocks.mock_multi_text_input_task import MockMultiTextInputTask diff --git a/tests/unit/tasks/test_image_query_task.py b/tests/unit/tasks/test_image_query_task.py index 1d195f835..dd4940213 100644 --- a/tests/unit/tasks/test_image_query_task.py +++ b/tests/unit/tasks/test_image_query_task.py @@ -1,14 +1,24 @@ -from griptape.engines import ImageQueryEngine +from unittest.mock import Mock import pytest -from griptape.tasks import BaseTask, ImageQueryTask -from griptape.artifacts import TextArtifact, ImageArtifact + +from griptape.artifacts import ImageArtifact, TextArtifact +from griptape.artifacts.list_artifact import ListArtifact +from griptape.engines import ImageQueryEngine from griptape.structures import Agent +from griptape.tasks import BaseTask, ImageQueryTask from tests.mocks.mock_image_query_driver import MockImageQueryDriver from tests.mocks.mock_structure_config import MockStructureConfig class TestImageQueryTask: + @pytest.fixture + def image_query_engine(self) -> Mock: + mock = Mock() + mock.run.return_value = TextArtifact("image") + + return mock + @pytest.fixture def text_artifact(self): return TextArtifact(value="some text") @@ -20,24 +30,34 @@ def image_artifact(self): def test_text_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): task = ImageQueryTask((text_artifact.value, [image_artifact, image_artifact])) - assert task.input[0].value == text_artifact.value - assert task.input[1] == [image_artifact, image_artifact] + assert task.input.value[0].value == text_artifact.value + assert task.input.value[1] == image_artifact + assert task.input.value[2] == image_artifact def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): input_tuple = (text_artifact, [image_artifact, image_artifact]) task = ImageQueryTask(input_tuple) - assert task.input == input_tuple + assert task.input.value[0] == text_artifact + assert task.input.value[1] == image_artifact + assert task.input.value[2] == image_artifact def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input_tuple = (text_artifact, [image_artifact, image_artifact]) + input = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> tuple[TextArtifact, list[ImageArtifact]]: - return input_tuple + def callable(task: BaseTask) -> ListArtifact: + return ListArtifact(value=input) task = ImageQueryTask(callable) - assert task.input == input_tuple + assert task.input.value == input + + def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): + input = [text_artifact, image_artifact, image_artifact] + + task = ImageQueryTask(ListArtifact(value=input)) + + assert task.input.value == input def test_config_image_generation_engine(self, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) @@ -49,5 +69,15 @@ def test_config_image_generation_engine(self, text_artifact, image_artifact): def test_missing_image_generation_engine(self, text_artifact, image_artifact): task = ImageQueryTask((text_artifact, [image_artifact, image_artifact])) - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Image Query Engine"): task.image_query_engine + + def test_run(self, image_query_engine, text_artifact, image_artifact): + task = ImageQueryTask((text_artifact, [image_artifact, image_artifact]), image_query_engine=image_query_engine) + task.run() + + assert task.output.value == "image" + + def test_bad_run(self, image_query_engine, text_artifact, image_artifact): + with pytest.raises(ValueError, match="All inputs"): + ImageQueryTask(("foo", [image_artifact, text_artifact]), image_query_engine=image_query_engine).run() diff --git a/tests/unit/tasks/test_inpainting_image_generation_task.py b/tests/unit/tasks/test_inpainting_image_generation_task.py index 1fd84f2a6..9dc6aff54 100644 --- a/tests/unit/tasks/test_inpainting_image_generation_task.py +++ b/tests/unit/tasks/test_inpainting_image_generation_task.py @@ -1,5 +1,5 @@ +from griptape.artifacts.list_artifact import ListArtifact from griptape.engines import InpaintingImageGenerationEngine -from typing import Tuple from unittest.mock import Mock import pytest @@ -23,17 +23,30 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag input_tuple = (text_artifact, image_artifact, image_artifact) task = InpaintingImageGenerationTask(input_tuple, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input_tuple = (text_artifact, image_artifact, image_artifact) + input = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> tuple[TextArtifact, ImageArtifact, ImageArtifact]: - return input_tuple + def callable(task: BaseTask) -> ListArtifact: + return ListArtifact(value=list(input)) task = InpaintingImageGenerationTask(callable, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == input + + def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): + input = [text_artifact, image_artifact] + task = InpaintingImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + + assert task.input.value == input + + def test_bad_input(self, image_artifact): + with pytest.raises(ValueError): + InpaintingImageGenerationTask(("foo", "bar", image_artifact)).run() # pyright: ignore[reportArgumentType] + + with pytest.raises(ValueError): + InpaintingImageGenerationTask(("foo", image_artifact, "baz")).run() # pyright: ignore[reportArgumentType] def test_config_image_generation_engine(self, text_artifact, image_artifact): task = InpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) diff --git a/tests/unit/tasks/test_outpainting_image_generation_task.py b/tests/unit/tasks/test_outpainting_image_generation_task.py index f73467258..148ea133d 100644 --- a/tests/unit/tasks/test_outpainting_image_generation_task.py +++ b/tests/unit/tasks/test_outpainting_image_generation_task.py @@ -1,5 +1,5 @@ +from griptape.artifacts.list_artifact import ListArtifact from griptape.engines import OutpaintingImageGenerationEngine -from typing import Tuple from unittest.mock import Mock import pytest @@ -24,17 +24,30 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag input_tuple = (text_artifact, image_artifact, image_artifact) task = OutpaintingImageGenerationTask(input_tuple, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input_tuple = (text_artifact, image_artifact, image_artifact) + input = [text_artifact, image_artifact, image_artifact] - def callable(task: BaseTask) -> tuple[TextArtifact, ImageArtifact, ImageArtifact]: - return input_tuple + def callable(task: BaseTask) -> ListArtifact: + return ListArtifact(input) task = OutpaintingImageGenerationTask(callable, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == input + + def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): + input = [text_artifact, image_artifact] + task = OutpaintingImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + + assert task.input.value == input + + def test_bad_input(self, image_artifact): + with pytest.raises(ValueError): + OutpaintingImageGenerationTask(("foo", "bar", image_artifact)).run() # pyright: ignore[reportArgumentType] + + with pytest.raises(ValueError): + OutpaintingImageGenerationTask(("foo", image_artifact, "baz")).run() # pyright: ignore[reportArgumentType] def test_config_image_generation_engine(self, text_artifact, image_artifact): task = OutpaintingImageGenerationTask((text_artifact, image_artifact, image_artifact)) diff --git a/tests/unit/tasks/test_variation_image_generation_task.py b/tests/unit/tasks/test_variation_image_generation_task.py index bef2107ac..6a9533da3 100644 --- a/tests/unit/tasks/test_variation_image_generation_task.py +++ b/tests/unit/tasks/test_variation_image_generation_task.py @@ -1,6 +1,6 @@ +from griptape.artifacts.list_artifact import ListArtifact from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver from tests.mocks.mock_structure_config import MockStructureConfig -from typing import Tuple from unittest.mock import Mock import pytest @@ -23,17 +23,27 @@ def test_artifact_inputs(self, text_artifact: TextArtifact, image_artifact: Imag input_tuple = (text_artifact, image_artifact) task = VariationImageGenerationTask(input_tuple, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == list(input_tuple) def test_callable_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): - input_tuple = (text_artifact, image_artifact) + input = [text_artifact, image_artifact] - def callable(task: BaseTask) -> tuple[TextArtifact, ImageArtifact]: - return input_tuple + def callable(task: BaseTask) -> ListArtifact: + return ListArtifact(input) task = VariationImageGenerationTask(callable, image_generation_engine=Mock()) - assert task.input == input_tuple + assert task.input.value == input + + def test_list_input(self, text_artifact: TextArtifact, image_artifact: ImageArtifact): + input = [text_artifact, image_artifact] + task = VariationImageGenerationTask(ListArtifact(input), image_generation_engine=Mock()) + + assert task.input.value == input + + def test_bad_input(self, image_artifact): + with pytest.raises(ValueError): + VariationImageGenerationTask(("foo", "bar")).run() # pyright: ignore[reportArgumentType] def test_config_image_generation_engine(self, text_artifact, image_artifact): task = VariationImageGenerationTask((text_artifact, image_artifact)) From 9f787338d0be8f2f8baba1e06af0257ba3baa458 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Fri, 31 May 2024 15:07:34 -0700 Subject: [PATCH 064/238] Fix type (#813) --- tests/mocks/mock_prompt_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mocks/mock_prompt_driver.py b/tests/mocks/mock_prompt_driver.py index 20913a965..dc4cde69e 100644 --- a/tests/mocks/mock_prompt_driver.py +++ b/tests/mocks/mock_prompt_driver.py @@ -19,4 +19,4 @@ def try_run(self, prompt_stack: PromptStack) -> TextArtifact: return TextArtifact(value=self.mock_output() if isinstance(self.mock_output, Callable) else self.mock_output) def try_stream(self, prompt_stack: PromptStack) -> Iterator[TextArtifact]: - yield TextArtifact(value=self.mock_output) + yield TextArtifact(value=self.mock_output() if isinstance(self.mock_output, Callable) else self.mock_output) From 9f19f60749f83494c6e8aa6fe637af5a5711d483 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 3 Jun 2024 09:45:18 -0700 Subject: [PATCH 065/238] Default `off_prompt=False` on `BaseTool` (#757) --- CHANGELOG.md | 1 + README.md | 12 +- docs/examples/load-query-and-chat-marqo.md | 1 - docs/examples/multi-agent-workflow.md | 1 - docs/examples/multiple-agent-shared-memory.md | 2 +- docs/examples/talk-to-a-pdf.md | 1 - docs/examples/talk-to-a-webpage.md | 1 - .../drivers/embedding-drivers.md | 2 +- docs/griptape-framework/index.md | 4 +- docs/griptape-framework/misc/events.md | 4 +- .../structures/task-memory.md | 392 +++++++++++++++--- docs/griptape-framework/structures/tasks.md | 3 +- docs/griptape-framework/tools/index.md | 2 +- docs/griptape-tools/index.md | 2 +- .../official-tools/aws-iam-client.md | 4 +- .../official-tools/aws-s3-client.md | 5 +- .../official-tools/calculator.md | 4 +- .../griptape-tools/official-tools/computer.md | 6 +- .../official-tools/date-time.md | 2 +- .../official-tools/file-manager.md | 2 +- .../official-tools/google-cal-client.md | 9 +- .../official-tools/google-docs-client.md | 3 +- .../official-tools/google-drive-client.md | 3 +- .../official-tools/google-gmail-client.md | 5 +- .../official-tools/image-query-client.md | 1 - .../official-tools/openweather-client.md | 5 +- .../official-tools/rest-api-client.md | 1 - .../official-tools/sql-client.md | 6 +- .../official-tools/structure-run-client.md | 1 - .../official-tools/task-memory-client.md | 2 +- .../official-tools/vector-store-client.md | 3 +- .../official-tools/web-scraper.md | 4 +- .../official-tools/web-search.md | 3 +- griptape/tools/base_tool.py | 2 +- griptape/tools/task_memory_client/tool.py | 4 +- mkdocs.yml | 2 +- tests/integration/tasks/test_tool_task.py | 6 +- tests/integration/tasks/test_toolkit_task.py | 1 - tests/integration/tools/test_calculator.py | 4 +- tests/integration/tools/test_file_manager.py | 4 +- .../tools/test_google_docs_client.py | 1 - .../tools/test_google_drive_client.py | 1 - tests/unit/structures/test_agent.py | 13 +- tests/unit/structures/test_pipeline.py | 18 +- tests/unit/structures/test_workflow.py | 19 +- tests/unit/tasks/test_tool_task.py | 6 +- tests/unit/tasks/test_toolkit_task.py | 4 +- tests/unit/tools/test_base_tool.py | 10 +- tests/unit/tools/test_google_cal_client.py | 0 49 files changed, 427 insertions(+), 165 deletions(-) delete mode 100644 tests/unit/tools/test_google_cal_client.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dee34445..d053ac1fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - **BREAKING**: Updated OpenAI-based image query drivers to remove Vision from the name. +- **BREAKING**: `off_prompt` now defaults to `False` on all Tools, making Task Memory something that must be explicitly opted into. - Default the value of `azure_deployment` on all Azure Drivers to the model the Driver is using. - Field `azure_ad_token` on all Azure Drivers is no longer serializable. - Default standard OpenAI and Azure OpenAI image query model to `gpt-4o`. diff --git a/README.md b/README.md index 2f57670ee..b5e4f7bcb 100644 --- a/README.md +++ b/README.md @@ -94,9 +94,9 @@ from griptape.tools import WebScraper, FileManager, TaskMemoryClient agent = Agent( input_template="Load {{ args[0] }}, summarize it, and store it in a file called {{ args[1] }}.", tools=[ - WebScraper(), - FileManager(), - TaskMemoryClient(off_prompt=True) + WebScraper(off_prompt=True), + TaskMemoryClient(off_prompt=True), + FileManager() ] ) agent.run("https://griptape.ai", "griptape.txt") @@ -142,13 +142,13 @@ And here is the output: Output: The summarized content of the website https://griptape.ai has been successfully saved to a file named 'griptape.txt'. ``` -During the run, the Griptape Agent loaded a webpage with a **Tool**, stored its full content in **Task Memory**, queried it to answer the original question, and finally saved the answer to a file. +During the run, the Griptape Agent loaded a webpage with a [Tool](https://docs.griptape.ai/stable/griptape-tools/), stored its full content in [Task Memory](https://docs.griptape.ai/stable/griptape-framework/structures/task-memory.md), queried it to answer the original question, and finally saved the answer to a file. The important thing to note here is that no matter how big the webpage is it can never blow up the prompt token limit because the full content of the page never goes back to the LLM. Additionally, no data from the subsequent subtasks were returned back to the prompt either. So, how does it work? -All Tools have the `off_prompt` property enabled be default. Disabling it (`off_prompt=False`) will force the framework to return all tool outputs directly to the LLM prompt. `TaskMemoryClient` requires the user to set this property explicitly for usability reasons. In the above example, we set `off_prompt` to `True`, which means that the LLM can never see the data it manipulates, but can send it to other Tools. +In the above example, we set [off_prompt](https://docs.griptape.ai/stable/griptape-framework/structures/task-memory.md#off-prompt) to `True`, which means that the LLM can never see the data it manipulates, but can send it to other Tools. -[Check out our docs](https://docs.griptape.ai/latest/griptape-framework/drivers/prompt-drivers/) to learn more about how to use Griptape with other LLM providers like Anthropic, Claude, Hugging Face, and Azure. +[Check out our docs](https://docs.griptape.ai/stable/griptape-framework/drivers/prompt-drivers/) to learn more about how to use Griptape with other LLM providers like Anthropic, Claude, Hugging Face, and Azure. ## Versioning diff --git a/docs/examples/load-query-and-chat-marqo.md b/docs/examples/load-query-and-chat-marqo.md index 159fd9641..718b42729 100644 --- a/docs/examples/load-query-and-chat-marqo.md +++ b/docs/examples/load-query-and-chat-marqo.md @@ -26,7 +26,6 @@ vector_store_tool = VectorStoreClient( description="Contains information about the Griptape Framework from www.griptape.ai", query_engine=query_engine, namespace=namespace, - off_prompt=False ) # Load artifacts from the web diff --git a/docs/examples/multi-agent-workflow.md b/docs/examples/multi-agent-workflow.md index 0e85b9bde..044f4abad 100644 --- a/docs/examples/multi-agent-workflow.md +++ b/docs/examples/multi-agent-workflow.md @@ -40,7 +40,6 @@ def build_researcher(): WebSearch( google_api_key=os.environ["GOOGLE_API_KEY"], google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], - off_prompt=False, ), WebScraper( off_prompt=True, diff --git a/docs/examples/multiple-agent-shared-memory.md b/docs/examples/multiple-agent-shared-memory.md index 7332de165..cc5498d7e 100644 --- a/docs/examples/multiple-agent-shared-memory.md +++ b/docs/examples/multiple-agent-shared-memory.md @@ -54,7 +54,7 @@ config = AzureOpenAiStructureConfig( loader = Agent( tools=[ - WebScraper(), + WebScraper(off_prompt=True), ], config=config, ) diff --git a/docs/examples/talk-to-a-pdf.md b/docs/examples/talk-to-a-pdf.md index b4a6a20eb..51f71b4f6 100644 --- a/docs/examples/talk-to-a-pdf.md +++ b/docs/examples/talk-to-a-pdf.md @@ -38,7 +38,6 @@ vector_store_tool = VectorStoreClient( "Use it to answer any related questions.", query_engine=engine, namespace=namespace, - off_prompt=False ) agent = Agent( diff --git a/docs/examples/talk-to-a-webpage.md b/docs/examples/talk-to-a-webpage.md index 7e942134c..2f2cbf209 100644 --- a/docs/examples/talk-to-a-webpage.md +++ b/docs/examples/talk-to-a-webpage.md @@ -38,7 +38,6 @@ vector_store_tool = VectorStoreClient( "Use it to answer any physics-related questions.", query_engine=engine, namespace=namespace, - off_prompt=False ) agent = Agent( diff --git a/docs/griptape-framework/drivers/embedding-drivers.md b/docs/griptape-framework/drivers/embedding-drivers.md index 876013e7f..49dfde4a5 100644 --- a/docs/griptape-framework/drivers/embedding-drivers.md +++ b/docs/griptape-framework/drivers/embedding-drivers.md @@ -177,7 +177,7 @@ from griptape.drivers import ( from griptape.config import StructureConfig agent = Agent( - tools=[WebScraper(), TaskMemoryClient(off_prompt=False)], + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], config=StructureConfig( prompt_driver=OpenAiChatPromptDriver(model="gpt-4o"), embedding_driver=VoyageAiEmbeddingDriver(), diff --git a/docs/griptape-framework/index.md b/docs/griptape-framework/index.md index decf00da5..c31b8942c 100644 --- a/docs/griptape-framework/index.md +++ b/docs/griptape-framework/index.md @@ -102,7 +102,7 @@ Agents on their own are fun, but let's add some capabilities to them using Gript from griptape.structures import Agent from griptape.tools import Calculator -calculator = Calculator(off_prompt=False) +calculator = Calculator() agent = Agent( tools=[calculator] @@ -151,7 +151,7 @@ pipeline.add_tasks( ToolkitTask( "{{ args[0] }}", # Add tools for web scraping, and file management - tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)] ), # Augment `input` from the previous task. PromptTask( diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index e4ff8b8f3..ec54f7106 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -149,7 +149,7 @@ pipeline = Pipeline( pipeline.add_tasks( ToolkitTask( "Based on https://griptape.ai, tell me what griptape is.", - tools=[WebScraper(), TaskMemoryClient(off_prompt=False)], + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)], ) ) @@ -168,7 +168,7 @@ from griptape.tools import WebScraper pipeline = Pipeline() pipeline.config.prompt_driver.stream = True -pipeline.add_tasks(ToolkitTask("Based on https://griptape.ai, tell me what griptape is.", tools=[WebScraper()])) +pipeline.add_tasks(ToolkitTask("Based on https://griptape.ai, tell me what griptape is.", tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)])) for artifact in Stream(pipeline).run(): print(artifact.value, end="", flush=True), diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index e44625476..08e4e9444 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -1,89 +1,343 @@ ## Overview -Task Memory augments activity inputs and outputs with storage capabilities. It's a way to keep any data generated by tools off prompt but still allow LLMs to operate on that data remotely. This is useful in the following scenarios: + +Task Memory is a powerful feature of Griptape that allows you to control where the data returned by [Tools](../tools/index.md) is stored. This is useful in the following scenarios: * **Security requirements**: many organizations don't want data to leave their cloud for regulatory and security reasons. -* **Long textual content**: when textual content returned by tools can't fit in the token limit, it's often useful to perform operations on it in a separate process, not in the main LLM. -* **Non-textual content**: tools can generate images, videos, PDFs, and other non-textual content that can be stored in memory and acted upon later by other tools. +* **Long textual content**: when textual content returned by Tools can't fit in the token limit, it's often useful to perform actions on it as a separate operation, not through the main LLM. +* **Non-textual content**: Tools can generate images, videos, PDFs, and other non-textual content that can be stored in Task Memory and acted upon later by other Tools. + +!!! tip + Running into issue with Task Memory? Check out the [Task Memory Considerations](#task-memory-considerations) section for some common pitfalls. -By default, Griptape augments all tool outputs with [TaskMemory](../../reference/griptape/memory/task/task_memory.md) but you can override at the structure, task, or tool activity level. +## Off Prompt +You can enable or disable sending a Tool's results to Task Memory with the `off_prompt` parameter. By default, all Tools have `off_prompt` set to `False` making this an opt-in feature. +When `off_prompt` is set to `True`, the Tool will store its output in Task Memory. When `off_prompt` is set to `False`, the Tool will return its output directly to the LLM. -## Task Memory -Here is an example of how memory can be used in unison with multiple tools to store and load content: +Lets look at a simple example where `off_prompt` is set to `False`: ```python -from griptape.artifacts import TextArtifact, BlobArtifact -from griptape.memory.task.storage import TextArtifactStorage, BlobArtifactStorage from griptape.structures import Agent -from griptape.tools import WebScraper, FileManager, TaskMemoryClient -from griptape.engines import VectorQueryEngine, PromptSummaryEngine, CsvExtractionEngine, JsonExtractionEngine -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver, OpenAiChatPromptDriver +from griptape.tools import Calculator + +# Create an agent with the Calculator tool +agent = Agent( + tools=[Calculator(off_prompt=False)] +) + +agent.run("What is 10 raised to the power of 5?") +``` -prompt_driver = OpenAiChatPromptDriver(model="gpt-3.5-turbo") +``` +[04/26/24 13:06:42] INFO ToolkitTask 36b9dea13b9d479fb752014f41dca54c + Input: What is the square root of 12345? +[04/26/24 13:06:48] INFO Subtask a88c0feeaef6493796a9148ed68c9caf + Thought: To find the square root of 12345, I can use the Calculator action with the expression "12345 ** 0.5". + Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] + INFO Subtask a88c0feeaef6493796a9148ed68c9caf + Response: 111.1080555135405 +[04/26/24 13:06:49] INFO ToolkitTask 36b9dea13b9d479fb752014f41dca54c + Output: The square root of 12345 is approximately 111.108. +``` + +Since the result of the Calculator Tool is neither sensitive nor too large, we can set `off_prompt` to `False` and not use Task Memory. + +Let's explore what happens when `off_prompt` is set to `True`: + +```python +from griptape.structures import Agent +from griptape.tools import Calculator +# Create an agent with the Calculator tool agent = Agent( - tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=True)] + tools=[Calculator(off_prompt=True)] ) +agent.run("What is 10 raised to the power of 5?") +``` + +``` +[04/26/24 13:07:02] INFO ToolkitTask ecbb788d9830491ab72a8a2bbef5fb0a + Input: What is the square root of 12345? +[04/26/24 13:07:10] INFO Subtask 4700dc0c2e934d1a9af60a28bd770bc6 + Thought: To find the square root of a number, we can use the Calculator action with the expression "sqrt(12345)". However, the Calculator + action only supports basic arithmetic operations and does not support the sqrt function. Therefore, we need to use the equivalent expression + for square root which is raising the number to the power of 0.5. + Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345**0.5"}}, "tag": "sqrt_calculation"}] + INFO Subtask 4700dc0c2e934d1a9af60a28bd770bc6 + Response: Output of "Calculator.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "6be74c5128024c0588eb9bee1fdb9aa5" +[04/26/24 13:07:16] ERROR Subtask ecbb788d9830491ab72a8a2bbef5fb0a + Invalid action JSON: Or({Literal("name", description=""): 'Calculator', Literal("path", description="Can be used for computing simple + numerical or algebraic calculations in Python"): 'calculate', Literal("input", description=""): {'values': Schema({Literal("expression", + description="Arithmetic expression parsable in pure Python. Single line only. Don't use variables. Don't use any imports or external + libraries"): })}, Literal("tag", description="Unique tag name for action execution."): }) did not validate {'name': + 'Memory', 'path': 'get', 'input': {'memory_name': 'TaskMemory', 'artifact_namespace': '6be74c5128024c0588eb9bee1fdb9aa5'}, 'tag': + 'get_sqrt_result'} + Key 'name' error: + 'Calculator' does not match 'Memory' +...Output truncated for brevity... +``` + +When we set `off_prompt` to `True`, the Agent does not function as expected, even generating an error. This is because the Calculator output is being stored in Task Memory but the Agent has no way to access it. +To fix this, we need a [Tool that can read from Task Memory](#tools-that-can-read-from-task-memory) such as the `TaskMemoryClient`. +This is an example of [not providing a Task Memory compatible Tool](#not-providing-a-task-memory-compatible-tool). + +## Task Memory Client + +The [TaskMemoryClient](../../griptape-tools/official-tools/task-memory-client.md) is a Tool that allows an Agent to interact with Task Memory. It has the following methods: + +- `query`: Retrieve the content of an Artifact stored in Task Memory. +- `summarize`: Summarize the content of an Artifact stored in Task Memory. + +Let's add `TaskMemoryClient` to the Agent and run the same task. +Note that on the `TaskMemoryClient` we've set `off_prompt` to `False` so that the results of the query can be returned directly to the LLM. +If we had kept it as `True`, the results would have been stored back Task Memory which would've put us back to square one. See [Task Memory Looping](#task-memory-looping) for more information on this scenario. + +```python +from griptape.structures import Agent +from griptape.tools import Calculator, TaskMemoryClient + +# Create an agent with the Calculator tool +agent = Agent(tools=[Calculator(off_prompt=True), TaskMemoryClient(off_prompt=False)]) + +agent.run("What is the square root of 12345?") +``` + +``` +[04/26/24 13:13:01] INFO ToolkitTask 5b46f9ef677c4b31906b48aba3f45e2c + Input: What is the square root of 12345? +[04/26/24 13:13:07] INFO Subtask 611d98ea5576430fbc63259420577ab2 + Thought: To find the square root of 12345, I can use the Calculator action with the expression "12345 ** 0.5". + Actions: [{"name": "Calculator", "path": "calculate", "input": {"values": {"expression": "12345 ** 0.5"}}, "tag": "sqrt_12345"}] +[04/26/24 13:13:08] INFO Subtask 611d98ea5576430fbc63259420577ab2 + Response: Output of "Calculator.calculate" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "7554b69e1d414a469b8882e2266dcea1" +[04/26/24 13:13:15] INFO Subtask 32b9163a15644212be60b8fba07bd23b + Thought: The square root of 12345 has been calculated and stored in memory. I can retrieve this value using the TaskMemoryClient action with + the query path, providing the memory_name and artifact_namespace as input. + Actions: [{"tag": "retrieve_sqrt", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", + "artifact_namespace": "7554b69e1d414a469b8882e2266dcea1", "query": "What is the result of the calculation?"}}}] +[04/26/24 13:13:16] INFO Subtask 32b9163a15644212be60b8fba07bd23b + Response: The result of the calculation is 111.1080555135405. +[04/26/24 13:13:17] INFO ToolkitTask 5b46f9ef677c4b31906b48aba3f45e2c + Output: The square root of 12345 is approximately 111.108. +``` + +While this fixed the problem, it took a handful more steps than when we just had `Calculator()`. Something like a basic calculation is an instance of where [Task Memory may not be necessary](#task-memory-may-not-be-necessary). +Let's look at a more complex example where Task Memory shines. + +## Large Data + +Let's say we want to query the contents of a very large webpage. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper + +# Create an agent with the Calculator tool +agent = Agent(tools=[WebScraper()]) + agent.run( - "Load https://www.griptape.ai, summarize it, " - "and store it in griptape.txt" + "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" ) ``` +When running this example, we get the following error: ``` -[10/20/23 13:31:40] INFO ToolkitTask 82211eeb10374e75ad77135373d816e6 - Input: Load https://www.griptape.ai, summarize it, - and store it in griptape.txt -[10/20/23 13:31:52] INFO Subtask 17b3d35197eb417b834a7db49039ae4f - Thought: The user wants to load the webpage at - https://www.griptape.ai, summarize its content, and - store the summary in a file named griptape.txt. To - achieve this, I need to first use the WebScraper - tool to get the content of the webpage. Then, I - will use the TaskMemoryClient to summarize the - content. Finally, I will use the FileManager tool - to save the summarized content to a file named - griptape.txt. - - Action: {"name": "WebScraper", - "path": "get_content", "input": {"values": - {"url": "https://www.griptape.ai"}}} -[10/20/23 13:31:53] INFO Subtask 17b3d35197eb417b834a7db49039ae4f - Response: Output of "WebScraper.get_content" was - stored in memory with memory_name "TaskMemory" and - artifact_namespace - "82543abe79984d11bb952bd6036a7a01" -[10/20/23 13:32:00] INFO Subtask 58bac35adda94157ac6f9482e7c41c9f - Thought: Now that I have the content of the webpage - stored in memory, I can use the TaskMemoryClient - tool to summarize this content. - Action: {"name": - "TaskMemoryClient", "path": "summarize", - "input": {"values": {"memory_name": "TaskMemory", - "artifact_namespace": - "82543abe79984d11bb952bd6036a7a01"}}} -[10/20/23 13:32:03] INFO Subtask 58bac35adda94157ac6f9482e7c41c9f - Response: Output of - "TaskMemoryClient.summarize" was stored in - memory with memory_name "TaskMemory" and - artifact_namespace - "01b8015f8c5647f09e8d103198404db0" -[10/20/23 13:32:12] INFO Subtask a630f649007b4d7fa0b6cf85be6b2f4f - Thought: Now that I have the summarized content of - the webpage stored in memory, I can use the - FileManager tool to save this content to a file - named griptape.txt. - Action: {"name": "FileManager", - "path": "save_memory_artifacts_to_disk", - "input": {"values": {"dir_name": ".", "file_name": - "griptape.txt", "memory_name": "TaskMemory", - "artifact_namespace": - "01b8015f8c5647f09e8d103198404db0"}}} - INFO Subtask a630f649007b4d7fa0b6cf85be6b2f4f - Response: saved successfully -[10/20/23 13:32:14] INFO ToolkitTask 82211eeb10374e75ad77135373d816e6 - Output: The summarized content of the webpage at - https://www.griptape.ai has been successfully - stored in a file named griptape.txt. +[04/26/24 13:20:02] ERROR ToolkitTask 67e2f907f95d4850ae79f9da67df54c1 + Error code: 400 - {'error': {'message': "This model's maximum context length is 8192 tokens. However, your messages resulted in 73874 tokens. + Please reduce the length of the messages.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}} +``` + +This is because the content of the webpage is too large to fit in the LLM's input token limit. We can fix this by storing the content in Task Memory, and then querying it with the `TaskMemoryClient`. +Note that we're setting `off_prompt` to `False` on the `TaskMemoryClient` so that the _queried_ content can be returned directly to the LLM. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper, TaskMemoryClient + +agent = Agent( + tools=[ + WebScraper(off_prompt=True), + TaskMemoryClient(off_prompt=False), + ] +) + +agent.run( + "According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold?" +) +``` + +And now we get the expected output: ``` +[04/26/24 13:51:51] INFO ToolkitTask 7aca20f202df47a2b9848ed7025f9c21 + Input: According to this page https://en.wikipedia.org/wiki/Elden_Ring, how many copies of Elden Ring have been sold? +[04/26/24 13:51:58] INFO Subtask 5b21d8ead32b4644abcd1e852bb5f512 + Thought: I need to scrape the content of the provided URL to find the information about how many copies of Elden Ring have been sold. + Actions: [{"name": "WebScraper", "path": "get_content", "input": {"values": {"url": "https://en.wikipedia.org/wiki/Elden_Ring"}}, "tag": + "scrape_elden_ring"}] +[04/26/24 13:52:04] INFO Subtask 5b21d8ead32b4644abcd1e852bb5f512 + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace + "2d4ebc7211074bb7be26613eb25d8fc1" +[04/26/24 13:52:11] INFO Subtask f12eb3d3b4924e4085808236b460b43d + Thought: Now that the webpage content is stored in memory, I need to query this memory to find the information about how many copies of Elden + Ring have been sold. + Actions: [{"tag": "query_sales", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", + "artifact_namespace": "2d4ebc7211074bb7be26613eb25d8fc1", "query": "How many copies of Elden Ring have been sold?"}}}] +[04/26/24 13:52:14] INFO Subtask f12eb3d3b4924e4085808236b460b43d + Response: Elden Ring sold 23 million copies by February 2024. +[04/26/24 13:52:15] INFO ToolkitTask 7aca20f202df47a2b9848ed7025f9c21 + Output: Elden Ring sold 23 million copies by February 2024. +``` + +## Sensitive Data + +Because Task Memory splits up the storage and retrieval of data, you can use different models for each step. + +Here is an example where we use GPT-4 to orchestrate the Tools and store the data in Task Memory, and Amazon Bedrock's Titan model to query the raw content. +In this example, GPT-4 _never_ sees the contents of the page, only that it was stored in Task Memory. Even the query results generated by the Titan model are stored in Task Memory so that the `FileManager` can save the results to disk without GPT-4 ever seeing them. + + +```python +from griptape.artifacts import TextArtifact +from griptape.config import ( + OpenAiStructureConfig, +) +from griptape.drivers import ( + AmazonBedrockPromptDriver, + BedrockTitanPromptModelDriver, + AmazonBedrockTitanEmbeddingDriver, + LocalVectorStoreDriver, + OpenAiChatPromptDriver, +) +from griptape.engines import VectorQueryEngine +from griptape.memory import TaskMemory +from griptape.memory.task.storage import TextArtifactStorage +from griptape.structures import Agent +from griptape.tools import FileManager, TaskMemoryClient, WebScraper + +agent = Agent( + config=OpenAiStructureConfig( + prompt_driver=OpenAiChatPromptDriver(model="gpt-4"), + ), + task_memory=TaskMemory( + artifact_storages={ + TextArtifact: TextArtifactStorage( + query_engine=VectorQueryEngine( + prompt_driver=AmazonBedrockPromptDriver( + model="amazon.titan-text-express-v1", + prompt_model_driver=BedrockTitanPromptModelDriver(), + ), + vector_store_driver=LocalVectorStoreDriver( + embedding_driver=AmazonBedrockTitanEmbeddingDriver() + ), + ), + ), + } + ), + tools=[ + WebScraper(off_prompt=True), + TaskMemoryClient(off_prompt=True, allowlist=["query"]), + FileManager(off_prompt=True), # FileManager returns an InfoArtifact which will not be stored in Task Memory regardless of the off_prompt setting + ], +) + +agent.run( + "Use this page https://en.wikipedia.org/wiki/Elden_Ring to find how many copies of Elden Ring have been sold, and then save the result to a file." +) +``` + +``` +[04/30/24 16:36:45] INFO ToolkitTask 3d3c5f5a98a44f32ad9533621c036604 + Input: According to this page https://en.wikipedia.org/wiki/Elden_Ring, find how many copies of Elden Ring have been sold and then save the + result to a file. +[04/30/24 16:36:52] INFO Subtask 61ec822bfe49472c9ed874fad07d13a1 + Thought: First, I need to scrape the content of the provided URL. Then, I will search the scraped content for the number of copies of Elden Ring that have been sold. Finally, I will save this information to a file. + + Actions: [{"name": "WebScraper", "path": "get_content", "input": {"values": {"url": "https://en.wikipedia.org/wiki/Elden_Ring"}}, "tag": "scrape_elden_ring"}] +[04/30/24 16:37:04] INFO Subtask 61ec822bfe49472c9ed874fad07d13a1 + Response: Output of "WebScraper.get_content" was stored in memory with memory_name "TaskMemory" and artifact_namespace "c7a01e8202e24869b7be559e0daff110" +[04/30/24 16:37:10] INFO Subtask 32f9cb73d8944e5ca36bd68a90e4f4b2 + Thought: Now that the webpage content is stored in memory, I need to query this memory to find the number of copies of Elden Ring that have been sold. + Actions: [{"tag": "query_sales", "name": "TaskMemoryClient", "path": "query", "input": {"values": {"memory_name": "TaskMemory", "artifact_namespace": "c7a01e8202e24869b7be559e0daff110", "query": "How many copies of Elden Ring have been sold?"}}}] +[04/30/24 16:37:18] INFO Subtask 32f9cb73d8944e5ca36bd68a90e4f4b2 + Response: Output of "TaskMemoryClient.query" was stored in memory with memory_name "TaskMemory" and artifact_namespace "f8dd40fb302a47d7862c8b76eeaf61c2" +[04/30/24 16:37:25] INFO Subtask 74a5fd392b044956842a56b76d09183e + Thought: Now that I have the number of copies sold stored in memory, I need to save this information to a file. + Actions: [{"tag": "save_sales", "name": "FileManager", "path": "save_memory_artifacts_to_disk", "input": {"values": {"dir_name": "sales_data", "file_name": "elden_ring_sales.txt", "memory_name": "TaskMemory", "artifact_namespace": "f8dd40fb302a47d7862c8b76eeaf61c2"}}}] + INFO Subtask 74a5fd392b044956842a56b76d09183e + Response: Successfully saved memory artifacts to disk +[04/30/24 16:37:27] INFO ToolkitTask 3d3c5f5a98a44f32ad9533621c036604 + Output: The number of copies of Elden Ring sold has been successfully saved to the file "elden_ring_sales.txt" in the "sales_data" directory. +``` + +## Tools That Can Read From Task Memory + +As seen in the previous example, certain Tools are designed to read directly from Task Memory. This means that you can use these Tools to interact with the data stored in Task Memory without needing to pass it through the LLM. + +Today, these include: + +- [TaskMemoryClient](../../griptape-tools/official-tools/task-memory-client.md) +- [FileManager](../../griptape-tools/official-tools/file-manager.md) +- [AwsS3Client](../../griptape-tools/official-tools/aws-s3-client.md) +- [GoogleDriveClient](../../griptape-tools/official-tools/google-drive-client.md) +- [GoogleDocsClient](../../griptape-tools/official-tools/google-docs-client.md) + +## Task Memory Considerations + +Task Memory is a powerful feature of Griptape, but with great power comes great responsibility. Here are some things to keep in mind when using Task Memory: + +### Tool Return Types +Griptape will only store Artifacts in Task Memory that have been explicitly defined in the `artifact_storages` parameter of the `TaskMemory` object. +If you try to store an Artifact that is not defined in `artifact_storages`, Griptape will raise an error. The exception to this is `InfoArtifact`s and `ErrorArtifact`s. Griptape will never store these Artifacts store in Task Memory. +By default, Griptape will store `TextArtifact`'s, `BlobArtifact`'s in Task Memory. Additionally, Griptape will also store the elements of `ListArtifact`'s as long as they are of a supported Artifact type. + +### Not Providing a Task Memory Compatible Tool +When using Task Memory, make sure that you have at least one Tool that can read from Task Memory. If you don't, the data stored in Task Memory will be inaccessible to the Agent and it may hallucinate Tool Activities. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper + +agent = Agent( + tools=[ + WebScraper(off_prompt=True) # `off_prompt=True` will store the data in Task Memory + # Missing a Tool that can read from Task Memory + ] +) +agent.run("According to this page https://en.wikipedia.org/wiki/San_Francisco, what is the population of San Francisco?") +``` + +### Task Memory Looping +An improper configuration of Tools can lead to the LLM using the Tools in a loop. For example, if you have a Tool that stores data in Task Memory and another Tool that queries that data from Task Memory ([Tools That Can Read From Task Memory](#tools-that-can-read-from-task-memory)), make sure that the query Tool does not store the data back in Task Memory. +This can create a loop where the same data is stored and queried over and over again. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper + +agent = Agent( + tools=[ + WebScraper(off_prompt=True), # This tool will store the data in Task Memory + TaskMemoryClient(off_prompt=True) # This tool will store the data back in Task Memory with no way to get it out + ] +) +agent.run("According to this page https://en.wikipedia.org/wiki/Dark_forest_hypothesis, what is the Dark Forest Hypothesis?") +``` + +### Task Memory May Not Be Necessary +Task Memory may not be necessary for all use cases. If the data returned by a Tool is not sensitive, not too large, and does not need to be acted upon by another Tool, you can leave the default of `off_prompt` to `False` and return the data directly to the LLM. + +```python +from griptape.structures import Agent +from griptape.tools import WebScraper + +agent = Agent( + tools=[ + Calculator() # Default value of `off_prompt=False` will return the data directly to the LLM + ] +) +agent.run("What is 10 ^ 3, 55 / 23, and 12345 * 0.5?") +``` + diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index 683648cef..bff78a96c 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -103,7 +103,7 @@ agent = Agent() agent.add_task( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=True)] ), ) @@ -691,7 +691,6 @@ def build_researcher(): WebSearch( google_api_key=os.environ["GOOGLE_API_KEY"], google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], - off_prompt=False, ), WebScraper( off_prompt=True, diff --git a/docs/griptape-framework/tools/index.md b/docs/griptape-framework/tools/index.md index 6a131298c..0ae8054af 100644 --- a/docs/griptape-framework/tools/index.md +++ b/docs/griptape-framework/tools/index.md @@ -18,7 +18,7 @@ pipeline = Pipeline() pipeline.add_tasks( ToolkitTask( "Load https://www.griptape.ai, summarize it, and store it in a file called griptape.txt", - tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)] + tools=[WebScraper(off_prompt=True), FileManager(off_prompt=True), TaskMemoryClient(off_prompt=False)] ), ) diff --git a/docs/griptape-tools/index.md b/docs/griptape-tools/index.md index 0476cd7b1..869cde41e 100644 --- a/docs/griptape-tools/index.md +++ b/docs/griptape-tools/index.md @@ -31,7 +31,7 @@ A tool can have many "activities" as denoted by the `@activity` decorator. Each Output artifacts from all tool activities (except for `InfoArtifact` and `ErrorArtifact`) go to short-term `TaskMemory`. To disable that behavior set the `off_prompt` tool parameter to `False`: ```python title="PYTEST_IGNORE" -RandomNumberGenerator(off_prompt=False) +RandomNumberGenerator() ``` We provide a set of official Griptape Tools for accessing and processing data. You can also [build your own tools](./custom-tools/index.md). diff --git a/docs/griptape-tools/official-tools/aws-iam-client.md b/docs/griptape-tools/official-tools/aws-iam-client.md index 89f0ccbba..ac831d492 100644 --- a/docs/griptape-tools/official-tools/aws-iam-client.md +++ b/docs/griptape-tools/official-tools/aws-iam-client.md @@ -5,14 +5,14 @@ This tool enables LLMs to make AWS IAM API requests. ```python import boto3 from griptape.structures import Agent -from griptape.tools import AwsIamClient, TaskMemoryClient +from griptape.tools import AwsIamClient # Initialize the AWS IAM client aws_iam_client = AwsIamClient(session=boto3.Session()) # Create an agent with the AWS IAM client tool agent = Agent( - tools=[aws_iam_client, TaskMemoryClient(off_prompt=False)] + tools=[aws_iam_client] ) # Run the agent with a high-level task diff --git a/docs/griptape-tools/official-tools/aws-s3-client.md b/docs/griptape-tools/official-tools/aws-s3-client.md index 220a2d471..d7406a987 100644 --- a/docs/griptape-tools/official-tools/aws-s3-client.md +++ b/docs/griptape-tools/official-tools/aws-s3-client.md @@ -9,7 +9,8 @@ from griptape.tools import AwsS3Client, TaskMemoryClient # Initialize the AWS S3 client aws_s3_client = AwsS3Client( - session=boto3.Session() + session=boto3.Session(), + off_prompt=True ) # Create an agent with the AWS S3 client tool @@ -62,4 +63,4 @@ agent.run("List all my S3 buckets.") 3. Bucket Name: 'example-bucket-3', Creation Date: '2022-01-03T00:00:00Z' Please note that the creation dates are in UTC. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/calculator.md b/docs/griptape-tools/official-tools/calculator.md index af3159c82..648eee7f3 100644 --- a/docs/griptape-tools/official-tools/calculator.md +++ b/docs/griptape-tools/official-tools/calculator.md @@ -8,7 +8,7 @@ from griptape.tools import Calculator # Create an agent with the Calculator tool agent = Agent( - tools=[Calculator(off_prompt=False)] + tools=[Calculator()] ) # Run the agent with a task to perform the arithmetic calculation of \(10^5\) @@ -30,4 +30,4 @@ agent.run("What is 10 raised to the power of 5?") Response: 100000 [09/08/23 14:23:58] INFO Task bbc6002a5e5b4655bb52b6a550a1b2a5 Output: 10 raised to the power of 5 is 100000. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/computer.md b/docs/griptape-tools/official-tools/computer.md index 9ff9ed288..f2b23a548 100644 --- a/docs/griptape-tools/official-tools/computer.md +++ b/docs/griptape-tools/official-tools/computer.md @@ -6,14 +6,14 @@ You can specify a local working directory and environment variables during tool ```python from griptape.structures import Agent -from griptape.tools import Computer, TaskMemoryClient +from griptape.tools import Computer # Initialize the Computer tool computer = Computer() # Create an agent with the Computer tool agent = Agent( - tools=[computer, TaskMemoryClient(off_prompt=False)] + tools=[computer] ) # Create a file using the shell command @@ -104,4 +104,4 @@ agent.run(f"Run this shell command for me: cat {filename}") [09/11/23 16:25:10] INFO Task d08009ee983c4286ba10f83bcf3080e6 Output: The content of the file 'my_new_file.txt' is: 'This is the content of the file.' -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/date-time.md b/docs/griptape-tools/official-tools/date-time.md index fa2a2e153..6ecf6e2a6 100644 --- a/docs/griptape-tools/official-tools/date-time.md +++ b/docs/griptape-tools/official-tools/date-time.md @@ -8,7 +8,7 @@ from griptape.tools import DateTime # Create an agent with the DateTime tool agent = Agent( - tools=[DateTime(off_prompt=False)] + tools=[DateTime()] ) # Fetch the current date and time diff --git a/docs/griptape-tools/official-tools/file-manager.md b/docs/griptape-tools/official-tools/file-manager.md index cc10ccfcb..491711ba0 100644 --- a/docs/griptape-tools/official-tools/file-manager.md +++ b/docs/griptape-tools/official-tools/file-manager.md @@ -45,4 +45,4 @@ agent.run("Can you get me the sample1.txt file?") [09/12/23 12:08:10] INFO Task 16a1ce1847284ae3805485bad7d99116 Output: The content of the file "sample1.txt" is "This is the content of sample1.txt". -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/google-cal-client.md b/docs/griptape-tools/official-tools/google-cal-client.md index cc2661a92..4069d0246 100644 --- a/docs/griptape-tools/official-tools/google-cal-client.md +++ b/docs/griptape-tools/official-tools/google-cal-client.md @@ -5,7 +5,7 @@ The GoogleCalendarClient tool allows you to interact with Google Calendar. ```python import os -from griptape.tools import GoogleCalendarClient, TaskMemoryClient +from griptape.tools import GoogleCalendarClient from griptape.structures import Agent # Create the GoogleCalendarClient tool @@ -22,16 +22,17 @@ google_calendar_tool = GoogleCalendarClient( "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"] + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], + ) # Set up an agent using the GoogleCalendarClient tool agent = Agent( - tools=[google_calendar_tool, TaskMemoryClient(off_prompt=False)] + tools=[google_calendar_tool] ) # Task: Get upcoming events from a Google calendar agent.run( "Get me the details of the next upcoming event from my primary calendar.", ) -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/google-docs-client.md b/docs/griptape-tools/official-tools/google-docs-client.md index 26a4a1f10..db2f3c75b 100644 --- a/docs/griptape-tools/official-tools/google-docs-client.md +++ b/docs/griptape-tools/official-tools/google-docs-client.md @@ -22,7 +22,6 @@ google_docs_tool = GoogleDocsClient( "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] }, owner_email=os.environ["GOOGLE_OWNER_EMAIL"], - off_prompt=False ) # Set up an agent using the GoogleDocsClient tool @@ -60,4 +59,4 @@ agent.run( successfully created in the 'test' folder with the content 'Hey, Tony.'. The Google Doc ID is 1OgKbsPqxOnzkf65kodb1i1_qC1zjX_Bend5XL5bVxpA. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/google-drive-client.md b/docs/griptape-tools/official-tools/google-drive-client.md index 1c7d53541..069b9a6f9 100644 --- a/docs/griptape-tools/official-tools/google-drive-client.md +++ b/docs/griptape-tools/official-tools/google-drive-client.md @@ -22,7 +22,6 @@ google_drive_tool = GoogleDriveClient( "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] }, owner_email=os.environ["GOOGLE_OWNER_EMAIL"], - off_prompt=False ) # Set up an agent using the GoogleDriveClient tool @@ -57,4 +56,4 @@ agent.run( Output: The content 'Hi this is Tony' has been successfully saved in a file named 'hello.txt' on your Google Drive. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/google-gmail-client.md b/docs/griptape-tools/official-tools/google-gmail-client.md index 067928a39..d012939a2 100644 --- a/docs/griptape-tools/official-tools/google-gmail-client.md +++ b/docs/griptape-tools/official-tools/google-gmail-client.md @@ -21,8 +21,7 @@ gmail_tool = GoogleGmailClient( "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": os.environ["GOOGLE_CERT_URL"] }, - owner_email=os.environ["GOOGLE_OWNER_EMAIL"], - off_prompt=False + owner_email=os.environ["GOOGLE_OWNER_EMAIL"], ) # Set up an agent using the GoogleGmailClient tool @@ -59,4 +58,4 @@ agent.run( [10/05/23 13:24:19] INFO ToolkitTask 1f190f823d584053bfe9942f41b6cb2d Output: The draft email has been successfully created in Gmail with the ID: r6322867913697829111. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/image-query-client.md b/docs/griptape-tools/official-tools/image-query-client.md index 8da058d3e..a1044fb91 100644 --- a/docs/griptape-tools/official-tools/image-query-client.md +++ b/docs/griptape-tools/official-tools/image-query-client.md @@ -21,7 +21,6 @@ engine = ImageQueryEngine( # Create an Image Query Client configured to use the engine. tool = ImageQueryClient( image_query_engine=engine, - off_prompt=False, ) # Create an agent and provide the tool to it. diff --git a/docs/griptape-tools/official-tools/openweather-client.md b/docs/griptape-tools/official-tools/openweather-client.md index d6d150766..65d0975d4 100644 --- a/docs/griptape-tools/official-tools/openweather-client.md +++ b/docs/griptape-tools/official-tools/openweather-client.md @@ -5,16 +5,15 @@ The [OpenWeatherClient](../../reference/griptape/tools/openweather_client/tool.m ```python import os from griptape.structures import Agent -from griptape.tools import OpenWeatherClient, TaskMemoryClient +from griptape.tools import OpenWeatherClient agent = Agent( tools=[ OpenWeatherClient( api_key=os.environ["OPENWEATHER_API_KEY"], ), - TaskMemoryClient(off_prompt=False) ] ) agent.run("What's the weather currently like in San Francisco?") -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/rest-api-client.md b/docs/griptape-tools/official-tools/rest-api-client.md index a889f0e81..07ddccf86 100644 --- a/docs/griptape-tools/official-tools/rest-api-client.md +++ b/docs/griptape-tools/official-tools/rest-api-client.md @@ -20,7 +20,6 @@ posts_client = RestApiClient( base_url="https://jsonplaceholder.typicode.com", path="posts", description="Allows for creating, updating, deleting, patching, and getting posts.", - off_prompt=False, request_body_schema=dumps( { "$schema": "https://json-schema.org/draft/2019-09/schema", diff --git a/docs/griptape-tools/official-tools/sql-client.md b/docs/griptape-tools/official-tools/sql-client.md index 0e6fcf370..7e5bf35e6 100644 --- a/docs/griptape-tools/official-tools/sql-client.md +++ b/docs/griptape-tools/official-tools/sql-client.md @@ -8,7 +8,7 @@ import boto3 from griptape.drivers import AmazonRedshiftSqlDriver from griptape.loaders import SqlLoader from griptape.structures import Agent -from griptape.tools import SqlClient, TaskMemoryClient +from griptape.tools import SqlClient session = boto3.Session() @@ -29,7 +29,7 @@ sql_tool = SqlClient( ) agent = Agent( - tools=[sql_tool, TaskMemoryClient(off_prompt=False)] + tools=[sql_tool] ) agent.run("SELECT * FROM people;") ``` @@ -68,4 +68,4 @@ agent.run("SELECT * FROM people;") several employees. Notably, there are two employees named Tanya Cooley who are both managers, and two employees named John Doe who are both coders. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/structure-run-client.md b/docs/griptape-tools/official-tools/structure-run-client.md index 863e02727..0907fa06a 100644 --- a/docs/griptape-tools/official-tools/structure-run-client.md +++ b/docs/griptape-tools/official-tools/structure-run-client.md @@ -21,7 +21,6 @@ structure_run_tool = StructureRunClient( api_key=api_key, structure_id=structure_id, ), - off_prompt=False, ) # Set up an agent using the StructureRunClient tool diff --git a/docs/griptape-tools/official-tools/task-memory-client.md b/docs/griptape-tools/official-tools/task-memory-client.md index 9b32d4054..f91bee39a 100644 --- a/docs/griptape-tools/official-tools/task-memory-client.md +++ b/docs/griptape-tools/official-tools/task-memory-client.md @@ -7,5 +7,5 @@ from griptape.structures import Agent from griptape.tools import WebScraper, TaskMemoryClient -Agent(tools=[WebScraper(), TaskMemoryClient(off_prompt=False)]) +Agent(tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)]) ``` diff --git a/docs/griptape-tools/official-tools/vector-store-client.md b/docs/griptape-tools/official-tools/vector-store-client.md index 2b4d6cbe5..5af8cee88 100644 --- a/docs/griptape-tools/official-tools/vector-store-client.md +++ b/docs/griptape-tools/official-tools/vector-store-client.md @@ -24,7 +24,8 @@ engine.upsert_text_artifacts( vector_db = VectorStoreClient( description="This DB has information about the Griptape Python framework", query_engine=engine, - namespace="griptape" + namespace="griptape", + off_prompt=True ) agent = Agent( diff --git a/docs/griptape-tools/official-tools/web-scraper.md b/docs/griptape-tools/official-tools/web-scraper.md index ee52cc76c..dcd767b35 100644 --- a/docs/griptape-tools/official-tools/web-scraper.md +++ b/docs/griptape-tools/official-tools/web-scraper.md @@ -7,7 +7,7 @@ from griptape.structures import Agent from griptape.tools import WebScraper, TaskMemoryClient agent = Agent( - tools=[WebScraper(), TaskMemoryClient(off_prompt=False)] + tools=[WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False)] ) agent.run( @@ -73,4 +73,4 @@ agent.run( for deploying and managing AI apps, offering features like scheduling and connecting to data stores and APIs. -``` \ No newline at end of file +``` diff --git a/docs/griptape-tools/official-tools/web-search.md b/docs/griptape-tools/official-tools/web-search.md index f22ef1a23..2e2ea276d 100644 --- a/docs/griptape-tools/official-tools/web-search.md +++ b/docs/griptape-tools/official-tools/web-search.md @@ -14,7 +14,6 @@ web_search_tool = WebSearch( google_api_key=os.environ["GOOGLE_API_KEY"], google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], google_api_country="us", - off_prompt=False ) # Set up an agent using the WebSearch tool @@ -107,4 +106,4 @@ agent.run("Tell me how photosynthesis works") life on Earth as it is the primary source of oxygen in the atmosphere and forms the basis of the food chain. -``` \ No newline at end of file +``` diff --git a/griptape/tools/base_tool.py b/griptape/tools/base_tool.py index 4f1255665..8a0a924ac 100644 --- a/griptape/tools/base_tool.py +++ b/griptape/tools/base_tool.py @@ -41,7 +41,7 @@ class BaseTool(ActivityMixin, ABC): install_dependencies_on_init: bool = field(default=True, kw_only=True) dependencies_install_directory: Optional[str] = field(default=None, kw_only=True) verbose: bool = field(default=False, kw_only=True) - off_prompt: bool = field(default=True, kw_only=True) + off_prompt: bool = field(default=False, kw_only=True) def __attrs_post_init__(self) -> None: if self.install_dependencies_on_init: diff --git a/griptape/tools/task_memory_client/tool.py b/griptape/tools/task_memory_client/tool.py index 2a85a7c0f..b60c0acc0 100644 --- a/griptape/tools/task_memory_client/tool.py +++ b/griptape/tools/task_memory_client/tool.py @@ -1,5 +1,5 @@ from __future__ import annotations -from attrs import define, field +from attrs import define from schema import Schema, Literal from griptape.artifacts import TextArtifact, ErrorArtifact, InfoArtifact from griptape.tools import BaseTool @@ -8,8 +8,6 @@ @define class TaskMemoryClient(BaseTool): - off_prompt: bool = field(kw_only=True) # pyright: ignore[reportGeneralTypeIssues] - @activity( config={ "description": "Can be used to summarize memory content", diff --git a/mkdocs.yml b/mkdocs.yml index df2a1536c..b63f36fe5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -84,7 +84,7 @@ nav: - Pipelines: "griptape-framework/structures/pipelines.md" - Workflows: "griptape-framework/structures/workflows.md" - Tasks: "griptape-framework/structures/tasks.md" - - Task Memory: "griptape-framework/structures/task-memory.md" + - Task Memory and Off Prompt: "griptape-framework/structures/task-memory.md" - Conversation Memory: "griptape-framework/structures/conversation-memory.md" - Rulesets: "griptape-framework/structures/rulesets.md" - Config: "griptape-framework/structures/config.md" diff --git a/tests/integration/tasks/test_tool_task.py b/tests/integration/tasks/test_tool_task.py index eed0d7862..1fa48e98d 100644 --- a/tests/integration/tasks/test_tool_task.py +++ b/tests/integration/tasks/test_tool_task.py @@ -12,11 +12,7 @@ def structure_tester(self, request): from griptape.tools import Calculator return StructureTester( - Agent( - tasks=[ToolTask(tool=Calculator(off_prompt=False))], - conversation_memory=None, - prompt_driver=request.param, - ) + Agent(tasks=[ToolTask(tool=Calculator())], conversation_memory=None, prompt_driver=request.param) ) def test_tool_task(self, structure_tester): diff --git a/tests/integration/tasks/test_toolkit_task.py b/tests/integration/tasks/test_toolkit_task.py index f458fb7f6..97f068c5b 100644 --- a/tests/integration/tasks/test_toolkit_task.py +++ b/tests/integration/tasks/test_toolkit_task.py @@ -19,7 +19,6 @@ def structure_tester(self, request): WebSearch( google_api_key=os.environ["GOOGLE_API_KEY"], google_api_search_id=os.environ["GOOGLE_API_SEARCH_ID"], - off_prompt=False, ), WebScraper(off_prompt=True), TaskMemoryClient(off_prompt=False), diff --git a/tests/integration/tools/test_calculator.py b/tests/integration/tools/test_calculator.py index cb7e4a500..9015c7158 100644 --- a/tests/integration/tools/test_calculator.py +++ b/tests/integration/tools/test_calculator.py @@ -12,9 +12,7 @@ def structure_tester(self, request): from griptape.structures import Agent from griptape.tools import Calculator - return StructureTester( - Agent(tools=[Calculator(off_prompt=False)], conversation_memory=None, prompt_driver=request.param) - ) + return StructureTester(Agent(tools=[Calculator()], conversation_memory=None, prompt_driver=request.param)) def test_calculate(self, structure_tester): structure_tester.run("What is 7 times 3 divided by 5 plus 10.") diff --git a/tests/integration/tools/test_file_manager.py b/tests/integration/tools/test_file_manager.py index ec3623b8a..462e66470 100644 --- a/tests/integration/tools/test_file_manager.py +++ b/tests/integration/tools/test_file_manager.py @@ -12,9 +12,7 @@ def structure_tester(self, request): from griptape.structures import Agent from griptape.tools import FileManager - return StructureTester( - Agent(tools=[FileManager(off_prompt=False)], conversation_memory=None, prompt_driver=request.param) - ) + return StructureTester(Agent(tools=[FileManager()], conversation_memory=None, prompt_driver=request.param)) def test_save_content_to_disk(self, structure_tester): structure_tester.run('Write the content "Hello World!" to a file called "poem.txt".') diff --git a/tests/integration/tools/test_google_docs_client.py b/tests/integration/tools/test_google_docs_client.py index 1793f2d1f..dfb1eb95b 100644 --- a/tests/integration/tools/test_google_docs_client.py +++ b/tests/integration/tools/test_google_docs_client.py @@ -17,7 +17,6 @@ def structure_tester(self, request): Agent( tools=[ GoogleDocsClient( - off_prompt=False, service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], diff --git a/tests/integration/tools/test_google_drive_client.py b/tests/integration/tools/test_google_drive_client.py index 394df429e..9bbbacfb5 100644 --- a/tests/integration/tools/test_google_drive_client.py +++ b/tests/integration/tools/test_google_drive_client.py @@ -17,7 +17,6 @@ def structure_tester(self, request): Agent( tools=[ GoogleDriveClient( - off_prompt=False, service_account_credentials={ "type": os.environ["GOOGLE_ACCOUNT_TYPE"], "project_id": os.environ["GOOGLE_PROJECT_ID"], diff --git a/tests/unit/structures/test_agent.py b/tests/unit/structures/test_agent.py index a7d69b61b..371aee8a8 100644 --- a/tests/unit/structures/test_agent.py +++ b/tests/unit/structures/test_agent.py @@ -53,8 +53,8 @@ def test_rules_and_rulesets(self): agent = Agent() agent.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) - def test_with_default_task_memory(self): - agent = Agent(tools=[MockTool()]) + def test_with_task_memory(self): + agent = Agent(tools=[MockTool(off_prompt=True)]) assert isinstance(agent.task_memory, TaskMemory) assert agent.tools[0].input_memory is not None @@ -62,7 +62,14 @@ def test_with_default_task_memory(self): assert agent.tools[0].output_memory is not None assert agent.tools[0].output_memory["test"][0] == agent.task_memory - def test_with_default_task_memory_and_empty_tool_output_memory(self): + def test_with_task_memory_and_empty_tool_output_memory(self): + agent = Agent(tools=[MockTool(output_memory={}, off_prompt=True)]) + + assert isinstance(agent.task_memory, TaskMemory) + assert agent.tools[0].input_memory[0] == agent.task_memory + assert agent.tools[0].output_memory == {} + + def test_with_no_task_memory_and_empty_tool_output_memory(self): agent = Agent(tools=[MockTool(output_memory={})]) assert isinstance(agent.task_memory, TaskMemory) diff --git a/tests/unit/structures/test_pipeline.py b/tests/unit/structures/test_pipeline.py index ef9eba518..8c1cd8511 100644 --- a/tests/unit/structures/test_pipeline.py +++ b/tests/unit/structures/test_pipeline.py @@ -64,11 +64,21 @@ def test_rules_and_rulesets(self): pipeline = Pipeline() pipeline.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) - def test_with_default_task_memory(self): + def test_with_no_task_memory(self): pipeline = Pipeline() pipeline.add_task(ToolkitTask(tools=[MockTool()])) + assert isinstance(pipeline.tasks[0], ToolkitTask) + assert pipeline.tasks[0].tools[0].input_memory is not None + assert pipeline.tasks[0].tools[0].input_memory[0] == pipeline.task_memory + assert pipeline.tasks[0].tools[0].output_memory is None + + def test_with_task_memory(self): + pipeline = Pipeline() + + pipeline.add_task(ToolkitTask(tools=[MockTool(off_prompt=True)])) + assert isinstance(pipeline.tasks[0], ToolkitTask) assert pipeline.tasks[0].task_memory == pipeline.task_memory assert pipeline.tasks[0].tools[0].input_memory is not None @@ -88,15 +98,15 @@ def test_embedding_driver(self): assert memory_embedding_driver == embedding_driver - def test_with_default_task_memory_and_empty_tool_output_memory(self): + def test_with_task_memory_and_empty_tool_output_memory(self): pipeline = Pipeline() - pipeline.add_task(ToolkitTask(tools=[MockTool(output_memory={})])) + pipeline.add_task(ToolkitTask(tools=[MockTool(output_memory={}, off_prompt=True)])) assert isinstance(pipeline.tasks[0], ToolkitTask) assert pipeline.tasks[0].tools[0].output_memory == {} - def test_without_default_task_memory(self): + def test_without_task_memory(self): pipeline = Pipeline(task_memory=None) pipeline.add_task(ToolkitTask(tools=[MockTool()])) diff --git a/tests/unit/structures/test_workflow.py b/tests/unit/structures/test_workflow.py index 2b40348c5..970d43e74 100644 --- a/tests/unit/structures/test_workflow.py +++ b/tests/unit/structures/test_workflow.py @@ -61,11 +61,21 @@ def test_rules_and_rulesets(self): workflow = Workflow() workflow.add_task(PromptTask(rules=[Rule("foo test")], rulesets=[Ruleset("Bar", [Rule("bar test")])])) - def test_with_default_task_memory(self): + def test_with_no_task_memory(self): workflow = Workflow() workflow.add_task(ToolkitTask(tools=[MockTool()])) + assert isinstance(workflow.tasks[0], ToolkitTask) + assert workflow.tasks[0].tools[0].input_memory is not None + assert workflow.tasks[0].tools[0].input_memory[0] == workflow.task_memory + assert workflow.tasks[0].tools[0].output_memory is None + + def test_with_task_memory(self): + workflow = Workflow() + + workflow.add_task(ToolkitTask(tools=[MockTool(off_prompt=True)])) + assert isinstance(workflow.tasks[0], ToolkitTask) assert workflow.tasks[0].tools[0].input_memory is not None assert workflow.tasks[0].tools[0].input_memory[0] == workflow.task_memory @@ -84,15 +94,15 @@ def test_embedding_driver(self): assert memory_embedding_driver == embedding_driver - def test_with_default_task_memory_and_empty_tool_output_memory(self): + def test_with_task_memory_and_empty_tool_output_memory(self): workflow = Workflow() - workflow.add_task(ToolkitTask(tools=[MockTool(output_memory={})])) + workflow.add_task(ToolkitTask(tools=[MockTool(output_memory={}, off_prompt=True)])) assert isinstance(workflow.tasks[0], ToolkitTask) assert workflow.tasks[0].tools[0].output_memory == {} - def test_without_default_task_memory(self): + def test_without_task_memory(self): workflow = Workflow(task_memory=None) workflow.add_task(ToolkitTask(tools=[MockTool()])) @@ -306,7 +316,6 @@ def test_run_topology_4(self): movie_info_2 = PromptTask(id="movie_info_2") movie_info_3 = PromptTask(id="movie_info_3") compare_movies = PromptTask(id="compare_movies") - prepare_email_task = PromptTask(id="prepare_email_task") send_email_task = PromptTask(id="send_email_task") save_to_disk = PromptTask(id="save_to_disk") publish_website = PromptTask(id="publish_website") diff --git a/tests/unit/tasks/test_tool_task.py b/tests/unit/tasks/test_tool_task.py index 482fead7a..6ae7300f9 100644 --- a/tests/unit/tasks/test_tool_task.py +++ b/tests/unit/tasks/test_tool_task.py @@ -147,7 +147,7 @@ def agent(self): ) def test_run_without_memory(self, agent): - task = ToolTask(tool=MockTool(off_prompt=False)) + task = ToolTask(tool=MockTool()) agent.add_task(task) @@ -155,7 +155,7 @@ def test_run_without_memory(self, agent): assert task.run().value == "ack foobar" def test_run_with_memory(self, agent): - task = ToolTask(tool=MockTool()) + task = ToolTask(tool=MockTool(off_prompt=True)) agent.add_task(task) @@ -170,7 +170,7 @@ def test_meta_memory(self): memory.process_output(MockTool().test, subtask, TextArtifact("foo")) - task = ToolTask(tool=MockTool(off_prompt=False)) + task = ToolTask(tool=MockTool()) agent.add_task(task) diff --git a/tests/unit/tasks/test_toolkit_task.py b/tests/unit/tasks/test_toolkit_task.py index 33c0deda8..bba94f82d 100644 --- a/tests/unit/tasks/test_toolkit_task.py +++ b/tests/unit/tasks/test_toolkit_task.py @@ -281,7 +281,7 @@ def test_find_memory(self, query_engine): m1 = defaults.text_task_memory("Memory1") m2 = defaults.text_task_memory("Memory2") - tool = MockTool(name="Tool1", output_memory={"test": [m1, m2]}) + tool = MockTool(name="Tool1", output_memory={"test": [m1, m2]}, off_prompt=True) task = ToolkitTask("test", tools=[tool]) Agent().add_task(task) @@ -293,11 +293,13 @@ def test_memory(self, query_engine): tool1 = MockTool( name="Tool1", output_memory={"test": [defaults.text_task_memory("Memory1"), defaults.text_task_memory("Memory2")]}, + off_prompt=True, ) tool2 = MockTool( name="Tool2", output_memory={"test": [defaults.text_task_memory("Memory1"), defaults.text_task_memory("Memory3")]}, + off_prompt=True, ) task = ToolkitTask(tools=[tool1, tool2]) diff --git a/tests/unit/tools/test_base_tool.py b/tests/unit/tools/test_base_tool.py index 7306e8a4e..a8fc55cc2 100644 --- a/tests/unit/tools/test_base_tool.py +++ b/tests/unit/tools/test_base_tool.py @@ -133,11 +133,13 @@ def tool(self): def test_off_prompt(self, tool): assert ( - ToolkitTask(task_memory=defaults.text_task_memory("TestMemory"), tools=[MockTool()]).tools[0].output_memory + not ToolkitTask(task_memory=defaults.text_task_memory("TestMemory"), tools=[MockTool()]) + .tools[0] + .output_memory ) assert ( - not ToolkitTask(task_memory=defaults.text_task_memory("TestMemory"), tools=[MockTool(off_prompt=False)]) + ToolkitTask(task_memory=defaults.text_task_memory("TestMemory"), tools=[MockTool(off_prompt=True)]) .tools[0] .output_memory ) @@ -171,10 +173,10 @@ def test_validate(self, tool): def test_invalid_config(self): try: - from tests.mocks.invalid_mock_tool.tool import InvalidMockTool + from tests.mocks.invalid_mock_tool.tool import InvalidMockTool # noqa assert False - except SchemaMissingKeyError as e: + except SchemaMissingKeyError: assert True def test_memory(self): diff --git a/tests/unit/tools/test_google_cal_client.py b/tests/unit/tools/test_google_cal_client.py deleted file mode 100644 index e69de29bb..000000000 From 81ec3b637ae9c924a80ecdfdfb472f760ef99ee1 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 3 Jun 2024 10:30:26 -0700 Subject: [PATCH 066/238] Update openai example to use gpt-4o (#817) --- docs/griptape-framework/drivers/prompt-drivers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/griptape-framework/drivers/prompt-drivers.md b/docs/griptape-framework/drivers/prompt-drivers.md index e2b324ee1..bf8814330 100644 --- a/docs/griptape-framework/drivers/prompt-drivers.md +++ b/docs/griptape-framework/drivers/prompt-drivers.md @@ -75,7 +75,7 @@ agent = Agent( prompt_driver=OpenAiChatPromptDriver( api_key=os.environ["OPENAI_API_KEY"], temperature=0.1, - model="gpt-3.5-turbo", + model="gpt-4o", response_format="json_object", seed=42, ) From 385cb620025b5f833b34d0c525b150fdbb962652 Mon Sep 17 00:00:00 2001 From: Collin Dutter Date: Mon, 3 Jun 2024 11:26:40 -0700 Subject: [PATCH 067/238] Fix doc examples (#819) --- docs/griptape-framework/misc/events.md | 2 +- docs/griptape-framework/structures/task-memory.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/griptape-framework/misc/events.md b/docs/griptape-framework/misc/events.md index ec54f7106..0921676fb 100644 --- a/docs/griptape-framework/misc/events.md +++ b/docs/griptape-framework/misc/events.md @@ -163,7 +163,7 @@ You can also use the [Stream](../../reference/griptape/utils/stream.md) utility from griptape.utils import Stream from griptape.tasks import ToolkitTask from griptape.structures import Pipeline -from griptape.tools import WebScraper +from griptape.tools import WebScraper, TaskMemoryClient pipeline = Pipeline() diff --git a/docs/griptape-framework/structures/task-memory.md b/docs/griptape-framework/structures/task-memory.md index 08e4e9444..f76094dad 100644 --- a/docs/griptape-framework/structures/task-memory.md +++ b/docs/griptape-framework/structures/task-memory.md @@ -135,7 +135,7 @@ Let's say we want to query the contents of a very large webpage. from griptape.structures import Agent from griptape.tools import WebScraper -# Create an agent with the Calculator tool +# Create an agent with the WebScraper tool agent = Agent(tools=[WebScraper()]) agent.run( @@ -315,7 +315,7 @@ This can create a loop where the same data is stored and queried over and over a ```python from griptape.structures import Agent -from griptape.tools import WebScraper +from griptape.tools import WebScraper, TaskMemoryClient agent = Agent( tools=[ @@ -331,7 +331,7 @@ Task Memory may not be necessary for all use cases. If the data returned by a To ```python from griptape.structures import Agent -from griptape.tools import WebScraper +from griptape.tools import Calculator agent = Agent( tools=[ From ff008c021e18933ac0e5ea0bb6238a97c2864cf4 Mon Sep 17 00:00:00 2001 From: Andrew French Date: Tue, 4 Jun 2024 09:07:19 -0700 Subject: [PATCH 068/238] Audio transcription support (#781) --- CHANGELOG.md | 3 + docs/griptape-framework/data/loaders.md | 21 +++++++ .../drivers/audio-transcription-drivers.md | 32 ++++++++++ .../engines/audio-engines.md | 23 ++++++++ docs/griptape-framework/structures/tasks.md | 54 +++++++++++++++++ .../audio-transcription-client.md | 24 ++++++++ .../official-tools/text-to-speech-client.md | 2 +- griptape/config/base_structure_config.py | 2 + griptape/config/openai_structure_config.py | 12 ++++ griptape/config/structure_config.py | 5 ++ griptape/drivers/__init__.py | 7 +++ .../drivers/audio_transcription/__init__.py | 0 .../base_audio_transcription_driver.py | 42 +++++++++++++ .../dummy_audio_transcription_driver.py | 14 +++++ .../openai_audio_transcription_driver.py | 43 ++++++++++++++ griptape/engines/__init__.py | 2 + .../audio/audio_transcription_engine.py | 12 ++++ griptape/events/__init__.py | 6 ++ .../events/base_audio_transcription_event.py | 4 ++ .../finish_audio_transcription_event.py | 4 ++ .../events/start_audio_transcription_event.py | 4 ++ griptape/loaders/__init__.py | 2 + griptape/loaders/audio_loader.py | 22 +++++++ griptape/tasks/__init__.py | 2 + griptape/tasks/audio_transcription_task.py | 51 ++++++++++++++++ .../audio_transcription_client/__init__.py | 0 .../audio_transcription_client/manifest.yml | 5 ++ .../tools/audio_transcription_client/tool.py | 55 ++++++++++++++++++ mkdocs.yml | 2 + poetry.lock | 18 +++++- pyproject.toml | 3 + tests/resources/sentences.wav | Bin 0 -> 538014 bytes tests/resources/sentences2.wav | Bin 0 -> 628642 bytes .../test_amazon_bedrock_structure_config.py | 1 + .../config/test_anthropic_structure_config.py | 1 + .../test_azure_openai_structure_config.py | 3 +- .../config/test_google_structure_config.py | 1 + .../config/test_openai_structure_config.py | 17 +++++- tests/unit/config/test_structure_config.py | 1 + tests/unit/drivers/transcription/__init__.py | 0 .../test_openai_audio_transcription_driver.py | 25 ++++++++ tests/unit/loaders/test_audio_loader.py | 41 +++++++++++++ .../tasks/test_audio_transcription_task.py | 38 ++++++++++++ tests/unit/tools/test_transcription_client.py | 47 +++++++++++++++ 44 files changed, 645 insertions(+), 6 deletions(-) create mode 100644 docs/griptape-framework/drivers/audio-transcription-drivers.md create mode 100644 docs/griptape-tools/official-tools/audio-transcription-client.md create mode 100644 griptape/drivers/audio_transcription/__init__.py create mode 100644 griptape/drivers/audio_transcription/base_audio_transcription_driver.py create mode 100644 griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py create mode 100644 griptape/drivers/audio_transcription/openai_audio_transcription_driver.py create mode 100644 griptape/engines/audio/audio_transcription_engine.py create mode 100644 griptape/events/base_audio_transcription_event.py create mode 100644 griptape/events/finish_audio_transcription_event.py create mode 100644 griptape/events/start_audio_transcription_event.py create mode 100644 griptape/loaders/audio_loader.py create mode 100644 griptape/tasks/audio_transcription_task.py create mode 100644 griptape/tools/audio_transcription_client/__init__.py create mode 100644 griptape/tools/audio_transcription_client/manifest.yml create mode 100644 griptape/tools/audio_transcription_client/tool.py create mode 100644 tests/resources/sentences.wav create mode 100644 tests/resources/sentences2.wav create mode 100644 tests/unit/drivers/transcription/__init__.py create mode 100644 tests/unit/drivers/transcription/test_openai_audio_transcription_driver.py create mode 100644 tests/unit/loaders/test_audio_loader.py create mode 100644 tests/unit/tasks/test_audio_transcription_task.py create mode 100644 tests/unit/tools/test_transcription_client.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d053ac1fb..cf0d8ed36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `AzureOpenAiStructureConfig` for providing Structures with all Azure OpenAI Driver configuration. - `AzureOpenAiVisionImageQueryDriver` to support queries on images using Azure's OpenAI Vision models. +- `AudioLoader` for loading audio content into an `AudioArtifact`. +- `AudioTranscriptionTask` and `AudioTranscriptionClient` for transcribing audio content in Structures. +- `OpenAiAudioTranscriptionDriver` for integration with OpenAI's speech-to-text models, including Whisper. - Parameter `env` to `BaseStructureRunDriver` to set environment variables for a Structure Run. ### Changed diff --git a/docs/griptape-framework/data/loaders.md b/docs/griptape-framework/data/loaders.md index d767d0d8f..69ffeda06 100644 --- a/docs/griptape-framework/data/loaders.md +++ b/docs/griptape-framework/data/loaders.md @@ -199,3 +199,24 @@ loader.load(EmailLoader.EmailQuery(label="INBOX")) loader.load_collection([EmailLoader.EmailQuery(label="INBOX"), EmailLoader.EmailQuery(label="SENT")]) ``` + +## Audio Loader + +!!! info + This driver requires the `loaders-audio` [extra](../index.md#extras). + +The [Audio Loader](../../reference/griptape/loaders/audio_loader.md) is used to load audio content as an [AudioArtifact](./artifacts.md#audioartifact). The Loader operates on audio bytes that can be sourced from files on disk, downloaded audio, or audio in memory. + +The Loader will load audio in its native format and populates the resulting Artifact's `format` field by making a best-effort guess of the underlying audio format using the `filetype` package. + +```python +from griptape.loaders import AudioLoader +from griptape.utils import load_file + +# Load an image from disk +with open("tests/resources/sentences.wav", "rb") as f: + audio_artifact = AudioLoader().load(f.read()) + +# You can also use the load_file utility function +AudioLoader().load(load_file("tests/resources/sentences.wav")) +``` diff --git a/docs/griptape-framework/drivers/audio-transcription-drivers.md b/docs/griptape-framework/drivers/audio-transcription-drivers.md new file mode 100644 index 000000000..ddadcb89a --- /dev/null +++ b/docs/griptape-framework/drivers/audio-transcription-drivers.md @@ -0,0 +1,32 @@ +## Overview + +[Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md) extract text from spoken audio. + +This driver acts as a critical bridge between audio transcription Engines and the underlying models, facilitating the construction and execution of API calls that transform speech into editable and searchable text. Utilized predominantly in applications that support the input of verbal communications, the Audio Transcription Driver effectively extracts and interprets speech, rendering it into a textual format that can be easily integrated into data systems and Workflows. + +This capability is essential for enhancing accessibility, improving content discoverability, and automating tasks that traditionally relied on manual transcription, thereby streamlining operations and enhancing efficiency across various industries. + +### OpenAI + +The [OpenAI Audio Transcription Driver](../../reference/griptape/drivers/audio_transcription/openai_audio_transcription_driver.md) utilizes OpenAI's sophisticated `whisper` model to accurately transcribe spoken audio into text. This model supports multiple languages, ensuring precise transcription across a wide range of dialects. + +```python +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient +from griptape.structures import Agent + + +driver = OpenAiAudioTranscriptionDriver( + model="whisper-1" +) + +tool = AudioTranscriptionClient( + off_prompt=False, + engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Agent(tools=[tool]).run("Transcribe the following audio file: tests/resources/sentences.wav") +``` diff --git a/docs/griptape-framework/engines/audio-engines.md b/docs/griptape-framework/engines/audio-engines.md index 514b8dd8f..cbef1ef23 100644 --- a/docs/griptape-framework/engines/audio-engines.md +++ b/docs/griptape-framework/engines/audio-engines.md @@ -27,3 +27,26 @@ engine.run( prompts=["Hello, world!"], ) ``` + +### Audio Transcription Engine + +The [Audio Transcription Engine](../../reference/griptape/engines/audio/audio_transcription_engine.md) facilitates transcribing speech from audio inputs. + +```python +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.loaders import AudioLoader +from griptape.utils import load_file + + +driver = OpenAiAudioTranscriptionDriver( + model="whisper-1" +) + +engine = AudioTranscriptionEngine( + audio_transcription_driver=driver, +) + +audio_artifact = AudioLoader().load(load_file("tests/resources/sentences.wav")) +engine.run(audio_artifact) +``` diff --git a/docs/griptape-framework/structures/tasks.md b/docs/griptape-framework/structures/tasks.md index bff78a96c..0f05ea3e2 100644 --- a/docs/griptape-framework/structures/tasks.md +++ b/docs/griptape-framework/structures/tasks.md @@ -805,3 +805,57 @@ team = Pipeline( team.run() ``` + +## Text to Speech Task + +This Task enables Structures to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). + +```python +import os + +from griptape.drivers import ElevenLabsTextToSpeechDriver +from griptape.engines import TextToSpeechEngine +from griptape.tasks import TextToSpeechTask +from griptape.structures import Pipeline + + +driver = ElevenLabsTextToSpeechDriver( + api_key=os.getenv("ELEVEN_LABS_API_KEY"), + model="eleven_multilingual_v2", + voice="Matilda", +) + +task = TextToSpeechTask( + text_to_speech_engine=TextToSpeechEngine( + text_to_speech_driver=driver, + ), +) + +Pipeline(tasks=[task]).run("Generate audio from this text: 'Hello, world!'") +``` + +## Audio Transcription Task + +This Task enables Structures to transcribe speech from text using [Audio Transcription Engines](../../reference/griptape/engines/audio/audio_transcription_engine.md) and [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md). + +```python +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.loaders import AudioLoader +from griptape.tasks import AudioTranscriptionTask +from griptape.structures import Pipeline +from griptape.utils import load_file + +driver = OpenAiAudioTranscriptionDriver( + model="whisper-1" +) + +task = AudioTranscriptionTask( + input=lambda _: AudioLoader().load(load_file("tests/resources/sentences2.wav")), + audio_transcription_engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Pipeline(tasks=[task]).run() +``` diff --git a/docs/griptape-tools/official-tools/audio-transcription-client.md b/docs/griptape-tools/official-tools/audio-transcription-client.md new file mode 100644 index 000000000..5cb458d76 --- /dev/null +++ b/docs/griptape-tools/official-tools/audio-transcription-client.md @@ -0,0 +1,24 @@ +# AudioTranscriptionClient + +This Tool enables [Agents](../../griptape-framework/structures/agents.md) to transcribe speech from text using [Audio Transcription Engines](../../reference/griptape/engines/audio/audio_transcription_engine.md) and [Audio Transcription Drivers](../../reference/griptape/drivers/audio_transcription/index.md). + +```python +from griptape.drivers import OpenAiAudioTranscriptionDriver +from griptape.engines import AudioTranscriptionEngine +from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient +from griptape.structures import Agent + + +driver = OpenAiAudioTranscriptionDriver( + model="whisper-1" +) + +tool = AudioTranscriptionClient( + off_prompt=False, + engine=AudioTranscriptionEngine( + audio_transcription_driver=driver, + ), +) + +Agent(tools=[tool]).run("Transcribe the following audio file: /Users/andrew/code/griptape/tests/resources/sentences2.wav") +``` \ No newline at end of file diff --git a/docs/griptape-tools/official-tools/text-to-speech-client.md b/docs/griptape-tools/official-tools/text-to-speech-client.md index f016db551..622b5bf3a 100644 --- a/docs/griptape-tools/official-tools/text-to-speech-client.md +++ b/docs/griptape-tools/official-tools/text-to-speech-client.md @@ -1,6 +1,6 @@ # TextToSpeechClient -This tool enables LLMs to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). +This Tool enables LLMs to synthesize speech from text using [Text to Speech Engines](../../reference/griptape/engines/audio/text_to_speech_engine.md) and [Text to Speech Drivers](../../reference/griptape/drivers/text_to_speech/index.md). ```python import os diff --git a/griptape/config/base_structure_config.py b/griptape/config/base_structure_config.py index a94cf75d9..0e07d29f5 100644 --- a/griptape/config/base_structure_config.py +++ b/griptape/config/base_structure_config.py @@ -14,6 +14,7 @@ BasePromptDriver, BaseVectorStoreDriver, BaseTextToSpeechDriver, + BaseAudioTranscriptionDriver, ) from griptape.utils import dict_merge @@ -29,6 +30,7 @@ class BaseStructureConfig(BaseConfig, ABC): default=None, kw_only=True, metadata={"serializable": True} ) text_to_speech_driver: BaseTextToSpeechDriver = field(kw_only=True, metadata={"serializable": True}) + audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True, metadata={"serializable": True}) def merge_config(self, config: dict) -> BaseStructureConfig: base_config = self.to_dict() diff --git a/griptape/config/openai_structure_config.py b/griptape/config/openai_structure_config.py index 459160b11..416306a98 100644 --- a/griptape/config/openai_structure_config.py +++ b/griptape/config/openai_structure_config.py @@ -11,6 +11,10 @@ OpenAiChatPromptDriver, OpenAiEmbeddingDriver, OpenAiImageGenerationDriver, + BaseTextToSpeechDriver, + OpenAiTextToSpeechDriver, + BaseAudioTranscriptionDriver, + OpenAiAudioTranscriptionDriver, OpenAiImageQueryDriver, ) @@ -40,3 +44,11 @@ class OpenAiStructureConfig(StructureConfig): kw_only=True, metadata={"serializable": True}, ) + text_to_speech_driver: BaseTextToSpeechDriver = field( + default=Factory(lambda: OpenAiTextToSpeechDriver(model="tts")), kw_only=True, metadata={"serializable": True} + ) + audio_transcription_driver: BaseAudioTranscriptionDriver = field( + default=Factory(lambda: OpenAiAudioTranscriptionDriver(model="whisper-1")), + kw_only=True, + metadata={"serializable": True}, + ) diff --git a/griptape/config/structure_config.py b/griptape/config/structure_config.py index 63f1ea9f3..ae3ad1e99 100644 --- a/griptape/config/structure_config.py +++ b/griptape/config/structure_config.py @@ -17,6 +17,8 @@ BaseImageQueryDriver, BaseTextToSpeechDriver, DummyTextToSpeechDriver, + BaseAudioTranscriptionDriver, + DummyAudioTranscriptionDriver, ) @@ -43,3 +45,6 @@ class StructureConfig(BaseStructureConfig): text_to_speech_driver: BaseTextToSpeechDriver = field( default=Factory(lambda: DummyTextToSpeechDriver()), kw_only=True, metadata={"serializable": True} ) + audio_transcription_driver: BaseAudioTranscriptionDriver = field( + default=Factory(lambda: DummyAudioTranscriptionDriver()), kw_only=True, metadata={"serializable": True} + ) diff --git a/griptape/drivers/__init__.py b/griptape/drivers/__init__.py index 6043b0b43..6c64756e1 100644 --- a/griptape/drivers/__init__.py +++ b/griptape/drivers/__init__.py @@ -107,6 +107,10 @@ from .structure_run.griptape_cloud_structure_run_driver import GriptapeCloudStructureRunDriver from .structure_run.local_structure_run_driver import LocalStructureRunDriver +from .audio_transcription.base_audio_transcription_driver import BaseAudioTranscriptionDriver +from .audio_transcription.dummy_audio_transcription_driver import DummyAudioTranscriptionDriver +from .audio_transcription.openai_audio_transcription_driver import OpenAiAudioTranscriptionDriver + __all__ = [ "BasePromptDriver", "OpenAiChatPromptDriver", @@ -199,4 +203,7 @@ "BaseStructureRunDriver", "GriptapeCloudStructureRunDriver", "LocalStructureRunDriver", + "BaseAudioTranscriptionDriver", + "DummyAudioTranscriptionDriver", + "OpenAiAudioTranscriptionDriver", ] diff --git a/griptape/drivers/audio_transcription/__init__.py b/griptape/drivers/audio_transcription/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/drivers/audio_transcription/base_audio_transcription_driver.py b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py new file mode 100644 index 000000000..3cc368c94 --- /dev/null +++ b/griptape/drivers/audio_transcription/base_audio_transcription_driver.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Optional + +from attrs import define, field + +from griptape.artifacts import TextArtifact, AudioArtifact +from griptape.events import StartAudioTranscriptionEvent, FinishAudioTranscriptionEvent +from griptape.mixins import ExponentialBackoffMixin, SerializableMixin + +if TYPE_CHECKING: + from griptape.structures import Structure + + +@define +class BaseAudioTranscriptionDriver(SerializableMixin, ExponentialBackoffMixin, ABC): + model: str = field(kw_only=True, metadata={"serializable": True}) + structure: Optional[Structure] = field(default=None, kw_only=True) + + def before_run(self) -> None: + if self.structure: + self.structure.publish_event(StartAudioTranscriptionEvent()) + + def after_run(self) -> None: + if self.structure: + self.structure.publish_event(FinishAudioTranscriptionEvent()) + + def run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: + for attempt in self.retrying(): + with attempt: + self.before_run() + result = self.try_run(audio, prompts) + self.after_run() + + return result + + else: + raise Exception("Failed to run audio transcription") + + @abstractmethod + def try_run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: ... diff --git a/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py new file mode 100644 index 000000000..1602604e4 --- /dev/null +++ b/griptape/drivers/audio_transcription/dummy_audio_transcription_driver.py @@ -0,0 +1,14 @@ +from typing import Optional + +from attrs import define, field +from griptape.artifacts import AudioArtifact, TextArtifact +from griptape.drivers import BaseAudioTranscriptionDriver +from griptape.exceptions import DummyException + + +@define +class DummyAudioTranscriptionDriver(BaseAudioTranscriptionDriver): + model: str = field(init=False) + + def try_run(self, audio: AudioArtifact, prompts: Optional[list] = None) -> TextArtifact: + raise DummyException(__class__.__name__, "try_transcription") diff --git a/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py new file mode 100644 index 000000000..14b367521 --- /dev/null +++ b/griptape/drivers/audio_transcription/openai_audio_transcription_driver.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import io +from typing import Optional + +import openai +from attrs import field, Factory, define + +from griptape.artifacts import AudioArtifact, TextArtifact +from griptape.drivers import BaseAudioTranscriptionDriver + + +@define +class OpenAiAudioTranscriptionDriver(BaseAudioTranscriptionDriver): + api_type: str = field(default=openai.api_type, kw_only=True) + api_version: Optional[str] = field(default=openai.api_version, kw_only=True, metadata={"serializable": True}) + base_url: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": True}) + api_key: Optional[str] = field(default=None, kw_only=True, metadata={"serializable": False}) + organization: Optional[str] = field(default=openai.organization, kw_only=True, metadata={"serializable": True}) + client: openai.OpenAI = field( + default=Factory( + lambda self: openai.OpenAI(api_key=self.api_key, base_url=self.base_url, organization=self.organization), + takes_self=True, + ) + ) + + def try_run(self, audio: AudioArtifact, prompts: Optional[list[str]] = None) -> TextArtifact: + additional_params = {} + + if prompts is not None: + additional_params["prompt"] = ", ".join(prompts) + + transcription = self.client.audio.transcriptions.create( + # Even though we're not actually providing a file to the client, the API still requires that we send a file + # name. We set the file name to use the same format as the audio file so that the API can reject + # it if the format is unsupported. + model=self.model, + file=(f"a.{audio.format}", io.BytesIO(audio.value)), + response_format="json", + **additional_params, + ) + + return TextArtifact(value=transcription.text) diff --git a/griptape/engines/__init__.py b/griptape/engines/__init__.py index f76e373ef..17adaa53d 100644 --- a/griptape/engines/__init__.py +++ b/griptape/engines/__init__.py @@ -12,6 +12,7 @@ from .image.outpainting_image_generation_engine import OutpaintingImageGenerationEngine from .image_query.image_query_engine import ImageQueryEngine from .audio.text_to_speech_engine import TextToSpeechEngine +from .audio.audio_transcription_engine import AudioTranscriptionEngine __all__ = [ "BaseQueryEngine", @@ -28,4 +29,5 @@ "OutpaintingImageGenerationEngine", "ImageQueryEngine", "TextToSpeechEngine", + "AudioTranscriptionEngine", ] diff --git a/griptape/engines/audio/audio_transcription_engine.py b/griptape/engines/audio/audio_transcription_engine.py new file mode 100644 index 000000000..3631b2d17 --- /dev/null +++ b/griptape/engines/audio/audio_transcription_engine.py @@ -0,0 +1,12 @@ +from attrs import define, field + +from griptape.artifacts import AudioArtifact, TextArtifact +from griptape.drivers import BaseAudioTranscriptionDriver + + +@define +class AudioTranscriptionEngine: + audio_transcription_driver: BaseAudioTranscriptionDriver = field(kw_only=True) + + def run(self, audio: AudioArtifact, *args, **kwargs) -> TextArtifact: + return self.audio_transcription_driver.try_run(audio) diff --git a/griptape/events/__init__.py b/griptape/events/__init__.py index 0aa4552dd..944a309eb 100644 --- a/griptape/events/__init__.py +++ b/griptape/events/__init__.py @@ -19,6 +19,9 @@ from .base_text_to_speech_event import BaseTextToSpeechEvent from .start_text_to_speech_event import StartTextToSpeechEvent from .finish_text_to_speech_event import FinishTextToSpeechEvent +from .base_audio_transcription_event import BaseAudioTranscriptionEvent +from .start_audio_transcription_event import StartAudioTranscriptionEvent +from .finish_audio_transcription_event import FinishAudioTranscriptionEvent __all__ = [ "BaseEvent", @@ -42,4 +45,7 @@ "BaseTextToSpeechEvent", "StartTextToSpeechEvent", "FinishTextToSpeechEvent", + "BaseAudioTranscriptionEvent", + "StartAudioTranscriptionEvent", + "FinishAudioTranscriptionEvent", ] diff --git a/griptape/events/base_audio_transcription_event.py b/griptape/events/base_audio_transcription_event.py new file mode 100644 index 000000000..f634adfce --- /dev/null +++ b/griptape/events/base_audio_transcription_event.py @@ -0,0 +1,4 @@ +from griptape.events import BaseEvent + + +class BaseAudioTranscriptionEvent(BaseEvent): ... diff --git a/griptape/events/finish_audio_transcription_event.py b/griptape/events/finish_audio_transcription_event.py new file mode 100644 index 000000000..321de1577 --- /dev/null +++ b/griptape/events/finish_audio_transcription_event.py @@ -0,0 +1,4 @@ +from griptape.events.base_audio_transcription_event import BaseAudioTranscriptionEvent + + +class FinishAudioTranscriptionEvent(BaseAudioTranscriptionEvent): ... diff --git a/griptape/events/start_audio_transcription_event.py b/griptape/events/start_audio_transcription_event.py new file mode 100644 index 000000000..25316ac8a --- /dev/null +++ b/griptape/events/start_audio_transcription_event.py @@ -0,0 +1,4 @@ +from griptape.events.base_audio_transcription_event import BaseAudioTranscriptionEvent + + +class StartAudioTranscriptionEvent(BaseAudioTranscriptionEvent): ... diff --git a/griptape/loaders/__init__.py b/griptape/loaders/__init__.py index 38beba01a..b79b0ff44 100644 --- a/griptape/loaders/__init__.py +++ b/griptape/loaders/__init__.py @@ -8,6 +8,7 @@ from .dataframe_loader import DataFrameLoader from .email_loader import EmailLoader from .image_loader import ImageLoader +from .audio_loader import AudioLoader from .blob_loader import BlobLoader @@ -22,5 +23,6 @@ "DataFrameLoader", "EmailLoader", "ImageLoader", + "AudioLoader", "BlobLoader", ] diff --git a/griptape/loaders/audio_loader.py b/griptape/loaders/audio_loader.py new file mode 100644 index 000000000..532662e79 --- /dev/null +++ b/griptape/loaders/audio_loader.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from typing import cast + +from attrs import define + +from griptape.artifacts import AudioArtifact +from griptape.loaders import BaseLoader +from griptape.utils import import_optional_dependency + + +@define +class AudioLoader(BaseLoader): + """Loads audio content into audio artifacts.""" + + def load(self, source: bytes, *args, **kwargs) -> AudioArtifact: + audio_artifact = AudioArtifact(source, format=import_optional_dependency("filetype").guess(source).extension) + + return audio_artifact + + def load_collection(self, sources: list[bytes], *args, **kwargs) -> dict[str, AudioArtifact]: + return cast(dict[str, AudioArtifact], super().load_collection(sources, *args, **kwargs)) diff --git a/griptape/tasks/__init__.py b/griptape/tasks/__init__.py index e51335241..2c282adff 100644 --- a/griptape/tasks/__init__.py +++ b/griptape/tasks/__init__.py @@ -20,6 +20,7 @@ from .base_audio_generation_task import BaseAudioGenerationTask from .text_to_speech_task import TextToSpeechTask from .structure_run_task import StructureRunTask +from .audio_transcription_task import AudioTranscriptionTask __all__ = [ "BaseTask", @@ -44,4 +45,5 @@ "BaseAudioGenerationTask", "TextToSpeechTask", "StructureRunTask", + "AudioTranscriptionTask", ] diff --git a/griptape/tasks/audio_transcription_task.py b/griptape/tasks/audio_transcription_task.py new file mode 100644 index 000000000..c75faa0d4 --- /dev/null +++ b/griptape/tasks/audio_transcription_task.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +from abc import ABC +from typing import Callable + +from attrs import define, field + +from griptape.artifacts.audio_artifact import AudioArtifact +from griptape.engines import AudioTranscriptionEngine +from griptape.artifacts import TextArtifact +from griptape.mixins import RuleMixin +from griptape.tasks import BaseTask + + +@define +class AudioTranscriptionTask(RuleMixin, BaseTask, ABC): + _input: AudioArtifact | Callable[[BaseTask], AudioArtifact] = field() + _audio_transcription_engine: AudioTranscriptionEngine = field( + default=None, kw_only=True, alias="audio_transcription_engine" + ) + + @property + def input(self) -> AudioArtifact: + if isinstance(self._input, AudioArtifact): + return self._input + elif isinstance(self._input, Callable): + return self._input(self) + else: + raise ValueError("Input must be an AudioArtifact.") + + @input.setter + def input(self, value: AudioArtifact | Callable[[BaseTask], AudioArtifact]) -> None: + self._input = value + + @property + def audio_transcription_engine(self) -> AudioTranscriptionEngine: + if self._audio_transcription_engine is None: + if self.structure is not None: + self._audio_transcription_engine = AudioTranscriptionEngine( + audio_transcription_driver=self.structure.config.audio_transcription_driver + ) + else: + raise ValueError("Audio Generation Engine is not set.") + return self._audio_transcription_engine + + @audio_transcription_engine.setter + def audio_transcription_engine(self, value: AudioTranscriptionEngine) -> None: + self._audio_transcription_engine = value + + def run(self) -> TextArtifact: + return self.audio_transcription_engine.run(self.input) diff --git a/griptape/tools/audio_transcription_client/__init__.py b/griptape/tools/audio_transcription_client/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/griptape/tools/audio_transcription_client/manifest.yml b/griptape/tools/audio_transcription_client/manifest.yml new file mode 100644 index 000000000..6bbe4a21a --- /dev/null +++ b/griptape/tools/audio_transcription_client/manifest.yml @@ -0,0 +1,5 @@ +version: "v1" +name: Transcription Client +description: A tool for generating transcription of audio. +contact_email: hello@griptape.ai +legal_info_url: https://www.griptape.ai/legal diff --git a/griptape/tools/audio_transcription_client/tool.py b/griptape/tools/audio_transcription_client/tool.py new file mode 100644 index 000000000..ad0f0626e --- /dev/null +++ b/griptape/tools/audio_transcription_client/tool.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from typing import Any, cast + +from attrs import define, field, Factory +from schema import Schema, Literal + +from griptape.artifacts import ErrorArtifact, AudioArtifact, TextArtifact +from griptape.engines import AudioTranscriptionEngine +from griptape.loaders.audio_loader import AudioLoader +from griptape.tools import BaseTool +from griptape.utils import load_artifact_from_memory +from griptape.utils.decorators import activity + + +@define +class AudioTranscriptionClient(BaseTool): + """A tool that can be used to generate transcriptions from input audio.""" + + engine: AudioTranscriptionEngine = field(kw_only=True) + audio_loader: AudioLoader = field(default=Factory(lambda: AudioLoader()), kw_only=True) + + @activity( + config={ + "description": "This tool can be used to generate transcriptions of audio files on disk.", + "schema": Schema({Literal("path", description="The paths to an audio file on disk."): str}), + } + ) + def transcribe_audio_from_disk(self, params: dict) -> TextArtifact | ErrorArtifact: + audio_path = params["values"]["path"] + + with open(audio_path, "rb") as f: + audio_artifact = self.audio_loader.load(f.read()) + + return self.engine.run(audio_artifact) + + @activity( + config={ + "description": "This tool can be used to generate the transcription of an audio artifact in memory.", + "schema": Schema({"schema": Schema({"memory_name": str, "artifact_namespace": str, "artifact_name": str})}), + } + ) + def transcribe_audio_from_memory(self, params: dict[str, Any]) -> TextArtifact | ErrorArtifact: + memory = self.find_input_memory(params["values"]["memory_name"]) + artifact_namespace = params["values"]["artifact_namespace"] + artifact_name = params["values"]["artifact_name"] + + if memory is None: + return ErrorArtifact("memory not found") + + audio_artifact = cast( + AudioArtifact, load_artifact_from_memory(memory, artifact_namespace, artifact_name, AudioArtifact) + ) + + return self.engine.run(audio_artifact) diff --git a/mkdocs.yml b/mkdocs.yml index b63f36fe5..99231cce7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -110,6 +110,7 @@ nav: - Event Listener Drivers: "griptape-framework/drivers/event-listener-drivers.md" - Structure Run Drivers: "griptape-framework/drivers/structure-run-drivers.md" - Text to Speech Drivers: "griptape-framework/drivers/text-to-speech-drivers.md" + - Audio Transcription Drivers: "griptape-framework/drivers/audio-transcription-drivers.md" - Data: - Overview: "griptape-framework/data/index.md" - Artifacts: "griptape-framework/data/artifacts.md" @@ -146,6 +147,7 @@ nav: - OutpaintingImageGenerationClient: "griptape-tools/official-tools/outpainting-image-generation-client.md" - ImageQueryClient: "griptape-tools/official-tools/image-query-client.md" - TextToSpeechClient: "griptape-tools/official-tools/text-to-speech-client.md" + - AudioTranscriptionClient: "griptape-tools/official-tools/audio-transcription-client.md" - Custom Tools: - Building Custom Tools: "griptape-tools/custom-tools/index.md" - Recipes: diff --git a/poetry.lock b/poetry.lock index c78b72391..7e6804fcc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1353,6 +1353,17 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1 testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] +[[package]] +name = "filetype" +version = "1.2.0" +description = "Infer file type and MIME type of any file/buffer. No external dependencies." +optional = true +python-versions = "*" +files = [ + {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, + {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, +] + [[package]] name = "frozenlist" version = "1.4.1" @@ -5984,7 +5995,7 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] -all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] +all = ["anthropic", "beautifulsoup4", "boto3", "cohere", "elevenlabs", "filetype", "google-generativeai", "mail-parser", "markdownify", "marqo", "opensearch-py", "pandas", "pgvector", "pillow", "pinecone-client", "playwright", "psycopg2-binary", "pymongo", "pypdf", "redis", "snowflake-sqlalchemy", "sqlalchemy-redshift", "torch", "trafilatura", "transformers", "voyageai"] drivers-embedding-amazon-bedrock = ["boto3"] drivers-embedding-amazon-sagemaker = ["boto3"] drivers-embedding-google = ["google-generativeai"] @@ -6013,6 +6024,7 @@ drivers-vector-postgresql = ["pgvector", "psycopg2-binary"] drivers-vector-redis = ["redis"] drivers-web-scraper-markdownify = ["beautifulsoup4", "markdownify", "playwright"] drivers-web-scraper-trafilatura = ["trafilatura"] +loaders-audio = ["filetype"] loaders-dataframe = ["pandas"] loaders-email = ["mail-parser"] loaders-image = ["pillow"] @@ -6021,4 +6033,4 @@ loaders-pdf = ["pypdf"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "ce7c88b4d4ea368bd7a6c08c8e0f4310b2c10f1237d77d80f50bda4b35612481" +content-hash = "da89e6bb7aa395fd5badc416ec859e574416ea1fe07ee6f93035fe6a7e314dcd" diff --git a/pyproject.toml b/pyproject.toml index af264a5dd..55ae82ce2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ pandas = {version = "^1.3", optional = true} pypdf = {version = "^3.9", optional = true} pillow = {version = "^10.2.0", optional = true} mail-parser = {version = "^3.15.0", optional = true} +filetype = {version = "^1.2", optional = true} [tool.poetry.extras] drivers-prompt-cohere = ["cohere"] @@ -100,6 +101,7 @@ loaders-dataframe = ["pandas"] loaders-pdf = ["pypdf"] loaders-image = ["pillow"] loaders-email = ["mail-parser"] +loaders-audio = ["filetype"] all = [ # drivers @@ -132,6 +134,7 @@ all = [ "pypdf", "pillow", "mail-parser", + "filetype", ] [tool.poetry.group.test] diff --git a/tests/resources/sentences.wav b/tests/resources/sentences.wav new file mode 100644 index 0000000000000000000000000000000000000000..7962008495f29e15182a6521864b90ecb6d4a265 GIT binary patch literal 538014 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 d-x=#Q zsXdD0%x_^RvgR48zzfj$4XYOq=1SkgGU~z^780@8GEk=d8RNUOc6)GPGWcAKsQ(-m5QnurrTvVI%rAKUCNRU9WJ<06O+gmJ;nDt;QyC+CslO^DTl!>;^@!n zc)A6|qL+z7M0RU3$hg;%!o2ml%p%NS{jK4OAKq%br36^m3&rBJ9H{N39ikne&0(&J zMh=z6X|91l&tc6!$s0{j#*-gvuNLAi#^d43F;+&BfnQ1lvYTjjh?D`A2h-k@$Ru2( zR^kOXx)}_$0l&=b>5z&=j$nMwWK4{r9(4=9X{E&|d=X?ib`qnFrPAgk-s>Wd-|Ap8 zh{rTOWbW1zD{tmI4e;p6jJ;j7?r9>je^l0Vr)vK*^V(`FjBVm{9LXm8o??X=Q>ei(}X5jfcyuTqb?n|<7st7QXo zTE6i4o{G%so14s=%~8zE?O^V~JW)@swgHtsb3oCC^j9PF);ZYeOm!FgWxB8);#u~j zuV!puT*^Gx%BDl6^2{%tsEk)ziWLdSNq3dE%12lQyd%tf6r86T>vF76S94$8%v$ql z(^XTBsRT2tD>CD62$`J|mNA;DAYNy%;3m%qW&oeYzQQ%PEDH4kS;`4!BLAlxVMQW) zqGk==bqmUFCKfq@R(}E_=F|6UxzEqU!hwA2xixYhMyxgyi%d~_fGG~BZzCBmi$ID6 zAl(uy_Xql(r{w``q#2R;M&ht<c)LC*f8LzwJ*Zg~4=@fLB?Ps^R=R*a-sd`lEU)pf ziFnLldSwX6d5=-z3(_59G`AuXxEj?iR(gi-89{7y8PzNif2+0Z;cC;Vw%EuVwY^kZ zyri}`jp#6+M-@DMqUwkLJjj@MgYWxC9cMadcoIe)MV;aTau6F~-WzEXp*DGOJ$~f7 z>R=&unpeaEbBKoT5S2Qpaa3}wQO*&~x>{GldcmCiSwt!yK)a&kcl_c0|2W5Ye63jh z=sCD1GKot$hB!|TTCxHy?1)}k1k9Sq=Q3cFb5R4Y!GpxQ_Ri81n4PWk3vT3%Dshjx zgX!Q@IGj!7H|pW9>s>@tU>Hy#(vnd$6CZkNgEsA;}N%9xtfra^;L~z~MM_tvnQt($p|c1ADpl4Pvjfypalz_px$I;%M|1rKB#uZlqVRG@C z-xy;_WcMx9Xp4&6w&a(O!AS0-uVjLKnOyZ=&ees#mV^CduQjh$6%|Amrv6<<4mK5dW35i8$0Ft^PBn&g34 zNobrucxA8p5qI>Xu5~3xMyS&raApO>MBJJN5R zh*D>PlcEmoJ|o`??Z5}t;363{HsGWYw5$R`jHHG&3JrDw>eeu754TxWt^xd|3tV9> zd7RB)B3Pkx+2Y$wL?KVnZH5tR*95=4L8eq%>KR_)0rsW?uj+Dl zV?gIf@)FCq`-S`_>e~A}94 z$R&QEZ(nhhKNuTvSosam?I0L>0j}Y~SWMy*&w1}Qd4%_%Y#zT|;Cl9gDYH529L~BK zY!tOK0^vRrzurWLUd=Vl;Cl9OR8eoUfZq>sO}qK7m`i$;*Ebo3hdA;*emlkghpZzl zmUnjWX%Pt@rYhtppYKVW+?#t}z&B&KehWOP3I3oq`dk?Kp1C}hU^#nWL>p02#LT$` z=x58w-cF{?r}BCq{!y&dng9-cgafBzrGN0nANc(>74}k z1`K<}dkORs>(h|;5HoWB(x*AhgsoCR%D^ z{tqQu5!KCwsffr2G4jw*et;*r=wfB@i0$#21Bsj#5E~!jd5!+Rfi)ykVc^ZUugKBs z;1?Y53&~jVc0M@-zUoPS@jD*$E$DO|pBRM}wuIXI?QqVKF!-M6VspW(^TZhs_)LOT z#}itf0z+0*Z#=6P{w|1TA?s`<_L=2T33gSD|I2{7VpWXt;8sz5V-?=1jUTLzcPz%0 zw*ki^xn5CI^p5J95{!b<^zIP)XC{3XgFVDz0Z;jPop@x8bq=1GF*$=??@JUQRL~H( zSQvV61N?}X+tUxb2BK?@!x=3ok|drI%#M=`ul z?&%p(lM(Or7P}ML*Bw4H0n4e+(S_#Rlp{xCf%8F#PF9uFkGhd8EZ&zfTm*Y40b+WB z838cZBJ{CXg|(&i3TtupYIx!b^t&qnmCbm4jo)7ng3JXcM$+@s7@2$V|5sr%@2qNp z2K~qd&)JM@M;El6MjX$No)zkUdr<8^>z%cyE$VT{eR)n`WQbWt?YYw?{Pf|fJgBh} zbye~34N+TVgH}+O7T0mro}hdi?qv)kXBnen5?;9@k3Jk>1Y;`_Z#{%7utR%@$G#5Y zb?4xJx)N1{VV|NxY!+y;2~;}=)4s+T@<3QyTEW$d0$tIihA{5;k#*S1ND{STV%|?2 zKd&&ZcA$l9BdXbpDzgA(V-3B3kVs`d524cB1{Z#U0eN6SuErJiQx?U`Ub0ZVSBQL` z$RLW+ugT@XSr=;`!9U)Vww##KCJ4|>Q@7~6knGs96rL``c?81`_hA6pCC+lPJa;pk`aF;_v#FJS6R{GC{} zQ~Y+1Pn_XMVvhMuEO8H5ybxOzxvA-ls}*>v@mT5@kSC0s)ks=#Hh z4D+e!5HoB)5w(2c=#JKEkSg?UE3RoSxR4_U-{@jR(v#g4< zn3-olVfu+z`px)!1D{Cbx1YS9g@#np%I_P1sdYgIXO84e^ySX6boBm5@aPFV;0DUv z5gv!JspT+?(L^`lwB-P5IBFCsbu+T+&S)9pUm+_F z8_6+=Dw`+xf+twRJFZjYz!Smx&pZ;X8L$HMhg2#xQm~NcM7mq7nam~N$UdIS@pV1% zUKMC^-W(gkaK8mH7=OPi8!d`f_jhk2@^L+sbiz!N$gO z1@q{`<&2U=97QnY-HeM3{C}J{VLN>*<|^*wFH5*eu@;$7EA*&!aUjK2>U5&fImV-$ z_a?4vOT5~G`ih>!mwkEk=l$7mwHRvpKcKF;gG7};;4WChJns2_D?;3+J>rS~^Qf0i z;i<W`*c{l#vs{V4bUiSNqHAHp zw+9)5XiK5vi5jur*nd3y!a&Q3Rm>9LFHi6nVpg``oCkPr#AZiug}t%<37lsNb{v6K zj{)s_!wiKo*N-b$%BOem`KMs;MUD~6^}XWyCGbe#KskCTfQQI+i)zol;KVqX${76B zIP9Sxo^&MKF9Iewlzwez?b*8YxQK*B{|9g<_WV|dzxLvjqxt+4a;st=XHm1j$C>QHcE_T59W2uPv1`7Iui|wr0@PmwrU&Ntq@Rwlv z-xXdNhzAda)70jEEAdWg#-WKG6C6eCh%gktDHNGTcuY~RSe@)|Ft%C+p3;fCX-~h8 z!*3j9R9xlw7AhQSaGVgVt0(-RHIIQDbu@8OCwNjA?+4Sa!L*Gh=d429tkJ}CRnNfx zd$jghu=p+9^EawtI@KQnufqfv!AfUx<(sg)aJ=*m?D{0u%(~WC zpx}suu#!dCPdInk1@9ZiCn|6^xv(6WSTfJ*iw`og#A^4AXlWN-CoymFx}^&Fpa?j| zA96%riRijn_Jb(Zh$2(fowWHheAj)((n?sG2~KyPQT~DBwWIB?U}ZuBZ3nm61|Mk& zss&qKsG;CeCRH+3EV<+o07;CZl4YYo5bu?pU0(^J}y^x~mZ*h>qG`lRV*bn#;_v4MvJp_mPi2Zj2i(g}n zmrz8CvI_itTG5fK>c+@lPi(Op-{^$)25#pBH zF#09*<8bb9fi*6g1{y4Z`|qX~&*Eugi9sG>L66a;l8G`N5QD_RY;4e@N>hnem;as6 ztMsVo7W|r+_3grIFTAVBX1hu^QR_YUw5U$>K=aj*ck;q>mPex#+HWyDcnRiQ)j+3r zArA2(4`V}4(SSz$lc?q$G1e(i>pD@#L3sXL_`FzaXA1Ya6RbIm-QDG$9%FOo;Nwq- zgEn)eSFNvp@@^c_)_&sQCsYjF;{VOqb+PAe_>FefI{poCvOA!_Cp^+8EK*by ze!>@JU_OAN_h4Y#hz!nSM_chR|KpNpV3gP3wioa`XBh=ou~xAP(-l0>KB5aF z%&rC_F%my9o3;=YtYSsKgD?^?3%7uts*J596A-?qWk2B`BJmByQ1r6+{&l>dm`^ne zOb!MQE0Udaw3t*^@LJS!ccsBUB<4ud&g7kJMe z`eY$}H=Y=CDeSfyJ}wBHNal*gT)B0${1K}^KMH$U#u3ALtOSoo@j8;bUqy>v0;ff_ z_7ldHnCZQq-^HBmpJ*8$xb7glmj+)cvN=AWdo4yy4W140xt+P5df-rQ9l2qN8}Wb>@THxw$7?XTr&#Vb?r=XC zy@h8u_Bx1)jd|E!D{Qa>e!mg^My#C|0@73fCB^!t&fK{NYZ6G@zt{=nI_Euv-K?ee z-f`ydSe_^M(T8vKqR*z$hA})QVf6>WsT-&cy||9GBhy7 zy7;`s^w0s0`HRuv!aWsGUondF59Ds^FhV~whVK&zO~>=C=6>riK5V$pTGV0P&}ojh9S zB<=Q!zy9G$4iK-L0&OQS&V+_1)>CN8I4i?_wZK*f;Tu+S|7T#Xr|IpR*v&8ett|*I z_SmR_WwgN0&O||oq-_twnYQ8W4#C@RfrI4j(+YeMb2KW`qE%?qW_+_Lk5G2^A!(Pmnnx2&9vO5;yj5OiVvy>cT^9~`p(jp-W!E|q+*W? zVI$kk<=B1C$(*lj#sV*M^*L%ajhlQy+f~ZfHR@*Nvmtkg6FV;UuAwF$t zo#DQOoK+?>-dp24Kaw37$8lD|-xm`*dq|WHs0_GnTTnq66J&!WIn-2 zGNc`dkDHRQYQS8idgPhReBN0S3gvOor8}NMp(1H1qu>I4&AQ0c*CoM{ebAMAzz7>l z@qEXIs`4VN(Q$=i)@E)?2CF$Z!3RXu1{>>x-8TR;zG$?PSoyIs*!Tv2Fb8yc2-B}ZwL}fL)*IH&7^(D9T&T>+ zFV6?f*g_f{lXu+-4ZfTt?3nj_;&df#nq-oUN#)Rxmt(aq8Y z>H28T%64)B6-ry!k#ULnKhrLwyD`pi-f-6N$`EASNG(s4skAwmmEDK2p2vDt^<+(2 z>55!N*Fhg=v)`_`LxzLav4=y5z1D83%|6{`S=Q82P8*LFjLWypzn*8G|2_YCK^fx! zQ*X09tE$H+UzO3!f{DP}O~Pt?v}N_XY*qUSPO9@-mys^7oD-b3I&QSDVG}M-P+d)r z3dZD5&(q~)=AO*!T_76=o1)Ar6=)?Cy%J;gHlH=EGwm@oG~ZH|S|&Cl^G+hVV4fcbbnz(ql zUU2E?eA{t=Lo>Su`leD5CDt%3zgXV5+`ODGIj?hDJd6R2x@W==D? zn!Xw@8Gjl(n|_%~StRx`andicE$$HRWOUl&)W)%i!&SS_HaXg0%}8@igIE5}+*vta zveoRax!&xbe%k2H&IYX7k7`n1ov$1^l&nEKqBKF_+a5im$o8 zX`HdF@mYbdVWq)nysfxuE=Z+xsW!juH#p66Zs+{jajL_6yMH!mTC{1io8dUSxVOn! zoNZwz^VIyg#zE#^N_9&(NT!!IS$tI=_D~pQnq;&XMi}3kW+@XiFJv!Wux)*ZVCOlm z$*xab_Bgk5+V9ZIZk=w7=9byPcrCwuUSMv8Ttn`df>FjI${)2kUhOa3exqiC%4**1 zpD?%Je(u`5EBPf%`6k&CCD*iRYQNX%g-a#(4Ica5PPueTdI$TiBJ;D(10yQ?qww#-w-8_?`JD_p))ZrJMG*%~890_8V=x=;ACZ zOwI+}a}qK=GV?PkXV1y4QBXv2(^j`XJ`vtW8VL9GW-O{7F+uSH#xF?xRgn-B5N#{+U}b(=+W#%D9vjX-6^-=Z-Q3$oK8O zyDljl?B6}mE8xBN9=A76Lu?!^^YV*iPENH?sh89?`B>VDoJvO464Oq%-D=;^K1SbK znxe=Bq1heNQ&S$LmP`MYaUti2p|EDO?IY($9!H9V7p+&UVL)!-Pi{F*4mKy0nR)RU zFH)nDuP1g)KAXNE_k!WQdPm#ecAZ^$+sVZ1W}|0rTt?H>k|`dkebPKL=jVl(Z^`}+ ztqYy=SzdHjv7Ld7eSdp2axJiJY?)iIJ?nT{%aqnhdy;)KhUGdKD_HL8{@QJFxM>8(^S#O1!vKAgEJD1ElsYFR*?BH-`PywS3011t`0RXay3{9V9FpK)%(>~CtK3(jTgQ{N{(OGr(uojNYF zT7FA2(Ka=1bu?OKT7i@koe`GSC-qzEi}d%|Sq3*L#lDG08^1w8A4)VVF}~=MB5CfU z9aPQbg2+s-l;sIy|79c;B>QHL&o3}flSXS-YQ5y{Y7awP&e4ocX`NG>rd~_$lk>yq zr~Tmc*UQ(xTTtZ^&4Q`~IC_6`*>6)$shV>*b$#N^zkUC8NUV|eIOmBG?ooma3$^WCAB$7kOWMaKu#EA};@z`IwWk9IdLb@P8`$SK_u z?UR-#ze``1mv0Ku)MRI+r!p(knI7a-$^Mi+JndXszYP1FaASE{a;oMr%)6Rjk$|m! zQ+;gQ^$w%7TTLn1_tF+5dnfNsX_($Mr-yNqrKC1i=dM4mZKfG(K2=a6H!OQzmNutN zejT%q_JC7{M_Hdwep&ub{&#&9k2y}a^kHgJ-mc7dsqU%CX+JaX=8ZR3koM?C+my5E zscR^WQv!|E@;ORQjlAIos;6xBy99U*@EKd=Xpv_=RlSTZlI81f#kOT%KhDz@G<33mZ{)_Wv~9J-6Z=o+kU#cn#X46f-1Qaa#C~i4P`aW zY+Jjn@%~z*ML^xaP5wW8_7?hXQ&(-3yEkRh-;%#p{qp@cCFOP2Qv>^->F(RCvuUV% zr}?3n3>WhZIZN1+{Dsm__sO}5*E^r_eqa4-`uqE?aX)6iRcdEQ%DA35?9Za#QGYKc zmB{Fqmt;Y_*Y^Y^9O0ZvN=pW_jHU`Y7+TL!5&Pk1TT4e|q5Lz=eKSJhL4l z9$-LE?>)E7}M=A2G_nRqj?TGEKLwb@Gze=W}X0XC&vKLRCnL(RmrD}Pa6++=Lt4>YLWb#>E21+iQN+GrKDzr zbHqkaG^_#Wnnt$f&Mw4NYajnu!muxr6@vw`H`ybDAufpy&PTOs&YTg!X z$Sju}pKu_dOj4&*pRDA(J!WTVo;FoGQP*0xN;_IQ%pThQmQ9kkZH{9<=NGP1+!uPb z_1eSrFSm`6<{8&zPfV?v6r6N7**@)Z=C|DH#;IyBwcP#CFj{DAEoaTA*j0|%2{t2~ zo;a5))WV~f*ITdo9=n~#+l`fTj4!gMrT$3lpV%$wU&`GKOCPl1B`rfiav)0l? zO)^h}8Gg46*Nt)rbS~t2)orrpDX#^dCtTY)oYMuX{qtXDTubpw?w`CnwQI(JoJ$3r zOe>U2%-KB)zr4x}ii%Y5kFy-n)^s@FT-D{GYmoai4=0bSE;jZfbhAQI%>N_l8sO{LzV7InaZ=m1^{<=SZd04DwvAWYwrxALjihld#^=np^1hc}^4cbu zd*{r--fOS5c0wSBvPs)a%Fs7@C^Q2uQduvd@%kGhPWaazbWL@y_Pz*x8CD|fqkDrb zkLj2(LrL@xN$1l~r)8uM@Er<9tCh$<!80D00~`tYWO8%}78E zm8*&$#Z~HMW1czHE;(knvxhVZoe)yZ)z8wOyQX~(9824fbT26_MN8}DyD8?>Ic5~P z=WPSiL^c+ZNvcU{r;OI;GO}5-pK^S2X`V45pS-P{-^?Ak4DC_yS$axx-IQCYZPP3J zoZ=<5EZu-C)eTP?^sCYfsFM_zhF+k;S6fF%erG{9}-C>6-91W6un-yY#(E%TQ4*OSytHIew)9@a4DH0K)k3-9*OUZEXaMXdAq=lUbj zl`$q+PcD`EDs6n`$G~c}D@7+ER5)(|Q_Uc(ep@Z7KSOaP+Me#{>y+FRyqiOMdo%2> z&1SBnmQ5_3(IhpH`XTLV#!UZa(WCVsE})1NfVwWD&!NNUqZcw_gc0^)F4lF?{nmRo zG$SOBYmc>{kU&ClBAiXjOq-nEHM3q|gOs3cqrZ)k$apuRXJ$NU02K#E7qd^z1)Leq zuI}^RlcC?k9(iv%5-k=(gmFX3$CT;+b`jSuY{PLguTg5sAmm42E>zpszc z&H7h;78LUo-6^(GH?xg>#P2s9Hao3})?c3Z#O=J@*g={i>n#Y)%zMqE zpVJ>B!zsngV!v|@gx;o_=6LiATy3dj>1JMTdM9M^CcZiM7A#5`_?d;74Rwh@vXiFz z0*%+w)ml*9BN^pTIBTe?tkm9$8d3 zBMF&zAFZ9bO3AO(QEn)c)q&a!eJ&YEhok4P!L-EdbwKs*C|oW>xt`n;t~NiG-^lMq z=S~AXW~Z~mnG(hylB^fgH)++iVp?5oz19@UvP~ooyv9+$D@;HN*P#y62zXBn5Txr| z0lq0ekZ-^j<1a&T(U6@EWGcewLXVP2$=_%ILcVWZW|ZH-G=u;H{ecH*tNi~rhq}vLv;{| zsf_yNI^a;0i3PIufj=(17Dn-9(Tz8P|A^na#(jXJXe^YM@42JUk(6P(;ciQ?g@9H) zfdBng@OE25byxv?KTn~j;&kDK5HF+)4}^xoXnqf0p8t$KPgkLLk+4sNLU-5SkWqu~ z1AmGvKZ(y+du^fBcm_6=85qy2?ZfNH=7pr)JY z3UteQs&~;hYsIzQ|MieAt}j8~!*sHb&IZr)HD;`ee#jR7G#B7T@f$Ett8u&VOqQS< z;0b-6)>-`_XOk~Vr=(TVMad^cDJ|8a+FAV#`ksDf`|=M=;nqbqr){>inl;5T+TY2GCznL6^GWDwnC-03<=e95>AgL z=%j6ma%~R@ct?jfjWk6K59{p;+TsLBYaeKyUOjDUia$k99~-DE7gG=Dd5v*&1lfvL z&QxcrYxI2VJ+s#n9kMiZcjVTnE>ZJB`@5|65nO-uh5vQNr}PtPvodA|I?5ry5ziU# znIPRozH60$5*NXVnaMwJEDhztdPm)kIhd_Mbdk_^?)O$Rvq662YnSOyE17=O*Gw#f z^Q|0N#?+^6^nFUETw8u1-j*}S6W;4;@6|#dMHPq{6{Cf>@@{eN61ri$v-^5y98UX@ zaV=0pexr53v+2(y>2K6Za(QVjFq}Jb8i_WIa#`KKLx)6mjrw0?Gw*9>5z8HNNSvIJ zGkt%`uav@>+X6M@LRyBth^asa=%4NnK3F(Iz@kXUXfOuE8F`BeIoL<6k-y*O<^T5$32y zkzc$)X93GPIzt?oaU^we@}s2Kv{jjtgInY^+IL`SRrQm~Z27R5BY0k%4UD3&rHUiQ zJwL2vI2SoRw5_|G{VVHKU-_JA_mkKBWl|#2IsbO?ol*ykkb?AtuBs`@J26T+sJtbV zUvFRRnix7K@_khQsN-Rqynk(r*<(ss|J$^)$>GVTQ}bs0^xqSEXmR8#)TAr4ooWxc znY2b;td=pVn?^cHyC;SXio6inBK)a$lDD4q2D47-6TF@|F7 zk>)5>QI9wU96JSP(@8~AQq?qVHO(a`);z8!o?78y5%(enhMf!f;wo*q%s$ii$cF=> zFWx^ousm2q(fM}kbGe~JkhTG z*51Mgrk9o=zYv>=eZ_9lEOZEcjZV6spgB#DP09p$fvm_CRI82^!#5K;*+7hUm3F^( zS=>FGZ*7u!h^Y!2YJAbItFIAZ3{(0l2b7xlz3d7n@0Ua5YD${&Rh@utqi~X9?sI)i zf@P9*oOOeBtF?|b-Q3aq+Y~8W<%%##=;W24Rn<4BFV#6pU8RVUEVBxbLA;|RZ6uI) zmYQjZF_%_^nr}V#jh)07Gc^((2?vA-p%lNHd&AX4t++5WPnCeT*TV^XPwTC#T4|CD z)ofWkH+r+SMSt!q^oZVyS%#=>FMFD=!XGr15%!tt@U?`CoWf~LZ?>&*oGD1*z(c2i z0n!Z>sJC<#RK?4I8XwZW5K%i1ebp1xe!GDY^OkGDKjjm7lQ4mo`OB=xx!GS_R%iOo z+;gTI*PZzUUc(t<4ZGBM%Iu&;(G%-7szc9FNz2Z)WKZ(9xpDk;PT@Oq=lDikJzi(m zaz)rl+#Wb49AfX_RKCDHLgu^-4%b$k54lk3`pB|;4R!|KhTAPz`4YkiLF9`fo*0C) zr#9CH(fw1z6d_zZ^MXxd#&aSwoEr+C?9*T`{sYZXG*tMV*aU7o8^H^FJok*x>R|i| zeF;Co;V0E7%+;lvxqfsNTh!>u#zLbPz}eCkY>gdkTc$O;i+Kor(|&df_Y3{%@4?gI zHas1Qv2FODbUNpt-MMpmUA6;>EIS0q-Tr(J@Oy3 zryiWjsL>N$*tXD0ObR(^lqd1V0g?(;ZE3h`O<<`Fg?e-qu?;m*UTV# zlj&phVpFJ@droh1gMr1gGsd!ajoo08Z3RPMD0|a@YS^gEy}%q9jaAst$Y9Xhnq6)@ zVn-NzIIvbZ7qfv|%Dl!nK=;N%3Ch-B*03o?CH6idptVdk#An^W;NMRR7!RolS{)1X zl^$i*(O9-7PQtHy5JPJjyX;XgU1uQDcT4#s<}UMuzs5_Ry}-ky-&d zOglnj_1es3J(3+jKce1QjjhG(X6G~4*}O~%E}k~#ACsS4klg0Wl4_hxzB8psVWt&% zhu+Jzjb|j1;prP@Bxd(YHaio_b!HZDN12oG#Av|9G54^x$3ofMhMmfkV-?z$El=+; zXGtYCQESg_(I2rth?Sd1+j4NI;U)u_ZNUh91@=4~DGwt0?#4dG+?mJsF=q0|Xj$$d z{m!(a!xxX@2DecEN=~Lz$aj^Z!4dXAF z&decR_717ayrM3q5u)!FbP;$C9cco?;a>)0E{-t#OdF#z3zjt45fR8Z>M&i5!^qJ} zvIl8^NhFuqCVCTY0hz=6p*M{Mv=EbzRyC%R+~6bBGX`?^jE$J(MQ|oD$Tn7RwV37H zM7o+gOm=gzbT7LEJg{QmIV2mynE_-AcS={-M4Dzy!Wi~r`(VUw7)7|-#&os;xGDdF z`8F6e|Dnuewz{!_{YcAj8ePC1VqVi|E)QWimG(03vb~HuV6Ch-UW0j347<~J@H@VP zM^ql%f^pbsy)0|gW}6rTnHS(?em91Z{YDfxlq-Sj{$UEhy_ms0?`6ZWmy|RnagVUl zN8x#1HIA`8jqTX|KQZg@ywNF|8BT^WPjo9rHpwWDO6gkcScAZ?!ZTpzP@c_A6(A60 zz!o@--`ZvT2IrFCeph1E?Ish92J{xz%2+se)TevNYNJ0+i{>~1n!tmNXW|hzx1*C# zIc{RCXX+cV>>$jqZ{QKtVtRv5)*U)Y(p#&=1y!mqq4d~8XH`hc^3K7 z#*D4Lf&Ll62GScD7$55C6`2b+h>_xRl~GfS{|VQvQ{AsZzlP_E zSrs)p>St!u_e6Uee1r_*Ua}{xLTZBVpWs^Q7^zD~GjG_B%u>>fxu!%aYm|FI ztE{PcNl&i7rMSD8cWuP9m=%##qS=W1t^u|y>&%`C4-R^mD%Mh$nvm zaSCI$u#1>?YOGOPIwU2_gT&p+B%>kI%j$4{4M~c4knKav+?b50o}u#{+00Rd6HjK8 zPDxH&^LKgDxYRirD}&XQfm(lXR^i9at)O+aGK2)<#7%P3;3};<>{z25oxGPr6QizW zUmHCwrb}cmk73=)f0P#lKBbwG%lw_6ydgP%Muu;*d{On&s_=K7fyl7m&4g$84B}ic=nGQLu)1T$M-(VVS*{cXY)2m=ZY$=Sa%lFuHNbA^UDFREhBS zNm-P*J)vI0$fO6TGTag8s9(T1T*K?!CR92u>$>zQU>5Cux9HLmNusdCSudn?OGcfOdo(5udZ+zVw+phW7izqkHA{d+cfKxU3$ zGntZG(8ts_?G_F)m)OzdU%9z5U7R7d(#p{O!UvlavN=4E?cdxnIY;HrpQBG$hNqS} zPR}FtP5+g&_wPT6uTX+=`j&}@)F#Gm_CEhuD8>hAPWGhquk=K!i)!d&WtY;x+}U!+ zvoZ2x^w8Wla;4?GpJPMVU=MFL=?A37Y2}j7|9zOyG$lTDy#I-`TYJT1a!Z6q=3(4G z_8>D_I-@)kd4DyfvigL6Fb#L=A$=mB%euWD7RMV1;$c+lA@Z$YktK)FvBITQ!Hersk5`cXGgRz`@kH3a*fQf zFd`;Iv-YREQhf39Zry4$Vtw3AaKomMywYpwfS>bC2_^(b zXmm3e8zC*QadT!#=xu z%PnL!>qoT$(q#WdzmUoL-$*;P&fF@?a`%SNe9^13xw3c8wms79EoXnuR#CeKw6wX& zFOrm`3aJm$FZ;(ysmd5)2RAdpxI-3dA_RPkf)j$_;wq)Nv6XLS&JC>oTm+MSYxM2t z=~18DckLHZJO3y)@TaCfOIw&>_pSCnkf*65^~X4M4>Rl8jdVD9qkUEFdCNR-eJkZ57p~PmHpQ5=sg3JouGDFD~te~`)hv_ZpX3G@* zAN#&wIE%nkAs%rH?0Ggtncbe zd4-%ICIlzT15w)zhGYRU2tCTylhqM z>Jh!2z5q@`zsWzksI}F4DBI-&N}?nnw_m20G-S2_ztc3za@n%VI^SxwB$yiT=b70w zyS`gpp%hhmDXWzW7@yU^jvMKx^!8*m+{LEq4fQx+$?J(hzc4$w#ljDBq9xMS)Am2> z1Ir4NNhr(>WI7rPp_adeeD?=*b{oKGT>_S<1ieHMD4IAz%P}fwSNLxQW0t>vMzPL01><`Bk`yI6a@Dc2piL z@zQYC-Gr063DhiqkiQ(`1_O)kE_4(eLKD=Q(~#TbK1LUex3|R zOqmV%`#HS3TVQ2w1n;mba~3(vdnh$NfkC_)8iaku7q~_K!aGsbA4)gnirfoxXqOzO zJW&>^6@hCk(s?-8y@pFv2ROM*fjgxY?B#$l9uahVcrv|#+fo9MV;Kz6;YNL67Z>!8 z+8nKnmRp;v-PG!WH#d`%hgNq2_|ko#tM~=~x9+G2++ow%F5G<1$+zSu^MCmhsOJ>n zk8-KV`{9&g%%&VILvoQzdZOM1PGPN~6dZ}s?ucx*AQ+=3;DB-yu6~Jd3~a-F=EC_q zyv7$1S_nCWH~es*9AR7uwjqg3fqhOmm9{#bFVpx zD~xKu0zQQ=C@d4c2~-FQny_A|jM*h|3DA<1W9AqiFn{6@u^*?o!4x-vA+4bH^NS6~ zyj#iL$91Ck%3#Ml;47oPa6|Yj6fn6>eqn;Z;|!Vx1mrlg2H9~dFh~!ADSDeUhlZyL z>Vvw`6fD_z@N;!=Gs^;_Zvt%ODq9b=mxEj}t`A8PI`Cb25xiUUF-OPo<8YN&4Yki< z-J}oD`jKR{6WOSrAUE}av?TP5CrL$P7L?L?!I~cc^x+k9(T>owBtTKK0X5AUj2RgR z2fv+qSp9ZjRz=l)@*Op={z5NJPV2J1OrMFYbTgEb5+dG?80I%ob1u523}4 zf$*g52v+1eXxmmpL6OyqdoZ;C&y3fjNk4s-9;&ZE?Qj+{|6aj{q{ z-8uB0K>Qg8y}(sef^Hf^fs_0Xu24J3Ta54%=oViix7rB?dUfo@f1u@^g}nEaF%pdS zkH|#c0G+E2KcTO&m)?_iv<6X)9!Sv6ZzF7u-7A)1;DYYp_{x7BT*L5@*wmYTk%urK%si$y;Q{K8SM7WjIPl4 z=!gY=K&vtmGbRGhHY$s`j=jDO(8=-KA@s>8%l!o6xdA)cbnXIXMV2d4AME)HQOmq* zw1?(06iOQz%FS6|ystv-GK$~o3607lu-KnN&2bF5@?y;145-G`U$Wo?INR`~)Y+BkTgj;KcY6mCAUiDEfh8KM#tUH|P|d<+tAnRnO13D+POH zmaA$t_^4LqT63B3#v6%uaTB{A&TV)s4x)beIL46*Bn)-we5456KKl|D4*BcRMWs13 zE+e4`O=ahEjd^fLQ9Z3~s%(ld4Hy0a{=A22Yn&k;w4Q1aB~9urT@nLgYw4bJM0P9d zl;&!Rx3`&oV3-dN77(vU<&-&^h3q4vf$-kPX;c=G?F#vtv{Xuwy2^!>nrcJf{MlKF zcUz)ttsGA0JI6amaYsFSgzbxI0so6RLmsGKq|)No3M=)#tzy;QrjCNR_= z;cw}G6nHA;QHp4Xzzul|r^;S%46RAFfdT(py`g^A61AYdpGLF&g@AdXt&g*etAH!n z+1feG@x?mUvjD!46}BHoinYAZ-f?D(Idd00)uNQ54#A8O$+Dg#DbOzH_Z3+_BOA*gC?zi)Yv-biP_iDjQ7oZ}#U3^b30AtLhh2 ze2YPc`GJ{XTjEj4|q<65vO~28{>shHYvXc>KquqjEpxCm86DXkqpu zubNBS+c*!pdCxCb3+HHiUE4)-d;T!vrq9)MX<#rhP$yVVjFr>WI69D3xF*6J;UJ&P zjsh-UMLj3o7YB)Z#A8xnh0%_XWMdHj$lTdp)iufU#Z%AI#dX2{(t6X>ojYNS(iNqp z^ei9+<^@^lx)P@sVnV@s+iHq3J>WaAR$4}zC@%?a4h#=83*HtR$pu)Z@n!K^PumaBd#M7$K7B@U3wX~U?GeJ4yZGnN|W>q0qBrcbmb za=5r6&^yp8ctQ-yHMCT6kEzJNG-bEFb*y$>@Z|N}b}e=+uzk0fOd;HTqbOOR-jJfj z@nVcrO=0xzhLz7}@|!A{4+;H&oK@94vMKo2SJt=87Xtl4O}V0WkhW%<3S})v?GBgb ze(1U9KIJTFkF&;^$M7arq&9tsqKp3%6U6sYIkhKQ#Ps5OfgLeMsL35QO6hr&Sh22u zq_2;!q2C=`EUrhO(c2M84{`R$DyA*iI=-N&8B?Bi@DtQo=(4k$k4-M7w{&3`xWO_Y?pL|_uR&SutD+&RIu-*d^^ z-P7GA+pF8&n&>nEl2B*l6w4FdJ-9kOfaa)A5ri=4@_1^ciayN9IvgfhIn@aM9SafyKzDh&HKH_Y# zE5?5wy~sxLn}qBpyD*45Yl!+%wS`nm+!*{9&%C)@RC_~aGJE*3=E}CS;4RE?@ANkI z{&BB$4s=A@LoCCE0o)&BoGvI8rHx{DahY^LNz*5ze$|B^FEkU9Im#$>n7&>)E&U_X zATRzE3oBl&9VrE*{f_CErJ8-Uqp0h#d$v2?HQ(9R@yXuBTGafC|G^}Yj+jqfrHkST zsg|-!n@XEAZruM)z61XRh`2~85y5Y!0>08?`9;*OSQwN?uvd%Kd(PW?m9@Xt-sb5X{EGJ z>RJ_iD7Ck`Nj21ET6R56-%a`;icK{}LcMv_bG#1gXqz2il*Mdf= zm_9;3s8=K#;KA7!BUJ%f?=x^ZD2fQJ2_pV1@16qCc#Z)hFgyDC)PYNTZ64SkpBWJAi#L(B^vr`h4#NWW? zTOfWnFg~A{Zt#4L<#uz=xg_w$4sxRrTV+C7*q;3brFG_it`?KQugY>snSnatXz;9} zjMwmD$s`Nms_iAO^anaenju5V1($;YsEq4S_O1h_eH3cYhKTypP;p!bMf>vqe1{rB z7hWHEL}xIUvYdZb;LfX~?skPXrx|1=DNVwO8P~0cKMTlb-qWJ^xjRN>=!8!q?pg=E zVF|c|Jc5$_7`$Bez`5!fd>y>F*Sb(5PGz#xr{i(oW_U2nK_qw^j9BL^R@XGeHB3l^GrY=y9oaig?16fCJ{HB4LWFf?t z&yXF=!;EoZ#*E`0xBk&Ivp}ORR4_6Fk$bRH2tAJ+=!cXT!U2rp)bBm$F zD#ZOk6x$cvITbPb5BSMBfqZnwyW5KT^JX}l4hE8Q2^_u6Q0k7O5|o#^9*^0+8|$bV z*#^yJUpR#Q0c)cevY|4l#HwJtZA0EFLWR2&s>P|~I?+feL~&;j-PDHWd<8VXM-k=J z0XlRDN?sFvMh>I<`C_O$oybhT(`KmPsi@!d$E>>yXSY+x1V`bi6hhYV9SZ$p#$w#l zajb+8crT1aM4i>uc^KRma$<&_fTFxD^2IP~|u^U5r_f6u1Mh!?v5n~p&ozRITXXn-%r?G|42{vNDn+@8V0YDL&gU%Ig5b-u!m^`uNj#- z$#psps8j{a+I*;#zkmF?*m6zLdO6L zoN62+i>RHMkC`$ZI6(_KOYcV}!6RxW%|_~@_ZQJ0q95EtRCJfp$?*K#1osCoc%}d1 z-7Et$UBZ4e5ML{@Ss7_Ius>=Ns;`G%`#KUQ|D&u1e)UzotQ?WAA@Y5!#;Kpx_E7jv z)w+-pG|O>zE<1|9Z|Y|Wvz2rdbdGo4bY8bDv@pU_<^YY;KFg)#TVe-kv{*tqE#FhV zsYJc1=Fwg$|5F;uAEnQ-s`#}iW(|<~{WhtgzcpK><0Tw`C7^70c|7q3bk zfD&ItCF$ZE zshc9HGxb8`0&QyiWWKV~OfM{z-50!Z5wD}aMJ#j=Gr7Tpd94jli{m8z110odt)QMl z#xg&F=4?a$yO=#n9r`BatULMLy(bcGXWu3Qnn-eTB-HWwy2BL>`GastNN2@Og5o}`GRe_^RoAT=oIHw z#*p3ztI9fgj(s#1{KXwICp{Hgs-ws~wm4YQKWSUN1)hH?#Ap%d*}v+&v)tZfF79c6GV`c;Fm8X|8K)!Z)D%mEH0yIjB~rceuso z=jIS@s@_)VEG0+8;^fr#p%#jh<+)`405x9cJt6pyzR~=}Ltv7)R*5Fdz~WEVhA4K7`(LS) z8c9aNx5|&bwKF%t%0r2hORIxP7*LbkOj8QaR^hs{Ls-jf8PT0xKhz@W zc`}O`i7tD{X-jT(LS{zBmLSDGs&PJ3Thln^s&X|rLA<4W1uN~i;RnC)xBN`3fVq%M zgWo0Fl)0xjBeU6&wv!>Im=ZBLoVnDOsa?|zZJ^_wXNG078slq`vC)4>?m+YM?JV2P zNyc3%)xRbok znjjq$KT6y63^tv+!o1TD$_?Z%S{-_d7GzCkv$c(FhW&v1W7zA++m1-%iIk~tVf&aZ zLIbvoUR`s@wZ#HZO-|>U^99%vP^8b1ZNX#y;=$>vml??*5$&gWX&&;(jV$RX_AyC zD_RxfJ$Aa>EJNJNqu}j8>)SLQbLt~)x2~+lY)qJD)R%?;(z2QiIe`wgOz|>T>Y+3gC>Nf z4~$!Uin)|yjXOPLOxXU=>&^%>*jTLFu#w4ne|-b$7PnMhxuXikc5W{RJ|UcGzS1#z zX;qioD*M$T>QSYK5{)y>VI(r$ghrPBj`q%;?#`a6q4PcC?emfOwC3JZR_!ad3_cM{ z$aQd9_STRgF#m(w)<+=A|D!=|sj^6|re&x$)rsmx3^JnA#sl`8xrak=-gbn#=DY7W zP4-rn4ATr#O};v{K&h6YB*+^iUjD2)5IuB*-%3k1H`fnrCIeB+93uffA-kvpthAi$ zWhf%L39Zea%yTRSY!3S$YrMI*X@}53_{dk{)-%Nrw+z;&X_d8e+5)`>$wPY^8<;wX z^0q=>Q;?OwwmJeos@ACXbV6ox5}8^Z#Dja0iB;z%s8-VWe0+Xx5L*$*cMM$5;=oMI zZS+CRdyPcF$FLwau27Z#M2``-O9Lq=Y z_n=%U#b))W*o(^EOXRR;aE+|4qi2}r=%bWXu`CA+d^#AEJo^~+_5U@K`Ag?{q?k!C@pEk?%}g&w}m-Iy({-!!q18R8&7B ze>#iE9DF_GYe8cKGK(q5Z+F58_&r?jh5(no1^2~I= zLv}X}9!Xi9ta~9^9}X3f1^$n#QQb^I_7}u^?2Mo2%6!3DRuJRx6Rz!Lk#(x5r42(K z5yjAl1P0dWtR=#gKirMZUNg zYNes{fB5_XmB^m|+|_>KeN9BJ>qQ-~Bz$c8GV!Q}6a!Px3P0V)7?DM|;#1uOOraiJ zVb(+8^BVC@JZX%2UwLGo3y@`wLx!Ot%Kpg=XBS~^oqc$ zaqu5pOs^9QS*%aeGxU|{Lz|53N7NVTi}k00*zc9q>*G zGyLd7GZ*#1Z*&6Y^(?%y8yUrF%%Lpbu&jP`wJ=^jcoL3=2h|eXb5=K_0BSagP-I=j zbwinDs8u~hKQtM*(|c$Nd!RCT6xA~U{6`x`USn3^r{)18DS~m?33OpGP>&v{a(VGg z!{Jm_5uSTl4#X#*NxX)9@&8@1Jzzl$#h7OGM-rIFIQhY1$LzR`>dZr|kYey6T8n%) zllDax`X28;6~1F1@ck#iV7yp?Q!pc+!F6dd_QUUBAKt}>XcWe5UV@R?jQq1WYKYlz z{R((O4X_rA;kTM&ye=~)>=Erye=dY)`wms6gK@ znF>c9g}fj)&{gXa*b-)Hh4#*aPH`v564ZAFgOz`goF}))1$zA3F7?xjh!bzVo(L|iOTLfS_6pLcI*#laMvF&bIxIZ&GJ>8 zh%v7Pf4%xZ;;LhInXrZlI1WYeZ#AHUtctvMCUCFu7>RyBbnaj-nefzBg0&+tp}=NJ z0q;q~zV!?%Bdbs40$@J{z%a@3jO&N>vkY@?8IZ@0*v%{BJB5KT_P{e5fv@B7?>n%v zqOsy;0ZqCFeXq*?0Iwtw=f@{_UfoBfHWe6G8fMOy|2n4~1OBxO9dHH!&obb4cnI!e zYcaQP05kcDz0VFWu$90m{D>SKoC^qKC+JPuqX%dXE)Cat47JOC?1#oKi+Lg>|BpAAJ3y_;yq|>Fa6i+Hx*{pHq09b&MFOm4#NG+ z3)C+PGbhWFa~eEBPXS%^;Z#ik{`m#3^A@j{_4i-+m+$zOG~7b~9+O3|QmbKZ<-^zJ z*uzKSDKrP)DXSAxOCW$*@2np7q)zZD9E|&Q0&UN7d~Sy|eh#zm44z6EjFBC4Fw5cc z1Xl18#6#zCYCphO{lWQ><-`8~JI+nKCz!XPZykdjpe{I4)3IAz#8tf5`})Ft_z!B| z4EL0+2=}`tV0hWlJ2nP?asgHQjU8<>_OvrV+NNVKivfyu9W!t>&Y$I28FR4<^}%z? zx`*93+q~dz#3AAx3p8^cX8IwhnvSAx+%ohZ+=Q###4gzv--`n>cLaQrg4or{0S8r3 z<-dXRDTrB})#>8__SW0~bpbko*IS4CECOsl32X8-_N${fAEx0hXJP-$jq%Tq=QafK z$}G4gjzn~`0t~1lxc}FfHSh5R{up7{x!VF=JBRq}Am;r(_}{HU50k2xTkkM(t8ijP z1Le<;S(*wKRvPAM5@u;WoL*VG!C{<9HaxNMxbtr~_v)}^aK;bBdMXS=m&HgP!7HR< z_P2)%@pkM*9x4Nib$|tx1nyxN92c9T7QUSdz-|ZQdg(?Xobji?i)n<;RckOdgRnM} zvGdmg;~=kb1Cc;B`hbihWxzQIB`m2$V#zA(i4;AL!GNUou%~4h}a*7>ffd?v9!3U^nBW z+{b<5^PAGZhP-OsVJl_pVC!T}vph3D5iYQcjq7Bc-b#y84=KsYX?3TjfIlheM@b^~ zOw;vBO5t?iI?sQCueO)>PU7Ol$iR9Tk& z$`I|f{uRu?M|3e1BGYMm(oX-ZW!E;N>Qx8YUJuDf`@`j~Cbx#~XZm3NZAr9_vwybj zv);1QvUD=Lg$q!A4AUAbAyP)5NWd3ZC+3!?D8sdXi3i@b{qPJ=Lc8jNFWm~%rP}L$ zy&f&js9a<7Je%xj<9Xm6=rwtgoO$d!EdBTbhE>ZW8UFj312dXt7WCf@9+zKgadZXZ zh$Pfr&X9H5ExChOHCQeX9;h6AEcR1gYJUke!nnKqVmLL3){^$3jxCP%wzAfs<&`EWw{>Hx4jJ&=}{_)}?BH$%=MOe$O zAP%*m^e`|e@G77NFUt+JQ**vhx zF+!YS*FtlL>~ZtXXj@~`7B)K_r`DFlz$1T+KtpkX@?MW;Dhh4QO)WRfvZ*y6#)v@i zn~5U>eqVoh3L2ta9RszJU$|nu>r~v=Lz;(Q5A%ji4$0xp>8uKu8+4JStKj0eIM^hx zDUe@WDYw*qk`qimE)(^_iQuHQCwbJvQiEU%e^EcCre6u>mRo2~@jly`57-(xOM731 ztOy+x>h;!jZ*sh}yb<0qkMx6ZS-T8}r1!q^!D~`0H5*;PH0IKIj`y>3n6V^}worZ- z{2llwP&+U^*h6}u{LzasEBKcd!7zmgHWnP$CX>dblRNmUoi27JB~ zzHj~-;5X#ga~Lnc(rLlZ<8HEt;6OE73&=h&6~+cFVt;7_=28>-lW~}eS$EpUxbu2T zh0G7x?WyW!ofECK;1=j2bCnUn8@>sd?=!mLoqiB202M!M48UIV6%5^pV3S-@x613q zvq5JtH(2F+B)_sp?`t^u^=7B7y)(q)@y3Mw<2~+v=K5o=Vi_dlXH5DBId_owj`}|N z;sO&ylhRQiLn|-~;4y@*CQuVT&>kySq&MRJ;Qrtl@qtuXeWjm}F%#OYZfsRscbs78*JYa*?$LdT)7ecx0Ey+0FLc)R-$u>#GOEDgHH?1vB4f z4)mu4CHV%lCykjI;7-nD8v|jw0|tCi#Uu}sHcB<*=U~$;q(j+fg3J2L{>|0jyF284 zNac{No+GY1_BNJP{J+LrZLQQa(8|{#>1giOJoCNTy|3LBU4QM0r8Vk9ef8aPk>EyOj?CW~ zg72xntJnnUhIwEXB|u>-G3^W)i1Apc-4|sGa8+^ku^+Z{5M-ta2~`?C(~MFr8ZNIR-Y)pmF4OhcyHt}sMAfQkd(}DW zVYRO2)kK+H|#w+Ce=8ciyX7JKc#qPA0MFOw$d%uJCFi*~njb z1O0@b!7p--9yHJkfvv%J5oVg=%nnOie59D`nwy!Tg$rC8FnHF{CFGo5MBj%B9?`~w zcRvhyWj~rgBN4kjMW$XKU0U~(sw9Sd*K?sB9tp+aQuOG~3*Pc9E)l!MYWUkU=dXbY z`wx2ndA`eNL{E?@q!?nDr6iNoL8Y|}kh0Z?9ZG^D+#NOZ=_D_CrtibYGrcEVtgj+g znZPt;d2TBg0=J+W{4;(pSS)XF)eX=Ij9^}Zx6DH?o&r3r8juai=#5PB92gKw5$Pu* z$1Db{W+)K6almLwA^$Fc2zUi5+4JE4laDVBUW3TZ1v~l@;!HQVtXUrZGjWA`;68U` zFR+ndN|fNLa}@I+FZ&X)q!o4G_TU9HM{NAr7y=Ib3N{zF51fXAe11L#o<^&|)_se5 z_8UaNSswN-WENFWc@HrC&=Yzz_Xn@siSNxfDS-~w-_Y^F6j zz=1cwQT-b-^kc}yL}&ueg5ACpIcgzp5q^3Hw+Vhl0yhg8_aimrza!# zu7X!q(WiYecK}{VeNpK@iu~aMvZG6g;mu&J>_8@X7QF0U$bWhPoym*HdOom|nP8J- z{|}RcItEvq3R)@_dNn@rX(`m+Q>{}k^9a7R=o_l$~9bn1TdZeoenh^7%Z- zlAZuV-3qj2BC_~N$mQRlrvL*iJ}>SmtNZW>AS(4SGmC+JT^t!dG-Y54#o+s;ku%%D zuX=_#@h?WD0p4pOa(+}@(6xIQu%orOvn1r^t#C*CfdSpXwUdy6Ujo878&A6=`YVX& zSM&~EQ66-y$?C_@7g)gBoU*9s^QwAK9gj zJ*yBx$5KWGiMye^MQpUt!Xi^dd8`GaUi;#^bxWp;vhXj@No{ zct(<8qyuRQ_DBz?MEL_Yznxs@DW8|6Yd(Eca*CO=-dJ)o{ zET_lNy{I>^%o*4PreFoU27b~IzWw{C3iKm4?&uK^o0S;Ts`M_h*z>^s?vqyV-q-*P zE*V*9EYOhzS_`@CPIyNI*w60qdAov|x+V(VbF!}F>R`;zVgt9-lKS2e52 zN~C&6WwjS7uf;)s6{F|TyXhD7i)6gOMqe1DPJ&HPa{|mKIf)Y7DIh1Y#*S!lauva^2|$EmD0e z7g4P0Gp(jR0S-3hnOd~I&Z#A|)<7K(GlNV{Yd>2%M{&>Du-K?HXA<*2QlFgH(E*A1 zjngJToY0xA(dv*nhK)PTpB7dzPqfFfBrO-mh|iR5G&|GD$VWo-h3a9j&zF%l49is# zRtU|ZLg*yetb+S)WcP?F))R(6%OQikMz66sg;MM{Wr6fb&ZdsgN5c2TE$m{~YK`Ri zQY$#wPg3%b=QzDq>*o~*v~FJ&6(kMNe zu4UJnMAIPpe=OYzyv+6YKkz#&15ZEIai+Cak776oL=mmqOXV??A3YaxA^dq zeNOqJ!e6JyN>;ThKFq3J9ErA$ugj^LeO5C6WTm2u(u=ch%5IZeEq7yVSMv6PE?9uW z1rH=Iq)FPQ?i=a1$~MhPPK{Mr{&v81Jz1e=sna44rU$?R zBO-INZ_(9kX8QSp8;UBYYew2+56PXMTRHw#x@qAH1?LwnDH@zQr~+zC>f^%7Cw86K zQJ9l#S-dg!ceGK~Z7|J|;_tHu<-Jv^YS|j6{dCHMvDXTZ%C_hj=^fpYeO-Ke)`N0A znikc|8sJLah+m(*Fl$xOIR&2-?N6SY{#*v=(e&quLj^+$DkRpVPUu83G3yPHxDM%F zsr#~e#hd6#KDXp&WtNrbo3*mAcB*%A7m?75L`*JEEjanpe~pTcrZ0)?i+&i(iVaL} zE^JqDMd1yJ3FN9lx?ieE;bkXoRG0B$VqWSQ6+#o!hm-r0E7OxBKA+n^e@@BS`42@) zqGU2vfhb~jJ+QjkZxNvrr@!{S&8ZT9duU(S5!2< zV7}^%*NR@Yd%(KneTkZhzY}#+TZ>mkR!7^Z=KC{yU*3@XYqAewycT6Oj2tb_O1Dh) zN@N$7EW9OAPM42v#fOtyijEidFZ{VMq7rjxa-d3#_J!L|epv8oQI;N%rzG?!Ni9z2 zL_UdK5+4$e#jnkNK}E}~yhiaAv42z$Rb{oR7Pm^ZSAo|wxg~iCjeRWrb!t-L?xK!G zFBQE}bYo&p;>+Z<$vcat7WOF0O-xC?B!>H<*ygh0=c6m*Q*)=~{2u=;_k+Afx$opI z$<4}X6JH*?2NGEt`PZHkN7J{ni6yXOGb8!Mx8l3HrR$}8L!D#QNghhnNIaS9ReVkQ zu2e-mMA~Gn*Og*i?6K?zV;5)l&57jQkoOI)X=-k(_zAdZw#tdRv3s*_$K?%UZ_Z2q zq2oq0l1RUj+?+V9R`zl;cL-nncxrBF&ijSH`7pj>hBl<8K??;&?qB zG;hw|nA<4+Pvmusz!H5XTSvFTJIB&5B+I0i$c6pMZbEkyZw;JU;=aUx?tDb@#pHd- z!-;OmQ&KC^--!U6Cq6euty`t+zq4cUhjL2gewN$cX#5`kC3~J7Gpc8Q8EqTw9hp)* zBb5&i7wN9^O8ODjV^E?_;hKU+i@r|GN>)mYE@~}{Ykg7k|gnj<)arzo=wMPs@I0MHsb&8W`ipye+|7W(s!obO}tXn zEzw*ge_Z01RORAju>LYTPF$c4uYydr+hZkT6{F|b+4H@~2r=`rQTe>l!{T%Ase4_V z^&U$+RV3jumU&Xv5G!U9{P`d>R$u(cKDu@k{2p6>uAZ?482{&sLnQDM5t%c@LrO%h zgCv^S$7`hBvd+w4m6@X4wfSGSi=0le>&dye>G5J~e~EIAg=d?|;Z5j|^pt48LXno? zaK~Ag;5VW6Dry8*s_6St_UYNW&g^CFUSe}b%LV=fZoQvZA5iH(kzVj_-{@5`hfg)9 zD`brh6~nKCDZbL<=Ey@LjuHJp`^bE4D)!h9qyCC`-Z9a{hAeS6y#FlOt<@s8h}2vy zSGFOUXp2K%CbQ~S9Q|&Q#pyihVs}vm^6RDhOea;-S3|W!pw@ixlO-ZGZ6V$>Je!ZP~W# z#k*_CrwDs8)rZb&i6pjijy>WDUyA&MIK>tte7oqyi_Y_!C`mi`_a?FSXC1kp_)W(Q z&b`{4M4{-Te5+^ec)q~Ajo?*;I8b$Ur)7=6d;F1C#mai{0h-ziD&O-G_xga{+WPxl zsd#TDj=B!2{YfRmc8}HRi8A;Xif5c6+BQPWJ2p9EQpEoh&wcLgeBouj&uT`D^1_jeZ&~w)`FBe$-r5AzP=( z*RF5vl$Yb5Wd$A)YktjHC%f*UyvKcXVSS@;aV7(QDH;0Ho??>L{QI7V_bIu1*~}jl zuWl?(HQFrnHBRkB?^|1^x`|n%Q~3v1+70uhZx@QLRTkB1YgAhsuc)>EoAPmZvL%oVi`8QI4Px;Qe-Yi=B8Fp>2c-8yj zrpv^vn%QA-pQzb7k)uy#2n|&m+QyxnN%kUsUnydDt*Ysp&1nx2-y6;D^?b=Etm$W6 zaXYcSY`)J)>#8h|@j_9@iteINjBo{6dCT30T?EI8X|?9XmoNUBzwk6aYP`7iblk?h z7?_*IYet#Zugt?~B>kvWwMzZ>7&Z1G+qQXB4I*;>Z4yVp^{F23o za5u|SS7VuaWxT>=sRvWFQZ-YJQ=L+`@m5Nw63H{7ULg&}COMI@VY6I&mDg)yk()IX87pCVYvlE4d_Y_78-z!*JFu35< zg3Tvao_zFV=aXG^shOd7Z@uKK^zN*tv7zzbb1y7WP2FU=OwUpS^6Tc*%-)Z|SghM; zFFhM7B$_1pCW=)AY$?32a92UR;NcUS{;Mj_zh%Meau@p~7ACu=V|3a88h)t$XytU6 z7@mD=PF`N!{2?V~N{y7S$=N zfUC_d+);Q*VyqqxC(~<+AJNrtYV2tClAJpE6HDG)`l&MWOK&Z)DEIB01@Tj}e~f&T z)w1|5So??M*NK7zp9wZBoobaVow&1TUeO5M#+Da-o|u{(lKNjd#DH7c)$RP~eY%I< z6I+`7V@`{_0r|^IL{tl&nfJFk^lP$5##ZUD_nunu^65FrzKI2iy6L{+kCp8@^-%IF z{X)hRjZqEqeQF*gTe*0hYrG>eG&(lcJN`u8*phQfEhycmZ2vN6lqiT_86TnpYCPIa zpVRfeUo)ATxGVV+9-=zV@Cz$^ZQ}OCw>m$+p4?`APfZVYg*q6hmOmExNayX-V?V~e zjBn3<&{cj>>fDl5awbGJM<2;<75g78+(vJV#mO;6GmBEmTXoUMOEphb7VSB;=&Hgi zbXe&r+x5ECZR(4nGU&cZPtIB$xl#}8aye(_k16p;iEB%pUvfy!1CasIwy`0yH+Sfb zke9wCxsP|;HPuERiOtr2>(tXl&#H27TU0@R?f!aQlvTZbR_e;+{L}{ezeT!}-TOvi z@~dYz&K;X~XUWMWUWwlxsS{h2-8goBw0m@7q=f#`Pb4ZPYo=!uFXbcbPW_VnyztMH zCr&b#V(D!mVQI8`)6eg)uF>4P4!HkUU){qZ@OuJU07UrsHn3Z_Tv(FB|b_{ zOg)%vnQAU$?lFAP*sMgfZ@hkPulz4cH7WaPi5IhPjqS*Z=f0giH+q!L___G9t zQU!2tKOW4MIh3yl|lj{>piiQ@IOPrl(QgpwL#{VSh zCk_{lO70TPFC||xrmn3&%<+-V<^M!q%#FZN+}D*KJ>#W|((Z!Y;~T<4kM*J2;UOJ?6* z{Auz4Z?InCmZHJQcUiC8#CHXE6;(~`!rz>q_*fm-FM7wXOFbmh_+5-+X;F_yqf_M! z-kkk-d`^5+PV>CMB`1_PBl>9imPoUl^K>JewH4p>)+YDjgpZhX{{0cI(mPsPWGPc7vib-1367||H?TODXrgdLF~Tl zSEA3^@1>DUm5%c2j#x4G^FMD%&d^!uwDjOqN%?h;q#yRUjb-i%$vwzds43&@7dpf4?QAIi)M!LrJtc*Mw85Z3YovSA2W7m60yj*N$al7>Eb|P)VpT8ry zC^1XVrF-erpOdx3Q0wYMez+)_teN~#XX;9RXD7c){76fDga^JE!+UR5G%jsLZFg;V2=$dpxeT`qny2j-? zc7}WIvm#f?I(`(oUgVut={qsVN8J0OtohL@*$>7i}WMSk$NJ1(u^#EUm9fP=p21(>{+$` z|Ka26i-t5v+>r{JCoir;}N zZ--;c^Vyrr#Ok4APY<5ky*!^8;swvi8NW@Gq6B<+n!N7k;QBSZj=}cv=&gg))3F8F zL*xI%zmWm+eXM14xk}Ve zBjTnji@GFsBy;UXahnXUr_$FN&mVa;y|T8b@%@dL@F_fB!<9G0mYjfLd+3b1#oiyQ zu<1>BSjqJ7^1piQwSr5f0V*o7@Cr%t$v7t6LqJ8NDPnF!n+07hTR?%)UB4Grl}tF@8t(qp@z$ zJ0nwco9?6&^?xEBA17~09!PwfSf98t`A2f7EU}fW$Vi^|9r%@HSdy zgl);@vXDomTfnKSX_iW{e`EWz-;dvw(=X?p_~`5x^}jlf&HAHwL3((qTJq1Ln2Oki zWM+iEbthFP9x7oSAucm)Wb#|Oj?4&cSsGB&+r$uEFGZR&l-;?{RXs!PGHJ9Tlt+$R^ zkem4;x)0z{&y&Aizz2RFADM%5D(~m7{O3D(?8o_DFN<}SCsVQFkNKnv((6fbo+^_1 zY{e}eGoghqvqnTJ^PcY2q3QkXCaTX4#{Z1JfJWcp{kil=X*vts>p)ax8y6W^w)ac}mr>;`22cK!LvsNtTOx>?r3_eJ*>Z7A%Z z{_Bf^6$Q^0JX5fvU~pmYq7KmZp;SM$Y|;6M++`0*n4u`$$NB@dO##*R6!4Yr0z=0O@4>Z*5f`4YKs0qe_t41 z5x+3!_MDD6wQ>%`Tf`sBUZKZ9t>_={!dIyw$(z(Ak1X6+a7BSOY6W=(R~I~A5G{PN za6{qPqI>NWF)6hqeWLi<$ZOHRVwc75&UrTXS=Y89@A14UdGF?)%-ITHjn{PX0OC;wJ~+qm#7T}Fx$wfRNm#e)xJ9gkFuB6#wUl%MdSXYoNm{3?=7pV!lZ`NUJ^VGGR63NzMqL2qN#?}3k(>S+c?xCDv zIse3K$LsT+E{vYcnpAv=9G6>?&*?|qxM+{@>QZ>Vy*lnM{H<^#8?i|R+at7lDO})O zdhMI&RCz6x<4fY#=G>aoET?|VV8bMfyW#;0A`>)Cba*k;iVksGqQ*tLDP z?3!njrS&R&8xKFhPV6TVH|bY+CGFNVU7GLJUbgi-oWg?W^|23Q9rYVcXI~z_KE6i= z@nhMWV>ibBh#rL{XUb+NU3{HgiLXuVwYyiHWQ*i*JBSn{uT4!gqoZ++9k7?Pv#y{+ zuEkKyh>1w*5!5X{EB;J;D5-lrJ2!iD?0>2k%SY;Cm%dHcwkFQCBi01*pE~vmJ5}eH zuE_<-YU16WsH1!<-H}D?A}i)0brOA|Kl0fIs)QaF8y>3^J1CY}-_e>!#$mIcf$zzSFB1tt)i3*^%6s++bhvD(t~C_7+d-JpK$@lT6=$txMUf?IAIQ8M4&B z#wb6J?+YyUVl^hmRU9_fo8!sU`6|$kB>&bWp|1FO7ry3nY(pMj?NQP8Bumgm<)xHB&FPCRGRQO13$;kJl2tuRho@nbtNf#qEN^$=5U zm~K2v7;@kb&{0)o`rJlSt;CZhNcV+2n5)$ll~qS{1oypJp8b5Wm&tPZSNqgQo^x=8 zlcD{2I(WQ-y`E3+f8diF)Fl;LzvUwJF{gu64$Kyxcn{b1t?n6x_Pt0(vSjakhclh4 zN6}8*Q+DXmxW@0zDpEew-SIUH+W=@ZRB76FMPHb8`lfw}RsGzVmy5}~XhhfI)t z43fJt67&18*Rx&MX6)^5OxvIMwpMt(8$?yE7SXA#Ti}1*`^C}T7Z)3Yb=8MbHpy+c z*UlK^J6Qjgc-yHSOCg_a&ib27me7smh;M!2?!pY-ixaE@8+;69iYo!Xuk{pt>*48`?duOgv3 zX{egX9%+v!ttal%$Q2f=bgzi}IMq9qNXz-~{bR0jH=UM?nZF>@>8Bk=u@8Qro1eF4 z>Q8PIYY4dwX?HWvH?D?-nyS*fviLG+e2^;$`8i1)eQtz7LwD5+u;D$itYggn5HY;| zDuT|8{0;@qGVa%7GqbXORqt6u`YKxwx0r)|A})^`-?vC%woW|tbqcNzl~p5+XX4>2 zv%P2<7^9ruXQ>Q1hwiEA+0ofLVd<~J-`183mmfI*A#W9@`&xz4d!BRn`aySN_nhpVhvB{%e6~sC>oHfJG&{7#e zHyewaj6o;sbAZ3^##K)s6`{i9A#*aABy@)En-{0kd#pkI)M&$A5PoMhm{nv@)xx5m zo~}s`T&|;61KnV|!kE2irK_kbbk6voqd+k zMU!RRT#>4n7(t^a@JE5IyD>FRrqA{1j`D_S37n&&7J|S%{5(P7dAAWIV@w zmLla1#91cL39lN#G4|i6hqo>*{_FxQk;2h*Om8c7o;mx*&tEieQlAL@hbEA< zWq!Wl=f^ZdKlAytim6x4^Z$IK53T%|qxU7}vsBp(p-U#3{aZ7YoAVs)4aZw9o->bJ ztfYB9BQGDy=i5&ceMk?!OnRR39Ke&iO?0Q88q@W1z8<%(s$$w(@I!y1hl?;g`}y<- z(%;D7`h;&EQ;+tq*mwhRwUpRf!fqHl=;sooWL%pRqWraf4)~BT4H>}qsEMt3DG03;y6Nw4cc-2Vz9pac5(jXVI zUuB9*ADh)gEUz0qe7CH@N65ft zn*9{o;u`k8z1a2u9^I4TJ;OwH`tXSLpir5)+04Ig-kuUMY-}|biX(oB<6JAYxLZVU zk8IOo+Pa$6-p^6Pyf0Fz4<6?^^9CaJNd8_KT5+WhVRB621d3tcSV)cfSqS3V7BJ%T=`+kp}+K=J- zj8y${QOm4i#}3&mMhj6a~6qm})G`K&w1xiCI?fBI|q}-7#Av?*7yn@$j5t~C9+o*-Z%$Ruq%alQm{N{;_^zdG1b@{4F%;EL{;(yY;&Tm`%6Ac;@yg5Q5cj`r*NvOW}@==Wm&^0?>_z4`CeckF7ORZM5?{gCj7 zB7lLZd5pY1F2=kaWAm-Y=W?BosLws2Za0cE_(eDTEilw_k>)94nD?@$y)hTHT+R3N z(rR}&kp{b!rW`E39BM85S|P1uEVq^e+y=*V0}XY$%!WL;MNcx)9;EO+8hIq!70|-~ z`n)~-(hfen-Orogk_NCxYrjLjasygBBJ%nlO}0;Tc6(-iR?;tF&)G37#VsBkX^q?2 ztPW(gw!fNUTKmuqQ+#?YCg%uU@|$_AM32;=Co9t`d63EP=6O5R{F*%2_aN6b_@{TV zKC?2%pT+h)Ez4jAJGR3Ayg?q;%3pYc&ij^SO{AkVZey0^n#`Sy5!aqA_h2!*v&DTb zW_xB?U(@B)_i!hrqT?=<)5 zNOO%OldsSgb9^(~OkM+{UPrD<(j-+Op1`FX)q8rY&)jcL>%ksJ+{4zbnh^`yS7C(7bQ3_D8aS zcZwKX@GS_}seqlvVE6(r>*tcl^@gEH=B94slP7~O|$!v8G6@T4m6KlNd2{>^fI#Af#mjqE$+_D>p(he1le4{=i23dWUG6u^4#eT zJ|mN(WRi>}BSZMhUDS2-hdTc+>uaWOg+2g_&G=`&zm|Xfhq2hfx z&-GY9J|;TXO!BjktS=#RGyI%w+%~aD^L-{%q--~)!CzSIQyU!bcagjr5Kt{+U&kCb zGRJLT$3bvR2m0bV^M5;extiourMqi*hEJ7|UzQ84l=OG_UJFvx07lNEQ9{OHS-K%+ zHbW1AEv`A-@jj^Bo{{e12XngFUHv8N=|45xp{nN$*Kj_GyTZ9bpVsqTNkgN4gR2=x zww~Y*y$oZ&L8@LSS5q?<^*O&MLPn$E>&Mv7MRe0Fzo(F}ry%C(4n=IJ2qGFe0jOyXELyyo_UYGHiB&&WR@{Mn9 zWS`&mGuY?(jy{Ta`+%&#VV+~1aX7ntH?E;;w3lGdHp;VVLN8B-c$5( zU8?KGTKBWm@s_%)l^$EuvlF39 zP&9H}|I|IWj{PD)k&M--E^oFJl=3SZ^_#fgQ9lo`BkvjQ#pdx%v-76;c?-i z*5x-EWD%KP0=;jy7Jnm&pTTJ}t>PD~q5(AObk<@O>HOGdR>8vWvm>jadUP76t7;i9w&G`la2exXAgMfViIc6CCx}#Lu)DM+S9DGGOp4N ziSj2?Jd0nghOKb^m)6MVey-$MgzmMo9CNZGhaN;F$Aa`UorR zInOCZIjpspjqvNne4$s%`JsVl8kgayCc|v|I#-I3P4OwQfeP}4c=_1ScAGyl_<)_sb%@{E}coYV*O+;ZCRW%@CofyZd* zt`I<1c%T!VeY#lCan@ps4BXE%Eaf_Q?-h)~yKvq@86>azdz=4T=jR??a*p%Wh7r2Z z^!@4X>tTjlSf552{;4~QbRC=2+2c;Hdph5}u6qhCJl=IpU>hFtc-)bRCrVkLGe z%1)(Wh?0Eu3*1*lY(_3$D+l^1@BU8pcbsQ?QaJ_A@Jxlp8Sy|&~C3!3@>6#HV;ar*~ z=$d(IEI+07UZk0NiETEcT~E;!38#Y_Dk9sM@#zJLc5Jlqd)ZpX87)m~nRPrJsm z3;ymNx$A>yqsMtTPtszOvAN^rKQDHkcl?||1CFQdhWXs%k&#|ca=t;d;1F4sJ#lik zxUvSWuNGFW6ff&9TIwWe+~o0=Gf%V@da`+4tg=cl?%BrdESBzHt8|-n{b2@yEuaHt zvdu%WM}5d#SF+H9RQ6S&`G`4wlw91K`F%g#@(f)ujV)e5l7FZ5JV}S_alFqVl3DcI z3LeyZP{4aE{u|_d2y}TL+t;6;g$rU);x<3s*>P3INWeh9wPvf9w%-0#)_dl{Qm{nG5Itap9?c;q5IvzxJsRib~ghdJtVcCud!&3BmTdg@SrmzOYIHF24n?5D9 z`K|QtJtSq2=V0EDeY`yaaye>-*BIk&v{QwQXZj&ObAg_D@9-p6%DGv=x7#ci`UnrP z1g+JI6pf^jI?)An`49i$8J6JOug932p##~O>7rD=oSd?1fzIc_w#AJ;sa9u+HD8L> zxyt-LYlhadaeo(=VgH)A%G&ht9~s=Wnp`|V+gwMlRHQ>r=mb?rQ~bztS<7=-WgzoNFP>curZ#Ju`e(A8KNXFsSWSXLOem!48xf9VHxJo0ioN`ax<}&UO221 z|M5)Rrjs>1#_TSpMb^laeod_A4X+l%Ekngq+QJ}leAjx|;60yn#^_qyUVI{aL}_q;Q|htn?h9{7xLs<@)ch5{m)tHvUKOY zu6``*x`1rH&I=mM4mP$D4mf_Os_h5+cQ$Tk)9S4=D|tL$<4r658%GEpMvUZ@BZK*J zi1tAWUqj_j_~ebwSA~`@jd=)_C!2Yl({PxNV&=PHp*rH75!XX7a68{x7hC;&H>0B#V>f@{>m_wXEbpinibq}GahcH! zzScl;@iatpQq(N;;lGx>=)syiENqpsOSUnawqUYO6a`UoPJI&m@ z4_6$)V^q~UpgkVr8v3aN3(%Sk=uBeTV9IW$d9H=gFN0Fggkvv_+~|KU&Mb`1fe1|&7f81;f{ zPNRi>F_OECM?ja;Xxlj?aTe)WPeOk52rD?BoD>-Iy}Y%!lA!{=a`dz0Atny*I$9$RS=aaO6|qr9>F&x_4{N=l_ifCk=bq@571VRFIIon!CVF$dGR&TibH?5tqY;Q;ZbE9?K$~VrkiuGl7e>LRe zWkF9RGI5W!>`-fr_z0@6JLbJiL@c)+t}2>q7pnCRN4k z+6KB~0`xVUMD?=UxtDG@!G3(UP;-q9a+S;`Ezlkjn%%b+%m7PB2S8@9HOV zK7?K^ZDnnsokr8hA^-48^R`6Q%}cn=5LLU;V+NG?J6%?t_HPVD))D8iU!Jjv(=^p^ z4!!A~{;sW0Bs z&YnM&^^5!6z9GNa*C!&2;UYWD^cM;0LQ_q^|8GlGqNDE7;d2f-IfYC#A{n9Ud(MWGH$X?<(saLN)f8*KK#ZURt=OLQb;UchkpT=B1aSSEG^LuJE1z zACG77{!7IK5sgNwlAwLY}OoxyWZJ`K>8bS6Q79=?9gfYZ_LS$D%3VWZQo)~ zR$3KJ@CT=nr`^21FIoA$9y>Gl@r}r6;0r%?)Zcj~zq*b#x*I*Gr|8RSSKp3&rQ_%+ z(F(dfrq!4JA^(1#GyLxTubr)={e^4jC0fCwbo2zC=3hwknDegVA3S9}-KE>(C1NPM zu;q(j{KLeRMFXpX>Zmw=Ejr9+xPjZw9sM`-jIeO#4v*5-NN==(tiZsTKwXxm3*^V1A> z_Y9OZlv0$UM>q}t%Zx{;43V5di2^9t8LCF7I7>bl>@rp#w+CSwIIqqmNc z{pVANTSpa;Zm^RQL#8sTTnau?SYsxlX`)w9{2iH_M!PSbX= zpDCGjKbbD*OW$^2DTBRxhF5+Nmi|Y6Z?Hy{GYGS$C`M&?vkhG`+|^uyc_=Aj{jVtb zaalE2@EQUK{HPd5KRicATDu=q9j-a#k55%Q+u41b?)^*X^YcW!D;57q@6R`@3u*uN z#Mn1uF}~nwe88fv=1V-w=FU;OHC5zlD9bQJ-0CS-cRAF*4(qXnH2fvb^b0(2PH{at zt_z#+K<11~-SvJ5;<##pD(ut+>`tg^U7U$lZilx*0eI)OHTJ=wc4r!C@64t!)2$RNnn@l9y*LgKz!|UTBBa z`MYz}_37(b*v71Bs77x=%XK0lwS4mgUHGmw5PGG)M212~-l1&lcpCOgtGqa?HYpj9 z;W^jSL|H0q8sk^nih@3ASGPHOIL(c|C9`mDbW3zkbfpT)711UBXKZx1T=jwCrISTZ zAHdDp%fdce4Wl*f2L3%(V=*3g4XJz`GtpYiwk-Yft5xz5Ne=w<0A501;(F8gkFYnd zkn)9O>jRejOtr7y!rCG{xg@~vO~cV{m!Q3v6BBn zH3>|@F~uZp)U019j@(e*Ve}>9qInxrO5)*yVN%V?zu|#)F8a` z+cf&WG#tP!ai%&MX*DqfAHLU(06^T=n*{Br^(D}c%~4Z4Sf^> zBYiPOunj2*Y;awAvsgs&PpdxIq?z#YE15`D=u15djtMcfhego8qo3w^yn}&#A3w1Trusd77Vb6FU{52ZwdkWq`J7Xr@U^t|VHpuA`r{xA zwuk1}!fxO1?(Se)+OfnX`E60Gz~6k&3an1pdoe^Xd(!<+I7-MT4e0zyw*NKOXuRiK z5**^GLmg`Y`|^p5)KctSK5TTDojQ}9s!DUI6_Jm*-P#S=U`rio8Hs))gB}LBibp+$ z!%$-VyIKfYh{S5qq;)z5Q>9u;!}nEDwV< zCDAI)NOe99m?HOD;o`}*8Iz6ph}YcDo9=qKaj`GG>v}cA_&jD!4R^I`T-z_O+fTgg z7G!9S83}QWPuQd1v#Mhy>q69L;Sz3ywHMG!pVKUhJ@(Nt>uG^Qu<%E0#1=U-A-;DC z{jwg0nP?_QuzeSiom#N)39?(r|2V`8*#-;mfwR7cgHC1zbp9`yI|puU2@SW0hQ~N# z8@Q((2K*_yMXzfz@wERLpZVVh>A)-LmwIf`47NI~kvoh;EmH9-O!-T33--JY43;Nm zdj=1vHBE3AKeR6?96=`g(CZWE^ifvFz2x&ApRUikH0Ej5X3wtmR|nd^IzRL`m9Ql; zeB)8l5+Y<_$BakmqXJygAFyWu%yAgfSjk)5=~X3ia}k}@oYo3`&|i?d8gfH+n4uI4 z6tH1nQupDSH_$a>&C&C;&)wwgB!=>1yu~O;YqBh}n=uL3s-J9z9lHbydrGWkjB~sp zm*zhl>-Y4=LD%tbI#RqF!ud<~)@E4eEPn7d9BN}xm1FeOFK}259&+d}k|UOXj%Q%? zyOXYK+)qP#Zm>I>O*V#+wK*hhi7O91^+Hs8q3bmG4jP}@Qynhn^tg3GC3K+U6 zO@1ak+Z9)NnRQ#2J!-=zyW9%y1MU1}{&#x(EwlSCy5|wA`U{-&aqpDii|r->%X#7n z7P6vPYctlQHe`LNW7UF!u9dUZ&wK}clucr4!V?=@MTp+L%N{=u7d=QH)Mqz}R29@U zZ&%U~0TjIsMk09-&u4q$t;F?@yY#(ao!Pduv_6e0N_= z;tP%2ude(LKg&k;TN!h$y1nq@yI!xOUvDCHb*#q%yFg{}k>A0dKS9ULqZytwZ*{Oh z?P;A`Vdz`TXG$tJv4*}EIq z&#^4k2wL(hQIT%+ODDhQv09(dNuy!%_pGM`AFV2zT)}-j<1x=jjWv7UXH}FB7jVxS zzT|`S{bKf|E|23R3w+3UG|k%O2$PIYOvU^U-i=^H51WU;NQ4;gaMr%BmD%4+PBM=l z!n2QOyv;f^{XJH0U^5;!nmvqqIs0?&p)o(8EkAK}>)Ga?@dtaz>q?_v!#y8!{ecA^ zLA%Z+zuy|A7odZlF#j}C9ek!?{F7(+97}w5u4CL`EZg{0SL@*6%t(%=J-5Mw-}!63 zN2RPUu(=<=B2}|KHb!4K&Q_1#jeH)xF@mK0qrUE3+NcE7F^X2c(w%i7r}eydIu5L? zM`_q{uQ_@i*D@U1=nj88#-coICa-d3_0;bL&GEYH=|HxY_*5sKm_v65D|5hIEb!SS zP{JsGJ?+XvmQaYbhP{`klZ>-5f?a+4RCnFqxpu%cSD5`=I5kAW>yz^XeD{GQ^8vQ_ zUa!LLMGHNjffVMD+=)4ufc4Mnfg>447 z($UWKu(RLqnja#!Px;jAq9IIq5Hbpo!{W|RoK%KzCC~! zc(x;7EY1*iY~Ck=xW+p8lxD96)08K@ms#ys(dyMn+d$G?p5AT=t6!S+i(XfuJJnnx zYp*=x{WdH6l~pm7o%@U|PbB%{jBj7p@d;fQ_Q$n{D{Xi`$!YKWH@o5`#&xPS{sqbE zYvgyaqf!3EAsuoL=o9f3e3rvT++yC3(2Up86g!+D?s0r?F-4(HLUs(=Q))Qztnp-un+C|#Ix{K|L_~GkY~G+Cs8A_8*_Vp=zhM+ z20QIE*H!Imp65szzjZ~#-gf+3BinE>_h4qGWi^UCh>f0O&$z|x#{p<{uQMLzq3>W@ z+C~2H?BzQn3<)Bz|l*B=M7D-T+zl=ZWNt<%WILm%ut}A(JP~&V#P|9bWkg zXS*Ll=;5eu)5?#~b*;@@M8sn{d^_BlF2SdqR@|4q+d|R~LTk&&nXYwK;idGi@CVAEnFlEB;PjM!P53@a^fxtg>2A=o+ix z8*(|t8d^nPz2+#bt(SpT%0?^Wevg~2l5Vv0bf3Ah_;>i>TG55-GDm)rPf=4Rgl@qu zKm~*GIVFAOU!RGHLxjCmS~yx;S9KNc<}U9Ig={V;-jkl|Y;)+)UG8d~sLEiLE}nH4 zJi8IT?nZmgvkvyt#DBA`%W3wXil3*UFSh=c72lZri!@d_?9{Fz|(qIe{M!+MkYni ziN3_I{aIc_;L7%4dcTK6#*xj&GQ7>Z4i*7teq)WzA>C`Ci|e4xPssF3X0KD$<&kf* z&Wr4UMGnj8IFQwqzjHIGI1_8rjSLOqmFD79dSL)hiM(qie5{)CdY*sS_vaUJtOyNM z*UoFduqKmOiE+^S4Q9|zi|Gq^r8hx{ok_x%=|_!lDt!^1_9H_AbLCC$}Ya`gA9$nTuqsTv^k8a`hnqKS8(N!Jh|tuFrgv6;L@ zWm4PpKR)?K>V1_><UK6c|rvImx$Za|k->!;aiwc8>L@-*}5vIPngz27hQ#;kL z-Ya@h(H?x`R3YtGxp0>%`>#|DyplR4ol-NfS|!7175*3K;~sV!TcNHX-_^B9f1kSA z`vIdqq*FxLKk;!_{(_j%H8kz82L8l~eg*{UzN?Z|@hWeE2%m21|Dfl-mPm z`w1WTaw9o~MXSz2-e`qg&K?b?&+dYiR+^_btn)cEN={^Zre9pk$Sf?=_k4&{*16DU zC-e4aR(ZV0e^%*7`mP+yI*W&pV@>}q;=aidw!wDCNaaIhVHZ#O11o=<<8Os(-lR+R zWSt&)0t+Ck$OztMQze^EOirKB46bEM{<=T?zzB>Zy+NB)wca;j-S%2{|wS{u_#pw zJ7oW=Qnpp9qsaO&9T=ACfW0AgdHSG^89A8Yc4l;{o^rc9oBR7)uioN!?2#4Hu=sGg zHE((fy)={e(bFoq1$GIUMU}87HN0QiY6+Rf9a;LP=$Nq(T|&pfE9r`HP;^ftIUP2B z1;;pq?JQ+Re}tFU^Bgvr^9ok#nHfeljhFbGA90oS+#F|Kkq0r^DsI6~8RT_W9?5m= zPcp+`&{La1q6>d~exNKv62=gv?_TlzQTT7C=5 z{J>UhqQ~EbX?F21+ZgZH;ll1>$>aTO2w9y^@7FLJ&7rQQV#`<4@wxO;W0s&RS-Y4X zyN32UuXsIN9(^M(a-M9T_sQN0*?GHh>|bHRO5x+a=X2Ji{X%X}hU zy6kOfn)ht_pb1?bGGQjV^JRWdfLcOy>p#}yMgQ}uwZ0cSwt;+n&UzPS#p#SHtju2T z9rd{?xckD)=U0)RA6SaLzWW_Essuf9HaY3TuDqJb6J85RggWVvi5%B|;};lZo`~BU ztk0d~r4qL692zIak8MkKhLW?sq+*RI;bB&)lHBLK=yn~7vSf!fmgSriP1;pax`#EGK{2{V?NUrWymgXKB@zh(Ecgh%y^*OSTJeB;xZHLNPaR|^^q8R>tKo=|Pj#=307dL2*a zLk-8x_7Mz2F)pJ*@e!K&nAc~@;jEakYN0pF4Cs0RUDcN-@<4`5`UvhBQLc z1=%V}R}qU3THrNtnd++J;-2einfFuU?NK?KE?LM@4Ndh+y=X_^1#Ha*c^73c9(StT zoi7f(oc)NqstTm4G1(<6+#yK{8U4&J8sot=#3mdU=KY7J3+s zE3BEbcnAHhu=dtjckhlO8y`ZCA$qc#9r%%4oWw@_%Rm1Na{WcDXRr5n(k|!20?O%g>r3hoO?~YmC-9e$`aZdF;$wlG&fN`X9^ifwLT?4~~(Mi*Z-o zA>l{FlJBKC-oe+;7Uk6vA$$BFc5G*ieRE)Ol=L%OD!_Z4LSZ8mbd74ZiyrX=qBbULvrD_Vj-mJ6Z%i>)cc ze=5QdtZ{`?NKU9n>d(WwgJ!xGZ;~V0SkKQi8P9W9?Mc%f$euNuBmiI4st0S<)YV#iQ_`@!qFX4_l_|8Ah{x{hyGOjy~z&a!J zJDEKQFW0jIyZT({r~4>LoeCE$B12oO{e6!8ySdpp=w z6&Vd4- zaXLMHGk>!+j2|phYtnF$l~+sjC6YP9m+#b)Rf&B%DE9jseex%-X)BNBYp+g_$eL_fYf^O=&2uM9cMtDna^@OW@bK4? z=?`Q^ZDbL*`hAeh#Ei-5uBaNBDdY7?yjTVDpTO&dI-Z3r(n30Bm7~1N8twF*z_C~2 zQ8zRy9gR+iVYXn^8@V?g1>025*q0!Sq1I{--XdfKzK=-=^$wrPbXn&}?|bhpBe=nu z+2ra%hV&}e_?ZeAjryM3+xBx7DGr>LlPg^M0GP z7WS`h%DUdq#!j<>Ux!0B(AFzyfLS#2T*zb+%-R8l?G4LTAtN=hyOkZQC3Yy^YA7Tp z8;$%%lJ_gEwHHtDCi}L+$V_$qms#7_F^;P+Wh>0iE;{5((z-t*sawcu=#KF}vpXlV z9+%ON>qzZ7a~ka9AM{rdjabv;Y^yU1JG9SHw)_6KR&AlmmJm7LWo?A(SWgnZ_jh@p zt!v$e7~&12Zist%2uJjgJ8wklL$B-zX*)=xee4=TRX{)MFYtZ=&9}84TV^65C1ho1 zk(-#2Jyo^hDZH0sR_uE!!EpFMnBi8d{XQ(lRQ%Z}KHW5!eH7+y zf|-8;U)q(=cOfnEJMHnE^}F244lC*}Okf4R;loJIfV( zN#p;?Z>bPDpD**E_-8-<$OKg&V>7X@i88x7h@>}Q*PD2TxLWAEazacvB1V@KLp=p* zs0>H6799(H2`?3usmJfB2m6+WRm$>@Q!LeHR%0{k@d=)5EnPpAZ#C8(Kj}{TuneQ! zRX@-0SBPh{BCFT?S)06O(Sc$A-ca4Ko)%k7BHuCpL5qFvo|luM-NqpBL~H!tCp69L zv`WYY-^rGSinUOUnuXCUAem*!WJ5MEWD$2WGIhmcD$t=Jclu0{`m5u9K(1e*6ME1M zE!c$G7^Yc?9$mE0?Cypcrb7>ta1cFI#NViwN;|%21$70r)0NU^>!#8!^WH7; z8ArgDbJaONDx-Xq{s+S#kFYP)i!ye{kg`$a>?xU!D;@W^%B6GYx0`6E@%+=EUn?7t zwvhGRZ1+vBI^=;2WWz_1m^mckF?Z9EmT2u~4|g}znrY!L`_N!Ch8yu$Fs{qk-6dpT ziD>wnVkaL$h~>;$@FAY%TfPbzeh~Se-%FsxIcgd2Ckr7OdmUtViFwT@1EId@L&)O= zGBw&7eZtH=>-EE~WvtaY+|@keosY@(MwqrBE1RS=@wl3d+zQj)33K+7KQc#Og~jS8 zmt#i1RK@ZO59KcvDf2O>6I6MQf+TzS?D^1R4%YPmS^CuVk9WrV>4(nl@FF_yRP&b3 z><<=tah#yj{-TFMW%K_<?bk zp{-tGHSkdX%JJT*YGAwHyFH5RUH`AV?uyvAxC(@%emv#Xr(A?*tB5D5DnGou_pAHs zY+13FW8$tBk8R5G+@0y4v4OP-9c8ll%$K^K!8nXiL$#i~1g0=p>U%RN?J>4tzS&*^ zbx+5=hps2<@Q@)VVg(Gp8PD;C|D8=QEQTtB_wX&2>UhRK`3oYff{7?&MOWpko^Qoh zmg8E^dv*L(hwo5EjPxi^Cgf}!@yv?+=CA+E)(Nju7_`9A{|#mC#(V8`{FSu9kEHLI zcT3R|7m|z)*su0D(LT717s$q2{Mn|>;LGCj}%dc2ee zQ4@;YZ46(91s-7kTfi5s;Eo_GhuQNeYaO!St9dje88?xskbN=Ab2z_b9-H_g>@^e4 zybh+n9=>d1E&qoZ{{!pzK07i=--EUpjZrmy3Lfhiu5_zx|6eguNB*?mO%}}$i_CK^@EX0XO+cBl`-47{I}Z1 z@)G)@CC{{$MtXh8!DR(btE;U2e&QexdH){V)dS{cguf@?IVPL8 z*`5oqSqpfI_waQ)(lB-Sw#UrQMmp^!k4-Gb$F$aJ(z1uGI)kmbffqXpllCSJ^%=fo zFA2$uo@UqjN-E;&_?fMzN{H;NmnHH6e|Ma3G#7)ZOoHPiA;fO}Agg=CZ;p`iQ(3Ib z@UEfL%SgQc%XpS~q-qt;2DO{ov;LbX~|z_!#E z`jqan2Vg37J}Y#edbt&tv!gWINgT_Cg$}h@Arqi9dm6(gg&q@opuOO= zt%uF$K;qAnxy4?GzE3~V(wkt=ub`y2Gd~ZAsVC(2R}^PFmA_QZ$_$9MDXwV zq4KgOk1;osuaL`|D&`3#@mt@x<{i-TQLlf8Tu<7~r!BpD2b6Xn=5!D%{GjW3j4giL zd!Z}Y5Z-R6U!SiB?0`lwX_T}M-Ps2;6R+v`hNqO({f&56Zn{vpd7RiC`)@f!AikZ8|cDp8&g=~1e2qfvdBOWSs{l0fXz4OzVo(-YL#7NJ_A>oJMlSXtx6Bgt;7U^>GR4v1~ zRT3Y*z^bnTk5nLc&FO&KSe)zWyk35H_W340lLsa5g6(&)I!Ci|=$#~6nh!09Ow`Uk z{gi8ZiT#=gZBM0XRzh5BWcmM`sj$dXZILbewSk=3tD^0rw?sQcuah_XfbLT_MmziK z9Gb31^ccjnfoAGU^WNra+mZgzx#}X=JIV5%pzETLQ#A4??6e10_a)7@o5f#7Ydube zZ;~w#DxbDn!Oyc{_ma`T)2Hc*eYDSJ$Y?K1^SunQog^+tWmKrlAHe$ySwBau^fFkD zYpsbpVAJk=x9jjXm*6_eW225iVn=1){0W_%hWDt(%3cGP^x~b~=?ca{CQGqUYj{Ij zS>)C2%ij7?nOB9DP_F|0I`21QprYmjGQkxhc?SyA9jpOSepK<(SsP#SH=2Ql7{?fc@-|T)Kp(A@3^UPZ=yel ze&Zew+0*SV`}Euxz1{CyqrL5Q{F;tm3-ri-FS;zc$X+6QqCeSRqBvR@&5o6`>q_-l zek>6^68%2^m zCe+ci&ag%m>AF%lgpe89#K_d}cRsGCQpN|WlJS2+m0pUb`;PY8#=8m(z#N>;02sG? z@n0ljDgJa4Pv!wQ<{>EKVcozUhj+(&Z#*w%lv=LoyyZAFHH1fxlRpo$TMI(8;Up-3yNNf@9A2*HRw&2mWV^&m_{N z;je4ipMJ2{WY*+8bN>kr;(dN#sI%SV@7Mg_ozBw`1}pFQKhc=$VDvF`%WZT_D;*QB zqG2Y`Gt+66ee7E?8LtlE58*M)=0$F#SN@ena5)>_ndA;LvSavNp|am39@@z@wzj5jfD~`S5{|?ZE^}>%ScMdvei|SCayI2*7VS+oY8_tS z1NbNOFP+0%dxU-I!y~@btVQJJg>H%S9OWKk*-8G@g|KMa75{~kJkuD~v38p{UpwO) zvU!8&(vr_}hp`SG!hNo45M0}l|8s^Aon+Hpeg)m0AlgF@kp}Kblerh_q zd>C5z%;#2T7~#-M=11>s$GsmjUr~O2V9f%LaJ_ZV6~8dfcur&;dRP@5Sn0;B{%KY~ zMCRjO$J*c+Z(=DIIcs1dL%io5(!a>_YoFNfxW(@0^bB8crqvU=JKe*7SO{MPR2g(s z=*?4GY`7txrg|o}SK03~*ns^s+xt-MAn4#cM+qG#4mfAvreEeoJVTcIyVLHNt+3<8 zm(G@LWnOI!kK|8Jq_ZF3b&nI@e*^;%(8oZm>{UJy{Ql-X*M>Y*$}qU4GaVDppoPy6 zqxcKg92n<+jZfI0FjPW^{jgthrs1R_ob~@!VGT2R7CtLlTtKcurEeErZ|Hf^nLpE$ zlw5C)uOrQ&Z(viOXejR_RQs3Y6P@p!3w`oda(50s>}>Mig1mJ0{gAgl#hAY2F;%|g z6v**ab2^pX8BC`CA4k^!UPszShu2JQoZ6{vbBnEQ+wIo2&8@w)ZMUgX+lZ5kvHp|) zxlg*?HqE^=^UXK!d)|XN|3CXV9$GoxX`OLAL-9PBg5#WvE-eQK+y=b!7WVSP=wUYi zJ=zW|U?c9tNjL{}a5bv}$0-cL5aP-4u*xi|ywJuHdcU@I`od3deFXP%F%H3#4M=l^Y(c#f~V0kbQL-3gNoSEvw;Yn1g>%bN4XQ9V-?lCY5LFd&C=7h-gev?ZJBK{s6+@p>WKZ- zXWUEv6Ec-kh0nr&@+jG=?om%8gJ+?#L~Wur)gBwK$PTQ>GQu^?dmyTFIPbaRS#2w3 zZc9$oOUnB>A7=__p z7?Gt`kS_@fIV1Qs7|UJZ`%6eOBpaCu+RwPsyxk((MA{-Jdn>zY*%O%^g_YvxI z<+ux>>0BxCv%Fm`VDP9N=v8eElYr%ixtBEU+WR;>%C%uefGOX(z@0@o% zTfOtVR?jWxIY(}5oaqHM-jJ2=qFMOO)d*GKM~Pdc5o&LJ$^UnF@FVp%$Om)Fr^N(u zCQ=S+D`T|{MmusVJsCNU5Q{(WfBs_9dQMC-q_48P%^4%2WA|yhE9egyr`}68VvC$0nOXX20d8rJW_q zT)MA#cKw4o02v{i^hfd`0WVUisLWB)6;e&XuOF1E$_;syyhI)-pOn`r zzmX8OLtCN`fnH$-*%?VwotUf4BW4(Tik-%uWb!lbDVbD6o>+tRWjm)_t zT2<5**Nu+g*^Q+}(6^XaR%FfQ*QVv>GUi>T8SHpwFIA4*VK{WF)=wR*G*S-A&*Y8B zoo~rl+?2B#x zS#w#ou^Z?WuqxQ&o}WUvg!9$`a}- zH657@%itN|`@ec)r5=yn`LfX$XxnRYH8mEwg@@Q@rYOr>OIPbm+Xb6uEpHoQy=l&8 zG6OjIYFyC%Q_m^g<$7|Wyhz?Ezf~&ZdPM+FH~`$TB)m|Xpc4C|x5d8Nn`i`u-yZ5U z&9e8{ho(4-WGQA1S>Ia6SSMTNnj=h`>CH$ltgih)VqFnA1<6`N!>M?PL>7Z_M?q=d9IjZ*8k=zpcwGyy+GbB>yoY zwRiFy>Akp2JSWbRx*=WUgVI^6p^pQ`wjNz;56z{uM4m)xtN=}Yt<5kl6A4rU#$kGD zo@Gt22kcE8I~*k)S++XX9_Fh|S#pSeUg;&(7bITb%L@I)3@MjVU$tmnbmZT`9+|JM zQ4Ywtw{Z24ONN5D1ba~i_$?FAifkD32|aSsh{G}Ymr_ypINb$cKN*J!{zW> z;cLCIp6iYWmRIZ?a=KPist0 zR;(%?RLdKMXouyvE#z7d_Qlsca#v*Q2sTV`C)>xF1Jo?Nvz*0=0c$|ZiVOS;G1msU zhqi(E3(TXJ4;ryWie0R~W1a*ay%(?76Ja5BaME;C=87cWHdwV*k zSX(g@jIDANzG2{6R-UX*nLYi>LkEN;<)+>foTM145Sd@UszgX1x#z)+ft7*VfybeK zf>o(#Ol8_xqMWK{VuTubC2C1zldzL+t8F{mfoP(X7petDWOd6dlxfN;AFL*Hm!plm z)F=8K-JUK$M(MNV*~0kH6n{;BW&bDt_)whaP|K5Hrf;@1SKaU^7*;pO&+Fl)ZI79N zaab7FWiythU&vIl%5yWMe^e8>lS-yZx*pldXsL`5b927}H?luw&+?}PG_JFB zR(nM)GCj15t}0>2eG?)sg!l9KTz9N1sV91EC7#O_aApn76w^y&W%whx6>^;Z59MOA zm?7+VD$Tf|R+J`lV}qCcjr;`z%|gY6hjO^lmnmZjIUafX`NW9Fk)0y?hP8K>v{9zM z#5%R6NQOT7^JSmS8tiWrOyXZDEA(YlZ>ANyjoCrfCT^(nB$~e%j17$S_X()M3c?<_ zhw+Q9Z>i*5>dE#Ei@XqZGV*s=)36qfmX_JfDt(jkonIPi6Ws2v9%{km5-V$ajm0#_ z3^mE@1iAs~)bGeA`GX-bFxf8!s)jWFx3pNFOEokRcC-6I*dyQhh_Alm-Z7r<4zJ}5 zbIBmpbb$|j4(!L!^Op^AD(-$Hd@uCw>q&vaAjo*tumrDXm@=uoITx11Ak)Yr8( z`A-pLWWQe{6-!tJtCB zHGP&sinaNHq1ByRxCN>ur2$Il4G)a48r@9f<&^fXlbB}Fl?rRxqxnjw0nPq-!YQQ>}CR8V)mp(yl zqFj^8;}wHM(}8kdWw*j9Gu0Z%T5F@)vGe?pv*p^#CS;LT)Zh~jw%Hl-DaA0O*%$0K z(-zYu(|*%PQ*TplwiQFud&u#`O?{$P7m1#glz@CiwkSoEwaN}WwU?^nk9SO3vNO@k*o3pyT}xG$t1Z=VwYW;DRn%x)?`CRs{MkpfI5_g< za{Qc($;5bMPZp;Q`T|o8^_9p5@x(pOHf5JEX>?)QMHM5<5Ce^sIJTZznD!mnZm(2B z4IqaxuVw<@zL-`Sufv)PPuPa&yvl6`Zqm;X~>RaXR{;m%Ezu|-XfcNHnoj> z4&F$0;}Wpn5AYZI2j^}n>L`y+V4lHZmZWQb;J5?9f{8~DG79L$TCyszuHkf5<}h=S zdCP2M>M>8~!SoR7G6@Gl@Fd0~AD|Jg@)`A=nxZzwXWaq}na5Ac4K!vfoaFZcZETv; z)f45(Ayg8TNY}u6{F^<8HJF~ck#SW@wW>+TX(QEn=t0VA z!|}O1KzJ6zd9Db0>{#Hiv&nW;G)*EKuPQr*HINi}mmSLxI3a`F%Pw%ktsh)n4dYN9sLxI+}66PPll)kr-q zY@KQ?k4(+d=5SL>1_-q=PG79%Q?4Sf?=&*Nnqp6QjI8YD%2j0J^+HY4POXPbhvKNk z;9L(6hgtMO=3k~CyN7MTK4DHWH1n3qP30jE8vh_~c?|lzj>;*yEo!gk%3kzn6!`Yf zwQoSt-9&C6k1CZ$_hsLjW%C2eI$J?ov~7lUhh>xLG(DZ%tX+|xihKDLTpn&Bm%+8+ zP2vu*hLk0%@?PZ@`o*JKs~rBl@q)ZTr80@;wpPJT*;hGa$17{NZIpR3J&1g(o|7{9 znxTrJq`-yX(a=}!n-CKF$#s-!Y6(qK!~XAm24`^`&lBndGs*nG`puE#%(nM-*Ktg? zW?7pu*NOSsdT}*ZHZaP+BD+j>JUY54{)6b3UMk(xy_h^a(+U|aFdeuKwa`1Njp?DK zi+#G|lPkZwi)(~yx&5suLe!99j zI1{wd%3s{p?1q^?(k7&*Wl-6%K^MPYET(KxUuacuR^7-TJF4~2-Nq0yNdL4=whwZb zhdbROhnC|bAF+A0qCMK`V9G~6BKS3HO zPL-<|<<*c@+gPB^(MCcc($3gG*D{TAn7x<6HpbkHz8JGIZbn2@cwJXK)0ns^nEksm zYor`VO-w17J}`TK_6`1lP+B~x&Xd$tB~%&W)+aie1nhEET#YHLMb)z5N-e{M#r^oFTz zGCpOeWM%MIL{6~jn{X%hH;!TwmyP+EM+bL`xochJQrthHW=2KFtcrgandwXRt~Sl5 z_bUB@)3UCmhf)rubjkdau_^n8P>t&=4b=kDXQa}7ReED`*GosX3_Z&9$kD_d2uq31 zj4U5}E%tc$+wk9xo^&cPR4C#{63|qsN&trI+Mj0`B)UNob7;pGL;V&#Rshaxi(5Eba=Ka*CDOWQ`Wcsrz3pcqt z!dLY+kQblcLRqR+#^gIMA=8B|2c1LQyCNz?{}tUc{&q~Bh>gC1_72Q1qXVyH56#$@ zb}xBB+Ud-i8R@~Ae6dh*B@y|UQ?O^2 z!2Y!9scES($$K*_S*x=KaBD(y_##q_=#hU*olr{_Q1cO|s5h3T&JnJMk$s|SMNiJP zC0dDm;}dKjOht{wLeo%{3@$@Uf0#DYpVxmrcuuInSC%TsO{A8}cDaYrLmj1EBW^P; z^cNsG?k7d-!Xd1Zbr$bGJ*?gjyEOnN? z$&Hb{Ia}4WWn=-f$KJ`26?Q11O~j>`kI@ApvchjUtD7g2pXEh-q`zzynf)-MmcM@R zPM|w~kx$`ENV&y&(kAJnm;v0Zp?;ojX=!hBxgUgY@*Rtein$f(4`1e4Wvk49^&~wC zC1;Jvo}RruiwQ=BCWIF85BY0CRq>V37*+c(ky2VKC5?OZHPc#adsiFp@bHhm9}$mz zNuF8Gi)NkTHeUpOgFlQUGFD9yAt z4YDqF&Tv(CkMo$_*X%c_4t~XPEiUWjC{9*nqKSgLNEElVa zN5zxk3;g@P#mQm?Bm{Ssr>HCS8e{=_5gTjiXx(Yc?`UqHViPUvOke4E@`+wiEi6xw zric#l4iaBa2_e3YFi)@weT99(6=9orK~$xhcpjH9>fw3*n8^q9=&EI{RklvB9<($w zk6@S3&B@V*S3j#>SH8%7^F{2=rcbBo20n42hZa%I(|J<-#R!c+ILJR~{xMilQiq zlcmz~dwHZ%5YNGj+5o*05Uir)dsO|4nGU9p=G~U2wx_nOw(Zsv7P~ouwb52`sPRF& zt+Z6;%T=XPKm_;U)BKiB%9oH9yHLrGT>Cs)VK86@64S|5bUHKN)WmYj%Gj=0S=&5R zI?-%h`V3LRSd1f*v2k1*P2x@SIN?PC9IcQ~6m;_Z!WndU9bc&a0jPj9at zL$2~r`L=Xa9*$~sn7l+eBbQL7D#^-3HCfwj%qCCJ^-Mp^<85;tFPstXY*#neHb*(z zLUSV1gAD0Iw7JSnxj5dtr+h(vE4Nk(DXjV&(}zi_SL>-J=^MbI@Rh!om%4zL*=B=S`&#d{IBDeyyodnxvTm>;dzB z+X%-bSCV^{r+{a$({68TK1glX@5?I$F0?bWBUmkTI`lL2f!o376V3{^#B0bV4p&HR zv{996!xS?Wvo~|JbzSr}^S1Qlaog?T=1CNkWO60`Ot5d@N1%N`2o&SShK6t<{s}i- zI3unU^2#1{fCdgLJ%Alx`(xkf?BG4)N$@;!^|6&SwIGkHa0MTe7QXKMn+gJ%by#?R-7HwAe8ylzCw{u^Q@GtsO%|OMFMXELxahorrbEblF(5sg1)4^ZlU&=_L~#!#k~1F z*L~%peupja&G6i{Of>n7FXAA6ZT6b1Tv@X-KWC52J`tE5{1AB0&E_(>d{Q0Bs?Ib% z(nrkwE!#Z}ysg77$IOV3eCs1$JA&4?tV5;cb0IzZZg#1xDF5zk*-_aU^CC&Z~@N%gAUfazg=YT4-Zc`N$z#wih~z>4I=MkUOw2m=?&(J>qBJYGsQ3rN5*GQX_f09Iq`Rs-g=nX7hMnyT14? zM5Tspipb}^Z<%avZfp~u@TCHUvvvPNe~aLF?kLak=Y`hdHz8IWAa#@;D;tcVbQ@N( zgt-g2_lEx!RXm*XwefDYM40jzON2k6%KpZg9kX|5U-35%-Q`O00|h5Oe-&{Sa;O%@LDi-eoPV?MvoOxS|CKnLOuJ)K@*U*#O*ii~&>ZVEdZ_Rikk?4@=q$-=te z$iTvYEl`%L!0+Y5q~2nGF;>bFvV>;hVyUXKQm;pUp)Q&`IR7}-du_ft-XY$z&gvGH zVf8uk1-?S47FP{BR0XjmDxFtSLrewFO1<$^DOQDL3WRGnH9lVN?}^#2Ru9IUwItKFG1^TqPtAQ$+a*^4!z3GQdKz>1^{_Ye)NH z=M85uXB#_bX=K_&MG)=uA?j46E$~cIaVs5^^>P>af!tCqkEdT(`I9_X`K;d7p(Upz z^lya4V(nw=X!~J}wH7l6*f^#&wTmoCtOH9i1azmR`cPS++y*|HA-|Htly*vnl8)!z zQAj(FQEi!$m~b63AF@oejeWb`HHNQDNSv}^zpFPO6`D|CV^D? z?b2Q89xCCbax3L8H5U9sO;?OzRsO*k5!{>M9Y`pJ;>C zF3L3dyOboolwL~_sC6#MN%BYKpjuk%r=K%k639uXGuUMF6^qkW$d+i$W1VPDWy6_# z)D+^9UPGhQOgwXsN=v2n(oE?T*8f4N5++F_mG??9ZH^vB6r=9Z32Yf0#}$joTGDdT z{Dgf+SEdq;mij)mmQqh1B;6JNMeP?R?GWA42I&qe#+Pyes`*2@oqR-<1`d4J9APVI zyJ~x9n`s?nX=?gOD`YNAV81Gdfg^R1QpMBaU2&{b8OJghNYpCjqxxP88N0{_bh_z- zxvTY#eTTiN!e+nE42~62(N`wc=y&4D<8({a;p2ZM13+j zlTKmJS*Ba&IPW&oKE{%ODdC_YNq#BI?46K)xuF>fUr@VDejgAqMB)_EK$Z| z(z{o0LiT1>n}%4|+kQd{aMA5_mv^1B_p(%BUSZO)KuQx%^L_auLP?>vxLeGJ3gj!+ z;ZY@39;&3Gv+F^3Fds2*wJmY3aD8>RcAv-2+sAx?K5V4RrNyIsCf9+x!Iu|{i*=+? zK)|}7irOusFOxmmBfS_k*D}J=!+zc^x!!xjJhfe?9SU27%B%Mhzw+^1NiKlroC7QH zhO8?;QI(#RKABoM|C|$T(KOOAkB| zodGfURM;mUkn5{9^s)`41;Rw(J2zY4+`w+uAL&b3KCtX5N7>b3ysO7M$Z1`pGt?+bD1LrGi zW#Xl}Ot|iE5ZH*0tul8)sHr_s_iGRJb?R<;jpz|(@cnt0tZC_{pk=O1kba6xD%EK_D0 zH!Q7f1#DfyGQ*05%?zvW`r!D79i{bFvP07X+X8EYz4^vMUKRfG`b#j{&S(eaKLRi0 z$J$GiH|PV+9W4v3|_octlwEf^F0H#DBdyhv>T_k&U3 zO&!$|<)%^|X_CN73zWmeaW;(^YQ63Bx`OT&u4ayqbsp7FZz8Ybm{76c-cW9w+c`=p zaI$;CHRqeURPHE|Vj{m%m?`a4zma+9NVdH7maUh=<)~=;ZYj=08Ilqd`g7YuQCvfQ zwNOCLqjKsRr23ZEB<$ERa&7S+akJ!?r)y)${PbgHwK>I_V%uU%x4y9KVZW1wjiKs& zd9c(;s*2vEIJ%;L!7WF%1`f$+++CfddQz5jOkSxndK3{uZA4$Y&2-aT#j@7yF!#lj zFqx`GHio-hGSn#j^=HT?7_0`B5!f%%q_24H-IGM=1$xObz+UbET`mc)`c`y7<}puZ(C^Qs7(P}k1rON`+}8?p%X zj`~ICV#7_P&2P6`;UtsK5z07Ls2 zn1wUJ>C90w#XvRiM^6G9w-`8_X~s|}uSP>nm7j9pbrD?lbZ}e0fu)xY-Nzzakxozw zjlyJWAzTyQLz{93Z17u9g51HM?<@^865tdI0KAP1H9rCFw^>j-4Q=_m4&$XloCG32y^4vm^Na6LGdT;X`M~rSp?|srZ-v>= zOdbJi{3kfMpD`c(L_|U-G#1SLo6sCR!_4Idrkm&S%F)dBfM*8@y=zYD)%yRl7Kehr zn4{_KinBTaJkf>VXqUrh-Ga2s@1z1R+nj{xrQiidk!d&!W56UXf@8=7UTg|@e8<2G z%~8taDA{*|*&Kuyz;y7t3FsRB0f&7mIN}9KKhAwMow!S4psqYhkw%faf2@n`GzU@QFSMnQeV})8qj5JD(1OOph!y92ExH?4OG}Q4MksouZ>1;-DT9q z`nISJt&}{WRF*CG^KQicGjhCF)4Vg)+hobyzK2QxaEq zDRdD|sD+*y>xd*{38Cue$z?<;G-uVR@>l^m+KIg2pB9CJ;Vn_hXbFWytWk$7PaL2) zOsHFfIqS~xqXUQYx4xKqL>!?fV0s%*ts+KKo2Z9mkSa`vQ96}IyrA541@M_XbXQ8I zJYZ;j!Fux(O2hX+jIQuoIFz(*$o`z3(zO6#;+W_A8+E` zNH@}O-!#Q}>JLA-N6--!#vF1fv^NRhWrx5%-D%W=Po82dCVD`b(1}D=CK&^UcTTFw zW^yW+O=hAg*wT0P+Qw|X75q`B=s67LzF5IQeKokj?V(Oqp=D}<-TFBGTO3-1mBt5R zH1@SrT)V|s7gOQ$WQRvW9%2tT`@g|i?t{sCHoVM+B06y>G$n)ZS&tbjv66$huLylG zJW4F z6XlFr#5?dHoY0Z{N7OkR&XZq=eb5X2A?H&B z(Gxqtal%PnF;0__lo?kc#dt>epc86D&L>8|12PIO`<-!*FC_2d%07n&qz!w>FL*I@ zqMi^3pn+73cVq&w5!a|2@h?@2N+Ju=L&(!~CU^Av(m+JbJRAT&UQsW5T}HJLsJ z)zDiYs|Trm#9i_daf$4NHTwWQW$oY*R0+C!sI;leRCls0T?|Z-@6;D48CyetvYI+c zW>9(PHRRt^S5yXhv8sm>4ar_e#O+1p0|BsRra1BNy2e*Jv-;x<9GWGWx?~@t=A)O5gno9Yyf>pvR;`eNwvZ8rBRECSq4;&L@7Fn zGSkUqF8U5p1WJQDq?0~MJOcK40ZfxW2umGT!r^<0-pr^$Wq}bikac6`KAycvl_KYX?NHEsjU7inGbU2t^T)KUW^dx3w@=F$}8zLI`P5ETy?3wi18!F@<-~HrZSH{(Ek{YOLz9DfLM-1XloVVVdMmzA4dV!Q=IKO3(-mj^ zaBp-<#0SR}b`N#Xe86_yT8^zpdNou)$}jH|k8p{?UrHFcm9aURMpVib7X6>IvoTN8>3WvGEIX(eeV+D9d>FW% zJ&rr6E;cAt5Ow|}KQ{O<>q_>t(0uN`7~;C{RrpWhC?$nnV>#$bk6avkAd+!RFp|_L z#%rl$`9odTuW0v_j(os>B6vx$lFNx$#Ub?Jhlcj~cVznmPsLA4iZqPRjUH%`c9!aI ztKps(l@vEUs;#{zu~V5yoiHDNXqzt4En;W@DL^O=6o9kXgam#T1n>>VgXjx=iY#m3}(#+BrzBF%Aj_4og^YlOD zN0k$*aDm{q;1RAAj;pP>oPQK5!Icv$>h;+-_C)W^h`KS)A{)BO(F8bAEOXtm*y?3V z>qn%5!WZs`m?_5)oAfi`HS}b{`c|H%PUGA^be4vpP&WfErx^1Beu-glYx81zv}i@MDB$ z;xy@%+(Ah&e9Sn9>gya^A^ui0>-xkD(cfs>=x!#%OtQlatMW>?&2Pp1Iop7S9n-I^ zVk_|?{~(a!FXw;dAH>^*2Veu9QC{l@$xY;JnIQWsLGf zDl60t_Rp@E)h62;C=(jPz2|3(O>l&3u&z#;>bjdo<<0deSKa72j$`x}{WNJaAF*sV z6(R2^vCEzm?}p8+aSc;-6#*+3|r5!HV1p;fF-1VcHyH3eDK~usN|k z^IVK8==;xdoOBa0^m0>Ob1xccRPt@Hfmm0ZC_WZPO0(q_@*CkqXsv&Gc4_~EfD*hA zddRgG1M+AMeGk>jRKS%HaU?z^*Y=oQo};F}P}wzN>Y5T6_FJ?A+K@>rs0ImfdHsF6$+ z({gqL>DJy!hr|qV1!lXi#3ND)`q4t-=TOjZ@~`mU3;2VtL(BNz;$CH+K7<&+ys~Wd zY>n=or(eD&xl(;&9B)kHSP5*#OLP;Xm9h$!O`|Zy)UfA|QJ(?L+%1N4C4x%>2ZAes z@!aQsiW8I!y%f2cSz$iq91`&={&rqVo+?paTn#Ko*rjYmrZ`zby(46C&G`?)9I-uC z#BSw;I$gOTHs+QGDr2H!4!sGjTPT6nHV`Y?pXZv*u%d2u4A@5 z7MFP$<01_C5x*hyG}NA(%AXUwQXfq8j!P#52S)_G0ma`hzyv#nc)o)CQZth!FEr#?W}czc@KS0e=l|5JBMaqrjjRAm|MjE5(bGcgyVc4ZbB$e z=ua>)m=LPSjTTzS3EE{NjA;b%fF~4{r{Zx1jbt<)t`DmJE?P`DR_~_3k@9an>ezIBQLpHXrUB~aVwP0V&S#`M&**Sy41+A3Kq16e+59cnpm>cV^@ z>lh`pwu&PCEqxX*iE+{hXm-xY|0&;8P4nwEA{>cKV<>{&52pNOdIf5*OLQ5AX0Nl4 zOykU%=2n(g7MG=~`91i;Uh0T3TYIZ)l0Qn-BtfL5(NbZ#fYJ(h&?WtjAwWAaf=Z*> z(o^WobafyNe^Kiw2km2yGZWaxrsn4Fs9_eH1yhV^3A2Y-bXE>D>66O^`;EdSJNYwXF4#8 z>5&vewlJP*y})5?BCnL1V-AokUBTV3P93f#=waxP4+0yRq=(_Tehfa-Rgix<8ogg- zIOd0giF=z`MsJ|E(~IcwbQgLTwUG1@d-WDt19ghx1*Tg@d7xYbOS`LH9oo8;z*ug9 z=X(|$>B?%d(p{OR%*UMjyn0e=uGfMWgr68hY1C8tG5rx|HGytHT_FU0pSD(&l%wcj zi=p3r3YMD$hxKUqJJ7`&Q8kz%8LK{7L;#GIap|wk78Jo75~+i3ilY>Kt{U zw%#~Tbi+E#YYMmQw}e}lS})-%#^N*Cm~s?FHZ;C!Kh?JIfoQIFLs#8SYXGd|8MMzU z(D97~@3E3r8~LH{)!bTRbobkcvt%7+fvKz|)tYWSZcDXYx9zi)wXQbbU@OrD$(j0m zJWo19Co~2+sc2|rilA?N4wsy4e9kvu9q(3`KsB`upHTsmzbd#6d)aWy1M7bKF#9F@ zzxF-$%J$;c;ie<>TEeSWP%20i*gfsU{o+)KRu-x;$jz+_hfE$_d#3hIjQ}6y4RFeA zwYk<2>vA&nnrUvnYF%J2V;^qs0(Rt0TS1G?+$PuRN!TX~@-?{<9LrzgGlbVt8gPw9 zdOP^|or9MJqqS4FDx0AgTMN8lyE;u{iDuL*=BoL+b)e&`Bg-+)vCw|cmS`5i0{o_y zkz<7Rp%KAR!Dk^Cze#u}tyStEOFRnBI%BmZs!xfK_e(>hhhlpu{C3NCmEu}^qcR<4 zDr)Ir%d(~0PuUmRPC)B$g&9gFX>a96!UAq(s8DDGcboez9Fsq)xq(~L=tncbAl|J! z!I>Q-^%s8#15qEplUu4+^!d~cc9c2Wdf9%+K|06SC0m-cx48`ilu6q!j}c~ZGqH~j z;;V`a<;j@pyV0SvqE?feG0D2Bc2qt||4PfHbg71%sC?488|BE8bgF5ImA3nw&z!|v z`<$yCw8Lxr+dPqpARFk(@-VRmG*R(lD{U*BK*VJNqD1D7AMZ|#F6sa7-Olz4u zM|q(h)D9RfswVT)G{U;jp5+|tD(><-YdQ-!D}qlIVd_Y4M`yM~9xL4u^8?-OtK8Sl z7+FLK>Jybfm!_=bV`H+O0ba;jrLdY?{iS}=YZ2#32VIE0ZuVNAT3gsRJGMGv9DD57 z?1SuEtq07P*j4mnLe&amf7mJiE5|6a)SxyM*w9!wM@&VJxk1m+27=R*C|i{-;B_ac zC$unhiz~<{^d5GYsi?WT9KP{wn1%&+D&C^UCwjs?Cntnw47kJbV6e&O%qvA4-xqAVjgi#~9D}HVaOkKB zL_7<=W4n;|Fa=)Ot>EiYh)e~xumG5K8R)$kI8i>r*?R!L%PeSJ!k}4i21Wiv_%-|m z&Ak^nv>$-E4uUFPgQnp;KEXox{;dF>wg?Kv6>!nG1zgq#1$|Sf@B71b;5hspz5>}Y z0b6VWcZtF9RH+Yl6%B~m4B!dRq20)bC&^r>MiOu}ifDgpowTvQRM%;nfV-w^`N96( z3cUOq-0KQrTCf0``Va7tW#Dtv3JUTj_>?(GA`juF&1wNhs`(!;9`Ayn0^Xzd32YIe9*F zfho(lW~;FZXF++i7Oq1q99sK8d!K~sV?d*j<1S+cP8^LZO~F$j1E1_2Tx{=SMf`{R z^gO=q!o^||u5Sdc+!|B?#o+Xm1UK>>P#3&~R;oFkYG-k!BJhMOfHU(CoDtT-^g z4e!B`nBDw?uaWqD12`=C;dp)t?ocDJdb+{&X^FN5_w94AAWGxAMq}o)1<&rBIf(}j zAZ77>)u6&ofGZdepY{;`{0~;c8&n@}ux`&_MK8rswL(o2gCqM4jn*r;H~qqwqP5dY zV$yRAeu`H3Gfjgd*ahH)7vRQl5a($&rWsaCc~|Tf=|l9PY$@CR@K&nV>pm+7H|iS1T%tn_~KHO#!>ayzP3}I{ZSL+I>kMTP6@l}*u}{Dd01Ql{*c<5UX110lTt?)I9F*O4va#i))EKb%*r8|bU3#ePC9+LoIY z8X)zS*C_3Qh~HxE)IQuzi`3lm-ca+<9BwBNl`q14xrcg2daQoY4`~XLg=(8?*{(WI zc>71Mjx8G%;n`EU6vm*jHYC+osMF-!WR&QQ9^)!|%_ zo0v@YqoUcoFj||YrvcyC$Cc&^g}!rh#5A!5R6+5|V*MYeX^QK1qM+%XwXmy!yHj{) zUmGO8})^4Y15pQ!-_?WfML`o;<++HN)}V)h1wkWhz(Rjn6Bqh@9VdX zFH}{g4E^1hB4_e*xuHN?sta|Lu6WMA!i@L~P`_gGALTzoC(knPYzdw}p0J3Y;m_T5 zO}h*e91U9%ZE?S>pjPXX9a&{>k;}CoFZ&en!qzNSxu7L z3X8*U6x1KlF z5*?^0ng+w{0q}}mav|Z5@Jj*9RMdE(2 zcHkS&%(owKu5*|6ypL!eHP*9+t)Q*f&mfm$74;G+WJUD4{MX<_&Y~8=yN$8f)`D^XvIG4?>g zyOO#{T_pBNt3wH)=Ypmd(kEdpGelkGuh5`uTcBI$xUfocX{WG*yQF&j4RMvyT(4;y zrEA&Zoy|RKJi2e0uc5mndmr6!Gi0NkLRI;OsIAQuGPx)G6lH)>n_NIoCbPBNQn64< z;7O3@W=p6A^>bPgb(DNfS|In+Xrd6i- zeT8&Um@OuYv*glbHNoGHx=t?A_g0 z!y83fqDO?!be3XUk?_LC#AQ6)gPKp$`aJN{Pe>Egr$&HEU?_a0#K8?+wAX*`{d z(}&q7mPE%E_eAegcWD>vh_^N{jiH+pN%}(d5ByRVOOK`PP%OSypJ8I#5p_W+$h5ks zygVID(Wl}SFa^Ex0;RjQQ|F9P$o}pMuZ|RI2i*}>b1UW`GlaR1x!N809nB^dz`JP? zs?rAVx_F2>0qRgFyQ`^}mG(+kaNZh7YsB*6X`!gNTw;_Y)uGojilIIokNN6AvJrKO za?&27yASH-^FkiDTEpFCU9W#!3QeG&pRh!XdzM*1DLMoq##YeyA;8%6ej*x zky{>1)d%mUKWhIGNX!|INo@&Kf~Qe&jX>3xlh}L-)%krmaTi6s8x2pTg{FsGwiN7wr#zPIWklb%ht% zSU5)I_;`23PiT%K?}ob6zxc6`- zKLX#dW%^=dzQsfBDyWKjRqYL5fQQOQXe)Q4Mkxv=Rei0NRv1e35!!xKzAjX$|DY$k z4sT-;HRd!_%cW6)Pk}opgZ0>)yolpogo*TXQ}Y* zeEokv(rmIfJU;tT4XF;)XRMe))7|J6%fflrK&6_KW3&g|(pxYhw!v5aBi!BY zp@;1ThoSa(D$hb6P#gV6Yy4k#^qdPvV|}>Y7Qt#x(+OiC{-hTA zh6(7eVsSSg$KBT%er*fULwNV51?V#Cqn}T}o^ux{!!=SwPS$(uEw|v;mVm^qWk3KnfZvgm*46=jeV5_cxF0{W zD9%<{bQ*Qxa@QL@+j8)ScTs(Bw)a4|4sO2AjN3`N5?Gy{DEOO?X@I2>L$ z{itEoQ214=VBeLc9>8CE6Il$7uD_7qH4;9sxu~1?{x>A7TdBQRORvE=s}A$=9#}>7 zskU&qegL-8Xn2Fx0spNRT+Z8L&wYcJK_q|;*907~a5#qMWMx-_Yv^UHou6jkce>Njcz38=98tIbIWEIJBiYFiD3fkv5S#y45 zKcr$^K428Y?vn$U&q(fl7d-_3(P1tVk~ahY`X3#aoqUhjS^6&{(}KQ`3Fbw7-5%uR zeWnZW4K#@#UT0UNK=VAjNOpGpi1o2M7JD`fBqjB0D9EZwodT z)8D(6Sp5cJ~YtN=kfiLL;AF&(#brMeMEWQ8k!bs&}KGsTw<@NZnk~&uX zswTjmRafUAlY_`$YJz?gk+rl%oV_@q^i)o?<}OxDsIWxnk{`wnL*G{joR*bU<-Jc85e4(GQQFCh+YXgb`^MXtG%br43O0X8PHxzMOZG-3*Usq3;| z+kT@JT^;(Mr3XAZzD1i}IKf`bw}K$k%0Pi4LQW=*8F4#Ps6ftSmTy~~9St;Mc$myG(R z3tevK-SebltVXeGR~vTsIR)!OHW6Cw3wA6Yy9-ptqON8RQ^D3XK`-gVuu8I~2ZMZ) z%g^BnG{!3>Yid2LjmXqnNvGT%tcl-dW3=2!c)I=Yh*?1v?YYM0%;;3?LnL;}1A3@o zr2s#k&{`Pd;Oo5R8flY~!4d4f>Q^ivL%>wO4bG{y?NYGWhTP}rSjV-@RULNJ-HTOP zXB99H>)~1vYH7++O_SEU-xH!O*ZY}6<@d@cM*(-AKrLD0G~vnLIsa&JiIerCr^6mC`L+Hpg={4OTIOdP&jDzuuRguilYVVN4}oue{X(9ks_=Xf7jrcnKcLa`sPo zYtDvCj+9Tsw^gBU<~wrOijW^yT&^yavczg^j1;XUBlRaph10ttWZ~aBP5)L(i#wq`%@u&8;u?`g=Yk%}x4B=10qf zfB)+Ko0rgu+RolY!86;|xxV=o3kglRB2Ds?rTs#!E1n77(&k6wr>Ay8-+$@6ZLB-W z1@)a0tu#`)Nqvm;i8=m+{|WuqHfgu#s3)D4L60G`Y#h2$aHe^%FfXtcMb*ra(SV*vMd;ph zKx(7bbkuYw_)iLa8nPq#jpS!Sn)`iJkBDkTrJ?R3ii{{@W-EflgS;G08N-qStz z5gB$-i8&JbC8$Z7=an{*&;24N@P$;-DrLlI5#A?c|4-F!QTu()njod1zxEd89yQyA zou!FWy$#u#EPb-BA+P=4Is4i_$VpZieRk5e1mo{MYHItD?eSQzPlwlN809V2EJM;O z)BWH%mF15;H@#s*huGa+&Y>Q&?R5nB^$l1ZbTPPD@Y%q4zm?8S_LS;3>7Q}dyD8~e zVp3u^&unj$zL-oq>iCtda(n5n(O7TqE$nepVSdkhUE8edMoMzod&_B~ZE7hjxR(j*GmeG63Q`H;e zJ+DpEt5J*9)Y8zS4(pULRWC_w=@_f@o#!(3QoHobW=lBuMaX|EwV8bl^<{2YKJSQ;UIN@`vp{Dam9wZ;*~#*YWW?QVAa8?d`ormiS4sBu(BvP-?I#?W2Kv{!I+bl4pA?H6n_ZR6A}%4_L|xy6{Kr@$XLMX!{4Mk_plX?Sd= zo=M-VS)x+IJIB+Kj+=9}K6~m2;r8rqkbX z$MzOZbPBzG=5w~YdK5A3y7bg6L{wxQIp-5K4_(jBd3ShQQ8&Mrjz?$dVi{nj0tHN$ zCn~kniMA5lkV8XgjN9mqwd^MeI?lq@|$-@~`&^>&2wMRB=tw z3TfNC8MKYwIJ#hj(1WHgJ8o<$NBIMX@rIg;$*#1Y$(&AS1s(vh*;L2iGrR*?<>rS$)}Te~3{v2$G!phP_TCbef*d zScP=$wuZ`=$u`Mkk9MTOqHge;M(@CKt_IHk>}%<>n8hrhH}~!&2lJTcn`f%Gj&@X^ zL?^!X##hd|ORugw^p{*`AMGlYw)5yIFpF+~-K>(z5%~4Bj-Sp-?oEEH{bstSJ7vdi zTXxkUlfO*nL3T1a-+A(rC3c)l72W6yhDvW1H`cKC#|=gxTHBz-k%1#28z;@W)(!H^ zYuJA~F1rr-Z3_4hxFN7%Kn_36nP7L={FSBFYyB*JfNO!E&*`1$a>q^(RwTA_g%x3v zEyy`jQ-S&0+k_EL!MLnN6Lhc|%fYt7j&IKM?xp@~13m=I@*nTIV-HvJ$fd0fdXP6D zDRW{d8CY|)7xX|IO;yiOYFxUR7xmOy3r`a=`8uMdr+AiA=X_E>ZTvMCN!jTuan9xM z?+wTplp*MEz)1H6dl`7rqs9d-qo+h-nuLi7*^`cX+vpyuR<47aEbF`}8S&o6p2(!< zNma;PzW&Wj zXM{Q4;`(LkAA7>MRHgfh+xtDyP6g(?r2d}n-tOcPn0iBefWFc;dA_Z&bBW)pfK|co zLZawf@xyPqSqklN_ko&7EQ>3l}zE?puZtzAh1+(Yq8Ns>+HFim?rUgVp7rw z?^i83yP*#@r&+0}=gn;2<4oq)FW^Ve#L&md@+K=Ae9X_~xTnNPU%+5t)F##W?jA_~r{fbc$ zp1YjYSz1lsxzF|-u5iC*0ZMR|(1)S9Lly-5btb6yr77kwazlE1$|t2vn(1kzH?dyH z71hdWaizZW#Td$+2PK_LJd$+PQ&1~Q>sz!&?l*crkVwr zpIcTfGmU=M^Dl8o!mfWYWI8@i-0c~l-N5_l&8|EPIO`&1x~-cdv+JIFy?8QYdn>-N+M7-3jMm)42zY2b>TQcwIbdF)GW{4eMXl6Ywg~$m$3|j;E&R6zq-U+y z_dDqfwwF+@S>%{`OL|fyIg*T|%ie-UE~;d<&`sZhQ*EIKYK^^aZvpQEI>v|K`SwH$ zERj2qp}16SPyK#PM~ripyQ=@FfS&TRaI(+8SS z?7jE{#-y&<)aZoO&w?GyuI<%Y>m|uUo60IGLZtPPJd8}B9Jc=U=Z=!DOzz(92zNj7 z6u;RU*fuEBrDf(Ny*iPyD&7sOz#;kw^5V`@pHv(lYBEviy2eT0{zg~yH0$h+&tneUl9 z;T|@~bCs!T3EORYyx!p4&+W7AFKj`!wCZ!v*g~rdRo$y~fBm|4hAO!l%wHR#w4(&PJkM@wIlNV1ejQ!QN%Wah3^9&_>9V%fcFGCSSQ3bk`5h&s*_KK6 zN@e^uKT{^lB9y(>t{V&S!qbo)IfA~R^YQW7$(Oli5?lANM@>K0o` zMt7-wg8c_Mr%Tls<&6A^44(jO(-$L}NN;Z{59bjT8BF#>F2fBLTB+NVux**T0}|9#oZOTefk&h%?j<6R*+8h z8^A#0^dj_teWx8J7xlRoNaxY5cxWTpEvp;*;dEx+QptgegZ{MX?d=>joR^$)or@g7 z_8IC!d6e`EcBqQ3^zjs?yFzKC>7V|R9{cI^1nnZ7e@Bw1HbZ-)wWqt+QdZna zswMlt+f}2AEv0Rx4VE-*WdA=Wcs*^@U06+D zskC}RN68_^3HnOiCW>Qe7xc5nR~Vv|?06wq#-3DuomczYhd3L#Kl}x z(D`)^JxV6)ugPPa&aRMu>5rQh&O3yP)WcG0CA1*!OGRah{)^_T)NuhPxOK)A?5)MGWW?7A=qU zO4^|`pzh$fE7C7M@Mutd|59|L*r`22cjvUa8rwWolgcI?@VwC?*{2}J++jsgIqK0X zdUuk4UY~BG^YzDCZSsKo(QO>&`5{WDzYxI*?;EnZc zB6qiswi1mNM?dZLdQ&Zn{y>kh%F2l_ZWrl*|I&8LG20yxkTz(We`Uu#?(-=9{x88H zO*T?$^SpL+-*2O$wNf^e1m&)@%CKqAye;WXn%=mE^xmZg*<~bX{q_CESF0gB{4`PH zE%&hfa};y$_iGXu9oWY`N}XiXq7%|fxrvfVs-aiaQgXEm$gFrHcTyXu+ms4cKXwO6 zrmfc3pnC=oB?+R&dI$Y`bt9bfwxULOCi}!}Q0CcJIE(r{@P8I~!2Mm7&7)cxGd-x# zfF1ecJ>#9>eXaE}Mq7c3TS+BXHYd;%rm;7pCbZ8&x@>neM4y_U+GpxpQp*?EN2olp zqN6a?JMCLsvfmQg1e~`|kv?k)+6`+X8HKvBfj&63IkOk!Dog3$l}k$9*=;4Kw-~hu zF7lI>Q0u+b=l~W-uXWb9lZzqtqOlQGsH?=={yK8GhxrW-sON60vSXn4x1IqzG2Z$~ zo^pa`w#Vyjq!%=Q!PI}0ikKtuoSw4J$sIj84BU`d0t+<}1klq+V=a_w6Vv`nbmO*K)jrGl*)`GcsVh`nXV%fu8+)Xk*tS*1 zQtwRfZts734Ks~Y6`S2k882-$7UM7e(D%T-Y=qU$P1NKhkslAM@_^EU-W%)4XRdDB zr#_(`x3ap*wuDaPmDH409%@{3nJLg=L(Ds@s=e?JsffvDf`N^M<<4%F=I+aqMYx1$ zUrSi-IdIkMiN>w6Mxu|WDZ7-;$|Yr!`p7=onc7{^)l7Y4Y5I8ciCjQ^q@1$?jYHT4 zNM(BGSV$Roqe1A zqPh!D^rg3x(T&W#_R?X!ptrF1j@APXxe82vAbsBRSS!GJ`HclsB7eodC_$uQ3z5)w z^t1m9C;uJ0S=G8i1nVU`IqyR2He&Cx8^lm&k|UX&2+Rn$=y+nmi`Xr39o%#)cH=H- z?Iv2Cg5DydjDl#gc;?EFNcvlmn_3^SJQ>vgQl^jnx?-jZM0_L9dPZ40FP`ZcAF z{MAfv?A6N|^T1plGU3Z=7wEn8KA`3#_Dc$&N@Kb?l9jese{XCD4gN9NA&;odYIMsL z`lF9kj;dYA756GO5 zO^mcMvC_KAZ}uEcBd_6qC#`U6B)JbETyHRvvJXj=;0ko}0Uh@7x#i#NEKnVcRm}EB zjZjxBE@h1TmQD#Ztw{3@T#V4|rMcqi+E((#9_ibRp=8YVBO-i-Xnh;jT|IV!d;w4V zo{FWL*n$4=EvF5qk)$=$3ghkMK(`FhM^YhF8f&-QoKF0^7BP)Q_-J))qtriiV9Tn1 z@cCMW%maE!Z`Y)6)W`NAbEvuQ(OlXSDzox{^gWDYI%%U^9IW}5-1=W?oHW@SWW!Fl=V{#twQU3#A-dg43{$jZB;EvK*YH{}(5;|thh9XlPDZPVlc zGYl+yL#nQnR5D7B$-T;HNc8q!CD|=M;~q#aBiTW_klt$S_m#?gL&eb%DTcTj85zV8 z%E|YM566<eXm5kHDywB2Mvbu#~fmHWX_j{tjTm$wm@s!1#?7nte*=(aI^ z7ZzIOkck6ELFtIn)t01ukVDwBsfZeH-|Sdpf2~}x&X9|}mt40)@@Q!ndNp;Bv;dx7~WB0)zgWO zS=K80Fnm)UsRL|D>|wIjk;nPN@z-9TtiikTe)b{Hr7V!g(M2FXbzvee*#Hy0H_vcX zCWj&x{yRBcftuP@;}I8hMA+x5fl6`0_l=3tefmpPSOnmeHRIqd0P)>xtU)3YN1 z^DPHmjs7aT)RDI0>?TmdKERe$HHhE8Atv8i8ezS~D~-jAbL%to(cta0bZ06BOT3%x zGdJ<(wtV)V?XEqIqp^LT`axbNb>u#SiD^%=jvHR>i+7s$qPL({o!v>+c)L)m*-aa# zx1`>A2Ru_(#ciu$e_-!Tw>eY(M+Uu%{WLdQmbt*#tJS4){H3Rk_cfhkW4(>w>F;|J zupz_D?(Cv>f_@CmZA0vz*-ar2ds3Z}!=$3DsGsa^e8lLkLne8acy4*R!Rx>Bj`Nxz z^PAq5dJ3Xz8DVtqs}1ab(F^6>M>y8FZa4XB-r{hsH7+()CIQP_RsV}KJ0qp%EZ{cw&hpUX0{xiJ(to^+=zOO&(?eOQIq4)*Pp!*dB8?o`oM~N?T-9AAsRf;E z+XCi%${9LXhOtv`M{e*J&lxI^(|BunTacmMSSzBFg+ZT;NMFf|Fzajqzr z>U!+RXJ4!aD0$^EWK_I2qd=4=yvyj`*phBu8lA#)xbK4Am)?Kc5aN=9=vb0RU2LmD z7sz7n@9xL$g|2+g8Po{PQsdD1(L_y}8E5If=%oK*I&T(lYPv6ermxr-Z)&ZtPS<<- z_heD(tF3Ld*a^pL-^*SmPswb&qh?aeDM9i{YZ?)v^TdYUpb6&^cet$uu=dy($_ykQ zu(CWs82}IBXTNXn;8^6?Lz1HuZ?+)?&R@mM?+WDv|HlfU1KJa%UKmW@K3;vv#oq_cb!;K2hU2j~yFh z$WO@+_H~<`sgdeMPqN8GT1U${$tYSuK8uGO&(lgNWi5GXN66_pg->{ide*B{t||0T zdc(djD*j&~cBt4w%%T?=gdt=c+-5Y!k}vj$%q2IK3-ht3zsPpTX&o?2VEtMdsfm4T z)OVu!#}YvqjKBAl8q(>;CnFhECUe;{Ix}?_iB?rApax*8%dzL^C(v39IY6P@$0V+} zDw&5>$!4+9;p>M%?@6N=pC#5p-r_xSBr1~Ia2>|(BROyP$urtOHbZH$_U_ZyY8jbj zr(r{`@LdbJ?nPuL+@~wqdu)xxSY&3`(mdq0Wd)sy9dOI=EGKyq2RVNvd1X_``x}Wp zS_A7e!dH#8kvi39WE$A1LCa*lH=lnz_0v?rv8ovdIz_*mriIM$>VH6y-E-~K@ypT`?!m7R4K)AUoVKyrUHwI zT}+?QHK+(RPs8Qfa#p!3tcf4o$#3xTe6pW1aD+$~s3vL;yP1M|pYKR)IQKLF^mB;1 zGqD5hOz90B!Gh2l@xHvSFxi5Gc}zy?JhDASwyN0Q`v>UsG}$e$>EmQk!BvV~vs*Gp zYo*)L7s*8RTs%Q$ zVL!%e6nEU0T$(CWbmb&Nz$D)?fLslev0I48AS#Cf8A}H>c4NqDS&7GchL$I9vG@Ox z?f8&P$5`%WELAqO$ihs?9DmO74%ct`K4^g9jPdVE@vXxda zmR*pHGR#dO^3!}&WD4&jtL3K@4nkLP zLsse!#$g`k?Eq?($T+@3_V9G}ZJx?nT7mRl;*|utl%;2X-EMS)TTZ6kF7%I^yLR$O zKpvjLR4gMmdLVM#l@YALdoxh&_7#jP{Op%#y?%<4LP;zdHoLekzkc%1{E0KsvL%-eq;fvjn2~INSJn(!nuO%l;q&S6Y?7n#o|2=z8Lu=Fe{MJ{ehSa#k;gcP zu{%!R!pCGiCm@Y!d`DjLC0j5~Rq*gKP^tNW5xQc<(x-3<*|xLTqj#=v&+S3%l|6}- zvy1h!kBqlV%1YQX*I&TWk79`5D_SN4@v5y17A zDfj5GuduWIbRG{IvD*KfnQ`&Rrs84cUP#=i$QZ9K~tWi9y1;KBfAxber(Ux z%;sCf4%Y{{u4wLXB(F9Rxn5`+FCKL;XY!-Qt`ym>L-3XQkVUkbD|y8|{^aqV>v@J= zImBr7;J-D=uMDz2;|D%ROW$TE&h>ozO1^(TTJ#0il!2>j!AJ~aMs9K*F$VOiV6}!L z@fo?d@7&2n^vpf(Hx^59n>l;O&u8Q`o+C?e30H6ePGS#_RZg}ZAIt5`snR+ zWctSQeGj>}i;T_zs!vY{PLVs^#P2&?-8bYf0$tM#8Eiw|>vpsmJ6%YZ=@t1KY0gZB zT3NXs+O#Q|dn0+wli9IPK7n3bL$>b@9!uqg*zMu$0iBus!T+L*g~pkTJeES^h^p87 zd{Z3rbb>oQ#N9`8zq@_42q%!T^US;06aJ8IEEf5yN7o@;(~#S~%tvG9xg?xeSEQmU zxz8<#zZB(BilaG^xWd#{Mqn{3;r%Ok)!)g1^kVz&GglwYPmJ6T@?cC$Sm%APw-e3*iaYAt$^Z8DUe%8DE4X z+~nN;d_F%MP#0z{l8m-f=m$|r{fT*g#`vCNXIip3!Qov-Fg6P^PG8k1GWhymnk)!>Hd<{By8;~ zwB09k-al&AW%Bwn@ZSLJK~Ah$4Y@73qrIs9t_+`7flTTw90kd_E{OJRA-CZ_<(S{D zRDLd?9&`wEx`brMu?|`8v7Vp>Q^p=$O)9nXT+l_D}=xSV^LP2)*@S(CVla z;CXApmsC;n^GXpl3$^j_$~k4GGE5mwFF+@K<(?ulbC8xsSlB9Z1bJ-{>?B^0=asPA zHL=$t$Wfn0N6;1WF7nn7%Q0lXEuqU^Cv0$kuCOn*y%|^BlS6boZHi=;m2+^v|I@om zut!y4tiq@(_{waYW={4pGxK=NMu#n8<*mnpY-bG}XH{HA55{8)EUc1>-pzsjtxA4n z1eQ;%*vqVAF?0LS8RMwOn1=42f}WVqd{0F-$6(hN`f|tTvCeO^F5j`iEO#a7xkR;8$f8%#bG_p>Q0P&iOoOcJA z@Zn_7CgUDUAX%fN(IAjTFbC7IpzF{etI3|<1rxFnJhKCgumoJz2TRrnY|{Zf-3F^( zfHC^RswIyOjr|~F$n6|1Pv)2| zuV#+dGP`q_?}bFMI$`%4(Frz8{zfO>$H@6p>Zo>bMf-U~fzK{TALwLpZcY{$~Xf#ffPtAC?OzM?Y%&@DNbk8mp+kDO>}mt~+^-h#G2pr@b1 zVIQUvem@oCYta(R=p_3e_2|3d5tj3NEiteW%x)j5Oop4&@E7`;J;~y4<9nqW`lcTh z-mUmO6qG-m%A%?0q3Qe_NoU&bcnbC5ql&^6<$-(2MStRqcp&Toi!YLmEU7>^S(R#_ z*TzFCj9%iE>?dk*(YR|YhqGC3?4XbFN*<@k50+tY%M(NH!8xlEaW29$(L13Z-y$^M z1akFz!-clud;60yz6<~44kMxBL6oJ&zdPL!wxZ8}g69IM7)wcBdMNT2#Lt{ywos%b zC#x_6H7w;o@V$_SjUdeXVA6k52G)HyB8vy9{)nea-DKy|H}Va#CicKm{YS3#Dc1gR zc^%efH1pa73sfFUl!MIiQeg24=!&+y))0*`4+iZ#8tNLlY7cq(CqR-IQd!Lz%3rx&I!2p=^Ul`A#Lt1e9DKoXyNN}TT&HBFnaYfF)^ z8u$_g(3k1Kcp1^SxzM2v&{7?c+@Z+r7&7x`Akkydne&nAdA`3U%LC=sNMTJrU69Xy z_F?hSSm$xr=c3@AqG%~ay3ZKyMkg)xA++hBnMt6ZZdkd_V3_JyyvBHrQ$cOhsmmA) zKIsP@ZGsFp21_=@{#8K|Q<5oL1d0BQ=c!}mEG&~rm5~j9l@2jj&5G3e6y<#NKsSwe z6h(q_(`(tpLwp3jh~ja`oR3F33Jp{oi4YdA8d(j^ng5~GKFz`V+<+WhHNU|chSNu) zCKkCja_cx&$D0}m z#_x`fY7Oq_$ItHQt^UZ}Ku{!@tiO^1?j|eei|0`MItlB z&I&I_eOm=EO+&O!KXA-M=6eZ@g3xxy$bAvt@qusIg~mF~_gsTj*v0?Hp`Uu9kvbzA zeUXXsW@*mR5%ysLl^ZRnZm5A?>H;<@2gA}5#MF^0ljgjuI)Al7lMLX!^O2xv&b*gv ze!_kEqeU~rtoKHnj6!~nFcN36CPIE3cm%od9}8fK3nC@mncKNO2{{G^5`Jnde(iOT z(0%5{1$t(&lg zY2fn^2jMG@#GeJ_z(0#FJhnrxRw_p_0N(*C9lZvEr_#GcYhLOrAA(D^f_3II zu4BM9jTqbBRGJOp46~SxC?D4T0Y4Io{;mP;9EByC4kA86hm>pJ()Dl_2eDPl_`MZr zTZlF2f!1#T{-_VquJ5xP`OzT-K{W-KYx=9hPnBWj>m#L&v16UkGDE=JD?ml!?5nBL zTqIv)XYiZYu8&l&eW&l)W8!(Ah}}G*e)2H3ZZ_{80fH`uG*#uE!q8tSsh<0R7w`bo zbQvz^7!1`-B#~a)+{q1Cy@&ihjok0#-u^>QBN?Y<$nRL>UGPgaS!)^KLPVePbIjgE zyss`qquUbYZp+;D#6J}b!enM{4Tv|^=fRu-?|DF-znMROkf)0On;r%un-6^oR>0){ ze_#&Po%1cj~|-J>%+m`leqd`NNYRnU0vk1KA-I3ligPM z*o~0j;@C{#SJvdSZ8^GfhSu2BmOg)O8Cv-q_~s}2=pWbr&q|J5*7ET)MbSwSXs4VY z>g+^$^WbaKL7a!U(^q`LMpa@wc1|#M4(xm&ha2q8UNB&zw2V$x#_Kzt?@g@aGsf~c zp2J%{`vmKm#2J1wZoy!82`^qCtaN-f8!O>|yjpr6!C7Dc2 zcr0VG5Kdt!Gd7T8G(2*5#=Jkz`Y~dC8N1bZ;s?R-Cz+Q;{Iv|PXfvOPWbVh~ag1g( zS~E6Hnf*%Wfr4layY&IoEEwiz*oT)`qz51fh1&K{{Pl-t!OUs|h@&P5r8(n0lewMl1G&9i~G*GnWaQtKlhqVx-S7 z-qF6XnFn^6;=?b;kG-39hk3$Gr}o*H z#;im7?xFd{f{8|P?c;o!e;69BBmZl}N-c+eOol|c_}*uDTss-ldCc}`j>)Wp?);v{ z%rD~H2bkYOunxjo+r!*0=NqT6{vw%!(acLX)>9EyT0U@MDz3UB>!mUy+?2J@fyZ#> zZy=*R8eKkT6ZM4o~M)xPYyC2__hxOBrd1Su_G~ypA zBdDMYD1RS5!WA^@Vf61r7?ILo!vxU9BYLVm!wP93@qpvCopc1wjVxdBAI5pj3vfo>Vq4QVV#BOoKAG^ zGdVSd$P1rGr;HH1)~>{>F2k86g8V9=Ri=O#)*)3Bzy_UJH+9kbsX!oK$waYu*Gur| z9rVjL{Fo5rvNPYiotX_rZmP33=5cjfS&c(M3E5cHThUroKsa93*>jNWZR)c(qe&*= z%Xa6xHW%x@+7YusV~lUzzwdYd*S%O^t7@lLxj-&Yv#e8f(6V#$O)&58fk3>!6<6_pMR zu?e~S%JI<`F*?K*j|Kr%L@Ivsy@F%Dg?AB;9r@1n<>4;6b7!ZK<9EbdGJ%1A;c-40)Bz1G$M36`M%jc+|U{n+=HEg zI{J=U%uH{PR6SOAc}7%p63I-w1Oj!V(`s2Mhc$0?fStyRsMQ5?b&x z>odLYUWD&onvBF?;!PeT?~cA%?UHwA9T1IsfYp@js#;4 z1&fve?|lL7y?_}TjkjBi5wC!TDadFCf-U^es|9(jFUNZLylu$aSH7P$Ha&eyo4uazn9ek!DgTr`?;`wUWt_7TN zHa`#Hc|V6C497y&R|{L_Q_ zMSNAl=lH?e(eWnI^Y=UE?mJ9^Kd(IUaR^UY%Rl)1OWu*fr-kd_BeZ44qu{{~;>YfU z8QXzXSp#3%8Sg=yJp|6d#-28RBnnUAMn(KF6Mlx+5v(klT1bs&e? z@ecAMgHGhgi`_`@9dEH4yErz|O=1aBu^#SfHax@#*v*FUTJ2yl!eC4P(ZlR3omd_j z_uxz~^LS~*)4MkTel!h77(8n*lGKpvS&s~!1nnl689>6BxzYyc^XBN}X4s}atokMB zrxGd_r_V9fi)gh4&PK&TNMzo`83@ z6U1{9F6@mYGrI|J9D&Sfa;$PHkU$n@t}cFNLu9NzR-`;qmKk3#J-%*fcr5WAF~6Dl zPd;pU7}_EW+-Vlxn*r~%Ec0H6ndwGcr3;z&RgsIvFeJTU(I?|uu0YB*!lv%zcMQnr zGF`w(i&s)8Ww1~YbTbQM#`7t8=$R6vyrI9(QRHGLRd4%|R`Ka56^#~M2jZ=a)`{Se2TlG3ujUFUXDi;xT)dW^ ztioE%c~+2u*hw#tXE|Upa}eo`z^AK)pHh;jU^QeSB}Y0mR94n*7UrlL-bMrx6Ns0Y z8oZmF-&L8(2zZS$Xs}HDu8N)L%lC9)UP~j5ZShg6Gtc$;bQAurfgMhR{dkEcx(UKK z3&X!2nVib842&@nDT{)UJ42tKwaAOmYHQG5XZd>{zYoLH%|}P|MiyK1?j`(x8OLVO z)E)B%sN^$v=OvHdprBy1V@B>WFLzae?{0=wS%oFqg{6Dz^A!bWlFjG+Ou@QGVUMn( z?YF>H+u}h;{ehtDs#Uc34 zn`ETK!XKQ&Zfs$WR`K&celF(cS?tF-{D0yAh}@f<;EusQ+*BS(NYAW$eWUx4 zXw4BKZ1>1pe})~o!Ov4L+s8nNkMU#^!Kv?f=P%;O4lqMes;m8jY4Z}V(z1f2c6=(EwbzDgNTH_xC;h& z!nOVe^?YPR5;+7e&wvg812WhL=9!A^8Gv^tVo&9fg<4>lVsOQ&(0idsxSub_A<-1q zS)6yYM6*PqXQtw3M`Nw_p?!{k_phOA;~162*s+;dVbSqx8NWq8>=XBp!le zyTT{;AfKy1AcuH14}2r`lN<)djb^@vz`xakA@2>AtmNbVD)PGoeo0;4)1Lp1;S(d! zj^WI!%5{aKE%Spea)DBRaK*0}w=Zz%_d&atKfXGF^ z>)eca8W@Z(rkht&p&<&PcO2-XL{qUI!>E788##cy?LT zk+x<3kD1OQe^(gqQ(*PeNcIKf{uc<`!1@KV(nVLcN}$e>$b?|G2lH$^($O6m7=RqM z!oR79Z&jb86c{2ol8_gxDe_mUVKD^zBdXJuBC7{{@#}NQ;sYe^B5|27Xsdg?zLLjo zUcZgD+=oP7kyQNoYrcr{Z~nRkjys7gUqQ>9LC1VW7bXX@C5OjN1+ps!hUx&O=}*tO z&e+eH?0q_col~RXf>-j`gB{$24cx|Y1}^s!nG7q5LQLTpij{4RPE1X7ItThT7@eGq z7{GUYE5Xjjg6HR<;UeLgn&D?Of`t;;J{w%2gE1-sGgO6#>@({JAMOZ;4vG_%>@-^@)%dnEOBI~*MZ6kj}lM860Pf-y*2Bi9Qn32d@mYZ~GI8!YXzgx3e9{E|Qe=+x0ckXcrJluT zEZ{MfwK5Tlu!L7chNJLIKcK60R)@mfiWrFS%LXwv(a7*7H0v|w|2L7APw;=ktKSZb#sTGr?CACInM*Uj}M&fH_z^HzT_a!GDJ|TAZfG7 z-Pr*$T*c4D_^+$*GS1^!yuoX@i%0Pc4))Hj-PVvwD|AiR3ab{JCOG5?1Q(=mH8x-=Pc7lzchks^h^QljT&^zctK>uIpU zQyy_(h*mTiX$UqH+dOr$YWn=Y%=Cki{Fka!+!j1XY{3Ff2FaEjw;LOAs9tBh@(^xzb4~6 zD;`m8e3MROkTl2REkiy?7_r`WWPIE(9vC;-7h$b2n#_+?#$sau{>^2+|AsF&D5PsDhrlLdk+)^Y)hy75 zhzvHxx)ee4h|Jo1FwD`g%ZI^G8?kjKKvZ|&rj8<0=UBa~c>a&f^deZLBIs>5NU9Xx zZU?S(06fTFShk|DKQavZQ?%a{*8W7sF*mZ75g8MFN=8QV8#eq4UhY$(D<2ritZ1iF z%ta5ZY*S{YGy0?{c%=lNEsDk)fz_Q$Jm)Fb@d8Bj5Ptq28np?M-%)N-L^7WuF zv1&y8d_VWR7u$Fi1pOWjzMgT~&g&2OD@aZt)7`>z5I+<7ofbWi68o10pRyueVvAs9*EK8tU_BU$ z8EA$lu;xExi{7Hd*H`GT)|iEay%&{Xxg@-Ud3 zYv76~MtBN*@l-~3Dww4gb3K9)Z-ESUgk8(b5d=T~6+ZSVd2<4fpYTb`Y;=7T>uVmK z${}>p25j0bBG7d4M z_?Z`Z{Ey@QgCF@DS^CT>d~1qIkUQwD6F#3bn!L2hFdJj}*_hmo(!R_QKl+YXXoo~{ z6B9Xp88-8`@y~FOv*;opNYtv%2OHk-UCA3W03_NH-&jOtN5kTrfcdz`K^;9lL`H0O z4zPfQefPq$zJ*1-jK6V&V?MIK6#io@pX~07Nr>3v8e&NzPuc@dUIpnL&+4Q$iANGX zZA$cj$YL#s1XaXhmBGg>2Coo-tqVs(Xjq~*K5KUl>0XB1Ph)1LveH*zF(R>?J3ucx zdCx1!jy?&&?~MS96_A_5f6N0PMU!_#Uv0%^B{Vd@Q<>4v51i#*JM%Wek;QUf--4Jf-iSfv?9V;@IR zmCqDG9~WUp3gH(9lCSuH`Mv~Cx(1sx4r??F&S5T$>T2e24G3ln+B%wi=K0vGNFLF= zb`}YFfYuS-WxOf;iey+pfBt%hWq6I$eMGyTMcxh~d%~~Xf?v}UU$;B9q$gId9ag0? zJX-^Jwr*q(b>y$Xu)F*4d6vP-9fb*bfXrH8rSxdMV%+BtwCMs+&@?d7D*V=fa)F16 z@~jp-M_YLK(d1!FArEjOveN@yCh|JE_?X|4=*cX|R}zx(7;N+kJQK&3g zjA4G@-}LMBWnHW`i^y!P9&Nm3;?yh^qQ@$bL~i*%hv4H6wBo zen9A+?AY*D;Ea`6y{D{Gnv%=E@w@`@$AX#X8la8NRDMlmP8Y*~#t?Pcg-5p(`!o#( zy)QbVG@2)w{0Z4Pf=tc8rcPkKL`G);G+j|_eJ*^`Y|K(#melW81nanM;sbN!WQO3vIH-h6}u7wkDCnyUy|RMk-u_0tA_751b=fFQR?;N zxt@ioe@Fx|j$I7FCiH@qq=Unm&b|Q%7SPK5_jbB!lD@+YWkkCt|^%3 zsgNa;ikx7M+-U4#NLfAny`k7J5s#nG3R=OnPlvOqN{mP$z9y=JMAU5oI)5boOao>t zn3?;9*W-k@bh4_`<3D9&ZRY~Hlt<<&^R6aHU@P=lW#m$1l67QmTOoNhz&AxPJFcKj6sK>0ErRc8#NNpZ0cL=LM*x$?C z(L;QNgRF+ru*dh1S|P!IIW)YF+_2WU`9ujGLi$CNU>q880~SG4%>2iB#jYDKS%)^* ztYmz5DZKS2s=-N{-ANyDl`+WL& zCV70rc-J5vW6^>m_&E#xcpm*M*j^FC6j`_5cs#<{G#Ctm?EDUS6_Iig+m9ovwwO6u2YMFuRO`Ubhj{fla`%(RCsv5c-R5Le zigBif+*1p#VJ_UsGW6LLpJY$w=NQ&X7uHQL?x;5J4`Rfwg1hD2Rm6Goyg`k^x;)Q0&gjs&LS zj=pd&N6{&QK^+LjY0tS^VYMn@^{RqwTH@tZ!)ABl`zP@YldK%sfiVH5C6#dxj)+fV1`BCy3|eop|Yi~!G8>MYewiiUY zjK^BOuMOWZ34SexEcHWhZ#($84W|4k-**9xDtecQV;6WflB-yP#SnO6^#AiB-Qc^2 zq1Tsi-WX8pMSSWcY=X)NgyTc^<~qdANO8zjJo#+DaDV)eyTTk<&|9LmgEFs`CDxE>N*j`dar87<(`!`(RdA~47a z^vP|!3oqW0$S}_2(>oFPDA~X&g}@TRTe0}QS6s(e-Y;UUgTR$d(AlMt`YPOKHtfF0 zM^TV}13hP;^Gq~EN}mT;i}g4K1Td59TaM=<@~%YBulZ=)rL5<{XrVUfrP64qaNnv+ zhqle-vl2m^Aq!(E>ZMzQDw<(Gsf+t z^=)9hHgW&L`W$D}-!mH?;_UInFJIxiT|y6uY#zZXb>KV=xUMFQP&;&outWnm(^B}N zM~wLk-*|o|?;;rgvk6B_c+>Lu2j%flD}yF0gBEMST~+3_TrmDNIf?H{&0i7BNDe&N zns6cQ!IslObdhkR+dy%u-?=`S{3_9}~vUwlrjKxb5_3L->GarK^o?`U{yKL~=bacn~43D0aNKKwDh^9IqkTb%I)(w~6-`^DoM zv7NiDrsp7UJGj!0Y(0nf*ufP|1=aLp?bJZOiD;6|`iW2Z243SD_~>`W0>F8Xyy7~je5v!F{HK(D>fe%Fa>xe8J5vWggPFL{vH%?m%BT~c!{{X zml`+0S?2d)h;-=s8a|6P%Ev`-WJZ?o*upo*!ZYl{zTd_FyWvAE2e_8KT)_gQNz?*` zft8ZL7b3grgb#%r=BJ2YUc!dG$JV)7Q%#xU`N(WENa+Dm>XAhCl1$XN%XsG!J41P9mJxao^ZC4zKG0f*5yQWM`NTe0tEF5ytDwD*vXe4QJwkBX#D}f zeT2|@;J;olzJaXW5@=cBE!E~aD`PoJu+B3fGb&d9 zJ@31O2uNZEO0Ql|UDFOK)%9g)*0 zDsvBWrrp@=X@f)^anHCWp+72foB1HG#aTV(|Hs>mc|0GuHJmYc>_AM4m zxe2R!koVoe9;x`OL45INpC2n>(Tg%e9q}Q0U}=Vf59X4UI04i#3x8lGBRH35lfeT0 z82w(X3X$dC&-b%G^E-f%5j&&J!B&aN=h@t`=>D(&PjhecTlBHW6^iA;j0a3W8T zxsyI0;kz%BMPxB$N1JwoZ5dAdRaDNb=Me=rHybWy9Jyvq;pc*6FKc2GdcPtT$l(5V zG77>Q6EPjZr+)@Fh@W50AiS*($o&#xh<6y3N32FCpUMxK7PVeNJCp^pWd#|2V4dDa zf_C!$k*t?AjE_#F{WNUaLOjNvFdJpbG0g6($F=c0oM$OvO>=^kI>NNBL@tgn=MRyz zL}W_h^Qpl|<-u*G;IsOG0q4P;Ok`ZgFqdKnz=`mqlbP9${J$&GE^@bLA`3nFyADT1 zJ}ojZ^MTp&fa$`Ry9(S@e*V*jvrOZ?bHQEnxyOxgGeTP@N8c4;m5JQU`aH`?o_G?v zM(hB73oXA7-+l^L6ajKf26jx%%!e@RnUD^#hJ^+`!g#%)3xz;Bl^Ll~-JTzPD|!me$7+bU^B53Ff6#!yV5PX) zRQO3Iw(JboH3A$ND-JpGuT zEPQuE^j3G~Na({TG@aO??l1`Rq>sbG8B?vx^7{2&SAff`F`Jk-+s%hzold#ns8sVw-ak`Dd#vwrS%Qs zIFDea&cdTFBsZcbIS+ZUOKHKTq2#L?k_(~V4mQmT9?A!YUms4jAejlZd35tJ zs{@G)wI|Zl71mw+>;(E@cRb$J2DDWd#~;DOq<|%mw^PvAv4XV{4dkL;EIhHpGJni*qC2>bjk@J1{u3fQ;%{f}5*_xpPt8x@%e%>&D<(aq4Ahl5N za8{0X$n9|S;9z8T7W#1;_+c(y@^JKF8SGyu*6#^^3h+kln4#yeiI8Z+W8c3?dWWj%>% zqPysV*Q^2uJ-?E(hee1q6ZXOdKJB2L@+#(J!yo%R%{24^*g{2W$8HW+nZrC}p2x5w zYIUw7m$_T-z`kUYjLmS7i%jbHm@o3Nm6yo;GFbiVtfQgi1GMLUKhS@!BBOr=|KkT< z!E)yF2wLhZ+R_73-Gt8V&HY`)$4ewTPgHEF?74P{8Cs0hIKwP$;)?I{zV(d0*rj